快速跳转语雀进行内容收藏
// ==UserScript==
// @name 快速跳转语雀进行内容收藏
// @namespace npm/vite-plugin-monkey
// @version 0.0.0
// @author xiaolaji
// @description 快速跳转语雀进行内容收藏
// @icon https://ts1.cn.mm.bing.net/th?id=OIP-C.hpjQBHE4wfYFA1nm4KhTDwAAAA&w=173&h=185&c=8&rs=1&qlt=90&o=6&dpr=1.3&pid=3.1&rm=2
// @match https://www.bilibili.com/*
// @match http://127.0.0.1:5500/%E5%9F%BA%E7%A1%80/html/%E6%B5%8B%E8%AF%95%E8%84%9A%E6%9C%AC%E7%9A%84%E6%89%A7%E8%A1%8C%E6%97%B6%E6%9C%BA.html
// @match https://www.yuque.com/*
// @require https://cdn.jsdelivr.net/npm/react@18.2.0/umd/react.production.min.js
// @require https://cdn.jsdelivr.net/npm/react-dom@18.2.0/umd/react-dom.production.min.js
// @grant GM.addElement
// @grant GM_addElement
// @grant GM_cookie
// @grant GM_cookie
// @grant GM_getValue
// @grant GM_getValue
// @grant GM_setClipboard
// @grant GM_setValue
// @grant GM_setValue
// @grant unsafeWindow
// ==/UserScript==
(n=>{const t=document.createElement("style");t.dataset.source="vite-plugin-monkey",t.innerText=n,document.head.appendChild(t)})('abbr[title],abbr[data-original-title]{text-decoration:underline;text-decoration:underline dotted;border-bottom:0;cursor:help}.ant-btn{line-height:1.5715;position:relative;display:inline-block;font-weight:400;white-space:nowrap;text-align:center;background-image:none;border:1px solid transparent;box-shadow:0 2px #00000004;cursor:pointer;transition:all .3s cubic-bezier(.645,.045,.355,1);user-select:none;touch-action:manipulation;height:32px;padding:4px 15px;font-size:14px;border-radius:2px;color:#000000d9;border-color:#d9d9d9;background:#fff}.ant-form-item-label>label .ant-form-item-tooltip{color:#00000073;cursor:help;writing-mode:horizontal-tb;margin-inline-start:4px}.ant-tooltip{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:absolute;z-index:1070;display:block;width:max-content;width:intrinsic;max-width:250px;visibility:visible}.ant-tooltip-arrow-content:before{position:absolute;top:-11.3137085px;left:-11.3137085px;width:33.9411255px;height:33.9411255px;background:var(--antd-arrow-background-color);background-repeat:no-repeat;background-position:-10px -10px;content:"";clip-path:inset(33% 33%);clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z")}.fr-inline-field{display:inline-block;margin-right:16px}.fr-inline-container{display:inline-flex;flex-wrap:wrap}.ant-form-item-optional-hide{padding:0 8px}.ant-form-item-optional-hide .ant-form-item-label>label{font-size:16px;font-weight:#000000d9;font-weight:600}.fr-desc{word-break:break-all;color:#00000073;line-height:22px;margin-left:5px;font-weight:400;font-size:14px}.fr-hide-label>.ant-form-item-row>.ant-form-item-label{visibility:hidden}.fr-field .ant-form-item-row{flex-wrap:nowrap}.fr-field .ant-form-item-control-input-content{display:flex}.fr-field-visibility{width:0;height:0;visibility:hidden}.fr-form .ant-form-item-control{width:0}.fr-form .fr-inline-field .ant-form-item-control{width:auto}.ant-input-affix-wrapper::placeholder{color:#bfbfbf;user-select:none}.ant-input::placeholder{color:#bfbfbf;user-select:none}.ant-input-number-affix-wrapper{display:inline-block;width:100%;min-width:0;color:#000000d9;font-size:14px;line-height:1.5715;background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:2px;transition:all .3s;position:relative;display:inline-flex;width:90px;padding:0;padding-inline-start:11px}.ant-input-number-affix-wrapper::placeholder{color:#bfbfbf;user-select:none}.ant-input-number-prefix{margin-inline-end:4px}.ant-input-number::placeholder{color:#bfbfbf;user-select:none}.ant-input-number-handler-up-inner,.ant-input-number-handler-down-inner{display:inline-block;color:inherit;font-style:normal;line-height:0;text-align:center;text-transform:none;vertical-align:-.125em;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;position:absolute;right:4px;width:12px;height:12px;color:#00000073;line-height:12px;transition:all .1s linear;user-select:none}.ant-input-number-input{width:100%;height:30px;padding:0 11px;text-align:left;background-color:transparent;border:0;border-radius:2px;outline:0;transition:all .3s linear;appearance:textfield!important}.ant-input-number-input::placeholder{color:#bfbfbf;user-select:none}.ant-select-single .ant-select-selector .ant-select-selection-item{position:relative;user-select:none}.ant-select-multiple .ant-select-selection-item{position:relative;display:flex;flex:none;box-sizing:border-box;max-width:100%;height:24px;margin-top:2px;margin-bottom:2px;line-height:22px;background:#f5f5f5;border:1px solid #f0f0f0;border-radius:2px;cursor:default;transition:font-size .3s,line-height .3s,height .3s;user-select:none;margin-inline-end:4px;padding-inline-start:8px;padding-inline-end:4px}.ant-select-multiple .ant-select-selection-overflow-item+.ant-select-selection-overflow-item .ant-select-selection-search{margin-inline-start:0}.ant-select-multiple .ant-select-selection-search{position:relative;max-width:100%;margin-inline-start:7px}.ant-select-multiple.ant-select-sm .ant-select-selection-search{margin-inline-start:3px}.ant-select:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-search-input{margin:0;padding:0;background:transparent;border:none;outline:none;appearance:none}.ant-select-arrow>*:not(:last-child){margin-inline-end:8px}.ant-empty-img-default-path-2{fill:url(#linearGradient-1)}.ant-switch{margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;display:inline-block;box-sizing:border-box;min-width:44px;height:22px;line-height:22px;vertical-align:middle;background-color:#00000040;border:0;border-radius:100px;cursor:pointer;transition:all .2s;user-select:none}.ant-rate-star-first,.ant-rate-star-second{color:#f0f0f0;transition:all .3s;user-select:none}.ant-select-tree-indent{align-self:stretch;white-space:nowrap;user-select:none}.ant-select-tree-switcher{position:relative;flex:none;align-self:stretch;width:24px;margin:0;line-height:24px;text-align:center;cursor:pointer;user-select:none}.ant-select-tree-node-content-wrapper{line-height:24px;user-select:none}.rc-color-picker-panel-inner{position:relative;border-radius:4px;box-shadow:0 1px 5px #ccc;border:1px solid #ccc;padding-bottom:8px}.rc-color-picker-panel-wrap{margin:5px 0 0;height:30px;width:100%;position:relative}.rc-color-picker-panel-wrap-preview{position:absolute;right:8px}.rc-color-picker-panel-wrap-ribbon{position:absolute;left:8px;top:0;right:43px;height:30px}.rc-color-picker-panel-wrap-alpha{position:absolute;left:8px;right:43px;bottom:0;height:12.5px}.rc-color-picker-panel-wrap-has-alpha .rc-color-picker-panel-wrap-ribbon{height:12.5px}.rc-color-picker-trigger{border:1px solid #999;display:inline-block;padding:2px;border-radius:2px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:20px;height:20px;cursor:pointer;box-shadow:0 0 0 2px #fff inset}.rc-color-picker-trigger-open{box-shadow:0 0 3px #999}.rc-color-picker-panel{width:218px;background-color:#fff;box-sizing:border-box;outline:none;z-index:9;border-radius:4px;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.rc-color-picker-panel *{box-sizing:border-box}.rc-color-picker-panel-open{display:block}.rc-color-picker-panel-close{display:none}.rc-color-picker-panel-preview{height:30px;width:30px;overflow:hidden;border-radius:2px;background-image:url(data:image/png;base64,R0lGODdhCgAKAPAAAOXl5f///ywAAAAACgAKAEACEIQdqXt9GxyETrI279OIgwIAOw==)}.rc-color-picker-panel-preview span{box-shadow:0 0 2px gray inset}.rc-color-picker-panel-preview span,.rc-color-picker-panel-preview input[type=color]{position:absolute;display:block;height:100%;width:30px;border-radius:2px}.rc-color-picker-panel-preview input[type=color]{opacity:0}.rc-color-picker-panel-board{position:relative;font-size:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;margin:8px 8px 0}.rc-color-picker-panel-board span{position:absolute;border-radius:10px;border:1px solid #fff;width:9px;height:9px;margin:-4px 0 0 -4px;left:-999px;top:-999px;box-shadow:0 0 1px #787878b3;z-index:2}.rc-color-picker-panel-board-hsv{width:200px;height:150px;position:relative;z-index:1;border-radius:2px}.rc-color-picker-panel-board-value{border-radius:2px;position:absolute;width:100%;height:100%;left:0;top:0;z-index:2;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB2aWV3Qm94PSIwIDAgMSAxIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIj48bGluZWFyR3JhZGllbnQgaWQ9Imxlc3NoYXQtZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPjxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9InJnYigwLDAsMCkiIHN0b3Atb3BhY2l0eT0iMCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIxIi8+PC9saW5lYXJHcmFkaWVudD48cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSJ1cmwoI2xlc3NoYXQtZ2VuZXJhdGVkKSIgLz48L3N2Zz4=);background-image:-webkit-linear-gradient(top,transparent 0%,#000000 100%);background-image:-moz-linear-gradient(top,transparent 0%,#000000 100%);background-image:-o-linear-gradient(top,transparent 0%,#000000 100%);background-image:linear-gradient(to bottom,transparent 0%,#000000 100%)}.rc-color-picker-panel-board-saturation{border-radius:2px;position:absolute;width:100%;height:100%;left:0;top:0;z-index:1;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB2aWV3Qm94PSIwIDAgMSAxIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIj48bGluZWFyR3JhZGllbnQgaWQ9Imxlc3NoYXQtZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPjxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9IiNmZmZmZmYiIHN0b3Atb3BhY2l0eT0iMSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0icmdiKDAsMCwwKSIgc3RvcC1vcGFjaXR5PSIwIi8+PC9saW5lYXJHcmFkaWVudD48cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSJ1cmwoI2xlc3NoYXQtZ2VuZXJhdGVkKSIgLz48L3N2Zz4=);background-image:-webkit-linear-gradient(left,#ffffff 0%,transparent 100%);background-image:-moz-linear-gradient(left,#ffffff 0%,transparent 100%);background-image:-o-linear-gradient(left,#ffffff 0%,transparent 100%);background-image:linear-gradient(to right,#ffffff 0%,transparent 100%)}.rc-color-picker-panel-board-handler{box-shadow:0 0 2px gray inset;border-radius:2px;cursor:crosshair;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:absolute;top:0;left:0;width:100%;height:100%;z-index:3}.rc-color-picker-panel-ribbon{position:relative;height:100%;border-radius:2px;box-shadow:0 0 2px gray inset;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB2aWV3Qm94PSIwIDAgMSAxIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIj48bGluZWFyR3JhZGllbnQgaWQ9Imxlc3NoYXQtZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPjxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9IiNmZjAwMDAiIHN0b3Atb3BhY2l0eT0iMSIvPjxzdG9wIG9mZnNldD0iMTAlIiBzdG9wLWNvbG9yPSIjZmY5OTAwIiBzdG9wLW9wYWNpdHk9IjEiLz48c3RvcCBvZmZzZXQ9IjIwJSIgc3RvcC1jb2xvcj0iI2NkZmYwMCIgc3RvcC1vcGFjaXR5PSIxIi8+PHN0b3Agb2Zmc2V0PSIzMCUiIHN0b3AtY29sb3I9IiMzNWZmMDAiIHN0b3Atb3BhY2l0eT0iMSIvPjxzdG9wIG9mZnNldD0iNDAlIiBzdG9wLWNvbG9yPSIjMDBmZjY2IiBzdG9wLW9wYWNpdHk9IjEiLz48c3RvcCBvZmZzZXQ9IjUwJSIgc3RvcC1jb2xvcj0iIzAwZmZmZCIgc3RvcC1vcGFjaXR5PSIxIi8+PHN0b3Agb2Zmc2V0PSI2MCUiIHN0b3AtY29sb3I9IiMwMDY2ZmYiIHN0b3Atb3BhY2l0eT0iMSIvPjxzdG9wIG9mZnNldD0iNzAlIiBzdG9wLWNvbG9yPSIjMzIwMGZmIiBzdG9wLW9wYWNpdHk9IjEiLz48c3RvcCBvZmZzZXQ9IjgwJSIgc3RvcC1jb2xvcj0iI2NkMDBmZiIgc3RvcC1vcGFjaXR5PSIxIi8+PHN0b3Agb2Zmc2V0PSI5MCUiIHN0b3AtY29sb3I9IiNmZjAwOTkiIHN0b3Atb3BhY2l0eT0iMSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2ZmMDAwMCIgc3RvcC1vcGFjaXR5PSIxIi8+PC9saW5lYXJHcmFkaWVudD48cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSJ1cmwoI2xlc3NoYXQtZ2VuZXJhdGVkKSIgLz48L3N2Zz4=);background-image:-webkit-linear-gradient(left,#ff0000 0%,#ff9900 10%,#cdff00 20%,#35ff00 30%,#00ff66 40%,#00fffd 50%,#0066ff 60%,#3200ff 70%,#cd00ff 80%,#ff0099 90%,#ff0000 100%);background-image:-moz-linear-gradient(left,#ff0000 0%,#ff9900 10%,#cdff00 20%,#35ff00 30%,#00ff66 40%,#00fffd 50%,#0066ff 60%,#3200ff 70%,#cd00ff 80%,#ff0099 90%,#ff0000 100%);background-image:-o-linear-gradient(left,#ff0000 0%,#ff9900 10%,#cdff00 20%,#35ff00 30%,#00ff66 40%,#00fffd 50%,#0066ff 60%,#3200ff 70%,#cd00ff 80%,#ff0099 90%,#ff0000 100%);background-image:linear-gradient(to right,#ff0000 0%,#ff9900 10%,#cdff00 20%,#35ff00 30%,#00ff66 40%,#00fffd 50%,#0066ff 60%,#3200ff 70%,#cd00ff 80%,#ff0099 90%,#ff0000 100%)}.rc-color-picker-panel-ribbon span{position:absolute;top:0;height:100%;width:4px;border:1px solid #000000;padding:1px 0;margin-left:-2px;background-color:#fff;border-radius:3px}.rc-color-picker-panel-ribbon-handler{position:absolute;width:104%;height:100%;left:-2%;cursor:pointer}.rc-color-picker-panel-alpha{position:relative;height:100%;width:100%;border-radius:2px;background-image:url(data:image/png;base64,R0lGODdhCgAKAPAAAOXl5f///ywAAAAACgAKAEACEIQdqXt9GxyETrI279OIgwIAOw==);background-repeat:repeat;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.rc-color-picker-panel-alpha-bg{position:absolute;width:100%;height:100%;border-radius:2px;box-shadow:0 0 2px gray inset}.rc-color-picker-panel-alpha span{position:absolute;top:0;height:100%;width:4px;border:1px solid #000000;padding:1px 0;margin-left:-2px;background-color:#fff;border-radius:3px}.rc-color-picker-panel-alpha-handler{position:absolute;width:104%;height:100%;left:-2%;cursor:pointer}.rc-color-picker-panel-params{font-size:12px}.rc-color-picker-panel-params-input{overflow:hidden;padding:2px 8px}.rc-color-picker-panel-params input{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;text-align:center;padding:1px;margin:0;float:left;border-radius:2px;border:1px solid #CACACA;font-family:Helvetica Neue,Helvetica,sans-serif}.rc-color-picker-panel-params-hex{width:52px}.rc-color-picker-panel-params input[type=number]{margin-left:5px;width:44px}.rc-color-picker-panel-params input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none}.rc-color-picker-panel-params-lable{padding:2px 8px;height:22px;line-height:18px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.rc-color-picker-panel-params-lable label{float:left;text-align:center}.rc-color-picker-panel-params-lable-hex{width:52px}.rc-color-picker-panel-params-lable-number,.rc-color-picker-panel-params-lable-alpha{margin-left:5px;width:44px;text-transform:uppercase}.rc-color-picker-panel-params-lable-number:hover{border-radius:2px;background-color:#eee;box-shadow:0 0 0 1px #ccc inset;cursor:pointer}.rc-color-picker-panel-params-has-alpha input[type=number],.rc-color-picker-panel-params-has-alpha .rc-color-picker-panel-params-lable-number,.rc-color-picker-panel-params-has-alpha .rc-color-picker-panel-params-lable-alpha{width:32px}.rc-color-picker{position:absolute;left:-9999px;top:-9999px;z-index:1000}.rc-color-picker-wrap{display:inline-block}.rc-color-picker-slide-up-enter,.rc-color-picker-slide-up-appear{animation-duration:.3s;animation-fill-mode:both;transform-origin:0 0;display:block!important;opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-play-state:paused}.rc-color-picker-slide-up-leave{animation-duration:.3s;animation-fill-mode:both;transform-origin:0 0;display:block!important;opacity:1;animation-timing-function:cubic-bezier(.6,.04,.98,.34);animation-play-state:paused}.rc-color-picker-slide-up-enter.rc-color-picker-slide-up-enter-active.rc-color-picker-placement-bottomLeft,.rc-color-picker-slide-up-enter.rc-color-picker-slide-up-enter-active.rc-color-picker-placement-bottomRight,.rc-color-picker-slide-up-appear.rc-color-picker-slide-up-appear-active.rc-color-picker-placement-bottomLeft,.rc-color-picker-slide-up-appear.rc-color-picker-slide-up-appear-active.rc-color-picker-placement-bottomRight{animation-name:rcColorPickerSlideUpIn;animation-play-state:running}.rc-color-picker-slide-up-enter.rc-color-picker-slide-up-enter-active.rc-color-picker-placement-topLeft,.rc-color-picker-slide-up-enter.rc-color-picker-slide-up-enter-active.rc-color-picker-placement-topRight,.rc-color-picker-slide-up-appear.rc-color-picker-slide-up-appear-active.rc-color-picker-placement-topLeft,.rc-color-picker-slide-up-appear.rc-color-picker-slide-up-appear-active.rc-color-picker-placement-topRight{animation-name:rcColorPickerSlideDownIn;animation-play-state:running}.rc-color-picker-slide-up-leave.rc-color-picker-slide-up-leave-active.rc-color-picker-placement-bottomLeft,.rc-color-picker-slide-up-leave.rc-color-picker-slide-up-leave-active.rc-color-picker-placement-bottomRight{animation-name:rcColorPickerSlideUpOut;animation-play-state:running}.rc-color-picker-slide-up-leave.rc-color-picker-slide-up-leave-active.rc-color-picker-placement-topLeft,.rc-color-picker-slide-up-leave.rc-color-picker-slide-up-leave-active.rc-color-picker-placement-topRight{animation-name:rcColorPickerSlideDownOut;animation-play-state:running}@keyframes rcColorPickerSlideUpIn{0%{opacity:0;transform-origin:0% 0%;transform:scaleY(0)}to{opacity:1;transform-origin:0% 0%;transform:scaleY(1)}}@keyframes rcColorPickerSlideUpOut{0%{opacity:1;transform-origin:0% 0%;transform:scaleY(1)}to{opacity:0;transform-origin:0% 0%;transform:scaleY(0)}}@keyframes rcColorPickerSlideDownIn{0%{opacity:0;transform-origin:100% 100%;transform:scaleY(0)}to{opacity:1;transform-origin:100% 100%;transform:scaleY(1)}}@keyframes rcColorPickerSlideDownOut{0%{opacity:1;transform-origin:100% 100%;transform:scaleY(1)}to{opacity:0;transform-origin:100% 100%;transform:scaleY(0)}}.fr-color-picker{width:100%;display:flex;flex-direction:row;align-items:center;color:#666}.fr-color-picker .rc-color-picker-trigger{margin-right:12px;height:32px;width:60px;border:1px solid #e5e5e5}.fr-color-picker>p{margin:0;font-size:14px;line-height:28px}.fr-color-picker .rc-color-picker-wrap{display:flex}.ant-picker-input>input::placeholder{color:#bfbfbf;user-select:none}.ant-picker-range-arrow:before{position:absolute;top:-11.3137085px;left:-11.3137085px;width:33.9411255px;height:33.9411255px;background:#fff;background-repeat:no-repeat;background-position:-10px -10px;content:"";clip-path:inset(33% 33%);clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z")}.ant-picker-footer{width:min-content;min-width:100%;line-height:38px;text-align:center;border-bottom:1px solid transparent}.ant-popover{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:absolute;top:0;left:0;z-index:1030;font-weight:400;white-space:normal;text-align:left;cursor:auto;user-select:text}.ant-popover-arrow-content:before{position:absolute;top:-11.3137085px;left:-11.3137085px;width:33.9411255px;height:33.9411255px;background:var(--antd-arrow-background-color);background-repeat:no-repeat;background-position:-10px -10px;content:"";clip-path:inset(33% 33%);clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z")}.fr-preview-image{width:160px}.fr-preview{position:relative;cursor:pointer}.ant-slider-mark-text{position:absolute;display:inline-block;color:#00000073;text-align:center;word-break:keep-all;cursor:pointer;user-select:none}.fr-slider{display:flex;width:100%;align-items:center}.ant-upload-list-picture-card .ant-upload-list-item-thumbnail,.ant-upload-list-picture-card .ant-upload-list-item-thumbnail img{position:static;display:block;width:100%;height:100%;object-fit:contain}.fr-upload-mod,.fr-upload-file{display:flex}.fr-upload-mod{align-items:center}.fr-upload-mod .fr-upload-preview{margin:0 12px}.fr-upload-file .ant-upload-list-item{margin:5px 0 0 8px}.fr-upload-file .ant-upload-list-item-name{margin-right:6px}.fr-upload-file .ant-upload-list-item-info{cursor:pointer}.fr-upload-file .next-upload-list-text .next-upload-list-item-done,.fr-upload-file .next-upload-list-text .next-upload-list-item .next-icon{height:28px;line-height:28px;margin-left:12px}.fr-upload-file .next-upload-list-item-name-wrap{margin-top:-4px}.ant-image-img-placeholder{background-color:#f5f5f5;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTQuNSAyLjVoLTEzQS41LjUgMCAwIDAgMSAzdjEwYS41LjUgMCAwIDAgLjUuNWgxM2EuNS41IDAgMCAwIC41LS41VjNhLjUuNSAwIDAgMC0uNS0uNXpNNS4yODEgNC43NWExIDEgMCAwIDEgMCAyIDEgMSAwIDAgMSAwLTJ6bTguMDMgNi44M2EuMTI3LjEyNyAwIDAgMS0uMDgxLjAzSDIuNzY5YS4xMjUuMTI1IDAgMCAxLS4wOTYtLjIwN2wyLjY2MS0zLjE1NmEuMTI2LjEyNiAwIDAgMSAuMTc3LS4wMTZsLjAxNi4wMTZMNy4wOCAxMC4wOWwyLjQ3LTIuOTNhLjEyNi4xMjYgMCAwIDEgLjE3Ny0uMDE2bC4wMTUuMDE2IDMuNTg4IDQuMjQ0YS4xMjcuMTI3IDAgMCAxLS4wMi4xNzV6IiBmaWxsPSIjOEM4QzhDIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L3N2Zz4=);background-repeat:no-repeat;background-position:center center;background-size:30%}.ant-image-mask-info .anticon{margin-inline-end:4px}.ant-image-preview.ant-zoom-enter,.ant-image-preview.ant-zoom-appear{transform:none;opacity:0;animation-duration:.3s;user-select:none}.ant-image-preview-img{max-width:100%;max-height:100%;vertical-align:middle;transform:scaleZ(1);cursor:grab;transition:transform .3s cubic-bezier(.215,.61,.355,1) 0s;user-select:none;pointer-events:auto}.ant-card-loading .ant-card-body{user-select:none}.fr-panel-bordered{border-radius:4px;border:1px solid #f4f4f4;padding:52px 24px 0;margin-bottom:24px}.fr-obj-card{border-radius:4px;border-color:#f4f4f4;margin-bottom:24px!important}.fr-obj-card .ant-card-head{border:none}.fr-obj-card .ant-card-body{padding:12px 24px!important}.fr-obj-card .fr-header-desc{word-break:break-all;color:#00000073;margin-left:6px;font-weight:400}.fr-obj-collapse{border-radius:4px;border:1px solid #f1f1f1;margin-bottom:24px}.fr-obj-collapse .collapse-title{height:24px;color:#000000e0;font-weight:600;font-size:16px;line-height:24px}.fr-obj-collapse .fr-header-desc{word-break:break-all;color:#00000073;margin-left:6px;font-weight:400}.fr-obj-collapse .header-item-label{height:14px;margin-left:30px;color:#000;font-weight:600;font-size:14px;line-height:14px}.fr-obj-collapse .header-item-label span{color:#141414}.fr-obj-collapse .expand-icon-desc{margin-left:4px}.fr-obj-collapse .ant-collapse-header{display:flex;align-items:center!important;padding:16px!important;background-color:#fff;border-radius:4px!important}.fr-obj-collapse .ant-collapse-header-text{display:flex;align-items:center}.fr-obj-collapse .tag-no-data{color:#000000a6}.fr-obj-collapse .ant-collapse-content-box{padding:12px 24px!important}.fr-obj-collapse .ant-collapse-content-box .ant-skeleton-title,.fr-obj-collapse .ant-collapse-content-box .ant-skeleton-paragraph>li{animation:none!important}.fr-obj-subinline-label-hidden>.ant-form-item-row>.ant-form-item-label{visibility:hidden}.fr-obj-subinline-background>.ant-form-item-row>.ant-form-item-control{background-color:#f6f6f6;padding:24px 24px 0;border-radius:4px}.fr-obj-subinline .ant-form-item-row{flex-wrap:nowrap}.fr-obj-line-title .fr-obj-header{line-height:36px;border-bottom:1px solid #e9e9e9}.fr-obj-line-title .fr-header-title{color:#000000e0;font-size:16px;font-weight:600}.fr-obj-line-title .fr-header-desc{word-break:break-all;color:#00000073;margin-left:6px;font-weight:400}.fr-obj-line-title .fr-obj-content{padding:24px 0 0}.fr-list-simple{display:inline-block}.fr-list-simple .fr-inline-field{min-width:220px;margin-bottom:24px!important}.fr-list-simple .fr-list-item{display:flex;align-items:flex-start;position:relative}.fr-list-simple .fr-list-item-operate{height:32px;gap:0!important}.fr-list-simple-background{padding:24px 24px 0;background-color:#f6f6f6;border-radius:4px}.fr-list-simple-background .add-btn{margin-bottom:24px}.fr-list-simple-column .fr-list-item{align-items:center}.fr-list-card{margin-bottom:24px}.fr-list-card .fr-list-item{display:flex;align-items:flex-start;position:relative}.fr-list-card .fr-list-item-operate{padding:0 20px;height:32px;gap:0!important}.fr-list-card .fr-list-item-operate-fixed{position:absolute;right:8px}.fr-list-card .fr-list-add-btn{padding:0 8px}.ant-table.ant-table-middle .ant-table-selection-column{padding-inline-start:2px}.ant-table.ant-table-small .ant-table-selection-column{padding-inline-start:2px}.ant-table-selection-extra{position:absolute;top:0;z-index:1;cursor:pointer;transition:all .3s;margin-inline-start:100%;padding-inline-start:4px}.ant-table-row-expand-icon{color:#1890ff;outline:none;cursor:pointer;transition:color .3s;position:relative;float:left;box-sizing:border-box;width:17px;height:17px;padding:0;color:inherit;line-height:17px;background:#fff;border:1px solid #f0f0f0;border-radius:2px;transform:scale(.94117647);transition:all .3s;user-select:none}.ant-dropdown-arrow:before{position:absolute;top:-11.3137085px;left:-11.3137085px;width:33.9411255px;height:33.9411255px;background:#fff;background-repeat:no-repeat;background-position:-10px -10px;content:"";clip-path:inset(33% 33%);clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z")}.ant-pagination-item{display:inline-block;min-width:32px;height:32px;margin-right:8px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";line-height:30px;text-align:center;vertical-align:middle;list-style:none;background-color:#fff;border:1px solid #d9d9d9;border-radius:2px;outline:0;cursor:pointer;user-select:none}.ant-pagination-prev button,.ant-pagination-next button{color:#000000d9;cursor:pointer;user-select:none}.ant-pagination-options-quick-jumper input::placeholder{color:#bfbfbf;user-select:none}.ant-spin-blur{clear:both;opacity:.5;user-select:none;pointer-events:none}.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-node-content-wrapper{border-radius:0;user-select:none}.ant-tree-indent{align-self:stretch;white-space:nowrap;user-select:none}.ant-tree-switcher{position:relative;flex:none;align-self:stretch;width:24px;margin:0;line-height:24px;text-align:center;cursor:pointer;user-select:none}.ant-tree-node-content-wrapper{line-height:24px;user-select:none}.fr-table-list{margin-bottom:24px}.fr-table-list .ant-form-item{margin-bottom:0}.fr-table-list .ant-form-item-label,.fr-table-list .ant-form-item-explain-error{display:none}.fr-table-list .fr-list-item-operate{gap:0!important}.fr-table-list-no-popover .ant-table-tbody .ant-table-cell{padding:24px 8px 0!important}.fr-table-list-no-popover .ant-form-item{margin-bottom:24px}.fr-table-list-no-popover .ant-form-item-explain-error{display:block;font-size:10px}.fr-list-drawer{margin-bottom:24px}.fr-list-drawer-table-header{width:100%;display:flex;justify-content:right;align-items:center;margin-bottom:10px}.fr-list-drawer .ant-form-item{margin-bottom:0}.fr-list-drawer .fr-list-item-operate{gap:0!important}.fr-virtual-list{margin-bottom:12px}.fr-virtual-list .ant-form-item{margin-bottom:0}.fr-virtual-list .ant-form-item-label,.fr-virtual-list .ant-form-item-explain-error{display:none}.fr-virtual-list .fr-list-item-operate{gap:0!important}.fr-popover-error .ant-popover-inner-content{color:#ff4d4f!important}.fr-virtual-list-no-popover .ant-table-tbody .ant-table-cell{padding:24px 8px 0!important}.fr-virtual-list-no-popover .ant-form-item{margin-bottom:24px}.fr-virtual-list-no-popover .ant-form-item-explain-error{display:block;font-size:10px}.fr-void-title{height:24px;color:#000000e0;font-weight:600;font-size:16px;line-height:24px}.fr-search{width:100%;background:#fff;padding:24px 24px 0 0;margin-bottom:16px;box-sizing:border-box;overflow:hidden;position:relative}.fr-search .search-action-col{flex:1;display:flex;justify-content:flex-end;align-items:baseline;height:56px}.fr-search .search-action-fixed{position:absolute;right:0;bottom:0;background-color:#fff;padding-right:24px!important}.fr-search .search-action-column{height:auto}.fr-search .search-action-column-fixed{height:86px;padding-top:30px}.fr-search .fr-form>.ant-row{align-items:center}.fr-column-search{padding-left:24px}[class^=ant-]::-ms-clear,[class*=ant-]::-ms-clear,[class^=ant-] input::-ms-clear,[class*=ant-] input::-ms-clear,[class^=ant-] input::-ms-reveal,[class*=ant-] input::-ms-reveal{display:none}html,body{width:100%;height:100%}input::-ms-clear,input::-ms-reveal{display:none}*,*:before,*:after{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:rgba(0,0,0,0)}@-ms-viewport{width:device-width}body{margin:0;color:#000000d9;font-size:14px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-variant:tabular-nums;line-height:1.5715;background-color:#fff;font-feature-settings:"tnum"}[tabindex="-1"]:focus{outline:none!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5em;color:#000000d9;font-weight:500}p{margin-top:0;margin-bottom:1em}abbr[title],abbr[data-original-title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;border-bottom:0;cursor:help}address{margin-bottom:1em;font-style:normal;line-height:inherit}input[type=text],input[type=password],input[type=number],textarea{-webkit-appearance:none}ol,ul,dl{margin-top:0;margin-bottom:1em}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:500}dd{margin-bottom:.5em;margin-left:0}blockquote{margin:0 0 1em}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#1890ff;text-decoration:none;background-color:transparent;outline:none;cursor:pointer;transition:color .3s;-webkit-text-decoration-skip:objects}a:hover{color:#40a9ff}a:active{color:#096dd9}a:active,a:hover{text-decoration:none;outline:0}a:focus{text-decoration:none;outline:0}a[disabled]{color:#00000040;cursor:not-allowed}pre,code,kbd,samp{font-size:1em;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace}pre{margin-top:0;margin-bottom:1em;overflow:auto}figure{margin:0 0 1em}img{vertical-align:middle;border-style:none}a,area,button,[role=button],input:not([type="range"]),label,select,summary,textarea{touch-action:manipulation}table{border-collapse:collapse}caption{padding-top:.75em;padding-bottom:.3em;color:#00000073;text-align:left;caption-side:bottom}input,button,select,optgroup,textarea{margin:0;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}button,html [type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{padding:0;border-style:none}input[type=radio],input[type=checkbox]{box-sizing:border-box;padding:0}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;margin:0;padding:0;border:0}legend{display:block;width:100%;max-width:100%;margin-bottom:.5em;padding:0;color:inherit;font-size:1.5em;line-height:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important}mark{padding:.2em;background-color:#feffe6}::-moz-selection{color:#fff;background:#1890ff}::selection{color:#fff;background:#1890ff}.clearfix:before{display:table;content:""}.clearfix:after{display:table;clear:both;content:""}.anticon{display:inline-block;color:inherit;font-style:normal;line-height:0;text-align:center;text-transform:none;vertical-align:-.125em;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.anticon>*{line-height:1}.anticon svg{display:inline-block}.anticon:before{display:none}.anticon .anticon-icon{display:block}.anticon>.anticon{line-height:0;vertical-align:0}.anticon[tabindex]{cursor:pointer}.anticon-spin,.anticon-spin:before{display:inline-block;animation:loadingCircle 1s infinite linear}.ant-fade-enter,.ant-fade-appear,.ant-fade-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-fade-enter.ant-fade-enter-active,.ant-fade-appear.ant-fade-appear-active{animation-name:antFadeIn;animation-play-state:running}.ant-fade-leave.ant-fade-leave-active{animation-name:antFadeOut;animation-play-state:running;pointer-events:none}.ant-fade-enter,.ant-fade-appear{opacity:0;animation-timing-function:linear}.ant-fade-leave{animation-timing-function:linear}@keyframes antFadeIn{0%{opacity:0}to{opacity:1}}@keyframes antFadeOut{0%{opacity:1}to{opacity:0}}.ant-move-up-enter,.ant-move-up-appear,.ant-move-up-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-move-up-enter.ant-move-up-enter-active,.ant-move-up-appear.ant-move-up-appear-active{animation-name:antMoveUpIn;animation-play-state:running}.ant-move-up-leave.ant-move-up-leave-active{animation-name:antMoveUpOut;animation-play-state:running;pointer-events:none}.ant-move-up-enter,.ant-move-up-appear{opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-move-up-leave{animation-timing-function:cubic-bezier(.6,.04,.98,.34)}.ant-move-down-enter,.ant-move-down-appear,.ant-move-down-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-move-down-enter.ant-move-down-enter-active,.ant-move-down-appear.ant-move-down-appear-active{animation-name:antMoveDownIn;animation-play-state:running}.ant-move-down-leave.ant-move-down-leave-active{animation-name:antMoveDownOut;animation-play-state:running;pointer-events:none}.ant-move-down-enter,.ant-move-down-appear{opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-move-down-leave{animation-timing-function:cubic-bezier(.6,.04,.98,.34)}.ant-move-left-enter,.ant-move-left-appear,.ant-move-left-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-move-left-enter.ant-move-left-enter-active,.ant-move-left-appear.ant-move-left-appear-active{animation-name:antMoveLeftIn;animation-play-state:running}.ant-move-left-leave.ant-move-left-leave-active{animation-name:antMoveLeftOut;animation-play-state:running;pointer-events:none}.ant-move-left-enter,.ant-move-left-appear{opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-move-left-leave{animation-timing-function:cubic-bezier(.6,.04,.98,.34)}.ant-move-right-enter,.ant-move-right-appear,.ant-move-right-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-move-right-enter.ant-move-right-enter-active,.ant-move-right-appear.ant-move-right-appear-active{animation-name:antMoveRightIn;animation-play-state:running}.ant-move-right-leave.ant-move-right-leave-active{animation-name:antMoveRightOut;animation-play-state:running;pointer-events:none}.ant-move-right-enter,.ant-move-right-appear{opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-move-right-leave{animation-timing-function:cubic-bezier(.6,.04,.98,.34)}@keyframes antMoveDownIn{0%{transform:translateY(100%);transform-origin:0 0;opacity:0}to{transform:translateY(0);transform-origin:0 0;opacity:1}}@keyframes antMoveDownOut{0%{transform:translateY(0);transform-origin:0 0;opacity:1}to{transform:translateY(100%);transform-origin:0 0;opacity:0}}@keyframes antMoveLeftIn{0%{transform:translate(-100%);transform-origin:0 0;opacity:0}to{transform:translate(0);transform-origin:0 0;opacity:1}}@keyframes antMoveLeftOut{0%{transform:translate(0);transform-origin:0 0;opacity:1}to{transform:translate(-100%);transform-origin:0 0;opacity:0}}@keyframes antMoveRightIn{0%{transform:translate(100%);transform-origin:0 0;opacity:0}to{transform:translate(0);transform-origin:0 0;opacity:1}}@keyframes antMoveRightOut{0%{transform:translate(0);transform-origin:0 0;opacity:1}to{transform:translate(100%);transform-origin:0 0;opacity:0}}@keyframes antMoveUpIn{0%{transform:translateY(-100%);transform-origin:0 0;opacity:0}to{transform:translateY(0);transform-origin:0 0;opacity:1}}@keyframes antMoveUpOut{0%{transform:translateY(0);transform-origin:0 0;opacity:1}to{transform:translateY(-100%);transform-origin:0 0;opacity:0}}@keyframes loadingCircle{to{transform:rotate(360deg)}}[ant-click-animating=true],[ant-click-animating-without-extra-node=true]{position:relative}html{--antd-wave-shadow-color: #1890ff;--scroll-bar: 0}[ant-click-animating-without-extra-node=true]:after,.ant-click-animating-node{position:absolute;inset:0;display:block;border-radius:inherit;box-shadow:0 0 #1890ff;box-shadow:0 0 0 0 var(--antd-wave-shadow-color);opacity:.2;animation:fadeEffect 2s cubic-bezier(.08,.82,.17,1),waveEffect .4s cubic-bezier(.08,.82,.17,1);animation-fill-mode:forwards;content:"";pointer-events:none}@keyframes waveEffect{to{box-shadow:0 0 #1890ff;box-shadow:0 0 0 6px var(--antd-wave-shadow-color)}}@keyframes fadeEffect{to{opacity:0}}.ant-slide-up-enter,.ant-slide-up-appear,.ant-slide-up-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-slide-up-enter.ant-slide-up-enter-active,.ant-slide-up-appear.ant-slide-up-appear-active{animation-name:antSlideUpIn;animation-play-state:running}.ant-slide-up-leave.ant-slide-up-leave-active{animation-name:antSlideUpOut;animation-play-state:running;pointer-events:none}.ant-slide-up-enter,.ant-slide-up-appear{opacity:0;animation-timing-function:cubic-bezier(.23,1,.32,1)}.ant-slide-up-leave{animation-timing-function:cubic-bezier(.755,.05,.855,.06)}.ant-slide-down-enter,.ant-slide-down-appear,.ant-slide-down-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-slide-down-enter.ant-slide-down-enter-active,.ant-slide-down-appear.ant-slide-down-appear-active{animation-name:antSlideDownIn;animation-play-state:running}.ant-slide-down-leave.ant-slide-down-leave-active{animation-name:antSlideDownOut;animation-play-state:running;pointer-events:none}.ant-slide-down-enter,.ant-slide-down-appear{opacity:0;animation-timing-function:cubic-bezier(.23,1,.32,1)}.ant-slide-down-leave{animation-timing-function:cubic-bezier(.755,.05,.855,.06)}.ant-slide-left-enter,.ant-slide-left-appear,.ant-slide-left-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-slide-left-enter.ant-slide-left-enter-active,.ant-slide-left-appear.ant-slide-left-appear-active{animation-name:antSlideLeftIn;animation-play-state:running}.ant-slide-left-leave.ant-slide-left-leave-active{animation-name:antSlideLeftOut;animation-play-state:running;pointer-events:none}.ant-slide-left-enter,.ant-slide-left-appear{opacity:0;animation-timing-function:cubic-bezier(.23,1,.32,1)}.ant-slide-left-leave{animation-timing-function:cubic-bezier(.755,.05,.855,.06)}.ant-slide-right-enter,.ant-slide-right-appear,.ant-slide-right-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-slide-right-enter.ant-slide-right-enter-active,.ant-slide-right-appear.ant-slide-right-appear-active{animation-name:antSlideRightIn;animation-play-state:running}.ant-slide-right-leave.ant-slide-right-leave-active{animation-name:antSlideRightOut;animation-play-state:running;pointer-events:none}.ant-slide-right-enter,.ant-slide-right-appear{opacity:0;animation-timing-function:cubic-bezier(.23,1,.32,1)}.ant-slide-right-leave{animation-timing-function:cubic-bezier(.755,.05,.855,.06)}@keyframes antSlideUpIn{0%{transform:scaleY(.8);transform-origin:0% 0%;opacity:0}to{transform:scaleY(1);transform-origin:0% 0%;opacity:1}}@keyframes antSlideUpOut{0%{transform:scaleY(1);transform-origin:0% 0%;opacity:1}to{transform:scaleY(.8);transform-origin:0% 0%;opacity:0}}@keyframes antSlideDownIn{0%{transform:scaleY(.8);transform-origin:100% 100%;opacity:0}to{transform:scaleY(1);transform-origin:100% 100%;opacity:1}}@keyframes antSlideDownOut{0%{transform:scaleY(1);transform-origin:100% 100%;opacity:1}to{transform:scaleY(.8);transform-origin:100% 100%;opacity:0}}@keyframes antSlideLeftIn{0%{transform:scaleX(.8);transform-origin:0% 0%;opacity:0}to{transform:scaleX(1);transform-origin:0% 0%;opacity:1}}@keyframes antSlideLeftOut{0%{transform:scaleX(1);transform-origin:0% 0%;opacity:1}to{transform:scaleX(.8);transform-origin:0% 0%;opacity:0}}@keyframes antSlideRightIn{0%{transform:scaleX(.8);transform-origin:100% 0%;opacity:0}to{transform:scaleX(1);transform-origin:100% 0%;opacity:1}}@keyframes antSlideRightOut{0%{transform:scaleX(1);transform-origin:100% 0%;opacity:1}to{transform:scaleX(.8);transform-origin:100% 0%;opacity:0}}.ant-zoom-enter,.ant-zoom-appear,.ant-zoom-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-enter.ant-zoom-enter-active,.ant-zoom-appear.ant-zoom-appear-active{animation-name:antZoomIn;animation-play-state:running}.ant-zoom-leave.ant-zoom-leave-active{animation-name:antZoomOut;animation-play-state:running;pointer-events:none}.ant-zoom-enter,.ant-zoom-appear{transform:scale(0);opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-zoom-enter-prepare,.ant-zoom-appear-prepare{transform:none}.ant-zoom-leave{animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.ant-zoom-big-enter,.ant-zoom-big-appear,.ant-zoom-big-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-big-enter.ant-zoom-big-enter-active,.ant-zoom-big-appear.ant-zoom-big-appear-active{animation-name:antZoomBigIn;animation-play-state:running}.ant-zoom-big-leave.ant-zoom-big-leave-active{animation-name:antZoomBigOut;animation-play-state:running;pointer-events:none}.ant-zoom-big-enter,.ant-zoom-big-appear{transform:scale(0);opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-zoom-big-enter-prepare,.ant-zoom-big-appear-prepare{transform:none}.ant-zoom-big-leave{animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.ant-zoom-big-fast-enter,.ant-zoom-big-fast-appear,.ant-zoom-big-fast-leave{animation-duration:.1s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-big-fast-enter.ant-zoom-big-fast-enter-active,.ant-zoom-big-fast-appear.ant-zoom-big-fast-appear-active{animation-name:antZoomBigIn;animation-play-state:running}.ant-zoom-big-fast-leave.ant-zoom-big-fast-leave-active{animation-name:antZoomBigOut;animation-play-state:running;pointer-events:none}.ant-zoom-big-fast-enter,.ant-zoom-big-fast-appear{transform:scale(0);opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-zoom-big-fast-enter-prepare,.ant-zoom-big-fast-appear-prepare{transform:none}.ant-zoom-big-fast-leave{animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.ant-zoom-up-enter,.ant-zoom-up-appear,.ant-zoom-up-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-up-enter.ant-zoom-up-enter-active,.ant-zoom-up-appear.ant-zoom-up-appear-active{animation-name:antZoomUpIn;animation-play-state:running}.ant-zoom-up-leave.ant-zoom-up-leave-active{animation-name:antZoomUpOut;animation-play-state:running;pointer-events:none}.ant-zoom-up-enter,.ant-zoom-up-appear{transform:scale(0);opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-zoom-up-enter-prepare,.ant-zoom-up-appear-prepare{transform:none}.ant-zoom-up-leave{animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.ant-zoom-down-enter,.ant-zoom-down-appear,.ant-zoom-down-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-down-enter.ant-zoom-down-enter-active,.ant-zoom-down-appear.ant-zoom-down-appear-active{animation-name:antZoomDownIn;animation-play-state:running}.ant-zoom-down-leave.ant-zoom-down-leave-active{animation-name:antZoomDownOut;animation-play-state:running;pointer-events:none}.ant-zoom-down-enter,.ant-zoom-down-appear{transform:scale(0);opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-zoom-down-enter-prepare,.ant-zoom-down-appear-prepare{transform:none}.ant-zoom-down-leave{animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.ant-zoom-left-enter,.ant-zoom-left-appear,.ant-zoom-left-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-left-enter.ant-zoom-left-enter-active,.ant-zoom-left-appear.ant-zoom-left-appear-active{animation-name:antZoomLeftIn;animation-play-state:running}.ant-zoom-left-leave.ant-zoom-left-leave-active{animation-name:antZoomLeftOut;animation-play-state:running;pointer-events:none}.ant-zoom-left-enter,.ant-zoom-left-appear{transform:scale(0);opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-zoom-left-enter-prepare,.ant-zoom-left-appear-prepare{transform:none}.ant-zoom-left-leave{animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.ant-zoom-right-enter,.ant-zoom-right-appear,.ant-zoom-right-leave{animation-duration:.2s;animation-fill-mode:both;animation-play-state:paused}.ant-zoom-right-enter.ant-zoom-right-enter-active,.ant-zoom-right-appear.ant-zoom-right-appear-active{animation-name:antZoomRightIn;animation-play-state:running}.ant-zoom-right-leave.ant-zoom-right-leave-active{animation-name:antZoomRightOut;animation-play-state:running;pointer-events:none}.ant-zoom-right-enter,.ant-zoom-right-appear{transform:scale(0);opacity:0;animation-timing-function:cubic-bezier(.08,.82,.17,1)}.ant-zoom-right-enter-prepare,.ant-zoom-right-appear-prepare{transform:none}.ant-zoom-right-leave{animation-timing-function:cubic-bezier(.78,.14,.15,.86)}@keyframes antZoomIn{0%{transform:scale(.2);opacity:0}to{transform:scale(1);opacity:1}}@keyframes antZoomOut{0%{transform:scale(1)}to{transform:scale(.2);opacity:0}}@keyframes antZoomBigIn{0%{transform:scale(.8);opacity:0}to{transform:scale(1);opacity:1}}@keyframes antZoomBigOut{0%{transform:scale(1)}to{transform:scale(.8);opacity:0}}@keyframes antZoomUpIn{0%{transform:scale(.8);transform-origin:50% 0%;opacity:0}to{transform:scale(1);transform-origin:50% 0%}}@keyframes antZoomUpOut{0%{transform:scale(1);transform-origin:50% 0%}to{transform:scale(.8);transform-origin:50% 0%;opacity:0}}@keyframes antZoomLeftIn{0%{transform:scale(.8);transform-origin:0% 50%;opacity:0}to{transform:scale(1);transform-origin:0% 50%}}@keyframes antZoomLeftOut{0%{transform:scale(1);transform-origin:0% 50%}to{transform:scale(.8);transform-origin:0% 50%;opacity:0}}@keyframes antZoomRightIn{0%{transform:scale(.8);transform-origin:100% 50%;opacity:0}to{transform:scale(1);transform-origin:100% 50%}}@keyframes antZoomRightOut{0%{transform:scale(1);transform-origin:100% 50%}to{transform:scale(.8);transform-origin:100% 50%;opacity:0}}@keyframes antZoomDownIn{0%{transform:scale(.8);transform-origin:50% 100%;opacity:0}to{transform:scale(1);transform-origin:50% 100%}}@keyframes antZoomDownOut{0%{transform:scale(1);transform-origin:50% 100%}to{transform:scale(.8);transform-origin:50% 100%;opacity:0}}.ant-motion-collapse-legacy{overflow:hidden}.ant-motion-collapse-legacy-active{transition:height .2s cubic-bezier(.645,.045,.355,1),opacity .2s cubic-bezier(.645,.045,.355,1)!important}.ant-motion-collapse{overflow:hidden;transition:height .2s cubic-bezier(.645,.045,.355,1),opacity .2s cubic-bezier(.645,.045,.355,1)!important}.ant-affix{position:fixed;z-index:10}.ant-alert{box-sizing:border-box;margin:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;display:flex;align-items:center;padding:8px 15px;word-wrap:break-word;border-radius:2px}.ant-alert-content{flex:1;min-width:0}.ant-alert-icon{margin-right:8px}.ant-alert-description{display:none;font-size:14px;line-height:22px}.ant-alert-success{background-color:#f6ffed;border:1px solid #b7eb8f}.ant-alert-success .ant-alert-icon{color:#52c41a}.ant-alert-info{background-color:#e6f7ff;border:1px solid #91d5ff}.ant-alert-info .ant-alert-icon{color:#1890ff}.ant-alert-warning{background-color:#fffbe6;border:1px solid #ffe58f}.ant-alert-warning .ant-alert-icon{color:#faad14}.ant-alert-error{background-color:#fff2f0;border:1px solid #ffccc7}.ant-alert-error .ant-alert-icon{color:#ff4d4f}.ant-alert-error .ant-alert-description>pre{margin:0;padding:0}.ant-alert-action{margin-left:8px}.ant-alert-close-icon{margin-left:8px;padding:0;overflow:hidden;font-size:12px;line-height:12px;background-color:transparent;border:none;outline:none;cursor:pointer}.ant-alert-close-icon .anticon-close{color:#00000073;transition:color .3s}.ant-alert-close-icon .anticon-close:hover{color:#000000bf}.ant-alert-close-text{color:#00000073;transition:color .3s}.ant-alert-close-text:hover{color:#000000bf}.ant-alert-with-description{align-items:flex-start;padding:15px 15px 15px 24px}.ant-alert-with-description.ant-alert-no-icon{padding:15px}.ant-alert-with-description .ant-alert-icon{margin-right:15px;font-size:24px}.ant-alert-with-description .ant-alert-message{display:block;margin-bottom:4px;color:#000000d9;font-size:16px}.ant-alert-message{color:#000000d9}.ant-alert-with-description .ant-alert-description{display:block}.ant-alert.ant-alert-motion-leave{overflow:hidden;opacity:1;transition:max-height .3s cubic-bezier(.78,.14,.15,.86),opacity .3s cubic-bezier(.78,.14,.15,.86),padding-top .3s cubic-bezier(.78,.14,.15,.86),padding-bottom .3s cubic-bezier(.78,.14,.15,.86),margin-bottom .3s cubic-bezier(.78,.14,.15,.86)}.ant-alert.ant-alert-motion-leave-active{max-height:0;margin-bottom:0!important;padding-top:0;padding-bottom:0;opacity:0}.ant-alert-banner{margin-bottom:0;border:0;border-radius:0}.ant-alert.ant-alert-rtl{direction:rtl}.ant-alert-rtl .ant-alert-icon{margin-right:auto;margin-left:8px}.ant-alert-rtl .ant-alert-action,.ant-alert-rtl .ant-alert-close-icon{margin-right:8px;margin-left:auto}.ant-alert-rtl.ant-alert-with-description{padding-right:24px;padding-left:15px}.ant-alert-rtl.ant-alert-with-description .ant-alert-icon{margin-right:auto;margin-left:15px}.ant-anchor{box-sizing:border-box;margin:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;padding:0 0 0 2px}.ant-anchor-wrapper{margin-left:-4px;padding-left:4px;overflow:auto;background-color:transparent}.ant-anchor-ink{position:absolute;top:0;left:0;height:100%}.ant-anchor-ink:before{position:relative;display:block;width:2px;height:100%;margin:0 auto;background-color:#f0f0f0;content:" "}.ant-anchor-ink-ball{position:absolute;left:50%;display:none;width:8px;height:8px;background-color:#fff;border:2px solid #1890ff;border-radius:8px;transform:translate(-50%);transition:top .3s ease-in-out}.ant-anchor-ink-ball.ant-anchor-ink-ball-visible{display:inline-block}.ant-anchor-fixed .ant-anchor-ink .ant-anchor-ink-ball{display:none}.ant-anchor-link{padding:4px 0 4px 16px}.ant-anchor-link-title{position:relative;display:block;margin-bottom:3px;overflow:hidden;color:#000000d9;white-space:nowrap;text-overflow:ellipsis;transition:all .3s}.ant-anchor-link-title:only-child{margin-bottom:0}.ant-anchor-link-active>.ant-anchor-link-title{color:#1890ff}.ant-anchor-link .ant-anchor-link{padding-top:2px;padding-bottom:2px}.ant-anchor-rtl{direction:rtl}.ant-anchor-rtl.ant-anchor-wrapper{margin-right:-4px;margin-left:0;padding-right:4px;padding-left:0}.ant-anchor-rtl .ant-anchor-ink{right:0;left:auto}.ant-anchor-rtl .ant-anchor-ink-ball{right:50%;left:0;transform:translate(50%)}.ant-anchor-rtl .ant-anchor-link{padding:4px 16px 4px 0}.ant-select-auto-complete{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum"}.ant-select-auto-complete .ant-select-clear{right:13px}.ant-select-single .ant-select-selector{display:flex}.ant-select-single .ant-select-selector .ant-select-selection-search{position:absolute;inset:0 11px}.ant-select-single .ant-select-selector .ant-select-selection-search-input{width:100%}.ant-select-single .ant-select-selector .ant-select-selection-item,.ant-select-single .ant-select-selector .ant-select-selection-placeholder{padding:0;line-height:30px;transition:all .3s}.ant-select-single .ant-select-selector .ant-select-selection-item{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-select-single .ant-select-selector .ant-select-selection-placeholder{transition:none;pointer-events:none}.ant-select-single .ant-select-selector:after,.ant-select-single .ant-select-selector .ant-select-selection-item:after,.ant-select-single .ant-select-selector .ant-select-selection-placeholder:after{display:inline-block;width:0;visibility:hidden;content:"\\a0"}.ant-select-single.ant-select-show-arrow .ant-select-selection-search{right:25px}.ant-select-single.ant-select-show-arrow .ant-select-selection-item,.ant-select-single.ant-select-show-arrow .ant-select-selection-placeholder{padding-right:18px}.ant-select-single.ant-select-open .ant-select-selection-item{color:#bfbfbf}.ant-select-single:not(.ant-select-customize-input) .ant-select-selector{width:100%;height:32px;padding:0 11px}.ant-select-single:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-search-input{height:30px}.ant-select-single:not(.ant-select-customize-input) .ant-select-selector:after{line-height:30px}.ant-select-single.ant-select-customize-input .ant-select-selector:after{display:none}.ant-select-single.ant-select-customize-input .ant-select-selector .ant-select-selection-search{position:static;width:100%}.ant-select-single.ant-select-customize-input .ant-select-selector .ant-select-selection-placeholder{position:absolute;right:0;left:0;padding:0 11px}.ant-select-single.ant-select-customize-input .ant-select-selector .ant-select-selection-placeholder:after{display:none}.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector{height:40px}.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector:after,.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-item,.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-placeholder{line-height:38px}.ant-select-single.ant-select-lg:not(.ant-select-customize-input):not(.ant-select-customize-input) .ant-select-selection-search-input{height:38px}.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector{height:24px}.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector:after,.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-item,.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-placeholder{line-height:22px}.ant-select-single.ant-select-sm:not(.ant-select-customize-input):not(.ant-select-customize-input) .ant-select-selection-search-input{height:22px}.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selection-search{right:7px;left:7px}.ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector{padding:0 7px}.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-search{right:28px}.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-item,.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-placeholder{padding-right:21px}.ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector{padding:0 11px}.ant-select-selection-overflow{position:relative;display:flex;flex:auto;flex-wrap:wrap;max-width:100%}.ant-select-selection-overflow-item{flex:none;align-self:center;max-width:100%}.ant-select-multiple .ant-select-selector{display:flex;flex-wrap:wrap;align-items:center;padding:1px 4px}.ant-select-show-search.ant-select-multiple .ant-select-selector{cursor:text}.ant-select-disabled.ant-select-multiple .ant-select-selector{background:#f5f5f5;cursor:not-allowed}.ant-select-multiple .ant-select-selector:after{display:inline-block;width:0;margin:2px 0;line-height:24px;content:"\\a0"}.ant-select-multiple.ant-select-show-arrow .ant-select-selector,.ant-select-multiple.ant-select-allow-clear .ant-select-selector{padding-right:24px}.ant-select-multiple .ant-select-selection-item{position:relative;display:flex;flex:none;box-sizing:border-box;max-width:100%;height:24px;margin-top:2px;margin-bottom:2px;line-height:22px;background:#f5f5f5;border:1px solid #f0f0f0;border-radius:2px;cursor:default;transition:font-size .3s,line-height .3s,height .3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-margin-end:4px;margin-inline-end:4px;-webkit-padding-start:8px;padding-inline-start:8px;-webkit-padding-end:4px;padding-inline-end:4px}.ant-select-disabled.ant-select-multiple .ant-select-selection-item{color:#bfbfbf;border-color:#d9d9d9;cursor:not-allowed}.ant-select-multiple .ant-select-selection-item-content{display:inline-block;margin-right:4px;overflow:hidden;white-space:pre;text-overflow:ellipsis}.ant-select-multiple .ant-select-selection-item-remove{color:inherit;font-style:normal;line-height:0;text-align:center;text-transform:none;vertical-align:-.125em;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;color:#00000073;font-weight:700;font-size:10px;line-height:inherit;cursor:pointer}.ant-select-multiple .ant-select-selection-item-remove>*{line-height:1}.ant-select-multiple .ant-select-selection-item-remove svg{display:inline-block}.ant-select-multiple .ant-select-selection-item-remove:before{display:none}.ant-select-multiple .ant-select-selection-item-remove .ant-select-multiple .ant-select-selection-item-remove-icon{display:block}.ant-select-multiple .ant-select-selection-item-remove>.anticon{vertical-align:middle}.ant-select-multiple .ant-select-selection-item-remove:hover{color:#000000bf}.ant-select-multiple .ant-select-selection-overflow-item+.ant-select-selection-overflow-item .ant-select-selection-search{-webkit-margin-start:0;margin-inline-start:0}.ant-select-multiple .ant-select-selection-search{position:relative;max-width:100%;-webkit-margin-start:7px;margin-inline-start:7px}.ant-select-multiple .ant-select-selection-search-input,.ant-select-multiple .ant-select-selection-search-mirror{height:24px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";line-height:24px;transition:all .3s}.ant-select-multiple .ant-select-selection-search-input{width:100%;min-width:4.1px}.ant-select-multiple .ant-select-selection-search-mirror{position:absolute;top:0;left:0;z-index:999;white-space:pre;visibility:hidden}.ant-select-multiple .ant-select-selection-placeholder{position:absolute;top:50%;right:11px;left:11px;transform:translateY(-50%);transition:all .3s}.ant-select-multiple.ant-select-lg .ant-select-selector:after{line-height:32px}.ant-select-multiple.ant-select-lg .ant-select-selection-item{height:32px;line-height:30px}.ant-select-multiple.ant-select-lg .ant-select-selection-search{height:32px;line-height:32px}.ant-select-multiple.ant-select-lg .ant-select-selection-search-input,.ant-select-multiple.ant-select-lg .ant-select-selection-search-mirror{height:32px;line-height:30px}.ant-select-multiple.ant-select-sm .ant-select-selector:after{line-height:16px}.ant-select-multiple.ant-select-sm .ant-select-selection-item{height:16px;line-height:14px}.ant-select-multiple.ant-select-sm .ant-select-selection-search{height:16px;line-height:16px}.ant-select-multiple.ant-select-sm .ant-select-selection-search-input,.ant-select-multiple.ant-select-sm .ant-select-selection-search-mirror{height:16px;line-height:14px}.ant-select-multiple.ant-select-sm .ant-select-selection-placeholder{left:7px}.ant-select-multiple.ant-select-sm .ant-select-selection-search{-webkit-margin-start:3px;margin-inline-start:3px}.ant-select-multiple.ant-select-lg .ant-select-selection-item{height:32px;line-height:32px}.ant-select-disabled .ant-select-selection-item-remove{display:none}.ant-select-status-error.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input):not(.ant-pagination-size-changer) .ant-select-selector{background-color:#fff;border-color:#ff4d4f!important}.ant-select-status-error.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input):not(.ant-pagination-size-changer).ant-select-open .ant-select-selector,.ant-select-status-error.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input):not(.ant-pagination-size-changer).ant-select-focused .ant-select-selector{border-color:#ff7875;box-shadow:0 0 0 2px #ff4d4f33;border-right-width:1px;outline:0}.ant-select-status-warning.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input):not(.ant-pagination-size-changer) .ant-select-selector{background-color:#fff;border-color:#faad14!important}.ant-select-status-warning.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input):not(.ant-pagination-size-changer).ant-select-open .ant-select-selector,.ant-select-status-warning.ant-select:not(.ant-select-disabled):not(.ant-select-customize-input):not(.ant-pagination-size-changer).ant-select-focused .ant-select-selector{border-color:#ffc53d;box-shadow:0 0 0 2px #faad1433;border-right-width:1px;outline:0}.ant-select-status-error.ant-select-has-feedback .ant-select-clear,.ant-select-status-warning.ant-select-has-feedback .ant-select-clear,.ant-select-status-success.ant-select-has-feedback .ant-select-clear,.ant-select-status-validating.ant-select-has-feedback .ant-select-clear{right:32px}.ant-select-status-error.ant-select-has-feedback .ant-select-selection-selected-value,.ant-select-status-warning.ant-select-has-feedback .ant-select-selection-selected-value,.ant-select-status-success.ant-select-has-feedback .ant-select-selection-selected-value,.ant-select-status-validating.ant-select-has-feedback .ant-select-selection-selected-value{padding-right:42px}.ant-select{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;display:inline-block;cursor:pointer}.ant-select:not(.ant-select-customize-input) .ant-select-selector{position:relative;background-color:#fff;border:1px solid #d9d9d9;border-radius:2px;transition:all .3s cubic-bezier(.645,.045,.355,1)}.ant-select:not(.ant-select-customize-input) .ant-select-selector input{cursor:pointer}.ant-select-show-search.ant-select:not(.ant-select-customize-input) .ant-select-selector{cursor:text}.ant-select-show-search.ant-select:not(.ant-select-customize-input) .ant-select-selector input{cursor:auto}.ant-select-focused:not(.ant-select-disabled).ant-select:not(.ant-select-customize-input) .ant-select-selector{border-color:#40a9ff;box-shadow:0 0 0 2px #1890ff33;border-right-width:1px;outline:0}.ant-select-disabled.ant-select:not(.ant-select-customize-input) .ant-select-selector{color:#00000040;background:#f5f5f5;cursor:not-allowed}.ant-select-multiple.ant-select-disabled.ant-select:not(.ant-select-customize-input) .ant-select-selector{background:#f5f5f5}.ant-select-disabled.ant-select:not(.ant-select-customize-input) .ant-select-selector input{cursor:not-allowed}.ant-select:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-search-input{margin:0;padding:0;background:transparent;border:none;outline:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.ant-select:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-search-input::-webkit-search-cancel-button{display:none;-webkit-appearance:none}.ant-select:not(.ant-select-disabled):hover .ant-select-selector{border-color:#40a9ff;border-right-width:1px}.ant-select-selection-item{flex:1;overflow:hidden;font-weight:400;white-space:nowrap;text-overflow:ellipsis}@media all and (-ms-high-contrast: none){.ant-select-selection-item *::-ms-backdrop,.ant-select-selection-item{flex:auto}}.ant-select-selection-placeholder{flex:1;overflow:hidden;color:#bfbfbf;white-space:nowrap;text-overflow:ellipsis;pointer-events:none}@media all and (-ms-high-contrast: none){.ant-select-selection-placeholder *::-ms-backdrop,.ant-select-selection-placeholder{flex:auto}}.ant-select-arrow{display:inline-block;color:inherit;font-style:normal;line-height:0;text-transform:none;vertical-align:-.125em;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;position:absolute;top:50%;right:11px;display:flex;align-items:center;height:12px;margin-top:-6px;color:#00000040;font-size:12px;line-height:1;text-align:center;pointer-events:none}.ant-select-arrow>*{line-height:1}.ant-select-arrow svg{display:inline-block}.ant-select-arrow:before{display:none}.ant-select-arrow .ant-select-arrow-icon{display:block}.ant-select-arrow .anticon{vertical-align:top;transition:transform .3s}.ant-select-arrow .anticon>svg{vertical-align:top}.ant-select-arrow .anticon:not(.ant-select-suffix){pointer-events:auto}.ant-select-disabled .ant-select-arrow{cursor:not-allowed}.ant-select-arrow>*:not(:last-child){-webkit-margin-end:8px;margin-inline-end:8px}.ant-select-clear{position:absolute;top:50%;right:11px;z-index:1;display:inline-block;width:12px;height:12px;margin-top:-6px;color:#00000040;font-size:12px;font-style:normal;line-height:1;text-align:center;text-transform:none;background:#fff;cursor:pointer;opacity:0;transition:color .3s ease,opacity .15s ease;text-rendering:auto}.ant-select-clear:before{display:block}.ant-select-clear:hover{color:#00000073}.ant-select:hover .ant-select-clear{opacity:1}.ant-select-dropdown{margin:0;color:#000000d9;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:absolute;top:-9999px;left:-9999px;z-index:1050;box-sizing:border-box;padding:4px 0;overflow:hidden;font-size:14px;font-variant:initial;background-color:#fff;border-radius:2px;outline:none;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d}.ant-select-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-select-dropdown-placement-bottomLeft,.ant-select-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-select-dropdown-placement-bottomLeft{animation-name:antSlideUpIn}.ant-select-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-select-dropdown-placement-topLeft,.ant-select-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-select-dropdown-placement-topLeft{animation-name:antSlideDownIn}.ant-select-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-select-dropdown-placement-bottomLeft{animation-name:antSlideUpOut}.ant-select-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-select-dropdown-placement-topLeft{animation-name:antSlideDownOut}.ant-select-dropdown-hidden{display:none}.ant-select-dropdown-empty{color:#00000040}.ant-select-item-empty{position:relative;display:block;min-height:32px;padding:5px 12px;color:#000000d9;font-weight:400;font-size:14px;line-height:22px;color:#00000040}.ant-select-item{position:relative;display:block;min-height:32px;padding:5px 12px;color:#000000d9;font-weight:400;font-size:14px;line-height:22px;cursor:pointer;transition:background .3s ease}.ant-select-item-group{color:#00000073;font-size:12px;cursor:default}.ant-select-item-option{display:flex}.ant-select-item-option-content{flex:auto;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-select-item-option-state{flex:none}.ant-select-item-option-active:not(.ant-select-item-option-disabled){background-color:#f5f5f5}.ant-select-item-option-selected:not(.ant-select-item-option-disabled){color:#000000d9;font-weight:600;background-color:#e6f7ff}.ant-select-item-option-selected:not(.ant-select-item-option-disabled) .ant-select-item-option-state{color:#1890ff}.ant-select-item-option-disabled{color:#00000040;cursor:not-allowed}.ant-select-item-option-disabled.ant-select-item-option-selected{background-color:#f5f5f5}.ant-select-item-option-grouped{padding-left:24px}.ant-select-lg{font-size:16px}.ant-select-borderless .ant-select-selector{background-color:transparent!important;border-color:transparent!important;box-shadow:none!important}.ant-select.ant-select-in-form-item{width:100%}.ant-select-compact-item:not(.ant-select-compact-last-item){margin-right:-1px}.ant-select-compact-item:not(.ant-select-compact-last-item).ant-select-compact-item-rtl{margin-right:0;margin-left:-1px}.ant-select-compact-item:hover>*,.ant-select-compact-item:focus>*,.ant-select-compact-item:active>*{z-index:2}.ant-select-compact-item.ant-select-focused>*{z-index:2}.ant-select-compact-item[disabled]>*{z-index:0}.ant-select-compact-item:not(.ant-select-compact-first-item):not(.ant-select-compact-last-item).ant-select>.ant-select-selector{border-radius:0}.ant-select-compact-item.ant-select-compact-first-item.ant-select:not(.ant-select-compact-last-item):not(.ant-select-compact-item-rtl)>.ant-select-selector{border-top-right-radius:0;border-bottom-right-radius:0}.ant-select-compact-item.ant-select-compact-last-item.ant-select:not(.ant-select-compact-first-item):not(.ant-select-compact-item-rtl)>.ant-select-selector{border-top-left-radius:0;border-bottom-left-radius:0}.ant-select-compact-item.ant-select.ant-select-compact-first-item.ant-select-compact-item-rtl:not(.ant-select-compact-last-item)>.ant-select-selector{border-top-left-radius:0;border-bottom-left-radius:0}.ant-select-compact-item.ant-select.ant-select-compact-last-item.ant-select-compact-item-rtl:not(.ant-select-compact-first-item)>.ant-select-selector{border-top-right-radius:0;border-bottom-right-radius:0}.ant-select-rtl{direction:rtl}.ant-select-rtl .ant-select-arrow,.ant-select-rtl .ant-select-clear{right:initial;left:11px}.ant-select-dropdown-rtl{direction:rtl}.ant-select-dropdown-rtl .ant-select-item-option-grouped{padding-right:24px;padding-left:12px}.ant-select-rtl.ant-select-multiple.ant-select-show-arrow .ant-select-selector,.ant-select-rtl.ant-select-multiple.ant-select-allow-clear .ant-select-selector{padding-right:4px;padding-left:24px}.ant-select-rtl.ant-select-multiple .ant-select-selection-item{text-align:right}.ant-select-rtl.ant-select-multiple .ant-select-selection-item-content{margin-right:0;margin-left:4px;text-align:right}.ant-select-rtl.ant-select-multiple .ant-select-selection-search-mirror{right:0;left:auto}.ant-select-rtl.ant-select-multiple .ant-select-selection-placeholder{right:11px;left:auto}.ant-select-rtl.ant-select-multiple.ant-select-sm .ant-select-selection-placeholder{right:7px}.ant-select-rtl.ant-select-single .ant-select-selector .ant-select-selection-item,.ant-select-rtl.ant-select-single .ant-select-selector .ant-select-selection-placeholder{right:0;left:9px;text-align:right}.ant-select-rtl.ant-select-single.ant-select-show-arrow .ant-select-selection-search{right:11px;left:25px}.ant-select-rtl.ant-select-single.ant-select-show-arrow .ant-select-selection-item,.ant-select-rtl.ant-select-single.ant-select-show-arrow .ant-select-selection-placeholder{padding-right:0;padding-left:18px}.ant-select-rtl.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-search{right:6px}.ant-select-rtl.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-item,.ant-select-rtl.ant-select-single.ant-select-sm:not(.ant-select-customize-input).ant-select-show-arrow .ant-select-selection-placeholder{padding-right:0;padding-left:21px}.ant-empty{margin:0 8px;font-size:14px;line-height:1.5715;text-align:center}.ant-empty-image{height:100px;margin-bottom:8px}.ant-empty-image img{height:100%}.ant-empty-image svg{height:100%;margin:auto}.ant-empty-footer{margin-top:16px}.ant-empty-normal{margin:32px 0;color:#00000040}.ant-empty-normal .ant-empty-image{height:40px}.ant-empty-small{margin:8px 0;color:#00000040}.ant-empty-small .ant-empty-image{height:35px}.ant-empty-img-default-ellipse{fill:#f5f5f5;fill-opacity:.8}.ant-empty-img-default-path-1{fill:#aeb8c2}.ant-empty-img-default-path-2{fill:url(#linearGradient-1)}.ant-empty-img-default-path-3{fill:#f5f5f7}.ant-empty-img-default-path-4,.ant-empty-img-default-path-5{fill:#dce0e6}.ant-empty-img-default-g{fill:#fff}.ant-empty-img-simple-ellipse{fill:#f5f5f5}.ant-empty-img-simple-g{stroke:#d9d9d9}.ant-empty-img-simple-path{fill:#fafafa}.ant-empty-rtl{direction:rtl}.ant-avatar{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;display:inline-block;overflow:hidden;color:#fff;white-space:nowrap;text-align:center;vertical-align:middle;background:#ccc;width:32px;height:32px;line-height:32px;border-radius:50%}.ant-avatar-image{background:transparent}.ant-avatar .ant-image-img{display:block}.ant-avatar-string{position:absolute;left:50%;transform-origin:0 center}.ant-avatar.ant-avatar-icon{font-size:18px}.ant-avatar.ant-avatar-icon>.anticon{margin:0}.ant-avatar-lg{width:40px;height:40px;line-height:40px;border-radius:50%}.ant-avatar-lg-string{position:absolute;left:50%;transform-origin:0 center}.ant-avatar-lg.ant-avatar-icon{font-size:24px}.ant-avatar-lg.ant-avatar-icon>.anticon{margin:0}.ant-avatar-sm{width:24px;height:24px;line-height:24px;border-radius:50%}.ant-avatar-sm-string{position:absolute;left:50%;transform-origin:0 center}.ant-avatar-sm.ant-avatar-icon{font-size:14px}.ant-avatar-sm.ant-avatar-icon>.anticon{margin:0}.ant-avatar-square{border-radius:2px}.ant-avatar>img{display:block;width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.ant-avatar-group{display:inline-flex}.ant-avatar-group .ant-avatar{border:1px solid #fff}.ant-avatar-group .ant-avatar:not(:first-child){margin-left:-8px}.ant-avatar-group-popover .ant-avatar+.ant-avatar{margin-left:3px}.ant-avatar-group-rtl .ant-avatar:not(:first-child){margin-right:-8px;margin-left:0}.ant-avatar-group-popover.ant-popover-rtl .ant-avatar+.ant-avatar{margin-right:3px;margin-left:0}.ant-popover{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:absolute;top:0;left:0;z-index:1030;font-weight:400;white-space:normal;text-align:left;cursor:auto;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.ant-popover-content{position:relative}.ant-popover:after{position:absolute;background:rgba(255,255,255,.01);content:""}.ant-popover-hidden{display:none}.ant-popover-placement-top,.ant-popover-placement-topLeft,.ant-popover-placement-topRight{padding-bottom:15.3137085px}.ant-popover-placement-right,.ant-popover-placement-rightTop,.ant-popover-placement-rightBottom{padding-left:15.3137085px}.ant-popover-placement-bottom,.ant-popover-placement-bottomLeft,.ant-popover-placement-bottomRight{padding-top:15.3137085px}.ant-popover-placement-left,.ant-popover-placement-leftTop,.ant-popover-placement-leftBottom{padding-right:15.3137085px}.ant-popover-inner{background-color:#fff;background-clip:padding-box;border-radius:2px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d}@media screen and (-ms-high-contrast: active),(-ms-high-contrast: none){.ant-popover-inner{box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d}}.ant-popover-title{min-width:177px;min-height:32px;margin:0;padding:5px 16px 4px;color:#000000d9;font-weight:500;border-bottom:1px solid #f0f0f0}.ant-popover-inner-content{padding:12px 16px;color:#000000d9}.ant-popover-message{display:flex;padding:4px 0 12px;color:#000000d9;font-size:14px}.ant-popover-message-icon{display:inline-block;margin-right:8px;color:#faad14;font-size:14px}.ant-popover-buttons{margin-bottom:4px;text-align:right}.ant-popover-buttons button:not(:first-child){margin-left:8px}.ant-popover-arrow{position:absolute;display:block;width:22px;height:22px;overflow:hidden;background:transparent;pointer-events:none}.ant-popover-arrow-content{--antd-arrow-background-color: #fff;position:absolute;inset:0;display:block;width:11.3137085px;height:11.3137085px;margin:auto;content:"";pointer-events:auto;border-radius:0 0 2px;pointer-events:none}.ant-popover-arrow-content:before{position:absolute;top:-11.3137085px;left:-11.3137085px;width:33.9411255px;height:33.9411255px;background:var(--antd-arrow-background-color);background-repeat:no-repeat;background-position:-10px -10px;content:"";-webkit-clip-path:inset(33% 33%);clip-path:inset(33% 33%);-webkit-clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z");clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z")}.ant-popover-placement-top .ant-popover-arrow,.ant-popover-placement-topLeft .ant-popover-arrow,.ant-popover-placement-topRight .ant-popover-arrow{bottom:0;transform:translateY(100%)}.ant-popover-placement-top .ant-popover-arrow-content,.ant-popover-placement-topLeft .ant-popover-arrow-content,.ant-popover-placement-topRight .ant-popover-arrow-content{box-shadow:3px 3px 7px #00000012;transform:translateY(-11px) rotate(45deg)}.ant-popover-placement-top .ant-popover-arrow{left:50%;transform:translateY(100%) translate(-50%)}.ant-popover-placement-topLeft .ant-popover-arrow{left:16px}.ant-popover-placement-topRight .ant-popover-arrow{right:16px}.ant-popover-placement-right .ant-popover-arrow,.ant-popover-placement-rightTop .ant-popover-arrow,.ant-popover-placement-rightBottom .ant-popover-arrow{left:0;transform:translate(-100%)}.ant-popover-placement-right .ant-popover-arrow-content,.ant-popover-placement-rightTop .ant-popover-arrow-content,.ant-popover-placement-rightBottom .ant-popover-arrow-content{box-shadow:3px 3px 7px #00000012;transform:translate(11px) rotate(135deg)}.ant-popover-placement-right .ant-popover-arrow{top:50%;transform:translate(-100%) translateY(-50%)}.ant-popover-placement-rightTop .ant-popover-arrow{top:12px}.ant-popover-placement-rightBottom .ant-popover-arrow{bottom:12px}.ant-popover-placement-bottom .ant-popover-arrow,.ant-popover-placement-bottomLeft .ant-popover-arrow,.ant-popover-placement-bottomRight .ant-popover-arrow{top:0;transform:translateY(-100%)}.ant-popover-placement-bottom .ant-popover-arrow-content,.ant-popover-placement-bottomLeft .ant-popover-arrow-content,.ant-popover-placement-bottomRight .ant-popover-arrow-content{box-shadow:2px 2px 5px #0000000f;transform:translateY(11px) rotate(-135deg)}.ant-popover-placement-bottom .ant-popover-arrow{left:50%;transform:translateY(-100%) translate(-50%)}.ant-popover-placement-bottomLeft .ant-popover-arrow{left:16px}.ant-popover-placement-bottomRight .ant-popover-arrow{right:16px}.ant-popover-placement-left .ant-popover-arrow,.ant-popover-placement-leftTop .ant-popover-arrow,.ant-popover-placement-leftBottom .ant-popover-arrow{right:0;transform:translate(100%)}.ant-popover-placement-left .ant-popover-arrow-content,.ant-popover-placement-leftTop .ant-popover-arrow-content,.ant-popover-placement-leftBottom .ant-popover-arrow-content{box-shadow:3px 3px 7px #00000012;transform:translate(-11px) rotate(-45deg)}.ant-popover-placement-left .ant-popover-arrow{top:50%;transform:translate(100%) translateY(-50%)}.ant-popover-placement-leftTop .ant-popover-arrow{top:12px}.ant-popover-placement-leftBottom .ant-popover-arrow{bottom:12px}.ant-popover-pink .ant-popover-inner,.ant-popover-pink .ant-popover-arrow-content,.ant-popover-magenta .ant-popover-inner,.ant-popover-magenta .ant-popover-arrow-content{background-color:#eb2f96}.ant-popover-red .ant-popover-inner,.ant-popover-red .ant-popover-arrow-content{background-color:#f5222d}.ant-popover-volcano .ant-popover-inner,.ant-popover-volcano .ant-popover-arrow-content{background-color:#fa541c}.ant-popover-orange .ant-popover-inner,.ant-popover-orange .ant-popover-arrow-content{background-color:#fa8c16}.ant-popover-yellow .ant-popover-inner,.ant-popover-yellow .ant-popover-arrow-content{background-color:#fadb14}.ant-popover-gold .ant-popover-inner,.ant-popover-gold .ant-popover-arrow-content{background-color:#faad14}.ant-popover-cyan .ant-popover-inner,.ant-popover-cyan .ant-popover-arrow-content{background-color:#13c2c2}.ant-popover-lime .ant-popover-inner,.ant-popover-lime .ant-popover-arrow-content{background-color:#a0d911}.ant-popover-green .ant-popover-inner,.ant-popover-green .ant-popover-arrow-content{background-color:#52c41a}.ant-popover-blue .ant-popover-inner,.ant-popover-blue .ant-popover-arrow-content{background-color:#1890ff}.ant-popover-geekblue .ant-popover-inner,.ant-popover-geekblue .ant-popover-arrow-content{background-color:#2f54eb}.ant-popover-purple .ant-popover-inner,.ant-popover-purple .ant-popover-arrow-content{background-color:#722ed1}.ant-popover-rtl{direction:rtl;text-align:right}.ant-popover-rtl .ant-popover-message-icon{margin-right:0;margin-left:8px}.ant-popover-rtl .ant-popover-message-title{padding-left:16px}.ant-popover-rtl .ant-popover-buttons{text-align:left}.ant-popover-rtl .ant-popover-buttons button{margin-right:8px;margin-left:0}.ant-back-top{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:fixed;right:100px;bottom:50px;z-index:10;width:40px;height:40px;cursor:pointer}.ant-back-top:empty{display:none}.ant-back-top-rtl{right:auto;left:100px;direction:rtl}.ant-back-top-content{width:40px;height:40px;overflow:hidden;color:#fff;text-align:center;background-color:#00000073;border-radius:20px;transition:all .3s}.ant-back-top-content:hover{background-color:#000000d9;transition:all .3s}.ant-back-top-icon{font-size:24px;line-height:40px}@media screen and (max-width: 768px){.ant-back-top{right:60px}.ant-back-top-rtl{right:auto;left:60px}}@media screen and (max-width: 480px){.ant-back-top{right:20px}.ant-back-top-rtl{right:auto;left:20px}}.ant-badge{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;display:inline-block;line-height:1}.ant-badge-count{z-index:auto;min-width:20px;height:20px;padding:0 6px;color:#fff;font-weight:400;font-size:12px;line-height:20px;white-space:nowrap;text-align:center;background:#ff4d4f;border-radius:10px;box-shadow:0 0 0 1px #fff}.ant-badge-count a,.ant-badge-count a:hover{color:#fff}.ant-badge-count-sm{min-width:14px;height:14px;padding:0;font-size:12px;line-height:14px;border-radius:7px}.ant-badge-multiple-words{padding:0 8px}.ant-badge-dot{z-index:auto;width:6px;min-width:6px;height:6px;background:#ff4d4f;border-radius:100%;box-shadow:0 0 0 1px #fff}.ant-badge-dot.ant-scroll-number{transition:background 1.5s}.ant-badge-count,.ant-badge-dot,.ant-badge .ant-scroll-number-custom-component{position:absolute;top:0;right:0;transform:translate(50%,-50%);transform-origin:100% 0%}.ant-badge-count.anticon-spin,.ant-badge-dot.anticon-spin,.ant-badge .ant-scroll-number-custom-component.anticon-spin{animation:antBadgeLoadingCircle 1s infinite linear}.ant-badge-status{line-height:inherit;vertical-align:baseline}.ant-badge-status-dot{position:relative;top:-1px;display:inline-block;width:6px;height:6px;vertical-align:middle;border-radius:50%}.ant-badge-status-success{background-color:#52c41a}.ant-badge-status-processing{position:relative;background-color:#1890ff}.ant-badge-status-processing:after{position:absolute;top:0;left:0;width:100%;height:100%;border:1px solid #1890ff;border-radius:50%;animation:antStatusProcessing 1.2s infinite ease-in-out;content:""}.ant-badge-status-default{background-color:#d9d9d9}.ant-badge-status-error{background-color:#ff4d4f}.ant-badge-status-warning{background-color:#faad14}.ant-badge-status-pink,.ant-badge-status-magenta{background:#eb2f96}.ant-badge-status-red{background:#f5222d}.ant-badge-status-volcano{background:#fa541c}.ant-badge-status-orange{background:#fa8c16}.ant-badge-status-yellow{background:#fadb14}.ant-badge-status-gold{background:#faad14}.ant-badge-status-cyan{background:#13c2c2}.ant-badge-status-lime{background:#a0d911}.ant-badge-status-green{background:#52c41a}.ant-badge-status-blue{background:#1890ff}.ant-badge-status-geekblue{background:#2f54eb}.ant-badge-status-purple{background:#722ed1}.ant-badge-status-text{margin-left:8px;color:#000000d9;font-size:14px}.ant-badge-zoom-appear,.ant-badge-zoom-enter{animation:antZoomBadgeIn .3s cubic-bezier(.12,.4,.29,1.46);animation-fill-mode:both}.ant-badge-zoom-leave{animation:antZoomBadgeOut .3s cubic-bezier(.71,-.46,.88,.6);animation-fill-mode:both}.ant-badge-not-a-wrapper .ant-badge-zoom-appear,.ant-badge-not-a-wrapper .ant-badge-zoom-enter{animation:antNoWrapperZoomBadgeIn .3s cubic-bezier(.12,.4,.29,1.46)}.ant-badge-not-a-wrapper .ant-badge-zoom-leave{animation:antNoWrapperZoomBadgeOut .3s cubic-bezier(.71,-.46,.88,.6)}.ant-badge-not-a-wrapper:not(.ant-badge-status){vertical-align:middle}.ant-badge-not-a-wrapper .ant-scroll-number-custom-component,.ant-badge-not-a-wrapper .ant-badge-count{transform:none}.ant-badge-not-a-wrapper .ant-scroll-number-custom-component,.ant-badge-not-a-wrapper .ant-scroll-number{position:relative;top:auto;display:block;transform-origin:50% 50%}@keyframes antStatusProcessing{0%{transform:scale(.8);opacity:.5}to{transform:scale(2.4);opacity:0}}.ant-scroll-number{overflow:hidden;direction:ltr}.ant-scroll-number-only{position:relative;display:inline-block;height:20px;transition:all .3s cubic-bezier(.645,.045,.355,1);-webkit-transform-style:preserve-3d;-webkit-backface-visibility:hidden}.ant-scroll-number-only>p.ant-scroll-number-only-unit{height:20px;margin:0;-webkit-transform-style:preserve-3d;-webkit-backface-visibility:hidden}.ant-scroll-number-symbol{vertical-align:top}@keyframes antZoomBadgeIn{0%{transform:scale(0) translate(50%,-50%);opacity:0}to{transform:scale(1) translate(50%,-50%)}}@keyframes antZoomBadgeOut{0%{transform:scale(1) translate(50%,-50%)}to{transform:scale(0) translate(50%,-50%);opacity:0}}@keyframes antNoWrapperZoomBadgeIn{0%{transform:scale(0);opacity:0}to{transform:scale(1)}}@keyframes antNoWrapperZoomBadgeOut{0%{transform:scale(1)}to{transform:scale(0);opacity:0}}@keyframes antBadgeLoadingCircle{0%{transform-origin:50%}to{transform:translate(50%,-50%) rotate(360deg);transform-origin:50%}}.ant-ribbon-wrapper{position:relative}.ant-ribbon{box-sizing:border-box;margin:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:absolute;top:8px;height:22px;padding:0 8px;color:#fff;line-height:22px;white-space:nowrap;background-color:#1890ff;border-radius:2px}.ant-ribbon-text{color:#fff}.ant-ribbon-corner{position:absolute;top:100%;width:8px;height:8px;color:currentcolor;border:4px solid;transform:scaleY(.75);transform-origin:top}.ant-ribbon-corner:after{position:absolute;top:-4px;left:-4px;width:inherit;height:inherit;color:#00000040;border:inherit;content:""}.ant-ribbon-color-pink,.ant-ribbon-color-magenta{color:#eb2f96;background:#eb2f96}.ant-ribbon-color-red{color:#f5222d;background:#f5222d}.ant-ribbon-color-volcano{color:#fa541c;background:#fa541c}.ant-ribbon-color-orange{color:#fa8c16;background:#fa8c16}.ant-ribbon-color-yellow{color:#fadb14;background:#fadb14}.ant-ribbon-color-gold{color:#faad14;background:#faad14}.ant-ribbon-color-cyan{color:#13c2c2;background:#13c2c2}.ant-ribbon-color-lime{color:#a0d911;background:#a0d911}.ant-ribbon-color-green{color:#52c41a;background:#52c41a}.ant-ribbon-color-blue{color:#1890ff;background:#1890ff}.ant-ribbon-color-geekblue{color:#2f54eb;background:#2f54eb}.ant-ribbon-color-purple{color:#722ed1;background:#722ed1}.ant-ribbon.ant-ribbon-placement-end{right:-8px;border-bottom-right-radius:0}.ant-ribbon.ant-ribbon-placement-end .ant-ribbon-corner{right:0;border-color:currentcolor transparent transparent currentcolor}.ant-ribbon.ant-ribbon-placement-start{left:-8px;border-bottom-left-radius:0}.ant-ribbon.ant-ribbon-placement-start .ant-ribbon-corner{left:0;border-color:currentcolor currentcolor transparent transparent}.ant-badge-rtl{direction:rtl}.ant-badge-rtl.ant-badge:not(.ant-badge-not-a-wrapper) .ant-badge-count,.ant-badge-rtl.ant-badge:not(.ant-badge-not-a-wrapper) .ant-badge-dot,.ant-badge-rtl.ant-badge:not(.ant-badge-not-a-wrapper) .ant-scroll-number-custom-component{right:auto;left:0;direction:ltr;transform:translate(-50%,-50%);transform-origin:0% 0%}.ant-badge-rtl.ant-badge:not(.ant-badge-not-a-wrapper) .ant-scroll-number-custom-component{right:auto;left:0;transform:translate(-50%,-50%);transform-origin:0% 0%}.ant-badge-rtl .ant-badge-status-text{margin-right:8px;margin-left:0}.ant-badge:not(.ant-badge-not-a-wrapper).ant-badge-rtl .ant-badge-zoom-appear,.ant-badge:not(.ant-badge-not-a-wrapper).ant-badge-rtl .ant-badge-zoom-enter{animation-name:antZoomBadgeInRtl}.ant-badge:not(.ant-badge-not-a-wrapper).ant-badge-rtl .ant-badge-zoom-leave{animation-name:antZoomBadgeOutRtl}.ant-ribbon-rtl{direction:rtl}.ant-ribbon-rtl.ant-ribbon-placement-end{right:unset;left:-8px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.ant-ribbon-rtl.ant-ribbon-placement-end .ant-ribbon-corner{right:unset;left:0;border-color:currentcolor currentcolor transparent transparent}.ant-ribbon-rtl.ant-ribbon-placement-end .ant-ribbon-corner:after{border-color:currentcolor currentcolor transparent transparent}.ant-ribbon-rtl.ant-ribbon-placement-start{right:-8px;left:unset;border-bottom-right-radius:0;border-bottom-left-radius:2px}.ant-ribbon-rtl.ant-ribbon-placement-start .ant-ribbon-corner{right:0;left:unset;border-color:currentcolor transparent transparent currentcolor}.ant-ribbon-rtl.ant-ribbon-placement-start .ant-ribbon-corner:after{border-color:currentcolor transparent transparent currentcolor}@keyframes antZoomBadgeInRtl{0%{transform:scale(0) translate(-50%,-50%);opacity:0}to{transform:scale(1) translate(-50%,-50%)}}@keyframes antZoomBadgeOutRtl{0%{transform:scale(1) translate(-50%,-50%)}to{transform:scale(0) translate(-50%,-50%);opacity:0}}.ant-breadcrumb{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";color:#00000073;font-size:14px}.ant-breadcrumb .anticon{font-size:14px}.ant-breadcrumb ol{display:flex;flex-wrap:wrap;margin:0;padding:0;list-style:none}.ant-breadcrumb a{color:#00000073;transition:color .3s}.ant-breadcrumb a:hover{color:#000000d9}.ant-breadcrumb li:last-child{color:#000000d9}.ant-breadcrumb li:last-child a{color:#000000d9}li:last-child>.ant-breadcrumb-separator{display:none}.ant-breadcrumb-separator{margin:0 8px;color:#00000073}.ant-breadcrumb-link>.anticon+span,.ant-breadcrumb-link>.anticon+a{margin-left:4px}.ant-breadcrumb-overlay-link>.anticon{margin-left:4px}.ant-breadcrumb-rtl{direction:rtl}.ant-breadcrumb-rtl:before{display:table;content:""}.ant-breadcrumb-rtl:after{display:table;clear:both;content:""}.ant-breadcrumb-rtl>span{float:right}.ant-breadcrumb-rtl .ant-breadcrumb-link>.anticon+span,.ant-breadcrumb-rtl .ant-breadcrumb-link>.anticon+a{margin-right:4px;margin-left:0}.ant-breadcrumb-rtl .ant-breadcrumb-overlay-link>.anticon{margin-right:4px;margin-left:0}.ant-dropdown-menu-item.ant-dropdown-menu-item-danger{color:#ff4d4f}.ant-dropdown-menu-item.ant-dropdown-menu-item-danger:hover{color:#fff;background-color:#ff4d4f}.ant-dropdown{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:absolute;top:-9999px;left:-9999px;z-index:1050;display:block}.ant-dropdown:before{position:absolute;inset:-4px 0 -4px -7px;z-index:-9999;opacity:.0001;content:" "}.ant-dropdown-wrap{position:relative}.ant-dropdown-wrap .ant-btn>.anticon-down{font-size:10px}.ant-dropdown-wrap .anticon-down:before{transition:transform .2s}.ant-dropdown-wrap-open .anticon-down:before{transform:rotate(180deg)}.ant-dropdown-hidden,.ant-dropdown-menu-hidden,.ant-dropdown-menu-submenu-hidden{display:none}.ant-dropdown-show-arrow.ant-dropdown-placement-topLeft,.ant-dropdown-show-arrow.ant-dropdown-placement-top,.ant-dropdown-show-arrow.ant-dropdown-placement-topRight{padding-bottom:15.3137085px}.ant-dropdown-show-arrow.ant-dropdown-placement-bottomLeft,.ant-dropdown-show-arrow.ant-dropdown-placement-bottom,.ant-dropdown-show-arrow.ant-dropdown-placement-bottomRight{padding-top:15.3137085px}.ant-dropdown-arrow{position:absolute;z-index:1;display:block;width:11.3137085px;height:11.3137085px;border-radius:0 0 2px;pointer-events:none}.ant-dropdown-arrow:before{position:absolute;top:-11.3137085px;left:-11.3137085px;width:33.9411255px;height:33.9411255px;background:#fff;background-repeat:no-repeat;background-position:-10px -10px;content:"";-webkit-clip-path:inset(33% 33%);clip-path:inset(33% 33%);-webkit-clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z");clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z")}.ant-dropdown-placement-top>.ant-dropdown-arrow,.ant-dropdown-placement-topLeft>.ant-dropdown-arrow,.ant-dropdown-placement-topRight>.ant-dropdown-arrow{bottom:10px;box-shadow:3px 3px 7px -3px #0000001a;transform:rotate(45deg)}.ant-dropdown-placement-top>.ant-dropdown-arrow{left:50%;transform:translate(-50%) rotate(45deg)}.ant-dropdown-placement-topLeft>.ant-dropdown-arrow{left:16px}.ant-dropdown-placement-topRight>.ant-dropdown-arrow{right:16px}.ant-dropdown-placement-bottom>.ant-dropdown-arrow,.ant-dropdown-placement-bottomLeft>.ant-dropdown-arrow,.ant-dropdown-placement-bottomRight>.ant-dropdown-arrow{top:9.41421356px;box-shadow:2px 2px 5px -2px #0000001a;transform:rotate(-135deg) translateY(-.5px)}.ant-dropdown-placement-bottom>.ant-dropdown-arrow{left:50%;transform:translate(-50%) rotate(-135deg) translateY(-.5px)}.ant-dropdown-placement-bottomLeft>.ant-dropdown-arrow{left:16px}.ant-dropdown-placement-bottomRight>.ant-dropdown-arrow{right:16px}.ant-dropdown-menu{position:relative;margin:0;padding:4px 0;text-align:left;list-style-type:none;background-color:#fff;background-clip:padding-box;border-radius:2px;outline:none;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d}.ant-dropdown-menu-item-group-title{padding:5px 12px;color:#00000073;transition:all .3s}.ant-dropdown-menu-submenu-popup{position:absolute;z-index:1050;background:transparent;box-shadow:none;transform-origin:0 0}.ant-dropdown-menu-submenu-popup ul,.ant-dropdown-menu-submenu-popup li{list-style:none}.ant-dropdown-menu-submenu-popup ul{margin-right:.3em;margin-left:.3em}.ant-dropdown-menu-item{position:relative;display:flex;align-items:center}.ant-dropdown-menu-item-icon{min-width:12px;margin-right:8px;font-size:12px}.ant-dropdown-menu-title-content{flex:auto}.ant-dropdown-menu-title-content>a{color:inherit;transition:all .3s}.ant-dropdown-menu-title-content>a:hover{color:inherit}.ant-dropdown-menu-title-content>a:after{position:absolute;inset:0;content:""}.ant-dropdown-menu-item,.ant-dropdown-menu-submenu-title{clear:both;margin:0;padding:5px 12px;color:#000000d9;font-weight:400;font-size:14px;line-height:22px;cursor:pointer;transition:all .3s}.ant-dropdown-menu-item-selected,.ant-dropdown-menu-submenu-title-selected{color:#1890ff;background-color:#e6f7ff}.ant-dropdown-menu-item:hover,.ant-dropdown-menu-submenu-title:hover,.ant-dropdown-menu-item.ant-dropdown-menu-item-active,.ant-dropdown-menu-item.ant-dropdown-menu-submenu-title-active,.ant-dropdown-menu-submenu-title.ant-dropdown-menu-item-active,.ant-dropdown-menu-submenu-title.ant-dropdown-menu-submenu-title-active{background-color:#f5f5f5}.ant-dropdown-menu-item.ant-dropdown-menu-item-disabled,.ant-dropdown-menu-item.ant-dropdown-menu-submenu-title-disabled,.ant-dropdown-menu-submenu-title.ant-dropdown-menu-item-disabled,.ant-dropdown-menu-submenu-title.ant-dropdown-menu-submenu-title-disabled{color:#00000040;cursor:not-allowed}.ant-dropdown-menu-item.ant-dropdown-menu-item-disabled:hover,.ant-dropdown-menu-item.ant-dropdown-menu-submenu-title-disabled:hover,.ant-dropdown-menu-submenu-title.ant-dropdown-menu-item-disabled:hover,.ant-dropdown-menu-submenu-title.ant-dropdown-menu-submenu-title-disabled:hover{color:#00000040;background-color:#fff;cursor:not-allowed}.ant-dropdown-menu-item.ant-dropdown-menu-item-disabled a,.ant-dropdown-menu-item.ant-dropdown-menu-submenu-title-disabled a,.ant-dropdown-menu-submenu-title.ant-dropdown-menu-item-disabled a,.ant-dropdown-menu-submenu-title.ant-dropdown-menu-submenu-title-disabled a{pointer-events:none}.ant-dropdown-menu-item-divider,.ant-dropdown-menu-submenu-title-divider{height:1px;margin:4px 0;overflow:hidden;line-height:0;background-color:#f0f0f0}.ant-dropdown-menu-item .ant-dropdown-menu-submenu-expand-icon,.ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-expand-icon{position:absolute;right:8px}.ant-dropdown-menu-item .ant-dropdown-menu-submenu-expand-icon .ant-dropdown-menu-submenu-arrow-icon,.ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-expand-icon .ant-dropdown-menu-submenu-arrow-icon{margin-right:0!important;color:#00000073;font-size:10px;font-style:normal}.ant-dropdown-menu-item-group-list{margin:0 8px;padding:0;list-style:none}.ant-dropdown-menu-submenu-title{padding-right:24px}.ant-dropdown-menu-submenu-vertical{position:relative}.ant-dropdown-menu-submenu-vertical>.ant-dropdown-menu{position:absolute;top:0;left:100%;min-width:100%;margin-left:4px;transform-origin:0 0}.ant-dropdown-menu-submenu.ant-dropdown-menu-submenu-disabled .ant-dropdown-menu-submenu-title,.ant-dropdown-menu-submenu.ant-dropdown-menu-submenu-disabled .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow-icon{color:#00000040;background-color:#fff;cursor:not-allowed}.ant-dropdown-menu-submenu-selected .ant-dropdown-menu-submenu-title{color:#1890ff}.ant-dropdown.ant-slide-down-enter.ant-slide-down-enter-active.ant-dropdown-placement-bottomLeft,.ant-dropdown.ant-slide-down-appear.ant-slide-down-appear-active.ant-dropdown-placement-bottomLeft,.ant-dropdown.ant-slide-down-enter.ant-slide-down-enter-active.ant-dropdown-placement-bottom,.ant-dropdown.ant-slide-down-appear.ant-slide-down-appear-active.ant-dropdown-placement-bottom,.ant-dropdown.ant-slide-down-enter.ant-slide-down-enter-active.ant-dropdown-placement-bottomRight,.ant-dropdown.ant-slide-down-appear.ant-slide-down-appear-active.ant-dropdown-placement-bottomRight{animation-name:antSlideUpIn}.ant-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-dropdown-placement-topLeft,.ant-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-dropdown-placement-topLeft,.ant-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-dropdown-placement-top,.ant-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-dropdown-placement-top,.ant-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-dropdown-placement-topRight,.ant-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-dropdown-placement-topRight{animation-name:antSlideDownIn}.ant-dropdown.ant-slide-down-leave.ant-slide-down-leave-active.ant-dropdown-placement-bottomLeft,.ant-dropdown.ant-slide-down-leave.ant-slide-down-leave-active.ant-dropdown-placement-bottom,.ant-dropdown.ant-slide-down-leave.ant-slide-down-leave-active.ant-dropdown-placement-bottomRight{animation-name:antSlideUpOut}.ant-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-dropdown-placement-topLeft,.ant-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-dropdown-placement-top,.ant-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-dropdown-placement-topRight{animation-name:antSlideDownOut}.ant-dropdown-trigger>.anticon.anticon-down,.ant-dropdown-link>.anticon.anticon-down,.ant-dropdown-button>.anticon.anticon-down{font-size:10px;vertical-align:baseline}.ant-dropdown-button{white-space:nowrap}.ant-dropdown-button.ant-btn-group>.ant-btn-loading,.ant-dropdown-button.ant-btn-group>.ant-btn-loading+.ant-btn{cursor:default;pointer-events:none}.ant-dropdown-button.ant-btn-group>.ant-btn-loading+.ant-btn:before{display:block}.ant-dropdown-button.ant-btn-group>.ant-btn:last-child:not(:first-child):not(.ant-btn-icon-only){padding-right:8px;padding-left:8px}.ant-dropdown-menu-dark,.ant-dropdown-menu-dark .ant-dropdown-menu{background:#001529}.ant-dropdown-menu-dark .ant-dropdown-menu-item,.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title,.ant-dropdown-menu-dark .ant-dropdown-menu-item>a,.ant-dropdown-menu-dark .ant-dropdown-menu-item>.anticon+span>a{color:#ffffffa6}.ant-dropdown-menu-dark .ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow:after,.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow:after,.ant-dropdown-menu-dark .ant-dropdown-menu-item>a .ant-dropdown-menu-submenu-arrow:after,.ant-dropdown-menu-dark .ant-dropdown-menu-item>.anticon+span>a .ant-dropdown-menu-submenu-arrow:after{color:#ffffffa6}.ant-dropdown-menu-dark .ant-dropdown-menu-item:hover,.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title:hover,.ant-dropdown-menu-dark .ant-dropdown-menu-item>a:hover,.ant-dropdown-menu-dark .ant-dropdown-menu-item>.anticon+span>a:hover{color:#fff;background:transparent}.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected,.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected:hover,.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected>a{color:#fff;background:#1890ff}.ant-dropdown-rtl{direction:rtl}.ant-dropdown-rtl.ant-dropdown:before{right:-7px;left:0}.ant-dropdown-menu.ant-dropdown-menu-rtl,.ant-dropdown-rtl .ant-dropdown-menu-item-group-title,.ant-dropdown-menu-submenu-rtl .ant-dropdown-menu-item-group-title{direction:rtl;text-align:right}.ant-dropdown-menu-submenu-popup.ant-dropdown-menu-submenu-rtl{transform-origin:100% 0}.ant-dropdown-rtl .ant-dropdown-menu-submenu-popup ul,.ant-dropdown-rtl .ant-dropdown-menu-submenu-popup li,.ant-dropdown-rtl .ant-dropdown-menu-item,.ant-dropdown-rtl .ant-dropdown-menu-submenu-title{text-align:right}.ant-dropdown-rtl .ant-dropdown-menu-item>.anticon:first-child,.ant-dropdown-rtl .ant-dropdown-menu-submenu-title>.anticon:first-child,.ant-dropdown-rtl .ant-dropdown-menu-item>span>.anticon:first-child,.ant-dropdown-rtl .ant-dropdown-menu-submenu-title>span>.anticon:first-child{margin-right:0;margin-left:8px}.ant-dropdown-rtl .ant-dropdown-menu-item .ant-dropdown-menu-submenu-expand-icon,.ant-dropdown-rtl .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-expand-icon{right:auto;left:8px}.ant-dropdown-rtl .ant-dropdown-menu-item .ant-dropdown-menu-submenu-expand-icon .ant-dropdown-menu-submenu-arrow-icon,.ant-dropdown-rtl .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-expand-icon .ant-dropdown-menu-submenu-arrow-icon{margin-left:0!important;transform:scaleX(-1)}.ant-dropdown-rtl .ant-dropdown-menu-submenu-title{padding-right:12px;padding-left:24px}.ant-dropdown-rtl .ant-dropdown-menu-submenu-vertical>.ant-dropdown-menu{right:100%;left:0;margin-right:4px;margin-left:0}.ant-btn{line-height:1.5715;position:relative;display:inline-block;font-weight:400;white-space:nowrap;text-align:center;background-image:none;border:1px solid transparent;box-shadow:0 2px #00000004;cursor:pointer;transition:all .3s cubic-bezier(.645,.045,.355,1);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;touch-action:manipulation;height:32px;padding:4px 15px;font-size:14px;border-radius:2px;color:#000000d9;border-color:#d9d9d9;background:#fff}.ant-btn>.anticon{line-height:1}.ant-btn,.ant-btn:active,.ant-btn:focus{outline:0}.ant-btn:not([disabled]):hover{text-decoration:none}.ant-btn:not([disabled]):active{outline:0;box-shadow:none}.ant-btn[disabled]{cursor:not-allowed}.ant-btn[disabled]>*{pointer-events:none}.ant-btn-lg{height:40px;padding:6.4px 15px;font-size:16px;border-radius:2px}.ant-btn-sm{height:24px;padding:0 7px;font-size:14px;border-radius:2px}.ant-btn>a:only-child{color:currentcolor}.ant-btn>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn:hover,.ant-btn:focus{color:#40a9ff;border-color:#40a9ff;background:#fff}.ant-btn:hover>a:only-child,.ant-btn:focus>a:only-child{color:currentcolor}.ant-btn:hover>a:only-child:after,.ant-btn:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn:active{color:#096dd9;border-color:#096dd9;background:#fff}.ant-btn:active>a:only-child{color:currentcolor}.ant-btn:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn[disabled],.ant-btn[disabled]:hover,.ant-btn[disabled]:focus,.ant-btn[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn[disabled]>a:only-child,.ant-btn[disabled]:hover>a:only-child,.ant-btn[disabled]:focus>a:only-child,.ant-btn[disabled]:active>a:only-child{color:currentcolor}.ant-btn[disabled]>a:only-child:after,.ant-btn[disabled]:hover>a:only-child:after,.ant-btn[disabled]:focus>a:only-child:after,.ant-btn[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn:hover,.ant-btn:focus,.ant-btn:active{text-decoration:none;background:#fff}.ant-btn>span{display:inline-block}.ant-btn-primary{color:#fff;border-color:#1890ff;background:#1890ff;text-shadow:0 -1px 0 rgba(0,0,0,.12);box-shadow:0 2px #0000000b}.ant-btn-primary>a:only-child{color:currentcolor}.ant-btn-primary>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-primary:hover,.ant-btn-primary:focus{color:#fff;border-color:#40a9ff;background:#40a9ff}.ant-btn-primary:hover>a:only-child,.ant-btn-primary:focus>a:only-child{color:currentcolor}.ant-btn-primary:hover>a:only-child:after,.ant-btn-primary:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-primary:active{color:#fff;border-color:#096dd9;background:#096dd9}.ant-btn-primary:active>a:only-child{color:currentcolor}.ant-btn-primary:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-primary[disabled],.ant-btn-primary[disabled]:hover,.ant-btn-primary[disabled]:focus,.ant-btn-primary[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn-primary[disabled]>a:only-child,.ant-btn-primary[disabled]:hover>a:only-child,.ant-btn-primary[disabled]:focus>a:only-child,.ant-btn-primary[disabled]:active>a:only-child{color:currentcolor}.ant-btn-primary[disabled]>a:only-child:after,.ant-btn-primary[disabled]:hover>a:only-child:after,.ant-btn-primary[disabled]:focus>a:only-child:after,.ant-btn-primary[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child){border-right-color:#40a9ff;border-left-color:#40a9ff}.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child):disabled{border-color:#d9d9d9}.ant-btn-group .ant-btn-primary:first-child:not(:last-child){border-right-color:#40a9ff}.ant-btn-group .ant-btn-primary:first-child:not(:last-child)[disabled]{border-right-color:#d9d9d9}.ant-btn-group .ant-btn-primary:last-child:not(:first-child),.ant-btn-group .ant-btn-primary+.ant-btn-primary{border-left-color:#40a9ff}.ant-btn-group .ant-btn-primary:last-child:not(:first-child)[disabled],.ant-btn-group .ant-btn-primary+.ant-btn-primary[disabled]{border-left-color:#d9d9d9}.ant-btn-ghost{color:#000000d9;border-color:#d9d9d9;background:transparent}.ant-btn-ghost>a:only-child{color:currentcolor}.ant-btn-ghost>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-ghost:hover,.ant-btn-ghost:focus{color:#40a9ff;border-color:#40a9ff;background:transparent}.ant-btn-ghost:hover>a:only-child,.ant-btn-ghost:focus>a:only-child{color:currentcolor}.ant-btn-ghost:hover>a:only-child:after,.ant-btn-ghost:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-ghost:active{color:#096dd9;border-color:#096dd9;background:transparent}.ant-btn-ghost:active>a:only-child{color:currentcolor}.ant-btn-ghost:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-ghost[disabled],.ant-btn-ghost[disabled]:hover,.ant-btn-ghost[disabled]:focus,.ant-btn-ghost[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn-ghost[disabled]>a:only-child,.ant-btn-ghost[disabled]:hover>a:only-child,.ant-btn-ghost[disabled]:focus>a:only-child,.ant-btn-ghost[disabled]:active>a:only-child{color:currentcolor}.ant-btn-ghost[disabled]>a:only-child:after,.ant-btn-ghost[disabled]:hover>a:only-child:after,.ant-btn-ghost[disabled]:focus>a:only-child:after,.ant-btn-ghost[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dashed{color:#000000d9;border-color:#d9d9d9;background:#fff;border-style:dashed}.ant-btn-dashed>a:only-child{color:currentcolor}.ant-btn-dashed>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dashed:hover,.ant-btn-dashed:focus{color:#40a9ff;border-color:#40a9ff;background:#fff}.ant-btn-dashed:hover>a:only-child,.ant-btn-dashed:focus>a:only-child{color:currentcolor}.ant-btn-dashed:hover>a:only-child:after,.ant-btn-dashed:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dashed:active{color:#096dd9;border-color:#096dd9;background:#fff}.ant-btn-dashed:active>a:only-child{color:currentcolor}.ant-btn-dashed:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dashed[disabled],.ant-btn-dashed[disabled]:hover,.ant-btn-dashed[disabled]:focus,.ant-btn-dashed[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn-dashed[disabled]>a:only-child,.ant-btn-dashed[disabled]:hover>a:only-child,.ant-btn-dashed[disabled]:focus>a:only-child,.ant-btn-dashed[disabled]:active>a:only-child{color:currentcolor}.ant-btn-dashed[disabled]>a:only-child:after,.ant-btn-dashed[disabled]:hover>a:only-child:after,.ant-btn-dashed[disabled]:focus>a:only-child:after,.ant-btn-dashed[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-danger{color:#fff;border-color:#ff4d4f;background:#ff4d4f;text-shadow:0 -1px 0 rgba(0,0,0,.12);box-shadow:0 2px #0000000b}.ant-btn-danger>a:only-child{color:currentcolor}.ant-btn-danger>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-danger:hover,.ant-btn-danger:focus{color:#fff;border-color:#ff7875;background:#ff7875}.ant-btn-danger:hover>a:only-child,.ant-btn-danger:focus>a:only-child{color:currentcolor}.ant-btn-danger:hover>a:only-child:after,.ant-btn-danger:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-danger:active{color:#fff;border-color:#d9363e;background:#d9363e}.ant-btn-danger:active>a:only-child{color:currentcolor}.ant-btn-danger:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-danger[disabled],.ant-btn-danger[disabled]:hover,.ant-btn-danger[disabled]:focus,.ant-btn-danger[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn-danger[disabled]>a:only-child,.ant-btn-danger[disabled]:hover>a:only-child,.ant-btn-danger[disabled]:focus>a:only-child,.ant-btn-danger[disabled]:active>a:only-child{color:currentcolor}.ant-btn-danger[disabled]>a:only-child:after,.ant-btn-danger[disabled]:hover>a:only-child:after,.ant-btn-danger[disabled]:focus>a:only-child:after,.ant-btn-danger[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-link{color:#1890ff;border-color:transparent;background:transparent;box-shadow:none}.ant-btn-link>a:only-child{color:currentcolor}.ant-btn-link>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-link:hover,.ant-btn-link:focus{color:#40a9ff;border-color:#40a9ff;background:transparent}.ant-btn-link:hover>a:only-child,.ant-btn-link:focus>a:only-child{color:currentcolor}.ant-btn-link:hover>a:only-child:after,.ant-btn-link:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-link:active{color:#096dd9;border-color:#096dd9;background:transparent}.ant-btn-link:active>a:only-child{color:currentcolor}.ant-btn-link:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-link[disabled],.ant-btn-link[disabled]:hover,.ant-btn-link[disabled]:focus,.ant-btn-link[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn-link:hover{background:transparent}.ant-btn-link:hover,.ant-btn-link:focus,.ant-btn-link:active{border-color:transparent}.ant-btn-link[disabled],.ant-btn-link[disabled]:hover,.ant-btn-link[disabled]:focus,.ant-btn-link[disabled]:active{color:#00000040;border-color:transparent;background:transparent;text-shadow:none;box-shadow:none}.ant-btn-link[disabled]>a:only-child,.ant-btn-link[disabled]:hover>a:only-child,.ant-btn-link[disabled]:focus>a:only-child,.ant-btn-link[disabled]:active>a:only-child{color:currentcolor}.ant-btn-link[disabled]>a:only-child:after,.ant-btn-link[disabled]:hover>a:only-child:after,.ant-btn-link[disabled]:focus>a:only-child:after,.ant-btn-link[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-text{color:#000000d9;border-color:transparent;background:transparent;box-shadow:none}.ant-btn-text>a:only-child{color:currentcolor}.ant-btn-text>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-text:hover,.ant-btn-text:focus{color:#40a9ff;border-color:#40a9ff;background:transparent}.ant-btn-text:hover>a:only-child,.ant-btn-text:focus>a:only-child{color:currentcolor}.ant-btn-text:hover>a:only-child:after,.ant-btn-text:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-text:active{color:#096dd9;border-color:#096dd9;background:transparent}.ant-btn-text:active>a:only-child{color:currentcolor}.ant-btn-text:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-text[disabled],.ant-btn-text[disabled]:hover,.ant-btn-text[disabled]:focus,.ant-btn-text[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn-text:hover,.ant-btn-text:focus{color:#000000d9;background:rgba(0,0,0,.018);border-color:transparent}.ant-btn-text:active{color:#000000d9;background:rgba(0,0,0,.028);border-color:transparent}.ant-btn-text[disabled],.ant-btn-text[disabled]:hover,.ant-btn-text[disabled]:focus,.ant-btn-text[disabled]:active{color:#00000040;border-color:transparent;background:transparent;text-shadow:none;box-shadow:none}.ant-btn-text[disabled]>a:only-child,.ant-btn-text[disabled]:hover>a:only-child,.ant-btn-text[disabled]:focus>a:only-child,.ant-btn-text[disabled]:active>a:only-child{color:currentcolor}.ant-btn-text[disabled]>a:only-child:after,.ant-btn-text[disabled]:hover>a:only-child:after,.ant-btn-text[disabled]:focus>a:only-child:after,.ant-btn-text[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous{color:#ff4d4f;border-color:#ff4d4f;background:#fff}.ant-btn-dangerous>a:only-child{color:currentcolor}.ant-btn-dangerous>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous:hover,.ant-btn-dangerous:focus{color:#ff7875;border-color:#ff7875;background:#fff}.ant-btn-dangerous:hover>a:only-child,.ant-btn-dangerous:focus>a:only-child{color:currentcolor}.ant-btn-dangerous:hover>a:only-child:after,.ant-btn-dangerous:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous:active{color:#d9363e;border-color:#d9363e;background:#fff}.ant-btn-dangerous:active>a:only-child{color:currentcolor}.ant-btn-dangerous:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous[disabled],.ant-btn-dangerous[disabled]:hover,.ant-btn-dangerous[disabled]:focus,.ant-btn-dangerous[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn-dangerous[disabled]>a:only-child,.ant-btn-dangerous[disabled]:hover>a:only-child,.ant-btn-dangerous[disabled]:focus>a:only-child,.ant-btn-dangerous[disabled]:active>a:only-child{color:currentcolor}.ant-btn-dangerous[disabled]>a:only-child:after,.ant-btn-dangerous[disabled]:hover>a:only-child:after,.ant-btn-dangerous[disabled]:focus>a:only-child:after,.ant-btn-dangerous[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-primary{color:#fff;border-color:#ff4d4f;background:#ff4d4f;text-shadow:0 -1px 0 rgba(0,0,0,.12);box-shadow:0 2px #0000000b}.ant-btn-dangerous.ant-btn-primary>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-primary>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-primary:hover,.ant-btn-dangerous.ant-btn-primary:focus{color:#fff;border-color:#ff7875;background:#ff7875}.ant-btn-dangerous.ant-btn-primary:hover>a:only-child,.ant-btn-dangerous.ant-btn-primary:focus>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-primary:hover>a:only-child:after,.ant-btn-dangerous.ant-btn-primary:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-primary:active{color:#fff;border-color:#d9363e;background:#d9363e}.ant-btn-dangerous.ant-btn-primary:active>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-primary:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-primary[disabled],.ant-btn-dangerous.ant-btn-primary[disabled]:hover,.ant-btn-dangerous.ant-btn-primary[disabled]:focus,.ant-btn-dangerous.ant-btn-primary[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn-dangerous.ant-btn-primary[disabled]>a:only-child,.ant-btn-dangerous.ant-btn-primary[disabled]:hover>a:only-child,.ant-btn-dangerous.ant-btn-primary[disabled]:focus>a:only-child,.ant-btn-dangerous.ant-btn-primary[disabled]:active>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-primary[disabled]>a:only-child:after,.ant-btn-dangerous.ant-btn-primary[disabled]:hover>a:only-child:after,.ant-btn-dangerous.ant-btn-primary[disabled]:focus>a:only-child:after,.ant-btn-dangerous.ant-btn-primary[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-link{color:#ff4d4f;border-color:transparent;background:transparent;box-shadow:none}.ant-btn-dangerous.ant-btn-link>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-link>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-link:hover,.ant-btn-dangerous.ant-btn-link:focus{color:#40a9ff;border-color:#40a9ff;background:transparent}.ant-btn-dangerous.ant-btn-link:active{color:#096dd9;border-color:#096dd9;background:transparent}.ant-btn-dangerous.ant-btn-link[disabled],.ant-btn-dangerous.ant-btn-link[disabled]:hover,.ant-btn-dangerous.ant-btn-link[disabled]:focus,.ant-btn-dangerous.ant-btn-link[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn-dangerous.ant-btn-link:hover,.ant-btn-dangerous.ant-btn-link:focus{color:#ff7875;border-color:transparent;background:transparent}.ant-btn-dangerous.ant-btn-link:hover>a:only-child,.ant-btn-dangerous.ant-btn-link:focus>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-link:hover>a:only-child:after,.ant-btn-dangerous.ant-btn-link:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-link:active{color:#d9363e;border-color:transparent;background:transparent}.ant-btn-dangerous.ant-btn-link:active>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-link:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-link[disabled],.ant-btn-dangerous.ant-btn-link[disabled]:hover,.ant-btn-dangerous.ant-btn-link[disabled]:focus,.ant-btn-dangerous.ant-btn-link[disabled]:active{color:#00000040;border-color:transparent;background:transparent;text-shadow:none;box-shadow:none}.ant-btn-dangerous.ant-btn-link[disabled]>a:only-child,.ant-btn-dangerous.ant-btn-link[disabled]:hover>a:only-child,.ant-btn-dangerous.ant-btn-link[disabled]:focus>a:only-child,.ant-btn-dangerous.ant-btn-link[disabled]:active>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-link[disabled]>a:only-child:after,.ant-btn-dangerous.ant-btn-link[disabled]:hover>a:only-child:after,.ant-btn-dangerous.ant-btn-link[disabled]:focus>a:only-child:after,.ant-btn-dangerous.ant-btn-link[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-text{color:#ff4d4f;border-color:transparent;background:transparent;box-shadow:none}.ant-btn-dangerous.ant-btn-text>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-text>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-text:hover,.ant-btn-dangerous.ant-btn-text:focus{color:#40a9ff;border-color:#40a9ff;background:transparent}.ant-btn-dangerous.ant-btn-text:active{color:#096dd9;border-color:#096dd9;background:transparent}.ant-btn-dangerous.ant-btn-text[disabled],.ant-btn-dangerous.ant-btn-text[disabled]:hover,.ant-btn-dangerous.ant-btn-text[disabled]:focus,.ant-btn-dangerous.ant-btn-text[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn-dangerous.ant-btn-text:hover,.ant-btn-dangerous.ant-btn-text:focus{color:#ff7875;border-color:transparent;background:rgba(0,0,0,.018)}.ant-btn-dangerous.ant-btn-text:hover>a:only-child,.ant-btn-dangerous.ant-btn-text:focus>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-text:hover>a:only-child:after,.ant-btn-dangerous.ant-btn-text:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-text:active{color:#d9363e;border-color:transparent;background:rgba(0,0,0,.028)}.ant-btn-dangerous.ant-btn-text:active>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-text:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-dangerous.ant-btn-text[disabled],.ant-btn-dangerous.ant-btn-text[disabled]:hover,.ant-btn-dangerous.ant-btn-text[disabled]:focus,.ant-btn-dangerous.ant-btn-text[disabled]:active{color:#00000040;border-color:transparent;background:transparent;text-shadow:none;box-shadow:none}.ant-btn-dangerous.ant-btn-text[disabled]>a:only-child,.ant-btn-dangerous.ant-btn-text[disabled]:hover>a:only-child,.ant-btn-dangerous.ant-btn-text[disabled]:focus>a:only-child,.ant-btn-dangerous.ant-btn-text[disabled]:active>a:only-child{color:currentcolor}.ant-btn-dangerous.ant-btn-text[disabled]>a:only-child:after,.ant-btn-dangerous.ant-btn-text[disabled]:hover>a:only-child:after,.ant-btn-dangerous.ant-btn-text[disabled]:focus>a:only-child:after,.ant-btn-dangerous.ant-btn-text[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-icon-only{width:32px;height:32px;padding:2.4px 0;font-size:16px;border-radius:2px;vertical-align:-3px}.ant-btn-icon-only>*{font-size:16px}.ant-btn-icon-only.ant-btn-lg{width:40px;height:40px;padding:4.9px 0;font-size:18px;border-radius:2px}.ant-btn-icon-only.ant-btn-lg>*{font-size:18px}.ant-btn-icon-only.ant-btn-sm{width:24px;height:24px;padding:0;font-size:14px;border-radius:2px}.ant-btn-icon-only.ant-btn-sm>*{font-size:14px}.ant-btn-icon-only>.anticon{display:flex;justify-content:center}.ant-btn-icon-only .anticon-loading{padding:0!important}a.ant-btn-icon-only{vertical-align:-1px}a.ant-btn-icon-only>.anticon{display:inline}.ant-btn-round{height:32px;padding:4px 16px;font-size:14px;border-radius:32px}.ant-btn-round.ant-btn-lg{height:40px;padding:6.4px 20px;font-size:16px;border-radius:40px}.ant-btn-round.ant-btn-sm{height:24px;padding:0 12px;font-size:14px;border-radius:24px}.ant-btn-round.ant-btn-icon-only{width:auto}.ant-btn-circle{min-width:32px;padding-right:0;padding-left:0;text-align:center;border-radius:50%}.ant-btn-circle.ant-btn-lg{min-width:40px;border-radius:50%}.ant-btn-circle.ant-btn-sm{min-width:24px;border-radius:50%}.ant-btn:before{position:absolute;inset:-1px;z-index:1;display:none;background:#fff;border-radius:inherit;opacity:.35;transition:opacity .2s;content:"";pointer-events:none}.ant-btn .anticon{transition:margin-left .3s cubic-bezier(.645,.045,.355,1)}.ant-btn .anticon.anticon-plus>svg,.ant-btn .anticon.anticon-minus>svg{shape-rendering:optimizespeed}.ant-btn.ant-btn-loading{position:relative;cursor:default}.ant-btn.ant-btn-loading:before{display:block}.ant-btn>.ant-btn-loading-icon{transition:width .3s cubic-bezier(.645,.045,.355,1),opacity .3s cubic-bezier(.645,.045,.355,1)}.ant-btn>.ant-btn-loading-icon .anticon{padding-right:8px;animation:none}.ant-btn>.ant-btn-loading-icon .anticon svg{animation:loadingCircle 1s infinite linear}.ant-btn-group{position:relative;display:inline-flex}.ant-btn-group>.ant-btn,.ant-btn-group>span>.ant-btn{position:relative}.ant-btn-group>.ant-btn:hover,.ant-btn-group>span>.ant-btn:hover,.ant-btn-group>.ant-btn:focus,.ant-btn-group>span>.ant-btn:focus,.ant-btn-group>.ant-btn:active,.ant-btn-group>span>.ant-btn:active{z-index:2}.ant-btn-group>.ant-btn[disabled],.ant-btn-group>span>.ant-btn[disabled]{z-index:0}.ant-btn-group .ant-btn-icon-only{font-size:14px}.ant-btn-group .ant-btn+.ant-btn,.ant-btn+.ant-btn-group,.ant-btn-group span+.ant-btn,.ant-btn-group .ant-btn+span,.ant-btn-group>span+span,.ant-btn-group+.ant-btn,.ant-btn-group+.ant-btn-group{margin-left:-1px}.ant-btn-group .ant-btn-primary+.ant-btn:not(.ant-btn-primary):not([disabled]){border-left-color:transparent}.ant-btn-group .ant-btn{border-radius:0}.ant-btn-group>.ant-btn:first-child,.ant-btn-group>span:first-child>.ant-btn{margin-left:0}.ant-btn-group>.ant-btn:only-child{border-radius:2px}.ant-btn-group>span:only-child>.ant-btn{border-radius:2px}.ant-btn-group>.ant-btn:first-child:not(:last-child),.ant-btn-group>span:first-child:not(:last-child)>.ant-btn{border-top-left-radius:2px;border-bottom-left-radius:2px}.ant-btn-group>.ant-btn:last-child:not(:first-child),.ant-btn-group>span:last-child:not(:first-child)>.ant-btn{border-top-right-radius:2px;border-bottom-right-radius:2px}.ant-btn-group-sm>.ant-btn:only-child{border-radius:2px}.ant-btn-group-sm>span:only-child>.ant-btn{border-radius:2px}.ant-btn-group-sm>.ant-btn:first-child:not(:last-child),.ant-btn-group-sm>span:first-child:not(:last-child)>.ant-btn{border-top-left-radius:2px;border-bottom-left-radius:2px}.ant-btn-group-sm>.ant-btn:last-child:not(:first-child),.ant-btn-group-sm>span:last-child:not(:first-child)>.ant-btn{border-top-right-radius:2px;border-bottom-right-radius:2px}.ant-btn-group>.ant-btn-group{float:left}.ant-btn-group>.ant-btn-group:not(:first-child):not(:last-child)>.ant-btn{border-radius:0}.ant-btn-group>.ant-btn-group:first-child:not(:last-child)>.ant-btn:last-child{padding-right:8px;border-top-right-radius:0;border-bottom-right-radius:0}.ant-btn-group>.ant-btn-group:last-child:not(:first-child)>.ant-btn:first-child{padding-left:8px;border-top-left-radius:0;border-bottom-left-radius:0}.ant-btn-rtl.ant-btn-group .ant-btn+.ant-btn,.ant-btn-rtl.ant-btn+.ant-btn-group,.ant-btn-rtl.ant-btn-group span+.ant-btn,.ant-btn-rtl.ant-btn-group .ant-btn+span,.ant-btn-rtl.ant-btn-group>span+span,.ant-btn-rtl.ant-btn-group+.ant-btn,.ant-btn-rtl.ant-btn-group+.ant-btn-group,.ant-btn-group-rtl.ant-btn-group .ant-btn+.ant-btn,.ant-btn-group-rtl.ant-btn+.ant-btn-group,.ant-btn-group-rtl.ant-btn-group span+.ant-btn,.ant-btn-group-rtl.ant-btn-group .ant-btn+span,.ant-btn-group-rtl.ant-btn-group>span+span,.ant-btn-group-rtl.ant-btn-group+.ant-btn,.ant-btn-group-rtl.ant-btn-group+.ant-btn-group{margin-right:-1px;margin-left:auto}.ant-btn-group.ant-btn-group-rtl{direction:rtl}.ant-btn-group-rtl.ant-btn-group>.ant-btn:first-child:not(:last-child),.ant-btn-group-rtl.ant-btn-group>span:first-child:not(:last-child)>.ant-btn{border-radius:0 2px 2px 0}.ant-btn-group-rtl.ant-btn-group>.ant-btn:last-child:not(:first-child),.ant-btn-group-rtl.ant-btn-group>span:last-child:not(:first-child)>.ant-btn{border-radius:2px 0 0 2px}.ant-btn-group-rtl.ant-btn-group-sm>.ant-btn:first-child:not(:last-child),.ant-btn-group-rtl.ant-btn-group-sm>span:first-child:not(:last-child)>.ant-btn{border-radius:0 2px 2px 0}.ant-btn-group-rtl.ant-btn-group-sm>.ant-btn:last-child:not(:first-child),.ant-btn-group-rtl.ant-btn-group-sm>span:last-child:not(:first-child)>.ant-btn{border-radius:2px 0 0 2px}.ant-btn:focus>span,.ant-btn:active>span{position:relative}.ant-btn>.anticon+span,.ant-btn>span+.anticon{margin-left:8px}.ant-btn.ant-btn-background-ghost{color:#fff;border-color:#fff}.ant-btn.ant-btn-background-ghost,.ant-btn.ant-btn-background-ghost:hover,.ant-btn.ant-btn-background-ghost:active,.ant-btn.ant-btn-background-ghost:focus{background:transparent}.ant-btn.ant-btn-background-ghost:hover,.ant-btn.ant-btn-background-ghost:focus{color:#40a9ff;border-color:#40a9ff}.ant-btn.ant-btn-background-ghost:active{color:#096dd9;border-color:#096dd9}.ant-btn.ant-btn-background-ghost[disabled]{color:#00000040;background:transparent;border-color:#d9d9d9}.ant-btn-background-ghost.ant-btn-primary{color:#1890ff;border-color:#1890ff;text-shadow:none}.ant-btn-background-ghost.ant-btn-primary>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-primary>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-primary:hover,.ant-btn-background-ghost.ant-btn-primary:focus{color:#40a9ff;border-color:#40a9ff}.ant-btn-background-ghost.ant-btn-primary:hover>a:only-child,.ant-btn-background-ghost.ant-btn-primary:focus>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-primary:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-primary:active{color:#096dd9;border-color:#096dd9}.ant-btn-background-ghost.ant-btn-primary:active>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-primary:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-primary[disabled],.ant-btn-background-ghost.ant-btn-primary[disabled]:hover,.ant-btn-background-ghost.ant-btn-primary[disabled]:focus,.ant-btn-background-ghost.ant-btn-primary[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn-background-ghost.ant-btn-primary[disabled]>a:only-child,.ant-btn-background-ghost.ant-btn-primary[disabled]:hover>a:only-child,.ant-btn-background-ghost.ant-btn-primary[disabled]:focus>a:only-child,.ant-btn-background-ghost.ant-btn-primary[disabled]:active>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-primary[disabled]>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary[disabled]:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary[disabled]:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-danger{color:#ff4d4f;border-color:#ff4d4f;text-shadow:none}.ant-btn-background-ghost.ant-btn-danger>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-danger>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-danger:hover,.ant-btn-background-ghost.ant-btn-danger:focus{color:#ff7875;border-color:#ff7875}.ant-btn-background-ghost.ant-btn-danger:hover>a:only-child,.ant-btn-background-ghost.ant-btn-danger:focus>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-danger:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-danger:active{color:#d9363e;border-color:#d9363e}.ant-btn-background-ghost.ant-btn-danger:active>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-danger:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-danger[disabled],.ant-btn-background-ghost.ant-btn-danger[disabled]:hover,.ant-btn-background-ghost.ant-btn-danger[disabled]:focus,.ant-btn-background-ghost.ant-btn-danger[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn-background-ghost.ant-btn-danger[disabled]>a:only-child,.ant-btn-background-ghost.ant-btn-danger[disabled]:hover>a:only-child,.ant-btn-background-ghost.ant-btn-danger[disabled]:focus>a:only-child,.ant-btn-background-ghost.ant-btn-danger[disabled]:active>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-danger[disabled]>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger[disabled]:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger[disabled]:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-dangerous{color:#ff4d4f;border-color:#ff4d4f;text-shadow:none}.ant-btn-background-ghost.ant-btn-dangerous>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-dangerous:hover,.ant-btn-background-ghost.ant-btn-dangerous:focus{color:#ff7875;border-color:#ff7875}.ant-btn-background-ghost.ant-btn-dangerous:hover>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous:focus>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-dangerous:active{color:#d9363e;border-color:#d9363e}.ant-btn-background-ghost.ant-btn-dangerous:active>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-dangerous[disabled],.ant-btn-background-ghost.ant-btn-dangerous[disabled]:hover,.ant-btn-background-ghost.ant-btn-dangerous[disabled]:focus,.ant-btn-background-ghost.ant-btn-dangerous[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn-background-ghost.ant-btn-dangerous[disabled]>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous[disabled]:hover>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous[disabled]:focus>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous[disabled]:active>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous[disabled]>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous[disabled]:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous[disabled]:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link{color:#ff4d4f;border-color:transparent;text-shadow:none}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:hover,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:focus{color:#ff7875;border-color:transparent}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:hover>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:focus>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:focus>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:active{color:#d9363e;border-color:transparent}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:active>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled],.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:hover,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:focus,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:active{color:#00000040;border-color:#d9d9d9;background:#f5f5f5;text-shadow:none;box-shadow:none}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:hover>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:focus>a:only-child,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:active>a:only-child{color:currentcolor}.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-dangerous.ant-btn-link[disabled]:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}.ant-btn-two-chinese-chars:first-letter{letter-spacing:.34em}.ant-btn-two-chinese-chars>*:not(.anticon){margin-right:-.34em;letter-spacing:.34em}.ant-btn.ant-btn-block{width:100%}.ant-btn:empty{display:inline-block;width:0;visibility:hidden;content:"\\a0"}a.ant-btn{padding-top:.01px!important;line-height:30px}a.ant-btn-disabled{cursor:not-allowed}a.ant-btn-disabled>*{pointer-events:none}a.ant-btn-disabled,a.ant-btn-disabled:hover,a.ant-btn-disabled:focus,a.ant-btn-disabled:active{color:#00000040;border-color:transparent;background:transparent;text-shadow:none;box-shadow:none}a.ant-btn-disabled>a:only-child,a.ant-btn-disabled:hover>a:only-child,a.ant-btn-disabled:focus>a:only-child,a.ant-btn-disabled:active>a:only-child{color:currentcolor}a.ant-btn-disabled>a:only-child:after,a.ant-btn-disabled:hover>a:only-child:after,a.ant-btn-disabled:focus>a:only-child:after,a.ant-btn-disabled:active>a:only-child:after{position:absolute;inset:0;background:transparent;content:""}a.ant-btn-lg{line-height:38px}a.ant-btn-sm{line-height:22px}.ant-btn-compact-item:not(.ant-btn-compact-last-item):not(.ant-btn-compact-item-rtl){margin-right:-1px}.ant-btn-compact-item:not(.ant-btn-compact-last-item).ant-btn-compact-item-rtl{margin-left:-1px}.ant-btn-compact-item:hover,.ant-btn-compact-item:focus,.ant-btn-compact-item:active{z-index:2}.ant-btn-compact-item[disabled]{z-index:0}.ant-btn-compact-item:not(.ant-btn-compact-first-item):not(.ant-btn-compact-last-item).ant-btn{border-radius:0}.ant-btn-compact-item.ant-btn.ant-btn-compact-first-item:not(.ant-btn-compact-last-item):not(.ant-btn-compact-item-rtl){border-top-right-radius:0;border-bottom-right-radius:0}.ant-btn-compact-item.ant-btn.ant-btn-compact-last-item:not(.ant-btn-compact-first-item):not(.ant-btn-compact-item-rtl){border-top-left-radius:0;border-bottom-left-radius:0}.ant-btn-compact-item.ant-btn.ant-btn-compact-item-rtl.ant-btn-compact-first-item:not(.ant-btn-compact-last-item){border-top-left-radius:0;border-bottom-left-radius:0}.ant-btn-compact-item.ant-btn.ant-btn-compact-item-rtl.ant-btn-compact-last-item:not(.ant-btn-compact-first-item){border-top-right-radius:0;border-bottom-right-radius:0}.ant-btn-icon-only.ant-btn-compact-item{flex:none}.ant-btn-compact-item.ant-btn-primary:not([disabled])+.ant-btn-compact-item.ant-btn-primary:not([disabled]){position:relative}.ant-btn-compact-item.ant-btn-primary:not([disabled])+.ant-btn-compact-item.ant-btn-primary:not([disabled]):after{position:absolute;top:-1px;left:-1px;display:inline-block;width:1px;height:calc(100% + 2px);background-color:#40a9ff;content:" "}.ant-btn-compact-item-rtl.ant-btn-compact-first-item.ant-btn-compact-item-rtl:not(.ant-btn-compact-last-item){border-top-left-radius:0;border-bottom-left-radius:0}.ant-btn-compact-item-rtl.ant-btn-compact-last-item.ant-btn-compact-item-rtl:not(.ant-btn-compact-first-item){border-top-right-radius:0;border-bottom-right-radius:0}.ant-btn-compact-item-rtl.ant-btn-sm.ant-btn-compact-first-item.ant-btn-compact-item-rtl.ant-btn-sm:not(.ant-btn-compact-last-item){border-top-left-radius:0;border-bottom-left-radius:0}.ant-btn-compact-item-rtl.ant-btn-sm.ant-btn-compact-last-item.ant-btn-compact-item-rtl.ant-btn-sm:not(.ant-btn-compact-first-item){border-top-right-radius:0;border-bottom-right-radius:0}.ant-btn-compact-item-rtl.ant-btn-primary:not([disabled])+.ant-btn-compact-item-rtl.ant-btn-primary:not([disabled]):after{right:-1px}.ant-btn-compact-vertical-item:not(.ant-btn-compact-vertical-last-item){margin-bottom:-1px}.ant-btn-compact-vertical-item:hover,.ant-btn-compact-vertical-item:focus,.ant-btn-compact-vertical-item:active{z-index:2}.ant-btn-compact-vertical-item[disabled]{z-index:0}.ant-btn-compact-vertical-item:not(.ant-btn-compact-vertical-first-item):not(.ant-btn-compact-vertical-last-item){border-radius:0}.ant-btn-compact-vertical-item.ant-btn-compact-vertical-first-item:not(.ant-btn-compact-vertical-last-item){border-bottom-right-radius:0;border-bottom-left-radius:0}.ant-btn-compact-vertical-item.ant-btn-compact-vertical-last-item:not(.ant-btn-compact-vertical-first-item){border-top-left-radius:0;border-top-right-radius:0}.ant-btn-compact-vertical-item.ant-btn-primary:not([disabled])+.ant-btn-compact-vertical-item.ant-btn-primary:not([disabled]){position:relative}.ant-btn-compact-vertical-item.ant-btn-primary:not([disabled])+.ant-btn-compact-vertical-item.ant-btn-primary:not([disabled]):after{position:absolute;top:-1px;left:-1px;display:inline-block;width:calc(100% + 2px);height:1px;background-color:#40a9ff;content:" "}.ant-btn-rtl{direction:rtl}.ant-btn-group-rtl.ant-btn-group .ant-btn-primary:last-child:not(:first-child),.ant-btn-group-rtl.ant-btn-group .ant-btn-primary+.ant-btn-primary{border-right-color:#40a9ff;border-left-color:#d9d9d9}.ant-btn-group-rtl.ant-btn-group .ant-btn-primary:last-child:not(:first-child)[disabled],.ant-btn-group-rtl.ant-btn-group .ant-btn-primary+.ant-btn-primary[disabled]{border-right-color:#d9d9d9;border-left-color:#40a9ff}.ant-btn-rtl.ant-btn>.ant-btn-loading-icon .anticon{padding-right:0;padding-left:8px}.ant-btn-rtl.ant-btn>.anticon+span,.ant-btn-rtl.ant-btn>span+.anticon{margin-right:8px;margin-left:0}.ant-menu-item-danger.ant-menu-item,.ant-menu-item-danger.ant-menu-item:hover,.ant-menu-item-danger.ant-menu-item-active{color:#ff4d4f}.ant-menu-item-danger.ant-menu-item:active{background:#fff1f0}.ant-menu-item-danger.ant-menu-item-selected{color:#ff4d4f}.ant-menu-item-danger.ant-menu-item-selected>a,.ant-menu-item-danger.ant-menu-item-selected>a:hover{color:#ff4d4f}.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-danger.ant-menu-item-selected{background-color:#fff1f0}.ant-menu-inline .ant-menu-item-danger.ant-menu-item:after{border-right-color:#ff4d4f}.ant-menu-dark .ant-menu-item-danger.ant-menu-item,.ant-menu-dark .ant-menu-item-danger.ant-menu-item:hover,.ant-menu-dark .ant-menu-item-danger.ant-menu-item>a{color:#ff4d4f}.ant-menu-dark.ant-menu-dark:not(.ant-menu-horizontal) .ant-menu-item-danger.ant-menu-item-selected{color:#fff;background-color:#ff4d4f}.ant-menu{box-sizing:border-box;margin:0;font-variant:tabular-nums;line-height:1.5715;font-feature-settings:"tnum";padding:0;color:#000000d9;font-size:14px;line-height:0;text-align:left;list-style:none;background:#fff;outline:none;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d;transition:background .3s,width .3s cubic-bezier(.2,0,0,1) 0s}.ant-menu:before{display:table;content:""}.ant-menu:after{display:table;clear:both;content:""}.ant-menu.ant-menu-root:focus-visible{box-shadow:0 0 0 2px #bae7ff}.ant-menu ul,.ant-menu ol{margin:0;padding:0;list-style:none}.ant-menu-overflow{display:flex}.ant-menu-overflow-item{flex:none}.ant-menu-hidden,.ant-menu-submenu-hidden{display:none}.ant-menu-item-group-title{height:1.5715;padding:8px 16px;color:#00000073;font-size:14px;line-height:1.5715;transition:all .3s}.ant-menu-horizontal .ant-menu-submenu{transition:border-color .3s cubic-bezier(.645,.045,.355,1),background .3s cubic-bezier(.645,.045,.355,1)}.ant-menu-submenu,.ant-menu-submenu-inline{transition:border-color .3s cubic-bezier(.645,.045,.355,1),background .3s cubic-bezier(.645,.045,.355,1),padding .15s cubic-bezier(.645,.045,.355,1)}.ant-menu-submenu-selected{color:#1890ff}.ant-menu-item:active,.ant-menu-submenu-title:active{background:#e6f7ff}.ant-menu-submenu .ant-menu-sub{cursor:initial;transition:background .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1)}.ant-menu-title-content{transition:color .3s}.ant-menu-item a{color:#000000d9}.ant-menu-item a:hover{color:#1890ff}.ant-menu-item a:before{position:absolute;inset:0;background-color:transparent;content:""}.ant-menu-item>.ant-badge a{color:#000000d9}.ant-menu-item>.ant-badge a:hover{color:#1890ff}.ant-menu-item-divider{overflow:hidden;line-height:0;border-color:#f0f0f0;border-style:solid;border-width:1px 0 0}.ant-menu-item-divider-dashed{border-style:dashed}.ant-menu-horizontal .ant-menu-item,.ant-menu-horizontal .ant-menu-submenu{margin-top:-1px}.ant-menu-horizontal>.ant-menu-item:hover,.ant-menu-horizontal>.ant-menu-item-active,.ant-menu-horizontal>.ant-menu-submenu .ant-menu-submenu-title:hover{background-color:transparent}.ant-menu-item-selected,.ant-menu-item-selected a,.ant-menu-item-selected a:hover{color:#1890ff}.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected{background-color:#e6f7ff}.ant-menu-inline,.ant-menu-vertical,.ant-menu-vertical-left{border-right:1px solid #f0f0f0}.ant-menu-vertical-right{border-left:1px solid #f0f0f0}.ant-menu-vertical.ant-menu-sub,.ant-menu-vertical-left.ant-menu-sub,.ant-menu-vertical-right.ant-menu-sub{min-width:160px;max-height:calc(100vh - 100px);padding:0;overflow:hidden;border-right:0}.ant-menu-vertical.ant-menu-sub:not([class*="-active"]),.ant-menu-vertical-left.ant-menu-sub:not([class*="-active"]),.ant-menu-vertical-right.ant-menu-sub:not([class*="-active"]){overflow-x:hidden;overflow-y:auto}.ant-menu-vertical.ant-menu-sub .ant-menu-item,.ant-menu-vertical-left.ant-menu-sub .ant-menu-item,.ant-menu-vertical-right.ant-menu-sub .ant-menu-item{left:0;margin-left:0;border-right:0}.ant-menu-vertical.ant-menu-sub .ant-menu-item:after,.ant-menu-vertical-left.ant-menu-sub .ant-menu-item:after,.ant-menu-vertical-right.ant-menu-sub .ant-menu-item:after{border-right:0}.ant-menu-vertical.ant-menu-sub>.ant-menu-item,.ant-menu-vertical-left.ant-menu-sub>.ant-menu-item,.ant-menu-vertical-right.ant-menu-sub>.ant-menu-item,.ant-menu-vertical.ant-menu-sub>.ant-menu-submenu,.ant-menu-vertical-left.ant-menu-sub>.ant-menu-submenu,.ant-menu-vertical-right.ant-menu-sub>.ant-menu-submenu{transform-origin:0 0}.ant-menu-horizontal.ant-menu-sub{min-width:114px}.ant-menu-horizontal .ant-menu-item,.ant-menu-horizontal .ant-menu-submenu-title{transition:border-color .3s,background .3s}.ant-menu-item,.ant-menu-submenu-title{position:relative;display:block;margin:0;padding:0 20px;white-space:nowrap;cursor:pointer;transition:border-color .3s,background .3s,padding .3s cubic-bezier(.645,.045,.355,1)}.ant-menu-item .ant-menu-item-icon,.ant-menu-submenu-title .ant-menu-item-icon,.ant-menu-item .anticon,.ant-menu-submenu-title .anticon{min-width:14px;font-size:14px;transition:font-size .15s cubic-bezier(.215,.61,.355,1),margin .3s cubic-bezier(.645,.045,.355,1),color .3s}.ant-menu-item .ant-menu-item-icon+span,.ant-menu-submenu-title .ant-menu-item-icon+span,.ant-menu-item .anticon+span,.ant-menu-submenu-title .anticon+span{margin-left:10px;opacity:1;transition:opacity .3s cubic-bezier(.645,.045,.355,1),margin .3s,color .3s}.ant-menu-item .ant-menu-item-icon.svg,.ant-menu-submenu-title .ant-menu-item-icon.svg{vertical-align:-.125em}.ant-menu-item.ant-menu-item-only-child>.anticon,.ant-menu-submenu-title.ant-menu-item-only-child>.anticon,.ant-menu-item.ant-menu-item-only-child>.ant-menu-item-icon,.ant-menu-submenu-title.ant-menu-item-only-child>.ant-menu-item-icon{margin-right:0}.ant-menu-item:not(.ant-menu-item-disabled):focus-visible,.ant-menu-submenu-title:not(.ant-menu-item-disabled):focus-visible{box-shadow:0 0 0 2px #bae7ff}.ant-menu>.ant-menu-item-divider{margin:1px 0;padding:0}.ant-menu-submenu-popup{position:absolute;z-index:1050;background:transparent;border-radius:2px;box-shadow:none;transform-origin:0 0}.ant-menu-submenu-popup:before{position:absolute;inset:-7px 0 0;z-index:-1;width:100%;height:100%;opacity:.0001;content:" "}.ant-menu-submenu-placement-rightTop:before{top:0;left:-7px}.ant-menu-submenu>.ant-menu{background-color:#fff;border-radius:2px}.ant-menu-submenu>.ant-menu-submenu-title:after{transition:transform .3s cubic-bezier(.645,.045,.355,1)}.ant-menu-submenu-popup>.ant-menu{background-color:#fff}.ant-menu-submenu-expand-icon,.ant-menu-submenu-arrow{position:absolute;top:50%;right:16px;width:10px;color:#000000d9;transform:translateY(-50%);transition:transform .3s cubic-bezier(.645,.045,.355,1)}.ant-menu-submenu-arrow:before,.ant-menu-submenu-arrow:after{position:absolute;width:6px;height:1.5px;background-color:currentcolor;border-radius:2px;transition:background .3s cubic-bezier(.645,.045,.355,1),transform .3s cubic-bezier(.645,.045,.355,1),top .3s cubic-bezier(.645,.045,.355,1),color .3s cubic-bezier(.645,.045,.355,1);content:""}.ant-menu-submenu-arrow:before{transform:rotate(45deg) translateY(-2.5px)}.ant-menu-submenu-arrow:after{transform:rotate(-45deg) translateY(2.5px)}.ant-menu-submenu:hover>.ant-menu-submenu-title>.ant-menu-submenu-expand-icon,.ant-menu-submenu:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow{color:#1890ff}.ant-menu-inline-collapsed .ant-menu-submenu-arrow:before,.ant-menu-submenu-inline .ant-menu-submenu-arrow:before{transform:rotate(-45deg) translate(2.5px)}.ant-menu-inline-collapsed .ant-menu-submenu-arrow:after,.ant-menu-submenu-inline .ant-menu-submenu-arrow:after{transform:rotate(45deg) translate(-2.5px)}.ant-menu-submenu-horizontal .ant-menu-submenu-arrow{display:none}.ant-menu-submenu-open.ant-menu-submenu-inline>.ant-menu-submenu-title>.ant-menu-submenu-arrow{transform:translateY(-2px)}.ant-menu-submenu-open.ant-menu-submenu-inline>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after{transform:rotate(-45deg) translate(-2.5px)}.ant-menu-submenu-open.ant-menu-submenu-inline>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before{transform:rotate(45deg) translate(2.5px)}.ant-menu-vertical .ant-menu-submenu-selected,.ant-menu-vertical-left .ant-menu-submenu-selected,.ant-menu-vertical-right .ant-menu-submenu-selected{color:#1890ff}.ant-menu-horizontal{line-height:46px;border:0;border-bottom:1px solid #f0f0f0;box-shadow:none}.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu{margin-top:-1px;margin-bottom:0;padding:0 20px}.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item:hover,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu:hover,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item-active,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu-active,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item-open,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu-open,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item-selected,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu-selected{color:#1890ff}.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item:hover:after,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu:hover:after,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item-active:after,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu-active:after,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item-open:after,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu-open:after,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-item-selected:after,.ant-menu-horizontal:not(.ant-menu-dark)>.ant-menu-submenu-selected:after{border-bottom:2px solid #1890ff}.ant-menu-horizontal>.ant-menu-item,.ant-menu-horizontal>.ant-menu-submenu{position:relative;top:1px;display:inline-block;vertical-align:bottom}.ant-menu-horizontal>.ant-menu-item:after,.ant-menu-horizontal>.ant-menu-submenu:after{position:absolute;right:20px;bottom:0;left:20px;border-bottom:2px solid transparent;transition:border-color .3s cubic-bezier(.645,.045,.355,1);content:""}.ant-menu-horizontal>.ant-menu-submenu>.ant-menu-submenu-title{padding:0}.ant-menu-horizontal>.ant-menu-item a{color:#000000d9}.ant-menu-horizontal>.ant-menu-item a:hover{color:#1890ff}.ant-menu-horizontal>.ant-menu-item a:before{bottom:-2px}.ant-menu-horizontal>.ant-menu-item-selected a{color:#1890ff}.ant-menu-horizontal:after{display:block;clear:both;height:0;content:" "}.ant-menu-vertical .ant-menu-item,.ant-menu-vertical-left .ant-menu-item,.ant-menu-vertical-right .ant-menu-item,.ant-menu-inline .ant-menu-item{position:relative}.ant-menu-vertical .ant-menu-item:after,.ant-menu-vertical-left .ant-menu-item:after,.ant-menu-vertical-right .ant-menu-item:after,.ant-menu-inline .ant-menu-item:after{position:absolute;top:0;right:0;bottom:0;border-right:3px solid #1890ff;transform:scaleY(.0001);opacity:0;transition:transform .15s cubic-bezier(.215,.61,.355,1),opacity .15s cubic-bezier(.215,.61,.355,1);content:""}.ant-menu-vertical .ant-menu-item,.ant-menu-vertical-left .ant-menu-item,.ant-menu-vertical-right .ant-menu-item,.ant-menu-inline .ant-menu-item,.ant-menu-vertical .ant-menu-submenu-title,.ant-menu-vertical-left .ant-menu-submenu-title,.ant-menu-vertical-right .ant-menu-submenu-title,.ant-menu-inline .ant-menu-submenu-title{height:40px;margin-top:4px;margin-bottom:4px;padding:0 16px;overflow:hidden;line-height:40px;text-overflow:ellipsis}.ant-menu-vertical .ant-menu-submenu,.ant-menu-vertical-left .ant-menu-submenu,.ant-menu-vertical-right .ant-menu-submenu,.ant-menu-inline .ant-menu-submenu{padding-bottom:.02px}.ant-menu-vertical .ant-menu-item:not(:last-child),.ant-menu-vertical-left .ant-menu-item:not(:last-child),.ant-menu-vertical-right .ant-menu-item:not(:last-child),.ant-menu-inline .ant-menu-item:not(:last-child){margin-bottom:8px}.ant-menu-vertical>.ant-menu-item,.ant-menu-vertical-left>.ant-menu-item,.ant-menu-vertical-right>.ant-menu-item,.ant-menu-inline>.ant-menu-item,.ant-menu-vertical>.ant-menu-submenu>.ant-menu-submenu-title,.ant-menu-vertical-left>.ant-menu-submenu>.ant-menu-submenu-title,.ant-menu-vertical-right>.ant-menu-submenu>.ant-menu-submenu-title,.ant-menu-inline>.ant-menu-submenu>.ant-menu-submenu-title{height:40px;line-height:40px}.ant-menu-vertical .ant-menu-item-group-list .ant-menu-submenu-title,.ant-menu-vertical .ant-menu-submenu-title{padding-right:34px}.ant-menu-inline{width:100%}.ant-menu-inline .ant-menu-selected:after,.ant-menu-inline .ant-menu-item-selected:after{transform:scaleY(1);opacity:1;transition:transform .15s cubic-bezier(.645,.045,.355,1),opacity .15s cubic-bezier(.645,.045,.355,1)}.ant-menu-inline .ant-menu-item,.ant-menu-inline .ant-menu-submenu-title{width:calc(100% + 1px)}.ant-menu-inline .ant-menu-item-group-list .ant-menu-submenu-title,.ant-menu-inline .ant-menu-submenu-title{padding-right:34px}.ant-menu-inline.ant-menu-root .ant-menu-item,.ant-menu-inline.ant-menu-root .ant-menu-submenu-title{display:flex;align-items:center;transition:border-color .3s,background .3s,padding .1s cubic-bezier(.215,.61,.355,1)}.ant-menu-inline.ant-menu-root .ant-menu-item>.ant-menu-title-content,.ant-menu-inline.ant-menu-root .ant-menu-submenu-title>.ant-menu-title-content{flex:auto;min-width:0;overflow:hidden;text-overflow:ellipsis}.ant-menu-inline.ant-menu-root .ant-menu-item>*,.ant-menu-inline.ant-menu-root .ant-menu-submenu-title>*{flex:none}.ant-menu.ant-menu-inline-collapsed{width:80px}.ant-menu.ant-menu-inline-collapsed>.ant-menu-item,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title,.ant-menu.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title{left:0;padding:0 calc(50% - 8px);text-overflow:clip}.ant-menu.ant-menu-inline-collapsed>.ant-menu-item .ant-menu-submenu-arrow,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item .ant-menu-submenu-arrow,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title .ant-menu-submenu-arrow{opacity:0}.ant-menu.ant-menu-inline-collapsed>.ant-menu-item .ant-menu-item-icon,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item .ant-menu-item-icon,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title .ant-menu-item-icon,.ant-menu.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title .ant-menu-item-icon,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item .anticon,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item .anticon,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title .anticon,.ant-menu.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title .anticon{margin:0;font-size:16px;line-height:40px}.ant-menu.ant-menu-inline-collapsed>.ant-menu-item .ant-menu-item-icon+span,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item .ant-menu-item-icon+span,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title .ant-menu-item-icon+span,.ant-menu.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title .ant-menu-item-icon+span,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item .anticon+span,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item .anticon+span,.ant-menu.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title .anticon+span,.ant-menu.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title .anticon+span{display:inline-block;opacity:0}.ant-menu.ant-menu-inline-collapsed .ant-menu-item-icon,.ant-menu.ant-menu-inline-collapsed .anticon{display:inline-block}.ant-menu.ant-menu-inline-collapsed-tooltip{pointer-events:none}.ant-menu.ant-menu-inline-collapsed-tooltip .ant-menu-item-icon,.ant-menu.ant-menu-inline-collapsed-tooltip .anticon{display:none}.ant-menu.ant-menu-inline-collapsed-tooltip a{color:#ffffffd9}.ant-menu.ant-menu-inline-collapsed .ant-menu-item-group-title{padding-right:4px;padding-left:4px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-menu-item-group-list{margin:0;padding:0}.ant-menu-item-group-list .ant-menu-item,.ant-menu-item-group-list .ant-menu-submenu-title{padding:0 16px 0 28px}.ant-menu-root.ant-menu-vertical,.ant-menu-root.ant-menu-vertical-left,.ant-menu-root.ant-menu-vertical-right,.ant-menu-root.ant-menu-inline{box-shadow:none}.ant-menu-root.ant-menu-inline-collapsed .ant-menu-item>.ant-menu-inline-collapsed-noicon,.ant-menu-root.ant-menu-inline-collapsed .ant-menu-submenu .ant-menu-submenu-title>.ant-menu-inline-collapsed-noicon{font-size:16px;text-align:center}.ant-menu-sub.ant-menu-inline{padding:0;background:#fafafa;border:0;border-radius:0;box-shadow:none}.ant-menu-sub.ant-menu-inline>.ant-menu-item,.ant-menu-sub.ant-menu-inline>.ant-menu-submenu>.ant-menu-submenu-title{height:40px;line-height:40px;list-style-position:inside;list-style-type:disc}.ant-menu-sub.ant-menu-inline .ant-menu-item-group-title{padding-left:32px}.ant-menu-item-disabled,.ant-menu-submenu-disabled{color:#00000040!important;background:none;cursor:not-allowed}.ant-menu-item-disabled:after,.ant-menu-submenu-disabled:after{border-color:transparent!important}.ant-menu-item-disabled a,.ant-menu-submenu-disabled a{color:#00000040!important;pointer-events:none}.ant-menu-item-disabled>.ant-menu-submenu-title,.ant-menu-submenu-disabled>.ant-menu-submenu-title{color:#00000040!important;cursor:not-allowed}.ant-menu-item-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-submenu-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-item-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-submenu-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after{background:rgba(0,0,0,.25)!important}.ant-layout-header .ant-menu{line-height:inherit}.ant-menu-inline-collapsed-tooltip a,.ant-menu-inline-collapsed-tooltip a:hover{color:#fff}.ant-menu-light .ant-menu-item:hover,.ant-menu-light .ant-menu-item-active,.ant-menu-light .ant-menu:not(.ant-menu-inline) .ant-menu-submenu-open,.ant-menu-light .ant-menu-submenu-active,.ant-menu-light .ant-menu-submenu-title:hover{color:#1890ff}.ant-menu.ant-menu-root:focus-visible{box-shadow:0 0 0 2px #096dd9}.ant-menu-dark .ant-menu-item:focus-visible,.ant-menu-dark .ant-menu-submenu-title:focus-visible{box-shadow:0 0 0 2px #096dd9}.ant-menu.ant-menu-dark,.ant-menu-dark .ant-menu-sub,.ant-menu.ant-menu-dark .ant-menu-sub{color:#ffffffa6;background:#001529}.ant-menu.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow{opacity:.45;transition:all .3s}.ant-menu.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:before{background:#fff}.ant-menu-dark.ant-menu-submenu-popup{background:transparent}.ant-menu-dark .ant-menu-inline.ant-menu-sub{background:#000c17}.ant-menu-dark.ant-menu-horizontal{border-bottom:0}.ant-menu-dark.ant-menu-horizontal>.ant-menu-item,.ant-menu-dark.ant-menu-horizontal>.ant-menu-submenu{top:0;margin-top:0;padding:0 20px;border-color:#001529;border-bottom:0}.ant-menu-dark.ant-menu-horizontal>.ant-menu-item:hover{background-color:#1890ff}.ant-menu-dark.ant-menu-horizontal>.ant-menu-item>a:before{bottom:0}.ant-menu-dark .ant-menu-item,.ant-menu-dark .ant-menu-item-group-title,.ant-menu-dark .ant-menu-item>a,.ant-menu-dark .ant-menu-item>span>a{color:#ffffffa6}.ant-menu-dark.ant-menu-inline,.ant-menu-dark.ant-menu-vertical,.ant-menu-dark.ant-menu-vertical-left,.ant-menu-dark.ant-menu-vertical-right{border-right:0}.ant-menu-dark.ant-menu-inline .ant-menu-item,.ant-menu-dark.ant-menu-vertical .ant-menu-item,.ant-menu-dark.ant-menu-vertical-left .ant-menu-item,.ant-menu-dark.ant-menu-vertical-right .ant-menu-item{left:0;margin-left:0;border-right:0}.ant-menu-dark.ant-menu-inline .ant-menu-item:after,.ant-menu-dark.ant-menu-vertical .ant-menu-item:after,.ant-menu-dark.ant-menu-vertical-left .ant-menu-item:after,.ant-menu-dark.ant-menu-vertical-right .ant-menu-item:after{border-right:0}.ant-menu-dark.ant-menu-inline .ant-menu-item,.ant-menu-dark.ant-menu-inline .ant-menu-submenu-title{width:100%}.ant-menu-dark .ant-menu-item:hover,.ant-menu-dark .ant-menu-item-active,.ant-menu-dark .ant-menu-submenu-active,.ant-menu-dark .ant-menu-submenu-open,.ant-menu-dark .ant-menu-submenu-selected,.ant-menu-dark .ant-menu-submenu-title:hover{color:#fff;background-color:transparent}.ant-menu-dark .ant-menu-item:hover>a,.ant-menu-dark .ant-menu-item-active>a,.ant-menu-dark .ant-menu-submenu-active>a,.ant-menu-dark .ant-menu-submenu-open>a,.ant-menu-dark .ant-menu-submenu-selected>a,.ant-menu-dark .ant-menu-submenu-title:hover>a,.ant-menu-dark .ant-menu-item:hover>span>a,.ant-menu-dark .ant-menu-item-active>span>a,.ant-menu-dark .ant-menu-submenu-active>span>a,.ant-menu-dark .ant-menu-submenu-open>span>a,.ant-menu-dark .ant-menu-submenu-selected>span>a,.ant-menu-dark .ant-menu-submenu-title:hover>span>a{color:#fff}.ant-menu-dark .ant-menu-item:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-item-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-open>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-selected>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-title:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow{opacity:1}.ant-menu-dark .ant-menu-item:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-item-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-open>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-selected>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-title:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-item:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-item-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-open>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-selected>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-title:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before{background:#fff}.ant-menu-dark .ant-menu-item:hover{background-color:transparent}.ant-menu-dark.ant-menu-dark:not(.ant-menu-horizontal) .ant-menu-item-selected{background-color:#1890ff}.ant-menu-dark .ant-menu-item-selected{color:#fff;border-right:0}.ant-menu-dark .ant-menu-item-selected:after{border-right:0}.ant-menu-dark .ant-menu-item-selected>a,.ant-menu-dark .ant-menu-item-selected>span>a,.ant-menu-dark .ant-menu-item-selected>a:hover,.ant-menu-dark .ant-menu-item-selected>span>a:hover{color:#fff}.ant-menu-dark .ant-menu-item-selected .ant-menu-item-icon,.ant-menu-dark .ant-menu-item-selected .anticon{color:#fff}.ant-menu-dark .ant-menu-item-selected .ant-menu-item-icon+span,.ant-menu-dark .ant-menu-item-selected .anticon+span{color:#fff}.ant-menu.ant-menu-dark .ant-menu-item-selected,.ant-menu-submenu-popup.ant-menu-dark .ant-menu-item-selected{background-color:#1890ff}.ant-menu-dark .ant-menu-item-disabled,.ant-menu-dark .ant-menu-submenu-disabled,.ant-menu-dark .ant-menu-item-disabled>a,.ant-menu-dark .ant-menu-submenu-disabled>a,.ant-menu-dark .ant-menu-item-disabled>span>a,.ant-menu-dark .ant-menu-submenu-disabled>span>a{color:#ffffff59!important;opacity:.8}.ant-menu-dark .ant-menu-item-disabled>.ant-menu-submenu-title,.ant-menu-dark .ant-menu-submenu-disabled>.ant-menu-submenu-title{color:#ffffff59!important}.ant-menu-dark .ant-menu-item-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-item-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after{background:rgba(255,255,255,.35)!important}.ant-menu.ant-menu-rtl{direction:rtl;text-align:right}.ant-menu-rtl .ant-menu-item-group-title{text-align:right}.ant-menu-rtl.ant-menu-inline,.ant-menu-rtl.ant-menu-vertical{border-right:none;border-left:1px solid #f0f0f0}.ant-menu-rtl.ant-menu-dark.ant-menu-inline,.ant-menu-rtl.ant-menu-dark.ant-menu-vertical{border-left:none}.ant-menu-rtl.ant-menu-vertical.ant-menu-sub>.ant-menu-item,.ant-menu-rtl.ant-menu-vertical-left.ant-menu-sub>.ant-menu-item,.ant-menu-rtl.ant-menu-vertical-right.ant-menu-sub>.ant-menu-item,.ant-menu-rtl.ant-menu-vertical.ant-menu-sub>.ant-menu-submenu,.ant-menu-rtl.ant-menu-vertical-left.ant-menu-sub>.ant-menu-submenu,.ant-menu-rtl.ant-menu-vertical-right.ant-menu-sub>.ant-menu-submenu{transform-origin:top right}.ant-menu-rtl .ant-menu-item .ant-menu-item-icon,.ant-menu-rtl .ant-menu-submenu-title .ant-menu-item-icon,.ant-menu-rtl .ant-menu-item .anticon,.ant-menu-rtl .ant-menu-submenu-title .anticon{margin-right:auto;margin-left:10px}.ant-menu-rtl .ant-menu-item.ant-menu-item-only-child>.ant-menu-item-icon,.ant-menu-rtl .ant-menu-submenu-title.ant-menu-item-only-child>.ant-menu-item-icon,.ant-menu-rtl .ant-menu-item.ant-menu-item-only-child>.anticon,.ant-menu-rtl .ant-menu-submenu-title.ant-menu-item-only-child>.anticon{margin-left:0}.ant-menu-submenu-rtl.ant-menu-submenu-popup{transform-origin:100% 0}.ant-menu-rtl .ant-menu-submenu-vertical>.ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu-rtl .ant-menu-submenu-vertical-left>.ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu-rtl .ant-menu-submenu-vertical-right>.ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu-rtl .ant-menu-submenu-inline>.ant-menu-submenu-title .ant-menu-submenu-arrow{right:auto;left:16px}.ant-menu-rtl .ant-menu-submenu-vertical>.ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu-rtl .ant-menu-submenu-vertical-left>.ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu-rtl .ant-menu-submenu-vertical-right>.ant-menu-submenu-title .ant-menu-submenu-arrow:before{transform:rotate(-45deg) translateY(-2px)}.ant-menu-rtl .ant-menu-submenu-vertical>.ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-rtl .ant-menu-submenu-vertical-left>.ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-rtl .ant-menu-submenu-vertical-right>.ant-menu-submenu-title .ant-menu-submenu-arrow:after{transform:rotate(45deg) translateY(2px)}.ant-menu-rtl.ant-menu-vertical .ant-menu-item:after,.ant-menu-rtl.ant-menu-vertical-left .ant-menu-item:after,.ant-menu-rtl.ant-menu-vertical-right .ant-menu-item:after,.ant-menu-rtl.ant-menu-inline .ant-menu-item:after{right:auto;left:0}.ant-menu-rtl.ant-menu-vertical .ant-menu-item,.ant-menu-rtl.ant-menu-vertical-left .ant-menu-item,.ant-menu-rtl.ant-menu-vertical-right .ant-menu-item,.ant-menu-rtl.ant-menu-inline .ant-menu-item,.ant-menu-rtl.ant-menu-vertical .ant-menu-submenu-title,.ant-menu-rtl.ant-menu-vertical-left .ant-menu-submenu-title,.ant-menu-rtl.ant-menu-vertical-right .ant-menu-submenu-title,.ant-menu-rtl.ant-menu-inline .ant-menu-submenu-title{text-align:right}.ant-menu-rtl.ant-menu-inline .ant-menu-submenu-title{padding-right:0;padding-left:34px}.ant-menu-rtl.ant-menu-vertical .ant-menu-submenu-title{padding-right:16px;padding-left:34px}.ant-menu-rtl.ant-menu-inline-collapsed.ant-menu-vertical .ant-menu-submenu-title{padding:0 calc(50% - 8px)}.ant-menu-rtl .ant-menu-item-group-list .ant-menu-item,.ant-menu-rtl .ant-menu-item-group-list .ant-menu-submenu-title{padding:0 28px 0 16px}.ant-menu-sub.ant-menu-inline{border:0}.ant-menu-rtl.ant-menu-sub.ant-menu-inline .ant-menu-item-group-title{padding-right:32px;padding-left:0}.ant-tooltip{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:absolute;z-index:1070;display:block;width:-moz-max-content;width:max-content;width:intrinsic;max-width:250px;visibility:visible}.ant-tooltip-content{position:relative}.ant-tooltip-hidden{display:none}.ant-tooltip-placement-top,.ant-tooltip-placement-topLeft,.ant-tooltip-placement-topRight{padding-bottom:14.3137085px}.ant-tooltip-placement-right,.ant-tooltip-placement-rightTop,.ant-tooltip-placement-rightBottom{padding-left:14.3137085px}.ant-tooltip-placement-bottom,.ant-tooltip-placement-bottomLeft,.ant-tooltip-placement-bottomRight{padding-top:14.3137085px}.ant-tooltip-placement-left,.ant-tooltip-placement-leftTop,.ant-tooltip-placement-leftBottom{padding-right:14.3137085px}.ant-tooltip-inner{min-width:30px;min-height:32px;padding:6px 8px;color:#fff;text-align:left;text-decoration:none;word-wrap:break-word;background-color:#000000bf;border-radius:2px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d}.ant-tooltip-arrow{position:absolute;z-index:2;display:block;width:22px;height:22px;overflow:hidden;background:transparent;pointer-events:none}.ant-tooltip-arrow-content{--antd-arrow-background-color: linear-gradient(to right bottom, rgba(0, 0, 0, .65), rgba(0, 0, 0, .75));position:absolute;inset:0;display:block;width:11.3137085px;height:11.3137085px;margin:auto;content:"";pointer-events:auto;border-radius:0 0 2px;pointer-events:none}.ant-tooltip-arrow-content:before{position:absolute;top:-11.3137085px;left:-11.3137085px;width:33.9411255px;height:33.9411255px;background:var(--antd-arrow-background-color);background-repeat:no-repeat;background-position:-10px -10px;content:"";-webkit-clip-path:inset(33% 33%);clip-path:inset(33% 33%);-webkit-clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z");clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z")}.ant-tooltip-placement-top .ant-tooltip-arrow,.ant-tooltip-placement-topLeft .ant-tooltip-arrow,.ant-tooltip-placement-topRight .ant-tooltip-arrow{bottom:0;transform:translateY(100%)}.ant-tooltip-placement-top .ant-tooltip-arrow-content,.ant-tooltip-placement-topLeft .ant-tooltip-arrow-content,.ant-tooltip-placement-topRight .ant-tooltip-arrow-content{box-shadow:3px 3px 7px #00000012;transform:translateY(-11px) rotate(45deg)}.ant-tooltip-placement-top .ant-tooltip-arrow{left:50%;transform:translateY(100%) translate(-50%)}.ant-tooltip-placement-topLeft .ant-tooltip-arrow{left:13px}.ant-tooltip-placement-topRight .ant-tooltip-arrow{right:13px}.ant-tooltip-placement-right .ant-tooltip-arrow,.ant-tooltip-placement-rightTop .ant-tooltip-arrow,.ant-tooltip-placement-rightBottom .ant-tooltip-arrow{left:0;transform:translate(-100%)}.ant-tooltip-placement-right .ant-tooltip-arrow-content,.ant-tooltip-placement-rightTop .ant-tooltip-arrow-content,.ant-tooltip-placement-rightBottom .ant-tooltip-arrow-content{box-shadow:-3px 3px 7px #00000012;transform:translate(11px) rotate(135deg)}.ant-tooltip-placement-right .ant-tooltip-arrow{top:50%;transform:translate(-100%) translateY(-50%)}.ant-tooltip-placement-rightTop .ant-tooltip-arrow{top:5px}.ant-tooltip-placement-rightBottom .ant-tooltip-arrow{bottom:5px}.ant-tooltip-placement-left .ant-tooltip-arrow,.ant-tooltip-placement-leftTop .ant-tooltip-arrow,.ant-tooltip-placement-leftBottom .ant-tooltip-arrow{right:0;transform:translate(100%)}.ant-tooltip-placement-left .ant-tooltip-arrow-content,.ant-tooltip-placement-leftTop .ant-tooltip-arrow-content,.ant-tooltip-placement-leftBottom .ant-tooltip-arrow-content{box-shadow:3px -3px 7px #00000012;transform:translate(-11px) rotate(315deg)}.ant-tooltip-placement-left .ant-tooltip-arrow{top:50%;transform:translate(100%) translateY(-50%)}.ant-tooltip-placement-leftTop .ant-tooltip-arrow{top:5px}.ant-tooltip-placement-leftBottom .ant-tooltip-arrow{bottom:5px}.ant-tooltip-placement-bottom .ant-tooltip-arrow,.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow,.ant-tooltip-placement-bottomRight .ant-tooltip-arrow{top:0;transform:translateY(-100%)}.ant-tooltip-placement-bottom .ant-tooltip-arrow-content,.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow-content,.ant-tooltip-placement-bottomRight .ant-tooltip-arrow-content{box-shadow:-3px -3px 7px #00000012;transform:translateY(11px) rotate(225deg)}.ant-tooltip-placement-bottom .ant-tooltip-arrow{left:50%;transform:translateY(-100%) translate(-50%)}.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow{left:13px}.ant-tooltip-placement-bottomRight .ant-tooltip-arrow{right:13px}.ant-tooltip-pink .ant-tooltip-inner{background-color:#eb2f96}.ant-tooltip-pink .ant-tooltip-arrow-content:before{background:#eb2f96}.ant-tooltip-magenta .ant-tooltip-inner{background-color:#eb2f96}.ant-tooltip-magenta .ant-tooltip-arrow-content:before{background:#eb2f96}.ant-tooltip-red .ant-tooltip-inner{background-color:#f5222d}.ant-tooltip-red .ant-tooltip-arrow-content:before{background:#f5222d}.ant-tooltip-volcano .ant-tooltip-inner{background-color:#fa541c}.ant-tooltip-volcano .ant-tooltip-arrow-content:before{background:#fa541c}.ant-tooltip-orange .ant-tooltip-inner{background-color:#fa8c16}.ant-tooltip-orange .ant-tooltip-arrow-content:before{background:#fa8c16}.ant-tooltip-yellow .ant-tooltip-inner{background-color:#fadb14}.ant-tooltip-yellow .ant-tooltip-arrow-content:before{background:#fadb14}.ant-tooltip-gold .ant-tooltip-inner{background-color:#faad14}.ant-tooltip-gold .ant-tooltip-arrow-content:before{background:#faad14}.ant-tooltip-cyan .ant-tooltip-inner{background-color:#13c2c2}.ant-tooltip-cyan .ant-tooltip-arrow-content:before{background:#13c2c2}.ant-tooltip-lime .ant-tooltip-inner{background-color:#a0d911}.ant-tooltip-lime .ant-tooltip-arrow-content:before{background:#a0d911}.ant-tooltip-green .ant-tooltip-inner{background-color:#52c41a}.ant-tooltip-green .ant-tooltip-arrow-content:before{background:#52c41a}.ant-tooltip-blue .ant-tooltip-inner{background-color:#1890ff}.ant-tooltip-blue .ant-tooltip-arrow-content:before{background:#1890ff}.ant-tooltip-geekblue .ant-tooltip-inner{background-color:#2f54eb}.ant-tooltip-geekblue .ant-tooltip-arrow-content:before{background:#2f54eb}.ant-tooltip-purple .ant-tooltip-inner{background-color:#722ed1}.ant-tooltip-purple .ant-tooltip-arrow-content:before{background:#722ed1}.ant-tooltip-rtl{direction:rtl}.ant-tooltip-rtl .ant-tooltip-inner{text-align:right}.ant-space{display:inline-flex}.ant-space-vertical{flex-direction:column}.ant-space-align-center{align-items:center}.ant-space-align-start{align-items:flex-start}.ant-space-align-end{align-items:flex-end}.ant-space-align-baseline{align-items:baseline}.ant-space-item:empty{display:none}.ant-space-compact{display:inline-flex}.ant-space-compact-block{display:flex;width:100%}.ant-space-compact-vertical{flex-direction:column}.ant-space-rtl,.ant-space-compact-rtl{direction:rtl}.ant-picker-calendar{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";background:#fff}.ant-picker-calendar-header{display:flex;justify-content:flex-end;padding:12px 0}.ant-picker-calendar-header .ant-picker-calendar-year-select{min-width:80px}.ant-picker-calendar-header .ant-picker-calendar-month-select{min-width:70px;margin-left:8px}.ant-picker-calendar-header .ant-picker-calendar-mode-switch{margin-left:8px}.ant-picker-calendar .ant-picker-panel{background:#fff;border:0;border-top:1px solid #f0f0f0;border-radius:0}.ant-picker-calendar .ant-picker-panel .ant-picker-month-panel,.ant-picker-calendar .ant-picker-panel .ant-picker-date-panel{width:auto}.ant-picker-calendar .ant-picker-panel .ant-picker-body{padding:8px 0}.ant-picker-calendar .ant-picker-panel .ant-picker-content{width:100%}.ant-picker-calendar-mini{border-radius:2px}.ant-picker-calendar-mini .ant-picker-calendar-header{padding-right:8px;padding-left:8px}.ant-picker-calendar-mini .ant-picker-panel{border-radius:0 0 2px 2px}.ant-picker-calendar-mini .ant-picker-content{height:256px}.ant-picker-calendar-mini .ant-picker-content th{height:auto;padding:0;line-height:18px}.ant-picker-calendar-mini .ant-picker-cell:before{pointer-events:none}.ant-picker-calendar-full .ant-picker-panel{display:block;width:100%;text-align:right;background:#fff;border:0}.ant-picker-calendar-full .ant-picker-panel .ant-picker-body th,.ant-picker-calendar-full .ant-picker-panel .ant-picker-body td{padding:0}.ant-picker-calendar-full .ant-picker-panel .ant-picker-body th{height:auto;padding:0 12px 5px 0;line-height:18px}.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell:before{display:none}.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell:hover .ant-picker-calendar-date{background:#f5f5f5}.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell .ant-picker-calendar-date-today:before{display:none}.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected .ant-picker-calendar-date,.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected:hover .ant-picker-calendar-date,.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected .ant-picker-calendar-date-today,.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected:hover .ant-picker-calendar-date-today{background:#e6f7ff}.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected .ant-picker-calendar-date .ant-picker-calendar-date-value,.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected:hover .ant-picker-calendar-date .ant-picker-calendar-date-value,.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected .ant-picker-calendar-date-today .ant-picker-calendar-date-value,.ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected:hover .ant-picker-calendar-date-today .ant-picker-calendar-date-value{color:#1890ff}.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date{display:block;width:auto;height:auto;margin:0 4px;padding:4px 8px 0;border:0;border-top:2px solid #f0f0f0;border-radius:0;transition:background .3s}.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-value{line-height:24px;transition:color .3s}.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-content{position:static;width:auto;height:86px;overflow-y:auto;color:#000000d9;line-height:1.5715;text-align:left}.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-today{border-color:#1890ff}.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-today .ant-picker-calendar-date-value{color:#000000d9}@media only screen and (max-width: 480px){.ant-picker-calendar-header{display:block}.ant-picker-calendar-header .ant-picker-calendar-year-select{width:50%}.ant-picker-calendar-header .ant-picker-calendar-month-select{width:calc(50% - 8px)}.ant-picker-calendar-header .ant-picker-calendar-mode-switch{width:100%;margin-top:8px;margin-left:0}.ant-picker-calendar-header .ant-picker-calendar-mode-switch>label{width:50%;text-align:center}}.ant-picker-calendar-rtl{direction:rtl}.ant-picker-calendar-rtl .ant-picker-calendar-header .ant-picker-calendar-month-select,.ant-picker-calendar-rtl .ant-picker-calendar-header .ant-picker-calendar-mode-switch{margin-right:8px;margin-left:0}.ant-picker-calendar-rtl.ant-picker-calendar-full .ant-picker-panel{text-align:left}.ant-picker-calendar-rtl.ant-picker-calendar-full .ant-picker-panel .ant-picker-body th{padding:0 0 5px 12px}.ant-picker-calendar-rtl.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-content{text-align:right}.ant-picker-status-error.ant-picker,.ant-picker-status-error.ant-picker:not([disabled]):hover{background-color:#fff;border-color:#ff4d4f}.ant-picker-status-error.ant-picker-focused,.ant-picker-status-error.ant-picker:focus{border-color:#ff7875;box-shadow:0 0 0 2px #ff4d4f33;border-right-width:1px;outline:0}.ant-picker-status-error.ant-picker .ant-picker-active-bar{background:#ff7875}.ant-picker-status-warning.ant-picker,.ant-picker-status-warning.ant-picker:not([disabled]):hover{background-color:#fff;border-color:#faad14}.ant-picker-status-warning.ant-picker-focused,.ant-picker-status-warning.ant-picker:focus{border-color:#ffc53d;box-shadow:0 0 0 2px #faad1433;border-right-width:1px;outline:0}.ant-picker-status-warning.ant-picker .ant-picker-active-bar{background:#ffc53d}.ant-picker{box-sizing:border-box;margin:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";padding:4px 11px;position:relative;display:inline-flex;align-items:center;background:#fff;border:1px solid #d9d9d9;border-radius:2px;transition:border .3s,box-shadow .3s}.ant-picker:hover,.ant-picker-focused{border-color:#40a9ff;border-right-width:1px}.ant-picker-focused{border-color:#40a9ff;box-shadow:0 0 0 2px #1890ff33;border-right-width:1px;outline:0}.ant-picker.ant-picker-disabled{background:#f5f5f5;border-color:#d9d9d9;cursor:not-allowed}.ant-picker.ant-picker-disabled .ant-picker-suffix{color:#00000040}.ant-picker.ant-picker-borderless{background-color:transparent!important;border-color:transparent!important;box-shadow:none!important}.ant-picker-input{position:relative;display:inline-flex;align-items:center;width:100%}.ant-picker-input>input{position:relative;display:inline-block;width:100%;min-width:0;color:#000000d9;font-size:14px;line-height:1.5715;background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:2px;transition:all .3s;flex:auto;min-width:1px;height:auto;padding:0;background:transparent;border:0}.ant-picker-input>input::-moz-placeholder{color:#bfbfbf;-moz-user-select:none;user-select:none}.ant-picker-input>input:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-picker-input>input::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-picker-input>input:-moz-placeholder-shown{text-overflow:ellipsis}.ant-picker-input>input:-ms-input-placeholder{text-overflow:ellipsis}.ant-picker-input>input:placeholder-shown{text-overflow:ellipsis}.ant-picker-input>input:hover{border-color:#40a9ff;border-right-width:1px}.ant-picker-input>input:focus,.ant-picker-input>input-focused{border-color:#40a9ff;box-shadow:0 0 0 2px #1890ff33;border-right-width:1px;outline:0}.ant-picker-input>input-disabled{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-picker-input>input-disabled:hover{border-color:#d9d9d9;border-right-width:1px}.ant-picker-input>input[disabled]{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-picker-input>input[disabled]:hover{border-color:#d9d9d9;border-right-width:1px}.ant-picker-input>input-borderless,.ant-picker-input>input-borderless:hover,.ant-picker-input>input-borderless:focus,.ant-picker-input>input-borderless-focused,.ant-picker-input>input-borderless-disabled,.ant-picker-input>input-borderless[disabled]{background-color:transparent;border:none;box-shadow:none}textarea.ant-picker-input>input{max-width:100%;height:auto;min-height:32px;line-height:1.5715;vertical-align:bottom;transition:all .3s,height 0s}.ant-picker-input>input-lg{padding:6.5px 11px;font-size:16px}.ant-picker-input>input-sm{padding:0 7px}.ant-picker-input>input:focus{box-shadow:none}.ant-picker-input>input[disabled]{background:transparent}.ant-picker-input:hover .ant-picker-clear{opacity:1}.ant-picker-input-placeholder>input{color:#bfbfbf}.ant-picker-large{padding:6.5px 11px}.ant-picker-large .ant-picker-input>input{font-size:16px}.ant-picker-small{padding:0 7px}.ant-picker-suffix{display:flex;flex:none;align-self:center;margin-left:4px;color:#00000040;line-height:1;pointer-events:none}.ant-picker-suffix>*{vertical-align:top}.ant-picker-suffix>*:not(:last-child){margin-right:8px}.ant-picker-clear{position:absolute;top:50%;right:0;color:#00000040;line-height:1;background:#fff;transform:translateY(-50%);cursor:pointer;opacity:0;transition:opacity .3s,color .3s}.ant-picker-clear>*{vertical-align:top}.ant-picker-clear:hover{color:#00000073}.ant-picker-separator{position:relative;display:inline-block;width:1em;height:16px;color:#00000040;font-size:16px;vertical-align:top;cursor:default}.ant-picker-focused .ant-picker-separator{color:#00000073}.ant-picker-disabled .ant-picker-range-separator .ant-picker-separator{cursor:not-allowed}.ant-picker-range{position:relative;display:inline-flex}.ant-picker-range .ant-picker-clear{right:11px}.ant-picker-range:hover .ant-picker-clear{opacity:1}.ant-picker-range .ant-picker-active-bar{bottom:-1px;height:2px;margin-left:11px;background:#1890ff;opacity:0;transition:all .3s ease-out;pointer-events:none}.ant-picker-range.ant-picker-focused .ant-picker-active-bar{opacity:1}.ant-picker-range-separator{align-items:center;padding:0 8px;line-height:1}.ant-picker-range.ant-picker-small .ant-picker-clear{right:7px}.ant-picker-range.ant-picker-small .ant-picker-active-bar{margin-left:7px}.ant-picker-dropdown{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:absolute;top:-9999px;left:-9999px;z-index:1050}.ant-picker-dropdown-hidden{display:none}.ant-picker-dropdown-placement-bottomLeft .ant-picker-range-arrow{top:2.58561808px;display:block;transform:rotate(-135deg) translateY(1px)}.ant-picker-dropdown-placement-topLeft .ant-picker-range-arrow{bottom:2.58561808px;display:block;transform:rotate(45deg)}.ant-picker-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-picker-dropdown-placement-topLeft,.ant-picker-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-picker-dropdown-placement-topRight,.ant-picker-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-picker-dropdown-placement-topLeft,.ant-picker-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-picker-dropdown-placement-topRight{animation-name:antSlideDownIn}.ant-picker-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-picker-dropdown-placement-bottomLeft,.ant-picker-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-picker-dropdown-placement-bottomRight,.ant-picker-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-picker-dropdown-placement-bottomLeft,.ant-picker-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-picker-dropdown-placement-bottomRight{animation-name:antSlideUpIn}.ant-picker-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-picker-dropdown-placement-topLeft,.ant-picker-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-picker-dropdown-placement-topRight{animation-name:antSlideDownOut}.ant-picker-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-picker-dropdown-placement-bottomLeft,.ant-picker-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-picker-dropdown-placement-bottomRight{animation-name:antSlideUpOut}.ant-picker-dropdown-range{padding:7.54247233px 0}.ant-picker-dropdown-range-hidden{display:none}.ant-picker-dropdown .ant-picker-panel>.ant-picker-time-panel{padding-top:4px}.ant-picker-ranges{margin-bottom:0;padding:4px 12px;overflow:hidden;line-height:34px;text-align:left;list-style:none}.ant-picker-ranges>li{display:inline-block}.ant-picker-ranges .ant-picker-preset>.ant-tag-blue{color:#1890ff;background:#e6f7ff;border-color:#91d5ff;cursor:pointer}.ant-picker-ranges .ant-picker-ok{float:right;margin-left:8px}.ant-picker-range-wrapper{display:flex}.ant-picker-range-arrow{position:absolute;z-index:1;display:none;width:11.3137085px;height:11.3137085px;margin-left:16.5px;box-shadow:2px 2px 6px -2px #0000001a;transition:left .3s ease-out;border-radius:0 0 2px;pointer-events:none}.ant-picker-range-arrow:before{position:absolute;top:-11.3137085px;left:-11.3137085px;width:33.9411255px;height:33.9411255px;background:#fff;background-repeat:no-repeat;background-position:-10px -10px;content:"";-webkit-clip-path:inset(33% 33%);clip-path:inset(33% 33%);-webkit-clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z");clip-path:path("M 9.849242404917499 24.091883092036785 A 5 5 0 0 1 13.384776310850237 22.627416997969522 L 20.627416997969522 22.627416997969522 A 2 2 0 0 0 22.627416997969522 20.627416997969522 L 22.627416997969522 13.384776310850237 A 5 5 0 0 1 24.091883092036785 9.849242404917499 L 23.091883092036785 9.849242404917499 L 9.849242404917499 23.091883092036785 Z")}.ant-picker-panel-container{overflow:hidden;vertical-align:top;background:#fff;border-radius:2px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d;transition:margin .3s}.ant-picker-panel-container .ant-picker-panels{display:inline-flex;flex-wrap:nowrap;direction:ltr}.ant-picker-panel-container .ant-picker-panel{vertical-align:top;background:transparent;border-width:0 0 1px 0;border-radius:0}.ant-picker-panel-container .ant-picker-panel .ant-picker-content,.ant-picker-panel-container .ant-picker-panel table{text-align:center}.ant-picker-panel-container .ant-picker-panel-focused{border-color:#f0f0f0}.ant-picker-compact-item:not(.ant-picker-compact-last-item):not(.ant-picker-compact-item-rtl){margin-right:-1px}.ant-picker-compact-item:not(.ant-picker-compact-last-item).ant-picker-compact-item-rtl{margin-left:-1px}.ant-picker-compact-item:hover,.ant-picker-compact-item:focus,.ant-picker-compact-item:active{z-index:2}.ant-picker-compact-item.ant-picker-focused{z-index:2}.ant-picker-compact-item[disabled]{z-index:0}.ant-picker-compact-item:not(.ant-picker-compact-first-item):not(.ant-picker-compact-last-item).ant-picker{border-radius:0}.ant-picker-compact-item.ant-picker.ant-picker-compact-first-item:not(.ant-picker-compact-last-item):not(.ant-picker-compact-item-rtl){border-top-right-radius:0;border-bottom-right-radius:0}.ant-picker-compact-item.ant-picker.ant-picker-compact-last-item:not(.ant-picker-compact-first-item):not(.ant-picker-compact-item-rtl){border-top-left-radius:0;border-bottom-left-radius:0}.ant-picker-compact-item.ant-picker.ant-picker-compact-item-rtl.ant-picker-compact-first-item:not(.ant-picker-compact-last-item){border-top-left-radius:0;border-bottom-left-radius:0}.ant-picker-compact-item.ant-picker.ant-picker-compact-item-rtl.ant-picker-compact-last-item:not(.ant-picker-compact-first-item){border-top-right-radius:0;border-bottom-right-radius:0}.ant-picker-panel{display:inline-flex;flex-direction:column;text-align:center;background:#fff;border:1px solid #f0f0f0;border-radius:2px;outline:none}.ant-picker-panel-focused{border-color:#1890ff}.ant-picker-decade-panel,.ant-picker-year-panel,.ant-picker-quarter-panel,.ant-picker-month-panel,.ant-picker-week-panel,.ant-picker-date-panel,.ant-picker-time-panel{display:flex;flex-direction:column;width:280px}.ant-picker-header{display:flex;padding:0 8px;color:#000000d9;border-bottom:1px solid #f0f0f0}.ant-picker-header>*{flex:none}.ant-picker-header button{padding:0;color:#00000040;line-height:40px;background:transparent;border:0;cursor:pointer;transition:color .3s}.ant-picker-header>button{min-width:1.6em;font-size:14px}.ant-picker-header>button:hover{color:#000000d9}.ant-picker-header-view{flex:auto;font-weight:500;line-height:40px}.ant-picker-header-view button{color:inherit;font-weight:inherit}.ant-picker-header-view button:not(:first-child){margin-left:8px}.ant-picker-header-view button:hover{color:#1890ff}.ant-picker-prev-icon,.ant-picker-next-icon,.ant-picker-super-prev-icon,.ant-picker-super-next-icon{position:relative;display:inline-block;width:7px;height:7px}.ant-picker-prev-icon:before,.ant-picker-next-icon:before,.ant-picker-super-prev-icon:before,.ant-picker-super-next-icon:before{position:absolute;top:0;left:0;display:inline-block;width:7px;height:7px;border:0 solid currentcolor;border-width:1.5px 0 0 1.5px;content:""}.ant-picker-super-prev-icon:after,.ant-picker-super-next-icon:after{position:absolute;top:4px;left:4px;display:inline-block;width:7px;height:7px;border:0 solid currentcolor;border-width:1.5px 0 0 1.5px;content:""}.ant-picker-prev-icon,.ant-picker-super-prev-icon{transform:rotate(-45deg)}.ant-picker-next-icon,.ant-picker-super-next-icon{transform:rotate(135deg)}.ant-picker-content{width:100%;table-layout:fixed;border-collapse:collapse}.ant-picker-content th,.ant-picker-content td{position:relative;min-width:24px;font-weight:400}.ant-picker-content th{height:30px;color:#000000d9;line-height:30px}.ant-picker-cell{padding:3px 0;color:#00000040;cursor:pointer}.ant-picker-cell-in-view{color:#000000d9}.ant-picker-cell:before{position:absolute;top:50%;right:0;left:0;z-index:1;height:24px;transform:translateY(-50%);transition:all .3s;content:""}.ant-picker-cell:hover:not(.ant-picker-cell-in-view) .ant-picker-cell-inner,.ant-picker-cell:hover:not(.ant-picker-cell-selected):not(.ant-picker-cell-range-start):not(.ant-picker-cell-range-end):not(.ant-picker-cell-range-hover-start):not(.ant-picker-cell-range-hover-end) .ant-picker-cell-inner{background:#f5f5f5}.ant-picker-cell-in-view.ant-picker-cell-today .ant-picker-cell-inner:before{position:absolute;inset:0;z-index:1;border:1px solid #1890ff;border-radius:2px;content:""}.ant-picker-cell-in-view.ant-picker-cell-in-range{position:relative}.ant-picker-cell-in-view.ant-picker-cell-in-range:before{background:#e6f7ff}.ant-picker-cell-in-view.ant-picker-cell-selected .ant-picker-cell-inner,.ant-picker-cell-in-view.ant-picker-cell-range-start .ant-picker-cell-inner,.ant-picker-cell-in-view.ant-picker-cell-range-end .ant-picker-cell-inner{color:#fff;background:#1890ff}.ant-picker-cell-in-view.ant-picker-cell-range-start:not(.ant-picker-cell-range-start-single):before,.ant-picker-cell-in-view.ant-picker-cell-range-end:not(.ant-picker-cell-range-end-single):before{background:#e6f7ff}.ant-picker-cell-in-view.ant-picker-cell-range-start:before{left:50%}.ant-picker-cell-in-view.ant-picker-cell-range-end:before{right:50%}.ant-picker-cell-in-view.ant-picker-cell-range-hover-start:not(.ant-picker-cell-in-range):not(.ant-picker-cell-range-start):not(.ant-picker-cell-range-end):after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-end:not(.ant-picker-cell-in-range):not(.ant-picker-cell-range-start):not(.ant-picker-cell-range-end):after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-start.ant-picker-cell-range-start-single:after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-start.ant-picker-cell-range-start.ant-picker-cell-range-end.ant-picker-cell-range-end-near-hover:after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-end.ant-picker-cell-range-start.ant-picker-cell-range-end.ant-picker-cell-range-start-near-hover:after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-end.ant-picker-cell-range-end-single:after,.ant-picker-cell-in-view.ant-picker-cell-range-hover:not(.ant-picker-cell-in-range):after{position:absolute;top:50%;z-index:0;height:24px;border-top:1px dashed #7ec1ff;border-bottom:1px dashed #7ec1ff;transform:translateY(-50%);transition:all .3s;content:""}.ant-picker-cell-range-hover-start:after,.ant-picker-cell-range-hover-end:after,.ant-picker-cell-range-hover:after{right:0;left:2px}.ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover:before,.ant-picker-cell-in-view.ant-picker-cell-range-start.ant-picker-cell-range-hover:before,.ant-picker-cell-in-view.ant-picker-cell-range-end.ant-picker-cell-range-hover:before,.ant-picker-cell-in-view.ant-picker-cell-range-start:not(.ant-picker-cell-range-start-single).ant-picker-cell-range-hover-start:before,.ant-picker-cell-in-view.ant-picker-cell-range-end:not(.ant-picker-cell-range-end-single).ant-picker-cell-range-hover-end:before,.ant-picker-panel>:not(.ant-picker-date-panel) .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-start:before,.ant-picker-panel>:not(.ant-picker-date-panel) .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-end:before{background:#cbe6ff}.ant-picker-cell-in-view.ant-picker-cell-range-start:not(.ant-picker-cell-range-start-single):not(.ant-picker-cell-range-end) .ant-picker-cell-inner{border-radius:2px 0 0 2px}.ant-picker-cell-in-view.ant-picker-cell-range-end:not(.ant-picker-cell-range-end-single):not(.ant-picker-cell-range-start) .ant-picker-cell-inner{border-radius:0 2px 2px 0}.ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-start .ant-picker-cell-inner:after,.ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-end .ant-picker-cell-inner:after{position:absolute;top:0;bottom:0;z-index:-1;background:#cbe6ff;transition:all .3s;content:""}.ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-start .ant-picker-cell-inner:after{right:-6px;left:0}.ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-end .ant-picker-cell-inner:after{right:0;left:-6px}.ant-picker-cell-range-hover.ant-picker-cell-range-start:after{right:50%}.ant-picker-cell-range-hover.ant-picker-cell-range-end:after{left:50%}tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover:first-child:after,tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover-end:first-child:after,.ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover-edge-start.ant-picker-cell-range-hover-edge-start-near-range:after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-edge-start:not(.ant-picker-cell-range-hover-edge-start-near-range):after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-start:after{left:6px;border-left:1px dashed #7ec1ff;border-top-left-radius:2px;border-bottom-left-radius:2px}tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover:last-child:after,tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child:after,.ant-picker-cell-in-view.ant-picker-cell-end.ant-picker-cell-range-hover-edge-end.ant-picker-cell-range-hover-edge-end-near-range:after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-edge-end:not(.ant-picker-cell-range-hover-edge-end-near-range):after,.ant-picker-cell-in-view.ant-picker-cell-range-hover-end:after{right:6px;border-right:1px dashed #7ec1ff;border-top-right-radius:2px;border-bottom-right-radius:2px}.ant-picker-cell-disabled{color:#00000040;pointer-events:none}.ant-picker-cell-disabled .ant-picker-cell-inner{background:transparent}.ant-picker-cell-disabled:before{background:rgba(0,0,0,.04)}.ant-picker-cell-disabled.ant-picker-cell-today .ant-picker-cell-inner:before{border-color:#00000040}.ant-picker-decade-panel .ant-picker-content,.ant-picker-year-panel .ant-picker-content,.ant-picker-quarter-panel .ant-picker-content,.ant-picker-month-panel .ant-picker-content{height:264px}.ant-picker-decade-panel .ant-picker-cell-inner,.ant-picker-year-panel .ant-picker-cell-inner,.ant-picker-quarter-panel .ant-picker-cell-inner,.ant-picker-month-panel .ant-picker-cell-inner{padding:0 8px}.ant-picker-quarter-panel .ant-picker-content{height:56px}.ant-picker-footer{width:-moz-min-content;width:min-content;min-width:100%;line-height:38px;text-align:center;border-bottom:1px solid transparent}.ant-picker-panel .ant-picker-footer{border-top:1px solid #f0f0f0}.ant-picker-footer-extra{padding:0 12px;line-height:38px;text-align:left}.ant-picker-footer-extra:not(:last-child){border-bottom:1px solid #f0f0f0}.ant-picker-now{text-align:left}.ant-picker-today-btn{color:#1890ff}.ant-picker-today-btn:hover{color:#40a9ff}.ant-picker-today-btn:active{color:#096dd9}.ant-picker-today-btn.ant-picker-today-btn-disabled{color:#00000040;cursor:not-allowed}.ant-picker-decade-panel .ant-picker-cell-inner{padding:0 4px}.ant-picker-decade-panel .ant-picker-cell:before{display:none}.ant-picker-year-panel .ant-picker-body,.ant-picker-quarter-panel .ant-picker-body,.ant-picker-month-panel .ant-picker-body{padding:0 8px}.ant-picker-year-panel .ant-picker-cell-inner,.ant-picker-quarter-panel .ant-picker-cell-inner,.ant-picker-month-panel .ant-picker-cell-inner{width:60px}.ant-picker-year-panel .ant-picker-cell-range-hover-start:after,.ant-picker-quarter-panel .ant-picker-cell-range-hover-start:after,.ant-picker-month-panel .ant-picker-cell-range-hover-start:after{left:14px;border-left:1px dashed #7ec1ff;border-radius:2px 0 0 2px}.ant-picker-panel-rtl .ant-picker-year-panel .ant-picker-cell-range-hover-start:after,.ant-picker-panel-rtl .ant-picker-quarter-panel .ant-picker-cell-range-hover-start:after,.ant-picker-panel-rtl .ant-picker-month-panel .ant-picker-cell-range-hover-start:after{right:14px;border-right:1px dashed #7ec1ff;border-radius:0 2px 2px 0}.ant-picker-year-panel .ant-picker-cell-range-hover-end:after,.ant-picker-quarter-panel .ant-picker-cell-range-hover-end:after,.ant-picker-month-panel .ant-picker-cell-range-hover-end:after{right:14px;border-right:1px dashed #7ec1ff;border-radius:0 2px 2px 0}.ant-picker-panel-rtl .ant-picker-year-panel .ant-picker-cell-range-hover-end:after,.ant-picker-panel-rtl .ant-picker-quarter-panel .ant-picker-cell-range-hover-end:after,.ant-picker-panel-rtl .ant-picker-month-panel .ant-picker-cell-range-hover-end:after{left:14px;border-left:1px dashed #7ec1ff;border-radius:2px 0 0 2px}.ant-picker-week-panel .ant-picker-body{padding:8px 12px}.ant-picker-week-panel .ant-picker-cell:hover .ant-picker-cell-inner,.ant-picker-week-panel .ant-picker-cell-selected .ant-picker-cell-inner,.ant-picker-week-panel .ant-picker-cell .ant-picker-cell-inner{background:transparent!important}.ant-picker-week-panel-row td{transition:background .3s}.ant-picker-week-panel-row:hover td{background:#f5f5f5}.ant-picker-week-panel-row-selected td,.ant-picker-week-panel-row-selected:hover td{background:#1890ff}.ant-picker-week-panel-row-selected td.ant-picker-cell-week,.ant-picker-week-panel-row-selected:hover td.ant-picker-cell-week{color:#ffffff80}.ant-picker-week-panel-row-selected td.ant-picker-cell-today .ant-picker-cell-inner:before,.ant-picker-week-panel-row-selected:hover td.ant-picker-cell-today .ant-picker-cell-inner:before{border-color:#fff}.ant-picker-week-panel-row-selected td .ant-picker-cell-inner,.ant-picker-week-panel-row-selected:hover td .ant-picker-cell-inner{color:#fff}.ant-picker-date-panel .ant-picker-body{padding:8px 12px}.ant-picker-date-panel .ant-picker-content{width:252px}.ant-picker-date-panel .ant-picker-content th{width:36px}.ant-picker-datetime-panel{display:flex}.ant-picker-datetime-panel .ant-picker-time-panel{border-left:1px solid #f0f0f0}.ant-picker-datetime-panel .ant-picker-date-panel,.ant-picker-datetime-panel .ant-picker-time-panel{transition:opacity .3s}.ant-picker-datetime-panel-active .ant-picker-date-panel,.ant-picker-datetime-panel-active .ant-picker-time-panel{opacity:.3}.ant-picker-datetime-panel-active .ant-picker-date-panel-active,.ant-picker-datetime-panel-active .ant-picker-time-panel-active{opacity:1}.ant-picker-time-panel{width:auto;min-width:auto}.ant-picker-time-panel .ant-picker-content{display:flex;flex:auto;height:224px}.ant-picker-time-panel-column{flex:1 0 auto;width:56px;margin:0;padding:0;overflow-y:hidden;text-align:left;list-style:none;transition:background .3s}.ant-picker-time-panel-column:after{display:block;height:196px;content:""}.ant-picker-datetime-panel .ant-picker-time-panel-column:after{height:198px}.ant-picker-time-panel-column:not(:first-child){border-left:1px solid #f0f0f0}.ant-picker-time-panel-column-active{background:rgba(230,247,255,.2)}.ant-picker-time-panel-column:hover{overflow-y:auto}.ant-picker-time-panel-column>li{margin:0;padding:0}.ant-picker-time-panel-column>li.ant-picker-time-panel-cell .ant-picker-time-panel-cell-inner{display:block;width:100%;height:28px;margin:0;padding:0 0 0 14px;color:#000000d9;line-height:28px;border-radius:0;cursor:pointer;transition:background .3s}.ant-picker-time-panel-column>li.ant-picker-time-panel-cell .ant-picker-time-panel-cell-inner:hover{background:#f5f5f5}.ant-picker-time-panel-column>li.ant-picker-time-panel-cell-selected .ant-picker-time-panel-cell-inner{background:#e6f7ff}.ant-picker-time-panel-column>li.ant-picker-time-panel-cell-disabled .ant-picker-time-panel-cell-inner{color:#00000040;background:transparent;cursor:not-allowed}_:-ms-fullscreen .ant-picker-range-wrapper .ant-picker-month-panel .ant-picker-cell,:root .ant-picker-range-wrapper .ant-picker-month-panel .ant-picker-cell,_:-ms-fullscreen .ant-picker-range-wrapper .ant-picker-year-panel .ant-picker-cell,:root .ant-picker-range-wrapper .ant-picker-year-panel .ant-picker-cell{padding:21px 0}.ant-picker-rtl{direction:rtl}.ant-picker-rtl .ant-picker-suffix{margin-right:4px;margin-left:0}.ant-picker-rtl .ant-picker-clear{right:auto;left:0}.ant-picker-rtl .ant-picker-separator{transform:rotate(180deg)}.ant-picker-panel-rtl .ant-picker-header-view button:not(:first-child){margin-right:8px;margin-left:0}.ant-picker-rtl.ant-picker-range .ant-picker-clear{right:auto;left:11px}.ant-picker-rtl.ant-picker-range .ant-picker-active-bar{margin-right:11px;margin-left:0}.ant-picker-rtl.ant-picker-range.ant-picker-small .ant-picker-active-bar{margin-right:7px}.ant-picker-dropdown-rtl .ant-picker-ranges{text-align:right}.ant-picker-dropdown-rtl .ant-picker-ranges .ant-picker-ok{float:left;margin-right:8px;margin-left:0}.ant-picker-panel-rtl{direction:rtl}.ant-picker-panel-rtl .ant-picker-prev-icon,.ant-picker-panel-rtl .ant-picker-super-prev-icon{transform:rotate(135deg)}.ant-picker-panel-rtl .ant-picker-next-icon,.ant-picker-panel-rtl .ant-picker-super-next-icon{transform:rotate(-45deg)}.ant-picker-cell .ant-picker-cell-inner{position:relative;z-index:2;display:inline-block;min-width:24px;height:24px;line-height:24px;border-radius:2px;transition:background .3s,border .3s}.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-start:before{right:50%;left:0}.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-end:before{right:0;left:50%}.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-start.ant-picker-cell-range-end:before{right:50%;left:50%}.ant-picker-panel-rtl .ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-start .ant-picker-cell-inner:after{right:0;left:-6px}.ant-picker-panel-rtl .ant-picker-date-panel .ant-picker-cell-in-view.ant-picker-cell-in-range.ant-picker-cell-range-hover-end .ant-picker-cell-inner:after{right:-6px;left:0}.ant-picker-panel-rtl .ant-picker-cell-range-hover.ant-picker-cell-range-start:after{right:0;left:50%}.ant-picker-panel-rtl .ant-picker-cell-range-hover.ant-picker-cell-range-end:after{right:50%;left:0}.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-start:not(.ant-picker-cell-range-start-single):not(.ant-picker-cell-range-end) .ant-picker-cell-inner{border-radius:0 2px 2px 0}.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-end:not(.ant-picker-cell-range-end-single):not(.ant-picker-cell-range-start) .ant-picker-cell-inner{border-radius:2px 0 0 2px}.ant-picker-panel-rtl tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover:not(.ant-picker-cell-selected):first-child:after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover-edge-start.ant-picker-cell-range-hover-edge-start-near-range:after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-hover-edge-start:not(.ant-picker-cell-range-hover-edge-start-near-range):after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-hover-start:after{right:6px;left:0;border-right:1px dashed #7ec1ff;border-left:none;border-radius:0 2px 2px 0}.ant-picker-panel-rtl tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover:not(.ant-picker-cell-selected):last-child:after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-end.ant-picker-cell-range-hover-edge-end.ant-picker-cell-range-hover-edge-end-near-range:after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-hover-edge-end:not(.ant-picker-cell-range-hover-edge-end-near-range):after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-range-hover-end:after{right:0;left:6px;border-right:none;border-left:1px dashed #7ec1ff;border-radius:2px 0 0 2px}.ant-picker-panel-rtl tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child:after,.ant-picker-panel-rtl tr>.ant-picker-cell-in-view.ant-picker-cell-range-hover-end:first-child:after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover-edge-start:not(.ant-picker-cell-range-hover):after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover-end.ant-picker-cell-range-hover-edge-start:not(.ant-picker-cell-range-hover):after,.ant-picker-panel-rtl .ant-picker-cell-in-view.ant-picker-cell-end.ant-picker-cell-range-hover-start.ant-picker-cell-range-hover-edge-end:not(.ant-picker-cell-range-hover):after,.ant-picker-panel-rtl tr>.ant-picker-cell-in-view.ant-picker-cell-start.ant-picker-cell-range-hover.ant-picker-cell-range-hover-edge-start:last-child:after,.ant-picker-panel-rtl tr>.ant-picker-cell-in-view.ant-picker-cell-end.ant-picker-cell-range-hover.ant-picker-cell-range-hover-edge-end:first-child:after{right:6px;left:6px;border-right:1px dashed #7ec1ff;border-left:1px dashed #7ec1ff;border-radius:2px}.ant-picker-dropdown-rtl .ant-picker-footer-extra{direction:rtl;text-align:right}.ant-picker-panel-rtl .ant-picker-time-panel{direction:ltr}.ant-tag{box-sizing:border-box;margin:0 8px 0 0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";display:inline-block;height:auto;padding:0 7px;font-size:12px;line-height:20px;white-space:nowrap;background:#fafafa;border:1px solid #d9d9d9;border-radius:2px;opacity:1;transition:all .3s}.ant-tag,.ant-tag a,.ant-tag a:hover{color:#000000d9}.ant-tag>a:first-child:last-child{display:inline-block;margin:0 -8px;padding:0 8px}.ant-tag-close-icon{margin-left:3px;color:#00000073;font-size:10px;cursor:pointer;transition:all .3s}.ant-tag-close-icon:hover{color:#000000d9}.ant-tag-has-color{border-color:transparent}.ant-tag-has-color,.ant-tag-has-color a,.ant-tag-has-color a:hover,.ant-tag-has-color .anticon-close,.ant-tag-has-color .anticon-close:hover{color:#fff}.ant-tag-checkable{background-color:transparent;border-color:transparent;cursor:pointer}.ant-tag-checkable:not(.ant-tag-checkable-checked):hover{color:#1890ff}.ant-tag-checkable:active,.ant-tag-checkable-checked{color:#fff}.ant-tag-checkable-checked{background-color:#1890ff}.ant-tag-checkable:active{background-color:#096dd9}.ant-tag-hidden{display:none}.ant-tag-pink{color:#c41d7f;background:#fff0f6;border-color:#ffadd2}.ant-tag-pink-inverse{color:#fff;background:#eb2f96;border-color:#eb2f96}.ant-tag-magenta{color:#c41d7f;background:#fff0f6;border-color:#ffadd2}.ant-tag-magenta-inverse{color:#fff;background:#eb2f96;border-color:#eb2f96}.ant-tag-red{color:#cf1322;background:#fff1f0;border-color:#ffa39e}.ant-tag-red-inverse{color:#fff;background:#f5222d;border-color:#f5222d}.ant-tag-volcano{color:#d4380d;background:#fff2e8;border-color:#ffbb96}.ant-tag-volcano-inverse{color:#fff;background:#fa541c;border-color:#fa541c}.ant-tag-orange{color:#d46b08;background:#fff7e6;border-color:#ffd591}.ant-tag-orange-inverse{color:#fff;background:#fa8c16;border-color:#fa8c16}.ant-tag-yellow{color:#d4b106;background:#feffe6;border-color:#fffb8f}.ant-tag-yellow-inverse{color:#fff;background:#fadb14;border-color:#fadb14}.ant-tag-gold{color:#d48806;background:#fffbe6;border-color:#ffe58f}.ant-tag-gold-inverse{color:#fff;background:#faad14;border-color:#faad14}.ant-tag-cyan{color:#08979c;background:#e6fffb;border-color:#87e8de}.ant-tag-cyan-inverse{color:#fff;background:#13c2c2;border-color:#13c2c2}.ant-tag-lime{color:#7cb305;background:#fcffe6;border-color:#eaff8f}.ant-tag-lime-inverse{color:#fff;background:#a0d911;border-color:#a0d911}.ant-tag-green{color:#389e0d;background:#f6ffed;border-color:#b7eb8f}.ant-tag-green-inverse{color:#fff;background:#52c41a;border-color:#52c41a}.ant-tag-blue{color:#096dd9;background:#e6f7ff;border-color:#91d5ff}.ant-tag-blue-inverse{color:#fff;background:#1890ff;border-color:#1890ff}.ant-tag-geekblue{color:#1d39c4;background:#f0f5ff;border-color:#adc6ff}.ant-tag-geekblue-inverse{color:#fff;background:#2f54eb;border-color:#2f54eb}.ant-tag-purple{color:#531dab;background:#f9f0ff;border-color:#d3adf7}.ant-tag-purple-inverse{color:#fff;background:#722ed1;border-color:#722ed1}.ant-tag-success{color:#52c41a;background:#f6ffed;border-color:#b7eb8f}.ant-tag-processing{color:#1890ff;background:#e6f7ff;border-color:#91d5ff}.ant-tag-error{color:#ff4d4f;background:#fff2f0;border-color:#ffccc7}.ant-tag-warning{color:#faad14;background:#fffbe6;border-color:#ffe58f}.ant-tag>.anticon+span,.ant-tag>span+.anticon{margin-left:7px}.ant-tag.ant-tag-rtl{margin-right:0;margin-left:8px;direction:rtl;text-align:right}.ant-tag-rtl .ant-tag-close-icon{margin-right:3px;margin-left:0}.ant-tag-rtl.ant-tag>.anticon+span,.ant-tag-rtl.ant-tag>span+.anticon{margin-right:7px;margin-left:0}.ant-radio-group{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";display:inline-block;font-size:0}.ant-radio-group .ant-badge-count{z-index:1}.ant-radio-group>.ant-badge:not(:first-child)>.ant-radio-button-wrapper{border-left:none}.ant-radio-wrapper{box-sizing:border-box;margin:0 8px 0 0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;display:inline-flex;align-items:baseline;cursor:pointer}.ant-radio-wrapper-disabled{cursor:not-allowed}.ant-radio-wrapper:after{display:inline-block;width:0;overflow:hidden;content:"\\a0"}.ant-radio-wrapper.ant-radio-wrapper-in-form-item input[type=radio]{width:14px;height:14px}.ant-radio{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;top:.2em;display:inline-block;outline:none;cursor:pointer}.ant-radio-wrapper:hover .ant-radio,.ant-radio:hover .ant-radio-inner,.ant-radio-input:focus+.ant-radio-inner{border-color:#1890ff}.ant-radio-input:focus+.ant-radio-inner{box-shadow:0 0 0 3px #1890ff1f}.ant-radio-checked:after{position:absolute;top:0;left:0;width:100%;height:100%;border:1px solid #1890ff;border-radius:50%;visibility:hidden;animation:antRadioEffect .36s ease-in-out;animation-fill-mode:both;content:""}.ant-radio:hover:after,.ant-radio-wrapper:hover .ant-radio:after{visibility:visible}.ant-radio-inner{position:relative;top:0;left:0;display:block;width:16px;height:16px;background-color:#fff;border-color:#d9d9d9;border-style:solid;border-width:1px;border-radius:50%;transition:all .3s}.ant-radio-inner:after{position:absolute;top:50%;left:50%;display:block;width:16px;height:16px;margin-top:-8px;margin-left:-8px;background-color:#1890ff;border-top:0;border-left:0;border-radius:16px;transform:scale(0);opacity:0;transition:all .3s cubic-bezier(.78,.14,.15,.86);content:" "}.ant-radio-input{position:absolute;inset:0;z-index:1;cursor:pointer;opacity:0}.ant-radio.ant-radio-disabled .ant-radio-inner{border-color:#d9d9d9}.ant-radio-checked .ant-radio-inner{border-color:#1890ff}.ant-radio-checked .ant-radio-inner:after{transform:scale(.5);opacity:1;transition:all .3s cubic-bezier(.78,.14,.15,.86)}.ant-radio-disabled{cursor:not-allowed}.ant-radio-disabled .ant-radio-inner{background-color:#f5f5f5;cursor:not-allowed}.ant-radio-disabled .ant-radio-inner:after{background-color:#0003}.ant-radio-disabled .ant-radio-input{cursor:not-allowed}.ant-radio-disabled+span{color:#00000040;cursor:not-allowed}span.ant-radio+*{padding-right:8px;padding-left:8px}.ant-radio-button-wrapper{position:relative;display:inline-block;height:32px;margin:0;padding:0 15px;color:#000000d9;font-size:14px;line-height:30px;background:#fff;border:1px solid #d9d9d9;border-top-width:1.02px;border-left-width:0;cursor:pointer;transition:color .3s,background .3s,border-color .3s,box-shadow .3s}.ant-radio-button-wrapper a{color:#000000d9}.ant-radio-button-wrapper>.ant-radio-button{position:absolute;top:0;left:0;z-index:-1;width:100%;height:100%}.ant-radio-group-large .ant-radio-button-wrapper{height:40px;font-size:16px;line-height:38px}.ant-radio-group-small .ant-radio-button-wrapper{height:24px;padding:0 7px;line-height:22px}.ant-radio-button-wrapper:not(:first-child):before{position:absolute;top:-1px;left:-1px;display:block;box-sizing:content-box;width:1px;height:100%;padding:1px 0;background-color:#d9d9d9;transition:background-color .3s;content:""}.ant-radio-button-wrapper:first-child{border-left:1px solid #d9d9d9;border-radius:2px 0 0 2px}.ant-radio-button-wrapper:last-child{border-radius:0 2px 2px 0}.ant-radio-button-wrapper:first-child:last-child{border-radius:2px}.ant-radio-button-wrapper:hover{position:relative;color:#1890ff}.ant-radio-button-wrapper:focus-within{box-shadow:0 0 0 3px #1890ff1f}.ant-radio-button-wrapper .ant-radio-inner,.ant-radio-button-wrapper input[type=checkbox],.ant-radio-button-wrapper input[type=radio]{width:0;height:0;opacity:0;pointer-events:none}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled){z-index:1;color:#1890ff;background:#fff;border-color:#1890ff}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):before{background-color:#1890ff}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):first-child{border-color:#1890ff}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover{color:#40a9ff;border-color:#40a9ff}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover:before{background-color:#40a9ff}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active{color:#096dd9;border-color:#096dd9}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active:before{background-color:#096dd9}.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):focus-within{box-shadow:0 0 0 3px #1890ff1f}.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled){color:#fff;background:#1890ff;border-color:#1890ff}.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover{color:#fff;background:#40a9ff;border-color:#40a9ff}.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active{color:#fff;background:#096dd9;border-color:#096dd9}.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):focus-within{box-shadow:0 0 0 3px #1890ff1f}.ant-radio-button-wrapper-disabled{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;cursor:not-allowed}.ant-radio-button-wrapper-disabled:first-child,.ant-radio-button-wrapper-disabled:hover{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9}.ant-radio-button-wrapper-disabled:first-child{border-left-color:#d9d9d9}.ant-radio-button-wrapper-disabled.ant-radio-button-wrapper-checked{color:#00000040;background-color:#e6e6e6;border-color:#d9d9d9;box-shadow:none}@keyframes antRadioEffect{0%{transform:scale(1);opacity:.5}to{transform:scale(1.6);opacity:0}}.ant-radio-group.ant-radio-group-rtl{direction:rtl}.ant-radio-wrapper.ant-radio-wrapper-rtl{margin-right:0;margin-left:8px;direction:rtl}.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl{border-right-width:0;border-left-width:1px}.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl.ant-radio-button-wrapper:not(:first-child):before{right:-1px;left:0}.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl.ant-radio-button-wrapper:first-child{border-right:1px solid #d9d9d9;border-radius:0 2px 2px 0}.ant-radio-button-wrapper-checked:not([class*=" ant-radio-button-wrapper-disabled"]).ant-radio-button-wrapper:first-child{border-right-color:#40a9ff}.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl.ant-radio-button-wrapper:last-child{border-radius:2px 0 0 2px}.ant-radio-button-wrapper.ant-radio-button-wrapper-rtl.ant-radio-button-wrapper-disabled:first-child{border-right-color:#d9d9d9}.ant-card{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;background:#fff;border-radius:2px}.ant-card-rtl{direction:rtl}.ant-card-hoverable{cursor:pointer;transition:box-shadow .3s,border-color .3s}.ant-card-hoverable:hover{border-color:transparent;box-shadow:0 1px 2px -2px #00000029,0 3px 6px #0000001f,0 5px 12px 4px #00000017}.ant-card-bordered{border:1px solid #f0f0f0}.ant-card-head{min-height:48px;margin-bottom:-1px;padding:0 24px;color:#000000d9;font-weight:500;font-size:16px;background:transparent;border-bottom:1px solid #f0f0f0;border-radius:2px 2px 0 0}.ant-card-head:before{display:table;content:""}.ant-card-head:after{display:table;clear:both;content:""}.ant-card-head-wrapper{display:flex;align-items:center}.ant-card-head-title{display:inline-block;flex:1;padding:16px 0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-card-head-title>.ant-typography,.ant-card-head-title>.ant-typography-edit-content{left:0;margin-top:0;margin-bottom:0}.ant-card-head .ant-tabs-top{clear:both;margin-bottom:-17px;color:#000000d9;font-weight:400;font-size:14px}.ant-card-head .ant-tabs-top-bar{border-bottom:1px solid #f0f0f0}.ant-card-extra{margin-left:auto;padding:16px 0;color:#000000d9;font-weight:400;font-size:14px}.ant-card-rtl .ant-card-extra{margin-right:auto;margin-left:0}.ant-card-body{padding:24px}.ant-card-body:before{display:table;content:""}.ant-card-body:after{display:table;clear:both;content:""}.ant-card-contain-grid .ant-card-body{display:flex;flex-wrap:wrap}.ant-card-contain-grid:not(.ant-card-loading) .ant-card-body{margin:-1px 0 0 -1px;padding:0}.ant-card-grid{width:33.33%;padding:24px;border:0;border-radius:0;box-shadow:1px 0 #f0f0f0,0 1px #f0f0f0,1px 1px #f0f0f0,1px 0 #f0f0f0 inset,0 1px #f0f0f0 inset;transition:all .3s}.ant-card-grid-hoverable:hover{position:relative;z-index:1;box-shadow:0 1px 2px -2px #00000029,0 3px 6px #0000001f,0 5px 12px 4px #00000017}.ant-card-contain-tabs>.ant-card-head .ant-card-head-title{min-height:32px;padding-bottom:0}.ant-card-contain-tabs>.ant-card-head .ant-card-extra{padding-bottom:0}.ant-card-bordered .ant-card-cover{margin-top:-1px;margin-right:-1px;margin-left:-1px}.ant-card-cover>*{display:block;width:100%}.ant-card-cover img{border-radius:2px 2px 0 0}.ant-card-actions{display:flex;margin:0;padding:0;list-style:none;background:#fff;border-top:1px solid #f0f0f0}.ant-card-actions:before{display:table;content:""}.ant-card-actions:after{display:table;clear:both;content:""}.ant-card-actions>li{margin:12px 0;color:#00000073;text-align:center}.ant-card-actions>li>span{position:relative;display:block;min-width:32px;font-size:14px;line-height:1.5715;cursor:pointer}.ant-card-actions>li>span:hover{color:#1890ff;transition:color .3s}.ant-card-actions>li>span a:not(.ant-btn),.ant-card-actions>li>span>.anticon{display:inline-block;width:100%;color:#00000073;line-height:22px;transition:color .3s}.ant-card-actions>li>span a:not(.ant-btn):hover,.ant-card-actions>li>span>.anticon:hover{color:#1890ff}.ant-card-actions>li>span>.anticon{font-size:16px;line-height:22px}.ant-card-actions>li:not(:last-child){border-right:1px solid #f0f0f0}.ant-card-rtl .ant-card-actions>li:not(:last-child){border-right:none;border-left:1px solid #f0f0f0}.ant-card-type-inner .ant-card-head{padding:0 24px;background:#fafafa}.ant-card-type-inner .ant-card-head-title{padding:12px 0;font-size:14px}.ant-card-type-inner .ant-card-body{padding:16px 24px}.ant-card-type-inner .ant-card-extra{padding:13.5px 0}.ant-card-meta{display:flex;margin:-4px 0}.ant-card-meta:before{display:table;content:""}.ant-card-meta:after{display:table;clear:both;content:""}.ant-card-meta-avatar{padding-right:16px}.ant-card-rtl .ant-card-meta-avatar{padding-right:0;padding-left:16px}.ant-card-meta-detail{flex:1;overflow:hidden}.ant-card-meta-detail>div:not(:last-child){margin-bottom:8px}.ant-card-meta-title{overflow:hidden;color:#000000d9;font-weight:500;font-size:16px;white-space:nowrap;text-overflow:ellipsis}.ant-card-meta-description{color:#00000073}.ant-card-loading{overflow:hidden}.ant-card-loading .ant-card-body{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-card-small>.ant-card-head{min-height:36px;padding:0 12px;font-size:14px}.ant-card-small>.ant-card-head>.ant-card-head-wrapper>.ant-card-head-title{padding:8px 0}.ant-card-small>.ant-card-head>.ant-card-head-wrapper>.ant-card-extra{padding:8px 0;font-size:14px}.ant-card-small>.ant-card-body{padding:12px}.ant-skeleton{display:table;width:100%}.ant-skeleton-header{display:table-cell;padding-right:16px;vertical-align:top}.ant-skeleton-header .ant-skeleton-avatar{display:inline-block;vertical-align:top;background:rgba(190,190,190,.2);width:32px;height:32px;line-height:32px}.ant-skeleton-header .ant-skeleton-avatar.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-header .ant-skeleton-avatar-lg{width:40px;height:40px;line-height:40px}.ant-skeleton-header .ant-skeleton-avatar-lg.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-header .ant-skeleton-avatar-sm{width:24px;height:24px;line-height:24px}.ant-skeleton-header .ant-skeleton-avatar-sm.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-content{display:table-cell;width:100%;vertical-align:top}.ant-skeleton-content .ant-skeleton-title{width:100%;height:16px;background:rgba(190,190,190,.2);border-radius:2px}.ant-skeleton-content .ant-skeleton-title+.ant-skeleton-paragraph{margin-top:24px}.ant-skeleton-content .ant-skeleton-paragraph{padding:0}.ant-skeleton-content .ant-skeleton-paragraph>li{width:100%;height:16px;list-style:none;background:rgba(190,190,190,.2);border-radius:2px}.ant-skeleton-content .ant-skeleton-paragraph>li:last-child:not(:first-child):not(:nth-child(2)){width:61%}.ant-skeleton-content .ant-skeleton-paragraph>li+li{margin-top:16px}.ant-skeleton-with-avatar .ant-skeleton-content .ant-skeleton-title{margin-top:12px}.ant-skeleton-with-avatar .ant-skeleton-content .ant-skeleton-title+.ant-skeleton-paragraph{margin-top:28px}.ant-skeleton-round .ant-skeleton-content .ant-skeleton-title,.ant-skeleton-round .ant-skeleton-content .ant-skeleton-paragraph>li{border-radius:100px}.ant-skeleton-active .ant-skeleton-title,.ant-skeleton-active .ant-skeleton-paragraph>li,.ant-skeleton-active .ant-skeleton-avatar,.ant-skeleton-active .ant-skeleton-button,.ant-skeleton-active .ant-skeleton-input,.ant-skeleton-active .ant-skeleton-image{position:relative;z-index:0;overflow:hidden;background:transparent}.ant-skeleton-active .ant-skeleton-title:after,.ant-skeleton-active .ant-skeleton-paragraph>li:after,.ant-skeleton-active .ant-skeleton-avatar:after,.ant-skeleton-active .ant-skeleton-button:after,.ant-skeleton-active .ant-skeleton-input:after,.ant-skeleton-active .ant-skeleton-image:after{position:absolute;inset:0 -150%;background:linear-gradient(90deg,rgba(190,190,190,.2) 25%,rgba(129,129,129,.24) 37%,rgba(190,190,190,.2) 63%);animation:ant-skeleton-loading 1.4s ease infinite;content:""}.ant-skeleton.ant-skeleton-block,.ant-skeleton.ant-skeleton-block .ant-skeleton-button,.ant-skeleton.ant-skeleton-block .ant-skeleton-input{width:100%}.ant-skeleton-element{display:inline-block;width:auto}.ant-skeleton-element .ant-skeleton-button{display:inline-block;vertical-align:top;background:rgba(190,190,190,.2);border-radius:2px;width:64px;min-width:64px;height:32px;line-height:32px}.ant-skeleton-element .ant-skeleton-button.ant-skeleton-button-square{width:32px;min-width:32px}.ant-skeleton-element .ant-skeleton-button.ant-skeleton-button-circle{width:32px;min-width:32px;border-radius:50%}.ant-skeleton-element .ant-skeleton-button.ant-skeleton-button-round{border-radius:32px}.ant-skeleton-element .ant-skeleton-button-lg{width:80px;min-width:80px;height:40px;line-height:40px}.ant-skeleton-element .ant-skeleton-button-lg.ant-skeleton-button-square{width:40px;min-width:40px}.ant-skeleton-element .ant-skeleton-button-lg.ant-skeleton-button-circle{width:40px;min-width:40px;border-radius:50%}.ant-skeleton-element .ant-skeleton-button-lg.ant-skeleton-button-round{border-radius:40px}.ant-skeleton-element .ant-skeleton-button-sm{width:48px;min-width:48px;height:24px;line-height:24px}.ant-skeleton-element .ant-skeleton-button-sm.ant-skeleton-button-square{width:24px;min-width:24px}.ant-skeleton-element .ant-skeleton-button-sm.ant-skeleton-button-circle{width:24px;min-width:24px;border-radius:50%}.ant-skeleton-element .ant-skeleton-button-sm.ant-skeleton-button-round{border-radius:24px}.ant-skeleton-element .ant-skeleton-avatar{display:inline-block;vertical-align:top;background:rgba(190,190,190,.2);width:32px;height:32px;line-height:32px}.ant-skeleton-element .ant-skeleton-avatar.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-element .ant-skeleton-avatar-lg{width:40px;height:40px;line-height:40px}.ant-skeleton-element .ant-skeleton-avatar-lg.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-element .ant-skeleton-avatar-sm{width:24px;height:24px;line-height:24px}.ant-skeleton-element .ant-skeleton-avatar-sm.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-element .ant-skeleton-input{display:inline-block;vertical-align:top;background:rgba(190,190,190,.2);width:160px;min-width:160px;height:32px;line-height:32px}.ant-skeleton-element .ant-skeleton-input-lg{width:200px;min-width:200px;height:40px;line-height:40px}.ant-skeleton-element .ant-skeleton-input-sm{width:120px;min-width:120px;height:24px;line-height:24px}.ant-skeleton-element .ant-skeleton-image{display:flex;align-items:center;justify-content:center;vertical-align:top;background:rgba(190,190,190,.2);width:96px;height:96px;line-height:96px}.ant-skeleton-element .ant-skeleton-image.ant-skeleton-image-circle{border-radius:50%}.ant-skeleton-element .ant-skeleton-image-path{fill:#bfbfbf}.ant-skeleton-element .ant-skeleton-image-svg{width:48px;height:48px;line-height:48px;max-width:192px;max-height:192px}.ant-skeleton-element .ant-skeleton-image-svg.ant-skeleton-image-circle{border-radius:50%}@keyframes ant-skeleton-loading{0%{transform:translate(-37.5%)}to{transform:translate(37.5%)}}.ant-skeleton-rtl{direction:rtl}.ant-skeleton-rtl .ant-skeleton-header{padding-right:0;padding-left:16px}.ant-skeleton-rtl.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-title,.ant-skeleton-rtl.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-paragraph>li{animation-name:ant-skeleton-loading-rtl}.ant-skeleton-rtl.ant-skeleton.ant-skeleton-active .ant-skeleton-avatar{animation-name:ant-skeleton-loading-rtl}@keyframes ant-skeleton-loading-rtl{0%{background-position:0% 50%}to{background-position:100% 50%}}.ant-tabs-small>.ant-tabs-nav .ant-tabs-tab{padding:8px 0;font-size:14px}.ant-tabs-large>.ant-tabs-nav .ant-tabs-tab{padding:16px 0;font-size:16px}.ant-tabs-card.ant-tabs-small>.ant-tabs-nav .ant-tabs-tab{padding:6px 16px}.ant-tabs-card.ant-tabs-large>.ant-tabs-nav .ant-tabs-tab{padding:7px 16px 6px}.ant-tabs-rtl{direction:rtl}.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab{margin:0 0 0 32px}.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab:last-of-type{margin-left:0}.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab .anticon{margin-right:0;margin-left:12px}.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab .ant-tabs-tab-remove{margin-right:8px;margin-left:-4px}.ant-tabs-rtl .ant-tabs-nav .ant-tabs-tab .ant-tabs-tab-remove .anticon{margin:0}.ant-tabs-rtl.ant-tabs-left>.ant-tabs-nav{order:1}.ant-tabs-rtl.ant-tabs-left>.ant-tabs-content-holder{order:0}.ant-tabs-rtl.ant-tabs-right>.ant-tabs-nav{order:0}.ant-tabs-rtl.ant-tabs-right>.ant-tabs-content-holder{order:1}.ant-tabs-rtl.ant-tabs-card.ant-tabs-top>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-rtl.ant-tabs-card.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-rtl.ant-tabs-card.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-rtl.ant-tabs-card.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab{margin-right:2px;margin-left:0}.ant-tabs-rtl.ant-tabs-card.ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-add,.ant-tabs-rtl.ant-tabs-card.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-nav-add,.ant-tabs-rtl.ant-tabs-card.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-nav-add,.ant-tabs-rtl.ant-tabs-card.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-nav-add{margin-right:2px;margin-left:0}.ant-tabs-dropdown-rtl{direction:rtl}.ant-tabs-dropdown-rtl .ant-tabs-dropdown-menu-item{text-align:right}.ant-tabs-top,.ant-tabs-bottom{flex-direction:column}.ant-tabs-top>.ant-tabs-nav,.ant-tabs-bottom>.ant-tabs-nav,.ant-tabs-top>div>.ant-tabs-nav,.ant-tabs-bottom>div>.ant-tabs-nav{margin:0 0 16px}.ant-tabs-top>.ant-tabs-nav:before,.ant-tabs-bottom>.ant-tabs-nav:before,.ant-tabs-top>div>.ant-tabs-nav:before,.ant-tabs-bottom>div>.ant-tabs-nav:before{position:absolute;right:0;left:0;border-bottom:1px solid #f0f0f0;content:""}.ant-tabs-top>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-ink-bar{height:2px}.ant-tabs-top>.ant-tabs-nav .ant-tabs-ink-bar-animated,.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-ink-bar-animated,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-ink-bar-animated,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-ink-bar-animated{transition:width .3s,left .3s,right .3s}.ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-nav-wrap:after{top:0;bottom:0;width:30px}.ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-nav-wrap:before{left:0;box-shadow:inset 10px 0 8px -8px #00000014}.ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-nav-wrap:after{right:0;box-shadow:inset -10px 0 8px -8px #00000014}.ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-left:before,.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-left:before,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-left:before,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-left:before{opacity:1}.ant-tabs-top>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-right:after,.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-right:after,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-right:after,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-right:after{opacity:1}.ant-tabs-top>.ant-tabs-nav:before,.ant-tabs-top>div>.ant-tabs-nav:before{bottom:0}.ant-tabs-top>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-ink-bar{bottom:0}.ant-tabs-bottom>.ant-tabs-nav,.ant-tabs-bottom>div>.ant-tabs-nav{order:1;margin-top:16px;margin-bottom:0}.ant-tabs-bottom>.ant-tabs-nav:before,.ant-tabs-bottom>div>.ant-tabs-nav:before{top:0}.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-ink-bar{top:0}.ant-tabs-bottom>.ant-tabs-content-holder,.ant-tabs-bottom>div>.ant-tabs-content-holder{order:0}.ant-tabs-left>.ant-tabs-nav,.ant-tabs-right>.ant-tabs-nav,.ant-tabs-left>div>.ant-tabs-nav,.ant-tabs-right>div>.ant-tabs-nav{flex-direction:column;min-width:50px}.ant-tabs-left>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-right>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-tab{padding:8px 24px;text-align:center}.ant-tabs-left>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-right>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab{margin:16px 0 0}.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-wrap,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-wrap,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-wrap,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-wrap{flex-direction:column}.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-wrap:after{right:0;left:0;height:30px}.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-wrap:before{top:0;box-shadow:inset 0 10px 8px -8px #00000014}.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-wrap:after{bottom:0;box-shadow:inset 0 -10px 8px -8px #00000014}.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-top:before,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-top:before,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-top:before,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-top:before{opacity:1}.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-bottom:after,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-bottom:after,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-bottom:after,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-wrap.ant-tabs-nav-wrap-ping-bottom:after{opacity:1}.ant-tabs-left>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-right>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-ink-bar{width:2px}.ant-tabs-left>.ant-tabs-nav .ant-tabs-ink-bar-animated,.ant-tabs-right>.ant-tabs-nav .ant-tabs-ink-bar-animated,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-ink-bar-animated,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-ink-bar-animated{transition:height .3s,top .3s}.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-list,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-list,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-list,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-list,.ant-tabs-left>.ant-tabs-nav .ant-tabs-nav-operations,.ant-tabs-right>.ant-tabs-nav .ant-tabs-nav-operations,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-nav-operations,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-nav-operations{flex:1 0 auto;flex-direction:column}.ant-tabs-left>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-ink-bar{right:0}.ant-tabs-left>.ant-tabs-content-holder,.ant-tabs-left>div>.ant-tabs-content-holder{margin-left:-1px;border-left:1px solid #f0f0f0}.ant-tabs-left>.ant-tabs-content-holder>.ant-tabs-content>.ant-tabs-tabpane,.ant-tabs-left>div>.ant-tabs-content-holder>.ant-tabs-content>.ant-tabs-tabpane{padding-left:24px}.ant-tabs-right>.ant-tabs-nav,.ant-tabs-right>div>.ant-tabs-nav{order:1}.ant-tabs-right>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-ink-bar{left:0}.ant-tabs-right>.ant-tabs-content-holder,.ant-tabs-right>div>.ant-tabs-content-holder{order:0;margin-right:-1px;border-right:1px solid #f0f0f0}.ant-tabs-right>.ant-tabs-content-holder>.ant-tabs-content>.ant-tabs-tabpane,.ant-tabs-right>div>.ant-tabs-content-holder>.ant-tabs-content>.ant-tabs-tabpane{padding-right:24px}.ant-tabs-dropdown{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:absolute;top:-9999px;left:-9999px;z-index:1050;display:block}.ant-tabs-dropdown-hidden{display:none}.ant-tabs-dropdown-menu{max-height:200px;margin:0;padding:4px 0;overflow-x:hidden;overflow-y:auto;text-align:left;list-style-type:none;background-color:#fff;background-clip:padding-box;border-radius:2px;outline:none;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d}.ant-tabs-dropdown-menu-item{display:flex;align-items:center;min-width:120px;margin:0;padding:5px 12px;overflow:hidden;color:#000000d9;font-weight:400;font-size:14px;line-height:22px;white-space:nowrap;text-overflow:ellipsis;cursor:pointer;transition:all .3s}.ant-tabs-dropdown-menu-item>span{flex:1;white-space:nowrap}.ant-tabs-dropdown-menu-item-remove{flex:none;margin-left:12px;color:#00000073;font-size:12px;background:transparent;border:0;cursor:pointer}.ant-tabs-dropdown-menu-item-remove:hover{color:#40a9ff}.ant-tabs-dropdown-menu-item:hover{background:#f5f5f5}.ant-tabs-dropdown-menu-item-disabled,.ant-tabs-dropdown-menu-item-disabled:hover{color:#00000040;background:transparent;cursor:not-allowed}.ant-tabs-card>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-card>div>.ant-tabs-nav .ant-tabs-tab{margin:0;padding:8px 16px;background:#fafafa;border:1px solid #f0f0f0;transition:all .3s cubic-bezier(.645,.045,.355,1)}.ant-tabs-card>.ant-tabs-nav .ant-tabs-tab-active,.ant-tabs-card>div>.ant-tabs-nav .ant-tabs-tab-active{color:#1890ff;background:#fff}.ant-tabs-card>.ant-tabs-nav .ant-tabs-ink-bar,.ant-tabs-card>div>.ant-tabs-nav .ant-tabs-ink-bar{visibility:hidden}.ant-tabs-card.ant-tabs-top>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-card.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-card.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-card.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab{margin-left:2px}.ant-tabs-card.ant-tabs-top>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-card.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-tab{border-radius:2px 2px 0 0}.ant-tabs-card.ant-tabs-top>.ant-tabs-nav .ant-tabs-tab-active,.ant-tabs-card.ant-tabs-top>div>.ant-tabs-nav .ant-tabs-tab-active{border-bottom-color:#fff}.ant-tabs-card.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-card.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-tab{border-radius:0 0 2px 2px}.ant-tabs-card.ant-tabs-bottom>.ant-tabs-nav .ant-tabs-tab-active,.ant-tabs-card.ant-tabs-bottom>div>.ant-tabs-nav .ant-tabs-tab-active{border-top-color:#fff}.ant-tabs-card.ant-tabs-left>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-card.ant-tabs-right>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-card.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab,.ant-tabs-card.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-tab+.ant-tabs-tab{margin-top:2px}.ant-tabs-card.ant-tabs-left>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-card.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-tab{border-radius:2px 0 0 2px}.ant-tabs-card.ant-tabs-left>.ant-tabs-nav .ant-tabs-tab-active,.ant-tabs-card.ant-tabs-left>div>.ant-tabs-nav .ant-tabs-tab-active{border-right-color:#fff}.ant-tabs-card.ant-tabs-right>.ant-tabs-nav .ant-tabs-tab,.ant-tabs-card.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-tab{border-radius:0 2px 2px 0}.ant-tabs-card.ant-tabs-right>.ant-tabs-nav .ant-tabs-tab-active,.ant-tabs-card.ant-tabs-right>div>.ant-tabs-nav .ant-tabs-tab-active{border-left-color:#fff}.ant-tabs{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";display:flex}.ant-tabs>.ant-tabs-nav,.ant-tabs>div>.ant-tabs-nav{position:relative;display:flex;flex:none;align-items:center}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-wrap,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-wrap{position:relative;display:inline-block;display:flex;flex:auto;align-self:stretch;overflow:hidden;white-space:nowrap;transform:translate(0)}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-wrap:before,.ant-tabs>.ant-tabs-nav .ant-tabs-nav-wrap:after,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-wrap:after{position:absolute;z-index:1;opacity:0;transition:opacity .3s;content:"";pointer-events:none}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-list,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-list{position:relative;display:flex;transition:transform .3s}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-operations,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-operations{display:flex;align-self:stretch}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-operations-hidden,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-operations-hidden{position:absolute;visibility:hidden;pointer-events:none}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-more,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-more{position:relative;padding:8px 16px;background:transparent;border:0}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-more:after,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-more:after{position:absolute;right:0;bottom:0;left:0;height:5px;transform:translateY(100%);content:""}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-add,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-add{min-width:40px;margin-left:2px;padding:0 8px;background:#fafafa;border:1px solid #f0f0f0;border-radius:2px 2px 0 0;outline:none;cursor:pointer;transition:all .3s cubic-bezier(.645,.045,.355,1)}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-add:hover,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-add:hover{color:#40a9ff}.ant-tabs>.ant-tabs-nav .ant-tabs-nav-add:active,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-add:active,.ant-tabs>.ant-tabs-nav .ant-tabs-nav-add:focus,.ant-tabs>div>.ant-tabs-nav .ant-tabs-nav-add:focus{color:#096dd9}.ant-tabs-extra-content{flex:none}.ant-tabs-centered>.ant-tabs-nav .ant-tabs-nav-wrap:not([class*="ant-tabs-nav-wrap-ping"]),.ant-tabs-centered>div>.ant-tabs-nav .ant-tabs-nav-wrap:not([class*="ant-tabs-nav-wrap-ping"]){justify-content:center}.ant-tabs-ink-bar{position:absolute;background:#1890ff;pointer-events:none}.ant-tabs-tab{position:relative;display:inline-flex;align-items:center;padding:12px 0;font-size:14px;background:transparent;border:0;outline:none;cursor:pointer}.ant-tabs-tab-btn:focus,.ant-tabs-tab-remove:focus,.ant-tabs-tab-btn:active,.ant-tabs-tab-remove:active{color:#096dd9}.ant-tabs-tab-btn{outline:none;transition:all .3s}.ant-tabs-tab-remove{flex:none;margin-right:-4px;margin-left:8px;color:#00000073;font-size:12px;background:transparent;border:none;outline:none;cursor:pointer;transition:all .3s}.ant-tabs-tab-remove:hover{color:#000000d9}.ant-tabs-tab:hover{color:#40a9ff}.ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn{color:#1890ff;text-shadow:0 0 .25px currentcolor}.ant-tabs-tab.ant-tabs-tab-disabled{color:#00000040;cursor:not-allowed}.ant-tabs-tab.ant-tabs-tab-disabled .ant-tabs-tab-btn:focus,.ant-tabs-tab.ant-tabs-tab-disabled .ant-tabs-tab-remove:focus,.ant-tabs-tab.ant-tabs-tab-disabled .ant-tabs-tab-btn:active,.ant-tabs-tab.ant-tabs-tab-disabled .ant-tabs-tab-remove:active{color:#00000040}.ant-tabs-tab .ant-tabs-tab-remove .anticon{margin:0}.ant-tabs-tab .anticon{margin-right:12px}.ant-tabs-tab+.ant-tabs-tab{margin:0 0 0 32px}.ant-tabs-content{position:relative;width:100%}.ant-tabs-content-holder{flex:auto;min-width:0;min-height:0}.ant-tabs-tabpane{outline:none}.ant-tabs-tabpane-hidden{display:none}.ant-tabs-switch-appear,.ant-tabs-switch-enter{transition:none}.ant-tabs-switch-appear-start,.ant-tabs-switch-enter-start{opacity:0}.ant-tabs-switch-appear-active,.ant-tabs-switch-enter-active{opacity:1;transition:opacity .3s}.ant-tabs-switch-leave{position:absolute;transition:none;inset:0}.ant-tabs-switch-leave-start{opacity:1}.ant-tabs-switch-leave-active{opacity:0;transition:opacity .3s}.ant-carousel{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum"}.ant-carousel .slick-slider{position:relative;display:block;box-sizing:border-box;touch-action:pan-y;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.ant-carousel .slick-list{position:relative;display:block;margin:0;padding:0;overflow:hidden}.ant-carousel .slick-list:focus{outline:none}.ant-carousel .slick-list.dragging{cursor:pointer}.ant-carousel .slick-list .slick-slide{pointer-events:none}.ant-carousel .slick-list .slick-slide input.ant-radio-input,.ant-carousel .slick-list .slick-slide input.ant-checkbox-input{visibility:hidden}.ant-carousel .slick-list .slick-slide.slick-active{pointer-events:auto}.ant-carousel .slick-list .slick-slide.slick-active input.ant-radio-input,.ant-carousel .slick-list .slick-slide.slick-active input.ant-checkbox-input{visibility:visible}.ant-carousel .slick-list .slick-slide>div>div{vertical-align:bottom}.ant-carousel .slick-slider .slick-track,.ant-carousel .slick-slider .slick-list{transform:translateZ(0);touch-action:pan-y}.ant-carousel .slick-track{position:relative;top:0;left:0;display:block}.ant-carousel .slick-track:before,.ant-carousel .slick-track:after{display:table;content:""}.ant-carousel .slick-track:after{clear:both}.slick-loading .ant-carousel .slick-track{visibility:hidden}.ant-carousel .slick-slide{display:none;float:left;height:100%;min-height:1px}.ant-carousel .slick-slide img{display:block}.ant-carousel .slick-slide.slick-loading img{display:none}.ant-carousel .slick-slide.dragging img{pointer-events:none}.ant-carousel .slick-initialized .slick-slide{display:block}.ant-carousel .slick-loading .slick-slide{visibility:hidden}.ant-carousel .slick-vertical .slick-slide{display:block;height:auto}.ant-carousel .slick-arrow.slick-hidden{display:none}.ant-carousel .slick-prev,.ant-carousel .slick-next{position:absolute;top:50%;display:block;width:20px;height:20px;margin-top:-10px;padding:0;color:transparent;font-size:0;line-height:0;background:transparent;border:0;outline:none;cursor:pointer}.ant-carousel .slick-prev:hover,.ant-carousel .slick-next:hover,.ant-carousel .slick-prev:focus,.ant-carousel .slick-next:focus{color:transparent;background:transparent;outline:none}.ant-carousel .slick-prev:hover:before,.ant-carousel .slick-next:hover:before,.ant-carousel .slick-prev:focus:before,.ant-carousel .slick-next:focus:before{opacity:1}.ant-carousel .slick-prev.slick-disabled:before,.ant-carousel .slick-next.slick-disabled:before{opacity:.25}.ant-carousel .slick-prev{left:-25px}.ant-carousel .slick-prev:before{content:"\\2190"}.ant-carousel .slick-next{right:-25px}.ant-carousel .slick-next:before{content:"\\2192"}.ant-carousel .slick-dots{position:absolute;right:0;bottom:0;left:0;z-index:15;display:flex!important;justify-content:center;margin-right:15%;margin-bottom:0;margin-left:15%;padding-left:0;list-style:none}.ant-carousel .slick-dots-bottom{bottom:12px}.ant-carousel .slick-dots-top{top:12px;bottom:auto}.ant-carousel .slick-dots li{position:relative;display:inline-block;flex:0 1 auto;box-sizing:content-box;width:16px;height:3px;margin:0 4px;padding:0;text-align:center;text-indent:-999px;vertical-align:top;transition:all .5s}.ant-carousel .slick-dots li button{position:relative;display:block;width:100%;height:3px;padding:0;color:transparent;font-size:0;background:#fff;border:0;border-radius:1px;outline:none;cursor:pointer;opacity:.3;transition:all .5s}.ant-carousel .slick-dots li button:hover,.ant-carousel .slick-dots li button:focus{opacity:.75}.ant-carousel .slick-dots li button:after{position:absolute;inset:-4px;content:""}.ant-carousel .slick-dots li.slick-active{width:24px}.ant-carousel .slick-dots li.slick-active button{background:#fff;opacity:1}.ant-carousel .slick-dots li.slick-active:hover,.ant-carousel .slick-dots li.slick-active:focus{opacity:1}.ant-carousel-vertical .slick-dots{top:50%;bottom:auto;flex-direction:column;width:3px;height:auto;margin:0;transform:translateY(-50%)}.ant-carousel-vertical .slick-dots-left{right:auto;left:12px}.ant-carousel-vertical .slick-dots-right{right:12px;left:auto}.ant-carousel-vertical .slick-dots li{width:3px;height:16px;margin:4px 0;vertical-align:baseline}.ant-carousel-vertical .slick-dots li button{width:3px;height:16px}.ant-carousel-vertical .slick-dots li.slick-active,.ant-carousel-vertical .slick-dots li.slick-active button{width:3px;height:24px}.ant-carousel-rtl{direction:rtl}.ant-carousel-rtl .ant-carousel .slick-track{right:0;left:auto}.ant-carousel-rtl .ant-carousel .slick-prev{right:-25px;left:auto}.ant-carousel-rtl .ant-carousel .slick-prev:before{content:"\\2192"}.ant-carousel-rtl .ant-carousel .slick-next{right:auto;left:-25px}.ant-carousel-rtl .ant-carousel .slick-next:before{content:"\\2190"}.ant-carousel-rtl.ant-carousel .slick-dots{flex-direction:row-reverse}.ant-carousel-rtl.ant-carousel-vertical .slick-dots{flex-direction:column}.ant-cascader-checkbox{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;top:.2em;line-height:1;white-space:nowrap;outline:none;cursor:pointer}.ant-cascader-checkbox-wrapper:hover .ant-cascader-checkbox-inner,.ant-cascader-checkbox:hover .ant-cascader-checkbox-inner,.ant-cascader-checkbox-input:focus+.ant-cascader-checkbox-inner{border-color:#1890ff}.ant-cascader-checkbox-checked:after{position:absolute;top:0;left:0;width:100%;height:100%;border:1px solid #1890ff;border-radius:2px;visibility:hidden;animation:antCheckboxEffect .36s ease-in-out;animation-fill-mode:backwards;content:""}.ant-cascader-checkbox:hover:after,.ant-cascader-checkbox-wrapper:hover .ant-cascader-checkbox:after{visibility:visible}.ant-cascader-checkbox-inner{position:relative;top:0;left:0;display:block;width:16px;height:16px;direction:ltr;background-color:#fff;border:1px solid #d9d9d9;border-radius:2px;border-collapse:separate;transition:all .3s}.ant-cascader-checkbox-inner:after{position:absolute;top:50%;left:21.5%;display:table;width:5.71428571px;height:9.14285714px;border:2px solid #fff;border-top:0;border-left:0;transform:rotate(45deg) scale(0) translate(-50%,-50%);opacity:0;transition:all .1s cubic-bezier(.71,-.46,.88,.6),opacity .1s;content:" "}.ant-cascader-checkbox-input{position:absolute;inset:0;z-index:1;width:100%;height:100%;cursor:pointer;opacity:0}.ant-cascader-checkbox-checked .ant-cascader-checkbox-inner:after{position:absolute;display:table;border:2px solid #fff;border-top:0;border-left:0;transform:rotate(45deg) scale(1) translate(-50%,-50%);opacity:1;transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;content:" "}.ant-cascader-checkbox-checked .ant-cascader-checkbox-inner{background-color:#1890ff;border-color:#1890ff}.ant-cascader-checkbox-disabled{cursor:not-allowed}.ant-cascader-checkbox-disabled.ant-cascader-checkbox-checked .ant-cascader-checkbox-inner:after{border-color:#00000040;animation-name:none}.ant-cascader-checkbox-disabled .ant-cascader-checkbox-input{cursor:not-allowed;pointer-events:none}.ant-cascader-checkbox-disabled .ant-cascader-checkbox-inner{background-color:#f5f5f5;border-color:#d9d9d9!important}.ant-cascader-checkbox-disabled .ant-cascader-checkbox-inner:after{border-color:#f5f5f5;border-collapse:separate;animation-name:none}.ant-cascader-checkbox-disabled+span{color:#00000040;cursor:not-allowed}.ant-cascader-checkbox-disabled:hover:after,.ant-cascader-checkbox-wrapper:hover .ant-cascader-checkbox-disabled:after{visibility:hidden}.ant-cascader-checkbox-wrapper{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";display:inline-flex;align-items:baseline;line-height:unset;cursor:pointer}.ant-cascader-checkbox-wrapper:after{display:inline-block;width:0;overflow:hidden;content:"\\a0"}.ant-cascader-checkbox-wrapper.ant-cascader-checkbox-wrapper-disabled{cursor:not-allowed}.ant-cascader-checkbox-wrapper+.ant-cascader-checkbox-wrapper{margin-left:8px}.ant-cascader-checkbox-wrapper.ant-cascader-checkbox-wrapper-in-form-item input[type=checkbox]{width:14px;height:14px}.ant-cascader-checkbox+span{padding-right:8px;padding-left:8px}.ant-cascader-checkbox-group{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";display:inline-block}.ant-cascader-checkbox-group-item{margin-right:8px}.ant-cascader-checkbox-group-item:last-child{margin-right:0}.ant-cascader-checkbox-group-item+.ant-cascader-checkbox-group-item{margin-left:0}.ant-cascader-checkbox-indeterminate .ant-cascader-checkbox-inner{background-color:#fff;border-color:#d9d9d9}.ant-cascader-checkbox-indeterminate .ant-cascader-checkbox-inner:after{top:50%;left:50%;width:8px;height:8px;background-color:#1890ff;border:0;transform:translate(-50%,-50%) scale(1);opacity:1;content:" "}.ant-cascader-checkbox-indeterminate.ant-cascader-checkbox-disabled .ant-cascader-checkbox-inner:after{background-color:#00000040;border-color:#00000040}.ant-cascader{width:184px}.ant-cascader-checkbox{top:0;margin-right:8px}.ant-cascader-menus{display:flex;flex-wrap:nowrap;align-items:flex-start}.ant-cascader-menus.ant-cascader-menu-empty .ant-cascader-menu{width:100%;height:auto}.ant-cascader-menu{flex-grow:1;min-width:111px;height:180px;margin:-4px 0;padding:4px 0;overflow:auto;vertical-align:top;list-style:none;border-right:1px solid #f0f0f0;-ms-overflow-style:-ms-autohiding-scrollbar}.ant-cascader-menu-item{display:flex;flex-wrap:nowrap;align-items:center;padding:5px 12px;overflow:hidden;line-height:22px;white-space:nowrap;text-overflow:ellipsis;cursor:pointer;transition:all .3s}.ant-cascader-menu-item:hover{background:#f5f5f5}.ant-cascader-menu-item-disabled{color:#00000040;cursor:not-allowed}.ant-cascader-menu-item-disabled:hover{background:transparent}.ant-cascader-menu-empty .ant-cascader-menu-item{color:#00000040;cursor:default;pointer-events:none}.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled),.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled):hover{font-weight:600;background-color:#e6f7ff}.ant-cascader-menu-item-content{flex:auto}.ant-cascader-menu-item-expand .ant-cascader-menu-item-expand-icon,.ant-cascader-menu-item-loading-icon{margin-left:4px;color:#00000073;font-size:10px}.ant-cascader-menu-item-disabled.ant-cascader-menu-item-expand .ant-cascader-menu-item-expand-icon,.ant-cascader-menu-item-disabled.ant-cascader-menu-item-loading-icon{color:#00000040}.ant-cascader-menu-item-keyword{color:#ff4d4f}.ant-cascader-compact-item:not(.ant-cascader-compact-last-item):not(.ant-cascader-compact-item-rtl){margin-right:-1px}.ant-cascader-compact-item:not(.ant-cascader-compact-last-item).ant-cascader-compact-item-rtl{margin-left:-1px}.ant-cascader-compact-item:hover,.ant-cascader-compact-item:focus,.ant-cascader-compact-item:active{z-index:2}.ant-cascader-compact-item[disabled]{z-index:0}.ant-cascader-compact-item:not(.ant-cascader-compact-first-item):not(.ant-cascader-compact-last-item).ant-cascader{border-radius:0}.ant-cascader-compact-item.ant-cascader.ant-cascader-compact-first-item:not(.ant-cascader-compact-last-item):not(.ant-cascader-compact-item-rtl){border-top-right-radius:0;border-bottom-right-radius:0}.ant-cascader-compact-item.ant-cascader.ant-cascader-compact-last-item:not(.ant-cascader-compact-first-item):not(.ant-cascader-compact-item-rtl){border-top-left-radius:0;border-bottom-left-radius:0}.ant-cascader-compact-item.ant-cascader.ant-cascader-compact-item-rtl.ant-cascader-compact-first-item:not(.ant-cascader-compact-last-item){border-top-left-radius:0;border-bottom-left-radius:0}.ant-cascader-compact-item.ant-cascader.ant-cascader-compact-item-rtl.ant-cascader-compact-last-item:not(.ant-cascader-compact-first-item){border-top-right-radius:0;border-bottom-right-radius:0}.ant-cascader-rtl .ant-cascader-menu-item-expand-icon,.ant-cascader-rtl .ant-cascader-menu-item-loading-icon{margin-right:4px;margin-left:0}.ant-cascader-rtl .ant-cascader-checkbox{top:0;margin-right:0;margin-left:8px}.ant-checkbox{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;top:.2em;line-height:1;white-space:nowrap;outline:none;cursor:pointer}.ant-checkbox-wrapper:hover .ant-checkbox-inner,.ant-checkbox:hover .ant-checkbox-inner,.ant-checkbox-input:focus+.ant-checkbox-inner{border-color:#1890ff}.ant-checkbox-checked:after{position:absolute;top:0;left:0;width:100%;height:100%;border:1px solid #1890ff;border-radius:2px;visibility:hidden;animation:antCheckboxEffect .36s ease-in-out;animation-fill-mode:backwards;content:""}.ant-checkbox:hover:after,.ant-checkbox-wrapper:hover .ant-checkbox:after{visibility:visible}.ant-checkbox-inner{position:relative;top:0;left:0;display:block;width:16px;height:16px;direction:ltr;background-color:#fff;border:1px solid #d9d9d9;border-radius:2px;border-collapse:separate;transition:all .3s}.ant-checkbox-inner:after{position:absolute;top:50%;left:21.5%;display:table;width:5.71428571px;height:9.14285714px;border:2px solid #fff;border-top:0;border-left:0;transform:rotate(45deg) scale(0) translate(-50%,-50%);opacity:0;transition:all .1s cubic-bezier(.71,-.46,.88,.6),opacity .1s;content:" "}.ant-checkbox-input{position:absolute;inset:0;z-index:1;width:100%;height:100%;cursor:pointer;opacity:0}.ant-checkbox-checked .ant-checkbox-inner:after{position:absolute;display:table;border:2px solid #fff;border-top:0;border-left:0;transform:rotate(45deg) scale(1) translate(-50%,-50%);opacity:1;transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;content:" "}.ant-checkbox-checked .ant-checkbox-inner{background-color:#1890ff;border-color:#1890ff}.ant-checkbox-disabled{cursor:not-allowed}.ant-checkbox-disabled.ant-checkbox-checked .ant-checkbox-inner:after{border-color:#00000040;animation-name:none}.ant-checkbox-disabled .ant-checkbox-input{cursor:not-allowed;pointer-events:none}.ant-checkbox-disabled .ant-checkbox-inner{background-color:#f5f5f5;border-color:#d9d9d9!important}.ant-checkbox-disabled .ant-checkbox-inner:after{border-color:#f5f5f5;border-collapse:separate;animation-name:none}.ant-checkbox-disabled+span{color:#00000040;cursor:not-allowed}.ant-checkbox-disabled:hover:after,.ant-checkbox-wrapper:hover .ant-checkbox-disabled:after{visibility:hidden}.ant-checkbox-wrapper{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";display:inline-flex;align-items:baseline;line-height:unset;cursor:pointer}.ant-checkbox-wrapper:after{display:inline-block;width:0;overflow:hidden;content:"\\a0"}.ant-checkbox-wrapper.ant-checkbox-wrapper-disabled{cursor:not-allowed}.ant-checkbox-wrapper+.ant-checkbox-wrapper{margin-left:8px}.ant-checkbox-wrapper.ant-checkbox-wrapper-in-form-item input[type=checkbox]{width:14px;height:14px}.ant-checkbox+span{padding-right:8px;padding-left:8px}.ant-checkbox-group{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";display:inline-block}.ant-checkbox-group-item{margin-right:8px}.ant-checkbox-group-item:last-child{margin-right:0}.ant-checkbox-group-item+.ant-checkbox-group-item{margin-left:0}.ant-checkbox-indeterminate .ant-checkbox-inner{background-color:#fff;border-color:#d9d9d9}.ant-checkbox-indeterminate .ant-checkbox-inner:after{top:50%;left:50%;width:8px;height:8px;background-color:#1890ff;border:0;transform:translate(-50%,-50%) scale(1);opacity:1;content:" "}.ant-checkbox-indeterminate.ant-checkbox-disabled .ant-checkbox-inner:after{background-color:#00000040;border-color:#00000040}.ant-checkbox-rtl{direction:rtl}.ant-checkbox-group-rtl .ant-checkbox-group-item{margin-right:0;margin-left:8px}.ant-checkbox-group-rtl .ant-checkbox-group-item:last-child{margin-left:0!important}.ant-checkbox-group-rtl .ant-checkbox-group-item+.ant-checkbox-group-item{margin-left:8px}.ant-row{display:flex;flex-flow:row wrap;min-width:0}.ant-row:before,.ant-row:after{display:flex}.ant-row-no-wrap{flex-wrap:nowrap}.ant-row-start{justify-content:flex-start}.ant-row-center{justify-content:center}.ant-row-end{justify-content:flex-end}.ant-row-space-between{justify-content:space-between}.ant-row-space-around{justify-content:space-around}.ant-row-space-evenly{justify-content:space-evenly}.ant-row-top{align-items:flex-start}.ant-row-middle{align-items:center}.ant-row-bottom{align-items:flex-end}.ant-col{position:relative;max-width:100%;min-height:1px}.ant-col-24{display:block;flex:0 0 100%;max-width:100%}.ant-col-push-24{left:100%}.ant-col-pull-24{right:100%}.ant-col-offset-24{margin-left:100%}.ant-col-order-24{order:24}.ant-col-23{display:block;flex:0 0 95.83333333%;max-width:95.83333333%}.ant-col-push-23{left:95.83333333%}.ant-col-pull-23{right:95.83333333%}.ant-col-offset-23{margin-left:95.83333333%}.ant-col-order-23{order:23}.ant-col-22{display:block;flex:0 0 91.66666667%;max-width:91.66666667%}.ant-col-push-22{left:91.66666667%}.ant-col-pull-22{right:91.66666667%}.ant-col-offset-22{margin-left:91.66666667%}.ant-col-order-22{order:22}.ant-col-21{display:block;flex:0 0 87.5%;max-width:87.5%}.ant-col-push-21{left:87.5%}.ant-col-pull-21{right:87.5%}.ant-col-offset-21{margin-left:87.5%}.ant-col-order-21{order:21}.ant-col-20{display:block;flex:0 0 83.33333333%;max-width:83.33333333%}.ant-col-push-20{left:83.33333333%}.ant-col-pull-20{right:83.33333333%}.ant-col-offset-20{margin-left:83.33333333%}.ant-col-order-20{order:20}.ant-col-19{display:block;flex:0 0 79.16666667%;max-width:79.16666667%}.ant-col-push-19{left:79.16666667%}.ant-col-pull-19{right:79.16666667%}.ant-col-offset-19{margin-left:79.16666667%}.ant-col-order-19{order:19}.ant-col-18{display:block;flex:0 0 75%;max-width:75%}.ant-col-push-18{left:75%}.ant-col-pull-18{right:75%}.ant-col-offset-18{margin-left:75%}.ant-col-order-18{order:18}.ant-col-17{display:block;flex:0 0 70.83333333%;max-width:70.83333333%}.ant-col-push-17{left:70.83333333%}.ant-col-pull-17{right:70.83333333%}.ant-col-offset-17{margin-left:70.83333333%}.ant-col-order-17{order:17}.ant-col-16{display:block;flex:0 0 66.66666667%;max-width:66.66666667%}.ant-col-push-16{left:66.66666667%}.ant-col-pull-16{right:66.66666667%}.ant-col-offset-16{margin-left:66.66666667%}.ant-col-order-16{order:16}.ant-col-15{display:block;flex:0 0 62.5%;max-width:62.5%}.ant-col-push-15{left:62.5%}.ant-col-pull-15{right:62.5%}.ant-col-offset-15{margin-left:62.5%}.ant-col-order-15{order:15}.ant-col-14{display:block;flex:0 0 58.33333333%;max-width:58.33333333%}.ant-col-push-14{left:58.33333333%}.ant-col-pull-14{right:58.33333333%}.ant-col-offset-14{margin-left:58.33333333%}.ant-col-order-14{order:14}.ant-col-13{display:block;flex:0 0 54.16666667%;max-width:54.16666667%}.ant-col-push-13{left:54.16666667%}.ant-col-pull-13{right:54.16666667%}.ant-col-offset-13{margin-left:54.16666667%}.ant-col-order-13{order:13}.ant-col-12{display:block;flex:0 0 50%;max-width:50%}.ant-col-push-12{left:50%}.ant-col-pull-12{right:50%}.ant-col-offset-12{margin-left:50%}.ant-col-order-12{order:12}.ant-col-11{display:block;flex:0 0 45.83333333%;max-width:45.83333333%}.ant-col-push-11{left:45.83333333%}.ant-col-pull-11{right:45.83333333%}.ant-col-offset-11{margin-left:45.83333333%}.ant-col-order-11{order:11}.ant-col-10{display:block;flex:0 0 41.66666667%;max-width:41.66666667%}.ant-col-push-10{left:41.66666667%}.ant-col-pull-10{right:41.66666667%}.ant-col-offset-10{margin-left:41.66666667%}.ant-col-order-10{order:10}.ant-col-9{display:block;flex:0 0 37.5%;max-width:37.5%}.ant-col-push-9{left:37.5%}.ant-col-pull-9{right:37.5%}.ant-col-offset-9{margin-left:37.5%}.ant-col-order-9{order:9}.ant-col-8{display:block;flex:0 0 33.33333333%;max-width:33.33333333%}.ant-col-push-8{left:33.33333333%}.ant-col-pull-8{right:33.33333333%}.ant-col-offset-8{margin-left:33.33333333%}.ant-col-order-8{order:8}.ant-col-7{display:block;flex:0 0 29.16666667%;max-width:29.16666667%}.ant-col-push-7{left:29.16666667%}.ant-col-pull-7{right:29.16666667%}.ant-col-offset-7{margin-left:29.16666667%}.ant-col-order-7{order:7}.ant-col-6{display:block;flex:0 0 25%;max-width:25%}.ant-col-push-6{left:25%}.ant-col-pull-6{right:25%}.ant-col-offset-6{margin-left:25%}.ant-col-order-6{order:6}.ant-col-5{display:block;flex:0 0 20.83333333%;max-width:20.83333333%}.ant-col-push-5{left:20.83333333%}.ant-col-pull-5{right:20.83333333%}.ant-col-offset-5{margin-left:20.83333333%}.ant-col-order-5{order:5}.ant-col-4{display:block;flex:0 0 16.66666667%;max-width:16.66666667%}.ant-col-push-4{left:16.66666667%}.ant-col-pull-4{right:16.66666667%}.ant-col-offset-4{margin-left:16.66666667%}.ant-col-order-4{order:4}.ant-col-3{display:block;flex:0 0 12.5%;max-width:12.5%}.ant-col-push-3{left:12.5%}.ant-col-pull-3{right:12.5%}.ant-col-offset-3{margin-left:12.5%}.ant-col-order-3{order:3}.ant-col-2{display:block;flex:0 0 8.33333333%;max-width:8.33333333%}.ant-col-push-2{left:8.33333333%}.ant-col-pull-2{right:8.33333333%}.ant-col-offset-2{margin-left:8.33333333%}.ant-col-order-2{order:2}.ant-col-1{display:block;flex:0 0 4.16666667%;max-width:4.16666667%}.ant-col-push-1{left:4.16666667%}.ant-col-pull-1{right:4.16666667%}.ant-col-offset-1{margin-left:4.16666667%}.ant-col-order-1{order:1}.ant-col-0{display:none}.ant-col-offset-0{margin-left:0}.ant-col-order-0{order:0}.ant-col-offset-0.ant-col-rtl{margin-right:0}.ant-col-push-1.ant-col-rtl{right:4.16666667%;left:auto}.ant-col-pull-1.ant-col-rtl{right:auto;left:4.16666667%}.ant-col-offset-1.ant-col-rtl{margin-right:4.16666667%;margin-left:0}.ant-col-push-2.ant-col-rtl{right:8.33333333%;left:auto}.ant-col-pull-2.ant-col-rtl{right:auto;left:8.33333333%}.ant-col-offset-2.ant-col-rtl{margin-right:8.33333333%;margin-left:0}.ant-col-push-3.ant-col-rtl{right:12.5%;left:auto}.ant-col-pull-3.ant-col-rtl{right:auto;left:12.5%}.ant-col-offset-3.ant-col-rtl{margin-right:12.5%;margin-left:0}.ant-col-push-4.ant-col-rtl{right:16.66666667%;left:auto}.ant-col-pull-4.ant-col-rtl{right:auto;left:16.66666667%}.ant-col-offset-4.ant-col-rtl{margin-right:16.66666667%;margin-left:0}.ant-col-push-5.ant-col-rtl{right:20.83333333%;left:auto}.ant-col-pull-5.ant-col-rtl{right:auto;left:20.83333333%}.ant-col-offset-5.ant-col-rtl{margin-right:20.83333333%;margin-left:0}.ant-col-push-6.ant-col-rtl{right:25%;left:auto}.ant-col-pull-6.ant-col-rtl{right:auto;left:25%}.ant-col-offset-6.ant-col-rtl{margin-right:25%;margin-left:0}.ant-col-push-7.ant-col-rtl{right:29.16666667%;left:auto}.ant-col-pull-7.ant-col-rtl{right:auto;left:29.16666667%}.ant-col-offset-7.ant-col-rtl{margin-right:29.16666667%;margin-left:0}.ant-col-push-8.ant-col-rtl{right:33.33333333%;left:auto}.ant-col-pull-8.ant-col-rtl{right:auto;left:33.33333333%}.ant-col-offset-8.ant-col-rtl{margin-right:33.33333333%;margin-left:0}.ant-col-push-9.ant-col-rtl{right:37.5%;left:auto}.ant-col-pull-9.ant-col-rtl{right:auto;left:37.5%}.ant-col-offset-9.ant-col-rtl{margin-right:37.5%;margin-left:0}.ant-col-push-10.ant-col-rtl{right:41.66666667%;left:auto}.ant-col-pull-10.ant-col-rtl{right:auto;left:41.66666667%}.ant-col-offset-10.ant-col-rtl{margin-right:41.66666667%;margin-left:0}.ant-col-push-11.ant-col-rtl{right:45.83333333%;left:auto}.ant-col-pull-11.ant-col-rtl{right:auto;left:45.83333333%}.ant-col-offset-11.ant-col-rtl{margin-right:45.83333333%;margin-left:0}.ant-col-push-12.ant-col-rtl{right:50%;left:auto}.ant-col-pull-12.ant-col-rtl{right:auto;left:50%}.ant-col-offset-12.ant-col-rtl{margin-right:50%;margin-left:0}.ant-col-push-13.ant-col-rtl{right:54.16666667%;left:auto}.ant-col-pull-13.ant-col-rtl{right:auto;left:54.16666667%}.ant-col-offset-13.ant-col-rtl{margin-right:54.16666667%;margin-left:0}.ant-col-push-14.ant-col-rtl{right:58.33333333%;left:auto}.ant-col-pull-14.ant-col-rtl{right:auto;left:58.33333333%}.ant-col-offset-14.ant-col-rtl{margin-right:58.33333333%;margin-left:0}.ant-col-push-15.ant-col-rtl{right:62.5%;left:auto}.ant-col-pull-15.ant-col-rtl{right:auto;left:62.5%}.ant-col-offset-15.ant-col-rtl{margin-right:62.5%;margin-left:0}.ant-col-push-16.ant-col-rtl{right:66.66666667%;left:auto}.ant-col-pull-16.ant-col-rtl{right:auto;left:66.66666667%}.ant-col-offset-16.ant-col-rtl{margin-right:66.66666667%;margin-left:0}.ant-col-push-17.ant-col-rtl{right:70.83333333%;left:auto}.ant-col-pull-17.ant-col-rtl{right:auto;left:70.83333333%}.ant-col-offset-17.ant-col-rtl{margin-right:70.83333333%;margin-left:0}.ant-col-push-18.ant-col-rtl{right:75%;left:auto}.ant-col-pull-18.ant-col-rtl{right:auto;left:75%}.ant-col-offset-18.ant-col-rtl{margin-right:75%;margin-left:0}.ant-col-push-19.ant-col-rtl{right:79.16666667%;left:auto}.ant-col-pull-19.ant-col-rtl{right:auto;left:79.16666667%}.ant-col-offset-19.ant-col-rtl{margin-right:79.16666667%;margin-left:0}.ant-col-push-20.ant-col-rtl{right:83.33333333%;left:auto}.ant-col-pull-20.ant-col-rtl{right:auto;left:83.33333333%}.ant-col-offset-20.ant-col-rtl{margin-right:83.33333333%;margin-left:0}.ant-col-push-21.ant-col-rtl{right:87.5%;left:auto}.ant-col-pull-21.ant-col-rtl{right:auto;left:87.5%}.ant-col-offset-21.ant-col-rtl{margin-right:87.5%;margin-left:0}.ant-col-push-22.ant-col-rtl{right:91.66666667%;left:auto}.ant-col-pull-22.ant-col-rtl{right:auto;left:91.66666667%}.ant-col-offset-22.ant-col-rtl{margin-right:91.66666667%;margin-left:0}.ant-col-push-23.ant-col-rtl{right:95.83333333%;left:auto}.ant-col-pull-23.ant-col-rtl{right:auto;left:95.83333333%}.ant-col-offset-23.ant-col-rtl{margin-right:95.83333333%;margin-left:0}.ant-col-push-24.ant-col-rtl{right:100%;left:auto}.ant-col-pull-24.ant-col-rtl{right:auto;left:100%}.ant-col-offset-24.ant-col-rtl{margin-right:100%;margin-left:0}.ant-col-xs-24{display:block;flex:0 0 100%;max-width:100%}.ant-col-xs-push-24{left:100%}.ant-col-xs-pull-24{right:100%}.ant-col-xs-offset-24{margin-left:100%}.ant-col-xs-order-24{order:24}.ant-col-xs-23{display:block;flex:0 0 95.83333333%;max-width:95.83333333%}.ant-col-xs-push-23{left:95.83333333%}.ant-col-xs-pull-23{right:95.83333333%}.ant-col-xs-offset-23{margin-left:95.83333333%}.ant-col-xs-order-23{order:23}.ant-col-xs-22{display:block;flex:0 0 91.66666667%;max-width:91.66666667%}.ant-col-xs-push-22{left:91.66666667%}.ant-col-xs-pull-22{right:91.66666667%}.ant-col-xs-offset-22{margin-left:91.66666667%}.ant-col-xs-order-22{order:22}.ant-col-xs-21{display:block;flex:0 0 87.5%;max-width:87.5%}.ant-col-xs-push-21{left:87.5%}.ant-col-xs-pull-21{right:87.5%}.ant-col-xs-offset-21{margin-left:87.5%}.ant-col-xs-order-21{order:21}.ant-col-xs-20{display:block;flex:0 0 83.33333333%;max-width:83.33333333%}.ant-col-xs-push-20{left:83.33333333%}.ant-col-xs-pull-20{right:83.33333333%}.ant-col-xs-offset-20{margin-left:83.33333333%}.ant-col-xs-order-20{order:20}.ant-col-xs-19{display:block;flex:0 0 79.16666667%;max-width:79.16666667%}.ant-col-xs-push-19{left:79.16666667%}.ant-col-xs-pull-19{right:79.16666667%}.ant-col-xs-offset-19{margin-left:79.16666667%}.ant-col-xs-order-19{order:19}.ant-col-xs-18{display:block;flex:0 0 75%;max-width:75%}.ant-col-xs-push-18{left:75%}.ant-col-xs-pull-18{right:75%}.ant-col-xs-offset-18{margin-left:75%}.ant-col-xs-order-18{order:18}.ant-col-xs-17{display:block;flex:0 0 70.83333333%;max-width:70.83333333%}.ant-col-xs-push-17{left:70.83333333%}.ant-col-xs-pull-17{right:70.83333333%}.ant-col-xs-offset-17{margin-left:70.83333333%}.ant-col-xs-order-17{order:17}.ant-col-xs-16{display:block;flex:0 0 66.66666667%;max-width:66.66666667%}.ant-col-xs-push-16{left:66.66666667%}.ant-col-xs-pull-16{right:66.66666667%}.ant-col-xs-offset-16{margin-left:66.66666667%}.ant-col-xs-order-16{order:16}.ant-col-xs-15{display:block;flex:0 0 62.5%;max-width:62.5%}.ant-col-xs-push-15{left:62.5%}.ant-col-xs-pull-15{right:62.5%}.ant-col-xs-offset-15{margin-left:62.5%}.ant-col-xs-order-15{order:15}.ant-col-xs-14{display:block;flex:0 0 58.33333333%;max-width:58.33333333%}.ant-col-xs-push-14{left:58.33333333%}.ant-col-xs-pull-14{right:58.33333333%}.ant-col-xs-offset-14{margin-left:58.33333333%}.ant-col-xs-order-14{order:14}.ant-col-xs-13{display:block;flex:0 0 54.16666667%;max-width:54.16666667%}.ant-col-xs-push-13{left:54.16666667%}.ant-col-xs-pull-13{right:54.16666667%}.ant-col-xs-offset-13{margin-left:54.16666667%}.ant-col-xs-order-13{order:13}.ant-col-xs-12{display:block;flex:0 0 50%;max-width:50%}.ant-col-xs-push-12{left:50%}.ant-col-xs-pull-12{right:50%}.ant-col-xs-offset-12{margin-left:50%}.ant-col-xs-order-12{order:12}.ant-col-xs-11{display:block;flex:0 0 45.83333333%;max-width:45.83333333%}.ant-col-xs-push-11{left:45.83333333%}.ant-col-xs-pull-11{right:45.83333333%}.ant-col-xs-offset-11{margin-left:45.83333333%}.ant-col-xs-order-11{order:11}.ant-col-xs-10{display:block;flex:0 0 41.66666667%;max-width:41.66666667%}.ant-col-xs-push-10{left:41.66666667%}.ant-col-xs-pull-10{right:41.66666667%}.ant-col-xs-offset-10{margin-left:41.66666667%}.ant-col-xs-order-10{order:10}.ant-col-xs-9{display:block;flex:0 0 37.5%;max-width:37.5%}.ant-col-xs-push-9{left:37.5%}.ant-col-xs-pull-9{right:37.5%}.ant-col-xs-offset-9{margin-left:37.5%}.ant-col-xs-order-9{order:9}.ant-col-xs-8{display:block;flex:0 0 33.33333333%;max-width:33.33333333%}.ant-col-xs-push-8{left:33.33333333%}.ant-col-xs-pull-8{right:33.33333333%}.ant-col-xs-offset-8{margin-left:33.33333333%}.ant-col-xs-order-8{order:8}.ant-col-xs-7{display:block;flex:0 0 29.16666667%;max-width:29.16666667%}.ant-col-xs-push-7{left:29.16666667%}.ant-col-xs-pull-7{right:29.16666667%}.ant-col-xs-offset-7{margin-left:29.16666667%}.ant-col-xs-order-7{order:7}.ant-col-xs-6{display:block;flex:0 0 25%;max-width:25%}.ant-col-xs-push-6{left:25%}.ant-col-xs-pull-6{right:25%}.ant-col-xs-offset-6{margin-left:25%}.ant-col-xs-order-6{order:6}.ant-col-xs-5{display:block;flex:0 0 20.83333333%;max-width:20.83333333%}.ant-col-xs-push-5{left:20.83333333%}.ant-col-xs-pull-5{right:20.83333333%}.ant-col-xs-offset-5{margin-left:20.83333333%}.ant-col-xs-order-5{order:5}.ant-col-xs-4{display:block;flex:0 0 16.66666667%;max-width:16.66666667%}.ant-col-xs-push-4{left:16.66666667%}.ant-col-xs-pull-4{right:16.66666667%}.ant-col-xs-offset-4{margin-left:16.66666667%}.ant-col-xs-order-4{order:4}.ant-col-xs-3{display:block;flex:0 0 12.5%;max-width:12.5%}.ant-col-xs-push-3{left:12.5%}.ant-col-xs-pull-3{right:12.5%}.ant-col-xs-offset-3{margin-left:12.5%}.ant-col-xs-order-3{order:3}.ant-col-xs-2{display:block;flex:0 0 8.33333333%;max-width:8.33333333%}.ant-col-xs-push-2{left:8.33333333%}.ant-col-xs-pull-2{right:8.33333333%}.ant-col-xs-offset-2{margin-left:8.33333333%}.ant-col-xs-order-2{order:2}.ant-col-xs-1{display:block;flex:0 0 4.16666667%;max-width:4.16666667%}.ant-col-xs-push-1{left:4.16666667%}.ant-col-xs-pull-1{right:4.16666667%}.ant-col-xs-offset-1{margin-left:4.16666667%}.ant-col-xs-order-1{order:1}.ant-col-xs-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-xs-push-0{left:auto}.ant-col-xs-pull-0{right:auto}.ant-col-xs-offset-0{margin-left:0}.ant-col-xs-order-0{order:0}.ant-col-push-0.ant-col-rtl{right:auto}.ant-col-pull-0.ant-col-rtl{left:auto}.ant-col-xs-push-0.ant-col-rtl{right:auto}.ant-col-xs-pull-0.ant-col-rtl{left:auto}.ant-col-xs-offset-0.ant-col-rtl{margin-right:0}.ant-col-xs-push-1.ant-col-rtl{right:4.16666667%;left:auto}.ant-col-xs-pull-1.ant-col-rtl{right:auto;left:4.16666667%}.ant-col-xs-offset-1.ant-col-rtl{margin-right:4.16666667%;margin-left:0}.ant-col-xs-push-2.ant-col-rtl{right:8.33333333%;left:auto}.ant-col-xs-pull-2.ant-col-rtl{right:auto;left:8.33333333%}.ant-col-xs-offset-2.ant-col-rtl{margin-right:8.33333333%;margin-left:0}.ant-col-xs-push-3.ant-col-rtl{right:12.5%;left:auto}.ant-col-xs-pull-3.ant-col-rtl{right:auto;left:12.5%}.ant-col-xs-offset-3.ant-col-rtl{margin-right:12.5%;margin-left:0}.ant-col-xs-push-4.ant-col-rtl{right:16.66666667%;left:auto}.ant-col-xs-pull-4.ant-col-rtl{right:auto;left:16.66666667%}.ant-col-xs-offset-4.ant-col-rtl{margin-right:16.66666667%;margin-left:0}.ant-col-xs-push-5.ant-col-rtl{right:20.83333333%;left:auto}.ant-col-xs-pull-5.ant-col-rtl{right:auto;left:20.83333333%}.ant-col-xs-offset-5.ant-col-rtl{margin-right:20.83333333%;margin-left:0}.ant-col-xs-push-6.ant-col-rtl{right:25%;left:auto}.ant-col-xs-pull-6.ant-col-rtl{right:auto;left:25%}.ant-col-xs-offset-6.ant-col-rtl{margin-right:25%;margin-left:0}.ant-col-xs-push-7.ant-col-rtl{right:29.16666667%;left:auto}.ant-col-xs-pull-7.ant-col-rtl{right:auto;left:29.16666667%}.ant-col-xs-offset-7.ant-col-rtl{margin-right:29.16666667%;margin-left:0}.ant-col-xs-push-8.ant-col-rtl{right:33.33333333%;left:auto}.ant-col-xs-pull-8.ant-col-rtl{right:auto;left:33.33333333%}.ant-col-xs-offset-8.ant-col-rtl{margin-right:33.33333333%;margin-left:0}.ant-col-xs-push-9.ant-col-rtl{right:37.5%;left:auto}.ant-col-xs-pull-9.ant-col-rtl{right:auto;left:37.5%}.ant-col-xs-offset-9.ant-col-rtl{margin-right:37.5%;margin-left:0}.ant-col-xs-push-10.ant-col-rtl{right:41.66666667%;left:auto}.ant-col-xs-pull-10.ant-col-rtl{right:auto;left:41.66666667%}.ant-col-xs-offset-10.ant-col-rtl{margin-right:41.66666667%;margin-left:0}.ant-col-xs-push-11.ant-col-rtl{right:45.83333333%;left:auto}.ant-col-xs-pull-11.ant-col-rtl{right:auto;left:45.83333333%}.ant-col-xs-offset-11.ant-col-rtl{margin-right:45.83333333%;margin-left:0}.ant-col-xs-push-12.ant-col-rtl{right:50%;left:auto}.ant-col-xs-pull-12.ant-col-rtl{right:auto;left:50%}.ant-col-xs-offset-12.ant-col-rtl{margin-right:50%;margin-left:0}.ant-col-xs-push-13.ant-col-rtl{right:54.16666667%;left:auto}.ant-col-xs-pull-13.ant-col-rtl{right:auto;left:54.16666667%}.ant-col-xs-offset-13.ant-col-rtl{margin-right:54.16666667%;margin-left:0}.ant-col-xs-push-14.ant-col-rtl{right:58.33333333%;left:auto}.ant-col-xs-pull-14.ant-col-rtl{right:auto;left:58.33333333%}.ant-col-xs-offset-14.ant-col-rtl{margin-right:58.33333333%;margin-left:0}.ant-col-xs-push-15.ant-col-rtl{right:62.5%;left:auto}.ant-col-xs-pull-15.ant-col-rtl{right:auto;left:62.5%}.ant-col-xs-offset-15.ant-col-rtl{margin-right:62.5%;margin-left:0}.ant-col-xs-push-16.ant-col-rtl{right:66.66666667%;left:auto}.ant-col-xs-pull-16.ant-col-rtl{right:auto;left:66.66666667%}.ant-col-xs-offset-16.ant-col-rtl{margin-right:66.66666667%;margin-left:0}.ant-col-xs-push-17.ant-col-rtl{right:70.83333333%;left:auto}.ant-col-xs-pull-17.ant-col-rtl{right:auto;left:70.83333333%}.ant-col-xs-offset-17.ant-col-rtl{margin-right:70.83333333%;margin-left:0}.ant-col-xs-push-18.ant-col-rtl{right:75%;left:auto}.ant-col-xs-pull-18.ant-col-rtl{right:auto;left:75%}.ant-col-xs-offset-18.ant-col-rtl{margin-right:75%;margin-left:0}.ant-col-xs-push-19.ant-col-rtl{right:79.16666667%;left:auto}.ant-col-xs-pull-19.ant-col-rtl{right:auto;left:79.16666667%}.ant-col-xs-offset-19.ant-col-rtl{margin-right:79.16666667%;margin-left:0}.ant-col-xs-push-20.ant-col-rtl{right:83.33333333%;left:auto}.ant-col-xs-pull-20.ant-col-rtl{right:auto;left:83.33333333%}.ant-col-xs-offset-20.ant-col-rtl{margin-right:83.33333333%;margin-left:0}.ant-col-xs-push-21.ant-col-rtl{right:87.5%;left:auto}.ant-col-xs-pull-21.ant-col-rtl{right:auto;left:87.5%}.ant-col-xs-offset-21.ant-col-rtl{margin-right:87.5%;margin-left:0}.ant-col-xs-push-22.ant-col-rtl{right:91.66666667%;left:auto}.ant-col-xs-pull-22.ant-col-rtl{right:auto;left:91.66666667%}.ant-col-xs-offset-22.ant-col-rtl{margin-right:91.66666667%;margin-left:0}.ant-col-xs-push-23.ant-col-rtl{right:95.83333333%;left:auto}.ant-col-xs-pull-23.ant-col-rtl{right:auto;left:95.83333333%}.ant-col-xs-offset-23.ant-col-rtl{margin-right:95.83333333%;margin-left:0}.ant-col-xs-push-24.ant-col-rtl{right:100%;left:auto}.ant-col-xs-pull-24.ant-col-rtl{right:auto;left:100%}.ant-col-xs-offset-24.ant-col-rtl{margin-right:100%;margin-left:0}@media (min-width: 576px){.ant-col-sm-24{display:block;flex:0 0 100%;max-width:100%}.ant-col-sm-push-24{left:100%}.ant-col-sm-pull-24{right:100%}.ant-col-sm-offset-24{margin-left:100%}.ant-col-sm-order-24{order:24}.ant-col-sm-23{display:block;flex:0 0 95.83333333%;max-width:95.83333333%}.ant-col-sm-push-23{left:95.83333333%}.ant-col-sm-pull-23{right:95.83333333%}.ant-col-sm-offset-23{margin-left:95.83333333%}.ant-col-sm-order-23{order:23}.ant-col-sm-22{display:block;flex:0 0 91.66666667%;max-width:91.66666667%}.ant-col-sm-push-22{left:91.66666667%}.ant-col-sm-pull-22{right:91.66666667%}.ant-col-sm-offset-22{margin-left:91.66666667%}.ant-col-sm-order-22{order:22}.ant-col-sm-21{display:block;flex:0 0 87.5%;max-width:87.5%}.ant-col-sm-push-21{left:87.5%}.ant-col-sm-pull-21{right:87.5%}.ant-col-sm-offset-21{margin-left:87.5%}.ant-col-sm-order-21{order:21}.ant-col-sm-20{display:block;flex:0 0 83.33333333%;max-width:83.33333333%}.ant-col-sm-push-20{left:83.33333333%}.ant-col-sm-pull-20{right:83.33333333%}.ant-col-sm-offset-20{margin-left:83.33333333%}.ant-col-sm-order-20{order:20}.ant-col-sm-19{display:block;flex:0 0 79.16666667%;max-width:79.16666667%}.ant-col-sm-push-19{left:79.16666667%}.ant-col-sm-pull-19{right:79.16666667%}.ant-col-sm-offset-19{margin-left:79.16666667%}.ant-col-sm-order-19{order:19}.ant-col-sm-18{display:block;flex:0 0 75%;max-width:75%}.ant-col-sm-push-18{left:75%}.ant-col-sm-pull-18{right:75%}.ant-col-sm-offset-18{margin-left:75%}.ant-col-sm-order-18{order:18}.ant-col-sm-17{display:block;flex:0 0 70.83333333%;max-width:70.83333333%}.ant-col-sm-push-17{left:70.83333333%}.ant-col-sm-pull-17{right:70.83333333%}.ant-col-sm-offset-17{margin-left:70.83333333%}.ant-col-sm-order-17{order:17}.ant-col-sm-16{display:block;flex:0 0 66.66666667%;max-width:66.66666667%}.ant-col-sm-push-16{left:66.66666667%}.ant-col-sm-pull-16{right:66.66666667%}.ant-col-sm-offset-16{margin-left:66.66666667%}.ant-col-sm-order-16{order:16}.ant-col-sm-15{display:block;flex:0 0 62.5%;max-width:62.5%}.ant-col-sm-push-15{left:62.5%}.ant-col-sm-pull-15{right:62.5%}.ant-col-sm-offset-15{margin-left:62.5%}.ant-col-sm-order-15{order:15}.ant-col-sm-14{display:block;flex:0 0 58.33333333%;max-width:58.33333333%}.ant-col-sm-push-14{left:58.33333333%}.ant-col-sm-pull-14{right:58.33333333%}.ant-col-sm-offset-14{margin-left:58.33333333%}.ant-col-sm-order-14{order:14}.ant-col-sm-13{display:block;flex:0 0 54.16666667%;max-width:54.16666667%}.ant-col-sm-push-13{left:54.16666667%}.ant-col-sm-pull-13{right:54.16666667%}.ant-col-sm-offset-13{margin-left:54.16666667%}.ant-col-sm-order-13{order:13}.ant-col-sm-12{display:block;flex:0 0 50%;max-width:50%}.ant-col-sm-push-12{left:50%}.ant-col-sm-pull-12{right:50%}.ant-col-sm-offset-12{margin-left:50%}.ant-col-sm-order-12{order:12}.ant-col-sm-11{display:block;flex:0 0 45.83333333%;max-width:45.83333333%}.ant-col-sm-push-11{left:45.83333333%}.ant-col-sm-pull-11{right:45.83333333%}.ant-col-sm-offset-11{margin-left:45.83333333%}.ant-col-sm-order-11{order:11}.ant-col-sm-10{display:block;flex:0 0 41.66666667%;max-width:41.66666667%}.ant-col-sm-push-10{left:41.66666667%}.ant-col-sm-pull-10{right:41.66666667%}.ant-col-sm-offset-10{margin-left:41.66666667%}.ant-col-sm-order-10{order:10}.ant-col-sm-9{display:block;flex:0 0 37.5%;max-width:37.5%}.ant-col-sm-push-9{left:37.5%}.ant-col-sm-pull-9{right:37.5%}.ant-col-sm-offset-9{margin-left:37.5%}.ant-col-sm-order-9{order:9}.ant-col-sm-8{display:block;flex:0 0 33.33333333%;max-width:33.33333333%}.ant-col-sm-push-8{left:33.33333333%}.ant-col-sm-pull-8{right:33.33333333%}.ant-col-sm-offset-8{margin-left:33.33333333%}.ant-col-sm-order-8{order:8}.ant-col-sm-7{display:block;flex:0 0 29.16666667%;max-width:29.16666667%}.ant-col-sm-push-7{left:29.16666667%}.ant-col-sm-pull-7{right:29.16666667%}.ant-col-sm-offset-7{margin-left:29.16666667%}.ant-col-sm-order-7{order:7}.ant-col-sm-6{display:block;flex:0 0 25%;max-width:25%}.ant-col-sm-push-6{left:25%}.ant-col-sm-pull-6{right:25%}.ant-col-sm-offset-6{margin-left:25%}.ant-col-sm-order-6{order:6}.ant-col-sm-5{display:block;flex:0 0 20.83333333%;max-width:20.83333333%}.ant-col-sm-push-5{left:20.83333333%}.ant-col-sm-pull-5{right:20.83333333%}.ant-col-sm-offset-5{margin-left:20.83333333%}.ant-col-sm-order-5{order:5}.ant-col-sm-4{display:block;flex:0 0 16.66666667%;max-width:16.66666667%}.ant-col-sm-push-4{left:16.66666667%}.ant-col-sm-pull-4{right:16.66666667%}.ant-col-sm-offset-4{margin-left:16.66666667%}.ant-col-sm-order-4{order:4}.ant-col-sm-3{display:block;flex:0 0 12.5%;max-width:12.5%}.ant-col-sm-push-3{left:12.5%}.ant-col-sm-pull-3{right:12.5%}.ant-col-sm-offset-3{margin-left:12.5%}.ant-col-sm-order-3{order:3}.ant-col-sm-2{display:block;flex:0 0 8.33333333%;max-width:8.33333333%}.ant-col-sm-push-2{left:8.33333333%}.ant-col-sm-pull-2{right:8.33333333%}.ant-col-sm-offset-2{margin-left:8.33333333%}.ant-col-sm-order-2{order:2}.ant-col-sm-1{display:block;flex:0 0 4.16666667%;max-width:4.16666667%}.ant-col-sm-push-1{left:4.16666667%}.ant-col-sm-pull-1{right:4.16666667%}.ant-col-sm-offset-1{margin-left:4.16666667%}.ant-col-sm-order-1{order:1}.ant-col-sm-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-sm-push-0{left:auto}.ant-col-sm-pull-0{right:auto}.ant-col-sm-offset-0{margin-left:0}.ant-col-sm-order-0{order:0}.ant-col-push-0.ant-col-rtl{right:auto}.ant-col-pull-0.ant-col-rtl{left:auto}.ant-col-sm-push-0.ant-col-rtl{right:auto}.ant-col-sm-pull-0.ant-col-rtl{left:auto}.ant-col-sm-offset-0.ant-col-rtl{margin-right:0}.ant-col-sm-push-1.ant-col-rtl{right:4.16666667%;left:auto}.ant-col-sm-pull-1.ant-col-rtl{right:auto;left:4.16666667%}.ant-col-sm-offset-1.ant-col-rtl{margin-right:4.16666667%;margin-left:0}.ant-col-sm-push-2.ant-col-rtl{right:8.33333333%;left:auto}.ant-col-sm-pull-2.ant-col-rtl{right:auto;left:8.33333333%}.ant-col-sm-offset-2.ant-col-rtl{margin-right:8.33333333%;margin-left:0}.ant-col-sm-push-3.ant-col-rtl{right:12.5%;left:auto}.ant-col-sm-pull-3.ant-col-rtl{right:auto;left:12.5%}.ant-col-sm-offset-3.ant-col-rtl{margin-right:12.5%;margin-left:0}.ant-col-sm-push-4.ant-col-rtl{right:16.66666667%;left:auto}.ant-col-sm-pull-4.ant-col-rtl{right:auto;left:16.66666667%}.ant-col-sm-offset-4.ant-col-rtl{margin-right:16.66666667%;margin-left:0}.ant-col-sm-push-5.ant-col-rtl{right:20.83333333%;left:auto}.ant-col-sm-pull-5.ant-col-rtl{right:auto;left:20.83333333%}.ant-col-sm-offset-5.ant-col-rtl{margin-right:20.83333333%;margin-left:0}.ant-col-sm-push-6.ant-col-rtl{right:25%;left:auto}.ant-col-sm-pull-6.ant-col-rtl{right:auto;left:25%}.ant-col-sm-offset-6.ant-col-rtl{margin-right:25%;margin-left:0}.ant-col-sm-push-7.ant-col-rtl{right:29.16666667%;left:auto}.ant-col-sm-pull-7.ant-col-rtl{right:auto;left:29.16666667%}.ant-col-sm-offset-7.ant-col-rtl{margin-right:29.16666667%;margin-left:0}.ant-col-sm-push-8.ant-col-rtl{right:33.33333333%;left:auto}.ant-col-sm-pull-8.ant-col-rtl{right:auto;left:33.33333333%}.ant-col-sm-offset-8.ant-col-rtl{margin-right:33.33333333%;margin-left:0}.ant-col-sm-push-9.ant-col-rtl{right:37.5%;left:auto}.ant-col-sm-pull-9.ant-col-rtl{right:auto;left:37.5%}.ant-col-sm-offset-9.ant-col-rtl{margin-right:37.5%;margin-left:0}.ant-col-sm-push-10.ant-col-rtl{right:41.66666667%;left:auto}.ant-col-sm-pull-10.ant-col-rtl{right:auto;left:41.66666667%}.ant-col-sm-offset-10.ant-col-rtl{margin-right:41.66666667%;margin-left:0}.ant-col-sm-push-11.ant-col-rtl{right:45.83333333%;left:auto}.ant-col-sm-pull-11.ant-col-rtl{right:auto;left:45.83333333%}.ant-col-sm-offset-11.ant-col-rtl{margin-right:45.83333333%;margin-left:0}.ant-col-sm-push-12.ant-col-rtl{right:50%;left:auto}.ant-col-sm-pull-12.ant-col-rtl{right:auto;left:50%}.ant-col-sm-offset-12.ant-col-rtl{margin-right:50%;margin-left:0}.ant-col-sm-push-13.ant-col-rtl{right:54.16666667%;left:auto}.ant-col-sm-pull-13.ant-col-rtl{right:auto;left:54.16666667%}.ant-col-sm-offset-13.ant-col-rtl{margin-right:54.16666667%;margin-left:0}.ant-col-sm-push-14.ant-col-rtl{right:58.33333333%;left:auto}.ant-col-sm-pull-14.ant-col-rtl{right:auto;left:58.33333333%}.ant-col-sm-offset-14.ant-col-rtl{margin-right:58.33333333%;margin-left:0}.ant-col-sm-push-15.ant-col-rtl{right:62.5%;left:auto}.ant-col-sm-pull-15.ant-col-rtl{right:auto;left:62.5%}.ant-col-sm-offset-15.ant-col-rtl{margin-right:62.5%;margin-left:0}.ant-col-sm-push-16.ant-col-rtl{right:66.66666667%;left:auto}.ant-col-sm-pull-16.ant-col-rtl{right:auto;left:66.66666667%}.ant-col-sm-offset-16.ant-col-rtl{margin-right:66.66666667%;margin-left:0}.ant-col-sm-push-17.ant-col-rtl{right:70.83333333%;left:auto}.ant-col-sm-pull-17.ant-col-rtl{right:auto;left:70.83333333%}.ant-col-sm-offset-17.ant-col-rtl{margin-right:70.83333333%;margin-left:0}.ant-col-sm-push-18.ant-col-rtl{right:75%;left:auto}.ant-col-sm-pull-18.ant-col-rtl{right:auto;left:75%}.ant-col-sm-offset-18.ant-col-rtl{margin-right:75%;margin-left:0}.ant-col-sm-push-19.ant-col-rtl{right:79.16666667%;left:auto}.ant-col-sm-pull-19.ant-col-rtl{right:auto;left:79.16666667%}.ant-col-sm-offset-19.ant-col-rtl{margin-right:79.16666667%;margin-left:0}.ant-col-sm-push-20.ant-col-rtl{right:83.33333333%;left:auto}.ant-col-sm-pull-20.ant-col-rtl{right:auto;left:83.33333333%}.ant-col-sm-offset-20.ant-col-rtl{margin-right:83.33333333%;margin-left:0}.ant-col-sm-push-21.ant-col-rtl{right:87.5%;left:auto}.ant-col-sm-pull-21.ant-col-rtl{right:auto;left:87.5%}.ant-col-sm-offset-21.ant-col-rtl{margin-right:87.5%;margin-left:0}.ant-col-sm-push-22.ant-col-rtl{right:91.66666667%;left:auto}.ant-col-sm-pull-22.ant-col-rtl{right:auto;left:91.66666667%}.ant-col-sm-offset-22.ant-col-rtl{margin-right:91.66666667%;margin-left:0}.ant-col-sm-push-23.ant-col-rtl{right:95.83333333%;left:auto}.ant-col-sm-pull-23.ant-col-rtl{right:auto;left:95.83333333%}.ant-col-sm-offset-23.ant-col-rtl{margin-right:95.83333333%;margin-left:0}.ant-col-sm-push-24.ant-col-rtl{right:100%;left:auto}.ant-col-sm-pull-24.ant-col-rtl{right:auto;left:100%}.ant-col-sm-offset-24.ant-col-rtl{margin-right:100%;margin-left:0}}@media (min-width: 768px){.ant-col-md-24{display:block;flex:0 0 100%;max-width:100%}.ant-col-md-push-24{left:100%}.ant-col-md-pull-24{right:100%}.ant-col-md-offset-24{margin-left:100%}.ant-col-md-order-24{order:24}.ant-col-md-23{display:block;flex:0 0 95.83333333%;max-width:95.83333333%}.ant-col-md-push-23{left:95.83333333%}.ant-col-md-pull-23{right:95.83333333%}.ant-col-md-offset-23{margin-left:95.83333333%}.ant-col-md-order-23{order:23}.ant-col-md-22{display:block;flex:0 0 91.66666667%;max-width:91.66666667%}.ant-col-md-push-22{left:91.66666667%}.ant-col-md-pull-22{right:91.66666667%}.ant-col-md-offset-22{margin-left:91.66666667%}.ant-col-md-order-22{order:22}.ant-col-md-21{display:block;flex:0 0 87.5%;max-width:87.5%}.ant-col-md-push-21{left:87.5%}.ant-col-md-pull-21{right:87.5%}.ant-col-md-offset-21{margin-left:87.5%}.ant-col-md-order-21{order:21}.ant-col-md-20{display:block;flex:0 0 83.33333333%;max-width:83.33333333%}.ant-col-md-push-20{left:83.33333333%}.ant-col-md-pull-20{right:83.33333333%}.ant-col-md-offset-20{margin-left:83.33333333%}.ant-col-md-order-20{order:20}.ant-col-md-19{display:block;flex:0 0 79.16666667%;max-width:79.16666667%}.ant-col-md-push-19{left:79.16666667%}.ant-col-md-pull-19{right:79.16666667%}.ant-col-md-offset-19{margin-left:79.16666667%}.ant-col-md-order-19{order:19}.ant-col-md-18{display:block;flex:0 0 75%;max-width:75%}.ant-col-md-push-18{left:75%}.ant-col-md-pull-18{right:75%}.ant-col-md-offset-18{margin-left:75%}.ant-col-md-order-18{order:18}.ant-col-md-17{display:block;flex:0 0 70.83333333%;max-width:70.83333333%}.ant-col-md-push-17{left:70.83333333%}.ant-col-md-pull-17{right:70.83333333%}.ant-col-md-offset-17{margin-left:70.83333333%}.ant-col-md-order-17{order:17}.ant-col-md-16{display:block;flex:0 0 66.66666667%;max-width:66.66666667%}.ant-col-md-push-16{left:66.66666667%}.ant-col-md-pull-16{right:66.66666667%}.ant-col-md-offset-16{margin-left:66.66666667%}.ant-col-md-order-16{order:16}.ant-col-md-15{display:block;flex:0 0 62.5%;max-width:62.5%}.ant-col-md-push-15{left:62.5%}.ant-col-md-pull-15{right:62.5%}.ant-col-md-offset-15{margin-left:62.5%}.ant-col-md-order-15{order:15}.ant-col-md-14{display:block;flex:0 0 58.33333333%;max-width:58.33333333%}.ant-col-md-push-14{left:58.33333333%}.ant-col-md-pull-14{right:58.33333333%}.ant-col-md-offset-14{margin-left:58.33333333%}.ant-col-md-order-14{order:14}.ant-col-md-13{display:block;flex:0 0 54.16666667%;max-width:54.16666667%}.ant-col-md-push-13{left:54.16666667%}.ant-col-md-pull-13{right:54.16666667%}.ant-col-md-offset-13{margin-left:54.16666667%}.ant-col-md-order-13{order:13}.ant-col-md-12{display:block;flex:0 0 50%;max-width:50%}.ant-col-md-push-12{left:50%}.ant-col-md-pull-12{right:50%}.ant-col-md-offset-12{margin-left:50%}.ant-col-md-order-12{order:12}.ant-col-md-11{display:block;flex:0 0 45.83333333%;max-width:45.83333333%}.ant-col-md-push-11{left:45.83333333%}.ant-col-md-pull-11{right:45.83333333%}.ant-col-md-offset-11{margin-left:45.83333333%}.ant-col-md-order-11{order:11}.ant-col-md-10{display:block;flex:0 0 41.66666667%;max-width:41.66666667%}.ant-col-md-push-10{left:41.66666667%}.ant-col-md-pull-10{right:41.66666667%}.ant-col-md-offset-10{margin-left:41.66666667%}.ant-col-md-order-10{order:10}.ant-col-md-9{display:block;flex:0 0 37.5%;max-width:37.5%}.ant-col-md-push-9{left:37.5%}.ant-col-md-pull-9{right:37.5%}.ant-col-md-offset-9{margin-left:37.5%}.ant-col-md-order-9{order:9}.ant-col-md-8{display:block;flex:0 0 33.33333333%;max-width:33.33333333%}.ant-col-md-push-8{left:33.33333333%}.ant-col-md-pull-8{right:33.33333333%}.ant-col-md-offset-8{margin-left:33.33333333%}.ant-col-md-order-8{order:8}.ant-col-md-7{display:block;flex:0 0 29.16666667%;max-width:29.16666667%}.ant-col-md-push-7{left:29.16666667%}.ant-col-md-pull-7{right:29.16666667%}.ant-col-md-offset-7{margin-left:29.16666667%}.ant-col-md-order-7{order:7}.ant-col-md-6{display:block;flex:0 0 25%;max-width:25%}.ant-col-md-push-6{left:25%}.ant-col-md-pull-6{right:25%}.ant-col-md-offset-6{margin-left:25%}.ant-col-md-order-6{order:6}.ant-col-md-5{display:block;flex:0 0 20.83333333%;max-width:20.83333333%}.ant-col-md-push-5{left:20.83333333%}.ant-col-md-pull-5{right:20.83333333%}.ant-col-md-offset-5{margin-left:20.83333333%}.ant-col-md-order-5{order:5}.ant-col-md-4{display:block;flex:0 0 16.66666667%;max-width:16.66666667%}.ant-col-md-push-4{left:16.66666667%}.ant-col-md-pull-4{right:16.66666667%}.ant-col-md-offset-4{margin-left:16.66666667%}.ant-col-md-order-4{order:4}.ant-col-md-3{display:block;flex:0 0 12.5%;max-width:12.5%}.ant-col-md-push-3{left:12.5%}.ant-col-md-pull-3{right:12.5%}.ant-col-md-offset-3{margin-left:12.5%}.ant-col-md-order-3{order:3}.ant-col-md-2{display:block;flex:0 0 8.33333333%;max-width:8.33333333%}.ant-col-md-push-2{left:8.33333333%}.ant-col-md-pull-2{right:8.33333333%}.ant-col-md-offset-2{margin-left:8.33333333%}.ant-col-md-order-2{order:2}.ant-col-md-1{display:block;flex:0 0 4.16666667%;max-width:4.16666667%}.ant-col-md-push-1{left:4.16666667%}.ant-col-md-pull-1{right:4.16666667%}.ant-col-md-offset-1{margin-left:4.16666667%}.ant-col-md-order-1{order:1}.ant-col-md-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-md-push-0{left:auto}.ant-col-md-pull-0{right:auto}.ant-col-md-offset-0{margin-left:0}.ant-col-md-order-0{order:0}.ant-col-push-0.ant-col-rtl{right:auto}.ant-col-pull-0.ant-col-rtl{left:auto}.ant-col-md-push-0.ant-col-rtl{right:auto}.ant-col-md-pull-0.ant-col-rtl{left:auto}.ant-col-md-offset-0.ant-col-rtl{margin-right:0}.ant-col-md-push-1.ant-col-rtl{right:4.16666667%;left:auto}.ant-col-md-pull-1.ant-col-rtl{right:auto;left:4.16666667%}.ant-col-md-offset-1.ant-col-rtl{margin-right:4.16666667%;margin-left:0}.ant-col-md-push-2.ant-col-rtl{right:8.33333333%;left:auto}.ant-col-md-pull-2.ant-col-rtl{right:auto;left:8.33333333%}.ant-col-md-offset-2.ant-col-rtl{margin-right:8.33333333%;margin-left:0}.ant-col-md-push-3.ant-col-rtl{right:12.5%;left:auto}.ant-col-md-pull-3.ant-col-rtl{right:auto;left:12.5%}.ant-col-md-offset-3.ant-col-rtl{margin-right:12.5%;margin-left:0}.ant-col-md-push-4.ant-col-rtl{right:16.66666667%;left:auto}.ant-col-md-pull-4.ant-col-rtl{right:auto;left:16.66666667%}.ant-col-md-offset-4.ant-col-rtl{margin-right:16.66666667%;margin-left:0}.ant-col-md-push-5.ant-col-rtl{right:20.83333333%;left:auto}.ant-col-md-pull-5.ant-col-rtl{right:auto;left:20.83333333%}.ant-col-md-offset-5.ant-col-rtl{margin-right:20.83333333%;margin-left:0}.ant-col-md-push-6.ant-col-rtl{right:25%;left:auto}.ant-col-md-pull-6.ant-col-rtl{right:auto;left:25%}.ant-col-md-offset-6.ant-col-rtl{margin-right:25%;margin-left:0}.ant-col-md-push-7.ant-col-rtl{right:29.16666667%;left:auto}.ant-col-md-pull-7.ant-col-rtl{right:auto;left:29.16666667%}.ant-col-md-offset-7.ant-col-rtl{margin-right:29.16666667%;margin-left:0}.ant-col-md-push-8.ant-col-rtl{right:33.33333333%;left:auto}.ant-col-md-pull-8.ant-col-rtl{right:auto;left:33.33333333%}.ant-col-md-offset-8.ant-col-rtl{margin-right:33.33333333%;margin-left:0}.ant-col-md-push-9.ant-col-rtl{right:37.5%;left:auto}.ant-col-md-pull-9.ant-col-rtl{right:auto;left:37.5%}.ant-col-md-offset-9.ant-col-rtl{margin-right:37.5%;margin-left:0}.ant-col-md-push-10.ant-col-rtl{right:41.66666667%;left:auto}.ant-col-md-pull-10.ant-col-rtl{right:auto;left:41.66666667%}.ant-col-md-offset-10.ant-col-rtl{margin-right:41.66666667%;margin-left:0}.ant-col-md-push-11.ant-col-rtl{right:45.83333333%;left:auto}.ant-col-md-pull-11.ant-col-rtl{right:auto;left:45.83333333%}.ant-col-md-offset-11.ant-col-rtl{margin-right:45.83333333%;margin-left:0}.ant-col-md-push-12.ant-col-rtl{right:50%;left:auto}.ant-col-md-pull-12.ant-col-rtl{right:auto;left:50%}.ant-col-md-offset-12.ant-col-rtl{margin-right:50%;margin-left:0}.ant-col-md-push-13.ant-col-rtl{right:54.16666667%;left:auto}.ant-col-md-pull-13.ant-col-rtl{right:auto;left:54.16666667%}.ant-col-md-offset-13.ant-col-rtl{margin-right:54.16666667%;margin-left:0}.ant-col-md-push-14.ant-col-rtl{right:58.33333333%;left:auto}.ant-col-md-pull-14.ant-col-rtl{right:auto;left:58.33333333%}.ant-col-md-offset-14.ant-col-rtl{margin-right:58.33333333%;margin-left:0}.ant-col-md-push-15.ant-col-rtl{right:62.5%;left:auto}.ant-col-md-pull-15.ant-col-rtl{right:auto;left:62.5%}.ant-col-md-offset-15.ant-col-rtl{margin-right:62.5%;margin-left:0}.ant-col-md-push-16.ant-col-rtl{right:66.66666667%;left:auto}.ant-col-md-pull-16.ant-col-rtl{right:auto;left:66.66666667%}.ant-col-md-offset-16.ant-col-rtl{margin-right:66.66666667%;margin-left:0}.ant-col-md-push-17.ant-col-rtl{right:70.83333333%;left:auto}.ant-col-md-pull-17.ant-col-rtl{right:auto;left:70.83333333%}.ant-col-md-offset-17.ant-col-rtl{margin-right:70.83333333%;margin-left:0}.ant-col-md-push-18.ant-col-rtl{right:75%;left:auto}.ant-col-md-pull-18.ant-col-rtl{right:auto;left:75%}.ant-col-md-offset-18.ant-col-rtl{margin-right:75%;margin-left:0}.ant-col-md-push-19.ant-col-rtl{right:79.16666667%;left:auto}.ant-col-md-pull-19.ant-col-rtl{right:auto;left:79.16666667%}.ant-col-md-offset-19.ant-col-rtl{margin-right:79.16666667%;margin-left:0}.ant-col-md-push-20.ant-col-rtl{right:83.33333333%;left:auto}.ant-col-md-pull-20.ant-col-rtl{right:auto;left:83.33333333%}.ant-col-md-offset-20.ant-col-rtl{margin-right:83.33333333%;margin-left:0}.ant-col-md-push-21.ant-col-rtl{right:87.5%;left:auto}.ant-col-md-pull-21.ant-col-rtl{right:auto;left:87.5%}.ant-col-md-offset-21.ant-col-rtl{margin-right:87.5%;margin-left:0}.ant-col-md-push-22.ant-col-rtl{right:91.66666667%;left:auto}.ant-col-md-pull-22.ant-col-rtl{right:auto;left:91.66666667%}.ant-col-md-offset-22.ant-col-rtl{margin-right:91.66666667%;margin-left:0}.ant-col-md-push-23.ant-col-rtl{right:95.83333333%;left:auto}.ant-col-md-pull-23.ant-col-rtl{right:auto;left:95.83333333%}.ant-col-md-offset-23.ant-col-rtl{margin-right:95.83333333%;margin-left:0}.ant-col-md-push-24.ant-col-rtl{right:100%;left:auto}.ant-col-md-pull-24.ant-col-rtl{right:auto;left:100%}.ant-col-md-offset-24.ant-col-rtl{margin-right:100%;margin-left:0}}@media (min-width: 992px){.ant-col-lg-24{display:block;flex:0 0 100%;max-width:100%}.ant-col-lg-push-24{left:100%}.ant-col-lg-pull-24{right:100%}.ant-col-lg-offset-24{margin-left:100%}.ant-col-lg-order-24{order:24}.ant-col-lg-23{display:block;flex:0 0 95.83333333%;max-width:95.83333333%}.ant-col-lg-push-23{left:95.83333333%}.ant-col-lg-pull-23{right:95.83333333%}.ant-col-lg-offset-23{margin-left:95.83333333%}.ant-col-lg-order-23{order:23}.ant-col-lg-22{display:block;flex:0 0 91.66666667%;max-width:91.66666667%}.ant-col-lg-push-22{left:91.66666667%}.ant-col-lg-pull-22{right:91.66666667%}.ant-col-lg-offset-22{margin-left:91.66666667%}.ant-col-lg-order-22{order:22}.ant-col-lg-21{display:block;flex:0 0 87.5%;max-width:87.5%}.ant-col-lg-push-21{left:87.5%}.ant-col-lg-pull-21{right:87.5%}.ant-col-lg-offset-21{margin-left:87.5%}.ant-col-lg-order-21{order:21}.ant-col-lg-20{display:block;flex:0 0 83.33333333%;max-width:83.33333333%}.ant-col-lg-push-20{left:83.33333333%}.ant-col-lg-pull-20{right:83.33333333%}.ant-col-lg-offset-20{margin-left:83.33333333%}.ant-col-lg-order-20{order:20}.ant-col-lg-19{display:block;flex:0 0 79.16666667%;max-width:79.16666667%}.ant-col-lg-push-19{left:79.16666667%}.ant-col-lg-pull-19{right:79.16666667%}.ant-col-lg-offset-19{margin-left:79.16666667%}.ant-col-lg-order-19{order:19}.ant-col-lg-18{display:block;flex:0 0 75%;max-width:75%}.ant-col-lg-push-18{left:75%}.ant-col-lg-pull-18{right:75%}.ant-col-lg-offset-18{margin-left:75%}.ant-col-lg-order-18{order:18}.ant-col-lg-17{display:block;flex:0 0 70.83333333%;max-width:70.83333333%}.ant-col-lg-push-17{left:70.83333333%}.ant-col-lg-pull-17{right:70.83333333%}.ant-col-lg-offset-17{margin-left:70.83333333%}.ant-col-lg-order-17{order:17}.ant-col-lg-16{display:block;flex:0 0 66.66666667%;max-width:66.66666667%}.ant-col-lg-push-16{left:66.66666667%}.ant-col-lg-pull-16{right:66.66666667%}.ant-col-lg-offset-16{margin-left:66.66666667%}.ant-col-lg-order-16{order:16}.ant-col-lg-15{display:block;flex:0 0 62.5%;max-width:62.5%}.ant-col-lg-push-15{left:62.5%}.ant-col-lg-pull-15{right:62.5%}.ant-col-lg-offset-15{margin-left:62.5%}.ant-col-lg-order-15{order:15}.ant-col-lg-14{display:block;flex:0 0 58.33333333%;max-width:58.33333333%}.ant-col-lg-push-14{left:58.33333333%}.ant-col-lg-pull-14{right:58.33333333%}.ant-col-lg-offset-14{margin-left:58.33333333%}.ant-col-lg-order-14{order:14}.ant-col-lg-13{display:block;flex:0 0 54.16666667%;max-width:54.16666667%}.ant-col-lg-push-13{left:54.16666667%}.ant-col-lg-pull-13{right:54.16666667%}.ant-col-lg-offset-13{margin-left:54.16666667%}.ant-col-lg-order-13{order:13}.ant-col-lg-12{display:block;flex:0 0 50%;max-width:50%}.ant-col-lg-push-12{left:50%}.ant-col-lg-pull-12{right:50%}.ant-col-lg-offset-12{margin-left:50%}.ant-col-lg-order-12{order:12}.ant-col-lg-11{display:block;flex:0 0 45.83333333%;max-width:45.83333333%}.ant-col-lg-push-11{left:45.83333333%}.ant-col-lg-pull-11{right:45.83333333%}.ant-col-lg-offset-11{margin-left:45.83333333%}.ant-col-lg-order-11{order:11}.ant-col-lg-10{display:block;flex:0 0 41.66666667%;max-width:41.66666667%}.ant-col-lg-push-10{left:41.66666667%}.ant-col-lg-pull-10{right:41.66666667%}.ant-col-lg-offset-10{margin-left:41.66666667%}.ant-col-lg-order-10{order:10}.ant-col-lg-9{display:block;flex:0 0 37.5%;max-width:37.5%}.ant-col-lg-push-9{left:37.5%}.ant-col-lg-pull-9{right:37.5%}.ant-col-lg-offset-9{margin-left:37.5%}.ant-col-lg-order-9{order:9}.ant-col-lg-8{display:block;flex:0 0 33.33333333%;max-width:33.33333333%}.ant-col-lg-push-8{left:33.33333333%}.ant-col-lg-pull-8{right:33.33333333%}.ant-col-lg-offset-8{margin-left:33.33333333%}.ant-col-lg-order-8{order:8}.ant-col-lg-7{display:block;flex:0 0 29.16666667%;max-width:29.16666667%}.ant-col-lg-push-7{left:29.16666667%}.ant-col-lg-pull-7{right:29.16666667%}.ant-col-lg-offset-7{margin-left:29.16666667%}.ant-col-lg-order-7{order:7}.ant-col-lg-6{display:block;flex:0 0 25%;max-width:25%}.ant-col-lg-push-6{left:25%}.ant-col-lg-pull-6{right:25%}.ant-col-lg-offset-6{margin-left:25%}.ant-col-lg-order-6{order:6}.ant-col-lg-5{display:block;flex:0 0 20.83333333%;max-width:20.83333333%}.ant-col-lg-push-5{left:20.83333333%}.ant-col-lg-pull-5{right:20.83333333%}.ant-col-lg-offset-5{margin-left:20.83333333%}.ant-col-lg-order-5{order:5}.ant-col-lg-4{display:block;flex:0 0 16.66666667%;max-width:16.66666667%}.ant-col-lg-push-4{left:16.66666667%}.ant-col-lg-pull-4{right:16.66666667%}.ant-col-lg-offset-4{margin-left:16.66666667%}.ant-col-lg-order-4{order:4}.ant-col-lg-3{display:block;flex:0 0 12.5%;max-width:12.5%}.ant-col-lg-push-3{left:12.5%}.ant-col-lg-pull-3{right:12.5%}.ant-col-lg-offset-3{margin-left:12.5%}.ant-col-lg-order-3{order:3}.ant-col-lg-2{display:block;flex:0 0 8.33333333%;max-width:8.33333333%}.ant-col-lg-push-2{left:8.33333333%}.ant-col-lg-pull-2{right:8.33333333%}.ant-col-lg-offset-2{margin-left:8.33333333%}.ant-col-lg-order-2{order:2}.ant-col-lg-1{display:block;flex:0 0 4.16666667%;max-width:4.16666667%}.ant-col-lg-push-1{left:4.16666667%}.ant-col-lg-pull-1{right:4.16666667%}.ant-col-lg-offset-1{margin-left:4.16666667%}.ant-col-lg-order-1{order:1}.ant-col-lg-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-lg-push-0{left:auto}.ant-col-lg-pull-0{right:auto}.ant-col-lg-offset-0{margin-left:0}.ant-col-lg-order-0{order:0}.ant-col-push-0.ant-col-rtl{right:auto}.ant-col-pull-0.ant-col-rtl{left:auto}.ant-col-lg-push-0.ant-col-rtl{right:auto}.ant-col-lg-pull-0.ant-col-rtl{left:auto}.ant-col-lg-offset-0.ant-col-rtl{margin-right:0}.ant-col-lg-push-1.ant-col-rtl{right:4.16666667%;left:auto}.ant-col-lg-pull-1.ant-col-rtl{right:auto;left:4.16666667%}.ant-col-lg-offset-1.ant-col-rtl{margin-right:4.16666667%;margin-left:0}.ant-col-lg-push-2.ant-col-rtl{right:8.33333333%;left:auto}.ant-col-lg-pull-2.ant-col-rtl{right:auto;left:8.33333333%}.ant-col-lg-offset-2.ant-col-rtl{margin-right:8.33333333%;margin-left:0}.ant-col-lg-push-3.ant-col-rtl{right:12.5%;left:auto}.ant-col-lg-pull-3.ant-col-rtl{right:auto;left:12.5%}.ant-col-lg-offset-3.ant-col-rtl{margin-right:12.5%;margin-left:0}.ant-col-lg-push-4.ant-col-rtl{right:16.66666667%;left:auto}.ant-col-lg-pull-4.ant-col-rtl{right:auto;left:16.66666667%}.ant-col-lg-offset-4.ant-col-rtl{margin-right:16.66666667%;margin-left:0}.ant-col-lg-push-5.ant-col-rtl{right:20.83333333%;left:auto}.ant-col-lg-pull-5.ant-col-rtl{right:auto;left:20.83333333%}.ant-col-lg-offset-5.ant-col-rtl{margin-right:20.83333333%;margin-left:0}.ant-col-lg-push-6.ant-col-rtl{right:25%;left:auto}.ant-col-lg-pull-6.ant-col-rtl{right:auto;left:25%}.ant-col-lg-offset-6.ant-col-rtl{margin-right:25%;margin-left:0}.ant-col-lg-push-7.ant-col-rtl{right:29.16666667%;left:auto}.ant-col-lg-pull-7.ant-col-rtl{right:auto;left:29.16666667%}.ant-col-lg-offset-7.ant-col-rtl{margin-right:29.16666667%;margin-left:0}.ant-col-lg-push-8.ant-col-rtl{right:33.33333333%;left:auto}.ant-col-lg-pull-8.ant-col-rtl{right:auto;left:33.33333333%}.ant-col-lg-offset-8.ant-col-rtl{margin-right:33.33333333%;margin-left:0}.ant-col-lg-push-9.ant-col-rtl{right:37.5%;left:auto}.ant-col-lg-pull-9.ant-col-rtl{right:auto;left:37.5%}.ant-col-lg-offset-9.ant-col-rtl{margin-right:37.5%;margin-left:0}.ant-col-lg-push-10.ant-col-rtl{right:41.66666667%;left:auto}.ant-col-lg-pull-10.ant-col-rtl{right:auto;left:41.66666667%}.ant-col-lg-offset-10.ant-col-rtl{margin-right:41.66666667%;margin-left:0}.ant-col-lg-push-11.ant-col-rtl{right:45.83333333%;left:auto}.ant-col-lg-pull-11.ant-col-rtl{right:auto;left:45.83333333%}.ant-col-lg-offset-11.ant-col-rtl{margin-right:45.83333333%;margin-left:0}.ant-col-lg-push-12.ant-col-rtl{right:50%;left:auto}.ant-col-lg-pull-12.ant-col-rtl{right:auto;left:50%}.ant-col-lg-offset-12.ant-col-rtl{margin-right:50%;margin-left:0}.ant-col-lg-push-13.ant-col-rtl{right:54.16666667%;left:auto}.ant-col-lg-pull-13.ant-col-rtl{right:auto;left:54.16666667%}.ant-col-lg-offset-13.ant-col-rtl{margin-right:54.16666667%;margin-left:0}.ant-col-lg-push-14.ant-col-rtl{right:58.33333333%;left:auto}.ant-col-lg-pull-14.ant-col-rtl{right:auto;left:58.33333333%}.ant-col-lg-offset-14.ant-col-rtl{margin-right:58.33333333%;margin-left:0}.ant-col-lg-push-15.ant-col-rtl{right:62.5%;left:auto}.ant-col-lg-pull-15.ant-col-rtl{right:auto;left:62.5%}.ant-col-lg-offset-15.ant-col-rtl{margin-right:62.5%;margin-left:0}.ant-col-lg-push-16.ant-col-rtl{right:66.66666667%;left:auto}.ant-col-lg-pull-16.ant-col-rtl{right:auto;left:66.66666667%}.ant-col-lg-offset-16.ant-col-rtl{margin-right:66.66666667%;margin-left:0}.ant-col-lg-push-17.ant-col-rtl{right:70.83333333%;left:auto}.ant-col-lg-pull-17.ant-col-rtl{right:auto;left:70.83333333%}.ant-col-lg-offset-17.ant-col-rtl{margin-right:70.83333333%;margin-left:0}.ant-col-lg-push-18.ant-col-rtl{right:75%;left:auto}.ant-col-lg-pull-18.ant-col-rtl{right:auto;left:75%}.ant-col-lg-offset-18.ant-col-rtl{margin-right:75%;margin-left:0}.ant-col-lg-push-19.ant-col-rtl{right:79.16666667%;left:auto}.ant-col-lg-pull-19.ant-col-rtl{right:auto;left:79.16666667%}.ant-col-lg-offset-19.ant-col-rtl{margin-right:79.16666667%;margin-left:0}.ant-col-lg-push-20.ant-col-rtl{right:83.33333333%;left:auto}.ant-col-lg-pull-20.ant-col-rtl{right:auto;left:83.33333333%}.ant-col-lg-offset-20.ant-col-rtl{margin-right:83.33333333%;margin-left:0}.ant-col-lg-push-21.ant-col-rtl{right:87.5%;left:auto}.ant-col-lg-pull-21.ant-col-rtl{right:auto;left:87.5%}.ant-col-lg-offset-21.ant-col-rtl{margin-right:87.5%;margin-left:0}.ant-col-lg-push-22.ant-col-rtl{right:91.66666667%;left:auto}.ant-col-lg-pull-22.ant-col-rtl{right:auto;left:91.66666667%}.ant-col-lg-offset-22.ant-col-rtl{margin-right:91.66666667%;margin-left:0}.ant-col-lg-push-23.ant-col-rtl{right:95.83333333%;left:auto}.ant-col-lg-pull-23.ant-col-rtl{right:auto;left:95.83333333%}.ant-col-lg-offset-23.ant-col-rtl{margin-right:95.83333333%;margin-left:0}.ant-col-lg-push-24.ant-col-rtl{right:100%;left:auto}.ant-col-lg-pull-24.ant-col-rtl{right:auto;left:100%}.ant-col-lg-offset-24.ant-col-rtl{margin-right:100%;margin-left:0}}@media (min-width: 1200px){.ant-col-xl-24{display:block;flex:0 0 100%;max-width:100%}.ant-col-xl-push-24{left:100%}.ant-col-xl-pull-24{right:100%}.ant-col-xl-offset-24{margin-left:100%}.ant-col-xl-order-24{order:24}.ant-col-xl-23{display:block;flex:0 0 95.83333333%;max-width:95.83333333%}.ant-col-xl-push-23{left:95.83333333%}.ant-col-xl-pull-23{right:95.83333333%}.ant-col-xl-offset-23{margin-left:95.83333333%}.ant-col-xl-order-23{order:23}.ant-col-xl-22{display:block;flex:0 0 91.66666667%;max-width:91.66666667%}.ant-col-xl-push-22{left:91.66666667%}.ant-col-xl-pull-22{right:91.66666667%}.ant-col-xl-offset-22{margin-left:91.66666667%}.ant-col-xl-order-22{order:22}.ant-col-xl-21{display:block;flex:0 0 87.5%;max-width:87.5%}.ant-col-xl-push-21{left:87.5%}.ant-col-xl-pull-21{right:87.5%}.ant-col-xl-offset-21{margin-left:87.5%}.ant-col-xl-order-21{order:21}.ant-col-xl-20{display:block;flex:0 0 83.33333333%;max-width:83.33333333%}.ant-col-xl-push-20{left:83.33333333%}.ant-col-xl-pull-20{right:83.33333333%}.ant-col-xl-offset-20{margin-left:83.33333333%}.ant-col-xl-order-20{order:20}.ant-col-xl-19{display:block;flex:0 0 79.16666667%;max-width:79.16666667%}.ant-col-xl-push-19{left:79.16666667%}.ant-col-xl-pull-19{right:79.16666667%}.ant-col-xl-offset-19{margin-left:79.16666667%}.ant-col-xl-order-19{order:19}.ant-col-xl-18{display:block;flex:0 0 75%;max-width:75%}.ant-col-xl-push-18{left:75%}.ant-col-xl-pull-18{right:75%}.ant-col-xl-offset-18{margin-left:75%}.ant-col-xl-order-18{order:18}.ant-col-xl-17{display:block;flex:0 0 70.83333333%;max-width:70.83333333%}.ant-col-xl-push-17{left:70.83333333%}.ant-col-xl-pull-17{right:70.83333333%}.ant-col-xl-offset-17{margin-left:70.83333333%}.ant-col-xl-order-17{order:17}.ant-col-xl-16{display:block;flex:0 0 66.66666667%;max-width:66.66666667%}.ant-col-xl-push-16{left:66.66666667%}.ant-col-xl-pull-16{right:66.66666667%}.ant-col-xl-offset-16{margin-left:66.66666667%}.ant-col-xl-order-16{order:16}.ant-col-xl-15{display:block;flex:0 0 62.5%;max-width:62.5%}.ant-col-xl-push-15{left:62.5%}.ant-col-xl-pull-15{right:62.5%}.ant-col-xl-offset-15{margin-left:62.5%}.ant-col-xl-order-15{order:15}.ant-col-xl-14{display:block;flex:0 0 58.33333333%;max-width:58.33333333%}.ant-col-xl-push-14{left:58.33333333%}.ant-col-xl-pull-14{right:58.33333333%}.ant-col-xl-offset-14{margin-left:58.33333333%}.ant-col-xl-order-14{order:14}.ant-col-xl-13{display:block;flex:0 0 54.16666667%;max-width:54.16666667%}.ant-col-xl-push-13{left:54.16666667%}.ant-col-xl-pull-13{right:54.16666667%}.ant-col-xl-offset-13{margin-left:54.16666667%}.ant-col-xl-order-13{order:13}.ant-col-xl-12{display:block;flex:0 0 50%;max-width:50%}.ant-col-xl-push-12{left:50%}.ant-col-xl-pull-12{right:50%}.ant-col-xl-offset-12{margin-left:50%}.ant-col-xl-order-12{order:12}.ant-col-xl-11{display:block;flex:0 0 45.83333333%;max-width:45.83333333%}.ant-col-xl-push-11{left:45.83333333%}.ant-col-xl-pull-11{right:45.83333333%}.ant-col-xl-offset-11{margin-left:45.83333333%}.ant-col-xl-order-11{order:11}.ant-col-xl-10{display:block;flex:0 0 41.66666667%;max-width:41.66666667%}.ant-col-xl-push-10{left:41.66666667%}.ant-col-xl-pull-10{right:41.66666667%}.ant-col-xl-offset-10{margin-left:41.66666667%}.ant-col-xl-order-10{order:10}.ant-col-xl-9{display:block;flex:0 0 37.5%;max-width:37.5%}.ant-col-xl-push-9{left:37.5%}.ant-col-xl-pull-9{right:37.5%}.ant-col-xl-offset-9{margin-left:37.5%}.ant-col-xl-order-9{order:9}.ant-col-xl-8{display:block;flex:0 0 33.33333333%;max-width:33.33333333%}.ant-col-xl-push-8{left:33.33333333%}.ant-col-xl-pull-8{right:33.33333333%}.ant-col-xl-offset-8{margin-left:33.33333333%}.ant-col-xl-order-8{order:8}.ant-col-xl-7{display:block;flex:0 0 29.16666667%;max-width:29.16666667%}.ant-col-xl-push-7{left:29.16666667%}.ant-col-xl-pull-7{right:29.16666667%}.ant-col-xl-offset-7{margin-left:29.16666667%}.ant-col-xl-order-7{order:7}.ant-col-xl-6{display:block;flex:0 0 25%;max-width:25%}.ant-col-xl-push-6{left:25%}.ant-col-xl-pull-6{right:25%}.ant-col-xl-offset-6{margin-left:25%}.ant-col-xl-order-6{order:6}.ant-col-xl-5{display:block;flex:0 0 20.83333333%;max-width:20.83333333%}.ant-col-xl-push-5{left:20.83333333%}.ant-col-xl-pull-5{right:20.83333333%}.ant-col-xl-offset-5{margin-left:20.83333333%}.ant-col-xl-order-5{order:5}.ant-col-xl-4{display:block;flex:0 0 16.66666667%;max-width:16.66666667%}.ant-col-xl-push-4{left:16.66666667%}.ant-col-xl-pull-4{right:16.66666667%}.ant-col-xl-offset-4{margin-left:16.66666667%}.ant-col-xl-order-4{order:4}.ant-col-xl-3{display:block;flex:0 0 12.5%;max-width:12.5%}.ant-col-xl-push-3{left:12.5%}.ant-col-xl-pull-3{right:12.5%}.ant-col-xl-offset-3{margin-left:12.5%}.ant-col-xl-order-3{order:3}.ant-col-xl-2{display:block;flex:0 0 8.33333333%;max-width:8.33333333%}.ant-col-xl-push-2{left:8.33333333%}.ant-col-xl-pull-2{right:8.33333333%}.ant-col-xl-offset-2{margin-left:8.33333333%}.ant-col-xl-order-2{order:2}.ant-col-xl-1{display:block;flex:0 0 4.16666667%;max-width:4.16666667%}.ant-col-xl-push-1{left:4.16666667%}.ant-col-xl-pull-1{right:4.16666667%}.ant-col-xl-offset-1{margin-left:4.16666667%}.ant-col-xl-order-1{order:1}.ant-col-xl-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-xl-push-0{left:auto}.ant-col-xl-pull-0{right:auto}.ant-col-xl-offset-0{margin-left:0}.ant-col-xl-order-0{order:0}.ant-col-push-0.ant-col-rtl{right:auto}.ant-col-pull-0.ant-col-rtl{left:auto}.ant-col-xl-push-0.ant-col-rtl{right:auto}.ant-col-xl-pull-0.ant-col-rtl{left:auto}.ant-col-xl-offset-0.ant-col-rtl{margin-right:0}.ant-col-xl-push-1.ant-col-rtl{right:4.16666667%;left:auto}.ant-col-xl-pull-1.ant-col-rtl{right:auto;left:4.16666667%}.ant-col-xl-offset-1.ant-col-rtl{margin-right:4.16666667%;margin-left:0}.ant-col-xl-push-2.ant-col-rtl{right:8.33333333%;left:auto}.ant-col-xl-pull-2.ant-col-rtl{right:auto;left:8.33333333%}.ant-col-xl-offset-2.ant-col-rtl{margin-right:8.33333333%;margin-left:0}.ant-col-xl-push-3.ant-col-rtl{right:12.5%;left:auto}.ant-col-xl-pull-3.ant-col-rtl{right:auto;left:12.5%}.ant-col-xl-offset-3.ant-col-rtl{margin-right:12.5%;margin-left:0}.ant-col-xl-push-4.ant-col-rtl{right:16.66666667%;left:auto}.ant-col-xl-pull-4.ant-col-rtl{right:auto;left:16.66666667%}.ant-col-xl-offset-4.ant-col-rtl{margin-right:16.66666667%;margin-left:0}.ant-col-xl-push-5.ant-col-rtl{right:20.83333333%;left:auto}.ant-col-xl-pull-5.ant-col-rtl{right:auto;left:20.83333333%}.ant-col-xl-offset-5.ant-col-rtl{margin-right:20.83333333%;margin-left:0}.ant-col-xl-push-6.ant-col-rtl{right:25%;left:auto}.ant-col-xl-pull-6.ant-col-rtl{right:auto;left:25%}.ant-col-xl-offset-6.ant-col-rtl{margin-right:25%;margin-left:0}.ant-col-xl-push-7.ant-col-rtl{right:29.16666667%;left:auto}.ant-col-xl-pull-7.ant-col-rtl{right:auto;left:29.16666667%}.ant-col-xl-offset-7.ant-col-rtl{margin-right:29.16666667%;margin-left:0}.ant-col-xl-push-8.ant-col-rtl{right:33.33333333%;left:auto}.ant-col-xl-pull-8.ant-col-rtl{right:auto;left:33.33333333%}.ant-col-xl-offset-8.ant-col-rtl{margin-right:33.33333333%;margin-left:0}.ant-col-xl-push-9.ant-col-rtl{right:37.5%;left:auto}.ant-col-xl-pull-9.ant-col-rtl{right:auto;left:37.5%}.ant-col-xl-offset-9.ant-col-rtl{margin-right:37.5%;margin-left:0}.ant-col-xl-push-10.ant-col-rtl{right:41.66666667%;left:auto}.ant-col-xl-pull-10.ant-col-rtl{right:auto;left:41.66666667%}.ant-col-xl-offset-10.ant-col-rtl{margin-right:41.66666667%;margin-left:0}.ant-col-xl-push-11.ant-col-rtl{right:45.83333333%;left:auto}.ant-col-xl-pull-11.ant-col-rtl{right:auto;left:45.83333333%}.ant-col-xl-offset-11.ant-col-rtl{margin-right:45.83333333%;margin-left:0}.ant-col-xl-push-12.ant-col-rtl{right:50%;left:auto}.ant-col-xl-pull-12.ant-col-rtl{right:auto;left:50%}.ant-col-xl-offset-12.ant-col-rtl{margin-right:50%;margin-left:0}.ant-col-xl-push-13.ant-col-rtl{right:54.16666667%;left:auto}.ant-col-xl-pull-13.ant-col-rtl{right:auto;left:54.16666667%}.ant-col-xl-offset-13.ant-col-rtl{margin-right:54.16666667%;margin-left:0}.ant-col-xl-push-14.ant-col-rtl{right:58.33333333%;left:auto}.ant-col-xl-pull-14.ant-col-rtl{right:auto;left:58.33333333%}.ant-col-xl-offset-14.ant-col-rtl{margin-right:58.33333333%;margin-left:0}.ant-col-xl-push-15.ant-col-rtl{right:62.5%;left:auto}.ant-col-xl-pull-15.ant-col-rtl{right:auto;left:62.5%}.ant-col-xl-offset-15.ant-col-rtl{margin-right:62.5%;margin-left:0}.ant-col-xl-push-16.ant-col-rtl{right:66.66666667%;left:auto}.ant-col-xl-pull-16.ant-col-rtl{right:auto;left:66.66666667%}.ant-col-xl-offset-16.ant-col-rtl{margin-right:66.66666667%;margin-left:0}.ant-col-xl-push-17.ant-col-rtl{right:70.83333333%;left:auto}.ant-col-xl-pull-17.ant-col-rtl{right:auto;left:70.83333333%}.ant-col-xl-offset-17.ant-col-rtl{margin-right:70.83333333%;margin-left:0}.ant-col-xl-push-18.ant-col-rtl{right:75%;left:auto}.ant-col-xl-pull-18.ant-col-rtl{right:auto;left:75%}.ant-col-xl-offset-18.ant-col-rtl{margin-right:75%;margin-left:0}.ant-col-xl-push-19.ant-col-rtl{right:79.16666667%;left:auto}.ant-col-xl-pull-19.ant-col-rtl{right:auto;left:79.16666667%}.ant-col-xl-offset-19.ant-col-rtl{margin-right:79.16666667%;margin-left:0}.ant-col-xl-push-20.ant-col-rtl{right:83.33333333%;left:auto}.ant-col-xl-pull-20.ant-col-rtl{right:auto;left:83.33333333%}.ant-col-xl-offset-20.ant-col-rtl{margin-right:83.33333333%;margin-left:0}.ant-col-xl-push-21.ant-col-rtl{right:87.5%;left:auto}.ant-col-xl-pull-21.ant-col-rtl{right:auto;left:87.5%}.ant-col-xl-offset-21.ant-col-rtl{margin-right:87.5%;margin-left:0}.ant-col-xl-push-22.ant-col-rtl{right:91.66666667%;left:auto}.ant-col-xl-pull-22.ant-col-rtl{right:auto;left:91.66666667%}.ant-col-xl-offset-22.ant-col-rtl{margin-right:91.66666667%;margin-left:0}.ant-col-xl-push-23.ant-col-rtl{right:95.83333333%;left:auto}.ant-col-xl-pull-23.ant-col-rtl{right:auto;left:95.83333333%}.ant-col-xl-offset-23.ant-col-rtl{margin-right:95.83333333%;margin-left:0}.ant-col-xl-push-24.ant-col-rtl{right:100%;left:auto}.ant-col-xl-pull-24.ant-col-rtl{right:auto;left:100%}.ant-col-xl-offset-24.ant-col-rtl{margin-right:100%;margin-left:0}}@media (min-width: 1600px){.ant-col-xxl-24{display:block;flex:0 0 100%;max-width:100%}.ant-col-xxl-push-24{left:100%}.ant-col-xxl-pull-24{right:100%}.ant-col-xxl-offset-24{margin-left:100%}.ant-col-xxl-order-24{order:24}.ant-col-xxl-23{display:block;flex:0 0 95.83333333%;max-width:95.83333333%}.ant-col-xxl-push-23{left:95.83333333%}.ant-col-xxl-pull-23{right:95.83333333%}.ant-col-xxl-offset-23{margin-left:95.83333333%}.ant-col-xxl-order-23{order:23}.ant-col-xxl-22{display:block;flex:0 0 91.66666667%;max-width:91.66666667%}.ant-col-xxl-push-22{left:91.66666667%}.ant-col-xxl-pull-22{right:91.66666667%}.ant-col-xxl-offset-22{margin-left:91.66666667%}.ant-col-xxl-order-22{order:22}.ant-col-xxl-21{display:block;flex:0 0 87.5%;max-width:87.5%}.ant-col-xxl-push-21{left:87.5%}.ant-col-xxl-pull-21{right:87.5%}.ant-col-xxl-offset-21{margin-left:87.5%}.ant-col-xxl-order-21{order:21}.ant-col-xxl-20{display:block;flex:0 0 83.33333333%;max-width:83.33333333%}.ant-col-xxl-push-20{left:83.33333333%}.ant-col-xxl-pull-20{right:83.33333333%}.ant-col-xxl-offset-20{margin-left:83.33333333%}.ant-col-xxl-order-20{order:20}.ant-col-xxl-19{display:block;flex:0 0 79.16666667%;max-width:79.16666667%}.ant-col-xxl-push-19{left:79.16666667%}.ant-col-xxl-pull-19{right:79.16666667%}.ant-col-xxl-offset-19{margin-left:79.16666667%}.ant-col-xxl-order-19{order:19}.ant-col-xxl-18{display:block;flex:0 0 75%;max-width:75%}.ant-col-xxl-push-18{left:75%}.ant-col-xxl-pull-18{right:75%}.ant-col-xxl-offset-18{margin-left:75%}.ant-col-xxl-order-18{order:18}.ant-col-xxl-17{display:block;flex:0 0 70.83333333%;max-width:70.83333333%}.ant-col-xxl-push-17{left:70.83333333%}.ant-col-xxl-pull-17{right:70.83333333%}.ant-col-xxl-offset-17{margin-left:70.83333333%}.ant-col-xxl-order-17{order:17}.ant-col-xxl-16{display:block;flex:0 0 66.66666667%;max-width:66.66666667%}.ant-col-xxl-push-16{left:66.66666667%}.ant-col-xxl-pull-16{right:66.66666667%}.ant-col-xxl-offset-16{margin-left:66.66666667%}.ant-col-xxl-order-16{order:16}.ant-col-xxl-15{display:block;flex:0 0 62.5%;max-width:62.5%}.ant-col-xxl-push-15{left:62.5%}.ant-col-xxl-pull-15{right:62.5%}.ant-col-xxl-offset-15{margin-left:62.5%}.ant-col-xxl-order-15{order:15}.ant-col-xxl-14{display:block;flex:0 0 58.33333333%;max-width:58.33333333%}.ant-col-xxl-push-14{left:58.33333333%}.ant-col-xxl-pull-14{right:58.33333333%}.ant-col-xxl-offset-14{margin-left:58.33333333%}.ant-col-xxl-order-14{order:14}.ant-col-xxl-13{display:block;flex:0 0 54.16666667%;max-width:54.16666667%}.ant-col-xxl-push-13{left:54.16666667%}.ant-col-xxl-pull-13{right:54.16666667%}.ant-col-xxl-offset-13{margin-left:54.16666667%}.ant-col-xxl-order-13{order:13}.ant-col-xxl-12{display:block;flex:0 0 50%;max-width:50%}.ant-col-xxl-push-12{left:50%}.ant-col-xxl-pull-12{right:50%}.ant-col-xxl-offset-12{margin-left:50%}.ant-col-xxl-order-12{order:12}.ant-col-xxl-11{display:block;flex:0 0 45.83333333%;max-width:45.83333333%}.ant-col-xxl-push-11{left:45.83333333%}.ant-col-xxl-pull-11{right:45.83333333%}.ant-col-xxl-offset-11{margin-left:45.83333333%}.ant-col-xxl-order-11{order:11}.ant-col-xxl-10{display:block;flex:0 0 41.66666667%;max-width:41.66666667%}.ant-col-xxl-push-10{left:41.66666667%}.ant-col-xxl-pull-10{right:41.66666667%}.ant-col-xxl-offset-10{margin-left:41.66666667%}.ant-col-xxl-order-10{order:10}.ant-col-xxl-9{display:block;flex:0 0 37.5%;max-width:37.5%}.ant-col-xxl-push-9{left:37.5%}.ant-col-xxl-pull-9{right:37.5%}.ant-col-xxl-offset-9{margin-left:37.5%}.ant-col-xxl-order-9{order:9}.ant-col-xxl-8{display:block;flex:0 0 33.33333333%;max-width:33.33333333%}.ant-col-xxl-push-8{left:33.33333333%}.ant-col-xxl-pull-8{right:33.33333333%}.ant-col-xxl-offset-8{margin-left:33.33333333%}.ant-col-xxl-order-8{order:8}.ant-col-xxl-7{display:block;flex:0 0 29.16666667%;max-width:29.16666667%}.ant-col-xxl-push-7{left:29.16666667%}.ant-col-xxl-pull-7{right:29.16666667%}.ant-col-xxl-offset-7{margin-left:29.16666667%}.ant-col-xxl-order-7{order:7}.ant-col-xxl-6{display:block;flex:0 0 25%;max-width:25%}.ant-col-xxl-push-6{left:25%}.ant-col-xxl-pull-6{right:25%}.ant-col-xxl-offset-6{margin-left:25%}.ant-col-xxl-order-6{order:6}.ant-col-xxl-5{display:block;flex:0 0 20.83333333%;max-width:20.83333333%}.ant-col-xxl-push-5{left:20.83333333%}.ant-col-xxl-pull-5{right:20.83333333%}.ant-col-xxl-offset-5{margin-left:20.83333333%}.ant-col-xxl-order-5{order:5}.ant-col-xxl-4{display:block;flex:0 0 16.66666667%;max-width:16.66666667%}.ant-col-xxl-push-4{left:16.66666667%}.ant-col-xxl-pull-4{right:16.66666667%}.ant-col-xxl-offset-4{margin-left:16.66666667%}.ant-col-xxl-order-4{order:4}.ant-col-xxl-3{display:block;flex:0 0 12.5%;max-width:12.5%}.ant-col-xxl-push-3{left:12.5%}.ant-col-xxl-pull-3{right:12.5%}.ant-col-xxl-offset-3{margin-left:12.5%}.ant-col-xxl-order-3{order:3}.ant-col-xxl-2{display:block;flex:0 0 8.33333333%;max-width:8.33333333%}.ant-col-xxl-push-2{left:8.33333333%}.ant-col-xxl-pull-2{right:8.33333333%}.ant-col-xxl-offset-2{margin-left:8.33333333%}.ant-col-xxl-order-2{order:2}.ant-col-xxl-1{display:block;flex:0 0 4.16666667%;max-width:4.16666667%}.ant-col-xxl-push-1{left:4.16666667%}.ant-col-xxl-pull-1{right:4.16666667%}.ant-col-xxl-offset-1{margin-left:4.16666667%}.ant-col-xxl-order-1{order:1}.ant-col-xxl-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-xxl-push-0{left:auto}.ant-col-xxl-pull-0{right:auto}.ant-col-xxl-offset-0{margin-left:0}.ant-col-xxl-order-0{order:0}.ant-col-push-0.ant-col-rtl{right:auto}.ant-col-pull-0.ant-col-rtl{left:auto}.ant-col-xxl-push-0.ant-col-rtl{right:auto}.ant-col-xxl-pull-0.ant-col-rtl{left:auto}.ant-col-xxl-offset-0.ant-col-rtl{margin-right:0}.ant-col-xxl-push-1.ant-col-rtl{right:4.16666667%;left:auto}.ant-col-xxl-pull-1.ant-col-rtl{right:auto;left:4.16666667%}.ant-col-xxl-offset-1.ant-col-rtl{margin-right:4.16666667%;margin-left:0}.ant-col-xxl-push-2.ant-col-rtl{right:8.33333333%;left:auto}.ant-col-xxl-pull-2.ant-col-rtl{right:auto;left:8.33333333%}.ant-col-xxl-offset-2.ant-col-rtl{margin-right:8.33333333%;margin-left:0}.ant-col-xxl-push-3.ant-col-rtl{right:12.5%;left:auto}.ant-col-xxl-pull-3.ant-col-rtl{right:auto;left:12.5%}.ant-col-xxl-offset-3.ant-col-rtl{margin-right:12.5%;margin-left:0}.ant-col-xxl-push-4.ant-col-rtl{right:16.66666667%;left:auto}.ant-col-xxl-pull-4.ant-col-rtl{right:auto;left:16.66666667%}.ant-col-xxl-offset-4.ant-col-rtl{margin-right:16.66666667%;margin-left:0}.ant-col-xxl-push-5.ant-col-rtl{right:20.83333333%;left:auto}.ant-col-xxl-pull-5.ant-col-rtl{right:auto;left:20.83333333%}.ant-col-xxl-offset-5.ant-col-rtl{margin-right:20.83333333%;margin-left:0}.ant-col-xxl-push-6.ant-col-rtl{right:25%;left:auto}.ant-col-xxl-pull-6.ant-col-rtl{right:auto;left:25%}.ant-col-xxl-offset-6.ant-col-rtl{margin-right:25%;margin-left:0}.ant-col-xxl-push-7.ant-col-rtl{right:29.16666667%;left:auto}.ant-col-xxl-pull-7.ant-col-rtl{right:auto;left:29.16666667%}.ant-col-xxl-offset-7.ant-col-rtl{margin-right:29.16666667%;margin-left:0}.ant-col-xxl-push-8.ant-col-rtl{right:33.33333333%;left:auto}.ant-col-xxl-pull-8.ant-col-rtl{right:auto;left:33.33333333%}.ant-col-xxl-offset-8.ant-col-rtl{margin-right:33.33333333%;margin-left:0}.ant-col-xxl-push-9.ant-col-rtl{right:37.5%;left:auto}.ant-col-xxl-pull-9.ant-col-rtl{right:auto;left:37.5%}.ant-col-xxl-offset-9.ant-col-rtl{margin-right:37.5%;margin-left:0}.ant-col-xxl-push-10.ant-col-rtl{right:41.66666667%;left:auto}.ant-col-xxl-pull-10.ant-col-rtl{right:auto;left:41.66666667%}.ant-col-xxl-offset-10.ant-col-rtl{margin-right:41.66666667%;margin-left:0}.ant-col-xxl-push-11.ant-col-rtl{right:45.83333333%;left:auto}.ant-col-xxl-pull-11.ant-col-rtl{right:auto;left:45.83333333%}.ant-col-xxl-offset-11.ant-col-rtl{margin-right:45.83333333%;margin-left:0}.ant-col-xxl-push-12.ant-col-rtl{right:50%;left:auto}.ant-col-xxl-pull-12.ant-col-rtl{right:auto;left:50%}.ant-col-xxl-offset-12.ant-col-rtl{margin-right:50%;margin-left:0}.ant-col-xxl-push-13.ant-col-rtl{right:54.16666667%;left:auto}.ant-col-xxl-pull-13.ant-col-rtl{right:auto;left:54.16666667%}.ant-col-xxl-offset-13.ant-col-rtl{margin-right:54.16666667%;margin-left:0}.ant-col-xxl-push-14.ant-col-rtl{right:58.33333333%;left:auto}.ant-col-xxl-pull-14.ant-col-rtl{right:auto;left:58.33333333%}.ant-col-xxl-offset-14.ant-col-rtl{margin-right:58.33333333%;margin-left:0}.ant-col-xxl-push-15.ant-col-rtl{right:62.5%;left:auto}.ant-col-xxl-pull-15.ant-col-rtl{right:auto;left:62.5%}.ant-col-xxl-offset-15.ant-col-rtl{margin-right:62.5%;margin-left:0}.ant-col-xxl-push-16.ant-col-rtl{right:66.66666667%;left:auto}.ant-col-xxl-pull-16.ant-col-rtl{right:auto;left:66.66666667%}.ant-col-xxl-offset-16.ant-col-rtl{margin-right:66.66666667%;margin-left:0}.ant-col-xxl-push-17.ant-col-rtl{right:70.83333333%;left:auto}.ant-col-xxl-pull-17.ant-col-rtl{right:auto;left:70.83333333%}.ant-col-xxl-offset-17.ant-col-rtl{margin-right:70.83333333%;margin-left:0}.ant-col-xxl-push-18.ant-col-rtl{right:75%;left:auto}.ant-col-xxl-pull-18.ant-col-rtl{right:auto;left:75%}.ant-col-xxl-offset-18.ant-col-rtl{margin-right:75%;margin-left:0}.ant-col-xxl-push-19.ant-col-rtl{right:79.16666667%;left:auto}.ant-col-xxl-pull-19.ant-col-rtl{right:auto;left:79.16666667%}.ant-col-xxl-offset-19.ant-col-rtl{margin-right:79.16666667%;margin-left:0}.ant-col-xxl-push-20.ant-col-rtl{right:83.33333333%;left:auto}.ant-col-xxl-pull-20.ant-col-rtl{right:auto;left:83.33333333%}.ant-col-xxl-offset-20.ant-col-rtl{margin-right:83.33333333%;margin-left:0}.ant-col-xxl-push-21.ant-col-rtl{right:87.5%;left:auto}.ant-col-xxl-pull-21.ant-col-rtl{right:auto;left:87.5%}.ant-col-xxl-offset-21.ant-col-rtl{margin-right:87.5%;margin-left:0}.ant-col-xxl-push-22.ant-col-rtl{right:91.66666667%;left:auto}.ant-col-xxl-pull-22.ant-col-rtl{right:auto;left:91.66666667%}.ant-col-xxl-offset-22.ant-col-rtl{margin-right:91.66666667%;margin-left:0}.ant-col-xxl-push-23.ant-col-rtl{right:95.83333333%;left:auto}.ant-col-xxl-pull-23.ant-col-rtl{right:auto;left:95.83333333%}.ant-col-xxl-offset-23.ant-col-rtl{margin-right:95.83333333%;margin-left:0}.ant-col-xxl-push-24.ant-col-rtl{right:100%;left:auto}.ant-col-xxl-pull-24.ant-col-rtl{right:auto;left:100%}.ant-col-xxl-offset-24.ant-col-rtl{margin-right:100%;margin-left:0}}.ant-row-rtl{direction:rtl}.ant-collapse{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";background-color:#fafafa;border:1px solid #d9d9d9;border-bottom:0;border-radius:2px}.ant-collapse>.ant-collapse-item{border-bottom:1px solid #d9d9d9}.ant-collapse>.ant-collapse-item:last-child,.ant-collapse>.ant-collapse-item:last-child>.ant-collapse-header{border-radius:0 0 2px 2px}.ant-collapse>.ant-collapse-item>.ant-collapse-header{position:relative;display:flex;flex-wrap:nowrap;align-items:flex-start;padding:12px 16px;color:#000000d9;line-height:1.5715;cursor:pointer;transition:all .3s,visibility 0s}.ant-collapse>.ant-collapse-item>.ant-collapse-header .ant-collapse-arrow{display:inline-block;margin-right:12px;font-size:12px;vertical-align:-1px}.ant-collapse>.ant-collapse-item>.ant-collapse-header .ant-collapse-arrow svg{transition:transform .24s}.ant-collapse>.ant-collapse-item>.ant-collapse-header .ant-collapse-header-text{flex:auto}.ant-collapse>.ant-collapse-item>.ant-collapse-header .ant-collapse-extra{margin-left:auto}.ant-collapse>.ant-collapse-item>.ant-collapse-header:focus{outline:none}.ant-collapse>.ant-collapse-item .ant-collapse-header-collapsible-only{cursor:default}.ant-collapse>.ant-collapse-item .ant-collapse-header-collapsible-only .ant-collapse-header-text{flex:none;cursor:pointer}.ant-collapse>.ant-collapse-item .ant-collapse-icon-collapsible-only{cursor:default}.ant-collapse>.ant-collapse-item .ant-collapse-icon-collapsible-only .ant-collapse-expand-icon{cursor:pointer}.ant-collapse>.ant-collapse-item.ant-collapse-no-arrow>.ant-collapse-header{padding-left:12px}.ant-collapse-icon-position-end>.ant-collapse-item>.ant-collapse-header{position:relative;padding:12px 40px 12px 16px}.ant-collapse-icon-position-end>.ant-collapse-item>.ant-collapse-header .ant-collapse-arrow{position:absolute;top:50%;right:16px;left:auto;margin:0;transform:translateY(-50%)}.ant-collapse-content{color:#000000d9;background-color:#fff;border-top:1px solid #d9d9d9}.ant-collapse-content>.ant-collapse-content-box{padding:16px}.ant-collapse-content-hidden{display:none}.ant-collapse-item:last-child>.ant-collapse-content{border-radius:0 0 2px 2px}.ant-collapse-borderless{background-color:#fafafa;border:0}.ant-collapse-borderless>.ant-collapse-item{border-bottom:1px solid #d9d9d9}.ant-collapse-borderless>.ant-collapse-item:last-child,.ant-collapse-borderless>.ant-collapse-item:last-child .ant-collapse-header{border-radius:0}.ant-collapse-borderless>.ant-collapse-item:last-child{border-bottom:0}.ant-collapse-borderless>.ant-collapse-item>.ant-collapse-content{background-color:transparent;border-top:0}.ant-collapse-borderless>.ant-collapse-item>.ant-collapse-content>.ant-collapse-content-box{padding-top:4px}.ant-collapse-ghost{background-color:transparent;border:0}.ant-collapse-ghost>.ant-collapse-item{border-bottom:0}.ant-collapse-ghost>.ant-collapse-item>.ant-collapse-content{background-color:transparent;border-top:0}.ant-collapse-ghost>.ant-collapse-item>.ant-collapse-content>.ant-collapse-content-box{padding-top:12px;padding-bottom:12px}.ant-collapse .ant-collapse-item-disabled>.ant-collapse-header,.ant-collapse .ant-collapse-item-disabled>.ant-collapse-header>.arrow{color:#00000040;cursor:not-allowed}.ant-collapse-rtl{direction:rtl}.ant-collapse-rtl.ant-collapse.ant-collapse-icon-position-end>.ant-collapse-item>.ant-collapse-header{position:relative;padding:12px 16px 12px 40px}.ant-collapse-rtl.ant-collapse.ant-collapse-icon-position-end>.ant-collapse-item>.ant-collapse-header .ant-collapse-arrow{position:absolute;top:50%;right:auto;left:16px;margin:0;transform:translateY(-50%)}.ant-collapse-rtl .ant-collapse>.ant-collapse-item>.ant-collapse-header{padding:12px 40px 12px 16px}.ant-collapse-rtl.ant-collapse>.ant-collapse-item>.ant-collapse-header .ant-collapse-arrow{margin-right:0;margin-left:12px}.ant-collapse-rtl.ant-collapse>.ant-collapse-item>.ant-collapse-header .ant-collapse-arrow svg{transform:rotate(180deg)}.ant-collapse-rtl.ant-collapse>.ant-collapse-item>.ant-collapse-header .ant-collapse-extra{margin-right:auto;margin-left:0}.ant-collapse-rtl.ant-collapse>.ant-collapse-item.ant-collapse-no-arrow>.ant-collapse-header{padding-right:12px;padding-left:0}.ant-comment{position:relative;background-color:inherit}.ant-comment-inner{display:flex;padding:16px 0}.ant-comment-avatar{position:relative;flex-shrink:0;margin-right:12px;cursor:pointer}.ant-comment-avatar img{width:32px;height:32px;border-radius:50%}.ant-comment-content{position:relative;flex:1 1 auto;min-width:1px;font-size:14px;word-wrap:break-word}.ant-comment-content-author{display:flex;flex-wrap:wrap;justify-content:flex-start;margin-bottom:4px;font-size:14px}.ant-comment-content-author>a,.ant-comment-content-author>span{padding-right:8px;font-size:12px;line-height:18px}.ant-comment-content-author-name{color:#00000073;font-size:14px;transition:color .3s}.ant-comment-content-author-name>*{color:#00000073}.ant-comment-content-author-name>*:hover{color:#00000073}.ant-comment-content-author-time{color:#ccc;white-space:nowrap;cursor:auto}.ant-comment-content-detail p{margin-bottom:inherit;white-space:pre-wrap}.ant-comment-actions{margin-top:12px;margin-bottom:inherit;padding-left:0}.ant-comment-actions>li{display:inline-block;color:#00000073}.ant-comment-actions>li>span{margin-right:10px;color:#00000073;font-size:12px;cursor:pointer;transition:color .3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-comment-actions>li>span:hover{color:#595959}.ant-comment-nested{margin-left:44px}.ant-comment-rtl{direction:rtl}.ant-comment-rtl .ant-comment-avatar{margin-right:0;margin-left:12px}.ant-comment-rtl .ant-comment-content-author>a,.ant-comment-rtl .ant-comment-content-author>span{padding-right:0;padding-left:8px}.ant-comment-rtl .ant-comment-actions{padding-right:0}.ant-comment-rtl .ant-comment-actions>li>span{margin-right:0;margin-left:10px}.ant-comment-rtl .ant-comment-nested{margin-right:44px;margin-left:0}.ant-descriptions-header{display:flex;align-items:center;margin-bottom:20px}.ant-descriptions-title{flex:auto;overflow:hidden;color:#000000d9;font-weight:700;font-size:16px;line-height:1.5715;white-space:nowrap;text-overflow:ellipsis}.ant-descriptions-extra{margin-left:auto;color:#000000d9;font-size:14px}.ant-descriptions-view{width:100%;border-radius:2px}.ant-descriptions-view table{width:100%;table-layout:fixed}.ant-descriptions-row>th,.ant-descriptions-row>td{padding-bottom:16px}.ant-descriptions-row:last-child{border-bottom:none}.ant-descriptions-item-label{color:#000000d9;font-weight:400;font-size:14px;line-height:1.5715;text-align:start}.ant-descriptions-item-label:after{content:":";position:relative;top:-.5px;margin:0 8px 0 2px}.ant-descriptions-item-label.ant-descriptions-item-no-colon:after{content:" "}.ant-descriptions-item-no-label:after{margin:0;content:""}.ant-descriptions-item-content{display:table-cell;flex:1;color:#000000d9;font-size:14px;line-height:1.5715;word-break:break-word;overflow-wrap:break-word}.ant-descriptions-item{padding-bottom:0;vertical-align:top}.ant-descriptions-item-container{display:flex}.ant-descriptions-item-container .ant-descriptions-item-label,.ant-descriptions-item-container .ant-descriptions-item-content{display:inline-flex;align-items:baseline}.ant-descriptions-middle .ant-descriptions-row>th,.ant-descriptions-middle .ant-descriptions-row>td{padding-bottom:12px}.ant-descriptions-small .ant-descriptions-row>th,.ant-descriptions-small .ant-descriptions-row>td{padding-bottom:8px}.ant-descriptions-bordered .ant-descriptions-view{border:1px solid #f0f0f0}.ant-descriptions-bordered .ant-descriptions-view>table{table-layout:auto;border-collapse:collapse}.ant-descriptions-bordered .ant-descriptions-item-label,.ant-descriptions-bordered .ant-descriptions-item-content{padding:16px 24px;border-right:1px solid #f0f0f0}.ant-descriptions-bordered .ant-descriptions-item-label:last-child,.ant-descriptions-bordered .ant-descriptions-item-content:last-child{border-right:none}.ant-descriptions-bordered .ant-descriptions-item-label{background-color:#fafafa}.ant-descriptions-bordered .ant-descriptions-item-label:after{display:none}.ant-descriptions-bordered .ant-descriptions-row{border-bottom:1px solid #f0f0f0}.ant-descriptions-bordered .ant-descriptions-row:last-child{border-bottom:none}.ant-descriptions-bordered.ant-descriptions-middle .ant-descriptions-item-label,.ant-descriptions-bordered.ant-descriptions-middle .ant-descriptions-item-content{padding:12px 24px}.ant-descriptions-bordered.ant-descriptions-small .ant-descriptions-item-label,.ant-descriptions-bordered.ant-descriptions-small .ant-descriptions-item-content{padding:8px 16px}.ant-descriptions-rtl{direction:rtl}.ant-descriptions-rtl .ant-descriptions-item-label:after{margin:0 2px 0 8px}.ant-descriptions-rtl.ant-descriptions-bordered .ant-descriptions-item-label,.ant-descriptions-rtl.ant-descriptions-bordered .ant-descriptions-item-content{border-right:none;border-left:1px solid #f0f0f0}.ant-descriptions-rtl.ant-descriptions-bordered .ant-descriptions-item-label:last-child,.ant-descriptions-rtl.ant-descriptions-bordered .ant-descriptions-item-content:last-child{border-left:none}.ant-divider{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";border-top:1px solid rgba(0,0,0,.06)}.ant-divider-vertical{position:relative;top:-.06em;display:inline-block;height:.9em;margin:0 8px;vertical-align:middle;border-top:0;border-left:1px solid rgba(0,0,0,.06)}.ant-divider-horizontal{display:flex;clear:both;width:100%;min-width:100%;margin:24px 0}.ant-divider-horizontal.ant-divider-with-text{display:flex;align-items:center;margin:16px 0;color:#000000d9;font-weight:500;font-size:16px;white-space:nowrap;text-align:center;border-top:0;border-top-color:#0000000f}.ant-divider-horizontal.ant-divider-with-text:before,.ant-divider-horizontal.ant-divider-with-text:after{position:relative;width:50%;border-top:1px solid transparent;border-top-color:inherit;border-bottom:0;transform:translateY(50%);content:""}.ant-divider-horizontal.ant-divider-with-text-left:before{width:5%}.ant-divider-horizontal.ant-divider-with-text-left:after{width:95%}.ant-divider-horizontal.ant-divider-with-text-right:before{width:95%}.ant-divider-horizontal.ant-divider-with-text-right:after{width:5%}.ant-divider-inner-text{display:inline-block;padding:0 1em}.ant-divider-dashed{background:none;border-color:#0000000f;border-style:dashed;border-width:1px 0 0}.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed:before,.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed:after{border-style:dashed none none}.ant-divider-vertical.ant-divider-dashed{border-width:0 0 0 1px}.ant-divider-plain.ant-divider-with-text{color:#000000d9;font-weight:400;font-size:14px}.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-no-default-orientation-margin-left:before{width:0}.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-no-default-orientation-margin-left:after{width:100%}.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-no-default-orientation-margin-left .ant-divider-inner-text{padding-left:0}.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-no-default-orientation-margin-right:before{width:100%}.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-no-default-orientation-margin-right:after{width:0}.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-no-default-orientation-margin-right .ant-divider-inner-text{padding-right:0}.ant-divider-rtl{direction:rtl}.ant-divider-rtl.ant-divider-horizontal.ant-divider-with-text-left:before{width:95%}.ant-divider-rtl.ant-divider-horizontal.ant-divider-with-text-left:after{width:5%}.ant-divider-rtl.ant-divider-horizontal.ant-divider-with-text-right:before{width:5%}.ant-divider-rtl.ant-divider-horizontal.ant-divider-with-text-right:after{width:95%}.ant-drawer{position:fixed;inset:0;z-index:1000;pointer-events:none}.ant-drawer-inline{position:absolute}.ant-drawer-mask{position:absolute;inset:0;z-index:1000;background:rgba(0,0,0,.45);pointer-events:auto}.ant-drawer-content-wrapper{position:absolute;z-index:1000;transition:all .3s}.ant-drawer-content-wrapper-hidden{display:none}.ant-drawer-left>.ant-drawer-content-wrapper{top:0;bottom:0;left:0;box-shadow:6px 0 16px -8px #00000014,9px 0 28px #0000000d,12px 0 48px 16px #00000008}.ant-drawer-right>.ant-drawer-content-wrapper{top:0;right:0;bottom:0;box-shadow:-6px 0 16px -8px #00000014,-9px 0 28px #0000000d,-12px 0 48px 16px #00000008}.ant-drawer-top>.ant-drawer-content-wrapper{top:0;right:0;left:0;box-shadow:0 6px 16px -8px #00000014,0 9px 28px #0000000d,0 12px 48px 16px #00000008}.ant-drawer-bottom>.ant-drawer-content-wrapper{right:0;bottom:0;left:0;box-shadow:0 -6px 16px -8px #00000014,0 -9px 28px #0000000d,0 -12px 48px 16px #00000008}.ant-drawer-content{width:100%;height:100%;overflow:auto;background:#fff;pointer-events:auto}.ant-drawer-wrapper-body{display:flex;flex-direction:column;width:100%;height:100%}.ant-drawer-header{display:flex;flex:0;align-items:center;padding:16px 24px;font-size:16px;line-height:22px;border-bottom:1px solid #f0f0f0}.ant-drawer-header-title{display:flex;flex:1;align-items:center;min-width:0;min-height:0}.ant-drawer-extra{flex:none}.ant-drawer-close{display:inline-block;margin-right:12px;color:#00000073;font-weight:700;font-size:16px;font-style:normal;line-height:1;text-align:center;text-transform:none;text-decoration:none;background:transparent;border:0;outline:0;cursor:pointer;transition:color .3s;text-rendering:auto}.ant-drawer-close:focus,.ant-drawer-close:hover{color:#000000bf;text-decoration:none}.ant-drawer-title{flex:1;margin:0;color:#000000d9;font-weight:500;font-size:16px;line-height:22px}.ant-drawer-body{flex:1;min-width:0;min-height:0;padding:24px;overflow:auto}.ant-drawer-footer{flex-shrink:0;padding:10px 16px;border-top:1px solid #f0f0f0}.panel-motion-enter-start,.panel-motion-appear-start,.panel-motion-leave-start{transition:none}.panel-motion-enter-active,.panel-motion-appear-active,.panel-motion-leave-active,.ant-drawer-mask-motion-enter-active,.ant-drawer-mask-motion-appear-active,.ant-drawer-mask-motion-leave-active{transition:all .3s}.ant-drawer-mask-motion-enter,.ant-drawer-mask-motion-appear{opacity:0}.ant-drawer-mask-motion-enter-active,.ant-drawer-mask-motion-appear-active,.ant-drawer-mask-motion-leave{opacity:1}.ant-drawer-mask-motion-leave-active{opacity:0}.ant-drawer-panel-motion-left-enter-start,.ant-drawer-panel-motion-left-appear-start,.ant-drawer-panel-motion-left-leave-start{transition:none}.ant-drawer-panel-motion-left-enter-active,.ant-drawer-panel-motion-left-appear-active,.ant-drawer-panel-motion-left-leave-active{transition:all .3s}.ant-drawer-panel-motion-left-enter-start,.ant-drawer-panel-motion-left-appear-start{transform:translate(-100%)!important}.ant-drawer-panel-motion-left-enter-active,.ant-drawer-panel-motion-left-appear-active,.ant-drawer-panel-motion-left-leave{transform:translate(0)}.ant-drawer-panel-motion-left-leave-active{transform:translate(-100%)}.ant-drawer-panel-motion-right-enter-start,.ant-drawer-panel-motion-right-appear-start,.ant-drawer-panel-motion-right-leave-start{transition:none}.ant-drawer-panel-motion-right-enter-active,.ant-drawer-panel-motion-right-appear-active,.ant-drawer-panel-motion-right-leave-active{transition:all .3s}.ant-drawer-panel-motion-right-enter-start,.ant-drawer-panel-motion-right-appear-start{transform:translate(100%)!important}.ant-drawer-panel-motion-right-enter-active,.ant-drawer-panel-motion-right-appear-active,.ant-drawer-panel-motion-right-leave{transform:translate(0)}.ant-drawer-panel-motion-right-leave-active{transform:translate(100%)}.ant-drawer-panel-motion-top-enter-start,.ant-drawer-panel-motion-top-appear-start,.ant-drawer-panel-motion-top-leave-start{transition:none}.ant-drawer-panel-motion-top-enter-active,.ant-drawer-panel-motion-top-appear-active,.ant-drawer-panel-motion-top-leave-active{transition:all .3s}.ant-drawer-panel-motion-top-enter-start,.ant-drawer-panel-motion-top-appear-start{transform:translateY(-100%)!important}.ant-drawer-panel-motion-top-enter-active,.ant-drawer-panel-motion-top-appear-active,.ant-drawer-panel-motion-top-leave{transform:translateY(0)}.ant-drawer-panel-motion-top-leave-active{transform:translateY(-100%)}.ant-drawer-panel-motion-bottom-enter-start,.ant-drawer-panel-motion-bottom-appear-start,.ant-drawer-panel-motion-bottom-leave-start{transition:none}.ant-drawer-panel-motion-bottom-enter-active,.ant-drawer-panel-motion-bottom-appear-active,.ant-drawer-panel-motion-bottom-leave-active{transition:all .3s}.ant-drawer-panel-motion-bottom-enter-start,.ant-drawer-panel-motion-bottom-appear-start{transform:translateY(100%)!important}.ant-drawer-panel-motion-bottom-enter-active,.ant-drawer-panel-motion-bottom-appear-active,.ant-drawer-panel-motion-bottom-leave{transform:translateY(0)}.ant-drawer-panel-motion-bottom-leave-active{transform:translateY(100%)}.ant-drawer-rtl{direction:rtl}.ant-drawer-rtl .ant-drawer-close{margin-right:0;margin-left:12px}.ant-form-item .ant-input-number+.ant-form-text{margin-left:8px}.ant-form-inline{display:flex;flex-wrap:wrap}.ant-form-inline .ant-form-item{flex:none;flex-wrap:nowrap;margin-right:16px;margin-bottom:0}.ant-form-inline .ant-form-item-with-help{margin-bottom:24px}.ant-form-inline .ant-form-item>.ant-form-item-label,.ant-form-inline .ant-form-item>.ant-form-item-control{display:inline-block;vertical-align:top}.ant-form-inline .ant-form-item>.ant-form-item-label{flex:none}.ant-form-inline .ant-form-item .ant-form-text,.ant-form-inline .ant-form-item .ant-form-item-has-feedback{display:inline-block}.ant-form-horizontal .ant-form-item-label{flex-grow:0}.ant-form-horizontal .ant-form-item-control{flex:1 1 0;min-width:0}.ant-form-horizontal .ant-form-item-label[class$="-24"]+.ant-form-item-control,.ant-form-horizontal .ant-form-item-label[class*="-24 "]+.ant-form-item-control{min-width:unset}.ant-form-vertical .ant-form-item-row{flex-direction:column}.ant-form-vertical .ant-form-item-label>label{height:auto}.ant-form-vertical .ant-form-item .ant-form-item-control{width:100%}.ant-form-vertical .ant-form-item-label,.ant-col-24.ant-form-item-label,.ant-col-xl-24.ant-form-item-label{padding:0 0 8px;line-height:1.5715;white-space:initial;text-align:left}.ant-form-vertical .ant-form-item-label>label,.ant-col-24.ant-form-item-label>label,.ant-col-xl-24.ant-form-item-label>label{margin:0}.ant-form-vertical .ant-form-item-label>label:after,.ant-col-24.ant-form-item-label>label:after,.ant-col-xl-24.ant-form-item-label>label:after{display:none}.ant-form-rtl.ant-form-vertical .ant-form-item-label,.ant-form-rtl.ant-col-24.ant-form-item-label,.ant-form-rtl.ant-col-xl-24.ant-form-item-label{text-align:right}@media (max-width: 575px){.ant-form-item .ant-form-item-label{padding:0 0 8px;line-height:1.5715;white-space:initial;text-align:left}.ant-form-item .ant-form-item-label>label{margin:0}.ant-form-item .ant-form-item-label>label:after{display:none}.ant-form-rtl.ant-form-item .ant-form-item-label{text-align:right}.ant-form .ant-form-item{flex-wrap:wrap}.ant-form .ant-form-item .ant-form-item-label,.ant-form .ant-form-item .ant-form-item-control{flex:0 0 100%;max-width:100%}.ant-col-xs-24.ant-form-item-label{padding:0 0 8px;line-height:1.5715;white-space:initial;text-align:left}.ant-col-xs-24.ant-form-item-label>label{margin:0}.ant-col-xs-24.ant-form-item-label>label:after{display:none}.ant-form-rtl.ant-col-xs-24.ant-form-item-label{text-align:right}}@media (max-width: 767px){.ant-col-sm-24.ant-form-item-label{padding:0 0 8px;line-height:1.5715;white-space:initial;text-align:left}.ant-col-sm-24.ant-form-item-label>label{margin:0}.ant-col-sm-24.ant-form-item-label>label:after{display:none}.ant-form-rtl.ant-col-sm-24.ant-form-item-label{text-align:right}}@media (max-width: 991px){.ant-col-md-24.ant-form-item-label{padding:0 0 8px;line-height:1.5715;white-space:initial;text-align:left}.ant-col-md-24.ant-form-item-label>label{margin:0}.ant-col-md-24.ant-form-item-label>label:after{display:none}.ant-form-rtl.ant-col-md-24.ant-form-item-label{text-align:right}}@media (max-width: 1199px){.ant-col-lg-24.ant-form-item-label{padding:0 0 8px;line-height:1.5715;white-space:initial;text-align:left}.ant-col-lg-24.ant-form-item-label>label{margin:0}.ant-col-lg-24.ant-form-item-label>label:after{display:none}.ant-form-rtl.ant-col-lg-24.ant-form-item-label{text-align:right}}@media (max-width: 1599px){.ant-col-xl-24.ant-form-item-label{padding:0 0 8px;line-height:1.5715;white-space:initial;text-align:left}.ant-col-xl-24.ant-form-item-label>label{margin:0}.ant-col-xl-24.ant-form-item-label>label:after{display:none}.ant-form-rtl.ant-col-xl-24.ant-form-item-label{text-align:right}}.ant-form-item-explain-error{color:#ff4d4f}.ant-form-item-explain-warning{color:#faad14}.ant-form-item-has-feedback .ant-switch{margin:2px 0 4px}.ant-form-item-has-warning .ant-form-item-split{color:#faad14}.ant-form-item-has-error .ant-form-item-split{color:#ff4d4f}.ant-form{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum"}.ant-form legend{display:block;width:100%;margin-bottom:20px;padding:0;color:#00000073;font-size:16px;line-height:inherit;border:0;border-bottom:1px solid #d9d9d9}.ant-form label{font-size:14px}.ant-form input[type=search]{box-sizing:border-box}.ant-form input[type=radio],.ant-form input[type=checkbox]{line-height:normal}.ant-form input[type=file]{display:block}.ant-form input[type=range]{display:block;width:100%}.ant-form select[multiple],.ant-form select[size]{height:auto}.ant-form input[type=file]:focus,.ant-form input[type=radio]:focus,.ant-form input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.ant-form output{display:block;padding-top:15px;color:#000000d9;font-size:14px;line-height:1.5715}.ant-form .ant-form-text{display:inline-block;padding-right:8px}.ant-form-small .ant-form-item-label>label{height:24px}.ant-form-small .ant-form-item-control-input{min-height:24px}.ant-form-large .ant-form-item-label>label{height:40px}.ant-form-large .ant-form-item-control-input{min-height:40px}.ant-form-item{box-sizing:border-box;margin:0 0 24px;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";vertical-align:top}.ant-form-item-with-help{transition:none}.ant-form-item-hidden,.ant-form-item-hidden.ant-row{display:none}.ant-form-item-label{display:inline-block;flex-grow:0;overflow:hidden;white-space:nowrap;text-align:right;vertical-align:middle}.ant-form-item-label-left{text-align:left}.ant-form-item-label-wrap{overflow:unset;line-height:1.3215em;white-space:unset}.ant-form-item-label>label{position:relative;display:inline-flex;align-items:center;max-width:100%;height:32px;color:#000000d9;font-size:14px}.ant-form-item-label>label>.anticon{font-size:14px;vertical-align:top}.ant-form-item-label>label.ant-form-item-required:not(.ant-form-item-required-mark-optional):before{display:inline-block;margin-right:4px;color:#ff4d4f;font-size:14px;font-family:SimSun,sans-serif;line-height:1;content:"*"}.ant-form-hide-required-mark .ant-form-item-label>label.ant-form-item-required:not(.ant-form-item-required-mark-optional):before{display:none}.ant-form-item-label>label .ant-form-item-optional{display:inline-block;margin-left:4px;color:#00000073}.ant-form-hide-required-mark .ant-form-item-label>label .ant-form-item-optional{display:none}.ant-form-item-label>label .ant-form-item-tooltip{color:#00000073;cursor:help;-ms-writing-mode:lr-tb;writing-mode:horizontal-tb;-webkit-margin-start:4px;margin-inline-start:4px}.ant-form-item-label>label:after{content:":";position:relative;top:-.5px;margin:0 8px 0 2px}.ant-form-item-label>label.ant-form-item-no-colon:after{content:" "}.ant-form-item-control{display:flex;flex-direction:column;flex-grow:1}.ant-form-item-control:first-child:not([class^="ant-col-"]):not([class*=" ant-col-"]){width:100%}.ant-form-item-control-input{position:relative;display:flex;align-items:center;min-height:32px}.ant-form-item-control-input-content{flex:auto;max-width:100%}.ant-form-item-explain,.ant-form-item-extra{clear:both;color:#00000073;font-size:14px;line-height:1.5715;transition:color .3s cubic-bezier(.215,.61,.355,1)}.ant-form-item-explain-connected{width:100%}.ant-form-item-extra{min-height:24px}.ant-form-item-with-help .ant-form-item-explain{height:auto;opacity:1}.ant-form-item-feedback-icon{font-size:14px;text-align:center;visibility:visible;animation:zoomIn .3s cubic-bezier(.12,.4,.29,1.46);pointer-events:none}.ant-form-item-feedback-icon-success{color:#52c41a}.ant-form-item-feedback-icon-error{color:#ff4d4f}.ant-form-item-feedback-icon-warning{color:#faad14}.ant-form-item-feedback-icon-validating{color:#1890ff}.ant-show-help{transition:opacity .3s cubic-bezier(.645,.045,.355,1)}.ant-show-help-appear,.ant-show-help-enter{opacity:0}.ant-show-help-appear-active,.ant-show-help-enter-active,.ant-show-help-leave{opacity:1}.ant-show-help-leave-active{opacity:0}.ant-show-help-item{overflow:hidden;transition:height .3s cubic-bezier(.645,.045,.355,1),opacity .3s cubic-bezier(.645,.045,.355,1),transform .3s cubic-bezier(.645,.045,.355,1)!important}.ant-show-help-item-appear,.ant-show-help-item-enter{transform:translateY(-5px);opacity:0}.ant-show-help-item-appear-active,.ant-show-help-item-enter-active{transform:translateY(0);opacity:1}.ant-show-help-item-leave{transition:height .2s cubic-bezier(.645,.045,.355,1),opacity .2s cubic-bezier(.645,.045,.355,1),transform .2s cubic-bezier(.645,.045,.355,1)!important}.ant-show-help-item-leave-active{transform:translateY(-5px)}@keyframes diffZoomIn1{0%{transform:scale(0);opacity:0}to{transform:scale(1);opacity:1}}@keyframes diffZoomIn2{0%{transform:scale(0);opacity:0}to{transform:scale(1);opacity:1}}@keyframes diffZoomIn3{0%{transform:scale(0);opacity:0}to{transform:scale(1);opacity:1}}.ant-form-rtl{direction:rtl}.ant-form-rtl .ant-form-item-label{text-align:left}.ant-form-rtl .ant-form-item-label>label.ant-form-item-required:before{margin-right:0;margin-left:4px}.ant-form-rtl .ant-form-item-label>label:after{margin:0 2px 0 8px}.ant-form-rtl .ant-form-item-label>label .ant-form-item-optional{margin-right:4px;margin-left:0}.ant-col-rtl .ant-form-item-control:first-child{width:100%}.ant-form-rtl .ant-form-item-has-feedback .ant-input{padding-right:11px;padding-left:24px}.ant-form-rtl .ant-form-item-has-feedback .ant-input-affix-wrapper .ant-input-suffix{padding-right:11px;padding-left:18px}.ant-form-rtl .ant-form-item-has-feedback .ant-input-affix-wrapper .ant-input,.ant-form-rtl .ant-form-item-has-feedback .ant-input-number-affix-wrapper .ant-input-number{padding:0}.ant-form-rtl .ant-form-item-has-feedback .ant-input-search:not(.ant-input-search-enter-button) .ant-input-suffix{right:auto;left:28px}.ant-form-rtl .ant-form-item-has-feedback .ant-input-number{padding-left:18px}.ant-form-rtl .ant-form-item-has-feedback>.ant-select .ant-select-arrow,.ant-form-rtl .ant-form-item-has-feedback>.ant-select .ant-select-clear,.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-group-addon)>.ant-select .ant-select-arrow,.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-group-addon)>.ant-select .ant-select-clear,.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-number-group-addon)>.ant-select .ant-select-arrow,.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-number-group-addon)>.ant-select .ant-select-clear{right:auto;left:32px}.ant-form-rtl .ant-form-item-has-feedback>.ant-select .ant-select-selection-selected-value,.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-group-addon)>.ant-select .ant-select-selection-selected-value,.ant-form-rtl .ant-form-item-has-feedback :not(.ant-input-number-group-addon)>.ant-select .ant-select-selection-selected-value{padding-right:0;padding-left:42px}.ant-form-rtl .ant-form-item-has-feedback .ant-cascader-picker-arrow{margin-right:0;margin-left:19px}.ant-form-rtl .ant-form-item-has-feedback .ant-cascader-picker-clear{right:auto;left:32px}.ant-form-rtl .ant-form-item-has-feedback .ant-picker,.ant-form-rtl .ant-form-item-has-feedback .ant-picker-large{padding-right:11px;padding-left:29.2px}.ant-form-rtl .ant-form-item-has-feedback .ant-picker-small{padding-right:7px;padding-left:25.2px}.ant-form-rtl .ant-form-item-has-feedback.ant-form-item-has-success .ant-form-item-children-icon,.ant-form-rtl .ant-form-item-has-feedback.ant-form-item-has-warning .ant-form-item-children-icon,.ant-form-rtl .ant-form-item-has-feedback.ant-form-item-has-error .ant-form-item-children-icon,.ant-form-rtl .ant-form-item-has-feedback.ant-form-item-is-validating .ant-form-item-children-icon{right:auto;left:0}.ant-form-rtl.ant-form-inline .ant-form-item{margin-right:0;margin-left:16px}.ant-image{position:relative;display:inline-block}.ant-image-img{width:100%;height:auto;vertical-align:middle}.ant-image-img-placeholder{background-color:#f5f5f5;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTQuNSAyLjVoLTEzQS41LjUgMCAwIDAgMSAzdjEwYS41LjUgMCAwIDAgLjUuNWgxM2EuNS41IDAgMCAwIC41LS41VjNhLjUuNSAwIDAgMC0uNS0uNXpNNS4yODEgNC43NWExIDEgMCAwIDEgMCAyIDEgMSAwIDAgMSAwLTJ6bTguMDMgNi44M2EuMTI3LjEyNyAwIDAgMS0uMDgxLjAzSDIuNzY5YS4xMjUuMTI1IDAgMCAxLS4wOTYtLjIwN2wyLjY2MS0zLjE1NmEuMTI2LjEyNiAwIDAgMSAuMTc3LS4wMTZsLjAxNi4wMTZMNy4wOCAxMC4wOWwyLjQ3LTIuOTNhLjEyNi4xMjYgMCAwIDEgLjE3Ny0uMDE2bC4wMTUuMDE2IDMuNTg4IDQuMjQ0YS4xMjcuMTI3IDAgMCAxLS4wMi4xNzV6IiBmaWxsPSIjOEM4QzhDIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L3N2Zz4=);background-repeat:no-repeat;background-position:center center;background-size:30%}.ant-image-mask{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#fff;background:rgba(0,0,0,.5);cursor:pointer;opacity:0;transition:opacity .3s}.ant-image-mask-info{padding:0 4px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-image-mask-info .anticon{-webkit-margin-end:4px;margin-inline-end:4px}.ant-image-mask:hover{opacity:1}.ant-image-placeholder{position:absolute;inset:0}.ant-image-preview{pointer-events:none;height:100%;text-align:center}.ant-image-preview.ant-zoom-enter,.ant-image-preview.ant-zoom-appear{transform:none;opacity:0;animation-duration:.3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-image-preview-mask{position:fixed;inset:0;z-index:1000;height:100%;background-color:#00000073}.ant-image-preview-mask-hidden{display:none}.ant-image-preview-wrap{position:fixed;inset:0;overflow:auto;outline:0}.ant-image-preview-body{position:absolute;inset:0;overflow:hidden}.ant-image-preview-img{max-width:100%;max-height:100%;vertical-align:middle;transform:scaleZ(1);cursor:grab;transition:transform .3s cubic-bezier(.215,.61,.355,1) 0s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:auto}.ant-image-preview-img-wrapper{position:absolute;inset:0;transition:transform .3s cubic-bezier(.215,.61,.355,1) 0s}.ant-image-preview-img-wrapper:before{display:inline-block;width:1px;height:50%;margin-right:-1px;content:""}.ant-image-preview-moving .ant-image-preview-img{cursor:grabbing}.ant-image-preview-moving .ant-image-preview-img-wrapper{transition-duration:0s}.ant-image-preview-wrap{z-index:1080}.ant-image-preview-operations-wrapper{position:fixed;top:0;right:0;z-index:1081;width:100%}.ant-image-preview-operations{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;font-feature-settings:"tnum";display:flex;flex-direction:row-reverse;align-items:center;color:#ffffffd9;list-style:none;background:rgba(0,0,0,.1);pointer-events:auto}.ant-image-preview-operations-operation{margin-left:12px;padding:12px;cursor:pointer;transition:all .3s}.ant-image-preview-operations-operation:hover{background:rgba(0,0,0,.2)}.ant-image-preview-operations-operation-disabled{color:#ffffff40;pointer-events:none}.ant-image-preview-operations-operation:last-of-type{margin-left:0}.ant-image-preview-operations-progress{position:absolute;left:50%;transform:translate(-50%)}.ant-image-preview-operations-icon{font-size:18px}.ant-image-preview-switch-left,.ant-image-preview-switch-right{position:fixed;top:50%;right:8px;z-index:1081;display:flex;align-items:center;justify-content:center;width:44px;height:44px;color:#ffffffd9;background:rgba(0,0,0,.1);border-radius:50%;transform:translateY(-50%);cursor:pointer;transition:all .3s;pointer-events:auto}.ant-image-preview-switch-left:hover,.ant-image-preview-switch-right:hover{background:rgba(0,0,0,.2)}.ant-image-preview-switch-left-disabled,.ant-image-preview-switch-right-disabled,.ant-image-preview-switch-left-disabled:hover,.ant-image-preview-switch-right-disabled:hover{color:#ffffff40;background:rgba(0,0,0,.1);cursor:not-allowed}.ant-image-preview-switch-left-disabled>.anticon,.ant-image-preview-switch-right-disabled>.anticon,.ant-image-preview-switch-left-disabled:hover>.anticon,.ant-image-preview-switch-right-disabled:hover>.anticon{cursor:not-allowed}.ant-image-preview-switch-left>.anticon,.ant-image-preview-switch-right>.anticon{font-size:18px}.ant-image-preview-switch-left{left:8px}.ant-image-preview-switch-right{right:8px}.ant-input-number-affix-wrapper{display:inline-block;width:100%;min-width:0;color:#000000d9;font-size:14px;line-height:1.5715;background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:2px;transition:all .3s;position:relative;display:inline-flex;width:90px;padding:0;-webkit-padding-start:11px;padding-inline-start:11px}.ant-input-number-affix-wrapper::-moz-placeholder{color:#bfbfbf;-moz-user-select:none;user-select:none}.ant-input-number-affix-wrapper:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-input-number-affix-wrapper::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-input-number-affix-wrapper:-moz-placeholder-shown{text-overflow:ellipsis}.ant-input-number-affix-wrapper:-ms-input-placeholder{text-overflow:ellipsis}.ant-input-number-affix-wrapper:placeholder-shown{text-overflow:ellipsis}.ant-input-number-affix-wrapper:hover{border-color:#40a9ff;border-right-width:1px}.ant-input-number-affix-wrapper:focus,.ant-input-number-affix-wrapper-focused{border-color:#40a9ff;box-shadow:0 0 0 2px #1890ff33;border-right-width:1px;outline:0}.ant-input-number-affix-wrapper-disabled{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-input-number-affix-wrapper-disabled:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input-number-affix-wrapper[disabled]{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-input-number-affix-wrapper[disabled]:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input-number-affix-wrapper-borderless,.ant-input-number-affix-wrapper-borderless:hover,.ant-input-number-affix-wrapper-borderless:focus,.ant-input-number-affix-wrapper-borderless-focused,.ant-input-number-affix-wrapper-borderless-disabled,.ant-input-number-affix-wrapper-borderless[disabled]{background-color:transparent;border:none;box-shadow:none}textarea.ant-input-number-affix-wrapper{max-width:100%;height:auto;min-height:32px;line-height:1.5715;vertical-align:bottom;transition:all .3s,height 0s}.ant-input-number-affix-wrapper-lg{padding:6.5px 11px;font-size:16px}.ant-input-number-affix-wrapper-sm{padding:0 7px}.ant-input-number-affix-wrapper:not(.ant-input-number-affix-wrapper-disabled):hover{border-color:#40a9ff;border-right-width:1px;z-index:1}.ant-input-number-affix-wrapper-focused,.ant-input-number-affix-wrapper:focus{z-index:1}.ant-input-number-affix-wrapper-disabled .ant-input-number[disabled]{background:transparent}.ant-input-number-affix-wrapper>div.ant-input-number{width:100%;border:none;outline:none}.ant-input-number-affix-wrapper>div.ant-input-number.ant-input-number-focused{box-shadow:none!important}.ant-input-number-affix-wrapper input.ant-input-number-input{padding:0}.ant-input-number-affix-wrapper:before{width:0;visibility:hidden;content:"\\a0"}.ant-input-number-affix-wrapper .ant-input-number-handler-wrap{z-index:2}.ant-input-number-prefix,.ant-input-number-suffix{display:flex;flex:none;align-items:center;pointer-events:none}.ant-input-number-prefix{-webkit-margin-end:4px;margin-inline-end:4px}.ant-input-number-suffix{position:absolute;top:0;right:0;z-index:1;height:100%;margin-right:11px;margin-left:4px}.ant-input-number-group-wrapper .ant-input-number-affix-wrapper{width:100%}.ant-input-number-status-error:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number,.ant-input-number-status-error:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number:hover{background:#fff;border-color:#ff4d4f}.ant-input-number-status-error:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number:focus,.ant-input-number-status-error:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number-focused{border-color:#ff7875;box-shadow:0 0 0 2px #ff4d4f33;border-right-width:1px;outline:0}.ant-input-number-status-error .ant-input-number-prefix{color:#ff4d4f}.ant-input-number-status-warning:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number,.ant-input-number-status-warning:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number:hover{background:#fff;border-color:#faad14}.ant-input-number-status-warning:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number:focus,.ant-input-number-status-warning:not(.ant-input-number-disabled):not(.ant-input-number-borderless).ant-input-number-focused{border-color:#ffc53d;box-shadow:0 0 0 2px #faad1433;border-right-width:1px;outline:0}.ant-input-number-status-warning .ant-input-number-prefix{color:#faad14}.ant-input-number-affix-wrapper-status-error:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper,.ant-input-number-affix-wrapper-status-error:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper:hover{background:#fff;border-color:#ff4d4f}.ant-input-number-affix-wrapper-status-error:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper:focus,.ant-input-number-affix-wrapper-status-error:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper-focused{border-color:#ff7875;box-shadow:0 0 0 2px #ff4d4f33;border-right-width:1px;outline:0}.ant-input-number-affix-wrapper-status-error .ant-input-number-prefix{color:#ff4d4f}.ant-input-number-affix-wrapper-status-warning:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper,.ant-input-number-affix-wrapper-status-warning:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper:hover{background:#fff;border-color:#faad14}.ant-input-number-affix-wrapper-status-warning:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper:focus,.ant-input-number-affix-wrapper-status-warning:not(.ant-input-number-affix-wrapper-disabled):not(.ant-input-number-affix-wrapper-borderless).ant-input-number-affix-wrapper-focused{border-color:#ffc53d;box-shadow:0 0 0 2px #faad1433;border-right-width:1px;outline:0}.ant-input-number-affix-wrapper-status-warning .ant-input-number-prefix{color:#faad14}.ant-input-number-group-wrapper-status-error .ant-input-number-group-addon{color:#ff4d4f;border-color:#ff4d4f}.ant-input-number-group-wrapper-status-warning .ant-input-number-group-addon{color:#faad14;border-color:#faad14}.ant-input-number{box-sizing:border-box;font-variant:tabular-nums;list-style:none;font-feature-settings:"tnum";position:relative;width:100%;min-width:0;color:#000000d9;font-size:14px;line-height:1.5715;background-color:#fff;background-image:none;transition:all .3s;display:inline-block;width:90px;margin:0;padding:0;border:1px solid #d9d9d9;border-radius:2px}.ant-input-number::-moz-placeholder{color:#bfbfbf;-moz-user-select:none;user-select:none}.ant-input-number:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-input-number::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-input-number:-moz-placeholder-shown{text-overflow:ellipsis}.ant-input-number:-ms-input-placeholder{text-overflow:ellipsis}.ant-input-number:placeholder-shown{text-overflow:ellipsis}.ant-input-number:focus,.ant-input-number-focused{border-color:#40a9ff;box-shadow:0 0 0 2px #1890ff33;border-right-width:1px;outline:0}.ant-input-number[disabled]{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-input-number[disabled]:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input-number-borderless,.ant-input-number-borderless:hover,.ant-input-number-borderless:focus,.ant-input-number-borderless-focused,.ant-input-number-borderless-disabled,.ant-input-number-borderless[disabled]{background-color:transparent;border:none;box-shadow:none}textarea.ant-input-number{max-width:100%;height:auto;min-height:32px;line-height:1.5715;vertical-align:bottom;transition:all .3s,height 0s}.ant-input-number-lg{padding:6.5px 11px;font-size:16px}.ant-input-number-sm{padding:0 7px}.ant-input-number-group{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;display:table;width:100%;border-collapse:separate;border-spacing:0}.ant-input-number-group[class*=col-]{float:none;padding-right:0;padding-left:0}.ant-input-number-group>[class*=col-]{padding-right:8px}.ant-input-number-group>[class*=col-]:last-child{padding-right:0}.ant-input-number-group-addon,.ant-input-number-group-wrap,.ant-input-number-group>.ant-input-number{display:table-cell}.ant-input-number-group-addon:not(:first-child):not(:last-child),.ant-input-number-group-wrap:not(:first-child):not(:last-child),.ant-input-number-group>.ant-input-number:not(:first-child):not(:last-child){border-radius:0}.ant-input-number-group-addon,.ant-input-number-group-wrap{width:1px;white-space:nowrap;vertical-align:middle}.ant-input-number-group-wrap>*{display:block!important}.ant-input-number-group .ant-input-number{float:left;width:100%;margin-bottom:0;text-align:inherit}.ant-input-number-group .ant-input-number:focus{z-index:1;border-right-width:1px}.ant-input-number-group .ant-input-number:hover{z-index:1;border-right-width:1px}.ant-input-search-with-button .ant-input-number-group .ant-input-number:hover{z-index:0}.ant-input-number-group-addon{position:relative;padding:0 11px;color:#000000d9;font-weight:400;font-size:14px;text-align:center;background-color:#fafafa;border:1px solid #d9d9d9;border-radius:2px;transition:all .3s}.ant-input-number-group-addon .ant-select{margin:-5px -11px}.ant-input-number-group-addon .ant-select.ant-select-single:not(.ant-select-customize-input) .ant-select-selector{background-color:inherit;border:1px solid transparent;box-shadow:none}.ant-input-number-group-addon .ant-select-open .ant-select-selector,.ant-input-number-group-addon .ant-select-focused .ant-select-selector{color:#1890ff}.ant-input-number-group-addon .ant-cascader-picker{margin:-9px -12px;background-color:transparent}.ant-input-number-group-addon .ant-cascader-picker .ant-cascader-input{text-align:left;border:0;box-shadow:none}.ant-input-number-group>.ant-input-number:first-child,.ant-input-number-group-addon:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-number-group>.ant-input-number:first-child .ant-select .ant-select-selector,.ant-input-number-group-addon:first-child .ant-select .ant-select-selector{border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-number-group>.ant-input-number-affix-wrapper:not(:first-child) .ant-input-number{border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-number-group>.ant-input-number-affix-wrapper:not(:last-child) .ant-input-number{border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-number-group-addon:first-child{border-right:0}.ant-input-number-group-addon:last-child{border-left:0}.ant-input-number-group>.ant-input-number:last-child,.ant-input-number-group-addon:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-number-group>.ant-input-number:last-child .ant-select .ant-select-selector,.ant-input-number-group-addon:last-child .ant-select .ant-select-selector{border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-number-group-lg .ant-input-number,.ant-input-number-group-lg>.ant-input-number-group-addon{padding:6.5px 11px;font-size:16px}.ant-input-number-group-sm .ant-input-number,.ant-input-number-group-sm>.ant-input-number-group-addon{padding:0 7px}.ant-input-number-group-lg .ant-select-single .ant-select-selector{height:40px}.ant-input-number-group-sm .ant-select-single .ant-select-selector{height:24px}.ant-input-number-group .ant-input-number-affix-wrapper:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-search .ant-input-number-group .ant-input-number-affix-wrapper:not(:last-child){border-top-left-radius:2px;border-bottom-left-radius:2px}.ant-input-number-group .ant-input-number-affix-wrapper:not(:first-child),.ant-input-search .ant-input-number-group .ant-input-number-affix-wrapper:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-number-group.ant-input-number-group-compact{display:block}.ant-input-number-group.ant-input-number-group-compact:before{display:table;content:""}.ant-input-number-group.ant-input-number-group-compact:after{display:table;clear:both;content:""}.ant-input-number-group.ant-input-number-group-compact-addon:not(:first-child):not(:last-child),.ant-input-number-group.ant-input-number-group-compact-wrap:not(:first-child):not(:last-child),.ant-input-number-group.ant-input-number-group-compact>.ant-input-number:not(:first-child):not(:last-child){border-right-width:1px}.ant-input-number-group.ant-input-number-group-compact-addon:not(:first-child):not(:last-child):hover,.ant-input-number-group.ant-input-number-group-compact-wrap:not(:first-child):not(:last-child):hover,.ant-input-number-group.ant-input-number-group-compact>.ant-input-number:not(:first-child):not(:last-child):hover{z-index:1}.ant-input-number-group.ant-input-number-group-compact-addon:not(:first-child):not(:last-child):focus,.ant-input-number-group.ant-input-number-group-compact-wrap:not(:first-child):not(:last-child):focus,.ant-input-number-group.ant-input-number-group-compact>.ant-input-number:not(:first-child):not(:last-child):focus{z-index:1}.ant-input-number-group.ant-input-number-group-compact>*{display:inline-block;float:none;vertical-align:top;border-radius:0}.ant-input-number-group.ant-input-number-group-compact>.ant-input-number-affix-wrapper{display:inline-flex}.ant-input-number-group.ant-input-number-group-compact>.ant-picker-range{display:inline-flex}.ant-input-number-group.ant-input-number-group-compact>*:not(:last-child){margin-right:-1px;border-right-width:1px}.ant-input-number-group.ant-input-number-group-compact .ant-input-number{float:none}.ant-input-number-group.ant-input-number-group-compact>.ant-select>.ant-select-selector,.ant-input-number-group.ant-input-number-group-compact>.ant-select-auto-complete .ant-input,.ant-input-number-group.ant-input-number-group-compact>.ant-cascader-picker .ant-input,.ant-input-number-group.ant-input-number-group-compact>.ant-input-group-wrapper .ant-input{border-right-width:1px;border-radius:0}.ant-input-number-group.ant-input-number-group-compact>.ant-select>.ant-select-selector:hover,.ant-input-number-group.ant-input-number-group-compact>.ant-select-auto-complete .ant-input:hover,.ant-input-number-group.ant-input-number-group-compact>.ant-cascader-picker .ant-input:hover,.ant-input-number-group.ant-input-number-group-compact>.ant-input-group-wrapper .ant-input:hover{z-index:1}.ant-input-number-group.ant-input-number-group-compact>.ant-select>.ant-select-selector:focus,.ant-input-number-group.ant-input-number-group-compact>.ant-select-auto-complete .ant-input:focus,.ant-input-number-group.ant-input-number-group-compact>.ant-cascader-picker .ant-input:focus,.ant-input-number-group.ant-input-number-group-compact>.ant-input-group-wrapper .ant-input:focus{z-index:1}.ant-input-number-group.ant-input-number-group-compact>.ant-select-focused{z-index:1}.ant-input-number-group.ant-input-number-group-compact>.ant-select>.ant-select-arrow{z-index:1}.ant-input-number-group.ant-input-number-group-compact>*:first-child,.ant-input-number-group.ant-input-number-group-compact>.ant-select:first-child>.ant-select-selector,.ant-input-number-group.ant-input-number-group-compact>.ant-select-auto-complete:first-child .ant-input,.ant-input-number-group.ant-input-number-group-compact>.ant-cascader-picker:first-child .ant-input{border-top-left-radius:2px;border-bottom-left-radius:2px}.ant-input-number-group.ant-input-number-group-compact>*:last-child,.ant-input-number-group.ant-input-number-group-compact>.ant-select:last-child>.ant-select-selector,.ant-input-number-group.ant-input-number-group-compact>.ant-cascader-picker:last-child .ant-input,.ant-input-number-group.ant-input-number-group-compact>.ant-cascader-picker-focused:last-child .ant-input{border-right-width:1px;border-top-right-radius:2px;border-bottom-right-radius:2px}.ant-input-number-group.ant-input-number-group-compact>.ant-select-auto-complete .ant-input{vertical-align:top}.ant-input-number-group.ant-input-number-group-compact .ant-input-group-wrapper+.ant-input-group-wrapper{margin-left:-1px}.ant-input-number-group.ant-input-number-group-compact .ant-input-group-wrapper+.ant-input-group-wrapper .ant-input-affix-wrapper{border-radius:0}.ant-input-number-group.ant-input-number-group-compact .ant-input-group-wrapper:not(:last-child).ant-input-search>.ant-input-group>.ant-input-group-addon>.ant-input-search-button{border-radius:0}.ant-input-number-group.ant-input-number-group-compact .ant-input-group-wrapper:not(:last-child).ant-input-search>.ant-input-group>.ant-input{border-radius:2px 0 0 2px}.ant-input-number-group>.ant-input-number-rtl:first-child{border-radius:0 2px 2px 0}.ant-input-number-group>.ant-input-number-rtl:last-child{border-radius:2px 0 0 2px}.ant-input-number-group-rtl .ant-input-number-group-addon:first-child{border-right:1px solid #d9d9d9;border-left:0;border-radius:0 2px 2px 0}.ant-input-number-group-rtl .ant-input-number-group-addon:last-child{border-right:0;border-left:1px solid #d9d9d9;border-radius:2px 0 0 2px}.ant-input-number-group-wrapper{display:inline-block;text-align:start;vertical-align:top}.ant-input-number-handler{position:relative;display:block;width:100%;height:50%;overflow:hidden;color:#00000073;font-weight:700;line-height:0;text-align:center;border-left:1px solid #d9d9d9;transition:all .1s linear}.ant-input-number-handler:active{background:#f4f4f4}.ant-input-number-handler:hover .ant-input-number-handler-up-inner,.ant-input-number-handler:hover .ant-input-number-handler-down-inner{color:#40a9ff}.ant-input-number-handler-up-inner,.ant-input-number-handler-down-inner{display:inline-block;color:inherit;font-style:normal;line-height:0;text-align:center;text-transform:none;vertical-align:-.125em;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;position:absolute;right:4px;width:12px;height:12px;color:#00000073;line-height:12px;transition:all .1s linear;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-input-number-handler-up-inner>*,.ant-input-number-handler-down-inner>*{line-height:1}.ant-input-number-handler-up-inner svg,.ant-input-number-handler-down-inner svg{display:inline-block}.ant-input-number-handler-up-inner:before,.ant-input-number-handler-down-inner:before{display:none}.ant-input-number-handler-up-inner .ant-input-number-handler-up-inner-icon,.ant-input-number-handler-up-inner .ant-input-number-handler-down-inner-icon,.ant-input-number-handler-down-inner .ant-input-number-handler-up-inner-icon,.ant-input-number-handler-down-inner .ant-input-number-handler-down-inner-icon{display:block}.ant-input-number:hover{border-color:#40a9ff;border-right-width:1px}.ant-input-number:hover+.ant-form-item-children-icon{opacity:0;transition:opacity .24s linear .24s}.ant-input-number-focused{border-color:#40a9ff;box-shadow:0 0 0 2px #1890ff33;border-right-width:1px;outline:0}.ant-input-number-disabled{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-input-number-disabled:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input-number-disabled .ant-input-number-input{cursor:not-allowed}.ant-input-number-disabled .ant-input-number-handler-wrap,.ant-input-number-readonly .ant-input-number-handler-wrap{display:none}.ant-input-number-input{width:100%;height:30px;padding:0 11px;text-align:left;background-color:transparent;border:0;border-radius:2px;outline:0;transition:all .3s linear;-webkit-appearance:textfield!important;-moz-appearance:textfield!important;appearance:textfield!important}.ant-input-number-input::-moz-placeholder{color:#bfbfbf;-moz-user-select:none;user-select:none}.ant-input-number-input:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-input-number-input::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-input-number-input:-moz-placeholder-shown{text-overflow:ellipsis}.ant-input-number-input:-ms-input-placeholder{text-overflow:ellipsis}.ant-input-number-input:placeholder-shown{text-overflow:ellipsis}.ant-input-number-input[type=number]::-webkit-inner-spin-button,.ant-input-number-input[type=number]::-webkit-outer-spin-button{margin:0;-webkit-appearance:none;appearance:none}.ant-input-number-lg{padding:0;font-size:16px}.ant-input-number-lg input{height:38px}.ant-input-number-sm{padding:0}.ant-input-number-sm input{height:22px;padding:0 7px}.ant-input-number-handler-wrap{position:absolute;top:0;right:0;width:22px;height:100%;background:#fff;border-radius:0 2px 2px 0;opacity:0;transition:opacity .24s linear .1s}.ant-input-number-handler-wrap .ant-input-number-handler .ant-input-number-handler-up-inner,.ant-input-number-handler-wrap .ant-input-number-handler .ant-input-number-handler-down-inner{display:flex;align-items:center;justify-content:center;min-width:auto;margin-right:0;font-size:7px}.ant-input-number-borderless .ant-input-number-handler-wrap{border-left-width:0}.ant-input-number-handler-wrap:hover .ant-input-number-handler{height:40%}.ant-input-number:hover .ant-input-number-handler-wrap,.ant-input-number-focused .ant-input-number-handler-wrap{opacity:1}.ant-input-number-handler-up{border-top-right-radius:2px;cursor:pointer}.ant-input-number-handler-up-inner{top:50%;margin-top:-5px;text-align:center}.ant-input-number-handler-up:hover{height:60%!important}.ant-input-number-handler-down{top:0;border-top:1px solid #d9d9d9;border-bottom-right-radius:2px;cursor:pointer}.ant-input-number-handler-down-inner{top:50%;text-align:center;transform:translateY(-50%)}.ant-input-number-handler-down:hover{height:60%!important}.ant-input-number-borderless .ant-input-number-handler-down{border-top-width:0}.ant-input-number:hover:not(.ant-input-number-borderless) .ant-input-number-handler-down,.ant-input-number-focused:not(.ant-input-number-borderless) .ant-input-number-handler-down{border-top:1px solid #d9d9d9}.ant-input-number-handler-up-disabled,.ant-input-number-handler-down-disabled{cursor:not-allowed}.ant-input-number-handler-up-disabled:hover .ant-input-number-handler-up-inner,.ant-input-number-handler-down-disabled:hover .ant-input-number-handler-down-inner{color:#00000040}.ant-input-number-borderless{box-shadow:none}.ant-input-number-out-of-range input{color:#ff4d4f}.ant-input-number-compact-item:not(.ant-input-number-compact-last-item):not(.ant-input-number-compact-item-rtl){margin-right:-1px}.ant-input-number-compact-item:not(.ant-input-number-compact-last-item).ant-input-number-compact-item-rtl{margin-left:-1px}.ant-input-number-compact-item:hover,.ant-input-number-compact-item:focus,.ant-input-number-compact-item:active{z-index:2}.ant-input-number-compact-item.ant-input-number-focused{z-index:2}.ant-input-number-compact-item[disabled]{z-index:0}.ant-input-number-compact-item:not(.ant-input-number-compact-first-item):not(.ant-input-number-compact-last-item).ant-input-number{border-radius:0}.ant-input-number-compact-item.ant-input-number.ant-input-number-compact-first-item:not(.ant-input-number-compact-last-item):not(.ant-input-number-compact-item-rtl){border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-number-compact-item.ant-input-number.ant-input-number-compact-last-item:not(.ant-input-number-compact-first-item):not(.ant-input-number-compact-item-rtl){border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-number-compact-item.ant-input-number.ant-input-number-compact-item-rtl.ant-input-number-compact-first-item:not(.ant-input-number-compact-last-item){border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-number-compact-item.ant-input-number.ant-input-number-compact-item-rtl.ant-input-number-compact-last-item:not(.ant-input-number-compact-first-item){border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-number-rtl{direction:rtl}.ant-input-number-rtl .ant-input-number-handler{border-right:1px solid #d9d9d9;border-left:0}.ant-input-number-rtl .ant-input-number-handler-wrap{right:auto;left:0}.ant-input-number-rtl.ant-input-number-borderless .ant-input-number-handler-wrap{border-right-width:0}.ant-input-number-rtl .ant-input-number-handler-up{border-top-right-radius:0}.ant-input-number-rtl .ant-input-number-handler-down{border-bottom-right-radius:0}.ant-input-number-rtl .ant-input-number-input{direction:ltr;text-align:right}.ant-input-affix-wrapper{position:relative;display:inline-block;width:100%;min-width:0;padding:4px 11px;color:#000000d9;font-size:14px;line-height:1.5715;background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:2px;transition:all .3s;display:inline-flex}.ant-input-affix-wrapper::-moz-placeholder{color:#bfbfbf;-moz-user-select:none;user-select:none}.ant-input-affix-wrapper:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-input-affix-wrapper::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-input-affix-wrapper:-moz-placeholder-shown{text-overflow:ellipsis}.ant-input-affix-wrapper:-ms-input-placeholder{text-overflow:ellipsis}.ant-input-affix-wrapper:placeholder-shown{text-overflow:ellipsis}.ant-input-affix-wrapper:hover{border-color:#40a9ff;border-right-width:1px}.ant-input-rtl .ant-input-affix-wrapper:hover{border-right-width:0;border-left-width:1px!important}.ant-input-affix-wrapper:focus,.ant-input-affix-wrapper-focused{border-color:#40a9ff;box-shadow:0 0 0 2px #1890ff33;border-right-width:1px;outline:0}.ant-input-rtl .ant-input-affix-wrapper:focus,.ant-input-rtl .ant-input-affix-wrapper-focused{border-right-width:0;border-left-width:1px!important}.ant-input-affix-wrapper-disabled{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-input-affix-wrapper-disabled:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input-affix-wrapper[disabled]{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-input-affix-wrapper[disabled]:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input-affix-wrapper-borderless,.ant-input-affix-wrapper-borderless:hover,.ant-input-affix-wrapper-borderless:focus,.ant-input-affix-wrapper-borderless-focused,.ant-input-affix-wrapper-borderless-disabled,.ant-input-affix-wrapper-borderless[disabled]{background-color:transparent;border:none;box-shadow:none}textarea.ant-input-affix-wrapper{max-width:100%;height:auto;min-height:32px;line-height:1.5715;vertical-align:bottom;transition:all .3s,height 0s}.ant-input-affix-wrapper-lg{padding:6.5px 11px;font-size:16px}.ant-input-affix-wrapper-sm{padding:0 7px}.ant-input-affix-wrapper-rtl{direction:rtl}.ant-input-affix-wrapper:not(.ant-input-affix-wrapper-disabled):hover{border-color:#40a9ff;border-right-width:1px;z-index:1}.ant-input-rtl .ant-input-affix-wrapper:not(.ant-input-affix-wrapper-disabled):hover{border-right-width:0;border-left-width:1px!important}.ant-input-search-with-button .ant-input-affix-wrapper:not(.ant-input-affix-wrapper-disabled):hover{z-index:0}.ant-input-affix-wrapper-focused,.ant-input-affix-wrapper:focus{z-index:1}.ant-input-affix-wrapper-disabled .ant-input[disabled]{background:rgba(255,255,255,0)}.ant-input-affix-wrapper>.ant-input{font-size:inherit;border:none;outline:none}.ant-input-affix-wrapper>.ant-input:focus{box-shadow:none!important}.ant-input-affix-wrapper>.ant-input:not(textarea){padding:0}.ant-input-affix-wrapper:before{width:0;visibility:hidden;content:"\\a0"}.ant-input-prefix,.ant-input-suffix{display:flex;flex:none;align-items:center}.ant-input-prefix>*:not(:last-child),.ant-input-suffix>*:not(:last-child){margin-right:8px}.ant-input-show-count-suffix{color:#00000073}.ant-input-show-count-has-suffix{margin-right:2px}.ant-input-prefix{margin-right:4px}.ant-input-suffix{margin-left:4px}.anticon.ant-input-clear-icon,.ant-input-clear-icon{margin:0;color:#00000040;font-size:12px;vertical-align:-1px;cursor:pointer;transition:color .3s}.anticon.ant-input-clear-icon:hover,.ant-input-clear-icon:hover{color:#00000073}.anticon.ant-input-clear-icon:active,.ant-input-clear-icon:active{color:#000000d9}.anticon.ant-input-clear-icon-hidden,.ant-input-clear-icon-hidden{visibility:hidden}.anticon.ant-input-clear-icon-has-suffix,.ant-input-clear-icon-has-suffix{margin:0 4px}.ant-input-affix-wrapper.ant-input-affix-wrapper-textarea-with-clear-btn{padding:0}.ant-input-affix-wrapper.ant-input-affix-wrapper-textarea-with-clear-btn .ant-input-clear-icon{position:absolute;top:8px;right:8px;z-index:1}.ant-input-status-error:not(.ant-input-disabled):not(.ant-input-borderless).ant-input,.ant-input-status-error:not(.ant-input-disabled):not(.ant-input-borderless).ant-input:hover{background:#fff;border-color:#ff4d4f}.ant-input-status-error:not(.ant-input-disabled):not(.ant-input-borderless).ant-input:focus,.ant-input-status-error:not(.ant-input-disabled):not(.ant-input-borderless).ant-input-focused{border-color:#ff7875;box-shadow:0 0 0 2px #ff4d4f33;border-right-width:1px;outline:0}.ant-input-status-error .ant-input-prefix{color:#ff4d4f}.ant-input-status-warning:not(.ant-input-disabled):not(.ant-input-borderless).ant-input,.ant-input-status-warning:not(.ant-input-disabled):not(.ant-input-borderless).ant-input:hover{background:#fff;border-color:#faad14}.ant-input-status-warning:not(.ant-input-disabled):not(.ant-input-borderless).ant-input:focus,.ant-input-status-warning:not(.ant-input-disabled):not(.ant-input-borderless).ant-input-focused{border-color:#ffc53d;box-shadow:0 0 0 2px #faad1433;border-right-width:1px;outline:0}.ant-input-status-warning .ant-input-prefix{color:#faad14}.ant-input-affix-wrapper-status-error:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper,.ant-input-affix-wrapper-status-error:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper:hover{background:#fff;border-color:#ff4d4f}.ant-input-affix-wrapper-status-error:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper:focus,.ant-input-affix-wrapper-status-error:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper-focused{border-color:#ff7875;box-shadow:0 0 0 2px #ff4d4f33;border-right-width:1px;outline:0}.ant-input-affix-wrapper-status-error .ant-input-prefix{color:#ff4d4f}.ant-input-affix-wrapper-status-warning:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper,.ant-input-affix-wrapper-status-warning:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper:hover{background:#fff;border-color:#faad14}.ant-input-affix-wrapper-status-warning:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper:focus,.ant-input-affix-wrapper-status-warning:not(.ant-input-affix-wrapper-disabled):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper-focused{border-color:#ffc53d;box-shadow:0 0 0 2px #faad1433;border-right-width:1px;outline:0}.ant-input-affix-wrapper-status-warning .ant-input-prefix{color:#faad14}.ant-input-textarea-status-error.ant-input-textarea-has-feedback .ant-input,.ant-input-textarea-status-warning.ant-input-textarea-has-feedback .ant-input,.ant-input-textarea-status-success.ant-input-textarea-has-feedback .ant-input,.ant-input-textarea-status-validating.ant-input-textarea-has-feedback .ant-input{padding-right:24px}.ant-input-group-wrapper-status-error .ant-input-group-addon{color:#ff4d4f;border-color:#ff4d4f}.ant-input-group-wrapper-status-warning .ant-input-group-addon{color:#faad14;border-color:#faad14}.ant-input{box-sizing:border-box;margin:0;font-variant:tabular-nums;list-style:none;font-feature-settings:"tnum";position:relative;display:inline-block;width:100%;min-width:0;padding:4px 11px;color:#000000d9;font-size:14px;line-height:1.5715;background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:2px;transition:all .3s}.ant-input::-moz-placeholder{color:#bfbfbf;-moz-user-select:none;user-select:none}.ant-input:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-input::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-input:-moz-placeholder-shown{text-overflow:ellipsis}.ant-input:-ms-input-placeholder{text-overflow:ellipsis}.ant-input:placeholder-shown{text-overflow:ellipsis}.ant-input:hover{border-color:#40a9ff;border-right-width:1px}.ant-input-rtl .ant-input:hover{border-right-width:0;border-left-width:1px!important}.ant-input:focus,.ant-input-focused{border-color:#40a9ff;box-shadow:0 0 0 2px #1890ff33;border-right-width:1px;outline:0}.ant-input-rtl .ant-input:focus,.ant-input-rtl .ant-input-focused{border-right-width:0;border-left-width:1px!important}.ant-input-disabled{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-input-disabled:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input[disabled]{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-input[disabled]:hover{border-color:#d9d9d9;border-right-width:1px}.ant-input-borderless,.ant-input-borderless:hover,.ant-input-borderless:focus,.ant-input-borderless-focused,.ant-input-borderless-disabled,.ant-input-borderless[disabled]{background-color:transparent;border:none;box-shadow:none}textarea.ant-input{max-width:100%;height:auto;min-height:32px;line-height:1.5715;vertical-align:bottom;transition:all .3s,height 0s}.ant-input-lg{padding:6.5px 11px;font-size:16px}.ant-input-sm{padding:0 7px}.ant-input-rtl{direction:rtl}.ant-input-group{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;display:table;width:100%;border-collapse:separate;border-spacing:0}.ant-input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.ant-input-group>[class*=col-]{padding-right:8px}.ant-input-group>[class*=col-]:last-child{padding-right:0}.ant-input-group-addon,.ant-input-group-wrap,.ant-input-group>.ant-input{display:table-cell}.ant-input-group-addon:not(:first-child):not(:last-child),.ant-input-group-wrap:not(:first-child):not(:last-child),.ant-input-group>.ant-input:not(:first-child):not(:last-child){border-radius:0}.ant-input-group-addon,.ant-input-group-wrap{width:1px;white-space:nowrap;vertical-align:middle}.ant-input-group-wrap>*{display:block!important}.ant-input-group .ant-input{float:left;width:100%;margin-bottom:0;text-align:inherit}.ant-input-group .ant-input:focus{z-index:1;border-right-width:1px}.ant-input-group .ant-input:hover{z-index:1;border-right-width:1px}.ant-input-search-with-button .ant-input-group .ant-input:hover{z-index:0}.ant-input-group-addon{position:relative;padding:0 11px;color:#000000d9;font-weight:400;font-size:14px;text-align:center;background-color:#fafafa;border:1px solid #d9d9d9;border-radius:2px;transition:all .3s}.ant-input-group-addon .ant-select{margin:-5px -11px}.ant-input-group-addon .ant-select.ant-select-single:not(.ant-select-customize-input) .ant-select-selector{background-color:inherit;border:1px solid transparent;box-shadow:none}.ant-input-group-addon .ant-select-open .ant-select-selector,.ant-input-group-addon .ant-select-focused .ant-select-selector{color:#1890ff}.ant-input-group-addon .ant-cascader-picker{margin:-9px -12px;background-color:transparent}.ant-input-group-addon .ant-cascader-picker .ant-cascader-input{text-align:left;border:0;box-shadow:none}.ant-input-group>.ant-input:first-child,.ant-input-group-addon:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-group>.ant-input:first-child .ant-select .ant-select-selector,.ant-input-group-addon:first-child .ant-select .ant-select-selector{border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-group>.ant-input-affix-wrapper:not(:first-child) .ant-input{border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-group>.ant-input-affix-wrapper:not(:last-child) .ant-input{border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-group-addon:first-child{border-right:0}.ant-input-group-addon:last-child{border-left:0}.ant-input-group>.ant-input:last-child,.ant-input-group-addon:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-group>.ant-input:last-child .ant-select .ant-select-selector,.ant-input-group-addon:last-child .ant-select .ant-select-selector{border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-group-lg .ant-input,.ant-input-group-lg>.ant-input-group-addon{padding:6.5px 11px;font-size:16px}.ant-input-group-sm .ant-input,.ant-input-group-sm>.ant-input-group-addon{padding:0 7px}.ant-input-group-lg .ant-select-single .ant-select-selector{height:40px}.ant-input-group-sm .ant-select-single .ant-select-selector{height:24px}.ant-input-group .ant-input-affix-wrapper:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-search .ant-input-group .ant-input-affix-wrapper:not(:last-child){border-top-left-radius:2px;border-bottom-left-radius:2px}.ant-input-group .ant-input-affix-wrapper:not(:first-child),.ant-input-search .ant-input-group .ant-input-affix-wrapper:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-group.ant-input-group-compact{display:block}.ant-input-group.ant-input-group-compact:before{display:table;content:""}.ant-input-group.ant-input-group-compact:after{display:table;clear:both;content:""}.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child),.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child),.ant-input-group.ant-input-group-compact>.ant-input:not(:first-child):not(:last-child){border-right-width:1px}.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child):hover,.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child):hover,.ant-input-group.ant-input-group-compact>.ant-input:not(:first-child):not(:last-child):hover{z-index:1}.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child):focus,.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child):focus,.ant-input-group.ant-input-group-compact>.ant-input:not(:first-child):not(:last-child):focus{z-index:1}.ant-input-group.ant-input-group-compact>*{display:inline-block;float:none;vertical-align:top;border-radius:0}.ant-input-group.ant-input-group-compact>.ant-input-affix-wrapper{display:inline-flex}.ant-input-group.ant-input-group-compact>.ant-picker-range{display:inline-flex}.ant-input-group.ant-input-group-compact>*:not(:last-child){margin-right:-1px;border-right-width:1px}.ant-input-group.ant-input-group-compact .ant-input{float:none}.ant-input-group.ant-input-group-compact>.ant-select>.ant-select-selector,.ant-input-group.ant-input-group-compact>.ant-select-auto-complete .ant-input,.ant-input-group.ant-input-group-compact>.ant-cascader-picker .ant-input,.ant-input-group.ant-input-group-compact>.ant-input-group-wrapper .ant-input{border-right-width:1px;border-radius:0}.ant-input-group.ant-input-group-compact>.ant-select>.ant-select-selector:hover,.ant-input-group.ant-input-group-compact>.ant-select-auto-complete .ant-input:hover,.ant-input-group.ant-input-group-compact>.ant-cascader-picker .ant-input:hover,.ant-input-group.ant-input-group-compact>.ant-input-group-wrapper .ant-input:hover{z-index:1}.ant-input-group.ant-input-group-compact>.ant-select>.ant-select-selector:focus,.ant-input-group.ant-input-group-compact>.ant-select-auto-complete .ant-input:focus,.ant-input-group.ant-input-group-compact>.ant-cascader-picker .ant-input:focus,.ant-input-group.ant-input-group-compact>.ant-input-group-wrapper .ant-input:focus{z-index:1}.ant-input-group.ant-input-group-compact>.ant-select-focused{z-index:1}.ant-input-group.ant-input-group-compact>.ant-select>.ant-select-arrow{z-index:1}.ant-input-group.ant-input-group-compact>*:first-child,.ant-input-group.ant-input-group-compact>.ant-select:first-child>.ant-select-selector,.ant-input-group.ant-input-group-compact>.ant-select-auto-complete:first-child .ant-input,.ant-input-group.ant-input-group-compact>.ant-cascader-picker:first-child .ant-input{border-top-left-radius:2px;border-bottom-left-radius:2px}.ant-input-group.ant-input-group-compact>*:last-child,.ant-input-group.ant-input-group-compact>.ant-select:last-child>.ant-select-selector,.ant-input-group.ant-input-group-compact>.ant-cascader-picker:last-child .ant-input,.ant-input-group.ant-input-group-compact>.ant-cascader-picker-focused:last-child .ant-input{border-right-width:1px;border-top-right-radius:2px;border-bottom-right-radius:2px}.ant-input-group.ant-input-group-compact>.ant-select-auto-complete .ant-input{vertical-align:top}.ant-input-group.ant-input-group-compact .ant-input-group-wrapper+.ant-input-group-wrapper{margin-left:-1px}.ant-input-group.ant-input-group-compact .ant-input-group-wrapper+.ant-input-group-wrapper .ant-input-affix-wrapper{border-radius:0}.ant-input-group.ant-input-group-compact .ant-input-group-wrapper:not(:last-child).ant-input-search>.ant-input-group>.ant-input-group-addon>.ant-input-search-button{border-radius:0}.ant-input-group.ant-input-group-compact .ant-input-group-wrapper:not(:last-child).ant-input-search>.ant-input-group>.ant-input{border-radius:2px 0 0 2px}.ant-input-group>.ant-input-rtl:first-child,.ant-input-group-rtl .ant-input-group-addon:first-child{border-radius:0 2px 2px 0}.ant-input-group-rtl .ant-input-group-addon:first-child{border-right:1px solid #d9d9d9;border-left:0}.ant-input-group-rtl .ant-input-group-addon:last-child{border-right:0;border-left:1px solid #d9d9d9;border-radius:2px 0 0 2px}.ant-input-group-rtl.ant-input-group>.ant-input:last-child,.ant-input-group-rtl.ant-input-group-addon:last-child{border-radius:2px 0 0 2px}.ant-input-group-rtl.ant-input-group .ant-input-affix-wrapper:not(:first-child){border-radius:2px 0 0 2px}.ant-input-group-rtl.ant-input-group .ant-input-affix-wrapper:not(:last-child){border-radius:0 2px 2px 0}.ant-input-group-rtl.ant-input-group.ant-input-group-compact>*:not(:last-child){margin-right:0;margin-left:-1px;border-left-width:1px}.ant-input-group-rtl.ant-input-group.ant-input-group-compact>*:first-child,.ant-input-group-rtl.ant-input-group.ant-input-group-compact>.ant-select:first-child>.ant-select-selector,.ant-input-group-rtl.ant-input-group.ant-input-group-compact>.ant-select-auto-complete:first-child .ant-input,.ant-input-group-rtl.ant-input-group.ant-input-group-compact>.ant-cascader-picker:first-child .ant-input{border-radius:0 2px 2px 0}.ant-input-group-rtl.ant-input-group.ant-input-group-compact>*:last-child,.ant-input-group-rtl.ant-input-group.ant-input-group-compact>.ant-select:last-child>.ant-select-selector,.ant-input-group-rtl.ant-input-group.ant-input-group-compact>.ant-select-auto-complete:last-child .ant-input,.ant-input-group-rtl.ant-input-group.ant-input-group-compact>.ant-cascader-picker:last-child .ant-input,.ant-input-group-rtl.ant-input-group.ant-input-group-compact>.ant-cascader-picker-focused:last-child .ant-input{border-left-width:1px;border-radius:2px 0 0 2px}.ant-input-group.ant-input-group-compact .ant-input-group-wrapper-rtl+.ant-input-group-wrapper-rtl{margin-right:-1px;margin-left:0}.ant-input-group.ant-input-group-compact .ant-input-group-wrapper-rtl:not(:last-child).ant-input-search>.ant-input-group>.ant-input{border-radius:0 2px 2px 0}.ant-input-group-wrapper{display:inline-block;width:100%;text-align:start;vertical-align:top}.ant-input-password-icon.anticon{color:#00000073;cursor:pointer;transition:all .3s}.ant-input-password-icon.anticon:hover{color:#000000d9}.ant-input[type=color]{height:32px}.ant-input[type=color].ant-input-lg{height:40px}.ant-input[type=color].ant-input-sm{height:24px;padding-top:3px;padding-bottom:3px}.ant-input-textarea-show-count>.ant-input{height:100%}.ant-input-textarea-show-count:after{float:right;color:#00000073;white-space:nowrap;content:attr(data-count);pointer-events:none}.ant-input-textarea-show-count.ant-input-textarea-in-form-item:after{margin-bottom:-22px}.ant-input-textarea-suffix{position:absolute;top:0;right:11px;bottom:0;z-index:1;display:inline-flex;align-items:center;margin:auto}.ant-input-compact-item:not(.ant-input-compact-last-item):not(.ant-input-compact-item-rtl){margin-right:-1px}.ant-input-compact-item:not(.ant-input-compact-last-item).ant-input-compact-item-rtl{margin-left:-1px}.ant-input-compact-item:hover,.ant-input-compact-item:focus,.ant-input-compact-item:active{z-index:2}.ant-input-compact-item[disabled]{z-index:0}.ant-input-compact-item:not(.ant-input-compact-first-item):not(.ant-input-compact-last-item).ant-input{border-radius:0}.ant-input-compact-item.ant-input.ant-input-compact-first-item:not(.ant-input-compact-last-item):not(.ant-input-compact-item-rtl){border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-compact-item.ant-input.ant-input-compact-last-item:not(.ant-input-compact-first-item):not(.ant-input-compact-item-rtl){border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-compact-item.ant-input.ant-input-compact-item-rtl.ant-input-compact-first-item:not(.ant-input-compact-last-item){border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-compact-item.ant-input.ant-input-compact-item-rtl.ant-input-compact-last-item:not(.ant-input-compact-first-item){border-top-right-radius:0;border-bottom-right-radius:0}.ant-input-search .ant-input:hover,.ant-input-search .ant-input:focus{border-color:#40a9ff}.ant-input-search .ant-input:hover+.ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary),.ant-input-search .ant-input:focus+.ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary){border-left-color:#40a9ff}.ant-input-search .ant-input-affix-wrapper{border-radius:0}.ant-input-search .ant-input-lg{line-height:1.5713}.ant-input-search>.ant-input-group>.ant-input-group-addon:last-child{left:-1px;padding:0;border:0}.ant-input-search>.ant-input-group>.ant-input-group-addon:last-child .ant-input-search-button{padding-top:0;padding-bottom:0;border-radius:0 2px 2px 0}.ant-input-search>.ant-input-group>.ant-input-group-addon:last-child .ant-input-search-button:not(.ant-btn-primary){color:#00000073}.ant-input-search>.ant-input-group>.ant-input-group-addon:last-child .ant-input-search-button:not(.ant-btn-primary).ant-btn-loading:before{inset:0}.ant-input-search-button{height:32px}.ant-input-search-button:hover,.ant-input-search-button:focus{z-index:1}.ant-input-search-large .ant-input-search-button{height:40px}.ant-input-search-small .ant-input-search-button{height:24px}.ant-input-search.ant-input-compact-item:not(.ant-input-compact-item-rtl):not(.ant-input-compact-last-item) .ant-input-group-addon .ant-input-search-button{margin-right:-1px;border-radius:0}.ant-input-search.ant-input-compact-item:not(.ant-input-compact-first-item) .ant-input,.ant-input-search.ant-input-compact-item:not(.ant-input-compact-first-item) .ant-input-affix-wrapper{border-radius:0}.ant-input-search.ant-input-compact-item>.ant-input-group-addon .ant-input-search-button:hover,.ant-input-search.ant-input-compact-item>.ant-input:hover,.ant-input-search.ant-input-compact-item .ant-input-affix-wrapper:hover,.ant-input-search.ant-input-compact-item>.ant-input-group-addon .ant-input-search-button:focus,.ant-input-search.ant-input-compact-item>.ant-input:focus,.ant-input-search.ant-input-compact-item .ant-input-affix-wrapper:focus,.ant-input-search.ant-input-compact-item>.ant-input-group-addon .ant-input-search-button:active,.ant-input-search.ant-input-compact-item>.ant-input:active,.ant-input-search.ant-input-compact-item .ant-input-affix-wrapper:active{z-index:2}.ant-input-search.ant-input-compact-item>.ant-input-affix-wrapper-focused{z-index:2}.ant-input-search.ant-input-compact-item-rtl:not(.ant-input-compact-last-item) .ant-input-group-addon:last-child .ant-input-search-button{margin-left:-1px;border-radius:0}.ant-input-group-wrapper-rtl,.ant-input-group-rtl{direction:rtl}.ant-input-affix-wrapper.ant-input-affix-wrapper-rtl>input.ant-input{border:none;outline:none}.ant-input-affix-wrapper-rtl .ant-input-prefix{margin:0 0 0 4px}.ant-input-affix-wrapper-rtl .ant-input-suffix{margin:0 4px 0 0}.ant-input-textarea-rtl{direction:rtl}.ant-input-textarea-rtl.ant-input-textarea-show-count:after{text-align:left}.ant-input-affix-wrapper-rtl .ant-input-clear-icon-has-suffix{margin-right:0;margin-left:4px}.ant-input-affix-wrapper-rtl .ant-input-clear-icon{right:auto;left:8px}.ant-input-search-rtl{direction:rtl}.ant-input-search-rtl .ant-input:hover+.ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary),.ant-input-search-rtl .ant-input:focus+.ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary){border-left-color:#d9d9d9}.ant-input-search-rtl .ant-input:hover+.ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary):hover,.ant-input-search-rtl .ant-input:focus+.ant-input-group-addon .ant-input-search-button:not(.ant-btn-primary):hover{border-left-color:#40a9ff}.ant-input-search-rtl>.ant-input-group>.ant-input-affix-wrapper:hover,.ant-input-search-rtl>.ant-input-group>.ant-input-affix-wrapper-focused{border-right-color:#40a9ff}.ant-input-search-rtl>.ant-input-group>.ant-input-group-addon:last-child{right:-1px;left:auto}.ant-input-search-rtl>.ant-input-group>.ant-input-group-addon:last-child .ant-input-search-button{border-radius:2px 0 0 2px}@media screen and (-ms-high-contrast: active),(-ms-high-contrast: none){.ant-input{height:32px}.ant-input-lg{height:40px}.ant-input-sm{height:24px}.ant-input-affix-wrapper>input.ant-input{height:auto}}.ant-layout{display:flex;flex:auto;flex-direction:column;min-height:0;background:#f0f2f5}.ant-layout,.ant-layout *{box-sizing:border-box}.ant-layout.ant-layout-has-sider{flex-direction:row}.ant-layout.ant-layout-has-sider>.ant-layout,.ant-layout.ant-layout-has-sider>.ant-layout-content{width:0}.ant-layout-header,.ant-layout-footer{flex:0 0 auto}.ant-layout-header{height:64px;padding:0 50px;color:#000000d9;line-height:64px;background:#001529}.ant-layout-footer{padding:24px 50px;color:#000000d9;font-size:14px;background:#f0f2f5}.ant-layout-content{flex:auto;min-height:0}.ant-layout-sider{position:relative;min-width:0;background:#001529;transition:all .2s}.ant-layout-sider-children{height:100%;margin-top:-.1px;padding-top:.1px}.ant-layout-sider-children .ant-menu.ant-menu-inline-collapsed{width:auto}.ant-layout-sider-has-trigger{padding-bottom:48px}.ant-layout-sider-right{order:1}.ant-layout-sider-trigger{position:fixed;bottom:0;z-index:1;height:48px;color:#fff;line-height:48px;text-align:center;background:#002140;cursor:pointer;transition:all .2s}.ant-layout-sider-zero-width>*{overflow:hidden}.ant-layout-sider-zero-width-trigger{position:absolute;top:64px;right:-36px;z-index:1;width:36px;height:42px;color:#fff;font-size:18px;line-height:42px;text-align:center;background:#001529;border-radius:0 2px 2px 0;cursor:pointer;transition:background .3s ease}.ant-layout-sider-zero-width-trigger:after{position:absolute;inset:0;background:transparent;transition:all .3s;content:""}.ant-layout-sider-zero-width-trigger:hover:after{background:rgba(255,255,255,.1)}.ant-layout-sider-zero-width-trigger-right{left:-36px;border-radius:2px 0 0 2px}.ant-layout-sider-light{background:#fff}.ant-layout-sider-light .ant-layout-sider-trigger,.ant-layout-sider-light .ant-layout-sider-zero-width-trigger{color:#000000d9;background:#fff}.ant-layout-rtl{direction:rtl}.ant-list{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative}.ant-list *{outline:none}.ant-list-pagination{margin-top:24px;text-align:right}.ant-list-pagination .ant-pagination-options{text-align:left}.ant-list-more{margin-top:12px;text-align:center}.ant-list-more button{padding-right:32px;padding-left:32px}.ant-list-spin{min-height:40px;text-align:center}.ant-list-empty-text{padding:16px;color:#00000040;font-size:14px;text-align:center}.ant-list-items{margin:0;padding:0;list-style:none}.ant-list-item{display:flex;align-items:center;justify-content:space-between;padding:12px 0;color:#000000d9}.ant-list-item-meta{display:flex;flex:1;align-items:flex-start;max-width:100%}.ant-list-item-meta-avatar{margin-right:16px}.ant-list-item-meta-content{flex:1 0;width:0;color:#000000d9}.ant-list-item-meta-title{margin-bottom:4px;color:#000000d9;font-size:14px;line-height:1.5715}.ant-list-item-meta-title>a{color:#000000d9;transition:all .3s}.ant-list-item-meta-title>a:hover{color:#1890ff}.ant-list-item-meta-description{color:#00000073;font-size:14px;line-height:1.5715}.ant-list-item-action{flex:0 0 auto;margin-left:48px;padding:0;font-size:0;list-style:none}.ant-list-item-action>li{position:relative;display:inline-block;padding:0 8px;color:#00000073;font-size:14px;line-height:1.5715;text-align:center}.ant-list-item-action>li:first-child{padding-left:0}.ant-list-item-action-split{position:absolute;top:50%;right:0;width:1px;height:14px;margin-top:-7px;background-color:#f0f0f0}.ant-list-header,.ant-list-footer{background:transparent}.ant-list-header,.ant-list-footer{padding-top:12px;padding-bottom:12px}.ant-list-empty{padding:16px 0;color:#00000073;font-size:12px;text-align:center}.ant-list-split .ant-list-item{border-bottom:1px solid #f0f0f0}.ant-list-split .ant-list-item:last-child{border-bottom:none}.ant-list-split .ant-list-header{border-bottom:1px solid #f0f0f0}.ant-list-split.ant-list-empty .ant-list-footer{border-top:1px solid #f0f0f0}.ant-list-loading .ant-list-spin-nested-loading{min-height:32px}.ant-list-split.ant-list-something-after-last-item .ant-spin-container>.ant-list-items>.ant-list-item:last-child{border-bottom:1px solid #f0f0f0}.ant-list-lg .ant-list-item{padding:16px 24px}.ant-list-sm .ant-list-item{padding:8px 16px}.ant-list-vertical .ant-list-item{align-items:initial}.ant-list-vertical .ant-list-item-main{display:block;flex:1}.ant-list-vertical .ant-list-item-extra{margin-left:40px}.ant-list-vertical .ant-list-item-meta{margin-bottom:16px}.ant-list-vertical .ant-list-item-meta-title{margin-bottom:12px;color:#000000d9;font-size:16px;line-height:24px}.ant-list-vertical .ant-list-item-action{margin-top:16px;margin-left:auto}.ant-list-vertical .ant-list-item-action>li{padding:0 16px}.ant-list-vertical .ant-list-item-action>li:first-child{padding-left:0}.ant-list-grid .ant-col>.ant-list-item{display:block;max-width:100%;margin-bottom:16px;padding-top:0;padding-bottom:0;border-bottom:none}.ant-list-item-no-flex{display:block}.ant-list:not(.ant-list-vertical) .ant-list-item-no-flex .ant-list-item-action{float:right}.ant-list-bordered{border:1px solid #d9d9d9;border-radius:2px}.ant-list-bordered .ant-list-header,.ant-list-bordered .ant-list-footer,.ant-list-bordered .ant-list-item{padding-right:24px;padding-left:24px}.ant-list-bordered .ant-list-pagination{margin:16px 24px}.ant-list-bordered.ant-list-sm .ant-list-item,.ant-list-bordered.ant-list-sm .ant-list-header,.ant-list-bordered.ant-list-sm .ant-list-footer{padding:8px 16px}.ant-list-bordered.ant-list-lg .ant-list-item,.ant-list-bordered.ant-list-lg .ant-list-header,.ant-list-bordered.ant-list-lg .ant-list-footer{padding:16px 24px}@media screen and (max-width: 768px){.ant-list-item-action,.ant-list-vertical .ant-list-item-extra{margin-left:24px}}@media screen and (max-width: 576px){.ant-list-item{flex-wrap:wrap}.ant-list-item-action{margin-left:12px}.ant-list-vertical .ant-list-item{flex-wrap:wrap-reverse}.ant-list-vertical .ant-list-item-main{min-width:220px}.ant-list-vertical .ant-list-item-extra{margin:auto auto 16px}}.ant-list-rtl{direction:rtl;text-align:right}.ant-list-rtl .ReactVirtualized__List .ant-list-item{direction:rtl}.ant-list-rtl .ant-list-pagination{text-align:left}.ant-list-rtl .ant-list-item-meta-avatar{margin-right:0;margin-left:16px}.ant-list-rtl .ant-list-item-action{margin-right:48px;margin-left:0}.ant-list.ant-list-rtl .ant-list-item-action>li:first-child{padding-right:0;padding-left:16px}.ant-list-rtl .ant-list-item-action-split{right:auto;left:0}.ant-list-rtl.ant-list-vertical .ant-list-item-extra{margin-right:40px;margin-left:0}.ant-list-rtl.ant-list-vertical .ant-list-item-action{margin-right:auto}.ant-list-rtl .ant-list-vertical .ant-list-item-action>li:first-child{padding-right:0;padding-left:16px}.ant-list-rtl .ant-list:not(.ant-list-vertical) .ant-list-item-no-flex .ant-list-item-action{float:left}@media screen and (max-width: 768px){.ant-list-rtl .ant-list-item-action,.ant-list-rtl .ant-list-vertical .ant-list-item-extra{margin-right:24px;margin-left:0}}@media screen and (max-width: 576px){.ant-list-rtl .ant-list-item-action{margin-right:22px;margin-left:0}.ant-list-rtl.ant-list-vertical .ant-list-item-extra{margin:auto auto 16px}}.ant-pagination{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum"}.ant-pagination ul,.ant-pagination ol{margin:0;padding:0;list-style:none}.ant-pagination:after{display:block;clear:both;height:0;overflow:hidden;visibility:hidden;content:" "}.ant-pagination-total-text{display:inline-block;height:32px;margin-right:8px;line-height:30px;vertical-align:middle}.ant-pagination-item{display:inline-block;min-width:32px;height:32px;margin-right:8px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";line-height:30px;text-align:center;vertical-align:middle;list-style:none;background-color:#fff;border:1px solid #d9d9d9;border-radius:2px;outline:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-pagination-item a{display:block;padding:0 6px;color:#000000d9;transition:none}.ant-pagination-item a:hover{text-decoration:none}.ant-pagination-item:hover{border-color:#1890ff;transition:all .3s}.ant-pagination-item:hover a{color:#1890ff}.ant-pagination-item:focus-visible{border-color:#1890ff;transition:all .3s}.ant-pagination-item:focus-visible a{color:#1890ff}.ant-pagination-item-active{font-weight:500;background:#fff;border-color:#1890ff}.ant-pagination-item-active a{color:#1890ff}.ant-pagination-item-active:hover{border-color:#40a9ff}.ant-pagination-item-active:focus-visible{border-color:#40a9ff}.ant-pagination-item-active:hover a{color:#40a9ff}.ant-pagination-item-active:focus-visible a{color:#40a9ff}.ant-pagination-jump-prev,.ant-pagination-jump-next{outline:0}.ant-pagination-jump-prev .ant-pagination-item-container,.ant-pagination-jump-next .ant-pagination-item-container{position:relative}.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-link-icon,.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-link-icon{color:#1890ff;font-size:12px;letter-spacing:-1px;opacity:0;transition:all .2s}.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-link-icon-svg,.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-link-icon-svg{inset:0;margin:auto}.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-ellipsis,.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-ellipsis{position:absolute;inset:0;display:block;margin:auto;color:#00000040;font-family:Arial,Helvetica,sans-serif;letter-spacing:2px;text-align:center;text-indent:.13em;opacity:1;transition:all .2s}.ant-pagination-jump-prev:hover .ant-pagination-item-link-icon,.ant-pagination-jump-next:hover .ant-pagination-item-link-icon{opacity:1}.ant-pagination-jump-prev:hover .ant-pagination-item-ellipsis,.ant-pagination-jump-next:hover .ant-pagination-item-ellipsis{opacity:0}.ant-pagination-jump-prev:focus-visible .ant-pagination-item-link-icon,.ant-pagination-jump-next:focus-visible .ant-pagination-item-link-icon{opacity:1}.ant-pagination-jump-prev:focus-visible .ant-pagination-item-ellipsis,.ant-pagination-jump-next:focus-visible .ant-pagination-item-ellipsis{opacity:0}.ant-pagination-prev,.ant-pagination-jump-prev,.ant-pagination-jump-next{margin-right:8px}.ant-pagination-prev,.ant-pagination-next,.ant-pagination-jump-prev,.ant-pagination-jump-next{display:inline-block;min-width:32px;height:32px;color:#000000d9;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";line-height:32px;text-align:center;vertical-align:middle;list-style:none;border-radius:2px;cursor:pointer;transition:all .3s}.ant-pagination-prev,.ant-pagination-next{font-family:Arial,Helvetica,sans-serif;outline:0}.ant-pagination-prev button,.ant-pagination-next button{color:#000000d9;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-pagination-prev:hover button,.ant-pagination-next:hover button{border-color:#40a9ff}.ant-pagination-prev .ant-pagination-item-link,.ant-pagination-next .ant-pagination-item-link{display:block;width:100%;height:100%;padding:0;font-size:12px;text-align:center;background-color:#fff;border:1px solid #d9d9d9;border-radius:2px;outline:none;transition:all .3s}.ant-pagination-prev:focus-visible .ant-pagination-item-link,.ant-pagination-next:focus-visible .ant-pagination-item-link{color:#1890ff;border-color:#1890ff}.ant-pagination-prev:hover .ant-pagination-item-link,.ant-pagination-next:hover .ant-pagination-item-link{color:#1890ff;border-color:#1890ff}.ant-pagination-disabled,.ant-pagination-disabled:hover{cursor:not-allowed}.ant-pagination-disabled .ant-pagination-item-link,.ant-pagination-disabled:hover .ant-pagination-item-link{color:#00000040;border-color:#d9d9d9;cursor:not-allowed}.ant-pagination-disabled:focus-visible{cursor:not-allowed}.ant-pagination-disabled:focus-visible .ant-pagination-item-link{color:#00000040;border-color:#d9d9d9;cursor:not-allowed}.ant-pagination-slash{margin:0 10px 0 5px}.ant-pagination-options{display:inline-block;margin-left:16px;vertical-align:middle}@media all and (-ms-high-contrast: none){.ant-pagination-options *::-ms-backdrop,.ant-pagination-options{vertical-align:top}}.ant-pagination-options-size-changer.ant-select{display:inline-block;width:auto}.ant-pagination-options-quick-jumper{display:inline-block;height:32px;margin-left:8px;line-height:32px;vertical-align:top}.ant-pagination-options-quick-jumper input{position:relative;display:inline-block;width:100%;min-width:0;padding:4px 11px;color:#000000d9;font-size:14px;line-height:1.5715;background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:2px;transition:all .3s;width:50px;height:32px;margin:0 8px}.ant-pagination-options-quick-jumper input::-moz-placeholder{color:#bfbfbf;-moz-user-select:none;user-select:none}.ant-pagination-options-quick-jumper input:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-pagination-options-quick-jumper input::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-pagination-options-quick-jumper input:-moz-placeholder-shown{text-overflow:ellipsis}.ant-pagination-options-quick-jumper input:-ms-input-placeholder{text-overflow:ellipsis}.ant-pagination-options-quick-jumper input:placeholder-shown{text-overflow:ellipsis}.ant-pagination-options-quick-jumper input:hover{border-color:#40a9ff;border-right-width:1px}.ant-pagination-options-quick-jumper input:focus,.ant-pagination-options-quick-jumper input-focused{border-color:#40a9ff;box-shadow:0 0 0 2px #1890ff33;border-right-width:1px;outline:0}.ant-pagination-options-quick-jumper input-disabled{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-pagination-options-quick-jumper input-disabled:hover{border-color:#d9d9d9;border-right-width:1px}.ant-pagination-options-quick-jumper input[disabled]{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-pagination-options-quick-jumper input[disabled]:hover{border-color:#d9d9d9;border-right-width:1px}.ant-pagination-options-quick-jumper input-borderless,.ant-pagination-options-quick-jumper input-borderless:hover,.ant-pagination-options-quick-jumper input-borderless:focus,.ant-pagination-options-quick-jumper input-borderless-focused,.ant-pagination-options-quick-jumper input-borderless-disabled,.ant-pagination-options-quick-jumper input-borderless[disabled]{background-color:transparent;border:none;box-shadow:none}textarea.ant-pagination-options-quick-jumper input{max-width:100%;height:auto;min-height:32px;line-height:1.5715;vertical-align:bottom;transition:all .3s,height 0s}.ant-pagination-options-quick-jumper input-lg{padding:6.5px 11px;font-size:16px}.ant-pagination-options-quick-jumper input-sm{padding:0 7px}.ant-pagination-simple .ant-pagination-prev,.ant-pagination-simple .ant-pagination-next{height:24px;line-height:24px;vertical-align:top}.ant-pagination-simple .ant-pagination-prev .ant-pagination-item-link,.ant-pagination-simple .ant-pagination-next .ant-pagination-item-link{height:24px;background-color:transparent;border:0}.ant-pagination-simple .ant-pagination-prev .ant-pagination-item-link:after,.ant-pagination-simple .ant-pagination-next .ant-pagination-item-link:after{height:24px;line-height:24px}.ant-pagination-simple .ant-pagination-simple-pager{display:inline-block;height:24px;margin-right:8px}.ant-pagination-simple .ant-pagination-simple-pager input{box-sizing:border-box;height:100%;margin-right:8px;padding:0 6px;text-align:center;background-color:#fff;border:1px solid #d9d9d9;border-radius:2px;outline:none;transition:border-color .3s}.ant-pagination-simple .ant-pagination-simple-pager input:hover{border-color:#1890ff}.ant-pagination-simple .ant-pagination-simple-pager input:focus{border-color:#40a9ff;box-shadow:0 0 0 2px #1890ff33}.ant-pagination-simple .ant-pagination-simple-pager input[disabled]{color:#00000040;background:#f5f5f5;border-color:#d9d9d9;cursor:not-allowed}.ant-pagination.ant-pagination-mini .ant-pagination-total-text,.ant-pagination.ant-pagination-mini .ant-pagination-simple-pager{height:24px;line-height:24px}.ant-pagination.ant-pagination-mini .ant-pagination-item{min-width:24px;height:24px;margin:0;line-height:22px}.ant-pagination.ant-pagination-mini .ant-pagination-item:not(.ant-pagination-item-active){background:transparent;border-color:transparent}.ant-pagination.ant-pagination-mini .ant-pagination-prev,.ant-pagination.ant-pagination-mini .ant-pagination-next{min-width:24px;height:24px;margin:0;line-height:24px}.ant-pagination.ant-pagination-mini .ant-pagination-prev .ant-pagination-item-link,.ant-pagination.ant-pagination-mini .ant-pagination-next .ant-pagination-item-link{background:transparent;border-color:transparent}.ant-pagination.ant-pagination-mini .ant-pagination-prev .ant-pagination-item-link:after,.ant-pagination.ant-pagination-mini .ant-pagination-next .ant-pagination-item-link:after{height:24px;line-height:24px}.ant-pagination.ant-pagination-mini .ant-pagination-jump-prev,.ant-pagination.ant-pagination-mini .ant-pagination-jump-next{height:24px;margin-right:0;line-height:24px}.ant-pagination.ant-pagination-mini .ant-pagination-options{margin-left:2px}.ant-pagination.ant-pagination-mini .ant-pagination-options-size-changer{top:0}.ant-pagination.ant-pagination-mini .ant-pagination-options-quick-jumper{height:24px;line-height:24px}.ant-pagination.ant-pagination-mini .ant-pagination-options-quick-jumper input{padding:0 7px;width:44px;height:24px}.ant-pagination.ant-pagination-disabled{cursor:not-allowed}.ant-pagination.ant-pagination-disabled .ant-pagination-item{background:#f5f5f5;border-color:#d9d9d9;cursor:not-allowed}.ant-pagination.ant-pagination-disabled .ant-pagination-item a{color:#00000040;background:transparent;border:none;cursor:not-allowed}.ant-pagination.ant-pagination-disabled .ant-pagination-item-active{background:#e6e6e6}.ant-pagination.ant-pagination-disabled .ant-pagination-item-active a{color:#00000040}.ant-pagination.ant-pagination-disabled .ant-pagination-item-link{color:#00000040;background:#f5f5f5;border-color:#d9d9d9;cursor:not-allowed}.ant-pagination-simple.ant-pagination.ant-pagination-disabled .ant-pagination-item-link{background:transparent}.ant-pagination.ant-pagination-disabled .ant-pagination-item-link-icon{opacity:0}.ant-pagination.ant-pagination-disabled .ant-pagination-item-ellipsis{opacity:1}.ant-pagination.ant-pagination-disabled .ant-pagination-simple-pager{color:#00000040}@media only screen and (max-width: 992px){.ant-pagination-item-after-jump-prev,.ant-pagination-item-before-jump-next{display:none}}@media only screen and (max-width: 576px){.ant-pagination-options{display:none}}.ant-pagination-rtl .ant-pagination-total-text,.ant-pagination-rtl .ant-pagination-item,.ant-pagination-rtl .ant-pagination-prev,.ant-pagination-rtl .ant-pagination-jump-prev,.ant-pagination-rtl .ant-pagination-jump-next{margin-right:0;margin-left:8px}.ant-pagination-rtl .ant-pagination-slash{margin:0 5px 0 10px}.ant-pagination-rtl .ant-pagination-options{margin-right:16px;margin-left:0}.ant-pagination-rtl .ant-pagination-options .ant-pagination-options-size-changer.ant-select{margin-right:0;margin-left:8px}.ant-pagination-rtl .ant-pagination-options .ant-pagination-options-quick-jumper{margin-left:0}.ant-pagination-rtl.ant-pagination-simple .ant-pagination-simple-pager,.ant-pagination-rtl.ant-pagination-simple .ant-pagination-simple-pager input{margin-right:0;margin-left:8px}.ant-pagination-rtl.ant-pagination.mini .ant-pagination-options{margin-right:2px;margin-left:0}.ant-spin{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:absolute;display:none;color:#1890ff;text-align:center;vertical-align:middle;opacity:0;transition:transform .3s cubic-bezier(.78,.14,.15,.86)}.ant-spin-spinning{position:static;display:inline-block;opacity:1}.ant-spin-nested-loading{position:relative}.ant-spin-nested-loading>div>.ant-spin{position:absolute;top:0;left:0;z-index:4;display:block;width:100%;height:100%;max-height:400px}.ant-spin-nested-loading>div>.ant-spin .ant-spin-dot{position:absolute;top:50%;left:50%;margin:-10px}.ant-spin-nested-loading>div>.ant-spin .ant-spin-text{position:absolute;top:50%;width:100%;padding-top:5px;text-shadow:0 1px 2px #fff}.ant-spin-nested-loading>div>.ant-spin.ant-spin-show-text .ant-spin-dot{margin-top:-20px}.ant-spin-nested-loading>div>.ant-spin-sm .ant-spin-dot{margin:-7px}.ant-spin-nested-loading>div>.ant-spin-sm .ant-spin-text{padding-top:2px}.ant-spin-nested-loading>div>.ant-spin-sm.ant-spin-show-text .ant-spin-dot{margin-top:-17px}.ant-spin-nested-loading>div>.ant-spin-lg .ant-spin-dot{margin:-16px}.ant-spin-nested-loading>div>.ant-spin-lg .ant-spin-text{padding-top:11px}.ant-spin-nested-loading>div>.ant-spin-lg.ant-spin-show-text .ant-spin-dot{margin-top:-26px}.ant-spin-container{position:relative;transition:opacity .3s}.ant-spin-container:after{position:absolute;inset:0;z-index:10;display:none \\ ;width:100%;height:100%;background:#fff;opacity:0;transition:all .3s;content:"";pointer-events:none}.ant-spin-blur{clear:both;opacity:.5;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}.ant-spin-blur:after{opacity:.4;pointer-events:auto}.ant-spin-tip{color:#00000073}.ant-spin-dot{position:relative;display:inline-block;font-size:20px;width:1em;height:1em}.ant-spin-dot-item{position:absolute;display:block;width:9px;height:9px;background-color:#1890ff;border-radius:100%;transform:scale(.75);transform-origin:50% 50%;opacity:.3;animation:antSpinMove 1s infinite linear alternate}.ant-spin-dot-item:nth-child(1){top:0;left:0}.ant-spin-dot-item:nth-child(2){top:0;right:0;animation-delay:.4s}.ant-spin-dot-item:nth-child(3){right:0;bottom:0;animation-delay:.8s}.ant-spin-dot-item:nth-child(4){bottom:0;left:0;animation-delay:1.2s}.ant-spin-dot-spin{transform:rotate(0);animation:antRotate 1.2s infinite linear}.ant-spin-sm .ant-spin-dot{font-size:14px}.ant-spin-sm .ant-spin-dot i{width:6px;height:6px}.ant-spin-lg .ant-spin-dot{font-size:32px}.ant-spin-lg .ant-spin-dot i{width:14px;height:14px}.ant-spin.ant-spin-show-text .ant-spin-text{display:block}@media all and (-ms-high-contrast: none),(-ms-high-contrast: active){.ant-spin-blur{background:#fff;opacity:.5}}@keyframes antSpinMove{to{opacity:1}}@keyframes antRotate{to{transform:rotate(360deg)}}.ant-spin-rtl{direction:rtl}.ant-spin-rtl .ant-spin-dot-spin{transform:rotate(-45deg);animation-name:antRotateRtl}@keyframes antRotateRtl{to{transform:rotate(-405deg)}}.ant-mentions-status-error:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions,.ant-mentions-status-error:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions:hover{background:#fff;border-color:#ff4d4f}.ant-mentions-status-error:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions:focus,.ant-mentions-status-error:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions-focused{border-color:#ff7875;box-shadow:0 0 0 2px #ff4d4f33;border-right-width:1px;outline:0}.ant-mentions-status-error .ant-input-prefix{color:#ff4d4f}.ant-mentions-status-warning:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions,.ant-mentions-status-warning:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions:hover{background:#fff;border-color:#faad14}.ant-mentions-status-warning:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions:focus,.ant-mentions-status-warning:not(.ant-mentions-disabled):not(.ant-mentions-borderless).ant-mentions-focused{border-color:#ffc53d;box-shadow:0 0 0 2px #faad1433;border-right-width:1px;outline:0}.ant-mentions-status-warning .ant-input-prefix{color:#faad14}.ant-mentions{box-sizing:border-box;margin:0;font-variant:tabular-nums;list-style:none;font-feature-settings:"tnum";width:100%;min-width:0;color:#000000d9;font-size:14px;background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:2px;transition:all .3s;position:relative;display:inline-block;height:auto;padding:0;overflow:hidden;line-height:1.5715;white-space:pre-wrap;vertical-align:bottom}.ant-mentions::-moz-placeholder{color:#bfbfbf;-moz-user-select:none;user-select:none}.ant-mentions:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-mentions::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-mentions:-moz-placeholder-shown{text-overflow:ellipsis}.ant-mentions:-ms-input-placeholder{text-overflow:ellipsis}.ant-mentions:placeholder-shown{text-overflow:ellipsis}.ant-mentions:hover{border-color:#40a9ff;border-right-width:1px}.ant-mentions:focus,.ant-mentions-focused{border-color:#40a9ff;box-shadow:0 0 0 2px #1890ff33;border-right-width:1px;outline:0}.ant-mentions-disabled{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-mentions-disabled:hover{border-color:#d9d9d9;border-right-width:1px}.ant-mentions[disabled]{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-mentions[disabled]:hover{border-color:#d9d9d9;border-right-width:1px}.ant-mentions-borderless,.ant-mentions-borderless:hover,.ant-mentions-borderless:focus,.ant-mentions-borderless-focused,.ant-mentions-borderless-disabled,.ant-mentions-borderless[disabled]{background-color:transparent;border:none;box-shadow:none}textarea.ant-mentions{max-width:100%;height:auto;min-height:32px;line-height:1.5715;vertical-align:bottom;transition:all .3s,height 0s}.ant-mentions-lg{padding:6.5px 11px;font-size:16px}.ant-mentions-sm{padding:0 7px}.ant-mentions-disabled>textarea{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;box-shadow:none;cursor:not-allowed;opacity:1}.ant-mentions-disabled>textarea:hover{border-color:#d9d9d9;border-right-width:1px}.ant-mentions-focused{border-color:#40a9ff;box-shadow:0 0 0 2px #1890ff33;border-right-width:1px;outline:0}.ant-mentions>textarea,.ant-mentions-measure{min-height:30px;margin:0;padding:4px 11px;overflow:inherit;overflow-x:hidden;overflow-y:auto;font-weight:inherit;font-size:inherit;font-family:inherit;font-style:inherit;font-variant:inherit;font-size-adjust:inherit;font-stretch:inherit;line-height:inherit;direction:inherit;letter-spacing:inherit;white-space:inherit;text-align:inherit;vertical-align:top;word-wrap:break-word;word-break:inherit;-moz-tab-size:inherit;-o-tab-size:inherit;tab-size:inherit}.ant-mentions>textarea{width:100%;border:none;outline:none;resize:none}.ant-mentions>textarea::-moz-placeholder{color:#bfbfbf;-moz-user-select:none;user-select:none}.ant-mentions>textarea:-ms-input-placeholder{color:#bfbfbf;-ms-user-select:none;user-select:none}.ant-mentions>textarea::placeholder{color:#bfbfbf;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-mentions>textarea:-moz-placeholder-shown{text-overflow:ellipsis}.ant-mentions>textarea:-ms-input-placeholder{text-overflow:ellipsis}.ant-mentions>textarea:placeholder-shown{text-overflow:ellipsis}.ant-mentions-measure{position:absolute;inset:0;z-index:-1;color:transparent;pointer-events:none}.ant-mentions-measure>span{display:inline-block;min-height:1em}.ant-mentions-dropdown{margin:0;padding:0;color:#000000d9;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:absolute;top:-9999px;left:-9999px;z-index:1050;box-sizing:border-box;font-size:14px;font-variant:initial;background-color:#fff;border-radius:2px;outline:none;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d}.ant-mentions-dropdown-hidden{display:none}.ant-mentions-dropdown-menu{max-height:250px;margin-bottom:0;padding-left:0;overflow:auto;list-style:none;outline:none}.ant-mentions-dropdown-menu-item{position:relative;display:block;min-width:100px;padding:5px 12px;overflow:hidden;color:#000000d9;font-weight:400;line-height:1.5715;white-space:nowrap;text-overflow:ellipsis;cursor:pointer;transition:background .3s ease}.ant-mentions-dropdown-menu-item:hover{background-color:#f5f5f5}.ant-mentions-dropdown-menu-item:first-child{border-radius:2px 2px 0 0}.ant-mentions-dropdown-menu-item:last-child{border-radius:0 0 2px 2px}.ant-mentions-dropdown-menu-item-disabled{color:#00000040;cursor:not-allowed}.ant-mentions-dropdown-menu-item-disabled:hover{color:#00000040;background-color:#fff;cursor:not-allowed}.ant-mentions-dropdown-menu-item-selected{color:#000000d9;font-weight:600;background-color:#fafafa}.ant-mentions-dropdown-menu-item-active{background-color:#f5f5f5}.ant-mentions-suffix{position:absolute;top:0;right:11px;bottom:0;z-index:1;display:inline-flex;align-items:center;margin:auto}.ant-mentions-rtl{direction:rtl}.ant-message{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:fixed;top:8px;left:0;z-index:1010;width:100%;pointer-events:none}.ant-message-notice{padding:8px;text-align:center}.ant-message-notice-content{display:inline-block;padding:10px 16px;background:#fff;border-radius:2px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d;pointer-events:all}.ant-message-success .anticon{color:#52c41a}.ant-message-error .anticon{color:#ff4d4f}.ant-message-warning .anticon{color:#faad14}.ant-message-info .anticon,.ant-message-loading .anticon{color:#1890ff}.ant-message .anticon{position:relative;top:1px;margin-right:8px;font-size:16px}.ant-message-notice.ant-move-up-leave.ant-move-up-leave-active{animation-name:MessageMoveOut;animation-duration:.3s}@keyframes MessageMoveOut{0%{max-height:150px;padding:8px;opacity:1}to{max-height:0;padding:0;opacity:0}}.ant-message-rtl,.ant-message-rtl span{direction:rtl}.ant-message-rtl .anticon{margin-right:0;margin-left:8px}.ant-modal{box-sizing:border-box;padding:0 0 24px;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";pointer-events:none;position:relative;top:100px;width:auto;max-width:calc(100vw - 32px);margin:0 auto}.ant-modal.ant-zoom-enter,.ant-modal.ant-zoom-appear{transform:none;opacity:0;animation-duration:.3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-modal-mask{position:fixed;inset:0;z-index:1000;height:100%;background-color:#00000073}.ant-modal-mask-hidden{display:none}.ant-modal-wrap{position:fixed;inset:0;overflow:auto;outline:0}.ant-modal-wrap{z-index:1000}.ant-modal-title{margin:0;color:#000000d9;font-weight:500;font-size:16px;line-height:22px;word-wrap:break-word}.ant-modal-content{position:relative;background-color:#fff;background-clip:padding-box;border:0;border-radius:2px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d;pointer-events:auto}.ant-modal-close{position:absolute;top:0;right:0;z-index:10;padding:0;color:#00000073;font-weight:700;line-height:1;text-decoration:none;background:transparent;border:0;outline:0;cursor:pointer;transition:color .3s}.ant-modal-close-x{display:block;width:54px;height:54px;font-size:16px;font-style:normal;line-height:54px;text-align:center;text-transform:none;text-rendering:auto}.ant-modal-close:focus,.ant-modal-close:hover{color:#000000bf;text-decoration:none}.ant-modal-header{padding:16px 24px;color:#000000d9;background:#fff;border-bottom:1px solid #f0f0f0;border-radius:2px 2px 0 0}.ant-modal-body{padding:24px;font-size:14px;line-height:1.5715;word-wrap:break-word}.ant-modal-footer{padding:10px 16px;text-align:right;background:transparent;border-top:1px solid #f0f0f0;border-radius:0 0 2px 2px}.ant-modal-footer .ant-btn+.ant-btn:not(.ant-dropdown-trigger){margin-bottom:0;margin-left:8px}.ant-modal-open{overflow:hidden}.ant-modal-centered{text-align:center}.ant-modal-centered:before{display:inline-block;width:0;height:100%;vertical-align:middle;content:""}.ant-modal-centered .ant-modal{top:0;display:inline-block;padding-bottom:0;text-align:left;vertical-align:middle}@media (max-width: 767px){.ant-modal{max-width:calc(100vw - 16px);margin:8px auto}.ant-modal-centered .ant-modal{flex:1}}.ant-modal-confirm .ant-modal-header{display:none}.ant-modal-confirm .ant-modal-body{padding:32px 32px 24px}.ant-modal-confirm-body-wrapper:before{display:table;content:""}.ant-modal-confirm-body-wrapper:after{display:table;clear:both;content:""}.ant-modal-confirm-body .ant-modal-confirm-title{display:block;overflow:hidden;color:#000000d9;font-weight:500;font-size:16px;line-height:1.4}.ant-modal-confirm-body .ant-modal-confirm-content{margin-top:8px;color:#000000d9;font-size:14px}.ant-modal-confirm-body>.anticon{float:left;margin-right:16px;font-size:22px}.ant-modal-confirm-body>.anticon+.ant-modal-confirm-title+.ant-modal-confirm-content{margin-left:38px}.ant-modal-confirm .ant-modal-confirm-btns{margin-top:24px;text-align:right}.ant-modal-confirm .ant-modal-confirm-btns .ant-btn+.ant-btn{margin-bottom:0;margin-left:8px}.ant-modal-confirm-error .ant-modal-confirm-body>.anticon{color:#ff4d4f}.ant-modal-confirm-warning .ant-modal-confirm-body>.anticon,.ant-modal-confirm-confirm .ant-modal-confirm-body>.anticon{color:#faad14}.ant-modal-confirm-info .ant-modal-confirm-body>.anticon{color:#1890ff}.ant-modal-confirm-success .ant-modal-confirm-body>.anticon{color:#52c41a}.ant-modal-confirm .ant-zoom-leave .ant-modal-confirm-btns{pointer-events:none}.ant-modal-wrap-rtl{direction:rtl}.ant-modal-wrap-rtl .ant-modal-close{right:initial;left:0}.ant-modal-wrap-rtl .ant-modal-footer{text-align:left}.ant-modal-wrap-rtl .ant-modal-footer .ant-btn+.ant-btn{margin-right:8px;margin-left:0}.ant-modal-wrap-rtl .ant-modal-confirm-body{direction:rtl}.ant-modal-wrap-rtl .ant-modal-confirm-body>.anticon{float:right;margin-right:0;margin-left:16px}.ant-modal-wrap-rtl .ant-modal-confirm-body>.anticon+.ant-modal-confirm-title+.ant-modal-confirm-content{margin-right:38px;margin-left:0}.ant-modal-wrap-rtl .ant-modal-confirm-btns{text-align:left}.ant-modal-wrap-rtl .ant-modal-confirm-btns .ant-btn+.ant-btn{margin-right:8px;margin-left:0}.ant-modal-wrap-rtl.ant-modal-centered .ant-modal{text-align:right}.ant-notification{box-sizing:border-box;margin:0 24px 0 0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:fixed;z-index:1010}.ant-notification-close-icon{font-size:14px;cursor:pointer}.ant-notification-hook-holder{position:relative}.ant-notification-notice{position:relative;width:384px;max-width:calc(100vw - 48px);margin-bottom:16px;margin-left:auto;padding:16px 24px;overflow:hidden;line-height:1.5715;word-wrap:break-word;background:#fff;border-radius:2px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d}.ant-notification-top .ant-notification-notice,.ant-notification-bottom .ant-notification-notice{margin-right:auto;margin-left:auto}.ant-notification-topLeft .ant-notification-notice,.ant-notification-bottomLeft .ant-notification-notice{margin-right:auto;margin-left:0}.ant-notification-notice-message{margin-bottom:8px;color:#000000d9;font-size:16px;line-height:24px}.ant-notification-notice-message-single-line-auto-margin{display:block;width:calc(264px - 100%);max-width:4px;background-color:transparent;pointer-events:none}.ant-notification-notice-message-single-line-auto-margin:before{display:block;content:""}.ant-notification-notice-description{font-size:14px}.ant-notification-notice-closable .ant-notification-notice-message{padding-right:24px}.ant-notification-notice-with-icon .ant-notification-notice-message{margin-bottom:4px;margin-left:48px;font-size:16px}.ant-notification-notice-with-icon .ant-notification-notice-description{margin-left:48px;font-size:14px}.ant-notification-notice-icon{position:absolute;margin-left:4px;font-size:24px;line-height:24px}.anticon.ant-notification-notice-icon-success{color:#52c41a}.anticon.ant-notification-notice-icon-info{color:#1890ff}.anticon.ant-notification-notice-icon-warning{color:#faad14}.anticon.ant-notification-notice-icon-error{color:#ff4d4f}.ant-notification-notice-close{position:absolute;top:16px;right:22px;color:#00000073;outline:none}.ant-notification-notice-close:hover{color:#000000ab}.ant-notification-notice-btn{float:right;margin-top:16px}.ant-notification .notification-fade-effect{animation-duration:.24s;animation-timing-function:cubic-bezier(.645,.045,.355,1);animation-fill-mode:both}.ant-notification-fade-enter,.ant-notification-fade-appear{animation-duration:.24s;animation-timing-function:cubic-bezier(.645,.045,.355,1);animation-fill-mode:both;opacity:0;animation-play-state:paused}.ant-notification-fade-leave{animation-duration:.24s;animation-timing-function:cubic-bezier(.645,.045,.355,1);animation-fill-mode:both;animation-duration:.2s;animation-play-state:paused}.ant-notification-fade-enter.ant-notification-fade-enter-active,.ant-notification-fade-appear.ant-notification-fade-appear-active{animation-name:NotificationFadeIn;animation-play-state:running}.ant-notification-fade-leave.ant-notification-fade-leave-active{animation-name:NotificationFadeOut;animation-play-state:running}@keyframes NotificationFadeIn{0%{left:384px;opacity:0}to{left:0;opacity:1}}@keyframes NotificationFadeOut{0%{max-height:150px;margin-bottom:16px;opacity:1}to{max-height:0;margin-bottom:0;padding-top:0;padding-bottom:0;opacity:0}}.ant-notification-rtl{direction:rtl}.ant-notification-rtl .ant-notification-notice-closable .ant-notification-notice-message{padding-right:0;padding-left:24px}.ant-notification-rtl .ant-notification-notice-with-icon .ant-notification-notice-message,.ant-notification-rtl .ant-notification-notice-with-icon .ant-notification-notice-description{margin-right:48px;margin-left:0}.ant-notification-rtl .ant-notification-notice-icon{margin-right:4px;margin-left:0}.ant-notification-rtl .ant-notification-notice-close{right:auto;left:22px}.ant-notification-rtl .ant-notification-notice-btn{float:left}.ant-notification-top,.ant-notification-bottom{margin-right:0;margin-left:0}.ant-notification-top .ant-notification-fade-enter.ant-notification-fade-enter-active,.ant-notification-top .ant-notification-fade-appear.ant-notification-fade-appear-active{animation-name:NotificationTopFadeIn}.ant-notification-bottom .ant-notification-fade-enter.ant-notification-fade-enter-active,.ant-notification-bottom .ant-notification-fade-appear.ant-notification-fade-appear-active{animation-name:NotificationBottomFadeIn}.ant-notification-topLeft,.ant-notification-bottomLeft{margin-right:0;margin-left:24px}.ant-notification-topLeft .ant-notification-fade-enter.ant-notification-fade-enter-active,.ant-notification-bottomLeft .ant-notification-fade-enter.ant-notification-fade-enter-active,.ant-notification-topLeft .ant-notification-fade-appear.ant-notification-fade-appear-active,.ant-notification-bottomLeft .ant-notification-fade-appear.ant-notification-fade-appear-active{animation-name:NotificationLeftFadeIn}@keyframes NotificationTopFadeIn{0%{margin-top:-100%;opacity:0}to{margin-top:0;opacity:1}}@keyframes NotificationBottomFadeIn{0%{margin-bottom:-100%;opacity:0}to{margin-bottom:0;opacity:1}}@keyframes NotificationLeftFadeIn{0%{right:384px;opacity:0}to{right:0;opacity:1}}.ant-page-header{box-sizing:border-box;margin:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;padding:16px 24px;background-color:#fff}.ant-page-header-ghost{background-color:inherit}.ant-page-header.has-breadcrumb{padding-top:12px}.ant-page-header.has-footer{padding-bottom:0}.ant-page-header-back{margin-right:16px;font-size:16px;line-height:1}.ant-page-header-back-button{color:#1890ff;outline:none;cursor:pointer;transition:color .3s;color:#000}.ant-page-header-back-button:focus-visible,.ant-page-header-back-button:hover{color:#40a9ff}.ant-page-header-back-button:active{color:#096dd9}.ant-page-header .ant-divider-vertical{height:14px;margin:0 12px;vertical-align:middle}.ant-breadcrumb+.ant-page-header-heading{margin-top:8px}.ant-page-header-heading{display:flex;justify-content:space-between}.ant-page-header-heading-left{display:flex;align-items:center;margin:4px 0;overflow:hidden}.ant-page-header-heading-title{margin-right:12px;margin-bottom:0;color:#000000d9;font-weight:600;font-size:20px;line-height:32px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-page-header-heading .ant-avatar{margin-right:12px}.ant-page-header-heading-sub-title{margin-right:12px;color:#00000073;font-size:14px;line-height:1.5715;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-page-header-heading-extra{margin:4px 0;white-space:nowrap}.ant-page-header-heading-extra>*{white-space:unset}.ant-page-header-content{padding-top:12px}.ant-page-header-footer{margin-top:16px}.ant-page-header-footer .ant-tabs>.ant-tabs-nav{margin:0}.ant-page-header-footer .ant-tabs>.ant-tabs-nav:before{border:none}.ant-page-header-footer .ant-tabs .ant-tabs-tab{padding-top:8px;padding-bottom:8px;font-size:16px}.ant-page-header-compact .ant-page-header-heading{flex-wrap:wrap}.ant-page-header-rtl{direction:rtl}.ant-page-header-rtl .ant-page-header-back{float:right;margin-right:0;margin-left:16px}.ant-page-header-rtl .ant-page-header-heading-title,.ant-page-header-rtl .ant-page-header-heading .ant-avatar{margin-right:0;margin-left:12px}.ant-page-header-rtl .ant-page-header-heading-sub-title{float:right;margin-right:0;margin-left:12px}.ant-page-header-rtl .ant-page-header-heading-tags{float:right}.ant-page-header-rtl .ant-page-header-heading-extra{float:left}.ant-page-header-rtl .ant-page-header-heading-extra>*{margin-right:12px;margin-left:0}.ant-page-header-rtl .ant-page-header-heading-extra>*:first-child{margin-right:0}.ant-page-header-rtl .ant-page-header-footer .ant-tabs-bar .ant-tabs-nav{float:right}.ant-popconfirm{z-index:1060}.ant-progress{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";display:inline-block}.ant-progress-line{position:relative;width:100%;font-size:14px}.ant-progress-steps{display:inline-block}.ant-progress-steps-outer{display:flex;flex-direction:row;align-items:center}.ant-progress-steps-item{flex-shrink:0;min-width:2px;margin-right:2px;background:#f3f3f3;transition:all .3s}.ant-progress-steps-item-active{background:#1890ff}.ant-progress-small.ant-progress-line,.ant-progress-small.ant-progress-line .ant-progress-text .anticon{font-size:12px}.ant-progress-outer{display:inline-block;width:100%;margin-right:0;padding-right:0}.ant-progress-show-info .ant-progress-outer{margin-right:calc(-2em - 8px);padding-right:calc(2em + 8px)}.ant-progress-inner{position:relative;display:inline-block;width:100%;overflow:hidden;vertical-align:middle;background-color:#f5f5f5;border-radius:100px}.ant-progress-circle-trail{stroke:#f5f5f5}.ant-progress-circle-path{animation:ant-progress-appear .3s}.ant-progress-inner:not(.ant-progress-circle-gradient) .ant-progress-circle-path{stroke:#1890ff}.ant-progress-success-bg,.ant-progress-bg{position:relative;background-color:#1890ff;border-radius:100px;transition:all .4s cubic-bezier(.08,.82,.17,1) 0s}.ant-progress-success-bg{position:absolute;top:0;left:0;background-color:#52c41a}.ant-progress-text{display:inline-block;width:2em;margin-left:8px;color:#000000d9;font-size:1em;line-height:1;white-space:nowrap;text-align:left;vertical-align:middle;word-break:normal}.ant-progress-text .anticon{font-size:14px}.ant-progress-status-active .ant-progress-bg:before{position:absolute;inset:0;background:#fff;border-radius:10px;opacity:0;animation:ant-progress-active 2.4s cubic-bezier(.23,1,.32,1) infinite;content:""}.ant-progress-status-exception .ant-progress-bg{background-color:#ff4d4f}.ant-progress-status-exception .ant-progress-text{color:#ff4d4f}.ant-progress-status-exception .ant-progress-inner:not(.ant-progress-circle-gradient) .ant-progress-circle-path{stroke:#ff4d4f}.ant-progress-status-success .ant-progress-bg{background-color:#52c41a}.ant-progress-status-success .ant-progress-text{color:#52c41a}.ant-progress-status-success .ant-progress-inner:not(.ant-progress-circle-gradient) .ant-progress-circle-path{stroke:#52c41a}.ant-progress-circle .ant-progress-inner{position:relative;line-height:1;background-color:transparent}.ant-progress-circle .ant-progress-text{position:absolute;top:50%;left:50%;width:100%;margin:0;padding:0;color:#000000d9;font-size:1em;line-height:1;white-space:normal;text-align:center;transform:translate(-50%,-50%)}.ant-progress-circle .ant-progress-text .anticon{font-size:1.16666667em}.ant-progress-circle.ant-progress-status-exception .ant-progress-text{color:#ff4d4f}.ant-progress-circle.ant-progress-status-success .ant-progress-text{color:#52c41a}@keyframes ant-progress-active{0%{transform:translate(-100%) scaleX(0);opacity:.1}20%{transform:translate(-100%) scaleX(0);opacity:.5}to{transform:translate(0) scaleX(1);opacity:0}}.ant-progress-rtl{direction:rtl}.ant-progress-rtl.ant-progress-show-info .ant-progress-outer{margin-right:0;margin-left:calc(-2em - 8px);padding-right:0;padding-left:calc(2em + 8px)}.ant-progress-rtl .ant-progress-success-bg{right:0;left:auto}.ant-progress-rtl.ant-progress-line .ant-progress-text,.ant-progress-rtl.ant-progress-steps .ant-progress-text{margin-right:8px;margin-left:0;text-align:right}.ant-rate{box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;font-feature-settings:"tnum";display:inline-block;margin:0;padding:0;color:#fadb14;font-size:20px;line-height:unset;list-style:none;outline:none}.ant-rate-disabled .ant-rate-star{cursor:default}.ant-rate-disabled .ant-rate-star>div:hover{transform:scale(1)}.ant-rate-star{position:relative;display:inline-block;color:inherit;cursor:pointer}.ant-rate-star:not(:last-child){margin-right:8px}.ant-rate-star>div{transition:all .3s,outline 0s}.ant-rate-star>div:hover{transform:scale(1.1)}.ant-rate-star>div:focus{outline:0}.ant-rate-star>div:focus-visible{outline:1px dashed #fadb14;transform:scale(1.1)}.ant-rate-star-first,.ant-rate-star-second{color:#f0f0f0;transition:all .3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-rate-star-first .anticon,.ant-rate-star-second .anticon{vertical-align:middle}.ant-rate-star-first{position:absolute;top:0;left:0;width:50%;height:100%;overflow:hidden;opacity:0}.ant-rate-star-half .ant-rate-star-first,.ant-rate-star-half .ant-rate-star-second{opacity:1}.ant-rate-star-half .ant-rate-star-first,.ant-rate-star-full .ant-rate-star-second{color:inherit}.ant-rate-text{display:inline-block;margin:0 8px;font-size:14px}.ant-rate-rtl{direction:rtl}.ant-rate-rtl .ant-rate-star:not(:last-child){margin-right:0;margin-left:8px}.ant-rate-rtl .ant-rate-star-first{right:0;left:auto}.ant-result{padding:48px 32px}.ant-result-success .ant-result-icon>.anticon{color:#52c41a}.ant-result-error .ant-result-icon>.anticon{color:#ff4d4f}.ant-result-info .ant-result-icon>.anticon{color:#1890ff}.ant-result-warning .ant-result-icon>.anticon{color:#faad14}.ant-result-image{width:250px;height:295px;margin:auto}.ant-result-icon{margin-bottom:24px;text-align:center}.ant-result-icon>.anticon{font-size:72px}.ant-result-title{color:#000000d9;font-size:24px;line-height:1.8;text-align:center}.ant-result-subtitle{color:#00000073;font-size:14px;line-height:1.6;text-align:center}.ant-result-extra{margin:24px 0 0;text-align:center}.ant-result-extra>*{margin-right:8px}.ant-result-extra>*:last-child{margin-right:0}.ant-result-content{margin-top:24px;padding:24px 40px;background-color:#fafafa}.ant-result-rtl{direction:rtl}.ant-result-rtl .ant-result-extra>*{margin-right:0;margin-left:8px}.ant-result-rtl .ant-result-extra>*:last-child{margin-left:0}.segmented-disabled-item,.segmented-disabled-item:hover,.segmented-disabled-item:focus{color:#00000040;cursor:not-allowed}.segmented-item-selected{background-color:#fff;border-radius:2px;box-shadow:0 2px 8px -2px #0000000d,0 1px 4px -1px #00000012,0 0 1px #00000014}.segmented-text-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;word-break:keep-all}.ant-segmented{box-sizing:border-box;margin:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";display:inline-block;padding:2px;color:#000000a6;background-color:#0000000a;border-radius:2px;transition:all .3s cubic-bezier(.645,.045,.355,1)}.ant-segmented-group{position:relative;display:flex;align-items:stretch;justify-items:flex-start;width:100%}.ant-segmented.ant-segmented-block{display:flex}.ant-segmented.ant-segmented-block .ant-segmented-item{flex:1;min-width:0}.ant-segmented:not(.ant-segmented-disabled):hover,.ant-segmented:not(.ant-segmented-disabled):focus{background-color:#0000000f}.ant-segmented-item{position:relative;text-align:center;cursor:pointer;transition:color .3s cubic-bezier(.645,.045,.355,1)}.ant-segmented-item-selected{background-color:#fff;border-radius:2px;box-shadow:0 2px 8px -2px #0000000d,0 1px 4px -1px #00000012,0 0 1px #00000014;color:#262626}.ant-segmented-item:hover,.ant-segmented-item:focus{color:#262626}.ant-segmented-item-label{min-height:28px;padding:0 11px;line-height:28px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;word-break:keep-all}.ant-segmented-item-icon+*{margin-left:6px}.ant-segmented-item-input{position:absolute;top:0;left:0;width:0;height:0;opacity:0;pointer-events:none}.ant-segmented.ant-segmented-lg .ant-segmented-item-label{min-height:36px;padding:0 11px;font-size:16px;line-height:36px}.ant-segmented.ant-segmented-sm .ant-segmented-item-label{min-height:20px;padding:0 7px;line-height:20px}.ant-segmented-item-disabled,.ant-segmented-item-disabled:hover,.ant-segmented-item-disabled:focus{color:#00000040;cursor:not-allowed}.ant-segmented-thumb{background-color:#fff;border-radius:2px;box-shadow:0 2px 8px -2px #0000000d,0 1px 4px -1px #00000012,0 0 1px #00000014;position:absolute;top:0;left:0;width:0;height:100%;padding:4px 0}.ant-segmented-thumb-motion-appear-active{transition:transform .3s cubic-bezier(.645,.045,.355,1),width .3s cubic-bezier(.645,.045,.355,1);will-change:transform,width}.ant-segmented.ant-segmented-rtl{direction:rtl}.ant-segmented.ant-segmented-rtl .ant-segmented-item-icon{margin-right:0;margin-left:6px}.ant-slider{box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;height:12px;margin:10px 6px;padding:4px 0;cursor:pointer;touch-action:none}.ant-slider-vertical{width:12px;height:100%;margin:6px 10px;padding:0 4px}.ant-slider-vertical .ant-slider-rail{width:4px;height:100%}.ant-slider-vertical .ant-slider-track{width:4px}.ant-slider-vertical .ant-slider-handle{margin-top:-6px;margin-left:-5px}.ant-slider-vertical .ant-slider-mark{top:0;left:12px;width:18px;height:100%}.ant-slider-vertical .ant-slider-mark-text{left:4px;white-space:nowrap}.ant-slider-vertical .ant-slider-step{width:4px;height:100%}.ant-slider-vertical .ant-slider-dot{top:auto;margin-left:-2px}.ant-slider-tooltip .ant-tooltip-inner{min-width:unset}.ant-slider-rtl.ant-slider-vertical .ant-slider-handle{margin-right:-5px;margin-left:0}.ant-slider-rtl.ant-slider-vertical .ant-slider-mark{right:12px;left:auto}.ant-slider-rtl.ant-slider-vertical .ant-slider-mark-text{right:4px;left:auto}.ant-slider-rtl.ant-slider-vertical .ant-slider-dot{right:2px;left:auto}.ant-slider-with-marks{margin-bottom:28px}.ant-slider-rail{position:absolute;width:100%;height:4px;background-color:#f5f5f5;border-radius:2px;transition:background-color .3s}.ant-slider-track{position:absolute;height:4px;background-color:#91d5ff;border-radius:2px;transition:background-color .3s}.ant-slider-handle{position:absolute;width:14px;height:14px;margin-top:-5px;background-color:#fff;border:solid 2px #91d5ff;border-radius:50%;box-shadow:0;cursor:pointer;transition:border-color .3s,box-shadow .6s,transform .3s cubic-bezier(.18,.89,.32,1.28)}.ant-slider-handle-dragging{z-index:1}.ant-slider-handle:focus{border-color:#46a6ff;outline:none;box-shadow:0 0 0 5px #1890ff1f}.ant-slider-handle.ant-tooltip-open{border-color:#1890ff}.ant-slider-handle:after{position:absolute;inset:-6px;content:""}.ant-slider:hover .ant-slider-rail{background-color:#e1e1e1}.ant-slider:hover .ant-slider-track{background-color:#69c0ff}.ant-slider:hover .ant-slider-handle:not(.ant-tooltip-open){border-color:#69c0ff}.ant-slider-mark{position:absolute;top:14px;left:0;width:100%;font-size:14px}.ant-slider-mark-text{position:absolute;display:inline-block;color:#00000073;text-align:center;word-break:keep-all;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-slider-mark-text-active{color:#000000d9}.ant-slider-step{position:absolute;width:100%;height:4px;background:transparent;pointer-events:none}.ant-slider-dot{position:absolute;top:-2px;width:8px;height:8px;background-color:#fff;border:2px solid #f0f0f0;border-radius:50%;cursor:pointer}.ant-slider-dot-active{border-color:#8cc8ff}.ant-slider-disabled{cursor:not-allowed}.ant-slider-disabled .ant-slider-rail{background-color:#f5f5f5!important}.ant-slider-disabled .ant-slider-track{background-color:#00000040!important}.ant-slider-disabled .ant-slider-handle,.ant-slider-disabled .ant-slider-dot{background-color:#fff;border-color:#00000040!important;box-shadow:none;cursor:not-allowed}.ant-slider-disabled .ant-slider-mark-text,.ant-slider-disabled .ant-slider-dot{cursor:not-allowed!important}.ant-slider-rtl{direction:rtl}.ant-slider-rtl .ant-slider-mark{right:0;left:auto}.ant-statistic{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum"}.ant-statistic-title{margin-bottom:4px;color:#00000073;font-size:14px}.ant-statistic-skeleton{padding-top:16px}.ant-statistic-content{color:#000000d9;font-size:24px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji"}.ant-statistic-content-value{display:inline-block;direction:ltr}.ant-statistic-content-prefix,.ant-statistic-content-suffix{display:inline-block}.ant-statistic-content-prefix{margin-right:4px}.ant-statistic-content-suffix{margin-left:4px}.ant-statistic-rtl{direction:rtl}.ant-statistic-rtl .ant-statistic-content-prefix{margin-right:0;margin-left:4px}.ant-statistic-rtl .ant-statistic-content-suffix{margin-right:4px;margin-left:0}.ant-steps{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";display:flex;width:100%;font-size:0;text-align:initial}.ant-steps-item{position:relative;display:inline-block;flex:1;overflow:hidden;vertical-align:top}.ant-steps-item-container{outline:none}.ant-steps-item:last-child{flex:none}.ant-steps-item:last-child>.ant-steps-item-container>.ant-steps-item-tail,.ant-steps-item:last-child>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title:after{display:none}.ant-steps-item-icon,.ant-steps-item-content{display:inline-block;vertical-align:top}.ant-steps-item-icon{width:32px;height:32px;margin:0 8px 0 0;font-size:16px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";line-height:32px;text-align:center;border:1px solid rgba(0,0,0,.25);border-radius:32px;transition:background-color .3s,border-color .3s}.ant-steps-item-icon .ant-steps-icon{position:relative;top:-.5px;color:#1890ff;line-height:1}.ant-steps-item-tail{position:absolute;top:12px;left:0;width:100%;padding:0 10px}.ant-steps-item-tail:after{display:inline-block;width:100%;height:1px;background:#f0f0f0;border-radius:1px;transition:background .3s;content:""}.ant-steps-item-title{position:relative;display:inline-block;padding-right:16px;color:#000000d9;font-size:16px;line-height:32px}.ant-steps-item-title:after{position:absolute;top:16px;left:100%;display:block;width:9999px;height:1px;background:#f0f0f0;content:""}.ant-steps-item-subtitle{display:inline;margin-left:8px;color:#00000073;font-weight:400;font-size:14px}.ant-steps-item-description{color:#00000073;font-size:14px}.ant-steps-item-wait .ant-steps-item-icon{background-color:#fff;border-color:#00000040}.ant-steps-item-wait .ant-steps-item-icon>.ant-steps-icon{color:#00000040}.ant-steps-item-wait .ant-steps-item-icon>.ant-steps-icon .ant-steps-icon-dot{background:rgba(0,0,0,.25)}.ant-steps-item-wait>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title{color:#00000073}.ant-steps-item-wait>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title:after{background-color:#f0f0f0}.ant-steps-item-wait>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-description{color:#00000073}.ant-steps-item-wait>.ant-steps-item-container>.ant-steps-item-tail:after{background-color:#f0f0f0}.ant-steps-item-process .ant-steps-item-icon{background-color:#fff;border-color:#1890ff}.ant-steps-item-process .ant-steps-item-icon>.ant-steps-icon{color:#1890ff}.ant-steps-item-process .ant-steps-item-icon>.ant-steps-icon .ant-steps-icon-dot{background:#1890ff}.ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title{color:#000000d9}.ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title:after{background-color:#f0f0f0}.ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-description{color:#000000d9}.ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-tail:after{background-color:#f0f0f0}.ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-icon{background:#1890ff}.ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-icon .ant-steps-icon{color:#fff}.ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-title{font-weight:500}.ant-steps-item-finish .ant-steps-item-icon{background-color:#fff;border-color:#1890ff}.ant-steps-item-finish .ant-steps-item-icon>.ant-steps-icon{color:#1890ff}.ant-steps-item-finish .ant-steps-item-icon>.ant-steps-icon .ant-steps-icon-dot{background:#1890ff}.ant-steps-item-finish>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title{color:#000000d9}.ant-steps-item-finish>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title:after{background-color:#1890ff}.ant-steps-item-finish>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-description{color:#00000073}.ant-steps-item-finish>.ant-steps-item-container>.ant-steps-item-tail:after{background-color:#1890ff}.ant-steps-item-error .ant-steps-item-icon{background-color:#fff;border-color:#ff4d4f}.ant-steps-item-error .ant-steps-item-icon>.ant-steps-icon{color:#ff4d4f}.ant-steps-item-error .ant-steps-item-icon>.ant-steps-icon .ant-steps-icon-dot{background:#ff4d4f}.ant-steps-item-error>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title{color:#ff4d4f}.ant-steps-item-error>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title:after{background-color:#f0f0f0}.ant-steps-item-error>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-description{color:#ff4d4f}.ant-steps-item-error>.ant-steps-item-container>.ant-steps-item-tail:after{background-color:#f0f0f0}.ant-steps-item.ant-steps-next-error .ant-steps-item-title:after{background:#ff4d4f}.ant-steps-item-disabled{cursor:not-allowed}.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button]{cursor:pointer}.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button] .ant-steps-item-title,.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button] .ant-steps-item-subtitle,.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button] .ant-steps-item-description,.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button] .ant-steps-item-icon .ant-steps-icon{transition:color .3s}.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button]:hover .ant-steps-item-title,.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button]:hover .ant-steps-item-subtitle,.ant-steps .ant-steps-item:not(.ant-steps-item-active)>.ant-steps-item-container[role=button]:hover .ant-steps-item-description{color:#1890ff}.ant-steps .ant-steps-item:not(.ant-steps-item-active):not(.ant-steps-item-process)>.ant-steps-item-container[role=button]:hover .ant-steps-item-icon{border-color:#1890ff}.ant-steps .ant-steps-item:not(.ant-steps-item-active):not(.ant-steps-item-process)>.ant-steps-item-container[role=button]:hover .ant-steps-item-icon .ant-steps-icon{color:#1890ff}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item{padding-left:16px;white-space:nowrap}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:first-child{padding-left:0}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child .ant-steps-item-title{padding-right:0}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item-tail{display:none}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item-description{max-width:140px;white-space:normal}.ant-steps-item-custom>.ant-steps-item-container>.ant-steps-item-icon{height:auto;background:none;border:0}.ant-steps-item-custom>.ant-steps-item-container>.ant-steps-item-icon>.ant-steps-icon{top:0;left:.5px;width:32px;height:32px;font-size:24px;line-height:32px}.ant-steps-item-custom.ant-steps-item-process .ant-steps-item-icon>.ant-steps-icon{color:#1890ff}.ant-steps:not(.ant-steps-vertical) .ant-steps-item-custom .ant-steps-item-icon{width:auto;background:none}.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item{padding-left:12px}.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:first-child{padding-left:0}.ant-steps-small .ant-steps-item-icon{width:24px;height:24px;margin:0 8px 0 0;font-size:12px;line-height:24px;text-align:center;border-radius:24px}.ant-steps-small .ant-steps-item-title{padding-right:12px;font-size:14px;line-height:24px}.ant-steps-small .ant-steps-item-title:after{top:12px}.ant-steps-small .ant-steps-item-description{color:#00000073;font-size:14px}.ant-steps-small .ant-steps-item-tail{top:8px}.ant-steps-small .ant-steps-item-custom .ant-steps-item-icon{width:inherit;height:inherit;line-height:inherit;background:none;border:0;border-radius:0}.ant-steps-small .ant-steps-item-custom .ant-steps-item-icon>.ant-steps-icon{font-size:24px;line-height:24px;transform:none}.ant-steps-vertical{display:flex;flex-direction:column}.ant-steps-vertical>.ant-steps-item{display:block;flex:1 0 auto;padding-left:0;overflow:visible}.ant-steps-vertical>.ant-steps-item .ant-steps-item-icon{float:left;margin-right:16px}.ant-steps-vertical>.ant-steps-item .ant-steps-item-content{display:block;min-height:48px;overflow:hidden}.ant-steps-vertical>.ant-steps-item .ant-steps-item-title{line-height:32px}.ant-steps-vertical>.ant-steps-item .ant-steps-item-description{padding-bottom:12px}.ant-steps-vertical>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{position:absolute;top:0;left:15px;width:1px;height:100%;padding:38px 0 6px}.ant-steps-vertical>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail:after{width:1px;height:100%}.ant-steps-vertical>.ant-steps-item:not(:last-child)>.ant-steps-item-container>.ant-steps-item-tail{display:block}.ant-steps-vertical>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-content>.ant-steps-item-title:after{display:none}.ant-steps-vertical.ant-steps-small .ant-steps-item-container .ant-steps-item-tail{position:absolute;top:0;left:11px;padding:30px 0 6px}.ant-steps-vertical.ant-steps-small .ant-steps-item-container .ant-steps-item-title{line-height:24px}.ant-steps-label-vertical .ant-steps-item{overflow:visible}.ant-steps-label-vertical .ant-steps-item-tail{margin-left:58px;padding:3.5px 24px}.ant-steps-label-vertical .ant-steps-item-content{display:block;width:116px;margin-top:8px;text-align:center}.ant-steps-label-vertical .ant-steps-item-icon{display:inline-block;margin-left:42px}.ant-steps-label-vertical .ant-steps-item-title{padding-right:0;padding-left:0}.ant-steps-label-vertical .ant-steps-item-title:after{display:none}.ant-steps-label-vertical .ant-steps-item-subtitle{display:block;margin-bottom:4px;margin-left:0;line-height:1.5715}.ant-steps-label-vertical.ant-steps-small:not(.ant-steps-dot) .ant-steps-item-icon{margin-left:46px}.ant-steps-dot .ant-steps-item-title,.ant-steps-dot.ant-steps-small .ant-steps-item-title{line-height:1.5715}.ant-steps-dot .ant-steps-item-tail,.ant-steps-dot.ant-steps-small .ant-steps-item-tail{top:2px;width:100%;margin:0 0 0 70px;padding:0}.ant-steps-dot .ant-steps-item-tail:after,.ant-steps-dot.ant-steps-small .ant-steps-item-tail:after{width:calc(100% - 20px);height:3px;margin-left:12px}.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot,.ant-steps-dot.ant-steps-small .ant-steps-item:first-child .ant-steps-icon-dot{left:2px}.ant-steps-dot .ant-steps-item-icon,.ant-steps-dot.ant-steps-small .ant-steps-item-icon{width:8px;height:8px;margin-left:67px;padding-right:0;line-height:8px;background:transparent;border:0}.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot,.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot{position:relative;float:left;width:100%;height:100%;border-radius:100px;transition:all .3s}.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot:after,.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot:after{position:absolute;top:-12px;left:-26px;width:60px;height:32px;background:rgba(0,0,0,.001);content:""}.ant-steps-dot .ant-steps-item-content,.ant-steps-dot.ant-steps-small .ant-steps-item-content{width:140px}.ant-steps-dot .ant-steps-item-process .ant-steps-item-icon,.ant-steps-dot.ant-steps-small .ant-steps-item-process .ant-steps-item-icon{position:relative;top:-1px;width:10px;height:10px;line-height:10px;background:none}.ant-steps-dot .ant-steps-item-process .ant-steps-icon:first-child .ant-steps-icon-dot,.ant-steps-dot.ant-steps-small .ant-steps-item-process .ant-steps-icon:first-child .ant-steps-icon-dot{left:0}.ant-steps-vertical.ant-steps-dot .ant-steps-item-icon{margin-top:13px;margin-left:0;background:none}.ant-steps-vertical.ant-steps-dot .ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{top:6.5px;left:-9px;margin:0;padding:22px 0 4px}.ant-steps-vertical.ant-steps-dot.ant-steps-small .ant-steps-item-icon{margin-top:10px}.ant-steps-vertical.ant-steps-dot.ant-steps-small .ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{top:3.5px}.ant-steps-vertical.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot{left:0}.ant-steps-vertical.ant-steps-dot .ant-steps-item-content{width:inherit}.ant-steps-vertical.ant-steps-dot .ant-steps-item-process .ant-steps-item-container .ant-steps-item-icon .ant-steps-icon-dot{top:-1px;left:-1px}.ant-steps-navigation{padding-top:12px}.ant-steps-navigation.ant-steps-small .ant-steps-item-container{margin-left:-12px}.ant-steps-navigation .ant-steps-item{overflow:visible;text-align:center}.ant-steps-navigation .ant-steps-item-container{display:inline-block;height:100%;margin-left:-16px;padding-bottom:12px;text-align:left;transition:opacity .3s}.ant-steps-navigation .ant-steps-item-container .ant-steps-item-content{max-width:auto}.ant-steps-navigation .ant-steps-item-container .ant-steps-item-title{max-width:100%;padding-right:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-steps-navigation .ant-steps-item-container .ant-steps-item-title:after{display:none}.ant-steps-navigation .ant-steps-item:not(.ant-steps-item-active) .ant-steps-item-container[role=button]{cursor:pointer}.ant-steps-navigation .ant-steps-item:not(.ant-steps-item-active) .ant-steps-item-container[role=button]:hover{opacity:.85}.ant-steps-navigation .ant-steps-item:last-child{flex:1}.ant-steps-navigation .ant-steps-item:last-child:after{display:none}.ant-steps-navigation .ant-steps-item:after{position:absolute;top:50%;left:100%;display:inline-block;width:12px;height:12px;margin-top:-14px;margin-left:-2px;border:1px solid rgba(0,0,0,.25);border-bottom:none;border-left:none;transform:rotate(45deg);content:""}.ant-steps-navigation .ant-steps-item:before{position:absolute;bottom:0;left:50%;display:inline-block;width:0;height:2px;background-color:#1890ff;transition:width .3s,left .3s;transition-timing-function:ease-out;content:""}.ant-steps-navigation .ant-steps-item.ant-steps-item-active:before{left:0;width:100%}.ant-steps-navigation.ant-steps-vertical>.ant-steps-item{margin-right:0!important}.ant-steps-navigation.ant-steps-vertical>.ant-steps-item:before{display:none}.ant-steps-navigation.ant-steps-vertical>.ant-steps-item.ant-steps-item-active:before{top:0;right:0;left:unset;display:block;width:3px;height:calc(100% - 24px)}.ant-steps-navigation.ant-steps-vertical>.ant-steps-item:after{position:relative;top:-2px;left:50%;display:block;width:8px;height:8px;margin-bottom:8px;text-align:center;transform:rotate(135deg)}.ant-steps-navigation.ant-steps-vertical>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{visibility:hidden}.ant-steps-navigation.ant-steps-horizontal>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{visibility:hidden}.ant-steps-rtl{direction:rtl}.ant-steps.ant-steps-rtl .ant-steps-item-icon{margin-right:0;margin-left:8px}.ant-steps-rtl .ant-steps-item-tail{right:0;left:auto}.ant-steps-rtl .ant-steps-item-title{padding-right:0;padding-left:16px}.ant-steps-rtl .ant-steps-item-title .ant-steps-item-subtitle{float:left;margin-right:8px;margin-left:0}.ant-steps-rtl .ant-steps-item-title:after{right:100%;left:auto}.ant-steps-rtl.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item{padding-right:16px;padding-left:0}.ant-steps-rtl.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:first-child{padding-right:0}.ant-steps-rtl.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child .ant-steps-item-title{padding-left:0}.ant-steps-rtl .ant-steps-item-custom .ant-steps-item-icon>.ant-steps-icon{right:.5px;left:auto}.ant-steps-rtl.ant-steps-navigation.ant-steps-small .ant-steps-item-container{margin-right:-12px;margin-left:0}.ant-steps-rtl.ant-steps-navigation .ant-steps-item-container{margin-right:-16px;margin-left:0;text-align:right}.ant-steps-rtl.ant-steps-navigation .ant-steps-item-container .ant-steps-item-title{padding-left:0}.ant-steps-rtl.ant-steps-navigation .ant-steps-item:after{right:100%;left:auto;margin-right:-2px;margin-left:0;transform:rotate(225deg)}.ant-steps-rtl.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item{padding-right:12px;padding-left:0}.ant-steps-rtl.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:first-child{padding-right:0}.ant-steps-rtl.ant-steps-small .ant-steps-item-title{padding-right:0;padding-left:12px}.ant-steps-rtl.ant-steps-vertical>.ant-steps-item .ant-steps-item-icon{float:right;margin-right:0;margin-left:16px}.ant-steps-rtl.ant-steps-vertical>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{right:16px;left:auto}.ant-steps-rtl.ant-steps-vertical.ant-steps-small .ant-steps-item-container .ant-steps-item-tail{right:12px;left:auto}.ant-steps-rtl.ant-steps-label-vertical .ant-steps-item-title{padding-left:0}.ant-steps-rtl.ant-steps-dot .ant-steps-item-tail,.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-tail{margin:0 70px 0 0}.ant-steps-rtl.ant-steps-dot .ant-steps-item-tail:after,.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-tail:after{margin-right:12px;margin-left:0}.ant-steps-rtl.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot,.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item:first-child .ant-steps-icon-dot{right:2px;left:auto}.ant-steps-rtl.ant-steps-dot .ant-steps-item-icon,.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-icon{margin-right:67px;margin-left:0}.ant-steps-rtl.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot,.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot{float:right}.ant-steps-rtl.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot:after,.ant-steps-rtl.ant-steps-dot.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot:after{right:-26px;left:auto}.ant-steps-rtl.ant-steps-vertical.ant-steps-dot .ant-steps-item-icon{margin-right:0;margin-left:16px}.ant-steps-rtl.ant-steps-vertical.ant-steps-dot .ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{right:-9px;left:auto}.ant-steps-rtl.ant-steps-vertical.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot{right:0;left:auto}.ant-steps-rtl.ant-steps-vertical.ant-steps-dot .ant-steps-item-process .ant-steps-icon-dot{right:-2px;left:auto}.ant-steps-rtl.ant-steps-with-progress.ant-steps-vertical>.ant-steps-item{padding-right:4px}.ant-steps-rtl.ant-steps-with-progress.ant-steps-vertical>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{right:19px}.ant-steps-rtl.ant-steps-with-progress.ant-steps-small.ant-steps-vertical>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{right:15px}.ant-steps-rtl.ant-steps-with-progress.ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item:first-child{padding-right:4px;padding-left:0}.ant-steps-rtl.ant-steps-with-progress.ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item:first-child.ant-steps-item-active{padding-right:4px}.ant-steps-with-progress .ant-steps-item{padding-top:4px}.ant-steps-with-progress .ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{top:4px;left:19px}.ant-steps-with-progress.ant-steps-horizontal .ant-steps-item:first-child,.ant-steps-with-progress.ant-steps-small.ant-steps-horizontal .ant-steps-item:first-child{padding-bottom:4px;padding-left:4px}.ant-steps-with-progress.ant-steps-small>.ant-steps-item>.ant-steps-item-container>.ant-steps-item-tail{left:15px}.ant-steps-with-progress.ant-steps-vertical .ant-steps-item{padding-left:4px}.ant-steps-with-progress.ant-steps-label-vertical .ant-steps-item .ant-steps-item-tail{top:14px!important}.ant-steps-with-progress .ant-steps-item-icon{position:relative}.ant-steps-with-progress .ant-steps-item-icon .ant-progress{position:absolute;inset:-5px}.ant-switch{margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;display:inline-block;box-sizing:border-box;min-width:44px;height:22px;line-height:22px;vertical-align:middle;background-color:#00000040;border:0;border-radius:100px;cursor:pointer;transition:all .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-switch:focus{outline:0;box-shadow:0 0 0 2px #0000001a}.ant-switch-checked:focus{box-shadow:0 0 0 2px #e6f7ff}.ant-switch:focus:hover{box-shadow:none}.ant-switch-checked{background-color:#1890ff}.ant-switch-loading,.ant-switch-disabled{cursor:not-allowed;opacity:.4}.ant-switch-loading *,.ant-switch-disabled *{box-shadow:none;cursor:not-allowed}.ant-switch-inner{display:block;margin:0 7px 0 25px;color:#fff;font-size:12px;transition:margin .2s}.ant-switch-checked .ant-switch-inner{margin:0 25px 0 7px}.ant-switch-handle{position:absolute;top:2px;left:2px;width:18px;height:18px;transition:all .2s ease-in-out}.ant-switch-handle:before{position:absolute;inset:0;background-color:#fff;border-radius:9px;box-shadow:0 2px 4px #00230b33;transition:all .2s ease-in-out;content:""}.ant-switch-checked .ant-switch-handle{left:calc(100% - 20px)}.ant-switch:not(.ant-switch-disabled):active .ant-switch-handle:before{right:-30%;left:0}.ant-switch:not(.ant-switch-disabled):active.ant-switch-checked .ant-switch-handle:before{right:0;left:-30%}.ant-switch-loading-icon.anticon{position:relative;top:2px;color:#000000a6;vertical-align:top}.ant-switch-checked .ant-switch-loading-icon{color:#1890ff}.ant-switch-small{min-width:28px;height:16px;line-height:16px}.ant-switch-small .ant-switch-inner{margin:0 5px 0 18px;font-size:12px}.ant-switch-small .ant-switch-handle{width:12px;height:12px}.ant-switch-small .ant-switch-loading-icon{top:1.5px;font-size:9px}.ant-switch-small.ant-switch-checked .ant-switch-inner{margin:0 18px 0 5px}.ant-switch-small.ant-switch-checked .ant-switch-handle{left:calc(100% - 14px)}.ant-switch-rtl{direction:rtl}.ant-switch-rtl .ant-switch-inner{margin:0 25px 0 7px}.ant-switch-rtl .ant-switch-handle{right:2px;left:auto}.ant-switch-rtl:not(.ant-switch-rtl-disabled):active .ant-switch-handle:before{right:0;left:-30%}.ant-switch-rtl:not(.ant-switch-rtl-disabled):active.ant-switch-checked .ant-switch-handle:before{right:-30%;left:0}.ant-switch-rtl.ant-switch-checked .ant-switch-inner{margin:0 7px 0 25px}.ant-switch-rtl.ant-switch-checked .ant-switch-handle{right:calc(100% - 20px)}.ant-switch-rtl.ant-switch-small.ant-switch-checked .ant-switch-handle{right:calc(100% - 14px)}.ant-table.ant-table-middle{font-size:14px}.ant-table.ant-table-middle .ant-table-title,.ant-table.ant-table-middle .ant-table-footer,.ant-table.ant-table-middle .ant-table-thead>tr>th,.ant-table.ant-table-middle .ant-table-tbody>tr>td,.ant-table.ant-table-middle tfoot>tr>th,.ant-table.ant-table-middle tfoot>tr>td{padding:12px 8px}.ant-table.ant-table-middle .ant-table-filter-trigger{margin-right:-4px}.ant-table.ant-table-middle .ant-table-expanded-row-fixed{margin:-12px -8px}.ant-table.ant-table-middle .ant-table-tbody .ant-table-wrapper:only-child .ant-table{margin:-12px -8px -12px 40px}.ant-table.ant-table-middle .ant-table-selection-column{-webkit-padding-start:2px;padding-inline-start:2px}.ant-table.ant-table-small{font-size:14px}.ant-table.ant-table-small .ant-table-title,.ant-table.ant-table-small .ant-table-footer,.ant-table.ant-table-small .ant-table-thead>tr>th,.ant-table.ant-table-small .ant-table-tbody>tr>td,.ant-table.ant-table-small tfoot>tr>th,.ant-table.ant-table-small tfoot>tr>td{padding:8px}.ant-table.ant-table-small .ant-table-filter-trigger{margin-right:-4px}.ant-table.ant-table-small .ant-table-expanded-row-fixed{margin:-8px}.ant-table.ant-table-small .ant-table-tbody .ant-table-wrapper:only-child .ant-table{margin:-8px -8px -8px 40px}.ant-table.ant-table-small .ant-table-selection-column{-webkit-padding-start:2px;padding-inline-start:2px}.ant-table.ant-table-bordered>.ant-table-title{border:1px solid #f0f0f0;border-bottom:0}.ant-table.ant-table-bordered>.ant-table-container{border-left:1px solid #f0f0f0}.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>thead>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>thead>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>thead>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>thead>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>tbody>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>tbody>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>tbody>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>tbody>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>tfoot>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>tfoot>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>tfoot>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>tfoot>tr>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>tfoot>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>tfoot>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>tfoot>tr>td,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>tfoot>tr>td{border-right:1px solid #f0f0f0}.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>thead>tr:not(:last-child)>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>thead>tr:not(:last-child)>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>thead>tr:not(:last-child)>th,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>thead>tr:not(:last-child)>th{border-bottom:1px solid #f0f0f0}.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>thead>tr>th:before,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>thead>tr>th:before,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>thead>tr>th:before,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>thead>tr>th:before{background-color:transparent!important}.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>thead>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>thead>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>thead>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>thead>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>tbody>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>tbody>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>tbody>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>tbody>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>tfoot>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>tfoot>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>tfoot>tr>.ant-table-cell-fix-right-first:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>tfoot>tr>.ant-table-cell-fix-right-first:after{border-right:1px solid #f0f0f0}.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>tbody>tr>td>.ant-table-expanded-row-fixed,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>tbody>tr>td>.ant-table-expanded-row-fixed,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>tbody>tr>td>.ant-table-expanded-row-fixed,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>tbody>tr>td>.ant-table-expanded-row-fixed{margin:-16px -17px}.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>tbody>tr>td>.ant-table-expanded-row-fixed:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table>tbody>tr>td>.ant-table-expanded-row-fixed:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-body>table>tbody>tr>td>.ant-table-expanded-row-fixed:after,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-summary>table>tbody>tr>td>.ant-table-expanded-row-fixed:after{position:absolute;top:0;right:1px;bottom:0;border-right:1px solid #f0f0f0;content:""}.ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table,.ant-table.ant-table-bordered>.ant-table-container>.ant-table-header>table{border-top:1px solid #f0f0f0}.ant-table.ant-table-bordered.ant-table-scroll-horizontal>.ant-table-container>.ant-table-body>table>tbody>tr.ant-table-expanded-row>td,.ant-table.ant-table-bordered.ant-table-scroll-horizontal>.ant-table-container>.ant-table-body>table>tbody>tr.ant-table-placeholder>td{border-right:0}.ant-table.ant-table-bordered.ant-table-middle>.ant-table-container>.ant-table-content>table>tbody>tr>td>.ant-table-expanded-row-fixed,.ant-table.ant-table-bordered.ant-table-middle>.ant-table-container>.ant-table-body>table>tbody>tr>td>.ant-table-expanded-row-fixed{margin:-12px -9px}.ant-table.ant-table-bordered.ant-table-small>.ant-table-container>.ant-table-content>table>tbody>tr>td>.ant-table-expanded-row-fixed,.ant-table.ant-table-bordered.ant-table-small>.ant-table-container>.ant-table-body>table>tbody>tr>td>.ant-table-expanded-row-fixed{margin:-8px -9px}.ant-table.ant-table-bordered>.ant-table-footer{border:1px solid #f0f0f0;border-top:0}.ant-table-cell .ant-table-container:first-child{border-top:0}.ant-table-cell-scrollbar:not([rowspan]){box-shadow:0 1px 0 1px #fafafa}.ant-table-wrapper{clear:both;max-width:100%}.ant-table-wrapper:before{display:table;content:""}.ant-table-wrapper:after{display:table;clear:both;content:""}.ant-table{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;font-size:14px;background:#fff;border-radius:2px}.ant-table table{width:100%;text-align:left;border-radius:2px 2px 0 0;border-collapse:separate;border-spacing:0}.ant-table-thead>tr>th,.ant-table-tbody>tr>td,.ant-table tfoot>tr>th,.ant-table tfoot>tr>td{position:relative;padding:16px;overflow-wrap:break-word}.ant-table-cell-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;word-break:keep-all}.ant-table-cell-ellipsis.ant-table-cell-fix-left-last,.ant-table-cell-ellipsis.ant-table-cell-fix-right-first{overflow:visible}.ant-table-cell-ellipsis.ant-table-cell-fix-left-last .ant-table-cell-content,.ant-table-cell-ellipsis.ant-table-cell-fix-right-first .ant-table-cell-content{display:block;overflow:hidden;text-overflow:ellipsis}.ant-table-cell-ellipsis .ant-table-column-title{overflow:hidden;text-overflow:ellipsis;word-break:keep-all}.ant-table-title{padding:16px}.ant-table-footer{padding:16px;color:#000000d9;background:#fafafa}.ant-table-thead>tr>th{position:relative;color:#000000d9;font-weight:500;text-align:left;background:#fafafa;border-bottom:1px solid #f0f0f0;transition:background .3s ease}.ant-table-thead>tr>th[colspan]:not([colspan="1"]){text-align:center}.ant-table-thead>tr>th:not(:last-child):not(.ant-table-selection-column):not(.ant-table-row-expand-icon-cell):not([colspan]):before{position:absolute;top:50%;right:0;width:1px;height:1.6em;background-color:#0000000f;transform:translateY(-50%);transition:background-color .3s;content:""}.ant-table-thead>tr:not(:last-child)>th[colspan]{border-bottom:0}.ant-table-tbody>tr>td{border-bottom:1px solid #f0f0f0;transition:background .3s}.ant-table-tbody>tr>td>.ant-table-wrapper:only-child .ant-table,.ant-table-tbody>tr>td>.ant-table-expanded-row-fixed>.ant-table-wrapper:only-child .ant-table{margin:-16px -16px -16px 32px}.ant-table-tbody>tr>td>.ant-table-wrapper:only-child .ant-table-tbody>tr:last-child>td,.ant-table-tbody>tr>td>.ant-table-expanded-row-fixed>.ant-table-wrapper:only-child .ant-table-tbody>tr:last-child>td{border-bottom:0}.ant-table-tbody>tr>td>.ant-table-wrapper:only-child .ant-table-tbody>tr:last-child>td:first-child,.ant-table-tbody>tr>td>.ant-table-expanded-row-fixed>.ant-table-wrapper:only-child .ant-table-tbody>tr:last-child>td:first-child,.ant-table-tbody>tr>td>.ant-table-wrapper:only-child .ant-table-tbody>tr:last-child>td:last-child,.ant-table-tbody>tr>td>.ant-table-expanded-row-fixed>.ant-table-wrapper:only-child .ant-table-tbody>tr:last-child>td:last-child{border-radius:0}.ant-table-tbody>tr.ant-table-row:hover>td,.ant-table-tbody>tr>td.ant-table-cell-row-hover{background:#fafafa}.ant-table-tbody>tr.ant-table-row-selected>td{background:#e6f7ff;border-color:#00000008}.ant-table-tbody>tr.ant-table-row-selected:hover>td{background:#dcf4ff}.ant-table-summary{position:relative;z-index:2;background:#fff}div.ant-table-summary{box-shadow:0 -1px #f0f0f0}.ant-table-summary>tr>th,.ant-table-summary>tr>td{border-bottom:1px solid #f0f0f0}.ant-table-pagination.ant-pagination{margin:16px 0}.ant-table-pagination{display:flex;flex-wrap:wrap;row-gap:8px}.ant-table-pagination>*{flex:none}.ant-table-pagination-left{justify-content:flex-start}.ant-table-pagination-center{justify-content:center}.ant-table-pagination-right{justify-content:flex-end}.ant-table-thead th.ant-table-column-has-sorters{outline:none;cursor:pointer;transition:all .3s}.ant-table-thead th.ant-table-column-has-sorters:hover{background:rgba(0,0,0,.04)}.ant-table-thead th.ant-table-column-has-sorters:hover:before{background-color:transparent!important}.ant-table-thead th.ant-table-column-has-sorters:focus-visible{color:#1890ff}.ant-table-thead th.ant-table-column-has-sorters.ant-table-cell-fix-left:hover,.ant-table-thead th.ant-table-column-has-sorters.ant-table-cell-fix-right:hover,.ant-table-thead th.ant-table-column-sort{background:#f5f5f5}.ant-table-thead th.ant-table-column-sort:before{background-color:transparent!important}td.ant-table-column-sort{background:#fafafa}.ant-table-column-title{position:relative;z-index:1;flex:1}.ant-table-column-sorters{display:flex;flex:auto;align-items:center;justify-content:space-between}.ant-table-column-sorters:after{position:absolute;inset:0;width:100%;height:100%;content:""}.ant-table-column-sorter{margin-left:4px;color:#bfbfbf;font-size:0;transition:color .3s}.ant-table-column-sorter-inner{display:inline-flex;flex-direction:column;align-items:center}.ant-table-column-sorter-up,.ant-table-column-sorter-down{font-size:11px}.ant-table-column-sorter-up.active,.ant-table-column-sorter-down.active{color:#1890ff}.ant-table-column-sorter-up+.ant-table-column-sorter-down{margin-top:-.3em}.ant-table-column-sorters:hover .ant-table-column-sorter{color:#a6a6a6}.ant-table-filter-column{display:flex;justify-content:space-between}.ant-table-filter-trigger{position:relative;display:flex;align-items:center;margin:-4px -8px -4px 4px;padding:0 4px;color:#bfbfbf;font-size:12px;border-radius:2px;cursor:pointer;transition:all .3s}.ant-table-filter-trigger:hover{color:#00000073;background:rgba(0,0,0,.04)}.ant-table-filter-trigger.active{color:#1890ff}.ant-table-filter-dropdown{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";min-width:120px;background-color:#fff;border-radius:2px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d}.ant-table-filter-dropdown .ant-dropdown-menu{max-height:264px;overflow-x:hidden;border:0;box-shadow:none}.ant-table-filter-dropdown .ant-dropdown-menu:empty:after{display:block;padding:8px 0;color:#00000040;font-size:12px;text-align:center;content:"Not Found"}.ant-table-filter-dropdown-tree{padding:8px 8px 0}.ant-table-filter-dropdown-tree .ant-tree-treenode .ant-tree-node-content-wrapper:hover{background-color:#f5f5f5}.ant-table-filter-dropdown-tree .ant-tree-treenode-checkbox-checked .ant-tree-node-content-wrapper,.ant-table-filter-dropdown-tree .ant-tree-treenode-checkbox-checked .ant-tree-node-content-wrapper:hover{background-color:#bae7ff}.ant-table-filter-dropdown-search{padding:8px;border-bottom:1px #f0f0f0 solid}.ant-table-filter-dropdown-search-input input{min-width:140px}.ant-table-filter-dropdown-search-input .anticon{color:#00000040}.ant-table-filter-dropdown-checkall{width:100%;margin-bottom:4px;margin-left:4px}.ant-table-filter-dropdown-submenu>ul{max-height:calc(100vh - 130px);overflow-x:hidden;overflow-y:auto}.ant-table-filter-dropdown .ant-checkbox-wrapper+span,.ant-table-filter-dropdown-submenu .ant-checkbox-wrapper+span{padding-left:8px}.ant-table-filter-dropdown-btns{display:flex;justify-content:space-between;padding:7px 8px;overflow:hidden;background-color:inherit;border-top:1px solid #f0f0f0}.ant-table-selection-col{width:32px}.ant-table-bordered .ant-table-selection-col{width:50px}table tr th.ant-table-selection-column,table tr td.ant-table-selection-column{padding-right:8px;padding-left:8px;text-align:center}table tr th.ant-table-selection-column .ant-radio-wrapper,table tr td.ant-table-selection-column .ant-radio-wrapper{margin-right:0}table tr th.ant-table-selection-column.ant-table-cell-fix-left{z-index:3}table tr th.ant-table-selection-column:after{background-color:transparent!important}.ant-table-selection{position:relative;display:inline-flex;flex-direction:column}.ant-table-selection-extra{position:absolute;top:0;z-index:1;cursor:pointer;transition:all .3s;-webkit-margin-start:100%;margin-inline-start:100%;-webkit-padding-start:4px;padding-inline-start:4px}.ant-table-selection-extra .anticon{color:#bfbfbf;font-size:10px}.ant-table-selection-extra .anticon:hover{color:#a6a6a6}.ant-table-expand-icon-col{width:48px}.ant-table-row-expand-icon-cell{text-align:center}.ant-table-row-expand-icon-cell .ant-table-row-expand-icon{display:inline-flex;float:none;vertical-align:sub}.ant-table-row-indent{float:left;height:1px}.ant-table-row-expand-icon{color:#1890ff;outline:none;cursor:pointer;transition:color .3s;position:relative;float:left;box-sizing:border-box;width:17px;height:17px;padding:0;color:inherit;line-height:17px;background:#fff;border:1px solid #f0f0f0;border-radius:2px;transform:scale(.94117647);transition:all .3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-table-row-expand-icon:focus-visible,.ant-table-row-expand-icon:hover{color:#40a9ff}.ant-table-row-expand-icon:active{color:#096dd9}.ant-table-row-expand-icon:focus,.ant-table-row-expand-icon:hover,.ant-table-row-expand-icon:active{border-color:currentcolor}.ant-table-row-expand-icon:before,.ant-table-row-expand-icon:after{position:absolute;background:currentcolor;transition:transform .3s ease-out;content:""}.ant-table-row-expand-icon:before{top:7px;right:3px;left:3px;height:1px}.ant-table-row-expand-icon:after{top:3px;bottom:3px;left:7px;width:1px;transform:rotate(90deg)}.ant-table-row-expand-icon-collapsed:before{transform:rotate(-180deg)}.ant-table-row-expand-icon-collapsed:after{transform:rotate(0)}.ant-table-row-expand-icon-spaced{background:transparent;border:0;visibility:hidden}.ant-table-row-expand-icon-spaced:before,.ant-table-row-expand-icon-spaced:after{display:none;content:none}.ant-table-row-indent+.ant-table-row-expand-icon{margin-top:2.5005px;margin-right:8px}tr.ant-table-expanded-row>td,tr.ant-table-expanded-row:hover>td{background:#fbfbfb}tr.ant-table-expanded-row .ant-descriptions-view{display:flex}tr.ant-table-expanded-row .ant-descriptions-view table{flex:auto;width:auto}.ant-table .ant-table-expanded-row-fixed{position:relative;margin:-16px;padding:16px}.ant-table-tbody>tr.ant-table-placeholder{text-align:center}.ant-table-empty .ant-table-tbody>tr.ant-table-placeholder{color:#00000040}.ant-table-tbody>tr.ant-table-placeholder:hover>td{background:#fff}.ant-table-cell-fix-left,.ant-table-cell-fix-right{position:sticky!important;z-index:2;background:#fff}.ant-table-cell-fix-left-first:after,.ant-table-cell-fix-left-last:after{position:absolute;top:0;right:0;bottom:-1px;width:30px;transform:translate(100%);transition:box-shadow .3s;content:"";pointer-events:none}.ant-table-cell-fix-left-all:after{display:none}.ant-table-cell-fix-right-first:after,.ant-table-cell-fix-right-last:after{position:absolute;top:0;bottom:-1px;left:0;width:30px;transform:translate(-100%);transition:box-shadow .3s;content:"";pointer-events:none}.ant-table .ant-table-container:before,.ant-table .ant-table-container:after{position:absolute;top:0;bottom:0;z-index:4;width:30px;transition:box-shadow .3s;content:"";pointer-events:none}.ant-table .ant-table-container:before{left:0}.ant-table .ant-table-container:after{right:0}.ant-table-ping-left:not(.ant-table-has-fix-left)>.ant-table-container{position:relative}.ant-table-ping-left:not(.ant-table-has-fix-left)>.ant-table-container:before{box-shadow:inset 10px 0 8px -8px #00000026}.ant-table-ping-left .ant-table-cell-fix-left-first:after,.ant-table-ping-left .ant-table-cell-fix-left-last:after{box-shadow:inset 10px 0 8px -8px #00000026}.ant-table-ping-left .ant-table-cell-fix-left-last:before{background-color:transparent!important}.ant-table-ping-right:not(.ant-table-has-fix-right)>.ant-table-container{position:relative}.ant-table-ping-right:not(.ant-table-has-fix-right)>.ant-table-container:after{box-shadow:inset -10px 0 8px -8px #00000026}.ant-table-ping-right .ant-table-cell-fix-right-first:after,.ant-table-ping-right .ant-table-cell-fix-right-last:after{box-shadow:inset -10px 0 8px -8px #00000026}.ant-table-sticky-holder{position:sticky;z-index:3;background:#fff}.ant-table-sticky-scroll{position:sticky;bottom:0;z-index:3;display:flex;align-items:center;background:#ffffff;border-top:1px solid #f0f0f0;opacity:.6}.ant-table-sticky-scroll:hover{transform-origin:center bottom}.ant-table-sticky-scroll-bar{height:8px;background-color:#00000059;border-radius:4px}.ant-table-sticky-scroll-bar:hover,.ant-table-sticky-scroll-bar-active{background-color:#000c}@media all and (-ms-high-contrast: none){.ant-table-ping-left .ant-table-cell-fix-left-last:after{box-shadow:none!important}.ant-table-ping-right .ant-table-cell-fix-right-first:after{box-shadow:none!important}}.ant-table-title{border-radius:2px 2px 0 0}.ant-table-title+.ant-table-container{border-top-left-radius:0;border-top-right-radius:0}.ant-table-title+.ant-table-container table{border-radius:0}.ant-table-title+.ant-table-container table>thead>tr:first-child th:first-child{border-radius:0}.ant-table-title+.ant-table-container table>thead>tr:first-child th:last-child{border-radius:0}.ant-table-container{border-top-left-radius:2px;border-top-right-radius:2px}.ant-table-container table>thead>tr:first-child th:first-child{border-top-left-radius:2px}.ant-table-container table>thead>tr:first-child th:last-child{border-top-right-radius:2px}.ant-table-footer{border-radius:0 0 2px 2px}.ant-table-wrapper-rtl,.ant-table-rtl{direction:rtl}.ant-table-wrapper-rtl .ant-table table{text-align:right}.ant-table-wrapper-rtl .ant-table-thead>tr>th[colspan]:not([colspan="1"]){text-align:center}.ant-table-wrapper-rtl .ant-table-thead>tr>th:not(:last-child):not(.ant-table-selection-column):not(.ant-table-row-expand-icon-cell):not([colspan]):before{right:auto;left:0}.ant-table-wrapper-rtl .ant-table-thead>tr>th{text-align:right}.ant-table-tbody>tr .ant-table-wrapper:only-child .ant-table.ant-table-rtl{margin:-16px 33px -16px -16px}.ant-table-wrapper.ant-table-wrapper-rtl .ant-table-pagination-left{justify-content:flex-end}.ant-table-wrapper.ant-table-wrapper-rtl .ant-table-pagination-right{justify-content:flex-start}.ant-table-wrapper-rtl .ant-table-column-sorter{margin-right:4px;margin-left:0}.ant-table-wrapper-rtl .ant-table-filter-column-title{padding:16px 16px 16px 2.3em}.ant-table-rtl .ant-table-thead tr th.ant-table-column-has-sorters .ant-table-filter-column-title{padding:0 0 0 2.3em}.ant-table-wrapper-rtl .ant-table-filter-trigger{margin:-4px 4px -4px -8px}.ant-dropdown-rtl .ant-table-filter-dropdown .ant-checkbox-wrapper+span,.ant-dropdown-rtl .ant-table-filter-dropdown-submenu .ant-checkbox-wrapper+span,.ant-dropdown-menu-submenu-rtl.ant-table-filter-dropdown .ant-checkbox-wrapper+span,.ant-dropdown-menu-submenu-rtl.ant-table-filter-dropdown-submenu .ant-checkbox-wrapper+span{padding-right:8px;padding-left:0}.ant-table-wrapper-rtl .ant-table-selection{text-align:center}.ant-table-wrapper-rtl .ant-table-row-indent,.ant-table-wrapper-rtl .ant-table-row-expand-icon{float:right}.ant-table-wrapper-rtl .ant-table-row-indent+.ant-table-row-expand-icon{margin-right:0;margin-left:8px}.ant-table-wrapper-rtl .ant-table-row-expand-icon:after{transform:rotate(-90deg)}.ant-table-wrapper-rtl .ant-table-row-expand-icon-collapsed:before{transform:rotate(180deg)}.ant-table-wrapper-rtl .ant-table-row-expand-icon-collapsed:after{transform:rotate(0)}.ant-tree.ant-tree-directory .ant-tree-treenode{position:relative}.ant-tree.ant-tree-directory .ant-tree-treenode:before{position:absolute;inset:0 0 4px;transition:background-color .3s;content:"";pointer-events:none}.ant-tree.ant-tree-directory .ant-tree-treenode:hover:before{background:#f5f5f5}.ant-tree.ant-tree-directory .ant-tree-treenode>*{z-index:1}.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-switcher{transition:color .3s}.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-node-content-wrapper{border-radius:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-node-content-wrapper:hover{background:transparent}.ant-tree.ant-tree-directory .ant-tree-treenode .ant-tree-node-content-wrapper.ant-tree-node-selected{color:#fff;background:transparent}.ant-tree.ant-tree-directory .ant-tree-treenode-selected:hover:before,.ant-tree.ant-tree-directory .ant-tree-treenode-selected:before{background:#1890ff}.ant-tree.ant-tree-directory .ant-tree-treenode-selected .ant-tree-switcher{color:#fff}.ant-tree.ant-tree-directory .ant-tree-treenode-selected .ant-tree-node-content-wrapper{color:#fff;background:transparent}.ant-tree-checkbox{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;top:.2em;line-height:1;white-space:nowrap;outline:none;cursor:pointer}.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox-inner,.ant-tree-checkbox:hover .ant-tree-checkbox-inner,.ant-tree-checkbox-input:focus+.ant-tree-checkbox-inner{border-color:#1890ff}.ant-tree-checkbox-checked:after{position:absolute;top:0;left:0;width:100%;height:100%;border:1px solid #1890ff;border-radius:2px;visibility:hidden;animation:antCheckboxEffect .36s ease-in-out;animation-fill-mode:backwards;content:""}.ant-tree-checkbox:hover:after,.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox:after{visibility:visible}.ant-tree-checkbox-inner{position:relative;top:0;left:0;display:block;width:16px;height:16px;direction:ltr;background-color:#fff;border:1px solid #d9d9d9;border-radius:2px;border-collapse:separate;transition:all .3s}.ant-tree-checkbox-inner:after{position:absolute;top:50%;left:21.5%;display:table;width:5.71428571px;height:9.14285714px;border:2px solid #fff;border-top:0;border-left:0;transform:rotate(45deg) scale(0) translate(-50%,-50%);opacity:0;transition:all .1s cubic-bezier(.71,-.46,.88,.6),opacity .1s;content:" "}.ant-tree-checkbox-input{position:absolute;inset:0;z-index:1;width:100%;height:100%;cursor:pointer;opacity:0}.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after{position:absolute;display:table;border:2px solid #fff;border-top:0;border-left:0;transform:rotate(45deg) scale(1) translate(-50%,-50%);opacity:1;transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;content:" "}.ant-tree-checkbox-checked .ant-tree-checkbox-inner{background-color:#1890ff;border-color:#1890ff}.ant-tree-checkbox-disabled{cursor:not-allowed}.ant-tree-checkbox-disabled.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after{border-color:#00000040;animation-name:none}.ant-tree-checkbox-disabled .ant-tree-checkbox-input{cursor:not-allowed;pointer-events:none}.ant-tree-checkbox-disabled .ant-tree-checkbox-inner{background-color:#f5f5f5;border-color:#d9d9d9!important}.ant-tree-checkbox-disabled .ant-tree-checkbox-inner:after{border-color:#f5f5f5;border-collapse:separate;animation-name:none}.ant-tree-checkbox-disabled+span{color:#00000040;cursor:not-allowed}.ant-tree-checkbox-disabled:hover:after,.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox-disabled:after{visibility:hidden}.ant-tree-checkbox-wrapper{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";display:inline-flex;align-items:baseline;line-height:unset;cursor:pointer}.ant-tree-checkbox-wrapper:after{display:inline-block;width:0;overflow:hidden;content:"\\a0"}.ant-tree-checkbox-wrapper.ant-tree-checkbox-wrapper-disabled{cursor:not-allowed}.ant-tree-checkbox-wrapper+.ant-tree-checkbox-wrapper{margin-left:8px}.ant-tree-checkbox-wrapper.ant-tree-checkbox-wrapper-in-form-item input[type=checkbox]{width:14px;height:14px}.ant-tree-checkbox+span{padding-right:8px;padding-left:8px}.ant-tree-checkbox-group{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";display:inline-block}.ant-tree-checkbox-group-item{margin-right:8px}.ant-tree-checkbox-group-item:last-child{margin-right:0}.ant-tree-checkbox-group-item+.ant-tree-checkbox-group-item{margin-left:0}.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner{background-color:#fff;border-color:#d9d9d9}.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner:after{top:50%;left:50%;width:8px;height:8px;background-color:#1890ff;border:0;transform:translate(-50%,-50%) scale(1);opacity:1;content:" "}.ant-tree-checkbox-indeterminate.ant-tree-checkbox-disabled .ant-tree-checkbox-inner:after{background-color:#00000040;border-color:#00000040}.ant-tree{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";background:#fff;border-radius:2px;transition:background-color .3s}.ant-tree-focused:not(:hover):not(.ant-tree-active-focused){background:#e6f7ff}.ant-tree-list-holder-inner{align-items:flex-start}.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner{align-items:stretch}.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner .ant-tree-node-content-wrapper{flex:auto}.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner .ant-tree-treenode.dragging{position:relative}.ant-tree.ant-tree-block-node .ant-tree-list-holder-inner .ant-tree-treenode.dragging:after{position:absolute;inset:0 0 4px;border:1px solid #1890ff;opacity:0;animation:ant-tree-node-fx-do-not-use .3s;animation-play-state:running;animation-fill-mode:forwards;content:"";pointer-events:none}.ant-tree .ant-tree-treenode{display:flex;align-items:flex-start;padding:0 0 4px;outline:none}.ant-tree .ant-tree-treenode-disabled .ant-tree-node-content-wrapper{color:#00000040;cursor:not-allowed}.ant-tree .ant-tree-treenode-disabled .ant-tree-node-content-wrapper:hover{background:transparent}.ant-tree .ant-tree-treenode-active .ant-tree-node-content-wrapper{background:#f5f5f5}.ant-tree .ant-tree-treenode:not(.ant-tree .ant-tree-treenode-disabled).filter-node .ant-tree-title{color:inherit;font-weight:500}.ant-tree .ant-tree-treenode-draggable .ant-tree-draggable-icon{width:24px;line-height:24px;text-align:center;visibility:visible;opacity:.2;transition:opacity .3s}.ant-tree-treenode:hover .ant-tree .ant-tree-treenode-draggable .ant-tree-draggable-icon{opacity:.45}.ant-tree .ant-tree-treenode-draggable.ant-tree-treenode-disabled .ant-tree-draggable-icon{visibility:hidden}.ant-tree-indent{align-self:stretch;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-tree-indent-unit{display:inline-block;width:24px}.ant-tree-draggable-icon{visibility:hidden}.ant-tree-switcher{position:relative;flex:none;align-self:stretch;width:24px;margin:0;line-height:24px;text-align:center;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-tree-switcher .ant-tree-switcher-icon,.ant-tree-switcher .ant-select-tree-switcher-icon{display:inline-block;font-size:10px;vertical-align:baseline}.ant-tree-switcher .ant-tree-switcher-icon svg,.ant-tree-switcher .ant-select-tree-switcher-icon svg{transition:transform .3s}.ant-tree-switcher-noop{cursor:default}.ant-tree-switcher_close .ant-tree-switcher-icon svg{transform:rotate(-90deg)}.ant-tree-switcher-loading-icon{color:#1890ff}.ant-tree-switcher-leaf-line{position:relative;z-index:1;display:inline-block;width:100%;height:100%}.ant-tree-switcher-leaf-line:before{position:absolute;top:0;right:12px;bottom:-4px;margin-left:-1px;border-right:1px solid #d9d9d9;content:" "}.ant-tree-switcher-leaf-line:after{position:absolute;width:10px;height:14px;border-bottom:1px solid #d9d9d9;content:" "}.ant-tree-checkbox{top:initial;margin:4px 8px 0 0}.ant-tree .ant-tree-node-content-wrapper{position:relative;z-index:auto;min-height:24px;margin:0;padding:0 4px;color:inherit;line-height:24px;background:transparent;border-radius:2px;cursor:pointer;transition:all .3s,border 0s,line-height 0s,box-shadow 0s}.ant-tree .ant-tree-node-content-wrapper:hover{background-color:#f5f5f5}.ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected{background-color:#bae7ff}.ant-tree .ant-tree-node-content-wrapper .ant-tree-iconEle{display:inline-block;width:24px;height:24px;line-height:24px;text-align:center;vertical-align:top}.ant-tree .ant-tree-node-content-wrapper .ant-tree-iconEle:empty{display:none}.ant-tree-unselectable .ant-tree-node-content-wrapper:hover{background-color:transparent}.ant-tree-node-content-wrapper{line-height:24px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-tree-node-content-wrapper .ant-tree-drop-indicator{position:absolute;z-index:1;height:2px;background-color:#1890ff;border-radius:1px;pointer-events:none}.ant-tree-node-content-wrapper .ant-tree-drop-indicator:after{position:absolute;top:-3px;left:-6px;width:8px;height:8px;background-color:transparent;border:2px solid #1890ff;border-radius:50%;content:""}.ant-tree .ant-tree-treenode.drop-container>[draggable]{box-shadow:0 0 0 2px #1890ff}.ant-tree-show-line .ant-tree-indent-unit{position:relative;height:100%}.ant-tree-show-line .ant-tree-indent-unit:before{position:absolute;top:0;right:12px;bottom:-4px;border-right:1px solid #d9d9d9;content:""}.ant-tree-show-line .ant-tree-indent-unit-end:before{display:none}.ant-tree-show-line .ant-tree-switcher{background:#fff}.ant-tree-show-line .ant-tree-switcher-line-icon{vertical-align:-.15em}.ant-tree .ant-tree-treenode-leaf-last .ant-tree-switcher-leaf-line:before{top:auto!important;bottom:auto!important;height:14px!important}.ant-tree-rtl{direction:rtl}.ant-tree-rtl .ant-tree-node-content-wrapper[draggable=true] .ant-tree-drop-indicator:after{right:-6px;left:unset}.ant-tree .ant-tree-treenode-rtl{direction:rtl}.ant-tree-rtl .ant-tree-switcher_close .ant-tree-switcher-icon svg{transform:rotate(90deg)}.ant-tree-rtl.ant-tree-show-line .ant-tree-indent-unit:before{right:auto;left:-13px;border-right:none;border-left:1px solid #d9d9d9}.ant-tree-rtl .ant-tree-checkbox,.ant-tree-select-dropdown-rtl .ant-select-tree-checkbox{margin:4px 0 0 8px}.ant-timeline{box-sizing:border-box;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;font-feature-settings:"tnum";margin:0;padding:0;list-style:none}.ant-timeline-item{position:relative;margin:0;padding-bottom:20px;font-size:14px;list-style:none}.ant-timeline-item-tail{position:absolute;top:10px;left:4px;height:calc(100% - 10px);border-left:2px solid #f0f0f0}.ant-timeline-item-pending .ant-timeline-item-head{font-size:12px;background-color:transparent}.ant-timeline-item-pending .ant-timeline-item-tail{display:none}.ant-timeline-item-head{position:absolute;width:10px;height:10px;background-color:#fff;border:2px solid transparent;border-radius:100px}.ant-timeline-item-head-blue{color:#1890ff;border-color:#1890ff}.ant-timeline-item-head-red{color:#ff4d4f;border-color:#ff4d4f}.ant-timeline-item-head-green{color:#52c41a;border-color:#52c41a}.ant-timeline-item-head-gray{color:#00000040;border-color:#00000040}.ant-timeline-item-head-custom{position:absolute;top:5.5px;left:5px;width:auto;height:auto;margin-top:0;padding:3px 1px;line-height:1;text-align:center;border:0;border-radius:0;transform:translate(-50%,-50%)}.ant-timeline-item-content{position:relative;top:-7.001px;margin:0 0 0 26px;word-break:break-word}.ant-timeline-item-last>.ant-timeline-item-tail{display:none}.ant-timeline-item-last>.ant-timeline-item-content{min-height:48px}.ant-timeline.ant-timeline-alternate .ant-timeline-item-tail,.ant-timeline.ant-timeline-right .ant-timeline-item-tail,.ant-timeline.ant-timeline-label .ant-timeline-item-tail,.ant-timeline.ant-timeline-alternate .ant-timeline-item-head,.ant-timeline.ant-timeline-right .ant-timeline-item-head,.ant-timeline.ant-timeline-label .ant-timeline-item-head,.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom,.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom,.ant-timeline.ant-timeline-label .ant-timeline-item-head-custom{left:50%}.ant-timeline.ant-timeline-alternate .ant-timeline-item-head,.ant-timeline.ant-timeline-right .ant-timeline-item-head,.ant-timeline.ant-timeline-label .ant-timeline-item-head{margin-left:-4px}.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom,.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom,.ant-timeline.ant-timeline-label .ant-timeline-item-head-custom{margin-left:1px}.ant-timeline.ant-timeline-alternate .ant-timeline-item-left .ant-timeline-item-content,.ant-timeline.ant-timeline-right .ant-timeline-item-left .ant-timeline-item-content,.ant-timeline.ant-timeline-label .ant-timeline-item-left .ant-timeline-item-content{left:calc(50% - 4px);width:calc(50% - 14px);text-align:left}.ant-timeline.ant-timeline-alternate .ant-timeline-item-right .ant-timeline-item-content,.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content,.ant-timeline.ant-timeline-label .ant-timeline-item-right .ant-timeline-item-content{width:calc(50% - 12px);margin:0;text-align:right}.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-tail,.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head,.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head-custom{left:calc(100% - 6px)}.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content{width:calc(100% - 18px)}.ant-timeline.ant-timeline-pending .ant-timeline-item-last .ant-timeline-item-tail{display:block;height:calc(100% - 14px);border-left:2px dotted #f0f0f0}.ant-timeline.ant-timeline-reverse .ant-timeline-item-last .ant-timeline-item-tail{display:none}.ant-timeline.ant-timeline-reverse .ant-timeline-item-pending .ant-timeline-item-tail{top:15px;display:block;height:calc(100% - 15px);border-left:2px dotted #f0f0f0}.ant-timeline.ant-timeline-reverse .ant-timeline-item-pending .ant-timeline-item-content{min-height:48px}.ant-timeline.ant-timeline-label .ant-timeline-item-label{position:absolute;top:-7.001px;width:calc(50% - 12px);text-align:right}.ant-timeline.ant-timeline-label .ant-timeline-item-right .ant-timeline-item-label{left:calc(50% + 14px);width:calc(50% - 14px);text-align:left}.ant-timeline-rtl{direction:rtl}.ant-timeline-rtl .ant-timeline-item-tail{right:4px;left:auto;border-right:2px solid #f0f0f0;border-left:none}.ant-timeline-rtl .ant-timeline-item-head-custom{right:5px;left:auto;transform:translate(50%,-50%)}.ant-timeline-rtl .ant-timeline-item-content{margin:0 18px 0 0}.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-tail,.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-tail,.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-tail,.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-head,.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-head,.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-head,.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom,.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom,.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-head-custom{right:50%;left:auto}.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-head,.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-head,.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-head{margin-right:-4px;margin-left:0}.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom,.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom,.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-head-custom{margin-right:1px;margin-left:0}.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-left .ant-timeline-item-content,.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-left .ant-timeline-item-content,.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-left .ant-timeline-item-content{right:calc(50% - 4px);left:auto;text-align:right}.ant-timeline-rtl.ant-timeline.ant-timeline-alternate .ant-timeline-item-right .ant-timeline-item-content,.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content,.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-right .ant-timeline-item-content{text-align:left}.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-tail,.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head,.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head-custom{right:0;left:auto}.ant-timeline-rtl.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content{width:100%;margin-right:18px;text-align:right}.ant-timeline-rtl.ant-timeline.ant-timeline-pending .ant-timeline-item-last .ant-timeline-item-tail,.ant-timeline-rtl.ant-timeline.ant-timeline-reverse .ant-timeline-item-pending .ant-timeline-item-tail{border-right:2px dotted #f0f0f0;border-left:none}.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-label{text-align:left}.ant-timeline-rtl.ant-timeline.ant-timeline-label .ant-timeline-item-right .ant-timeline-item-label{right:calc(50% + 14px);text-align:right}.ant-transfer-customize-list .ant-transfer-list{flex:1 1 50%;width:auto;height:auto;min-height:200px}.ant-transfer-customize-list .ant-table-wrapper .ant-table-small{border:0;border-radius:0}.ant-transfer-customize-list .ant-table-wrapper .ant-table-small .ant-table-selection-column{width:40px;min-width:40px}.ant-transfer-customize-list .ant-table-wrapper .ant-table-small>.ant-table-content>.ant-table-body>table>.ant-table-thead>tr>th{background:#fafafa}.ant-transfer-customize-list .ant-table-wrapper .ant-table-small>.ant-table-content .ant-table-row:last-child td{border-bottom:1px solid #f0f0f0}.ant-transfer-customize-list .ant-table-wrapper .ant-table-small .ant-table-body{margin:0}.ant-transfer-customize-list .ant-table-wrapper .ant-table-pagination.ant-pagination{margin:16px 0 4px}.ant-transfer-customize-list .ant-input[disabled]{background-color:transparent}.ant-transfer-status-error .ant-transfer-list{border-color:#ff4d4f}.ant-transfer-status-error .ant-transfer-list-search:not([disabled]){border-color:#d9d9d9}.ant-transfer-status-error .ant-transfer-list-search:not([disabled]):hover{border-color:#40a9ff;border-right-width:1px}.ant-transfer-status-error .ant-transfer-list-search:not([disabled]):focus{border-color:#40a9ff;box-shadow:0 0 0 2px #1890ff33;border-right-width:1px;outline:0}.ant-transfer-status-warning .ant-transfer-list{border-color:#faad14}.ant-transfer-status-warning .ant-transfer-list-search:not([disabled]){border-color:#d9d9d9}.ant-transfer-status-warning .ant-transfer-list-search:not([disabled]):hover{border-color:#40a9ff;border-right-width:1px}.ant-transfer-status-warning .ant-transfer-list-search:not([disabled]):focus{border-color:#40a9ff;box-shadow:0 0 0 2px #1890ff33;border-right-width:1px;outline:0}.ant-transfer{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;display:flex;align-items:stretch}.ant-transfer-disabled .ant-transfer-list{background:#f5f5f5}.ant-transfer-list{display:flex;flex-direction:column;width:180px;height:200px;border:1px solid #d9d9d9;border-radius:2px}.ant-transfer-list-with-pagination{width:250px;height:auto}.ant-transfer-list-search .anticon-search{color:#00000040}.ant-transfer-list-header{display:flex;flex:none;align-items:center;height:40px;padding:8px 12px 9px;color:#000000d9;background:#fff;border-bottom:1px solid #f0f0f0;border-radius:2px 2px 0 0}.ant-transfer-list-header>*:not(:last-child){margin-right:4px}.ant-transfer-list-header>*{flex:none}.ant-transfer-list-header-title{flex:auto;overflow:hidden;white-space:nowrap;text-align:right;text-overflow:ellipsis}.ant-transfer-list-header-dropdown{font-size:10px;transform:translateY(10%);cursor:pointer}.ant-transfer-list-header-dropdown[disabled]{cursor:not-allowed}.ant-transfer-list-body{display:flex;flex:auto;flex-direction:column;overflow:hidden;font-size:14px}.ant-transfer-list-body-search-wrapper{position:relative;flex:none;padding:12px}.ant-transfer-list-content{flex:auto;margin:0;padding:0;overflow:auto;list-style:none}.ant-transfer-list-content-item{display:flex;align-items:center;min-height:32px;padding:6px 12px;line-height:20px;transition:all .3s}.ant-transfer-list-content-item>*:not(:last-child){margin-right:8px}.ant-transfer-list-content-item>*{flex:none}.ant-transfer-list-content-item-text{flex:auto;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ant-transfer-list-content-item-remove{position:relative;color:#d9d9d9;cursor:pointer;transition:all .3s}.ant-transfer-list-content-item-remove:hover{color:#40a9ff}.ant-transfer-list-content-item-remove:after{position:absolute;inset:-6px -50%;content:""}.ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled):hover{background-color:#f5f5f5;cursor:pointer}.ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled).ant-transfer-list-content-item-checked:hover{background-color:#dcf4ff}.ant-transfer-list-content-show-remove .ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled):hover{background:transparent;cursor:default}.ant-transfer-list-content-item-checked{background-color:#e6f7ff}.ant-transfer-list-content-item-disabled{color:#00000040;cursor:not-allowed}.ant-transfer-list-pagination{padding:8px 0;text-align:right;border-top:1px solid #f0f0f0}.ant-transfer-list-body-not-found{flex:none;width:100%;margin:auto 0;color:#00000040;text-align:center}.ant-transfer-list-footer{border-top:1px solid #f0f0f0}.ant-transfer-operation{display:flex;flex:none;flex-direction:column;align-self:center;margin:0 8px;vertical-align:middle}.ant-transfer-operation .ant-btn{display:block}.ant-transfer-operation .ant-btn:first-child{margin-bottom:4px}.ant-transfer-operation .ant-btn .anticon{font-size:12px}.ant-transfer .ant-empty-image{max-height:-2px}.ant-transfer-rtl{direction:rtl}.ant-transfer-rtl .ant-transfer-list-search{padding-right:8px;padding-left:24px}.ant-transfer-rtl .ant-transfer-list-search-action{right:auto;left:12px}.ant-transfer-rtl .ant-transfer-list-header>*:not(:last-child){margin-right:0;margin-left:4px}.ant-transfer-rtl .ant-transfer-list-header{right:0;left:auto}.ant-transfer-rtl .ant-transfer-list-header-title{text-align:left}.ant-transfer-rtl .ant-transfer-list-content-item>*:not(:last-child){margin-right:0;margin-left:8px}.ant-transfer-rtl .ant-transfer-list-pagination{text-align:left}.ant-transfer-rtl .ant-transfer-list-footer{right:0;left:auto}@keyframes ant-tree-node-fx-do-not-use{0%{opacity:0}to{opacity:1}}@keyframes antCheckboxEffect{0%{transform:scale(1);opacity:.5}to{transform:scale(1.6);opacity:0}}.ant-select-tree-checkbox{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";position:relative;top:.2em;line-height:1;white-space:nowrap;outline:none;cursor:pointer}.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox-inner,.ant-select-tree-checkbox:hover .ant-select-tree-checkbox-inner,.ant-select-tree-checkbox-input:focus+.ant-select-tree-checkbox-inner{border-color:#1890ff}.ant-select-tree-checkbox-checked:after{position:absolute;top:0;left:0;width:100%;height:100%;border:1px solid #1890ff;border-radius:2px;visibility:hidden;animation:antCheckboxEffect .36s ease-in-out;animation-fill-mode:backwards;content:""}.ant-select-tree-checkbox:hover:after,.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox:after{visibility:visible}.ant-select-tree-checkbox-inner{position:relative;top:0;left:0;display:block;width:16px;height:16px;direction:ltr;background-color:#fff;border:1px solid #d9d9d9;border-radius:2px;border-collapse:separate;transition:all .3s}.ant-select-tree-checkbox-inner:after{position:absolute;top:50%;left:21.5%;display:table;width:5.71428571px;height:9.14285714px;border:2px solid #fff;border-top:0;border-left:0;transform:rotate(45deg) scale(0) translate(-50%,-50%);opacity:0;transition:all .1s cubic-bezier(.71,-.46,.88,.6),opacity .1s;content:" "}.ant-select-tree-checkbox-input{position:absolute;inset:0;z-index:1;width:100%;height:100%;cursor:pointer;opacity:0}.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner:after{position:absolute;display:table;border:2px solid #fff;border-top:0;border-left:0;transform:rotate(45deg) scale(1) translate(-50%,-50%);opacity:1;transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;content:" "}.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner{background-color:#1890ff;border-color:#1890ff}.ant-select-tree-checkbox-disabled{cursor:not-allowed}.ant-select-tree-checkbox-disabled.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner:after{border-color:#00000040;animation-name:none}.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-input{cursor:not-allowed;pointer-events:none}.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner{background-color:#f5f5f5;border-color:#d9d9d9!important}.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner:after{border-color:#f5f5f5;border-collapse:separate;animation-name:none}.ant-select-tree-checkbox-disabled+span{color:#00000040;cursor:not-allowed}.ant-select-tree-checkbox-disabled:hover:after,.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox-disabled:after{visibility:hidden}.ant-select-tree-checkbox-wrapper{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";display:inline-flex;align-items:baseline;line-height:unset;cursor:pointer}.ant-select-tree-checkbox-wrapper:after{display:inline-block;width:0;overflow:hidden;content:"\\a0"}.ant-select-tree-checkbox-wrapper.ant-select-tree-checkbox-wrapper-disabled{cursor:not-allowed}.ant-select-tree-checkbox-wrapper+.ant-select-tree-checkbox-wrapper{margin-left:8px}.ant-select-tree-checkbox-wrapper.ant-select-tree-checkbox-wrapper-in-form-item input[type=checkbox]{width:14px;height:14px}.ant-select-tree-checkbox+span{padding-right:8px;padding-left:8px}.ant-select-tree-checkbox-group{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";display:inline-block}.ant-select-tree-checkbox-group-item{margin-right:8px}.ant-select-tree-checkbox-group-item:last-child{margin-right:0}.ant-select-tree-checkbox-group-item+.ant-select-tree-checkbox-group-item{margin-left:0}.ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner{background-color:#fff;border-color:#d9d9d9}.ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner:after{top:50%;left:50%;width:8px;height:8px;background-color:#1890ff;border:0;transform:translate(-50%,-50%) scale(1);opacity:1;content:" "}.ant-select-tree-checkbox-indeterminate.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner:after{background-color:#00000040;border-color:#00000040}.ant-tree-select-dropdown{padding:8px 4px}.ant-tree-select-dropdown-rtl{direction:rtl}.ant-tree-select-dropdown .ant-select-tree{border-radius:0}.ant-tree-select-dropdown .ant-select-tree-list-holder-inner{align-items:stretch}.ant-tree-select-dropdown .ant-select-tree-list-holder-inner .ant-select-tree-treenode .ant-select-tree-node-content-wrapper{flex:auto}.ant-select-tree{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";background:#fff;border-radius:2px;transition:background-color .3s}.ant-select-tree-focused:not(:hover):not(.ant-select-tree-active-focused){background:#e6f7ff}.ant-select-tree-list-holder-inner{align-items:flex-start}.ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner{align-items:stretch}.ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner .ant-select-tree-node-content-wrapper{flex:auto}.ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner .ant-select-tree-treenode.dragging{position:relative}.ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner .ant-select-tree-treenode.dragging:after{position:absolute;inset:0 0 4px;border:1px solid #1890ff;opacity:0;animation:ant-tree-node-fx-do-not-use .3s;animation-play-state:running;animation-fill-mode:forwards;content:"";pointer-events:none}.ant-select-tree .ant-select-tree-treenode{display:flex;align-items:flex-start;padding:0 0 4px;outline:none}.ant-select-tree .ant-select-tree-treenode-disabled .ant-select-tree-node-content-wrapper{color:#00000040;cursor:not-allowed}.ant-select-tree .ant-select-tree-treenode-disabled .ant-select-tree-node-content-wrapper:hover{background:transparent}.ant-select-tree .ant-select-tree-treenode-active .ant-select-tree-node-content-wrapper{background:#f5f5f5}.ant-select-tree .ant-select-tree-treenode:not(.ant-select-tree .ant-select-tree-treenode-disabled).filter-node .ant-select-tree-title{color:inherit;font-weight:500}.ant-select-tree .ant-select-tree-treenode-draggable .ant-select-tree-draggable-icon{width:24px;line-height:24px;text-align:center;visibility:visible;opacity:.2;transition:opacity .3s}.ant-select-tree-treenode:hover .ant-select-tree .ant-select-tree-treenode-draggable .ant-select-tree-draggable-icon{opacity:.45}.ant-select-tree .ant-select-tree-treenode-draggable.ant-select-tree-treenode-disabled .ant-select-tree-draggable-icon{visibility:hidden}.ant-select-tree-indent{align-self:stretch;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-select-tree-indent-unit{display:inline-block;width:24px}.ant-select-tree-draggable-icon{visibility:hidden}.ant-select-tree-switcher{position:relative;flex:none;align-self:stretch;width:24px;margin:0;line-height:24px;text-align:center;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-select-tree-switcher .ant-tree-switcher-icon,.ant-select-tree-switcher .ant-select-tree-switcher-icon{display:inline-block;font-size:10px;vertical-align:baseline}.ant-select-tree-switcher .ant-tree-switcher-icon svg,.ant-select-tree-switcher .ant-select-tree-switcher-icon svg{transition:transform .3s}.ant-select-tree-switcher-noop{cursor:default}.ant-select-tree-switcher_close .ant-select-tree-switcher-icon svg{transform:rotate(-90deg)}.ant-select-tree-switcher-loading-icon{color:#1890ff}.ant-select-tree-switcher-leaf-line{position:relative;z-index:1;display:inline-block;width:100%;height:100%}.ant-select-tree-switcher-leaf-line:before{position:absolute;top:0;right:12px;bottom:-4px;margin-left:-1px;border-right:1px solid #d9d9d9;content:" "}.ant-select-tree-switcher-leaf-line:after{position:absolute;width:10px;height:14px;border-bottom:1px solid #d9d9d9;content:" "}.ant-select-tree-checkbox{top:initial;margin:4px 8px 0 0}.ant-select-tree .ant-select-tree-node-content-wrapper{position:relative;z-index:auto;min-height:24px;margin:0;padding:0 4px;color:inherit;line-height:24px;background:transparent;border-radius:2px;cursor:pointer;transition:all .3s,border 0s,line-height 0s,box-shadow 0s}.ant-select-tree .ant-select-tree-node-content-wrapper:hover{background-color:#f5f5f5}.ant-select-tree .ant-select-tree-node-content-wrapper.ant-select-tree-node-selected{background-color:#bae7ff}.ant-select-tree .ant-select-tree-node-content-wrapper .ant-select-tree-iconEle{display:inline-block;width:24px;height:24px;line-height:24px;text-align:center;vertical-align:top}.ant-select-tree .ant-select-tree-node-content-wrapper .ant-select-tree-iconEle:empty{display:none}.ant-select-tree-unselectable .ant-select-tree-node-content-wrapper:hover{background-color:transparent}.ant-select-tree-node-content-wrapper{line-height:24px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-select-tree-node-content-wrapper .ant-tree-drop-indicator{position:absolute;z-index:1;height:2px;background-color:#1890ff;border-radius:1px;pointer-events:none}.ant-select-tree-node-content-wrapper .ant-tree-drop-indicator:after{position:absolute;top:-3px;left:-6px;width:8px;height:8px;background-color:transparent;border:2px solid #1890ff;border-radius:50%;content:""}.ant-select-tree .ant-select-tree-treenode.drop-container>[draggable]{box-shadow:0 0 0 2px #1890ff}.ant-select-tree-show-line .ant-select-tree-indent-unit{position:relative;height:100%}.ant-select-tree-show-line .ant-select-tree-indent-unit:before{position:absolute;top:0;right:12px;bottom:-4px;border-right:1px solid #d9d9d9;content:""}.ant-select-tree-show-line .ant-select-tree-indent-unit-end:before{display:none}.ant-select-tree-show-line .ant-select-tree-switcher{background:#fff}.ant-select-tree-show-line .ant-select-tree-switcher-line-icon{vertical-align:-.15em}.ant-select-tree .ant-select-tree-treenode-leaf-last .ant-select-tree-switcher-leaf-line:before{top:auto!important;bottom:auto!important;height:14px!important}.ant-tree-select-dropdown-rtl .ant-select-tree .ant-select-tree-switcher_close .ant-select-tree-switcher-icon svg{transform:rotate(90deg)}.ant-tree-select-dropdown-rtl .ant-select-tree .ant-select-tree-switcher-loading-icon{transform:scaleY(-1)}.ant-typography{color:#000000d9;word-break:break-word}.ant-typography.ant-typography-secondary{color:#00000073}.ant-typography.ant-typography-success{color:#52c41a}.ant-typography.ant-typography-warning{color:#faad14}.ant-typography.ant-typography-danger{color:#ff4d4f}a.ant-typography.ant-typography-danger:active,a.ant-typography.ant-typography-danger:focus{color:#d9363e}a.ant-typography.ant-typography-danger:hover{color:#ff7875}.ant-typography.ant-typography-disabled{color:#00000040;cursor:not-allowed;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div.ant-typography,.ant-typography p{margin-bottom:1em}h1.ant-typography,div.ant-typography-h1,div.ant-typography-h1>textarea,.ant-typography h1{margin-bottom:.5em;color:#000000d9;font-weight:600;font-size:38px;line-height:1.23}h2.ant-typography,div.ant-typography-h2,div.ant-typography-h2>textarea,.ant-typography h2{margin-bottom:.5em;color:#000000d9;font-weight:600;font-size:30px;line-height:1.35}h3.ant-typography,div.ant-typography-h3,div.ant-typography-h3>textarea,.ant-typography h3{margin-bottom:.5em;color:#000000d9;font-weight:600;font-size:24px;line-height:1.35}h4.ant-typography,div.ant-typography-h4,div.ant-typography-h4>textarea,.ant-typography h4{margin-bottom:.5em;color:#000000d9;font-weight:600;font-size:20px;line-height:1.4}h5.ant-typography,div.ant-typography-h5,div.ant-typography-h5>textarea,.ant-typography h5{margin-bottom:.5em;color:#000000d9;font-weight:600;font-size:16px;line-height:1.5}.ant-typography+h1.ant-typography,.ant-typography+h2.ant-typography,.ant-typography+h3.ant-typography,.ant-typography+h4.ant-typography,.ant-typography+h5.ant-typography{margin-top:1.2em}.ant-typography div+h1,.ant-typography ul+h1,.ant-typography li+h1,.ant-typography p+h1,.ant-typography h1+h1,.ant-typography h2+h1,.ant-typography h3+h1,.ant-typography h4+h1,.ant-typography h5+h1,.ant-typography div+h2,.ant-typography ul+h2,.ant-typography li+h2,.ant-typography p+h2,.ant-typography h1+h2,.ant-typography h2+h2,.ant-typography h3+h2,.ant-typography h4+h2,.ant-typography h5+h2,.ant-typography div+h3,.ant-typography ul+h3,.ant-typography li+h3,.ant-typography p+h3,.ant-typography h1+h3,.ant-typography h2+h3,.ant-typography h3+h3,.ant-typography h4+h3,.ant-typography h5+h3,.ant-typography div+h4,.ant-typography ul+h4,.ant-typography li+h4,.ant-typography p+h4,.ant-typography h1+h4,.ant-typography h2+h4,.ant-typography h3+h4,.ant-typography h4+h4,.ant-typography h5+h4,.ant-typography div+h5,.ant-typography ul+h5,.ant-typography li+h5,.ant-typography p+h5,.ant-typography h1+h5,.ant-typography h2+h5,.ant-typography h3+h5,.ant-typography h4+h5,.ant-typography h5+h5{margin-top:1.2em}a.ant-typography-ellipsis,span.ant-typography-ellipsis{display:inline-block;max-width:100%}a.ant-typography,.ant-typography a{color:#1890ff;outline:none;cursor:pointer;transition:color .3s;text-decoration:none}a.ant-typography:focus-visible,.ant-typography a:focus-visible,a.ant-typography:hover,.ant-typography a:hover{color:#40a9ff}a.ant-typography:active,.ant-typography a:active{color:#096dd9}a.ant-typography:active,.ant-typography a:active,a.ant-typography:hover,.ant-typography a:hover{text-decoration:none}a.ant-typography[disabled],.ant-typography a[disabled],a.ant-typography.ant-typography-disabled,.ant-typography a.ant-typography-disabled{color:#00000040;cursor:not-allowed}a.ant-typography[disabled]:active,.ant-typography a[disabled]:active,a.ant-typography.ant-typography-disabled:active,.ant-typography a.ant-typography-disabled:active,a.ant-typography[disabled]:hover,.ant-typography a[disabled]:hover,a.ant-typography.ant-typography-disabled:hover,.ant-typography a.ant-typography-disabled:hover{color:#00000040}a.ant-typography[disabled]:active,.ant-typography a[disabled]:active,a.ant-typography.ant-typography-disabled:active,.ant-typography a.ant-typography-disabled:active{pointer-events:none}.ant-typography code{margin:0 .2em;padding:.2em .4em .1em;font-size:85%;background:rgba(150,150,150,.1);border:1px solid rgba(100,100,100,.2);border-radius:3px}.ant-typography kbd{margin:0 .2em;padding:.15em .4em .1em;font-size:90%;background:rgba(150,150,150,.06);border:1px solid rgba(100,100,100,.2);border-bottom-width:2px;border-radius:3px}.ant-typography mark{padding:0;background-color:#ffe58f}.ant-typography u,.ant-typography ins{text-decoration:underline;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto}.ant-typography s,.ant-typography del{text-decoration:line-through}.ant-typography strong{font-weight:600}.ant-typography-expand,.ant-typography-edit,.ant-typography-copy{color:#1890ff;outline:none;cursor:pointer;transition:color .3s;margin-left:4px}.ant-typography-expand:focus-visible,.ant-typography-edit:focus-visible,.ant-typography-copy:focus-visible,.ant-typography-expand:hover,.ant-typography-edit:hover,.ant-typography-copy:hover{color:#40a9ff}.ant-typography-expand:active,.ant-typography-edit:active,.ant-typography-copy:active{color:#096dd9}.ant-typography-copy-success,.ant-typography-copy-success:hover,.ant-typography-copy-success:focus{color:#52c41a}.ant-typography-edit-content{position:relative}div.ant-typography-edit-content{left:-12px;margin-top:-5px;margin-bottom:calc(1em - 5px)}.ant-typography-edit-content-confirm{position:absolute;right:10px;bottom:8px;color:#00000073;font-weight:400;font-size:14px;font-style:normal;pointer-events:none}.ant-typography-edit-content textarea{height:1em;margin:0!important;-moz-transition:none}.ant-typography ul,.ant-typography ol{margin:0 0 1em;padding:0}.ant-typography ul li,.ant-typography ol li{margin:0 0 0 20px;padding:0 0 0 4px}.ant-typography ul{list-style-type:circle}.ant-typography ul ul{list-style-type:disc}.ant-typography ol{list-style-type:decimal}.ant-typography pre,.ant-typography blockquote{margin:1em 0}.ant-typography pre{padding:.4em .6em;white-space:pre-wrap;word-wrap:break-word;background:rgba(150,150,150,.1);border:1px solid rgba(100,100,100,.2);border-radius:3px}.ant-typography pre code{display:inline;margin:0;padding:0;font-size:inherit;font-family:inherit;background:transparent;border:0}.ant-typography blockquote{padding:0 0 0 .6em;border-left:4px solid rgba(100,100,100,.2);opacity:.85}.ant-typography-single-line{white-space:nowrap}.ant-typography-ellipsis-single-line{overflow:hidden;text-overflow:ellipsis}a.ant-typography-ellipsis-single-line,span.ant-typography-ellipsis-single-line{vertical-align:bottom}.ant-typography-ellipsis-multiple-line{display:-webkit-box;overflow:hidden;-webkit-line-clamp:3;-webkit-box-orient:vertical}.ant-typography-rtl{direction:rtl}.ant-typography-rtl .ant-typography-expand,.ant-typography-rtl .ant-typography-edit,.ant-typography-rtl .ant-typography-copy{margin-right:4px;margin-left:0}.ant-typography-rtl .ant-typography-expand{float:left}div.ant-typography-edit-content.ant-typography-rtl{right:-12px;left:auto}.ant-typography-rtl .ant-typography-edit-content-confirm{right:auto;left:10px}.ant-typography-rtl.ant-typography ul li,.ant-typography-rtl.ant-typography ol li{margin:0 20px 0 0;padding:0 4px 0 0}.ant-upload{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";outline:0}.ant-upload p{margin:0}.ant-upload-btn{display:block;width:100%;outline:none}.ant-upload input[type=file]{cursor:pointer}.ant-upload.ant-upload-select{display:inline-block}.ant-upload.ant-upload-disabled{color:#00000040;cursor:not-allowed}.ant-upload.ant-upload-select-picture-card{width:104px;height:104px;margin-right:8px;margin-bottom:8px;text-align:center;vertical-align:top;background-color:#fafafa;border:1px dashed #d9d9d9;border-radius:2px;cursor:pointer;transition:border-color .3s}.ant-upload.ant-upload-select-picture-card>.ant-upload{display:flex;align-items:center;justify-content:center;height:100%;text-align:center}.ant-upload.ant-upload-select-picture-card:hover{border-color:#1890ff}.ant-upload-disabled.ant-upload.ant-upload-select-picture-card:hover{border-color:#d9d9d9}.ant-upload.ant-upload-drag{position:relative;width:100%;height:100%;text-align:center;background:#fafafa;border:1px dashed #d9d9d9;border-radius:2px;cursor:pointer;transition:border-color .3s}.ant-upload.ant-upload-drag .ant-upload{padding:16px 0}.ant-upload.ant-upload-drag.ant-upload-drag-hover:not(.ant-upload-disabled){border-color:#096dd9}.ant-upload.ant-upload-drag.ant-upload-disabled{cursor:not-allowed}.ant-upload.ant-upload-drag .ant-upload-btn{display:table;height:100%}.ant-upload.ant-upload-drag .ant-upload-drag-container{display:table-cell;vertical-align:middle}.ant-upload.ant-upload-drag:not(.ant-upload-disabled):hover{border-color:#40a9ff}.ant-upload.ant-upload-drag p.ant-upload-drag-icon{margin-bottom:20px}.ant-upload.ant-upload-drag p.ant-upload-drag-icon .anticon{color:#40a9ff;font-size:48px}.ant-upload.ant-upload-drag p.ant-upload-text{margin:0 0 4px;color:#000000d9;font-size:16px}.ant-upload.ant-upload-drag p.ant-upload-hint{color:#00000073;font-size:14px}.ant-upload.ant-upload-drag .anticon-plus{color:#00000040;font-size:30px;transition:all .3s}.ant-upload.ant-upload-drag .anticon-plus:hover,.ant-upload.ant-upload-drag:hover .anticon-plus{color:#00000073}.ant-upload-picture-card-wrapper{display:inline-block;width:100%}.ant-upload-picture-card-wrapper:before{display:table;content:""}.ant-upload-picture-card-wrapper:after{display:table;clear:both;content:""}.ant-upload-list{box-sizing:border-box;margin:0;padding:0;color:#000000d9;font-size:14px;font-variant:tabular-nums;list-style:none;font-feature-settings:"tnum";line-height:1.5715}.ant-upload-list:before{display:table;content:""}.ant-upload-list:after{display:table;clear:both;content:""}.ant-upload-list-item{position:relative;height:22.001px;margin-top:8px;font-size:14px}.ant-upload-list-item-name{display:inline-block;width:100%;padding-left:22px;overflow:hidden;line-height:1.5715;white-space:nowrap;text-overflow:ellipsis}.ant-upload-list-item-card-actions{position:absolute;right:0}.ant-upload-list-item-card-actions-btn{opacity:0}.ant-upload-list-item-card-actions-btn.ant-btn-sm{height:22.001px;line-height:1;vertical-align:top}.ant-upload-list-item-card-actions.picture{top:22px;line-height:0}.ant-upload-list-item-card-actions-btn:focus,.ant-upload-list-item-card-actions.picture .ant-upload-list-item-card-actions-btn{opacity:1}.ant-upload-list-item-card-actions .anticon{color:#00000073;transition:all .3s}.ant-upload-list-item-card-actions:hover .anticon{color:#000000d9}.ant-upload-list-item-info{height:100%;transition:background-color .3s}.ant-upload-list-item-info>span{display:block;width:100%;height:100%}.ant-upload-list-item-info .anticon-loading .anticon,.ant-upload-list-item-info .ant-upload-text-icon .anticon{position:absolute;top:5px;color:#00000073;font-size:14px}.ant-upload-list-item:hover .ant-upload-list-item-info{background-color:#f5f5f5}.ant-upload-list-item:hover .ant-upload-list-item-card-actions-btn{opacity:1}.ant-upload-list-item-error,.ant-upload-list-item-error .ant-upload-text-icon>.anticon,.ant-upload-list-item-error .ant-upload-list-item-name{color:#ff4d4f}.ant-upload-list-item-error .ant-upload-list-item-card-actions .anticon{color:#ff4d4f}.ant-upload-list-item-error .ant-upload-list-item-card-actions-btn{opacity:1}.ant-upload-list-item-progress{position:absolute;bottom:-12px;width:100%;padding-left:26px;font-size:14px;line-height:0}.ant-upload-list-picture .ant-upload-list-item,.ant-upload-list-picture-card .ant-upload-list-item{position:relative;height:66px;padding:8px;border:1px solid #d9d9d9;border-radius:2px}.ant-upload-list-picture .ant-upload-list-item:hover,.ant-upload-list-picture-card .ant-upload-list-item:hover{background:transparent}.ant-upload-list-picture .ant-upload-list-item-error,.ant-upload-list-picture-card .ant-upload-list-item-error{border-color:#ff4d4f}.ant-upload-list-picture .ant-upload-list-item:hover .ant-upload-list-item-info,.ant-upload-list-picture-card .ant-upload-list-item:hover .ant-upload-list-item-info{background:transparent}.ant-upload-list-picture .ant-upload-list-item-uploading,.ant-upload-list-picture-card .ant-upload-list-item-uploading{border-style:dashed}.ant-upload-list-picture .ant-upload-list-item-thumbnail,.ant-upload-list-picture-card .ant-upload-list-item-thumbnail{width:48px;height:48px;line-height:60px;text-align:center;opacity:.8}.ant-upload-list-picture .ant-upload-list-item-thumbnail .anticon,.ant-upload-list-picture-card .ant-upload-list-item-thumbnail .anticon{font-size:26px}.ant-upload-list-picture .ant-upload-list-item-error .ant-upload-list-item-thumbnail .anticon svg path[fill="#e6f7ff"],.ant-upload-list-picture-card .ant-upload-list-item-error .ant-upload-list-item-thumbnail .anticon svg path[fill="#e6f7ff"]{fill:#fff2f0}.ant-upload-list-picture .ant-upload-list-item-error .ant-upload-list-item-thumbnail .anticon svg path[fill="#1890ff"],.ant-upload-list-picture-card .ant-upload-list-item-error .ant-upload-list-item-thumbnail .anticon svg path[fill="#1890ff"]{fill:#ff4d4f}.ant-upload-list-picture .ant-upload-list-item-icon,.ant-upload-list-picture-card .ant-upload-list-item-icon{position:absolute;top:50%;left:50%;font-size:26px;transform:translate(-50%,-50%)}.ant-upload-list-picture .ant-upload-list-item-icon .anticon,.ant-upload-list-picture-card .ant-upload-list-item-icon .anticon{font-size:26px}.ant-upload-list-picture .ant-upload-list-item-image,.ant-upload-list-picture-card .ant-upload-list-item-image{max-width:100%}.ant-upload-list-picture .ant-upload-list-item-thumbnail img,.ant-upload-list-picture-card .ant-upload-list-item-thumbnail img{display:block;width:48px;height:48px;overflow:hidden}.ant-upload-list-picture .ant-upload-list-item-name,.ant-upload-list-picture-card .ant-upload-list-item-name{display:inline-block;box-sizing:border-box;max-width:100%;margin:0 0 0 8px;padding-right:8px;padding-left:48px;overflow:hidden;line-height:44px;white-space:nowrap;text-overflow:ellipsis;transition:all .3s}.ant-upload-list-picture .ant-upload-list-item-uploading .ant-upload-list-item-name,.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-name{margin-bottom:12px}.ant-upload-list-picture .ant-upload-list-item-progress,.ant-upload-list-picture-card .ant-upload-list-item-progress{bottom:14px;width:calc(100% - 24px);margin-top:0;padding-left:56px}.ant-upload-list-picture-card-container{display:inline-block;width:104px;height:104px;margin:0 8px 8px 0;vertical-align:top}.ant-upload-list-picture-card .ant-upload-list-item{height:100%;margin:0}.ant-upload-list-picture-card .ant-upload-list-item-info{position:relative;height:100%;overflow:hidden}.ant-upload-list-picture-card .ant-upload-list-item-info:before{position:absolute;z-index:1;width:100%;height:100%;background-color:#00000080;opacity:0;transition:all .3s;content:" "}.ant-upload-list-picture-card .ant-upload-list-item:hover .ant-upload-list-item-info:before{opacity:1}.ant-upload-list-picture-card .ant-upload-list-item-actions{position:absolute;top:50%;left:50%;z-index:10;white-space:nowrap;transform:translate(-50%,-50%);opacity:0;transition:all .3s}.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-eye,.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-download,.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-delete{z-index:10;width:16px;margin:0 4px;color:#ffffffd9;font-size:16px;cursor:pointer;transition:all .3s}.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-eye:hover,.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-download:hover,.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-delete:hover{color:#fff}.ant-upload-list-picture-card .ant-upload-list-item-info:hover+.ant-upload-list-item-actions,.ant-upload-list-picture-card .ant-upload-list-item-actions:hover{opacity:1}.ant-upload-list-picture-card .ant-upload-list-item-thumbnail,.ant-upload-list-picture-card .ant-upload-list-item-thumbnail img{position:static;display:block;width:100%;height:100%;-o-object-fit:contain;object-fit:contain}.ant-upload-list-picture-card .ant-upload-list-item-name{display:none;margin:8px 0 0;padding:0;line-height:1.5715;text-align:center}.ant-upload-list-picture-card .ant-upload-list-item-file+.ant-upload-list-item-name{position:absolute;bottom:10px;display:block}.ant-upload-list-picture-card .ant-upload-list-item-uploading.ant-upload-list-item{background-color:#fafafa}.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info{height:auto}.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info:before,.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info .anticon-eye,.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info .anticon-delete{display:none}.ant-upload-list-picture-card .ant-upload-list-item-progress{bottom:32px;width:calc(100% - 14px);padding-left:0}.ant-upload-list-text-container,.ant-upload-list-picture-container{transition:opacity .3s,height .3s}.ant-upload-list-text-container:before,.ant-upload-list-picture-container:before{display:table;width:0;height:0;content:""}.ant-upload-list-text-container .ant-upload-span,.ant-upload-list-picture-container .ant-upload-span{display:block;flex:auto}.ant-upload-list-text .ant-upload-span,.ant-upload-list-picture .ant-upload-span{display:flex;align-items:center}.ant-upload-list-text .ant-upload-span>*,.ant-upload-list-picture .ant-upload-span>*{flex:none}.ant-upload-list-text .ant-upload-list-item-name,.ant-upload-list-picture .ant-upload-list-item-name{flex:auto;margin:0;padding:0 8px}.ant-upload-list-text .ant-upload-list-item-card-actions,.ant-upload-list-picture .ant-upload-list-item-card-actions,.ant-upload-list-text .ant-upload-text-icon .anticon{position:static}.ant-upload-list .ant-upload-animate-inline-appear,.ant-upload-list .ant-upload-animate-inline-enter,.ant-upload-list .ant-upload-animate-inline-leave{animation-duration:.3s;animation-timing-function:cubic-bezier(.78,.14,.15,.86);animation-fill-mode:forwards}.ant-upload-list .ant-upload-animate-inline-appear,.ant-upload-list .ant-upload-animate-inline-enter{animation-name:uploadAnimateInlineIn}.ant-upload-list .ant-upload-animate-inline-leave{animation-name:uploadAnimateInlineOut}@keyframes uploadAnimateInlineIn{0%{width:0;height:0;margin:0;padding:0;opacity:0}}@keyframes uploadAnimateInlineOut{to{width:0;height:0;margin:0;padding:0;opacity:0}}.ant-upload-rtl{direction:rtl}.ant-upload-rtl.ant-upload.ant-upload-select-picture-card{margin-right:auto;margin-left:8px}.ant-upload-list-rtl{direction:rtl}.ant-upload-list-rtl .ant-upload-list-item-list-type-text:hover .ant-upload-list-item-name-icon-count-1{padding-right:22px;padding-left:14px}.ant-upload-list-rtl .ant-upload-list-item-list-type-text:hover .ant-upload-list-item-name-icon-count-2{padding-right:22px;padding-left:28px}.ant-upload-list-rtl .ant-upload-list-item-name{padding-right:22px;padding-left:0}.ant-upload-list-rtl .ant-upload-list-item-name-icon-count-1{padding-left:14px}.ant-upload-list-rtl .ant-upload-list-item-card-actions{right:auto;left:0}.ant-upload-list-rtl .ant-upload-list-item-card-actions .anticon{padding-right:0;padding-left:5px}.ant-upload-list-rtl .ant-upload-list-item-info{padding:0 4px 0 12px}.ant-upload-list-rtl .ant-upload-list-item-error .ant-upload-list-item-card-actions .anticon{padding-right:0;padding-left:5px}.ant-upload-list-rtl .ant-upload-list-item-progress{padding-right:26px;padding-left:0}.ant-upload-list-picture .ant-upload-list-item-info,.ant-upload-list-picture-card .ant-upload-list-item-info{padding:0}.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-thumbnail,.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-thumbnail{right:8px;left:auto}.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-icon,.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-icon{right:50%;left:auto;transform:translate(50%,-50%)}.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-name,.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-name{margin:0 8px 0 0;padding-right:48px;padding-left:8px}.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-name-icon-count-1,.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-name-icon-count-1{padding-right:48px;padding-left:18px}.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-name-icon-count-2,.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-name-icon-count-2{padding-right:48px;padding-left:36px}.ant-upload-list-rtl.ant-upload-list-picture .ant-upload-list-item-progress,.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-progress{padding-right:0;padding-left:0}.ant-upload-list-rtl .ant-upload-list-picture-card-container{margin:0 0 8px 8px}.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-actions{right:50%;left:auto;transform:translate(50%,-50%)}.ant-upload-list-rtl.ant-upload-list-picture-card .ant-upload-list-item-file+.ant-upload-list-item-name{margin:8px 0 0;padding:0}.imgGray{filter:grayscale(100%)!important}.imgOrigin{filter:grayscale(0)!important}.upList{position:fixed;top:80px;left:5px;width:200px;z-index:999;opacity:.8}');
(function(React$a, ReactDOM2) {
"use strict";
const _interopDefaultLegacy = (e2) => e2 && typeof e2 === "object" && "default" in e2 ? e2 : { default: e2 };
function _interopNamespace(e2) {
if (e2 && e2.__esModule)
return e2;
const n2 = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
if (e2) {
for (const k2 in e2) {
if (k2 !== "default") {
const d2 = Object.getOwnPropertyDescriptor(e2, k2);
Object.defineProperty(n2, k2, d2.get ? d2 : {
enumerable: true,
get: () => e2[k2]
});
}
}
}
n2.default = e2;
return Object.freeze(n2);
}
const React__default = /* @__PURE__ */ _interopDefaultLegacy(React$a);
const React__namespace = /* @__PURE__ */ _interopNamespace(React$a);
const ReactDOM__default = /* @__PURE__ */ _interopDefaultLegacy(ReactDOM2);
const ReactDOM__namespace = /* @__PURE__ */ _interopNamespace(ReactDOM2);
var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
function getDefaultExportFromCjs(x2) {
return x2 && x2.__esModule && Object.prototype.hasOwnProperty.call(x2, "default") ? x2["default"] : x2;
}
function getAugmentedNamespace(n2) {
var f2 = n2.default;
if (typeof f2 == "function") {
var a = function() {
return f2.apply(this, arguments);
};
a.prototype = f2.prototype;
} else
a = {};
Object.defineProperty(a, "__esModule", { value: true });
Object.keys(n2).forEach(function(k2) {
var d2 = Object.getOwnPropertyDescriptor(n2, k2);
Object.defineProperty(a, k2, d2.get ? d2 : {
enumerable: true,
get: function() {
return n2[k2];
}
});
});
return a;
}
var client = {};
var m$3 = ReactDOM__default.default;
{
client.createRoot = m$3.createRoot;
client.hydrateRoot = m$3.hydrateRoot;
}
function _extends$3() {
_extends$3 = Object.assign ? Object.assign.bind() : function(target) {
for (var i2 = 1; i2 < arguments.length; i2++) {
var source = arguments[i2];
for (var key2 in source) {
if (Object.prototype.hasOwnProperty.call(source, key2)) {
target[key2] = source[key2];
}
}
}
return target;
};
return _extends$3.apply(this, arguments);
}
function _typeof$q(obj) {
"@babel/helpers - typeof";
return _typeof$q = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof$q(obj);
}
function _toPrimitive$8(input, hint) {
if (_typeof$q(input) !== "object" || input === null)
return input;
var prim = input[Symbol.toPrimitive];
if (prim !== void 0) {
var res = prim.call(input, hint || "default");
if (_typeof$q(res) !== "object")
return res;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return (hint === "string" ? String : Number)(input);
}
function _toPropertyKey$7(arg) {
var key2 = _toPrimitive$8(arg, "string");
return _typeof$q(key2) === "symbol" ? key2 : String(key2);
}
function _defineProperty$b(obj, key2, value) {
key2 = _toPropertyKey$7(key2);
if (key2 in obj) {
Object.defineProperty(obj, key2, {
value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key2] = value;
}
return obj;
}
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _defineProperties(target, props) {
for (var i2 = 0; i2 < props.length; i2++) {
var descriptor2 = props[i2];
descriptor2.enumerable = descriptor2.enumerable || false;
descriptor2.configurable = true;
if ("value" in descriptor2)
descriptor2.writable = true;
Object.defineProperty(target, _toPropertyKey$7(descriptor2.key), descriptor2);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps)
_defineProperties(Constructor.prototype, protoProps);
if (staticProps)
_defineProperties(Constructor, staticProps);
Object.defineProperty(Constructor, "prototype", {
writable: false
});
return Constructor;
}
function _setPrototypeOf$2(o, p2) {
_setPrototypeOf$2 = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf3(o2, p3) {
o2.__proto__ = p3;
return o2;
};
return _setPrototypeOf$2(o, p2);
}
function _inherits(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function");
}
subClass.prototype = Object.create(superClass && superClass.prototype, {
constructor: {
value: subClass,
writable: true,
configurable: true
}
});
Object.defineProperty(subClass, "prototype", {
writable: false
});
if (superClass)
_setPrototypeOf$2(subClass, superClass);
}
function _getPrototypeOf$1(o) {
_getPrototypeOf$1 = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf2(o2) {
return o2.__proto__ || Object.getPrototypeOf(o2);
};
return _getPrototypeOf$1(o);
}
function _isNativeReflectConstruct$1() {
if (typeof Reflect === "undefined" || !Reflect.construct)
return false;
if (Reflect.construct.sham)
return false;
if (typeof Proxy === "function")
return true;
try {
Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {
}));
return true;
} catch (e2) {
return false;
}
}
function _assertThisInitialized(self2) {
if (self2 === void 0) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return self2;
}
function _possibleConstructorReturn(self2, call2) {
if (call2 && (_typeof$q(call2) === "object" || typeof call2 === "function")) {
return call2;
} else if (call2 !== void 0) {
throw new TypeError("Derived constructors may only return object or undefined");
}
return _assertThisInitialized(self2);
}
function _createSuper(Derived) {
var hasNativeReflectConstruct = _isNativeReflectConstruct$1();
return function _createSuperInternal() {
var Super = _getPrototypeOf$1(Derived), result;
if (hasNativeReflectConstruct) {
var NewTarget = _getPrototypeOf$1(this).constructor;
result = Reflect.construct(Super, arguments, NewTarget);
} else {
result = Super.apply(this, arguments);
}
return _possibleConstructorReturn(this, result);
};
}
var classnames$1 = { exports: {} };
/*!
Copyright (c) 2018 Jed Watson.
Licensed under the MIT License (MIT), see
http://jedwatson.github.io/classnames
*/
(function(module2) {
(function() {
var hasOwn = {}.hasOwnProperty;
function classNames() {
var classes = [];
for (var i2 = 0; i2 < arguments.length; i2++) {
var arg = arguments[i2];
if (!arg)
continue;
var argType = typeof arg;
if (argType === "string" || argType === "number") {
classes.push(arg);
} else if (Array.isArray(arg)) {
if (arg.length) {
var inner = classNames.apply(null, arg);
if (inner) {
classes.push(inner);
}
}
} else if (argType === "object") {
if (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes("[native code]")) {
classes.push(arg.toString());
continue;
}
for (var key2 in arg) {
if (hasOwn.call(arg, key2) && arg[key2]) {
classes.push(key2);
}
}
}
}
return classes.join(" ");
}
if (module2.exports) {
classNames.default = classNames;
module2.exports = classNames;
} else {
window.classNames = classNames;
}
})();
})(classnames$1);
const classnames = classnames$1.exports;
var reactIs = { exports: {} };
var reactIs_production_min = {};
/** @license React v16.13.1
* react-is.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
var b = "function" === typeof Symbol && Symbol.for, c = b ? Symbol.for("react.element") : 60103, d = b ? Symbol.for("react.portal") : 60106, e$2 = b ? Symbol.for("react.fragment") : 60107, f$1 = b ? Symbol.for("react.strict_mode") : 60108, g = b ? Symbol.for("react.profiler") : 60114, h$2 = b ? Symbol.for("react.provider") : 60109, k$3 = b ? Symbol.for("react.context") : 60110, l$2 = b ? Symbol.for("react.async_mode") : 60111, m$2 = b ? Symbol.for("react.concurrent_mode") : 60111, n$4 = b ? Symbol.for("react.forward_ref") : 60112, p$3 = b ? Symbol.for("react.suspense") : 60113, q$3 = b ? Symbol.for("react.suspense_list") : 60120, r$3 = b ? Symbol.for("react.memo") : 60115, t$3 = b ? Symbol.for("react.lazy") : 60116, v$1 = b ? Symbol.for("react.block") : 60121, w$1 = b ? Symbol.for("react.fundamental") : 60117, x = b ? Symbol.for("react.responder") : 60118, y = b ? Symbol.for("react.scope") : 60119;
function z(a) {
if ("object" === typeof a && null !== a) {
var u2 = a.$$typeof;
switch (u2) {
case c:
switch (a = a.type, a) {
case l$2:
case m$2:
case e$2:
case g:
case f$1:
case p$3:
return a;
default:
switch (a = a && a.$$typeof, a) {
case k$3:
case n$4:
case t$3:
case r$3:
case h$2:
return a;
default:
return u2;
}
}
case d:
return u2;
}
}
}
function A(a) {
return z(a) === m$2;
}
reactIs_production_min.AsyncMode = l$2;
reactIs_production_min.ConcurrentMode = m$2;
reactIs_production_min.ContextConsumer = k$3;
reactIs_production_min.ContextProvider = h$2;
reactIs_production_min.Element = c;
reactIs_production_min.ForwardRef = n$4;
reactIs_production_min.Fragment = e$2;
reactIs_production_min.Lazy = t$3;
reactIs_production_min.Memo = r$3;
reactIs_production_min.Portal = d;
reactIs_production_min.Profiler = g;
reactIs_production_min.StrictMode = f$1;
reactIs_production_min.Suspense = p$3;
reactIs_production_min.isAsyncMode = function(a) {
return A(a) || z(a) === l$2;
};
reactIs_production_min.isConcurrentMode = A;
reactIs_production_min.isContextConsumer = function(a) {
return z(a) === k$3;
};
reactIs_production_min.isContextProvider = function(a) {
return z(a) === h$2;
};
reactIs_production_min.isElement = function(a) {
return "object" === typeof a && null !== a && a.$$typeof === c;
};
reactIs_production_min.isForwardRef = function(a) {
return z(a) === n$4;
};
reactIs_production_min.isFragment = function(a) {
return z(a) === e$2;
};
reactIs_production_min.isLazy = function(a) {
return z(a) === t$3;
};
reactIs_production_min.isMemo = function(a) {
return z(a) === r$3;
};
reactIs_production_min.isPortal = function(a) {
return z(a) === d;
};
reactIs_production_min.isProfiler = function(a) {
return z(a) === g;
};
reactIs_production_min.isStrictMode = function(a) {
return z(a) === f$1;
};
reactIs_production_min.isSuspense = function(a) {
return z(a) === p$3;
};
reactIs_production_min.isValidElementType = function(a) {
return "string" === typeof a || "function" === typeof a || a === e$2 || a === m$2 || a === g || a === f$1 || a === p$3 || a === q$3 || "object" === typeof a && null !== a && (a.$$typeof === t$3 || a.$$typeof === r$3 || a.$$typeof === h$2 || a.$$typeof === k$3 || a.$$typeof === n$4 || a.$$typeof === w$1 || a.$$typeof === x || a.$$typeof === y || a.$$typeof === v$1);
};
reactIs_production_min.typeOf = z;
(function(module2) {
{
module2.exports = reactIs_production_min;
}
})(reactIs);
function toArray$9(children) {
var option = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var ret = [];
React__default.default.Children.forEach(children, function(child) {
if ((child === void 0 || child === null) && !option.keepEmpty) {
return;
}
if (Array.isArray(child)) {
ret = ret.concat(toArray$9(child));
} else if (reactIs.exports.isFragment(child) && child.props) {
ret = ret.concat(toArray$9(child.props.children, option));
} else {
ret.push(child);
}
});
return ret;
}
var warned = {};
var preMessage = function preMessage2(fn) {
};
function warning$3(valid, message) {
}
function note(valid, message) {
}
function resetWarned() {
warned = {};
}
function call(method2, valid, message) {
if (!valid && !warned[message]) {
method2(false, message);
warned[message] = true;
}
}
function warningOnce(valid, message) {
call(warning$3, valid, message);
}
function noteOnce(valid, message) {
call(note, valid, message);
}
warningOnce.preMessage = preMessage;
warningOnce.resetWarned = resetWarned;
warningOnce.noteOnce = noteOnce;
function ownKeys$3(object2, enumerableOnly) {
var keys2 = Object.keys(object2);
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(object2);
enumerableOnly && (symbols = symbols.filter(function(sym) {
return Object.getOwnPropertyDescriptor(object2, sym).enumerable;
})), keys2.push.apply(keys2, symbols);
}
return keys2;
}
function _objectSpread2$a(target) {
for (var i2 = 1; i2 < arguments.length; i2++) {
var source = null != arguments[i2] ? arguments[i2] : {};
i2 % 2 ? ownKeys$3(Object(source), true).forEach(function(key2) {
_defineProperty$b(target, key2, source[key2]);
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$3(Object(source)).forEach(function(key2) {
Object.defineProperty(target, key2, Object.getOwnPropertyDescriptor(source, key2));
});
}
return target;
}
function useMemo(getValue2, condition, shouldUpdate) {
var cacheRef = React__namespace.useRef({});
if (!("value" in cacheRef.current) || shouldUpdate(cacheRef.current.condition, condition)) {
cacheRef.current.value = getValue2();
cacheRef.current.condition = condition;
}
return cacheRef.current.value;
}
function fillRef(ref, node) {
if (typeof ref === "function") {
ref(node);
} else if (_typeof$q(ref) === "object" && ref && "current" in ref) {
ref.current = node;
}
}
function composeRef() {
for (var _len = arguments.length, refs = new Array(_len), _key = 0; _key < _len; _key++) {
refs[_key] = arguments[_key];
}
var refList = refs.filter(function(ref) {
return ref;
});
if (refList.length <= 1) {
return refList[0];
}
return function(node) {
refs.forEach(function(ref) {
fillRef(ref, node);
});
};
}
function useComposeRef() {
for (var _len2 = arguments.length, refs = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
refs[_key2] = arguments[_key2];
}
return useMemo(function() {
return composeRef.apply(void 0, refs);
}, refs, function(prev, next) {
return prev.length === next.length && prev.every(function(ref, i2) {
return ref === next[i2];
});
});
}
function supportRef(nodeOrComponent) {
var _type$prototype, _nodeOrComponent$prot;
var type2 = reactIs.exports.isMemo(nodeOrComponent) ? nodeOrComponent.type.type : nodeOrComponent.type;
if (typeof type2 === "function" && !((_type$prototype = type2.prototype) !== null && _type$prototype !== void 0 && _type$prototype.render)) {
return false;
}
if (typeof nodeOrComponent === "function" && !((_nodeOrComponent$prot = nodeOrComponent.prototype) !== null && _nodeOrComponent$prot !== void 0 && _nodeOrComponent$prot.render)) {
return false;
}
return true;
}
function isDOM(node) {
return node instanceof HTMLElement || node instanceof SVGElement;
}
function findDOMNode(node) {
if (isDOM(node)) {
return node;
}
if (node instanceof React__default.default.Component) {
return ReactDOM__default.default.findDOMNode(node);
}
return null;
}
var MapShim = function() {
if (typeof Map !== "undefined") {
return Map;
}
function getIndex2(arr, key2) {
var result = -1;
arr.some(function(entry, index2) {
if (entry[0] === key2) {
result = index2;
return true;
}
return false;
});
return result;
}
return function() {
function class_1() {
this.__entries__ = [];
}
Object.defineProperty(class_1.prototype, "size", {
get: function() {
return this.__entries__.length;
},
enumerable: true,
configurable: true
});
class_1.prototype.get = function(key2) {
var index2 = getIndex2(this.__entries__, key2);
var entry = this.__entries__[index2];
return entry && entry[1];
};
class_1.prototype.set = function(key2, value) {
var index2 = getIndex2(this.__entries__, key2);
if (~index2) {
this.__entries__[index2][1] = value;
} else {
this.__entries__.push([key2, value]);
}
};
class_1.prototype.delete = function(key2) {
var entries = this.__entries__;
var index2 = getIndex2(entries, key2);
if (~index2) {
entries.splice(index2, 1);
}
};
class_1.prototype.has = function(key2) {
return !!~getIndex2(this.__entries__, key2);
};
class_1.prototype.clear = function() {
this.__entries__.splice(0);
};
class_1.prototype.forEach = function(callback, ctx2) {
if (ctx2 === void 0) {
ctx2 = null;
}
for (var _i = 0, _a = this.__entries__; _i < _a.length; _i++) {
var entry = _a[_i];
callback.call(ctx2, entry[1], entry[0]);
}
};
return class_1;
}();
}();
var isBrowser = typeof window !== "undefined" && typeof document !== "undefined" && window.document === document;
var global$1$1 = function() {
if (typeof global !== "undefined" && global.Math === Math) {
return global;
}
if (typeof self !== "undefined" && self.Math === Math) {
return self;
}
if (typeof window !== "undefined" && window.Math === Math) {
return window;
}
return Function("return this")();
}();
var requestAnimationFrame$1 = function() {
if (typeof requestAnimationFrame === "function") {
return requestAnimationFrame.bind(global$1$1);
}
return function(callback) {
return setTimeout(function() {
return callback(Date.now());
}, 1e3 / 60);
};
}();
var trailingTimeout = 2;
function throttle(callback, delay) {
var leadingCall = false, trailingCall = false, lastCallTime = 0;
function resolvePending() {
if (leadingCall) {
leadingCall = false;
callback();
}
if (trailingCall) {
proxy();
}
}
function timeoutCallback() {
requestAnimationFrame$1(resolvePending);
}
function proxy() {
var timeStamp = Date.now();
if (leadingCall) {
if (timeStamp - lastCallTime < trailingTimeout) {
return;
}
trailingCall = true;
} else {
leadingCall = true;
trailingCall = false;
setTimeout(timeoutCallback, delay);
}
lastCallTime = timeStamp;
}
return proxy;
}
var REFRESH_DELAY = 20;
var transitionKeys = ["top", "right", "bottom", "left", "width", "height", "size", "weight"];
var mutationObserverSupported = typeof MutationObserver !== "undefined";
var ResizeObserverController = function() {
function ResizeObserverController2() {
this.connected_ = false;
this.mutationEventsAdded_ = false;
this.mutationsObserver_ = null;
this.observers_ = [];
this.onTransitionEnd_ = this.onTransitionEnd_.bind(this);
this.refresh = throttle(this.refresh.bind(this), REFRESH_DELAY);
}
ResizeObserverController2.prototype.addObserver = function(observer) {
if (!~this.observers_.indexOf(observer)) {
this.observers_.push(observer);
}
if (!this.connected_) {
this.connect_();
}
};
ResizeObserverController2.prototype.removeObserver = function(observer) {
var observers2 = this.observers_;
var index2 = observers2.indexOf(observer);
if (~index2) {
observers2.splice(index2, 1);
}
if (!observers2.length && this.connected_) {
this.disconnect_();
}
};
ResizeObserverController2.prototype.refresh = function() {
var changesDetected = this.updateObservers_();
if (changesDetected) {
this.refresh();
}
};
ResizeObserverController2.prototype.updateObservers_ = function() {
var activeObservers = this.observers_.filter(function(observer) {
return observer.gatherActive(), observer.hasActive();
});
activeObservers.forEach(function(observer) {
return observer.broadcastActive();
});
return activeObservers.length > 0;
};
ResizeObserverController2.prototype.connect_ = function() {
if (!isBrowser || this.connected_) {
return;
}
document.addEventListener("transitionend", this.onTransitionEnd_);
window.addEventListener("resize", this.refresh);
if (mutationObserverSupported) {
this.mutationsObserver_ = new MutationObserver(this.refresh);
this.mutationsObserver_.observe(document, {
attributes: true,
childList: true,
characterData: true,
subtree: true
});
} else {
document.addEventListener("DOMSubtreeModified", this.refresh);
this.mutationEventsAdded_ = true;
}
this.connected_ = true;
};
ResizeObserverController2.prototype.disconnect_ = function() {
if (!isBrowser || !this.connected_) {
return;
}
document.removeEventListener("transitionend", this.onTransitionEnd_);
window.removeEventListener("resize", this.refresh);
if (this.mutationsObserver_) {
this.mutationsObserver_.disconnect();
}
if (this.mutationEventsAdded_) {
document.removeEventListener("DOMSubtreeModified", this.refresh);
}
this.mutationsObserver_ = null;
this.mutationEventsAdded_ = false;
this.connected_ = false;
};
ResizeObserverController2.prototype.onTransitionEnd_ = function(_a) {
var _b = _a.propertyName, propertyName = _b === void 0 ? "" : _b;
var isReflowProperty = transitionKeys.some(function(key2) {
return !!~propertyName.indexOf(key2);
});
if (isReflowProperty) {
this.refresh();
}
};
ResizeObserverController2.getInstance = function() {
if (!this.instance_) {
this.instance_ = new ResizeObserverController2();
}
return this.instance_;
};
ResizeObserverController2.instance_ = null;
return ResizeObserverController2;
}();
var defineConfigurable = function(target, props) {
for (var _i = 0, _a = Object.keys(props); _i < _a.length; _i++) {
var key2 = _a[_i];
Object.defineProperty(target, key2, {
value: props[key2],
enumerable: false,
writable: false,
configurable: true
});
}
return target;
};
var getWindowOf = function(target) {
var ownerGlobal = target && target.ownerDocument && target.ownerDocument.defaultView;
return ownerGlobal || global$1$1;
};
var emptyRect = createRectInit(0, 0, 0, 0);
function toFloat(value) {
return parseFloat(value) || 0;
}
function getBordersSize(styles) {
var positions = [];
for (var _i = 1; _i < arguments.length; _i++) {
positions[_i - 1] = arguments[_i];
}
return positions.reduce(function(size, position) {
var value = styles["border-" + position + "-width"];
return size + toFloat(value);
}, 0);
}
function getPaddings(styles) {
var positions = ["top", "right", "bottom", "left"];
var paddings = {};
for (var _i = 0, positions_1 = positions; _i < positions_1.length; _i++) {
var position = positions_1[_i];
var value = styles["padding-" + position];
paddings[position] = toFloat(value);
}
return paddings;
}
function getSVGContentRect(target) {
var bbox = target.getBBox();
return createRectInit(0, 0, bbox.width, bbox.height);
}
function getHTMLElementContentRect(target) {
var clientWidth = target.clientWidth, clientHeight = target.clientHeight;
if (!clientWidth && !clientHeight) {
return emptyRect;
}
var styles = getWindowOf(target).getComputedStyle(target);
var paddings = getPaddings(styles);
var horizPad = paddings.left + paddings.right;
var vertPad = paddings.top + paddings.bottom;
var width = toFloat(styles.width), height = toFloat(styles.height);
if (styles.boxSizing === "border-box") {
if (Math.round(width + horizPad) !== clientWidth) {
width -= getBordersSize(styles, "left", "right") + horizPad;
}
if (Math.round(height + vertPad) !== clientHeight) {
height -= getBordersSize(styles, "top", "bottom") + vertPad;
}
}
if (!isDocumentElement(target)) {
var vertScrollbar = Math.round(width + horizPad) - clientWidth;
var horizScrollbar = Math.round(height + vertPad) - clientHeight;
if (Math.abs(vertScrollbar) !== 1) {
width -= vertScrollbar;
}
if (Math.abs(horizScrollbar) !== 1) {
height -= horizScrollbar;
}
}
return createRectInit(paddings.left, paddings.top, width, height);
}
var isSVGGraphicsElement = function() {
if (typeof SVGGraphicsElement !== "undefined") {
return function(target) {
return target instanceof getWindowOf(target).SVGGraphicsElement;
};
}
return function(target) {
return target instanceof getWindowOf(target).SVGElement && typeof target.getBBox === "function";
};
}();
function isDocumentElement(target) {
return target === getWindowOf(target).document.documentElement;
}
function getContentRect(target) {
if (!isBrowser) {
return emptyRect;
}
if (isSVGGraphicsElement(target)) {
return getSVGContentRect(target);
}
return getHTMLElementContentRect(target);
}
function createReadOnlyRect(_a) {
var x2 = _a.x, y2 = _a.y, width = _a.width, height = _a.height;
var Constr = typeof DOMRectReadOnly !== "undefined" ? DOMRectReadOnly : Object;
var rect = Object.create(Constr.prototype);
defineConfigurable(rect, {
x: x2,
y: y2,
width,
height,
top: y2,
right: x2 + width,
bottom: height + y2,
left: x2
});
return rect;
}
function createRectInit(x2, y2, width, height) {
return { x: x2, y: y2, width, height };
}
var ResizeObservation = function() {
function ResizeObservation2(target) {
this.broadcastWidth = 0;
this.broadcastHeight = 0;
this.contentRect_ = createRectInit(0, 0, 0, 0);
this.target = target;
}
ResizeObservation2.prototype.isActive = function() {
var rect = getContentRect(this.target);
this.contentRect_ = rect;
return rect.width !== this.broadcastWidth || rect.height !== this.broadcastHeight;
};
ResizeObservation2.prototype.broadcastRect = function() {
var rect = this.contentRect_;
this.broadcastWidth = rect.width;
this.broadcastHeight = rect.height;
return rect;
};
return ResizeObservation2;
}();
var ResizeObserverEntry = function() {
function ResizeObserverEntry2(target, rectInit) {
var contentRect = createReadOnlyRect(rectInit);
defineConfigurable(this, { target, contentRect });
}
return ResizeObserverEntry2;
}();
var ResizeObserverSPI = function() {
function ResizeObserverSPI2(callback, controller, callbackCtx) {
this.activeObservations_ = [];
this.observations_ = new MapShim();
if (typeof callback !== "function") {
throw new TypeError("The callback provided as parameter 1 is not a function.");
}
this.callback_ = callback;
this.controller_ = controller;
this.callbackCtx_ = callbackCtx;
}
ResizeObserverSPI2.prototype.observe = function(target) {
if (!arguments.length) {
throw new TypeError("1 argument required, but only 0 present.");
}
if (typeof Element === "undefined" || !(Element instanceof Object)) {
return;
}
if (!(target instanceof getWindowOf(target).Element)) {
throw new TypeError('parameter 1 is not of type "Element".');
}
var observations = this.observations_;
if (observations.has(target)) {
return;
}
observations.set(target, new ResizeObservation(target));
this.controller_.addObserver(this);
this.controller_.refresh();
};
ResizeObserverSPI2.prototype.unobserve = function(target) {
if (!arguments.length) {
throw new TypeError("1 argument required, but only 0 present.");
}
if (typeof Element === "undefined" || !(Element instanceof Object)) {
return;
}
if (!(target instanceof getWindowOf(target).Element)) {
throw new TypeError('parameter 1 is not of type "Element".');
}
var observations = this.observations_;
if (!observations.has(target)) {
return;
}
observations.delete(target);
if (!observations.size) {
this.controller_.removeObserver(this);
}
};
ResizeObserverSPI2.prototype.disconnect = function() {
this.clearActive();
this.observations_.clear();
this.controller_.removeObserver(this);
};
ResizeObserverSPI2.prototype.gatherActive = function() {
var _this2 = this;
this.clearActive();
this.observations_.forEach(function(observation) {
if (observation.isActive()) {
_this2.activeObservations_.push(observation);
}
});
};
ResizeObserverSPI2.prototype.broadcastActive = function() {
if (!this.hasActive()) {
return;
}
var ctx2 = this.callbackCtx_;
var entries = this.activeObservations_.map(function(observation) {
return new ResizeObserverEntry(observation.target, observation.broadcastRect());
});
this.callback_.call(ctx2, entries, ctx2);
this.clearActive();
};
ResizeObserverSPI2.prototype.clearActive = function() {
this.activeObservations_.splice(0);
};
ResizeObserverSPI2.prototype.hasActive = function() {
return this.activeObservations_.length > 0;
};
return ResizeObserverSPI2;
}();
var observers = typeof WeakMap !== "undefined" ? /* @__PURE__ */ new WeakMap() : new MapShim();
var ResizeObserver$1 = function() {
function ResizeObserver2(callback) {
if (!(this instanceof ResizeObserver2)) {
throw new TypeError("Cannot call a class as a function.");
}
if (!arguments.length) {
throw new TypeError("1 argument required, but only 0 present.");
}
var controller = ResizeObserverController.getInstance();
var observer = new ResizeObserverSPI(callback, controller, this);
observers.set(this, observer);
}
return ResizeObserver2;
}();
[
"observe",
"unobserve",
"disconnect"
].forEach(function(method2) {
ResizeObserver$1.prototype[method2] = function() {
var _a;
return (_a = observers.get(this))[method2].apply(_a, arguments);
};
});
var index$Z = function() {
if (typeof global$1$1.ResizeObserver !== "undefined") {
return global$1$1.ResizeObserver;
}
return ResizeObserver$1;
}();
var elementListeners = /* @__PURE__ */ new Map();
function onResize(entities) {
entities.forEach(function(entity) {
var _elementListeners$get;
var target = entity.target;
(_elementListeners$get = elementListeners.get(target)) === null || _elementListeners$get === void 0 ? void 0 : _elementListeners$get.forEach(function(listener) {
return listener(target);
});
});
}
var resizeObserver = new index$Z(onResize);
function observe(element, callback) {
if (!elementListeners.has(element)) {
elementListeners.set(element, /* @__PURE__ */ new Set());
resizeObserver.observe(element);
}
elementListeners.get(element).add(callback);
}
function unobserve(element, callback) {
if (elementListeners.has(element)) {
elementListeners.get(element).delete(callback);
if (!elementListeners.get(element).size) {
resizeObserver.unobserve(element);
elementListeners.delete(element);
}
}
}
var DomWrapper$1 = /* @__PURE__ */ function(_React$Component) {
_inherits(DomWrapper2, _React$Component);
var _super = _createSuper(DomWrapper2);
function DomWrapper2() {
_classCallCheck(this, DomWrapper2);
return _super.apply(this, arguments);
}
_createClass(DomWrapper2, [{
key: "render",
value: function render2() {
return this.props.children;
}
}]);
return DomWrapper2;
}(React__namespace.Component);
var jsxRuntime = { exports: {} };
var reactJsxRuntime_production_min = {};
/**
* @license React
* react-jsx-runtime.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
var f = React__default.default, k$2 = Symbol.for("react.element"), l$1 = Symbol.for("react.fragment"), m$1 = Object.prototype.hasOwnProperty, n$3 = f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, p$2 = { key: true, ref: true, __self: true, __source: true };
function q$2(c2, a, g2) {
var b2, d2 = {}, e2 = null, h2 = null;
void 0 !== g2 && (e2 = "" + g2);
void 0 !== a.key && (e2 = "" + a.key);
void 0 !== a.ref && (h2 = a.ref);
for (b2 in a)
m$1.call(a, b2) && !p$2.hasOwnProperty(b2) && (d2[b2] = a[b2]);
if (c2 && c2.defaultProps)
for (b2 in a = c2.defaultProps, a)
void 0 === d2[b2] && (d2[b2] = a[b2]);
return { $$typeof: k$2, type: c2, key: e2, ref: h2, props: d2, _owner: n$3.current };
}
reactJsxRuntime_production_min.Fragment = l$1;
reactJsxRuntime_production_min.jsx = q$2;
reactJsxRuntime_production_min.jsxs = q$2;
(function(module2) {
{
module2.exports = reactJsxRuntime_production_min;
}
})(jsxRuntime);
const Fragment = jsxRuntime.exports.Fragment;
const jsx = jsxRuntime.exports.jsx;
const jsxs = jsxRuntime.exports.jsxs;
var CollectionContext = /* @__PURE__ */ React__namespace.createContext(null);
function Collection$1(_ref) {
var children = _ref.children, onBatchResize = _ref.onBatchResize;
var resizeIdRef = React__namespace.useRef(0);
var resizeInfosRef = React__namespace.useRef([]);
var onCollectionResize = React__namespace.useContext(CollectionContext);
var onResize2 = React__namespace.useCallback(function(size, element, data) {
resizeIdRef.current += 1;
var currentId = resizeIdRef.current;
resizeInfosRef.current.push({
size,
element,
data
});
Promise.resolve().then(function() {
if (currentId === resizeIdRef.current) {
onBatchResize === null || onBatchResize === void 0 ? void 0 : onBatchResize(resizeInfosRef.current);
resizeInfosRef.current = [];
}
});
onCollectionResize === null || onCollectionResize === void 0 ? void 0 : onCollectionResize(size, element, data);
}, [onBatchResize, onCollectionResize]);
return /* @__PURE__ */ jsx(CollectionContext.Provider, {
value: onResize2,
children
});
}
function SingleObserver(props, ref) {
var children = props.children, disabled = props.disabled;
var elementRef = React__namespace.useRef(null);
var wrapperRef = React__namespace.useRef(null);
var onCollectionResize = React__namespace.useContext(CollectionContext);
var isRenderProps = typeof children === "function";
var mergedChildren = isRenderProps ? children(elementRef) : children;
var sizeRef = React__namespace.useRef({
width: -1,
height: -1,
offsetWidth: -1,
offsetHeight: -1
});
var canRef = !isRenderProps && /* @__PURE__ */ React__namespace.isValidElement(mergedChildren) && supportRef(mergedChildren);
var originRef = canRef ? mergedChildren.ref : null;
var mergedRef = React__namespace.useMemo(function() {
return composeRef(originRef, elementRef);
}, [originRef, elementRef]);
var getDom = function getDom2() {
return findDOMNode(elementRef.current) || findDOMNode(wrapperRef.current);
};
React__namespace.useImperativeHandle(ref, function() {
return getDom();
});
var propsRef = React__namespace.useRef(props);
propsRef.current = props;
var onInternalResize = React__namespace.useCallback(function(target) {
var _propsRef$current = propsRef.current, onResize2 = _propsRef$current.onResize, data = _propsRef$current.data;
var _target$getBoundingCl = target.getBoundingClientRect(), width = _target$getBoundingCl.width, height = _target$getBoundingCl.height;
var offsetWidth = target.offsetWidth, offsetHeight = target.offsetHeight;
var fixedWidth = Math.floor(width);
var fixedHeight = Math.floor(height);
if (sizeRef.current.width !== fixedWidth || sizeRef.current.height !== fixedHeight || sizeRef.current.offsetWidth !== offsetWidth || sizeRef.current.offsetHeight !== offsetHeight) {
var size = {
width: fixedWidth,
height: fixedHeight,
offsetWidth,
offsetHeight
};
sizeRef.current = size;
var mergedOffsetWidth = offsetWidth === Math.round(width) ? width : offsetWidth;
var mergedOffsetHeight = offsetHeight === Math.round(height) ? height : offsetHeight;
var sizeInfo = _objectSpread2$a(_objectSpread2$a({}, size), {}, {
offsetWidth: mergedOffsetWidth,
offsetHeight: mergedOffsetHeight
});
onCollectionResize === null || onCollectionResize === void 0 ? void 0 : onCollectionResize(sizeInfo, target, data);
if (onResize2) {
Promise.resolve().then(function() {
onResize2(sizeInfo, target);
});
}
}
}, []);
React__namespace.useEffect(function() {
var currentElement = getDom();
if (currentElement && !disabled) {
observe(currentElement, onInternalResize);
}
return function() {
return unobserve(currentElement, onInternalResize);
};
}, [elementRef.current, disabled]);
return /* @__PURE__ */ jsx(DomWrapper$1, {
ref: wrapperRef,
children: canRef ? /* @__PURE__ */ React__namespace.cloneElement(mergedChildren, {
ref: mergedRef
}) : mergedChildren
});
}
var RefSingleObserver = /* @__PURE__ */ React__namespace.forwardRef(SingleObserver);
var INTERNAL_PREFIX_KEY = "rc-observer-key";
function ResizeObserver(props, ref) {
var children = props.children;
var childNodes = typeof children === "function" ? [children] : toArray$9(children);
return childNodes.map(function(child, index2) {
var key2 = (child === null || child === void 0 ? void 0 : child.key) || "".concat(INTERNAL_PREFIX_KEY, "-").concat(index2);
return /* @__PURE__ */ React$a.createElement(RefSingleObserver, {
...props,
key: key2,
ref: index2 === 0 ? ref : void 0
}, child);
});
}
var RefResizeObserver = /* @__PURE__ */ React__namespace.forwardRef(ResizeObserver);
RefResizeObserver.Collection = Collection$1;
function omit(obj, fields) {
var clone = _objectSpread2$a({}, obj);
if (Array.isArray(fields)) {
fields.forEach(function(key2) {
delete clone[key2];
});
}
return clone;
}
var IconContext = /* @__PURE__ */ React$a.createContext({});
const IconContext$1 = IconContext;
function _objectWithoutPropertiesLoose$1(source, excluded) {
if (source == null)
return {};
var target = {};
var sourceKeys = Object.keys(source);
var key2, i2;
for (i2 = 0; i2 < sourceKeys.length; i2++) {
key2 = sourceKeys[i2];
if (excluded.indexOf(key2) >= 0)
continue;
target[key2] = source[key2];
}
return target;
}
function _objectWithoutProperties$1(source, excluded) {
if (source == null)
return {};
var target = _objectWithoutPropertiesLoose$1(source, excluded);
var key2, i2;
if (Object.getOwnPropertySymbols) {
var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
for (i2 = 0; i2 < sourceSymbolKeys.length; i2++) {
key2 = sourceSymbolKeys[i2];
if (excluded.indexOf(key2) >= 0)
continue;
if (!Object.prototype.propertyIsEnumerable.call(source, key2))
continue;
target[key2] = source[key2];
}
}
return target;
}
function _arrayLikeToArray$l(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _arrayWithoutHoles$c(arr) {
if (Array.isArray(arr))
return _arrayLikeToArray$l(arr);
}
function _iterableToArray$c(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
return Array.from(iter);
}
function _unsupportedIterableToArray$l(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$l(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$l(o, minLen);
}
function _nonIterableSpread$c() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _toConsumableArray$c(arr) {
return _arrayWithoutHoles$c(arr) || _iterableToArray$c(arr) || _unsupportedIterableToArray$l(arr) || _nonIterableSpread$c();
}
var HOOK_MARK = "RC_FORM_INTERNAL_HOOKS";
var warningFunc = function warningFunc2() {
warningOnce(false, "Can not find FormContext. Please make sure you wrap Field under Form.");
};
var Context$2 = /* @__PURE__ */ React__namespace.createContext({
getFieldValue: warningFunc,
getFieldsValue: warningFunc,
getFieldError: warningFunc,
getFieldWarning: warningFunc,
getFieldsError: warningFunc,
isFieldsTouched: warningFunc,
isFieldTouched: warningFunc,
isFieldValidating: warningFunc,
isFieldsValidating: warningFunc,
resetFields: warningFunc,
setFields: warningFunc,
setFieldValue: warningFunc,
setFieldsValue: warningFunc,
validateFields: warningFunc,
submit: warningFunc,
getInternalHooks: function getInternalHooks() {
warningFunc();
return {
dispatch: warningFunc,
initEntityValue: warningFunc,
registerField: warningFunc,
useSubscribe: warningFunc,
setInitialValues: warningFunc,
destroyForm: warningFunc,
setCallbacks: warningFunc,
registerWatch: warningFunc,
getFields: warningFunc,
setValidateMessages: warningFunc,
setPreserve: warningFunc,
getInitialValue: warningFunc
};
}
});
function toArray$8(value) {
if (value === void 0 || value === null) {
return [];
}
return Array.isArray(value) ? value : [value];
}
function _regeneratorRuntime$3() {
_regeneratorRuntime$3 = function _regeneratorRuntime2() {
return exports2;
};
var exports2 = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty2 = Object.defineProperty || function(obj, key2, desc) {
obj[key2] = desc.value;
}, $Symbol2 = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol2.iterator || "@@iterator", asyncIteratorSymbol = $Symbol2.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol2.toStringTag || "@@toStringTag";
function define(obj, key2, value) {
return Object.defineProperty(obj, key2, {
value,
enumerable: true,
configurable: true,
writable: true
}), obj[key2];
}
try {
define({}, "");
} catch (err) {
define = function define2(obj, key2, value) {
return obj[key2] = value;
};
}
function wrap2(innerFn, outerFn, self2, tryLocsList) {
var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context2 = new Context2(tryLocsList || []);
return defineProperty2(generator, "_invoke", {
value: makeInvokeMethod(innerFn, self2, context2)
}), generator;
}
function tryCatch(fn, obj, arg) {
try {
return {
type: "normal",
arg: fn.call(obj, arg)
};
} catch (err) {
return {
type: "throw",
arg: err
};
}
}
exports2.wrap = wrap2;
var ContinueSentinel = {};
function Generator() {
}
function GeneratorFunction() {
}
function GeneratorFunctionPrototype() {
}
var IteratorPrototype2 = {};
define(IteratorPrototype2, iteratorSymbol, function() {
return this;
});
var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([])));
NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype2 = NativeIteratorPrototype);
var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype2);
function defineIteratorMethods(prototype2) {
["next", "throw", "return"].forEach(function(method2) {
define(prototype2, method2, function(arg) {
return this._invoke(method2, arg);
});
});
}
function AsyncIterator(generator, PromiseImpl) {
function invoke(method2, arg, resolve, reject) {
var record = tryCatch(generator[method2], generator, arg);
if ("throw" !== record.type) {
var result = record.arg, value = result.value;
return value && "object" == _typeof$q(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function(value2) {
invoke("next", value2, resolve, reject);
}, function(err) {
invoke("throw", err, resolve, reject);
}) : PromiseImpl.resolve(value).then(function(unwrapped) {
result.value = unwrapped, resolve(result);
}, function(error) {
return invoke("throw", error, resolve, reject);
});
}
reject(record.arg);
}
var previousPromise;
defineProperty2(this, "_invoke", {
value: function value(method2, arg) {
function callInvokeWithMethodAndArg() {
return new PromiseImpl(function(resolve, reject) {
invoke(method2, arg, resolve, reject);
});
}
return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
}
});
}
function makeInvokeMethod(innerFn, self2, context2) {
var state = "suspendedStart";
return function(method2, arg) {
if ("executing" === state)
throw new Error("Generator is already running");
if ("completed" === state) {
if ("throw" === method2)
throw arg;
return doneResult();
}
for (context2.method = method2, context2.arg = arg; ; ) {
var delegate = context2.delegate;
if (delegate) {
var delegateResult = maybeInvokeDelegate(delegate, context2);
if (delegateResult) {
if (delegateResult === ContinueSentinel)
continue;
return delegateResult;
}
}
if ("next" === context2.method)
context2.sent = context2._sent = context2.arg;
else if ("throw" === context2.method) {
if ("suspendedStart" === state)
throw state = "completed", context2.arg;
context2.dispatchException(context2.arg);
} else
"return" === context2.method && context2.abrupt("return", context2.arg);
state = "executing";
var record = tryCatch(innerFn, self2, context2);
if ("normal" === record.type) {
if (state = context2.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel)
continue;
return {
value: record.arg,
done: context2.done
};
}
"throw" === record.type && (state = "completed", context2.method = "throw", context2.arg = record.arg);
}
};
}
function maybeInvokeDelegate(delegate, context2) {
var methodName = context2.method, method2 = delegate.iterator[methodName];
if (void 0 === method2)
return context2.delegate = null, "throw" === methodName && delegate.iterator["return"] && (context2.method = "return", context2.arg = void 0, maybeInvokeDelegate(delegate, context2), "throw" === context2.method) || "return" !== methodName && (context2.method = "throw", context2.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel;
var record = tryCatch(method2, delegate.iterator, context2.arg);
if ("throw" === record.type)
return context2.method = "throw", context2.arg = record.arg, context2.delegate = null, ContinueSentinel;
var info = record.arg;
return info ? info.done ? (context2[delegate.resultName] = info.value, context2.next = delegate.nextLoc, "return" !== context2.method && (context2.method = "next", context2.arg = void 0), context2.delegate = null, ContinueSentinel) : info : (context2.method = "throw", context2.arg = new TypeError("iterator result is not an object"), context2.delegate = null, ContinueSentinel);
}
function pushTryEntry(locs) {
var entry = {
tryLoc: locs[0]
};
1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry);
}
function resetTryEntry(entry) {
var record = entry.completion || {};
record.type = "normal", delete record.arg, entry.completion = record;
}
function Context2(tryLocsList) {
this.tryEntries = [{
tryLoc: "root"
}], tryLocsList.forEach(pushTryEntry, this), this.reset(true);
}
function values(iterable) {
if (iterable) {
var iteratorMethod = iterable[iteratorSymbol];
if (iteratorMethod)
return iteratorMethod.call(iterable);
if ("function" == typeof iterable.next)
return iterable;
if (!isNaN(iterable.length)) {
var i2 = -1, next = function next2() {
for (; ++i2 < iterable.length; )
if (hasOwn.call(iterable, i2))
return next2.value = iterable[i2], next2.done = false, next2;
return next2.value = void 0, next2.done = true, next2;
};
return next.next = next;
}
}
return {
next: doneResult
};
}
function doneResult() {
return {
value: void 0,
done: true
};
}
return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty2(Gp, "constructor", {
value: GeneratorFunctionPrototype,
configurable: true
}), defineProperty2(GeneratorFunctionPrototype, "constructor", {
value: GeneratorFunction,
configurable: true
}), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports2.isGeneratorFunction = function(genFun) {
var ctor = "function" == typeof genFun && genFun.constructor;
return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name));
}, exports2.mark = function(genFun) {
return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun;
}, exports2.awrap = function(arg) {
return {
__await: arg
};
}, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function() {
return this;
}), exports2.AsyncIterator = AsyncIterator, exports2.async = function(innerFn, outerFn, self2, tryLocsList, PromiseImpl) {
void 0 === PromiseImpl && (PromiseImpl = Promise);
var iter = new AsyncIterator(wrap2(innerFn, outerFn, self2, tryLocsList), PromiseImpl);
return exports2.isGeneratorFunction(outerFn) ? iter : iter.next().then(function(result) {
return result.done ? result.value : iter.next();
});
}, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function() {
return this;
}), define(Gp, "toString", function() {
return "[object Generator]";
}), exports2.keys = function(val) {
var object2 = Object(val), keys2 = [];
for (var key2 in object2)
keys2.push(key2);
return keys2.reverse(), function next() {
for (; keys2.length; ) {
var key3 = keys2.pop();
if (key3 in object2)
return next.value = key3, next.done = false, next;
}
return next.done = true, next;
};
}, exports2.values = values, Context2.prototype = {
constructor: Context2,
reset: function reset(skipTempReset) {
if (this.prev = 0, this.next = 0, this.sent = this._sent = void 0, this.done = false, this.delegate = null, this.method = "next", this.arg = void 0, this.tryEntries.forEach(resetTryEntry), !skipTempReset)
for (var name2 in this)
"t" === name2.charAt(0) && hasOwn.call(this, name2) && !isNaN(+name2.slice(1)) && (this[name2] = void 0);
},
stop: function stop() {
this.done = true;
var rootRecord = this.tryEntries[0].completion;
if ("throw" === rootRecord.type)
throw rootRecord.arg;
return this.rval;
},
dispatchException: function dispatchException(exception) {
if (this.done)
throw exception;
var context2 = this;
function handle(loc, caught) {
return record.type = "throw", record.arg = exception, context2.next = loc, caught && (context2.method = "next", context2.arg = void 0), !!caught;
}
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2], record = entry.completion;
if ("root" === entry.tryLoc)
return handle("end");
if (entry.tryLoc <= this.prev) {
var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc");
if (hasCatch && hasFinally) {
if (this.prev < entry.catchLoc)
return handle(entry.catchLoc, true);
if (this.prev < entry.finallyLoc)
return handle(entry.finallyLoc);
} else if (hasCatch) {
if (this.prev < entry.catchLoc)
return handle(entry.catchLoc, true);
} else {
if (!hasFinally)
throw new Error("try statement without catch or finally");
if (this.prev < entry.finallyLoc)
return handle(entry.finallyLoc);
}
}
}
},
abrupt: function abrupt(type2, arg) {
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2];
if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
var finallyEntry = entry;
break;
}
}
finallyEntry && ("break" === type2 || "continue" === type2) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null);
var record = finallyEntry ? finallyEntry.completion : {};
return record.type = type2, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record);
},
complete: function complete(record, afterLoc) {
if ("throw" === record.type)
throw record.arg;
return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel;
},
finish: function finish(finallyLoc) {
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2];
if (entry.finallyLoc === finallyLoc)
return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel;
}
},
"catch": function _catch(tryLoc) {
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2];
if (entry.tryLoc === tryLoc) {
var record = entry.completion;
if ("throw" === record.type) {
var thrown = record.arg;
resetTryEntry(entry);
}
return thrown;
}
}
throw new Error("illegal catch attempt");
},
delegateYield: function delegateYield(iterable, resultName, nextLoc) {
return this.delegate = {
iterator: values(iterable),
resultName,
nextLoc
}, "next" === this.method && (this.arg = void 0), ContinueSentinel;
}
}, exports2;
}
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key2, arg) {
try {
var info = gen[key2](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _asyncToGenerator(fn) {
return function() {
var self2 = this, args = arguments;
return new Promise(function(resolve, reject) {
var gen = fn.apply(self2, args);
function _next(value) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(void 0);
});
};
}
function _extends$2() {
_extends$2 = Object.assign ? Object.assign.bind() : function(target) {
for (var i2 = 1; i2 < arguments.length; i2++) {
var source = arguments[i2];
for (var key2 in source) {
if (Object.prototype.hasOwnProperty.call(source, key2)) {
target[key2] = source[key2];
}
}
}
return target;
};
return _extends$2.apply(this, arguments);
}
function _inheritsLoose(subClass, superClass) {
subClass.prototype = Object.create(superClass.prototype);
subClass.prototype.constructor = subClass;
_setPrototypeOf$1(subClass, superClass);
}
function _getPrototypeOf(o) {
_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf2(o2) {
return o2.__proto__ || Object.getPrototypeOf(o2);
};
return _getPrototypeOf(o);
}
function _setPrototypeOf$1(o, p2) {
_setPrototypeOf$1 = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf3(o2, p3) {
o2.__proto__ = p3;
return o2;
};
return _setPrototypeOf$1(o, p2);
}
function _isNativeReflectConstruct() {
if (typeof Reflect === "undefined" || !Reflect.construct)
return false;
if (Reflect.construct.sham)
return false;
if (typeof Proxy === "function")
return true;
try {
Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {
}));
return true;
} catch (e2) {
return false;
}
}
function _construct(Parent, args, Class) {
if (_isNativeReflectConstruct()) {
_construct = Reflect.construct.bind();
} else {
_construct = function _construct2(Parent2, args2, Class2) {
var a = [null];
a.push.apply(a, args2);
var Constructor = Function.bind.apply(Parent2, a);
var instance = new Constructor();
if (Class2)
_setPrototypeOf$1(instance, Class2.prototype);
return instance;
};
}
return _construct.apply(null, arguments);
}
function _isNativeFunction(fn) {
return Function.toString.call(fn).indexOf("[native code]") !== -1;
}
function _wrapNativeSuper(Class) {
var _cache = typeof Map === "function" ? /* @__PURE__ */ new Map() : void 0;
_wrapNativeSuper = function _wrapNativeSuper2(Class2) {
if (Class2 === null || !_isNativeFunction(Class2))
return Class2;
if (typeof Class2 !== "function") {
throw new TypeError("Super expression must either be null or a function");
}
if (typeof _cache !== "undefined") {
if (_cache.has(Class2))
return _cache.get(Class2);
_cache.set(Class2, Wrapper);
}
function Wrapper() {
return _construct(Class2, arguments, _getPrototypeOf(this).constructor);
}
Wrapper.prototype = Object.create(Class2.prototype, {
constructor: {
value: Wrapper,
enumerable: false,
writable: true,
configurable: true
}
});
return _setPrototypeOf$1(Wrapper, Class2);
};
return _wrapNativeSuper(Class);
}
var formatRegExp = /%[sdj%]/g;
var warning$2 = function warning2() {
};
if (typeof process !== "undefined" && process.env && false) {
warning$2 = function warning2(type2, errors) {
if (typeof console !== "undefined" && console.warn && typeof ASYNC_VALIDATOR_NO_WARNING === "undefined") {
if (errors.every(function(e2) {
return typeof e2 === "string";
})) {
console.warn(type2, errors);
}
}
};
}
function convertFieldsError(errors) {
if (!errors || !errors.length)
return null;
var fields = {};
errors.forEach(function(error) {
var field = error.field;
fields[field] = fields[field] || [];
fields[field].push(error);
});
return fields;
}
function format(template) {
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
args[_key - 1] = arguments[_key];
}
var i2 = 0;
var len = args.length;
if (typeof template === "function") {
return template.apply(null, args);
}
if (typeof template === "string") {
var str = template.replace(formatRegExp, function(x2) {
if (x2 === "%%") {
return "%";
}
if (i2 >= len) {
return x2;
}
switch (x2) {
case "%s":
return String(args[i2++]);
case "%d":
return Number(args[i2++]);
case "%j":
try {
return JSON.stringify(args[i2++]);
} catch (_) {
return "[Circular]";
}
break;
default:
return x2;
}
});
return str;
}
return template;
}
function isNativeStringType(type2) {
return type2 === "string" || type2 === "url" || type2 === "hex" || type2 === "email" || type2 === "date" || type2 === "pattern";
}
function isEmptyValue(value, type2) {
if (value === void 0 || value === null) {
return true;
}
if (type2 === "array" && Array.isArray(value) && !value.length) {
return true;
}
if (isNativeStringType(type2) && typeof value === "string" && !value) {
return true;
}
return false;
}
function asyncParallelArray(arr, func, callback) {
var results = [];
var total = 0;
var arrLength = arr.length;
function count(errors) {
results.push.apply(results, errors || []);
total++;
if (total === arrLength) {
callback(results);
}
}
arr.forEach(function(a) {
func(a, count);
});
}
function asyncSerialArray(arr, func, callback) {
var index2 = 0;
var arrLength = arr.length;
function next(errors) {
if (errors && errors.length) {
callback(errors);
return;
}
var original = index2;
index2 = index2 + 1;
if (original < arrLength) {
func(arr[original], next);
} else {
callback([]);
}
}
next([]);
}
function flattenObjArr(objArr) {
var ret = [];
Object.keys(objArr).forEach(function(k2) {
ret.push.apply(ret, objArr[k2] || []);
});
return ret;
}
var AsyncValidationError = /* @__PURE__ */ function(_Error) {
_inheritsLoose(AsyncValidationError2, _Error);
function AsyncValidationError2(errors, fields) {
var _this2;
_this2 = _Error.call(this, "Async Validation Error") || this;
_this2.errors = errors;
_this2.fields = fields;
return _this2;
}
return AsyncValidationError2;
}(/* @__PURE__ */ _wrapNativeSuper(Error));
function asyncMap(objArr, option, func, callback, source) {
if (option.first) {
var _pending = new Promise(function(resolve, reject) {
var next = function next2(errors) {
callback(errors);
return errors.length ? reject(new AsyncValidationError(errors, convertFieldsError(errors))) : resolve(source);
};
var flattenArr = flattenObjArr(objArr);
asyncSerialArray(flattenArr, func, next);
});
_pending["catch"](function(e2) {
return e2;
});
return _pending;
}
var firstFields = option.firstFields === true ? Object.keys(objArr) : option.firstFields || [];
var objArrKeys = Object.keys(objArr);
var objArrLength = objArrKeys.length;
var total = 0;
var results = [];
var pending = new Promise(function(resolve, reject) {
var next = function next2(errors) {
results.push.apply(results, errors);
total++;
if (total === objArrLength) {
callback(results);
return results.length ? reject(new AsyncValidationError(results, convertFieldsError(results))) : resolve(source);
}
};
if (!objArrKeys.length) {
callback(results);
resolve(source);
}
objArrKeys.forEach(function(key2) {
var arr = objArr[key2];
if (firstFields.indexOf(key2) !== -1) {
asyncSerialArray(arr, func, next);
} else {
asyncParallelArray(arr, func, next);
}
});
});
pending["catch"](function(e2) {
return e2;
});
return pending;
}
function isErrorObj(obj) {
return !!(obj && obj.message !== void 0);
}
function getValue$6(value, path2) {
var v2 = value;
for (var i2 = 0; i2 < path2.length; i2++) {
if (v2 == void 0) {
return v2;
}
v2 = v2[path2[i2]];
}
return v2;
}
function complementError(rule, source) {
return function(oe) {
var fieldValue;
if (rule.fullFields) {
fieldValue = getValue$6(source, rule.fullFields);
} else {
fieldValue = source[oe.field || rule.fullField];
}
if (isErrorObj(oe)) {
oe.field = oe.field || rule.fullField;
oe.fieldValue = fieldValue;
return oe;
}
return {
message: typeof oe === "function" ? oe() : oe,
fieldValue,
field: oe.field || rule.fullField
};
};
}
function deepMerge(target, source) {
if (source) {
for (var s in source) {
if (source.hasOwnProperty(s)) {
var value = source[s];
if (typeof value === "object" && typeof target[s] === "object") {
target[s] = _extends$2({}, target[s], value);
} else {
target[s] = value;
}
}
}
}
return target;
}
var required$1 = function required2(rule, value, source, errors, options, type2) {
if (rule.required && (!source.hasOwnProperty(rule.field) || isEmptyValue(value, type2 || rule.type))) {
errors.push(format(options.messages.required, rule.fullField));
}
};
var whitespace = function whitespace2(rule, value, source, errors, options) {
if (/^\s+$/.test(value) || value === "") {
errors.push(format(options.messages.whitespace, rule.fullField));
}
};
var urlReg;
var getUrlRegex = function() {
if (urlReg) {
return urlReg;
}
var word = "[a-fA-F\\d:]";
var b2 = function b3(options) {
return options && options.includeBoundaries ? "(?:(?<=\\s|^)(?=" + word + ")|(?<=" + word + ")(?=\\s|$))" : "";
};
var v4 = "(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}";
var v6seg = "[a-fA-F\\d]{1,4}";
var v6 = ("\n(?:\n(?:" + v6seg + ":){7}(?:" + v6seg + "|:)| // 1:2:3:4:5:6:7:: 1:2:3:4:5:6:7:8\n(?:" + v6seg + ":){6}(?:" + v4 + "|:" + v6seg + "|:)| // 1:2:3:4:5:6:: 1:2:3:4:5:6::8 1:2:3:4:5:6::8 1:2:3:4:5:6::1.2.3.4\n(?:" + v6seg + ":){5}(?::" + v4 + "|(?::" + v6seg + "){1,2}|:)| // 1:2:3:4:5:: 1:2:3:4:5::7:8 1:2:3:4:5::8 1:2:3:4:5::7:1.2.3.4\n(?:" + v6seg + ":){4}(?:(?::" + v6seg + "){0,1}:" + v4 + "|(?::" + v6seg + "){1,3}|:)| // 1:2:3:4:: 1:2:3:4::6:7:8 1:2:3:4::8 1:2:3:4::6:7:1.2.3.4\n(?:" + v6seg + ":){3}(?:(?::" + v6seg + "){0,2}:" + v4 + "|(?::" + v6seg + "){1,4}|:)| // 1:2:3:: 1:2:3::5:6:7:8 1:2:3::8 1:2:3::5:6:7:1.2.3.4\n(?:" + v6seg + ":){2}(?:(?::" + v6seg + "){0,3}:" + v4 + "|(?::" + v6seg + "){1,5}|:)| // 1:2:: 1:2::4:5:6:7:8 1:2::8 1:2::4:5:6:7:1.2.3.4\n(?:" + v6seg + ":){1}(?:(?::" + v6seg + "){0,4}:" + v4 + "|(?::" + v6seg + "){1,6}|:)| // 1:: 1::3:4:5:6:7:8 1::8 1::3:4:5:6:7:1.2.3.4\n(?::(?:(?::" + v6seg + "){0,5}:" + v4 + "|(?::" + v6seg + "){1,7}|:)) // ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 ::1.2.3.4\n)(?:%[0-9a-zA-Z]{1,})? // %eth0 %1\n").replace(/\s*\/\/.*$/gm, "").replace(/\n/g, "").trim();
var v46Exact = new RegExp("(?:^" + v4 + "$)|(?:^" + v6 + "$)");
var v4exact = new RegExp("^" + v4 + "$");
var v6exact = new RegExp("^" + v6 + "$");
var ip = function ip2(options) {
return options && options.exact ? v46Exact : new RegExp("(?:" + b2(options) + v4 + b2(options) + ")|(?:" + b2(options) + v6 + b2(options) + ")", "g");
};
ip.v4 = function(options) {
return options && options.exact ? v4exact : new RegExp("" + b2(options) + v4 + b2(options), "g");
};
ip.v6 = function(options) {
return options && options.exact ? v6exact : new RegExp("" + b2(options) + v6 + b2(options), "g");
};
var protocol = "(?:(?:[a-z]+:)?//)";
var auth = "(?:\\S+(?::\\S*)?@)?";
var ipv4 = ip.v4().source;
var ipv6 = ip.v6().source;
var host = "(?:(?:[a-z\\u00a1-\\uffff0-9][-_]*)*[a-z\\u00a1-\\uffff0-9]+)";
var domain = "(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*";
var tld = "(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))";
var port = "(?::\\d{2,5})?";
var path2 = '(?:[/?#][^\\s"]*)?';
var regex = "(?:" + protocol + "|www\\.)" + auth + "(?:localhost|" + ipv4 + "|" + ipv6 + "|" + host + domain + tld + ")" + port + path2;
urlReg = new RegExp("(?:^" + regex + "$)", "i");
return urlReg;
};
var pattern$2 = {
email: /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+\.)+[a-zA-Z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]{2,}))$/,
hex: /^#?([a-f0-9]{6}|[a-f0-9]{3})$/i
};
var types = {
integer: function integer2(value) {
return types.number(value) && parseInt(value, 10) === value;
},
"float": function float(value) {
return types.number(value) && !types.integer(value);
},
array: function array2(value) {
return Array.isArray(value);
},
regexp: function regexp2(value) {
if (value instanceof RegExp) {
return true;
}
try {
return !!new RegExp(value);
} catch (e2) {
return false;
}
},
date: function date2(value) {
return typeof value.getTime === "function" && typeof value.getMonth === "function" && typeof value.getYear === "function" && !isNaN(value.getTime());
},
number: function number2(value) {
if (isNaN(value)) {
return false;
}
return typeof value === "number";
},
object: function object2(value) {
return typeof value === "object" && !types.array(value);
},
method: function method2(value) {
return typeof value === "function";
},
email: function email(value) {
return typeof value === "string" && value.length <= 320 && !!value.match(pattern$2.email);
},
url: function url(value) {
return typeof value === "string" && value.length <= 2048 && !!value.match(getUrlRegex());
},
hex: function hex(value) {
return typeof value === "string" && !!value.match(pattern$2.hex);
}
};
var type$1 = function type2(rule, value, source, errors, options) {
if (rule.required && value === void 0) {
required$1(rule, value, source, errors, options);
return;
}
var custom = ["integer", "float", "array", "regexp", "object", "method", "email", "number", "date", "url", "hex"];
var ruleType = rule.type;
if (custom.indexOf(ruleType) > -1) {
if (!types[ruleType](value)) {
errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type));
}
} else if (ruleType && typeof value !== rule.type) {
errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type));
}
};
var range = function range2(rule, value, source, errors, options) {
var len = typeof rule.len === "number";
var min = typeof rule.min === "number";
var max = typeof rule.max === "number";
var spRegexp = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
var val = value;
var key2 = null;
var num = typeof value === "number";
var str = typeof value === "string";
var arr = Array.isArray(value);
if (num) {
key2 = "number";
} else if (str) {
key2 = "string";
} else if (arr) {
key2 = "array";
}
if (!key2) {
return false;
}
if (arr) {
val = value.length;
}
if (str) {
val = value.replace(spRegexp, "_").length;
}
if (len) {
if (val !== rule.len) {
errors.push(format(options.messages[key2].len, rule.fullField, rule.len));
}
} else if (min && !max && val < rule.min) {
errors.push(format(options.messages[key2].min, rule.fullField, rule.min));
} else if (max && !min && val > rule.max) {
errors.push(format(options.messages[key2].max, rule.fullField, rule.max));
} else if (min && max && (val < rule.min || val > rule.max)) {
errors.push(format(options.messages[key2].range, rule.fullField, rule.min, rule.max));
}
};
var ENUM$1 = "enum";
var enumerable$1 = function enumerable2(rule, value, source, errors, options) {
rule[ENUM$1] = Array.isArray(rule[ENUM$1]) ? rule[ENUM$1] : [];
if (rule[ENUM$1].indexOf(value) === -1) {
errors.push(format(options.messages[ENUM$1], rule.fullField, rule[ENUM$1].join(", ")));
}
};
var pattern$1 = function pattern2(rule, value, source, errors, options) {
if (rule.pattern) {
if (rule.pattern instanceof RegExp) {
rule.pattern.lastIndex = 0;
if (!rule.pattern.test(value)) {
errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern));
}
} else if (typeof rule.pattern === "string") {
var _pattern = new RegExp(rule.pattern);
if (!_pattern.test(value)) {
errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern));
}
}
}
};
var rules = {
required: required$1,
whitespace,
type: type$1,
range,
"enum": enumerable$1,
pattern: pattern$1
};
var string = function string2(rule, value, callback, source, options) {
var errors = [];
var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate) {
if (isEmptyValue(value, "string") && !rule.required) {
return callback();
}
rules.required(rule, value, source, errors, options, "string");
if (!isEmptyValue(value, "string")) {
rules.type(rule, value, source, errors, options);
rules.range(rule, value, source, errors, options);
rules.pattern(rule, value, source, errors, options);
if (rule.whitespace === true) {
rules.whitespace(rule, value, source, errors, options);
}
}
}
callback(errors);
};
var method = function method2(rule, value, callback, source, options) {
var errors = [];
var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate) {
if (isEmptyValue(value) && !rule.required) {
return callback();
}
rules.required(rule, value, source, errors, options);
if (value !== void 0) {
rules.type(rule, value, source, errors, options);
}
}
callback(errors);
};
var number = function number2(rule, value, callback, source, options) {
var errors = [];
var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate) {
if (value === "") {
value = void 0;
}
if (isEmptyValue(value) && !rule.required) {
return callback();
}
rules.required(rule, value, source, errors, options);
if (value !== void 0) {
rules.type(rule, value, source, errors, options);
rules.range(rule, value, source, errors, options);
}
}
callback(errors);
};
var _boolean = function _boolean2(rule, value, callback, source, options) {
var errors = [];
var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate) {
if (isEmptyValue(value) && !rule.required) {
return callback();
}
rules.required(rule, value, source, errors, options);
if (value !== void 0) {
rules.type(rule, value, source, errors, options);
}
}
callback(errors);
};
var regexp = function regexp2(rule, value, callback, source, options) {
var errors = [];
var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate) {
if (isEmptyValue(value) && !rule.required) {
return callback();
}
rules.required(rule, value, source, errors, options);
if (!isEmptyValue(value)) {
rules.type(rule, value, source, errors, options);
}
}
callback(errors);
};
var integer = function integer2(rule, value, callback, source, options) {
var errors = [];
var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate) {
if (isEmptyValue(value) && !rule.required) {
return callback();
}
rules.required(rule, value, source, errors, options);
if (value !== void 0) {
rules.type(rule, value, source, errors, options);
rules.range(rule, value, source, errors, options);
}
}
callback(errors);
};
var floatFn = function floatFn2(rule, value, callback, source, options) {
var errors = [];
var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate) {
if (isEmptyValue(value) && !rule.required) {
return callback();
}
rules.required(rule, value, source, errors, options);
if (value !== void 0) {
rules.type(rule, value, source, errors, options);
rules.range(rule, value, source, errors, options);
}
}
callback(errors);
};
var array = function array2(rule, value, callback, source, options) {
var errors = [];
var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate) {
if ((value === void 0 || value === null) && !rule.required) {
return callback();
}
rules.required(rule, value, source, errors, options, "array");
if (value !== void 0 && value !== null) {
rules.type(rule, value, source, errors, options);
rules.range(rule, value, source, errors, options);
}
}
callback(errors);
};
var object = function object2(rule, value, callback, source, options) {
var errors = [];
var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate) {
if (isEmptyValue(value) && !rule.required) {
return callback();
}
rules.required(rule, value, source, errors, options);
if (value !== void 0) {
rules.type(rule, value, source, errors, options);
}
}
callback(errors);
};
var ENUM = "enum";
var enumerable = function enumerable2(rule, value, callback, source, options) {
var errors = [];
var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate) {
if (isEmptyValue(value) && !rule.required) {
return callback();
}
rules.required(rule, value, source, errors, options);
if (value !== void 0) {
rules[ENUM](rule, value, source, errors, options);
}
}
callback(errors);
};
var pattern = function pattern2(rule, value, callback, source, options) {
var errors = [];
var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate) {
if (isEmptyValue(value, "string") && !rule.required) {
return callback();
}
rules.required(rule, value, source, errors, options);
if (!isEmptyValue(value, "string")) {
rules.pattern(rule, value, source, errors, options);
}
}
callback(errors);
};
var date = function date2(rule, value, callback, source, options) {
var errors = [];
var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate) {
if (isEmptyValue(value, "date") && !rule.required) {
return callback();
}
rules.required(rule, value, source, errors, options);
if (!isEmptyValue(value, "date")) {
var dateObject;
if (value instanceof Date) {
dateObject = value;
} else {
dateObject = new Date(value);
}
rules.type(rule, dateObject, source, errors, options);
if (dateObject) {
rules.range(rule, dateObject.getTime(), source, errors, options);
}
}
}
callback(errors);
};
var required = function required2(rule, value, callback, source, options) {
var errors = [];
var type2 = Array.isArray(value) ? "array" : typeof value;
rules.required(rule, value, source, errors, options, type2);
callback(errors);
};
var type = function type2(rule, value, callback, source, options) {
var ruleType = rule.type;
var errors = [];
var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate) {
if (isEmptyValue(value, ruleType) && !rule.required) {
return callback();
}
rules.required(rule, value, source, errors, options, ruleType);
if (!isEmptyValue(value, ruleType)) {
rules.type(rule, value, source, errors, options);
}
}
callback(errors);
};
var any = function any2(rule, value, callback, source, options) {
var errors = [];
var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
if (validate) {
if (isEmptyValue(value) && !rule.required) {
return callback();
}
rules.required(rule, value, source, errors, options);
}
callback(errors);
};
var validators$2 = {
string,
method,
number,
"boolean": _boolean,
regexp,
integer,
"float": floatFn,
array,
object,
"enum": enumerable,
pattern,
date,
url: type,
hex: type,
email: type,
required,
any
};
function newMessages() {
return {
"default": "Validation error on field %s",
required: "%s is required",
"enum": "%s must be one of %s",
whitespace: "%s cannot be empty",
date: {
format: "%s date %s is invalid for format %s",
parse: "%s date could not be parsed, %s is invalid ",
invalid: "%s date %s is invalid"
},
types: {
string: "%s is not a %s",
method: "%s is not a %s (function)",
array: "%s is not an %s",
object: "%s is not an %s",
number: "%s is not a %s",
date: "%s is not a %s",
"boolean": "%s is not a %s",
integer: "%s is not an %s",
"float": "%s is not a %s",
regexp: "%s is not a valid %s",
email: "%s is not a valid %s",
url: "%s is not a valid %s",
hex: "%s is not a valid %s"
},
string: {
len: "%s must be exactly %s characters",
min: "%s must be at least %s characters",
max: "%s cannot be longer than %s characters",
range: "%s must be between %s and %s characters"
},
number: {
len: "%s must equal %s",
min: "%s cannot be less than %s",
max: "%s cannot be greater than %s",
range: "%s must be between %s and %s"
},
array: {
len: "%s must be exactly %s in length",
min: "%s cannot be less than %s in length",
max: "%s cannot be greater than %s in length",
range: "%s must be between %s and %s in length"
},
pattern: {
mismatch: "%s value %s does not match pattern %s"
},
clone: function clone() {
var cloned = JSON.parse(JSON.stringify(this));
cloned.clone = this.clone;
return cloned;
}
};
}
var messages = newMessages();
var Schema = /* @__PURE__ */ function() {
function Schema2(descriptor2) {
this.rules = null;
this._messages = messages;
this.define(descriptor2);
}
var _proto = Schema2.prototype;
_proto.define = function define(rules2) {
var _this2 = this;
if (!rules2) {
throw new Error("Cannot configure a schema with no rules");
}
if (typeof rules2 !== "object" || Array.isArray(rules2)) {
throw new Error("Rules must be an object");
}
this.rules = {};
Object.keys(rules2).forEach(function(name2) {
var item = rules2[name2];
_this2.rules[name2] = Array.isArray(item) ? item : [item];
});
};
_proto.messages = function messages2(_messages) {
if (_messages) {
this._messages = deepMerge(newMessages(), _messages);
}
return this._messages;
};
_proto.validate = function validate(source_, o, oc) {
var _this2 = this;
if (o === void 0) {
o = {};
}
if (oc === void 0) {
oc = function oc2() {
};
}
var source = source_;
var options = o;
var callback = oc;
if (typeof options === "function") {
callback = options;
options = {};
}
if (!this.rules || Object.keys(this.rules).length === 0) {
if (callback) {
callback(null, source);
}
return Promise.resolve(source);
}
function complete(results) {
var errors = [];
var fields = {};
function add(e2) {
if (Array.isArray(e2)) {
var _errors;
errors = (_errors = errors).concat.apply(_errors, e2);
} else {
errors.push(e2);
}
}
for (var i2 = 0; i2 < results.length; i2++) {
add(results[i2]);
}
if (!errors.length) {
callback(null, source);
} else {
fields = convertFieldsError(errors);
callback(errors, fields);
}
}
if (options.messages) {
var messages$1 = this.messages();
if (messages$1 === messages) {
messages$1 = newMessages();
}
deepMerge(messages$1, options.messages);
options.messages = messages$1;
} else {
options.messages = this.messages();
}
var series = {};
var keys2 = options.keys || Object.keys(this.rules);
keys2.forEach(function(z2) {
var arr = _this2.rules[z2];
var value = source[z2];
arr.forEach(function(r2) {
var rule = r2;
if (typeof rule.transform === "function") {
if (source === source_) {
source = _extends$2({}, source);
}
value = source[z2] = rule.transform(value);
}
if (typeof rule === "function") {
rule = {
validator: rule
};
} else {
rule = _extends$2({}, rule);
}
rule.validator = _this2.getValidationMethod(rule);
if (!rule.validator) {
return;
}
rule.field = z2;
rule.fullField = rule.fullField || z2;
rule.type = _this2.getType(rule);
series[z2] = series[z2] || [];
series[z2].push({
rule,
value,
source,
field: z2
});
});
});
var errorFields = {};
return asyncMap(series, options, function(data, doIt) {
var rule = data.rule;
var deep = (rule.type === "object" || rule.type === "array") && (typeof rule.fields === "object" || typeof rule.defaultField === "object");
deep = deep && (rule.required || !rule.required && data.value);
rule.field = data.field;
function addFullField(key2, schema2) {
return _extends$2({}, schema2, {
fullField: rule.fullField + "." + key2,
fullFields: rule.fullFields ? [].concat(rule.fullFields, [key2]) : [key2]
});
}
function cb(e2) {
if (e2 === void 0) {
e2 = [];
}
var errorList = Array.isArray(e2) ? e2 : [e2];
if (!options.suppressWarning && errorList.length) {
Schema2.warning("async-validator:", errorList);
}
if (errorList.length && rule.message !== void 0) {
errorList = [].concat(rule.message);
}
var filledErrors = errorList.map(complementError(rule, source));
if (options.first && filledErrors.length) {
errorFields[rule.field] = 1;
return doIt(filledErrors);
}
if (!deep) {
doIt(filledErrors);
} else {
if (rule.required && !data.value) {
if (rule.message !== void 0) {
filledErrors = [].concat(rule.message).map(complementError(rule, source));
} else if (options.error) {
filledErrors = [options.error(rule, format(options.messages.required, rule.field))];
}
return doIt(filledErrors);
}
var fieldsSchema = {};
if (rule.defaultField) {
Object.keys(data.value).map(function(key2) {
fieldsSchema[key2] = rule.defaultField;
});
}
fieldsSchema = _extends$2({}, fieldsSchema, data.rule.fields);
var paredFieldsSchema = {};
Object.keys(fieldsSchema).forEach(function(field) {
var fieldSchema = fieldsSchema[field];
var fieldSchemaList = Array.isArray(fieldSchema) ? fieldSchema : [fieldSchema];
paredFieldsSchema[field] = fieldSchemaList.map(addFullField.bind(null, field));
});
var schema2 = new Schema2(paredFieldsSchema);
schema2.messages(options.messages);
if (data.rule.options) {
data.rule.options.messages = options.messages;
data.rule.options.error = options.error;
}
schema2.validate(data.value, data.rule.options || options, function(errs) {
var finalErrors = [];
if (filledErrors && filledErrors.length) {
finalErrors.push.apply(finalErrors, filledErrors);
}
if (errs && errs.length) {
finalErrors.push.apply(finalErrors, errs);
}
doIt(finalErrors.length ? finalErrors : null);
});
}
}
var res;
if (rule.asyncValidator) {
res = rule.asyncValidator(rule, data.value, cb, data.source, options);
} else if (rule.validator) {
try {
res = rule.validator(rule, data.value, cb, data.source, options);
} catch (error) {
console.error == null ? void 0 : console.error(error);
if (!options.suppressValidatorError) {
setTimeout(function() {
throw error;
}, 0);
}
cb(error.message);
}
if (res === true) {
cb();
} else if (res === false) {
cb(typeof rule.message === "function" ? rule.message(rule.fullField || rule.field) : rule.message || (rule.fullField || rule.field) + " fails");
} else if (res instanceof Array) {
cb(res);
} else if (res instanceof Error) {
cb(res.message);
}
}
if (res && res.then) {
res.then(function() {
return cb();
}, function(e2) {
return cb(e2);
});
}
}, function(results) {
complete(results);
}, source);
};
_proto.getType = function getType(rule) {
if (rule.type === void 0 && rule.pattern instanceof RegExp) {
rule.type = "pattern";
}
if (typeof rule.validator !== "function" && rule.type && !validators$2.hasOwnProperty(rule.type)) {
throw new Error(format("Unknown rule type %s", rule.type));
}
return rule.type || "string";
};
_proto.getValidationMethod = function getValidationMethod(rule) {
if (typeof rule.validator === "function") {
return rule.validator;
}
var keys2 = Object.keys(rule);
var messageIndex = keys2.indexOf("message");
if (messageIndex !== -1) {
keys2.splice(messageIndex, 1);
}
if (keys2.length === 1 && keys2[0] === "required") {
return validators$2.required;
}
return validators$2[this.getType(rule)] || void 0;
};
return Schema2;
}();
Schema.register = function register(type2, validator2) {
if (typeof validator2 !== "function") {
throw new Error("Cannot register a validator by type, validator is not a function");
}
validators$2[type2] = validator2;
};
Schema.warning = warning$2;
Schema.messages = messages;
Schema.validators = validators$2;
var typeTemplate$2 = "'${name}' is not a valid ${type}";
var defaultValidateMessages = {
default: "Validation error on field '${name}'",
required: "'${name}' is required",
enum: "'${name}' must be one of [${enum}]",
whitespace: "'${name}' cannot be empty",
date: {
format: "'${name}' is invalid for format date",
parse: "'${name}' could not be parsed as date",
invalid: "'${name}' is invalid date"
},
types: {
string: typeTemplate$2,
method: typeTemplate$2,
array: typeTemplate$2,
object: typeTemplate$2,
number: typeTemplate$2,
date: typeTemplate$2,
boolean: typeTemplate$2,
integer: typeTemplate$2,
float: typeTemplate$2,
regexp: typeTemplate$2,
email: typeTemplate$2,
url: typeTemplate$2,
hex: typeTemplate$2
},
string: {
len: "'${name}' must be exactly ${len} characters",
min: "'${name}' must be at least ${min} characters",
max: "'${name}' cannot be longer than ${max} characters",
range: "'${name}' must be between ${min} and ${max} characters"
},
number: {
len: "'${name}' must equal ${len}",
min: "'${name}' cannot be less than ${min}",
max: "'${name}' cannot be greater than ${max}",
range: "'${name}' must be between ${min} and ${max}"
},
array: {
len: "'${name}' must be exactly ${len} in length",
min: "'${name}' cannot be less than ${min} in length",
max: "'${name}' cannot be greater than ${max} in length",
range: "'${name}' must be between ${min} and ${max} in length"
},
pattern: {
mismatch: "'${name}' does not match pattern ${pattern}"
}
};
function get$1(entity, path2) {
var current = entity;
for (var i2 = 0; i2 < path2.length; i2 += 1) {
if (current === null || current === void 0) {
return void 0;
}
current = current[path2[i2]];
}
return current;
}
function _arrayWithHoles$f(arr) {
if (Array.isArray(arr))
return arr;
}
function _nonIterableRest$f() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _toArray$1(arr) {
return _arrayWithHoles$f(arr) || _iterableToArray$c(arr) || _unsupportedIterableToArray$l(arr) || _nonIterableRest$f();
}
function internalSet(entity, paths, value, removeIfUndefined) {
if (!paths.length) {
return value;
}
var _paths = _toArray$1(paths), path2 = _paths[0], restPath = _paths.slice(1);
var clone;
if (!entity && typeof path2 === "number") {
clone = [];
} else if (Array.isArray(entity)) {
clone = _toConsumableArray$c(entity);
} else {
clone = _objectSpread2$a({}, entity);
}
if (removeIfUndefined && value === void 0 && restPath.length === 1) {
delete clone[path2][restPath[0]];
} else {
clone[path2] = internalSet(clone[path2], restPath, value, removeIfUndefined);
}
return clone;
}
function set$1(entity, paths, value) {
var removeIfUndefined = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : false;
if (paths.length && removeIfUndefined && value === void 0 && !get$1(entity, paths.slice(0, -1))) {
return entity;
}
return internalSet(entity, paths, value, removeIfUndefined);
}
function cloneDeep$1(val) {
if (Array.isArray(val)) {
return cloneArrayDeep(val);
} else if (_typeof$q(val) === "object" && val !== null) {
return cloneObjectDeep(val);
}
return val;
}
function cloneObjectDeep(val) {
if (Object.getPrototypeOf(val) === Object.prototype) {
var res = {};
for (var key2 in val) {
res[key2] = cloneDeep$1(val[key2]);
}
return res;
}
return val;
}
function cloneArrayDeep(val) {
return val.map(function(item) {
return cloneDeep$1(item);
});
}
function getNamePath(path2) {
return toArray$8(path2);
}
function getValue$5(store2, namePath) {
var value = get$1(store2, namePath);
return value;
}
function setValue(store2, namePath, value) {
var removeIfUndefined = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : false;
var newStore = set$1(store2, namePath, value, removeIfUndefined);
return newStore;
}
function cloneByNamePathList(store2, namePathList) {
var newStore = {};
namePathList.forEach(function(namePath) {
var value = getValue$5(store2, namePath);
newStore = setValue(newStore, namePath, value);
});
return newStore;
}
function containsNamePath(namePathList, namePath) {
return namePathList && namePathList.some(function(path2) {
return matchNamePath(path2, namePath);
});
}
function isObject$c(obj) {
return _typeof$q(obj) === "object" && obj !== null && Object.getPrototypeOf(obj) === Object.prototype;
}
function internalSetValues(store2, values) {
var newStore = Array.isArray(store2) ? _toConsumableArray$c(store2) : _objectSpread2$a({}, store2);
if (!values) {
return newStore;
}
Object.keys(values).forEach(function(key2) {
var prevValue = newStore[key2];
var value = values[key2];
var recursive = isObject$c(prevValue) && isObject$c(value);
newStore[key2] = recursive ? internalSetValues(prevValue, value || {}) : cloneDeep$1(value);
});
return newStore;
}
function setValues(store2) {
for (var _len = arguments.length, restValues = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
restValues[_key - 1] = arguments[_key];
}
return restValues.reduce(function(current, newStore) {
return internalSetValues(current, newStore);
}, store2);
}
function matchNamePath(namePath, changedNamePath) {
if (!namePath || !changedNamePath || namePath.length !== changedNamePath.length) {
return false;
}
return namePath.every(function(nameUnit, i2) {
return changedNamePath[i2] === nameUnit;
});
}
function isSimilar(source, target) {
if (source === target) {
return true;
}
if (!source && target || source && !target) {
return false;
}
if (!source || !target || _typeof$q(source) !== "object" || _typeof$q(target) !== "object") {
return false;
}
var sourceKeys = Object.keys(source);
var targetKeys = Object.keys(target);
var keys2 = new Set([].concat(sourceKeys, targetKeys));
return _toConsumableArray$c(keys2).every(function(key2) {
var sourceValue = source[key2];
var targetValue = target[key2];
if (typeof sourceValue === "function" && typeof targetValue === "function") {
return true;
}
return sourceValue === targetValue;
});
}
function defaultGetValueFromEvent(valuePropName) {
var event = arguments.length <= 1 ? void 0 : arguments[1];
if (event && event.target && _typeof$q(event.target) === "object" && valuePropName in event.target) {
return event.target[valuePropName];
}
return event;
}
function move(array2, moveIndex, toIndex) {
var length = array2.length;
if (moveIndex < 0 || moveIndex >= length || toIndex < 0 || toIndex >= length) {
return array2;
}
var item = array2[moveIndex];
var diff = moveIndex - toIndex;
if (diff > 0) {
return [].concat(_toConsumableArray$c(array2.slice(0, toIndex)), [item], _toConsumableArray$c(array2.slice(toIndex, moveIndex)), _toConsumableArray$c(array2.slice(moveIndex + 1, length)));
}
if (diff < 0) {
return [].concat(_toConsumableArray$c(array2.slice(0, moveIndex)), _toConsumableArray$c(array2.slice(moveIndex + 1, toIndex + 1)), [item], _toConsumableArray$c(array2.slice(toIndex + 1, length)));
}
return array2;
}
var AsyncValidator = Schema;
function replaceMessage(template, kv) {
return template.replace(/\$\{\w+\}/g, function(str) {
var key2 = str.slice(2, -1);
return kv[key2];
});
}
var CODE_LOGIC_ERROR = "CODE_LOGIC_ERROR";
function validateRule(_x, _x2, _x3, _x4, _x5) {
return _validateRule.apply(this, arguments);
}
function _validateRule() {
_validateRule = _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime$3().mark(function _callee2(name2, value, rule, options, messageVariables) {
var cloneRule, originValidator, subRuleField, validator2, messages2, result, subResults, kv, fillVariableResult;
return _regeneratorRuntime$3().wrap(function _callee2$(_context2) {
while (1)
switch (_context2.prev = _context2.next) {
case 0:
cloneRule = _objectSpread2$a({}, rule);
delete cloneRule.ruleIndex;
if (cloneRule.validator) {
originValidator = cloneRule.validator;
cloneRule.validator = function() {
try {
return originValidator.apply(void 0, arguments);
} catch (error) {
console.error(error);
return Promise.reject(CODE_LOGIC_ERROR);
}
};
}
subRuleField = null;
if (cloneRule && cloneRule.type === "array" && cloneRule.defaultField) {
subRuleField = cloneRule.defaultField;
delete cloneRule.defaultField;
}
validator2 = new AsyncValidator(_defineProperty$b({}, name2, [cloneRule]));
messages2 = setValues({}, defaultValidateMessages, options.validateMessages);
validator2.messages(messages2);
result = [];
_context2.prev = 9;
_context2.next = 12;
return Promise.resolve(validator2.validate(_defineProperty$b({}, name2, value), _objectSpread2$a({}, options)));
case 12:
_context2.next = 17;
break;
case 14:
_context2.prev = 14;
_context2.t0 = _context2["catch"](9);
if (_context2.t0.errors) {
result = _context2.t0.errors.map(function(_ref4, index2) {
var message = _ref4.message;
var mergedMessage = message === CODE_LOGIC_ERROR ? messages2.default : message;
return /* @__PURE__ */ React__namespace.isValidElement(mergedMessage) ? /* @__PURE__ */ React__namespace.cloneElement(mergedMessage, {
key: "error_".concat(index2)
}) : mergedMessage;
});
}
case 17:
if (!(!result.length && subRuleField)) {
_context2.next = 22;
break;
}
_context2.next = 20;
return Promise.all(value.map(function(subValue, i2) {
return validateRule("".concat(name2, ".").concat(i2), subValue, subRuleField, options, messageVariables);
}));
case 20:
subResults = _context2.sent;
return _context2.abrupt("return", subResults.reduce(function(prev, errors) {
return [].concat(_toConsumableArray$c(prev), _toConsumableArray$c(errors));
}, []));
case 22:
kv = _objectSpread2$a(_objectSpread2$a({}, rule), {}, {
name: name2,
enum: (rule.enum || []).join(", ")
}, messageVariables);
fillVariableResult = result.map(function(error) {
if (typeof error === "string") {
return replaceMessage(error, kv);
}
return error;
});
return _context2.abrupt("return", fillVariableResult);
case 25:
case "end":
return _context2.stop();
}
}, _callee2, null, [[9, 14]]);
}));
return _validateRule.apply(this, arguments);
}
function validateRules(namePath, value, rules2, options, validateFirst, messageVariables) {
var name2 = namePath.join(".");
var filledRules = rules2.map(function(currentRule, ruleIndex) {
var originValidatorFunc = currentRule.validator;
var cloneRule = _objectSpread2$a(_objectSpread2$a({}, currentRule), {}, {
ruleIndex
});
if (originValidatorFunc) {
cloneRule.validator = function(rule, val, callback) {
var hasPromise = false;
var wrappedCallback = function wrappedCallback2() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
Promise.resolve().then(function() {
warningOnce(!hasPromise, "Your validator function has already return a promise. `callback` will be ignored.");
if (!hasPromise) {
callback.apply(void 0, args);
}
});
};
var promise = originValidatorFunc(rule, val, wrappedCallback);
hasPromise = promise && typeof promise.then === "function" && typeof promise.catch === "function";
warningOnce(hasPromise, "`callback` is deprecated. Please return a promise instead.");
if (hasPromise) {
promise.then(function() {
callback();
}).catch(function(err) {
callback(err || " ");
});
}
};
}
return cloneRule;
}).sort(function(_ref, _ref2) {
var w1 = _ref.warningOnly, i1 = _ref.ruleIndex;
var w2 = _ref2.warningOnly, i2 = _ref2.ruleIndex;
if (!!w1 === !!w2) {
return i1 - i2;
}
if (w1) {
return 1;
}
return -1;
});
var summaryPromise;
if (validateFirst === true) {
summaryPromise = new Promise(/* @__PURE__ */ function() {
var _ref3 = _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime$3().mark(function _callee(resolve, reject) {
var i2, rule, errors;
return _regeneratorRuntime$3().wrap(function _callee$(_context) {
while (1)
switch (_context.prev = _context.next) {
case 0:
i2 = 0;
case 1:
if (!(i2 < filledRules.length)) {
_context.next = 12;
break;
}
rule = filledRules[i2];
_context.next = 5;
return validateRule(name2, value, rule, options, messageVariables);
case 5:
errors = _context.sent;
if (!errors.length) {
_context.next = 9;
break;
}
reject([{
errors,
rule
}]);
return _context.abrupt("return");
case 9:
i2 += 1;
_context.next = 1;
break;
case 12:
resolve([]);
case 13:
case "end":
return _context.stop();
}
}, _callee);
}));
return function(_x6, _x7) {
return _ref3.apply(this, arguments);
};
}());
} else {
var rulePromises = filledRules.map(function(rule) {
return validateRule(name2, value, rule, options, messageVariables).then(function(errors) {
return {
errors,
rule
};
});
});
summaryPromise = (validateFirst ? finishOnFirstFailed(rulePromises) : finishOnAllFailed(rulePromises)).then(function(errors) {
return Promise.reject(errors);
});
}
summaryPromise.catch(function(e2) {
return e2;
});
return summaryPromise;
}
function finishOnAllFailed(_x8) {
return _finishOnAllFailed.apply(this, arguments);
}
function _finishOnAllFailed() {
_finishOnAllFailed = _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime$3().mark(function _callee3(rulePromises) {
return _regeneratorRuntime$3().wrap(function _callee3$(_context3) {
while (1)
switch (_context3.prev = _context3.next) {
case 0:
return _context3.abrupt("return", Promise.all(rulePromises).then(function(errorsList) {
var _ref5;
var errors = (_ref5 = []).concat.apply(_ref5, _toConsumableArray$c(errorsList));
return errors;
}));
case 1:
case "end":
return _context3.stop();
}
}, _callee3);
}));
return _finishOnAllFailed.apply(this, arguments);
}
function finishOnFirstFailed(_x9) {
return _finishOnFirstFailed.apply(this, arguments);
}
function _finishOnFirstFailed() {
_finishOnFirstFailed = _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime$3().mark(function _callee4(rulePromises) {
var count;
return _regeneratorRuntime$3().wrap(function _callee4$(_context4) {
while (1)
switch (_context4.prev = _context4.next) {
case 0:
count = 0;
return _context4.abrupt("return", new Promise(function(resolve) {
rulePromises.forEach(function(promise) {
promise.then(function(ruleError) {
if (ruleError.errors.length) {
resolve([ruleError]);
}
count += 1;
if (count === rulePromises.length) {
resolve([]);
}
});
});
}));
case 2:
case "end":
return _context4.stop();
}
}, _callee4);
}));
return _finishOnFirstFailed.apply(this, arguments);
}
var _excluded$Q = ["name"];
var EMPTY_ERRORS = [];
function requireUpdate(shouldUpdate, prev, next, prevValue, nextValue, info) {
if (typeof shouldUpdate === "function") {
return shouldUpdate(prev, next, "source" in info ? {
source: info.source
} : {});
}
return prevValue !== nextValue;
}
var Field = /* @__PURE__ */ function(_React$Component) {
_inherits(Field2, _React$Component);
var _super = _createSuper(Field2);
function Field2(props) {
var _this2;
_classCallCheck(this, Field2);
_this2 = _super.call(this, props);
_this2.state = {
resetCount: 0
};
_this2.cancelRegisterFunc = null;
_this2.mounted = false;
_this2.touched = false;
_this2.dirty = false;
_this2.validatePromise = null;
_this2.prevValidating = void 0;
_this2.errors = EMPTY_ERRORS;
_this2.warnings = EMPTY_ERRORS;
_this2.cancelRegister = function() {
var _this$props = _this2.props, preserve = _this$props.preserve, isListField = _this$props.isListField, name2 = _this$props.name;
if (_this2.cancelRegisterFunc) {
_this2.cancelRegisterFunc(isListField, preserve, getNamePath(name2));
}
_this2.cancelRegisterFunc = null;
};
_this2.getNamePath = function() {
var _this$props2 = _this2.props, name2 = _this$props2.name, fieldContext = _this$props2.fieldContext;
var _fieldContext$prefixN = fieldContext.prefixName, prefixName = _fieldContext$prefixN === void 0 ? [] : _fieldContext$prefixN;
return name2 !== void 0 ? [].concat(_toConsumableArray$c(prefixName), _toConsumableArray$c(name2)) : [];
};
_this2.getRules = function() {
var _this$props3 = _this2.props, _this$props3$rules = _this$props3.rules, rules2 = _this$props3$rules === void 0 ? [] : _this$props3$rules, fieldContext = _this$props3.fieldContext;
return rules2.map(function(rule) {
if (typeof rule === "function") {
return rule(fieldContext);
}
return rule;
});
};
_this2.refresh = function() {
if (!_this2.mounted)
return;
_this2.setState(function(_ref) {
var resetCount = _ref.resetCount;
return {
resetCount: resetCount + 1
};
});
};
_this2.triggerMetaEvent = function(destroy) {
var onMetaChange = _this2.props.onMetaChange;
onMetaChange === null || onMetaChange === void 0 ? void 0 : onMetaChange(_objectSpread2$a(_objectSpread2$a({}, _this2.getMeta()), {}, {
destroy
}));
};
_this2.onStoreChange = function(prevStore, namePathList, info) {
var _this$props4 = _this2.props, shouldUpdate = _this$props4.shouldUpdate, _this$props4$dependen = _this$props4.dependencies, dependencies = _this$props4$dependen === void 0 ? [] : _this$props4$dependen, onReset = _this$props4.onReset;
var store2 = info.store;
var namePath = _this2.getNamePath();
var prevValue = _this2.getValue(prevStore);
var curValue = _this2.getValue(store2);
var namePathMatch = namePathList && containsNamePath(namePathList, namePath);
if (info.type === "valueUpdate" && info.source === "external" && prevValue !== curValue) {
_this2.touched = true;
_this2.dirty = true;
_this2.validatePromise = null;
_this2.errors = EMPTY_ERRORS;
_this2.warnings = EMPTY_ERRORS;
_this2.triggerMetaEvent();
}
switch (info.type) {
case "reset":
if (!namePathList || namePathMatch) {
_this2.touched = false;
_this2.dirty = false;
_this2.validatePromise = null;
_this2.errors = EMPTY_ERRORS;
_this2.warnings = EMPTY_ERRORS;
_this2.triggerMetaEvent();
onReset === null || onReset === void 0 ? void 0 : onReset();
_this2.refresh();
return;
}
break;
case "remove": {
if (shouldUpdate) {
_this2.reRender();
return;
}
break;
}
case "setField": {
if (namePathMatch) {
var data = info.data;
if ("touched" in data) {
_this2.touched = data.touched;
}
if ("validating" in data && !("originRCField" in data)) {
_this2.validatePromise = data.validating ? Promise.resolve([]) : null;
}
if ("errors" in data) {
_this2.errors = data.errors || EMPTY_ERRORS;
}
if ("warnings" in data) {
_this2.warnings = data.warnings || EMPTY_ERRORS;
}
_this2.dirty = true;
_this2.triggerMetaEvent();
_this2.reRender();
return;
}
if (shouldUpdate && !namePath.length && requireUpdate(shouldUpdate, prevStore, store2, prevValue, curValue, info)) {
_this2.reRender();
return;
}
break;
}
case "dependenciesUpdate": {
var dependencyList = dependencies.map(getNamePath);
if (dependencyList.some(function(dependency) {
return containsNamePath(info.relatedFields, dependency);
})) {
_this2.reRender();
return;
}
break;
}
default:
if (namePathMatch || (!dependencies.length || namePath.length || shouldUpdate) && requireUpdate(shouldUpdate, prevStore, store2, prevValue, curValue, info)) {
_this2.reRender();
return;
}
break;
}
if (shouldUpdate === true) {
_this2.reRender();
}
};
_this2.validateRules = function(options) {
var namePath = _this2.getNamePath();
var currentValue = _this2.getValue();
var rootPromise = Promise.resolve().then(function() {
if (!_this2.mounted) {
return [];
}
var _this$props5 = _this2.props, _this$props5$validate = _this$props5.validateFirst, validateFirst = _this$props5$validate === void 0 ? false : _this$props5$validate, messageVariables = _this$props5.messageVariables;
var _ref2 = options || {}, triggerName = _ref2.triggerName;
var filteredRules = _this2.getRules();
if (triggerName) {
filteredRules = filteredRules.filter(function(rule) {
return rule;
}).filter(function(rule) {
var validateTrigger = rule.validateTrigger;
if (!validateTrigger) {
return true;
}
var triggerList = toArray$8(validateTrigger);
return triggerList.includes(triggerName);
});
}
var promise = validateRules(namePath, currentValue, filteredRules, options, validateFirst, messageVariables);
promise.catch(function(e2) {
return e2;
}).then(function() {
var ruleErrors = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : EMPTY_ERRORS;
if (_this2.validatePromise === rootPromise) {
var _ruleErrors$forEach;
_this2.validatePromise = null;
var nextErrors = [];
var nextWarnings = [];
(_ruleErrors$forEach = ruleErrors.forEach) === null || _ruleErrors$forEach === void 0 ? void 0 : _ruleErrors$forEach.call(ruleErrors, function(_ref3) {
var warningOnly = _ref3.rule.warningOnly, _ref3$errors = _ref3.errors, errors = _ref3$errors === void 0 ? EMPTY_ERRORS : _ref3$errors;
if (warningOnly) {
nextWarnings.push.apply(nextWarnings, _toConsumableArray$c(errors));
} else {
nextErrors.push.apply(nextErrors, _toConsumableArray$c(errors));
}
});
_this2.errors = nextErrors;
_this2.warnings = nextWarnings;
_this2.triggerMetaEvent();
_this2.reRender();
}
});
return promise;
});
_this2.validatePromise = rootPromise;
_this2.dirty = true;
_this2.errors = EMPTY_ERRORS;
_this2.warnings = EMPTY_ERRORS;
_this2.triggerMetaEvent();
_this2.reRender();
return rootPromise;
};
_this2.isFieldValidating = function() {
return !!_this2.validatePromise;
};
_this2.isFieldTouched = function() {
return _this2.touched;
};
_this2.isFieldDirty = function() {
if (_this2.dirty || _this2.props.initialValue !== void 0) {
return true;
}
var fieldContext = _this2.props.fieldContext;
var _fieldContext$getInte = fieldContext.getInternalHooks(HOOK_MARK), getInitialValue = _fieldContext$getInte.getInitialValue;
if (getInitialValue(_this2.getNamePath()) !== void 0) {
return true;
}
return false;
};
_this2.getErrors = function() {
return _this2.errors;
};
_this2.getWarnings = function() {
return _this2.warnings;
};
_this2.isListField = function() {
return _this2.props.isListField;
};
_this2.isList = function() {
return _this2.props.isList;
};
_this2.isPreserve = function() {
return _this2.props.preserve;
};
_this2.getMeta = function() {
_this2.prevValidating = _this2.isFieldValidating();
var meta2 = {
touched: _this2.isFieldTouched(),
validating: _this2.prevValidating,
errors: _this2.errors,
warnings: _this2.warnings,
name: _this2.getNamePath()
};
return meta2;
};
_this2.getOnlyChild = function(children) {
if (typeof children === "function") {
var meta2 = _this2.getMeta();
return _objectSpread2$a(_objectSpread2$a({}, _this2.getOnlyChild(children(_this2.getControlled(), meta2, _this2.props.fieldContext))), {}, {
isFunction: true
});
}
var childList = toArray$9(children);
if (childList.length !== 1 || !/* @__PURE__ */ React__namespace.isValidElement(childList[0])) {
return {
child: childList,
isFunction: false
};
}
return {
child: childList[0],
isFunction: false
};
};
_this2.getValue = function(store2) {
var getFieldsValue = _this2.props.fieldContext.getFieldsValue;
var namePath = _this2.getNamePath();
return getValue$5(store2 || getFieldsValue(true), namePath);
};
_this2.getControlled = function() {
var childProps = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
var _this$props6 = _this2.props, trigger = _this$props6.trigger, validateTrigger = _this$props6.validateTrigger, getValueFromEvent = _this$props6.getValueFromEvent, normalize2 = _this$props6.normalize, valuePropName = _this$props6.valuePropName, getValueProps = _this$props6.getValueProps, fieldContext = _this$props6.fieldContext;
var mergedValidateTrigger = validateTrigger !== void 0 ? validateTrigger : fieldContext.validateTrigger;
var namePath = _this2.getNamePath();
var getInternalHooks2 = fieldContext.getInternalHooks, getFieldsValue = fieldContext.getFieldsValue;
var _getInternalHooks = getInternalHooks2(HOOK_MARK), dispatch = _getInternalHooks.dispatch;
var value = _this2.getValue();
var mergedGetValueProps = getValueProps || function(val) {
return _defineProperty$b({}, valuePropName, val);
};
var originTriggerFunc = childProps[trigger];
var control = _objectSpread2$a(_objectSpread2$a({}, childProps), mergedGetValueProps(value));
control[trigger] = function() {
_this2.touched = true;
_this2.dirty = true;
_this2.triggerMetaEvent();
var newValue;
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
if (getValueFromEvent) {
newValue = getValueFromEvent.apply(void 0, args);
} else {
newValue = defaultGetValueFromEvent.apply(void 0, [valuePropName].concat(args));
}
if (normalize2) {
newValue = normalize2(newValue, value, getFieldsValue(true));
}
dispatch({
type: "updateValue",
namePath,
value: newValue
});
if (originTriggerFunc) {
originTriggerFunc.apply(void 0, args);
}
};
var validateTriggerList = toArray$8(mergedValidateTrigger || []);
validateTriggerList.forEach(function(triggerName) {
var originTrigger = control[triggerName];
control[triggerName] = function() {
if (originTrigger) {
originTrigger.apply(void 0, arguments);
}
var rules2 = _this2.props.rules;
if (rules2 && rules2.length) {
dispatch({
type: "validateField",
namePath,
triggerName
});
}
};
});
return control;
};
if (props.fieldContext) {
var getInternalHooks = props.fieldContext.getInternalHooks;
var _getInternalHooks2 = getInternalHooks(HOOK_MARK), initEntityValue = _getInternalHooks2.initEntityValue;
initEntityValue(_assertThisInitialized(_this2));
}
return _this2;
}
_createClass(Field2, [{
key: "componentDidMount",
value: function componentDidMount() {
var _this$props7 = this.props, shouldUpdate = _this$props7.shouldUpdate, fieldContext = _this$props7.fieldContext;
this.mounted = true;
if (fieldContext) {
var getInternalHooks = fieldContext.getInternalHooks;
var _getInternalHooks3 = getInternalHooks(HOOK_MARK), registerField = _getInternalHooks3.registerField;
this.cancelRegisterFunc = registerField(this);
}
if (shouldUpdate === true) {
this.reRender();
}
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
this.cancelRegister();
this.triggerMetaEvent(true);
this.mounted = false;
}
}, {
key: "reRender",
value: function reRender() {
if (!this.mounted)
return;
this.forceUpdate();
}
}, {
key: "render",
value: function render2() {
this.state.resetCount;
var children = this.props.children;
var _this$getOnlyChild = this.getOnlyChild(children), child = _this$getOnlyChild.child, isFunction2 = _this$getOnlyChild.isFunction;
var returnChildNode;
if (isFunction2) {
returnChildNode = child;
} else if (/* @__PURE__ */ React__namespace.isValidElement(child)) {
returnChildNode = /* @__PURE__ */ React__namespace.cloneElement(child, this.getControlled(child.props));
} else {
warningOnce(!child, "`children` of Field is not validate ReactElement.");
returnChildNode = child;
}
return /* @__PURE__ */ jsx(Fragment, {
children: returnChildNode
});
}
}]);
return Field2;
}(React__namespace.Component);
Field.contextType = Context$2;
Field.defaultProps = {
trigger: "onChange",
valuePropName: "value"
};
function WrapperField(_ref5) {
var name2 = _ref5.name, restProps = _objectWithoutProperties$1(_ref5, _excluded$Q);
var fieldContext = React__namespace.useContext(Context$2);
var namePath = name2 !== void 0 ? getNamePath(name2) : void 0;
var key2 = "keep";
if (!restProps.isListField) {
key2 = "_".concat((namePath || []).join("_"));
}
return /* @__PURE__ */ jsx(Field, {
name: namePath,
...restProps,
fieldContext
}, key2);
}
var ListContext = /* @__PURE__ */ React__namespace.createContext(null);
var List$2 = function List2(_ref) {
var name2 = _ref.name, initialValue = _ref.initialValue, children = _ref.children, rules2 = _ref.rules, validateTrigger = _ref.validateTrigger;
var context2 = React__namespace.useContext(Context$2);
var keyRef = React__namespace.useRef({
keys: [],
id: 0
});
var keyManager = keyRef.current;
var prefixName = React__namespace.useMemo(function() {
var parentPrefixName = getNamePath(context2.prefixName) || [];
return [].concat(_toConsumableArray$c(parentPrefixName), _toConsumableArray$c(getNamePath(name2)));
}, [context2.prefixName, name2]);
var fieldContext = React__namespace.useMemo(function() {
return _objectSpread2$a(_objectSpread2$a({}, context2), {}, {
prefixName
});
}, [context2, prefixName]);
var listContext = React__namespace.useMemo(function() {
return {
getKey: function getKey2(namePath) {
var len = prefixName.length;
var pathName = namePath[len];
return [keyManager.keys[pathName], namePath.slice(len + 1)];
}
};
}, [prefixName]);
if (typeof children !== "function") {
warningOnce(false, "Form.List only accepts function as children.");
return null;
}
var shouldUpdate = function shouldUpdate2(prevValue, nextValue, _ref2) {
var source = _ref2.source;
if (source === "internal") {
return false;
}
return prevValue !== nextValue;
};
return /* @__PURE__ */ jsx(ListContext.Provider, {
value: listContext,
children: /* @__PURE__ */ jsx(Context$2.Provider, {
value: fieldContext,
children: /* @__PURE__ */ jsx(WrapperField, {
name: [],
shouldUpdate,
rules: rules2,
validateTrigger,
initialValue,
isList: true,
children: function(_ref3, meta2) {
var _ref3$value = _ref3.value, value = _ref3$value === void 0 ? [] : _ref3$value, onChange = _ref3.onChange;
var getFieldValue = context2.getFieldValue;
var getNewValue = function getNewValue2() {
var values = getFieldValue(prefixName || []);
return values || [];
};
var operations = {
add: function add(defaultValue, index2) {
var newValue = getNewValue();
if (index2 >= 0 && index2 <= newValue.length) {
keyManager.keys = [].concat(_toConsumableArray$c(keyManager.keys.slice(0, index2)), [keyManager.id], _toConsumableArray$c(keyManager.keys.slice(index2)));
onChange([].concat(_toConsumableArray$c(newValue.slice(0, index2)), [defaultValue], _toConsumableArray$c(newValue.slice(index2))));
} else {
keyManager.keys = [].concat(_toConsumableArray$c(keyManager.keys), [keyManager.id]);
onChange([].concat(_toConsumableArray$c(newValue), [defaultValue]));
}
keyManager.id += 1;
},
remove: function remove(index2) {
var newValue = getNewValue();
var indexSet = new Set(Array.isArray(index2) ? index2 : [index2]);
if (indexSet.size <= 0) {
return;
}
keyManager.keys = keyManager.keys.filter(function(_, keysIndex) {
return !indexSet.has(keysIndex);
});
onChange(newValue.filter(function(_, valueIndex) {
return !indexSet.has(valueIndex);
}));
},
move: function move$1(from, to) {
if (from === to) {
return;
}
var newValue = getNewValue();
if (from < 0 || from >= newValue.length || to < 0 || to >= newValue.length) {
return;
}
keyManager.keys = move(keyManager.keys, from, to);
onChange(move(newValue, from, to));
}
};
var listValue = value || [];
if (!Array.isArray(listValue)) {
listValue = [];
}
return children(listValue.map(function(__, index2) {
var key2 = keyManager.keys[index2];
if (key2 === void 0) {
keyManager.keys[index2] = keyManager.id;
key2 = keyManager.keys[index2];
keyManager.id += 1;
}
return {
name: index2,
key: key2,
isListField: true
};
}), operations, meta2);
}
})
})
});
};
function _iterableToArrayLimit$e(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i["return"] && (_r = _i["return"](), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _slicedToArray$e(arr, i2) {
return _arrayWithHoles$f(arr) || _iterableToArrayLimit$e(arr, i2) || _unsupportedIterableToArray$l(arr, i2) || _nonIterableRest$f();
}
function allPromiseFinish(promiseList) {
var hasError = false;
var count = promiseList.length;
var results = [];
if (!promiseList.length) {
return Promise.resolve([]);
}
return new Promise(function(resolve, reject) {
promiseList.forEach(function(promise, index2) {
promise.catch(function(e2) {
hasError = true;
return e2;
}).then(function(result) {
count -= 1;
results[index2] = result;
if (count > 0) {
return;
}
if (hasError) {
reject(results);
}
resolve(results);
});
});
});
}
var SPLIT = "__@field_split__";
function normalize(namePath) {
return namePath.map(function(cell) {
return "".concat(_typeof$q(cell), ":").concat(cell);
}).join(SPLIT);
}
var NameMap = /* @__PURE__ */ function() {
function NameMap2() {
_classCallCheck(this, NameMap2);
this.kvs = /* @__PURE__ */ new Map();
}
_createClass(NameMap2, [{
key: "set",
value: function set2(key2, value) {
this.kvs.set(normalize(key2), value);
}
}, {
key: "get",
value: function get2(key2) {
return this.kvs.get(normalize(key2));
}
}, {
key: "update",
value: function update(key2, updater) {
var origin = this.get(key2);
var next = updater(origin);
if (!next) {
this.delete(key2);
} else {
this.set(key2, next);
}
}
}, {
key: "delete",
value: function _delete(key2) {
this.kvs.delete(normalize(key2));
}
}, {
key: "map",
value: function map(callback) {
return _toConsumableArray$c(this.kvs.entries()).map(function(_ref) {
var _ref2 = _slicedToArray$e(_ref, 2), key2 = _ref2[0], value = _ref2[1];
var cells = key2.split(SPLIT);
return callback({
key: cells.map(function(cell) {
var _cell$match = cell.match(/^([^:]*):(.*)$/), _cell$match2 = _slicedToArray$e(_cell$match, 3), type2 = _cell$match2[1], unit = _cell$match2[2];
return type2 === "number" ? Number(unit) : unit;
}),
value
});
});
}
}, {
key: "toJSON",
value: function toJSON() {
var json = {};
this.map(function(_ref3) {
var key2 = _ref3.key, value = _ref3.value;
json[key2.join(".")] = value;
return null;
});
return json;
}
}]);
return NameMap2;
}();
var _excluded$P = ["name", "errors"];
var FormStore = /* @__PURE__ */ _createClass(function FormStore2(forceRootUpdate) {
var _this2 = this;
_classCallCheck(this, FormStore2);
this.formHooked = false;
this.forceRootUpdate = void 0;
this.subscribable = true;
this.store = {};
this.fieldEntities = [];
this.initialValues = {};
this.callbacks = {};
this.validateMessages = null;
this.preserve = null;
this.lastValidatePromise = null;
this.getForm = function() {
return {
getFieldValue: _this2.getFieldValue,
getFieldsValue: _this2.getFieldsValue,
getFieldError: _this2.getFieldError,
getFieldWarning: _this2.getFieldWarning,
getFieldsError: _this2.getFieldsError,
isFieldsTouched: _this2.isFieldsTouched,
isFieldTouched: _this2.isFieldTouched,
isFieldValidating: _this2.isFieldValidating,
isFieldsValidating: _this2.isFieldsValidating,
resetFields: _this2.resetFields,
setFields: _this2.setFields,
setFieldValue: _this2.setFieldValue,
setFieldsValue: _this2.setFieldsValue,
validateFields: _this2.validateFields,
submit: _this2.submit,
_init: true,
getInternalHooks: _this2.getInternalHooks
};
};
this.getInternalHooks = function(key2) {
if (key2 === HOOK_MARK) {
_this2.formHooked = true;
return {
dispatch: _this2.dispatch,
initEntityValue: _this2.initEntityValue,
registerField: _this2.registerField,
useSubscribe: _this2.useSubscribe,
setInitialValues: _this2.setInitialValues,
destroyForm: _this2.destroyForm,
setCallbacks: _this2.setCallbacks,
setValidateMessages: _this2.setValidateMessages,
getFields: _this2.getFields,
setPreserve: _this2.setPreserve,
getInitialValue: _this2.getInitialValue,
registerWatch: _this2.registerWatch
};
}
warningOnce(false, "`getInternalHooks` is internal usage. Should not call directly.");
return null;
};
this.useSubscribe = function(subscribable) {
_this2.subscribable = subscribable;
};
this.prevWithoutPreserves = null;
this.setInitialValues = function(initialValues, init2) {
_this2.initialValues = initialValues || {};
if (init2) {
var _this$prevWithoutPres;
var nextStore = setValues({}, initialValues, _this2.store);
(_this$prevWithoutPres = _this2.prevWithoutPreserves) === null || _this$prevWithoutPres === void 0 ? void 0 : _this$prevWithoutPres.map(function(_ref) {
var namePath = _ref.key;
nextStore = setValue(nextStore, namePath, getValue$5(initialValues, namePath));
});
_this2.prevWithoutPreserves = null;
_this2.updateStore(nextStore);
}
};
this.destroyForm = function() {
var prevWithoutPreserves = new NameMap();
_this2.getFieldEntities(true).forEach(function(entity) {
if (!_this2.isMergedPreserve(entity.isPreserve())) {
prevWithoutPreserves.set(entity.getNamePath(), true);
}
});
_this2.prevWithoutPreserves = prevWithoutPreserves;
};
this.getInitialValue = function(namePath) {
var initValue = getValue$5(_this2.initialValues, namePath);
return namePath.length ? cloneDeep$1(initValue) : initValue;
};
this.setCallbacks = function(callbacks) {
_this2.callbacks = callbacks;
};
this.setValidateMessages = function(validateMessages) {
_this2.validateMessages = validateMessages;
};
this.setPreserve = function(preserve) {
_this2.preserve = preserve;
};
this.watchList = [];
this.registerWatch = function(callback) {
_this2.watchList.push(callback);
return function() {
_this2.watchList = _this2.watchList.filter(function(fn) {
return fn !== callback;
});
};
};
this.notifyWatch = function() {
var namePath = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : [];
if (_this2.watchList.length) {
var values = _this2.getFieldsValue();
_this2.watchList.forEach(function(callback) {
callback(values, namePath);
});
}
};
this.timeoutId = null;
this.warningUnhooked = function() {
};
this.updateStore = function(nextStore) {
_this2.store = nextStore;
};
this.getFieldEntities = function() {
var pure = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : false;
if (!pure) {
return _this2.fieldEntities;
}
return _this2.fieldEntities.filter(function(field) {
return field.getNamePath().length;
});
};
this.getFieldsMap = function() {
var pure = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : false;
var cache = new NameMap();
_this2.getFieldEntities(pure).forEach(function(field) {
var namePath = field.getNamePath();
cache.set(namePath, field);
});
return cache;
};
this.getFieldEntitiesForNamePathList = function(nameList) {
if (!nameList) {
return _this2.getFieldEntities(true);
}
var cache = _this2.getFieldsMap(true);
return nameList.map(function(name2) {
var namePath = getNamePath(name2);
return cache.get(namePath) || {
INVALIDATE_NAME_PATH: getNamePath(name2)
};
});
};
this.getFieldsValue = function(nameList, filterFunc) {
_this2.warningUnhooked();
if (nameList === true && !filterFunc) {
return _this2.store;
}
var fieldEntities = _this2.getFieldEntitiesForNamePathList(Array.isArray(nameList) ? nameList : null);
var filteredNameList = [];
fieldEntities.forEach(function(entity) {
var _entity$isListField;
var namePath = "INVALIDATE_NAME_PATH" in entity ? entity.INVALIDATE_NAME_PATH : entity.getNamePath();
if (!nameList && ((_entity$isListField = entity.isListField) === null || _entity$isListField === void 0 ? void 0 : _entity$isListField.call(entity))) {
return;
}
if (!filterFunc) {
filteredNameList.push(namePath);
} else {
var meta2 = "getMeta" in entity ? entity.getMeta() : null;
if (filterFunc(meta2)) {
filteredNameList.push(namePath);
}
}
});
return cloneByNamePathList(_this2.store, filteredNameList.map(getNamePath));
};
this.getFieldValue = function(name2) {
_this2.warningUnhooked();
var namePath = getNamePath(name2);
return getValue$5(_this2.store, namePath);
};
this.getFieldsError = function(nameList) {
_this2.warningUnhooked();
var fieldEntities = _this2.getFieldEntitiesForNamePathList(nameList);
return fieldEntities.map(function(entity, index2) {
if (entity && !("INVALIDATE_NAME_PATH" in entity)) {
return {
name: entity.getNamePath(),
errors: entity.getErrors(),
warnings: entity.getWarnings()
};
}
return {
name: getNamePath(nameList[index2]),
errors: [],
warnings: []
};
});
};
this.getFieldError = function(name2) {
_this2.warningUnhooked();
var namePath = getNamePath(name2);
var fieldError = _this2.getFieldsError([namePath])[0];
return fieldError.errors;
};
this.getFieldWarning = function(name2) {
_this2.warningUnhooked();
var namePath = getNamePath(name2);
var fieldError = _this2.getFieldsError([namePath])[0];
return fieldError.warnings;
};
this.isFieldsTouched = function() {
_this2.warningUnhooked();
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
var arg0 = args[0], arg1 = args[1];
var namePathList;
var isAllFieldsTouched = false;
if (args.length === 0) {
namePathList = null;
} else if (args.length === 1) {
if (Array.isArray(arg0)) {
namePathList = arg0.map(getNamePath);
isAllFieldsTouched = false;
} else {
namePathList = null;
isAllFieldsTouched = arg0;
}
} else {
namePathList = arg0.map(getNamePath);
isAllFieldsTouched = arg1;
}
var fieldEntities = _this2.getFieldEntities(true);
var isFieldTouched = function isFieldTouched2(field) {
return field.isFieldTouched();
};
if (!namePathList) {
return isAllFieldsTouched ? fieldEntities.every(isFieldTouched) : fieldEntities.some(isFieldTouched);
}
var map = new NameMap();
namePathList.forEach(function(shortNamePath) {
map.set(shortNamePath, []);
});
fieldEntities.forEach(function(field) {
var fieldNamePath = field.getNamePath();
namePathList.forEach(function(shortNamePath) {
if (shortNamePath.every(function(nameUnit, i2) {
return fieldNamePath[i2] === nameUnit;
})) {
map.update(shortNamePath, function(list) {
return [].concat(_toConsumableArray$c(list), [field]);
});
}
});
});
var isNamePathListTouched = function isNamePathListTouched2(entities) {
return entities.some(isFieldTouched);
};
var namePathListEntities = map.map(function(_ref2) {
var value = _ref2.value;
return value;
});
return isAllFieldsTouched ? namePathListEntities.every(isNamePathListTouched) : namePathListEntities.some(isNamePathListTouched);
};
this.isFieldTouched = function(name2) {
_this2.warningUnhooked();
return _this2.isFieldsTouched([name2]);
};
this.isFieldsValidating = function(nameList) {
_this2.warningUnhooked();
var fieldEntities = _this2.getFieldEntities();
if (!nameList) {
return fieldEntities.some(function(testField) {
return testField.isFieldValidating();
});
}
var namePathList = nameList.map(getNamePath);
return fieldEntities.some(function(testField) {
var fieldNamePath = testField.getNamePath();
return containsNamePath(namePathList, fieldNamePath) && testField.isFieldValidating();
});
};
this.isFieldValidating = function(name2) {
_this2.warningUnhooked();
return _this2.isFieldsValidating([name2]);
};
this.resetWithFieldInitialValue = function() {
var info = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
var cache = new NameMap();
var fieldEntities = _this2.getFieldEntities(true);
fieldEntities.forEach(function(field) {
var initialValue = field.props.initialValue;
var namePath = field.getNamePath();
if (initialValue !== void 0) {
var records = cache.get(namePath) || /* @__PURE__ */ new Set();
records.add({
entity: field,
value: initialValue
});
cache.set(namePath, records);
}
});
var resetWithFields = function resetWithFields2(entities) {
entities.forEach(function(field) {
var initialValue = field.props.initialValue;
if (initialValue !== void 0) {
var namePath = field.getNamePath();
var formInitialValue = _this2.getInitialValue(namePath);
if (formInitialValue !== void 0) {
warningOnce(false, "Form already set 'initialValues' with path '".concat(namePath.join("."), "'. Field can not overwrite it."));
} else {
var records = cache.get(namePath);
if (records && records.size > 1) {
warningOnce(false, "Multiple Field with path '".concat(namePath.join("."), "' set 'initialValue'. Can not decide which one to pick."));
} else if (records) {
var originValue = _this2.getFieldValue(namePath);
if (!info.skipExist || originValue === void 0) {
_this2.updateStore(setValue(_this2.store, namePath, _toConsumableArray$c(records)[0].value));
}
}
}
}
});
};
var requiredFieldEntities;
if (info.entities) {
requiredFieldEntities = info.entities;
} else if (info.namePathList) {
requiredFieldEntities = [];
info.namePathList.forEach(function(namePath) {
var records = cache.get(namePath);
if (records) {
var _requiredFieldEntitie;
(_requiredFieldEntitie = requiredFieldEntities).push.apply(_requiredFieldEntitie, _toConsumableArray$c(_toConsumableArray$c(records).map(function(r2) {
return r2.entity;
})));
}
});
} else {
requiredFieldEntities = fieldEntities;
}
resetWithFields(requiredFieldEntities);
};
this.resetFields = function(nameList) {
_this2.warningUnhooked();
var prevStore = _this2.store;
if (!nameList) {
_this2.updateStore(setValues({}, _this2.initialValues));
_this2.resetWithFieldInitialValue();
_this2.notifyObservers(prevStore, null, {
type: "reset"
});
_this2.notifyWatch();
return;
}
var namePathList = nameList.map(getNamePath);
namePathList.forEach(function(namePath) {
var initialValue = _this2.getInitialValue(namePath);
_this2.updateStore(setValue(_this2.store, namePath, initialValue));
});
_this2.resetWithFieldInitialValue({
namePathList
});
_this2.notifyObservers(prevStore, namePathList, {
type: "reset"
});
_this2.notifyWatch(namePathList);
};
this.setFields = function(fields) {
_this2.warningUnhooked();
var prevStore = _this2.store;
var namePathList = [];
fields.forEach(function(fieldData) {
var name2 = fieldData.name;
fieldData.errors;
var data = _objectWithoutProperties$1(fieldData, _excluded$P);
var namePath = getNamePath(name2);
namePathList.push(namePath);
if ("value" in data) {
_this2.updateStore(setValue(_this2.store, namePath, data.value));
}
_this2.notifyObservers(prevStore, [namePath], {
type: "setField",
data: fieldData
});
});
_this2.notifyWatch(namePathList);
};
this.getFields = function() {
var entities = _this2.getFieldEntities(true);
var fields = entities.map(function(field) {
var namePath = field.getNamePath();
var meta2 = field.getMeta();
var fieldData = _objectSpread2$a(_objectSpread2$a({}, meta2), {}, {
name: namePath,
value: _this2.getFieldValue(namePath)
});
Object.defineProperty(fieldData, "originRCField", {
value: true
});
return fieldData;
});
return fields;
};
this.initEntityValue = function(entity) {
var initialValue = entity.props.initialValue;
if (initialValue !== void 0) {
var namePath = entity.getNamePath();
var prevValue = getValue$5(_this2.store, namePath);
if (prevValue === void 0) {
_this2.updateStore(setValue(_this2.store, namePath, initialValue));
}
}
};
this.isMergedPreserve = function(fieldPreserve) {
var mergedPreserve = fieldPreserve !== void 0 ? fieldPreserve : _this2.preserve;
return mergedPreserve !== null && mergedPreserve !== void 0 ? mergedPreserve : true;
};
this.registerField = function(entity) {
_this2.fieldEntities.push(entity);
var namePath = entity.getNamePath();
_this2.notifyWatch([namePath]);
if (entity.props.initialValue !== void 0) {
var prevStore = _this2.store;
_this2.resetWithFieldInitialValue({
entities: [entity],
skipExist: true
});
_this2.notifyObservers(prevStore, [entity.getNamePath()], {
type: "valueUpdate",
source: "internal"
});
}
return function(isListField, preserve) {
var subNamePath = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : [];
_this2.fieldEntities = _this2.fieldEntities.filter(function(item) {
return item !== entity;
});
if (!_this2.isMergedPreserve(preserve) && (!isListField || subNamePath.length > 1)) {
var defaultValue = isListField ? void 0 : _this2.getInitialValue(namePath);
if (namePath.length && _this2.getFieldValue(namePath) !== defaultValue && _this2.fieldEntities.every(function(field) {
return !matchNamePath(field.getNamePath(), namePath);
})) {
var _prevStore = _this2.store;
_this2.updateStore(setValue(_prevStore, namePath, defaultValue, true));
_this2.notifyObservers(_prevStore, [namePath], {
type: "remove"
});
_this2.triggerDependenciesUpdate(_prevStore, namePath);
}
}
_this2.notifyWatch([namePath]);
};
};
this.dispatch = function(action) {
switch (action.type) {
case "updateValue": {
var namePath = action.namePath, value = action.value;
_this2.updateValue(namePath, value);
break;
}
case "validateField": {
var _namePath = action.namePath, triggerName = action.triggerName;
_this2.validateFields([_namePath], {
triggerName
});
break;
}
}
};
this.notifyObservers = function(prevStore, namePathList, info) {
if (_this2.subscribable) {
var mergedInfo = _objectSpread2$a(_objectSpread2$a({}, info), {}, {
store: _this2.getFieldsValue(true)
});
_this2.getFieldEntities().forEach(function(_ref3) {
var onStoreChange = _ref3.onStoreChange;
onStoreChange(prevStore, namePathList, mergedInfo);
});
} else {
_this2.forceRootUpdate();
}
};
this.triggerDependenciesUpdate = function(prevStore, namePath) {
var childrenFields = _this2.getDependencyChildrenFields(namePath);
if (childrenFields.length) {
_this2.validateFields(childrenFields);
}
_this2.notifyObservers(prevStore, childrenFields, {
type: "dependenciesUpdate",
relatedFields: [namePath].concat(_toConsumableArray$c(childrenFields))
});
return childrenFields;
};
this.updateValue = function(name2, value) {
var namePath = getNamePath(name2);
var prevStore = _this2.store;
_this2.updateStore(setValue(_this2.store, namePath, value));
_this2.notifyObservers(prevStore, [namePath], {
type: "valueUpdate",
source: "internal"
});
_this2.notifyWatch([namePath]);
var childrenFields = _this2.triggerDependenciesUpdate(prevStore, namePath);
var onValuesChange = _this2.callbacks.onValuesChange;
if (onValuesChange) {
var changedValues = cloneByNamePathList(_this2.store, [namePath]);
onValuesChange(changedValues, _this2.getFieldsValue());
}
_this2.triggerOnFieldsChange([namePath].concat(_toConsumableArray$c(childrenFields)));
};
this.setFieldsValue = function(store2) {
_this2.warningUnhooked();
var prevStore = _this2.store;
if (store2) {
var nextStore = setValues(_this2.store, store2);
_this2.updateStore(nextStore);
}
_this2.notifyObservers(prevStore, null, {
type: "valueUpdate",
source: "external"
});
_this2.notifyWatch();
};
this.setFieldValue = function(name2, value) {
_this2.setFields([{
name: name2,
value
}]);
};
this.getDependencyChildrenFields = function(rootNamePath) {
var children = /* @__PURE__ */ new Set();
var childrenFields = [];
var dependencies2fields = new NameMap();
_this2.getFieldEntities().forEach(function(field) {
var dependencies = field.props.dependencies;
(dependencies || []).forEach(function(dependency) {
var dependencyNamePath = getNamePath(dependency);
dependencies2fields.update(dependencyNamePath, function() {
var fields = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : /* @__PURE__ */ new Set();
fields.add(field);
return fields;
});
});
});
var fillChildren = function fillChildren2(namePath) {
var fields = dependencies2fields.get(namePath) || /* @__PURE__ */ new Set();
fields.forEach(function(field) {
if (!children.has(field)) {
children.add(field);
var fieldNamePath = field.getNamePath();
if (field.isFieldDirty() && fieldNamePath.length) {
childrenFields.push(fieldNamePath);
fillChildren2(fieldNamePath);
}
}
});
};
fillChildren(rootNamePath);
return childrenFields;
};
this.triggerOnFieldsChange = function(namePathList, filedErrors) {
var onFieldsChange = _this2.callbacks.onFieldsChange;
if (onFieldsChange) {
var fields = _this2.getFields();
if (filedErrors) {
var cache = new NameMap();
filedErrors.forEach(function(_ref4) {
var name2 = _ref4.name, errors = _ref4.errors;
cache.set(name2, errors);
});
fields.forEach(function(field) {
field.errors = cache.get(field.name) || field.errors;
});
}
var changedFields = fields.filter(function(_ref5) {
var fieldName = _ref5.name;
return containsNamePath(namePathList, fieldName);
});
onFieldsChange(changedFields, fields);
}
};
this.validateFields = function(nameList, options) {
_this2.warningUnhooked();
var provideNameList = !!nameList;
var namePathList = provideNameList ? nameList.map(getNamePath) : [];
var promiseList = [];
_this2.getFieldEntities(true).forEach(function(field) {
if (!provideNameList) {
namePathList.push(field.getNamePath());
}
if ((options === null || options === void 0 ? void 0 : options.recursive) && provideNameList) {
var namePath = field.getNamePath();
if (namePath.every(function(nameUnit, i2) {
return nameList[i2] === nameUnit || nameList[i2] === void 0;
})) {
namePathList.push(namePath);
}
}
if (!field.props.rules || !field.props.rules.length) {
return;
}
var fieldNamePath = field.getNamePath();
if (!provideNameList || containsNamePath(namePathList, fieldNamePath)) {
var promise = field.validateRules(_objectSpread2$a({
validateMessages: _objectSpread2$a(_objectSpread2$a({}, defaultValidateMessages), _this2.validateMessages)
}, options));
promiseList.push(promise.then(function() {
return {
name: fieldNamePath,
errors: [],
warnings: []
};
}).catch(function(ruleErrors) {
var _ruleErrors$forEach;
var mergedErrors = [];
var mergedWarnings = [];
(_ruleErrors$forEach = ruleErrors.forEach) === null || _ruleErrors$forEach === void 0 ? void 0 : _ruleErrors$forEach.call(ruleErrors, function(_ref6) {
var warningOnly = _ref6.rule.warningOnly, errors = _ref6.errors;
if (warningOnly) {
mergedWarnings.push.apply(mergedWarnings, _toConsumableArray$c(errors));
} else {
mergedErrors.push.apply(mergedErrors, _toConsumableArray$c(errors));
}
});
if (mergedErrors.length) {
return Promise.reject({
name: fieldNamePath,
errors: mergedErrors,
warnings: mergedWarnings
});
}
return {
name: fieldNamePath,
errors: mergedErrors,
warnings: mergedWarnings
};
}));
}
});
var summaryPromise = allPromiseFinish(promiseList);
_this2.lastValidatePromise = summaryPromise;
summaryPromise.catch(function(results) {
return results;
}).then(function(results) {
var resultNamePathList = results.map(function(_ref7) {
var name2 = _ref7.name;
return name2;
});
_this2.notifyObservers(_this2.store, resultNamePathList, {
type: "validateFinish"
});
_this2.triggerOnFieldsChange(resultNamePathList, results);
});
var returnPromise = summaryPromise.then(function() {
if (_this2.lastValidatePromise === summaryPromise) {
return Promise.resolve(_this2.getFieldsValue(namePathList));
}
return Promise.reject([]);
}).catch(function(results) {
var errorList = results.filter(function(result) {
return result && result.errors.length;
});
return Promise.reject({
values: _this2.getFieldsValue(namePathList),
errorFields: errorList,
outOfDate: _this2.lastValidatePromise !== summaryPromise
});
});
returnPromise.catch(function(e2) {
return e2;
});
return returnPromise;
};
this.submit = function() {
_this2.warningUnhooked();
_this2.validateFields().then(function(values) {
var onFinish = _this2.callbacks.onFinish;
if (onFinish) {
try {
onFinish(values);
} catch (err) {
console.error(err);
}
}
}).catch(function(e2) {
var onFinishFailed = _this2.callbacks.onFinishFailed;
if (onFinishFailed) {
onFinishFailed(e2);
}
});
};
this.forceRootUpdate = forceRootUpdate;
});
function useForm$2(form) {
var formRef = React__namespace.useRef();
var _React$useState = React__namespace.useState({}), _React$useState2 = _slicedToArray$e(_React$useState, 2), forceUpdate = _React$useState2[1];
if (!formRef.current) {
if (form) {
formRef.current = form;
} else {
var forceReRender = function forceReRender2() {
forceUpdate({});
};
var formStore = new FormStore(forceReRender);
formRef.current = formStore.getForm();
}
}
return [formRef.current];
}
var FormContext$1 = /* @__PURE__ */ React__namespace.createContext({
triggerFormChange: function triggerFormChange() {
},
triggerFormFinish: function triggerFormFinish() {
},
registerForm: function registerForm() {
},
unregisterForm: function unregisterForm() {
}
});
var FormProvider$1 = function FormProvider2(_ref) {
var validateMessages = _ref.validateMessages, onFormChange = _ref.onFormChange, onFormFinish = _ref.onFormFinish, children = _ref.children;
var formContext = React__namespace.useContext(FormContext$1);
var formsRef = React__namespace.useRef({});
return /* @__PURE__ */ jsx(FormContext$1.Provider, {
value: _objectSpread2$a(_objectSpread2$a({}, formContext), {}, {
validateMessages: _objectSpread2$a(_objectSpread2$a({}, formContext.validateMessages), validateMessages),
triggerFormChange: function triggerFormChange(name2, changedFields) {
if (onFormChange) {
onFormChange(name2, {
changedFields,
forms: formsRef.current
});
}
formContext.triggerFormChange(name2, changedFields);
},
triggerFormFinish: function triggerFormFinish(name2, values) {
if (onFormFinish) {
onFormFinish(name2, {
values,
forms: formsRef.current
});
}
formContext.triggerFormFinish(name2, values);
},
registerForm: function registerForm(name2, form) {
if (name2) {
formsRef.current = _objectSpread2$a(_objectSpread2$a({}, formsRef.current), {}, _defineProperty$b({}, name2, form));
}
formContext.registerForm(name2, form);
},
unregisterForm: function unregisterForm(name2) {
var newForms = _objectSpread2$a({}, formsRef.current);
delete newForms[name2];
formsRef.current = newForms;
formContext.unregisterForm(name2);
}
}),
children
});
};
var _excluded$O = ["name", "initialValues", "fields", "form", "preserve", "children", "component", "validateMessages", "validateTrigger", "onValuesChange", "onFieldsChange", "onFinish", "onFinishFailed"];
var Form$2 = function Form2(_ref, ref) {
var name2 = _ref.name, initialValues = _ref.initialValues, fields = _ref.fields, form = _ref.form, preserve = _ref.preserve, children = _ref.children, _ref$component = _ref.component, Component = _ref$component === void 0 ? "form" : _ref$component, validateMessages = _ref.validateMessages, _ref$validateTrigger = _ref.validateTrigger, validateTrigger = _ref$validateTrigger === void 0 ? "onChange" : _ref$validateTrigger, onValuesChange = _ref.onValuesChange, _onFieldsChange = _ref.onFieldsChange, _onFinish = _ref.onFinish, onFinishFailed = _ref.onFinishFailed, restProps = _objectWithoutProperties$1(_ref, _excluded$O);
var formContext = React__namespace.useContext(FormContext$1);
var _useForm = useForm$2(form), _useForm2 = _slicedToArray$e(_useForm, 1), formInstance = _useForm2[0];
var _formInstance$getInte = formInstance.getInternalHooks(HOOK_MARK), useSubscribe = _formInstance$getInte.useSubscribe, setInitialValues = _formInstance$getInte.setInitialValues, setCallbacks = _formInstance$getInte.setCallbacks, setValidateMessages = _formInstance$getInte.setValidateMessages, setPreserve = _formInstance$getInte.setPreserve, destroyForm = _formInstance$getInte.destroyForm;
React__namespace.useImperativeHandle(ref, function() {
return formInstance;
});
React__namespace.useEffect(function() {
formContext.registerForm(name2, formInstance);
return function() {
formContext.unregisterForm(name2);
};
}, [formContext, formInstance, name2]);
setValidateMessages(_objectSpread2$a(_objectSpread2$a({}, formContext.validateMessages), validateMessages));
setCallbacks({
onValuesChange,
onFieldsChange: function onFieldsChange(changedFields) {
formContext.triggerFormChange(name2, changedFields);
if (_onFieldsChange) {
for (var _len = arguments.length, rest = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
rest[_key - 1] = arguments[_key];
}
_onFieldsChange.apply(void 0, [changedFields].concat(rest));
}
},
onFinish: function onFinish(values2) {
formContext.triggerFormFinish(name2, values2);
if (_onFinish) {
_onFinish(values2);
}
},
onFinishFailed
});
setPreserve(preserve);
var mountRef = React__namespace.useRef(null);
setInitialValues(initialValues, !mountRef.current);
if (!mountRef.current) {
mountRef.current = true;
}
React__namespace.useEffect(
function() {
return destroyForm;
},
[]
);
var childrenNode;
var childrenRenderProps = typeof children === "function";
if (childrenRenderProps) {
var values = formInstance.getFieldsValue(true);
childrenNode = children(values, formInstance);
} else {
childrenNode = children;
}
useSubscribe(!childrenRenderProps);
var prevFieldsRef = React__namespace.useRef();
React__namespace.useEffect(function() {
if (!isSimilar(prevFieldsRef.current || [], fields || [])) {
formInstance.setFields(fields || []);
}
prevFieldsRef.current = fields;
}, [fields, formInstance]);
var formContextValue = React__namespace.useMemo(function() {
return _objectSpread2$a(_objectSpread2$a({}, formInstance), {}, {
validateTrigger
});
}, [formInstance, validateTrigger]);
var wrapperNode = /* @__PURE__ */ jsx(Context$2.Provider, {
value: formContextValue,
children: childrenNode
});
if (Component === false) {
return wrapperNode;
}
return /* @__PURE__ */ jsx(Component, {
...restProps,
onSubmit: function onSubmit(event) {
event.preventDefault();
event.stopPropagation();
formInstance.submit();
},
onReset: function onReset(event) {
var _restProps$onReset;
event.preventDefault();
formInstance.resetFields();
(_restProps$onReset = restProps.onReset) === null || _restProps$onReset === void 0 ? void 0 : _restProps$onReset.call(restProps, event);
},
children: wrapperNode
});
};
function stringify$1(value) {
try {
return JSON.stringify(value);
} catch (err) {
return Math.random();
}
}
function useWatch() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
var _args$ = args[0], dependencies = _args$ === void 0 ? [] : _args$, form = args[1];
var _useState = React$a.useState(), _useState2 = _slicedToArray$e(_useState, 2), value = _useState2[0], setValue2 = _useState2[1];
var valueStr = React$a.useMemo(function() {
return stringify$1(value);
}, [value]);
var valueStrRef = React$a.useRef(valueStr);
valueStrRef.current = valueStr;
var fieldContext = React$a.useContext(Context$2);
var formInstance = form || fieldContext;
var isValidForm = formInstance && formInstance._init;
var namePath = getNamePath(dependencies);
var namePathRef = React$a.useRef(namePath);
namePathRef.current = namePath;
React$a.useEffect(
function() {
if (!isValidForm) {
return;
}
var getFieldsValue = formInstance.getFieldsValue, getInternalHooks = formInstance.getInternalHooks;
var _getInternalHooks = getInternalHooks(HOOK_MARK), registerWatch = _getInternalHooks.registerWatch;
var cancelRegister = registerWatch(function(store2) {
var newValue = getValue$5(store2, namePathRef.current);
var nextValueStr = stringify$1(newValue);
if (valueStrRef.current !== nextValueStr) {
valueStrRef.current = nextValueStr;
setValue2(newValue);
}
});
var initialValue = getValue$5(getFieldsValue(), namePathRef.current);
setValue2(initialValue);
return cancelRegister;
},
[isValidForm]
);
return value;
}
var InternalForm$2 = /* @__PURE__ */ React__namespace.forwardRef(Form$2);
var RefForm = InternalForm$2;
RefForm.FormProvider = FormProvider$1;
RefForm.Field = WrapperField;
RefForm.List = List$2;
RefForm.useForm = useForm$2;
RefForm.useWatch = useWatch;
const enUS$3 = {
items_per_page: "/ page",
jump_to: "Go to",
jump_to_confirm: "confirm",
page: "Page",
prev_page: "Previous Page",
next_page: "Next Page",
prev_5: "Previous 5 Pages",
next_5: "Next 5 Pages",
prev_3: "Previous 3 Pages",
next_3: "Next 3 Pages",
page_size: "Page Size"
};
var locale$4 = {
locale: "en_US",
today: "Today",
now: "Now",
backToToday: "Back to today",
ok: "OK",
clear: "Clear",
month: "Month",
year: "Year",
timeSelect: "select time",
dateSelect: "select date",
weekSelect: "Choose a week",
monthSelect: "Choose a month",
yearSelect: "Choose a year",
decadeSelect: "Choose a decade",
yearFormat: "YYYY",
dateFormat: "M/D/YYYY",
dayFormat: "D",
dateTimeFormat: "M/D/YYYY HH:mm:ss",
monthBeforeYear: true,
previousMonth: "Previous month (PageUp)",
nextMonth: "Next month (PageDown)",
previousYear: "Last year (Control + left)",
nextYear: "Next year (Control + right)",
previousDecade: "Last decade",
nextDecade: "Next decade",
previousCentury: "Last century",
nextCentury: "Next century"
};
var locale$3 = {
placeholder: "Select time",
rangePlaceholder: ["Start time", "End time"]
};
const TimePicker$2 = locale$3;
var locale$2 = {
lang: _extends$3({
placeholder: "Select date",
yearPlaceholder: "Select year",
quarterPlaceholder: "Select quarter",
monthPlaceholder: "Select month",
weekPlaceholder: "Select week",
rangePlaceholder: ["Start date", "End date"],
rangeYearPlaceholder: ["Start year", "End year"],
rangeQuarterPlaceholder: ["Start quarter", "End quarter"],
rangeMonthPlaceholder: ["Start month", "End month"],
rangeWeekPlaceholder: ["Start week", "End week"]
}, locale$4),
timePickerLocale: _extends$3({}, TimePicker$2)
};
const enUS$2 = locale$2;
var typeTemplate$1 = "${label} is not a valid ${type}";
var localeValues = {
locale: "en",
Pagination: enUS$3,
DatePicker: enUS$2,
TimePicker: TimePicker$2,
Calendar: enUS$2,
global: {
placeholder: "Please select"
},
Table: {
filterTitle: "Filter menu",
filterConfirm: "OK",
filterReset: "Reset",
filterEmptyText: "No filters",
filterCheckall: "Select all items",
filterSearchPlaceholder: "Search in filters",
emptyText: "No data",
selectAll: "Select current page",
selectInvert: "Invert current page",
selectNone: "Clear all data",
selectionAll: "Select all data",
sortTitle: "Sort",
expand: "Expand row",
collapse: "Collapse row",
triggerDesc: "Click to sort descending",
triggerAsc: "Click to sort ascending",
cancelSort: "Click to cancel sorting"
},
Modal: {
okText: "OK",
cancelText: "Cancel",
justOkText: "OK"
},
Popconfirm: {
okText: "OK",
cancelText: "Cancel"
},
Transfer: {
titles: ["", ""],
searchPlaceholder: "Search here",
itemUnit: "item",
itemsUnit: "items",
remove: "Remove",
selectCurrent: "Select current page",
removeCurrent: "Remove current page",
selectAll: "Select all data",
removeAll: "Remove all data",
selectInvert: "Invert current page"
},
Upload: {
uploading: "Uploading...",
removeFile: "Remove file",
uploadError: "Upload error",
previewFile: "Preview file",
downloadFile: "Download file"
},
Empty: {
description: "No data"
},
Icon: {
icon: "icon"
},
Text: {
edit: "Edit",
copy: "Copy",
copied: "Copied",
expand: "Expand"
},
PageHeader: {
back: "Back"
},
Form: {
optional: "(optional)",
defaultValidateMessages: {
"default": "Field validation error for ${label}",
required: "Please enter ${label}",
"enum": "${label} must be one of [${enum}]",
whitespace: "${label} cannot be a blank character",
date: {
format: "${label} date format is invalid",
parse: "${label} cannot be converted to a date",
invalid: "${label} is an invalid date"
},
types: {
string: typeTemplate$1,
method: typeTemplate$1,
array: typeTemplate$1,
object: typeTemplate$1,
number: typeTemplate$1,
date: typeTemplate$1,
"boolean": typeTemplate$1,
integer: typeTemplate$1,
"float": typeTemplate$1,
regexp: typeTemplate$1,
email: typeTemplate$1,
url: typeTemplate$1,
hex: typeTemplate$1
},
string: {
len: "${label} must be ${len} characters",
min: "${label} must be at least ${min} characters",
max: "${label} must be up to ${max} characters",
range: "${label} must be between ${min}-${max} characters"
},
number: {
len: "${label} must be equal to ${len}",
min: "${label} must be minimum ${min}",
max: "${label} must be maximum ${max}",
range: "${label} must be between ${min}-${max}"
},
array: {
len: "Must be ${len} ${label}",
min: "At least ${min} ${label}",
max: "At most ${max} ${label}",
range: "The amount of ${label} must be between ${min}-${max}"
},
pattern: {
mismatch: "${label} does not match the pattern ${pattern}"
}
}
},
Image: {
preview: "Preview"
}
};
const defaultLocale = localeValues;
var runtimeLocale = _extends$3({}, defaultLocale.Modal);
function changeConfirmLocale(newLocale) {
if (newLocale) {
runtimeLocale = _extends$3(_extends$3({}, runtimeLocale), newLocale);
} else {
runtimeLocale = _extends$3({}, defaultLocale.Modal);
}
}
var LocaleContext = /* @__PURE__ */ React$a.createContext(void 0);
const LocaleContext$1 = LocaleContext;
var ANT_MARK = "internalMark";
var LocaleProvider = function LocaleProvider2(props) {
var _props$locale = props.locale, locale2 = _props$locale === void 0 ? {} : _props$locale, children = props.children;
props._ANT_MARK__;
React__namespace.useEffect(function() {
changeConfirmLocale(locale2 && locale2.Modal);
return function() {
changeConfirmLocale();
};
}, [locale2]);
var getMemoizedContextValue = React__namespace.useMemo(function() {
return _extends$3(_extends$3({}, locale2), {
exist: true
});
}, [locale2]);
return /* @__PURE__ */ jsx(LocaleContext$1.Provider, {
value: getMemoizedContextValue,
children
});
};
const LocaleProvider$1 = LocaleProvider;
var LocaleReceiver = function LocaleReceiver2(props) {
var _props$componentName = props.componentName, componentName = _props$componentName === void 0 ? "global" : _props$componentName, defaultLocale$1 = props.defaultLocale, children = props.children;
var antLocale = React__namespace.useContext(LocaleContext$1);
var getLocale = React__namespace.useMemo(function() {
var _a;
var locale2 = defaultLocale$1 || defaultLocale[componentName];
var localeFromContext = (_a = antLocale === null || antLocale === void 0 ? void 0 : antLocale[componentName]) !== null && _a !== void 0 ? _a : {};
return _extends$3(_extends$3({}, locale2 instanceof Function ? locale2() : locale2), localeFromContext || {});
}, [componentName, defaultLocale$1, antLocale]);
var getLocaleCode = React__namespace.useMemo(function() {
var localeCode = antLocale && antLocale.locale;
if (antLocale && antLocale.exist && !localeCode) {
return defaultLocale.locale;
}
return localeCode;
}, [antLocale]);
return children(getLocale, getLocaleCode, antLocale);
};
const LocaleReceiver$1 = LocaleReceiver;
var useLocaleReceiver = function useLocaleReceiver2(componentName, defaultLocale$1) {
var antLocale = React__namespace.useContext(LocaleContext$1);
var getLocale = React__namespace.useMemo(function() {
var _a;
var locale2 = defaultLocale$1 || defaultLocale[componentName];
var localeFromContext = (_a = antLocale === null || antLocale === void 0 ? void 0 : antLocale[componentName]) !== null && _a !== void 0 ? _a : {};
return _extends$3(_extends$3({}, typeof locale2 === "function" ? locale2() : locale2), localeFromContext || {});
}, [componentName, defaultLocale$1, antLocale]);
return [getLocale];
};
var CheckCircleFilled$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm193.5 301.7l-210.6 292a31.8 31.8 0 01-51.7 0L318.5 484.9c-3.8-5.3 0-12.7 6.5-12.7h46.9c10.2 0 19.9 4.9 25.9 13.3l71.2 98.8 157.2-218c6-8.3 15.6-13.3 25.9-13.3H699c6.5 0 10.3 7.4 6.5 12.7z" } }] }, "name": "check-circle", "theme": "filled" };
const CheckCircleFilledSvg = CheckCircleFilled$2;
function bound01(n2, max) {
if (isOnePointZero(n2)) {
n2 = "100%";
}
var isPercent = isPercentage(n2);
n2 = max === 360 ? n2 : Math.min(max, Math.max(0, parseFloat(n2)));
if (isPercent) {
n2 = parseInt(String(n2 * max), 10) / 100;
}
if (Math.abs(n2 - max) < 1e-6) {
return 1;
}
if (max === 360) {
n2 = (n2 < 0 ? n2 % max + max : n2 % max) / parseFloat(String(max));
} else {
n2 = n2 % max / parseFloat(String(max));
}
return n2;
}
function clamp01(val) {
return Math.min(1, Math.max(0, val));
}
function isOnePointZero(n2) {
return typeof n2 === "string" && n2.indexOf(".") !== -1 && parseFloat(n2) === 1;
}
function isPercentage(n2) {
return typeof n2 === "string" && n2.indexOf("%") !== -1;
}
function boundAlpha(a) {
a = parseFloat(a);
if (isNaN(a) || a < 0 || a > 1) {
a = 1;
}
return a;
}
function convertToPercentage(n2) {
if (n2 <= 1) {
return "".concat(Number(n2) * 100, "%");
}
return n2;
}
function pad2(c2) {
return c2.length === 1 ? "0" + c2 : String(c2);
}
function rgbToRgb(r2, g2, b2) {
return {
r: bound01(r2, 255) * 255,
g: bound01(g2, 255) * 255,
b: bound01(b2, 255) * 255
};
}
function rgbToHsl(r2, g2, b2) {
r2 = bound01(r2, 255);
g2 = bound01(g2, 255);
b2 = bound01(b2, 255);
var max = Math.max(r2, g2, b2);
var min = Math.min(r2, g2, b2);
var h2 = 0;
var s = 0;
var l2 = (max + min) / 2;
if (max === min) {
s = 0;
h2 = 0;
} else {
var d2 = max - min;
s = l2 > 0.5 ? d2 / (2 - max - min) : d2 / (max + min);
switch (max) {
case r2:
h2 = (g2 - b2) / d2 + (g2 < b2 ? 6 : 0);
break;
case g2:
h2 = (b2 - r2) / d2 + 2;
break;
case b2:
h2 = (r2 - g2) / d2 + 4;
break;
}
h2 /= 6;
}
return { h: h2, s, l: l2 };
}
function hue2rgb(p2, q2, t2) {
if (t2 < 0) {
t2 += 1;
}
if (t2 > 1) {
t2 -= 1;
}
if (t2 < 1 / 6) {
return p2 + (q2 - p2) * (6 * t2);
}
if (t2 < 1 / 2) {
return q2;
}
if (t2 < 2 / 3) {
return p2 + (q2 - p2) * (2 / 3 - t2) * 6;
}
return p2;
}
function hslToRgb(h2, s, l2) {
var r2;
var g2;
var b2;
h2 = bound01(h2, 360);
s = bound01(s, 100);
l2 = bound01(l2, 100);
if (s === 0) {
g2 = l2;
b2 = l2;
r2 = l2;
} else {
var q2 = l2 < 0.5 ? l2 * (1 + s) : l2 + s - l2 * s;
var p2 = 2 * l2 - q2;
r2 = hue2rgb(p2, q2, h2 + 1 / 3);
g2 = hue2rgb(p2, q2, h2);
b2 = hue2rgb(p2, q2, h2 - 1 / 3);
}
return { r: r2 * 255, g: g2 * 255, b: b2 * 255 };
}
function rgbToHsv(r2, g2, b2) {
r2 = bound01(r2, 255);
g2 = bound01(g2, 255);
b2 = bound01(b2, 255);
var max = Math.max(r2, g2, b2);
var min = Math.min(r2, g2, b2);
var h2 = 0;
var v2 = max;
var d2 = max - min;
var s = max === 0 ? 0 : d2 / max;
if (max === min) {
h2 = 0;
} else {
switch (max) {
case r2:
h2 = (g2 - b2) / d2 + (g2 < b2 ? 6 : 0);
break;
case g2:
h2 = (b2 - r2) / d2 + 2;
break;
case b2:
h2 = (r2 - g2) / d2 + 4;
break;
}
h2 /= 6;
}
return { h: h2, s, v: v2 };
}
function hsvToRgb(h2, s, v2) {
h2 = bound01(h2, 360) * 6;
s = bound01(s, 100);
v2 = bound01(v2, 100);
var i2 = Math.floor(h2);
var f2 = h2 - i2;
var p2 = v2 * (1 - s);
var q2 = v2 * (1 - f2 * s);
var t2 = v2 * (1 - (1 - f2) * s);
var mod = i2 % 6;
var r2 = [v2, q2, p2, p2, t2, v2][mod];
var g2 = [t2, v2, v2, q2, p2, p2][mod];
var b2 = [p2, p2, t2, v2, v2, q2][mod];
return { r: r2 * 255, g: g2 * 255, b: b2 * 255 };
}
function rgbToHex(r2, g2, b2, allow3Char) {
var hex = [
pad2(Math.round(r2).toString(16)),
pad2(Math.round(g2).toString(16)),
pad2(Math.round(b2).toString(16))
];
if (allow3Char && hex[0].startsWith(hex[0].charAt(1)) && hex[1].startsWith(hex[1].charAt(1)) && hex[2].startsWith(hex[2].charAt(1))) {
return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);
}
return hex.join("");
}
function rgbaToHex(r2, g2, b2, a, allow4Char) {
var hex = [
pad2(Math.round(r2).toString(16)),
pad2(Math.round(g2).toString(16)),
pad2(Math.round(b2).toString(16)),
pad2(convertDecimalToHex(a))
];
if (allow4Char && hex[0].startsWith(hex[0].charAt(1)) && hex[1].startsWith(hex[1].charAt(1)) && hex[2].startsWith(hex[2].charAt(1)) && hex[3].startsWith(hex[3].charAt(1))) {
return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);
}
return hex.join("");
}
function convertDecimalToHex(d2) {
return Math.round(parseFloat(d2) * 255).toString(16);
}
function convertHexToDecimal(h2) {
return parseIntFromHex(h2) / 255;
}
function parseIntFromHex(val) {
return parseInt(val, 16);
}
function numberInputToObject(color2) {
return {
r: color2 >> 16,
g: (color2 & 65280) >> 8,
b: color2 & 255
};
}
var names = {
aliceblue: "#f0f8ff",
antiquewhite: "#faebd7",
aqua: "#00ffff",
aquamarine: "#7fffd4",
azure: "#f0ffff",
beige: "#f5f5dc",
bisque: "#ffe4c4",
black: "#000000",
blanchedalmond: "#ffebcd",
blue: "#0000ff",
blueviolet: "#8a2be2",
brown: "#a52a2a",
burlywood: "#deb887",
cadetblue: "#5f9ea0",
chartreuse: "#7fff00",
chocolate: "#d2691e",
coral: "#ff7f50",
cornflowerblue: "#6495ed",
cornsilk: "#fff8dc",
crimson: "#dc143c",
cyan: "#00ffff",
darkblue: "#00008b",
darkcyan: "#008b8b",
darkgoldenrod: "#b8860b",
darkgray: "#a9a9a9",
darkgreen: "#006400",
darkgrey: "#a9a9a9",
darkkhaki: "#bdb76b",
darkmagenta: "#8b008b",
darkolivegreen: "#556b2f",
darkorange: "#ff8c00",
darkorchid: "#9932cc",
darkred: "#8b0000",
darksalmon: "#e9967a",
darkseagreen: "#8fbc8f",
darkslateblue: "#483d8b",
darkslategray: "#2f4f4f",
darkslategrey: "#2f4f4f",
darkturquoise: "#00ced1",
darkviolet: "#9400d3",
deeppink: "#ff1493",
deepskyblue: "#00bfff",
dimgray: "#696969",
dimgrey: "#696969",
dodgerblue: "#1e90ff",
firebrick: "#b22222",
floralwhite: "#fffaf0",
forestgreen: "#228b22",
fuchsia: "#ff00ff",
gainsboro: "#dcdcdc",
ghostwhite: "#f8f8ff",
goldenrod: "#daa520",
gold: "#ffd700",
gray: "#808080",
green: "#008000",
greenyellow: "#adff2f",
grey: "#808080",
honeydew: "#f0fff0",
hotpink: "#ff69b4",
indianred: "#cd5c5c",
indigo: "#4b0082",
ivory: "#fffff0",
khaki: "#f0e68c",
lavenderblush: "#fff0f5",
lavender: "#e6e6fa",
lawngreen: "#7cfc00",
lemonchiffon: "#fffacd",
lightblue: "#add8e6",
lightcoral: "#f08080",
lightcyan: "#e0ffff",
lightgoldenrodyellow: "#fafad2",
lightgray: "#d3d3d3",
lightgreen: "#90ee90",
lightgrey: "#d3d3d3",
lightpink: "#ffb6c1",
lightsalmon: "#ffa07a",
lightseagreen: "#20b2aa",
lightskyblue: "#87cefa",
lightslategray: "#778899",
lightslategrey: "#778899",
lightsteelblue: "#b0c4de",
lightyellow: "#ffffe0",
lime: "#00ff00",
limegreen: "#32cd32",
linen: "#faf0e6",
magenta: "#ff00ff",
maroon: "#800000",
mediumaquamarine: "#66cdaa",
mediumblue: "#0000cd",
mediumorchid: "#ba55d3",
mediumpurple: "#9370db",
mediumseagreen: "#3cb371",
mediumslateblue: "#7b68ee",
mediumspringgreen: "#00fa9a",
mediumturquoise: "#48d1cc",
mediumvioletred: "#c71585",
midnightblue: "#191970",
mintcream: "#f5fffa",
mistyrose: "#ffe4e1",
moccasin: "#ffe4b5",
navajowhite: "#ffdead",
navy: "#000080",
oldlace: "#fdf5e6",
olive: "#808000",
olivedrab: "#6b8e23",
orange: "#ffa500",
orangered: "#ff4500",
orchid: "#da70d6",
palegoldenrod: "#eee8aa",
palegreen: "#98fb98",
paleturquoise: "#afeeee",
palevioletred: "#db7093",
papayawhip: "#ffefd5",
peachpuff: "#ffdab9",
peru: "#cd853f",
pink: "#ffc0cb",
plum: "#dda0dd",
powderblue: "#b0e0e6",
purple: "#800080",
rebeccapurple: "#663399",
red: "#ff0000",
rosybrown: "#bc8f8f",
royalblue: "#4169e1",
saddlebrown: "#8b4513",
salmon: "#fa8072",
sandybrown: "#f4a460",
seagreen: "#2e8b57",
seashell: "#fff5ee",
sienna: "#a0522d",
silver: "#c0c0c0",
skyblue: "#87ceeb",
slateblue: "#6a5acd",
slategray: "#708090",
slategrey: "#708090",
snow: "#fffafa",
springgreen: "#00ff7f",
steelblue: "#4682b4",
tan: "#d2b48c",
teal: "#008080",
thistle: "#d8bfd8",
tomato: "#ff6347",
turquoise: "#40e0d0",
violet: "#ee82ee",
wheat: "#f5deb3",
white: "#ffffff",
whitesmoke: "#f5f5f5",
yellow: "#ffff00",
yellowgreen: "#9acd32"
};
function inputToRGB(color2) {
var rgb = { r: 0, g: 0, b: 0 };
var a = 1;
var s = null;
var v2 = null;
var l2 = null;
var ok = false;
var format2 = false;
if (typeof color2 === "string") {
color2 = stringInputToObject(color2);
}
if (typeof color2 === "object") {
if (isValidCSSUnit(color2.r) && isValidCSSUnit(color2.g) && isValidCSSUnit(color2.b)) {
rgb = rgbToRgb(color2.r, color2.g, color2.b);
ok = true;
format2 = String(color2.r).substr(-1) === "%" ? "prgb" : "rgb";
} else if (isValidCSSUnit(color2.h) && isValidCSSUnit(color2.s) && isValidCSSUnit(color2.v)) {
s = convertToPercentage(color2.s);
v2 = convertToPercentage(color2.v);
rgb = hsvToRgb(color2.h, s, v2);
ok = true;
format2 = "hsv";
} else if (isValidCSSUnit(color2.h) && isValidCSSUnit(color2.s) && isValidCSSUnit(color2.l)) {
s = convertToPercentage(color2.s);
l2 = convertToPercentage(color2.l);
rgb = hslToRgb(color2.h, s, l2);
ok = true;
format2 = "hsl";
}
if (Object.prototype.hasOwnProperty.call(color2, "a")) {
a = color2.a;
}
}
a = boundAlpha(a);
return {
ok,
format: color2.format || format2,
r: Math.min(255, Math.max(rgb.r, 0)),
g: Math.min(255, Math.max(rgb.g, 0)),
b: Math.min(255, Math.max(rgb.b, 0)),
a
};
}
var CSS_INTEGER = "[-\\+]?\\d+%?";
var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?";
var CSS_UNIT = "(?:".concat(CSS_NUMBER, ")|(?:").concat(CSS_INTEGER, ")");
var PERMISSIVE_MATCH3 = "[\\s|\\(]+(".concat(CSS_UNIT, ")[,|\\s]+(").concat(CSS_UNIT, ")[,|\\s]+(").concat(CSS_UNIT, ")\\s*\\)?");
var PERMISSIVE_MATCH4 = "[\\s|\\(]+(".concat(CSS_UNIT, ")[,|\\s]+(").concat(CSS_UNIT, ")[,|\\s]+(").concat(CSS_UNIT, ")[,|\\s]+(").concat(CSS_UNIT, ")\\s*\\)?");
var matchers = {
CSS_UNIT: new RegExp(CSS_UNIT),
rgb: new RegExp("rgb" + PERMISSIVE_MATCH3),
rgba: new RegExp("rgba" + PERMISSIVE_MATCH4),
hsl: new RegExp("hsl" + PERMISSIVE_MATCH3),
hsla: new RegExp("hsla" + PERMISSIVE_MATCH4),
hsv: new RegExp("hsv" + PERMISSIVE_MATCH3),
hsva: new RegExp("hsva" + PERMISSIVE_MATCH4),
hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,
hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/
};
function stringInputToObject(color2) {
color2 = color2.trim().toLowerCase();
if (color2.length === 0) {
return false;
}
var named = false;
if (names[color2]) {
color2 = names[color2];
named = true;
} else if (color2 === "transparent") {
return { r: 0, g: 0, b: 0, a: 0, format: "name" };
}
var match2 = matchers.rgb.exec(color2);
if (match2) {
return { r: match2[1], g: match2[2], b: match2[3] };
}
match2 = matchers.rgba.exec(color2);
if (match2) {
return { r: match2[1], g: match2[2], b: match2[3], a: match2[4] };
}
match2 = matchers.hsl.exec(color2);
if (match2) {
return { h: match2[1], s: match2[2], l: match2[3] };
}
match2 = matchers.hsla.exec(color2);
if (match2) {
return { h: match2[1], s: match2[2], l: match2[3], a: match2[4] };
}
match2 = matchers.hsv.exec(color2);
if (match2) {
return { h: match2[1], s: match2[2], v: match2[3] };
}
match2 = matchers.hsva.exec(color2);
if (match2) {
return { h: match2[1], s: match2[2], v: match2[3], a: match2[4] };
}
match2 = matchers.hex8.exec(color2);
if (match2) {
return {
r: parseIntFromHex(match2[1]),
g: parseIntFromHex(match2[2]),
b: parseIntFromHex(match2[3]),
a: convertHexToDecimal(match2[4]),
format: named ? "name" : "hex8"
};
}
match2 = matchers.hex6.exec(color2);
if (match2) {
return {
r: parseIntFromHex(match2[1]),
g: parseIntFromHex(match2[2]),
b: parseIntFromHex(match2[3]),
format: named ? "name" : "hex"
};
}
match2 = matchers.hex4.exec(color2);
if (match2) {
return {
r: parseIntFromHex(match2[1] + match2[1]),
g: parseIntFromHex(match2[2] + match2[2]),
b: parseIntFromHex(match2[3] + match2[3]),
a: convertHexToDecimal(match2[4] + match2[4]),
format: named ? "name" : "hex8"
};
}
match2 = matchers.hex3.exec(color2);
if (match2) {
return {
r: parseIntFromHex(match2[1] + match2[1]),
g: parseIntFromHex(match2[2] + match2[2]),
b: parseIntFromHex(match2[3] + match2[3]),
format: named ? "name" : "hex"
};
}
return false;
}
function isValidCSSUnit(color2) {
return Boolean(matchers.CSS_UNIT.exec(String(color2)));
}
var TinyColor = function() {
function TinyColor2(color2, opts) {
if (color2 === void 0) {
color2 = "";
}
if (opts === void 0) {
opts = {};
}
var _a;
if (color2 instanceof TinyColor2) {
return color2;
}
if (typeof color2 === "number") {
color2 = numberInputToObject(color2);
}
this.originalInput = color2;
var rgb = inputToRGB(color2);
this.originalInput = color2;
this.r = rgb.r;
this.g = rgb.g;
this.b = rgb.b;
this.a = rgb.a;
this.roundA = Math.round(100 * this.a) / 100;
this.format = (_a = opts.format) !== null && _a !== void 0 ? _a : rgb.format;
this.gradientType = opts.gradientType;
if (this.r < 1) {
this.r = Math.round(this.r);
}
if (this.g < 1) {
this.g = Math.round(this.g);
}
if (this.b < 1) {
this.b = Math.round(this.b);
}
this.isValid = rgb.ok;
}
TinyColor2.prototype.isDark = function() {
return this.getBrightness() < 128;
};
TinyColor2.prototype.isLight = function() {
return !this.isDark();
};
TinyColor2.prototype.getBrightness = function() {
var rgb = this.toRgb();
return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1e3;
};
TinyColor2.prototype.getLuminance = function() {
var rgb = this.toRgb();
var R;
var G;
var B;
var RsRGB = rgb.r / 255;
var GsRGB = rgb.g / 255;
var BsRGB = rgb.b / 255;
if (RsRGB <= 0.03928) {
R = RsRGB / 12.92;
} else {
R = Math.pow((RsRGB + 0.055) / 1.055, 2.4);
}
if (GsRGB <= 0.03928) {
G = GsRGB / 12.92;
} else {
G = Math.pow((GsRGB + 0.055) / 1.055, 2.4);
}
if (BsRGB <= 0.03928) {
B = BsRGB / 12.92;
} else {
B = Math.pow((BsRGB + 0.055) / 1.055, 2.4);
}
return 0.2126 * R + 0.7152 * G + 0.0722 * B;
};
TinyColor2.prototype.getAlpha = function() {
return this.a;
};
TinyColor2.prototype.setAlpha = function(alpha) {
this.a = boundAlpha(alpha);
this.roundA = Math.round(100 * this.a) / 100;
return this;
};
TinyColor2.prototype.isMonochrome = function() {
var s = this.toHsl().s;
return s === 0;
};
TinyColor2.prototype.toHsv = function() {
var hsv = rgbToHsv(this.r, this.g, this.b);
return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this.a };
};
TinyColor2.prototype.toHsvString = function() {
var hsv = rgbToHsv(this.r, this.g, this.b);
var h2 = Math.round(hsv.h * 360);
var s = Math.round(hsv.s * 100);
var v2 = Math.round(hsv.v * 100);
return this.a === 1 ? "hsv(".concat(h2, ", ").concat(s, "%, ").concat(v2, "%)") : "hsva(".concat(h2, ", ").concat(s, "%, ").concat(v2, "%, ").concat(this.roundA, ")");
};
TinyColor2.prototype.toHsl = function() {
var hsl = rgbToHsl(this.r, this.g, this.b);
return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this.a };
};
TinyColor2.prototype.toHslString = function() {
var hsl = rgbToHsl(this.r, this.g, this.b);
var h2 = Math.round(hsl.h * 360);
var s = Math.round(hsl.s * 100);
var l2 = Math.round(hsl.l * 100);
return this.a === 1 ? "hsl(".concat(h2, ", ").concat(s, "%, ").concat(l2, "%)") : "hsla(".concat(h2, ", ").concat(s, "%, ").concat(l2, "%, ").concat(this.roundA, ")");
};
TinyColor2.prototype.toHex = function(allow3Char) {
if (allow3Char === void 0) {
allow3Char = false;
}
return rgbToHex(this.r, this.g, this.b, allow3Char);
};
TinyColor2.prototype.toHexString = function(allow3Char) {
if (allow3Char === void 0) {
allow3Char = false;
}
return "#" + this.toHex(allow3Char);
};
TinyColor2.prototype.toHex8 = function(allow4Char) {
if (allow4Char === void 0) {
allow4Char = false;
}
return rgbaToHex(this.r, this.g, this.b, this.a, allow4Char);
};
TinyColor2.prototype.toHex8String = function(allow4Char) {
if (allow4Char === void 0) {
allow4Char = false;
}
return "#" + this.toHex8(allow4Char);
};
TinyColor2.prototype.toHexShortString = function(allowShortChar) {
if (allowShortChar === void 0) {
allowShortChar = false;
}
return this.a === 1 ? this.toHexString(allowShortChar) : this.toHex8String(allowShortChar);
};
TinyColor2.prototype.toRgb = function() {
return {
r: Math.round(this.r),
g: Math.round(this.g),
b: Math.round(this.b),
a: this.a
};
};
TinyColor2.prototype.toRgbString = function() {
var r2 = Math.round(this.r);
var g2 = Math.round(this.g);
var b2 = Math.round(this.b);
return this.a === 1 ? "rgb(".concat(r2, ", ").concat(g2, ", ").concat(b2, ")") : "rgba(".concat(r2, ", ").concat(g2, ", ").concat(b2, ", ").concat(this.roundA, ")");
};
TinyColor2.prototype.toPercentageRgb = function() {
var fmt = function(x2) {
return "".concat(Math.round(bound01(x2, 255) * 100), "%");
};
return {
r: fmt(this.r),
g: fmt(this.g),
b: fmt(this.b),
a: this.a
};
};
TinyColor2.prototype.toPercentageRgbString = function() {
var rnd = function(x2) {
return Math.round(bound01(x2, 255) * 100);
};
return this.a === 1 ? "rgb(".concat(rnd(this.r), "%, ").concat(rnd(this.g), "%, ").concat(rnd(this.b), "%)") : "rgba(".concat(rnd(this.r), "%, ").concat(rnd(this.g), "%, ").concat(rnd(this.b), "%, ").concat(this.roundA, ")");
};
TinyColor2.prototype.toName = function() {
if (this.a === 0) {
return "transparent";
}
if (this.a < 1) {
return false;
}
var hex = "#" + rgbToHex(this.r, this.g, this.b, false);
for (var _i = 0, _a = Object.entries(names); _i < _a.length; _i++) {
var _b = _a[_i], key2 = _b[0], value = _b[1];
if (hex === value) {
return key2;
}
}
return false;
};
TinyColor2.prototype.toString = function(format2) {
var formatSet = Boolean(format2);
format2 = format2 !== null && format2 !== void 0 ? format2 : this.format;
var formattedString = false;
var hasAlpha = this.a < 1 && this.a >= 0;
var needsAlphaFormat = !formatSet && hasAlpha && (format2.startsWith("hex") || format2 === "name");
if (needsAlphaFormat) {
if (format2 === "name" && this.a === 0) {
return this.toName();
}
return this.toRgbString();
}
if (format2 === "rgb") {
formattedString = this.toRgbString();
}
if (format2 === "prgb") {
formattedString = this.toPercentageRgbString();
}
if (format2 === "hex" || format2 === "hex6") {
formattedString = this.toHexString();
}
if (format2 === "hex3") {
formattedString = this.toHexString(true);
}
if (format2 === "hex4") {
formattedString = this.toHex8String(true);
}
if (format2 === "hex8") {
formattedString = this.toHex8String();
}
if (format2 === "name") {
formattedString = this.toName();
}
if (format2 === "hsl") {
formattedString = this.toHslString();
}
if (format2 === "hsv") {
formattedString = this.toHsvString();
}
return formattedString || this.toHexString();
};
TinyColor2.prototype.toNumber = function() {
return (Math.round(this.r) << 16) + (Math.round(this.g) << 8) + Math.round(this.b);
};
TinyColor2.prototype.clone = function() {
return new TinyColor2(this.toString());
};
TinyColor2.prototype.lighten = function(amount) {
if (amount === void 0) {
amount = 10;
}
var hsl = this.toHsl();
hsl.l += amount / 100;
hsl.l = clamp01(hsl.l);
return new TinyColor2(hsl);
};
TinyColor2.prototype.brighten = function(amount) {
if (amount === void 0) {
amount = 10;
}
var rgb = this.toRgb();
rgb.r = Math.max(0, Math.min(255, rgb.r - Math.round(255 * -(amount / 100))));
rgb.g = Math.max(0, Math.min(255, rgb.g - Math.round(255 * -(amount / 100))));
rgb.b = Math.max(0, Math.min(255, rgb.b - Math.round(255 * -(amount / 100))));
return new TinyColor2(rgb);
};
TinyColor2.prototype.darken = function(amount) {
if (amount === void 0) {
amount = 10;
}
var hsl = this.toHsl();
hsl.l -= amount / 100;
hsl.l = clamp01(hsl.l);
return new TinyColor2(hsl);
};
TinyColor2.prototype.tint = function(amount) {
if (amount === void 0) {
amount = 10;
}
return this.mix("white", amount);
};
TinyColor2.prototype.shade = function(amount) {
if (amount === void 0) {
amount = 10;
}
return this.mix("black", amount);
};
TinyColor2.prototype.desaturate = function(amount) {
if (amount === void 0) {
amount = 10;
}
var hsl = this.toHsl();
hsl.s -= amount / 100;
hsl.s = clamp01(hsl.s);
return new TinyColor2(hsl);
};
TinyColor2.prototype.saturate = function(amount) {
if (amount === void 0) {
amount = 10;
}
var hsl = this.toHsl();
hsl.s += amount / 100;
hsl.s = clamp01(hsl.s);
return new TinyColor2(hsl);
};
TinyColor2.prototype.greyscale = function() {
return this.desaturate(100);
};
TinyColor2.prototype.spin = function(amount) {
var hsl = this.toHsl();
var hue = (hsl.h + amount) % 360;
hsl.h = hue < 0 ? 360 + hue : hue;
return new TinyColor2(hsl);
};
TinyColor2.prototype.mix = function(color2, amount) {
if (amount === void 0) {
amount = 50;
}
var rgb1 = this.toRgb();
var rgb2 = new TinyColor2(color2).toRgb();
var p2 = amount / 100;
var rgba = {
r: (rgb2.r - rgb1.r) * p2 + rgb1.r,
g: (rgb2.g - rgb1.g) * p2 + rgb1.g,
b: (rgb2.b - rgb1.b) * p2 + rgb1.b,
a: (rgb2.a - rgb1.a) * p2 + rgb1.a
};
return new TinyColor2(rgba);
};
TinyColor2.prototype.analogous = function(results, slices) {
if (results === void 0) {
results = 6;
}
if (slices === void 0) {
slices = 30;
}
var hsl = this.toHsl();
var part = 360 / slices;
var ret = [this];
for (hsl.h = (hsl.h - (part * results >> 1) + 720) % 360; --results; ) {
hsl.h = (hsl.h + part) % 360;
ret.push(new TinyColor2(hsl));
}
return ret;
};
TinyColor2.prototype.complement = function() {
var hsl = this.toHsl();
hsl.h = (hsl.h + 180) % 360;
return new TinyColor2(hsl);
};
TinyColor2.prototype.monochromatic = function(results) {
if (results === void 0) {
results = 6;
}
var hsv = this.toHsv();
var h2 = hsv.h;
var s = hsv.s;
var v2 = hsv.v;
var res = [];
var modification = 1 / results;
while (results--) {
res.push(new TinyColor2({ h: h2, s, v: v2 }));
v2 = (v2 + modification) % 1;
}
return res;
};
TinyColor2.prototype.splitcomplement = function() {
var hsl = this.toHsl();
var h2 = hsl.h;
return [
this,
new TinyColor2({ h: (h2 + 72) % 360, s: hsl.s, l: hsl.l }),
new TinyColor2({ h: (h2 + 216) % 360, s: hsl.s, l: hsl.l })
];
};
TinyColor2.prototype.onBackground = function(background) {
var fg = this.toRgb();
var bg = new TinyColor2(background).toRgb();
var alpha = fg.a + bg.a * (1 - fg.a);
return new TinyColor2({
r: (fg.r * fg.a + bg.r * bg.a * (1 - fg.a)) / alpha,
g: (fg.g * fg.a + bg.g * bg.a * (1 - fg.a)) / alpha,
b: (fg.b * fg.a + bg.b * bg.a * (1 - fg.a)) / alpha,
a: alpha
});
};
TinyColor2.prototype.triad = function() {
return this.polyad(3);
};
TinyColor2.prototype.tetrad = function() {
return this.polyad(4);
};
TinyColor2.prototype.polyad = function(n2) {
var hsl = this.toHsl();
var h2 = hsl.h;
var result = [this];
var increment = 360 / n2;
for (var i2 = 1; i2 < n2; i2++) {
result.push(new TinyColor2({ h: (h2 + i2 * increment) % 360, s: hsl.s, l: hsl.l }));
}
return result;
};
TinyColor2.prototype.equals = function(color2) {
return this.toRgbString() === new TinyColor2(color2).toRgbString();
};
return TinyColor2;
}();
var hueStep = 2;
var saturationStep = 0.16;
var saturationStep2 = 0.05;
var brightnessStep1 = 0.05;
var brightnessStep2 = 0.15;
var lightColorCount = 5;
var darkColorCount = 4;
var darkColorMap = [{
index: 7,
opacity: 0.15
}, {
index: 6,
opacity: 0.25
}, {
index: 5,
opacity: 0.3
}, {
index: 5,
opacity: 0.45
}, {
index: 5,
opacity: 0.65
}, {
index: 5,
opacity: 0.85
}, {
index: 4,
opacity: 0.9
}, {
index: 3,
opacity: 0.95
}, {
index: 2,
opacity: 0.97
}, {
index: 1,
opacity: 0.98
}];
function toHsv(_ref) {
var r2 = _ref.r, g2 = _ref.g, b2 = _ref.b;
var hsv = rgbToHsv(r2, g2, b2);
return {
h: hsv.h * 360,
s: hsv.s,
v: hsv.v
};
}
function toHex(_ref2) {
var r2 = _ref2.r, g2 = _ref2.g, b2 = _ref2.b;
return "#".concat(rgbToHex(r2, g2, b2, false));
}
function mix$1(rgb1, rgb2, amount) {
var p2 = amount / 100;
var rgb = {
r: (rgb2.r - rgb1.r) * p2 + rgb1.r,
g: (rgb2.g - rgb1.g) * p2 + rgb1.g,
b: (rgb2.b - rgb1.b) * p2 + rgb1.b
};
return rgb;
}
function getHue(hsv, i2, light) {
var hue;
if (Math.round(hsv.h) >= 60 && Math.round(hsv.h) <= 240) {
hue = light ? Math.round(hsv.h) - hueStep * i2 : Math.round(hsv.h) + hueStep * i2;
} else {
hue = light ? Math.round(hsv.h) + hueStep * i2 : Math.round(hsv.h) - hueStep * i2;
}
if (hue < 0) {
hue += 360;
} else if (hue >= 360) {
hue -= 360;
}
return hue;
}
function getSaturation(hsv, i2, light) {
if (hsv.h === 0 && hsv.s === 0) {
return hsv.s;
}
var saturation;
if (light) {
saturation = hsv.s - saturationStep * i2;
} else if (i2 === darkColorCount) {
saturation = hsv.s + saturationStep;
} else {
saturation = hsv.s + saturationStep2 * i2;
}
if (saturation > 1) {
saturation = 1;
}
if (light && i2 === lightColorCount && saturation > 0.1) {
saturation = 0.1;
}
if (saturation < 0.06) {
saturation = 0.06;
}
return Number(saturation.toFixed(2));
}
function getValue$4(hsv, i2, light) {
var value;
if (light) {
value = hsv.v + brightnessStep1 * i2;
} else {
value = hsv.v - brightnessStep2 * i2;
}
if (value > 1) {
value = 1;
}
return Number(value.toFixed(2));
}
function generate$1(color2) {
var opts = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var patterns = [];
var pColor = inputToRGB(color2);
for (var i2 = lightColorCount; i2 > 0; i2 -= 1) {
var hsv = toHsv(pColor);
var colorString2 = toHex(inputToRGB({
h: getHue(hsv, i2, true),
s: getSaturation(hsv, i2, true),
v: getValue$4(hsv, i2, true)
}));
patterns.push(colorString2);
}
patterns.push(toHex(pColor));
for (var _i = 1; _i <= darkColorCount; _i += 1) {
var _hsv = toHsv(pColor);
var _colorString = toHex(inputToRGB({
h: getHue(_hsv, _i),
s: getSaturation(_hsv, _i),
v: getValue$4(_hsv, _i)
}));
patterns.push(_colorString);
}
if (opts.theme === "dark") {
return darkColorMap.map(function(_ref3) {
var index2 = _ref3.index, opacity = _ref3.opacity;
var darkColorString = toHex(mix$1(inputToRGB(opts.backgroundColor || "#141414"), inputToRGB(patterns[index2]), opacity * 100));
return darkColorString;
});
}
return patterns;
}
var presetPrimaryColors = {
red: "#F5222D",
volcano: "#FA541C",
orange: "#FA8C16",
gold: "#FAAD14",
yellow: "#FADB14",
lime: "#A0D911",
green: "#52C41A",
cyan: "#13C2C2",
blue: "#1890FF",
geekblue: "#2F54EB",
purple: "#722ED1",
magenta: "#EB2F96",
grey: "#666666"
};
var presetPalettes = {};
var presetDarkPalettes = {};
Object.keys(presetPrimaryColors).forEach(function(key2) {
presetPalettes[key2] = generate$1(presetPrimaryColors[key2]);
presetPalettes[key2].primary = presetPalettes[key2][5];
presetDarkPalettes[key2] = generate$1(presetPrimaryColors[key2], {
theme: "dark",
backgroundColor: "#141414"
});
presetDarkPalettes[key2].primary = presetDarkPalettes[key2][5];
});
var red = presetPalettes.red;
var volcano = presetPalettes.volcano;
var gold = presetPalettes.gold;
var orange = presetPalettes.orange;
var yellow = presetPalettes.yellow;
var lime = presetPalettes.lime;
var green = presetPalettes.green;
var cyan = presetPalettes.cyan;
var blue = presetPalettes.blue;
var geekblue = presetPalettes.geekblue;
var purple = presetPalettes.purple;
var magenta = presetPalettes.magenta;
var grey = presetPalettes.grey;
const index_esm = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
blue,
cyan,
geekblue,
generate: generate$1,
gold,
green,
grey,
lime,
magenta,
orange,
presetDarkPalettes,
presetPalettes,
presetPrimaryColors,
purple,
red,
volcano,
yellow
}, Symbol.toStringTag, { value: "Module" }));
function canUseDom$1() {
return !!(typeof window !== "undefined" && window.document && window.document.createElement);
}
function contains$2(root2, n2) {
if (!root2) {
return false;
}
if (root2.contains) {
return root2.contains(n2);
}
var node = n2;
while (node) {
if (node === root2) {
return true;
}
node = node.parentNode;
}
return false;
}
var APPEND_ORDER = "data-rc-order";
var MARK_KEY = "rc-util-key";
var containerCache = /* @__PURE__ */ new Map();
function getMark() {
var _ref = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}, mark = _ref.mark;
if (mark) {
return mark.startsWith("data-") ? mark : "data-".concat(mark);
}
return MARK_KEY;
}
function getContainer$1(option) {
if (option.attachTo) {
return option.attachTo;
}
var head = document.querySelector("head");
return head || document.body;
}
function getOrder(prepend) {
if (prepend === "queue") {
return "prependQueue";
}
return prepend ? "prepend" : "append";
}
function findStyles(container) {
return Array.from((containerCache.get(container) || container).children).filter(function(node) {
return node.tagName === "STYLE";
});
}
function injectCSS(css2) {
var option = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
if (!canUseDom$1()) {
return null;
}
var csp = option.csp, prepend = option.prepend;
var styleNode = document.createElement("style");
styleNode.setAttribute(APPEND_ORDER, getOrder(prepend));
if (csp !== null && csp !== void 0 && csp.nonce) {
styleNode.nonce = csp === null || csp === void 0 ? void 0 : csp.nonce;
}
styleNode.innerHTML = css2;
var container = getContainer$1(option);
var firstChild = container.firstChild;
if (prepend) {
if (prepend === "queue") {
var existStyle = findStyles(container).filter(function(node) {
return ["prepend", "prependQueue"].includes(node.getAttribute(APPEND_ORDER));
});
if (existStyle.length) {
container.insertBefore(styleNode, existStyle[existStyle.length - 1].nextSibling);
return styleNode;
}
}
container.insertBefore(styleNode, firstChild);
} else {
container.appendChild(styleNode);
}
return styleNode;
}
function findExistNode(key2) {
var option = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var container = getContainer$1(option);
return findStyles(container).find(function(node) {
return node.getAttribute(getMark(option)) === key2;
});
}
function removeCSS(key2) {
var option = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var existNode = findExistNode(key2, option);
if (existNode) {
var container = getContainer$1(option);
container.removeChild(existNode);
}
}
function syncRealContainer(container, option) {
var cachedRealContainer = containerCache.get(container);
if (!cachedRealContainer || !contains$2(document, cachedRealContainer)) {
var placeholderStyle = injectCSS("", option);
var parentNode = placeholderStyle.parentNode;
containerCache.set(container, parentNode);
container.removeChild(placeholderStyle);
}
}
function updateCSS(css2, key2) {
var option = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
var container = getContainer$1(option);
syncRealContainer(container, option);
var existNode = findExistNode(key2, option);
if (existNode) {
var _option$csp, _option$csp2;
if ((_option$csp = option.csp) !== null && _option$csp !== void 0 && _option$csp.nonce && existNode.nonce !== ((_option$csp2 = option.csp) === null || _option$csp2 === void 0 ? void 0 : _option$csp2.nonce)) {
var _option$csp3;
existNode.nonce = (_option$csp3 = option.csp) === null || _option$csp3 === void 0 ? void 0 : _option$csp3.nonce;
}
if (existNode.innerHTML !== css2) {
existNode.innerHTML = css2;
}
return existNode;
}
var newNode = injectCSS(css2, option);
newNode.setAttribute(getMark(option), key2);
return newNode;
}
function warning$1(valid, message) {
warningOnce(valid, "[@ant-design/icons] ".concat(message));
}
function isIconDefinition(target) {
return _typeof$q(target) === "object" && typeof target.name === "string" && typeof target.theme === "string" && (_typeof$q(target.icon) === "object" || typeof target.icon === "function");
}
function normalizeAttrs() {
var attrs = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
return Object.keys(attrs).reduce(function(acc, key2) {
var val = attrs[key2];
switch (key2) {
case "class":
acc.className = val;
delete acc.class;
break;
default:
acc[key2] = val;
}
return acc;
}, {});
}
function generate(node, key2, rootProps) {
if (!rootProps) {
return /* @__PURE__ */ React__default.default.createElement(node.tag, _objectSpread2$a({
key: key2
}, normalizeAttrs(node.attrs)), (node.children || []).map(function(child, index2) {
return generate(child, "".concat(key2, "-").concat(node.tag, "-").concat(index2));
}));
}
return /* @__PURE__ */ React__default.default.createElement(node.tag, _objectSpread2$a(_objectSpread2$a({
key: key2
}, normalizeAttrs(node.attrs)), rootProps), (node.children || []).map(function(child, index2) {
return generate(child, "".concat(key2, "-").concat(node.tag, "-").concat(index2));
}));
}
function getSecondaryColor(primaryColor) {
return generate$1(primaryColor)[0];
}
function normalizeTwoToneColors(twoToneColor) {
if (!twoToneColor) {
return [];
}
return Array.isArray(twoToneColor) ? twoToneColor : [twoToneColor];
}
var iconStyles = "\n.anticon {\n display: inline-block;\n color: inherit;\n font-style: normal;\n line-height: 0;\n text-align: center;\n text-transform: none;\n vertical-align: -0.125em;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n.anticon > * {\n line-height: 1;\n}\n\n.anticon svg {\n display: inline-block;\n}\n\n.anticon::before {\n display: none;\n}\n\n.anticon .anticon-icon {\n display: block;\n}\n\n.anticon[tabindex] {\n cursor: pointer;\n}\n\n.anticon-spin::before,\n.anticon-spin {\n display: inline-block;\n -webkit-animation: loadingCircle 1s infinite linear;\n animation: loadingCircle 1s infinite linear;\n}\n\n@-webkit-keyframes loadingCircle {\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n\n@keyframes loadingCircle {\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n";
var useInsertStyles = function useInsertStyles2() {
var styleStr = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : iconStyles;
var _useContext = React$a.useContext(IconContext$1), csp = _useContext.csp;
React$a.useEffect(function() {
updateCSS(styleStr, "@ant-design-icons", {
prepend: true,
csp
});
}, []);
};
var _excluded$N = ["icon", "className", "onClick", "style", "primaryColor", "secondaryColor"];
var twoToneColorPalette = {
primaryColor: "#333",
secondaryColor: "#E6E6E6",
calculated: false
};
function setTwoToneColors(_ref) {
var primaryColor = _ref.primaryColor, secondaryColor = _ref.secondaryColor;
twoToneColorPalette.primaryColor = primaryColor;
twoToneColorPalette.secondaryColor = secondaryColor || getSecondaryColor(primaryColor);
twoToneColorPalette.calculated = !!secondaryColor;
}
function getTwoToneColors() {
return _objectSpread2$a({}, twoToneColorPalette);
}
var IconBase$1 = function IconBase2(props) {
var icon = props.icon, className = props.className, onClick = props.onClick, style2 = props.style, primaryColor = props.primaryColor, secondaryColor = props.secondaryColor, restProps = _objectWithoutProperties$1(props, _excluded$N);
var colors = twoToneColorPalette;
if (primaryColor) {
colors = {
primaryColor,
secondaryColor: secondaryColor || getSecondaryColor(primaryColor)
};
}
useInsertStyles();
warning$1(isIconDefinition(icon), "icon should be icon definiton, but got ".concat(icon));
if (!isIconDefinition(icon)) {
return null;
}
var target = icon;
if (target && typeof target.icon === "function") {
target = _objectSpread2$a(_objectSpread2$a({}, target), {}, {
icon: target.icon(colors.primaryColor, colors.secondaryColor)
});
}
return generate(target.icon, "svg-".concat(target.name), _objectSpread2$a({
className,
onClick,
style: style2,
"data-icon": target.name,
width: "1em",
height: "1em",
fill: "currentColor",
"aria-hidden": "true"
}, restProps));
};
IconBase$1.displayName = "IconReact";
IconBase$1.getTwoToneColors = getTwoToneColors;
IconBase$1.setTwoToneColors = setTwoToneColors;
const ReactIcon = IconBase$1;
function setTwoToneColor(twoToneColor) {
var _normalizeTwoToneColo = normalizeTwoToneColors(twoToneColor), _normalizeTwoToneColo2 = _slicedToArray$e(_normalizeTwoToneColo, 2), primaryColor = _normalizeTwoToneColo2[0], secondaryColor = _normalizeTwoToneColo2[1];
return ReactIcon.setTwoToneColors({
primaryColor,
secondaryColor
});
}
function getTwoToneColor() {
var colors = ReactIcon.getTwoToneColors();
if (!colors.calculated) {
return colors.primaryColor;
}
return [colors.primaryColor, colors.secondaryColor];
}
var _excluded$M = ["className", "icon", "spin", "rotate", "tabIndex", "onClick", "twoToneColor"];
setTwoToneColor("#1890ff");
var Icon$1 = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _classNames;
var className = props.className, icon = props.icon, spin = props.spin, rotate = props.rotate, tabIndex = props.tabIndex, onClick = props.onClick, twoToneColor = props.twoToneColor, restProps = _objectWithoutProperties$1(props, _excluded$M);
var _React$useContext = React__namespace.useContext(IconContext$1), _React$useContext$pre = _React$useContext.prefixCls, prefixCls = _React$useContext$pre === void 0 ? "anticon" : _React$useContext$pre, rootClassName = _React$useContext.rootClassName;
var classString = classnames(rootClassName, prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(icon.name), !!icon.name), _defineProperty$b(_classNames, "".concat(prefixCls, "-spin"), !!spin || icon.name === "loading"), _classNames), className);
var iconTabIndex = tabIndex;
if (iconTabIndex === void 0 && onClick) {
iconTabIndex = -1;
}
var svgStyle = rotate ? {
msTransform: "rotate(".concat(rotate, "deg)"),
transform: "rotate(".concat(rotate, "deg)")
} : void 0;
var _normalizeTwoToneColo = normalizeTwoToneColors(twoToneColor), _normalizeTwoToneColo2 = _slicedToArray$e(_normalizeTwoToneColo, 2), primaryColor = _normalizeTwoToneColo2[0], secondaryColor = _normalizeTwoToneColo2[1];
return /* @__PURE__ */ jsx("span", {
..._objectSpread2$a(_objectSpread2$a({
role: "img",
"aria-label": icon.name
}, restProps), {}, {
ref,
tabIndex: iconTabIndex,
onClick,
className: classString
}),
children: /* @__PURE__ */ jsx(ReactIcon, {
icon,
primaryColor,
secondaryColor,
style: svgStyle
})
});
});
Icon$1.displayName = "AntdIcon";
Icon$1.getTwoToneColor = getTwoToneColor;
Icon$1.setTwoToneColor = setTwoToneColor;
const AntdIcon$1 = Icon$1;
var CheckCircleFilled = function CheckCircleFilled2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: CheckCircleFilledSvg
})
});
};
CheckCircleFilled.displayName = "CheckCircleFilled";
const CheckCircleFilled$1 = /* @__PURE__ */ React__namespace.forwardRef(CheckCircleFilled);
var CloseCircleFilled$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm165.4 618.2l-66-.3L512 563.4l-99.3 118.4-66.1.3c-4.4 0-8-3.5-8-8 0-1.9.7-3.7 1.9-5.2l130.1-155L340.5 359a8.32 8.32 0 01-1.9-5.2c0-4.4 3.6-8 8-8l66.1.3L512 464.6l99.3-118.4 66-.3c4.4 0 8 3.5 8 8 0 1.9-.7 3.7-1.9 5.2L553.5 514l130 155c1.2 1.5 1.9 3.3 1.9 5.2 0 4.4-3.6 8-8 8z" } }] }, "name": "close-circle", "theme": "filled" };
const CloseCircleFilledSvg = CloseCircleFilled$2;
var CloseCircleFilled = function CloseCircleFilled2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: CloseCircleFilledSvg
})
});
};
CloseCircleFilled.displayName = "CloseCircleFilled";
const CloseCircleFilled$1 = /* @__PURE__ */ React__namespace.forwardRef(CloseCircleFilled);
var ExclamationCircleFilled$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm-32 232c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v272c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V296zm32 440a48.01 48.01 0 010-96 48.01 48.01 0 010 96z" } }] }, "name": "exclamation-circle", "theme": "filled" };
const ExclamationCircleFilledSvg = ExclamationCircleFilled$2;
var ExclamationCircleFilled = function ExclamationCircleFilled2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: ExclamationCircleFilledSvg
})
});
};
ExclamationCircleFilled.displayName = "ExclamationCircleFilled";
const ExclamationCircleFilled$1 = /* @__PURE__ */ React__namespace.forwardRef(ExclamationCircleFilled);
var InfoCircleFilled$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm32 664c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V456c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v272zm-32-344a48.01 48.01 0 010-96 48.01 48.01 0 010 96z" } }] }, "name": "info-circle", "theme": "filled" };
const InfoCircleFilledSvg = InfoCircleFilled$2;
var InfoCircleFilled = function InfoCircleFilled2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: InfoCircleFilledSvg
})
});
};
InfoCircleFilled.displayName = "InfoCircleFilled";
const InfoCircleFilled$1 = /* @__PURE__ */ React__namespace.forwardRef(InfoCircleFilled);
var LoadingOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "0 0 1024 1024", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M988 548c-19.9 0-36-16.1-36-36 0-59.4-11.6-117-34.6-171.3a440.45 440.45 0 00-94.3-139.9 437.71 437.71 0 00-139.9-94.3C629 83.6 571.4 72 512 72c-19.9 0-36-16.1-36-36s16.1-36 36-36c69.1 0 136.2 13.5 199.3 40.3C772.3 66 827 103 874 150c47 47 83.9 101.8 109.7 162.7 26.7 63.1 40.2 130.2 40.2 199.3.1 19.9-16 36-35.9 36z" } }] }, "name": "loading", "theme": "outlined" };
const LoadingOutlinedSvg = LoadingOutlined$2;
var LoadingOutlined = function LoadingOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: LoadingOutlinedSvg
})
});
};
LoadingOutlined.displayName = "LoadingOutlined";
const LoadingOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(LoadingOutlined);
var fullClone = _objectSpread2$a({}, ReactDOM__namespace);
var version = fullClone.version, reactRender = fullClone.render, unmountComponentAtNode = fullClone.unmountComponentAtNode;
var createRoot;
try {
var mainVersion = Number((version || "").split(".")[0]);
if (mainVersion >= 18) {
createRoot = fullClone.createRoot;
}
} catch (e2) {
}
function toggleWarning(skip) {
var __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = fullClone.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
if (__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED && _typeof$q(__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED) === "object") {
__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint = skip;
}
}
var MARK = "__rc_react_root__";
function modernRender(node, container) {
toggleWarning(true);
var root2 = container[MARK] || createRoot(container);
toggleWarning(false);
root2.render(node);
container[MARK] = root2;
}
function legacyRender(node, container) {
reactRender(node, container);
}
function render(node, container) {
if (createRoot) {
modernRender(node, container);
return;
}
legacyRender(node, container);
}
function modernUnmount(_x) {
return _modernUnmount.apply(this, arguments);
}
function _modernUnmount() {
_modernUnmount = _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime$3().mark(function _callee(container) {
return _regeneratorRuntime$3().wrap(function _callee$(_context) {
while (1)
switch (_context.prev = _context.next) {
case 0:
return _context.abrupt("return", Promise.resolve().then(function() {
var _container$MARK;
(_container$MARK = container[MARK]) === null || _container$MARK === void 0 ? void 0 : _container$MARK.unmount();
delete container[MARK];
}));
case 1:
case "end":
return _context.stop();
}
}, _callee);
}));
return _modernUnmount.apply(this, arguments);
}
function legacyUnmount(container) {
unmountComponentAtNode(container);
}
function unmount(_x2) {
return _unmount.apply(this, arguments);
}
function _unmount() {
_unmount = _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime$3().mark(function _callee2(container) {
return _regeneratorRuntime$3().wrap(function _callee2$(_context2) {
while (1)
switch (_context2.prev = _context2.next) {
case 0:
if (!(createRoot !== void 0)) {
_context2.next = 2;
break;
}
return _context2.abrupt("return", modernUnmount(container));
case 2:
legacyUnmount(container);
case 3:
case "end":
return _context2.stop();
}
}, _callee2);
}));
return _unmount.apply(this, arguments);
}
var Context$1 = /* @__PURE__ */ React__namespace.createContext({});
var DomWrapper = /* @__PURE__ */ function(_React$Component) {
_inherits(DomWrapper2, _React$Component);
var _super = _createSuper(DomWrapper2);
function DomWrapper2() {
_classCallCheck(this, DomWrapper2);
return _super.apply(this, arguments);
}
_createClass(DomWrapper2, [{
key: "render",
value: function render2() {
return this.props.children;
}
}]);
return DomWrapper2;
}(React__namespace.Component);
function useSafeState(defaultValue) {
var destroyRef = React__namespace.useRef(false);
var _React$useState = React__namespace.useState(defaultValue), _React$useState2 = _slicedToArray$e(_React$useState, 2), value = _React$useState2[0], setValue2 = _React$useState2[1];
React__namespace.useEffect(function() {
destroyRef.current = false;
return function() {
destroyRef.current = true;
};
}, []);
function safeSetState(updater, ignoreDestroy) {
if (ignoreDestroy && destroyRef.current) {
return;
}
setValue2(updater);
}
return [value, safeSetState];
}
var STATUS_NONE = "none";
var STATUS_APPEAR = "appear";
var STATUS_ENTER = "enter";
var STATUS_LEAVE = "leave";
var STEP_NONE = "none";
var STEP_PREPARE = "prepare";
var STEP_START = "start";
var STEP_ACTIVE = "active";
var STEP_ACTIVATED = "end";
var STEP_PREPARED = "prepared";
function makePrefixMap(styleProp, eventName) {
var prefixes2 = {};
prefixes2[styleProp.toLowerCase()] = eventName.toLowerCase();
prefixes2["Webkit".concat(styleProp)] = "webkit".concat(eventName);
prefixes2["Moz".concat(styleProp)] = "moz".concat(eventName);
prefixes2["ms".concat(styleProp)] = "MS".concat(eventName);
prefixes2["O".concat(styleProp)] = "o".concat(eventName.toLowerCase());
return prefixes2;
}
function getVendorPrefixes(domSupport, win) {
var prefixes2 = {
animationend: makePrefixMap("Animation", "AnimationEnd"),
transitionend: makePrefixMap("Transition", "TransitionEnd")
};
if (domSupport) {
if (!("AnimationEvent" in win)) {
delete prefixes2.animationend.animation;
}
if (!("TransitionEvent" in win)) {
delete prefixes2.transitionend.transition;
}
}
return prefixes2;
}
var vendorPrefixes = getVendorPrefixes(canUseDom$1(), typeof window !== "undefined" ? window : {});
var style = {};
if (canUseDom$1()) {
var _document$createEleme = document.createElement("div");
style = _document$createEleme.style;
}
var prefixedEventNames = {};
function getVendorPrefixedEventName(eventName) {
if (prefixedEventNames[eventName]) {
return prefixedEventNames[eventName];
}
var prefixMap = vendorPrefixes[eventName];
if (prefixMap) {
var stylePropList = Object.keys(prefixMap);
var len = stylePropList.length;
for (var i2 = 0; i2 < len; i2 += 1) {
var styleProp = stylePropList[i2];
if (Object.prototype.hasOwnProperty.call(prefixMap, styleProp) && styleProp in style) {
prefixedEventNames[eventName] = prefixMap[styleProp];
return prefixedEventNames[eventName];
}
}
}
return "";
}
var internalAnimationEndName = getVendorPrefixedEventName("animationend");
var internalTransitionEndName = getVendorPrefixedEventName("transitionend");
var supportTransition = !!(internalAnimationEndName && internalTransitionEndName);
var animationEndName = internalAnimationEndName || "animationend";
var transitionEndName = internalTransitionEndName || "transitionend";
function getTransitionName$2(transitionName2, transitionType) {
if (!transitionName2)
return null;
if (_typeof$q(transitionName2) === "object") {
var type2 = transitionType.replace(/-\w/g, function(match2) {
return match2[1].toUpperCase();
});
return transitionName2[type2];
}
return "".concat(transitionName2, "-").concat(transitionType);
}
const useDomMotionEvents = function(callback) {
var cacheElementRef = React$a.useRef();
var callbackRef = React$a.useRef(callback);
callbackRef.current = callback;
var onInternalMotionEnd = React__namespace.useCallback(function(event) {
callbackRef.current(event);
}, []);
function removeMotionEvents(element) {
if (element) {
element.removeEventListener(transitionEndName, onInternalMotionEnd);
element.removeEventListener(animationEndName, onInternalMotionEnd);
}
}
function patchMotionEvents(element) {
if (cacheElementRef.current && cacheElementRef.current !== element) {
removeMotionEvents(cacheElementRef.current);
}
if (element && element !== cacheElementRef.current) {
element.addEventListener(transitionEndName, onInternalMotionEnd);
element.addEventListener(animationEndName, onInternalMotionEnd);
cacheElementRef.current = element;
}
}
React__namespace.useEffect(function() {
return function() {
removeMotionEvents(cacheElementRef.current);
};
}, []);
return [patchMotionEvents, removeMotionEvents];
};
var useIsomorphicLayoutEffect = canUseDom$1() ? React$a.useLayoutEffect : React$a.useEffect;
var raf = function raf2(callback) {
return +setTimeout(callback, 16);
};
var caf = function caf2(num) {
return clearTimeout(num);
};
if (typeof window !== "undefined" && "requestAnimationFrame" in window) {
raf = function raf2(callback) {
return window.requestAnimationFrame(callback);
};
caf = function caf2(handle) {
return window.cancelAnimationFrame(handle);
};
}
var rafUUID = 0;
var rafIds = /* @__PURE__ */ new Map();
function cleanup(id2) {
rafIds.delete(id2);
}
var wrapperRaf$1 = function wrapperRaf2(callback) {
var times = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 1;
rafUUID += 1;
var id2 = rafUUID;
function callRef(leftTimes) {
if (leftTimes === 0) {
cleanup(id2);
callback();
} else {
var realId = raf(function() {
callRef(leftTimes - 1);
});
rafIds.set(id2, realId);
}
}
callRef(times);
return id2;
};
wrapperRaf$1.cancel = function(id2) {
var realId = rafIds.get(id2);
cleanup(realId);
return caf(realId);
};
const useNextFrame = function() {
var nextFrameRef = React__namespace.useRef(null);
function cancelNextFrame() {
wrapperRaf$1.cancel(nextFrameRef.current);
}
function nextFrame(callback) {
var delay = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 2;
cancelNextFrame();
var nextFrameId = wrapperRaf$1(function() {
if (delay <= 1) {
callback({
isCanceled: function isCanceled() {
return nextFrameId !== nextFrameRef.current;
}
});
} else {
nextFrame(callback, delay - 1);
}
});
nextFrameRef.current = nextFrameId;
}
React__namespace.useEffect(function() {
return function() {
cancelNextFrame();
};
}, []);
return [nextFrame, cancelNextFrame];
};
var FULL_STEP_QUEUE = [STEP_PREPARE, STEP_START, STEP_ACTIVE, STEP_ACTIVATED];
var SIMPLE_STEP_QUEUE = [STEP_PREPARE, STEP_PREPARED];
var SkipStep = false;
var DoStep = true;
function isActive(step2) {
return step2 === STEP_ACTIVE || step2 === STEP_ACTIVATED;
}
const useStepQueue = function(status, prepareOnly, callback) {
var _useState = useSafeState(STEP_NONE), _useState2 = _slicedToArray$e(_useState, 2), step2 = _useState2[0], setStep = _useState2[1];
var _useNextFrame = useNextFrame(), _useNextFrame2 = _slicedToArray$e(_useNextFrame, 2), nextFrame = _useNextFrame2[0], cancelNextFrame = _useNextFrame2[1];
function startQueue() {
setStep(STEP_PREPARE, true);
}
var STEP_QUEUE = prepareOnly ? SIMPLE_STEP_QUEUE : FULL_STEP_QUEUE;
useIsomorphicLayoutEffect(function() {
if (step2 !== STEP_NONE && step2 !== STEP_ACTIVATED) {
var index2 = STEP_QUEUE.indexOf(step2);
var nextStep = STEP_QUEUE[index2 + 1];
var result = callback(step2);
if (result === SkipStep) {
setStep(nextStep, true);
} else if (nextStep) {
nextFrame(function(info) {
function doNext() {
if (info.isCanceled())
return;
setStep(nextStep, true);
}
if (result === true) {
doNext();
} else {
Promise.resolve(result).then(doNext);
}
});
}
}
}, [status, step2]);
React__namespace.useEffect(function() {
return function() {
cancelNextFrame();
};
}, []);
return [startQueue, step2];
};
function useStatus(supportMotion, visible, getElement2, _ref) {
var _ref$motionEnter = _ref.motionEnter, motionEnter = _ref$motionEnter === void 0 ? true : _ref$motionEnter, _ref$motionAppear = _ref.motionAppear, motionAppear = _ref$motionAppear === void 0 ? true : _ref$motionAppear, _ref$motionLeave = _ref.motionLeave, motionLeave = _ref$motionLeave === void 0 ? true : _ref$motionLeave, motionDeadline = _ref.motionDeadline, motionLeaveImmediately = _ref.motionLeaveImmediately, onAppearPrepare = _ref.onAppearPrepare, onEnterPrepare = _ref.onEnterPrepare, onLeavePrepare = _ref.onLeavePrepare, onAppearStart = _ref.onAppearStart, onEnterStart = _ref.onEnterStart, onLeaveStart = _ref.onLeaveStart, onAppearActive = _ref.onAppearActive, onEnterActive = _ref.onEnterActive, onLeaveActive = _ref.onLeaveActive, onAppearEnd = _ref.onAppearEnd, onEnterEnd = _ref.onEnterEnd, onLeaveEnd = _ref.onLeaveEnd, onVisibleChanged = _ref.onVisibleChanged;
var _useState = useSafeState(), _useState2 = _slicedToArray$e(_useState, 2), asyncVisible = _useState2[0], setAsyncVisible = _useState2[1];
var _useState3 = useSafeState(STATUS_NONE), _useState4 = _slicedToArray$e(_useState3, 2), status = _useState4[0], setStatus = _useState4[1];
var _useState5 = useSafeState(null), _useState6 = _slicedToArray$e(_useState5, 2), style2 = _useState6[0], setStyle = _useState6[1];
var mountedRef = React$a.useRef(false);
var deadlineRef = React$a.useRef(null);
function getDomElement() {
return getElement2();
}
var activeRef = React$a.useRef(false);
function updateMotionEndStatus() {
setStatus(STATUS_NONE, true);
setStyle(null, true);
}
function onInternalMotionEnd(event) {
var element = getDomElement();
if (event && !event.deadline && event.target !== element) {
return;
}
var currentActive = activeRef.current;
var canEnd;
if (status === STATUS_APPEAR && currentActive) {
canEnd = onAppearEnd === null || onAppearEnd === void 0 ? void 0 : onAppearEnd(element, event);
} else if (status === STATUS_ENTER && currentActive) {
canEnd = onEnterEnd === null || onEnterEnd === void 0 ? void 0 : onEnterEnd(element, event);
} else if (status === STATUS_LEAVE && currentActive) {
canEnd = onLeaveEnd === null || onLeaveEnd === void 0 ? void 0 : onLeaveEnd(element, event);
}
if (status !== STATUS_NONE && currentActive && canEnd !== false) {
updateMotionEndStatus();
}
}
var _useDomMotionEvents = useDomMotionEvents(onInternalMotionEnd), _useDomMotionEvents2 = _slicedToArray$e(_useDomMotionEvents, 1), patchMotionEvents = _useDomMotionEvents2[0];
var getEventHandlers = function getEventHandlers2(targetStatus) {
var _ref2, _ref3, _ref4;
switch (targetStatus) {
case STATUS_APPEAR:
return _ref2 = {}, _defineProperty$b(_ref2, STEP_PREPARE, onAppearPrepare), _defineProperty$b(_ref2, STEP_START, onAppearStart), _defineProperty$b(_ref2, STEP_ACTIVE, onAppearActive), _ref2;
case STATUS_ENTER:
return _ref3 = {}, _defineProperty$b(_ref3, STEP_PREPARE, onEnterPrepare), _defineProperty$b(_ref3, STEP_START, onEnterStart), _defineProperty$b(_ref3, STEP_ACTIVE, onEnterActive), _ref3;
case STATUS_LEAVE:
return _ref4 = {}, _defineProperty$b(_ref4, STEP_PREPARE, onLeavePrepare), _defineProperty$b(_ref4, STEP_START, onLeaveStart), _defineProperty$b(_ref4, STEP_ACTIVE, onLeaveActive), _ref4;
default:
return {};
}
};
var eventHandlers = React__namespace.useMemo(function() {
return getEventHandlers(status);
}, [status]);
var _useStepQueue = useStepQueue(status, !supportMotion, function(newStep) {
if (newStep === STEP_PREPARE) {
var onPrepare = eventHandlers[STEP_PREPARE];
if (!onPrepare) {
return SkipStep;
}
return onPrepare(getDomElement());
}
if (step2 in eventHandlers) {
var _eventHandlers$step;
setStyle(((_eventHandlers$step = eventHandlers[step2]) === null || _eventHandlers$step === void 0 ? void 0 : _eventHandlers$step.call(eventHandlers, getDomElement(), null)) || null);
}
if (step2 === STEP_ACTIVE) {
patchMotionEvents(getDomElement());
if (motionDeadline > 0) {
clearTimeout(deadlineRef.current);
deadlineRef.current = setTimeout(function() {
onInternalMotionEnd({
deadline: true
});
}, motionDeadline);
}
}
if (step2 === STEP_PREPARED) {
updateMotionEndStatus();
}
return DoStep;
}), _useStepQueue2 = _slicedToArray$e(_useStepQueue, 2), startStep = _useStepQueue2[0], step2 = _useStepQueue2[1];
var active = isActive(step2);
activeRef.current = active;
useIsomorphicLayoutEffect(function() {
setAsyncVisible(visible);
var isMounted = mountedRef.current;
mountedRef.current = true;
var nextStatus;
if (!isMounted && visible && motionAppear) {
nextStatus = STATUS_APPEAR;
}
if (isMounted && visible && motionEnter) {
nextStatus = STATUS_ENTER;
}
if (isMounted && !visible && motionLeave || !isMounted && motionLeaveImmediately && !visible && motionLeave) {
nextStatus = STATUS_LEAVE;
}
var nextEventHandlers = getEventHandlers(nextStatus);
if (nextStatus && (supportMotion || nextEventHandlers[STEP_PREPARE])) {
setStatus(nextStatus);
startStep();
} else {
setStatus(STATUS_NONE);
}
}, [visible]);
React$a.useEffect(function() {
if (status === STATUS_APPEAR && !motionAppear || status === STATUS_ENTER && !motionEnter || status === STATUS_LEAVE && !motionLeave) {
setStatus(STATUS_NONE);
}
}, [motionAppear, motionEnter, motionLeave]);
React$a.useEffect(function() {
return function() {
mountedRef.current = false;
clearTimeout(deadlineRef.current);
};
}, []);
var firstMountChangeRef = React__namespace.useRef(false);
React$a.useEffect(function() {
if (asyncVisible) {
firstMountChangeRef.current = true;
}
if (asyncVisible !== void 0 && status === STATUS_NONE) {
if (firstMountChangeRef.current || asyncVisible) {
onVisibleChanged === null || onVisibleChanged === void 0 ? void 0 : onVisibleChanged(asyncVisible);
}
firstMountChangeRef.current = true;
}
}, [asyncVisible, status]);
var mergedStyle = style2;
if (eventHandlers[STEP_PREPARE] && step2 === STEP_START) {
mergedStyle = _objectSpread2$a({
transition: "none"
}, mergedStyle);
}
return [status, step2, mergedStyle, asyncVisible !== null && asyncVisible !== void 0 ? asyncVisible : visible];
}
function genCSSMotion(config) {
var transitionSupport = config;
if (_typeof$q(config) === "object") {
transitionSupport = config.transitionSupport;
}
function isSupportTransition(props, contextMotion) {
return !!(props.motionName && transitionSupport && contextMotion !== false);
}
var CSSMotion2 = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _props$visible = props.visible, visible = _props$visible === void 0 ? true : _props$visible, _props$removeOnLeave = props.removeOnLeave, removeOnLeave = _props$removeOnLeave === void 0 ? true : _props$removeOnLeave, forceRender = props.forceRender, children = props.children, motionName = props.motionName, leavedClassName = props.leavedClassName, eventProps = props.eventProps;
var _React$useContext = React__namespace.useContext(Context$1), contextMotion = _React$useContext.motion;
var supportMotion = isSupportTransition(props, contextMotion);
var nodeRef = React$a.useRef();
var wrapperNodeRef = React$a.useRef();
function getDomElement() {
try {
return nodeRef.current instanceof HTMLElement ? nodeRef.current : findDOMNode(wrapperNodeRef.current);
} catch (e2) {
return null;
}
}
var _useStatus = useStatus(supportMotion, visible, getDomElement, props), _useStatus2 = _slicedToArray$e(_useStatus, 4), status = _useStatus2[0], statusStep = _useStatus2[1], statusStyle = _useStatus2[2], mergedVisible = _useStatus2[3];
var renderedRef = React__namespace.useRef(mergedVisible);
if (mergedVisible) {
renderedRef.current = true;
}
var setNodeRef = React__namespace.useCallback(function(node) {
nodeRef.current = node;
fillRef(ref, node);
}, [ref]);
var motionChildren;
var mergedProps = _objectSpread2$a(_objectSpread2$a({}, eventProps), {}, {
visible
});
if (!children) {
motionChildren = null;
} else if (status === STATUS_NONE) {
if (mergedVisible) {
motionChildren = children(_objectSpread2$a({}, mergedProps), setNodeRef);
} else if (!removeOnLeave && renderedRef.current && leavedClassName) {
motionChildren = children(_objectSpread2$a(_objectSpread2$a({}, mergedProps), {}, {
className: leavedClassName
}), setNodeRef);
} else if (forceRender || !removeOnLeave && !leavedClassName) {
motionChildren = children(_objectSpread2$a(_objectSpread2$a({}, mergedProps), {}, {
style: {
display: "none"
}
}), setNodeRef);
} else {
motionChildren = null;
}
} else {
var _classNames;
var statusSuffix;
if (statusStep === STEP_PREPARE) {
statusSuffix = "prepare";
} else if (isActive(statusStep)) {
statusSuffix = "active";
} else if (statusStep === STEP_START) {
statusSuffix = "start";
}
var motionCls = getTransitionName$2(motionName, "".concat(status, "-").concat(statusSuffix));
motionChildren = children(_objectSpread2$a(_objectSpread2$a({}, mergedProps), {}, {
className: classnames(getTransitionName$2(motionName, status), (_classNames = {}, _defineProperty$b(_classNames, motionCls, motionCls && statusSuffix), _defineProperty$b(_classNames, motionName, typeof motionName === "string"), _classNames)),
style: statusStyle
}), setNodeRef);
}
if (/* @__PURE__ */ React__namespace.isValidElement(motionChildren) && supportRef(motionChildren)) {
var _ref = motionChildren, originNodeRef = _ref.ref;
if (!originNodeRef) {
motionChildren = /* @__PURE__ */ React__namespace.cloneElement(motionChildren, {
ref: setNodeRef
});
}
}
return /* @__PURE__ */ jsx(DomWrapper, {
ref: wrapperNodeRef,
children: motionChildren
});
});
CSSMotion2.displayName = "CSSMotion";
return CSSMotion2;
}
const CSSMotion = genCSSMotion(supportTransition);
var STATUS_ADD = "add";
var STATUS_KEEP = "keep";
var STATUS_REMOVE = "remove";
var STATUS_REMOVED = "removed";
function wrapKeyToObject(key2) {
var keyObj;
if (key2 && _typeof$q(key2) === "object" && "key" in key2) {
keyObj = key2;
} else {
keyObj = {
key: key2
};
}
return _objectSpread2$a(_objectSpread2$a({}, keyObj), {}, {
key: String(keyObj.key)
});
}
function parseKeys() {
var keys2 = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : [];
return keys2.map(wrapKeyToObject);
}
function diffKeys() {
var prevKeys = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : [];
var currentKeys = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : [];
var list = [];
var currentIndex = 0;
var currentLen = currentKeys.length;
var prevKeyObjects = parseKeys(prevKeys);
var currentKeyObjects = parseKeys(currentKeys);
prevKeyObjects.forEach(function(keyObj) {
var hit = false;
for (var i2 = currentIndex; i2 < currentLen; i2 += 1) {
var currentKeyObj = currentKeyObjects[i2];
if (currentKeyObj.key === keyObj.key) {
if (currentIndex < i2) {
list = list.concat(currentKeyObjects.slice(currentIndex, i2).map(function(obj) {
return _objectSpread2$a(_objectSpread2$a({}, obj), {}, {
status: STATUS_ADD
});
}));
currentIndex = i2;
}
list.push(_objectSpread2$a(_objectSpread2$a({}, currentKeyObj), {}, {
status: STATUS_KEEP
}));
currentIndex += 1;
hit = true;
break;
}
}
if (!hit) {
list.push(_objectSpread2$a(_objectSpread2$a({}, keyObj), {}, {
status: STATUS_REMOVE
}));
}
});
if (currentIndex < currentLen) {
list = list.concat(currentKeyObjects.slice(currentIndex).map(function(obj) {
return _objectSpread2$a(_objectSpread2$a({}, obj), {}, {
status: STATUS_ADD
});
}));
}
var keys2 = {};
list.forEach(function(_ref) {
var key2 = _ref.key;
keys2[key2] = (keys2[key2] || 0) + 1;
});
var duplicatedKeys = Object.keys(keys2).filter(function(key2) {
return keys2[key2] > 1;
});
duplicatedKeys.forEach(function(matchKey) {
list = list.filter(function(_ref2) {
var key2 = _ref2.key, status = _ref2.status;
return key2 !== matchKey || status !== STATUS_REMOVE;
});
list.forEach(function(node) {
if (node.key === matchKey) {
node.status = STATUS_KEEP;
}
});
});
return list;
}
var _excluded$L = ["component", "children", "onVisibleChanged", "onAllRemoved"], _excluded2$9 = ["status"];
var MOTION_PROP_NAMES = ["eventProps", "visible", "children", "motionName", "motionAppear", "motionEnter", "motionLeave", "motionLeaveImmediately", "motionDeadline", "removeOnLeave", "leavedClassName", "onAppearStart", "onAppearActive", "onAppearEnd", "onEnterStart", "onEnterActive", "onEnterEnd", "onLeaveStart", "onLeaveActive", "onLeaveEnd"];
function genCSSMotionList(transitionSupport) {
var CSSMotion$1 = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : CSSMotion;
var CSSMotionList2 = /* @__PURE__ */ function(_React$Component) {
_inherits(CSSMotionList3, _React$Component);
var _super = _createSuper(CSSMotionList3);
function CSSMotionList3() {
var _this2;
_classCallCheck(this, CSSMotionList3);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this2 = _super.call.apply(_super, [this].concat(args));
_defineProperty$b(_assertThisInitialized(_this2), "state", {
keyEntities: []
});
_defineProperty$b(_assertThisInitialized(_this2), "removeKey", function(removeKey) {
var keyEntities = _this2.state.keyEntities;
var nextKeyEntities = keyEntities.map(function(entity) {
if (entity.key !== removeKey)
return entity;
return _objectSpread2$a(_objectSpread2$a({}, entity), {}, {
status: STATUS_REMOVED
});
});
_this2.setState({
keyEntities: nextKeyEntities
});
return nextKeyEntities.filter(function(_ref) {
var status = _ref.status;
return status !== STATUS_REMOVED;
}).length;
});
return _this2;
}
_createClass(CSSMotionList3, [{
key: "render",
value: function render2() {
var _this2 = this;
var keyEntities = this.state.keyEntities;
var _this$props = this.props, component = _this$props.component, children = _this$props.children, _onVisibleChanged = _this$props.onVisibleChanged, onAllRemoved = _this$props.onAllRemoved, restProps = _objectWithoutProperties$1(_this$props, _excluded$L);
var Component = component || React__namespace.Fragment;
var motionProps = {};
MOTION_PROP_NAMES.forEach(function(prop) {
motionProps[prop] = restProps[prop];
delete restProps[prop];
});
delete restProps.keys;
return /* @__PURE__ */ jsx(Component, {
...restProps,
children: keyEntities.map(function(_ref2) {
var status = _ref2.status, eventProps = _objectWithoutProperties$1(_ref2, _excluded2$9);
var visible = status === STATUS_ADD || status === STATUS_KEEP;
return /* @__PURE__ */ React$a.createElement(CSSMotion$1, {
...motionProps,
key: eventProps.key,
visible,
eventProps,
onVisibleChanged: function onVisibleChanged(changedVisible) {
_onVisibleChanged === null || _onVisibleChanged === void 0 ? void 0 : _onVisibleChanged(changedVisible, {
key: eventProps.key
});
if (!changedVisible) {
var restKeysCount = _this2.removeKey(eventProps.key);
if (restKeysCount === 0 && onAllRemoved) {
onAllRemoved();
}
}
}
}, children);
})
});
}
}], [{
key: "getDerivedStateFromProps",
value: function getDerivedStateFromProps(_ref3, _ref4) {
var keys2 = _ref3.keys;
var keyEntities = _ref4.keyEntities;
var parsedKeyObjects = parseKeys(keys2);
var mixedKeyEntities = diffKeys(keyEntities, parsedKeyObjects);
return {
keyEntities: mixedKeyEntities.filter(function(entity) {
var prevEntity = keyEntities.find(function(_ref5) {
var key2 = _ref5.key;
return entity.key === key2;
});
if (prevEntity && prevEntity.status === STATUS_REMOVED && entity.status === STATUS_REMOVE) {
return false;
}
return true;
})
};
}
}]);
return CSSMotionList3;
}(React__namespace.Component);
_defineProperty$b(CSSMotionList2, "defaultProps", {
component: "div"
});
return CSSMotionList2;
}
const CSSMotionList = genCSSMotionList(supportTransition);
var Notice = /* @__PURE__ */ function(_Component) {
_inherits(Notice2, _Component);
var _super = _createSuper(Notice2);
function Notice2() {
var _this2;
_classCallCheck(this, Notice2);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this2 = _super.call.apply(_super, [this].concat(args));
_this2.closeTimer = null;
_this2.close = function(e2) {
if (e2) {
e2.stopPropagation();
}
_this2.clearCloseTimer();
var _this$props = _this2.props, onClose = _this$props.onClose, noticeKey = _this$props.noticeKey;
if (onClose) {
onClose(noticeKey);
}
};
_this2.startCloseTimer = function() {
if (_this2.props.duration) {
_this2.closeTimer = window.setTimeout(function() {
_this2.close();
}, _this2.props.duration * 1e3);
}
};
_this2.clearCloseTimer = function() {
if (_this2.closeTimer) {
clearTimeout(_this2.closeTimer);
_this2.closeTimer = null;
}
};
return _this2;
}
_createClass(Notice2, [{
key: "componentDidMount",
value: function componentDidMount() {
this.startCloseTimer();
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate(prevProps) {
if (this.props.duration !== prevProps.duration || this.props.updateMark !== prevProps.updateMark || this.props.visible !== prevProps.visible && this.props.visible) {
this.restartCloseTimer();
}
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
this.clearCloseTimer();
}
}, {
key: "restartCloseTimer",
value: function restartCloseTimer() {
this.clearCloseTimer();
this.startCloseTimer();
}
}, {
key: "render",
value: function render2() {
var _this2 = this;
var _this$props2 = this.props, prefixCls = _this$props2.prefixCls, className = _this$props2.className, closable = _this$props2.closable, closeIcon = _this$props2.closeIcon, style2 = _this$props2.style, onClick = _this$props2.onClick, children = _this$props2.children, holder = _this$props2.holder;
var componentClass = "".concat(prefixCls, "-notice");
var dataOrAriaAttributeProps = Object.keys(this.props).reduce(function(acc, key2) {
if (key2.substr(0, 5) === "data-" || key2.substr(0, 5) === "aria-" || key2 === "role") {
acc[key2] = _this2.props[key2];
}
return acc;
}, {});
var node = /* @__PURE__ */ jsxs("div", {
className: classnames(componentClass, className, _defineProperty$b({}, "".concat(componentClass, "-closable"), closable)),
style: style2,
onMouseEnter: this.clearCloseTimer,
onMouseLeave: this.startCloseTimer,
onClick,
...dataOrAriaAttributeProps,
children: [/* @__PURE__ */ jsx("div", {
className: "".concat(componentClass, "-content"),
children
}), closable ? /* @__PURE__ */ jsx("a", {
tabIndex: 0,
onClick: this.close,
className: "".concat(componentClass, "-close"),
children: closeIcon || /* @__PURE__ */ jsx("span", {
className: "".concat(componentClass, "-close-x")
})
}) : null]
});
if (holder) {
return /* @__PURE__ */ ReactDOM__default.default.createPortal(node, holder);
}
return node;
}
}]);
return Notice2;
}(React$a.Component);
Notice.defaultProps = {
onClose: function onClose() {
},
duration: 1.5
};
function useNotification(notificationInstance2) {
var createdRef = React__namespace.useRef({});
var _React$useState = React__namespace.useState([]), _React$useState2 = _slicedToArray$e(_React$useState, 2), elements = _React$useState2[0], setElements = _React$useState2[1];
function notify(noticeProps) {
var firstMount = true;
notificationInstance2.add(noticeProps, function(div, props) {
var key2 = props.key;
if (div && (!createdRef.current[key2] || firstMount)) {
var noticeEle = /* @__PURE__ */ jsx(Notice, {
...props,
holder: div
});
createdRef.current[key2] = noticeEle;
setElements(function(originElements) {
var index2 = originElements.findIndex(function(ele) {
return ele.key === props.key;
});
if (index2 === -1) {
return [].concat(_toConsumableArray$c(originElements), [noticeEle]);
}
var cloneList = _toConsumableArray$c(originElements);
cloneList[index2] = noticeEle;
return cloneList;
});
}
firstMount = false;
});
}
return [
notify,
/* @__PURE__ */ jsx(Fragment, {
children: elements
})
];
}
var _excluded$K = ["getContainer"];
var seed = 0;
var now$3 = Date.now();
function getUuid() {
var id2 = seed;
seed += 1;
return "rcNotification_".concat(now$3, "_").concat(id2);
}
var Notification = /* @__PURE__ */ function(_Component) {
_inherits(Notification2, _Component);
var _super = _createSuper(Notification2);
function Notification2() {
var _this2;
_classCallCheck(this, Notification2);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this2 = _super.call.apply(_super, [this].concat(args));
_this2.state = {
notices: []
};
_this2.hookRefs = /* @__PURE__ */ new Map();
_this2.add = function(originNotice, holderCallback) {
var _originNotice$key;
var key2 = (_originNotice$key = originNotice.key) !== null && _originNotice$key !== void 0 ? _originNotice$key : getUuid();
var notice2 = _objectSpread2$a(_objectSpread2$a({}, originNotice), {}, {
key: key2
});
var maxCount2 = _this2.props.maxCount;
_this2.setState(function(previousState) {
var notices = previousState.notices;
var noticeIndex = notices.map(function(v2) {
return v2.notice.key;
}).indexOf(key2);
var updatedNotices = notices.concat();
if (noticeIndex !== -1) {
updatedNotices.splice(noticeIndex, 1, {
notice: notice2,
holderCallback
});
} else {
if (maxCount2 && notices.length >= maxCount2) {
notice2.key = updatedNotices[0].notice.key;
notice2.updateMark = getUuid();
notice2.userPassKey = key2;
updatedNotices.shift();
}
updatedNotices.push({
notice: notice2,
holderCallback
});
}
return {
notices: updatedNotices
};
});
};
_this2.remove = function(removeKey) {
_this2.setState(function(_ref) {
var notices = _ref.notices;
return {
notices: notices.filter(function(_ref2) {
var _ref2$notice = _ref2.notice, key2 = _ref2$notice.key, userPassKey = _ref2$notice.userPassKey;
var mergedKey = userPassKey !== null && userPassKey !== void 0 ? userPassKey : key2;
return mergedKey !== removeKey;
})
};
});
};
_this2.noticePropsMap = {};
return _this2;
}
_createClass(Notification2, [{
key: "getTransitionName",
value: function getTransitionName2() {
var _this$props = this.props, prefixCls = _this$props.prefixCls, animation = _this$props.animation;
var transitionName2 = this.props.transitionName;
if (!transitionName2 && animation) {
transitionName2 = "".concat(prefixCls, "-").concat(animation);
}
return transitionName2;
}
}, {
key: "render",
value: function render2() {
var _this2 = this;
var notices = this.state.notices;
var _this$props2 = this.props, prefixCls = _this$props2.prefixCls, className = _this$props2.className, closeIcon = _this$props2.closeIcon, style2 = _this$props2.style;
var noticeKeys = [];
notices.forEach(function(_ref3, index2) {
var notice2 = _ref3.notice, holderCallback = _ref3.holderCallback;
var updateMark = index2 === notices.length - 1 ? notice2.updateMark : void 0;
var key2 = notice2.key, userPassKey = notice2.userPassKey;
var noticeProps = _objectSpread2$a(_objectSpread2$a(_objectSpread2$a({
prefixCls,
closeIcon
}, notice2), notice2.props), {}, {
key: key2,
noticeKey: userPassKey || key2,
updateMark,
onClose: function onClose(noticeKey) {
var _notice$onClose;
_this2.remove(noticeKey);
(_notice$onClose = notice2.onClose) === null || _notice$onClose === void 0 ? void 0 : _notice$onClose.call(notice2);
},
onClick: notice2.onClick,
children: notice2.content
});
noticeKeys.push(key2);
_this2.noticePropsMap[key2] = {
props: noticeProps,
holderCallback
};
});
return /* @__PURE__ */ jsx("div", {
className: classnames(prefixCls, className),
style: style2,
children: /* @__PURE__ */ jsx(CSSMotionList, {
keys: noticeKeys,
motionName: this.getTransitionName(),
onVisibleChanged: function onVisibleChanged(changedVisible, _ref4) {
var key2 = _ref4.key;
if (!changedVisible) {
delete _this2.noticePropsMap[key2];
}
},
children: function(_ref5) {
var key2 = _ref5.key, motionClassName = _ref5.className, motionStyle = _ref5.style, visible = _ref5.visible;
var _this2$noticePropsMap = _this2.noticePropsMap[key2], noticeProps = _this2$noticePropsMap.props, holderCallback = _this2$noticePropsMap.holderCallback;
if (holderCallback) {
return /* @__PURE__ */ jsx("div", {
className: classnames(motionClassName, "".concat(prefixCls, "-hook-holder")),
style: _objectSpread2$a({}, motionStyle),
ref: function ref(div) {
if (typeof key2 === "undefined") {
return;
}
if (div) {
_this2.hookRefs.set(key2, div);
holderCallback(div, noticeProps);
} else {
_this2.hookRefs.delete(key2);
}
}
}, key2);
}
return /* @__PURE__ */ jsx(Notice, {
...noticeProps,
className: classnames(motionClassName, noticeProps === null || noticeProps === void 0 ? void 0 : noticeProps.className),
style: _objectSpread2$a(_objectSpread2$a({}, motionStyle), noticeProps === null || noticeProps === void 0 ? void 0 : noticeProps.style),
visible
});
}
})
});
}
}]);
return Notification2;
}(React$a.Component);
Notification.newInstance = void 0;
Notification.defaultProps = {
prefixCls: "rc-notification",
animation: "fade",
style: {
top: 65,
left: "50%"
}
};
Notification.newInstance = function newNotificationInstance(properties, callback) {
var _ref6 = properties || {}, getContainer2 = _ref6.getContainer, props = _objectWithoutProperties$1(_ref6, _excluded$K);
var div = document.createElement("div");
if (getContainer2) {
var root2 = getContainer2();
root2.appendChild(div);
} else {
document.body.appendChild(div);
}
var called = false;
function ref(notification2) {
if (called) {
return;
}
called = true;
callback({
notice: function notice2(noticeProps) {
notification2.add(noticeProps);
},
removeNotice: function removeNotice(key2) {
notification2.remove(key2);
},
component: notification2,
destroy: function destroy() {
unmount(div);
if (div.parentNode) {
div.parentNode.removeChild(div);
}
},
useNotification: function useNotification$1() {
return useNotification(notification2);
}
});
}
render(
/* @__PURE__ */ jsx(Notification, {
...props,
ref
}),
div
);
};
function createUseMessage(getRcNotificationInstance, getRCNoticeProps2) {
var useMessage = function useMessage2() {
var getPrefixCls;
var getPopupContainer;
var innerInstance = null;
var proxy = {
add: function add(noticeProps, holderCallback) {
innerInstance === null || innerInstance === void 0 ? void 0 : innerInstance.component.add(noticeProps, holderCallback);
}
};
var _useRCNotification = useNotification(proxy), _useRCNotification2 = _slicedToArray$e(_useRCNotification, 2), hookNotify = _useRCNotification2[0], holder = _useRCNotification2[1];
function notify(args) {
var customizePrefixCls = args.prefixCls;
var mergedPrefixCls = getPrefixCls("message", customizePrefixCls);
var rootPrefixCls = getPrefixCls();
var target = args.key || getKeyThenIncreaseKey();
var closePromise = new Promise(function(resolve) {
var callback = function callback2() {
if (typeof args.onClose === "function") {
args.onClose();
}
return resolve(true);
};
getRcNotificationInstance(_extends$3(_extends$3({}, args), {
prefixCls: mergedPrefixCls,
rootPrefixCls,
getPopupContainer
}), function(_ref) {
var prefixCls = _ref.prefixCls, instance = _ref.instance;
innerInstance = instance;
hookNotify(getRCNoticeProps2(_extends$3(_extends$3({}, args), {
key: target,
onClose: callback
}), prefixCls));
});
});
var result = function result2() {
if (innerInstance) {
innerInstance.removeNotice(target);
}
};
result.then = function(filled, rejected) {
return closePromise.then(filled, rejected);
};
result.promise = closePromise;
return result;
}
var hookApiRef = React__namespace.useRef({});
hookApiRef.current.open = notify;
typeList.forEach(function(type2) {
return attachTypeApi(hookApiRef.current, type2);
});
return [
hookApiRef.current,
/* @__PURE__ */ jsx(ConfigConsumer, {
children: function(context2) {
getPrefixCls = context2.getPrefixCls;
getPopupContainer = context2.getPopupContainer;
return holder;
}
}, "holder")
];
};
return useMessage;
}
var messageInstance;
var defaultDuration$1 = 3;
var defaultTop$1;
var key$1 = 1;
var localPrefixCls = "";
var transitionName = "move-up";
var hasTransitionName = false;
var getContainer;
var maxCount$1;
var rtl$1 = false;
function getKeyThenIncreaseKey() {
return key$1++;
}
function setMessageConfig(options) {
if (options.top !== void 0) {
defaultTop$1 = options.top;
messageInstance = null;
}
if (options.duration !== void 0) {
defaultDuration$1 = options.duration;
}
if (options.prefixCls !== void 0) {
localPrefixCls = options.prefixCls;
}
if (options.getContainer !== void 0) {
getContainer = options.getContainer;
messageInstance = null;
}
if (options.transitionName !== void 0) {
transitionName = options.transitionName;
messageInstance = null;
hasTransitionName = true;
}
if (options.maxCount !== void 0) {
maxCount$1 = options.maxCount;
messageInstance = null;
}
if (options.rtl !== void 0) {
rtl$1 = options.rtl;
}
}
function getRCNotificationInstance(args, callback) {
var customizePrefixCls = args.prefixCls, getContextPopupContainer = args.getPopupContainer;
var _globalConfig = globalConfig(), getPrefixCls = _globalConfig.getPrefixCls, getRootPrefixCls = _globalConfig.getRootPrefixCls, getIconPrefixCls = _globalConfig.getIconPrefixCls;
var prefixCls = getPrefixCls("message", customizePrefixCls || localPrefixCls);
var rootPrefixCls = getRootPrefixCls(args.rootPrefixCls, prefixCls);
var iconPrefixCls = getIconPrefixCls();
if (messageInstance) {
callback({
prefixCls,
rootPrefixCls,
iconPrefixCls,
instance: messageInstance
});
return;
}
var instanceConfig = {
prefixCls,
transitionName: hasTransitionName ? transitionName : "".concat(rootPrefixCls, "-").concat(transitionName),
style: {
top: defaultTop$1
},
getContainer: getContainer || getContextPopupContainer,
maxCount: maxCount$1
};
Notification.newInstance(instanceConfig, function(instance) {
if (messageInstance) {
callback({
prefixCls,
rootPrefixCls,
iconPrefixCls,
instance: messageInstance
});
return;
}
messageInstance = instance;
callback({
prefixCls,
rootPrefixCls,
iconPrefixCls,
instance
});
});
}
var typeToIcon$1 = {
info: InfoCircleFilled$1,
success: CheckCircleFilled$1,
error: CloseCircleFilled$1,
warning: ExclamationCircleFilled$1,
loading: LoadingOutlined$1
};
var typeList = Object.keys(typeToIcon$1);
function getRCNoticeProps$1(args, prefixCls, iconPrefixCls) {
var _classNames;
var duration = args.duration !== void 0 ? args.duration : defaultDuration$1;
var IconComponent = typeToIcon$1[args.type];
var messageClass = classnames("".concat(prefixCls, "-custom-content"), (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(args.type), args.type), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), rtl$1 === true), _classNames));
return {
key: args.key,
duration,
style: args.style || {},
className: args.className,
content: /* @__PURE__ */ jsx(_ConfigProvider, {
iconPrefixCls,
children: /* @__PURE__ */ jsxs("div", {
className: messageClass,
children: [args.icon || IconComponent && /* @__PURE__ */ jsx(IconComponent, {}), /* @__PURE__ */ jsx("span", {
children: args.content
})]
})
}),
onClose: args.onClose,
onClick: args.onClick
};
}
function notice$1(args) {
var target = args.key || getKeyThenIncreaseKey();
var closePromise = new Promise(function(resolve) {
var callback = function callback2() {
if (typeof args.onClose === "function") {
args.onClose();
}
return resolve(true);
};
getRCNotificationInstance(args, function(_ref) {
var prefixCls = _ref.prefixCls, iconPrefixCls = _ref.iconPrefixCls, instance = _ref.instance;
instance.notice(getRCNoticeProps$1(_extends$3(_extends$3({}, args), {
key: target,
onClose: callback
}), prefixCls, iconPrefixCls));
});
});
var result = function result2() {
var _a;
if (messageInstance) {
messageInstance.removeNotice(target);
(_a = args.onClose) === null || _a === void 0 ? void 0 : _a.call(args);
}
};
result.then = function(filled, rejected) {
return closePromise.then(filled, rejected);
};
result.promise = closePromise;
return result;
}
function isArgsProps(content) {
return Object.prototype.toString.call(content) === "[object Object]" && !!content.content;
}
var api$1 = {
open: notice$1,
config: setMessageConfig,
destroy: function destroy(messageKey) {
if (messageInstance) {
if (messageKey) {
var _messageInstance = messageInstance, removeNotice = _messageInstance.removeNotice;
removeNotice(messageKey);
} else {
var _messageInstance2 = messageInstance, destroy2 = _messageInstance2.destroy;
destroy2();
messageInstance = null;
}
}
}
};
function attachTypeApi(originalApi, type2) {
originalApi[type2] = function(content, duration, onClose) {
if (isArgsProps(content)) {
return originalApi.open(_extends$3(_extends$3({}, content), {
type: type2
}));
}
if (typeof duration === "function") {
onClose = duration;
duration = void 0;
}
return originalApi.open({
content,
duration,
type: type2,
onClose
});
};
}
typeList.forEach(function(type2) {
return attachTypeApi(api$1, type2);
});
api$1.warn = api$1.warning;
api$1.useMessage = createUseMessage(getRCNotificationInstance, getRCNoticeProps$1);
const _message = api$1;
var CheckCircleOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M699 353h-46.9c-10.2 0-19.9 4.9-25.9 13.3L469 584.3l-71.2-98.8c-6-8.3-15.6-13.3-25.9-13.3H325c-6.5 0-10.3 7.4-6.5 12.7l124.6 172.8a31.8 31.8 0 0051.7 0l210.6-292c3.9-5.3.1-12.7-6.4-12.7z" } }, { "tag": "path", "attrs": { "d": "M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z" } }] }, "name": "check-circle", "theme": "outlined" };
const CheckCircleOutlinedSvg = CheckCircleOutlined$2;
var CheckCircleOutlined = function CheckCircleOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: CheckCircleOutlinedSvg
})
});
};
CheckCircleOutlined.displayName = "CheckCircleOutlined";
const CheckCircleOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(CheckCircleOutlined);
var CloseCircleOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M685.4 354.8c0-4.4-3.6-8-8-8l-66 .3L512 465.6l-99.3-118.4-66.1-.3c-4.4 0-8 3.5-8 8 0 1.9.7 3.7 1.9 5.2l130.1 155L340.5 670a8.32 8.32 0 00-1.9 5.2c0 4.4 3.6 8 8 8l66.1-.3L512 564.4l99.3 118.4 66 .3c4.4 0 8-3.5 8-8 0-1.9-.7-3.7-1.9-5.2L553.5 515l130.1-155c1.2-1.4 1.8-3.3 1.8-5.2z" } }, { "tag": "path", "attrs": { "d": "M512 65C264.6 65 64 265.6 64 513s200.6 448 448 448 448-200.6 448-448S759.4 65 512 65zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z" } }] }, "name": "close-circle", "theme": "outlined" };
const CloseCircleOutlinedSvg = CloseCircleOutlined$2;
var CloseCircleOutlined = function CloseCircleOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: CloseCircleOutlinedSvg
})
});
};
CloseCircleOutlined.displayName = "CloseCircleOutlined";
const CloseCircleOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(CloseCircleOutlined);
var CloseOutlined$5 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M563.8 512l262.5-312.9c4.4-5.2.7-13.1-6.1-13.1h-79.8c-4.7 0-9.2 2.1-12.3 5.7L511.6 449.8 295.1 191.7c-3-3.6-7.5-5.7-12.3-5.7H203c-6.8 0-10.5 7.9-6.1 13.1L459.4 512 196.9 824.9A7.95 7.95 0 00203 838h79.8c4.7 0 9.2-2.1 12.3-5.7l216.5-258.1 216.5 258.1c3 3.6 7.5 5.7 12.3 5.7h79.8c6.8 0 10.5-7.9 6.1-13.1L563.8 512z" } }] }, "name": "close", "theme": "outlined" };
const CloseOutlinedSvg = CloseOutlined$5;
var CloseOutlined$3 = function CloseOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: CloseOutlinedSvg
})
});
};
CloseOutlined$3.displayName = "CloseOutlined";
const CloseOutlined$4 = /* @__PURE__ */ React__namespace.forwardRef(CloseOutlined$3);
var ExclamationCircleOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z" } }, { "tag": "path", "attrs": { "d": "M464 688a48 48 0 1096 0 48 48 0 10-96 0zm24-112h48c4.4 0 8-3.6 8-8V296c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v272c0 4.4 3.6 8 8 8z" } }] }, "name": "exclamation-circle", "theme": "outlined" };
const ExclamationCircleOutlinedSvg = ExclamationCircleOutlined$2;
var ExclamationCircleOutlined = function ExclamationCircleOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: ExclamationCircleOutlinedSvg
})
});
};
ExclamationCircleOutlined.displayName = "ExclamationCircleOutlined";
const ExclamationCircleOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(ExclamationCircleOutlined);
var InfoCircleOutlined$5 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z" } }, { "tag": "path", "attrs": { "d": "M464 336a48 48 0 1096 0 48 48 0 10-96 0zm72 112h-48c-4.4 0-8 3.6-8 8v272c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V456c0-4.4-3.6-8-8-8z" } }] }, "name": "info-circle", "theme": "outlined" };
const InfoCircleOutlinedSvg = InfoCircleOutlined$5;
var InfoCircleOutlined$3 = function InfoCircleOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: InfoCircleOutlinedSvg
})
});
};
InfoCircleOutlined$3.displayName = "InfoCircleOutlined";
const InfoCircleOutlined$4 = /* @__PURE__ */ React__namespace.forwardRef(InfoCircleOutlined$3);
function createUseNotification(getNotificationInstance2, getRCNoticeProps2) {
var useNotification$1 = function useNotification$12() {
var getPrefixCls;
var innerInstance = null;
var proxy = {
add: function add(noticeProps, holderCallback) {
innerInstance === null || innerInstance === void 0 ? void 0 : innerInstance.component.add(noticeProps, holderCallback);
}
};
var _useRCNotification = useNotification(proxy), _useRCNotification2 = _slicedToArray$e(_useRCNotification, 2), hookNotify = _useRCNotification2[0], holder = _useRCNotification2[1];
function notify(args) {
var customizePrefixCls = args.prefixCls;
var mergedPrefixCls = getPrefixCls("notification", customizePrefixCls);
getNotificationInstance2(_extends$3(_extends$3({}, args), {
prefixCls: mergedPrefixCls
}), function(_ref) {
var prefixCls = _ref.prefixCls, instance = _ref.instance;
innerInstance = instance;
hookNotify(getRCNoticeProps2(args, prefixCls));
});
}
var hookApiRef = React__namespace.useRef({});
hookApiRef.current.open = notify;
["success", "info", "warning", "error"].forEach(function(type2) {
hookApiRef.current[type2] = function(args) {
return hookApiRef.current.open(_extends$3(_extends$3({}, args), {
type: type2
}));
};
});
return [
hookApiRef.current,
/* @__PURE__ */ jsx(ConfigConsumer, {
children: function(context2) {
getPrefixCls = context2.getPrefixCls;
return holder;
}
}, "holder")
];
};
return useNotification$1;
}
globalThis && globalThis.__awaiter || function(thisArg, _arguments, P, generator) {
function adopt(value) {
return value instanceof P ? value : new P(function(resolve) {
resolve(value);
});
}
return new (P || (P = Promise))(function(resolve, reject) {
function fulfilled(value) {
try {
step2(generator.next(value));
} catch (e2) {
reject(e2);
}
}
function rejected(value) {
try {
step2(generator["throw"](value));
} catch (e2) {
reject(e2);
}
}
function step2(result) {
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
}
step2((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var notificationInstance = {};
var defaultDuration = 4.5;
var defaultTop = 24;
var defaultBottom = 24;
var defaultPrefixCls$1 = "";
var defaultPlacement = "topRight";
var defaultGetContainer$1;
var defaultCloseIcon;
var rtl = false;
var maxCount;
function setNotificationConfig(options) {
var duration = options.duration, placement = options.placement, bottom = options.bottom, top = options.top, getContainer2 = options.getContainer, closeIcon = options.closeIcon, prefixCls = options.prefixCls;
if (prefixCls !== void 0) {
defaultPrefixCls$1 = prefixCls;
}
if (duration !== void 0) {
defaultDuration = duration;
}
if (placement !== void 0) {
defaultPlacement = placement;
} else if (options.rtl) {
defaultPlacement = "topLeft";
}
if (bottom !== void 0) {
defaultBottom = bottom;
}
if (top !== void 0) {
defaultTop = top;
}
if (getContainer2 !== void 0) {
defaultGetContainer$1 = getContainer2;
}
if (closeIcon !== void 0) {
defaultCloseIcon = closeIcon;
}
if (options.rtl !== void 0) {
rtl = options.rtl;
}
if (options.maxCount !== void 0) {
maxCount = options.maxCount;
}
}
function getPlacementStyle(placement) {
var top = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : defaultTop;
var bottom = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : defaultBottom;
var style2;
switch (placement) {
case "top":
style2 = {
left: "50%",
transform: "translateX(-50%)",
right: "auto",
top,
bottom: "auto"
};
break;
case "topLeft":
style2 = {
left: 0,
top,
bottom: "auto"
};
break;
case "topRight":
style2 = {
right: 0,
top,
bottom: "auto"
};
break;
case "bottom":
style2 = {
left: "50%",
transform: "translateX(-50%)",
right: "auto",
top: "auto",
bottom
};
break;
case "bottomLeft":
style2 = {
left: 0,
top: "auto",
bottom
};
break;
default:
style2 = {
right: 0,
top: "auto",
bottom
};
break;
}
return style2;
}
function getNotificationInstance(args, callback) {
var _args$placement = args.placement, placement = _args$placement === void 0 ? defaultPlacement : _args$placement, top = args.top, bottom = args.bottom, _args$getContainer = args.getContainer, getContainer2 = _args$getContainer === void 0 ? defaultGetContainer$1 : _args$getContainer, customizePrefixCls = args.prefixCls;
var _globalConfig = globalConfig(), getPrefixCls = _globalConfig.getPrefixCls, getIconPrefixCls = _globalConfig.getIconPrefixCls;
var prefixCls = getPrefixCls("notification", customizePrefixCls || defaultPrefixCls$1);
var iconPrefixCls = getIconPrefixCls();
var cacheKey = "".concat(prefixCls, "-").concat(placement);
var cacheInstance = notificationInstance[cacheKey];
if (cacheInstance) {
Promise.resolve(cacheInstance).then(function(instance) {
callback({
prefixCls: "".concat(prefixCls, "-notice"),
iconPrefixCls,
instance
});
});
return;
}
var notificationClass = classnames("".concat(prefixCls, "-").concat(placement), _defineProperty$b({}, "".concat(prefixCls, "-rtl"), rtl === true));
notificationInstance[cacheKey] = new Promise(function(resolve) {
Notification.newInstance({
prefixCls,
className: notificationClass,
style: getPlacementStyle(placement, top, bottom),
getContainer: getContainer2,
maxCount
}, function(notification2) {
resolve(notification2);
callback({
prefixCls: "".concat(prefixCls, "-notice"),
iconPrefixCls,
instance: notification2
});
});
});
}
var typeToIcon = {
success: CheckCircleOutlined$1,
info: InfoCircleOutlined$4,
error: CloseCircleOutlined$1,
warning: ExclamationCircleOutlined$1
};
function getRCNoticeProps(args, prefixCls, iconPrefixCls) {
var durationArg = args.duration, icon = args.icon, type2 = args.type, description = args.description, message = args.message, btn = args.btn, onClose = args.onClose, onClick = args.onClick, key2 = args.key, style2 = args.style, className = args.className, _args$closeIcon = args.closeIcon, closeIcon = _args$closeIcon === void 0 ? defaultCloseIcon : _args$closeIcon, props = args.props;
var duration = durationArg === void 0 ? defaultDuration : durationArg;
var iconNode = null;
if (icon) {
iconNode = /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-icon"),
children: args.icon
});
} else if (type2) {
iconNode = /* @__PURE__ */ React__namespace.createElement(typeToIcon[type2] || null, {
className: "".concat(prefixCls, "-icon ").concat(prefixCls, "-icon-").concat(type2)
});
}
var closeIconToRender = /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-close-x"),
children: closeIcon || /* @__PURE__ */ jsx(CloseOutlined$4, {
className: "".concat(prefixCls, "-close-icon")
})
});
var autoMarginTag = !description && iconNode ? /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-message-single-line-auto-margin")
}) : null;
return {
content: /* @__PURE__ */ jsx(_ConfigProvider, {
iconPrefixCls,
children: /* @__PURE__ */ jsxs("div", {
className: iconNode ? "".concat(prefixCls, "-with-icon") : "",
role: "alert",
children: [iconNode, /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-message"),
children: [autoMarginTag, message]
}), /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-description"),
children: description
}), btn ? /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-btn"),
children: btn
}) : null]
})
}),
duration,
closable: true,
closeIcon: closeIconToRender,
onClose,
onClick,
key: key2,
style: style2 || {},
className: classnames(className, _defineProperty$b({}, "".concat(prefixCls, "-").concat(type2), !!type2)),
props
};
}
function notice(args) {
getNotificationInstance(args, function(_ref) {
var prefixCls = _ref.prefixCls, iconPrefixCls = _ref.iconPrefixCls, instance = _ref.instance;
instance.notice(getRCNoticeProps(args, prefixCls, iconPrefixCls));
});
}
var api = {
open: notice,
close: function close(key2) {
Object.keys(notificationInstance).forEach(function(cacheKey) {
return Promise.resolve(notificationInstance[cacheKey]).then(function(instance) {
instance.removeNotice(key2);
});
});
},
config: setNotificationConfig,
destroy: function destroy() {
Object.keys(notificationInstance).forEach(function(cacheKey) {
Promise.resolve(notificationInstance[cacheKey]).then(function(instance) {
instance.destroy();
});
delete notificationInstance[cacheKey];
});
}
};
["success", "info", "warning", "error"].forEach(function(type2) {
api[type2] = function(args) {
return api.open(_extends$3(_extends$3({}, args), {
type: type2
}));
};
});
api.warn = api.warning;
api.useNotification = createUseNotification(getNotificationInstance, getRCNoticeProps);
const notification = api;
var defaultGetPrefixCls = function defaultGetPrefixCls2(suffixCls, customizePrefixCls) {
if (customizePrefixCls)
return customizePrefixCls;
return suffixCls ? "ant-".concat(suffixCls) : "ant";
};
var ConfigContext$1 = /* @__PURE__ */ React__namespace.createContext({
getPrefixCls: defaultGetPrefixCls
});
var ConfigConsumer = ConfigContext$1.Consumer;
var dynamicStyleMark = "-ant-".concat(Date.now(), "-").concat(Math.random());
function getStyle(globalPrefixCls2, theme) {
var variables = {};
var formatColor = function formatColor2(color2, updater) {
var clone = color2.clone();
clone = (updater === null || updater === void 0 ? void 0 : updater(clone)) || clone;
return clone.toRgbString();
};
var fillColor = function fillColor2(colorVal, type2) {
var baseColor = new TinyColor(colorVal);
var colorPalettes = generate$1(baseColor.toRgbString());
variables["".concat(type2, "-color")] = formatColor(baseColor);
variables["".concat(type2, "-color-disabled")] = colorPalettes[1];
variables["".concat(type2, "-color-hover")] = colorPalettes[4];
variables["".concat(type2, "-color-active")] = colorPalettes[6];
variables["".concat(type2, "-color-outline")] = baseColor.clone().setAlpha(0.2).toRgbString();
variables["".concat(type2, "-color-deprecated-bg")] = colorPalettes[0];
variables["".concat(type2, "-color-deprecated-border")] = colorPalettes[2];
};
if (theme.primaryColor) {
fillColor(theme.primaryColor, "primary");
var primaryColor = new TinyColor(theme.primaryColor);
var primaryColors = generate$1(primaryColor.toRgbString());
primaryColors.forEach(function(color2, index2) {
variables["primary-".concat(index2 + 1)] = color2;
});
variables["primary-color-deprecated-l-35"] = formatColor(primaryColor, function(c2) {
return c2.lighten(35);
});
variables["primary-color-deprecated-l-20"] = formatColor(primaryColor, function(c2) {
return c2.lighten(20);
});
variables["primary-color-deprecated-t-20"] = formatColor(primaryColor, function(c2) {
return c2.tint(20);
});
variables["primary-color-deprecated-t-50"] = formatColor(primaryColor, function(c2) {
return c2.tint(50);
});
variables["primary-color-deprecated-f-12"] = formatColor(primaryColor, function(c2) {
return c2.setAlpha(c2.getAlpha() * 0.12);
});
var primaryActiveColor = new TinyColor(primaryColors[0]);
variables["primary-color-active-deprecated-f-30"] = formatColor(primaryActiveColor, function(c2) {
return c2.setAlpha(c2.getAlpha() * 0.3);
});
variables["primary-color-active-deprecated-d-02"] = formatColor(primaryActiveColor, function(c2) {
return c2.darken(2);
});
}
if (theme.successColor) {
fillColor(theme.successColor, "success");
}
if (theme.warningColor) {
fillColor(theme.warningColor, "warning");
}
if (theme.errorColor) {
fillColor(theme.errorColor, "error");
}
if (theme.infoColor) {
fillColor(theme.infoColor, "info");
}
var cssList = Object.keys(variables).map(function(key2) {
return "--".concat(globalPrefixCls2, "-").concat(key2, ": ").concat(variables[key2], ";");
});
return "\n :root {\n ".concat(cssList.join("\n"), "\n }\n ").trim();
}
function registerTheme(globalPrefixCls2, theme) {
var style2 = getStyle(globalPrefixCls2, theme);
if (canUseDom$1()) {
updateCSS(style2, "".concat(dynamicStyleMark, "-dynamic-theme"));
}
}
var DisabledContext = /* @__PURE__ */ React__namespace.createContext(false);
var DisabledContextProvider = function DisabledContextProvider2(_ref) {
var children = _ref.children, disabled = _ref.disabled;
var originDisabled = React__namespace.useContext(DisabledContext);
return /* @__PURE__ */ jsx(DisabledContext.Provider, {
value: disabled !== null && disabled !== void 0 ? disabled : originDisabled,
children
});
};
const DisabledContext$1 = DisabledContext;
var SizeContext = /* @__PURE__ */ React__namespace.createContext(void 0);
var SizeContextProvider = function SizeContextProvider2(_ref) {
var children = _ref.children, size = _ref.size;
return /* @__PURE__ */ jsx(SizeContext.Consumer, {
children: function(originSize) {
return /* @__PURE__ */ jsx(SizeContext.Provider, {
value: size || originSize,
children
});
}
});
};
const SizeContext$1 = SizeContext;
var PASSED_PROPS = ["getTargetContainer", "getPopupContainer", "renderEmpty", "pageHeader", "input", "pagination", "form"];
var defaultPrefixCls = "ant";
var defaultIconPrefixCls = "anticon";
var globalPrefixCls;
var globalIconPrefixCls;
function getGlobalPrefixCls() {
return globalPrefixCls || defaultPrefixCls;
}
function getGlobalIconPrefixCls() {
return globalIconPrefixCls || defaultIconPrefixCls;
}
var setGlobalConfig = function setGlobalConfig2(_ref) {
var prefixCls = _ref.prefixCls, iconPrefixCls = _ref.iconPrefixCls, theme = _ref.theme;
if (prefixCls !== void 0) {
globalPrefixCls = prefixCls;
}
if (iconPrefixCls !== void 0) {
globalIconPrefixCls = iconPrefixCls;
}
if (theme) {
registerTheme(getGlobalPrefixCls(), theme);
}
};
var globalConfig = function globalConfig2() {
return {
getPrefixCls: function getPrefixCls(suffixCls, customizePrefixCls) {
if (customizePrefixCls)
return customizePrefixCls;
return suffixCls ? "".concat(getGlobalPrefixCls(), "-").concat(suffixCls) : getGlobalPrefixCls();
},
getIconPrefixCls: getGlobalIconPrefixCls,
getRootPrefixCls: function getRootPrefixCls(rootPrefixCls, customizePrefixCls) {
if (rootPrefixCls) {
return rootPrefixCls;
}
if (globalPrefixCls) {
return globalPrefixCls;
}
if (customizePrefixCls && customizePrefixCls.includes("-")) {
return customizePrefixCls.replace(/^(.*)-[^-]*$/, "$1");
}
return getGlobalPrefixCls();
}
};
};
var ProviderChildren = function ProviderChildren2(props) {
var _a, _b;
var children = props.children, csp = props.csp, autoInsertSpaceInButton = props.autoInsertSpaceInButton, form = props.form, locale2 = props.locale, componentSize = props.componentSize, direction = props.direction, space = props.space, virtual = props.virtual, dropdownMatchSelectWidth = props.dropdownMatchSelectWidth, legacyLocale = props.legacyLocale, parentContext = props.parentContext, iconPrefixCls = props.iconPrefixCls, componentDisabled = props.componentDisabled;
var getPrefixCls = React__namespace.useCallback(function(suffixCls, customizePrefixCls) {
var prefixCls = props.prefixCls;
if (customizePrefixCls)
return customizePrefixCls;
var mergedPrefixCls = prefixCls || parentContext.getPrefixCls("");
return suffixCls ? "".concat(mergedPrefixCls, "-").concat(suffixCls) : mergedPrefixCls;
}, [parentContext.getPrefixCls, props.prefixCls]);
var config = _extends$3(_extends$3({}, parentContext), {
csp,
autoInsertSpaceInButton,
locale: locale2 || legacyLocale,
direction,
space,
virtual,
dropdownMatchSelectWidth,
getPrefixCls
});
PASSED_PROPS.forEach(function(propName) {
var propValue = props[propName];
if (propValue) {
config[propName] = propValue;
}
});
var memoedConfig = useMemo(function() {
return config;
}, config, function(prevConfig, currentConfig) {
var prevKeys = Object.keys(prevConfig);
var currentKeys = Object.keys(currentConfig);
return prevKeys.length !== currentKeys.length || prevKeys.some(function(key2) {
return prevConfig[key2] !== currentConfig[key2];
});
});
var memoIconContextValue = React__namespace.useMemo(function() {
return {
prefixCls: iconPrefixCls,
csp
};
}, [iconPrefixCls, csp]);
var childNode = children;
var validateMessages = {};
if (locale2) {
validateMessages = ((_a = locale2.Form) === null || _a === void 0 ? void 0 : _a.defaultValidateMessages) || ((_b = defaultLocale.Form) === null || _b === void 0 ? void 0 : _b.defaultValidateMessages) || {};
}
if (form && form.validateMessages) {
validateMessages = _extends$3(_extends$3({}, validateMessages), form.validateMessages);
}
if (Object.keys(validateMessages).length > 0) {
childNode = /* @__PURE__ */ jsx(FormProvider$1, {
validateMessages,
children
});
}
if (locale2) {
childNode = /* @__PURE__ */ jsx(LocaleProvider$1, {
locale: locale2,
_ANT_MARK__: ANT_MARK,
children: childNode
});
}
if (iconPrefixCls || csp) {
childNode = /* @__PURE__ */ jsx(IconContext$1.Provider, {
value: memoIconContextValue,
children: childNode
});
}
if (componentSize) {
childNode = /* @__PURE__ */ jsx(SizeContextProvider, {
size: componentSize,
children: childNode
});
}
if (componentDisabled !== void 0) {
childNode = /* @__PURE__ */ jsx(DisabledContextProvider, {
disabled: componentDisabled,
children: childNode
});
}
return /* @__PURE__ */ jsx(ConfigContext$1.Provider, {
value: memoedConfig,
children: childNode
});
};
var ConfigProvider = function ConfigProvider2(props) {
React__namespace.useEffect(function() {
if (props.direction) {
_message.config({
rtl: props.direction === "rtl"
});
notification.config({
rtl: props.direction === "rtl"
});
}
}, [props.direction]);
return /* @__PURE__ */ jsx(LocaleReceiver$1, {
children: function(_, __, legacyLocale) {
return /* @__PURE__ */ jsx(ConfigConsumer, {
children: function(context2) {
return /* @__PURE__ */ jsx(ProviderChildren, {
parentContext: context2,
legacyLocale,
...props
});
}
});
}
});
};
ConfigProvider.ConfigContext = ConfigContext$1;
ConfigProvider.SizeContext = SizeContext$1;
ConfigProvider.config = setGlobalConfig;
const _ConfigProvider = ConfigProvider;
function addEventListenerWrap$2(target, eventType, cb, option) {
var callback = ReactDOM__default.default.unstable_batchedUpdates ? function run(e2) {
ReactDOM__default.default.unstable_batchedUpdates(cb, e2);
} : cb;
if (target !== null && target !== void 0 && target.addEventListener) {
target.addEventListener(eventType, callback, option);
}
return {
remove: function remove() {
if (target !== null && target !== void 0 && target.removeEventListener) {
target.removeEventListener(eventType, callback, option);
}
}
};
}
function getDataOrAriaProps$1(props) {
return Object.keys(props).reduce(function(prev, key2) {
if ((key2.startsWith("data-") || key2.startsWith("aria-") || key2 === "role") && !key2.startsWith("data-__")) {
prev[key2] = props[key2];
}
return prev;
}, {});
}
var isValidElement = React__namespace.isValidElement;
function isFragment(child) {
return child && isValidElement(child) && child.type === React__namespace.Fragment;
}
function replaceElement(element, replacement, props) {
if (!isValidElement(element)) {
return replacement;
}
return /* @__PURE__ */ React__namespace.cloneElement(element, typeof props === "function" ? props(element.props || {}) : props);
}
function cloneElement(element, props) {
return replaceElement(element, element, props);
}
function isWindow$2(obj) {
return obj !== null && obj !== void 0 && obj === obj.window;
}
function getScroll$3(target, top) {
var _a, _b;
if (typeof window === "undefined") {
return 0;
}
var method2 = top ? "scrollTop" : "scrollLeft";
var result = 0;
if (isWindow$2(target)) {
result = target[top ? "pageYOffset" : "pageXOffset"];
} else if (target instanceof Document) {
result = target.documentElement[method2];
} else if (target instanceof HTMLElement) {
result = target[method2];
} else if (target) {
result = target[method2];
}
if (target && !isWindow$2(target) && typeof result !== "number") {
result = (_b = ((_a = target.ownerDocument) !== null && _a !== void 0 ? _a : target).documentElement) === null || _b === void 0 ? void 0 : _b[method2];
}
return result;
}
function easeInOutCubic(t2, b2, c2, d2) {
var cc = c2 - b2;
t2 /= d2 / 2;
if (t2 < 1) {
return cc / 2 * t2 * t2 * t2 + b2;
}
return cc / 2 * ((t2 -= 2) * t2 * t2 + 2) + b2;
}
function scrollTo$1(y2) {
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var _options$getContainer = options.getContainer, getContainer2 = _options$getContainer === void 0 ? function() {
return window;
} : _options$getContainer, callback = options.callback, _options$duration = options.duration, duration = _options$duration === void 0 ? 450 : _options$duration;
var container = getContainer2();
var scrollTop = getScroll$3(container, true);
var startTime = Date.now();
var frameFunc = function frameFunc2() {
var timestamp = Date.now();
var time = timestamp - startTime;
var nextScrollTop = easeInOutCubic(time > duration ? duration : time, scrollTop, y2, duration);
if (isWindow$2(container)) {
container.scrollTo(window.pageXOffset, nextScrollTop);
} else if (container instanceof Document || container.constructor.name === "HTMLDocument") {
container.documentElement.scrollTop = nextScrollTop;
} else {
container.scrollTop = nextScrollTop;
}
if (time < duration) {
wrapperRaf$1(frameFunc2);
} else if (typeof callback === "function") {
callback();
}
};
wrapperRaf$1(frameFunc);
}
function useEvent(callback) {
var fnRef = React__namespace.useRef();
fnRef.current = callback;
var memoFn = React__namespace.useCallback(function() {
var _fnRef$current;
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return (_fnRef$current = fnRef.current) === null || _fnRef$current === void 0 ? void 0 : _fnRef$current.call.apply(_fnRef$current, [fnRef].concat(args));
}, []);
return memoFn;
}
var useInternalLayoutEffect = canUseDom$1() ? React__namespace.useLayoutEffect : React__namespace.useEffect;
var useLayoutEffect$1 = function useLayoutEffect2(callback, deps) {
var firstMountRef = React__namespace.useRef(true);
useInternalLayoutEffect(function() {
return callback(firstMountRef.current);
}, deps);
useInternalLayoutEffect(function() {
firstMountRef.current = false;
return function() {
firstMountRef.current = true;
};
}, []);
};
var useLayoutUpdateEffect = function useLayoutUpdateEffect2(callback, deps) {
useLayoutEffect$1(function(firstMount) {
if (!firstMount) {
return callback();
}
}, deps);
};
function hasValue$1(value) {
return value !== void 0;
}
function useMergedState(defaultStateValue, option) {
var _ref = option || {}, defaultValue = _ref.defaultValue, value = _ref.value, onChange = _ref.onChange, postState = _ref.postState;
var _useState = useSafeState(function() {
if (hasValue$1(value)) {
return value;
} else if (hasValue$1(defaultValue)) {
return typeof defaultValue === "function" ? defaultValue() : defaultValue;
} else {
return typeof defaultStateValue === "function" ? defaultStateValue() : defaultStateValue;
}
}), _useState2 = _slicedToArray$e(_useState, 2), innerValue = _useState2[0], setInnerValue = _useState2[1];
var mergedValue = value !== void 0 ? value : innerValue;
var postMergedValue = postState ? postState(mergedValue) : mergedValue;
var onChangeFn = useEvent(onChange);
var _useState3 = useSafeState([mergedValue]), _useState4 = _slicedToArray$e(_useState3, 2), prevValue = _useState4[0], setPrevValue = _useState4[1];
useLayoutUpdateEffect(function() {
var prev = prevValue[0];
if (innerValue !== prev) {
onChangeFn(innerValue, prev);
}
}, [prevValue]);
useLayoutUpdateEffect(function() {
if (!hasValue$1(value)) {
setInnerValue(value);
}
}, [value]);
var triggerChange = useEvent(function(updater, ignoreDestroy) {
setInnerValue(updater, ignoreDestroy);
setPrevValue([mergedValue], ignoreDestroy);
});
return [postMergedValue, triggerChange];
}
const isMobile$1 = function() {
if (typeof navigator === "undefined" || typeof window === "undefined") {
return false;
}
var agent = navigator.userAgent || navigator.vendor || window.opera;
return /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(agent) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(agent === null || agent === void 0 ? void 0 : agent.substr(0, 4));
};
var KeyCode = {
MAC_ENTER: 3,
BACKSPACE: 8,
TAB: 9,
NUM_CENTER: 12,
ENTER: 13,
SHIFT: 16,
CTRL: 17,
ALT: 18,
PAUSE: 19,
CAPS_LOCK: 20,
ESC: 27,
SPACE: 32,
PAGE_UP: 33,
PAGE_DOWN: 34,
END: 35,
HOME: 36,
LEFT: 37,
UP: 38,
RIGHT: 39,
DOWN: 40,
PRINT_SCREEN: 44,
INSERT: 45,
DELETE: 46,
ZERO: 48,
ONE: 49,
TWO: 50,
THREE: 51,
FOUR: 52,
FIVE: 53,
SIX: 54,
SEVEN: 55,
EIGHT: 56,
NINE: 57,
QUESTION_MARK: 63,
A: 65,
B: 66,
C: 67,
D: 68,
E: 69,
F: 70,
G: 71,
H: 72,
I: 73,
J: 74,
K: 75,
L: 76,
M: 77,
N: 78,
O: 79,
P: 80,
Q: 81,
R: 82,
S: 83,
T: 84,
U: 85,
V: 86,
W: 87,
X: 88,
Y: 89,
Z: 90,
META: 91,
WIN_KEY_RIGHT: 92,
CONTEXT_MENU: 93,
NUM_ZERO: 96,
NUM_ONE: 97,
NUM_TWO: 98,
NUM_THREE: 99,
NUM_FOUR: 100,
NUM_FIVE: 101,
NUM_SIX: 102,
NUM_SEVEN: 103,
NUM_EIGHT: 104,
NUM_NINE: 105,
NUM_MULTIPLY: 106,
NUM_PLUS: 107,
NUM_MINUS: 109,
NUM_PERIOD: 110,
NUM_DIVISION: 111,
F1: 112,
F2: 113,
F3: 114,
F4: 115,
F5: 116,
F6: 117,
F7: 118,
F8: 119,
F9: 120,
F10: 121,
F11: 122,
F12: 123,
NUMLOCK: 144,
SEMICOLON: 186,
DASH: 189,
EQUALS: 187,
COMMA: 188,
PERIOD: 190,
SLASH: 191,
APOSTROPHE: 192,
SINGLE_QUOTE: 222,
OPEN_SQUARE_BRACKET: 219,
BACKSLASH: 220,
CLOSE_SQUARE_BRACKET: 221,
WIN_KEY: 224,
MAC_FF_META: 224,
WIN_IME: 229,
isTextModifyingKeyEvent: function isTextModifyingKeyEvent(e2) {
var keyCode = e2.keyCode;
if (e2.altKey && !e2.ctrlKey || e2.metaKey || keyCode >= KeyCode.F1 && keyCode <= KeyCode.F12) {
return false;
}
switch (keyCode) {
case KeyCode.ALT:
case KeyCode.CAPS_LOCK:
case KeyCode.CONTEXT_MENU:
case KeyCode.CTRL:
case KeyCode.DOWN:
case KeyCode.END:
case KeyCode.ESC:
case KeyCode.HOME:
case KeyCode.INSERT:
case KeyCode.LEFT:
case KeyCode.MAC_FF_META:
case KeyCode.META:
case KeyCode.NUMLOCK:
case KeyCode.NUM_CENTER:
case KeyCode.PAGE_DOWN:
case KeyCode.PAGE_UP:
case KeyCode.PAUSE:
case KeyCode.PRINT_SCREEN:
case KeyCode.RIGHT:
case KeyCode.SHIFT:
case KeyCode.UP:
case KeyCode.WIN_KEY:
case KeyCode.WIN_KEY_RIGHT:
return false;
default:
return true;
}
},
isCharacterKey: function isCharacterKey(keyCode) {
if (keyCode >= KeyCode.ZERO && keyCode <= KeyCode.NINE) {
return true;
}
if (keyCode >= KeyCode.NUM_ZERO && keyCode <= KeyCode.NUM_MULTIPLY) {
return true;
}
if (keyCode >= KeyCode.A && keyCode <= KeyCode.Z) {
return true;
}
if (window.navigator.userAgent.indexOf("WebKit") !== -1 && keyCode === 0) {
return true;
}
switch (keyCode) {
case KeyCode.SPACE:
case KeyCode.QUESTION_MARK:
case KeyCode.NUM_PLUS:
case KeyCode.NUM_MINUS:
case KeyCode.NUM_PERIOD:
case KeyCode.NUM_DIVISION:
case KeyCode.SEMICOLON:
case KeyCode.DASH:
case KeyCode.EQUALS:
case KeyCode.COMMA:
case KeyCode.PERIOD:
case KeyCode.SLASH:
case KeyCode.APOSTROPHE:
case KeyCode.SINGLE_QUOTE:
case KeyCode.OPEN_SQUARE_BRACKET:
case KeyCode.BACKSLASH:
case KeyCode.CLOSE_SQUARE_BRACKET:
return true;
default:
return false;
}
}
};
var BaseSelectContext = /* @__PURE__ */ React__namespace.createContext(null);
function useBaseProps() {
return React__namespace.useContext(BaseSelectContext);
}
function useDelayReset() {
var timeout = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 10;
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), bool = _React$useState2[0], setBool = _React$useState2[1];
var delayRef = React__namespace.useRef(null);
var cancelLatest = function cancelLatest2() {
window.clearTimeout(delayRef.current);
};
React__namespace.useEffect(function() {
return cancelLatest;
}, []);
var delaySetBool = function delaySetBool2(value, callback) {
cancelLatest();
delayRef.current = window.setTimeout(function() {
setBool(value);
if (callback) {
callback();
}
}, timeout);
};
return [bool, delaySetBool, cancelLatest];
}
function useLock() {
var duration = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 250;
var lockRef = React__namespace.useRef(null);
var timeoutRef = React__namespace.useRef(null);
React__namespace.useEffect(function() {
return function() {
window.clearTimeout(timeoutRef.current);
};
}, []);
function doLock(locked) {
if (locked || lockRef.current === null) {
lockRef.current = locked;
}
window.clearTimeout(timeoutRef.current);
timeoutRef.current = window.setTimeout(function() {
lockRef.current = null;
}, duration);
}
return [function() {
return lockRef.current;
}, doLock];
}
function useSelectTriggerControl(elements, open, triggerOpen, customizedTrigger) {
var propsRef = React__namespace.useRef(null);
propsRef.current = {
open,
triggerOpen,
customizedTrigger
};
React__namespace.useEffect(function() {
function onGlobalMouseDown(event) {
var _propsRef$current;
if ((_propsRef$current = propsRef.current) !== null && _propsRef$current !== void 0 && _propsRef$current.customizedTrigger) {
return;
}
var target = event.target;
if (target.shadowRoot && event.composed) {
target = event.composedPath()[0] || target;
}
if (propsRef.current.open && elements().filter(function(element) {
return element;
}).every(function(element) {
return !element.contains(target) && element !== target;
})) {
propsRef.current.triggerOpen(false);
}
}
window.addEventListener("mousedown", onGlobalMouseDown);
return function() {
return window.removeEventListener("mousedown", onGlobalMouseDown);
};
}, []);
}
var attributes = "accept acceptCharset accessKey action allowFullScreen allowTransparency\n alt async autoComplete autoFocus autoPlay capture cellPadding cellSpacing challenge\n charSet checked classID className colSpan cols content contentEditable contextMenu\n controls coords crossOrigin data dateTime default defer dir disabled download draggable\n encType form formAction formEncType formMethod formNoValidate formTarget frameBorder\n headers height hidden high href hrefLang htmlFor httpEquiv icon id inputMode integrity\n is keyParams keyType kind label lang list loop low manifest marginHeight marginWidth max maxLength media\n mediaGroup method min minLength multiple muted name noValidate nonce open\n optimum pattern placeholder poster preload radioGroup readOnly rel required\n reversed role rowSpan rows sandbox scope scoped scrolling seamless selected\n shape size sizes span spellCheck src srcDoc srcLang srcSet start step style\n summary tabIndex target title type useMap value width wmode wrap";
var eventsName = "onCopy onCut onPaste onCompositionEnd onCompositionStart onCompositionUpdate onKeyDown\n onKeyPress onKeyUp onFocus onBlur onChange onInput onSubmit onClick onContextMenu onDoubleClick\n onDrag onDragEnd onDragEnter onDragExit onDragLeave onDragOver onDragStart onDrop onMouseDown\n onMouseEnter onMouseLeave onMouseMove onMouseOut onMouseOver onMouseUp onSelect onTouchCancel\n onTouchEnd onTouchMove onTouchStart onScroll onWheel onAbort onCanPlay onCanPlayThrough\n onDurationChange onEmptied onEncrypted onEnded onError onLoadedData onLoadedMetadata\n onLoadStart onPause onPlay onPlaying onProgress onRateChange onSeeked onSeeking onStalled onSuspend onTimeUpdate onVolumeChange onWaiting onLoad onError";
var propList = "".concat(attributes, " ").concat(eventsName).split(/[\s\n]+/);
var ariaPrefix = "aria-";
var dataPrefix = "data-";
function match(key2, prefix) {
return key2.indexOf(prefix) === 0;
}
function pickAttrs(props) {
var ariaOnly = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
var mergedConfig;
if (ariaOnly === false) {
mergedConfig = {
aria: true,
data: true,
attr: true
};
} else if (ariaOnly === true) {
mergedConfig = {
aria: true
};
} else {
mergedConfig = _objectSpread2$a({}, ariaOnly);
}
var attrs = {};
Object.keys(props).forEach(function(key2) {
if (mergedConfig.aria && (key2 === "role" || match(key2, ariaPrefix)) || mergedConfig.data && match(key2, dataPrefix) || mergedConfig.attr && propList.includes(key2)) {
attrs[key2] = props[key2];
}
});
return attrs;
}
var _excluded$J = ["prefixCls", "invalidate", "item", "renderItem", "responsive", "responsiveDisabled", "registerSize", "itemKey", "className", "style", "children", "display", "order", "component"];
var UNDEFINED = void 0;
function InternalItem(props, ref) {
var prefixCls = props.prefixCls, invalidate = props.invalidate, item = props.item, renderItem2 = props.renderItem, responsive = props.responsive, responsiveDisabled = props.responsiveDisabled, registerSize = props.registerSize, itemKey2 = props.itemKey, className = props.className, style2 = props.style, children = props.children, display = props.display, order = props.order, _props$component = props.component, Component = _props$component === void 0 ? "div" : _props$component, restProps = _objectWithoutProperties$1(props, _excluded$J);
var mergedHidden = responsive && !display;
function internalRegisterSize(width) {
registerSize(itemKey2, width);
}
React__namespace.useEffect(function() {
return function() {
internalRegisterSize(null);
};
}, []);
var childNode = renderItem2 && item !== UNDEFINED ? renderItem2(item) : children;
var overflowStyle;
if (!invalidate) {
overflowStyle = {
opacity: mergedHidden ? 0 : 1,
height: mergedHidden ? 0 : UNDEFINED,
overflowY: mergedHidden ? "hidden" : UNDEFINED,
order: responsive ? order : UNDEFINED,
pointerEvents: mergedHidden ? "none" : UNDEFINED,
position: mergedHidden ? "absolute" : UNDEFINED
};
}
var overflowProps = {};
if (mergedHidden) {
overflowProps["aria-hidden"] = true;
}
var itemNode = /* @__PURE__ */ jsx(Component, {
className: classnames(!invalidate && prefixCls, className),
style: _objectSpread2$a(_objectSpread2$a({}, overflowStyle), style2),
...overflowProps,
...restProps,
ref,
children: childNode
});
if (responsive) {
itemNode = /* @__PURE__ */ jsx(RefResizeObserver, {
onResize: function onResize2(_ref) {
var offsetWidth = _ref.offsetWidth;
internalRegisterSize(offsetWidth);
},
disabled: responsiveDisabled,
children: itemNode
});
}
return itemNode;
}
var Item$3 = /* @__PURE__ */ React__namespace.forwardRef(InternalItem);
Item$3.displayName = "Item";
function channelUpdate(callback) {
if (typeof MessageChannel === "undefined") {
wrapperRaf$1(callback);
} else {
var channel = new MessageChannel();
channel.port1.onmessage = function() {
return callback();
};
channel.port2.postMessage(void 0);
}
}
function useBatcher() {
var updateFuncRef = React__namespace.useRef(null);
var notifyEffectUpdate = function notifyEffectUpdate2(callback) {
if (!updateFuncRef.current) {
updateFuncRef.current = [];
channelUpdate(function() {
ReactDOM2.unstable_batchedUpdates(function() {
updateFuncRef.current.forEach(function(fn) {
fn();
});
updateFuncRef.current = null;
});
});
}
updateFuncRef.current.push(callback);
};
return notifyEffectUpdate;
}
function useEffectState(notifyEffectUpdate, defaultValue) {
var _React$useState = React__namespace.useState(defaultValue), _React$useState2 = _slicedToArray$e(_React$useState, 2), stateValue = _React$useState2[0], setStateValue = _React$useState2[1];
var setEffectVal = useEvent(function(nextValue) {
notifyEffectUpdate(function() {
setStateValue(nextValue);
});
});
return [stateValue, setEffectVal];
}
var OverflowContext = /* @__PURE__ */ React__default.default.createContext(null);
var _excluded$I = ["component"], _excluded2$8 = ["className"], _excluded3$1 = ["className"];
var InternalRawItem = function InternalRawItem2(props, ref) {
var context2 = React__namespace.useContext(OverflowContext);
if (!context2) {
var _props$component = props.component, Component = _props$component === void 0 ? "div" : _props$component, _restProps = _objectWithoutProperties$1(props, _excluded$I);
return /* @__PURE__ */ jsx(Component, {
..._restProps,
ref
});
}
var contextClassName = context2.className, restContext = _objectWithoutProperties$1(context2, _excluded2$8);
var className = props.className, restProps = _objectWithoutProperties$1(props, _excluded3$1);
return /* @__PURE__ */ jsx(OverflowContext.Provider, {
value: null,
children: /* @__PURE__ */ jsx(Item$3, {
ref,
className: classnames(contextClassName, className),
...restContext,
...restProps
})
});
};
var RawItem = /* @__PURE__ */ React__namespace.forwardRef(InternalRawItem);
RawItem.displayName = "RawItem";
var _excluded$H = ["prefixCls", "data", "renderItem", "renderRawItem", "itemKey", "itemWidth", "ssr", "style", "className", "maxCount", "renderRest", "renderRawRest", "suffix", "component", "itemComponent", "onVisibleChange"];
var RESPONSIVE = "responsive";
var INVALIDATE = "invalidate";
function defaultRenderRest(omittedItems) {
return "+ ".concat(omittedItems.length, " ...");
}
function Overflow(props, ref) {
var _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-overflow" : _props$prefixCls, _props$data = props.data, data = _props$data === void 0 ? [] : _props$data, renderItem2 = props.renderItem, renderRawItem = props.renderRawItem, itemKey2 = props.itemKey, _props$itemWidth = props.itemWidth, itemWidth = _props$itemWidth === void 0 ? 10 : _props$itemWidth, ssr = props.ssr, style2 = props.style, className = props.className, maxCount2 = props.maxCount, renderRest = props.renderRest, renderRawRest = props.renderRawRest, suffix = props.suffix, _props$component = props.component, Component = _props$component === void 0 ? "div" : _props$component, itemComponent = props.itemComponent, onVisibleChange = props.onVisibleChange, restProps = _objectWithoutProperties$1(props, _excluded$H);
var fullySSR = ssr === "full";
var notifyEffectUpdate = useBatcher();
var _useEffectState = useEffectState(notifyEffectUpdate, null), _useEffectState2 = _slicedToArray$e(_useEffectState, 2), containerWidth = _useEffectState2[0], setContainerWidth = _useEffectState2[1];
var mergedContainerWidth = containerWidth || 0;
var _useEffectState3 = useEffectState(notifyEffectUpdate, /* @__PURE__ */ new Map()), _useEffectState4 = _slicedToArray$e(_useEffectState3, 2), itemWidths = _useEffectState4[0], setItemWidths = _useEffectState4[1];
var _useEffectState5 = useEffectState(notifyEffectUpdate, 0), _useEffectState6 = _slicedToArray$e(_useEffectState5, 2), prevRestWidth = _useEffectState6[0], setPrevRestWidth = _useEffectState6[1];
var _useEffectState7 = useEffectState(notifyEffectUpdate, 0), _useEffectState8 = _slicedToArray$e(_useEffectState7, 2), restWidth = _useEffectState8[0], setRestWidth = _useEffectState8[1];
var _useEffectState9 = useEffectState(notifyEffectUpdate, 0), _useEffectState10 = _slicedToArray$e(_useEffectState9, 2), suffixWidth = _useEffectState10[0], setSuffixWidth = _useEffectState10[1];
var _useState = React$a.useState(null), _useState2 = _slicedToArray$e(_useState, 2), suffixFixedStart = _useState2[0], setSuffixFixedStart = _useState2[1];
var _useState3 = React$a.useState(null), _useState4 = _slicedToArray$e(_useState3, 2), displayCount = _useState4[0], setDisplayCount = _useState4[1];
var mergedDisplayCount = React__namespace.useMemo(function() {
if (displayCount === null && fullySSR) {
return Number.MAX_SAFE_INTEGER;
}
return displayCount || 0;
}, [displayCount, containerWidth]);
var _useState5 = React$a.useState(false), _useState6 = _slicedToArray$e(_useState5, 2), restReady = _useState6[0], setRestReady = _useState6[1];
var itemPrefixCls = "".concat(prefixCls, "-item");
var mergedRestWidth = Math.max(prevRestWidth, restWidth);
var isResponsive = maxCount2 === RESPONSIVE;
var shouldResponsive = data.length && isResponsive;
var invalidate = maxCount2 === INVALIDATE;
var showRest = shouldResponsive || typeof maxCount2 === "number" && data.length > maxCount2;
var mergedData = React$a.useMemo(function() {
var items = data;
if (shouldResponsive) {
if (containerWidth === null && fullySSR) {
items = data;
} else {
items = data.slice(0, Math.min(data.length, mergedContainerWidth / itemWidth));
}
} else if (typeof maxCount2 === "number") {
items = data.slice(0, maxCount2);
}
return items;
}, [data, itemWidth, containerWidth, maxCount2, shouldResponsive]);
var omittedItems = React$a.useMemo(function() {
if (shouldResponsive) {
return data.slice(mergedDisplayCount + 1);
}
return data.slice(mergedData.length);
}, [data, mergedData, shouldResponsive, mergedDisplayCount]);
var getKey2 = React$a.useCallback(function(item, index2) {
var _ref;
if (typeof itemKey2 === "function") {
return itemKey2(item);
}
return (_ref = itemKey2 && (item === null || item === void 0 ? void 0 : item[itemKey2])) !== null && _ref !== void 0 ? _ref : index2;
}, [itemKey2]);
var mergedRenderItem = React$a.useCallback(renderItem2 || function(item) {
return item;
}, [renderItem2]);
function updateDisplayCount(count, suffixFixedStartVal, notReady) {
if (displayCount === count && (suffixFixedStartVal === void 0 || suffixFixedStartVal === suffixFixedStart)) {
return;
}
setDisplayCount(count);
if (!notReady) {
setRestReady(count < data.length - 1);
onVisibleChange === null || onVisibleChange === void 0 ? void 0 : onVisibleChange(count);
}
if (suffixFixedStartVal !== void 0) {
setSuffixFixedStart(suffixFixedStartVal);
}
}
function onOverflowResize(_, element) {
setContainerWidth(element.clientWidth);
}
function registerSize(key2, width) {
setItemWidths(function(origin) {
var clone = new Map(origin);
if (width === null) {
clone.delete(key2);
} else {
clone.set(key2, width);
}
return clone;
});
}
function registerOverflowSize(_, width) {
setRestWidth(width);
setPrevRestWidth(restWidth);
}
function registerSuffixSize(_, width) {
setSuffixWidth(width);
}
function getItemWidth(index2) {
return itemWidths.get(getKey2(mergedData[index2], index2));
}
useLayoutEffect$1(function() {
if (mergedContainerWidth && typeof mergedRestWidth === "number" && mergedData) {
var totalWidth = suffixWidth;
var len = mergedData.length;
var lastIndex = len - 1;
if (!len) {
updateDisplayCount(0, null);
return;
}
for (var i2 = 0; i2 < len; i2 += 1) {
var currentItemWidth = getItemWidth(i2);
if (fullySSR) {
currentItemWidth = currentItemWidth || 0;
}
if (currentItemWidth === void 0) {
updateDisplayCount(i2 - 1, void 0, true);
break;
}
totalWidth += currentItemWidth;
if (lastIndex === 0 && totalWidth <= mergedContainerWidth || i2 === lastIndex - 1 && totalWidth + getItemWidth(lastIndex) <= mergedContainerWidth) {
updateDisplayCount(lastIndex, null);
break;
} else if (totalWidth + mergedRestWidth > mergedContainerWidth) {
updateDisplayCount(i2 - 1, totalWidth - currentItemWidth - suffixWidth + restWidth);
break;
}
}
if (suffix && getItemWidth(0) + suffixWidth > mergedContainerWidth) {
setSuffixFixedStart(null);
}
}
}, [mergedContainerWidth, itemWidths, restWidth, suffixWidth, getKey2, mergedData]);
var displayRest = restReady && !!omittedItems.length;
var suffixStyle = {};
if (suffixFixedStart !== null && shouldResponsive) {
suffixStyle = {
position: "absolute",
left: suffixFixedStart,
top: 0
};
}
var itemSharedProps = {
prefixCls: itemPrefixCls,
responsive: shouldResponsive,
component: itemComponent,
invalidate
};
var internalRenderItemNode = renderRawItem ? function(item, index2) {
var key2 = getKey2(item, index2);
return /* @__PURE__ */ jsx(OverflowContext.Provider, {
value: _objectSpread2$a(_objectSpread2$a({}, itemSharedProps), {}, {
order: index2,
item,
itemKey: key2,
registerSize,
display: index2 <= mergedDisplayCount
}),
children: renderRawItem(item, index2)
}, key2);
} : function(item, index2) {
var key2 = getKey2(item, index2);
return /* @__PURE__ */ React$a.createElement(Item$3, {
...itemSharedProps,
order: index2,
key: key2,
item,
renderItem: mergedRenderItem,
itemKey: key2,
registerSize,
display: index2 <= mergedDisplayCount
});
};
var restNode;
var restContextProps = {
order: displayRest ? mergedDisplayCount : Number.MAX_SAFE_INTEGER,
className: "".concat(itemPrefixCls, "-rest"),
registerSize: registerOverflowSize,
display: displayRest
};
if (!renderRawRest) {
var mergedRenderRest = renderRest || defaultRenderRest;
restNode = /* @__PURE__ */ jsx(Item$3, {
...itemSharedProps,
...restContextProps,
children: typeof mergedRenderRest === "function" ? mergedRenderRest(omittedItems) : mergedRenderRest
});
} else if (renderRawRest) {
restNode = /* @__PURE__ */ jsx(OverflowContext.Provider, {
value: _objectSpread2$a(_objectSpread2$a({}, itemSharedProps), restContextProps),
children: renderRawRest(omittedItems)
});
}
var overflowNode = /* @__PURE__ */ jsxs(Component, {
className: classnames(!invalidate && prefixCls, className),
style: style2,
ref,
...restProps,
children: [mergedData.map(internalRenderItemNode), showRest ? restNode : null, suffix && /* @__PURE__ */ jsx(Item$3, {
...itemSharedProps,
responsive: isResponsive,
responsiveDisabled: !shouldResponsive,
order: mergedDisplayCount,
className: "".concat(itemPrefixCls, "-suffix"),
registerSize: registerSuffixSize,
display: true,
style: suffixStyle,
children: suffix
})]
});
if (isResponsive) {
overflowNode = /* @__PURE__ */ jsx(RefResizeObserver, {
onResize: onOverflowResize,
disabled: !shouldResponsive,
children: overflowNode
});
}
return overflowNode;
}
var ForwardOverflow = /* @__PURE__ */ React__namespace.forwardRef(Overflow);
ForwardOverflow.displayName = "Overflow";
ForwardOverflow.Item = RawItem;
ForwardOverflow.RESPONSIVE = RESPONSIVE;
ForwardOverflow.INVALIDATE = INVALIDATE;
var TransBtn = function TransBtn2(_ref) {
var className = _ref.className, customizeIcon = _ref.customizeIcon, customizeIconProps = _ref.customizeIconProps, _onMouseDown = _ref.onMouseDown, onClick = _ref.onClick, children = _ref.children;
var icon;
if (typeof customizeIcon === "function") {
icon = customizeIcon(customizeIconProps);
} else {
icon = customizeIcon;
}
return /* @__PURE__ */ jsx("span", {
className,
onMouseDown: function onMouseDown(event) {
event.preventDefault();
if (_onMouseDown) {
_onMouseDown(event);
}
},
style: {
userSelect: "none",
WebkitUserSelect: "none"
},
unselectable: "on",
onClick,
"aria-hidden": true,
children: icon !== void 0 ? icon : /* @__PURE__ */ jsx("span", {
className: classnames(className.split(/\s+/).map(function(cls) {
return "".concat(cls, "-icon");
})),
children
})
});
};
var Input$5 = function Input2(_ref, ref) {
var _inputNode2, _inputNode2$props;
var prefixCls = _ref.prefixCls, id2 = _ref.id, inputElement = _ref.inputElement, disabled = _ref.disabled, tabIndex = _ref.tabIndex, autoFocus = _ref.autoFocus, autoComplete = _ref.autoComplete, editable = _ref.editable, activeDescendantId = _ref.activeDescendantId, value = _ref.value, maxLength = _ref.maxLength, _onKeyDown = _ref.onKeyDown, _onMouseDown = _ref.onMouseDown, _onChange = _ref.onChange, onPaste = _ref.onPaste, _onCompositionStart = _ref.onCompositionStart, _onCompositionEnd = _ref.onCompositionEnd, open = _ref.open, attrs = _ref.attrs;
var inputNode = inputElement || /* @__PURE__ */ jsx("input", {});
var _inputNode = inputNode, originRef = _inputNode.ref, originProps = _inputNode.props;
var onOriginKeyDown = originProps.onKeyDown, onOriginChange = originProps.onChange, onOriginMouseDown = originProps.onMouseDown, onOriginCompositionStart = originProps.onCompositionStart, onOriginCompositionEnd = originProps.onCompositionEnd, style2 = originProps.style;
warning$3(!("maxLength" in inputNode.props));
inputNode = /* @__PURE__ */ React__namespace.cloneElement(inputNode, _objectSpread2$a(_objectSpread2$a(_objectSpread2$a({
type: "search"
}, originProps), {}, {
id: id2,
ref: composeRef(ref, originRef),
disabled,
tabIndex,
autoComplete: autoComplete || "off",
autoFocus,
className: classnames("".concat(prefixCls, "-selection-search-input"), (_inputNode2 = inputNode) === null || _inputNode2 === void 0 ? void 0 : (_inputNode2$props = _inputNode2.props) === null || _inputNode2$props === void 0 ? void 0 : _inputNode2$props.className),
role: "combobox",
"aria-expanded": open,
"aria-haspopup": "listbox",
"aria-owns": "".concat(id2, "_list"),
"aria-autocomplete": "list",
"aria-controls": "".concat(id2, "_list"),
"aria-activedescendant": activeDescendantId
}, attrs), {}, {
value: editable ? value : "",
maxLength,
readOnly: !editable,
unselectable: !editable ? "on" : null,
style: _objectSpread2$a(_objectSpread2$a({}, style2), {}, {
opacity: editable ? null : 0
}),
onKeyDown: function onKeyDown2(event) {
_onKeyDown(event);
if (onOriginKeyDown) {
onOriginKeyDown(event);
}
},
onMouseDown: function onMouseDown(event) {
_onMouseDown(event);
if (onOriginMouseDown) {
onOriginMouseDown(event);
}
},
onChange: function onChange(event) {
_onChange(event);
if (onOriginChange) {
onOriginChange(event);
}
},
onCompositionStart: function onCompositionStart(event) {
_onCompositionStart(event);
if (onOriginCompositionStart) {
onOriginCompositionStart(event);
}
},
onCompositionEnd: function onCompositionEnd(event) {
_onCompositionEnd(event);
if (onOriginCompositionEnd) {
onOriginCompositionEnd(event);
}
},
onPaste
}));
return inputNode;
};
var RefInput = /* @__PURE__ */ React__namespace.forwardRef(Input$5);
RefInput.displayName = "Input";
function toArray$7(value) {
if (Array.isArray(value)) {
return value;
}
return value !== void 0 ? [value] : [];
}
var isClient = typeof window !== "undefined" && window.document && window.document.documentElement;
var isBrowserClient$2 = isClient;
function hasValue(value) {
return value !== void 0 && value !== null;
}
function isTitleType$1(title) {
return ["string", "number"].includes(_typeof$q(title));
}
function getTitle(item) {
var title = void 0;
if (item) {
if (isTitleType$1(item.title)) {
title = item.title.toString();
} else if (isTitleType$1(item.label)) {
title = item.label.toString();
}
}
return title;
}
function useLayoutEffect(effect, deps) {
if (isBrowserClient$2) {
React__namespace.useLayoutEffect(effect, deps);
} else {
React__namespace.useEffect(effect, deps);
}
}
function itemKey$1(value) {
var _value$key;
return (_value$key = value.key) !== null && _value$key !== void 0 ? _value$key : value.value;
}
var onPreventMouseDown = function onPreventMouseDown2(event) {
event.preventDefault();
event.stopPropagation();
};
var SelectSelector = function SelectSelector2(props) {
var id2 = props.id, prefixCls = props.prefixCls, values = props.values, open = props.open, searchValue = props.searchValue, autoClearSearchValue = props.autoClearSearchValue, inputRef = props.inputRef, placeholder = props.placeholder, disabled = props.disabled, mode = props.mode, showSearch = props.showSearch, autoFocus = props.autoFocus, autoComplete = props.autoComplete, activeDescendantId = props.activeDescendantId, tabIndex = props.tabIndex, removeIcon = props.removeIcon, maxTagCount = props.maxTagCount, maxTagTextLength = props.maxTagTextLength, _props$maxTagPlacehol = props.maxTagPlaceholder, maxTagPlaceholder = _props$maxTagPlacehol === void 0 ? function(omittedValues) {
return "+ ".concat(omittedValues.length, " ...");
} : _props$maxTagPlacehol, tagRender = props.tagRender, onToggleOpen = props.onToggleOpen, onRemove = props.onRemove, onInputChange = props.onInputChange, onInputPaste = props.onInputPaste, onInputKeyDown = props.onInputKeyDown, onInputMouseDown = props.onInputMouseDown, onInputCompositionStart = props.onInputCompositionStart, onInputCompositionEnd = props.onInputCompositionEnd;
var measureRef = React__namespace.useRef(null);
var _useState = React$a.useState(0), _useState2 = _slicedToArray$e(_useState, 2), inputWidth = _useState2[0], setInputWidth = _useState2[1];
var _useState3 = React$a.useState(false), _useState4 = _slicedToArray$e(_useState3, 2), focused = _useState4[0], setFocused = _useState4[1];
var selectionPrefixCls = "".concat(prefixCls, "-selection");
var inputValue = open || mode === "multiple" && autoClearSearchValue === false || mode === "tags" ? searchValue : "";
var inputEditable = mode === "tags" || mode === "multiple" && autoClearSearchValue === false || showSearch && (open || focused);
useLayoutEffect(function() {
setInputWidth(measureRef.current.scrollWidth);
}, [inputValue]);
function defaultRenderSelector(item, content, itemDisabled, closable, onClose) {
return /* @__PURE__ */ jsxs("span", {
className: classnames("".concat(selectionPrefixCls, "-item"), _defineProperty$b({}, "".concat(selectionPrefixCls, "-item-disabled"), itemDisabled)),
title: getTitle(item),
children: [/* @__PURE__ */ jsx("span", {
className: "".concat(selectionPrefixCls, "-item-content"),
children: content
}), closable && /* @__PURE__ */ jsx(TransBtn, {
className: "".concat(selectionPrefixCls, "-item-remove"),
onMouseDown: onPreventMouseDown,
onClick: onClose,
customizeIcon: removeIcon,
children: "\xD7"
})]
});
}
function customizeRenderSelector(value, content, itemDisabled, closable, onClose) {
var onMouseDown = function onMouseDown2(e2) {
onPreventMouseDown(e2);
onToggleOpen(!open);
};
return /* @__PURE__ */ jsx("span", {
onMouseDown,
children: tagRender({
label: content,
value,
disabled: itemDisabled,
closable,
onClose
})
});
}
function renderItem2(valueItem) {
var itemDisabled = valueItem.disabled, label = valueItem.label, value = valueItem.value;
var closable = !disabled && !itemDisabled;
var displayLabel = label;
if (typeof maxTagTextLength === "number") {
if (typeof label === "string" || typeof label === "number") {
var strLabel = String(displayLabel);
if (strLabel.length > maxTagTextLength) {
displayLabel = "".concat(strLabel.slice(0, maxTagTextLength), "...");
}
}
}
var onClose = function onClose2(event) {
if (event)
event.stopPropagation();
onRemove(valueItem);
};
return typeof tagRender === "function" ? customizeRenderSelector(value, displayLabel, itemDisabled, closable, onClose) : defaultRenderSelector(valueItem, displayLabel, itemDisabled, closable, onClose);
}
function renderRest(omittedValues) {
var content = typeof maxTagPlaceholder === "function" ? maxTagPlaceholder(omittedValues) : maxTagPlaceholder;
return defaultRenderSelector({
title: content
}, content, false);
}
var inputNode = /* @__PURE__ */ jsxs("div", {
className: "".concat(selectionPrefixCls, "-search"),
style: {
width: inputWidth
},
onFocus: function onFocus() {
setFocused(true);
},
onBlur: function onBlur() {
setFocused(false);
},
children: [/* @__PURE__ */ jsx(RefInput, {
ref: inputRef,
open,
prefixCls,
id: id2,
inputElement: null,
disabled,
autoFocus,
autoComplete,
editable: inputEditable,
activeDescendantId,
value: inputValue,
onKeyDown: onInputKeyDown,
onMouseDown: onInputMouseDown,
onChange: onInputChange,
onPaste: onInputPaste,
onCompositionStart: onInputCompositionStart,
onCompositionEnd: onInputCompositionEnd,
tabIndex,
attrs: pickAttrs(props, true)
}), /* @__PURE__ */ jsxs("span", {
ref: measureRef,
className: "".concat(selectionPrefixCls, "-search-mirror"),
"aria-hidden": true,
children: [inputValue, "\xA0"]
})]
});
var selectionNode = /* @__PURE__ */ jsx(ForwardOverflow, {
prefixCls: "".concat(selectionPrefixCls, "-overflow"),
data: values,
renderItem: renderItem2,
renderRest,
suffix: inputNode,
itemKey: itemKey$1,
maxCount: maxTagCount
});
return /* @__PURE__ */ jsxs(Fragment, {
children: [selectionNode, !values.length && !inputValue && /* @__PURE__ */ jsx("span", {
className: "".concat(selectionPrefixCls, "-placeholder"),
children: placeholder
})]
});
};
var SingleSelector = function SingleSelector2(props) {
var inputElement = props.inputElement, prefixCls = props.prefixCls, id2 = props.id, inputRef = props.inputRef, disabled = props.disabled, autoFocus = props.autoFocus, autoComplete = props.autoComplete, activeDescendantId = props.activeDescendantId, mode = props.mode, open = props.open, values = props.values, placeholder = props.placeholder, tabIndex = props.tabIndex, showSearch = props.showSearch, searchValue = props.searchValue, activeValue = props.activeValue, maxLength = props.maxLength, onInputKeyDown = props.onInputKeyDown, onInputMouseDown = props.onInputMouseDown, onInputChange = props.onInputChange, onInputPaste = props.onInputPaste, onInputCompositionStart = props.onInputCompositionStart, onInputCompositionEnd = props.onInputCompositionEnd;
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), inputChanged = _React$useState2[0], setInputChanged = _React$useState2[1];
var combobox = mode === "combobox";
var inputEditable = combobox || showSearch;
var item = values[0];
var inputValue = searchValue || "";
if (combobox && activeValue && !inputChanged) {
inputValue = activeValue;
}
React__namespace.useEffect(function() {
if (combobox) {
setInputChanged(false);
}
}, [combobox, activeValue]);
var hasTextInput = mode !== "combobox" && !open && !showSearch ? false : !!inputValue;
var title = getTitle(item);
var renderPlaceholder = function renderPlaceholder2() {
if (item) {
return null;
}
var hiddenStyle = hasTextInput ? {
visibility: "hidden"
} : void 0;
return /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-selection-placeholder"),
style: hiddenStyle,
children: placeholder
});
};
return /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-selection-search"),
children: /* @__PURE__ */ jsx(RefInput, {
ref: inputRef,
prefixCls,
id: id2,
open,
inputElement,
disabled,
autoFocus,
autoComplete,
editable: inputEditable,
activeDescendantId,
value: inputValue,
onKeyDown: onInputKeyDown,
onMouseDown: onInputMouseDown,
onChange: function onChange(e2) {
setInputChanged(true);
onInputChange(e2);
},
onPaste: onInputPaste,
onCompositionStart: onInputCompositionStart,
onCompositionEnd: onInputCompositionEnd,
tabIndex,
attrs: pickAttrs(props, true),
maxLength: combobox ? maxLength : void 0
})
}), !combobox && item ? /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-selection-item"),
title,
style: hasTextInput ? {
visibility: "hidden"
} : void 0,
children: item.label
}) : null, renderPlaceholder()]
});
};
function isValidateOpenKey(currentKeyCode) {
return ![
KeyCode.ESC,
KeyCode.SHIFT,
KeyCode.BACKSPACE,
KeyCode.TAB,
KeyCode.WIN_KEY,
KeyCode.ALT,
KeyCode.META,
KeyCode.WIN_KEY_RIGHT,
KeyCode.CTRL,
KeyCode.SEMICOLON,
KeyCode.EQUALS,
KeyCode.CAPS_LOCK,
KeyCode.CONTEXT_MENU,
KeyCode.F1,
KeyCode.F2,
KeyCode.F3,
KeyCode.F4,
KeyCode.F5,
KeyCode.F6,
KeyCode.F7,
KeyCode.F8,
KeyCode.F9,
KeyCode.F10,
KeyCode.F11,
KeyCode.F12
].includes(currentKeyCode);
}
var Selector = function Selector2(props, ref) {
var inputRef = React$a.useRef(null);
var compositionStatusRef = React$a.useRef(false);
var prefixCls = props.prefixCls, open = props.open, mode = props.mode, showSearch = props.showSearch, tokenWithEnter = props.tokenWithEnter, autoClearSearchValue = props.autoClearSearchValue, onSearch = props.onSearch, onSearchSubmit = props.onSearchSubmit, onToggleOpen = props.onToggleOpen, onInputKeyDown = props.onInputKeyDown, domRef = props.domRef;
React__namespace.useImperativeHandle(ref, function() {
return {
focus: function focus() {
inputRef.current.focus();
},
blur: function blur() {
inputRef.current.blur();
}
};
});
var _useLock = useLock(0), _useLock2 = _slicedToArray$e(_useLock, 2), getInputMouseDown = _useLock2[0], setInputMouseDown = _useLock2[1];
var onInternalInputKeyDown = function onInternalInputKeyDown2(event) {
var which = event.which;
if (which === KeyCode.UP || which === KeyCode.DOWN) {
event.preventDefault();
}
if (onInputKeyDown) {
onInputKeyDown(event);
}
if (which === KeyCode.ENTER && mode === "tags" && !compositionStatusRef.current && !open) {
onSearchSubmit === null || onSearchSubmit === void 0 ? void 0 : onSearchSubmit(event.target.value);
}
if (isValidateOpenKey(which)) {
onToggleOpen(true);
}
};
var onInternalInputMouseDown = function onInternalInputMouseDown2() {
setInputMouseDown(true);
};
var pastedTextRef = React$a.useRef(null);
var triggerOnSearch = function triggerOnSearch2(value) {
if (onSearch(value, true, compositionStatusRef.current) !== false) {
onToggleOpen(true);
}
};
var onInputCompositionStart = function onInputCompositionStart2() {
compositionStatusRef.current = true;
};
var onInputCompositionEnd = function onInputCompositionEnd2(e2) {
compositionStatusRef.current = false;
if (mode !== "combobox") {
triggerOnSearch(e2.target.value);
}
};
var onInputChange = function onInputChange2(event) {
var value = event.target.value;
if (tokenWithEnter && pastedTextRef.current && /[\r\n]/.test(pastedTextRef.current)) {
var replacedText = pastedTextRef.current.replace(/[\r\n]+$/, "").replace(/\r\n/g, " ").replace(/[\r\n]/g, " ");
value = value.replace(replacedText, pastedTextRef.current);
}
pastedTextRef.current = null;
triggerOnSearch(value);
};
var onInputPaste = function onInputPaste2(e2) {
var clipboardData = e2.clipboardData;
var value = clipboardData.getData("text");
pastedTextRef.current = value;
};
var onClick = function onClick2(_ref) {
var target = _ref.target;
if (target !== inputRef.current) {
var isIE = document.body.style.msTouchAction !== void 0;
if (isIE) {
setTimeout(function() {
inputRef.current.focus();
});
} else {
inputRef.current.focus();
}
}
};
var onMouseDown = function onMouseDown2(event) {
var inputMouseDown = getInputMouseDown();
if (event.target !== inputRef.current && !inputMouseDown && mode !== "combobox") {
event.preventDefault();
}
if (mode !== "combobox" && (!showSearch || !inputMouseDown) || !open) {
if (open && autoClearSearchValue !== false) {
onSearch("", true, false);
}
onToggleOpen();
}
};
var sharedProps = {
inputRef,
onInputKeyDown: onInternalInputKeyDown,
onInputMouseDown: onInternalInputMouseDown,
onInputChange,
onInputPaste,
onInputCompositionStart,
onInputCompositionEnd
};
var selectNode = mode === "multiple" || mode === "tags" ? /* @__PURE__ */ jsx(SelectSelector, {
...props,
...sharedProps
}) : /* @__PURE__ */ jsx(SingleSelector, {
...props,
...sharedProps
});
return /* @__PURE__ */ jsx("div", {
ref: domRef,
className: "".concat(prefixCls, "-selector"),
onClick,
onMouseDown,
children: selectNode
});
};
var ForwardSelector = /* @__PURE__ */ React__namespace.forwardRef(Selector);
ForwardSelector.displayName = "Selector";
var Portal$1 = /* @__PURE__ */ React$a.forwardRef(function(props, ref) {
var didUpdate = props.didUpdate, getContainer2 = props.getContainer, children = props.children;
var parentRef = React$a.useRef();
var containerRef = React$a.useRef();
React$a.useImperativeHandle(ref, function() {
return {};
});
var initRef = React$a.useRef(false);
if (!initRef.current && canUseDom$1()) {
containerRef.current = getContainer2();
parentRef.current = containerRef.current.parentNode;
initRef.current = true;
}
React$a.useEffect(function() {
didUpdate === null || didUpdate === void 0 ? void 0 : didUpdate(props);
});
React$a.useEffect(function() {
if (containerRef.current.parentNode === null && parentRef.current !== null) {
parentRef.current.appendChild(containerRef.current);
}
return function() {
var _containerRef$current, _containerRef$current2;
(_containerRef$current = containerRef.current) === null || _containerRef$current === void 0 ? void 0 : (_containerRef$current2 = _containerRef$current.parentNode) === null || _containerRef$current2 === void 0 ? void 0 : _containerRef$current2.removeChild(containerRef.current);
};
}, []);
return containerRef.current ? /* @__PURE__ */ ReactDOM__default.default.createPortal(children, containerRef.current) : null;
});
function isPointsEq$1(a1, a2, isAlignPoint) {
if (isAlignPoint) {
return a1[0] === a2[0];
}
return a1[0] === a2[0] && a1[1] === a2[1];
}
function getAlignFromPlacement$1(builtinPlacements, placementStr, align) {
var baseAlign = builtinPlacements[placementStr] || {};
return _objectSpread2$a(_objectSpread2$a({}, baseAlign), align);
}
function getAlignPopupClassName(builtinPlacements, prefixCls, align, isAlignPoint) {
var points = align.points;
var placements2 = Object.keys(builtinPlacements);
for (var i2 = 0; i2 < placements2.length; i2 += 1) {
var placement = placements2[i2];
if (isPointsEq$1(builtinPlacements[placement].points, points, isAlignPoint)) {
return "".concat(prefixCls, "-placement-").concat(placement);
}
}
return "";
}
function getMotion$1(_ref) {
var prefixCls = _ref.prefixCls, motion2 = _ref.motion, animation = _ref.animation, transitionName2 = _ref.transitionName;
if (motion2) {
return motion2;
}
if (animation) {
return {
motionName: "".concat(prefixCls, "-").concat(animation)
};
}
if (transitionName2) {
return {
motionName: transitionName2
};
}
return null;
}
function Mask$1(props) {
var prefixCls = props.prefixCls, visible = props.visible, zIndex = props.zIndex, mask = props.mask, maskMotion = props.maskMotion, maskAnimation = props.maskAnimation, maskTransitionName = props.maskTransitionName;
if (!mask) {
return null;
}
var motion2 = {};
if (maskMotion || maskTransitionName || maskAnimation) {
motion2 = _objectSpread2$a({
motionAppear: true
}, getMotion$1({
motion: maskMotion,
prefixCls,
transitionName: maskTransitionName,
animation: maskAnimation
}));
}
return /* @__PURE__ */ jsx(CSSMotion, {
...motion2,
visible,
removeOnLeave: true,
children: function(_ref) {
var className = _ref.className;
return /* @__PURE__ */ jsx("div", {
style: {
zIndex
},
className: classnames("".concat(prefixCls, "-mask"), className)
});
}
});
}
function ownKeys$2(object2, enumerableOnly) {
var keys2 = Object.keys(object2);
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(object2);
enumerableOnly && (symbols = symbols.filter(function(sym) {
return Object.getOwnPropertyDescriptor(object2, sym).enumerable;
})), keys2.push.apply(keys2, symbols);
}
return keys2;
}
function _objectSpread2$9(target) {
for (var i2 = 1; i2 < arguments.length; i2++) {
var source = null != arguments[i2] ? arguments[i2] : {};
i2 % 2 ? ownKeys$2(Object(source), true).forEach(function(key2) {
_defineProperty$a(target, key2, source[key2]);
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$2(Object(source)).forEach(function(key2) {
Object.defineProperty(target, key2, Object.getOwnPropertyDescriptor(source, key2));
});
}
return target;
}
function _typeof$p(obj) {
"@babel/helpers - typeof";
return _typeof$p = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof$p(obj);
}
function _defineProperty$a(obj, key2, value) {
if (key2 in obj) {
Object.defineProperty(obj, key2, {
value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key2] = value;
}
return obj;
}
var vendorPrefix;
var jsCssMap = {
Webkit: "-webkit-",
Moz: "-moz-",
ms: "-ms-",
O: "-o-"
};
function getVendorPrefix() {
if (vendorPrefix !== void 0) {
return vendorPrefix;
}
vendorPrefix = "";
var style2 = document.createElement("p").style;
var testProp = "Transform";
for (var key2 in jsCssMap) {
if (key2 + testProp in style2) {
vendorPrefix = key2;
}
}
return vendorPrefix;
}
function getTransitionName$1() {
return getVendorPrefix() ? "".concat(getVendorPrefix(), "TransitionProperty") : "transitionProperty";
}
function getTransformName() {
return getVendorPrefix() ? "".concat(getVendorPrefix(), "Transform") : "transform";
}
function setTransitionProperty(node, value) {
var name2 = getTransitionName$1();
if (name2) {
node.style[name2] = value;
if (name2 !== "transitionProperty") {
node.style.transitionProperty = value;
}
}
}
function setTransform(node, value) {
var name2 = getTransformName();
if (name2) {
node.style[name2] = value;
if (name2 !== "transform") {
node.style.transform = value;
}
}
}
function getTransitionProperty(node) {
return node.style.transitionProperty || node.style[getTransitionName$1()];
}
function getTransformXY(node) {
var style2 = window.getComputedStyle(node, null);
var transform = style2.getPropertyValue("transform") || style2.getPropertyValue(getTransformName());
if (transform && transform !== "none") {
var matrix = transform.replace(/[^0-9\-.,]/g, "").split(",");
return {
x: parseFloat(matrix[12] || matrix[4], 0),
y: parseFloat(matrix[13] || matrix[5], 0)
};
}
return {
x: 0,
y: 0
};
}
var matrix2d = /matrix\((.*)\)/;
var matrix3d = /matrix3d\((.*)\)/;
function setTransformXY(node, xy) {
var style2 = window.getComputedStyle(node, null);
var transform = style2.getPropertyValue("transform") || style2.getPropertyValue(getTransformName());
if (transform && transform !== "none") {
var arr;
var match2d = transform.match(matrix2d);
if (match2d) {
match2d = match2d[1];
arr = match2d.split(",").map(function(item) {
return parseFloat(item, 10);
});
arr[4] = xy.x;
arr[5] = xy.y;
setTransform(node, "matrix(".concat(arr.join(","), ")"));
} else {
var match3d = transform.match(matrix3d)[1];
arr = match3d.split(",").map(function(item) {
return parseFloat(item, 10);
});
arr[12] = xy.x;
arr[13] = xy.y;
setTransform(node, "matrix3d(".concat(arr.join(","), ")"));
}
} else {
setTransform(node, "translateX(".concat(xy.x, "px) translateY(").concat(xy.y, "px) translateZ(0)"));
}
}
var RE_NUM = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source;
var getComputedStyleX;
function forceRelayout(elem) {
var originalStyle = elem.style.display;
elem.style.display = "none";
elem.offsetHeight;
elem.style.display = originalStyle;
}
function css(el, name2, v2) {
var value = v2;
if (_typeof$p(name2) === "object") {
for (var i2 in name2) {
if (name2.hasOwnProperty(i2)) {
css(el, i2, name2[i2]);
}
}
return void 0;
}
if (typeof value !== "undefined") {
if (typeof value === "number") {
value = "".concat(value, "px");
}
el.style[name2] = value;
return void 0;
}
return getComputedStyleX(el, name2);
}
function getClientPosition$1(elem) {
var box;
var x2;
var y2;
var doc = elem.ownerDocument;
var body = doc.body;
var docElem = doc && doc.documentElement;
box = elem.getBoundingClientRect();
x2 = Math.floor(box.left);
y2 = Math.floor(box.top);
x2 -= docElem.clientLeft || body.clientLeft || 0;
y2 -= docElem.clientTop || body.clientTop || 0;
return {
left: x2,
top: y2
};
}
function getScroll$2(w2, top) {
var ret = w2["page".concat(top ? "Y" : "X", "Offset")];
var method2 = "scroll".concat(top ? "Top" : "Left");
if (typeof ret !== "number") {
var d2 = w2.document;
ret = d2.documentElement[method2];
if (typeof ret !== "number") {
ret = d2.body[method2];
}
}
return ret;
}
function getScrollLeft(w2) {
return getScroll$2(w2);
}
function getScrollTop(w2) {
return getScroll$2(w2, true);
}
function getOffset$3(el) {
var pos = getClientPosition$1(el);
var doc = el.ownerDocument;
var w2 = doc.defaultView || doc.parentWindow;
pos.left += getScrollLeft(w2);
pos.top += getScrollTop(w2);
return pos;
}
function isWindow$1(obj) {
return obj !== null && obj !== void 0 && obj == obj.window;
}
function getDocument(node) {
if (isWindow$1(node)) {
return node.document;
}
if (node.nodeType === 9) {
return node;
}
return node.ownerDocument;
}
function _getComputedStyle(elem, name2, cs2) {
var computedStyle = cs2;
var val = "";
var d2 = getDocument(elem);
computedStyle = computedStyle || d2.defaultView.getComputedStyle(elem, null);
if (computedStyle) {
val = computedStyle.getPropertyValue(name2) || computedStyle[name2];
}
return val;
}
var _RE_NUM_NO_PX = new RegExp("^(".concat(RE_NUM, ")(?!px)[a-z%]+$"), "i");
var RE_POS = /^(top|right|bottom|left)$/;
var CURRENT_STYLE = "currentStyle";
var RUNTIME_STYLE = "runtimeStyle";
var LEFT$1 = "left";
var PX = "px";
function _getComputedStyleIE(elem, name2) {
var ret = elem[CURRENT_STYLE] && elem[CURRENT_STYLE][name2];
if (_RE_NUM_NO_PX.test(ret) && !RE_POS.test(name2)) {
var style2 = elem.style;
var left = style2[LEFT$1];
var rsLeft = elem[RUNTIME_STYLE][LEFT$1];
elem[RUNTIME_STYLE][LEFT$1] = elem[CURRENT_STYLE][LEFT$1];
style2[LEFT$1] = name2 === "fontSize" ? "1em" : ret || 0;
ret = style2.pixelLeft + PX;
style2[LEFT$1] = left;
elem[RUNTIME_STYLE][LEFT$1] = rsLeft;
}
return ret === "" ? "auto" : ret;
}
if (typeof window !== "undefined") {
getComputedStyleX = window.getComputedStyle ? _getComputedStyle : _getComputedStyleIE;
}
function getOffsetDirection(dir, option) {
if (dir === "left") {
return option.useCssRight ? "right" : dir;
}
return option.useCssBottom ? "bottom" : dir;
}
function oppositeOffsetDirection(dir) {
if (dir === "left") {
return "right";
} else if (dir === "right") {
return "left";
} else if (dir === "top") {
return "bottom";
} else if (dir === "bottom") {
return "top";
}
}
function setLeftTop(elem, offset2, option) {
if (css(elem, "position") === "static") {
elem.style.position = "relative";
}
var presetH = -999;
var presetV = -999;
var horizontalProperty = getOffsetDirection("left", option);
var verticalProperty = getOffsetDirection("top", option);
var oppositeHorizontalProperty = oppositeOffsetDirection(horizontalProperty);
var oppositeVerticalProperty = oppositeOffsetDirection(verticalProperty);
if (horizontalProperty !== "left") {
presetH = 999;
}
if (verticalProperty !== "top") {
presetV = 999;
}
var originalTransition = "";
var originalOffset = getOffset$3(elem);
if ("left" in offset2 || "top" in offset2) {
originalTransition = getTransitionProperty(elem) || "";
setTransitionProperty(elem, "none");
}
if ("left" in offset2) {
elem.style[oppositeHorizontalProperty] = "";
elem.style[horizontalProperty] = "".concat(presetH, "px");
}
if ("top" in offset2) {
elem.style[oppositeVerticalProperty] = "";
elem.style[verticalProperty] = "".concat(presetV, "px");
}
forceRelayout(elem);
var old = getOffset$3(elem);
var originalStyle = {};
for (var key2 in offset2) {
if (offset2.hasOwnProperty(key2)) {
var dir = getOffsetDirection(key2, option);
var preset = key2 === "left" ? presetH : presetV;
var off = originalOffset[key2] - old[key2];
if (dir === key2) {
originalStyle[dir] = preset + off;
} else {
originalStyle[dir] = preset - off;
}
}
}
css(elem, originalStyle);
forceRelayout(elem);
if ("left" in offset2 || "top" in offset2) {
setTransitionProperty(elem, originalTransition);
}
var ret = {};
for (var _key in offset2) {
if (offset2.hasOwnProperty(_key)) {
var _dir = getOffsetDirection(_key, option);
var _off = offset2[_key] - originalOffset[_key];
if (_key === _dir) {
ret[_dir] = originalStyle[_dir] + _off;
} else {
ret[_dir] = originalStyle[_dir] - _off;
}
}
}
css(elem, ret);
}
function setTransform$1(elem, offset2) {
var originalOffset = getOffset$3(elem);
var originalXY = getTransformXY(elem);
var resultXY = {
x: originalXY.x,
y: originalXY.y
};
if ("left" in offset2) {
resultXY.x = originalXY.x + offset2.left - originalOffset.left;
}
if ("top" in offset2) {
resultXY.y = originalXY.y + offset2.top - originalOffset.top;
}
setTransformXY(elem, resultXY);
}
function setOffset(elem, offset2, option) {
if (option.ignoreShake) {
var oriOffset = getOffset$3(elem);
var oLeft = oriOffset.left.toFixed(0);
var oTop = oriOffset.top.toFixed(0);
var tLeft = offset2.left.toFixed(0);
var tTop = offset2.top.toFixed(0);
if (oLeft === tLeft && oTop === tTop) {
return;
}
}
if (option.useCssRight || option.useCssBottom) {
setLeftTop(elem, offset2, option);
} else if (option.useCssTransform && getTransformName() in document.body.style) {
setTransform$1(elem, offset2);
} else {
setLeftTop(elem, offset2, option);
}
}
function each(arr, fn) {
for (var i2 = 0; i2 < arr.length; i2++) {
fn(arr[i2]);
}
}
function isBorderBoxFn(elem) {
return getComputedStyleX(elem, "boxSizing") === "border-box";
}
var BOX_MODELS = ["margin", "border", "padding"];
var CONTENT_INDEX = -1;
var PADDING_INDEX = 2;
var BORDER_INDEX = 1;
var MARGIN_INDEX = 0;
function swap(elem, options, callback) {
var old = {};
var style2 = elem.style;
var name2;
for (name2 in options) {
if (options.hasOwnProperty(name2)) {
old[name2] = style2[name2];
style2[name2] = options[name2];
}
}
callback.call(elem);
for (name2 in options) {
if (options.hasOwnProperty(name2)) {
style2[name2] = old[name2];
}
}
}
function getPBMWidth(elem, props, which) {
var value = 0;
var prop;
var j2;
var i2;
for (j2 = 0; j2 < props.length; j2++) {
prop = props[j2];
if (prop) {
for (i2 = 0; i2 < which.length; i2++) {
var cssProp = void 0;
if (prop === "border") {
cssProp = "".concat(prop).concat(which[i2], "Width");
} else {
cssProp = prop + which[i2];
}
value += parseFloat(getComputedStyleX(elem, cssProp)) || 0;
}
}
}
return value;
}
var domUtils = {
getParent: function getParent2(element) {
var parent2 = element;
do {
if (parent2.nodeType === 11 && parent2.host) {
parent2 = parent2.host;
} else {
parent2 = parent2.parentNode;
}
} while (parent2 && parent2.nodeType !== 1 && parent2.nodeType !== 9);
return parent2;
}
};
each(["Width", "Height"], function(name2) {
domUtils["doc".concat(name2)] = function(refWin) {
var d2 = refWin.document;
return Math.max(
d2.documentElement["scroll".concat(name2)],
d2.body["scroll".concat(name2)],
domUtils["viewport".concat(name2)](d2)
);
};
domUtils["viewport".concat(name2)] = function(win) {
var prop = "client".concat(name2);
var doc = win.document;
var body = doc.body;
var documentElement = doc.documentElement;
var documentElementProp = documentElement[prop];
return doc.compatMode === "CSS1Compat" && documentElementProp || body && body[prop] || documentElementProp;
};
});
function getWH(elem, name2, ex) {
var extra = ex;
if (isWindow$1(elem)) {
return name2 === "width" ? domUtils.viewportWidth(elem) : domUtils.viewportHeight(elem);
} else if (elem.nodeType === 9) {
return name2 === "width" ? domUtils.docWidth(elem) : domUtils.docHeight(elem);
}
var which = name2 === "width" ? ["Left", "Right"] : ["Top", "Bottom"];
var borderBoxValue = name2 === "width" ? Math.floor(elem.getBoundingClientRect().width) : Math.floor(elem.getBoundingClientRect().height);
var isBorderBox = isBorderBoxFn(elem);
var cssBoxValue = 0;
if (borderBoxValue === null || borderBoxValue === void 0 || borderBoxValue <= 0) {
borderBoxValue = void 0;
cssBoxValue = getComputedStyleX(elem, name2);
if (cssBoxValue === null || cssBoxValue === void 0 || Number(cssBoxValue) < 0) {
cssBoxValue = elem.style[name2] || 0;
}
cssBoxValue = Math.floor(parseFloat(cssBoxValue)) || 0;
}
if (extra === void 0) {
extra = isBorderBox ? BORDER_INDEX : CONTENT_INDEX;
}
var borderBoxValueOrIsBorderBox = borderBoxValue !== void 0 || isBorderBox;
var val = borderBoxValue || cssBoxValue;
if (extra === CONTENT_INDEX) {
if (borderBoxValueOrIsBorderBox) {
return val - getPBMWidth(elem, ["border", "padding"], which);
}
return cssBoxValue;
} else if (borderBoxValueOrIsBorderBox) {
if (extra === BORDER_INDEX) {
return val;
}
return val + (extra === PADDING_INDEX ? -getPBMWidth(elem, ["border"], which) : getPBMWidth(elem, ["margin"], which));
}
return cssBoxValue + getPBMWidth(elem, BOX_MODELS.slice(extra), which);
}
var cssShow = {
position: "absolute",
visibility: "hidden",
display: "block"
};
function getWHIgnoreDisplay() {
for (var _len = arguments.length, args = new Array(_len), _key2 = 0; _key2 < _len; _key2++) {
args[_key2] = arguments[_key2];
}
var val;
var elem = args[0];
if (elem.offsetWidth !== 0) {
val = getWH.apply(void 0, args);
} else {
swap(elem, cssShow, function() {
val = getWH.apply(void 0, args);
});
}
return val;
}
each(["width", "height"], function(name2) {
var first = name2.charAt(0).toUpperCase() + name2.slice(1);
domUtils["outer".concat(first)] = function(el, includeMargin) {
return el && getWHIgnoreDisplay(el, name2, includeMargin ? MARGIN_INDEX : BORDER_INDEX);
};
var which = name2 === "width" ? ["Left", "Right"] : ["Top", "Bottom"];
domUtils[name2] = function(elem, v2) {
var val = v2;
if (val !== void 0) {
if (elem) {
var isBorderBox = isBorderBoxFn(elem);
if (isBorderBox) {
val += getPBMWidth(elem, ["padding", "border"], which);
}
return css(elem, name2, val);
}
return void 0;
}
return elem && getWHIgnoreDisplay(elem, name2, CONTENT_INDEX);
};
});
function mix(to, from) {
for (var i2 in from) {
if (from.hasOwnProperty(i2)) {
to[i2] = from[i2];
}
}
return to;
}
var utils$2 = {
getWindow: function getWindow(node) {
if (node && node.document && node.setTimeout) {
return node;
}
var doc = node.ownerDocument || node;
return doc.defaultView || doc.parentWindow;
},
getDocument,
offset: function offset2(el, value, option) {
if (typeof value !== "undefined") {
setOffset(el, value, option || {});
} else {
return getOffset$3(el);
}
},
isWindow: isWindow$1,
each,
css,
clone: function clone(obj) {
var i2;
var ret = {};
for (i2 in obj) {
if (obj.hasOwnProperty(i2)) {
ret[i2] = obj[i2];
}
}
var overflow = obj.overflow;
if (overflow) {
for (i2 in obj) {
if (obj.hasOwnProperty(i2)) {
ret.overflow[i2] = obj.overflow[i2];
}
}
}
return ret;
},
mix,
getWindowScrollLeft: function getWindowScrollLeft(w2) {
return getScrollLeft(w2);
},
getWindowScrollTop: function getWindowScrollTop(w2) {
return getScrollTop(w2);
},
merge: function merge2() {
var ret = {};
for (var i2 = 0; i2 < arguments.length; i2++) {
utils$2.mix(ret, i2 < 0 || arguments.length <= i2 ? void 0 : arguments[i2]);
}
return ret;
},
viewportWidth: 0,
viewportHeight: 0
};
mix(utils$2, domUtils);
var getParent = utils$2.getParent;
function getOffsetParent(element) {
if (utils$2.isWindow(element) || element.nodeType === 9) {
return null;
}
var doc = utils$2.getDocument(element);
var body = doc.body;
var parent2;
var positionStyle = utils$2.css(element, "position");
var skipStatic = positionStyle === "fixed" || positionStyle === "absolute";
if (!skipStatic) {
return element.nodeName.toLowerCase() === "html" ? null : getParent(element);
}
for (parent2 = getParent(element); parent2 && parent2 !== body && parent2.nodeType !== 9; parent2 = getParent(parent2)) {
positionStyle = utils$2.css(parent2, "position");
if (positionStyle !== "static") {
return parent2;
}
}
return null;
}
var getParent$1 = utils$2.getParent;
function isAncestorFixed(element) {
if (utils$2.isWindow(element) || element.nodeType === 9) {
return false;
}
var doc = utils$2.getDocument(element);
var body = doc.body;
var parent2 = null;
for (parent2 = getParent$1(element); parent2 && parent2 !== body && parent2 !== doc; parent2 = getParent$1(parent2)) {
var positionStyle = utils$2.css(parent2, "position");
if (positionStyle === "fixed") {
return true;
}
}
return false;
}
function getVisibleRectForElement(element, alwaysByViewport) {
var visibleRect = {
left: 0,
right: Infinity,
top: 0,
bottom: Infinity
};
var el = getOffsetParent(element);
var doc = utils$2.getDocument(element);
var win = doc.defaultView || doc.parentWindow;
var body = doc.body;
var documentElement = doc.documentElement;
while (el) {
if ((navigator.userAgent.indexOf("MSIE") === -1 || el.clientWidth !== 0) && el !== body && el !== documentElement && utils$2.css(el, "overflow") !== "visible") {
var pos = utils$2.offset(el);
pos.left += el.clientLeft;
pos.top += el.clientTop;
visibleRect.top = Math.max(visibleRect.top, pos.top);
visibleRect.right = Math.min(
visibleRect.right,
pos.left + el.clientWidth
);
visibleRect.bottom = Math.min(visibleRect.bottom, pos.top + el.clientHeight);
visibleRect.left = Math.max(visibleRect.left, pos.left);
} else if (el === body || el === documentElement) {
break;
}
el = getOffsetParent(el);
}
var originalPosition = null;
if (!utils$2.isWindow(element) && element.nodeType !== 9) {
originalPosition = element.style.position;
var position = utils$2.css(element, "position");
if (position === "absolute") {
element.style.position = "fixed";
}
}
var scrollX = utils$2.getWindowScrollLeft(win);
var scrollY = utils$2.getWindowScrollTop(win);
var viewportWidth = utils$2.viewportWidth(win);
var viewportHeight = utils$2.viewportHeight(win);
var documentWidth = documentElement.scrollWidth;
var documentHeight = documentElement.scrollHeight;
var bodyStyle = window.getComputedStyle(body);
if (bodyStyle.overflowX === "hidden") {
documentWidth = win.innerWidth;
}
if (bodyStyle.overflowY === "hidden") {
documentHeight = win.innerHeight;
}
if (element.style) {
element.style.position = originalPosition;
}
if (alwaysByViewport || isAncestorFixed(element)) {
visibleRect.left = Math.max(visibleRect.left, scrollX);
visibleRect.top = Math.max(visibleRect.top, scrollY);
visibleRect.right = Math.min(visibleRect.right, scrollX + viewportWidth);
visibleRect.bottom = Math.min(visibleRect.bottom, scrollY + viewportHeight);
} else {
var maxVisibleWidth = Math.max(documentWidth, scrollX + viewportWidth);
visibleRect.right = Math.min(visibleRect.right, maxVisibleWidth);
var maxVisibleHeight = Math.max(documentHeight, scrollY + viewportHeight);
visibleRect.bottom = Math.min(visibleRect.bottom, maxVisibleHeight);
}
return visibleRect.top >= 0 && visibleRect.left >= 0 && visibleRect.bottom > visibleRect.top && visibleRect.right > visibleRect.left ? visibleRect : null;
}
function adjustForViewport(elFuturePos, elRegion, visibleRect, overflow) {
var pos = utils$2.clone(elFuturePos);
var size = {
width: elRegion.width,
height: elRegion.height
};
if (overflow.adjustX && pos.left < visibleRect.left) {
pos.left = visibleRect.left;
}
if (overflow.resizeWidth && pos.left >= visibleRect.left && pos.left + size.width > visibleRect.right) {
size.width -= pos.left + size.width - visibleRect.right;
}
if (overflow.adjustX && pos.left + size.width > visibleRect.right) {
pos.left = Math.max(visibleRect.right - size.width, visibleRect.left);
}
if (overflow.adjustY && pos.top < visibleRect.top) {
pos.top = visibleRect.top;
}
if (overflow.resizeHeight && pos.top >= visibleRect.top && pos.top + size.height > visibleRect.bottom) {
size.height -= pos.top + size.height - visibleRect.bottom;
}
if (overflow.adjustY && pos.top + size.height > visibleRect.bottom) {
pos.top = Math.max(visibleRect.bottom - size.height, visibleRect.top);
}
return utils$2.mix(pos, size);
}
function getRegion(node) {
var offset2;
var w2;
var h2;
if (!utils$2.isWindow(node) && node.nodeType !== 9) {
offset2 = utils$2.offset(node);
w2 = utils$2.outerWidth(node);
h2 = utils$2.outerHeight(node);
} else {
var win = utils$2.getWindow(node);
offset2 = {
left: utils$2.getWindowScrollLeft(win),
top: utils$2.getWindowScrollTop(win)
};
w2 = utils$2.viewportWidth(win);
h2 = utils$2.viewportHeight(win);
}
offset2.width = w2;
offset2.height = h2;
return offset2;
}
function getAlignOffset(region, align) {
var V = align.charAt(0);
var H = align.charAt(1);
var w2 = region.width;
var h2 = region.height;
var x2 = region.left;
var y2 = region.top;
if (V === "c") {
y2 += h2 / 2;
} else if (V === "b") {
y2 += h2;
}
if (H === "c") {
x2 += w2 / 2;
} else if (H === "r") {
x2 += w2;
}
return {
left: x2,
top: y2
};
}
function getElFuturePos(elRegion, refNodeRegion, points, offset2, targetOffset2) {
var p1 = getAlignOffset(refNodeRegion, points[1]);
var p2 = getAlignOffset(elRegion, points[0]);
var diff = [p2.left - p1.left, p2.top - p1.top];
return {
left: Math.round(elRegion.left - diff[0] + offset2[0] - targetOffset2[0]),
top: Math.round(elRegion.top - diff[1] + offset2[1] - targetOffset2[1])
};
}
function isFailX(elFuturePos, elRegion, visibleRect) {
return elFuturePos.left < visibleRect.left || elFuturePos.left + elRegion.width > visibleRect.right;
}
function isFailY(elFuturePos, elRegion, visibleRect) {
return elFuturePos.top < visibleRect.top || elFuturePos.top + elRegion.height > visibleRect.bottom;
}
function isCompleteFailX(elFuturePos, elRegion, visibleRect) {
return elFuturePos.left > visibleRect.right || elFuturePos.left + elRegion.width < visibleRect.left;
}
function isCompleteFailY(elFuturePos, elRegion, visibleRect) {
return elFuturePos.top > visibleRect.bottom || elFuturePos.top + elRegion.height < visibleRect.top;
}
function flip(points, reg, map) {
var ret = [];
utils$2.each(points, function(p2) {
ret.push(p2.replace(reg, function(m2) {
return map[m2];
}));
});
return ret;
}
function flipOffset(offset2, index2) {
offset2[index2] = -offset2[index2];
return offset2;
}
function convertOffset(str, offsetLen) {
var n2;
if (/%$/.test(str)) {
n2 = parseInt(str.substring(0, str.length - 1), 10) / 100 * offsetLen;
} else {
n2 = parseInt(str, 10);
}
return n2 || 0;
}
function normalizeOffset(offset2, el) {
offset2[0] = convertOffset(offset2[0], el.width);
offset2[1] = convertOffset(offset2[1], el.height);
}
function doAlign(el, tgtRegion, align, isTgtRegionVisible) {
var points = align.points;
var offset2 = align.offset || [0, 0];
var targetOffset2 = align.targetOffset || [0, 0];
var overflow = align.overflow;
var source = align.source || el;
offset2 = [].concat(offset2);
targetOffset2 = [].concat(targetOffset2);
overflow = overflow || {};
var newOverflowCfg = {};
var fail = 0;
var alwaysByViewport = !!(overflow && overflow.alwaysByViewport);
var visibleRect = getVisibleRectForElement(source, alwaysByViewport);
var elRegion = getRegion(source);
normalizeOffset(offset2, elRegion);
normalizeOffset(targetOffset2, tgtRegion);
var elFuturePos = getElFuturePos(elRegion, tgtRegion, points, offset2, targetOffset2);
var newElRegion = utils$2.merge(elRegion, elFuturePos);
if (visibleRect && (overflow.adjustX || overflow.adjustY) && isTgtRegionVisible) {
if (overflow.adjustX) {
if (isFailX(elFuturePos, elRegion, visibleRect)) {
var newPoints = flip(points, /[lr]/gi, {
l: "r",
r: "l"
});
var newOffset = flipOffset(offset2, 0);
var newTargetOffset = flipOffset(targetOffset2, 0);
var newElFuturePos = getElFuturePos(elRegion, tgtRegion, newPoints, newOffset, newTargetOffset);
if (!isCompleteFailX(newElFuturePos, elRegion, visibleRect)) {
fail = 1;
points = newPoints;
offset2 = newOffset;
targetOffset2 = newTargetOffset;
}
}
}
if (overflow.adjustY) {
if (isFailY(elFuturePos, elRegion, visibleRect)) {
var _newPoints = flip(points, /[tb]/gi, {
t: "b",
b: "t"
});
var _newOffset = flipOffset(offset2, 1);
var _newTargetOffset = flipOffset(targetOffset2, 1);
var _newElFuturePos = getElFuturePos(elRegion, tgtRegion, _newPoints, _newOffset, _newTargetOffset);
if (!isCompleteFailY(_newElFuturePos, elRegion, visibleRect)) {
fail = 1;
points = _newPoints;
offset2 = _newOffset;
targetOffset2 = _newTargetOffset;
}
}
}
if (fail) {
elFuturePos = getElFuturePos(elRegion, tgtRegion, points, offset2, targetOffset2);
utils$2.mix(newElRegion, elFuturePos);
}
var isStillFailX = isFailX(elFuturePos, elRegion, visibleRect);
var isStillFailY = isFailY(elFuturePos, elRegion, visibleRect);
if (isStillFailX || isStillFailY) {
var _newPoints2 = points;
if (isStillFailX) {
_newPoints2 = flip(points, /[lr]/gi, {
l: "r",
r: "l"
});
}
if (isStillFailY) {
_newPoints2 = flip(points, /[tb]/gi, {
t: "b",
b: "t"
});
}
points = _newPoints2;
offset2 = align.offset || [0, 0];
targetOffset2 = align.targetOffset || [0, 0];
}
newOverflowCfg.adjustX = overflow.adjustX && isStillFailX;
newOverflowCfg.adjustY = overflow.adjustY && isStillFailY;
if (newOverflowCfg.adjustX || newOverflowCfg.adjustY) {
newElRegion = adjustForViewport(elFuturePos, elRegion, visibleRect, newOverflowCfg);
}
}
if (newElRegion.width !== elRegion.width) {
utils$2.css(source, "width", utils$2.width(source) + newElRegion.width - elRegion.width);
}
if (newElRegion.height !== elRegion.height) {
utils$2.css(source, "height", utils$2.height(source) + newElRegion.height - elRegion.height);
}
utils$2.offset(source, {
left: newElRegion.left,
top: newElRegion.top
}, {
useCssRight: align.useCssRight,
useCssBottom: align.useCssBottom,
useCssTransform: align.useCssTransform,
ignoreShake: align.ignoreShake
});
return {
points,
offset: offset2,
targetOffset: targetOffset2,
overflow: newOverflowCfg
};
}
function isOutOfVisibleRect(target, alwaysByViewport) {
var visibleRect = getVisibleRectForElement(target, alwaysByViewport);
var targetRegion = getRegion(target);
return !visibleRect || targetRegion.left + targetRegion.width <= visibleRect.left || targetRegion.top + targetRegion.height <= visibleRect.top || targetRegion.left >= visibleRect.right || targetRegion.top >= visibleRect.bottom;
}
function alignElement(el, refNode, align) {
var target = align.target || refNode;
var refNodeRegion = getRegion(target);
var isTargetNotOutOfVisible = !isOutOfVisibleRect(target, align.overflow && align.overflow.alwaysByViewport);
return doAlign(el, refNodeRegion, align, isTargetNotOutOfVisible);
}
alignElement.__getOffsetParent = getOffsetParent;
alignElement.__getVisibleRectForElement = getVisibleRectForElement;
function alignPoint(el, tgtPoint, align) {
var pageX;
var pageY;
var doc = utils$2.getDocument(el);
var win = doc.defaultView || doc.parentWindow;
var scrollX = utils$2.getWindowScrollLeft(win);
var scrollY = utils$2.getWindowScrollTop(win);
var viewportWidth = utils$2.viewportWidth(win);
var viewportHeight = utils$2.viewportHeight(win);
if ("pageX" in tgtPoint) {
pageX = tgtPoint.pageX;
} else {
pageX = scrollX + tgtPoint.clientX;
}
if ("pageY" in tgtPoint) {
pageY = tgtPoint.pageY;
} else {
pageY = scrollY + tgtPoint.clientY;
}
var tgtRegion = {
left: pageX,
top: pageY,
width: 0,
height: 0
};
var pointInView = pageX >= 0 && pageX <= scrollX + viewportWidth && pageY >= 0 && pageY <= scrollY + viewportHeight;
var points = [align.points[0], "cc"];
return doAlign(el, tgtRegion, _objectSpread2$9(_objectSpread2$9({}, align), {}, {
points
}), pointInView);
}
function isEqual$2(obj1, obj2) {
var shallow = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : false;
var refSet = /* @__PURE__ */ new Set();
function deepEqual(a, b2) {
var level = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 1;
var circular = refSet.has(a);
warningOnce(!circular, "Warning: There may be circular references");
if (circular) {
return false;
}
if (a === b2) {
return true;
}
if (shallow && level > 1) {
return false;
}
refSet.add(a);
var newLevel = level + 1;
if (Array.isArray(a)) {
if (!Array.isArray(b2) || a.length !== b2.length) {
return false;
}
for (var i2 = 0; i2 < a.length; i2++) {
if (!deepEqual(a[i2], b2[i2], newLevel)) {
return false;
}
}
return true;
}
if (a && b2 && _typeof$q(a) === "object" && _typeof$q(b2) === "object") {
var keys2 = Object.keys(a);
if (keys2.length !== Object.keys(b2).length) {
return false;
}
return keys2.every(function(key2) {
return deepEqual(a[key2], b2[key2], newLevel);
});
}
return false;
}
return deepEqual(obj1, obj2);
}
const isVisible = function(element) {
if (!element) {
return false;
}
if (element instanceof Element) {
if (element.offsetParent) {
return true;
}
if (element.getBBox) {
var _getBBox = element.getBBox(), width = _getBBox.width, height = _getBBox.height;
if (width || height) {
return true;
}
}
if (element.getBoundingClientRect) {
var _element$getBoundingC = element.getBoundingClientRect(), _width = _element$getBoundingC.width, _height = _element$getBoundingC.height;
if (_width || _height) {
return true;
}
}
}
return false;
};
const useBuffer = function(callback, buffer2) {
var calledRef = React__default.default.useRef(false);
var timeoutRef = React__default.default.useRef(null);
function cancelTrigger() {
window.clearTimeout(timeoutRef.current);
}
function trigger(force) {
cancelTrigger();
if (!calledRef.current || force === true) {
if (callback(force) === false) {
return;
}
calledRef.current = true;
timeoutRef.current = window.setTimeout(function() {
calledRef.current = false;
}, buffer2);
} else {
timeoutRef.current = window.setTimeout(function() {
calledRef.current = false;
trigger();
}, buffer2);
}
}
return [trigger, function() {
calledRef.current = false;
cancelTrigger();
}];
};
function isSamePoint$1(prev, next) {
if (prev === next)
return true;
if (!prev || !next)
return false;
if ("pageX" in next && "pageY" in next) {
return prev.pageX === next.pageX && prev.pageY === next.pageY;
}
if ("clientX" in next && "clientY" in next) {
return prev.clientX === next.clientX && prev.clientY === next.clientY;
}
return false;
}
function restoreFocus$1(activeElement, container) {
if (activeElement !== document.activeElement && contains$2(container, activeElement) && typeof activeElement.focus === "function") {
activeElement.focus();
}
}
function monitorResize(element, callback) {
var prevWidth = null;
var prevHeight = null;
function onResize2(_ref) {
var _ref2 = _slicedToArray$e(_ref, 1), target = _ref2[0].target;
if (!document.documentElement.contains(target))
return;
var _target$getBoundingCl = target.getBoundingClientRect(), width = _target$getBoundingCl.width, height = _target$getBoundingCl.height;
var fixedWidth = Math.floor(width);
var fixedHeight = Math.floor(height);
if (prevWidth !== fixedWidth || prevHeight !== fixedHeight) {
Promise.resolve().then(function() {
callback({
width: fixedWidth,
height: fixedHeight
});
});
}
prevWidth = fixedWidth;
prevHeight = fixedHeight;
}
var resizeObserver2 = new index$Z(onResize2);
if (element) {
resizeObserver2.observe(element);
}
return function() {
resizeObserver2.disconnect();
};
}
function getElement$1(func) {
if (typeof func !== "function")
return null;
return func();
}
function getPoint$1(point) {
if (_typeof$q(point) !== "object" || !point)
return null;
return point;
}
var Align$1 = function Align2(_ref, ref) {
var children = _ref.children, disabled = _ref.disabled, target = _ref.target, align = _ref.align, onAlign = _ref.onAlign, monitorWindowResize = _ref.monitorWindowResize, _ref$monitorBufferTim = _ref.monitorBufferTime, monitorBufferTime = _ref$monitorBufferTim === void 0 ? 0 : _ref$monitorBufferTim;
var cacheRef = React__default.default.useRef({});
var nodeRef = React__default.default.useRef();
var childNode = React__default.default.Children.only(children);
var forceAlignPropsRef = React__default.default.useRef({});
forceAlignPropsRef.current.disabled = disabled;
forceAlignPropsRef.current.target = target;
forceAlignPropsRef.current.align = align;
forceAlignPropsRef.current.onAlign = onAlign;
var _useBuffer = useBuffer(function() {
var _forceAlignPropsRef$c = forceAlignPropsRef.current, latestDisabled = _forceAlignPropsRef$c.disabled, latestTarget = _forceAlignPropsRef$c.target, latestAlign = _forceAlignPropsRef$c.align, latestOnAlign = _forceAlignPropsRef$c.onAlign;
var source = nodeRef.current;
if (!latestDisabled && latestTarget && source) {
var _result;
var _element = getElement$1(latestTarget);
var _point = getPoint$1(latestTarget);
cacheRef.current.element = _element;
cacheRef.current.point = _point;
cacheRef.current.align = latestAlign;
var _document = document, activeElement = _document.activeElement;
if (_element && isVisible(_element)) {
_result = alignElement(source, _element, latestAlign);
} else if (_point) {
_result = alignPoint(source, _point, latestAlign);
}
restoreFocus$1(activeElement, source);
if (latestOnAlign && _result) {
latestOnAlign(source, _result);
}
return true;
}
return false;
}, monitorBufferTime), _useBuffer2 = _slicedToArray$e(_useBuffer, 2), _forceAlign = _useBuffer2[0], cancelForceAlign = _useBuffer2[1];
var _React$useState = React__default.default.useState(), _React$useState2 = _slicedToArray$e(_React$useState, 2), element = _React$useState2[0], setElement = _React$useState2[1];
var _React$useState3 = React__default.default.useState(), _React$useState4 = _slicedToArray$e(_React$useState3, 2), point = _React$useState4[0], setPoint = _React$useState4[1];
useLayoutEffect$1(function() {
setElement(getElement$1(target));
setPoint(getPoint$1(target));
});
React__default.default.useEffect(function() {
if (cacheRef.current.element !== element || !isSamePoint$1(cacheRef.current.point, point) || !isEqual$2(cacheRef.current.align, align)) {
_forceAlign();
}
});
React__default.default.useEffect(function() {
var cancelFn = monitorResize(nodeRef.current, _forceAlign);
return cancelFn;
}, [nodeRef.current]);
React__default.default.useEffect(function() {
var cancelFn = monitorResize(element, _forceAlign);
return cancelFn;
}, [element]);
React__default.default.useEffect(function() {
if (!disabled) {
_forceAlign();
} else {
cancelForceAlign();
}
}, [disabled]);
React__default.default.useEffect(function() {
if (monitorWindowResize) {
var cancelFn = addEventListenerWrap$2(window, "resize", _forceAlign);
return cancelFn.remove;
}
}, [monitorWindowResize]);
React__default.default.useEffect(function() {
return function() {
cancelForceAlign();
};
}, []);
React__default.default.useImperativeHandle(ref, function() {
return {
forceAlign: function forceAlign() {
return _forceAlign(true);
}
};
});
if (/* @__PURE__ */ React__default.default.isValidElement(childNode)) {
childNode = /* @__PURE__ */ React__default.default.cloneElement(childNode, {
ref: composeRef(childNode.ref, nodeRef)
});
}
return childNode;
};
var RcAlign = /* @__PURE__ */ React__default.default.forwardRef(Align$1);
RcAlign.displayName = "Align";
var StatusQueue = ["measure", "alignPre", "align", null, "motion"];
const useVisibleStatus = function(visible, doMeasure) {
var _useState = useSafeState(null), _useState2 = _slicedToArray$e(_useState, 2), status = _useState2[0], setInternalStatus = _useState2[1];
var rafRef = React$a.useRef();
function setStatus(nextStatus) {
setInternalStatus(nextStatus, true);
}
function cancelRaf() {
wrapperRaf$1.cancel(rafRef.current);
}
function goNextStatus(callback) {
cancelRaf();
rafRef.current = wrapperRaf$1(function() {
setStatus(function(prev) {
switch (status) {
case "align":
return "motion";
case "motion":
return "stable";
}
return prev;
});
callback === null || callback === void 0 ? void 0 : callback();
});
}
React$a.useEffect(function() {
setStatus("measure");
}, [visible]);
React$a.useEffect(function() {
switch (status) {
case "measure":
doMeasure();
break;
}
if (status) {
rafRef.current = wrapperRaf$1(/* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime$3().mark(function _callee() {
var index2, nextStatus;
return _regeneratorRuntime$3().wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
index2 = StatusQueue.indexOf(status);
nextStatus = StatusQueue[index2 + 1];
if (nextStatus && index2 !== -1) {
setStatus(nextStatus);
}
case 3:
case "end":
return _context.stop();
}
}
}, _callee);
})));
}
}, [status]);
React$a.useEffect(function() {
return function() {
cancelRaf();
};
}, []);
return [status, goNextStatus];
};
const useStretchStyle = function(stretch) {
var _React$useState = React__namespace.useState({
width: 0,
height: 0
}), _React$useState2 = _slicedToArray$e(_React$useState, 2), targetSize = _React$useState2[0], setTargetSize = _React$useState2[1];
function measureStretch(element) {
var tgtWidth = element.offsetWidth, tgtHeight = element.offsetHeight;
var _element$getBoundingC = element.getBoundingClientRect(), width = _element$getBoundingC.width, height = _element$getBoundingC.height;
if (Math.abs(tgtWidth - width) < 1 && Math.abs(tgtHeight - height) < 1) {
tgtWidth = width;
tgtHeight = height;
}
setTargetSize({
width: tgtWidth,
height: tgtHeight
});
}
var style2 = React__namespace.useMemo(function() {
var sizeStyle = {};
if (stretch) {
var width = targetSize.width, height = targetSize.height;
if (stretch.indexOf("height") !== -1 && height) {
sizeStyle.height = height;
} else if (stretch.indexOf("minHeight") !== -1 && height) {
sizeStyle.minHeight = height;
}
if (stretch.indexOf("width") !== -1 && width) {
sizeStyle.width = width;
} else if (stretch.indexOf("minWidth") !== -1 && width) {
sizeStyle.minWidth = width;
}
}
return sizeStyle;
}, [stretch, targetSize]);
return [style2, measureStretch];
};
var PopupInner$1 = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var visible = props.visible, prefixCls = props.prefixCls, className = props.className, style2 = props.style, children = props.children, zIndex = props.zIndex, stretch = props.stretch, destroyPopupOnHide = props.destroyPopupOnHide, forceRender = props.forceRender, align = props.align, point = props.point, getRootDomNode = props.getRootDomNode, getClassNameFromAlign = props.getClassNameFromAlign, onAlign = props.onAlign, onMouseEnter = props.onMouseEnter, onMouseLeave = props.onMouseLeave, onMouseDown = props.onMouseDown, onTouchStart = props.onTouchStart, onClick = props.onClick;
var alignRef = React$a.useRef();
var elementRef = React$a.useRef();
var _useState = React$a.useState(), _useState2 = _slicedToArray$e(_useState, 2), alignedClassName = _useState2[0], setAlignedClassName = _useState2[1];
var _useStretchStyle = useStretchStyle(stretch), _useStretchStyle2 = _slicedToArray$e(_useStretchStyle, 2), stretchStyle = _useStretchStyle2[0], measureStretchStyle = _useStretchStyle2[1];
function doMeasure() {
if (stretch) {
measureStretchStyle(getRootDomNode());
}
}
var _useVisibleStatus = useVisibleStatus(visible, doMeasure), _useVisibleStatus2 = _slicedToArray$e(_useVisibleStatus, 2), status = _useVisibleStatus2[0], goNextStatus = _useVisibleStatus2[1];
var _useState3 = React$a.useState(0), _useState4 = _slicedToArray$e(_useState3, 2), alignTimes = _useState4[0], setAlignTimes = _useState4[1];
var prepareResolveRef = React$a.useRef();
useLayoutEffect$1(function() {
if (status === "alignPre") {
setAlignTimes(0);
}
}, [status]);
function getAlignTarget() {
if (point) {
return point;
}
return getRootDomNode;
}
function forceAlign() {
var _alignRef$current;
(_alignRef$current = alignRef.current) === null || _alignRef$current === void 0 ? void 0 : _alignRef$current.forceAlign();
}
function onInternalAlign(popupDomNode, matchAlign) {
var nextAlignedClassName = getClassNameFromAlign(matchAlign);
if (alignedClassName !== nextAlignedClassName) {
setAlignedClassName(nextAlignedClassName);
}
setAlignTimes(function(val) {
return val + 1;
});
if (status === "align") {
onAlign === null || onAlign === void 0 ? void 0 : onAlign(popupDomNode, matchAlign);
}
}
useLayoutEffect$1(function() {
if (status === "align") {
if (alignTimes < 3) {
forceAlign();
} else {
goNextStatus(function() {
var _prepareResolveRef$cu;
(_prepareResolveRef$cu = prepareResolveRef.current) === null || _prepareResolveRef$cu === void 0 ? void 0 : _prepareResolveRef$cu.call(prepareResolveRef);
});
}
}
}, [alignTimes]);
var motion2 = _objectSpread2$a({}, getMotion$1(props));
["onAppearEnd", "onEnterEnd", "onLeaveEnd"].forEach(function(eventName) {
var originHandler = motion2[eventName];
motion2[eventName] = function(element, event) {
goNextStatus();
return originHandler === null || originHandler === void 0 ? void 0 : originHandler(element, event);
};
});
function onShowPrepare() {
return new Promise(function(resolve) {
prepareResolveRef.current = resolve;
});
}
React__namespace.useEffect(function() {
if (!motion2.motionName && status === "motion") {
goNextStatus();
}
}, [motion2.motionName, status]);
React__namespace.useImperativeHandle(ref, function() {
return {
forceAlign,
getElement: function getElement2() {
return elementRef.current;
}
};
});
var mergedStyle = _objectSpread2$a(_objectSpread2$a({}, stretchStyle), {}, {
zIndex,
opacity: status === "motion" || status === "stable" || !visible ? void 0 : 0,
pointerEvents: !visible && status !== "stable" ? "none" : void 0
}, style2);
var alignDisabled = true;
if (align !== null && align !== void 0 && align.points && (status === "align" || status === "stable")) {
alignDisabled = false;
}
var childNode = children;
if (React__namespace.Children.count(children) > 1) {
childNode = /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-content"),
children
});
}
return /* @__PURE__ */ jsx(CSSMotion, {
visible,
ref: elementRef,
leavedClassName: "".concat(prefixCls, "-hidden"),
...motion2,
onAppearPrepare: onShowPrepare,
onEnterPrepare: onShowPrepare,
removeOnLeave: destroyPopupOnHide,
forceRender,
children: function(_ref, motionRef) {
var motionClassName = _ref.className, motionStyle = _ref.style;
var mergedClassName = classnames(prefixCls, className, alignedClassName, motionClassName);
return /* @__PURE__ */ jsx(RcAlign, {
target: getAlignTarget(),
ref: alignRef,
monitorWindowResize: true,
disabled: alignDisabled,
align,
onAlign: onInternalAlign,
children: /* @__PURE__ */ jsx("div", {
ref: motionRef,
className: mergedClassName,
onMouseEnter,
onMouseLeave,
onMouseDownCapture: onMouseDown,
onTouchStartCapture: onTouchStart,
onClick,
style: _objectSpread2$a(_objectSpread2$a({}, motionStyle), mergedStyle),
children: childNode
})
}, "popup");
}
});
});
PopupInner$1.displayName = "PopupInner";
var MobilePopupInner = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var prefixCls = props.prefixCls, visible = props.visible, zIndex = props.zIndex, children = props.children, _props$mobile = props.mobile;
_props$mobile = _props$mobile === void 0 ? {} : _props$mobile;
var popupClassName = _props$mobile.popupClassName, popupStyle = _props$mobile.popupStyle, _props$mobile$popupMo = _props$mobile.popupMotion, popupMotion = _props$mobile$popupMo === void 0 ? {} : _props$mobile$popupMo, popupRender = _props$mobile.popupRender, onClick = props.onClick;
var elementRef = React__namespace.useRef();
React__namespace.useImperativeHandle(ref, function() {
return {
forceAlign: function forceAlign() {
},
getElement: function getElement2() {
return elementRef.current;
}
};
});
var mergedStyle = _objectSpread2$a({
zIndex
}, popupStyle);
var childNode = children;
if (React__namespace.Children.count(children) > 1) {
childNode = /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-content"),
children
});
}
if (popupRender) {
childNode = popupRender(childNode);
}
return /* @__PURE__ */ jsx(CSSMotion, {
visible,
ref: elementRef,
removeOnLeave: true,
...popupMotion,
children: function(_ref, motionRef) {
var motionClassName = _ref.className, motionStyle = _ref.style;
var mergedClassName = classnames(prefixCls, popupClassName, motionClassName);
return /* @__PURE__ */ jsx("div", {
ref: motionRef,
className: mergedClassName,
onClick,
style: _objectSpread2$a(_objectSpread2$a({}, motionStyle), mergedStyle),
children: childNode
});
}
});
});
MobilePopupInner.displayName = "MobilePopupInner";
var _excluded$G = ["visible", "mobile"];
var Popup$2 = /* @__PURE__ */ React__namespace.forwardRef(function(_ref, ref) {
var visible = _ref.visible, mobile = _ref.mobile, props = _objectWithoutProperties$1(_ref, _excluded$G);
var _useState = React$a.useState(visible), _useState2 = _slicedToArray$e(_useState, 2), innerVisible = _useState2[0], serInnerVisible = _useState2[1];
var _useState3 = React$a.useState(false), _useState4 = _slicedToArray$e(_useState3, 2), inMobile = _useState4[0], setInMobile = _useState4[1];
var cloneProps = _objectSpread2$a(_objectSpread2$a({}, props), {}, {
visible: innerVisible
});
React$a.useEffect(function() {
serInnerVisible(visible);
if (visible && mobile) {
setInMobile(isMobile$1());
}
}, [visible, mobile]);
var popupNode = inMobile ? /* @__PURE__ */ jsx(MobilePopupInner, {
...cloneProps,
mobile,
ref
}) : /* @__PURE__ */ jsx(PopupInner$1, {
...cloneProps,
ref
});
return /* @__PURE__ */ jsxs("div", {
children: [/* @__PURE__ */ jsx(Mask$1, {
...cloneProps
}), popupNode]
});
});
Popup$2.displayName = "Popup";
var TriggerContext = /* @__PURE__ */ React__namespace.createContext(null);
function noop$6() {
}
function returnEmptyString$1() {
return "";
}
function returnDocument$1(element) {
if (element) {
return element.ownerDocument;
}
return window.document;
}
var ALL_HANDLERS$1 = ["onClick", "onMouseDown", "onTouchStart", "onMouseEnter", "onMouseLeave", "onFocus", "onBlur", "onContextMenu"];
function generateTrigger(PortalComponent) {
var Trigger2 = /* @__PURE__ */ function(_React$Component) {
_inherits(Trigger3, _React$Component);
var _super = _createSuper(Trigger3);
function Trigger3(props) {
var _this2;
_classCallCheck(this, Trigger3);
_this2 = _super.call(this, props);
_defineProperty$b(_assertThisInitialized(_this2), "popupRef", /* @__PURE__ */ React__namespace.createRef());
_defineProperty$b(_assertThisInitialized(_this2), "triggerRef", /* @__PURE__ */ React__namespace.createRef());
_defineProperty$b(_assertThisInitialized(_this2), "portalContainer", void 0);
_defineProperty$b(_assertThisInitialized(_this2), "attachId", void 0);
_defineProperty$b(_assertThisInitialized(_this2), "clickOutsideHandler", void 0);
_defineProperty$b(_assertThisInitialized(_this2), "touchOutsideHandler", void 0);
_defineProperty$b(_assertThisInitialized(_this2), "contextMenuOutsideHandler1", void 0);
_defineProperty$b(_assertThisInitialized(_this2), "contextMenuOutsideHandler2", void 0);
_defineProperty$b(_assertThisInitialized(_this2), "mouseDownTimeout", void 0);
_defineProperty$b(_assertThisInitialized(_this2), "focusTime", void 0);
_defineProperty$b(_assertThisInitialized(_this2), "preClickTime", void 0);
_defineProperty$b(_assertThisInitialized(_this2), "preTouchTime", void 0);
_defineProperty$b(_assertThisInitialized(_this2), "delayTimer", void 0);
_defineProperty$b(_assertThisInitialized(_this2), "hasPopupMouseDown", void 0);
_defineProperty$b(_assertThisInitialized(_this2), "onMouseEnter", function(e2) {
var mouseEnterDelay = _this2.props.mouseEnterDelay;
_this2.fireEvents("onMouseEnter", e2);
_this2.delaySetPopupVisible(true, mouseEnterDelay, mouseEnterDelay ? null : e2);
});
_defineProperty$b(_assertThisInitialized(_this2), "onMouseMove", function(e2) {
_this2.fireEvents("onMouseMove", e2);
_this2.setPoint(e2);
});
_defineProperty$b(_assertThisInitialized(_this2), "onMouseLeave", function(e2) {
_this2.fireEvents("onMouseLeave", e2);
_this2.delaySetPopupVisible(false, _this2.props.mouseLeaveDelay);
});
_defineProperty$b(_assertThisInitialized(_this2), "onPopupMouseEnter", function() {
_this2.clearDelayTimer();
});
_defineProperty$b(_assertThisInitialized(_this2), "onPopupMouseLeave", function(e2) {
var _this$popupRef$curren;
if (e2.relatedTarget && !e2.relatedTarget.setTimeout && contains$2((_this$popupRef$curren = _this2.popupRef.current) === null || _this$popupRef$curren === void 0 ? void 0 : _this$popupRef$curren.getElement(), e2.relatedTarget)) {
return;
}
_this2.delaySetPopupVisible(false, _this2.props.mouseLeaveDelay);
});
_defineProperty$b(_assertThisInitialized(_this2), "onFocus", function(e2) {
_this2.fireEvents("onFocus", e2);
_this2.clearDelayTimer();
if (_this2.isFocusToShow()) {
_this2.focusTime = Date.now();
_this2.delaySetPopupVisible(true, _this2.props.focusDelay);
}
});
_defineProperty$b(_assertThisInitialized(_this2), "onMouseDown", function(e2) {
_this2.fireEvents("onMouseDown", e2);
_this2.preClickTime = Date.now();
});
_defineProperty$b(_assertThisInitialized(_this2), "onTouchStart", function(e2) {
_this2.fireEvents("onTouchStart", e2);
_this2.preTouchTime = Date.now();
});
_defineProperty$b(_assertThisInitialized(_this2), "onBlur", function(e2) {
_this2.fireEvents("onBlur", e2);
_this2.clearDelayTimer();
if (_this2.isBlurToHide()) {
_this2.delaySetPopupVisible(false, _this2.props.blurDelay);
}
});
_defineProperty$b(_assertThisInitialized(_this2), "onContextMenu", function(e2) {
e2.preventDefault();
_this2.fireEvents("onContextMenu", e2);
_this2.setPopupVisible(true, e2);
});
_defineProperty$b(_assertThisInitialized(_this2), "onContextMenuClose", function() {
if (_this2.isContextMenuToShow()) {
_this2.close();
}
});
_defineProperty$b(_assertThisInitialized(_this2), "onClick", function(event) {
_this2.fireEvents("onClick", event);
if (_this2.focusTime) {
var preTime;
if (_this2.preClickTime && _this2.preTouchTime) {
preTime = Math.min(_this2.preClickTime, _this2.preTouchTime);
} else if (_this2.preClickTime) {
preTime = _this2.preClickTime;
} else if (_this2.preTouchTime) {
preTime = _this2.preTouchTime;
}
if (Math.abs(preTime - _this2.focusTime) < 20) {
return;
}
_this2.focusTime = 0;
}
_this2.preClickTime = 0;
_this2.preTouchTime = 0;
if (_this2.isClickToShow() && (_this2.isClickToHide() || _this2.isBlurToHide()) && event && event.preventDefault) {
event.preventDefault();
}
var nextVisible = !_this2.state.popupVisible;
if (_this2.isClickToHide() && !nextVisible || nextVisible && _this2.isClickToShow()) {
_this2.setPopupVisible(!_this2.state.popupVisible, event);
}
});
_defineProperty$b(_assertThisInitialized(_this2), "onPopupMouseDown", function() {
_this2.hasPopupMouseDown = true;
clearTimeout(_this2.mouseDownTimeout);
_this2.mouseDownTimeout = window.setTimeout(function() {
_this2.hasPopupMouseDown = false;
}, 0);
if (_this2.context) {
var _this$context;
(_this$context = _this2.context).onPopupMouseDown.apply(_this$context, arguments);
}
});
_defineProperty$b(_assertThisInitialized(_this2), "onDocumentClick", function(event) {
if (_this2.props.mask && !_this2.props.maskClosable) {
return;
}
var target = event.target;
var root2 = _this2.getRootDomNode();
var popupNode = _this2.getPopupDomNode();
if ((!contains$2(root2, target) || _this2.isContextMenuOnly()) && !contains$2(popupNode, target) && !_this2.hasPopupMouseDown) {
_this2.close();
}
});
_defineProperty$b(_assertThisInitialized(_this2), "getRootDomNode", function() {
var getTriggerDOMNode = _this2.props.getTriggerDOMNode;
if (getTriggerDOMNode) {
return getTriggerDOMNode(_this2.triggerRef.current);
}
try {
var domNode = findDOMNode(_this2.triggerRef.current);
if (domNode) {
return domNode;
}
} catch (err) {
}
return ReactDOM__default.default.findDOMNode(_assertThisInitialized(_this2));
});
_defineProperty$b(_assertThisInitialized(_this2), "getPopupClassNameFromAlign", function(align) {
var className = [];
var _this$props = _this2.props, popupPlacement = _this$props.popupPlacement, builtinPlacements = _this$props.builtinPlacements, prefixCls = _this$props.prefixCls, alignPoint2 = _this$props.alignPoint, getPopupClassNameFromAlign2 = _this$props.getPopupClassNameFromAlign;
if (popupPlacement && builtinPlacements) {
className.push(getAlignPopupClassName(builtinPlacements, prefixCls, align, alignPoint2));
}
if (getPopupClassNameFromAlign2) {
className.push(getPopupClassNameFromAlign2(align));
}
return className.join(" ");
});
_defineProperty$b(_assertThisInitialized(_this2), "getComponent", function() {
var _this$props2 = _this2.props, prefixCls = _this$props2.prefixCls, destroyPopupOnHide = _this$props2.destroyPopupOnHide, popupClassName = _this$props2.popupClassName, onPopupAlign = _this$props2.onPopupAlign, popupMotion = _this$props2.popupMotion, popupAnimation = _this$props2.popupAnimation, popupTransitionName = _this$props2.popupTransitionName, popupStyle = _this$props2.popupStyle, mask = _this$props2.mask, maskAnimation = _this$props2.maskAnimation, maskTransitionName = _this$props2.maskTransitionName, maskMotion = _this$props2.maskMotion, zIndex = _this$props2.zIndex, popup = _this$props2.popup, stretch = _this$props2.stretch, alignPoint2 = _this$props2.alignPoint, mobile = _this$props2.mobile, forceRender = _this$props2.forceRender, onPopupClick = _this$props2.onPopupClick;
var _this$state = _this2.state, popupVisible = _this$state.popupVisible, point = _this$state.point;
var align = _this2.getPopupAlign();
var mouseProps = {};
if (_this2.isMouseEnterToShow()) {
mouseProps.onMouseEnter = _this2.onPopupMouseEnter;
}
if (_this2.isMouseLeaveToHide()) {
mouseProps.onMouseLeave = _this2.onPopupMouseLeave;
}
mouseProps.onMouseDown = _this2.onPopupMouseDown;
mouseProps.onTouchStart = _this2.onPopupMouseDown;
return /* @__PURE__ */ jsx(Popup$2, {
prefixCls,
destroyPopupOnHide,
visible: popupVisible,
point: alignPoint2 && point,
className: popupClassName,
align,
onAlign: onPopupAlign,
animation: popupAnimation,
getClassNameFromAlign: _this2.getPopupClassNameFromAlign,
...mouseProps,
stretch,
getRootDomNode: _this2.getRootDomNode,
style: popupStyle,
mask,
zIndex,
transitionName: popupTransitionName,
maskAnimation,
maskTransitionName,
maskMotion,
ref: _this2.popupRef,
motion: popupMotion,
mobile,
forceRender,
onClick: onPopupClick,
children: typeof popup === "function" ? popup() : popup
});
});
_defineProperty$b(_assertThisInitialized(_this2), "attachParent", function(popupContainer) {
wrapperRaf$1.cancel(_this2.attachId);
var _this$props3 = _this2.props, getPopupContainer = _this$props3.getPopupContainer, getDocument2 = _this$props3.getDocument;
var domNode = _this2.getRootDomNode();
var mountNode;
if (!getPopupContainer) {
mountNode = getDocument2(_this2.getRootDomNode()).body;
} else if (domNode || getPopupContainer.length === 0) {
mountNode = getPopupContainer(domNode);
}
if (mountNode) {
mountNode.appendChild(popupContainer);
} else {
_this2.attachId = wrapperRaf$1(function() {
_this2.attachParent(popupContainer);
});
}
});
_defineProperty$b(_assertThisInitialized(_this2), "getContainer", function() {
if (!_this2.portalContainer) {
var getDocument2 = _this2.props.getDocument;
var popupContainer = getDocument2(_this2.getRootDomNode()).createElement("div");
popupContainer.style.position = "absolute";
popupContainer.style.top = "0";
popupContainer.style.left = "0";
popupContainer.style.width = "100%";
_this2.portalContainer = popupContainer;
}
_this2.attachParent(_this2.portalContainer);
return _this2.portalContainer;
});
_defineProperty$b(_assertThisInitialized(_this2), "setPoint", function(point) {
var alignPoint2 = _this2.props.alignPoint;
if (!alignPoint2 || !point)
return;
_this2.setState({
point: {
pageX: point.pageX,
pageY: point.pageY
}
});
});
_defineProperty$b(_assertThisInitialized(_this2), "handlePortalUpdate", function() {
if (_this2.state.prevPopupVisible !== _this2.state.popupVisible) {
_this2.props.afterPopupVisibleChange(_this2.state.popupVisible);
}
});
_defineProperty$b(_assertThisInitialized(_this2), "triggerContextValue", {
onPopupMouseDown: _this2.onPopupMouseDown
});
var _popupVisible;
if ("popupVisible" in props) {
_popupVisible = !!props.popupVisible;
} else {
_popupVisible = !!props.defaultPopupVisible;
}
_this2.state = {
prevPopupVisible: _popupVisible,
popupVisible: _popupVisible
};
ALL_HANDLERS$1.forEach(function(h2) {
_this2["fire".concat(h2)] = function(e2) {
_this2.fireEvents(h2, e2);
};
});
return _this2;
}
_createClass(Trigger3, [{
key: "componentDidMount",
value: function componentDidMount() {
this.componentDidUpdate();
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate() {
var props = this.props;
var state = this.state;
if (state.popupVisible) {
var currentDocument;
if (!this.clickOutsideHandler && (this.isClickToHide() || this.isContextMenuToShow())) {
currentDocument = props.getDocument(this.getRootDomNode());
this.clickOutsideHandler = addEventListenerWrap$2(currentDocument, "mousedown", this.onDocumentClick);
}
if (!this.touchOutsideHandler) {
currentDocument = currentDocument || props.getDocument(this.getRootDomNode());
this.touchOutsideHandler = addEventListenerWrap$2(currentDocument, "touchstart", this.onDocumentClick);
}
if (!this.contextMenuOutsideHandler1 && this.isContextMenuToShow()) {
currentDocument = currentDocument || props.getDocument(this.getRootDomNode());
this.contextMenuOutsideHandler1 = addEventListenerWrap$2(currentDocument, "scroll", this.onContextMenuClose);
}
if (!this.contextMenuOutsideHandler2 && this.isContextMenuToShow()) {
this.contextMenuOutsideHandler2 = addEventListenerWrap$2(window, "blur", this.onContextMenuClose);
}
return;
}
this.clearOutsideHandler();
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
this.clearDelayTimer();
this.clearOutsideHandler();
clearTimeout(this.mouseDownTimeout);
wrapperRaf$1.cancel(this.attachId);
}
}, {
key: "getPopupDomNode",
value: function getPopupDomNode() {
var _this$popupRef$curren2;
return ((_this$popupRef$curren2 = this.popupRef.current) === null || _this$popupRef$curren2 === void 0 ? void 0 : _this$popupRef$curren2.getElement()) || null;
}
}, {
key: "getPopupAlign",
value: function getPopupAlign() {
var props = this.props;
var popupPlacement = props.popupPlacement, popupAlign = props.popupAlign, builtinPlacements = props.builtinPlacements;
if (popupPlacement && builtinPlacements) {
return getAlignFromPlacement$1(builtinPlacements, popupPlacement, popupAlign);
}
return popupAlign;
}
}, {
key: "setPopupVisible",
value: function setPopupVisible(popupVisible, event) {
var alignPoint2 = this.props.alignPoint;
var prevPopupVisible = this.state.popupVisible;
this.clearDelayTimer();
if (prevPopupVisible !== popupVisible) {
if (!("popupVisible" in this.props)) {
this.setState({
popupVisible,
prevPopupVisible
});
}
this.props.onPopupVisibleChange(popupVisible);
}
if (alignPoint2 && event && popupVisible) {
this.setPoint(event);
}
}
}, {
key: "delaySetPopupVisible",
value: function delaySetPopupVisible(visible, delayS, event) {
var _this2 = this;
var delay = delayS * 1e3;
this.clearDelayTimer();
if (delay) {
var point = event ? {
pageX: event.pageX,
pageY: event.pageY
} : null;
this.delayTimer = window.setTimeout(function() {
_this2.setPopupVisible(visible, point);
_this2.clearDelayTimer();
}, delay);
} else {
this.setPopupVisible(visible, event);
}
}
}, {
key: "clearDelayTimer",
value: function clearDelayTimer() {
if (this.delayTimer) {
clearTimeout(this.delayTimer);
this.delayTimer = null;
}
}
}, {
key: "clearOutsideHandler",
value: function clearOutsideHandler() {
if (this.clickOutsideHandler) {
this.clickOutsideHandler.remove();
this.clickOutsideHandler = null;
}
if (this.contextMenuOutsideHandler1) {
this.contextMenuOutsideHandler1.remove();
this.contextMenuOutsideHandler1 = null;
}
if (this.contextMenuOutsideHandler2) {
this.contextMenuOutsideHandler2.remove();
this.contextMenuOutsideHandler2 = null;
}
if (this.touchOutsideHandler) {
this.touchOutsideHandler.remove();
this.touchOutsideHandler = null;
}
}
}, {
key: "createTwoChains",
value: function createTwoChains(event) {
var childPros = this.props.children.props;
var props = this.props;
if (childPros[event] && props[event]) {
return this["fire".concat(event)];
}
return childPros[event] || props[event];
}
}, {
key: "isClickToShow",
value: function isClickToShow() {
var _this$props4 = this.props, action = _this$props4.action, showAction = _this$props4.showAction;
return action.indexOf("click") !== -1 || showAction.indexOf("click") !== -1;
}
}, {
key: "isContextMenuOnly",
value: function isContextMenuOnly() {
var action = this.props.action;
return action === "contextMenu" || action.length === 1 && action[0] === "contextMenu";
}
}, {
key: "isContextMenuToShow",
value: function isContextMenuToShow() {
var _this$props5 = this.props, action = _this$props5.action, showAction = _this$props5.showAction;
return action.indexOf("contextMenu") !== -1 || showAction.indexOf("contextMenu") !== -1;
}
}, {
key: "isClickToHide",
value: function isClickToHide() {
var _this$props6 = this.props, action = _this$props6.action, hideAction = _this$props6.hideAction;
return action.indexOf("click") !== -1 || hideAction.indexOf("click") !== -1;
}
}, {
key: "isMouseEnterToShow",
value: function isMouseEnterToShow() {
var _this$props7 = this.props, action = _this$props7.action, showAction = _this$props7.showAction;
return action.indexOf("hover") !== -1 || showAction.indexOf("mouseEnter") !== -1;
}
}, {
key: "isMouseLeaveToHide",
value: function isMouseLeaveToHide() {
var _this$props8 = this.props, action = _this$props8.action, hideAction = _this$props8.hideAction;
return action.indexOf("hover") !== -1 || hideAction.indexOf("mouseLeave") !== -1;
}
}, {
key: "isFocusToShow",
value: function isFocusToShow() {
var _this$props9 = this.props, action = _this$props9.action, showAction = _this$props9.showAction;
return action.indexOf("focus") !== -1 || showAction.indexOf("focus") !== -1;
}
}, {
key: "isBlurToHide",
value: function isBlurToHide() {
var _this$props10 = this.props, action = _this$props10.action, hideAction = _this$props10.hideAction;
return action.indexOf("focus") !== -1 || hideAction.indexOf("blur") !== -1;
}
}, {
key: "forcePopupAlign",
value: function forcePopupAlign() {
if (this.state.popupVisible) {
var _this$popupRef$curren3;
(_this$popupRef$curren3 = this.popupRef.current) === null || _this$popupRef$curren3 === void 0 ? void 0 : _this$popupRef$curren3.forceAlign();
}
}
}, {
key: "fireEvents",
value: function fireEvents(type2, e2) {
var childCallback = this.props.children.props[type2];
if (childCallback) {
childCallback(e2);
}
var callback = this.props[type2];
if (callback) {
callback(e2);
}
}
}, {
key: "close",
value: function close() {
this.setPopupVisible(false);
}
}, {
key: "render",
value: function render2() {
var popupVisible = this.state.popupVisible;
var _this$props11 = this.props, children = _this$props11.children, forceRender = _this$props11.forceRender, alignPoint2 = _this$props11.alignPoint, className = _this$props11.className, autoDestroy = _this$props11.autoDestroy;
var child = React__namespace.Children.only(children);
var newChildProps = {
key: "trigger"
};
if (this.isContextMenuToShow()) {
newChildProps.onContextMenu = this.onContextMenu;
} else {
newChildProps.onContextMenu = this.createTwoChains("onContextMenu");
}
if (this.isClickToHide() || this.isClickToShow()) {
newChildProps.onClick = this.onClick;
newChildProps.onMouseDown = this.onMouseDown;
newChildProps.onTouchStart = this.onTouchStart;
} else {
newChildProps.onClick = this.createTwoChains("onClick");
newChildProps.onMouseDown = this.createTwoChains("onMouseDown");
newChildProps.onTouchStart = this.createTwoChains("onTouchStart");
}
if (this.isMouseEnterToShow()) {
newChildProps.onMouseEnter = this.onMouseEnter;
if (alignPoint2) {
newChildProps.onMouseMove = this.onMouseMove;
}
} else {
newChildProps.onMouseEnter = this.createTwoChains("onMouseEnter");
}
if (this.isMouseLeaveToHide()) {
newChildProps.onMouseLeave = this.onMouseLeave;
} else {
newChildProps.onMouseLeave = this.createTwoChains("onMouseLeave");
}
if (this.isFocusToShow() || this.isBlurToHide()) {
newChildProps.onFocus = this.onFocus;
newChildProps.onBlur = this.onBlur;
} else {
newChildProps.onFocus = this.createTwoChains("onFocus");
newChildProps.onBlur = this.createTwoChains("onBlur");
}
var childrenClassName = classnames(child && child.props && child.props.className, className);
if (childrenClassName) {
newChildProps.className = childrenClassName;
}
var cloneProps = _objectSpread2$a({}, newChildProps);
if (supportRef(child)) {
cloneProps.ref = composeRef(this.triggerRef, child.ref);
}
var trigger = /* @__PURE__ */ React__namespace.cloneElement(child, cloneProps);
var portal;
if (popupVisible || this.popupRef.current || forceRender) {
portal = /* @__PURE__ */ jsx(PortalComponent, {
getContainer: this.getContainer,
didUpdate: this.handlePortalUpdate,
children: this.getComponent()
}, "portal");
}
if (!popupVisible && autoDestroy) {
portal = null;
}
return /* @__PURE__ */ jsxs(TriggerContext.Provider, {
value: this.triggerContextValue,
children: [trigger, portal]
});
}
}], [{
key: "getDerivedStateFromProps",
value: function getDerivedStateFromProps(_ref, prevState) {
var popupVisible = _ref.popupVisible;
var newState = {};
if (popupVisible !== void 0 && prevState.popupVisible !== popupVisible) {
newState.popupVisible = popupVisible;
newState.prevPopupVisible = prevState.popupVisible;
}
return newState;
}
}]);
return Trigger3;
}(React__namespace.Component);
_defineProperty$b(Trigger2, "contextType", TriggerContext);
_defineProperty$b(Trigger2, "defaultProps", {
prefixCls: "rc-trigger-popup",
getPopupClassNameFromAlign: returnEmptyString$1,
getDocument: returnDocument$1,
onPopupVisibleChange: noop$6,
afterPopupVisibleChange: noop$6,
onPopupAlign: noop$6,
popupClassName: "",
mouseEnterDelay: 0,
mouseLeaveDelay: 0.1,
focusDelay: 0,
blurDelay: 0.15,
popupStyle: {},
destroyPopupOnHide: false,
popupAlign: {},
defaultPopupVisible: false,
mask: false,
maskClosable: true,
action: [],
showAction: [],
hideAction: [],
autoDestroy: false
});
return Trigger2;
}
const Trigger$1 = generateTrigger(Portal$1);
var _excluded$F = ["prefixCls", "disabled", "visible", "children", "popupElement", "containerWidth", "animation", "transitionName", "dropdownStyle", "dropdownClassName", "direction", "placement", "dropdownMatchSelectWidth", "dropdownRender", "dropdownAlign", "getPopupContainer", "empty", "getTriggerDOMNode", "onPopupVisibleChange", "onPopupMouseEnter"];
var getBuiltInPlacements = function getBuiltInPlacements2(dropdownMatchSelectWidth) {
var adjustX = dropdownMatchSelectWidth === true ? 0 : 1;
return {
bottomLeft: {
points: ["tl", "bl"],
offset: [0, 4],
overflow: {
adjustX,
adjustY: 1
}
},
bottomRight: {
points: ["tr", "br"],
offset: [0, 4],
overflow: {
adjustX,
adjustY: 1
}
},
topLeft: {
points: ["bl", "tl"],
offset: [0, -4],
overflow: {
adjustX,
adjustY: 1
}
},
topRight: {
points: ["br", "tr"],
offset: [0, -4],
overflow: {
adjustX,
adjustY: 1
}
}
};
};
var SelectTrigger = function SelectTrigger2(props, ref) {
var prefixCls = props.prefixCls;
props.disabled;
var visible = props.visible, children = props.children, popupElement = props.popupElement, containerWidth = props.containerWidth, animation = props.animation, transitionName2 = props.transitionName, dropdownStyle = props.dropdownStyle, dropdownClassName = props.dropdownClassName, _props$direction = props.direction, direction = _props$direction === void 0 ? "ltr" : _props$direction, placement = props.placement, dropdownMatchSelectWidth = props.dropdownMatchSelectWidth, dropdownRender = props.dropdownRender, dropdownAlign = props.dropdownAlign, getPopupContainer = props.getPopupContainer, empty2 = props.empty, getTriggerDOMNode = props.getTriggerDOMNode, onPopupVisibleChange = props.onPopupVisibleChange, onPopupMouseEnter = props.onPopupMouseEnter, restProps = _objectWithoutProperties$1(props, _excluded$F);
var dropdownPrefixCls = "".concat(prefixCls, "-dropdown");
var popupNode = popupElement;
if (dropdownRender) {
popupNode = dropdownRender(popupElement);
}
var builtInPlacements = React__namespace.useMemo(function() {
return getBuiltInPlacements(dropdownMatchSelectWidth);
}, [dropdownMatchSelectWidth]);
var mergedTransitionName = animation ? "".concat(dropdownPrefixCls, "-").concat(animation) : transitionName2;
var popupRef = React__namespace.useRef(null);
React__namespace.useImperativeHandle(ref, function() {
return {
getPopupElement: function getPopupElement() {
return popupRef.current;
}
};
});
var popupStyle = _objectSpread2$a({
minWidth: containerWidth
}, dropdownStyle);
if (typeof dropdownMatchSelectWidth === "number") {
popupStyle.width = dropdownMatchSelectWidth;
} else if (dropdownMatchSelectWidth) {
popupStyle.width = containerWidth;
}
return /* @__PURE__ */ jsx(Trigger$1, {
...restProps,
showAction: onPopupVisibleChange ? ["click"] : [],
hideAction: onPopupVisibleChange ? ["click"] : [],
popupPlacement: placement || (direction === "rtl" ? "bottomRight" : "bottomLeft"),
builtinPlacements: builtInPlacements,
prefixCls: dropdownPrefixCls,
popupTransitionName: mergedTransitionName,
popup: /* @__PURE__ */ jsx("div", {
ref: popupRef,
onMouseEnter: onPopupMouseEnter,
children: popupNode
}),
popupAlign: dropdownAlign,
popupVisible: visible,
getPopupContainer,
popupClassName: classnames(dropdownClassName, _defineProperty$b({}, "".concat(dropdownPrefixCls, "-empty"), empty2)),
popupStyle,
getTriggerDOMNode,
onPopupVisibleChange,
children
});
};
var RefSelectTrigger = /* @__PURE__ */ React__namespace.forwardRef(SelectTrigger);
RefSelectTrigger.displayName = "SelectTrigger";
function getKey$1(data, index2) {
var key2 = data.key;
var value;
if ("value" in data) {
value = data.value;
}
if (key2 !== null && key2 !== void 0) {
return key2;
}
if (value !== void 0) {
return value;
}
return "rc-index-key-".concat(index2);
}
function fillFieldNames$2(fieldNames, childrenAsData) {
var _ref = fieldNames || {}, label = _ref.label, value = _ref.value, options = _ref.options;
return {
label: label || (childrenAsData ? "children" : "label"),
value: value || "value",
options: options || "options"
};
}
function flattenOptions(options) {
var _ref2 = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, fieldNames = _ref2.fieldNames, childrenAsData = _ref2.childrenAsData;
var flattenList = [];
var _fillFieldNames = fillFieldNames$2(fieldNames, false), fieldLabel = _fillFieldNames.label, fieldValue = _fillFieldNames.value, fieldOptions = _fillFieldNames.options;
function dig(list, isGroupOption) {
list.forEach(function(data) {
var label = data[fieldLabel];
if (isGroupOption || !(fieldOptions in data)) {
var value = data[fieldValue];
flattenList.push({
key: getKey$1(data, flattenList.length),
groupOption: isGroupOption,
data,
label,
value
});
} else {
var grpLabel = label;
if (grpLabel === void 0 && childrenAsData) {
grpLabel = data.label;
}
flattenList.push({
key: getKey$1(data, flattenList.length),
group: true,
data,
label: grpLabel
});
dig(data[fieldOptions], true);
}
});
}
dig(options, false);
return flattenList;
}
function injectPropsWithOption(option) {
var newOption = _objectSpread2$a({}, option);
if (!("props" in newOption)) {
Object.defineProperty(newOption, "props", {
get: function get2() {
warningOnce(false, "Return type is option instead of Option instance. Please read value directly instead of reading from `props`.");
return newOption;
}
});
}
return newOption;
}
function getSeparatedContent(text, tokens) {
if (!tokens || !tokens.length) {
return null;
}
var match2 = false;
function separate(str, _ref3) {
var _ref4 = _toArray$1(_ref3), token = _ref4[0], restTokens = _ref4.slice(1);
if (!token) {
return [str];
}
var list2 = str.split(token);
match2 = match2 || list2.length > 1;
return list2.reduce(function(prevList, unitStr) {
return [].concat(_toConsumableArray$c(prevList), _toConsumableArray$c(separate(unitStr, restTokens)));
}, []).filter(function(unit) {
return unit;
});
}
var list = separate(text, tokens);
return match2 ? list : null;
}
var _excluded$E = ["id", "prefixCls", "className", "showSearch", "tagRender", "direction", "omitDomProps", "displayValues", "onDisplayValuesChange", "emptyOptions", "notFoundContent", "onClear", "mode", "disabled", "loading", "getInputElement", "getRawInputElement", "open", "defaultOpen", "onDropdownVisibleChange", "activeValue", "onActiveValueChange", "activeDescendantId", "searchValue", "autoClearSearchValue", "onSearch", "onSearchSplit", "tokenSeparators", "allowClear", "showArrow", "inputIcon", "clearIcon", "OptionList", "animation", "transitionName", "dropdownStyle", "dropdownClassName", "dropdownMatchSelectWidth", "dropdownRender", "dropdownAlign", "placement", "getPopupContainer", "showAction", "onFocus", "onBlur", "onKeyUp", "onKeyDown", "onMouseDown"];
var DEFAULT_OMIT_PROPS = ["value", "onChange", "removeIcon", "placeholder", "autoFocus", "maxTagCount", "maxTagTextLength", "maxTagPlaceholder", "choiceTransitionName", "onInputKeyDown", "onPopupScroll", "tabIndex"];
function isMultiple(mode) {
return mode === "tags" || mode === "multiple";
}
var BaseSelect = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _customizeRawInputEle, _classNames2;
var id2 = props.id, prefixCls = props.prefixCls, className = props.className, showSearch = props.showSearch, tagRender = props.tagRender, direction = props.direction, omitDomProps = props.omitDomProps, displayValues = props.displayValues, onDisplayValuesChange = props.onDisplayValuesChange, emptyOptions = props.emptyOptions, _props$notFoundConten = props.notFoundContent, notFoundContent = _props$notFoundConten === void 0 ? "Not Found" : _props$notFoundConten, onClear = props.onClear, mode = props.mode, disabled = props.disabled, loading = props.loading, getInputElement = props.getInputElement, getRawInputElement = props.getRawInputElement, open = props.open, defaultOpen = props.defaultOpen, onDropdownVisibleChange = props.onDropdownVisibleChange, activeValue = props.activeValue, onActiveValueChange = props.onActiveValueChange, activeDescendantId = props.activeDescendantId, searchValue = props.searchValue, autoClearSearchValue = props.autoClearSearchValue, onSearch = props.onSearch, onSearchSplit = props.onSearchSplit, tokenSeparators = props.tokenSeparators, allowClear = props.allowClear, showArrow = props.showArrow, inputIcon = props.inputIcon, clearIcon = props.clearIcon, OptionList2 = props.OptionList, animation = props.animation, transitionName2 = props.transitionName, dropdownStyle = props.dropdownStyle, dropdownClassName = props.dropdownClassName, dropdownMatchSelectWidth = props.dropdownMatchSelectWidth, dropdownRender = props.dropdownRender, dropdownAlign = props.dropdownAlign, placement = props.placement, getPopupContainer = props.getPopupContainer, _props$showAction = props.showAction, showAction = _props$showAction === void 0 ? [] : _props$showAction, onFocus = props.onFocus, onBlur = props.onBlur, onKeyUp = props.onKeyUp, onKeyDown2 = props.onKeyDown, onMouseDown = props.onMouseDown, restProps = _objectWithoutProperties$1(props, _excluded$E);
var multiple = isMultiple(mode);
var mergedShowSearch = (showSearch !== void 0 ? showSearch : multiple) || mode === "combobox";
var domProps = _objectSpread2$a({}, restProps);
DEFAULT_OMIT_PROPS.forEach(function(propName) {
delete domProps[propName];
});
omitDomProps === null || omitDomProps === void 0 ? void 0 : omitDomProps.forEach(function(propName) {
delete domProps[propName];
});
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), mobile = _React$useState2[0], setMobile = _React$useState2[1];
React__namespace.useEffect(function() {
setMobile(isMobile$1());
}, []);
var containerRef = React__namespace.useRef(null);
var selectorDomRef = React__namespace.useRef(null);
var triggerRef = React__namespace.useRef(null);
var selectorRef = React__namespace.useRef(null);
var listRef = React__namespace.useRef(null);
var _useDelayReset = useDelayReset(), _useDelayReset2 = _slicedToArray$e(_useDelayReset, 3), mockFocused = _useDelayReset2[0], setMockFocused = _useDelayReset2[1], cancelSetMockFocused = _useDelayReset2[2];
React__namespace.useImperativeHandle(ref, function() {
var _selectorRef$current, _selectorRef$current2;
return {
focus: (_selectorRef$current = selectorRef.current) === null || _selectorRef$current === void 0 ? void 0 : _selectorRef$current.focus,
blur: (_selectorRef$current2 = selectorRef.current) === null || _selectorRef$current2 === void 0 ? void 0 : _selectorRef$current2.blur,
scrollTo: function scrollTo2(arg) {
var _listRef$current;
return (_listRef$current = listRef.current) === null || _listRef$current === void 0 ? void 0 : _listRef$current.scrollTo(arg);
}
};
});
var mergedSearchValue = React__namespace.useMemo(function() {
var _displayValues$;
if (mode !== "combobox") {
return searchValue;
}
var val = (_displayValues$ = displayValues[0]) === null || _displayValues$ === void 0 ? void 0 : _displayValues$.value;
return typeof val === "string" || typeof val === "number" ? String(val) : "";
}, [searchValue, mode, displayValues]);
var customizeInputElement = mode === "combobox" && typeof getInputElement === "function" && getInputElement() || null;
var customizeRawInputElement = typeof getRawInputElement === "function" && getRawInputElement();
var customizeRawInputRef = useComposeRef(selectorDomRef, customizeRawInputElement === null || customizeRawInputElement === void 0 ? void 0 : (_customizeRawInputEle = customizeRawInputElement.props) === null || _customizeRawInputEle === void 0 ? void 0 : _customizeRawInputEle.ref);
var _useMergedState = useMergedState(void 0, {
defaultValue: defaultOpen,
value: open
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), innerOpen = _useMergedState2[0], setInnerOpen = _useMergedState2[1];
var mergedOpen = innerOpen;
var emptyListContent = !notFoundContent && emptyOptions;
if (disabled || emptyListContent && mergedOpen && mode === "combobox") {
mergedOpen = false;
}
var triggerOpen = emptyListContent ? false : mergedOpen;
var onToggleOpen = React__namespace.useCallback(function(newOpen) {
var nextOpen = newOpen !== void 0 ? newOpen : !mergedOpen;
if (!disabled) {
setInnerOpen(nextOpen);
if (mergedOpen !== nextOpen) {
onDropdownVisibleChange === null || onDropdownVisibleChange === void 0 ? void 0 : onDropdownVisibleChange(nextOpen);
}
}
}, [disabled, mergedOpen, setInnerOpen, onDropdownVisibleChange]);
var tokenWithEnter = React__namespace.useMemo(function() {
return (tokenSeparators || []).some(function(tokenSeparator) {
return ["\n", "\r\n"].includes(tokenSeparator);
});
}, [tokenSeparators]);
var onInternalSearch = function onInternalSearch2(searchText, fromTyping, isCompositing) {
var ret = true;
var newSearchText = searchText;
onActiveValueChange === null || onActiveValueChange === void 0 ? void 0 : onActiveValueChange(null);
var patchLabels = isCompositing ? null : getSeparatedContent(searchText, tokenSeparators);
if (mode !== "combobox" && patchLabels) {
newSearchText = "";
onSearchSplit === null || onSearchSplit === void 0 ? void 0 : onSearchSplit(patchLabels);
onToggleOpen(false);
ret = false;
}
if (onSearch && mergedSearchValue !== newSearchText) {
onSearch(newSearchText, {
source: fromTyping ? "typing" : "effect"
});
}
return ret;
};
var onInternalSearchSubmit = function onInternalSearchSubmit2(searchText) {
if (!searchText || !searchText.trim()) {
return;
}
onSearch(searchText, {
source: "submit"
});
};
React__namespace.useEffect(function() {
if (!mergedOpen && !multiple && mode !== "combobox") {
onInternalSearch("", false, false);
}
}, [mergedOpen]);
React__namespace.useEffect(function() {
if (innerOpen && disabled) {
setInnerOpen(false);
}
if (disabled) {
setMockFocused(false);
}
}, [disabled]);
var _useLock = useLock(), _useLock2 = _slicedToArray$e(_useLock, 2), getClearLock = _useLock2[0], setClearLock = _useLock2[1];
var onInternalKeyDown = function onInternalKeyDown2(event) {
var clearLock = getClearLock();
var which = event.which;
if (which === KeyCode.ENTER) {
if (mode !== "combobox") {
event.preventDefault();
}
if (!mergedOpen) {
onToggleOpen(true);
}
}
setClearLock(!!mergedSearchValue);
if (which === KeyCode.BACKSPACE && !clearLock && multiple && !mergedSearchValue && displayValues.length) {
var cloneDisplayValues = _toConsumableArray$c(displayValues);
var removedDisplayValue = null;
for (var i2 = cloneDisplayValues.length - 1; i2 >= 0; i2 -= 1) {
var current = cloneDisplayValues[i2];
if (!current.disabled) {
cloneDisplayValues.splice(i2, 1);
removedDisplayValue = current;
break;
}
}
if (removedDisplayValue) {
onDisplayValuesChange(cloneDisplayValues, {
type: "remove",
values: [removedDisplayValue]
});
}
}
for (var _len = arguments.length, rest = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
rest[_key - 1] = arguments[_key];
}
if (mergedOpen && listRef.current) {
var _listRef$current2;
(_listRef$current2 = listRef.current).onKeyDown.apply(_listRef$current2, [event].concat(rest));
}
onKeyDown2 === null || onKeyDown2 === void 0 ? void 0 : onKeyDown2.apply(void 0, [event].concat(rest));
};
var onInternalKeyUp = function onInternalKeyUp2(event) {
for (var _len2 = arguments.length, rest = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
rest[_key2 - 1] = arguments[_key2];
}
if (mergedOpen && listRef.current) {
var _listRef$current3;
(_listRef$current3 = listRef.current).onKeyUp.apply(_listRef$current3, [event].concat(rest));
}
onKeyUp === null || onKeyUp === void 0 ? void 0 : onKeyUp.apply(void 0, [event].concat(rest));
};
var onSelectorRemove = function onSelectorRemove2(val) {
var newValues = displayValues.filter(function(i2) {
return i2 !== val;
});
onDisplayValuesChange(newValues, {
type: "remove",
values: [val]
});
};
var focusRef = React__namespace.useRef(false);
var onContainerFocus = function onContainerFocus2() {
setMockFocused(true);
if (!disabled) {
if (onFocus && !focusRef.current) {
onFocus.apply(void 0, arguments);
}
if (showAction.includes("focus")) {
onToggleOpen(true);
}
}
focusRef.current = true;
};
var onContainerBlur = function onContainerBlur2() {
setMockFocused(false, function() {
focusRef.current = false;
onToggleOpen(false);
});
if (disabled) {
return;
}
if (mergedSearchValue) {
if (mode === "tags") {
onSearch(mergedSearchValue, {
source: "submit"
});
} else if (mode === "multiple") {
onSearch("", {
source: "blur"
});
}
}
if (onBlur) {
onBlur.apply(void 0, arguments);
}
};
var activeTimeoutIds = [];
React__namespace.useEffect(function() {
return function() {
activeTimeoutIds.forEach(function(timeoutId) {
return clearTimeout(timeoutId);
});
activeTimeoutIds.splice(0, activeTimeoutIds.length);
};
}, []);
var onInternalMouseDown = function onInternalMouseDown2(event) {
var _triggerRef$current;
var target = event.target;
var popupElement = (_triggerRef$current = triggerRef.current) === null || _triggerRef$current === void 0 ? void 0 : _triggerRef$current.getPopupElement();
if (popupElement && popupElement.contains(target)) {
var timeoutId = setTimeout(function() {
var index2 = activeTimeoutIds.indexOf(timeoutId);
if (index2 !== -1) {
activeTimeoutIds.splice(index2, 1);
}
cancelSetMockFocused();
if (!mobile && !popupElement.contains(document.activeElement)) {
var _selectorRef$current3;
(_selectorRef$current3 = selectorRef.current) === null || _selectorRef$current3 === void 0 ? void 0 : _selectorRef$current3.focus();
}
});
activeTimeoutIds.push(timeoutId);
}
for (var _len3 = arguments.length, restArgs = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
restArgs[_key3 - 1] = arguments[_key3];
}
onMouseDown === null || onMouseDown === void 0 ? void 0 : onMouseDown.apply(void 0, [event].concat(restArgs));
};
var _React$useState3 = React__namespace.useState(null), _React$useState4 = _slicedToArray$e(_React$useState3, 2), containerWidth = _React$useState4[0], setContainerWidth = _React$useState4[1];
var _React$useState5 = React__namespace.useState({}), _React$useState6 = _slicedToArray$e(_React$useState5, 2), forceUpdate = _React$useState6[1];
function onPopupMouseEnter() {
forceUpdate({});
}
useLayoutEffect$1(function() {
if (triggerOpen) {
var _containerRef$current;
var newWidth = Math.ceil((_containerRef$current = containerRef.current) === null || _containerRef$current === void 0 ? void 0 : _containerRef$current.offsetWidth);
if (containerWidth !== newWidth && !Number.isNaN(newWidth)) {
setContainerWidth(newWidth);
}
}
}, [triggerOpen]);
var onTriggerVisibleChange;
if (customizeRawInputElement) {
onTriggerVisibleChange = function onTriggerVisibleChange2(newOpen) {
onToggleOpen(newOpen);
};
}
useSelectTriggerControl(function() {
var _triggerRef$current2;
return [containerRef.current, (_triggerRef$current2 = triggerRef.current) === null || _triggerRef$current2 === void 0 ? void 0 : _triggerRef$current2.getPopupElement()];
}, triggerOpen, onToggleOpen, !!customizeRawInputElement);
var baseSelectContext = React__namespace.useMemo(function() {
return _objectSpread2$a(_objectSpread2$a({}, props), {}, {
notFoundContent,
open: mergedOpen,
triggerOpen,
id: id2,
showSearch: mergedShowSearch,
multiple,
toggleOpen: onToggleOpen
});
}, [props, notFoundContent, triggerOpen, mergedOpen, id2, mergedShowSearch, multiple, onToggleOpen]);
var mergedShowArrow = showArrow !== void 0 ? showArrow : loading || !multiple && mode !== "combobox";
var arrowNode;
if (mergedShowArrow) {
arrowNode = /* @__PURE__ */ jsx(TransBtn, {
className: classnames("".concat(prefixCls, "-arrow"), _defineProperty$b({}, "".concat(prefixCls, "-arrow-loading"), loading)),
customizeIcon: inputIcon,
customizeIconProps: {
loading,
searchValue: mergedSearchValue,
open: mergedOpen,
focused: mockFocused,
showSearch: mergedShowSearch
}
});
}
var clearNode;
var onClearMouseDown = function onClearMouseDown2() {
var _selectorRef$current4;
onClear === null || onClear === void 0 ? void 0 : onClear();
(_selectorRef$current4 = selectorRef.current) === null || _selectorRef$current4 === void 0 ? void 0 : _selectorRef$current4.focus();
onDisplayValuesChange([], {
type: "clear",
values: displayValues
});
onInternalSearch("", false, false);
};
if (!disabled && allowClear && (displayValues.length || mergedSearchValue) && !(mode === "combobox" && mergedSearchValue === "")) {
clearNode = /* @__PURE__ */ jsx(TransBtn, {
className: "".concat(prefixCls, "-clear"),
onMouseDown: onClearMouseDown,
customizeIcon: clearIcon,
children: "\xD7"
});
}
var optionList = /* @__PURE__ */ jsx(OptionList2, {
ref: listRef
});
var mergedClassName = classnames(prefixCls, className, (_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-focused"), mockFocused), _defineProperty$b(_classNames2, "".concat(prefixCls, "-multiple"), multiple), _defineProperty$b(_classNames2, "".concat(prefixCls, "-single"), !multiple), _defineProperty$b(_classNames2, "".concat(prefixCls, "-allow-clear"), allowClear), _defineProperty$b(_classNames2, "".concat(prefixCls, "-show-arrow"), mergedShowArrow), _defineProperty$b(_classNames2, "".concat(prefixCls, "-disabled"), disabled), _defineProperty$b(_classNames2, "".concat(prefixCls, "-loading"), loading), _defineProperty$b(_classNames2, "".concat(prefixCls, "-open"), mergedOpen), _defineProperty$b(_classNames2, "".concat(prefixCls, "-customize-input"), customizeInputElement), _defineProperty$b(_classNames2, "".concat(prefixCls, "-show-search"), mergedShowSearch), _classNames2));
var selectorNode = /* @__PURE__ */ jsx(RefSelectTrigger, {
ref: triggerRef,
disabled,
prefixCls,
visible: triggerOpen,
popupElement: optionList,
containerWidth,
animation,
transitionName: transitionName2,
dropdownStyle,
dropdownClassName,
direction,
dropdownMatchSelectWidth,
dropdownRender,
dropdownAlign,
placement,
getPopupContainer,
empty: emptyOptions,
getTriggerDOMNode: function getTriggerDOMNode() {
return selectorDomRef.current;
},
onPopupVisibleChange: onTriggerVisibleChange,
onPopupMouseEnter,
children: customizeRawInputElement ? /* @__PURE__ */ React__namespace.cloneElement(customizeRawInputElement, {
ref: customizeRawInputRef
}) : /* @__PURE__ */ jsx(ForwardSelector, {
...props,
domRef: selectorDomRef,
prefixCls,
inputElement: customizeInputElement,
ref: selectorRef,
id: id2,
showSearch: mergedShowSearch,
autoClearSearchValue,
mode,
activeDescendantId,
tagRender,
values: displayValues,
open: mergedOpen,
onToggleOpen,
activeValue,
searchValue: mergedSearchValue,
onSearch: onInternalSearch,
onSearchSubmit: onInternalSearchSubmit,
onRemove: onSelectorRemove,
tokenWithEnter
})
});
var renderNode;
if (customizeRawInputElement) {
renderNode = selectorNode;
} else {
renderNode = /* @__PURE__ */ jsxs("div", {
className: mergedClassName,
...domProps,
ref: containerRef,
onMouseDown: onInternalMouseDown,
onKeyDown: onInternalKeyDown,
onKeyUp: onInternalKeyUp,
onFocus: onContainerFocus,
onBlur: onContainerBlur,
children: [mockFocused && !mergedOpen && /* @__PURE__ */ jsx("span", {
style: {
width: 0,
height: 0,
position: "absolute",
overflow: "hidden",
opacity: 0
},
"aria-live": "polite",
children: "".concat(displayValues.map(function(_ref) {
var label = _ref.label, value = _ref.value;
return ["number", "string"].includes(_typeof$q(label)) ? label : value;
}).join(", "))
}), selectorNode, arrowNode, clearNode]
});
}
return /* @__PURE__ */ jsx(BaseSelectContext.Provider, {
value: baseSelectContext,
children: renderNode
});
});
const useCache$1 = function(labeledValues, valueOptions) {
var cacheRef = React__namespace.useRef({
values: /* @__PURE__ */ new Map(),
options: /* @__PURE__ */ new Map()
});
var filledLabeledValues = React__namespace.useMemo(function() {
var _cacheRef$current = cacheRef.current, prevValueCache = _cacheRef$current.values, prevOptionCache = _cacheRef$current.options;
var patchedValues = labeledValues.map(function(item) {
if (item.label === void 0) {
var _prevValueCache$get;
return _objectSpread2$a(_objectSpread2$a({}, item), {}, {
label: (_prevValueCache$get = prevValueCache.get(item.value)) === null || _prevValueCache$get === void 0 ? void 0 : _prevValueCache$get.label
});
}
return item;
});
var valueCache = /* @__PURE__ */ new Map();
var optionCache = /* @__PURE__ */ new Map();
patchedValues.forEach(function(item) {
valueCache.set(item.value, item);
optionCache.set(item.value, valueOptions.get(item.value) || prevOptionCache.get(item.value));
});
cacheRef.current.values = valueCache;
cacheRef.current.options = optionCache;
return patchedValues;
}, [labeledValues, valueOptions]);
var getOption = React__namespace.useCallback(function(val) {
return valueOptions.get(val) || cacheRef.current.options.get(val);
}, [valueOptions]);
return [filledLabeledValues, getOption];
};
function includes(test, search) {
return toArray$7(test).join("").toUpperCase().includes(search);
}
const useFilterOptions = function(options, fieldNames, searchValue, filterOption, optionFilterProp) {
return React__namespace.useMemo(function() {
if (!searchValue || filterOption === false) {
return options;
}
var fieldOptions = fieldNames.options, fieldLabel = fieldNames.label, fieldValue = fieldNames.value;
var filteredOptions = [];
var customizeFilter = typeof filterOption === "function";
var upperSearch = searchValue.toUpperCase();
var filterFunc = customizeFilter ? filterOption : function(_, option) {
if (optionFilterProp) {
return includes(option[optionFilterProp], upperSearch);
}
if (option[fieldOptions]) {
return includes(option[fieldLabel !== "children" ? fieldLabel : "label"], upperSearch);
}
return includes(option[fieldValue], upperSearch);
};
var wrapOption = customizeFilter ? function(opt) {
return injectPropsWithOption(opt);
} : function(opt) {
return opt;
};
options.forEach(function(item) {
if (item[fieldOptions]) {
var matchGroup = filterFunc(searchValue, wrapOption(item));
if (matchGroup) {
filteredOptions.push(item);
} else {
var subOptions = item[fieldOptions].filter(function(subItem) {
return filterFunc(searchValue, wrapOption(subItem));
});
if (subOptions.length) {
filteredOptions.push(_objectSpread2$a(_objectSpread2$a({}, item), {}, _defineProperty$b({}, fieldOptions, subOptions)));
}
}
return;
}
if (filterFunc(searchValue, wrapOption(item))) {
filteredOptions.push(item);
}
});
return filteredOptions;
}, [options, filterOption, optionFilterProp, searchValue, fieldNames]);
};
var uuid$5 = 0;
var isBrowserClient$1 = canUseDom$1();
function getUUID$1() {
var retId;
if (isBrowserClient$1) {
retId = uuid$5;
uuid$5 += 1;
} else {
retId = "TEST_OR_SSR";
}
return retId;
}
function useId$2(id2) {
var _React$useState = React__namespace.useState(), _React$useState2 = _slicedToArray$e(_React$useState, 2), innerId = _React$useState2[0], setInnerId = _React$useState2[1];
React__namespace.useEffect(function() {
setInnerId("rc_select_".concat(getUUID$1()));
}, []);
return id2 || innerId;
}
var _excluded$D = ["children", "value"], _excluded2$7 = ["children"];
function convertNodeToOption(node) {
var _ref = node, key2 = _ref.key, _ref$props = _ref.props, children = _ref$props.children, value = _ref$props.value, restProps = _objectWithoutProperties$1(_ref$props, _excluded$D);
return _objectSpread2$a({
key: key2,
value: value !== void 0 ? value : key2,
children
}, restProps);
}
function convertChildrenToData$1(nodes) {
var optionOnly = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
return toArray$9(nodes).map(function(node, index2) {
if (!/* @__PURE__ */ React__namespace.isValidElement(node) || !node.type) {
return null;
}
var _ref2 = node, isSelectOptGroup = _ref2.type.isSelectOptGroup, key2 = _ref2.key, _ref2$props = _ref2.props, children = _ref2$props.children, restProps = _objectWithoutProperties$1(_ref2$props, _excluded2$7);
if (optionOnly || !isSelectOptGroup) {
return convertNodeToOption(node);
}
return _objectSpread2$a(_objectSpread2$a({
key: "__RC_SELECT_GRP__".concat(key2 === null ? index2 : key2, "__"),
label: key2
}, restProps), {}, {
options: convertChildrenToData$1(children)
});
}).filter(function(data) {
return data;
});
}
function useOptions(options, children, fieldNames, optionFilterProp, optionLabelProp) {
return React__namespace.useMemo(function() {
var mergedOptions = options;
var childrenAsData = !options;
if (childrenAsData) {
mergedOptions = convertChildrenToData$1(children);
}
var valueOptions = /* @__PURE__ */ new Map();
var labelOptions = /* @__PURE__ */ new Map();
var setLabelOptions = function setLabelOptions2(labelOptionsMap, option, key2) {
if (key2 && typeof key2 === "string") {
labelOptionsMap.set(option[key2], option);
}
};
function dig(optionList) {
var isChildren = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
for (var i2 = 0; i2 < optionList.length; i2 += 1) {
var option = optionList[i2];
if (!option[fieldNames.options] || isChildren) {
valueOptions.set(option[fieldNames.value], option);
setLabelOptions(labelOptions, option, fieldNames.label);
setLabelOptions(labelOptions, option, optionFilterProp);
setLabelOptions(labelOptions, option, optionLabelProp);
} else {
dig(option[fieldNames.options], true);
}
}
}
dig(mergedOptions);
return {
options: mergedOptions,
valueOptions,
labelOptions
};
}, [options, children, fieldNames, optionFilterProp, optionLabelProp]);
}
function useRefFunc$1(callback) {
var funcRef = React__namespace.useRef();
funcRef.current = callback;
var cacheFn = React__namespace.useCallback(function() {
return funcRef.current.apply(funcRef, arguments);
}, []);
return cacheFn;
}
var OptGroup = function OptGroup2() {
return null;
};
OptGroup.isSelectOptGroup = true;
var Option = function Option2() {
return null;
};
Option.isSelectOption = true;
var Filler = /* @__PURE__ */ React__namespace.forwardRef(function(_ref, ref) {
var height = _ref.height, offset2 = _ref.offset, children = _ref.children, prefixCls = _ref.prefixCls, onInnerResize = _ref.onInnerResize, innerProps = _ref.innerProps;
var outerStyle = {};
var innerStyle = {
display: "flex",
flexDirection: "column"
};
if (offset2 !== void 0) {
outerStyle = {
height,
position: "relative",
overflow: "hidden"
};
innerStyle = _objectSpread2$a(_objectSpread2$a({}, innerStyle), {}, {
transform: "translateY(".concat(offset2, "px)"),
position: "absolute",
left: 0,
right: 0,
top: 0
});
}
return /* @__PURE__ */ jsx("div", {
style: outerStyle,
children: /* @__PURE__ */ jsx(RefResizeObserver, {
onResize: function onResize2(_ref2) {
var offsetHeight = _ref2.offsetHeight;
if (offsetHeight && onInnerResize) {
onInnerResize();
}
},
children: /* @__PURE__ */ jsx("div", {
style: innerStyle,
className: classnames(_defineProperty$b({}, "".concat(prefixCls, "-holder-inner"), prefixCls)),
ref,
...innerProps,
children
})
})
});
});
Filler.displayName = "Filler";
var MIN_SIZE = 20;
function getPageY(e2) {
return "touches" in e2 ? e2.touches[0].pageY : e2.pageY;
}
var ScrollBar = /* @__PURE__ */ function(_React$Component) {
_inherits(ScrollBar2, _React$Component);
var _super = _createSuper(ScrollBar2);
function ScrollBar2() {
var _this2;
_classCallCheck(this, ScrollBar2);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this2 = _super.call.apply(_super, [this].concat(args));
_this2.moveRaf = null;
_this2.scrollbarRef = /* @__PURE__ */ React__namespace.createRef();
_this2.thumbRef = /* @__PURE__ */ React__namespace.createRef();
_this2.visibleTimeout = null;
_this2.state = {
dragging: false,
pageY: null,
startTop: null,
visible: false
};
_this2.delayHidden = function() {
clearTimeout(_this2.visibleTimeout);
_this2.setState({
visible: true
});
_this2.visibleTimeout = setTimeout(function() {
_this2.setState({
visible: false
});
}, 2e3);
};
_this2.onScrollbarTouchStart = function(e2) {
e2.preventDefault();
};
_this2.onContainerMouseDown = function(e2) {
e2.stopPropagation();
e2.preventDefault();
};
_this2.patchEvents = function() {
window.addEventListener("mousemove", _this2.onMouseMove);
window.addEventListener("mouseup", _this2.onMouseUp);
_this2.thumbRef.current.addEventListener("touchmove", _this2.onMouseMove);
_this2.thumbRef.current.addEventListener("touchend", _this2.onMouseUp);
};
_this2.removeEvents = function() {
var _this$scrollbarRef$cu;
window.removeEventListener("mousemove", _this2.onMouseMove);
window.removeEventListener("mouseup", _this2.onMouseUp);
(_this$scrollbarRef$cu = _this2.scrollbarRef.current) === null || _this$scrollbarRef$cu === void 0 ? void 0 : _this$scrollbarRef$cu.removeEventListener("touchstart", _this2.onScrollbarTouchStart);
if (_this2.thumbRef.current) {
_this2.thumbRef.current.removeEventListener("touchstart", _this2.onMouseDown);
_this2.thumbRef.current.removeEventListener("touchmove", _this2.onMouseMove);
_this2.thumbRef.current.removeEventListener("touchend", _this2.onMouseUp);
}
wrapperRaf$1.cancel(_this2.moveRaf);
};
_this2.onMouseDown = function(e2) {
var onStartMove = _this2.props.onStartMove;
_this2.setState({
dragging: true,
pageY: getPageY(e2),
startTop: _this2.getTop()
});
onStartMove();
_this2.patchEvents();
e2.stopPropagation();
e2.preventDefault();
};
_this2.onMouseMove = function(e2) {
var _this$state = _this2.state, dragging = _this$state.dragging, pageY = _this$state.pageY, startTop = _this$state.startTop;
var onScroll = _this2.props.onScroll;
wrapperRaf$1.cancel(_this2.moveRaf);
if (dragging) {
var offsetY = getPageY(e2) - pageY;
var newTop = startTop + offsetY;
var enableScrollRange = _this2.getEnableScrollRange();
var enableHeightRange = _this2.getEnableHeightRange();
var ptg = enableHeightRange ? newTop / enableHeightRange : 0;
var newScrollTop = Math.ceil(ptg * enableScrollRange);
_this2.moveRaf = wrapperRaf$1(function() {
onScroll(newScrollTop);
});
}
};
_this2.onMouseUp = function() {
var onStopMove = _this2.props.onStopMove;
_this2.setState({
dragging: false
});
onStopMove();
_this2.removeEvents();
};
_this2.getSpinHeight = function() {
var _this$props = _this2.props, height = _this$props.height, count = _this$props.count;
var baseHeight = height / count * 10;
baseHeight = Math.max(baseHeight, MIN_SIZE);
baseHeight = Math.min(baseHeight, height / 2);
return Math.floor(baseHeight);
};
_this2.getEnableScrollRange = function() {
var _this$props2 = _this2.props, scrollHeight = _this$props2.scrollHeight, height = _this$props2.height;
return scrollHeight - height || 0;
};
_this2.getEnableHeightRange = function() {
var height = _this2.props.height;
var spinHeight = _this2.getSpinHeight();
return height - spinHeight || 0;
};
_this2.getTop = function() {
var scrollTop = _this2.props.scrollTop;
var enableScrollRange = _this2.getEnableScrollRange();
var enableHeightRange = _this2.getEnableHeightRange();
if (scrollTop === 0 || enableScrollRange === 0) {
return 0;
}
var ptg = scrollTop / enableScrollRange;
return ptg * enableHeightRange;
};
_this2.showScroll = function() {
var _this$props3 = _this2.props, height = _this$props3.height, scrollHeight = _this$props3.scrollHeight;
return scrollHeight > height;
};
return _this2;
}
_createClass(ScrollBar2, [{
key: "componentDidMount",
value: function componentDidMount() {
this.scrollbarRef.current.addEventListener("touchstart", this.onScrollbarTouchStart);
this.thumbRef.current.addEventListener("touchstart", this.onMouseDown);
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate(prevProps) {
if (prevProps.scrollTop !== this.props.scrollTop) {
this.delayHidden();
}
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
this.removeEvents();
clearTimeout(this.visibleTimeout);
}
}, {
key: "render",
value: function render2() {
var _this$state2 = this.state, dragging = _this$state2.dragging, visible = _this$state2.visible;
var _this$props4 = this.props, prefixCls = _this$props4.prefixCls, direction = _this$props4.direction;
var spinHeight = this.getSpinHeight();
var top = this.getTop();
var canScroll = this.showScroll();
var mergedVisible = canScroll && visible;
var scrollBarDirection = direction === "rtl" ? {
left: 0
} : {
right: 0
};
return /* @__PURE__ */ jsx("div", {
ref: this.scrollbarRef,
className: classnames("".concat(prefixCls, "-scrollbar"), _defineProperty$b({}, "".concat(prefixCls, "-scrollbar-show"), canScroll)),
style: _objectSpread2$a(_objectSpread2$a({
width: 8,
top: 0,
bottom: 0
}, scrollBarDirection), {}, {
position: "absolute",
display: mergedVisible ? null : "none"
}),
onMouseDown: this.onContainerMouseDown,
onMouseMove: this.delayHidden,
children: /* @__PURE__ */ jsx("div", {
ref: this.thumbRef,
className: classnames("".concat(prefixCls, "-scrollbar-thumb"), _defineProperty$b({}, "".concat(prefixCls, "-scrollbar-thumb-moving"), dragging)),
style: {
width: "100%",
height: spinHeight,
top,
left: 0,
position: "absolute",
background: "rgba(0, 0, 0, 0.5)",
borderRadius: 99,
cursor: "pointer",
userSelect: "none"
},
onMouseDown: this.onMouseDown
})
});
}
}]);
return ScrollBar2;
}(React__namespace.Component);
function Item$2(_ref) {
var children = _ref.children, setRef = _ref.setRef;
var refFunc = React__namespace.useCallback(function(node) {
setRef(node);
}, []);
return /* @__PURE__ */ React__namespace.cloneElement(children, {
ref: refFunc
});
}
function useChildren(list, startIndex, endIndex, setNodeRef, renderFunc, _ref) {
var getKey2 = _ref.getKey;
return list.slice(startIndex, endIndex + 1).map(function(item, index2) {
var eleIndex = startIndex + index2;
var node = renderFunc(item, eleIndex, {});
var key2 = getKey2(item);
return /* @__PURE__ */ jsx(Item$2, {
setRef: function setRef(ele) {
return setNodeRef(item, ele);
},
children: node
}, key2);
});
}
var CacheMap = /* @__PURE__ */ function() {
function CacheMap2() {
_classCallCheck(this, CacheMap2);
this.maps = void 0;
this.maps = /* @__PURE__ */ Object.create(null);
}
_createClass(CacheMap2, [{
key: "set",
value: function set2(key2, value) {
this.maps[key2] = value;
}
}, {
key: "get",
value: function get2(key2) {
return this.maps[key2];
}
}]);
return CacheMap2;
}();
function useHeights(getKey2, onItemAdd, onItemRemove) {
var _React$useState = React__namespace.useState(0), _React$useState2 = _slicedToArray$e(_React$useState, 2), updatedMark = _React$useState2[0], setUpdatedMark = _React$useState2[1];
var instanceRef = React$a.useRef(/* @__PURE__ */ new Map());
var heightsRef = React$a.useRef(new CacheMap());
var collectRafRef = React$a.useRef();
function cancelRaf() {
wrapperRaf$1.cancel(collectRafRef.current);
}
function collectHeight() {
cancelRaf();
collectRafRef.current = wrapperRaf$1(function() {
instanceRef.current.forEach(function(element, key2) {
if (element && element.offsetParent) {
var htmlElement = findDOMNode(element);
var offsetHeight = htmlElement.offsetHeight;
if (heightsRef.current.get(key2) !== offsetHeight) {
heightsRef.current.set(key2, htmlElement.offsetHeight);
}
}
});
setUpdatedMark(function(c2) {
return c2 + 1;
});
});
}
function setInstanceRef(item, instance) {
var key2 = getKey2(item);
var origin = instanceRef.current.get(key2);
if (instance) {
instanceRef.current.set(key2, instance);
collectHeight();
} else {
instanceRef.current.delete(key2);
}
if (!origin !== !instance) {
if (instance) {
onItemAdd === null || onItemAdd === void 0 ? void 0 : onItemAdd(item);
} else {
onItemRemove === null || onItemRemove === void 0 ? void 0 : onItemRemove(item);
}
}
}
React$a.useEffect(function() {
return cancelRaf;
}, []);
return [setInstanceRef, collectHeight, heightsRef.current, updatedMark];
}
function useScrollTo(containerRef, data, heights, itemHeight, getKey2, collectHeight, syncScrollTop, triggerFlash) {
var scrollRef = React__namespace.useRef();
return function(arg) {
if (arg === null || arg === void 0) {
triggerFlash();
return;
}
wrapperRaf$1.cancel(scrollRef.current);
if (typeof arg === "number") {
syncScrollTop(arg);
} else if (arg && _typeof$q(arg) === "object") {
var index2;
var align = arg.align;
if ("index" in arg) {
index2 = arg.index;
} else {
index2 = data.findIndex(function(item) {
return getKey2(item) === arg.key;
});
}
var _arg$offset = arg.offset, offset2 = _arg$offset === void 0 ? 0 : _arg$offset;
var syncScroll = function syncScroll2(times, targetAlign) {
if (times < 0 || !containerRef.current)
return;
var height = containerRef.current.clientHeight;
var needCollectHeight = false;
var newTargetAlign = targetAlign;
if (height) {
var mergedAlign = targetAlign || align;
var stackTop = 0;
var itemTop = 0;
var itemBottom = 0;
var maxLen = Math.min(data.length, index2);
for (var i2 = 0; i2 <= maxLen; i2 += 1) {
var key2 = getKey2(data[i2]);
itemTop = stackTop;
var cacheHeight = heights.get(key2);
itemBottom = itemTop + (cacheHeight === void 0 ? itemHeight : cacheHeight);
stackTop = itemBottom;
if (i2 === index2 && cacheHeight === void 0) {
needCollectHeight = true;
}
}
var targetTop = null;
switch (mergedAlign) {
case "top":
targetTop = itemTop - offset2;
break;
case "bottom":
targetTop = itemBottom - height + offset2;
break;
default: {
var scrollTop = containerRef.current.scrollTop;
var scrollBottom = scrollTop + height;
if (itemTop < scrollTop) {
newTargetAlign = "top";
} else if (itemBottom > scrollBottom) {
newTargetAlign = "bottom";
}
}
}
if (targetTop !== null && targetTop !== containerRef.current.scrollTop) {
syncScrollTop(targetTop);
}
}
scrollRef.current = wrapperRaf$1(function() {
if (needCollectHeight) {
collectHeight();
}
syncScroll2(times - 1, newTargetAlign);
}, 2);
};
syncScroll(3);
}
};
}
function findListDiffIndex(originList, targetList, getKey2) {
var originLen = originList.length;
var targetLen = targetList.length;
var shortList;
var longList;
if (originLen === 0 && targetLen === 0) {
return null;
}
if (originLen < targetLen) {
shortList = originList;
longList = targetList;
} else {
shortList = targetList;
longList = originList;
}
var notExistKey = {
__EMPTY_ITEM__: true
};
function getItemKey(item) {
if (item !== void 0) {
return getKey2(item);
}
return notExistKey;
}
var diffIndex = null;
var multiple = Math.abs(originLen - targetLen) !== 1;
for (var i2 = 0; i2 < longList.length; i2 += 1) {
var shortKey = getItemKey(shortList[i2]);
var longKey = getItemKey(longList[i2]);
if (shortKey !== longKey) {
diffIndex = i2;
multiple = multiple || shortKey !== getItemKey(longList[i2 + 1]);
break;
}
}
return diffIndex === null ? null : {
index: diffIndex,
multiple
};
}
function useDiffItem(data, getKey2, onDiff) {
var _React$useState = React__namespace.useState(data), _React$useState2 = _slicedToArray$e(_React$useState, 2), prevData = _React$useState2[0], setPrevData = _React$useState2[1];
var _React$useState3 = React__namespace.useState(null), _React$useState4 = _slicedToArray$e(_React$useState3, 2), diffItem = _React$useState4[0], setDiffItem = _React$useState4[1];
React__namespace.useEffect(function() {
var diff = findListDiffIndex(prevData || [], data || [], getKey2);
if ((diff === null || diff === void 0 ? void 0 : diff.index) !== void 0) {
onDiff === null || onDiff === void 0 ? void 0 : onDiff(diff.index);
setDiffItem(data[diff.index]);
}
setPrevData(data);
}, [data]);
return [diffItem];
}
var isFF = (typeof navigator === "undefined" ? "undefined" : _typeof$q(navigator)) === "object" && /Firefox/i.test(navigator.userAgent);
const useOriginScroll = function(isScrollAtTop, isScrollAtBottom) {
var lockRef = React$a.useRef(false);
var lockTimeoutRef = React$a.useRef(null);
function lockScroll() {
clearTimeout(lockTimeoutRef.current);
lockRef.current = true;
lockTimeoutRef.current = setTimeout(function() {
lockRef.current = false;
}, 50);
}
var scrollPingRef = React$a.useRef({
top: isScrollAtTop,
bottom: isScrollAtBottom
});
scrollPingRef.current.top = isScrollAtTop;
scrollPingRef.current.bottom = isScrollAtBottom;
return function(deltaY) {
var smoothOffset = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
var originScroll = deltaY < 0 && scrollPingRef.current.top || deltaY > 0 && scrollPingRef.current.bottom;
if (smoothOffset && originScroll) {
clearTimeout(lockTimeoutRef.current);
lockRef.current = false;
} else if (!originScroll || lockRef.current) {
lockScroll();
}
return !lockRef.current && originScroll;
};
};
function useFrameWheel(inVirtual, isScrollAtTop, isScrollAtBottom, onWheelDelta) {
var offsetRef = React$a.useRef(0);
var nextFrameRef = React$a.useRef(null);
var wheelValueRef = React$a.useRef(null);
var isMouseScrollRef = React$a.useRef(false);
var originScroll = useOriginScroll(isScrollAtTop, isScrollAtBottom);
function onWheel(event) {
if (!inVirtual)
return;
wrapperRaf$1.cancel(nextFrameRef.current);
var deltaY = event.deltaY;
offsetRef.current += deltaY;
wheelValueRef.current = deltaY;
if (originScroll(deltaY))
return;
if (!isFF) {
event.preventDefault();
}
nextFrameRef.current = wrapperRaf$1(function() {
var patchMultiple = isMouseScrollRef.current ? 10 : 1;
onWheelDelta(offsetRef.current * patchMultiple);
offsetRef.current = 0;
});
}
function onFireFoxScroll(event) {
if (!inVirtual)
return;
isMouseScrollRef.current = event.detail === wheelValueRef.current;
}
return [onWheel, onFireFoxScroll];
}
var SMOOTH_PTG = 14 / 15;
function useMobileTouchMove(inVirtual, listRef, callback) {
var touchedRef = React$a.useRef(false);
var touchYRef = React$a.useRef(0);
var elementRef = React$a.useRef(null);
var intervalRef = React$a.useRef(null);
var cleanUpEvents;
var onTouchMove = function onTouchMove2(e2) {
if (touchedRef.current) {
var currentY = Math.ceil(e2.touches[0].pageY);
var offsetY = touchYRef.current - currentY;
touchYRef.current = currentY;
if (callback(offsetY)) {
e2.preventDefault();
}
clearInterval(intervalRef.current);
intervalRef.current = setInterval(function() {
offsetY *= SMOOTH_PTG;
if (!callback(offsetY, true) || Math.abs(offsetY) <= 0.1) {
clearInterval(intervalRef.current);
}
}, 16);
}
};
var onTouchEnd = function onTouchEnd2() {
touchedRef.current = false;
cleanUpEvents();
};
var onTouchStart = function onTouchStart2(e2) {
cleanUpEvents();
if (e2.touches.length === 1 && !touchedRef.current) {
touchedRef.current = true;
touchYRef.current = Math.ceil(e2.touches[0].pageY);
elementRef.current = e2.target;
elementRef.current.addEventListener("touchmove", onTouchMove);
elementRef.current.addEventListener("touchend", onTouchEnd);
}
};
cleanUpEvents = function cleanUpEvents2() {
if (elementRef.current) {
elementRef.current.removeEventListener("touchmove", onTouchMove);
elementRef.current.removeEventListener("touchend", onTouchEnd);
}
};
useLayoutEffect$1(function() {
if (inVirtual) {
listRef.current.addEventListener("touchstart", onTouchStart);
}
return function() {
var _listRef$current;
(_listRef$current = listRef.current) === null || _listRef$current === void 0 ? void 0 : _listRef$current.removeEventListener("touchstart", onTouchStart);
cleanUpEvents();
clearInterval(intervalRef.current);
};
}, [inVirtual]);
}
var _excluded$C = ["prefixCls", "className", "height", "itemHeight", "fullHeight", "style", "data", "children", "itemKey", "virtual", "direction", "component", "onScroll", "onVisibleChange", "innerProps"];
var EMPTY_DATA$1 = [];
var ScrollStyle = {
overflowY: "auto",
overflowAnchor: "none"
};
function RawList(props, ref) {
var _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-virtual-list" : _props$prefixCls, className = props.className, height = props.height, itemHeight = props.itemHeight, _props$fullHeight = props.fullHeight, fullHeight = _props$fullHeight === void 0 ? true : _props$fullHeight, style2 = props.style, data = props.data, children = props.children, itemKey2 = props.itemKey, virtual = props.virtual, direction = props.direction, _props$component = props.component, Component = _props$component === void 0 ? "div" : _props$component, onScroll = props.onScroll, onVisibleChange = props.onVisibleChange, innerProps = props.innerProps, restProps = _objectWithoutProperties$1(props, _excluded$C);
var useVirtual = !!(virtual !== false && height && itemHeight);
var inVirtual = useVirtual && data && itemHeight * data.length > height;
var _useState = React$a.useState(0), _useState2 = _slicedToArray$e(_useState, 2), scrollTop = _useState2[0], setScrollTop = _useState2[1];
var _useState3 = React$a.useState(false), _useState4 = _slicedToArray$e(_useState3, 2), scrollMoving = _useState4[0], setScrollMoving = _useState4[1];
var mergedClassName = classnames(prefixCls, _defineProperty$b({}, "".concat(prefixCls, "-rtl"), direction === "rtl"), className);
var mergedData = data || EMPTY_DATA$1;
var componentRef = React$a.useRef();
var fillerInnerRef = React$a.useRef();
var scrollBarRef = React$a.useRef();
var getKey2 = React__namespace.useCallback(function(item) {
if (typeof itemKey2 === "function") {
return itemKey2(item);
}
return item === null || item === void 0 ? void 0 : item[itemKey2];
}, [itemKey2]);
var sharedConfig = {
getKey: getKey2
};
function syncScrollTop(newTop) {
setScrollTop(function(origin) {
var value;
if (typeof newTop === "function") {
value = newTop(origin);
} else {
value = newTop;
}
var alignedTop = keepInRange(value);
componentRef.current.scrollTop = alignedTop;
return alignedTop;
});
}
var rangeRef = React$a.useRef({
start: 0,
end: mergedData.length
});
var diffItemRef = React$a.useRef();
var _useDiffItem = useDiffItem(mergedData, getKey2), _useDiffItem2 = _slicedToArray$e(_useDiffItem, 1), diffItem = _useDiffItem2[0];
diffItemRef.current = diffItem;
var _useHeights = useHeights(getKey2, null, null), _useHeights2 = _slicedToArray$e(_useHeights, 4), setInstanceRef = _useHeights2[0], collectHeight = _useHeights2[1], heights = _useHeights2[2], heightUpdatedMark = _useHeights2[3];
var _React$useMemo = React__namespace.useMemo(function() {
if (!useVirtual) {
return {
scrollHeight: void 0,
start: 0,
end: mergedData.length - 1,
offset: void 0
};
}
if (!inVirtual) {
var _fillerInnerRef$curre;
return {
scrollHeight: ((_fillerInnerRef$curre = fillerInnerRef.current) === null || _fillerInnerRef$curre === void 0 ? void 0 : _fillerInnerRef$curre.offsetHeight) || 0,
start: 0,
end: mergedData.length - 1,
offset: void 0
};
}
var itemTop = 0;
var startIndex;
var startOffset;
var endIndex;
var dataLen = mergedData.length;
for (var i2 = 0; i2 < dataLen; i2 += 1) {
var item = mergedData[i2];
var key2 = getKey2(item);
var cacheHeight = heights.get(key2);
var currentItemBottom = itemTop + (cacheHeight === void 0 ? itemHeight : cacheHeight);
if (currentItemBottom >= scrollTop && startIndex === void 0) {
startIndex = i2;
startOffset = itemTop;
}
if (currentItemBottom > scrollTop + height && endIndex === void 0) {
endIndex = i2;
}
itemTop = currentItemBottom;
}
if (startIndex === void 0) {
startIndex = 0;
startOffset = 0;
endIndex = Math.ceil(height / itemHeight);
}
if (endIndex === void 0) {
endIndex = mergedData.length - 1;
}
endIndex = Math.min(endIndex + 1, mergedData.length);
return {
scrollHeight: itemTop,
start: startIndex,
end: endIndex,
offset: startOffset
};
}, [inVirtual, useVirtual, scrollTop, mergedData, heightUpdatedMark, height]), scrollHeight = _React$useMemo.scrollHeight, start = _React$useMemo.start, end = _React$useMemo.end, offset2 = _React$useMemo.offset;
rangeRef.current.start = start;
rangeRef.current.end = end;
var maxScrollHeight = scrollHeight - height;
var maxScrollHeightRef = React$a.useRef(maxScrollHeight);
maxScrollHeightRef.current = maxScrollHeight;
function keepInRange(newScrollTop) {
var newTop = newScrollTop;
if (!Number.isNaN(maxScrollHeightRef.current)) {
newTop = Math.min(newTop, maxScrollHeightRef.current);
}
newTop = Math.max(newTop, 0);
return newTop;
}
var isScrollAtTop = scrollTop <= 0;
var isScrollAtBottom = scrollTop >= maxScrollHeight;
var originScroll = useOriginScroll(isScrollAtTop, isScrollAtBottom);
function onScrollBar(newScrollTop) {
var newTop = newScrollTop;
syncScrollTop(newTop);
}
function onFallbackScroll(e2) {
var newScrollTop = e2.currentTarget.scrollTop;
if (newScrollTop !== scrollTop) {
syncScrollTop(newScrollTop);
}
onScroll === null || onScroll === void 0 ? void 0 : onScroll(e2);
}
var _useFrameWheel = useFrameWheel(useVirtual, isScrollAtTop, isScrollAtBottom, function(offsetY) {
syncScrollTop(function(top) {
var newTop = top + offsetY;
return newTop;
});
}), _useFrameWheel2 = _slicedToArray$e(_useFrameWheel, 2), onRawWheel = _useFrameWheel2[0], onFireFoxScroll = _useFrameWheel2[1];
useMobileTouchMove(useVirtual, componentRef, function(deltaY, smoothOffset) {
if (originScroll(deltaY, smoothOffset)) {
return false;
}
onRawWheel({
preventDefault: function preventDefault() {
},
deltaY
});
return true;
});
useLayoutEffect$1(function() {
function onMozMousePixelScroll(e2) {
if (useVirtual) {
e2.preventDefault();
}
}
componentRef.current.addEventListener("wheel", onRawWheel);
componentRef.current.addEventListener("DOMMouseScroll", onFireFoxScroll);
componentRef.current.addEventListener("MozMousePixelScroll", onMozMousePixelScroll);
return function() {
if (componentRef.current) {
componentRef.current.removeEventListener("wheel", onRawWheel);
componentRef.current.removeEventListener("DOMMouseScroll", onFireFoxScroll);
componentRef.current.removeEventListener("MozMousePixelScroll", onMozMousePixelScroll);
}
};
}, [useVirtual]);
var scrollTo2 = useScrollTo(componentRef, mergedData, heights, itemHeight, getKey2, collectHeight, syncScrollTop, function() {
var _scrollBarRef$current;
(_scrollBarRef$current = scrollBarRef.current) === null || _scrollBarRef$current === void 0 ? void 0 : _scrollBarRef$current.delayHidden();
});
React__namespace.useImperativeHandle(ref, function() {
return {
scrollTo: scrollTo2
};
});
useLayoutEffect$1(function() {
if (onVisibleChange) {
var renderList = mergedData.slice(start, end + 1);
onVisibleChange(renderList, mergedData);
}
}, [start, end, mergedData]);
var listChildren = useChildren(mergedData, start, end, setInstanceRef, children, sharedConfig);
var componentStyle = null;
if (height) {
componentStyle = _objectSpread2$a(_defineProperty$b({}, fullHeight ? "height" : "maxHeight", height), ScrollStyle);
if (useVirtual) {
componentStyle.overflowY = "hidden";
if (scrollMoving) {
componentStyle.pointerEvents = "none";
}
}
}
return /* @__PURE__ */ jsxs("div", {
style: _objectSpread2$a(_objectSpread2$a({}, style2), {}, {
position: "relative"
}),
className: mergedClassName,
...restProps,
children: [/* @__PURE__ */ jsx(Component, {
className: "".concat(prefixCls, "-holder"),
style: componentStyle,
ref: componentRef,
onScroll: onFallbackScroll,
children: /* @__PURE__ */ jsx(Filler, {
prefixCls,
height: scrollHeight,
offset: offset2,
onInnerResize: collectHeight,
ref: fillerInnerRef,
innerProps,
children: listChildren
})
}), useVirtual && /* @__PURE__ */ jsx(ScrollBar, {
ref: scrollBarRef,
prefixCls,
scrollTop,
height,
scrollHeight,
count: mergedData.length,
direction,
onScroll: onScrollBar,
onStartMove: function onStartMove() {
setScrollMoving(true);
},
onStopMove: function onStopMove() {
setScrollMoving(false);
}
})]
});
}
var List$1 = /* @__PURE__ */ React__namespace.forwardRef(RawList);
List$1.displayName = "List";
function isPlatformMac() {
return /(mac\sos|macintosh)/i.test(navigator.appVersion);
}
var SelectContext = /* @__PURE__ */ React__namespace.createContext(null);
var _excluded$B = ["disabled", "title", "children", "style", "className"];
function isTitleType(content) {
return typeof content === "string" || typeof content === "number";
}
var OptionList$1 = function OptionList2(_, ref) {
var _useBaseProps = useBaseProps(), prefixCls = _useBaseProps.prefixCls, id2 = _useBaseProps.id, open = _useBaseProps.open, multiple = _useBaseProps.multiple, mode = _useBaseProps.mode, searchValue = _useBaseProps.searchValue, toggleOpen = _useBaseProps.toggleOpen, notFoundContent = _useBaseProps.notFoundContent, onPopupScroll = _useBaseProps.onPopupScroll;
var _React$useContext = React__namespace.useContext(SelectContext), flattenOptions2 = _React$useContext.flattenOptions, onActiveValue = _React$useContext.onActiveValue, defaultActiveFirstOption = _React$useContext.defaultActiveFirstOption, onSelect = _React$useContext.onSelect, menuItemSelectedIcon = _React$useContext.menuItemSelectedIcon, rawValues = _React$useContext.rawValues, fieldNames = _React$useContext.fieldNames, virtual = _React$useContext.virtual, listHeight = _React$useContext.listHeight, listItemHeight = _React$useContext.listItemHeight;
var itemPrefixCls = "".concat(prefixCls, "-item");
var memoFlattenOptions = useMemo(function() {
return flattenOptions2;
}, [open, flattenOptions2], function(prev, next) {
return next[0] && prev[1] !== next[1];
});
var listRef = React__namespace.useRef(null);
var onListMouseDown = function onListMouseDown2(event) {
event.preventDefault();
};
var scrollIntoView2 = function scrollIntoView3(args) {
if (listRef.current) {
listRef.current.scrollTo(typeof args === "number" ? {
index: args
} : args);
}
};
var getEnabledActiveIndex = function getEnabledActiveIndex2(index2) {
var offset2 = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 1;
var len = memoFlattenOptions.length;
for (var i2 = 0; i2 < len; i2 += 1) {
var current = (index2 + i2 * offset2 + len) % len;
var _memoFlattenOptions$c = memoFlattenOptions[current], group = _memoFlattenOptions$c.group, data = _memoFlattenOptions$c.data;
if (!group && !data.disabled) {
return current;
}
}
return -1;
};
var _React$useState = React__namespace.useState(function() {
return getEnabledActiveIndex(0);
}), _React$useState2 = _slicedToArray$e(_React$useState, 2), activeIndex = _React$useState2[0], setActiveIndex = _React$useState2[1];
var setActive = function setActive2(index2) {
var fromKeyboard = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
setActiveIndex(index2);
var info = {
source: fromKeyboard ? "keyboard" : "mouse"
};
var flattenItem = memoFlattenOptions[index2];
if (!flattenItem) {
onActiveValue(null, -1, info);
return;
}
onActiveValue(flattenItem.value, index2, info);
};
React$a.useEffect(function() {
setActive(defaultActiveFirstOption !== false ? getEnabledActiveIndex(0) : -1);
}, [memoFlattenOptions.length, searchValue]);
var isSelected = React__namespace.useCallback(function(value) {
return rawValues.has(value) && mode !== "combobox";
}, [mode, _toConsumableArray$c(rawValues).toString(), rawValues.size]);
React$a.useEffect(function() {
var timeoutId = setTimeout(function() {
if (!multiple && open && rawValues.size === 1) {
var value = Array.from(rawValues)[0];
var index2 = memoFlattenOptions.findIndex(function(_ref) {
var data = _ref.data;
return data.value === value;
});
if (index2 !== -1) {
setActive(index2);
scrollIntoView2(index2);
}
}
});
if (open) {
var _listRef$current;
(_listRef$current = listRef.current) === null || _listRef$current === void 0 ? void 0 : _listRef$current.scrollTo(void 0);
}
return function() {
return clearTimeout(timeoutId);
};
}, [open, searchValue]);
var onSelectValue = function onSelectValue2(value) {
if (value !== void 0) {
onSelect(value, {
selected: !rawValues.has(value)
});
}
if (!multiple) {
toggleOpen(false);
}
};
React__namespace.useImperativeHandle(ref, function() {
return {
onKeyDown: function onKeyDown2(event) {
var which = event.which, ctrlKey = event.ctrlKey;
switch (which) {
case KeyCode.N:
case KeyCode.P:
case KeyCode.UP:
case KeyCode.DOWN: {
var offset2 = 0;
if (which === KeyCode.UP) {
offset2 = -1;
} else if (which === KeyCode.DOWN) {
offset2 = 1;
} else if (isPlatformMac() && ctrlKey) {
if (which === KeyCode.N) {
offset2 = 1;
} else if (which === KeyCode.P) {
offset2 = -1;
}
}
if (offset2 !== 0) {
var nextActiveIndex = getEnabledActiveIndex(activeIndex + offset2, offset2);
scrollIntoView2(nextActiveIndex);
setActive(nextActiveIndex, true);
}
break;
}
case KeyCode.ENTER: {
var item = memoFlattenOptions[activeIndex];
if (item && !item.data.disabled) {
onSelectValue(item.value);
} else {
onSelectValue(void 0);
}
if (open) {
event.preventDefault();
}
break;
}
case KeyCode.ESC: {
toggleOpen(false);
if (open) {
event.stopPropagation();
}
}
}
},
onKeyUp: function onKeyUp() {
},
scrollTo: function scrollTo2(index2) {
scrollIntoView2(index2);
}
};
});
if (memoFlattenOptions.length === 0) {
return /* @__PURE__ */ jsx("div", {
role: "listbox",
id: "".concat(id2, "_list"),
className: "".concat(itemPrefixCls, "-empty"),
onMouseDown: onListMouseDown,
children: notFoundContent
});
}
var omitFieldNameList = Object.keys(fieldNames).map(function(key2) {
return fieldNames[key2];
});
var getLabel2 = function getLabel3(item) {
return item.label;
};
var renderItem2 = function renderItem3(index2) {
var item = memoFlattenOptions[index2];
if (!item)
return null;
var itemData = item.data || {};
var value = itemData.value;
var group = item.group;
var attrs = pickAttrs(itemData, true);
var mergedLabel = getLabel2(item);
return item ? /* @__PURE__ */ React$a.createElement("div", {
"aria-label": typeof mergedLabel === "string" && !group ? mergedLabel : null,
...attrs,
key: index2,
role: group ? "presentation" : "option",
id: "".concat(id2, "_list_").concat(index2),
"aria-selected": isSelected(value)
}, value) : null;
};
return /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsxs("div", {
role: "listbox",
id: "".concat(id2, "_list"),
style: {
height: 0,
width: 0,
overflow: "hidden"
},
children: [renderItem2(activeIndex - 1), renderItem2(activeIndex), renderItem2(activeIndex + 1)]
}), /* @__PURE__ */ jsx(List$1, {
itemKey: "key",
ref: listRef,
data: memoFlattenOptions,
height: listHeight,
itemHeight: listItemHeight,
fullHeight: false,
onMouseDown: onListMouseDown,
onScroll: onPopupScroll,
virtual,
children: function(item, itemIndex) {
var _classNames;
var group = item.group, groupOption = item.groupOption, data = item.data, label = item.label, value = item.value;
var key2 = data.key;
if (group) {
var _data$title;
var groupTitle = (_data$title = data.title) !== null && _data$title !== void 0 ? _data$title : isTitleType(label) ? label.toString() : void 0;
return /* @__PURE__ */ jsx("div", {
className: classnames(itemPrefixCls, "".concat(itemPrefixCls, "-group")),
title: groupTitle,
children: label !== void 0 ? label : key2
});
}
var disabled = data.disabled, title = data.title;
data.children;
var style2 = data.style, className = data.className, otherProps = _objectWithoutProperties$1(data, _excluded$B);
var passedProps = omit(otherProps, omitFieldNameList);
var selected = isSelected(value);
var optionPrefixCls = "".concat(itemPrefixCls, "-option");
var optionClassName = classnames(itemPrefixCls, optionPrefixCls, className, (_classNames = {}, _defineProperty$b(_classNames, "".concat(optionPrefixCls, "-grouped"), groupOption), _defineProperty$b(_classNames, "".concat(optionPrefixCls, "-active"), activeIndex === itemIndex && !disabled), _defineProperty$b(_classNames, "".concat(optionPrefixCls, "-disabled"), disabled), _defineProperty$b(_classNames, "".concat(optionPrefixCls, "-selected"), selected), _classNames));
var mergedLabel = getLabel2(item);
var iconVisible = !menuItemSelectedIcon || typeof menuItemSelectedIcon === "function" || selected;
var content = typeof mergedLabel === "number" ? mergedLabel : mergedLabel || value;
var optionTitle = isTitleType(content) ? content.toString() : void 0;
if (title !== void 0) {
optionTitle = title;
}
return /* @__PURE__ */ jsxs("div", {
...pickAttrs(passedProps),
"aria-selected": selected,
className: optionClassName,
title: optionTitle,
onMouseMove: function onMouseMove() {
if (activeIndex === itemIndex || disabled) {
return;
}
setActive(itemIndex);
},
onClick: function onClick() {
if (!disabled) {
onSelectValue(value);
}
},
style: style2,
children: [/* @__PURE__ */ jsx("div", {
className: "".concat(optionPrefixCls, "-content"),
children: content
}), /* @__PURE__ */ React__namespace.isValidElement(menuItemSelectedIcon) || selected, iconVisible && /* @__PURE__ */ jsx(TransBtn, {
className: "".concat(itemPrefixCls, "-option-state"),
customizeIcon: menuItemSelectedIcon,
customizeIconProps: {
isSelected: selected
},
children: selected ? "\u2713" : null
})]
});
}
})]
});
};
var RefOptionList$1 = /* @__PURE__ */ React__namespace.forwardRef(OptionList$1);
RefOptionList$1.displayName = "OptionList";
var _excluded$A = ["id", "mode", "prefixCls", "backfill", "fieldNames", "inputValue", "searchValue", "onSearch", "autoClearSearchValue", "onSelect", "onDeselect", "dropdownMatchSelectWidth", "filterOption", "filterSort", "optionFilterProp", "optionLabelProp", "options", "children", "defaultActiveFirstOption", "menuItemSelectedIcon", "virtual", "listHeight", "listItemHeight", "value", "defaultValue", "labelInValue", "onChange"];
var OMIT_DOM_PROPS = ["inputValue"];
function isRawValue$1(value) {
return !value || _typeof$q(value) !== "object";
}
var Select$1 = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var id2 = props.id, mode = props.mode, _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-select" : _props$prefixCls, backfill = props.backfill, fieldNames = props.fieldNames, inputValue = props.inputValue, searchValue = props.searchValue, onSearch = props.onSearch, _props$autoClearSearc = props.autoClearSearchValue, autoClearSearchValue = _props$autoClearSearc === void 0 ? true : _props$autoClearSearc, onSelect = props.onSelect, onDeselect = props.onDeselect, _props$dropdownMatchS = props.dropdownMatchSelectWidth, dropdownMatchSelectWidth = _props$dropdownMatchS === void 0 ? true : _props$dropdownMatchS, filterOption = props.filterOption, filterSort = props.filterSort, optionFilterProp = props.optionFilterProp, optionLabelProp = props.optionLabelProp, options = props.options, children = props.children, defaultActiveFirstOption = props.defaultActiveFirstOption, menuItemSelectedIcon = props.menuItemSelectedIcon, virtual = props.virtual, _props$listHeight = props.listHeight, listHeight = _props$listHeight === void 0 ? 200 : _props$listHeight, _props$listItemHeight = props.listItemHeight, listItemHeight = _props$listItemHeight === void 0 ? 20 : _props$listItemHeight, value = props.value, defaultValue = props.defaultValue, labelInValue = props.labelInValue, onChange = props.onChange, restProps = _objectWithoutProperties$1(props, _excluded$A);
var mergedId = useId$2(id2);
var multiple = isMultiple(mode);
var childrenAsData = !!(!options && children);
var mergedFilterOption = React__namespace.useMemo(function() {
if (filterOption === void 0 && mode === "combobox") {
return false;
}
return filterOption;
}, [filterOption, mode]);
var mergedFieldNames = React__namespace.useMemo(
function() {
return fillFieldNames$2(fieldNames, childrenAsData);
},
[
JSON.stringify(fieldNames),
childrenAsData
]
);
var _useMergedState = useMergedState("", {
value: searchValue !== void 0 ? searchValue : inputValue,
postState: function postState(search) {
return search || "";
}
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), mergedSearchValue = _useMergedState2[0], setSearchValue = _useMergedState2[1];
var parsedOptions = useOptions(options, children, mergedFieldNames, optionFilterProp, optionLabelProp);
var valueOptions = parsedOptions.valueOptions, labelOptions = parsedOptions.labelOptions, mergedOptions = parsedOptions.options;
var convert2LabelValues = React__namespace.useCallback(function(draftValues) {
var valueList = toArray$7(draftValues);
return valueList.map(function(val) {
var rawValue;
var rawLabel;
var rawKey;
var rawDisabled;
var rawTitle;
if (isRawValue$1(val)) {
rawValue = val;
} else {
var _val$value;
rawKey = val.key;
rawLabel = val.label;
rawValue = (_val$value = val.value) !== null && _val$value !== void 0 ? _val$value : rawKey;
}
var option = valueOptions.get(rawValue);
if (option) {
var _option$key;
if (rawLabel === void 0)
rawLabel = option === null || option === void 0 ? void 0 : option[optionLabelProp || mergedFieldNames.label];
if (rawKey === void 0)
rawKey = (_option$key = option === null || option === void 0 ? void 0 : option.key) !== null && _option$key !== void 0 ? _option$key : rawValue;
rawDisabled = option === null || option === void 0 ? void 0 : option.disabled;
rawTitle = option === null || option === void 0 ? void 0 : option.title;
}
return {
label: rawLabel,
value: rawValue,
key: rawKey,
disabled: rawDisabled,
title: rawTitle
};
});
}, [mergedFieldNames, optionLabelProp, valueOptions]);
var _useMergedState3 = useMergedState(defaultValue, {
value
}), _useMergedState4 = _slicedToArray$e(_useMergedState3, 2), internalValue = _useMergedState4[0], setInternalValue = _useMergedState4[1];
var rawLabeledValues = React__namespace.useMemo(function() {
var _values$;
var values = convert2LabelValues(internalValue);
if (mode === "combobox" && !((_values$ = values[0]) !== null && _values$ !== void 0 && _values$.value)) {
return [];
}
return values;
}, [internalValue, convert2LabelValues, mode]);
var _useCache = useCache$1(rawLabeledValues, valueOptions), _useCache2 = _slicedToArray$e(_useCache, 2), mergedValues = _useCache2[0], getMixedOption = _useCache2[1];
var displayValues = React__namespace.useMemo(function() {
if (!mode && mergedValues.length === 1) {
var firstValue = mergedValues[0];
if (firstValue.value === null && (firstValue.label === null || firstValue.label === void 0)) {
return [];
}
}
return mergedValues.map(function(item) {
var _item$label;
return _objectSpread2$a(_objectSpread2$a({}, item), {}, {
label: (_item$label = item.label) !== null && _item$label !== void 0 ? _item$label : item.value
});
});
}, [mode, mergedValues]);
var rawValues = React__namespace.useMemo(function() {
return new Set(mergedValues.map(function(val) {
return val.value;
}));
}, [mergedValues]);
React__namespace.useEffect(function() {
if (mode === "combobox") {
var _mergedValues$;
var strValue = (_mergedValues$ = mergedValues[0]) === null || _mergedValues$ === void 0 ? void 0 : _mergedValues$.value;
setSearchValue(hasValue(strValue) ? String(strValue) : "");
}
}, [mergedValues]);
var createTagOption = useRefFunc$1(function(val, label) {
var _ref;
var mergedLabel = label !== null && label !== void 0 ? label : val;
return _ref = {}, _defineProperty$b(_ref, mergedFieldNames.value, val), _defineProperty$b(_ref, mergedFieldNames.label, mergedLabel), _ref;
});
var filledTagOptions = React__namespace.useMemo(function() {
if (mode !== "tags") {
return mergedOptions;
}
var cloneOptions = _toConsumableArray$c(mergedOptions);
var existOptions = function existOptions2(val) {
return valueOptions.has(val);
};
_toConsumableArray$c(mergedValues).sort(function(a, b2) {
return a.value < b2.value ? -1 : 1;
}).forEach(function(item) {
var val = item.value;
if (!existOptions(val)) {
cloneOptions.push(createTagOption(val, item.label));
}
});
return cloneOptions;
}, [createTagOption, mergedOptions, valueOptions, mergedValues, mode]);
var filteredOptions = useFilterOptions(filledTagOptions, mergedFieldNames, mergedSearchValue, mergedFilterOption, optionFilterProp);
var filledSearchOptions = React__namespace.useMemo(function() {
if (mode !== "tags" || !mergedSearchValue || filteredOptions.some(function(item) {
return item[optionFilterProp || "value"] === mergedSearchValue;
})) {
return filteredOptions;
}
return [createTagOption(mergedSearchValue)].concat(_toConsumableArray$c(filteredOptions));
}, [createTagOption, optionFilterProp, mode, filteredOptions, mergedSearchValue]);
var orderedFilteredOptions = React__namespace.useMemo(function() {
if (!filterSort) {
return filledSearchOptions;
}
return _toConsumableArray$c(filledSearchOptions).sort(function(a, b2) {
return filterSort(a, b2);
});
}, [filledSearchOptions, filterSort]);
var displayOptions = React__namespace.useMemo(function() {
return flattenOptions(orderedFilteredOptions, {
fieldNames: mergedFieldNames,
childrenAsData
});
}, [orderedFilteredOptions, mergedFieldNames, childrenAsData]);
var triggerChange = function triggerChange2(values) {
var labeledValues = convert2LabelValues(values);
setInternalValue(labeledValues);
if (onChange && (labeledValues.length !== mergedValues.length || labeledValues.some(function(newVal, index2) {
var _mergedValues$index;
return ((_mergedValues$index = mergedValues[index2]) === null || _mergedValues$index === void 0 ? void 0 : _mergedValues$index.value) !== (newVal === null || newVal === void 0 ? void 0 : newVal.value);
}))) {
var returnValues = labelInValue ? labeledValues : labeledValues.map(function(v2) {
return v2.value;
});
var returnOptions = labeledValues.map(function(v2) {
return injectPropsWithOption(getMixedOption(v2.value));
});
onChange(
multiple ? returnValues : returnValues[0],
multiple ? returnOptions : returnOptions[0]
);
}
};
var _React$useState = React__namespace.useState(null), _React$useState2 = _slicedToArray$e(_React$useState, 2), activeValue = _React$useState2[0], setActiveValue = _React$useState2[1];
var _React$useState3 = React__namespace.useState(0), _React$useState4 = _slicedToArray$e(_React$useState3, 2), accessibilityIndex = _React$useState4[0], setAccessibilityIndex = _React$useState4[1];
var mergedDefaultActiveFirstOption = defaultActiveFirstOption !== void 0 ? defaultActiveFirstOption : mode !== "combobox";
var onActiveValue = React__namespace.useCallback(function(active, index2) {
var _ref2 = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}, _ref2$source = _ref2.source, source = _ref2$source === void 0 ? "keyboard" : _ref2$source;
setAccessibilityIndex(index2);
if (backfill && mode === "combobox" && active !== null && source === "keyboard") {
setActiveValue(String(active));
}
}, [backfill, mode]);
var triggerSelect = function triggerSelect2(val, selected, type2) {
var getSelectEnt = function getSelectEnt2() {
var _option$key2;
var option = getMixedOption(val);
return [labelInValue ? {
label: option === null || option === void 0 ? void 0 : option[mergedFieldNames.label],
value: val,
key: (_option$key2 = option === null || option === void 0 ? void 0 : option.key) !== null && _option$key2 !== void 0 ? _option$key2 : val
} : val, injectPropsWithOption(option)];
};
if (selected && onSelect) {
var _getSelectEnt = getSelectEnt(), _getSelectEnt2 = _slicedToArray$e(_getSelectEnt, 2), wrappedValue = _getSelectEnt2[0], _option = _getSelectEnt2[1];
onSelect(wrappedValue, _option);
} else if (!selected && onDeselect && type2 !== "clear") {
var _getSelectEnt3 = getSelectEnt(), _getSelectEnt4 = _slicedToArray$e(_getSelectEnt3, 2), _wrappedValue = _getSelectEnt4[0], _option2 = _getSelectEnt4[1];
onDeselect(_wrappedValue, _option2);
}
};
var onInternalSelect = useRefFunc$1(function(val, info) {
var cloneValues;
var mergedSelect = multiple ? info.selected : true;
if (mergedSelect) {
cloneValues = multiple ? [].concat(_toConsumableArray$c(mergedValues), [val]) : [val];
} else {
cloneValues = mergedValues.filter(function(v2) {
return v2.value !== val;
});
}
triggerChange(cloneValues);
triggerSelect(val, mergedSelect);
if (mode === "combobox") {
setActiveValue("");
} else if (!isMultiple || autoClearSearchValue) {
setSearchValue("");
setActiveValue("");
}
});
var onDisplayValuesChange = function onDisplayValuesChange2(nextValues, info) {
triggerChange(nextValues);
var type2 = info.type, values = info.values;
if (type2 === "remove" || type2 === "clear") {
values.forEach(function(item) {
triggerSelect(item.value, false, type2);
});
}
};
var onInternalSearch = function onInternalSearch2(searchText, info) {
setSearchValue(searchText);
setActiveValue(null);
if (info.source === "submit") {
var formatted = (searchText || "").trim();
if (formatted) {
var newRawValues = Array.from(new Set([].concat(_toConsumableArray$c(rawValues), [formatted])));
triggerChange(newRawValues);
triggerSelect(formatted, true);
setSearchValue("");
}
return;
}
if (info.source !== "blur") {
if (mode === "combobox") {
triggerChange(searchText);
}
onSearch === null || onSearch === void 0 ? void 0 : onSearch(searchText);
}
};
var onInternalSearchSplit = function onInternalSearchSplit2(words) {
var patchValues = words;
if (mode !== "tags") {
patchValues = words.map(function(word) {
var opt = labelOptions.get(word);
return opt === null || opt === void 0 ? void 0 : opt.value;
}).filter(function(val) {
return val !== void 0;
});
}
var newRawValues = Array.from(new Set([].concat(_toConsumableArray$c(rawValues), _toConsumableArray$c(patchValues))));
triggerChange(newRawValues);
newRawValues.forEach(function(newRawValue) {
triggerSelect(newRawValue, true);
});
};
var selectContext = React__namespace.useMemo(function() {
var realVirtual = virtual !== false && dropdownMatchSelectWidth !== false;
return _objectSpread2$a(_objectSpread2$a({}, parsedOptions), {}, {
flattenOptions: displayOptions,
onActiveValue,
defaultActiveFirstOption: mergedDefaultActiveFirstOption,
onSelect: onInternalSelect,
menuItemSelectedIcon,
rawValues,
fieldNames: mergedFieldNames,
virtual: realVirtual,
listHeight,
listItemHeight,
childrenAsData
});
}, [parsedOptions, displayOptions, onActiveValue, mergedDefaultActiveFirstOption, onInternalSelect, menuItemSelectedIcon, rawValues, mergedFieldNames, virtual, dropdownMatchSelectWidth, listHeight, listItemHeight, childrenAsData]);
return /* @__PURE__ */ jsx(SelectContext.Provider, {
value: selectContext,
children: /* @__PURE__ */ jsx(BaseSelect, {
...restProps,
id: mergedId,
prefixCls,
ref,
omitDomProps: OMIT_DOM_PROPS,
mode,
displayValues,
onDisplayValuesChange,
searchValue: mergedSearchValue,
onSearch: onInternalSearch,
autoClearSearchValue,
onSearchSplit: onInternalSearchSplit,
dropdownMatchSelectWidth,
OptionList: RefOptionList$1,
emptyOptions: !displayOptions.length,
activeValue,
activeDescendantId: "".concat(mergedId, "_list_").concat(accessibilityIndex)
})
});
});
var TypedSelect = Select$1;
TypedSelect.Option = Option;
TypedSelect.OptGroup = OptGroup;
var Empty$3 = function Empty2() {
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var prefixCls = getPrefixCls("empty-img-default");
return /* @__PURE__ */ jsx("svg", {
className: prefixCls,
width: "184",
height: "152",
viewBox: "0 0 184 152",
xmlns: "http://www.w3.org/2000/svg",
children: /* @__PURE__ */ jsxs("g", {
fill: "none",
fillRule: "evenodd",
children: [/* @__PURE__ */ jsxs("g", {
transform: "translate(24 31.67)",
children: [/* @__PURE__ */ jsx("ellipse", {
className: "".concat(prefixCls, "-ellipse"),
cx: "67.797",
cy: "106.89",
rx: "67.797",
ry: "12.668"
}), /* @__PURE__ */ jsx("path", {
className: "".concat(prefixCls, "-path-1"),
d: "M122.034 69.674L98.109 40.229c-1.148-1.386-2.826-2.225-4.593-2.225h-51.44c-1.766 0-3.444.839-4.592 2.225L13.56 69.674v15.383h108.475V69.674z"
}), /* @__PURE__ */ jsx("path", {
className: "".concat(prefixCls, "-path-2"),
d: "M101.537 86.214L80.63 61.102c-1.001-1.207-2.507-1.867-4.048-1.867H31.724c-1.54 0-3.047.66-4.048 1.867L6.769 86.214v13.792h94.768V86.214z",
transform: "translate(13.56)"
}), /* @__PURE__ */ jsx("path", {
className: "".concat(prefixCls, "-path-3"),
d: "M33.83 0h67.933a4 4 0 0 1 4 4v93.344a4 4 0 0 1-4 4H33.83a4 4 0 0 1-4-4V4a4 4 0 0 1 4-4z"
}), /* @__PURE__ */ jsx("path", {
className: "".concat(prefixCls, "-path-4"),
d: "M42.678 9.953h50.237a2 2 0 0 1 2 2V36.91a2 2 0 0 1-2 2H42.678a2 2 0 0 1-2-2V11.953a2 2 0 0 1 2-2zM42.94 49.767h49.713a2.262 2.262 0 1 1 0 4.524H42.94a2.262 2.262 0 0 1 0-4.524zM42.94 61.53h49.713a2.262 2.262 0 1 1 0 4.525H42.94a2.262 2.262 0 0 1 0-4.525zM121.813 105.032c-.775 3.071-3.497 5.36-6.735 5.36H20.515c-3.238 0-5.96-2.29-6.734-5.36a7.309 7.309 0 0 1-.222-1.79V69.675h26.318c2.907 0 5.25 2.448 5.25 5.42v.04c0 2.971 2.37 5.37 5.277 5.37h34.785c2.907 0 5.277-2.421 5.277-5.393V75.1c0-2.972 2.343-5.426 5.25-5.426h26.318v33.569c0 .617-.077 1.216-.221 1.789z"
})]
}), /* @__PURE__ */ jsx("path", {
className: "".concat(prefixCls, "-path-5"),
d: "M149.121 33.292l-6.83 2.65a1 1 0 0 1-1.317-1.23l1.937-6.207c-2.589-2.944-4.109-6.534-4.109-10.408C138.802 8.102 148.92 0 161.402 0 173.881 0 184 8.102 184 18.097c0 9.995-10.118 18.097-22.599 18.097-4.528 0-8.744-1.066-12.28-2.902z"
}), /* @__PURE__ */ jsxs("g", {
className: "".concat(prefixCls, "-g"),
transform: "translate(149.65 15.383)",
children: [/* @__PURE__ */ jsx("ellipse", {
cx: "20.654",
cy: "3.167",
rx: "2.849",
ry: "2.815"
}), /* @__PURE__ */ jsx("path", {
d: "M5.698 5.63H0L2.898.704zM9.259.704h4.985V5.63H9.259z"
})]
})]
})
});
};
const DefaultEmptyImg = Empty$3;
var Simple = function Simple2() {
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var prefixCls = getPrefixCls("empty-img-simple");
return /* @__PURE__ */ jsx("svg", {
className: prefixCls,
width: "64",
height: "41",
viewBox: "0 0 64 41",
xmlns: "http://www.w3.org/2000/svg",
children: /* @__PURE__ */ jsxs("g", {
transform: "translate(0 1)",
fill: "none",
fillRule: "evenodd",
children: [/* @__PURE__ */ jsx("ellipse", {
className: "".concat(prefixCls, "-ellipse"),
cx: "32",
cy: "33",
rx: "32",
ry: "7"
}), /* @__PURE__ */ jsxs("g", {
className: "".concat(prefixCls, "-g"),
fillRule: "nonzero",
children: [/* @__PURE__ */ jsx("path", {
d: "M55 12.76L44.854 1.258C44.367.474 43.656 0 42.907 0H21.093c-.749 0-1.46.474-1.947 1.257L9 12.761V22h46v-9.24z"
}), /* @__PURE__ */ jsx("path", {
d: "M41.613 15.931c0-1.605.994-2.93 2.227-2.931H55v18.137C55 33.26 53.68 35 52.05 35h-40.1C10.32 35 9 33.259 9 31.137V13h11.16c1.233 0 2.227 1.323 2.227 2.928v.022c0 1.605 1.005 2.901 2.237 2.901h14.752c1.232 0 2.237-1.308 2.237-2.913v-.007z",
className: "".concat(prefixCls, "-path")
})]
})]
})
});
};
const SimpleEmptyImg = Simple;
var __rest$S = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var defaultEmptyImg = /* @__PURE__ */ jsx(DefaultEmptyImg, {});
var simpleEmptyImg = /* @__PURE__ */ jsx(SimpleEmptyImg, {});
var Empty$1 = function Empty2(_a) {
var className = _a.className, customizePrefixCls = _a.prefixCls, _a$image = _a.image, image = _a$image === void 0 ? defaultEmptyImg : _a$image, description = _a.description, children = _a.children, imageStyle = _a.imageStyle, restProps = __rest$S(_a, ["className", "prefixCls", "image", "description", "children", "imageStyle"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
return /* @__PURE__ */ jsx(LocaleReceiver$1, {
componentName: "Empty",
children: function(contextLocale) {
var _classNames;
var prefixCls = getPrefixCls("empty", customizePrefixCls);
var des = typeof description !== "undefined" ? description : contextLocale.description;
var alt = typeof des === "string" ? des : "empty";
var imageNode = null;
if (typeof image === "string") {
imageNode = /* @__PURE__ */ jsx("img", {
alt,
src: image
});
} else {
imageNode = image;
}
return /* @__PURE__ */ jsxs("div", {
className: classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-normal"), image === simpleEmptyImg), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames), className),
...restProps,
children: [/* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-image"),
style: imageStyle,
children: imageNode
}), des && /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-description"),
children: des
}), children && /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-footer"),
children
})]
});
}
});
};
Empty$1.PRESENTED_IMAGE_DEFAULT = defaultEmptyImg;
Empty$1.PRESENTED_IMAGE_SIMPLE = simpleEmptyImg;
const Empty$2 = Empty$1;
var defaultRenderEmpty = function defaultRenderEmpty2(componentName) {
return /* @__PURE__ */ jsx(ConfigConsumer, {
children: function(_ref) {
var getPrefixCls = _ref.getPrefixCls;
var prefix = getPrefixCls("empty");
switch (componentName) {
case "Table":
case "List":
return /* @__PURE__ */ jsx(Empty$2, {
image: Empty$2.PRESENTED_IMAGE_SIMPLE
});
case "Select":
case "TreeSelect":
case "Cascader":
case "Transfer":
case "Mentions":
return /* @__PURE__ */ jsx(Empty$2, {
image: Empty$2.PRESENTED_IMAGE_SIMPLE,
className: "".concat(prefix, "-small")
});
default:
return /* @__PURE__ */ jsx(Empty$2, {});
}
}
});
};
const defaultRenderEmpty$1 = defaultRenderEmpty;
var FormContext = /* @__PURE__ */ React__namespace.createContext({
labelAlign: "right",
vertical: false,
itemRef: function itemRef() {
}
});
var NoStyleItemContext = /* @__PURE__ */ React__namespace.createContext(null);
var FormProvider = function FormProvider2(props) {
var providerProps = omit(props, ["prefixCls"]);
return /* @__PURE__ */ jsx(FormProvider$1, {
...providerProps
});
};
var FormItemPrefixContext = /* @__PURE__ */ React__namespace.createContext({
prefixCls: ""
});
var FormItemInputContext = /* @__PURE__ */ React__namespace.createContext({});
var NoFormStyle = function NoFormStyle2(_ref) {
var children = _ref.children, status = _ref.status, override = _ref.override;
var formItemInputContext = React$a.useContext(FormItemInputContext);
var newFormItemInputContext = React$a.useMemo(function() {
var newContext = _extends$3({}, formItemInputContext);
if (override) {
delete newContext.isFormItemInput;
}
if (status) {
delete newContext.status;
delete newContext.hasFeedback;
delete newContext.feedbackIcon;
}
return newContext;
}, [status, override, formItemInputContext]);
return /* @__PURE__ */ jsx(FormItemInputContext.Provider, {
value: newFormItemInputContext,
children
});
};
var tuple$1 = function tuple2() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return args;
};
var getCollapsedHeight = function getCollapsedHeight2() {
return {
height: 0,
opacity: 0
};
};
var getRealHeight = function getRealHeight2(node) {
var scrollHeight = node.scrollHeight;
return {
height: scrollHeight,
opacity: 1
};
};
var getCurrentHeight = function getCurrentHeight2(node) {
return {
height: node ? node.offsetHeight : 0
};
};
var skipOpacityTransition = function skipOpacityTransition2(_, event) {
return (event === null || event === void 0 ? void 0 : event.deadline) === true || event.propertyName === "height";
};
var collapseMotion = {
motionName: "ant-motion-collapse",
onAppearStart: getCollapsedHeight,
onEnterStart: getCollapsedHeight,
onAppearActive: getRealHeight,
onEnterActive: getRealHeight,
onLeaveStart: getCurrentHeight,
onLeaveActive: getCollapsedHeight,
onAppearEnd: skipOpacityTransition,
onEnterEnd: skipOpacityTransition,
onLeaveEnd: skipOpacityTransition,
motionDeadline: 500
};
tuple$1("bottomLeft", "bottomRight", "topLeft", "topRight");
var getTransitionDirection = function getTransitionDirection2(placement) {
if (placement !== void 0 && (placement === "topLeft" || placement === "topRight")) {
return "slide-down";
}
return "slide-up";
};
var getTransitionName = function getTransitionName2(rootPrefixCls, motion2, transitionName2) {
if (transitionName2 !== void 0) {
return transitionName2;
}
return "".concat(rootPrefixCls, "-").concat(motion2);
};
const collapseMotion$1 = collapseMotion;
tuple$1("warning", "error", "");
function getStatusClassNames(prefixCls, status, hasFeedback) {
var _classNames;
return classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-status-success"), status === "success"), _defineProperty$b(_classNames, "".concat(prefixCls, "-status-warning"), status === "warning"), _defineProperty$b(_classNames, "".concat(prefixCls, "-status-error"), status === "error"), _defineProperty$b(_classNames, "".concat(prefixCls, "-status-validating"), status === "validating"), _defineProperty$b(_classNames, "".concat(prefixCls, "-has-feedback"), hasFeedback), _classNames));
}
var getMergedStatus = function getMergedStatus2(contextStatus, customStatus) {
return customStatus || contextStatus;
};
var CheckOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M912 190h-69.9c-9.8 0-19.1 4.5-25.1 12.2L404.7 724.5 207 474a32 32 0 00-25.1-12.2H112c-6.7 0-10.4 7.7-6.3 12.9l273.9 347c12.8 16.2 37.4 16.2 50.3 0l488.4-618.9c4.1-5.1.4-12.8-6.3-12.8z" } }] }, "name": "check", "theme": "outlined" };
const CheckOutlinedSvg = CheckOutlined$2;
var CheckOutlined = function CheckOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: CheckOutlinedSvg
})
});
};
CheckOutlined.displayName = "CheckOutlined";
const CheckOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(CheckOutlined);
var DownOutlined$5 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z" } }] }, "name": "down", "theme": "outlined" };
const DownOutlinedSvg = DownOutlined$5;
var DownOutlined$3 = function DownOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: DownOutlinedSvg
})
});
};
DownOutlined$3.displayName = "DownOutlined";
const DownOutlined$4 = /* @__PURE__ */ React__namespace.forwardRef(DownOutlined$3);
var SearchOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M909.6 854.5L649.9 594.8C690.2 542.7 712 479 712 412c0-80.2-31.3-155.4-87.9-212.1-56.6-56.7-132-87.9-212.1-87.9s-155.5 31.3-212.1 87.9C143.2 256.5 112 331.8 112 412c0 80.1 31.3 155.5 87.9 212.1C256.5 680.8 331.8 712 412 712c67 0 130.6-21.8 182.7-62l259.7 259.6a8.2 8.2 0 0011.6 0l43.6-43.5a8.2 8.2 0 000-11.6zM570.4 570.4C528 612.7 471.8 636 412 636s-116-23.3-158.4-65.6C211.3 528 188 471.8 188 412s23.3-116.1 65.6-158.4C296 211.3 352.2 188 412 188s116.1 23.2 158.4 65.6S636 352.2 636 412s-23.3 116.1-65.6 158.4z" } }] }, "name": "search", "theme": "outlined" };
const SearchOutlinedSvg = SearchOutlined$2;
var SearchOutlined = function SearchOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: SearchOutlinedSvg
})
});
};
SearchOutlined.displayName = "SearchOutlined";
const SearchOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(SearchOutlined);
function getIcons(_ref) {
var suffixIcon = _ref.suffixIcon, clearIcon = _ref.clearIcon, menuItemSelectedIcon = _ref.menuItemSelectedIcon, removeIcon = _ref.removeIcon, loading = _ref.loading, multiple = _ref.multiple, hasFeedback = _ref.hasFeedback, prefixCls = _ref.prefixCls, showArrow = _ref.showArrow, feedbackIcon = _ref.feedbackIcon;
var mergedClearIcon = clearIcon !== null && clearIcon !== void 0 ? clearIcon : /* @__PURE__ */ jsx(CloseCircleFilled$1, {});
var getSuffixIconNode = function getSuffixIconNode2(arrowIcon) {
return /* @__PURE__ */ jsxs(Fragment, {
children: [showArrow !== false && arrowIcon, hasFeedback && feedbackIcon]
});
};
var mergedSuffixIcon = null;
if (suffixIcon !== void 0) {
mergedSuffixIcon = getSuffixIconNode(suffixIcon);
} else if (loading) {
mergedSuffixIcon = getSuffixIconNode(
/* @__PURE__ */ jsx(LoadingOutlined$1, {
spin: true
})
);
} else {
var iconCls = "".concat(prefixCls, "-suffix");
mergedSuffixIcon = function mergedSuffixIcon2(_ref2) {
var open = _ref2.open, showSearch = _ref2.showSearch;
if (open && showSearch) {
return getSuffixIconNode(
/* @__PURE__ */ jsx(SearchOutlined$1, {
className: iconCls
})
);
}
return getSuffixIconNode(
/* @__PURE__ */ jsx(DownOutlined$4, {
className: iconCls
})
);
};
}
var mergedItemIcon = null;
if (menuItemSelectedIcon !== void 0) {
mergedItemIcon = menuItemSelectedIcon;
} else if (multiple) {
mergedItemIcon = /* @__PURE__ */ jsx(CheckOutlined$1, {});
} else {
mergedItemIcon = null;
}
var mergedRemoveIcon = null;
if (removeIcon !== void 0) {
mergedRemoveIcon = removeIcon;
} else {
mergedRemoveIcon = /* @__PURE__ */ jsx(CloseOutlined$4, {});
}
return {
clearIcon: mergedClearIcon,
suffixIcon: mergedSuffixIcon,
itemIcon: mergedItemIcon,
removeIcon: mergedRemoveIcon
};
}
var __rest$R = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var SpaceCompactItemContext = /* @__PURE__ */ React__namespace.createContext(null);
var useCompactItemContext = function useCompactItemContext2(prefixCls, direction) {
var compactItemContext = React__namespace.useContext(SpaceCompactItemContext);
var compactItemClassnames = React__namespace.useMemo(function() {
var _classNames;
if (!compactItemContext)
return "";
var compactDirection = compactItemContext.compactDirection, isFirstItem = compactItemContext.isFirstItem, isLastItem = compactItemContext.isLastItem;
var separator = compactDirection === "vertical" ? "-vertical-" : "-";
return classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-compact").concat(separator, "item"), true), _defineProperty$b(_classNames, "".concat(prefixCls, "-compact").concat(separator, "first-item"), isFirstItem), _defineProperty$b(_classNames, "".concat(prefixCls, "-compact").concat(separator, "last-item"), isLastItem), _defineProperty$b(_classNames, "".concat(prefixCls, "-compact").concat(separator, "item-rtl"), direction === "rtl"), _classNames));
}, [prefixCls, direction, compactItemContext]);
return {
compactSize: compactItemContext === null || compactItemContext === void 0 ? void 0 : compactItemContext.compactSize,
compactDirection: compactItemContext === null || compactItemContext === void 0 ? void 0 : compactItemContext.compactDirection,
compactItemClassnames
};
};
var NoCompactStyle = function NoCompactStyle2(_ref) {
var children = _ref.children;
return /* @__PURE__ */ jsx(SpaceCompactItemContext.Provider, {
value: null,
children
});
};
var CompactItem = function CompactItem2(_a) {
var children = _a.children, otherProps = __rest$R(_a, ["children"]);
return /* @__PURE__ */ jsx(SpaceCompactItemContext.Provider, {
value: otherProps,
children
});
};
var Compact = function Compact2(props) {
var _classNames2;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, directionConfig = _React$useContext.direction;
var _props$size = props.size, size = _props$size === void 0 ? "middle" : _props$size, direction = props.direction, block = props.block, customizePrefixCls = props.prefixCls, className = props.className, children = props.children, restProps = __rest$R(props, ["size", "direction", "block", "prefixCls", "className", "children"]);
var prefixCls = getPrefixCls("space-compact", customizePrefixCls);
var clx = classnames(prefixCls, (_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-rtl"), directionConfig === "rtl"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-block"), block), _defineProperty$b(_classNames2, "".concat(prefixCls, "-vertical"), direction === "vertical"), _classNames2), className);
var compactItemContext = React__namespace.useContext(SpaceCompactItemContext);
var childNodes = toArray$9(children);
var nodes = React__namespace.useMemo(function() {
return childNodes.map(function(child, i2) {
var key2 = child && child.key || "".concat(prefixCls, "-item-").concat(i2);
return /* @__PURE__ */ jsx(CompactItem, {
compactSize: size,
compactDirection: direction,
isFirstItem: i2 === 0 && (!compactItemContext || (compactItemContext === null || compactItemContext === void 0 ? void 0 : compactItemContext.isFirstItem)),
isLastItem: i2 === childNodes.length - 1 && (!compactItemContext || (compactItemContext === null || compactItemContext === void 0 ? void 0 : compactItemContext.isLastItem)),
children: child
}, key2);
});
}, [size, childNodes, compactItemContext]);
if (childNodes.length === 0) {
return null;
}
return /* @__PURE__ */ jsx("div", {
className: clx,
...restProps,
children: nodes
});
};
var __rest$Q = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var SECRET_COMBOBOX_MODE_DO_NOT_USE = "SECRET_COMBOBOX_MODE_DO_NOT_USE";
var InternalSelect = function InternalSelect2(_a, ref) {
var _classNames2;
var customizePrefixCls = _a.prefixCls, _a$bordered = _a.bordered, bordered = _a$bordered === void 0 ? true : _a$bordered, className = _a.className, getPopupContainer = _a.getPopupContainer, dropdownClassName = _a.dropdownClassName, popupClassName = _a.popupClassName, _a$listHeight = _a.listHeight, listHeight = _a$listHeight === void 0 ? 256 : _a$listHeight, placement = _a.placement, _a$listItemHeight = _a.listItemHeight, listItemHeight = _a$listItemHeight === void 0 ? 24 : _a$listItemHeight, customizeSize = _a.size, customDisabled = _a.disabled, notFoundContent = _a.notFoundContent, customStatus = _a.status, showArrow = _a.showArrow, props = __rest$Q(_a, ["prefixCls", "bordered", "className", "getPopupContainer", "dropdownClassName", "popupClassName", "listHeight", "placement", "listItemHeight", "size", "disabled", "notFoundContent", "status", "showArrow"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getContextPopupContainer = _React$useContext.getPopupContainer, getPrefixCls = _React$useContext.getPrefixCls, renderEmpty = _React$useContext.renderEmpty, direction = _React$useContext.direction, virtual = _React$useContext.virtual, dropdownMatchSelectWidth = _React$useContext.dropdownMatchSelectWidth;
var size = React__namespace.useContext(SizeContext$1);
var prefixCls = getPrefixCls("select", customizePrefixCls);
var rootPrefixCls = getPrefixCls();
var _useCompactItemContex = useCompactItemContext(prefixCls, direction), compactSize = _useCompactItemContex.compactSize, compactItemClassnames = _useCompactItemContex.compactItemClassnames;
var mode = React__namespace.useMemo(function() {
var m2 = props.mode;
if (m2 === "combobox") {
return void 0;
}
if (m2 === SECRET_COMBOBOX_MODE_DO_NOT_USE) {
return "combobox";
}
return m2;
}, [props.mode]);
var isMultiple2 = mode === "multiple" || mode === "tags";
var mergedShowArrow = showArrow !== void 0 ? showArrow : props.loading || !(isMultiple2 || mode === "combobox");
var _useContext = React$a.useContext(FormItemInputContext), contextStatus = _useContext.status, hasFeedback = _useContext.hasFeedback, isFormItemInput = _useContext.isFormItemInput, feedbackIcon = _useContext.feedbackIcon;
var mergedStatus = getMergedStatus(contextStatus, customStatus);
var mergedNotFound;
if (notFoundContent !== void 0) {
mergedNotFound = notFoundContent;
} else if (mode === "combobox") {
mergedNotFound = null;
} else {
mergedNotFound = (renderEmpty || defaultRenderEmpty$1)("Select");
}
var _getIcons = getIcons(_extends$3(_extends$3({}, props), {
multiple: isMultiple2,
hasFeedback,
feedbackIcon,
showArrow: mergedShowArrow,
prefixCls
})), suffixIcon = _getIcons.suffixIcon, itemIcon = _getIcons.itemIcon, removeIcon = _getIcons.removeIcon, clearIcon = _getIcons.clearIcon;
var selectProps = omit(props, ["suffixIcon", "itemIcon"]);
var rcSelectRtlDropdownClassName = classnames(popupClassName || dropdownClassName, _defineProperty$b({}, "".concat(prefixCls, "-dropdown-").concat(direction), direction === "rtl"));
var mergedSize = compactSize || customizeSize || size;
var disabled = React__namespace.useContext(DisabledContext$1);
var mergedDisabled = customDisabled !== null && customDisabled !== void 0 ? customDisabled : disabled;
var mergedClassName = classnames((_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-lg"), mergedSize === "large"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-sm"), mergedSize === "small"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-rtl"), direction === "rtl"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-borderless"), !bordered), _defineProperty$b(_classNames2, "".concat(prefixCls, "-in-form-item"), isFormItemInput), _classNames2), getStatusClassNames(prefixCls, mergedStatus, hasFeedback), compactItemClassnames, className);
var getPlacement = function getPlacement2() {
if (placement !== void 0) {
return placement;
}
return direction === "rtl" ? "bottomRight" : "bottomLeft";
};
return /* @__PURE__ */ jsx(TypedSelect, {
ref,
virtual,
dropdownMatchSelectWidth,
...selectProps,
transitionName: getTransitionName(rootPrefixCls, getTransitionDirection(placement), props.transitionName),
listHeight,
listItemHeight,
mode,
prefixCls,
placement: getPlacement(),
direction,
inputIcon: suffixIcon,
menuItemSelectedIcon: itemIcon,
removeIcon,
clearIcon,
notFoundContent: mergedNotFound,
className: mergedClassName,
getPopupContainer: getPopupContainer || getContextPopupContainer,
dropdownClassName: rcSelectRtlDropdownClassName,
showArrow: hasFeedback || showArrow,
disabled: mergedDisabled
});
};
var Select = /* @__PURE__ */ React__namespace.forwardRef(InternalSelect);
Select.SECRET_COMBOBOX_MODE_DO_NOT_USE = SECRET_COMBOBOX_MODE_DO_NOT_USE;
Select.Option = Option;
Select.OptGroup = OptGroup;
const _Select = Select;
function useForceUpdate() {
var _React$useReducer = React__namespace.useReducer(function(x2) {
return x2 + 1;
}, 0), _React$useReducer2 = _slicedToArray$e(_React$useReducer, 2), forceUpdate = _React$useReducer2[1];
return forceUpdate;
}
var responsiveArray = ["xxl", "xl", "lg", "md", "sm", "xs"];
var responsiveMap = {
xs: "(max-width: 575px)",
sm: "(min-width: 576px)",
md: "(min-width: 768px)",
lg: "(min-width: 992px)",
xl: "(min-width: 1200px)",
xxl: "(min-width: 1600px)"
};
var subscribers = /* @__PURE__ */ new Map();
var subUid = -1;
var screens = {};
var responsiveObserve = {
matchHandlers: {},
dispatch: function dispatch(pointMap) {
screens = pointMap;
subscribers.forEach(function(func) {
return func(screens);
});
return subscribers.size >= 1;
},
subscribe: function subscribe(func) {
if (!subscribers.size)
this.register();
subUid += 1;
subscribers.set(subUid, func);
func(screens);
return subUid;
},
unsubscribe: function unsubscribe(token) {
subscribers["delete"](token);
if (!subscribers.size)
this.unregister();
},
unregister: function unregister() {
var _this2 = this;
Object.keys(responsiveMap).forEach(function(screen) {
var matchMediaQuery = responsiveMap[screen];
var handler = _this2.matchHandlers[matchMediaQuery];
handler === null || handler === void 0 ? void 0 : handler.mql.removeListener(handler === null || handler === void 0 ? void 0 : handler.listener);
});
subscribers.clear();
},
register: function register() {
var _this2 = this;
Object.keys(responsiveMap).forEach(function(screen) {
var matchMediaQuery = responsiveMap[screen];
var listener = function listener2(_ref) {
var matches = _ref.matches;
_this2.dispatch(_extends$3(_extends$3({}, screens), _defineProperty$b({}, screen, matches)));
};
var mql = window.matchMedia(matchMediaQuery);
mql.addListener(listener);
_this2.matchHandlers[matchMediaQuery] = {
mql,
listener
};
listener(mql);
});
}
};
const ResponsiveObserve = responsiveObserve;
function useBreakpoint() {
var refreshOnChange = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
var screensRef = React$a.useRef({});
var forceUpdate = useForceUpdate();
React$a.useEffect(function() {
var token = ResponsiveObserve.subscribe(function(supportScreens) {
screensRef.current = supportScreens;
if (refreshOnChange) {
forceUpdate();
}
});
return function() {
return ResponsiveObserve.unsubscribe(token);
};
}, []);
return screensRef.current;
}
var autoAdjustOverflow$2 = {
adjustX: 1,
adjustY: 1
};
var targetOffset$2 = [0, 0];
var placements$3 = {
left: {
points: ["cr", "cl"],
overflow: autoAdjustOverflow$2,
offset: [-4, 0],
targetOffset: targetOffset$2
},
right: {
points: ["cl", "cr"],
overflow: autoAdjustOverflow$2,
offset: [4, 0],
targetOffset: targetOffset$2
},
top: {
points: ["bc", "tc"],
overflow: autoAdjustOverflow$2,
offset: [0, -4],
targetOffset: targetOffset$2
},
bottom: {
points: ["tc", "bc"],
overflow: autoAdjustOverflow$2,
offset: [0, 4],
targetOffset: targetOffset$2
},
topLeft: {
points: ["bl", "tl"],
overflow: autoAdjustOverflow$2,
offset: [0, -4],
targetOffset: targetOffset$2
},
leftTop: {
points: ["tr", "tl"],
overflow: autoAdjustOverflow$2,
offset: [-4, 0],
targetOffset: targetOffset$2
},
topRight: {
points: ["br", "tr"],
overflow: autoAdjustOverflow$2,
offset: [0, -4],
targetOffset: targetOffset$2
},
rightTop: {
points: ["tl", "tr"],
overflow: autoAdjustOverflow$2,
offset: [4, 0],
targetOffset: targetOffset$2
},
bottomRight: {
points: ["tr", "br"],
overflow: autoAdjustOverflow$2,
offset: [0, 4],
targetOffset: targetOffset$2
},
rightBottom: {
points: ["bl", "br"],
overflow: autoAdjustOverflow$2,
offset: [4, 0],
targetOffset: targetOffset$2
},
bottomLeft: {
points: ["tl", "bl"],
overflow: autoAdjustOverflow$2,
offset: [0, 4],
targetOffset: targetOffset$2
},
leftBottom: {
points: ["br", "bl"],
overflow: autoAdjustOverflow$2,
offset: [-4, 0],
targetOffset: targetOffset$2
}
};
function Popup$1(props) {
var showArrow = props.showArrow, arrowContent = props.arrowContent, children = props.children, prefixCls = props.prefixCls, id2 = props.id, overlayInnerStyle = props.overlayInnerStyle, className = props.className, style2 = props.style;
return /* @__PURE__ */ jsxs("div", {
className: classnames("".concat(prefixCls, "-content"), className),
style: style2,
children: [showArrow !== false && /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-arrow"),
children: arrowContent
}, "arrow"), /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-inner"),
id: id2,
role: "tooltip",
style: overlayInnerStyle,
children: typeof children === "function" ? children() : children
})]
});
}
var Tooltip$1 = function Tooltip2(props, ref) {
var overlayClassName = props.overlayClassName, _props$trigger = props.trigger, trigger = _props$trigger === void 0 ? ["hover"] : _props$trigger, _props$mouseEnterDela = props.mouseEnterDelay, mouseEnterDelay = _props$mouseEnterDela === void 0 ? 0 : _props$mouseEnterDela, _props$mouseLeaveDela = props.mouseLeaveDelay, mouseLeaveDelay = _props$mouseLeaveDela === void 0 ? 0.1 : _props$mouseLeaveDela, overlayStyle = props.overlayStyle, _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-tooltip" : _props$prefixCls, children = props.children, onVisibleChange = props.onVisibleChange, afterVisibleChange = props.afterVisibleChange, transitionName2 = props.transitionName, animation = props.animation, motion2 = props.motion, _props$placement = props.placement, placement = _props$placement === void 0 ? "right" : _props$placement, _props$align = props.align, align = _props$align === void 0 ? {} : _props$align, _props$destroyTooltip = props.destroyTooltipOnHide, destroyTooltipOnHide = _props$destroyTooltip === void 0 ? false : _props$destroyTooltip, defaultVisible = props.defaultVisible, getTooltipContainer = props.getTooltipContainer, overlayInnerStyle = props.overlayInnerStyle, arrowContent = props.arrowContent, overlay = props.overlay, id2 = props.id, showArrow = props.showArrow, restProps = _objectWithoutProperties$1(props, ["overlayClassName", "trigger", "mouseEnterDelay", "mouseLeaveDelay", "overlayStyle", "prefixCls", "children", "onVisibleChange", "afterVisibleChange", "transitionName", "animation", "motion", "placement", "align", "destroyTooltipOnHide", "defaultVisible", "getTooltipContainer", "overlayInnerStyle", "arrowContent", "overlay", "id", "showArrow"]);
var domRef = React$a.useRef(null);
React$a.useImperativeHandle(ref, function() {
return domRef.current;
});
var extraProps = _objectSpread2$a({}, restProps);
if ("visible" in props) {
extraProps.popupVisible = props.visible;
}
var getPopupElement = function getPopupElement2() {
return /* @__PURE__ */ jsx(Popup$1, {
showArrow,
arrowContent,
prefixCls,
id: id2,
overlayInnerStyle,
children: overlay
}, "content");
};
var destroyTooltip = false;
var autoDestroy = false;
if (typeof destroyTooltipOnHide === "boolean") {
destroyTooltip = destroyTooltipOnHide;
} else if (destroyTooltipOnHide && _typeof$q(destroyTooltipOnHide) === "object") {
var keepParent = destroyTooltipOnHide.keepParent;
destroyTooltip = keepParent === true;
autoDestroy = keepParent === false;
}
return /* @__PURE__ */ jsx(Trigger$1, {
popupClassName: overlayClassName,
prefixCls,
popup: getPopupElement,
action: trigger,
builtinPlacements: placements$3,
popupPlacement: placement,
ref: domRef,
popupAlign: align,
getPopupContainer: getTooltipContainer,
onPopupVisibleChange: onVisibleChange,
afterPopupVisibleChange: afterVisibleChange,
popupTransitionName: transitionName2,
popupAnimation: animation,
popupMotion: motion2,
defaultPopupVisible: defaultVisible,
destroyPopupOnHide: destroyTooltip,
autoDestroy,
mouseLeaveDelay,
popupStyle: overlayStyle,
mouseEnterDelay,
...extraProps,
children
});
};
const Tooltip$2 = /* @__PURE__ */ React$a.forwardRef(Tooltip$1);
var PresetStatusColorTypes = tuple$1("success", "processing", "error", "default", "warning");
var PresetColorTypes = tuple$1("pink", "red", "yellow", "orange", "cyan", "green", "blue", "purple", "geekblue", "magenta", "volcano", "gold", "lime");
var autoAdjustOverflowEnabled = {
adjustX: 1,
adjustY: 1
};
var autoAdjustOverflowDisabled = {
adjustX: 0,
adjustY: 0
};
var targetOffset$1 = [0, 0];
function getOverflowOptions(autoAdjustOverflow2) {
if (typeof autoAdjustOverflow2 === "boolean") {
return autoAdjustOverflow2 ? autoAdjustOverflowEnabled : autoAdjustOverflowDisabled;
}
return _extends$3(_extends$3({}, autoAdjustOverflowDisabled), autoAdjustOverflow2);
}
function getPlacements(config) {
var _config$arrowWidth = config.arrowWidth, arrowWidth = _config$arrowWidth === void 0 ? 4 : _config$arrowWidth, _config$horizontalArr = config.horizontalArrowShift, horizontalArrowShift = _config$horizontalArr === void 0 ? 16 : _config$horizontalArr, _config$verticalArrow = config.verticalArrowShift, verticalArrowShift = _config$verticalArrow === void 0 ? 8 : _config$verticalArrow, autoAdjustOverflow2 = config.autoAdjustOverflow, arrowPointAtCenter = config.arrowPointAtCenter;
var placementMap = {
left: {
points: ["cr", "cl"],
offset: [-4, 0]
},
right: {
points: ["cl", "cr"],
offset: [4, 0]
},
top: {
points: ["bc", "tc"],
offset: [0, -4]
},
bottom: {
points: ["tc", "bc"],
offset: [0, 4]
},
topLeft: {
points: ["bl", "tc"],
offset: [-(horizontalArrowShift + arrowWidth), -4]
},
leftTop: {
points: ["tr", "cl"],
offset: [-4, -(verticalArrowShift + arrowWidth)]
},
topRight: {
points: ["br", "tc"],
offset: [horizontalArrowShift + arrowWidth, -4]
},
rightTop: {
points: ["tl", "cr"],
offset: [4, -(verticalArrowShift + arrowWidth)]
},
bottomRight: {
points: ["tr", "bc"],
offset: [horizontalArrowShift + arrowWidth, 4]
},
rightBottom: {
points: ["bl", "cr"],
offset: [4, verticalArrowShift + arrowWidth]
},
bottomLeft: {
points: ["tl", "bc"],
offset: [-(horizontalArrowShift + arrowWidth), 4]
},
leftBottom: {
points: ["br", "cl"],
offset: [-4, verticalArrowShift + arrowWidth]
}
};
Object.keys(placementMap).forEach(function(key2) {
placementMap[key2] = arrowPointAtCenter ? _extends$3(_extends$3({}, placementMap[key2]), {
overflow: getOverflowOptions(autoAdjustOverflow2),
targetOffset: targetOffset$1
}) : _extends$3(_extends$3({}, placements$3[key2]), {
overflow: getOverflowOptions(autoAdjustOverflow2)
});
placementMap[key2].ignoreShake = true;
});
return placementMap;
}
var __rest$P = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var splitObject = function splitObject2(obj, keys2) {
var picked = {};
var omitted = _extends$3({}, obj);
keys2.forEach(function(key2) {
if (obj && key2 in obj) {
picked[key2] = obj[key2];
delete omitted[key2];
}
});
return {
picked,
omitted
};
};
var PresetColorRegex$1 = new RegExp("^(".concat(PresetColorTypes.join("|"), ")(-inverse)?$"));
function getDisabledCompatibleChildren(element, prefixCls) {
var elementType = element.type;
if ((elementType.__ANT_BUTTON === true || element.type === "button") && element.props.disabled || elementType.__ANT_SWITCH === true && (element.props.disabled || element.props.loading) || elementType.__ANT_RADIO === true && element.props.disabled) {
var _splitObject = splitObject(element.props.style, ["position", "left", "right", "top", "bottom", "float", "display", "zIndex"]), picked = _splitObject.picked, omitted = _splitObject.omitted;
var spanStyle = _extends$3(_extends$3({
display: "inline-block"
}, picked), {
cursor: "not-allowed",
width: element.props.block ? "100%" : void 0
});
var buttonStyle = _extends$3(_extends$3({}, omitted), {
pointerEvents: "none"
});
var child = cloneElement(element, {
style: buttonStyle,
className: null
});
return /* @__PURE__ */ jsx("span", {
style: spanStyle,
className: classnames(element.props.className, "".concat(prefixCls, "-disabled-compatible-wrapper")),
children: child
});
}
return element;
}
var Tooltip = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _classNames2;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getContextPopupContainer = _React$useContext.getPopupContainer, getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var _useMergedState = useMergedState(false, {
value: props.open !== void 0 ? props.open : props.visible,
defaultValue: props.defaultOpen !== void 0 ? props.defaultOpen : props.defaultVisible
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), open = _useMergedState2[0], setOpen = _useMergedState2[1];
var isNoTitle = function isNoTitle2() {
var title = props.title, overlay = props.overlay;
return !title && !overlay && title !== 0;
};
var onOpenChange = function onOpenChange2(vis) {
var _a, _b;
setOpen(isNoTitle() ? false : vis);
if (!isNoTitle()) {
(_a = props.onOpenChange) === null || _a === void 0 ? void 0 : _a.call(props, vis);
(_b = props.onVisibleChange) === null || _b === void 0 ? void 0 : _b.call(props, vis);
}
};
var getTooltipPlacements = function getTooltipPlacements2() {
var builtinPlacements = props.builtinPlacements, _props$arrowPointAtCe = props.arrowPointAtCenter, arrowPointAtCenter = _props$arrowPointAtCe === void 0 ? false : _props$arrowPointAtCe, _props$autoAdjustOver = props.autoAdjustOverflow, autoAdjustOverflow2 = _props$autoAdjustOver === void 0 ? true : _props$autoAdjustOver;
return builtinPlacements || getPlacements({
arrowPointAtCenter,
autoAdjustOverflow: autoAdjustOverflow2
});
};
var onPopupAlign = function onPopupAlign2(domNode, align) {
var placements2 = getTooltipPlacements();
var placement2 = Object.keys(placements2).find(function(key2) {
var _a, _b;
return placements2[key2].points[0] === ((_a = align.points) === null || _a === void 0 ? void 0 : _a[0]) && placements2[key2].points[1] === ((_b = align.points) === null || _b === void 0 ? void 0 : _b[1]);
});
if (!placement2) {
return;
}
var rect = domNode.getBoundingClientRect();
var transformOrigin = {
top: "50%",
left: "50%"
};
if (/top|Bottom/.test(placement2)) {
transformOrigin.top = "".concat(rect.height - align.offset[1], "px");
} else if (/Top|bottom/.test(placement2)) {
transformOrigin.top = "".concat(-align.offset[1], "px");
}
if (/left|Right/.test(placement2)) {
transformOrigin.left = "".concat(rect.width - align.offset[0], "px");
} else if (/right|Left/.test(placement2)) {
transformOrigin.left = "".concat(-align.offset[0], "px");
}
domNode.style.transformOrigin = "".concat(transformOrigin.left, " ").concat(transformOrigin.top);
};
var getOverlay = function getOverlay2() {
var title = props.title, overlay = props.overlay;
if (title === 0) {
return title;
}
return overlay || title || "";
};
var getPopupContainer = props.getPopupContainer, _props$placement = props.placement, placement = _props$placement === void 0 ? "top" : _props$placement, _props$mouseEnterDela = props.mouseEnterDelay, mouseEnterDelay = _props$mouseEnterDela === void 0 ? 0.1 : _props$mouseEnterDela, _props$mouseLeaveDela = props.mouseLeaveDelay, mouseLeaveDelay = _props$mouseLeaveDela === void 0 ? 0.1 : _props$mouseLeaveDela, otherProps = __rest$P(props, ["getPopupContainer", "placement", "mouseEnterDelay", "mouseLeaveDelay"]);
var customizePrefixCls = props.prefixCls, openClassName = props.openClassName, getTooltipContainer = props.getTooltipContainer, overlayClassName = props.overlayClassName, color2 = props.color, overlayInnerStyle = props.overlayInnerStyle, children = props.children;
var prefixCls = getPrefixCls("tooltip", customizePrefixCls);
var rootPrefixCls = getPrefixCls();
var tempOpen = open;
if (!("open" in props) && !("visible" in props) && isNoTitle()) {
tempOpen = false;
}
var child = getDisabledCompatibleChildren(isValidElement(children) && !isFragment(children) ? children : /* @__PURE__ */ jsx("span", {
children
}), prefixCls);
var childProps = child.props;
var childCls = !childProps.className || typeof childProps.className === "string" ? classnames(childProps.className, _defineProperty$b({}, openClassName || "".concat(prefixCls, "-open"), true)) : childProps.className;
var customOverlayClassName = classnames(overlayClassName, (_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-rtl"), direction === "rtl"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-").concat(color2), color2 && PresetColorRegex$1.test(color2)), _classNames2));
var formattedOverlayInnerStyle = overlayInnerStyle;
var arrowContentStyle = {};
if (color2 && !PresetColorRegex$1.test(color2)) {
formattedOverlayInnerStyle = _extends$3(_extends$3({}, overlayInnerStyle), {
background: color2
});
arrowContentStyle = {
"--antd-arrow-background-color": color2
};
}
return /* @__PURE__ */ jsx(Tooltip$2, {
...otherProps,
placement,
mouseEnterDelay,
mouseLeaveDelay,
prefixCls,
overlayClassName: customOverlayClassName,
getTooltipContainer: getPopupContainer || getTooltipContainer || getContextPopupContainer,
ref,
builtinPlacements: getTooltipPlacements(),
overlay: getOverlay(),
visible: tempOpen,
onVisibleChange: onOpenChange,
onPopupAlign,
overlayInnerStyle: formattedOverlayInnerStyle,
arrowContent: /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-arrow-content"),
style: arrowContentStyle
}),
motion: {
motionName: getTransitionName(rootPrefixCls, "zoom-big-fast", props.transitionName),
motionDeadline: 1e3
},
children: tempOpen ? cloneElement(child, {
className: childCls
}) : child
});
});
const _Tooltip = Tooltip;
var getRenderPropValue = function getRenderPropValue2(propValue) {
if (!propValue) {
return null;
}
if (typeof propValue === "function") {
return propValue();
}
return propValue;
};
var __rest$O = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var Overlay$1 = function Overlay2(_ref) {
var title = _ref.title, content = _ref.content, prefixCls = _ref.prefixCls;
if (!title && !content) {
return null;
}
return /* @__PURE__ */ jsxs(Fragment, {
children: [title && /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-title"),
children: getRenderPropValue(title)
}), /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-inner-content"),
children: getRenderPropValue(content)
})]
});
};
var Popover = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var customizePrefixCls = props.prefixCls, title = props.title, content = props.content, _overlay = props._overlay, _props$placement = props.placement, placement = _props$placement === void 0 ? "top" : _props$placement, _props$trigger = props.trigger, trigger = _props$trigger === void 0 ? "hover" : _props$trigger, _props$mouseEnterDela = props.mouseEnterDelay, mouseEnterDelay = _props$mouseEnterDela === void 0 ? 0.1 : _props$mouseEnterDela, _props$mouseLeaveDela = props.mouseLeaveDelay, mouseLeaveDelay = _props$mouseLeaveDela === void 0 ? 0.1 : _props$mouseLeaveDela, _props$overlayStyle = props.overlayStyle, overlayStyle = _props$overlayStyle === void 0 ? {} : _props$overlayStyle, otherProps = __rest$O(props, ["prefixCls", "title", "content", "_overlay", "placement", "trigger", "mouseEnterDelay", "mouseLeaveDelay", "overlayStyle"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var prefixCls = getPrefixCls("popover", customizePrefixCls);
var rootPrefixCls = getPrefixCls();
return /* @__PURE__ */ jsx(_Tooltip, {
placement,
trigger,
mouseEnterDelay,
mouseLeaveDelay,
overlayStyle,
...otherProps,
prefixCls,
ref,
overlay: _overlay || /* @__PURE__ */ jsx(Overlay$1, {
prefixCls,
title,
content
}),
transitionName: getTransitionName(rootPrefixCls, "zoom-big", otherProps.transitionName)
});
});
const _Popover = Popover;
var EllipsisOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M176 511a56 56 0 10112 0 56 56 0 10-112 0zm280 0a56 56 0 10112 0 56 56 0 10-112 0zm280 0a56 56 0 10112 0 56 56 0 10-112 0z" } }] }, "name": "ellipsis", "theme": "outlined" };
const EllipsisOutlinedSvg = EllipsisOutlined$2;
var EllipsisOutlined = function EllipsisOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: EllipsisOutlinedSvg
})
});
};
EllipsisOutlined.displayName = "EllipsisOutlined";
const EllipsisOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(EllipsisOutlined);
var IdContext = /* @__PURE__ */ React__namespace.createContext(null);
function getMenuId(uuid2, eventKey) {
if (uuid2 === void 0) {
return null;
}
return "".concat(uuid2, "-").concat(eventKey);
}
function useMenuId(eventKey) {
var id2 = React__namespace.useContext(IdContext);
return getMenuId(id2, eventKey);
}
var _excluded$z = ["children", "locked"];
var MenuContext$2 = /* @__PURE__ */ React__namespace.createContext(null);
function mergeProps(origin, target) {
var clone = _objectSpread2$a({}, origin);
Object.keys(target).forEach(function(key2) {
var value = target[key2];
if (value !== void 0) {
clone[key2] = value;
}
});
return clone;
}
function InheritableContextProvider(_ref) {
var children = _ref.children, locked = _ref.locked, restProps = _objectWithoutProperties$1(_ref, _excluded$z);
var context2 = React__namespace.useContext(MenuContext$2);
var inheritableContext = useMemo(function() {
return mergeProps(context2, restProps);
}, [context2, restProps], function(prev, next) {
return !locked && (prev[0] !== next[0] || !isEqual$2(prev[1], next[1], true));
});
return /* @__PURE__ */ jsx(MenuContext$2.Provider, {
value: inheritableContext,
children
});
}
var EmptyList = [];
var PathRegisterContext = /* @__PURE__ */ React__namespace.createContext(null);
function useMeasure() {
return React__namespace.useContext(PathRegisterContext);
}
var PathTrackerContext = /* @__PURE__ */ React__namespace.createContext(EmptyList);
function useFullPath(eventKey) {
var parentKeyPath = React__namespace.useContext(PathTrackerContext);
return React__namespace.useMemo(function() {
return eventKey !== void 0 ? [].concat(_toConsumableArray$c(parentKeyPath), [eventKey]) : parentKeyPath;
}, [parentKeyPath, eventKey]);
}
var PathUserContext = /* @__PURE__ */ React__namespace.createContext(null);
var PrivateContext = /* @__PURE__ */ React__namespace.createContext({});
function focusable(node) {
var includePositive = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
if (isVisible(node)) {
var nodeName = node.nodeName.toLowerCase();
var isFocusableElement = ["input", "select", "textarea", "button"].includes(nodeName) || node.isContentEditable || nodeName === "a" && !!node.getAttribute("href");
var tabIndexAttr = node.getAttribute("tabindex");
var tabIndexNum = Number(tabIndexAttr);
var tabIndex = null;
if (tabIndexAttr && !Number.isNaN(tabIndexNum)) {
tabIndex = tabIndexNum;
} else if (isFocusableElement && tabIndex === null) {
tabIndex = 0;
}
if (isFocusableElement && node.disabled) {
tabIndex = null;
}
return tabIndex !== null && (tabIndex >= 0 || includePositive && tabIndex < 0);
}
return false;
}
function getFocusNodeList(node) {
var includePositive = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
var res = _toConsumableArray$c(node.querySelectorAll("*")).filter(function(child) {
return focusable(child, includePositive);
});
if (focusable(node, includePositive)) {
res.unshift(node);
}
return res;
}
var LEFT = KeyCode.LEFT, RIGHT = KeyCode.RIGHT, UP = KeyCode.UP, DOWN = KeyCode.DOWN, ENTER = KeyCode.ENTER, ESC$1 = KeyCode.ESC, HOME = KeyCode.HOME, END = KeyCode.END;
var ArrowKeys = [UP, DOWN, LEFT, RIGHT];
function getOffset$2(mode, isRootLevel, isRtl, which) {
var _inline, _horizontal, _vertical, _offsets;
var prev = "prev";
var next = "next";
var children = "children";
var parent2 = "parent";
if (mode === "inline" && which === ENTER) {
return {
inlineTrigger: true
};
}
var inline2 = (_inline = {}, _defineProperty$b(_inline, UP, prev), _defineProperty$b(_inline, DOWN, next), _inline);
var horizontal = (_horizontal = {}, _defineProperty$b(_horizontal, LEFT, isRtl ? next : prev), _defineProperty$b(_horizontal, RIGHT, isRtl ? prev : next), _defineProperty$b(_horizontal, DOWN, children), _defineProperty$b(_horizontal, ENTER, children), _horizontal);
var vertical = (_vertical = {}, _defineProperty$b(_vertical, UP, prev), _defineProperty$b(_vertical, DOWN, next), _defineProperty$b(_vertical, ENTER, children), _defineProperty$b(_vertical, ESC$1, parent2), _defineProperty$b(_vertical, LEFT, isRtl ? children : parent2), _defineProperty$b(_vertical, RIGHT, isRtl ? parent2 : children), _vertical);
var offsets = {
inline: inline2,
horizontal,
vertical,
inlineSub: inline2,
horizontalSub: vertical,
verticalSub: vertical
};
var type2 = (_offsets = offsets["".concat(mode).concat(isRootLevel ? "" : "Sub")]) === null || _offsets === void 0 ? void 0 : _offsets[which];
switch (type2) {
case prev:
return {
offset: -1,
sibling: true
};
case next:
return {
offset: 1,
sibling: true
};
case parent2:
return {
offset: -1,
sibling: false
};
case children:
return {
offset: 1,
sibling: false
};
default:
return null;
}
}
function findContainerUL(element) {
var current = element;
while (current) {
if (current.getAttribute("data-menu-list")) {
return current;
}
current = current.parentElement;
}
return null;
}
function getFocusElement(activeElement, elements) {
var current = activeElement || document.activeElement;
while (current) {
if (elements.has(current)) {
return current;
}
current = current.parentElement;
}
return null;
}
function getFocusableElements(container, elements) {
var list = getFocusNodeList(container, true);
return list.filter(function(ele) {
return elements.has(ele);
});
}
function getNextFocusElement(parentQueryContainer, elements, focusMenuElement) {
var offset2 = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : 1;
if (!parentQueryContainer) {
return null;
}
var sameLevelFocusableMenuElementList = getFocusableElements(parentQueryContainer, elements);
var count = sameLevelFocusableMenuElementList.length;
var focusIndex = sameLevelFocusableMenuElementList.findIndex(function(ele) {
return focusMenuElement === ele;
});
if (offset2 < 0) {
if (focusIndex === -1) {
focusIndex = count - 1;
} else {
focusIndex -= 1;
}
} else if (offset2 > 0) {
focusIndex += 1;
}
focusIndex = (focusIndex + count) % count;
return sameLevelFocusableMenuElementList[focusIndex];
}
function useAccessibility$1(mode, activeKey, isRtl, id2, containerRef, getKeys2, getKeyPath, triggerActiveKey, triggerAccessibilityOpen, originOnKeyDown) {
var rafRef = React__namespace.useRef();
var activeRef = React__namespace.useRef();
activeRef.current = activeKey;
var cleanRaf = function cleanRaf2() {
wrapperRaf$1.cancel(rafRef.current);
};
React__namespace.useEffect(function() {
return function() {
cleanRaf();
};
}, []);
return function(e2) {
var which = e2.which;
if ([].concat(ArrowKeys, [ENTER, ESC$1, HOME, END]).includes(which)) {
var elements;
var key2element;
var element2key;
var refreshElements = function refreshElements2() {
elements = /* @__PURE__ */ new Set();
key2element = /* @__PURE__ */ new Map();
element2key = /* @__PURE__ */ new Map();
var keys2 = getKeys2();
keys2.forEach(function(key2) {
var element = document.querySelector("[data-menu-id='".concat(getMenuId(id2, key2), "']"));
if (element) {
elements.add(element);
element2key.set(element, key2);
key2element.set(key2, element);
}
});
return elements;
};
refreshElements();
var activeElement = key2element.get(activeKey);
var focusMenuElement = getFocusElement(activeElement, elements);
var focusMenuKey = element2key.get(focusMenuElement);
var offsetObj = getOffset$2(mode, getKeyPath(focusMenuKey, true).length === 1, isRtl, which);
if (!offsetObj && which !== HOME && which !== END) {
return;
}
if (ArrowKeys.includes(which) || [HOME, END].includes(which)) {
e2.preventDefault();
}
var tryFocus = function tryFocus2(menuElement) {
if (menuElement) {
var focusTargetElement = menuElement;
var link2 = menuElement.querySelector("a");
if (link2 !== null && link2 !== void 0 && link2.getAttribute("href")) {
focusTargetElement = link2;
}
var targetKey = element2key.get(menuElement);
triggerActiveKey(targetKey);
cleanRaf();
rafRef.current = wrapperRaf$1(function() {
if (activeRef.current === targetKey) {
focusTargetElement.focus();
}
});
}
};
if ([HOME, END].includes(which) || offsetObj.sibling || !focusMenuElement) {
var parentQueryContainer;
if (!focusMenuElement || mode === "inline") {
parentQueryContainer = containerRef.current;
} else {
parentQueryContainer = findContainerUL(focusMenuElement);
}
var targetElement;
var focusableElements = getFocusableElements(parentQueryContainer, elements);
if (which === HOME) {
targetElement = focusableElements[0];
} else if (which === END) {
targetElement = focusableElements[focusableElements.length - 1];
} else {
targetElement = getNextFocusElement(parentQueryContainer, elements, focusMenuElement, offsetObj.offset);
}
tryFocus(targetElement);
} else if (offsetObj.inlineTrigger) {
triggerAccessibilityOpen(focusMenuKey);
} else if (offsetObj.offset > 0) {
triggerAccessibilityOpen(focusMenuKey, true);
cleanRaf();
rafRef.current = wrapperRaf$1(function() {
refreshElements();
var controlId = focusMenuElement.getAttribute("aria-controls");
var subQueryContainer = document.getElementById(controlId);
var targetElement2 = getNextFocusElement(subQueryContainer, elements);
tryFocus(targetElement2);
}, 5);
} else if (offsetObj.offset < 0) {
var keyPath = getKeyPath(focusMenuKey, true);
var parentKey = keyPath[keyPath.length - 2];
var parentMenuElement = key2element.get(parentKey);
triggerAccessibilityOpen(parentKey, false);
tryFocus(parentMenuElement);
}
}
originOnKeyDown === null || originOnKeyDown === void 0 ? void 0 : originOnKeyDown(e2);
};
}
function nextSlice(callback) {
Promise.resolve().then(callback);
}
var PATH_SPLIT = "__RC_UTIL_PATH_SPLIT__";
var getPathStr = function getPathStr2(keyPath) {
return keyPath.join(PATH_SPLIT);
};
var getPathKeys = function getPathKeys2(keyPathStr) {
return keyPathStr.split(PATH_SPLIT);
};
var OVERFLOW_KEY = "rc-menu-more";
function useKeyRecords() {
var _React$useState = React__namespace.useState({}), _React$useState2 = _slicedToArray$e(_React$useState, 2), internalForceUpdate = _React$useState2[1];
var key2pathRef = React$a.useRef(/* @__PURE__ */ new Map());
var path2keyRef = React$a.useRef(/* @__PURE__ */ new Map());
var _React$useState3 = React__namespace.useState([]), _React$useState4 = _slicedToArray$e(_React$useState3, 2), overflowKeys = _React$useState4[0], setOverflowKeys = _React$useState4[1];
var updateRef = React$a.useRef(0);
var destroyRef = React$a.useRef(false);
var forceUpdate = function forceUpdate2() {
if (!destroyRef.current) {
internalForceUpdate({});
}
};
var registerPath = React$a.useCallback(function(key2, keyPath) {
var connectedPath = getPathStr(keyPath);
path2keyRef.current.set(connectedPath, key2);
key2pathRef.current.set(key2, connectedPath);
updateRef.current += 1;
var id2 = updateRef.current;
nextSlice(function() {
if (id2 === updateRef.current) {
forceUpdate();
}
});
}, []);
var unregisterPath = React$a.useCallback(function(key2, keyPath) {
var connectedPath = getPathStr(keyPath);
path2keyRef.current.delete(connectedPath);
key2pathRef.current.delete(key2);
}, []);
var refreshOverflowKeys = React$a.useCallback(function(keys2) {
setOverflowKeys(keys2);
}, []);
var getKeyPath = React$a.useCallback(function(eventKey, includeOverflow) {
var fullPath = key2pathRef.current.get(eventKey) || "";
var keys2 = getPathKeys(fullPath);
if (includeOverflow && overflowKeys.includes(keys2[0])) {
keys2.unshift(OVERFLOW_KEY);
}
return keys2;
}, [overflowKeys]);
var isSubPathKey = React$a.useCallback(function(pathKeys, eventKey) {
return pathKeys.some(function(pathKey) {
var pathKeyList = getKeyPath(pathKey, true);
return pathKeyList.includes(eventKey);
});
}, [getKeyPath]);
var getKeys2 = function getKeys3() {
var keys2 = _toConsumableArray$c(key2pathRef.current.keys());
if (overflowKeys.length) {
keys2.push(OVERFLOW_KEY);
}
return keys2;
};
var getSubPathKeys = React$a.useCallback(function(key2) {
var connectedPath = "".concat(key2pathRef.current.get(key2)).concat(PATH_SPLIT);
var pathKeys = /* @__PURE__ */ new Set();
_toConsumableArray$c(path2keyRef.current.keys()).forEach(function(pathKey) {
if (pathKey.startsWith(connectedPath)) {
pathKeys.add(path2keyRef.current.get(pathKey));
}
});
return pathKeys;
}, []);
React__namespace.useEffect(function() {
return function() {
destroyRef.current = true;
};
}, []);
return {
registerPath,
unregisterPath,
refreshOverflowKeys,
isSubPathKey,
getKeyPath,
getKeys: getKeys2,
getSubPathKeys
};
}
function useMemoCallback(func) {
var funRef = React__namespace.useRef(func);
funRef.current = func;
var callback = React__namespace.useCallback(function() {
var _funRef$current;
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return (_funRef$current = funRef.current) === null || _funRef$current === void 0 ? void 0 : _funRef$current.call.apply(_funRef$current, [funRef].concat(args));
}, []);
return func ? callback : void 0;
}
var uniquePrefix = Math.random().toFixed(5).toString().slice(2);
var internalId = 0;
function useUUID(id2) {
var _useMergedState = useMergedState(id2, {
value: id2
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), uuid2 = _useMergedState2[0], setUUID = _useMergedState2[1];
React__namespace.useEffect(function() {
internalId += 1;
var newId = "".concat(uniquePrefix, "-").concat(internalId);
setUUID("rc-menu-uuid-".concat(newId));
}, []);
return uuid2;
}
function useActive(eventKey, disabled, onMouseEnter, onMouseLeave) {
var _React$useContext = React__namespace.useContext(MenuContext$2), activeKey = _React$useContext.activeKey, onActive = _React$useContext.onActive, onInactive = _React$useContext.onInactive;
var ret = {
active: activeKey === eventKey
};
if (!disabled) {
ret.onMouseEnter = function(domEvent) {
onMouseEnter === null || onMouseEnter === void 0 ? void 0 : onMouseEnter({
key: eventKey,
domEvent
});
onActive(eventKey);
};
ret.onMouseLeave = function(domEvent) {
onMouseLeave === null || onMouseLeave === void 0 ? void 0 : onMouseLeave({
key: eventKey,
domEvent
});
onInactive(eventKey);
};
}
return ret;
}
function useDirectionStyle(level) {
var _React$useContext = React__namespace.useContext(MenuContext$2), mode = _React$useContext.mode, rtl2 = _React$useContext.rtl, inlineIndent = _React$useContext.inlineIndent;
if (mode !== "inline") {
return null;
}
var len = level;
return rtl2 ? {
paddingRight: len * inlineIndent
} : {
paddingLeft: len * inlineIndent
};
}
function Icon(_ref) {
var icon = _ref.icon, props = _ref.props, children = _ref.children;
var iconNode;
if (typeof icon === "function") {
iconNode = /* @__PURE__ */ React__namespace.createElement(icon, _objectSpread2$a({}, props));
} else {
iconNode = icon;
}
return iconNode || children || null;
}
var _excluded$y = ["item"];
function warnItemProp(_ref) {
var item = _ref.item, restInfo = _objectWithoutProperties$1(_ref, _excluded$y);
Object.defineProperty(restInfo, "item", {
get: function get2() {
warningOnce(false, "`info.item` is deprecated since we will move to function component that not provides React Node instance in future.");
return item;
}
});
return restInfo;
}
var _excluded$x = ["title", "attribute", "elementRef"], _excluded2$6 = ["style", "className", "eventKey", "warnKey", "disabled", "itemIcon", "children", "role", "onMouseEnter", "onMouseLeave", "onClick", "onKeyDown", "onFocus"], _excluded3 = ["active"];
var LegacyMenuItem = /* @__PURE__ */ function(_React$Component) {
_inherits(LegacyMenuItem2, _React$Component);
var _super = _createSuper(LegacyMenuItem2);
function LegacyMenuItem2() {
_classCallCheck(this, LegacyMenuItem2);
return _super.apply(this, arguments);
}
_createClass(LegacyMenuItem2, [{
key: "render",
value: function render2() {
var _this$props = this.props, title = _this$props.title, attribute = _this$props.attribute, elementRef = _this$props.elementRef, restProps = _objectWithoutProperties$1(_this$props, _excluded$x);
var passedProps = omit(restProps, ["eventKey", "popupClassName", "popupOffset", "onTitleClick"]);
warningOnce(!attribute, "`attribute` of Menu.Item is deprecated. Please pass attribute directly.");
return /* @__PURE__ */ jsx(ForwardOverflow.Item, {
...attribute,
title: typeof title === "string" ? title : void 0,
...passedProps,
ref: elementRef
});
}
}]);
return LegacyMenuItem2;
}(React__namespace.Component);
var InternalMenuItem = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _classNames;
var style2 = props.style, className = props.className, eventKey = props.eventKey;
props.warnKey;
var disabled = props.disabled, itemIcon = props.itemIcon, children = props.children, role = props.role, onMouseEnter = props.onMouseEnter, onMouseLeave = props.onMouseLeave, onClick = props.onClick, onKeyDown2 = props.onKeyDown, onFocus = props.onFocus, restProps = _objectWithoutProperties$1(props, _excluded2$6);
var domDataId = useMenuId(eventKey);
var _React$useContext = React__namespace.useContext(MenuContext$2), prefixCls = _React$useContext.prefixCls, onItemClick = _React$useContext.onItemClick, contextDisabled = _React$useContext.disabled, overflowDisabled = _React$useContext.overflowDisabled, contextItemIcon = _React$useContext.itemIcon, selectedKeys = _React$useContext.selectedKeys, onActive = _React$useContext.onActive;
var _React$useContext2 = React__namespace.useContext(PrivateContext), _internalRenderMenuItem = _React$useContext2._internalRenderMenuItem;
var itemCls = "".concat(prefixCls, "-item");
var legacyMenuItemRef = React__namespace.useRef();
var elementRef = React__namespace.useRef();
var mergedDisabled = contextDisabled || disabled;
var mergedEleRef = useComposeRef(ref, elementRef);
var connectedKeys = useFullPath(eventKey);
var getEventInfo = function getEventInfo2(e2) {
return {
key: eventKey,
keyPath: _toConsumableArray$c(connectedKeys).reverse(),
item: legacyMenuItemRef.current,
domEvent: e2
};
};
var mergedItemIcon = itemIcon || contextItemIcon;
var _useActive = useActive(eventKey, mergedDisabled, onMouseEnter, onMouseLeave), active = _useActive.active, activeProps = _objectWithoutProperties$1(_useActive, _excluded3);
var selected = selectedKeys.includes(eventKey);
var directionStyle = useDirectionStyle(connectedKeys.length);
var onInternalClick = function onInternalClick2(e2) {
if (mergedDisabled) {
return;
}
var info = getEventInfo(e2);
onClick === null || onClick === void 0 ? void 0 : onClick(warnItemProp(info));
onItemClick(info);
};
var onInternalKeyDown = function onInternalKeyDown2(e2) {
onKeyDown2 === null || onKeyDown2 === void 0 ? void 0 : onKeyDown2(e2);
if (e2.which === KeyCode.ENTER) {
var info = getEventInfo(e2);
onClick === null || onClick === void 0 ? void 0 : onClick(warnItemProp(info));
onItemClick(info);
}
};
var onInternalFocus = function onInternalFocus2(e2) {
onActive(eventKey);
onFocus === null || onFocus === void 0 ? void 0 : onFocus(e2);
};
var optionRoleProps = {};
if (props.role === "option") {
optionRoleProps["aria-selected"] = selected;
}
var renderNode = /* @__PURE__ */ jsxs(LegacyMenuItem, {
ref: legacyMenuItemRef,
elementRef: mergedEleRef,
role: role === null ? "none" : role || "menuitem",
tabIndex: disabled ? null : -1,
"data-menu-id": overflowDisabled && domDataId ? null : domDataId,
...restProps,
...activeProps,
...optionRoleProps,
component: "li",
"aria-disabled": disabled,
style: _objectSpread2$a(_objectSpread2$a({}, directionStyle), style2),
className: classnames(itemCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(itemCls, "-active"), active), _defineProperty$b(_classNames, "".concat(itemCls, "-selected"), selected), _defineProperty$b(_classNames, "".concat(itemCls, "-disabled"), mergedDisabled), _classNames), className),
onClick: onInternalClick,
onKeyDown: onInternalKeyDown,
onFocus: onInternalFocus,
children: [children, /* @__PURE__ */ jsx(Icon, {
props: _objectSpread2$a(_objectSpread2$a({}, props), {}, {
isSelected: selected
}),
icon: mergedItemIcon
})]
});
if (_internalRenderMenuItem) {
renderNode = _internalRenderMenuItem(renderNode, props, {
selected
});
}
return renderNode;
});
function MenuItem$1(props, ref) {
var eventKey = props.eventKey;
var measure = useMeasure();
var connectedKeyPath = useFullPath(eventKey);
React__namespace.useEffect(function() {
if (measure) {
measure.registerPath(eventKey, connectedKeyPath);
return function() {
measure.unregisterPath(eventKey, connectedKeyPath);
};
}
}, [connectedKeyPath]);
if (measure) {
return null;
}
return /* @__PURE__ */ jsx(InternalMenuItem, {
...props,
ref
});
}
const MenuItem$2 = /* @__PURE__ */ React__namespace.forwardRef(MenuItem$1);
var _excluded$w = ["className", "children"];
var InternalSubMenuList = function InternalSubMenuList2(_ref, ref) {
var className = _ref.className, children = _ref.children, restProps = _objectWithoutProperties$1(_ref, _excluded$w);
var _React$useContext = React__namespace.useContext(MenuContext$2), prefixCls = _React$useContext.prefixCls, mode = _React$useContext.mode, rtl2 = _React$useContext.rtl;
return /* @__PURE__ */ jsx("ul", {
className: classnames(prefixCls, rtl2 && "".concat(prefixCls, "-rtl"), "".concat(prefixCls, "-sub"), "".concat(prefixCls, "-").concat(mode === "inline" ? "inline" : "vertical"), className),
role: "menu",
...restProps,
"data-menu-list": true,
ref,
children
});
};
var SubMenuList = /* @__PURE__ */ React__namespace.forwardRef(InternalSubMenuList);
SubMenuList.displayName = "SubMenuList";
var _excluded$v = ["label", "children", "key", "type"];
function parseChildren(children, keyPath) {
return toArray$9(children).map(function(child, index2) {
if (/* @__PURE__ */ React__namespace.isValidElement(child)) {
var _eventKey, _child$props;
var key2 = child.key;
var eventKey = (_eventKey = (_child$props = child.props) === null || _child$props === void 0 ? void 0 : _child$props.eventKey) !== null && _eventKey !== void 0 ? _eventKey : key2;
var emptyKey = eventKey === null || eventKey === void 0;
if (emptyKey) {
eventKey = "tmp_key-".concat([].concat(_toConsumableArray$c(keyPath), [index2]).join("-"));
}
var cloneProps = {
key: eventKey,
eventKey
};
return /* @__PURE__ */ React__namespace.cloneElement(child, cloneProps);
}
return child;
});
}
function convertItemsToNodes$1(list) {
return (list || []).map(function(opt, index2) {
if (opt && _typeof$q(opt) === "object") {
var _ref = opt, label = _ref.label, children = _ref.children, key2 = _ref.key, type2 = _ref.type, restProps = _objectWithoutProperties$1(_ref, _excluded$v);
var mergedKey = key2 !== null && key2 !== void 0 ? key2 : "tmp-".concat(index2);
if (children || type2 === "group") {
if (type2 === "group") {
return /* @__PURE__ */ jsx(MenuItemGroup, {
...restProps,
title: label,
children: convertItemsToNodes$1(children)
}, mergedKey);
}
return /* @__PURE__ */ jsx(SubMenu$1, {
...restProps,
title: label,
children: convertItemsToNodes$1(children)
}, mergedKey);
}
if (type2 === "divider") {
return /* @__PURE__ */ jsx(Divider$1, {
...restProps
}, mergedKey);
}
return /* @__PURE__ */ jsx(MenuItem$2, {
...restProps,
children: label
}, mergedKey);
}
return null;
}).filter(function(opt) {
return opt;
});
}
function parseItems(children, items, keyPath) {
var childNodes = children;
if (items) {
childNodes = convertItemsToNodes$1(items);
}
return parseChildren(childNodes, keyPath);
}
var autoAdjustOverflow$1 = {
adjustX: 1,
adjustY: 1
};
var placements$2 = {
topLeft: {
points: ["bl", "tl"],
overflow: autoAdjustOverflow$1,
offset: [0, -7]
},
bottomLeft: {
points: ["tl", "bl"],
overflow: autoAdjustOverflow$1,
offset: [0, 7]
},
leftTop: {
points: ["tr", "tl"],
overflow: autoAdjustOverflow$1,
offset: [-4, 0]
},
rightTop: {
points: ["tl", "tr"],
overflow: autoAdjustOverflow$1,
offset: [4, 0]
}
};
var placementsRtl = {
topLeft: {
points: ["bl", "tl"],
overflow: autoAdjustOverflow$1,
offset: [0, -7]
},
bottomLeft: {
points: ["tl", "bl"],
overflow: autoAdjustOverflow$1,
offset: [0, 7]
},
rightTop: {
points: ["tr", "tl"],
overflow: autoAdjustOverflow$1,
offset: [-4, 0]
},
leftTop: {
points: ["tl", "tr"],
overflow: autoAdjustOverflow$1,
offset: [4, 0]
}
};
function getMotion(mode, motion2, defaultMotions) {
if (motion2) {
return motion2;
}
if (defaultMotions) {
return defaultMotions[mode] || defaultMotions.other;
}
return void 0;
}
var popupPlacementMap = {
horizontal: "bottomLeft",
vertical: "rightTop",
"vertical-left": "rightTop",
"vertical-right": "leftTop"
};
function PopupTrigger(_ref) {
var prefixCls = _ref.prefixCls, visible = _ref.visible, children = _ref.children, popup = _ref.popup, popupClassName = _ref.popupClassName, popupOffset = _ref.popupOffset, disabled = _ref.disabled, mode = _ref.mode, onVisibleChange = _ref.onVisibleChange;
var _React$useContext = React__namespace.useContext(MenuContext$2), getPopupContainer = _React$useContext.getPopupContainer, rtl2 = _React$useContext.rtl, subMenuOpenDelay = _React$useContext.subMenuOpenDelay, subMenuCloseDelay = _React$useContext.subMenuCloseDelay, builtinPlacements = _React$useContext.builtinPlacements, triggerSubMenuAction = _React$useContext.triggerSubMenuAction, forceSubMenuRender = _React$useContext.forceSubMenuRender, rootClassName = _React$useContext.rootClassName, motion2 = _React$useContext.motion, defaultMotions = _React$useContext.defaultMotions;
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), innerVisible = _React$useState2[0], setInnerVisible = _React$useState2[1];
var placement = rtl2 ? _objectSpread2$a(_objectSpread2$a({}, placementsRtl), builtinPlacements) : _objectSpread2$a(_objectSpread2$a({}, placements$2), builtinPlacements);
var popupPlacement = popupPlacementMap[mode];
var targetMotion = getMotion(mode, motion2, defaultMotions);
var targetMotionRef = React__namespace.useRef(targetMotion);
if (mode !== "inline") {
targetMotionRef.current = targetMotion;
}
var mergedMotion = _objectSpread2$a(_objectSpread2$a({}, targetMotionRef.current), {}, {
leavedClassName: "".concat(prefixCls, "-hidden"),
removeOnLeave: false,
motionAppear: true
});
var visibleRef = React__namespace.useRef();
React__namespace.useEffect(function() {
visibleRef.current = wrapperRaf$1(function() {
setInnerVisible(visible);
});
return function() {
wrapperRaf$1.cancel(visibleRef.current);
};
}, [visible]);
return /* @__PURE__ */ jsx(Trigger$1, {
prefixCls,
popupClassName: classnames("".concat(prefixCls, "-popup"), _defineProperty$b({}, "".concat(prefixCls, "-rtl"), rtl2), popupClassName, rootClassName),
stretch: mode === "horizontal" ? "minWidth" : null,
getPopupContainer,
builtinPlacements: placement,
popupPlacement,
popupVisible: innerVisible,
popup,
popupAlign: popupOffset && {
offset: popupOffset
},
action: disabled ? [] : [triggerSubMenuAction],
mouseEnterDelay: subMenuOpenDelay,
mouseLeaveDelay: subMenuCloseDelay,
onPopupVisibleChange: onVisibleChange,
forceRender: forceSubMenuRender,
popupMotion: mergedMotion,
children
});
}
function InlineSubMenuList(_ref) {
var id2 = _ref.id, open = _ref.open, keyPath = _ref.keyPath, children = _ref.children;
var fixedMode = "inline";
var _React$useContext = React__namespace.useContext(MenuContext$2), prefixCls = _React$useContext.prefixCls, forceSubMenuRender = _React$useContext.forceSubMenuRender, motion2 = _React$useContext.motion, defaultMotions = _React$useContext.defaultMotions, mode = _React$useContext.mode;
var sameModeRef = React__namespace.useRef(false);
sameModeRef.current = mode === fixedMode;
var _React$useState = React__namespace.useState(!sameModeRef.current), _React$useState2 = _slicedToArray$e(_React$useState, 2), destroy = _React$useState2[0], setDestroy = _React$useState2[1];
var mergedOpen = sameModeRef.current ? open : false;
React__namespace.useEffect(function() {
if (sameModeRef.current) {
setDestroy(false);
}
}, [mode]);
var mergedMotion = _objectSpread2$a({}, getMotion(fixedMode, motion2, defaultMotions));
if (keyPath.length > 1) {
mergedMotion.motionAppear = false;
}
var originOnVisibleChanged = mergedMotion.onVisibleChanged;
mergedMotion.onVisibleChanged = function(newVisible) {
if (!sameModeRef.current && !newVisible) {
setDestroy(true);
}
return originOnVisibleChanged === null || originOnVisibleChanged === void 0 ? void 0 : originOnVisibleChanged(newVisible);
};
if (destroy) {
return null;
}
return /* @__PURE__ */ jsx(InheritableContextProvider, {
mode: fixedMode,
locked: !sameModeRef.current,
children: /* @__PURE__ */ jsx(CSSMotion, {
visible: mergedOpen,
...mergedMotion,
forceRender: forceSubMenuRender,
removeOnLeave: false,
leavedClassName: "".concat(prefixCls, "-hidden"),
children: function(_ref2) {
var motionClassName = _ref2.className, motionStyle = _ref2.style;
return /* @__PURE__ */ jsx(SubMenuList, {
id: id2,
className: motionClassName,
style: motionStyle,
children
});
}
})
});
}
var _excluded$u = ["style", "className", "title", "eventKey", "warnKey", "disabled", "internalPopupClose", "children", "itemIcon", "expandIcon", "popupClassName", "popupOffset", "onClick", "onMouseEnter", "onMouseLeave", "onTitleClick", "onTitleMouseEnter", "onTitleMouseLeave"], _excluded2$5 = ["active"];
var InternalSubMenu = function InternalSubMenu2(props) {
var _classNames;
var style2 = props.style, className = props.className, title = props.title, eventKey = props.eventKey;
props.warnKey;
var disabled = props.disabled, internalPopupClose = props.internalPopupClose, children = props.children, itemIcon = props.itemIcon, expandIcon = props.expandIcon, popupClassName = props.popupClassName, popupOffset = props.popupOffset, onClick = props.onClick, onMouseEnter = props.onMouseEnter, onMouseLeave = props.onMouseLeave, onTitleClick = props.onTitleClick, onTitleMouseEnter = props.onTitleMouseEnter, onTitleMouseLeave = props.onTitleMouseLeave, restProps = _objectWithoutProperties$1(props, _excluded$u);
var domDataId = useMenuId(eventKey);
var _React$useContext = React__namespace.useContext(MenuContext$2), prefixCls = _React$useContext.prefixCls, mode = _React$useContext.mode, openKeys = _React$useContext.openKeys, contextDisabled = _React$useContext.disabled, overflowDisabled = _React$useContext.overflowDisabled, activeKey = _React$useContext.activeKey, selectedKeys = _React$useContext.selectedKeys, contextItemIcon = _React$useContext.itemIcon, contextExpandIcon = _React$useContext.expandIcon, onItemClick = _React$useContext.onItemClick, onOpenChange = _React$useContext.onOpenChange, onActive = _React$useContext.onActive;
var _React$useContext2 = React__namespace.useContext(PrivateContext), _internalRenderSubMenuItem = _React$useContext2._internalRenderSubMenuItem;
var _React$useContext3 = React__namespace.useContext(PathUserContext), isSubPathKey = _React$useContext3.isSubPathKey;
var connectedPath = useFullPath();
var subMenuPrefixCls = "".concat(prefixCls, "-submenu");
var mergedDisabled = contextDisabled || disabled;
var elementRef = React__namespace.useRef();
var popupRef = React__namespace.useRef();
var mergedItemIcon = itemIcon || contextItemIcon;
var mergedExpandIcon = expandIcon || contextExpandIcon;
var originOpen = openKeys.includes(eventKey);
var open = !overflowDisabled && originOpen;
var childrenSelected = isSubPathKey(selectedKeys, eventKey);
var _useActive = useActive(eventKey, mergedDisabled, onTitleMouseEnter, onTitleMouseLeave), active = _useActive.active, activeProps = _objectWithoutProperties$1(_useActive, _excluded2$5);
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), childrenActive = _React$useState2[0], setChildrenActive = _React$useState2[1];
var triggerChildrenActive = function triggerChildrenActive2(newActive) {
if (!mergedDisabled) {
setChildrenActive(newActive);
}
};
var onInternalMouseEnter = function onInternalMouseEnter2(domEvent) {
triggerChildrenActive(true);
onMouseEnter === null || onMouseEnter === void 0 ? void 0 : onMouseEnter({
key: eventKey,
domEvent
});
};
var onInternalMouseLeave = function onInternalMouseLeave2(domEvent) {
triggerChildrenActive(false);
onMouseLeave === null || onMouseLeave === void 0 ? void 0 : onMouseLeave({
key: eventKey,
domEvent
});
};
var mergedActive = React__namespace.useMemo(function() {
if (active) {
return active;
}
if (mode !== "inline") {
return childrenActive || isSubPathKey([activeKey], eventKey);
}
return false;
}, [mode, active, activeKey, childrenActive, eventKey, isSubPathKey]);
var directionStyle = useDirectionStyle(connectedPath.length);
var onInternalTitleClick = function onInternalTitleClick2(e2) {
if (mergedDisabled) {
return;
}
onTitleClick === null || onTitleClick === void 0 ? void 0 : onTitleClick({
key: eventKey,
domEvent: e2
});
if (mode === "inline") {
onOpenChange(eventKey, !originOpen);
}
};
var onMergedItemClick = useMemoCallback(function(info) {
onClick === null || onClick === void 0 ? void 0 : onClick(warnItemProp(info));
onItemClick(info);
});
var onPopupVisibleChange = function onPopupVisibleChange2(newVisible) {
if (mode !== "inline") {
onOpenChange(eventKey, newVisible);
}
};
var onInternalFocus = function onInternalFocus2() {
onActive(eventKey);
};
var popupId = domDataId && "".concat(domDataId, "-popup");
var titleNode = /* @__PURE__ */ jsxs("div", {
role: "menuitem",
style: directionStyle,
className: "".concat(subMenuPrefixCls, "-title"),
tabIndex: mergedDisabled ? null : -1,
ref: elementRef,
title: typeof title === "string" ? title : null,
"data-menu-id": overflowDisabled && domDataId ? null : domDataId,
"aria-expanded": open,
"aria-haspopup": true,
"aria-controls": popupId,
"aria-disabled": mergedDisabled,
onClick: onInternalTitleClick,
onFocus: onInternalFocus,
...activeProps,
children: [title, /* @__PURE__ */ jsx(Icon, {
icon: mode !== "horizontal" ? mergedExpandIcon : null,
props: _objectSpread2$a(_objectSpread2$a({}, props), {}, {
isOpen: open,
isSubMenu: true
}),
children: /* @__PURE__ */ jsx("i", {
className: "".concat(subMenuPrefixCls, "-arrow")
})
})]
});
var triggerModeRef = React__namespace.useRef(mode);
if (mode !== "inline" && connectedPath.length > 1) {
triggerModeRef.current = "vertical";
} else {
triggerModeRef.current = mode;
}
if (!overflowDisabled) {
var triggerMode = triggerModeRef.current;
titleNode = /* @__PURE__ */ jsx(PopupTrigger, {
mode: triggerMode,
prefixCls: subMenuPrefixCls,
visible: !internalPopupClose && open && mode !== "inline",
popupClassName,
popupOffset,
popup: /* @__PURE__ */ jsx(InheritableContextProvider, {
mode: triggerMode === "horizontal" ? "vertical" : triggerMode,
children: /* @__PURE__ */ jsx(SubMenuList, {
id: popupId,
ref: popupRef,
children
})
}),
disabled: mergedDisabled,
onVisibleChange: onPopupVisibleChange,
children: titleNode
});
}
var listNode = /* @__PURE__ */ jsxs(ForwardOverflow.Item, {
role: "none",
...restProps,
component: "li",
style: style2,
className: classnames(subMenuPrefixCls, "".concat(subMenuPrefixCls, "-").concat(mode), className, (_classNames = {}, _defineProperty$b(_classNames, "".concat(subMenuPrefixCls, "-open"), open), _defineProperty$b(_classNames, "".concat(subMenuPrefixCls, "-active"), mergedActive), _defineProperty$b(_classNames, "".concat(subMenuPrefixCls, "-selected"), childrenSelected), _defineProperty$b(_classNames, "".concat(subMenuPrefixCls, "-disabled"), mergedDisabled), _classNames)),
onMouseEnter: onInternalMouseEnter,
onMouseLeave: onInternalMouseLeave,
children: [titleNode, !overflowDisabled && /* @__PURE__ */ jsx(InlineSubMenuList, {
id: popupId,
open,
keyPath: connectedPath,
children
})]
});
if (_internalRenderSubMenuItem) {
listNode = _internalRenderSubMenuItem(listNode, props, {
selected: childrenSelected,
active: mergedActive,
open,
disabled: mergedDisabled
});
}
return /* @__PURE__ */ jsx(InheritableContextProvider, {
onItemClick: onMergedItemClick,
mode: mode === "horizontal" ? "vertical" : mode,
itemIcon: mergedItemIcon,
expandIcon: mergedExpandIcon,
children: listNode
});
};
function SubMenu$1(props) {
var eventKey = props.eventKey, children = props.children;
var connectedKeyPath = useFullPath(eventKey);
var childList = parseChildren(children, connectedKeyPath);
var measure = useMeasure();
React__namespace.useEffect(function() {
if (measure) {
measure.registerPath(eventKey, connectedKeyPath);
return function() {
measure.unregisterPath(eventKey, connectedKeyPath);
};
}
}, [connectedKeyPath]);
var renderNode;
if (measure) {
renderNode = childList;
} else {
renderNode = /* @__PURE__ */ jsx(InternalSubMenu, {
...props,
children: childList
});
}
return /* @__PURE__ */ jsx(PathTrackerContext.Provider, {
value: connectedKeyPath,
children: renderNode
});
}
var _excluded$t = ["prefixCls", "rootClassName", "style", "className", "tabIndex", "items", "children", "direction", "id", "mode", "inlineCollapsed", "disabled", "disabledOverflow", "subMenuOpenDelay", "subMenuCloseDelay", "forceSubMenuRender", "defaultOpenKeys", "openKeys", "activeKey", "defaultActiveFirst", "selectable", "multiple", "defaultSelectedKeys", "selectedKeys", "onSelect", "onDeselect", "inlineIndent", "motion", "defaultMotions", "triggerSubMenuAction", "builtinPlacements", "itemIcon", "expandIcon", "overflowedIndicator", "overflowedIndicatorPopupClassName", "getPopupContainer", "onClick", "onOpenChange", "onKeyDown", "openAnimation", "openTransitionName", "_internalRenderMenuItem", "_internalRenderSubMenuItem"];
var EMPTY_LIST$4 = [];
var Menu$2 = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _childList$, _classNames;
var _ref = props, _ref$prefixCls = _ref.prefixCls, prefixCls = _ref$prefixCls === void 0 ? "rc-menu" : _ref$prefixCls, rootClassName = _ref.rootClassName, style2 = _ref.style, className = _ref.className, _ref$tabIndex = _ref.tabIndex, tabIndex = _ref$tabIndex === void 0 ? 0 : _ref$tabIndex, items = _ref.items, children = _ref.children, direction = _ref.direction, id2 = _ref.id, _ref$mode = _ref.mode, mode = _ref$mode === void 0 ? "vertical" : _ref$mode, inlineCollapsed = _ref.inlineCollapsed, disabled = _ref.disabled, disabledOverflow = _ref.disabledOverflow, _ref$subMenuOpenDelay = _ref.subMenuOpenDelay, subMenuOpenDelay = _ref$subMenuOpenDelay === void 0 ? 0.1 : _ref$subMenuOpenDelay, _ref$subMenuCloseDela = _ref.subMenuCloseDelay, subMenuCloseDelay = _ref$subMenuCloseDela === void 0 ? 0.1 : _ref$subMenuCloseDela, forceSubMenuRender = _ref.forceSubMenuRender, defaultOpenKeys = _ref.defaultOpenKeys, openKeys = _ref.openKeys, activeKey = _ref.activeKey, defaultActiveFirst = _ref.defaultActiveFirst, _ref$selectable = _ref.selectable, selectable = _ref$selectable === void 0 ? true : _ref$selectable, _ref$multiple = _ref.multiple, multiple = _ref$multiple === void 0 ? false : _ref$multiple, defaultSelectedKeys = _ref.defaultSelectedKeys, selectedKeys = _ref.selectedKeys, onSelect = _ref.onSelect, onDeselect = _ref.onDeselect, _ref$inlineIndent = _ref.inlineIndent, inlineIndent = _ref$inlineIndent === void 0 ? 24 : _ref$inlineIndent, motion2 = _ref.motion, defaultMotions = _ref.defaultMotions, _ref$triggerSubMenuAc = _ref.triggerSubMenuAction, triggerSubMenuAction = _ref$triggerSubMenuAc === void 0 ? "hover" : _ref$triggerSubMenuAc, builtinPlacements = _ref.builtinPlacements, itemIcon = _ref.itemIcon, expandIcon = _ref.expandIcon, _ref$overflowedIndica = _ref.overflowedIndicator, overflowedIndicator = _ref$overflowedIndica === void 0 ? "..." : _ref$overflowedIndica, overflowedIndicatorPopupClassName = _ref.overflowedIndicatorPopupClassName, getPopupContainer = _ref.getPopupContainer, onClick = _ref.onClick, onOpenChange = _ref.onOpenChange, onKeyDown2 = _ref.onKeyDown;
_ref.openAnimation;
_ref.openTransitionName;
var _internalRenderMenuItem = _ref._internalRenderMenuItem, _internalRenderSubMenuItem = _ref._internalRenderSubMenuItem, restProps = _objectWithoutProperties$1(_ref, _excluded$t);
var childList = React__namespace.useMemo(function() {
return parseItems(children, items, EMPTY_LIST$4);
}, [children, items]);
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), mounted = _React$useState2[0], setMounted = _React$useState2[1];
var containerRef = React__namespace.useRef();
var uuid2 = useUUID(id2);
var isRtl = direction === "rtl";
var _useMergedState = useMergedState(defaultOpenKeys, {
value: openKeys,
postState: function postState(keys2) {
return keys2 || EMPTY_LIST$4;
}
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), mergedOpenKeys = _useMergedState2[0], setMergedOpenKeys = _useMergedState2[1];
var triggerOpenKeys = function triggerOpenKeys2(keys2) {
var forceFlush = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
function doUpdate() {
setMergedOpenKeys(keys2);
onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(keys2);
}
if (forceFlush) {
ReactDOM2.flushSync(doUpdate);
} else {
doUpdate();
}
};
var _React$useState3 = React__namespace.useState(mergedOpenKeys), _React$useState4 = _slicedToArray$e(_React$useState3, 2), inlineCacheOpenKeys = _React$useState4[0], setInlineCacheOpenKeys = _React$useState4[1];
var mountRef = React__namespace.useRef(false);
var _React$useMemo = React__namespace.useMemo(function() {
if ((mode === "inline" || mode === "vertical") && inlineCollapsed) {
return ["vertical", inlineCollapsed];
}
return [mode, false];
}, [mode, inlineCollapsed]), _React$useMemo2 = _slicedToArray$e(_React$useMemo, 2), mergedMode = _React$useMemo2[0], mergedInlineCollapsed = _React$useMemo2[1];
var isInlineMode = mergedMode === "inline";
var _React$useState5 = React__namespace.useState(mergedMode), _React$useState6 = _slicedToArray$e(_React$useState5, 2), internalMode = _React$useState6[0], setInternalMode = _React$useState6[1];
var _React$useState7 = React__namespace.useState(mergedInlineCollapsed), _React$useState8 = _slicedToArray$e(_React$useState7, 2), internalInlineCollapsed = _React$useState8[0], setInternalInlineCollapsed = _React$useState8[1];
React__namespace.useEffect(function() {
setInternalMode(mergedMode);
setInternalInlineCollapsed(mergedInlineCollapsed);
if (!mountRef.current) {
return;
}
if (isInlineMode) {
setMergedOpenKeys(inlineCacheOpenKeys);
} else {
triggerOpenKeys(EMPTY_LIST$4);
}
}, [mergedMode, mergedInlineCollapsed]);
var _React$useState9 = React__namespace.useState(0), _React$useState10 = _slicedToArray$e(_React$useState9, 2), lastVisibleIndex = _React$useState10[0], setLastVisibleIndex = _React$useState10[1];
var allVisible = lastVisibleIndex >= childList.length - 1 || internalMode !== "horizontal" || disabledOverflow;
React__namespace.useEffect(function() {
if (isInlineMode) {
setInlineCacheOpenKeys(mergedOpenKeys);
}
}, [mergedOpenKeys]);
React__namespace.useEffect(function() {
mountRef.current = true;
return function() {
mountRef.current = false;
};
}, []);
var _useKeyRecords = useKeyRecords(), registerPath = _useKeyRecords.registerPath, unregisterPath = _useKeyRecords.unregisterPath, refreshOverflowKeys = _useKeyRecords.refreshOverflowKeys, isSubPathKey = _useKeyRecords.isSubPathKey, getKeyPath = _useKeyRecords.getKeyPath, getKeys2 = _useKeyRecords.getKeys, getSubPathKeys = _useKeyRecords.getSubPathKeys;
var registerPathContext = React__namespace.useMemo(function() {
return {
registerPath,
unregisterPath
};
}, [registerPath, unregisterPath]);
var pathUserContext = React__namespace.useMemo(function() {
return {
isSubPathKey
};
}, [isSubPathKey]);
React__namespace.useEffect(function() {
refreshOverflowKeys(allVisible ? EMPTY_LIST$4 : childList.slice(lastVisibleIndex + 1).map(function(child) {
return child.key;
}));
}, [lastVisibleIndex, allVisible]);
var _useMergedState3 = useMergedState(activeKey || defaultActiveFirst && ((_childList$ = childList[0]) === null || _childList$ === void 0 ? void 0 : _childList$.key), {
value: activeKey
}), _useMergedState4 = _slicedToArray$e(_useMergedState3, 2), mergedActiveKey = _useMergedState4[0], setMergedActiveKey = _useMergedState4[1];
var onActive = useMemoCallback(function(key2) {
setMergedActiveKey(key2);
});
var onInactive = useMemoCallback(function() {
setMergedActiveKey(void 0);
});
React$a.useImperativeHandle(ref, function() {
return {
list: containerRef.current,
focus: function focus(options) {
var _childList$find;
var shouldFocusKey = mergedActiveKey !== null && mergedActiveKey !== void 0 ? mergedActiveKey : (_childList$find = childList.find(function(node) {
return !node.props.disabled;
})) === null || _childList$find === void 0 ? void 0 : _childList$find.key;
if (shouldFocusKey) {
var _containerRef$current, _containerRef$current2, _containerRef$current3;
(_containerRef$current = containerRef.current) === null || _containerRef$current === void 0 ? void 0 : (_containerRef$current2 = _containerRef$current.querySelector("li[data-menu-id='".concat(getMenuId(uuid2, shouldFocusKey), "']"))) === null || _containerRef$current2 === void 0 ? void 0 : (_containerRef$current3 = _containerRef$current2.focus) === null || _containerRef$current3 === void 0 ? void 0 : _containerRef$current3.call(_containerRef$current2, options);
}
}
};
});
var _useMergedState5 = useMergedState(defaultSelectedKeys || [], {
value: selectedKeys,
postState: function postState(keys2) {
if (Array.isArray(keys2)) {
return keys2;
}
if (keys2 === null || keys2 === void 0) {
return EMPTY_LIST$4;
}
return [keys2];
}
}), _useMergedState6 = _slicedToArray$e(_useMergedState5, 2), mergedSelectKeys = _useMergedState6[0], setMergedSelectKeys = _useMergedState6[1];
var triggerSelection = function triggerSelection2(info) {
if (selectable) {
var targetKey = info.key;
var exist = mergedSelectKeys.includes(targetKey);
var newSelectKeys;
if (multiple) {
if (exist) {
newSelectKeys = mergedSelectKeys.filter(function(key2) {
return key2 !== targetKey;
});
} else {
newSelectKeys = [].concat(_toConsumableArray$c(mergedSelectKeys), [targetKey]);
}
} else {
newSelectKeys = [targetKey];
}
setMergedSelectKeys(newSelectKeys);
var selectInfo = _objectSpread2$a(_objectSpread2$a({}, info), {}, {
selectedKeys: newSelectKeys
});
if (exist) {
onDeselect === null || onDeselect === void 0 ? void 0 : onDeselect(selectInfo);
} else {
onSelect === null || onSelect === void 0 ? void 0 : onSelect(selectInfo);
}
}
if (!multiple && mergedOpenKeys.length && internalMode !== "inline") {
triggerOpenKeys(EMPTY_LIST$4);
}
};
var onInternalClick = useMemoCallback(function(info) {
onClick === null || onClick === void 0 ? void 0 : onClick(warnItemProp(info));
triggerSelection(info);
});
var onInternalOpenChange = useMemoCallback(function(key2, open) {
var newOpenKeys = mergedOpenKeys.filter(function(k2) {
return k2 !== key2;
});
if (open) {
newOpenKeys.push(key2);
} else if (internalMode !== "inline") {
var subPathKeys = getSubPathKeys(key2);
newOpenKeys = newOpenKeys.filter(function(k2) {
return !subPathKeys.has(k2);
});
}
if (!isEqual$2(mergedOpenKeys, newOpenKeys, true)) {
triggerOpenKeys(newOpenKeys, true);
}
});
var getInternalPopupContainer = useMemoCallback(getPopupContainer);
var triggerAccessibilityOpen = function triggerAccessibilityOpen2(key2, open) {
var nextOpen = open !== null && open !== void 0 ? open : !mergedOpenKeys.includes(key2);
onInternalOpenChange(key2, nextOpen);
};
var onInternalKeyDown = useAccessibility$1(internalMode, mergedActiveKey, isRtl, uuid2, containerRef, getKeys2, getKeyPath, setMergedActiveKey, triggerAccessibilityOpen, onKeyDown2);
React__namespace.useEffect(function() {
setMounted(true);
}, []);
var privateContext = React__namespace.useMemo(function() {
return {
_internalRenderMenuItem,
_internalRenderSubMenuItem
};
}, [_internalRenderMenuItem, _internalRenderSubMenuItem]);
var wrappedChildList = internalMode !== "horizontal" || disabledOverflow ? childList : childList.map(function(child, index2) {
return /* @__PURE__ */ jsx(InheritableContextProvider, {
overflowDisabled: index2 > lastVisibleIndex,
children: child
}, child.key);
});
var container = /* @__PURE__ */ jsx(ForwardOverflow, {
id: id2,
ref: containerRef,
prefixCls: "".concat(prefixCls, "-overflow"),
component: "ul",
itemComponent: MenuItem$2,
className: classnames(prefixCls, "".concat(prefixCls, "-root"), "".concat(prefixCls, "-").concat(internalMode), className, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-inline-collapsed"), internalInlineCollapsed), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), isRtl), _classNames), rootClassName),
dir: direction,
style: style2,
role: "menu",
tabIndex,
data: wrappedChildList,
renderRawItem: function renderRawItem(node) {
return node;
},
renderRawRest: function renderRawRest(omitItems) {
var len = omitItems.length;
var originOmitItems = len ? childList.slice(-len) : null;
return /* @__PURE__ */ jsx(SubMenu$1, {
eventKey: OVERFLOW_KEY,
title: overflowedIndicator,
disabled: allVisible,
internalPopupClose: len === 0,
popupClassName: overflowedIndicatorPopupClassName,
children: originOmitItems
});
},
maxCount: internalMode !== "horizontal" || disabledOverflow ? ForwardOverflow.INVALIDATE : ForwardOverflow.RESPONSIVE,
ssr: "full",
"data-menu-list": true,
onVisibleChange: function onVisibleChange(newLastIndex) {
setLastVisibleIndex(newLastIndex);
},
onKeyDown: onInternalKeyDown,
...restProps
});
return /* @__PURE__ */ jsx(PrivateContext.Provider, {
value: privateContext,
children: /* @__PURE__ */ jsx(IdContext.Provider, {
value: uuid2,
children: /* @__PURE__ */ jsxs(InheritableContextProvider, {
prefixCls,
rootClassName,
mode: internalMode,
openKeys: mergedOpenKeys,
rtl: isRtl,
disabled,
motion: mounted ? motion2 : null,
defaultMotions: mounted ? defaultMotions : null,
activeKey: mergedActiveKey,
onActive,
onInactive,
selectedKeys: mergedSelectKeys,
inlineIndent,
subMenuOpenDelay,
subMenuCloseDelay,
forceSubMenuRender,
builtinPlacements,
triggerSubMenuAction,
getPopupContainer: getInternalPopupContainer,
itemIcon,
expandIcon,
onItemClick: onInternalClick,
onOpenChange: onInternalOpenChange,
children: [/* @__PURE__ */ jsx(PathUserContext.Provider, {
value: pathUserContext,
children: container
}), /* @__PURE__ */ jsx("div", {
style: {
display: "none"
},
"aria-hidden": true,
children: /* @__PURE__ */ jsx(PathRegisterContext.Provider, {
value: registerPathContext,
children: childList
})
})]
})
})
});
});
var _excluded$s = ["className", "title", "eventKey", "children"], _excluded2$4 = ["children"];
var InternalMenuItemGroup = function InternalMenuItemGroup2(_ref) {
var className = _ref.className, title = _ref.title;
_ref.eventKey;
var children = _ref.children, restProps = _objectWithoutProperties$1(_ref, _excluded$s);
var _React$useContext = React__namespace.useContext(MenuContext$2), prefixCls = _React$useContext.prefixCls;
var groupPrefixCls = "".concat(prefixCls, "-item-group");
return /* @__PURE__ */ jsxs("li", {
role: "presentation",
...restProps,
onClick: function onClick(e2) {
return e2.stopPropagation();
},
className: classnames(groupPrefixCls, className),
children: [/* @__PURE__ */ jsx("div", {
role: "presentation",
className: "".concat(groupPrefixCls, "-title"),
title: typeof title === "string" ? title : void 0,
children: title
}), /* @__PURE__ */ jsx("ul", {
role: "group",
className: "".concat(groupPrefixCls, "-list"),
children
})]
});
};
function MenuItemGroup(_ref2) {
var children = _ref2.children, props = _objectWithoutProperties$1(_ref2, _excluded2$4);
var connectedKeyPath = useFullPath(props.eventKey);
var childList = parseChildren(children, connectedKeyPath);
var measure = useMeasure();
if (measure) {
return childList;
}
return /* @__PURE__ */ jsx(InternalMenuItemGroup, {
...omit(props, ["warnKey"]),
children: childList
});
}
function Divider$1(_ref) {
var className = _ref.className, style2 = _ref.style;
var _React$useContext = React__namespace.useContext(MenuContext$2), prefixCls = _React$useContext.prefixCls;
var measure = useMeasure();
if (measure) {
return null;
}
return /* @__PURE__ */ jsx("li", {
className: classnames("".concat(prefixCls, "-item-divider"), className),
style: style2
});
}
var ExportMenu = Menu$2;
ExportMenu.Item = MenuItem$2;
ExportMenu.SubMenu = SubMenu$1;
ExportMenu.ItemGroup = MenuItemGroup;
ExportMenu.Divider = Divider$1;
var LeftOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M724 218.3V141c0-6.7-7.7-10.4-12.9-6.3L260.3 486.8a31.86 31.86 0 000 50.3l450.8 352.1c5.3 4.1 12.9.4 12.9-6.3v-77.3c0-4.9-2.3-9.6-6.1-12.6l-360-281 360-281.1c3.8-3 6.1-7.7 6.1-12.6z" } }] }, "name": "left", "theme": "outlined" };
const LeftOutlinedSvg = LeftOutlined$2;
var LeftOutlined = function LeftOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: LeftOutlinedSvg
})
});
};
LeftOutlined.displayName = "LeftOutlined";
const LeftOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(LeftOutlined);
var RightOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M765.7 486.8L314.9 134.7A7.97 7.97 0 00302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 000-50.4z" } }] }, "name": "right", "theme": "outlined" };
const RightOutlinedSvg = RightOutlined$2;
var RightOutlined = function RightOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: RightOutlinedSvg
})
});
};
RightOutlined.displayName = "RightOutlined";
const RightOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(RightOutlined);
globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var SiderContext = /* @__PURE__ */ React__namespace.createContext({});
var __rest$N = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var MenuDivider = function MenuDivider2(_a) {
var customizePrefixCls = _a.prefixCls, className = _a.className, dashed = _a.dashed, restProps = __rest$N(_a, ["prefixCls", "className", "dashed"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var prefixCls = getPrefixCls("menu", customizePrefixCls);
var classString = classnames(_defineProperty$b({}, "".concat(prefixCls, "-item-divider-dashed"), !!dashed), className);
return /* @__PURE__ */ jsx(Divider$1, {
className: classString,
...restProps
});
};
const MenuDivider$1 = MenuDivider;
var MenuContext = /* @__PURE__ */ React$a.createContext({
prefixCls: "",
firstLevel: true,
inlineCollapsed: false
});
const MenuContext$1 = MenuContext;
var __rest$M = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var MenuItem = /* @__PURE__ */ function(_React$Component) {
_inherits(MenuItem2, _React$Component);
var _super = _createSuper(MenuItem2);
function MenuItem2() {
var _this2;
_classCallCheck(this, MenuItem2);
_this2 = _super.apply(this, arguments);
_this2.renderItem = function(_ref) {
var _classNames;
var siderCollapsed = _ref.siderCollapsed;
var _a;
var _this$context = _this2.context, prefixCls = _this$context.prefixCls, firstLevel = _this$context.firstLevel, inlineCollapsed = _this$context.inlineCollapsed, direction = _this$context.direction, disableMenuItemTitleTooltip = _this$context.disableMenuItemTitleTooltip;
var _this$props = _this2.props, className = _this$props.className, children = _this$props.children;
var _b = _this2.props, title = _b.title, icon = _b.icon, danger = _b.danger, rest = __rest$M(_b, ["title", "icon", "danger"]);
var tooltipTitle = title;
if (typeof title === "undefined") {
tooltipTitle = firstLevel ? children : "";
} else if (title === false) {
tooltipTitle = "";
}
var tooltipProps = {
title: tooltipTitle
};
if (!siderCollapsed && !inlineCollapsed) {
tooltipProps.title = null;
tooltipProps.open = false;
}
var childrenLength = toArray$9(children).length;
var returnNode = /* @__PURE__ */ jsxs(MenuItem$2, {
...rest,
className: classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-item-danger"), danger), _defineProperty$b(_classNames, "".concat(prefixCls, "-item-only-child"), (icon ? childrenLength + 1 : childrenLength) === 1), _classNames), className),
title: typeof title === "string" ? title : void 0,
children: [cloneElement(icon, {
className: classnames(isValidElement(icon) ? (_a = icon.props) === null || _a === void 0 ? void 0 : _a.className : "", "".concat(prefixCls, "-item-icon"))
}), _this2.renderItemChildren(inlineCollapsed)]
});
if (!disableMenuItemTitleTooltip) {
returnNode = /* @__PURE__ */ jsx(_Tooltip, {
...tooltipProps,
placement: direction === "rtl" ? "left" : "right",
overlayClassName: "".concat(prefixCls, "-inline-collapsed-tooltip"),
children: returnNode
});
}
return returnNode;
};
return _this2;
}
_createClass(MenuItem2, [{
key: "renderItemChildren",
value: function renderItemChildren(inlineCollapsed) {
var _this$context2 = this.context, prefixCls = _this$context2.prefixCls, firstLevel = _this$context2.firstLevel;
var _this$props2 = this.props, icon = _this$props2.icon, children = _this$props2.children;
var wrapNode = /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-title-content"),
children
});
if (!icon || isValidElement(children) && children.type === "span") {
if (children && inlineCollapsed && firstLevel && typeof children === "string") {
return /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-inline-collapsed-noicon"),
children: children.charAt(0)
});
}
}
return wrapNode;
}
}, {
key: "render",
value: function render2() {
return /* @__PURE__ */ jsx(SiderContext.Consumer, {
children: this.renderItem
});
}
}]);
return MenuItem2;
}(React__namespace.Component);
MenuItem.contextType = MenuContext$1;
function SubMenu(props) {
var _a;
var popupClassName = props.popupClassName, icon = props.icon, title = props.title, theme = props.theme;
var context2 = React__namespace.useContext(MenuContext$1);
var prefixCls = context2.prefixCls, inlineCollapsed = context2.inlineCollapsed, antdMenuTheme = context2.antdMenuTheme;
var parentPath = useFullPath();
var titleNode;
if (!icon) {
titleNode = inlineCollapsed && !parentPath.length && title && typeof title === "string" ? /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-inline-collapsed-noicon"),
children: title.charAt(0)
}) : /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-title-content"),
children: title
});
} else {
var titleIsSpan = isValidElement(title) && title.type === "span";
titleNode = /* @__PURE__ */ jsxs(Fragment, {
children: [cloneElement(icon, {
className: classnames(isValidElement(icon) ? (_a = icon.props) === null || _a === void 0 ? void 0 : _a.className : "", "".concat(prefixCls, "-item-icon"))
}), titleIsSpan ? title : /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-title-content"),
children: title
})]
});
}
var contextValue = React__namespace.useMemo(function() {
return _extends$3(_extends$3({}, context2), {
firstLevel: false
});
}, [context2]);
return /* @__PURE__ */ jsx(MenuContext$1.Provider, {
value: contextValue,
children: /* @__PURE__ */ jsx(SubMenu$1, {
...omit(props, ["icon"]),
title: titleNode,
popupClassName: classnames(prefixCls, "".concat(prefixCls, "-").concat(theme || antdMenuTheme), popupClassName)
})
});
}
var __rest$L = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
function convertItemsToNodes(list) {
return (list || []).map(function(opt, index2) {
if (opt && _typeof$q(opt) === "object") {
var _a = opt, label = _a.label, children = _a.children, key2 = _a.key, type2 = _a.type, restProps = __rest$L(_a, ["label", "children", "key", "type"]);
var mergedKey = key2 !== null && key2 !== void 0 ? key2 : "tmp-".concat(index2);
if (children || type2 === "group") {
if (type2 === "group") {
return /* @__PURE__ */ jsx(MenuItemGroup, {
...restProps,
title: label,
children: convertItemsToNodes(children)
}, mergedKey);
}
return /* @__PURE__ */ jsx(SubMenu, {
...restProps,
title: label,
children: convertItemsToNodes(children)
}, mergedKey);
}
if (type2 === "divider") {
return /* @__PURE__ */ jsx(MenuDivider$1, {
...restProps
}, mergedKey);
}
return /* @__PURE__ */ jsx(MenuItem, {
...restProps,
children: label
}, mergedKey);
}
return null;
}).filter(function(opt) {
return opt;
});
}
function useItems(items) {
return React__namespace.useMemo(function() {
if (!items) {
return items;
}
return convertItemsToNodes(items);
}, [items]);
}
var __rest$K = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var OverrideContext = /* @__PURE__ */ React__namespace.createContext(null);
var OverrideProvider = function OverrideProvider2(_a) {
var children = _a.children, restProps = __rest$K(_a, ["children"]);
var override = React__namespace.useContext(OverrideContext);
var context2 = React__namespace.useMemo(function() {
return _extends$3(_extends$3({}, override), restProps);
}, [
override,
restProps.prefixCls,
restProps.mode,
restProps.selectable
]);
return /* @__PURE__ */ jsx(OverrideContext.Provider, {
value: context2,
children
});
};
var __rest$J = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var InternalMenu = /* @__PURE__ */ React$a.forwardRef(function(props, ref) {
var _a;
var override = React__namespace.useContext(OverrideContext) || {};
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, getPopupContainer = _React$useContext.getPopupContainer, direction = _React$useContext.direction;
var rootPrefixCls = getPrefixCls();
var customizePrefixCls = props.prefixCls, className = props.className, _props$theme = props.theme, theme = _props$theme === void 0 ? "light" : _props$theme, expandIcon = props.expandIcon, _internalDisableMenuItemTitleTooltip = props._internalDisableMenuItemTitleTooltip, inlineCollapsed = props.inlineCollapsed, siderCollapsed = props.siderCollapsed, items = props.items, children = props.children, mode = props.mode, selectable = props.selectable, onClick = props.onClick, restProps = __rest$J(props, ["prefixCls", "className", "theme", "expandIcon", "_internalDisableMenuItemTitleTooltip", "inlineCollapsed", "siderCollapsed", "items", "children", "mode", "selectable", "onClick"]);
var passedProps = omit(restProps, ["collapsedWidth"]);
var mergedChildren = useItems(items) || children;
(_a = override.validator) === null || _a === void 0 ? void 0 : _a.call(override, {
mode
});
var onItemClick = useEvent(function() {
var _a2;
onClick === null || onClick === void 0 ? void 0 : onClick.apply(void 0, arguments);
(_a2 = override === null || override === void 0 ? void 0 : override.onClick) === null || _a2 === void 0 ? void 0 : _a2.call(override);
});
var mergedMode = override.mode || mode;
var mergedSelectable = selectable !== null && selectable !== void 0 ? selectable : override.selectable;
var mergedInlineCollapsed = React__namespace.useMemo(function() {
if (siderCollapsed !== void 0) {
return siderCollapsed;
}
return inlineCollapsed;
}, [inlineCollapsed, siderCollapsed]);
var defaultMotions = {
horizontal: {
motionName: "".concat(rootPrefixCls, "-slide-up")
},
inline: collapseMotion$1,
other: {
motionName: "".concat(rootPrefixCls, "-zoom-big")
}
};
var prefixCls = getPrefixCls("menu", customizePrefixCls || override.prefixCls);
var menuClassName = classnames("".concat(prefixCls, "-").concat(theme), className);
var mergedExpandIcon;
if (typeof expandIcon === "function") {
mergedExpandIcon = expandIcon;
} else {
mergedExpandIcon = cloneElement(expandIcon || override.expandIcon, {
className: "".concat(prefixCls, "-submenu-expand-icon")
});
}
var contextValue = React__namespace.useMemo(function() {
return {
prefixCls,
inlineCollapsed: mergedInlineCollapsed || false,
antdMenuTheme: theme,
direction,
firstLevel: true,
disableMenuItemTitleTooltip: _internalDisableMenuItemTitleTooltip
};
}, [prefixCls, mergedInlineCollapsed, theme, direction, _internalDisableMenuItemTitleTooltip]);
return /* @__PURE__ */ jsx(OverrideContext.Provider, {
value: null,
children: /* @__PURE__ */ jsx(MenuContext$1.Provider, {
value: contextValue,
children: /* @__PURE__ */ jsx(ExportMenu, {
getPopupContainer,
overflowedIndicator: /* @__PURE__ */ jsx(EllipsisOutlined$1, {}),
overflowedIndicatorPopupClassName: "".concat(prefixCls, "-").concat(theme),
mode: mergedMode,
selectable: mergedSelectable,
onClick: onItemClick,
...passedProps,
inlineCollapsed: mergedInlineCollapsed,
className: menuClassName,
prefixCls,
direction,
defaultMotions,
expandIcon: mergedExpandIcon,
ref,
children: mergedChildren
})
})
});
});
var Menu = /* @__PURE__ */ function(_React$Component) {
_inherits(Menu2, _React$Component);
var _super = _createSuper(Menu2);
function Menu2() {
var _this2;
_classCallCheck(this, Menu2);
_this2 = _super.apply(this, arguments);
_this2.focus = function(options) {
var _a;
(_a = _this2.menu) === null || _a === void 0 ? void 0 : _a.focus(options);
};
return _this2;
}
_createClass(Menu2, [{
key: "render",
value: function render2() {
var _this2 = this;
return /* @__PURE__ */ jsx(SiderContext.Consumer, {
children: function(context2) {
return /* @__PURE__ */ jsx(InternalMenu, {
ref: function ref(node) {
_this2.menu = node;
},
..._this2.props,
...context2
});
}
});
}
}]);
return Menu2;
}(React__namespace.Component);
Menu.Divider = MenuDivider$1;
Menu.Item = MenuItem;
Menu.SubMenu = SubMenu;
Menu.ItemGroup = MenuItemGroup;
const Menu$1 = Menu;
var autoAdjustOverflow = {
adjustX: 1,
adjustY: 1
};
var targetOffset = [0, 0];
var placements$1 = {
topLeft: {
points: ["bl", "tl"],
overflow: autoAdjustOverflow,
offset: [0, -4],
targetOffset
},
topCenter: {
points: ["bc", "tc"],
overflow: autoAdjustOverflow,
offset: [0, -4],
targetOffset
},
topRight: {
points: ["br", "tr"],
overflow: autoAdjustOverflow,
offset: [0, -4],
targetOffset
},
bottomLeft: {
points: ["tl", "bl"],
overflow: autoAdjustOverflow,
offset: [0, 4],
targetOffset
},
bottomCenter: {
points: ["tc", "bc"],
overflow: autoAdjustOverflow,
offset: [0, 4],
targetOffset
},
bottomRight: {
points: ["tr", "br"],
overflow: autoAdjustOverflow,
offset: [0, 4],
targetOffset
}
};
var ESC = KeyCode.ESC, TAB = KeyCode.TAB;
function useAccessibility(_ref) {
var visible = _ref.visible, setTriggerVisible = _ref.setTriggerVisible, triggerRef = _ref.triggerRef, onVisibleChange = _ref.onVisibleChange, autoFocus = _ref.autoFocus;
var focusMenuRef = React__namespace.useRef(false);
var handleCloseMenuAndReturnFocus = function handleCloseMenuAndReturnFocus2() {
if (visible && triggerRef.current) {
var _triggerRef$current, _triggerRef$current$t, _triggerRef$current$t2, _triggerRef$current$t3;
(_triggerRef$current = triggerRef.current) === null || _triggerRef$current === void 0 ? void 0 : (_triggerRef$current$t = _triggerRef$current.triggerRef) === null || _triggerRef$current$t === void 0 ? void 0 : (_triggerRef$current$t2 = _triggerRef$current$t.current) === null || _triggerRef$current$t2 === void 0 ? void 0 : (_triggerRef$current$t3 = _triggerRef$current$t2.focus) === null || _triggerRef$current$t3 === void 0 ? void 0 : _triggerRef$current$t3.call(_triggerRef$current$t2);
setTriggerVisible(false);
if (typeof onVisibleChange === "function") {
onVisibleChange(false);
}
}
};
var focusMenu = function focusMenu2() {
var _triggerRef$current2, _triggerRef$current2$, _triggerRef$current2$2, _triggerRef$current2$3;
var elements = getFocusNodeList((_triggerRef$current2 = triggerRef.current) === null || _triggerRef$current2 === void 0 ? void 0 : (_triggerRef$current2$ = _triggerRef$current2.popupRef) === null || _triggerRef$current2$ === void 0 ? void 0 : (_triggerRef$current2$2 = _triggerRef$current2$.current) === null || _triggerRef$current2$2 === void 0 ? void 0 : (_triggerRef$current2$3 = _triggerRef$current2$2.getElement) === null || _triggerRef$current2$3 === void 0 ? void 0 : _triggerRef$current2$3.call(_triggerRef$current2$2));
var firstElement = elements[0];
if (firstElement === null || firstElement === void 0 ? void 0 : firstElement.focus) {
firstElement.focus();
focusMenuRef.current = true;
return true;
}
return false;
};
var handleKeyDown = function handleKeyDown2(event) {
switch (event.keyCode) {
case ESC:
handleCloseMenuAndReturnFocus();
break;
case TAB: {
var focusResult = false;
if (!focusMenuRef.current) {
focusResult = focusMenu();
}
if (focusResult) {
event.preventDefault();
} else {
handleCloseMenuAndReturnFocus();
}
break;
}
}
};
React__namespace.useEffect(function() {
if (visible) {
window.addEventListener("keydown", handleKeyDown);
if (autoFocus) {
wrapperRaf$1(focusMenu, 3);
}
return function() {
window.removeEventListener("keydown", handleKeyDown);
focusMenuRef.current = false;
};
}
return function() {
focusMenuRef.current = false;
};
}, [visible]);
}
var _excluded$r = ["arrow", "prefixCls", "transitionName", "animation", "align", "placement", "placements", "getPopupContainer", "showAction", "hideAction", "overlayClassName", "overlayStyle", "visible", "trigger", "autoFocus"];
function Dropdown$2(props, ref) {
var _props$arrow = props.arrow, arrow = _props$arrow === void 0 ? false : _props$arrow, _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-dropdown" : _props$prefixCls, transitionName2 = props.transitionName, animation = props.animation, align = props.align, _props$placement = props.placement, placement = _props$placement === void 0 ? "bottomLeft" : _props$placement, _props$placements = props.placements, placements2 = _props$placements === void 0 ? placements$1 : _props$placements, getPopupContainer = props.getPopupContainer, showAction = props.showAction, hideAction = props.hideAction, overlayClassName = props.overlayClassName, overlayStyle = props.overlayStyle, visible = props.visible, _props$trigger = props.trigger, trigger = _props$trigger === void 0 ? ["hover"] : _props$trigger, autoFocus = props.autoFocus, otherProps = _objectWithoutProperties$1(props, _excluded$r);
var _React$useState = React__namespace.useState(), _React$useState2 = _slicedToArray$e(_React$useState, 2), triggerVisible = _React$useState2[0], setTriggerVisible = _React$useState2[1];
var mergedVisible = "visible" in props ? visible : triggerVisible;
var triggerRef = React__namespace.useRef(null);
React__namespace.useImperativeHandle(ref, function() {
return triggerRef.current;
});
useAccessibility({
visible: mergedVisible,
setTriggerVisible,
triggerRef,
onVisibleChange: props.onVisibleChange,
autoFocus
});
var getOverlayElement = function getOverlayElement2() {
var overlay = props.overlay;
var overlayElement;
if (typeof overlay === "function") {
overlayElement = overlay();
} else {
overlayElement = overlay;
}
return overlayElement;
};
var onClick = function onClick2(e2) {
var onOverlayClick = props.onOverlayClick;
setTriggerVisible(false);
if (onOverlayClick) {
onOverlayClick(e2);
}
};
var onVisibleChange = function onVisibleChange2(newVisible) {
var onVisibleChangeProp = props.onVisibleChange;
setTriggerVisible(newVisible);
if (typeof onVisibleChangeProp === "function") {
onVisibleChangeProp(newVisible);
}
};
var getMenuElement = function getMenuElement2() {
var overlayElement = getOverlayElement();
return /* @__PURE__ */ jsxs(Fragment, {
children: [arrow && /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-arrow")
}), overlayElement]
});
};
var getMenuElementOrLambda = function getMenuElementOrLambda2() {
var overlay = props.overlay;
if (typeof overlay === "function") {
return getMenuElement;
}
return getMenuElement();
};
var getMinOverlayWidthMatchTrigger = function getMinOverlayWidthMatchTrigger2() {
var minOverlayWidthMatchTrigger = props.minOverlayWidthMatchTrigger, alignPoint2 = props.alignPoint;
if ("minOverlayWidthMatchTrigger" in props) {
return minOverlayWidthMatchTrigger;
}
return !alignPoint2;
};
var getOpenClassName = function getOpenClassName2() {
var openClassName = props.openClassName;
if (openClassName !== void 0) {
return openClassName;
}
return "".concat(prefixCls, "-open");
};
var renderChildren = function renderChildren2() {
var children = props.children;
var childrenProps = children.props ? children.props : {};
var childClassName = classnames(childrenProps.className, getOpenClassName());
return mergedVisible && children ? /* @__PURE__ */ React__namespace.cloneElement(children, {
className: childClassName
}) : children;
};
var triggerHideAction = hideAction;
if (!triggerHideAction && trigger.indexOf("contextMenu") !== -1) {
triggerHideAction = ["click"];
}
return /* @__PURE__ */ jsx(Trigger$1, {
..._objectSpread2$a(_objectSpread2$a({
builtinPlacements: placements2
}, otherProps), {}, {
prefixCls,
ref: triggerRef,
popupClassName: classnames(overlayClassName, _defineProperty$b({}, "".concat(prefixCls, "-show-arrow"), arrow)),
popupStyle: overlayStyle,
action: trigger,
showAction,
hideAction: triggerHideAction || [],
popupPlacement: placement,
popupAlign: align,
popupTransitionName: transitionName2,
popupAnimation: animation,
popupVisible: mergedVisible,
stretch: getMinOverlayWidthMatchTrigger() ? "minWidth" : "",
popup: getMenuElementOrLambda(),
onPopupVisibleChange: onVisibleChange,
onPopupClick: onClick,
getPopupContainer
}),
children: renderChildren()
});
}
const Dropdown$3 = /* @__PURE__ */ React__namespace.forwardRef(Dropdown$2);
var id$2 = 0;
var ids = {};
function wrapperRaf(callback) {
var delayFrames = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 1;
var myId = id$2++;
var restFrames = delayFrames;
function internalCallback() {
restFrames -= 1;
if (restFrames <= 0) {
callback();
delete ids[myId];
} else {
ids[myId] = wrapperRaf$1(internalCallback);
}
}
ids[myId] = wrapperRaf$1(internalCallback);
return myId;
}
wrapperRaf.cancel = function cancel(pid) {
if (pid === void 0)
return;
wrapperRaf$1.cancel(ids[pid]);
delete ids[pid];
};
wrapperRaf.ids = ids;
var styleForPseudo;
function isHidden(element) {
return !element || element.offsetParent === null || element.hidden;
}
function getValidateContainer(nodeRoot) {
if (nodeRoot instanceof Document) {
return nodeRoot.body;
}
return Array.from(nodeRoot.childNodes).find(function(ele) {
return (ele === null || ele === void 0 ? void 0 : ele.nodeType) === Node.ELEMENT_NODE;
});
}
function isNotGrey(color2) {
var match2 = (color2 || "").match(/rgba?\((\d*), (\d*), (\d*)(, [\d.]*)?\)/);
if (match2 && match2[1] && match2[2] && match2[3]) {
return !(match2[1] === match2[2] && match2[2] === match2[3]);
}
return true;
}
var Wave = /* @__PURE__ */ function(_React$Component) {
_inherits(Wave2, _React$Component);
var _super = _createSuper(Wave2);
function Wave2() {
var _this2;
_classCallCheck(this, Wave2);
_this2 = _super.apply(this, arguments);
_this2.containerRef = /* @__PURE__ */ React__namespace.createRef();
_this2.animationStart = false;
_this2.destroyed = false;
_this2.onClick = function(node, waveColor) {
var _a, _b;
var _this$props = _this2.props, insertExtraNode = _this$props.insertExtraNode, disabled = _this$props.disabled;
if (disabled || !node || isHidden(node) || node.className.includes("-leave")) {
return;
}
_this2.extraNode = document.createElement("div");
var _assertThisInitialize = _assertThisInitialized(_this2), extraNode = _assertThisInitialize.extraNode;
var getPrefixCls = _this2.context.getPrefixCls;
extraNode.className = "".concat(getPrefixCls(""), "-click-animating-node");
var attributeName = _this2.getAttributeName();
node.setAttribute(attributeName, "true");
if (waveColor && waveColor !== "#fff" && waveColor !== "#ffffff" && waveColor !== "rgb(255, 255, 255)" && waveColor !== "rgba(255, 255, 255, 1)" && isNotGrey(waveColor) && !/rgba\((?:\d*, ){3}0\)/.test(waveColor) && waveColor !== "transparent") {
extraNode.style.borderColor = waveColor;
var nodeRoot = ((_a = node.getRootNode) === null || _a === void 0 ? void 0 : _a.call(node)) || node.ownerDocument;
var nodeBody = (_b = getValidateContainer(nodeRoot)) !== null && _b !== void 0 ? _b : nodeRoot;
styleForPseudo = updateCSS("\n [".concat(getPrefixCls(""), "-click-animating-without-extra-node='true']::after, .").concat(getPrefixCls(""), "-click-animating-node {\n --antd-wave-shadow-color: ").concat(waveColor, ";\n }"), "antd-wave", {
csp: _this2.csp,
attachTo: nodeBody
});
}
if (insertExtraNode) {
node.appendChild(extraNode);
}
["transition", "animation"].forEach(function(name2) {
node.addEventListener("".concat(name2, "start"), _this2.onTransitionStart);
node.addEventListener("".concat(name2, "end"), _this2.onTransitionEnd);
});
};
_this2.onTransitionStart = function(e2) {
if (_this2.destroyed) {
return;
}
var node = _this2.containerRef.current;
if (!e2 || e2.target !== node || _this2.animationStart) {
return;
}
_this2.resetEffect(node);
};
_this2.onTransitionEnd = function(e2) {
if (!e2 || e2.animationName !== "fadeEffect") {
return;
}
_this2.resetEffect(e2.target);
};
_this2.bindAnimationEvent = function(node) {
if (!node || !node.getAttribute || node.getAttribute("disabled") || node.className.includes("disabled")) {
return;
}
var onClick = function onClick2(e2) {
if (e2.target.tagName === "INPUT" || isHidden(e2.target)) {
return;
}
_this2.resetEffect(node);
var waveColor = getComputedStyle(node).getPropertyValue("border-top-color") || getComputedStyle(node).getPropertyValue("border-color") || getComputedStyle(node).getPropertyValue("background-color");
_this2.clickWaveTimeoutId = window.setTimeout(function() {
return _this2.onClick(node, waveColor);
}, 0);
wrapperRaf.cancel(_this2.animationStartId);
_this2.animationStart = true;
_this2.animationStartId = wrapperRaf(function() {
_this2.animationStart = false;
}, 10);
};
node.addEventListener("click", onClick, true);
return {
cancel: function cancel() {
node.removeEventListener("click", onClick, true);
}
};
};
_this2.renderWave = function(_ref) {
var csp = _ref.csp;
var children = _this2.props.children;
_this2.csp = csp;
if (!/* @__PURE__ */ React__namespace.isValidElement(children))
return children;
var ref = _this2.containerRef;
if (supportRef(children)) {
ref = composeRef(children.ref, _this2.containerRef);
}
return cloneElement(children, {
ref
});
};
return _this2;
}
_createClass(Wave2, [{
key: "componentDidMount",
value: function componentDidMount() {
this.destroyed = false;
var node = this.containerRef.current;
if (!node || node.nodeType !== 1) {
return;
}
this.instance = this.bindAnimationEvent(node);
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
if (this.instance) {
this.instance.cancel();
}
if (this.clickWaveTimeoutId) {
clearTimeout(this.clickWaveTimeoutId);
}
this.destroyed = true;
}
}, {
key: "getAttributeName",
value: function getAttributeName() {
var getPrefixCls = this.context.getPrefixCls;
var insertExtraNode = this.props.insertExtraNode;
return insertExtraNode ? "".concat(getPrefixCls(""), "-click-animating") : "".concat(getPrefixCls(""), "-click-animating-without-extra-node");
}
}, {
key: "resetEffect",
value: function resetEffect(node) {
var _this2 = this;
if (!node || node === this.extraNode || !(node instanceof Element)) {
return;
}
var insertExtraNode = this.props.insertExtraNode;
var attributeName = this.getAttributeName();
node.setAttribute(attributeName, "false");
if (styleForPseudo) {
styleForPseudo.innerHTML = "";
}
if (insertExtraNode && this.extraNode && node.contains(this.extraNode)) {
node.removeChild(this.extraNode);
}
["transition", "animation"].forEach(function(name2) {
node.removeEventListener("".concat(name2, "start"), _this2.onTransitionStart);
node.removeEventListener("".concat(name2, "end"), _this2.onTransitionEnd);
});
}
}, {
key: "render",
value: function render2() {
return /* @__PURE__ */ jsx(ConfigConsumer, {
children: this.renderWave
});
}
}]);
return Wave2;
}(React__namespace.Component);
Wave.contextType = ConfigContext$1;
const Wave$1 = Wave;
var __rest$I = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var GroupSizeContext = /* @__PURE__ */ React__namespace.createContext(void 0);
var ButtonGroup = function ButtonGroup2(props) {
var _classNames;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var customizePrefixCls = props.prefixCls, size = props.size, className = props.className, others = __rest$I(props, ["prefixCls", "size", "className"]);
var prefixCls = getPrefixCls("btn-group", customizePrefixCls);
var sizeCls = "";
switch (size) {
case "large":
sizeCls = "lg";
break;
case "small":
sizeCls = "sm";
break;
}
var classes = classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(sizeCls), sizeCls), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames), className);
return /* @__PURE__ */ jsx(GroupSizeContext.Provider, {
value: size,
children: /* @__PURE__ */ jsx("div", {
...others,
className: classes
})
});
};
const Group$5 = ButtonGroup;
var getCollapsedWidth = function getCollapsedWidth2() {
return {
width: 0,
opacity: 0,
transform: "scale(0)"
};
};
var getRealWidth = function getRealWidth2(node) {
return {
width: node.scrollWidth,
opacity: 1,
transform: "scale(1)"
};
};
var LoadingIcon = function LoadingIcon2(_ref) {
var prefixCls = _ref.prefixCls, loading = _ref.loading, existIcon = _ref.existIcon;
var visible = !!loading;
if (existIcon) {
return /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-loading-icon"),
children: /* @__PURE__ */ jsx(LoadingOutlined$1, {})
});
}
return /* @__PURE__ */ jsx(CSSMotion, {
visible,
motionName: "".concat(prefixCls, "-loading-icon-motion"),
removeOnLeave: true,
onAppearStart: getCollapsedWidth,
onAppearActive: getRealWidth,
onEnterStart: getCollapsedWidth,
onEnterActive: getRealWidth,
onLeaveStart: getRealWidth,
onLeaveActive: getCollapsedWidth,
children: function(_ref2, ref) {
var className = _ref2.className, style2 = _ref2.style;
return /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-loading-icon"),
style: style2,
ref,
children: /* @__PURE__ */ jsx(LoadingOutlined$1, {
className
})
});
}
});
};
const LoadingIcon$1 = LoadingIcon;
var __rest$H = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var rxTwoCNChar = /^[\u4e00-\u9fa5]{2}$/;
var isTwoCNChar = rxTwoCNChar.test.bind(rxTwoCNChar);
function isString$1(str) {
return typeof str === "string";
}
function isUnBorderedButtonType(type2) {
return type2 === "text" || type2 === "link";
}
function insertSpace(child, needInserted) {
if (child === null || child === void 0) {
return;
}
var SPACE = needInserted ? " " : "";
if (typeof child !== "string" && typeof child !== "number" && isString$1(child.type) && isTwoCNChar(child.props.children)) {
return cloneElement(child, {
children: child.props.children.split("").join(SPACE)
});
}
if (typeof child === "string") {
return isTwoCNChar(child) ? /* @__PURE__ */ jsx("span", {
children: child.split("").join(SPACE)
}) : /* @__PURE__ */ jsx("span", {
children: child
});
}
if (isFragment(child)) {
return /* @__PURE__ */ jsx("span", {
children: child
});
}
return child;
}
function spaceChildren(children, needInserted) {
var isPrevChildPure = false;
var childList = [];
React__namespace.Children.forEach(children, function(child) {
var type2 = _typeof$q(child);
var isCurrentChildPure = type2 === "string" || type2 === "number";
if (isPrevChildPure && isCurrentChildPure) {
var lastIndex = childList.length - 1;
var lastChild = childList[lastIndex];
childList[lastIndex] = "".concat(lastChild).concat(child);
} else {
childList.push(child);
}
isPrevChildPure = isCurrentChildPure;
});
return React__namespace.Children.map(childList, function(child) {
return insertSpace(child, needInserted);
});
}
tuple$1("default", "primary", "ghost", "dashed", "link", "text");
tuple$1("default", "circle", "round");
tuple$1("submit", "button", "reset");
function convertLegacyProps(type2) {
if (type2 === "danger") {
return {
danger: true
};
}
return {
type: type2
};
}
var InternalButton = function InternalButton2(props, ref) {
var _classNames;
var _props$loading = props.loading, loading = _props$loading === void 0 ? false : _props$loading, customizePrefixCls = props.prefixCls, _props$type = props.type, type2 = _props$type === void 0 ? "default" : _props$type, danger = props.danger, _props$shape = props.shape, shape = _props$shape === void 0 ? "default" : _props$shape, customizeSize = props.size, customDisabled = props.disabled, className = props.className, children = props.children, icon = props.icon, _props$ghost = props.ghost, ghost = _props$ghost === void 0 ? false : _props$ghost, _props$block = props.block, block = _props$block === void 0 ? false : _props$block, _props$htmlType = props.htmlType, htmlType = _props$htmlType === void 0 ? "button" : _props$htmlType, rest = __rest$H(props, ["loading", "prefixCls", "type", "danger", "shape", "size", "disabled", "className", "children", "icon", "ghost", "block", "htmlType"]);
var size = React__namespace.useContext(SizeContext$1);
var disabled = React__namespace.useContext(DisabledContext$1);
var mergedDisabled = customDisabled !== null && customDisabled !== void 0 ? customDisabled : disabled;
var groupSize = React__namespace.useContext(GroupSizeContext);
var _React$useState = React__namespace.useState(!!loading), _React$useState2 = _slicedToArray$e(_React$useState, 2), innerLoading = _React$useState2[0], setLoading = _React$useState2[1];
var _React$useState3 = React__namespace.useState(false), _React$useState4 = _slicedToArray$e(_React$useState3, 2), hasTwoCNChar = _React$useState4[0], setHasTwoCNChar = _React$useState4[1];
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, autoInsertSpaceInButton = _React$useContext.autoInsertSpaceInButton, direction = _React$useContext.direction;
var buttonRef = ref || /* @__PURE__ */ React__namespace.createRef();
var isNeedInserted = function isNeedInserted2() {
return React__namespace.Children.count(children) === 1 && !icon && !isUnBorderedButtonType(type2);
};
var fixTwoCNChar = function fixTwoCNChar2() {
if (!buttonRef || !buttonRef.current || autoInsertSpaceInButton === false) {
return;
}
var buttonText = buttonRef.current.textContent;
if (isNeedInserted() && isTwoCNChar(buttonText)) {
if (!hasTwoCNChar) {
setHasTwoCNChar(true);
}
} else if (hasTwoCNChar) {
setHasTwoCNChar(false);
}
};
var loadingOrDelay = typeof loading === "boolean" ? loading : (loading === null || loading === void 0 ? void 0 : loading.delay) || true;
React__namespace.useEffect(function() {
var delayTimer = null;
if (typeof loadingOrDelay === "number") {
delayTimer = window.setTimeout(function() {
delayTimer = null;
setLoading(loadingOrDelay);
}, loadingOrDelay);
} else {
setLoading(loadingOrDelay);
}
return function() {
if (delayTimer) {
window.clearTimeout(delayTimer);
delayTimer = null;
}
};
}, [loadingOrDelay]);
React__namespace.useEffect(fixTwoCNChar, [buttonRef]);
var handleClick = function handleClick2(e2) {
var onClick = props.onClick;
if (innerLoading || mergedDisabled) {
e2.preventDefault();
return;
}
onClick === null || onClick === void 0 ? void 0 : onClick(e2);
};
var prefixCls = getPrefixCls("btn", customizePrefixCls);
var autoInsertSpace = autoInsertSpaceInButton !== false;
var _useCompactItemContex = useCompactItemContext(prefixCls, direction), compactSize = _useCompactItemContex.compactSize, compactItemClassnames = _useCompactItemContex.compactItemClassnames;
var sizeClassNameMap = {
large: "lg",
small: "sm",
middle: void 0
};
var sizeFullname = compactSize || groupSize || customizeSize || size;
var sizeCls = sizeFullname ? sizeClassNameMap[sizeFullname] || "" : "";
var iconType = innerLoading ? "loading" : icon;
var linkButtonRestProps = omit(rest, ["navigate"]);
var classes = classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(shape), shape !== "default" && shape), _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(type2), type2), _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(sizeCls), sizeCls), _defineProperty$b(_classNames, "".concat(prefixCls, "-icon-only"), !children && children !== 0 && !!iconType), _defineProperty$b(_classNames, "".concat(prefixCls, "-background-ghost"), ghost && !isUnBorderedButtonType(type2)), _defineProperty$b(_classNames, "".concat(prefixCls, "-loading"), innerLoading), _defineProperty$b(_classNames, "".concat(prefixCls, "-two-chinese-chars"), hasTwoCNChar && autoInsertSpace && !innerLoading), _defineProperty$b(_classNames, "".concat(prefixCls, "-block"), block), _defineProperty$b(_classNames, "".concat(prefixCls, "-dangerous"), !!danger), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _defineProperty$b(_classNames, "".concat(prefixCls, "-disabled"), linkButtonRestProps.href !== void 0 && mergedDisabled), _classNames), compactItemClassnames, className);
var iconNode = icon && !innerLoading ? icon : /* @__PURE__ */ jsx(LoadingIcon$1, {
existIcon: !!icon,
prefixCls,
loading: !!innerLoading
});
var kids = children || children === 0 ? spaceChildren(children, isNeedInserted() && autoInsertSpace) : null;
if (linkButtonRestProps.href !== void 0) {
return /* @__PURE__ */ jsxs("a", {
...linkButtonRestProps,
className: classes,
onClick: handleClick,
ref: buttonRef,
children: [iconNode, kids]
});
}
var buttonNode = /* @__PURE__ */ jsxs("button", {
...rest,
type: htmlType,
className: classes,
onClick: handleClick,
disabled: mergedDisabled,
ref: buttonRef,
children: [iconNode, kids]
});
if (isUnBorderedButtonType(type2)) {
return buttonNode;
}
return /* @__PURE__ */ jsx(Wave$1, {
disabled: !!innerLoading,
children: buttonNode
});
};
var Button$1 = /* @__PURE__ */ React__namespace.forwardRef(InternalButton);
Button$1.Group = Group$5;
Button$1.__ANT_BUTTON = true;
const Button$2 = Button$1;
var isStyleNameSupport = function isStyleNameSupport2(styleName) {
if (canUseDom$1() && window.document.documentElement) {
var styleNameList = Array.isArray(styleName) ? styleName : [styleName];
var documentElement = window.document.documentElement;
return styleNameList.some(function(name2) {
return name2 in documentElement.style;
});
}
return false;
};
var isStyleValueSupport = function isStyleValueSupport2(styleName, value) {
if (!isStyleNameSupport(styleName)) {
return false;
}
var ele = document.createElement("div");
var origin = ele.style[styleName];
ele.style[styleName] = value;
return ele.style[styleName] !== origin;
};
function isStyleSupport(styleName, styleValue) {
if (!Array.isArray(styleName) && styleValue !== void 0) {
return isStyleValueSupport(styleName, styleValue);
}
return isStyleNameSupport(styleName);
}
var canUseDocElement = function canUseDocElement2() {
return canUseDom$1() && window.document.documentElement;
};
var flexGapSupported;
var detectFlexGapSupported = function detectFlexGapSupported2() {
if (!canUseDocElement()) {
return false;
}
if (flexGapSupported !== void 0) {
return flexGapSupported;
}
var flex = document.createElement("div");
flex.style.display = "flex";
flex.style.flexDirection = "column";
flex.style.rowGap = "1px";
flex.appendChild(document.createElement("div"));
flex.appendChild(document.createElement("div"));
document.body.appendChild(flex);
flexGapSupported = flex.scrollHeight === 1;
document.body.removeChild(flex);
return flexGapSupported;
};
const useFlexGapSupport = function() {
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), flexible = _React$useState2[0], setFlexible = _React$useState2[1];
React__namespace.useEffect(function() {
setFlexible(detectFlexGapSupported());
}, []);
return flexible;
};
function Item$1(_ref) {
var className = _ref.className, direction = _ref.direction, index2 = _ref.index, marginDirection = _ref.marginDirection, children = _ref.children, split = _ref.split, wrap2 = _ref.wrap;
var _React$useContext = React__namespace.useContext(SpaceContext), horizontalSize = _React$useContext.horizontalSize, verticalSize = _React$useContext.verticalSize, latestIndex = _React$useContext.latestIndex, supportFlexGap = _React$useContext.supportFlexGap;
var style2 = {};
if (!supportFlexGap) {
if (direction === "vertical") {
if (index2 < latestIndex) {
style2 = {
marginBottom: horizontalSize / (split ? 2 : 1)
};
}
} else {
style2 = _extends$3(_extends$3({}, index2 < latestIndex && _defineProperty$b({}, marginDirection, horizontalSize / (split ? 2 : 1))), wrap2 && {
paddingBottom: verticalSize
});
}
}
if (children === null || children === void 0) {
return null;
}
return /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx("div", {
className,
style: style2,
children
}), index2 < latestIndex && split && /* @__PURE__ */ jsx("span", {
className: "".concat(className, "-split"),
style: style2,
children: split
})]
});
}
var __rest$G = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var SpaceContext = /* @__PURE__ */ React__namespace.createContext({
latestIndex: 0,
horizontalSize: 0,
verticalSize: 0,
supportFlexGap: false
});
var spaceSize = {
small: 8,
middle: 16,
large: 24
};
function getNumberSize(size) {
return typeof size === "string" ? spaceSize[size] : size || 0;
}
var Space = function Space2(props) {
var _classNames;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, space = _React$useContext.space, directionConfig = _React$useContext.direction;
var _props$size = props.size, size = _props$size === void 0 ? (space === null || space === void 0 ? void 0 : space.size) || "small" : _props$size, align = props.align, className = props.className, children = props.children, _props$direction = props.direction, direction = _props$direction === void 0 ? "horizontal" : _props$direction, customizePrefixCls = props.prefixCls, split = props.split, style2 = props.style, _props$wrap = props.wrap, wrap2 = _props$wrap === void 0 ? false : _props$wrap, otherProps = __rest$G(props, ["size", "align", "className", "children", "direction", "prefixCls", "split", "style", "wrap"]);
var supportFlexGap = useFlexGapSupport();
var _React$useMemo = React__namespace.useMemo(function() {
return (Array.isArray(size) ? size : [size, size]).map(function(item) {
return getNumberSize(item);
});
}, [size]), _React$useMemo2 = _slicedToArray$e(_React$useMemo, 2), horizontalSize = _React$useMemo2[0], verticalSize = _React$useMemo2[1];
var childNodes = toArray$9(children, {
keepEmpty: true
});
var mergedAlign = align === void 0 && direction === "horizontal" ? "center" : align;
var prefixCls = getPrefixCls("space", customizePrefixCls);
var cn = classnames(prefixCls, "".concat(prefixCls, "-").concat(direction), (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), directionConfig === "rtl"), _defineProperty$b(_classNames, "".concat(prefixCls, "-align-").concat(mergedAlign), mergedAlign), _classNames), className);
var itemClassName = "".concat(prefixCls, "-item");
var marginDirection = directionConfig === "rtl" ? "marginLeft" : "marginRight";
var latestIndex = 0;
var nodes = childNodes.map(function(child, i2) {
if (child !== null && child !== void 0) {
latestIndex = i2;
}
var key2 = child && child.key || "".concat(itemClassName, "-").concat(i2);
return /* @__PURE__ */ jsx(Item$1, {
className: itemClassName,
direction,
index: i2,
marginDirection,
split,
wrap: wrap2,
children: child
}, key2);
});
var spaceContext = React__namespace.useMemo(function() {
return {
horizontalSize,
verticalSize,
latestIndex,
supportFlexGap
};
}, [horizontalSize, verticalSize, latestIndex, supportFlexGap]);
if (childNodes.length === 0) {
return null;
}
var gapStyle = {};
if (wrap2) {
gapStyle.flexWrap = "wrap";
if (!supportFlexGap) {
gapStyle.marginBottom = -verticalSize;
}
}
if (supportFlexGap) {
gapStyle.columnGap = horizontalSize;
gapStyle.rowGap = verticalSize;
}
return /* @__PURE__ */ jsx("div", {
className: cn,
style: _extends$3(_extends$3({}, gapStyle), style2),
...otherProps,
children: /* @__PURE__ */ jsx(SpaceContext.Provider, {
value: spaceContext,
children: nodes
})
});
};
var CompoundedSpace = Space;
CompoundedSpace.Compact = Compact;
const _Space = CompoundedSpace;
var __rest$F = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var DropdownButton = function DropdownButton2(props) {
var _React$useContext = React__namespace.useContext(ConfigContext$1), getContextPopupContainer = _React$useContext.getPopupContainer, getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var customizePrefixCls = props.prefixCls, _props$type = props.type, type2 = _props$type === void 0 ? "default" : _props$type, danger = props.danger, disabled = props.disabled, loading = props.loading, onClick = props.onClick, htmlType = props.htmlType, children = props.children, className = props.className, menu = props.menu, arrow = props.arrow, autoFocus = props.autoFocus, overlay = props.overlay, trigger = props.trigger, align = props.align, visible = props.visible, open = props.open, onVisibleChange = props.onVisibleChange, onOpenChange = props.onOpenChange, placement = props.placement, getPopupContainer = props.getPopupContainer, href = props.href, _props$icon = props.icon, icon = _props$icon === void 0 ? /* @__PURE__ */ jsx(EllipsisOutlined$1, {}) : _props$icon, title = props.title, _props$buttonsRender = props.buttonsRender, buttonsRender = _props$buttonsRender === void 0 ? function(buttons) {
return buttons;
} : _props$buttonsRender, mouseEnterDelay = props.mouseEnterDelay, mouseLeaveDelay = props.mouseLeaveDelay, overlayClassName = props.overlayClassName, overlayStyle = props.overlayStyle, destroyPopupOnHide = props.destroyPopupOnHide, restProps = __rest$F(props, ["prefixCls", "type", "danger", "disabled", "loading", "onClick", "htmlType", "children", "className", "menu", "arrow", "autoFocus", "overlay", "trigger", "align", "visible", "open", "onVisibleChange", "onOpenChange", "placement", "getPopupContainer", "href", "icon", "title", "buttonsRender", "mouseEnterDelay", "mouseLeaveDelay", "overlayClassName", "overlayStyle", "destroyPopupOnHide"]);
var prefixCls = getPrefixCls("dropdown-button", customizePrefixCls);
var dropdownProps = {
menu,
arrow,
autoFocus,
align,
disabled,
trigger: disabled ? [] : trigger,
onOpenChange: onOpenChange || onVisibleChange,
getPopupContainer: getPopupContainer || getContextPopupContainer,
mouseEnterDelay,
mouseLeaveDelay,
overlayClassName,
overlayStyle,
destroyPopupOnHide
};
var _useCompactItemContex = useCompactItemContext(prefixCls, direction), compactSize = _useCompactItemContex.compactSize, compactItemClassnames = _useCompactItemContex.compactItemClassnames;
var classes = classnames(prefixCls, compactItemClassnames, className);
if ("overlay" in props) {
dropdownProps.overlay = overlay;
}
if ("open" in props) {
dropdownProps.open = open;
} else if ("visible" in props) {
dropdownProps.open = visible;
}
if ("placement" in props) {
dropdownProps.placement = placement;
} else {
dropdownProps.placement = direction === "rtl" ? "bottomLeft" : "bottomRight";
}
var leftButton = /* @__PURE__ */ jsx(Button$2, {
type: type2,
danger,
disabled,
loading,
onClick,
htmlType,
href,
title,
children
});
var rightButton = /* @__PURE__ */ jsx(Button$2, {
type: type2,
danger,
icon
});
var _buttonsRender = buttonsRender([leftButton, rightButton]), _buttonsRender2 = _slicedToArray$e(_buttonsRender, 2), leftButtonToRender = _buttonsRender2[0], rightButtonToRender = _buttonsRender2[1];
return /* @__PURE__ */ jsxs(_Space.Compact, {
className: classes,
size: compactSize,
block: true,
...restProps,
children: [leftButtonToRender, /* @__PURE__ */ jsx(Dropdown$1, {
...dropdownProps,
children: rightButtonToRender
})]
});
};
DropdownButton.__ANT_BUTTON = true;
const DropdownButton$1 = DropdownButton;
tuple$1("topLeft", "topCenter", "topRight", "bottomLeft", "bottomCenter", "bottomRight", "top", "bottom");
var Dropdown = function Dropdown2(props) {
var _React$useContext = React__namespace.useContext(ConfigContext$1), getContextPopupContainer = _React$useContext.getPopupContainer, getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var getTransitionName2 = function getTransitionName3() {
var rootPrefixCls = getPrefixCls();
var _props$placement = props.placement, placement = _props$placement === void 0 ? "" : _props$placement, transitionName2 = props.transitionName;
if (transitionName2 !== void 0) {
return transitionName2;
}
if (placement.includes("top")) {
return "".concat(rootPrefixCls, "-slide-down");
}
return "".concat(rootPrefixCls, "-slide-up");
};
var getPlacement = function getPlacement2() {
var placement = props.placement;
if (!placement) {
return direction === "rtl" ? "bottomRight" : "bottomLeft";
}
if (placement.includes("Center")) {
var newPlacement = placement.slice(0, placement.indexOf("Center"));
return newPlacement;
}
return placement;
};
var menu = props.menu, arrow = props.arrow, customizePrefixCls = props.prefixCls, children = props.children, trigger = props.trigger, disabled = props.disabled, dropdownRender = props.dropdownRender, getPopupContainer = props.getPopupContainer, overlayClassName = props.overlayClassName, visible = props.visible, open = props.open, onVisibleChange = props.onVisibleChange, onOpenChange = props.onOpenChange, _props$mouseEnterDela = props.mouseEnterDelay, mouseEnterDelay = _props$mouseEnterDela === void 0 ? 0.15 : _props$mouseEnterDela, _props$mouseLeaveDela = props.mouseLeaveDelay, mouseLeaveDelay = _props$mouseLeaveDela === void 0 ? 0.1 : _props$mouseLeaveDela, _props$autoAdjustOver = props.autoAdjustOverflow, autoAdjustOverflow2 = _props$autoAdjustOver === void 0 ? true : _props$autoAdjustOver;
var prefixCls = getPrefixCls("dropdown", customizePrefixCls);
var child = React__namespace.Children.only(children);
var dropdownTrigger = cloneElement(child, {
className: classnames("".concat(prefixCls, "-trigger"), _defineProperty$b({}, "".concat(prefixCls, "-rtl"), direction === "rtl"), child.props.className),
disabled
});
var triggerActions = disabled ? [] : trigger;
var alignPoint2;
if (triggerActions && triggerActions.includes("contextMenu")) {
alignPoint2 = true;
}
var _useMergedState = useMergedState(false, {
value: open !== void 0 ? open : visible
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), mergedOpen = _useMergedState2[0], setOpen = _useMergedState2[1];
var onInnerOpenChange = useEvent(function(nextOpen) {
onVisibleChange === null || onVisibleChange === void 0 ? void 0 : onVisibleChange(nextOpen);
onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(nextOpen);
setOpen(nextOpen);
});
var overlayClassNameCustomized = classnames(overlayClassName, _defineProperty$b({}, "".concat(prefixCls, "-rtl"), direction === "rtl"));
var builtinPlacements = getPlacements({
arrowPointAtCenter: _typeof$q(arrow) === "object" && arrow.pointAtCenter,
autoAdjustOverflow: autoAdjustOverflow2
});
var onMenuClick = React__namespace.useCallback(function() {
setOpen(false);
}, []);
var renderOverlay = function renderOverlay2() {
var overlay = props.overlay;
var overlayNode;
if (menu === null || menu === void 0 ? void 0 : menu.items) {
overlayNode = /* @__PURE__ */ jsx(Menu$1, {
...menu
});
} else if (typeof overlay === "function") {
overlayNode = overlay();
} else {
overlayNode = overlay;
}
if (dropdownRender) {
overlayNode = dropdownRender(overlayNode);
}
overlayNode = React__namespace.Children.only(typeof overlayNode === "string" ? /* @__PURE__ */ jsx("span", {
children: overlayNode
}) : overlayNode);
return /* @__PURE__ */ jsx(OverrideProvider, {
prefixCls: "".concat(prefixCls, "-menu"),
expandIcon: /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-menu-submenu-arrow"),
children: /* @__PURE__ */ jsx(RightOutlined$1, {
className: "".concat(prefixCls, "-menu-submenu-arrow-icon")
})
}),
mode: "vertical",
selectable: false,
onClick: onMenuClick,
validator: function validator2(_ref3) {
_ref3.mode;
},
children: /* @__PURE__ */ jsx(NoCompactStyle, {
children: overlayNode
})
});
};
return /* @__PURE__ */ jsx(Dropdown$3, {
alignPoint: alignPoint2,
...props,
mouseEnterDelay,
mouseLeaveDelay,
visible: mergedOpen,
builtinPlacements,
arrow: !!arrow,
overlayClassName: overlayClassNameCustomized,
prefixCls,
getPopupContainer: getPopupContainer || getContextPopupContainer,
transitionName: getTransitionName2(),
trigger: triggerActions,
overlay: renderOverlay,
placement: getPlacement(),
onVisibleChange: onInnerOpenChange,
children: dropdownTrigger
});
};
Dropdown.Button = DropdownButton$1;
const Dropdown$1 = Dropdown;
var freeGlobal$3 = typeof commonjsGlobal == "object" && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal;
var _freeGlobal = freeGlobal$3;
var freeGlobal$2 = _freeGlobal;
var freeSelf$1 = typeof self == "object" && self && self.Object === Object && self;
var root$b = freeGlobal$2 || freeSelf$1 || Function("return this")();
var _root = root$b;
var root$a = _root;
var Symbol$7 = root$a.Symbol;
var _Symbol = Symbol$7;
var isArray$8 = Array.isArray;
var isArray_1 = isArray$8;
var Symbol$6 = _Symbol;
var objectProto$r = Object.prototype;
var hasOwnProperty$p = objectProto$r.hasOwnProperty;
var nativeObjectToString$3 = objectProto$r.toString;
var symToStringTag$3 = Symbol$6 ? Symbol$6.toStringTag : void 0;
function getRawTag$2(value) {
var isOwn = hasOwnProperty$p.call(value, symToStringTag$3), tag = value[symToStringTag$3];
try {
value[symToStringTag$3] = void 0;
var unmasked = true;
} catch (e2) {
}
var result = nativeObjectToString$3.call(value);
if (unmasked) {
if (isOwn) {
value[symToStringTag$3] = tag;
} else {
delete value[symToStringTag$3];
}
}
return result;
}
var _getRawTag = getRawTag$2;
var objectProto$q = Object.prototype;
var nativeObjectToString$2 = objectProto$q.toString;
function objectToString$2(value) {
return nativeObjectToString$2.call(value);
}
var _objectToString = objectToString$2;
var Symbol$5 = _Symbol, getRawTag$1 = _getRawTag, objectToString$1 = _objectToString;
var nullTag$1 = "[object Null]", undefinedTag$1 = "[object Undefined]";
var symToStringTag$2 = Symbol$5 ? Symbol$5.toStringTag : void 0;
function baseGetTag$6(value) {
if (value == null) {
return value === void 0 ? undefinedTag$1 : nullTag$1;
}
return symToStringTag$2 && symToStringTag$2 in Object(value) ? getRawTag$1(value) : objectToString$1(value);
}
var _baseGetTag = baseGetTag$6;
function isObjectLike$6(value) {
return value != null && typeof value == "object";
}
var isObjectLike_1 = isObjectLike$6;
var baseGetTag$5 = _baseGetTag, isObjectLike$5 = isObjectLike_1;
var symbolTag$5 = "[object Symbol]";
function isSymbol$3(value) {
return typeof value == "symbol" || isObjectLike$5(value) && baseGetTag$5(value) == symbolTag$5;
}
var isSymbol_1 = isSymbol$3;
var reWhitespace = /\s/;
function trimmedEndIndex$1(string2) {
var index2 = string2.length;
while (index2-- && reWhitespace.test(string2.charAt(index2))) {
}
return index2;
}
var _trimmedEndIndex = trimmedEndIndex$1;
var trimmedEndIndex = _trimmedEndIndex;
var reTrimStart = /^\s+/;
function baseTrim$1(string2) {
return string2 ? string2.slice(0, trimmedEndIndex(string2) + 1).replace(reTrimStart, "") : string2;
}
var _baseTrim = baseTrim$1;
function isObject$b(value) {
var type2 = typeof value;
return value != null && (type2 == "object" || type2 == "function");
}
var isObject_1 = isObject$b;
var baseTrim = _baseTrim, isObject$a = isObject_1, isSymbol$2 = isSymbol_1;
var NAN = 0 / 0;
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
var reIsBinary = /^0b[01]+$/i;
var reIsOctal = /^0o[0-7]+$/i;
var freeParseInt = parseInt;
function toNumber$1(value) {
if (typeof value == "number") {
return value;
}
if (isSymbol$2(value)) {
return NAN;
}
if (isObject$a(value)) {
var other = typeof value.valueOf == "function" ? value.valueOf() : value;
value = isObject$a(other) ? other + "" : other;
}
if (typeof value != "string") {
return value === 0 ? value : +value;
}
value = baseTrim(value);
var isBinary = reIsBinary.test(value);
return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
}
var toNumber_1 = toNumber$1;
var PanelContext = /* @__PURE__ */ React__namespace.createContext({});
var HIDDEN_STYLE$2 = {
visibility: "hidden"
};
function Header$1(_ref) {
var prefixCls = _ref.prefixCls, _ref$prevIcon = _ref.prevIcon, prevIcon = _ref$prevIcon === void 0 ? "\u2039" : _ref$prevIcon, _ref$nextIcon = _ref.nextIcon, nextIcon = _ref$nextIcon === void 0 ? "\u203A" : _ref$nextIcon, _ref$superPrevIcon = _ref.superPrevIcon, superPrevIcon = _ref$superPrevIcon === void 0 ? "\xAB" : _ref$superPrevIcon, _ref$superNextIcon = _ref.superNextIcon, superNextIcon = _ref$superNextIcon === void 0 ? "\xBB" : _ref$superNextIcon, onSuperPrev = _ref.onSuperPrev, onSuperNext = _ref.onSuperNext, onPrev = _ref.onPrev, onNext = _ref.onNext, children = _ref.children;
var _React$useContext = React__namespace.useContext(PanelContext), hideNextBtn = _React$useContext.hideNextBtn, hidePrevBtn = _React$useContext.hidePrevBtn;
return /* @__PURE__ */ jsxs("div", {
className: prefixCls,
children: [onSuperPrev && /* @__PURE__ */ jsx("button", {
type: "button",
onClick: onSuperPrev,
tabIndex: -1,
className: "".concat(prefixCls, "-super-prev-btn"),
style: hidePrevBtn ? HIDDEN_STYLE$2 : {},
children: superPrevIcon
}), onPrev && /* @__PURE__ */ jsx("button", {
type: "button",
onClick: onPrev,
tabIndex: -1,
className: "".concat(prefixCls, "-prev-btn"),
style: hidePrevBtn ? HIDDEN_STYLE$2 : {},
children: prevIcon
}), /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-view"),
children
}), onNext && /* @__PURE__ */ jsx("button", {
type: "button",
onClick: onNext,
tabIndex: -1,
className: "".concat(prefixCls, "-next-btn"),
style: hideNextBtn ? HIDDEN_STYLE$2 : {},
children: nextIcon
}), onSuperNext && /* @__PURE__ */ jsx("button", {
type: "button",
onClick: onSuperNext,
tabIndex: -1,
className: "".concat(prefixCls, "-super-next-btn"),
style: hideNextBtn ? HIDDEN_STYLE$2 : {},
children: superNextIcon
})]
});
}
function DecadeHeader(props) {
var prefixCls = props.prefixCls, generateConfig2 = props.generateConfig, viewDate = props.viewDate, onPrevDecades = props.onPrevDecades, onNextDecades = props.onNextDecades;
var _React$useContext = React__namespace.useContext(PanelContext), hideHeader = _React$useContext.hideHeader;
if (hideHeader) {
return null;
}
var headerPrefixCls = "".concat(prefixCls, "-header");
var yearNumber = generateConfig2.getYear(viewDate);
var startYear = Math.floor(yearNumber / DECADE_DISTANCE_COUNT) * DECADE_DISTANCE_COUNT;
var endYear = startYear + DECADE_DISTANCE_COUNT - 1;
return /* @__PURE__ */ jsxs(Header$1, {
...props,
prefixCls: headerPrefixCls,
onSuperPrev: onPrevDecades,
onSuperNext: onNextDecades,
children: [startYear, "-", endYear]
});
}
function setTime(generateConfig2, date2, hour, minute, second) {
var nextTime = generateConfig2.setHour(date2, hour);
nextTime = generateConfig2.setMinute(nextTime, minute);
nextTime = generateConfig2.setSecond(nextTime, second);
return nextTime;
}
function setDateTime(generateConfig2, date2, defaultDate) {
if (!defaultDate) {
return date2;
}
var newDate = date2;
newDate = generateConfig2.setHour(newDate, generateConfig2.getHour(defaultDate));
newDate = generateConfig2.setMinute(newDate, generateConfig2.getMinute(defaultDate));
newDate = generateConfig2.setSecond(newDate, generateConfig2.getSecond(defaultDate));
return newDate;
}
function getLowerBoundTime(hour, minute, second, hourStep, minuteStep, secondStep) {
var lowerBoundHour = Math.floor(hour / hourStep) * hourStep;
if (lowerBoundHour < hour) {
return [lowerBoundHour, 60 - minuteStep, 60 - secondStep];
}
var lowerBoundMinute = Math.floor(minute / minuteStep) * minuteStep;
if (lowerBoundMinute < minute) {
return [lowerBoundHour, lowerBoundMinute, 60 - secondStep];
}
var lowerBoundSecond = Math.floor(second / secondStep) * secondStep;
return [lowerBoundHour, lowerBoundMinute, lowerBoundSecond];
}
function getLastDay(generateConfig2, date2) {
var year = generateConfig2.getYear(date2);
var month = generateConfig2.getMonth(date2) + 1;
var endDate = generateConfig2.getEndDate(generateConfig2.getFixedDate("".concat(year, "-").concat(month, "-01")));
var lastDay = generateConfig2.getDate(endDate);
var monthShow = month < 10 ? "0".concat(month) : "".concat(month);
return "".concat(year, "-").concat(monthShow, "-").concat(lastDay);
}
function PanelBody(_ref) {
var prefixCls = _ref.prefixCls, disabledDate = _ref.disabledDate, onSelect = _ref.onSelect, picker = _ref.picker, rowNum = _ref.rowNum, colNum = _ref.colNum, prefixColumn = _ref.prefixColumn, rowClassName = _ref.rowClassName, baseDate = _ref.baseDate, getCellClassName = _ref.getCellClassName, getCellText = _ref.getCellText, getCellNode = _ref.getCellNode, getCellDate = _ref.getCellDate, generateConfig2 = _ref.generateConfig, titleCell = _ref.titleCell, headerCells = _ref.headerCells;
var _React$useContext = React__namespace.useContext(PanelContext), onDateMouseEnter = _React$useContext.onDateMouseEnter, onDateMouseLeave = _React$useContext.onDateMouseLeave, mode = _React$useContext.mode;
var cellPrefixCls = "".concat(prefixCls, "-cell");
var rows = [];
for (var i2 = 0; i2 < rowNum; i2 += 1) {
var row = [];
var rowStartDate = void 0;
var _loop = function _loop2() {
var _objectSpread22;
var offset2 = i2 * colNum + j2;
var currentDate = getCellDate(baseDate, offset2);
var disabled = getCellDateDisabled({
cellDate: currentDate,
mode,
disabledDate,
generateConfig: generateConfig2
});
if (j2 === 0) {
rowStartDate = currentDate;
if (prefixColumn) {
row.push(prefixColumn(rowStartDate));
}
}
var title = titleCell && titleCell(currentDate);
row.push(
/* @__PURE__ */ jsx("td", {
title,
className: classnames(cellPrefixCls, _objectSpread2$a((_objectSpread22 = {}, _defineProperty$b(_objectSpread22, "".concat(cellPrefixCls, "-disabled"), disabled), _defineProperty$b(_objectSpread22, "".concat(cellPrefixCls, "-start"), getCellText(currentDate) === 1 || picker === "year" && Number(title) % 10 === 0), _defineProperty$b(_objectSpread22, "".concat(cellPrefixCls, "-end"), title === getLastDay(generateConfig2, currentDate) || picker === "year" && Number(title) % 10 === 9), _objectSpread22), getCellClassName(currentDate))),
onClick: function onClick() {
if (!disabled) {
onSelect(currentDate);
}
},
onMouseEnter: function onMouseEnter() {
if (!disabled && onDateMouseEnter) {
onDateMouseEnter(currentDate);
}
},
onMouseLeave: function onMouseLeave() {
if (!disabled && onDateMouseLeave) {
onDateMouseLeave(currentDate);
}
},
children: getCellNode ? getCellNode(currentDate) : /* @__PURE__ */ jsx("div", {
className: "".concat(cellPrefixCls, "-inner"),
children: getCellText(currentDate)
})
}, j2)
);
};
for (var j2 = 0; j2 < colNum; j2 += 1) {
_loop();
}
rows.push(
/* @__PURE__ */ jsx("tr", {
className: rowClassName && rowClassName(rowStartDate),
children: row
}, i2)
);
}
return /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-body"),
children: /* @__PURE__ */ jsxs("table", {
className: "".concat(prefixCls, "-content"),
children: [headerCells && /* @__PURE__ */ jsx("thead", {
children: /* @__PURE__ */ jsx("tr", {
children: headerCells
})
}), /* @__PURE__ */ jsx("tbody", {
children: rows
})]
})
});
}
var DECADE_COL_COUNT = 3;
var DECADE_ROW_COUNT = 4;
function DecadeBody(props) {
var DECADE_UNIT_DIFF_DES = DECADE_UNIT_DIFF - 1;
var prefixCls = props.prefixCls, viewDate = props.viewDate, generateConfig2 = props.generateConfig;
var cellPrefixCls = "".concat(prefixCls, "-cell");
var yearNumber = generateConfig2.getYear(viewDate);
var decadeYearNumber = Math.floor(yearNumber / DECADE_UNIT_DIFF) * DECADE_UNIT_DIFF;
var startDecadeYear = Math.floor(yearNumber / DECADE_DISTANCE_COUNT) * DECADE_DISTANCE_COUNT;
var endDecadeYear = startDecadeYear + DECADE_DISTANCE_COUNT - 1;
var baseDecadeYear = generateConfig2.setYear(viewDate, startDecadeYear - Math.ceil((DECADE_COL_COUNT * DECADE_ROW_COUNT * DECADE_UNIT_DIFF - DECADE_DISTANCE_COUNT) / 2));
var getCellClassName = function getCellClassName2(date2) {
var _ref;
var startDecadeNumber = generateConfig2.getYear(date2);
var endDecadeNumber = startDecadeNumber + DECADE_UNIT_DIFF_DES;
return _ref = {}, _defineProperty$b(_ref, "".concat(cellPrefixCls, "-in-view"), startDecadeYear <= startDecadeNumber && endDecadeNumber <= endDecadeYear), _defineProperty$b(_ref, "".concat(cellPrefixCls, "-selected"), startDecadeNumber === decadeYearNumber), _ref;
};
return /* @__PURE__ */ jsx(PanelBody, {
...props,
rowNum: DECADE_ROW_COUNT,
colNum: DECADE_COL_COUNT,
baseDate: baseDecadeYear,
getCellText: function getCellText(date2) {
var startDecadeNumber = generateConfig2.getYear(date2);
return "".concat(startDecadeNumber, "-").concat(startDecadeNumber + DECADE_UNIT_DIFF_DES);
},
getCellClassName,
getCellDate: function getCellDate(date2, offset2) {
return generateConfig2.addYear(date2, offset2 * DECADE_UNIT_DIFF);
}
});
}
var scrollIds = /* @__PURE__ */ new Map();
function waitElementReady(element, callback) {
var id2;
function tryOrNextFrame() {
if (isVisible(element)) {
callback();
} else {
id2 = wrapperRaf$1(function() {
tryOrNextFrame();
});
}
}
tryOrNextFrame();
return function() {
wrapperRaf$1.cancel(id2);
};
}
function scrollTo(element, to, duration) {
if (scrollIds.get(element)) {
cancelAnimationFrame(scrollIds.get(element));
}
if (duration <= 0) {
scrollIds.set(element, requestAnimationFrame(function() {
element.scrollTop = to;
}));
return;
}
var difference = to - element.scrollTop;
var perTick = difference / duration * 10;
scrollIds.set(element, requestAnimationFrame(function() {
element.scrollTop += perTick;
if (element.scrollTop !== to) {
scrollTo(element, to, duration - 10);
}
}));
}
function createKeyDownHandler(event, _ref) {
var onLeftRight = _ref.onLeftRight, onCtrlLeftRight = _ref.onCtrlLeftRight, onUpDown = _ref.onUpDown, onPageUpDown = _ref.onPageUpDown, onEnter = _ref.onEnter;
var which = event.which, ctrlKey = event.ctrlKey, metaKey = event.metaKey;
switch (which) {
case KeyCode.LEFT:
if (ctrlKey || metaKey) {
if (onCtrlLeftRight) {
onCtrlLeftRight(-1);
return true;
}
} else if (onLeftRight) {
onLeftRight(-1);
return true;
}
break;
case KeyCode.RIGHT:
if (ctrlKey || metaKey) {
if (onCtrlLeftRight) {
onCtrlLeftRight(1);
return true;
}
} else if (onLeftRight) {
onLeftRight(1);
return true;
}
break;
case KeyCode.UP:
if (onUpDown) {
onUpDown(-1);
return true;
}
break;
case KeyCode.DOWN:
if (onUpDown) {
onUpDown(1);
return true;
}
break;
case KeyCode.PAGE_UP:
if (onPageUpDown) {
onPageUpDown(-1);
return true;
}
break;
case KeyCode.PAGE_DOWN:
if (onPageUpDown) {
onPageUpDown(1);
return true;
}
break;
case KeyCode.ENTER:
if (onEnter) {
onEnter();
return true;
}
break;
}
return false;
}
function getDefaultFormat(format2, picker, showTime, use12Hours) {
var mergedFormat = format2;
if (!mergedFormat) {
switch (picker) {
case "time":
mergedFormat = use12Hours ? "hh:mm:ss a" : "HH:mm:ss";
break;
case "week":
mergedFormat = "gggg-wo";
break;
case "month":
mergedFormat = "YYYY-MM";
break;
case "quarter":
mergedFormat = "YYYY-[Q]Q";
break;
case "year":
mergedFormat = "YYYY";
break;
default:
mergedFormat = showTime ? "YYYY-MM-DD HH:mm:ss" : "YYYY-MM-DD";
}
}
return mergedFormat;
}
function getInputSize(picker, format2, generateConfig2) {
var defaultSize = picker === "time" ? 8 : 10;
var length = typeof format2 === "function" ? format2(generateConfig2.getNow()).length : format2.length;
return Math.max(defaultSize, length) + 2;
}
var globalClickFunc = null;
var clickCallbacks = /* @__PURE__ */ new Set();
function addGlobalMouseDownEvent(callback) {
if (!globalClickFunc && typeof window !== "undefined" && window.addEventListener) {
globalClickFunc = function globalClickFunc2(e2) {
_toConsumableArray$c(clickCallbacks).forEach(function(queueFunc) {
queueFunc(e2);
});
};
window.addEventListener("mousedown", globalClickFunc);
}
clickCallbacks.add(callback);
return function() {
clickCallbacks.delete(callback);
if (clickCallbacks.size === 0) {
window.removeEventListener("mousedown", globalClickFunc);
globalClickFunc = null;
}
};
}
function getTargetFromEvent(e2) {
var target = e2.target;
if (e2.composed && target.shadowRoot) {
var _e$composedPath;
return ((_e$composedPath = e2.composedPath) === null || _e$composedPath === void 0 ? void 0 : _e$composedPath.call(e2)[0]) || target;
}
return target;
}
var getYearNextMode = function getYearNextMode2(next) {
if (next === "month" || next === "date") {
return "year";
}
return next;
};
var getMonthNextMode = function getMonthNextMode2(next) {
if (next === "date") {
return "month";
}
return next;
};
var getQuarterNextMode = function getQuarterNextMode2(next) {
if (next === "month" || next === "date") {
return "quarter";
}
return next;
};
var getWeekNextMode = function getWeekNextMode2(next) {
if (next === "date") {
return "week";
}
return next;
};
var PickerModeMap = {
year: getYearNextMode,
month: getMonthNextMode,
quarter: getQuarterNextMode,
week: getWeekNextMode,
time: null,
date: null
};
function elementsContains(elements, target) {
return elements.some(function(ele) {
return ele && ele.contains(target);
});
}
var DECADE_UNIT_DIFF = 10;
var DECADE_DISTANCE_COUNT = DECADE_UNIT_DIFF * 10;
function DecadePanel(props) {
var prefixCls = props.prefixCls, onViewDateChange = props.onViewDateChange, generateConfig2 = props.generateConfig, viewDate = props.viewDate, operationRef = props.operationRef, onSelect = props.onSelect, onPanelChange = props.onPanelChange;
var panelPrefixCls = "".concat(prefixCls, "-decade-panel");
operationRef.current = {
onKeyDown: function onKeyDown2(event) {
return createKeyDownHandler(event, {
onLeftRight: function onLeftRight(diff) {
onSelect(generateConfig2.addYear(viewDate, diff * DECADE_UNIT_DIFF), "key");
},
onCtrlLeftRight: function onCtrlLeftRight(diff) {
onSelect(generateConfig2.addYear(viewDate, diff * DECADE_DISTANCE_COUNT), "key");
},
onUpDown: function onUpDown(diff) {
onSelect(generateConfig2.addYear(viewDate, diff * DECADE_UNIT_DIFF * DECADE_COL_COUNT), "key");
},
onEnter: function onEnter() {
onPanelChange("year", viewDate);
}
});
}
};
var onDecadesChange = function onDecadesChange2(diff) {
var newDate = generateConfig2.addYear(viewDate, diff * DECADE_DISTANCE_COUNT);
onViewDateChange(newDate);
onPanelChange(null, newDate);
};
var onInternalSelect = function onInternalSelect2(date2) {
onSelect(date2, "mouse");
onPanelChange("year", date2);
};
return /* @__PURE__ */ jsxs("div", {
className: panelPrefixCls,
children: [/* @__PURE__ */ jsx(DecadeHeader, {
...props,
prefixCls,
onPrevDecades: function onPrevDecades() {
onDecadesChange(-1);
},
onNextDecades: function onNextDecades() {
onDecadesChange(1);
}
}), /* @__PURE__ */ jsx(DecadeBody, {
...props,
prefixCls,
onSelect: onInternalSelect
})]
});
}
var WEEK_DAY_COUNT = 7;
function isNullEqual(value1, value2) {
if (!value1 && !value2) {
return true;
}
if (!value1 || !value2) {
return false;
}
return void 0;
}
function isSameDecade(generateConfig2, decade1, decade2) {
var equal = isNullEqual(decade1, decade2);
if (typeof equal === "boolean") {
return equal;
}
var num1 = Math.floor(generateConfig2.getYear(decade1) / 10);
var num2 = Math.floor(generateConfig2.getYear(decade2) / 10);
return num1 === num2;
}
function isSameYear(generateConfig2, year1, year2) {
var equal = isNullEqual(year1, year2);
if (typeof equal === "boolean") {
return equal;
}
return generateConfig2.getYear(year1) === generateConfig2.getYear(year2);
}
function getQuarter(generateConfig2, date2) {
var quota = Math.floor(generateConfig2.getMonth(date2) / 3);
return quota + 1;
}
function isSameQuarter(generateConfig2, quarter1, quarter2) {
var equal = isNullEqual(quarter1, quarter2);
if (typeof equal === "boolean") {
return equal;
}
return isSameYear(generateConfig2, quarter1, quarter2) && getQuarter(generateConfig2, quarter1) === getQuarter(generateConfig2, quarter2);
}
function isSameMonth(generateConfig2, month1, month2) {
var equal = isNullEqual(month1, month2);
if (typeof equal === "boolean") {
return equal;
}
return isSameYear(generateConfig2, month1, month2) && generateConfig2.getMonth(month1) === generateConfig2.getMonth(month2);
}
function isSameDate(generateConfig2, date1, date2) {
var equal = isNullEqual(date1, date2);
if (typeof equal === "boolean") {
return equal;
}
return generateConfig2.getYear(date1) === generateConfig2.getYear(date2) && generateConfig2.getMonth(date1) === generateConfig2.getMonth(date2) && generateConfig2.getDate(date1) === generateConfig2.getDate(date2);
}
function isSameTime(generateConfig2, time1, time2) {
var equal = isNullEqual(time1, time2);
if (typeof equal === "boolean") {
return equal;
}
return generateConfig2.getHour(time1) === generateConfig2.getHour(time2) && generateConfig2.getMinute(time1) === generateConfig2.getMinute(time2) && generateConfig2.getSecond(time1) === generateConfig2.getSecond(time2);
}
function isSameWeek(generateConfig2, locale2, date1, date2) {
var equal = isNullEqual(date1, date2);
if (typeof equal === "boolean") {
return equal;
}
return generateConfig2.locale.getWeek(locale2, date1) === generateConfig2.locale.getWeek(locale2, date2);
}
function isEqual$1(generateConfig2, value1, value2) {
return isSameDate(generateConfig2, value1, value2) && isSameTime(generateConfig2, value1, value2);
}
function isInRange(generateConfig2, startDate, endDate, current) {
if (!startDate || !endDate || !current) {
return false;
}
return !isSameDate(generateConfig2, startDate, current) && !isSameDate(generateConfig2, endDate, current) && generateConfig2.isAfter(current, startDate) && generateConfig2.isAfter(endDate, current);
}
function getWeekStartDate(locale2, generateConfig2, value) {
var weekFirstDay = generateConfig2.locale.getWeekFirstDay(locale2);
var monthStartDate = generateConfig2.setDate(value, 1);
var startDateWeekDay = generateConfig2.getWeekDay(monthStartDate);
var alignStartDate = generateConfig2.addDate(monthStartDate, weekFirstDay - startDateWeekDay);
if (generateConfig2.getMonth(alignStartDate) === generateConfig2.getMonth(value) && generateConfig2.getDate(alignStartDate) > 1) {
alignStartDate = generateConfig2.addDate(alignStartDate, -7);
}
return alignStartDate;
}
function getClosingViewDate(viewDate, picker, generateConfig2) {
var offset2 = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : 1;
switch (picker) {
case "year":
return generateConfig2.addYear(viewDate, offset2 * 10);
case "quarter":
case "month":
return generateConfig2.addYear(viewDate, offset2);
default:
return generateConfig2.addMonth(viewDate, offset2);
}
}
function formatValue(value, _ref) {
var generateConfig2 = _ref.generateConfig, locale2 = _ref.locale, format2 = _ref.format;
return typeof format2 === "function" ? format2(value) : generateConfig2.locale.format(locale2.locale, value, format2);
}
function parseValue(value, _ref2) {
var generateConfig2 = _ref2.generateConfig, locale2 = _ref2.locale, formatList = _ref2.formatList;
if (!value || typeof formatList[0] === "function") {
return null;
}
return generateConfig2.locale.parse(locale2.locale, value, formatList);
}
function getCellDateDisabled(_ref3) {
var cellDate = _ref3.cellDate, mode = _ref3.mode, disabledDate = _ref3.disabledDate, generateConfig2 = _ref3.generateConfig;
if (!disabledDate)
return false;
var getDisabledFromRange = function getDisabledFromRange2(currentMode, start, end) {
var current = start;
while (current <= end) {
var date2 = void 0;
switch (currentMode) {
case "date": {
date2 = generateConfig2.setDate(cellDate, current);
if (!disabledDate(date2)) {
return false;
}
break;
}
case "month": {
date2 = generateConfig2.setMonth(cellDate, current);
if (!getCellDateDisabled({
cellDate: date2,
mode: "month",
generateConfig: generateConfig2,
disabledDate
})) {
return false;
}
break;
}
case "year": {
date2 = generateConfig2.setYear(cellDate, current);
if (!getCellDateDisabled({
cellDate: date2,
mode: "year",
generateConfig: generateConfig2,
disabledDate
})) {
return false;
}
break;
}
}
current += 1;
}
return true;
};
switch (mode) {
case "date":
case "week": {
return disabledDate(cellDate);
}
case "month": {
var startDate = 1;
var endDate = generateConfig2.getDate(generateConfig2.getEndDate(cellDate));
return getDisabledFromRange("date", startDate, endDate);
}
case "quarter": {
var startMonth = Math.floor(generateConfig2.getMonth(cellDate) / 3) * 3;
var endMonth = startMonth + 2;
return getDisabledFromRange("month", startMonth, endMonth);
}
case "year": {
return getDisabledFromRange("month", 0, 11);
}
case "decade": {
var year = generateConfig2.getYear(cellDate);
var startYear = Math.floor(year / DECADE_UNIT_DIFF) * DECADE_UNIT_DIFF;
var endYear = startYear + DECADE_UNIT_DIFF - 1;
return getDisabledFromRange("year", startYear, endYear);
}
}
}
function TimeHeader(props) {
var _React$useContext = React__namespace.useContext(PanelContext), hideHeader = _React$useContext.hideHeader;
if (hideHeader) {
return null;
}
var prefixCls = props.prefixCls, generateConfig2 = props.generateConfig, locale2 = props.locale, value = props.value, format2 = props.format;
var headerPrefixCls = "".concat(prefixCls, "-header");
return /* @__PURE__ */ jsx(Header$1, {
prefixCls: headerPrefixCls,
children: value ? formatValue(value, {
locale: locale2,
format: format2,
generateConfig: generateConfig2
}) : "\xA0"
});
}
function TimeUnitColumn(props) {
var prefixCls = props.prefixCls, units = props.units, onSelect = props.onSelect, value = props.value, active = props.active, hideDisabledOptions = props.hideDisabledOptions;
var cellPrefixCls = "".concat(prefixCls, "-cell");
var _React$useContext = React__namespace.useContext(PanelContext), open = _React$useContext.open;
var ulRef = React$a.useRef(null);
var liRefs = React$a.useRef(/* @__PURE__ */ new Map());
var scrollRef = React$a.useRef();
React$a.useLayoutEffect(function() {
var li = liRefs.current.get(value);
if (li && open !== false) {
scrollTo(ulRef.current, li.offsetTop, 120);
}
}, [value]);
React$a.useLayoutEffect(function() {
if (open) {
var li = liRefs.current.get(value);
if (li) {
scrollRef.current = waitElementReady(li, function() {
scrollTo(ulRef.current, li.offsetTop, 0);
});
}
}
return function() {
var _scrollRef$current;
(_scrollRef$current = scrollRef.current) === null || _scrollRef$current === void 0 ? void 0 : _scrollRef$current.call(scrollRef);
};
}, [open]);
return /* @__PURE__ */ jsx("ul", {
className: classnames("".concat(prefixCls, "-column"), _defineProperty$b({}, "".concat(prefixCls, "-column-active"), active)),
ref: ulRef,
style: {
position: "relative"
},
children: units.map(function(unit) {
var _classNames2;
if (hideDisabledOptions && unit.disabled) {
return null;
}
return /* @__PURE__ */ jsx("li", {
ref: function ref(element) {
liRefs.current.set(unit.value, element);
},
className: classnames(cellPrefixCls, (_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(cellPrefixCls, "-disabled"), unit.disabled), _defineProperty$b(_classNames2, "".concat(cellPrefixCls, "-selected"), value === unit.value), _classNames2)),
onClick: function onClick() {
if (unit.disabled) {
return;
}
onSelect(unit.value);
},
children: /* @__PURE__ */ jsx("div", {
className: "".concat(cellPrefixCls, "-inner"),
children: unit.label
})
}, unit.value);
})
});
}
function leftPad(str, length) {
var fill = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : "0";
var current = String(str);
while (current.length < length) {
current = "".concat(fill).concat(str);
}
return current;
}
var tuple = function tuple2() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return args;
};
function toArray$6(val) {
if (val === null || val === void 0) {
return [];
}
return Array.isArray(val) ? val : [val];
}
function getDataOrAriaProps(props) {
var retProps = {};
Object.keys(props).forEach(function(key2) {
if ((key2.substr(0, 5) === "data-" || key2.substr(0, 5) === "aria-" || key2 === "role" || key2 === "name") && key2.substr(0, 7) !== "data-__") {
retProps[key2] = props[key2];
}
});
return retProps;
}
function getValue$3(values, index2) {
return values ? values[index2] : null;
}
function updateValues(values, value, index2) {
var newValues = [getValue$3(values, 0), getValue$3(values, 1)];
newValues[index2] = typeof value === "function" ? value(newValues[index2]) : value;
if (!newValues[0] && !newValues[1]) {
return null;
}
return newValues;
}
function shouldUnitsUpdate(prevUnits, nextUnits) {
if (prevUnits.length !== nextUnits.length)
return true;
for (var i2 = 0; i2 < prevUnits.length; i2 += 1) {
if (prevUnits[i2].disabled !== nextUnits[i2].disabled)
return true;
}
return false;
}
function generateUnits(start, end, step2, disabledUnits) {
var units = [];
var integerStep = step2 >= 1 ? step2 | 0 : 1;
for (var i2 = start; i2 <= end; i2 += integerStep) {
units.push({
label: leftPad(i2, 2),
value: i2,
disabled: (disabledUnits || []).includes(i2)
});
}
return units;
}
function TimeBody(props) {
var generateConfig2 = props.generateConfig, prefixCls = props.prefixCls, operationRef = props.operationRef, activeColumnIndex = props.activeColumnIndex, value = props.value, showHour = props.showHour, showMinute = props.showMinute, showSecond = props.showSecond, use12Hours = props.use12Hours, _props$hourStep = props.hourStep, hourStep = _props$hourStep === void 0 ? 1 : _props$hourStep, _props$minuteStep = props.minuteStep, minuteStep = _props$minuteStep === void 0 ? 1 : _props$minuteStep, _props$secondStep = props.secondStep, secondStep = _props$secondStep === void 0 ? 1 : _props$secondStep, disabledHours = props.disabledHours, disabledMinutes = props.disabledMinutes, disabledSeconds = props.disabledSeconds, disabledTime = props.disabledTime, hideDisabledOptions = props.hideDisabledOptions, onSelect = props.onSelect;
var columns = [];
var contentPrefixCls = "".concat(prefixCls, "-content");
var columnPrefixCls = "".concat(prefixCls, "-time-panel");
var isPM;
var originHour = value ? generateConfig2.getHour(value) : -1;
var hour = originHour;
var minute = value ? generateConfig2.getMinute(value) : -1;
var second = value ? generateConfig2.getSecond(value) : -1;
var now2 = generateConfig2.getNow();
var _React$useMemo = React__namespace.useMemo(function() {
if (disabledTime) {
var disabledConfig = disabledTime(now2);
return [disabledConfig.disabledHours, disabledConfig.disabledMinutes, disabledConfig.disabledSeconds];
}
return [disabledHours, disabledMinutes, disabledSeconds];
}, [disabledHours, disabledMinutes, disabledSeconds, disabledTime, now2]), _React$useMemo2 = _slicedToArray$e(_React$useMemo, 3), mergedDisabledHours = _React$useMemo2[0], mergedDisabledMinutes = _React$useMemo2[1], mergedDisabledSeconds = _React$useMemo2[2];
var setTime$1 = function setTime$12(isNewPM, newHour, newMinute, newSecond) {
var newDate = value || generateConfig2.getNow();
var mergedHour = Math.max(0, newHour);
var mergedMinute = Math.max(0, newMinute);
var mergedSecond = Math.max(0, newSecond);
newDate = setTime(generateConfig2, newDate, !use12Hours || !isNewPM ? mergedHour : mergedHour + 12, mergedMinute, mergedSecond);
return newDate;
};
var rawHours = generateUnits(0, 23, hourStep, mergedDisabledHours && mergedDisabledHours());
var memorizedRawHours = useMemo(function() {
return rawHours;
}, rawHours, shouldUnitsUpdate);
if (use12Hours) {
isPM = hour >= 12;
hour %= 12;
}
var _React$useMemo3 = React__namespace.useMemo(function() {
if (!use12Hours) {
return [false, false];
}
var AMPMDisabled = [true, true];
memorizedRawHours.forEach(function(_ref) {
var disabled = _ref.disabled, hourValue = _ref.value;
if (disabled)
return;
if (hourValue >= 12) {
AMPMDisabled[1] = false;
} else {
AMPMDisabled[0] = false;
}
});
return AMPMDisabled;
}, [use12Hours, memorizedRawHours]), _React$useMemo4 = _slicedToArray$e(_React$useMemo3, 2), AMDisabled = _React$useMemo4[0], PMDisabled = _React$useMemo4[1];
var hours = React__namespace.useMemo(function() {
if (!use12Hours)
return memorizedRawHours;
return memorizedRawHours.filter(isPM ? function(hourMeta) {
return hourMeta.value >= 12;
} : function(hourMeta) {
return hourMeta.value < 12;
}).map(function(hourMeta) {
var hourValue = hourMeta.value % 12;
var hourLabel = hourValue === 0 ? "12" : leftPad(hourValue, 2);
return _objectSpread2$a(_objectSpread2$a({}, hourMeta), {}, {
label: hourLabel,
value: hourValue
});
});
}, [use12Hours, isPM, memorizedRawHours]);
var minutes = generateUnits(0, 59, minuteStep, mergedDisabledMinutes && mergedDisabledMinutes(originHour));
var seconds = generateUnits(0, 59, secondStep, mergedDisabledSeconds && mergedDisabledSeconds(originHour, minute));
operationRef.current = {
onUpDown: function onUpDown(diff) {
var column = columns[activeColumnIndex];
if (column) {
var valueIndex = column.units.findIndex(function(unit) {
return unit.value === column.value;
});
var unitLen = column.units.length;
for (var i2 = 1; i2 < unitLen; i2 += 1) {
var nextUnit = column.units[(valueIndex + diff * i2 + unitLen) % unitLen];
if (nextUnit.disabled !== true) {
column.onSelect(nextUnit.value);
break;
}
}
}
}
};
function addColumnNode(condition, node, columnValue, units, onColumnSelect) {
if (condition !== false) {
columns.push({
node: /* @__PURE__ */ React__namespace.cloneElement(node, {
prefixCls: columnPrefixCls,
value: columnValue,
active: activeColumnIndex === columns.length,
onSelect: onColumnSelect,
units,
hideDisabledOptions
}),
onSelect: onColumnSelect,
value: columnValue,
units
});
}
}
addColumnNode(
showHour,
/* @__PURE__ */ jsx(TimeUnitColumn, {}, "hour"),
hour,
hours,
function(num) {
onSelect(setTime$1(isPM, num, minute, second), "mouse");
}
);
addColumnNode(
showMinute,
/* @__PURE__ */ jsx(TimeUnitColumn, {}, "minute"),
minute,
minutes,
function(num) {
onSelect(setTime$1(isPM, hour, num, second), "mouse");
}
);
addColumnNode(
showSecond,
/* @__PURE__ */ jsx(TimeUnitColumn, {}, "second"),
second,
seconds,
function(num) {
onSelect(setTime$1(isPM, hour, minute, num), "mouse");
}
);
var PMIndex = -1;
if (typeof isPM === "boolean") {
PMIndex = isPM ? 1 : 0;
}
addColumnNode(
use12Hours === true,
/* @__PURE__ */ jsx(TimeUnitColumn, {}, "12hours"),
PMIndex,
[{
label: "AM",
value: 0,
disabled: AMDisabled
}, {
label: "PM",
value: 1,
disabled: PMDisabled
}],
function(num) {
onSelect(setTime$1(!!num, hour, minute, second), "mouse");
}
);
return /* @__PURE__ */ jsx("div", {
className: contentPrefixCls,
children: columns.map(function(_ref2) {
var node = _ref2.node;
return node;
})
});
}
var countBoolean = function countBoolean2(boolList) {
return boolList.filter(function(bool) {
return bool !== false;
}).length;
};
function TimePanel(props) {
var generateConfig2 = props.generateConfig, _props$format = props.format, format2 = _props$format === void 0 ? "HH:mm:ss" : _props$format, prefixCls = props.prefixCls, active = props.active, operationRef = props.operationRef, showHour = props.showHour, showMinute = props.showMinute, showSecond = props.showSecond, _props$use12Hours = props.use12Hours, use12Hours = _props$use12Hours === void 0 ? false : _props$use12Hours, onSelect = props.onSelect, value = props.value;
var panelPrefixCls = "".concat(prefixCls, "-time-panel");
var bodyOperationRef = React__namespace.useRef();
var _React$useState = React__namespace.useState(-1), _React$useState2 = _slicedToArray$e(_React$useState, 2), activeColumnIndex = _React$useState2[0], setActiveColumnIndex = _React$useState2[1];
var columnsCount = countBoolean([showHour, showMinute, showSecond, use12Hours]);
operationRef.current = {
onKeyDown: function onKeyDown2(event) {
return createKeyDownHandler(event, {
onLeftRight: function onLeftRight(diff) {
setActiveColumnIndex((activeColumnIndex + diff + columnsCount) % columnsCount);
},
onUpDown: function onUpDown(diff) {
if (activeColumnIndex === -1) {
setActiveColumnIndex(0);
} else if (bodyOperationRef.current) {
bodyOperationRef.current.onUpDown(diff);
}
},
onEnter: function onEnter() {
onSelect(value || generateConfig2.getNow(), "key");
setActiveColumnIndex(-1);
}
});
},
onBlur: function onBlur() {
setActiveColumnIndex(-1);
}
};
return /* @__PURE__ */ jsxs("div", {
className: classnames(panelPrefixCls, _defineProperty$b({}, "".concat(panelPrefixCls, "-active"), active)),
children: [/* @__PURE__ */ jsx(TimeHeader, {
...props,
format: format2,
prefixCls
}), /* @__PURE__ */ jsx(TimeBody, {
...props,
prefixCls,
activeColumnIndex,
operationRef: bodyOperationRef
})]
});
}
var RangeContext = /* @__PURE__ */ React__namespace.createContext({});
function useCellClassName(_ref) {
var cellPrefixCls = _ref.cellPrefixCls, generateConfig2 = _ref.generateConfig, rangedValue = _ref.rangedValue, hoverRangedValue = _ref.hoverRangedValue, isInView = _ref.isInView, isSameCell = _ref.isSameCell, offsetCell = _ref.offsetCell, today = _ref.today, value = _ref.value;
function getClassName(currentDate) {
var _ref2;
var prevDate = offsetCell(currentDate, -1);
var nextDate = offsetCell(currentDate, 1);
var rangeStart = getValue$3(rangedValue, 0);
var rangeEnd = getValue$3(rangedValue, 1);
var hoverStart = getValue$3(hoverRangedValue, 0);
var hoverEnd = getValue$3(hoverRangedValue, 1);
var isRangeHovered = isInRange(generateConfig2, hoverStart, hoverEnd, currentDate);
function isRangeStart(date2) {
return isSameCell(rangeStart, date2);
}
function isRangeEnd(date2) {
return isSameCell(rangeEnd, date2);
}
var isHoverStart = isSameCell(hoverStart, currentDate);
var isHoverEnd = isSameCell(hoverEnd, currentDate);
var isHoverEdgeStart = (isRangeHovered || isHoverEnd) && (!isInView(prevDate) || isRangeEnd(prevDate));
var isHoverEdgeEnd = (isRangeHovered || isHoverStart) && (!isInView(nextDate) || isRangeStart(nextDate));
return _ref2 = {}, _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-in-view"), isInView(currentDate)), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-in-range"), isInRange(generateConfig2, rangeStart, rangeEnd, currentDate)), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-range-start"), isRangeStart(currentDate)), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-range-end"), isRangeEnd(currentDate)), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-range-start-single"), isRangeStart(currentDate) && !rangeEnd), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-range-end-single"), isRangeEnd(currentDate) && !rangeStart), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-range-start-near-hover"), isRangeStart(currentDate) && (isSameCell(prevDate, hoverStart) || isInRange(generateConfig2, hoverStart, hoverEnd, prevDate))), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-range-end-near-hover"), isRangeEnd(currentDate) && (isSameCell(nextDate, hoverEnd) || isInRange(generateConfig2, hoverStart, hoverEnd, nextDate))), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-range-hover"), isRangeHovered), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-range-hover-start"), isHoverStart), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-range-hover-end"), isHoverEnd), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-range-hover-edge-start"), isHoverEdgeStart), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-range-hover-edge-end"), isHoverEdgeEnd), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-range-hover-edge-start-near-range"), isHoverEdgeStart && isSameCell(prevDate, rangeEnd)), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-range-hover-edge-end-near-range"), isHoverEdgeEnd && isSameCell(nextDate, rangeStart)), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-today"), isSameCell(today, currentDate)), _defineProperty$b(_ref2, "".concat(cellPrefixCls, "-selected"), isSameCell(value, currentDate)), _ref2;
}
return getClassName;
}
function DateBody(props) {
var prefixCls = props.prefixCls, generateConfig2 = props.generateConfig, prefixColumn = props.prefixColumn, locale2 = props.locale, rowCount = props.rowCount, viewDate = props.viewDate, value = props.value, dateRender = props.dateRender;
var _React$useContext = React__namespace.useContext(RangeContext), rangedValue = _React$useContext.rangedValue, hoverRangedValue = _React$useContext.hoverRangedValue;
var baseDate = getWeekStartDate(locale2.locale, generateConfig2, viewDate);
var cellPrefixCls = "".concat(prefixCls, "-cell");
var weekFirstDay = generateConfig2.locale.getWeekFirstDay(locale2.locale);
var today = generateConfig2.getNow();
var headerCells = [];
var weekDaysLocale = locale2.shortWeekDays || (generateConfig2.locale.getShortWeekDays ? generateConfig2.locale.getShortWeekDays(locale2.locale) : []);
if (prefixColumn) {
headerCells.push(
/* @__PURE__ */ jsx("th", {
"aria-label": "empty cell"
}, "empty")
);
}
for (var i2 = 0; i2 < WEEK_DAY_COUNT; i2 += 1) {
headerCells.push(
/* @__PURE__ */ jsx("th", {
children: weekDaysLocale[(i2 + weekFirstDay) % WEEK_DAY_COUNT]
}, i2)
);
}
var getCellClassName = useCellClassName({
cellPrefixCls,
today,
value,
generateConfig: generateConfig2,
rangedValue: prefixColumn ? null : rangedValue,
hoverRangedValue: prefixColumn ? null : hoverRangedValue,
isSameCell: function isSameCell(current, target) {
return isSameDate(generateConfig2, current, target);
},
isInView: function isInView(date2) {
return isSameMonth(generateConfig2, date2, viewDate);
},
offsetCell: function offsetCell(date2, offset2) {
return generateConfig2.addDate(date2, offset2);
}
});
var getCellNode = dateRender ? function(date2) {
return dateRender(date2, today);
} : void 0;
return /* @__PURE__ */ jsx(PanelBody, {
...props,
rowNum: rowCount,
colNum: WEEK_DAY_COUNT,
baseDate,
getCellNode,
getCellText: generateConfig2.getDate,
getCellClassName,
getCellDate: generateConfig2.addDate,
titleCell: function titleCell(date2) {
return formatValue(date2, {
locale: locale2,
format: "YYYY-MM-DD",
generateConfig: generateConfig2
});
},
headerCells
});
}
function DateHeader(props) {
var prefixCls = props.prefixCls, generateConfig2 = props.generateConfig, locale2 = props.locale, viewDate = props.viewDate, onNextMonth = props.onNextMonth, onPrevMonth = props.onPrevMonth, onNextYear = props.onNextYear, onPrevYear = props.onPrevYear, onYearClick = props.onYearClick, onMonthClick = props.onMonthClick;
var _React$useContext = React__namespace.useContext(PanelContext), hideHeader = _React$useContext.hideHeader;
if (hideHeader) {
return null;
}
var headerPrefixCls = "".concat(prefixCls, "-header");
var monthsLocale = locale2.shortMonths || (generateConfig2.locale.getShortMonths ? generateConfig2.locale.getShortMonths(locale2.locale) : []);
var month = generateConfig2.getMonth(viewDate);
var yearNode = /* @__PURE__ */ jsx("button", {
type: "button",
onClick: onYearClick,
tabIndex: -1,
className: "".concat(prefixCls, "-year-btn"),
children: formatValue(viewDate, {
locale: locale2,
format: locale2.yearFormat,
generateConfig: generateConfig2
})
}, "year");
var monthNode = /* @__PURE__ */ jsx("button", {
type: "button",
onClick: onMonthClick,
tabIndex: -1,
className: "".concat(prefixCls, "-month-btn"),
children: locale2.monthFormat ? formatValue(viewDate, {
locale: locale2,
format: locale2.monthFormat,
generateConfig: generateConfig2
}) : monthsLocale[month]
}, "month");
var monthYearNodes = locale2.monthBeforeYear ? [monthNode, yearNode] : [yearNode, monthNode];
return /* @__PURE__ */ jsx(Header$1, {
...props,
prefixCls: headerPrefixCls,
onSuperPrev: onPrevYear,
onPrev: onPrevMonth,
onNext: onNextMonth,
onSuperNext: onNextYear,
children: monthYearNodes
});
}
var DATE_ROW_COUNT = 6;
function DatePanel(props) {
var prefixCls = props.prefixCls, _props$panelName = props.panelName, panelName = _props$panelName === void 0 ? "date" : _props$panelName, keyboardConfig = props.keyboardConfig, active = props.active, operationRef = props.operationRef, generateConfig2 = props.generateConfig, value = props.value, viewDate = props.viewDate, onViewDateChange = props.onViewDateChange, onPanelChange = props.onPanelChange, _onSelect = props.onSelect;
var panelPrefixCls = "".concat(prefixCls, "-").concat(panelName, "-panel");
operationRef.current = {
onKeyDown: function onKeyDown2(event) {
return createKeyDownHandler(event, _objectSpread2$a({
onLeftRight: function onLeftRight(diff) {
_onSelect(generateConfig2.addDate(value || viewDate, diff), "key");
},
onCtrlLeftRight: function onCtrlLeftRight(diff) {
_onSelect(generateConfig2.addYear(value || viewDate, diff), "key");
},
onUpDown: function onUpDown(diff) {
_onSelect(generateConfig2.addDate(value || viewDate, diff * WEEK_DAY_COUNT), "key");
},
onPageUpDown: function onPageUpDown(diff) {
_onSelect(generateConfig2.addMonth(value || viewDate, diff), "key");
}
}, keyboardConfig));
}
};
var onYearChange = function onYearChange2(diff) {
var newDate = generateConfig2.addYear(viewDate, diff);
onViewDateChange(newDate);
onPanelChange(null, newDate);
};
var onMonthChange = function onMonthChange2(diff) {
var newDate = generateConfig2.addMonth(viewDate, diff);
onViewDateChange(newDate);
onPanelChange(null, newDate);
};
return /* @__PURE__ */ jsxs("div", {
className: classnames(panelPrefixCls, _defineProperty$b({}, "".concat(panelPrefixCls, "-active"), active)),
children: [/* @__PURE__ */ jsx(DateHeader, {
...props,
prefixCls,
value,
viewDate,
onPrevYear: function onPrevYear() {
onYearChange(-1);
},
onNextYear: function onNextYear() {
onYearChange(1);
},
onPrevMonth: function onPrevMonth() {
onMonthChange(-1);
},
onNextMonth: function onNextMonth() {
onMonthChange(1);
},
onMonthClick: function onMonthClick() {
onPanelChange("month", viewDate);
},
onYearClick: function onYearClick() {
onPanelChange("year", viewDate);
}
}), /* @__PURE__ */ jsx(DateBody, {
...props,
onSelect: function onSelect(date2) {
return _onSelect(date2, "mouse");
},
prefixCls,
value,
viewDate,
rowCount: DATE_ROW_COUNT
})]
});
}
var ACTIVE_PANEL = tuple("date", "time");
function DatetimePanel(props) {
var prefixCls = props.prefixCls, operationRef = props.operationRef, generateConfig2 = props.generateConfig, value = props.value, defaultValue = props.defaultValue, disabledTime = props.disabledTime, showTime = props.showTime, onSelect = props.onSelect;
var panelPrefixCls = "".concat(prefixCls, "-datetime-panel");
var _React$useState = React__namespace.useState(null), _React$useState2 = _slicedToArray$e(_React$useState, 2), activePanel = _React$useState2[0], setActivePanel = _React$useState2[1];
var dateOperationRef = React__namespace.useRef({});
var timeOperationRef = React__namespace.useRef({});
var timeProps = _typeof$q(showTime) === "object" ? _objectSpread2$a({}, showTime) : {};
function getNextActive(offset2) {
var activeIndex = ACTIVE_PANEL.indexOf(activePanel) + offset2;
var nextActivePanel = ACTIVE_PANEL[activeIndex] || null;
return nextActivePanel;
}
var onBlur = function onBlur2(e2) {
if (timeOperationRef.current.onBlur) {
timeOperationRef.current.onBlur(e2);
}
setActivePanel(null);
};
operationRef.current = {
onKeyDown: function onKeyDown2(event) {
if (event.which === KeyCode.TAB) {
var nextActivePanel = getNextActive(event.shiftKey ? -1 : 1);
setActivePanel(nextActivePanel);
if (nextActivePanel) {
event.preventDefault();
}
return true;
}
if (activePanel) {
var ref = activePanel === "date" ? dateOperationRef : timeOperationRef;
if (ref.current && ref.current.onKeyDown) {
ref.current.onKeyDown(event);
}
return true;
}
if ([KeyCode.LEFT, KeyCode.RIGHT, KeyCode.UP, KeyCode.DOWN].includes(event.which)) {
setActivePanel("date");
return true;
}
return false;
},
onBlur,
onClose: onBlur
};
var onInternalSelect = function onInternalSelect2(date2, source) {
var selectedDate = date2;
if (source === "date" && !value && timeProps.defaultValue) {
selectedDate = generateConfig2.setHour(selectedDate, generateConfig2.getHour(timeProps.defaultValue));
selectedDate = generateConfig2.setMinute(selectedDate, generateConfig2.getMinute(timeProps.defaultValue));
selectedDate = generateConfig2.setSecond(selectedDate, generateConfig2.getSecond(timeProps.defaultValue));
} else if (source === "time" && !value && defaultValue) {
selectedDate = generateConfig2.setYear(selectedDate, generateConfig2.getYear(defaultValue));
selectedDate = generateConfig2.setMonth(selectedDate, generateConfig2.getMonth(defaultValue));
selectedDate = generateConfig2.setDate(selectedDate, generateConfig2.getDate(defaultValue));
}
if (onSelect) {
onSelect(selectedDate, "mouse");
}
};
var disabledTimes = disabledTime ? disabledTime(value || null) : {};
return /* @__PURE__ */ jsxs("div", {
className: classnames(panelPrefixCls, _defineProperty$b({}, "".concat(panelPrefixCls, "-active"), activePanel)),
children: [/* @__PURE__ */ jsx(DatePanel, {
...props,
operationRef: dateOperationRef,
active: activePanel === "date",
onSelect: function onSelect2(date2) {
onInternalSelect(setDateTime(generateConfig2, date2, !value && _typeof$q(showTime) === "object" ? showTime.defaultValue : null), "date");
}
}), /* @__PURE__ */ jsx(TimePanel, {
...props,
format: void 0,
...timeProps,
...disabledTimes,
disabledTime: null,
defaultValue: void 0,
operationRef: timeOperationRef,
active: activePanel === "time",
onSelect: function onSelect2(date2) {
onInternalSelect(date2, "time");
}
})]
});
}
function WeekPanel(props) {
var prefixCls = props.prefixCls, generateConfig2 = props.generateConfig, locale2 = props.locale, value = props.value;
var cellPrefixCls = "".concat(prefixCls, "-cell");
var prefixColumn = function prefixColumn2(date2) {
return /* @__PURE__ */ jsx("td", {
className: classnames(cellPrefixCls, "".concat(cellPrefixCls, "-week")),
children: generateConfig2.locale.getWeek(locale2.locale, date2)
}, "week");
};
var rowPrefixCls = "".concat(prefixCls, "-week-panel-row");
var rowClassName = function rowClassName2(date2) {
return classnames(rowPrefixCls, _defineProperty$b({}, "".concat(rowPrefixCls, "-selected"), isSameWeek(generateConfig2, locale2.locale, value, date2)));
};
return /* @__PURE__ */ jsx(DatePanel, {
...props,
panelName: "week",
prefixColumn,
rowClassName,
keyboardConfig: {
onLeftRight: null
}
});
}
function MonthHeader(props) {
var prefixCls = props.prefixCls, generateConfig2 = props.generateConfig, locale2 = props.locale, viewDate = props.viewDate, onNextYear = props.onNextYear, onPrevYear = props.onPrevYear, onYearClick = props.onYearClick;
var _React$useContext = React__namespace.useContext(PanelContext), hideHeader = _React$useContext.hideHeader;
if (hideHeader) {
return null;
}
var headerPrefixCls = "".concat(prefixCls, "-header");
return /* @__PURE__ */ jsx(Header$1, {
...props,
prefixCls: headerPrefixCls,
onSuperPrev: onPrevYear,
onSuperNext: onNextYear,
children: /* @__PURE__ */ jsx("button", {
type: "button",
onClick: onYearClick,
className: "".concat(prefixCls, "-year-btn"),
children: formatValue(viewDate, {
locale: locale2,
format: locale2.yearFormat,
generateConfig: generateConfig2
})
})
});
}
var MONTH_COL_COUNT = 3;
var MONTH_ROW_COUNT = 4;
function MonthBody(props) {
var prefixCls = props.prefixCls, locale2 = props.locale, value = props.value, viewDate = props.viewDate, generateConfig2 = props.generateConfig, monthCellRender = props.monthCellRender;
var _React$useContext = React__namespace.useContext(RangeContext), rangedValue = _React$useContext.rangedValue, hoverRangedValue = _React$useContext.hoverRangedValue;
var cellPrefixCls = "".concat(prefixCls, "-cell");
var getCellClassName = useCellClassName({
cellPrefixCls,
value,
generateConfig: generateConfig2,
rangedValue,
hoverRangedValue,
isSameCell: function isSameCell(current, target) {
return isSameMonth(generateConfig2, current, target);
},
isInView: function isInView() {
return true;
},
offsetCell: function offsetCell(date2, offset2) {
return generateConfig2.addMonth(date2, offset2);
}
});
var monthsLocale = locale2.shortMonths || (generateConfig2.locale.getShortMonths ? generateConfig2.locale.getShortMonths(locale2.locale) : []);
var baseMonth = generateConfig2.setMonth(viewDate, 0);
var getCellNode = monthCellRender ? function(date2) {
return monthCellRender(date2, locale2);
} : void 0;
return /* @__PURE__ */ jsx(PanelBody, {
...props,
rowNum: MONTH_ROW_COUNT,
colNum: MONTH_COL_COUNT,
baseDate: baseMonth,
getCellNode,
getCellText: function getCellText(date2) {
return locale2.monthFormat ? formatValue(date2, {
locale: locale2,
format: locale2.monthFormat,
generateConfig: generateConfig2
}) : monthsLocale[generateConfig2.getMonth(date2)];
},
getCellClassName,
getCellDate: generateConfig2.addMonth,
titleCell: function titleCell(date2) {
return formatValue(date2, {
locale: locale2,
format: "YYYY-MM",
generateConfig: generateConfig2
});
}
});
}
function MonthPanel(props) {
var prefixCls = props.prefixCls, operationRef = props.operationRef, onViewDateChange = props.onViewDateChange, generateConfig2 = props.generateConfig, value = props.value, viewDate = props.viewDate, onPanelChange = props.onPanelChange, _onSelect = props.onSelect;
var panelPrefixCls = "".concat(prefixCls, "-month-panel");
operationRef.current = {
onKeyDown: function onKeyDown2(event) {
return createKeyDownHandler(event, {
onLeftRight: function onLeftRight(diff) {
_onSelect(generateConfig2.addMonth(value || viewDate, diff), "key");
},
onCtrlLeftRight: function onCtrlLeftRight(diff) {
_onSelect(generateConfig2.addYear(value || viewDate, diff), "key");
},
onUpDown: function onUpDown(diff) {
_onSelect(generateConfig2.addMonth(value || viewDate, diff * MONTH_COL_COUNT), "key");
},
onEnter: function onEnter() {
onPanelChange("date", value || viewDate);
}
});
}
};
var onYearChange = function onYearChange2(diff) {
var newDate = generateConfig2.addYear(viewDate, diff);
onViewDateChange(newDate);
onPanelChange(null, newDate);
};
return /* @__PURE__ */ jsxs("div", {
className: panelPrefixCls,
children: [/* @__PURE__ */ jsx(MonthHeader, {
...props,
prefixCls,
onPrevYear: function onPrevYear() {
onYearChange(-1);
},
onNextYear: function onNextYear() {
onYearChange(1);
},
onYearClick: function onYearClick() {
onPanelChange("year", viewDate);
}
}), /* @__PURE__ */ jsx(MonthBody, {
...props,
prefixCls,
onSelect: function onSelect(date2) {
_onSelect(date2, "mouse");
onPanelChange("date", date2);
}
})]
});
}
function QuarterHeader(props) {
var prefixCls = props.prefixCls, generateConfig2 = props.generateConfig, locale2 = props.locale, viewDate = props.viewDate, onNextYear = props.onNextYear, onPrevYear = props.onPrevYear, onYearClick = props.onYearClick;
var _React$useContext = React__namespace.useContext(PanelContext), hideHeader = _React$useContext.hideHeader;
if (hideHeader) {
return null;
}
var headerPrefixCls = "".concat(prefixCls, "-header");
return /* @__PURE__ */ jsx(Header$1, {
...props,
prefixCls: headerPrefixCls,
onSuperPrev: onPrevYear,
onSuperNext: onNextYear,
children: /* @__PURE__ */ jsx("button", {
type: "button",
onClick: onYearClick,
className: "".concat(prefixCls, "-year-btn"),
children: formatValue(viewDate, {
locale: locale2,
format: locale2.yearFormat,
generateConfig: generateConfig2
})
})
});
}
var QUARTER_COL_COUNT = 4;
var QUARTER_ROW_COUNT = 1;
function QuarterBody(props) {
var prefixCls = props.prefixCls, locale2 = props.locale, value = props.value, viewDate = props.viewDate, generateConfig2 = props.generateConfig;
var _React$useContext = React__namespace.useContext(RangeContext), rangedValue = _React$useContext.rangedValue, hoverRangedValue = _React$useContext.hoverRangedValue;
var cellPrefixCls = "".concat(prefixCls, "-cell");
var getCellClassName = useCellClassName({
cellPrefixCls,
value,
generateConfig: generateConfig2,
rangedValue,
hoverRangedValue,
isSameCell: function isSameCell(current, target) {
return isSameQuarter(generateConfig2, current, target);
},
isInView: function isInView() {
return true;
},
offsetCell: function offsetCell(date2, offset2) {
return generateConfig2.addMonth(date2, offset2 * 3);
}
});
var baseQuarter = generateConfig2.setDate(generateConfig2.setMonth(viewDate, 0), 1);
return /* @__PURE__ */ jsx(PanelBody, {
...props,
rowNum: QUARTER_ROW_COUNT,
colNum: QUARTER_COL_COUNT,
baseDate: baseQuarter,
getCellText: function getCellText(date2) {
return formatValue(date2, {
locale: locale2,
format: locale2.quarterFormat || "[Q]Q",
generateConfig: generateConfig2
});
},
getCellClassName,
getCellDate: function getCellDate(date2, offset2) {
return generateConfig2.addMonth(date2, offset2 * 3);
},
titleCell: function titleCell(date2) {
return formatValue(date2, {
locale: locale2,
format: "YYYY-[Q]Q",
generateConfig: generateConfig2
});
}
});
}
function QuarterPanel(props) {
var prefixCls = props.prefixCls, operationRef = props.operationRef, onViewDateChange = props.onViewDateChange, generateConfig2 = props.generateConfig, value = props.value, viewDate = props.viewDate, onPanelChange = props.onPanelChange, _onSelect = props.onSelect;
var panelPrefixCls = "".concat(prefixCls, "-quarter-panel");
operationRef.current = {
onKeyDown: function onKeyDown2(event) {
return createKeyDownHandler(event, {
onLeftRight: function onLeftRight(diff) {
_onSelect(generateConfig2.addMonth(value || viewDate, diff * 3), "key");
},
onCtrlLeftRight: function onCtrlLeftRight(diff) {
_onSelect(generateConfig2.addYear(value || viewDate, diff), "key");
},
onUpDown: function onUpDown(diff) {
_onSelect(generateConfig2.addYear(value || viewDate, diff), "key");
}
});
}
};
var onYearChange = function onYearChange2(diff) {
var newDate = generateConfig2.addYear(viewDate, diff);
onViewDateChange(newDate);
onPanelChange(null, newDate);
};
return /* @__PURE__ */ jsxs("div", {
className: panelPrefixCls,
children: [/* @__PURE__ */ jsx(QuarterHeader, {
...props,
prefixCls,
onPrevYear: function onPrevYear() {
onYearChange(-1);
},
onNextYear: function onNextYear() {
onYearChange(1);
},
onYearClick: function onYearClick() {
onPanelChange("year", viewDate);
}
}), /* @__PURE__ */ jsx(QuarterBody, {
...props,
prefixCls,
onSelect: function onSelect(date2) {
_onSelect(date2, "mouse");
}
})]
});
}
function YearHeader(props) {
var prefixCls = props.prefixCls, generateConfig2 = props.generateConfig, viewDate = props.viewDate, onPrevDecade = props.onPrevDecade, onNextDecade = props.onNextDecade, onDecadeClick = props.onDecadeClick;
var _React$useContext = React__namespace.useContext(PanelContext), hideHeader = _React$useContext.hideHeader;
if (hideHeader) {
return null;
}
var headerPrefixCls = "".concat(prefixCls, "-header");
var yearNumber = generateConfig2.getYear(viewDate);
var startYear = Math.floor(yearNumber / YEAR_DECADE_COUNT) * YEAR_DECADE_COUNT;
var endYear = startYear + YEAR_DECADE_COUNT - 1;
return /* @__PURE__ */ jsx(Header$1, {
...props,
prefixCls: headerPrefixCls,
onSuperPrev: onPrevDecade,
onSuperNext: onNextDecade,
children: /* @__PURE__ */ jsxs("button", {
type: "button",
onClick: onDecadeClick,
className: "".concat(prefixCls, "-decade-btn"),
children: [startYear, "-", endYear]
})
});
}
var YEAR_COL_COUNT = 3;
var YEAR_ROW_COUNT = 4;
function YearBody(props) {
var prefixCls = props.prefixCls, value = props.value, viewDate = props.viewDate, locale2 = props.locale, generateConfig2 = props.generateConfig;
var _React$useContext = React__namespace.useContext(RangeContext), rangedValue = _React$useContext.rangedValue, hoverRangedValue = _React$useContext.hoverRangedValue;
var yearPrefixCls = "".concat(prefixCls, "-cell");
var yearNumber = generateConfig2.getYear(viewDate);
var startYear = Math.floor(yearNumber / YEAR_DECADE_COUNT) * YEAR_DECADE_COUNT;
var endYear = startYear + YEAR_DECADE_COUNT - 1;
var baseYear = generateConfig2.setYear(viewDate, startYear - Math.ceil((YEAR_COL_COUNT * YEAR_ROW_COUNT - YEAR_DECADE_COUNT) / 2));
var isInView = function isInView2(date2) {
var currentYearNumber = generateConfig2.getYear(date2);
return startYear <= currentYearNumber && currentYearNumber <= endYear;
};
var getCellClassName = useCellClassName({
cellPrefixCls: yearPrefixCls,
value,
generateConfig: generateConfig2,
rangedValue,
hoverRangedValue,
isSameCell: function isSameCell(current, target) {
return isSameYear(generateConfig2, current, target);
},
isInView,
offsetCell: function offsetCell(date2, offset2) {
return generateConfig2.addYear(date2, offset2);
}
});
return /* @__PURE__ */ jsx(PanelBody, {
...props,
rowNum: YEAR_ROW_COUNT,
colNum: YEAR_COL_COUNT,
baseDate: baseYear,
getCellText: generateConfig2.getYear,
getCellClassName,
getCellDate: generateConfig2.addYear,
titleCell: function titleCell(date2) {
return formatValue(date2, {
locale: locale2,
format: "YYYY",
generateConfig: generateConfig2
});
}
});
}
var YEAR_DECADE_COUNT = 10;
function YearPanel(props) {
var prefixCls = props.prefixCls, operationRef = props.operationRef, onViewDateChange = props.onViewDateChange, generateConfig2 = props.generateConfig, value = props.value, viewDate = props.viewDate, sourceMode = props.sourceMode, _onSelect = props.onSelect, onPanelChange = props.onPanelChange;
var panelPrefixCls = "".concat(prefixCls, "-year-panel");
operationRef.current = {
onKeyDown: function onKeyDown2(event) {
return createKeyDownHandler(event, {
onLeftRight: function onLeftRight(diff) {
_onSelect(generateConfig2.addYear(value || viewDate, diff), "key");
},
onCtrlLeftRight: function onCtrlLeftRight(diff) {
_onSelect(generateConfig2.addYear(value || viewDate, diff * YEAR_DECADE_COUNT), "key");
},
onUpDown: function onUpDown(diff) {
_onSelect(generateConfig2.addYear(value || viewDate, diff * YEAR_COL_COUNT), "key");
},
onEnter: function onEnter() {
onPanelChange(sourceMode === "date" ? "date" : "month", value || viewDate);
}
});
}
};
var onDecadeChange = function onDecadeChange2(diff) {
var newDate = generateConfig2.addYear(viewDate, diff * 10);
onViewDateChange(newDate);
onPanelChange(null, newDate);
};
return /* @__PURE__ */ jsxs("div", {
className: panelPrefixCls,
children: [/* @__PURE__ */ jsx(YearHeader, {
...props,
prefixCls,
onPrevDecade: function onPrevDecade() {
onDecadeChange(-1);
},
onNextDecade: function onNextDecade() {
onDecadeChange(1);
},
onDecadeClick: function onDecadeClick() {
onPanelChange("decade", viewDate);
}
}), /* @__PURE__ */ jsx(YearBody, {
...props,
prefixCls,
onSelect: function onSelect(date2) {
onPanelChange(sourceMode === "date" ? "date" : "month", date2);
_onSelect(date2, "mouse");
}
})]
});
}
function getExtraFooter(prefixCls, mode, renderExtraFooter) {
if (!renderExtraFooter) {
return null;
}
return /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-footer-extra"),
children: renderExtraFooter(mode)
});
}
function getRanges(_ref) {
var prefixCls = _ref.prefixCls, _ref$rangeList = _ref.rangeList, rangeList = _ref$rangeList === void 0 ? [] : _ref$rangeList, _ref$components = _ref.components, components = _ref$components === void 0 ? {} : _ref$components, needConfirmButton = _ref.needConfirmButton, onNow = _ref.onNow, onOk = _ref.onOk, okDisabled = _ref.okDisabled, showNow = _ref.showNow, locale2 = _ref.locale;
var presetNode;
var okNode;
if (rangeList.length) {
var Item2 = components.rangeItem || "span";
presetNode = /* @__PURE__ */ jsx(Fragment, {
children: rangeList.map(function(_ref2) {
var label = _ref2.label, onClick = _ref2.onClick, onMouseEnter = _ref2.onMouseEnter, onMouseLeave = _ref2.onMouseLeave;
return /* @__PURE__ */ jsx("li", {
className: "".concat(prefixCls, "-preset"),
children: /* @__PURE__ */ jsx(Item2, {
onClick,
onMouseEnter,
onMouseLeave,
children: label
})
}, label);
})
});
}
if (needConfirmButton) {
var Button2 = components.button || "button";
if (onNow && !presetNode && showNow !== false) {
presetNode = /* @__PURE__ */ jsx("li", {
className: "".concat(prefixCls, "-now"),
children: /* @__PURE__ */ jsx("a", {
className: "".concat(prefixCls, "-now-btn"),
onClick: onNow,
children: locale2.now
})
});
}
okNode = needConfirmButton && /* @__PURE__ */ jsx("li", {
className: "".concat(prefixCls, "-ok"),
children: /* @__PURE__ */ jsx(Button2, {
disabled: okDisabled,
onClick: onOk,
children: locale2.ok
})
});
}
if (!presetNode && !okNode) {
return null;
}
return /* @__PURE__ */ jsxs("ul", {
className: "".concat(prefixCls, "-ranges"),
children: [presetNode, okNode]
});
}
var CALENDAR_PANEL_MODE = ["date", "month"];
function PickerPanel(props) {
var _classNames;
var _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-picker" : _props$prefixCls, className = props.className, style2 = props.style, locale2 = props.locale, generateConfig2 = props.generateConfig, value = props.value, defaultValue = props.defaultValue, pickerValue = props.pickerValue, defaultPickerValue = props.defaultPickerValue, disabledDate = props.disabledDate, mode = props.mode, _props$picker = props.picker, picker = _props$picker === void 0 ? "date" : _props$picker, _props$tabIndex = props.tabIndex, tabIndex = _props$tabIndex === void 0 ? 0 : _props$tabIndex, showNow = props.showNow, showTime = props.showTime, showToday = props.showToday, renderExtraFooter = props.renderExtraFooter, hideHeader = props.hideHeader, onSelect = props.onSelect, onChange = props.onChange, onPanelChange = props.onPanelChange, onMouseDown = props.onMouseDown, onPickerValueChange = props.onPickerValueChange, _onOk = props.onOk, components = props.components, direction = props.direction, _props$hourStep = props.hourStep, hourStep = _props$hourStep === void 0 ? 1 : _props$hourStep, _props$minuteStep = props.minuteStep, minuteStep = _props$minuteStep === void 0 ? 1 : _props$minuteStep, _props$secondStep = props.secondStep, secondStep = _props$secondStep === void 0 ? 1 : _props$secondStep;
var needConfirmButton = picker === "date" && !!showTime || picker === "time";
var isHourStepValid = 24 % hourStep === 0;
var isMinuteStepValid = 60 % minuteStep === 0;
var isSecondStepValid = 60 % secondStep === 0;
var panelContext = React__namespace.useContext(PanelContext);
var operationRef = panelContext.operationRef, panelDivRef = panelContext.panelRef, onContextSelect = panelContext.onSelect, hideRanges = panelContext.hideRanges, defaultOpenValue = panelContext.defaultOpenValue;
var _React$useContext = React__namespace.useContext(RangeContext), inRange = _React$useContext.inRange, panelPosition = _React$useContext.panelPosition, rangedValue = _React$useContext.rangedValue, hoverRangedValue = _React$useContext.hoverRangedValue;
var panelRef = React__namespace.useRef({});
var initRef = React__namespace.useRef(true);
var _useMergedState = useMergedState(null, {
value,
defaultValue,
postState: function postState(val) {
if (!val && defaultOpenValue && picker === "time") {
return defaultOpenValue;
}
return val;
}
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), mergedValue = _useMergedState2[0], setInnerValue = _useMergedState2[1];
var _useMergedState3 = useMergedState(null, {
value: pickerValue,
defaultValue: defaultPickerValue || mergedValue,
postState: function postState(date2) {
var now3 = generateConfig2.getNow();
if (!date2) {
return now3;
}
if (!mergedValue && showTime) {
var defaultDateObject = _typeof$q(showTime) === "object" ? showTime.defaultValue : defaultValue;
return setDateTime(generateConfig2, Array.isArray(date2) ? date2[0] : date2, defaultDateObject || now3);
}
return Array.isArray(date2) ? date2[0] : date2;
}
}), _useMergedState4 = _slicedToArray$e(_useMergedState3, 2), viewDate = _useMergedState4[0], setInnerViewDate = _useMergedState4[1];
var setViewDate = function setViewDate2(date2) {
setInnerViewDate(date2);
if (onPickerValueChange) {
onPickerValueChange(date2);
}
};
var getInternalNextMode = function getInternalNextMode2(nextMode) {
var getNextMode = PickerModeMap[picker];
if (getNextMode) {
return getNextMode(nextMode);
}
return nextMode;
};
var _useMergedState5 = useMergedState(function() {
if (picker === "time") {
return "time";
}
return getInternalNextMode("date");
}, {
value: mode
}), _useMergedState6 = _slicedToArray$e(_useMergedState5, 2), mergedMode = _useMergedState6[0], setInnerMode = _useMergedState6[1];
React__namespace.useEffect(function() {
setInnerMode(picker);
}, [picker]);
var _React$useState = React__namespace.useState(function() {
return mergedMode;
}), _React$useState2 = _slicedToArray$e(_React$useState, 2), sourceMode = _React$useState2[0], setSourceMode = _React$useState2[1];
var onInternalPanelChange = function onInternalPanelChange2(newMode, viewValue) {
var nextMode = getInternalNextMode(newMode || mergedMode);
setSourceMode(mergedMode);
setInnerMode(nextMode);
if (onPanelChange && (mergedMode !== nextMode || isEqual$1(generateConfig2, viewDate, viewDate))) {
onPanelChange(viewValue, nextMode);
}
};
var triggerSelect = function triggerSelect2(date2, type2) {
var forceTriggerSelect = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : false;
if (mergedMode === picker || forceTriggerSelect) {
setInnerValue(date2);
if (onSelect) {
onSelect(date2);
}
if (onContextSelect) {
onContextSelect(date2, type2);
}
if (onChange && !isEqual$1(generateConfig2, date2, mergedValue) && !(disabledDate === null || disabledDate === void 0 ? void 0 : disabledDate(date2))) {
onChange(date2);
}
}
};
var isSelectable = function isSelectable2(key2) {
if (CALENDAR_PANEL_MODE.includes(mergedMode)) {
var date2;
var operationFnc;
var isDateMode = mergedMode === "date";
if (key2 === KeyCode.PAGE_UP || key2 === KeyCode.PAGE_DOWN) {
operationFnc = isDateMode ? generateConfig2.addMonth : generateConfig2.addYear;
} else {
operationFnc = isDateMode ? generateConfig2.addDate : generateConfig2.addMonth;
}
switch (key2) {
case KeyCode.LEFT:
case KeyCode.PAGE_UP:
date2 = operationFnc(viewDate, -1);
break;
case KeyCode.RIGHT:
case KeyCode.PAGE_DOWN:
date2 = operationFnc(viewDate, 1);
break;
case KeyCode.UP:
case KeyCode.DOWN:
date2 = operationFnc(viewDate, Number("".concat(key2 === KeyCode.UP ? "-" : "").concat(isDateMode ? WEEK_DAY_COUNT : MONTH_COL_COUNT)));
break;
}
if (date2) {
return !(disabledDate === null || disabledDate === void 0 ? void 0 : disabledDate(date2));
}
}
return true;
};
var onInternalKeyDown = function onInternalKeyDown2(e2) {
if (panelRef.current && panelRef.current.onKeyDown) {
var selectable = true;
var which = e2.which;
if ([KeyCode.LEFT, KeyCode.RIGHT, KeyCode.UP, KeyCode.DOWN, KeyCode.PAGE_UP, KeyCode.PAGE_DOWN, KeyCode.ENTER].includes(which)) {
e2.preventDefault();
if (which !== KeyCode.ENTER && tabIndex === 0) {
selectable = isSelectable(which);
}
}
if (selectable) {
return panelRef.current.onKeyDown(e2);
}
}
{
warningOnce(false, "Panel not correct handle keyDown event. Please help to fire issue about this.");
return false;
}
};
var onInternalBlur = function onInternalBlur2(e2) {
if (panelRef.current && panelRef.current.onBlur) {
panelRef.current.onBlur(e2);
}
};
if (operationRef && panelPosition !== "right") {
operationRef.current = {
onKeyDown: onInternalKeyDown,
onClose: function onClose() {
if (panelRef.current && panelRef.current.onClose) {
panelRef.current.onClose();
}
}
};
}
React__namespace.useEffect(function() {
if (value && !initRef.current) {
setInnerViewDate(value);
}
}, [value]);
React__namespace.useEffect(function() {
initRef.current = false;
}, []);
var panelNode;
var pickerProps = _objectSpread2$a(_objectSpread2$a({}, props), {}, {
operationRef: panelRef,
prefixCls,
viewDate,
value: mergedValue,
onViewDateChange: setViewDate,
sourceMode,
onPanelChange: onInternalPanelChange,
disabledDate
});
delete pickerProps.onChange;
delete pickerProps.onSelect;
switch (mergedMode) {
case "decade":
panelNode = /* @__PURE__ */ jsx(DecadePanel, {
...pickerProps,
onSelect: function onSelect2(date2, type2) {
setViewDate(date2);
triggerSelect(date2, type2);
}
});
break;
case "year":
panelNode = /* @__PURE__ */ jsx(YearPanel, {
...pickerProps,
onSelect: function onSelect2(date2, type2) {
setViewDate(date2);
triggerSelect(date2, type2);
}
});
break;
case "month":
panelNode = /* @__PURE__ */ jsx(MonthPanel, {
...pickerProps,
onSelect: function onSelect2(date2, type2) {
setViewDate(date2);
triggerSelect(date2, type2);
}
});
break;
case "quarter":
panelNode = /* @__PURE__ */ jsx(QuarterPanel, {
...pickerProps,
onSelect: function onSelect2(date2, type2) {
setViewDate(date2);
triggerSelect(date2, type2);
}
});
break;
case "week":
panelNode = /* @__PURE__ */ jsx(WeekPanel, {
...pickerProps,
onSelect: function onSelect2(date2, type2) {
setViewDate(date2);
triggerSelect(date2, type2);
}
});
break;
case "time":
delete pickerProps.showTime;
panelNode = /* @__PURE__ */ jsx(TimePanel, {
...pickerProps,
..._typeof$q(showTime) === "object" ? showTime : null,
onSelect: function onSelect2(date2, type2) {
setViewDate(date2);
triggerSelect(date2, type2);
}
});
break;
default:
if (showTime) {
panelNode = /* @__PURE__ */ jsx(DatetimePanel, {
...pickerProps,
onSelect: function onSelect2(date2, type2) {
setViewDate(date2);
triggerSelect(date2, type2);
}
});
} else {
panelNode = /* @__PURE__ */ jsx(DatePanel, {
...pickerProps,
onSelect: function onSelect2(date2, type2) {
setViewDate(date2);
triggerSelect(date2, type2);
}
});
}
}
var extraFooter;
var rangesNode;
var onNow = function onNow2() {
var now3 = generateConfig2.getNow();
var lowerBoundTime = getLowerBoundTime(generateConfig2.getHour(now3), generateConfig2.getMinute(now3), generateConfig2.getSecond(now3), isHourStepValid ? hourStep : 1, isMinuteStepValid ? minuteStep : 1, isSecondStepValid ? secondStep : 1);
var adjustedNow = setTime(
generateConfig2,
now3,
lowerBoundTime[0],
lowerBoundTime[1],
lowerBoundTime[2]
);
triggerSelect(adjustedNow, "submit");
};
if (!hideRanges) {
extraFooter = getExtraFooter(prefixCls, mergedMode, renderExtraFooter);
rangesNode = getRanges({
prefixCls,
components,
needConfirmButton,
okDisabled: !mergedValue || disabledDate && disabledDate(mergedValue),
locale: locale2,
showNow,
onNow: needConfirmButton && onNow,
onOk: function onOk() {
if (mergedValue) {
triggerSelect(mergedValue, "submit", true);
if (_onOk) {
_onOk(mergedValue);
}
}
}
});
}
var todayNode;
if (showToday && mergedMode === "date" && picker === "date" && !showTime) {
var now2 = generateConfig2.getNow();
var todayCls = "".concat(prefixCls, "-today-btn");
var disabled = disabledDate && disabledDate(now2);
todayNode = /* @__PURE__ */ jsx("a", {
className: classnames(todayCls, disabled && "".concat(todayCls, "-disabled")),
"aria-disabled": disabled,
onClick: function onClick() {
if (!disabled) {
triggerSelect(now2, "mouse", true);
}
},
children: locale2.today
});
}
return /* @__PURE__ */ jsx(PanelContext.Provider, {
value: _objectSpread2$a(_objectSpread2$a({}, panelContext), {}, {
mode: mergedMode,
hideHeader: "hideHeader" in props ? hideHeader : panelContext.hideHeader,
hidePrevBtn: inRange && panelPosition === "right",
hideNextBtn: inRange && panelPosition === "left"
}),
children: /* @__PURE__ */ jsxs("div", {
tabIndex,
className: classnames("".concat(prefixCls, "-panel"), className, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-panel-has-range"), rangedValue && rangedValue[0] && rangedValue[1]), _defineProperty$b(_classNames, "".concat(prefixCls, "-panel-has-range-hover"), hoverRangedValue && hoverRangedValue[0] && hoverRangedValue[1]), _defineProperty$b(_classNames, "".concat(prefixCls, "-panel-rtl"), direction === "rtl"), _classNames)),
style: style2,
onKeyDown: onInternalKeyDown,
onBlur: onInternalBlur,
onMouseDown,
ref: panelDivRef,
children: [panelNode, extraFooter || rangesNode || todayNode ? /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-footer"),
children: [extraFooter, rangesNode, todayNode]
}) : null]
})
});
}
var BUILT_IN_PLACEMENTS = {
bottomLeft: {
points: ["tl", "bl"],
offset: [0, 4],
overflow: {
adjustX: 1,
adjustY: 1
}
},
bottomRight: {
points: ["tr", "br"],
offset: [0, 4],
overflow: {
adjustX: 1,
adjustY: 1
}
},
topLeft: {
points: ["bl", "tl"],
offset: [0, -4],
overflow: {
adjustX: 0,
adjustY: 1
}
},
topRight: {
points: ["br", "tr"],
offset: [0, -4],
overflow: {
adjustX: 0,
adjustY: 1
}
}
};
function PickerTrigger(_ref) {
var _classNames;
var prefixCls = _ref.prefixCls, popupElement = _ref.popupElement, popupStyle = _ref.popupStyle, visible = _ref.visible, dropdownClassName = _ref.dropdownClassName, dropdownAlign = _ref.dropdownAlign, transitionName2 = _ref.transitionName, getPopupContainer = _ref.getPopupContainer, children = _ref.children, range2 = _ref.range, popupPlacement = _ref.popupPlacement, direction = _ref.direction;
var dropdownPrefixCls = "".concat(prefixCls, "-dropdown");
var getPopupPlacement = function getPopupPlacement2() {
if (popupPlacement !== void 0) {
return popupPlacement;
}
return direction === "rtl" ? "bottomRight" : "bottomLeft";
};
return /* @__PURE__ */ jsx(Trigger$1, {
showAction: [],
hideAction: [],
popupPlacement: getPopupPlacement(),
builtinPlacements: BUILT_IN_PLACEMENTS,
prefixCls: dropdownPrefixCls,
popupTransitionName: transitionName2,
popup: popupElement,
popupAlign: dropdownAlign,
popupVisible: visible,
popupClassName: classnames(dropdownClassName, (_classNames = {}, _defineProperty$b(_classNames, "".concat(dropdownPrefixCls, "-range"), range2), _defineProperty$b(_classNames, "".concat(dropdownPrefixCls, "-rtl"), direction === "rtl"), _classNames)),
popupStyle,
getPopupContainer,
children
});
}
function usePickerInput(_ref) {
var open = _ref.open, value = _ref.value, isClickOutside = _ref.isClickOutside, triggerOpen = _ref.triggerOpen, forwardKeyDown = _ref.forwardKeyDown, _onKeyDown = _ref.onKeyDown, blurToCancel = _ref.blurToCancel, onSubmit = _ref.onSubmit, onCancel = _ref.onCancel, _onFocus = _ref.onFocus, _onBlur = _ref.onBlur, currentFocusedKey = _ref.currentFocusedKey, _ref$key = _ref.key, key2 = _ref$key === void 0 ? "start" : _ref$key;
var _useState = React$a.useState(false), _useState2 = _slicedToArray$e(_useState, 2), typing = _useState2[0], setTyping = _useState2[1];
var _useState3 = React$a.useState(false), _useState4 = _slicedToArray$e(_useState3, 2), focused = _useState4[0], setFocused = _useState4[1];
var delayBlurTimer = React$a.useRef();
var preventBlurRef = React$a.useRef(false);
var valueChangedRef = React$a.useRef(false);
var preventDefaultRef = React$a.useRef(false);
var inputProps = {
onMouseDown: function onMouseDown() {
setTyping(true);
triggerOpen(true);
},
onKeyDown: function onKeyDown2(e2) {
var preventDefault = function preventDefault2() {
preventDefaultRef.current = true;
};
_onKeyDown(e2, preventDefault);
if (preventDefaultRef.current)
return;
switch (e2.which) {
case KeyCode.ENTER: {
if (!open) {
triggerOpen(true);
} else if (onSubmit() !== false) {
setTyping(true);
}
e2.preventDefault();
return;
}
case KeyCode.TAB: {
if (typing && open && !e2.shiftKey) {
setTyping(false);
e2.preventDefault();
} else if (!typing && open) {
if (!forwardKeyDown(e2) && e2.shiftKey) {
setTyping(true);
e2.preventDefault();
}
}
return;
}
case KeyCode.ESC: {
setTyping(true);
onCancel();
return;
}
}
if (!open && ![KeyCode.SHIFT].includes(e2.which)) {
triggerOpen(true);
} else if (!typing) {
forwardKeyDown(e2);
}
},
onFocus: function onFocus(e2) {
setTyping(true);
setFocused(true);
if (currentFocusedKey) {
currentFocusedKey.current = key2;
}
clearTimeout(delayBlurTimer.current);
if (_onFocus) {
_onFocus(e2);
}
},
onBlur: function onBlur(e2) {
if (preventBlurRef.current || !isClickOutside(document.activeElement)) {
preventBlurRef.current = false;
return;
}
if (blurToCancel) {
setTimeout(function() {
var _document = document, activeElement = _document.activeElement;
while (activeElement && activeElement.shadowRoot) {
activeElement = activeElement.shadowRoot.activeElement;
}
if (isClickOutside(activeElement)) {
onCancel();
}
}, 0);
} else if (open) {
triggerOpen(false);
if (valueChangedRef.current) {
onSubmit();
}
}
setFocused(false);
if (currentFocusedKey) {
currentFocusedKey.current = "";
delayBlurTimer.current = setTimeout(function() {
if (currentFocusedKey.current) {
return;
}
_onBlur === null || _onBlur === void 0 ? void 0 : _onBlur(e2);
}, 100);
} else {
_onBlur === null || _onBlur === void 0 ? void 0 : _onBlur(e2);
}
}
};
React$a.useEffect(function() {
valueChangedRef.current = false;
}, [open]);
React$a.useEffect(function() {
valueChangedRef.current = true;
}, [value]);
React$a.useEffect(function() {
return addGlobalMouseDownEvent(function(e2) {
var target = getTargetFromEvent(e2);
var clickedOutside = isClickOutside(target);
if (open) {
if (!clickedOutside) {
preventBlurRef.current = true;
requestAnimationFrame(function() {
preventBlurRef.current = false;
});
} else if (!focused || clickedOutside) {
triggerOpen(false);
}
} else if (focused && !clickedOutside) {
preventBlurRef.current = true;
}
});
});
React$a.useEffect(function() {
return function() {
return clearTimeout(delayBlurTimer.current);
};
}, []);
return [inputProps, {
focused,
typing
}];
}
function useTextValueMapping(_ref) {
var valueTexts = _ref.valueTexts, onTextChange = _ref.onTextChange;
var _React$useState = React__namespace.useState(""), _React$useState2 = _slicedToArray$e(_React$useState, 2), text = _React$useState2[0], setInnerText = _React$useState2[1];
var valueTextsRef = React__namespace.useRef([]);
valueTextsRef.current = valueTexts;
function triggerTextChange(value) {
setInnerText(value);
onTextChange(value);
}
function resetText() {
setInnerText(valueTextsRef.current[0]);
}
React__namespace.useEffect(function() {
if (valueTexts.every(function(valText) {
return valText !== text;
})) {
resetText();
}
}, [valueTexts.join("||")]);
return [text, triggerTextChange, resetText];
}
var shallowequal = function shallowEqual(objA, objB, compare, compareContext) {
var ret = compare ? compare.call(compareContext, objA, objB) : void 0;
if (ret !== void 0) {
return !!ret;
}
if (objA === objB) {
return true;
}
if (typeof objA !== "object" || !objA || typeof objB !== "object" || !objB) {
return false;
}
var keysA = Object.keys(objA);
var keysB = Object.keys(objB);
if (keysA.length !== keysB.length) {
return false;
}
var bHasOwnProperty = Object.prototype.hasOwnProperty.bind(objB);
for (var idx = 0; idx < keysA.length; idx++) {
var key2 = keysA[idx];
if (!bHasOwnProperty(key2)) {
return false;
}
var valueA = objA[key2];
var valueB = objB[key2];
ret = compare ? compare.call(compareContext, valueA, valueB, key2) : void 0;
if (ret === false || ret === void 0 && valueA !== valueB) {
return false;
}
}
return true;
};
function useValueTexts(value, _ref) {
var formatList = _ref.formatList, generateConfig2 = _ref.generateConfig, locale2 = _ref.locale;
return useMemo(function() {
if (!value) {
return [[""], ""];
}
var firstValueText = "";
var fullValueTexts = [];
for (var i2 = 0; i2 < formatList.length; i2 += 1) {
var format2 = formatList[i2];
var formatStr = formatValue(value, {
generateConfig: generateConfig2,
locale: locale2,
format: format2
});
fullValueTexts.push(formatStr);
if (i2 === 0) {
firstValueText = formatStr;
}
}
return [fullValueTexts, firstValueText];
}, [value, formatList], function(prev, next) {
return prev[0] !== next[0] || !shallowequal(prev[1], next[1]);
});
}
function useHoverValue(valueText, _ref) {
var formatList = _ref.formatList, generateConfig2 = _ref.generateConfig, locale2 = _ref.locale;
var _useState = React$a.useState(null), _useState2 = _slicedToArray$e(_useState, 2), value = _useState2[0], internalSetValue = _useState2[1];
var raf2 = React$a.useRef(null);
function setValue2(val) {
var immediately = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
cancelAnimationFrame(raf2.current);
if (immediately) {
internalSetValue(val);
return;
}
raf2.current = requestAnimationFrame(function() {
internalSetValue(val);
});
}
var _useValueTexts = useValueTexts(value, {
formatList,
generateConfig: generateConfig2,
locale: locale2
}), _useValueTexts2 = _slicedToArray$e(_useValueTexts, 2), firstText = _useValueTexts2[1];
function onEnter(date2) {
setValue2(date2);
}
function onLeave() {
var immediately = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : false;
setValue2(null, immediately);
}
React$a.useEffect(function() {
onLeave(true);
}, [valueText]);
React$a.useEffect(function() {
return function() {
return cancelAnimationFrame(raf2.current);
};
}, []);
return [firstText, onEnter, onLeave];
}
function InnerPicker(props) {
var _classNames2;
var _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-picker" : _props$prefixCls, id2 = props.id, tabIndex = props.tabIndex, style2 = props.style, className = props.className, dropdownClassName = props.dropdownClassName, dropdownAlign = props.dropdownAlign, popupStyle = props.popupStyle, transitionName2 = props.transitionName, generateConfig2 = props.generateConfig, locale2 = props.locale, inputReadOnly = props.inputReadOnly, allowClear = props.allowClear, autoFocus = props.autoFocus, showTime = props.showTime, _props$picker = props.picker, picker = _props$picker === void 0 ? "date" : _props$picker, format2 = props.format, use12Hours = props.use12Hours, value = props.value, defaultValue = props.defaultValue, open = props.open, defaultOpen = props.defaultOpen, defaultOpenValue = props.defaultOpenValue, suffixIcon = props.suffixIcon, clearIcon = props.clearIcon, disabled = props.disabled, disabledDate = props.disabledDate, placeholder = props.placeholder, getPopupContainer = props.getPopupContainer, pickerRef = props.pickerRef, panelRender = props.panelRender, onChange = props.onChange, onOpenChange = props.onOpenChange, onFocus = props.onFocus, onBlur = props.onBlur, onMouseDown = props.onMouseDown, onMouseUp = props.onMouseUp, onMouseEnter = props.onMouseEnter, onMouseLeave = props.onMouseLeave, onContextMenu = props.onContextMenu, onClick = props.onClick, _onKeyDown = props.onKeyDown, _onSelect = props.onSelect, direction = props.direction, _props$autoComplete = props.autoComplete, autoComplete = _props$autoComplete === void 0 ? "off" : _props$autoComplete, inputRender = props.inputRender;
var inputRef = React__namespace.useRef(null);
var needConfirmButton = picker === "date" && !!showTime || picker === "time";
var formatList = toArray$6(getDefaultFormat(format2, picker, showTime, use12Hours));
var panelDivRef = React__namespace.useRef(null);
var inputDivRef = React__namespace.useRef(null);
var containerRef = React__namespace.useRef(null);
var _useMergedState = useMergedState(null, {
value,
defaultValue
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), mergedValue = _useMergedState2[0], setInnerValue = _useMergedState2[1];
var _React$useState = React__namespace.useState(mergedValue), _React$useState2 = _slicedToArray$e(_React$useState, 2), selectedValue = _React$useState2[0], setSelectedValue = _React$useState2[1];
var operationRef = React__namespace.useRef(null);
var _useMergedState3 = useMergedState(false, {
value: open,
defaultValue: defaultOpen,
postState: function postState(postOpen) {
return disabled ? false : postOpen;
},
onChange: function onChange2(newOpen) {
if (onOpenChange) {
onOpenChange(newOpen);
}
if (!newOpen && operationRef.current && operationRef.current.onClose) {
operationRef.current.onClose();
}
}
}), _useMergedState4 = _slicedToArray$e(_useMergedState3, 2), mergedOpen = _useMergedState4[0], triggerInnerOpen = _useMergedState4[1];
var _useValueTexts = useValueTexts(selectedValue, {
formatList,
generateConfig: generateConfig2,
locale: locale2
}), _useValueTexts2 = _slicedToArray$e(_useValueTexts, 2), valueTexts = _useValueTexts2[0], firstValueText = _useValueTexts2[1];
var _useTextValueMapping = useTextValueMapping({
valueTexts,
onTextChange: function onTextChange(newText) {
var inputDate = parseValue(newText, {
locale: locale2,
formatList,
generateConfig: generateConfig2
});
if (inputDate && (!disabledDate || !disabledDate(inputDate))) {
setSelectedValue(inputDate);
}
}
}), _useTextValueMapping2 = _slicedToArray$e(_useTextValueMapping, 3), text = _useTextValueMapping2[0], triggerTextChange = _useTextValueMapping2[1], resetText = _useTextValueMapping2[2];
var triggerChange = function triggerChange2(newValue) {
setSelectedValue(newValue);
setInnerValue(newValue);
if (onChange && !isEqual$1(generateConfig2, mergedValue, newValue)) {
onChange(newValue, newValue ? formatValue(newValue, {
generateConfig: generateConfig2,
locale: locale2,
format: formatList[0]
}) : "");
}
};
var triggerOpen = function triggerOpen2(newOpen) {
if (disabled && newOpen) {
return;
}
triggerInnerOpen(newOpen);
};
var forwardKeyDown = function forwardKeyDown2(e2) {
if (mergedOpen && operationRef.current && operationRef.current.onKeyDown) {
return operationRef.current.onKeyDown(e2);
}
{
warningOnce(false, "Picker not correct forward KeyDown operation. Please help to fire issue about this.");
return false;
}
};
var onInternalClick = function onInternalClick2() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
onClick === null || onClick === void 0 ? void 0 : onClick.apply(void 0, args);
if (inputRef.current) {
inputRef.current.focus();
triggerOpen(true);
}
};
var _usePickerInput = usePickerInput({
blurToCancel: needConfirmButton,
open: mergedOpen,
value: text,
triggerOpen,
forwardKeyDown,
isClickOutside: function isClickOutside(target) {
return !elementsContains([panelDivRef.current, inputDivRef.current, containerRef.current], target);
},
onSubmit: function onSubmit() {
if (!selectedValue || disabledDate && disabledDate(selectedValue)) {
return false;
}
triggerChange(selectedValue);
triggerOpen(false);
resetText();
return true;
},
onCancel: function onCancel() {
triggerOpen(false);
setSelectedValue(mergedValue);
resetText();
},
onKeyDown: function onKeyDown2(e2, preventDefault) {
_onKeyDown === null || _onKeyDown === void 0 ? void 0 : _onKeyDown(e2, preventDefault);
},
onFocus,
onBlur
}), _usePickerInput2 = _slicedToArray$e(_usePickerInput, 2), inputProps = _usePickerInput2[0], _usePickerInput2$ = _usePickerInput2[1], focused = _usePickerInput2$.focused, typing = _usePickerInput2$.typing;
React__namespace.useEffect(function() {
if (!mergedOpen) {
setSelectedValue(mergedValue);
if (!valueTexts.length || valueTexts[0] === "") {
triggerTextChange("");
} else if (firstValueText !== text) {
resetText();
}
}
}, [mergedOpen, valueTexts]);
React__namespace.useEffect(function() {
if (!mergedOpen) {
resetText();
}
}, [picker]);
React__namespace.useEffect(function() {
setSelectedValue(mergedValue);
}, [mergedValue]);
if (pickerRef) {
pickerRef.current = {
focus: function focus() {
if (inputRef.current) {
inputRef.current.focus();
}
},
blur: function blur() {
if (inputRef.current) {
inputRef.current.blur();
}
}
};
}
var _useHoverValue = useHoverValue(text, {
formatList,
generateConfig: generateConfig2,
locale: locale2
}), _useHoverValue2 = _slicedToArray$e(_useHoverValue, 3), hoverValue = _useHoverValue2[0], onEnter = _useHoverValue2[1], onLeave = _useHoverValue2[2];
var panelProps = _objectSpread2$a(_objectSpread2$a({}, props), {}, {
className: void 0,
style: void 0,
pickerValue: void 0,
onPickerValueChange: void 0,
onChange: null
});
var panelNode = /* @__PURE__ */ jsx(PickerPanel, {
...panelProps,
generateConfig: generateConfig2,
className: classnames(_defineProperty$b({}, "".concat(prefixCls, "-panel-focused"), !typing)),
value: selectedValue,
locale: locale2,
tabIndex: -1,
onSelect: function onSelect(date2) {
_onSelect === null || _onSelect === void 0 ? void 0 : _onSelect(date2);
setSelectedValue(date2);
},
direction,
onPanelChange: function onPanelChange(viewDate, mode) {
var onPanelChange2 = props.onPanelChange;
onLeave(true);
onPanelChange2 === null || onPanelChange2 === void 0 ? void 0 : onPanelChange2(viewDate, mode);
}
});
if (panelRender) {
panelNode = panelRender(panelNode);
}
var panel = /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-panel-container"),
onMouseDown: function onMouseDown2(e2) {
e2.preventDefault();
},
children: panelNode
});
var suffixNode;
if (suffixIcon) {
suffixNode = /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-suffix"),
children: suffixIcon
});
}
var clearNode;
if (allowClear && mergedValue && !disabled) {
clearNode = /* @__PURE__ */ jsx("span", {
onMouseDown: function onMouseDown2(e2) {
e2.preventDefault();
e2.stopPropagation();
},
onMouseUp: function onMouseUp2(e2) {
e2.preventDefault();
e2.stopPropagation();
triggerChange(null);
triggerOpen(false);
},
className: "".concat(prefixCls, "-clear"),
role: "button",
children: clearIcon || /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-clear-btn")
})
});
}
var mergedInputProps = _objectSpread2$a(_objectSpread2$a(_objectSpread2$a({
id: id2,
tabIndex,
disabled,
readOnly: inputReadOnly || typeof formatList[0] === "function" || !typing,
value: hoverValue || text,
onChange: function onChange2(e2) {
triggerTextChange(e2.target.value);
},
autoFocus,
placeholder,
ref: inputRef,
title: text
}, inputProps), {}, {
size: getInputSize(picker, formatList[0], generateConfig2)
}, getDataOrAriaProps(props)), {}, {
autoComplete
});
var inputNode = inputRender ? inputRender(mergedInputProps) : /* @__PURE__ */ jsx("input", {
...mergedInputProps
});
var onContextSelect = function onContextSelect2(date2, type2) {
if (type2 === "submit" || type2 !== "key" && !needConfirmButton) {
triggerChange(date2);
triggerOpen(false);
}
};
var popupPlacement = direction === "rtl" ? "bottomRight" : "bottomLeft";
return /* @__PURE__ */ jsx(PanelContext.Provider, {
value: {
operationRef,
hideHeader: picker === "time",
panelRef: panelDivRef,
onSelect: onContextSelect,
open: mergedOpen,
defaultOpenValue,
onDateMouseEnter: onEnter,
onDateMouseLeave: onLeave
},
children: /* @__PURE__ */ jsx(PickerTrigger, {
visible: mergedOpen,
popupElement: panel,
popupStyle,
prefixCls,
dropdownClassName,
dropdownAlign,
getPopupContainer,
transitionName: transitionName2,
popupPlacement,
direction,
children: /* @__PURE__ */ jsx("div", {
ref: containerRef,
className: classnames(prefixCls, className, (_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-disabled"), disabled), _defineProperty$b(_classNames2, "".concat(prefixCls, "-focused"), focused), _defineProperty$b(_classNames2, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames2)),
style: style2,
onMouseDown,
onMouseUp,
onMouseEnter,
onMouseLeave,
onContextMenu,
onClick: onInternalClick,
children: /* @__PURE__ */ jsxs("div", {
className: classnames("".concat(prefixCls, "-input"), _defineProperty$b({}, "".concat(prefixCls, "-input-placeholder"), !!hoverValue)),
ref: inputDivRef,
children: [inputNode, suffixNode, clearNode]
})
})
})
});
}
var Picker = /* @__PURE__ */ function(_React$Component) {
_inherits(Picker2, _React$Component);
var _super = _createSuper(Picker2);
function Picker2() {
var _this2;
_classCallCheck(this, Picker2);
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
_this2 = _super.call.apply(_super, [this].concat(args));
_this2.pickerRef = /* @__PURE__ */ React__namespace.createRef();
_this2.focus = function() {
if (_this2.pickerRef.current) {
_this2.pickerRef.current.focus();
}
};
_this2.blur = function() {
if (_this2.pickerRef.current) {
_this2.pickerRef.current.blur();
}
};
return _this2;
}
_createClass(Picker2, [{
key: "render",
value: function render2() {
return /* @__PURE__ */ jsx(InnerPicker, {
...this.props,
pickerRef: this.pickerRef
});
}
}]);
return Picker2;
}(React__namespace.Component);
function useRangeDisabled(_ref, disabledStart, disabledEnd) {
var picker = _ref.picker, locale2 = _ref.locale, selectedValue = _ref.selectedValue, disabledDate = _ref.disabledDate, disabled = _ref.disabled, generateConfig2 = _ref.generateConfig;
var startDate = getValue$3(selectedValue, 0);
var endDate = getValue$3(selectedValue, 1);
function weekFirstDate(date2) {
return generateConfig2.locale.getWeekFirstDate(locale2.locale, date2);
}
function monthNumber(date2) {
var year = generateConfig2.getYear(date2);
var month = generateConfig2.getMonth(date2);
return year * 100 + month;
}
function quarterNumber(date2) {
var year = generateConfig2.getYear(date2);
var quarter = getQuarter(generateConfig2, date2);
return year * 10 + quarter;
}
var disabledStartDate = React__namespace.useCallback(function(date2) {
if (disabledDate && disabledDate(date2)) {
return true;
}
if (disabled[1] && endDate) {
return !isSameDate(generateConfig2, date2, endDate) && generateConfig2.isAfter(date2, endDate);
}
if (disabledStart && endDate) {
switch (picker) {
case "quarter":
return quarterNumber(date2) > quarterNumber(endDate);
case "month":
return monthNumber(date2) > monthNumber(endDate);
case "week":
return weekFirstDate(date2) > weekFirstDate(endDate);
default:
return !isSameDate(generateConfig2, date2, endDate) && generateConfig2.isAfter(date2, endDate);
}
}
return false;
}, [disabledDate, disabled[1], endDate, disabledStart]);
var disabledEndDate = React__namespace.useCallback(function(date2) {
if (disabledDate && disabledDate(date2)) {
return true;
}
if (disabled[0] && startDate) {
return !isSameDate(generateConfig2, date2, endDate) && generateConfig2.isAfter(startDate, date2);
}
if (disabledEnd && startDate) {
switch (picker) {
case "quarter":
return quarterNumber(date2) < quarterNumber(startDate);
case "month":
return monthNumber(date2) < monthNumber(startDate);
case "week":
return weekFirstDate(date2) < weekFirstDate(startDate);
default:
return !isSameDate(generateConfig2, date2, startDate) && generateConfig2.isAfter(startDate, date2);
}
}
return false;
}, [disabledDate, disabled[0], startDate, disabledEnd]);
return [disabledStartDate, disabledEndDate];
}
function getStartEndDistance(startDate, endDate, picker, generateConfig2) {
var startNext = getClosingViewDate(startDate, picker, generateConfig2, 1);
function getDistance(compareFunc) {
if (compareFunc(startDate, endDate)) {
return "same";
}
if (compareFunc(startNext, endDate)) {
return "closing";
}
return "far";
}
switch (picker) {
case "year":
return getDistance(function(start, end) {
return isSameDecade(generateConfig2, start, end);
});
case "quarter":
case "month":
return getDistance(function(start, end) {
return isSameYear(generateConfig2, start, end);
});
default:
return getDistance(function(start, end) {
return isSameMonth(generateConfig2, start, end);
});
}
}
function getRangeViewDate(values, index2, picker, generateConfig2) {
var startDate = getValue$3(values, 0);
var endDate = getValue$3(values, 1);
if (index2 === 0) {
return startDate;
}
if (startDate && endDate) {
var distance = getStartEndDistance(startDate, endDate, picker, generateConfig2);
switch (distance) {
case "same":
return startDate;
case "closing":
return startDate;
default:
return getClosingViewDate(endDate, picker, generateConfig2, -1);
}
}
return startDate;
}
function useRangeViewDates(_ref) {
var values = _ref.values, picker = _ref.picker, defaultDates = _ref.defaultDates, generateConfig2 = _ref.generateConfig;
var _React$useState = React__namespace.useState(function() {
return [getValue$3(defaultDates, 0), getValue$3(defaultDates, 1)];
}), _React$useState2 = _slicedToArray$e(_React$useState, 2), defaultViewDates = _React$useState2[0], setDefaultViewDates = _React$useState2[1];
var _React$useState3 = React__namespace.useState(null), _React$useState4 = _slicedToArray$e(_React$useState3, 2), viewDates = _React$useState4[0], setInternalViewDates = _React$useState4[1];
var startDate = getValue$3(values, 0);
var endDate = getValue$3(values, 1);
function getViewDate(index2) {
if (defaultViewDates[index2]) {
return defaultViewDates[index2];
}
return getValue$3(viewDates, index2) || getRangeViewDate(values, index2, picker, generateConfig2) || startDate || endDate || generateConfig2.getNow();
}
function setViewDate(viewDate, index2) {
if (viewDate) {
var newViewDates = updateValues(viewDates, viewDate, index2);
setDefaultViewDates(
updateValues(defaultViewDates, null, index2) || [null, null]
);
var anotherIndex = (index2 + 1) % 2;
if (!getValue$3(values, anotherIndex)) {
newViewDates = updateValues(newViewDates, viewDate, anotherIndex);
}
setInternalViewDates(newViewDates);
} else if (startDate || endDate) {
setInternalViewDates(null);
}
}
return [getViewDate, setViewDate];
}
function reorderValues(values, generateConfig2) {
if (values && values[0] && values[1] && generateConfig2.isAfter(values[0], values[1])) {
return [values[1], values[0]];
}
return values;
}
function canValueTrigger(value, index2, disabled, allowEmpty) {
if (value) {
return true;
}
if (allowEmpty && allowEmpty[index2]) {
return true;
}
if (disabled[(index2 + 1) % 2]) {
return true;
}
return false;
}
function InnerRangePicker(props) {
var _classNames2, _classNames3, _classNames4;
var _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-picker" : _props$prefixCls, id2 = props.id, style2 = props.style, className = props.className, popupStyle = props.popupStyle, dropdownClassName = props.dropdownClassName, transitionName2 = props.transitionName, dropdownAlign = props.dropdownAlign, getPopupContainer = props.getPopupContainer, generateConfig2 = props.generateConfig, locale2 = props.locale, placeholder = props.placeholder, autoFocus = props.autoFocus, disabled = props.disabled, format2 = props.format, _props$picker = props.picker, picker = _props$picker === void 0 ? "date" : _props$picker, showTime = props.showTime, use12Hours = props.use12Hours, _props$separator = props.separator, separator = _props$separator === void 0 ? "~" : _props$separator, value = props.value, defaultValue = props.defaultValue, defaultPickerValue = props.defaultPickerValue, open = props.open, defaultOpen = props.defaultOpen, disabledDate = props.disabledDate, _disabledTime = props.disabledTime, dateRender = props.dateRender, panelRender = props.panelRender, ranges = props.ranges, allowEmpty = props.allowEmpty, allowClear = props.allowClear, suffixIcon = props.suffixIcon, clearIcon = props.clearIcon, pickerRef = props.pickerRef, inputReadOnly = props.inputReadOnly, mode = props.mode, renderExtraFooter = props.renderExtraFooter, onChange = props.onChange, onOpenChange = props.onOpenChange, onPanelChange = props.onPanelChange, onCalendarChange = props.onCalendarChange, _onFocus = props.onFocus, onBlur = props.onBlur, onMouseDown = props.onMouseDown, onMouseUp = props.onMouseUp, onMouseEnter = props.onMouseEnter, onMouseLeave = props.onMouseLeave, onClick = props.onClick, _onOk = props.onOk, _onKeyDown = props.onKeyDown, components = props.components, order = props.order, direction = props.direction, activePickerIndex = props.activePickerIndex, _props$autoComplete = props.autoComplete, autoComplete = _props$autoComplete === void 0 ? "off" : _props$autoComplete;
var needConfirmButton = picker === "date" && !!showTime || picker === "time";
var openRecordsRef = React$a.useRef({});
var containerRef = React$a.useRef(null);
var panelDivRef = React$a.useRef(null);
var startInputDivRef = React$a.useRef(null);
var endInputDivRef = React$a.useRef(null);
var separatorRef = React$a.useRef(null);
var startInputRef = React$a.useRef(null);
var endInputRef = React$a.useRef(null);
var arrowRef = React$a.useRef(null);
var formatList = toArray$6(getDefaultFormat(format2, picker, showTime, use12Hours));
var _useMergedState = useMergedState(0, {
value: activePickerIndex
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), mergedActivePickerIndex = _useMergedState2[0], setMergedActivePickerIndex = _useMergedState2[1];
var operationRef = React$a.useRef(null);
var mergedDisabled = React__namespace.useMemo(function() {
if (Array.isArray(disabled)) {
return disabled;
}
return [disabled || false, disabled || false];
}, [disabled]);
var _useMergedState3 = useMergedState(null, {
value,
defaultValue,
postState: function postState(values) {
return picker === "time" && !order ? values : reorderValues(values, generateConfig2);
}
}), _useMergedState4 = _slicedToArray$e(_useMergedState3, 2), mergedValue = _useMergedState4[0], setInnerValue = _useMergedState4[1];
var _useRangeViewDates = useRangeViewDates({
values: mergedValue,
picker,
defaultDates: defaultPickerValue,
generateConfig: generateConfig2
}), _useRangeViewDates2 = _slicedToArray$e(_useRangeViewDates, 2), getViewDate = _useRangeViewDates2[0], setViewDate = _useRangeViewDates2[1];
var _useMergedState5 = useMergedState(mergedValue, {
postState: function postState(values) {
var postValues = values;
if (mergedDisabled[0] && mergedDisabled[1]) {
return postValues;
}
for (var i2 = 0; i2 < 2; i2 += 1) {
if (mergedDisabled[i2] && !postValues && !getValue$3(postValues, i2) && !getValue$3(allowEmpty, i2)) {
postValues = updateValues(postValues, generateConfig2.getNow(), i2);
}
}
return postValues;
}
}), _useMergedState6 = _slicedToArray$e(_useMergedState5, 2), selectedValue = _useMergedState6[0], setSelectedValue = _useMergedState6[1];
var _useMergedState7 = useMergedState([picker, picker], {
value: mode
}), _useMergedState8 = _slicedToArray$e(_useMergedState7, 2), mergedModes = _useMergedState8[0], setInnerModes = _useMergedState8[1];
React$a.useEffect(function() {
setInnerModes([picker, picker]);
}, [picker]);
var triggerModesChange = function triggerModesChange2(modes, values) {
setInnerModes(modes);
if (onPanelChange) {
onPanelChange(values, modes);
}
};
var _useRangeDisabled = useRangeDisabled({
picker,
selectedValue,
locale: locale2,
disabled: mergedDisabled,
disabledDate,
generateConfig: generateConfig2
}, openRecordsRef.current[1], openRecordsRef.current[0]), _useRangeDisabled2 = _slicedToArray$e(_useRangeDisabled, 2), disabledStartDate = _useRangeDisabled2[0], disabledEndDate = _useRangeDisabled2[1];
var _useMergedState9 = useMergedState(false, {
value: open,
defaultValue: defaultOpen,
postState: function postState(postOpen) {
return mergedDisabled[mergedActivePickerIndex] ? false : postOpen;
},
onChange: function onChange2(newOpen) {
if (onOpenChange) {
onOpenChange(newOpen);
}
if (!newOpen && operationRef.current && operationRef.current.onClose) {
operationRef.current.onClose();
}
}
}), _useMergedState10 = _slicedToArray$e(_useMergedState9, 2), mergedOpen = _useMergedState10[0], triggerInnerOpen = _useMergedState10[1];
var startOpen = mergedOpen && mergedActivePickerIndex === 0;
var endOpen = mergedOpen && mergedActivePickerIndex === 1;
var _useState = React$a.useState(0), _useState2 = _slicedToArray$e(_useState, 2), popupMinWidth = _useState2[0], setPopupMinWidth = _useState2[1];
React$a.useEffect(function() {
if (!mergedOpen && containerRef.current) {
setPopupMinWidth(containerRef.current.offsetWidth);
}
}, [mergedOpen]);
var triggerRef = React__namespace.useRef();
function _triggerOpen(newOpen, index2) {
if (newOpen) {
clearTimeout(triggerRef.current);
openRecordsRef.current[index2] = true;
setMergedActivePickerIndex(index2);
triggerInnerOpen(newOpen);
if (!mergedOpen) {
setViewDate(null, index2);
}
} else if (mergedActivePickerIndex === index2) {
triggerInnerOpen(newOpen);
var openRecords = openRecordsRef.current;
triggerRef.current = setTimeout(function() {
if (openRecords === openRecordsRef.current) {
openRecordsRef.current = {};
}
});
}
}
function triggerOpenAndFocus(index2) {
_triggerOpen(true, index2);
setTimeout(function() {
var inputRef = [startInputRef, endInputRef][index2];
if (inputRef.current) {
inputRef.current.focus();
}
}, 0);
}
function triggerChange(newValue, sourceIndex) {
var values = newValue;
var startValue = getValue$3(values, 0);
var endValue = getValue$3(values, 1);
if (startValue && endValue && generateConfig2.isAfter(startValue, endValue)) {
if (picker === "week" && !isSameWeek(generateConfig2, locale2.locale, startValue, endValue) || picker === "quarter" && !isSameQuarter(generateConfig2, startValue, endValue) || picker !== "week" && picker !== "quarter" && picker !== "time" && !isSameDate(generateConfig2, startValue, endValue)) {
if (sourceIndex === 0) {
values = [startValue, null];
endValue = null;
} else {
startValue = null;
values = [null, endValue];
}
openRecordsRef.current = _defineProperty$b({}, sourceIndex, true);
} else if (picker !== "time" || order !== false) {
values = reorderValues(values, generateConfig2);
}
}
setSelectedValue(values);
var startStr2 = values && values[0] ? formatValue(values[0], {
generateConfig: generateConfig2,
locale: locale2,
format: formatList[0]
}) : "";
var endStr2 = values && values[1] ? formatValue(values[1], {
generateConfig: generateConfig2,
locale: locale2,
format: formatList[0]
}) : "";
if (onCalendarChange) {
var info = {
range: sourceIndex === 0 ? "start" : "end"
};
onCalendarChange(values, [startStr2, endStr2], info);
}
var canStartValueTrigger = canValueTrigger(startValue, 0, mergedDisabled, allowEmpty);
var canEndValueTrigger = canValueTrigger(endValue, 1, mergedDisabled, allowEmpty);
var canTrigger = values === null || canStartValueTrigger && canEndValueTrigger;
if (canTrigger) {
setInnerValue(values);
if (onChange && (!isEqual$1(generateConfig2, getValue$3(mergedValue, 0), startValue) || !isEqual$1(generateConfig2, getValue$3(mergedValue, 1), endValue))) {
onChange(values, [startStr2, endStr2]);
}
}
var nextOpenIndex = null;
if (sourceIndex === 0 && !mergedDisabled[1]) {
nextOpenIndex = 1;
} else if (sourceIndex === 1 && !mergedDisabled[0]) {
nextOpenIndex = 0;
}
if (nextOpenIndex !== null && nextOpenIndex !== mergedActivePickerIndex && (!openRecordsRef.current[nextOpenIndex] || !getValue$3(values, nextOpenIndex)) && getValue$3(values, sourceIndex)) {
triggerOpenAndFocus(nextOpenIndex);
} else {
_triggerOpen(false, sourceIndex);
}
}
var forwardKeyDown = function forwardKeyDown2(e2) {
if (mergedOpen && operationRef.current && operationRef.current.onKeyDown) {
return operationRef.current.onKeyDown(e2);
}
{
warningOnce(false, "Picker not correct forward KeyDown operation. Please help to fire issue about this.");
return false;
}
};
var sharedTextHooksProps = {
formatList,
generateConfig: generateConfig2,
locale: locale2
};
var _useValueTexts = useValueTexts(getValue$3(selectedValue, 0), sharedTextHooksProps), _useValueTexts2 = _slicedToArray$e(_useValueTexts, 2), startValueTexts = _useValueTexts2[0], firstStartValueText = _useValueTexts2[1];
var _useValueTexts3 = useValueTexts(getValue$3(selectedValue, 1), sharedTextHooksProps), _useValueTexts4 = _slicedToArray$e(_useValueTexts3, 2), endValueTexts = _useValueTexts4[0], firstEndValueText = _useValueTexts4[1];
var _onTextChange = function onTextChange(newText, index2) {
var inputDate = parseValue(newText, {
locale: locale2,
formatList,
generateConfig: generateConfig2
});
var disabledFunc = index2 === 0 ? disabledStartDate : disabledEndDate;
if (inputDate && !disabledFunc(inputDate)) {
setSelectedValue(updateValues(selectedValue, inputDate, index2));
setViewDate(inputDate, index2);
}
};
var _useTextValueMapping = useTextValueMapping({
valueTexts: startValueTexts,
onTextChange: function onTextChange(newText) {
return _onTextChange(newText, 0);
}
}), _useTextValueMapping2 = _slicedToArray$e(_useTextValueMapping, 3), startText = _useTextValueMapping2[0], triggerStartTextChange = _useTextValueMapping2[1], resetStartText = _useTextValueMapping2[2];
var _useTextValueMapping3 = useTextValueMapping({
valueTexts: endValueTexts,
onTextChange: function onTextChange(newText) {
return _onTextChange(newText, 1);
}
}), _useTextValueMapping4 = _slicedToArray$e(_useTextValueMapping3, 3), endText = _useTextValueMapping4[0], triggerEndTextChange = _useTextValueMapping4[1], resetEndText = _useTextValueMapping4[2];
var _useState3 = React$a.useState(null), _useState4 = _slicedToArray$e(_useState3, 2), rangeHoverValue = _useState4[0], setRangeHoverValue = _useState4[1];
var _useState5 = React$a.useState(null), _useState6 = _slicedToArray$e(_useState5, 2), hoverRangedValue = _useState6[0], setHoverRangedValue = _useState6[1];
var _useHoverValue = useHoverValue(startText, {
formatList,
generateConfig: generateConfig2,
locale: locale2
}), _useHoverValue2 = _slicedToArray$e(_useHoverValue, 3), startHoverValue = _useHoverValue2[0], onStartEnter = _useHoverValue2[1], onStartLeave = _useHoverValue2[2];
var _useHoverValue3 = useHoverValue(endText, {
formatList,
generateConfig: generateConfig2,
locale: locale2
}), _useHoverValue4 = _slicedToArray$e(_useHoverValue3, 3), endHoverValue = _useHoverValue4[0], onEndEnter = _useHoverValue4[1], onEndLeave = _useHoverValue4[2];
var onDateMouseEnter = function onDateMouseEnter2(date2) {
setHoverRangedValue(updateValues(selectedValue, date2, mergedActivePickerIndex));
if (mergedActivePickerIndex === 0) {
onStartEnter(date2);
} else {
onEndEnter(date2);
}
};
var onDateMouseLeave = function onDateMouseLeave2() {
setHoverRangedValue(updateValues(selectedValue, null, mergedActivePickerIndex));
if (mergedActivePickerIndex === 0) {
onStartLeave();
} else {
onEndLeave();
}
};
var getSharedInputHookProps = function getSharedInputHookProps2(index2, resetText) {
return {
blurToCancel: needConfirmButton,
forwardKeyDown,
onBlur,
isClickOutside: function isClickOutside(target) {
return !elementsContains([panelDivRef.current, startInputDivRef.current, endInputDivRef.current, containerRef.current], target);
},
onFocus: function onFocus(e2) {
setMergedActivePickerIndex(index2);
if (_onFocus) {
_onFocus(e2);
}
},
triggerOpen: function triggerOpen(newOpen) {
_triggerOpen(newOpen, index2);
},
onSubmit: function onSubmit() {
if (!selectedValue || disabledDate && disabledDate(selectedValue[index2])) {
return false;
}
triggerChange(selectedValue, index2);
resetText();
},
onCancel: function onCancel() {
_triggerOpen(false, index2);
setSelectedValue(mergedValue);
resetText();
}
};
};
var currentFocusedKey = React$a.useRef("");
var _usePickerInput = usePickerInput(_objectSpread2$a(_objectSpread2$a({}, getSharedInputHookProps(0, resetStartText)), {}, {
open: startOpen,
value: startText,
currentFocusedKey,
key: "start",
onKeyDown: function onKeyDown2(e2, preventDefault) {
_onKeyDown === null || _onKeyDown === void 0 ? void 0 : _onKeyDown(e2, preventDefault);
}
})), _usePickerInput2 = _slicedToArray$e(_usePickerInput, 2), startInputProps = _usePickerInput2[0], _usePickerInput2$ = _usePickerInput2[1], startFocused = _usePickerInput2$.focused, startTyping = _usePickerInput2$.typing;
var _usePickerInput3 = usePickerInput(_objectSpread2$a(_objectSpread2$a({}, getSharedInputHookProps(1, resetEndText)), {}, {
open: endOpen,
value: endText,
currentFocusedKey,
key: "end",
onKeyDown: function onKeyDown2(e2, preventDefault) {
_onKeyDown === null || _onKeyDown === void 0 ? void 0 : _onKeyDown(e2, preventDefault);
}
})), _usePickerInput4 = _slicedToArray$e(_usePickerInput3, 2), endInputProps = _usePickerInput4[0], _usePickerInput4$ = _usePickerInput4[1], endFocused = _usePickerInput4$.focused, endTyping = _usePickerInput4$.typing;
var onPickerClick = function onPickerClick2(e2) {
if (onClick) {
onClick(e2);
}
if (!mergedOpen && !startInputRef.current.contains(e2.target) && !endInputRef.current.contains(e2.target)) {
if (!mergedDisabled[0]) {
triggerOpenAndFocus(0);
} else if (!mergedDisabled[1]) {
triggerOpenAndFocus(1);
}
}
};
var onPickerMouseDown = function onPickerMouseDown2(e2) {
if (onMouseDown) {
onMouseDown(e2);
}
if (mergedOpen && (startFocused || endFocused) && !startInputRef.current.contains(e2.target) && !endInputRef.current.contains(e2.target)) {
e2.preventDefault();
}
};
var startStr = mergedValue && mergedValue[0] ? formatValue(mergedValue[0], {
locale: locale2,
format: "YYYYMMDDHHmmss",
generateConfig: generateConfig2
}) : "";
var endStr = mergedValue && mergedValue[1] ? formatValue(mergedValue[1], {
locale: locale2,
format: "YYYYMMDDHHmmss",
generateConfig: generateConfig2
}) : "";
React$a.useEffect(function() {
if (!mergedOpen) {
setSelectedValue(mergedValue);
if (!startValueTexts.length || startValueTexts[0] === "") {
triggerStartTextChange("");
} else if (firstStartValueText !== startText) {
resetStartText();
}
if (!endValueTexts.length || endValueTexts[0] === "") {
triggerEndTextChange("");
} else if (firstEndValueText !== endText) {
resetEndText();
}
}
}, [mergedOpen, startValueTexts, endValueTexts]);
React$a.useEffect(function() {
setSelectedValue(mergedValue);
}, [startStr, endStr]);
if (pickerRef) {
pickerRef.current = {
focus: function focus() {
if (startInputRef.current) {
startInputRef.current.focus();
}
},
blur: function blur() {
if (startInputRef.current) {
startInputRef.current.blur();
}
if (endInputRef.current) {
endInputRef.current.blur();
}
}
};
}
var rangeLabels = Object.keys(ranges || {});
var rangeList = rangeLabels.map(function(label) {
var range2 = ranges[label];
var newValues = typeof range2 === "function" ? range2() : range2;
return {
label,
onClick: function onClick2() {
triggerChange(newValues, null);
_triggerOpen(false, mergedActivePickerIndex);
},
onMouseEnter: function onMouseEnter2() {
setRangeHoverValue(newValues);
},
onMouseLeave: function onMouseLeave2() {
setRangeHoverValue(null);
}
};
});
function renderPanel() {
var panelPosition = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : false;
var panelProps = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var panelHoverRangedValue = null;
if (mergedOpen && hoverRangedValue && hoverRangedValue[0] && hoverRangedValue[1] && generateConfig2.isAfter(hoverRangedValue[1], hoverRangedValue[0])) {
panelHoverRangedValue = hoverRangedValue;
}
var panelShowTime = showTime;
if (showTime && _typeof$q(showTime) === "object" && showTime.defaultValue) {
var timeDefaultValues = showTime.defaultValue;
panelShowTime = _objectSpread2$a(_objectSpread2$a({}, showTime), {}, {
defaultValue: getValue$3(timeDefaultValues, mergedActivePickerIndex) || void 0
});
}
var panelDateRender = null;
if (dateRender) {
panelDateRender = function panelDateRender2(date2, today) {
return dateRender(date2, today, {
range: mergedActivePickerIndex ? "end" : "start"
});
};
}
return /* @__PURE__ */ jsx(RangeContext.Provider, {
value: {
inRange: true,
panelPosition,
rangedValue: rangeHoverValue || selectedValue,
hoverRangedValue: panelHoverRangedValue
},
children: /* @__PURE__ */ jsx(PickerPanel, {
...props,
...panelProps,
dateRender: panelDateRender,
showTime: panelShowTime,
mode: mergedModes[mergedActivePickerIndex],
generateConfig: generateConfig2,
style: void 0,
direction,
disabledDate: mergedActivePickerIndex === 0 ? disabledStartDate : disabledEndDate,
disabledTime: function disabledTime(date2) {
if (_disabledTime) {
return _disabledTime(date2, mergedActivePickerIndex === 0 ? "start" : "end");
}
return false;
},
className: classnames(_defineProperty$b({}, "".concat(prefixCls, "-panel-focused"), mergedActivePickerIndex === 0 ? !startTyping : !endTyping)),
value: getValue$3(selectedValue, mergedActivePickerIndex),
locale: locale2,
tabIndex: -1,
onPanelChange: function onPanelChange2(date2, newMode) {
if (mergedActivePickerIndex === 0) {
onStartLeave(true);
}
if (mergedActivePickerIndex === 1) {
onEndLeave(true);
}
triggerModesChange(updateValues(mergedModes, newMode, mergedActivePickerIndex), updateValues(selectedValue, date2, mergedActivePickerIndex));
var viewDate = date2;
if (panelPosition === "right" && mergedModes[mergedActivePickerIndex] === newMode) {
viewDate = getClosingViewDate(viewDate, newMode, generateConfig2, -1);
}
setViewDate(viewDate, mergedActivePickerIndex);
},
onOk: null,
onSelect: void 0,
onChange: void 0,
defaultValue: mergedActivePickerIndex === 0 ? getValue$3(selectedValue, 1) : getValue$3(selectedValue, 0)
})
});
}
var arrowLeft = 0;
var panelLeft = 0;
if (mergedActivePickerIndex && startInputDivRef.current && separatorRef.current && panelDivRef.current) {
arrowLeft = startInputDivRef.current.offsetWidth + separatorRef.current.offsetWidth;
var arrowMarginLeft = arrowRef.current.offsetLeft > arrowLeft ? arrowRef.current.offsetLeft - arrowLeft : arrowRef.current.offsetLeft;
if (panelDivRef.current.offsetWidth && arrowRef.current.offsetWidth && arrowLeft > panelDivRef.current.offsetWidth - arrowRef.current.offsetWidth - (direction === "rtl" ? 0 : arrowMarginLeft)) {
panelLeft = arrowLeft;
}
}
var arrowPositionStyle = direction === "rtl" ? {
right: arrowLeft
} : {
left: arrowLeft
};
function renderPanels() {
var panels;
var extraNode = getExtraFooter(prefixCls, mergedModes[mergedActivePickerIndex], renderExtraFooter);
var rangesNode = getRanges({
prefixCls,
components,
needConfirmButton,
okDisabled: !getValue$3(selectedValue, mergedActivePickerIndex) || disabledDate && disabledDate(selectedValue[mergedActivePickerIndex]),
locale: locale2,
rangeList,
onOk: function onOk() {
if (getValue$3(selectedValue, mergedActivePickerIndex)) {
triggerChange(selectedValue, mergedActivePickerIndex);
if (_onOk) {
_onOk(selectedValue);
}
}
}
});
if (picker !== "time" && !showTime) {
var viewDate = getViewDate(mergedActivePickerIndex);
var nextViewDate = getClosingViewDate(viewDate, picker, generateConfig2);
var currentMode = mergedModes[mergedActivePickerIndex];
var showDoublePanel = currentMode === picker;
var leftPanel = renderPanel(showDoublePanel ? "left" : false, {
pickerValue: viewDate,
onPickerValueChange: function onPickerValueChange(newViewDate) {
setViewDate(newViewDate, mergedActivePickerIndex);
}
});
var rightPanel = renderPanel("right", {
pickerValue: nextViewDate,
onPickerValueChange: function onPickerValueChange(newViewDate) {
setViewDate(getClosingViewDate(newViewDate, picker, generateConfig2, -1), mergedActivePickerIndex);
}
});
if (direction === "rtl") {
panels = /* @__PURE__ */ jsxs(Fragment, {
children: [rightPanel, showDoublePanel && leftPanel]
});
} else {
panels = /* @__PURE__ */ jsxs(Fragment, {
children: [leftPanel, showDoublePanel && rightPanel]
});
}
} else {
panels = renderPanel();
}
var mergedNodes = /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-panels"),
children: panels
}), (extraNode || rangesNode) && /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-footer"),
children: [extraNode, rangesNode]
})]
});
if (panelRender) {
mergedNodes = panelRender(mergedNodes);
}
return /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-panel-container"),
style: {
marginLeft: panelLeft
},
ref: panelDivRef,
onMouseDown: function onMouseDown2(e2) {
e2.preventDefault();
},
children: mergedNodes
});
}
var rangePanel = /* @__PURE__ */ jsxs("div", {
className: classnames("".concat(prefixCls, "-range-wrapper"), "".concat(prefixCls, "-").concat(picker, "-range-wrapper")),
style: {
minWidth: popupMinWidth
},
children: [/* @__PURE__ */ jsx("div", {
ref: arrowRef,
className: "".concat(prefixCls, "-range-arrow"),
style: arrowPositionStyle
}), renderPanels()]
});
var suffixNode;
if (suffixIcon) {
suffixNode = /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-suffix"),
children: suffixIcon
});
}
var clearNode;
if (allowClear && (getValue$3(mergedValue, 0) && !mergedDisabled[0] || getValue$3(mergedValue, 1) && !mergedDisabled[1])) {
clearNode = /* @__PURE__ */ jsx("span", {
onMouseDown: function onMouseDown2(e2) {
e2.preventDefault();
e2.stopPropagation();
},
onMouseUp: function onMouseUp2(e2) {
e2.preventDefault();
e2.stopPropagation();
var values = mergedValue;
if (!mergedDisabled[0]) {
values = updateValues(values, null, 0);
}
if (!mergedDisabled[1]) {
values = updateValues(values, null, 1);
}
triggerChange(values, null);
_triggerOpen(false, mergedActivePickerIndex);
},
className: "".concat(prefixCls, "-clear"),
children: clearIcon || /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-clear-btn")
})
});
}
var inputSharedProps = {
size: getInputSize(picker, formatList[0], generateConfig2)
};
var activeBarLeft = 0;
var activeBarWidth = 0;
if (startInputDivRef.current && endInputDivRef.current && separatorRef.current) {
if (mergedActivePickerIndex === 0) {
activeBarWidth = startInputDivRef.current.offsetWidth;
} else {
activeBarLeft = arrowLeft;
activeBarWidth = endInputDivRef.current.offsetWidth;
}
}
var activeBarPositionStyle = direction === "rtl" ? {
right: activeBarLeft
} : {
left: activeBarLeft
};
var onContextSelect = function onContextSelect2(date2, type2) {
var values = updateValues(selectedValue, date2, mergedActivePickerIndex);
if (type2 === "submit" || type2 !== "key" && !needConfirmButton) {
triggerChange(values, mergedActivePickerIndex);
if (mergedActivePickerIndex === 0) {
onStartLeave();
} else {
onEndLeave();
}
} else {
setSelectedValue(values);
}
};
return /* @__PURE__ */ jsx(PanelContext.Provider, {
value: {
operationRef,
hideHeader: picker === "time",
onDateMouseEnter,
onDateMouseLeave,
hideRanges: true,
onSelect: onContextSelect,
open: mergedOpen
},
children: /* @__PURE__ */ jsx(PickerTrigger, {
visible: mergedOpen,
popupElement: rangePanel,
popupStyle,
prefixCls,
dropdownClassName,
dropdownAlign,
getPopupContainer,
transitionName: transitionName2,
range: true,
direction,
children: /* @__PURE__ */ jsxs("div", {
ref: containerRef,
className: classnames(prefixCls, "".concat(prefixCls, "-range"), className, (_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-disabled"), mergedDisabled[0] && mergedDisabled[1]), _defineProperty$b(_classNames2, "".concat(prefixCls, "-focused"), mergedActivePickerIndex === 0 ? startFocused : endFocused), _defineProperty$b(_classNames2, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames2)),
style: style2,
onClick: onPickerClick,
onMouseEnter,
onMouseLeave,
onMouseDown: onPickerMouseDown,
onMouseUp,
...getDataOrAriaProps(props),
children: [/* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-input"), (_classNames3 = {}, _defineProperty$b(_classNames3, "".concat(prefixCls, "-input-active"), mergedActivePickerIndex === 0), _defineProperty$b(_classNames3, "".concat(prefixCls, "-input-placeholder"), !!startHoverValue), _classNames3)),
ref: startInputDivRef,
children: /* @__PURE__ */ jsx("input", {
id: id2,
disabled: mergedDisabled[0],
readOnly: inputReadOnly || typeof formatList[0] === "function" || !startTyping,
value: startHoverValue || startText,
onChange: function onChange2(e2) {
triggerStartTextChange(e2.target.value);
},
autoFocus,
placeholder: getValue$3(placeholder, 0) || "",
ref: startInputRef,
...startInputProps,
...inputSharedProps,
autoComplete
})
}), /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-range-separator"),
ref: separatorRef,
children: separator
}), /* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-input"), (_classNames4 = {}, _defineProperty$b(_classNames4, "".concat(prefixCls, "-input-active"), mergedActivePickerIndex === 1), _defineProperty$b(_classNames4, "".concat(prefixCls, "-input-placeholder"), !!endHoverValue), _classNames4)),
ref: endInputDivRef,
children: /* @__PURE__ */ jsx("input", {
disabled: mergedDisabled[1],
readOnly: inputReadOnly || typeof formatList[0] === "function" || !endTyping,
value: endHoverValue || endText,
onChange: function onChange2(e2) {
triggerEndTextChange(e2.target.value);
},
placeholder: getValue$3(placeholder, 1) || "",
ref: endInputRef,
...endInputProps,
...inputSharedProps,
autoComplete
})
}), /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-active-bar"),
style: _objectSpread2$a(_objectSpread2$a({}, activeBarPositionStyle), {}, {
width: activeBarWidth,
position: "absolute"
})
}), suffixNode, clearNode]
})
})
});
}
var RangePicker$2 = /* @__PURE__ */ function(_React$Component) {
_inherits(RangePicker2, _React$Component);
var _super = _createSuper(RangePicker2);
function RangePicker2() {
var _this2;
_classCallCheck(this, RangePicker2);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this2 = _super.call.apply(_super, [this].concat(args));
_this2.pickerRef = /* @__PURE__ */ React__namespace.createRef();
_this2.focus = function() {
if (_this2.pickerRef.current) {
_this2.pickerRef.current.focus();
}
};
_this2.blur = function() {
if (_this2.pickerRef.current) {
_this2.pickerRef.current.blur();
}
};
return _this2;
}
_createClass(RangePicker2, [{
key: "render",
value: function render2() {
return /* @__PURE__ */ jsx(InnerRangePicker, {
...this.props,
pickerRef: this.pickerRef
});
}
}]);
return RangePicker2;
}(React__namespace.Component);
var RadioGroupContext = /* @__PURE__ */ React__namespace.createContext(null);
var RadioGroupContextProvider = RadioGroupContext.Provider;
var RadioOptionTypeContext = /* @__PURE__ */ React__namespace.createContext(null);
var RadioOptionTypeContextProvider = RadioOptionTypeContext.Provider;
var Checkbox$3 = /* @__PURE__ */ function(_Component) {
_inherits(Checkbox2, _Component);
var _super = _createSuper(Checkbox2);
function Checkbox2(props) {
var _this2;
_classCallCheck(this, Checkbox2);
_this2 = _super.call(this, props);
_this2.handleChange = function(e2) {
var _this$props = _this2.props, disabled = _this$props.disabled, onChange = _this$props.onChange;
if (disabled) {
return;
}
if (!("checked" in _this2.props)) {
_this2.setState({
checked: e2.target.checked
});
}
if (onChange) {
onChange({
target: _objectSpread2$a(_objectSpread2$a({}, _this2.props), {}, {
checked: e2.target.checked
}),
stopPropagation: function stopPropagation() {
e2.stopPropagation();
},
preventDefault: function preventDefault() {
e2.preventDefault();
},
nativeEvent: e2.nativeEvent
});
}
};
_this2.saveInput = function(node) {
_this2.input = node;
};
var checked = "checked" in props ? props.checked : props.defaultChecked;
_this2.state = {
checked
};
return _this2;
}
_createClass(Checkbox2, [{
key: "focus",
value: function focus() {
this.input.focus();
}
}, {
key: "blur",
value: function blur() {
this.input.blur();
}
}, {
key: "render",
value: function render2() {
var _classNames;
var _this$props2 = this.props, prefixCls = _this$props2.prefixCls, className = _this$props2.className, style2 = _this$props2.style, name2 = _this$props2.name, id2 = _this$props2.id, type2 = _this$props2.type, disabled = _this$props2.disabled, readOnly = _this$props2.readOnly, tabIndex = _this$props2.tabIndex, onClick = _this$props2.onClick, onFocus = _this$props2.onFocus, onBlur = _this$props2.onBlur, onKeyDown2 = _this$props2.onKeyDown, onKeyPress = _this$props2.onKeyPress, onKeyUp = _this$props2.onKeyUp, autoFocus = _this$props2.autoFocus, value = _this$props2.value, required2 = _this$props2.required, others = _objectWithoutProperties$1(_this$props2, ["prefixCls", "className", "style", "name", "id", "type", "disabled", "readOnly", "tabIndex", "onClick", "onFocus", "onBlur", "onKeyDown", "onKeyPress", "onKeyUp", "autoFocus", "value", "required"]);
var globalProps = Object.keys(others).reduce(function(prev, key2) {
if (key2.substr(0, 5) === "aria-" || key2.substr(0, 5) === "data-" || key2 === "role") {
prev[key2] = others[key2];
}
return prev;
}, {});
var checked = this.state.checked;
var classString = classnames(prefixCls, className, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-checked"), checked), _defineProperty$b(_classNames, "".concat(prefixCls, "-disabled"), disabled), _classNames));
return /* @__PURE__ */ jsxs("span", {
className: classString,
style: style2,
children: [/* @__PURE__ */ jsx("input", {
name: name2,
id: id2,
type: type2,
required: required2,
readOnly,
disabled,
tabIndex,
className: "".concat(prefixCls, "-input"),
checked: !!checked,
onClick,
onFocus,
onBlur,
onKeyUp,
onKeyDown: onKeyDown2,
onKeyPress,
onChange: this.handleChange,
autoFocus,
ref: this.saveInput,
value,
...globalProps
}), /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-inner")
})]
});
}
}], [{
key: "getDerivedStateFromProps",
value: function getDerivedStateFromProps(props, state) {
if ("checked" in props) {
return _objectSpread2$a(_objectSpread2$a({}, state), {}, {
checked: props.checked
});
}
return null;
}
}]);
return Checkbox2;
}(React$a.Component);
Checkbox$3.defaultProps = {
prefixCls: "rc-checkbox",
className: "",
style: {},
type: "checkbox",
defaultChecked: false,
onFocus: function onFocus() {
},
onBlur: function onBlur() {
},
onChange: function onChange() {
},
onKeyDown: function onKeyDown2() {
},
onKeyPress: function onKeyPress() {
},
onKeyUp: function onKeyUp() {
}
};
var __rest$E = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var InternalRadio = function InternalRadio2(props, ref) {
var _classNames;
var groupContext = React__namespace.useContext(RadioGroupContext);
var radioOptionTypeContext = React__namespace.useContext(RadioOptionTypeContext);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var innerRef = React__namespace.useRef();
var mergedRef = composeRef(ref, innerRef);
var _useContext = React$a.useContext(FormItemInputContext), isFormItemInput = _useContext.isFormItemInput;
var onChange = function onChange2(e2) {
var _a, _b;
(_a = props.onChange) === null || _a === void 0 ? void 0 : _a.call(props, e2);
(_b = groupContext === null || groupContext === void 0 ? void 0 : groupContext.onChange) === null || _b === void 0 ? void 0 : _b.call(groupContext, e2);
};
var customizePrefixCls = props.prefixCls, className = props.className, children = props.children, style2 = props.style, customDisabled = props.disabled, restProps = __rest$E(props, ["prefixCls", "className", "children", "style", "disabled"]);
var radioPrefixCls = getPrefixCls("radio", customizePrefixCls);
var prefixCls = ((groupContext === null || groupContext === void 0 ? void 0 : groupContext.optionType) || radioOptionTypeContext) === "button" ? "".concat(radioPrefixCls, "-button") : radioPrefixCls;
var radioProps = _extends$3({}, restProps);
var disabled = React__namespace.useContext(DisabledContext$1);
radioProps.disabled = customDisabled || disabled;
if (groupContext) {
radioProps.name = groupContext.name;
radioProps.onChange = onChange;
radioProps.checked = props.value === groupContext.value;
radioProps.disabled = radioProps.disabled || groupContext.disabled;
}
var wrapperClassString = classnames("".concat(prefixCls, "-wrapper"), (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-wrapper-checked"), radioProps.checked), _defineProperty$b(_classNames, "".concat(prefixCls, "-wrapper-disabled"), radioProps.disabled), _defineProperty$b(_classNames, "".concat(prefixCls, "-wrapper-rtl"), direction === "rtl"), _defineProperty$b(_classNames, "".concat(prefixCls, "-wrapper-in-form-item"), isFormItemInput), _classNames), className);
return /* @__PURE__ */ jsxs("label", {
className: wrapperClassString,
style: style2,
onMouseEnter: props.onMouseEnter,
onMouseLeave: props.onMouseLeave,
children: [/* @__PURE__ */ jsx(Checkbox$3, {
...radioProps,
type: "radio",
prefixCls,
ref: mergedRef
}), children !== void 0 ? /* @__PURE__ */ jsx("span", {
children
}) : null]
});
};
var Radio$2 = /* @__PURE__ */ React__namespace.forwardRef(InternalRadio);
const InternalRadio$1 = Radio$2;
var RadioGroup = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _classNames;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var size = React__namespace.useContext(SizeContext$1);
var _useMergedState = useMergedState(props.defaultValue, {
value: props.value
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), value = _useMergedState2[0], setValue2 = _useMergedState2[1];
var onRadioChange = function onRadioChange2(ev) {
var lastValue = value;
var val = ev.target.value;
if (!("value" in props)) {
setValue2(val);
}
var onChange = props.onChange;
if (onChange && val !== lastValue) {
onChange(ev);
}
};
var customizePrefixCls = props.prefixCls, _props$className = props.className, className = _props$className === void 0 ? "" : _props$className, options = props.options, _props$buttonStyle = props.buttonStyle, buttonStyle = _props$buttonStyle === void 0 ? "outline" : _props$buttonStyle, disabled = props.disabled, children = props.children, customizeSize = props.size, style2 = props.style, id2 = props.id, onMouseEnter = props.onMouseEnter, onMouseLeave = props.onMouseLeave, onFocus = props.onFocus, onBlur = props.onBlur;
var prefixCls = getPrefixCls("radio", customizePrefixCls);
var groupPrefixCls = "".concat(prefixCls, "-group");
var childrenToRender = children;
if (options && options.length > 0) {
childrenToRender = options.map(function(option) {
if (typeof option === "string" || typeof option === "number") {
return /* @__PURE__ */ jsx(InternalRadio$1, {
prefixCls,
disabled,
value: option,
checked: value === option,
children: option
}, option.toString());
}
return /* @__PURE__ */ jsx(InternalRadio$1, {
prefixCls,
disabled: option.disabled || disabled,
value: option.value,
checked: value === option.value,
style: option.style,
children: option.label
}, "radio-group-value-options-".concat(option.value));
});
}
var mergedSize = customizeSize || size;
var classString = classnames(groupPrefixCls, "".concat(groupPrefixCls, "-").concat(buttonStyle), (_classNames = {}, _defineProperty$b(_classNames, "".concat(groupPrefixCls, "-").concat(mergedSize), mergedSize), _defineProperty$b(_classNames, "".concat(groupPrefixCls, "-rtl"), direction === "rtl"), _classNames), className);
return /* @__PURE__ */ jsx("div", {
...getDataOrAriaProps$1(props),
className: classString,
style: style2,
onMouseEnter,
onMouseLeave,
onFocus,
onBlur,
id: id2,
ref,
children: /* @__PURE__ */ jsx(RadioGroupContextProvider, {
value: {
onChange: onRadioChange,
value,
disabled: props.disabled,
name: props.name,
optionType: props.optionType
},
children: childrenToRender
})
});
});
const Group$4 = /* @__PURE__ */ React__namespace.memo(RadioGroup);
var __rest$D = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var RadioButton = function RadioButton2(props, ref) {
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var customizePrefixCls = props.prefixCls, radioProps = __rest$D(props, ["prefixCls"]);
var prefixCls = getPrefixCls("radio", customizePrefixCls);
return /* @__PURE__ */ jsx(RadioOptionTypeContextProvider, {
value: "button",
children: /* @__PURE__ */ jsx(InternalRadio$1, {
prefixCls,
...radioProps,
type: "radio",
ref
})
});
};
const Button = /* @__PURE__ */ React__namespace.forwardRef(RadioButton);
var Radio$1 = InternalRadio$1;
Radio$1.Button = Button;
Radio$1.Group = Group$4;
Radio$1.__ANT_RADIO = true;
const _Radio = Radio$1;
var Element$1 = function Element2(props) {
var _classNames, _classNames2;
var prefixCls = props.prefixCls, className = props.className, style2 = props.style, size = props.size, shape = props.shape;
var sizeCls = classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-lg"), size === "large"), _defineProperty$b(_classNames, "".concat(prefixCls, "-sm"), size === "small"), _classNames));
var shapeCls = classnames((_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-circle"), shape === "circle"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-square"), shape === "square"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-round"), shape === "round"), _classNames2));
var sizeStyle = React__namespace.useMemo(function() {
return typeof size === "number" ? {
width: size,
height: size,
lineHeight: "".concat(size, "px")
} : {};
}, [size]);
return /* @__PURE__ */ jsx("span", {
className: classnames(prefixCls, sizeCls, shapeCls, className),
style: _extends$3(_extends$3({}, sizeStyle), style2)
});
};
const Element$2 = Element$1;
var SkeletonAvatar = function SkeletonAvatar2(props) {
var customizePrefixCls = props.prefixCls, className = props.className, active = props.active, _props$shape = props.shape, shape = _props$shape === void 0 ? "circle" : _props$shape, _props$size = props.size, size = _props$size === void 0 ? "default" : _props$size;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var prefixCls = getPrefixCls("skeleton", customizePrefixCls);
var otherProps = omit(props, ["prefixCls", "className"]);
var cls = classnames(prefixCls, "".concat(prefixCls, "-element"), _defineProperty$b({}, "".concat(prefixCls, "-active"), active), className);
return /* @__PURE__ */ jsx("div", {
className: cls,
children: /* @__PURE__ */ jsx(Element$2, {
prefixCls: "".concat(prefixCls, "-avatar"),
shape,
size,
...otherProps
})
});
};
const SkeletonAvatar$1 = SkeletonAvatar;
var SkeletonButton = function SkeletonButton2(props) {
var _classNames;
var customizePrefixCls = props.prefixCls, className = props.className, active = props.active, _props$block = props.block, block = _props$block === void 0 ? false : _props$block, _props$size = props.size, size = _props$size === void 0 ? "default" : _props$size;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var prefixCls = getPrefixCls("skeleton", customizePrefixCls);
var otherProps = omit(props, ["prefixCls"]);
var cls = classnames(prefixCls, "".concat(prefixCls, "-element"), (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-active"), active), _defineProperty$b(_classNames, "".concat(prefixCls, "-block"), block), _classNames), className);
return /* @__PURE__ */ jsx("div", {
className: cls,
children: /* @__PURE__ */ jsx(Element$2, {
prefixCls: "".concat(prefixCls, "-button"),
size,
...otherProps
})
});
};
const SkeletonButton$1 = SkeletonButton;
var DotChartOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M888 792H200V168c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v688c0 4.4 3.6 8 8 8h752c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM288 604a64 64 0 10128 0 64 64 0 10-128 0zm118-224a48 48 0 1096 0 48 48 0 10-96 0zm158 228a96 96 0 10192 0 96 96 0 10-192 0zm148-314a56 56 0 10112 0 56 56 0 10-112 0z" } }] }, "name": "dot-chart", "theme": "outlined" };
const DotChartOutlinedSvg = DotChartOutlined$2;
var DotChartOutlined = function DotChartOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: DotChartOutlinedSvg
})
});
};
DotChartOutlined.displayName = "DotChartOutlined";
const DotChartOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(DotChartOutlined);
var SkeletonNode = function SkeletonNode2(props) {
var customizePrefixCls = props.prefixCls, className = props.className, style2 = props.style, active = props.active, children = props.children;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var prefixCls = getPrefixCls("skeleton", customizePrefixCls);
var cls = classnames(prefixCls, "".concat(prefixCls, "-element"), _defineProperty$b({}, "".concat(prefixCls, "-active"), active), className);
var content = children !== null && children !== void 0 ? children : /* @__PURE__ */ jsx(DotChartOutlined$1, {});
return /* @__PURE__ */ jsx("div", {
className: cls,
children: /* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-image"), className),
style: style2,
children: content
})
});
};
const SkeletonNode$1 = SkeletonNode;
var path = "M365.714286 329.142857q0 45.714286-32.036571 77.677714t-77.677714 32.036571-77.677714-32.036571-32.036571-77.677714 32.036571-77.677714 77.677714-32.036571 77.677714 32.036571 32.036571 77.677714zM950.857143 548.571429l0 256-804.571429 0 0-109.714286 182.857143-182.857143 91.428571 91.428571 292.571429-292.571429zM1005.714286 146.285714l-914.285714 0q-7.460571 0-12.873143 5.412571t-5.412571 12.873143l0 694.857143q0 7.460571 5.412571 12.873143t12.873143 5.412571l914.285714 0q7.460571 0 12.873143-5.412571t5.412571-12.873143l0-694.857143q0-7.460571-5.412571-12.873143t-12.873143-5.412571zM1097.142857 164.571429l0 694.857143q0 37.741714-26.843429 64.585143t-64.585143 26.843429l-914.285714 0q-37.741714 0-64.585143-26.843429t-26.843429-64.585143l0-694.857143q0-37.741714 26.843429-64.585143t64.585143-26.843429l914.285714 0q37.741714 0 64.585143 26.843429t26.843429 64.585143z";
var SkeletonImage = function SkeletonImage2(props) {
var customizePrefixCls = props.prefixCls, className = props.className, style2 = props.style, active = props.active;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var prefixCls = getPrefixCls("skeleton", customizePrefixCls);
var cls = classnames(prefixCls, "".concat(prefixCls, "-element"), _defineProperty$b({}, "".concat(prefixCls, "-active"), active), className);
return /* @__PURE__ */ jsx("div", {
className: cls,
children: /* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-image"), className),
style: style2,
children: /* @__PURE__ */ jsx("svg", {
viewBox: "0 0 1098 1024",
xmlns: "http://www.w3.org/2000/svg",
className: "".concat(prefixCls, "-image-svg"),
children: /* @__PURE__ */ jsx("path", {
d: path,
className: "".concat(prefixCls, "-image-path")
})
})
})
});
};
const SkeletonImage$1 = SkeletonImage;
var SkeletonInput = function SkeletonInput2(props) {
var _classNames;
var customizePrefixCls = props.prefixCls, className = props.className, active = props.active, block = props.block, _props$size = props.size, size = _props$size === void 0 ? "default" : _props$size;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var prefixCls = getPrefixCls("skeleton", customizePrefixCls);
var otherProps = omit(props, ["prefixCls"]);
var cls = classnames(prefixCls, "".concat(prefixCls, "-element"), (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-active"), active), _defineProperty$b(_classNames, "".concat(prefixCls, "-block"), block), _classNames), className);
return /* @__PURE__ */ jsx("div", {
className: cls,
children: /* @__PURE__ */ jsx(Element$2, {
prefixCls: "".concat(prefixCls, "-input"),
size,
...otherProps
})
});
};
const SkeletonInput$1 = SkeletonInput;
var Paragraph = function Paragraph2(props) {
var getWidth = function getWidth2(index2) {
var width = props.width, _props$rows = props.rows, rows2 = _props$rows === void 0 ? 2 : _props$rows;
if (Array.isArray(width)) {
return width[index2];
}
if (rows2 - 1 === index2) {
return width;
}
return void 0;
};
var prefixCls = props.prefixCls, className = props.className, style2 = props.style, rows = props.rows;
var rowList = _toConsumableArray$c(Array(rows)).map(function(_, index2) {
return /* @__PURE__ */ jsx("li", {
style: {
width: getWidth(index2)
}
}, index2);
});
return /* @__PURE__ */ jsx("ul", {
className: classnames(prefixCls, className),
style: style2,
children: rowList
});
};
const Paragraph$1 = Paragraph;
var Title = function Title2(_ref) {
var prefixCls = _ref.prefixCls, className = _ref.className, width = _ref.width, style2 = _ref.style;
return /* @__PURE__ */ jsx("h3", {
className: classnames(prefixCls, className),
style: _extends$3({
width
}, style2)
});
};
const Title$1 = Title;
function getComponentProps(prop) {
if (prop && _typeof$q(prop) === "object") {
return prop;
}
return {};
}
function getAvatarBasicProps(hasTitle, hasParagraph) {
if (hasTitle && !hasParagraph) {
return {
size: "large",
shape: "square"
};
}
return {
size: "large",
shape: "circle"
};
}
function getTitleBasicProps(hasAvatar, hasParagraph) {
if (!hasAvatar && hasParagraph) {
return {
width: "38%"
};
}
if (hasAvatar && hasParagraph) {
return {
width: "50%"
};
}
return {};
}
function getParagraphBasicProps(hasAvatar, hasTitle) {
var basicProps = {};
if (!hasAvatar || !hasTitle) {
basicProps.width = "61%";
}
if (!hasAvatar && hasTitle) {
basicProps.rows = 3;
} else {
basicProps.rows = 2;
}
return basicProps;
}
var Skeleton = function Skeleton2(props) {
var customizePrefixCls = props.prefixCls, loading = props.loading, className = props.className, style2 = props.style, children = props.children, _props$avatar = props.avatar, avatar = _props$avatar === void 0 ? false : _props$avatar, _props$title = props.title, title = _props$title === void 0 ? true : _props$title, _props$paragraph = props.paragraph, paragraph = _props$paragraph === void 0 ? true : _props$paragraph, active = props.active, round = props.round;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var prefixCls = getPrefixCls("skeleton", customizePrefixCls);
if (loading || !("loading" in props)) {
var _classNames;
var hasAvatar = !!avatar;
var hasTitle = !!title;
var hasParagraph = !!paragraph;
var avatarNode;
if (hasAvatar) {
var avatarProps = _extends$3(_extends$3({
prefixCls: "".concat(prefixCls, "-avatar")
}, getAvatarBasicProps(hasTitle, hasParagraph)), getComponentProps(avatar));
avatarNode = /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-header"),
children: /* @__PURE__ */ jsx(Element$2, {
...avatarProps
})
});
}
var contentNode;
if (hasTitle || hasParagraph) {
var $title;
if (hasTitle) {
var titleProps = _extends$3(_extends$3({
prefixCls: "".concat(prefixCls, "-title")
}, getTitleBasicProps(hasAvatar, hasParagraph)), getComponentProps(title));
$title = /* @__PURE__ */ jsx(Title$1, {
...titleProps
});
}
var paragraphNode;
if (hasParagraph) {
var paragraphProps = _extends$3(_extends$3({
prefixCls: "".concat(prefixCls, "-paragraph")
}, getParagraphBasicProps(hasAvatar, hasTitle)), getComponentProps(paragraph));
paragraphNode = /* @__PURE__ */ jsx(Paragraph$1, {
...paragraphProps
});
}
contentNode = /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-content"),
children: [$title, paragraphNode]
});
}
var cls = classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-with-avatar"), hasAvatar), _defineProperty$b(_classNames, "".concat(prefixCls, "-active"), active), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _defineProperty$b(_classNames, "".concat(prefixCls, "-round"), round), _classNames), className);
return /* @__PURE__ */ jsxs("div", {
className: cls,
style: style2,
children: [avatarNode, contentNode]
});
}
return typeof children !== "undefined" ? children : null;
};
Skeleton.Button = SkeletonButton$1;
Skeleton.Avatar = SkeletonAvatar$1;
Skeleton.Input = SkeletonInput$1;
Skeleton.Image = SkeletonImage$1;
Skeleton.Node = SkeletonNode$1;
const Skeleton$1 = Skeleton;
var PlusOutlined$5 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "defs", "attrs": {}, "children": [{ "tag": "style", "attrs": {} }] }, { "tag": "path", "attrs": { "d": "M482 152h60q8 0 8 8v704q0 8-8 8h-60q-8 0-8-8V160q0-8 8-8z" } }, { "tag": "path", "attrs": { "d": "M176 474h672q8 0 8 8v60q0 8-8 8H176q-8 0-8-8v-60q0-8 8-8z" } }] }, "name": "plus", "theme": "outlined" };
const PlusOutlinedSvg = PlusOutlined$5;
var PlusOutlined$3 = function PlusOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: PlusOutlinedSvg
})
});
};
PlusOutlined$3.displayName = "PlusOutlined";
const PlusOutlined$4 = /* @__PURE__ */ React__namespace.forwardRef(PlusOutlined$3);
const TabContext = /* @__PURE__ */ React$a.createContext(null);
var TabPane$3 = /* @__PURE__ */ React__namespace.forwardRef(function(_ref, ref) {
var prefixCls = _ref.prefixCls, className = _ref.className, style2 = _ref.style, id2 = _ref.id, active = _ref.active, tabKey = _ref.tabKey, children = _ref.children;
return /* @__PURE__ */ jsx("div", {
id: id2 && "".concat(id2, "-panel-").concat(tabKey),
role: "tabpanel",
tabIndex: active ? 0 : -1,
"aria-labelledby": id2 && "".concat(id2, "-tab-").concat(tabKey),
"aria-hidden": !active,
style: style2,
className: classnames(prefixCls, active && "".concat(prefixCls, "-active"), className),
ref,
children
});
});
var _excluded$q = ["key", "forceRender", "style", "className"];
function TabPanelList(_ref) {
var id2 = _ref.id, activeKey = _ref.activeKey, animated = _ref.animated, tabPosition = _ref.tabPosition, destroyInactiveTabPane = _ref.destroyInactiveTabPane;
var _React$useContext = React__namespace.useContext(TabContext), prefixCls = _React$useContext.prefixCls, tabs = _React$useContext.tabs;
var tabPaneAnimated = animated.tabPane;
var tabPanePrefixCls = "".concat(prefixCls, "-tabpane");
return /* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-content-holder")),
children: /* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-content"), "".concat(prefixCls, "-content-").concat(tabPosition), _defineProperty$b({}, "".concat(prefixCls, "-content-animated"), tabPaneAnimated)),
children: tabs.map(function(_ref2) {
var key2 = _ref2.key, forceRender = _ref2.forceRender, paneStyle = _ref2.style, paneClassName = _ref2.className, restTabProps = _objectWithoutProperties$1(_ref2, _excluded$q);
var active = key2 === activeKey;
return /* @__PURE__ */ jsx(CSSMotion, {
visible: active,
forceRender,
removeOnLeave: !!destroyInactiveTabPane,
leavedClassName: "".concat(tabPanePrefixCls, "-hidden"),
...animated.tabPaneMotion,
children: function(_ref3, ref) {
var motionStyle = _ref3.style, motionClassName = _ref3.className;
return /* @__PURE__ */ jsx(TabPane$3, {
...restTabProps,
prefixCls: tabPanePrefixCls,
id: id2,
tabKey: key2,
animated: tabPaneAnimated,
active,
style: _objectSpread2$a(_objectSpread2$a({}, paneStyle), motionStyle),
className: classnames(paneClassName, motionClassName),
ref
});
}
}, key2);
})
})
});
}
var DEFAULT_SIZE$1 = {
width: 0,
height: 0,
left: 0,
top: 0
};
function useOffsets(tabs, tabSizes, holderScrollWidth) {
return React$a.useMemo(function() {
var _tabs$;
var map = /* @__PURE__ */ new Map();
var lastOffset = tabSizes.get((_tabs$ = tabs[0]) === null || _tabs$ === void 0 ? void 0 : _tabs$.key) || DEFAULT_SIZE$1;
var rightOffset = lastOffset.left + lastOffset.width;
for (var i2 = 0; i2 < tabs.length; i2 += 1) {
var key2 = tabs[i2].key;
var data = tabSizes.get(key2);
if (!data) {
var _tabs;
data = tabSizes.get((_tabs = tabs[i2 - 1]) === null || _tabs === void 0 ? void 0 : _tabs.key) || DEFAULT_SIZE$1;
}
var entity = map.get(key2) || _objectSpread2$a({}, data);
entity.right = rightOffset - entity.left - entity.width;
map.set(key2, entity);
}
return map;
}, [tabs.map(function(tab) {
return tab.key;
}).join("_"), tabSizes, holderScrollWidth]);
}
function useSyncState$1(defaultState, onChange) {
var stateRef = React__namespace.useRef(defaultState);
var _React$useState = React__namespace.useState({}), _React$useState2 = _slicedToArray$e(_React$useState, 2), forceUpdate = _React$useState2[1];
function setState(updater) {
var newValue = typeof updater === "function" ? updater(stateRef.current) : updater;
if (newValue !== stateRef.current) {
onChange(newValue, stateRef.current);
}
stateRef.current = newValue;
forceUpdate({});
}
return [stateRef.current, setState];
}
var MIN_SWIPE_DISTANCE = 0.1;
var STOP_SWIPE_DISTANCE = 0.01;
var REFRESH_INTERVAL = 20;
var SPEED_OFF_MULTIPLE = Math.pow(0.995, REFRESH_INTERVAL);
function useTouchMove(ref, onOffset) {
var _useState = React$a.useState(), _useState2 = _slicedToArray$e(_useState, 2), touchPosition = _useState2[0], setTouchPosition = _useState2[1];
var _useState3 = React$a.useState(0), _useState4 = _slicedToArray$e(_useState3, 2), lastTimestamp = _useState4[0], setLastTimestamp = _useState4[1];
var _useState5 = React$a.useState(0), _useState6 = _slicedToArray$e(_useState5, 2), lastTimeDiff = _useState6[0], setLastTimeDiff = _useState6[1];
var _useState7 = React$a.useState(), _useState8 = _slicedToArray$e(_useState7, 2), lastOffset = _useState8[0], setLastOffset = _useState8[1];
var motionRef = React$a.useRef();
function onTouchStart(e2) {
var _e$touches$ = e2.touches[0], screenX = _e$touches$.screenX, screenY = _e$touches$.screenY;
setTouchPosition({
x: screenX,
y: screenY
});
window.clearInterval(motionRef.current);
}
function onTouchMove(e2) {
if (!touchPosition)
return;
e2.preventDefault();
var _e$touches$2 = e2.touches[0], screenX = _e$touches$2.screenX, screenY = _e$touches$2.screenY;
setTouchPosition({
x: screenX,
y: screenY
});
var offsetX = screenX - touchPosition.x;
var offsetY = screenY - touchPosition.y;
onOffset(offsetX, offsetY);
var now2 = Date.now();
setLastTimestamp(now2);
setLastTimeDiff(now2 - lastTimestamp);
setLastOffset({
x: offsetX,
y: offsetY
});
}
function onTouchEnd() {
if (!touchPosition)
return;
setTouchPosition(null);
setLastOffset(null);
if (lastOffset) {
var distanceX = lastOffset.x / lastTimeDiff;
var distanceY = lastOffset.y / lastTimeDiff;
var absX = Math.abs(distanceX);
var absY = Math.abs(distanceY);
if (Math.max(absX, absY) < MIN_SWIPE_DISTANCE)
return;
var currentX = distanceX;
var currentY = distanceY;
motionRef.current = window.setInterval(function() {
if (Math.abs(currentX) < STOP_SWIPE_DISTANCE && Math.abs(currentY) < STOP_SWIPE_DISTANCE) {
window.clearInterval(motionRef.current);
return;
}
currentX *= SPEED_OFF_MULTIPLE;
currentY *= SPEED_OFF_MULTIPLE;
onOffset(currentX * REFRESH_INTERVAL, currentY * REFRESH_INTERVAL);
}, REFRESH_INTERVAL);
}
}
var lastWheelDirectionRef = React$a.useRef();
function onWheel(e2) {
var deltaX = e2.deltaX, deltaY = e2.deltaY;
var mixed = 0;
var absX = Math.abs(deltaX);
var absY = Math.abs(deltaY);
if (absX === absY) {
mixed = lastWheelDirectionRef.current === "x" ? deltaX : deltaY;
} else if (absX > absY) {
mixed = deltaX;
lastWheelDirectionRef.current = "x";
} else {
mixed = deltaY;
lastWheelDirectionRef.current = "y";
}
if (onOffset(-mixed, -mixed)) {
e2.preventDefault();
}
}
var touchEventsRef = React$a.useRef(null);
touchEventsRef.current = {
onTouchStart,
onTouchMove,
onTouchEnd,
onWheel
};
React__namespace.useEffect(function() {
function onProxyTouchStart(e2) {
touchEventsRef.current.onTouchStart(e2);
}
function onProxyTouchMove(e2) {
touchEventsRef.current.onTouchMove(e2);
}
function onProxyTouchEnd(e2) {
touchEventsRef.current.onTouchEnd(e2);
}
function onProxyWheel(e2) {
touchEventsRef.current.onWheel(e2);
}
document.addEventListener("touchmove", onProxyTouchMove, {
passive: false
});
document.addEventListener("touchend", onProxyTouchEnd, {
passive: false
});
ref.current.addEventListener("touchstart", onProxyTouchStart, {
passive: false
});
ref.current.addEventListener("wheel", onProxyWheel);
return function() {
document.removeEventListener("touchmove", onProxyTouchMove);
document.removeEventListener("touchend", onProxyTouchEnd);
};
}, []);
}
function useUpdate(callback) {
var _useState = React$a.useState(0), _useState2 = _slicedToArray$e(_useState, 2), count = _useState2[0], setCount = _useState2[1];
var effectRef = React$a.useRef(0);
var callbackRef = React$a.useRef();
callbackRef.current = callback;
useLayoutUpdateEffect(function() {
var _callbackRef$current;
(_callbackRef$current = callbackRef.current) === null || _callbackRef$current === void 0 ? void 0 : _callbackRef$current.call(callbackRef);
}, [count]);
return function() {
if (effectRef.current !== count) {
return;
}
effectRef.current += 1;
setCount(effectRef.current);
};
}
function useUpdateState(defaultState) {
var batchRef = React$a.useRef([]);
var _useState3 = React$a.useState({}), _useState4 = _slicedToArray$e(_useState3, 2), forceUpdate = _useState4[1];
var state = React$a.useRef(typeof defaultState === "function" ? defaultState() : defaultState);
var flushUpdate = useUpdate(function() {
var current = state.current;
batchRef.current.forEach(function(callback) {
current = callback(current);
});
batchRef.current = [];
state.current = current;
forceUpdate({});
});
function updater(callback) {
batchRef.current.push(callback);
flushUpdate();
}
return [state.current, updater];
}
var DEFAULT_SIZE = {
width: 0,
height: 0,
left: 0,
top: 0,
right: 0
};
function useVisibleRange(tabOffsets, visibleTabContentValue, transform, tabContentSizeValue, addNodeSizeValue, operationNodeSizeValue, _ref) {
var tabs = _ref.tabs, tabPosition = _ref.tabPosition, rtl2 = _ref.rtl;
var charUnit;
var position;
var transformSize;
if (["top", "bottom"].includes(tabPosition)) {
charUnit = "width";
position = rtl2 ? "right" : "left";
transformSize = Math.abs(transform);
} else {
charUnit = "height";
position = "top";
transformSize = -transform;
}
return React$a.useMemo(function() {
if (!tabs.length) {
return [0, 0];
}
var len = tabs.length;
var endIndex = len;
for (var i2 = 0; i2 < len; i2 += 1) {
var offset2 = tabOffsets.get(tabs[i2].key) || DEFAULT_SIZE;
if (offset2[position] + offset2[charUnit] > transformSize + visibleTabContentValue) {
endIndex = i2 - 1;
break;
}
}
var startIndex = 0;
for (var _i = len - 1; _i >= 0; _i -= 1) {
var _offset = tabOffsets.get(tabs[_i].key) || DEFAULT_SIZE;
if (_offset[position] < transformSize) {
startIndex = _i + 1;
break;
}
}
return [startIndex, endIndex];
}, [tabOffsets, visibleTabContentValue, tabContentSizeValue, addNodeSizeValue, operationNodeSizeValue, transformSize, tabPosition, tabs.map(function(tab) {
return tab.key;
}).join("_"), rtl2]);
}
function stringify(obj) {
var tgt;
if (obj instanceof Map) {
tgt = {};
obj.forEach(function(v2, k2) {
tgt[k2] = v2;
});
} else {
tgt = obj;
}
return JSON.stringify(tgt);
}
var RC_TABS_DOUBLE_QUOTE = "TABS_DQ";
function genDataNodeKey(key2) {
return String(key2).replace(/"/g, RC_TABS_DOUBLE_QUOTE);
}
function AddButton(_ref, ref) {
var prefixCls = _ref.prefixCls, editable = _ref.editable, locale2 = _ref.locale, style2 = _ref.style;
if (!editable || editable.showAdd === false) {
return null;
}
return /* @__PURE__ */ jsx("button", {
ref,
type: "button",
className: "".concat(prefixCls, "-nav-add"),
style: style2,
"aria-label": (locale2 === null || locale2 === void 0 ? void 0 : locale2.addAriaLabel) || "Add tab",
onClick: function onClick(event) {
editable.onEdit("add", {
event
});
},
children: editable.addIcon || "+"
});
}
const AddButton$1 = /* @__PURE__ */ React__namespace.forwardRef(AddButton);
var ExtraContent = /* @__PURE__ */ React__namespace.forwardRef(function(_ref, ref) {
var position = _ref.position, prefixCls = _ref.prefixCls, extra = _ref.extra;
if (!extra)
return null;
var content;
var assertExtra = {};
if (_typeof$q(extra) === "object" && !/* @__PURE__ */ React__namespace.isValidElement(extra)) {
assertExtra = extra;
} else {
assertExtra.right = extra;
}
if (position === "right") {
content = assertExtra.right;
}
if (position === "left") {
content = assertExtra.left;
}
return content ? /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-extra-content"),
ref,
children: content
}) : null;
});
function OperationNode(_ref, ref) {
var prefixCls = _ref.prefixCls, id2 = _ref.id, tabs = _ref.tabs, locale2 = _ref.locale, mobile = _ref.mobile, _ref$moreIcon = _ref.moreIcon, moreIcon = _ref$moreIcon === void 0 ? "More" : _ref$moreIcon, moreTransitionName = _ref.moreTransitionName, style2 = _ref.style, className = _ref.className, editable = _ref.editable, tabBarGutter = _ref.tabBarGutter, rtl2 = _ref.rtl, removeAriaLabel = _ref.removeAriaLabel, onTabClick = _ref.onTabClick, getPopupContainer = _ref.getPopupContainer, popupClassName = _ref.popupClassName;
var _useState = React$a.useState(false), _useState2 = _slicedToArray$e(_useState, 2), open = _useState2[0], setOpen = _useState2[1];
var _useState3 = React$a.useState(null), _useState4 = _slicedToArray$e(_useState3, 2), selectedKey = _useState4[0], setSelectedKey = _useState4[1];
var popupId = "".concat(id2, "-more-popup");
var dropdownPrefix = "".concat(prefixCls, "-dropdown");
var selectedItemId = selectedKey !== null ? "".concat(popupId, "-").concat(selectedKey) : null;
var dropdownAriaLabel = locale2 === null || locale2 === void 0 ? void 0 : locale2.dropdownAriaLabel;
function onRemoveTab(event, key2) {
event.preventDefault();
event.stopPropagation();
editable.onEdit("remove", {
key: key2,
event
});
}
var menu = /* @__PURE__ */ jsx(ExportMenu, {
onClick: function onClick(_ref2) {
var key2 = _ref2.key, domEvent = _ref2.domEvent;
onTabClick(key2, domEvent);
setOpen(false);
},
prefixCls: "".concat(dropdownPrefix, "-menu"),
id: popupId,
tabIndex: -1,
role: "listbox",
"aria-activedescendant": selectedItemId,
selectedKeys: [selectedKey],
"aria-label": dropdownAriaLabel !== void 0 ? dropdownAriaLabel : "expanded dropdown",
children: tabs.map(function(tab) {
var removable = editable && tab.closable !== false && !tab.disabled;
return /* @__PURE__ */ jsxs(MenuItem$2, {
id: "".concat(popupId, "-").concat(tab.key),
role: "option",
"aria-controls": id2 && "".concat(id2, "-panel-").concat(tab.key),
disabled: tab.disabled,
children: [/* @__PURE__ */ jsx("span", {
children: tab.label
}), removable && /* @__PURE__ */ jsx("button", {
type: "button",
"aria-label": removeAriaLabel || "remove",
tabIndex: 0,
className: "".concat(dropdownPrefix, "-menu-item-remove"),
onClick: function onClick(e2) {
e2.stopPropagation();
onRemoveTab(e2, tab.key);
},
children: tab.closeIcon || editable.removeIcon || "\xD7"
})]
}, tab.key);
})
});
function selectOffset(offset2) {
var enabledTabs = tabs.filter(function(tab2) {
return !tab2.disabled;
});
var selectedIndex = enabledTabs.findIndex(function(tab2) {
return tab2.key === selectedKey;
}) || 0;
var len = enabledTabs.length;
for (var i2 = 0; i2 < len; i2 += 1) {
selectedIndex = (selectedIndex + offset2 + len) % len;
var tab = enabledTabs[selectedIndex];
if (!tab.disabled) {
setSelectedKey(tab.key);
return;
}
}
}
function onKeyDown2(e2) {
var which = e2.which;
if (!open) {
if ([KeyCode.DOWN, KeyCode.SPACE, KeyCode.ENTER].includes(which)) {
setOpen(true);
e2.preventDefault();
}
return;
}
switch (which) {
case KeyCode.UP:
selectOffset(-1);
e2.preventDefault();
break;
case KeyCode.DOWN:
selectOffset(1);
e2.preventDefault();
break;
case KeyCode.ESC:
setOpen(false);
break;
case KeyCode.SPACE:
case KeyCode.ENTER:
if (selectedKey !== null)
onTabClick(selectedKey, e2);
break;
}
}
React$a.useEffect(function() {
var ele = document.getElementById(selectedItemId);
if (ele && ele.scrollIntoView) {
ele.scrollIntoView(false);
}
}, [selectedKey]);
React$a.useEffect(function() {
if (!open) {
setSelectedKey(null);
}
}, [open]);
var moreStyle = _defineProperty$b({}, rtl2 ? "marginRight" : "marginLeft", tabBarGutter);
if (!tabs.length) {
moreStyle.visibility = "hidden";
moreStyle.order = 1;
}
var overlayClassName = classnames(_defineProperty$b({}, "".concat(dropdownPrefix, "-rtl"), rtl2));
var moreNode = mobile ? null : /* @__PURE__ */ jsx(Dropdown$3, {
prefixCls: dropdownPrefix,
overlay: menu,
trigger: ["hover"],
visible: tabs.length ? open : false,
transitionName: moreTransitionName,
onVisibleChange: setOpen,
overlayClassName: classnames(overlayClassName, popupClassName),
mouseEnterDelay: 0.1,
mouseLeaveDelay: 0.1,
getPopupContainer,
children: /* @__PURE__ */ jsx("button", {
type: "button",
className: "".concat(prefixCls, "-nav-more"),
style: moreStyle,
tabIndex: -1,
"aria-hidden": "true",
"aria-haspopup": "listbox",
"aria-controls": popupId,
id: "".concat(id2, "-more"),
"aria-expanded": open,
onKeyDown: onKeyDown2,
children: moreIcon
})
});
return /* @__PURE__ */ jsxs("div", {
className: classnames("".concat(prefixCls, "-nav-operations"), className),
style: style2,
ref,
children: [moreNode, /* @__PURE__ */ jsx(AddButton$1, {
prefixCls,
locale: locale2,
editable
})]
});
}
const OperationNode$1 = /* @__PURE__ */ React__namespace.memo(/* @__PURE__ */ React__namespace.forwardRef(OperationNode), function(_, next) {
return next.tabMoving;
});
function TabNode(_ref) {
var _classNames;
var prefixCls = _ref.prefixCls, id2 = _ref.id, active = _ref.active, _ref$tab = _ref.tab, key2 = _ref$tab.key, label = _ref$tab.label, disabled = _ref$tab.disabled, closeIcon = _ref$tab.closeIcon, closable = _ref.closable, renderWrapper = _ref.renderWrapper, removeAriaLabel = _ref.removeAriaLabel, editable = _ref.editable, onClick = _ref.onClick, onFocus = _ref.onFocus, style2 = _ref.style;
var tabPrefix = "".concat(prefixCls, "-tab");
var removable = editable && closable !== false && !disabled;
function onInternalClick(e2) {
if (disabled) {
return;
}
onClick(e2);
}
function onRemoveTab(event) {
event.preventDefault();
event.stopPropagation();
editable.onEdit("remove", {
key: key2,
event
});
}
var node = /* @__PURE__ */ jsxs("div", {
"data-node-key": genDataNodeKey(key2),
className: classnames(tabPrefix, (_classNames = {}, _defineProperty$b(_classNames, "".concat(tabPrefix, "-with-remove"), removable), _defineProperty$b(_classNames, "".concat(tabPrefix, "-active"), active), _defineProperty$b(_classNames, "".concat(tabPrefix, "-disabled"), disabled), _classNames)),
style: style2,
onClick: onInternalClick,
children: [/* @__PURE__ */ jsx("div", {
role: "tab",
"aria-selected": active,
id: id2 && "".concat(id2, "-tab-").concat(key2),
className: "".concat(tabPrefix, "-btn"),
"aria-controls": id2 && "".concat(id2, "-panel-").concat(key2),
"aria-disabled": disabled,
tabIndex: disabled ? null : 0,
onClick: function onClick2(e2) {
e2.stopPropagation();
onInternalClick(e2);
},
onKeyDown: function onKeyDown2(e2) {
if ([KeyCode.SPACE, KeyCode.ENTER].includes(e2.which)) {
e2.preventDefault();
onInternalClick(e2);
}
},
onFocus,
children: label
}), removable && /* @__PURE__ */ jsx("button", {
type: "button",
"aria-label": removeAriaLabel || "remove",
tabIndex: 0,
className: "".concat(tabPrefix, "-remove"),
onClick: function onClick2(e2) {
e2.stopPropagation();
onRemoveTab(e2);
},
children: closeIcon || editable.removeIcon || "\xD7"
})]
}, key2);
return renderWrapper ? renderWrapper(node) : node;
}
var getSize = function getSize2(refObj) {
var _ref = refObj.current || {}, _ref$offsetWidth = _ref.offsetWidth, offsetWidth = _ref$offsetWidth === void 0 ? 0 : _ref$offsetWidth, _ref$offsetHeight = _ref.offsetHeight, offsetHeight = _ref$offsetHeight === void 0 ? 0 : _ref$offsetHeight;
return [offsetWidth, offsetHeight];
};
var getUnitValue = function getUnitValue2(size, tabPositionTopOrBottom) {
return size[tabPositionTopOrBottom ? 0 : 1];
};
function TabNavList(props, ref) {
var _classNames;
var _React$useContext = React__namespace.useContext(TabContext), prefixCls = _React$useContext.prefixCls, tabs = _React$useContext.tabs;
var className = props.className, style2 = props.style, id2 = props.id, animated = props.animated, activeKey = props.activeKey, rtl2 = props.rtl, extra = props.extra, editable = props.editable, locale2 = props.locale, tabPosition = props.tabPosition, tabBarGutter = props.tabBarGutter, children = props.children, onTabClick = props.onTabClick, onTabScroll = props.onTabScroll;
var containerRef = React$a.useRef();
var extraLeftRef = React$a.useRef();
var extraRightRef = React$a.useRef();
var tabsWrapperRef = React$a.useRef();
var tabListRef = React$a.useRef();
var operationsRef = React$a.useRef();
var innerAddButtonRef = React$a.useRef();
var tabPositionTopOrBottom = tabPosition === "top" || tabPosition === "bottom";
var _useSyncState = useSyncState$1(0, function(next, prev) {
if (tabPositionTopOrBottom && onTabScroll) {
onTabScroll({
direction: next > prev ? "left" : "right"
});
}
}), _useSyncState2 = _slicedToArray$e(_useSyncState, 2), transformLeft = _useSyncState2[0], setTransformLeft = _useSyncState2[1];
var _useSyncState3 = useSyncState$1(0, function(next, prev) {
if (!tabPositionTopOrBottom && onTabScroll) {
onTabScroll({
direction: next > prev ? "top" : "bottom"
});
}
}), _useSyncState4 = _slicedToArray$e(_useSyncState3, 2), transformTop = _useSyncState4[0], setTransformTop = _useSyncState4[1];
var _useState = React$a.useState([0, 0]), _useState2 = _slicedToArray$e(_useState, 2), containerExcludeExtraSize = _useState2[0], setContainerExcludeExtraSize = _useState2[1];
var _useState3 = React$a.useState([0, 0]), _useState4 = _slicedToArray$e(_useState3, 2), tabContentSize = _useState4[0], setTabContentSize = _useState4[1];
var _useState5 = React$a.useState([0, 0]), _useState6 = _slicedToArray$e(_useState5, 2), addSize = _useState6[0], setAddSize = _useState6[1];
var _useState7 = React$a.useState([0, 0]), _useState8 = _slicedToArray$e(_useState7, 2), operationSize = _useState8[0], setOperationSize = _useState8[1];
var _useUpdateState = useUpdateState(/* @__PURE__ */ new Map()), _useUpdateState2 = _slicedToArray$e(_useUpdateState, 2), tabSizes = _useUpdateState2[0], setTabSizes = _useUpdateState2[1];
var tabOffsets = useOffsets(tabs, tabSizes, tabContentSize[0]);
var containerExcludeExtraSizeValue = getUnitValue(containerExcludeExtraSize, tabPositionTopOrBottom);
var tabContentSizeValue = getUnitValue(tabContentSize, tabPositionTopOrBottom);
var addSizeValue = getUnitValue(addSize, tabPositionTopOrBottom);
var operationSizeValue = getUnitValue(operationSize, tabPositionTopOrBottom);
var needScroll = containerExcludeExtraSizeValue < tabContentSizeValue + addSizeValue;
var visibleTabContentValue = needScroll ? containerExcludeExtraSizeValue - operationSizeValue : containerExcludeExtraSizeValue - addSizeValue;
var operationsHiddenClassName = "".concat(prefixCls, "-nav-operations-hidden");
var transformMin = 0;
var transformMax = 0;
if (!tabPositionTopOrBottom) {
transformMin = Math.min(0, visibleTabContentValue - tabContentSizeValue);
transformMax = 0;
} else if (rtl2) {
transformMin = 0;
transformMax = Math.max(0, tabContentSizeValue - visibleTabContentValue);
} else {
transformMin = Math.min(0, visibleTabContentValue - tabContentSizeValue);
transformMax = 0;
}
function alignInRange(value) {
if (value < transformMin) {
return transformMin;
}
if (value > transformMax) {
return transformMax;
}
return value;
}
var touchMovingRef = React$a.useRef();
var _useState9 = React$a.useState(), _useState10 = _slicedToArray$e(_useState9, 2), lockAnimation = _useState10[0], setLockAnimation = _useState10[1];
function doLockAnimation() {
setLockAnimation(Date.now());
}
function clearTouchMoving() {
window.clearTimeout(touchMovingRef.current);
}
useTouchMove(tabsWrapperRef, function(offsetX, offsetY) {
function doMove(setState, offset2) {
setState(function(value) {
var newValue = alignInRange(value + offset2);
return newValue;
});
}
if (!needScroll) {
return false;
}
if (tabPositionTopOrBottom) {
doMove(setTransformLeft, offsetX);
} else {
doMove(setTransformTop, offsetY);
}
clearTouchMoving();
doLockAnimation();
return true;
});
React$a.useEffect(function() {
clearTouchMoving();
if (lockAnimation) {
touchMovingRef.current = window.setTimeout(function() {
setLockAnimation(0);
}, 100);
}
return clearTouchMoving;
}, [lockAnimation]);
var _useVisibleRange = useVisibleRange(
tabOffsets,
visibleTabContentValue,
tabPositionTopOrBottom ? transformLeft : transformTop,
tabContentSizeValue,
addSizeValue,
operationSizeValue,
_objectSpread2$a(_objectSpread2$a({}, props), {}, {
tabs
})
), _useVisibleRange2 = _slicedToArray$e(_useVisibleRange, 2), visibleStart = _useVisibleRange2[0], visibleEnd = _useVisibleRange2[1];
var scrollToTab = useEvent(function() {
var key2 = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : activeKey;
var tabOffset = tabOffsets.get(key2) || {
width: 0,
height: 0,
left: 0,
right: 0,
top: 0
};
if (tabPositionTopOrBottom) {
var newTransform = transformLeft;
if (rtl2) {
if (tabOffset.right < transformLeft) {
newTransform = tabOffset.right;
} else if (tabOffset.right + tabOffset.width > transformLeft + visibleTabContentValue) {
newTransform = tabOffset.right + tabOffset.width - visibleTabContentValue;
}
} else if (tabOffset.left < -transformLeft) {
newTransform = -tabOffset.left;
} else if (tabOffset.left + tabOffset.width > -transformLeft + visibleTabContentValue) {
newTransform = -(tabOffset.left + tabOffset.width - visibleTabContentValue);
}
setTransformTop(0);
setTransformLeft(alignInRange(newTransform));
} else {
var _newTransform = transformTop;
if (tabOffset.top < -transformTop) {
_newTransform = -tabOffset.top;
} else if (tabOffset.top + tabOffset.height > -transformTop + visibleTabContentValue) {
_newTransform = -(tabOffset.top + tabOffset.height - visibleTabContentValue);
}
setTransformLeft(0);
setTransformTop(alignInRange(_newTransform));
}
});
var tabNodeStyle = {};
if (tabPosition === "top" || tabPosition === "bottom") {
tabNodeStyle[rtl2 ? "marginRight" : "marginLeft"] = tabBarGutter;
} else {
tabNodeStyle.marginTop = tabBarGutter;
}
var tabNodes = tabs.map(function(tab, i2) {
var key2 = tab.key;
return /* @__PURE__ */ jsx(TabNode, {
id: id2,
prefixCls,
tab,
style: i2 === 0 ? void 0 : tabNodeStyle,
closable: tab.closable,
editable,
active: key2 === activeKey,
renderWrapper: children,
removeAriaLabel: locale2 === null || locale2 === void 0 ? void 0 : locale2.removeAriaLabel,
onClick: function onClick(e2) {
onTabClick(key2, e2);
},
onFocus: function onFocus() {
scrollToTab(key2);
doLockAnimation();
if (!tabsWrapperRef.current) {
return;
}
if (!rtl2) {
tabsWrapperRef.current.scrollLeft = 0;
}
tabsWrapperRef.current.scrollTop = 0;
}
}, key2);
});
var updateTabSizes = function updateTabSizes2() {
return setTabSizes(function() {
var newSizes = /* @__PURE__ */ new Map();
tabs.forEach(function(_ref2) {
var _tabListRef$current;
var key2 = _ref2.key;
var btnNode = (_tabListRef$current = tabListRef.current) === null || _tabListRef$current === void 0 ? void 0 : _tabListRef$current.querySelector('[data-node-key="'.concat(genDataNodeKey(key2), '"]'));
if (btnNode) {
newSizes.set(key2, {
width: btnNode.offsetWidth,
height: btnNode.offsetHeight,
left: btnNode.offsetLeft,
top: btnNode.offsetTop
});
}
});
return newSizes;
});
};
React$a.useEffect(function() {
updateTabSizes();
}, [tabs.map(function(tab) {
return tab.key;
}).join("_")]);
var onListHolderResize = useUpdate(function() {
var containerSize = getSize(containerRef);
var extraLeftSize = getSize(extraLeftRef);
var extraRightSize = getSize(extraRightRef);
setContainerExcludeExtraSize([containerSize[0] - extraLeftSize[0] - extraRightSize[0], containerSize[1] - extraLeftSize[1] - extraRightSize[1]]);
var newAddSize = getSize(innerAddButtonRef);
setAddSize(newAddSize);
var newOperationSize = getSize(operationsRef);
setOperationSize(newOperationSize);
var tabContentFullSize = getSize(tabListRef);
setTabContentSize([tabContentFullSize[0] - newAddSize[0], tabContentFullSize[1] - newAddSize[1]]);
updateTabSizes();
});
var startHiddenTabs = tabs.slice(0, visibleStart);
var endHiddenTabs = tabs.slice(visibleEnd + 1);
var hiddenTabs = [].concat(_toConsumableArray$c(startHiddenTabs), _toConsumableArray$c(endHiddenTabs));
var _useState11 = React$a.useState(), _useState12 = _slicedToArray$e(_useState11, 2), inkStyle = _useState12[0], setInkStyle = _useState12[1];
var activeTabOffset = tabOffsets.get(activeKey);
var inkBarRafRef = React$a.useRef();
function cleanInkBarRaf() {
wrapperRaf$1.cancel(inkBarRafRef.current);
}
React$a.useEffect(function() {
var newInkStyle = {};
if (activeTabOffset) {
if (tabPositionTopOrBottom) {
if (rtl2) {
newInkStyle.right = activeTabOffset.right;
} else {
newInkStyle.left = activeTabOffset.left;
}
newInkStyle.width = activeTabOffset.width;
} else {
newInkStyle.top = activeTabOffset.top;
newInkStyle.height = activeTabOffset.height;
}
}
cleanInkBarRaf();
inkBarRafRef.current = wrapperRaf$1(function() {
setInkStyle(newInkStyle);
});
return cleanInkBarRaf;
}, [activeTabOffset, tabPositionTopOrBottom, rtl2]);
React$a.useEffect(function() {
scrollToTab();
}, [activeKey, transformMin, transformMax, stringify(activeTabOffset), stringify(tabOffsets), tabPositionTopOrBottom]);
React$a.useEffect(function() {
onListHolderResize();
}, [rtl2]);
var hasDropdown = !!hiddenTabs.length;
var wrapPrefix = "".concat(prefixCls, "-nav-wrap");
var pingLeft;
var pingRight;
var pingTop;
var pingBottom;
if (tabPositionTopOrBottom) {
if (rtl2) {
pingRight = transformLeft > 0;
pingLeft = transformLeft !== transformMax;
} else {
pingLeft = transformLeft < 0;
pingRight = transformLeft !== transformMin;
}
} else {
pingTop = transformTop < 0;
pingBottom = transformTop !== transformMin;
}
return /* @__PURE__ */ jsx(RefResizeObserver, {
onResize: onListHolderResize,
children: /* @__PURE__ */ jsxs("div", {
ref: useComposeRef(ref, containerRef),
role: "tablist",
className: classnames("".concat(prefixCls, "-nav"), className),
style: style2,
onKeyDown: function onKeyDown2() {
doLockAnimation();
},
children: [/* @__PURE__ */ jsx(ExtraContent, {
ref: extraLeftRef,
position: "left",
extra,
prefixCls
}), /* @__PURE__ */ jsx("div", {
className: classnames(wrapPrefix, (_classNames = {}, _defineProperty$b(_classNames, "".concat(wrapPrefix, "-ping-left"), pingLeft), _defineProperty$b(_classNames, "".concat(wrapPrefix, "-ping-right"), pingRight), _defineProperty$b(_classNames, "".concat(wrapPrefix, "-ping-top"), pingTop), _defineProperty$b(_classNames, "".concat(wrapPrefix, "-ping-bottom"), pingBottom), _classNames)),
ref: tabsWrapperRef,
children: /* @__PURE__ */ jsx(RefResizeObserver, {
onResize: onListHolderResize,
children: /* @__PURE__ */ jsxs("div", {
ref: tabListRef,
className: "".concat(prefixCls, "-nav-list"),
style: {
transform: "translate(".concat(transformLeft, "px, ").concat(transformTop, "px)"),
transition: lockAnimation ? "none" : void 0
},
children: [tabNodes, /* @__PURE__ */ jsx(AddButton$1, {
ref: innerAddButtonRef,
prefixCls,
locale: locale2,
editable,
style: _objectSpread2$a(_objectSpread2$a({}, tabNodes.length === 0 ? void 0 : tabNodeStyle), {}, {
visibility: hasDropdown ? "hidden" : null
})
}), /* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-ink-bar"), _defineProperty$b({}, "".concat(prefixCls, "-ink-bar-animated"), animated.inkBar)),
style: inkStyle
})]
})
})
}), /* @__PURE__ */ jsx(OperationNode$1, {
...props,
removeAriaLabel: locale2 === null || locale2 === void 0 ? void 0 : locale2.removeAriaLabel,
ref: operationsRef,
prefixCls,
tabs: hiddenTabs,
className: !hasDropdown && operationsHiddenClassName,
tabMoving: !!lockAnimation
}), /* @__PURE__ */ jsx(ExtraContent, {
ref: extraRightRef,
position: "right",
extra,
prefixCls
})]
})
});
}
const TabNavList$1 = /* @__PURE__ */ React__namespace.forwardRef(TabNavList);
var _excluded$p = ["renderTabBar"], _excluded2$3 = ["label", "key"];
function TabNavListWrapper(_ref) {
var renderTabBar = _ref.renderTabBar, restProps = _objectWithoutProperties$1(_ref, _excluded$p);
var _React$useContext = React__namespace.useContext(TabContext), tabs = _React$useContext.tabs;
if (renderTabBar) {
var tabNavBarProps = _objectSpread2$a(_objectSpread2$a({}, restProps), {}, {
panes: tabs.map(function(_ref2) {
var label = _ref2.label, key2 = _ref2.key, restTabProps = _objectWithoutProperties$1(_ref2, _excluded2$3);
return /* @__PURE__ */ jsx(TabPane$3, {
tab: label,
tabKey: key2,
...restTabProps
}, key2);
})
});
return renderTabBar(tabNavBarProps, TabNavList$1);
}
return /* @__PURE__ */ jsx(TabNavList$1, {
...restProps
});
}
function useAnimateConfig$1() {
var animated = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {
inkBar: true,
tabPane: false
};
var mergedAnimated;
if (animated === false) {
mergedAnimated = {
inkBar: false,
tabPane: false
};
} else if (animated === true) {
mergedAnimated = {
inkBar: true,
tabPane: false
};
} else {
mergedAnimated = _objectSpread2$a({
inkBar: true
}, _typeof$q(animated) === "object" ? animated : {});
}
if (mergedAnimated.tabPaneMotion && mergedAnimated.tabPane === void 0) {
mergedAnimated.tabPane = true;
}
if (!mergedAnimated.tabPaneMotion && mergedAnimated.tabPane) {
mergedAnimated.tabPane = false;
}
return mergedAnimated;
}
var _excluded$o = ["id", "prefixCls", "className", "items", "direction", "activeKey", "defaultActiveKey", "editable", "animated", "tabPosition", "tabBarGutter", "tabBarStyle", "tabBarExtraContent", "locale", "moreIcon", "moreTransitionName", "destroyInactiveTabPane", "renderTabBar", "onChange", "onTabClick", "onTabScroll", "getPopupContainer", "popupClassName"];
var uuid$4 = 0;
function Tabs$1(_ref, ref) {
var _classNames;
var id2 = _ref.id, _ref$prefixCls = _ref.prefixCls, prefixCls = _ref$prefixCls === void 0 ? "rc-tabs" : _ref$prefixCls, className = _ref.className, items = _ref.items, direction = _ref.direction, activeKey = _ref.activeKey, defaultActiveKey = _ref.defaultActiveKey, editable = _ref.editable, animated = _ref.animated, _ref$tabPosition = _ref.tabPosition, tabPosition = _ref$tabPosition === void 0 ? "top" : _ref$tabPosition, tabBarGutter = _ref.tabBarGutter, tabBarStyle = _ref.tabBarStyle, tabBarExtraContent = _ref.tabBarExtraContent, locale2 = _ref.locale, moreIcon = _ref.moreIcon, moreTransitionName = _ref.moreTransitionName, destroyInactiveTabPane = _ref.destroyInactiveTabPane, renderTabBar = _ref.renderTabBar, onChange = _ref.onChange, onTabClick = _ref.onTabClick, onTabScroll = _ref.onTabScroll, getPopupContainer = _ref.getPopupContainer, popupClassName = _ref.popupClassName, restProps = _objectWithoutProperties$1(_ref, _excluded$o);
var tabs = React__namespace.useMemo(function() {
return (items || []).filter(function(item) {
return item && _typeof$q(item) === "object" && "key" in item;
});
}, [items]);
var rtl2 = direction === "rtl";
var mergedAnimated = useAnimateConfig$1(animated);
var _useState = React$a.useState(false), _useState2 = _slicedToArray$e(_useState, 2), mobile = _useState2[0], setMobile = _useState2[1];
React$a.useEffect(function() {
setMobile(isMobile$1());
}, []);
var _useMergedState = useMergedState(function() {
var _tabs$;
return (_tabs$ = tabs[0]) === null || _tabs$ === void 0 ? void 0 : _tabs$.key;
}, {
value: activeKey,
defaultValue: defaultActiveKey
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), mergedActiveKey = _useMergedState2[0], setMergedActiveKey = _useMergedState2[1];
var _useState3 = React$a.useState(function() {
return tabs.findIndex(function(tab) {
return tab.key === mergedActiveKey;
});
}), _useState4 = _slicedToArray$e(_useState3, 2), activeIndex = _useState4[0], setActiveIndex = _useState4[1];
React$a.useEffect(function() {
var newActiveIndex = tabs.findIndex(function(tab) {
return tab.key === mergedActiveKey;
});
if (newActiveIndex === -1) {
var _tabs$newActiveIndex;
newActiveIndex = Math.max(0, Math.min(activeIndex, tabs.length - 1));
setMergedActiveKey((_tabs$newActiveIndex = tabs[newActiveIndex]) === null || _tabs$newActiveIndex === void 0 ? void 0 : _tabs$newActiveIndex.key);
}
setActiveIndex(newActiveIndex);
}, [tabs.map(function(tab) {
return tab.key;
}).join("_"), mergedActiveKey, activeIndex]);
var _useMergedState3 = useMergedState(null, {
value: id2
}), _useMergedState4 = _slicedToArray$e(_useMergedState3, 2), mergedId = _useMergedState4[0], setMergedId = _useMergedState4[1];
React$a.useEffect(function() {
if (!id2) {
setMergedId("rc-tabs-".concat(uuid$4));
uuid$4 += 1;
}
}, []);
function onInternalTabClick(key2, e2) {
onTabClick === null || onTabClick === void 0 ? void 0 : onTabClick(key2, e2);
var isActiveChanged = key2 !== mergedActiveKey;
setMergedActiveKey(key2);
if (isActiveChanged) {
onChange === null || onChange === void 0 ? void 0 : onChange(key2);
}
}
var sharedProps = {
id: mergedId,
activeKey: mergedActiveKey,
animated: mergedAnimated,
tabPosition,
rtl: rtl2,
mobile
};
var tabNavBar;
var tabNavBarProps = _objectSpread2$a(_objectSpread2$a({}, sharedProps), {}, {
editable,
locale: locale2,
moreIcon,
moreTransitionName,
tabBarGutter,
onTabClick: onInternalTabClick,
onTabScroll,
extra: tabBarExtraContent,
style: tabBarStyle,
panes: null,
getPopupContainer,
popupClassName
});
return /* @__PURE__ */ jsx(TabContext.Provider, {
value: {
tabs,
prefixCls
},
children: /* @__PURE__ */ jsxs("div", {
ref,
id: id2,
className: classnames(prefixCls, "".concat(prefixCls, "-").concat(tabPosition), (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-mobile"), mobile), _defineProperty$b(_classNames, "".concat(prefixCls, "-editable"), editable), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), rtl2), _classNames), className),
...restProps,
children: [tabNavBar, /* @__PURE__ */ jsx(TabNavListWrapper, {
...tabNavBarProps,
renderTabBar
}), /* @__PURE__ */ jsx(TabPanelList, {
destroyInactiveTabPane,
...sharedProps,
animated: mergedAnimated
})]
})
});
}
var ForwardTabs = /* @__PURE__ */ React__namespace.forwardRef(Tabs$1);
var motion = {
motionAppear: false,
motionEnter: true,
motionLeave: true
};
function useAnimateConfig(prefixCls) {
var animated = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {
inkBar: true,
tabPane: false
};
var mergedAnimated;
if (animated === false) {
mergedAnimated = {
inkBar: false,
tabPane: false
};
} else if (animated === true) {
mergedAnimated = {
inkBar: true,
tabPane: true
};
} else {
mergedAnimated = _extends$3({
inkBar: true
}, _typeof$q(animated) === "object" ? animated : {});
}
if (mergedAnimated.tabPane) {
mergedAnimated.tabPaneMotion = _extends$3(_extends$3({}, motion), {
motionName: getTransitionName(prefixCls, "switch")
});
}
return mergedAnimated;
}
var __rest$C = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
function filter(items) {
return items.filter(function(item) {
return item;
});
}
function useLegacyItems(items, children) {
if (items) {
return items;
}
var childrenItems = toArray$9(children).map(function(node) {
if (/* @__PURE__ */ React__namespace.isValidElement(node)) {
var key2 = node.key, props = node.props;
var _a = props || {}, tab = _a.tab, restProps = __rest$C(_a, ["tab"]);
var item = _extends$3(_extends$3({
key: String(key2)
}, restProps), {
label: tab
});
return item;
}
return null;
});
return filter(childrenItems);
}
var TabPane$1 = function TabPane2() {
return null;
};
const TabPane$2 = TabPane$1;
var __rest$B = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
function Tabs(_a) {
var type2 = _a.type, className = _a.className, propSize = _a.size, _onEdit = _a.onEdit, hideAdd = _a.hideAdd, centered = _a.centered, addIcon = _a.addIcon, children = _a.children, items = _a.items, animated = _a.animated, props = __rest$B(_a, ["type", "className", "size", "onEdit", "hideAdd", "centered", "addIcon", "children", "items", "animated"]);
var customizePrefixCls = props.prefixCls, _props$moreIcon = props.moreIcon, moreIcon = _props$moreIcon === void 0 ? /* @__PURE__ */ jsx(EllipsisOutlined$1, {}) : _props$moreIcon;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction, getPopupContainer = _React$useContext.getPopupContainer;
var prefixCls = getPrefixCls("tabs", customizePrefixCls);
var editable;
if (type2 === "editable-card") {
editable = {
onEdit: function onEdit(editType, _ref) {
var key2 = _ref.key, event = _ref.event;
_onEdit === null || _onEdit === void 0 ? void 0 : _onEdit(editType === "add" ? event : key2, editType);
},
removeIcon: /* @__PURE__ */ jsx(CloseOutlined$4, {}),
addIcon: addIcon || /* @__PURE__ */ jsx(PlusOutlined$4, {}),
showAdd: hideAdd !== true
};
}
var rootPrefixCls = getPrefixCls();
var mergedItems = useLegacyItems(items, children);
var mergedAnimated = useAnimateConfig(prefixCls, animated);
return /* @__PURE__ */ jsx(SizeContext$1.Consumer, {
children: function(contextSize) {
var _classNames;
var size = propSize !== void 0 ? propSize : contextSize;
return /* @__PURE__ */ jsx(ForwardTabs, {
direction,
getPopupContainer,
moreTransitionName: "".concat(rootPrefixCls, "-slide-up"),
...props,
items: mergedItems,
className: classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(size), size), _defineProperty$b(_classNames, "".concat(prefixCls, "-card"), ["card", "editable-card"].includes(type2)), _defineProperty$b(_classNames, "".concat(prefixCls, "-editable-card"), type2 === "editable-card"), _defineProperty$b(_classNames, "".concat(prefixCls, "-centered"), centered), _classNames), className),
editable,
moreIcon,
prefixCls,
animated: mergedAnimated
});
}
});
}
Tabs.TabPane = TabPane$2;
var __rest$A = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var Grid = function Grid2(_a) {
var prefixCls = _a.prefixCls, className = _a.className, _a$hoverable = _a.hoverable, hoverable = _a$hoverable === void 0 ? true : _a$hoverable, props = __rest$A(_a, ["prefixCls", "className", "hoverable"]);
return /* @__PURE__ */ jsx(ConfigConsumer, {
children: function(_ref) {
var getPrefixCls = _ref.getPrefixCls;
var prefix = getPrefixCls("card", prefixCls);
var classString = classnames("".concat(prefix, "-grid"), className, _defineProperty$b({}, "".concat(prefix, "-grid-hoverable"), hoverable));
return /* @__PURE__ */ jsx("div", {
...props,
className: classString
});
}
});
};
const Grid$1 = Grid;
var __rest$z = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
function getAction(actions) {
var actionList = actions.map(function(action, index2) {
return /* @__PURE__ */ jsx("li", {
style: {
width: "".concat(100 / actions.length, "%")
},
children: /* @__PURE__ */ jsx("span", {
children: action
})
}, "action-".concat(index2));
});
return actionList;
}
var Card$1 = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _extends2, _classNames;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var size = React__namespace.useContext(SizeContext$1);
var onTabChange = function onTabChange2(key2) {
var _a;
(_a = props.onTabChange) === null || _a === void 0 ? void 0 : _a.call(props, key2);
};
var isContainGrid = function isContainGrid2() {
var containGrid;
React__namespace.Children.forEach(props.children, function(element) {
if (element && element.type && element.type === Grid$1) {
containGrid = true;
}
});
return containGrid;
};
var customizePrefixCls = props.prefixCls, className = props.className, extra = props.extra, _props$headStyle = props.headStyle, headStyle = _props$headStyle === void 0 ? {} : _props$headStyle, _props$bodyStyle = props.bodyStyle, bodyStyle = _props$bodyStyle === void 0 ? {} : _props$bodyStyle, title = props.title, loading = props.loading, _props$bordered = props.bordered, bordered = _props$bordered === void 0 ? true : _props$bordered, customizeSize = props.size, type2 = props.type, cover = props.cover, actions = props.actions, tabList = props.tabList, children = props.children, activeTabKey = props.activeTabKey, defaultActiveTabKey = props.defaultActiveTabKey, tabBarExtraContent = props.tabBarExtraContent, hoverable = props.hoverable, _props$tabProps = props.tabProps, tabProps = _props$tabProps === void 0 ? {} : _props$tabProps, others = __rest$z(props, ["prefixCls", "className", "extra", "headStyle", "bodyStyle", "title", "loading", "bordered", "size", "type", "cover", "actions", "tabList", "children", "activeTabKey", "defaultActiveTabKey", "tabBarExtraContent", "hoverable", "tabProps"]);
var prefixCls = getPrefixCls("card", customizePrefixCls);
var loadingBlock = /* @__PURE__ */ jsx(Skeleton$1, {
loading: true,
active: true,
paragraph: {
rows: 4
},
title: false,
children
});
var hasActiveTabKey = activeTabKey !== void 0;
var extraProps = _extends$3(_extends$3({}, tabProps), (_extends2 = {}, _defineProperty$b(_extends2, hasActiveTabKey ? "activeKey" : "defaultActiveKey", hasActiveTabKey ? activeTabKey : defaultActiveTabKey), _defineProperty$b(_extends2, "tabBarExtraContent", tabBarExtraContent), _extends2));
var head;
var tabs = tabList && tabList.length ? /* @__PURE__ */ jsx(Tabs, {
size: "large",
...extraProps,
className: "".concat(prefixCls, "-head-tabs"),
onChange: onTabChange,
items: tabList.map(function(item) {
var _a;
return {
label: item.tab,
key: item.key,
disabled: (_a = item.disabled) !== null && _a !== void 0 ? _a : false
};
})
}) : null;
if (title || extra || tabs) {
head = /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-head"),
style: headStyle,
children: [/* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-head-wrapper"),
children: [title && /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-head-title"),
children: title
}), extra && /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-extra"),
children: extra
})]
}), tabs]
});
}
var coverDom = cover ? /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-cover"),
children: cover
}) : null;
var body = /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-body"),
style: bodyStyle,
children: loading ? loadingBlock : children
});
var actionDom = actions && actions.length ? /* @__PURE__ */ jsx("ul", {
className: "".concat(prefixCls, "-actions"),
children: getAction(actions)
}) : null;
var divProps = omit(others, ["onTabChange"]);
var mergedSize = customizeSize || size;
var classString = classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-loading"), loading), _defineProperty$b(_classNames, "".concat(prefixCls, "-bordered"), bordered), _defineProperty$b(_classNames, "".concat(prefixCls, "-hoverable"), hoverable), _defineProperty$b(_classNames, "".concat(prefixCls, "-contain-grid"), isContainGrid()), _defineProperty$b(_classNames, "".concat(prefixCls, "-contain-tabs"), tabList && tabList.length), _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(mergedSize), mergedSize), _defineProperty$b(_classNames, "".concat(prefixCls, "-type-").concat(type2), !!type2), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames), className);
return /* @__PURE__ */ jsxs("div", {
ref,
...divProps,
className: classString,
children: [head, coverDom, body, actionDom]
});
});
const InternalCard = Card$1;
var __rest$y = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var Meta = function Meta2(props) {
return /* @__PURE__ */ jsx(ConfigConsumer, {
children: function(_ref) {
var getPrefixCls = _ref.getPrefixCls;
var customizePrefixCls = props.prefixCls, className = props.className, avatar = props.avatar, title = props.title, description = props.description, others = __rest$y(props, ["prefixCls", "className", "avatar", "title", "description"]);
var prefixCls = getPrefixCls("card", customizePrefixCls);
var classString = classnames("".concat(prefixCls, "-meta"), className);
var avatarDom = avatar ? /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-meta-avatar"),
children: avatar
}) : null;
var titleDom = title ? /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-meta-title"),
children: title
}) : null;
var descriptionDom = description ? /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-meta-description"),
children: description
}) : null;
var MetaDetail = titleDom || descriptionDom ? /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-meta-detail"),
children: [titleDom, descriptionDom]
}) : null;
return /* @__PURE__ */ jsxs("div", {
...others,
className: classString,
children: [avatarDom, MetaDetail]
});
}
});
};
const Meta$1 = Meta;
var Card = InternalCard;
Card.Grid = Grid$1;
Card.Meta = Meta$1;
const _Card = Card;
var root$9 = _root;
var now$2 = function() {
return root$9.Date.now();
};
var now_1 = now$2;
var isObject$9 = isObject_1, now$1 = now_1, toNumber = toNumber_1;
var FUNC_ERROR_TEXT$2 = "Expected a function";
var nativeMax = Math.max, nativeMin = Math.min;
function debounce(func, wait, options) {
var lastArgs, lastThis, maxWait, result, timerId, lastCallTime, lastInvokeTime = 0, leading = false, maxing = false, trailing = true;
if (typeof func != "function") {
throw new TypeError(FUNC_ERROR_TEXT$2);
}
wait = toNumber(wait) || 0;
if (isObject$9(options)) {
leading = !!options.leading;
maxing = "maxWait" in options;
maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
trailing = "trailing" in options ? !!options.trailing : trailing;
}
function invokeFunc(time) {
var args = lastArgs, thisArg = lastThis;
lastArgs = lastThis = void 0;
lastInvokeTime = time;
result = func.apply(thisArg, args);
return result;
}
function leadingEdge(time) {
lastInvokeTime = time;
timerId = setTimeout(timerExpired, wait);
return leading ? invokeFunc(time) : result;
}
function remainingWait(time) {
var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime, timeWaiting = wait - timeSinceLastCall;
return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting;
}
function shouldInvoke(time) {
var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime;
return lastCallTime === void 0 || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;
}
function timerExpired() {
var time = now$1();
if (shouldInvoke(time)) {
return trailingEdge(time);
}
timerId = setTimeout(timerExpired, remainingWait(time));
}
function trailingEdge(time) {
timerId = void 0;
if (trailing && lastArgs) {
return invokeFunc(time);
}
lastArgs = lastThis = void 0;
return result;
}
function cancel() {
if (timerId !== void 0) {
clearTimeout(timerId);
}
lastInvokeTime = 0;
lastArgs = lastCallTime = lastThis = timerId = void 0;
}
function flush() {
return timerId === void 0 ? result : trailingEdge(now$1());
}
function debounced() {
var time = now$1(), isInvoking = shouldInvoke(time);
lastArgs = arguments;
lastThis = this;
lastCallTime = time;
if (isInvoking) {
if (timerId === void 0) {
return leadingEdge(lastCallTime);
}
if (maxing) {
clearTimeout(timerId);
timerId = setTimeout(timerExpired, wait);
return invokeFunc(lastCallTime);
}
}
if (timerId === void 0) {
timerId = setTimeout(timerExpired, wait);
}
return result;
}
debounced.cancel = cancel;
debounced.flush = flush;
return debounced;
}
var debounce_1 = debounce;
function removeFromCheckedKeys(halfCheckedKeys, checkedKeys) {
var filteredKeys = /* @__PURE__ */ new Set();
halfCheckedKeys.forEach(function(key2) {
if (!checkedKeys.has(key2)) {
filteredKeys.add(key2);
}
});
return filteredKeys;
}
function isCheckDisabled$1(node) {
var _ref = node || {}, disabled = _ref.disabled, disableCheckbox = _ref.disableCheckbox, checkable = _ref.checkable;
return !!(disabled || disableCheckbox) || checkable === false;
}
function fillConductCheck(keys2, levelEntities, maxLevel, syntheticGetCheckDisabled) {
var checkedKeys = new Set(keys2);
var halfCheckedKeys = /* @__PURE__ */ new Set();
for (var level = 0; level <= maxLevel; level += 1) {
var entities = levelEntities.get(level) || /* @__PURE__ */ new Set();
entities.forEach(function(entity) {
var key2 = entity.key, node = entity.node, _entity$children = entity.children, children = _entity$children === void 0 ? [] : _entity$children;
if (checkedKeys.has(key2) && !syntheticGetCheckDisabled(node)) {
children.filter(function(childEntity) {
return !syntheticGetCheckDisabled(childEntity.node);
}).forEach(function(childEntity) {
checkedKeys.add(childEntity.key);
});
}
});
}
var visitedKeys = /* @__PURE__ */ new Set();
for (var _level = maxLevel; _level >= 0; _level -= 1) {
var _entities = levelEntities.get(_level) || /* @__PURE__ */ new Set();
_entities.forEach(function(entity) {
var parent2 = entity.parent, node = entity.node;
if (syntheticGetCheckDisabled(node) || !entity.parent || visitedKeys.has(entity.parent.key)) {
return;
}
if (syntheticGetCheckDisabled(entity.parent.node)) {
visitedKeys.add(parent2.key);
return;
}
var allChecked = true;
var partialChecked = false;
(parent2.children || []).filter(function(childEntity) {
return !syntheticGetCheckDisabled(childEntity.node);
}).forEach(function(_ref2) {
var key2 = _ref2.key;
var checked = checkedKeys.has(key2);
if (allChecked && !checked) {
allChecked = false;
}
if (!partialChecked && (checked || halfCheckedKeys.has(key2))) {
partialChecked = true;
}
});
if (allChecked) {
checkedKeys.add(parent2.key);
}
if (partialChecked) {
halfCheckedKeys.add(parent2.key);
}
visitedKeys.add(parent2.key);
});
}
return {
checkedKeys: Array.from(checkedKeys),
halfCheckedKeys: Array.from(removeFromCheckedKeys(halfCheckedKeys, checkedKeys))
};
}
function cleanConductCheck(keys2, halfKeys, levelEntities, maxLevel, syntheticGetCheckDisabled) {
var checkedKeys = new Set(keys2);
var halfCheckedKeys = new Set(halfKeys);
for (var level = 0; level <= maxLevel; level += 1) {
var entities = levelEntities.get(level) || /* @__PURE__ */ new Set();
entities.forEach(function(entity) {
var key2 = entity.key, node = entity.node, _entity$children2 = entity.children, children = _entity$children2 === void 0 ? [] : _entity$children2;
if (!checkedKeys.has(key2) && !halfCheckedKeys.has(key2) && !syntheticGetCheckDisabled(node)) {
children.filter(function(childEntity) {
return !syntheticGetCheckDisabled(childEntity.node);
}).forEach(function(childEntity) {
checkedKeys.delete(childEntity.key);
});
}
});
}
halfCheckedKeys = /* @__PURE__ */ new Set();
var visitedKeys = /* @__PURE__ */ new Set();
for (var _level2 = maxLevel; _level2 >= 0; _level2 -= 1) {
var _entities2 = levelEntities.get(_level2) || /* @__PURE__ */ new Set();
_entities2.forEach(function(entity) {
var parent2 = entity.parent, node = entity.node;
if (syntheticGetCheckDisabled(node) || !entity.parent || visitedKeys.has(entity.parent.key)) {
return;
}
if (syntheticGetCheckDisabled(entity.parent.node)) {
visitedKeys.add(parent2.key);
return;
}
var allChecked = true;
var partialChecked = false;
(parent2.children || []).filter(function(childEntity) {
return !syntheticGetCheckDisabled(childEntity.node);
}).forEach(function(_ref3) {
var key2 = _ref3.key;
var checked = checkedKeys.has(key2);
if (allChecked && !checked) {
allChecked = false;
}
if (!partialChecked && (checked || halfCheckedKeys.has(key2))) {
partialChecked = true;
}
});
if (!allChecked) {
checkedKeys.delete(parent2.key);
}
if (partialChecked) {
halfCheckedKeys.add(parent2.key);
}
visitedKeys.add(parent2.key);
});
}
return {
checkedKeys: Array.from(checkedKeys),
halfCheckedKeys: Array.from(removeFromCheckedKeys(halfCheckedKeys, checkedKeys))
};
}
function conductCheck(keyList, checked, keyEntities, getCheckDisabled) {
var warningMissKeys = [];
var syntheticGetCheckDisabled;
if (getCheckDisabled) {
syntheticGetCheckDisabled = getCheckDisabled;
} else {
syntheticGetCheckDisabled = isCheckDisabled$1;
}
var keys2 = new Set(keyList.filter(function(key2) {
var hasEntity = !!keyEntities[key2];
if (!hasEntity) {
warningMissKeys.push(key2);
}
return hasEntity;
}));
var levelEntities = /* @__PURE__ */ new Map();
var maxLevel = 0;
Object.keys(keyEntities).forEach(function(key2) {
var entity = keyEntities[key2];
var level = entity.level;
var levelSet = levelEntities.get(level);
if (!levelSet) {
levelSet = /* @__PURE__ */ new Set();
levelEntities.set(level, levelSet);
}
levelSet.add(entity);
maxLevel = Math.max(maxLevel, level);
});
warningOnce(!warningMissKeys.length, "Tree missing follow keys: ".concat(warningMissKeys.slice(0, 100).map(function(key2) {
return "'".concat(key2, "'");
}).join(", ")));
var result;
if (checked === true) {
result = fillConductCheck(keys2, levelEntities, maxLevel, syntheticGetCheckDisabled);
} else {
result = cleanConductCheck(keys2, checked.halfCheckedKeys, levelEntities, maxLevel, syntheticGetCheckDisabled);
}
return result;
}
var _excluded$n = ["children"];
function getPosition$1(level, index2) {
return "".concat(level, "-").concat(index2);
}
function isTreeNode(node) {
return node && node.type && node.type.isTreeNode;
}
function getKey(key2, pos) {
if (key2 !== null && key2 !== void 0) {
return key2;
}
return pos;
}
function fillFieldNames$1(fieldNames) {
var _ref = fieldNames || {}, title = _ref.title, _title = _ref._title, key2 = _ref.key, children = _ref.children;
var mergedTitle = title || "title";
return {
title: mergedTitle,
_title: _title || [mergedTitle],
key: key2 || "key",
children: children || "children"
};
}
function convertTreeToData(rootNodes) {
function dig(node) {
var treeNodes = toArray$9(node);
return treeNodes.map(function(treeNode) {
if (!isTreeNode(treeNode)) {
warningOnce(!treeNode, "Tree/TreeNode can only accept TreeNode as children.");
return null;
}
var key2 = treeNode.key;
var _treeNode$props = treeNode.props, children = _treeNode$props.children, rest = _objectWithoutProperties$1(_treeNode$props, _excluded$n);
var dataNode = _objectSpread2$a({
key: key2
}, rest);
var parsedChildren = dig(children);
if (parsedChildren.length) {
dataNode.children = parsedChildren;
}
return dataNode;
}).filter(function(dataNode) {
return dataNode;
});
}
return dig(rootNodes);
}
function flattenTreeData(treeNodeList, expandedKeys, fieldNames) {
var _fillFieldNames = fillFieldNames$1(fieldNames), fieldTitles = _fillFieldNames._title, fieldKey = _fillFieldNames.key, fieldChildren = _fillFieldNames.children;
var expandedKeySet = new Set(expandedKeys === true ? [] : expandedKeys);
var flattenList = [];
function dig(list) {
var parent2 = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : null;
return list.map(function(treeNode, index2) {
var pos = getPosition$1(parent2 ? parent2.pos : "0", index2);
var mergedKey = getKey(treeNode[fieldKey], pos);
var mergedTitle;
for (var i2 = 0; i2 < fieldTitles.length; i2 += 1) {
var fieldTitle = fieldTitles[i2];
if (treeNode[fieldTitle] !== void 0) {
mergedTitle = treeNode[fieldTitle];
break;
}
}
var flattenNode = _objectSpread2$a(_objectSpread2$a({}, omit(treeNode, [].concat(_toConsumableArray$c(fieldTitles), [fieldKey, fieldChildren]))), {}, {
title: mergedTitle,
key: mergedKey,
parent: parent2,
pos,
children: null,
data: treeNode,
isStart: [].concat(_toConsumableArray$c(parent2 ? parent2.isStart : []), [index2 === 0]),
isEnd: [].concat(_toConsumableArray$c(parent2 ? parent2.isEnd : []), [index2 === list.length - 1])
});
flattenList.push(flattenNode);
if (expandedKeys === true || expandedKeySet.has(mergedKey)) {
flattenNode.children = dig(treeNode[fieldChildren] || [], flattenNode);
} else {
flattenNode.children = [];
}
return flattenNode;
});
}
dig(treeNodeList);
return flattenList;
}
function traverseDataNodes(dataNodes, callback, config) {
var mergedConfig = {};
if (_typeof$q(config) === "object") {
mergedConfig = config;
} else {
mergedConfig = {
externalGetKey: config
};
}
mergedConfig = mergedConfig || {};
var _mergedConfig = mergedConfig, childrenPropName = _mergedConfig.childrenPropName, externalGetKey = _mergedConfig.externalGetKey, fieldNames = _mergedConfig.fieldNames;
var _fillFieldNames2 = fillFieldNames$1(fieldNames), fieldKey = _fillFieldNames2.key, fieldChildren = _fillFieldNames2.children;
var mergeChildrenPropName = childrenPropName || fieldChildren;
var syntheticGetKey;
if (externalGetKey) {
if (typeof externalGetKey === "string") {
syntheticGetKey = function syntheticGetKey2(node) {
return node[externalGetKey];
};
} else if (typeof externalGetKey === "function") {
syntheticGetKey = function syntheticGetKey2(node) {
return externalGetKey(node);
};
}
} else {
syntheticGetKey = function syntheticGetKey2(node, pos) {
return getKey(node[fieldKey], pos);
};
}
function processNode(node, index2, parent2, pathNodes) {
var children = node ? node[mergeChildrenPropName] : dataNodes;
var pos = node ? getPosition$1(parent2.pos, index2) : "0";
var connectNodes = node ? [].concat(_toConsumableArray$c(pathNodes), [node]) : [];
if (node) {
var key2 = syntheticGetKey(node, pos);
var data = {
node,
index: index2,
pos,
key: key2,
parentPos: parent2.node ? parent2.pos : null,
level: parent2.level + 1,
nodes: connectNodes
};
callback(data);
}
if (children) {
children.forEach(function(subNode, subIndex) {
processNode(subNode, subIndex, {
node,
pos,
level: parent2 ? parent2.level + 1 : -1
}, connectNodes);
});
}
}
processNode(null);
}
function convertDataToEntities(dataNodes) {
var _ref2 = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, initWrapper = _ref2.initWrapper, processEntity = _ref2.processEntity, onProcessFinished = _ref2.onProcessFinished, externalGetKey = _ref2.externalGetKey, childrenPropName = _ref2.childrenPropName, fieldNames = _ref2.fieldNames;
var legacyExternalGetKey = arguments.length > 2 ? arguments[2] : void 0;
var mergedExternalGetKey = externalGetKey || legacyExternalGetKey;
var posEntities = {};
var keyEntities = {};
var wrapper = {
posEntities,
keyEntities
};
if (initWrapper) {
wrapper = initWrapper(wrapper) || wrapper;
}
traverseDataNodes(dataNodes, function(item) {
var node = item.node, index2 = item.index, pos = item.pos, key2 = item.key, parentPos = item.parentPos, level = item.level, nodes = item.nodes;
var entity = {
node,
nodes,
index: index2,
key: key2,
pos,
level
};
var mergedKey = getKey(key2, pos);
posEntities[pos] = entity;
keyEntities[mergedKey] = entity;
entity.parent = posEntities[parentPos];
if (entity.parent) {
entity.parent.children = entity.parent.children || [];
entity.parent.children.push(entity);
}
if (processEntity) {
processEntity(entity, wrapper);
}
}, {
externalGetKey: mergedExternalGetKey,
childrenPropName,
fieldNames
});
if (onProcessFinished) {
onProcessFinished(wrapper);
}
return wrapper;
}
function getTreeNodeProps(key2, _ref3) {
var expandedKeys = _ref3.expandedKeys, selectedKeys = _ref3.selectedKeys, loadedKeys = _ref3.loadedKeys, loadingKeys = _ref3.loadingKeys, checkedKeys = _ref3.checkedKeys, halfCheckedKeys = _ref3.halfCheckedKeys, dragOverNodeKey = _ref3.dragOverNodeKey, dropPosition = _ref3.dropPosition, keyEntities = _ref3.keyEntities;
var entity = keyEntities[key2];
var treeNodeProps = {
eventKey: key2,
expanded: expandedKeys.indexOf(key2) !== -1,
selected: selectedKeys.indexOf(key2) !== -1,
loaded: loadedKeys.indexOf(key2) !== -1,
loading: loadingKeys.indexOf(key2) !== -1,
checked: checkedKeys.indexOf(key2) !== -1,
halfChecked: halfCheckedKeys.indexOf(key2) !== -1,
pos: String(entity ? entity.pos : ""),
dragOver: dragOverNodeKey === key2 && dropPosition === 0,
dragOverGapTop: dragOverNodeKey === key2 && dropPosition === -1,
dragOverGapBottom: dragOverNodeKey === key2 && dropPosition === 1
};
return treeNodeProps;
}
function convertNodePropsToEventData(props) {
var data = props.data, expanded = props.expanded, selected = props.selected, checked = props.checked, loaded = props.loaded, loading = props.loading, halfChecked = props.halfChecked, dragOver = props.dragOver, dragOverGapTop = props.dragOverGapTop, dragOverGapBottom = props.dragOverGapBottom, pos = props.pos, active = props.active, eventKey = props.eventKey;
var eventData = _objectSpread2$a(_objectSpread2$a({}, data), {}, {
expanded,
selected,
checked,
loaded,
loading,
halfChecked,
dragOver,
dragOverGapTop,
dragOverGapBottom,
pos,
active,
key: eventKey
});
if (!("props" in eventData)) {
Object.defineProperty(eventData, "props", {
get: function get2() {
warningOnce(false, "Second param return from event is node data instead of TreeNode instance. Please read value directly instead of reading from `props`.");
return props;
}
});
}
return eventData;
}
var __rest$x = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var GroupContext = /* @__PURE__ */ React__namespace.createContext(null);
var InternalCheckboxGroup = function InternalCheckboxGroup2(_a, ref) {
var defaultValue = _a.defaultValue, children = _a.children, _a$options = _a.options, options = _a$options === void 0 ? [] : _a$options, customizePrefixCls = _a.prefixCls, className = _a.className, style2 = _a.style, onChange = _a.onChange, restProps = __rest$x(_a, ["defaultValue", "children", "options", "prefixCls", "className", "style", "onChange"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var _React$useState = React__namespace.useState(restProps.value || defaultValue || []), _React$useState2 = _slicedToArray$e(_React$useState, 2), value = _React$useState2[0], setValue2 = _React$useState2[1];
var _React$useState3 = React__namespace.useState([]), _React$useState4 = _slicedToArray$e(_React$useState3, 2), registeredValues = _React$useState4[0], setRegisteredValues = _React$useState4[1];
React__namespace.useEffect(function() {
if ("value" in restProps) {
setValue2(restProps.value || []);
}
}, [restProps.value]);
var getOptions2 = function getOptions3() {
return options.map(function(option) {
if (typeof option === "string" || typeof option === "number") {
return {
label: option,
value: option
};
}
return option;
});
};
var cancelValue = function cancelValue2(val) {
setRegisteredValues(function(prevValues) {
return prevValues.filter(function(v2) {
return v2 !== val;
});
});
};
var registerValue = function registerValue2(val) {
setRegisteredValues(function(prevValues) {
return [].concat(_toConsumableArray$c(prevValues), [val]);
});
};
var toggleOption = function toggleOption2(option) {
var optionIndex = value.indexOf(option.value);
var newValue = _toConsumableArray$c(value);
if (optionIndex === -1) {
newValue.push(option.value);
} else {
newValue.splice(optionIndex, 1);
}
if (!("value" in restProps)) {
setValue2(newValue);
}
var opts = getOptions2();
onChange === null || onChange === void 0 ? void 0 : onChange(newValue.filter(function(val) {
return registeredValues.includes(val);
}).sort(function(a, b2) {
var indexA = opts.findIndex(function(opt) {
return opt.value === a;
});
var indexB = opts.findIndex(function(opt) {
return opt.value === b2;
});
return indexA - indexB;
}));
};
var prefixCls = getPrefixCls("checkbox", customizePrefixCls);
var groupPrefixCls = "".concat(prefixCls, "-group");
var domProps = omit(restProps, ["value", "disabled"]);
if (options && options.length > 0) {
children = getOptions2().map(function(option) {
return /* @__PURE__ */ jsx(InternalCheckbox$1, {
prefixCls,
disabled: "disabled" in option ? option.disabled : restProps.disabled,
value: option.value,
checked: value.includes(option.value),
onChange: option.onChange,
className: "".concat(groupPrefixCls, "-item"),
style: option.style,
children: option.label
}, option.value.toString());
});
}
var context2 = {
toggleOption,
value,
disabled: restProps.disabled,
name: restProps.name,
registerValue,
cancelValue
};
var classString = classnames(groupPrefixCls, _defineProperty$b({}, "".concat(groupPrefixCls, "-rtl"), direction === "rtl"), className);
return /* @__PURE__ */ jsx("div", {
className: classString,
style: style2,
...domProps,
ref,
children: /* @__PURE__ */ jsx(GroupContext.Provider, {
value: context2,
children
})
});
};
var CheckboxGroup = /* @__PURE__ */ React__namespace.forwardRef(InternalCheckboxGroup);
const Group$3 = /* @__PURE__ */ React__namespace.memo(CheckboxGroup);
var __rest$w = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var InternalCheckbox = function InternalCheckbox2(_a, ref) {
var _classNames;
var _b;
var customizePrefixCls = _a.prefixCls, className = _a.className, children = _a.children, _a$indeterminate = _a.indeterminate, indeterminate = _a$indeterminate === void 0 ? false : _a$indeterminate, style2 = _a.style, onMouseEnter = _a.onMouseEnter, onMouseLeave = _a.onMouseLeave, _a$skipGroup = _a.skipGroup, skipGroup = _a$skipGroup === void 0 ? false : _a$skipGroup, disabled = _a.disabled, restProps = __rest$w(_a, ["prefixCls", "className", "children", "indeterminate", "style", "onMouseEnter", "onMouseLeave", "skipGroup", "disabled"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var checkboxGroup = React__namespace.useContext(GroupContext);
var _useContext = React$a.useContext(FormItemInputContext), isFormItemInput = _useContext.isFormItemInput;
var contextDisabled = React$a.useContext(DisabledContext$1);
var mergedDisabled = (_b = (checkboxGroup === null || checkboxGroup === void 0 ? void 0 : checkboxGroup.disabled) || disabled) !== null && _b !== void 0 ? _b : contextDisabled;
var prevValue = React__namespace.useRef(restProps.value);
React__namespace.useEffect(function() {
checkboxGroup === null || checkboxGroup === void 0 ? void 0 : checkboxGroup.registerValue(restProps.value);
}, []);
React__namespace.useEffect(function() {
if (skipGroup) {
return;
}
if (restProps.value !== prevValue.current) {
checkboxGroup === null || checkboxGroup === void 0 ? void 0 : checkboxGroup.cancelValue(prevValue.current);
checkboxGroup === null || checkboxGroup === void 0 ? void 0 : checkboxGroup.registerValue(restProps.value);
prevValue.current = restProps.value;
}
return function() {
return checkboxGroup === null || checkboxGroup === void 0 ? void 0 : checkboxGroup.cancelValue(restProps.value);
};
}, [restProps.value]);
var prefixCls = getPrefixCls("checkbox", customizePrefixCls);
var checkboxProps = _extends$3({}, restProps);
if (checkboxGroup && !skipGroup) {
checkboxProps.onChange = function() {
if (restProps.onChange) {
restProps.onChange.apply(restProps, arguments);
}
if (checkboxGroup.toggleOption) {
checkboxGroup.toggleOption({
label: children,
value: restProps.value
});
}
};
checkboxProps.name = checkboxGroup.name;
checkboxProps.checked = checkboxGroup.value.includes(restProps.value);
}
var classString = classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-wrapper"), true), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _defineProperty$b(_classNames, "".concat(prefixCls, "-wrapper-checked"), checkboxProps.checked), _defineProperty$b(_classNames, "".concat(prefixCls, "-wrapper-disabled"), mergedDisabled), _defineProperty$b(_classNames, "".concat(prefixCls, "-wrapper-in-form-item"), isFormItemInput), _classNames), className);
var checkboxClass = classnames(_defineProperty$b({}, "".concat(prefixCls, "-indeterminate"), indeterminate));
var ariaChecked = indeterminate ? "mixed" : void 0;
return /* @__PURE__ */ jsxs("label", {
className: classString,
style: style2,
onMouseEnter,
onMouseLeave,
children: [/* @__PURE__ */ jsx(Checkbox$3, {
"aria-checked": ariaChecked,
...checkboxProps,
prefixCls,
className: checkboxClass,
disabled: mergedDisabled,
ref
}), children !== void 0 && /* @__PURE__ */ jsx("span", {
children
})]
});
};
var Checkbox$2 = /* @__PURE__ */ React__namespace.forwardRef(InternalCheckbox);
const InternalCheckbox$1 = Checkbox$2;
var Checkbox$1 = InternalCheckbox$1;
Checkbox$1.Group = Group$3;
Checkbox$1.__ANT_CHECKBOX = true;
const _Checkbox = Checkbox$1;
var RowContext = /* @__PURE__ */ React$a.createContext({});
const RowContext$1 = RowContext;
var __rest$v = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
function parseFlex(flex) {
if (typeof flex === "number") {
return "".concat(flex, " ").concat(flex, " auto");
}
if (/^\d+(\.\d+)?(px|em|rem|%)$/.test(flex)) {
return "0 0 ".concat(flex);
}
return flex;
}
var sizes = ["xs", "sm", "md", "lg", "xl", "xxl"];
var Col = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _classNames;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var _React$useContext2 = React__namespace.useContext(RowContext$1), gutter = _React$useContext2.gutter, wrap2 = _React$useContext2.wrap, supportFlexGap = _React$useContext2.supportFlexGap;
var customizePrefixCls = props.prefixCls, span = props.span, order = props.order, offset2 = props.offset, push = props.push, pull = props.pull, className = props.className, children = props.children, flex = props.flex, style2 = props.style, others = __rest$v(props, ["prefixCls", "span", "order", "offset", "push", "pull", "className", "children", "flex", "style"]);
var prefixCls = getPrefixCls("col", customizePrefixCls);
var sizeClassObj = {};
sizes.forEach(function(size) {
var _extends2;
var sizeProps = {};
var propSize = props[size];
if (typeof propSize === "number") {
sizeProps.span = propSize;
} else if (_typeof$q(propSize) === "object") {
sizeProps = propSize || {};
}
delete others[size];
sizeClassObj = _extends$3(_extends$3({}, sizeClassObj), (_extends2 = {}, _defineProperty$b(_extends2, "".concat(prefixCls, "-").concat(size, "-").concat(sizeProps.span), sizeProps.span !== void 0), _defineProperty$b(_extends2, "".concat(prefixCls, "-").concat(size, "-order-").concat(sizeProps.order), sizeProps.order || sizeProps.order === 0), _defineProperty$b(_extends2, "".concat(prefixCls, "-").concat(size, "-offset-").concat(sizeProps.offset), sizeProps.offset || sizeProps.offset === 0), _defineProperty$b(_extends2, "".concat(prefixCls, "-").concat(size, "-push-").concat(sizeProps.push), sizeProps.push || sizeProps.push === 0), _defineProperty$b(_extends2, "".concat(prefixCls, "-").concat(size, "-pull-").concat(sizeProps.pull), sizeProps.pull || sizeProps.pull === 0), _defineProperty$b(_extends2, "".concat(prefixCls, "-rtl"), direction === "rtl"), _extends2));
});
var classes = classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(span), span !== void 0), _defineProperty$b(_classNames, "".concat(prefixCls, "-order-").concat(order), order), _defineProperty$b(_classNames, "".concat(prefixCls, "-offset-").concat(offset2), offset2), _defineProperty$b(_classNames, "".concat(prefixCls, "-push-").concat(push), push), _defineProperty$b(_classNames, "".concat(prefixCls, "-pull-").concat(pull), pull), _classNames), className, sizeClassObj);
var mergedStyle = {};
if (gutter && gutter[0] > 0) {
var horizontalGutter = gutter[0] / 2;
mergedStyle.paddingLeft = horizontalGutter;
mergedStyle.paddingRight = horizontalGutter;
}
if (gutter && gutter[1] > 0 && !supportFlexGap) {
var verticalGutter = gutter[1] / 2;
mergedStyle.paddingTop = verticalGutter;
mergedStyle.paddingBottom = verticalGutter;
}
if (flex) {
mergedStyle.flex = parseFlex(flex);
if (wrap2 === false && !mergedStyle.minWidth) {
mergedStyle.minWidth = 0;
}
}
return /* @__PURE__ */ jsx("div", {
...others,
style: _extends$3(_extends$3({}, mergedStyle), style2),
className: classes,
ref,
children
});
});
const Col$1 = Col;
var __rest$u = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
tuple$1("top", "middle", "bottom", "stretch");
tuple$1("start", "end", "center", "space-around", "space-between", "space-evenly");
function useMergePropByScreen(oriProp, screen) {
var _React$useState = React__namespace.useState(typeof oriProp === "string" ? oriProp : ""), _React$useState2 = _slicedToArray$e(_React$useState, 2), prop = _React$useState2[0], setProp = _React$useState2[1];
var clacMergeAlignOrJustify = function clacMergeAlignOrJustify2() {
if (typeof oriProp === "string") {
setProp(oriProp);
}
if (_typeof$q(oriProp) !== "object") {
return;
}
for (var i2 = 0; i2 < responsiveArray.length; i2++) {
var breakpoint = responsiveArray[i2];
if (!screen[breakpoint])
continue;
var curVal = oriProp[breakpoint];
if (curVal !== void 0) {
setProp(curVal);
return;
}
}
};
React__namespace.useEffect(function() {
clacMergeAlignOrJustify();
}, [JSON.stringify(oriProp), screen]);
return prop;
}
var Row = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _classNames;
var customizePrefixCls = props.prefixCls, justify = props.justify, align = props.align, className = props.className, style2 = props.style, children = props.children, _props$gutter = props.gutter, gutter = _props$gutter === void 0 ? 0 : _props$gutter, wrap2 = props.wrap, others = __rest$u(props, ["prefixCls", "justify", "align", "className", "style", "children", "gutter", "wrap"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var _React$useState3 = React__namespace.useState({
xs: true,
sm: true,
md: true,
lg: true,
xl: true,
xxl: true
}), _React$useState4 = _slicedToArray$e(_React$useState3, 2), screens2 = _React$useState4[0], setScreens = _React$useState4[1];
var _React$useState5 = React__namespace.useState({
xs: false,
sm: false,
md: false,
lg: false,
xl: false,
xxl: false
}), _React$useState6 = _slicedToArray$e(_React$useState5, 2), curScreens = _React$useState6[0], setCurScreens = _React$useState6[1];
var mergeAlign = useMergePropByScreen(align, curScreens);
var mergeJustify = useMergePropByScreen(justify, curScreens);
var supportFlexGap = useFlexGapSupport();
var gutterRef = React__namespace.useRef(gutter);
React__namespace.useEffect(function() {
var token = ResponsiveObserve.subscribe(function(screen) {
setCurScreens(screen);
var currentGutter = gutterRef.current || 0;
if (!Array.isArray(currentGutter) && _typeof$q(currentGutter) === "object" || Array.isArray(currentGutter) && (_typeof$q(currentGutter[0]) === "object" || _typeof$q(currentGutter[1]) === "object")) {
setScreens(screen);
}
});
return function() {
return ResponsiveObserve.unsubscribe(token);
};
}, []);
var getGutter = function getGutter2() {
var results = [void 0, void 0];
var normalizedGutter = Array.isArray(gutter) ? gutter : [gutter, void 0];
normalizedGutter.forEach(function(g2, index2) {
if (_typeof$q(g2) === "object") {
for (var i2 = 0; i2 < responsiveArray.length; i2++) {
var breakpoint = responsiveArray[i2];
if (screens2[breakpoint] && g2[breakpoint] !== void 0) {
results[index2] = g2[breakpoint];
break;
}
}
} else {
results[index2] = g2;
}
});
return results;
};
var prefixCls = getPrefixCls("row", customizePrefixCls);
var gutters = getGutter();
var classes = classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-no-wrap"), wrap2 === false), _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(mergeJustify), mergeJustify), _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(mergeAlign), mergeAlign), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames), className);
var rowStyle = {};
var horizontalGutter = gutters[0] != null && gutters[0] > 0 ? gutters[0] / -2 : void 0;
var verticalGutter = gutters[1] != null && gutters[1] > 0 ? gutters[1] / -2 : void 0;
if (horizontalGutter) {
rowStyle.marginLeft = horizontalGutter;
rowStyle.marginRight = horizontalGutter;
}
if (supportFlexGap) {
var _gutters = _slicedToArray$e(gutters, 2);
rowStyle.rowGap = _gutters[1];
} else if (verticalGutter) {
rowStyle.marginTop = verticalGutter;
rowStyle.marginBottom = verticalGutter;
}
var _gutters2 = _slicedToArray$e(gutters, 2), gutterH = _gutters2[0], gutterV = _gutters2[1];
var rowContext = React__namespace.useMemo(function() {
return {
gutter: [gutterH, gutterV],
wrap: wrap2,
supportFlexGap
};
}, [gutterH, gutterV, wrap2, supportFlexGap]);
return /* @__PURE__ */ jsx(RowContext$1.Provider, {
value: rowContext,
children: /* @__PURE__ */ jsx("div", {
...others,
className: classes,
style: _extends$3(_extends$3({}, rowStyle), style2),
ref,
children
})
});
});
const Row$1 = Row;
var PanelContent = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _classnames;
var prefixCls = props.prefixCls, forceRender = props.forceRender, className = props.className, style2 = props.style, children = props.children, isActive2 = props.isActive, role = props.role;
var _React$useState = React__namespace.useState(isActive2 || forceRender), _React$useState2 = _slicedToArray$e(_React$useState, 2), rendered = _React$useState2[0], setRendered = _React$useState2[1];
React__namespace.useEffect(function() {
if (forceRender || isActive2) {
setRendered(true);
}
}, [forceRender, isActive2]);
if (!rendered) {
return null;
}
return /* @__PURE__ */ jsx("div", {
ref,
className: classnames("".concat(prefixCls, "-content"), (_classnames = {}, _defineProperty$b(_classnames, "".concat(prefixCls, "-content-active"), isActive2), _defineProperty$b(_classnames, "".concat(prefixCls, "-content-inactive"), !isActive2), _classnames), className),
style: style2,
role,
children: /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-content-box"),
children
})
});
});
PanelContent.displayName = "PanelContent";
var _excluded$m = ["className", "id", "style", "prefixCls", "headerClass", "children", "isActive", "destroyInactivePanel", "accordion", "forceRender", "openMotion", "extra", "collapsible"];
var CollapsePanel$2 = /* @__PURE__ */ function(_React$Component) {
_inherits(CollapsePanel2, _React$Component);
var _super = _createSuper(CollapsePanel2);
function CollapsePanel2() {
var _this2;
_classCallCheck(this, CollapsePanel2);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this2 = _super.call.apply(_super, [this].concat(args));
_this2.onItemClick = function() {
var _this$props = _this2.props, onItemClick = _this$props.onItemClick, panelKey = _this$props.panelKey;
if (typeof onItemClick === "function") {
onItemClick(panelKey);
}
};
_this2.handleKeyPress = function(e2) {
if (e2.key === "Enter" || e2.keyCode === 13 || e2.which === 13) {
_this2.onItemClick();
}
};
_this2.renderIcon = function() {
var _this$props2 = _this2.props, showArrow = _this$props2.showArrow, expandIcon = _this$props2.expandIcon, prefixCls = _this$props2.prefixCls, collapsible = _this$props2.collapsible;
if (!showArrow) {
return null;
}
var iconNode = typeof expandIcon === "function" ? expandIcon(_this2.props) : /* @__PURE__ */ jsx("i", {
className: "arrow"
});
return iconNode && /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-expand-icon"),
onClick: collapsible === "header" || collapsible === "icon" ? _this2.onItemClick : null,
children: iconNode
});
};
_this2.renderTitle = function() {
var _this$props3 = _this2.props, header = _this$props3.header, prefixCls = _this$props3.prefixCls, collapsible = _this$props3.collapsible;
return /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-header-text"),
onClick: collapsible === "header" ? _this2.onItemClick : null,
children: header
});
};
return _this2;
}
_createClass(CollapsePanel2, [{
key: "shouldComponentUpdate",
value: function shouldComponentUpdate(nextProps) {
return !shallowequal(this.props, nextProps);
}
}, {
key: "render",
value: function render2() {
var _classNames, _classNames2;
var _this$props4 = this.props, className = _this$props4.className, id2 = _this$props4.id, style2 = _this$props4.style, prefixCls = _this$props4.prefixCls, headerClass = _this$props4.headerClass, children = _this$props4.children, isActive2 = _this$props4.isActive, destroyInactivePanel = _this$props4.destroyInactivePanel, accordion = _this$props4.accordion, forceRender = _this$props4.forceRender, openMotion = _this$props4.openMotion, extra = _this$props4.extra, collapsible = _this$props4.collapsible, rest = _objectWithoutProperties$1(_this$props4, _excluded$m);
var disabled = collapsible === "disabled";
var collapsibleHeader = collapsible === "header";
var collapsibleIcon = collapsible === "icon";
var itemCls = classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-item"), true), _defineProperty$b(_classNames, "".concat(prefixCls, "-item-active"), isActive2), _defineProperty$b(_classNames, "".concat(prefixCls, "-item-disabled"), disabled), _classNames), className);
var headerCls = classnames("".concat(prefixCls, "-header"), (_classNames2 = {}, _defineProperty$b(_classNames2, headerClass, headerClass), _defineProperty$b(_classNames2, "".concat(prefixCls, "-header-collapsible-only"), collapsibleHeader), _defineProperty$b(_classNames2, "".concat(prefixCls, "-icon-collapsible-only"), collapsibleIcon), _classNames2));
var headerProps = {
className: headerCls,
"aria-expanded": isActive2,
"aria-disabled": disabled,
onKeyPress: this.handleKeyPress
};
if (!collapsibleHeader && !collapsibleIcon) {
headerProps.onClick = this.onItemClick;
headerProps.role = accordion ? "tab" : "button";
headerProps.tabIndex = disabled ? -1 : 0;
}
var ifExtraExist = extra !== null && extra !== void 0 && typeof extra !== "boolean";
delete rest.header;
delete rest.panelKey;
delete rest.onItemClick;
delete rest.showArrow;
delete rest.expandIcon;
return /* @__PURE__ */ jsxs("div", {
...rest,
className: itemCls,
style: style2,
id: id2,
children: [/* @__PURE__ */ jsxs("div", {
...headerProps,
children: [this.renderIcon(), this.renderTitle(), ifExtraExist && /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-extra"),
children: extra
})]
}), /* @__PURE__ */ jsx(CSSMotion, {
visible: isActive2,
leavedClassName: "".concat(prefixCls, "-content-hidden"),
...openMotion,
forceRender,
removeOnLeave: destroyInactivePanel,
children: function(_ref, ref) {
var motionClassName = _ref.className, motionStyle = _ref.style;
return /* @__PURE__ */ jsx(PanelContent, {
ref,
prefixCls,
className: motionClassName,
style: motionStyle,
isActive: isActive2,
forceRender,
role: accordion ? "tabpanel" : null,
children
});
}
})]
});
}
}]);
return CollapsePanel2;
}(React__namespace.Component);
CollapsePanel$2.defaultProps = {
showArrow: true,
isActive: false,
onItemClick: function onItemClick() {
},
headerClass: "",
forceRender: false
};
function getActiveKeysArray(activeKey) {
var currentActiveKey = activeKey;
if (!Array.isArray(currentActiveKey)) {
var activeKeyType = _typeof$q(currentActiveKey);
currentActiveKey = activeKeyType === "number" || activeKeyType === "string" ? [currentActiveKey] : [];
}
return currentActiveKey.map(function(key2) {
return String(key2);
});
}
var Collapse$2 = /* @__PURE__ */ function(_React$Component) {
_inherits(Collapse2, _React$Component);
var _super = _createSuper(Collapse2);
function Collapse2(_props) {
var _this2;
_classCallCheck(this, Collapse2);
_this2 = _super.call(this, _props);
_this2.onClickItem = function(key2) {
var activeKey = _this2.state.activeKey;
if (_this2.props.accordion) {
activeKey = activeKey[0] === key2 ? [] : [key2];
} else {
activeKey = _toConsumableArray$c(activeKey);
var index2 = activeKey.indexOf(key2);
var isActive2 = index2 > -1;
if (isActive2) {
activeKey.splice(index2, 1);
} else {
activeKey.push(key2);
}
}
_this2.setActiveKey(activeKey);
};
_this2.getNewChild = function(child, index2) {
if (!child)
return null;
var activeKey = _this2.state.activeKey;
var _this$props = _this2.props, prefixCls = _this$props.prefixCls, openMotion = _this$props.openMotion, accordion = _this$props.accordion, rootDestroyInactivePanel = _this$props.destroyInactivePanel, expandIcon = _this$props.expandIcon, collapsible = _this$props.collapsible;
var key2 = child.key || String(index2);
var _child$props = child.props, header = _child$props.header, headerClass = _child$props.headerClass, destroyInactivePanel = _child$props.destroyInactivePanel, childCollapsible = _child$props.collapsible;
var isActive2 = false;
if (accordion) {
isActive2 = activeKey[0] === key2;
} else {
isActive2 = activeKey.indexOf(key2) > -1;
}
var mergeCollapsible = childCollapsible !== null && childCollapsible !== void 0 ? childCollapsible : collapsible;
var props = {
key: key2,
panelKey: key2,
header,
headerClass,
isActive: isActive2,
prefixCls,
destroyInactivePanel: destroyInactivePanel !== null && destroyInactivePanel !== void 0 ? destroyInactivePanel : rootDestroyInactivePanel,
openMotion,
accordion,
children: child.props.children,
onItemClick: mergeCollapsible === "disabled" ? null : _this2.onClickItem,
expandIcon,
collapsible: mergeCollapsible
};
if (typeof child.type === "string") {
return child;
}
Object.keys(props).forEach(function(propName) {
if (typeof props[propName] === "undefined") {
delete props[propName];
}
});
return /* @__PURE__ */ React__namespace.cloneElement(child, props);
};
_this2.getItems = function() {
var children = _this2.props.children;
return toArray$9(children).map(_this2.getNewChild);
};
_this2.setActiveKey = function(activeKey) {
if (!("activeKey" in _this2.props)) {
_this2.setState({
activeKey
});
}
_this2.props.onChange(_this2.props.accordion ? activeKey[0] : activeKey);
};
var _activeKey = _props.activeKey, defaultActiveKey = _props.defaultActiveKey;
var currentActiveKey = defaultActiveKey;
if ("activeKey" in _props) {
currentActiveKey = _activeKey;
}
_this2.state = {
activeKey: getActiveKeysArray(currentActiveKey)
};
return _this2;
}
_createClass(Collapse2, [{
key: "shouldComponentUpdate",
value: function shouldComponentUpdate(nextProps, nextState) {
return !shallowequal(this.props, nextProps) || !shallowequal(this.state, nextState);
}
}, {
key: "render",
value: function render2() {
var _classNames;
var _this$props2 = this.props, prefixCls = _this$props2.prefixCls, className = _this$props2.className, style2 = _this$props2.style, accordion = _this$props2.accordion;
var collapseClassName = classnames((_classNames = {}, _defineProperty$b(_classNames, prefixCls, true), _defineProperty$b(_classNames, className, !!className), _classNames));
return /* @__PURE__ */ jsx("div", {
className: collapseClassName,
style: style2,
role: accordion ? "tablist" : null,
children: this.getItems()
});
}
}], [{
key: "getDerivedStateFromProps",
value: function getDerivedStateFromProps(nextProps) {
var newState = {};
if ("activeKey" in nextProps) {
newState.activeKey = getActiveKeysArray(nextProps.activeKey);
}
return newState;
}
}]);
return Collapse2;
}(React__namespace.Component);
Collapse$2.defaultProps = {
prefixCls: "rc-collapse",
onChange: function onChange() {
},
accordion: false,
destroyInactivePanel: false
};
Collapse$2.Panel = CollapsePanel$2;
Collapse$2.Panel;
var CollapsePanel = function CollapsePanel2(props) {
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var customizePrefixCls = props.prefixCls, _props$className = props.className, className = _props$className === void 0 ? "" : _props$className, _props$showArrow = props.showArrow, showArrow = _props$showArrow === void 0 ? true : _props$showArrow;
var prefixCls = getPrefixCls("collapse", customizePrefixCls);
var collapsePanelClassName = classnames(_defineProperty$b({}, "".concat(prefixCls, "-no-arrow"), !showArrow), className);
return /* @__PURE__ */ jsx(Collapse$2.Panel, {
...props,
prefixCls,
className: collapsePanelClassName
});
};
const CollapsePanel$1 = CollapsePanel;
var Collapse = function Collapse2(props) {
var _classNames;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var customizePrefixCls = props.prefixCls, _props$className = props.className, className = _props$className === void 0 ? "" : _props$className, _props$bordered = props.bordered, bordered = _props$bordered === void 0 ? true : _props$bordered, ghost = props.ghost, _props$expandIconPosi = props.expandIconPosition, expandIconPosition = _props$expandIconPosi === void 0 ? "start" : _props$expandIconPosi;
var prefixCls = getPrefixCls("collapse", customizePrefixCls);
var mergedExpandIconPosition = React__namespace.useMemo(function() {
if (expandIconPosition === "left") {
return "start";
}
return expandIconPosition === "right" ? "end" : expandIconPosition;
}, [expandIconPosition]);
var renderExpandIcon2 = function renderExpandIcon3() {
var panelProps = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
var expandIcon = props.expandIcon;
var icon = expandIcon ? expandIcon(panelProps) : /* @__PURE__ */ jsx(RightOutlined$1, {
rotate: panelProps.isActive ? 90 : void 0
});
return cloneElement(icon, function() {
return {
className: classnames(icon.props.className, "".concat(prefixCls, "-arrow"))
};
});
};
var collapseClassName = classnames("".concat(prefixCls, "-icon-position-").concat(mergedExpandIconPosition), (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-borderless"), !bordered), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _defineProperty$b(_classNames, "".concat(prefixCls, "-ghost"), !!ghost), _classNames), className);
var openMotion = _extends$3(_extends$3({}, collapseMotion$1), {
motionAppear: false,
leavedClassName: "".concat(prefixCls, "-content-hidden")
});
var getItems = function getItems2() {
var children = props.children;
return toArray$9(children).map(function(child, index2) {
var _a;
if ((_a = child.props) === null || _a === void 0 ? void 0 : _a.disabled) {
var key2 = child.key || String(index2);
var _child$props = child.props, disabled = _child$props.disabled, collapsible = _child$props.collapsible;
var childProps = _extends$3(_extends$3({}, omit(child.props, ["disabled"])), {
key: key2,
collapsible: collapsible !== null && collapsible !== void 0 ? collapsible : disabled ? "disabled" : void 0
});
return cloneElement(child, childProps);
}
return child;
});
};
return /* @__PURE__ */ jsx(Collapse$2, {
openMotion,
...props,
expandIcon: renderExpandIcon2,
prefixCls,
className: collapseClassName,
children: getItems()
});
};
Collapse.Panel = CollapsePanel$1;
const Collapse$1 = Collapse;
function PickerButton(props) {
return /* @__PURE__ */ jsx(Button$2, {
size: "small",
type: "primary",
...props
});
}
var __rest$t = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var CheckableTag = function CheckableTag2(_a) {
var _classNames;
var customizePrefixCls = _a.prefixCls, className = _a.className, checked = _a.checked, onChange = _a.onChange, onClick = _a.onClick, restProps = __rest$t(_a, ["prefixCls", "className", "checked", "onChange", "onClick"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var handleClick = function handleClick2(e2) {
onChange === null || onChange === void 0 ? void 0 : onChange(!checked);
onClick === null || onClick === void 0 ? void 0 : onClick(e2);
};
var prefixCls = getPrefixCls("tag", customizePrefixCls);
var cls = classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-checkable"), true), _defineProperty$b(_classNames, "".concat(prefixCls, "-checkable-checked"), checked), _classNames), className);
return /* @__PURE__ */ jsx("span", {
...restProps,
className: cls,
onClick: handleClick
});
};
const CheckableTag$1 = CheckableTag;
var __rest$s = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var PresetColorRegex = new RegExp("^(".concat(PresetColorTypes.join("|"), ")(-inverse)?$"));
var PresetStatusColorRegex = new RegExp("^(".concat(PresetStatusColorTypes.join("|"), ")$"));
var InternalTag = function InternalTag2(_a, ref) {
var _classNames;
var customizePrefixCls = _a.prefixCls, className = _a.className, style2 = _a.style, children = _a.children, icon = _a.icon, color2 = _a.color, onClose = _a.onClose, closeIcon = _a.closeIcon, _a$closable = _a.closable, closable = _a$closable === void 0 ? false : _a$closable, props = __rest$s(_a, ["prefixCls", "className", "style", "children", "icon", "color", "onClose", "closeIcon", "closable"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var _React$useState = React__namespace.useState(true), _React$useState2 = _slicedToArray$e(_React$useState, 2), visible = _React$useState2[0], setVisible = _React$useState2[1];
React__namespace.useEffect(function() {
if ("visible" in props) {
setVisible(props.visible);
}
}, [props.visible]);
var isPresetColor = function isPresetColor2() {
if (!color2) {
return false;
}
return PresetColorRegex.test(color2) || PresetStatusColorRegex.test(color2);
};
var tagStyle = _extends$3({
backgroundColor: color2 && !isPresetColor() ? color2 : void 0
}, style2);
var presetColor = isPresetColor();
var prefixCls = getPrefixCls("tag", customizePrefixCls);
var tagClassName = classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(color2), presetColor), _defineProperty$b(_classNames, "".concat(prefixCls, "-has-color"), color2 && !presetColor), _defineProperty$b(_classNames, "".concat(prefixCls, "-hidden"), !visible), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames), className);
var handleCloseClick = function handleCloseClick2(e2) {
e2.stopPropagation();
onClose === null || onClose === void 0 ? void 0 : onClose(e2);
if (e2.defaultPrevented) {
return;
}
if (!("visible" in props)) {
setVisible(false);
}
};
var renderCloseIcon = function renderCloseIcon2() {
if (closable) {
return closeIcon ? /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-close-icon"),
onClick: handleCloseClick,
children: closeIcon
}) : /* @__PURE__ */ jsx(CloseOutlined$4, {
className: "".concat(prefixCls, "-close-icon"),
onClick: handleCloseClick
});
}
return null;
};
var isNeedWave = "onClick" in props || children && children.type === "a";
var tagProps = omit(props, ["visible"]);
var iconNode = icon || null;
var kids = iconNode ? /* @__PURE__ */ jsxs(Fragment, {
children: [iconNode, /* @__PURE__ */ jsx("span", {
children
})]
}) : children;
var tagNode = /* @__PURE__ */ jsxs("span", {
...tagProps,
ref,
className: tagClassName,
style: tagStyle,
children: [kids, renderCloseIcon()]
});
return isNeedWave ? /* @__PURE__ */ jsx(Wave$1, {
children: tagNode
}) : tagNode;
};
var Tag = /* @__PURE__ */ React__namespace.forwardRef(InternalTag);
Tag.CheckableTag = CheckableTag$1;
const Tag$1 = Tag;
function PickerTag(props) {
return /* @__PURE__ */ jsx(Tag$1, {
color: "blue",
...props
});
}
var CalendarOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M880 184H712v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H384v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H144c-17.7 0-32 14.3-32 32v664c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V216c0-17.7-14.3-32-32-32zm-40 656H184V460h656v380zM184 392V256h128v48c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-48h256v48c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-48h128v136H184z" } }] }, "name": "calendar", "theme": "outlined" };
const CalendarOutlinedSvg = CalendarOutlined$2;
var CalendarOutlined = function CalendarOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: CalendarOutlinedSvg
})
});
};
CalendarOutlined.displayName = "CalendarOutlined";
const CalendarOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(CalendarOutlined);
var ClockCircleOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z" } }, { "tag": "path", "attrs": { "d": "M686.7 638.6L544.1 535.5V288c0-4.4-3.6-8-8-8H488c-4.4 0-8 3.6-8 8v275.4c0 2.6 1.2 5 3.3 6.5l165.4 120.6c3.6 2.6 8.6 1.8 11.2-1.7l28.6-39c2.6-3.7 1.8-8.7-1.8-11.2z" } }] }, "name": "clock-circle", "theme": "outlined" };
const ClockCircleOutlinedSvg = ClockCircleOutlined$2;
var ClockCircleOutlined = function ClockCircleOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: ClockCircleOutlinedSvg
})
});
};
ClockCircleOutlined.displayName = "ClockCircleOutlined";
const ClockCircleOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(ClockCircleOutlined);
var SwapRightOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "0 0 1024 1024", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M873.1 596.2l-164-208A32 32 0 00684 376h-64.8c-6.7 0-10.4 7.7-6.3 13l144.3 183H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h695.9c26.8 0 41.7-30.8 25.2-51.8z" } }] }, "name": "swap-right", "theme": "outlined" };
const SwapRightOutlinedSvg = SwapRightOutlined$2;
var SwapRightOutlined = function SwapRightOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: SwapRightOutlinedSvg
})
});
};
SwapRightOutlined.displayName = "SwapRightOutlined";
const SwapRightOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(SwapRightOutlined);
function getPlaceholder(picker, locale2, customizePlaceholder) {
if (customizePlaceholder !== void 0) {
return customizePlaceholder;
}
if (picker === "year" && locale2.lang.yearPlaceholder) {
return locale2.lang.yearPlaceholder;
}
if (picker === "quarter" && locale2.lang.quarterPlaceholder) {
return locale2.lang.quarterPlaceholder;
}
if (picker === "month" && locale2.lang.monthPlaceholder) {
return locale2.lang.monthPlaceholder;
}
if (picker === "week" && locale2.lang.weekPlaceholder) {
return locale2.lang.weekPlaceholder;
}
if (picker === "time" && locale2.timePickerLocale.placeholder) {
return locale2.timePickerLocale.placeholder;
}
return locale2.lang.placeholder;
}
function getRangePlaceholder(picker, locale2, customizePlaceholder) {
if (customizePlaceholder !== void 0) {
return customizePlaceholder;
}
if (picker === "year" && locale2.lang.yearPlaceholder) {
return locale2.lang.rangeYearPlaceholder;
}
if (picker === "quarter" && locale2.lang.quarterPlaceholder) {
return locale2.lang.rangeQuarterPlaceholder;
}
if (picker === "month" && locale2.lang.monthPlaceholder) {
return locale2.lang.rangeMonthPlaceholder;
}
if (picker === "week" && locale2.lang.weekPlaceholder) {
return locale2.lang.rangeWeekPlaceholder;
}
if (picker === "time" && locale2.timePickerLocale.placeholder) {
return locale2.timePickerLocale.rangePlaceholder;
}
return locale2.lang.rangePlaceholder;
}
function transPlacement2DropdownAlign(direction, placement) {
var overflow = {
adjustX: 1,
adjustY: 1
};
switch (placement) {
case "bottomLeft": {
return {
points: ["tl", "bl"],
offset: [0, 4],
overflow
};
}
case "bottomRight": {
return {
points: ["tr", "br"],
offset: [0, 4],
overflow
};
}
case "topLeft": {
return {
points: ["bl", "tl"],
offset: [0, -4],
overflow
};
}
case "topRight": {
return {
points: ["br", "tr"],
offset: [0, -4],
overflow
};
}
default: {
return {
points: direction === "rtl" ? ["tr", "br"] : ["tl", "bl"],
offset: [0, 4],
overflow
};
}
}
}
var __rest$r = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
function generateRangePicker(generateConfig2) {
var RangePicker2 = /* @__PURE__ */ React$a.forwardRef(function(props, ref) {
var customizePrefixCls = props.prefixCls, customGetPopupContainer = props.getPopupContainer, className = props.className, placement = props.placement, customizeSize = props.size, customDisabled = props.disabled, _props$bordered = props.bordered, bordered = _props$bordered === void 0 ? true : _props$bordered, placeholder = props.placeholder, popupClassName = props.popupClassName, dropdownClassName = props.dropdownClassName, customStatus = props.status, restProps = __rest$r(props, ["prefixCls", "getPopupContainer", "className", "placement", "size", "disabled", "bordered", "placeholder", "popupClassName", "dropdownClassName", "status"]);
var innerRef = React__namespace.useRef(null);
var _useContext = React$a.useContext(ConfigContext$1), getPrefixCls = _useContext.getPrefixCls, direction = _useContext.direction, getPopupContainer = _useContext.getPopupContainer;
var prefixCls = getPrefixCls("picker", customizePrefixCls);
var _useCompactItemContex = useCompactItemContext(prefixCls, direction), compactSize = _useCompactItemContex.compactSize, compactItemClassnames = _useCompactItemContex.compactItemClassnames;
var format2 = props.format, showTime = props.showTime, picker = props.picker;
var rootPrefixCls = getPrefixCls();
var additionalOverrideProps = {};
additionalOverrideProps = _extends$3(_extends$3(_extends$3({}, additionalOverrideProps), showTime ? getTimeProps(_extends$3({
format: format2,
picker
}, showTime)) : {}), picker === "time" ? getTimeProps(_extends$3(_extends$3({
format: format2
}, props), {
picker
})) : {});
var size = React__namespace.useContext(SizeContext$1);
var mergedSize = compactSize || customizeSize || size;
var disabled = React__namespace.useContext(DisabledContext$1);
var mergedDisabled = customDisabled !== null && customDisabled !== void 0 ? customDisabled : disabled;
var formItemContext = React$a.useContext(FormItemInputContext);
var hasFeedback = formItemContext.hasFeedback, contextStatus = formItemContext.status, feedbackIcon = formItemContext.feedbackIcon;
var suffixNode = /* @__PURE__ */ jsxs(Fragment, {
children: [picker === "time" ? /* @__PURE__ */ jsx(ClockCircleOutlined$1, {}) : /* @__PURE__ */ jsx(CalendarOutlined$1, {}), hasFeedback && feedbackIcon]
});
React$a.useImperativeHandle(ref, function() {
return {
focus: function focus() {
var _a;
return (_a = innerRef.current) === null || _a === void 0 ? void 0 : _a.focus();
},
blur: function blur() {
var _a;
return (_a = innerRef.current) === null || _a === void 0 ? void 0 : _a.blur();
}
};
});
return /* @__PURE__ */ jsx(LocaleReceiver$1, {
componentName: "DatePicker",
defaultLocale: enUS$2,
children: function(contextLocale) {
var _classNames;
var locale2 = _extends$3(_extends$3({}, contextLocale), props.locale);
return /* @__PURE__ */ jsx(RangePicker$2, {
separator: /* @__PURE__ */ jsx("span", {
"aria-label": "to",
className: "".concat(prefixCls, "-separator"),
children: /* @__PURE__ */ jsx(SwapRightOutlined$1, {})
}),
disabled: mergedDisabled,
ref: innerRef,
dropdownAlign: transPlacement2DropdownAlign(direction, placement),
placeholder: getRangePlaceholder(picker, locale2, placeholder),
suffixIcon: suffixNode,
clearIcon: /* @__PURE__ */ jsx(CloseCircleFilled$1, {}),
prevIcon: /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-prev-icon")
}),
nextIcon: /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-next-icon")
}),
superPrevIcon: /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-super-prev-icon")
}),
superNextIcon: /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-super-next-icon")
}),
allowClear: true,
transitionName: "".concat(rootPrefixCls, "-slide-up"),
...restProps,
...additionalOverrideProps,
className: classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(mergedSize), mergedSize), _defineProperty$b(_classNames, "".concat(prefixCls, "-borderless"), !bordered), _classNames), getStatusClassNames(prefixCls, getMergedStatus(contextStatus, customStatus), hasFeedback), compactItemClassnames, className),
locale: locale2.lang,
prefixCls,
getPopupContainer: customGetPopupContainer || getPopupContainer,
generateConfig: generateConfig2,
components: Components,
direction,
dropdownClassName: popupClassName || dropdownClassName
});
}
});
});
return RangePicker2;
}
var __rest$q = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
function generatePicker$1(generateConfig2) {
function getPicker(picker, displayName) {
var Picker$1 = /* @__PURE__ */ React$a.forwardRef(function(props, ref) {
var customizePrefixCls = props.prefixCls, customizeGetPopupContainer = props.getPopupContainer, className = props.className, customizeSize = props.size, _props$bordered = props.bordered, bordered = _props$bordered === void 0 ? true : _props$bordered, placement = props.placement, placeholder = props.placeholder, popupClassName = props.popupClassName, dropdownClassName = props.dropdownClassName, customDisabled = props.disabled, customStatus = props.status, restProps = __rest$q(props, ["prefixCls", "getPopupContainer", "className", "size", "bordered", "placement", "placeholder", "popupClassName", "dropdownClassName", "disabled", "status"]);
var _useContext = React$a.useContext(ConfigContext$1), getPrefixCls = _useContext.getPrefixCls, direction = _useContext.direction, getPopupContainer = _useContext.getPopupContainer;
var prefixCls = getPrefixCls("picker", customizePrefixCls);
var _useCompactItemContex = useCompactItemContext(prefixCls, direction), compactSize = _useCompactItemContex.compactSize, compactItemClassnames = _useCompactItemContex.compactItemClassnames;
var innerRef = React__namespace.useRef(null);
var format2 = props.format, showTime = props.showTime;
React$a.useImperativeHandle(ref, function() {
return {
focus: function focus() {
var _a;
return (_a = innerRef.current) === null || _a === void 0 ? void 0 : _a.focus();
},
blur: function blur() {
var _a;
return (_a = innerRef.current) === null || _a === void 0 ? void 0 : _a.blur();
}
};
});
var additionalProps = {
showToday: true
};
var additionalOverrideProps = {};
if (picker) {
additionalOverrideProps.picker = picker;
}
var mergedPicker = picker || props.picker;
additionalOverrideProps = _extends$3(_extends$3(_extends$3({}, additionalOverrideProps), showTime ? getTimeProps(_extends$3({
format: format2,
picker: mergedPicker
}, showTime)) : {}), mergedPicker === "time" ? getTimeProps(_extends$3(_extends$3({
format: format2
}, props), {
picker: mergedPicker
})) : {});
var rootPrefixCls = getPrefixCls();
var size = React__namespace.useContext(SizeContext$1);
var mergedSize = compactSize || customizeSize || size;
var disabled = React__namespace.useContext(DisabledContext$1);
var mergedDisabled = customDisabled !== null && customDisabled !== void 0 ? customDisabled : disabled;
var formItemContext = React$a.useContext(FormItemInputContext);
var hasFeedback = formItemContext.hasFeedback, contextStatus = formItemContext.status, feedbackIcon = formItemContext.feedbackIcon;
var suffixNode = /* @__PURE__ */ jsxs(Fragment, {
children: [mergedPicker === "time" ? /* @__PURE__ */ jsx(ClockCircleOutlined$1, {}) : /* @__PURE__ */ jsx(CalendarOutlined$1, {}), hasFeedback && feedbackIcon]
});
return /* @__PURE__ */ jsx(LocaleReceiver$1, {
componentName: "DatePicker",
defaultLocale: enUS$2,
children: function(contextLocale) {
var _classNames;
var locale2 = _extends$3(_extends$3({}, contextLocale), props.locale);
return /* @__PURE__ */ jsx(Picker, {
ref: innerRef,
placeholder: getPlaceholder(mergedPicker, locale2, placeholder),
suffixIcon: suffixNode,
dropdownAlign: transPlacement2DropdownAlign(direction, placement),
clearIcon: /* @__PURE__ */ jsx(CloseCircleFilled$1, {}),
prevIcon: /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-prev-icon")
}),
nextIcon: /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-next-icon")
}),
superPrevIcon: /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-super-prev-icon")
}),
superNextIcon: /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-super-next-icon")
}),
allowClear: true,
transitionName: "".concat(rootPrefixCls, "-slide-up"),
...additionalProps,
...restProps,
...additionalOverrideProps,
locale: locale2.lang,
className: classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(mergedSize), mergedSize), _defineProperty$b(_classNames, "".concat(prefixCls, "-borderless"), !bordered), _classNames), getStatusClassNames(prefixCls, getMergedStatus(contextStatus, customStatus), hasFeedback), compactItemClassnames, className),
prefixCls,
getPopupContainer: customizeGetPopupContainer || getPopupContainer,
generateConfig: generateConfig2,
components: Components,
direction,
disabled: mergedDisabled,
dropdownClassName: popupClassName || dropdownClassName
});
}
});
});
if (displayName) {
Picker$1.displayName = displayName;
}
return Picker$1;
}
var DatePicker2 = getPicker();
var WeekPicker = getPicker("week", "WeekPicker");
var MonthPicker = getPicker("month", "MonthPicker");
var YearPicker = getPicker("year", "YearPicker");
var TimePicker2 = getPicker("time", "TimePicker");
var QuarterPicker = getPicker("quarter", "QuarterPicker");
return {
DatePicker: DatePicker2,
WeekPicker,
MonthPicker,
YearPicker,
TimePicker: TimePicker2,
QuarterPicker
};
}
var Components = {
button: PickerButton,
rangeItem: PickerTag
};
function toArray$5(list) {
if (!list) {
return [];
}
return Array.isArray(list) ? list : [list];
}
function getTimeProps(props) {
var format2 = props.format, picker = props.picker, showHour = props.showHour, showMinute = props.showMinute, showSecond = props.showSecond, use12Hours = props.use12Hours;
var firstFormat = toArray$5(format2)[0];
var showTimeObj = _extends$3({}, props);
if (firstFormat && typeof firstFormat === "string") {
if (!firstFormat.includes("s") && showSecond === void 0) {
showTimeObj.showSecond = false;
}
if (!firstFormat.includes("m") && showMinute === void 0) {
showTimeObj.showMinute = false;
}
if (!firstFormat.includes("H") && !firstFormat.includes("h") && showHour === void 0) {
showTimeObj.showHour = false;
}
if ((firstFormat.includes("a") || firstFormat.includes("A")) && use12Hours === void 0) {
showTimeObj.use12Hours = true;
}
}
if (picker === "time") {
return showTimeObj;
}
if (typeof firstFormat === "function") {
delete showTimeObj.format;
}
return {
showTime: showTimeObj
};
}
tuple$1("bottomLeft", "bottomRight", "topLeft", "topRight");
function generatePicker(generateConfig2) {
var _generateSinglePicker = generatePicker$1(generateConfig2), DatePicker2 = _generateSinglePicker.DatePicker, WeekPicker = _generateSinglePicker.WeekPicker, MonthPicker = _generateSinglePicker.MonthPicker, YearPicker = _generateSinglePicker.YearPicker, TimePicker2 = _generateSinglePicker.TimePicker, QuarterPicker = _generateSinglePicker.QuarterPicker;
var RangePicker2 = generateRangePicker(generateConfig2);
var MergedDatePicker = DatePicker2;
MergedDatePicker.WeekPicker = WeekPicker;
MergedDatePicker.MonthPicker = MonthPicker;
MergedDatePicker.YearPicker = YearPicker;
MergedDatePicker.RangePicker = RangePicker2;
MergedDatePicker.TimePicker = TimePicker2;
MergedDatePicker.QuarterPicker = QuarterPicker;
return MergedDatePicker;
}
var __rest$p = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var Divider = function Divider2(props) {
var _classNames;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var customizePrefixCls = props.prefixCls, _props$type = props.type, type2 = _props$type === void 0 ? "horizontal" : _props$type, _props$orientation = props.orientation, orientation = _props$orientation === void 0 ? "center" : _props$orientation, orientationMargin = props.orientationMargin, className = props.className, children = props.children, dashed = props.dashed, plain = props.plain, restProps = __rest$p(props, ["prefixCls", "type", "orientation", "orientationMargin", "className", "children", "dashed", "plain"]);
var prefixCls = getPrefixCls("divider", customizePrefixCls);
var orientationPrefix = orientation.length > 0 ? "-".concat(orientation) : orientation;
var hasChildren = !!children;
var hasCustomMarginLeft = orientation === "left" && orientationMargin != null;
var hasCustomMarginRight = orientation === "right" && orientationMargin != null;
var classString = classnames(prefixCls, "".concat(prefixCls, "-").concat(type2), (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-with-text"), hasChildren), _defineProperty$b(_classNames, "".concat(prefixCls, "-with-text").concat(orientationPrefix), hasChildren), _defineProperty$b(_classNames, "".concat(prefixCls, "-dashed"), !!dashed), _defineProperty$b(_classNames, "".concat(prefixCls, "-plain"), !!plain), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _defineProperty$b(_classNames, "".concat(prefixCls, "-no-default-orientation-margin-left"), hasCustomMarginLeft), _defineProperty$b(_classNames, "".concat(prefixCls, "-no-default-orientation-margin-right"), hasCustomMarginRight), _classNames), className);
var innerStyle = _extends$3(_extends$3({}, hasCustomMarginLeft && {
marginLeft: orientationMargin
}), hasCustomMarginRight && {
marginRight: orientationMargin
});
return /* @__PURE__ */ jsx("div", {
className: classString,
...restProps,
role: "separator",
children: children && type2 !== "vertical" && /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-inner-text"),
style: innerStyle,
children
})
});
};
const _Divider = Divider;
var OrderContext = /* @__PURE__ */ React__namespace.createContext(null);
var EMPTY_LIST$3 = [];
function useDom(render2, debug) {
var _React$useState = React__namespace.useState(function() {
if (!canUseDom$1()) {
return null;
}
var defaultEle = document.createElement("div");
return defaultEle;
}), _React$useState2 = _slicedToArray$e(_React$useState, 1), ele = _React$useState2[0];
var appendedRef = React__namespace.useRef(false);
var queueCreate = React__namespace.useContext(OrderContext);
var _React$useState3 = React__namespace.useState(EMPTY_LIST$3), _React$useState4 = _slicedToArray$e(_React$useState3, 2), queue = _React$useState4[0], setQueue = _React$useState4[1];
var mergedQueueCreate = queueCreate || (appendedRef.current ? void 0 : function(appendFn) {
setQueue(function(origin) {
var newQueue = [appendFn].concat(_toConsumableArray$c(origin));
return newQueue;
});
});
function append() {
if (!ele.parentElement) {
document.body.appendChild(ele);
}
appendedRef.current = true;
}
function cleanup2() {
var _ele$parentElement;
(_ele$parentElement = ele.parentElement) === null || _ele$parentElement === void 0 ? void 0 : _ele$parentElement.removeChild(ele);
appendedRef.current = false;
}
useLayoutEffect$1(function() {
if (render2) {
if (queueCreate) {
queueCreate(append);
} else {
append();
}
} else {
cleanup2();
}
return cleanup2;
}, [render2]);
useLayoutEffect$1(function() {
if (queue.length) {
queue.forEach(function(appendFn) {
return appendFn();
});
setQueue(EMPTY_LIST$3);
}
}, [queue]);
return [ele, mergedQueueCreate];
}
var cached;
function getScrollBarSize(fresh) {
if (typeof document === "undefined") {
return 0;
}
if (fresh || cached === void 0) {
var inner = document.createElement("div");
inner.style.width = "100%";
inner.style.height = "200px";
var outer = document.createElement("div");
var outerStyle = outer.style;
outerStyle.position = "absolute";
outerStyle.top = "0";
outerStyle.left = "0";
outerStyle.pointerEvents = "none";
outerStyle.visibility = "hidden";
outerStyle.width = "200px";
outerStyle.height = "150px";
outerStyle.overflow = "hidden";
outer.appendChild(inner);
document.body.appendChild(outer);
var widthContained = inner.offsetWidth;
outer.style.overflow = "scroll";
var widthScroll = inner.offsetWidth;
if (widthContained === widthScroll) {
widthScroll = outer.clientWidth;
}
document.body.removeChild(outer);
cached = widthContained - widthScroll;
}
return cached;
}
function ensureSize(str) {
var match2 = str.match(/^(.*)px$/);
var value = Number(match2 === null || match2 === void 0 ? void 0 : match2[1]);
return Number.isNaN(value) ? getScrollBarSize() : value;
}
function getTargetScrollBarSize(target) {
if (typeof document === "undefined" || !target || !(target instanceof Element)) {
return {
width: 0,
height: 0
};
}
var _getComputedStyle2 = getComputedStyle(target, "::-webkit-scrollbar"), width = _getComputedStyle2.width, height = _getComputedStyle2.height;
return {
width: ensureSize(width),
height: ensureSize(height)
};
}
function isBodyOverflowing() {
return document.body.scrollHeight > (window.innerHeight || document.documentElement.clientHeight) && window.innerWidth > document.body.offsetWidth;
}
var UNIQUE_ID = "rc-util-locker-".concat(Date.now());
var uuid$3 = 0;
function useScrollLocker(lock) {
var mergedLock = !!lock;
var _React$useState = React__namespace.useState(function() {
uuid$3 += 1;
return "".concat(UNIQUE_ID, "_").concat(uuid$3);
}), _React$useState2 = _slicedToArray$e(_React$useState, 1), id2 = _React$useState2[0];
useLayoutEffect$1(function() {
if (mergedLock) {
var scrollbarSize = getScrollBarSize();
var isOverflow = isBodyOverflowing();
updateCSS("\nhtml body {\n overflow-y: hidden;\n ".concat(isOverflow ? "width: calc(100% - ".concat(scrollbarSize, "px);") : "", "\n}"), id2);
} else {
removeCSS(id2);
}
return function() {
removeCSS(id2);
};
}, [mergedLock, id2]);
}
var inline = false;
function inlineMock(nextInline) {
if (typeof nextInline === "boolean") {
inline = nextInline;
}
return inline;
}
var getPortalContainer = function getPortalContainer2(getContainer2) {
if (getContainer2 === false) {
return false;
}
if (!canUseDom$1() || !getContainer2) {
return null;
}
if (typeof getContainer2 === "string") {
return document.querySelector(getContainer2);
}
if (typeof getContainer2 === "function") {
return getContainer2();
}
return getContainer2;
};
var Portal = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var open = props.open, autoLock = props.autoLock, getContainer2 = props.getContainer;
props.debug;
var _props$autoDestroy = props.autoDestroy, autoDestroy = _props$autoDestroy === void 0 ? true : _props$autoDestroy, children = props.children;
var _React$useState = React__namespace.useState(open), _React$useState2 = _slicedToArray$e(_React$useState, 2), shouldRender = _React$useState2[0], setShouldRender = _React$useState2[1];
var mergedRender = shouldRender || open;
React__namespace.useEffect(function() {
if (autoDestroy || open) {
setShouldRender(open);
}
}, [open, autoDestroy]);
var _React$useState3 = React__namespace.useState(function() {
return getPortalContainer(getContainer2);
}), _React$useState4 = _slicedToArray$e(_React$useState3, 2), innerContainer = _React$useState4[0], setInnerContainer = _React$useState4[1];
React__namespace.useEffect(function() {
var customizeContainer = getPortalContainer(getContainer2);
setInnerContainer(customizeContainer !== null && customizeContainer !== void 0 ? customizeContainer : null);
});
var _useDom = useDom(mergedRender && !innerContainer), _useDom2 = _slicedToArray$e(_useDom, 2), defaultContainer2 = _useDom2[0], queueCreate = _useDom2[1];
var mergedContainer = innerContainer !== null && innerContainer !== void 0 ? innerContainer : defaultContainer2;
useScrollLocker(autoLock && open && canUseDom$1() && (mergedContainer === defaultContainer2 || mergedContainer === document.body));
var childRef = null;
if (children && supportRef(children) && ref) {
var _ref = children;
childRef = _ref.ref;
}
var mergedRef = useComposeRef(childRef, ref);
if (!mergedRender || !canUseDom$1() || innerContainer === void 0) {
return null;
}
var renderInline = mergedContainer === false || inlineMock();
var reffedChildren = children;
if (ref) {
reffedChildren = /* @__PURE__ */ React__namespace.cloneElement(children, {
ref: mergedRef
});
}
return /* @__PURE__ */ jsx(OrderContext.Provider, {
value: queueCreate,
children: renderInline ? reffedChildren : /* @__PURE__ */ ReactDOM2.createPortal(reffedChildren, mergedContainer)
});
});
var DrawerPanel = function DrawerPanel2(props) {
var prefixCls = props.prefixCls, className = props.className, style2 = props.style, children = props.children, containerRef = props.containerRef;
return /* @__PURE__ */ jsx(Fragment, {
children: /* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-content"), className),
style: _objectSpread2$a({}, style2),
"aria-modal": "true",
role: "dialog",
ref: containerRef,
children
})
});
};
var DrawerContext = /* @__PURE__ */ React__namespace.createContext(null);
function parseWidthHeight(value) {
if (typeof value === "string" && String(Number(value)) === value) {
warningOnce(false, "Invalid value type of `width` or `height` which should be number type instead.");
return Number(value);
}
return value;
}
var sentinelStyle$1 = {
width: 0,
height: 0,
overflow: "hidden",
outline: "none",
position: "absolute"
};
function DrawerPopup(props, ref) {
var _ref, _pushConfig$distance, _pushConfig, _classNames;
var prefixCls = props.prefixCls, open = props.open, placement = props.placement, inline2 = props.inline, push = props.push, forceRender = props.forceRender, autoFocus = props.autoFocus, keyboard = props.keyboard, rootClassName = props.rootClassName, rootStyle = props.rootStyle, zIndex = props.zIndex, className = props.className, style2 = props.style, motion2 = props.motion, width = props.width, height = props.height, children = props.children, contentWrapperStyle = props.contentWrapperStyle, mask = props.mask, maskClosable = props.maskClosable, maskMotion = props.maskMotion, maskClassName = props.maskClassName, maskStyle = props.maskStyle, afterOpenChange = props.afterOpenChange, onClose = props.onClose;
var panelRef = React__namespace.useRef();
var sentinelStartRef = React__namespace.useRef();
var sentinelEndRef = React__namespace.useRef();
React__namespace.useImperativeHandle(ref, function() {
return panelRef.current;
});
var onPanelKeyDown = function onPanelKeyDown2(event) {
var keyCode = event.keyCode, shiftKey = event.shiftKey;
switch (keyCode) {
case KeyCode.TAB: {
if (keyCode === KeyCode.TAB) {
if (!shiftKey && document.activeElement === sentinelEndRef.current) {
var _sentinelStartRef$cur;
(_sentinelStartRef$cur = sentinelStartRef.current) === null || _sentinelStartRef$cur === void 0 ? void 0 : _sentinelStartRef$cur.focus({
preventScroll: true
});
} else if (shiftKey && document.activeElement === sentinelStartRef.current) {
var _sentinelEndRef$curre;
(_sentinelEndRef$curre = sentinelEndRef.current) === null || _sentinelEndRef$curre === void 0 ? void 0 : _sentinelEndRef$curre.focus({
preventScroll: true
});
}
}
break;
}
case KeyCode.ESC: {
if (onClose && keyboard) {
event.stopPropagation();
onClose(event);
}
break;
}
}
};
React__namespace.useEffect(function() {
if (open && autoFocus) {
var _panelRef$current;
(_panelRef$current = panelRef.current) === null || _panelRef$current === void 0 ? void 0 : _panelRef$current.focus({
preventScroll: true
});
}
}, [open]);
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), pushed = _React$useState2[0], setPushed = _React$useState2[1];
var parentContext = React__namespace.useContext(DrawerContext);
var pushConfig;
if (push === false) {
pushConfig = {
distance: 0
};
} else if (push === true) {
pushConfig = {};
} else {
pushConfig = push || {};
}
var pushDistance = (_ref = (_pushConfig$distance = (_pushConfig = pushConfig) === null || _pushConfig === void 0 ? void 0 : _pushConfig.distance) !== null && _pushConfig$distance !== void 0 ? _pushConfig$distance : parentContext === null || parentContext === void 0 ? void 0 : parentContext.pushDistance) !== null && _ref !== void 0 ? _ref : 180;
var mergedContext = React__namespace.useMemo(function() {
return {
pushDistance,
push: function push2() {
setPushed(true);
},
pull: function pull() {
setPushed(false);
}
};
}, [pushDistance]);
React__namespace.useEffect(function() {
if (open) {
var _parentContext$push;
parentContext === null || parentContext === void 0 ? void 0 : (_parentContext$push = parentContext.push) === null || _parentContext$push === void 0 ? void 0 : _parentContext$push.call(parentContext);
} else {
var _parentContext$pull;
parentContext === null || parentContext === void 0 ? void 0 : (_parentContext$pull = parentContext.pull) === null || _parentContext$pull === void 0 ? void 0 : _parentContext$pull.call(parentContext);
}
}, [open]);
React__namespace.useEffect(function() {
return function() {
var _parentContext$pull2;
parentContext === null || parentContext === void 0 ? void 0 : (_parentContext$pull2 = parentContext.pull) === null || _parentContext$pull2 === void 0 ? void 0 : _parentContext$pull2.call(parentContext);
};
}, []);
var maskNode = mask && /* @__PURE__ */ jsx(CSSMotion, {
...maskMotion,
visible: open,
children: function(_ref2, maskRef) {
var motionMaskClassName = _ref2.className, motionMaskStyle = _ref2.style;
return /* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-mask"), motionMaskClassName, maskClassName),
style: _objectSpread2$a(_objectSpread2$a({}, motionMaskStyle), maskStyle),
onClick: maskClosable && open ? onClose : void 0,
ref: maskRef
});
}
}, "mask");
var motionProps = typeof motion2 === "function" ? motion2(placement) : motion2;
var wrapperStyle = {};
if (pushed && pushDistance) {
switch (placement) {
case "top":
wrapperStyle.transform = "translateY(".concat(pushDistance, "px)");
break;
case "bottom":
wrapperStyle.transform = "translateY(".concat(-pushDistance, "px)");
break;
case "left":
wrapperStyle.transform = "translateX(".concat(pushDistance, "px)");
break;
default:
wrapperStyle.transform = "translateX(".concat(-pushDistance, "px)");
break;
}
}
if (placement === "left" || placement === "right") {
wrapperStyle.width = parseWidthHeight(width);
} else {
wrapperStyle.height = parseWidthHeight(height);
}
var panelNode = /* @__PURE__ */ jsx(CSSMotion, {
...motionProps,
visible: open,
forceRender,
onVisibleChanged: function onVisibleChanged(nextVisible) {
afterOpenChange === null || afterOpenChange === void 0 ? void 0 : afterOpenChange(nextVisible);
},
removeOnLeave: false,
leavedClassName: "".concat(prefixCls, "-content-wrapper-hidden"),
children: function(_ref3, motionRef) {
var motionClassName = _ref3.className, motionStyle = _ref3.style;
return /* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-content-wrapper"), motionClassName),
style: _objectSpread2$a(_objectSpread2$a(_objectSpread2$a({}, wrapperStyle), motionStyle), contentWrapperStyle),
children: /* @__PURE__ */ jsx(DrawerPanel, {
containerRef: motionRef,
prefixCls,
className,
style: style2,
children
})
});
}
}, "panel");
var containerStyle = _objectSpread2$a({}, rootStyle);
if (zIndex) {
containerStyle.zIndex = zIndex;
}
return /* @__PURE__ */ jsx(DrawerContext.Provider, {
value: mergedContext,
children: /* @__PURE__ */ jsxs("div", {
className: classnames(prefixCls, "".concat(prefixCls, "-").concat(placement), rootClassName, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-open"), open), _defineProperty$b(_classNames, "".concat(prefixCls, "-inline"), inline2), _classNames)),
style: containerStyle,
tabIndex: -1,
ref: panelRef,
onKeyDown: onPanelKeyDown,
children: [maskNode, /* @__PURE__ */ jsx("div", {
tabIndex: 0,
ref: sentinelStartRef,
style: sentinelStyle$1,
"aria-hidden": "true",
"data-sentinel": "start"
}), panelNode, /* @__PURE__ */ jsx("div", {
tabIndex: 0,
ref: sentinelEndRef,
style: sentinelStyle$1,
"aria-hidden": "true",
"data-sentinel": "end"
})]
})
});
}
var RefDrawerPopup = /* @__PURE__ */ React__namespace.forwardRef(DrawerPopup);
var Drawer$1 = function Drawer2(props) {
var _props$open = props.open, open = _props$open === void 0 ? false : _props$open, _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-drawer" : _props$prefixCls, _props$placement = props.placement, placement = _props$placement === void 0 ? "right" : _props$placement, _props$autoFocus = props.autoFocus, autoFocus = _props$autoFocus === void 0 ? true : _props$autoFocus, _props$keyboard = props.keyboard, keyboard = _props$keyboard === void 0 ? true : _props$keyboard, _props$width = props.width, width = _props$width === void 0 ? 378 : _props$width, _props$mask = props.mask, mask = _props$mask === void 0 ? true : _props$mask, _props$maskClosable = props.maskClosable, maskClosable = _props$maskClosable === void 0 ? true : _props$maskClosable, getContainer2 = props.getContainer, forceRender = props.forceRender, afterOpenChange = props.afterOpenChange, destroyOnClose = props.destroyOnClose;
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), animatedVisible = _React$useState2[0], setAnimatedVisible = _React$useState2[1];
var _React$useState3 = React__namespace.useState(false), _React$useState4 = _slicedToArray$e(_React$useState3, 2), mounted = _React$useState4[0], setMounted = _React$useState4[1];
useLayoutEffect$1(function() {
setMounted(true);
}, []);
var mergedOpen = mounted ? open : false;
var panelRef = React__namespace.useRef();
var lastActiveRef = React__namespace.useRef();
useLayoutEffect$1(function() {
if (mergedOpen) {
lastActiveRef.current = document.activeElement;
}
}, [mergedOpen]);
var internalAfterOpenChange = function internalAfterOpenChange2(nextVisible) {
var _panelRef$current;
setAnimatedVisible(nextVisible);
afterOpenChange === null || afterOpenChange === void 0 ? void 0 : afterOpenChange(nextVisible);
if (!nextVisible && lastActiveRef.current && !((_panelRef$current = panelRef.current) === null || _panelRef$current === void 0 ? void 0 : _panelRef$current.contains(lastActiveRef.current))) {
var _lastActiveRef$curren;
(_lastActiveRef$curren = lastActiveRef.current) === null || _lastActiveRef$curren === void 0 ? void 0 : _lastActiveRef$curren.focus({
preventScroll: true
});
}
};
if (!forceRender && !animatedVisible && !mergedOpen && destroyOnClose) {
return null;
}
var drawerPopupProps = _objectSpread2$a(_objectSpread2$a({}, props), {}, {
open: mergedOpen,
prefixCls,
placement,
autoFocus,
keyboard,
width,
mask,
maskClosable,
inline: getContainer2 === false,
afterOpenChange: internalAfterOpenChange,
ref: panelRef
});
return /* @__PURE__ */ jsx(Portal, {
open: mergedOpen || forceRender || animatedVisible,
autoDestroy: false,
getContainer: getContainer2,
autoLock: mask && (mergedOpen || animatedVisible),
children: /* @__PURE__ */ jsx(RefDrawerPopup, {
...drawerPopupProps
})
});
};
var __rest$o = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
tuple$1("default", "large");
var defaultPushState = {
distance: 180
};
function Drawer(props) {
var width = props.width, height = props.height, _props$size = props.size, size = _props$size === void 0 ? "default" : _props$size, _props$closable = props.closable, closable = _props$closable === void 0 ? true : _props$closable, _props$mask = props.mask, mask = _props$mask === void 0 ? true : _props$mask, _props$push = props.push, push = _props$push === void 0 ? defaultPushState : _props$push, _props$closeIcon = props.closeIcon, closeIcon = _props$closeIcon === void 0 ? /* @__PURE__ */ jsx(CloseOutlined$4, {}) : _props$closeIcon, bodyStyle = props.bodyStyle, drawerStyle = props.drawerStyle, className = props.className, visible = props.visible, open = props.open, children = props.children, style2 = props.style, title = props.title, headerStyle = props.headerStyle, onClose = props.onClose, footer = props.footer, footerStyle = props.footerStyle, customizePrefixCls = props.prefixCls, customizeGetContainer = props.getContainer, extra = props.extra, afterVisibleChange = props.afterVisibleChange, _afterOpenChange = props.afterOpenChange, rest = __rest$o(props, ["width", "height", "size", "closable", "mask", "push", "closeIcon", "bodyStyle", "drawerStyle", "className", "visible", "open", "children", "style", "title", "headerStyle", "onClose", "footer", "footerStyle", "prefixCls", "getContainer", "extra", "afterVisibleChange", "afterOpenChange"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPopupContainer = _React$useContext.getPopupContainer, getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var prefixCls = getPrefixCls("drawer", customizePrefixCls);
var getContainer2 = customizeGetContainer === void 0 && getPopupContainer ? function() {
return getPopupContainer(document.body);
} : customizeGetContainer;
var closeIconNode = closable && /* @__PURE__ */ jsx("button", {
type: "button",
onClick: onClose,
"aria-label": "Close",
className: "".concat(prefixCls, "-close"),
children: closeIcon
});
[["visible", "open"], ["afterVisibleChange", "afterOpenChange"]].forEach(function(_ref) {
var _ref2 = _slicedToArray$e(_ref, 2);
_ref2[0];
_ref2[1];
});
function renderHeader() {
if (!title && !closable) {
return null;
}
return /* @__PURE__ */ jsxs("div", {
className: classnames("".concat(prefixCls, "-header"), _defineProperty$b({}, "".concat(prefixCls, "-header-close-only"), closable && !title && !extra)),
style: headerStyle,
children: [/* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-header-title"),
children: [closeIconNode, title && /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-title"),
children: title
})]
}), extra && /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-extra"),
children: extra
})]
});
}
function renderFooter() {
if (!footer) {
return null;
}
var footerClassName = "".concat(prefixCls, "-footer");
return /* @__PURE__ */ jsx("div", {
className: footerClassName,
style: footerStyle,
children: footer
});
}
var drawerClassName = classnames(_defineProperty$b({
"no-mask": !mask
}, "".concat(prefixCls, "-rtl"), direction === "rtl"), className);
var mergedWidth = React__namespace.useMemo(function() {
return width !== null && width !== void 0 ? width : size === "large" ? 736 : 378;
}, [width, size]);
var mergedHeight = React__namespace.useMemo(function() {
return height !== null && height !== void 0 ? height : size === "large" ? 736 : 378;
}, [height, size]);
var maskMotion = {
motionName: getTransitionName(prefixCls, "mask-motion"),
motionAppear: true,
motionEnter: true,
motionLeave: true,
motionDeadline: 500
};
var panelMotion = function panelMotion2(motionPlacement) {
return {
motionName: getTransitionName(prefixCls, "panel-motion-".concat(motionPlacement)),
motionAppear: true,
motionEnter: true,
motionLeave: true,
motionDeadline: 500
};
};
return /* @__PURE__ */ jsx(NoCompactStyle, {
children: /* @__PURE__ */ jsx(NoFormStyle, {
status: true,
override: true,
children: /* @__PURE__ */ jsx(Drawer$1, {
prefixCls,
onClose,
...rest,
open: open !== null && open !== void 0 ? open : visible,
mask,
push,
width: mergedWidth,
height: mergedHeight,
rootClassName: drawerClassName,
getContainer: getContainer2,
afterOpenChange: function afterOpenChange(isOpen) {
_afterOpenChange === null || _afterOpenChange === void 0 ? void 0 : _afterOpenChange(isOpen);
afterVisibleChange === null || afterVisibleChange === void 0 ? void 0 : afterVisibleChange(isOpen);
},
maskMotion,
motion: panelMotion,
rootStyle: style2,
children: /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-wrapper-body"),
style: _extends$3({}, drawerStyle),
children: [renderHeader(), /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-body"),
style: bodyStyle,
children
}), renderFooter()]
})
})
})
});
}
function useDebounce(value) {
var _React$useState = React__namespace.useState(value), _React$useState2 = _slicedToArray$e(_React$useState, 2), cacheValue = _React$useState2[0], setCacheValue = _React$useState2[1];
React__namespace.useEffect(function() {
var timeout = setTimeout(function() {
setCacheValue(value);
}, value.length ? 0 : 10);
return function() {
clearTimeout(timeout);
};
}, [value]);
return cacheValue;
}
var EMPTY_LIST$2 = [];
function toErrorEntity(error, errorStatus, prefix) {
var index2 = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : 0;
return {
key: typeof error === "string" ? error : "".concat(prefix, "-").concat(index2),
error,
errorStatus
};
}
function ErrorList(_ref) {
var help = _ref.help, helpStatus = _ref.helpStatus, _ref$errors = _ref.errors, errors = _ref$errors === void 0 ? EMPTY_LIST$2 : _ref$errors, _ref$warnings = _ref.warnings, warnings = _ref$warnings === void 0 ? EMPTY_LIST$2 : _ref$warnings, rootClassName = _ref.className, fieldId = _ref.fieldId, onVisibleChanged = _ref.onVisibleChanged;
var _React$useContext = React__namespace.useContext(FormItemPrefixContext), prefixCls = _React$useContext.prefixCls;
var _React$useContext2 = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext2.getPrefixCls;
var baseClassName = "".concat(prefixCls, "-item-explain");
var rootPrefixCls = getPrefixCls();
var debounceErrors = useDebounce(errors);
var debounceWarnings = useDebounce(warnings);
var fullKeyList = React__namespace.useMemo(function() {
if (help !== void 0 && help !== null) {
return [toErrorEntity(help, helpStatus, "help")];
}
return [].concat(_toConsumableArray$c(debounceErrors.map(function(error, index2) {
return toErrorEntity(error, "error", "error", index2);
})), _toConsumableArray$c(debounceWarnings.map(function(warning2, index2) {
return toErrorEntity(warning2, "warning", "warning", index2);
})));
}, [help, helpStatus, debounceErrors, debounceWarnings]);
var helpProps = {};
if (fieldId) {
helpProps.id = "".concat(fieldId, "_help");
}
return /* @__PURE__ */ jsx(CSSMotion, {
motionDeadline: collapseMotion$1.motionDeadline,
motionName: "".concat(rootPrefixCls, "-show-help"),
visible: !!fullKeyList.length,
onVisibleChanged,
children: function(holderProps) {
var holderClassName = holderProps.className, holderStyle = holderProps.style;
return /* @__PURE__ */ jsx("div", {
...helpProps,
className: classnames(baseClassName, holderClassName, rootClassName),
style: holderStyle,
role: "alert",
children: /* @__PURE__ */ jsx(CSSMotionList, {
keys: fullKeyList,
...collapseMotion$1,
motionName: "".concat(rootPrefixCls, "-show-help-item"),
component: false,
children: function(itemProps) {
var key2 = itemProps.key, error = itemProps.error, errorStatus = itemProps.errorStatus, itemClassName = itemProps.className, itemStyle = itemProps.style;
return /* @__PURE__ */ jsx("div", {
className: classnames(itemClassName, _defineProperty$b({}, "".concat(baseClassName, "-").concat(errorStatus), errorStatus)),
style: itemStyle,
children: error
}, key2);
}
})
});
}
});
}
function t$2(t2) {
return "object" == typeof t2 && null != t2 && 1 === t2.nodeType;
}
function e$1(t2, e2) {
return (!e2 || "hidden" !== t2) && "visible" !== t2 && "clip" !== t2;
}
function n$2(t2, n2) {
if (t2.clientHeight < t2.scrollHeight || t2.clientWidth < t2.scrollWidth) {
var r2 = getComputedStyle(t2, null);
return e$1(r2.overflowY, n2) || e$1(r2.overflowX, n2) || function(t3) {
var e2 = function(t4) {
if (!t4.ownerDocument || !t4.ownerDocument.defaultView)
return null;
try {
return t4.ownerDocument.defaultView.frameElement;
} catch (t5) {
return null;
}
}(t3);
return !!e2 && (e2.clientHeight < t3.scrollHeight || e2.clientWidth < t3.scrollWidth);
}(t2);
}
return false;
}
function r$2(t2, e2, n2, r2, i2, o, l2, d2) {
return o < t2 && l2 > e2 || o > t2 && l2 < e2 ? 0 : o <= t2 && d2 <= n2 || l2 >= e2 && d2 >= n2 ? o - t2 - r2 : l2 > e2 && d2 < n2 || o < t2 && d2 > n2 ? l2 - e2 + i2 : 0;
}
var i$1 = function(e2, i2) {
var o = window, l2 = i2.scrollMode, d2 = i2.block, f2 = i2.inline, h2 = i2.boundary, u2 = i2.skipOverflowHiddenElements, s = "function" == typeof h2 ? h2 : function(t2) {
return t2 !== h2;
};
if (!t$2(e2))
throw new TypeError("Invalid target");
for (var a, c2, g2 = document.scrollingElement || document.documentElement, p2 = [], m2 = e2; t$2(m2) && s(m2); ) {
if ((m2 = null == (c2 = (a = m2).parentElement) ? a.getRootNode().host || null : c2) === g2) {
p2.push(m2);
break;
}
null != m2 && m2 === document.body && n$2(m2) && !n$2(document.documentElement) || null != m2 && n$2(m2, u2) && p2.push(m2);
}
for (var w2 = o.visualViewport ? o.visualViewport.width : innerWidth, v2 = o.visualViewport ? o.visualViewport.height : innerHeight, W = window.scrollX || pageXOffset, H = window.scrollY || pageYOffset, b2 = e2.getBoundingClientRect(), y2 = b2.height, E = b2.width, M = b2.top, V = b2.right, x2 = b2.bottom, I = b2.left, C = "start" === d2 || "nearest" === d2 ? M : "end" === d2 ? x2 : M + y2 / 2, R = "center" === f2 ? I + E / 2 : "end" === f2 ? V : I, T = [], k2 = 0; k2 < p2.length; k2++) {
var B = p2[k2], D = B.getBoundingClientRect(), O = D.height, X = D.width, Y = D.top, L = D.right, S = D.bottom, j2 = D.left;
if ("if-needed" === l2 && M >= 0 && I >= 0 && x2 <= v2 && V <= w2 && M >= Y && x2 <= S && I >= j2 && V <= L)
return T;
var N = getComputedStyle(B), q2 = parseInt(N.borderLeftWidth, 10), z2 = parseInt(N.borderTopWidth, 10), A2 = parseInt(N.borderRightWidth, 10), F = parseInt(N.borderBottomWidth, 10), G = 0, J = 0, K = "offsetWidth" in B ? B.offsetWidth - B.clientWidth - q2 - A2 : 0, P = "offsetHeight" in B ? B.offsetHeight - B.clientHeight - z2 - F : 0, Q = "offsetWidth" in B ? 0 === B.offsetWidth ? 0 : X / B.offsetWidth : 0, U = "offsetHeight" in B ? 0 === B.offsetHeight ? 0 : O / B.offsetHeight : 0;
if (g2 === B)
G = "start" === d2 ? C : "end" === d2 ? C - v2 : "nearest" === d2 ? r$2(H, H + v2, v2, z2, F, H + C, H + C + y2, y2) : C - v2 / 2, J = "start" === f2 ? R : "center" === f2 ? R - w2 / 2 : "end" === f2 ? R - w2 : r$2(W, W + w2, w2, q2, A2, W + R, W + R + E, E), G = Math.max(0, G + H), J = Math.max(0, J + W);
else {
G = "start" === d2 ? C - Y - z2 : "end" === d2 ? C - S + F + P : "nearest" === d2 ? r$2(Y, S, O, z2, F + P, C, C + y2, y2) : C - (Y + O / 2) + P / 2, J = "start" === f2 ? R - j2 - q2 : "center" === f2 ? R - (j2 + X / 2) + K / 2 : "end" === f2 ? R - L + A2 + K : r$2(j2, L, X, q2, A2 + K, R, R + E, E);
var Z = B.scrollLeft, $ = B.scrollTop;
C += $ - (G = Math.max(0, Math.min($ + G / U, B.scrollHeight - O / U + P))), R += Z - (J = Math.max(0, Math.min(Z + J / Q, B.scrollWidth - X / Q + K)));
}
T.push({ el: B, top: G, left: J });
}
return T;
};
function isOptionsObject(options) {
return options === Object(options) && Object.keys(options).length !== 0;
}
function defaultBehavior(actions, behavior) {
if (behavior === void 0) {
behavior = "auto";
}
var canSmoothScroll = "scrollBehavior" in document.body.style;
actions.forEach(function(_ref) {
var el = _ref.el, top = _ref.top, left = _ref.left;
if (el.scroll && canSmoothScroll) {
el.scroll({
top,
left,
behavior
});
} else {
el.scrollTop = top;
el.scrollLeft = left;
}
});
}
function getOptions(options) {
if (options === false) {
return {
block: "end",
inline: "nearest"
};
}
if (isOptionsObject(options)) {
return options;
}
return {
block: "start",
inline: "nearest"
};
}
function scrollIntoView(target, options) {
var isTargetAttached = target.isConnected || target.ownerDocument.documentElement.contains(target);
if (isOptionsObject(options) && typeof options.behavior === "function") {
return options.behavior(isTargetAttached ? i$1(target, options) : []);
}
if (!isTargetAttached) {
return;
}
var computeOptions = getOptions(options);
return defaultBehavior(i$1(target, computeOptions), computeOptions.behavior);
}
var formItemNameBlackList = ["parentNode"];
var defaultItemNamePrefixCls = "form_item";
function toArray$4(candidate) {
if (candidate === void 0 || candidate === false)
return [];
return Array.isArray(candidate) ? candidate : [candidate];
}
function getFieldId(namePath, formName) {
if (!namePath.length)
return void 0;
var mergedId = namePath.join("_");
if (formName) {
return "".concat(formName, "_").concat(mergedId);
}
var isIllegalName = formItemNameBlackList.includes(mergedId);
return isIllegalName ? "".concat(defaultItemNamePrefixCls, "_").concat(mergedId) : mergedId;
}
function toNamePathStr(name2) {
var namePath = toArray$4(name2);
return namePath.join("_");
}
function useForm$1(form) {
var _useRcForm = useForm$2(), _useRcForm2 = _slicedToArray$e(_useRcForm, 1), rcForm = _useRcForm2[0];
var itemsRef = React__namespace.useRef({});
var wrapForm = React__namespace.useMemo(function() {
return form !== null && form !== void 0 ? form : _extends$3(_extends$3({}, rcForm), {
__INTERNAL__: {
itemRef: function itemRef(name2) {
return function(node) {
var namePathStr = toNamePathStr(name2);
if (node) {
itemsRef.current[namePathStr] = node;
} else {
delete itemsRef.current[namePathStr];
}
};
}
},
scrollToField: function scrollToField(name2) {
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var namePath = toArray$4(name2);
var fieldId = getFieldId(namePath, wrapForm.__INTERNAL__.name);
var node = fieldId ? document.getElementById(fieldId) : null;
if (node) {
scrollIntoView(node, _extends$3({
scrollMode: "if-needed",
block: "nearest"
}, options));
}
},
getFieldInstance: function getFieldInstance(name2) {
var namePathStr = toNamePathStr(name2);
return itemsRef.current[namePathStr];
}
});
}, [form, rcForm]);
return [wrapForm];
}
var __rest$n = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var InternalForm = function InternalForm2(props, ref) {
var _classNames;
var contextSize = React__namespace.useContext(SizeContext$1);
var contextDisabled = React__namespace.useContext(DisabledContext$1);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction, contextForm = _React$useContext.form;
var customizePrefixCls = props.prefixCls, _props$className = props.className, className = _props$className === void 0 ? "" : _props$className, _props$size = props.size, size = _props$size === void 0 ? contextSize : _props$size, _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? contextDisabled : _props$disabled, form = props.form, colon = props.colon, labelAlign = props.labelAlign, labelWrap = props.labelWrap, labelCol = props.labelCol, wrapperCol = props.wrapperCol, hideRequiredMark = props.hideRequiredMark, _props$layout = props.layout, layout = _props$layout === void 0 ? "horizontal" : _props$layout, scrollToFirstError = props.scrollToFirstError, requiredMark = props.requiredMark, onFinishFailed = props.onFinishFailed, name2 = props.name, restFormProps = __rest$n(props, ["prefixCls", "className", "size", "disabled", "form", "colon", "labelAlign", "labelWrap", "labelCol", "wrapperCol", "hideRequiredMark", "layout", "scrollToFirstError", "requiredMark", "onFinishFailed", "name"]);
var mergedRequiredMark = React$a.useMemo(function() {
if (requiredMark !== void 0) {
return requiredMark;
}
if (contextForm && contextForm.requiredMark !== void 0) {
return contextForm.requiredMark;
}
if (hideRequiredMark) {
return false;
}
return true;
}, [hideRequiredMark, requiredMark, contextForm]);
var mergedColon = colon !== null && colon !== void 0 ? colon : contextForm === null || contextForm === void 0 ? void 0 : contextForm.colon;
var prefixCls = getPrefixCls("form", customizePrefixCls);
var formClassName = classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(layout), true), _defineProperty$b(_classNames, "".concat(prefixCls, "-hide-required-mark"), mergedRequiredMark === false), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(size), size), _classNames), className);
var _useForm = useForm$1(form), _useForm2 = _slicedToArray$e(_useForm, 1), wrapForm = _useForm2[0];
var __INTERNAL__ = wrapForm.__INTERNAL__;
__INTERNAL__.name = name2;
var formContextValue = React$a.useMemo(function() {
return {
name: name2,
labelAlign,
labelCol,
labelWrap,
wrapperCol,
vertical: layout === "vertical",
colon: mergedColon,
requiredMark: mergedRequiredMark,
itemRef: __INTERNAL__.itemRef,
form: wrapForm
};
}, [name2, labelAlign, labelCol, wrapperCol, layout, mergedColon, mergedRequiredMark, wrapForm]);
React__namespace.useImperativeHandle(ref, function() {
return wrapForm;
});
var onInternalFinishFailed = function onInternalFinishFailed2(errorInfo) {
onFinishFailed === null || onFinishFailed === void 0 ? void 0 : onFinishFailed(errorInfo);
var defaultScrollToFirstError = {
block: "nearest"
};
if (scrollToFirstError && errorInfo.errorFields.length) {
if (_typeof$q(scrollToFirstError) === "object") {
defaultScrollToFirstError = scrollToFirstError;
}
wrapForm.scrollToField(errorInfo.errorFields[0].name, defaultScrollToFirstError);
}
};
return /* @__PURE__ */ jsx(DisabledContextProvider, {
disabled,
children: /* @__PURE__ */ jsx(SizeContextProvider, {
size,
children: /* @__PURE__ */ jsx(FormContext.Provider, {
value: formContextValue,
children: /* @__PURE__ */ jsx(RefForm, {
id: name2,
...restFormProps,
name: name2,
onFinishFailed: onInternalFinishFailed,
form: wrapForm,
className: formClassName
})
})
})
});
};
var Form$1 = /* @__PURE__ */ React__namespace.forwardRef(InternalForm);
const InternalForm$1 = Form$1;
var useFormItemStatus = function useFormItemStatus2() {
var _useContext = React$a.useContext(FormItemInputContext), status = _useContext.status;
return {
status
};
};
const useFormItemStatus$1 = useFormItemStatus;
function useFrameState(defaultValue) {
var _React$useState = React__namespace.useState(defaultValue), _React$useState2 = _slicedToArray$e(_React$useState, 2), value = _React$useState2[0], setValue2 = _React$useState2[1];
var frameRef = React$a.useRef(null);
var batchRef = React$a.useRef([]);
var destroyRef = React$a.useRef(false);
React__namespace.useEffect(function() {
destroyRef.current = false;
return function() {
destroyRef.current = true;
wrapperRaf$1.cancel(frameRef.current);
frameRef.current = null;
};
}, []);
function setFrameValue(updater) {
if (destroyRef.current) {
return;
}
if (frameRef.current === null) {
batchRef.current = [];
frameRef.current = wrapperRaf$1(function() {
frameRef.current = null;
setValue2(function(prevValue) {
var current = prevValue;
batchRef.current.forEach(function(func) {
current = func(current);
});
return current;
});
});
}
batchRef.current.push(updater);
}
return [value, setFrameValue];
}
function useItemRef() {
var _React$useContext = React__namespace.useContext(FormContext), itemRef = _React$useContext.itemRef;
var cacheRef = React__namespace.useRef({});
function getRef(name2, children) {
var childrenRef = children && _typeof$q(children) === "object" && children.ref;
var nameStr = name2.join("_");
if (cacheRef.current.name !== nameStr || cacheRef.current.originRef !== childrenRef) {
cacheRef.current.name = nameStr;
cacheRef.current.originRef = childrenRef;
cacheRef.current.ref = composeRef(itemRef(name2), childrenRef);
}
return cacheRef.current.ref;
}
return getRef;
}
var QuestionCircleOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z" } }, { "tag": "path", "attrs": { "d": "M623.6 316.7C593.6 290.4 554 276 512 276s-81.6 14.5-111.6 40.7C369.2 344 352 380.7 352 420v7.6c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V420c0-44.1 43.1-80 96-80s96 35.9 96 80c0 31.1-22 59.6-56.1 72.7-21.2 8.1-39.2 22.3-52.1 40.9-13.1 19-19.9 41.8-19.9 64.9V620c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-22.7a48.3 48.3 0 0130.9-44.8c59-22.7 97.1-74.7 97.1-132.5.1-39.3-17.1-76-48.3-103.3zM472 732a40 40 0 1080 0 40 40 0 10-80 0z" } }] }, "name": "question-circle", "theme": "outlined" };
const QuestionCircleOutlinedSvg = QuestionCircleOutlined$2;
var QuestionCircleOutlined = function QuestionCircleOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: QuestionCircleOutlinedSvg
})
});
};
QuestionCircleOutlined.displayName = "QuestionCircleOutlined";
const QuestionCircleOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(QuestionCircleOutlined);
var __rest$m = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
function toTooltipProps(tooltip) {
if (!tooltip) {
return null;
}
if (_typeof$q(tooltip) === "object" && !/* @__PURE__ */ React__namespace.isValidElement(tooltip)) {
return tooltip;
}
return {
title: tooltip
};
}
var FormItemLabel = function FormItemLabel2(_ref) {
var prefixCls = _ref.prefixCls, label = _ref.label, htmlFor = _ref.htmlFor, labelCol = _ref.labelCol, labelAlign = _ref.labelAlign, colon = _ref.colon, required2 = _ref.required, requiredMark = _ref.requiredMark, tooltip = _ref.tooltip;
var _useLocaleReceiver = useLocaleReceiver("Form"), _useLocaleReceiver2 = _slicedToArray$e(_useLocaleReceiver, 1), formLocale = _useLocaleReceiver2[0];
if (!label)
return null;
return /* @__PURE__ */ jsx(FormContext.Consumer, {
children: function(_ref2) {
var _classNames2;
var vertical = _ref2.vertical, contextLabelAlign = _ref2.labelAlign, contextLabelCol = _ref2.labelCol, labelWrap = _ref2.labelWrap, contextColon = _ref2.colon;
var _a;
var mergedLabelCol = labelCol || contextLabelCol || {};
var mergedLabelAlign = labelAlign || contextLabelAlign;
var labelClsBasic = "".concat(prefixCls, "-item-label");
var labelColClassName = classnames(labelClsBasic, mergedLabelAlign === "left" && "".concat(labelClsBasic, "-left"), mergedLabelCol.className, _defineProperty$b({}, "".concat(labelClsBasic, "-wrap"), !!labelWrap));
var labelChildren = label;
var computedColon = colon === true || contextColon !== false && colon !== false;
var haveColon = computedColon && !vertical;
if (haveColon && typeof label === "string" && label.trim() !== "") {
labelChildren = label.replace(/[:|:]\s*$/, "");
}
var tooltipProps = toTooltipProps(tooltip);
if (tooltipProps) {
var _tooltipProps$icon = tooltipProps.icon, icon = _tooltipProps$icon === void 0 ? /* @__PURE__ */ jsx(QuestionCircleOutlined$1, {}) : _tooltipProps$icon, restTooltipProps = __rest$m(tooltipProps, ["icon"]);
var tooltipNode = /* @__PURE__ */ jsx(_Tooltip, {
...restTooltipProps,
children: /* @__PURE__ */ React__namespace.cloneElement(icon, {
className: "".concat(prefixCls, "-item-tooltip"),
title: ""
})
});
labelChildren = /* @__PURE__ */ jsxs(Fragment, {
children: [labelChildren, tooltipNode]
});
}
if (requiredMark === "optional" && !required2) {
labelChildren = /* @__PURE__ */ jsxs(Fragment, {
children: [labelChildren, /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-item-optional"),
title: "",
children: (formLocale === null || formLocale === void 0 ? void 0 : formLocale.optional) || ((_a = defaultLocale.Form) === null || _a === void 0 ? void 0 : _a.optional)
})]
});
}
var labelClassName = classnames((_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-item-required"), required2), _defineProperty$b(_classNames2, "".concat(prefixCls, "-item-required-mark-optional"), requiredMark === "optional"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-item-no-colon"), !computedColon), _classNames2));
return /* @__PURE__ */ jsx(Col$1, {
...mergedLabelCol,
className: labelColClassName,
children: /* @__PURE__ */ jsx("label", {
htmlFor,
className: labelClassName,
title: typeof label === "string" ? label : "",
children: labelChildren
})
});
}
}, "label");
};
const FormItemLabel$1 = FormItemLabel;
var FormItemInput = function FormItemInput2(props) {
var prefixCls = props.prefixCls, status = props.status, wrapperCol = props.wrapperCol, children = props.children, errors = props.errors, warnings = props.warnings, formItemRender = props._internalItemRender, extra = props.extra, help = props.help, fieldId = props.fieldId, marginBottom = props.marginBottom, onErrorVisibleChanged = props.onErrorVisibleChanged;
var baseClassName = "".concat(prefixCls, "-item");
var formContext = React__namespace.useContext(FormContext);
var mergedWrapperCol = wrapperCol || formContext.wrapperCol || {};
var className = classnames("".concat(baseClassName, "-control"), mergedWrapperCol.className);
var subFormContext = React__namespace.useMemo(function() {
return _extends$3({}, formContext);
}, [formContext]);
delete subFormContext.labelCol;
delete subFormContext.wrapperCol;
var inputDom = /* @__PURE__ */ jsx("div", {
className: "".concat(baseClassName, "-control-input"),
children: /* @__PURE__ */ jsx("div", {
className: "".concat(baseClassName, "-control-input-content"),
children
})
});
var formItemContext = React__namespace.useMemo(function() {
return {
prefixCls,
status
};
}, [prefixCls, status]);
var errorListDom = marginBottom !== null || errors.length || warnings.length ? /* @__PURE__ */ jsxs("div", {
style: {
display: "flex",
flexWrap: "nowrap"
},
children: [/* @__PURE__ */ jsx(FormItemPrefixContext.Provider, {
value: formItemContext,
children: /* @__PURE__ */ jsx(ErrorList, {
fieldId,
errors,
warnings,
help,
helpStatus: status,
className: "".concat(baseClassName, "-explain-connected"),
onVisibleChanged: onErrorVisibleChanged
})
}), !!marginBottom && /* @__PURE__ */ jsx("div", {
style: {
width: 0,
height: marginBottom
}
})]
}) : null;
var extraProps = {};
if (fieldId) {
extraProps.id = "".concat(fieldId, "_extra");
}
var extraDom = extra ? /* @__PURE__ */ jsx("div", {
...extraProps,
className: "".concat(baseClassName, "-extra"),
children: extra
}) : null;
var dom = formItemRender && formItemRender.mark === "pro_table_render" && formItemRender.render ? formItemRender.render(props, {
input: inputDom,
errorList: errorListDom,
extra: extraDom
}) : /* @__PURE__ */ jsxs(Fragment, {
children: [inputDom, errorListDom, extraDom]
});
return /* @__PURE__ */ jsx(FormContext.Provider, {
value: subFormContext,
children: /* @__PURE__ */ jsx(Col$1, {
...mergedWrapperCol,
className,
children: dom
})
});
};
const FormItemInput$1 = FormItemInput;
var __rest$l = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var iconMap = {
success: CheckCircleFilled$1,
warning: ExclamationCircleFilled$1,
error: CloseCircleFilled$1,
validating: LoadingOutlined$1
};
function ItemHolder(props) {
var _itemClassName;
var prefixCls = props.prefixCls, className = props.className, style2 = props.style, help = props.help, errors = props.errors, warnings = props.warnings, validateStatus = props.validateStatus, meta2 = props.meta, hasFeedback = props.hasFeedback, hidden = props.hidden, children = props.children, fieldId = props.fieldId, isRequired = props.isRequired, onSubItemMetaChange = props.onSubItemMetaChange, restProps = __rest$l(props, ["prefixCls", "className", "style", "help", "errors", "warnings", "validateStatus", "meta", "hasFeedback", "hidden", "children", "fieldId", "isRequired", "onSubItemMetaChange"]);
var itemPrefixCls = "".concat(prefixCls, "-item");
var _React$useContext = React__namespace.useContext(FormContext), requiredMark = _React$useContext.requiredMark;
var itemRef = React__namespace.useRef(null);
var debounceErrors = useDebounce(errors);
var debounceWarnings = useDebounce(warnings);
var hasHelp = help !== void 0 && help !== null;
var hasError = !!(hasHelp || errors.length || warnings.length);
var _React$useState = React__namespace.useState(null), _React$useState2 = _slicedToArray$e(_React$useState, 2), marginBottom = _React$useState2[0], setMarginBottom = _React$useState2[1];
useLayoutEffect$1(function() {
if (hasError && itemRef.current) {
var itemStyle = getComputedStyle(itemRef.current);
setMarginBottom(parseInt(itemStyle.marginBottom, 10));
}
}, [hasError]);
var onErrorVisibleChanged = function onErrorVisibleChanged2(nextVisible) {
if (!nextVisible) {
setMarginBottom(null);
}
};
var mergedValidateStatus = "";
if (validateStatus !== void 0) {
mergedValidateStatus = validateStatus;
} else if (meta2.validating) {
mergedValidateStatus = "validating";
} else if (debounceErrors.length) {
mergedValidateStatus = "error";
} else if (debounceWarnings.length) {
mergedValidateStatus = "warning";
} else if (meta2.touched) {
mergedValidateStatus = "success";
}
var formItemStatusContext = React__namespace.useMemo(function() {
var feedbackIcon;
if (hasFeedback) {
var IconNode = mergedValidateStatus && iconMap[mergedValidateStatus];
feedbackIcon = IconNode ? /* @__PURE__ */ jsx("span", {
className: classnames("".concat(itemPrefixCls, "-feedback-icon"), "".concat(itemPrefixCls, "-feedback-icon-").concat(mergedValidateStatus)),
children: /* @__PURE__ */ jsx(IconNode, {})
}) : null;
}
return {
status: mergedValidateStatus,
hasFeedback,
feedbackIcon,
isFormItemInput: true
};
}, [mergedValidateStatus, hasFeedback]);
var itemClassName = (_itemClassName = {}, _defineProperty$b(_itemClassName, itemPrefixCls, true), _defineProperty$b(_itemClassName, "".concat(itemPrefixCls, "-with-help"), hasHelp || debounceErrors.length || debounceWarnings.length), _defineProperty$b(_itemClassName, "".concat(className), !!className), _defineProperty$b(_itemClassName, "".concat(itemPrefixCls, "-has-feedback"), mergedValidateStatus && hasFeedback), _defineProperty$b(_itemClassName, "".concat(itemPrefixCls, "-has-success"), mergedValidateStatus === "success"), _defineProperty$b(_itemClassName, "".concat(itemPrefixCls, "-has-warning"), mergedValidateStatus === "warning"), _defineProperty$b(_itemClassName, "".concat(itemPrefixCls, "-has-error"), mergedValidateStatus === "error"), _defineProperty$b(_itemClassName, "".concat(itemPrefixCls, "-is-validating"), mergedValidateStatus === "validating"), _defineProperty$b(_itemClassName, "".concat(itemPrefixCls, "-hidden"), hidden), _itemClassName);
return /* @__PURE__ */ jsxs("div", {
className: classnames(itemClassName),
style: style2,
ref: itemRef,
children: [/* @__PURE__ */ jsxs(Row$1, {
className: "".concat(itemPrefixCls, "-row"),
...omit(restProps, ["_internalItemRender", "colon", "dependencies", "extra", "fieldKey", "getValueFromEvent", "getValueProps", "htmlFor", "id", "initialValue", "isListField", "label", "labelAlign", "labelCol", "labelWrap", "messageVariables", "name", "normalize", "noStyle", "preserve", "required", "requiredMark", "rules", "shouldUpdate", "trigger", "tooltip", "validateFirst", "validateTrigger", "valuePropName", "wrapperCol"]),
children: [/* @__PURE__ */ jsx(FormItemLabel$1, {
htmlFor: fieldId,
required: isRequired,
requiredMark,
...props,
prefixCls
}), /* @__PURE__ */ jsx(FormItemInput$1, {
...props,
...meta2,
errors: debounceErrors,
warnings: debounceWarnings,
prefixCls,
status: mergedValidateStatus,
help,
marginBottom,
onErrorVisibleChanged,
children: /* @__PURE__ */ jsx(NoStyleItemContext.Provider, {
value: onSubItemMetaChange,
children: /* @__PURE__ */ jsx(FormItemInputContext.Provider, {
value: formItemStatusContext,
children
})
})
})]
}), !!marginBottom && /* @__PURE__ */ jsx("div", {
className: "".concat(itemPrefixCls, "-margin-offset"),
style: {
marginBottom: -marginBottom
}
})]
});
}
var NAME_SPLIT = "__SPLIT__";
tuple$1("success", "warning", "error", "validating", "");
var MemoInput = /* @__PURE__ */ React__namespace.memo(function(_ref) {
var children = _ref.children;
return children;
}, function(prev, next) {
return prev.value === next.value && prev.update === next.update && prev.childProps.length === next.childProps.length && prev.childProps.every(function(value, index2) {
return value === next.childProps[index2];
});
});
function hasValidName(name2) {
return !(name2 === void 0 || name2 === null);
}
function genEmptyMeta() {
return {
errors: [],
warnings: [],
touched: false,
validating: false,
name: []
};
}
function InternalFormItem(props) {
var name2 = props.name, noStyle = props.noStyle, dependencies = props.dependencies, customizePrefixCls = props.prefixCls, shouldUpdate = props.shouldUpdate, rules2 = props.rules, children = props.children, required2 = props.required, label = props.label, messageVariables = props.messageVariables, _props$trigger = props.trigger, trigger = _props$trigger === void 0 ? "onChange" : _props$trigger, validateTrigger = props.validateTrigger, hidden = props.hidden;
var _useContext = React$a.useContext(ConfigContext$1), getPrefixCls = _useContext.getPrefixCls;
var _useContext2 = React$a.useContext(FormContext), formName = _useContext2.name;
var isRenderProps = typeof children === "function";
var notifyParentMetaChange = React$a.useContext(NoStyleItemContext);
var _useContext3 = React$a.useContext(Context$2), contextValidateTrigger = _useContext3.validateTrigger;
var mergedValidateTrigger = validateTrigger !== void 0 ? validateTrigger : contextValidateTrigger;
var hasName = hasValidName(name2);
var prefixCls = getPrefixCls("form", customizePrefixCls);
var listContext = React__namespace.useContext(ListContext);
var fieldKeyPathRef = React__namespace.useRef();
var _useFrameState = useFrameState({}), _useFrameState2 = _slicedToArray$e(_useFrameState, 2), subFieldErrors = _useFrameState2[0], setSubFieldErrors = _useFrameState2[1];
var _useState = useSafeState(function() {
return genEmptyMeta();
}), _useState2 = _slicedToArray$e(_useState, 2), meta2 = _useState2[0], setMeta2 = _useState2[1];
var onMetaChange = function onMetaChange2(nextMeta) {
var keyInfo = listContext === null || listContext === void 0 ? void 0 : listContext.getKey(nextMeta.name);
setMeta2(nextMeta.destroy ? genEmptyMeta() : nextMeta, true);
if (noStyle && notifyParentMetaChange) {
var namePath = nextMeta.name;
if (!nextMeta.destroy) {
if (keyInfo !== void 0) {
var _keyInfo = _slicedToArray$e(keyInfo, 2), fieldKey = _keyInfo[0], restPath = _keyInfo[1];
namePath = [fieldKey].concat(_toConsumableArray$c(restPath));
fieldKeyPathRef.current = namePath;
}
} else {
namePath = fieldKeyPathRef.current || namePath;
}
notifyParentMetaChange(nextMeta, namePath);
}
};
var onSubItemMetaChange = function onSubItemMetaChange2(subMeta, uniqueKeys) {
setSubFieldErrors(function(prevSubFieldErrors) {
var clone = _extends$3({}, prevSubFieldErrors);
var mergedNamePath = [].concat(_toConsumableArray$c(subMeta.name.slice(0, -1)), _toConsumableArray$c(uniqueKeys));
var mergedNameKey = mergedNamePath.join(NAME_SPLIT);
if (subMeta.destroy) {
delete clone[mergedNameKey];
} else {
clone[mergedNameKey] = subMeta;
}
return clone;
});
};
var _React$useMemo = React__namespace.useMemo(function() {
var errorList = _toConsumableArray$c(meta2.errors);
var warningList = _toConsumableArray$c(meta2.warnings);
Object.values(subFieldErrors).forEach(function(subFieldError) {
errorList.push.apply(errorList, _toConsumableArray$c(subFieldError.errors || []));
warningList.push.apply(warningList, _toConsumableArray$c(subFieldError.warnings || []));
});
return [errorList, warningList];
}, [subFieldErrors, meta2.errors, meta2.warnings]), _React$useMemo2 = _slicedToArray$e(_React$useMemo, 2), mergedErrors = _React$useMemo2[0], mergedWarnings = _React$useMemo2[1];
var getItemRef = useItemRef();
function renderLayout(baseChildren, fieldId, isRequired) {
if (noStyle && !hidden) {
return baseChildren;
}
return /* @__PURE__ */ jsx(ItemHolder, {
...props,
prefixCls,
fieldId,
isRequired,
errors: mergedErrors,
warnings: mergedWarnings,
meta: meta2,
onSubItemMetaChange,
children: baseChildren
}, "row");
}
if (!hasName && !isRenderProps && !dependencies) {
return renderLayout(children);
}
var variables = {};
if (typeof label === "string") {
variables.label = label;
} else if (name2) {
variables.label = String(name2);
}
if (messageVariables) {
variables = _extends$3(_extends$3({}, variables), messageVariables);
}
return /* @__PURE__ */ jsx(WrapperField, {
...props,
messageVariables: variables,
trigger,
validateTrigger: mergedValidateTrigger,
onMetaChange,
children: function(control, renderMeta, context2) {
var mergedName = toArray$4(name2).length && renderMeta ? renderMeta.name : [];
var fieldId = getFieldId(mergedName, formName);
var isRequired = required2 !== void 0 ? required2 : !!(rules2 && rules2.some(function(rule) {
if (rule && _typeof$q(rule) === "object" && rule.required && !rule.warningOnly) {
return true;
}
if (typeof rule === "function") {
var ruleEntity = rule(context2);
return ruleEntity && ruleEntity.required && !ruleEntity.warningOnly;
}
return false;
}));
var mergedControl = _extends$3({}, control);
var childNode = null;
if (Array.isArray(children) && hasName) {
childNode = children;
} else if (isRenderProps && (!(shouldUpdate || dependencies) || hasName))
;
else if (dependencies && !isRenderProps && !hasName)
;
else if (isValidElement(children)) {
var childProps = _extends$3(_extends$3({}, children.props), mergedControl);
if (!childProps.id) {
childProps.id = fieldId;
}
if (props.help || mergedErrors.length > 0 || mergedWarnings.length > 0 || props.extra) {
var describedbyArr = [];
if (props.help || mergedErrors.length > 0) {
describedbyArr.push("".concat(fieldId, "_help"));
}
if (props.extra) {
describedbyArr.push("".concat(fieldId, "_extra"));
}
childProps["aria-describedby"] = describedbyArr.join(" ");
}
if (mergedErrors.length > 0) {
childProps["aria-invalid"] = "true";
}
if (isRequired) {
childProps["aria-required"] = "true";
}
if (supportRef(children)) {
childProps.ref = getItemRef(mergedName, children);
}
var triggers = new Set([].concat(_toConsumableArray$c(toArray$4(trigger)), _toConsumableArray$c(toArray$4(mergedValidateTrigger))));
triggers.forEach(function(eventName) {
childProps[eventName] = function() {
var _a2, _c2;
var _a, _b, _c;
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
(_a = mergedControl[eventName]) === null || _a === void 0 ? void 0 : (_a2 = _a).call.apply(_a2, [mergedControl].concat(args));
(_c = (_b = children.props)[eventName]) === null || _c === void 0 ? void 0 : (_c2 = _c).call.apply(_c2, [_b].concat(args));
};
});
var watchingChildProps = [childProps["aria-required"], childProps["aria-invalid"], childProps["aria-describedby"]];
childNode = /* @__PURE__ */ jsx(MemoInput, {
value: mergedControl[props.valuePropName || "value"],
update: children,
childProps: watchingChildProps,
children: cloneElement(children, childProps)
});
} else if (isRenderProps && (shouldUpdate || dependencies) && !hasName) {
childNode = children(context2);
} else {
childNode = children;
}
return renderLayout(childNode, fieldId, isRequired);
}
});
}
var FormItem = InternalFormItem;
FormItem.useStatus = useFormItemStatus$1;
const Item = FormItem;
var __rest$k = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var FormList = function FormList2(_a) {
var customizePrefixCls = _a.prefixCls, children = _a.children, props = __rest$k(_a, ["prefixCls", "children"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var prefixCls = getPrefixCls("form", customizePrefixCls);
var contextValue = React__namespace.useMemo(function() {
return {
prefixCls,
status: "error"
};
}, [prefixCls]);
return /* @__PURE__ */ jsx(List$2, {
...props,
children: function(fields, operation, meta2) {
return /* @__PURE__ */ jsx(FormItemPrefixContext.Provider, {
value: contextValue,
children: children(fields.map(function(field) {
return _extends$3(_extends$3({}, field), {
fieldKey: field.key
});
}), operation, {
errors: meta2.errors,
warnings: meta2.warnings
})
});
}
});
};
const List = FormList;
function useFormInstance() {
var _useContext = React$a.useContext(FormContext), form = _useContext.form;
return form;
}
var Form = InternalForm$1;
Form.Item = Item;
Form.List = List;
Form.ErrorList = ErrorList;
Form.useForm = useForm$1;
Form.useFormInstance = useFormInstance;
Form.useWatch = useWatch;
Form.Provider = FormProvider;
Form.create = function() {
};
const _Form = Form;
var EyeOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M942.2 486.2C847.4 286.5 704.1 186 512 186c-192.2 0-335.4 100.5-430.2 300.3a60.3 60.3 0 000 51.5C176.6 737.5 319.9 838 512 838c192.2 0 335.4-100.5 430.2-300.3 7.7-16.2 7.7-35 0-51.5zM512 766c-161.3 0-279.4-81.8-362.7-254C232.6 339.8 350.7 258 512 258c161.3 0 279.4 81.8 362.7 254C791.5 684.2 673.4 766 512 766zm-4-430c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm0 288c-61.9 0-112-50.1-112-112s50.1-112 112-112 112 50.1 112 112-50.1 112-112 112z" } }] }, "name": "eye", "theme": "outlined" };
const EyeOutlinedSvg = EyeOutlined$2;
var EyeOutlined = function EyeOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: EyeOutlinedSvg
})
});
};
EyeOutlined.displayName = "EyeOutlined";
const EyeOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(EyeOutlined);
function getClientSize() {
var width = document.documentElement.clientWidth;
var height = window.innerHeight || document.documentElement.clientHeight;
return {
width,
height
};
}
function getOffset$1(node) {
var box = node.getBoundingClientRect();
var docElem = document.documentElement;
return {
left: box.left + (window.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || document.body.clientLeft || 0),
top: box.top + (window.pageYOffset || docElem.scrollTop) - (docElem.clientTop || document.body.clientTop || 0)
};
}
function getUseId() {
var fullClone2 = _objectSpread2$a({}, React__namespace);
return fullClone2.useId;
}
var uuid$2 = 0;
function useId$1(id2) {
var _React$useState = React__namespace.useState("ssr-id"), _React$useState2 = _slicedToArray$e(_React$useState, 2), innerId = _React$useState2[0], setInnerId = _React$useState2[1];
var useOriginId = getUseId();
var reactNativeId = useOriginId === null || useOriginId === void 0 ? void 0 : useOriginId();
React__namespace.useEffect(function() {
if (!useOriginId) {
var nextId = uuid$2;
uuid$2 += 1;
setInnerId("rc_unique_".concat(nextId));
}
}, []);
if (id2) {
return id2;
}
return reactNativeId || innerId;
}
function Mask(props) {
var prefixCls = props.prefixCls, style2 = props.style, visible = props.visible, maskProps = props.maskProps, motionName = props.motionName;
return /* @__PURE__ */ jsx(CSSMotion, {
visible,
motionName,
leavedClassName: "".concat(prefixCls, "-mask-hidden"),
children: function(_ref, ref) {
var motionClassName = _ref.className, motionStyle = _ref.style;
return /* @__PURE__ */ jsx("div", {
ref,
style: _objectSpread2$a(_objectSpread2$a({}, motionStyle), style2),
className: classnames("".concat(prefixCls, "-mask"), motionClassName),
...maskProps
});
}
}, "mask");
}
function getMotionName(prefixCls, transitionName2, animationName) {
var motionName = transitionName2;
if (!motionName && animationName) {
motionName = "".concat(prefixCls, "-").concat(animationName);
}
return motionName;
}
function getScroll$1(w2, top) {
var ret = w2["page".concat(top ? "Y" : "X", "Offset")];
var method2 = "scroll".concat(top ? "Top" : "Left");
if (typeof ret !== "number") {
var d2 = w2.document;
ret = d2.documentElement[method2];
if (typeof ret !== "number") {
ret = d2.body[method2];
}
}
return ret;
}
function offset$1(el) {
var rect = el.getBoundingClientRect();
var pos = {
left: rect.left,
top: rect.top
};
var doc = el.ownerDocument;
var w2 = doc.defaultView || doc.parentWindow;
pos.left += getScroll$1(w2);
pos.top += getScroll$1(w2, true);
return pos;
}
const MemoChildren = /* @__PURE__ */ React__namespace.memo(function(_ref) {
var children = _ref.children;
return children;
}, function(_, _ref2) {
var shouldUpdate = _ref2.shouldUpdate;
return !shouldUpdate;
});
var sentinelStyle = {
width: 0,
height: 0,
overflow: "hidden",
outline: "none"
};
var Panel$3 = /* @__PURE__ */ React__default.default.forwardRef(function(props, ref) {
var prefixCls = props.prefixCls, className = props.className, style2 = props.style, title = props.title, ariaId = props.ariaId, footer = props.footer, closable = props.closable, closeIcon = props.closeIcon, onClose = props.onClose, children = props.children, bodyStyle = props.bodyStyle, bodyProps = props.bodyProps, modalRender = props.modalRender, onMouseDown = props.onMouseDown, onMouseUp = props.onMouseUp, holderRef = props.holderRef, visible = props.visible, forceRender = props.forceRender, width = props.width, height = props.height;
var sentinelStartRef = React$a.useRef();
var sentinelEndRef = React$a.useRef();
React__default.default.useImperativeHandle(ref, function() {
return {
focus: function focus() {
var _sentinelStartRef$cur;
(_sentinelStartRef$cur = sentinelStartRef.current) === null || _sentinelStartRef$cur === void 0 ? void 0 : _sentinelStartRef$cur.focus();
},
changeActive: function changeActive(next) {
var _document = document, activeElement = _document.activeElement;
if (next && activeElement === sentinelEndRef.current) {
sentinelStartRef.current.focus();
} else if (!next && activeElement === sentinelStartRef.current) {
sentinelEndRef.current.focus();
}
}
};
});
var contentStyle = {};
if (width !== void 0) {
contentStyle.width = width;
}
if (height !== void 0) {
contentStyle.height = height;
}
var footerNode;
if (footer) {
footerNode = /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-footer"),
children: footer
});
}
var headerNode;
if (title) {
headerNode = /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-header"),
children: /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-title"),
id: ariaId,
children: title
})
});
}
var closer;
if (closable) {
closer = /* @__PURE__ */ jsx("button", {
type: "button",
onClick: onClose,
"aria-label": "Close",
className: "".concat(prefixCls, "-close"),
children: closeIcon || /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-close-x")
})
});
}
var content = /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-content"),
children: [closer, headerNode, /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-body"),
style: bodyStyle,
...bodyProps,
children
}), footerNode]
});
return /* @__PURE__ */ jsxs("div", {
role: "dialog",
"aria-labelledby": title ? ariaId : null,
"aria-modal": "true",
ref: holderRef,
style: _objectSpread2$a(_objectSpread2$a({}, style2), contentStyle),
className: classnames(prefixCls, className),
onMouseDown,
onMouseUp,
children: [/* @__PURE__ */ jsx("div", {
tabIndex: 0,
ref: sentinelStartRef,
style: sentinelStyle,
"aria-hidden": "true"
}), /* @__PURE__ */ jsx(MemoChildren, {
shouldUpdate: visible || forceRender,
children: modalRender ? modalRender(content) : content
}), /* @__PURE__ */ jsx("div", {
tabIndex: 0,
ref: sentinelEndRef,
style: sentinelStyle,
"aria-hidden": "true"
})]
}, "dialog-element");
});
var Content = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var prefixCls = props.prefixCls, title = props.title, style2 = props.style, className = props.className, visible = props.visible, forceRender = props.forceRender, destroyOnClose = props.destroyOnClose, motionName = props.motionName, ariaId = props.ariaId, onVisibleChanged = props.onVisibleChanged, mousePosition = props.mousePosition;
var dialogRef = React$a.useRef();
var _React$useState = React__namespace.useState(), _React$useState2 = _slicedToArray$e(_React$useState, 2), transformOrigin = _React$useState2[0], setTransformOrigin = _React$useState2[1];
var contentStyle = {};
if (transformOrigin) {
contentStyle.transformOrigin = transformOrigin;
}
function onPrepare() {
var elementOffset = offset$1(dialogRef.current);
setTransformOrigin(mousePosition ? "".concat(mousePosition.x - elementOffset.left, "px ").concat(mousePosition.y - elementOffset.top, "px") : "");
}
return /* @__PURE__ */ jsx(CSSMotion, {
visible,
onVisibleChanged,
onAppearPrepare: onPrepare,
onEnterPrepare: onPrepare,
forceRender,
motionName,
removeOnLeave: destroyOnClose,
ref: dialogRef,
children: function(_ref, motionRef) {
var motionClassName = _ref.className, motionStyle = _ref.style;
return /* @__PURE__ */ jsx(Panel$3, {
...props,
ref,
title,
ariaId,
prefixCls,
holderRef: motionRef,
style: _objectSpread2$a(_objectSpread2$a(_objectSpread2$a({}, motionStyle), style2), contentStyle),
className: classnames(className, motionClassName)
});
}
});
});
Content.displayName = "Content";
function Dialog(props) {
var _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-dialog" : _props$prefixCls, zIndex = props.zIndex, _props$visible = props.visible, visible = _props$visible === void 0 ? false : _props$visible, _props$keyboard = props.keyboard, keyboard = _props$keyboard === void 0 ? true : _props$keyboard, _props$focusTriggerAf = props.focusTriggerAfterClose, focusTriggerAfterClose = _props$focusTriggerAf === void 0 ? true : _props$focusTriggerAf, wrapStyle = props.wrapStyle, wrapClassName = props.wrapClassName, wrapProps = props.wrapProps, onClose = props.onClose, afterClose = props.afterClose, transitionName2 = props.transitionName, animation = props.animation, _props$closable = props.closable, closable = _props$closable === void 0 ? true : _props$closable, _props$mask = props.mask, mask = _props$mask === void 0 ? true : _props$mask, maskTransitionName = props.maskTransitionName, maskAnimation = props.maskAnimation, _props$maskClosable = props.maskClosable, maskClosable = _props$maskClosable === void 0 ? true : _props$maskClosable, maskStyle = props.maskStyle, maskProps = props.maskProps, rootClassName = props.rootClassName;
var lastOutSideActiveElementRef = React$a.useRef();
var wrapperRef = React$a.useRef();
var contentRef = React$a.useRef();
var _React$useState = React__namespace.useState(visible), _React$useState2 = _slicedToArray$e(_React$useState, 2), animatedVisible = _React$useState2[0], setAnimatedVisible = _React$useState2[1];
var ariaId = useId$1();
function saveLastOutSideActiveElementRef() {
if (!contains$2(wrapperRef.current, document.activeElement)) {
lastOutSideActiveElementRef.current = document.activeElement;
}
}
function focusDialogContent() {
if (!contains$2(wrapperRef.current, document.activeElement)) {
var _contentRef$current;
(_contentRef$current = contentRef.current) === null || _contentRef$current === void 0 ? void 0 : _contentRef$current.focus();
}
}
function onDialogVisibleChanged(newVisible) {
if (newVisible) {
focusDialogContent();
} else {
setAnimatedVisible(false);
if (mask && lastOutSideActiveElementRef.current && focusTriggerAfterClose) {
try {
lastOutSideActiveElementRef.current.focus({
preventScroll: true
});
} catch (e2) {
}
lastOutSideActiveElementRef.current = null;
}
if (animatedVisible) {
afterClose === null || afterClose === void 0 ? void 0 : afterClose();
}
}
}
function onInternalClose(e2) {
onClose === null || onClose === void 0 ? void 0 : onClose(e2);
}
var contentClickRef = React$a.useRef(false);
var contentTimeoutRef = React$a.useRef();
var onContentMouseDown = function onContentMouseDown2() {
clearTimeout(contentTimeoutRef.current);
contentClickRef.current = true;
};
var onContentMouseUp = function onContentMouseUp2() {
contentTimeoutRef.current = setTimeout(function() {
contentClickRef.current = false;
});
};
var onWrapperClick = null;
if (maskClosable) {
onWrapperClick = function onWrapperClick2(e2) {
if (contentClickRef.current) {
contentClickRef.current = false;
} else if (wrapperRef.current === e2.target) {
onInternalClose(e2);
}
};
}
function onWrapperKeyDown(e2) {
if (keyboard && e2.keyCode === KeyCode.ESC) {
e2.stopPropagation();
onInternalClose(e2);
return;
}
if (visible) {
if (e2.keyCode === KeyCode.TAB) {
contentRef.current.changeActive(!e2.shiftKey);
}
}
}
React$a.useEffect(function() {
if (visible) {
setAnimatedVisible(true);
saveLastOutSideActiveElementRef();
}
}, [visible]);
React$a.useEffect(function() {
return function() {
clearTimeout(contentTimeoutRef.current);
};
}, []);
return /* @__PURE__ */ jsxs("div", {
className: classnames("".concat(prefixCls, "-root"), rootClassName),
...pickAttrs(props, {
data: true
}),
children: [/* @__PURE__ */ jsx(Mask, {
prefixCls,
visible: mask && visible,
motionName: getMotionName(prefixCls, maskTransitionName, maskAnimation),
style: _objectSpread2$a({
zIndex
}, maskStyle),
maskProps
}), /* @__PURE__ */ jsx("div", {
tabIndex: -1,
onKeyDown: onWrapperKeyDown,
className: classnames("".concat(prefixCls, "-wrap"), wrapClassName),
ref: wrapperRef,
onClick: onWrapperClick,
style: _objectSpread2$a(_objectSpread2$a({
zIndex
}, wrapStyle), {}, {
display: !animatedVisible ? "none" : null
}),
...wrapProps,
children: /* @__PURE__ */ jsx(Content, {
...props,
onMouseDown: onContentMouseDown,
onMouseUp: onContentMouseUp,
ref: contentRef,
closable,
ariaId,
prefixCls,
visible: visible && animatedVisible,
onClose: onInternalClose,
onVisibleChanged: onDialogVisibleChanged,
motionName: getMotionName(prefixCls, transitionName2, animation)
})
})]
});
}
var DialogWrap = function DialogWrap2(props) {
var visible = props.visible, getContainer2 = props.getContainer, forceRender = props.forceRender, _props$destroyOnClose = props.destroyOnClose, destroyOnClose = _props$destroyOnClose === void 0 ? false : _props$destroyOnClose, _afterClose = props.afterClose;
var _React$useState = React__namespace.useState(visible), _React$useState2 = _slicedToArray$e(_React$useState, 2), animatedVisible = _React$useState2[0], setAnimatedVisible = _React$useState2[1];
React__namespace.useEffect(function() {
if (visible) {
setAnimatedVisible(true);
}
}, [visible]);
if (!forceRender && destroyOnClose && !animatedVisible) {
return null;
}
return /* @__PURE__ */ jsx(Portal, {
open: visible || forceRender || animatedVisible,
autoDestroy: false,
getContainer: getContainer2,
autoLock: visible || animatedVisible,
children: /* @__PURE__ */ jsx(Dialog, {
...props,
destroyOnClose,
afterClose: function afterClose() {
_afterClose === null || _afterClose === void 0 ? void 0 : _afterClose();
setAnimatedVisible(false);
}
})
});
};
DialogWrap.displayName = "Dialog";
var _excluded$l = ["visible", "onVisibleChange", "getContainer", "current", "countRender"];
var context = /* @__PURE__ */ React__namespace.createContext({
previewUrls: /* @__PURE__ */ new Map(),
setPreviewUrls: function setPreviewUrls() {
return null;
},
current: null,
setCurrent: function setCurrent() {
return null;
},
setShowPreview: function setShowPreview() {
return null;
},
setMousePosition: function setMousePosition() {
return null;
},
registerImage: function registerImage() {
return function() {
return null;
};
},
rootClassName: ""
});
var Provider = context.Provider;
var Group$2 = function Group2(_ref) {
var _ref$previewPrefixCls = _ref.previewPrefixCls, previewPrefixCls = _ref$previewPrefixCls === void 0 ? "rc-image-preview" : _ref$previewPrefixCls, children = _ref.children, _ref$icons = _ref.icons, icons2 = _ref$icons === void 0 ? {} : _ref$icons, preview = _ref.preview;
var _ref2 = _typeof$q(preview) === "object" ? preview : {}, _ref2$visible = _ref2.visible, previewVisible = _ref2$visible === void 0 ? void 0 : _ref2$visible, _ref2$onVisibleChange = _ref2.onVisibleChange, onPreviewVisibleChange = _ref2$onVisibleChange === void 0 ? void 0 : _ref2$onVisibleChange, _ref2$getContainer = _ref2.getContainer, getContainer2 = _ref2$getContainer === void 0 ? void 0 : _ref2$getContainer, _ref2$current = _ref2.current, currentIndex = _ref2$current === void 0 ? 0 : _ref2$current, _ref2$countRender = _ref2.countRender, countRender = _ref2$countRender === void 0 ? void 0 : _ref2$countRender, dialogProps = _objectWithoutProperties$1(_ref2, _excluded$l);
var _useState = React$a.useState(/* @__PURE__ */ new Map()), _useState2 = _slicedToArray$e(_useState, 2), previewUrls = _useState2[0], setPreviewUrls = _useState2[1];
var _useState3 = React$a.useState(), _useState4 = _slicedToArray$e(_useState3, 2), current = _useState4[0], setCurrent = _useState4[1];
var _useMergedState = useMergedState(!!previewVisible, {
value: previewVisible,
onChange: onPreviewVisibleChange
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), isShowPreview = _useMergedState2[0], setShowPreview = _useMergedState2[1];
var _useState5 = React$a.useState(null), _useState6 = _slicedToArray$e(_useState5, 2), mousePosition = _useState6[0], setMousePosition = _useState6[1];
var isControlled = previewVisible !== void 0;
var previewUrlsKeys = Array.from(previewUrls.keys());
var currentControlledKey = previewUrlsKeys[currentIndex];
var canPreviewUrls = new Map(Array.from(previewUrls).filter(function(_ref3) {
var _ref4 = _slicedToArray$e(_ref3, 2), canPreview = _ref4[1].canPreview;
return !!canPreview;
}).map(function(_ref5) {
var _ref6 = _slicedToArray$e(_ref5, 2), id2 = _ref6[0], url = _ref6[1].url;
return [id2, url];
}));
var registerImage = function registerImage2(id2, url) {
var canPreview = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : true;
var unRegister = function unRegister2() {
setPreviewUrls(function(oldPreviewUrls) {
var clonePreviewUrls = new Map(oldPreviewUrls);
var deleteResult = clonePreviewUrls.delete(id2);
return deleteResult ? clonePreviewUrls : oldPreviewUrls;
});
};
setPreviewUrls(function(oldPreviewUrls) {
return new Map(oldPreviewUrls).set(id2, {
url,
canPreview
});
});
return unRegister;
};
var onPreviewClose = function onPreviewClose2(e2) {
e2.stopPropagation();
setShowPreview(false);
setMousePosition(null);
};
React__namespace.useEffect(function() {
setCurrent(currentControlledKey);
}, [currentControlledKey]);
React__namespace.useEffect(function() {
if (!isShowPreview && isControlled) {
setCurrent(currentControlledKey);
}
}, [currentControlledKey, isControlled, isShowPreview]);
return /* @__PURE__ */ jsxs(Provider, {
value: {
isPreviewGroup: true,
previewUrls: canPreviewUrls,
setPreviewUrls,
current,
setCurrent,
setShowPreview,
setMousePosition,
registerImage
},
children: [children, /* @__PURE__ */ jsx(Preview$1, {
"aria-hidden": !isShowPreview,
visible: isShowPreview,
prefixCls: previewPrefixCls,
onClose: onPreviewClose,
mousePosition,
src: canPreviewUrls.get(current),
icons: icons2,
getContainer: getContainer2,
countRender,
...dialogProps
})]
});
};
var MIN_SCALE = 1;
var MAX_SCALE = 50;
var BASE_SCALE_RATIO = 1;
var WHEEL_MAX_SCALE_RATIO = 0.2;
var Operations = function Operations2(props) {
var _countRender;
var visible = props.visible, maskTransitionName = props.maskTransitionName, getContainer2 = props.getContainer, prefixCls = props.prefixCls, rootClassName = props.rootClassName, icons2 = props.icons, countRender = props.countRender, showSwitch = props.showSwitch, showProgress = props.showProgress, current = props.current, count = props.count, scale = props.scale, onSwitchLeft = props.onSwitchLeft, onSwitchRight = props.onSwitchRight, onClose = props.onClose, onZoomIn = props.onZoomIn, onZoomOut = props.onZoomOut, onRotateRight = props.onRotateRight, onRotateLeft = props.onRotateLeft;
var rotateLeft = icons2.rotateLeft, rotateRight = icons2.rotateRight, zoomIn = icons2.zoomIn, zoomOut = icons2.zoomOut, close = icons2.close, left = icons2.left, right = icons2.right;
var toolClassName = "".concat(prefixCls, "-operations-operation");
var iconClassName = "".concat(prefixCls, "-operations-icon");
var tools = [{
icon: close,
onClick: onClose,
type: "close"
}, {
icon: zoomIn,
onClick: onZoomIn,
type: "zoomIn",
disabled: scale === MAX_SCALE
}, {
icon: zoomOut,
onClick: onZoomOut,
type: "zoomOut",
disabled: scale === MIN_SCALE
}, {
icon: rotateRight,
onClick: onRotateRight,
type: "rotateRight"
}, {
icon: rotateLeft,
onClick: onRotateLeft,
type: "rotateLeft"
}];
var operations = /* @__PURE__ */ jsxs(Fragment, {
children: [showSwitch && /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-switch-left"), _defineProperty$b({}, "".concat(prefixCls, "-switch-left-disabled"), current === 0)),
onClick: onSwitchLeft,
children: left
}), /* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-switch-right"), _defineProperty$b({}, "".concat(prefixCls, "-switch-right-disabled"), current === count - 1)),
onClick: onSwitchRight,
children: right
})]
}), /* @__PURE__ */ jsxs("ul", {
className: "".concat(prefixCls, "-operations"),
children: [showProgress && /* @__PURE__ */ jsx("li", {
className: "".concat(prefixCls, "-operations-progress"),
children: (_countRender = countRender === null || countRender === void 0 ? void 0 : countRender(current + 1, count)) !== null && _countRender !== void 0 ? _countRender : "".concat(current + 1, " / ").concat(count)
}), tools.map(function(_ref) {
var _classnames3;
var icon = _ref.icon, onClick = _ref.onClick, type2 = _ref.type, disabled = _ref.disabled;
return /* @__PURE__ */ jsx("li", {
className: classnames(toolClassName, (_classnames3 = {}, _defineProperty$b(_classnames3, "".concat(prefixCls, "-operations-operation-").concat(type2), true), _defineProperty$b(_classnames3, "".concat(prefixCls, "-operations-operation-disabled"), !!disabled), _classnames3)),
onClick,
children: /* @__PURE__ */ React__namespace.isValidElement(icon) ? /* @__PURE__ */ React__namespace.cloneElement(icon, {
className: iconClassName
}) : icon
}, type2);
})]
})]
});
return /* @__PURE__ */ jsx(CSSMotion, {
visible,
motionName: maskTransitionName,
children: function(_ref2) {
var className = _ref2.className, style2 = _ref2.style;
return /* @__PURE__ */ jsx(Portal, {
open: true,
getContainer: getContainer2 !== null && getContainer2 !== void 0 ? getContainer2 : document.body,
children: /* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-operations-wrapper"), className, rootClassName),
style: style2,
children: operations
})
});
}
});
};
var initialTransform = {
x: 0,
y: 0,
rotate: 0,
scale: 1
};
function useImageTransform(imgRef) {
var frame = React$a.useRef(null);
var queue = React$a.useRef([]);
var _useState = React$a.useState(initialTransform), _useState2 = _slicedToArray$e(_useState, 2), transform = _useState2[0], setTransform2 = _useState2[1];
var resetTransform = function resetTransform2() {
setTransform2(initialTransform);
};
var updateTransform = function updateTransform2(newTransform) {
if (frame.current === null) {
queue.current = [];
frame.current = wrapperRaf$1(function() {
setTransform2(function(preState) {
var memoState = preState;
queue.current.forEach(function(queueState) {
memoState = _objectSpread2$a(_objectSpread2$a({}, memoState), queueState);
});
frame.current = null;
return memoState;
});
});
}
queue.current.push(_objectSpread2$a(_objectSpread2$a({}, transform), newTransform));
};
var dispatchZoonChange = function dispatchZoonChange2(ratio, clientX, clientY) {
var _imgRef$current = imgRef.current, width = _imgRef$current.width, height = _imgRef$current.height, offsetWidth = _imgRef$current.offsetWidth, offsetHeight = _imgRef$current.offsetHeight, offsetLeft = _imgRef$current.offsetLeft, offsetTop = _imgRef$current.offsetTop;
var newRatio = ratio;
var newScale = transform.scale * ratio;
if (newScale > MAX_SCALE) {
newRatio = MAX_SCALE / transform.scale;
newScale = MAX_SCALE;
} else if (newScale < MIN_SCALE) {
newRatio = MIN_SCALE / transform.scale;
newScale = MIN_SCALE;
}
var mergedClientX = clientX !== null && clientX !== void 0 ? clientX : innerWidth / 2;
var mergedClientY = clientY !== null && clientY !== void 0 ? clientY : innerHeight / 2;
var diffRatio = newRatio - 1;
var diffImgX = diffRatio * width * 0.5;
var diffImgY = diffRatio * height * 0.5;
var diffOffsetLeft = diffRatio * (mergedClientX - transform.x - offsetLeft);
var diffOffsetTop = diffRatio * (mergedClientY - transform.y - offsetTop);
var newX = transform.x - (diffOffsetLeft - diffImgX);
var newY = transform.y - (diffOffsetTop - diffImgY);
if (ratio < 1 && newScale === 1) {
var mergedWidth = offsetWidth * newScale;
var mergedHeight = offsetHeight * newScale;
var _getClientSize = getClientSize(), clientWidth = _getClientSize.width, clientHeight = _getClientSize.height;
if (mergedWidth <= clientWidth && mergedHeight <= clientHeight) {
newX = 0;
newY = 0;
}
}
updateTransform({
x: newX,
y: newY,
scale: newScale
});
};
return {
transform,
resetTransform,
updateTransform,
dispatchZoonChange
};
}
function fixPoint(key2, start, width, clientWidth) {
var startAddWidth = start + width;
var offsetStart = (width - clientWidth) / 2;
if (width > clientWidth) {
if (start > 0) {
return _defineProperty$b({}, key2, offsetStart);
}
if (start < 0 && startAddWidth < clientWidth) {
return _defineProperty$b({}, key2, -offsetStart);
}
} else if (start < 0 || startAddWidth > clientWidth) {
return _defineProperty$b({}, key2, start < 0 ? offsetStart : -offsetStart);
}
return {};
}
function getFixScaleEleTransPosition(width, height, left, top) {
var _getClientSize = getClientSize(), clientWidth = _getClientSize.width, clientHeight = _getClientSize.height;
var fixPos = null;
if (width <= clientWidth && height <= clientHeight) {
fixPos = {
x: 0,
y: 0
};
} else if (width > clientWidth || height > clientHeight) {
fixPos = _objectSpread2$a(_objectSpread2$a({}, fixPoint("x", left, width, clientWidth)), fixPoint("y", top, height, clientHeight));
}
return fixPos;
}
var _excluded$k = ["prefixCls", "src", "alt", "onClose", "afterClose", "visible", "icons", "rootClassName", "getContainer", "countRender", "scaleStep", "transitionName", "maskTransitionName"];
var Preview$1 = function Preview2(props) {
var prefixCls = props.prefixCls, src = props.src, alt = props.alt, onClose = props.onClose;
props.afterClose;
var visible = props.visible, _props$icons = props.icons, icons2 = _props$icons === void 0 ? {} : _props$icons, rootClassName = props.rootClassName, getContainer2 = props.getContainer, countRender = props.countRender, _props$scaleStep = props.scaleStep, scaleStep = _props$scaleStep === void 0 ? 0.5 : _props$scaleStep, _props$transitionName = props.transitionName, transitionName2 = _props$transitionName === void 0 ? "zoom" : _props$transitionName, _props$maskTransition = props.maskTransitionName, maskTransitionName = _props$maskTransition === void 0 ? "fade" : _props$maskTransition, restProps = _objectWithoutProperties$1(props, _excluded$k);
var imgRef = React$a.useRef();
var downPositionRef = React$a.useRef({
deltaX: 0,
deltaY: 0,
transformX: 0,
transformY: 0
});
var _useState = React$a.useState(false), _useState2 = _slicedToArray$e(_useState, 2), isMoving = _useState2[0], setMoving = _useState2[1];
var _useContext = React$a.useContext(context), previewUrls = _useContext.previewUrls, current = _useContext.current, isPreviewGroup = _useContext.isPreviewGroup, setCurrent = _useContext.setCurrent;
var previewGroupCount = previewUrls.size;
var previewUrlsKeys = Array.from(previewUrls.keys());
var currentPreviewIndex = previewUrlsKeys.indexOf(current);
var combinationSrc = isPreviewGroup ? previewUrls.get(current) : src;
var showLeftOrRightSwitches = isPreviewGroup && previewGroupCount > 1;
var showOperationsProgress = isPreviewGroup && previewGroupCount >= 1;
var _useImageTransform = useImageTransform(imgRef), transform = _useImageTransform.transform, resetTransform = _useImageTransform.resetTransform, updateTransform = _useImageTransform.updateTransform, dispatchZoonChange = _useImageTransform.dispatchZoonChange;
var rotate = transform.rotate, scale = transform.scale;
var wrapClassName = classnames(_defineProperty$b({}, "".concat(prefixCls, "-moving"), isMoving));
var onAfterClose = function onAfterClose2() {
resetTransform();
};
var onZoomIn = function onZoomIn2() {
dispatchZoonChange(BASE_SCALE_RATIO + scaleStep);
};
var onZoomOut = function onZoomOut2() {
dispatchZoonChange(BASE_SCALE_RATIO - scaleStep);
};
var onRotateRight = function onRotateRight2() {
updateTransform({
rotate: rotate + 90
});
};
var onRotateLeft = function onRotateLeft2() {
updateTransform({
rotate: rotate - 90
});
};
var onSwitchLeft = function onSwitchLeft2(event) {
event.preventDefault();
event.stopPropagation();
if (currentPreviewIndex > 0) {
setCurrent(previewUrlsKeys[currentPreviewIndex - 1]);
}
};
var onSwitchRight = function onSwitchRight2(event) {
event.preventDefault();
event.stopPropagation();
if (currentPreviewIndex < previewGroupCount - 1) {
setCurrent(previewUrlsKeys[currentPreviewIndex + 1]);
}
};
var onMouseUp = function onMouseUp2() {
if (visible && isMoving) {
setMoving(false);
var _downPositionRef$curr = downPositionRef.current, transformX = _downPositionRef$curr.transformX, transformY = _downPositionRef$curr.transformY;
var hasChangedPosition = transform.x !== transformX && transform.y !== transformY;
if (!hasChangedPosition) {
return;
}
var width = imgRef.current.offsetWidth * scale;
var height = imgRef.current.offsetHeight * scale;
var _imgRef$current$getBo = imgRef.current.getBoundingClientRect(), left = _imgRef$current$getBo.left, top = _imgRef$current$getBo.top;
var isRotate = rotate % 180 !== 0;
var fixState = getFixScaleEleTransPosition(isRotate ? height : width, isRotate ? width : height, left, top);
if (fixState) {
updateTransform(_objectSpread2$a({}, fixState));
}
}
};
var onMouseDown = function onMouseDown2(event) {
if (event.button !== 0)
return;
event.preventDefault();
event.stopPropagation();
downPositionRef.current = {
deltaX: event.pageX - transform.x,
deltaY: event.pageY - transform.y,
transformX: transform.x,
transformY: transform.y
};
setMoving(true);
};
var onMouseMove = function onMouseMove2(event) {
if (visible && isMoving) {
updateTransform({
x: event.pageX - downPositionRef.current.deltaX,
y: event.pageY - downPositionRef.current.deltaY
});
}
};
var onWheel = function onWheel2(event) {
if (!visible || event.deltaY == 0)
return;
var scaleRatio = Math.abs(event.deltaY / 100);
var mergedScaleRatio = Math.min(scaleRatio, WHEEL_MAX_SCALE_RATIO);
var ratio = BASE_SCALE_RATIO + mergedScaleRatio * scaleStep;
if (event.deltaY > 0) {
ratio = BASE_SCALE_RATIO / ratio;
}
dispatchZoonChange(ratio, event.clientX, event.clientY);
};
var onKeyDown2 = React$a.useCallback(function(event) {
if (!visible || !showLeftOrRightSwitches)
return;
if (event.keyCode === KeyCode.LEFT) {
if (currentPreviewIndex > 0) {
setCurrent(previewUrlsKeys[currentPreviewIndex - 1]);
}
} else if (event.keyCode === KeyCode.RIGHT) {
if (currentPreviewIndex < previewGroupCount - 1) {
setCurrent(previewUrlsKeys[currentPreviewIndex + 1]);
}
}
}, [currentPreviewIndex, previewGroupCount, previewUrlsKeys, setCurrent, showLeftOrRightSwitches, visible]);
var onDoubleClick = function onDoubleClick2(event) {
if (visible) {
if (scale !== 1) {
updateTransform({
x: 0,
y: 0,
scale: 1
});
} else {
dispatchZoonChange(BASE_SCALE_RATIO + scaleStep, event.clientX, event.clientY);
}
}
};
React$a.useEffect(function() {
var onTopMouseUpListener;
var onTopMouseMoveListener;
var onMouseUpListener = addEventListenerWrap$2(window, "mouseup", onMouseUp, false);
var onMouseMoveListener = addEventListenerWrap$2(window, "mousemove", onMouseMove, false);
var onKeyDownListener = addEventListenerWrap$2(window, "keydown", onKeyDown2, false);
try {
if (window.top !== window.self) {
onTopMouseUpListener = addEventListenerWrap$2(window.top, "mouseup", onMouseUp, false);
onTopMouseMoveListener = addEventListenerWrap$2(window.top, "mousemove", onMouseMove, false);
}
} catch (error) {
}
return function() {
var _onTopMouseUpListener, _onTopMouseMoveListen;
onMouseUpListener.remove();
onMouseMoveListener.remove();
onKeyDownListener.remove();
(_onTopMouseUpListener = onTopMouseUpListener) === null || _onTopMouseUpListener === void 0 ? void 0 : _onTopMouseUpListener.remove();
(_onTopMouseMoveListen = onTopMouseMoveListener) === null || _onTopMouseMoveListen === void 0 ? void 0 : _onTopMouseMoveListen.remove();
};
}, [visible, isMoving, onKeyDown2]);
return /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx(DialogWrap, {
transitionName: transitionName2,
maskTransitionName,
closable: false,
keyboard: true,
prefixCls,
onClose,
afterClose: onAfterClose,
visible,
wrapClassName,
rootClassName,
getContainer: getContainer2,
...restProps,
children: /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-img-wrapper"),
children: /* @__PURE__ */ jsx("img", {
width: props.width,
height: props.height,
onWheel,
onMouseDown,
onDoubleClick,
ref: imgRef,
className: "".concat(prefixCls, "-img"),
src: combinationSrc,
alt,
style: {
transform: "translate3d(".concat(transform.x, "px, ").concat(transform.y, "px, 0) scale3d(").concat(scale, ", ").concat(scale, ", 1) rotate(").concat(rotate, "deg)")
}
})
})
}), /* @__PURE__ */ jsx(Operations, {
visible,
maskTransitionName,
getContainer: getContainer2,
prefixCls,
rootClassName,
icons: icons2,
countRender,
showSwitch: showLeftOrRightSwitches,
showProgress: showOperationsProgress,
current: currentPreviewIndex,
count: previewGroupCount,
scale,
onSwitchLeft,
onSwitchRight,
onZoomIn,
onZoomOut,
onRotateRight,
onRotateLeft,
onClose
})]
});
};
var _excluded$j = ["src", "alt", "onPreviewClose", "prefixCls", "previewPrefixCls", "placeholder", "fallback", "width", "height", "style", "preview", "className", "onClick", "onError", "wrapperClassName", "wrapperStyle", "rootClassName", "crossOrigin", "decoding", "loading", "referrerPolicy", "sizes", "srcSet", "useMap", "draggable"], _excluded2$2 = ["src", "visible", "onVisibleChange", "getContainer", "mask", "maskClassName", "icons", "scaleStep"];
var uuid$1 = 0;
var ImageInternal = function ImageInternal2(_ref) {
var _imgCommonProps$style;
var imgSrc = _ref.src, alt = _ref.alt, onInitialPreviewClose = _ref.onPreviewClose, _ref$prefixCls = _ref.prefixCls, prefixCls = _ref$prefixCls === void 0 ? "rc-image" : _ref$prefixCls, _ref$previewPrefixCls = _ref.previewPrefixCls, previewPrefixCls = _ref$previewPrefixCls === void 0 ? "".concat(prefixCls, "-preview") : _ref$previewPrefixCls, placeholder = _ref.placeholder, fallback = _ref.fallback, width = _ref.width, height = _ref.height, style2 = _ref.style, _ref$preview = _ref.preview, preview = _ref$preview === void 0 ? true : _ref$preview, className = _ref.className, onClick = _ref.onClick, onImageError = _ref.onError, wrapperClassName = _ref.wrapperClassName, wrapperStyle = _ref.wrapperStyle, rootClassName = _ref.rootClassName, crossOrigin = _ref.crossOrigin, decoding = _ref.decoding, loading = _ref.loading, referrerPolicy = _ref.referrerPolicy, sizes2 = _ref.sizes, srcSet = _ref.srcSet, useMap = _ref.useMap, draggable = _ref.draggable, otherProps = _objectWithoutProperties$1(_ref, _excluded$j);
var isCustomPlaceholder = placeholder && placeholder !== true;
var _ref2 = _typeof$q(preview) === "object" ? preview : {}, previewSrc = _ref2.src, _ref2$visible = _ref2.visible, previewVisible = _ref2$visible === void 0 ? void 0 : _ref2$visible, _ref2$onVisibleChange = _ref2.onVisibleChange, onPreviewVisibleChange = _ref2$onVisibleChange === void 0 ? onInitialPreviewClose : _ref2$onVisibleChange, _ref2$getContainer = _ref2.getContainer, getPreviewContainer = _ref2$getContainer === void 0 ? void 0 : _ref2$getContainer, previewMask = _ref2.mask, maskClassName = _ref2.maskClassName, icons2 = _ref2.icons, scaleStep = _ref2.scaleStep, dialogProps = _objectWithoutProperties$1(_ref2, _excluded2$2);
var src = previewSrc !== null && previewSrc !== void 0 ? previewSrc : imgSrc;
var isControlled = previewVisible !== void 0;
var _useMergedState = useMergedState(!!previewVisible, {
value: previewVisible,
onChange: onPreviewVisibleChange
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), isShowPreview = _useMergedState2[0], setShowPreview = _useMergedState2[1];
var _useState = React$a.useState(isCustomPlaceholder ? "loading" : "normal"), _useState2 = _slicedToArray$e(_useState, 2), status = _useState2[0], setStatus = _useState2[1];
var _useState3 = React$a.useState(null), _useState4 = _slicedToArray$e(_useState3, 2), mousePosition = _useState4[0], setMousePosition = _useState4[1];
var isError = status === "error";
var _React$useContext = React__namespace.useContext(context), isPreviewGroup = _React$useContext.isPreviewGroup, setCurrent = _React$useContext.setCurrent, setGroupShowPreview = _React$useContext.setShowPreview, setGroupMousePosition = _React$useContext.setMousePosition, registerImage = _React$useContext.registerImage;
var _React$useState = React__namespace.useState(function() {
uuid$1 += 1;
return uuid$1;
}), _React$useState2 = _slicedToArray$e(_React$useState, 1), currentId = _React$useState2[0];
var canPreview = !!preview;
var isLoaded = React__namespace.useRef(false);
var onLoad = function onLoad2() {
setStatus("normal");
};
var onError = function onError2(e2) {
if (onImageError) {
onImageError(e2);
}
setStatus("error");
};
var onPreview = function onPreview2(e2) {
if (!isControlled) {
var _getOffset = getOffset$1(e2.target), left = _getOffset.left, top = _getOffset.top;
if (isPreviewGroup) {
setCurrent(currentId);
setGroupMousePosition({
x: left,
y: top
});
} else {
setMousePosition({
x: left,
y: top
});
}
}
if (isPreviewGroup) {
setGroupShowPreview(true);
} else {
setShowPreview(true);
}
if (onClick)
onClick(e2);
};
var onPreviewClose = function onPreviewClose2(e2) {
e2.stopPropagation();
setShowPreview(false);
if (!isControlled) {
setMousePosition(null);
}
};
var getImgRef = function getImgRef2(img) {
isLoaded.current = false;
if (status !== "loading")
return;
if (img !== null && img !== void 0 && img.complete && (img.naturalWidth || img.naturalHeight)) {
isLoaded.current = true;
onLoad();
}
};
React__namespace.useEffect(function() {
var unRegister = registerImage(currentId, src);
return unRegister;
}, []);
React__namespace.useEffect(function() {
registerImage(currentId, src, canPreview);
}, [src, canPreview]);
React__namespace.useEffect(function() {
if (isError) {
setStatus("normal");
}
if (isCustomPlaceholder && !isLoaded.current) {
setStatus("loading");
}
}, [imgSrc]);
var wrapperClass = classnames(prefixCls, wrapperClassName, rootClassName, _defineProperty$b({}, "".concat(prefixCls, "-error"), isError));
var mergedSrc = isError && fallback ? fallback : src;
var imgCommonProps = {
crossOrigin,
decoding,
draggable,
loading,
referrerPolicy,
sizes: sizes2,
srcSet,
useMap,
alt,
className: classnames("".concat(prefixCls, "-img"), _defineProperty$b({}, "".concat(prefixCls, "-img-placeholder"), placeholder === true), className),
style: _objectSpread2$a({
height
}, style2)
};
return /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsxs("div", {
...otherProps,
className: wrapperClass,
onClick: canPreview ? onPreview : onClick,
style: _objectSpread2$a({
width,
height
}, wrapperStyle),
children: [/* @__PURE__ */ jsx("img", {
...imgCommonProps,
ref: getImgRef,
...isError && fallback ? {
src: fallback
} : {
onLoad,
onError,
src: imgSrc
},
width,
height
}), status === "loading" && /* @__PURE__ */ jsx("div", {
"aria-hidden": "true",
className: "".concat(prefixCls, "-placeholder"),
children: placeholder
}), previewMask && canPreview && /* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-mask"), maskClassName),
style: {
display: ((_imgCommonProps$style = imgCommonProps.style) === null || _imgCommonProps$style === void 0 ? void 0 : _imgCommonProps$style.display) === "none" ? "none" : void 0
},
children: previewMask
})]
}), !isPreviewGroup && canPreview && /* @__PURE__ */ jsx(Preview$1, {
"aria-hidden": !isShowPreview,
visible: isShowPreview,
prefixCls: previewPrefixCls,
onClose: onPreviewClose,
mousePosition,
src: mergedSrc,
alt,
getContainer: getPreviewContainer,
icons: icons2,
scaleStep,
rootClassName,
...dialogProps
})]
});
};
ImageInternal.PreviewGroup = Group$2;
ImageInternal.displayName = "Image";
var RotateLeftOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "defs", "attrs": {}, "children": [{ "tag": "style", "attrs": {} }] }, { "tag": "path", "attrs": { "d": "M672 418H144c-17.7 0-32 14.3-32 32v414c0 17.7 14.3 32 32 32h528c17.7 0 32-14.3 32-32V450c0-17.7-14.3-32-32-32zm-44 402H188V494h440v326z" } }, { "tag": "path", "attrs": { "d": "M819.3 328.5c-78.8-100.7-196-153.6-314.6-154.2l-.2-64c0-6.5-7.6-10.1-12.6-6.1l-128 101c-4 3.1-3.9 9.1 0 12.3L492 318.6c5.1 4 12.7.4 12.6-6.1v-63.9c12.9.1 25.9.9 38.8 2.5 42.1 5.2 82.1 18.2 119 38.7 38.1 21.2 71.2 49.7 98.4 84.3 27.1 34.7 46.7 73.7 58.1 115.8a325.95 325.95 0 016.5 140.9h74.9c14.8-103.6-11.3-213-81-302.3z" } }] }, "name": "rotate-left", "theme": "outlined" };
const RotateLeftOutlinedSvg = RotateLeftOutlined$2;
var RotateLeftOutlined = function RotateLeftOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: RotateLeftOutlinedSvg
})
});
};
RotateLeftOutlined.displayName = "RotateLeftOutlined";
const RotateLeftOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(RotateLeftOutlined);
var RotateRightOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "defs", "attrs": {}, "children": [{ "tag": "style", "attrs": {} }] }, { "tag": "path", "attrs": { "d": "M480.5 251.2c13-1.6 25.9-2.4 38.8-2.5v63.9c0 6.5 7.5 10.1 12.6 6.1L660 217.6c4-3.2 4-9.2 0-12.3l-128-101c-5.1-4-12.6-.4-12.6 6.1l-.2 64c-118.6.5-235.8 53.4-314.6 154.2A399.75 399.75 0 00123.5 631h74.9c-.9-5.3-1.7-10.7-2.4-16.1-5.1-42.1-2.1-84.1 8.9-124.8 11.4-42.2 31-81.1 58.1-115.8 27.2-34.7 60.3-63.2 98.4-84.3 37-20.6 76.9-33.6 119.1-38.8z" } }, { "tag": "path", "attrs": { "d": "M880 418H352c-17.7 0-32 14.3-32 32v414c0 17.7 14.3 32 32 32h528c17.7 0 32-14.3 32-32V450c0-17.7-14.3-32-32-32zm-44 402H396V494h440v326z" } }] }, "name": "rotate-right", "theme": "outlined" };
const RotateRightOutlinedSvg = RotateRightOutlined$2;
var RotateRightOutlined = function RotateRightOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: RotateRightOutlinedSvg
})
});
};
RotateRightOutlined.displayName = "RotateRightOutlined";
const RotateRightOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(RotateRightOutlined);
var ZoomInOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M637 443H519V309c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v134H325c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h118v134c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V519h118c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zm284 424L775 721c122.1-148.9 113.6-369.5-26-509-148-148.1-388.4-148.1-537 0-148.1 148.6-148.1 389 0 537 139.5 139.6 360.1 148.1 509 26l146 146c3.2 2.8 8.3 2.8 11 0l43-43c2.8-2.7 2.8-7.8 0-11zM696 696c-118.8 118.7-311.2 118.7-430 0-118.7-118.8-118.7-311.2 0-430 118.8-118.7 311.2-118.7 430 0 118.7 118.8 118.7 311.2 0 430z" } }] }, "name": "zoom-in", "theme": "outlined" };
const ZoomInOutlinedSvg = ZoomInOutlined$2;
var ZoomInOutlined = function ZoomInOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: ZoomInOutlinedSvg
})
});
};
ZoomInOutlined.displayName = "ZoomInOutlined";
const ZoomInOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(ZoomInOutlined);
var ZoomOutOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M637 443H325c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h312c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zm284 424L775 721c122.1-148.9 113.6-369.5-26-509-148-148.1-388.4-148.1-537 0-148.1 148.6-148.1 389 0 537 139.5 139.6 360.1 148.1 509 26l146 146c3.2 2.8 8.3 2.8 11 0l43-43c2.8-2.7 2.8-7.8 0-11zM696 696c-118.8 118.7-311.2 118.7-430 0-118.7-118.8-118.7-311.2 0-430 118.8-118.7 311.2-118.7 430 0 118.7 118.8 118.7 311.2 0 430z" } }] }, "name": "zoom-out", "theme": "outlined" };
const ZoomOutOutlinedSvg = ZoomOutOutlined$2;
var ZoomOutOutlined = function ZoomOutOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: ZoomOutOutlinedSvg
})
});
};
ZoomOutOutlined.displayName = "ZoomOutOutlined";
const ZoomOutOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(ZoomOutOutlined);
var __rest$j = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var icons = {
rotateLeft: /* @__PURE__ */ jsx(RotateLeftOutlined$1, {}),
rotateRight: /* @__PURE__ */ jsx(RotateRightOutlined$1, {}),
zoomIn: /* @__PURE__ */ jsx(ZoomInOutlined$1, {}),
zoomOut: /* @__PURE__ */ jsx(ZoomOutOutlined$1, {}),
close: /* @__PURE__ */ jsx(CloseOutlined$4, {}),
left: /* @__PURE__ */ jsx(LeftOutlined$1, {}),
right: /* @__PURE__ */ jsx(RightOutlined$1, {})
};
var InternalPreviewGroup = function InternalPreviewGroup2(_a) {
var customizePrefixCls = _a.previewPrefixCls, preview = _a.preview, props = __rest$j(_a, ["previewPrefixCls", "preview"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var prefixCls = getPrefixCls("image-preview", customizePrefixCls);
var rootPrefixCls = getPrefixCls();
var mergedPreview = React__namespace.useMemo(function() {
if (preview === false) {
return preview;
}
var _preview = _typeof$q(preview) === "object" ? preview : {};
return _extends$3(_extends$3({}, _preview), {
transitionName: getTransitionName(rootPrefixCls, "zoom", _preview.transitionName),
maskTransitionName: getTransitionName(rootPrefixCls, "fade", _preview.maskTransitionName)
});
}, [preview]);
return /* @__PURE__ */ jsx(ImageInternal.PreviewGroup, {
preview: mergedPreview,
previewPrefixCls: prefixCls,
icons,
...props
});
};
const PreviewGroup = InternalPreviewGroup;
var __rest$i = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var Image$1 = function Image2(_a) {
var customizePrefixCls = _a.prefixCls, preview = _a.preview, otherProps = __rest$i(_a, ["prefixCls", "preview"]);
var _useContext = React$a.useContext(ConfigContext$1), getPrefixCls = _useContext.getPrefixCls, _useContext$locale = _useContext.locale, contextLocale = _useContext$locale === void 0 ? defaultLocale : _useContext$locale, getContextPopupContainer = _useContext.getPopupContainer;
var prefixCls = getPrefixCls("image", customizePrefixCls);
var rootPrefixCls = getPrefixCls();
var imageLocale = contextLocale.Image || defaultLocale.Image;
var mergedPreview = React__namespace.useMemo(function() {
if (preview === false) {
return preview;
}
var _preview = _typeof$q(preview) === "object" ? preview : {};
var getContainer2 = _preview.getContainer, restPreviewProps = __rest$i(_preview, ["getContainer"]);
return _extends$3(_extends$3({
mask: /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-mask-info"),
children: [/* @__PURE__ */ jsx(EyeOutlined$1, {}), imageLocale === null || imageLocale === void 0 ? void 0 : imageLocale.preview]
}),
icons
}, restPreviewProps), {
getContainer: getContainer2 || getContextPopupContainer,
transitionName: getTransitionName(rootPrefixCls, "zoom", _preview.transitionName),
maskTransitionName: getTransitionName(rootPrefixCls, "fade", _preview.maskTransitionName)
});
}, [preview, imageLocale]);
return /* @__PURE__ */ jsx(ImageInternal, {
prefixCls,
preview: mergedPreview,
...otherProps
});
};
Image$1.PreviewGroup = PreviewGroup;
const _Image = Image$1;
var Group = function Group2(props) {
var _classNames;
var _useContext = React$a.useContext(ConfigContext$1), getPrefixCls = _useContext.getPrefixCls, direction = _useContext.direction;
var customizePrefixCls = props.prefixCls, _props$className = props.className, className = _props$className === void 0 ? "" : _props$className;
var prefixCls = getPrefixCls("input-group", customizePrefixCls);
var cls = classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-lg"), props.size === "large"), _defineProperty$b(_classNames, "".concat(prefixCls, "-sm"), props.size === "small"), _defineProperty$b(_classNames, "".concat(prefixCls, "-compact"), props.compact), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames), className);
var formItemContext = React$a.useContext(FormItemInputContext);
var groupFormItemContext = React$a.useMemo(function() {
return _extends$3(_extends$3({}, formItemContext), {
isFormItemInput: false
});
}, [formItemContext]);
return /* @__PURE__ */ jsx("span", {
className: cls,
style: props.style,
onMouseEnter: props.onMouseEnter,
onMouseLeave: props.onMouseLeave,
onFocus: props.onFocus,
onBlur: props.onBlur,
children: /* @__PURE__ */ jsx(FormItemInputContext.Provider, {
value: groupFormItemContext,
children: props.children
})
});
};
const Group$1 = Group;
function hasAddon$1(props) {
return !!(props.addonBefore || props.addonAfter);
}
function hasPrefixSuffix$1(props) {
return !!(props.prefix || props.suffix || props.allowClear);
}
function resolveOnChange$1(target, e2, onChange, targetValue) {
if (!onChange) {
return;
}
var event = e2;
if (e2.type === "click") {
var currentTarget = target.cloneNode(true);
event = Object.create(e2, {
target: {
value: currentTarget
},
currentTarget: {
value: currentTarget
}
});
currentTarget.value = "";
onChange(event);
return;
}
if (targetValue !== void 0) {
event = Object.create(e2, {
target: {
value: target
},
currentTarget: {
value: target
}
});
target.value = targetValue;
onChange(event);
return;
}
onChange(event);
}
function triggerFocus$1(element, option) {
if (!element)
return;
element.focus(option);
var _ref = option || {}, cursor = _ref.cursor;
if (cursor) {
var len = element.value.length;
switch (cursor) {
case "start":
element.setSelectionRange(0, 0);
break;
case "end":
element.setSelectionRange(len, len);
break;
default:
element.setSelectionRange(0, len);
}
}
}
function fixControlledValue$1(value) {
if (typeof value === "undefined" || value === null) {
return "";
}
return String(value);
}
var BaseInput = function BaseInput2(props) {
var inputElement = props.inputElement, prefixCls = props.prefixCls, prefix = props.prefix, suffix = props.suffix, addonBefore = props.addonBefore, addonAfter = props.addonAfter, className = props.className, style2 = props.style, affixWrapperClassName = props.affixWrapperClassName, groupClassName = props.groupClassName, wrapperClassName = props.wrapperClassName, disabled = props.disabled, readOnly = props.readOnly, focused = props.focused, triggerFocus2 = props.triggerFocus, allowClear = props.allowClear, value = props.value, handleReset = props.handleReset, hidden = props.hidden;
var containerRef = React$a.useRef(null);
var onInputClick = function onInputClick2(e2) {
var _containerRef$current;
if ((_containerRef$current = containerRef.current) !== null && _containerRef$current !== void 0 && _containerRef$current.contains(e2.target)) {
triggerFocus2 === null || triggerFocus2 === void 0 ? void 0 : triggerFocus2();
}
};
var getClearIcon = function getClearIcon2() {
var _classNames;
if (!allowClear) {
return null;
}
var needClear = !disabled && !readOnly && value;
var clearIconCls = "".concat(prefixCls, "-clear-icon");
var iconNode = _typeof$q(allowClear) === "object" && allowClear !== null && allowClear !== void 0 && allowClear.clearIcon ? allowClear.clearIcon : "\u2716";
return /* @__PURE__ */ jsx("span", {
onClick: handleReset,
onMouseDown: function onMouseDown(e2) {
return e2.preventDefault();
},
className: classnames(clearIconCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(clearIconCls, "-hidden"), !needClear), _defineProperty$b(_classNames, "".concat(clearIconCls, "-has-suffix"), !!suffix), _classNames)),
role: "button",
tabIndex: -1,
children: iconNode
});
};
var element = /* @__PURE__ */ React$a.cloneElement(inputElement, {
value,
hidden
});
if (hasPrefixSuffix$1(props)) {
var _classNames2;
var affixWrapperPrefixCls = "".concat(prefixCls, "-affix-wrapper");
var affixWrapperCls = classnames(affixWrapperPrefixCls, (_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(affixWrapperPrefixCls, "-disabled"), disabled), _defineProperty$b(_classNames2, "".concat(affixWrapperPrefixCls, "-focused"), focused), _defineProperty$b(_classNames2, "".concat(affixWrapperPrefixCls, "-readonly"), readOnly), _defineProperty$b(_classNames2, "".concat(affixWrapperPrefixCls, "-input-with-clear-btn"), suffix && allowClear && value), _classNames2), !hasAddon$1(props) && className, affixWrapperClassName);
var suffixNode = (suffix || allowClear) && /* @__PURE__ */ jsxs("span", {
className: "".concat(prefixCls, "-suffix"),
children: [getClearIcon(), suffix]
});
element = /* @__PURE__ */ jsxs("span", {
className: affixWrapperCls,
style: style2,
hidden: !hasAddon$1(props) && hidden,
onClick: onInputClick,
ref: containerRef,
children: [prefix && /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-prefix"),
children: prefix
}), /* @__PURE__ */ React$a.cloneElement(inputElement, {
style: null,
value,
hidden: null
}), suffixNode]
});
}
if (hasAddon$1(props)) {
var wrapperCls = "".concat(prefixCls, "-group");
var addonCls = "".concat(wrapperCls, "-addon");
var mergedWrapperClassName = classnames("".concat(prefixCls, "-wrapper"), wrapperCls, wrapperClassName);
var mergedGroupClassName = classnames("".concat(prefixCls, "-group-wrapper"), className, groupClassName);
return /* @__PURE__ */ jsx("span", {
className: mergedGroupClassName,
style: style2,
hidden,
children: /* @__PURE__ */ jsxs("span", {
className: mergedWrapperClassName,
children: [addonBefore && /* @__PURE__ */ jsx("span", {
className: addonCls,
children: addonBefore
}), /* @__PURE__ */ React$a.cloneElement(element, {
style: null,
hidden: null
}), addonAfter && /* @__PURE__ */ jsx("span", {
className: addonCls,
children: addonAfter
})]
})
});
}
return element;
};
var _excluded$i = ["autoComplete", "onChange", "onFocus", "onBlur", "onPressEnter", "onKeyDown", "prefixCls", "disabled", "htmlSize", "className", "maxLength", "suffix", "showCount", "type", "inputClassName"];
var Input$4 = /* @__PURE__ */ React$a.forwardRef(function(props, ref) {
var autoComplete = props.autoComplete, onChange = props.onChange, onFocus = props.onFocus, onBlur = props.onBlur, onPressEnter = props.onPressEnter, onKeyDown2 = props.onKeyDown, _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-input" : _props$prefixCls, disabled = props.disabled, htmlSize = props.htmlSize, className = props.className, maxLength = props.maxLength, suffix = props.suffix, showCount = props.showCount, _props$type = props.type, type2 = _props$type === void 0 ? "text" : _props$type, inputClassName = props.inputClassName, rest = _objectWithoutProperties$1(props, _excluded$i);
var _useMergedState = useMergedState(props.defaultValue, {
value: props.value
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), value = _useMergedState2[0], setValue2 = _useMergedState2[1];
var _useState = React$a.useState(false), _useState2 = _slicedToArray$e(_useState, 2), focused = _useState2[0], setFocused = _useState2[1];
var inputRef = React$a.useRef(null);
var focus = function focus2(option) {
if (inputRef.current) {
triggerFocus$1(inputRef.current, option);
}
};
React$a.useImperativeHandle(ref, function() {
return {
focus,
blur: function blur() {
var _inputRef$current;
(_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.blur();
},
setSelectionRange: function setSelectionRange(start, end, direction) {
var _inputRef$current2;
(_inputRef$current2 = inputRef.current) === null || _inputRef$current2 === void 0 ? void 0 : _inputRef$current2.setSelectionRange(start, end, direction);
},
select: function select() {
var _inputRef$current3;
(_inputRef$current3 = inputRef.current) === null || _inputRef$current3 === void 0 ? void 0 : _inputRef$current3.select();
},
input: inputRef.current
};
});
React$a.useEffect(function() {
setFocused(function(prev) {
return prev && disabled ? false : prev;
});
}, [disabled]);
var handleChange = function handleChange2(e2) {
if (props.value === void 0) {
setValue2(e2.target.value);
}
if (inputRef.current) {
resolveOnChange$1(inputRef.current, e2, onChange);
}
};
var handleKeyDown = function handleKeyDown2(e2) {
if (onPressEnter && e2.key === "Enter") {
onPressEnter(e2);
}
onKeyDown2 === null || onKeyDown2 === void 0 ? void 0 : onKeyDown2(e2);
};
var handleFocus = function handleFocus2(e2) {
setFocused(true);
onFocus === null || onFocus === void 0 ? void 0 : onFocus(e2);
};
var handleBlur = function handleBlur2(e2) {
setFocused(false);
onBlur === null || onBlur === void 0 ? void 0 : onBlur(e2);
};
var handleReset = function handleReset2(e2) {
setValue2("");
focus();
if (inputRef.current) {
resolveOnChange$1(inputRef.current, e2, onChange);
}
};
var getInputElement = function getInputElement2() {
var otherProps = omit(props, [
"prefixCls",
"onPressEnter",
"addonBefore",
"addonAfter",
"prefix",
"suffix",
"allowClear",
"defaultValue",
"showCount",
"affixWrapperClassName",
"groupClassName",
"inputClassName",
"wrapperClassName",
"htmlSize"
]);
return /* @__PURE__ */ jsx("input", {
autoComplete,
...otherProps,
onChange: handleChange,
onFocus: handleFocus,
onBlur: handleBlur,
onKeyDown: handleKeyDown,
className: classnames(prefixCls, _defineProperty$b({}, "".concat(prefixCls, "-disabled"), disabled), inputClassName, !hasAddon$1(props) && !hasPrefixSuffix$1(props) && className),
ref: inputRef,
size: htmlSize,
type: type2
});
};
var getSuffix = function getSuffix2() {
var hasMaxLength = Number(maxLength) > 0;
if (suffix || showCount) {
var val = fixControlledValue$1(value);
var valueLength = _toConsumableArray$c(val).length;
var dataCount = _typeof$q(showCount) === "object" ? showCount.formatter({
value: val,
count: valueLength,
maxLength
}) : "".concat(valueLength).concat(hasMaxLength ? " / ".concat(maxLength) : "");
return /* @__PURE__ */ jsxs(Fragment, {
children: [!!showCount && /* @__PURE__ */ jsx("span", {
className: classnames("".concat(prefixCls, "-show-count-suffix"), _defineProperty$b({}, "".concat(prefixCls, "-show-count-has-suffix"), !!suffix)),
children: dataCount
}), suffix]
});
}
return null;
};
return /* @__PURE__ */ jsx(BaseInput, {
...rest,
prefixCls,
className,
inputElement: getInputElement(),
handleReset,
value: fixControlledValue$1(value),
focused,
triggerFocus: focus,
suffix: getSuffix(),
disabled
});
});
function useRemovePasswordTimeout(inputRef, triggerOnMount) {
var removePasswordTimeoutRef = React$a.useRef([]);
var removePasswordTimeout = function removePasswordTimeout2() {
removePasswordTimeoutRef.current.push(setTimeout(function() {
var _a, _b, _c, _d;
if (((_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.input) && ((_b = inputRef.current) === null || _b === void 0 ? void 0 : _b.input.getAttribute("type")) === "password" && ((_c = inputRef.current) === null || _c === void 0 ? void 0 : _c.input.hasAttribute("value"))) {
(_d = inputRef.current) === null || _d === void 0 ? void 0 : _d.input.removeAttribute("value");
}
}));
};
React$a.useEffect(function() {
if (triggerOnMount) {
removePasswordTimeout();
}
return function() {
return removePasswordTimeoutRef.current.forEach(function(timer) {
if (timer) {
clearTimeout(timer);
}
});
};
}, []);
return removePasswordTimeout;
}
function hasPrefixSuffix(props) {
return !!(props.prefix || props.suffix || props.allowClear);
}
var __rest$h = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
function fixControlledValue(value) {
if (typeof value === "undefined" || value === null) {
return "";
}
return String(value);
}
function resolveOnChange(target, e2, onChange, targetValue) {
if (!onChange) {
return;
}
var event = e2;
if (e2.type === "click") {
var currentTarget = target.cloneNode(true);
event = Object.create(e2, {
target: {
value: currentTarget
},
currentTarget: {
value: currentTarget
}
});
currentTarget.value = "";
onChange(event);
return;
}
if (targetValue !== void 0) {
event = Object.create(e2, {
target: {
value: target
},
currentTarget: {
value: target
}
});
target.value = targetValue;
onChange(event);
return;
}
onChange(event);
}
function triggerFocus(element, option) {
if (!element) {
return;
}
element.focus(option);
var _ref = option || {}, cursor = _ref.cursor;
if (cursor) {
var len = element.value.length;
switch (cursor) {
case "start":
element.setSelectionRange(0, 0);
break;
case "end":
element.setSelectionRange(len, len);
break;
default:
element.setSelectionRange(0, len);
break;
}
}
}
var Input$3 = /* @__PURE__ */ React$a.forwardRef(function(props, ref) {
var _classNames, _classNames2, _classNames4;
var customizePrefixCls = props.prefixCls, _props$bordered = props.bordered, bordered = _props$bordered === void 0 ? true : _props$bordered, customStatus = props.status, customSize = props.size, customDisabled = props.disabled, onBlur = props.onBlur, onFocus = props.onFocus, suffix = props.suffix, allowClear = props.allowClear, addonAfter = props.addonAfter, addonBefore = props.addonBefore, className = props.className, onChange = props.onChange, rest = __rest$h(props, ["prefixCls", "bordered", "status", "size", "disabled", "onBlur", "onFocus", "suffix", "allowClear", "addonAfter", "addonBefore", "className", "onChange"]);
var _React$useContext = React__default.default.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction, input = _React$useContext.input;
var prefixCls = getPrefixCls("input", customizePrefixCls);
var inputRef = React$a.useRef(null);
var _useCompactItemContex = useCompactItemContext(prefixCls, direction), compactSize = _useCompactItemContex.compactSize, compactItemClassnames = _useCompactItemContex.compactItemClassnames;
var size = React__default.default.useContext(SizeContext$1);
var mergedSize = compactSize || customSize || size;
var disabled = React__default.default.useContext(DisabledContext$1);
var mergedDisabled = customDisabled !== null && customDisabled !== void 0 ? customDisabled : disabled;
var _useContext = React$a.useContext(FormItemInputContext), contextStatus = _useContext.status, hasFeedback = _useContext.hasFeedback, feedbackIcon = _useContext.feedbackIcon;
var mergedStatus = getMergedStatus(contextStatus, customStatus);
var inputHasPrefixSuffix = hasPrefixSuffix(props) || !!hasFeedback;
var prevHasPrefixSuffix = React$a.useRef(inputHasPrefixSuffix);
React$a.useEffect(function() {
if (inputHasPrefixSuffix && !prevHasPrefixSuffix.current)
;
prevHasPrefixSuffix.current = inputHasPrefixSuffix;
}, [inputHasPrefixSuffix]);
var removePasswordTimeout = useRemovePasswordTimeout(inputRef, true);
var handleBlur = function handleBlur2(e2) {
removePasswordTimeout();
onBlur === null || onBlur === void 0 ? void 0 : onBlur(e2);
};
var handleFocus = function handleFocus2(e2) {
removePasswordTimeout();
onFocus === null || onFocus === void 0 ? void 0 : onFocus(e2);
};
var handleChange = function handleChange2(e2) {
removePasswordTimeout();
onChange === null || onChange === void 0 ? void 0 : onChange(e2);
};
var suffixNode = (hasFeedback || suffix) && /* @__PURE__ */ jsxs(Fragment, {
children: [suffix, hasFeedback && feedbackIcon]
});
var mergedAllowClear;
if (_typeof$q(allowClear) === "object" && (allowClear === null || allowClear === void 0 ? void 0 : allowClear.clearIcon)) {
mergedAllowClear = allowClear;
} else if (allowClear) {
mergedAllowClear = {
clearIcon: /* @__PURE__ */ jsx(CloseCircleFilled$1, {})
};
}
return /* @__PURE__ */ jsx(Input$4, {
ref: composeRef(ref, inputRef),
prefixCls,
autoComplete: input === null || input === void 0 ? void 0 : input.autoComplete,
...rest,
disabled: mergedDisabled || void 0,
onBlur: handleBlur,
onFocus: handleFocus,
suffix: suffixNode,
allowClear: mergedAllowClear,
className: classnames(className, compactItemClassnames),
onChange: handleChange,
addonAfter: addonAfter && /* @__PURE__ */ jsx(NoCompactStyle, {
children: /* @__PURE__ */ jsx(NoFormStyle, {
override: true,
status: true,
children: addonAfter
})
}),
addonBefore: addonBefore && /* @__PURE__ */ jsx(NoCompactStyle, {
children: /* @__PURE__ */ jsx(NoFormStyle, {
override: true,
status: true,
children: addonBefore
})
}),
inputClassName: classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-sm"), mergedSize === "small"), _defineProperty$b(_classNames, "".concat(prefixCls, "-lg"), mergedSize === "large"), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _defineProperty$b(_classNames, "".concat(prefixCls, "-borderless"), !bordered), _classNames), !inputHasPrefixSuffix && getStatusClassNames(prefixCls, mergedStatus)),
affixWrapperClassName: classnames((_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-affix-wrapper-sm"), mergedSize === "small"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-affix-wrapper-lg"), mergedSize === "large"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-affix-wrapper-rtl"), direction === "rtl"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-affix-wrapper-borderless"), !bordered), _classNames2), getStatusClassNames("".concat(prefixCls, "-affix-wrapper"), mergedStatus, hasFeedback)),
wrapperClassName: classnames(_defineProperty$b({}, "".concat(prefixCls, "-group-rtl"), direction === "rtl")),
groupClassName: classnames((_classNames4 = {}, _defineProperty$b(_classNames4, "".concat(prefixCls, "-group-wrapper-sm"), mergedSize === "small"), _defineProperty$b(_classNames4, "".concat(prefixCls, "-group-wrapper-lg"), mergedSize === "large"), _defineProperty$b(_classNames4, "".concat(prefixCls, "-group-wrapper-rtl"), direction === "rtl"), _classNames4), getStatusClassNames("".concat(prefixCls, "-group-wrapper"), mergedStatus, hasFeedback))
});
});
const InternalInput = Input$3;
var EyeInvisibleOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M942.2 486.2Q889.47 375.11 816.7 305l-50.88 50.88C807.31 395.53 843.45 447.4 874.7 512 791.5 684.2 673.4 766 512 766q-72.67 0-133.87-22.38L323 798.75Q408 838 512 838q288.3 0 430.2-300.3a60.29 60.29 0 000-51.5zm-63.57-320.64L836 122.88a8 8 0 00-11.32 0L715.31 232.2Q624.86 186 512 186q-288.3 0-430.2 300.3a60.3 60.3 0 000 51.5q56.69 119.4 136.5 191.41L112.48 835a8 8 0 000 11.31L155.17 889a8 8 0 0011.31 0l712.15-712.12a8 8 0 000-11.32zM149.3 512C232.6 339.8 350.7 258 512 258c54.54 0 104.13 9.36 149.12 28.39l-70.3 70.3a176 176 0 00-238.13 238.13l-83.42 83.42C223.1 637.49 183.3 582.28 149.3 512zm246.7 0a112.11 112.11 0 01146.2-106.69L401.31 546.2A112 112 0 01396 512z" } }, { "tag": "path", "attrs": { "d": "M508 624c-3.46 0-6.87-.16-10.25-.47l-52.82 52.82a176.09 176.09 0 00227.42-227.42l-52.82 52.82c.31 3.38.47 6.79.47 10.25a111.94 111.94 0 01-112 112z" } }] }, "name": "eye-invisible", "theme": "outlined" };
const EyeInvisibleOutlinedSvg = EyeInvisibleOutlined$2;
var EyeInvisibleOutlined = function EyeInvisibleOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: EyeInvisibleOutlinedSvg
})
});
};
EyeInvisibleOutlined.displayName = "EyeInvisibleOutlined";
const EyeInvisibleOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(EyeInvisibleOutlined);
var __rest$g = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var defaultIconRender = function defaultIconRender2(visible) {
return visible ? /* @__PURE__ */ jsx(EyeOutlined$1, {}) : /* @__PURE__ */ jsx(EyeInvisibleOutlined$1, {});
};
var ActionMap = {
click: "onClick",
hover: "onMouseOver"
};
var Password = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _props$visibilityTogg = props.visibilityToggle, visibilityToggle = _props$visibilityTogg === void 0 ? true : _props$visibilityTogg;
var visibilityControlled = _typeof$q(visibilityToggle) === "object" && visibilityToggle.visible !== void 0;
var _useState = React$a.useState(function() {
return visibilityControlled ? visibilityToggle.visible : false;
}), _useState2 = _slicedToArray$e(_useState, 2), visible = _useState2[0], setVisible = _useState2[1];
var inputRef = React$a.useRef(null);
React__namespace.useEffect(function() {
if (visibilityControlled) {
setVisible(visibilityToggle.visible);
}
}, [visibilityControlled, visibilityToggle]);
var removePasswordTimeout = useRemovePasswordTimeout(inputRef);
var onVisibleChange = function onVisibleChange2() {
var disabled = props.disabled;
if (disabled) {
return;
}
if (visible) {
removePasswordTimeout();
}
setVisible(function(prevState) {
var _a;
var newState = !prevState;
if (_typeof$q(visibilityToggle) === "object") {
(_a = visibilityToggle.onVisibleChange) === null || _a === void 0 ? void 0 : _a.call(visibilityToggle, newState);
}
return newState;
});
};
var getIcon2 = function getIcon3(prefixCls) {
var _iconProps;
var _props$action = props.action, action = _props$action === void 0 ? "click" : _props$action, _props$iconRender = props.iconRender, iconRender = _props$iconRender === void 0 ? defaultIconRender : _props$iconRender;
var iconTrigger = ActionMap[action] || "";
var icon = iconRender(visible);
var iconProps = (_iconProps = {}, _defineProperty$b(_iconProps, iconTrigger, onVisibleChange), _defineProperty$b(_iconProps, "className", "".concat(prefixCls, "-icon")), _defineProperty$b(_iconProps, "key", "passwordIcon"), _defineProperty$b(_iconProps, "onMouseDown", function onMouseDown(e2) {
e2.preventDefault();
}), _defineProperty$b(_iconProps, "onMouseUp", function onMouseUp(e2) {
e2.preventDefault();
}), _iconProps);
return /* @__PURE__ */ React__namespace.cloneElement(/* @__PURE__ */ React__namespace.isValidElement(icon) ? icon : /* @__PURE__ */ jsx("span", {
children: icon
}), iconProps);
};
var renderPassword = function renderPassword2(_ref) {
var getPrefixCls = _ref.getPrefixCls;
var className = props.className, customizePrefixCls = props.prefixCls, customizeInputPrefixCls = props.inputPrefixCls, size = props.size, restProps = __rest$g(props, ["className", "prefixCls", "inputPrefixCls", "size"]);
var inputPrefixCls = getPrefixCls("input", customizeInputPrefixCls);
var prefixCls = getPrefixCls("input-password", customizePrefixCls);
var suffixIcon = visibilityToggle && getIcon2(prefixCls);
var inputClassName = classnames(prefixCls, className, _defineProperty$b({}, "".concat(prefixCls, "-").concat(size), !!size));
var omittedProps = _extends$3(_extends$3({}, omit(restProps, ["suffix", "iconRender", "visibilityToggle"])), {
type: visible ? "text" : "password",
className: inputClassName,
prefixCls: inputPrefixCls,
suffix: suffixIcon
});
if (size) {
omittedProps.size = size;
}
return /* @__PURE__ */ jsx(InternalInput, {
ref: composeRef(ref, inputRef),
...omittedProps
});
};
return /* @__PURE__ */ jsx(ConfigConsumer, {
children: renderPassword
});
});
const Password$1 = Password;
var __rest$f = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var Search = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _classNames;
var customizePrefixCls = props.prefixCls, customizeInputPrefixCls = props.inputPrefixCls, className = props.className, customizeSize = props.size, suffix = props.suffix, _props$enterButton = props.enterButton, enterButton = _props$enterButton === void 0 ? false : _props$enterButton, addonAfter = props.addonAfter, loading = props.loading, disabled = props.disabled, customOnSearch = props.onSearch, customOnChange = props.onChange, onCompositionStart = props.onCompositionStart, onCompositionEnd = props.onCompositionEnd, restProps = __rest$f(props, ["prefixCls", "inputPrefixCls", "className", "size", "suffix", "enterButton", "addonAfter", "loading", "disabled", "onSearch", "onChange", "onCompositionStart", "onCompositionEnd"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var contextSize = React__namespace.useContext(SizeContext$1);
var composedRef = React__namespace.useRef(false);
var prefixCls = getPrefixCls("input-search", customizePrefixCls);
var inputPrefixCls = getPrefixCls("input", customizeInputPrefixCls);
var _useCompactItemContex = useCompactItemContext(prefixCls, direction), compactSize = _useCompactItemContex.compactSize;
var size = compactSize || customizeSize || contextSize;
var inputRef = React__namespace.useRef(null);
var onChange = function onChange2(e2) {
if (e2 && e2.target && e2.type === "click" && customOnSearch) {
customOnSearch(e2.target.value, e2);
}
if (customOnChange) {
customOnChange(e2);
}
};
var onMouseDown = function onMouseDown2(e2) {
var _a;
if (document.activeElement === ((_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.input)) {
e2.preventDefault();
}
};
var onSearch = function onSearch2(e2) {
var _a, _b;
if (customOnSearch) {
customOnSearch((_b = (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.input) === null || _b === void 0 ? void 0 : _b.value, e2);
}
};
var onPressEnter = function onPressEnter2(e2) {
if (composedRef.current || loading) {
return;
}
onSearch(e2);
};
var searchIcon = typeof enterButton === "boolean" ? /* @__PURE__ */ jsx(SearchOutlined$1, {}) : null;
var btnClassName = "".concat(prefixCls, "-button");
var button;
var enterButtonAsElement = enterButton || {};
var isAntdButton = enterButtonAsElement.type && enterButtonAsElement.type.__ANT_BUTTON === true;
if (isAntdButton || enterButtonAsElement.type === "button") {
button = cloneElement(enterButtonAsElement, _extends$3({
onMouseDown,
onClick: function onClick(e2) {
var _a, _b;
(_b = (_a = enterButtonAsElement === null || enterButtonAsElement === void 0 ? void 0 : enterButtonAsElement.props) === null || _a === void 0 ? void 0 : _a.onClick) === null || _b === void 0 ? void 0 : _b.call(_a, e2);
onSearch(e2);
},
key: "enterButton"
}, isAntdButton ? {
className: btnClassName,
size
} : {}));
} else {
button = /* @__PURE__ */ jsx(Button$2, {
className: btnClassName,
type: enterButton ? "primary" : void 0,
size,
disabled,
onMouseDown,
onClick: onSearch,
loading,
icon: searchIcon,
children: enterButton
}, "enterButton");
}
if (addonAfter) {
button = [button, cloneElement(addonAfter, {
key: "addonAfter"
})];
}
var cls = classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(size), !!size), _defineProperty$b(_classNames, "".concat(prefixCls, "-with-button"), !!enterButton), _classNames), className);
var handleOnCompositionStart = function handleOnCompositionStart2(e2) {
composedRef.current = true;
onCompositionStart === null || onCompositionStart === void 0 ? void 0 : onCompositionStart(e2);
};
var handleOnCompositionEnd = function handleOnCompositionEnd2(e2) {
composedRef.current = false;
onCompositionEnd === null || onCompositionEnd === void 0 ? void 0 : onCompositionEnd(e2);
};
return /* @__PURE__ */ jsx(InternalInput, {
ref: composeRef(inputRef, ref),
onPressEnter,
...restProps,
size,
onCompositionStart: handleOnCompositionStart,
onCompositionEnd: handleOnCompositionEnd,
prefixCls: inputPrefixCls,
addonAfter: button,
suffix,
onChange,
className: cls,
disabled
});
});
const Search$1 = Search;
var HIDDEN_TEXTAREA_STYLE = "\n min-height:0 !important;\n max-height:none !important;\n height:0 !important;\n visibility:hidden !important;\n overflow:hidden !important;\n position:absolute !important;\n z-index:-1000 !important;\n top:0 !important;\n right:0 !important;\n pointer-events: none !important;\n";
var SIZING_STYLE = ["letter-spacing", "line-height", "padding-top", "padding-bottom", "font-family", "font-weight", "font-size", "font-variant", "text-rendering", "text-transform", "width", "text-indent", "padding-left", "padding-right", "border-width", "box-sizing", "word-break"];
var computedStyleCache = {};
var hiddenTextarea;
function calculateNodeStyling(node) {
var useCache2 = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
var nodeRef = node.getAttribute("id") || node.getAttribute("data-reactid") || node.getAttribute("name");
if (useCache2 && computedStyleCache[nodeRef]) {
return computedStyleCache[nodeRef];
}
var style2 = window.getComputedStyle(node);
var boxSizing = style2.getPropertyValue("box-sizing") || style2.getPropertyValue("-moz-box-sizing") || style2.getPropertyValue("-webkit-box-sizing");
var paddingSize = parseFloat(style2.getPropertyValue("padding-bottom")) + parseFloat(style2.getPropertyValue("padding-top"));
var borderSize = parseFloat(style2.getPropertyValue("border-bottom-width")) + parseFloat(style2.getPropertyValue("border-top-width"));
var sizingStyle = SIZING_STYLE.map(function(name2) {
return "".concat(name2, ":").concat(style2.getPropertyValue(name2));
}).join(";");
var nodeInfo = {
sizingStyle,
paddingSize,
borderSize,
boxSizing
};
if (useCache2 && nodeRef) {
computedStyleCache[nodeRef] = nodeInfo;
}
return nodeInfo;
}
function calculateAutoSizeStyle(uiTextNode) {
var useCache2 = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
var minRows = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : null;
var maxRows = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : null;
if (!hiddenTextarea) {
hiddenTextarea = document.createElement("textarea");
hiddenTextarea.setAttribute("tab-index", "-1");
hiddenTextarea.setAttribute("aria-hidden", "true");
document.body.appendChild(hiddenTextarea);
}
if (uiTextNode.getAttribute("wrap")) {
hiddenTextarea.setAttribute("wrap", uiTextNode.getAttribute("wrap"));
} else {
hiddenTextarea.removeAttribute("wrap");
}
var _calculateNodeStyling = calculateNodeStyling(uiTextNode, useCache2), paddingSize = _calculateNodeStyling.paddingSize, borderSize = _calculateNodeStyling.borderSize, boxSizing = _calculateNodeStyling.boxSizing, sizingStyle = _calculateNodeStyling.sizingStyle;
hiddenTextarea.setAttribute("style", "".concat(sizingStyle, ";").concat(HIDDEN_TEXTAREA_STYLE));
hiddenTextarea.value = uiTextNode.value || uiTextNode.placeholder || "";
var minHeight = void 0;
var maxHeight = void 0;
var overflowY;
var height = hiddenTextarea.scrollHeight;
if (boxSizing === "border-box") {
height += borderSize;
} else if (boxSizing === "content-box") {
height -= paddingSize;
}
if (minRows !== null || maxRows !== null) {
hiddenTextarea.value = " ";
var singleRowHeight = hiddenTextarea.scrollHeight - paddingSize;
if (minRows !== null) {
minHeight = singleRowHeight * minRows;
if (boxSizing === "border-box") {
minHeight = minHeight + paddingSize + borderSize;
}
height = Math.max(minHeight, height);
}
if (maxRows !== null) {
maxHeight = singleRowHeight * maxRows;
if (boxSizing === "border-box") {
maxHeight = maxHeight + paddingSize + borderSize;
}
overflowY = height > maxHeight ? "" : "hidden";
height = Math.min(maxHeight, height);
}
}
var style2 = {
height,
overflowY,
resize: "none"
};
if (minHeight) {
style2.minHeight = minHeight;
}
if (maxHeight) {
style2.maxHeight = maxHeight;
}
return style2;
}
var _excluded$h = ["prefixCls", "onPressEnter", "defaultValue", "value", "autoSize", "onResize", "className", "style", "disabled", "onChange", "onInternalAutoSize"];
var RESIZE_START = 0;
var RESIZE_MEASURING = 1;
var RESIZE_STABLE = 2;
var ResizableTextArea = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-textarea" : _props$prefixCls;
props.onPressEnter;
var defaultValue = props.defaultValue, value = props.value, autoSize = props.autoSize, onResize2 = props.onResize, className = props.className, style2 = props.style, disabled = props.disabled, onChange = props.onChange;
props.onInternalAutoSize;
var restProps = _objectWithoutProperties$1(props, _excluded$h);
var _useMergedState = useMergedState(defaultValue, {
value,
postState: function postState(val) {
return val !== null && val !== void 0 ? val : "";
}
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), mergedValue = _useMergedState2[0], setMergedValue = _useMergedState2[1];
var onInternalChange = function onInternalChange2(event) {
setMergedValue(event.target.value);
onChange === null || onChange === void 0 ? void 0 : onChange(event);
};
var textareaRef = React__namespace.useRef();
React__namespace.useImperativeHandle(ref, function() {
return {
textArea: textareaRef.current
};
});
var _React$useMemo = React__namespace.useMemo(function() {
if (autoSize && _typeof$q(autoSize) === "object") {
return [autoSize.minRows, autoSize.maxRows];
}
return [];
}, [autoSize]), _React$useMemo2 = _slicedToArray$e(_React$useMemo, 2), minRows = _React$useMemo2[0], maxRows = _React$useMemo2[1];
var needAutoSize = !!autoSize;
var fixFirefoxAutoScroll = function fixFirefoxAutoScroll2() {
try {
if (document.activeElement === textareaRef.current) {
var _textareaRef$current = textareaRef.current, selectionStart = _textareaRef$current.selectionStart, selectionEnd = _textareaRef$current.selectionEnd, scrollTop = _textareaRef$current.scrollTop;
textareaRef.current.setSelectionRange(selectionStart, selectionEnd);
textareaRef.current.scrollTop = scrollTop;
}
} catch (e2) {
}
};
var _React$useState = React__namespace.useState(RESIZE_STABLE), _React$useState2 = _slicedToArray$e(_React$useState, 2), resizeState = _React$useState2[0], setResizeState = _React$useState2[1];
var _React$useState3 = React__namespace.useState(), _React$useState4 = _slicedToArray$e(_React$useState3, 2), autoSizeStyle = _React$useState4[0], setAutoSizeStyle = _React$useState4[1];
var startResize = function startResize2() {
setResizeState(RESIZE_START);
};
useLayoutEffect$1(function() {
if (needAutoSize) {
startResize();
}
}, [value, minRows, maxRows, needAutoSize]);
useLayoutEffect$1(function() {
if (resizeState === RESIZE_START) {
setResizeState(RESIZE_MEASURING);
} else if (resizeState === RESIZE_MEASURING) {
var textareaStyles = calculateAutoSizeStyle(textareaRef.current, false, minRows, maxRows);
setResizeState(RESIZE_STABLE);
setAutoSizeStyle(textareaStyles);
} else {
fixFirefoxAutoScroll();
}
}, [resizeState]);
var resizeRafRef = React__namespace.useRef();
var cleanRaf = function cleanRaf2() {
wrapperRaf$1.cancel(resizeRafRef.current);
};
var onInternalResize = function onInternalResize2(size) {
if (resizeState === RESIZE_STABLE) {
onResize2 === null || onResize2 === void 0 ? void 0 : onResize2(size);
if (autoSize) {
cleanRaf();
resizeRafRef.current = wrapperRaf$1(function() {
startResize();
});
}
}
};
React__namespace.useEffect(function() {
return cleanRaf;
}, []);
var mergedAutoSizeStyle = needAutoSize ? autoSizeStyle : null;
var mergedStyle = _objectSpread2$a(_objectSpread2$a({}, style2), mergedAutoSizeStyle);
if (resizeState === RESIZE_START || resizeState === RESIZE_MEASURING) {
mergedStyle.overflowY = "hidden";
mergedStyle.overflowX = "hidden";
}
return /* @__PURE__ */ jsx(RefResizeObserver, {
onResize: onInternalResize,
disabled: !(autoSize || onResize2),
children: /* @__PURE__ */ jsx("textarea", {
...restProps,
ref: textareaRef,
style: mergedStyle,
className: classnames(prefixCls, className, _defineProperty$b({}, "".concat(prefixCls, "-disabled"), disabled)),
disabled,
value: mergedValue,
onChange: onInternalChange
})
});
});
var TextArea$4 = /* @__PURE__ */ function(_React$Component) {
_inherits(TextArea2, _React$Component);
var _super = _createSuper(TextArea2);
function TextArea2(props) {
var _this2;
_classCallCheck(this, TextArea2);
_this2 = _super.call(this, props);
_this2.resizableTextArea = void 0;
_this2.focus = function() {
_this2.resizableTextArea.textArea.focus();
};
_this2.saveTextArea = function(resizableTextArea) {
_this2.resizableTextArea = resizableTextArea;
};
_this2.handleChange = function(e2) {
var onChange = _this2.props.onChange;
_this2.setValue(e2.target.value);
if (onChange) {
onChange(e2);
}
};
_this2.handleKeyDown = function(e2) {
var _this$props = _this2.props, onPressEnter = _this$props.onPressEnter, onKeyDown2 = _this$props.onKeyDown;
if (e2.keyCode === 13 && onPressEnter) {
onPressEnter(e2);
}
if (onKeyDown2) {
onKeyDown2(e2);
}
};
var value = typeof props.value === "undefined" || props.value === null ? props.defaultValue : props.value;
_this2.state = {
value
};
return _this2;
}
_createClass(TextArea2, [{
key: "setValue",
value: function setValue2(value, callback) {
if (!("value" in this.props)) {
this.setState({
value
}, callback);
}
}
}, {
key: "blur",
value: function blur() {
this.resizableTextArea.textArea.blur();
}
}, {
key: "render",
value: function render2() {
return /* @__PURE__ */ jsx(ResizableTextArea, {
...this.props,
value: this.state.value,
onKeyDown: this.handleKeyDown,
onChange: this.handleChange,
ref: this.saveTextArea
});
}
}], [{
key: "getDerivedStateFromProps",
value: function getDerivedStateFromProps(nextProps) {
if ("value" in nextProps) {
return {
value: nextProps.value
};
}
return null;
}
}]);
return TextArea2;
}(React__namespace.Component);
var ClearableInputType = tuple$1("text", "input");
function hasAddon(props) {
return !!(props.addonBefore || props.addonAfter);
}
var ClearableLabeledInput = /* @__PURE__ */ function(_React$Component) {
_inherits(ClearableLabeledInput2, _React$Component);
var _super = _createSuper(ClearableLabeledInput2);
function ClearableLabeledInput2() {
_classCallCheck(this, ClearableLabeledInput2);
return _super.apply(this, arguments);
}
_createClass(ClearableLabeledInput2, [{
key: "renderClearIcon",
value: function renderClearIcon(prefixCls) {
var _classNames;
var _this$props = this.props, value = _this$props.value, disabled = _this$props.disabled, readOnly = _this$props.readOnly, handleReset = _this$props.handleReset, suffix = _this$props.suffix;
var needClear = !disabled && !readOnly && value;
var className = "".concat(prefixCls, "-clear-icon");
return /* @__PURE__ */ jsx(CloseCircleFilled$1, {
onClick: handleReset,
onMouseDown: function onMouseDown(e2) {
return e2.preventDefault();
},
className: classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(className, "-hidden"), !needClear), _defineProperty$b(_classNames, "".concat(className, "-has-suffix"), !!suffix), _classNames), className),
role: "button"
});
}
}, {
key: "renderTextAreaWithClearIcon",
value: function renderTextAreaWithClearIcon(prefixCls, element, statusContext) {
var _classNames2;
var _this$props2 = this.props, value = _this$props2.value, allowClear = _this$props2.allowClear, className = _this$props2.className, style2 = _this$props2.style, direction = _this$props2.direction, bordered = _this$props2.bordered, hidden = _this$props2.hidden, customStatus = _this$props2.status;
var contextStatus = statusContext.status, hasFeedback = statusContext.hasFeedback;
if (!allowClear) {
return cloneElement(element, {
value
});
}
var affixWrapperCls = classnames("".concat(prefixCls, "-affix-wrapper"), "".concat(prefixCls, "-affix-wrapper-textarea-with-clear-btn"), getStatusClassNames("".concat(prefixCls, "-affix-wrapper"), getMergedStatus(contextStatus, customStatus), hasFeedback), (_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-affix-wrapper-rtl"), direction === "rtl"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-affix-wrapper-borderless"), !bordered), _defineProperty$b(_classNames2, "".concat(className), !hasAddon(this.props) && className), _classNames2));
return /* @__PURE__ */ jsxs("span", {
className: affixWrapperCls,
style: style2,
hidden,
children: [cloneElement(element, {
style: null,
value
}), this.renderClearIcon(prefixCls)]
});
}
}, {
key: "render",
value: function render2() {
var _this2 = this;
return /* @__PURE__ */ jsx(FormItemInputContext.Consumer, {
children: function(statusContext) {
var _this$props3 = _this2.props, prefixCls = _this$props3.prefixCls, inputType = _this$props3.inputType, element = _this$props3.element;
if (inputType === ClearableInputType[0]) {
return _this2.renderTextAreaWithClearIcon(prefixCls, element, statusContext);
}
}
});
}
}]);
return ClearableLabeledInput2;
}(React__namespace.Component);
const ClearableLabeledInput$1 = ClearableLabeledInput;
var __rest$e = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
function fixEmojiLength(value, maxLength) {
return _toConsumableArray$c(value || "").slice(0, maxLength).join("");
}
function setTriggerValue(isCursorInEnd, preValue, triggerValue, maxLength) {
var newTriggerValue = triggerValue;
if (isCursorInEnd) {
newTriggerValue = fixEmojiLength(triggerValue, maxLength);
} else if (_toConsumableArray$c(preValue || "").length < triggerValue.length && _toConsumableArray$c(triggerValue || "").length > maxLength) {
newTriggerValue = preValue;
}
return newTriggerValue;
}
var TextArea$2 = /* @__PURE__ */ React__namespace.forwardRef(function(_a, ref) {
var _classNames;
var customizePrefixCls = _a.prefixCls, _a$bordered = _a.bordered, bordered = _a$bordered === void 0 ? true : _a$bordered, _a$showCount = _a.showCount, showCount = _a$showCount === void 0 ? false : _a$showCount, maxLength = _a.maxLength, className = _a.className, style2 = _a.style, customizeSize = _a.size, customDisabled = _a.disabled, onCompositionStart = _a.onCompositionStart, onCompositionEnd = _a.onCompositionEnd, onChange = _a.onChange, customStatus = _a.status, props = __rest$e(_a, ["prefixCls", "bordered", "showCount", "maxLength", "className", "style", "size", "disabled", "onCompositionStart", "onCompositionEnd", "onChange", "status"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var size = React__namespace.useContext(SizeContext$1);
var disabled = React__namespace.useContext(DisabledContext$1);
var mergedDisabled = customDisabled !== null && customDisabled !== void 0 ? customDisabled : disabled;
var _React$useContext2 = React__namespace.useContext(FormItemInputContext), contextStatus = _React$useContext2.status, hasFeedback = _React$useContext2.hasFeedback, isFormItemInput = _React$useContext2.isFormItemInput, feedbackIcon = _React$useContext2.feedbackIcon;
var mergedStatus = getMergedStatus(contextStatus, customStatus);
var innerRef = React__namespace.useRef(null);
var clearableInputRef = React__namespace.useRef(null);
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), compositing = _React$useState2[0], setCompositing = _React$useState2[1];
var oldCompositionValueRef = React__namespace.useRef();
var oldSelectionStartRef = React__namespace.useRef(0);
var _useMergedState = useMergedState(props.defaultValue, {
value: props.value
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), value = _useMergedState2[0], setValue2 = _useMergedState2[1];
var hidden = props.hidden;
var handleSetValue = function handleSetValue2(val2, callback) {
if (props.value === void 0) {
setValue2(val2);
callback === null || callback === void 0 ? void 0 : callback();
}
};
var hasMaxLength = Number(maxLength) > 0;
var onInternalCompositionStart = function onInternalCompositionStart2(e2) {
setCompositing(true);
oldCompositionValueRef.current = value;
oldSelectionStartRef.current = e2.currentTarget.selectionStart;
onCompositionStart === null || onCompositionStart === void 0 ? void 0 : onCompositionStart(e2);
};
var onInternalCompositionEnd = function onInternalCompositionEnd2(e2) {
var _a2;
setCompositing(false);
var triggerValue = e2.currentTarget.value;
if (hasMaxLength) {
var isCursorInEnd = oldSelectionStartRef.current >= maxLength + 1 || oldSelectionStartRef.current === ((_a2 = oldCompositionValueRef.current) === null || _a2 === void 0 ? void 0 : _a2.length);
triggerValue = setTriggerValue(isCursorInEnd, oldCompositionValueRef.current, triggerValue, maxLength);
}
if (triggerValue !== value) {
handleSetValue(triggerValue);
resolveOnChange(e2.currentTarget, e2, onChange, triggerValue);
}
onCompositionEnd === null || onCompositionEnd === void 0 ? void 0 : onCompositionEnd(e2);
};
var handleChange = function handleChange2(e2) {
var triggerValue = e2.target.value;
if (!compositing && hasMaxLength) {
var isCursorInEnd = e2.target.selectionStart >= maxLength + 1 || e2.target.selectionStart === triggerValue.length || !e2.target.selectionStart;
triggerValue = setTriggerValue(isCursorInEnd, value, triggerValue, maxLength);
}
handleSetValue(triggerValue);
resolveOnChange(e2.currentTarget, e2, onChange, triggerValue);
};
var handleReset = function handleReset2(e2) {
var _a2, _b, _c;
handleSetValue("");
(_a2 = innerRef.current) === null || _a2 === void 0 ? void 0 : _a2.focus();
resolveOnChange((_c = (_b = innerRef.current) === null || _b === void 0 ? void 0 : _b.resizableTextArea) === null || _c === void 0 ? void 0 : _c.textArea, e2, onChange);
};
var prefixCls = getPrefixCls("input", customizePrefixCls);
React__namespace.useImperativeHandle(ref, function() {
var _a2;
return {
resizableTextArea: (_a2 = innerRef.current) === null || _a2 === void 0 ? void 0 : _a2.resizableTextArea,
focus: function focus(option) {
var _a3, _b;
triggerFocus((_b = (_a3 = innerRef.current) === null || _a3 === void 0 ? void 0 : _a3.resizableTextArea) === null || _b === void 0 ? void 0 : _b.textArea, option);
},
blur: function blur() {
var _a3;
return (_a3 = innerRef.current) === null || _a3 === void 0 ? void 0 : _a3.blur();
}
};
});
var textArea = /* @__PURE__ */ jsx(TextArea$4, {
...omit(props, ["allowClear"]),
disabled: mergedDisabled,
className: classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-borderless"), !bordered), _defineProperty$b(_classNames, className, className && !showCount), _defineProperty$b(_classNames, "".concat(prefixCls, "-sm"), size === "small" || customizeSize === "small"), _defineProperty$b(_classNames, "".concat(prefixCls, "-lg"), size === "large" || customizeSize === "large"), _classNames), getStatusClassNames(prefixCls, mergedStatus)),
style: showCount ? {
resize: style2 === null || style2 === void 0 ? void 0 : style2.resize
} : style2,
prefixCls,
onCompositionStart: onInternalCompositionStart,
onChange: handleChange,
onCompositionEnd: onInternalCompositionEnd,
ref: innerRef
});
var val = fixControlledValue(value);
if (!compositing && hasMaxLength && (props.value === null || props.value === void 0)) {
val = fixEmojiLength(val, maxLength);
}
var textareaNode = /* @__PURE__ */ jsx(ClearableLabeledInput$1, {
disabled: mergedDisabled,
...props,
prefixCls,
direction,
inputType: "text",
value: val,
element: textArea,
handleReset,
ref: clearableInputRef,
bordered,
status: customStatus,
style: showCount ? void 0 : style2
});
if (showCount || hasFeedback) {
var _classNames2;
var valueLength = _toConsumableArray$c(val).length;
var dataCount = "";
if (_typeof$q(showCount) === "object") {
dataCount = showCount.formatter({
value: val,
count: valueLength,
maxLength
});
} else {
dataCount = "".concat(valueLength).concat(hasMaxLength ? " / ".concat(maxLength) : "");
}
return /* @__PURE__ */ jsxs("div", {
hidden,
className: classnames("".concat(prefixCls, "-textarea"), (_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-textarea-rtl"), direction === "rtl"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-textarea-show-count"), showCount), _defineProperty$b(_classNames2, "".concat(prefixCls, "-textarea-in-form-item"), isFormItemInput), _classNames2), getStatusClassNames("".concat(prefixCls, "-textarea"), mergedStatus, hasFeedback), className),
style: style2,
"data-count": dataCount,
children: [textareaNode, hasFeedback && /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-textarea-suffix"),
children: feedbackIcon
})]
});
}
return textareaNode;
});
const TextArea$3 = TextArea$2;
var Input$1 = InternalInput;
Input$1.Group = Group$1;
Input$1.Search = Search$1;
Input$1.TextArea = TextArea$3;
Input$1.Password = Password$1;
const Input$2 = Input$1;
var UpOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M890.5 755.3L537.9 269.2c-12.8-17.6-39-17.6-51.7 0L133.5 755.3A8 8 0 00140 768h75c5.1 0 9.9-2.5 12.9-6.6L512 369.8l284.1 391.6c3 4.1 7.8 6.6 12.9 6.6h75c6.5 0 10.3-7.4 6.5-12.7z" } }] }, "name": "up", "theme": "outlined" };
const UpOutlinedSvg = UpOutlined$2;
var UpOutlined = function UpOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: UpOutlinedSvg
})
});
};
UpOutlined.displayName = "UpOutlined";
const UpOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(UpOutlined);
function supportBigInt() {
return typeof BigInt === "function";
}
function trimNumber(numStr) {
var str = numStr.trim();
var negative = str.startsWith("-");
if (negative) {
str = str.slice(1);
}
str = str.replace(/(\.\d*[^0])0*$/, "$1").replace(/\.0*$/, "").replace(/^0+/, "");
if (str.startsWith(".")) {
str = "0".concat(str);
}
var trimStr = str || "0";
var splitNumber = trimStr.split(".");
var integerStr = splitNumber[0] || "0";
var decimalStr = splitNumber[1] || "0";
if (integerStr === "0" && decimalStr === "0") {
negative = false;
}
var negativeStr = negative ? "-" : "";
return {
negative,
negativeStr,
trimStr,
integerStr,
decimalStr,
fullStr: "".concat(negativeStr).concat(trimStr)
};
}
function isE(number2) {
var str = String(number2);
return !Number.isNaN(Number(str)) && str.includes("e");
}
function getNumberPrecision(number2) {
var numStr = String(number2);
if (isE(number2)) {
var precision = Number(numStr.slice(numStr.indexOf("e-") + 2));
var decimalMatch = numStr.match(/\.(\d+)/);
if (decimalMatch === null || decimalMatch === void 0 ? void 0 : decimalMatch[1]) {
precision += decimalMatch[1].length;
}
return precision;
}
return numStr.includes(".") && validateNumber(numStr) ? numStr.length - numStr.indexOf(".") - 1 : 0;
}
function num2str(number2) {
var numStr = String(number2);
if (isE(number2)) {
if (number2 > Number.MAX_SAFE_INTEGER) {
return String(supportBigInt() ? BigInt(number2).toString() : Number.MAX_SAFE_INTEGER);
}
if (number2 < Number.MIN_SAFE_INTEGER) {
return String(supportBigInt() ? BigInt(number2).toString() : Number.MIN_SAFE_INTEGER);
}
numStr = number2.toFixed(getNumberPrecision(numStr));
}
return trimNumber(numStr).fullStr;
}
function validateNumber(num) {
if (typeof num === "number") {
return !Number.isNaN(num);
}
if (!num) {
return false;
}
return /^\s*-?\d+(\.\d+)?\s*$/.test(num) || /^\s*-?\d+\.\s*$/.test(num) || /^\s*-?\.\d+\s*$/.test(num);
}
function getDecupleSteps(step2) {
var stepStr = typeof step2 === "number" ? num2str(step2) : trimNumber(step2).fullStr;
var hasPoint = stepStr.includes(".");
if (!hasPoint) {
return step2 + "0";
}
return trimNumber(stepStr.replace(/(\d)\.(\d)/g, "$1$2.")).fullStr;
}
var NumberDecimal = /* @__PURE__ */ function() {
function NumberDecimal2(value) {
_classCallCheck(this, NumberDecimal2);
this.origin = "";
this.number = void 0;
this.empty = void 0;
if (!value && value !== 0 || !String(value).trim()) {
this.empty = true;
return;
}
this.origin = String(value);
this.number = Number(value);
}
_createClass(NumberDecimal2, [{
key: "negate",
value: function negate2() {
return new NumberDecimal2(-this.toNumber());
}
}, {
key: "add",
value: function add(value) {
if (this.isInvalidate()) {
return new NumberDecimal2(value);
}
var target = Number(value);
if (Number.isNaN(target)) {
return this;
}
var number2 = this.number + target;
if (number2 > Number.MAX_SAFE_INTEGER) {
return new NumberDecimal2(Number.MAX_SAFE_INTEGER);
}
if (number2 < Number.MIN_SAFE_INTEGER) {
return new NumberDecimal2(Number.MIN_SAFE_INTEGER);
}
var maxPrecision = Math.max(getNumberPrecision(this.number), getNumberPrecision(target));
return new NumberDecimal2(number2.toFixed(maxPrecision));
}
}, {
key: "isEmpty",
value: function isEmpty() {
return this.empty;
}
}, {
key: "isNaN",
value: function isNaN2() {
return Number.isNaN(this.number);
}
}, {
key: "isInvalidate",
value: function isInvalidate() {
return this.isEmpty() || this.isNaN();
}
}, {
key: "equals",
value: function equals(target) {
return this.toNumber() === (target === null || target === void 0 ? void 0 : target.toNumber());
}
}, {
key: "lessEquals",
value: function lessEquals(target) {
return this.add(target.negate().toString()).toNumber() <= 0;
}
}, {
key: "toNumber",
value: function toNumber2() {
return this.number;
}
}, {
key: "toString",
value: function toString2() {
var safe = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
if (!safe) {
return this.origin;
}
if (this.isInvalidate()) {
return "";
}
return num2str(this.number);
}
}]);
return NumberDecimal2;
}();
var BigIntDecimal = /* @__PURE__ */ function() {
function BigIntDecimal2(value) {
_classCallCheck(this, BigIntDecimal2);
this.origin = "";
this.negative = void 0;
this.integer = void 0;
this.decimal = void 0;
this.decimalLen = void 0;
this.empty = void 0;
this.nan = void 0;
if (!value && value !== 0 || !String(value).trim()) {
this.empty = true;
return;
}
this.origin = String(value);
if (value === "-") {
this.nan = true;
return;
}
var mergedValue = value;
if (isE(mergedValue)) {
mergedValue = Number(mergedValue);
}
mergedValue = typeof mergedValue === "string" ? mergedValue : num2str(mergedValue);
if (validateNumber(mergedValue)) {
var trimRet = trimNumber(mergedValue);
this.negative = trimRet.negative;
var numbers = trimRet.trimStr.split(".");
this.integer = BigInt(numbers[0]);
var decimalStr = numbers[1] || "0";
this.decimal = BigInt(decimalStr);
this.decimalLen = decimalStr.length;
} else {
this.nan = true;
}
}
_createClass(BigIntDecimal2, [{
key: "getMark",
value: function getMark2() {
return this.negative ? "-" : "";
}
}, {
key: "getIntegerStr",
value: function getIntegerStr() {
return this.integer.toString();
}
}, {
key: "getDecimalStr",
value: function getDecimalStr() {
return this.decimal.toString().padStart(this.decimalLen, "0");
}
}, {
key: "alignDecimal",
value: function alignDecimal(decimalLength) {
var str = "".concat(this.getMark()).concat(this.getIntegerStr()).concat(this.getDecimalStr().padEnd(decimalLength, "0"));
return BigInt(str);
}
}, {
key: "negate",
value: function negate2() {
var clone = new BigIntDecimal2(this.toString());
clone.negative = !clone.negative;
return clone;
}
}, {
key: "add",
value: function add(value) {
if (this.isInvalidate()) {
return new BigIntDecimal2(value);
}
var offset2 = new BigIntDecimal2(value);
if (offset2.isInvalidate()) {
return this;
}
var maxDecimalLength = Math.max(this.getDecimalStr().length, offset2.getDecimalStr().length);
var myAlignedDecimal = this.alignDecimal(maxDecimalLength);
var offsetAlignedDecimal = offset2.alignDecimal(maxDecimalLength);
var valueStr = (myAlignedDecimal + offsetAlignedDecimal).toString();
var _trimNumber = trimNumber(valueStr), negativeStr = _trimNumber.negativeStr, trimStr = _trimNumber.trimStr;
var hydrateValueStr = "".concat(negativeStr).concat(trimStr.padStart(maxDecimalLength + 1, "0"));
return new BigIntDecimal2("".concat(hydrateValueStr.slice(0, -maxDecimalLength), ".").concat(hydrateValueStr.slice(-maxDecimalLength)));
}
}, {
key: "isEmpty",
value: function isEmpty() {
return this.empty;
}
}, {
key: "isNaN",
value: function isNaN2() {
return this.nan;
}
}, {
key: "isInvalidate",
value: function isInvalidate() {
return this.isEmpty() || this.isNaN();
}
}, {
key: "equals",
value: function equals(target) {
return this.toString() === (target === null || target === void 0 ? void 0 : target.toString());
}
}, {
key: "lessEquals",
value: function lessEquals(target) {
return this.add(target.negate().toString()).toNumber() <= 0;
}
}, {
key: "toNumber",
value: function toNumber2() {
if (this.isNaN()) {
return NaN;
}
return Number(this.toString());
}
}, {
key: "toString",
value: function toString2() {
var safe = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
if (!safe) {
return this.origin;
}
if (this.isInvalidate()) {
return "";
}
return trimNumber("".concat(this.getMark()).concat(this.getIntegerStr(), ".").concat(this.getDecimalStr())).fullStr;
}
}]);
return BigIntDecimal2;
}();
function getMiniDecimal(value) {
if (supportBigInt()) {
return new BigIntDecimal(value);
}
return new NumberDecimal(value);
}
function toFixed(numStr, separatorStr, precision) {
var cutOnly = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : false;
if (numStr === "") {
return "";
}
var _trimNumber2 = trimNumber(numStr), negativeStr = _trimNumber2.negativeStr, integerStr = _trimNumber2.integerStr, decimalStr = _trimNumber2.decimalStr;
var precisionDecimalStr = "".concat(separatorStr).concat(decimalStr);
var numberWithoutDecimal = "".concat(negativeStr).concat(integerStr);
if (precision >= 0) {
var advancedNum = Number(decimalStr[precision]);
if (advancedNum >= 5 && !cutOnly) {
var advancedDecimal = getMiniDecimal(numStr).add("".concat(negativeStr, "0.").concat("0".repeat(precision)).concat(10 - advancedNum));
return toFixed(advancedDecimal.toString(), separatorStr, precision, cutOnly);
}
if (precision === 0) {
return numberWithoutDecimal;
}
return "".concat(numberWithoutDecimal).concat(separatorStr).concat(decimalStr.padEnd(precision, "0").slice(0, precision));
}
if (precisionDecimalStr === ".0") {
return numberWithoutDecimal;
}
return "".concat(numberWithoutDecimal).concat(precisionDecimalStr);
}
var STEP_INTERVAL = 200;
var STEP_DELAY = 600;
function StepHandler(_ref) {
var prefixCls = _ref.prefixCls, upNode = _ref.upNode, downNode = _ref.downNode, upDisabled = _ref.upDisabled, downDisabled = _ref.downDisabled, onStep = _ref.onStep;
var stepTimeoutRef = React__namespace.useRef();
var onStepRef = React__namespace.useRef();
onStepRef.current = onStep;
var onStepMouseDown = function onStepMouseDown2(e2, up) {
e2.preventDefault();
onStepRef.current(up);
function loopStep() {
onStepRef.current(up);
stepTimeoutRef.current = setTimeout(loopStep, STEP_INTERVAL);
}
stepTimeoutRef.current = setTimeout(loopStep, STEP_DELAY);
};
var onStopStep = function onStopStep2() {
clearTimeout(stepTimeoutRef.current);
};
React__namespace.useEffect(function() {
return onStopStep;
}, []);
if (isMobile$1()) {
return null;
}
var handlerClassName = "".concat(prefixCls, "-handler");
var upClassName = classnames(handlerClassName, "".concat(handlerClassName, "-up"), _defineProperty$b({}, "".concat(handlerClassName, "-up-disabled"), upDisabled));
var downClassName = classnames(handlerClassName, "".concat(handlerClassName, "-down"), _defineProperty$b({}, "".concat(handlerClassName, "-down-disabled"), downDisabled));
var sharedHandlerProps = {
unselectable: "on",
role: "button",
onMouseUp: onStopStep,
onMouseLeave: onStopStep
};
return /* @__PURE__ */ jsxs("div", {
className: "".concat(handlerClassName, "-wrap"),
children: [/* @__PURE__ */ jsx("span", {
...sharedHandlerProps,
onMouseDown: function onMouseDown(e2) {
onStepMouseDown(e2, true);
},
"aria-label": "Increase Value",
"aria-disabled": upDisabled,
className: upClassName,
children: upNode || /* @__PURE__ */ jsx("span", {
unselectable: "on",
className: "".concat(prefixCls, "-handler-up-inner")
})
}), /* @__PURE__ */ jsx("span", {
...sharedHandlerProps,
onMouseDown: function onMouseDown(e2) {
onStepMouseDown(e2, false);
},
"aria-label": "Decrease Value",
"aria-disabled": downDisabled,
className: downClassName,
children: downNode || /* @__PURE__ */ jsx("span", {
unselectable: "on",
className: "".concat(prefixCls, "-handler-down-inner")
})
})]
});
}
function useCursor(input, focused) {
var selectionRef = React$a.useRef(null);
function recordCursor() {
try {
var start = input.selectionStart, end = input.selectionEnd, value = input.value;
var beforeTxt = value.substring(0, start);
var afterTxt = value.substring(end);
selectionRef.current = {
start,
end,
value,
beforeTxt,
afterTxt
};
} catch (e2) {
}
}
function restoreCursor() {
if (input && selectionRef.current && focused) {
try {
var value = input.value;
var _selectionRef$current = selectionRef.current, beforeTxt = _selectionRef$current.beforeTxt, afterTxt = _selectionRef$current.afterTxt, start = _selectionRef$current.start;
var startPos = value.length;
if (value.endsWith(afterTxt)) {
startPos = value.length - selectionRef.current.afterTxt.length;
} else if (value.startsWith(beforeTxt)) {
startPos = beforeTxt.length;
} else {
var beforeLastChar = beforeTxt[start - 1];
var newIndex = value.indexOf(beforeLastChar, start - 1);
if (newIndex !== -1) {
startPos = newIndex + 1;
}
}
input.setSelectionRange(startPos, startPos);
} catch (e2) {
warningOnce(false, "Something warning of cursor restore. Please fire issue about this: ".concat(e2.message));
}
}
}
return [recordCursor, restoreCursor];
}
const useFrame = function() {
var idRef = React$a.useRef(0);
var cleanUp = function cleanUp2() {
wrapperRaf$1.cancel(idRef.current);
};
React$a.useEffect(function() {
return cleanUp;
}, []);
return function(callback) {
cleanUp();
idRef.current = wrapperRaf$1(function() {
callback();
});
};
};
var _excluded$g = ["prefixCls", "className", "style", "min", "max", "step", "defaultValue", "value", "disabled", "readOnly", "upHandler", "downHandler", "keyboard", "controls", "stringMode", "parser", "formatter", "precision", "decimalSeparator", "onChange", "onInput", "onPressEnter", "onStep"];
var getDecimalValue = function getDecimalValue2(stringMode, decimalValue) {
if (stringMode || decimalValue.isEmpty()) {
return decimalValue.toString();
}
return decimalValue.toNumber();
};
var getDecimalIfValidate = function getDecimalIfValidate2(value) {
var decimal = getMiniDecimal(value);
return decimal.isInvalidate() ? null : decimal;
};
var InputNumber$2 = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _classNames;
var _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-input-number" : _props$prefixCls, className = props.className, style2 = props.style, min = props.min, max = props.max, _props$step = props.step, step2 = _props$step === void 0 ? 1 : _props$step, defaultValue = props.defaultValue, value = props.value, disabled = props.disabled, readOnly = props.readOnly, upHandler = props.upHandler, downHandler = props.downHandler, keyboard = props.keyboard, _props$controls = props.controls, controls = _props$controls === void 0 ? true : _props$controls, stringMode = props.stringMode, parser = props.parser, formatter = props.formatter, precision = props.precision, decimalSeparator = props.decimalSeparator, onChange = props.onChange, onInput = props.onInput, onPressEnter = props.onPressEnter, onStep = props.onStep, inputProps = _objectWithoutProperties$1(props, _excluded$g);
var inputClassName = "".concat(prefixCls, "-input");
var inputRef = React__namespace.useRef(null);
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), focus = _React$useState2[0], setFocus = _React$useState2[1];
var userTypingRef = React__namespace.useRef(false);
var compositionRef = React__namespace.useRef(false);
var shiftKeyRef = React__namespace.useRef(false);
var _React$useState3 = React__namespace.useState(function() {
return getMiniDecimal(value !== null && value !== void 0 ? value : defaultValue);
}), _React$useState4 = _slicedToArray$e(_React$useState3, 2), decimalValue = _React$useState4[0], setDecimalValue = _React$useState4[1];
function setUncontrolledDecimalValue(newDecimal) {
if (value === void 0) {
setDecimalValue(newDecimal);
}
}
var getPrecision = React__namespace.useCallback(function(numStr, userTyping) {
if (userTyping) {
return void 0;
}
if (precision >= 0) {
return precision;
}
return Math.max(getNumberPrecision(numStr), getNumberPrecision(step2));
}, [precision, step2]);
var mergedParser = React__namespace.useCallback(function(num) {
var numStr = String(num);
if (parser) {
return parser(numStr);
}
var parsedStr = numStr;
if (decimalSeparator) {
parsedStr = parsedStr.replace(decimalSeparator, ".");
}
return parsedStr.replace(/[^\w.-]+/g, "");
}, [parser, decimalSeparator]);
var inputValueRef = React__namespace.useRef("");
var mergedFormatter = React__namespace.useCallback(function(number2, userTyping) {
if (formatter) {
return formatter(number2, {
userTyping,
input: String(inputValueRef.current)
});
}
var str = typeof number2 === "number" ? num2str(number2) : number2;
if (!userTyping) {
var mergedPrecision = getPrecision(str, userTyping);
if (validateNumber(str) && (decimalSeparator || mergedPrecision >= 0)) {
var separatorStr = decimalSeparator || ".";
str = toFixed(str, separatorStr, mergedPrecision);
}
}
return str;
}, [formatter, getPrecision, decimalSeparator]);
var _React$useState5 = React__namespace.useState(function() {
var initValue = defaultValue !== null && defaultValue !== void 0 ? defaultValue : value;
if (decimalValue.isInvalidate() && ["string", "number"].includes(_typeof$q(initValue))) {
return Number.isNaN(initValue) ? "" : initValue;
}
return mergedFormatter(decimalValue.toString(), false);
}), _React$useState6 = _slicedToArray$e(_React$useState5, 2), inputValue = _React$useState6[0], setInternalInputValue = _React$useState6[1];
inputValueRef.current = inputValue;
function setInputValue(newValue, userTyping) {
setInternalInputValue(mergedFormatter(
newValue.isInvalidate() ? newValue.toString(false) : newValue.toString(!userTyping),
userTyping
));
}
var maxDecimal = React__namespace.useMemo(function() {
return getDecimalIfValidate(max);
}, [max, precision]);
var minDecimal = React__namespace.useMemo(function() {
return getDecimalIfValidate(min);
}, [min, precision]);
var upDisabled = React__namespace.useMemo(function() {
if (!maxDecimal || !decimalValue || decimalValue.isInvalidate()) {
return false;
}
return maxDecimal.lessEquals(decimalValue);
}, [maxDecimal, decimalValue]);
var downDisabled = React__namespace.useMemo(function() {
if (!minDecimal || !decimalValue || decimalValue.isInvalidate()) {
return false;
}
return decimalValue.lessEquals(minDecimal);
}, [minDecimal, decimalValue]);
var _useCursor = useCursor(inputRef.current, focus), _useCursor2 = _slicedToArray$e(_useCursor, 2), recordCursor = _useCursor2[0], restoreCursor = _useCursor2[1];
var getRangeValue = function getRangeValue2(target) {
if (maxDecimal && !target.lessEquals(maxDecimal)) {
return maxDecimal;
}
if (minDecimal && !minDecimal.lessEquals(target)) {
return minDecimal;
}
return null;
};
var isInRange2 = function isInRange3(target) {
return !getRangeValue(target);
};
var triggerValueUpdate = function triggerValueUpdate2(newValue, userTyping) {
var updateValue = newValue;
var isRangeValidate = isInRange2(updateValue) || updateValue.isEmpty();
if (!updateValue.isEmpty() && !userTyping) {
updateValue = getRangeValue(updateValue) || updateValue;
isRangeValidate = true;
}
if (!readOnly && !disabled && isRangeValidate) {
var numStr = updateValue.toString();
var mergedPrecision = getPrecision(numStr, userTyping);
if (mergedPrecision >= 0) {
updateValue = getMiniDecimal(toFixed(numStr, ".", mergedPrecision));
if (!isInRange2(updateValue)) {
updateValue = getMiniDecimal(toFixed(numStr, ".", mergedPrecision, true));
}
}
if (!updateValue.equals(decimalValue)) {
setUncontrolledDecimalValue(updateValue);
onChange === null || onChange === void 0 ? void 0 : onChange(updateValue.isEmpty() ? null : getDecimalValue(stringMode, updateValue));
if (value === void 0) {
setInputValue(updateValue, userTyping);
}
}
return updateValue;
}
return decimalValue;
};
var onNextPromise = useFrame();
var collectInputValue = function collectInputValue2(inputStr) {
recordCursor();
setInternalInputValue(inputStr);
if (!compositionRef.current) {
var finalValue = mergedParser(inputStr);
var finalDecimal = getMiniDecimal(finalValue);
if (!finalDecimal.isNaN()) {
triggerValueUpdate(finalDecimal, true);
}
}
onInput === null || onInput === void 0 ? void 0 : onInput(inputStr);
onNextPromise(function() {
var nextInputStr = inputStr;
if (!parser) {
nextInputStr = inputStr.replace(/。/g, ".");
}
if (nextInputStr !== inputStr) {
collectInputValue2(nextInputStr);
}
});
};
var onCompositionStart = function onCompositionStart2() {
compositionRef.current = true;
};
var onCompositionEnd = function onCompositionEnd2() {
compositionRef.current = false;
collectInputValue(inputRef.current.value);
};
var onInternalInput = function onInternalInput2(e2) {
collectInputValue(e2.target.value);
};
var onInternalStep = function onInternalStep2(up) {
var _inputRef$current;
if (up && upDisabled || !up && downDisabled) {
return;
}
userTypingRef.current = false;
var stepDecimal = getMiniDecimal(shiftKeyRef.current ? getDecupleSteps(step2) : step2);
if (!up) {
stepDecimal = stepDecimal.negate();
}
var target = (decimalValue || getMiniDecimal(0)).add(stepDecimal.toString());
var updatedValue = triggerValueUpdate(target, false);
onStep === null || onStep === void 0 ? void 0 : onStep(getDecimalValue(stringMode, updatedValue), {
offset: shiftKeyRef.current ? getDecupleSteps(step2) : step2,
type: up ? "up" : "down"
});
(_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.focus();
};
var flushInputValue = function flushInputValue2(userTyping) {
var parsedValue = getMiniDecimal(mergedParser(inputValue));
var formatValue2 = parsedValue;
if (!parsedValue.isNaN()) {
formatValue2 = triggerValueUpdate(parsedValue, userTyping);
} else {
formatValue2 = decimalValue;
}
if (value !== void 0) {
setInputValue(decimalValue, false);
} else if (!formatValue2.isNaN()) {
setInputValue(formatValue2, false);
}
};
var onBeforeInput = function onBeforeInput2() {
userTypingRef.current = true;
};
var onKeyDown2 = function onKeyDown3(event) {
var which = event.which, shiftKey = event.shiftKey;
userTypingRef.current = true;
if (shiftKey) {
shiftKeyRef.current = true;
} else {
shiftKeyRef.current = false;
}
if (which === KeyCode.ENTER) {
if (!compositionRef.current) {
userTypingRef.current = false;
}
flushInputValue(false);
onPressEnter === null || onPressEnter === void 0 ? void 0 : onPressEnter(event);
}
if (keyboard === false) {
return;
}
if (!compositionRef.current && [KeyCode.UP, KeyCode.DOWN].includes(which)) {
onInternalStep(KeyCode.UP === which);
event.preventDefault();
}
};
var onKeyUp = function onKeyUp2() {
userTypingRef.current = false;
shiftKeyRef.current = false;
};
var onBlur = function onBlur2() {
flushInputValue(false);
setFocus(false);
userTypingRef.current = false;
};
useLayoutUpdateEffect(function() {
if (!decimalValue.isInvalidate()) {
setInputValue(decimalValue, false);
}
}, [precision]);
useLayoutUpdateEffect(function() {
var newValue = getMiniDecimal(value);
setDecimalValue(newValue);
var currentParsedValue = getMiniDecimal(mergedParser(inputValue));
if (!newValue.equals(currentParsedValue) || !userTypingRef.current || formatter) {
setInputValue(newValue, userTypingRef.current);
}
}, [value]);
useLayoutUpdateEffect(function() {
if (formatter) {
restoreCursor();
}
}, [inputValue]);
return /* @__PURE__ */ jsxs("div", {
className: classnames(prefixCls, className, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-focused"), focus), _defineProperty$b(_classNames, "".concat(prefixCls, "-disabled"), disabled), _defineProperty$b(_classNames, "".concat(prefixCls, "-readonly"), readOnly), _defineProperty$b(_classNames, "".concat(prefixCls, "-not-a-number"), decimalValue.isNaN()), _defineProperty$b(_classNames, "".concat(prefixCls, "-out-of-range"), !decimalValue.isInvalidate() && !isInRange2(decimalValue)), _classNames)),
style: style2,
onFocus: function onFocus() {
setFocus(true);
},
onBlur,
onKeyDown: onKeyDown2,
onKeyUp,
onCompositionStart,
onCompositionEnd,
onBeforeInput,
children: [controls && /* @__PURE__ */ jsx(StepHandler, {
prefixCls,
upNode: upHandler,
downNode: downHandler,
upDisabled,
downDisabled,
onStep: onInternalStep
}), /* @__PURE__ */ jsx("div", {
className: "".concat(inputClassName, "-wrap"),
children: /* @__PURE__ */ jsx("input", {
autoComplete: "off",
role: "spinbutton",
"aria-valuemin": min,
"aria-valuemax": max,
"aria-valuenow": decimalValue.isInvalidate() ? null : decimalValue.toString(),
step: step2,
...inputProps,
ref: composeRef(inputRef, ref),
className: inputClassName,
value: inputValue,
onChange: onInternalInput,
disabled,
readOnly
})
})]
});
});
InputNumber$2.displayName = "InputNumber";
var __rest$d = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var InputNumber$1 = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _classNames;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var size = React__namespace.useContext(SizeContext$1);
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), focused = _React$useState2[0], setFocus = _React$useState2[1];
var inputRef = React__namespace.useRef(null);
React__namespace.useImperativeHandle(ref, function() {
return inputRef.current;
});
var className = props.className, customizeSize = props.size, customDisabled = props.disabled, customizePrefixCls = props.prefixCls, addonBefore = props.addonBefore, addonAfter = props.addonAfter, prefix = props.prefix, _props$bordered = props.bordered, bordered = _props$bordered === void 0 ? true : _props$bordered, readOnly = props.readOnly, customStatus = props.status, controls = props.controls, others = __rest$d(props, ["className", "size", "disabled", "prefixCls", "addonBefore", "addonAfter", "prefix", "bordered", "readOnly", "status", "controls"]);
var prefixCls = getPrefixCls("input-number", customizePrefixCls);
var _useCompactItemContex = useCompactItemContext(prefixCls, direction), compactSize = _useCompactItemContex.compactSize, compactItemClassnames = _useCompactItemContex.compactItemClassnames;
var upIcon = /* @__PURE__ */ jsx(UpOutlined$1, {
className: "".concat(prefixCls, "-handler-up-inner")
});
var downIcon = /* @__PURE__ */ jsx(DownOutlined$4, {
className: "".concat(prefixCls, "-handler-down-inner")
});
var controlsTemp = typeof controls === "boolean" ? controls : void 0;
if (_typeof$q(controls) === "object") {
upIcon = typeof controls.upIcon === "undefined" ? upIcon : /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-handler-up-inner"),
children: controls.upIcon
});
downIcon = typeof controls.downIcon === "undefined" ? downIcon : /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-handler-down-inner"),
children: controls.downIcon
});
}
var _useContext = React$a.useContext(FormItemInputContext), hasFeedback = _useContext.hasFeedback, contextStatus = _useContext.status, isFormItemInput = _useContext.isFormItemInput, feedbackIcon = _useContext.feedbackIcon;
var mergedStatus = getMergedStatus(contextStatus, customStatus);
var mergeSize = compactSize || customizeSize || size;
var disabled = React__namespace.useContext(DisabledContext$1);
var mergedDisabled = customDisabled !== null && customDisabled !== void 0 ? customDisabled : disabled;
var inputNumberClass = classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-lg"), mergeSize === "large"), _defineProperty$b(_classNames, "".concat(prefixCls, "-sm"), mergeSize === "small"), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _defineProperty$b(_classNames, "".concat(prefixCls, "-borderless"), !bordered), _defineProperty$b(_classNames, "".concat(prefixCls, "-in-form-item"), isFormItemInput), _classNames), getStatusClassNames(prefixCls, mergedStatus), compactItemClassnames, className);
var element = /* @__PURE__ */ jsx(InputNumber$2, {
ref: inputRef,
disabled: mergedDisabled,
className: inputNumberClass,
upHandler: upIcon,
downHandler: downIcon,
prefixCls,
readOnly,
controls: controlsTemp,
...others
});
if (prefix != null || hasFeedback) {
var _classNames2;
var affixWrapperCls = classnames("".concat(prefixCls, "-affix-wrapper"), getStatusClassNames("".concat(prefixCls, "-affix-wrapper"), mergedStatus, hasFeedback), (_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-affix-wrapper-focused"), focused), _defineProperty$b(_classNames2, "".concat(prefixCls, "-affix-wrapper-disabled"), props.disabled), _defineProperty$b(_classNames2, "".concat(prefixCls, "-affix-wrapper-sm"), size === "small"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-affix-wrapper-lg"), size === "large"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-affix-wrapper-rtl"), direction === "rtl"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-affix-wrapper-readonly"), readOnly), _defineProperty$b(_classNames2, "".concat(prefixCls, "-affix-wrapper-borderless"), !bordered), _defineProperty$b(_classNames2, "".concat(className), !(addonBefore || addonAfter) && className), _classNames2));
element = /* @__PURE__ */ jsxs("div", {
className: affixWrapperCls,
style: props.style,
onMouseUp: function onMouseUp() {
return inputRef.current.focus();
},
children: [prefix && /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-prefix"),
children: prefix
}), cloneElement(element, {
style: null,
value: props.value,
onFocus: function onFocus(event) {
var _a;
setFocus(true);
(_a = props.onFocus) === null || _a === void 0 ? void 0 : _a.call(props, event);
},
onBlur: function onBlur(event) {
var _a;
setFocus(false);
(_a = props.onBlur) === null || _a === void 0 ? void 0 : _a.call(props, event);
}
}), hasFeedback && /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-suffix"),
children: feedbackIcon
})]
});
}
if (addonBefore != null || addonAfter != null) {
var _classNames4;
var wrapperClassName = "".concat(prefixCls, "-group");
var addonClassName = "".concat(wrapperClassName, "-addon");
var addonBeforeNode = addonBefore ? /* @__PURE__ */ jsx("div", {
className: addonClassName,
children: addonBefore
}) : null;
var addonAfterNode = addonAfter ? /* @__PURE__ */ jsx("div", {
className: addonClassName,
children: addonAfter
}) : null;
var mergedWrapperClassName = classnames("".concat(prefixCls, "-wrapper"), wrapperClassName, _defineProperty$b({}, "".concat(wrapperClassName, "-rtl"), direction === "rtl"));
var mergedGroupClassName = classnames("".concat(prefixCls, "-group-wrapper"), (_classNames4 = {}, _defineProperty$b(_classNames4, "".concat(prefixCls, "-group-wrapper-sm"), size === "small"), _defineProperty$b(_classNames4, "".concat(prefixCls, "-group-wrapper-lg"), size === "large"), _defineProperty$b(_classNames4, "".concat(prefixCls, "-group-wrapper-rtl"), direction === "rtl"), _classNames4), getStatusClassNames("".concat(prefixCls, "-group-wrapper"), mergedStatus, hasFeedback), className);
element = /* @__PURE__ */ jsx("div", {
className: mergedGroupClassName,
style: props.style,
children: /* @__PURE__ */ jsxs("div", {
className: mergedWrapperClassName,
children: [addonBeforeNode && /* @__PURE__ */ jsx(NoCompactStyle, {
children: /* @__PURE__ */ jsx(NoFormStyle, {
status: true,
override: true,
children: addonBeforeNode
})
}), cloneElement(element, {
style: null,
disabled: mergedDisabled
}), addonAfterNode && /* @__PURE__ */ jsx(NoCompactStyle, {
children: /* @__PURE__ */ jsx(NoFormStyle, {
status: true,
override: true,
children: addonAfterNode
})
})]
})
});
}
return element;
});
const _InputNumber = InputNumber$1;
var DoubleLeftOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M272.9 512l265.4-339.1c4.1-5.2.4-12.9-6.3-12.9h-77.3c-4.9 0-9.6 2.3-12.6 6.1L186.8 492.3a31.99 31.99 0 000 39.5l255.3 326.1c3 3.9 7.7 6.1 12.6 6.1H532c6.7 0 10.4-7.7 6.3-12.9L272.9 512zm304 0l265.4-339.1c4.1-5.2.4-12.9-6.3-12.9h-77.3c-4.9 0-9.6 2.3-12.6 6.1L490.8 492.3a31.99 31.99 0 000 39.5l255.3 326.1c3 3.9 7.7 6.1 12.6 6.1H836c6.7 0 10.4-7.7 6.3-12.9L576.9 512z" } }] }, "name": "double-left", "theme": "outlined" };
const DoubleLeftOutlinedSvg = DoubleLeftOutlined$2;
var DoubleLeftOutlined = function DoubleLeftOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: DoubleLeftOutlinedSvg
})
});
};
DoubleLeftOutlined.displayName = "DoubleLeftOutlined";
const DoubleLeftOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(DoubleLeftOutlined);
var DoubleRightOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M533.2 492.3L277.9 166.1c-3-3.9-7.7-6.1-12.6-6.1H188c-6.7 0-10.4 7.7-6.3 12.9L447.1 512 181.7 851.1A7.98 7.98 0 00188 864h77.3c4.9 0 9.6-2.3 12.6-6.1l255.3-326.1c9.1-11.7 9.1-27.9 0-39.5zm304 0L581.9 166.1c-3-3.9-7.7-6.1-12.6-6.1H492c-6.7 0-10.4 7.7-6.3 12.9L751.1 512 485.7 851.1A7.98 7.98 0 00492 864h77.3c4.9 0 9.6-2.3 12.6-6.1l255.3-326.1c9.1-11.7 9.1-27.9 0-39.5z" } }] }, "name": "double-right", "theme": "outlined" };
const DoubleRightOutlinedSvg = DoubleRightOutlined$2;
var DoubleRightOutlined = function DoubleRightOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: DoubleRightOutlinedSvg
})
});
};
DoubleRightOutlined.displayName = "DoubleRightOutlined";
const DoubleRightOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(DoubleRightOutlined);
var Pager = function Pager2(props) {
var _classNames;
var prefixCls = "".concat(props.rootPrefixCls, "-item");
var cls = classnames(prefixCls, "".concat(prefixCls, "-").concat(props.page), (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-active"), props.active), _defineProperty$b(_classNames, "".concat(prefixCls, "-disabled"), !props.page), _defineProperty$b(_classNames, props.className, !!props.className), _classNames));
var handleClick = function handleClick2() {
props.onClick(props.page);
};
var handleKeyPress = function handleKeyPress2(e2) {
props.onKeyPress(e2, props.onClick, props.page);
};
return /* @__PURE__ */ jsx("li", {
title: props.showTitle ? props.page : null,
className: cls,
onClick: handleClick,
onKeyPress: handleKeyPress,
tabIndex: "0",
children: props.itemRender(
props.page,
"page",
/* @__PURE__ */ jsx("a", {
rel: "nofollow",
children: props.page
})
)
});
};
const KEYCODE = {
ZERO: 48,
NINE: 57,
NUMPAD_ZERO: 96,
NUMPAD_NINE: 105,
BACKSPACE: 8,
DELETE: 46,
ENTER: 13,
ARROW_UP: 38,
ARROW_DOWN: 40
};
var Options = /* @__PURE__ */ function(_React$Component) {
_inherits(Options2, _React$Component);
var _super = _createSuper(Options2);
function Options2() {
var _this2;
_classCallCheck(this, Options2);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this2 = _super.call.apply(_super, [this].concat(args));
_this2.state = {
goInputText: ""
};
_this2.buildOptionText = function(value) {
return "".concat(value, " ").concat(_this2.props.locale.items_per_page);
};
_this2.changeSize = function(value) {
_this2.props.changeSize(Number(value));
};
_this2.handleChange = function(e2) {
_this2.setState({
goInputText: e2.target.value
});
};
_this2.handleBlur = function(e2) {
var _this$props = _this2.props, goButton = _this$props.goButton, quickGo = _this$props.quickGo, rootPrefixCls = _this$props.rootPrefixCls;
var goInputText = _this2.state.goInputText;
if (goButton || goInputText === "") {
return;
}
_this2.setState({
goInputText: ""
});
if (e2.relatedTarget && (e2.relatedTarget.className.indexOf("".concat(rootPrefixCls, "-item-link")) >= 0 || e2.relatedTarget.className.indexOf("".concat(rootPrefixCls, "-item")) >= 0)) {
return;
}
quickGo(_this2.getValidValue());
};
_this2.go = function(e2) {
var goInputText = _this2.state.goInputText;
if (goInputText === "") {
return;
}
if (e2.keyCode === KEYCODE.ENTER || e2.type === "click") {
_this2.setState({
goInputText: ""
});
_this2.props.quickGo(_this2.getValidValue());
}
};
return _this2;
}
_createClass(Options2, [{
key: "getValidValue",
value: function getValidValue() {
var goInputText = this.state.goInputText;
return !goInputText || isNaN(goInputText) ? void 0 : Number(goInputText);
}
}, {
key: "getPageSizeOptions",
value: function getPageSizeOptions() {
var _this$props2 = this.props, pageSize = _this$props2.pageSize, pageSizeOptions = _this$props2.pageSizeOptions;
if (pageSizeOptions.some(function(option) {
return option.toString() === pageSize.toString();
})) {
return pageSizeOptions;
}
return pageSizeOptions.concat([pageSize.toString()]).sort(function(a, b2) {
var numberA = isNaN(Number(a)) ? 0 : Number(a);
var numberB = isNaN(Number(b2)) ? 0 : Number(b2);
return numberA - numberB;
});
}
}, {
key: "render",
value: function render2() {
var _this2 = this;
var _this$props3 = this.props, pageSize = _this$props3.pageSize, locale2 = _this$props3.locale, rootPrefixCls = _this$props3.rootPrefixCls, changeSize = _this$props3.changeSize, quickGo = _this$props3.quickGo, goButton = _this$props3.goButton, selectComponentClass = _this$props3.selectComponentClass, buildOptionText = _this$props3.buildOptionText, selectPrefixCls = _this$props3.selectPrefixCls, disabled = _this$props3.disabled;
var goInputText = this.state.goInputText;
var prefixCls = "".concat(rootPrefixCls, "-options");
var Select2 = selectComponentClass;
var changeSelect = null;
var goInput = null;
var gotoButton = null;
if (!changeSize && !quickGo) {
return null;
}
var pageSizeOptions = this.getPageSizeOptions();
if (changeSize && Select2) {
var options = pageSizeOptions.map(function(opt, i2) {
return /* @__PURE__ */ jsx(Select2.Option, {
value: opt.toString(),
children: (buildOptionText || _this2.buildOptionText)(opt)
}, i2);
});
changeSelect = /* @__PURE__ */ jsx(Select2, {
disabled,
prefixCls: selectPrefixCls,
showSearch: false,
className: "".concat(prefixCls, "-size-changer"),
optionLabelProp: "children",
dropdownMatchSelectWidth: false,
value: (pageSize || pageSizeOptions[0]).toString(),
onChange: this.changeSize,
getPopupContainer: function getPopupContainer(triggerNode) {
return triggerNode.parentNode;
},
"aria-label": locale2.page_size,
defaultOpen: false,
children: options
});
}
if (quickGo) {
if (goButton) {
gotoButton = typeof goButton === "boolean" ? /* @__PURE__ */ jsx("button", {
type: "button",
onClick: this.go,
onKeyUp: this.go,
disabled,
className: "".concat(prefixCls, "-quick-jumper-button"),
children: locale2.jump_to_confirm
}) : /* @__PURE__ */ jsx("span", {
onClick: this.go,
onKeyUp: this.go,
children: goButton
});
}
goInput = /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-quick-jumper"),
children: [locale2.jump_to, /* @__PURE__ */ jsx("input", {
disabled,
type: "text",
value: goInputText,
onChange: this.handleChange,
onKeyUp: this.go,
onBlur: this.handleBlur,
"aria-label": locale2.page
}), locale2.page, gotoButton]
});
}
return /* @__PURE__ */ jsxs("li", {
className: "".concat(prefixCls),
children: [changeSelect, goInput]
});
}
}]);
return Options2;
}(React__default.default.Component);
Options.defaultProps = {
pageSizeOptions: ["10", "20", "50", "100"]
};
const LOCALE = {
items_per_page: "\u6761/\u9875",
jump_to: "\u8DF3\u81F3",
jump_to_confirm: "\u786E\u5B9A",
page: "\u9875",
prev_page: "\u4E0A\u4E00\u9875",
next_page: "\u4E0B\u4E00\u9875",
prev_5: "\u5411\u524D 5 \u9875",
next_5: "\u5411\u540E 5 \u9875",
prev_3: "\u5411\u524D 3 \u9875",
next_3: "\u5411\u540E 3 \u9875",
page_size: "\u9875\u7801"
};
function noop$5() {
}
function isInteger(v2) {
var value = Number(v2);
return typeof value === "number" && !isNaN(value) && isFinite(value) && Math.floor(value) === value;
}
function defaultItemRender(page, type2, element) {
return element;
}
function calculatePage(p2, state, props) {
var pageSize = typeof p2 === "undefined" ? state.pageSize : p2;
return Math.floor((props.total - 1) / pageSize) + 1;
}
var Pagination$2 = /* @__PURE__ */ function(_React$Component) {
_inherits(Pagination2, _React$Component);
var _super = _createSuper(Pagination2);
function Pagination2(props) {
var _this2;
_classCallCheck(this, Pagination2);
_this2 = _super.call(this, props);
_this2.getJumpPrevPage = function() {
return Math.max(1, _this2.state.current - (_this2.props.showLessItems ? 3 : 5));
};
_this2.getJumpNextPage = function() {
return Math.min(calculatePage(void 0, _this2.state, _this2.props), _this2.state.current + (_this2.props.showLessItems ? 3 : 5));
};
_this2.getItemIcon = function(icon, label) {
var prefixCls = _this2.props.prefixCls;
var iconNode = icon || /* @__PURE__ */ jsx("button", {
type: "button",
"aria-label": label,
className: "".concat(prefixCls, "-item-link")
});
if (typeof icon === "function") {
iconNode = /* @__PURE__ */ React__default.default.createElement(icon, _objectSpread2$a({}, _this2.props));
}
return iconNode;
};
_this2.savePaginationNode = function(node) {
_this2.paginationNode = node;
};
_this2.isValid = function(page) {
var total = _this2.props.total;
return isInteger(page) && page !== _this2.state.current && isInteger(total) && total > 0;
};
_this2.shouldDisplayQuickJumper = function() {
var _this$props = _this2.props, showQuickJumper = _this$props.showQuickJumper, total = _this$props.total;
var pageSize = _this2.state.pageSize;
if (total <= pageSize) {
return false;
}
return showQuickJumper;
};
_this2.handleKeyDown = function(e2) {
if (e2.keyCode === KEYCODE.ARROW_UP || e2.keyCode === KEYCODE.ARROW_DOWN) {
e2.preventDefault();
}
};
_this2.handleKeyUp = function(e2) {
var value = _this2.getValidValue(e2);
var currentInputValue = _this2.state.currentInputValue;
if (value !== currentInputValue) {
_this2.setState({
currentInputValue: value
});
}
if (e2.keyCode === KEYCODE.ENTER) {
_this2.handleChange(value);
} else if (e2.keyCode === KEYCODE.ARROW_UP) {
_this2.handleChange(value - 1);
} else if (e2.keyCode === KEYCODE.ARROW_DOWN) {
_this2.handleChange(value + 1);
}
};
_this2.handleBlur = function(e2) {
var value = _this2.getValidValue(e2);
_this2.handleChange(value);
};
_this2.changePageSize = function(size) {
var current = _this2.state.current;
var newCurrent = calculatePage(size, _this2.state, _this2.props);
current = current > newCurrent ? newCurrent : current;
if (newCurrent === 0) {
current = _this2.state.current;
}
if (typeof size === "number") {
if (!("pageSize" in _this2.props)) {
_this2.setState({
pageSize: size
});
}
if (!("current" in _this2.props)) {
_this2.setState({
current,
currentInputValue: current
});
}
}
_this2.props.onShowSizeChange(current, size);
if ("onChange" in _this2.props && _this2.props.onChange) {
_this2.props.onChange(current, size);
}
};
_this2.handleChange = function(page) {
var _this$props2 = _this2.props, disabled = _this$props2.disabled, onChange = _this$props2.onChange;
var _this$state = _this2.state, pageSize = _this$state.pageSize, current = _this$state.current, currentInputValue = _this$state.currentInputValue;
if (_this2.isValid(page) && !disabled) {
var currentPage = calculatePage(void 0, _this2.state, _this2.props);
var newPage = page;
if (page > currentPage) {
newPage = currentPage;
} else if (page < 1) {
newPage = 1;
}
if (!("current" in _this2.props)) {
_this2.setState({
current: newPage
});
}
if (newPage !== currentInputValue) {
_this2.setState({
currentInputValue: newPage
});
}
onChange(newPage, pageSize);
return newPage;
}
return current;
};
_this2.prev = function() {
if (_this2.hasPrev()) {
_this2.handleChange(_this2.state.current - 1);
}
};
_this2.next = function() {
if (_this2.hasNext()) {
_this2.handleChange(_this2.state.current + 1);
}
};
_this2.jumpPrev = function() {
_this2.handleChange(_this2.getJumpPrevPage());
};
_this2.jumpNext = function() {
_this2.handleChange(_this2.getJumpNextPage());
};
_this2.hasPrev = function() {
return _this2.state.current > 1;
};
_this2.hasNext = function() {
return _this2.state.current < calculatePage(void 0, _this2.state, _this2.props);
};
_this2.runIfEnter = function(event, callback) {
if (event.key === "Enter" || event.charCode === 13) {
for (var _len = arguments.length, restParams = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
restParams[_key - 2] = arguments[_key];
}
callback.apply(void 0, restParams);
}
};
_this2.runIfEnterPrev = function(e2) {
_this2.runIfEnter(e2, _this2.prev);
};
_this2.runIfEnterNext = function(e2) {
_this2.runIfEnter(e2, _this2.next);
};
_this2.runIfEnterJumpPrev = function(e2) {
_this2.runIfEnter(e2, _this2.jumpPrev);
};
_this2.runIfEnterJumpNext = function(e2) {
_this2.runIfEnter(e2, _this2.jumpNext);
};
_this2.handleGoTO = function(e2) {
if (e2.keyCode === KEYCODE.ENTER || e2.type === "click") {
_this2.handleChange(_this2.state.currentInputValue);
}
};
var hasOnChange = props.onChange !== noop$5;
var hasCurrent = "current" in props;
if (hasCurrent && !hasOnChange) {
console.warn("Warning: You provided a `current` prop to a Pagination component without an `onChange` handler. This will render a read-only component.");
}
var _current = props.defaultCurrent;
if ("current" in props) {
_current = props.current;
}
var _pageSize = props.defaultPageSize;
if ("pageSize" in props) {
_pageSize = props.pageSize;
}
_current = Math.min(_current, calculatePage(_pageSize, void 0, props));
_this2.state = {
current: _current,
currentInputValue: _current,
pageSize: _pageSize
};
return _this2;
}
_createClass(Pagination2, [{
key: "componentDidUpdate",
value: function componentDidUpdate(prevProps, prevState) {
var prefixCls = this.props.prefixCls;
if (prevState.current !== this.state.current && this.paginationNode) {
var lastCurrentNode = this.paginationNode.querySelector(".".concat(prefixCls, "-item-").concat(prevState.current));
if (lastCurrentNode && document.activeElement === lastCurrentNode) {
lastCurrentNode.blur();
}
}
}
}, {
key: "getValidValue",
value: function getValidValue(e2) {
var inputValue = e2.target.value;
var allPages = calculatePage(void 0, this.state, this.props);
var currentInputValue = this.state.currentInputValue;
var value;
if (inputValue === "") {
value = inputValue;
} else if (isNaN(Number(inputValue))) {
value = currentInputValue;
} else if (inputValue >= allPages) {
value = allPages;
} else {
value = Number(inputValue);
}
return value;
}
}, {
key: "getShowSizeChanger",
value: function getShowSizeChanger() {
var _this$props3 = this.props, showSizeChanger = _this$props3.showSizeChanger, total = _this$props3.total, totalBoundaryShowSizeChanger = _this$props3.totalBoundaryShowSizeChanger;
if (typeof showSizeChanger !== "undefined") {
return showSizeChanger;
}
return total > totalBoundaryShowSizeChanger;
}
}, {
key: "renderPrev",
value: function renderPrev(prevPage) {
var _this$props4 = this.props, prevIcon = _this$props4.prevIcon, itemRender = _this$props4.itemRender;
var prevButton = itemRender(prevPage, "prev", this.getItemIcon(prevIcon, "prev page"));
var disabled = !this.hasPrev();
return /* @__PURE__ */ React$a.isValidElement(prevButton) ? /* @__PURE__ */ React$a.cloneElement(prevButton, {
disabled
}) : prevButton;
}
}, {
key: "renderNext",
value: function renderNext(nextPage) {
var _this$props5 = this.props, nextIcon = _this$props5.nextIcon, itemRender = _this$props5.itemRender;
var nextButton = itemRender(nextPage, "next", this.getItemIcon(nextIcon, "next page"));
var disabled = !this.hasNext();
return /* @__PURE__ */ React$a.isValidElement(nextButton) ? /* @__PURE__ */ React$a.cloneElement(nextButton, {
disabled
}) : nextButton;
}
}, {
key: "render",
value: function render2() {
var _this2 = this;
var _this$props6 = this.props, prefixCls = _this$props6.prefixCls, className = _this$props6.className, style2 = _this$props6.style, disabled = _this$props6.disabled, hideOnSinglePage = _this$props6.hideOnSinglePage, total = _this$props6.total, locale2 = _this$props6.locale, showQuickJumper = _this$props6.showQuickJumper, showLessItems = _this$props6.showLessItems, showTitle = _this$props6.showTitle, showTotal = _this$props6.showTotal, simple = _this$props6.simple, itemRender = _this$props6.itemRender, showPrevNextJumpers = _this$props6.showPrevNextJumpers, jumpPrevIcon = _this$props6.jumpPrevIcon, jumpNextIcon = _this$props6.jumpNextIcon, selectComponentClass = _this$props6.selectComponentClass, selectPrefixCls = _this$props6.selectPrefixCls, pageSizeOptions = _this$props6.pageSizeOptions;
var _this$state2 = this.state, current = _this$state2.current, pageSize = _this$state2.pageSize, currentInputValue = _this$state2.currentInputValue;
if (hideOnSinglePage === true && total <= pageSize) {
return null;
}
var allPages = calculatePage(void 0, this.state, this.props);
var pagerList = [];
var jumpPrev = null;
var jumpNext = null;
var firstPager = null;
var lastPager = null;
var gotoButton = null;
var goButton = showQuickJumper && showQuickJumper.goButton;
var pageBufferSize = showLessItems ? 1 : 2;
var prevPage = current - 1 > 0 ? current - 1 : 0;
var nextPage = current + 1 < allPages ? current + 1 : allPages;
var dataOrAriaAttributeProps = Object.keys(this.props).reduce(function(prev, key2) {
if (key2.substr(0, 5) === "data-" || key2.substr(0, 5) === "aria-" || key2 === "role") {
prev[key2] = _this2.props[key2];
}
return prev;
}, {});
var totalText = showTotal && /* @__PURE__ */ jsx("li", {
className: "".concat(prefixCls, "-total-text"),
children: showTotal(total, [total === 0 ? 0 : (current - 1) * pageSize + 1, current * pageSize > total ? total : current * pageSize])
});
if (simple) {
if (goButton) {
if (typeof goButton === "boolean") {
gotoButton = /* @__PURE__ */ jsx("button", {
type: "button",
onClick: this.handleGoTO,
onKeyUp: this.handleGoTO,
children: locale2.jump_to_confirm
});
} else {
gotoButton = /* @__PURE__ */ jsx("span", {
onClick: this.handleGoTO,
onKeyUp: this.handleGoTO,
children: goButton
});
}
gotoButton = /* @__PURE__ */ jsx("li", {
title: showTitle ? "".concat(locale2.jump_to).concat(current, "/").concat(allPages) : null,
className: "".concat(prefixCls, "-simple-pager"),
children: gotoButton
});
}
return /* @__PURE__ */ jsxs("ul", {
className: classnames(prefixCls, "".concat(prefixCls, "-simple"), _defineProperty$b({}, "".concat(prefixCls, "-disabled"), disabled), className),
style: style2,
ref: this.savePaginationNode,
...dataOrAriaAttributeProps,
children: [totalText, /* @__PURE__ */ jsx("li", {
title: showTitle ? locale2.prev_page : null,
onClick: this.prev,
tabIndex: this.hasPrev() ? 0 : null,
onKeyPress: this.runIfEnterPrev,
className: classnames("".concat(prefixCls, "-prev"), _defineProperty$b({}, "".concat(prefixCls, "-disabled"), !this.hasPrev())),
"aria-disabled": !this.hasPrev(),
children: this.renderPrev(prevPage)
}), /* @__PURE__ */ jsxs("li", {
title: showTitle ? "".concat(current, "/").concat(allPages) : null,
className: "".concat(prefixCls, "-simple-pager"),
children: [/* @__PURE__ */ jsx("input", {
type: "text",
value: currentInputValue,
disabled,
onKeyDown: this.handleKeyDown,
onKeyUp: this.handleKeyUp,
onChange: this.handleKeyUp,
onBlur: this.handleBlur,
size: "3"
}), /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-slash"),
children: "/"
}), allPages]
}), /* @__PURE__ */ jsx("li", {
title: showTitle ? locale2.next_page : null,
onClick: this.next,
tabIndex: this.hasPrev() ? 0 : null,
onKeyPress: this.runIfEnterNext,
className: classnames("".concat(prefixCls, "-next"), _defineProperty$b({}, "".concat(prefixCls, "-disabled"), !this.hasNext())),
"aria-disabled": !this.hasNext(),
children: this.renderNext(nextPage)
}), gotoButton]
});
}
if (allPages <= 3 + pageBufferSize * 2) {
var pagerProps = {
locale: locale2,
rootPrefixCls: prefixCls,
onClick: this.handleChange,
onKeyPress: this.runIfEnter,
showTitle,
itemRender
};
if (!allPages) {
pagerList.push(
/* @__PURE__ */ React$a.createElement(Pager, {
...pagerProps,
key: "noPager",
page: 1,
className: "".concat(prefixCls, "-item-disabled")
})
);
}
for (var i2 = 1; i2 <= allPages; i2 += 1) {
var active = current === i2;
pagerList.push(
/* @__PURE__ */ React$a.createElement(Pager, {
...pagerProps,
key: i2,
page: i2,
active
})
);
}
} else {
var prevItemTitle = showLessItems ? locale2.prev_3 : locale2.prev_5;
var nextItemTitle = showLessItems ? locale2.next_3 : locale2.next_5;
if (showPrevNextJumpers) {
jumpPrev = /* @__PURE__ */ jsx("li", {
title: showTitle ? prevItemTitle : null,
onClick: this.jumpPrev,
tabIndex: "0",
onKeyPress: this.runIfEnterJumpPrev,
className: classnames("".concat(prefixCls, "-jump-prev"), _defineProperty$b({}, "".concat(prefixCls, "-jump-prev-custom-icon"), !!jumpPrevIcon)),
children: itemRender(this.getJumpPrevPage(), "jump-prev", this.getItemIcon(jumpPrevIcon, "prev page"))
}, "prev");
jumpNext = /* @__PURE__ */ jsx("li", {
title: showTitle ? nextItemTitle : null,
tabIndex: "0",
onClick: this.jumpNext,
onKeyPress: this.runIfEnterJumpNext,
className: classnames("".concat(prefixCls, "-jump-next"), _defineProperty$b({}, "".concat(prefixCls, "-jump-next-custom-icon"), !!jumpNextIcon)),
children: itemRender(this.getJumpNextPage(), "jump-next", this.getItemIcon(jumpNextIcon, "next page"))
}, "next");
}
lastPager = /* @__PURE__ */ jsx(Pager, {
locale: locale2,
last: true,
rootPrefixCls: prefixCls,
onClick: this.handleChange,
onKeyPress: this.runIfEnter,
page: allPages,
active: false,
showTitle,
itemRender
}, allPages);
firstPager = /* @__PURE__ */ jsx(Pager, {
locale: locale2,
rootPrefixCls: prefixCls,
onClick: this.handleChange,
onKeyPress: this.runIfEnter,
page: 1,
active: false,
showTitle,
itemRender
}, 1);
var left = Math.max(1, current - pageBufferSize);
var right = Math.min(current + pageBufferSize, allPages);
if (current - 1 <= pageBufferSize) {
right = 1 + pageBufferSize * 2;
}
if (allPages - current <= pageBufferSize) {
left = allPages - pageBufferSize * 2;
}
for (var _i = left; _i <= right; _i += 1) {
var _active = current === _i;
pagerList.push(
/* @__PURE__ */ jsx(Pager, {
locale: locale2,
rootPrefixCls: prefixCls,
onClick: this.handleChange,
onKeyPress: this.runIfEnter,
page: _i,
active: _active,
showTitle,
itemRender
}, _i)
);
}
if (current - 1 >= pageBufferSize * 2 && current !== 1 + 2) {
pagerList[0] = /* @__PURE__ */ React$a.cloneElement(pagerList[0], {
className: "".concat(prefixCls, "-item-after-jump-prev")
});
pagerList.unshift(jumpPrev);
}
if (allPages - current >= pageBufferSize * 2 && current !== allPages - 2) {
pagerList[pagerList.length - 1] = /* @__PURE__ */ React$a.cloneElement(pagerList[pagerList.length - 1], {
className: "".concat(prefixCls, "-item-before-jump-next")
});
pagerList.push(jumpNext);
}
if (left !== 1) {
pagerList.unshift(firstPager);
}
if (right !== allPages) {
pagerList.push(lastPager);
}
}
var prevDisabled = !this.hasPrev() || !allPages;
var nextDisabled = !this.hasNext() || !allPages;
return /* @__PURE__ */ jsxs("ul", {
className: classnames(prefixCls, className, _defineProperty$b({}, "".concat(prefixCls, "-disabled"), disabled)),
style: style2,
ref: this.savePaginationNode,
...dataOrAriaAttributeProps,
children: [totalText, /* @__PURE__ */ jsx("li", {
title: showTitle ? locale2.prev_page : null,
onClick: this.prev,
tabIndex: prevDisabled ? null : 0,
onKeyPress: this.runIfEnterPrev,
className: classnames("".concat(prefixCls, "-prev"), _defineProperty$b({}, "".concat(prefixCls, "-disabled"), prevDisabled)),
"aria-disabled": prevDisabled,
children: this.renderPrev(prevPage)
}), pagerList, /* @__PURE__ */ jsx("li", {
title: showTitle ? locale2.next_page : null,
onClick: this.next,
tabIndex: nextDisabled ? null : 0,
onKeyPress: this.runIfEnterNext,
className: classnames("".concat(prefixCls, "-next"), _defineProperty$b({}, "".concat(prefixCls, "-disabled"), nextDisabled)),
"aria-disabled": nextDisabled,
children: this.renderNext(nextPage)
}), /* @__PURE__ */ jsx(Options, {
disabled,
locale: locale2,
rootPrefixCls: prefixCls,
selectComponentClass,
selectPrefixCls,
changeSize: this.getShowSizeChanger() ? this.changePageSize : null,
current,
pageSize,
pageSizeOptions,
quickGo: this.shouldDisplayQuickJumper() ? this.handleChange : null,
goButton
})]
});
}
}], [{
key: "getDerivedStateFromProps",
value: function getDerivedStateFromProps(props, prevState) {
var newState = {};
if ("current" in props) {
newState.current = props.current;
if (props.current !== prevState.current) {
newState.currentInputValue = newState.current;
}
}
if ("pageSize" in props && props.pageSize !== prevState.pageSize) {
var current = prevState.current;
var newCurrent = calculatePage(props.pageSize, prevState, props);
current = current > newCurrent ? newCurrent : current;
if (!("current" in props)) {
newState.current = current;
newState.currentInputValue = current;
}
newState.pageSize = props.pageSize;
}
return newState;
}
}]);
return Pagination2;
}(React__default.default.Component);
Pagination$2.defaultProps = {
defaultCurrent: 1,
total: 0,
defaultPageSize: 10,
onChange: noop$5,
className: "",
selectPrefixCls: "rc-select",
prefixCls: "rc-pagination",
selectComponentClass: null,
hideOnSinglePage: false,
showPrevNextJumpers: true,
showQuickJumper: false,
showLessItems: false,
showTitle: true,
onShowSizeChange: noop$5,
locale: LOCALE,
style: {},
itemRender: defaultItemRender,
totalBoundaryShowSizeChanger: 50
};
var MiniSelect = function MiniSelect2(props) {
return /* @__PURE__ */ jsx(_Select, {
...props,
size: "small"
});
};
var MiddleSelect = function MiddleSelect2(props) {
return /* @__PURE__ */ jsx(_Select, {
...props,
size: "middle"
});
};
MiniSelect.Option = _Select.Option;
MiddleSelect.Option = _Select.Option;
var __rest$c = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var Pagination = function Pagination2(_a) {
var customizePrefixCls = _a.prefixCls, customizeSelectPrefixCls = _a.selectPrefixCls, className = _a.className, size = _a.size, customLocale = _a.locale, selectComponentClass = _a.selectComponentClass, responsive = _a.responsive, showSizeChanger = _a.showSizeChanger, restProps = __rest$c(_a, ["prefixCls", "selectPrefixCls", "className", "size", "locale", "selectComponentClass", "responsive", "showSizeChanger"]);
var _useBreakpoint = useBreakpoint(responsive), xs = _useBreakpoint.xs;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction, _React$useContext$pag = _React$useContext.pagination, pagination = _React$useContext$pag === void 0 ? {} : _React$useContext$pag;
var prefixCls = getPrefixCls("pagination", customizePrefixCls);
var mergedShowSizeChanger = showSizeChanger !== null && showSizeChanger !== void 0 ? showSizeChanger : pagination.showSizeChanger;
var getIconsProps = function getIconsProps2() {
var ellipsis = /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-item-ellipsis"),
children: "\u2022\u2022\u2022"
});
var prevIcon = /* @__PURE__ */ jsx("button", {
className: "".concat(prefixCls, "-item-link"),
type: "button",
tabIndex: -1,
children: /* @__PURE__ */ jsx(LeftOutlined$1, {})
});
var nextIcon = /* @__PURE__ */ jsx("button", {
className: "".concat(prefixCls, "-item-link"),
type: "button",
tabIndex: -1,
children: /* @__PURE__ */ jsx(RightOutlined$1, {})
});
var jumpPrevIcon = /* @__PURE__ */ jsx("a", {
className: "".concat(prefixCls, "-item-link"),
children: /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-item-container"),
children: [/* @__PURE__ */ jsx(DoubleLeftOutlined$1, {
className: "".concat(prefixCls, "-item-link-icon")
}), ellipsis]
})
});
var jumpNextIcon = /* @__PURE__ */ jsx("a", {
className: "".concat(prefixCls, "-item-link"),
children: /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-item-container"),
children: [/* @__PURE__ */ jsx(DoubleRightOutlined$1, {
className: "".concat(prefixCls, "-item-link-icon")
}), ellipsis]
})
});
if (direction === "rtl") {
var _ref = [nextIcon, prevIcon];
prevIcon = _ref[0];
nextIcon = _ref[1];
var _ref2 = [jumpNextIcon, jumpPrevIcon];
jumpPrevIcon = _ref2[0];
jumpNextIcon = _ref2[1];
}
return {
prevIcon,
nextIcon,
jumpPrevIcon,
jumpNextIcon
};
};
return /* @__PURE__ */ jsx(LocaleReceiver$1, {
componentName: "Pagination",
defaultLocale: enUS$3,
children: function(contextLocale) {
var _classNames;
var locale2 = _extends$3(_extends$3({}, contextLocale), customLocale);
var isSmall = size === "small" || !!(xs && !size && responsive);
var selectPrefixCls = getPrefixCls("select", customizeSelectPrefixCls);
var extendedClassName = classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-mini"), isSmall), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames), className);
return /* @__PURE__ */ jsx(Pagination$2, {
...getIconsProps(),
...restProps,
prefixCls,
selectPrefixCls,
className: extendedClassName,
selectComponentClass: selectComponentClass || (isSmall ? MiniSelect : MiddleSelect),
locale: locale2,
showSizeChanger: mergedShowSizeChanger
});
}
});
};
const Pagination$1 = Pagination;
var __rest$b = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
tuple$1("small", "default", "large");
var defaultIndicator = null;
function renderIndicator(prefixCls, props) {
var indicator = props.indicator;
var dotClassName = "".concat(prefixCls, "-dot");
if (indicator === null) {
return null;
}
if (isValidElement(indicator)) {
return cloneElement(indicator, {
className: classnames(indicator.props.className, dotClassName)
});
}
if (isValidElement(defaultIndicator)) {
return cloneElement(defaultIndicator, {
className: classnames(defaultIndicator.props.className, dotClassName)
});
}
return /* @__PURE__ */ jsxs("span", {
className: classnames(dotClassName, "".concat(prefixCls, "-dot-spin")),
children: [/* @__PURE__ */ jsx("i", {
className: "".concat(prefixCls, "-dot-item")
}), /* @__PURE__ */ jsx("i", {
className: "".concat(prefixCls, "-dot-item")
}), /* @__PURE__ */ jsx("i", {
className: "".concat(prefixCls, "-dot-item")
}), /* @__PURE__ */ jsx("i", {
className: "".concat(prefixCls, "-dot-item")
})]
});
}
function shouldDelay(spinning, delay) {
return !!spinning && !!delay && !isNaN(Number(delay));
}
var Spin = function Spin2(props) {
var prefixCls = props.spinPrefixCls, _props$spinning = props.spinning, customSpinning = _props$spinning === void 0 ? true : _props$spinning, delay = props.delay, className = props.className, _props$size = props.size, size = _props$size === void 0 ? "default" : _props$size, tip = props.tip, wrapperClassName = props.wrapperClassName, style2 = props.style, children = props.children, restProps = __rest$b(props, ["spinPrefixCls", "spinning", "delay", "className", "size", "tip", "wrapperClassName", "style", "children"]);
var _React$useState = React__namespace.useState(function() {
return customSpinning && !shouldDelay(customSpinning, delay);
}), _React$useState2 = _slicedToArray$e(_React$useState, 2), spinning = _React$useState2[0], setSpinning = _React$useState2[1];
React__namespace.useEffect(function() {
var updateSpinning = debounce_1(function() {
setSpinning(customSpinning);
}, delay);
updateSpinning();
return function() {
var _a;
(_a = updateSpinning === null || updateSpinning === void 0 ? void 0 : updateSpinning.cancel) === null || _a === void 0 ? void 0 : _a.call(updateSpinning);
};
}, [delay, customSpinning]);
var isNestedPattern = function isNestedPattern2() {
return typeof children !== "undefined";
};
var renderSpin = function renderSpin2(_ref) {
var _classNames;
var direction = _ref.direction;
var spinClassName = classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-sm"), size === "small"), _defineProperty$b(_classNames, "".concat(prefixCls, "-lg"), size === "large"), _defineProperty$b(_classNames, "".concat(prefixCls, "-spinning"), spinning), _defineProperty$b(_classNames, "".concat(prefixCls, "-show-text"), !!tip), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames), className);
var divProps = omit(restProps, ["indicator", "prefixCls"]);
var spinElement = /* @__PURE__ */ jsxs("div", {
...divProps,
style: style2,
className: spinClassName,
"aria-live": "polite",
"aria-busy": spinning,
children: [renderIndicator(prefixCls, props), tip ? /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-text"),
children: tip
}) : null]
});
if (isNestedPattern()) {
var containerClassName = classnames("".concat(prefixCls, "-container"), _defineProperty$b({}, "".concat(prefixCls, "-blur"), spinning));
return /* @__PURE__ */ jsxs("div", {
...divProps,
className: classnames("".concat(prefixCls, "-nested-loading"), wrapperClassName),
children: [spinning && /* @__PURE__ */ jsx("div", {
children: spinElement
}, "loading"), /* @__PURE__ */ jsx("div", {
className: containerClassName,
children
}, "container")]
});
}
return spinElement;
};
return /* @__PURE__ */ jsx(ConfigConsumer, {
children: renderSpin
});
};
var SpinFC = function SpinFC2(props) {
var customizePrefixCls = props.prefixCls;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var spinPrefixCls = getPrefixCls("spin", customizePrefixCls);
var spinClassProps = _extends$3(_extends$3({}, props), {
spinPrefixCls
});
return /* @__PURE__ */ jsx(Spin, {
...spinClassProps
});
};
SpinFC.setDefaultIndicator = function(indicator) {
defaultIndicator = indicator;
};
const Spin$1 = SpinFC;
function isThenable(thing) {
return !!(thing && !!thing.then);
}
var ActionButton = function ActionButton2(props) {
var clickedRef = React__namespace.useRef(false);
var ref = React__namespace.useRef(null);
var _useState = useSafeState(false), _useState2 = _slicedToArray$e(_useState, 2), loading = _useState2[0], setLoading = _useState2[1];
var close = props.close;
var onInternalClose = function onInternalClose2() {
close === null || close === void 0 ? void 0 : close.apply(void 0, arguments);
};
React__namespace.useEffect(function() {
var timeoutId = null;
if (props.autoFocus) {
timeoutId = setTimeout(function() {
var _a;
(_a = ref.current) === null || _a === void 0 ? void 0 : _a.focus();
});
}
return function() {
if (timeoutId) {
clearTimeout(timeoutId);
}
};
}, []);
var handlePromiseOnOk = function handlePromiseOnOk2(returnValueOfOnOk) {
if (!isThenable(returnValueOfOnOk)) {
return;
}
setLoading(true);
returnValueOfOnOk.then(function() {
setLoading(false, true);
onInternalClose.apply(void 0, arguments);
clickedRef.current = false;
}, function(e2) {
console.error(e2);
setLoading(false, true);
clickedRef.current = false;
});
};
var onClick = function onClick2(e2) {
var actionFn = props.actionFn;
if (clickedRef.current) {
return;
}
clickedRef.current = true;
if (!actionFn) {
onInternalClose();
return;
}
var returnValueOfOnOk;
if (props.emitEvent) {
returnValueOfOnOk = actionFn(e2);
if (props.quitOnNullishReturnValue && !isThenable(returnValueOfOnOk)) {
clickedRef.current = false;
onInternalClose(e2);
return;
}
} else if (actionFn.length) {
returnValueOfOnOk = actionFn(close);
clickedRef.current = false;
} else {
returnValueOfOnOk = actionFn();
if (!returnValueOfOnOk) {
onInternalClose();
return;
}
}
handlePromiseOnOk(returnValueOfOnOk);
};
var type2 = props.type, children = props.children, prefixCls = props.prefixCls, buttonProps = props.buttonProps;
return /* @__PURE__ */ jsx(Button$2, {
...convertLegacyProps(type2),
onClick,
loading,
prefixCls,
...buttonProps,
ref,
children
});
};
const ActionButton$1 = ActionButton;
var Overlay = function Overlay2(props) {
var prefixCls = props.prefixCls, okButtonProps = props.okButtonProps, cancelButtonProps = props.cancelButtonProps, title = props.title, cancelText = props.cancelText, okText = props.okText, okType = props.okType, icon = props.icon, _props$showCancel = props.showCancel, showCancel = _props$showCancel === void 0 ? true : _props$showCancel, close = props.close, onConfirm = props.onConfirm, onCancel = props.onCancel;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
return /* @__PURE__ */ jsx(LocaleReceiver$1, {
componentName: "Popconfirm",
defaultLocale: defaultLocale.Popconfirm,
children: function(contextLocale) {
return /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-inner-content"),
children: [/* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-message"),
children: [icon && /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-message-icon"),
children: icon
}), /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-message-title"),
children: getRenderPropValue(title)
})]
}), /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-buttons"),
children: [showCancel && /* @__PURE__ */ jsx(Button$2, {
onClick: onCancel,
size: "small",
...cancelButtonProps,
children: cancelText !== null && cancelText !== void 0 ? cancelText : contextLocale.cancelText
}), /* @__PURE__ */ jsx(ActionButton$1, {
buttonProps: _extends$3(_extends$3({
size: "small"
}, convertLegacyProps(okType)), okButtonProps),
actionFn: onConfirm,
close,
prefixCls: getPrefixCls("btn"),
quitOnNullishReturnValue: true,
emitEvent: true,
children: okText !== null && okText !== void 0 ? okText : contextLocale.okText
})]
})]
});
}
});
};
var _this = globalThis;
var __rest$a = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var Popconfirm = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var _useMergedState = useMergedState(false, {
value: props.open !== void 0 ? props.open : props.visible,
defaultValue: props.defaultOpen !== void 0 ? props.defaultOpen : props.defaultVisible
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), open = _useMergedState2[0], setOpen = _useMergedState2[1];
var settingOpen = function settingOpen2(value, e2) {
var _a, _b;
setOpen(value, true);
(_a = props.onVisibleChange) === null || _a === void 0 ? void 0 : _a.call(props, value, e2);
(_b = props.onOpenChange) === null || _b === void 0 ? void 0 : _b.call(props, value, e2);
};
var close = function close2(e2) {
settingOpen(false, e2);
};
var onConfirm = function onConfirm2(e2) {
var _a;
return (_a = props.onConfirm) === null || _a === void 0 ? void 0 : _a.call(_this, e2);
};
var onCancel = function onCancel2(e2) {
var _a;
settingOpen(false, e2);
(_a = props.onCancel) === null || _a === void 0 ? void 0 : _a.call(_this, e2);
};
var _onKeyDown = function onKeyDown2(e2) {
if (e2.keyCode === KeyCode.ESC && open) {
settingOpen(false, e2);
}
};
var onOpenChange = function onOpenChange2(value) {
var _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? false : _props$disabled;
if (disabled) {
return;
}
settingOpen(value);
};
var customizePrefixCls = props.prefixCls, _props$placement = props.placement, placement = _props$placement === void 0 ? "top" : _props$placement, _props$trigger = props.trigger, trigger = _props$trigger === void 0 ? "click" : _props$trigger, _props$okType = props.okType, okType = _props$okType === void 0 ? "primary" : _props$okType, _props$icon = props.icon, icon = _props$icon === void 0 ? /* @__PURE__ */ jsx(ExclamationCircleFilled$1, {}) : _props$icon, children = props.children, overlayClassName = props.overlayClassName, restProps = __rest$a(props, ["prefixCls", "placement", "trigger", "okType", "icon", "children", "overlayClassName"]);
var prefixCls = getPrefixCls("popover", customizePrefixCls);
var prefixClsConfirm = getPrefixCls("popconfirm", customizePrefixCls);
var overlayClassNames = classnames(prefixClsConfirm, overlayClassName);
return /* @__PURE__ */ jsx(_Popover, {
...restProps,
trigger,
prefixCls,
placement,
onOpenChange,
open,
ref,
overlayClassName: overlayClassNames,
_overlay: /* @__PURE__ */ jsx(Overlay, {
okType,
icon,
...props,
prefixCls,
close,
onConfirm,
onCancel
}),
children: cloneElement(children, {
onKeyDown: function onKeyDown2(e2) {
var _a, _b;
if (/* @__PURE__ */ React__namespace.isValidElement(children)) {
(_b = children === null || children === void 0 ? void 0 : (_a = children.props).onKeyDown) === null || _b === void 0 ? void 0 : _b.call(_a, e2);
}
_onKeyDown(e2);
}
})
});
});
const _Popconfirm = Popconfirm;
var defaultProps = {
className: "",
percent: 0,
prefixCls: "rc-progress",
strokeColor: "#2db7f5",
strokeLinecap: "round",
strokeWidth: 1,
style: {},
trailColor: "#D9D9D9",
trailWidth: 1,
gapPosition: "bottom"
};
var useTransitionDuration = function useTransitionDuration2() {
var pathsRef = React$a.useRef([]);
var prevTimeStamp = React$a.useRef(null);
React$a.useEffect(function() {
var now2 = Date.now();
var updated = false;
pathsRef.current.forEach(function(path2) {
if (!path2) {
return;
}
updated = true;
var pathStyle = path2.style;
pathStyle.transitionDuration = ".3s, .3s, .3s, .06s";
if (prevTimeStamp.current && now2 - prevTimeStamp.current < 100) {
pathStyle.transitionDuration = "0s, 0s";
}
});
if (updated) {
prevTimeStamp.current = Date.now();
}
});
return pathsRef.current;
};
var uuid = 0;
var isBrowserClient = canUseDom$1();
function getUUID() {
var retId;
if (isBrowserClient) {
retId = uuid;
uuid += 1;
} else {
retId = "TEST_OR_SSR";
}
return retId;
}
const useId = function(id2) {
var _React$useState = React__namespace.useState(), _React$useState2 = _slicedToArray$e(_React$useState, 2), innerId = _React$useState2[0], setInnerId = _React$useState2[1];
React__namespace.useEffect(function() {
setInnerId("rc_progress_".concat(getUUID()));
}, []);
return id2 || innerId;
};
var _excluded$f = ["id", "prefixCls", "steps", "strokeWidth", "trailWidth", "gapDegree", "gapPosition", "trailColor", "strokeLinecap", "style", "className", "strokeColor", "percent"];
function stripPercentToNumber(percent) {
return +percent.replace("%", "");
}
function toArray$3(value) {
var mergedValue = value !== null && value !== void 0 ? value : [];
return Array.isArray(mergedValue) ? mergedValue : [mergedValue];
}
var VIEW_BOX_SIZE = 100;
var getCircleStyle = function getCircleStyle2(perimeter, perimeterWithoutGap, offset2, percent, rotateDeg, gapDegree, gapPosition, strokeColor, strokeLinecap, strokeWidth) {
var stepSpace = arguments.length > 10 && arguments[10] !== void 0 ? arguments[10] : 0;
var offsetDeg = offset2 / 100 * 360 * ((360 - gapDegree) / 360);
var positionDeg = gapDegree === 0 ? 0 : {
bottom: 0,
top: 180,
left: 90,
right: -90
}[gapPosition];
var strokeDashoffset = (100 - percent) / 100 * perimeterWithoutGap;
if (strokeLinecap === "round" && percent !== 100) {
strokeDashoffset += strokeWidth / 2;
if (strokeDashoffset >= perimeterWithoutGap) {
strokeDashoffset = perimeterWithoutGap - 0.01;
}
}
return {
stroke: typeof strokeColor === "string" ? strokeColor : void 0,
strokeDasharray: "".concat(perimeterWithoutGap, "px ").concat(perimeter),
strokeDashoffset: strokeDashoffset + stepSpace,
transform: "rotate(".concat(rotateDeg + offsetDeg + positionDeg, "deg)"),
transformOrigin: "0 0",
transition: "stroke-dashoffset .3s ease 0s, stroke-dasharray .3s ease 0s, stroke .3s, stroke-width .06s ease .3s, opacity .3s ease 0s",
fillOpacity: 0
};
};
var Circle$2 = function Circle2(_ref) {
var id2 = _ref.id, prefixCls = _ref.prefixCls, steps = _ref.steps, strokeWidth = _ref.strokeWidth, trailWidth = _ref.trailWidth, _ref$gapDegree = _ref.gapDegree, gapDegree = _ref$gapDegree === void 0 ? 0 : _ref$gapDegree, gapPosition = _ref.gapPosition, trailColor = _ref.trailColor, strokeLinecap = _ref.strokeLinecap, style2 = _ref.style, className = _ref.className, strokeColor = _ref.strokeColor, percent = _ref.percent, restProps = _objectWithoutProperties$1(_ref, _excluded$f);
var mergedId = useId(id2);
var gradientId = "".concat(mergedId, "-gradient");
var radius = VIEW_BOX_SIZE / 2 - strokeWidth / 2;
var perimeter = Math.PI * 2 * radius;
var rotateDeg = gapDegree > 0 ? 90 + gapDegree / 2 : -90;
var perimeterWithoutGap = perimeter * ((360 - gapDegree) / 360);
var _ref2 = _typeof$q(steps) === "object" ? steps : {
count: steps,
space: 2
}, stepCount = _ref2.count, stepSpace = _ref2.space;
var circleStyle = getCircleStyle(perimeter, perimeterWithoutGap, 0, 100, rotateDeg, gapDegree, gapPosition, trailColor, strokeLinecap, strokeWidth);
var percentList = toArray$3(percent);
var strokeColorList = toArray$3(strokeColor);
var gradient = strokeColorList.find(function(color2) {
return color2 && _typeof$q(color2) === "object";
});
var paths = useTransitionDuration();
var getStokeList = function getStokeList2() {
var stackPtg = 0;
return percentList.map(function(ptg, index2) {
var color2 = strokeColorList[index2] || strokeColorList[strokeColorList.length - 1];
var stroke = color2 && _typeof$q(color2) === "object" ? "url(#".concat(gradientId, ")") : void 0;
var circleStyleForStack = getCircleStyle(perimeter, perimeterWithoutGap, stackPtg, ptg, rotateDeg, gapDegree, gapPosition, color2, strokeLinecap, strokeWidth);
stackPtg += ptg;
return /* @__PURE__ */ jsx("circle", {
className: "".concat(prefixCls, "-circle-path"),
r: radius,
cx: 0,
cy: 0,
stroke,
strokeLinecap,
strokeWidth,
opacity: ptg === 0 ? 0 : 1,
style: circleStyleForStack,
ref: function ref(elem) {
paths[index2] = elem;
}
}, index2);
}).reverse();
};
var getStepStokeList = function getStepStokeList2() {
var current = Math.round(stepCount * (percentList[0] / 100));
var stepPtg = 100 / stepCount;
var stackPtg = 0;
return new Array(stepCount).fill(null).map(function(_, index2) {
var color2 = index2 <= current - 1 ? strokeColorList[0] : trailColor;
var stroke = color2 && _typeof$q(color2) === "object" ? "url(#".concat(gradientId, ")") : void 0;
var circleStyleForStack = getCircleStyle(perimeter, perimeterWithoutGap, stackPtg, stepPtg, rotateDeg, gapDegree, gapPosition, color2, "butt", strokeWidth, stepSpace);
stackPtg += (perimeterWithoutGap - circleStyleForStack.strokeDashoffset + stepSpace) * 100 / perimeterWithoutGap;
return /* @__PURE__ */ jsx("circle", {
className: "".concat(prefixCls, "-circle-path"),
r: radius,
cx: 0,
cy: 0,
stroke,
strokeWidth,
opacity: 1,
style: circleStyleForStack,
ref: function ref(elem) {
paths[index2] = elem;
}
}, index2);
});
};
return /* @__PURE__ */ jsxs("svg", {
className: classnames("".concat(prefixCls, "-circle"), className),
viewBox: "".concat(-VIEW_BOX_SIZE / 2, " ").concat(-VIEW_BOX_SIZE / 2, " ").concat(VIEW_BOX_SIZE, " ").concat(VIEW_BOX_SIZE),
style: style2,
id: id2,
role: "presentation",
...restProps,
children: [gradient && /* @__PURE__ */ jsx("defs", {
children: /* @__PURE__ */ jsx("linearGradient", {
id: gradientId,
x1: "100%",
y1: "0%",
x2: "0%",
y2: "0%",
children: Object.keys(gradient).sort(function(a, b2) {
return stripPercentToNumber(a) - stripPercentToNumber(b2);
}).map(function(key2, index2) {
return /* @__PURE__ */ jsx("stop", {
offset: key2,
stopColor: gradient[key2]
}, index2);
})
})
}), !stepCount && /* @__PURE__ */ jsx("circle", {
className: "".concat(prefixCls, "-circle-trail"),
r: radius,
cx: 0,
cy: 0,
stroke: trailColor,
strokeLinecap,
strokeWidth: trailWidth || strokeWidth,
style: circleStyle
}), stepCount ? getStepStokeList() : getStokeList()]
});
};
Circle$2.defaultProps = defaultProps;
Circle$2.displayName = "Circle";
function validProgress(progress) {
if (!progress || progress < 0) {
return 0;
}
if (progress > 100) {
return 100;
}
return progress;
}
function getSuccessPercent(_ref) {
var success = _ref.success, successPercent = _ref.successPercent;
var percent = successPercent;
if (success && "progress" in success) {
percent = success.progress;
}
if (success && "percent" in success) {
percent = success.percent;
}
return percent;
}
function getPercentage(_ref) {
var percent = _ref.percent, success = _ref.success, successPercent = _ref.successPercent;
var realSuccessPercent = validProgress(getSuccessPercent({
success,
successPercent
}));
return [realSuccessPercent, validProgress(validProgress(percent) - realSuccessPercent)];
}
function getStrokeColor(_ref2) {
var _ref2$success = _ref2.success, success = _ref2$success === void 0 ? {} : _ref2$success, strokeColor = _ref2.strokeColor;
var successColor = success.strokeColor;
return [successColor || presetPrimaryColors.green, strokeColor || null];
}
var Circle = function Circle2(props) {
var prefixCls = props.prefixCls, width = props.width, strokeWidth = props.strokeWidth, _props$trailColor = props.trailColor, trailColor = _props$trailColor === void 0 ? null : _props$trailColor, _props$strokeLinecap = props.strokeLinecap, strokeLinecap = _props$strokeLinecap === void 0 ? "round" : _props$strokeLinecap, gapPosition = props.gapPosition, gapDegree = props.gapDegree, type2 = props.type, children = props.children, success = props.success;
var circleSize = width || 120;
var circleStyle = {
width: circleSize,
height: circleSize,
fontSize: circleSize * 0.15 + 6
};
var circleWidth = strokeWidth || 6;
var gapPos = gapPosition || type2 === "dashboard" && "bottom" || void 0;
var getGapDegree = function getGapDegree2() {
if (gapDegree || gapDegree === 0) {
return gapDegree;
}
if (type2 === "dashboard") {
return 75;
}
return void 0;
};
var isGradient = Object.prototype.toString.call(props.strokeColor) === "[object Object]";
var strokeColor = getStrokeColor({
success,
strokeColor: props.strokeColor
});
var wrapperClassName = classnames("".concat(prefixCls, "-inner"), _defineProperty$b({}, "".concat(prefixCls, "-circle-gradient"), isGradient));
return /* @__PURE__ */ jsxs("div", {
className: wrapperClassName,
style: circleStyle,
children: [/* @__PURE__ */ jsx(Circle$2, {
percent: getPercentage(props),
strokeWidth: circleWidth,
trailWidth: circleWidth,
strokeColor,
strokeLinecap,
trailColor,
prefixCls,
gapDegree: getGapDegree(),
gapPosition: gapPos
}), children]
});
};
const Circle$1 = Circle;
var __rest$9 = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var sortGradient = function sortGradient2(gradients) {
var tempArr = [];
Object.keys(gradients).forEach(function(key2) {
var formattedKey = parseFloat(key2.replace(/%/g, ""));
if (!isNaN(formattedKey)) {
tempArr.push({
key: formattedKey,
value: gradients[key2]
});
}
});
tempArr = tempArr.sort(function(a, b2) {
return a.key - b2.key;
});
return tempArr.map(function(_ref) {
var key2 = _ref.key, value = _ref.value;
return "".concat(value, " ").concat(key2, "%");
}).join(", ");
};
var handleGradient = function handleGradient2(strokeColor, directionConfig) {
var _strokeColor$from = strokeColor.from, from = _strokeColor$from === void 0 ? presetPrimaryColors.blue : _strokeColor$from, _strokeColor$to = strokeColor.to, to = _strokeColor$to === void 0 ? presetPrimaryColors.blue : _strokeColor$to, _strokeColor$directio = strokeColor.direction, direction = _strokeColor$directio === void 0 ? directionConfig === "rtl" ? "to left" : "to right" : _strokeColor$directio, rest = __rest$9(strokeColor, ["from", "to", "direction"]);
if (Object.keys(rest).length !== 0) {
var sortedGradients = sortGradient(rest);
return {
backgroundImage: "linear-gradient(".concat(direction, ", ").concat(sortedGradients, ")")
};
}
return {
backgroundImage: "linear-gradient(".concat(direction, ", ").concat(from, ", ").concat(to, ")")
};
};
var Line = function Line2(props) {
var prefixCls = props.prefixCls, directionConfig = props.direction, percent = props.percent, strokeWidth = props.strokeWidth, size = props.size, strokeColor = props.strokeColor, _props$strokeLinecap = props.strokeLinecap, strokeLinecap = _props$strokeLinecap === void 0 ? "round" : _props$strokeLinecap, children = props.children, _props$trailColor = props.trailColor, trailColor = _props$trailColor === void 0 ? null : _props$trailColor, success = props.success;
var backgroundProps = strokeColor && typeof strokeColor !== "string" ? handleGradient(strokeColor, directionConfig) : {
background: strokeColor
};
var borderRadius = strokeLinecap === "square" || strokeLinecap === "butt" ? 0 : void 0;
var trailStyle = {
backgroundColor: trailColor || void 0,
borderRadius
};
var percentStyle = _extends$3({
width: "".concat(validProgress(percent), "%"),
height: strokeWidth || (size === "small" ? 6 : 8),
borderRadius
}, backgroundProps);
var successPercent = getSuccessPercent(props);
var successPercentStyle = {
width: "".concat(validProgress(successPercent), "%"),
height: strokeWidth || (size === "small" ? 6 : 8),
borderRadius,
backgroundColor: success === null || success === void 0 ? void 0 : success.strokeColor
};
var successSegment = successPercent !== void 0 ? /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-success-bg"),
style: successPercentStyle
}) : null;
return /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-outer"),
children: /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-inner"),
style: trailStyle,
children: [/* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-bg"),
style: percentStyle
}), successSegment]
})
}), children]
});
};
const Line$1 = Line;
var Steps$1 = function Steps2(props) {
var size = props.size, steps = props.steps, _props$percent = props.percent, percent = _props$percent === void 0 ? 0 : _props$percent, _props$strokeWidth = props.strokeWidth, strokeWidth = _props$strokeWidth === void 0 ? 8 : _props$strokeWidth, strokeColor = props.strokeColor, _props$trailColor = props.trailColor, trailColor = _props$trailColor === void 0 ? null : _props$trailColor, prefixCls = props.prefixCls, children = props.children;
var current = Math.round(steps * (percent / 100));
var stepWidth = size === "small" ? 2 : 14;
var styledSteps = new Array(steps);
for (var i2 = 0; i2 < steps; i2++) {
var color2 = Array.isArray(strokeColor) ? strokeColor[i2] : strokeColor;
styledSteps[i2] = /* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-steps-item"), _defineProperty$b({}, "".concat(prefixCls, "-steps-item-active"), i2 <= current - 1)),
style: {
backgroundColor: i2 <= current - 1 ? color2 : trailColor,
width: stepWidth,
height: strokeWidth
}
}, i2);
}
return /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-steps-outer"),
children: [styledSteps, children]
});
};
const Steps$2 = Steps$1;
var __rest$8 = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
tuple$1("line", "circle", "dashboard");
var ProgressStatuses = tuple$1("normal", "exception", "active", "success");
var Progress = function Progress2(props) {
var _classNames;
var customizePrefixCls = props.prefixCls, className = props.className, steps = props.steps, strokeColor = props.strokeColor, _props$percent = props.percent, percent = _props$percent === void 0 ? 0 : _props$percent, _props$size = props.size, size = _props$size === void 0 ? "default" : _props$size, _props$showInfo = props.showInfo, showInfo = _props$showInfo === void 0 ? true : _props$showInfo, _props$type = props.type, type2 = _props$type === void 0 ? "line" : _props$type, restProps = __rest$8(props, ["prefixCls", "className", "steps", "strokeColor", "percent", "size", "showInfo", "type"]);
function getPercentNumber() {
var successPercent = getSuccessPercent(props);
return parseInt(successPercent !== void 0 ? successPercent.toString() : percent.toString(), 10);
}
function getProgressStatus() {
var status = props.status;
if (!ProgressStatuses.includes(status) && getPercentNumber() >= 100) {
return "success";
}
return status || "normal";
}
function renderProcessInfo(prefixCls2, progressStatus2) {
var format2 = props.format;
var successPercent = getSuccessPercent(props);
if (!showInfo) {
return null;
}
var text;
var textFormatter = format2 || function(percentNumber) {
return "".concat(percentNumber, "%");
};
var isLineType = type2 === "line";
if (format2 || progressStatus2 !== "exception" && progressStatus2 !== "success") {
text = textFormatter(validProgress(percent), validProgress(successPercent));
} else if (progressStatus2 === "exception") {
text = isLineType ? /* @__PURE__ */ jsx(CloseCircleFilled$1, {}) : /* @__PURE__ */ jsx(CloseOutlined$4, {});
} else if (progressStatus2 === "success") {
text = isLineType ? /* @__PURE__ */ jsx(CheckCircleFilled$1, {}) : /* @__PURE__ */ jsx(CheckOutlined$1, {});
}
return /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls2, "-text"),
title: typeof text === "string" ? text : void 0,
children: text
});
}
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var prefixCls = getPrefixCls("progress", customizePrefixCls);
var progressStatus = getProgressStatus();
var progressInfo = renderProcessInfo(prefixCls, progressStatus);
var strokeColorNotArray = Array.isArray(strokeColor) ? strokeColor[0] : strokeColor;
var strokeColorNotGradient = typeof strokeColor === "string" || Array.isArray(strokeColor) ? strokeColor : void 0;
var progress;
if (type2 === "line") {
progress = steps ? /* @__PURE__ */ jsx(Steps$2, {
...props,
strokeColor: strokeColorNotGradient,
prefixCls,
steps,
children: progressInfo
}) : /* @__PURE__ */ jsx(Line$1, {
...props,
strokeColor: strokeColorNotArray,
prefixCls,
direction,
children: progressInfo
});
} else if (type2 === "circle" || type2 === "dashboard") {
progress = /* @__PURE__ */ jsx(Circle$1, {
...props,
strokeColor: strokeColorNotArray,
prefixCls,
progressStatus,
children: progressInfo
});
}
var classString = classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(type2 === "dashboard" && "circle" || steps && "steps" || type2), true), _defineProperty$b(_classNames, "".concat(prefixCls, "-status-").concat(progressStatus), true), _defineProperty$b(_classNames, "".concat(prefixCls, "-show-info"), showInfo), _defineProperty$b(_classNames, "".concat(prefixCls, "-").concat(size), size), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames), className);
return /* @__PURE__ */ jsx("div", {
...omit(restProps, ["status", "format", "trailColor", "strokeWidth", "width", "gapDegree", "gapPosition", "strokeLinecap", "success", "successPercent"]),
className: classString,
role: "progressbar",
children: progress
});
};
const Progress$1 = Progress;
var StarFilled$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M908.1 353.1l-253.9-36.9L540.7 86.1c-3.1-6.3-8.2-11.4-14.5-14.5-15.8-7.8-35-1.3-42.9 14.5L369.8 316.2l-253.9 36.9c-7 1-13.4 4.3-18.3 9.3a32.05 32.05 0 00.6 45.3l183.7 179.1-43.4 252.9a31.95 31.95 0 0046.4 33.7L512 754l227.1 119.4c6.2 3.3 13.4 4.4 20.3 3.2 17.4-3 29.1-19.5 26.1-36.9l-43.4-252.9 183.7-179.1c5-4.9 8.3-11.3 9.3-18.3 2.7-17.5-9.5-33.7-27-36.3z" } }] }, "name": "star", "theme": "filled" };
const StarFilledSvg = StarFilled$2;
var StarFilled = function StarFilled2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: StarFilledSvg
})
});
};
StarFilled.displayName = "StarFilled";
const StarFilled$1 = /* @__PURE__ */ React__namespace.forwardRef(StarFilled);
function getScroll(w2) {
var ret = w2.pageXOffset;
var method2 = "scrollLeft";
if (typeof ret !== "number") {
var d2 = w2.document;
ret = d2.documentElement[method2];
if (typeof ret !== "number") {
ret = d2.body[method2];
}
}
return ret;
}
function getClientPosition(elem) {
var x2;
var y2;
var doc = elem.ownerDocument;
var body = doc.body;
var docElem = doc && doc.documentElement;
var box = elem.getBoundingClientRect();
x2 = box.left;
y2 = box.top;
x2 -= docElem.clientLeft || body.clientLeft || 0;
y2 -= docElem.clientTop || body.clientTop || 0;
return {
left: x2,
top: y2
};
}
function getOffsetLeft(el) {
var pos = getClientPosition(el);
var doc = el.ownerDocument;
var w2 = doc.defaultView || doc.parentWindow;
pos.left += getScroll(w2);
return pos.left;
}
var Star = /* @__PURE__ */ function(_React$Component) {
_inherits(Star2, _React$Component);
var _super = _createSuper(Star2);
function Star2() {
var _this2;
_classCallCheck(this, Star2);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this2 = _super.call.apply(_super, [this].concat(args));
_this2.onHover = function(e2) {
var _this$props = _this2.props, onHover = _this$props.onHover, index2 = _this$props.index;
onHover(e2, index2);
};
_this2.onClick = function(e2) {
var _this$props2 = _this2.props, onClick = _this$props2.onClick, index2 = _this$props2.index;
onClick(e2, index2);
};
_this2.onKeyDown = function(e2) {
var _this$props3 = _this2.props, onClick = _this$props3.onClick, index2 = _this$props3.index;
if (e2.keyCode === 13) {
onClick(e2, index2);
}
};
return _this2;
}
_createClass(Star2, [{
key: "getClassName",
value: function getClassName() {
var _this$props4 = this.props, prefixCls = _this$props4.prefixCls, index2 = _this$props4.index, value = _this$props4.value, allowHalf = _this$props4.allowHalf, focused = _this$props4.focused;
var starValue = index2 + 1;
var className = prefixCls;
if (value === 0 && index2 === 0 && focused) {
className += " ".concat(prefixCls, "-focused");
} else if (allowHalf && value + 0.5 >= starValue && value < starValue) {
className += " ".concat(prefixCls, "-half ").concat(prefixCls, "-active");
if (focused) {
className += " ".concat(prefixCls, "-focused");
}
} else {
className += starValue <= value ? " ".concat(prefixCls, "-full") : " ".concat(prefixCls, "-zero");
if (starValue === value && focused) {
className += " ".concat(prefixCls, "-focused");
}
}
return className;
}
}, {
key: "render",
value: function render2() {
var onHover = this.onHover, onClick = this.onClick, onKeyDown2 = this.onKeyDown;
var _this$props5 = this.props, disabled = _this$props5.disabled, prefixCls = _this$props5.prefixCls, character = _this$props5.character, characterRender = _this$props5.characterRender, index2 = _this$props5.index, count = _this$props5.count, value = _this$props5.value;
var characterNode = typeof character === "function" ? character(this.props) : character;
var start = /* @__PURE__ */ jsx("li", {
className: this.getClassName(),
children: /* @__PURE__ */ jsxs("div", {
onClick: disabled ? null : onClick,
onKeyDown: disabled ? null : onKeyDown2,
onMouseMove: disabled ? null : onHover,
role: "radio",
"aria-checked": value > index2 ? "true" : "false",
"aria-posinset": index2 + 1,
"aria-setsize": count,
tabIndex: disabled ? -1 : 0,
children: [/* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-first"),
children: characterNode
}), /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-second"),
children: characterNode
})]
})
});
if (characterRender) {
start = characterRender(start, this.props);
}
return start;
}
}]);
return Star2;
}(React__default.default.Component);
function noop$4() {
}
var Rate$1 = /* @__PURE__ */ function(_React$Component) {
_inherits(Rate2, _React$Component);
var _super = _createSuper(Rate2);
function Rate2(props) {
var _this2;
_classCallCheck(this, Rate2);
_this2 = _super.call(this, props);
_this2.stars = void 0;
_this2.rate = void 0;
_this2.onHover = function(event, index2) {
var onHoverChange = _this2.props.onHoverChange;
var hoverValue = _this2.getStarValue(index2, event.pageX);
var cleanedValue = _this2.state.cleanedValue;
if (hoverValue !== cleanedValue) {
_this2.setState({
hoverValue,
cleanedValue: null
});
}
onHoverChange(hoverValue);
};
_this2.onMouseLeave = function() {
var onHoverChange = _this2.props.onHoverChange;
_this2.setState({
hoverValue: void 0,
cleanedValue: null
});
onHoverChange(void 0);
};
_this2.onClick = function(event, index2) {
var allowClear = _this2.props.allowClear;
var value = _this2.state.value;
var newValue = _this2.getStarValue(index2, event.pageX);
var isReset = false;
if (allowClear) {
isReset = newValue === value;
}
_this2.onMouseLeave();
_this2.changeValue(isReset ? 0 : newValue);
_this2.setState({
cleanedValue: isReset ? newValue : null
});
};
_this2.onFocus = function() {
var onFocus = _this2.props.onFocus;
_this2.setState({
focused: true
});
if (onFocus) {
onFocus();
}
};
_this2.onBlur = function() {
var onBlur = _this2.props.onBlur;
_this2.setState({
focused: false
});
if (onBlur) {
onBlur();
}
};
_this2.onKeyDown = function(event) {
var keyCode = event.keyCode;
var _this$props = _this2.props, count = _this$props.count, allowHalf = _this$props.allowHalf, onKeyDown2 = _this$props.onKeyDown, direction = _this$props.direction;
var reverse = direction === "rtl";
var value = _this2.state.value;
if (keyCode === KeyCode.RIGHT && value < count && !reverse) {
if (allowHalf) {
value += 0.5;
} else {
value += 1;
}
_this2.changeValue(value);
event.preventDefault();
} else if (keyCode === KeyCode.LEFT && value > 0 && !reverse) {
if (allowHalf) {
value -= 0.5;
} else {
value -= 1;
}
_this2.changeValue(value);
event.preventDefault();
} else if (keyCode === KeyCode.RIGHT && value > 0 && reverse) {
if (allowHalf) {
value -= 0.5;
} else {
value -= 1;
}
_this2.changeValue(value);
event.preventDefault();
} else if (keyCode === KeyCode.LEFT && value < count && reverse) {
if (allowHalf) {
value += 0.5;
} else {
value += 1;
}
_this2.changeValue(value);
event.preventDefault();
}
if (onKeyDown2) {
onKeyDown2(event);
}
};
_this2.saveRef = function(index2) {
return function(node) {
_this2.stars[index2] = node;
};
};
_this2.saveRate = function(node) {
_this2.rate = node;
};
var _value = props.value;
if (_value === void 0) {
_value = props.defaultValue;
}
_this2.stars = {};
_this2.state = {
value: _value,
focused: false,
cleanedValue: null
};
return _this2;
}
_createClass(Rate2, [{
key: "componentDidMount",
value: function componentDidMount() {
var _this$props2 = this.props, autoFocus = _this$props2.autoFocus, disabled = _this$props2.disabled;
if (autoFocus && !disabled) {
this.focus();
}
}
}, {
key: "getStarDOM",
value: function getStarDOM(index2) {
return findDOMNode(this.stars[index2]);
}
}, {
key: "getStarValue",
value: function getStarValue(index2, x2) {
var _this$props3 = this.props, allowHalf = _this$props3.allowHalf, direction = _this$props3.direction;
var reverse = direction === "rtl";
var value = index2 + 1;
if (allowHalf) {
var starEle = this.getStarDOM(index2);
var leftDis = getOffsetLeft(starEle);
var width = starEle.clientWidth;
if (reverse && x2 - leftDis > width / 2) {
value -= 0.5;
} else if (!reverse && x2 - leftDis < width / 2) {
value -= 0.5;
}
}
return value;
}
}, {
key: "focus",
value: function focus() {
var disabled = this.props.disabled;
if (!disabled) {
this.rate.focus();
}
}
}, {
key: "blur",
value: function blur() {
var disabled = this.props.disabled;
if (!disabled) {
this.rate.blur();
}
}
}, {
key: "changeValue",
value: function changeValue(value) {
var onChange = this.props.onChange;
if (!("value" in this.props)) {
this.setState({
value
});
}
onChange(value);
}
}, {
key: "render",
value: function render2() {
var _this$props4 = this.props, count = _this$props4.count, allowHalf = _this$props4.allowHalf, style2 = _this$props4.style, prefixCls = _this$props4.prefixCls, disabled = _this$props4.disabled, className = _this$props4.className, character = _this$props4.character, characterRender = _this$props4.characterRender, tabIndex = _this$props4.tabIndex, direction = _this$props4.direction;
var _this$state = this.state, value = _this$state.value, hoverValue = _this$state.hoverValue, focused = _this$state.focused;
var stars = [];
var disabledClass = disabled ? "".concat(prefixCls, "-disabled") : "";
for (var index2 = 0; index2 < count; index2 += 1) {
stars.push(
/* @__PURE__ */ jsx(Star, {
ref: this.saveRef(index2),
index: index2,
count,
disabled,
prefixCls: "".concat(prefixCls, "-star"),
allowHalf,
value: hoverValue === void 0 ? value : hoverValue,
onClick: this.onClick,
onHover: this.onHover,
character,
characterRender,
focused
}, index2)
);
}
var rateClassName = classnames(prefixCls, disabledClass, className, _defineProperty$b({}, "".concat(prefixCls, "-rtl"), direction === "rtl"));
return /* @__PURE__ */ jsx("ul", {
className: rateClassName,
style: style2,
onMouseLeave: disabled ? null : this.onMouseLeave,
tabIndex: disabled ? -1 : tabIndex,
onFocus: disabled ? null : this.onFocus,
onBlur: disabled ? null : this.onBlur,
onKeyDown: disabled ? null : this.onKeyDown,
ref: this.saveRate,
role: "radiogroup",
children: stars
});
}
}], [{
key: "getDerivedStateFromProps",
value: function getDerivedStateFromProps(nextProps, state) {
if ("value" in nextProps && nextProps.value !== void 0) {
return _objectSpread2$a(_objectSpread2$a({}, state), {}, {
value: nextProps.value
});
}
return state;
}
}]);
return Rate2;
}(React__default.default.Component);
Rate$1.defaultProps = {
defaultValue: 0,
count: 5,
allowHalf: false,
allowClear: true,
style: {},
prefixCls: "rc-rate",
onChange: noop$4,
character: "\u2605",
onHoverChange: noop$4,
tabIndex: 0,
direction: "ltr"
};
var __rest$7 = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var Rate = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var prefixCls = props.prefixCls, tooltips = props.tooltips, _props$character = props.character, character = _props$character === void 0 ? /* @__PURE__ */ jsx(StarFilled$1, {}) : _props$character, rest = __rest$7(props, ["prefixCls", "tooltips", "character"]);
var characterRender = function characterRender2(node, _ref) {
var index2 = _ref.index;
if (!tooltips) {
return node;
}
return /* @__PURE__ */ jsx(_Tooltip, {
title: tooltips[index2],
children: node
});
};
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var ratePrefixCls = getPrefixCls("rate", prefixCls);
return /* @__PURE__ */ jsx(Rate$1, {
ref,
character,
characterRender,
...rest,
prefixCls: ratePrefixCls,
direction
});
});
const _Rate = Rate;
var SliderContext = /* @__PURE__ */ React__namespace.createContext({
min: 0,
max: 0,
direction: "ltr",
step: 1,
includedStart: 0,
includedEnd: 0,
tabIndex: 0
});
function getOffset(value, min, max) {
return (value - min) / (max - min);
}
function getDirectionStyle(direction, value, min, max) {
var offset2 = getOffset(value, min, max);
var positionStyle = {};
switch (direction) {
case "rtl":
positionStyle.right = "".concat(offset2 * 100, "%");
positionStyle.transform = "translateX(50%)";
break;
case "btt":
positionStyle.bottom = "".concat(offset2 * 100, "%");
positionStyle.transform = "translateY(50%)";
break;
case "ttb":
positionStyle.top = "".concat(offset2 * 100, "%");
positionStyle.transform = "translateY(-50%)";
break;
default:
positionStyle.left = "".concat(offset2 * 100, "%");
positionStyle.transform = "translateX(-50%)";
break;
}
return positionStyle;
}
function getIndex(value, index2) {
return Array.isArray(value) ? value[index2] : value;
}
var _excluded$e = ["prefixCls", "value", "valueIndex", "onStartMove", "style", "render", "dragging", "onOffsetChange"];
var Handle = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _classNames, _getIndex;
var prefixCls = props.prefixCls, value = props.value, valueIndex = props.valueIndex, onStartMove = props.onStartMove, style2 = props.style, render2 = props.render, dragging = props.dragging, onOffsetChange = props.onOffsetChange, restProps = _objectWithoutProperties$1(props, _excluded$e);
var _React$useContext = React__namespace.useContext(SliderContext), min = _React$useContext.min, max = _React$useContext.max, direction = _React$useContext.direction, disabled = _React$useContext.disabled, range2 = _React$useContext.range, tabIndex = _React$useContext.tabIndex, ariaLabelForHandle = _React$useContext.ariaLabelForHandle, ariaLabelledByForHandle = _React$useContext.ariaLabelledByForHandle, ariaValueTextFormatterForHandle = _React$useContext.ariaValueTextFormatterForHandle;
var handlePrefixCls = "".concat(prefixCls, "-handle");
var onInternalStartMove = function onInternalStartMove2(e2) {
if (!disabled) {
onStartMove(e2, valueIndex);
}
};
var onKeyDown2 = function onKeyDown3(e2) {
if (!disabled) {
var offset2 = null;
switch (e2.which || e2.keyCode) {
case KeyCode.LEFT:
offset2 = direction === "ltr" || direction === "btt" ? -1 : 1;
break;
case KeyCode.RIGHT:
offset2 = direction === "ltr" || direction === "btt" ? 1 : -1;
break;
case KeyCode.UP:
offset2 = direction !== "ttb" ? 1 : -1;
break;
case KeyCode.DOWN:
offset2 = direction !== "ttb" ? -1 : 1;
break;
case KeyCode.HOME:
offset2 = "min";
break;
case KeyCode.END:
offset2 = "max";
break;
case KeyCode.PAGE_UP:
offset2 = 2;
break;
case KeyCode.PAGE_DOWN:
offset2 = -2;
break;
}
if (offset2 !== null) {
e2.preventDefault();
onOffsetChange(offset2, valueIndex);
}
}
};
var positionStyle = getDirectionStyle(direction, value, min, max);
var handleNode = /* @__PURE__ */ jsx("div", {
ref,
className: classnames(handlePrefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(handlePrefixCls, "-").concat(valueIndex + 1), range2), _defineProperty$b(_classNames, "".concat(handlePrefixCls, "-dragging"), dragging), _classNames)),
style: _objectSpread2$a(_objectSpread2$a({}, positionStyle), style2),
onMouseDown: onInternalStartMove,
onTouchStart: onInternalStartMove,
onKeyDown: onKeyDown2,
tabIndex: disabled ? null : getIndex(tabIndex, valueIndex),
role: "slider",
"aria-valuemin": min,
"aria-valuemax": max,
"aria-valuenow": value,
"aria-disabled": disabled,
"aria-label": getIndex(ariaLabelForHandle, valueIndex),
"aria-labelledby": getIndex(ariaLabelledByForHandle, valueIndex),
"aria-valuetext": (_getIndex = getIndex(ariaValueTextFormatterForHandle, valueIndex)) === null || _getIndex === void 0 ? void 0 : _getIndex(value),
...restProps
});
if (render2) {
handleNode = render2(handleNode, {
index: valueIndex,
prefixCls,
value,
dragging
});
}
return handleNode;
});
var _excluded$d = ["prefixCls", "style", "onStartMove", "onOffsetChange", "values", "handleRender", "draggingIndex"];
var Handles = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var prefixCls = props.prefixCls, style2 = props.style, onStartMove = props.onStartMove, onOffsetChange = props.onOffsetChange, values = props.values, handleRender = props.handleRender, draggingIndex = props.draggingIndex, restProps = _objectWithoutProperties$1(props, _excluded$d);
var handlesRef = React__namespace.useRef({});
React__namespace.useImperativeHandle(ref, function() {
return {
focus: function focus(index2) {
var _handlesRef$current$i;
(_handlesRef$current$i = handlesRef.current[index2]) === null || _handlesRef$current$i === void 0 ? void 0 : _handlesRef$current$i.focus();
}
};
});
return /* @__PURE__ */ jsx(Fragment, {
children: values.map(function(value, index2) {
return /* @__PURE__ */ jsx(Handle, {
ref: function ref2(node) {
if (!node) {
delete handlesRef.current[index2];
} else {
handlesRef.current[index2] = node;
}
},
dragging: draggingIndex === index2,
prefixCls,
style: getIndex(style2, index2),
value,
valueIndex: index2,
onStartMove,
onOffsetChange,
render: handleRender,
...restProps
}, index2);
})
});
});
function getPosition(e2) {
var obj = "touches" in e2 ? e2.touches[0] : e2;
return {
pageX: obj.pageX,
pageY: obj.pageY
};
}
function useDrag(containerRef, direction, rawValues, min, max, formatValue2, triggerChange, finishChange, offsetValues) {
var _React$useState = React__namespace.useState(null), _React$useState2 = _slicedToArray$e(_React$useState, 2), draggingValue = _React$useState2[0], setDraggingValue = _React$useState2[1];
var _React$useState3 = React__namespace.useState(-1), _React$useState4 = _slicedToArray$e(_React$useState3, 2), draggingIndex = _React$useState4[0], setDraggingIndex = _React$useState4[1];
var _React$useState5 = React__namespace.useState(rawValues), _React$useState6 = _slicedToArray$e(_React$useState5, 2), cacheValues = _React$useState6[0], setCacheValues = _React$useState6[1];
var _React$useState7 = React__namespace.useState(rawValues), _React$useState8 = _slicedToArray$e(_React$useState7, 2), originValues = _React$useState8[0], setOriginValues = _React$useState8[1];
var mouseMoveEventRef = React__namespace.useRef(null);
var mouseUpEventRef = React__namespace.useRef(null);
React__namespace.useEffect(function() {
if (draggingIndex === -1) {
setCacheValues(rawValues);
}
}, [rawValues, draggingIndex]);
React__namespace.useEffect(function() {
return function() {
document.removeEventListener("mousemove", mouseMoveEventRef.current);
document.removeEventListener("mouseup", mouseUpEventRef.current);
document.removeEventListener("touchmove", mouseMoveEventRef.current);
document.removeEventListener("touchend", mouseUpEventRef.current);
};
}, []);
var flushValues = function flushValues2(nextValues, nextValue) {
if (cacheValues.some(function(val, i2) {
return val !== nextValues[i2];
})) {
if (nextValue !== void 0) {
setDraggingValue(nextValue);
}
setCacheValues(nextValues);
triggerChange(nextValues);
}
};
var updateCacheValue = function updateCacheValue2(valueIndex, offsetPercent) {
if (valueIndex === -1) {
var startValue = originValues[0];
var endValue = originValues[originValues.length - 1];
var maxStartOffset = min - startValue;
var maxEndOffset = max - endValue;
var offset2 = offsetPercent * (max - min);
offset2 = Math.max(offset2, maxStartOffset);
offset2 = Math.min(offset2, maxEndOffset);
var formatStartValue = formatValue2(startValue + offset2);
offset2 = formatStartValue - startValue;
var cloneCacheValues = originValues.map(function(val) {
return val + offset2;
});
flushValues(cloneCacheValues);
} else {
var offsetDist = (max - min) * offsetPercent;
var cloneValues = _toConsumableArray$c(cacheValues);
cloneValues[valueIndex] = originValues[valueIndex];
var next = offsetValues(cloneValues, offsetDist, valueIndex, "dist");
flushValues(next.values, next.value);
}
};
var updateCacheValueRef = React__namespace.useRef(updateCacheValue);
updateCacheValueRef.current = updateCacheValue;
var onStartMove = function onStartMove2(e2, valueIndex) {
e2.stopPropagation();
var originValue = rawValues[valueIndex];
setDraggingIndex(valueIndex);
setDraggingValue(originValue);
setOriginValues(rawValues);
var _getPosition = getPosition(e2), startX = _getPosition.pageX, startY = _getPosition.pageY;
var onMouseMove = function onMouseMove2(event) {
event.preventDefault();
var _getPosition2 = getPosition(event), moveX = _getPosition2.pageX, moveY = _getPosition2.pageY;
var offsetX = moveX - startX;
var offsetY = moveY - startY;
var _containerRef$current = containerRef.current.getBoundingClientRect(), width = _containerRef$current.width, height = _containerRef$current.height;
var offSetPercent;
switch (direction) {
case "btt":
offSetPercent = -offsetY / height;
break;
case "ttb":
offSetPercent = offsetY / height;
break;
case "rtl":
offSetPercent = -offsetX / width;
break;
default:
offSetPercent = offsetX / width;
}
updateCacheValueRef.current(valueIndex, offSetPercent);
};
var onMouseUp = function onMouseUp2(event) {
event.preventDefault();
document.removeEventListener("mouseup", onMouseUp2);
document.removeEventListener("mousemove", onMouseMove);
document.removeEventListener("touchend", onMouseUp2);
document.removeEventListener("touchmove", onMouseMove);
mouseMoveEventRef.current = null;
mouseUpEventRef.current = null;
setDraggingIndex(-1);
finishChange();
};
document.addEventListener("mouseup", onMouseUp);
document.addEventListener("mousemove", onMouseMove);
document.addEventListener("touchend", onMouseUp);
document.addEventListener("touchmove", onMouseMove);
mouseMoveEventRef.current = onMouseMove;
mouseUpEventRef.current = onMouseUp;
};
var returnValues = React__namespace.useMemo(function() {
var sourceValues = _toConsumableArray$c(rawValues).sort(function(a, b2) {
return a - b2;
});
var targetValues = _toConsumableArray$c(cacheValues).sort(function(a, b2) {
return a - b2;
});
return sourceValues.every(function(val, index2) {
return val === targetValues[index2];
}) ? cacheValues : rawValues;
}, [rawValues, cacheValues]);
return [draggingIndex, draggingValue, returnValues, onStartMove];
}
function Track(props) {
var prefixCls = props.prefixCls, style2 = props.style, start = props.start, end = props.end, index2 = props.index, onStartMove = props.onStartMove;
var _React$useContext = React__namespace.useContext(SliderContext), direction = _React$useContext.direction, min = _React$useContext.min, max = _React$useContext.max, disabled = _React$useContext.disabled, range2 = _React$useContext.range;
var trackPrefixCls = "".concat(prefixCls, "-track");
var offsetStart = getOffset(start, min, max);
var offsetEnd = getOffset(end, min, max);
var onInternalStartMove = function onInternalStartMove2(e2) {
if (!disabled && onStartMove) {
onStartMove(e2, -1);
}
};
var positionStyle = {};
switch (direction) {
case "rtl":
positionStyle.right = "".concat(offsetStart * 100, "%");
positionStyle.width = "".concat(offsetEnd * 100 - offsetStart * 100, "%");
break;
case "btt":
positionStyle.bottom = "".concat(offsetStart * 100, "%");
positionStyle.height = "".concat(offsetEnd * 100 - offsetStart * 100, "%");
break;
case "ttb":
positionStyle.top = "".concat(offsetStart * 100, "%");
positionStyle.height = "".concat(offsetEnd * 100 - offsetStart * 100, "%");
break;
default:
positionStyle.left = "".concat(offsetStart * 100, "%");
positionStyle.width = "".concat(offsetEnd * 100 - offsetStart * 100, "%");
}
return /* @__PURE__ */ jsx("div", {
className: classnames(trackPrefixCls, range2 && "".concat(trackPrefixCls, "-").concat(index2 + 1)),
style: _objectSpread2$a(_objectSpread2$a({}, positionStyle), style2),
onMouseDown: onInternalStartMove,
onTouchStart: onInternalStartMove
});
}
function Tracks(props) {
var prefixCls = props.prefixCls, style2 = props.style, values = props.values, startPoint = props.startPoint, onStartMove = props.onStartMove;
var _React$useContext = React__namespace.useContext(SliderContext), included = _React$useContext.included, range2 = _React$useContext.range, min = _React$useContext.min;
var trackList = React__namespace.useMemo(function() {
if (!range2) {
if (values.length === 0) {
return [];
}
var startValue = startPoint !== null && startPoint !== void 0 ? startPoint : min;
var endValue = values[0];
return [{
start: Math.min(startValue, endValue),
end: Math.max(startValue, endValue)
}];
}
var list = [];
for (var i2 = 0; i2 < values.length - 1; i2 += 1) {
list.push({
start: values[i2],
end: values[i2 + 1]
});
}
return list;
}, [values, range2, startPoint, min]);
return included ? trackList.map(function(_ref, index2) {
var start = _ref.start, end = _ref.end;
return /* @__PURE__ */ jsx(Track, {
index: index2,
prefixCls,
style: getIndex(style2, index2),
start,
end,
onStartMove
}, index2);
}) : null;
}
function Mark(props) {
var prefixCls = props.prefixCls, style2 = props.style, children = props.children, value = props.value, _onClick = props.onClick;
var _React$useContext = React__namespace.useContext(SliderContext), min = _React$useContext.min, max = _React$useContext.max, direction = _React$useContext.direction, includedStart = _React$useContext.includedStart, includedEnd = _React$useContext.includedEnd, included = _React$useContext.included;
var textCls = "".concat(prefixCls, "-text");
var positionStyle = getDirectionStyle(direction, value, min, max);
return /* @__PURE__ */ jsx("span", {
className: classnames(textCls, _defineProperty$b({}, "".concat(textCls, "-active"), included && includedStart <= value && value <= includedEnd)),
style: _objectSpread2$a(_objectSpread2$a({}, positionStyle), style2),
onMouseDown: function onMouseDown(e2) {
e2.stopPropagation();
},
onClick: function onClick() {
_onClick(value);
},
children
});
}
function Marks(props) {
var prefixCls = props.prefixCls, marks = props.marks, onClick = props.onClick;
var markPrefixCls = "".concat(prefixCls, "-mark");
if (!marks.length) {
return null;
}
return /* @__PURE__ */ jsx("div", {
className: markPrefixCls,
children: marks.map(function(_ref) {
var value = _ref.value, style2 = _ref.style, label = _ref.label;
return /* @__PURE__ */ jsx(Mark, {
prefixCls: markPrefixCls,
style: style2,
value,
onClick,
children: label
}, value);
})
});
}
function Dot(props) {
var prefixCls = props.prefixCls, value = props.value, style2 = props.style, activeStyle = props.activeStyle;
var _React$useContext = React__namespace.useContext(SliderContext), min = _React$useContext.min, max = _React$useContext.max, direction = _React$useContext.direction, included = _React$useContext.included, includedStart = _React$useContext.includedStart, includedEnd = _React$useContext.includedEnd;
var dotClassName = "".concat(prefixCls, "-dot");
var active = included && includedStart <= value && value <= includedEnd;
var mergedStyle = _objectSpread2$a(_objectSpread2$a({}, getDirectionStyle(direction, value, min, max)), typeof style2 === "function" ? style2(value) : style2);
if (active) {
mergedStyle = _objectSpread2$a(_objectSpread2$a({}, mergedStyle), typeof activeStyle === "function" ? activeStyle(value) : activeStyle);
}
return /* @__PURE__ */ jsx("span", {
className: classnames(dotClassName, _defineProperty$b({}, "".concat(dotClassName, "-active"), active)),
style: mergedStyle
});
}
function Steps(props) {
var prefixCls = props.prefixCls, marks = props.marks, dots = props.dots, style2 = props.style, activeStyle = props.activeStyle;
var _React$useContext = React__namespace.useContext(SliderContext), min = _React$useContext.min, max = _React$useContext.max, step2 = _React$useContext.step;
var stepDots = React__namespace.useMemo(function() {
var dotSet = /* @__PURE__ */ new Set();
marks.forEach(function(mark) {
dotSet.add(mark.value);
});
if (dots && step2 !== null) {
var current = min;
while (current <= max) {
dotSet.add(current);
current += step2;
}
}
return Array.from(dotSet);
}, [min, max, step2, dots, marks]);
return /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-step"),
children: stepDots.map(function(dotValue) {
return /* @__PURE__ */ jsx(Dot, {
prefixCls,
value: dotValue,
style: style2,
activeStyle
}, dotValue);
})
});
}
function useOffset(min, max, step2, markList, allowCross, pushable) {
var formatRangeValue = React__namespace.useCallback(function(val) {
var formatNextValue = isFinite(val) ? val : min;
formatNextValue = Math.min(max, val);
formatNextValue = Math.max(min, formatNextValue);
return formatNextValue;
}, [min, max]);
var formatStepValue = React__namespace.useCallback(function(val) {
if (step2 !== null) {
var stepValue = min + Math.round((formatRangeValue(val) - min) / step2) * step2;
var getDecimal = function getDecimal2(num) {
return (String(num).split(".")[1] || "").length;
};
var maxDecimal = Math.max(getDecimal(step2), getDecimal(max), getDecimal(min));
var fixedValue = Number(stepValue.toFixed(maxDecimal));
return min <= fixedValue && fixedValue <= max ? fixedValue : null;
}
return null;
}, [step2, min, max, formatRangeValue]);
var formatValue2 = React__namespace.useCallback(function(val) {
var formatNextValue = formatRangeValue(val);
var alignValues = markList.map(function(mark) {
return mark.value;
});
if (step2 !== null) {
alignValues.push(formatStepValue(val));
}
alignValues.push(min, max);
var closeValue = alignValues[0];
var closeDist = max - min;
alignValues.forEach(function(alignValue) {
var dist = Math.abs(formatNextValue - alignValue);
if (dist <= closeDist) {
closeValue = alignValue;
closeDist = dist;
}
});
return closeValue;
}, [min, max, markList, step2, formatRangeValue, formatStepValue]);
var offsetValue = function offsetValue2(values, offset2, valueIndex) {
var mode = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : "unit";
if (typeof offset2 === "number") {
var nextValue;
var originValue = values[valueIndex];
var targetDistValue = originValue + offset2;
var potentialValues = [];
markList.forEach(function(mark) {
potentialValues.push(mark.value);
});
potentialValues.push(min, max);
potentialValues.push(formatStepValue(originValue));
var sign = offset2 > 0 ? 1 : -1;
if (mode === "unit") {
potentialValues.push(formatStepValue(originValue + sign * step2));
} else {
potentialValues.push(formatStepValue(targetDistValue));
}
potentialValues = potentialValues.filter(function(val) {
return val !== null;
}).filter(function(val) {
return offset2 < 0 ? val <= originValue : val >= originValue;
});
if (mode === "unit") {
potentialValues = potentialValues.filter(function(val) {
return val !== originValue;
});
}
var compareValue = mode === "unit" ? originValue : targetDistValue;
nextValue = potentialValues[0];
var valueDist = Math.abs(nextValue - compareValue);
potentialValues.forEach(function(potentialValue) {
var dist = Math.abs(potentialValue - compareValue);
if (dist < valueDist) {
nextValue = potentialValue;
valueDist = dist;
}
});
if (nextValue === void 0) {
return offset2 < 0 ? min : max;
}
if (mode === "dist") {
return nextValue;
}
if (Math.abs(offset2) > 1) {
var cloneValues = _toConsumableArray$c(values);
cloneValues[valueIndex] = nextValue;
return offsetValue2(cloneValues, offset2 - sign, valueIndex, mode);
}
return nextValue;
} else if (offset2 === "min") {
return min;
} else if (offset2 === "max") {
return max;
}
};
var offsetChangedValue = function offsetChangedValue2(values, offset2, valueIndex) {
var mode = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : "unit";
var originValue = values[valueIndex];
var nextValue = offsetValue(values, offset2, valueIndex, mode);
return {
value: nextValue,
changed: nextValue !== originValue
};
};
var needPush = function needPush2(dist) {
return pushable === null && dist === 0 || typeof pushable === "number" && dist < pushable;
};
var offsetValues = function offsetValues2(values, offset2, valueIndex) {
var mode = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : "unit";
var nextValues = values.map(formatValue2);
var originValue = nextValues[valueIndex];
var nextValue = offsetValue(nextValues, offset2, valueIndex, mode);
nextValues[valueIndex] = nextValue;
if (allowCross === false) {
var pushNum = pushable || 0;
if (valueIndex > 0 && nextValues[valueIndex - 1] !== originValue) {
nextValues[valueIndex] = Math.max(nextValues[valueIndex], nextValues[valueIndex - 1] + pushNum);
}
if (valueIndex < nextValues.length - 1 && nextValues[valueIndex + 1] !== originValue) {
nextValues[valueIndex] = Math.min(nextValues[valueIndex], nextValues[valueIndex + 1] - pushNum);
}
} else if (typeof pushable === "number" || pushable === null) {
for (var i2 = valueIndex + 1; i2 < nextValues.length; i2 += 1) {
var changed = true;
while (needPush(nextValues[i2] - nextValues[i2 - 1]) && changed) {
var _offsetChangedValue = offsetChangedValue(nextValues, 1, i2);
nextValues[i2] = _offsetChangedValue.value;
changed = _offsetChangedValue.changed;
}
}
for (var _i = valueIndex; _i > 0; _i -= 1) {
var _changed = true;
while (needPush(nextValues[_i] - nextValues[_i - 1]) && _changed) {
var _offsetChangedValue2 = offsetChangedValue(nextValues, -1, _i - 1);
nextValues[_i - 1] = _offsetChangedValue2.value;
_changed = _offsetChangedValue2.changed;
}
}
for (var _i2 = nextValues.length - 1; _i2 > 0; _i2 -= 1) {
var _changed2 = true;
while (needPush(nextValues[_i2] - nextValues[_i2 - 1]) && _changed2) {
var _offsetChangedValue3 = offsetChangedValue(nextValues, -1, _i2 - 1);
nextValues[_i2 - 1] = _offsetChangedValue3.value;
_changed2 = _offsetChangedValue3.changed;
}
}
for (var _i3 = 0; _i3 < nextValues.length - 1; _i3 += 1) {
var _changed3 = true;
while (needPush(nextValues[_i3 + 1] - nextValues[_i3]) && _changed3) {
var _offsetChangedValue4 = offsetChangedValue(nextValues, 1, _i3 + 1);
nextValues[_i3 + 1] = _offsetChangedValue4.value;
_changed3 = _offsetChangedValue4.changed;
}
}
}
return {
value: nextValues[valueIndex],
values: nextValues
};
};
return [formatValue2, offsetValues];
}
var Slider$2 = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _classNames;
var _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-slider" : _props$prefixCls, className = props.className, style2 = props.style, _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? false : _props$disabled, autoFocus = props.autoFocus, onFocus = props.onFocus, onBlur = props.onBlur, _props$min = props.min, min = _props$min === void 0 ? 0 : _props$min, _props$max = props.max, max = _props$max === void 0 ? 100 : _props$max, _props$step = props.step, step2 = _props$step === void 0 ? 1 : _props$step, value = props.value, defaultValue = props.defaultValue, range2 = props.range, count = props.count, onChange = props.onChange, onBeforeChange = props.onBeforeChange, onAfterChange = props.onAfterChange, _props$allowCross = props.allowCross, allowCross = _props$allowCross === void 0 ? true : _props$allowCross, _props$pushable = props.pushable, pushable = _props$pushable === void 0 ? false : _props$pushable, draggableTrack = props.draggableTrack, reverse = props.reverse, vertical = props.vertical, _props$included = props.included, included = _props$included === void 0 ? true : _props$included, startPoint = props.startPoint, trackStyle = props.trackStyle, handleStyle = props.handleStyle, railStyle = props.railStyle, dotStyle = props.dotStyle, activeDotStyle = props.activeDotStyle, marks = props.marks, dots = props.dots, handleRender = props.handleRender, _props$tabIndex = props.tabIndex, tabIndex = _props$tabIndex === void 0 ? 0 : _props$tabIndex, ariaLabelForHandle = props.ariaLabelForHandle, ariaLabelledByForHandle = props.ariaLabelledByForHandle, ariaValueTextFormatterForHandle = props.ariaValueTextFormatterForHandle;
var handlesRef = React__namespace.useRef();
var containerRef = React__namespace.useRef();
var direction = React__namespace.useMemo(function() {
if (vertical) {
return reverse ? "ttb" : "btt";
}
return reverse ? "rtl" : "ltr";
}, [reverse, vertical]);
var mergedMin = React__namespace.useMemo(function() {
return isFinite(min) ? min : 0;
}, [min]);
var mergedMax = React__namespace.useMemo(function() {
return isFinite(max) ? max : 100;
}, [max]);
var mergedStep = React__namespace.useMemo(function() {
return step2 !== null && step2 <= 0 ? 1 : step2;
}, [step2]);
var mergedPush = React__namespace.useMemo(function() {
if (pushable === true) {
return mergedStep;
}
return pushable >= 0 ? pushable : false;
}, [pushable, mergedStep]);
var markList = React__namespace.useMemo(function() {
var keys2 = Object.keys(marks || {});
return keys2.map(function(key2) {
var mark = marks[key2];
var markObj = {
value: Number(key2)
};
if (mark && _typeof$q(mark) === "object" && !/* @__PURE__ */ React__namespace.isValidElement(mark) && ("label" in mark || "style" in mark)) {
markObj.style = mark.style;
markObj.label = mark.label;
} else {
markObj.label = mark;
}
return markObj;
}).filter(function(_ref) {
var label = _ref.label;
return label || typeof label === "number";
}).sort(function(a, b2) {
return a.value - b2.value;
});
}, [marks]);
var _useOffset = useOffset(mergedMin, mergedMax, mergedStep, markList, allowCross, mergedPush), _useOffset2 = _slicedToArray$e(_useOffset, 2), formatValue2 = _useOffset2[0], offsetValues = _useOffset2[1];
var _useMergedState = useMergedState(defaultValue, {
value
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), mergedValue = _useMergedState2[0], setValue2 = _useMergedState2[1];
var rawValues = React__namespace.useMemo(function() {
var valueList = mergedValue === null || mergedValue === void 0 ? [] : Array.isArray(mergedValue) ? mergedValue : [mergedValue];
var _valueList = _slicedToArray$e(valueList, 1), _valueList$ = _valueList[0], val0 = _valueList$ === void 0 ? mergedMin : _valueList$;
var returnValues = mergedValue === null ? [] : [val0];
if (range2) {
returnValues = _toConsumableArray$c(valueList);
if (count || mergedValue === void 0) {
var pointCount = count >= 0 ? count + 1 : 2;
returnValues = returnValues.slice(0, pointCount);
while (returnValues.length < pointCount) {
var _returnValues;
returnValues.push((_returnValues = returnValues[returnValues.length - 1]) !== null && _returnValues !== void 0 ? _returnValues : mergedMin);
}
}
returnValues.sort(function(a, b2) {
return a - b2;
});
}
returnValues.forEach(function(val, index2) {
returnValues[index2] = formatValue2(val);
});
return returnValues;
}, [mergedValue, range2, mergedMin, count, formatValue2]);
var rawValuesRef = React__namespace.useRef(rawValues);
rawValuesRef.current = rawValues;
var getTriggerValue = function getTriggerValue2(triggerValues) {
return range2 ? triggerValues : triggerValues[0];
};
var triggerChange = function triggerChange2(nextValues) {
var cloneNextValues = _toConsumableArray$c(nextValues).sort(function(a, b2) {
return a - b2;
});
if (onChange && !shallowequal(cloneNextValues, rawValuesRef.current)) {
onChange(getTriggerValue(cloneNextValues));
}
setValue2(cloneNextValues);
};
var changeToCloseValue = function changeToCloseValue2(newValue) {
if (!disabled) {
var valueIndex = 0;
var valueDist = mergedMax - mergedMin;
rawValues.forEach(function(val, index2) {
var dist = Math.abs(newValue - val);
if (dist <= valueDist) {
valueDist = dist;
valueIndex = index2;
}
});
var cloneNextValues = _toConsumableArray$c(rawValues);
cloneNextValues[valueIndex] = newValue;
if (range2 && !rawValues.length && count === void 0) {
cloneNextValues.push(newValue);
}
onBeforeChange === null || onBeforeChange === void 0 ? void 0 : onBeforeChange(getTriggerValue(cloneNextValues));
triggerChange(cloneNextValues);
onAfterChange === null || onAfterChange === void 0 ? void 0 : onAfterChange(getTriggerValue(cloneNextValues));
}
};
var onSliderMouseDown = function onSliderMouseDown2(e2) {
e2.preventDefault();
var _containerRef$current = containerRef.current.getBoundingClientRect(), width = _containerRef$current.width, height = _containerRef$current.height, left = _containerRef$current.left, top = _containerRef$current.top, bottom = _containerRef$current.bottom, right = _containerRef$current.right;
var clientX = e2.clientX, clientY = e2.clientY;
var percent;
switch (direction) {
case "btt":
percent = (bottom - clientY) / height;
break;
case "ttb":
percent = (clientY - top) / height;
break;
case "rtl":
percent = (right - clientX) / width;
break;
default:
percent = (clientX - left) / width;
}
var nextValue = mergedMin + percent * (mergedMax - mergedMin);
changeToCloseValue(formatValue2(nextValue));
};
var _React$useState = React__namespace.useState(null), _React$useState2 = _slicedToArray$e(_React$useState, 2), keyboardValue = _React$useState2[0], setKeyboardValue = _React$useState2[1];
var onHandleOffsetChange = function onHandleOffsetChange2(offset2, valueIndex) {
if (!disabled) {
var next = offsetValues(rawValues, offset2, valueIndex);
onBeforeChange === null || onBeforeChange === void 0 ? void 0 : onBeforeChange(getTriggerValue(rawValues));
triggerChange(next.values);
onAfterChange === null || onAfterChange === void 0 ? void 0 : onAfterChange(getTriggerValue(next.values));
setKeyboardValue(next.value);
}
};
React__namespace.useEffect(function() {
if (keyboardValue !== null) {
var valueIndex = rawValues.indexOf(keyboardValue);
if (valueIndex >= 0) {
handlesRef.current.focus(valueIndex);
}
}
setKeyboardValue(null);
}, [keyboardValue]);
var mergedDraggableTrack = React__namespace.useMemo(function() {
if (draggableTrack && mergedStep === null) {
return false;
}
return draggableTrack;
}, [draggableTrack, mergedStep]);
var finishChange = function finishChange2() {
onAfterChange === null || onAfterChange === void 0 ? void 0 : onAfterChange(getTriggerValue(rawValuesRef.current));
};
var _useDrag = useDrag(containerRef, direction, rawValues, mergedMin, mergedMax, formatValue2, triggerChange, finishChange, offsetValues), _useDrag2 = _slicedToArray$e(_useDrag, 4), draggingIndex = _useDrag2[0], draggingValue = _useDrag2[1], cacheValues = _useDrag2[2], onStartDrag = _useDrag2[3];
var onStartMove = function onStartMove2(e2, valueIndex) {
onStartDrag(e2, valueIndex);
onBeforeChange === null || onBeforeChange === void 0 ? void 0 : onBeforeChange(getTriggerValue(rawValuesRef.current));
};
var dragging = draggingIndex !== -1;
React__namespace.useEffect(function() {
if (!dragging) {
var valueIndex = rawValues.lastIndexOf(draggingValue);
handlesRef.current.focus(valueIndex);
}
}, [dragging]);
var sortedCacheValues = React__namespace.useMemo(function() {
return _toConsumableArray$c(cacheValues).sort(function(a, b2) {
return a - b2;
});
}, [cacheValues]);
var _React$useMemo = React__namespace.useMemo(function() {
if (!range2) {
return [mergedMin, sortedCacheValues[0]];
}
return [sortedCacheValues[0], sortedCacheValues[sortedCacheValues.length - 1]];
}, [sortedCacheValues, range2, mergedMin]), _React$useMemo2 = _slicedToArray$e(_React$useMemo, 2), includedStart = _React$useMemo2[0], includedEnd = _React$useMemo2[1];
React__namespace.useImperativeHandle(ref, function() {
return {
focus: function focus() {
handlesRef.current.focus(0);
},
blur: function blur() {
var _document = document, activeElement = _document.activeElement;
if (containerRef.current.contains(activeElement)) {
activeElement === null || activeElement === void 0 ? void 0 : activeElement.blur();
}
}
};
});
React__namespace.useEffect(function() {
if (autoFocus) {
handlesRef.current.focus(0);
}
}, []);
var context2 = React__namespace.useMemo(function() {
return {
min: mergedMin,
max: mergedMax,
direction,
disabled,
step: mergedStep,
included,
includedStart,
includedEnd,
range: range2,
tabIndex,
ariaLabelForHandle,
ariaLabelledByForHandle,
ariaValueTextFormatterForHandle
};
}, [mergedMin, mergedMax, direction, disabled, mergedStep, included, includedStart, includedEnd, range2, tabIndex, ariaLabelForHandle, ariaLabelledByForHandle, ariaValueTextFormatterForHandle]);
return /* @__PURE__ */ jsx(SliderContext.Provider, {
value: context2,
children: /* @__PURE__ */ jsxs("div", {
ref: containerRef,
className: classnames(prefixCls, className, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-disabled"), disabled), _defineProperty$b(_classNames, "".concat(prefixCls, "-vertical"), vertical), _defineProperty$b(_classNames, "".concat(prefixCls, "-horizontal"), !vertical), _defineProperty$b(_classNames, "".concat(prefixCls, "-with-marks"), markList.length), _classNames)),
style: style2,
onMouseDown: onSliderMouseDown,
children: [/* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-rail"),
style: railStyle
}), /* @__PURE__ */ jsx(Tracks, {
prefixCls,
style: trackStyle,
values: sortedCacheValues,
startPoint,
onStartMove: mergedDraggableTrack ? onStartMove : null
}), /* @__PURE__ */ jsx(Steps, {
prefixCls,
marks: markList,
dots,
style: dotStyle,
activeStyle: activeDotStyle
}), /* @__PURE__ */ jsx(Handles, {
ref: handlesRef,
prefixCls,
style: handleStyle,
values: cacheValues,
draggingIndex,
onStartMove,
onOffsetChange: onHandleOffsetChange,
onFocus,
onBlur,
handleRender
}), /* @__PURE__ */ jsx(Marks, {
prefixCls,
marks: markList,
onClick: changeToCloseValue
})]
})
});
});
var SliderTooltip = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var open = props.open;
var innerRef = React$a.useRef(null);
var rafRef = React$a.useRef(null);
function cancelKeepAlign() {
wrapperRaf$1.cancel(rafRef.current);
rafRef.current = null;
}
function keepAlign() {
rafRef.current = wrapperRaf$1(function() {
var _a;
(_a = innerRef.current) === null || _a === void 0 ? void 0 : _a.forcePopupAlign();
rafRef.current = null;
});
}
React__namespace.useEffect(function() {
if (open) {
keepAlign();
} else {
cancelKeepAlign();
}
return cancelKeepAlign;
}, [open, props.title]);
return /* @__PURE__ */ jsx(_Tooltip, {
ref: composeRef(innerRef, ref),
...props
});
});
const SliderTooltip$1 = SliderTooltip;
var __rest$6 = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var Slider$1 = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction, getPopupContainer = _React$useContext.getPopupContainer;
var _React$useState = React__namespace.useState({}), _React$useState2 = _slicedToArray$e(_React$useState, 2), opens = _React$useState2[0], setOpens = _React$useState2[1];
var toggleTooltipOpen = function toggleTooltipOpen2(index2, open) {
setOpens(function(prev) {
return _extends$3(_extends$3({}, prev), _defineProperty$b({}, index2, open));
});
};
var getTooltipPlacement = function getTooltipPlacement2(tooltipPlacement, vertical) {
if (tooltipPlacement) {
return tooltipPlacement;
}
if (!vertical) {
return "top";
}
return direction === "rtl" ? "left" : "right";
};
var customizePrefixCls = props.prefixCls, range2 = props.range, className = props.className, restProps = __rest$6(props, ["prefixCls", "range", "className"]);
var prefixCls = getPrefixCls("slider", customizePrefixCls);
var cls = classnames(className, _defineProperty$b({}, "".concat(prefixCls, "-rtl"), direction === "rtl"));
if (direction === "rtl" && !restProps.vertical) {
restProps.reverse = !restProps.reverse;
}
var _React$useMemo = React__namespace.useMemo(function() {
if (!range2) {
return [false];
}
return _typeof$q(range2) === "object" ? [true, range2.draggableTrack] : [true, false];
}, [range2]), _React$useMemo2 = _slicedToArray$e(_React$useMemo, 2), mergedRange = _React$useMemo2[0], draggableTrack = _React$useMemo2[1];
var handleRender = function handleRender2(node, info) {
var _a;
var index2 = info.index, dragging = info.dragging;
var rootPrefixCls = getPrefixCls();
var _props$tooltip = props.tooltip, tooltip = _props$tooltip === void 0 ? {} : _props$tooltip, vertical = props.vertical;
var tooltipProps = _extends$3({
formatter: (_a = props.tipFormatter) !== null && _a !== void 0 ? _a : function(value) {
return typeof value === "number" ? value.toString() : "";
},
open: props.tooltipVisible,
placement: props.tooltipPlacement,
getPopupContainer: props.getTooltipPopupContainer
}, tooltip);
var tooltipOpen = tooltipProps.open, tooltipPlacement = tooltipProps.placement, getTooltipPopupContainer = tooltipProps.getPopupContainer, customizeTooltipPrefixCls = tooltipProps.prefixCls, tipFormatter = tooltipProps.formatter;
var isTipFormatter = tipFormatter ? opens[index2] || dragging : false;
var open = tooltipOpen || tooltipOpen === void 0 && isTipFormatter;
var passedProps = _extends$3(_extends$3({}, node.props), {
onMouseEnter: function onMouseEnter() {
return toggleTooltipOpen(index2, true);
},
onMouseLeave: function onMouseLeave() {
return toggleTooltipOpen(index2, false);
}
});
var tooltipPrefixCls = getPrefixCls("tooltip", customizeTooltipPrefixCls);
return /* @__PURE__ */ jsx(SliderTooltip$1, {
prefixCls: tooltipPrefixCls,
title: tipFormatter ? tipFormatter(info.value) : "",
open,
placement: getTooltipPlacement(tooltipPlacement, vertical),
transitionName: "".concat(rootPrefixCls, "-zoom-down"),
overlayClassName: "".concat(prefixCls, "-tooltip"),
getPopupContainer: getTooltipPopupContainer || getPopupContainer,
children: /* @__PURE__ */ React__namespace.cloneElement(node, passedProps)
}, index2);
};
return /* @__PURE__ */ jsx(Slider$2, {
...restProps,
step: restProps.step,
range: mergedRange,
draggableTrack,
className: cls,
ref,
prefixCls,
handleRender
});
});
const _Slider = Slider$1;
var Switch$2 = React__namespace.forwardRef(function(_ref, ref) {
var _classNames;
var _ref$prefixCls = _ref.prefixCls, prefixCls = _ref$prefixCls === void 0 ? "rc-switch" : _ref$prefixCls, className = _ref.className, checked = _ref.checked, defaultChecked = _ref.defaultChecked, disabled = _ref.disabled, loadingIcon = _ref.loadingIcon, checkedChildren = _ref.checkedChildren, unCheckedChildren = _ref.unCheckedChildren, onClick = _ref.onClick, onChange = _ref.onChange, onKeyDown2 = _ref.onKeyDown, restProps = _objectWithoutProperties$1(_ref, ["prefixCls", "className", "checked", "defaultChecked", "disabled", "loadingIcon", "checkedChildren", "unCheckedChildren", "onClick", "onChange", "onKeyDown"]);
var _useMergedState = useMergedState(false, {
value: checked,
defaultValue: defaultChecked
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), innerChecked = _useMergedState2[0], setInnerChecked = _useMergedState2[1];
function triggerChange(newChecked, event) {
var mergedChecked = innerChecked;
if (!disabled) {
mergedChecked = newChecked;
setInnerChecked(mergedChecked);
onChange === null || onChange === void 0 ? void 0 : onChange(mergedChecked, event);
}
return mergedChecked;
}
function onInternalKeyDown(e2) {
if (e2.which === KeyCode.LEFT) {
triggerChange(false, e2);
} else if (e2.which === KeyCode.RIGHT) {
triggerChange(true, e2);
}
onKeyDown2 === null || onKeyDown2 === void 0 ? void 0 : onKeyDown2(e2);
}
function onInternalClick(e2) {
var ret = triggerChange(!innerChecked, e2);
onClick === null || onClick === void 0 ? void 0 : onClick(ret, e2);
}
var switchClassName = classnames(prefixCls, className, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-checked"), innerChecked), _defineProperty$b(_classNames, "".concat(prefixCls, "-disabled"), disabled), _classNames));
return /* @__PURE__ */ jsxs("button", {
...Object.assign({}, restProps, {
type: "button",
role: "switch",
"aria-checked": innerChecked,
disabled,
className: switchClassName,
ref,
onKeyDown: onInternalKeyDown,
onClick: onInternalClick
}),
children: [loadingIcon, /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-inner"),
children: innerChecked ? checkedChildren : unCheckedChildren
})]
});
});
Switch$2.displayName = "Switch";
var __rest$5 = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var Switch$1 = /* @__PURE__ */ React__namespace.forwardRef(function(_a, ref) {
var _classNames;
var customizePrefixCls = _a.prefixCls, customizeSize = _a.size, customDisabled = _a.disabled, loading = _a.loading, _a$className = _a.className, className = _a$className === void 0 ? "" : _a$className, props = __rest$5(_a, ["prefixCls", "size", "disabled", "loading", "className"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var size = React__namespace.useContext(SizeContext$1);
var disabled = React__namespace.useContext(DisabledContext$1);
var mergedDisabled = (customDisabled !== null && customDisabled !== void 0 ? customDisabled : disabled) || loading;
var prefixCls = getPrefixCls("switch", customizePrefixCls);
var loadingIcon = /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-handle"),
children: loading && /* @__PURE__ */ jsx(LoadingOutlined$1, {
className: "".concat(prefixCls, "-loading-icon")
})
});
var classes = classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-small"), (customizeSize || size) === "small"), _defineProperty$b(_classNames, "".concat(prefixCls, "-loading"), loading), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames), className);
return /* @__PURE__ */ jsx(Wave$1, {
insertExtraNode: true,
children: /* @__PURE__ */ jsx(Switch$2, {
...props,
prefixCls,
className: classes,
disabled: mergedDisabled,
ref,
loadingIcon
})
});
});
Switch$1.__ANT_SWITCH = true;
const _Switch = Switch$1;
function ColumnGroup$1(_) {
return null;
}
function Column$1(_) {
return null;
}
var INTERNAL_KEY_PREFIX = "RC_TABLE_KEY";
function toArray$2(arr) {
if (arr === void 0 || arr === null) {
return [];
}
return Array.isArray(arr) ? arr : [arr];
}
function getPathValue(record, path2) {
if (!path2 && typeof path2 !== "number") {
return record;
}
var pathList = toArray$2(path2);
var current = record;
for (var i2 = 0; i2 < pathList.length; i2 += 1) {
if (!current) {
return null;
}
var prop = pathList[i2];
current = current[prop];
}
return current;
}
function getColumnsKey(columns) {
var columnKeys = [];
var keys2 = {};
columns.forEach(function(column) {
var _ref = column || {}, key2 = _ref.key, dataIndex = _ref.dataIndex;
var mergedKey = key2 || toArray$2(dataIndex).join("-") || INTERNAL_KEY_PREFIX;
while (keys2[mergedKey]) {
mergedKey = "".concat(mergedKey, "_next");
}
keys2[mergedKey] = true;
columnKeys.push(mergedKey);
});
return columnKeys;
}
function validateValue(val) {
return val !== null && val !== void 0;
}
var StickyContext = /* @__PURE__ */ React__namespace.createContext(false);
function createContext() {
var Context2 = /* @__PURE__ */ React__namespace.createContext(null);
var Provider2 = function Provider3(_ref) {
var value = _ref.value, children = _ref.children;
var valueRef = React__namespace.useRef(value);
valueRef.current = value;
var _React$useState = React__namespace.useState(function() {
return {
getValue: function getValue2() {
return valueRef.current;
},
listeners: /* @__PURE__ */ new Set()
};
}), _React$useState2 = _slicedToArray$e(_React$useState, 1), context2 = _React$useState2[0];
useLayoutEffect$1(function() {
context2.listeners.forEach(function(listener) {
listener(value);
});
}, [value]);
return /* @__PURE__ */ jsx(Context2.Provider, {
value: context2,
children
});
};
return {
Context: Context2,
Provider: Provider2
};
}
function useContextSelector(holder, selector) {
var eventSelector = useEvent(selector);
var context2 = React__namespace.useContext(holder === null || holder === void 0 ? void 0 : holder.Context);
var _ref2 = context2 || {}, listeners = _ref2.listeners, getValue2 = _ref2.getValue;
var _React$useState3 = React__namespace.useState(function() {
return eventSelector(context2 ? getValue2() : null);
}), _React$useState4 = _slicedToArray$e(_React$useState3, 2), value = _React$useState4[0], setValue2 = _React$useState4[1];
useLayoutEffect$1(function() {
if (!context2) {
return;
}
function trigger(nextValue) {
setValue2(function(prev) {
var selectedValue = eventSelector(nextValue);
return shallowequal(prev, selectedValue) ? prev : selectedValue;
});
}
listeners.add(trigger);
return function() {
listeners.delete(trigger);
};
}, [context2]);
return value;
}
var HoverContext = createContext();
var BodyContext = /* @__PURE__ */ React__namespace.createContext(null);
var PerfContext = /* @__PURE__ */ React__namespace.createContext({
renderWithProps: false
});
var _excluded$c = ["colSpan", "rowSpan", "style", "className"];
function inHoverRange(cellStartRow, cellRowSpan, startRow, endRow) {
var cellEndRow = cellStartRow + cellRowSpan - 1;
return cellStartRow <= endRow && cellEndRow >= startRow;
}
function isRenderCell(data) {
return data && _typeof$q(data) === "object" && !Array.isArray(data) && !/* @__PURE__ */ React__namespace.isValidElement(data);
}
function isRefComponent(component) {
if (typeof component === "string") {
return true;
}
return supportRef(component);
}
var getTitleFromCellRenderChildren = function getTitleFromCellRenderChildren2(_ref) {
var ellipsis = _ref.ellipsis, rowType = _ref.rowType, children = _ref.children;
var title;
var ellipsisConfig = ellipsis === true ? {
showTitle: true
} : ellipsis;
if (ellipsisConfig && (ellipsisConfig.showTitle || rowType === "header")) {
if (typeof children === "string" || typeof children === "number") {
title = children.toString();
} else if (/* @__PURE__ */ React__namespace.isValidElement(children) && typeof children.props.children === "string") {
title = children.props.children;
}
}
return title;
};
function Cell(_ref2, ref) {
var _ref4, _ref5, _classNames;
var prefixCls = _ref2.prefixCls, className = _ref2.className, record = _ref2.record, index2 = _ref2.index, renderIndex = _ref2.renderIndex, dataIndex = _ref2.dataIndex, render2 = _ref2.render, children = _ref2.children, _ref2$component = _ref2.component, Component = _ref2$component === void 0 ? "td" : _ref2$component, colSpan = _ref2.colSpan, rowSpan = _ref2.rowSpan, fixLeft = _ref2.fixLeft, fixRight = _ref2.fixRight, firstFixLeft = _ref2.firstFixLeft, lastFixLeft = _ref2.lastFixLeft, firstFixRight = _ref2.firstFixRight, lastFixRight = _ref2.lastFixRight, appendNode = _ref2.appendNode, _ref2$additionalProps = _ref2.additionalProps, additionalProps = _ref2$additionalProps === void 0 ? {} : _ref2$additionalProps, ellipsis = _ref2.ellipsis, align = _ref2.align, rowType = _ref2.rowType, isSticky = _ref2.isSticky, hovering = _ref2.hovering, onHover = _ref2.onHover;
var cellPrefixCls = "".concat(prefixCls, "-cell");
var perfRecord = React__namespace.useContext(PerfContext);
var supportSticky = React__namespace.useContext(StickyContext);
var _React$useContext = React__namespace.useContext(BodyContext), allColumnsFixedLeft = _React$useContext.allColumnsFixedLeft;
var _React$useMemo = React__namespace.useMemo(function() {
if (validateValue(children)) {
return [children];
}
var value = getPathValue(record, dataIndex);
var returnChildNode = value;
var returnCellProps = void 0;
if (render2) {
var renderData = render2(value, record, renderIndex);
if (isRenderCell(renderData)) {
returnChildNode = renderData.children;
returnCellProps = renderData.props;
perfRecord.renderWithProps = true;
} else {
returnChildNode = renderData;
}
}
return [returnChildNode, returnCellProps];
}, [
perfRecord.renderWithProps ? Math.random() : 0,
children,
dataIndex,
perfRecord,
record,
render2,
renderIndex
]), _React$useMemo2 = _slicedToArray$e(_React$useMemo, 2), childNode = _React$useMemo2[0], legacyCellProps = _React$useMemo2[1];
var mergedChildNode = childNode;
if (_typeof$q(mergedChildNode) === "object" && !Array.isArray(mergedChildNode) && !/* @__PURE__ */ React__namespace.isValidElement(mergedChildNode)) {
mergedChildNode = null;
}
if (ellipsis && (lastFixLeft || firstFixRight)) {
mergedChildNode = /* @__PURE__ */ jsx("span", {
className: "".concat(cellPrefixCls, "-content"),
children: mergedChildNode
});
}
var _ref3 = legacyCellProps || {}, cellColSpan = _ref3.colSpan, cellRowSpan = _ref3.rowSpan, cellStyle = _ref3.style, cellClassName = _ref3.className, restCellProps = _objectWithoutProperties$1(_ref3, _excluded$c);
var mergedColSpan = (_ref4 = cellColSpan !== void 0 ? cellColSpan : colSpan) !== null && _ref4 !== void 0 ? _ref4 : 1;
var mergedRowSpan = (_ref5 = cellRowSpan !== void 0 ? cellRowSpan : rowSpan) !== null && _ref5 !== void 0 ? _ref5 : 1;
if (mergedColSpan === 0 || mergedRowSpan === 0) {
return null;
}
var fixedStyle = {};
var isFixLeft = typeof fixLeft === "number" && supportSticky;
var isFixRight = typeof fixRight === "number" && supportSticky;
if (isFixLeft) {
fixedStyle.position = "sticky";
fixedStyle.left = fixLeft;
}
if (isFixRight) {
fixedStyle.position = "sticky";
fixedStyle.right = fixRight;
}
var alignStyle = {};
if (align) {
alignStyle.textAlign = align;
}
var onMouseEnter = function onMouseEnter2(event) {
var _additionalProps$onMo;
if (record) {
onHover(index2, index2 + mergedRowSpan - 1);
}
additionalProps === null || additionalProps === void 0 ? void 0 : (_additionalProps$onMo = additionalProps.onMouseEnter) === null || _additionalProps$onMo === void 0 ? void 0 : _additionalProps$onMo.call(additionalProps, event);
};
var onMouseLeave = function onMouseLeave2(event) {
var _additionalProps$onMo2;
if (record) {
onHover(-1, -1);
}
additionalProps === null || additionalProps === void 0 ? void 0 : (_additionalProps$onMo2 = additionalProps.onMouseLeave) === null || _additionalProps$onMo2 === void 0 ? void 0 : _additionalProps$onMo2.call(additionalProps, event);
};
var title = getTitleFromCellRenderChildren({
rowType,
ellipsis,
children: childNode
});
var componentProps = _objectSpread2$a(_objectSpread2$a(_objectSpread2$a({
title
}, restCellProps), additionalProps), {}, {
colSpan: mergedColSpan !== 1 ? mergedColSpan : null,
rowSpan: mergedRowSpan !== 1 ? mergedRowSpan : null,
className: classnames(cellPrefixCls, className, (_classNames = {}, _defineProperty$b(_classNames, "".concat(cellPrefixCls, "-fix-left"), isFixLeft && supportSticky), _defineProperty$b(_classNames, "".concat(cellPrefixCls, "-fix-left-first"), firstFixLeft && supportSticky), _defineProperty$b(_classNames, "".concat(cellPrefixCls, "-fix-left-last"), lastFixLeft && supportSticky), _defineProperty$b(_classNames, "".concat(cellPrefixCls, "-fix-left-all"), lastFixLeft && allColumnsFixedLeft && supportSticky), _defineProperty$b(_classNames, "".concat(cellPrefixCls, "-fix-right"), isFixRight && supportSticky), _defineProperty$b(_classNames, "".concat(cellPrefixCls, "-fix-right-first"), firstFixRight && supportSticky), _defineProperty$b(_classNames, "".concat(cellPrefixCls, "-fix-right-last"), lastFixRight && supportSticky), _defineProperty$b(_classNames, "".concat(cellPrefixCls, "-ellipsis"), ellipsis), _defineProperty$b(_classNames, "".concat(cellPrefixCls, "-with-append"), appendNode), _defineProperty$b(_classNames, "".concat(cellPrefixCls, "-fix-sticky"), (isFixLeft || isFixRight) && isSticky && supportSticky), _defineProperty$b(_classNames, "".concat(cellPrefixCls, "-row-hover"), !legacyCellProps && hovering), _classNames), additionalProps.className, cellClassName),
style: _objectSpread2$a(_objectSpread2$a(_objectSpread2$a(_objectSpread2$a({}, additionalProps.style), alignStyle), fixedStyle), cellStyle),
onMouseEnter,
onMouseLeave,
ref: isRefComponent(Component) ? ref : null
});
return /* @__PURE__ */ jsxs(Component, {
...componentProps,
children: [appendNode, mergedChildNode]
});
}
var RefCell = /* @__PURE__ */ React__namespace.forwardRef(Cell);
RefCell.displayName = "Cell";
var comparePropList = ["expanded", "className", "hovering"];
var MemoCell = /* @__PURE__ */ React__namespace.memo(RefCell, function(prev, next) {
if (next.shouldCellUpdate) {
return comparePropList.every(function(propName) {
return prev[propName] === next[propName];
}) && !next.shouldCellUpdate(next.record, prev.record);
}
return shallowequal(prev, next);
});
var WrappedCell = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var index2 = props.index, _props$additionalProp = props.additionalProps, additionalProps = _props$additionalProp === void 0 ? {} : _props$additionalProp, colSpan = props.colSpan, rowSpan = props.rowSpan;
var cellColSpan = additionalProps.colSpan, cellRowSpan = additionalProps.rowSpan;
var mergedColSpan = colSpan !== null && colSpan !== void 0 ? colSpan : cellColSpan;
var mergedRowSpan = rowSpan !== null && rowSpan !== void 0 ? rowSpan : cellRowSpan;
var _useContextSelector = useContextSelector(HoverContext, function(cxt) {
var isHovering = inHoverRange(index2, mergedRowSpan || 1, cxt === null || cxt === void 0 ? void 0 : cxt.startRow, cxt === null || cxt === void 0 ? void 0 : cxt.endRow);
return {
onHover: cxt === null || cxt === void 0 ? void 0 : cxt.onHover,
hovering: isHovering
};
}), onHover = _useContextSelector.onHover, hovering = _useContextSelector.hovering;
return /* @__PURE__ */ jsx(MemoCell, {
...props,
colSpan: mergedColSpan,
rowSpan: mergedRowSpan,
hovering,
ref,
onHover
});
});
WrappedCell.displayName = "WrappedCell";
var TableContext = /* @__PURE__ */ React__namespace.createContext(null);
function getCellFixedInfo(colStart, colEnd, columns, stickyOffsets, direction) {
var startColumn = columns[colStart] || {};
var endColumn = columns[colEnd] || {};
var fixLeft;
var fixRight;
if (startColumn.fixed === "left") {
fixLeft = stickyOffsets.left[colStart];
} else if (endColumn.fixed === "right") {
fixRight = stickyOffsets.right[colEnd];
}
var lastFixLeft = false;
var firstFixRight = false;
var lastFixRight = false;
var firstFixLeft = false;
var nextColumn = columns[colEnd + 1];
var prevColumn = columns[colStart - 1];
if (direction === "rtl") {
if (fixLeft !== void 0) {
var prevFixLeft = prevColumn && prevColumn.fixed === "left";
firstFixLeft = !prevFixLeft;
} else if (fixRight !== void 0) {
var nextFixRight = nextColumn && nextColumn.fixed === "right";
lastFixRight = !nextFixRight;
}
} else if (fixLeft !== void 0) {
var nextFixLeft = nextColumn && nextColumn.fixed === "left";
lastFixLeft = !nextFixLeft;
} else if (fixRight !== void 0) {
var prevFixRight = prevColumn && prevColumn.fixed === "right";
firstFixRight = !prevFixRight;
}
return {
fixLeft,
fixRight,
lastFixLeft,
firstFixRight,
lastFixRight,
firstFixLeft,
isSticky: stickyOffsets.isSticky
};
}
function HeaderRow(_ref) {
var cells = _ref.cells, stickyOffsets = _ref.stickyOffsets, flattenColumns = _ref.flattenColumns, RowComponent = _ref.rowComponent, CellComponent = _ref.cellComponent, onHeaderRow = _ref.onHeaderRow, index2 = _ref.index;
var _React$useContext = React__namespace.useContext(TableContext), prefixCls = _React$useContext.prefixCls, direction = _React$useContext.direction;
var rowProps;
if (onHeaderRow) {
rowProps = onHeaderRow(cells.map(function(cell) {
return cell.column;
}), index2);
}
var columnsKey = getColumnsKey(cells.map(function(cell) {
return cell.column;
}));
return /* @__PURE__ */ jsx(RowComponent, {
...rowProps,
children: cells.map(function(cell, cellIndex) {
var column = cell.column;
var fixedInfo = getCellFixedInfo(cell.colStart, cell.colEnd, flattenColumns, stickyOffsets, direction);
var additionalProps;
if (column && column.onHeaderCell) {
additionalProps = cell.column.onHeaderCell(column);
}
return /* @__PURE__ */ React$a.createElement(WrappedCell, {
...cell,
ellipsis: column.ellipsis,
align: column.align,
component: CellComponent,
prefixCls,
key: columnsKey[cellIndex],
...fixedInfo,
additionalProps,
rowType: "header"
});
})
});
}
HeaderRow.displayName = "HeaderRow";
function parseHeaderRows(rootColumns) {
var rows = [];
function fillRowCells(columns, colIndex) {
var rowIndex2 = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 0;
rows[rowIndex2] = rows[rowIndex2] || [];
var currentColIndex = colIndex;
var colSpans = columns.filter(Boolean).map(function(column) {
var cell = {
key: column.key,
className: column.className || "",
children: column.title,
column,
colStart: currentColIndex
};
var colSpan = 1;
var subColumns = column.children;
if (subColumns && subColumns.length > 0) {
colSpan = fillRowCells(subColumns, currentColIndex, rowIndex2 + 1).reduce(function(total, count) {
return total + count;
}, 0);
cell.hasSubColumns = true;
}
if ("colSpan" in column) {
colSpan = column.colSpan;
}
if ("rowSpan" in column) {
cell.rowSpan = column.rowSpan;
}
cell.colSpan = colSpan;
cell.colEnd = cell.colStart + colSpan - 1;
rows[rowIndex2].push(cell);
currentColIndex += colSpan;
return colSpan;
});
return colSpans;
}
fillRowCells(rootColumns, 0);
var rowCount = rows.length;
var _loop = function _loop2(rowIndex2) {
rows[rowIndex2].forEach(function(cell) {
if (!("rowSpan" in cell) && !cell.hasSubColumns) {
cell.rowSpan = rowCount - rowIndex2;
}
});
};
for (var rowIndex = 0; rowIndex < rowCount; rowIndex += 1) {
_loop(rowIndex);
}
return rows;
}
function Header(_ref) {
var stickyOffsets = _ref.stickyOffsets, columns = _ref.columns, flattenColumns = _ref.flattenColumns, onHeaderRow = _ref.onHeaderRow;
var _React$useContext = React__namespace.useContext(TableContext), prefixCls = _React$useContext.prefixCls, getComponent = _React$useContext.getComponent;
var rows = React__namespace.useMemo(function() {
return parseHeaderRows(columns);
}, [columns]);
var WrapperComponent = getComponent(["header", "wrapper"], "thead");
var trComponent = getComponent(["header", "row"], "tr");
var thComponent = getComponent(["header", "cell"], "th");
return /* @__PURE__ */ jsx(WrapperComponent, {
className: "".concat(prefixCls, "-thead"),
children: rows.map(function(row, rowIndex) {
var rowNode = /* @__PURE__ */ jsx(HeaderRow, {
flattenColumns,
cells: row,
stickyOffsets,
rowComponent: trComponent,
cellComponent: thComponent,
onHeaderRow,
index: rowIndex
}, rowIndex);
return rowNode;
})
});
}
var ExpandedRowContext = /* @__PURE__ */ React__namespace.createContext(null);
function ExpandedRow(_ref) {
var prefixCls = _ref.prefixCls, children = _ref.children, Component = _ref.component, cellComponent = _ref.cellComponent, className = _ref.className, expanded = _ref.expanded, colSpan = _ref.colSpan, isEmpty = _ref.isEmpty;
var _React$useContext = React__namespace.useContext(TableContext), scrollbarSize = _React$useContext.scrollbarSize;
var _React$useContext2 = React__namespace.useContext(ExpandedRowContext), fixHeader = _React$useContext2.fixHeader, fixColumn = _React$useContext2.fixColumn, componentWidth = _React$useContext2.componentWidth, horizonScroll = _React$useContext2.horizonScroll;
return React__namespace.useMemo(function() {
var contentNode = children;
if (isEmpty ? horizonScroll : fixColumn) {
contentNode = /* @__PURE__ */ jsx("div", {
style: {
width: componentWidth - (fixHeader ? scrollbarSize : 0),
position: "sticky",
left: 0,
overflow: "hidden"
},
className: "".concat(prefixCls, "-expanded-row-fixed"),
children: componentWidth !== 0 && contentNode
});
}
return /* @__PURE__ */ jsx(Component, {
className,
style: {
display: expanded ? null : "none"
},
children: /* @__PURE__ */ jsx(WrappedCell, {
component: cellComponent,
prefixCls,
colSpan,
children: contentNode
})
});
}, [children, Component, className, expanded, colSpan, isEmpty, scrollbarSize, componentWidth, fixColumn, fixHeader, horizonScroll]);
}
var ResizeContext = /* @__PURE__ */ React__namespace.createContext(null);
function BodyRow(props) {
var className = props.className, style2 = props.style, record = props.record, index2 = props.index, renderIndex = props.renderIndex, rowKey = props.rowKey, rowExpandable = props.rowExpandable, expandedKeys = props.expandedKeys, onRow = props.onRow, _props$indent = props.indent, indent = _props$indent === void 0 ? 0 : _props$indent, RowComponent = props.rowComponent, cellComponent = props.cellComponent, childrenColumnName = props.childrenColumnName;
var _React$useContext = React__namespace.useContext(TableContext), prefixCls = _React$useContext.prefixCls, fixedInfoList = _React$useContext.fixedInfoList;
var _React$useContext2 = React__namespace.useContext(BodyContext), flattenColumns = _React$useContext2.flattenColumns, expandableType = _React$useContext2.expandableType, expandRowByClick = _React$useContext2.expandRowByClick, onTriggerExpand = _React$useContext2.onTriggerExpand, rowClassName = _React$useContext2.rowClassName, expandedRowClassName = _React$useContext2.expandedRowClassName, indentSize = _React$useContext2.indentSize, expandIcon = _React$useContext2.expandIcon, expandedRowRender = _React$useContext2.expandedRowRender, expandIconColumnIndex = _React$useContext2.expandIconColumnIndex;
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), expandRended = _React$useState2[0], setExpandRended = _React$useState2[1];
var expanded = expandedKeys && expandedKeys.has(props.recordKey);
React__namespace.useEffect(function() {
if (expanded) {
setExpandRended(true);
}
}, [expanded]);
var rowSupportExpand = expandableType === "row" && (!rowExpandable || rowExpandable(record));
var nestExpandable = expandableType === "nest";
var hasNestChildren = childrenColumnName && record && record[childrenColumnName];
var mergedExpandable = rowSupportExpand || nestExpandable;
var onExpandRef = React__namespace.useRef(onTriggerExpand);
onExpandRef.current = onTriggerExpand;
var onInternalTriggerExpand = function onInternalTriggerExpand2() {
onExpandRef.current.apply(onExpandRef, arguments);
};
var additionalProps = onRow === null || onRow === void 0 ? void 0 : onRow(record, index2);
var onClick = function onClick2(event) {
var _additionalProps$onCl;
if (expandRowByClick && mergedExpandable) {
onInternalTriggerExpand(record, event);
}
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
args[_key - 1] = arguments[_key];
}
additionalProps === null || additionalProps === void 0 ? void 0 : (_additionalProps$onCl = additionalProps.onClick) === null || _additionalProps$onCl === void 0 ? void 0 : _additionalProps$onCl.call.apply(_additionalProps$onCl, [additionalProps, event].concat(args));
};
var computeRowClassName;
if (typeof rowClassName === "string") {
computeRowClassName = rowClassName;
} else if (typeof rowClassName === "function") {
computeRowClassName = rowClassName(record, index2, indent);
}
var columnsKey = getColumnsKey(flattenColumns);
var baseRowNode = /* @__PURE__ */ jsx(RowComponent, {
...additionalProps,
"data-row-key": rowKey,
className: classnames(className, "".concat(prefixCls, "-row"), "".concat(prefixCls, "-row-level-").concat(indent), computeRowClassName, additionalProps && additionalProps.className),
style: _objectSpread2$a(_objectSpread2$a({}, style2), additionalProps ? additionalProps.style : null),
onClick,
children: flattenColumns.map(function(column, colIndex) {
var render2 = column.render, dataIndex = column.dataIndex, columnClassName = column.className;
var key2 = columnsKey[colIndex];
var fixedInfo = fixedInfoList[colIndex];
var appendCellNode;
if (colIndex === (expandIconColumnIndex || 0) && nestExpandable) {
appendCellNode = /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx("span", {
style: {
paddingLeft: "".concat(indentSize * indent, "px")
},
className: "".concat(prefixCls, "-row-indent indent-level-").concat(indent)
}), expandIcon({
prefixCls,
expanded,
expandable: hasNestChildren,
record,
onExpand: onInternalTriggerExpand
})]
});
}
var additionalCellProps;
if (column.onCell) {
additionalCellProps = column.onCell(record, index2);
}
return /* @__PURE__ */ jsx(WrappedCell, {
className: columnClassName,
ellipsis: column.ellipsis,
align: column.align,
component: cellComponent,
prefixCls,
record,
index: index2,
renderIndex,
dataIndex,
render: render2,
shouldCellUpdate: column.shouldCellUpdate,
expanded: appendCellNode && expanded,
...fixedInfo,
appendNode: appendCellNode,
additionalProps: additionalCellProps
}, key2);
})
});
var expandRowNode;
if (rowSupportExpand && (expandRended || expanded)) {
var expandContent = expandedRowRender(record, index2, indent + 1, expanded);
var computedExpandedRowClassName = expandedRowClassName && expandedRowClassName(record, index2, indent);
expandRowNode = /* @__PURE__ */ jsx(ExpandedRow, {
expanded,
className: classnames("".concat(prefixCls, "-expanded-row"), "".concat(prefixCls, "-expanded-row-level-").concat(indent + 1), computedExpandedRowClassName),
prefixCls,
component: RowComponent,
cellComponent,
colSpan: flattenColumns.length,
isEmpty: false,
children: expandContent
});
}
return /* @__PURE__ */ jsxs(Fragment, {
children: [baseRowNode, expandRowNode]
});
}
BodyRow.displayName = "BodyRow";
function flatRecord(record, indent, childrenColumnName, expandedKeys, getRowKey, index2) {
var arr = [];
arr.push({
record,
indent,
index: index2
});
var key2 = getRowKey(record);
var expanded = expandedKeys === null || expandedKeys === void 0 ? void 0 : expandedKeys.has(key2);
if (record && Array.isArray(record[childrenColumnName]) && expanded) {
for (var i2 = 0; i2 < record[childrenColumnName].length; i2 += 1) {
var tempArr = flatRecord(record[childrenColumnName][i2], indent + 1, childrenColumnName, expandedKeys, getRowKey, i2);
arr.push.apply(arr, _toConsumableArray$c(tempArr));
}
}
return arr;
}
function useFlattenRecords(data, childrenColumnName, expandedKeys, getRowKey) {
var arr = React__namespace.useMemo(function() {
if (expandedKeys === null || expandedKeys === void 0 ? void 0 : expandedKeys.size) {
var temp = [];
for (var i2 = 0; i2 < (data === null || data === void 0 ? void 0 : data.length); i2 += 1) {
var record = data[i2];
temp.push.apply(temp, _toConsumableArray$c(flatRecord(record, 0, childrenColumnName, expandedKeys, getRowKey, i2)));
}
return temp;
}
return data === null || data === void 0 ? void 0 : data.map(function(item, index2) {
return {
record: item,
indent: 0,
index: index2
};
});
}, [data, childrenColumnName, expandedKeys, getRowKey]);
return arr;
}
function MeasureCell(_ref) {
var columnKey = _ref.columnKey, onColumnResize = _ref.onColumnResize;
var cellRef = React__namespace.useRef();
React__namespace.useEffect(function() {
if (cellRef.current) {
onColumnResize(columnKey, cellRef.current.offsetWidth);
}
}, []);
return /* @__PURE__ */ jsx(RefResizeObserver, {
data: columnKey,
children: /* @__PURE__ */ jsx("td", {
ref: cellRef,
style: {
padding: 0,
border: 0,
height: 0
},
children: /* @__PURE__ */ jsx("div", {
style: {
height: 0,
overflow: "hidden"
},
children: "\xA0"
})
})
});
}
function MeasureRow(_ref) {
var prefixCls = _ref.prefixCls, columnsKey = _ref.columnsKey, onColumnResize = _ref.onColumnResize;
return /* @__PURE__ */ jsx("tr", {
"aria-hidden": "true",
className: "".concat(prefixCls, "-measure-row"),
style: {
height: 0,
fontSize: 0
},
children: /* @__PURE__ */ jsx(RefResizeObserver.Collection, {
onBatchResize: function onBatchResize(infoList) {
infoList.forEach(function(_ref2) {
var columnKey = _ref2.data, size = _ref2.size;
onColumnResize(columnKey, size.offsetWidth);
});
},
children: columnsKey.map(function(columnKey) {
return /* @__PURE__ */ jsx(MeasureCell, {
columnKey,
onColumnResize
}, columnKey);
})
})
});
}
function Body(_ref) {
var data = _ref.data, getRowKey = _ref.getRowKey, measureColumnWidth = _ref.measureColumnWidth, expandedKeys = _ref.expandedKeys, onRow = _ref.onRow, rowExpandable = _ref.rowExpandable, emptyNode = _ref.emptyNode, childrenColumnName = _ref.childrenColumnName;
var _React$useContext = React__namespace.useContext(ResizeContext), onColumnResize = _React$useContext.onColumnResize;
var _React$useContext2 = React__namespace.useContext(TableContext), prefixCls = _React$useContext2.prefixCls, getComponent = _React$useContext2.getComponent;
var _React$useContext3 = React__namespace.useContext(BodyContext), flattenColumns = _React$useContext3.flattenColumns;
var flattenData2 = useFlattenRecords(data, childrenColumnName, expandedKeys, getRowKey);
var perfRef = React__namespace.useRef({
renderWithProps: false
});
var _React$useState = React__namespace.useState(-1), _React$useState2 = _slicedToArray$e(_React$useState, 2), startRow = _React$useState2[0], setStartRow = _React$useState2[1];
var _React$useState3 = React__namespace.useState(-1), _React$useState4 = _slicedToArray$e(_React$useState3, 2), endRow = _React$useState4[0], setEndRow = _React$useState4[1];
var onHover = React__namespace.useCallback(function(start, end) {
setStartRow(start);
setEndRow(end);
}, []);
var bodyNode = React__namespace.useMemo(function() {
var WrapperComponent = getComponent(["body", "wrapper"], "tbody");
var trComponent = getComponent(["body", "row"], "tr");
var tdComponent = getComponent(["body", "cell"], "td");
var rows;
if (data.length) {
rows = flattenData2.map(function(item, idx) {
var record = item.record, indent = item.indent, renderIndex = item.index;
var key2 = getRowKey(record, idx);
return /* @__PURE__ */ jsx(BodyRow, {
rowKey: key2,
record,
recordKey: key2,
index: idx,
renderIndex,
rowComponent: trComponent,
cellComponent: tdComponent,
expandedKeys,
onRow,
getRowKey,
rowExpandable,
childrenColumnName,
indent
}, key2);
});
} else {
rows = /* @__PURE__ */ jsx(ExpandedRow, {
expanded: true,
className: "".concat(prefixCls, "-placeholder"),
prefixCls,
component: trComponent,
cellComponent: tdComponent,
colSpan: flattenColumns.length,
isEmpty: true,
children: emptyNode
});
}
var columnsKey = getColumnsKey(flattenColumns);
return /* @__PURE__ */ jsxs(WrapperComponent, {
className: "".concat(prefixCls, "-tbody"),
children: [measureColumnWidth && /* @__PURE__ */ jsx(MeasureRow, {
prefixCls,
columnsKey,
onColumnResize
}), rows]
});
}, [data, prefixCls, onRow, measureColumnWidth, expandedKeys, getRowKey, getComponent, emptyNode, flattenColumns, childrenColumnName, onColumnResize, rowExpandable, flattenData2]);
return /* @__PURE__ */ jsx(PerfContext.Provider, {
value: perfRef.current,
children: /* @__PURE__ */ jsx(HoverContext.Provider, {
value: {
startRow,
endRow,
onHover
},
children: bodyNode
})
});
}
var MemoBody = /* @__PURE__ */ React__namespace.memo(Body);
MemoBody.displayName = "Body";
var _excluded$b = ["expandable"];
var INTERNAL_COL_DEFINE = "RC_TABLE_INTERNAL_COL_DEFINE";
function getExpandableProps(props) {
var expandable = props.expandable, legacyExpandableConfig = _objectWithoutProperties$1(props, _excluded$b);
var config;
if ("expandable" in props) {
config = _objectSpread2$a(_objectSpread2$a({}, legacyExpandableConfig), expandable);
} else {
config = legacyExpandableConfig;
}
if (config.showExpandColumn === false) {
config.expandIconColumnIndex = -1;
}
return config;
}
var EXPAND_COLUMN = {};
var _excluded$a = ["children"], _excluded2$1 = ["fixed"];
function convertChildrenToColumns(children) {
return toArray$9(children).filter(function(node) {
return /* @__PURE__ */ React__namespace.isValidElement(node);
}).map(function(_ref) {
var key2 = _ref.key, props = _ref.props;
var nodeChildren = props.children, restProps = _objectWithoutProperties$1(props, _excluded$a);
var column = _objectSpread2$a({
key: key2
}, restProps);
if (nodeChildren) {
column.children = convertChildrenToColumns(nodeChildren);
}
return column;
});
}
function flatColumns(columns) {
return columns.reduce(function(list, column) {
var fixed = column.fixed;
var parsedFixed = fixed === true ? "left" : fixed;
var subColumns = column.children;
if (subColumns && subColumns.length > 0) {
return [].concat(_toConsumableArray$c(list), _toConsumableArray$c(flatColumns(subColumns).map(function(subColum) {
return _objectSpread2$a({
fixed: parsedFixed
}, subColum);
})));
}
return [].concat(_toConsumableArray$c(list), [_objectSpread2$a(_objectSpread2$a({}, column), {}, {
fixed: parsedFixed
})]);
}, []);
}
function revertForRtl(columns) {
return columns.map(function(column) {
var fixed = column.fixed, restProps = _objectWithoutProperties$1(column, _excluded2$1);
var parsedFixed = fixed;
if (fixed === "left") {
parsedFixed = "right";
} else if (fixed === "right") {
parsedFixed = "left";
}
return _objectSpread2$a({
fixed: parsedFixed
}, restProps);
});
}
function useColumns(_ref2, transformColumns) {
var prefixCls = _ref2.prefixCls, columns = _ref2.columns, children = _ref2.children, expandable = _ref2.expandable, expandedKeys = _ref2.expandedKeys, columnTitle = _ref2.columnTitle, getRowKey = _ref2.getRowKey, onTriggerExpand = _ref2.onTriggerExpand, expandIcon = _ref2.expandIcon, rowExpandable = _ref2.rowExpandable, expandIconColumnIndex = _ref2.expandIconColumnIndex, direction = _ref2.direction, expandRowByClick = _ref2.expandRowByClick, columnWidth = _ref2.columnWidth, fixed = _ref2.fixed;
var baseColumns = React__namespace.useMemo(function() {
return columns || convertChildrenToColumns(children);
}, [columns, children]);
var withExpandColumns = React__namespace.useMemo(function() {
if (expandable) {
var _expandColumn;
var cloneColumns = baseColumns.slice();
if (!cloneColumns.includes(EXPAND_COLUMN)) {
var expandColIndex = expandIconColumnIndex || 0;
if (expandColIndex >= 0) {
cloneColumns.splice(expandColIndex, 0, EXPAND_COLUMN);
}
}
var expandColumnIndex = cloneColumns.indexOf(EXPAND_COLUMN);
cloneColumns = cloneColumns.filter(function(column, index2) {
return column !== EXPAND_COLUMN || index2 === expandColumnIndex;
});
var prevColumn = baseColumns[expandColumnIndex];
var fixedColumn;
if ((fixed === "left" || fixed) && !expandIconColumnIndex) {
fixedColumn = "left";
} else if ((fixed === "right" || fixed) && expandIconColumnIndex === baseColumns.length) {
fixedColumn = "right";
} else {
fixedColumn = prevColumn ? prevColumn.fixed : null;
}
var expandColumn = (_expandColumn = {}, _defineProperty$b(_expandColumn, INTERNAL_COL_DEFINE, {
className: "".concat(prefixCls, "-expand-icon-col"),
columnType: "EXPAND_COLUMN"
}), _defineProperty$b(_expandColumn, "title", columnTitle), _defineProperty$b(_expandColumn, "fixed", fixedColumn), _defineProperty$b(_expandColumn, "className", "".concat(prefixCls, "-row-expand-icon-cell")), _defineProperty$b(_expandColumn, "width", columnWidth), _defineProperty$b(_expandColumn, "render", function render2(_, record, index2) {
var rowKey = getRowKey(record, index2);
var expanded = expandedKeys.has(rowKey);
var recordExpandable = rowExpandable ? rowExpandable(record) : true;
var icon = expandIcon({
prefixCls,
expanded,
expandable: recordExpandable,
record,
onExpand: onTriggerExpand
});
if (expandRowByClick) {
return /* @__PURE__ */ jsx("span", {
onClick: function onClick(e2) {
return e2.stopPropagation();
},
children: icon
});
}
return icon;
}), _expandColumn);
return cloneColumns.map(function(col) {
return col === EXPAND_COLUMN ? expandColumn : col;
});
}
return baseColumns.filter(function(col) {
return col !== EXPAND_COLUMN;
});
}, [expandable, baseColumns, getRowKey, expandedKeys, expandIcon, direction]);
var mergedColumns = React__namespace.useMemo(function() {
var finalColumns = withExpandColumns;
if (transformColumns) {
finalColumns = transformColumns(finalColumns);
}
if (!finalColumns.length) {
finalColumns = [{
render: function render2() {
return null;
}
}];
}
return finalColumns;
}, [transformColumns, withExpandColumns, direction]);
var flattenColumns = React__namespace.useMemo(function() {
if (direction === "rtl") {
return revertForRtl(flatColumns(mergedColumns));
}
return flatColumns(mergedColumns);
}, [mergedColumns, direction]);
return [mergedColumns, flattenColumns];
}
function useLayoutState(defaultState) {
var stateRef = React$a.useRef(defaultState);
var _useState = React$a.useState({}), _useState2 = _slicedToArray$e(_useState, 2), forceUpdate = _useState2[1];
var lastPromiseRef = React$a.useRef(null);
var updateBatchRef = React$a.useRef([]);
function setFrameState(updater) {
updateBatchRef.current.push(updater);
var promise = Promise.resolve();
lastPromiseRef.current = promise;
promise.then(function() {
if (lastPromiseRef.current === promise) {
var prevBatch = updateBatchRef.current;
var prevState = stateRef.current;
updateBatchRef.current = [];
prevBatch.forEach(function(batchUpdater) {
stateRef.current = batchUpdater(stateRef.current);
});
lastPromiseRef.current = null;
if (prevState !== stateRef.current) {
forceUpdate({});
}
}
});
}
React$a.useEffect(function() {
return function() {
lastPromiseRef.current = null;
};
}, []);
return [stateRef.current, setFrameState];
}
function useTimeoutLock(defaultState) {
var frameRef = React$a.useRef(defaultState || null);
var timeoutRef = React$a.useRef();
function cleanUp() {
window.clearTimeout(timeoutRef.current);
}
function setState(newState) {
frameRef.current = newState;
cleanUp();
timeoutRef.current = window.setTimeout(function() {
frameRef.current = null;
timeoutRef.current = void 0;
}, 100);
}
function getState() {
return frameRef.current;
}
React$a.useEffect(function() {
return cleanUp;
}, []);
return [setState, getState];
}
function useStickyOffsets(colWidths, columnCount, direction) {
var stickyOffsets = React$a.useMemo(function() {
var leftOffsets = [];
var rightOffsets = [];
var left = 0;
var right = 0;
for (var start = 0; start < columnCount; start += 1) {
if (direction === "rtl") {
rightOffsets[start] = right;
right += colWidths[start] || 0;
var end = columnCount - start - 1;
leftOffsets[end] = left;
left += colWidths[end] || 0;
} else {
leftOffsets[start] = left;
left += colWidths[start] || 0;
var _end = columnCount - start - 1;
rightOffsets[_end] = right;
right += colWidths[_end] || 0;
}
}
return {
left: leftOffsets,
right: rightOffsets
};
}, [colWidths, columnCount, direction]);
return stickyOffsets;
}
var _excluded$9 = ["columnType"];
function ColGroup(_ref) {
var colWidths = _ref.colWidths, columns = _ref.columns, columCount = _ref.columCount;
var cols = [];
var len = columCount || columns.length;
var mustInsert = false;
for (var i2 = len - 1; i2 >= 0; i2 -= 1) {
var width = colWidths[i2];
var column = columns && columns[i2];
var additionalProps = column && column[INTERNAL_COL_DEFINE];
if (width || additionalProps || mustInsert) {
var _ref2 = additionalProps || {};
_ref2.columnType;
var restAdditionalProps = _objectWithoutProperties$1(_ref2, _excluded$9);
cols.unshift(
/* @__PURE__ */ jsx("col", {
style: {
width
},
...restAdditionalProps
}, i2)
);
mustInsert = true;
}
}
return /* @__PURE__ */ jsx("colgroup", {
children: cols
});
}
function Panel$2(_ref) {
var className = _ref.className, children = _ref.children;
return /* @__PURE__ */ jsx("div", {
className,
children
});
}
var SummaryContext = /* @__PURE__ */ React__namespace.createContext({});
function SummaryCell(_ref) {
var className = _ref.className, index2 = _ref.index, children = _ref.children, _ref$colSpan = _ref.colSpan, colSpan = _ref$colSpan === void 0 ? 1 : _ref$colSpan, rowSpan = _ref.rowSpan, align = _ref.align;
var _React$useContext = React__namespace.useContext(TableContext), prefixCls = _React$useContext.prefixCls, direction = _React$useContext.direction;
var _React$useContext2 = React__namespace.useContext(SummaryContext), scrollColumnIndex = _React$useContext2.scrollColumnIndex, stickyOffsets = _React$useContext2.stickyOffsets, flattenColumns = _React$useContext2.flattenColumns;
var lastIndex = index2 + colSpan - 1;
var mergedColSpan = lastIndex + 1 === scrollColumnIndex ? colSpan + 1 : colSpan;
var fixedInfo = getCellFixedInfo(index2, index2 + mergedColSpan - 1, flattenColumns, stickyOffsets, direction);
return /* @__PURE__ */ jsx(WrappedCell, {
className,
index: index2,
component: "td",
prefixCls,
record: null,
dataIndex: null,
align,
colSpan: mergedColSpan,
rowSpan,
render: function render2() {
return children;
},
...fixedInfo
});
}
var _excluded$8 = ["children"];
function FooterRow(_ref) {
var children = _ref.children, props = _objectWithoutProperties$1(_ref, _excluded$8);
return /* @__PURE__ */ jsx("tr", {
...props,
children
});
}
function Summary(_ref) {
var children = _ref.children;
return children;
}
Summary.Row = FooterRow;
Summary.Cell = SummaryCell;
function Footer(_ref) {
var children = _ref.children, stickyOffsets = _ref.stickyOffsets, flattenColumns = _ref.flattenColumns;
var tableContext = React__namespace.useContext(TableContext);
var prefixCls = tableContext.prefixCls;
var lastColumnIndex = flattenColumns.length - 1;
var scrollColumn = flattenColumns[lastColumnIndex];
var summaryContext = React__namespace.useMemo(function() {
return {
stickyOffsets,
flattenColumns,
scrollColumnIndex: (scrollColumn === null || scrollColumn === void 0 ? void 0 : scrollColumn.scrollbar) ? lastColumnIndex : null
};
}, [scrollColumn, flattenColumns, lastColumnIndex, stickyOffsets]);
return /* @__PURE__ */ jsx(SummaryContext.Provider, {
value: summaryContext,
children: /* @__PURE__ */ jsx("tfoot", {
className: "".concat(prefixCls, "-summary"),
children
})
});
}
var FooterComponents = Summary;
function renderExpandIcon$1(_ref) {
var _classNames;
var prefixCls = _ref.prefixCls, record = _ref.record, onExpand = _ref.onExpand, expanded = _ref.expanded, expandable = _ref.expandable;
var expandClassName = "".concat(prefixCls, "-row-expand-icon");
if (!expandable) {
return /* @__PURE__ */ jsx("span", {
className: classnames(expandClassName, "".concat(prefixCls, "-row-spaced"))
});
}
var onClick = function onClick2(event) {
onExpand(record, event);
event.stopPropagation();
};
return /* @__PURE__ */ jsx("span", {
className: classnames(expandClassName, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-row-expanded"), expanded), _defineProperty$b(_classNames, "".concat(prefixCls, "-row-collapsed"), !expanded), _classNames)),
onClick
});
}
function findAllChildrenKeys(data, getRowKey, childrenColumnName) {
var keys2 = [];
function dig(list) {
(list || []).forEach(function(item, index2) {
keys2.push(getRowKey(item, index2));
dig(item[childrenColumnName]);
});
}
dig(data);
return keys2;
}
var StickyScrollBar = function StickyScrollBar2(_ref, ref) {
var _scrollBodyRef$curren, _scrollBodyRef$curren2;
var scrollBodyRef = _ref.scrollBodyRef, onScroll = _ref.onScroll, offsetScroll = _ref.offsetScroll, container = _ref.container;
var _React$useContext = React__namespace.useContext(TableContext), prefixCls = _React$useContext.prefixCls;
var bodyScrollWidth = ((_scrollBodyRef$curren = scrollBodyRef.current) === null || _scrollBodyRef$curren === void 0 ? void 0 : _scrollBodyRef$curren.scrollWidth) || 0;
var bodyWidth = ((_scrollBodyRef$curren2 = scrollBodyRef.current) === null || _scrollBodyRef$curren2 === void 0 ? void 0 : _scrollBodyRef$curren2.clientWidth) || 0;
var scrollBarWidth = bodyScrollWidth && bodyWidth * (bodyWidth / bodyScrollWidth);
var scrollBarRef = React__namespace.useRef();
var _useLayoutState = useLayoutState({
scrollLeft: 0,
isHiddenScrollBar: false
}), _useLayoutState2 = _slicedToArray$e(_useLayoutState, 2), scrollState = _useLayoutState2[0], setScrollState = _useLayoutState2[1];
var refState = React__namespace.useRef({
delta: 0,
x: 0
});
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), isActive2 = _React$useState2[0], setActive = _React$useState2[1];
var onMouseUp = function onMouseUp2() {
setActive(false);
};
var onMouseDown = function onMouseDown2(event) {
event.persist();
refState.current.delta = event.pageX - scrollState.scrollLeft;
refState.current.x = 0;
setActive(true);
event.preventDefault();
};
var onMouseMove = function onMouseMove2(event) {
var _window;
var _ref2 = event || ((_window = window) === null || _window === void 0 ? void 0 : _window.event), buttons = _ref2.buttons;
if (!isActive2 || buttons === 0) {
if (isActive2) {
setActive(false);
}
return;
}
var left = refState.current.x + event.pageX - refState.current.x - refState.current.delta;
if (left <= 0) {
left = 0;
}
if (left + scrollBarWidth >= bodyWidth) {
left = bodyWidth - scrollBarWidth;
}
onScroll({
scrollLeft: left / bodyWidth * (bodyScrollWidth + 2)
});
refState.current.x = event.pageX;
};
var onContainerScroll = function onContainerScroll2() {
if (!scrollBodyRef.current) {
return;
}
var tableOffsetTop = getOffset$1(scrollBodyRef.current).top;
var tableBottomOffset = tableOffsetTop + scrollBodyRef.current.offsetHeight;
var currentClientOffset = container === window ? document.documentElement.scrollTop + window.innerHeight : getOffset$1(container).top + container.clientHeight;
if (tableBottomOffset - getScrollBarSize() <= currentClientOffset || tableOffsetTop >= currentClientOffset - offsetScroll) {
setScrollState(function(state) {
return _objectSpread2$a(_objectSpread2$a({}, state), {}, {
isHiddenScrollBar: true
});
});
} else {
setScrollState(function(state) {
return _objectSpread2$a(_objectSpread2$a({}, state), {}, {
isHiddenScrollBar: false
});
});
}
};
var setScrollLeft = function setScrollLeft2(left) {
setScrollState(function(state) {
return _objectSpread2$a(_objectSpread2$a({}, state), {}, {
scrollLeft: left / bodyScrollWidth * bodyWidth || 0
});
});
};
React__namespace.useImperativeHandle(ref, function() {
return {
setScrollLeft
};
});
React__namespace.useEffect(function() {
var onMouseUpListener = addEventListenerWrap$2(document.body, "mouseup", onMouseUp, false);
var onMouseMoveListener = addEventListenerWrap$2(document.body, "mousemove", onMouseMove, false);
onContainerScroll();
return function() {
onMouseUpListener.remove();
onMouseMoveListener.remove();
};
}, [scrollBarWidth, isActive2]);
React__namespace.useEffect(function() {
var onScrollListener = addEventListenerWrap$2(container, "scroll", onContainerScroll, false);
var onResizeListener = addEventListenerWrap$2(window, "resize", onContainerScroll, false);
return function() {
onScrollListener.remove();
onResizeListener.remove();
};
}, [container]);
React__namespace.useEffect(function() {
if (!scrollState.isHiddenScrollBar) {
setScrollState(function(state) {
var bodyNode = scrollBodyRef.current;
if (!bodyNode) {
return state;
}
return _objectSpread2$a(_objectSpread2$a({}, state), {}, {
scrollLeft: bodyNode.scrollLeft / bodyNode.scrollWidth * bodyNode.clientWidth
});
});
}
}, [scrollState.isHiddenScrollBar]);
if (bodyScrollWidth <= bodyWidth || !scrollBarWidth || scrollState.isHiddenScrollBar) {
return null;
}
return /* @__PURE__ */ jsx("div", {
style: {
height: getScrollBarSize(),
width: bodyWidth,
bottom: offsetScroll
},
className: "".concat(prefixCls, "-sticky-scroll"),
children: /* @__PURE__ */ jsx("div", {
onMouseDown,
ref: scrollBarRef,
className: classnames("".concat(prefixCls, "-sticky-scroll-bar"), _defineProperty$b({}, "".concat(prefixCls, "-sticky-scroll-bar-active"), isActive2)),
style: {
width: "".concat(scrollBarWidth, "px"),
transform: "translate3d(".concat(scrollState.scrollLeft, "px, 0, 0)")
}
})
});
};
const StickyScrollBar$1 = /* @__PURE__ */ React__namespace.forwardRef(StickyScrollBar);
var defaultContainer = canUseDom$1() ? window : null;
function useSticky(sticky, prefixCls) {
var _ref = _typeof$q(sticky) === "object" ? sticky : {}, _ref$offsetHeader = _ref.offsetHeader, offsetHeader = _ref$offsetHeader === void 0 ? 0 : _ref$offsetHeader, _ref$offsetSummary = _ref.offsetSummary, offsetSummary = _ref$offsetSummary === void 0 ? 0 : _ref$offsetSummary, _ref$offsetScroll = _ref.offsetScroll, offsetScroll = _ref$offsetScroll === void 0 ? 0 : _ref$offsetScroll, _ref$getContainer = _ref.getContainer, getContainer2 = _ref$getContainer === void 0 ? function() {
return defaultContainer;
} : _ref$getContainer;
var container = getContainer2() || defaultContainer;
return React__namespace.useMemo(function() {
var isSticky = !!sticky;
return {
isSticky,
stickyClassName: isSticky ? "".concat(prefixCls, "-sticky-holder") : "",
offsetHeader,
offsetSummary,
offsetScroll,
container
};
}, [offsetScroll, offsetHeader, offsetSummary, prefixCls, container]);
}
var _excluded$7 = ["className", "noData", "columns", "flattenColumns", "colWidths", "columCount", "stickyOffsets", "direction", "fixHeader", "stickyTopOffset", "stickyBottomOffset", "stickyClassName", "onScroll", "maxContentScroll", "children"];
function useColumnWidth(colWidths, columCount) {
return React$a.useMemo(function() {
var cloneColumns = [];
for (var i2 = 0; i2 < columCount; i2 += 1) {
var val = colWidths[i2];
if (val !== void 0) {
cloneColumns[i2] = val;
} else {
return null;
}
}
return cloneColumns;
}, [colWidths.join("_"), columCount]);
}
var FixedHolder = /* @__PURE__ */ React__namespace.forwardRef(function(_ref, ref) {
var className = _ref.className, noData = _ref.noData, columns = _ref.columns, flattenColumns = _ref.flattenColumns, colWidths = _ref.colWidths, columCount = _ref.columCount, stickyOffsets = _ref.stickyOffsets, direction = _ref.direction, fixHeader = _ref.fixHeader, stickyTopOffset = _ref.stickyTopOffset, stickyBottomOffset = _ref.stickyBottomOffset, stickyClassName = _ref.stickyClassName, onScroll = _ref.onScroll, maxContentScroll = _ref.maxContentScroll, children = _ref.children, props = _objectWithoutProperties$1(_ref, _excluded$7);
var _React$useContext = React__namespace.useContext(TableContext), prefixCls = _React$useContext.prefixCls, scrollbarSize = _React$useContext.scrollbarSize, isSticky = _React$useContext.isSticky;
var combinationScrollBarSize = isSticky && !fixHeader ? 0 : scrollbarSize;
var scrollRef = React__namespace.useRef(null);
var setScrollRef = React__namespace.useCallback(function(element) {
fillRef(ref, element);
fillRef(scrollRef, element);
}, []);
React__namespace.useEffect(function() {
var _scrollRef$current;
function onWheel(e2) {
var currentTarget = e2.currentTarget, deltaX = e2.deltaX;
if (deltaX) {
onScroll({
currentTarget,
scrollLeft: currentTarget.scrollLeft + deltaX
});
e2.preventDefault();
}
}
(_scrollRef$current = scrollRef.current) === null || _scrollRef$current === void 0 ? void 0 : _scrollRef$current.addEventListener("wheel", onWheel);
return function() {
var _scrollRef$current2;
(_scrollRef$current2 = scrollRef.current) === null || _scrollRef$current2 === void 0 ? void 0 : _scrollRef$current2.removeEventListener("wheel", onWheel);
};
}, []);
var allFlattenColumnsWithWidth = React__namespace.useMemo(function() {
return flattenColumns.every(function(column) {
return column.width >= 0;
});
}, [flattenColumns]);
var lastColumn = flattenColumns[flattenColumns.length - 1];
var ScrollBarColumn = {
fixed: lastColumn ? lastColumn.fixed : null,
scrollbar: true,
onHeaderCell: function onHeaderCell() {
return {
className: "".concat(prefixCls, "-cell-scrollbar")
};
}
};
var columnsWithScrollbar = React$a.useMemo(function() {
return combinationScrollBarSize ? [].concat(_toConsumableArray$c(columns), [ScrollBarColumn]) : columns;
}, [combinationScrollBarSize, columns]);
var flattenColumnsWithScrollbar = React$a.useMemo(function() {
return combinationScrollBarSize ? [].concat(_toConsumableArray$c(flattenColumns), [ScrollBarColumn]) : flattenColumns;
}, [combinationScrollBarSize, flattenColumns]);
var headerStickyOffsets = React$a.useMemo(function() {
var right = stickyOffsets.right, left = stickyOffsets.left;
return _objectSpread2$a(_objectSpread2$a({}, stickyOffsets), {}, {
left: direction === "rtl" ? [].concat(_toConsumableArray$c(left.map(function(width) {
return width + combinationScrollBarSize;
})), [0]) : left,
right: direction === "rtl" ? right : [].concat(_toConsumableArray$c(right.map(function(width) {
return width + combinationScrollBarSize;
})), [0]),
isSticky
});
}, [combinationScrollBarSize, stickyOffsets, isSticky]);
var mergedColumnWidth = useColumnWidth(colWidths, columCount);
return /* @__PURE__ */ jsx("div", {
style: _objectSpread2$a({
overflow: "hidden"
}, isSticky ? {
top: stickyTopOffset,
bottom: stickyBottomOffset
} : {}),
ref: setScrollRef,
className: classnames(className, _defineProperty$b({}, stickyClassName, !!stickyClassName)),
children: /* @__PURE__ */ jsxs("table", {
style: {
tableLayout: "fixed",
visibility: noData || mergedColumnWidth ? null : "hidden"
},
children: [(!noData || !maxContentScroll || allFlattenColumnsWithWidth) && /* @__PURE__ */ jsx(ColGroup, {
colWidths: mergedColumnWidth ? [].concat(_toConsumableArray$c(mergedColumnWidth), [combinationScrollBarSize]) : [],
columCount: columCount + 1,
columns: flattenColumnsWithScrollbar
}), children(_objectSpread2$a(_objectSpread2$a({}, props), {}, {
stickyOffsets: headerStickyOffsets,
columns: columnsWithScrollbar,
flattenColumns: flattenColumnsWithScrollbar
}))]
})
});
});
FixedHolder.displayName = "FixedHolder";
var EMPTY_DATA = [];
var EMPTY_SCROLL_TARGET = {};
var INTERNAL_HOOKS = "rc-table-internal-hook";
var MemoTableContent = /* @__PURE__ */ React__namespace.memo(function(_ref) {
var children = _ref.children;
return children;
}, function(prev, next) {
if (!shallowequal(prev.props, next.props)) {
return false;
}
return prev.pingLeft !== next.pingLeft || prev.pingRight !== next.pingRight;
});
function Table$2(props) {
var _classNames;
var prefixCls = props.prefixCls, className = props.className, rowClassName = props.rowClassName, style2 = props.style, data = props.data, rowKey = props.rowKey, scroll = props.scroll, tableLayout = props.tableLayout, direction = props.direction, title = props.title, footer = props.footer, summary = props.summary, id2 = props.id, showHeader = props.showHeader, components = props.components, emptyText = props.emptyText, onRow = props.onRow, onHeaderRow = props.onHeaderRow, internalHooks = props.internalHooks, transformColumns = props.transformColumns, internalRefs = props.internalRefs, sticky = props.sticky;
var mergedData = data || EMPTY_DATA;
var hasData = !!mergedData.length;
var getComponent = React__namespace.useCallback(function(path2, defaultComponent) {
return getPathValue(components || {}, path2) || defaultComponent;
}, [components]);
var getRowKey = React__namespace.useMemo(function() {
if (typeof rowKey === "function") {
return rowKey;
}
return function(record) {
var key2 = record && record[rowKey];
return key2;
};
}, [rowKey]);
var expandableConfig = getExpandableProps(props);
var expandIcon = expandableConfig.expandIcon, expandedRowKeys = expandableConfig.expandedRowKeys, defaultExpandedRowKeys = expandableConfig.defaultExpandedRowKeys, defaultExpandAllRows = expandableConfig.defaultExpandAllRows, expandedRowRender = expandableConfig.expandedRowRender, columnTitle = expandableConfig.columnTitle, onExpand = expandableConfig.onExpand, onExpandedRowsChange = expandableConfig.onExpandedRowsChange, expandRowByClick = expandableConfig.expandRowByClick, rowExpandable = expandableConfig.rowExpandable, expandIconColumnIndex = expandableConfig.expandIconColumnIndex, expandedRowClassName = expandableConfig.expandedRowClassName, childrenColumnName = expandableConfig.childrenColumnName, indentSize = expandableConfig.indentSize;
var mergedExpandIcon = expandIcon || renderExpandIcon$1;
var mergedChildrenColumnName = childrenColumnName || "children";
var expandableType = React__namespace.useMemo(function() {
if (expandedRowRender) {
return "row";
}
if (props.expandable && internalHooks === INTERNAL_HOOKS && props.expandable.__PARENT_RENDER_ICON__ || mergedData.some(function(record) {
return record && _typeof$q(record) === "object" && record[mergedChildrenColumnName];
})) {
return "nest";
}
return false;
}, [!!expandedRowRender, mergedData]);
var _React$useState = React__namespace.useState(function() {
if (defaultExpandedRowKeys) {
return defaultExpandedRowKeys;
}
if (defaultExpandAllRows) {
return findAllChildrenKeys(mergedData, getRowKey, mergedChildrenColumnName);
}
return [];
}), _React$useState2 = _slicedToArray$e(_React$useState, 2), innerExpandedKeys = _React$useState2[0], setInnerExpandedKeys = _React$useState2[1];
var mergedExpandedKeys = React__namespace.useMemo(function() {
return new Set(expandedRowKeys || innerExpandedKeys || []);
}, [expandedRowKeys, innerExpandedKeys]);
var onTriggerExpand = React__namespace.useCallback(function(record) {
var key2 = getRowKey(record, mergedData.indexOf(record));
var newExpandedKeys;
var hasKey = mergedExpandedKeys.has(key2);
if (hasKey) {
mergedExpandedKeys.delete(key2);
newExpandedKeys = _toConsumableArray$c(mergedExpandedKeys);
} else {
newExpandedKeys = [].concat(_toConsumableArray$c(mergedExpandedKeys), [key2]);
}
setInnerExpandedKeys(newExpandedKeys);
if (onExpand) {
onExpand(!hasKey, record);
}
if (onExpandedRowsChange) {
onExpandedRowsChange(newExpandedKeys);
}
}, [getRowKey, mergedExpandedKeys, mergedData, onExpand, onExpandedRowsChange]);
var _React$useState3 = React__namespace.useState(0), _React$useState4 = _slicedToArray$e(_React$useState3, 2), componentWidth = _React$useState4[0], setComponentWidth = _React$useState4[1];
var _useColumns = useColumns(_objectSpread2$a(_objectSpread2$a(_objectSpread2$a({}, props), expandableConfig), {}, {
expandable: !!expandedRowRender,
columnTitle,
expandedKeys: mergedExpandedKeys,
getRowKey,
onTriggerExpand,
expandIcon: mergedExpandIcon,
expandIconColumnIndex,
direction
}), internalHooks === INTERNAL_HOOKS ? transformColumns : null), _useColumns2 = _slicedToArray$e(_useColumns, 2), columns = _useColumns2[0], flattenColumns = _useColumns2[1];
var columnContext = React__namespace.useMemo(function() {
return {
columns,
flattenColumns
};
}, [columns, flattenColumns]);
var fullTableRef = React__namespace.useRef();
var scrollHeaderRef = React__namespace.useRef();
var scrollBodyRef = React__namespace.useRef();
var scrollBodyContainerRef = React__namespace.useRef();
var scrollSummaryRef = React__namespace.useRef();
var _React$useState5 = React__namespace.useState(false), _React$useState6 = _slicedToArray$e(_React$useState5, 2), pingedLeft = _React$useState6[0], setPingedLeft = _React$useState6[1];
var _React$useState7 = React__namespace.useState(false), _React$useState8 = _slicedToArray$e(_React$useState7, 2), pingedRight = _React$useState8[0], setPingedRight = _React$useState8[1];
var _useLayoutState = useLayoutState(/* @__PURE__ */ new Map()), _useLayoutState2 = _slicedToArray$e(_useLayoutState, 2), colsWidths = _useLayoutState2[0], updateColsWidths = _useLayoutState2[1];
var colsKeys = getColumnsKey(flattenColumns);
var pureColWidths = colsKeys.map(function(columnKey) {
return colsWidths.get(columnKey);
});
var colWidths = React__namespace.useMemo(function() {
return pureColWidths;
}, [pureColWidths.join("_")]);
var stickyOffsets = useStickyOffsets(colWidths, flattenColumns.length, direction);
var fixHeader = scroll && validateValue(scroll.y);
var horizonScroll = scroll && validateValue(scroll.x) || Boolean(expandableConfig.fixed);
var fixColumn = horizonScroll && flattenColumns.some(function(_ref2) {
var fixed = _ref2.fixed;
return fixed;
});
var stickyRef = React__namespace.useRef();
var _useSticky = useSticky(sticky, prefixCls), isSticky = _useSticky.isSticky, offsetHeader = _useSticky.offsetHeader, offsetSummary = _useSticky.offsetSummary, offsetScroll = _useSticky.offsetScroll, stickyClassName = _useSticky.stickyClassName, container = _useSticky.container;
var summaryNode = summary === null || summary === void 0 ? void 0 : summary(mergedData);
var fixFooter = (fixHeader || isSticky) && /* @__PURE__ */ React__namespace.isValidElement(summaryNode) && summaryNode.type === Summary && summaryNode.props.fixed;
var scrollXStyle;
var scrollYStyle;
var scrollTableStyle;
if (fixHeader) {
scrollYStyle = {
overflowY: "scroll",
maxHeight: scroll.y
};
}
if (horizonScroll) {
scrollXStyle = {
overflowX: "auto"
};
if (!fixHeader) {
scrollYStyle = {
overflowY: "hidden"
};
}
scrollTableStyle = {
width: (scroll === null || scroll === void 0 ? void 0 : scroll.x) === true ? "auto" : scroll === null || scroll === void 0 ? void 0 : scroll.x,
minWidth: "100%"
};
}
var onColumnResize = React__namespace.useCallback(function(columnKey, width) {
if (isVisible(fullTableRef.current)) {
updateColsWidths(function(widths) {
if (widths.get(columnKey) !== width) {
var newWidths = new Map(widths);
newWidths.set(columnKey, width);
return newWidths;
}
return widths;
});
}
}, []);
var _useTimeoutLock = useTimeoutLock(null), _useTimeoutLock2 = _slicedToArray$e(_useTimeoutLock, 2), setScrollTarget = _useTimeoutLock2[0], getScrollTarget = _useTimeoutLock2[1];
function forceScroll(scrollLeft, target) {
if (!target) {
return;
}
if (typeof target === "function") {
target(scrollLeft);
} else if (target.scrollLeft !== scrollLeft) {
target.scrollLeft = scrollLeft;
}
}
var onScroll = function onScroll2(_ref3) {
var currentTarget = _ref3.currentTarget, scrollLeft = _ref3.scrollLeft;
var isRTL = direction === "rtl";
var mergedScrollLeft = typeof scrollLeft === "number" ? scrollLeft : currentTarget.scrollLeft;
var compareTarget = currentTarget || EMPTY_SCROLL_TARGET;
if (!getScrollTarget() || getScrollTarget() === compareTarget) {
var _stickyRef$current;
setScrollTarget(compareTarget);
forceScroll(mergedScrollLeft, scrollHeaderRef.current);
forceScroll(mergedScrollLeft, scrollBodyRef.current);
forceScroll(mergedScrollLeft, scrollSummaryRef.current);
forceScroll(mergedScrollLeft, (_stickyRef$current = stickyRef.current) === null || _stickyRef$current === void 0 ? void 0 : _stickyRef$current.setScrollLeft);
}
if (currentTarget) {
var scrollWidth = currentTarget.scrollWidth, clientWidth = currentTarget.clientWidth;
if (scrollWidth === clientWidth) {
setPingedLeft(false);
setPingedRight(false);
return;
}
if (isRTL) {
setPingedLeft(-mergedScrollLeft < scrollWidth - clientWidth);
setPingedRight(-mergedScrollLeft > 0);
} else {
setPingedLeft(mergedScrollLeft > 0);
setPingedRight(mergedScrollLeft < scrollWidth - clientWidth);
}
}
};
var triggerOnScroll = function triggerOnScroll2() {
if (horizonScroll && scrollBodyRef.current) {
onScroll({
currentTarget: scrollBodyRef.current
});
} else {
setPingedLeft(false);
setPingedRight(false);
}
};
var onFullTableResize = function onFullTableResize2(_ref4) {
var width = _ref4.width;
if (width !== componentWidth) {
triggerOnScroll();
setComponentWidth(fullTableRef.current ? fullTableRef.current.offsetWidth : width);
}
};
var mounted = React__namespace.useRef(false);
React__namespace.useEffect(function() {
if (mounted.current) {
triggerOnScroll();
}
}, [horizonScroll, data, columns.length]);
React__namespace.useEffect(function() {
mounted.current = true;
}, []);
var _React$useState9 = React__namespace.useState(0), _React$useState10 = _slicedToArray$e(_React$useState9, 2), scrollbarSize = _React$useState10[0], setScrollbarSize = _React$useState10[1];
var _React$useState11 = React__namespace.useState(true), _React$useState12 = _slicedToArray$e(_React$useState11, 2), supportSticky = _React$useState12[0], setSupportSticky = _React$useState12[1];
React__namespace.useEffect(function() {
if (scrollBodyRef.current instanceof Element) {
setScrollbarSize(getTargetScrollBarSize(scrollBodyRef.current).width);
} else {
setScrollbarSize(getTargetScrollBarSize(scrollBodyContainerRef.current).width);
}
setSupportSticky(isStyleSupport("position", "sticky"));
}, []);
React__namespace.useEffect(function() {
if (internalHooks === INTERNAL_HOOKS && internalRefs) {
internalRefs.body.current = scrollBodyRef.current;
}
});
var TableComponent = getComponent(["table"], "table");
var mergedTableLayout = React__namespace.useMemo(function() {
if (tableLayout) {
return tableLayout;
}
if (fixColumn) {
return (scroll === null || scroll === void 0 ? void 0 : scroll.x) === "max-content" ? "auto" : "fixed";
}
if (fixHeader || isSticky || flattenColumns.some(function(_ref5) {
var ellipsis = _ref5.ellipsis;
return ellipsis;
})) {
return "fixed";
}
return "auto";
}, [fixHeader, fixColumn, flattenColumns, tableLayout, isSticky]);
var groupTableNode;
var headerProps = {
colWidths,
columCount: flattenColumns.length,
stickyOffsets,
onHeaderRow,
fixHeader,
scroll
};
var emptyNode = React__namespace.useMemo(function() {
if (hasData) {
return null;
}
if (typeof emptyText === "function") {
return emptyText();
}
return emptyText;
}, [hasData, emptyText]);
var bodyTable = /* @__PURE__ */ jsx(MemoBody, {
data: mergedData,
measureColumnWidth: fixHeader || horizonScroll || isSticky,
expandedKeys: mergedExpandedKeys,
rowExpandable,
getRowKey,
onRow,
emptyNode,
childrenColumnName: mergedChildrenColumnName
});
var bodyColGroup = /* @__PURE__ */ jsx(ColGroup, {
colWidths: flattenColumns.map(function(_ref6) {
var width = _ref6.width;
return width;
}),
columns: flattenColumns
});
var customizeScrollBody = getComponent(["body"]);
if (fixHeader || isSticky) {
var bodyContent;
if (typeof customizeScrollBody === "function") {
bodyContent = customizeScrollBody(mergedData, {
scrollbarSize,
ref: scrollBodyRef,
onScroll
});
headerProps.colWidths = flattenColumns.map(function(_ref7, index2) {
var width = _ref7.width;
var colWidth = index2 === columns.length - 1 ? width - scrollbarSize : width;
if (typeof colWidth === "number" && !Number.isNaN(colWidth)) {
return colWidth;
}
warningOnce(false, "When use `components.body` with render props. Each column should have a fixed `width` value.");
return 0;
});
} else {
bodyContent = /* @__PURE__ */ jsx("div", {
style: _objectSpread2$a(_objectSpread2$a({}, scrollXStyle), scrollYStyle),
onScroll,
ref: scrollBodyRef,
className: classnames("".concat(prefixCls, "-body")),
children: /* @__PURE__ */ jsxs(TableComponent, {
style: _objectSpread2$a(_objectSpread2$a({}, scrollTableStyle), {}, {
tableLayout: mergedTableLayout
}),
children: [bodyColGroup, bodyTable, !fixFooter && summaryNode && /* @__PURE__ */ jsx(Footer, {
stickyOffsets,
flattenColumns,
children: summaryNode
})]
})
});
}
var fixedHolderProps = _objectSpread2$a(_objectSpread2$a(_objectSpread2$a({
noData: !mergedData.length,
maxContentScroll: horizonScroll && scroll.x === "max-content"
}, headerProps), columnContext), {}, {
direction,
stickyClassName,
onScroll
});
groupTableNode = /* @__PURE__ */ jsxs(Fragment, {
children: [showHeader !== false && /* @__PURE__ */ jsx(FixedHolder, {
...fixedHolderProps,
stickyTopOffset: offsetHeader,
className: "".concat(prefixCls, "-header"),
ref: scrollHeaderRef,
children: function(fixedHolderPassProps) {
return /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx(Header, {
...fixedHolderPassProps
}), fixFooter === "top" && /* @__PURE__ */ jsx(Footer, {
...fixedHolderPassProps,
children: summaryNode
})]
});
}
}), bodyContent, fixFooter && fixFooter !== "top" && /* @__PURE__ */ jsx(FixedHolder, {
...fixedHolderProps,
stickyBottomOffset: offsetSummary,
className: "".concat(prefixCls, "-summary"),
ref: scrollSummaryRef,
children: function(fixedHolderPassProps) {
return /* @__PURE__ */ jsx(Footer, {
...fixedHolderPassProps,
children: summaryNode
});
}
}), isSticky && /* @__PURE__ */ jsx(StickyScrollBar$1, {
ref: stickyRef,
offsetScroll,
scrollBodyRef,
onScroll,
container
})]
});
} else {
groupTableNode = /* @__PURE__ */ jsx("div", {
style: _objectSpread2$a(_objectSpread2$a({}, scrollXStyle), scrollYStyle),
className: classnames("".concat(prefixCls, "-content")),
onScroll,
ref: scrollBodyRef,
children: /* @__PURE__ */ jsxs(TableComponent, {
style: _objectSpread2$a(_objectSpread2$a({}, scrollTableStyle), {}, {
tableLayout: mergedTableLayout
}),
children: [bodyColGroup, showHeader !== false && /* @__PURE__ */ jsx(Header, {
...headerProps,
...columnContext
}), bodyTable, summaryNode && /* @__PURE__ */ jsx(Footer, {
stickyOffsets,
flattenColumns,
children: summaryNode
})]
})
});
}
var ariaProps = pickAttrs(props, {
aria: true,
data: true
});
var fullTable = /* @__PURE__ */ jsx("div", {
className: classnames(prefixCls, className, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _defineProperty$b(_classNames, "".concat(prefixCls, "-ping-left"), pingedLeft), _defineProperty$b(_classNames, "".concat(prefixCls, "-ping-right"), pingedRight), _defineProperty$b(_classNames, "".concat(prefixCls, "-layout-fixed"), tableLayout === "fixed"), _defineProperty$b(_classNames, "".concat(prefixCls, "-fixed-header"), fixHeader), _defineProperty$b(_classNames, "".concat(prefixCls, "-fixed-column"), fixColumn), _defineProperty$b(_classNames, "".concat(prefixCls, "-scroll-horizontal"), horizonScroll), _defineProperty$b(_classNames, "".concat(prefixCls, "-has-fix-left"), flattenColumns[0] && flattenColumns[0].fixed), _defineProperty$b(_classNames, "".concat(prefixCls, "-has-fix-right"), flattenColumns[flattenColumns.length - 1] && flattenColumns[flattenColumns.length - 1].fixed === "right"), _classNames)),
style: style2,
id: id2,
ref: fullTableRef,
...ariaProps,
children: /* @__PURE__ */ jsxs(MemoTableContent, {
pingLeft: pingedLeft,
pingRight: pingedRight,
props: _objectSpread2$a(_objectSpread2$a({}, props), {}, {
stickyOffsets,
mergedExpandedKeys
}),
children: [title && /* @__PURE__ */ jsx(Panel$2, {
className: "".concat(prefixCls, "-title"),
children: title(mergedData)
}), /* @__PURE__ */ jsx("div", {
ref: scrollBodyContainerRef,
className: "".concat(prefixCls, "-container"),
children: groupTableNode
}), footer && /* @__PURE__ */ jsx(Panel$2, {
className: "".concat(prefixCls, "-footer"),
children: footer(mergedData)
})]
})
});
if (horizonScroll) {
fullTable = /* @__PURE__ */ jsx(RefResizeObserver, {
onResize: onFullTableResize,
children: fullTable
});
}
var TableContextValue = React__namespace.useMemo(function() {
return {
prefixCls,
getComponent,
scrollbarSize,
direction,
fixedInfoList: flattenColumns.map(function(_, colIndex) {
return getCellFixedInfo(colIndex, colIndex, flattenColumns, stickyOffsets, direction);
}),
isSticky
};
}, [prefixCls, getComponent, scrollbarSize, direction, flattenColumns, stickyOffsets, isSticky]);
var BodyContextValue = React__namespace.useMemo(function() {
return _objectSpread2$a(_objectSpread2$a({}, columnContext), {}, {
tableLayout: mergedTableLayout,
rowClassName,
expandedRowClassName,
expandIcon: mergedExpandIcon,
expandableType,
expandRowByClick,
expandedRowRender,
onTriggerExpand,
expandIconColumnIndex,
indentSize,
allColumnsFixedLeft: columnContext.flattenColumns.every(function(col) {
return col.fixed === "left";
})
});
}, [columnContext, mergedTableLayout, rowClassName, expandedRowClassName, mergedExpandIcon, expandableType, expandRowByClick, expandedRowRender, onTriggerExpand, expandIconColumnIndex, indentSize]);
var ExpandedRowContextValue = React__namespace.useMemo(function() {
return {
componentWidth,
fixHeader,
fixColumn,
horizonScroll
};
}, [componentWidth, fixHeader, fixColumn, horizonScroll]);
var ResizeContextValue = React__namespace.useMemo(function() {
return {
onColumnResize
};
}, [onColumnResize]);
return /* @__PURE__ */ jsx(StickyContext.Provider, {
value: supportSticky,
children: /* @__PURE__ */ jsx(TableContext.Provider, {
value: TableContextValue,
children: /* @__PURE__ */ jsx(BodyContext.Provider, {
value: BodyContextValue,
children: /* @__PURE__ */ jsx(ExpandedRowContext.Provider, {
value: ExpandedRowContextValue,
children: /* @__PURE__ */ jsx(ResizeContext.Provider, {
value: ResizeContextValue,
children: fullTable
})
})
})
})
});
}
Table$2.EXPAND_COLUMN = EXPAND_COLUMN;
Table$2.Column = Column$1;
Table$2.ColumnGroup = ColumnGroup$1;
Table$2.Summary = FooterComponents;
Table$2.defaultProps = {
rowKey: "key",
prefixCls: "rc-table",
emptyText: function emptyText() {
return "No Data";
}
};
function Column(_) {
return null;
}
function ColumnGroup(_) {
return null;
}
function renderExpandIcon(locale2) {
return function expandIcon(_ref) {
var _classNames;
var prefixCls = _ref.prefixCls, onExpand = _ref.onExpand, record = _ref.record, expanded = _ref.expanded, expandable = _ref.expandable;
var iconPrefix = "".concat(prefixCls, "-row-expand-icon");
return /* @__PURE__ */ jsx("button", {
type: "button",
onClick: function onClick(e2) {
onExpand(record, e2);
e2.stopPropagation();
},
className: classnames(iconPrefix, (_classNames = {}, _defineProperty$b(_classNames, "".concat(iconPrefix, "-spaced"), !expandable), _defineProperty$b(_classNames, "".concat(iconPrefix, "-expanded"), expandable && expanded), _defineProperty$b(_classNames, "".concat(iconPrefix, "-collapsed"), expandable && !expanded), _classNames)),
"aria-label": expanded ? locale2.collapse : locale2.expand,
"aria-expanded": expanded
});
};
}
function getColumnKey(column, defaultKey2) {
if ("key" in column && column.key !== void 0 && column.key !== null) {
return column.key;
}
if (column.dataIndex) {
return Array.isArray(column.dataIndex) ? column.dataIndex.join(".") : column.dataIndex;
}
return defaultKey2;
}
function getColumnPos(index2, pos) {
return pos ? "".concat(pos, "-").concat(index2) : "".concat(index2);
}
function renderColumnTitle(title, props) {
if (typeof title === "function") {
return title(props);
}
return title;
}
function safeColumnTitle(title, props) {
var res = renderColumnTitle(title, props);
if (Object.prototype.toString.call(res) === "[object Object]")
return "";
return res;
}
var FilterFilled$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M349 838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V642H349v196zm531.1-684H143.9c-24.5 0-39.8 26.7-27.5 48l221.3 376h348.8l221.3-376c12.1-21.3-3.2-48-27.7-48z" } }] }, "name": "filter", "theme": "filled" };
const FilterFilledSvg = FilterFilled$2;
var FilterFilled = function FilterFilled2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: FilterFilledSvg
})
});
};
FilterFilled.displayName = "FilterFilled";
const FilterFilled$1 = /* @__PURE__ */ React__namespace.forwardRef(FilterFilled);
function listCacheClear$2() {
this.__data__ = [];
this.size = 0;
}
var _listCacheClear = listCacheClear$2;
function eq$3(value, other) {
return value === other || value !== value && other !== other;
}
var eq_1 = eq$3;
var eq$2 = eq_1;
function assocIndexOf$5(array2, key2) {
var length = array2.length;
while (length--) {
if (eq$2(array2[length][0], key2)) {
return length;
}
}
return -1;
}
var _assocIndexOf = assocIndexOf$5;
var assocIndexOf$4 = _assocIndexOf;
var arrayProto$1 = Array.prototype;
var splice$1 = arrayProto$1.splice;
function listCacheDelete$2(key2) {
var data = this.__data__, index2 = assocIndexOf$4(data, key2);
if (index2 < 0) {
return false;
}
var lastIndex = data.length - 1;
if (index2 == lastIndex) {
data.pop();
} else {
splice$1.call(data, index2, 1);
}
--this.size;
return true;
}
var _listCacheDelete = listCacheDelete$2;
var assocIndexOf$3 = _assocIndexOf;
function listCacheGet$2(key2) {
var data = this.__data__, index2 = assocIndexOf$3(data, key2);
return index2 < 0 ? void 0 : data[index2][1];
}
var _listCacheGet = listCacheGet$2;
var assocIndexOf$2 = _assocIndexOf;
function listCacheHas$2(key2) {
return assocIndexOf$2(this.__data__, key2) > -1;
}
var _listCacheHas = listCacheHas$2;
var assocIndexOf$1 = _assocIndexOf;
function listCacheSet$2(key2, value) {
var data = this.__data__, index2 = assocIndexOf$1(data, key2);
if (index2 < 0) {
++this.size;
data.push([key2, value]);
} else {
data[index2][1] = value;
}
return this;
}
var _listCacheSet = listCacheSet$2;
var listCacheClear$1 = _listCacheClear, listCacheDelete$1 = _listCacheDelete, listCacheGet$1 = _listCacheGet, listCacheHas$1 = _listCacheHas, listCacheSet$1 = _listCacheSet;
function ListCache$5(entries) {
var index2 = -1, length = entries == null ? 0 : entries.length;
this.clear();
while (++index2 < length) {
var entry = entries[index2];
this.set(entry[0], entry[1]);
}
}
ListCache$5.prototype.clear = listCacheClear$1;
ListCache$5.prototype["delete"] = listCacheDelete$1;
ListCache$5.prototype.get = listCacheGet$1;
ListCache$5.prototype.has = listCacheHas$1;
ListCache$5.prototype.set = listCacheSet$1;
var _ListCache = ListCache$5;
var ListCache$4 = _ListCache;
function stackClear$2() {
this.__data__ = new ListCache$4();
this.size = 0;
}
var _stackClear = stackClear$2;
function stackDelete$2(key2) {
var data = this.__data__, result = data["delete"](key2);
this.size = data.size;
return result;
}
var _stackDelete = stackDelete$2;
function stackGet$2(key2) {
return this.__data__.get(key2);
}
var _stackGet = stackGet$2;
function stackHas$2(key2) {
return this.__data__.has(key2);
}
var _stackHas = stackHas$2;
var baseGetTag$4 = _baseGetTag, isObject$8 = isObject_1;
var asyncTag$1 = "[object AsyncFunction]", funcTag$4 = "[object Function]", genTag$2 = "[object GeneratorFunction]", proxyTag$1 = "[object Proxy]";
function isFunction$6(value) {
if (!isObject$8(value)) {
return false;
}
var tag = baseGetTag$4(value);
return tag == funcTag$4 || tag == genTag$2 || tag == asyncTag$1 || tag == proxyTag$1;
}
var isFunction_1 = isFunction$6;
var root$8 = _root;
var coreJsData$3 = root$8["__core-js_shared__"];
var _coreJsData = coreJsData$3;
var coreJsData$2 = _coreJsData;
var maskSrcKey$1 = function() {
var uid2 = /[^.]+$/.exec(coreJsData$2 && coreJsData$2.keys && coreJsData$2.keys.IE_PROTO || "");
return uid2 ? "Symbol(src)_1." + uid2 : "";
}();
function isMasked$2(func) {
return !!maskSrcKey$1 && maskSrcKey$1 in func;
}
var _isMasked = isMasked$2;
var funcProto$3 = Function.prototype;
var funcToString$3 = funcProto$3.toString;
function toSource$3(func) {
if (func != null) {
try {
return funcToString$3.call(func);
} catch (e2) {
}
try {
return func + "";
} catch (e2) {
}
}
return "";
}
var _toSource = toSource$3;
var isFunction$5 = isFunction_1, isMasked$1 = _isMasked, isObject$7 = isObject_1, toSource$2 = _toSource;
var reRegExpChar$1 = /[\\^$.*+?()[\]{}|]/g;
var reIsHostCtor$1 = /^\[object .+?Constructor\]$/;
var funcProto$2 = Function.prototype, objectProto$p = Object.prototype;
var funcToString$2 = funcProto$2.toString;
var hasOwnProperty$o = objectProto$p.hasOwnProperty;
var reIsNative$1 = RegExp(
"^" + funcToString$2.call(hasOwnProperty$o).replace(reRegExpChar$1, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$"
);
function baseIsNative$2(value) {
if (!isObject$7(value) || isMasked$1(value)) {
return false;
}
var pattern2 = isFunction$5(value) ? reIsNative$1 : reIsHostCtor$1;
return pattern2.test(toSource$2(value));
}
var _baseIsNative = baseIsNative$2;
function getValue$2(object2, key2) {
return object2 == null ? void 0 : object2[key2];
}
var _getValue = getValue$2;
var baseIsNative$1 = _baseIsNative, getValue$1 = _getValue;
function getNative$7(object2, key2) {
var value = getValue$1(object2, key2);
return baseIsNative$1(value) ? value : void 0;
}
var _getNative = getNative$7;
var getNative$6 = _getNative, root$7 = _root;
var Map$6 = getNative$6(root$7, "Map");
var _Map = Map$6;
var getNative$5 = _getNative;
var nativeCreate$6 = getNative$5(Object, "create");
var _nativeCreate = nativeCreate$6;
var nativeCreate$5 = _nativeCreate;
function hashClear$2() {
this.__data__ = nativeCreate$5 ? nativeCreate$5(null) : {};
this.size = 0;
}
var _hashClear = hashClear$2;
function hashDelete$2(key2) {
var result = this.has(key2) && delete this.__data__[key2];
this.size -= result ? 1 : 0;
return result;
}
var _hashDelete = hashDelete$2;
var nativeCreate$4 = _nativeCreate;
var HASH_UNDEFINED$5 = "__lodash_hash_undefined__";
var objectProto$o = Object.prototype;
var hasOwnProperty$n = objectProto$o.hasOwnProperty;
function hashGet$2(key2) {
var data = this.__data__;
if (nativeCreate$4) {
var result = data[key2];
return result === HASH_UNDEFINED$5 ? void 0 : result;
}
return hasOwnProperty$n.call(data, key2) ? data[key2] : void 0;
}
var _hashGet = hashGet$2;
var nativeCreate$3 = _nativeCreate;
var objectProto$n = Object.prototype;
var hasOwnProperty$m = objectProto$n.hasOwnProperty;
function hashHas$2(key2) {
var data = this.__data__;
return nativeCreate$3 ? data[key2] !== void 0 : hasOwnProperty$m.call(data, key2);
}
var _hashHas = hashHas$2;
var nativeCreate$2 = _nativeCreate;
var HASH_UNDEFINED$4 = "__lodash_hash_undefined__";
function hashSet$2(key2, value) {
var data = this.__data__;
this.size += this.has(key2) ? 0 : 1;
data[key2] = nativeCreate$2 && value === void 0 ? HASH_UNDEFINED$4 : value;
return this;
}
var _hashSet = hashSet$2;
var hashClear$1 = _hashClear, hashDelete$1 = _hashDelete, hashGet$1 = _hashGet, hashHas$1 = _hashHas, hashSet$1 = _hashSet;
function Hash$2(entries) {
var index2 = -1, length = entries == null ? 0 : entries.length;
this.clear();
while (++index2 < length) {
var entry = entries[index2];
this.set(entry[0], entry[1]);
}
}
Hash$2.prototype.clear = hashClear$1;
Hash$2.prototype["delete"] = hashDelete$1;
Hash$2.prototype.get = hashGet$1;
Hash$2.prototype.has = hashHas$1;
Hash$2.prototype.set = hashSet$1;
var _Hash = Hash$2;
var Hash$1 = _Hash, ListCache$3 = _ListCache, Map$5 = _Map;
function mapCacheClear$2() {
this.size = 0;
this.__data__ = {
"hash": new Hash$1(),
"map": new (Map$5 || ListCache$3)(),
"string": new Hash$1()
};
}
var _mapCacheClear = mapCacheClear$2;
function isKeyable$2(value) {
var type2 = typeof value;
return type2 == "string" || type2 == "number" || type2 == "symbol" || type2 == "boolean" ? value !== "__proto__" : value === null;
}
var _isKeyable = isKeyable$2;
var isKeyable$1 = _isKeyable;
function getMapData$5(map, key2) {
var data = map.__data__;
return isKeyable$1(key2) ? data[typeof key2 == "string" ? "string" : "hash"] : data.map;
}
var _getMapData = getMapData$5;
var getMapData$4 = _getMapData;
function mapCacheDelete$2(key2) {
var result = getMapData$4(this, key2)["delete"](key2);
this.size -= result ? 1 : 0;
return result;
}
var _mapCacheDelete = mapCacheDelete$2;
var getMapData$3 = _getMapData;
function mapCacheGet$2(key2) {
return getMapData$3(this, key2).get(key2);
}
var _mapCacheGet = mapCacheGet$2;
var getMapData$2 = _getMapData;
function mapCacheHas$2(key2) {
return getMapData$2(this, key2).has(key2);
}
var _mapCacheHas = mapCacheHas$2;
var getMapData$1 = _getMapData;
function mapCacheSet$2(key2, value) {
var data = getMapData$1(this, key2), size = data.size;
data.set(key2, value);
this.size += data.size == size ? 0 : 1;
return this;
}
var _mapCacheSet = mapCacheSet$2;
var mapCacheClear$1 = _mapCacheClear, mapCacheDelete$1 = _mapCacheDelete, mapCacheGet$1 = _mapCacheGet, mapCacheHas$1 = _mapCacheHas, mapCacheSet$1 = _mapCacheSet;
function MapCache$3(entries) {
var index2 = -1, length = entries == null ? 0 : entries.length;
this.clear();
while (++index2 < length) {
var entry = entries[index2];
this.set(entry[0], entry[1]);
}
}
MapCache$3.prototype.clear = mapCacheClear$1;
MapCache$3.prototype["delete"] = mapCacheDelete$1;
MapCache$3.prototype.get = mapCacheGet$1;
MapCache$3.prototype.has = mapCacheHas$1;
MapCache$3.prototype.set = mapCacheSet$1;
var _MapCache = MapCache$3;
var ListCache$2 = _ListCache, Map$4 = _Map, MapCache$2 = _MapCache;
var LARGE_ARRAY_SIZE$1 = 200;
function stackSet$2(key2, value) {
var data = this.__data__;
if (data instanceof ListCache$2) {
var pairs = data.__data__;
if (!Map$4 || pairs.length < LARGE_ARRAY_SIZE$1 - 1) {
pairs.push([key2, value]);
this.size = ++data.size;
return this;
}
data = this.__data__ = new MapCache$2(pairs);
}
data.set(key2, value);
this.size = data.size;
return this;
}
var _stackSet = stackSet$2;
var ListCache$1 = _ListCache, stackClear$1 = _stackClear, stackDelete$1 = _stackDelete, stackGet$1 = _stackGet, stackHas$1 = _stackHas, stackSet$1 = _stackSet;
function Stack$2(entries) {
var data = this.__data__ = new ListCache$1(entries);
this.size = data.size;
}
Stack$2.prototype.clear = stackClear$1;
Stack$2.prototype["delete"] = stackDelete$1;
Stack$2.prototype.get = stackGet$1;
Stack$2.prototype.has = stackHas$1;
Stack$2.prototype.set = stackSet$1;
var _Stack = Stack$2;
var HASH_UNDEFINED$3 = "__lodash_hash_undefined__";
function setCacheAdd$2(value) {
this.__data__.set(value, HASH_UNDEFINED$3);
return this;
}
var _setCacheAdd = setCacheAdd$2;
function setCacheHas$2(value) {
return this.__data__.has(value);
}
var _setCacheHas = setCacheHas$2;
var MapCache$1 = _MapCache, setCacheAdd$1 = _setCacheAdd, setCacheHas$1 = _setCacheHas;
function SetCache$2(values) {
var index2 = -1, length = values == null ? 0 : values.length;
this.__data__ = new MapCache$1();
while (++index2 < length) {
this.add(values[index2]);
}
}
SetCache$2.prototype.add = SetCache$2.prototype.push = setCacheAdd$1;
SetCache$2.prototype.has = setCacheHas$1;
var _SetCache = SetCache$2;
function arraySome$2(array2, predicate) {
var index2 = -1, length = array2 == null ? 0 : array2.length;
while (++index2 < length) {
if (predicate(array2[index2], index2, array2)) {
return true;
}
}
return false;
}
var _arraySome = arraySome$2;
function cacheHas$2(cache, key2) {
return cache.has(key2);
}
var _cacheHas = cacheHas$2;
var SetCache$1 = _SetCache, arraySome$1 = _arraySome, cacheHas$1 = _cacheHas;
var COMPARE_PARTIAL_FLAG$9 = 1, COMPARE_UNORDERED_FLAG$5 = 2;
function equalArrays$3(array2, other, bitmask, customizer, equalFunc, stack) {
var isPartial = bitmask & COMPARE_PARTIAL_FLAG$9, arrLength = array2.length, othLength = other.length;
if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
return false;
}
var arrStacked = stack.get(array2);
var othStacked = stack.get(other);
if (arrStacked && othStacked) {
return arrStacked == other && othStacked == array2;
}
var index2 = -1, result = true, seen = bitmask & COMPARE_UNORDERED_FLAG$5 ? new SetCache$1() : void 0;
stack.set(array2, other);
stack.set(other, array2);
while (++index2 < arrLength) {
var arrValue = array2[index2], othValue = other[index2];
if (customizer) {
var compared = isPartial ? customizer(othValue, arrValue, index2, other, array2, stack) : customizer(arrValue, othValue, index2, array2, other, stack);
}
if (compared !== void 0) {
if (compared) {
continue;
}
result = false;
break;
}
if (seen) {
if (!arraySome$1(other, function(othValue2, othIndex) {
if (!cacheHas$1(seen, othIndex) && (arrValue === othValue2 || equalFunc(arrValue, othValue2, bitmask, customizer, stack))) {
return seen.push(othIndex);
}
})) {
result = false;
break;
}
} else if (!(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
result = false;
break;
}
}
stack["delete"](array2);
stack["delete"](other);
return result;
}
var _equalArrays = equalArrays$3;
var root$6 = _root;
var Uint8Array$4 = root$6.Uint8Array;
var _Uint8Array = Uint8Array$4;
function mapToArray$2(map) {
var index2 = -1, result = Array(map.size);
map.forEach(function(value, key2) {
result[++index2] = [key2, value];
});
return result;
}
var _mapToArray = mapToArray$2;
function setToArray$2(set2) {
var index2 = -1, result = Array(set2.size);
set2.forEach(function(value) {
result[++index2] = value;
});
return result;
}
var _setToArray = setToArray$2;
var Symbol$4 = _Symbol, Uint8Array$3 = _Uint8Array, eq$1 = eq_1, equalArrays$2 = _equalArrays, mapToArray$1 = _mapToArray, setToArray$1 = _setToArray;
var COMPARE_PARTIAL_FLAG$8 = 1, COMPARE_UNORDERED_FLAG$4 = 2;
var boolTag$5 = "[object Boolean]", dateTag$5 = "[object Date]", errorTag$4 = "[object Error]", mapTag$8 = "[object Map]", numberTag$5 = "[object Number]", regexpTag$5 = "[object RegExp]", setTag$8 = "[object Set]", stringTag$5 = "[object String]", symbolTag$4 = "[object Symbol]";
var arrayBufferTag$5 = "[object ArrayBuffer]", dataViewTag$7 = "[object DataView]";
var symbolProto$3 = Symbol$4 ? Symbol$4.prototype : void 0, symbolValueOf$2 = symbolProto$3 ? symbolProto$3.valueOf : void 0;
function equalByTag$2(object2, other, tag, bitmask, customizer, equalFunc, stack) {
switch (tag) {
case dataViewTag$7:
if (object2.byteLength != other.byteLength || object2.byteOffset != other.byteOffset) {
return false;
}
object2 = object2.buffer;
other = other.buffer;
case arrayBufferTag$5:
if (object2.byteLength != other.byteLength || !equalFunc(new Uint8Array$3(object2), new Uint8Array$3(other))) {
return false;
}
return true;
case boolTag$5:
case dateTag$5:
case numberTag$5:
return eq$1(+object2, +other);
case errorTag$4:
return object2.name == other.name && object2.message == other.message;
case regexpTag$5:
case stringTag$5:
return object2 == other + "";
case mapTag$8:
var convert2 = mapToArray$1;
case setTag$8:
var isPartial = bitmask & COMPARE_PARTIAL_FLAG$8;
convert2 || (convert2 = setToArray$1);
if (object2.size != other.size && !isPartial) {
return false;
}
var stacked = stack.get(object2);
if (stacked) {
return stacked == other;
}
bitmask |= COMPARE_UNORDERED_FLAG$4;
stack.set(object2, other);
var result = equalArrays$2(convert2(object2), convert2(other), bitmask, customizer, equalFunc, stack);
stack["delete"](object2);
return result;
case symbolTag$4:
if (symbolValueOf$2) {
return symbolValueOf$2.call(object2) == symbolValueOf$2.call(other);
}
}
return false;
}
var _equalByTag = equalByTag$2;
function arrayPush$2(array2, values) {
var index2 = -1, length = values.length, offset2 = array2.length;
while (++index2 < length) {
array2[offset2 + index2] = values[index2];
}
return array2;
}
var _arrayPush = arrayPush$2;
var arrayPush$1 = _arrayPush, isArray$7 = isArray_1;
function baseGetAllKeys$2(object2, keysFunc, symbolsFunc) {
var result = keysFunc(object2);
return isArray$7(object2) ? result : arrayPush$1(result, symbolsFunc(object2));
}
var _baseGetAllKeys = baseGetAllKeys$2;
function arrayFilter$2(array2, predicate) {
var index2 = -1, length = array2 == null ? 0 : array2.length, resIndex = 0, result = [];
while (++index2 < length) {
var value = array2[index2];
if (predicate(value, index2, array2)) {
result[resIndex++] = value;
}
}
return result;
}
var _arrayFilter = arrayFilter$2;
function stubArray$2() {
return [];
}
var stubArray_1 = stubArray$2;
var arrayFilter$1 = _arrayFilter, stubArray$1 = stubArray_1;
var objectProto$m = Object.prototype;
var propertyIsEnumerable$3 = objectProto$m.propertyIsEnumerable;
var nativeGetSymbols$2 = Object.getOwnPropertySymbols;
var getSymbols$3 = !nativeGetSymbols$2 ? stubArray$1 : function(object2) {
if (object2 == null) {
return [];
}
object2 = Object(object2);
return arrayFilter$1(nativeGetSymbols$2(object2), function(symbol2) {
return propertyIsEnumerable$3.call(object2, symbol2);
});
};
var _getSymbols = getSymbols$3;
function baseTimes$2(n2, iteratee) {
var index2 = -1, result = Array(n2);
while (++index2 < n2) {
result[index2] = iteratee(index2);
}
return result;
}
var _baseTimes = baseTimes$2;
var baseGetTag$3 = _baseGetTag, isObjectLike$4 = isObjectLike_1;
var argsTag$6 = "[object Arguments]";
function baseIsArguments$2(value) {
return isObjectLike$4(value) && baseGetTag$3(value) == argsTag$6;
}
var _baseIsArguments = baseIsArguments$2;
var baseIsArguments$1 = _baseIsArguments, isObjectLike$3 = isObjectLike_1;
var objectProto$l = Object.prototype;
var hasOwnProperty$l = objectProto$l.hasOwnProperty;
var propertyIsEnumerable$2 = objectProto$l.propertyIsEnumerable;
var isArguments$3 = baseIsArguments$1(function() {
return arguments;
}()) ? baseIsArguments$1 : function(value) {
return isObjectLike$3(value) && hasOwnProperty$l.call(value, "callee") && !propertyIsEnumerable$2.call(value, "callee");
};
var isArguments_1 = isArguments$3;
var isBuffer$5 = { exports: {} };
function stubFalse$1() {
return false;
}
var stubFalse_1 = stubFalse$1;
(function(module2, exports2) {
var root2 = _root, stubFalse2 = stubFalse_1;
var freeExports2 = exports2 && !exports2.nodeType && exports2;
var freeModule2 = freeExports2 && true && module2 && !module2.nodeType && module2;
var moduleExports2 = freeModule2 && freeModule2.exports === freeExports2;
var Buffer2 = moduleExports2 ? root2.Buffer : void 0;
var nativeIsBuffer2 = Buffer2 ? Buffer2.isBuffer : void 0;
var isBuffer2 = nativeIsBuffer2 || stubFalse2;
module2.exports = isBuffer2;
})(isBuffer$5, isBuffer$5.exports);
var MAX_SAFE_INTEGER$3 = 9007199254740991;
var reIsUint$1 = /^(?:0|[1-9]\d*)$/;
function isIndex$2(value, length) {
var type2 = typeof value;
length = length == null ? MAX_SAFE_INTEGER$3 : length;
return !!length && (type2 == "number" || type2 != "symbol" && reIsUint$1.test(value)) && (value > -1 && value % 1 == 0 && value < length);
}
var _isIndex = isIndex$2;
var MAX_SAFE_INTEGER$2 = 9007199254740991;
function isLength$3(value) {
return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER$2;
}
var isLength_1 = isLength$3;
var baseGetTag$2 = _baseGetTag, isLength$2 = isLength_1, isObjectLike$2 = isObjectLike_1;
var argsTag$5 = "[object Arguments]", arrayTag$4 = "[object Array]", boolTag$4 = "[object Boolean]", dateTag$4 = "[object Date]", errorTag$3 = "[object Error]", funcTag$3 = "[object Function]", mapTag$7 = "[object Map]", numberTag$4 = "[object Number]", objectTag$6 = "[object Object]", regexpTag$4 = "[object RegExp]", setTag$7 = "[object Set]", stringTag$4 = "[object String]", weakMapTag$4 = "[object WeakMap]";
var arrayBufferTag$4 = "[object ArrayBuffer]", dataViewTag$6 = "[object DataView]", float32Tag$3 = "[object Float32Array]", float64Tag$3 = "[object Float64Array]", int8Tag$3 = "[object Int8Array]", int16Tag$3 = "[object Int16Array]", int32Tag$3 = "[object Int32Array]", uint8Tag$3 = "[object Uint8Array]", uint8ClampedTag$3 = "[object Uint8ClampedArray]", uint16Tag$3 = "[object Uint16Array]", uint32Tag$3 = "[object Uint32Array]";
var typedArrayTags$1 = {};
typedArrayTags$1[float32Tag$3] = typedArrayTags$1[float64Tag$3] = typedArrayTags$1[int8Tag$3] = typedArrayTags$1[int16Tag$3] = typedArrayTags$1[int32Tag$3] = typedArrayTags$1[uint8Tag$3] = typedArrayTags$1[uint8ClampedTag$3] = typedArrayTags$1[uint16Tag$3] = typedArrayTags$1[uint32Tag$3] = true;
typedArrayTags$1[argsTag$5] = typedArrayTags$1[arrayTag$4] = typedArrayTags$1[arrayBufferTag$4] = typedArrayTags$1[boolTag$4] = typedArrayTags$1[dataViewTag$6] = typedArrayTags$1[dateTag$4] = typedArrayTags$1[errorTag$3] = typedArrayTags$1[funcTag$3] = typedArrayTags$1[mapTag$7] = typedArrayTags$1[numberTag$4] = typedArrayTags$1[objectTag$6] = typedArrayTags$1[regexpTag$4] = typedArrayTags$1[setTag$7] = typedArrayTags$1[stringTag$4] = typedArrayTags$1[weakMapTag$4] = false;
function baseIsTypedArray$2(value) {
return isObjectLike$2(value) && isLength$2(value.length) && !!typedArrayTags$1[baseGetTag$2(value)];
}
var _baseIsTypedArray = baseIsTypedArray$2;
function baseUnary$2(func) {
return function(value) {
return func(value);
};
}
var _baseUnary = baseUnary$2;
var _nodeUtil = { exports: {} };
(function(module2, exports2) {
var freeGlobal2 = _freeGlobal;
var freeExports2 = exports2 && !exports2.nodeType && exports2;
var freeModule2 = freeExports2 && true && module2 && !module2.nodeType && module2;
var moduleExports2 = freeModule2 && freeModule2.exports === freeExports2;
var freeProcess2 = moduleExports2 && freeGlobal2.process;
var nodeUtil2 = function() {
try {
var types2 = freeModule2 && freeModule2.require && freeModule2.require("util").types;
if (types2) {
return types2;
}
return freeProcess2 && freeProcess2.binding && freeProcess2.binding("util");
} catch (e2) {
}
}();
module2.exports = nodeUtil2;
})(_nodeUtil, _nodeUtil.exports);
var baseIsTypedArray$1 = _baseIsTypedArray, baseUnary$1 = _baseUnary, nodeUtil$2 = _nodeUtil.exports;
var nodeIsTypedArray$1 = nodeUtil$2 && nodeUtil$2.isTypedArray;
var isTypedArray$5 = nodeIsTypedArray$1 ? baseUnary$1(nodeIsTypedArray$1) : baseIsTypedArray$1;
var isTypedArray_1 = isTypedArray$5;
var baseTimes$1 = _baseTimes, isArguments$2 = isArguments_1, isArray$6 = isArray_1, isBuffer$4 = isBuffer$5.exports, isIndex$1 = _isIndex, isTypedArray$4 = isTypedArray_1;
var objectProto$k = Object.prototype;
var hasOwnProperty$k = objectProto$k.hasOwnProperty;
function arrayLikeKeys$2(value, inherited) {
var isArr = isArray$6(value), isArg = !isArr && isArguments$2(value), isBuff = !isArr && !isArg && isBuffer$4(value), isType = !isArr && !isArg && !isBuff && isTypedArray$4(value), skipIndexes = isArr || isArg || isBuff || isType, result = skipIndexes ? baseTimes$1(value.length, String) : [], length = result.length;
for (var key2 in value) {
if ((inherited || hasOwnProperty$k.call(value, key2)) && !(skipIndexes && (key2 == "length" || isBuff && (key2 == "offset" || key2 == "parent") || isType && (key2 == "buffer" || key2 == "byteLength" || key2 == "byteOffset") || isIndex$1(key2, length)))) {
result.push(key2);
}
}
return result;
}
var _arrayLikeKeys = arrayLikeKeys$2;
var objectProto$j = Object.prototype;
function isPrototype$2(value) {
var Ctor = value && value.constructor, proto2 = typeof Ctor == "function" && Ctor.prototype || objectProto$j;
return value === proto2;
}
var _isPrototype = isPrototype$2;
function overArg$2(func, transform) {
return function(arg) {
return func(transform(arg));
};
}
var _overArg = overArg$2;
var overArg$1 = _overArg;
var nativeKeys$3 = overArg$1(Object.keys, Object);
var _nativeKeys = nativeKeys$3;
var isPrototype$1 = _isPrototype, nativeKeys$2 = _nativeKeys;
var objectProto$i = Object.prototype;
var hasOwnProperty$j = objectProto$i.hasOwnProperty;
function baseKeys$2(object2) {
if (!isPrototype$1(object2)) {
return nativeKeys$2(object2);
}
var result = [];
for (var key2 in Object(object2)) {
if (hasOwnProperty$j.call(object2, key2) && key2 != "constructor") {
result.push(key2);
}
}
return result;
}
var _baseKeys = baseKeys$2;
var isFunction$4 = isFunction_1, isLength$1 = isLength_1;
function isArrayLike$2(value) {
return value != null && isLength$1(value.length) && !isFunction$4(value);
}
var isArrayLike_1 = isArrayLike$2;
var arrayLikeKeys$1 = _arrayLikeKeys, baseKeys$1 = _baseKeys, isArrayLike$1 = isArrayLike_1;
function keys$2(object2) {
return isArrayLike$1(object2) ? arrayLikeKeys$1(object2) : baseKeys$1(object2);
}
var keys_1 = keys$2;
var baseGetAllKeys$1 = _baseGetAllKeys, getSymbols$2 = _getSymbols, keys$1 = keys_1;
function getAllKeys$3(object2) {
return baseGetAllKeys$1(object2, keys$1, getSymbols$2);
}
var _getAllKeys = getAllKeys$3;
var getAllKeys$2 = _getAllKeys;
var COMPARE_PARTIAL_FLAG$7 = 1;
var objectProto$h = Object.prototype;
var hasOwnProperty$i = objectProto$h.hasOwnProperty;
function equalObjects$2(object2, other, bitmask, customizer, equalFunc, stack) {
var isPartial = bitmask & COMPARE_PARTIAL_FLAG$7, objProps = getAllKeys$2(object2), objLength = objProps.length, othProps = getAllKeys$2(other), othLength = othProps.length;
if (objLength != othLength && !isPartial) {
return false;
}
var index2 = objLength;
while (index2--) {
var key2 = objProps[index2];
if (!(isPartial ? key2 in other : hasOwnProperty$i.call(other, key2))) {
return false;
}
}
var objStacked = stack.get(object2);
var othStacked = stack.get(other);
if (objStacked && othStacked) {
return objStacked == other && othStacked == object2;
}
var result = true;
stack.set(object2, other);
stack.set(other, object2);
var skipCtor = isPartial;
while (++index2 < objLength) {
key2 = objProps[index2];
var objValue = object2[key2], othValue = other[key2];
if (customizer) {
var compared = isPartial ? customizer(othValue, objValue, key2, other, object2, stack) : customizer(objValue, othValue, key2, object2, other, stack);
}
if (!(compared === void 0 ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared)) {
result = false;
break;
}
skipCtor || (skipCtor = key2 == "constructor");
}
if (result && !skipCtor) {
var objCtor = object2.constructor, othCtor = other.constructor;
if (objCtor != othCtor && ("constructor" in object2 && "constructor" in other) && !(typeof objCtor == "function" && objCtor instanceof objCtor && typeof othCtor == "function" && othCtor instanceof othCtor)) {
result = false;
}
}
stack["delete"](object2);
stack["delete"](other);
return result;
}
var _equalObjects = equalObjects$2;
var getNative$4 = _getNative, root$5 = _root;
var DataView$3 = getNative$4(root$5, "DataView");
var _DataView = DataView$3;
var getNative$3 = _getNative, root$4 = _root;
var Promise$4 = getNative$3(root$4, "Promise");
var _Promise = Promise$4;
var getNative$2 = _getNative, root$3 = _root;
var Set$4 = getNative$2(root$3, "Set");
var _Set = Set$4;
var getNative$1 = _getNative, root$2 = _root;
var WeakMap$4 = getNative$1(root$2, "WeakMap");
var _WeakMap = WeakMap$4;
var DataView$2 = _DataView, Map$3 = _Map, Promise$3 = _Promise, Set$3 = _Set, WeakMap$3 = _WeakMap, baseGetTag$1 = _baseGetTag, toSource$1 = _toSource;
var mapTag$6 = "[object Map]", objectTag$5 = "[object Object]", promiseTag$1 = "[object Promise]", setTag$6 = "[object Set]", weakMapTag$3 = "[object WeakMap]";
var dataViewTag$5 = "[object DataView]";
var dataViewCtorString$1 = toSource$1(DataView$2), mapCtorString$1 = toSource$1(Map$3), promiseCtorString$1 = toSource$1(Promise$3), setCtorString$1 = toSource$1(Set$3), weakMapCtorString$1 = toSource$1(WeakMap$3);
var getTag$3 = baseGetTag$1;
if (DataView$2 && getTag$3(new DataView$2(new ArrayBuffer(1))) != dataViewTag$5 || Map$3 && getTag$3(new Map$3()) != mapTag$6 || Promise$3 && getTag$3(Promise$3.resolve()) != promiseTag$1 || Set$3 && getTag$3(new Set$3()) != setTag$6 || WeakMap$3 && getTag$3(new WeakMap$3()) != weakMapTag$3) {
getTag$3 = function(value) {
var result = baseGetTag$1(value), Ctor = result == objectTag$5 ? value.constructor : void 0, ctorString = Ctor ? toSource$1(Ctor) : "";
if (ctorString) {
switch (ctorString) {
case dataViewCtorString$1:
return dataViewTag$5;
case mapCtorString$1:
return mapTag$6;
case promiseCtorString$1:
return promiseTag$1;
case setCtorString$1:
return setTag$6;
case weakMapCtorString$1:
return weakMapTag$3;
}
}
return result;
};
}
var _getTag = getTag$3;
var Stack$1 = _Stack, equalArrays$1 = _equalArrays, equalByTag$1 = _equalByTag, equalObjects$1 = _equalObjects, getTag$2 = _getTag, isArray$5 = isArray_1, isBuffer$3 = isBuffer$5.exports, isTypedArray$3 = isTypedArray_1;
var COMPARE_PARTIAL_FLAG$6 = 1;
var argsTag$4 = "[object Arguments]", arrayTag$3 = "[object Array]", objectTag$4 = "[object Object]";
var objectProto$g = Object.prototype;
var hasOwnProperty$h = objectProto$g.hasOwnProperty;
function baseIsEqualDeep$2(object2, other, bitmask, customizer, equalFunc, stack) {
var objIsArr = isArray$5(object2), othIsArr = isArray$5(other), objTag = objIsArr ? arrayTag$3 : getTag$2(object2), othTag = othIsArr ? arrayTag$3 : getTag$2(other);
objTag = objTag == argsTag$4 ? objectTag$4 : objTag;
othTag = othTag == argsTag$4 ? objectTag$4 : othTag;
var objIsObj = objTag == objectTag$4, othIsObj = othTag == objectTag$4, isSameTag = objTag == othTag;
if (isSameTag && isBuffer$3(object2)) {
if (!isBuffer$3(other)) {
return false;
}
objIsArr = true;
objIsObj = false;
}
if (isSameTag && !objIsObj) {
stack || (stack = new Stack$1());
return objIsArr || isTypedArray$3(object2) ? equalArrays$1(object2, other, bitmask, customizer, equalFunc, stack) : equalByTag$1(object2, other, objTag, bitmask, customizer, equalFunc, stack);
}
if (!(bitmask & COMPARE_PARTIAL_FLAG$6)) {
var objIsWrapped = objIsObj && hasOwnProperty$h.call(object2, "__wrapped__"), othIsWrapped = othIsObj && hasOwnProperty$h.call(other, "__wrapped__");
if (objIsWrapped || othIsWrapped) {
var objUnwrapped = objIsWrapped ? object2.value() : object2, othUnwrapped = othIsWrapped ? other.value() : other;
stack || (stack = new Stack$1());
return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
}
}
if (!isSameTag) {
return false;
}
stack || (stack = new Stack$1());
return equalObjects$1(object2, other, bitmask, customizer, equalFunc, stack);
}
var _baseIsEqualDeep = baseIsEqualDeep$2;
var baseIsEqualDeep$1 = _baseIsEqualDeep, isObjectLike$1 = isObjectLike_1;
function baseIsEqual$2(value, other, bitmask, customizer, stack) {
if (value === other) {
return true;
}
if (value == null || other == null || !isObjectLike$1(value) && !isObjectLike$1(other)) {
return value !== value && other !== other;
}
return baseIsEqualDeep$1(value, other, bitmask, customizer, baseIsEqual$2, stack);
}
var _baseIsEqual = baseIsEqual$2;
var baseIsEqual$1 = _baseIsEqual;
function isEqual(value, other) {
return baseIsEqual$1(value, other);
}
var isEqual_1 = isEqual;
var TreeContext = /* @__PURE__ */ React__namespace.createContext(null);
var Indent = function Indent2(_ref) {
var prefixCls = _ref.prefixCls, level = _ref.level, isStart = _ref.isStart, isEnd = _ref.isEnd;
var baseClassName = "".concat(prefixCls, "-indent-unit");
var list = [];
for (var i2 = 0; i2 < level; i2 += 1) {
var _classNames;
list.push(
/* @__PURE__ */ jsx("span", {
className: classnames(baseClassName, (_classNames = {}, _defineProperty$b(_classNames, "".concat(baseClassName, "-start"), isStart[i2]), _defineProperty$b(_classNames, "".concat(baseClassName, "-end"), isEnd[i2]), _classNames))
}, i2)
);
}
return /* @__PURE__ */ jsx("span", {
"aria-hidden": "true",
className: "".concat(prefixCls, "-indent"),
children: list
});
};
const Indent$1 = /* @__PURE__ */ React__namespace.memo(Indent);
var _excluded$6 = ["eventKey", "className", "style", "dragOver", "dragOverGapTop", "dragOverGapBottom", "isLeaf", "isStart", "isEnd", "expanded", "selected", "checked", "halfChecked", "loading", "domRef", "active", "data", "onMouseMove", "selectable"];
var ICON_OPEN = "open";
var ICON_CLOSE = "close";
var defaultTitle = "---";
var InternalTreeNode = /* @__PURE__ */ function(_React$Component) {
_inherits(InternalTreeNode2, _React$Component);
var _super = _createSuper(InternalTreeNode2);
function InternalTreeNode2() {
var _this2;
_classCallCheck(this, InternalTreeNode2);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this2 = _super.call.apply(_super, [this].concat(args));
_this2.state = {
dragNodeHighlight: false
};
_this2.selectHandle = void 0;
_this2.onSelectorClick = function(e2) {
var onNodeClick = _this2.props.context.onNodeClick;
onNodeClick(e2, convertNodePropsToEventData(_this2.props));
if (_this2.isSelectable()) {
_this2.onSelect(e2);
} else {
_this2.onCheck(e2);
}
};
_this2.onSelectorDoubleClick = function(e2) {
var onNodeDoubleClick = _this2.props.context.onNodeDoubleClick;
onNodeDoubleClick(e2, convertNodePropsToEventData(_this2.props));
};
_this2.onSelect = function(e2) {
if (_this2.isDisabled())
return;
var onNodeSelect = _this2.props.context.onNodeSelect;
e2.preventDefault();
onNodeSelect(e2, convertNodePropsToEventData(_this2.props));
};
_this2.onCheck = function(e2) {
if (_this2.isDisabled())
return;
var _this$props = _this2.props, disableCheckbox = _this$props.disableCheckbox, checked = _this$props.checked;
var onNodeCheck = _this2.props.context.onNodeCheck;
if (!_this2.isCheckable() || disableCheckbox)
return;
e2.preventDefault();
var targetChecked = !checked;
onNodeCheck(e2, convertNodePropsToEventData(_this2.props), targetChecked);
};
_this2.onMouseEnter = function(e2) {
var onNodeMouseEnter = _this2.props.context.onNodeMouseEnter;
onNodeMouseEnter(e2, convertNodePropsToEventData(_this2.props));
};
_this2.onMouseLeave = function(e2) {
var onNodeMouseLeave = _this2.props.context.onNodeMouseLeave;
onNodeMouseLeave(e2, convertNodePropsToEventData(_this2.props));
};
_this2.onContextMenu = function(e2) {
var onNodeContextMenu = _this2.props.context.onNodeContextMenu;
onNodeContextMenu(e2, convertNodePropsToEventData(_this2.props));
};
_this2.onDragStart = function(e2) {
var onNodeDragStart = _this2.props.context.onNodeDragStart;
e2.stopPropagation();
_this2.setState({
dragNodeHighlight: true
});
onNodeDragStart(e2, _assertThisInitialized(_this2));
try {
e2.dataTransfer.setData("text/plain", "");
} catch (error) {
}
};
_this2.onDragEnter = function(e2) {
var onNodeDragEnter = _this2.props.context.onNodeDragEnter;
e2.preventDefault();
e2.stopPropagation();
onNodeDragEnter(e2, _assertThisInitialized(_this2));
};
_this2.onDragOver = function(e2) {
var onNodeDragOver = _this2.props.context.onNodeDragOver;
e2.preventDefault();
e2.stopPropagation();
onNodeDragOver(e2, _assertThisInitialized(_this2));
};
_this2.onDragLeave = function(e2) {
var onNodeDragLeave = _this2.props.context.onNodeDragLeave;
e2.stopPropagation();
onNodeDragLeave(e2, _assertThisInitialized(_this2));
};
_this2.onDragEnd = function(e2) {
var onNodeDragEnd = _this2.props.context.onNodeDragEnd;
e2.stopPropagation();
_this2.setState({
dragNodeHighlight: false
});
onNodeDragEnd(e2, _assertThisInitialized(_this2));
};
_this2.onDrop = function(e2) {
var onNodeDrop = _this2.props.context.onNodeDrop;
e2.preventDefault();
e2.stopPropagation();
_this2.setState({
dragNodeHighlight: false
});
onNodeDrop(e2, _assertThisInitialized(_this2));
};
_this2.onExpand = function(e2) {
var _this$props2 = _this2.props, loading = _this$props2.loading, onNodeExpand = _this$props2.context.onNodeExpand;
if (loading)
return;
onNodeExpand(e2, convertNodePropsToEventData(_this2.props));
};
_this2.setSelectHandle = function(node) {
_this2.selectHandle = node;
};
_this2.getNodeState = function() {
var expanded = _this2.props.expanded;
if (_this2.isLeaf()) {
return null;
}
return expanded ? ICON_OPEN : ICON_CLOSE;
};
_this2.hasChildren = function() {
var eventKey = _this2.props.eventKey;
var keyEntities = _this2.props.context.keyEntities;
var _ref = keyEntities[eventKey] || {}, children = _ref.children;
return !!(children || []).length;
};
_this2.isLeaf = function() {
var _this$props3 = _this2.props, isLeaf = _this$props3.isLeaf, loaded = _this$props3.loaded;
var loadData = _this2.props.context.loadData;
var hasChildren = _this2.hasChildren();
if (isLeaf === false) {
return false;
}
return isLeaf || !loadData && !hasChildren || loadData && loaded && !hasChildren;
};
_this2.isDisabled = function() {
var disabled = _this2.props.disabled;
var treeDisabled = _this2.props.context.disabled;
return !!(treeDisabled || disabled);
};
_this2.isCheckable = function() {
var checkable = _this2.props.checkable;
var treeCheckable = _this2.props.context.checkable;
if (!treeCheckable || checkable === false)
return false;
return treeCheckable;
};
_this2.syncLoadData = function(props) {
var expanded = props.expanded, loading = props.loading, loaded = props.loaded;
var _this$props$context = _this2.props.context, loadData = _this$props$context.loadData, onNodeLoad = _this$props$context.onNodeLoad;
if (loading) {
return;
}
if (loadData && expanded && !_this2.isLeaf()) {
if (!_this2.hasChildren() && !loaded) {
onNodeLoad(convertNodePropsToEventData(_this2.props));
}
}
};
_this2.isDraggable = function() {
var _this$props4 = _this2.props, data = _this$props4.data, draggable = _this$props4.context.draggable;
return !!(draggable && (!draggable.nodeDraggable || draggable.nodeDraggable(data)));
};
_this2.renderDragHandler = function() {
var _this$props$context2 = _this2.props.context, draggable = _this$props$context2.draggable, prefixCls = _this$props$context2.prefixCls;
return (draggable === null || draggable === void 0 ? void 0 : draggable.icon) ? /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-draggable-icon"),
children: draggable.icon
}) : null;
};
_this2.renderSwitcherIconDom = function(isLeaf) {
var switcherIconFromProps = _this2.props.switcherIcon;
var switcherIconFromCtx = _this2.props.context.switcherIcon;
var switcherIcon = switcherIconFromProps || switcherIconFromCtx;
if (typeof switcherIcon === "function") {
return switcherIcon(_objectSpread2$a(_objectSpread2$a({}, _this2.props), {}, {
isLeaf
}));
}
return switcherIcon;
};
_this2.renderSwitcher = function() {
var expanded = _this2.props.expanded;
var prefixCls = _this2.props.context.prefixCls;
if (_this2.isLeaf()) {
var _switcherIconDom = _this2.renderSwitcherIconDom(true);
return _switcherIconDom !== false ? /* @__PURE__ */ jsx("span", {
className: classnames("".concat(prefixCls, "-switcher"), "".concat(prefixCls, "-switcher-noop")),
children: _switcherIconDom
}) : null;
}
var switcherCls = classnames("".concat(prefixCls, "-switcher"), "".concat(prefixCls, "-switcher_").concat(expanded ? ICON_OPEN : ICON_CLOSE));
var switcherIconDom = _this2.renderSwitcherIconDom(false);
return switcherIconDom !== false ? /* @__PURE__ */ jsx("span", {
onClick: _this2.onExpand,
className: switcherCls,
children: switcherIconDom
}) : null;
};
_this2.renderCheckbox = function() {
var _this$props5 = _this2.props, checked = _this$props5.checked, halfChecked = _this$props5.halfChecked, disableCheckbox = _this$props5.disableCheckbox;
var prefixCls = _this2.props.context.prefixCls;
var disabled = _this2.isDisabled();
var checkable = _this2.isCheckable();
if (!checkable)
return null;
var $custom = typeof checkable !== "boolean" ? checkable : null;
return /* @__PURE__ */ jsx("span", {
className: classnames("".concat(prefixCls, "-checkbox"), checked && "".concat(prefixCls, "-checkbox-checked"), !checked && halfChecked && "".concat(prefixCls, "-checkbox-indeterminate"), (disabled || disableCheckbox) && "".concat(prefixCls, "-checkbox-disabled")),
onClick: _this2.onCheck,
children: $custom
});
};
_this2.renderIcon = function() {
var loading = _this2.props.loading;
var prefixCls = _this2.props.context.prefixCls;
return /* @__PURE__ */ jsx("span", {
className: classnames("".concat(prefixCls, "-iconEle"), "".concat(prefixCls, "-icon__").concat(_this2.getNodeState() || "docu"), loading && "".concat(prefixCls, "-icon_loading"))
});
};
_this2.renderSelector = function() {
var dragNodeHighlight = _this2.state.dragNodeHighlight;
var _this$props6 = _this2.props, _this$props6$title = _this$props6.title, title = _this$props6$title === void 0 ? defaultTitle : _this$props6$title, selected = _this$props6.selected, icon = _this$props6.icon, loading = _this$props6.loading, data = _this$props6.data;
var _this$props$context3 = _this2.props.context, prefixCls = _this$props$context3.prefixCls, showIcon = _this$props$context3.showIcon, treeIcon = _this$props$context3.icon, loadData = _this$props$context3.loadData, titleRender = _this$props$context3.titleRender;
var disabled = _this2.isDisabled();
var wrapClass = "".concat(prefixCls, "-node-content-wrapper");
var $icon;
if (showIcon) {
var currentIcon = icon || treeIcon;
$icon = currentIcon ? /* @__PURE__ */ jsx("span", {
className: classnames("".concat(prefixCls, "-iconEle"), "".concat(prefixCls, "-icon__customize")),
children: typeof currentIcon === "function" ? currentIcon(_this2.props) : currentIcon
}) : _this2.renderIcon();
} else if (loadData && loading) {
$icon = _this2.renderIcon();
}
var titleNode;
if (typeof title === "function") {
titleNode = title(data);
} else if (titleRender) {
titleNode = titleRender(data);
} else {
titleNode = title;
}
var $title = /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-title"),
children: titleNode
});
return /* @__PURE__ */ jsxs("span", {
ref: _this2.setSelectHandle,
title: typeof title === "string" ? title : "",
className: classnames("".concat(wrapClass), "".concat(wrapClass, "-").concat(_this2.getNodeState() || "normal"), !disabled && (selected || dragNodeHighlight) && "".concat(prefixCls, "-node-selected")),
onMouseEnter: _this2.onMouseEnter,
onMouseLeave: _this2.onMouseLeave,
onContextMenu: _this2.onContextMenu,
onClick: _this2.onSelectorClick,
onDoubleClick: _this2.onSelectorDoubleClick,
children: [$icon, $title, _this2.renderDropIndicator()]
});
};
_this2.renderDropIndicator = function() {
var _this$props7 = _this2.props, disabled = _this$props7.disabled, eventKey = _this$props7.eventKey;
var _this$props$context4 = _this2.props.context, draggable = _this$props$context4.draggable, dropLevelOffset = _this$props$context4.dropLevelOffset, dropPosition = _this$props$context4.dropPosition, prefixCls = _this$props$context4.prefixCls, indent = _this$props$context4.indent, dropIndicatorRender2 = _this$props$context4.dropIndicatorRender, dragOverNodeKey = _this$props$context4.dragOverNodeKey, direction = _this$props$context4.direction;
var rootDraggable = !!draggable;
var showIndicator = !disabled && rootDraggable && dragOverNodeKey === eventKey;
return showIndicator ? dropIndicatorRender2({
dropPosition,
dropLevelOffset,
indent,
prefixCls,
direction
}) : null;
};
return _this2;
}
_createClass(InternalTreeNode2, [{
key: "componentDidMount",
value: function componentDidMount() {
this.syncLoadData(this.props);
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate() {
this.syncLoadData(this.props);
}
}, {
key: "isSelectable",
value: function isSelectable() {
var selectable = this.props.selectable;
var treeSelectable = this.props.context.selectable;
if (typeof selectable === "boolean") {
return selectable;
}
return treeSelectable;
}
}, {
key: "render",
value: function render2() {
var _classNames;
var _this$props8 = this.props, eventKey = _this$props8.eventKey, className = _this$props8.className, style2 = _this$props8.style, dragOver = _this$props8.dragOver, dragOverGapTop = _this$props8.dragOverGapTop, dragOverGapBottom = _this$props8.dragOverGapBottom, isLeaf = _this$props8.isLeaf, isStart = _this$props8.isStart, isEnd = _this$props8.isEnd, expanded = _this$props8.expanded, selected = _this$props8.selected, checked = _this$props8.checked, halfChecked = _this$props8.halfChecked, loading = _this$props8.loading, domRef = _this$props8.domRef, active = _this$props8.active;
_this$props8.data;
var onMouseMove = _this$props8.onMouseMove, selectable = _this$props8.selectable, otherProps = _objectWithoutProperties$1(_this$props8, _excluded$6);
var _this$props$context5 = this.props.context, prefixCls = _this$props$context5.prefixCls, filterTreeNode = _this$props$context5.filterTreeNode, keyEntities = _this$props$context5.keyEntities, dropContainerKey = _this$props$context5.dropContainerKey, dropTargetKey = _this$props$context5.dropTargetKey, draggingNodeKey = _this$props$context5.draggingNodeKey;
var disabled = this.isDisabled();
var dataOrAriaAttributeProps = pickAttrs(otherProps, {
aria: true,
data: true
});
var _ref2 = keyEntities[eventKey] || {}, level = _ref2.level;
var isEndNode = isEnd[isEnd.length - 1];
var mergedDraggable = this.isDraggable();
var draggableWithoutDisabled = !disabled && mergedDraggable;
var dragging = draggingNodeKey === eventKey;
var ariaSelected = selectable !== void 0 ? {
"aria-selected": !!selectable
} : void 0;
return /* @__PURE__ */ jsxs("div", {
ref: domRef,
className: classnames(className, "".concat(prefixCls, "-treenode"), (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-treenode-disabled"), disabled), _defineProperty$b(_classNames, "".concat(prefixCls, "-treenode-switcher-").concat(expanded ? "open" : "close"), !isLeaf), _defineProperty$b(_classNames, "".concat(prefixCls, "-treenode-checkbox-checked"), checked), _defineProperty$b(_classNames, "".concat(prefixCls, "-treenode-checkbox-indeterminate"), halfChecked), _defineProperty$b(_classNames, "".concat(prefixCls, "-treenode-selected"), selected), _defineProperty$b(_classNames, "".concat(prefixCls, "-treenode-loading"), loading), _defineProperty$b(_classNames, "".concat(prefixCls, "-treenode-active"), active), _defineProperty$b(_classNames, "".concat(prefixCls, "-treenode-leaf-last"), isEndNode), _defineProperty$b(_classNames, "".concat(prefixCls, "-treenode-draggable"), mergedDraggable), _defineProperty$b(_classNames, "dragging", dragging), _defineProperty$b(_classNames, "drop-target", dropTargetKey === eventKey), _defineProperty$b(_classNames, "drop-container", dropContainerKey === eventKey), _defineProperty$b(_classNames, "drag-over", !disabled && dragOver), _defineProperty$b(_classNames, "drag-over-gap-top", !disabled && dragOverGapTop), _defineProperty$b(_classNames, "drag-over-gap-bottom", !disabled && dragOverGapBottom), _defineProperty$b(_classNames, "filter-node", filterTreeNode && filterTreeNode(convertNodePropsToEventData(this.props))), _classNames)),
style: style2,
draggable: draggableWithoutDisabled,
"aria-grabbed": dragging,
onDragStart: draggableWithoutDisabled ? this.onDragStart : void 0,
onDragEnter: mergedDraggable ? this.onDragEnter : void 0,
onDragOver: mergedDraggable ? this.onDragOver : void 0,
onDragLeave: mergedDraggable ? this.onDragLeave : void 0,
onDrop: mergedDraggable ? this.onDrop : void 0,
onDragEnd: mergedDraggable ? this.onDragEnd : void 0,
onMouseMove,
...ariaSelected,
...dataOrAriaAttributeProps,
children: [/* @__PURE__ */ jsx(Indent$1, {
prefixCls,
level,
isStart,
isEnd
}), this.renderDragHandler(), this.renderSwitcher(), this.renderCheckbox(), this.renderSelector()]
});
}
}]);
return InternalTreeNode2;
}(React__namespace.Component);
var ContextTreeNode = function ContextTreeNode2(props) {
return /* @__PURE__ */ jsx(TreeContext.Consumer, {
children: function(context2) {
return /* @__PURE__ */ jsx(InternalTreeNode, {
...props,
context: context2
});
}
});
};
ContextTreeNode.displayName = "TreeNode";
ContextTreeNode.isTreeNode = 1;
function arrDel(list, value) {
if (!list)
return [];
var clone = list.slice();
var index2 = clone.indexOf(value);
if (index2 >= 0) {
clone.splice(index2, 1);
}
return clone;
}
function arrAdd(list, value) {
var clone = (list || []).slice();
if (clone.indexOf(value) === -1) {
clone.push(value);
}
return clone;
}
function posToArr(pos) {
return pos.split("-");
}
function getDragChildrenKeys(dragNodeKey, keyEntities) {
var dragChildrenKeys = [];
var entity = keyEntities[dragNodeKey];
function dig() {
var list = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : [];
list.forEach(function(_ref) {
var key2 = _ref.key, children = _ref.children;
dragChildrenKeys.push(key2);
dig(children);
});
}
dig(entity.children);
return dragChildrenKeys;
}
function isLastChild(treeNodeEntity) {
if (treeNodeEntity.parent) {
var posArr = posToArr(treeNodeEntity.pos);
return Number(posArr[posArr.length - 1]) === treeNodeEntity.parent.children.length - 1;
}
return false;
}
function isFirstChild(treeNodeEntity) {
var posArr = posToArr(treeNodeEntity.pos);
return Number(posArr[posArr.length - 1]) === 0;
}
function calcDropPosition(event, dragNode, targetNode, indent, startMousePosition, allowDrop, flattenedNodes, keyEntities, expandKeys, direction) {
var _abstractDropNodeEnti;
var clientX = event.clientX, clientY = event.clientY;
var _event$target$getBoun = event.target.getBoundingClientRect(), top = _event$target$getBoun.top, height = _event$target$getBoun.height;
var horizontalMouseOffset = (direction === "rtl" ? -1 : 1) * (((startMousePosition === null || startMousePosition === void 0 ? void 0 : startMousePosition.x) || 0) - clientX);
var rawDropLevelOffset = (horizontalMouseOffset - 12) / indent;
var abstractDropNodeEntity = keyEntities[targetNode.props.eventKey];
if (clientY < top + height / 2) {
var nodeIndex = flattenedNodes.findIndex(function(flattenedNode) {
return flattenedNode.key === abstractDropNodeEntity.key;
});
var prevNodeIndex = nodeIndex <= 0 ? 0 : nodeIndex - 1;
var prevNodeKey = flattenedNodes[prevNodeIndex].key;
abstractDropNodeEntity = keyEntities[prevNodeKey];
}
var initialAbstractDropNodeKey = abstractDropNodeEntity.key;
var abstractDragOverEntity = abstractDropNodeEntity;
var dragOverNodeKey = abstractDropNodeEntity.key;
var dropPosition = 0;
var dropLevelOffset = 0;
if (!expandKeys.includes(initialAbstractDropNodeKey)) {
for (var i2 = 0; i2 < rawDropLevelOffset; i2 += 1) {
if (isLastChild(abstractDropNodeEntity)) {
abstractDropNodeEntity = abstractDropNodeEntity.parent;
dropLevelOffset += 1;
} else {
break;
}
}
}
var abstractDragDataNode = dragNode.props.data;
var abstractDropDataNode = abstractDropNodeEntity.node;
var dropAllowed = true;
if (isFirstChild(abstractDropNodeEntity) && abstractDropNodeEntity.level === 0 && clientY < top + height / 2 && allowDrop({
dragNode: abstractDragDataNode,
dropNode: abstractDropDataNode,
dropPosition: -1
}) && abstractDropNodeEntity.key === targetNode.props.eventKey) {
dropPosition = -1;
} else if ((abstractDragOverEntity.children || []).length && expandKeys.includes(dragOverNodeKey)) {
if (allowDrop({
dragNode: abstractDragDataNode,
dropNode: abstractDropDataNode,
dropPosition: 0
})) {
dropPosition = 0;
} else {
dropAllowed = false;
}
} else if (dropLevelOffset === 0) {
if (rawDropLevelOffset > -1.5) {
if (allowDrop({
dragNode: abstractDragDataNode,
dropNode: abstractDropDataNode,
dropPosition: 1
})) {
dropPosition = 1;
} else {
dropAllowed = false;
}
} else {
if (allowDrop({
dragNode: abstractDragDataNode,
dropNode: abstractDropDataNode,
dropPosition: 0
})) {
dropPosition = 0;
} else if (allowDrop({
dragNode: abstractDragDataNode,
dropNode: abstractDropDataNode,
dropPosition: 1
})) {
dropPosition = 1;
} else {
dropAllowed = false;
}
}
} else {
if (allowDrop({
dragNode: abstractDragDataNode,
dropNode: abstractDropDataNode,
dropPosition: 1
})) {
dropPosition = 1;
} else {
dropAllowed = false;
}
}
return {
dropPosition,
dropLevelOffset,
dropTargetKey: abstractDropNodeEntity.key,
dropTargetPos: abstractDropNodeEntity.pos,
dragOverNodeKey,
dropContainerKey: dropPosition === 0 ? null : ((_abstractDropNodeEnti = abstractDropNodeEntity.parent) === null || _abstractDropNodeEnti === void 0 ? void 0 : _abstractDropNodeEnti.key) || null,
dropAllowed
};
}
function calcSelectedKeys(selectedKeys, props) {
if (!selectedKeys)
return void 0;
var multiple = props.multiple;
if (multiple) {
return selectedKeys.slice();
}
if (selectedKeys.length) {
return [selectedKeys[0]];
}
return selectedKeys;
}
function parseCheckedKeys(keys2) {
if (!keys2) {
return null;
}
var keyProps;
if (Array.isArray(keys2)) {
keyProps = {
checkedKeys: keys2,
halfCheckedKeys: void 0
};
} else if (_typeof$q(keys2) === "object") {
keyProps = {
checkedKeys: keys2.checked || void 0,
halfCheckedKeys: keys2.halfChecked || void 0
};
} else {
warningOnce(false, "`checkedKeys` is not an array or an object");
return null;
}
return keyProps;
}
function conductExpandParent(keyList, keyEntities) {
var expandedKeys = /* @__PURE__ */ new Set();
function conductUp(key2) {
if (expandedKeys.has(key2))
return;
var entity = keyEntities[key2];
if (!entity)
return;
expandedKeys.add(key2);
var parent2 = entity.parent, node = entity.node;
if (node.disabled)
return;
if (parent2) {
conductUp(parent2.key);
}
}
(keyList || []).forEach(function(key2) {
conductUp(key2);
});
return _toConsumableArray$c(expandedKeys);
}
function _objectDestructuringEmpty(obj) {
if (obj == null)
throw new TypeError("Cannot destructure " + obj);
}
function useUnmount$2(triggerStart, triggerEnd) {
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), firstMount = _React$useState2[0], setFirstMount = _React$useState2[1];
React__namespace.useLayoutEffect(function() {
if (firstMount) {
triggerStart();
return function() {
triggerEnd();
};
}
}, [firstMount]);
React__namespace.useLayoutEffect(function() {
setFirstMount(true);
return function() {
setFirstMount(false);
};
}, []);
}
var _excluded$5 = ["className", "style", "motion", "motionNodes", "motionType", "onMotionStart", "onMotionEnd", "active", "treeNodeRequiredProps"];
var MotionTreeNode = function MotionTreeNode2(_ref, ref) {
var className = _ref.className, style2 = _ref.style, motion2 = _ref.motion, motionNodes = _ref.motionNodes, motionType = _ref.motionType, onOriginMotionStart = _ref.onMotionStart, onOriginMotionEnd = _ref.onMotionEnd, active = _ref.active, treeNodeRequiredProps = _ref.treeNodeRequiredProps, props = _objectWithoutProperties$1(_ref, _excluded$5);
var _React$useState = React__namespace.useState(true), _React$useState2 = _slicedToArray$e(_React$useState, 2), visible = _React$useState2[0], setVisible = _React$useState2[1];
var _React$useContext = React__namespace.useContext(TreeContext), prefixCls = _React$useContext.prefixCls;
var targetVisible = motionNodes && motionType !== "hide";
useLayoutEffect$1(function() {
if (motionNodes) {
if (targetVisible !== visible) {
setVisible(targetVisible);
}
}
}, [motionNodes]);
var triggerMotionStart = function triggerMotionStart2() {
if (motionNodes) {
onOriginMotionStart();
}
};
var triggerMotionEndRef = React__namespace.useRef(false);
var triggerMotionEnd = function triggerMotionEnd2() {
if (motionNodes && !triggerMotionEndRef.current) {
triggerMotionEndRef.current = true;
onOriginMotionEnd();
}
};
useUnmount$2(triggerMotionStart, triggerMotionEnd);
var onVisibleChanged = function onVisibleChanged2(nextVisible) {
if (targetVisible === nextVisible) {
triggerMotionEnd();
}
};
if (motionNodes) {
return /* @__PURE__ */ jsx(CSSMotion, {
ref,
visible,
...motion2,
motionAppear: motionType === "show",
onVisibleChanged,
children: function(_ref2, motionRef) {
var motionClassName = _ref2.className, motionStyle = _ref2.style;
return /* @__PURE__ */ jsx("div", {
ref: motionRef,
className: classnames("".concat(prefixCls, "-treenode-motion"), motionClassName),
style: motionStyle,
children: motionNodes.map(function(treeNode) {
var restProps = _extends$3({}, (_objectDestructuringEmpty(treeNode.data), treeNode.data)), title = treeNode.title, key2 = treeNode.key, isStart = treeNode.isStart, isEnd = treeNode.isEnd;
delete restProps.children;
var treeNodeProps = getTreeNodeProps(key2, treeNodeRequiredProps);
return /* @__PURE__ */ React$a.createElement(ContextTreeNode, {
...restProps,
...treeNodeProps,
title,
active,
data: treeNode.data,
key: key2,
isStart,
isEnd
});
})
});
}
});
}
return /* @__PURE__ */ jsx(ContextTreeNode, {
domRef: ref,
className,
style: style2,
...props,
active
});
};
MotionTreeNode.displayName = "MotionTreeNode";
var RefMotionTreeNode = /* @__PURE__ */ React__namespace.forwardRef(MotionTreeNode);
function findExpandedKeys() {
var prev = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : [];
var next = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : [];
var prevLen = prev.length;
var nextLen = next.length;
if (Math.abs(prevLen - nextLen) !== 1) {
return {
add: false,
key: null
};
}
function find(shorter, longer) {
var cache = /* @__PURE__ */ new Map();
shorter.forEach(function(key2) {
cache.set(key2, true);
});
var keys2 = longer.filter(function(key2) {
return !cache.has(key2);
});
return keys2.length === 1 ? keys2[0] : null;
}
if (prevLen < nextLen) {
return {
add: true,
key: find(prev, next)
};
}
return {
add: false,
key: find(next, prev)
};
}
function getExpandRange(shorter, longer, key2) {
var shorterStartIndex = shorter.findIndex(function(data) {
return data.key === key2;
});
var shorterEndNode = shorter[shorterStartIndex + 1];
var longerStartIndex = longer.findIndex(function(data) {
return data.key === key2;
});
if (shorterEndNode) {
var longerEndIndex = longer.findIndex(function(data) {
return data.key === shorterEndNode.key;
});
return longer.slice(longerStartIndex + 1, longerEndIndex);
}
return longer.slice(longerStartIndex + 1);
}
var _excluded$4 = ["prefixCls", "data", "selectable", "checkable", "expandedKeys", "selectedKeys", "checkedKeys", "loadedKeys", "loadingKeys", "halfCheckedKeys", "keyEntities", "disabled", "dragging", "dragOverNodeKey", "dropPosition", "motion", "height", "itemHeight", "virtual", "focusable", "activeItem", "focused", "tabIndex", "onKeyDown", "onFocus", "onBlur", "onActiveChange", "onListChangeStart", "onListChangeEnd"];
var HIDDEN_STYLE$1 = {
width: 0,
height: 0,
display: "flex",
overflow: "hidden",
opacity: 0,
border: 0,
padding: 0,
margin: 0
};
var noop$3 = function noop2() {
};
var MOTION_KEY = "RC_TREE_MOTION_".concat(Math.random());
var MotionNode = {
key: MOTION_KEY
};
var MotionEntity = {
key: MOTION_KEY,
level: 0,
index: 0,
pos: "0",
node: MotionNode,
nodes: [MotionNode]
};
var MotionFlattenData = {
parent: null,
children: [],
pos: MotionEntity.pos,
data: MotionNode,
title: null,
key: MOTION_KEY,
isStart: [],
isEnd: []
};
function getMinimumRangeTransitionRange(list, virtual, height, itemHeight) {
if (virtual === false || !height) {
return list;
}
return list.slice(0, Math.ceil(height / itemHeight) + 1);
}
function itemKey(item) {
var key2 = item.key, pos = item.pos;
return getKey(key2, pos);
}
function getAccessibilityPath(item) {
var path2 = String(item.data.key);
var current = item;
while (current.parent) {
current = current.parent;
path2 = "".concat(current.data.key, " > ").concat(path2);
}
return path2;
}
var NodeList = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var prefixCls = props.prefixCls, data = props.data;
props.selectable;
props.checkable;
var expandedKeys = props.expandedKeys, selectedKeys = props.selectedKeys, checkedKeys = props.checkedKeys, loadedKeys = props.loadedKeys, loadingKeys = props.loadingKeys, halfCheckedKeys = props.halfCheckedKeys, keyEntities = props.keyEntities, disabled = props.disabled, dragging = props.dragging, dragOverNodeKey = props.dragOverNodeKey, dropPosition = props.dropPosition, motion2 = props.motion, height = props.height, itemHeight = props.itemHeight, virtual = props.virtual, focusable2 = props.focusable, activeItem = props.activeItem, focused = props.focused, tabIndex = props.tabIndex, onKeyDown2 = props.onKeyDown, onFocus = props.onFocus, onBlur = props.onBlur, onActiveChange = props.onActiveChange, onListChangeStart = props.onListChangeStart, onListChangeEnd = props.onListChangeEnd, domProps = _objectWithoutProperties$1(props, _excluded$4);
var listRef = React__namespace.useRef(null);
var indentMeasurerRef = React__namespace.useRef(null);
React__namespace.useImperativeHandle(ref, function() {
return {
scrollTo: function scrollTo2(scroll) {
listRef.current.scrollTo(scroll);
},
getIndentWidth: function getIndentWidth() {
return indentMeasurerRef.current.offsetWidth;
}
};
});
var _React$useState = React__namespace.useState(expandedKeys), _React$useState2 = _slicedToArray$e(_React$useState, 2), prevExpandedKeys = _React$useState2[0], setPrevExpandedKeys = _React$useState2[1];
var _React$useState3 = React__namespace.useState(data), _React$useState4 = _slicedToArray$e(_React$useState3, 2), prevData = _React$useState4[0], setPrevData = _React$useState4[1];
var _React$useState5 = React__namespace.useState(data), _React$useState6 = _slicedToArray$e(_React$useState5, 2), transitionData = _React$useState6[0], setTransitionData = _React$useState6[1];
var _React$useState7 = React__namespace.useState([]), _React$useState8 = _slicedToArray$e(_React$useState7, 2), transitionRange = _React$useState8[0], setTransitionRange = _React$useState8[1];
var _React$useState9 = React__namespace.useState(null), _React$useState10 = _slicedToArray$e(_React$useState9, 2), motionType = _React$useState10[0], setMotionType = _React$useState10[1];
var dataRef = React__namespace.useRef(data);
dataRef.current = data;
function onMotionEnd() {
var latestData = dataRef.current;
setPrevData(latestData);
setTransitionData(latestData);
setTransitionRange([]);
setMotionType(null);
onListChangeEnd();
}
useLayoutEffect$1(function() {
setPrevExpandedKeys(expandedKeys);
var diffExpanded = findExpandedKeys(prevExpandedKeys, expandedKeys);
if (diffExpanded.key !== null) {
if (diffExpanded.add) {
var keyIndex = prevData.findIndex(function(_ref) {
var key2 = _ref.key;
return key2 === diffExpanded.key;
});
var rangeNodes = getMinimumRangeTransitionRange(getExpandRange(prevData, data, diffExpanded.key), virtual, height, itemHeight);
var newTransitionData = prevData.slice();
newTransitionData.splice(keyIndex + 1, 0, MotionFlattenData);
setTransitionData(newTransitionData);
setTransitionRange(rangeNodes);
setMotionType("show");
} else {
var _keyIndex = data.findIndex(function(_ref2) {
var key2 = _ref2.key;
return key2 === diffExpanded.key;
});
var _rangeNodes = getMinimumRangeTransitionRange(getExpandRange(data, prevData, diffExpanded.key), virtual, height, itemHeight);
var _newTransitionData = data.slice();
_newTransitionData.splice(_keyIndex + 1, 0, MotionFlattenData);
setTransitionData(_newTransitionData);
setTransitionRange(_rangeNodes);
setMotionType("hide");
}
} else if (prevData !== data) {
setPrevData(data);
setTransitionData(data);
}
}, [expandedKeys, data]);
React__namespace.useEffect(function() {
if (!dragging) {
onMotionEnd();
}
}, [dragging]);
var mergedData = motion2 ? transitionData : data;
var treeNodeRequiredProps = {
expandedKeys,
selectedKeys,
loadedKeys,
loadingKeys,
checkedKeys,
halfCheckedKeys,
dragOverNodeKey,
dropPosition,
keyEntities
};
return /* @__PURE__ */ jsxs(Fragment, {
children: [focused && activeItem && /* @__PURE__ */ jsx("span", {
style: HIDDEN_STYLE$1,
"aria-live": "assertive",
children: getAccessibilityPath(activeItem)
}), /* @__PURE__ */ jsx("div", {
children: /* @__PURE__ */ jsx("input", {
style: HIDDEN_STYLE$1,
disabled: focusable2 === false || disabled,
tabIndex: focusable2 !== false ? tabIndex : null,
onKeyDown: onKeyDown2,
onFocus,
onBlur,
value: "",
onChange: noop$3,
"aria-label": "for screen reader"
})
}), /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-treenode"),
"aria-hidden": true,
style: {
position: "absolute",
pointerEvents: "none",
visibility: "hidden",
height: 0,
overflow: "hidden",
border: 0,
padding: 0
},
children: /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-indent"),
children: /* @__PURE__ */ jsx("div", {
ref: indentMeasurerRef,
className: "".concat(prefixCls, "-indent-unit")
})
})
}), /* @__PURE__ */ jsx(List$1, {
...domProps,
data: mergedData,
itemKey,
height,
fullHeight: false,
virtual,
itemHeight,
prefixCls: "".concat(prefixCls, "-list"),
ref: listRef,
onVisibleChange: function onVisibleChange(originList, fullList) {
var originSet = new Set(originList);
var restList = fullList.filter(function(item) {
return !originSet.has(item);
});
if (restList.some(function(item) {
return itemKey(item) === MOTION_KEY;
})) {
onMotionEnd();
}
},
children: function(treeNode) {
var pos = treeNode.pos, restProps = _extends$3({}, (_objectDestructuringEmpty(treeNode.data), treeNode.data)), title = treeNode.title, key2 = treeNode.key, isStart = treeNode.isStart, isEnd = treeNode.isEnd;
var mergedKey = getKey(key2, pos);
delete restProps.key;
delete restProps.children;
var treeNodeProps = getTreeNodeProps(mergedKey, treeNodeRequiredProps);
return /* @__PURE__ */ jsx(RefMotionTreeNode, {
...restProps,
...treeNodeProps,
title,
active: !!activeItem && key2 === activeItem.key,
pos,
data: treeNode.data,
isStart,
isEnd,
motion: motion2,
motionNodes: key2 === MOTION_KEY ? transitionRange : null,
motionType,
onMotionStart: onListChangeStart,
onMotionEnd,
treeNodeRequiredProps,
onMouseMove: function onMouseMove() {
onActiveChange(null);
}
});
}
})]
});
});
NodeList.displayName = "NodeList";
function DropIndicator(_ref) {
var dropPosition = _ref.dropPosition, dropLevelOffset = _ref.dropLevelOffset, indent = _ref.indent;
var style2 = {
pointerEvents: "none",
position: "absolute",
right: 0,
backgroundColor: "red",
height: 2
};
switch (dropPosition) {
case -1:
style2.top = 0;
style2.left = -dropLevelOffset * indent;
break;
case 1:
style2.bottom = 0;
style2.left = -dropLevelOffset * indent;
break;
case 0:
style2.bottom = 0;
style2.left = indent;
break;
}
return /* @__PURE__ */ jsx("div", {
style: style2
});
}
var MAX_RETRY_TIMES = 10;
var Tree$3 = /* @__PURE__ */ function(_React$Component) {
_inherits(Tree2, _React$Component);
var _super = _createSuper(Tree2);
function Tree2() {
var _this2;
_classCallCheck(this, Tree2);
for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) {
_args[_key] = arguments[_key];
}
_this2 = _super.call.apply(_super, [this].concat(_args));
_this2.destroyed = false;
_this2.delayedDragEnterLogic = void 0;
_this2.loadingRetryTimes = {};
_this2.state = {
keyEntities: {},
indent: null,
selectedKeys: [],
checkedKeys: [],
halfCheckedKeys: [],
loadedKeys: [],
loadingKeys: [],
expandedKeys: [],
draggingNodeKey: null,
dragChildrenKeys: [],
dropTargetKey: null,
dropPosition: null,
dropContainerKey: null,
dropLevelOffset: null,
dropTargetPos: null,
dropAllowed: true,
dragOverNodeKey: null,
treeData: [],
flattenNodes: [],
focused: false,
activeKey: null,
listChanging: false,
prevProps: null,
fieldNames: fillFieldNames$1()
};
_this2.dragStartMousePosition = null;
_this2.dragNode = void 0;
_this2.currentMouseOverDroppableNodeKey = null;
_this2.listRef = /* @__PURE__ */ React__namespace.createRef();
_this2.onNodeDragStart = function(event, node) {
var _this$state = _this2.state, expandedKeys = _this$state.expandedKeys, keyEntities = _this$state.keyEntities;
var onDragStart = _this2.props.onDragStart;
var eventKey = node.props.eventKey;
_this2.dragNode = node;
_this2.dragStartMousePosition = {
x: event.clientX,
y: event.clientY
};
var newExpandedKeys = arrDel(expandedKeys, eventKey);
_this2.setState({
draggingNodeKey: eventKey,
dragChildrenKeys: getDragChildrenKeys(eventKey, keyEntities),
indent: _this2.listRef.current.getIndentWidth()
});
_this2.setExpandedKeys(newExpandedKeys);
window.addEventListener("dragend", _this2.onWindowDragEnd);
onDragStart === null || onDragStart === void 0 ? void 0 : onDragStart({
event,
node: convertNodePropsToEventData(node.props)
});
};
_this2.onNodeDragEnter = function(event, node) {
var _this$state2 = _this2.state, expandedKeys = _this$state2.expandedKeys, keyEntities = _this$state2.keyEntities, dragChildrenKeys = _this$state2.dragChildrenKeys, flattenNodes = _this$state2.flattenNodes, indent = _this$state2.indent;
var _this$props = _this2.props, onDragEnter = _this$props.onDragEnter, onExpand = _this$props.onExpand, allowDrop = _this$props.allowDrop, direction = _this$props.direction;
var _node$props = node.props, pos = _node$props.pos, eventKey = _node$props.eventKey;
var _assertThisInitialize = _assertThisInitialized(_this2), dragNode = _assertThisInitialize.dragNode;
if (_this2.currentMouseOverDroppableNodeKey !== eventKey) {
_this2.currentMouseOverDroppableNodeKey = eventKey;
}
if (!dragNode) {
_this2.resetDragState();
return;
}
var _calcDropPosition = calcDropPosition(event, dragNode, node, indent, _this2.dragStartMousePosition, allowDrop, flattenNodes, keyEntities, expandedKeys, direction), dropPosition = _calcDropPosition.dropPosition, dropLevelOffset = _calcDropPosition.dropLevelOffset, dropTargetKey = _calcDropPosition.dropTargetKey, dropContainerKey = _calcDropPosition.dropContainerKey, dropTargetPos = _calcDropPosition.dropTargetPos, dropAllowed = _calcDropPosition.dropAllowed, dragOverNodeKey = _calcDropPosition.dragOverNodeKey;
if (dragChildrenKeys.indexOf(dropTargetKey) !== -1 || !dropAllowed) {
_this2.resetDragState();
return;
}
if (!_this2.delayedDragEnterLogic) {
_this2.delayedDragEnterLogic = {};
}
Object.keys(_this2.delayedDragEnterLogic).forEach(function(key2) {
clearTimeout(_this2.delayedDragEnterLogic[key2]);
});
if (dragNode.props.eventKey !== node.props.eventKey) {
event.persist();
_this2.delayedDragEnterLogic[pos] = window.setTimeout(function() {
if (_this2.state.draggingNodeKey === null)
return;
var newExpandedKeys = _toConsumableArray$c(expandedKeys);
var entity = keyEntities[node.props.eventKey];
if (entity && (entity.children || []).length) {
newExpandedKeys = arrAdd(expandedKeys, node.props.eventKey);
}
if (!("expandedKeys" in _this2.props)) {
_this2.setExpandedKeys(newExpandedKeys);
}
onExpand === null || onExpand === void 0 ? void 0 : onExpand(newExpandedKeys, {
node: convertNodePropsToEventData(node.props),
expanded: true,
nativeEvent: event.nativeEvent
});
}, 800);
}
if (dragNode.props.eventKey === dropTargetKey && dropLevelOffset === 0) {
_this2.resetDragState();
return;
}
_this2.setState({
dragOverNodeKey,
dropPosition,
dropLevelOffset,
dropTargetKey,
dropContainerKey,
dropTargetPos,
dropAllowed
});
onDragEnter === null || onDragEnter === void 0 ? void 0 : onDragEnter({
event,
node: convertNodePropsToEventData(node.props),
expandedKeys
});
};
_this2.onNodeDragOver = function(event, node) {
var _this$state3 = _this2.state, dragChildrenKeys = _this$state3.dragChildrenKeys, flattenNodes = _this$state3.flattenNodes, keyEntities = _this$state3.keyEntities, expandedKeys = _this$state3.expandedKeys, indent = _this$state3.indent;
var _this$props2 = _this2.props, onDragOver = _this$props2.onDragOver, allowDrop = _this$props2.allowDrop, direction = _this$props2.direction;
var _assertThisInitialize2 = _assertThisInitialized(_this2), dragNode = _assertThisInitialize2.dragNode;
if (!dragNode) {
return;
}
var _calcDropPosition2 = calcDropPosition(event, dragNode, node, indent, _this2.dragStartMousePosition, allowDrop, flattenNodes, keyEntities, expandedKeys, direction), dropPosition = _calcDropPosition2.dropPosition, dropLevelOffset = _calcDropPosition2.dropLevelOffset, dropTargetKey = _calcDropPosition2.dropTargetKey, dropContainerKey = _calcDropPosition2.dropContainerKey, dropAllowed = _calcDropPosition2.dropAllowed, dropTargetPos = _calcDropPosition2.dropTargetPos, dragOverNodeKey = _calcDropPosition2.dragOverNodeKey;
if (dragChildrenKeys.indexOf(dropTargetKey) !== -1 || !dropAllowed) {
return;
}
if (dragNode.props.eventKey === dropTargetKey && dropLevelOffset === 0) {
if (!(_this2.state.dropPosition === null && _this2.state.dropLevelOffset === null && _this2.state.dropTargetKey === null && _this2.state.dropContainerKey === null && _this2.state.dropTargetPos === null && _this2.state.dropAllowed === false && _this2.state.dragOverNodeKey === null)) {
_this2.resetDragState();
}
} else if (!(dropPosition === _this2.state.dropPosition && dropLevelOffset === _this2.state.dropLevelOffset && dropTargetKey === _this2.state.dropTargetKey && dropContainerKey === _this2.state.dropContainerKey && dropTargetPos === _this2.state.dropTargetPos && dropAllowed === _this2.state.dropAllowed && dragOverNodeKey === _this2.state.dragOverNodeKey)) {
_this2.setState({
dropPosition,
dropLevelOffset,
dropTargetKey,
dropContainerKey,
dropTargetPos,
dropAllowed,
dragOverNodeKey
});
}
onDragOver === null || onDragOver === void 0 ? void 0 : onDragOver({
event,
node: convertNodePropsToEventData(node.props)
});
};
_this2.onNodeDragLeave = function(event, node) {
if (_this2.currentMouseOverDroppableNodeKey === node.props.eventKey && !event.currentTarget.contains(event.relatedTarget)) {
_this2.resetDragState();
_this2.currentMouseOverDroppableNodeKey = null;
}
var onDragLeave = _this2.props.onDragLeave;
onDragLeave === null || onDragLeave === void 0 ? void 0 : onDragLeave({
event,
node: convertNodePropsToEventData(node.props)
});
};
_this2.onWindowDragEnd = function(event) {
_this2.onNodeDragEnd(event, null, true);
window.removeEventListener("dragend", _this2.onWindowDragEnd);
};
_this2.onNodeDragEnd = function(event, node) {
var onDragEnd = _this2.props.onDragEnd;
_this2.setState({
dragOverNodeKey: null
});
_this2.cleanDragState();
onDragEnd === null || onDragEnd === void 0 ? void 0 : onDragEnd({
event,
node: convertNodePropsToEventData(node.props)
});
_this2.dragNode = null;
window.removeEventListener("dragend", _this2.onWindowDragEnd);
};
_this2.onNodeDrop = function(event, node) {
var _this$getActiveItem;
var outsideTree = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : false;
var _this$state4 = _this2.state, dragChildrenKeys = _this$state4.dragChildrenKeys, dropPosition = _this$state4.dropPosition, dropTargetKey = _this$state4.dropTargetKey, dropTargetPos = _this$state4.dropTargetPos, dropAllowed = _this$state4.dropAllowed;
if (!dropAllowed)
return;
var onDrop = _this2.props.onDrop;
_this2.setState({
dragOverNodeKey: null
});
_this2.cleanDragState();
if (dropTargetKey === null)
return;
var abstractDropNodeProps = _objectSpread2$a(_objectSpread2$a({}, getTreeNodeProps(dropTargetKey, _this2.getTreeNodeRequiredProps())), {}, {
active: ((_this$getActiveItem = _this2.getActiveItem()) === null || _this$getActiveItem === void 0 ? void 0 : _this$getActiveItem.key) === dropTargetKey,
data: _this2.state.keyEntities[dropTargetKey].node
});
var dropToChild = dragChildrenKeys.indexOf(dropTargetKey) !== -1;
warningOnce(!dropToChild, "Can not drop to dragNode's children node. This is a bug of rc-tree. Please report an issue.");
var posArr = posToArr(dropTargetPos);
var dropResult = {
event,
node: convertNodePropsToEventData(abstractDropNodeProps),
dragNode: _this2.dragNode ? convertNodePropsToEventData(_this2.dragNode.props) : null,
dragNodesKeys: [_this2.dragNode.props.eventKey].concat(dragChildrenKeys),
dropToGap: dropPosition !== 0,
dropPosition: dropPosition + Number(posArr[posArr.length - 1])
};
if (!outsideTree) {
onDrop === null || onDrop === void 0 ? void 0 : onDrop(dropResult);
}
_this2.dragNode = null;
};
_this2.cleanDragState = function() {
var draggingNodeKey = _this2.state.draggingNodeKey;
if (draggingNodeKey !== null) {
_this2.setState({
draggingNodeKey: null,
dropPosition: null,
dropContainerKey: null,
dropTargetKey: null,
dropLevelOffset: null,
dropAllowed: true,
dragOverNodeKey: null
});
}
_this2.dragStartMousePosition = null;
_this2.currentMouseOverDroppableNodeKey = null;
};
_this2.triggerExpandActionExpand = function(e2, treeNode) {
var _this$state5 = _this2.state, expandedKeys = _this$state5.expandedKeys, flattenNodes = _this$state5.flattenNodes;
var expanded = treeNode.expanded, key2 = treeNode.key, isLeaf = treeNode.isLeaf;
if (isLeaf || e2.shiftKey || e2.metaKey || e2.ctrlKey) {
return;
}
var node = flattenNodes.filter(function(nodeItem) {
return nodeItem.key === key2;
})[0];
var eventNode = convertNodePropsToEventData(_objectSpread2$a(_objectSpread2$a({}, getTreeNodeProps(key2, _this2.getTreeNodeRequiredProps())), {}, {
data: node.data
}));
_this2.setExpandedKeys(expanded ? arrDel(expandedKeys, key2) : arrAdd(expandedKeys, key2));
_this2.onNodeExpand(e2, eventNode);
};
_this2.onNodeClick = function(e2, treeNode) {
var _this$props3 = _this2.props, onClick = _this$props3.onClick, expandAction = _this$props3.expandAction;
if (expandAction === "click") {
_this2.triggerExpandActionExpand(e2, treeNode);
}
onClick === null || onClick === void 0 ? void 0 : onClick(e2, treeNode);
};
_this2.onNodeDoubleClick = function(e2, treeNode) {
var _this$props4 = _this2.props, onDoubleClick = _this$props4.onDoubleClick, expandAction = _this$props4.expandAction;
if (expandAction === "doubleClick") {
_this2.triggerExpandActionExpand(e2, treeNode);
}
onDoubleClick === null || onDoubleClick === void 0 ? void 0 : onDoubleClick(e2, treeNode);
};
_this2.onNodeSelect = function(e2, treeNode) {
var selectedKeys = _this2.state.selectedKeys;
var _this$state6 = _this2.state, keyEntities = _this$state6.keyEntities, fieldNames = _this$state6.fieldNames;
var _this$props5 = _this2.props, onSelect = _this$props5.onSelect, multiple = _this$props5.multiple;
var selected = treeNode.selected;
var key2 = treeNode[fieldNames.key];
var targetSelected = !selected;
if (!targetSelected) {
selectedKeys = arrDel(selectedKeys, key2);
} else if (!multiple) {
selectedKeys = [key2];
} else {
selectedKeys = arrAdd(selectedKeys, key2);
}
var selectedNodes = selectedKeys.map(function(selectedKey) {
var entity = keyEntities[selectedKey];
if (!entity)
return null;
return entity.node;
}).filter(function(node) {
return node;
});
_this2.setUncontrolledState({
selectedKeys
});
onSelect === null || onSelect === void 0 ? void 0 : onSelect(selectedKeys, {
event: "select",
selected: targetSelected,
node: treeNode,
selectedNodes,
nativeEvent: e2.nativeEvent
});
};
_this2.onNodeCheck = function(e2, treeNode, checked) {
var _this$state7 = _this2.state, keyEntities = _this$state7.keyEntities, oriCheckedKeys = _this$state7.checkedKeys, oriHalfCheckedKeys = _this$state7.halfCheckedKeys;
var _this$props6 = _this2.props, checkStrictly = _this$props6.checkStrictly, onCheck = _this$props6.onCheck;
var key2 = treeNode.key;
var checkedObj;
var eventObj = {
event: "check",
node: treeNode,
checked,
nativeEvent: e2.nativeEvent
};
if (checkStrictly) {
var checkedKeys = checked ? arrAdd(oriCheckedKeys, key2) : arrDel(oriCheckedKeys, key2);
var halfCheckedKeys = arrDel(oriHalfCheckedKeys, key2);
checkedObj = {
checked: checkedKeys,
halfChecked: halfCheckedKeys
};
eventObj.checkedNodes = checkedKeys.map(function(checkedKey) {
return keyEntities[checkedKey];
}).filter(function(entity) {
return entity;
}).map(function(entity) {
return entity.node;
});
_this2.setUncontrolledState({
checkedKeys
});
} else {
var _conductCheck = conductCheck([].concat(_toConsumableArray$c(oriCheckedKeys), [key2]), true, keyEntities), _checkedKeys = _conductCheck.checkedKeys, _halfCheckedKeys = _conductCheck.halfCheckedKeys;
if (!checked) {
var keySet = new Set(_checkedKeys);
keySet.delete(key2);
var _conductCheck2 = conductCheck(Array.from(keySet), {
checked: false,
halfCheckedKeys: _halfCheckedKeys
}, keyEntities);
_checkedKeys = _conductCheck2.checkedKeys;
_halfCheckedKeys = _conductCheck2.halfCheckedKeys;
}
checkedObj = _checkedKeys;
eventObj.checkedNodes = [];
eventObj.checkedNodesPositions = [];
eventObj.halfCheckedKeys = _halfCheckedKeys;
_checkedKeys.forEach(function(checkedKey) {
var entity = keyEntities[checkedKey];
if (!entity)
return;
var node = entity.node, pos = entity.pos;
eventObj.checkedNodes.push(node);
eventObj.checkedNodesPositions.push({
node,
pos
});
});
_this2.setUncontrolledState({
checkedKeys: _checkedKeys
}, false, {
halfCheckedKeys: _halfCheckedKeys
});
}
onCheck === null || onCheck === void 0 ? void 0 : onCheck(checkedObj, eventObj);
};
_this2.onNodeLoad = function(treeNode) {
var key2 = treeNode.key;
var loadPromise = new Promise(function(resolve, reject) {
_this2.setState(function(_ref) {
var _ref$loadedKeys = _ref.loadedKeys, loadedKeys = _ref$loadedKeys === void 0 ? [] : _ref$loadedKeys, _ref$loadingKeys = _ref.loadingKeys, loadingKeys = _ref$loadingKeys === void 0 ? [] : _ref$loadingKeys;
var _this$props7 = _this2.props, loadData = _this$props7.loadData, onLoad = _this$props7.onLoad;
if (!loadData || loadedKeys.indexOf(key2) !== -1 || loadingKeys.indexOf(key2) !== -1) {
return null;
}
var promise = loadData(treeNode);
promise.then(function() {
var currentLoadedKeys = _this2.state.loadedKeys;
var newLoadedKeys = arrAdd(currentLoadedKeys, key2);
onLoad === null || onLoad === void 0 ? void 0 : onLoad(newLoadedKeys, {
event: "load",
node: treeNode
});
_this2.setUncontrolledState({
loadedKeys: newLoadedKeys
});
_this2.setState(function(prevState) {
return {
loadingKeys: arrDel(prevState.loadingKeys, key2)
};
});
resolve();
}).catch(function(e2) {
_this2.setState(function(prevState) {
return {
loadingKeys: arrDel(prevState.loadingKeys, key2)
};
});
_this2.loadingRetryTimes[key2] = (_this2.loadingRetryTimes[key2] || 0) + 1;
if (_this2.loadingRetryTimes[key2] >= MAX_RETRY_TIMES) {
var currentLoadedKeys = _this2.state.loadedKeys;
warningOnce(false, "Retry for `loadData` many times but still failed. No more retry.");
_this2.setUncontrolledState({
loadedKeys: arrAdd(currentLoadedKeys, key2)
});
resolve();
}
reject(e2);
});
return {
loadingKeys: arrAdd(loadingKeys, key2)
};
});
});
loadPromise.catch(function() {
});
return loadPromise;
};
_this2.onNodeMouseEnter = function(event, node) {
var onMouseEnter = _this2.props.onMouseEnter;
onMouseEnter === null || onMouseEnter === void 0 ? void 0 : onMouseEnter({
event,
node
});
};
_this2.onNodeMouseLeave = function(event, node) {
var onMouseLeave = _this2.props.onMouseLeave;
onMouseLeave === null || onMouseLeave === void 0 ? void 0 : onMouseLeave({
event,
node
});
};
_this2.onNodeContextMenu = function(event, node) {
var onRightClick = _this2.props.onRightClick;
if (onRightClick) {
event.preventDefault();
onRightClick({
event,
node
});
}
};
_this2.onFocus = function() {
var onFocus = _this2.props.onFocus;
_this2.setState({
focused: true
});
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
onFocus === null || onFocus === void 0 ? void 0 : onFocus.apply(void 0, args);
};
_this2.onBlur = function() {
var onBlur = _this2.props.onBlur;
_this2.setState({
focused: false
});
_this2.onActiveChange(null);
for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
args[_key3] = arguments[_key3];
}
onBlur === null || onBlur === void 0 ? void 0 : onBlur.apply(void 0, args);
};
_this2.getTreeNodeRequiredProps = function() {
var _this$state8 = _this2.state, expandedKeys = _this$state8.expandedKeys, selectedKeys = _this$state8.selectedKeys, loadedKeys = _this$state8.loadedKeys, loadingKeys = _this$state8.loadingKeys, checkedKeys = _this$state8.checkedKeys, halfCheckedKeys = _this$state8.halfCheckedKeys, dragOverNodeKey = _this$state8.dragOverNodeKey, dropPosition = _this$state8.dropPosition, keyEntities = _this$state8.keyEntities;
return {
expandedKeys: expandedKeys || [],
selectedKeys: selectedKeys || [],
loadedKeys: loadedKeys || [],
loadingKeys: loadingKeys || [],
checkedKeys: checkedKeys || [],
halfCheckedKeys: halfCheckedKeys || [],
dragOverNodeKey,
dropPosition,
keyEntities
};
};
_this2.setExpandedKeys = function(expandedKeys) {
var _this$state9 = _this2.state, treeData = _this$state9.treeData, fieldNames = _this$state9.fieldNames;
var flattenNodes = flattenTreeData(treeData, expandedKeys, fieldNames);
_this2.setUncontrolledState({
expandedKeys,
flattenNodes
}, true);
};
_this2.onNodeExpand = function(e2, treeNode) {
var expandedKeys = _this2.state.expandedKeys;
var _this$state10 = _this2.state, listChanging = _this$state10.listChanging, fieldNames = _this$state10.fieldNames;
var _this$props8 = _this2.props, onExpand = _this$props8.onExpand, loadData = _this$props8.loadData;
var expanded = treeNode.expanded;
var key2 = treeNode[fieldNames.key];
if (listChanging) {
return;
}
var index2 = expandedKeys.indexOf(key2);
var targetExpanded = !expanded;
warningOnce(expanded && index2 !== -1 || !expanded && index2 === -1, "Expand state not sync with index check");
if (targetExpanded) {
expandedKeys = arrAdd(expandedKeys, key2);
} else {
expandedKeys = arrDel(expandedKeys, key2);
}
_this2.setExpandedKeys(expandedKeys);
onExpand === null || onExpand === void 0 ? void 0 : onExpand(expandedKeys, {
node: treeNode,
expanded: targetExpanded,
nativeEvent: e2.nativeEvent
});
if (targetExpanded && loadData) {
var loadPromise = _this2.onNodeLoad(treeNode);
if (loadPromise) {
loadPromise.then(function() {
var newFlattenTreeData = flattenTreeData(_this2.state.treeData, expandedKeys, fieldNames);
_this2.setUncontrolledState({
flattenNodes: newFlattenTreeData
});
}).catch(function() {
var currentExpandedKeys = _this2.state.expandedKeys;
var expandedKeysToRestore = arrDel(currentExpandedKeys, key2);
_this2.setExpandedKeys(expandedKeysToRestore);
});
}
}
};
_this2.onListChangeStart = function() {
_this2.setUncontrolledState({
listChanging: true
});
};
_this2.onListChangeEnd = function() {
setTimeout(function() {
_this2.setUncontrolledState({
listChanging: false
});
});
};
_this2.onActiveChange = function(newActiveKey) {
var activeKey = _this2.state.activeKey;
var onActiveChange = _this2.props.onActiveChange;
if (activeKey === newActiveKey) {
return;
}
_this2.setState({
activeKey: newActiveKey
});
if (newActiveKey !== null) {
_this2.scrollTo({
key: newActiveKey
});
}
onActiveChange === null || onActiveChange === void 0 ? void 0 : onActiveChange(newActiveKey);
};
_this2.getActiveItem = function() {
var _this$state11 = _this2.state, activeKey = _this$state11.activeKey, flattenNodes = _this$state11.flattenNodes;
if (activeKey === null) {
return null;
}
return flattenNodes.find(function(_ref2) {
var key2 = _ref2.key;
return key2 === activeKey;
}) || null;
};
_this2.offsetActiveKey = function(offset2) {
var _this$state12 = _this2.state, flattenNodes = _this$state12.flattenNodes, activeKey = _this$state12.activeKey;
var index2 = flattenNodes.findIndex(function(_ref3) {
var key3 = _ref3.key;
return key3 === activeKey;
});
if (index2 === -1 && offset2 < 0) {
index2 = flattenNodes.length;
}
index2 = (index2 + offset2 + flattenNodes.length) % flattenNodes.length;
var item = flattenNodes[index2];
if (item) {
var key2 = item.key;
_this2.onActiveChange(key2);
} else {
_this2.onActiveChange(null);
}
};
_this2.onKeyDown = function(event) {
var _this$state13 = _this2.state, activeKey = _this$state13.activeKey, expandedKeys = _this$state13.expandedKeys, checkedKeys = _this$state13.checkedKeys, fieldNames = _this$state13.fieldNames;
var _this$props9 = _this2.props, onKeyDown2 = _this$props9.onKeyDown, checkable = _this$props9.checkable, selectable = _this$props9.selectable;
switch (event.which) {
case KeyCode.UP: {
_this2.offsetActiveKey(-1);
event.preventDefault();
break;
}
case KeyCode.DOWN: {
_this2.offsetActiveKey(1);
event.preventDefault();
break;
}
}
var activeItem = _this2.getActiveItem();
if (activeItem && activeItem.data) {
var treeNodeRequiredProps = _this2.getTreeNodeRequiredProps();
var expandable = activeItem.data.isLeaf === false || !!(activeItem.data[fieldNames.children] || []).length;
var eventNode = convertNodePropsToEventData(_objectSpread2$a(_objectSpread2$a({}, getTreeNodeProps(activeKey, treeNodeRequiredProps)), {}, {
data: activeItem.data,
active: true
}));
switch (event.which) {
case KeyCode.LEFT: {
if (expandable && expandedKeys.includes(activeKey)) {
_this2.onNodeExpand({}, eventNode);
} else if (activeItem.parent) {
_this2.onActiveChange(activeItem.parent.key);
}
event.preventDefault();
break;
}
case KeyCode.RIGHT: {
if (expandable && !expandedKeys.includes(activeKey)) {
_this2.onNodeExpand({}, eventNode);
} else if (activeItem.children && activeItem.children.length) {
_this2.onActiveChange(activeItem.children[0].key);
}
event.preventDefault();
break;
}
case KeyCode.ENTER:
case KeyCode.SPACE: {
if (checkable && !eventNode.disabled && eventNode.checkable !== false && !eventNode.disableCheckbox) {
_this2.onNodeCheck({}, eventNode, !checkedKeys.includes(activeKey));
} else if (!checkable && selectable && !eventNode.disabled && eventNode.selectable !== false) {
_this2.onNodeSelect({}, eventNode);
}
break;
}
}
}
onKeyDown2 === null || onKeyDown2 === void 0 ? void 0 : onKeyDown2(event);
};
_this2.setUncontrolledState = function(state) {
var atomic = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
var forceState = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : null;
if (!_this2.destroyed) {
var needSync = false;
var allPassed = true;
var newState = {};
Object.keys(state).forEach(function(name2) {
if (name2 in _this2.props) {
allPassed = false;
return;
}
needSync = true;
newState[name2] = state[name2];
});
if (needSync && (!atomic || allPassed)) {
_this2.setState(_objectSpread2$a(_objectSpread2$a({}, newState), forceState));
}
}
};
_this2.scrollTo = function(scroll) {
_this2.listRef.current.scrollTo(scroll);
};
return _this2;
}
_createClass(Tree2, [{
key: "componentDidMount",
value: function componentDidMount() {
this.destroyed = false;
this.onUpdated();
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate() {
this.onUpdated();
}
}, {
key: "onUpdated",
value: function onUpdated() {
var activeKey = this.props.activeKey;
if (activeKey !== void 0 && activeKey !== this.state.activeKey) {
this.setState({
activeKey
});
if (activeKey !== null) {
this.scrollTo({
key: activeKey
});
}
}
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
window.removeEventListener("dragend", this.onWindowDragEnd);
this.destroyed = true;
}
}, {
key: "resetDragState",
value: function resetDragState() {
this.setState({
dragOverNodeKey: null,
dropPosition: null,
dropLevelOffset: null,
dropTargetKey: null,
dropContainerKey: null,
dropTargetPos: null,
dropAllowed: false
});
}
}, {
key: "render",
value: function render2() {
var _classNames;
var _this$state14 = this.state, focused = _this$state14.focused, flattenNodes = _this$state14.flattenNodes, keyEntities = _this$state14.keyEntities, draggingNodeKey = _this$state14.draggingNodeKey, activeKey = _this$state14.activeKey, dropLevelOffset = _this$state14.dropLevelOffset, dropContainerKey = _this$state14.dropContainerKey, dropTargetKey = _this$state14.dropTargetKey, dropPosition = _this$state14.dropPosition, dragOverNodeKey = _this$state14.dragOverNodeKey, indent = _this$state14.indent;
var _this$props10 = this.props, prefixCls = _this$props10.prefixCls, className = _this$props10.className, style2 = _this$props10.style, showLine = _this$props10.showLine, focusable2 = _this$props10.focusable, _this$props10$tabInde = _this$props10.tabIndex, tabIndex = _this$props10$tabInde === void 0 ? 0 : _this$props10$tabInde, selectable = _this$props10.selectable, showIcon = _this$props10.showIcon, icon = _this$props10.icon, switcherIcon = _this$props10.switcherIcon, draggable = _this$props10.draggable, checkable = _this$props10.checkable, checkStrictly = _this$props10.checkStrictly, disabled = _this$props10.disabled, motion2 = _this$props10.motion, loadData = _this$props10.loadData, filterTreeNode = _this$props10.filterTreeNode, height = _this$props10.height, itemHeight = _this$props10.itemHeight, virtual = _this$props10.virtual, titleRender = _this$props10.titleRender, dropIndicatorRender2 = _this$props10.dropIndicatorRender, onContextMenu = _this$props10.onContextMenu, onScroll = _this$props10.onScroll, direction = _this$props10.direction, rootClassName = _this$props10.rootClassName, rootStyle = _this$props10.rootStyle;
var domProps = pickAttrs(this.props, {
aria: true,
data: true
});
var draggableConfig;
if (draggable) {
if (_typeof$q(draggable) === "object") {
draggableConfig = draggable;
} else if (typeof draggable === "function") {
draggableConfig = {
nodeDraggable: draggable
};
} else {
draggableConfig = {};
}
}
return /* @__PURE__ */ jsx(TreeContext.Provider, {
value: {
prefixCls,
selectable,
showIcon,
icon,
switcherIcon,
draggable: draggableConfig,
draggingNodeKey,
checkable,
checkStrictly,
disabled,
keyEntities,
dropLevelOffset,
dropContainerKey,
dropTargetKey,
dropPosition,
dragOverNodeKey,
indent,
direction,
dropIndicatorRender: dropIndicatorRender2,
loadData,
filterTreeNode,
titleRender,
onNodeClick: this.onNodeClick,
onNodeDoubleClick: this.onNodeDoubleClick,
onNodeExpand: this.onNodeExpand,
onNodeSelect: this.onNodeSelect,
onNodeCheck: this.onNodeCheck,
onNodeLoad: this.onNodeLoad,
onNodeMouseEnter: this.onNodeMouseEnter,
onNodeMouseLeave: this.onNodeMouseLeave,
onNodeContextMenu: this.onNodeContextMenu,
onNodeDragStart: this.onNodeDragStart,
onNodeDragEnter: this.onNodeDragEnter,
onNodeDragOver: this.onNodeDragOver,
onNodeDragLeave: this.onNodeDragLeave,
onNodeDragEnd: this.onNodeDragEnd,
onNodeDrop: this.onNodeDrop
},
children: /* @__PURE__ */ jsx("div", {
role: "tree",
className: classnames(prefixCls, className, rootClassName, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-show-line"), showLine), _defineProperty$b(_classNames, "".concat(prefixCls, "-focused"), focused), _defineProperty$b(_classNames, "".concat(prefixCls, "-active-focused"), activeKey !== null), _classNames)),
style: rootStyle,
children: /* @__PURE__ */ jsx(NodeList, {
ref: this.listRef,
prefixCls,
style: style2,
data: flattenNodes,
disabled,
selectable,
checkable: !!checkable,
motion: motion2,
dragging: draggingNodeKey !== null,
height,
itemHeight,
virtual,
focusable: focusable2,
focused,
tabIndex,
activeItem: this.getActiveItem(),
onFocus: this.onFocus,
onBlur: this.onBlur,
onKeyDown: this.onKeyDown,
onActiveChange: this.onActiveChange,
onListChangeStart: this.onListChangeStart,
onListChangeEnd: this.onListChangeEnd,
onContextMenu,
onScroll,
...this.getTreeNodeRequiredProps(),
...domProps
})
})
});
}
}], [{
key: "getDerivedStateFromProps",
value: function getDerivedStateFromProps(props, prevState) {
var prevProps = prevState.prevProps;
var newState = {
prevProps: props
};
function needSync(name2) {
return !prevProps && name2 in props || prevProps && prevProps[name2] !== props[name2];
}
var treeData;
var fieldNames = prevState.fieldNames;
if (needSync("fieldNames")) {
fieldNames = fillFieldNames$1(props.fieldNames);
newState.fieldNames = fieldNames;
}
if (needSync("treeData")) {
treeData = props.treeData;
} else if (needSync("children")) {
warningOnce(false, "`children` of Tree is deprecated. Please use `treeData` instead.");
treeData = convertTreeToData(props.children);
}
if (treeData) {
newState.treeData = treeData;
var entitiesMap = convertDataToEntities(treeData, {
fieldNames
});
newState.keyEntities = _objectSpread2$a(_defineProperty$b({}, MOTION_KEY, MotionEntity), entitiesMap.keyEntities);
}
var keyEntities = newState.keyEntities || prevState.keyEntities;
if (needSync("expandedKeys") || prevProps && needSync("autoExpandParent")) {
newState.expandedKeys = props.autoExpandParent || !prevProps && props.defaultExpandParent ? conductExpandParent(props.expandedKeys, keyEntities) : props.expandedKeys;
} else if (!prevProps && props.defaultExpandAll) {
var cloneKeyEntities = _objectSpread2$a({}, keyEntities);
delete cloneKeyEntities[MOTION_KEY];
newState.expandedKeys = Object.keys(cloneKeyEntities).map(function(key2) {
return cloneKeyEntities[key2].key;
});
} else if (!prevProps && props.defaultExpandedKeys) {
newState.expandedKeys = props.autoExpandParent || props.defaultExpandParent ? conductExpandParent(props.defaultExpandedKeys, keyEntities) : props.defaultExpandedKeys;
}
if (!newState.expandedKeys) {
delete newState.expandedKeys;
}
if (treeData || newState.expandedKeys) {
var flattenNodes = flattenTreeData(treeData || prevState.treeData, newState.expandedKeys || prevState.expandedKeys, fieldNames);
newState.flattenNodes = flattenNodes;
}
if (props.selectable) {
if (needSync("selectedKeys")) {
newState.selectedKeys = calcSelectedKeys(props.selectedKeys, props);
} else if (!prevProps && props.defaultSelectedKeys) {
newState.selectedKeys = calcSelectedKeys(props.defaultSelectedKeys, props);
}
}
if (props.checkable) {
var checkedKeyEntity;
if (needSync("checkedKeys")) {
checkedKeyEntity = parseCheckedKeys(props.checkedKeys) || {};
} else if (!prevProps && props.defaultCheckedKeys) {
checkedKeyEntity = parseCheckedKeys(props.defaultCheckedKeys) || {};
} else if (treeData) {
checkedKeyEntity = parseCheckedKeys(props.checkedKeys) || {
checkedKeys: prevState.checkedKeys,
halfCheckedKeys: prevState.halfCheckedKeys
};
}
if (checkedKeyEntity) {
var _checkedKeyEntity = checkedKeyEntity, _checkedKeyEntity$che = _checkedKeyEntity.checkedKeys, checkedKeys = _checkedKeyEntity$che === void 0 ? [] : _checkedKeyEntity$che, _checkedKeyEntity$hal = _checkedKeyEntity.halfCheckedKeys, halfCheckedKeys = _checkedKeyEntity$hal === void 0 ? [] : _checkedKeyEntity$hal;
if (!props.checkStrictly) {
var conductKeys = conductCheck(checkedKeys, true, keyEntities);
checkedKeys = conductKeys.checkedKeys;
halfCheckedKeys = conductKeys.halfCheckedKeys;
}
newState.checkedKeys = checkedKeys;
newState.halfCheckedKeys = halfCheckedKeys;
}
}
if (needSync("loadedKeys")) {
newState.loadedKeys = props.loadedKeys;
}
return newState;
}
}]);
return Tree2;
}(React__namespace.Component);
Tree$3.defaultProps = {
prefixCls: "rc-tree",
showLine: false,
showIcon: true,
selectable: true,
multiple: false,
checkable: false,
disabled: false,
checkStrictly: false,
draggable: false,
defaultExpandParent: true,
autoExpandParent: false,
defaultExpandAll: false,
defaultExpandedKeys: [],
defaultCheckedKeys: [],
defaultSelectedKeys: [],
dropIndicatorRender: DropIndicator,
allowDrop: function allowDrop() {
return true;
},
expandAction: false
};
Tree$3.TreeNode = ContextTreeNode;
var HolderOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M300 276.5a56 56 0 1056-97 56 56 0 00-56 97zm0 284a56 56 0 1056-97 56 56 0 00-56 97zM640 228a56 56 0 10112 0 56 56 0 00-112 0zm0 284a56 56 0 10112 0 56 56 0 00-112 0zM300 844.5a56 56 0 1056-97 56 56 0 00-56 97zM640 796a56 56 0 10112 0 56 56 0 00-112 0z" } }] }, "name": "holder", "theme": "outlined" };
const HolderOutlinedSvg = HolderOutlined$2;
var HolderOutlined = function HolderOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: HolderOutlinedSvg
})
});
};
HolderOutlined.displayName = "HolderOutlined";
const HolderOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(HolderOutlined);
var offset = 4;
function dropIndicatorRender(props) {
var _style;
var dropPosition = props.dropPosition, dropLevelOffset = props.dropLevelOffset, prefixCls = props.prefixCls, indent = props.indent, _props$direction = props.direction, direction = _props$direction === void 0 ? "ltr" : _props$direction;
var startPosition = direction === "ltr" ? "left" : "right";
var endPosition = direction === "ltr" ? "right" : "left";
var style2 = (_style = {}, _defineProperty$b(_style, startPosition, -dropLevelOffset * indent + offset), _defineProperty$b(_style, endPosition, 0), _style);
switch (dropPosition) {
case -1:
style2.top = -3;
break;
case 1:
style2.bottom = -3;
break;
default:
style2.bottom = -3;
style2[startPosition] = indent + offset;
break;
}
return /* @__PURE__ */ jsx("div", {
style: style2,
className: "".concat(prefixCls, "-drop-indicator")
});
}
var CaretDownFilled$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "0 0 1024 1024", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M840.4 300H183.6c-19.7 0-30.7 20.8-18.5 35l328.4 380.8c9.4 10.9 27.5 10.9 37 0L858.9 335c12.2-14.2 1.2-35-18.5-35z" } }] }, "name": "caret-down", "theme": "filled" };
const CaretDownFilledSvg = CaretDownFilled$2;
var CaretDownFilled = function CaretDownFilled2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: CaretDownFilledSvg
})
});
};
CaretDownFilled.displayName = "CaretDownFilled";
const CaretDownFilled$1 = /* @__PURE__ */ React__namespace.forwardRef(CaretDownFilled);
var FileOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM790.2 326H602V137.8L790.2 326zm1.8 562H232V136h302v216a42 42 0 0042 42h216v494z" } }] }, "name": "file", "theme": "outlined" };
const FileOutlinedSvg = FileOutlined$2;
var FileOutlined = function FileOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: FileOutlinedSvg
})
});
};
FileOutlined.displayName = "FileOutlined";
const FileOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(FileOutlined);
var MinusSquareOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M328 544h368c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H328c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8z" } }, { "tag": "path", "attrs": { "d": "M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z" } }] }, "name": "minus-square", "theme": "outlined" };
const MinusSquareOutlinedSvg = MinusSquareOutlined$2;
var MinusSquareOutlined = function MinusSquareOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: MinusSquareOutlinedSvg
})
});
};
MinusSquareOutlined.displayName = "MinusSquareOutlined";
const MinusSquareOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(MinusSquareOutlined);
var PlusSquareOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M328 544h152v152c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V544h152c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H544V328c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v152H328c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8z" } }, { "tag": "path", "attrs": { "d": "M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z" } }] }, "name": "plus-square", "theme": "outlined" };
const PlusSquareOutlinedSvg = PlusSquareOutlined$2;
var PlusSquareOutlined = function PlusSquareOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: PlusSquareOutlinedSvg
})
});
};
PlusSquareOutlined.displayName = "PlusSquareOutlined";
const PlusSquareOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(PlusSquareOutlined);
function renderSwitcherIcon(prefixCls, switcherIcon, showLine, treeNodeProps) {
var isLeaf = treeNodeProps.isLeaf, expanded = treeNodeProps.expanded, loading = treeNodeProps.loading;
if (loading) {
return /* @__PURE__ */ jsx(LoadingOutlined$1, {
className: "".concat(prefixCls, "-switcher-loading-icon")
});
}
var showLeafIcon;
if (showLine && _typeof$q(showLine) === "object") {
showLeafIcon = showLine.showLeafIcon;
}
if (isLeaf) {
if (!showLine) {
return null;
}
if (typeof showLeafIcon !== "boolean" && !!showLeafIcon) {
var leafIcon = typeof showLeafIcon === "function" ? showLeafIcon(treeNodeProps) : showLeafIcon;
var leafCls = "".concat(prefixCls, "-switcher-line-custom-icon");
if (isValidElement(leafIcon)) {
return cloneElement(leafIcon, {
className: classnames(leafIcon.props.className || "", leafCls)
});
}
return leafIcon;
}
return showLeafIcon ? /* @__PURE__ */ jsx(FileOutlined$1, {
className: "".concat(prefixCls, "-switcher-line-icon")
}) : /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-switcher-leaf-line")
});
}
var switcherCls = "".concat(prefixCls, "-switcher-icon");
var switcher = typeof switcherIcon === "function" ? switcherIcon(treeNodeProps) : switcherIcon;
if (isValidElement(switcher)) {
return cloneElement(switcher, {
className: classnames(switcher.props.className || "", switcherCls)
});
}
if (switcher) {
return switcher;
}
if (showLine) {
return expanded ? /* @__PURE__ */ jsx(MinusSquareOutlined$1, {
className: "".concat(prefixCls, "-switcher-line-icon")
}) : /* @__PURE__ */ jsx(PlusSquareOutlined$1, {
className: "".concat(prefixCls, "-switcher-line-icon")
});
}
return /* @__PURE__ */ jsx(CaretDownFilled$1, {
className: switcherCls
});
}
var Tree$2 = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var _classNames;
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction, virtual = _React$useContext.virtual;
var customizePrefixCls = props.prefixCls, className = props.className, _props$showIcon = props.showIcon, showIcon = _props$showIcon === void 0 ? false : _props$showIcon, showLine = props.showLine, _switcherIcon = props.switcherIcon, _props$blockNode = props.blockNode, blockNode = _props$blockNode === void 0 ? false : _props$blockNode, children = props.children, _props$checkable = props.checkable, checkable = _props$checkable === void 0 ? false : _props$checkable, _props$selectable = props.selectable, selectable = _props$selectable === void 0 ? true : _props$selectable, draggable = props.draggable, _props$motion = props.motion, motion2 = _props$motion === void 0 ? _extends$3(_extends$3({}, collapseMotion$1), {
motionAppear: false
}) : _props$motion;
var prefixCls = getPrefixCls("tree", customizePrefixCls);
var newProps = _extends$3(_extends$3({}, props), {
checkable,
selectable,
showIcon,
motion: motion2,
blockNode,
showLine: Boolean(showLine),
dropIndicatorRender
});
var draggableConfig = React__namespace.useMemo(function() {
if (!draggable) {
return false;
}
var mergedDraggable = {};
switch (_typeof$q(draggable)) {
case "function":
mergedDraggable.nodeDraggable = draggable;
break;
case "object":
mergedDraggable = _extends$3({}, draggable);
break;
}
if (mergedDraggable.icon !== false) {
mergedDraggable.icon = mergedDraggable.icon || /* @__PURE__ */ jsx(HolderOutlined$1, {});
}
return mergedDraggable;
}, [draggable]);
return /* @__PURE__ */ jsx(Tree$3, {
itemHeight: 20,
ref,
virtual,
...newProps,
prefixCls,
className: classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-icon-hide"), !showIcon), _defineProperty$b(_classNames, "".concat(prefixCls, "-block-node"), blockNode), _defineProperty$b(_classNames, "".concat(prefixCls, "-unselectable"), !selectable), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames), className),
direction,
checkable: checkable ? /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-checkbox-inner")
}) : checkable,
selectable,
switcherIcon: function switcherIcon(nodeProps) {
return renderSwitcherIcon(prefixCls, _switcherIcon, showLine, nodeProps);
},
draggable: draggableConfig,
children
});
});
const TreePure = Tree$2;
var FolderOpenOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M928 444H820V330.4c0-17.7-14.3-32-32-32H473L355.7 186.2a8.15 8.15 0 00-5.5-2.2H96c-17.7 0-32 14.3-32 32v592c0 17.7 14.3 32 32 32h698c13 0 24.8-7.9 29.7-20l134-332c1.5-3.8 2.3-7.9 2.3-12 0-17.7-14.3-32-32-32zM136 256h188.5l119.6 114.4H748V444H238c-13 0-24.8 7.9-29.7 20L136 643.2V256zm635.3 512H159l103.3-256h612.4L771.3 768z" } }] }, "name": "folder-open", "theme": "outlined" };
const FolderOpenOutlinedSvg = FolderOpenOutlined$2;
var FolderOpenOutlined = function FolderOpenOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: FolderOpenOutlinedSvg
})
});
};
FolderOpenOutlined.displayName = "FolderOpenOutlined";
const FolderOpenOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(FolderOpenOutlined);
var FolderOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M880 298.4H521L403.7 186.2a8.15 8.15 0 00-5.5-2.2H144c-17.7 0-32 14.3-32 32v592c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V330.4c0-17.7-14.3-32-32-32zM840 768H184V256h188.5l119.6 114.4H840V768z" } }] }, "name": "folder", "theme": "outlined" };
const FolderOutlinedSvg = FolderOutlined$2;
var FolderOutlined = function FolderOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: FolderOutlinedSvg
})
});
};
FolderOutlined.displayName = "FolderOutlined";
const FolderOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(FolderOutlined);
var Record;
(function(Record2) {
Record2[Record2["None"] = 0] = "None";
Record2[Record2["Start"] = 1] = "Start";
Record2[Record2["End"] = 2] = "End";
})(Record || (Record = {}));
function traverseNodesKey(treeData, callback) {
function processNode(dataNode) {
var key2 = dataNode.key, children = dataNode.children;
if (callback(key2, dataNode) !== false) {
traverseNodesKey(children || [], callback);
}
}
treeData.forEach(processNode);
}
function calcRangeKeys(_ref) {
var treeData = _ref.treeData, expandedKeys = _ref.expandedKeys, startKey = _ref.startKey, endKey = _ref.endKey;
var keys2 = [];
var record = Record.None;
if (startKey && startKey === endKey) {
return [startKey];
}
if (!startKey || !endKey) {
return [];
}
function matchKey(key2) {
return key2 === startKey || key2 === endKey;
}
traverseNodesKey(treeData, function(key2) {
if (record === Record.End) {
return false;
}
if (matchKey(key2)) {
keys2.push(key2);
if (record === Record.None) {
record = Record.Start;
} else if (record === Record.Start) {
record = Record.End;
return false;
}
} else if (record === Record.Start) {
keys2.push(key2);
}
return expandedKeys.includes(key2);
});
return keys2;
}
function convertDirectoryKeysToNodes(treeData, keys2) {
var restKeys = _toConsumableArray$c(keys2);
var nodes = [];
traverseNodesKey(treeData, function(key2, node) {
var index2 = restKeys.indexOf(key2);
if (index2 !== -1) {
nodes.push(node);
restKeys.splice(index2, 1);
}
return !!restKeys.length;
});
return nodes;
}
var __rest$4 = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
function getIcon(props) {
var isLeaf = props.isLeaf, expanded = props.expanded;
if (isLeaf) {
return /* @__PURE__ */ jsx(FileOutlined$1, {});
}
return expanded ? /* @__PURE__ */ jsx(FolderOpenOutlined$1, {}) : /* @__PURE__ */ jsx(FolderOutlined$1, {});
}
function getTreeData(_ref) {
var treeData = _ref.treeData, children = _ref.children;
return treeData || convertTreeToData(children);
}
var DirectoryTree = function DirectoryTree2(_a, ref) {
var defaultExpandAll = _a.defaultExpandAll, defaultExpandParent = _a.defaultExpandParent, defaultExpandedKeys = _a.defaultExpandedKeys, props = __rest$4(_a, ["defaultExpandAll", "defaultExpandParent", "defaultExpandedKeys"]);
var lastSelectedKey = React__namespace.useRef();
var cachedSelectedKeys = React__namespace.useRef();
var getInitExpandedKeys = function getInitExpandedKeys2() {
var _convertDataToEntitie = convertDataToEntities(getTreeData(props)), keyEntities = _convertDataToEntitie.keyEntities;
var initExpandedKeys;
if (defaultExpandAll) {
initExpandedKeys = Object.keys(keyEntities);
} else if (defaultExpandParent) {
initExpandedKeys = conductExpandParent(props.expandedKeys || defaultExpandedKeys || [], keyEntities);
} else {
initExpandedKeys = props.expandedKeys || defaultExpandedKeys;
}
return initExpandedKeys;
};
var _React$useState = React__namespace.useState(props.selectedKeys || props.defaultSelectedKeys || []), _React$useState2 = _slicedToArray$e(_React$useState, 2), selectedKeys = _React$useState2[0], setSelectedKeys = _React$useState2[1];
var _React$useState3 = React__namespace.useState(function() {
return getInitExpandedKeys();
}), _React$useState4 = _slicedToArray$e(_React$useState3, 2), expandedKeys = _React$useState4[0], setExpandedKeys = _React$useState4[1];
React__namespace.useEffect(function() {
if ("selectedKeys" in props) {
setSelectedKeys(props.selectedKeys);
}
}, [props.selectedKeys]);
React__namespace.useEffect(function() {
if ("expandedKeys" in props) {
setExpandedKeys(props.expandedKeys);
}
}, [props.expandedKeys]);
var onExpand = function onExpand2(keys2, info) {
var _a2;
if (!("expandedKeys" in props)) {
setExpandedKeys(keys2);
}
return (_a2 = props.onExpand) === null || _a2 === void 0 ? void 0 : _a2.call(props, keys2, info);
};
var onSelect = function onSelect2(keys2, event) {
var _a2;
var multiple = props.multiple;
var node = event.node, nativeEvent = event.nativeEvent;
var _node$key = node.key, key2 = _node$key === void 0 ? "" : _node$key;
var treeData = getTreeData(props);
var newEvent = _extends$3(_extends$3({}, event), {
selected: true
});
var ctrlPick = (nativeEvent === null || nativeEvent === void 0 ? void 0 : nativeEvent.ctrlKey) || (nativeEvent === null || nativeEvent === void 0 ? void 0 : nativeEvent.metaKey);
var shiftPick = nativeEvent === null || nativeEvent === void 0 ? void 0 : nativeEvent.shiftKey;
var newSelectedKeys;
if (multiple && ctrlPick) {
newSelectedKeys = keys2;
lastSelectedKey.current = key2;
cachedSelectedKeys.current = newSelectedKeys;
newEvent.selectedNodes = convertDirectoryKeysToNodes(treeData, newSelectedKeys);
} else if (multiple && shiftPick) {
newSelectedKeys = Array.from(new Set([].concat(_toConsumableArray$c(cachedSelectedKeys.current || []), _toConsumableArray$c(calcRangeKeys({
treeData,
expandedKeys,
startKey: key2,
endKey: lastSelectedKey.current
})))));
newEvent.selectedNodes = convertDirectoryKeysToNodes(treeData, newSelectedKeys);
} else {
newSelectedKeys = [key2];
lastSelectedKey.current = key2;
cachedSelectedKeys.current = newSelectedKeys;
newEvent.selectedNodes = convertDirectoryKeysToNodes(treeData, newSelectedKeys);
}
(_a2 = props.onSelect) === null || _a2 === void 0 ? void 0 : _a2.call(props, newSelectedKeys, newEvent);
if (!("selectedKeys" in props)) {
setSelectedKeys(newSelectedKeys);
}
};
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var customizePrefixCls = props.prefixCls, className = props.className, _props$showIcon = props.showIcon, showIcon = _props$showIcon === void 0 ? true : _props$showIcon, _props$expandAction = props.expandAction, expandAction = _props$expandAction === void 0 ? "click" : _props$expandAction, otherProps = __rest$4(props, ["prefixCls", "className", "showIcon", "expandAction"]);
var prefixCls = getPrefixCls("tree", customizePrefixCls);
var connectClassName = classnames("".concat(prefixCls, "-directory"), _defineProperty$b({}, "".concat(prefixCls, "-directory-rtl"), direction === "rtl"), className);
return /* @__PURE__ */ jsx(TreePure, {
icon: getIcon,
ref,
blockNode: true,
...otherProps,
showIcon,
expandAction,
prefixCls,
className: connectClassName,
expandedKeys,
selectedKeys,
onSelect,
onExpand
});
};
var ForwardDirectoryTree = /* @__PURE__ */ React__namespace.forwardRef(DirectoryTree);
const DirectoryTree$1 = ForwardDirectoryTree;
var Tree = TreePure;
Tree.DirectoryTree = DirectoryTree$1;
Tree.TreeNode = ContextTreeNode;
const Tree$1 = Tree;
function useSyncState(initialValue) {
var ref = React__namespace.useRef(initialValue);
var forceUpdate = useForceUpdate();
return [function() {
return ref.current;
}, function(newValue) {
ref.current = newValue;
forceUpdate();
}];
}
function FilterSearch(_ref) {
var value = _ref.value, onChange = _ref.onChange, filterSearch = _ref.filterSearch, tablePrefixCls = _ref.tablePrefixCls, locale2 = _ref.locale;
if (!filterSearch) {
return null;
}
return /* @__PURE__ */ jsx("div", {
className: "".concat(tablePrefixCls, "-filter-dropdown-search"),
children: /* @__PURE__ */ jsx(Input$2, {
prefix: /* @__PURE__ */ jsx(SearchOutlined$1, {}),
placeholder: locale2.filterSearchPlaceholder,
onChange,
value,
htmlSize: 1,
className: "".concat(tablePrefixCls, "-filter-dropdown-search-input")
})
});
}
var onKeyDown = function onKeyDown2(event) {
var keyCode = event.keyCode;
if (keyCode === KeyCode.ENTER) {
event.stopPropagation();
}
};
var FilterDropdownMenuWrapper = function FilterDropdownMenuWrapper2(props) {
return /* @__PURE__ */ jsx("div", {
className: props.className,
onClick: function onClick(e2) {
return e2.stopPropagation();
},
onKeyDown,
children: props.children
});
};
const FilterDropdownMenuWrapper$1 = FilterDropdownMenuWrapper;
function hasSubMenu(filters) {
return filters.some(function(_ref) {
var children = _ref.children;
return children;
});
}
function searchValueMatched(searchValue, text) {
if (typeof text === "string" || typeof text === "number") {
return text === null || text === void 0 ? void 0 : text.toString().toLowerCase().includes(searchValue.trim().toLowerCase());
}
return false;
}
function renderFilterItems(_ref2) {
var filters = _ref2.filters, prefixCls = _ref2.prefixCls, filteredKeys = _ref2.filteredKeys, filterMultiple = _ref2.filterMultiple, searchValue = _ref2.searchValue, filterSearch = _ref2.filterSearch;
return filters.map(function(filter2, index2) {
var key2 = String(filter2.value);
if (filter2.children) {
return {
key: key2 || index2,
label: filter2.text,
popupClassName: "".concat(prefixCls, "-dropdown-submenu"),
children: renderFilterItems({
filters: filter2.children,
prefixCls,
filteredKeys,
filterMultiple,
searchValue,
filterSearch
})
};
}
var Component = filterMultiple ? _Checkbox : _Radio;
var item = {
key: filter2.value !== void 0 ? key2 : index2,
label: /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx(Component, {
checked: filteredKeys.includes(key2)
}), /* @__PURE__ */ jsx("span", {
children: filter2.text
})]
})
};
if (searchValue.trim()) {
if (typeof filterSearch === "function") {
return filterSearch(searchValue, filter2) ? item : null;
}
return searchValueMatched(searchValue, filter2.text) ? item : null;
}
return item;
});
}
function FilterDropdown(props) {
var _a;
var tablePrefixCls = props.tablePrefixCls, prefixCls = props.prefixCls, column = props.column, dropdownPrefixCls = props.dropdownPrefixCls, columnKey = props.columnKey, filterMultiple = props.filterMultiple, _props$filterMode = props.filterMode, filterMode = _props$filterMode === void 0 ? "menu" : _props$filterMode, _props$filterSearch = props.filterSearch, filterSearch = _props$filterSearch === void 0 ? false : _props$filterSearch, filterState = props.filterState, triggerFilter = props.triggerFilter, locale2 = props.locale, children = props.children, getPopupContainer = props.getPopupContainer;
var filterDropdownOpen = column.filterDropdownOpen, onFilterDropdownOpenChange = column.onFilterDropdownOpenChange, filterDropdownVisible = column.filterDropdownVisible, onFilterDropdownVisibleChange = column.onFilterDropdownVisibleChange, filterResetToDefaultFilteredValue = column.filterResetToDefaultFilteredValue, defaultFilteredValue = column.defaultFilteredValue;
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), visible = _React$useState2[0], setVisible = _React$useState2[1];
var filtered = !!(filterState && (((_a = filterState.filteredKeys) === null || _a === void 0 ? void 0 : _a.length) || filterState.forceFiltered));
var triggerVisible = function triggerVisible2(newVisible) {
setVisible(newVisible);
onFilterDropdownOpenChange === null || onFilterDropdownOpenChange === void 0 ? void 0 : onFilterDropdownOpenChange(newVisible);
onFilterDropdownVisibleChange === null || onFilterDropdownVisibleChange === void 0 ? void 0 : onFilterDropdownVisibleChange(newVisible);
};
var mergedVisible;
if (typeof filterDropdownOpen === "boolean") {
mergedVisible = filterDropdownOpen;
} else {
mergedVisible = typeof filterDropdownVisible === "boolean" ? filterDropdownVisible : visible;
}
var propFilteredKeys = filterState === null || filterState === void 0 ? void 0 : filterState.filteredKeys;
var _useSyncState = useSyncState(propFilteredKeys || []), _useSyncState2 = _slicedToArray$e(_useSyncState, 2), getFilteredKeysSync = _useSyncState2[0], setFilteredKeysSync = _useSyncState2[1];
var onSelectKeys = function onSelectKeys2(_ref3) {
var selectedKeys2 = _ref3.selectedKeys;
setFilteredKeysSync(selectedKeys2);
};
var onCheck = function onCheck2(keys2, _ref4) {
var node = _ref4.node, checked = _ref4.checked;
if (!filterMultiple) {
onSelectKeys({
selectedKeys: checked && node.key ? [node.key] : []
});
} else {
onSelectKeys({
selectedKeys: keys2
});
}
};
React__namespace.useEffect(function() {
if (!visible) {
return;
}
onSelectKeys({
selectedKeys: propFilteredKeys || []
});
}, [propFilteredKeys]);
var _React$useState3 = React__namespace.useState([]), _React$useState4 = _slicedToArray$e(_React$useState3, 2), openKeys = _React$useState4[0], setOpenKeys = _React$useState4[1];
var onOpenChange = function onOpenChange2(keys2) {
setOpenKeys(keys2);
};
var _React$useState5 = React__namespace.useState(""), _React$useState6 = _slicedToArray$e(_React$useState5, 2), searchValue = _React$useState6[0], setSearchValue = _React$useState6[1];
var onSearch = function onSearch2(e2) {
var value = e2.target.value;
setSearchValue(value);
};
React__namespace.useEffect(function() {
if (!visible) {
setSearchValue("");
}
}, [visible]);
var internalTriggerFilter = function internalTriggerFilter2(keys2) {
var mergedKeys = keys2 && keys2.length ? keys2 : null;
if (mergedKeys === null && (!filterState || !filterState.filteredKeys)) {
return null;
}
if (isEqual_1(mergedKeys, filterState === null || filterState === void 0 ? void 0 : filterState.filteredKeys)) {
return null;
}
triggerFilter({
column,
key: columnKey,
filteredKeys: mergedKeys
});
};
var onConfirm = function onConfirm2() {
triggerVisible(false);
internalTriggerFilter(getFilteredKeysSync());
};
var onReset = function onReset2() {
var _ref5 = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {
confirm: false,
closeDropdown: false
}, confirm = _ref5.confirm, closeDropdown = _ref5.closeDropdown;
if (confirm) {
internalTriggerFilter([]);
}
if (closeDropdown) {
triggerVisible(false);
}
setSearchValue("");
if (filterResetToDefaultFilteredValue) {
setFilteredKeysSync((defaultFilteredValue || []).map(function(key2) {
return String(key2);
}));
} else {
setFilteredKeysSync([]);
}
};
var doFilter = function doFilter2() {
var _ref6 = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {
closeDropdown: true
}, closeDropdown = _ref6.closeDropdown;
if (closeDropdown) {
triggerVisible(false);
}
internalTriggerFilter(getFilteredKeysSync());
};
var onVisibleChange = function onVisibleChange2(newVisible) {
if (newVisible && propFilteredKeys !== void 0) {
setFilteredKeysSync(propFilteredKeys || []);
}
triggerVisible(newVisible);
if (!newVisible && !column.filterDropdown) {
onConfirm();
}
};
var dropdownMenuClass = classnames(_defineProperty$b({}, "".concat(dropdownPrefixCls, "-menu-without-submenu"), !hasSubMenu(column.filters || [])));
var onCheckAll = function onCheckAll2(e2) {
if (e2.target.checked) {
var allFilterKeys = flattenKeys(column === null || column === void 0 ? void 0 : column.filters).map(function(key2) {
return String(key2);
});
setFilteredKeysSync(allFilterKeys);
} else {
setFilteredKeysSync([]);
}
};
var getTreeData2 = function getTreeData3(_ref7) {
var filters = _ref7.filters;
return (filters || []).map(function(filter2, index2) {
var key2 = String(filter2.value);
var item = {
title: filter2.text,
key: filter2.value !== void 0 ? key2 : index2
};
if (filter2.children) {
item.children = getTreeData3({
filters: filter2.children
});
}
return item;
});
};
var getFilterData2 = function getFilterData3(node) {
var _a2;
return _extends$3(_extends$3({}, node), {
text: node.title,
value: node.key,
children: ((_a2 = node.children) === null || _a2 === void 0 ? void 0 : _a2.map(function(item) {
return getFilterData3(item);
})) || []
});
};
var dropdownContent;
if (typeof column.filterDropdown === "function") {
dropdownContent = column.filterDropdown({
prefixCls: "".concat(dropdownPrefixCls, "-custom"),
setSelectedKeys: function setSelectedKeys(selectedKeys2) {
return onSelectKeys({
selectedKeys: selectedKeys2
});
},
selectedKeys: getFilteredKeysSync(),
confirm: doFilter,
clearFilters: onReset,
filters: column.filters,
visible: mergedVisible,
close: function close() {
triggerVisible(false);
}
});
} else if (column.filterDropdown) {
dropdownContent = column.filterDropdown;
} else {
var selectedKeys = getFilteredKeysSync() || [];
var getFilterComponent = function getFilterComponent2() {
if ((column.filters || []).length === 0) {
return /* @__PURE__ */ jsx(Empty$2, {
image: Empty$2.PRESENTED_IMAGE_SIMPLE,
description: locale2.filterEmptyText,
imageStyle: {
height: 24
},
style: {
margin: 0,
padding: "16px 0"
}
});
}
if (filterMode === "tree") {
return /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx(FilterSearch, {
filterSearch,
value: searchValue,
onChange: onSearch,
tablePrefixCls,
locale: locale2
}), /* @__PURE__ */ jsxs("div", {
className: "".concat(tablePrefixCls, "-filter-dropdown-tree"),
children: [filterMultiple ? /* @__PURE__ */ jsx(_Checkbox, {
checked: selectedKeys.length === flattenKeys(column.filters).length,
indeterminate: selectedKeys.length > 0 && selectedKeys.length < flattenKeys(column.filters).length,
className: "".concat(tablePrefixCls, "-filter-dropdown-checkall"),
onChange: onCheckAll,
children: locale2.filterCheckall
}) : null, /* @__PURE__ */ jsx(Tree$1, {
checkable: true,
selectable: false,
blockNode: true,
multiple: filterMultiple,
checkStrictly: !filterMultiple,
className: "".concat(dropdownPrefixCls, "-menu"),
onCheck,
checkedKeys: selectedKeys,
selectedKeys,
showIcon: false,
treeData: getTreeData2({
filters: column.filters
}),
autoExpandParent: true,
defaultExpandAll: true,
filterTreeNode: searchValue.trim() ? function(node) {
if (typeof filterSearch === "function") {
return filterSearch(searchValue, getFilterData2(node));
}
return searchValueMatched(searchValue, node.title);
} : void 0
})]
})]
});
}
return /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx(FilterSearch, {
filterSearch,
value: searchValue,
onChange: onSearch,
tablePrefixCls,
locale: locale2
}), /* @__PURE__ */ jsx(Menu$1, {
selectable: true,
multiple: filterMultiple,
prefixCls: "".concat(dropdownPrefixCls, "-menu"),
className: dropdownMenuClass,
onSelect: onSelectKeys,
onDeselect: onSelectKeys,
selectedKeys,
getPopupContainer,
openKeys,
onOpenChange,
items: renderFilterItems({
filters: column.filters || [],
filterSearch,
prefixCls,
filteredKeys: getFilteredKeysSync(),
filterMultiple,
searchValue
})
})]
});
};
var getResetDisabled = function getResetDisabled2() {
if (filterResetToDefaultFilteredValue) {
return isEqual_1((defaultFilteredValue || []).map(function(key2) {
return String(key2);
}), selectedKeys);
}
return selectedKeys.length === 0;
};
dropdownContent = /* @__PURE__ */ jsxs(Fragment, {
children: [getFilterComponent(), /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-dropdown-btns"),
children: [/* @__PURE__ */ jsx(Button$2, {
type: "link",
size: "small",
disabled: getResetDisabled(),
onClick: function onClick() {
return onReset();
},
children: locale2.filterReset
}), /* @__PURE__ */ jsx(Button$2, {
type: "primary",
size: "small",
onClick: onConfirm,
children: locale2.filterConfirm
})]
})]
});
}
if (column.filterDropdown) {
dropdownContent = /* @__PURE__ */ jsx(OverrideProvider, {
selectable: void 0,
children: dropdownContent
});
}
var menu = function menu2() {
return /* @__PURE__ */ jsx(FilterDropdownMenuWrapper$1, {
className: "".concat(prefixCls, "-dropdown"),
children: dropdownContent
});
};
var filterIcon;
if (typeof column.filterIcon === "function") {
filterIcon = column.filterIcon(filtered);
} else if (column.filterIcon) {
filterIcon = column.filterIcon;
} else {
filterIcon = /* @__PURE__ */ jsx(FilterFilled$1, {});
}
var _React$useContext = React__namespace.useContext(ConfigContext$1), direction = _React$useContext.direction;
return /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-column"),
children: [/* @__PURE__ */ jsx("span", {
className: "".concat(tablePrefixCls, "-column-title"),
children
}), /* @__PURE__ */ jsx(Dropdown$1, {
dropdownRender: menu,
trigger: ["click"],
open: mergedVisible,
onOpenChange: onVisibleChange,
getPopupContainer,
placement: direction === "rtl" ? "bottomLeft" : "bottomRight",
children: /* @__PURE__ */ jsx("span", {
role: "button",
tabIndex: -1,
className: classnames("".concat(prefixCls, "-trigger"), {
active: filtered
}),
onClick: function onClick(e2) {
e2.stopPropagation();
},
children: filterIcon
})
})]
});
}
function collectFilterStates(columns, init2, pos) {
var filterStates = [];
(columns || []).forEach(function(column, index2) {
var _a;
var columnPos = getColumnPos(index2, pos);
if (column.filters || "filterDropdown" in column || "onFilter" in column) {
if ("filteredValue" in column) {
var filteredValues = column.filteredValue;
if (!("filterDropdown" in column)) {
filteredValues = (_a = filteredValues === null || filteredValues === void 0 ? void 0 : filteredValues.map(String)) !== null && _a !== void 0 ? _a : filteredValues;
}
filterStates.push({
column,
key: getColumnKey(column, columnPos),
filteredKeys: filteredValues,
forceFiltered: column.filtered
});
} else {
filterStates.push({
column,
key: getColumnKey(column, columnPos),
filteredKeys: init2 && column.defaultFilteredValue ? column.defaultFilteredValue : void 0,
forceFiltered: column.filtered
});
}
}
if ("children" in column) {
filterStates = [].concat(_toConsumableArray$c(filterStates), _toConsumableArray$c(collectFilterStates(column.children, init2, columnPos)));
}
});
return filterStates;
}
function injectFilter(prefixCls, dropdownPrefixCls, columns, filterStates, triggerFilter, getPopupContainer, locale2, pos) {
return columns.map(function(column, index2) {
var columnPos = getColumnPos(index2, pos);
var _column$filterMultipl = column.filterMultiple, filterMultiple = _column$filterMultipl === void 0 ? true : _column$filterMultipl, filterMode = column.filterMode, filterSearch = column.filterSearch;
var newColumn = column;
if (newColumn.filters || newColumn.filterDropdown) {
var columnKey = getColumnKey(newColumn, columnPos);
var filterState = filterStates.find(function(_ref) {
var key2 = _ref.key;
return columnKey === key2;
});
newColumn = _extends$3(_extends$3({}, newColumn), {
title: function title(renderProps) {
return /* @__PURE__ */ jsx(FilterDropdown, {
tablePrefixCls: prefixCls,
prefixCls: "".concat(prefixCls, "-filter"),
dropdownPrefixCls,
column: newColumn,
columnKey,
filterState,
filterMultiple,
filterMode,
filterSearch,
triggerFilter,
locale: locale2,
getPopupContainer,
children: renderColumnTitle(column.title, renderProps)
});
}
});
}
if ("children" in newColumn) {
newColumn = _extends$3(_extends$3({}, newColumn), {
children: injectFilter(prefixCls, dropdownPrefixCls, newColumn.children, filterStates, triggerFilter, getPopupContainer, locale2, columnPos)
});
}
return newColumn;
});
}
function flattenKeys(filters) {
var keys2 = [];
(filters || []).forEach(function(_ref2) {
var value = _ref2.value, children = _ref2.children;
keys2.push(value);
if (children) {
keys2 = [].concat(_toConsumableArray$c(keys2), _toConsumableArray$c(flattenKeys(children)));
}
});
return keys2;
}
function generateFilterInfo(filterStates) {
var currentFilters = {};
filterStates.forEach(function(_ref3) {
var key2 = _ref3.key, filteredKeys = _ref3.filteredKeys, column = _ref3.column;
var filters = column.filters, filterDropdown = column.filterDropdown;
if (filterDropdown) {
currentFilters[key2] = filteredKeys || null;
} else if (Array.isArray(filteredKeys)) {
var keys2 = flattenKeys(filters);
currentFilters[key2] = keys2.filter(function(originKey) {
return filteredKeys.includes(String(originKey));
});
} else {
currentFilters[key2] = null;
}
});
return currentFilters;
}
function getFilterData(data, filterStates) {
return filterStates.reduce(function(currentData, filterState) {
var _filterState$column = filterState.column, onFilter = _filterState$column.onFilter, filters = _filterState$column.filters, filteredKeys = filterState.filteredKeys;
if (onFilter && filteredKeys && filteredKeys.length) {
return currentData.filter(function(record) {
return filteredKeys.some(function(key2) {
var keys2 = flattenKeys(filters);
var keyIndex = keys2.findIndex(function(k2) {
return String(k2) === String(key2);
});
var realKey = keyIndex !== -1 ? keys2[keyIndex] : key2;
return onFilter(realKey, record);
});
});
}
return currentData;
}, data);
}
function useFilter(_ref4) {
var prefixCls = _ref4.prefixCls, dropdownPrefixCls = _ref4.dropdownPrefixCls, mergedColumns = _ref4.mergedColumns, onFilterChange = _ref4.onFilterChange, getPopupContainer = _ref4.getPopupContainer, tableLocale = _ref4.locale;
var _React$useState = React__namespace.useState(function() {
return collectFilterStates(mergedColumns, true);
}), _React$useState2 = _slicedToArray$e(_React$useState, 2), filterStates = _React$useState2[0], setFilterStates = _React$useState2[1];
var mergedFilterStates = React__namespace.useMemo(function() {
var collectedStates = collectFilterStates(mergedColumns, false);
var filteredKeysIsAllNotControlled = true;
collectedStates.forEach(function(_ref5) {
var filteredKeys = _ref5.filteredKeys;
if (filteredKeys !== void 0) {
filteredKeysIsAllNotControlled = false;
}
});
if (filteredKeysIsAllNotControlled) {
return filterStates;
}
return collectedStates;
}, [mergedColumns, filterStates]);
var filters = React__namespace.useMemo(function() {
return generateFilterInfo(mergedFilterStates);
}, [mergedFilterStates]);
var triggerFilter = function triggerFilter2(filterState) {
var newFilterStates = mergedFilterStates.filter(function(_ref6) {
var key2 = _ref6.key;
return key2 !== filterState.key;
});
newFilterStates.push(filterState);
setFilterStates(newFilterStates);
onFilterChange(generateFilterInfo(newFilterStates), newFilterStates);
};
var transformColumns = function transformColumns2(innerColumns) {
return injectFilter(prefixCls, dropdownPrefixCls, innerColumns, mergedFilterStates, triggerFilter, getPopupContainer, tableLocale);
};
return [transformColumns, mergedFilterStates, filters];
}
function useLazyKVMap(data, childrenColumnName, getRowKey) {
var mapCacheRef = React__namespace.useRef({});
function getRecordByKey(key2) {
if (!mapCacheRef.current || mapCacheRef.current.data !== data || mapCacheRef.current.childrenColumnName !== childrenColumnName || mapCacheRef.current.getRowKey !== getRowKey) {
let dig = function(records) {
records.forEach(function(record, index2) {
var rowKey = getRowKey(record, index2);
kvMap.set(rowKey, record);
if (record && _typeof$q(record) === "object" && childrenColumnName in record) {
dig(record[childrenColumnName] || []);
}
});
};
var kvMap = /* @__PURE__ */ new Map();
dig(data);
mapCacheRef.current = {
data,
childrenColumnName,
kvMap,
getRowKey
};
}
return mapCacheRef.current.kvMap.get(key2);
}
return [getRecordByKey];
}
var __rest$3 = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var DEFAULT_PAGE_SIZE = 10;
function getPaginationParam(pagination, mergedPagination) {
var param = {
current: mergedPagination.current,
pageSize: mergedPagination.pageSize
};
var paginationObj = pagination && _typeof$q(pagination) === "object" ? pagination : {};
Object.keys(paginationObj).forEach(function(pageProp) {
var value = mergedPagination[pageProp];
if (typeof value !== "function") {
param[pageProp] = value;
}
});
return param;
}
function extendsObject() {
var result = {};
for (var _len = arguments.length, list = new Array(_len), _key = 0; _key < _len; _key++) {
list[_key] = arguments[_key];
}
list.forEach(function(obj) {
if (obj) {
Object.keys(obj).forEach(function(key2) {
var val = obj[key2];
if (val !== void 0) {
result[key2] = val;
}
});
}
});
return result;
}
function usePagination(total, pagination, onChange) {
var _a = pagination && _typeof$q(pagination) === "object" ? pagination : {}, _a$total = _a.total, paginationTotal = _a$total === void 0 ? 0 : _a$total, paginationObj = __rest$3(_a, ["total"]);
var _useState = React$a.useState(function() {
return {
current: "defaultCurrent" in paginationObj ? paginationObj.defaultCurrent : 1,
pageSize: "defaultPageSize" in paginationObj ? paginationObj.defaultPageSize : DEFAULT_PAGE_SIZE
};
}), _useState2 = _slicedToArray$e(_useState, 2), innerPagination = _useState2[0], setInnerPagination = _useState2[1];
var mergedPagination = extendsObject(innerPagination, paginationObj, {
total: paginationTotal > 0 ? paginationTotal : total
});
var maxPage = Math.ceil((paginationTotal || total) / mergedPagination.pageSize);
if (mergedPagination.current > maxPage) {
mergedPagination.current = maxPage || 1;
}
var refreshPagination = function refreshPagination2(current, pageSize) {
setInnerPagination({
current: current !== null && current !== void 0 ? current : 1,
pageSize: pageSize || mergedPagination.pageSize
});
};
var onInternalChange = function onInternalChange2(current, pageSize) {
var _a2;
if (pagination) {
(_a2 = pagination.onChange) === null || _a2 === void 0 ? void 0 : _a2.call(pagination, current, pageSize);
}
refreshPagination(current, pageSize);
onChange(current, pageSize || (mergedPagination === null || mergedPagination === void 0 ? void 0 : mergedPagination.pageSize));
};
if (pagination === false) {
return [{}, function() {
}];
}
return [_extends$3(_extends$3({}, mergedPagination), {
onChange: onInternalChange
}), refreshPagination];
}
var SELECTION_COLUMN = {};
var SELECTION_ALL = "SELECT_ALL";
var SELECTION_INVERT = "SELECT_INVERT";
var SELECTION_NONE = "SELECT_NONE";
var EMPTY_LIST$1 = [];
function flattenData(data, childrenColumnName) {
var list = [];
(data || []).forEach(function(record) {
list.push(record);
if (record && _typeof$q(record) === "object" && childrenColumnName in record) {
list = [].concat(_toConsumableArray$c(list), _toConsumableArray$c(flattenData(record[childrenColumnName], childrenColumnName)));
}
});
return list;
}
function useSelection(rowSelection, config) {
var _ref = rowSelection || {}, preserveSelectedRowKeys = _ref.preserveSelectedRowKeys, selectedRowKeys = _ref.selectedRowKeys, defaultSelectedRowKeys = _ref.defaultSelectedRowKeys, getCheckboxProps = _ref.getCheckboxProps, onSelectionChange = _ref.onChange, onSelect = _ref.onSelect, onSelectAll = _ref.onSelectAll, onSelectInvert = _ref.onSelectInvert, onSelectNone = _ref.onSelectNone, onSelectMultiple = _ref.onSelectMultiple, selectionColWidth = _ref.columnWidth, selectionType = _ref.type, selections = _ref.selections, fixed = _ref.fixed, customizeRenderCell = _ref.renderCell, hideSelectAll = _ref.hideSelectAll, _ref$checkStrictly = _ref.checkStrictly, checkStrictly = _ref$checkStrictly === void 0 ? true : _ref$checkStrictly;
var prefixCls = config.prefixCls, data = config.data, pageData = config.pageData, getRecordByKey = config.getRecordByKey, getRowKey = config.getRowKey, expandType = config.expandType, childrenColumnName = config.childrenColumnName, tableLocale = config.locale, getPopupContainer = config.getPopupContainer;
var _useMergedState = useMergedState(selectedRowKeys || defaultSelectedRowKeys || EMPTY_LIST$1, {
value: selectedRowKeys
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), mergedSelectedKeys = _useMergedState2[0], setMergedSelectedKeys = _useMergedState2[1];
var preserveRecordsRef = React__namespace.useRef(/* @__PURE__ */ new Map());
var updatePreserveRecordsCache = React$a.useCallback(function(keys2) {
if (preserveSelectedRowKeys) {
var newCache = /* @__PURE__ */ new Map();
keys2.forEach(function(key2) {
var record = getRecordByKey(key2);
if (!record && preserveRecordsRef.current.has(key2)) {
record = preserveRecordsRef.current.get(key2);
}
newCache.set(key2, record);
});
preserveRecordsRef.current = newCache;
}
}, [getRecordByKey, preserveSelectedRowKeys]);
React__namespace.useEffect(function() {
updatePreserveRecordsCache(mergedSelectedKeys);
}, [mergedSelectedKeys]);
var _useMemo = React$a.useMemo(function() {
return checkStrictly ? {
keyEntities: null
} : convertDataToEntities(data, {
externalGetKey: getRowKey,
childrenPropName: childrenColumnName
});
}, [data, getRowKey, checkStrictly, childrenColumnName]), keyEntities = _useMemo.keyEntities;
var flattedData = React$a.useMemo(function() {
return flattenData(pageData, childrenColumnName);
}, [pageData, childrenColumnName]);
var checkboxPropsMap = React$a.useMemo(function() {
var map = /* @__PURE__ */ new Map();
flattedData.forEach(function(record, index2) {
var key2 = getRowKey(record, index2);
var checkboxProps = (getCheckboxProps ? getCheckboxProps(record) : null) || {};
map.set(key2, checkboxProps);
});
return map;
}, [flattedData, getRowKey, getCheckboxProps]);
var isCheckboxDisabled = React$a.useCallback(function(r2) {
var _a;
return !!((_a = checkboxPropsMap.get(getRowKey(r2))) === null || _a === void 0 ? void 0 : _a.disabled);
}, [checkboxPropsMap, getRowKey]);
var _useMemo2 = React$a.useMemo(function() {
if (checkStrictly) {
return [mergedSelectedKeys || [], []];
}
var _conductCheck = conductCheck(mergedSelectedKeys, true, keyEntities, isCheckboxDisabled), checkedKeys = _conductCheck.checkedKeys, halfCheckedKeys = _conductCheck.halfCheckedKeys;
return [checkedKeys || [], halfCheckedKeys];
}, [mergedSelectedKeys, checkStrictly, keyEntities, isCheckboxDisabled]), _useMemo3 = _slicedToArray$e(_useMemo2, 2), derivedSelectedKeys = _useMemo3[0], derivedHalfSelectedKeys = _useMemo3[1];
var derivedSelectedKeySet = React$a.useMemo(function() {
var keys2 = selectionType === "radio" ? derivedSelectedKeys.slice(0, 1) : derivedSelectedKeys;
return new Set(keys2);
}, [derivedSelectedKeys, selectionType]);
var derivedHalfSelectedKeySet = React$a.useMemo(function() {
return selectionType === "radio" ? /* @__PURE__ */ new Set() : new Set(derivedHalfSelectedKeys);
}, [derivedHalfSelectedKeys, selectionType]);
var _useState = React$a.useState(null), _useState2 = _slicedToArray$e(_useState, 2), lastSelectedKey = _useState2[0], setLastSelectedKey = _useState2[1];
React__namespace.useEffect(function() {
if (!rowSelection) {
setMergedSelectedKeys(EMPTY_LIST$1);
}
}, [!!rowSelection]);
var setSelectedKeys = React$a.useCallback(function(keys2, method2) {
var availableKeys;
var records;
updatePreserveRecordsCache(keys2);
if (preserveSelectedRowKeys) {
availableKeys = keys2;
records = keys2.map(function(key2) {
return preserveRecordsRef.current.get(key2);
});
} else {
availableKeys = [];
records = [];
keys2.forEach(function(key2) {
var record = getRecordByKey(key2);
if (record !== void 0) {
availableKeys.push(key2);
records.push(record);
}
});
}
setMergedSelectedKeys(availableKeys);
onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange(availableKeys, records, {
type: method2
});
}, [setMergedSelectedKeys, getRecordByKey, onSelectionChange, preserveSelectedRowKeys]);
var triggerSingleSelection = React$a.useCallback(function(key2, selected, keys2, event) {
if (onSelect) {
var rows = keys2.map(function(k2) {
return getRecordByKey(k2);
});
onSelect(getRecordByKey(key2), selected, rows, event);
}
setSelectedKeys(keys2, "single");
}, [onSelect, getRecordByKey, setSelectedKeys]);
var mergedSelections = React$a.useMemo(function() {
if (!selections || hideSelectAll) {
return null;
}
var selectionList = selections === true ? [SELECTION_ALL, SELECTION_INVERT, SELECTION_NONE] : selections;
return selectionList.map(function(selection) {
if (selection === SELECTION_ALL) {
return {
key: "all",
text: tableLocale.selectionAll,
onSelect: function onSelect2() {
setSelectedKeys(data.map(function(record, index2) {
return getRowKey(record, index2);
}).filter(function(key2) {
var checkProps = checkboxPropsMap.get(key2);
return !(checkProps === null || checkProps === void 0 ? void 0 : checkProps.disabled) || derivedSelectedKeySet.has(key2);
}), "all");
}
};
}
if (selection === SELECTION_INVERT) {
return {
key: "invert",
text: tableLocale.selectInvert,
onSelect: function onSelect2() {
var keySet = new Set(derivedSelectedKeySet);
pageData.forEach(function(record, index2) {
var key2 = getRowKey(record, index2);
var checkProps = checkboxPropsMap.get(key2);
if (!(checkProps === null || checkProps === void 0 ? void 0 : checkProps.disabled)) {
if (keySet.has(key2)) {
keySet["delete"](key2);
} else {
keySet.add(key2);
}
}
});
var keys2 = Array.from(keySet);
if (onSelectInvert) {
onSelectInvert(keys2);
}
setSelectedKeys(keys2, "invert");
}
};
}
if (selection === SELECTION_NONE) {
return {
key: "none",
text: tableLocale.selectNone,
onSelect: function onSelect2() {
onSelectNone === null || onSelectNone === void 0 ? void 0 : onSelectNone();
setSelectedKeys(Array.from(derivedSelectedKeySet).filter(function(key2) {
var checkProps = checkboxPropsMap.get(key2);
return checkProps === null || checkProps === void 0 ? void 0 : checkProps.disabled;
}), "none");
}
};
}
return selection;
}).map(function(selection) {
return _extends$3(_extends$3({}, selection), {
onSelect: function onSelect2() {
var _a2;
var _a;
for (var _len = arguments.length, rest = new Array(_len), _key = 0; _key < _len; _key++) {
rest[_key] = arguments[_key];
}
(_a = selection.onSelect) === null || _a === void 0 ? void 0 : (_a2 = _a).call.apply(_a2, [selection].concat(rest));
setLastSelectedKey(null);
}
});
});
}, [selections, derivedSelectedKeySet, pageData, getRowKey, onSelectInvert, setSelectedKeys]);
var transformColumns = React$a.useCallback(function(columns) {
var _a;
if (!rowSelection) {
return columns.filter(function(col) {
return col !== SELECTION_COLUMN;
});
}
var cloneColumns = _toConsumableArray$c(columns);
var keySet = new Set(derivedSelectedKeySet);
var recordKeys = flattedData.map(getRowKey).filter(function(key2) {
return !checkboxPropsMap.get(key2).disabled;
});
var checkedCurrentAll = recordKeys.every(function(key2) {
return keySet.has(key2);
});
var checkedCurrentSome = recordKeys.some(function(key2) {
return keySet.has(key2);
});
var onSelectAllChange = function onSelectAllChange2() {
var changeKeys = [];
if (checkedCurrentAll) {
recordKeys.forEach(function(key2) {
keySet["delete"](key2);
changeKeys.push(key2);
});
} else {
recordKeys.forEach(function(key2) {
if (!keySet.has(key2)) {
keySet.add(key2);
changeKeys.push(key2);
}
});
}
var keys2 = Array.from(keySet);
onSelectAll === null || onSelectAll === void 0 ? void 0 : onSelectAll(!checkedCurrentAll, keys2.map(function(k2) {
return getRecordByKey(k2);
}), changeKeys.map(function(k2) {
return getRecordByKey(k2);
}));
setSelectedKeys(keys2, "all");
setLastSelectedKey(null);
};
var title;
if (selectionType !== "radio") {
var customizeSelections;
if (mergedSelections) {
var menu = {
getPopupContainer,
items: mergedSelections.map(function(selection, index2) {
var key2 = selection.key, text = selection.text, onSelectionClick = selection.onSelect;
return {
key: key2 || index2,
onClick: function onClick() {
onSelectionClick === null || onSelectionClick === void 0 ? void 0 : onSelectionClick(recordKeys);
},
label: text
};
})
};
customizeSelections = /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-selection-extra"),
children: /* @__PURE__ */ jsx(Dropdown$1, {
menu,
getPopupContainer,
children: /* @__PURE__ */ jsx("span", {
children: /* @__PURE__ */ jsx(DownOutlined$4, {})
})
})
});
}
var allDisabledData = flattedData.map(function(record, index2) {
var key2 = getRowKey(record, index2);
var checkboxProps = checkboxPropsMap.get(key2) || {};
return _extends$3({
checked: keySet.has(key2)
}, checkboxProps);
}).filter(function(_ref2) {
var disabled = _ref2.disabled;
return disabled;
});
var allDisabled = !!allDisabledData.length && allDisabledData.length === flattedData.length;
var allDisabledAndChecked = allDisabled && allDisabledData.every(function(_ref3) {
var checked = _ref3.checked;
return checked;
});
var allDisabledSomeChecked = allDisabled && allDisabledData.some(function(_ref4) {
var checked = _ref4.checked;
return checked;
});
title = !hideSelectAll && /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-selection"),
children: [/* @__PURE__ */ jsx(_Checkbox, {
checked: !allDisabled ? !!flattedData.length && checkedCurrentAll : allDisabledAndChecked,
indeterminate: !allDisabled ? !checkedCurrentAll && checkedCurrentSome : !allDisabledAndChecked && allDisabledSomeChecked,
onChange: onSelectAllChange,
disabled: flattedData.length === 0 || allDisabled,
"aria-label": customizeSelections ? "Custom selection" : "Select all",
skipGroup: true
}), customizeSelections]
});
}
var renderCell;
if (selectionType === "radio") {
renderCell = function renderCell2(_, record, index2) {
var key2 = getRowKey(record, index2);
var checked = keySet.has(key2);
return {
node: /* @__PURE__ */ jsx(_Radio, {
...checkboxPropsMap.get(key2),
checked,
onClick: function onClick(e2) {
return e2.stopPropagation();
},
onChange: function onChange(event) {
if (!keySet.has(key2)) {
triggerSingleSelection(key2, true, [key2], event.nativeEvent);
}
}
}),
checked
};
};
} else {
renderCell = function renderCell2(_, record, index2) {
var _a2;
var key2 = getRowKey(record, index2);
var checked = keySet.has(key2);
var indeterminate = derivedHalfSelectedKeySet.has(key2);
var checkboxProps = checkboxPropsMap.get(key2);
var mergedIndeterminate;
if (expandType === "nest") {
mergedIndeterminate = indeterminate;
} else {
mergedIndeterminate = (_a2 = checkboxProps === null || checkboxProps === void 0 ? void 0 : checkboxProps.indeterminate) !== null && _a2 !== void 0 ? _a2 : indeterminate;
}
return {
node: /* @__PURE__ */ jsx(_Checkbox, {
...checkboxProps,
indeterminate: mergedIndeterminate,
checked,
skipGroup: true,
onClick: function onClick(e2) {
return e2.stopPropagation();
},
onChange: function onChange(_ref5) {
var nativeEvent = _ref5.nativeEvent;
var shiftKey = nativeEvent.shiftKey;
var startIndex = -1;
var endIndex = -1;
if (shiftKey && checkStrictly) {
var pointKeys = /* @__PURE__ */ new Set([lastSelectedKey, key2]);
recordKeys.some(function(recordKey, recordIndex) {
if (pointKeys.has(recordKey)) {
if (startIndex === -1) {
startIndex = recordIndex;
} else {
endIndex = recordIndex;
return true;
}
}
return false;
});
}
if (endIndex !== -1 && startIndex !== endIndex && checkStrictly) {
var rangeKeys = recordKeys.slice(startIndex, endIndex + 1);
var changedKeys = [];
if (checked) {
rangeKeys.forEach(function(recordKey) {
if (keySet.has(recordKey)) {
changedKeys.push(recordKey);
keySet["delete"](recordKey);
}
});
} else {
rangeKeys.forEach(function(recordKey) {
if (!keySet.has(recordKey)) {
changedKeys.push(recordKey);
keySet.add(recordKey);
}
});
}
var keys2 = Array.from(keySet);
onSelectMultiple === null || onSelectMultiple === void 0 ? void 0 : onSelectMultiple(!checked, keys2.map(function(recordKey) {
return getRecordByKey(recordKey);
}), changedKeys.map(function(recordKey) {
return getRecordByKey(recordKey);
}));
setSelectedKeys(keys2, "multiple");
} else {
var originCheckedKeys = derivedSelectedKeys;
if (checkStrictly) {
var checkedKeys = checked ? arrDel(originCheckedKeys, key2) : arrAdd(originCheckedKeys, key2);
triggerSingleSelection(key2, !checked, checkedKeys, nativeEvent);
} else {
var result = conductCheck([].concat(_toConsumableArray$c(originCheckedKeys), [key2]), true, keyEntities, isCheckboxDisabled);
var _checkedKeys = result.checkedKeys, halfCheckedKeys = result.halfCheckedKeys;
var nextCheckedKeys = _checkedKeys;
if (checked) {
var tempKeySet = new Set(_checkedKeys);
tempKeySet["delete"](key2);
nextCheckedKeys = conductCheck(Array.from(tempKeySet), {
checked: false,
halfCheckedKeys
}, keyEntities, isCheckboxDisabled).checkedKeys;
}
triggerSingleSelection(key2, !checked, nextCheckedKeys, nativeEvent);
}
}
if (checked) {
setLastSelectedKey(null);
} else {
setLastSelectedKey(key2);
}
}
}),
checked
};
};
}
var renderSelectionCell = function renderSelectionCell2(_, record, index2) {
var _renderCell = renderCell(_, record, index2), node = _renderCell.node, checked = _renderCell.checked;
if (customizeRenderCell) {
return customizeRenderCell(checked, record, index2, node);
}
return node;
};
if (!cloneColumns.includes(SELECTION_COLUMN)) {
if (cloneColumns.findIndex(function(col) {
var _a2;
return ((_a2 = col[INTERNAL_COL_DEFINE]) === null || _a2 === void 0 ? void 0 : _a2.columnType) === "EXPAND_COLUMN";
}) === 0) {
var _cloneColumns = cloneColumns, _cloneColumns2 = _toArray$1(_cloneColumns), expandColumn = _cloneColumns2[0], restColumns = _cloneColumns2.slice(1);
cloneColumns = [expandColumn, SELECTION_COLUMN].concat(_toConsumableArray$c(restColumns));
} else {
cloneColumns = [SELECTION_COLUMN].concat(_toConsumableArray$c(cloneColumns));
}
}
var selectionColumnIndex = cloneColumns.indexOf(SELECTION_COLUMN);
cloneColumns = cloneColumns.filter(function(column, index2) {
return column !== SELECTION_COLUMN || index2 === selectionColumnIndex;
});
var prevCol = cloneColumns[selectionColumnIndex - 1];
var nextCol = cloneColumns[selectionColumnIndex + 1];
var mergedFixed = fixed;
if (mergedFixed === void 0) {
if ((nextCol === null || nextCol === void 0 ? void 0 : nextCol.fixed) !== void 0) {
mergedFixed = nextCol.fixed;
} else if ((prevCol === null || prevCol === void 0 ? void 0 : prevCol.fixed) !== void 0) {
mergedFixed = prevCol.fixed;
}
}
if (mergedFixed && prevCol && ((_a = prevCol[INTERNAL_COL_DEFINE]) === null || _a === void 0 ? void 0 : _a.columnType) === "EXPAND_COLUMN" && prevCol.fixed === void 0) {
prevCol.fixed = mergedFixed;
}
var selectionColumn = _defineProperty$b({
fixed: mergedFixed,
width: selectionColWidth,
className: "".concat(prefixCls, "-selection-column"),
title: rowSelection.columnTitle || title,
render: renderSelectionCell
}, INTERNAL_COL_DEFINE, {
className: "".concat(prefixCls, "-selection-col")
});
return cloneColumns.map(function(col) {
return col === SELECTION_COLUMN ? selectionColumn : col;
});
}, [getRowKey, flattedData, rowSelection, derivedSelectedKeys, derivedSelectedKeySet, derivedHalfSelectedKeySet, selectionColWidth, mergedSelections, expandType, lastSelectedKey, checkboxPropsMap, onSelectMultiple, triggerSingleSelection, isCheckboxDisabled]);
return [transformColumns, derivedSelectedKeySet];
}
var CaretDownOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "0 0 1024 1024", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M840.4 300H183.6c-19.7 0-30.7 20.8-18.5 35l328.4 380.8c9.4 10.9 27.5 10.9 37 0L858.9 335c12.2-14.2 1.2-35-18.5-35z" } }] }, "name": "caret-down", "theme": "outlined" };
const CaretDownOutlinedSvg = CaretDownOutlined$2;
var CaretDownOutlined = function CaretDownOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: CaretDownOutlinedSvg
})
});
};
CaretDownOutlined.displayName = "CaretDownOutlined";
const CaretDownOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(CaretDownOutlined);
var CaretUpOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "0 0 1024 1024", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M858.9 689L530.5 308.2c-9.4-10.9-27.5-10.9-37 0L165.1 689c-12.2 14.2-1.2 35 18.5 35h656.8c19.7 0 30.7-20.8 18.5-35z" } }] }, "name": "caret-up", "theme": "outlined" };
const CaretUpOutlinedSvg = CaretUpOutlined$2;
var CaretUpOutlined = function CaretUpOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: CaretUpOutlinedSvg
})
});
};
CaretUpOutlined.displayName = "CaretUpOutlined";
const CaretUpOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(CaretUpOutlined);
var ASCEND = "ascend";
var DESCEND = "descend";
function getMultiplePriority(column) {
if (_typeof$q(column.sorter) === "object" && typeof column.sorter.multiple === "number") {
return column.sorter.multiple;
}
return false;
}
function getSortFunction(sorter) {
if (typeof sorter === "function") {
return sorter;
}
if (sorter && _typeof$q(sorter) === "object" && sorter.compare) {
return sorter.compare;
}
return false;
}
function nextSortDirection(sortDirections, current) {
if (!current) {
return sortDirections[0];
}
return sortDirections[sortDirections.indexOf(current) + 1];
}
function collectSortStates(columns, init2, pos) {
var sortStates = [];
function pushState(column, columnPos) {
sortStates.push({
column,
key: getColumnKey(column, columnPos),
multiplePriority: getMultiplePriority(column),
sortOrder: column.sortOrder
});
}
(columns || []).forEach(function(column, index2) {
var columnPos = getColumnPos(index2, pos);
if (column.children) {
if ("sortOrder" in column) {
pushState(column, columnPos);
}
sortStates = [].concat(_toConsumableArray$c(sortStates), _toConsumableArray$c(collectSortStates(column.children, init2, columnPos)));
} else if (column.sorter) {
if ("sortOrder" in column) {
pushState(column, columnPos);
} else if (init2 && column.defaultSortOrder) {
sortStates.push({
column,
key: getColumnKey(column, columnPos),
multiplePriority: getMultiplePriority(column),
sortOrder: column.defaultSortOrder
});
}
}
});
return sortStates;
}
function injectSorter(prefixCls, columns, sorterStates, triggerSorter, defaultSortDirections, tableLocale, tableShowSorterTooltip, pos) {
return (columns || []).map(function(column, index2) {
var columnPos = getColumnPos(index2, pos);
var newColumn = column;
if (newColumn.sorter) {
var sortDirections = newColumn.sortDirections || defaultSortDirections;
var showSorterTooltip = newColumn.showSorterTooltip === void 0 ? tableShowSorterTooltip : newColumn.showSorterTooltip;
var columnKey = getColumnKey(newColumn, columnPos);
var sorterState = sorterStates.find(function(_ref) {
var key2 = _ref.key;
return key2 === columnKey;
});
var sorterOrder = sorterState ? sorterState.sortOrder : null;
var nextSortOrder = nextSortDirection(sortDirections, sorterOrder);
var upNode = sortDirections.includes(ASCEND) && /* @__PURE__ */ jsx(CaretUpOutlined$1, {
className: classnames("".concat(prefixCls, "-column-sorter-up"), {
active: sorterOrder === ASCEND
}),
role: "presentation"
});
var downNode = sortDirections.includes(DESCEND) && /* @__PURE__ */ jsx(CaretDownOutlined$1, {
className: classnames("".concat(prefixCls, "-column-sorter-down"), {
active: sorterOrder === DESCEND
}),
role: "presentation"
});
var _ref2 = tableLocale || {}, cancelSort = _ref2.cancelSort, triggerAsc = _ref2.triggerAsc, triggerDesc = _ref2.triggerDesc;
var sortTip = cancelSort;
if (nextSortOrder === DESCEND) {
sortTip = triggerDesc;
} else if (nextSortOrder === ASCEND) {
sortTip = triggerAsc;
}
var tooltipProps = _typeof$q(showSorterTooltip) === "object" ? showSorterTooltip : {
title: sortTip
};
newColumn = _extends$3(_extends$3({}, newColumn), {
className: classnames(newColumn.className, _defineProperty$b({}, "".concat(prefixCls, "-column-sort"), sorterOrder)),
title: function title(renderProps) {
var renderSortTitle = /* @__PURE__ */ jsxs("div", {
className: "".concat(prefixCls, "-column-sorters"),
children: [/* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-column-title"),
children: renderColumnTitle(column.title, renderProps)
}), /* @__PURE__ */ jsx("span", {
className: classnames("".concat(prefixCls, "-column-sorter"), _defineProperty$b({}, "".concat(prefixCls, "-column-sorter-full"), !!(upNode && downNode))),
children: /* @__PURE__ */ jsxs("span", {
className: "".concat(prefixCls, "-column-sorter-inner"),
children: [upNode, downNode]
})
})]
});
return showSorterTooltip ? /* @__PURE__ */ jsx(_Tooltip, {
...tooltipProps,
children: renderSortTitle
}) : renderSortTitle;
},
onHeaderCell: function onHeaderCell(col) {
var cell = column.onHeaderCell && column.onHeaderCell(col) || {};
var originOnClick = cell.onClick;
var originOKeyDown = cell.onKeyDown;
cell.onClick = function(event) {
triggerSorter({
column,
key: columnKey,
sortOrder: nextSortOrder,
multiplePriority: getMultiplePriority(column)
});
originOnClick === null || originOnClick === void 0 ? void 0 : originOnClick(event);
};
cell.onKeyDown = function(event) {
if (event.keyCode === KeyCode.ENTER) {
triggerSorter({
column,
key: columnKey,
sortOrder: nextSortOrder,
multiplePriority: getMultiplePriority(column)
});
originOKeyDown === null || originOKeyDown === void 0 ? void 0 : originOKeyDown(event);
}
};
var renderTitle = safeColumnTitle(column.title, {});
var displayTitle = renderTitle === null || renderTitle === void 0 ? void 0 : renderTitle.toString();
if (sorterOrder) {
cell["aria-sort"] = sorterOrder === "ascend" ? "ascending" : "descending";
} else {
cell["aria-label"] = displayTitle || "";
}
cell.className = classnames(cell.className, "".concat(prefixCls, "-column-has-sorters"));
cell.tabIndex = 0;
if (column.ellipsis) {
cell.title = (renderTitle !== null && renderTitle !== void 0 ? renderTitle : "").toString();
}
return cell;
}
});
}
if ("children" in newColumn) {
newColumn = _extends$3(_extends$3({}, newColumn), {
children: injectSorter(prefixCls, newColumn.children, sorterStates, triggerSorter, defaultSortDirections, tableLocale, tableShowSorterTooltip, columnPos)
});
}
return newColumn;
});
}
function stateToInfo(sorterStates) {
var column = sorterStates.column, sortOrder = sorterStates.sortOrder;
return {
column,
order: sortOrder,
field: column.dataIndex,
columnKey: column.key
};
}
function generateSorterInfo(sorterStates) {
var list = sorterStates.filter(function(_ref3) {
var sortOrder = _ref3.sortOrder;
return sortOrder;
}).map(stateToInfo);
if (list.length === 0 && sorterStates.length) {
return _extends$3(_extends$3({}, stateToInfo(sorterStates[sorterStates.length - 1])), {
column: void 0
});
}
if (list.length <= 1) {
return list[0] || {};
}
return list;
}
function getSortData(data, sortStates, childrenColumnName) {
var innerSorterStates = sortStates.slice().sort(function(a, b2) {
return b2.multiplePriority - a.multiplePriority;
});
var cloneData = data.slice();
var runningSorters = innerSorterStates.filter(function(_ref4) {
var sorter = _ref4.column.sorter, sortOrder = _ref4.sortOrder;
return getSortFunction(sorter) && sortOrder;
});
if (!runningSorters.length) {
return cloneData;
}
return cloneData.sort(function(record1, record2) {
for (var i2 = 0; i2 < runningSorters.length; i2 += 1) {
var sorterState = runningSorters[i2];
var sorter = sorterState.column.sorter, sortOrder = sorterState.sortOrder;
var compareFn = getSortFunction(sorter);
if (compareFn && sortOrder) {
var compareResult = compareFn(record1, record2, sortOrder);
if (compareResult !== 0) {
return sortOrder === ASCEND ? compareResult : -compareResult;
}
}
}
return 0;
}).map(function(record) {
var subRecords = record[childrenColumnName];
if (subRecords) {
return _extends$3(_extends$3({}, record), _defineProperty$b({}, childrenColumnName, getSortData(subRecords, sortStates, childrenColumnName)));
}
return record;
});
}
function useFilterSorter(_ref5) {
var prefixCls = _ref5.prefixCls, mergedColumns = _ref5.mergedColumns, onSorterChange = _ref5.onSorterChange, sortDirections = _ref5.sortDirections, tableLocale = _ref5.tableLocale, showSorterTooltip = _ref5.showSorterTooltip;
var _React$useState = React__namespace.useState(collectSortStates(mergedColumns, true)), _React$useState2 = _slicedToArray$e(_React$useState, 2), sortStates = _React$useState2[0], setSortStates = _React$useState2[1];
var mergedSorterStates = React__namespace.useMemo(function() {
var validate = true;
var collectedStates = collectSortStates(mergedColumns, false);
if (!collectedStates.length) {
return sortStates;
}
var validateStates = [];
function patchStates(state) {
if (validate) {
validateStates.push(state);
} else {
validateStates.push(_extends$3(_extends$3({}, state), {
sortOrder: null
}));
}
}
var multipleMode = null;
collectedStates.forEach(function(state) {
if (multipleMode === null) {
patchStates(state);
if (state.sortOrder) {
if (state.multiplePriority === false) {
validate = false;
} else {
multipleMode = true;
}
}
} else if (multipleMode && state.multiplePriority !== false) {
patchStates(state);
} else {
validate = false;
patchStates(state);
}
});
return validateStates;
}, [mergedColumns, sortStates]);
var columnTitleSorterProps = React__namespace.useMemo(function() {
var sortColumns = mergedSorterStates.map(function(_ref6) {
var column = _ref6.column, sortOrder = _ref6.sortOrder;
return {
column,
order: sortOrder
};
});
return {
sortColumns,
sortColumn: sortColumns[0] && sortColumns[0].column,
sortOrder: sortColumns[0] && sortColumns[0].order
};
}, [mergedSorterStates]);
function triggerSorter(sortState) {
var newSorterStates;
if (sortState.multiplePriority === false || !mergedSorterStates.length || mergedSorterStates[0].multiplePriority === false) {
newSorterStates = [sortState];
} else {
newSorterStates = [].concat(_toConsumableArray$c(mergedSorterStates.filter(function(_ref7) {
var key2 = _ref7.key;
return key2 !== sortState.key;
})), [sortState]);
}
setSortStates(newSorterStates);
onSorterChange(generateSorterInfo(newSorterStates), newSorterStates);
}
var transformColumns = function transformColumns2(innerColumns) {
return injectSorter(prefixCls, innerColumns, mergedSorterStates, triggerSorter, sortDirections, tableLocale, showSorterTooltip);
};
var getSorters = function getSorters2() {
return generateSorterInfo(mergedSorterStates);
};
return [transformColumns, mergedSorterStates, columnTitleSorterProps, getSorters];
}
function fillTitle(columns, columnTitleProps) {
return columns.map(function(column) {
var cloneColumn = _extends$3({}, column);
cloneColumn.title = renderColumnTitle(column.title, columnTitleProps);
if ("children" in cloneColumn) {
cloneColumn.children = fillTitle(cloneColumn.children, columnTitleProps);
}
return cloneColumn;
});
}
function useTitleColumns(columnTitleProps) {
var filledColumns = React__namespace.useCallback(function(columns) {
return fillTitle(columns, columnTitleProps);
}, [columnTitleProps]);
return [filledColumns];
}
var EMPTY_LIST = [];
function InternalTable(props, ref) {
var _classNames3;
var customizePrefixCls = props.prefixCls, className = props.className, style2 = props.style, customizeSize = props.size, bordered = props.bordered, customizeDropdownPrefixCls = props.dropdownPrefixCls, dataSource = props.dataSource, pagination = props.pagination, rowSelection = props.rowSelection, _props$rowKey = props.rowKey, rowKey = _props$rowKey === void 0 ? "key" : _props$rowKey, rowClassName = props.rowClassName, columns = props.columns, children = props.children, legacyChildrenColumnName = props.childrenColumnName, onChange = props.onChange, getPopupContainer = props.getPopupContainer, loading = props.loading, expandIcon = props.expandIcon, expandable = props.expandable, expandedRowRender = props.expandedRowRender, expandIconColumnIndex = props.expandIconColumnIndex, indentSize = props.indentSize, scroll = props.scroll, sortDirections = props.sortDirections, locale2 = props.locale, _props$showSorterTool = props.showSorterTooltip, showSorterTooltip = _props$showSorterTool === void 0 ? true : _props$showSorterTool;
[["filterDropdownVisible", "filterDropdownOpen"], ["onFilterDropdownVisibleChange", "onFilterDropdownOpenChange"]].forEach(function(_ref) {
var _ref2 = _slicedToArray$e(_ref, 2);
_ref2[0];
_ref2[1];
});
var baseColumns = React__namespace.useMemo(function() {
return columns || convertChildrenToColumns(children);
}, [columns, children]);
var needResponsive = React__namespace.useMemo(function() {
return baseColumns.some(function(col) {
return col.responsive;
});
}, [baseColumns]);
var screens2 = useBreakpoint(needResponsive);
var mergedColumns = React__namespace.useMemo(function() {
var matched = new Set(Object.keys(screens2).filter(function(m2) {
return screens2[m2];
}));
return baseColumns.filter(function(c2) {
return !c2.responsive || c2.responsive.some(function(r2) {
return matched.has(r2);
});
});
}, [baseColumns, screens2]);
var tableProps = omit(props, ["className", "style", "columns"]);
var size = React__namespace.useContext(SizeContext$1);
var _React$useContext = React__namespace.useContext(ConfigContext$1), _React$useContext$loc = _React$useContext.locale, contextLocale = _React$useContext$loc === void 0 ? defaultLocale : _React$useContext$loc, renderEmpty = _React$useContext.renderEmpty, direction = _React$useContext.direction;
var mergedSize = customizeSize || size;
var tableLocale = _extends$3(_extends$3({}, contextLocale.Table), locale2);
var rawData = dataSource || EMPTY_LIST;
var _React$useContext2 = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext2.getPrefixCls;
var prefixCls = getPrefixCls("table", customizePrefixCls);
var dropdownPrefixCls = getPrefixCls("dropdown", customizeDropdownPrefixCls);
var mergedExpandable = _extends$3({
childrenColumnName: legacyChildrenColumnName,
expandIconColumnIndex
}, expandable);
var _mergedExpandable$chi = mergedExpandable.childrenColumnName, childrenColumnName = _mergedExpandable$chi === void 0 ? "children" : _mergedExpandable$chi;
var expandType = React__namespace.useMemo(function() {
if (rawData.some(function(item) {
return item === null || item === void 0 ? void 0 : item[childrenColumnName];
})) {
return "nest";
}
if (expandedRowRender || expandable && expandable.expandedRowRender) {
return "row";
}
return null;
}, [rawData]);
var internalRefs = {
body: React__namespace.useRef()
};
var getRowKey = React__namespace.useMemo(function() {
if (typeof rowKey === "function") {
return rowKey;
}
return function(record) {
return record === null || record === void 0 ? void 0 : record[rowKey];
};
}, [rowKey]);
var _useLazyKVMap = useLazyKVMap(rawData, childrenColumnName, getRowKey), _useLazyKVMap2 = _slicedToArray$e(_useLazyKVMap, 1), getRecordByKey = _useLazyKVMap2[0];
var changeEventInfo = {};
var triggerOnChange = function triggerOnChange2(info, action) {
var reset = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : false;
var changeInfo = _extends$3(_extends$3({}, changeEventInfo), info);
if (reset) {
changeEventInfo.resetPagination();
if (changeInfo.pagination.current) {
changeInfo.pagination.current = 1;
}
if (pagination && pagination.onChange) {
pagination.onChange(1, changeInfo.pagination.pageSize);
}
}
if (scroll && scroll.scrollToFirstRowOnChange !== false && internalRefs.body.current) {
scrollTo$1(0, {
getContainer: function getContainer2() {
return internalRefs.body.current;
}
});
}
onChange === null || onChange === void 0 ? void 0 : onChange(changeInfo.pagination, changeInfo.filters, changeInfo.sorter, {
currentDataSource: getFilterData(getSortData(rawData, changeInfo.sorterStates, childrenColumnName), changeInfo.filterStates),
action
});
};
var onSorterChange = function onSorterChange2(sorter, sorterStates) {
triggerOnChange({
sorter,
sorterStates
}, "sort", false);
};
var _useSorter = useFilterSorter({
prefixCls,
mergedColumns,
onSorterChange,
sortDirections: sortDirections || ["ascend", "descend"],
tableLocale,
showSorterTooltip
}), _useSorter2 = _slicedToArray$e(_useSorter, 4), transformSorterColumns = _useSorter2[0], sortStates = _useSorter2[1], sorterTitleProps = _useSorter2[2], getSorters = _useSorter2[3];
var sortedData = React__namespace.useMemo(function() {
return getSortData(rawData, sortStates, childrenColumnName);
}, [rawData, sortStates]);
changeEventInfo.sorter = getSorters();
changeEventInfo.sorterStates = sortStates;
var onFilterChange = function onFilterChange2(filters2, filterStates2) {
triggerOnChange({
filters: filters2,
filterStates: filterStates2
}, "filter", true);
};
var _useFilter = useFilter({
prefixCls,
locale: tableLocale,
dropdownPrefixCls,
mergedColumns,
onFilterChange,
getPopupContainer
}), _useFilter2 = _slicedToArray$e(_useFilter, 3), transformFilterColumns = _useFilter2[0], filterStates = _useFilter2[1], filters = _useFilter2[2];
var mergedData = getFilterData(sortedData, filterStates);
changeEventInfo.filters = filters;
changeEventInfo.filterStates = filterStates;
var columnTitleProps = React__namespace.useMemo(function() {
var mergedFilters = {};
Object.keys(filters).forEach(function(filterKey) {
if (filters[filterKey] !== null) {
mergedFilters[filterKey] = filters[filterKey];
}
});
return _extends$3(_extends$3({}, sorterTitleProps), {
filters: mergedFilters
});
}, [sorterTitleProps, filters]);
var _useTitleColumns = useTitleColumns(columnTitleProps), _useTitleColumns2 = _slicedToArray$e(_useTitleColumns, 1), transformTitleColumns = _useTitleColumns2[0];
var onPaginationChange = function onPaginationChange2(current, pageSize) {
triggerOnChange({
pagination: _extends$3(_extends$3({}, changeEventInfo.pagination), {
current,
pageSize
})
}, "paginate");
};
var _usePagination = usePagination(mergedData.length, pagination, onPaginationChange), _usePagination2 = _slicedToArray$e(_usePagination, 2), mergedPagination = _usePagination2[0], resetPagination = _usePagination2[1];
changeEventInfo.pagination = pagination === false ? {} : getPaginationParam(pagination, mergedPagination);
changeEventInfo.resetPagination = resetPagination;
var pageData = React__namespace.useMemo(function() {
if (pagination === false || !mergedPagination.pageSize) {
return mergedData;
}
var _mergedPagination$cur = mergedPagination.current, current = _mergedPagination$cur === void 0 ? 1 : _mergedPagination$cur, total = mergedPagination.total, _mergedPagination$pag = mergedPagination.pageSize, pageSize = _mergedPagination$pag === void 0 ? DEFAULT_PAGE_SIZE : _mergedPagination$pag;
if (mergedData.length < total) {
if (mergedData.length > pageSize) {
return mergedData.slice((current - 1) * pageSize, current * pageSize);
}
return mergedData;
}
return mergedData.slice((current - 1) * pageSize, current * pageSize);
}, [!!pagination, mergedData, mergedPagination && mergedPagination.current, mergedPagination && mergedPagination.pageSize, mergedPagination && mergedPagination.total]);
var _useSelection = useSelection(rowSelection, {
prefixCls,
data: mergedData,
pageData,
getRowKey,
getRecordByKey,
expandType,
childrenColumnName,
locale: tableLocale,
getPopupContainer
}), _useSelection2 = _slicedToArray$e(_useSelection, 2), transformSelectionColumns = _useSelection2[0], selectedKeySet = _useSelection2[1];
var internalRowClassName = function internalRowClassName2(record, index2, indent) {
var mergedRowClassName;
if (typeof rowClassName === "function") {
mergedRowClassName = classnames(rowClassName(record, index2, indent));
} else {
mergedRowClassName = classnames(rowClassName);
}
return classnames(_defineProperty$b({}, "".concat(prefixCls, "-row-selected"), selectedKeySet.has(getRowKey(record, index2))), mergedRowClassName);
};
mergedExpandable.__PARENT_RENDER_ICON__ = mergedExpandable.expandIcon;
mergedExpandable.expandIcon = mergedExpandable.expandIcon || expandIcon || renderExpandIcon(tableLocale);
if (expandType === "nest" && mergedExpandable.expandIconColumnIndex === void 0) {
mergedExpandable.expandIconColumnIndex = rowSelection ? 1 : 0;
} else if (mergedExpandable.expandIconColumnIndex > 0 && rowSelection) {
mergedExpandable.expandIconColumnIndex -= 1;
}
if (typeof mergedExpandable.indentSize !== "number") {
mergedExpandable.indentSize = typeof indentSize === "number" ? indentSize : 15;
}
var transformColumns = React__namespace.useCallback(function(innerColumns) {
return transformTitleColumns(transformSelectionColumns(transformFilterColumns(transformSorterColumns(innerColumns))));
}, [transformSorterColumns, transformFilterColumns, transformSelectionColumns]);
var topPaginationNode;
var bottomPaginationNode;
if (pagination !== false && (mergedPagination === null || mergedPagination === void 0 ? void 0 : mergedPagination.total)) {
var paginationSize;
if (mergedPagination.size) {
paginationSize = mergedPagination.size;
} else {
paginationSize = mergedSize === "small" || mergedSize === "middle" ? "small" : void 0;
}
var renderPagination = function renderPagination2(position2) {
return /* @__PURE__ */ jsx(Pagination$1, {
...mergedPagination,
className: classnames("".concat(prefixCls, "-pagination ").concat(prefixCls, "-pagination-").concat(position2), mergedPagination.className),
size: paginationSize
});
};
var defaultPosition = direction === "rtl" ? "left" : "right";
var position = mergedPagination.position;
if (position !== null && Array.isArray(position)) {
var topPos = position.find(function(p2) {
return p2.includes("top");
});
var bottomPos = position.find(function(p2) {
return p2.includes("bottom");
});
var isDisable = position.every(function(p2) {
return "".concat(p2) === "none";
});
if (!topPos && !bottomPos && !isDisable) {
bottomPaginationNode = renderPagination(defaultPosition);
}
if (topPos) {
topPaginationNode = renderPagination(topPos.toLowerCase().replace("top", ""));
}
if (bottomPos) {
bottomPaginationNode = renderPagination(bottomPos.toLowerCase().replace("bottom", ""));
}
} else {
bottomPaginationNode = renderPagination(defaultPosition);
}
}
var spinProps;
if (typeof loading === "boolean") {
spinProps = {
spinning: loading
};
} else if (_typeof$q(loading) === "object") {
spinProps = _extends$3({
spinning: true
}, loading);
}
var wrapperClassNames = classnames("".concat(prefixCls, "-wrapper"), _defineProperty$b({}, "".concat(prefixCls, "-wrapper-rtl"), direction === "rtl"), className);
return /* @__PURE__ */ jsx("div", {
ref,
className: wrapperClassNames,
style: style2,
children: /* @__PURE__ */ jsxs(Spin$1, {
spinning: false,
...spinProps,
children: [topPaginationNode, /* @__PURE__ */ jsx(Table$2, {
...tableProps,
columns: mergedColumns,
direction,
expandable: mergedExpandable,
prefixCls,
className: classnames((_classNames3 = {}, _defineProperty$b(_classNames3, "".concat(prefixCls, "-middle"), mergedSize === "middle"), _defineProperty$b(_classNames3, "".concat(prefixCls, "-small"), mergedSize === "small"), _defineProperty$b(_classNames3, "".concat(prefixCls, "-bordered"), bordered), _defineProperty$b(_classNames3, "".concat(prefixCls, "-empty"), rawData.length === 0), _classNames3)),
data: pageData,
rowKey: getRowKey,
rowClassName: internalRowClassName,
emptyText: locale2 && locale2.emptyText || (renderEmpty || defaultRenderEmpty$1)("Table"),
internalHooks: INTERNAL_HOOKS,
internalRefs,
transformColumns
}), bottomPaginationNode]
})
});
}
var ForwardTable = /* @__PURE__ */ React__namespace.forwardRef(InternalTable);
var Table = ForwardTable;
Table.SELECTION_COLUMN = SELECTION_COLUMN;
Table.EXPAND_COLUMN = Table$2.EXPAND_COLUMN;
Table.SELECTION_ALL = SELECTION_ALL;
Table.SELECTION_INVERT = SELECTION_INVERT;
Table.SELECTION_NONE = SELECTION_NONE;
Table.Column = Column;
Table.ColumnGroup = ColumnGroup;
Table.Summary = FooterComponents;
const Table$1 = Table;
var DeleteOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M360 184h-8c4.4 0 8-3.6 8-8v8h304v-8c0 4.4 3.6 8 8 8h-8v72h72v-80c0-35.3-28.7-64-64-64H352c-35.3 0-64 28.7-64 64v80h72v-72zm504 72H160c-17.7 0-32 14.3-32 32v32c0 4.4 3.6 8 8 8h60.4l24.7 523c1.6 34.1 29.8 61 63.9 61h454c34.2 0 62.3-26.8 63.9-61l24.7-523H888c4.4 0 8-3.6 8-8v-32c0-17.7-14.3-32-32-32zM731.3 840H292.7l-24.2-512h487l-24.2 512z" } }] }, "name": "delete", "theme": "outlined" };
const DeleteOutlinedSvg = DeleteOutlined$2;
var DeleteOutlined = function DeleteOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: DeleteOutlinedSvg
})
});
};
DeleteOutlined.displayName = "DeleteOutlined";
const DeleteOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(DeleteOutlined);
var LegacySelectContext = /* @__PURE__ */ React__namespace.createContext(null);
var TreeSelectContext = /* @__PURE__ */ React__namespace.createContext(null);
function toArray$1(value) {
if (Array.isArray(value)) {
return value;
}
return value !== void 0 ? [value] : [];
}
function fillFieldNames(fieldNames) {
var _ref = fieldNames || {}, label = _ref.label, value = _ref.value, children = _ref.children;
var mergedValue = value || "value";
return {
_title: label ? [label] : ["title", "label"],
value: mergedValue,
key: mergedValue,
children: children || "children"
};
}
function isCheckDisabled(node) {
return !node || node.disabled || node.disableCheckbox || node.checkable === false;
}
function getAllKeys$1(treeData, fieldNames) {
var keys2 = [];
function dig(list) {
list.forEach(function(item) {
var children = item[fieldNames.children];
if (children) {
keys2.push(item[fieldNames.value]);
dig(children);
}
});
}
dig(treeData);
return keys2;
}
function isNil(val) {
return val === null || val === void 0;
}
var HIDDEN_STYLE = {
width: 0,
height: 0,
display: "flex",
overflow: "hidden",
opacity: 0,
border: 0,
padding: 0,
margin: 0
};
var OptionList = function OptionList2(_, ref) {
var _useBaseProps = useBaseProps(), prefixCls = _useBaseProps.prefixCls, multiple = _useBaseProps.multiple, searchValue = _useBaseProps.searchValue, toggleOpen = _useBaseProps.toggleOpen, open = _useBaseProps.open, notFoundContent = _useBaseProps.notFoundContent;
var _React$useContext = React__namespace.useContext(TreeSelectContext), virtual = _React$useContext.virtual, listHeight = _React$useContext.listHeight, listItemHeight = _React$useContext.listItemHeight, treeData = _React$useContext.treeData, fieldNames = _React$useContext.fieldNames, onSelect = _React$useContext.onSelect, dropdownMatchSelectWidth = _React$useContext.dropdownMatchSelectWidth, treeExpandAction = _React$useContext.treeExpandAction;
var _React$useContext2 = React__namespace.useContext(LegacySelectContext), checkable = _React$useContext2.checkable, checkedKeys = _React$useContext2.checkedKeys, halfCheckedKeys = _React$useContext2.halfCheckedKeys, treeExpandedKeys = _React$useContext2.treeExpandedKeys, treeDefaultExpandAll = _React$useContext2.treeDefaultExpandAll, treeDefaultExpandedKeys = _React$useContext2.treeDefaultExpandedKeys, onTreeExpand = _React$useContext2.onTreeExpand, treeIcon = _React$useContext2.treeIcon, showTreeIcon = _React$useContext2.showTreeIcon, switcherIcon = _React$useContext2.switcherIcon, treeLine = _React$useContext2.treeLine, treeNodeFilterProp = _React$useContext2.treeNodeFilterProp, loadData = _React$useContext2.loadData, treeLoadedKeys = _React$useContext2.treeLoadedKeys, treeMotion = _React$useContext2.treeMotion, onTreeLoad = _React$useContext2.onTreeLoad, keyEntities = _React$useContext2.keyEntities;
var treeRef = React__namespace.useRef();
var memoTreeData = useMemo(function() {
return treeData;
}, [open, treeData], function(prev, next) {
return next[0] && prev[1] !== next[1];
});
var mergedCheckedKeys = React__namespace.useMemo(function() {
if (!checkable) {
return null;
}
return {
checked: checkedKeys,
halfChecked: halfCheckedKeys
};
}, [checkable, checkedKeys, halfCheckedKeys]);
React__namespace.useEffect(function() {
if (open && !multiple && checkedKeys.length) {
var _treeRef$current;
(_treeRef$current = treeRef.current) === null || _treeRef$current === void 0 ? void 0 : _treeRef$current.scrollTo({
key: checkedKeys[0]
});
}
}, [open]);
var lowerSearchValue = String(searchValue).toLowerCase();
var filterTreeNode = function filterTreeNode2(treeNode) {
if (!lowerSearchValue) {
return false;
}
return String(treeNode[treeNodeFilterProp]).toLowerCase().includes(lowerSearchValue);
};
var _React$useState = React__namespace.useState(treeDefaultExpandedKeys), _React$useState2 = _slicedToArray$e(_React$useState, 2), expandedKeys = _React$useState2[0], setExpandedKeys = _React$useState2[1];
var _React$useState3 = React__namespace.useState(null), _React$useState4 = _slicedToArray$e(_React$useState3, 2), searchExpandedKeys = _React$useState4[0], setSearchExpandedKeys = _React$useState4[1];
var mergedExpandedKeys = React__namespace.useMemo(function() {
if (treeExpandedKeys) {
return _toConsumableArray$c(treeExpandedKeys);
}
return searchValue ? searchExpandedKeys : expandedKeys;
}, [expandedKeys, searchExpandedKeys, treeExpandedKeys, searchValue]);
React__namespace.useEffect(function() {
if (searchValue) {
setSearchExpandedKeys(getAllKeys$1(treeData, fieldNames));
}
}, [searchValue]);
var onInternalExpand = function onInternalExpand2(keys2) {
setExpandedKeys(keys2);
setSearchExpandedKeys(keys2);
if (onTreeExpand) {
onTreeExpand(keys2);
}
};
var onListMouseDown = function onListMouseDown2(event) {
event.preventDefault();
};
var onInternalSelect = function onInternalSelect2(__, info) {
var node = info.node;
if (checkable && isCheckDisabled(node)) {
return;
}
onSelect(node.key, {
selected: !checkedKeys.includes(node.key)
});
if (!multiple) {
toggleOpen(false);
}
};
var _React$useState5 = React__namespace.useState(null), _React$useState6 = _slicedToArray$e(_React$useState5, 2), activeKey = _React$useState6[0], setActiveKey = _React$useState6[1];
var activeEntity = keyEntities[activeKey];
React__namespace.useImperativeHandle(ref, function() {
var _treeRef$current2;
return {
scrollTo: (_treeRef$current2 = treeRef.current) === null || _treeRef$current2 === void 0 ? void 0 : _treeRef$current2.scrollTo,
onKeyDown: function onKeyDown2(event) {
var _treeRef$current3;
var which = event.which;
switch (which) {
case KeyCode.UP:
case KeyCode.DOWN:
case KeyCode.LEFT:
case KeyCode.RIGHT:
(_treeRef$current3 = treeRef.current) === null || _treeRef$current3 === void 0 ? void 0 : _treeRef$current3.onKeyDown(event);
break;
case KeyCode.ENTER: {
if (activeEntity) {
var _ref = (activeEntity === null || activeEntity === void 0 ? void 0 : activeEntity.node) || {}, selectable = _ref.selectable, value = _ref.value;
if (selectable !== false) {
onInternalSelect(null, {
node: {
key: activeKey
},
selected: !checkedKeys.includes(value)
});
}
}
break;
}
case KeyCode.ESC: {
toggleOpen(false);
}
}
},
onKeyUp: function onKeyUp() {
}
};
});
if (memoTreeData.length === 0) {
return /* @__PURE__ */ jsx("div", {
role: "listbox",
className: "".concat(prefixCls, "-empty"),
onMouseDown: onListMouseDown,
children: notFoundContent
});
}
var treeProps = {
fieldNames
};
if (treeLoadedKeys) {
treeProps.loadedKeys = treeLoadedKeys;
}
if (mergedExpandedKeys) {
treeProps.expandedKeys = mergedExpandedKeys;
}
return /* @__PURE__ */ jsxs("div", {
onMouseDown: onListMouseDown,
children: [activeEntity && open && /* @__PURE__ */ jsx("span", {
style: HIDDEN_STYLE,
"aria-live": "assertive",
children: activeEntity.node.value
}), /* @__PURE__ */ jsx(Tree$3, {
ref: treeRef,
focusable: false,
prefixCls: "".concat(prefixCls, "-tree"),
treeData: memoTreeData,
height: listHeight,
itemHeight: listItemHeight,
virtual: virtual !== false && dropdownMatchSelectWidth !== false,
multiple,
icon: treeIcon,
showIcon: showTreeIcon,
switcherIcon,
showLine: treeLine,
loadData: searchValue ? null : loadData,
motion: treeMotion,
activeKey,
checkable,
checkStrictly: true,
checkedKeys: mergedCheckedKeys,
selectedKeys: !checkable ? checkedKeys : [],
defaultExpandAll: treeDefaultExpandAll,
...treeProps,
onActiveChange: setActiveKey,
onSelect: onInternalSelect,
onCheck: onInternalSelect,
onExpand: onInternalExpand,
onLoad: onTreeLoad,
filterTreeNode,
expandAction: treeExpandAction
})]
});
};
var RefOptionList = /* @__PURE__ */ React__namespace.forwardRef(OptionList);
RefOptionList.displayName = "OptionList";
var TreeNode = function TreeNode2() {
return null;
};
var SHOW_ALL = "SHOW_ALL";
var SHOW_PARENT = "SHOW_PARENT";
var SHOW_CHILD = "SHOW_CHILD";
function formatStrategyValues(values, strategy, keyEntities, fieldNames) {
var valueSet = new Set(values);
if (strategy === SHOW_CHILD) {
return values.filter(function(key2) {
var entity = keyEntities[key2];
if (entity && entity.children && entity.children.some(function(_ref) {
var node = _ref.node;
return valueSet.has(node[fieldNames.value]);
}) && entity.children.every(function(_ref2) {
var node = _ref2.node;
return isCheckDisabled(node) || valueSet.has(node[fieldNames.value]);
})) {
return false;
}
return true;
});
}
if (strategy === SHOW_PARENT) {
return values.filter(function(key2) {
var entity = keyEntities[key2];
var parent2 = entity ? entity.parent : null;
if (parent2 && !isCheckDisabled(parent2.node) && valueSet.has(parent2.key)) {
return false;
}
return true;
});
}
return values;
}
var _excluded$3 = ["children", "value"];
function convertChildrenToData(nodes) {
return toArray$9(nodes).map(function(node) {
if (!/* @__PURE__ */ React__namespace.isValidElement(node) || !node.type) {
return null;
}
var _ref = node, key2 = _ref.key, _ref$props = _ref.props, children = _ref$props.children, value = _ref$props.value, restProps = _objectWithoutProperties$1(_ref$props, _excluded$3);
var data = _objectSpread2$a({
key: key2,
value
}, restProps);
var childData = convertChildrenToData(children);
if (childData.length) {
data.children = childData;
}
return data;
}).filter(function(data) {
return data;
});
}
function fillLegacyProps(dataNode) {
if (!dataNode) {
return dataNode;
}
var cloneNode = _objectSpread2$a({}, dataNode);
if (!("props" in cloneNode)) {
Object.defineProperty(cloneNode, "props", {
get: function get2() {
warningOnce(false, "New `rc-tree-select` not support return node instance as argument anymore. Please consider to remove `props` access.");
return cloneNode;
}
});
}
return cloneNode;
}
function fillAdditionalInfo(extra, triggerValue, checkedValues, treeData, showPosition, fieldNames) {
var triggerNode = null;
var nodeList = null;
function generateMap() {
function dig(list) {
var level = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "0";
var parentIncluded = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : false;
return list.map(function(option, index2) {
var pos = "".concat(level, "-").concat(index2);
var value = option[fieldNames.value];
var included = checkedValues.includes(value);
var children = dig(option[fieldNames.children] || [], pos, included);
var node = /* @__PURE__ */ jsx(TreeNode, {
...option,
children: children.map(function(child) {
return child.node;
})
});
if (triggerValue === value) {
triggerNode = node;
}
if (included) {
var checkedNode = {
pos,
node,
children
};
if (!parentIncluded) {
nodeList.push(checkedNode);
}
return checkedNode;
}
return null;
}).filter(function(node) {
return node;
});
}
if (!nodeList) {
nodeList = [];
dig(treeData);
nodeList.sort(function(_ref2, _ref3) {
var val1 = _ref2.node.props.value;
var val2 = _ref3.node.props.value;
var index1 = checkedValues.indexOf(val1);
var index2 = checkedValues.indexOf(val2);
return index1 - index2;
});
}
}
Object.defineProperty(extra, "triggerNode", {
get: function get2() {
warningOnce(false, "`triggerNode` is deprecated. Please consider decoupling data with node.");
generateMap();
return triggerNode;
}
});
Object.defineProperty(extra, "allCheckedNodes", {
get: function get2() {
warningOnce(false, "`allCheckedNodes` is deprecated. Please consider decoupling data with node.");
generateMap();
if (showPosition) {
return nodeList;
}
return nodeList.map(function(_ref4) {
var node = _ref4.node;
return node;
});
}
});
}
function parseSimpleTreeData(treeData, _ref) {
var id2 = _ref.id, pId = _ref.pId, rootPId = _ref.rootPId;
var keyNodes = {};
var rootNodeList = [];
var nodeList = treeData.map(function(node) {
var clone = _objectSpread2$a({}, node);
var key2 = clone[id2];
keyNodes[key2] = clone;
clone.key = clone.key || key2;
return clone;
});
nodeList.forEach(function(node) {
var parentKey = node[pId];
var parent2 = keyNodes[parentKey];
if (parent2) {
parent2.children = parent2.children || [];
parent2.children.push(node);
}
if (parentKey === rootPId || !parent2 && rootPId === null) {
rootNodeList.push(node);
}
});
return rootNodeList;
}
function useTreeData(treeData, children, simpleMode) {
return React__namespace.useMemo(function() {
if (treeData) {
return simpleMode ? parseSimpleTreeData(treeData, _objectSpread2$a({
id: "id",
pId: "pId",
rootPId: null
}, simpleMode !== true ? simpleMode : {})) : treeData;
}
return convertChildrenToData(children);
}, [children, simpleMode, treeData]);
}
const useCache = function(values) {
var cacheRef = React__namespace.useRef({
valueLabels: /* @__PURE__ */ new Map()
});
return React__namespace.useMemo(function() {
var valueLabels = cacheRef.current.valueLabels;
var valueLabelsCache = /* @__PURE__ */ new Map();
var filledValues = values.map(function(item) {
var _item$label;
var value = item.value;
var mergedLabel = (_item$label = item.label) !== null && _item$label !== void 0 ? _item$label : valueLabels.get(value);
valueLabelsCache.set(value, mergedLabel);
return _objectSpread2$a(_objectSpread2$a({}, item), {}, {
label: mergedLabel
});
});
cacheRef.current.valueLabels = valueLabelsCache;
return [filledValues];
}, [values]);
};
function useRefFunc(callback) {
var funcRef = React__namespace.useRef();
funcRef.current = callback;
var cacheFn = React__namespace.useCallback(function() {
return funcRef.current.apply(funcRef, arguments);
}, []);
return cacheFn;
}
const useDataEntities = function(treeData, fieldNames) {
return React__namespace.useMemo(function() {
var collection = convertDataToEntities(treeData, {
fieldNames,
initWrapper: function initWrapper(wrapper) {
return _objectSpread2$a(_objectSpread2$a({}, wrapper), {}, {
valueEntities: /* @__PURE__ */ new Map()
});
},
processEntity: function processEntity(entity, wrapper) {
var val = entity.node[fieldNames.value];
wrapper.valueEntities.set(val, entity);
}
});
return collection;
}, [treeData, fieldNames]);
};
const useCheckedKeys = function(rawLabeledValues, rawHalfCheckedValues, treeConduction, keyEntities) {
return React__namespace.useMemo(function() {
var checkedKeys = rawLabeledValues.map(function(_ref) {
var value = _ref.value;
return value;
});
var halfCheckedKeys = rawHalfCheckedValues.map(function(_ref2) {
var value = _ref2.value;
return value;
});
var missingValues = checkedKeys.filter(function(key2) {
return !keyEntities[key2];
});
if (treeConduction) {
var _conductCheck = conductCheck(checkedKeys, true, keyEntities);
checkedKeys = _conductCheck.checkedKeys;
halfCheckedKeys = _conductCheck.halfCheckedKeys;
}
return [
Array.from(new Set([].concat(_toConsumableArray$c(missingValues), _toConsumableArray$c(checkedKeys)))),
halfCheckedKeys
];
}, [rawLabeledValues, rawHalfCheckedValues, treeConduction, keyEntities]);
};
const useFilterTreeData = function(treeData, searchValue, _ref) {
var treeNodeFilterProp = _ref.treeNodeFilterProp, filterTreeNode = _ref.filterTreeNode, fieldNames = _ref.fieldNames;
var fieldChildren = fieldNames.children;
return React__namespace.useMemo(function() {
if (!searchValue || filterTreeNode === false) {
return treeData;
}
var filterOptionFunc;
if (typeof filterTreeNode === "function") {
filterOptionFunc = filterTreeNode;
} else {
var upperStr = searchValue.toUpperCase();
filterOptionFunc = function filterOptionFunc2(_, dataNode) {
var value = dataNode[treeNodeFilterProp];
return String(value).toUpperCase().includes(upperStr);
};
}
function dig(list) {
var keepAll = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
return list.map(function(dataNode) {
var children = dataNode[fieldChildren];
var match2 = keepAll || filterOptionFunc(searchValue, fillLegacyProps(dataNode));
var childList = dig(children || [], match2);
if (match2 || childList.length) {
return _objectSpread2$a(_objectSpread2$a({}, dataNode), {}, _defineProperty$b({
isLeaf: void 0
}, fieldChildren, childList));
}
return null;
}).filter(function(node) {
return node;
});
}
return dig(treeData);
}, [treeData, searchValue, fieldChildren, treeNodeFilterProp, filterTreeNode]);
};
var _excluded$2 = ["id", "prefixCls", "value", "defaultValue", "onChange", "onSelect", "onDeselect", "searchValue", "inputValue", "onSearch", "autoClearSearchValue", "filterTreeNode", "treeNodeFilterProp", "showCheckedStrategy", "treeNodeLabelProp", "multiple", "treeCheckable", "treeCheckStrictly", "labelInValue", "fieldNames", "treeDataSimpleMode", "treeData", "children", "loadData", "treeLoadedKeys", "onTreeLoad", "treeDefaultExpandAll", "treeExpandedKeys", "treeDefaultExpandedKeys", "onTreeExpand", "treeExpandAction", "virtual", "listHeight", "listItemHeight", "onDropdownVisibleChange", "dropdownMatchSelectWidth", "treeLine", "treeIcon", "showTreeIcon", "switcherIcon", "treeMotion"];
function isRawValue(value) {
return !value || _typeof$q(value) !== "object";
}
var TreeSelect$2 = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
var id2 = props.id, _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? "rc-tree-select" : _props$prefixCls, value = props.value, defaultValue = props.defaultValue, onChange = props.onChange, onSelect = props.onSelect, onDeselect = props.onDeselect, searchValue = props.searchValue, inputValue = props.inputValue, onSearch = props.onSearch, _props$autoClearSearc = props.autoClearSearchValue, autoClearSearchValue = _props$autoClearSearc === void 0 ? true : _props$autoClearSearc, filterTreeNode = props.filterTreeNode, _props$treeNodeFilter = props.treeNodeFilterProp, treeNodeFilterProp = _props$treeNodeFilter === void 0 ? "value" : _props$treeNodeFilter, _props$showCheckedStr = props.showCheckedStrategy, showCheckedStrategy = _props$showCheckedStr === void 0 ? SHOW_CHILD : _props$showCheckedStr, treeNodeLabelProp = props.treeNodeLabelProp, multiple = props.multiple, treeCheckable = props.treeCheckable, treeCheckStrictly = props.treeCheckStrictly, labelInValue = props.labelInValue, fieldNames = props.fieldNames, treeDataSimpleMode = props.treeDataSimpleMode, treeData = props.treeData, children = props.children, loadData = props.loadData, treeLoadedKeys = props.treeLoadedKeys, onTreeLoad = props.onTreeLoad, treeDefaultExpandAll = props.treeDefaultExpandAll, treeExpandedKeys = props.treeExpandedKeys, treeDefaultExpandedKeys = props.treeDefaultExpandedKeys, onTreeExpand = props.onTreeExpand, treeExpandAction = props.treeExpandAction, virtual = props.virtual, _props$listHeight = props.listHeight, listHeight = _props$listHeight === void 0 ? 200 : _props$listHeight, _props$listItemHeight = props.listItemHeight, listItemHeight = _props$listItemHeight === void 0 ? 20 : _props$listItemHeight, onDropdownVisibleChange = props.onDropdownVisibleChange, _props$dropdownMatchS = props.dropdownMatchSelectWidth, dropdownMatchSelectWidth = _props$dropdownMatchS === void 0 ? true : _props$dropdownMatchS, treeLine = props.treeLine, treeIcon = props.treeIcon, showTreeIcon = props.showTreeIcon, switcherIcon = props.switcherIcon, treeMotion = props.treeMotion, restProps = _objectWithoutProperties$1(props, _excluded$2);
var mergedId = useId$2(id2);
var treeConduction = treeCheckable && !treeCheckStrictly;
var mergedCheckable = treeCheckable || treeCheckStrictly;
var mergedLabelInValue = treeCheckStrictly || labelInValue;
var mergedMultiple = mergedCheckable || multiple;
var _useMergedState = useMergedState(defaultValue, {
value
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), internalValue = _useMergedState2[0], setInternalValue = _useMergedState2[1];
var mergedFieldNames = React__namespace.useMemo(
function() {
return fillFieldNames(fieldNames);
},
[JSON.stringify(fieldNames)]
);
var _useMergedState3 = useMergedState("", {
value: searchValue !== void 0 ? searchValue : inputValue,
postState: function postState(search) {
return search || "";
}
}), _useMergedState4 = _slicedToArray$e(_useMergedState3, 2), mergedSearchValue = _useMergedState4[0], setSearchValue = _useMergedState4[1];
var onInternalSearch = function onInternalSearch2(searchText) {
setSearchValue(searchText);
onSearch === null || onSearch === void 0 ? void 0 : onSearch(searchText);
};
var mergedTreeData = useTreeData(treeData, children, treeDataSimpleMode);
var _useDataEntities = useDataEntities(mergedTreeData, mergedFieldNames), keyEntities = _useDataEntities.keyEntities, valueEntities = _useDataEntities.valueEntities;
var splitRawValues = React__namespace.useCallback(function(newRawValues) {
var missingRawValues = [];
var existRawValues = [];
newRawValues.forEach(function(val) {
if (valueEntities.has(val)) {
existRawValues.push(val);
} else {
missingRawValues.push(val);
}
});
return {
missingRawValues,
existRawValues
};
}, [valueEntities]);
var filteredTreeData = useFilterTreeData(mergedTreeData, mergedSearchValue, {
fieldNames: mergedFieldNames,
treeNodeFilterProp,
filterTreeNode
});
var getLabel2 = React__namespace.useCallback(function(item) {
if (item) {
if (treeNodeLabelProp) {
return item[treeNodeLabelProp];
}
var titleList = mergedFieldNames._title;
for (var i2 = 0; i2 < titleList.length; i2 += 1) {
var title = item[titleList[i2]];
if (title !== void 0) {
return title;
}
}
}
}, [mergedFieldNames, treeNodeLabelProp]);
var toLabeledValues = React__namespace.useCallback(function(draftValues) {
var values = toArray$1(draftValues);
return values.map(function(val) {
if (isRawValue(val)) {
return {
value: val
};
}
return val;
});
}, []);
var convert2LabelValues = React__namespace.useCallback(function(draftValues) {
var values = toLabeledValues(draftValues);
return values.map(function(item) {
var rawLabel = item.label;
var rawValue = item.value, rawHalfChecked = item.halfChecked;
var rawDisabled;
var entity = valueEntities.get(rawValue);
if (entity) {
var _rawLabel;
rawLabel = (_rawLabel = rawLabel) !== null && _rawLabel !== void 0 ? _rawLabel : getLabel2(entity.node);
rawDisabled = entity.node.disabled;
} else if (rawLabel === void 0) {
var labelInValueItem = toLabeledValues(internalValue).find(function(labeledItem) {
return labeledItem.value === rawValue;
});
rawLabel = labelInValueItem.label;
}
return {
label: rawLabel,
value: rawValue,
halfChecked: rawHalfChecked,
disabled: rawDisabled
};
});
}, [valueEntities, getLabel2, toLabeledValues, internalValue]);
var rawMixedLabeledValues = React__namespace.useMemo(function() {
return toLabeledValues(internalValue);
}, [toLabeledValues, internalValue]);
var _React$useMemo = React__namespace.useMemo(function() {
var fullCheckValues = [];
var halfCheckValues = [];
rawMixedLabeledValues.forEach(function(item) {
if (item.halfChecked) {
halfCheckValues.push(item);
} else {
fullCheckValues.push(item);
}
});
return [fullCheckValues, halfCheckValues];
}, [rawMixedLabeledValues]), _React$useMemo2 = _slicedToArray$e(_React$useMemo, 2), rawLabeledValues = _React$useMemo2[0], rawHalfLabeledValues = _React$useMemo2[1];
var rawValues = React__namespace.useMemo(function() {
return rawLabeledValues.map(function(item) {
return item.value;
});
}, [rawLabeledValues]);
var _useCheckedKeys = useCheckedKeys(rawLabeledValues, rawHalfLabeledValues, treeConduction, keyEntities), _useCheckedKeys2 = _slicedToArray$e(_useCheckedKeys, 2), rawCheckedValues = _useCheckedKeys2[0], rawHalfCheckedValues = _useCheckedKeys2[1];
var displayValues = React__namespace.useMemo(function() {
var displayKeys = formatStrategyValues(rawCheckedValues, showCheckedStrategy, keyEntities, mergedFieldNames);
var values = displayKeys.map(function(key2) {
var _keyEntities$key$node, _keyEntities$key, _keyEntities$key$node2;
return (_keyEntities$key$node = (_keyEntities$key = keyEntities[key2]) === null || _keyEntities$key === void 0 ? void 0 : (_keyEntities$key$node2 = _keyEntities$key.node) === null || _keyEntities$key$node2 === void 0 ? void 0 : _keyEntities$key$node2[mergedFieldNames.value]) !== null && _keyEntities$key$node !== void 0 ? _keyEntities$key$node : key2;
});
var labeledValues = values.map(function(val) {
var targetItem = rawLabeledValues.find(function(item) {
return item.value === val;
});
return {
value: val,
label: targetItem === null || targetItem === void 0 ? void 0 : targetItem.label
};
});
var rawDisplayValues = convert2LabelValues(labeledValues);
var firstVal = rawDisplayValues[0];
if (!mergedMultiple && firstVal && isNil(firstVal.value) && isNil(firstVal.label)) {
return [];
}
return rawDisplayValues.map(function(item) {
var _item$label;
return _objectSpread2$a(_objectSpread2$a({}, item), {}, {
label: (_item$label = item.label) !== null && _item$label !== void 0 ? _item$label : item.value
});
});
}, [mergedFieldNames, mergedMultiple, rawCheckedValues, rawLabeledValues, convert2LabelValues, showCheckedStrategy, keyEntities]);
var _useCache = useCache(displayValues), _useCache2 = _slicedToArray$e(_useCache, 1), cachedDisplayValues = _useCache2[0];
var triggerChange = useRefFunc(function(newRawValues, extra, source) {
var labeledValues = convert2LabelValues(newRawValues);
setInternalValue(labeledValues);
if (autoClearSearchValue) {
setSearchValue("");
}
if (onChange) {
var eventValues = newRawValues;
if (treeConduction) {
var formattedKeyList = formatStrategyValues(newRawValues, showCheckedStrategy, keyEntities, mergedFieldNames);
eventValues = formattedKeyList.map(function(key2) {
var entity = valueEntities.get(key2);
return entity ? entity.node[mergedFieldNames.value] : key2;
});
}
var _ref = extra || {
triggerValue: void 0,
selected: void 0
}, triggerValue = _ref.triggerValue, selected = _ref.selected;
var returnRawValues = eventValues;
if (treeCheckStrictly) {
var halfValues = rawHalfLabeledValues.filter(function(item) {
return !eventValues.includes(item.value);
});
returnRawValues = [].concat(_toConsumableArray$c(returnRawValues), _toConsumableArray$c(halfValues));
}
var returnLabeledValues = convert2LabelValues(returnRawValues);
var additionalInfo = {
preValue: rawLabeledValues,
triggerValue
};
var showPosition = true;
if (treeCheckStrictly || source === "selection" && !selected) {
showPosition = false;
}
fillAdditionalInfo(additionalInfo, triggerValue, newRawValues, mergedTreeData, showPosition, mergedFieldNames);
if (mergedCheckable) {
additionalInfo.checked = selected;
} else {
additionalInfo.selected = selected;
}
var returnValues = mergedLabelInValue ? returnLabeledValues : returnLabeledValues.map(function(item) {
return item.value;
});
onChange(mergedMultiple ? returnValues : returnValues[0], mergedLabelInValue ? null : returnLabeledValues.map(function(item) {
return item.label;
}), additionalInfo);
}
});
var onOptionSelect = React__namespace.useCallback(function(selectedKey, _ref2) {
var _node$mergedFieldName;
var selected = _ref2.selected, source = _ref2.source;
var entity = keyEntities[selectedKey];
var node = entity === null || entity === void 0 ? void 0 : entity.node;
var selectedValue = (_node$mergedFieldName = node === null || node === void 0 ? void 0 : node[mergedFieldNames.value]) !== null && _node$mergedFieldName !== void 0 ? _node$mergedFieldName : selectedKey;
if (!mergedMultiple) {
triggerChange([selectedValue], {
selected: true,
triggerValue: selectedValue
}, "option");
} else {
var newRawValues = selected ? [].concat(_toConsumableArray$c(rawValues), [selectedValue]) : rawCheckedValues.filter(function(v2) {
return v2 !== selectedValue;
});
if (treeConduction) {
var _splitRawValues = splitRawValues(newRawValues), missingRawValues = _splitRawValues.missingRawValues, existRawValues = _splitRawValues.existRawValues;
var keyList = existRawValues.map(function(val) {
return valueEntities.get(val).key;
});
var checkedKeys;
if (selected) {
var _conductCheck = conductCheck(keyList, true, keyEntities);
checkedKeys = _conductCheck.checkedKeys;
} else {
var _conductCheck2 = conductCheck(keyList, {
checked: false,
halfCheckedKeys: rawHalfCheckedValues
}, keyEntities);
checkedKeys = _conductCheck2.checkedKeys;
}
newRawValues = [].concat(_toConsumableArray$c(missingRawValues), _toConsumableArray$c(checkedKeys.map(function(key2) {
return keyEntities[key2].node[mergedFieldNames.value];
})));
}
triggerChange(newRawValues, {
selected,
triggerValue: selectedValue
}, source || "option");
}
if (selected || !mergedMultiple) {
onSelect === null || onSelect === void 0 ? void 0 : onSelect(selectedValue, fillLegacyProps(node));
} else {
onDeselect === null || onDeselect === void 0 ? void 0 : onDeselect(selectedValue, fillLegacyProps(node));
}
}, [splitRawValues, valueEntities, keyEntities, mergedFieldNames, mergedMultiple, rawValues, triggerChange, treeConduction, onSelect, onDeselect, rawCheckedValues, rawHalfCheckedValues]);
var onInternalDropdownVisibleChange = React__namespace.useCallback(function(open) {
if (onDropdownVisibleChange) {
var legacyParam = {};
Object.defineProperty(legacyParam, "documentClickClose", {
get: function get2() {
warningOnce(false, "Second param of `onDropdownVisibleChange` has been removed.");
return false;
}
});
onDropdownVisibleChange(open, legacyParam);
}
}, [onDropdownVisibleChange]);
var onDisplayValuesChange = useRefFunc(function(newValues, info) {
var newRawValues = newValues.map(function(item) {
return item.value;
});
if (info.type === "clear") {
triggerChange(newRawValues, {}, "selection");
return;
}
if (info.values.length) {
onOptionSelect(info.values[0].value, {
selected: false,
source: "selection"
});
}
});
var treeSelectContext = React__namespace.useMemo(function() {
return {
virtual,
dropdownMatchSelectWidth,
listHeight,
listItemHeight,
treeData: filteredTreeData,
fieldNames: mergedFieldNames,
onSelect: onOptionSelect,
treeExpandAction
};
}, [virtual, dropdownMatchSelectWidth, listHeight, listItemHeight, filteredTreeData, mergedFieldNames, onOptionSelect, treeExpandAction]);
var legacyContext = React__namespace.useMemo(function() {
return {
checkable: mergedCheckable,
loadData,
treeLoadedKeys,
onTreeLoad,
checkedKeys: rawCheckedValues,
halfCheckedKeys: rawHalfCheckedValues,
treeDefaultExpandAll,
treeExpandedKeys,
treeDefaultExpandedKeys,
onTreeExpand,
treeIcon,
treeMotion,
showTreeIcon,
switcherIcon,
treeLine,
treeNodeFilterProp,
keyEntities
};
}, [mergedCheckable, loadData, treeLoadedKeys, onTreeLoad, rawCheckedValues, rawHalfCheckedValues, treeDefaultExpandAll, treeExpandedKeys, treeDefaultExpandedKeys, onTreeExpand, treeIcon, treeMotion, showTreeIcon, switcherIcon, treeLine, treeNodeFilterProp, keyEntities]);
return /* @__PURE__ */ jsx(TreeSelectContext.Provider, {
value: treeSelectContext,
children: /* @__PURE__ */ jsx(LegacySelectContext.Provider, {
value: legacyContext,
children: /* @__PURE__ */ jsx(BaseSelect, {
ref,
...restProps,
id: mergedId,
prefixCls,
mode: mergedMultiple ? "multiple" : void 0,
displayValues: cachedDisplayValues,
onDisplayValuesChange,
searchValue: mergedSearchValue,
onSearch: onInternalSearch,
OptionList: RefOptionList,
emptyOptions: !mergedTreeData.length,
onDropdownVisibleChange: onInternalDropdownVisibleChange,
dropdownMatchSelectWidth
})
})
});
});
var GenericTreeSelect = TreeSelect$2;
GenericTreeSelect.TreeNode = TreeNode;
GenericTreeSelect.SHOW_ALL = SHOW_ALL;
GenericTreeSelect.SHOW_PARENT = SHOW_PARENT;
GenericTreeSelect.SHOW_CHILD = SHOW_CHILD;
var __rest$2 = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var InternalTreeSelect = function InternalTreeSelect2(_a, ref) {
var _classNames2;
var customizePrefixCls = _a.prefixCls, customizeSize = _a.size, customDisabled = _a.disabled, _a$bordered = _a.bordered, bordered = _a$bordered === void 0 ? true : _a$bordered, className = _a.className, treeCheckable = _a.treeCheckable, multiple = _a.multiple, _a$listHeight = _a.listHeight, listHeight = _a$listHeight === void 0 ? 256 : _a$listHeight, _a$listItemHeight = _a.listItemHeight, listItemHeight = _a$listItemHeight === void 0 ? 26 : _a$listItemHeight, placement = _a.placement, notFoundContent = _a.notFoundContent, _switcherIcon = _a.switcherIcon, treeLine = _a.treeLine, getPopupContainer = _a.getPopupContainer, dropdownClassName = _a.dropdownClassName, popupClassName = _a.popupClassName, _a$treeIcon = _a.treeIcon, treeIcon = _a$treeIcon === void 0 ? false : _a$treeIcon, transitionName2 = _a.transitionName, _a$choiceTransitionNa = _a.choiceTransitionName, choiceTransitionName = _a$choiceTransitionNa === void 0 ? "" : _a$choiceTransitionNa, customStatus = _a.status, showArrow = _a.showArrow, treeExpandAction = _a.treeExpandAction, props = __rest$2(_a, ["prefixCls", "size", "disabled", "bordered", "className", "treeCheckable", "multiple", "listHeight", "listItemHeight", "placement", "notFoundContent", "switcherIcon", "treeLine", "getPopupContainer", "dropdownClassName", "popupClassName", "treeIcon", "transitionName", "choiceTransitionName", "status", "showArrow", "treeExpandAction"]);
var _React$useContext = React__namespace.useContext(ConfigContext$1), getContextPopupContainer = _React$useContext.getPopupContainer, getPrefixCls = _React$useContext.getPrefixCls, renderEmpty = _React$useContext.renderEmpty, direction = _React$useContext.direction, virtual = _React$useContext.virtual, dropdownMatchSelectWidth = _React$useContext.dropdownMatchSelectWidth;
var size = React__namespace.useContext(SizeContext$1);
var prefixCls = getPrefixCls("select", customizePrefixCls);
var treePrefixCls = getPrefixCls("select-tree", customizePrefixCls);
var treeSelectPrefixCls = getPrefixCls("tree-select", customizePrefixCls);
var _useCompactItemContex = useCompactItemContext(prefixCls, direction), compactSize = _useCompactItemContex.compactSize, compactItemClassnames = _useCompactItemContex.compactItemClassnames;
var mergedDropdownClassName = classnames(popupClassName || dropdownClassName, "".concat(treeSelectPrefixCls, "-dropdown"), _defineProperty$b({}, "".concat(treeSelectPrefixCls, "-dropdown-rtl"), direction === "rtl"));
var isMultiple2 = !!(treeCheckable || multiple);
var mergedShowArrow = showArrow !== void 0 ? showArrow : props.loading || !isMultiple2;
var _useContext = React$a.useContext(FormItemInputContext), contextStatus = _useContext.status, hasFeedback = _useContext.hasFeedback, isFormItemInput = _useContext.isFormItemInput, feedbackIcon = _useContext.feedbackIcon;
var mergedStatus = getMergedStatus(contextStatus, customStatus);
var _getIcons = getIcons(_extends$3(_extends$3({}, props), {
multiple: isMultiple2,
showArrow: mergedShowArrow,
hasFeedback,
feedbackIcon,
prefixCls
})), suffixIcon = _getIcons.suffixIcon, removeIcon = _getIcons.removeIcon, clearIcon = _getIcons.clearIcon;
var mergedNotFound;
if (notFoundContent !== void 0) {
mergedNotFound = notFoundContent;
} else {
mergedNotFound = (renderEmpty || defaultRenderEmpty$1)("Select");
}
var selectProps = omit(props, ["suffixIcon", "itemIcon", "removeIcon", "clearIcon", "switcherIcon"]);
var getPlacement = function getPlacement2() {
if (placement !== void 0) {
return placement;
}
return direction === "rtl" ? "bottomRight" : "bottomLeft";
};
var mergedSize = compactSize || customizeSize || size;
var disabled = React__namespace.useContext(DisabledContext$1);
var mergedDisabled = customDisabled !== null && customDisabled !== void 0 ? customDisabled : disabled;
var mergedClassName = classnames(!customizePrefixCls && treeSelectPrefixCls, (_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-lg"), mergedSize === "large"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-sm"), mergedSize === "small"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-rtl"), direction === "rtl"), _defineProperty$b(_classNames2, "".concat(prefixCls, "-borderless"), !bordered), _defineProperty$b(_classNames2, "".concat(prefixCls, "-in-form-item"), isFormItemInput), _classNames2), getStatusClassNames(prefixCls, mergedStatus, hasFeedback), compactItemClassnames, className);
var rootPrefixCls = getPrefixCls();
return /* @__PURE__ */ jsx(GenericTreeSelect, {
virtual,
dropdownMatchSelectWidth,
disabled: mergedDisabled,
...selectProps,
ref,
prefixCls,
className: mergedClassName,
listHeight,
listItemHeight,
treeCheckable: treeCheckable ? /* @__PURE__ */ jsx("span", {
className: "".concat(prefixCls, "-tree-checkbox-inner")
}) : treeCheckable,
treeLine: !!treeLine,
inputIcon: suffixIcon,
multiple,
placement: getPlacement(),
removeIcon,
clearIcon,
switcherIcon: function switcherIcon(nodeProps) {
return renderSwitcherIcon(treePrefixCls, _switcherIcon, treeLine, nodeProps);
},
showTreeIcon: treeIcon,
notFoundContent: mergedNotFound,
getPopupContainer: getPopupContainer || getContextPopupContainer,
treeMotion: null,
dropdownClassName: mergedDropdownClassName,
choiceTransitionName: getTransitionName(rootPrefixCls, "", choiceTransitionName),
transitionName: getTransitionName(rootPrefixCls, getTransitionDirection(placement), transitionName2),
showArrow: hasFeedback || showArrow,
treeExpandAction
});
};
var TreeSelectRef = /* @__PURE__ */ React__namespace.forwardRef(InternalTreeSelect);
var TreeSelect$1 = TreeSelectRef;
TreeSelect$1.TreeNode = TreeNode;
TreeSelect$1.SHOW_ALL = SHOW_ALL;
TreeSelect$1.SHOW_PARENT = SHOW_PARENT;
TreeSelect$1.SHOW_CHILD = SHOW_CHILD;
const _TreeSelect = TreeSelect$1;
function getError(option, xhr) {
var msg = "cannot ".concat(option.method, " ").concat(option.action, " ").concat(xhr.status, "'");
var err = new Error(msg);
err.status = xhr.status;
err.method = option.method;
err.url = option.action;
return err;
}
function getBody(xhr) {
var text = xhr.responseText || xhr.response;
if (!text) {
return text;
}
try {
return JSON.parse(text);
} catch (e2) {
return text;
}
}
function upload(option) {
var xhr = new XMLHttpRequest();
if (option.onProgress && xhr.upload) {
xhr.upload.onprogress = function progress(e2) {
if (e2.total > 0) {
e2.percent = e2.loaded / e2.total * 100;
}
option.onProgress(e2);
};
}
var formData = new FormData();
if (option.data) {
Object.keys(option.data).forEach(function(key2) {
var value = option.data[key2];
if (Array.isArray(value)) {
value.forEach(function(item) {
formData.append("".concat(key2, "[]"), item);
});
return;
}
formData.append(key2, value);
});
}
if (option.file instanceof Blob) {
formData.append(option.filename, option.file, option.file.name);
} else {
formData.append(option.filename, option.file);
}
xhr.onerror = function error(e2) {
option.onError(e2);
};
xhr.onload = function onload() {
if (xhr.status < 200 || xhr.status >= 300) {
return option.onError(getError(option, xhr), getBody(xhr));
}
return option.onSuccess(getBody(xhr), xhr);
};
xhr.open(option.method, option.action, true);
if (option.withCredentials && "withCredentials" in xhr) {
xhr.withCredentials = true;
}
var headers = option.headers || {};
if (headers["X-Requested-With"] !== null) {
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
}
Object.keys(headers).forEach(function(h2) {
if (headers[h2] !== null) {
xhr.setRequestHeader(h2, headers[h2]);
}
});
xhr.send(formData);
return {
abort: function abort() {
xhr.abort();
}
};
}
var now = +new Date();
var index$Y = 0;
function uid$3() {
return "rc-upload-".concat(now, "-").concat(++index$Y);
}
const attrAccept = function(file, acceptedFiles) {
if (file && acceptedFiles) {
var acceptedFilesArray = Array.isArray(acceptedFiles) ? acceptedFiles : acceptedFiles.split(",");
var fileName = file.name || "";
var mimeType = file.type || "";
var baseMimeType = mimeType.replace(/\/.*$/, "");
return acceptedFilesArray.some(function(type2) {
var validType = type2.trim();
if (/^\*(\/\*)?$/.test(type2)) {
return true;
}
if (validType.charAt(0) === ".") {
var lowerFileName = fileName.toLowerCase();
var lowerType = validType.toLowerCase();
var affixList = [lowerType];
if (lowerType === ".jpg" || lowerType === ".jpeg") {
affixList = [".jpg", ".jpeg"];
}
return affixList.some(function(affix) {
return lowerFileName.endsWith(affix);
});
}
if (/\/\*$/.test(validType)) {
return baseMimeType === validType.replace(/\/.*$/, "");
}
if (mimeType === validType) {
return true;
}
if (/^\w+$/.test(validType)) {
warningOnce(false, "Upload takes an invalidate 'accept' type '".concat(validType, "'.Skip for check."));
return true;
}
return false;
});
}
return true;
};
function loopFiles(item, callback) {
var dirReader = item.createReader();
var fileList = [];
function sequence() {
dirReader.readEntries(function(entries) {
var entryList = Array.prototype.slice.apply(entries);
fileList = fileList.concat(entryList);
var isFinished = !entryList.length;
if (isFinished) {
callback(fileList);
} else {
sequence();
}
});
}
sequence();
}
var traverseFileTree = function traverseFileTree2(files, callback, isAccepted) {
var _traverseFileTree = function _traverseFileTree2(item, path2) {
item.path = path2 || "";
if (item.isFile) {
item.file(function(file) {
if (isAccepted(file)) {
if (item.fullPath && !file.webkitRelativePath) {
Object.defineProperties(file, {
webkitRelativePath: {
writable: true
}
});
file.webkitRelativePath = item.fullPath.replace(/^\//, "");
Object.defineProperties(file, {
webkitRelativePath: {
writable: false
}
});
}
callback([file]);
}
});
} else if (item.isDirectory) {
loopFiles(item, function(entries) {
entries.forEach(function(entryItem) {
_traverseFileTree2(entryItem, "".concat(path2).concat(item.name, "/"));
});
});
}
};
files.forEach(function(file) {
_traverseFileTree(file.webkitGetAsEntry());
});
};
var _excluded$1 = ["component", "prefixCls", "className", "disabled", "id", "style", "multiple", "accept", "capture", "children", "directory", "openFileDialogOnClick", "onMouseEnter", "onMouseLeave"];
var AjaxUploader = /* @__PURE__ */ function(_Component) {
_inherits(AjaxUploader2, _Component);
var _super = _createSuper(AjaxUploader2);
function AjaxUploader2() {
var _this2;
_classCallCheck(this, AjaxUploader2);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this2 = _super.call.apply(_super, [this].concat(args));
_this2.state = {
uid: uid$3()
};
_this2.reqs = {};
_this2.fileInput = void 0;
_this2._isMounted = void 0;
_this2.onChange = function(e2) {
var _this$props = _this2.props, accept = _this$props.accept, directory = _this$props.directory;
var files = e2.target.files;
var acceptedFiles = _toConsumableArray$c(files).filter(function(file) {
return !directory || attrAccept(file, accept);
});
_this2.uploadFiles(acceptedFiles);
_this2.reset();
};
_this2.onClick = function(e2) {
var el = _this2.fileInput;
if (!el) {
return;
}
var _this$props2 = _this2.props, children = _this$props2.children, onClick = _this$props2.onClick;
if (children && children.type === "button") {
var parent2 = el.parentNode;
parent2.focus();
parent2.querySelector("button").blur();
}
el.click();
if (onClick) {
onClick(e2);
}
};
_this2.onKeyDown = function(e2) {
if (e2.key === "Enter") {
_this2.onClick(e2);
}
};
_this2.onFileDrop = function(e2) {
var multiple = _this2.props.multiple;
e2.preventDefault();
if (e2.type === "dragover") {
return;
}
if (_this2.props.directory) {
traverseFileTree(Array.prototype.slice.call(e2.dataTransfer.items), _this2.uploadFiles, function(_file) {
return attrAccept(_file, _this2.props.accept);
});
} else {
var files = _toConsumableArray$c(e2.dataTransfer.files).filter(function(file) {
return attrAccept(file, _this2.props.accept);
});
if (multiple === false) {
files = files.slice(0, 1);
}
_this2.uploadFiles(files);
}
};
_this2.uploadFiles = function(files) {
var originFiles = _toConsumableArray$c(files);
var postFiles = originFiles.map(function(file) {
file.uid = uid$3();
return _this2.processFile(file, originFiles);
});
Promise.all(postFiles).then(function(fileList) {
var onBatchStart = _this2.props.onBatchStart;
onBatchStart === null || onBatchStart === void 0 ? void 0 : onBatchStart(fileList.map(function(_ref) {
var origin = _ref.origin, parsedFile = _ref.parsedFile;
return {
file: origin,
parsedFile
};
}));
fileList.filter(function(file) {
return file.parsedFile !== null;
}).forEach(function(file) {
_this2.post(file);
});
});
};
_this2.processFile = /* @__PURE__ */ function() {
var _ref2 = _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime$3().mark(function _callee(file, fileList) {
var beforeUpload, transformedFile, action, mergedAction, data, mergedData, parsedData, parsedFile, mergedParsedFile;
return _regeneratorRuntime$3().wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
beforeUpload = _this2.props.beforeUpload;
transformedFile = file;
if (!beforeUpload) {
_context.next = 14;
break;
}
_context.prev = 3;
_context.next = 6;
return beforeUpload(file, fileList);
case 6:
transformedFile = _context.sent;
_context.next = 12;
break;
case 9:
_context.prev = 9;
_context.t0 = _context["catch"](3);
transformedFile = false;
case 12:
if (!(transformedFile === false)) {
_context.next = 14;
break;
}
return _context.abrupt("return", {
origin: file,
parsedFile: null,
action: null,
data: null
});
case 14:
action = _this2.props.action;
if (!(typeof action === "function")) {
_context.next = 21;
break;
}
_context.next = 18;
return action(file);
case 18:
mergedAction = _context.sent;
_context.next = 22;
break;
case 21:
mergedAction = action;
case 22:
data = _this2.props.data;
if (!(typeof data === "function")) {
_context.next = 29;
break;
}
_context.next = 26;
return data(file);
case 26:
mergedData = _context.sent;
_context.next = 30;
break;
case 29:
mergedData = data;
case 30:
parsedData = (_typeof$q(transformedFile) === "object" || typeof transformedFile === "string") && transformedFile ? transformedFile : file;
if (parsedData instanceof File) {
parsedFile = parsedData;
} else {
parsedFile = new File([parsedData], file.name, {
type: file.type
});
}
mergedParsedFile = parsedFile;
mergedParsedFile.uid = file.uid;
return _context.abrupt("return", {
origin: file,
data: mergedData,
parsedFile: mergedParsedFile,
action: mergedAction
});
case 35:
case "end":
return _context.stop();
}
}
}, _callee, null, [[3, 9]]);
}));
return function(_x, _x2) {
return _ref2.apply(this, arguments);
};
}();
_this2.saveFileInput = function(node) {
_this2.fileInput = node;
};
return _this2;
}
_createClass(AjaxUploader2, [{
key: "componentDidMount",
value: function componentDidMount() {
this._isMounted = true;
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
this._isMounted = false;
this.abort();
}
}, {
key: "post",
value: function post(_ref3) {
var _this2 = this;
var data = _ref3.data, origin = _ref3.origin, action = _ref3.action, parsedFile = _ref3.parsedFile;
if (!this._isMounted) {
return;
}
var _this$props3 = this.props, onStart = _this$props3.onStart, customRequest = _this$props3.customRequest, name2 = _this$props3.name, headers = _this$props3.headers, withCredentials = _this$props3.withCredentials, method2 = _this$props3.method;
var uid2 = origin.uid;
var request = customRequest || upload;
var requestOption = {
action,
filename: name2,
data,
file: parsedFile,
headers,
withCredentials,
method: method2 || "post",
onProgress: function onProgress(e2) {
var onProgress2 = _this2.props.onProgress;
onProgress2 === null || onProgress2 === void 0 ? void 0 : onProgress2(e2, parsedFile);
},
onSuccess: function onSuccess(ret, xhr) {
var onSuccess2 = _this2.props.onSuccess;
onSuccess2 === null || onSuccess2 === void 0 ? void 0 : onSuccess2(ret, parsedFile, xhr);
delete _this2.reqs[uid2];
},
onError: function onError(err, ret) {
var onError2 = _this2.props.onError;
onError2 === null || onError2 === void 0 ? void 0 : onError2(err, ret, parsedFile);
delete _this2.reqs[uid2];
}
};
onStart(origin);
this.reqs[uid2] = request(requestOption);
}
}, {
key: "reset",
value: function reset() {
this.setState({
uid: uid$3()
});
}
}, {
key: "abort",
value: function abort(file) {
var reqs = this.reqs;
if (file) {
var uid2 = file.uid ? file.uid : file;
if (reqs[uid2] && reqs[uid2].abort) {
reqs[uid2].abort();
}
delete reqs[uid2];
} else {
Object.keys(reqs).forEach(function(uid3) {
if (reqs[uid3] && reqs[uid3].abort) {
reqs[uid3].abort();
}
delete reqs[uid3];
});
}
}
}, {
key: "render",
value: function render2() {
var _classNames;
var _this$props4 = this.props, Tag2 = _this$props4.component, prefixCls = _this$props4.prefixCls, className = _this$props4.className, disabled = _this$props4.disabled, id2 = _this$props4.id, style2 = _this$props4.style, multiple = _this$props4.multiple, accept = _this$props4.accept, capture = _this$props4.capture, children = _this$props4.children, directory = _this$props4.directory, openFileDialogOnClick = _this$props4.openFileDialogOnClick, onMouseEnter = _this$props4.onMouseEnter, onMouseLeave = _this$props4.onMouseLeave, otherProps = _objectWithoutProperties$1(_this$props4, _excluded$1);
var cls = classnames((_classNames = {}, _defineProperty$b(_classNames, prefixCls, true), _defineProperty$b(_classNames, "".concat(prefixCls, "-disabled"), disabled), _defineProperty$b(_classNames, className, className), _classNames));
var dirProps = directory ? {
directory: "directory",
webkitdirectory: "webkitdirectory"
} : {};
var events = disabled ? {} : {
onClick: openFileDialogOnClick ? this.onClick : function() {
},
onKeyDown: openFileDialogOnClick ? this.onKeyDown : function() {
},
onMouseEnter,
onMouseLeave,
onDrop: this.onFileDrop,
onDragOver: this.onFileDrop,
tabIndex: "0"
};
return /* @__PURE__ */ jsxs(Tag2, {
...events,
className: cls,
role: "button",
style: style2,
children: [/* @__PURE__ */ React$a.createElement("input", {
...pickAttrs(otherProps, {
aria: true,
data: true
}),
id: id2,
type: "file",
ref: this.saveFileInput,
onClick: function onClick(e2) {
return e2.stopPropagation();
},
key: this.state.uid,
style: {
display: "none"
},
accept,
...dirProps,
multiple,
onChange: this.onChange,
...capture != null ? {
capture
} : {}
}), children]
});
}
}]);
return AjaxUploader2;
}(React$a.Component);
function empty() {
}
var Upload$2 = /* @__PURE__ */ function(_Component) {
_inherits(Upload2, _Component);
var _super = _createSuper(Upload2);
function Upload2() {
var _this2;
_classCallCheck(this, Upload2);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this2 = _super.call.apply(_super, [this].concat(args));
_this2.uploader = void 0;
_this2.saveUploader = function(node) {
_this2.uploader = node;
};
return _this2;
}
_createClass(Upload2, [{
key: "abort",
value: function abort(file) {
this.uploader.abort(file);
}
}, {
key: "render",
value: function render2() {
return /* @__PURE__ */ jsx(AjaxUploader, {
...this.props,
ref: this.saveUploader
});
}
}]);
return Upload2;
}(React$a.Component);
Upload$2.defaultProps = {
component: "span",
prefixCls: "rc-upload",
data: {},
headers: {},
name: "file",
multipart: false,
onStart: empty,
onError: empty,
onSuccess: empty,
multiple: false,
beforeUpload: null,
customRequest: null,
withCredentials: false,
openFileDialogOnClick: true
};
var FileTwoTone$2 = { "icon": function render2(primaryColor, secondaryColor) {
return { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M534 352V136H232v752h560V394H576a42 42 0 01-42-42z", "fill": secondaryColor } }, { "tag": "path", "attrs": { "d": "M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM602 137.8L790.2 326H602V137.8zM792 888H232V136h302v216a42 42 0 0042 42h216v494z", "fill": primaryColor } }] };
}, "name": "file", "theme": "twotone" };
const FileTwoToneSvg = FileTwoTone$2;
var FileTwoTone = function FileTwoTone2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: FileTwoToneSvg
})
});
};
FileTwoTone.displayName = "FileTwoTone";
const FileTwoTone$1 = /* @__PURE__ */ React__namespace.forwardRef(FileTwoTone);
var PaperClipOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M779.3 196.6c-94.2-94.2-247.6-94.2-341.7 0l-261 260.8c-1.7 1.7-2.6 4-2.6 6.4s.9 4.7 2.6 6.4l36.9 36.9a9 9 0 0012.7 0l261-260.8c32.4-32.4 75.5-50.2 121.3-50.2s88.9 17.8 121.2 50.2c32.4 32.4 50.2 75.5 50.2 121.2 0 45.8-17.8 88.8-50.2 121.2l-266 265.9-43.1 43.1c-40.3 40.3-105.8 40.3-146.1 0-19.5-19.5-30.2-45.4-30.2-73s10.7-53.5 30.2-73l263.9-263.8c6.7-6.6 15.5-10.3 24.9-10.3h.1c9.4 0 18.1 3.7 24.7 10.3 6.7 6.7 10.3 15.5 10.3 24.9 0 9.3-3.7 18.1-10.3 24.7L372.4 653c-1.7 1.7-2.6 4-2.6 6.4s.9 4.7 2.6 6.4l36.9 36.9a9 9 0 0012.7 0l215.6-215.6c19.9-19.9 30.8-46.3 30.8-74.4s-11-54.6-30.8-74.4c-41.1-41.1-107.9-41-149 0L463 364 224.8 602.1A172.22 172.22 0 00174 724.8c0 46.3 18.1 89.8 50.8 122.5 33.9 33.8 78.3 50.7 122.7 50.7 44.4 0 88.8-16.9 122.6-50.7l309.2-309C824.8 492.7 850 432 850 367.5c.1-64.6-25.1-125.3-70.7-170.9z" } }] }, "name": "paper-clip", "theme": "outlined" };
const PaperClipOutlinedSvg = PaperClipOutlined$2;
var PaperClipOutlined = function PaperClipOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: PaperClipOutlinedSvg
})
});
};
PaperClipOutlined.displayName = "PaperClipOutlined";
const PaperClipOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(PaperClipOutlined);
var PictureTwoTone$2 = { "icon": function render2(primaryColor, secondaryColor) {
return { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M928 160H96c-17.7 0-32 14.3-32 32v640c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V192c0-17.7-14.3-32-32-32zm-40 632H136v-39.9l138.5-164.3 150.1 178L658.1 489 888 761.6V792zm0-129.8L664.2 396.8c-3.2-3.8-9-3.8-12.2 0L424.6 666.4l-144-170.7c-3.2-3.8-9-3.8-12.2 0L136 652.7V232h752v430.2z", "fill": primaryColor } }, { "tag": "path", "attrs": { "d": "M424.6 765.8l-150.1-178L136 752.1V792h752v-30.4L658.1 489z", "fill": secondaryColor } }, { "tag": "path", "attrs": { "d": "M136 652.7l132.4-157c3.2-3.8 9-3.8 12.2 0l144 170.7L652 396.8c3.2-3.8 9-3.8 12.2 0L888 662.2V232H136v420.7zM304 280a88 88 0 110 176 88 88 0 010-176z", "fill": secondaryColor } }, { "tag": "path", "attrs": { "d": "M276 368a28 28 0 1056 0 28 28 0 10-56 0z", "fill": secondaryColor } }, { "tag": "path", "attrs": { "d": "M304 456a88 88 0 100-176 88 88 0 000 176zm0-116c15.5 0 28 12.5 28 28s-12.5 28-28 28-28-12.5-28-28 12.5-28 28-28z", "fill": primaryColor } }] };
}, "name": "picture", "theme": "twotone" };
const PictureTwoToneSvg = PictureTwoTone$2;
var PictureTwoTone = function PictureTwoTone2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: PictureTwoToneSvg
})
});
};
PictureTwoTone.displayName = "PictureTwoTone";
const PictureTwoTone$1 = /* @__PURE__ */ React__namespace.forwardRef(PictureTwoTone);
function file2Obj(file) {
return _extends$3(_extends$3({}, file), {
lastModified: file.lastModified,
lastModifiedDate: file.lastModifiedDate,
name: file.name,
size: file.size,
type: file.type,
uid: file.uid,
percent: 0,
originFileObj: file
});
}
function updateFileList(file, fileList) {
var nextFileList = _toConsumableArray$c(fileList);
var fileIndex = nextFileList.findIndex(function(_ref) {
var uid2 = _ref.uid;
return uid2 === file.uid;
});
if (fileIndex === -1) {
nextFileList.push(file);
} else {
nextFileList[fileIndex] = file;
}
return nextFileList;
}
function getFileItem(file, fileList) {
var matchKey = file.uid !== void 0 ? "uid" : "name";
return fileList.filter(function(item) {
return item[matchKey] === file[matchKey];
})[0];
}
function removeFileItem(file, fileList) {
var matchKey = file.uid !== void 0 ? "uid" : "name";
var removed = fileList.filter(function(item) {
return item[matchKey] !== file[matchKey];
});
if (removed.length === fileList.length) {
return null;
}
return removed;
}
var extname = function extname2() {
var url = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "";
var temp = url.split("/");
var filename = temp[temp.length - 1];
var filenameWithoutSuffix = filename.split(/#|\?/)[0];
return (/\.[^./\\]*$/.exec(filenameWithoutSuffix) || [""])[0];
};
var isImageFileType = function isImageFileType2(type2) {
return type2.indexOf("image/") === 0;
};
var isImageUrl = function isImageUrl2(file) {
if (file.type && !file.thumbUrl) {
return isImageFileType(file.type);
}
var url = file.thumbUrl || file.url || "";
var extension = extname(url);
if (/^data:image\//.test(url) || /(webp|svg|png|gif|jpg|jpeg|jfif|bmp|dpg|ico|heic|heif)$/i.test(extension)) {
return true;
}
if (/^data:/.test(url)) {
return false;
}
if (extension) {
return false;
}
return true;
};
var MEASURE_SIZE = 200;
function previewImage(file) {
return new Promise(function(resolve) {
if (!file.type || !isImageFileType(file.type)) {
resolve("");
return;
}
var canvas = document.createElement("canvas");
canvas.width = MEASURE_SIZE;
canvas.height = MEASURE_SIZE;
canvas.style.cssText = "position: fixed; left: 0; top: 0; width: ".concat(MEASURE_SIZE, "px; height: ").concat(MEASURE_SIZE, "px; z-index: 9999; display: none;");
document.body.appendChild(canvas);
var ctx2 = canvas.getContext("2d");
var img = new Image();
img.onload = function() {
var width = img.width, height = img.height;
var drawWidth = MEASURE_SIZE;
var drawHeight = MEASURE_SIZE;
var offsetX = 0;
var offsetY = 0;
if (width > height) {
drawHeight = height * (MEASURE_SIZE / width);
offsetY = -(drawHeight - drawWidth) / 2;
} else {
drawWidth = width * (MEASURE_SIZE / height);
offsetX = -(drawWidth - drawHeight) / 2;
}
ctx2.drawImage(img, offsetX, offsetY, drawWidth, drawHeight);
var dataURL = canvas.toDataURL();
document.body.removeChild(canvas);
resolve(dataURL);
};
img.crossOrigin = "anonymous";
if (file.type.startsWith("image/svg+xml")) {
var reader = new FileReader();
reader.addEventListener("load", function() {
if (reader.result)
img.src = reader.result;
});
reader.readAsDataURL(file);
} else {
img.src = window.URL.createObjectURL(file);
}
});
}
var DownloadOutlined$2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M505.7 661a8 8 0 0012.6 0l112-141.7c4.1-5.2.4-12.9-6.3-12.9h-74.1V168c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v338.3H400c-6.7 0-10.4 7.7-6.3 12.9l112 141.8zM878 626h-60c-4.4 0-8 3.6-8 8v154H214V634c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v198c0 17.7 14.3 32 32 32h684c17.7 0 32-14.3 32-32V634c0-4.4-3.6-8-8-8z" } }] }, "name": "download", "theme": "outlined" };
const DownloadOutlinedSvg = DownloadOutlined$2;
var DownloadOutlined = function DownloadOutlined2(props, ref) {
return /* @__PURE__ */ jsx(AntdIcon$1, {
..._objectSpread2$a(_objectSpread2$a({}, props), {}, {
ref,
icon: DownloadOutlinedSvg
})
});
};
DownloadOutlined.displayName = "DownloadOutlined";
const DownloadOutlined$1 = /* @__PURE__ */ React__namespace.forwardRef(DownloadOutlined);
var ListItem = /* @__PURE__ */ React__namespace.forwardRef(function(_ref, ref) {
var _classNames3;
var prefixCls = _ref.prefixCls, className = _ref.className, style2 = _ref.style, locale2 = _ref.locale, listType = _ref.listType, file = _ref.file, items = _ref.items, progressProps = _ref.progress, iconRender = _ref.iconRender, actionIconRender = _ref.actionIconRender, itemRender = _ref.itemRender, isImgUrl = _ref.isImgUrl, showPreviewIcon = _ref.showPreviewIcon, showRemoveIcon = _ref.showRemoveIcon, showDownloadIcon = _ref.showDownloadIcon, customPreviewIcon = _ref.previewIcon, customRemoveIcon = _ref.removeIcon, customDownloadIcon = _ref.downloadIcon, onPreview = _ref.onPreview, onDownload = _ref.onDownload, onClose = _ref.onClose;
var _a, _b;
var status = file.status;
var _React$useState = React__namespace.useState(status), _React$useState2 = _slicedToArray$e(_React$useState, 2), mergedStatus = _React$useState2[0], setMergedStatus = _React$useState2[1];
React__namespace.useEffect(function() {
if (status !== "removed") {
setMergedStatus(status);
}
}, [status]);
var _React$useState3 = React__namespace.useState(false), _React$useState4 = _slicedToArray$e(_React$useState3, 2), showProgress = _React$useState4[0], setShowProgress = _React$useState4[1];
var progressRafRef = React__namespace.useRef(null);
React__namespace.useEffect(function() {
progressRafRef.current = setTimeout(function() {
setShowProgress(true);
}, 300);
return function() {
if (progressRafRef.current) {
clearTimeout(progressRafRef.current);
}
};
}, []);
var spanClassName = "".concat(prefixCls, "-span");
var iconNode = iconRender(file);
var icon = /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-text-icon"),
children: iconNode
});
if (listType === "picture" || listType === "picture-card") {
if (mergedStatus === "uploading" || !file.thumbUrl && !file.url) {
var _classNames;
var uploadingClassName = classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-list-item-thumbnail"), true), _defineProperty$b(_classNames, "".concat(prefixCls, "-list-item-file"), mergedStatus !== "uploading"), _classNames));
icon = /* @__PURE__ */ jsx("div", {
className: uploadingClassName,
children: iconNode
});
} else {
var _classNames2;
var thumbnail = (isImgUrl === null || isImgUrl === void 0 ? void 0 : isImgUrl(file)) ? /* @__PURE__ */ jsx("img", {
src: file.thumbUrl || file.url,
alt: file.name,
className: "".concat(prefixCls, "-list-item-image"),
crossOrigin: file.crossOrigin
}) : iconNode;
var aClassName = classnames((_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-list-item-thumbnail"), true), _defineProperty$b(_classNames2, "".concat(prefixCls, "-list-item-file"), isImgUrl && !isImgUrl(file)), _classNames2));
icon = /* @__PURE__ */ jsx("a", {
className: aClassName,
onClick: function onClick(e2) {
return onPreview(file, e2);
},
href: file.url || file.thumbUrl,
target: "_blank",
rel: "noopener noreferrer",
children: thumbnail
});
}
}
var infoUploadingClass = classnames((_classNames3 = {}, _defineProperty$b(_classNames3, "".concat(prefixCls, "-list-item"), true), _defineProperty$b(_classNames3, "".concat(prefixCls, "-list-item-").concat(mergedStatus), true), _defineProperty$b(_classNames3, "".concat(prefixCls, "-list-item-list-type-").concat(listType), true), _classNames3));
var linkProps = typeof file.linkProps === "string" ? JSON.parse(file.linkProps) : file.linkProps;
var removeIcon = showRemoveIcon ? actionIconRender((typeof customRemoveIcon === "function" ? customRemoveIcon(file) : customRemoveIcon) || /* @__PURE__ */ jsx(DeleteOutlined$1, {}), function() {
return onClose(file);
}, prefixCls, locale2.removeFile) : null;
var downloadIcon = showDownloadIcon && mergedStatus === "done" ? actionIconRender((typeof customDownloadIcon === "function" ? customDownloadIcon(file) : customDownloadIcon) || /* @__PURE__ */ jsx(DownloadOutlined$1, {}), function() {
return onDownload(file);
}, prefixCls, locale2.downloadFile) : null;
var downloadOrDelete = listType !== "picture-card" && /* @__PURE__ */ jsxs("span", {
className: classnames("".concat(prefixCls, "-list-item-card-actions"), {
picture: listType === "picture"
}),
children: [downloadIcon, removeIcon]
}, "download-delete");
var listItemNameClass = classnames("".concat(prefixCls, "-list-item-name"));
var preview = file.url ? [
/* @__PURE__ */ jsx("a", {
target: "_blank",
rel: "noopener noreferrer",
className: listItemNameClass,
title: file.name,
...linkProps,
href: file.url,
onClick: function onClick(e2) {
return onPreview(file, e2);
},
children: file.name
}, "view"),
downloadOrDelete
] : [
/* @__PURE__ */ jsx("span", {
className: listItemNameClass,
onClick: function onClick(e2) {
return onPreview(file, e2);
},
title: file.name,
children: file.name
}, "view"),
downloadOrDelete
];
var previewStyle = {
pointerEvents: "none",
opacity: 0.5
};
var previewIcon = showPreviewIcon ? /* @__PURE__ */ jsx("a", {
href: file.url || file.thumbUrl,
target: "_blank",
rel: "noopener noreferrer",
style: file.url || file.thumbUrl ? void 0 : previewStyle,
onClick: function onClick(e2) {
return onPreview(file, e2);
},
title: locale2.previewFile,
children: typeof customPreviewIcon === "function" ? customPreviewIcon(file) : customPreviewIcon || /* @__PURE__ */ jsx(EyeOutlined$1, {})
}) : null;
var actions = listType === "picture-card" && mergedStatus !== "uploading" && /* @__PURE__ */ jsxs("span", {
className: "".concat(prefixCls, "-list-item-actions"),
children: [previewIcon, mergedStatus === "done" && downloadIcon, removeIcon]
});
var message;
if (file.response && typeof file.response === "string") {
message = file.response;
} else {
message = ((_a = file.error) === null || _a === void 0 ? void 0 : _a.statusText) || ((_b = file.error) === null || _b === void 0 ? void 0 : _b.message) || locale2.uploadError;
}
var iconAndPreview = /* @__PURE__ */ jsxs("span", {
className: spanClassName,
children: [icon, preview]
});
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls;
var rootPrefixCls = getPrefixCls();
var dom = /* @__PURE__ */ jsxs("div", {
className: infoUploadingClass,
children: [/* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-list-item-info"),
children: iconAndPreview
}), actions, showProgress && /* @__PURE__ */ jsx(CSSMotion, {
motionName: "".concat(rootPrefixCls, "-fade"),
visible: mergedStatus === "uploading",
motionDeadline: 2e3,
children: function(_ref2) {
var motionClassName = _ref2.className;
var loadingProgress = "percent" in file ? /* @__PURE__ */ jsx(Progress$1, {
...progressProps,
type: "line",
percent: file.percent
}) : null;
return /* @__PURE__ */ jsx("div", {
className: classnames("".concat(prefixCls, "-list-item-progress"), motionClassName),
children: loadingProgress
});
}
})]
});
var listContainerNameClass = classnames("".concat(prefixCls, "-list-").concat(listType, "-container"), className);
var item = mergedStatus === "error" ? /* @__PURE__ */ jsx(_Tooltip, {
title: message,
getPopupContainer: function getPopupContainer(node) {
return node.parentNode;
},
children: dom
}) : dom;
return /* @__PURE__ */ jsx("div", {
className: listContainerNameClass,
style: style2,
ref,
children: itemRender ? itemRender(item, file, items, {
download: onDownload.bind(null, file),
preview: onPreview.bind(null, file),
remove: onClose.bind(null, file)
}) : item
});
});
const ListItem$1 = ListItem;
var listItemMotion = _extends$3({}, collapseMotion$1);
delete listItemMotion.onAppearEnd;
delete listItemMotion.onEnterEnd;
delete listItemMotion.onLeaveEnd;
var InternalUploadList = function InternalUploadList2(props, ref) {
var _classNames;
var _props$listType = props.listType, listType = _props$listType === void 0 ? "text" : _props$listType, _props$previewFile = props.previewFile, previewFile = _props$previewFile === void 0 ? previewImage : _props$previewFile, onPreview = props.onPreview, onDownload = props.onDownload, onRemove = props.onRemove, locale2 = props.locale, iconRender = props.iconRender, _props$isImageUrl = props.isImageUrl, isImgUrl = _props$isImageUrl === void 0 ? isImageUrl : _props$isImageUrl, customizePrefixCls = props.prefixCls, _props$items = props.items, items = _props$items === void 0 ? [] : _props$items, _props$showPreviewIco = props.showPreviewIcon, showPreviewIcon = _props$showPreviewIco === void 0 ? true : _props$showPreviewIco, _props$showRemoveIcon = props.showRemoveIcon, showRemoveIcon = _props$showRemoveIcon === void 0 ? true : _props$showRemoveIcon, _props$showDownloadIc = props.showDownloadIcon, showDownloadIcon = _props$showDownloadIc === void 0 ? false : _props$showDownloadIc, removeIcon = props.removeIcon, previewIcon = props.previewIcon, downloadIcon = props.downloadIcon, _props$progress = props.progress, progress = _props$progress === void 0 ? {
strokeWidth: 2,
showInfo: false
} : _props$progress, appendAction = props.appendAction, _props$appendActionVi = props.appendActionVisible, appendActionVisible = _props$appendActionVi === void 0 ? true : _props$appendActionVi, itemRender = props.itemRender;
var forceUpdate = useForceUpdate();
var _React$useState = React__namespace.useState(false), _React$useState2 = _slicedToArray$e(_React$useState, 2), motionAppear = _React$useState2[0], setMotionAppear = _React$useState2[1];
React__namespace.useEffect(function() {
if (listType !== "picture" && listType !== "picture-card") {
return;
}
(items || []).forEach(function(file) {
if (typeof document === "undefined" || typeof window === "undefined" || !window.FileReader || !window.File || !(file.originFileObj instanceof File || file.originFileObj instanceof Blob) || file.thumbUrl !== void 0) {
return;
}
file.thumbUrl = "";
if (previewFile) {
previewFile(file.originFileObj).then(function(previewDataUrl) {
file.thumbUrl = previewDataUrl || "";
forceUpdate();
});
}
});
}, [listType, items, previewFile]);
React__namespace.useEffect(function() {
setMotionAppear(true);
}, []);
var onInternalPreview = function onInternalPreview2(file, e2) {
if (!onPreview) {
return;
}
e2 === null || e2 === void 0 ? void 0 : e2.preventDefault();
return onPreview(file);
};
var onInternalDownload = function onInternalDownload2(file) {
if (typeof onDownload === "function") {
onDownload(file);
} else if (file.url) {
window.open(file.url);
}
};
var onInternalClose = function onInternalClose2(file) {
onRemove === null || onRemove === void 0 ? void 0 : onRemove(file);
};
var internalIconRender = function internalIconRender2(file) {
if (iconRender) {
return iconRender(file, listType);
}
var isLoading = file.status === "uploading";
var fileIcon = isImgUrl && isImgUrl(file) ? /* @__PURE__ */ jsx(PictureTwoTone$1, {}) : /* @__PURE__ */ jsx(FileTwoTone$1, {});
var icon = isLoading ? /* @__PURE__ */ jsx(LoadingOutlined$1, {}) : /* @__PURE__ */ jsx(PaperClipOutlined$1, {});
if (listType === "picture") {
icon = isLoading ? /* @__PURE__ */ jsx(LoadingOutlined$1, {}) : fileIcon;
} else if (listType === "picture-card") {
icon = isLoading ? locale2.uploading : fileIcon;
}
return icon;
};
var actionIconRender = function actionIconRender2(customIcon, callback, prefixCls2, title) {
var btnProps = {
type: "text",
size: "small",
title,
onClick: function onClick(e2) {
callback();
if (isValidElement(customIcon) && customIcon.props.onClick) {
customIcon.props.onClick(e2);
}
},
className: "".concat(prefixCls2, "-list-item-card-actions-btn")
};
if (isValidElement(customIcon)) {
var btnIcon = cloneElement(customIcon, _extends$3(_extends$3({}, customIcon.props), {
onClick: function onClick() {
}
}));
return /* @__PURE__ */ jsx(Button$2, {
...btnProps,
icon: btnIcon
});
}
return /* @__PURE__ */ jsx(Button$2, {
...btnProps,
children: /* @__PURE__ */ jsx("span", {
children: customIcon
})
});
};
React__namespace.useImperativeHandle(ref, function() {
return {
handlePreview: onInternalPreview,
handleDownload: onInternalDownload
};
});
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var prefixCls = getPrefixCls("upload", customizePrefixCls);
var listClassNames = classnames((_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-list"), true), _defineProperty$b(_classNames, "".concat(prefixCls, "-list-").concat(listType), true), _defineProperty$b(_classNames, "".concat(prefixCls, "-list-rtl"), direction === "rtl"), _classNames));
var motionKeyList = _toConsumableArray$c(items.map(function(file) {
return {
key: file.uid,
file
};
}));
var animationDirection = listType === "picture-card" ? "animate-inline" : "animate";
var motionConfig = {
motionDeadline: 2e3,
motionName: "".concat(prefixCls, "-").concat(animationDirection),
keys: motionKeyList,
motionAppear
};
if (listType !== "picture-card") {
motionConfig = _extends$3(_extends$3({}, listItemMotion), motionConfig);
}
return /* @__PURE__ */ jsxs("div", {
className: listClassNames,
children: [/* @__PURE__ */ jsx(CSSMotionList, {
...motionConfig,
component: false,
children: function(_ref) {
var key2 = _ref.key, file = _ref.file, motionClassName = _ref.className, motionStyle = _ref.style;
return /* @__PURE__ */ jsx(ListItem$1, {
locale: locale2,
prefixCls,
className: motionClassName,
style: motionStyle,
file,
items,
progress,
listType,
isImgUrl,
showPreviewIcon,
showRemoveIcon,
showDownloadIcon,
removeIcon,
previewIcon,
downloadIcon,
iconRender: internalIconRender,
actionIconRender,
itemRender,
onPreview: onInternalPreview,
onDownload: onInternalDownload,
onClose: onInternalClose
}, key2);
}
}), appendAction && /* @__PURE__ */ jsx(CSSMotion, {
...motionConfig,
visible: appendActionVisible,
forceRender: true,
children: function(_ref2) {
var motionClassName = _ref2.className, motionStyle = _ref2.style;
return cloneElement(appendAction, function(oriProps) {
return {
className: classnames(oriProps.className, motionClassName),
style: _extends$3(_extends$3(_extends$3({}, motionStyle), {
pointerEvents: motionClassName ? "none" : void 0
}), oriProps.style)
};
});
}
})]
});
};
var UploadList = /* @__PURE__ */ React__namespace.forwardRef(InternalUploadList);
const UploadList$1 = UploadList;
var __awaiter$1 = globalThis && globalThis.__awaiter || function(thisArg, _arguments, P, generator) {
function adopt(value) {
return value instanceof P ? value : new P(function(resolve) {
resolve(value);
});
}
return new (P || (P = Promise))(function(resolve, reject) {
function fulfilled(value) {
try {
step2(generator.next(value));
} catch (e2) {
reject(e2);
}
}
function rejected(value) {
try {
step2(generator["throw"](value));
} catch (e2) {
reject(e2);
}
}
function step2(result) {
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
}
step2((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var LIST_IGNORE = "__LIST_IGNORE_".concat(Date.now(), "__");
var InternalUpload = function InternalUpload2(props, ref) {
var _classNames2;
var fileList = props.fileList, defaultFileList = props.defaultFileList, onRemove = props.onRemove, _props$showUploadList = props.showUploadList, showUploadList = _props$showUploadList === void 0 ? true : _props$showUploadList, _props$listType = props.listType, listType = _props$listType === void 0 ? "text" : _props$listType, onPreview = props.onPreview, onDownload = props.onDownload, onChange = props.onChange, onDrop = props.onDrop, previewFile = props.previewFile, customDisabled = props.disabled, propLocale = props.locale, iconRender = props.iconRender, isImageUrl2 = props.isImageUrl, progress = props.progress, customizePrefixCls = props.prefixCls, className = props.className, _props$type = props.type, type2 = _props$type === void 0 ? "select" : _props$type, children = props.children, style2 = props.style, itemRender = props.itemRender, maxCount2 = props.maxCount, _props$data = props.data, data = _props$data === void 0 ? {} : _props$data, _props$multiple = props.multiple, multiple = _props$multiple === void 0 ? false : _props$multiple, _props$action = props.action, action = _props$action === void 0 ? "" : _props$action, _props$accept = props.accept, accept = _props$accept === void 0 ? "" : _props$accept, _props$supportServerR = props.supportServerRender, supportServerRender = _props$supportServerR === void 0 ? true : _props$supportServerR;
var disabled = React__namespace.useContext(DisabledContext$1);
var mergedDisabled = customDisabled !== null && customDisabled !== void 0 ? customDisabled : disabled;
var _useMergedState = useMergedState(defaultFileList || [], {
value: fileList,
postState: function postState(list) {
return list !== null && list !== void 0 ? list : [];
}
}), _useMergedState2 = _slicedToArray$e(_useMergedState, 2), mergedFileList = _useMergedState2[0], setMergedFileList = _useMergedState2[1];
var _React$useState = React__namespace.useState("drop"), _React$useState2 = _slicedToArray$e(_React$useState, 2), dragState = _React$useState2[0], setDragState = _React$useState2[1];
var upload2 = React__namespace.useRef(null);
React__namespace.useMemo(function() {
var timestamp = Date.now();
(fileList || []).forEach(function(file, index2) {
if (!file.uid && !Object.isFrozen(file)) {
file.uid = "__AUTO__".concat(timestamp, "_").concat(index2, "__");
}
});
}, [fileList]);
var onInternalChange = function onInternalChange2(file, changedFileList, event) {
var cloneList = _toConsumableArray$c(changedFileList);
if (maxCount2 === 1) {
cloneList = cloneList.slice(-1);
} else if (maxCount2) {
cloneList = cloneList.slice(0, maxCount2);
}
ReactDOM2.flushSync(function() {
setMergedFileList(cloneList);
});
var changeInfo = {
file,
fileList: cloneList
};
if (event) {
changeInfo.event = event;
}
onChange === null || onChange === void 0 ? void 0 : onChange(changeInfo);
};
var mergedBeforeUpload = function mergedBeforeUpload2(file, fileListArgs) {
return __awaiter$1(void 0, void 0, void 0, /* @__PURE__ */ _regeneratorRuntime$3().mark(function _callee() {
var beforeUpload, transformFile, parsedFile, result;
return _regeneratorRuntime$3().wrap(function _callee$(_context) {
while (1)
switch (_context.prev = _context.next) {
case 0:
beforeUpload = props.beforeUpload, transformFile = props.transformFile;
parsedFile = file;
if (!beforeUpload) {
_context.next = 13;
break;
}
_context.next = 5;
return beforeUpload(file, fileListArgs);
case 5:
result = _context.sent;
if (!(result === false)) {
_context.next = 8;
break;
}
return _context.abrupt("return", false);
case 8:
delete file[LIST_IGNORE];
if (!(result === LIST_IGNORE)) {
_context.next = 12;
break;
}
Object.defineProperty(file, LIST_IGNORE, {
value: true,
configurable: true
});
return _context.abrupt("return", false);
case 12:
if (_typeof$q(result) === "object" && result) {
parsedFile = result;
}
case 13:
if (!transformFile) {
_context.next = 17;
break;
}
_context.next = 16;
return transformFile(parsedFile);
case 16:
parsedFile = _context.sent;
case 17:
return _context.abrupt("return", parsedFile);
case 18:
case "end":
return _context.stop();
}
}, _callee);
}));
};
var onBatchStart = function onBatchStart2(batchFileInfoList) {
var filteredFileInfoList = batchFileInfoList.filter(function(info) {
return !info.file[LIST_IGNORE];
});
if (!filteredFileInfoList.length) {
return;
}
var objectFileList = filteredFileInfoList.map(function(info) {
return file2Obj(info.file);
});
var newFileList = _toConsumableArray$c(mergedFileList);
objectFileList.forEach(function(fileObj) {
newFileList = updateFileList(fileObj, newFileList);
});
objectFileList.forEach(function(fileObj, index2) {
var triggerFileObj = fileObj;
if (!filteredFileInfoList[index2].parsedFile) {
var originFileObj = fileObj.originFileObj;
var clone;
try {
clone = new File([originFileObj], originFileObj.name, {
type: originFileObj.type
});
} catch (e2) {
clone = new Blob([originFileObj], {
type: originFileObj.type
});
clone.name = originFileObj.name;
clone.lastModifiedDate = new Date();
clone.lastModified = new Date().getTime();
}
clone.uid = fileObj.uid;
triggerFileObj = clone;
} else {
fileObj.status = "uploading";
}
onInternalChange(triggerFileObj, newFileList);
});
};
var onSuccess = function onSuccess2(response, file, xhr) {
try {
if (typeof response === "string") {
response = JSON.parse(response);
}
} catch (e2) {
}
if (!getFileItem(file, mergedFileList)) {
return;
}
var targetItem = file2Obj(file);
targetItem.status = "done";
targetItem.percent = 100;
targetItem.response = response;
targetItem.xhr = xhr;
var nextFileList = updateFileList(targetItem, mergedFileList);
onInternalChange(targetItem, nextFileList);
};
var onProgress = function onProgress2(e2, file) {
if (!getFileItem(file, mergedFileList)) {
return;
}
var targetItem = file2Obj(file);
targetItem.status = "uploading";
targetItem.percent = e2.percent;
var nextFileList = updateFileList(targetItem, mergedFileList);
onInternalChange(targetItem, nextFileList, e2);
};
var onError = function onError2(error, response, file) {
if (!getFileItem(file, mergedFileList)) {
return;
}
var targetItem = file2Obj(file);
targetItem.error = error;
targetItem.response = response;
targetItem.status = "error";
var nextFileList = updateFileList(targetItem, mergedFileList);
onInternalChange(targetItem, nextFileList);
};
var handleRemove = function handleRemove2(file) {
var currentFile;
Promise.resolve(typeof onRemove === "function" ? onRemove(file) : onRemove).then(function(ret) {
var _a;
if (ret === false) {
return;
}
var removedFileList = removeFileItem(file, mergedFileList);
if (removedFileList) {
currentFile = _extends$3(_extends$3({}, file), {
status: "removed"
});
mergedFileList === null || mergedFileList === void 0 ? void 0 : mergedFileList.forEach(function(item) {
var matchKey = currentFile.uid !== void 0 ? "uid" : "name";
if (item[matchKey] === currentFile[matchKey] && !Object.isFrozen(item)) {
item.status = "removed";
}
});
(_a = upload2.current) === null || _a === void 0 ? void 0 : _a.abort(currentFile);
onInternalChange(currentFile, removedFileList);
}
});
};
var onFileDrop = function onFileDrop2(e2) {
setDragState(e2.type);
if (e2.type === "drop") {
onDrop === null || onDrop === void 0 ? void 0 : onDrop(e2);
}
};
React__namespace.useImperativeHandle(ref, function() {
return {
onBatchStart,
onSuccess,
onProgress,
onError,
fileList: mergedFileList,
upload: upload2.current
};
});
var _React$useContext = React__namespace.useContext(ConfigContext$1), getPrefixCls = _React$useContext.getPrefixCls, direction = _React$useContext.direction;
var prefixCls = getPrefixCls("upload", customizePrefixCls);
var rcUploadProps = _extends$3(_extends$3({
onBatchStart,
onError,
onProgress,
onSuccess
}, props), {
data,
multiple,
action,
accept,
supportServerRender,
prefixCls,
disabled: mergedDisabled,
beforeUpload: mergedBeforeUpload,
onChange: void 0
});
delete rcUploadProps.className;
delete rcUploadProps.style;
if (!children || mergedDisabled) {
delete rcUploadProps.id;
}
var renderUploadList = function renderUploadList2(button, buttonVisible) {
return showUploadList ? /* @__PURE__ */ jsx(LocaleReceiver$1, {
componentName: "Upload",
defaultLocale: defaultLocale.Upload,
children: function(contextLocale) {
var _ref = typeof showUploadList === "boolean" ? {} : showUploadList, showRemoveIcon = _ref.showRemoveIcon, showPreviewIcon = _ref.showPreviewIcon, showDownloadIcon = _ref.showDownloadIcon, removeIcon = _ref.removeIcon, previewIcon = _ref.previewIcon, downloadIcon = _ref.downloadIcon;
return /* @__PURE__ */ jsx(UploadList$1, {
prefixCls,
listType,
items: mergedFileList,
previewFile,
onPreview,
onDownload,
onRemove: handleRemove,
showRemoveIcon: !mergedDisabled && showRemoveIcon,
showPreviewIcon,
showDownloadIcon,
removeIcon,
previewIcon,
downloadIcon,
iconRender,
locale: _extends$3(_extends$3({}, contextLocale), propLocale),
isImageUrl: isImageUrl2,
progress,
appendAction: button,
appendActionVisible: buttonVisible,
itemRender
});
}
}) : button;
};
if (type2 === "drag") {
var _classNames;
var dragCls = classnames(prefixCls, (_classNames = {}, _defineProperty$b(_classNames, "".concat(prefixCls, "-drag"), true), _defineProperty$b(_classNames, "".concat(prefixCls, "-drag-uploading"), mergedFileList.some(function(file) {
return file.status === "uploading";
})), _defineProperty$b(_classNames, "".concat(prefixCls, "-drag-hover"), dragState === "dragover"), _defineProperty$b(_classNames, "".concat(prefixCls, "-disabled"), mergedDisabled), _defineProperty$b(_classNames, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames), className);
return /* @__PURE__ */ jsxs("span", {
children: [/* @__PURE__ */ jsx("div", {
className: dragCls,
onDrop: onFileDrop,
onDragOver: onFileDrop,
onDragLeave: onFileDrop,
style: style2,
children: /* @__PURE__ */ jsx(Upload$2, {
...rcUploadProps,
ref: upload2,
className: "".concat(prefixCls, "-btn"),
children: /* @__PURE__ */ jsx("div", {
className: "".concat(prefixCls, "-drag-container"),
children
})
})
}), renderUploadList()]
});
}
var uploadButtonCls = classnames(prefixCls, (_classNames2 = {}, _defineProperty$b(_classNames2, "".concat(prefixCls, "-select"), true), _defineProperty$b(_classNames2, "".concat(prefixCls, "-select-").concat(listType), true), _defineProperty$b(_classNames2, "".concat(prefixCls, "-disabled"), mergedDisabled), _defineProperty$b(_classNames2, "".concat(prefixCls, "-rtl"), direction === "rtl"), _classNames2));
var renderUploadButton = function renderUploadButton2(uploadButtonStyle) {
return /* @__PURE__ */ jsx("div", {
className: uploadButtonCls,
style: uploadButtonStyle,
children: /* @__PURE__ */ jsx(Upload$2, {
...rcUploadProps,
ref: upload2
})
});
};
var uploadButton = renderUploadButton(children ? void 0 : {
display: "none"
});
if (listType === "picture-card") {
return /* @__PURE__ */ jsx("span", {
className: classnames("".concat(prefixCls, "-picture-card-wrapper"), className),
children: renderUploadList(uploadButton, !!children)
});
}
return /* @__PURE__ */ jsxs("span", {
className,
children: [uploadButton, renderUploadList()]
});
};
var Upload$1 = /* @__PURE__ */ React__namespace.forwardRef(InternalUpload);
const InternalUpload$1 = Upload$1;
var __rest$1 = globalThis && globalThis.__rest || function(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
};
var Dragger = /* @__PURE__ */ React__namespace.forwardRef(function(_a, ref) {
var style2 = _a.style, height = _a.height, restProps = __rest$1(_a, ["style", "height"]);
return /* @__PURE__ */ jsx(InternalUpload$1, {
ref,
...restProps,
type: "drag",
style: _extends$3(_extends$3({}, style2), {
height
})
});
});
const Dragger$1 = Dragger;
var Upload = InternalUpload$1;
Upload.Dragger = Dragger$1;
Upload.LIST_IGNORE = LIST_IGNORE;
const _Upload = Upload;
var monkeyWindow = window;
var GM_setValue = /* @__PURE__ */ (() => monkeyWindow.GM_setValue)();
var GM_setClipboard = /* @__PURE__ */ (() => monkeyWindow.GM_setClipboard)();
var GM_getValue = /* @__PURE__ */ (() => monkeyWindow.GM_getValue)();
const _default$o = "";
const index$X = "";
const index$W = "";
const index$V = "";
const index$U = "";
const index$T = "";
const index$S = "";
function __rest(s, e2) {
var t2 = {};
for (var p2 in s)
if (Object.prototype.hasOwnProperty.call(s, p2) && e2.indexOf(p2) < 0)
t2[p2] = s[p2];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s); i2 < p2.length; i2++) {
if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i2]))
t2[p2[i2]] = s[p2[i2]];
}
return t2;
}
function __awaiter(thisArg, _arguments, P, generator) {
function adopt(value) {
return value instanceof P ? value : new P(function(resolve) {
resolve(value);
});
}
return new (P || (P = Promise))(function(resolve, reject) {
function fulfilled(value) {
try {
step2(generator.next(value));
} catch (e2) {
reject(e2);
}
}
function rejected(value) {
try {
step2(generator["throw"](value));
} catch (e2) {
reject(e2);
}
}
function step2(result) {
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
}
step2((generator = generator.apply(thisArg, _arguments || [])).next());
});
}
typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
var e2 = new Error(message);
return e2.name = "SuppressedError", e2.error = error, e2.suppressed = suppressed, e2;
};
const createStoreImpl = (createState) => {
let state;
const listeners = /* @__PURE__ */ new Set();
const setState = (partial, replace) => {
const nextState = typeof partial === "function" ? partial(state) : partial;
if (!Object.is(nextState, state)) {
const previousState = state;
state = (replace != null ? replace : typeof nextState !== "object") ? nextState : Object.assign({}, state, nextState);
listeners.forEach((listener) => listener(state, previousState));
}
};
const getState = () => state;
const subscribe = (listener) => {
listeners.add(listener);
return () => listeners.delete(listener);
};
const destroy = () => {
if (({ "BASE_URL": "/", "MODE": "production", "DEV": false, "PROD": true } && "production") !== "production") {
console.warn(
"[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected."
);
}
listeners.clear();
};
const api2 = { setState, getState, subscribe, destroy };
state = createState(setState, getState, api2);
return api2;
};
const createStore$1 = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;
var withSelector = { exports: {} };
var withSelector_production_min = {};
var shim = { exports: {} };
var useSyncExternalStoreShim_production_min = {};
/**
* @license React
* use-sync-external-store-shim.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
var e = React__default.default;
function h$1(a, b2) {
return a === b2 && (0 !== a || 1 / a === 1 / b2) || a !== a && b2 !== b2;
}
var k$1 = "function" === typeof Object.is ? Object.is : h$1, l = e.useState, m = e.useEffect, n$1 = e.useLayoutEffect, p$1 = e.useDebugValue;
function q$1(a, b2) {
var d2 = b2(), f2 = l({ inst: { value: d2, getSnapshot: b2 } }), c2 = f2[0].inst, g2 = f2[1];
n$1(function() {
c2.value = d2;
c2.getSnapshot = b2;
r$1(c2) && g2({ inst: c2 });
}, [a, d2, b2]);
m(function() {
r$1(c2) && g2({ inst: c2 });
return a(function() {
r$1(c2) && g2({ inst: c2 });
});
}, [a]);
p$1(d2);
return d2;
}
function r$1(a) {
var b2 = a.getSnapshot;
a = a.value;
try {
var d2 = b2();
return !k$1(a, d2);
} catch (f2) {
return true;
}
}
function t$1(a, b2) {
return b2();
}
var u$1 = "undefined" === typeof window || "undefined" === typeof window.document || "undefined" === typeof window.document.createElement ? t$1 : q$1;
useSyncExternalStoreShim_production_min.useSyncExternalStore = void 0 !== e.useSyncExternalStore ? e.useSyncExternalStore : u$1;
(function(module2) {
{
module2.exports = useSyncExternalStoreShim_production_min;
}
})(shim);
/**
* @license React
* use-sync-external-store-shim/with-selector.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
var h = React__default.default, n = shim.exports;
function p(a, b2) {
return a === b2 && (0 !== a || 1 / a === 1 / b2) || a !== a && b2 !== b2;
}
var q = "function" === typeof Object.is ? Object.is : p, r = n.useSyncExternalStore, t = h.useRef, u = h.useEffect, v = h.useMemo, w = h.useDebugValue;
withSelector_production_min.useSyncExternalStoreWithSelector = function(a, b2, e2, l2, g2) {
var c2 = t(null);
if (null === c2.current) {
var f2 = { hasValue: false, value: null };
c2.current = f2;
} else
f2 = c2.current;
c2 = v(function() {
function a2(a3) {
if (!c3) {
c3 = true;
d3 = a3;
a3 = l2(a3);
if (void 0 !== g2 && f2.hasValue) {
var b3 = f2.value;
if (g2(b3, a3))
return k2 = b3;
}
return k2 = a3;
}
b3 = k2;
if (q(d3, a3))
return b3;
var e3 = l2(a3);
if (void 0 !== g2 && g2(b3, e3))
return b3;
d3 = a3;
return k2 = e3;
}
var c3 = false, d3, k2, m2 = void 0 === e2 ? null : e2;
return [function() {
return a2(b2());
}, null === m2 ? void 0 : function() {
return a2(m2());
}];
}, [b2, e2, l2, g2]);
var d2 = r(a, c2[0], c2[1]);
u(function() {
f2.hasValue = true;
f2.value = d2;
}, [d2]);
w(d2);
return d2;
};
(function(module2) {
{
module2.exports = withSelector_production_min;
}
})(withSelector);
const useSyncExternalStoreExports = /* @__PURE__ */ getDefaultExportFromCjs(withSelector.exports);
const { useSyncExternalStoreWithSelector } = useSyncExternalStoreExports;
function useStore(api2, selector = api2.getState, equalityFn) {
const slice2 = useSyncExternalStoreWithSelector(
api2.subscribe,
api2.getState,
api2.getServerState || api2.getState,
selector,
equalityFn
);
React$a.useDebugValue(slice2);
return slice2;
}
var freeGlobal = typeof global == "object" && global && global.Object === Object && global;
const freeGlobal$1 = freeGlobal;
var freeSelf = typeof self == "object" && self && self.Object === Object && self;
var root = freeGlobal$1 || freeSelf || Function("return this")();
const root$1 = root;
var Symbol$2 = root$1.Symbol;
const Symbol$3 = Symbol$2;
var objectProto$f = Object.prototype;
var hasOwnProperty$g = objectProto$f.hasOwnProperty;
var nativeObjectToString$1 = objectProto$f.toString;
var symToStringTag$1 = Symbol$3 ? Symbol$3.toStringTag : void 0;
function getRawTag(value) {
var isOwn = hasOwnProperty$g.call(value, symToStringTag$1), tag = value[symToStringTag$1];
try {
value[symToStringTag$1] = void 0;
var unmasked = true;
} catch (e2) {
}
var result = nativeObjectToString$1.call(value);
if (unmasked) {
if (isOwn) {
value[symToStringTag$1] = tag;
} else {
delete value[symToStringTag$1];
}
}
return result;
}
var objectProto$e = Object.prototype;
var nativeObjectToString = objectProto$e.toString;
function objectToString(value) {
return nativeObjectToString.call(value);
}
var nullTag = "[object Null]", undefinedTag = "[object Undefined]";
var symToStringTag = Symbol$3 ? Symbol$3.toStringTag : void 0;
function baseGetTag(value) {
if (value == null) {
return value === void 0 ? undefinedTag : nullTag;
}
return symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value);
}
function isObjectLike(value) {
return value != null && typeof value == "object";
}
var symbolTag$3 = "[object Symbol]";
function isSymbol$1(value) {
return typeof value == "symbol" || isObjectLike(value) && baseGetTag(value) == symbolTag$3;
}
function arrayMap(array2, iteratee) {
var index2 = -1, length = array2 == null ? 0 : array2.length, result = Array(length);
while (++index2 < length) {
result[index2] = iteratee(array2[index2], index2, array2);
}
return result;
}
var isArray$3 = Array.isArray;
const isArray$4 = isArray$3;
var INFINITY$1 = 1 / 0;
var symbolProto$2 = Symbol$3 ? Symbol$3.prototype : void 0, symbolToString = symbolProto$2 ? symbolProto$2.toString : void 0;
function baseToString(value) {
if (typeof value == "string") {
return value;
}
if (isArray$4(value)) {
return arrayMap(value, baseToString) + "";
}
if (isSymbol$1(value)) {
return symbolToString ? symbolToString.call(value) : "";
}
var result = value + "";
return result == "0" && 1 / value == -INFINITY$1 ? "-0" : result;
}
function isObject$6(value) {
var type2 = typeof value;
return value != null && (type2 == "object" || type2 == "function");
}
function identity$1(value) {
return value;
}
var asyncTag = "[object AsyncFunction]", funcTag$2 = "[object Function]", genTag$1 = "[object GeneratorFunction]", proxyTag = "[object Proxy]";
function isFunction$3(value) {
if (!isObject$6(value)) {
return false;
}
var tag = baseGetTag(value);
return tag == funcTag$2 || tag == genTag$1 || tag == asyncTag || tag == proxyTag;
}
var coreJsData = root$1["__core-js_shared__"];
const coreJsData$1 = coreJsData;
var maskSrcKey = function() {
var uid2 = /[^.]+$/.exec(coreJsData$1 && coreJsData$1.keys && coreJsData$1.keys.IE_PROTO || "");
return uid2 ? "Symbol(src)_1." + uid2 : "";
}();
function isMasked(func) {
return !!maskSrcKey && maskSrcKey in func;
}
var funcProto$1 = Function.prototype;
var funcToString$1 = funcProto$1.toString;
function toSource(func) {
if (func != null) {
try {
return funcToString$1.call(func);
} catch (e2) {
}
try {
return func + "";
} catch (e2) {
}
}
return "";
}
var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
var reIsHostCtor = /^\[object .+?Constructor\]$/;
var funcProto = Function.prototype, objectProto$d = Object.prototype;
var funcToString = funcProto.toString;
var hasOwnProperty$f = objectProto$d.hasOwnProperty;
var reIsNative = RegExp(
"^" + funcToString.call(hasOwnProperty$f).replace(reRegExpChar, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$"
);
function baseIsNative(value) {
if (!isObject$6(value) || isMasked(value)) {
return false;
}
var pattern2 = isFunction$3(value) ? reIsNative : reIsHostCtor;
return pattern2.test(toSource(value));
}
function getValue(object2, key2) {
return object2 == null ? void 0 : object2[key2];
}
function getNative(object2, key2) {
var value = getValue(object2, key2);
return baseIsNative(value) ? value : void 0;
}
var WeakMap$1 = getNative(root$1, "WeakMap");
const WeakMap$2 = WeakMap$1;
var objectCreate = Object.create;
var baseCreate = function() {
function object2() {
}
return function(proto2) {
if (!isObject$6(proto2)) {
return {};
}
if (objectCreate) {
return objectCreate(proto2);
}
object2.prototype = proto2;
var result = new object2();
object2.prototype = void 0;
return result;
};
}();
const baseCreate$1 = baseCreate;
function copyArray(source, array2) {
var index2 = -1, length = source.length;
array2 || (array2 = Array(length));
while (++index2 < length) {
array2[index2] = source[index2];
}
return array2;
}
var defineProperty$4 = function() {
try {
var func = getNative(Object, "defineProperty");
func({}, "", {});
return func;
} catch (e2) {
}
}();
const defineProperty$5 = defineProperty$4;
function arrayEach(array2, iteratee) {
var index2 = -1, length = array2 == null ? 0 : array2.length;
while (++index2 < length) {
if (iteratee(array2[index2], index2, array2) === false) {
break;
}
}
return array2;
}
var MAX_SAFE_INTEGER$1 = 9007199254740991;
var reIsUint = /^(?:0|[1-9]\d*)$/;
function isIndex(value, length) {
var type2 = typeof value;
length = length == null ? MAX_SAFE_INTEGER$1 : length;
return !!length && (type2 == "number" || type2 != "symbol" && reIsUint.test(value)) && (value > -1 && value % 1 == 0 && value < length);
}
function baseAssignValue(object2, key2, value) {
if (key2 == "__proto__" && defineProperty$5) {
defineProperty$5(object2, key2, {
"configurable": true,
"enumerable": true,
"value": value,
"writable": true
});
} else {
object2[key2] = value;
}
}
function eq(value, other) {
return value === other || value !== value && other !== other;
}
var objectProto$c = Object.prototype;
var hasOwnProperty$e = objectProto$c.hasOwnProperty;
function assignValue(object2, key2, value) {
var objValue = object2[key2];
if (!(hasOwnProperty$e.call(object2, key2) && eq(objValue, value)) || value === void 0 && !(key2 in object2)) {
baseAssignValue(object2, key2, value);
}
}
function copyObject(source, props, object2, customizer) {
var isNew = !object2;
object2 || (object2 = {});
var index2 = -1, length = props.length;
while (++index2 < length) {
var key2 = props[index2];
var newValue = customizer ? customizer(object2[key2], source[key2], key2, object2, source) : void 0;
if (newValue === void 0) {
newValue = source[key2];
}
if (isNew) {
baseAssignValue(object2, key2, newValue);
} else {
assignValue(object2, key2, newValue);
}
}
return object2;
}
var MAX_SAFE_INTEGER = 9007199254740991;
function isLength(value) {
return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
}
function isArrayLike(value) {
return value != null && isLength(value.length) && !isFunction$3(value);
}
function isIterateeCall(value, index2, object2) {
if (!isObject$6(object2)) {
return false;
}
var type2 = typeof index2;
if (type2 == "number" ? isArrayLike(object2) && isIndex(index2, object2.length) : type2 == "string" && index2 in object2) {
return eq(object2[index2], value);
}
return false;
}
var objectProto$b = Object.prototype;
function isPrototype(value) {
var Ctor = value && value.constructor, proto2 = typeof Ctor == "function" && Ctor.prototype || objectProto$b;
return value === proto2;
}
function baseTimes(n2, iteratee) {
var index2 = -1, result = Array(n2);
while (++index2 < n2) {
result[index2] = iteratee(index2);
}
return result;
}
var argsTag$3 = "[object Arguments]";
function baseIsArguments(value) {
return isObjectLike(value) && baseGetTag(value) == argsTag$3;
}
var objectProto$a = Object.prototype;
var hasOwnProperty$d = objectProto$a.hasOwnProperty;
var propertyIsEnumerable$1 = objectProto$a.propertyIsEnumerable;
var isArguments = baseIsArguments(function() {
return arguments;
}()) ? baseIsArguments : function(value) {
return isObjectLike(value) && hasOwnProperty$d.call(value, "callee") && !propertyIsEnumerable$1.call(value, "callee");
};
const isArguments$1 = isArguments;
function stubFalse() {
return false;
}
var freeExports$2 = typeof exports == "object" && exports && !exports.nodeType && exports;
var freeModule$2 = freeExports$2 && typeof module == "object" && module && !module.nodeType && module;
var moduleExports$2 = freeModule$2 && freeModule$2.exports === freeExports$2;
var Buffer$2 = moduleExports$2 ? root$1.Buffer : void 0;
var nativeIsBuffer = Buffer$2 ? Buffer$2.isBuffer : void 0;
var isBuffer$1 = nativeIsBuffer || stubFalse;
const isBuffer$2 = isBuffer$1;
var argsTag$2 = "[object Arguments]", arrayTag$2 = "[object Array]", boolTag$3 = "[object Boolean]", dateTag$3 = "[object Date]", errorTag$2 = "[object Error]", funcTag$1 = "[object Function]", mapTag$5 = "[object Map]", numberTag$3 = "[object Number]", objectTag$3 = "[object Object]", regexpTag$3 = "[object RegExp]", setTag$5 = "[object Set]", stringTag$3 = "[object String]", weakMapTag$2 = "[object WeakMap]";
var arrayBufferTag$3 = "[object ArrayBuffer]", dataViewTag$4 = "[object DataView]", float32Tag$2 = "[object Float32Array]", float64Tag$2 = "[object Float64Array]", int8Tag$2 = "[object Int8Array]", int16Tag$2 = "[object Int16Array]", int32Tag$2 = "[object Int32Array]", uint8Tag$2 = "[object Uint8Array]", uint8ClampedTag$2 = "[object Uint8ClampedArray]", uint16Tag$2 = "[object Uint16Array]", uint32Tag$2 = "[object Uint32Array]";
var typedArrayTags = {};
typedArrayTags[float32Tag$2] = typedArrayTags[float64Tag$2] = typedArrayTags[int8Tag$2] = typedArrayTags[int16Tag$2] = typedArrayTags[int32Tag$2] = typedArrayTags[uint8Tag$2] = typedArrayTags[uint8ClampedTag$2] = typedArrayTags[uint16Tag$2] = typedArrayTags[uint32Tag$2] = true;
typedArrayTags[argsTag$2] = typedArrayTags[arrayTag$2] = typedArrayTags[arrayBufferTag$3] = typedArrayTags[boolTag$3] = typedArrayTags[dataViewTag$4] = typedArrayTags[dateTag$3] = typedArrayTags[errorTag$2] = typedArrayTags[funcTag$1] = typedArrayTags[mapTag$5] = typedArrayTags[numberTag$3] = typedArrayTags[objectTag$3] = typedArrayTags[regexpTag$3] = typedArrayTags[setTag$5] = typedArrayTags[stringTag$3] = typedArrayTags[weakMapTag$2] = false;
function baseIsTypedArray(value) {
return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
}
function baseUnary(func) {
return function(value) {
return func(value);
};
}
var freeExports$1 = typeof exports == "object" && exports && !exports.nodeType && exports;
var freeModule$1 = freeExports$1 && typeof module == "object" && module && !module.nodeType && module;
var moduleExports$1 = freeModule$1 && freeModule$1.exports === freeExports$1;
var freeProcess = moduleExports$1 && freeGlobal$1.process;
var nodeUtil = function() {
try {
var types2 = freeModule$1 && freeModule$1.require && freeModule$1.require("util").types;
if (types2) {
return types2;
}
return freeProcess && freeProcess.binding && freeProcess.binding("util");
} catch (e2) {
}
}();
const nodeUtil$1 = nodeUtil;
var nodeIsTypedArray = nodeUtil$1 && nodeUtil$1.isTypedArray;
var isTypedArray$1 = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
const isTypedArray$2 = isTypedArray$1;
var objectProto$9 = Object.prototype;
var hasOwnProperty$c = objectProto$9.hasOwnProperty;
function arrayLikeKeys(value, inherited) {
var isArr = isArray$4(value), isArg = !isArr && isArguments$1(value), isBuff = !isArr && !isArg && isBuffer$2(value), isType = !isArr && !isArg && !isBuff && isTypedArray$2(value), skipIndexes = isArr || isArg || isBuff || isType, result = skipIndexes ? baseTimes(value.length, String) : [], length = result.length;
for (var key2 in value) {
if ((inherited || hasOwnProperty$c.call(value, key2)) && !(skipIndexes && (key2 == "length" || isBuff && (key2 == "offset" || key2 == "parent") || isType && (key2 == "buffer" || key2 == "byteLength" || key2 == "byteOffset") || isIndex(key2, length)))) {
result.push(key2);
}
}
return result;
}
function overArg(func, transform) {
return function(arg) {
return func(transform(arg));
};
}
var nativeKeys = overArg(Object.keys, Object);
const nativeKeys$1 = nativeKeys;
var objectProto$8 = Object.prototype;
var hasOwnProperty$b = objectProto$8.hasOwnProperty;
function baseKeys(object2) {
if (!isPrototype(object2)) {
return nativeKeys$1(object2);
}
var result = [];
for (var key2 in Object(object2)) {
if (hasOwnProperty$b.call(object2, key2) && key2 != "constructor") {
result.push(key2);
}
}
return result;
}
function keys(object2) {
return isArrayLike(object2) ? arrayLikeKeys(object2) : baseKeys(object2);
}
function nativeKeysIn(object2) {
var result = [];
if (object2 != null) {
for (var key2 in Object(object2)) {
result.push(key2);
}
}
return result;
}
var objectProto$7 = Object.prototype;
var hasOwnProperty$a = objectProto$7.hasOwnProperty;
function baseKeysIn(object2) {
if (!isObject$6(object2)) {
return nativeKeysIn(object2);
}
var isProto = isPrototype(object2), result = [];
for (var key2 in object2) {
if (!(key2 == "constructor" && (isProto || !hasOwnProperty$a.call(object2, key2)))) {
result.push(key2);
}
}
return result;
}
function keysIn(object2) {
return isArrayLike(object2) ? arrayLikeKeys(object2, true) : baseKeysIn(object2);
}
var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, reIsPlainProp = /^\w*$/;
function isKey(value, object2) {
if (isArray$4(value)) {
return false;
}
var type2 = typeof value;
if (type2 == "number" || type2 == "symbol" || type2 == "boolean" || value == null || isSymbol$1(value)) {
return true;
}
return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || object2 != null && value in Object(object2);
}
var nativeCreate = getNative(Object, "create");
const nativeCreate$1 = nativeCreate;
function hashClear() {
this.__data__ = nativeCreate$1 ? nativeCreate$1(null) : {};
this.size = 0;
}
function hashDelete(key2) {
var result = this.has(key2) && delete this.__data__[key2];
this.size -= result ? 1 : 0;
return result;
}
var HASH_UNDEFINED$2 = "__lodash_hash_undefined__";
var objectProto$6 = Object.prototype;
var hasOwnProperty$9 = objectProto$6.hasOwnProperty;
function hashGet(key2) {
var data = this.__data__;
if (nativeCreate$1) {
var result = data[key2];
return result === HASH_UNDEFINED$2 ? void 0 : result;
}
return hasOwnProperty$9.call(data, key2) ? data[key2] : void 0;
}
var objectProto$5 = Object.prototype;
var hasOwnProperty$8 = objectProto$5.hasOwnProperty;
function hashHas(key2) {
var data = this.__data__;
return nativeCreate$1 ? data[key2] !== void 0 : hasOwnProperty$8.call(data, key2);
}
var HASH_UNDEFINED$1 = "__lodash_hash_undefined__";
function hashSet(key2, value) {
var data = this.__data__;
this.size += this.has(key2) ? 0 : 1;
data[key2] = nativeCreate$1 && value === void 0 ? HASH_UNDEFINED$1 : value;
return this;
}
function Hash(entries) {
var index2 = -1, length = entries == null ? 0 : entries.length;
this.clear();
while (++index2 < length) {
var entry = entries[index2];
this.set(entry[0], entry[1]);
}
}
Hash.prototype.clear = hashClear;
Hash.prototype["delete"] = hashDelete;
Hash.prototype.get = hashGet;
Hash.prototype.has = hashHas;
Hash.prototype.set = hashSet;
function listCacheClear() {
this.__data__ = [];
this.size = 0;
}
function assocIndexOf(array2, key2) {
var length = array2.length;
while (length--) {
if (eq(array2[length][0], key2)) {
return length;
}
}
return -1;
}
var arrayProto = Array.prototype;
var splice = arrayProto.splice;
function listCacheDelete(key2) {
var data = this.__data__, index2 = assocIndexOf(data, key2);
if (index2 < 0) {
return false;
}
var lastIndex = data.length - 1;
if (index2 == lastIndex) {
data.pop();
} else {
splice.call(data, index2, 1);
}
--this.size;
return true;
}
function listCacheGet(key2) {
var data = this.__data__, index2 = assocIndexOf(data, key2);
return index2 < 0 ? void 0 : data[index2][1];
}
function listCacheHas(key2) {
return assocIndexOf(this.__data__, key2) > -1;
}
function listCacheSet(key2, value) {
var data = this.__data__, index2 = assocIndexOf(data, key2);
if (index2 < 0) {
++this.size;
data.push([key2, value]);
} else {
data[index2][1] = value;
}
return this;
}
function ListCache(entries) {
var index2 = -1, length = entries == null ? 0 : entries.length;
this.clear();
while (++index2 < length) {
var entry = entries[index2];
this.set(entry[0], entry[1]);
}
}
ListCache.prototype.clear = listCacheClear;
ListCache.prototype["delete"] = listCacheDelete;
ListCache.prototype.get = listCacheGet;
ListCache.prototype.has = listCacheHas;
ListCache.prototype.set = listCacheSet;
var Map$1 = getNative(root$1, "Map");
const Map$2 = Map$1;
function mapCacheClear() {
this.size = 0;
this.__data__ = {
"hash": new Hash(),
"map": new (Map$2 || ListCache)(),
"string": new Hash()
};
}
function isKeyable(value) {
var type2 = typeof value;
return type2 == "string" || type2 == "number" || type2 == "symbol" || type2 == "boolean" ? value !== "__proto__" : value === null;
}
function getMapData(map, key2) {
var data = map.__data__;
return isKeyable(key2) ? data[typeof key2 == "string" ? "string" : "hash"] : data.map;
}
function mapCacheDelete(key2) {
var result = getMapData(this, key2)["delete"](key2);
this.size -= result ? 1 : 0;
return result;
}
function mapCacheGet(key2) {
return getMapData(this, key2).get(key2);
}
function mapCacheHas(key2) {
return getMapData(this, key2).has(key2);
}
function mapCacheSet(key2, value) {
var data = getMapData(this, key2), size = data.size;
data.set(key2, value);
this.size += data.size == size ? 0 : 1;
return this;
}
function MapCache(entries) {
var index2 = -1, length = entries == null ? 0 : entries.length;
this.clear();
while (++index2 < length) {
var entry = entries[index2];
this.set(entry[0], entry[1]);
}
}
MapCache.prototype.clear = mapCacheClear;
MapCache.prototype["delete"] = mapCacheDelete;
MapCache.prototype.get = mapCacheGet;
MapCache.prototype.has = mapCacheHas;
MapCache.prototype.set = mapCacheSet;
var FUNC_ERROR_TEXT$1 = "Expected a function";
function memoize(func, resolver) {
if (typeof func != "function" || resolver != null && typeof resolver != "function") {
throw new TypeError(FUNC_ERROR_TEXT$1);
}
var memoized = function() {
var args = arguments, key2 = resolver ? resolver.apply(this, args) : args[0], cache = memoized.cache;
if (cache.has(key2)) {
return cache.get(key2);
}
var result = func.apply(this, args);
memoized.cache = cache.set(key2, result) || cache;
return result;
};
memoized.cache = new (memoize.Cache || MapCache)();
return memoized;
}
memoize.Cache = MapCache;
var MAX_MEMOIZE_SIZE = 500;
function memoizeCapped(func) {
var result = memoize(func, function(key2) {
if (cache.size === MAX_MEMOIZE_SIZE) {
cache.clear();
}
return key2;
});
var cache = result.cache;
return result;
}
var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
var reEscapeChar = /\\(\\)?/g;
var stringToPath = memoizeCapped(function(string2) {
var result = [];
if (string2.charCodeAt(0) === 46) {
result.push("");
}
string2.replace(rePropName, function(match2, number2, quote, subString) {
result.push(quote ? subString.replace(reEscapeChar, "$1") : number2 || match2);
});
return result;
});
const stringToPath$1 = stringToPath;
function toString$3(value) {
return value == null ? "" : baseToString(value);
}
function castPath(value, object2) {
if (isArray$4(value)) {
return value;
}
return isKey(value, object2) ? [value] : stringToPath$1(toString$3(value));
}
var INFINITY = 1 / 0;
function toKey(value) {
if (typeof value == "string" || isSymbol$1(value)) {
return value;
}
var result = value + "";
return result == "0" && 1 / value == -INFINITY ? "-0" : result;
}
function baseGet(object2, path2) {
path2 = castPath(path2, object2);
var index2 = 0, length = path2.length;
while (object2 != null && index2 < length) {
object2 = object2[toKey(path2[index2++])];
}
return index2 && index2 == length ? object2 : void 0;
}
function get(object2, path2, defaultValue) {
var result = object2 == null ? void 0 : baseGet(object2, path2);
return result === void 0 ? defaultValue : result;
}
function arrayPush(array2, values) {
var index2 = -1, length = values.length, offset2 = array2.length;
while (++index2 < length) {
array2[offset2 + index2] = values[index2];
}
return array2;
}
var getPrototype = overArg(Object.getPrototypeOf, Object);
const getPrototype$1 = getPrototype;
function baseSlice(array2, start, end) {
var index2 = -1, length = array2.length;
if (start < 0) {
start = -start > length ? 0 : length + start;
}
end = end > length ? length : end;
if (end < 0) {
end += length;
}
length = start > end ? 0 : end - start >>> 0;
start >>>= 0;
var result = Array(length);
while (++index2 < length) {
result[index2] = array2[index2 + start];
}
return result;
}
function stackClear() {
this.__data__ = new ListCache();
this.size = 0;
}
function stackDelete(key2) {
var data = this.__data__, result = data["delete"](key2);
this.size = data.size;
return result;
}
function stackGet(key2) {
return this.__data__.get(key2);
}
function stackHas(key2) {
return this.__data__.has(key2);
}
var LARGE_ARRAY_SIZE = 200;
function stackSet(key2, value) {
var data = this.__data__;
if (data instanceof ListCache) {
var pairs = data.__data__;
if (!Map$2 || pairs.length < LARGE_ARRAY_SIZE - 1) {
pairs.push([key2, value]);
this.size = ++data.size;
return this;
}
data = this.__data__ = new MapCache(pairs);
}
data.set(key2, value);
this.size = data.size;
return this;
}
function Stack(entries) {
var data = this.__data__ = new ListCache(entries);
this.size = data.size;
}
Stack.prototype.clear = stackClear;
Stack.prototype["delete"] = stackDelete;
Stack.prototype.get = stackGet;
Stack.prototype.has = stackHas;
Stack.prototype.set = stackSet;
function baseAssign(object2, source) {
return object2 && copyObject(source, keys(source), object2);
}
function baseAssignIn(object2, source) {
return object2 && copyObject(source, keysIn(source), object2);
}
var freeExports = typeof exports == "object" && exports && !exports.nodeType && exports;
var freeModule = freeExports && typeof module == "object" && module && !module.nodeType && module;
var moduleExports = freeModule && freeModule.exports === freeExports;
var Buffer$1 = moduleExports ? root$1.Buffer : void 0, allocUnsafe = Buffer$1 ? Buffer$1.allocUnsafe : void 0;
function cloneBuffer(buffer2, isDeep) {
if (isDeep) {
return buffer2.slice();
}
var length = buffer2.length, result = allocUnsafe ? allocUnsafe(length) : new buffer2.constructor(length);
buffer2.copy(result);
return result;
}
function arrayFilter(array2, predicate) {
var index2 = -1, length = array2 == null ? 0 : array2.length, resIndex = 0, result = [];
while (++index2 < length) {
var value = array2[index2];
if (predicate(value, index2, array2)) {
result[resIndex++] = value;
}
}
return result;
}
function stubArray() {
return [];
}
var objectProto$4 = Object.prototype;
var propertyIsEnumerable = objectProto$4.propertyIsEnumerable;
var nativeGetSymbols$1 = Object.getOwnPropertySymbols;
var getSymbols = !nativeGetSymbols$1 ? stubArray : function(object2) {
if (object2 == null) {
return [];
}
object2 = Object(object2);
return arrayFilter(nativeGetSymbols$1(object2), function(symbol2) {
return propertyIsEnumerable.call(object2, symbol2);
});
};
const getSymbols$1 = getSymbols;
function copySymbols(source, object2) {
return copyObject(source, getSymbols$1(source), object2);
}
var nativeGetSymbols = Object.getOwnPropertySymbols;
var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object2) {
var result = [];
while (object2) {
arrayPush(result, getSymbols$1(object2));
object2 = getPrototype$1(object2);
}
return result;
};
const getSymbolsIn$1 = getSymbolsIn;
function copySymbolsIn(source, object2) {
return copyObject(source, getSymbolsIn$1(source), object2);
}
function baseGetAllKeys(object2, keysFunc, symbolsFunc) {
var result = keysFunc(object2);
return isArray$4(object2) ? result : arrayPush(result, symbolsFunc(object2));
}
function getAllKeys(object2) {
return baseGetAllKeys(object2, keys, getSymbols$1);
}
function getAllKeysIn(object2) {
return baseGetAllKeys(object2, keysIn, getSymbolsIn$1);
}
var DataView = getNative(root$1, "DataView");
const DataView$1 = DataView;
var Promise$1 = getNative(root$1, "Promise");
const Promise$2 = Promise$1;
var Set$1 = getNative(root$1, "Set");
const Set$2 = Set$1;
var mapTag$4 = "[object Map]", objectTag$2 = "[object Object]", promiseTag = "[object Promise]", setTag$4 = "[object Set]", weakMapTag$1 = "[object WeakMap]";
var dataViewTag$3 = "[object DataView]";
var dataViewCtorString = toSource(DataView$1), mapCtorString = toSource(Map$2), promiseCtorString = toSource(Promise$2), setCtorString = toSource(Set$2), weakMapCtorString = toSource(WeakMap$2);
var getTag = baseGetTag;
if (DataView$1 && getTag(new DataView$1(new ArrayBuffer(1))) != dataViewTag$3 || Map$2 && getTag(new Map$2()) != mapTag$4 || Promise$2 && getTag(Promise$2.resolve()) != promiseTag || Set$2 && getTag(new Set$2()) != setTag$4 || WeakMap$2 && getTag(new WeakMap$2()) != weakMapTag$1) {
getTag = function(value) {
var result = baseGetTag(value), Ctor = result == objectTag$2 ? value.constructor : void 0, ctorString = Ctor ? toSource(Ctor) : "";
if (ctorString) {
switch (ctorString) {
case dataViewCtorString:
return dataViewTag$3;
case mapCtorString:
return mapTag$4;
case promiseCtorString:
return promiseTag;
case setCtorString:
return setTag$4;
case weakMapCtorString:
return weakMapTag$1;
}
}
return result;
};
}
const getTag$1 = getTag;
var objectProto$3 = Object.prototype;
var hasOwnProperty$7 = objectProto$3.hasOwnProperty;
function initCloneArray(array2) {
var length = array2.length, result = new array2.constructor(length);
if (length && typeof array2[0] == "string" && hasOwnProperty$7.call(array2, "index")) {
result.index = array2.index;
result.input = array2.input;
}
return result;
}
var Uint8Array$1 = root$1.Uint8Array;
const Uint8Array$2 = Uint8Array$1;
function cloneArrayBuffer(arrayBuffer) {
var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
new Uint8Array$2(result).set(new Uint8Array$2(arrayBuffer));
return result;
}
function cloneDataView(dataView, isDeep) {
var buffer2 = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
return new dataView.constructor(buffer2, dataView.byteOffset, dataView.byteLength);
}
var reFlags = /\w*$/;
function cloneRegExp(regexp2) {
var result = new regexp2.constructor(regexp2.source, reFlags.exec(regexp2));
result.lastIndex = regexp2.lastIndex;
return result;
}
var symbolProto$1 = Symbol$3 ? Symbol$3.prototype : void 0, symbolValueOf$1 = symbolProto$1 ? symbolProto$1.valueOf : void 0;
function cloneSymbol(symbol2) {
return symbolValueOf$1 ? Object(symbolValueOf$1.call(symbol2)) : {};
}
function cloneTypedArray(typedArray, isDeep) {
var buffer2 = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
return new typedArray.constructor(buffer2, typedArray.byteOffset, typedArray.length);
}
var boolTag$2 = "[object Boolean]", dateTag$2 = "[object Date]", mapTag$3 = "[object Map]", numberTag$2 = "[object Number]", regexpTag$2 = "[object RegExp]", setTag$3 = "[object Set]", stringTag$2 = "[object String]", symbolTag$2 = "[object Symbol]";
var arrayBufferTag$2 = "[object ArrayBuffer]", dataViewTag$2 = "[object DataView]", float32Tag$1 = "[object Float32Array]", float64Tag$1 = "[object Float64Array]", int8Tag$1 = "[object Int8Array]", int16Tag$1 = "[object Int16Array]", int32Tag$1 = "[object Int32Array]", uint8Tag$1 = "[object Uint8Array]", uint8ClampedTag$1 = "[object Uint8ClampedArray]", uint16Tag$1 = "[object Uint16Array]", uint32Tag$1 = "[object Uint32Array]";
function initCloneByTag(object2, tag, isDeep) {
var Ctor = object2.constructor;
switch (tag) {
case arrayBufferTag$2:
return cloneArrayBuffer(object2);
case boolTag$2:
case dateTag$2:
return new Ctor(+object2);
case dataViewTag$2:
return cloneDataView(object2, isDeep);
case float32Tag$1:
case float64Tag$1:
case int8Tag$1:
case int16Tag$1:
case int32Tag$1:
case uint8Tag$1:
case uint8ClampedTag$1:
case uint16Tag$1:
case uint32Tag$1:
return cloneTypedArray(object2, isDeep);
case mapTag$3:
return new Ctor();
case numberTag$2:
case stringTag$2:
return new Ctor(object2);
case regexpTag$2:
return cloneRegExp(object2);
case setTag$3:
return new Ctor();
case symbolTag$2:
return cloneSymbol(object2);
}
}
function initCloneObject(object2) {
return typeof object2.constructor == "function" && !isPrototype(object2) ? baseCreate$1(getPrototype$1(object2)) : {};
}
var mapTag$2 = "[object Map]";
function baseIsMap(value) {
return isObjectLike(value) && getTag$1(value) == mapTag$2;
}
var nodeIsMap = nodeUtil$1 && nodeUtil$1.isMap;
var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
const isMap$1 = isMap;
var setTag$2 = "[object Set]";
function baseIsSet(value) {
return isObjectLike(value) && getTag$1(value) == setTag$2;
}
var nodeIsSet = nodeUtil$1 && nodeUtil$1.isSet;
var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
const isSet$1 = isSet;
var CLONE_DEEP_FLAG$1 = 1, CLONE_FLAT_FLAG = 2, CLONE_SYMBOLS_FLAG$1 = 4;
var argsTag$1 = "[object Arguments]", arrayTag$1 = "[object Array]", boolTag$1 = "[object Boolean]", dateTag$1 = "[object Date]", errorTag$1 = "[object Error]", funcTag = "[object Function]", genTag = "[object GeneratorFunction]", mapTag$1 = "[object Map]", numberTag$1 = "[object Number]", objectTag$1 = "[object Object]", regexpTag$1 = "[object RegExp]", setTag$1 = "[object Set]", stringTag$1 = "[object String]", symbolTag$1 = "[object Symbol]", weakMapTag = "[object WeakMap]";
var arrayBufferTag$1 = "[object ArrayBuffer]", dataViewTag$1 = "[object DataView]", float32Tag = "[object Float32Array]", float64Tag = "[object Float64Array]", int8Tag = "[object Int8Array]", int16Tag = "[object Int16Array]", int32Tag = "[object Int32Array]", uint8Tag = "[object Uint8Array]", uint8ClampedTag = "[object Uint8ClampedArray]", uint16Tag = "[object Uint16Array]", uint32Tag = "[object Uint32Array]";
var cloneableTags = {};
cloneableTags[argsTag$1] = cloneableTags[arrayTag$1] = cloneableTags[arrayBufferTag$1] = cloneableTags[dataViewTag$1] = cloneableTags[boolTag$1] = cloneableTags[dateTag$1] = cloneableTags[float32Tag] = cloneableTags[float64Tag] = cloneableTags[int8Tag] = cloneableTags[int16Tag] = cloneableTags[int32Tag] = cloneableTags[mapTag$1] = cloneableTags[numberTag$1] = cloneableTags[objectTag$1] = cloneableTags[regexpTag$1] = cloneableTags[setTag$1] = cloneableTags[stringTag$1] = cloneableTags[symbolTag$1] = cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
cloneableTags[errorTag$1] = cloneableTags[funcTag] = cloneableTags[weakMapTag] = false;
function baseClone(value, bitmask, customizer, key2, object2, stack) {
var result, isDeep = bitmask & CLONE_DEEP_FLAG$1, isFlat = bitmask & CLONE_FLAT_FLAG, isFull = bitmask & CLONE_SYMBOLS_FLAG$1;
if (customizer) {
result = object2 ? customizer(value, key2, object2, stack) : customizer(value);
}
if (result !== void 0) {
return result;
}
if (!isObject$6(value)) {
return value;
}
var isArr = isArray$4(value);
if (isArr) {
result = initCloneArray(value);
if (!isDeep) {
return copyArray(value, result);
}
} else {
var tag = getTag$1(value), isFunc = tag == funcTag || tag == genTag;
if (isBuffer$2(value)) {
return cloneBuffer(value, isDeep);
}
if (tag == objectTag$1 || tag == argsTag$1 || isFunc && !object2) {
result = isFlat || isFunc ? {} : initCloneObject(value);
if (!isDeep) {
return isFlat ? copySymbolsIn(value, baseAssignIn(result, value)) : copySymbols(value, baseAssign(result, value));
}
} else {
if (!cloneableTags[tag]) {
return object2 ? value : {};
}
result = initCloneByTag(value, tag, isDeep);
}
}
stack || (stack = new Stack());
var stacked = stack.get(value);
if (stacked) {
return stacked;
}
stack.set(value, result);
if (isSet$1(value)) {
value.forEach(function(subValue) {
result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
});
} else if (isMap$1(value)) {
value.forEach(function(subValue, key3) {
result.set(key3, baseClone(subValue, bitmask, customizer, key3, value, stack));
});
}
var keysFunc = isFull ? isFlat ? getAllKeysIn : getAllKeys : isFlat ? keysIn : keys;
var props = isArr ? void 0 : keysFunc(value);
arrayEach(props || value, function(subValue, key3) {
if (props) {
key3 = subValue;
subValue = value[key3];
}
assignValue(result, key3, baseClone(subValue, bitmask, customizer, key3, value, stack));
});
return result;
}
var CLONE_DEEP_FLAG = 1, CLONE_SYMBOLS_FLAG = 4;
function cloneDeep(value) {
return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);
}
var HASH_UNDEFINED = "__lodash_hash_undefined__";
function setCacheAdd(value) {
this.__data__.set(value, HASH_UNDEFINED);
return this;
}
function setCacheHas(value) {
return this.__data__.has(value);
}
function SetCache(values) {
var index2 = -1, length = values == null ? 0 : values.length;
this.__data__ = new MapCache();
while (++index2 < length) {
this.add(values[index2]);
}
}
SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
SetCache.prototype.has = setCacheHas;
function arraySome(array2, predicate) {
var index2 = -1, length = array2 == null ? 0 : array2.length;
while (++index2 < length) {
if (predicate(array2[index2], index2, array2)) {
return true;
}
}
return false;
}
function cacheHas(cache, key2) {
return cache.has(key2);
}
var COMPARE_PARTIAL_FLAG$5 = 1, COMPARE_UNORDERED_FLAG$3 = 2;
function equalArrays(array2, other, bitmask, customizer, equalFunc, stack) {
var isPartial = bitmask & COMPARE_PARTIAL_FLAG$5, arrLength = array2.length, othLength = other.length;
if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
return false;
}
var arrStacked = stack.get(array2);
var othStacked = stack.get(other);
if (arrStacked && othStacked) {
return arrStacked == other && othStacked == array2;
}
var index2 = -1, result = true, seen = bitmask & COMPARE_UNORDERED_FLAG$3 ? new SetCache() : void 0;
stack.set(array2, other);
stack.set(other, array2);
while (++index2 < arrLength) {
var arrValue = array2[index2], othValue = other[index2];
if (customizer) {
var compared = isPartial ? customizer(othValue, arrValue, index2, other, array2, stack) : customizer(arrValue, othValue, index2, array2, other, stack);
}
if (compared !== void 0) {
if (compared) {
continue;
}
result = false;
break;
}
if (seen) {
if (!arraySome(other, function(othValue2, othIndex) {
if (!cacheHas(seen, othIndex) && (arrValue === othValue2 || equalFunc(arrValue, othValue2, bitmask, customizer, stack))) {
return seen.push(othIndex);
}
})) {
result = false;
break;
}
} else if (!(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
result = false;
break;
}
}
stack["delete"](array2);
stack["delete"](other);
return result;
}
function mapToArray(map) {
var index2 = -1, result = Array(map.size);
map.forEach(function(value, key2) {
result[++index2] = [key2, value];
});
return result;
}
function setToArray(set2) {
var index2 = -1, result = Array(set2.size);
set2.forEach(function(value) {
result[++index2] = value;
});
return result;
}
var COMPARE_PARTIAL_FLAG$4 = 1, COMPARE_UNORDERED_FLAG$2 = 2;
var boolTag = "[object Boolean]", dateTag = "[object Date]", errorTag = "[object Error]", mapTag = "[object Map]", numberTag = "[object Number]", regexpTag = "[object RegExp]", setTag = "[object Set]", stringTag = "[object String]", symbolTag = "[object Symbol]";
var arrayBufferTag = "[object ArrayBuffer]", dataViewTag = "[object DataView]";
var symbolProto = Symbol$3 ? Symbol$3.prototype : void 0, symbolValueOf = symbolProto ? symbolProto.valueOf : void 0;
function equalByTag(object2, other, tag, bitmask, customizer, equalFunc, stack) {
switch (tag) {
case dataViewTag:
if (object2.byteLength != other.byteLength || object2.byteOffset != other.byteOffset) {
return false;
}
object2 = object2.buffer;
other = other.buffer;
case arrayBufferTag:
if (object2.byteLength != other.byteLength || !equalFunc(new Uint8Array$2(object2), new Uint8Array$2(other))) {
return false;
}
return true;
case boolTag:
case dateTag:
case numberTag:
return eq(+object2, +other);
case errorTag:
return object2.name == other.name && object2.message == other.message;
case regexpTag:
case stringTag:
return object2 == other + "";
case mapTag:
var convert2 = mapToArray;
case setTag:
var isPartial = bitmask & COMPARE_PARTIAL_FLAG$4;
convert2 || (convert2 = setToArray);
if (object2.size != other.size && !isPartial) {
return false;
}
var stacked = stack.get(object2);
if (stacked) {
return stacked == other;
}
bitmask |= COMPARE_UNORDERED_FLAG$2;
stack.set(object2, other);
var result = equalArrays(convert2(object2), convert2(other), bitmask, customizer, equalFunc, stack);
stack["delete"](object2);
return result;
case symbolTag:
if (symbolValueOf) {
return symbolValueOf.call(object2) == symbolValueOf.call(other);
}
}
return false;
}
var COMPARE_PARTIAL_FLAG$3 = 1;
var objectProto$2 = Object.prototype;
var hasOwnProperty$6 = objectProto$2.hasOwnProperty;
function equalObjects(object2, other, bitmask, customizer, equalFunc, stack) {
var isPartial = bitmask & COMPARE_PARTIAL_FLAG$3, objProps = getAllKeys(object2), objLength = objProps.length, othProps = getAllKeys(other), othLength = othProps.length;
if (objLength != othLength && !isPartial) {
return false;
}
var index2 = objLength;
while (index2--) {
var key2 = objProps[index2];
if (!(isPartial ? key2 in other : hasOwnProperty$6.call(other, key2))) {
return false;
}
}
var objStacked = stack.get(object2);
var othStacked = stack.get(other);
if (objStacked && othStacked) {
return objStacked == other && othStacked == object2;
}
var result = true;
stack.set(object2, other);
stack.set(other, object2);
var skipCtor = isPartial;
while (++index2 < objLength) {
key2 = objProps[index2];
var objValue = object2[key2], othValue = other[key2];
if (customizer) {
var compared = isPartial ? customizer(othValue, objValue, key2, other, object2, stack) : customizer(objValue, othValue, key2, object2, other, stack);
}
if (!(compared === void 0 ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared)) {
result = false;
break;
}
skipCtor || (skipCtor = key2 == "constructor");
}
if (result && !skipCtor) {
var objCtor = object2.constructor, othCtor = other.constructor;
if (objCtor != othCtor && ("constructor" in object2 && "constructor" in other) && !(typeof objCtor == "function" && objCtor instanceof objCtor && typeof othCtor == "function" && othCtor instanceof othCtor)) {
result = false;
}
}
stack["delete"](object2);
stack["delete"](other);
return result;
}
var COMPARE_PARTIAL_FLAG$2 = 1;
var argsTag = "[object Arguments]", arrayTag = "[object Array]", objectTag = "[object Object]";
var objectProto$1 = Object.prototype;
var hasOwnProperty$5 = objectProto$1.hasOwnProperty;
function baseIsEqualDeep(object2, other, bitmask, customizer, equalFunc, stack) {
var objIsArr = isArray$4(object2), othIsArr = isArray$4(other), objTag = objIsArr ? arrayTag : getTag$1(object2), othTag = othIsArr ? arrayTag : getTag$1(other);
objTag = objTag == argsTag ? objectTag : objTag;
othTag = othTag == argsTag ? objectTag : othTag;
var objIsObj = objTag == objectTag, othIsObj = othTag == objectTag, isSameTag = objTag == othTag;
if (isSameTag && isBuffer$2(object2)) {
if (!isBuffer$2(other)) {
return false;
}
objIsArr = true;
objIsObj = false;
}
if (isSameTag && !objIsObj) {
stack || (stack = new Stack());
return objIsArr || isTypedArray$2(object2) ? equalArrays(object2, other, bitmask, customizer, equalFunc, stack) : equalByTag(object2, other, objTag, bitmask, customizer, equalFunc, stack);
}
if (!(bitmask & COMPARE_PARTIAL_FLAG$2)) {
var objIsWrapped = objIsObj && hasOwnProperty$5.call(object2, "__wrapped__"), othIsWrapped = othIsObj && hasOwnProperty$5.call(other, "__wrapped__");
if (objIsWrapped || othIsWrapped) {
var objUnwrapped = objIsWrapped ? object2.value() : object2, othUnwrapped = othIsWrapped ? other.value() : other;
stack || (stack = new Stack());
return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
}
}
if (!isSameTag) {
return false;
}
stack || (stack = new Stack());
return equalObjects(object2, other, bitmask, customizer, equalFunc, stack);
}
function baseIsEqual(value, other, bitmask, customizer, stack) {
if (value === other) {
return true;
}
if (value == null || other == null || !isObjectLike(value) && !isObjectLike(other)) {
return value !== value && other !== other;
}
return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
}
var COMPARE_PARTIAL_FLAG$1 = 1, COMPARE_UNORDERED_FLAG$1 = 2;
function baseIsMatch(object2, source, matchData, customizer) {
var index2 = matchData.length, length = index2, noCustomizer = !customizer;
if (object2 == null) {
return !length;
}
object2 = Object(object2);
while (index2--) {
var data = matchData[index2];
if (noCustomizer && data[2] ? data[1] !== object2[data[0]] : !(data[0] in object2)) {
return false;
}
}
while (++index2 < length) {
data = matchData[index2];
var key2 = data[0], objValue = object2[key2], srcValue = data[1];
if (noCustomizer && data[2]) {
if (objValue === void 0 && !(key2 in object2)) {
return false;
}
} else {
var stack = new Stack();
if (customizer) {
var result = customizer(objValue, srcValue, key2, object2, source, stack);
}
if (!(result === void 0 ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$1 | COMPARE_UNORDERED_FLAG$1, customizer, stack) : result)) {
return false;
}
}
}
return true;
}
function isStrictComparable(value) {
return value === value && !isObject$6(value);
}
function getMatchData(object2) {
var result = keys(object2), length = result.length;
while (length--) {
var key2 = result[length], value = object2[key2];
result[length] = [key2, value, isStrictComparable(value)];
}
return result;
}
function matchesStrictComparable(key2, srcValue) {
return function(object2) {
if (object2 == null) {
return false;
}
return object2[key2] === srcValue && (srcValue !== void 0 || key2 in Object(object2));
};
}
function baseMatches(source) {
var matchData = getMatchData(source);
if (matchData.length == 1 && matchData[0][2]) {
return matchesStrictComparable(matchData[0][0], matchData[0][1]);
}
return function(object2) {
return object2 === source || baseIsMatch(object2, source, matchData);
};
}
function baseHasIn(object2, key2) {
return object2 != null && key2 in Object(object2);
}
function hasPath(object2, path2, hasFunc) {
path2 = castPath(path2, object2);
var index2 = -1, length = path2.length, result = false;
while (++index2 < length) {
var key2 = toKey(path2[index2]);
if (!(result = object2 != null && hasFunc(object2, key2))) {
break;
}
object2 = object2[key2];
}
if (result || ++index2 != length) {
return result;
}
length = object2 == null ? 0 : object2.length;
return !!length && isLength(length) && isIndex(key2, length) && (isArray$4(object2) || isArguments$1(object2));
}
function hasIn(object2, path2) {
return object2 != null && hasPath(object2, path2, baseHasIn);
}
var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2;
function baseMatchesProperty(path2, srcValue) {
if (isKey(path2) && isStrictComparable(srcValue)) {
return matchesStrictComparable(toKey(path2), srcValue);
}
return function(object2) {
var objValue = get(object2, path2);
return objValue === void 0 && objValue === srcValue ? hasIn(object2, path2) : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
};
}
function baseProperty(key2) {
return function(object2) {
return object2 == null ? void 0 : object2[key2];
};
}
function basePropertyDeep(path2) {
return function(object2) {
return baseGet(object2, path2);
};
}
function property(path2) {
return isKey(path2) ? baseProperty(toKey(path2)) : basePropertyDeep(path2);
}
function baseIteratee(value) {
if (typeof value == "function") {
return value;
}
if (value == null) {
return identity$1;
}
if (typeof value == "object") {
return isArray$4(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value);
}
return property(value);
}
function createBaseFor(fromRight) {
return function(object2, iteratee, keysFunc) {
var index2 = -1, iterable = Object(object2), props = keysFunc(object2), length = props.length;
while (length--) {
var key2 = props[fromRight ? length : ++index2];
if (iteratee(iterable[key2], key2, iterable) === false) {
break;
}
}
return object2;
};
}
var baseFor = createBaseFor();
const baseFor$1 = baseFor;
function baseForOwn(object2, iteratee) {
return object2 && baseFor$1(object2, iteratee, keys);
}
function createBaseEach(eachFunc, fromRight) {
return function(collection, iteratee) {
if (collection == null) {
return collection;
}
if (!isArrayLike(collection)) {
return eachFunc(collection, iteratee);
}
var length = collection.length, index2 = fromRight ? length : -1, iterable = Object(collection);
while (fromRight ? index2-- : ++index2 < length) {
if (iteratee(iterable[index2], index2, iterable) === false) {
break;
}
}
return collection;
};
}
var baseEach = createBaseEach(baseForOwn);
const baseEach$1 = baseEach;
function last(array2) {
var length = array2 == null ? 0 : array2.length;
return length ? array2[length - 1] : void 0;
}
var objectProto = Object.prototype;
var hasOwnProperty$4 = objectProto.hasOwnProperty;
function baseHas(object2, key2) {
return object2 != null && hasOwnProperty$4.call(object2, key2);
}
function has$6(object2, path2) {
return object2 != null && hasPath(object2, path2, baseHas);
}
function parent(object2, path2) {
return path2.length < 2 ? object2 : baseGet(object2, baseSlice(path2, 0, -1));
}
function isMatch(object2, source) {
return object2 === source || baseIsMatch(object2, source, getMatchData(source));
}
function isUndefined$1(value) {
return value === void 0;
}
var FUNC_ERROR_TEXT = "Expected a function";
function negate(predicate) {
if (typeof predicate != "function") {
throw new TypeError(FUNC_ERROR_TEXT);
}
return function() {
var args = arguments;
switch (args.length) {
case 0:
return !predicate.call(this);
case 1:
return !predicate.call(this, args[0]);
case 2:
return !predicate.call(this, args[0], args[1]);
case 3:
return !predicate.call(this, args[0], args[1], args[2]);
}
return !predicate.apply(this, args);
};
}
function baseUnset(object2, path2) {
path2 = castPath(path2, object2);
object2 = parent(object2, path2);
return object2 == null || delete object2[toKey(last(path2))];
}
function baseSet(object2, path2, value, customizer) {
if (!isObject$6(object2)) {
return object2;
}
path2 = castPath(path2, object2);
var index2 = -1, length = path2.length, lastIndex = length - 1, nested = object2;
while (nested != null && ++index2 < length) {
var key2 = toKey(path2[index2]), newValue = value;
if (key2 === "__proto__" || key2 === "constructor" || key2 === "prototype") {
return object2;
}
if (index2 != lastIndex) {
var objValue = nested[key2];
newValue = customizer ? customizer(objValue, key2, nested) : void 0;
if (newValue === void 0) {
newValue = isObject$6(objValue) ? objValue : isIndex(path2[index2 + 1]) ? [] : {};
}
}
assignValue(nested, key2, newValue);
nested = nested[key2];
}
return object2;
}
function basePickBy(object2, paths, predicate) {
var index2 = -1, length = paths.length, result = {};
while (++index2 < length) {
var path2 = paths[index2], value = baseGet(object2, path2);
if (predicate(value, path2)) {
baseSet(result, castPath(path2, object2), value);
}
}
return result;
}
function pickBy(object2, predicate) {
if (object2 == null) {
return {};
}
var props = arrayMap(getAllKeysIn(object2), function(prop) {
return [prop];
});
predicate = baseIteratee(predicate);
return basePickBy(object2, props, function(value, path2) {
return predicate(value, path2[0]);
});
}
function omitBy(object2, predicate) {
return pickBy(object2, negate(baseIteratee(predicate)));
}
function set(object2, path2, value) {
return object2 == null ? object2 : baseSet(object2, path2, value);
}
function baseSome(collection, predicate) {
var result;
baseEach$1(collection, function(value, index2, collection2) {
result = predicate(value, index2, collection2);
return !result;
});
return !!result;
}
function some(collection, predicate, guard) {
var func = isArray$4(collection) ? arraySome : baseSome;
if (guard && isIterateeCall(collection, predicate, guard)) {
predicate = void 0;
}
return func(collection, baseIteratee(predicate));
}
function unset(object2, path2) {
return object2 == null ? true : baseUnset(object2, path2);
}
var _set = set;
var _get = get;
var _cloneDeep = cloneDeep;
var _has$1 = has$6;
var _some = some;
var _isMatch = isMatch;
var isObject$5 = function isObject2(data) {
var str = Object.prototype.toString.call(data);
return str.indexOf("Object") > -1;
};
var isArray$2 = function isArray2(data) {
var str = Object.prototype.toString.call(data);
return str.indexOf("Array") > -1;
};
var isFunction$2 = function isFunction2(data) {
return typeof data === "function";
};
function isUrl$1(string2) {
var protocolRE = /^(?:\w+:)?\/\/(\S+)$/;
if (typeof string2 !== "string")
return false;
return protocolRE.test(string2);
}
var isNumber$1 = function isNumber2(str) {
return !isNaN(Number(str));
};
var getArray = function getArray2(arr) {
var defaultValue = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : [];
if (Array.isArray(arr))
return arr;
return defaultValue;
};
function isObjType(schema2) {
return (schema2 === null || schema2 === void 0 ? void 0 : schema2.type) === "object" && (schema2 === null || schema2 === void 0 ? void 0 : schema2.properties) && (schema2 === null || schema2 === void 0 ? void 0 : schema2.widgetType) !== "field";
}
function isListType(schema2) {
return (schema2 === null || schema2 === void 0 ? void 0 : schema2.type) === "array" && isObjType(schema2 === null || schema2 === void 0 ? void 0 : schema2.items) && (schema2 === null || schema2 === void 0 ? void 0 : schema2.enum) === void 0;
}
function isCheckBoxType(schema2, readOnly) {
if (readOnly)
return false;
if (schema2.widget === "checkbox")
return true;
if (schema2 && schema2.type === "boolean") {
if (schema2.enum)
return false;
if (schema2.widget === void 0)
return true;
return false;
}
}
var valueRemoveUndefined = function valueRemoveUndefined2(values, notFilter) {
var recursionArray = function recursionArray2(list) {
var result = list.map(function(item) {
if (isObject$5(item)) {
return recursionObj(item);
}
if (isArray$2(item)) {
return recursionArray2(item);
}
return item;
});
if (Object.keys(result).length === 0) {
return void 0;
}
return result;
};
var recursionObj = function recursionObj2(_data) {
var data = omitBy(_data, isUndefined$1);
Object.keys(data).forEach(function(key2) {
var item = data[key2];
if (isObject$5(item)) {
data[key2] = recursionObj2(item);
}
if (isArray$2(item)) {
var result = recursionArray(item) || [];
data[key2] = notFilter ? result : result.filter(function(item2) {
return item2 !== void 0;
});
}
});
data = omitBy(data, isUndefined$1);
if (Object.keys(data).length === 0) {
return void 0;
}
return data;
};
return recursionObj(values) || {};
};
var translation$1 = function translation2(configCtx) {
return function(key2) {
var locale2 = configCtx === null || configCtx === void 0 ? void 0 : configCtx.locale.FormRender;
return locale2[key2];
};
};
var hasFuncProperty = function hasFuncProperty2(obj) {
return _some(obj, function(value) {
if (isFunction$2(value)) {
return true;
}
if (isObject$5(value)) {
return hasFuncProperty2(value);
}
return false;
});
};
var FRContext = /* @__PURE__ */ React$a.createContext(null);
var ConfigContext = /* @__PURE__ */ React$a.createContext(null);
var displayTypeEnum = {
column: "vertical",
row: "horizontal",
inline: "inline"
};
var transformProps = function transformProps2(props) {
var schema2 = props.schema, beforeFinish = props.beforeFinish, onMount = props.onMount, _props$displayType = props.displayType, displayType = _props$displayType === void 0 ? "column" : _props$displayType, watch = props.watch, _props$removeHiddenDa = props.removeHiddenData, removeHiddenData = _props$removeHiddenDa === void 0 ? true : _props$removeHiddenDa, readOnly = props.readOnly, _props$column = props.column, column = _props$column === void 0 ? 1 : _props$column, mapping2 = props.mapping, debugCss = props.debugCss, locale2 = props.locale, configProvider = props.configProvider, validateMessages = props.validateMessages, debug = props.debug, id2 = props.id, labelWidth = props.labelWidth, maxWidth = props.maxWidth, form = props.form, onFinish = props.onFinish, onFinishFailed = props.onFinishFailed, footer = props.footer, operateExtra = props.operateExtra, logOnMount = props.logOnMount, logOnSubmit = props.logOnSubmit, labelCol = props.labelCol, fieldCol = props.fieldCol, disabled = props.disabled, className = props.className, validateTrigger = props.validateTrigger, otherProps = __rest(props, ["schema", "beforeFinish", "onMount", "displayType", "watch", "removeHiddenData", "readOnly", "column", "mapping", "debugCss", "locale", "configProvider", "validateMessages", "debug", "id", "labelWidth", "maxWidth", "form", "onFinish", "onFinishFailed", "footer", "operateExtra", "logOnMount", "logOnSubmit", "labelCol", "fieldCol", "disabled", "className", "validateTrigger"]);
var formProps = Object.assign({}, otherProps);
if (displayType) {
formProps.layout = displayTypeEnum[displayType] || "horizontal";
}
return {
formProps,
schema: schema2,
displayType,
onFinish,
beforeFinish,
onMount,
watch,
readOnly,
disabled,
column,
mapping: mapping2,
debugCss,
locale: locale2,
configProvider,
footer,
form,
labelWidth,
validateMessages,
debug,
id: id2,
onFinishFailed,
removeHiddenData,
operateExtra,
logOnMount,
logOnSubmit,
labelCol,
fieldCol,
maxWidth,
className,
validateTrigger
};
};
function _typeof$o(obj) {
"@babel/helpers - typeof";
return _typeof$o = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof$o(obj);
}
function _defineProperty$9(obj, key2, value) {
key2 = _toPropertyKey$6(key2);
if (key2 in obj) {
Object.defineProperty(obj, key2, { value, enumerable: true, configurable: true, writable: true });
} else {
obj[key2] = value;
}
return obj;
}
function _toPropertyKey$6(arg) {
var key2 = _toPrimitive$7(arg, "string");
return _typeof$o(key2) === "symbol" ? key2 : String(key2);
}
function _toPrimitive$7(input, hint) {
if (_typeof$o(input) !== "object" || input === null)
return input;
var prim = input[Symbol.toPrimitive];
if (prim !== void 0) {
var res = prim.call(input, hint || "default");
if (_typeof$o(res) !== "object")
return res;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return (hint === "string" ? String : Number)(input);
}
function _toConsumableArray$b(arr) {
return _arrayWithoutHoles$b(arr) || _iterableToArray$b(arr) || _unsupportedIterableToArray$k(arr) || _nonIterableSpread$b();
}
function _nonIterableSpread$b() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _arrayWithoutHoles$b(arr) {
if (Array.isArray(arr))
return _arrayLikeToArray$k(arr);
}
function _toArray(arr) {
return _arrayWithHoles$e(arr) || _iterableToArray$b(arr) || _unsupportedIterableToArray$k(arr) || _nonIterableRest$e();
}
function _nonIterableRest$e() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$k(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$k(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$k(o, minLen);
}
function _arrayLikeToArray$k(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArray$b(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
return Array.from(iter);
}
function _arrayWithHoles$e(arr) {
if (Array.isArray(arr))
return arr;
}
var isMultiBind = function isMultiBind2(array2) {
return isArray$2(array2) && array2.every(function(item) {
return typeof item === "string";
});
};
var transformPath = function transformPath2(path2) {
var result = [];
var recursion = function recursion2(str) {
var index2 = str.indexOf("[]");
if (index2 === -1) {
result.push(str);
return;
}
result.push(str.substring(0, index2));
recursion2(str.substring(index2 + 3));
};
recursion(path2);
if (result.length === 1) {
return result[0];
}
return result;
};
var transformValueToBind = function transformValueToBind2(data, path2, bind2) {
if (bind2 === false) {
unset(data, path2);
return;
}
if (typeof bind2 === "string") {
var value = get(data, path2);
var preValue = get(data, bind2);
if (isObject$5(preValue)) {
value = Object.assign(Object.assign({}, preValue), value);
}
set(data, bind2, value);
unset(data, path2);
return;
}
if (isMultiBind(bind2)) {
var _value = get(data, path2);
unset(data, path2);
if (Array.isArray(_value)) {
_value.forEach(function(item, index2) {
var bindPath = bind2[index2];
bindPath && set(data, bindPath, item);
});
}
}
};
var transformBindToValue = function transformBindToValue2(data, path2, bind2) {
if (typeof bind2 === "string") {
var value = get(data, bind2);
var preValue = get(data, path2);
if (isObject$5(preValue)) {
value = Object.assign(Object.assign({}, preValue), value);
}
set(data, path2, value);
unset(data, bind2);
return;
}
if (isMultiBind(bind2)) {
var _value2 = [];
bind2.forEach(function(key2) {
var bindValue = get(data, key2);
_value2.push(bindValue);
unset(data, key2);
});
if (_value2.length > 0) {
set(data, path2, _value2);
}
}
};
var parseValuesToBind = function parseValuesToBind2(values, flatten) {
if (!JSON.stringify(flatten).includes("bind")) {
return values;
}
var data = _cloneDeep(values);
var dealFieldList = function dealFieldList2(obj, _ref, bind2) {
var _ref2 = _toArray(_ref), path2 = _ref2[0], rest = _ref2.slice(1);
if (rest.length === 1) {
var list = get(obj, path2, []);
list.forEach(function(item, index2) {
var value2 = get(item, rest[0]);
if (bind2 === "root") {
list[index2] = value2;
return;
}
transformValueToBind(item, rest[0], bind2);
});
}
if (isArray$2(obj)) {
obj.forEach(function(item) {
return dealFieldList2(item, [path2].concat(_toConsumableArray$b(rest)), bind2);
});
} else if (isObject$5(obj)) {
var value = get(obj, path2);
dealFieldList2(value, rest, bind2);
}
};
Object.keys(flatten).forEach(function(key2) {
var _a, _b;
var bind2 = (_b = (_a = flatten[key2]) === null || _a === void 0 ? void 0 : _a.schema) === null || _b === void 0 ? void 0 : _b.bind;
if (bind2 === void 0) {
return;
}
var path2 = transformPath(key2);
isArray$2(path2) ? dealFieldList(data, path2, bind2) : transformValueToBind(data, path2, bind2);
});
return data;
};
var parseBindToValues = function parseBindToValues2(values, flatten) {
if (!JSON.stringify(flatten).includes("bind")) {
return values;
}
var data = _cloneDeep(values);
var dealFieldList = function dealFieldList2(obj, _ref3, bind2) {
var _ref4 = _toArray(_ref3), path2 = _ref4[0], rest = _ref4.slice(1);
if (rest.length === 1) {
var list = get(obj, path2, []);
list.forEach(function(item, index2) {
if (bind2 === "root") {
list[index2] = _defineProperty$9({}, rest[0], item);
return;
}
transformBindToValue(item, rest[0], bind2);
});
}
if (isArray$2(obj)) {
obj.forEach(function(item) {
return dealFieldList2(item, [path2].concat(_toConsumableArray$b(rest)), bind2);
});
} else if (isObject$5(obj)) {
var value = get(obj, path2);
dealFieldList2(value, rest, bind2);
}
};
Object.keys(flatten).forEach(function(key2) {
var _a, _b;
var bind2 = (_b = (_a = flatten[key2]) === null || _a === void 0 ? void 0 : _a.schema) === null || _b === void 0 ? void 0 : _b.bind;
if (bind2 === void 0) {
return;
}
var path2 = transformPath(key2);
isArray$2(path2) ? dealFieldList(data, path2, bind2) : transformBindToValue(data, path2, bind2);
});
return data;
};
var getFormItemLayout = function getFormItemLayout2(column, schema2, _ref) {
var labelWidth = _ref.labelWidth, displayType = _ref.displayType, _labelCol = _ref._labelCol, _fieldCol = _ref._fieldCol;
var labelCol = {
span: 5
};
var fieldCol = {
span: 9
};
if (column === 2) {
labelCol = {
span: 6
};
fieldCol = {
span: 14
};
}
if (column > 2) {
labelCol = {
span: 7
};
fieldCol = {
span: 16
};
}
if (displayType === "column") {
labelCol = {};
fieldCol = {};
}
if (_labelCol) {
labelCol = _labelCol;
if (displayType === "column") {
labelCol = {};
}
}
if (_fieldCol) {
fieldCol = _fieldCol;
if (typeof _fieldCol === "number") {
fieldCol = {
span: _fieldCol
};
}
}
if (displayType === "inline") {
labelCol = {};
fieldCol = {};
}
if ((labelWidth || labelWidth === 0) && displayType !== "column") {
labelCol = {
flex: labelWidth + "px"
};
fieldCol = {
flex: "auto"
};
}
if (schema2.cellSpan) {
fieldCol = {};
}
if (schema2.labelCol || schema2.labelCol === 0) {
labelCol = schema2.labelCol;
}
if (schema2.fieldCol || schema2.fieldCol === 0) {
fieldCol = schema2.fieldCol;
}
if (typeof labelCol === "number") {
labelCol = {
span: labelCol
};
}
if (typeof fieldCol === "number") {
fieldCol = {
span: fieldCol
};
}
return {
labelCol,
fieldCol
};
};
function _toConsumableArray$a(arr) {
return _arrayWithoutHoles$a(arr) || _iterableToArray$a(arr) || _unsupportedIterableToArray$j(arr) || _nonIterableSpread$a();
}
function _nonIterableSpread$a() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$j(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$j(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$j(o, minLen);
}
function _iterableToArray$a(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
return Array.from(iter);
}
function _arrayWithoutHoles$a(arr) {
if (Array.isArray(arr))
return _arrayLikeToArray$j(arr);
}
function _arrayLikeToArray$j(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
var executeCallBack = function executeCallBack2(watchItem, value, path2, index2) {
if (isFunction$2(watchItem)) {
try {
watchItem(value, index2);
} catch (error) {
console.log("".concat(path2, "\u5BF9\u5E94\u7684watch\u51FD\u6570\u6267\u884C\u62A5\u9519\uFF1A"), error);
}
}
if (isFunction$2(watchItem === null || watchItem === void 0 ? void 0 : watchItem.handler)) {
try {
watchItem.handler(value, index2);
} catch (error) {
console.log("".concat(path2, "\u5BF9\u5E94\u7684watch\u51FD\u6570\u6267\u884C\u62A5\u9519\uFF1A"), error);
}
}
};
var traverseValues = function traverseValues2(_ref) {
var changedValues = _ref.changedValues, allValues = _ref.allValues, flatValues = _ref.flatValues;
var traverseArray = function traverseArray2(list, fullList, path2, index2) {
if (!list.length) {
return;
}
var _path = path2 += "[]";
var filterLength = list.filter(function(item) {
return item || item === void 0;
}).length;
var flag = filterLength !== fullList.length || list.length === 1;
var isRemove = false;
if (filterLength > 1 && filterLength < fullList.length) {
flag = false;
isRemove = true;
}
list.forEach(function(item, idx) {
if (!isRemove) {
flatValues[_path] = {
value: fullList[idx],
index: index2
};
}
if (isObject$5(item)) {
traverseObj(item, fullList[idx], _path, [].concat(_toConsumableArray$a(index2), [idx]), !flag);
}
if (isArray$2(item)) {
traverseArray2(item, fullList[idx], _path, [].concat(_toConsumableArray$a(index2), [idx]));
}
});
};
var traverseObj = function traverseObj2(obj, fullObj, path2, index2, flag) {
Object.keys(obj).forEach(function(key2) {
var item = obj[key2];
var fullItem = fullObj === null || fullObj === void 0 ? void 0 : fullObj[key2];
var value = item;
var _path = path2 ? path2 + "." + key2 : key2;
var last2 = true;
if (isArray$2(item)) {
value = fullItem ? _toConsumableArray$a(fullItem) : fullItem;
last2 = false;
traverseArray(item, fullItem, _path, index2);
}
if (isObject$5(item)) {
last2 = false;
traverseObj2(item, fullItem, _path, index2, flag);
}
if (!last2 || !flag) {
flatValues[_path] = {
value,
index: index2
};
}
});
};
traverseObj(changedValues, allValues, null, []);
};
var valuesWatch = function valuesWatch2(changedValues, allValues, watch) {
var _a;
if (((_a = Object.keys(watch || {})) === null || _a === void 0 ? void 0 : _a.length) === 0) {
return;
}
var flatValues = {
"#": {
value: allValues,
index: changedValues
}
};
traverseValues({
changedValues,
allValues,
flatValues
});
Object.keys(watch).forEach(function(path2) {
if (!_has$1(flatValues, path2)) {
return;
}
var _get2 = _get(flatValues, path2), value = _get2.value, index2 = _get2.index;
var item = watch[path2];
executeCallBack(item, value, path2, index2);
});
};
var transformFieldsData = function transformFieldsData2(_fieldsError, getFieldName2) {
var fieldsError = _fieldsError;
if (isObject$5(fieldsError)) {
fieldsError = [fieldsError];
}
if (!(isArray$2(fieldsError) && fieldsError.length > 0)) {
return;
}
return fieldsError.map(function(field) {
return Object.assign(Object.assign({
errors: field.error
}, field), {
name: getFieldName2(field.name)
});
});
};
var immediateWatch = function immediateWatch2(watch, values) {
var _a;
if (((_a = Object.keys(watch || {})) === null || _a === void 0 ? void 0 : _a.length) === 0) {
return;
}
var watchObj = {};
Object.keys(watch).forEach(function(key2) {
var watchItem = watch[key2];
if ((watchItem === null || watchItem === void 0 ? void 0 : watchItem.immediate) && isFunction$2(watchItem === null || watchItem === void 0 ? void 0 : watchItem.handler)) {
watchObj[key2] = watchItem;
}
});
valuesWatch(values, values, watchObj);
};
var getSchemaFullPath = function getSchemaFullPath2(path2, schema2) {
if (!path2 || !path2.includes(".")) {
return "properties." + path2;
}
while (path2.includes("[]")) {
var index2 = path2.indexOf("[]");
path2 = path2.substring(0, index2) + ".items" + path2.substring(index2 + 2);
}
var result = "properties";
path2.split(".").forEach(function(item) {
var key2 = result + "." + item;
var itemSchema = _get(schema2, key2, {});
if (isObjType(itemSchema)) {
result = key2 + ".properties";
return;
}
result = key2;
});
return result;
};
function yymmdd(timeStamp) {
var date_ob = new Date(Number(timeStamp));
var adjustZero = function adjustZero2(num) {
return ("0" + num).slice(-2);
};
var day = adjustZero(date_ob.getDate());
var month = adjustZero(date_ob.getMonth());
var year = date_ob.getFullYear();
var hours = adjustZero(date_ob.getHours());
var minutes = adjustZero(date_ob.getMinutes());
var seconds = adjustZero(date_ob.getSeconds());
return "".concat(year, "-").concat(month, "-").concat(day, " ").concat(hours, ":").concat(minutes, ":").concat(seconds);
}
function msToTime(duration) {
var seconds = Math.floor(duration / 1e3 % 60);
var minutes = Math.floor(duration / (1e3 * 60) % 60);
var hours = Math.floor(duration / (1e3 * 60 * 60) % 24);
hours = hours < 10 ? "0" + hours : hours;
minutes = minutes < 10 ? "0" + minutes : minutes;
seconds = seconds < 10 ? "0" + seconds : seconds;
return hours + ":" + minutes + ":" + seconds;
}
var getSessionItem = function getSessionItem2(key2) {
return Number(sessionStorage.getItem(key2) || 0);
};
var setSessionItem = function setSessionItem2(key2, data) {
sessionStorage.setItem(key2, data + "");
};
function _toConsumableArray$9(arr) {
return _arrayWithoutHoles$9(arr) || _iterableToArray$9(arr) || _unsupportedIterableToArray$i(arr) || _nonIterableSpread$9();
}
function _nonIterableSpread$9() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$i(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$i(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$i(o, minLen);
}
function _iterableToArray$9(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
return Array.from(iter);
}
function _arrayWithoutHoles$9(arr) {
if (Array.isArray(arr))
return _arrayLikeToArray$i(arr);
}
function _arrayLikeToArray$i(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
var filterHiddenData = function filterHiddenData2(list) {
if (!isArray$2(list)) {
return list;
}
var result = [];
for (var i2 = 0; i2 < list.length; i2++) {
var item = list[i2];
if (!item.hidden) {
var node = Object.assign({}, item);
if (item.children) {
var children = filterHiddenData2(item.children);
if (children.length > 0) {
node.children = children;
}
}
if (item.items) {
var items = filterHiddenData2(item.items);
if (items.length > 0) {
node.items = items;
}
}
result.push(node);
}
}
return result;
};
var getPathObj = function getPathObj2(_ref) {
var _ref$rootPath = _ref.rootPath, rootPath = _ref$rootPath === void 0 ? [] : _ref$rootPath, path2 = _ref.path;
var pathList = (path2 || "").split(".");
var dataIndex = [];
var schemaIndex = [];
var dataPathList = [];
rootPath.forEach(function(item, index2) {
if (isNumber$1(item)) {
dataIndex.push(item);
return;
}
if (isNumber$1(rootPath[index2 + 1])) {
schemaIndex.push("".concat(item, "[]"));
} else {
schemaIndex.push(item);
}
});
var list = _toConsumableArray$9(rootPath);
list.pop();
list = [].concat(_toConsumableArray$9(list), _toConsumableArray$9(pathList));
list.forEach(function(item, index2) {
if (isNumber$1(item)) {
dataPathList.push("[".concat(item, "]"));
} else {
dataPathList.push(item);
}
});
var dataPath = dataPathList.join(".");
var _path = pathList;
if (_path[0] && isNumber$1(_path[0])) {
_path.splice(0, 1);
}
var schemaPath = [].concat(schemaIndex, [_path]).join(".");
return {
dataIndex,
dataPath,
schemaPath
};
};
var getPath = function getPath2(path2) {
if (!path2) {
return null;
}
if (isArray$2(path2)) {
return path2.join(".");
}
return path2;
};
var getLabel$1 = function getLabel2(schema2, displayType, widgets) {
var title = schema2.title, description = schema2.description, descWidget = schema2.descWidget, labelWidget = schema2.labelWidget;
var LabelNode = widgets[labelWidget];
if (LabelNode) {
return /* @__PURE__ */ jsx(LabelNode, {
schema: schema2
});
}
if (!description && !descWidget) {
return title;
}
var RenderDesc = function RenderDesc2() {
var Widget = widgets[descWidget];
if (Widget) {
return /* @__PURE__ */ jsx(Widget, {
schema: schema2
});
}
if (description) {
return /* @__PURE__ */ jsxs("span", {
className: "fr-desc",
children: ["(", description, ")"]
});
}
return null;
};
return /* @__PURE__ */ jsxs(Fragment, {
children: [title, /* @__PURE__ */ jsx(RenderDesc, {})]
});
};
var getTooltip$4 = function getTooltip2(schema2, displayType) {
var descType = schema2.descType, description = schema2.description, tooltip = schema2.tooltip;
if (tooltip) {
if (typeof tooltip === "string") {
return {
title: /* @__PURE__ */ jsx("span", {
dangerouslySetInnerHTML: {
__html: tooltip
}
})
};
}
return Object.assign(Object.assign({}, tooltip), {
title: /* @__PURE__ */ jsx("span", {
dangerouslySetInnerHTML: {
__html: tooltip.title
}
})
});
}
if (descType === "widget" || !description) {
return null;
}
if (displayType === "column" && descType === "icon") {
return {
title: description
};
}
return null;
};
var getExtraView = function getExtraView2(extraKey, schema2, widgets) {
var extra = schema2[extraKey];
if (!extra) {
return;
}
var widgetName = extra === null || extra === void 0 ? void 0 : extra.widget;
if (widgetName) {
var Widget = widgets[widgetName];
if (!Widget) {
return;
}
return /* @__PURE__ */ jsx(Widget, {
schema: schema2
});
}
var __html = "";
if (typeof extra === "string") {
__html = extra;
}
if (extra === null || extra === void 0 ? void 0 : extra.text) {
__html = extra.text;
}
if (!__html) {
return;
}
return /* @__PURE__ */ jsx("div", {
className: "fr-form-item-extra",
dangerouslySetInnerHTML: {
__html
}
});
};
var getColSpan = function getColSpan2(formCtx, parentCtx, schema2) {
var span = 24;
var column = getParamValue$2(formCtx, parentCtx, schema2)("column");
if (column) {
span = 24 / column;
}
if (schema2.width) {
if (schema2.width === "100%") {
span = 24;
} else if (schema2.width === "50%") {
span = 12;
} else if (schema2.width === "20%") {
span = 5;
} else if (schema2.width < "50%") {
span = 8;
}
}
if (schema2.cellSpan) {
span = schema2.cellSpan * span;
}
if (schema2.span) {
span = schema2.span;
}
return span;
};
var getParamValue$2 = function getParamValue2(formCtx, upperCtx, schema2) {
return function(valueKey) {
var isTop = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true;
var _a, _b, _c;
if (isTop) {
return (_b = (_a = schema2[valueKey]) !== null && _a !== void 0 ? _a : upperCtx[valueKey]) !== null && _b !== void 0 ? _b : formCtx[valueKey];
}
return (_c = schema2[valueKey]) !== null && _c !== void 0 ? _c : upperCtx[valueKey];
};
};
var getFieldProps = function getFieldProps2(widgetName, schema2, _ref2) {
var widgets = _ref2.widgets, methods = _ref2.methods, form = _ref2.form, dependValues = _ref2.dependValues, globalProps = _ref2.globalProps, path2 = _ref2.path, rootPath = _ref2.rootPath, fieldRef = _ref2.fieldRef;
var _a;
var pathObj = getPathObj({
path: path2,
rootPath
});
var fieldProps = Object.assign(Object.assign({}, schema2.props), {
addons: Object.assign(Object.assign(Object.assign({}, form), {
globalProps,
dependValues,
fieldRef
}), pathObj)
});
if ((dependValues === null || dependValues === void 0 ? void 0 : dependValues.length) > 0) {
fieldProps.dependValues = dependValues;
}
["placeholder", "disabled", "format", "onStatusChange"].forEach(function(key2) {
if (schema2[key2]) {
fieldProps[key2] = schema2[key2];
}
});
if (schema2.enum && !((_a = schema2.props) === null || _a === void 0 ? void 0 : _a.options)) {
var enums = schema2.enum, enumNames = schema2.enumNames;
fieldProps.options = getArray(enums).map(function(item, index2) {
var label = enumNames && Array.isArray(enumNames) ? enumNames[index2] : item;
var isHtml = typeof label === "string" && label[0] === "<";
if (isHtml) {
label = /* @__PURE__ */ jsx("span", {
dangerouslySetInnerHTML: {
__html: label
}
});
}
return {
label,
value: item
};
});
}
if (isArray$2(fieldProps.options)) {
fieldProps = Object.assign(Object.assign({}, fieldProps), {
options: filterHiddenData(fieldProps.options)
});
}
Object.keys(schema2).forEach(function(key2) {
if (typeof key2 === "string" && key2.toLowerCase().indexOf("props") > -1 && key2.length > 5) {
fieldProps[key2] = schema2[key2];
}
});
if (isObject$5(fieldProps.addonAfter) && fieldProps.addonAfter.widget) {
var AddonAfterWidget = widgets[fieldProps.addonAfter.widget];
fieldProps.addonAfter = /* @__PURE__ */ jsx(AddonAfterWidget, {
...Object.assign({}, schema2)
});
}
if (["treeSelect", "inputNumber", "multiSelect", "select"].includes(widgetName)) {
fieldProps.style = Object.assign({
width: "100%"
}, fieldProps.style);
}
if (widgetName === "multiSelect") {
fieldProps.mode = "multiple";
}
if (isObject$5(schema2.methods)) {
Object.keys(schema2.methods).forEach(function(key2) {
var name2 = schema2.methods[key2];
fieldProps[key2] = methods[name2];
});
}
fieldProps.schema = schema2;
return fieldProps;
};
var getDependValues = function getDependValues2(formData, dependPath, props, dependencieItem) {
var indexReg = /\[[0-9]*\]/;
if (indexReg.test(dependPath)) {
var currentIndex = _get(props, "path.0");
var dependIndex = dependPath.match(indexReg)[0].replace("[", "").replace("]", "");
var listPath = dependPath.split(indexReg)[0];
var itemIndex = dependIndex || currentIndex;
var itemPath = dependPath.replace("".concat(listPath, "[").concat(dependIndex, "]."), "");
var listData = _get(formData, "".concat(listPath, "[").concat(itemIndex, "]"));
dependencieItem.push(listPath, itemIndex);
return getDependValues2(listData, itemPath, props, dependencieItem);
}
dependencieItem.push.apply(dependencieItem, _toConsumableArray$9(dependPath.split(".")));
return _get(formData, dependPath);
};
function _typeof$n(obj) {
"@babel/helpers - typeof";
return _typeof$n = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof$n(obj);
}
var createDataSkeleton = function createDataSkeleton2(schema2, formData) {
var _formData = _cloneDeep(formData);
var result = _formData;
if (isObjType(schema2)) {
if (_formData === void 0 || _typeof$n(_formData) !== "object") {
_formData = {};
result = {};
}
Object.keys(schema2.properties).forEach(function(key2) {
var childSchema = schema2.properties[key2];
var childData = _formData[key2];
var childResult = createDataSkeleton2(childSchema, childData);
result[key2] = childResult;
});
} else if (_formData !== void 0)
;
else if (schema2.default !== void 0) {
result = _cloneDeep(schema2.default);
} else if (isListType(schema2)) {
result = [createDataSkeleton2(schema2.items)];
} else if (schema2.type === "boolean" && !schema2.widget) {
result = void 0;
} else {
result = void 0;
}
return result;
};
var isExpression = function isExpression2(str) {
if (typeof str !== "string") {
return false;
}
var pattern2 = /^{\s*{(.+)}\s*}$/;
var reg1 = /^{\s*{function\(.+}\s*}$/;
return str.match(pattern2) && !str.match(reg1);
};
var isHasExpression = function isHasExpression2(schema2) {
var result = Object.keys(schema2).some(function(key2) {
var item = schema2[key2];
if (key2 === "properties") {
return false;
}
var recursionArray = function recursionArray2(list) {
var result2 = list.some(function(ite) {
if (isArray$2(ite)) {
return recursionArray2(ite);
}
if (isObject$5(ite)) {
return isHasExpression2(ite);
}
return isExpression(ite);
});
return result2;
};
if (isArray$2(item)) {
return recursionArray(item);
}
if (isObject$5(item)) {
return isHasExpression2(item);
}
return isExpression(item);
});
return result;
};
var parseExpression = function parseExpression2(func) {
var formData = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var parentPath = arguments.length > 2 ? arguments[2] : void 0;
var parentData = get(formData, parentPath) || {};
if (typeof func === "string") {
var funcBody = func.replace(/^{\s*{/g, "").replace(/}\s*}$/g, "");
var funcStr = "\n return ".concat(funcBody.replace(/formData/g, JSON.stringify(formData)).replace(/rootValue/g, JSON.stringify(parentData)), "\n ");
try {
var result = Function(funcStr)();
return result;
} catch (error) {
console.log(error, parentPath);
return null;
}
}
return func;
};
var parseAllExpression = function parseAllExpression2(_schema, _formData, dataPath, formSchema) {
var schema2 = _cloneDeep(_schema);
var formData = _formData;
if (formSchema) {
formData = createDataSkeleton(formSchema, formData);
}
var recursionArray = function recursionArray2(list) {
var result = list.map(function(item) {
if (isArray$2(item)) {
return recursionArray2(item);
}
if (isObject$5(item)) {
return parseAllExpression2(item, formData, dataPath);
}
if (isExpression(item)) {
return parseExpression(item, formData, dataPath);
}
return item;
});
return result;
};
Object.keys(schema2).forEach(function(key2) {
var _a;
var value = schema2[key2];
if (isArray$2(value)) {
schema2[key2] = recursionArray(value);
}
if (isObject$5(value) && ((_a = value.mustacheParse) !== null && _a !== void 0 ? _a : true)) {
schema2[key2] = parseAllExpression2(value, formData, dataPath);
} else if (isExpression(value)) {
schema2[key2] = parseExpression(value, formData, dataPath);
}
});
return schema2;
};
var extractFormDataStrings = function extractFormDataStrings2(list) {
var result = [];
list.forEach(function(str) {
var regex = /formData.\w+(.\w+)*/g;
var matches = str.match(regex);
if (matches) {
result = result.concat(matches);
}
});
return result;
};
var extractRootValueStrings = function extractRootValueStrings2(list) {
var result = [];
list.forEach(function(str) {
var regex = /rootValue.\w+(.\w+)*/g;
var matches = str.match(regex);
if (matches) {
result = result.concat(matches);
}
});
return result;
};
var findStrList = function findStrList2(str, type2) {
var regex = /{{(.*?)}}/g;
var matches = [];
var match2;
while ((match2 = regex.exec(str)) !== null) {
matches.push(match2[1]);
}
if (type2 === "formData") {
return extractFormDataStrings(matches);
}
if (type2 === "rootValue") {
return extractRootValueStrings(matches);
}
return [];
};
var getListEveryResult = function getListEveryResult2(list, preValue, nextValue, dataPath) {
return list.every(function(item) {
var pre = parseExpression(item, preValue, dataPath);
var curr = parseExpression(item, nextValue, dataPath);
return pre === curr;
});
};
const fieldShouldUpdate = function(str, dataPath, dependencies, shouldUpdateOpen) {
return function(preValue, nextValue) {
if (dependencies) {
return true;
}
var formDataList = findStrList(str, "formData");
var rootValueList = findStrList(str, "rootValue");
var formDataRes = getListEveryResult(formDataList, preValue, nextValue, dataPath);
var rootValueRes = getListEveryResult(rootValueList, preValue, nextValue, dataPath);
if (formDataRes && rootValueRes) {
return false;
}
return true;
};
};
var mapping = {
default: "input",
string: "input",
array: "list",
boolean: "checkbox",
integer: "number",
number: "inputNumber",
object: "map",
html: "html",
card: "card",
collapse: "collapse",
lineTitle: "lineTitle",
line: "line",
subItem: "subItem",
panel: "panel",
"string:upload": "upload",
"string:url": "urlInput",
"string:dateTime": "datePicker",
"string:date": "datePicker",
"string:year": "datePicker",
"string:month": "datePicker",
"string:week": "datePicker",
"string:quarter": "datePicker",
"string:time": "timePicker",
"string:textarea": "textArea",
"string:color": "color",
"string:image": "imageInput",
"range:time": "timeRange",
"range:dateTime": "dateRange",
"range:date": "dateRange",
"range:year": "dateRange",
"range:month": "dateRange",
"range:week": "dateRange",
"range:quarter": "dateRange",
"*?enum": "radio",
"*?enum_long": "select",
"array?enum": "checkboxes",
"array?enum_long": "multiSelect",
"*?readOnly": "html"
};
function getWidgetName(schema2) {
var _mapping = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : mapping;
var type2 = schema2.type, format2 = schema2.format, enums = schema2.enum, readOnly = schema2.readOnly;
schema2.widget;
var props = schema2.props;
if (schema2["ui:widget"] || schema2.widget) {
return schema2["ui:widget"] || schema2.widget;
}
var list = [];
if (readOnly) {
list.push("".concat(type2, "?readOnly"));
list.push("*?readOnly");
}
if (enums) {
if (Array.isArray(enums) && (type2 === "array" && enums.length > 6 || type2 !== "array" && enums.length > 2)) {
list.push("".concat(type2, "?enum_long"));
list.push("*?enum_long");
} else {
list.push("".concat(type2, "?enum"));
list.push("*?enum");
}
}
if (props === null || props === void 0 ? void 0 : props.options) {
if (type2 === "array" && props.options.length > 6 || type2 !== "array" && props.options.length > 2) {
list.push("".concat(type2, "?enum_long"));
list.push("*?enum_long");
} else {
list.push("".concat(type2, "?enum"));
list.push("*?enum");
}
}
var _widget = format2;
if (_widget) {
list.push("".concat(type2, ":").concat(_widget));
}
if (type2 === "object") {
list.push((schema2.theme === "tile" ? "lineTitle" : schema2.theme) || "collapse");
} else {
list.push(type2);
}
var widgetName = "";
list.some(function(item) {
widgetName = _mapping[item];
return !!widgetName;
});
return widgetName;
}
function capitalizeFirstLetter(str) {
if (!str) {
return str;
}
return str.charAt(0).toUpperCase() + str.slice(1);
}
var getWidget = function getWidget2(name2, widgets) {
var widget = widgets[name2];
if (!widget) {
widget = widgets[capitalizeFirstLetter(name2)];
}
if (!widget) {
widget = widgets["Html"] || null;
}
return widget;
};
var colorString$1 = { exports: {} };
var colorName = {
"aliceblue": [240, 248, 255],
"antiquewhite": [250, 235, 215],
"aqua": [0, 255, 255],
"aquamarine": [127, 255, 212],
"azure": [240, 255, 255],
"beige": [245, 245, 220],
"bisque": [255, 228, 196],
"black": [0, 0, 0],
"blanchedalmond": [255, 235, 205],
"blue": [0, 0, 255],
"blueviolet": [138, 43, 226],
"brown": [165, 42, 42],
"burlywood": [222, 184, 135],
"cadetblue": [95, 158, 160],
"chartreuse": [127, 255, 0],
"chocolate": [210, 105, 30],
"coral": [255, 127, 80],
"cornflowerblue": [100, 149, 237],
"cornsilk": [255, 248, 220],
"crimson": [220, 20, 60],
"cyan": [0, 255, 255],
"darkblue": [0, 0, 139],
"darkcyan": [0, 139, 139],
"darkgoldenrod": [184, 134, 11],
"darkgray": [169, 169, 169],
"darkgreen": [0, 100, 0],
"darkgrey": [169, 169, 169],
"darkkhaki": [189, 183, 107],
"darkmagenta": [139, 0, 139],
"darkolivegreen": [85, 107, 47],
"darkorange": [255, 140, 0],
"darkorchid": [153, 50, 204],
"darkred": [139, 0, 0],
"darksalmon": [233, 150, 122],
"darkseagreen": [143, 188, 143],
"darkslateblue": [72, 61, 139],
"darkslategray": [47, 79, 79],
"darkslategrey": [47, 79, 79],
"darkturquoise": [0, 206, 209],
"darkviolet": [148, 0, 211],
"deeppink": [255, 20, 147],
"deepskyblue": [0, 191, 255],
"dimgray": [105, 105, 105],
"dimgrey": [105, 105, 105],
"dodgerblue": [30, 144, 255],
"firebrick": [178, 34, 34],
"floralwhite": [255, 250, 240],
"forestgreen": [34, 139, 34],
"fuchsia": [255, 0, 255],
"gainsboro": [220, 220, 220],
"ghostwhite": [248, 248, 255],
"gold": [255, 215, 0],
"goldenrod": [218, 165, 32],
"gray": [128, 128, 128],
"green": [0, 128, 0],
"greenyellow": [173, 255, 47],
"grey": [128, 128, 128],
"honeydew": [240, 255, 240],
"hotpink": [255, 105, 180],
"indianred": [205, 92, 92],
"indigo": [75, 0, 130],
"ivory": [255, 255, 240],
"khaki": [240, 230, 140],
"lavender": [230, 230, 250],
"lavenderblush": [255, 240, 245],
"lawngreen": [124, 252, 0],
"lemonchiffon": [255, 250, 205],
"lightblue": [173, 216, 230],
"lightcoral": [240, 128, 128],
"lightcyan": [224, 255, 255],
"lightgoldenrodyellow": [250, 250, 210],
"lightgray": [211, 211, 211],
"lightgreen": [144, 238, 144],
"lightgrey": [211, 211, 211],
"lightpink": [255, 182, 193],
"lightsalmon": [255, 160, 122],
"lightseagreen": [32, 178, 170],
"lightskyblue": [135, 206, 250],
"lightslategray": [119, 136, 153],
"lightslategrey": [119, 136, 153],
"lightsteelblue": [176, 196, 222],
"lightyellow": [255, 255, 224],
"lime": [0, 255, 0],
"limegreen": [50, 205, 50],
"linen": [250, 240, 230],
"magenta": [255, 0, 255],
"maroon": [128, 0, 0],
"mediumaquamarine": [102, 205, 170],
"mediumblue": [0, 0, 205],
"mediumorchid": [186, 85, 211],
"mediumpurple": [147, 112, 219],
"mediumseagreen": [60, 179, 113],
"mediumslateblue": [123, 104, 238],
"mediumspringgreen": [0, 250, 154],
"mediumturquoise": [72, 209, 204],
"mediumvioletred": [199, 21, 133],
"midnightblue": [25, 25, 112],
"mintcream": [245, 255, 250],
"mistyrose": [255, 228, 225],
"moccasin": [255, 228, 181],
"navajowhite": [255, 222, 173],
"navy": [0, 0, 128],
"oldlace": [253, 245, 230],
"olive": [128, 128, 0],
"olivedrab": [107, 142, 35],
"orange": [255, 165, 0],
"orangered": [255, 69, 0],
"orchid": [218, 112, 214],
"palegoldenrod": [238, 232, 170],
"palegreen": [152, 251, 152],
"paleturquoise": [175, 238, 238],
"palevioletred": [219, 112, 147],
"papayawhip": [255, 239, 213],
"peachpuff": [255, 218, 185],
"peru": [205, 133, 63],
"pink": [255, 192, 203],
"plum": [221, 160, 221],
"powderblue": [176, 224, 230],
"purple": [128, 0, 128],
"rebeccapurple": [102, 51, 153],
"red": [255, 0, 0],
"rosybrown": [188, 143, 143],
"royalblue": [65, 105, 225],
"saddlebrown": [139, 69, 19],
"salmon": [250, 128, 114],
"sandybrown": [244, 164, 96],
"seagreen": [46, 139, 87],
"seashell": [255, 245, 238],
"sienna": [160, 82, 45],
"silver": [192, 192, 192],
"skyblue": [135, 206, 235],
"slateblue": [106, 90, 205],
"slategray": [112, 128, 144],
"slategrey": [112, 128, 144],
"snow": [255, 250, 250],
"springgreen": [0, 255, 127],
"steelblue": [70, 130, 180],
"tan": [210, 180, 140],
"teal": [0, 128, 128],
"thistle": [216, 191, 216],
"tomato": [255, 99, 71],
"turquoise": [64, 224, 208],
"violet": [238, 130, 238],
"wheat": [245, 222, 179],
"white": [255, 255, 255],
"whitesmoke": [245, 245, 245],
"yellow": [255, 255, 0],
"yellowgreen": [154, 205, 50]
};
var simpleSwizzle = { exports: {} };
var isArrayish$1 = function isArrayish2(obj) {
if (!obj || typeof obj === "string") {
return false;
}
return obj instanceof Array || Array.isArray(obj) || obj.length >= 0 && (obj.splice instanceof Function || Object.getOwnPropertyDescriptor(obj, obj.length - 1) && obj.constructor.name !== "String");
};
var isArrayish = isArrayish$1;
var concat = Array.prototype.concat;
var slice = Array.prototype.slice;
var swizzle$1 = simpleSwizzle.exports = function swizzle2(args) {
var results = [];
for (var i2 = 0, len = args.length; i2 < len; i2++) {
var arg = args[i2];
if (isArrayish(arg)) {
results = concat.call(results, slice.call(arg));
} else {
results.push(arg);
}
}
return results;
};
swizzle$1.wrap = function(fn) {
return function() {
return fn(swizzle$1(arguments));
};
};
var colorNames = colorName;
var swizzle = simpleSwizzle.exports;
var hasOwnProperty$3 = Object.hasOwnProperty;
var reverseNames = /* @__PURE__ */ Object.create(null);
for (var name in colorNames) {
if (hasOwnProperty$3.call(colorNames, name)) {
reverseNames[colorNames[name]] = name;
}
}
var cs = colorString$1.exports = {
to: {},
get: {}
};
cs.get = function(string2) {
var prefix = string2.substring(0, 3).toLowerCase();
var val;
var model2;
switch (prefix) {
case "hsl":
val = cs.get.hsl(string2);
model2 = "hsl";
break;
case "hwb":
val = cs.get.hwb(string2);
model2 = "hwb";
break;
default:
val = cs.get.rgb(string2);
model2 = "rgb";
break;
}
if (!val) {
return null;
}
return { model: model2, value: val };
};
cs.get.rgb = function(string2) {
if (!string2) {
return null;
}
var abbr = /^#([a-f0-9]{3,4})$/i;
var hex = /^#([a-f0-9]{6})([a-f0-9]{2})?$/i;
var rgba = /^rgba?\(\s*([+-]?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?\d+)\s*(?:[,|\/]\s*([+-]?[\d\.]+)(%?)\s*)?\)$/;
var per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,?\s*([+-]?[\d\.]+)\%\s*,?\s*([+-]?[\d\.]+)\%\s*(?:[,|\/]\s*([+-]?[\d\.]+)(%?)\s*)?\)$/;
var keyword = /^(\w+)$/;
var rgb = [0, 0, 0, 1];
var match2;
var i2;
var hexAlpha;
if (match2 = string2.match(hex)) {
hexAlpha = match2[2];
match2 = match2[1];
for (i2 = 0; i2 < 3; i2++) {
var i22 = i2 * 2;
rgb[i2] = parseInt(match2.slice(i22, i22 + 2), 16);
}
if (hexAlpha) {
rgb[3] = parseInt(hexAlpha, 16) / 255;
}
} else if (match2 = string2.match(abbr)) {
match2 = match2[1];
hexAlpha = match2[3];
for (i2 = 0; i2 < 3; i2++) {
rgb[i2] = parseInt(match2[i2] + match2[i2], 16);
}
if (hexAlpha) {
rgb[3] = parseInt(hexAlpha + hexAlpha, 16) / 255;
}
} else if (match2 = string2.match(rgba)) {
for (i2 = 0; i2 < 3; i2++) {
rgb[i2] = parseInt(match2[i2 + 1], 0);
}
if (match2[4]) {
if (match2[5]) {
rgb[3] = parseFloat(match2[4]) * 0.01;
} else {
rgb[3] = parseFloat(match2[4]);
}
}
} else if (match2 = string2.match(per)) {
for (i2 = 0; i2 < 3; i2++) {
rgb[i2] = Math.round(parseFloat(match2[i2 + 1]) * 2.55);
}
if (match2[4]) {
if (match2[5]) {
rgb[3] = parseFloat(match2[4]) * 0.01;
} else {
rgb[3] = parseFloat(match2[4]);
}
}
} else if (match2 = string2.match(keyword)) {
if (match2[1] === "transparent") {
return [0, 0, 0, 0];
}
if (!hasOwnProperty$3.call(colorNames, match2[1])) {
return null;
}
rgb = colorNames[match2[1]];
rgb[3] = 1;
return rgb;
} else {
return null;
}
for (i2 = 0; i2 < 3; i2++) {
rgb[i2] = clamp(rgb[i2], 0, 255);
}
rgb[3] = clamp(rgb[3], 0, 1);
return rgb;
};
cs.get.hsl = function(string2) {
if (!string2) {
return null;
}
var hsl = /^hsla?\(\s*([+-]?(?:\d{0,3}\.)?\d+)(?:deg)?\s*,?\s*([+-]?[\d\.]+)%\s*,?\s*([+-]?[\d\.]+)%\s*(?:[,|\/]\s*([+-]?(?=\.\d|\d)(?:0|[1-9]\d*)?(?:\.\d*)?(?:[eE][+-]?\d+)?)\s*)?\)$/;
var match2 = string2.match(hsl);
if (match2) {
var alpha = parseFloat(match2[4]);
var h2 = (parseFloat(match2[1]) % 360 + 360) % 360;
var s = clamp(parseFloat(match2[2]), 0, 100);
var l2 = clamp(parseFloat(match2[3]), 0, 100);
var a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1);
return [h2, s, l2, a];
}
return null;
};
cs.get.hwb = function(string2) {
if (!string2) {
return null;
}
var hwb = /^hwb\(\s*([+-]?\d{0,3}(?:\.\d+)?)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?(?=\.\d|\d)(?:0|[1-9]\d*)?(?:\.\d*)?(?:[eE][+-]?\d+)?)\s*)?\)$/;
var match2 = string2.match(hwb);
if (match2) {
var alpha = parseFloat(match2[4]);
var h2 = (parseFloat(match2[1]) % 360 + 360) % 360;
var w2 = clamp(parseFloat(match2[2]), 0, 100);
var b2 = clamp(parseFloat(match2[3]), 0, 100);
var a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1);
return [h2, w2, b2, a];
}
return null;
};
cs.to.hex = function() {
var rgba = swizzle(arguments);
return "#" + hexDouble(rgba[0]) + hexDouble(rgba[1]) + hexDouble(rgba[2]) + (rgba[3] < 1 ? hexDouble(Math.round(rgba[3] * 255)) : "");
};
cs.to.rgb = function() {
var rgba = swizzle(arguments);
return rgba.length < 4 || rgba[3] === 1 ? "rgb(" + Math.round(rgba[0]) + ", " + Math.round(rgba[1]) + ", " + Math.round(rgba[2]) + ")" : "rgba(" + Math.round(rgba[0]) + ", " + Math.round(rgba[1]) + ", " + Math.round(rgba[2]) + ", " + rgba[3] + ")";
};
cs.to.rgb.percent = function() {
var rgba = swizzle(arguments);
var r2 = Math.round(rgba[0] / 255 * 100);
var g2 = Math.round(rgba[1] / 255 * 100);
var b2 = Math.round(rgba[2] / 255 * 100);
return rgba.length < 4 || rgba[3] === 1 ? "rgb(" + r2 + "%, " + g2 + "%, " + b2 + "%)" : "rgba(" + r2 + "%, " + g2 + "%, " + b2 + "%, " + rgba[3] + ")";
};
cs.to.hsl = function() {
var hsla = swizzle(arguments);
return hsla.length < 4 || hsla[3] === 1 ? "hsl(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%)" : "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, " + hsla[3] + ")";
};
cs.to.hwb = function() {
var hwba = swizzle(arguments);
var a = "";
if (hwba.length >= 4 && hwba[3] !== 1) {
a = ", " + hwba[3];
}
return "hwb(" + hwba[0] + ", " + hwba[1] + "%, " + hwba[2] + "%" + a + ")";
};
cs.to.keyword = function(rgb) {
return reverseNames[rgb.slice(0, 3)];
};
function clamp(num, min, max) {
return Math.min(Math.max(min, num), max);
}
function hexDouble(num) {
var str = Math.round(num).toString(16).toUpperCase();
return str.length < 2 ? "0" + str : str;
}
var conversions$2 = { exports: {} };
var cssKeywords = colorName;
var reverseKeywords = {};
for (var key in cssKeywords) {
if (cssKeywords.hasOwnProperty(key)) {
reverseKeywords[cssKeywords[key]] = key;
}
}
var convert$2 = conversions$2.exports = {
rgb: { channels: 3, labels: "rgb" },
hsl: { channels: 3, labels: "hsl" },
hsv: { channels: 3, labels: "hsv" },
hwb: { channels: 3, labels: "hwb" },
cmyk: { channels: 4, labels: "cmyk" },
xyz: { channels: 3, labels: "xyz" },
lab: { channels: 3, labels: "lab" },
lch: { channels: 3, labels: "lch" },
hex: { channels: 1, labels: ["hex"] },
keyword: { channels: 1, labels: ["keyword"] },
ansi16: { channels: 1, labels: ["ansi16"] },
ansi256: { channels: 1, labels: ["ansi256"] },
hcg: { channels: 3, labels: ["h", "c", "g"] },
apple: { channels: 3, labels: ["r16", "g16", "b16"] },
gray: { channels: 1, labels: ["gray"] }
};
for (var model in convert$2) {
if (convert$2.hasOwnProperty(model)) {
if (!("channels" in convert$2[model])) {
throw new Error("missing channels property: " + model);
}
if (!("labels" in convert$2[model])) {
throw new Error("missing channel labels property: " + model);
}
if (convert$2[model].labels.length !== convert$2[model].channels) {
throw new Error("channel and label counts mismatch: " + model);
}
var channels = convert$2[model].channels;
var labels = convert$2[model].labels;
delete convert$2[model].channels;
delete convert$2[model].labels;
Object.defineProperty(convert$2[model], "channels", { value: channels });
Object.defineProperty(convert$2[model], "labels", { value: labels });
}
}
convert$2.rgb.hsl = function(rgb) {
var r2 = rgb[0] / 255;
var g2 = rgb[1] / 255;
var b2 = rgb[2] / 255;
var min = Math.min(r2, g2, b2);
var max = Math.max(r2, g2, b2);
var delta = max - min;
var h2;
var s;
var l2;
if (max === min) {
h2 = 0;
} else if (r2 === max) {
h2 = (g2 - b2) / delta;
} else if (g2 === max) {
h2 = 2 + (b2 - r2) / delta;
} else if (b2 === max) {
h2 = 4 + (r2 - g2) / delta;
}
h2 = Math.min(h2 * 60, 360);
if (h2 < 0) {
h2 += 360;
}
l2 = (min + max) / 2;
if (max === min) {
s = 0;
} else if (l2 <= 0.5) {
s = delta / (max + min);
} else {
s = delta / (2 - max - min);
}
return [h2, s * 100, l2 * 100];
};
convert$2.rgb.hsv = function(rgb) {
var rdif;
var gdif;
var bdif;
var h2;
var s;
var r2 = rgb[0] / 255;
var g2 = rgb[1] / 255;
var b2 = rgb[2] / 255;
var v2 = Math.max(r2, g2, b2);
var diff = v2 - Math.min(r2, g2, b2);
var diffc = function(c2) {
return (v2 - c2) / 6 / diff + 1 / 2;
};
if (diff === 0) {
h2 = s = 0;
} else {
s = diff / v2;
rdif = diffc(r2);
gdif = diffc(g2);
bdif = diffc(b2);
if (r2 === v2) {
h2 = bdif - gdif;
} else if (g2 === v2) {
h2 = 1 / 3 + rdif - bdif;
} else if (b2 === v2) {
h2 = 2 / 3 + gdif - rdif;
}
if (h2 < 0) {
h2 += 1;
} else if (h2 > 1) {
h2 -= 1;
}
}
return [
h2 * 360,
s * 100,
v2 * 100
];
};
convert$2.rgb.hwb = function(rgb) {
var r2 = rgb[0];
var g2 = rgb[1];
var b2 = rgb[2];
var h2 = convert$2.rgb.hsl(rgb)[0];
var w2 = 1 / 255 * Math.min(r2, Math.min(g2, b2));
b2 = 1 - 1 / 255 * Math.max(r2, Math.max(g2, b2));
return [h2, w2 * 100, b2 * 100];
};
convert$2.rgb.cmyk = function(rgb) {
var r2 = rgb[0] / 255;
var g2 = rgb[1] / 255;
var b2 = rgb[2] / 255;
var c2;
var m2;
var y2;
var k2;
k2 = Math.min(1 - r2, 1 - g2, 1 - b2);
c2 = (1 - r2 - k2) / (1 - k2) || 0;
m2 = (1 - g2 - k2) / (1 - k2) || 0;
y2 = (1 - b2 - k2) / (1 - k2) || 0;
return [c2 * 100, m2 * 100, y2 * 100, k2 * 100];
};
function comparativeDistance(x2, y2) {
return Math.pow(x2[0] - y2[0], 2) + Math.pow(x2[1] - y2[1], 2) + Math.pow(x2[2] - y2[2], 2);
}
convert$2.rgb.keyword = function(rgb) {
var reversed = reverseKeywords[rgb];
if (reversed) {
return reversed;
}
var currentClosestDistance = Infinity;
var currentClosestKeyword;
for (var keyword in cssKeywords) {
if (cssKeywords.hasOwnProperty(keyword)) {
var value = cssKeywords[keyword];
var distance = comparativeDistance(rgb, value);
if (distance < currentClosestDistance) {
currentClosestDistance = distance;
currentClosestKeyword = keyword;
}
}
}
return currentClosestKeyword;
};
convert$2.keyword.rgb = function(keyword) {
return cssKeywords[keyword];
};
convert$2.rgb.xyz = function(rgb) {
var r2 = rgb[0] / 255;
var g2 = rgb[1] / 255;
var b2 = rgb[2] / 255;
r2 = r2 > 0.04045 ? Math.pow((r2 + 0.055) / 1.055, 2.4) : r2 / 12.92;
g2 = g2 > 0.04045 ? Math.pow((g2 + 0.055) / 1.055, 2.4) : g2 / 12.92;
b2 = b2 > 0.04045 ? Math.pow((b2 + 0.055) / 1.055, 2.4) : b2 / 12.92;
var x2 = r2 * 0.4124 + g2 * 0.3576 + b2 * 0.1805;
var y2 = r2 * 0.2126 + g2 * 0.7152 + b2 * 0.0722;
var z2 = r2 * 0.0193 + g2 * 0.1192 + b2 * 0.9505;
return [x2 * 100, y2 * 100, z2 * 100];
};
convert$2.rgb.lab = function(rgb) {
var xyz = convert$2.rgb.xyz(rgb);
var x2 = xyz[0];
var y2 = xyz[1];
var z2 = xyz[2];
var l2;
var a;
var b2;
x2 /= 95.047;
y2 /= 100;
z2 /= 108.883;
x2 = x2 > 8856e-6 ? Math.pow(x2, 1 / 3) : 7.787 * x2 + 16 / 116;
y2 = y2 > 8856e-6 ? Math.pow(y2, 1 / 3) : 7.787 * y2 + 16 / 116;
z2 = z2 > 8856e-6 ? Math.pow(z2, 1 / 3) : 7.787 * z2 + 16 / 116;
l2 = 116 * y2 - 16;
a = 500 * (x2 - y2);
b2 = 200 * (y2 - z2);
return [l2, a, b2];
};
convert$2.hsl.rgb = function(hsl) {
var h2 = hsl[0] / 360;
var s = hsl[1] / 100;
var l2 = hsl[2] / 100;
var t1;
var t2;
var t3;
var rgb;
var val;
if (s === 0) {
val = l2 * 255;
return [val, val, val];
}
if (l2 < 0.5) {
t2 = l2 * (1 + s);
} else {
t2 = l2 + s - l2 * s;
}
t1 = 2 * l2 - t2;
rgb = [0, 0, 0];
for (var i2 = 0; i2 < 3; i2++) {
t3 = h2 + 1 / 3 * -(i2 - 1);
if (t3 < 0) {
t3++;
}
if (t3 > 1) {
t3--;
}
if (6 * t3 < 1) {
val = t1 + (t2 - t1) * 6 * t3;
} else if (2 * t3 < 1) {
val = t2;
} else if (3 * t3 < 2) {
val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
} else {
val = t1;
}
rgb[i2] = val * 255;
}
return rgb;
};
convert$2.hsl.hsv = function(hsl) {
var h2 = hsl[0];
var s = hsl[1] / 100;
var l2 = hsl[2] / 100;
var smin = s;
var lmin = Math.max(l2, 0.01);
var sv;
var v2;
l2 *= 2;
s *= l2 <= 1 ? l2 : 2 - l2;
smin *= lmin <= 1 ? lmin : 2 - lmin;
v2 = (l2 + s) / 2;
sv = l2 === 0 ? 2 * smin / (lmin + smin) : 2 * s / (l2 + s);
return [h2, sv * 100, v2 * 100];
};
convert$2.hsv.rgb = function(hsv) {
var h2 = hsv[0] / 60;
var s = hsv[1] / 100;
var v2 = hsv[2] / 100;
var hi = Math.floor(h2) % 6;
var f2 = h2 - Math.floor(h2);
var p2 = 255 * v2 * (1 - s);
var q2 = 255 * v2 * (1 - s * f2);
var t2 = 255 * v2 * (1 - s * (1 - f2));
v2 *= 255;
switch (hi) {
case 0:
return [v2, t2, p2];
case 1:
return [q2, v2, p2];
case 2:
return [p2, v2, t2];
case 3:
return [p2, q2, v2];
case 4:
return [t2, p2, v2];
case 5:
return [v2, p2, q2];
}
};
convert$2.hsv.hsl = function(hsv) {
var h2 = hsv[0];
var s = hsv[1] / 100;
var v2 = hsv[2] / 100;
var vmin = Math.max(v2, 0.01);
var lmin;
var sl;
var l2;
l2 = (2 - s) * v2;
lmin = (2 - s) * vmin;
sl = s * vmin;
sl /= lmin <= 1 ? lmin : 2 - lmin;
sl = sl || 0;
l2 /= 2;
return [h2, sl * 100, l2 * 100];
};
convert$2.hwb.rgb = function(hwb) {
var h2 = hwb[0] / 360;
var wh = hwb[1] / 100;
var bl = hwb[2] / 100;
var ratio = wh + bl;
var i2;
var v2;
var f2;
var n2;
if (ratio > 1) {
wh /= ratio;
bl /= ratio;
}
i2 = Math.floor(6 * h2);
v2 = 1 - bl;
f2 = 6 * h2 - i2;
if ((i2 & 1) !== 0) {
f2 = 1 - f2;
}
n2 = wh + f2 * (v2 - wh);
var r2;
var g2;
var b2;
switch (i2) {
default:
case 6:
case 0:
r2 = v2;
g2 = n2;
b2 = wh;
break;
case 1:
r2 = n2;
g2 = v2;
b2 = wh;
break;
case 2:
r2 = wh;
g2 = v2;
b2 = n2;
break;
case 3:
r2 = wh;
g2 = n2;
b2 = v2;
break;
case 4:
r2 = n2;
g2 = wh;
b2 = v2;
break;
case 5:
r2 = v2;
g2 = wh;
b2 = n2;
break;
}
return [r2 * 255, g2 * 255, b2 * 255];
};
convert$2.cmyk.rgb = function(cmyk) {
var c2 = cmyk[0] / 100;
var m2 = cmyk[1] / 100;
var y2 = cmyk[2] / 100;
var k2 = cmyk[3] / 100;
var r2;
var g2;
var b2;
r2 = 1 - Math.min(1, c2 * (1 - k2) + k2);
g2 = 1 - Math.min(1, m2 * (1 - k2) + k2);
b2 = 1 - Math.min(1, y2 * (1 - k2) + k2);
return [r2 * 255, g2 * 255, b2 * 255];
};
convert$2.xyz.rgb = function(xyz) {
var x2 = xyz[0] / 100;
var y2 = xyz[1] / 100;
var z2 = xyz[2] / 100;
var r2;
var g2;
var b2;
r2 = x2 * 3.2406 + y2 * -1.5372 + z2 * -0.4986;
g2 = x2 * -0.9689 + y2 * 1.8758 + z2 * 0.0415;
b2 = x2 * 0.0557 + y2 * -0.204 + z2 * 1.057;
r2 = r2 > 31308e-7 ? 1.055 * Math.pow(r2, 1 / 2.4) - 0.055 : r2 * 12.92;
g2 = g2 > 31308e-7 ? 1.055 * Math.pow(g2, 1 / 2.4) - 0.055 : g2 * 12.92;
b2 = b2 > 31308e-7 ? 1.055 * Math.pow(b2, 1 / 2.4) - 0.055 : b2 * 12.92;
r2 = Math.min(Math.max(0, r2), 1);
g2 = Math.min(Math.max(0, g2), 1);
b2 = Math.min(Math.max(0, b2), 1);
return [r2 * 255, g2 * 255, b2 * 255];
};
convert$2.xyz.lab = function(xyz) {
var x2 = xyz[0];
var y2 = xyz[1];
var z2 = xyz[2];
var l2;
var a;
var b2;
x2 /= 95.047;
y2 /= 100;
z2 /= 108.883;
x2 = x2 > 8856e-6 ? Math.pow(x2, 1 / 3) : 7.787 * x2 + 16 / 116;
y2 = y2 > 8856e-6 ? Math.pow(y2, 1 / 3) : 7.787 * y2 + 16 / 116;
z2 = z2 > 8856e-6 ? Math.pow(z2, 1 / 3) : 7.787 * z2 + 16 / 116;
l2 = 116 * y2 - 16;
a = 500 * (x2 - y2);
b2 = 200 * (y2 - z2);
return [l2, a, b2];
};
convert$2.lab.xyz = function(lab) {
var l2 = lab[0];
var a = lab[1];
var b2 = lab[2];
var x2;
var y2;
var z2;
y2 = (l2 + 16) / 116;
x2 = a / 500 + y2;
z2 = y2 - b2 / 200;
var y22 = Math.pow(y2, 3);
var x22 = Math.pow(x2, 3);
var z22 = Math.pow(z2, 3);
y2 = y22 > 8856e-6 ? y22 : (y2 - 16 / 116) / 7.787;
x2 = x22 > 8856e-6 ? x22 : (x2 - 16 / 116) / 7.787;
z2 = z22 > 8856e-6 ? z22 : (z2 - 16 / 116) / 7.787;
x2 *= 95.047;
y2 *= 100;
z2 *= 108.883;
return [x2, y2, z2];
};
convert$2.lab.lch = function(lab) {
var l2 = lab[0];
var a = lab[1];
var b2 = lab[2];
var hr;
var h2;
var c2;
hr = Math.atan2(b2, a);
h2 = hr * 360 / 2 / Math.PI;
if (h2 < 0) {
h2 += 360;
}
c2 = Math.sqrt(a * a + b2 * b2);
return [l2, c2, h2];
};
convert$2.lch.lab = function(lch) {
var l2 = lch[0];
var c2 = lch[1];
var h2 = lch[2];
var a;
var b2;
var hr;
hr = h2 / 360 * 2 * Math.PI;
a = c2 * Math.cos(hr);
b2 = c2 * Math.sin(hr);
return [l2, a, b2];
};
convert$2.rgb.ansi16 = function(args) {
var r2 = args[0];
var g2 = args[1];
var b2 = args[2];
var value = 1 in arguments ? arguments[1] : convert$2.rgb.hsv(args)[2];
value = Math.round(value / 50);
if (value === 0) {
return 30;
}
var ansi = 30 + (Math.round(b2 / 255) << 2 | Math.round(g2 / 255) << 1 | Math.round(r2 / 255));
if (value === 2) {
ansi += 60;
}
return ansi;
};
convert$2.hsv.ansi16 = function(args) {
return convert$2.rgb.ansi16(convert$2.hsv.rgb(args), args[2]);
};
convert$2.rgb.ansi256 = function(args) {
var r2 = args[0];
var g2 = args[1];
var b2 = args[2];
if (r2 === g2 && g2 === b2) {
if (r2 < 8) {
return 16;
}
if (r2 > 248) {
return 231;
}
return Math.round((r2 - 8) / 247 * 24) + 232;
}
var ansi = 16 + 36 * Math.round(r2 / 255 * 5) + 6 * Math.round(g2 / 255 * 5) + Math.round(b2 / 255 * 5);
return ansi;
};
convert$2.ansi16.rgb = function(args) {
var color2 = args % 10;
if (color2 === 0 || color2 === 7) {
if (args > 50) {
color2 += 3.5;
}
color2 = color2 / 10.5 * 255;
return [color2, color2, color2];
}
var mult = (~~(args > 50) + 1) * 0.5;
var r2 = (color2 & 1) * mult * 255;
var g2 = (color2 >> 1 & 1) * mult * 255;
var b2 = (color2 >> 2 & 1) * mult * 255;
return [r2, g2, b2];
};
convert$2.ansi256.rgb = function(args) {
if (args >= 232) {
var c2 = (args - 232) * 10 + 8;
return [c2, c2, c2];
}
args -= 16;
var rem;
var r2 = Math.floor(args / 36) / 5 * 255;
var g2 = Math.floor((rem = args % 36) / 6) / 5 * 255;
var b2 = rem % 6 / 5 * 255;
return [r2, g2, b2];
};
convert$2.rgb.hex = function(args) {
var integer2 = ((Math.round(args[0]) & 255) << 16) + ((Math.round(args[1]) & 255) << 8) + (Math.round(args[2]) & 255);
var string2 = integer2.toString(16).toUpperCase();
return "000000".substring(string2.length) + string2;
};
convert$2.hex.rgb = function(args) {
var match2 = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);
if (!match2) {
return [0, 0, 0];
}
var colorString2 = match2[0];
if (match2[0].length === 3) {
colorString2 = colorString2.split("").map(function(char) {
return char + char;
}).join("");
}
var integer2 = parseInt(colorString2, 16);
var r2 = integer2 >> 16 & 255;
var g2 = integer2 >> 8 & 255;
var b2 = integer2 & 255;
return [r2, g2, b2];
};
convert$2.rgb.hcg = function(rgb) {
var r2 = rgb[0] / 255;
var g2 = rgb[1] / 255;
var b2 = rgb[2] / 255;
var max = Math.max(Math.max(r2, g2), b2);
var min = Math.min(Math.min(r2, g2), b2);
var chroma = max - min;
var grayscale;
var hue;
if (chroma < 1) {
grayscale = min / (1 - chroma);
} else {
grayscale = 0;
}
if (chroma <= 0) {
hue = 0;
} else if (max === r2) {
hue = (g2 - b2) / chroma % 6;
} else if (max === g2) {
hue = 2 + (b2 - r2) / chroma;
} else {
hue = 4 + (r2 - g2) / chroma + 4;
}
hue /= 6;
hue %= 1;
return [hue * 360, chroma * 100, grayscale * 100];
};
convert$2.hsl.hcg = function(hsl) {
var s = hsl[1] / 100;
var l2 = hsl[2] / 100;
var c2 = 1;
var f2 = 0;
if (l2 < 0.5) {
c2 = 2 * s * l2;
} else {
c2 = 2 * s * (1 - l2);
}
if (c2 < 1) {
f2 = (l2 - 0.5 * c2) / (1 - c2);
}
return [hsl[0], c2 * 100, f2 * 100];
};
convert$2.hsv.hcg = function(hsv) {
var s = hsv[1] / 100;
var v2 = hsv[2] / 100;
var c2 = s * v2;
var f2 = 0;
if (c2 < 1) {
f2 = (v2 - c2) / (1 - c2);
}
return [hsv[0], c2 * 100, f2 * 100];
};
convert$2.hcg.rgb = function(hcg) {
var h2 = hcg[0] / 360;
var c2 = hcg[1] / 100;
var g2 = hcg[2] / 100;
if (c2 === 0) {
return [g2 * 255, g2 * 255, g2 * 255];
}
var pure = [0, 0, 0];
var hi = h2 % 1 * 6;
var v2 = hi % 1;
var w2 = 1 - v2;
var mg = 0;
switch (Math.floor(hi)) {
case 0:
pure[0] = 1;
pure[1] = v2;
pure[2] = 0;
break;
case 1:
pure[0] = w2;
pure[1] = 1;
pure[2] = 0;
break;
case 2:
pure[0] = 0;
pure[1] = 1;
pure[2] = v2;
break;
case 3:
pure[0] = 0;
pure[1] = w2;
pure[2] = 1;
break;
case 4:
pure[0] = v2;
pure[1] = 0;
pure[2] = 1;
break;
default:
pure[0] = 1;
pure[1] = 0;
pure[2] = w2;
}
mg = (1 - c2) * g2;
return [
(c2 * pure[0] + mg) * 255,
(c2 * pure[1] + mg) * 255,
(c2 * pure[2] + mg) * 255
];
};
convert$2.hcg.hsv = function(hcg) {
var c2 = hcg[1] / 100;
var g2 = hcg[2] / 100;
var v2 = c2 + g2 * (1 - c2);
var f2 = 0;
if (v2 > 0) {
f2 = c2 / v2;
}
return [hcg[0], f2 * 100, v2 * 100];
};
convert$2.hcg.hsl = function(hcg) {
var c2 = hcg[1] / 100;
var g2 = hcg[2] / 100;
var l2 = g2 * (1 - c2) + 0.5 * c2;
var s = 0;
if (l2 > 0 && l2 < 0.5) {
s = c2 / (2 * l2);
} else if (l2 >= 0.5 && l2 < 1) {
s = c2 / (2 * (1 - l2));
}
return [hcg[0], s * 100, l2 * 100];
};
convert$2.hcg.hwb = function(hcg) {
var c2 = hcg[1] / 100;
var g2 = hcg[2] / 100;
var v2 = c2 + g2 * (1 - c2);
return [hcg[0], (v2 - c2) * 100, (1 - v2) * 100];
};
convert$2.hwb.hcg = function(hwb) {
var w2 = hwb[1] / 100;
var b2 = hwb[2] / 100;
var v2 = 1 - b2;
var c2 = v2 - w2;
var g2 = 0;
if (c2 < 1) {
g2 = (v2 - c2) / (1 - c2);
}
return [hwb[0], c2 * 100, g2 * 100];
};
convert$2.apple.rgb = function(apple) {
return [apple[0] / 65535 * 255, apple[1] / 65535 * 255, apple[2] / 65535 * 255];
};
convert$2.rgb.apple = function(rgb) {
return [rgb[0] / 255 * 65535, rgb[1] / 255 * 65535, rgb[2] / 255 * 65535];
};
convert$2.gray.rgb = function(args) {
return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];
};
convert$2.gray.hsl = convert$2.gray.hsv = function(args) {
return [0, 0, args[0]];
};
convert$2.gray.hwb = function(gray) {
return [0, 100, gray[0]];
};
convert$2.gray.cmyk = function(gray) {
return [0, 0, 0, gray[0]];
};
convert$2.gray.lab = function(gray) {
return [gray[0], 0, 0];
};
convert$2.gray.hex = function(gray) {
var val = Math.round(gray[0] / 100 * 255) & 255;
var integer2 = (val << 16) + (val << 8) + val;
var string2 = integer2.toString(16).toUpperCase();
return "000000".substring(string2.length) + string2;
};
convert$2.rgb.gray = function(rgb) {
var val = (rgb[0] + rgb[1] + rgb[2]) / 3;
return [val / 255 * 100];
};
var conversions$1 = conversions$2.exports;
function buildGraph() {
var graph = {};
var models2 = Object.keys(conversions$1);
for (var len = models2.length, i2 = 0; i2 < len; i2++) {
graph[models2[i2]] = {
distance: -1,
parent: null
};
}
return graph;
}
function deriveBFS(fromModel) {
var graph = buildGraph();
var queue = [fromModel];
graph[fromModel].distance = 0;
while (queue.length) {
var current = queue.pop();
var adjacents = Object.keys(conversions$1[current]);
for (var len = adjacents.length, i2 = 0; i2 < len; i2++) {
var adjacent = adjacents[i2];
var node = graph[adjacent];
if (node.distance === -1) {
node.distance = graph[current].distance + 1;
node.parent = current;
queue.unshift(adjacent);
}
}
}
return graph;
}
function link(from, to) {
return function(args) {
return to(from(args));
};
}
function wrapConversion(toModel, graph) {
var path2 = [graph[toModel].parent, toModel];
var fn = conversions$1[graph[toModel].parent][toModel];
var cur = graph[toModel].parent;
while (graph[cur].parent) {
path2.unshift(graph[cur].parent);
fn = link(conversions$1[graph[cur].parent][cur], fn);
cur = graph[cur].parent;
}
fn.conversion = path2;
return fn;
}
var route$1 = function(fromModel) {
var graph = deriveBFS(fromModel);
var conversion = {};
var models2 = Object.keys(graph);
for (var len = models2.length, i2 = 0; i2 < len; i2++) {
var toModel = models2[i2];
var node = graph[toModel];
if (node.parent === null) {
continue;
}
conversion[toModel] = wrapConversion(toModel, graph);
}
return conversion;
};
var conversions = conversions$2.exports;
var route = route$1;
var convert$1 = {};
var models = Object.keys(conversions);
function wrapRaw(fn) {
var wrappedFn = function(args) {
if (args === void 0 || args === null) {
return args;
}
if (arguments.length > 1) {
args = Array.prototype.slice.call(arguments);
}
return fn(args);
};
if ("conversion" in fn) {
wrappedFn.conversion = fn.conversion;
}
return wrappedFn;
}
function wrapRounded(fn) {
var wrappedFn = function(args) {
if (args === void 0 || args === null) {
return args;
}
if (arguments.length > 1) {
args = Array.prototype.slice.call(arguments);
}
var result = fn(args);
if (typeof result === "object") {
for (var len = result.length, i2 = 0; i2 < len; i2++) {
result[i2] = Math.round(result[i2]);
}
}
return result;
};
if ("conversion" in fn) {
wrappedFn.conversion = fn.conversion;
}
return wrappedFn;
}
models.forEach(function(fromModel) {
convert$1[fromModel] = {};
Object.defineProperty(convert$1[fromModel], "channels", { value: conversions[fromModel].channels });
Object.defineProperty(convert$1[fromModel], "labels", { value: conversions[fromModel].labels });
var routes = route(fromModel);
var routeModels = Object.keys(routes);
routeModels.forEach(function(toModel) {
var fn = routes[toModel];
convert$1[fromModel][toModel] = wrapRounded(fn);
convert$1[fromModel][toModel].raw = wrapRaw(fn);
});
});
var colorConvert = convert$1;
var colorString = colorString$1.exports;
var convert = colorConvert;
var _slice = [].slice;
var skippedModels = [
"keyword",
"gray",
"hex"
];
var hashedModelKeys = {};
Object.keys(convert).forEach(function(model2) {
hashedModelKeys[_slice.call(convert[model2].labels).sort().join("")] = model2;
});
var limiters = {};
function Color$1(obj, model2) {
if (!(this instanceof Color$1)) {
return new Color$1(obj, model2);
}
if (model2 && model2 in skippedModels) {
model2 = null;
}
if (model2 && !(model2 in convert)) {
throw new Error("Unknown model: " + model2);
}
var i2;
var channels2;
if (obj == null) {
this.model = "rgb";
this.color = [0, 0, 0];
this.valpha = 1;
} else if (obj instanceof Color$1) {
this.model = obj.model;
this.color = obj.color.slice();
this.valpha = obj.valpha;
} else if (typeof obj === "string") {
var result = colorString.get(obj);
if (result === null) {
throw new Error("Unable to parse color from string: " + obj);
}
this.model = result.model;
channels2 = convert[this.model].channels;
this.color = result.value.slice(0, channels2);
this.valpha = typeof result.value[channels2] === "number" ? result.value[channels2] : 1;
} else if (obj.length) {
this.model = model2 || "rgb";
channels2 = convert[this.model].channels;
var newArr = _slice.call(obj, 0, channels2);
this.color = zeroArray(newArr, channels2);
this.valpha = typeof obj[channels2] === "number" ? obj[channels2] : 1;
} else if (typeof obj === "number") {
obj &= 16777215;
this.model = "rgb";
this.color = [
obj >> 16 & 255,
obj >> 8 & 255,
obj & 255
];
this.valpha = 1;
} else {
this.valpha = 1;
var keys2 = Object.keys(obj);
if ("alpha" in obj) {
keys2.splice(keys2.indexOf("alpha"), 1);
this.valpha = typeof obj.alpha === "number" ? obj.alpha : 0;
}
var hashedKeys = keys2.sort().join("");
if (!(hashedKeys in hashedModelKeys)) {
throw new Error("Unable to parse color from object: " + JSON.stringify(obj));
}
this.model = hashedModelKeys[hashedKeys];
var labels2 = convert[this.model].labels;
var color2 = [];
for (i2 = 0; i2 < labels2.length; i2++) {
color2.push(obj[labels2[i2]]);
}
this.color = zeroArray(color2);
}
if (limiters[this.model]) {
channels2 = convert[this.model].channels;
for (i2 = 0; i2 < channels2; i2++) {
var limit = limiters[this.model][i2];
if (limit) {
this.color[i2] = limit(this.color[i2]);
}
}
}
this.valpha = Math.max(0, Math.min(1, this.valpha));
if (Object.freeze) {
Object.freeze(this);
}
}
Color$1.prototype = {
toString: function() {
return this.string();
},
toJSON: function() {
return this[this.model]();
},
string: function(places) {
var self2 = this.model in colorString.to ? this : this.rgb();
self2 = self2.round(typeof places === "number" ? places : 1);
var args = self2.valpha === 1 ? self2.color : self2.color.concat(this.valpha);
return colorString.to[self2.model](args);
},
percentString: function(places) {
var self2 = this.rgb().round(typeof places === "number" ? places : 1);
var args = self2.valpha === 1 ? self2.color : self2.color.concat(this.valpha);
return colorString.to.rgb.percent(args);
},
array: function() {
return this.valpha === 1 ? this.color.slice() : this.color.concat(this.valpha);
},
object: function() {
var result = {};
var channels2 = convert[this.model].channels;
var labels2 = convert[this.model].labels;
for (var i2 = 0; i2 < channels2; i2++) {
result[labels2[i2]] = this.color[i2];
}
if (this.valpha !== 1) {
result.alpha = this.valpha;
}
return result;
},
unitArray: function() {
var rgb = this.rgb().color;
rgb[0] /= 255;
rgb[1] /= 255;
rgb[2] /= 255;
if (this.valpha !== 1) {
rgb.push(this.valpha);
}
return rgb;
},
unitObject: function() {
var rgb = this.rgb().object();
rgb.r /= 255;
rgb.g /= 255;
rgb.b /= 255;
if (this.valpha !== 1) {
rgb.alpha = this.valpha;
}
return rgb;
},
round: function(places) {
places = Math.max(places || 0, 0);
return new Color$1(this.color.map(roundToPlace(places)).concat(this.valpha), this.model);
},
alpha: function(val) {
if (arguments.length) {
return new Color$1(this.color.concat(Math.max(0, Math.min(1, val))), this.model);
}
return this.valpha;
},
red: getset("rgb", 0, maxfn(255)),
green: getset("rgb", 1, maxfn(255)),
blue: getset("rgb", 2, maxfn(255)),
hue: getset(["hsl", "hsv", "hsl", "hwb", "hcg"], 0, function(val) {
return (val % 360 + 360) % 360;
}),
saturationl: getset("hsl", 1, maxfn(100)),
lightness: getset("hsl", 2, maxfn(100)),
saturationv: getset("hsv", 1, maxfn(100)),
value: getset("hsv", 2, maxfn(100)),
chroma: getset("hcg", 1, maxfn(100)),
gray: getset("hcg", 2, maxfn(100)),
white: getset("hwb", 1, maxfn(100)),
wblack: getset("hwb", 2, maxfn(100)),
cyan: getset("cmyk", 0, maxfn(100)),
magenta: getset("cmyk", 1, maxfn(100)),
yellow: getset("cmyk", 2, maxfn(100)),
black: getset("cmyk", 3, maxfn(100)),
x: getset("xyz", 0, maxfn(100)),
y: getset("xyz", 1, maxfn(100)),
z: getset("xyz", 2, maxfn(100)),
l: getset("lab", 0, maxfn(100)),
a: getset("lab", 1),
b: getset("lab", 2),
keyword: function(val) {
if (arguments.length) {
return new Color$1(val);
}
return convert[this.model].keyword(this.color);
},
hex: function(val) {
if (arguments.length) {
return new Color$1(val);
}
return colorString.to.hex(this.rgb().round().color);
},
rgbNumber: function() {
var rgb = this.rgb().color;
return (rgb[0] & 255) << 16 | (rgb[1] & 255) << 8 | rgb[2] & 255;
},
luminosity: function() {
var rgb = this.rgb().color;
var lum = [];
for (var i2 = 0; i2 < rgb.length; i2++) {
var chan = rgb[i2] / 255;
lum[i2] = chan <= 0.03928 ? chan / 12.92 : Math.pow((chan + 0.055) / 1.055, 2.4);
}
return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];
},
contrast: function(color2) {
var lum1 = this.luminosity();
var lum2 = color2.luminosity();
if (lum1 > lum2) {
return (lum1 + 0.05) / (lum2 + 0.05);
}
return (lum2 + 0.05) / (lum1 + 0.05);
},
level: function(color2) {
var contrastRatio = this.contrast(color2);
if (contrastRatio >= 7.1) {
return "AAA";
}
return contrastRatio >= 4.5 ? "AA" : "";
},
isDark: function() {
var rgb = this.rgb().color;
var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1e3;
return yiq < 128;
},
isLight: function() {
return !this.isDark();
},
negate: function() {
var rgb = this.rgb();
for (var i2 = 0; i2 < 3; i2++) {
rgb.color[i2] = 255 - rgb.color[i2];
}
return rgb;
},
lighten: function(ratio) {
var hsl = this.hsl();
hsl.color[2] += hsl.color[2] * ratio;
return hsl;
},
darken: function(ratio) {
var hsl = this.hsl();
hsl.color[2] -= hsl.color[2] * ratio;
return hsl;
},
saturate: function(ratio) {
var hsl = this.hsl();
hsl.color[1] += hsl.color[1] * ratio;
return hsl;
},
desaturate: function(ratio) {
var hsl = this.hsl();
hsl.color[1] -= hsl.color[1] * ratio;
return hsl;
},
whiten: function(ratio) {
var hwb = this.hwb();
hwb.color[1] += hwb.color[1] * ratio;
return hwb;
},
blacken: function(ratio) {
var hwb = this.hwb();
hwb.color[2] += hwb.color[2] * ratio;
return hwb;
},
grayscale: function() {
var rgb = this.rgb().color;
var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;
return Color$1.rgb(val, val, val);
},
fade: function(ratio) {
return this.alpha(this.valpha - this.valpha * ratio);
},
opaquer: function(ratio) {
return this.alpha(this.valpha + this.valpha * ratio);
},
rotate: function(degrees) {
var hsl = this.hsl();
var hue = hsl.color[0];
hue = (hue + degrees) % 360;
hue = hue < 0 ? 360 + hue : hue;
hsl.color[0] = hue;
return hsl;
},
mix: function(mixinColor, weight) {
if (!mixinColor || !mixinColor.rgb) {
throw new Error('Argument to "mix" was not a Color instance, but rather an instance of ' + typeof mixinColor);
}
var color1 = mixinColor.rgb();
var color2 = this.rgb();
var p2 = weight === void 0 ? 0.5 : weight;
var w2 = 2 * p2 - 1;
var a = color1.alpha() - color2.alpha();
var w1 = ((w2 * a === -1 ? w2 : (w2 + a) / (1 + w2 * a)) + 1) / 2;
var w22 = 1 - w1;
return Color$1.rgb(
w1 * color1.red() + w22 * color2.red(),
w1 * color1.green() + w22 * color2.green(),
w1 * color1.blue() + w22 * color2.blue(),
color1.alpha() * p2 + color2.alpha() * (1 - p2)
);
}
};
Object.keys(convert).forEach(function(model2) {
if (skippedModels.indexOf(model2) !== -1) {
return;
}
var channels2 = convert[model2].channels;
Color$1.prototype[model2] = function() {
if (this.model === model2) {
return new Color$1(this);
}
if (arguments.length) {
return new Color$1(arguments, model2);
}
var newAlpha = typeof arguments[channels2] === "number" ? channels2 : this.valpha;
return new Color$1(assertArray(convert[this.model][model2].raw(this.color)).concat(newAlpha), model2);
};
Color$1[model2] = function(color2) {
if (typeof color2 === "number") {
color2 = zeroArray(_slice.call(arguments), channels2);
}
return new Color$1(color2, model2);
};
});
function roundTo(num, places) {
return Number(num.toFixed(places));
}
function roundToPlace(places) {
return function(num) {
return roundTo(num, places);
};
}
function getset(model2, channel, modifier) {
model2 = Array.isArray(model2) ? model2 : [model2];
model2.forEach(function(m2) {
(limiters[m2] || (limiters[m2] = []))[channel] = modifier;
});
model2 = model2[0];
return function(val) {
var result;
if (arguments.length) {
if (modifier) {
val = modifier(val);
}
result = this[model2]();
result.color[channel] = val;
return result;
}
result = this[model2]().color[channel];
if (modifier) {
result = modifier(result);
}
return result;
};
}
function maxfn(max) {
return function(v2) {
return Math.max(0, Math.min(max, v2));
};
}
function assertArray(val) {
return Array.isArray(val) ? val : [val];
}
function zeroArray(arr, length) {
for (var i2 = 0; i2 < length; i2++) {
if (typeof arr[i2] !== "number") {
arr[i2] = 0;
}
}
return arr;
}
var color$1 = Color$1;
function _typeof$m(obj) {
"@babel/helpers - typeof";
return _typeof$m = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof$m(obj);
}
function _toConsumableArray$8(arr) {
return _arrayWithoutHoles$8(arr) || _iterableToArray$8(arr) || _unsupportedIterableToArray$h(arr) || _nonIterableSpread$8();
}
function _nonIterableSpread$8() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$h(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$h(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$h(o, minLen);
}
function _iterableToArray$8(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
return Array.from(iter);
}
function _arrayWithoutHoles$8(arr) {
if (Array.isArray(arr))
return _arrayLikeToArray$h(arr);
}
function _arrayLikeToArray$h(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _regeneratorRuntime$2() {
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
_regeneratorRuntime$2 = function _regeneratorRuntime2() {
return exports2;
};
var exports2 = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty2 = Object.defineProperty || function(obj, key2, desc) {
obj[key2] = desc.value;
}, $Symbol2 = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol2.iterator || "@@iterator", asyncIteratorSymbol = $Symbol2.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol2.toStringTag || "@@toStringTag";
function define(obj, key2, value) {
return Object.defineProperty(obj, key2, { value, enumerable: true, configurable: true, writable: true }), obj[key2];
}
try {
define({}, "");
} catch (err) {
define = function define2(obj, key2, value) {
return obj[key2] = value;
};
}
function wrap2(innerFn, outerFn, self2, tryLocsList) {
var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context2 = new Context2(tryLocsList || []);
return defineProperty2(generator, "_invoke", { value: makeInvokeMethod(innerFn, self2, context2) }), generator;
}
function tryCatch(fn, obj, arg) {
try {
return { type: "normal", arg: fn.call(obj, arg) };
} catch (err) {
return { type: "throw", arg: err };
}
}
exports2.wrap = wrap2;
var ContinueSentinel = {};
function Generator() {
}
function GeneratorFunction() {
}
function GeneratorFunctionPrototype() {
}
var IteratorPrototype2 = {};
define(IteratorPrototype2, iteratorSymbol, function() {
return this;
});
var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([])));
NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype2 = NativeIteratorPrototype);
var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype2);
function defineIteratorMethods(prototype2) {
["next", "throw", "return"].forEach(function(method2) {
define(prototype2, method2, function(arg) {
return this._invoke(method2, arg);
});
});
}
function AsyncIterator(generator, PromiseImpl) {
function invoke(method2, arg, resolve, reject) {
var record = tryCatch(generator[method2], generator, arg);
if ("throw" !== record.type) {
var result = record.arg, value = result.value;
return value && "object" == _typeof$m(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function(value2) {
invoke("next", value2, resolve, reject);
}, function(err) {
invoke("throw", err, resolve, reject);
}) : PromiseImpl.resolve(value).then(function(unwrapped) {
result.value = unwrapped, resolve(result);
}, function(error) {
return invoke("throw", error, resolve, reject);
});
}
reject(record.arg);
}
var previousPromise;
defineProperty2(this, "_invoke", { value: function value(method2, arg) {
function callInvokeWithMethodAndArg() {
return new PromiseImpl(function(resolve, reject) {
invoke(method2, arg, resolve, reject);
});
}
return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
} });
}
function makeInvokeMethod(innerFn, self2, context2) {
var state = "suspendedStart";
return function(method2, arg) {
if ("executing" === state)
throw new Error("Generator is already running");
if ("completed" === state) {
if ("throw" === method2)
throw arg;
return doneResult();
}
for (context2.method = method2, context2.arg = arg; ; ) {
var delegate = context2.delegate;
if (delegate) {
var delegateResult = maybeInvokeDelegate(delegate, context2);
if (delegateResult) {
if (delegateResult === ContinueSentinel)
continue;
return delegateResult;
}
}
if ("next" === context2.method)
context2.sent = context2._sent = context2.arg;
else if ("throw" === context2.method) {
if ("suspendedStart" === state)
throw state = "completed", context2.arg;
context2.dispatchException(context2.arg);
} else
"return" === context2.method && context2.abrupt("return", context2.arg);
state = "executing";
var record = tryCatch(innerFn, self2, context2);
if ("normal" === record.type) {
if (state = context2.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel)
continue;
return { value: record.arg, done: context2.done };
}
"throw" === record.type && (state = "completed", context2.method = "throw", context2.arg = record.arg);
}
};
}
function maybeInvokeDelegate(delegate, context2) {
var methodName = context2.method, method2 = delegate.iterator[methodName];
if (void 0 === method2)
return context2.delegate = null, "throw" === methodName && delegate.iterator.return && (context2.method = "return", context2.arg = void 0, maybeInvokeDelegate(delegate, context2), "throw" === context2.method) || "return" !== methodName && (context2.method = "throw", context2.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel;
var record = tryCatch(method2, delegate.iterator, context2.arg);
if ("throw" === record.type)
return context2.method = "throw", context2.arg = record.arg, context2.delegate = null, ContinueSentinel;
var info = record.arg;
return info ? info.done ? (context2[delegate.resultName] = info.value, context2.next = delegate.nextLoc, "return" !== context2.method && (context2.method = "next", context2.arg = void 0), context2.delegate = null, ContinueSentinel) : info : (context2.method = "throw", context2.arg = new TypeError("iterator result is not an object"), context2.delegate = null, ContinueSentinel);
}
function pushTryEntry(locs) {
var entry = { tryLoc: locs[0] };
1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry);
}
function resetTryEntry(entry) {
var record = entry.completion || {};
record.type = "normal", delete record.arg, entry.completion = record;
}
function Context2(tryLocsList) {
this.tryEntries = [{ tryLoc: "root" }], tryLocsList.forEach(pushTryEntry, this), this.reset(true);
}
function values(iterable) {
if (iterable) {
var iteratorMethod = iterable[iteratorSymbol];
if (iteratorMethod)
return iteratorMethod.call(iterable);
if ("function" == typeof iterable.next)
return iterable;
if (!isNaN(iterable.length)) {
var i2 = -1, next = function next2() {
for (; ++i2 < iterable.length; )
if (hasOwn.call(iterable, i2))
return next2.value = iterable[i2], next2.done = false, next2;
return next2.value = void 0, next2.done = true, next2;
};
return next.next = next;
}
}
return { next: doneResult };
}
function doneResult() {
return { value: void 0, done: true };
}
return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty2(Gp, "constructor", { value: GeneratorFunctionPrototype, configurable: true }), defineProperty2(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: true }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports2.isGeneratorFunction = function(genFun) {
var ctor = "function" == typeof genFun && genFun.constructor;
return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name));
}, exports2.mark = function(genFun) {
return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun;
}, exports2.awrap = function(arg) {
return { __await: arg };
}, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function() {
return this;
}), exports2.AsyncIterator = AsyncIterator, exports2.async = function(innerFn, outerFn, self2, tryLocsList, PromiseImpl) {
void 0 === PromiseImpl && (PromiseImpl = Promise);
var iter = new AsyncIterator(wrap2(innerFn, outerFn, self2, tryLocsList), PromiseImpl);
return exports2.isGeneratorFunction(outerFn) ? iter : iter.next().then(function(result) {
return result.done ? result.value : iter.next();
});
}, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function() {
return this;
}), define(Gp, "toString", function() {
return "[object Generator]";
}), exports2.keys = function(val) {
var object2 = Object(val), keys2 = [];
for (var key2 in object2)
keys2.push(key2);
return keys2.reverse(), function next() {
for (; keys2.length; ) {
var key3 = keys2.pop();
if (key3 in object2)
return next.value = key3, next.done = false, next;
}
return next.done = true, next;
};
}, exports2.values = values, Context2.prototype = { constructor: Context2, reset: function reset(skipTempReset) {
if (this.prev = 0, this.next = 0, this.sent = this._sent = void 0, this.done = false, this.delegate = null, this.method = "next", this.arg = void 0, this.tryEntries.forEach(resetTryEntry), !skipTempReset)
for (var name2 in this)
"t" === name2.charAt(0) && hasOwn.call(this, name2) && !isNaN(+name2.slice(1)) && (this[name2] = void 0);
}, stop: function stop() {
this.done = true;
var rootRecord = this.tryEntries[0].completion;
if ("throw" === rootRecord.type)
throw rootRecord.arg;
return this.rval;
}, dispatchException: function dispatchException(exception) {
if (this.done)
throw exception;
var context2 = this;
function handle(loc, caught) {
return record.type = "throw", record.arg = exception, context2.next = loc, caught && (context2.method = "next", context2.arg = void 0), !!caught;
}
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2], record = entry.completion;
if ("root" === entry.tryLoc)
return handle("end");
if (entry.tryLoc <= this.prev) {
var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc");
if (hasCatch && hasFinally) {
if (this.prev < entry.catchLoc)
return handle(entry.catchLoc, true);
if (this.prev < entry.finallyLoc)
return handle(entry.finallyLoc);
} else if (hasCatch) {
if (this.prev < entry.catchLoc)
return handle(entry.catchLoc, true);
} else {
if (!hasFinally)
throw new Error("try statement without catch or finally");
if (this.prev < entry.finallyLoc)
return handle(entry.finallyLoc);
}
}
}
}, abrupt: function abrupt(type2, arg) {
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2];
if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
var finallyEntry = entry;
break;
}
}
finallyEntry && ("break" === type2 || "continue" === type2) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null);
var record = finallyEntry ? finallyEntry.completion : {};
return record.type = type2, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record);
}, complete: function complete(record, afterLoc) {
if ("throw" === record.type)
throw record.arg;
return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel;
}, finish: function finish(finallyLoc) {
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2];
if (entry.finallyLoc === finallyLoc)
return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel;
}
}, catch: function _catch(tryLoc) {
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2];
if (entry.tryLoc === tryLoc) {
var record = entry.completion;
if ("throw" === record.type) {
var thrown = record.arg;
resetTryEntry(entry);
}
return thrown;
}
}
throw new Error("illegal catch attempt");
}, delegateYield: function delegateYield(iterable, resultName, nextLoc) {
return this.delegate = { iterator: values(iterable), resultName, nextLoc }, "next" === this.method && (this.arg = void 0), ContinueSentinel;
} }, exports2;
}
var insertLengthRule = function insertLengthRule2(schema2, rules2) {
var type2 = schema2.type, max = schema2.max, min = schema2.min, message = schema2.message;
if (max || max === 0) {
rules2.push({
type: type2,
max,
message: message === null || message === void 0 ? void 0 : message.max
});
}
if (min || min === 0) {
rules2.push({
type: type2,
min,
message: message === null || message === void 0 ? void 0 : message.min
});
}
};
var insertRequiredRule = function insertRequiredRule2(schema2, rules2) {
var _a;
var type2 = schema2.type, format2 = schema2.format, required2 = schema2.required, message = schema2.message, widget = schema2.widget, title = schema2.title;
var requiredAlready = (_a = schema2 === null || schema2 === void 0 ? void 0 : schema2.rules) === null || _a === void 0 ? void 0 : _a.some(function(item) {
return item === null || item === void 0 ? void 0 : item.required;
});
if (!required2 || requiredAlready) {
return;
}
var rule = {
required: true,
message: message === null || message === void 0 ? void 0 : message.required
};
if (["year", "quarter", "month", "week", "date", "dateTime", "time"].includes(format2) && type2 === "range") {
rule = {
type: "array",
required: true,
len: 2,
fields: {
0: {
type: "string",
required: true
},
1: {
type: "string",
required: true
}
}
};
} else if (widget === "checkbox") {
rule = {
type: type2,
required: true,
whitespace: true,
message: title + "\u5FC5\u586B"
};
} else if (type2 === "string") {
rule = {
type: "string",
required: true,
whitespace: true,
message: (message === null || message === void 0 ? void 0 : message.required) || (!title ? "\u5185\u5BB9\u5FC5\u586B" : void 0)
};
}
rules2.push(rule);
};
var transformRules = function transformRules2() {
var rules2 = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : [];
var methods = arguments.length > 1 ? arguments[1] : void 0;
var form = arguments.length > 2 ? arguments[2] : void 0;
return rules2.map(function(item) {
if (item.validator && !item.transformed) {
var validator2 = isFunction$2(item.validator) ? item.validator : methods[item.validator];
item.validator = function(_, value) {
return __awaiter(void 0, void 0, void 0, /* @__PURE__ */ _regeneratorRuntime$2().mark(function _callee() {
var result;
return _regeneratorRuntime$2().wrap(function _callee$(_context) {
while (1)
switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return validator2(_, value, {
form
});
case 2:
result = _context.sent;
if (!isObject$5(result)) {
_context.next = 5;
break;
}
return _context.abrupt("return", (result === null || result === void 0 ? void 0 : result.status) ? Promise.resolve() : Promise.reject(new Error(result.message || item.message)));
case 5:
return _context.abrupt("return", result ? Promise.resolve() : Promise.reject(new Error(item.message)));
case 6:
case "end":
return _context.stop();
}
}, _callee);
}));
};
item.transformed = true;
}
return item;
});
};
const getRuleList = function(schema2, form, methods, fieldRef) {
var _a, _b;
var format2 = schema2.format, _schema$rules = schema2.rules, ruleList = _schema$rules === void 0 ? [] : _schema$rules, pattern2 = schema2.pattern, message = schema2.message;
var rules2 = _toConsumableArray$8(ruleList);
insertRequiredRule(schema2, rules2);
insertLengthRule(schema2, rules2);
rules2.push({
validator: function validator2(_) {
return __awaiter(void 0, void 0, void 0, /* @__PURE__ */ _regeneratorRuntime$2().mark(function _callee2() {
var _c, _d, res;
return _regeneratorRuntime$2().wrap(function _callee2$(_context2) {
while (1)
switch (_context2.prev = _context2.next) {
case 0:
if (isFunction$2((_c = fieldRef === null || fieldRef === void 0 ? void 0 : fieldRef.current) === null || _c === void 0 ? void 0 : _c.validator)) {
_context2.next = 2;
break;
}
return _context2.abrupt("return", true);
case 2:
_context2.next = 4;
return (_d = fieldRef.current) === null || _d === void 0 ? void 0 : _d.validator();
case 4:
res = _context2.sent;
return _context2.abrupt("return", res);
case 6:
case "end":
return _context2.stop();
}
}, _callee2);
}));
}
});
if (pattern2) {
rules2.push({
pattern: pattern2,
message: message === null || message === void 0 ? void 0 : message.pattern
});
}
if (format2 === "url") {
rules2.push({
type: "url",
message: message === null || message === void 0 ? void 0 : message.url
});
}
if (format2 === "email") {
rules2.push({
type: "email",
message: message === null || message === void 0 ? void 0 : message.email
});
}
if (format2 === "image") {
rules2.push({
validator: function validator2(_, value) {
if (!value) {
return true;
}
var imagePattern = "([/|.|w|s|-])*.(?:jpg|gif|png|bmp|apng|webp|jpeg|json)";
var _isUrl = isUrl$1(value);
var _isImg = new RegExp(imagePattern).test(value);
return _isUrl || _isImg;
},
message: (_a = message === null || message === void 0 ? void 0 : message.email) !== null && _a !== void 0 ? _a : "\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u56FE\u7247\u683C\u5F0F"
});
}
if (format2 === "color") {
rules2.push({
validator: function validator2(_, value) {
try {
color$1(value || null);
return true;
} catch (e2) {
return false;
}
},
message: (_b = message === null || message === void 0 ? void 0 : message.color) !== null && _b !== void 0 ? _b : "\u8BF7\u586B\u5199\u6B63\u786E\u7684\u989C\u8272\u683C\u5F0F"
});
}
return transformRules(rules2, methods, form);
};
const createUpdateEffect = (hook) => (effect, deps) => {
const isMounted = React$a.useRef(false);
hook(() => {
return () => {
isMounted.current = false;
};
}, []);
hook(() => {
if (!isMounted.current) {
isMounted.current = true;
} else {
return effect();
}
}, deps);
};
const isFunction$1 = (value) => typeof value === "function";
const isDev = false;
const isDev$1 = isDev;
const useUpdateEffect = createUpdateEffect(React$a.useEffect);
function useLatest(value) {
const ref = React$a.useRef(value);
ref.current = value;
return ref;
}
const useUnmount = (fn) => {
if (isDev$1) {
if (!isFunction$1(fn)) {
console.error(`useUnmount expected parameter is a function, got ${typeof fn}`);
}
}
const fnRef = useLatest(fn);
React$a.useEffect(() => () => {
fnRef.current();
}, []);
};
const useUnmount$1 = useUnmount;
var dayjs_min = { exports: {} };
(function(module2, exports2) {
!function(t2, e2) {
module2.exports = e2();
}(commonjsGlobal, function() {
var t2 = 1e3, e2 = 6e4, n2 = 36e5, r2 = "millisecond", i2 = "second", s = "minute", u2 = "hour", a = "day", o = "week", f2 = "month", h2 = "quarter", c2 = "year", d2 = "date", l2 = "Invalid Date", $ = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/, y2 = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g, M = { name: "en", weekdays: "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), months: "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), ordinal: function(t3) {
var e3 = ["th", "st", "nd", "rd"], n3 = t3 % 100;
return "[" + t3 + (e3[(n3 - 20) % 10] || e3[n3] || e3[0]) + "]";
} }, m2 = function(t3, e3, n3) {
var r3 = String(t3);
return !r3 || r3.length >= e3 ? t3 : "" + Array(e3 + 1 - r3.length).join(n3) + t3;
}, v2 = { s: m2, z: function(t3) {
var e3 = -t3.utcOffset(), n3 = Math.abs(e3), r3 = Math.floor(n3 / 60), i3 = n3 % 60;
return (e3 <= 0 ? "+" : "-") + m2(r3, 2, "0") + ":" + m2(i3, 2, "0");
}, m: function t3(e3, n3) {
if (e3.date() < n3.date())
return -t3(n3, e3);
var r3 = 12 * (n3.year() - e3.year()) + (n3.month() - e3.month()), i3 = e3.clone().add(r3, f2), s2 = n3 - i3 < 0, u3 = e3.clone().add(r3 + (s2 ? -1 : 1), f2);
return +(-(r3 + (n3 - i3) / (s2 ? i3 - u3 : u3 - i3)) || 0);
}, a: function(t3) {
return t3 < 0 ? Math.ceil(t3) || 0 : Math.floor(t3);
}, p: function(t3) {
return { M: f2, y: c2, w: o, d: a, D: d2, h: u2, m: s, s: i2, ms: r2, Q: h2 }[t3] || String(t3 || "").toLowerCase().replace(/s$/, "");
}, u: function(t3) {
return void 0 === t3;
} }, g2 = "en", D = {};
D[g2] = M;
var p2 = function(t3) {
return t3 instanceof _;
}, S = function t3(e3, n3, r3) {
var i3;
if (!e3)
return g2;
if ("string" == typeof e3) {
var s2 = e3.toLowerCase();
D[s2] && (i3 = s2), n3 && (D[s2] = n3, i3 = s2);
var u3 = e3.split("-");
if (!i3 && u3.length > 1)
return t3(u3[0]);
} else {
var a2 = e3.name;
D[a2] = e3, i3 = a2;
}
return !r3 && i3 && (g2 = i3), i3 || !r3 && g2;
}, w2 = function(t3, e3) {
if (p2(t3))
return t3.clone();
var n3 = "object" == typeof e3 ? e3 : {};
return n3.date = t3, n3.args = arguments, new _(n3);
}, O = v2;
O.l = S, O.i = p2, O.w = function(t3, e3) {
return w2(t3, { locale: e3.$L, utc: e3.$u, x: e3.$x, $offset: e3.$offset });
};
var _ = function() {
function M2(t3) {
this.$L = S(t3.locale, null, true), this.parse(t3);
}
var m3 = M2.prototype;
return m3.parse = function(t3) {
this.$d = function(t4) {
var e3 = t4.date, n3 = t4.utc;
if (null === e3)
return new Date(NaN);
if (O.u(e3))
return new Date();
if (e3 instanceof Date)
return new Date(e3);
if ("string" == typeof e3 && !/Z$/i.test(e3)) {
var r3 = e3.match($);
if (r3) {
var i3 = r3[2] - 1 || 0, s2 = (r3[7] || "0").substring(0, 3);
return n3 ? new Date(Date.UTC(r3[1], i3, r3[3] || 1, r3[4] || 0, r3[5] || 0, r3[6] || 0, s2)) : new Date(r3[1], i3, r3[3] || 1, r3[4] || 0, r3[5] || 0, r3[6] || 0, s2);
}
}
return new Date(e3);
}(t3), this.$x = t3.x || {}, this.init();
}, m3.init = function() {
var t3 = this.$d;
this.$y = t3.getFullYear(), this.$M = t3.getMonth(), this.$D = t3.getDate(), this.$W = t3.getDay(), this.$H = t3.getHours(), this.$m = t3.getMinutes(), this.$s = t3.getSeconds(), this.$ms = t3.getMilliseconds();
}, m3.$utils = function() {
return O;
}, m3.isValid = function() {
return !(this.$d.toString() === l2);
}, m3.isSame = function(t3, e3) {
var n3 = w2(t3);
return this.startOf(e3) <= n3 && n3 <= this.endOf(e3);
}, m3.isAfter = function(t3, e3) {
return w2(t3) < this.startOf(e3);
}, m3.isBefore = function(t3, e3) {
return this.endOf(e3) < w2(t3);
}, m3.$g = function(t3, e3, n3) {
return O.u(t3) ? this[e3] : this.set(n3, t3);
}, m3.unix = function() {
return Math.floor(this.valueOf() / 1e3);
}, m3.valueOf = function() {
return this.$d.getTime();
}, m3.startOf = function(t3, e3) {
var n3 = this, r3 = !!O.u(e3) || e3, h3 = O.p(t3), l3 = function(t4, e4) {
var i3 = O.w(n3.$u ? Date.UTC(n3.$y, e4, t4) : new Date(n3.$y, e4, t4), n3);
return r3 ? i3 : i3.endOf(a);
}, $2 = function(t4, e4) {
return O.w(n3.toDate()[t4].apply(n3.toDate("s"), (r3 ? [0, 0, 0, 0] : [23, 59, 59, 999]).slice(e4)), n3);
}, y3 = this.$W, M3 = this.$M, m4 = this.$D, v3 = "set" + (this.$u ? "UTC" : "");
switch (h3) {
case c2:
return r3 ? l3(1, 0) : l3(31, 11);
case f2:
return r3 ? l3(1, M3) : l3(0, M3 + 1);
case o:
var g3 = this.$locale().weekStart || 0, D2 = (y3 < g3 ? y3 + 7 : y3) - g3;
return l3(r3 ? m4 - D2 : m4 + (6 - D2), M3);
case a:
case d2:
return $2(v3 + "Hours", 0);
case u2:
return $2(v3 + "Minutes", 1);
case s:
return $2(v3 + "Seconds", 2);
case i2:
return $2(v3 + "Milliseconds", 3);
default:
return this.clone();
}
}, m3.endOf = function(t3) {
return this.startOf(t3, false);
}, m3.$set = function(t3, e3) {
var n3, o2 = O.p(t3), h3 = "set" + (this.$u ? "UTC" : ""), l3 = (n3 = {}, n3[a] = h3 + "Date", n3[d2] = h3 + "Date", n3[f2] = h3 + "Month", n3[c2] = h3 + "FullYear", n3[u2] = h3 + "Hours", n3[s] = h3 + "Minutes", n3[i2] = h3 + "Seconds", n3[r2] = h3 + "Milliseconds", n3)[o2], $2 = o2 === a ? this.$D + (e3 - this.$W) : e3;
if (o2 === f2 || o2 === c2) {
var y3 = this.clone().set(d2, 1);
y3.$d[l3]($2), y3.init(), this.$d = y3.set(d2, Math.min(this.$D, y3.daysInMonth())).$d;
} else
l3 && this.$d[l3]($2);
return this.init(), this;
}, m3.set = function(t3, e3) {
return this.clone().$set(t3, e3);
}, m3.get = function(t3) {
return this[O.p(t3)]();
}, m3.add = function(r3, h3) {
var d3, l3 = this;
r3 = Number(r3);
var $2 = O.p(h3), y3 = function(t3) {
var e3 = w2(l3);
return O.w(e3.date(e3.date() + Math.round(t3 * r3)), l3);
};
if ($2 === f2)
return this.set(f2, this.$M + r3);
if ($2 === c2)
return this.set(c2, this.$y + r3);
if ($2 === a)
return y3(1);
if ($2 === o)
return y3(7);
var M3 = (d3 = {}, d3[s] = e2, d3[u2] = n2, d3[i2] = t2, d3)[$2] || 1, m4 = this.$d.getTime() + r3 * M3;
return O.w(m4, this);
}, m3.subtract = function(t3, e3) {
return this.add(-1 * t3, e3);
}, m3.format = function(t3) {
var e3 = this, n3 = this.$locale();
if (!this.isValid())
return n3.invalidDate || l2;
var r3 = t3 || "YYYY-MM-DDTHH:mm:ssZ", i3 = O.z(this), s2 = this.$H, u3 = this.$m, a2 = this.$M, o2 = n3.weekdays, f3 = n3.months, h3 = function(t4, n4, i4, s3) {
return t4 && (t4[n4] || t4(e3, r3)) || i4[n4].slice(0, s3);
}, c3 = function(t4) {
return O.s(s2 % 12 || 12, t4, "0");
}, d3 = n3.meridiem || function(t4, e4, n4) {
var r4 = t4 < 12 ? "AM" : "PM";
return n4 ? r4.toLowerCase() : r4;
}, $2 = { YY: String(this.$y).slice(-2), YYYY: this.$y, M: a2 + 1, MM: O.s(a2 + 1, 2, "0"), MMM: h3(n3.monthsShort, a2, f3, 3), MMMM: h3(f3, a2), D: this.$D, DD: O.s(this.$D, 2, "0"), d: String(this.$W), dd: h3(n3.weekdaysMin, this.$W, o2, 2), ddd: h3(n3.weekdaysShort, this.$W, o2, 3), dddd: o2[this.$W], H: String(s2), HH: O.s(s2, 2, "0"), h: c3(1), hh: c3(2), a: d3(s2, u3, true), A: d3(s2, u3, false), m: String(u3), mm: O.s(u3, 2, "0"), s: String(this.$s), ss: O.s(this.$s, 2, "0"), SSS: O.s(this.$ms, 3, "0"), Z: i3 };
return r3.replace(y2, function(t4, e4) {
return e4 || $2[t4] || i3.replace(":", "");
});
}, m3.utcOffset = function() {
return 15 * -Math.round(this.$d.getTimezoneOffset() / 15);
}, m3.diff = function(r3, d3, l3) {
var $2, y3 = O.p(d3), M3 = w2(r3), m4 = (M3.utcOffset() - this.utcOffset()) * e2, v3 = this - M3, g3 = O.m(this, M3);
return g3 = ($2 = {}, $2[c2] = g3 / 12, $2[f2] = g3, $2[h2] = g3 / 3, $2[o] = (v3 - m4) / 6048e5, $2[a] = (v3 - m4) / 864e5, $2[u2] = v3 / n2, $2[s] = v3 / e2, $2[i2] = v3 / t2, $2)[y3] || v3, l3 ? g3 : O.a(g3);
}, m3.daysInMonth = function() {
return this.endOf(f2).$D;
}, m3.$locale = function() {
return D[this.$L];
}, m3.locale = function(t3, e3) {
if (!t3)
return this.$L;
var n3 = this.clone(), r3 = S(t3, e3, true);
return r3 && (n3.$L = r3), n3;
}, m3.clone = function() {
return O.w(this.$d, this);
}, m3.toDate = function() {
return new Date(this.valueOf());
}, m3.toJSON = function() {
return this.isValid() ? this.toISOString() : null;
}, m3.toISOString = function() {
return this.$d.toISOString();
}, m3.toString = function() {
return this.$d.toUTCString();
}, M2;
}(), T = _.prototype;
return w2.prototype = T, [["$ms", r2], ["$s", i2], ["$m", s], ["$H", u2], ["$W", a], ["$M", f2], ["$y", c2], ["$D", d2]].forEach(function(t3) {
T[t3[1]] = function(e3) {
return this.$g(e3, t3[0], t3[1]);
};
}), w2.extend = function(t3, e3) {
return t3.$i || (t3(e3, _, w2), t3.$i = true), w2;
}, w2.locale = S, w2.isDayjs = p2, w2.unix = function(t3) {
return w2(1e3 * t3);
}, w2.en = D[g2], w2.Ls = D, w2.p = {}, w2;
});
})(dayjs_min);
const dayjs = dayjs_min.exports;
var FieldWrapperStatus = function FieldWrapperStatus2(props) {
var Field2 = props.Field, fieldProps = props.fieldProps, maxWidth = props.maxWidth, initialValue = props.initialValue, otherProps = __rest(props, ["Field", "fieldProps", "maxWidth", "initialValue"]);
var onStatusChange = fieldProps.onStatusChange, addons = fieldProps.addons, otherFieldProps = __rest(fieldProps, ["onStatusChange", "addons"]);
var style2 = maxWidth ? Object.assign({
maxWidth
}, fieldProps === null || fieldProps === void 0 ? void 0 : fieldProps.style) : Object.assign({}, fieldProps === null || fieldProps === void 0 ? void 0 : fieldProps.style);
var _Form$Item$useStatus = _Form.Item.useStatus(), status = _Form$Item$useStatus.status;
var errors = addons.getFieldError(addons.dataPath);
React$a.useEffect(function() {
onStatusChange && onStatusChange(status, errors);
}, [JSON.stringify(errors)]);
useUpdateEffect(function() {
otherProps.onChange(initialValue);
}, [JSON.stringify(initialValue)]);
return /* @__PURE__ */ jsx(Field2, {
...Object.assign({}, otherProps, otherFieldProps, {
style: style2,
addons
})
});
};
var FieldWrapper = function FieldWrapper2(props) {
var Field2 = props.Field, fieldProps = props.fieldProps, maxWidth = props.maxWidth, initialValue = props.initialValue, otherProps = __rest(props, ["Field", "fieldProps", "maxWidth", "initialValue"]);
var addons = fieldProps.addons, schema2 = fieldProps.schema;
var _style = maxWidth ? Object.assign({
maxWidth
}, fieldProps === null || fieldProps === void 0 ? void 0 : fieldProps.style) : Object.assign({}, fieldProps === null || fieldProps === void 0 ? void 0 : fieldProps.style);
var removeBtn = schema2.removeBtn;
var configCtx = React$a.useContext(_ConfigProvider.ConfigContext);
var t2 = translation$1(configCtx);
useUpdateEffect(function() {
otherProps.onChange(initialValue);
}, [JSON.stringify(initialValue)]);
var handleRemove = function handleRemove2() {
if (isFunction$2(removeBtn === null || removeBtn === void 0 ? void 0 : removeBtn.onClick)) {
removeBtn.onClick(function() {
addons.setSchemaByPath(addons.schemaPath, {
hidden: true
});
});
return;
}
addons.setSchemaByPath(addons.schemaPath, {
hidden: true
});
};
return /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx(Field2, {
...Object.assign({}, otherProps, fieldProps, {
style: _style
})
}), removeBtn && /* @__PURE__ */ React__default.default.createElement(Button$2, Object.assign({
type: "link",
danger: true
}, removeBtn, {
onClick: handleRemove
}), (removeBtn === null || removeBtn === void 0 ? void 0 : removeBtn.text) || t2("delete"))]
});
};
function _typeof$l(obj) {
"@babel/helpers - typeof";
return _typeof$l = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof$l(obj);
}
function _defineProperty$8(obj, key2, value) {
key2 = _toPropertyKey$5(key2);
if (key2 in obj) {
Object.defineProperty(obj, key2, {
value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key2] = value;
}
return obj;
}
function _toPropertyKey$5(arg) {
var key2 = _toPrimitive$6(arg, "string");
return _typeof$l(key2) === "symbol" ? key2 : String(key2);
}
function _toPrimitive$6(input, hint) {
if (_typeof$l(input) !== "object" || input === null)
return input;
var prim = input[Symbol.toPrimitive];
if (prim !== void 0) {
var res = prim.call(input, hint || "default");
if (_typeof$l(res) !== "object")
return res;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return (hint === "string" ? String : Number)(input);
}
var UpperContext$1 = /* @__PURE__ */ React$a.createContext(function() {
});
var valuePropNameMap = {
checkbox: "checked",
switch: "checked"
};
const Main$2 = function(props) {
var _a, _b;
var configCtx = props.configCtx, store2 = props.store, schema2 = props.schema, path2 = props.path, children = props.children, dependValues = props.dependValues, rootPath = props.rootPath;
var fieldRef = React$a.useRef();
var formCtx = useStore(store2, function(state) {
return state.context;
});
var upperCtx = React$a.useContext(UpperContext$1);
var form = configCtx.form, widgets = configCtx.widgets, methods = configCtx.methods, globalProps = configCtx.globalProps;
var reserveLabel = schema2.reserveLabel, hidden = schema2.hidden;
schema2.properties;
var dependencies = schema2.dependencies, _inlineMode = schema2.inlineMode;
schema2.remove;
schema2.removeText;
var _schema$visible = schema2.visible, visible = _schema$visible === void 0 ? true : _schema$visible, otherSchema = __rest(schema2, ["reserveLabel", "hidden", "properties", "dependencies", "inlineMode", "remove", "removeText", "visible"]);
var getValueFromKey = getParamValue$2(formCtx, upperCtx, schema2);
var widgetName = getWidgetName(schema2);
var Widget = getWidget(widgetName, widgets);
var fieldProps = getFieldProps(widgetName, schema2, {
widgets,
methods,
form,
dependValues,
globalProps,
path: getPath(path2),
rootPath,
fieldRef
});
React$a.useEffect(function() {
form.setFieldRef(fieldProps.addons.dataPath, fieldRef);
}, []);
if (schema2 === null || schema2 === void 0 ? void 0 : schema2.hidden) {
return null;
}
if (!widgetName) {
var ErrorSchema2 = widgets["errorSchema"] || widgets["ErrorSchema"];
return /* @__PURE__ */ jsx(ErrorSchema2, {
schema: schema2
});
}
if (schema2.type === "void") {
return /* @__PURE__ */ React__default.default.createElement(
Col$1,
{
span: 24
},
/* @__PURE__ */ jsx(Widget, {
...Object.assign({}, fieldProps)
})
);
}
var displayType = getValueFromKey("displayType");
var inlineSelf = _inlineMode || (upperCtx === null || upperCtx === void 0 ? void 0 : upperCtx.displayType) === "inline";
if (!upperCtx.exist) {
inlineSelf = _inlineMode || (formCtx === null || formCtx === void 0 ? void 0 : formCtx.displayType) === "inline";
}
var inlineChild = displayType === "inline";
var labelWidth = getValueFromKey("labelWidth");
if (children) {
var childElement = /* @__PURE__ */ jsx("div", {
className: "fr-inline-container",
children
});
if (!inlineChild) {
var gutter = {
row: 16,
column: 24
}[displayType];
childElement = /* @__PURE__ */ React__default.default.createElement(Row$1, {
gutter
}, children);
}
fieldProps.children = childElement;
var content = /* @__PURE__ */ jsx(Widget, {
...Object.assign({
labelWidth,
displayType: schema2.displayType
}, fieldProps, otherSchema)
});
return /* @__PURE__ */ jsx(UpperContext$1.Provider, {
value: {
column: schema2.column,
labelCol: schema2.labelCol,
fieldCol: schema2.fieldCol,
displayType: schema2.displayType,
labelWidth: schema2.labelWidth,
noStyle: schema2.noStyle,
exist: true
},
children: inlineSelf ? content : /* @__PURE__ */ React__default.default.createElement(Col$1, {
span: 24,
className: classnames("fr-obj-col", _defineProperty$8({}, schema2.className, !!schema2.className))
}, content)
});
}
var label = getLabel$1(schema2, displayType, widgets);
var noStyle = getValueFromKey("noStyle");
var span = getColSpan(formCtx, upperCtx, schema2);
var extra = getExtraView("extra", schema2, widgets);
var help = getExtraView("help", schema2, widgets);
var tooltip = getTooltip$4(schema2, displayType);
var ruleList = getRuleList(schema2, form, methods, fieldRef);
var readOnly = getValueFromKey("readOnly");
var disabled = getValueFromKey("disabled");
var validateTrigger = getValueFromKey("validateTrigger");
var _labelCol = getValueFromKey("labelCol");
var _fieldCol = getValueFromKey("fieldCol");
var maxWidth = getValueFromKey("maxWidth");
var _getFormItemLayout = getFormItemLayout(Math.floor(24 / span * 1), schema2, {
displayType,
labelWidth,
_labelCol,
_fieldCol
}), labelCol = _getFormItemLayout.labelCol, fieldCol = _getFormItemLayout.fieldCol;
var valuePropName = schema2.valuePropName || valuePropNameMap[widgetName] || void 0;
if (readOnly) {
fieldProps.readOnly = readOnly;
}
if (disabled) {
fieldProps.disabled = disabled;
}
if (reserveLabel && !label && displayType !== "column") {
label = "fr-hide-label";
}
if (readOnly) {
Widget = widgets[schema2.readOnlyWidget] || widgets["Html"];
}
if (isCheckBoxType(schema2, readOnly)) {
fieldProps.title = label;
label = null;
if (displayType === "row") {
label = "fr-hide-label";
}
}
var initialValue = (_a = schema2.default) !== null && _a !== void 0 ? _a : schema2.defaultValue;
var classRest = _defineProperty$8({
"fr-hide-label": label === "fr-hide-label",
"fr-inline-field": inlineSelf,
"fr-field-visibility": !visible
}, schema2.className, !!schema2.className);
var formItem = /* @__PURE__ */ React__default.default.createElement(_Form.Item, {
className: classnames("fr-field", classRest),
label,
name: path2,
valuePropName,
rules: readOnly ? [] : ruleList,
hidden,
tooltip,
extra,
help,
initialValue,
labelCol,
wrapperCol: fieldCol,
noStyle,
dependencies,
validateTrigger: (validateTrigger !== null && validateTrigger !== void 0 ? validateTrigger : (_b = fieldRef === null || fieldRef === void 0 ? void 0 : fieldRef.current) === null || _b === void 0 ? void 0 : _b.validator) ? "onSubmit" : "onChange"
}, fieldProps.onStatusChange ? /* @__PURE__ */ jsx(FieldWrapperStatus, {
Field: Widget,
fieldProps,
maxWidth,
initialValue
}) : /* @__PURE__ */ jsx(FieldWrapper, {
Field: Widget,
fieldProps,
maxWidth,
initialValue
}));
if (inlineSelf) {
if (noStyle) {
return /* @__PURE__ */ jsx("div", {
className: classnames("fr-inline-field", _defineProperty$8({
"fr-field-visibility": !visible
}, schema2.className, !!schema2.className)),
children: formItem
});
}
return formItem;
}
return /* @__PURE__ */ React__default.default.createElement(Col$1, {
span,
className: classnames(null, {
"fr-field-visibility": !visible
})
}, formItem);
};
const FieldItem = function(props) {
var _a, _b;
var schema2 = props.schema, rootPath = props.rootPath, otherProps = __rest(props, ["schema", "rootPath"]);
var store2 = React$a.useContext(FRContext);
var _store$getState = store2.getState(), formSchema = _store$getState.schema;
var configCtx = React$a.useContext(ConfigContext);
var mustacheDisabled = (_a = configCtx === null || configCtx === void 0 ? void 0 : configCtx.globalConfig) === null || _a === void 0 ? void 0 : _a.mustacheDisabled;
(_b = configCtx === null || configCtx === void 0 ? void 0 : configCtx.globalConfig) === null || _b === void 0 ? void 0 : _b.shouldUpdateOpen;
var dependencies = schema2 === null || schema2 === void 0 ? void 0 : schema2.dependencies;
if (!isHasExpression(schema2) && !mustacheDisabled && (!dependencies || !(dependencies === null || dependencies === void 0 ? void 0 : dependencies.length))) {
return /* @__PURE__ */ jsx(Main$2, {
...Object.assign({}, props, {
store: store2,
configCtx
})
});
}
var schemaStr = JSON.stringify(schema2);
return /* @__PURE__ */ React__default.default.createElement(_Form.Item, {
noStyle: true,
shouldUpdate: fieldShouldUpdate(schemaStr, rootPath, dependencies)
}, function(form) {
var formData = form.getFieldsValue(true);
var formDependencies = [];
var dependValues = (dependencies || []).map(function(depPath) {
var item = [];
formDependencies.push(item);
return getDependValues(formData, depPath, props, item);
});
var newSchema = mustacheDisabled ? schema2 : parseAllExpression(schema2, formData, rootPath, formSchema);
return /* @__PURE__ */ jsx(Main$2, {
...Object.assign({
schema: Object.assign(Object.assign({}, newSchema), {
dependencies: formDependencies
}),
rootPath
}, otherProps, {
dependValues,
store: store2,
configCtx
})
});
});
};
var getParamValue$1 = function getParamValue2(formCtx, upperCtx, schema2) {
return function(valueKey) {
var _a, _b;
return (_b = (_a = schema2[valueKey]) !== null && _a !== void 0 ? _a : upperCtx[valueKey]) !== null && _b !== void 0 ? _b : formCtx[valueKey];
};
};
var getFormListLayout = function getFormListLayout2(getValueFromKey, displayType) {
var _labelCol = getValueFromKey("labelCol");
var _fieldCol = getValueFromKey("fieldCol");
var labelWidth = getValueFromKey("labelWidth");
var labelCol = {
span: 5
};
var fieldCol = {
flex: 1
};
if (labelWidth && displayType !== "column") {
labelCol = {
flex: labelWidth + "px"
};
}
if (_labelCol) {
labelCol = _labelCol;
}
if (_fieldCol) {
fieldCol = _fieldCol;
}
if (typeof _labelCol === "number") {
labelCol = {
span: _labelCol
};
}
if (typeof _fieldCol === "number") {
fieldCol = {
span: _fieldCol
};
}
return {
labelCol,
fieldCol
};
};
var getLabel = function getLabel2(schema2, displayType, widgets) {
var title = schema2.title, description = schema2.description, descWidget = schema2.descWidget, labelWidget = schema2.labelWidget;
var LabelNode = widgets[labelWidget];
if (LabelNode) {
return /* @__PURE__ */ jsx(LabelNode, {
schema: schema2
});
}
if (!description && !descWidget) {
return title;
}
var RenderDesc = function RenderDesc2() {
var Widget = widgets[descWidget];
if (Widget) {
return /* @__PURE__ */ jsx(Widget, {
schema: schema2
});
}
if (description) {
return /* @__PURE__ */ jsxs("span", {
className: "fr-desc",
children: ["(", description, ")"]
});
}
return null;
};
if (displayType === "inline") {
return title;
}
return /* @__PURE__ */ jsxs(Fragment, {
children: [title, /* @__PURE__ */ jsx(RenderDesc, {})]
});
};
var getTooltip$3 = function getTooltip2(schema2, displayType) {
var descType = schema2.descType, description = schema2.description, tooltip = schema2.tooltip;
if (tooltip) {
if (typeof tooltip === "string") {
return {
title: /* @__PURE__ */ jsx("span", {
dangerouslySetInnerHTML: {
__html: tooltip
}
})
};
}
return Object.assign(Object.assign({}, tooltip), {
title: /* @__PURE__ */ jsx("span", {
dangerouslySetInnerHTML: {
__html: tooltip.title
}
})
});
}
if (descType === "widget" || !description) {
return null;
}
if (displayType === "column" && descType === "icon") {
return {
title: description
};
}
return null;
};
const index$R = "";
function _typeof$k(obj) {
"@babel/helpers - typeof";
return _typeof$k = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof$k(obj);
}
function _regeneratorRuntime$1() {
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
_regeneratorRuntime$1 = function _regeneratorRuntime2() {
return exports2;
};
var exports2 = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty2 = Object.defineProperty || function(obj, key2, desc) {
obj[key2] = desc.value;
}, $Symbol2 = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol2.iterator || "@@iterator", asyncIteratorSymbol = $Symbol2.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol2.toStringTag || "@@toStringTag";
function define(obj, key2, value) {
return Object.defineProperty(obj, key2, {
value,
enumerable: true,
configurable: true,
writable: true
}), obj[key2];
}
try {
define({}, "");
} catch (err) {
define = function define2(obj, key2, value) {
return obj[key2] = value;
};
}
function wrap2(innerFn, outerFn, self2, tryLocsList) {
var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context2 = new Context2(tryLocsList || []);
return defineProperty2(generator, "_invoke", {
value: makeInvokeMethod(innerFn, self2, context2)
}), generator;
}
function tryCatch(fn, obj, arg) {
try {
return {
type: "normal",
arg: fn.call(obj, arg)
};
} catch (err) {
return {
type: "throw",
arg: err
};
}
}
exports2.wrap = wrap2;
var ContinueSentinel = {};
function Generator() {
}
function GeneratorFunction() {
}
function GeneratorFunctionPrototype() {
}
var IteratorPrototype2 = {};
define(IteratorPrototype2, iteratorSymbol, function() {
return this;
});
var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([])));
NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype2 = NativeIteratorPrototype);
var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype2);
function defineIteratorMethods(prototype2) {
["next", "throw", "return"].forEach(function(method2) {
define(prototype2, method2, function(arg) {
return this._invoke(method2, arg);
});
});
}
function AsyncIterator(generator, PromiseImpl) {
function invoke(method2, arg, resolve, reject) {
var record = tryCatch(generator[method2], generator, arg);
if ("throw" !== record.type) {
var result = record.arg, value = result.value;
return value && "object" == _typeof$k(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function(value2) {
invoke("next", value2, resolve, reject);
}, function(err) {
invoke("throw", err, resolve, reject);
}) : PromiseImpl.resolve(value).then(function(unwrapped) {
result.value = unwrapped, resolve(result);
}, function(error) {
return invoke("throw", error, resolve, reject);
});
}
reject(record.arg);
}
var previousPromise;
defineProperty2(this, "_invoke", {
value: function value(method2, arg) {
function callInvokeWithMethodAndArg() {
return new PromiseImpl(function(resolve, reject) {
invoke(method2, arg, resolve, reject);
});
}
return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
}
});
}
function makeInvokeMethod(innerFn, self2, context2) {
var state = "suspendedStart";
return function(method2, arg) {
if ("executing" === state)
throw new Error("Generator is already running");
if ("completed" === state) {
if ("throw" === method2)
throw arg;
return doneResult();
}
for (context2.method = method2, context2.arg = arg; ; ) {
var delegate = context2.delegate;
if (delegate) {
var delegateResult = maybeInvokeDelegate(delegate, context2);
if (delegateResult) {
if (delegateResult === ContinueSentinel)
continue;
return delegateResult;
}
}
if ("next" === context2.method)
context2.sent = context2._sent = context2.arg;
else if ("throw" === context2.method) {
if ("suspendedStart" === state)
throw state = "completed", context2.arg;
context2.dispatchException(context2.arg);
} else
"return" === context2.method && context2.abrupt("return", context2.arg);
state = "executing";
var record = tryCatch(innerFn, self2, context2);
if ("normal" === record.type) {
if (state = context2.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel)
continue;
return {
value: record.arg,
done: context2.done
};
}
"throw" === record.type && (state = "completed", context2.method = "throw", context2.arg = record.arg);
}
};
}
function maybeInvokeDelegate(delegate, context2) {
var methodName = context2.method, method2 = delegate.iterator[methodName];
if (void 0 === method2)
return context2.delegate = null, "throw" === methodName && delegate.iterator.return && (context2.method = "return", context2.arg = void 0, maybeInvokeDelegate(delegate, context2), "throw" === context2.method) || "return" !== methodName && (context2.method = "throw", context2.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel;
var record = tryCatch(method2, delegate.iterator, context2.arg);
if ("throw" === record.type)
return context2.method = "throw", context2.arg = record.arg, context2.delegate = null, ContinueSentinel;
var info = record.arg;
return info ? info.done ? (context2[delegate.resultName] = info.value, context2.next = delegate.nextLoc, "return" !== context2.method && (context2.method = "next", context2.arg = void 0), context2.delegate = null, ContinueSentinel) : info : (context2.method = "throw", context2.arg = new TypeError("iterator result is not an object"), context2.delegate = null, ContinueSentinel);
}
function pushTryEntry(locs) {
var entry = {
tryLoc: locs[0]
};
1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry);
}
function resetTryEntry(entry) {
var record = entry.completion || {};
record.type = "normal", delete record.arg, entry.completion = record;
}
function Context2(tryLocsList) {
this.tryEntries = [{
tryLoc: "root"
}], tryLocsList.forEach(pushTryEntry, this), this.reset(true);
}
function values(iterable) {
if (iterable) {
var iteratorMethod = iterable[iteratorSymbol];
if (iteratorMethod)
return iteratorMethod.call(iterable);
if ("function" == typeof iterable.next)
return iterable;
if (!isNaN(iterable.length)) {
var i2 = -1, next = function next2() {
for (; ++i2 < iterable.length; )
if (hasOwn.call(iterable, i2))
return next2.value = iterable[i2], next2.done = false, next2;
return next2.value = void 0, next2.done = true, next2;
};
return next.next = next;
}
}
return {
next: doneResult
};
}
function doneResult() {
return {
value: void 0,
done: true
};
}
return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty2(Gp, "constructor", {
value: GeneratorFunctionPrototype,
configurable: true
}), defineProperty2(GeneratorFunctionPrototype, "constructor", {
value: GeneratorFunction,
configurable: true
}), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports2.isGeneratorFunction = function(genFun) {
var ctor = "function" == typeof genFun && genFun.constructor;
return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name));
}, exports2.mark = function(genFun) {
return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun;
}, exports2.awrap = function(arg) {
return {
__await: arg
};
}, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function() {
return this;
}), exports2.AsyncIterator = AsyncIterator, exports2.async = function(innerFn, outerFn, self2, tryLocsList, PromiseImpl) {
void 0 === PromiseImpl && (PromiseImpl = Promise);
var iter = new AsyncIterator(wrap2(innerFn, outerFn, self2, tryLocsList), PromiseImpl);
return exports2.isGeneratorFunction(outerFn) ? iter : iter.next().then(function(result) {
return result.done ? result.value : iter.next();
});
}, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function() {
return this;
}), define(Gp, "toString", function() {
return "[object Generator]";
}), exports2.keys = function(val) {
var object2 = Object(val), keys2 = [];
for (var key2 in object2)
keys2.push(key2);
return keys2.reverse(), function next() {
for (; keys2.length; ) {
var key3 = keys2.pop();
if (key3 in object2)
return next.value = key3, next.done = false, next;
}
return next.done = true, next;
};
}, exports2.values = values, Context2.prototype = {
constructor: Context2,
reset: function reset(skipTempReset) {
if (this.prev = 0, this.next = 0, this.sent = this._sent = void 0, this.done = false, this.delegate = null, this.method = "next", this.arg = void 0, this.tryEntries.forEach(resetTryEntry), !skipTempReset)
for (var name2 in this)
"t" === name2.charAt(0) && hasOwn.call(this, name2) && !isNaN(+name2.slice(1)) && (this[name2] = void 0);
},
stop: function stop() {
this.done = true;
var rootRecord = this.tryEntries[0].completion;
if ("throw" === rootRecord.type)
throw rootRecord.arg;
return this.rval;
},
dispatchException: function dispatchException(exception) {
if (this.done)
throw exception;
var context2 = this;
function handle(loc, caught) {
return record.type = "throw", record.arg = exception, context2.next = loc, caught && (context2.method = "next", context2.arg = void 0), !!caught;
}
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2], record = entry.completion;
if ("root" === entry.tryLoc)
return handle("end");
if (entry.tryLoc <= this.prev) {
var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc");
if (hasCatch && hasFinally) {
if (this.prev < entry.catchLoc)
return handle(entry.catchLoc, true);
if (this.prev < entry.finallyLoc)
return handle(entry.finallyLoc);
} else if (hasCatch) {
if (this.prev < entry.catchLoc)
return handle(entry.catchLoc, true);
} else {
if (!hasFinally)
throw new Error("try statement without catch or finally");
if (this.prev < entry.finallyLoc)
return handle(entry.finallyLoc);
}
}
}
},
abrupt: function abrupt(type2, arg) {
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2];
if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
var finallyEntry = entry;
break;
}
}
finallyEntry && ("break" === type2 || "continue" === type2) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null);
var record = finallyEntry ? finallyEntry.completion : {};
return record.type = type2, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record);
},
complete: function complete(record, afterLoc) {
if ("throw" === record.type)
throw record.arg;
return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel;
},
finish: function finish(finallyLoc) {
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2];
if (entry.finallyLoc === finallyLoc)
return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel;
}
},
catch: function _catch(tryLoc) {
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2];
if (entry.tryLoc === tryLoc) {
var record = entry.completion;
if ("throw" === record.type) {
var thrown = record.arg;
resetTryEntry(entry);
}
return thrown;
}
}
throw new Error("illegal catch attempt");
},
delegateYield: function delegateYield(iterable, resultName, nextLoc) {
return this.delegate = {
iterator: values(iterable),
resultName,
nextLoc
}, "next" === this.method && (this.arg = void 0), ContinueSentinel;
}
}, exports2;
}
function _toConsumableArray$7(arr) {
return _arrayWithoutHoles$7(arr) || _iterableToArray$7(arr) || _unsupportedIterableToArray$g(arr) || _nonIterableSpread$7();
}
function _nonIterableSpread$7() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$g(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$g(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$g(o, minLen);
}
function _iterableToArray$7(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
return Array.from(iter);
}
function _arrayWithoutHoles$7(arr) {
if (Array.isArray(arr))
return _arrayLikeToArray$g(arr);
}
function _arrayLikeToArray$g(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
var getParamValue = function getParamValue2(formCtx, upperCtx, schema2) {
return function(valueKey) {
var _a, _b;
return (_b = (_a = schema2[valueKey]) !== null && _a !== void 0 ? _a : upperCtx[valueKey]) !== null && _b !== void 0 ? _b : formCtx[valueKey];
};
};
const Main$1 = function(props) {
var _a, _b, _c;
var form = props.form, schema2 = props.schema, path2 = props.path, parentLitPath = props.parentLitPath, renderCore = props.renderCore, rootPath = props.rootPath, methods = props.methods, upperCtx = props.upperCtx, formCtx = props.formCtx, configContext = props.configContext, listData = props.listData, setListData = props.setListData;
var widgets = configContext.widgets, globalConfig2 = configContext.globalConfig;
var configCtx = React$a.useContext(_ConfigProvider.ConfigContext);
var t2 = translation$1(configCtx);
var defaultAddBtnProps = {
type: "dashed",
block: true,
children: t2("add_item")
};
var defaultDelConfirmProps = {
title: t2("confirm_delete"),
okText: t2("confirm"),
cancelText: t2("cancel")
};
var defaultActionColumnProps = {
colHeaderText: t2("operate")
};
var widgetName = schema2.widget || "cardList";
var Widget = getWidget(widgetName, widgets);
var listProps = schema2.props, removeBtn = schema2.removeBtn, _schema$rules = schema2.rules, rules2 = _schema$rules === void 0 ? [] : _schema$rules, otherSchema = __rest(schema2, ["props", "removeBtn", "rules"]);
var defaultValue = (_a = schema2.default) !== null && _a !== void 0 ? _a : schema2.defaultValue;
if (defaultValue === void 0 && !["drawerList", "list1"].includes(widgetName)) {
defaultValue = [{}];
}
React$a.useEffect(function() {
setListData(defaultValue || []);
}, []);
var _d = listProps || {}, addBtnProps = _d.addBtnProps, delConfirmProps = _d.delConfirmProps, actionColumnProps = _d.actionColumnProps, hideAdd = _d.hideAdd, hideCopy = _d.hideCopy, hideMove = _d.hideMove, hideDelete = _d.hideDelete, onAdd = _d.onAdd, onRemove = _d.onRemove, onMove = _d.onMove, onCopy = _d.onCopy, otherListProps = __rest(_d, ["addBtnProps", "delConfirmProps", "actionColumnProps", "hideAdd", "hideCopy", "hideMove", "hideDelete", "onAdd", "onRemove", "onMove", "onCopy"]);
var handleAdd = function handleAdd2(add) {
return function(data) {
var addFunc = onAdd;
if (typeof onAdd === "string") {
addFunc = methods[onAdd];
}
if (isFunction$2(addFunc)) {
addFunc(function(funData) {
return add(funData || data);
}, {
schema: schema2,
data
});
return;
}
add(data);
};
};
var handleRemove = function handleRemove2(remove) {
return function(index2) {
var removeFunc = onRemove;
if (typeof onRemove === "string") {
removeFunc = methods[onRemove];
}
if (isFunction$2(removeFunc)) {
var data = form.getFieldValue([].concat(_toConsumableArray$7(preRootPath), _toConsumableArray$7(path2), [index2]));
removeFunc(function() {
return remove(index2);
}, {
schema: schema2,
index: index2,
data
});
return;
}
remove(index2);
};
};
var handleMove = function handleMove2(move2) {
return function(form2, to) {
var moveFunc = onMove;
if (typeof moveFunc === "string") {
moveFunc = methods[onMove];
}
if (isFunction$2(moveFunc)) {
moveFunc(function() {
return move2(form2, to);
}, {
schema: schema2,
form: form2,
to
});
return;
}
move2(form2, to);
};
};
var handleCopy = function handleCopy2(add, fields) {
return function(data) {
if (schema2.max && fields.length === schema2.max) {
return _message.warning(t2("copy_max_tip"));
}
var copyFunc = onCopy;
if (typeof onCopy === "string") {
copyFunc = methods[onCopy];
}
if (isFunction$2(copyFunc)) {
copyFunc(function(funData) {
return add(funData || data);
}, {
schema: schema2,
data
});
return;
}
add(data);
};
};
var handleDelete = function handleDelete2() {
if (isFunction$2(removeBtn === null || removeBtn === void 0 ? void 0 : removeBtn.onClick)) {
removeBtn.onClick(function() {
form.setSchemaByPath(path2, {
hidden: true
});
});
return;
}
form.setSchemaByPath(path2, {
hidden: true
});
};
var getValueFromKey = getParamValue(formCtx, upperCtx, schema2);
var readOnly = getValueFromKey("readOnly");
var preRootPath = (rootPath || []).splice(0, rootPath.length - 1);
var displayType = getValueFromKey("displayType");
if (hideMove === void 0 && ((_b = globalConfig2 === null || globalConfig2 === void 0 ? void 0 : globalConfig2.listOperate) === null || _b === void 0 ? void 0 : _b.hideMove)) {
hideMove = globalConfig2 === null || globalConfig2 === void 0 ? void 0 : globalConfig2.listOperate.hideMove;
}
if ((otherSchema === null || otherSchema === void 0 ? void 0 : otherSchema.min) > 0 && listData.length <= (otherSchema === null || otherSchema === void 0 ? void 0 : otherSchema.min)) {
hideDelete = true;
}
if ((otherSchema === null || otherSchema === void 0 ? void 0 : otherSchema.max) > 0 && (otherSchema === null || otherSchema === void 0 ? void 0 : otherSchema.max) <= listData.length) {
hideAdd = true;
}
if (hideAdd) {
hideCopy = true;
}
if (readOnly) {
hideAdd = true;
hideCopy = true;
hideDelete = true;
hideMove = true;
}
var operateBtnType = (_c = globalConfig2 === null || globalConfig2 === void 0 ? void 0 : globalConfig2.listOperate) === null || _c === void 0 ? void 0 : _c.btnType;
var ruleList = [];
if (!readOnly) {
ruleList = [{
validator: function validator2(_, data) {
return __awaiter(void 0, void 0, void 0, /* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee() {
var _e;
return _regeneratorRuntime$1().wrap(function _callee$(_context) {
while (1)
switch (_context.prev = _context.next) {
case 0:
setListData(data);
if (otherSchema === null || otherSchema === void 0 ? void 0 : otherSchema.min) {
_context.next = 3;
break;
}
return _context.abrupt("return");
case 3:
if (!(!data || data.length < otherSchema.min)) {
_context.next = 5;
break;
}
return _context.abrupt("return", Promise.reject(new Error(((_e = otherSchema === null || otherSchema === void 0 ? void 0 : otherSchema.message) === null || _e === void 0 ? void 0 : _e.min) || "\u6570\u636E\u957F\u5EA6\u5FC5\u987B\u5927\u4E8E\u7B49\u4E8E".concat(otherSchema.min))));
case 5:
case "end":
return _context.stop();
}
}, _callee);
}));
}
}].concat(_toConsumableArray$7(transformRules(rules2 || [], methods, form)));
}
return /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, /* @__PURE__ */ React__default.default.createElement(_Form.List, {
name: path2,
initialValue: defaultValue,
rules: ruleList
}, function(fields, operation, _ref) {
var errors = _ref.errors;
return /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx(Widget, {
...Object.assign({}, otherListProps, {
configContext,
form,
schema: otherSchema,
fields,
operation,
path: path2,
listName: path2,
parentLitPath,
rootPath: [].concat(_toConsumableArray$7(preRootPath), _toConsumableArray$7(path2)),
readOnly,
methods,
renderCore,
widgets,
hideAdd,
hideCopy,
hideDelete,
hideMove,
addItem: handleAdd(operation.add),
removeItem: handleRemove(operation.remove),
moveItem: handleMove(operation.move),
copyItem: handleCopy(operation.add, fields),
temporary: {
displayType
},
addBtnProps: Object.assign(Object.assign({}, defaultAddBtnProps), addBtnProps),
delConfirmProps: Object.assign(Object.assign({}, defaultDelConfirmProps), delConfirmProps),
actionColumnProps: Object.assign(Object.assign({}, defaultActionColumnProps), actionColumnProps),
copyBtnProps: {
children: t2("copy"),
btnType: operateBtnType
},
editorBtnProps: {
children: t2("edit"),
btnType: operateBtnType
},
deleteBtnProps: {
children: t2("delete"),
btnType: operateBtnType
},
moveUpBtnProps: {
children: t2("moveUp"),
btnType: operateBtnType
},
moveDownBtnProps: {
children: t2("moveDown"),
btnType: operateBtnType
}
})
}), (errors === null || errors === void 0 ? void 0 : errors.length) !== 0 && /* @__PURE__ */ React__default.default.createElement("div", {
style: {
marginBottom: "12px"
}
}, /* @__PURE__ */ React__default.default.createElement(_Form.ErrorList, {
errors
}))]
});
}), removeBtn && /* @__PURE__ */ React__default.default.createElement(Button$2, Object.assign({
type: "link",
danger: true
}, removeBtn, {
onClick: handleDelete
}), (removeBtn === null || removeBtn === void 0 ? void 0 : removeBtn.text) || t2("delete")));
};
function _slicedToArray$d(arr, i2) {
return _arrayWithHoles$d(arr) || _iterableToArrayLimit$d(arr, i2) || _unsupportedIterableToArray$f(arr, i2) || _nonIterableRest$d();
}
function _nonIterableRest$d() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$f(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$f(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$f(o, minLen);
}
function _arrayLikeToArray$f(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArrayLimit$d(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _arrayWithHoles$d(arr) {
if (Array.isArray(arr))
return arr;
}
var UpperContext = /* @__PURE__ */ React$a.createContext(function() {
});
const Main = function(props) {
var _useState = React$a.useState([]), _useState2 = _slicedToArray$d(_useState, 2), listData = _useState2[0], setListData = _useState2[1];
var configContext = props.configContext;
var store2 = React$a.useContext(FRContext);
var formCtx = useStore(store2, function(state) {
return state.context;
});
var upperCtx = React$a.useContext(UpperContext);
var form = configContext.form, widgets = configContext.widgets, methods = configContext.methods, globalConfig2 = configContext.globalConfig;
var displayType = formCtx.displayType;
var isDisplayColumn = displayType === "column";
var _schema = props.schema;
var formData = form.getFieldsValue(true);
var _store$getState = store2.getState(), formSchema = _store$getState.schema;
var items = _schema.items, className = _schema.className, otherSchema = __rest(_schema, ["items", "className"]);
var schema2 = (globalConfig2 === null || globalConfig2 === void 0 ? void 0 : globalConfig2.mustacheDisabled) ? _schema : Object.assign({
items
}, parseAllExpression(otherSchema, formData, props.rootPath, formSchema));
var widget = schema2.widget;
var widgetName = widget || "list1";
var getValueFromKey = getParamValue$1(formCtx, upperCtx, schema2);
var label = getLabel(schema2, displayType, widgets);
var tooltip = getTooltip$3(schema2, displayType);
var _getFormListLayout = getFormListLayout(getValueFromKey, displayType), labelCol = _getFormListLayout.labelCol, fieldCol = _getFormListLayout.fieldCol;
var isInline = schema2.display === "inline";
if (!(setListData === null || setListData === void 0 ? void 0 : setListData.length) && widgetName !== "drawerList") {
isInline = true;
}
if (schema2.hidden) {
return null;
}
return /* @__PURE__ */ React__default.default.createElement(Col$1, {
span: 24,
className
}, !isInline && !isDisplayColumn && label && /* @__PURE__ */ React__default.default.createElement(_Form.Item, {
className: "ant-form-item-optional-hide",
label,
labelAlign: "left",
colon: false,
tooltip,
style: {
marginBottom: 0
},
labelCol: {
span: 24
}
}), /* @__PURE__ */ React__default.default.createElement(
_Form.Item,
{
label,
labelCol: isDisplayColumn ? {
span: 24
} : labelCol,
wrapperCol: fieldCol,
noStyle: !isInline && !isDisplayColumn,
tooltip
},
/* @__PURE__ */ jsx(Main$1, {
...Object.assign({}, props, {
form,
methods,
formCtx,
upperCtx,
widgets,
configContext,
setListData,
listData
})
})
));
};
const FieldList = function(props) {
var _a;
var schema2 = props.schema, rootPath = props.rootPath;
var configCtx = React$a.useContext(ConfigContext);
var mustacheDisabled = (_a = configCtx === null || configCtx === void 0 ? void 0 : configCtx.globalConfig) === null || _a === void 0 ? void 0 : _a.mustacheDisabled;
var dependencies = schema2 === null || schema2 === void 0 ? void 0 : schema2.dependencies;
if (!isHasExpression(schema2) && !mustacheDisabled && (!dependencies || !(dependencies === null || dependencies === void 0 ? void 0 : dependencies.length))) {
return /* @__PURE__ */ jsx(Main, {
...Object.assign({
configContext: configCtx
}, props)
});
}
var schemaStr = JSON.stringify(schema2);
return /* @__PURE__ */ React__default.default.createElement(_Form.Item, {
noStyle: true,
shouldUpdate: fieldShouldUpdate(schemaStr, rootPath, dependencies)
}, function() {
return /* @__PURE__ */ jsx(Main, {
...Object.assign({
configContext: configCtx
}, props)
});
});
};
function _slicedToArray$c(arr, i2) {
return _arrayWithHoles$c(arr) || _iterableToArrayLimit$c(arr, i2) || _unsupportedIterableToArray$e(arr, i2) || _nonIterableRest$c();
}
function _nonIterableRest$c() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$e(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$e(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$e(o, minLen);
}
function _arrayLikeToArray$e(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArrayLimit$c(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _arrayWithHoles$c(arr) {
if (Array.isArray(arr))
return arr;
}
const sortProperties = function(properties) {
var orderKey = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "order";
var orderHash = /* @__PURE__ */ new Map();
var unsortedList = [];
var insert = function insert2(item) {
var _item = _slicedToArray$c(item, 2), value = _item[1];
if (typeof value[orderKey] !== "number") {
unsortedList.push(item);
return;
}
if (orderHash.has(value[orderKey])) {
orderHash.get(value[orderKey]).push(item);
} else {
orderHash.set(value[orderKey], [item]);
}
};
properties.forEach(function(item) {
return insert(item);
});
var sortedList = Array.from(orderHash.entries()).sort(function(_ref, _ref2) {
var _ref3 = _slicedToArray$c(_ref, 1), order1 = _ref3[0];
var _ref4 = _slicedToArray$c(_ref2, 1), order2 = _ref4[0];
return order1 - order2;
}).flatMap(function(_ref5) {
var _ref6 = _slicedToArray$c(_ref5, 2), items = _ref6[1];
return items;
});
return sortedList.concat(unsortedList);
};
const index$Q = "";
function _toConsumableArray$6(arr) {
return _arrayWithoutHoles$6(arr) || _iterableToArray$6(arr) || _unsupportedIterableToArray$d(arr) || _nonIterableSpread$6();
}
function _nonIterableSpread$6() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _iterableToArray$6(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
return Array.from(iter);
}
function _arrayWithoutHoles$6(arr) {
if (Array.isArray(arr))
return _arrayLikeToArray$d(arr);
}
function _slicedToArray$b(arr, i2) {
return _arrayWithHoles$b(arr) || _iterableToArrayLimit$b(arr, i2) || _unsupportedIterableToArray$d(arr, i2) || _nonIterableRest$b();
}
function _nonIterableRest$b() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$d(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$d(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$d(o, minLen);
}
function _arrayLikeToArray$d(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArrayLimit$b(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _arrayWithHoles$b(arr) {
if (Array.isArray(arr))
return arr;
}
var renderItem = function renderItem2(props) {
var _a;
var schema2 = props.schema, key2 = props.key, path2 = props.path, rootPath = props.rootPath;
if (schema2.type === "array" && ((_a = schema2.items) === null || _a === void 0 ? void 0 : _a.type) === "object") {
return /* @__PURE__ */ jsx(FieldList, {
schema: schema2,
path: path2,
rootPath,
renderCore: RenderCore
}, key2);
}
var child = null;
if ((schema2 === null || schema2 === void 0 ? void 0 : schema2.properties) && (schema2 === null || schema2 === void 0 ? void 0 : schema2.widgetType) !== "field") {
child = RenderCore({
schema: schema2,
parentPath: path2,
rootPath
});
path2 = void 0;
}
return /* @__PURE__ */ jsx(FieldItem, {
schema: schema2,
path: path2,
rootPath,
children: child,
renderCore: RenderCore
}, key2);
};
var RenderCore = function RenderCore2(props) {
var schema2 = props.schema, _props$parentPath = props.parentPath, parentPath = _props$parentPath === void 0 ? [] : _props$parentPath, _props$rootPath = props.rootPath, rootPath = _props$rootPath === void 0 ? [] : _props$rootPath;
if (!schema2 || Object.keys(schema2).length === 0) {
return null;
}
if (schema2 === null || schema2 === void 0 ? void 0 : schema2.items) {
return renderItem({
schema: schema2.items,
path: parentPath,
rootPath
});
}
return sortProperties(Object.entries(schema2.properties || {})).map(function(_ref) {
var _ref2 = _slicedToArray$b(_ref, 2), key2 = _ref2[0], item = _ref2[1];
var path2 = [].concat(_toConsumableArray$6(parentPath), [key2]);
return renderItem({
schema: item,
path: path2,
key: key2,
rootPath
});
});
};
const index$P = "";
function _typeof$j(obj) {
"@babel/helpers - typeof";
return _typeof$j = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof$j(obj);
}
function _regeneratorRuntime() {
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
_regeneratorRuntime = function _regeneratorRuntime2() {
return exports2;
};
var exports2 = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty2 = Object.defineProperty || function(obj, key2, desc) {
obj[key2] = desc.value;
}, $Symbol2 = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol2.iterator || "@@iterator", asyncIteratorSymbol = $Symbol2.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol2.toStringTag || "@@toStringTag";
function define(obj, key2, value) {
return Object.defineProperty(obj, key2, {
value,
enumerable: true,
configurable: true,
writable: true
}), obj[key2];
}
try {
define({}, "");
} catch (err) {
define = function define2(obj, key2, value) {
return obj[key2] = value;
};
}
function wrap2(innerFn, outerFn, self2, tryLocsList) {
var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context2 = new Context2(tryLocsList || []);
return defineProperty2(generator, "_invoke", {
value: makeInvokeMethod(innerFn, self2, context2)
}), generator;
}
function tryCatch(fn, obj, arg) {
try {
return {
type: "normal",
arg: fn.call(obj, arg)
};
} catch (err) {
return {
type: "throw",
arg: err
};
}
}
exports2.wrap = wrap2;
var ContinueSentinel = {};
function Generator() {
}
function GeneratorFunction() {
}
function GeneratorFunctionPrototype() {
}
var IteratorPrototype2 = {};
define(IteratorPrototype2, iteratorSymbol, function() {
return this;
});
var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([])));
NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype2 = NativeIteratorPrototype);
var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype2);
function defineIteratorMethods(prototype2) {
["next", "throw", "return"].forEach(function(method2) {
define(prototype2, method2, function(arg) {
return this._invoke(method2, arg);
});
});
}
function AsyncIterator(generator, PromiseImpl) {
function invoke(method2, arg, resolve, reject) {
var record = tryCatch(generator[method2], generator, arg);
if ("throw" !== record.type) {
var result = record.arg, value = result.value;
return value && "object" == _typeof$j(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function(value2) {
invoke("next", value2, resolve, reject);
}, function(err) {
invoke("throw", err, resolve, reject);
}) : PromiseImpl.resolve(value).then(function(unwrapped) {
result.value = unwrapped, resolve(result);
}, function(error) {
return invoke("throw", error, resolve, reject);
});
}
reject(record.arg);
}
var previousPromise;
defineProperty2(this, "_invoke", {
value: function value(method2, arg) {
function callInvokeWithMethodAndArg() {
return new PromiseImpl(function(resolve, reject) {
invoke(method2, arg, resolve, reject);
});
}
return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
}
});
}
function makeInvokeMethod(innerFn, self2, context2) {
var state = "suspendedStart";
return function(method2, arg) {
if ("executing" === state)
throw new Error("Generator is already running");
if ("completed" === state) {
if ("throw" === method2)
throw arg;
return doneResult();
}
for (context2.method = method2, context2.arg = arg; ; ) {
var delegate = context2.delegate;
if (delegate) {
var delegateResult = maybeInvokeDelegate(delegate, context2);
if (delegateResult) {
if (delegateResult === ContinueSentinel)
continue;
return delegateResult;
}
}
if ("next" === context2.method)
context2.sent = context2._sent = context2.arg;
else if ("throw" === context2.method) {
if ("suspendedStart" === state)
throw state = "completed", context2.arg;
context2.dispatchException(context2.arg);
} else
"return" === context2.method && context2.abrupt("return", context2.arg);
state = "executing";
var record = tryCatch(innerFn, self2, context2);
if ("normal" === record.type) {
if (state = context2.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel)
continue;
return {
value: record.arg,
done: context2.done
};
}
"throw" === record.type && (state = "completed", context2.method = "throw", context2.arg = record.arg);
}
};
}
function maybeInvokeDelegate(delegate, context2) {
var methodName = context2.method, method2 = delegate.iterator[methodName];
if (void 0 === method2)
return context2.delegate = null, "throw" === methodName && delegate.iterator.return && (context2.method = "return", context2.arg = void 0, maybeInvokeDelegate(delegate, context2), "throw" === context2.method) || "return" !== methodName && (context2.method = "throw", context2.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel;
var record = tryCatch(method2, delegate.iterator, context2.arg);
if ("throw" === record.type)
return context2.method = "throw", context2.arg = record.arg, context2.delegate = null, ContinueSentinel;
var info = record.arg;
return info ? info.done ? (context2[delegate.resultName] = info.value, context2.next = delegate.nextLoc, "return" !== context2.method && (context2.method = "next", context2.arg = void 0), context2.delegate = null, ContinueSentinel) : info : (context2.method = "throw", context2.arg = new TypeError("iterator result is not an object"), context2.delegate = null, ContinueSentinel);
}
function pushTryEntry(locs) {
var entry = {
tryLoc: locs[0]
};
1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry);
}
function resetTryEntry(entry) {
var record = entry.completion || {};
record.type = "normal", delete record.arg, entry.completion = record;
}
function Context2(tryLocsList) {
this.tryEntries = [{
tryLoc: "root"
}], tryLocsList.forEach(pushTryEntry, this), this.reset(true);
}
function values(iterable) {
if (iterable) {
var iteratorMethod = iterable[iteratorSymbol];
if (iteratorMethod)
return iteratorMethod.call(iterable);
if ("function" == typeof iterable.next)
return iterable;
if (!isNaN(iterable.length)) {
var i2 = -1, next = function next2() {
for (; ++i2 < iterable.length; )
if (hasOwn.call(iterable, i2))
return next2.value = iterable[i2], next2.done = false, next2;
return next2.value = void 0, next2.done = true, next2;
};
return next.next = next;
}
}
return {
next: doneResult
};
}
function doneResult() {
return {
value: void 0,
done: true
};
}
return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty2(Gp, "constructor", {
value: GeneratorFunctionPrototype,
configurable: true
}), defineProperty2(GeneratorFunctionPrototype, "constructor", {
value: GeneratorFunction,
configurable: true
}), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports2.isGeneratorFunction = function(genFun) {
var ctor = "function" == typeof genFun && genFun.constructor;
return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name));
}, exports2.mark = function(genFun) {
return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun;
}, exports2.awrap = function(arg) {
return {
__await: arg
};
}, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function() {
return this;
}), exports2.AsyncIterator = AsyncIterator, exports2.async = function(innerFn, outerFn, self2, tryLocsList, PromiseImpl) {
void 0 === PromiseImpl && (PromiseImpl = Promise);
var iter = new AsyncIterator(wrap2(innerFn, outerFn, self2, tryLocsList), PromiseImpl);
return exports2.isGeneratorFunction(outerFn) ? iter : iter.next().then(function(result) {
return result.done ? result.value : iter.next();
});
}, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function() {
return this;
}), define(Gp, "toString", function() {
return "[object Generator]";
}), exports2.keys = function(val) {
var object2 = Object(val), keys2 = [];
for (var key2 in object2)
keys2.push(key2);
return keys2.reverse(), function next() {
for (; keys2.length; ) {
var key3 = keys2.pop();
if (key3 in object2)
return next.value = key3, next.done = false, next;
}
return next.done = true, next;
};
}, exports2.values = values, Context2.prototype = {
constructor: Context2,
reset: function reset(skipTempReset) {
if (this.prev = 0, this.next = 0, this.sent = this._sent = void 0, this.done = false, this.delegate = null, this.method = "next", this.arg = void 0, this.tryEntries.forEach(resetTryEntry), !skipTempReset)
for (var name2 in this)
"t" === name2.charAt(0) && hasOwn.call(this, name2) && !isNaN(+name2.slice(1)) && (this[name2] = void 0);
},
stop: function stop() {
this.done = true;
var rootRecord = this.tryEntries[0].completion;
if ("throw" === rootRecord.type)
throw rootRecord.arg;
return this.rval;
},
dispatchException: function dispatchException(exception) {
if (this.done)
throw exception;
var context2 = this;
function handle(loc, caught) {
return record.type = "throw", record.arg = exception, context2.next = loc, caught && (context2.method = "next", context2.arg = void 0), !!caught;
}
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2], record = entry.completion;
if ("root" === entry.tryLoc)
return handle("end");
if (entry.tryLoc <= this.prev) {
var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc");
if (hasCatch && hasFinally) {
if (this.prev < entry.catchLoc)
return handle(entry.catchLoc, true);
if (this.prev < entry.finallyLoc)
return handle(entry.finallyLoc);
} else if (hasCatch) {
if (this.prev < entry.catchLoc)
return handle(entry.catchLoc, true);
} else {
if (!hasFinally)
throw new Error("try statement without catch or finally");
if (this.prev < entry.finallyLoc)
return handle(entry.finallyLoc);
}
}
}
},
abrupt: function abrupt(type2, arg) {
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2];
if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
var finallyEntry = entry;
break;
}
}
finallyEntry && ("break" === type2 || "continue" === type2) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null);
var record = finallyEntry ? finallyEntry.completion : {};
return record.type = type2, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record);
},
complete: function complete(record, afterLoc) {
if ("throw" === record.type)
throw record.arg;
return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel;
},
finish: function finish(finallyLoc) {
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2];
if (entry.finallyLoc === finallyLoc)
return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel;
}
},
catch: function _catch(tryLoc) {
for (var i2 = this.tryEntries.length - 1; i2 >= 0; --i2) {
var entry = this.tryEntries[i2];
if (entry.tryLoc === tryLoc) {
var record = entry.completion;
if ("throw" === record.type) {
var thrown = record.arg;
resetTryEntry(entry);
}
return thrown;
}
}
throw new Error("illegal catch attempt");
},
delegateYield: function delegateYield(iterable, resultName, nextLoc) {
return this.delegate = {
iterator: values(iterable),
resultName,
nextLoc
}, "next" === this.method && (this.arg = void 0), ContinueSentinel;
}
}, exports2;
}
var FormCore = function FormCore2(props) {
var _a, _b, _c, _d, _e;
var store2 = React$a.useContext(FRContext);
var schema2 = useStore(store2, function(state) {
return state.schema;
});
var flattenSchema2 = useStore(store2, function(state) {
return state.flattenSchema;
});
var setContext = useStore(store2, function(state) {
return state.setContext;
});
var configCtx = React$a.useContext(_ConfigProvider.ConfigContext);
var t2 = translation$1(configCtx);
var _f = schema2 || {};
_f.type;
_f.properties;
var schemProps = __rest(_f, ["type", "properties"]);
var _transformProps = transformProps(Object.assign(Object.assign({}, props), schemProps)), formProps = _transformProps.formProps, displayType = _transformProps.displayType, beforeFinish = _transformProps.beforeFinish, watch = _transformProps.watch, onMount = _transformProps.onMount, column = _transformProps.column, labelWidth = _transformProps.labelWidth, labelCol = _transformProps.labelCol, fieldCol = _transformProps.fieldCol, maxWidth = _transformProps.maxWidth, form = _transformProps.form, onFinish = _transformProps.onFinish, onFinishFailed = _transformProps.onFinishFailed, readOnly = _transformProps.readOnly, disabled = _transformProps.disabled, footer = _transformProps.footer, removeHiddenData = _transformProps.removeHiddenData, operateExtra = _transformProps.operateExtra, logOnMount = _transformProps.logOnMount, logOnSubmit = _transformProps.logOnSubmit, id2 = _transformProps.id, className = _transformProps.className, validateTrigger = _transformProps.validateTrigger;
React$a.useEffect(function() {
form.__initStore(store2);
setTimeout(initial, 0);
}, []);
React$a.useEffect(function() {
form.setSchema(props.schema, true);
}, [JSON.stringify(props.schema || {})]);
React$a.useEffect(function() {
var context2 = {
column,
readOnly,
disabled,
labelWidth,
displayType,
labelCol,
fieldCol,
maxWidth,
validateTrigger
};
setContext(context2);
}, [column, labelCol, fieldCol, displayType, labelWidth, maxWidth, readOnly, disabled, validateTrigger]);
var initial = function initial2() {
return __awaiter(void 0, void 0, void 0, /* @__PURE__ */ _regeneratorRuntime().mark(function _callee() {
return _regeneratorRuntime().wrap(function _callee$(_context) {
while (1)
switch (_context.prev = _context.next) {
case 0:
_context.t0 = onMount;
if (!_context.t0) {
_context.next = 4;
break;
}
_context.next = 4;
return onMount();
case 4:
onMountLogger();
setTimeout(function() {
var values = form.getValues();
immediateWatch(watch, values);
}, 0);
case 6:
case "end":
return _context.stop();
}
}, _callee);
}));
};
var onMountLogger = function onMountLogger2() {
var start = new Date().getTime();
if (isFunction$2(logOnMount) || isFunction$2(logOnSubmit)) {
setSessionItem("FORM_MOUNT_TIME", start);
setSessionItem("FORM_START", start);
}
if (isFunction$2(logOnMount)) {
var logParams = {
schema: props.schema,
url: location.href,
formData: JSON.stringify(form.getValues()),
formMount: yymmdd(start)
};
if (id2) {
logParams.id = id2;
}
logOnMount(logParams);
}
if (isFunction$2(logOnSubmit)) {
setSessionItem("NUMBER_OF_SUBMITS", 0);
setSessionItem("FAILED_ATTEMPTS", 0);
}
};
var onSubmitLogger = function onSubmitLogger2(params) {
if (!isFunction$2(logOnSubmit)) {
return;
}
var start = getSessionItem("FORM_START");
var mount = getSessionItem("FORM_MOUNT_TIME");
var numberOfSubmits = getSessionItem("NUMBER_OF_SUBMITS") + 1;
var end = new Date().getTime();
var failedAttempts = getSessionItem("FAILED_ATTEMPTS");
if (params.errorFields.length > 0) {
failedAttempts = failedAttempts + 1;
}
var logParams = {
formMount: yymmdd(mount),
ms: end - start,
duration: msToTime(end - start),
numberOfSubmits,
failedAttempts,
url: location.href,
formData: JSON.stringify(params.values),
errors: JSON.stringify(params.errorFields),
schema: JSON.stringify(schema2)
};
if (id2) {
logParams.id = id2;
}
logOnSubmit(logParams);
setSessionItem("FORM_START", end);
setSessionItem("NUMBER_OF_SUBMITS", numberOfSubmits);
setSessionItem("FAILED_ATTEMPTS", failedAttempts);
};
var handleValuesChange = function handleValuesChange2(changedValues, _allValues) {
var allValues = valueRemoveUndefined(_allValues, true);
valuesWatch(changedValues, allValues, watch);
};
var handleFinish = function handleFinish2(_values) {
return __awaiter(void 0, void 0, void 0, /* @__PURE__ */ _regeneratorRuntime().mark(function _callee2() {
var values, fieldsError;
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
while (1)
switch (_context2.prev = _context2.next) {
case 0:
onSubmitLogger({
values: _values
});
values = _cloneDeep(_values);
if (!removeHiddenData) {
values = _cloneDeep(form.getFieldsValue(true));
}
values = parseValuesToBind(values, flattenSchema2);
values = valueRemoveUndefined(values);
if (!beforeFinish) {
_context2.next = 11;
break;
}
_context2.next = 8;
return beforeFinish({
data: values,
schema: schema2,
errors: []
});
case 8:
_context2.t0 = _context2.sent;
_context2.next = 12;
break;
case 11:
_context2.t0 = null;
case 12:
fieldsError = _context2.t0;
if (!fieldsError) {
_context2.next = 16;
break;
}
form.setFields(fieldsError);
return _context2.abrupt("return");
case 16:
onFinish && onFinish(values, []);
case 17:
case "end":
return _context2.stop();
}
}, _callee2);
}));
};
var handleFinishFailed = function handleFinishFailed2(params) {
return __awaiter(void 0, void 0, void 0, /* @__PURE__ */ _regeneratorRuntime().mark(function _callee3() {
var values;
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
while (1)
switch (_context3.prev = _context3.next) {
case 0:
onSubmitLogger(params);
if (onFinishFailed) {
_context3.next = 3;
break;
}
return _context3.abrupt("return");
case 3:
values = _cloneDeep(params === null || params === void 0 ? void 0 : params.values);
if (!removeHiddenData) {
values = _cloneDeep(form.getFieldsValue(true));
}
values = parseValuesToBind(values, flattenSchema2);
values = valueRemoveUndefined(values);
onFinishFailed(Object.assign(Object.assign({}, params), {
values
}));
case 8:
case "end":
return _context3.stop();
}
}, _callee3);
}));
};
var operlabelCol = (_a = getFormItemLayout(column, {}, {
labelWidth
})) === null || _a === void 0 ? void 0 : _a.labelCol;
var classRest = {};
if (className) {
classRest[className] = true;
}
return /* @__PURE__ */ React__default.default.createElement(_Form, Object.assign({
className: classnames("fr-form", classRest),
labelWrap: true
}, formProps, {
disabled,
form,
onFinish: handleFinish,
onFinishFailed: handleFinishFailed,
onValuesChange: handleValuesChange
}), /* @__PURE__ */ React__default.default.createElement(
Row$1,
{
gutter: displayType === "row" ? 16 : 24
},
/* @__PURE__ */ jsx(RenderCore, {
schema: schema2
}),
operateExtra
), schema2 && !!footer && /* @__PURE__ */ React__default.default.createElement(Row$1, {
gutter: displayType === "row" ? 16 : 24
}, /* @__PURE__ */ React__default.default.createElement(Col$1, {
span: 24 / column
}, /* @__PURE__ */ React__default.default.createElement(_Form.Item, {
label: displayType !== "column" ? "hideLabel" : null,
labelCol: operlabelCol,
className: "fr-hide-label"
}, isFunction$2(footer) ? /* @__PURE__ */ React__default.default.createElement(_Space, null, footer()) : /* @__PURE__ */ React__default.default.createElement(_Space, null, !((_b = footer === null || footer === void 0 ? void 0 : footer.reset) === null || _b === void 0 ? void 0 : _b.hide) && /* @__PURE__ */ React__default.default.createElement(Button$2, Object.assign({}, footer === null || footer === void 0 ? void 0 : footer.reset, {
onClick: function onClick() {
return form.resetFields();
}
}), ((_c = footer === null || footer === void 0 ? void 0 : footer.reset) === null || _c === void 0 ? void 0 : _c.text) || t2("reset")), !((_d = footer === null || footer === void 0 ? void 0 : footer.submit) === null || _d === void 0 ? void 0 : _d.hide) && /* @__PURE__ */ React__default.default.createElement(Button$2, Object.assign({
type: "primary",
onClick: form.submit
}, footer === null || footer === void 0 ? void 0 : footer.submit), ((_e = footer === null || footer === void 0 ? void 0 : footer.submit) === null || _e === void 0 ? void 0 : _e.text) || t2("submit")))))));
};
var zh_CN$5 = {};
var interopRequireDefault = { exports: {} };
(function(module2) {
function _interopRequireDefault2(obj) {
return obj && obj.__esModule ? obj : {
"default": obj
};
}
module2.exports = _interopRequireDefault2, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(interopRequireDefault);
var zh_CN$4 = {};
Object.defineProperty(zh_CN$4, "__esModule", {
value: true
});
zh_CN$4.default = void 0;
var _default$n = {
items_per_page: "\u6761/\u9875",
jump_to: "\u8DF3\u81F3",
jump_to_confirm: "\u786E\u5B9A",
page: "\u9875",
prev_page: "\u4E0A\u4E00\u9875",
next_page: "\u4E0B\u4E00\u9875",
prev_5: "\u5411\u524D 5 \u9875",
next_5: "\u5411\u540E 5 \u9875",
prev_3: "\u5411\u524D 3 \u9875",
next_3: "\u5411\u540E 3 \u9875",
page_size: "\u9875\u7801"
};
zh_CN$4.default = _default$n;
var zh_CN$3 = {};
var zh_CN$2 = {};
var _extends$1 = { exports: {} };
(function(module2) {
function _extends2() {
module2.exports = _extends2 = Object.assign ? Object.assign.bind() : function(target) {
for (var i2 = 1; i2 < arguments.length; i2++) {
var source = arguments[i2];
for (var key2 in source) {
if (Object.prototype.hasOwnProperty.call(source, key2)) {
target[key2] = source[key2];
}
}
}
return target;
}, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
return _extends2.apply(this, arguments);
}
module2.exports = _extends2, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(_extends$1);
var zh_CN$1 = {};
Object.defineProperty(zh_CN$1, "__esModule", {
value: true
});
zh_CN$1.default = void 0;
var locale$1 = {
locale: "zh_CN",
today: "\u4ECA\u5929",
now: "\u6B64\u523B",
backToToday: "\u8FD4\u56DE\u4ECA\u5929",
ok: "\u786E\u5B9A",
timeSelect: "\u9009\u62E9\u65F6\u95F4",
dateSelect: "\u9009\u62E9\u65E5\u671F",
weekSelect: "\u9009\u62E9\u5468",
clear: "\u6E05\u9664",
month: "\u6708",
year: "\u5E74",
previousMonth: "\u4E0A\u4E2A\u6708 (\u7FFB\u9875\u4E0A\u952E)",
nextMonth: "\u4E0B\u4E2A\u6708 (\u7FFB\u9875\u4E0B\u952E)",
monthSelect: "\u9009\u62E9\u6708\u4EFD",
yearSelect: "\u9009\u62E9\u5E74\u4EFD",
decadeSelect: "\u9009\u62E9\u5E74\u4EE3",
yearFormat: "YYYY\u5E74",
dayFormat: "D\u65E5",
dateFormat: "YYYY\u5E74M\u6708D\u65E5",
dateTimeFormat: "YYYY\u5E74M\u6708D\u65E5 HH\u65F6mm\u5206ss\u79D2",
previousYear: "\u4E0A\u4E00\u5E74 (Control\u952E\u52A0\u5DE6\u65B9\u5411\u952E)",
nextYear: "\u4E0B\u4E00\u5E74 (Control\u952E\u52A0\u53F3\u65B9\u5411\u952E)",
previousDecade: "\u4E0A\u4E00\u5E74\u4EE3",
nextDecade: "\u4E0B\u4E00\u5E74\u4EE3",
previousCentury: "\u4E0A\u4E00\u4E16\u7EAA",
nextCentury: "\u4E0B\u4E00\u4E16\u7EAA"
};
var _default$m = locale$1;
zh_CN$1.default = _default$m;
var zh_CN = {};
(function(exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
exports2["default"] = void 0;
var locale2 = {
placeholder: "\u8BF7\u9009\u62E9\u65F6\u95F4",
rangePlaceholder: ["\u5F00\u59CB\u65F6\u95F4", "\u7ED3\u675F\u65F6\u95F4"]
};
var _default2 = locale2;
exports2["default"] = _default2;
})(zh_CN);
(function(exports2) {
var _interopRequireDefault2 = interopRequireDefault.exports["default"];
Object.defineProperty(exports2, "__esModule", {
value: true
});
exports2["default"] = void 0;
var _extends2 = _interopRequireDefault2(_extends$1.exports);
var _zh_CN = _interopRequireDefault2(zh_CN$1);
var _zh_CN2 = _interopRequireDefault2(zh_CN);
var locale2 = {
lang: (0, _extends2["default"])({
placeholder: "\u8BF7\u9009\u62E9\u65E5\u671F",
yearPlaceholder: "\u8BF7\u9009\u62E9\u5E74\u4EFD",
quarterPlaceholder: "\u8BF7\u9009\u62E9\u5B63\u5EA6",
monthPlaceholder: "\u8BF7\u9009\u62E9\u6708\u4EFD",
weekPlaceholder: "\u8BF7\u9009\u62E9\u5468",
rangePlaceholder: ["\u5F00\u59CB\u65E5\u671F", "\u7ED3\u675F\u65E5\u671F"],
rangeYearPlaceholder: ["\u5F00\u59CB\u5E74\u4EFD", "\u7ED3\u675F\u5E74\u4EFD"],
rangeMonthPlaceholder: ["\u5F00\u59CB\u6708\u4EFD", "\u7ED3\u675F\u6708\u4EFD"],
rangeQuarterPlaceholder: ["\u5F00\u59CB\u5B63\u5EA6", "\u7ED3\u675F\u5B63\u5EA6"],
rangeWeekPlaceholder: ["\u5F00\u59CB\u5468", "\u7ED3\u675F\u5468"]
}, _zh_CN["default"]),
timePickerLocale: (0, _extends2["default"])({}, _zh_CN2["default"])
};
locale2.lang.ok = "\u786E\u5B9A";
var _default2 = locale2;
exports2["default"] = _default2;
})(zh_CN$2);
(function(exports2) {
var _interopRequireDefault2 = interopRequireDefault.exports["default"];
Object.defineProperty(exports2, "__esModule", {
value: true
});
exports2["default"] = void 0;
var _zh_CN = _interopRequireDefault2(zh_CN$2);
var _default2 = _zh_CN["default"];
exports2["default"] = _default2;
})(zh_CN$3);
(function(exports2) {
var _interopRequireDefault2 = interopRequireDefault.exports["default"];
Object.defineProperty(exports2, "__esModule", {
value: true
});
exports2["default"] = void 0;
var _zh_CN = _interopRequireDefault2(zh_CN$4);
var _zh_CN2 = _interopRequireDefault2(zh_CN$3);
var _zh_CN3 = _interopRequireDefault2(zh_CN$2);
var _zh_CN4 = _interopRequireDefault2(zh_CN);
var typeTemplate2 = "${label}\u4E0D\u662F\u4E00\u4E2A\u6709\u6548\u7684${type}";
var localeValues2 = {
locale: "zh-cn",
Pagination: _zh_CN["default"],
DatePicker: _zh_CN3["default"],
TimePicker: _zh_CN4["default"],
Calendar: _zh_CN2["default"],
global: {
placeholder: "\u8BF7\u9009\u62E9"
},
Table: {
filterTitle: "\u7B5B\u9009",
filterConfirm: "\u786E\u5B9A",
filterReset: "\u91CD\u7F6E",
filterEmptyText: "\u65E0\u7B5B\u9009\u9879",
filterCheckall: "\u5168\u9009",
filterSearchPlaceholder: "\u5728\u7B5B\u9009\u9879\u4E2D\u641C\u7D22",
selectAll: "\u5168\u9009\u5F53\u9875",
selectInvert: "\u53CD\u9009\u5F53\u9875",
selectNone: "\u6E05\u7A7A\u6240\u6709",
selectionAll: "\u5168\u9009\u6240\u6709",
sortTitle: "\u6392\u5E8F",
expand: "\u5C55\u5F00\u884C",
collapse: "\u5173\u95ED\u884C",
triggerDesc: "\u70B9\u51FB\u964D\u5E8F",
triggerAsc: "\u70B9\u51FB\u5347\u5E8F",
cancelSort: "\u53D6\u6D88\u6392\u5E8F"
},
Modal: {
okText: "\u786E\u5B9A",
cancelText: "\u53D6\u6D88",
justOkText: "\u77E5\u9053\u4E86"
},
Popconfirm: {
cancelText: "\u53D6\u6D88",
okText: "\u786E\u5B9A"
},
Transfer: {
titles: ["", ""],
searchPlaceholder: "\u8BF7\u8F93\u5165\u641C\u7D22\u5185\u5BB9",
itemUnit: "\u9879",
itemsUnit: "\u9879",
remove: "\u5220\u9664",
selectCurrent: "\u5168\u9009\u5F53\u9875",
removeCurrent: "\u5220\u9664\u5F53\u9875",
selectAll: "\u5168\u9009\u6240\u6709",
removeAll: "\u5220\u9664\u5168\u90E8",
selectInvert: "\u53CD\u9009\u5F53\u9875"
},
Upload: {
uploading: "\u6587\u4EF6\u4E0A\u4F20\u4E2D",
removeFile: "\u5220\u9664\u6587\u4EF6",
uploadError: "\u4E0A\u4F20\u9519\u8BEF",
previewFile: "\u9884\u89C8\u6587\u4EF6",
downloadFile: "\u4E0B\u8F7D\u6587\u4EF6"
},
Empty: {
description: "\u6682\u65E0\u6570\u636E"
},
Icon: {
icon: "\u56FE\u6807"
},
Text: {
edit: "\u7F16\u8F91",
copy: "\u590D\u5236",
copied: "\u590D\u5236\u6210\u529F",
expand: "\u5C55\u5F00"
},
PageHeader: {
back: "\u8FD4\u56DE"
},
Form: {
optional: "\uFF08\u53EF\u9009\uFF09",
defaultValidateMessages: {
"default": "\u5B57\u6BB5\u9A8C\u8BC1\u9519\u8BEF${label}",
required: "\u8BF7\u8F93\u5165${label}",
"enum": "${label}\u5FC5\u987B\u662F\u5176\u4E2D\u4E00\u4E2A[${enum}]",
whitespace: "${label}\u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26",
date: {
format: "${label}\u65E5\u671F\u683C\u5F0F\u65E0\u6548",
parse: "${label}\u4E0D\u80FD\u8F6C\u6362\u4E3A\u65E5\u671F",
invalid: "${label}\u662F\u4E00\u4E2A\u65E0\u6548\u65E5\u671F"
},
types: {
string: typeTemplate2,
method: typeTemplate2,
array: typeTemplate2,
object: typeTemplate2,
number: typeTemplate2,
date: typeTemplate2,
"boolean": typeTemplate2,
integer: typeTemplate2,
"float": typeTemplate2,
regexp: typeTemplate2,
email: typeTemplate2,
url: typeTemplate2,
hex: typeTemplate2
},
string: {
len: "${label}\u987B\u4E3A${len}\u4E2A\u5B57\u7B26",
min: "${label}\u6700\u5C11${min}\u4E2A\u5B57\u7B26",
max: "${label}\u6700\u591A${max}\u4E2A\u5B57\u7B26",
range: "${label}\u987B\u5728${min}-${max}\u5B57\u7B26\u4E4B\u95F4"
},
number: {
len: "${label}\u5FC5\u987B\u7B49\u4E8E${len}",
min: "${label}\u6700\u5C0F\u503C\u4E3A${min}",
max: "${label}\u6700\u5927\u503C\u4E3A${max}",
range: "${label}\u987B\u5728${min}-${max}\u4E4B\u95F4"
},
array: {
len: "\u987B\u4E3A${len}\u4E2A${label}",
min: "\u6700\u5C11${min}\u4E2A${label}",
max: "\u6700\u591A${max}\u4E2A${label}",
range: "${label}\u6570\u91CF\u987B\u5728${min}-${max}\u4E4B\u95F4"
},
pattern: {
mismatch: "${label}\u4E0E\u6A21\u5F0F\u4E0D\u5339\u914D${pattern}"
}
}
},
Image: {
preview: "\u9884\u89C8"
}
};
var _default2 = localeValues2;
exports2["default"] = _default2;
})(zh_CN$5);
const zhCN$1 = /* @__PURE__ */ getDefaultExportFromCjs(zh_CN$5);
var en_US$5 = {};
var _default$l = {};
var en_US$4 = {};
Object.defineProperty(en_US$4, "__esModule", {
value: true
});
en_US$4.default = void 0;
var _default$k = {
items_per_page: "/ page",
jump_to: "Go to",
jump_to_confirm: "confirm",
page: "Page",
prev_page: "Previous Page",
next_page: "Next Page",
prev_5: "Previous 5 Pages",
next_5: "Next 5 Pages",
prev_3: "Previous 3 Pages",
next_3: "Next 3 Pages",
page_size: "Page Size"
};
en_US$4.default = _default$k;
var en_US$3 = {};
var en_US$2 = {};
var en_US$1 = {};
Object.defineProperty(en_US$1, "__esModule", {
value: true
});
en_US$1.default = void 0;
var locale = {
locale: "en_US",
today: "Today",
now: "Now",
backToToday: "Back to today",
ok: "OK",
clear: "Clear",
month: "Month",
year: "Year",
timeSelect: "select time",
dateSelect: "select date",
weekSelect: "Choose a week",
monthSelect: "Choose a month",
yearSelect: "Choose a year",
decadeSelect: "Choose a decade",
yearFormat: "YYYY",
dateFormat: "M/D/YYYY",
dayFormat: "D",
dateTimeFormat: "M/D/YYYY HH:mm:ss",
monthBeforeYear: true,
previousMonth: "Previous month (PageUp)",
nextMonth: "Next month (PageDown)",
previousYear: "Last year (Control + left)",
nextYear: "Next year (Control + right)",
previousDecade: "Last decade",
nextDecade: "Next decade",
previousCentury: "Last century",
nextCentury: "Next century"
};
var _default$j = locale;
en_US$1.default = _default$j;
var en_US = {};
(function(exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
exports2["default"] = void 0;
var locale2 = {
placeholder: "Select time",
rangePlaceholder: ["Start time", "End time"]
};
var _default2 = locale2;
exports2["default"] = _default2;
})(en_US);
(function(exports2) {
var _interopRequireDefault2 = interopRequireDefault.exports["default"];
Object.defineProperty(exports2, "__esModule", {
value: true
});
exports2["default"] = void 0;
var _extends2 = _interopRequireDefault2(_extends$1.exports);
var _en_US = _interopRequireDefault2(en_US$1);
var _en_US2 = _interopRequireDefault2(en_US);
var locale2 = {
lang: (0, _extends2["default"])({
placeholder: "Select date",
yearPlaceholder: "Select year",
quarterPlaceholder: "Select quarter",
monthPlaceholder: "Select month",
weekPlaceholder: "Select week",
rangePlaceholder: ["Start date", "End date"],
rangeYearPlaceholder: ["Start year", "End year"],
rangeQuarterPlaceholder: ["Start quarter", "End quarter"],
rangeMonthPlaceholder: ["Start month", "End month"],
rangeWeekPlaceholder: ["Start week", "End week"]
}, _en_US["default"]),
timePickerLocale: (0, _extends2["default"])({}, _en_US2["default"])
};
var _default2 = locale2;
exports2["default"] = _default2;
})(en_US$2);
(function(exports2) {
var _interopRequireDefault2 = interopRequireDefault.exports["default"];
Object.defineProperty(exports2, "__esModule", {
value: true
});
exports2["default"] = void 0;
var _en_US = _interopRequireDefault2(en_US$2);
var _default2 = _en_US["default"];
exports2["default"] = _default2;
})(en_US$3);
(function(exports2) {
var _interopRequireDefault2 = interopRequireDefault.exports["default"];
Object.defineProperty(exports2, "__esModule", {
value: true
});
exports2["default"] = void 0;
var _en_US = _interopRequireDefault2(en_US$4);
var _en_US2 = _interopRequireDefault2(en_US$3);
var _en_US3 = _interopRequireDefault2(en_US$2);
var _en_US4 = _interopRequireDefault2(en_US);
var typeTemplate2 = "${label} is not a valid ${type}";
var localeValues2 = {
locale: "en",
Pagination: _en_US["default"],
DatePicker: _en_US3["default"],
TimePicker: _en_US4["default"],
Calendar: _en_US2["default"],
global: {
placeholder: "Please select"
},
Table: {
filterTitle: "Filter menu",
filterConfirm: "OK",
filterReset: "Reset",
filterEmptyText: "No filters",
filterCheckall: "Select all items",
filterSearchPlaceholder: "Search in filters",
emptyText: "No data",
selectAll: "Select current page",
selectInvert: "Invert current page",
selectNone: "Clear all data",
selectionAll: "Select all data",
sortTitle: "Sort",
expand: "Expand row",
collapse: "Collapse row",
triggerDesc: "Click to sort descending",
triggerAsc: "Click to sort ascending",
cancelSort: "Click to cancel sorting"
},
Modal: {
okText: "OK",
cancelText: "Cancel",
justOkText: "OK"
},
Popconfirm: {
okText: "OK",
cancelText: "Cancel"
},
Transfer: {
titles: ["", ""],
searchPlaceholder: "Search here",
itemUnit: "item",
itemsUnit: "items",
remove: "Remove",
selectCurrent: "Select current page",
removeCurrent: "Remove current page",
selectAll: "Select all data",
removeAll: "Remove all data",
selectInvert: "Invert current page"
},
Upload: {
uploading: "Uploading...",
removeFile: "Remove file",
uploadError: "Upload error",
previewFile: "Preview file",
downloadFile: "Download file"
},
Empty: {
description: "No data"
},
Icon: {
icon: "icon"
},
Text: {
edit: "Edit",
copy: "Copy",
copied: "Copied",
expand: "Expand"
},
PageHeader: {
back: "Back"
},
Form: {
optional: "(optional)",
defaultValidateMessages: {
"default": "Field validation error for ${label}",
required: "Please enter ${label}",
"enum": "${label} must be one of [${enum}]",
whitespace: "${label} cannot be a blank character",
date: {
format: "${label} date format is invalid",
parse: "${label} cannot be converted to a date",
invalid: "${label} is an invalid date"
},
types: {
string: typeTemplate2,
method: typeTemplate2,
array: typeTemplate2,
object: typeTemplate2,
number: typeTemplate2,
date: typeTemplate2,
"boolean": typeTemplate2,
integer: typeTemplate2,
"float": typeTemplate2,
regexp: typeTemplate2,
email: typeTemplate2,
url: typeTemplate2,
hex: typeTemplate2
},
string: {
len: "${label} must be ${len} characters",
min: "${label} must be at least ${min} characters",
max: "${label} must be up to ${max} characters",
range: "${label} must be between ${min}-${max} characters"
},
number: {
len: "${label} must be equal to ${len}",
min: "${label} must be minimum ${min}",
max: "${label} must be maximum ${max}",
range: "${label} must be between ${min}-${max}"
},
array: {
len: "Must be ${len} ${label}",
min: "At least ${min} ${label}",
max: "At most ${max} ${label}",
range: "The amount of ${label} must be between ${min}-${max}"
},
pattern: {
mismatch: "${label} does not match the pattern ${pattern}"
}
}
},
Image: {
preview: "Preview"
}
};
var _default2 = localeValues2;
exports2["default"] = _default2;
})(_default$l);
(function(exports2) {
var _interopRequireDefault2 = interopRequireDefault.exports["default"];
Object.defineProperty(exports2, "__esModule", {
value: true
});
exports2["default"] = void 0;
var _default2 = _interopRequireDefault2(_default$l);
var _default3 = _default2["default"];
exports2["default"] = _default3;
})(en_US$5);
const enUS$1 = /* @__PURE__ */ getDefaultExportFromCjs(en_US$5);
const enUS = {
"copy_max_tip": "The maximum number of table items has been reached and cannot be copied",
"copy": "Copy",
"add_item": "Add a new line",
"confirm_delete": "Are you sure to delete?",
"confirm": "Yes",
"cancel": "No",
"operate": "Operate",
"delete": "Delete",
"edit": "Edit",
"img_src_error": "Image address error",
"upload": "Upload",
"upload_success": "upload success",
"upload_fail": "upload failed",
"uploaded_address": "Uploaded address",
"test_src": "Test address",
"schema_not_match": "Schema does not match the display component\uFF1A",
"item": "Item",
"search": "Search",
"reset": "Reset",
"expand": "Expand",
"fold": "Fold",
"submit": "Submit",
"save": "Save",
"moveDown": "Move Down",
"moveUp": "Move Up"
};
const zhCN = {
"copy_max_tip": "\u5DF2\u8FBE\u8868\u5355\u9879\u6570\u91CF\u4E0A\u9650\uFF0C\u65E0\u6CD5\u590D\u5236\uFF01",
"copy": "\u590D\u5236",
"add_item": "\u65B0\u589E\u4E00\u6761",
"confirm_delete": "\u786E\u5B9A\u5220\u9664?",
"confirm": "\u786E\u5B9A",
"cancel": "\u53D6\u6D88",
"operate": "\u64CD\u4F5C",
"delete": "\u5220\u9664",
"edit": "\u7F16\u8F91",
"img_src_error": "\u56FE\u7247\u5730\u5740\u9519\u8BEF",
"upload": "\u4E0A\u4F20",
"upload_success": "\u4E0A\u4F20\u6210\u529F",
"upload_fail": "\u4E0A\u4F20\u5931\u8D25",
"uploaded_address": "\u5DF2\u4E0A\u4F20\u5730\u5740",
"test_src": "\u6D4B\u8BD5\u94FE\u63A5",
"schema_not_match": "schema\u672A\u5339\u914D\u5230\u5C55\u793A\u7EC4\u4EF6\uFF1A",
"item": "\u9879\u76EE",
"search": "\u67E5\u8BE2",
"reset": "\u91CD\u7F6E",
"expand": "\u5C55\u5F00",
"fold": "\u6536\u8D77",
"submit": "\u63D0\u4EA4",
"save": "\u4FDD\u5B58",
"moveDown": "\u4E0B\u79FB",
"moveUp": "\u4E0A\u79FB"
};
const locales = {
"en-US": enUS,
"zh-CN": zhCN
};
var zhCn = { exports: {} };
(function(module2, exports2) {
!function(e2, _) {
module2.exports = _(dayjs_min.exports);
}(commonjsGlobal, function(e2) {
function _(e3) {
return e3 && "object" == typeof e3 && "default" in e3 ? e3 : { default: e3 };
}
var t2 = _(e2), d2 = { name: "zh-cn", weekdays: "\u661F\u671F\u65E5_\u661F\u671F\u4E00_\u661F\u671F\u4E8C_\u661F\u671F\u4E09_\u661F\u671F\u56DB_\u661F\u671F\u4E94_\u661F\u671F\u516D".split("_"), weekdaysShort: "\u5468\u65E5_\u5468\u4E00_\u5468\u4E8C_\u5468\u4E09_\u5468\u56DB_\u5468\u4E94_\u5468\u516D".split("_"), weekdaysMin: "\u65E5_\u4E00_\u4E8C_\u4E09_\u56DB_\u4E94_\u516D".split("_"), months: "\u4E00\u6708_\u4E8C\u6708_\u4E09\u6708_\u56DB\u6708_\u4E94\u6708_\u516D\u6708_\u4E03\u6708_\u516B\u6708_\u4E5D\u6708_\u5341\u6708_\u5341\u4E00\u6708_\u5341\u4E8C\u6708".split("_"), monthsShort: "1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"), ordinal: function(e3, _2) {
return "W" === _2 ? e3 + "\u5468" : e3 + "\u65E5";
}, weekStart: 1, yearStart: 4, formats: { LT: "HH:mm", LTS: "HH:mm:ss", L: "YYYY/MM/DD", LL: "YYYY\u5E74M\u6708D\u65E5", LLL: "YYYY\u5E74M\u6708D\u65E5Ah\u70B9mm\u5206", LLLL: "YYYY\u5E74M\u6708D\u65E5ddddAh\u70B9mm\u5206", l: "YYYY/M/D", ll: "YYYY\u5E74M\u6708D\u65E5", lll: "YYYY\u5E74M\u6708D\u65E5 HH:mm", llll: "YYYY\u5E74M\u6708D\u65E5dddd HH:mm" }, relativeTime: { future: "%s\u5185", past: "%s\u524D", s: "\u51E0\u79D2", m: "1 \u5206\u949F", mm: "%d \u5206\u949F", h: "1 \u5C0F\u65F6", hh: "%d \u5C0F\u65F6", d: "1 \u5929", dd: "%d \u5929", M: "1 \u4E2A\u6708", MM: "%d \u4E2A\u6708", y: "1 \u5E74", yy: "%d \u5E74" }, meridiem: function(e3, _2) {
var t3 = 100 * e3 + _2;
return t3 < 600 ? "\u51CC\u6668" : t3 < 900 ? "\u65E9\u4E0A" : t3 < 1100 ? "\u4E0A\u5348" : t3 < 1300 ? "\u4E2D\u5348" : t3 < 1800 ? "\u4E0B\u5348" : "\u665A\u4E0A";
} };
return t2.default.locale(d2, null, true), d2;
});
})(zhCn);
var createStore = function createStore2() {
return createStore$1(function(setState, get2) {
return {
initialized: false,
schema: {},
flattenSchema: {},
context: {},
init: function init2(data) {
return setState(Object.assign({
initialized: true
}, data));
},
setContext: function setContext(context2) {
return setState({
context: context2
});
}
};
});
};
var typeTemplate = "'${label}' is not a valid ${type}";
var typeTemplateCN = "\u6570\u636E\u7C7B\u578B\u5FC5\u987B\u662F ${type}";
var validateMessagesEN = {
default: "Validation error on field '${label}'",
required: "'${label}' is required",
enum: "'${label}' must be one of [${enum}]",
whitespace: "'${label}' cannot be empty",
date: {
format: "'${label}' is invalid for format date",
parse: "'${label}' could not be parsed as date",
invalid: "'${label}' is invalid date"
},
types: {
string: typeTemplate,
method: typeTemplate,
array: typeTemplate,
object: typeTemplate,
number: typeTemplate,
date: typeTemplate,
boolean: typeTemplate,
integer: typeTemplate,
float: typeTemplate,
regexp: typeTemplate,
email: typeTemplate,
url: typeTemplate,
hex: typeTemplate
},
string: {
len: "'${label}' must be exactly ${len} characters",
min: "'${label}' must be at least ${min} characters",
max: "'${label}' cannot be longer than ${max} characters",
range: "'${label}' must be between ${min} and ${max} characters"
},
number: {
len: "'${label}' must equal ${len}",
min: "'${label}' cannot be less than ${min}",
max: "'${label}' cannot be greater than ${max}",
range: "'${label}' must be between ${min} and ${max}"
},
array: {
len: "'${label}' must be exactly ${len} in length",
min: "'${label}' cannot be less than ${min} in length",
max: "'${label}' cannot be greater than ${max} in length",
range: "'${label}' must be between ${min} and ${max} in length"
},
pattern: {
mismatch: "'${label}' does not match pattern ${pattern}"
}
};
var validateMessagesCN = {
default: "${label}\u672A\u901A\u8FC7\u6821\u9A8C",
required: "${label}\u5FC5\u586B",
whitespace: "${label}\u4E0D\u80FD\u4E3A\u7A7A",
date: {
format: "${label}\u7684\u683C\u5F0F\u9519\u8BEF",
parse: "${label}\u65E0\u6CD5\u88AB\u89E3\u6790",
invalid: "${label}\u6570\u636E\u4E0D\u5408\u6CD5"
},
types: {
string: typeTemplateCN,
method: typeTemplateCN,
array: typeTemplateCN,
object: typeTemplateCN,
number: typeTemplateCN,
date: typeTemplateCN,
boolean: typeTemplateCN,
integer: typeTemplateCN,
float: typeTemplateCN,
regexp: typeTemplateCN,
email: typeTemplateCN,
url: typeTemplateCN,
hex: typeTemplateCN
},
string: {
len: "${label}\u957F\u5EA6\u4E0D\u662F${len}",
min: "${label}\u957F\u5EA6\u4E0D\u80FD\u5C0F\u4E8E${min}",
max: "${label}\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E${max}",
range: "${label}\u957F\u5EA6\u9700\u5728${min}\u4E0E${max}\u4E4B\u95F4"
},
number: {
len: "${label}\u4E0D\u7B49\u4E8E${len}",
min: "${label}\u4E0D\u80FD\u5C0F\u4E8E${min}",
max: "${label}\u4E0D\u80FD\u5927\u4E8E${max}",
range: "${label}\u9700\u5728${min}\u4E0E${max}\u4E4B\u95F4"
},
array: {
len: "${label}\u957F\u5EA6\u4E0D\u662F${len}",
min: "${label}\u957F\u5EA6\u4E0D\u80FD\u5C0F\u4E8E${min}",
max: "${label}\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E${max}",
range: "${label}\u957F\u5EA6\u9700\u5728${min}\u4E0E${max}\u4E4B\u95F4"
},
pattern: {
mismatch: "${label}\u672A\u901A\u8FC7\u6B63\u5219\u5224\u65AD${pattern}"
}
};
function withProvider(Element2, defaultWidgets2) {
return function(props) {
var configProvider = props.configProvider, _props$locale = props.locale, locale2 = _props$locale === void 0 ? "zh-CN" : _props$locale, widgets = props.widgets, methods = props.methods, form = props.form, validateMessages = props.validateMessages, _props$globalProps = props.globalProps, globalProps = _props$globalProps === void 0 ? {} : _props$globalProps, _props$globalConfig = props.globalConfig, globalConfig2 = _props$globalConfig === void 0 ? {} : _props$globalConfig, otherProps = __rest(props, ["configProvider", "locale", "widgets", "methods", "form", "validateMessages", "globalProps", "globalConfig"]);
var storeRef = React$a.useRef(createStore());
var store2 = storeRef.current;
React$a.useEffect(function() {
if (locale2 === "en-US") {
dayjs.locale("en");
return;
}
dayjs.locale("zh-cn");
}, [locale2]);
useUnmount$1(function() {
form.resetFields();
});
if (!form) {
console.warn("Please provide a form instance to FormRender");
return null;
}
var antdLocale = locale2 === "zh-CN" ? zhCN$1 : enUS$1;
var formValidateMessages = locale2 === "zh-CN" ? validateMessagesCN : validateMessagesEN;
var configContext = {
locale: locale2,
widgets: Object.assign(Object.assign({}, defaultWidgets2), widgets),
methods,
form,
globalProps,
globalConfig: globalConfig2
};
var langPack = Object.assign(Object.assign(Object.assign({}, antdLocale), {
"FormRender": locales[locale2]
}), configProvider === null || configProvider === void 0 ? void 0 : configProvider.locale);
return /* @__PURE__ */ React__default.default.createElement(
_ConfigProvider,
Object.assign({}, configProvider, {
locale: langPack,
form: {
validateMessages: Object.assign(Object.assign({}, formValidateMessages), validateMessages)
}
}),
/* @__PURE__ */ jsx(ConfigContext.Provider, {
value: configContext,
children: /* @__PURE__ */ jsx(FRContext.Provider, {
value: store2,
children: /* @__PURE__ */ jsx(Element2, {
...Object.assign({
form
}, otherProps)
})
})
})
);
};
}
const index$O = "";
var getProps = function getProps2(props, filter2) {
var result = {};
Object.keys(props).forEach(function(key2) {
if (filter2.includes(key2)) {
return;
}
result[key2] = props[key2];
});
return result;
};
const withFieldWrap = function(Field2) {
var filterProps = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : ["addons", "schema", "dependValues"];
return function(props) {
return /* @__PURE__ */ jsx(Field2, {
...Object.assign({}, getProps(props, filterProps))
});
};
};
const Input = withFieldWrap(Input$2);
const index$N = "";
const InputNumber = withFieldWrap(_InputNumber);
var TextArea = function TextArea2(props) {
var finalProps = Object.assign({
autoSize: {
minRows: 3
}
}, props);
if (finalProps.rows)
delete finalProps.autoSize;
return /* @__PURE__ */ React__default.default.createElement(Input$2.TextArea, Object.assign({}, finalProps));
};
const TextArea$1 = withFieldWrap(TextArea);
const index$M = "";
const index$L = "";
const MultiSelect = withFieldWrap(_Select);
const index$K = "";
const Switch = withFieldWrap(_Switch);
const index$J = "";
var RadioComp = function RadioComp2(props) {
var _props$direction = props.direction, direction = _props$direction === void 0 ? "row" : _props$direction, _props$options = props.options, options = _props$options === void 0 ? [] : _props$options, rest = __rest(props, ["direction", "options"]);
if (direction === "column") {
return /* @__PURE__ */ React__default.default.createElement(_Radio.Group, Object.assign({}, rest), /* @__PURE__ */ React__default.default.createElement(_Space, {
direction: "vertical"
}, options.map(function(item) {
var value = item.value, label = item.label, rest2 = __rest(item, ["value", "label"]);
return /* @__PURE__ */ React__default.default.createElement(_Radio, Object.assign({
key: value,
value
}, rest2), label);
})));
}
return /* @__PURE__ */ React__default.default.createElement(_Radio.Group, Object.assign({}, rest, {
options
}));
};
const Radio = withFieldWrap(RadioComp);
const index$I = "";
const index$H = withFieldWrap(_Rate);
const index$G = "";
const TreeSelect = withFieldWrap(_TreeSelect);
const index$F = "";
var CheckBox = function CheckBox2(_a) {
var title = _a.title, rest = __rest(_a, ["title"]);
return /* @__PURE__ */ React__default.default.createElement(
React__default.default.Fragment,
null,
/* @__PURE__ */ React__default.default.createElement(_Checkbox, Object.assign({}, rest)),
/* @__PURE__ */ jsx("span", {
style: {
marginLeft: "12px"
},
children: title
})
);
};
const Checkbox = withFieldWrap(CheckBox);
var Checkboxes = function Checkboxes2(props) {
var _props$direction = props.direction, direction = _props$direction === void 0 ? "row" : _props$direction, _props$options = props.options, options = _props$options === void 0 ? [] : _props$options, rest = __rest(props, ["direction", "options"]);
if (direction === "column") {
return /* @__PURE__ */ React__default.default.createElement(_Checkbox.Group, Object.assign({}, rest), /* @__PURE__ */ React__default.default.createElement(_Space, {
direction: "vertical"
}, options.map(function(item) {
var value = item.value, label = item.label, rest2 = __rest(item, ["value", "label"]);
return /* @__PURE__ */ React__default.default.createElement(_Checkbox, Object.assign({
key: value,
value
}, rest2), label);
})));
}
return /* @__PURE__ */ React__default.default.createElement(_Checkbox.Group, Object.assign({}, rest, {
options
}));
};
const Checkboxes$1 = withFieldWrap(Checkboxes);
var lib$1 = { exports: {} };
var ColorPicker$1 = { exports: {} };
var propTypes = { exports: {} };
var ReactPropTypesSecret$1 = "SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED";
var ReactPropTypesSecret_1 = ReactPropTypesSecret$1;
var ReactPropTypesSecret = ReactPropTypesSecret_1;
function emptyFunction() {
}
function emptyFunctionWithReset() {
}
emptyFunctionWithReset.resetWarningCache = emptyFunction;
var factoryWithThrowingShims = function() {
function shim2(props, propName, componentName, location2, propFullName, secret) {
if (secret === ReactPropTypesSecret) {
return;
}
var err = new Error(
"Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types"
);
err.name = "Invariant Violation";
throw err;
}
shim2.isRequired = shim2;
function getShim() {
return shim2;
}
var ReactPropTypes = {
array: shim2,
bigint: shim2,
bool: shim2,
func: shim2,
number: shim2,
object: shim2,
string: shim2,
symbol: shim2,
any: shim2,
arrayOf: getShim,
element: shim2,
elementType: shim2,
instanceOf: getShim,
node: shim2,
objectOf: getShim,
oneOf: getShim,
oneOfType: getShim,
shape: getShim,
exact: getShim,
checkPropTypes: emptyFunctionWithReset,
resetWarningCache: emptyFunction
};
ReactPropTypes.PropTypes = ReactPropTypes;
return ReactPropTypes;
};
{
propTypes.exports = factoryWithThrowingShims();
}
var assign$1 = { exports: {} };
var _global$1 = { exports: {} };
var global$5 = _global$1.exports = typeof window != "undefined" && window.Math == Math ? window : typeof self != "undefined" && self.Math == Math ? self : Function("return this")();
if (typeof __g == "number")
__g = global$5;
var _core = { exports: {} };
var core$3 = _core.exports = { version: "2.6.12" };
if (typeof __e == "number")
__e = core$3;
var _aFunction = function(it) {
if (typeof it != "function")
throw TypeError(it + " is not a function!");
return it;
};
var aFunction = _aFunction;
var _ctx = function(fn, that, length) {
aFunction(fn);
if (that === void 0)
return fn;
switch (length) {
case 1:
return function(a) {
return fn.call(that, a);
};
case 2:
return function(a, b2) {
return fn.call(that, a, b2);
};
case 3:
return function(a, b2, c2) {
return fn.call(that, a, b2, c2);
};
}
return function() {
return fn.apply(that, arguments);
};
};
var _objectDp = {};
var _isObject = function(it) {
return typeof it === "object" ? it !== null : typeof it === "function";
};
var isObject$4 = _isObject;
var _anObject = function(it) {
if (!isObject$4(it))
throw TypeError(it + " is not an object!");
return it;
};
var _fails = function(exec) {
try {
return !!exec();
} catch (e2) {
return true;
}
};
var _descriptors = !_fails(function() {
return Object.defineProperty({}, "a", { get: function() {
return 7;
} }).a != 7;
});
var _domCreate;
var hasRequired_domCreate;
function require_domCreate() {
if (hasRequired_domCreate)
return _domCreate;
hasRequired_domCreate = 1;
var isObject2 = _isObject;
var document2 = _global$1.exports.document;
var is = isObject2(document2) && isObject2(document2.createElement);
_domCreate = function(it) {
return is ? document2.createElement(it) : {};
};
return _domCreate;
}
var _ie8DomDefine = !_descriptors && !_fails(function() {
return Object.defineProperty(require_domCreate()("div"), "a", { get: function() {
return 7;
} }).a != 7;
});
var isObject$3 = _isObject;
var _toPrimitive$5 = function(it, S) {
if (!isObject$3(it))
return it;
var fn, val;
if (S && typeof (fn = it.toString) == "function" && !isObject$3(val = fn.call(it)))
return val;
if (typeof (fn = it.valueOf) == "function" && !isObject$3(val = fn.call(it)))
return val;
if (!S && typeof (fn = it.toString) == "function" && !isObject$3(val = fn.call(it)))
return val;
throw TypeError("Can't convert object to primitive value");
};
var anObject$3 = _anObject;
var IE8_DOM_DEFINE$1 = _ie8DomDefine;
var toPrimitive$3 = _toPrimitive$5;
var dP$3 = Object.defineProperty;
_objectDp.f = _descriptors ? Object.defineProperty : function defineProperty2(O, P, Attributes) {
anObject$3(O);
P = toPrimitive$3(P, true);
anObject$3(Attributes);
if (IE8_DOM_DEFINE$1)
try {
return dP$3(O, P, Attributes);
} catch (e2) {
}
if ("get" in Attributes || "set" in Attributes)
throw TypeError("Accessors not supported!");
if ("value" in Attributes)
O[P] = Attributes.value;
return O;
};
var _propertyDesc = function(bitmap, value) {
return {
enumerable: !(bitmap & 1),
configurable: !(bitmap & 2),
writable: !(bitmap & 4),
value
};
};
var dP$2 = _objectDp;
var createDesc$2 = _propertyDesc;
var _hide = _descriptors ? function(object2, key2, value) {
return dP$2.f(object2, key2, createDesc$2(1, value));
} : function(object2, key2, value) {
object2[key2] = value;
return object2;
};
var hasOwnProperty$2 = {}.hasOwnProperty;
var _has = function(it, key2) {
return hasOwnProperty$2.call(it, key2);
};
var global$4 = _global$1.exports;
var core$2 = _core.exports;
var ctx = _ctx;
var hide$2 = _hide;
var has$5 = _has;
var PROTOTYPE$2 = "prototype";
var $export$6 = function(type2, name2, source) {
var IS_FORCED = type2 & $export$6.F;
var IS_GLOBAL = type2 & $export$6.G;
var IS_STATIC = type2 & $export$6.S;
var IS_PROTO = type2 & $export$6.P;
var IS_BIND = type2 & $export$6.B;
var IS_WRAP = type2 & $export$6.W;
var exports2 = IS_GLOBAL ? core$2 : core$2[name2] || (core$2[name2] = {});
var expProto = exports2[PROTOTYPE$2];
var target = IS_GLOBAL ? global$4 : IS_STATIC ? global$4[name2] : (global$4[name2] || {})[PROTOTYPE$2];
var key2, own, out;
if (IS_GLOBAL)
source = name2;
for (key2 in source) {
own = !IS_FORCED && target && target[key2] !== void 0;
if (own && has$5(exports2, key2))
continue;
out = own ? target[key2] : source[key2];
exports2[key2] = IS_GLOBAL && typeof target[key2] != "function" ? source[key2] : IS_BIND && own ? ctx(out, global$4) : IS_WRAP && target[key2] == out ? function(C) {
var F = function(a, b2, c2) {
if (this instanceof C) {
switch (arguments.length) {
case 0:
return new C();
case 1:
return new C(a);
case 2:
return new C(a, b2);
}
return new C(a, b2, c2);
}
return C.apply(this, arguments);
};
F[PROTOTYPE$2] = C[PROTOTYPE$2];
return F;
}(out) : IS_PROTO && typeof out == "function" ? ctx(Function.call, out) : out;
if (IS_PROTO) {
(exports2.virtual || (exports2.virtual = {}))[key2] = out;
if (type2 & $export$6.R && expProto && !expProto[key2])
hide$2(expProto, key2, out);
}
}
};
$export$6.F = 1;
$export$6.G = 2;
$export$6.S = 4;
$export$6.P = 8;
$export$6.B = 16;
$export$6.W = 32;
$export$6.U = 64;
$export$6.R = 128;
var _export = $export$6;
var _cof;
var hasRequired_cof;
function require_cof() {
if (hasRequired_cof)
return _cof;
hasRequired_cof = 1;
var toString2 = {}.toString;
_cof = function(it) {
return toString2.call(it).slice(8, -1);
};
return _cof;
}
var _iobject;
var hasRequired_iobject;
function require_iobject() {
if (hasRequired_iobject)
return _iobject;
hasRequired_iobject = 1;
var cof2 = require_cof();
_iobject = Object("z").propertyIsEnumerable(0) ? Object : function(it) {
return cof2(it) == "String" ? it.split("") : Object(it);
};
return _iobject;
}
var _defined;
var hasRequired_defined;
function require_defined() {
if (hasRequired_defined)
return _defined;
hasRequired_defined = 1;
_defined = function(it) {
if (it == void 0)
throw TypeError("Can't call method on " + it);
return it;
};
return _defined;
}
var IObject = require_iobject();
var defined$1 = require_defined();
var _toIobject = function(it) {
return IObject(defined$1(it));
};
var ceil = Math.ceil;
var floor = Math.floor;
var _toInteger = function(it) {
return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
};
var _toLength;
var hasRequired_toLength;
function require_toLength() {
if (hasRequired_toLength)
return _toLength;
hasRequired_toLength = 1;
var toInteger2 = _toInteger;
var min = Math.min;
_toLength = function(it) {
return it > 0 ? min(toInteger2(it), 9007199254740991) : 0;
};
return _toLength;
}
var _toAbsoluteIndex;
var hasRequired_toAbsoluteIndex;
function require_toAbsoluteIndex() {
if (hasRequired_toAbsoluteIndex)
return _toAbsoluteIndex;
hasRequired_toAbsoluteIndex = 1;
var toInteger2 = _toInteger;
var max = Math.max;
var min = Math.min;
_toAbsoluteIndex = function(index2, length) {
index2 = toInteger2(index2);
return index2 < 0 ? max(index2 + length, 0) : min(index2, length);
};
return _toAbsoluteIndex;
}
var _arrayIncludes;
var hasRequired_arrayIncludes;
function require_arrayIncludes() {
if (hasRequired_arrayIncludes)
return _arrayIncludes;
hasRequired_arrayIncludes = 1;
var toIObject2 = _toIobject;
var toLength = require_toLength();
var toAbsoluteIndex = require_toAbsoluteIndex();
_arrayIncludes = function(IS_INCLUDES) {
return function($this, el, fromIndex) {
var O = toIObject2($this);
var length = toLength(O.length);
var index2 = toAbsoluteIndex(fromIndex, length);
var value;
if (IS_INCLUDES && el != el)
while (length > index2) {
value = O[index2++];
if (value != value)
return true;
}
else
for (; length > index2; index2++)
if (IS_INCLUDES || index2 in O) {
if (O[index2] === el)
return IS_INCLUDES || index2 || 0;
}
return !IS_INCLUDES && -1;
};
};
return _arrayIncludes;
}
var _shared = { exports: {} };
var _library = true;
var core$1 = _core.exports;
var global$3 = _global$1.exports;
var SHARED = "__core-js_shared__";
var store$1 = global$3[SHARED] || (global$3[SHARED] = {});
(_shared.exports = function(key2, value) {
return store$1[key2] || (store$1[key2] = value !== void 0 ? value : {});
})("versions", []).push({
version: core$1.version,
mode: "pure",
copyright: "\xA9 2020 Denis Pushkarev (zloirock.ru)"
});
var id$1 = 0;
var px = Math.random();
var _uid = function(key2) {
return "Symbol(".concat(key2 === void 0 ? "" : key2, ")_", (++id$1 + px).toString(36));
};
var shared$1 = _shared.exports("keys");
var uid$2 = _uid;
var _sharedKey = function(key2) {
return shared$1[key2] || (shared$1[key2] = uid$2(key2));
};
var _objectKeysInternal;
var hasRequired_objectKeysInternal;
function require_objectKeysInternal() {
if (hasRequired_objectKeysInternal)
return _objectKeysInternal;
hasRequired_objectKeysInternal = 1;
var has2 = _has;
var toIObject2 = _toIobject;
var arrayIndexOf = require_arrayIncludes()(false);
var IE_PROTO2 = _sharedKey("IE_PROTO");
_objectKeysInternal = function(object2, names2) {
var O = toIObject2(object2);
var i2 = 0;
var result = [];
var key2;
for (key2 in O)
if (key2 != IE_PROTO2)
has2(O, key2) && result.push(key2);
while (names2.length > i2)
if (has2(O, key2 = names2[i2++])) {
~arrayIndexOf(result, key2) || result.push(key2);
}
return result;
};
return _objectKeysInternal;
}
var _enumBugKeys = "constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",");
var _objectKeys;
var hasRequired_objectKeys;
function require_objectKeys() {
if (hasRequired_objectKeys)
return _objectKeys;
hasRequired_objectKeys = 1;
var $keys2 = require_objectKeysInternal();
var enumBugKeys2 = _enumBugKeys;
_objectKeys = Object.keys || function keys2(O) {
return $keys2(O, enumBugKeys2);
};
return _objectKeys;
}
var _objectGops = {};
var hasRequired_objectGops;
function require_objectGops() {
if (hasRequired_objectGops)
return _objectGops;
hasRequired_objectGops = 1;
_objectGops.f = Object.getOwnPropertySymbols;
return _objectGops;
}
var _objectPie = {};
var hasRequired_objectPie;
function require_objectPie() {
if (hasRequired_objectPie)
return _objectPie;
hasRequired_objectPie = 1;
_objectPie.f = {}.propertyIsEnumerable;
return _objectPie;
}
var _toObject;
var hasRequired_toObject;
function require_toObject() {
if (hasRequired_toObject)
return _toObject;
hasRequired_toObject = 1;
var defined2 = require_defined();
_toObject = function(it) {
return Object(defined2(it));
};
return _toObject;
}
var _objectAssign;
var hasRequired_objectAssign;
function require_objectAssign() {
if (hasRequired_objectAssign)
return _objectAssign;
hasRequired_objectAssign = 1;
var DESCRIPTORS2 = _descriptors;
var getKeys2 = require_objectKeys();
var gOPS2 = require_objectGops();
var pIE2 = require_objectPie();
var toObject2 = require_toObject();
var IObject2 = require_iobject();
var $assign = Object.assign;
_objectAssign = !$assign || _fails(function() {
var A2 = {};
var B = {};
var S = Symbol();
var K = "abcdefghijklmnopqrst";
A2[S] = 7;
K.split("").forEach(function(k2) {
B[k2] = k2;
});
return $assign({}, A2)[S] != 7 || Object.keys($assign({}, B)).join("") != K;
}) ? function assign2(target, source) {
var T = toObject2(target);
var aLen = arguments.length;
var index2 = 1;
var getSymbols2 = gOPS2.f;
var isEnum2 = pIE2.f;
while (aLen > index2) {
var S = IObject2(arguments[index2++]);
var keys2 = getSymbols2 ? getKeys2(S).concat(getSymbols2(S)) : getKeys2(S);
var length = keys2.length;
var j2 = 0;
var key2;
while (length > j2) {
key2 = keys2[j2++];
if (!DESCRIPTORS2 || isEnum2.call(S, key2))
T[key2] = S[key2];
}
}
return T;
} : $assign;
return _objectAssign;
}
var $export$5 = _export;
$export$5($export$5.S + $export$5.F, "Object", { assign: require_objectAssign() });
var assign = _core.exports.Object.assign;
(function(module2) {
module2.exports = { "default": assign, __esModule: true };
})(assign$1);
var _assign$1 = assign$1.exports;
var _assign2 = _interopRequireDefault$g(_assign$1);
function _interopRequireDefault$g(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
var _default$i = _assign2.default || function(target) {
for (var i2 = 1; i2 < arguments.length; i2++) {
var source = arguments[i2];
for (var key2 in source) {
if (Object.prototype.hasOwnProperty.call(source, key2)) {
target[key2] = source[key2];
}
}
}
return target;
};
/*
object-assign
(c) Sindre Sorhus
@license MIT
*/
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
var hasOwnProperty$1 = Object.prototype.hasOwnProperty;
var propIsEnumerable = Object.prototype.propertyIsEnumerable;
function toObject$2(val) {
if (val === null || val === void 0) {
throw new TypeError("Object.assign cannot be called with null or undefined");
}
return Object(val);
}
function shouldUseNative() {
try {
if (!Object.assign) {
return false;
}
var test1 = new String("abc");
test1[5] = "de";
if (Object.getOwnPropertyNames(test1)[0] === "5") {
return false;
}
var test2 = {};
for (var i2 = 0; i2 < 10; i2++) {
test2["_" + String.fromCharCode(i2)] = i2;
}
var order2 = Object.getOwnPropertyNames(test2).map(function(n2) {
return test2[n2];
});
if (order2.join("") !== "0123456789") {
return false;
}
var test3 = {};
"abcdefghijklmnopqrst".split("").forEach(function(letter) {
test3[letter] = letter;
});
if (Object.keys(Object.assign({}, test3)).join("") !== "abcdefghijklmnopqrst") {
return false;
}
return true;
} catch (err) {
return false;
}
}
var objectAssign = shouldUseNative() ? Object.assign : function(target, source) {
var from;
var to = toObject$2(target);
var symbols;
for (var s = 1; s < arguments.length; s++) {
from = Object(arguments[s]);
for (var key2 in from) {
if (hasOwnProperty$1.call(from, key2)) {
to[key2] = from[key2];
}
}
if (getOwnPropertySymbols) {
symbols = getOwnPropertySymbols(from);
for (var i2 = 0; i2 < symbols.length; i2++) {
if (propIsEnumerable.call(from, symbols[i2])) {
to[symbols[i2]] = from[symbols[i2]];
}
}
}
}
return to;
};
var _assign = objectAssign;
var emptyObject = {};
function _invariant(condition, format2, a, b2, c2, d2, e2, f2) {
if (!condition) {
var error;
if (format2 === void 0) {
error = new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");
} else {
var args = [a, b2, c2, d2, e2, f2];
var argIndex = 0;
error = new Error(format2.replace(/%s/g, function() {
return args[argIndex++];
}));
error.name = "Invariant Violation";
}
error.framesToPop = 1;
throw error;
}
}
var MIXINS_KEY = "mixins";
function identity(fn) {
return fn;
}
function factory$1(ReactComponent, isValidElement2, ReactNoopUpdateQueue2) {
var injectedMixins = [];
var ReactClassInterface = {
mixins: "DEFINE_MANY",
statics: "DEFINE_MANY",
propTypes: "DEFINE_MANY",
contextTypes: "DEFINE_MANY",
childContextTypes: "DEFINE_MANY",
getDefaultProps: "DEFINE_MANY_MERGED",
getInitialState: "DEFINE_MANY_MERGED",
getChildContext: "DEFINE_MANY_MERGED",
render: "DEFINE_ONCE",
componentWillMount: "DEFINE_MANY",
componentDidMount: "DEFINE_MANY",
componentWillReceiveProps: "DEFINE_MANY",
shouldComponentUpdate: "DEFINE_ONCE",
componentWillUpdate: "DEFINE_MANY",
componentDidUpdate: "DEFINE_MANY",
componentWillUnmount: "DEFINE_MANY",
UNSAFE_componentWillMount: "DEFINE_MANY",
UNSAFE_componentWillReceiveProps: "DEFINE_MANY",
UNSAFE_componentWillUpdate: "DEFINE_MANY",
updateComponent: "OVERRIDE_BASE"
};
var ReactClassStaticInterface = {
getDerivedStateFromProps: "DEFINE_MANY_MERGED"
};
var RESERVED_SPEC_KEYS = {
displayName: function(Constructor, displayName) {
Constructor.displayName = displayName;
},
mixins: function(Constructor, mixins) {
if (mixins) {
for (var i2 = 0; i2 < mixins.length; i2++) {
mixSpecIntoComponent(Constructor, mixins[i2]);
}
}
},
childContextTypes: function(Constructor, childContextTypes) {
Constructor.childContextTypes = _assign(
{},
Constructor.childContextTypes,
childContextTypes
);
},
contextTypes: function(Constructor, contextTypes) {
Constructor.contextTypes = _assign(
{},
Constructor.contextTypes,
contextTypes
);
},
getDefaultProps: function(Constructor, getDefaultProps) {
if (Constructor.getDefaultProps) {
Constructor.getDefaultProps = createMergedResultFunction(
Constructor.getDefaultProps,
getDefaultProps
);
} else {
Constructor.getDefaultProps = getDefaultProps;
}
},
propTypes: function(Constructor, propTypes2) {
Constructor.propTypes = _assign({}, Constructor.propTypes, propTypes2);
},
statics: function(Constructor, statics) {
mixStaticSpecIntoComponent(Constructor, statics);
},
autobind: function() {
}
};
function validateMethodOverride(isAlreadyDefined, name2) {
var specPolicy = ReactClassInterface.hasOwnProperty(name2) ? ReactClassInterface[name2] : null;
if (ReactClassMixin.hasOwnProperty(name2)) {
_invariant(
specPolicy === "OVERRIDE_BASE",
"ReactClassInterface: You are attempting to override `%s` from your class specification. Ensure that your method names do not overlap with React methods.",
name2
);
}
if (isAlreadyDefined) {
_invariant(
specPolicy === "DEFINE_MANY" || specPolicy === "DEFINE_MANY_MERGED",
"ReactClassInterface: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.",
name2
);
}
}
function mixSpecIntoComponent(Constructor, spec) {
if (!spec) {
return;
}
_invariant(
typeof spec !== "function",
"ReactClass: You're attempting to use a component class or function as a mixin. Instead, just use a regular object."
);
_invariant(
!isValidElement2(spec),
"ReactClass: You're attempting to use a component as a mixin. Instead, just use a regular object."
);
var proto2 = Constructor.prototype;
var autoBindPairs = proto2.__reactAutoBindPairs;
if (spec.hasOwnProperty(MIXINS_KEY)) {
RESERVED_SPEC_KEYS.mixins(Constructor, spec.mixins);
}
for (var name2 in spec) {
if (!spec.hasOwnProperty(name2)) {
continue;
}
if (name2 === MIXINS_KEY) {
continue;
}
var property2 = spec[name2];
var isAlreadyDefined = proto2.hasOwnProperty(name2);
validateMethodOverride(isAlreadyDefined, name2);
if (RESERVED_SPEC_KEYS.hasOwnProperty(name2)) {
RESERVED_SPEC_KEYS[name2](Constructor, property2);
} else {
var isReactClassMethod = ReactClassInterface.hasOwnProperty(name2);
var isFunction2 = typeof property2 === "function";
var shouldAutoBind = isFunction2 && !isReactClassMethod && !isAlreadyDefined && spec.autobind !== false;
if (shouldAutoBind) {
autoBindPairs.push(name2, property2);
proto2[name2] = property2;
} else {
if (isAlreadyDefined) {
var specPolicy = ReactClassInterface[name2];
_invariant(
isReactClassMethod && (specPolicy === "DEFINE_MANY_MERGED" || specPolicy === "DEFINE_MANY"),
"ReactClass: Unexpected spec policy %s for key %s when mixing in component specs.",
specPolicy,
name2
);
if (specPolicy === "DEFINE_MANY_MERGED") {
proto2[name2] = createMergedResultFunction(proto2[name2], property2);
} else if (specPolicy === "DEFINE_MANY") {
proto2[name2] = createChainedFunction(proto2[name2], property2);
}
} else {
proto2[name2] = property2;
}
}
}
}
}
function mixStaticSpecIntoComponent(Constructor, statics) {
if (!statics) {
return;
}
for (var name2 in statics) {
var property2 = statics[name2];
if (!statics.hasOwnProperty(name2)) {
continue;
}
var isReserved = name2 in RESERVED_SPEC_KEYS;
_invariant(
!isReserved,
'ReactClass: You are attempting to define a reserved property, `%s`, that shouldn\'t be on the "statics" key. Define it as an instance property instead; it will still be accessible on the constructor.',
name2
);
var isAlreadyDefined = name2 in Constructor;
if (isAlreadyDefined) {
var specPolicy = ReactClassStaticInterface.hasOwnProperty(name2) ? ReactClassStaticInterface[name2] : null;
_invariant(
specPolicy === "DEFINE_MANY_MERGED",
"ReactClass: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.",
name2
);
Constructor[name2] = createMergedResultFunction(Constructor[name2], property2);
return;
}
Constructor[name2] = property2;
}
}
function mergeIntoWithNoDuplicateKeys(one, two) {
_invariant(
one && two && typeof one === "object" && typeof two === "object",
"mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects."
);
for (var key2 in two) {
if (two.hasOwnProperty(key2)) {
_invariant(
one[key2] === void 0,
"mergeIntoWithNoDuplicateKeys(): Tried to merge two objects with the same key: `%s`. This conflict may be due to a mixin; in particular, this may be caused by two getInitialState() or getDefaultProps() methods returning objects with clashing keys.",
key2
);
one[key2] = two[key2];
}
}
return one;
}
function createMergedResultFunction(one, two) {
return function mergedResult() {
var a = one.apply(this, arguments);
var b2 = two.apply(this, arguments);
if (a == null) {
return b2;
} else if (b2 == null) {
return a;
}
var c2 = {};
mergeIntoWithNoDuplicateKeys(c2, a);
mergeIntoWithNoDuplicateKeys(c2, b2);
return c2;
};
}
function createChainedFunction(one, two) {
return function chainedFunction() {
one.apply(this, arguments);
two.apply(this, arguments);
};
}
function bindAutoBindMethod(component, method2) {
var boundMethod = method2.bind(component);
return boundMethod;
}
function bindAutoBindMethods(component) {
var pairs = component.__reactAutoBindPairs;
for (var i2 = 0; i2 < pairs.length; i2 += 2) {
var autoBindKey = pairs[i2];
var method2 = pairs[i2 + 1];
component[autoBindKey] = bindAutoBindMethod(component, method2);
}
}
var IsMountedPreMixin = {
componentDidMount: function() {
this.__isMounted = true;
}
};
var IsMountedPostMixin = {
componentWillUnmount: function() {
this.__isMounted = false;
}
};
var ReactClassMixin = {
replaceState: function(newState, callback) {
this.updater.enqueueReplaceState(this, newState, callback);
},
isMounted: function() {
return !!this.__isMounted;
}
};
var ReactClassComponent = function() {
};
_assign(
ReactClassComponent.prototype,
ReactComponent.prototype,
ReactClassMixin
);
function createClass(spec) {
var Constructor = identity(function(props, context2, updater) {
if (this.__reactAutoBindPairs.length) {
bindAutoBindMethods(this);
}
this.props = props;
this.context = context2;
this.refs = emptyObject;
this.updater = updater || ReactNoopUpdateQueue2;
this.state = null;
var initialState = this.getInitialState ? this.getInitialState() : null;
_invariant(
typeof initialState === "object" && !Array.isArray(initialState),
"%s.getInitialState(): must return an object or null",
Constructor.displayName || "ReactCompositeComponent"
);
this.state = initialState;
});
Constructor.prototype = new ReactClassComponent();
Constructor.prototype.constructor = Constructor;
Constructor.prototype.__reactAutoBindPairs = [];
injectedMixins.forEach(mixSpecIntoComponent.bind(null, Constructor));
mixSpecIntoComponent(Constructor, IsMountedPreMixin);
mixSpecIntoComponent(Constructor, spec);
mixSpecIntoComponent(Constructor, IsMountedPostMixin);
if (Constructor.getDefaultProps) {
Constructor.defaultProps = Constructor.getDefaultProps();
}
_invariant(
Constructor.prototype.render,
"createClass(...): Class specification must implement a `render` method."
);
for (var methodName in ReactClassInterface) {
if (!Constructor.prototype[methodName]) {
Constructor.prototype[methodName] = null;
}
}
return Constructor;
}
return createClass;
}
var factory_1 = factory$1;
var React$9 = React__default.default;
var factory = factory_1;
if (typeof React$9 === "undefined") {
throw Error(
"create-react-class could not find the React object. If you are using script tags, make sure that React is being loaded before create-react-class."
);
}
var ReactNoopUpdateQueue = new React$9.Component().updater;
var createReactClass = factory(
React$9.Component,
React$9.isValidElement,
ReactNoopUpdateQueue
);
function contains$1(root2, n2) {
var node = n2;
while (node) {
if (node === root2) {
return true;
}
node = node.parentNode;
}
return false;
}
var addEventListener$1 = {};
var lib = { exports: {} };
var EventObject = { exports: {} };
var EventBaseObject = { exports: {} };
(function(module2, exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
function returnFalse() {
return false;
}
function returnTrue() {
return true;
}
function EventBaseObject2() {
this.timeStamp = Date.now();
this.target = void 0;
this.currentTarget = void 0;
}
EventBaseObject2.prototype = {
isEventObject: 1,
constructor: EventBaseObject2,
isDefaultPrevented: returnFalse,
isPropagationStopped: returnFalse,
isImmediatePropagationStopped: returnFalse,
preventDefault: function preventDefault() {
this.isDefaultPrevented = returnTrue;
},
stopPropagation: function stopPropagation() {
this.isPropagationStopped = returnTrue;
},
stopImmediatePropagation: function stopImmediatePropagation() {
this.isImmediatePropagationStopped = returnTrue;
this.stopPropagation();
},
halt: function halt(immediate) {
if (immediate) {
this.stopImmediatePropagation();
} else {
this.stopPropagation();
}
this.preventDefault();
}
};
exports2["default"] = EventBaseObject2;
module2.exports = exports2["default"];
})(EventBaseObject, EventBaseObject.exports);
(function(module2, exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
function _interopRequireDefault2(obj) {
return obj && obj.__esModule ? obj : { "default": obj };
}
var _EventBaseObject = EventBaseObject.exports;
var _EventBaseObject2 = _interopRequireDefault2(_EventBaseObject);
var _objectAssign2 = objectAssign;
var _objectAssign22 = _interopRequireDefault2(_objectAssign2);
var TRUE = true;
var FALSE = false;
var commonProps = ["altKey", "bubbles", "cancelable", "ctrlKey", "currentTarget", "eventPhase", "metaKey", "shiftKey", "target", "timeStamp", "view", "type"];
function isNullOrUndefined(w2) {
return w2 === null || w2 === void 0;
}
var eventNormalizers = [{
reg: /^key/,
props: ["char", "charCode", "key", "keyCode", "which"],
fix: function fix(event, nativeEvent) {
if (isNullOrUndefined(event.which)) {
event.which = !isNullOrUndefined(nativeEvent.charCode) ? nativeEvent.charCode : nativeEvent.keyCode;
}
if (event.metaKey === void 0) {
event.metaKey = event.ctrlKey;
}
}
}, {
reg: /^touch/,
props: ["touches", "changedTouches", "targetTouches"]
}, {
reg: /^hashchange$/,
props: ["newURL", "oldURL"]
}, {
reg: /^gesturechange$/i,
props: ["rotation", "scale"]
}, {
reg: /^(mousewheel|DOMMouseScroll)$/,
props: [],
fix: function fix(event, nativeEvent) {
var deltaX = void 0;
var deltaY = void 0;
var delta = void 0;
var wheelDelta = nativeEvent.wheelDelta;
var axis = nativeEvent.axis;
var wheelDeltaY = nativeEvent.wheelDeltaY;
var wheelDeltaX = nativeEvent.wheelDeltaX;
var detail = nativeEvent.detail;
if (wheelDelta) {
delta = wheelDelta / 120;
}
if (detail) {
delta = 0 - (detail % 3 === 0 ? detail / 3 : detail);
}
if (axis !== void 0) {
if (axis === event.HORIZONTAL_AXIS) {
deltaY = 0;
deltaX = 0 - delta;
} else if (axis === event.VERTICAL_AXIS) {
deltaX = 0;
deltaY = delta;
}
}
if (wheelDeltaY !== void 0) {
deltaY = wheelDeltaY / 120;
}
if (wheelDeltaX !== void 0) {
deltaX = -1 * wheelDeltaX / 120;
}
if (!deltaX && !deltaY) {
deltaY = delta;
}
if (deltaX !== void 0) {
event.deltaX = deltaX;
}
if (deltaY !== void 0) {
event.deltaY = deltaY;
}
if (delta !== void 0) {
event.delta = delta;
}
}
}, {
reg: /^mouse|contextmenu|click|mspointer|(^DOMMouseScroll$)/i,
props: ["buttons", "clientX", "clientY", "button", "offsetX", "relatedTarget", "which", "fromElement", "toElement", "offsetY", "pageX", "pageY", "screenX", "screenY"],
fix: function fix(event, nativeEvent) {
var eventDoc = void 0;
var doc = void 0;
var body = void 0;
var target = event.target;
var button = nativeEvent.button;
if (target && isNullOrUndefined(event.pageX) && !isNullOrUndefined(nativeEvent.clientX)) {
eventDoc = target.ownerDocument || document;
doc = eventDoc.documentElement;
body = eventDoc.body;
event.pageX = nativeEvent.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
event.pageY = nativeEvent.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
}
if (!event.which && button !== void 0) {
if (button & 1) {
event.which = 1;
} else if (button & 2) {
event.which = 3;
} else if (button & 4) {
event.which = 2;
} else {
event.which = 0;
}
}
if (!event.relatedTarget && event.fromElement) {
event.relatedTarget = event.fromElement === target ? event.toElement : event.fromElement;
}
return event;
}
}];
function retTrue() {
return TRUE;
}
function retFalse() {
return FALSE;
}
function DomEventObject(nativeEvent) {
var type2 = nativeEvent.type;
var isNative = typeof nativeEvent.stopPropagation === "function" || typeof nativeEvent.cancelBubble === "boolean";
_EventBaseObject2["default"].call(this);
this.nativeEvent = nativeEvent;
var isDefaultPrevented = retFalse;
if ("defaultPrevented" in nativeEvent) {
isDefaultPrevented = nativeEvent.defaultPrevented ? retTrue : retFalse;
} else if ("getPreventDefault" in nativeEvent) {
isDefaultPrevented = nativeEvent.getPreventDefault() ? retTrue : retFalse;
} else if ("returnValue" in nativeEvent) {
isDefaultPrevented = nativeEvent.returnValue === FALSE ? retTrue : retFalse;
}
this.isDefaultPrevented = isDefaultPrevented;
var fixFns = [];
var fixFn = void 0;
var l2 = void 0;
var prop = void 0;
var props = commonProps.concat();
eventNormalizers.forEach(function(normalizer) {
if (type2.match(normalizer.reg)) {
props = props.concat(normalizer.props);
if (normalizer.fix) {
fixFns.push(normalizer.fix);
}
}
});
l2 = props.length;
while (l2) {
prop = props[--l2];
this[prop] = nativeEvent[prop];
}
if (!this.target && isNative) {
this.target = nativeEvent.srcElement || document;
}
if (this.target && this.target.nodeType === 3) {
this.target = this.target.parentNode;
}
l2 = fixFns.length;
while (l2) {
fixFn = fixFns[--l2];
fixFn(this, nativeEvent);
}
this.timeStamp = nativeEvent.timeStamp || Date.now();
}
var EventBaseObjectProto = _EventBaseObject2["default"].prototype;
(0, _objectAssign22["default"])(DomEventObject.prototype, EventBaseObjectProto, {
constructor: DomEventObject,
preventDefault: function preventDefault() {
var e2 = this.nativeEvent;
if (e2.preventDefault) {
e2.preventDefault();
} else {
e2.returnValue = FALSE;
}
EventBaseObjectProto.preventDefault.call(this);
},
stopPropagation: function stopPropagation() {
var e2 = this.nativeEvent;
if (e2.stopPropagation) {
e2.stopPropagation();
} else {
e2.cancelBubble = TRUE;
}
EventBaseObjectProto.stopPropagation.call(this);
}
});
exports2["default"] = DomEventObject;
module2.exports = exports2["default"];
})(EventObject, EventObject.exports);
(function(module2, exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
exports2["default"] = addEventListener2;
function _interopRequireDefault2(obj) {
return obj && obj.__esModule ? obj : { "default": obj };
}
var _EventObject = EventObject.exports;
var _EventObject2 = _interopRequireDefault2(_EventObject);
function addEventListener2(target, eventType, callback, option) {
function wrapCallback(e2) {
var ne = new _EventObject2["default"](e2);
callback.call(target, ne);
}
if (target.addEventListener) {
var _ret = function() {
var useCapture = false;
if (typeof option === "object") {
useCapture = option.capture || false;
} else if (typeof option === "boolean") {
useCapture = option;
}
target.addEventListener(eventType, wrapCallback, option || false);
return {
v: {
remove: function remove() {
target.removeEventListener(eventType, wrapCallback, useCapture);
}
}
};
}();
if (typeof _ret === "object")
return _ret.v;
} else if (target.attachEvent) {
target.attachEvent("on" + eventType, wrapCallback);
return {
remove: function remove() {
target.detachEvent("on" + eventType, wrapCallback);
}
};
}
}
module2.exports = exports2["default"];
})(lib, lib.exports);
const addDOMEventListener = /* @__PURE__ */ getDefaultExportFromCjs(lib.exports);
Object.defineProperty(addEventListener$1, "__esModule", {
value: true
});
var _default$h = addEventListener$1.default = addEventListenerWrap$1;
var _addDomEventListener = _interopRequireDefault$f(lib.exports);
var _reactDom$1 = _interopRequireDefault$f(ReactDOM__default.default);
function _interopRequireDefault$f(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
function addEventListenerWrap$1(target, eventType, cb, option) {
var callback = _reactDom$1.default.unstable_batchedUpdates ? function run(e2) {
_reactDom$1.default.unstable_batchedUpdates(cb, e2);
} : cb;
return (0, _addDomEventListener.default)(target, eventType, callback, option);
}
var _default$g = function(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
};
var defineProperty$3 = { exports: {} };
var $export$4 = _export;
$export$4($export$4.S + $export$4.F * !_descriptors, "Object", { defineProperty: _objectDp.f });
var $Object$1 = _core.exports.Object;
var defineProperty$2 = function defineProperty2(it, key2, desc) {
return $Object$1.defineProperty(it, key2, desc);
};
(function(module2) {
module2.exports = { "default": defineProperty$2, __esModule: true };
})(defineProperty$3);
var _defineProperty$7 = defineProperty$3.exports;
var _defineProperty2$1 = _interopRequireDefault$e(_defineProperty$7);
function _interopRequireDefault$e(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
var _default$f = function() {
function defineProperties(target, props) {
for (var i2 = 0; i2 < props.length; i2++) {
var descriptor2 = props[i2];
descriptor2.enumerable = descriptor2.enumerable || false;
descriptor2.configurable = true;
if ("value" in descriptor2)
descriptor2.writable = true;
(0, _defineProperty2$1.default)(target, descriptor2.key, descriptor2);
}
}
return function(Constructor, protoProps, staticProps) {
if (protoProps)
defineProperties(Constructor.prototype, protoProps);
if (staticProps)
defineProperties(Constructor, staticProps);
return Constructor;
};
}();
var _typeof$i = {};
var iterator$1 = { exports: {} };
var toInteger = _toInteger;
var defined = require_defined();
var _stringAt = function(TO_STRING) {
return function(that, pos) {
var s = String(defined(that));
var i2 = toInteger(pos);
var l2 = s.length;
var a, b2;
if (i2 < 0 || i2 >= l2)
return TO_STRING ? "" : void 0;
a = s.charCodeAt(i2);
return a < 55296 || a > 56319 || i2 + 1 === l2 || (b2 = s.charCodeAt(i2 + 1)) < 56320 || b2 > 57343 ? TO_STRING ? s.charAt(i2) : a : TO_STRING ? s.slice(i2, i2 + 2) : (a - 55296 << 10) + (b2 - 56320) + 65536;
};
};
var _redefine = { exports: {} };
(function(module2) {
module2.exports = _hide;
})(_redefine);
var _iterators = {};
var dP$1 = _objectDp;
var anObject$2 = _anObject;
var getKeys$1 = require_objectKeys();
var _objectDps = _descriptors ? Object.defineProperties : function defineProperties(O, Properties) {
anObject$2(O);
var keys2 = getKeys$1(Properties);
var length = keys2.length;
var i2 = 0;
var P;
while (length > i2)
dP$1.f(O, P = keys2[i2++], Properties[P]);
return O;
};
var _html;
var hasRequired_html;
function require_html() {
if (hasRequired_html)
return _html;
hasRequired_html = 1;
var document2 = _global$1.exports.document;
_html = document2 && document2.documentElement;
return _html;
}
var anObject$1 = _anObject;
var dPs = _objectDps;
var enumBugKeys = _enumBugKeys;
var IE_PROTO$1 = _sharedKey("IE_PROTO");
var Empty = function() {
};
var PROTOTYPE$1 = "prototype";
var createDict = function() {
var iframe = require_domCreate()("iframe");
var i2 = enumBugKeys.length;
var lt = "<";
var gt = ">";
var iframeDocument;
iframe.style.display = "none";
require_html().appendChild(iframe);
iframe.src = "javascript:";
iframeDocument = iframe.contentWindow.document;
iframeDocument.open();
iframeDocument.write(lt + "script" + gt + "document.F=Object" + lt + "/script" + gt);
iframeDocument.close();
createDict = iframeDocument.F;
while (i2--)
delete createDict[PROTOTYPE$1][enumBugKeys[i2]];
return createDict();
};
var _objectCreate = Object.create || function create2(O, Properties) {
var result;
if (O !== null) {
Empty[PROTOTYPE$1] = anObject$1(O);
result = new Empty();
Empty[PROTOTYPE$1] = null;
result[IE_PROTO$1] = O;
} else
result = createDict();
return Properties === void 0 ? result : dPs(result, Properties);
};
var _wks = { exports: {} };
var store = _shared.exports("wks");
var uid$1 = _uid;
var Symbol$1 = _global$1.exports.Symbol;
var USE_SYMBOL = typeof Symbol$1 == "function";
var $exports = _wks.exports = function(name2) {
return store[name2] || (store[name2] = USE_SYMBOL && Symbol$1[name2] || (USE_SYMBOL ? Symbol$1 : uid$1)("Symbol." + name2));
};
$exports.store = store;
var def = _objectDp.f;
var has$4 = _has;
var TAG = _wks.exports("toStringTag");
var _setToStringTag = function(it, tag, stat) {
if (it && !has$4(it = stat ? it : it.prototype, TAG))
def(it, TAG, { configurable: true, value: tag });
};
var create$2 = _objectCreate;
var descriptor = _propertyDesc;
var setToStringTag$2 = _setToStringTag;
var IteratorPrototype = {};
_hide(IteratorPrototype, _wks.exports("iterator"), function() {
return this;
});
var _iterCreate = function(Constructor, NAME2, next) {
Constructor.prototype = create$2(IteratorPrototype, { next: descriptor(1, next) });
setToStringTag$2(Constructor, NAME2 + " Iterator");
};
var has$3 = _has;
var toObject$1 = require_toObject();
var IE_PROTO = _sharedKey("IE_PROTO");
var ObjectProto$1 = Object.prototype;
var _objectGpo = Object.getPrototypeOf || function(O) {
O = toObject$1(O);
if (has$3(O, IE_PROTO))
return O[IE_PROTO];
if (typeof O.constructor == "function" && O instanceof O.constructor) {
return O.constructor.prototype;
}
return O instanceof Object ? ObjectProto$1 : null;
};
var $export$3 = _export;
var redefine$1 = _redefine.exports;
var hide$1 = _hide;
var Iterators$2 = _iterators;
var $iterCreate = _iterCreate;
var setToStringTag$1 = _setToStringTag;
var getPrototypeOf$1 = _objectGpo;
var ITERATOR = _wks.exports("iterator");
var BUGGY = !([].keys && "next" in [].keys());
var FF_ITERATOR = "@@iterator";
var KEYS = "keys";
var VALUES = "values";
var returnThis = function() {
return this;
};
var _iterDefine = function(Base, NAME2, Constructor, next, DEFAULT, IS_SET, FORCED) {
$iterCreate(Constructor, NAME2, next);
var getMethod = function(kind) {
if (!BUGGY && kind in proto2)
return proto2[kind];
switch (kind) {
case KEYS:
return function keys2() {
return new Constructor(this, kind);
};
case VALUES:
return function values() {
return new Constructor(this, kind);
};
}
return function entries() {
return new Constructor(this, kind);
};
};
var TAG2 = NAME2 + " Iterator";
var DEF_VALUES = DEFAULT == VALUES;
var VALUES_BUG = false;
var proto2 = Base.prototype;
var $native = proto2[ITERATOR] || proto2[FF_ITERATOR] || DEFAULT && proto2[DEFAULT];
var $default = $native || getMethod(DEFAULT);
var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod("entries") : void 0;
var $anyNative = NAME2 == "Array" ? proto2.entries || $native : $native;
var methods, key2, IteratorPrototype2;
if ($anyNative) {
IteratorPrototype2 = getPrototypeOf$1($anyNative.call(new Base()));
if (IteratorPrototype2 !== Object.prototype && IteratorPrototype2.next) {
setToStringTag$1(IteratorPrototype2, TAG2, true);
}
}
if (DEF_VALUES && $native && $native.name !== VALUES) {
VALUES_BUG = true;
$default = function values() {
return $native.call(this);
};
}
if (FORCED && (BUGGY || VALUES_BUG || !proto2[ITERATOR])) {
hide$1(proto2, ITERATOR, $default);
}
Iterators$2[NAME2] = $default;
Iterators$2[TAG2] = returnThis;
if (DEFAULT) {
methods = {
values: DEF_VALUES ? $default : getMethod(VALUES),
keys: IS_SET ? $default : getMethod(KEYS),
entries: $entries
};
if (FORCED)
for (key2 in methods) {
if (!(key2 in proto2))
redefine$1(proto2, key2, methods[key2]);
}
else
$export$3($export$3.P + $export$3.F * (BUGGY || VALUES_BUG), NAME2, methods);
}
return methods;
};
var $at = _stringAt(true);
_iterDefine(String, "String", function(iterated) {
this._t = String(iterated);
this._i = 0;
}, function() {
var O = this._t;
var index2 = this._i;
var point;
if (index2 >= O.length)
return { value: void 0, done: true };
point = $at(O, index2);
this._i += point.length;
return { value: point, done: false };
});
var _iterStep = function(done, value) {
return { value, done: !!done };
};
var step = _iterStep;
var Iterators$1 = _iterators;
var toIObject$3 = _toIobject;
_iterDefine(Array, "Array", function(iterated, kind) {
this._t = toIObject$3(iterated);
this._i = 0;
this._k = kind;
}, function() {
var O = this._t;
var kind = this._k;
var index2 = this._i++;
if (!O || index2 >= O.length) {
this._t = void 0;
return step(1);
}
if (kind == "keys")
return step(0, index2);
if (kind == "values")
return step(0, O[index2]);
return step(0, [index2, O[index2]]);
}, "values");
Iterators$1.Arguments = Iterators$1.Array;
var global$2 = _global$1.exports;
var hide = _hide;
var Iterators = _iterators;
var TO_STRING_TAG = _wks.exports("toStringTag");
var DOMIterables = "CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,TextTrackList,TouchList".split(",");
for (var i = 0; i < DOMIterables.length; i++) {
var NAME = DOMIterables[i];
var Collection = global$2[NAME];
var proto = Collection && Collection.prototype;
if (proto && !proto[TO_STRING_TAG])
hide(proto, TO_STRING_TAG, NAME);
Iterators[NAME] = Iterators.Array;
}
var _wksExt = {};
_wksExt.f = _wks.exports;
var iterator = _wksExt.f("iterator");
(function(module2) {
module2.exports = { "default": iterator, __esModule: true };
})(iterator$1);
var symbol$1 = { exports: {} };
var _meta = { exports: {} };
var META$1 = _uid("meta");
var isObject$2 = _isObject;
var has$2 = _has;
var setDesc = _objectDp.f;
var id = 0;
var isExtensible = Object.isExtensible || function() {
return true;
};
var FREEZE = !_fails(function() {
return isExtensible(Object.preventExtensions({}));
});
var setMeta = function(it) {
setDesc(it, META$1, { value: {
i: "O" + ++id,
w: {}
} });
};
var fastKey = function(it, create2) {
if (!isObject$2(it))
return typeof it == "symbol" ? it : (typeof it == "string" ? "S" : "P") + it;
if (!has$2(it, META$1)) {
if (!isExtensible(it))
return "F";
if (!create2)
return "E";
setMeta(it);
}
return it[META$1].i;
};
var getWeak = function(it, create2) {
if (!has$2(it, META$1)) {
if (!isExtensible(it))
return true;
if (!create2)
return false;
setMeta(it);
}
return it[META$1].w;
};
var onFreeze = function(it) {
if (FREEZE && meta.NEED && isExtensible(it) && !has$2(it, META$1))
setMeta(it);
return it;
};
var meta = _meta.exports = {
KEY: META$1,
NEED: false,
fastKey,
getWeak,
onFreeze
};
var core = _core.exports;
var wksExt$1 = _wksExt;
var defineProperty$1 = _objectDp.f;
var _wksDefine = function(name2) {
var $Symbol2 = core.Symbol || (core.Symbol = {});
if (name2.charAt(0) != "_" && !(name2 in $Symbol2))
defineProperty$1($Symbol2, name2, { value: wksExt$1.f(name2) });
};
var getKeys = require_objectKeys();
var gOPS = require_objectGops();
var pIE$1 = require_objectPie();
var _enumKeys = function(it) {
var result = getKeys(it);
var getSymbols2 = gOPS.f;
if (getSymbols2) {
var symbols = getSymbols2(it);
var isEnum2 = pIE$1.f;
var i2 = 0;
var key2;
while (symbols.length > i2)
if (isEnum2.call(it, key2 = symbols[i2++]))
result.push(key2);
}
return result;
};
var cof = require_cof();
var _isArray = Array.isArray || function isArray2(arg) {
return cof(arg) == "Array";
};
var _objectGopnExt = {};
var _objectGopn = {};
var $keys$1 = require_objectKeysInternal();
var hiddenKeys = _enumBugKeys.concat("length", "prototype");
_objectGopn.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
return $keys$1(O, hiddenKeys);
};
var toIObject$2 = _toIobject;
var gOPN$1 = _objectGopn.f;
var toString$2 = {}.toString;
var windowNames = typeof window == "object" && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : [];
var getWindowNames = function(it) {
try {
return gOPN$1(it);
} catch (e2) {
return windowNames.slice();
}
};
_objectGopnExt.f = function getOwnPropertyNames(it) {
return windowNames && toString$2.call(it) == "[object Window]" ? getWindowNames(it) : gOPN$1(toIObject$2(it));
};
var _objectGopd = {};
var pIE = require_objectPie();
var createDesc$1 = _propertyDesc;
var toIObject$1 = _toIobject;
var toPrimitive$2 = _toPrimitive$5;
var has$1 = _has;
var IE8_DOM_DEFINE = _ie8DomDefine;
var gOPD$1 = Object.getOwnPropertyDescriptor;
_objectGopd.f = _descriptors ? gOPD$1 : function getOwnPropertyDescriptor(O, P) {
O = toIObject$1(O);
P = toPrimitive$2(P, true);
if (IE8_DOM_DEFINE)
try {
return gOPD$1(O, P);
} catch (e2) {
}
if (has$1(O, P))
return createDesc$1(!pIE.f.call(O, P), O[P]);
};
var global$1 = _global$1.exports;
var has = _has;
var DESCRIPTORS = _descriptors;
var $export$2 = _export;
var redefine = _redefine.exports;
var META = _meta.exports.KEY;
var $fails = _fails;
var shared = _shared.exports;
var setToStringTag = _setToStringTag;
var uid = _uid;
var wks = _wks.exports;
var wksExt = _wksExt;
var wksDefine = _wksDefine;
var enumKeys = _enumKeys;
var isArray$1 = _isArray;
var anObject = _anObject;
var isObject$1 = _isObject;
var toObject = require_toObject();
var toIObject = _toIobject;
var toPrimitive$1 = _toPrimitive$5;
var createDesc = _propertyDesc;
var _create$1 = _objectCreate;
var gOPNExt = _objectGopnExt;
var $GOPD = _objectGopd;
var $GOPS = require_objectGops();
var $DP = _objectDp;
var $keys = require_objectKeys();
var gOPD = $GOPD.f;
var dP = $DP.f;
var gOPN = gOPNExt.f;
var $Symbol = global$1.Symbol;
var $JSON = global$1.JSON;
var _stringify = $JSON && $JSON.stringify;
var PROTOTYPE = "prototype";
var HIDDEN = wks("_hidden");
var TO_PRIMITIVE = wks("toPrimitive");
var isEnum = {}.propertyIsEnumerable;
var SymbolRegistry = shared("symbol-registry");
var AllSymbols = shared("symbols");
var OPSymbols = shared("op-symbols");
var ObjectProto = Object[PROTOTYPE];
var USE_NATIVE = typeof $Symbol == "function" && !!$GOPS.f;
var QObject = global$1.QObject;
var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;
var setSymbolDesc = DESCRIPTORS && $fails(function() {
return _create$1(dP({}, "a", {
get: function() {
return dP(this, "a", { value: 7 }).a;
}
})).a != 7;
}) ? function(it, key2, D) {
var protoDesc = gOPD(ObjectProto, key2);
if (protoDesc)
delete ObjectProto[key2];
dP(it, key2, D);
if (protoDesc && it !== ObjectProto)
dP(ObjectProto, key2, protoDesc);
} : dP;
var wrap = function(tag) {
var sym = AllSymbols[tag] = _create$1($Symbol[PROTOTYPE]);
sym._k = tag;
return sym;
};
var isSymbol = USE_NATIVE && typeof $Symbol.iterator == "symbol" ? function(it) {
return typeof it == "symbol";
} : function(it) {
return it instanceof $Symbol;
};
var $defineProperty = function defineProperty2(it, key2, D) {
if (it === ObjectProto)
$defineProperty(OPSymbols, key2, D);
anObject(it);
key2 = toPrimitive$1(key2, true);
anObject(D);
if (has(AllSymbols, key2)) {
if (!D.enumerable) {
if (!has(it, HIDDEN))
dP(it, HIDDEN, createDesc(1, {}));
it[HIDDEN][key2] = true;
} else {
if (has(it, HIDDEN) && it[HIDDEN][key2])
it[HIDDEN][key2] = false;
D = _create$1(D, { enumerable: createDesc(0, false) });
}
return setSymbolDesc(it, key2, D);
}
return dP(it, key2, D);
};
var $defineProperties = function defineProperties(it, P) {
anObject(it);
var keys2 = enumKeys(P = toIObject(P));
var i2 = 0;
var l2 = keys2.length;
var key2;
while (l2 > i2)
$defineProperty(it, key2 = keys2[i2++], P[key2]);
return it;
};
var $create = function create2(it, P) {
return P === void 0 ? _create$1(it) : $defineProperties(_create$1(it), P);
};
var $propertyIsEnumerable = function propertyIsEnumerable2(key2) {
var E = isEnum.call(this, key2 = toPrimitive$1(key2, true));
if (this === ObjectProto && has(AllSymbols, key2) && !has(OPSymbols, key2))
return false;
return E || !has(this, key2) || !has(AllSymbols, key2) || has(this, HIDDEN) && this[HIDDEN][key2] ? E : true;
};
var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key2) {
it = toIObject(it);
key2 = toPrimitive$1(key2, true);
if (it === ObjectProto && has(AllSymbols, key2) && !has(OPSymbols, key2))
return;
var D = gOPD(it, key2);
if (D && has(AllSymbols, key2) && !(has(it, HIDDEN) && it[HIDDEN][key2]))
D.enumerable = true;
return D;
};
var $getOwnPropertyNames = function getOwnPropertyNames(it) {
var names2 = gOPN(toIObject(it));
var result = [];
var i2 = 0;
var key2;
while (names2.length > i2) {
if (!has(AllSymbols, key2 = names2[i2++]) && key2 != HIDDEN && key2 != META)
result.push(key2);
}
return result;
};
var $getOwnPropertySymbols = function getOwnPropertySymbols2(it) {
var IS_OP = it === ObjectProto;
var names2 = gOPN(IS_OP ? OPSymbols : toIObject(it));
var result = [];
var i2 = 0;
var key2;
while (names2.length > i2) {
if (has(AllSymbols, key2 = names2[i2++]) && (IS_OP ? has(ObjectProto, key2) : true))
result.push(AllSymbols[key2]);
}
return result;
};
if (!USE_NATIVE) {
$Symbol = function Symbol2() {
if (this instanceof $Symbol)
throw TypeError("Symbol is not a constructor!");
var tag = uid(arguments.length > 0 ? arguments[0] : void 0);
var $set = function(value) {
if (this === ObjectProto)
$set.call(OPSymbols, value);
if (has(this, HIDDEN) && has(this[HIDDEN], tag))
this[HIDDEN][tag] = false;
setSymbolDesc(this, tag, createDesc(1, value));
};
if (DESCRIPTORS && setter)
setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });
return wrap(tag);
};
redefine($Symbol[PROTOTYPE], "toString", function toString2() {
return this._k;
});
$GOPD.f = $getOwnPropertyDescriptor;
$DP.f = $defineProperty;
_objectGopn.f = gOPNExt.f = $getOwnPropertyNames;
require_objectPie().f = $propertyIsEnumerable;
$GOPS.f = $getOwnPropertySymbols;
if (DESCRIPTORS && !_library) {
redefine(ObjectProto, "propertyIsEnumerable", $propertyIsEnumerable, true);
}
wksExt.f = function(name2) {
return wrap(wks(name2));
};
}
$export$2($export$2.G + $export$2.W + $export$2.F * !USE_NATIVE, { Symbol: $Symbol });
for (var es6Symbols = "hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","), j = 0; es6Symbols.length > j; )
wks(es6Symbols[j++]);
for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k; )
wksDefine(wellKnownSymbols[k++]);
$export$2($export$2.S + $export$2.F * !USE_NATIVE, "Symbol", {
"for": function(key2) {
return has(SymbolRegistry, key2 += "") ? SymbolRegistry[key2] : SymbolRegistry[key2] = $Symbol(key2);
},
keyFor: function keyFor(sym) {
if (!isSymbol(sym))
throw TypeError(sym + " is not a symbol!");
for (var key2 in SymbolRegistry)
if (SymbolRegistry[key2] === sym)
return key2;
},
useSetter: function() {
setter = true;
},
useSimple: function() {
setter = false;
}
});
$export$2($export$2.S + $export$2.F * !USE_NATIVE, "Object", {
create: $create,
defineProperty: $defineProperty,
defineProperties: $defineProperties,
getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
getOwnPropertyNames: $getOwnPropertyNames,
getOwnPropertySymbols: $getOwnPropertySymbols
});
var FAILS_ON_PRIMITIVES = $fails(function() {
$GOPS.f(1);
});
$export$2($export$2.S + $export$2.F * FAILS_ON_PRIMITIVES, "Object", {
getOwnPropertySymbols: function getOwnPropertySymbols2(it) {
return $GOPS.f(toObject(it));
}
});
$JSON && $export$2($export$2.S + $export$2.F * (!USE_NATIVE || $fails(function() {
var S = $Symbol();
return _stringify([S]) != "[null]" || _stringify({ a: S }) != "{}" || _stringify(Object(S)) != "{}";
})), "JSON", {
stringify: function stringify2(it) {
var args = [it];
var i2 = 1;
var replacer, $replacer;
while (arguments.length > i2)
args.push(arguments[i2++]);
$replacer = replacer = args[1];
if (!isObject$1(replacer) && it === void 0 || isSymbol(it))
return;
if (!isArray$1(replacer))
replacer = function(key2, value) {
if (typeof $replacer == "function")
value = $replacer.call(this, key2, value);
if (!isSymbol(value))
return value;
};
args[1] = replacer;
return _stringify.apply($JSON, args);
}
});
$Symbol[PROTOTYPE][TO_PRIMITIVE] || _hide($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
setToStringTag($Symbol, "Symbol");
setToStringTag(Math, "Math", true);
setToStringTag(global$1.JSON, "JSON", true);
_wksDefine("asyncIterator");
_wksDefine("observable");
var symbol = _core.exports.Symbol;
(function(module2) {
module2.exports = { "default": symbol, __esModule: true };
})(symbol$1);
_typeof$i.__esModule = true;
var _iterator = iterator$1.exports;
var _iterator2 = _interopRequireDefault$d(_iterator);
var _symbol = symbol$1.exports;
var _symbol2 = _interopRequireDefault$d(_symbol);
var _typeof$h = typeof _symbol2.default === "function" && typeof _iterator2.default === "symbol" ? function(obj) {
return typeof obj;
} : function(obj) {
return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj;
};
function _interopRequireDefault$d(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
var _default$e = _typeof$i.default = typeof _symbol2.default === "function" && _typeof$h(_iterator2.default) === "symbol" ? function(obj) {
return typeof obj === "undefined" ? "undefined" : _typeof$h(obj);
} : function(obj) {
return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof$h(obj);
};
var _typeof2$1 = _typeof$i;
var _typeof3$1 = _interopRequireDefault$c(_typeof2$1);
function _interopRequireDefault$c(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
var _default$d = function(self2, call2) {
if (!self2) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return call2 && ((typeof call2 === "undefined" ? "undefined" : (0, _typeof3$1.default)(call2)) === "object" || typeof call2 === "function") ? call2 : self2;
};
var setPrototypeOf$1 = { exports: {} };
var _setProto;
var hasRequired_setProto;
function require_setProto() {
if (hasRequired_setProto)
return _setProto;
hasRequired_setProto = 1;
var isObject2 = _isObject;
var anObject2 = _anObject;
var check = function(O, proto2) {
anObject2(O);
if (!isObject2(proto2) && proto2 !== null)
throw TypeError(proto2 + ": can't set as prototype!");
};
_setProto = {
set: Object.setPrototypeOf || ("__proto__" in {} ? function(test, buggy, set2) {
try {
set2 = _ctx(Function.call, _objectGopd.f(Object.prototype, "__proto__").set, 2);
set2(test, []);
buggy = !(test instanceof Array);
} catch (e2) {
buggy = true;
}
return function setPrototypeOf2(O, proto2) {
check(O, proto2);
if (buggy)
O.__proto__ = proto2;
else
set2(O, proto2);
return O;
};
}({}, false) : void 0),
check
};
return _setProto;
}
var $export$1 = _export;
$export$1($export$1.S, "Object", { setPrototypeOf: require_setProto().set });
var setPrototypeOf = _core.exports.Object.setPrototypeOf;
(function(module2) {
module2.exports = { "default": setPrototypeOf, __esModule: true };
})(setPrototypeOf$1);
var create$1 = { exports: {} };
var $export = _export;
$export($export.S, "Object", { create: _objectCreate });
var $Object = _core.exports.Object;
var create = function create2(P, D) {
return $Object.create(P, D);
};
(function(module2) {
module2.exports = { "default": create, __esModule: true };
})(create$1);
var _setPrototypeOf = setPrototypeOf$1.exports;
var _setPrototypeOf2 = _interopRequireDefault$b(_setPrototypeOf);
var _create = create$1.exports;
var _create2 = _interopRequireDefault$b(_create);
var _typeof2 = _typeof$i;
var _typeof3 = _interopRequireDefault$b(_typeof2);
function _interopRequireDefault$b(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
var _default$c = function(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : (0, _typeof3.default)(superClass)));
}
subClass.prototype = (0, _create2.default)(superClass && superClass.prototype, {
constructor: {
value: subClass,
enumerable: false,
writable: true,
configurable: true
}
});
if (superClass)
_setPrototypeOf2.default ? (0, _setPrototypeOf2.default)(subClass, superClass) : subClass.__proto__ = superClass;
};
function addEventListenerWrap(target, eventType, cb, option) {
var callback = ReactDOM__default.default.unstable_batchedUpdates ? function run(e2) {
ReactDOM__default.default.unstable_batchedUpdates(cb, e2);
} : cb;
return addDOMEventListener(target, eventType, callback, option);
}
function buffer(fn, ms) {
var timer = void 0;
function clear() {
if (timer) {
clearTimeout(timer);
timer = null;
}
}
function bufferFn() {
clear();
timer = setTimeout(fn, ms);
}
bufferFn.clear = clear;
return bufferFn;
}
function isSamePoint(prev, next) {
if (prev === next)
return true;
if (!prev || !next)
return false;
if ("pageX" in next && "pageY" in next) {
return prev.pageX === next.pageX && prev.pageY === next.pageY;
}
if ("clientX" in next && "clientY" in next) {
return prev.clientX === next.clientX && prev.clientY === next.clientY;
}
return false;
}
function isWindow(obj) {
return obj && typeof obj === "object" && obj.window === obj;
}
function isSimilarValue(val1, val2) {
var int1 = Math.floor(val1);
var int2 = Math.floor(val2);
return Math.abs(int1 - int2) <= 1;
}
function restoreFocus(activeElement, container) {
if (activeElement !== document.activeElement && contains$1(container, activeElement)) {
activeElement.focus();
}
}
function getElement(func) {
if (typeof func !== "function" || !func)
return null;
return func();
}
function getPoint(point) {
if (typeof point !== "object" || !point)
return null;
return point;
}
var Align = function(_Component) {
_default$c(Align2, _Component);
function Align2() {
var _ref;
var _temp, _this2, _ret;
_default$g(this, Align2);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _ret = (_temp = (_this2 = _default$d(this, (_ref = Align2.__proto__ || Object.getPrototypeOf(Align2)).call.apply(_ref, [this].concat(args))), _this2), _this2.forceAlign = function() {
var _this$props = _this2.props, disabled = _this$props.disabled, target = _this$props.target, align = _this$props.align, onAlign = _this$props.onAlign;
if (!disabled && target) {
var source = ReactDOM__default.default.findDOMNode(_this2);
var result = void 0;
var element = getElement(target);
var point = getPoint(target);
var activeElement = document.activeElement;
if (element) {
result = alignElement(source, element, align);
} else if (point) {
result = alignPoint(source, point, align);
}
restoreFocus(activeElement, source);
if (onAlign) {
onAlign(source, result);
}
}
}, _temp), _default$d(_this2, _ret);
}
_default$f(Align2, [{
key: "componentDidMount",
value: function componentDidMount() {
var props = this.props;
this.forceAlign();
if (!props.disabled && props.monitorWindowResize) {
this.startMonitorWindowResize();
}
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate(prevProps) {
var reAlign = false;
var props = this.props;
if (!props.disabled) {
var source = ReactDOM__default.default.findDOMNode(this);
var sourceRect = source ? source.getBoundingClientRect() : null;
if (prevProps.disabled) {
reAlign = true;
} else {
var lastElement = getElement(prevProps.target);
var currentElement = getElement(props.target);
var lastPoint = getPoint(prevProps.target);
var currentPoint = getPoint(props.target);
if (isWindow(lastElement) && isWindow(currentElement)) {
reAlign = false;
} else if (lastElement !== currentElement || lastElement && !currentElement && currentPoint || lastPoint && currentPoint && currentElement || currentPoint && !isSamePoint(lastPoint, currentPoint)) {
reAlign = true;
}
var preRect = this.sourceRect || {};
if (!reAlign && source && (!isSimilarValue(preRect.width, sourceRect.width) || !isSimilarValue(preRect.height, sourceRect.height))) {
reAlign = true;
}
}
this.sourceRect = sourceRect;
}
if (reAlign) {
this.forceAlign();
}
if (props.monitorWindowResize && !props.disabled) {
this.startMonitorWindowResize();
} else {
this.stopMonitorWindowResize();
}
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
this.stopMonitorWindowResize();
}
}, {
key: "startMonitorWindowResize",
value: function startMonitorWindowResize() {
if (!this.resizeHandler) {
this.bufferMonitor = buffer(this.forceAlign, this.props.monitorBufferTime);
this.resizeHandler = addEventListenerWrap(window, "resize", this.bufferMonitor);
}
}
}, {
key: "stopMonitorWindowResize",
value: function stopMonitorWindowResize() {
if (this.resizeHandler) {
this.bufferMonitor.clear();
this.resizeHandler.remove();
this.resizeHandler = null;
}
}
}, {
key: "render",
value: function render2() {
var _this2 = this;
var _props = this.props, childrenProps = _props.childrenProps, children = _props.children;
var child = React__default.default.Children.only(children);
if (childrenProps) {
var newProps = {};
var propList2 = Object.keys(childrenProps);
propList2.forEach(function(prop) {
newProps[prop] = _this2.props[childrenProps[prop]];
});
return React__default.default.cloneElement(child, newProps);
}
return child;
}
}]);
return Align2;
}(React$a.Component);
Align.propTypes = {
childrenProps: propTypes.exports.object,
align: propTypes.exports.object.isRequired,
target: propTypes.exports.oneOfType([propTypes.exports.func, propTypes.exports.shape({
clientX: propTypes.exports.number,
clientY: propTypes.exports.number,
pageX: propTypes.exports.number,
pageY: propTypes.exports.number
})]),
onAlign: propTypes.exports.func,
monitorBufferTime: propTypes.exports.number,
monitorWindowResize: propTypes.exports.bool,
disabled: propTypes.exports.bool,
children: propTypes.exports.any
};
Align.defaultProps = {
target: function target() {
return window;
},
monitorBufferTime: 50,
monitorWindowResize: false,
disabled: false
};
var _defineProperty$6 = defineProperty$3.exports;
var _defineProperty2 = _interopRequireDefault$a(_defineProperty$6);
function _interopRequireDefault$a(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
var _default$b = function(obj, key2, value) {
if (key2 in obj) {
(0, _defineProperty2.default)(obj, key2, {
value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key2] = value;
}
return obj;
};
var unsafeLifecyclesPolyfill = function unsafeLifecyclesPolyfill2(Component) {
var prototype2 = Component.prototype;
if (!prototype2 || !prototype2.isReactComponent) {
throw new Error("Can only polyfill class components");
}
if (typeof prototype2.componentWillReceiveProps !== "function") {
return Component;
}
if (!React__default.default.Profiler) {
return Component;
}
prototype2.UNSAFE_componentWillReceiveProps = prototype2.componentWillReceiveProps;
delete prototype2.componentWillReceiveProps;
return Component;
};
function toArrayChildren(children) {
var ret = [];
React__default.default.Children.forEach(children, function(child) {
ret.push(child);
});
return ret;
}
function findChildInChildrenByKey(children, key2) {
var ret = null;
if (children) {
children.forEach(function(child) {
if (ret) {
return;
}
if (child && child.key === key2) {
ret = child;
}
});
}
return ret;
}
function findShownChildInChildrenByKey(children, key2, showProp) {
var ret = null;
if (children) {
children.forEach(function(child) {
if (child && child.key === key2 && child.props[showProp]) {
if (ret) {
throw new Error("two child with same key for <rc-animate> children");
}
ret = child;
}
});
}
return ret;
}
function isSameChildren(c1, c2, showProp) {
var same = c1.length === c2.length;
if (same) {
c1.forEach(function(child, index2) {
var child2 = c2[index2];
if (child && child2) {
if (child && !child2 || !child && child2) {
same = false;
} else if (child.key !== child2.key) {
same = false;
} else if (showProp && child.props[showProp] !== child2.props[showProp]) {
same = false;
}
}
});
}
return same;
}
function mergeChildren(prev, next) {
var ret = [];
var nextChildrenPending = {};
var pendingChildren = [];
prev.forEach(function(child) {
if (child && findChildInChildrenByKey(next, child.key)) {
if (pendingChildren.length) {
nextChildrenPending[child.key] = pendingChildren;
pendingChildren = [];
}
} else {
pendingChildren.push(child);
}
});
next.forEach(function(child) {
if (child && Object.prototype.hasOwnProperty.call(nextChildrenPending, child.key)) {
ret = ret.concat(nextChildrenPending[child.key]);
}
ret.push(child);
});
ret = ret.concat(pendingChildren);
return ret;
}
var START_EVENT_NAME_MAP = {
transitionstart: {
transition: "transitionstart",
WebkitTransition: "webkitTransitionStart",
MozTransition: "mozTransitionStart",
OTransition: "oTransitionStart",
msTransition: "MSTransitionStart"
},
animationstart: {
animation: "animationstart",
WebkitAnimation: "webkitAnimationStart",
MozAnimation: "mozAnimationStart",
OAnimation: "oAnimationStart",
msAnimation: "MSAnimationStart"
}
};
var END_EVENT_NAME_MAP = {
transitionend: {
transition: "transitionend",
WebkitTransition: "webkitTransitionEnd",
MozTransition: "mozTransitionEnd",
OTransition: "oTransitionEnd",
msTransition: "MSTransitionEnd"
},
animationend: {
animation: "animationend",
WebkitAnimation: "webkitAnimationEnd",
MozAnimation: "mozAnimationEnd",
OAnimation: "oAnimationEnd",
msAnimation: "MSAnimationEnd"
}
};
var startEvents = [];
var endEvents = [];
function detectEvents() {
var testEl = document.createElement("div");
var style2 = testEl.style;
if (!("AnimationEvent" in window)) {
delete START_EVENT_NAME_MAP.animationstart.animation;
delete END_EVENT_NAME_MAP.animationend.animation;
}
if (!("TransitionEvent" in window)) {
delete START_EVENT_NAME_MAP.transitionstart.transition;
delete END_EVENT_NAME_MAP.transitionend.transition;
}
function process2(EVENT_NAME_MAP, events) {
for (var baseEventName in EVENT_NAME_MAP) {
if (EVENT_NAME_MAP.hasOwnProperty(baseEventName)) {
var baseEvents = EVENT_NAME_MAP[baseEventName];
for (var styleName in baseEvents) {
if (styleName in style2) {
events.push(baseEvents[styleName]);
break;
}
}
}
}
}
process2(START_EVENT_NAME_MAP, startEvents);
process2(END_EVENT_NAME_MAP, endEvents);
}
if (typeof window !== "undefined" && typeof document !== "undefined") {
detectEvents();
}
function addEventListener(node, eventName, eventListener) {
node.addEventListener(eventName, eventListener, false);
}
function removeEventListener(node, eventName, eventListener) {
node.removeEventListener(eventName, eventListener, false);
}
var TransitionEvents = {
startEvents,
addStartEventListener: function addStartEventListener(node, eventListener) {
if (startEvents.length === 0) {
window.setTimeout(eventListener, 0);
return;
}
startEvents.forEach(function(startEvent) {
addEventListener(node, startEvent, eventListener);
});
},
removeStartEventListener: function removeStartEventListener(node, eventListener) {
if (startEvents.length === 0) {
return;
}
startEvents.forEach(function(startEvent) {
removeEventListener(node, startEvent, eventListener);
});
},
endEvents,
addEndEventListener: function addEndEventListener(node, eventListener) {
if (endEvents.length === 0) {
window.setTimeout(eventListener, 0);
return;
}
endEvents.forEach(function(endEvent) {
addEventListener(node, endEvent, eventListener);
});
},
removeEndEventListener: function removeEndEventListener(node, eventListener) {
if (endEvents.length === 0) {
return;
}
endEvents.forEach(function(endEvent) {
removeEventListener(node, endEvent, eventListener);
});
}
};
var componentIndexof;
var hasRequiredComponentIndexof;
function requireComponentIndexof() {
if (hasRequiredComponentIndexof)
return componentIndexof;
hasRequiredComponentIndexof = 1;
componentIndexof = function(arr, obj) {
if (arr.indexOf)
return arr.indexOf(obj);
for (var i2 = 0; i2 < arr.length; ++i2) {
if (arr[i2] === obj)
return i2;
}
return -1;
};
return componentIndexof;
}
try {
var index$E = require("indexof");
} catch (err) {
var index$E = requireComponentIndexof();
}
var re = /\s+/;
var toString$1 = Object.prototype.toString;
var componentClasses = function(el) {
return new ClassList(el);
};
function ClassList(el) {
if (!el || !el.nodeType) {
throw new Error("A DOM element reference is required");
}
this.el = el;
this.list = el.classList;
}
ClassList.prototype.add = function(name2) {
if (this.list) {
this.list.add(name2);
return this;
}
var arr = this.array();
var i2 = index$E(arr, name2);
if (!~i2)
arr.push(name2);
this.el.className = arr.join(" ");
return this;
};
ClassList.prototype.remove = function(name2) {
if ("[object RegExp]" == toString$1.call(name2)) {
return this.removeMatching(name2);
}
if (this.list) {
this.list.remove(name2);
return this;
}
var arr = this.array();
var i2 = index$E(arr, name2);
if (~i2)
arr.splice(i2, 1);
this.el.className = arr.join(" ");
return this;
};
ClassList.prototype.removeMatching = function(re2) {
var arr = this.array();
for (var i2 = 0; i2 < arr.length; i2++) {
if (re2.test(arr[i2])) {
this.remove(arr[i2]);
}
}
return this;
};
ClassList.prototype.toggle = function(name2, force) {
if (this.list) {
if ("undefined" !== typeof force) {
if (force !== this.list.toggle(name2, force)) {
this.list.toggle(name2);
}
} else {
this.list.toggle(name2);
}
return this;
}
if ("undefined" !== typeof force) {
if (!force) {
this.remove(name2);
} else {
this.add(name2);
}
} else {
if (this.has(name2)) {
this.remove(name2);
} else {
this.add(name2);
}
}
return this;
};
ClassList.prototype.array = function() {
var className = this.el.getAttribute("class") || "";
var str = className.replace(/^\s+|\s+$/g, "");
var arr = str.split(re);
if ("" === arr[0])
arr.shift();
return arr;
};
ClassList.prototype.has = ClassList.prototype.contains = function(name2) {
return this.list ? this.list.contains(name2) : !!~index$E(this.array(), name2);
};
var isCssAnimationSupported = TransitionEvents.endEvents.length !== 0;
var capitalPrefixes = [
"Webkit",
"Moz",
"O",
"ms"
];
var prefixes = ["-webkit-", "-moz-", "-o-", "ms-", ""];
function getStyleProperty(node, name2) {
var style2 = window.getComputedStyle(node, null);
var ret = "";
for (var i2 = 0; i2 < prefixes.length; i2++) {
ret = style2.getPropertyValue(prefixes[i2] + name2);
if (ret) {
break;
}
}
return ret;
}
function fixBrowserByTimeout(node) {
if (isCssAnimationSupported) {
var transitionDelay = parseFloat(getStyleProperty(node, "transition-delay")) || 0;
var transitionDuration = parseFloat(getStyleProperty(node, "transition-duration")) || 0;
var animationDelay = parseFloat(getStyleProperty(node, "animation-delay")) || 0;
var animationDuration = parseFloat(getStyleProperty(node, "animation-duration")) || 0;
var time = Math.max(transitionDuration + transitionDelay, animationDuration + animationDelay);
node.rcEndAnimTimeout = setTimeout(function() {
node.rcEndAnimTimeout = null;
if (node.rcEndListener) {
node.rcEndListener();
}
}, time * 1e3 + 200);
}
}
function clearBrowserBugTimeout(node) {
if (node.rcEndAnimTimeout) {
clearTimeout(node.rcEndAnimTimeout);
node.rcEndAnimTimeout = null;
}
}
var cssAnimation = function cssAnimation2(node, transitionName2, endCallback) {
var nameIsObj = (typeof transitionName2 === "undefined" ? "undefined" : _default$e(transitionName2)) === "object";
var className = nameIsObj ? transitionName2.name : transitionName2;
var activeClassName = nameIsObj ? transitionName2.active : transitionName2 + "-active";
var end = endCallback;
var start = void 0;
var active = void 0;
var nodeClasses = componentClasses(node);
if (endCallback && Object.prototype.toString.call(endCallback) === "[object Object]") {
end = endCallback.end;
start = endCallback.start;
active = endCallback.active;
}
if (node.rcEndListener) {
node.rcEndListener();
}
node.rcEndListener = function(e2) {
if (e2 && e2.target !== node) {
return;
}
if (node.rcAnimTimeout) {
clearTimeout(node.rcAnimTimeout);
node.rcAnimTimeout = null;
}
clearBrowserBugTimeout(node);
nodeClasses.remove(className);
nodeClasses.remove(activeClassName);
TransitionEvents.removeEndEventListener(node, node.rcEndListener);
node.rcEndListener = null;
if (end) {
end();
}
};
TransitionEvents.addEndEventListener(node, node.rcEndListener);
if (start) {
start();
}
nodeClasses.add(className);
node.rcAnimTimeout = setTimeout(function() {
node.rcAnimTimeout = null;
nodeClasses.add(activeClassName);
if (active) {
setTimeout(active, 0);
}
fixBrowserByTimeout(node);
}, 30);
return {
stop: function stop() {
if (node.rcEndListener) {
node.rcEndListener();
}
}
};
};
cssAnimation.style = function(node, style2, callback) {
if (node.rcEndListener) {
node.rcEndListener();
}
node.rcEndListener = function(e2) {
if (e2 && e2.target !== node) {
return;
}
if (node.rcAnimTimeout) {
clearTimeout(node.rcAnimTimeout);
node.rcAnimTimeout = null;
}
clearBrowserBugTimeout(node);
TransitionEvents.removeEndEventListener(node, node.rcEndListener);
node.rcEndListener = null;
if (callback) {
callback();
}
};
TransitionEvents.addEndEventListener(node, node.rcEndListener);
node.rcAnimTimeout = setTimeout(function() {
for (var s in style2) {
if (style2.hasOwnProperty(s)) {
node.style[s] = style2[s];
}
}
node.rcAnimTimeout = null;
fixBrowserByTimeout(node);
}, 0);
};
cssAnimation.setTransition = function(node, p2, value) {
var property2 = p2;
var v2 = value;
if (value === void 0) {
v2 = property2;
property2 = "";
}
property2 = property2 || "";
capitalPrefixes.forEach(function(prefix) {
node.style[prefix + "Transition" + property2] = v2;
});
};
cssAnimation.isCssAnimationSupported = isCssAnimationSupported;
var util = {
isAppearSupported: function isAppearSupported(props) {
return props.transitionName && props.transitionAppear || props.animation.appear;
},
isEnterSupported: function isEnterSupported(props) {
return props.transitionName && props.transitionEnter || props.animation.enter;
},
isLeaveSupported: function isLeaveSupported(props) {
return props.transitionName && props.transitionLeave || props.animation.leave;
},
allowAppearCallback: function allowAppearCallback(props) {
return props.transitionAppear || props.animation.appear;
},
allowEnterCallback: function allowEnterCallback(props) {
return props.transitionEnter || props.animation.enter;
},
allowLeaveCallback: function allowLeaveCallback(props) {
return props.transitionLeave || props.animation.leave;
}
};
var transitionMap = {
enter: "transitionEnter",
appear: "transitionAppear",
leave: "transitionLeave"
};
var AnimateChild = function(_React$Component) {
_default$c(AnimateChild2, _React$Component);
function AnimateChild2() {
_default$g(this, AnimateChild2);
return _default$d(this, (AnimateChild2.__proto__ || Object.getPrototypeOf(AnimateChild2)).apply(this, arguments));
}
_default$f(AnimateChild2, [{
key: "componentWillUnmount",
value: function componentWillUnmount() {
this.stop();
}
}, {
key: "componentWillEnter",
value: function componentWillEnter(done) {
if (util.isEnterSupported(this.props)) {
this.transition("enter", done);
} else {
done();
}
}
}, {
key: "componentWillAppear",
value: function componentWillAppear(done) {
if (util.isAppearSupported(this.props)) {
this.transition("appear", done);
} else {
done();
}
}
}, {
key: "componentWillLeave",
value: function componentWillLeave(done) {
if (util.isLeaveSupported(this.props)) {
this.transition("leave", done);
} else {
done();
}
}
}, {
key: "transition",
value: function transition(animationType, finishCallback) {
var _this2 = this;
var node = ReactDOM__default.default.findDOMNode(this);
var props = this.props;
var transitionName2 = props.transitionName;
var nameIsObj = typeof transitionName2 === "object";
this.stop();
var end = function end2() {
_this2.stopper = null;
finishCallback();
};
if ((isCssAnimationSupported || !props.animation[animationType]) && transitionName2 && props[transitionMap[animationType]]) {
var name2 = nameIsObj ? transitionName2[animationType] : transitionName2 + "-" + animationType;
var activeName = name2 + "-active";
if (nameIsObj && transitionName2[animationType + "Active"]) {
activeName = transitionName2[animationType + "Active"];
}
this.stopper = cssAnimation(node, {
name: name2,
active: activeName
}, end);
} else {
this.stopper = props.animation[animationType](node, end);
}
}
}, {
key: "stop",
value: function stop() {
var stopper = this.stopper;
if (stopper) {
this.stopper = null;
stopper.stop();
}
}
}, {
key: "render",
value: function render2() {
return this.props.children;
}
}]);
return AnimateChild2;
}(React__default.default.Component);
AnimateChild.propTypes = {
children: propTypes.exports.any,
animation: propTypes.exports.any,
transitionName: propTypes.exports.any
};
var defaultKey = "rc_animate_" + Date.now();
function getChildrenFromProps(props) {
var children = props.children;
if (React__default.default.isValidElement(children)) {
if (!children.key) {
return React__default.default.cloneElement(children, {
key: defaultKey
});
}
}
return children;
}
function noop$2() {
}
var Animate = function(_React$Component) {
_default$c(Animate2, _React$Component);
function Animate2(props) {
_default$g(this, Animate2);
var _this2 = _default$d(this, (Animate2.__proto__ || Object.getPrototypeOf(Animate2)).call(this, props));
_initialiseProps$1.call(_this2);
_this2.currentlyAnimatingKeys = {};
_this2.keysToEnter = [];
_this2.keysToLeave = [];
_this2.state = {
children: toArrayChildren(getChildrenFromProps(props))
};
_this2.childrenRefs = {};
return _this2;
}
_default$f(Animate2, [{
key: "componentDidMount",
value: function componentDidMount() {
var _this2 = this;
var showProp = this.props.showProp;
var children = this.state.children;
if (showProp) {
children = children.filter(function(child) {
return !!child.props[showProp];
});
}
children.forEach(function(child) {
if (child) {
_this2.performAppear(child.key);
}
});
}
}, {
key: "componentWillReceiveProps",
value: function componentWillReceiveProps(nextProps) {
var _this3 = this;
this.nextProps = nextProps;
var nextChildren = toArrayChildren(getChildrenFromProps(nextProps));
var props = this.props;
if (props.exclusive) {
Object.keys(this.currentlyAnimatingKeys).forEach(function(key2) {
_this3.stop(key2);
});
}
var showProp = props.showProp;
var currentlyAnimatingKeys = this.currentlyAnimatingKeys;
var currentChildren = props.exclusive ? toArrayChildren(getChildrenFromProps(props)) : this.state.children;
var newChildren = [];
if (showProp) {
currentChildren.forEach(function(currentChild) {
var nextChild = currentChild && findChildInChildrenByKey(nextChildren, currentChild.key);
var newChild = void 0;
if ((!nextChild || !nextChild.props[showProp]) && currentChild.props[showProp]) {
newChild = React__default.default.cloneElement(nextChild || currentChild, _default$b({}, showProp, true));
} else {
newChild = nextChild;
}
if (newChild) {
newChildren.push(newChild);
}
});
nextChildren.forEach(function(nextChild) {
if (!nextChild || !findChildInChildrenByKey(currentChildren, nextChild.key)) {
newChildren.push(nextChild);
}
});
} else {
newChildren = mergeChildren(currentChildren, nextChildren);
}
this.setState({
children: newChildren
});
nextChildren.forEach(function(child) {
var key2 = child && child.key;
if (child && currentlyAnimatingKeys[key2]) {
return;
}
var hasPrev = child && findChildInChildrenByKey(currentChildren, key2);
if (showProp) {
var showInNext = child.props[showProp];
if (hasPrev) {
var showInNow = findShownChildInChildrenByKey(currentChildren, key2, showProp);
if (!showInNow && showInNext) {
_this3.keysToEnter.push(key2);
}
} else if (showInNext) {
_this3.keysToEnter.push(key2);
}
} else if (!hasPrev) {
_this3.keysToEnter.push(key2);
}
});
currentChildren.forEach(function(child) {
var key2 = child && child.key;
if (child && currentlyAnimatingKeys[key2]) {
return;
}
var hasNext = child && findChildInChildrenByKey(nextChildren, key2);
if (showProp) {
var showInNow = child.props[showProp];
if (hasNext) {
var showInNext = findShownChildInChildrenByKey(nextChildren, key2, showProp);
if (!showInNext && showInNow) {
_this3.keysToLeave.push(key2);
}
} else if (showInNow) {
_this3.keysToLeave.push(key2);
}
} else if (!hasNext) {
_this3.keysToLeave.push(key2);
}
});
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate() {
var keysToEnter = this.keysToEnter;
this.keysToEnter = [];
keysToEnter.forEach(this.performEnter);
var keysToLeave = this.keysToLeave;
this.keysToLeave = [];
keysToLeave.forEach(this.performLeave);
}
}, {
key: "isValidChildByKey",
value: function isValidChildByKey(currentChildren, key2) {
var showProp = this.props.showProp;
if (showProp) {
return findShownChildInChildrenByKey(currentChildren, key2, showProp);
}
return findChildInChildrenByKey(currentChildren, key2);
}
}, {
key: "stop",
value: function stop(key2) {
delete this.currentlyAnimatingKeys[key2];
var component = this.childrenRefs[key2];
if (component) {
component.stop();
}
}
}, {
key: "render",
value: function render2() {
var _this4 = this;
var props = this.props;
this.nextProps = props;
var stateChildren = this.state.children;
var children = null;
if (stateChildren) {
children = stateChildren.map(function(child) {
if (child === null || child === void 0) {
return child;
}
if (!child.key) {
throw new Error("must set key for <rc-animate> children");
}
return /* @__PURE__ */ jsx(AnimateChild, {
ref: function ref(node) {
_this4.childrenRefs[child.key] = node;
},
animation: props.animation,
transitionName: props.transitionName,
transitionEnter: props.transitionEnter,
transitionAppear: props.transitionAppear,
transitionLeave: props.transitionLeave,
children: child
}, child.key);
});
}
var Component = props.component;
if (Component) {
var passedProps = props;
if (typeof Component === "string") {
passedProps = _default$i({
className: props.className,
style: props.style
}, props.componentProps);
}
return /* @__PURE__ */ jsx(Component, {
...passedProps,
children
});
}
return children[0] || null;
}
}]);
return Animate2;
}(React__default.default.Component);
Animate.isAnimate = true;
Animate.propTypes = {
className: propTypes.exports.string,
style: propTypes.exports.object,
component: propTypes.exports.any,
componentProps: propTypes.exports.object,
animation: propTypes.exports.object,
transitionName: propTypes.exports.oneOfType([propTypes.exports.string, propTypes.exports.object]),
transitionEnter: propTypes.exports.bool,
transitionAppear: propTypes.exports.bool,
exclusive: propTypes.exports.bool,
transitionLeave: propTypes.exports.bool,
onEnd: propTypes.exports.func,
onEnter: propTypes.exports.func,
onLeave: propTypes.exports.func,
onAppear: propTypes.exports.func,
showProp: propTypes.exports.string,
children: propTypes.exports.node
};
Animate.defaultProps = {
animation: {},
component: "span",
componentProps: {},
transitionEnter: true,
transitionLeave: true,
transitionAppear: false,
onEnd: noop$2,
onEnter: noop$2,
onLeave: noop$2,
onAppear: noop$2
};
var _initialiseProps$1 = function _initialiseProps2() {
var _this5 = this;
this.performEnter = function(key2) {
if (_this5.childrenRefs[key2]) {
_this5.currentlyAnimatingKeys[key2] = true;
_this5.childrenRefs[key2].componentWillEnter(_this5.handleDoneAdding.bind(_this5, key2, "enter"));
}
};
this.performAppear = function(key2) {
if (_this5.childrenRefs[key2]) {
_this5.currentlyAnimatingKeys[key2] = true;
_this5.childrenRefs[key2].componentWillAppear(_this5.handleDoneAdding.bind(_this5, key2, "appear"));
}
};
this.handleDoneAdding = function(key2, type2) {
var props = _this5.props;
delete _this5.currentlyAnimatingKeys[key2];
if (props.exclusive && props !== _this5.nextProps) {
return;
}
var currentChildren = toArrayChildren(getChildrenFromProps(props));
if (!_this5.isValidChildByKey(currentChildren, key2)) {
_this5.performLeave(key2);
} else if (type2 === "appear") {
if (util.allowAppearCallback(props)) {
props.onAppear(key2);
props.onEnd(key2, true);
}
} else if (util.allowEnterCallback(props)) {
props.onEnter(key2);
props.onEnd(key2, true);
}
};
this.performLeave = function(key2) {
if (_this5.childrenRefs[key2]) {
_this5.currentlyAnimatingKeys[key2] = true;
_this5.childrenRefs[key2].componentWillLeave(_this5.handleDoneLeaving.bind(_this5, key2));
}
};
this.handleDoneLeaving = function(key2) {
var props = _this5.props;
delete _this5.currentlyAnimatingKeys[key2];
if (props.exclusive && props !== _this5.nextProps) {
return;
}
var currentChildren = toArrayChildren(getChildrenFromProps(props));
if (_this5.isValidChildByKey(currentChildren, key2)) {
_this5.performEnter(key2);
} else {
var end = function end2() {
if (util.allowLeaveCallback(props)) {
props.onLeave(key2);
props.onEnd(key2, false);
}
};
if (!isSameChildren(_this5.state.children, currentChildren, props.showProp)) {
_this5.setState({
children: currentChildren
}, end);
} else {
end();
}
}
};
};
const Animate$1 = unsafeLifecyclesPolyfill(Animate);
var _default$a = function(obj, keys2) {
var target = {};
for (var i2 in obj) {
if (keys2.indexOf(i2) >= 0)
continue;
if (!Object.prototype.hasOwnProperty.call(obj, i2))
continue;
target[i2] = obj[i2];
}
return target;
};
var LazyRenderBox = function(_Component) {
_default$c(LazyRenderBox2, _Component);
function LazyRenderBox2() {
_default$g(this, LazyRenderBox2);
return _default$d(this, (LazyRenderBox2.__proto__ || Object.getPrototypeOf(LazyRenderBox2)).apply(this, arguments));
}
_default$f(LazyRenderBox2, [{
key: "shouldComponentUpdate",
value: function shouldComponentUpdate(nextProps) {
return nextProps.hiddenClassName || nextProps.visible;
}
}, {
key: "render",
value: function render2() {
var _props = this.props, hiddenClassName = _props.hiddenClassName, visible = _props.visible, props = _default$a(_props, ["hiddenClassName", "visible"]);
if (hiddenClassName || React__default.default.Children.count(props.children) > 1) {
if (!visible && hiddenClassName) {
props.className += " " + hiddenClassName;
}
return /* @__PURE__ */ jsx("div", {
...props
});
}
return React__default.default.Children.only(props.children);
}
}]);
return LazyRenderBox2;
}(React$a.Component);
LazyRenderBox.propTypes = {
children: propTypes.exports.any,
className: propTypes.exports.string,
visible: propTypes.exports.bool,
hiddenClassName: propTypes.exports.string
};
var PopupInner = function(_Component) {
_default$c(PopupInner2, _Component);
function PopupInner2() {
_default$g(this, PopupInner2);
return _default$d(this, (PopupInner2.__proto__ || Object.getPrototypeOf(PopupInner2)).apply(this, arguments));
}
_default$f(PopupInner2, [{
key: "render",
value: function render2() {
var props = this.props;
var className = props.className;
if (!props.visible) {
className += " " + props.hiddenClassName;
}
return /* @__PURE__ */ jsx("div", {
className,
onMouseEnter: props.onMouseEnter,
onMouseLeave: props.onMouseLeave,
style: props.style,
children: /* @__PURE__ */ jsx(LazyRenderBox, {
className: props.prefixCls + "-content",
visible: props.visible,
children: props.children
})
});
}
}]);
return PopupInner2;
}(React$a.Component);
PopupInner.propTypes = {
hiddenClassName: propTypes.exports.string,
className: propTypes.exports.string,
prefixCls: propTypes.exports.string,
onMouseEnter: propTypes.exports.func,
onMouseLeave: propTypes.exports.func,
children: propTypes.exports.any
};
function isPointsEq(a1, a2) {
return a1[0] === a2[0] && a1[1] === a2[1];
}
function getAlignFromPlacement(builtinPlacements, placementStr, align) {
var baseAlign = builtinPlacements[placementStr] || {};
return _default$i({}, baseAlign, align);
}
function getPopupClassNameFromAlign(builtinPlacements, prefixCls, align) {
var points = align.points;
for (var placement in builtinPlacements) {
if (builtinPlacements.hasOwnProperty(placement)) {
if (isPointsEq(builtinPlacements[placement].points, points)) {
return prefixCls + "-placement-" + placement;
}
}
}
return "";
}
function saveRef(name2, component) {
this[name2] = component;
}
var Popup = function(_Component) {
_default$c(Popup2, _Component);
function Popup2(props) {
_default$g(this, Popup2);
var _this2 = _default$d(this, (Popup2.__proto__ || Object.getPrototypeOf(Popup2)).call(this, props));
_initialiseProps.call(_this2);
_this2.savePopupRef = saveRef.bind(_this2, "popupInstance");
_this2.saveAlignRef = saveRef.bind(_this2, "alignInstance");
return _this2;
}
_default$f(Popup2, [{
key: "componentDidMount",
value: function componentDidMount() {
this.rootNode = this.getPopupDomNode();
}
}, {
key: "getPopupDomNode",
value: function getPopupDomNode() {
return ReactDOM__default.default.findDOMNode(this.popupInstance);
}
}, {
key: "getMaskTransitionName",
value: function getMaskTransitionName() {
var props = this.props;
var transitionName2 = props.maskTransitionName;
var animation = props.maskAnimation;
if (!transitionName2 && animation) {
transitionName2 = props.prefixCls + "-" + animation;
}
return transitionName2;
}
}, {
key: "getTransitionName",
value: function getTransitionName2() {
var props = this.props;
var transitionName2 = props.transitionName;
if (!transitionName2 && props.animation) {
transitionName2 = props.prefixCls + "-" + props.animation;
}
return transitionName2;
}
}, {
key: "getClassName",
value: function getClassName(currentAlignClassName) {
return this.props.prefixCls + " " + this.props.className + " " + currentAlignClassName;
}
}, {
key: "getPopupElement",
value: function getPopupElement() {
var savePopupRef = this.savePopupRef, props = this.props;
var align = props.align, style2 = props.style, visible = props.visible, prefixCls = props.prefixCls, destroyPopupOnHide = props.destroyPopupOnHide;
var className = this.getClassName(this.currentAlignClassName || props.getClassNameFromAlign(align));
var hiddenClassName = prefixCls + "-hidden";
if (!visible) {
this.currentAlignClassName = null;
}
var newStyle = _default$i({}, style2, this.getZIndexStyle());
var popupInnerProps = {
className,
prefixCls,
ref: savePopupRef,
onMouseEnter: props.onMouseEnter,
onMouseLeave: props.onMouseLeave,
style: newStyle
};
if (destroyPopupOnHide) {
return /* @__PURE__ */ jsx(Animate$1, {
component: "",
exclusive: true,
transitionAppear: true,
transitionName: this.getTransitionName(),
children: visible ? /* @__PURE__ */ jsx(Align, {
target: this.getTarget,
ref: this.saveAlignRef,
monitorWindowResize: true,
align,
onAlign: this.onAlign,
children: /* @__PURE__ */ jsx(PopupInner, {
visible: true,
...popupInnerProps,
children: props.children
})
}, "popup") : null
});
}
return /* @__PURE__ */ jsx(Animate$1, {
component: "",
exclusive: true,
transitionAppear: true,
transitionName: this.getTransitionName(),
showProp: "xVisible",
children: /* @__PURE__ */ jsx(Align, {
target: this.getTarget,
ref: this.saveAlignRef,
monitorWindowResize: true,
xVisible: visible,
childrenProps: {
visible: "xVisible"
},
disabled: !visible,
align,
onAlign: this.onAlign,
children: /* @__PURE__ */ jsx(PopupInner, {
hiddenClassName,
...popupInnerProps,
children: props.children
})
}, "popup")
});
}
}, {
key: "getZIndexStyle",
value: function getZIndexStyle() {
var style2 = {};
var props = this.props;
if (props.zIndex !== void 0) {
style2.zIndex = props.zIndex;
}
return style2;
}
}, {
key: "getMaskElement",
value: function getMaskElement() {
var props = this.props;
var maskElement = void 0;
if (props.mask) {
var maskTransition = this.getMaskTransitionName();
maskElement = /* @__PURE__ */ jsx(LazyRenderBox, {
style: this.getZIndexStyle(),
className: props.prefixCls + "-mask",
hiddenClassName: props.prefixCls + "-mask-hidden",
visible: props.visible
}, "mask");
if (maskTransition) {
maskElement = /* @__PURE__ */ jsx(Animate$1, {
showProp: "visible",
transitionAppear: true,
component: "",
transitionName: maskTransition,
children: maskElement
}, "mask");
}
}
return maskElement;
}
}, {
key: "render",
value: function render2() {
return /* @__PURE__ */ jsxs("div", {
children: [this.getMaskElement(), this.getPopupElement()]
});
}
}]);
return Popup2;
}(React$a.Component);
Popup.propTypes = {
visible: propTypes.exports.bool,
style: propTypes.exports.object,
getClassNameFromAlign: propTypes.exports.func,
onAlign: propTypes.exports.func,
getRootDomNode: propTypes.exports.func,
onMouseEnter: propTypes.exports.func,
align: propTypes.exports.any,
destroyPopupOnHide: propTypes.exports.bool,
className: propTypes.exports.string,
prefixCls: propTypes.exports.string,
onMouseLeave: propTypes.exports.func
};
var _initialiseProps = function _initialiseProps2() {
var _this2 = this;
this.onAlign = function(popupDomNode, align) {
var props = _this2.props;
var currentAlignClassName = props.getClassNameFromAlign(align);
if (_this2.currentAlignClassName !== currentAlignClassName) {
_this2.currentAlignClassName = currentAlignClassName;
popupDomNode.className = _this2.getClassName(currentAlignClassName);
}
props.onAlign(popupDomNode, align);
};
this.getTarget = function() {
return _this2.props.getRootDomNode();
};
};
var getContainerRenderMixin$1 = {};
Object.defineProperty(getContainerRenderMixin$1, "__esModule", {
value: true
});
var _default$9 = getContainerRenderMixin$1.default = getContainerRenderMixin;
var _reactDom = _interopRequireDefault$9(ReactDOM__default.default);
function _interopRequireDefault$9(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
function ownKeys$1(object2, enumerableOnly) {
var keys2 = Object.keys(object2);
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(object2);
if (enumerableOnly)
symbols = symbols.filter(function(sym) {
return Object.getOwnPropertyDescriptor(object2, sym).enumerable;
});
keys2.push.apply(keys2, symbols);
}
return keys2;
}
function _objectSpread$1(target) {
for (var i2 = 1; i2 < arguments.length; i2++) {
var source = arguments[i2] != null ? arguments[i2] : {};
if (i2 % 2) {
ownKeys$1(Object(source), true).forEach(function(key2) {
_defineProperty$5(target, key2, source[key2]);
});
} else if (Object.getOwnPropertyDescriptors) {
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
} else {
ownKeys$1(Object(source)).forEach(function(key2) {
Object.defineProperty(target, key2, Object.getOwnPropertyDescriptor(source, key2));
});
}
}
return target;
}
function _defineProperty$5(obj, key2, value) {
if (key2 in obj) {
Object.defineProperty(obj, key2, { value, enumerable: true, configurable: true, writable: true });
} else {
obj[key2] = value;
}
return obj;
}
function defaultGetContainer() {
var container = document.createElement("div");
document.body.appendChild(container);
return container;
}
function getContainerRenderMixin(config) {
var _config$autoMount = config.autoMount, autoMount = _config$autoMount === void 0 ? true : _config$autoMount, _config$autoDestroy = config.autoDestroy, autoDestroy = _config$autoDestroy === void 0 ? true : _config$autoDestroy, isVisible2 = config.isVisible, isForceRender = config.isForceRender, getComponent = config.getComponent, _config$getContainer = config.getContainer, getContainer2 = _config$getContainer === void 0 ? defaultGetContainer : _config$getContainer;
var mixin;
function _renderComponent(instance, componentArg, ready) {
if (!isVisible2 || instance._component || isVisible2(instance) || isForceRender && isForceRender(instance)) {
if (!instance._container) {
instance._container = getContainer2(instance);
}
var component;
if (instance.getComponent) {
component = instance.getComponent(componentArg);
} else {
component = getComponent(instance, componentArg);
}
_reactDom.default.unstable_renderSubtreeIntoContainer(instance, component, instance._container, function callback() {
instance._component = this;
if (ready) {
ready.call(this);
}
});
}
}
if (autoMount) {
mixin = _objectSpread$1(_objectSpread$1({}, mixin), {}, {
componentDidMount: function componentDidMount() {
_renderComponent(this);
},
componentDidUpdate: function componentDidUpdate() {
_renderComponent(this);
}
});
}
if (!autoMount || !autoDestroy) {
mixin = _objectSpread$1(_objectSpread$1({}, mixin), {}, {
renderComponent: function renderComponent(componentArg, ready) {
_renderComponent(this, componentArg, ready);
}
});
}
function _removeContainer(instance) {
if (instance._container) {
var container = instance._container;
_reactDom.default.unmountComponentAtNode(container);
container.parentNode.removeChild(container);
instance._container = null;
}
}
if (autoDestroy) {
mixin = _objectSpread$1(_objectSpread$1({}, mixin), {}, {
componentWillUnmount: function componentWillUnmount() {
_removeContainer(this);
}
});
} else {
mixin = _objectSpread$1(_objectSpread$1({}, mixin), {}, {
removeContainer: function removeContainer() {
_removeContainer(this);
}
});
}
return mixin;
}
function noop$1() {
}
function returnEmptyString() {
return "";
}
function returnDocument() {
return window.document;
}
var isMobile = typeof navigator !== "undefined" && !!navigator.userAgent.match(/(Android|iPhone|iPad|iPod|iOS|UCWEB)/i);
var ALL_HANDLERS = ["onClick", "onMouseDown", "onTouchStart", "onMouseEnter", "onMouseLeave", "onFocus", "onBlur"];
var Trigger = createReactClass({
displayName: "Trigger",
propTypes: {
children: propTypes.exports.any,
action: propTypes.exports.oneOfType([propTypes.exports.string, propTypes.exports.arrayOf(propTypes.exports.string)]),
showAction: propTypes.exports.any,
hideAction: propTypes.exports.any,
getPopupClassNameFromAlign: propTypes.exports.any,
onPopupVisibleChange: propTypes.exports.func,
afterPopupVisibleChange: propTypes.exports.func,
popup: propTypes.exports.oneOfType([propTypes.exports.node, propTypes.exports.func]).isRequired,
popupStyle: propTypes.exports.object,
prefixCls: propTypes.exports.string,
popupClassName: propTypes.exports.string,
popupPlacement: propTypes.exports.string,
builtinPlacements: propTypes.exports.object,
popupTransitionName: propTypes.exports.oneOfType([propTypes.exports.string, propTypes.exports.object]),
popupAnimation: propTypes.exports.any,
mouseEnterDelay: propTypes.exports.number,
mouseLeaveDelay: propTypes.exports.number,
zIndex: propTypes.exports.number,
focusDelay: propTypes.exports.number,
blurDelay: propTypes.exports.number,
getPopupContainer: propTypes.exports.func,
getDocument: propTypes.exports.func,
destroyPopupOnHide: propTypes.exports.bool,
mask: propTypes.exports.bool,
maskClosable: propTypes.exports.bool,
onPopupAlign: propTypes.exports.func,
popupAlign: propTypes.exports.object,
popupVisible: propTypes.exports.bool,
maskTransitionName: propTypes.exports.oneOfType([propTypes.exports.string, propTypes.exports.object]),
maskAnimation: propTypes.exports.string
},
mixins: [_default$9({
autoMount: false,
isVisible: function isVisible2(instance) {
return instance.state.popupVisible;
},
getContainer: function getContainer2(instance) {
var props = instance.props;
var popupContainer = document.createElement("div");
popupContainer.style.position = "absolute";
popupContainer.style.top = "0";
popupContainer.style.left = "0";
popupContainer.style.width = "100%";
var mountNode = props.getPopupContainer ? props.getPopupContainer(ReactDOM2.findDOMNode(instance)) : props.getDocument().body;
mountNode.appendChild(popupContainer);
return popupContainer;
}
})],
getDefaultProps: function getDefaultProps() {
return {
prefixCls: "rc-trigger-popup",
getPopupClassNameFromAlign: returnEmptyString,
getDocument: returnDocument,
onPopupVisibleChange: noop$1,
afterPopupVisibleChange: noop$1,
onPopupAlign: noop$1,
popupClassName: "",
mouseEnterDelay: 0,
mouseLeaveDelay: 0.1,
focusDelay: 0,
blurDelay: 0.15,
popupStyle: {},
destroyPopupOnHide: false,
popupAlign: {},
defaultPopupVisible: false,
mask: false,
maskClosable: true,
action: [],
showAction: [],
hideAction: []
};
},
getInitialState: function getInitialState() {
var props = this.props;
var popupVisible = void 0;
if ("popupVisible" in props) {
popupVisible = !!props.popupVisible;
} else {
popupVisible = !!props.defaultPopupVisible;
}
return {
popupVisible
};
},
componentWillMount: function componentWillMount() {
var _this2 = this;
ALL_HANDLERS.forEach(function(h2) {
_this2["fire" + h2] = function(e2) {
_this2.fireEvents(h2, e2);
};
});
},
componentDidMount: function componentDidMount() {
this.componentDidUpdate({}, {
popupVisible: this.state.popupVisible
});
},
componentWillReceiveProps: function componentWillReceiveProps(_ref) {
var popupVisible = _ref.popupVisible;
if (popupVisible !== void 0) {
this.setState({
popupVisible
});
}
},
componentDidUpdate: function componentDidUpdate(_, prevState) {
var props = this.props;
var state = this.state;
this.renderComponent(null, function() {
if (prevState.popupVisible !== state.popupVisible) {
props.afterPopupVisibleChange(state.popupVisible);
}
});
if (state.popupVisible) {
var currentDocument = void 0;
if (!this.clickOutsideHandler && this.isClickToHide()) {
currentDocument = props.getDocument();
this.clickOutsideHandler = _default$h(currentDocument, "mousedown", this.onDocumentClick);
}
if (!this.touchOutsideHandler && isMobile) {
currentDocument = currentDocument || props.getDocument();
this.touchOutsideHandler = _default$h(currentDocument, "click", this.onDocumentClick);
}
return;
}
this.clearOutsideHandler();
},
componentWillUnmount: function componentWillUnmount() {
this.clearDelayTimer();
this.clearOutsideHandler();
},
onMouseEnter: function onMouseEnter(e2) {
this.fireEvents("onMouseEnter", e2);
this.delaySetPopupVisible(true, this.props.mouseEnterDelay);
},
onMouseLeave: function onMouseLeave(e2) {
this.fireEvents("onMouseLeave", e2);
this.delaySetPopupVisible(false, this.props.mouseLeaveDelay);
},
onPopupMouseEnter: function onPopupMouseEnter() {
this.clearDelayTimer();
},
onPopupMouseLeave: function onPopupMouseLeave(e2) {
if (e2.relatedTarget && !e2.relatedTarget.setTimeout && this._component && this._component.getPopupDomNode && contains$1(this._component.getPopupDomNode(), e2.relatedTarget)) {
return;
}
this.delaySetPopupVisible(false, this.props.mouseLeaveDelay);
},
onFocus: function onFocus(e2) {
this.fireEvents("onFocus", e2);
this.clearDelayTimer();
if (this.isFocusToShow()) {
this.focusTime = Date.now();
this.delaySetPopupVisible(true, this.props.focusDelay);
}
},
onMouseDown: function onMouseDown(e2) {
this.fireEvents("onMouseDown", e2);
this.preClickTime = Date.now();
},
onTouchStart: function onTouchStart(e2) {
this.fireEvents("onTouchStart", e2);
this.preTouchTime = Date.now();
},
onBlur: function onBlur(e2) {
this.fireEvents("onBlur", e2);
this.clearDelayTimer();
if (this.isBlurToHide()) {
this.delaySetPopupVisible(false, this.props.blurDelay);
}
},
onClick: function onClick(event) {
this.fireEvents("onClick", event);
if (this.focusTime) {
var preTime = void 0;
if (this.preClickTime && this.preTouchTime) {
preTime = Math.min(this.preClickTime, this.preTouchTime);
} else if (this.preClickTime) {
preTime = this.preClickTime;
} else if (this.preTouchTime) {
preTime = this.preTouchTime;
}
if (Math.abs(preTime - this.focusTime) < 20) {
return;
}
this.focusTime = 0;
}
this.preClickTime = 0;
this.preTouchTime = 0;
event.preventDefault();
var nextVisible = !this.state.popupVisible;
if (this.isClickToHide() && !nextVisible || nextVisible && this.isClickToShow()) {
this.setPopupVisible(!this.state.popupVisible);
}
},
onDocumentClick: function onDocumentClick(event) {
if (this.props.mask && !this.props.maskClosable) {
return;
}
var target = event.target;
var root2 = ReactDOM2.findDOMNode(this);
var popupNode = this.getPopupDomNode();
if (!contains$1(root2, target) && !contains$1(popupNode, target)) {
this.close();
}
},
getPopupDomNode: function getPopupDomNode() {
if (this._component && this._component.getPopupDomNode) {
return this._component.getPopupDomNode();
}
return null;
},
getRootDomNode: function getRootDomNode() {
return ReactDOM2.findDOMNode(this);
},
getPopupClassNameFromAlign: function getPopupClassNameFromAlign$1(align) {
var className = [];
var props = this.props;
var popupPlacement = props.popupPlacement, builtinPlacements = props.builtinPlacements, prefixCls = props.prefixCls;
if (popupPlacement && builtinPlacements) {
className.push(getPopupClassNameFromAlign(builtinPlacements, prefixCls, align));
}
if (props.getPopupClassNameFromAlign) {
className.push(props.getPopupClassNameFromAlign(align));
}
return className.join(" ");
},
getPopupAlign: function getPopupAlign() {
var props = this.props;
var popupPlacement = props.popupPlacement, popupAlign = props.popupAlign, builtinPlacements = props.builtinPlacements;
if (popupPlacement && builtinPlacements) {
return getAlignFromPlacement(builtinPlacements, popupPlacement, popupAlign);
}
return popupAlign;
},
getComponent: function getComponent() {
var props = this.props, state = this.state;
var mouseProps = {};
if (this.isMouseEnterToShow()) {
mouseProps.onMouseEnter = this.onPopupMouseEnter;
}
if (this.isMouseLeaveToHide()) {
mouseProps.onMouseLeave = this.onPopupMouseLeave;
}
return /* @__PURE__ */ jsx(Popup, {
prefixCls: props.prefixCls,
destroyPopupOnHide: props.destroyPopupOnHide,
visible: state.popupVisible,
className: props.popupClassName,
action: props.action,
align: this.getPopupAlign(),
onAlign: props.onPopupAlign,
animation: props.popupAnimation,
getClassNameFromAlign: this.getPopupClassNameFromAlign,
...mouseProps,
getRootDomNode: this.getRootDomNode,
style: props.popupStyle,
mask: props.mask,
zIndex: props.zIndex,
transitionName: props.popupTransitionName,
maskAnimation: props.maskAnimation,
maskTransitionName: props.maskTransitionName,
children: typeof props.popup === "function" ? props.popup() : props.popup
});
},
setPopupVisible: function setPopupVisible(popupVisible) {
this.clearDelayTimer();
if (this.state.popupVisible !== popupVisible) {
if (!("popupVisible" in this.props)) {
this.setState({
popupVisible
});
}
this.props.onPopupVisibleChange(popupVisible);
}
},
delaySetPopupVisible: function delaySetPopupVisible(visible, delayS) {
var _this2 = this;
var delay = delayS * 1e3;
this.clearDelayTimer();
if (delay) {
this.delayTimer = setTimeout(function() {
_this2.setPopupVisible(visible);
_this2.clearDelayTimer();
}, delay);
} else {
this.setPopupVisible(visible);
}
},
clearDelayTimer: function clearDelayTimer() {
if (this.delayTimer) {
clearTimeout(this.delayTimer);
this.delayTimer = null;
}
},
clearOutsideHandler: function clearOutsideHandler() {
if (this.clickOutsideHandler) {
this.clickOutsideHandler.remove();
this.clickOutsideHandler = null;
}
if (this.touchOutsideHandler) {
this.touchOutsideHandler.remove();
this.touchOutsideHandler = null;
}
},
createTwoChains: function createTwoChains(event) {
var childPros = this.props.children.props;
var props = this.props;
if (childPros[event] && props[event]) {
return this["fire" + event];
}
return childPros[event] || props[event];
},
isClickToShow: function isClickToShow() {
var _props = this.props, action = _props.action, showAction = _props.showAction;
return action.indexOf("click") !== -1 || showAction.indexOf("click") !== -1;
},
isClickToHide: function isClickToHide() {
var _props2 = this.props, action = _props2.action, hideAction = _props2.hideAction;
return action.indexOf("click") !== -1 || hideAction.indexOf("click") !== -1;
},
isMouseEnterToShow: function isMouseEnterToShow() {
var _props3 = this.props, action = _props3.action, showAction = _props3.showAction;
return action.indexOf("hover") !== -1 || showAction.indexOf("mouseEnter") !== -1;
},
isMouseLeaveToHide: function isMouseLeaveToHide() {
var _props4 = this.props, action = _props4.action, hideAction = _props4.hideAction;
return action.indexOf("hover") !== -1 || hideAction.indexOf("mouseLeave") !== -1;
},
isFocusToShow: function isFocusToShow() {
var _props5 = this.props, action = _props5.action, showAction = _props5.showAction;
return action.indexOf("focus") !== -1 || showAction.indexOf("focus") !== -1;
},
isBlurToHide: function isBlurToHide() {
var _props6 = this.props, action = _props6.action, hideAction = _props6.hideAction;
return action.indexOf("focus") !== -1 || hideAction.indexOf("blur") !== -1;
},
forcePopupAlign: function forcePopupAlign() {
if (this.state.popupVisible && this._component && this._component.alignInstance) {
this._component.alignInstance.forceAlign();
}
},
fireEvents: function fireEvents(type2, e2) {
var childCallback = this.props.children.props[type2];
if (childCallback) {
childCallback(e2);
}
var callback = this.props[type2];
if (callback) {
callback(e2);
}
},
close: function close() {
this.setPopupVisible(false);
},
render: function render2() {
var props = this.props;
var children = props.children;
var child = React__default.default.Children.only(children);
var newChildProps = {};
if (this.isClickToHide() || this.isClickToShow()) {
newChildProps.onClick = this.onClick;
newChildProps.onMouseDown = this.onMouseDown;
newChildProps.onTouchStart = this.onTouchStart;
} else {
newChildProps.onClick = this.createTwoChains("onClick");
newChildProps.onMouseDown = this.createTwoChains("onMouseDown");
newChildProps.onTouchStart = this.createTwoChains("onTouchStart");
}
if (this.isMouseEnterToShow()) {
newChildProps.onMouseEnter = this.onMouseEnter;
} else {
newChildProps.onMouseEnter = this.createTwoChains("onMouseEnter");
}
if (this.isMouseLeaveToHide()) {
newChildProps.onMouseLeave = this.onMouseLeave;
} else {
newChildProps.onMouseLeave = this.createTwoChains("onMouseLeave");
}
if (this.isFocusToShow() || this.isBlurToHide()) {
newChildProps.onFocus = this.onFocus;
newChildProps.onBlur = this.onBlur;
} else {
newChildProps.onFocus = this.createTwoChains("onFocus");
newChildProps.onBlur = this.createTwoChains("onBlur");
}
return React__default.default.cloneElement(child, newChildProps);
}
});
const es = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
default: Trigger
}, Symbol.toStringTag, { value: "Module" }));
const require$$3$1 = /* @__PURE__ */ getAugmentedNamespace(es);
var Panel$1 = { exports: {} };
var color = { exports: {} };
var tinycolor = { exports: {} };
(function(module2, exports2) {
(function(global2, factory2) {
module2.exports = factory2();
})(commonjsGlobal, function() {
function _typeof4(obj) {
"@babel/helpers - typeof";
return _typeof4 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof4(obj);
}
var trimLeft = /^\s+/;
var trimRight = /\s+$/;
function tinycolor2(color2, opts) {
color2 = color2 ? color2 : "";
opts = opts || {};
if (color2 instanceof tinycolor2) {
return color2;
}
if (!(this instanceof tinycolor2)) {
return new tinycolor2(color2, opts);
}
var rgb = inputToRGB2(color2);
this._originalInput = color2, this._r = rgb.r, this._g = rgb.g, this._b = rgb.b, this._a = rgb.a, this._roundA = Math.round(100 * this._a) / 100, this._format = opts.format || rgb.format;
this._gradientType = opts.gradientType;
if (this._r < 1)
this._r = Math.round(this._r);
if (this._g < 1)
this._g = Math.round(this._g);
if (this._b < 1)
this._b = Math.round(this._b);
this._ok = rgb.ok;
}
tinycolor2.prototype = {
isDark: function isDark() {
return this.getBrightness() < 128;
},
isLight: function isLight() {
return !this.isDark();
},
isValid: function isValid() {
return this._ok;
},
getOriginalInput: function getOriginalInput() {
return this._originalInput;
},
getFormat: function getFormat2() {
return this._format;
},
getAlpha: function getAlpha() {
return this._a;
},
getBrightness: function getBrightness() {
var rgb = this.toRgb();
return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1e3;
},
getLuminance: function getLuminance() {
var rgb = this.toRgb();
var RsRGB, GsRGB, BsRGB, R, G, B;
RsRGB = rgb.r / 255;
GsRGB = rgb.g / 255;
BsRGB = rgb.b / 255;
if (RsRGB <= 0.03928)
R = RsRGB / 12.92;
else
R = Math.pow((RsRGB + 0.055) / 1.055, 2.4);
if (GsRGB <= 0.03928)
G = GsRGB / 12.92;
else
G = Math.pow((GsRGB + 0.055) / 1.055, 2.4);
if (BsRGB <= 0.03928)
B = BsRGB / 12.92;
else
B = Math.pow((BsRGB + 0.055) / 1.055, 2.4);
return 0.2126 * R + 0.7152 * G + 0.0722 * B;
},
setAlpha: function setAlpha(value) {
this._a = boundAlpha2(value);
this._roundA = Math.round(100 * this._a) / 100;
return this;
},
toHsv: function toHsv2() {
var hsv = rgbToHsv2(this._r, this._g, this._b);
return {
h: hsv.h * 360,
s: hsv.s,
v: hsv.v,
a: this._a
};
},
toHsvString: function toHsvString() {
var hsv = rgbToHsv2(this._r, this._g, this._b);
var h2 = Math.round(hsv.h * 360), s = Math.round(hsv.s * 100), v2 = Math.round(hsv.v * 100);
return this._a == 1 ? "hsv(" + h2 + ", " + s + "%, " + v2 + "%)" : "hsva(" + h2 + ", " + s + "%, " + v2 + "%, " + this._roundA + ")";
},
toHsl: function toHsl() {
var hsl = rgbToHsl2(this._r, this._g, this._b);
return {
h: hsl.h * 360,
s: hsl.s,
l: hsl.l,
a: this._a
};
},
toHslString: function toHslString() {
var hsl = rgbToHsl2(this._r, this._g, this._b);
var h2 = Math.round(hsl.h * 360), s = Math.round(hsl.s * 100), l2 = Math.round(hsl.l * 100);
return this._a == 1 ? "hsl(" + h2 + ", " + s + "%, " + l2 + "%)" : "hsla(" + h2 + ", " + s + "%, " + l2 + "%, " + this._roundA + ")";
},
toHex: function toHex2(allow3Char) {
return rgbToHex2(this._r, this._g, this._b, allow3Char);
},
toHexString: function toHexString(allow3Char) {
return "#" + this.toHex(allow3Char);
},
toHex8: function toHex8(allow4Char) {
return rgbaToHex2(this._r, this._g, this._b, this._a, allow4Char);
},
toHex8String: function toHex8String(allow4Char) {
return "#" + this.toHex8(allow4Char);
},
toRgb: function toRgb() {
return {
r: Math.round(this._r),
g: Math.round(this._g),
b: Math.round(this._b),
a: this._a
};
},
toRgbString: function toRgbString() {
return this._a == 1 ? "rgb(" + Math.round(this._r) + ", " + Math.round(this._g) + ", " + Math.round(this._b) + ")" : "rgba(" + Math.round(this._r) + ", " + Math.round(this._g) + ", " + Math.round(this._b) + ", " + this._roundA + ")";
},
toPercentageRgb: function toPercentageRgb() {
return {
r: Math.round(bound012(this._r, 255) * 100) + "%",
g: Math.round(bound012(this._g, 255) * 100) + "%",
b: Math.round(bound012(this._b, 255) * 100) + "%",
a: this._a
};
},
toPercentageRgbString: function toPercentageRgbString() {
return this._a == 1 ? "rgb(" + Math.round(bound012(this._r, 255) * 100) + "%, " + Math.round(bound012(this._g, 255) * 100) + "%, " + Math.round(bound012(this._b, 255) * 100) + "%)" : "rgba(" + Math.round(bound012(this._r, 255) * 100) + "%, " + Math.round(bound012(this._g, 255) * 100) + "%, " + Math.round(bound012(this._b, 255) * 100) + "%, " + this._roundA + ")";
},
toName: function toName() {
if (this._a === 0) {
return "transparent";
}
if (this._a < 1) {
return false;
}
return hexNames[rgbToHex2(this._r, this._g, this._b, true)] || false;
},
toFilter: function toFilter(secondColor) {
var hex8String = "#" + rgbaToArgbHex(this._r, this._g, this._b, this._a);
var secondHex8String = hex8String;
var gradientType = this._gradientType ? "GradientType = 1, " : "";
if (secondColor) {
var s = tinycolor2(secondColor);
secondHex8String = "#" + rgbaToArgbHex(s._r, s._g, s._b, s._a);
}
return "progid:DXImageTransform.Microsoft.gradient(" + gradientType + "startColorstr=" + hex8String + ",endColorstr=" + secondHex8String + ")";
},
toString: function toString2(format2) {
var formatSet = !!format2;
format2 = format2 || this._format;
var formattedString = false;
var hasAlpha = this._a < 1 && this._a >= 0;
var needsAlphaFormat = !formatSet && hasAlpha && (format2 === "hex" || format2 === "hex6" || format2 === "hex3" || format2 === "hex4" || format2 === "hex8" || format2 === "name");
if (needsAlphaFormat) {
if (format2 === "name" && this._a === 0) {
return this.toName();
}
return this.toRgbString();
}
if (format2 === "rgb") {
formattedString = this.toRgbString();
}
if (format2 === "prgb") {
formattedString = this.toPercentageRgbString();
}
if (format2 === "hex" || format2 === "hex6") {
formattedString = this.toHexString();
}
if (format2 === "hex3") {
formattedString = this.toHexString(true);
}
if (format2 === "hex4") {
formattedString = this.toHex8String(true);
}
if (format2 === "hex8") {
formattedString = this.toHex8String();
}
if (format2 === "name") {
formattedString = this.toName();
}
if (format2 === "hsl") {
formattedString = this.toHslString();
}
if (format2 === "hsv") {
formattedString = this.toHsvString();
}
return formattedString || this.toHexString();
},
clone: function clone() {
return tinycolor2(this.toString());
},
_applyModification: function _applyModification(fn, args) {
var color2 = fn.apply(null, [this].concat([].slice.call(args)));
this._r = color2._r;
this._g = color2._g;
this._b = color2._b;
this.setAlpha(color2._a);
return this;
},
lighten: function lighten() {
return this._applyModification(_lighten, arguments);
},
brighten: function brighten() {
return this._applyModification(_brighten, arguments);
},
darken: function darken() {
return this._applyModification(_darken, arguments);
},
desaturate: function desaturate() {
return this._applyModification(_desaturate, arguments);
},
saturate: function saturate() {
return this._applyModification(_saturate, arguments);
},
greyscale: function greyscale() {
return this._applyModification(_greyscale, arguments);
},
spin: function spin() {
return this._applyModification(_spin, arguments);
},
_applyCombination: function _applyCombination(fn, args) {
return fn.apply(null, [this].concat([].slice.call(args)));
},
analogous: function analogous() {
return this._applyCombination(_analogous, arguments);
},
complement: function complement() {
return this._applyCombination(_complement, arguments);
},
monochromatic: function monochromatic() {
return this._applyCombination(_monochromatic, arguments);
},
splitcomplement: function splitcomplement() {
return this._applyCombination(_splitcomplement, arguments);
},
triad: function triad() {
return this._applyCombination(polyad, [3]);
},
tetrad: function tetrad() {
return this._applyCombination(polyad, [4]);
}
};
tinycolor2.fromRatio = function(color2, opts) {
if (_typeof4(color2) == "object") {
var newColor = {};
for (var i2 in color2) {
if (color2.hasOwnProperty(i2)) {
if (i2 === "a") {
newColor[i2] = color2[i2];
} else {
newColor[i2] = convertToPercentage2(color2[i2]);
}
}
}
color2 = newColor;
}
return tinycolor2(color2, opts);
};
function inputToRGB2(color2) {
var rgb = {
r: 0,
g: 0,
b: 0
};
var a = 1;
var s = null;
var v2 = null;
var l2 = null;
var ok = false;
var format2 = false;
if (typeof color2 == "string") {
color2 = stringInputToObject2(color2);
}
if (_typeof4(color2) == "object") {
if (isValidCSSUnit2(color2.r) && isValidCSSUnit2(color2.g) && isValidCSSUnit2(color2.b)) {
rgb = rgbToRgb2(color2.r, color2.g, color2.b);
ok = true;
format2 = String(color2.r).substr(-1) === "%" ? "prgb" : "rgb";
} else if (isValidCSSUnit2(color2.h) && isValidCSSUnit2(color2.s) && isValidCSSUnit2(color2.v)) {
s = convertToPercentage2(color2.s);
v2 = convertToPercentage2(color2.v);
rgb = hsvToRgb2(color2.h, s, v2);
ok = true;
format2 = "hsv";
} else if (isValidCSSUnit2(color2.h) && isValidCSSUnit2(color2.s) && isValidCSSUnit2(color2.l)) {
s = convertToPercentage2(color2.s);
l2 = convertToPercentage2(color2.l);
rgb = hslToRgb2(color2.h, s, l2);
ok = true;
format2 = "hsl";
}
if (color2.hasOwnProperty("a")) {
a = color2.a;
}
}
a = boundAlpha2(a);
return {
ok,
format: color2.format || format2,
r: Math.min(255, Math.max(rgb.r, 0)),
g: Math.min(255, Math.max(rgb.g, 0)),
b: Math.min(255, Math.max(rgb.b, 0)),
a
};
}
function rgbToRgb2(r2, g2, b2) {
return {
r: bound012(r2, 255) * 255,
g: bound012(g2, 255) * 255,
b: bound012(b2, 255) * 255
};
}
function rgbToHsl2(r2, g2, b2) {
r2 = bound012(r2, 255);
g2 = bound012(g2, 255);
b2 = bound012(b2, 255);
var max = Math.max(r2, g2, b2), min = Math.min(r2, g2, b2);
var h2, s, l2 = (max + min) / 2;
if (max == min) {
h2 = s = 0;
} else {
var d2 = max - min;
s = l2 > 0.5 ? d2 / (2 - max - min) : d2 / (max + min);
switch (max) {
case r2:
h2 = (g2 - b2) / d2 + (g2 < b2 ? 6 : 0);
break;
case g2:
h2 = (b2 - r2) / d2 + 2;
break;
case b2:
h2 = (r2 - g2) / d2 + 4;
break;
}
h2 /= 6;
}
return {
h: h2,
s,
l: l2
};
}
function hslToRgb2(h2, s, l2) {
var r2, g2, b2;
h2 = bound012(h2, 360);
s = bound012(s, 100);
l2 = bound012(l2, 100);
function hue2rgb2(p3, q3, t2) {
if (t2 < 0)
t2 += 1;
if (t2 > 1)
t2 -= 1;
if (t2 < 1 / 6)
return p3 + (q3 - p3) * 6 * t2;
if (t2 < 1 / 2)
return q3;
if (t2 < 2 / 3)
return p3 + (q3 - p3) * (2 / 3 - t2) * 6;
return p3;
}
if (s === 0) {
r2 = g2 = b2 = l2;
} else {
var q2 = l2 < 0.5 ? l2 * (1 + s) : l2 + s - l2 * s;
var p2 = 2 * l2 - q2;
r2 = hue2rgb2(p2, q2, h2 + 1 / 3);
g2 = hue2rgb2(p2, q2, h2);
b2 = hue2rgb2(p2, q2, h2 - 1 / 3);
}
return {
r: r2 * 255,
g: g2 * 255,
b: b2 * 255
};
}
function rgbToHsv2(r2, g2, b2) {
r2 = bound012(r2, 255);
g2 = bound012(g2, 255);
b2 = bound012(b2, 255);
var max = Math.max(r2, g2, b2), min = Math.min(r2, g2, b2);
var h2, s, v2 = max;
var d2 = max - min;
s = max === 0 ? 0 : d2 / max;
if (max == min) {
h2 = 0;
} else {
switch (max) {
case r2:
h2 = (g2 - b2) / d2 + (g2 < b2 ? 6 : 0);
break;
case g2:
h2 = (b2 - r2) / d2 + 2;
break;
case b2:
h2 = (r2 - g2) / d2 + 4;
break;
}
h2 /= 6;
}
return {
h: h2,
s,
v: v2
};
}
function hsvToRgb2(h2, s, v2) {
h2 = bound012(h2, 360) * 6;
s = bound012(s, 100);
v2 = bound012(v2, 100);
var i2 = Math.floor(h2), f2 = h2 - i2, p2 = v2 * (1 - s), q2 = v2 * (1 - f2 * s), t2 = v2 * (1 - (1 - f2) * s), mod = i2 % 6, r2 = [v2, q2, p2, p2, t2, v2][mod], g2 = [t2, v2, v2, q2, p2, p2][mod], b2 = [p2, p2, t2, v2, v2, q2][mod];
return {
r: r2 * 255,
g: g2 * 255,
b: b2 * 255
};
}
function rgbToHex2(r2, g2, b2, allow3Char) {
var hex = [pad22(Math.round(r2).toString(16)), pad22(Math.round(g2).toString(16)), pad22(Math.round(b2).toString(16))];
if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {
return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);
}
return hex.join("");
}
function rgbaToHex2(r2, g2, b2, a, allow4Char) {
var hex = [pad22(Math.round(r2).toString(16)), pad22(Math.round(g2).toString(16)), pad22(Math.round(b2).toString(16)), pad22(convertDecimalToHex2(a))];
if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) {
return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);
}
return hex.join("");
}
function rgbaToArgbHex(r2, g2, b2, a) {
var hex = [pad22(convertDecimalToHex2(a)), pad22(Math.round(r2).toString(16)), pad22(Math.round(g2).toString(16)), pad22(Math.round(b2).toString(16))];
return hex.join("");
}
tinycolor2.equals = function(color1, color2) {
if (!color1 || !color2)
return false;
return tinycolor2(color1).toRgbString() == tinycolor2(color2).toRgbString();
};
tinycolor2.random = function() {
return tinycolor2.fromRatio({
r: Math.random(),
g: Math.random(),
b: Math.random()
});
};
function _desaturate(color2, amount) {
amount = amount === 0 ? 0 : amount || 10;
var hsl = tinycolor2(color2).toHsl();
hsl.s -= amount / 100;
hsl.s = clamp012(hsl.s);
return tinycolor2(hsl);
}
function _saturate(color2, amount) {
amount = amount === 0 ? 0 : amount || 10;
var hsl = tinycolor2(color2).toHsl();
hsl.s += amount / 100;
hsl.s = clamp012(hsl.s);
return tinycolor2(hsl);
}
function _greyscale(color2) {
return tinycolor2(color2).desaturate(100);
}
function _lighten(color2, amount) {
amount = amount === 0 ? 0 : amount || 10;
var hsl = tinycolor2(color2).toHsl();
hsl.l += amount / 100;
hsl.l = clamp012(hsl.l);
return tinycolor2(hsl);
}
function _brighten(color2, amount) {
amount = amount === 0 ? 0 : amount || 10;
var rgb = tinycolor2(color2).toRgb();
rgb.r = Math.max(0, Math.min(255, rgb.r - Math.round(255 * -(amount / 100))));
rgb.g = Math.max(0, Math.min(255, rgb.g - Math.round(255 * -(amount / 100))));
rgb.b = Math.max(0, Math.min(255, rgb.b - Math.round(255 * -(amount / 100))));
return tinycolor2(rgb);
}
function _darken(color2, amount) {
amount = amount === 0 ? 0 : amount || 10;
var hsl = tinycolor2(color2).toHsl();
hsl.l -= amount / 100;
hsl.l = clamp012(hsl.l);
return tinycolor2(hsl);
}
function _spin(color2, amount) {
var hsl = tinycolor2(color2).toHsl();
var hue = (hsl.h + amount) % 360;
hsl.h = hue < 0 ? 360 + hue : hue;
return tinycolor2(hsl);
}
function _complement(color2) {
var hsl = tinycolor2(color2).toHsl();
hsl.h = (hsl.h + 180) % 360;
return tinycolor2(hsl);
}
function polyad(color2, number2) {
if (isNaN(number2) || number2 <= 0) {
throw new Error("Argument to polyad must be a positive number");
}
var hsl = tinycolor2(color2).toHsl();
var result = [tinycolor2(color2)];
var step2 = 360 / number2;
for (var i2 = 1; i2 < number2; i2++) {
result.push(tinycolor2({
h: (hsl.h + i2 * step2) % 360,
s: hsl.s,
l: hsl.l
}));
}
return result;
}
function _splitcomplement(color2) {
var hsl = tinycolor2(color2).toHsl();
var h2 = hsl.h;
return [tinycolor2(color2), tinycolor2({
h: (h2 + 72) % 360,
s: hsl.s,
l: hsl.l
}), tinycolor2({
h: (h2 + 216) % 360,
s: hsl.s,
l: hsl.l
})];
}
function _analogous(color2, results, slices) {
results = results || 6;
slices = slices || 30;
var hsl = tinycolor2(color2).toHsl();
var part = 360 / slices;
var ret = [tinycolor2(color2)];
for (hsl.h = (hsl.h - (part * results >> 1) + 720) % 360; --results; ) {
hsl.h = (hsl.h + part) % 360;
ret.push(tinycolor2(hsl));
}
return ret;
}
function _monochromatic(color2, results) {
results = results || 6;
var hsv = tinycolor2(color2).toHsv();
var h2 = hsv.h, s = hsv.s, v2 = hsv.v;
var ret = [];
var modification = 1 / results;
while (results--) {
ret.push(tinycolor2({
h: h2,
s,
v: v2
}));
v2 = (v2 + modification) % 1;
}
return ret;
}
tinycolor2.mix = function(color1, color2, amount) {
amount = amount === 0 ? 0 : amount || 50;
var rgb1 = tinycolor2(color1).toRgb();
var rgb2 = tinycolor2(color2).toRgb();
var p2 = amount / 100;
var rgba = {
r: (rgb2.r - rgb1.r) * p2 + rgb1.r,
g: (rgb2.g - rgb1.g) * p2 + rgb1.g,
b: (rgb2.b - rgb1.b) * p2 + rgb1.b,
a: (rgb2.a - rgb1.a) * p2 + rgb1.a
};
return tinycolor2(rgba);
};
tinycolor2.readability = function(color1, color2) {
var c1 = tinycolor2(color1);
var c2 = tinycolor2(color2);
return (Math.max(c1.getLuminance(), c2.getLuminance()) + 0.05) / (Math.min(c1.getLuminance(), c2.getLuminance()) + 0.05);
};
tinycolor2.isReadable = function(color1, color2, wcag2) {
var readability = tinycolor2.readability(color1, color2);
var wcag2Parms, out;
out = false;
wcag2Parms = validateWCAG2Parms(wcag2);
switch (wcag2Parms.level + wcag2Parms.size) {
case "AAsmall":
case "AAAlarge":
out = readability >= 4.5;
break;
case "AAlarge":
out = readability >= 3;
break;
case "AAAsmall":
out = readability >= 7;
break;
}
return out;
};
tinycolor2.mostReadable = function(baseColor, colorList, args) {
var bestColor = null;
var bestScore = 0;
var readability;
var includeFallbackColors, level, size;
args = args || {};
includeFallbackColors = args.includeFallbackColors;
level = args.level;
size = args.size;
for (var i2 = 0; i2 < colorList.length; i2++) {
readability = tinycolor2.readability(baseColor, colorList[i2]);
if (readability > bestScore) {
bestScore = readability;
bestColor = tinycolor2(colorList[i2]);
}
}
if (tinycolor2.isReadable(baseColor, bestColor, {
level,
size
}) || !includeFallbackColors) {
return bestColor;
} else {
args.includeFallbackColors = false;
return tinycolor2.mostReadable(baseColor, ["#fff", "#000"], args);
}
};
var names2 = tinycolor2.names = {
aliceblue: "f0f8ff",
antiquewhite: "faebd7",
aqua: "0ff",
aquamarine: "7fffd4",
azure: "f0ffff",
beige: "f5f5dc",
bisque: "ffe4c4",
black: "000",
blanchedalmond: "ffebcd",
blue: "00f",
blueviolet: "8a2be2",
brown: "a52a2a",
burlywood: "deb887",
burntsienna: "ea7e5d",
cadetblue: "5f9ea0",
chartreuse: "7fff00",
chocolate: "d2691e",
coral: "ff7f50",
cornflowerblue: "6495ed",
cornsilk: "fff8dc",
crimson: "dc143c",
cyan: "0ff",
darkblue: "00008b",
darkcyan: "008b8b",
darkgoldenrod: "b8860b",
darkgray: "a9a9a9",
darkgreen: "006400",
darkgrey: "a9a9a9",
darkkhaki: "bdb76b",
darkmagenta: "8b008b",
darkolivegreen: "556b2f",
darkorange: "ff8c00",
darkorchid: "9932cc",
darkred: "8b0000",
darksalmon: "e9967a",
darkseagreen: "8fbc8f",
darkslateblue: "483d8b",
darkslategray: "2f4f4f",
darkslategrey: "2f4f4f",
darkturquoise: "00ced1",
darkviolet: "9400d3",
deeppink: "ff1493",
deepskyblue: "00bfff",
dimgray: "696969",
dimgrey: "696969",
dodgerblue: "1e90ff",
firebrick: "b22222",
floralwhite: "fffaf0",
forestgreen: "228b22",
fuchsia: "f0f",
gainsboro: "dcdcdc",
ghostwhite: "f8f8ff",
gold: "ffd700",
goldenrod: "daa520",
gray: "808080",
green: "008000",
greenyellow: "adff2f",
grey: "808080",
honeydew: "f0fff0",
hotpink: "ff69b4",
indianred: "cd5c5c",
indigo: "4b0082",
ivory: "fffff0",
khaki: "f0e68c",
lavender: "e6e6fa",
lavenderblush: "fff0f5",
lawngreen: "7cfc00",
lemonchiffon: "fffacd",
lightblue: "add8e6",
lightcoral: "f08080",
lightcyan: "e0ffff",
lightgoldenrodyellow: "fafad2",
lightgray: "d3d3d3",
lightgreen: "90ee90",
lightgrey: "d3d3d3",
lightpink: "ffb6c1",
lightsalmon: "ffa07a",
lightseagreen: "20b2aa",
lightskyblue: "87cefa",
lightslategray: "789",
lightslategrey: "789",
lightsteelblue: "b0c4de",
lightyellow: "ffffe0",
lime: "0f0",
limegreen: "32cd32",
linen: "faf0e6",
magenta: "f0f",
maroon: "800000",
mediumaquamarine: "66cdaa",
mediumblue: "0000cd",
mediumorchid: "ba55d3",
mediumpurple: "9370db",
mediumseagreen: "3cb371",
mediumslateblue: "7b68ee",
mediumspringgreen: "00fa9a",
mediumturquoise: "48d1cc",
mediumvioletred: "c71585",
midnightblue: "191970",
mintcream: "f5fffa",
mistyrose: "ffe4e1",
moccasin: "ffe4b5",
navajowhite: "ffdead",
navy: "000080",
oldlace: "fdf5e6",
olive: "808000",
olivedrab: "6b8e23",
orange: "ffa500",
orangered: "ff4500",
orchid: "da70d6",
palegoldenrod: "eee8aa",
palegreen: "98fb98",
paleturquoise: "afeeee",
palevioletred: "db7093",
papayawhip: "ffefd5",
peachpuff: "ffdab9",
peru: "cd853f",
pink: "ffc0cb",
plum: "dda0dd",
powderblue: "b0e0e6",
purple: "800080",
rebeccapurple: "663399",
red: "f00",
rosybrown: "bc8f8f",
royalblue: "4169e1",
saddlebrown: "8b4513",
salmon: "fa8072",
sandybrown: "f4a460",
seagreen: "2e8b57",
seashell: "fff5ee",
sienna: "a0522d",
silver: "c0c0c0",
skyblue: "87ceeb",
slateblue: "6a5acd",
slategray: "708090",
slategrey: "708090",
snow: "fffafa",
springgreen: "00ff7f",
steelblue: "4682b4",
tan: "d2b48c",
teal: "008080",
thistle: "d8bfd8",
tomato: "ff6347",
turquoise: "40e0d0",
violet: "ee82ee",
wheat: "f5deb3",
white: "fff",
whitesmoke: "f5f5f5",
yellow: "ff0",
yellowgreen: "9acd32"
};
var hexNames = tinycolor2.hexNames = flip2(names2);
function flip2(o) {
var flipped = {};
for (var i2 in o) {
if (o.hasOwnProperty(i2)) {
flipped[o[i2]] = i2;
}
}
return flipped;
}
function boundAlpha2(a) {
a = parseFloat(a);
if (isNaN(a) || a < 0 || a > 1) {
a = 1;
}
return a;
}
function bound012(n2, max) {
if (isOnePointZero2(n2))
n2 = "100%";
var processPercent = isPercentage2(n2);
n2 = Math.min(max, Math.max(0, parseFloat(n2)));
if (processPercent) {
n2 = parseInt(n2 * max, 10) / 100;
}
if (Math.abs(n2 - max) < 1e-6) {
return 1;
}
return n2 % max / parseFloat(max);
}
function clamp012(val) {
return Math.min(1, Math.max(0, val));
}
function parseIntFromHex2(val) {
return parseInt(val, 16);
}
function isOnePointZero2(n2) {
return typeof n2 == "string" && n2.indexOf(".") != -1 && parseFloat(n2) === 1;
}
function isPercentage2(n2) {
return typeof n2 === "string" && n2.indexOf("%") != -1;
}
function pad22(c2) {
return c2.length == 1 ? "0" + c2 : "" + c2;
}
function convertToPercentage2(n2) {
if (n2 <= 1) {
n2 = n2 * 100 + "%";
}
return n2;
}
function convertDecimalToHex2(d2) {
return Math.round(parseFloat(d2) * 255).toString(16);
}
function convertHexToDecimal2(h2) {
return parseIntFromHex2(h2) / 255;
}
var matchers2 = function() {
var CSS_INTEGER2 = "[-\\+]?\\d+%?";
var CSS_NUMBER2 = "[-\\+]?\\d*\\.\\d+%?";
var CSS_UNIT2 = "(?:" + CSS_NUMBER2 + ")|(?:" + CSS_INTEGER2 + ")";
var PERMISSIVE_MATCH32 = "[\\s|\\(]+(" + CSS_UNIT2 + ")[,|\\s]+(" + CSS_UNIT2 + ")[,|\\s]+(" + CSS_UNIT2 + ")\\s*\\)?";
var PERMISSIVE_MATCH42 = "[\\s|\\(]+(" + CSS_UNIT2 + ")[,|\\s]+(" + CSS_UNIT2 + ")[,|\\s]+(" + CSS_UNIT2 + ")[,|\\s]+(" + CSS_UNIT2 + ")\\s*\\)?";
return {
CSS_UNIT: new RegExp(CSS_UNIT2),
rgb: new RegExp("rgb" + PERMISSIVE_MATCH32),
rgba: new RegExp("rgba" + PERMISSIVE_MATCH42),
hsl: new RegExp("hsl" + PERMISSIVE_MATCH32),
hsla: new RegExp("hsla" + PERMISSIVE_MATCH42),
hsv: new RegExp("hsv" + PERMISSIVE_MATCH32),
hsva: new RegExp("hsva" + PERMISSIVE_MATCH42),
hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,
hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/
};
}();
function isValidCSSUnit2(color2) {
return !!matchers2.CSS_UNIT.exec(color2);
}
function stringInputToObject2(color2) {
color2 = color2.replace(trimLeft, "").replace(trimRight, "").toLowerCase();
var named = false;
if (names2[color2]) {
color2 = names2[color2];
named = true;
} else if (color2 == "transparent") {
return {
r: 0,
g: 0,
b: 0,
a: 0,
format: "name"
};
}
var match2;
if (match2 = matchers2.rgb.exec(color2)) {
return {
r: match2[1],
g: match2[2],
b: match2[3]
};
}
if (match2 = matchers2.rgba.exec(color2)) {
return {
r: match2[1],
g: match2[2],
b: match2[3],
a: match2[4]
};
}
if (match2 = matchers2.hsl.exec(color2)) {
return {
h: match2[1],
s: match2[2],
l: match2[3]
};
}
if (match2 = matchers2.hsla.exec(color2)) {
return {
h: match2[1],
s: match2[2],
l: match2[3],
a: match2[4]
};
}
if (match2 = matchers2.hsv.exec(color2)) {
return {
h: match2[1],
s: match2[2],
v: match2[3]
};
}
if (match2 = matchers2.hsva.exec(color2)) {
return {
h: match2[1],
s: match2[2],
v: match2[3],
a: match2[4]
};
}
if (match2 = matchers2.hex8.exec(color2)) {
return {
r: parseIntFromHex2(match2[1]),
g: parseIntFromHex2(match2[2]),
b: parseIntFromHex2(match2[3]),
a: convertHexToDecimal2(match2[4]),
format: named ? "name" : "hex8"
};
}
if (match2 = matchers2.hex6.exec(color2)) {
return {
r: parseIntFromHex2(match2[1]),
g: parseIntFromHex2(match2[2]),
b: parseIntFromHex2(match2[3]),
format: named ? "name" : "hex"
};
}
if (match2 = matchers2.hex4.exec(color2)) {
return {
r: parseIntFromHex2(match2[1] + "" + match2[1]),
g: parseIntFromHex2(match2[2] + "" + match2[2]),
b: parseIntFromHex2(match2[3] + "" + match2[3]),
a: convertHexToDecimal2(match2[4] + "" + match2[4]),
format: named ? "name" : "hex8"
};
}
if (match2 = matchers2.hex3.exec(color2)) {
return {
r: parseIntFromHex2(match2[1] + "" + match2[1]),
g: parseIntFromHex2(match2[2] + "" + match2[2]),
b: parseIntFromHex2(match2[3] + "" + match2[3]),
format: named ? "name" : "hex"
};
}
return false;
}
function validateWCAG2Parms(parms) {
var level, size;
parms = parms || {
level: "AA",
size: "small"
};
level = (parms.level || "AA").toUpperCase();
size = (parms.size || "small").toLowerCase();
if (level !== "AA" && level !== "AAA") {
level = "AA";
}
if (size !== "small" && size !== "large") {
size = "small";
}
return {
level,
size
};
}
return tinycolor2;
});
})(tinycolor);
(function(module2, exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
var _extends2 = Object.assign || function(target) {
for (var i2 = 1; i2 < arguments.length; i2++) {
var source = arguments[i2];
for (var key2 in source) {
if (Object.prototype.hasOwnProperty.call(source, key2)) {
target[key2] = source[key2];
}
}
}
return target;
};
var _createClass2 = function() {
function defineProperties(target, props) {
for (var i2 = 0; i2 < props.length; i2++) {
var descriptor2 = props[i2];
descriptor2.enumerable = descriptor2.enumerable || false;
descriptor2.configurable = true;
if ("value" in descriptor2)
descriptor2.writable = true;
Object.defineProperty(target, descriptor2.key, descriptor2);
}
}
return function(Constructor, protoProps, staticProps) {
if (protoProps)
defineProperties(Constructor.prototype, protoProps);
if (staticProps)
defineProperties(Constructor, staticProps);
return Constructor;
};
}();
var _tinycolor = tinycolor.exports;
var _tinycolor2 = _interopRequireDefault2(_tinycolor);
function _interopRequireDefault2(obj) {
return obj && obj.__esModule ? obj : { "default": obj };
}
function _classCallCheck2(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
var Color2 = function() {
function Color3(input) {
var _this2 = this;
_classCallCheck2(this, Color3);
this.initRgb = function() {
var _color$toRgb = _this2.color.toRgb(), r2 = _color$toRgb.r, g2 = _color$toRgb.g, b2 = _color$toRgb.b;
_this2.redValue = r2;
_this2.greenValue = g2;
_this2.blueValue = b2;
};
this.initHsb = function() {
var _color$toHsv = _this2.color.toHsv(), h2 = _color$toHsv.h, s = _color$toHsv.s, v2 = _color$toHsv.v;
_this2.hueValue = h2;
_this2.saturationValue = s;
_this2.brightnessValue = v2;
};
this.toHexString = function() {
return _this2.color.toHexString();
};
this.toRgbString = function() {
return _this2.color.toRgbString();
};
this.color = (0, _tinycolor2["default"])(input);
this.initRgb();
this.initHsb();
var initAlpha = input && input.alpha || this.color.toRgb().a;
this.alphaValue = Math.min(1, initAlpha) * 100;
}
Color3.isValidHex = function isValidHex(hex) {
return (0, _tinycolor2["default"])(hex).isValid();
};
_createClass2(Color3, [{
key: "hex",
get: function get2() {
return this.color.toHex();
}
}, {
key: "hue",
set: function set2(value) {
this.color = (0, _tinycolor2["default"])({
h: value,
s: this.saturation,
v: this.brightness
});
this.initRgb();
this.hueValue = value;
},
get: function get2() {
return this.hueValue;
}
}, {
key: "saturation",
set: function set2(value) {
this.color = (0, _tinycolor2["default"])({
h: this.hue,
s: value,
v: this.brightness
});
this.initRgb();
this.saturationValue = value;
},
get: function get2() {
return this.saturationValue;
}
}, {
key: "lightness",
set: function set2(value) {
this.color = (0, _tinycolor2["default"])({
h: this.hue,
s: this.saturation,
l: value
});
this.initRgb();
this.lightnessValue = value;
},
get: function get2() {
return this.lightnessValue;
}
}, {
key: "brightness",
set: function set2(value) {
this.color = (0, _tinycolor2["default"])({
h: this.hue,
s: this.saturation,
v: value
});
this.initRgb();
this.brightnessValue = value;
},
get: function get2() {
return this.brightnessValue;
}
}, {
key: "red",
set: function set2(value) {
var rgb = this.color.toRgb();
this.color = (0, _tinycolor2["default"])(_extends2({}, rgb, {
r: value
}));
this.initHsb();
this.redValue = value;
},
get: function get2() {
return this.redValue;
}
}, {
key: "green",
set: function set2(value) {
var rgb = this.color.toRgb();
this.color = (0, _tinycolor2["default"])(_extends2({}, rgb, {
g: value
}));
this.initHsb();
this.greenValue = value;
},
get: function get2() {
return this.greenValue;
}
}, {
key: "blue",
set: function set2(value) {
var rgb = this.color.toRgb();
this.color = (0, _tinycolor2["default"])(_extends2({}, rgb, {
b: value
}));
this.initHsb();
this.blueValue = value;
},
get: function get2() {
return this.blueValue;
}
}, {
key: "alpha",
set: function set2(value) {
this.color.setAlpha(value / 100);
},
get: function get2() {
return this.color.getAlpha() * 100;
}
}, {
key: "RGB",
get: function get2() {
return [this.red, this.green, this.blue];
}
}, {
key: "HSB",
get: function get2() {
return [this.hue, this.saturation, this.brightness];
}
}]);
return Color3;
}();
exports2["default"] = Color2;
module2.exports = exports2["default"];
})(color, color.exports);
var Board = { exports: {} };
(function(module2, exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
var _react = React__default.default;
var _react2 = _interopRequireDefault2(_react);
var _reactDom2 = ReactDOM__default.default;
var _reactDom22 = _interopRequireDefault2(_reactDom2);
var _propTypes = propTypes.exports;
var _propTypes2 = _interopRequireDefault2(_propTypes);
var _addEventListener = addEventListener$1;
var _addEventListener2 = _interopRequireDefault2(_addEventListener);
var _color = color.exports;
var _color2 = _interopRequireDefault2(_color);
function _interopRequireDefault2(obj) {
return obj && obj.__esModule ? obj : { "default": obj };
}
function _defaults(obj, defaults2) {
var keys2 = Object.getOwnPropertyNames(defaults2);
for (var i2 = 0; i2 < keys2.length; i2++) {
var key2 = keys2[i2];
var value = Object.getOwnPropertyDescriptor(defaults2, key2);
if (value && value.configurable && obj[key2] === void 0) {
Object.defineProperty(obj, key2, value);
}
}
return obj;
}
function _classCallCheck2(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _possibleConstructorReturn2(self2, call2) {
if (!self2) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return call2 && (typeof call2 === "object" || typeof call2 === "function") ? call2 : self2;
}
function _inherits2(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
}
subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });
if (superClass)
Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass);
}
var WIDTH = 200;
var HEIGHT = 150;
var Board2 = function(_React$Component) {
_inherits2(Board3, _React$Component);
function Board3(props) {
_classCallCheck2(this, Board3);
var _this2 = _possibleConstructorReturn2(this, _React$Component.call(this, props));
_this2.onBoardMouseDown = function(e2) {
var buttons = e2.buttons;
if (buttons !== 1)
return;
var x2 = e2.clientX;
var y2 = e2.clientY;
_this2.pointMoveTo({
x: x2,
y: y2
});
_this2.removeListeners();
_this2.dragListener = (0, _addEventListener2["default"])(window, "mousemove", _this2.onBoardDrag);
_this2.dragUpListener = (0, _addEventListener2["default"])(window, "mouseup", _this2.onBoardDragEnd);
};
_this2.onBoardTouchStart = function(e2) {
if (e2.touches.length !== 1) {
return;
}
_this2.removeTouchListeners();
var x2 = e2.targetTouches[0].clientX;
var y2 = e2.targetTouches[0].clientY;
_this2.pointMoveTo({
x: x2,
y: y2
});
_this2.touchMoveListener = (0, _addEventListener2["default"])(window, "touchmove", _this2.onBoardTouchMove);
_this2.touchEndListener = (0, _addEventListener2["default"])(window, "touchend", _this2.onBoardTouchEnd);
};
_this2.onBoardTouchMove = function(e2) {
if (e2.preventDefault) {
e2.preventDefault();
}
var x2 = e2.targetTouches[0].clientX;
var y2 = e2.targetTouches[0].clientY;
_this2.pointMoveTo({
x: x2,
y: y2
});
};
_this2.onBoardTouchEnd = function() {
_this2.removeTouchListeners();
};
_this2.onBoardDrag = function(e2) {
var x2 = e2.clientX;
var y2 = e2.clientY;
_this2.pointMoveTo({
x: x2,
y: y2
});
};
_this2.onBoardDragEnd = function(e2) {
var x2 = e2.clientX;
var y2 = e2.clientY;
_this2.pointMoveTo({
x: x2,
y: y2
});
_this2.removeListeners();
};
_this2.getPrefixCls = function() {
return _this2.props.rootPrefixCls + "-board";
};
_this2.removeTouchListeners = function() {
if (_this2.touchMoveListener) {
_this2.touchMoveListener.remove();
_this2.touchMoveListener = null;
}
if (_this2.touchEndListener) {
_this2.touchEndListener.remove();
_this2.touchEndListener = null;
}
};
_this2.removeListeners = function() {
if (_this2.dragListener) {
_this2.dragListener.remove();
_this2.dragListener = null;
}
if (_this2.dragUpListener) {
_this2.dragUpListener.remove();
_this2.dragUpListener = null;
}
};
_this2.pointMoveTo = function(pos) {
var rect = _reactDom22["default"].findDOMNode(_this2).getBoundingClientRect();
var left = pos.x - rect.left;
var top = pos.y - rect.top;
var rWidth = rect.width || WIDTH;
var rHeight = rect.height || HEIGHT;
left = Math.max(0, left);
left = Math.min(left, rWidth);
top = Math.max(0, top);
top = Math.min(top, rHeight);
var color2 = _this2.props.color;
color2.saturation = left / rWidth;
color2.brightness = 1 - top / rHeight;
_this2.props.onChange(color2);
};
return _this2;
}
Board3.prototype.componentWillUnmount = function componentWillUnmount() {
this.removeListeners();
this.removeTouchListeners();
};
Board3.prototype.render = function render2() {
var prefixCls = this.getPrefixCls();
var color2 = this.props.color;
var hueHsv = {
h: color2.hue,
s: 1,
v: 1
};
var hueColor = new _color2["default"](hueHsv).toHexString();
var xRel = color2.saturation * 100;
var yRel = (1 - color2.brightness) * 100;
return _react2["default"].createElement(
"div",
{ className: prefixCls },
_react2["default"].createElement(
"div",
{ className: prefixCls + "-hsv", style: { backgroundColor: hueColor } },
_react2["default"].createElement("div", { className: prefixCls + "-value" }),
_react2["default"].createElement("div", { className: prefixCls + "-saturation" })
),
_react2["default"].createElement("span", { style: { left: xRel + "%", top: yRel + "%" } }),
_react2["default"].createElement("div", {
className: prefixCls + "-handler",
onMouseDown: this.onBoardMouseDown,
onTouchStart: this.onBoardTouchStart
})
);
};
return Board3;
}(_react2["default"].Component);
exports2["default"] = Board2;
Board2.propTypes = {
color: _propTypes2["default"].object,
onChange: _propTypes2["default"].func,
rootPrefixCls: _propTypes2["default"].string
};
module2.exports = exports2["default"];
})(Board, Board.exports);
var Preview = { exports: {} };
(function(module2, exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
var _react = React__default.default;
var _react2 = _interopRequireDefault2(_react);
var _propTypes = propTypes.exports;
var _propTypes2 = _interopRequireDefault2(_propTypes);
var _color = color.exports;
var _color2 = _interopRequireDefault2(_color);
function _interopRequireDefault2(obj) {
return obj && obj.__esModule ? obj : { "default": obj };
}
function _defaults(obj, defaults2) {
var keys2 = Object.getOwnPropertyNames(defaults2);
for (var i2 = 0; i2 < keys2.length; i2++) {
var key2 = keys2[i2];
var value = Object.getOwnPropertyDescriptor(defaults2, key2);
if (value && value.configurable && obj[key2] === void 0) {
Object.defineProperty(obj, key2, value);
}
}
return obj;
}
function _classCallCheck2(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _possibleConstructorReturn2(self2, call2) {
if (!self2) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return call2 && (typeof call2 === "object" || typeof call2 === "function") ? call2 : self2;
}
function _inherits2(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
}
subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });
if (superClass)
Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass);
}
var Preview2 = function(_React$Component) {
_inherits2(Preview3, _React$Component);
function Preview3() {
var _temp, _this2, _ret;
_classCallCheck2(this, Preview3);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _ret = (_temp = (_this2 = _possibleConstructorReturn2(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this2), _this2.onChange = function(e2) {
var value = e2.target.value;
var color2 = new _color2["default"](value);
_this2.props.onChange(color2);
e2.stopPropagation();
}, _this2.getPrefixCls = function() {
return _this2.props.rootPrefixCls + "-preview";
}, _temp), _possibleConstructorReturn2(_this2, _ret);
}
Preview3.prototype.render = function render2() {
var prefixCls = this.getPrefixCls();
var hex = this.props.color.toHexString();
return _react2["default"].createElement(
"div",
{ className: prefixCls },
_react2["default"].createElement("span", {
style: {
backgroundColor: hex,
opacity: this.props.alpha / 100
}
}),
_react2["default"].createElement("input", {
type: "color",
value: hex,
onChange: this.onChange,
onClick: this.props.onInputClick
})
);
};
return Preview3;
}(_react2["default"].Component);
exports2["default"] = Preview2;
Preview2.propTypes = {
rootPrefixCls: _propTypes2["default"].string,
color: _propTypes2["default"].object,
alpha: _propTypes2["default"].number,
onChange: _propTypes2["default"].func,
onInputClick: _propTypes2["default"].func
};
module2.exports = exports2["default"];
})(Preview, Preview.exports);
var Ribbon = { exports: {} };
(function(module2, exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
var _react = React__default.default;
var _react2 = _interopRequireDefault2(_react);
var _reactDom2 = ReactDOM__default.default;
var _reactDom22 = _interopRequireDefault2(_reactDom2);
var _propTypes = propTypes.exports;
var _propTypes2 = _interopRequireDefault2(_propTypes);
var _addEventListener = addEventListener$1;
var _addEventListener2 = _interopRequireDefault2(_addEventListener);
function _interopRequireDefault2(obj) {
return obj && obj.__esModule ? obj : { "default": obj };
}
function _defaults(obj, defaults2) {
var keys2 = Object.getOwnPropertyNames(defaults2);
for (var i2 = 0; i2 < keys2.length; i2++) {
var key2 = keys2[i2];
var value = Object.getOwnPropertyDescriptor(defaults2, key2);
if (value && value.configurable && obj[key2] === void 0) {
Object.defineProperty(obj, key2, value);
}
}
return obj;
}
function _classCallCheck2(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _possibleConstructorReturn2(self2, call2) {
if (!self2) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return call2 && (typeof call2 === "object" || typeof call2 === "function") ? call2 : self2;
}
function _inherits2(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
}
subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });
if (superClass)
Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass);
}
var Ribbon2 = function(_React$Component) {
_inherits2(Ribbon3, _React$Component);
function Ribbon3(props) {
_classCallCheck2(this, Ribbon3);
var _this2 = _possibleConstructorReturn2(this, _React$Component.call(this, props));
_this2.onMouseDown = function(e2) {
var x2 = e2.clientX;
var y2 = e2.clientY;
_this2.pointMoveTo({
x: x2,
y: y2
});
_this2.dragListener = (0, _addEventListener2["default"])(window, "mousemove", _this2.onDrag);
_this2.dragUpListener = (0, _addEventListener2["default"])(window, "mouseup", _this2.onDragEnd);
};
_this2.onDrag = function(e2) {
var x2 = e2.clientX;
var y2 = e2.clientY;
_this2.pointMoveTo({
x: x2,
y: y2
});
};
_this2.onDragEnd = function(e2) {
var x2 = e2.clientX;
var y2 = e2.clientY;
_this2.pointMoveTo({
x: x2,
y: y2
});
_this2.removeListeners();
};
_this2.getPrefixCls = function() {
return _this2.props.rootPrefixCls + "-ribbon";
};
_this2.pointMoveTo = function(coords) {
var rect = _reactDom22["default"].findDOMNode(_this2).getBoundingClientRect();
var width = rect.width;
var left = coords.x - rect.left;
left = Math.max(0, left);
left = Math.min(left, width);
var huePercent = left / width;
var hue = huePercent * 360;
var color2 = _this2.props.color;
color2.hue = hue;
_this2.props.onChange(color2);
};
_this2.removeListeners = function() {
if (_this2.dragListener) {
_this2.dragListener.remove();
_this2.dragListener = null;
}
if (_this2.dragUpListener) {
_this2.dragUpListener.remove();
_this2.dragUpListener = null;
}
};
return _this2;
}
Ribbon3.prototype.componentWillUnmount = function componentWillUnmount() {
this.removeListeners();
};
Ribbon3.prototype.render = function render2() {
var prefixCls = this.getPrefixCls();
var hue = this.props.color.hue;
var per = hue / 360 * 100;
return _react2["default"].createElement(
"div",
{ className: prefixCls },
_react2["default"].createElement("span", { ref: "point", style: { left: per + "%" } }),
_react2["default"].createElement("div", { className: prefixCls + "-handler", onMouseDown: this.onMouseDown })
);
};
return Ribbon3;
}(_react2["default"].Component);
exports2["default"] = Ribbon2;
Ribbon2.propTypes = {
rootPrefixCls: _propTypes2["default"].string,
color: _propTypes2["default"].object,
onChange: _propTypes2["default"].func
};
module2.exports = exports2["default"];
})(Ribbon, Ribbon.exports);
var Alpha = { exports: {} };
(function(module2, exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
var _react = React__default.default;
var _react2 = _interopRequireDefault2(_react);
var _reactDom2 = ReactDOM__default.default;
var _propTypes = propTypes.exports;
var _propTypes2 = _interopRequireDefault2(_propTypes);
var _addEventListener = addEventListener$1;
var _addEventListener2 = _interopRequireDefault2(_addEventListener);
function _interopRequireDefault2(obj) {
return obj && obj.__esModule ? obj : { "default": obj };
}
function _defaults(obj, defaults2) {
var keys2 = Object.getOwnPropertyNames(defaults2);
for (var i2 = 0; i2 < keys2.length; i2++) {
var key2 = keys2[i2];
var value = Object.getOwnPropertyDescriptor(defaults2, key2);
if (value && value.configurable && obj[key2] === void 0) {
Object.defineProperty(obj, key2, value);
}
}
return obj;
}
function _classCallCheck2(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _possibleConstructorReturn2(self2, call2) {
if (!self2) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return call2 && (typeof call2 === "object" || typeof call2 === "function") ? call2 : self2;
}
function _inherits2(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
}
subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });
if (superClass)
Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass);
}
function rgbaColor(r2, g2, b2, a) {
return "rgba(" + [r2, g2, b2, a / 100].join(",") + ")";
}
var Alpha2 = function(_React$Component) {
_inherits2(Alpha3, _React$Component);
function Alpha3(props) {
_classCallCheck2(this, Alpha3);
var _this2 = _possibleConstructorReturn2(this, _React$Component.call(this, props));
_this2.onMouseDown = function(e2) {
var x2 = e2.clientX;
var y2 = e2.clientY;
_this2.pointMoveTo({
x: x2,
y: y2
});
_this2.dragListener = (0, _addEventListener2["default"])(window, "mousemove", _this2.onDrag);
_this2.dragUpListener = (0, _addEventListener2["default"])(window, "mouseup", _this2.onDragEnd);
};
_this2.onDrag = function(e2) {
var x2 = e2.clientX;
var y2 = e2.clientY;
_this2.pointMoveTo({
x: x2,
y: y2
});
};
_this2.onDragEnd = function(e2) {
var x2 = e2.clientX;
var y2 = e2.clientY;
_this2.pointMoveTo({
x: x2,
y: y2
});
_this2.removeListeners();
};
_this2.getBackground = function() {
var _this$props$color = _this2.props.color, red2 = _this$props$color.red, green2 = _this$props$color.green, blue2 = _this$props$color.blue;
var opacityGradient = "linear-gradient(to right, " + rgbaColor(red2, green2, blue2, 0) + " , " + rgbaColor(red2, green2, blue2, 100) + ")";
return opacityGradient;
};
_this2.getPrefixCls = function() {
return _this2.props.rootPrefixCls + "-alpha";
};
_this2.pointMoveTo = function(coords) {
var rect = (0, _reactDom2.findDOMNode)(_this2).getBoundingClientRect();
var width = rect.width;
var left = coords.x - rect.left;
left = Math.max(0, left);
left = Math.min(left, width);
var alpha = Math.round(left / width * 100);
_this2.props.onChange(alpha);
};
_this2.removeListeners = function() {
if (_this2.dragListener) {
_this2.dragListener.remove();
_this2.dragListener = null;
}
if (_this2.dragUpListener) {
_this2.dragUpListener.remove();
_this2.dragUpListener = null;
}
};
return _this2;
}
Alpha3.prototype.componentWillUnmount = function componentWillUnmount() {
this.removeListeners();
};
Alpha3.prototype.render = function render2() {
var prefixCls = this.getPrefixCls();
return _react2["default"].createElement(
"div",
{ className: prefixCls },
_react2["default"].createElement("div", { ref: "bg", className: prefixCls + "-bg", style: { background: this.getBackground() } }),
_react2["default"].createElement("span", { style: { left: this.props.alpha + "%" } }),
_react2["default"].createElement("div", { className: prefixCls + "-handler", onMouseDown: this.onMouseDown })
);
};
return Alpha3;
}(_react2["default"].Component);
exports2["default"] = Alpha2;
Alpha2.propTypes = {
color: _propTypes2["default"].object,
onChange: _propTypes2["default"].func,
rootPrefixCls: _propTypes2["default"].string,
alpha: _propTypes2["default"].number
};
module2.exports = exports2["default"];
})(Alpha, Alpha.exports);
var Params = { exports: {} };
var percentage = { exports: {} };
(function(module2, exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
exports2["default"] = percentage2;
function percentage2(input) {
return Math.round(input * 100);
}
module2.exports = exports2["default"];
})(percentage, percentage.exports);
(function(module2, exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
var _react = React__default.default;
var _react2 = _interopRequireDefault2(_react);
var _propTypes = propTypes.exports;
var _propTypes2 = _interopRequireDefault2(_propTypes);
var _classnames = classnames$1.exports;
var _classnames2 = _interopRequireDefault2(_classnames);
var _color = color.exports;
var _color2 = _interopRequireDefault2(_color);
var _percentage = percentage.exports;
var _percentage2 = _interopRequireDefault2(_percentage);
function _interopRequireDefault2(obj) {
return obj && obj.__esModule ? obj : { "default": obj };
}
function _defaults(obj, defaults2) {
var keys2 = Object.getOwnPropertyNames(defaults2);
for (var i2 = 0; i2 < keys2.length; i2++) {
var key2 = keys2[i2];
var value = Object.getOwnPropertyDescriptor(defaults2, key2);
if (value && value.configurable && obj[key2] === void 0) {
Object.defineProperty(obj, key2, value);
}
}
return obj;
}
function _defineProperty3(obj, key2, value) {
if (key2 in obj) {
Object.defineProperty(obj, key2, { value, enumerable: true, configurable: true, writable: true });
} else {
obj[key2] = value;
}
return obj;
}
function _classCallCheck2(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _possibleConstructorReturn2(self2, call2) {
if (!self2) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return call2 && (typeof call2 === "object" || typeof call2 === "function") ? call2 : self2;
}
function _inherits2(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
}
subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });
if (superClass)
Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass);
}
var modesMap = ["RGB", "HSB"];
var Params2 = function(_React$Component) {
_inherits2(Params3, _React$Component);
function Params3(props) {
_classCallCheck2(this, Params3);
var _this2 = _possibleConstructorReturn2(this, _React$Component.call(this, props));
_this2.getChannelInRange = function(value, index2) {
var channelMap = {
RGB: [[0, 255], [0, 255], [0, 255]],
HSB: [[0, 359], [0, 100], [0, 100]]
};
var mode = _this2.state.mode;
var range2 = channelMap[mode][index2];
var result = parseInt(value, 10);
if (isNaN(result)) {
result = 0;
}
result = Math.max(range2[0], result);
result = Math.min(result, range2[1]);
return result;
};
_this2.getPrefixCls = function() {
return _this2.props.rootPrefixCls + "-params";
};
_this2.handleHexBlur = function() {
var hex = _this2.state.hex;
var color2 = null;
if (_color2["default"].isValidHex(hex)) {
color2 = new _color2["default"](hex);
}
if (color2 !== null) {
_this2.setState({
color: color2,
hex
});
_this2.props.onChange(color2, false);
}
};
_this2.handleHexPress = function(event) {
var hex = _this2.state.hex;
if (event.nativeEvent.which === 13) {
var color2 = null;
if (_color2["default"].isValidHex(hex)) {
color2 = new _color2["default"](hex);
}
if (color2 !== null) {
_this2.setState({
color: color2,
hex
});
_this2.props.onChange(color2, false);
}
}
};
_this2.handleHexChange = function(event) {
var hex = event.target.value;
_this2.setState({
hex
});
};
_this2.handleModeChange = function() {
var mode = _this2.state.mode;
var modeIndex = (modesMap.indexOf(mode) + 1) % modesMap.length;
mode = modesMap[modeIndex];
_this2.setState({
mode
});
};
_this2.handleAlphaHandler = function(event) {
var alpha = parseInt(event.target.value, 10);
if (isNaN(alpha)) {
alpha = 0;
}
alpha = Math.max(0, alpha);
alpha = Math.min(alpha, 100);
_this2.props.onAlphaChange(alpha);
};
_this2.updateColorByChanel = function(channel, value) {
var color2 = _this2.props.color;
var mode = _this2.state.mode;
if (mode === "HSB") {
if (channel === "H") {
color2.hue = parseInt(value, 10);
} else if (channel === "S") {
color2.saturation = parseInt(value, 10) / 100;
} else if (channel === "B") {
color2.brightness = parseInt(value, 10) / 100;
}
} else {
if (channel === "R") {
color2.red = parseInt(value, 10);
} else if (channel === "G") {
color2.green = parseInt(value, 10);
} else if (channel === "B") {
color2.blue = parseInt(value, 10);
}
}
return color2;
};
_this2.handleColorChannelChange = function(index2, event) {
var value = _this2.getChannelInRange(event.target.value, index2);
var mode = _this2.state.mode;
var channel = mode[index2];
var color2 = _this2.updateColorByChanel(channel, value);
_this2.setState({
hex: color2.hex,
color: color2
}, function() {
_this2.props.onChange(color2, false);
});
};
_this2.state = {
mode: props.mode,
hex: props.color.hex,
color: props.color
};
return _this2;
}
Params3.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
var nextColor = nextProps.color;
this.setState({
color: nextColor,
hex: nextColor.hex
});
};
Params3.prototype.render = function render2() {
var _cx;
var prefixCls = this.getPrefixCls();
var enableAlpha = this.props.enableAlpha;
var _state = this.state, mode = _state.mode, color2 = _state.color;
var colorChannel = color2[mode];
if (mode === "HSB") {
colorChannel[0] = parseInt(colorChannel[0], 10);
colorChannel[1] = (0, _percentage2["default"])(colorChannel[1]);
colorChannel[2] = (0, _percentage2["default"])(colorChannel[2]);
}
var paramsClasses = (0, _classnames2["default"])((_cx = {}, _defineProperty3(_cx, prefixCls, true), _defineProperty3(_cx, prefixCls + "-has-alpha", enableAlpha), _cx));
return _react2["default"].createElement(
"div",
{ className: paramsClasses },
_react2["default"].createElement(
"div",
{ className: prefixCls + "-input" },
_react2["default"].createElement("input", {
className: prefixCls + "-hex",
type: "text",
maxLength: "6",
onKeyPress: this.handleHexPress,
onBlur: this.handleHexBlur,
onChange: this.handleHexChange,
value: this.state.hex.toLowerCase()
}),
_react2["default"].createElement("input", {
type: "number",
ref: "channel_0",
value: colorChannel[0],
onChange: this.handleColorChannelChange.bind(null, 0)
}),
_react2["default"].createElement("input", {
type: "number",
ref: "channel_1",
value: colorChannel[1],
onChange: this.handleColorChannelChange.bind(null, 1)
}),
_react2["default"].createElement("input", {
type: "number",
ref: "channel_2",
value: colorChannel[2],
onChange: this.handleColorChannelChange.bind(null, 2)
}),
enableAlpha && _react2["default"].createElement("input", {
type: "number",
value: Math.round(this.props.alpha),
onChange: this.handleAlphaHandler
})
),
_react2["default"].createElement(
"div",
{ className: prefixCls + "-lable" },
_react2["default"].createElement(
"label",
{ className: prefixCls + "-lable-hex" },
"Hex"
),
_react2["default"].createElement(
"label",
{ className: prefixCls + "-lable-number", onClick: this.handleModeChange },
mode[0]
),
_react2["default"].createElement(
"label",
{ className: prefixCls + "-lable-number", onClick: this.handleModeChange },
mode[1]
),
_react2["default"].createElement(
"label",
{ className: prefixCls + "-lable-number", onClick: this.handleModeChange },
mode[2]
),
enableAlpha && _react2["default"].createElement(
"label",
{ className: prefixCls + "-lable-alpha" },
"A"
)
)
);
};
return Params3;
}(_react2["default"].Component);
exports2["default"] = Params2;
Params2.propTypes = {
alpha: _propTypes2["default"].number,
enableAlpha: _propTypes2["default"].bool,
color: _propTypes2["default"].object.isRequired,
mode: _propTypes2["default"].oneOf(modesMap),
onAlphaChange: _propTypes2["default"].func,
onChange: _propTypes2["default"].func,
rootPrefixCls: _propTypes2["default"].string
};
Params2.defaultProps = {
mode: modesMap[0],
enableAlpha: true
};
module2.exports = exports2["default"];
})(Params, Params.exports);
var validationColor = function validationColor2(props, propName, componentName) {
if (props[propName] && !/^#[0-9a-fA-F]{3,6}$/.test(props[propName])) {
return new Error(componentName + ".props." + propName + " Validation failed!");
}
};
(function(module2, exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
var _react = React__default.default;
var _react2 = _interopRequireDefault2(_react);
var _propTypes = propTypes.exports;
var _propTypes2 = _interopRequireDefault2(_propTypes);
var _color = color.exports;
var _color2 = _interopRequireDefault2(_color);
var _Board = Board.exports;
var _Board2 = _interopRequireDefault2(_Board);
var _Preview = Preview.exports;
var _Preview2 = _interopRequireDefault2(_Preview);
var _Ribbon = Ribbon.exports;
var _Ribbon2 = _interopRequireDefault2(_Ribbon);
var _Alpha = Alpha.exports;
var _Alpha2 = _interopRequireDefault2(_Alpha);
var _Params = Params.exports;
var _Params2 = _interopRequireDefault2(_Params);
var _classnames = classnames$1.exports;
var _classnames2 = _interopRequireDefault2(_classnames);
var _validationColor = validationColor;
var _validationColor2 = _interopRequireDefault2(_validationColor);
function _interopRequireDefault2(obj) {
return obj && obj.__esModule ? obj : { "default": obj };
}
function _defaults(obj, defaults2) {
var keys2 = Object.getOwnPropertyNames(defaults2);
for (var i2 = 0; i2 < keys2.length; i2++) {
var key2 = keys2[i2];
var value = Object.getOwnPropertyDescriptor(defaults2, key2);
if (value && value.configurable && obj[key2] === void 0) {
Object.defineProperty(obj, key2, value);
}
}
return obj;
}
function _defineProperty3(obj, key2, value) {
if (key2 in obj) {
Object.defineProperty(obj, key2, { value, enumerable: true, configurable: true, writable: true });
} else {
obj[key2] = value;
}
return obj;
}
function _classCallCheck2(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _possibleConstructorReturn2(self2, call2) {
if (!self2) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return call2 && (typeof call2 === "object" || typeof call2 === "function") ? call2 : self2;
}
function _inherits2(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
}
subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });
if (superClass)
Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass);
}
function noop2() {
}
var Panel2 = function(_React$Component) {
_inherits2(Panel3, _React$Component);
function Panel3(props) {
_classCallCheck2(this, Panel3);
var _this2 = _possibleConstructorReturn2(this, _React$Component.call(this, props));
_initialiseProps2.call(_this2);
var alpha = typeof props.alpha === "undefined" ? props.defaultAlpha : Math.min(props.alpha, props.defaultAlpha);
var color2 = new _color2["default"](props.color || props.defaultColor);
_this2.state = {
color: color2,
alpha
};
return _this2;
}
Panel3.prototype.componentDidMount = function componentDidMount() {
this.props.onMount(this.ref);
};
Panel3.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
if (nextProps.color) {
var color2 = new _color2["default"](nextProps.color);
this.setState({
color: color2
});
}
if (nextProps.alpha !== void 0) {
this.setState({
alpha: nextProps.alpha
});
}
};
Panel3.prototype.render = function render2() {
var _cx, _this2 = this;
var _props = this.props, prefixCls = _props.prefixCls, enableAlpha = _props.enableAlpha;
var _state = this.state, color2 = _state.color, alpha = _state.alpha;
var wrapClasses = (0, _classnames2["default"])((_cx = {}, _defineProperty3(_cx, prefixCls + "-wrap", true), _defineProperty3(_cx, prefixCls + "-wrap-has-alpha", enableAlpha), _cx));
return _react2["default"].createElement(
"div",
{
ref: function ref(_ref) {
return _this2.ref = _ref;
},
className: [prefixCls, this.props.className].join(" "),
style: this.props.style,
onFocus: this.onFocus,
onBlur: this.onBlur,
tabIndex: "0"
},
_react2["default"].createElement(
"div",
{ className: prefixCls + "-inner" },
_react2["default"].createElement(_Board2["default"], { rootPrefixCls: prefixCls, color: color2, onChange: this.handleChange }),
_react2["default"].createElement(
"div",
{ className: wrapClasses },
_react2["default"].createElement(
"div",
{ className: prefixCls + "-wrap-ribbon" },
_react2["default"].createElement(_Ribbon2["default"], { rootPrefixCls: prefixCls, color: color2, onChange: this.handleChange })
),
enableAlpha && _react2["default"].createElement(
"div",
{ className: prefixCls + "-wrap-alpha" },
_react2["default"].createElement(_Alpha2["default"], {
rootPrefixCls: prefixCls,
alpha,
color: color2,
onChange: this.handleAlphaChange
})
),
_react2["default"].createElement(
"div",
{ className: prefixCls + "-wrap-preview" },
_react2["default"].createElement(_Preview2["default"], {
rootPrefixCls: prefixCls,
alpha,
onChange: this.handleChange,
onInputClick: this.onSystemColorPickerOpen,
color: color2
})
)
),
_react2["default"].createElement(
"div",
{ className: prefixCls + "-wrap", style: { height: 40, marginTop: 6 } },
_react2["default"].createElement(_Params2["default"], {
rootPrefixCls: prefixCls,
color: color2,
alpha,
onAlphaChange: this.handleAlphaChange,
onChange: this.handleChange,
mode: this.props.mode,
enableAlpha: this.props.enableAlpha
})
)
)
);
};
return Panel3;
}(_react2["default"].Component);
var _initialiseProps2 = function _initialiseProps3() {
var _this3 = this;
this.onSystemColorPickerOpen = function(e2) {
if (e2.target.type === "color") {
_this3.systemColorPickerOpen = true;
}
};
this.onFocus = function() {
if (_this3._blurTimer) {
clearTimeout(_this3._blurTimer);
_this3._blurTimer = null;
} else {
_this3.props.onFocus();
}
};
this.onBlur = function() {
if (_this3._blurTimer) {
clearTimeout(_this3._blurTimer);
}
_this3._blurTimer = setTimeout(function() {
if (_this3.systemColorPickerOpen) {
_this3.systemColorPickerOpen = false;
return;
}
_this3.props.onBlur();
}, 100);
};
this.handleAlphaChange = function(alpha) {
var color2 = _this3.state.color;
color2.alpha = alpha;
_this3.setState({
alpha,
color: color2
});
_this3.props.onChange({
color: color2.toHexString(),
alpha
});
};
this.handleChange = function(color2) {
var alpha = _this3.state.alpha;
color2.alpha = alpha;
_this3.setState({ color: color2 });
_this3.props.onChange({
color: color2.toHexString(),
alpha: color2.alpha
});
};
};
exports2["default"] = Panel2;
Panel2.propTypes = {
alpha: _propTypes2["default"].number,
className: _propTypes2["default"].string,
color: _validationColor2["default"],
defaultAlpha: _propTypes2["default"].number,
defaultColor: _validationColor2["default"],
enableAlpha: _propTypes2["default"].bool,
mode: _propTypes2["default"].oneOf(["RGB", "HSL", "HSB"]),
onBlur: _propTypes2["default"].func,
onChange: _propTypes2["default"].func,
onFocus: _propTypes2["default"].func,
onMount: _propTypes2["default"].func,
prefixCls: _propTypes2["default"].string,
style: _propTypes2["default"].object
};
Panel2.defaultProps = {
className: "",
defaultAlpha: 100,
defaultColor: "#ff0000",
enableAlpha: true,
mode: "RGB",
onBlur: noop2,
onChange: noop2,
onFocus: noop2,
onMount: noop2,
prefixCls: "rc-color-picker-panel",
style: {}
};
module2.exports = exports2["default"];
})(Panel$1, Panel$1.exports);
var placements = { exports: {} };
(function(module2, exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
var autoAdjustOverflow2 = {
adjustX: 1,
adjustY: 1
};
var targetOffset2 = [0, 0];
var placements2 = {
topLeft: {
points: ["bl", "tl"],
overflow: autoAdjustOverflow2,
offset: [0, -5],
targetOffset: targetOffset2
},
topRight: {
points: ["br", "tr"],
overflow: autoAdjustOverflow2,
offset: [0, -5],
targetOffset: targetOffset2
},
bottomLeft: {
points: ["tl", "bl"],
overflow: autoAdjustOverflow2,
offset: [0, 5],
targetOffset: targetOffset2
},
bottomRight: {
points: ["tr", "br"],
overflow: autoAdjustOverflow2,
offset: [0, 5],
targetOffset: targetOffset2
}
};
exports2["default"] = placements2;
module2.exports = exports2["default"];
})(placements, placements.exports);
(function(module2, exports2) {
Object.defineProperty(exports2, "__esModule", {
value: true
});
var _slicedToArray2 = function() {
function sliceIterator(arr, i2) {
var _arr = [];
var _n = true;
var _d = false;
var _e = void 0;
try {
for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
_arr.push(_s.value);
if (i2 && _arr.length === i2)
break;
}
} catch (err) {
_d = true;
_e = err;
} finally {
try {
if (!_n && _i["return"])
_i["return"]();
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
return function(arr, i2) {
if (Array.isArray(arr)) {
return arr;
} else if (Symbol.iterator in Object(arr)) {
return sliceIterator(arr, i2);
} else {
throw new TypeError("Invalid attempt to destructure non-iterable instance");
}
};
}();
var _extends2 = Object.assign || function(target) {
for (var i2 = 1; i2 < arguments.length; i2++) {
var source = arguments[i2];
for (var key2 in source) {
if (Object.prototype.hasOwnProperty.call(source, key2)) {
target[key2] = source[key2];
}
}
}
return target;
};
var _react = React__default.default;
var _react2 = _interopRequireDefault2(_react);
var _reactDom2 = ReactDOM__default.default;
var _propTypes = propTypes.exports;
var _propTypes2 = _interopRequireDefault2(_propTypes);
var _rcTrigger = require$$3$1;
var _rcTrigger2 = _interopRequireDefault2(_rcTrigger);
var _Panel = Panel$1.exports;
var _Panel2 = _interopRequireDefault2(_Panel);
var _placements = placements.exports;
var _placements2 = _interopRequireDefault2(_placements);
var _color = color.exports;
var _color2 = _interopRequireDefault2(_color);
function _interopRequireDefault2(obj) {
return obj && obj.__esModule ? obj : { "default": obj };
}
function _defaults(obj, defaults2) {
var keys2 = Object.getOwnPropertyNames(defaults2);
for (var i2 = 0; i2 < keys2.length; i2++) {
var key2 = keys2[i2];
var value = Object.getOwnPropertyDescriptor(defaults2, key2);
if (value && value.configurable && obj[key2] === void 0) {
Object.defineProperty(obj, key2, value);
}
}
return obj;
}
function _classCallCheck2(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _possibleConstructorReturn2(self2, call2) {
if (!self2) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return call2 && (typeof call2 === "object" || typeof call2 === "function") ? call2 : self2;
}
function _inherits2(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
}
subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });
if (superClass)
Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass);
}
function refFn(field, component) {
this[field] = component;
}
function prevent(e2) {
e2.preventDefault();
}
var ColorPicker2 = function(_React$Component) {
_inherits2(ColorPicker3, _React$Component);
function ColorPicker3(props) {
_classCallCheck2(this, ColorPicker3);
var _this2 = _possibleConstructorReturn2(this, _React$Component.call(this, props));
var alpha = typeof props.alpha === "undefined" ? props.defaultAlpha : Math.min(props.alpha, props.defaultAlpha);
_this2.state = {
color: props.color || props.defaultColor,
alpha,
open: false
};
var events = ["onTriggerClick", "onChange", "onBlur", "getPickerElement", "getRootDOMNode", "getTriggerDOMNode", "onVisibleChange", "onPanelMount", "setOpen", "open", "close", "focus"];
events.forEach(function(e2) {
_this2[e2] = _this2[e2].bind(_this2);
});
_this2.saveTriggerRef = refFn.bind(_this2, "triggerInstance");
return _this2;
}
ColorPicker3.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
if (nextProps.color) {
this.setState({
color: nextProps.color
});
}
if (nextProps.alpha !== null && nextProps.alpha !== void 0) {
this.setState({
alpha: nextProps.alpha
});
}
};
ColorPicker3.prototype.onTriggerClick = function onTriggerClick() {
this.setState({
open: !this.state.open
});
};
ColorPicker3.prototype.onChange = function onChange(colors) {
var _this2 = this;
this.setState(_extends2({}, colors), function() {
_this2.props.onChange(_this2.state);
});
};
ColorPicker3.prototype.onBlur = function onBlur() {
this.setOpen(false);
};
ColorPicker3.prototype.onVisibleChange = function onVisibleChange(open) {
this.setOpen(open);
};
ColorPicker3.prototype.onPanelMount = function onPanelMount(panelDOMRef) {
if (this.state.open) {
setTimeout(function() {
panelDOMRef.focus();
}, 1);
}
};
ColorPicker3.prototype.setOpen = function setOpen(open, callback) {
var _this3 = this;
if (this.state.open !== open) {
this.setState({
open
}, function() {
if (typeof callback === "function")
callback();
var _props = _this3.props, onOpen = _props.onOpen, onClose = _props.onClose;
if (_this3.state.open) {
onOpen(_this3.state);
} else {
onClose(_this3.state);
}
});
}
};
ColorPicker3.prototype.getRootDOMNode = function getRootDOMNode() {
return (0, _reactDom2.findDOMNode)(this);
};
ColorPicker3.prototype.getTriggerDOMNode = function getTriggerDOMNode() {
return (0, _reactDom2.findDOMNode)(this.triggerInstance);
};
ColorPicker3.prototype.getPickerElement = function getPickerElement() {
return _react2["default"].createElement(_Panel2["default"], {
onMount: this.onPanelMount,
defaultColor: this.state.color,
alpha: this.state.alpha,
enableAlpha: this.props.enableAlpha,
prefixCls: this.props.prefixCls + "-panel",
onChange: this.onChange,
onBlur: this.onBlur,
mode: this.props.mode,
className: this.props.className
});
};
ColorPicker3.prototype.open = function open(callback) {
this.setOpen(true, callback);
};
ColorPicker3.prototype.close = function close(callback) {
this.setOpen(false, callback);
};
ColorPicker3.prototype.focus = function focus() {
if (!this.state.open) {
(0, _reactDom2.findDOMNode)(this).focus();
}
};
ColorPicker3.prototype.render = function render2() {
var props = this.props;
var state = this.state;
var classes = [props.prefixCls + "-wrap", props.className];
if (state.open) {
classes.push(props.prefixCls + "-open");
}
var children = props.children;
var _RGB = _slicedToArray2(new _color2["default"](this.state.color).RGB, 3), r2 = _RGB[0], g2 = _RGB[1], b2 = _RGB[2];
var RGBA = [r2, g2, b2];
RGBA.push(this.state.alpha / 100);
if (children) {
children = _react2["default"].cloneElement(children, {
ref: this.saveTriggerRef,
unselectable: "unselectable",
style: {
backgroundColor: "rgba(" + RGBA.join(",") + ")"
},
onClick: this.onTriggerClick,
onMouseDown: prevent
});
}
var prefixCls = props.prefixCls, placement = props.placement, style2 = props.style, getCalendarContainer = props.getCalendarContainer, align = props.align, animation = props.animation, disabled = props.disabled, transitionName2 = props.transitionName;
return _react2["default"].createElement(
"div",
{ className: classes.join(" ") },
_react2["default"].createElement(
_rcTrigger2["default"],
{
popup: this.getPickerElement(),
popupAlign: align,
builtinPlacements: _placements2["default"],
popupPlacement: placement,
action: disabled ? [] : ["click"],
destroyPopupOnHide: true,
getPopupContainer: getCalendarContainer,
popupStyle: style2,
popupAnimation: animation,
popupTransitionName: transitionName2,
popupVisible: state.open,
onPopupVisibleChange: this.onVisibleChange,
prefixCls
},
children
)
);
};
return ColorPicker3;
}(_react2["default"].Component);
exports2["default"] = ColorPicker2;
ColorPicker2.propTypes = {
defaultColor: _propTypes2["default"].string,
defaultAlpha: _propTypes2["default"].number,
alpha: _propTypes2["default"].number,
children: _propTypes2["default"].node.isRequired,
className: _propTypes2["default"].string,
color: _propTypes2["default"].string,
enableAlpha: _propTypes2["default"].bool,
mode: _propTypes2["default"].oneOf(["RGB", "HSL", "HSB"]),
onChange: _propTypes2["default"].func,
onClose: _propTypes2["default"].func,
onOpen: _propTypes2["default"].func,
placement: _propTypes2["default"].oneOf(["topLeft", "topRight", "bottomLeft", "bottomRight"]),
prefixCls: _propTypes2["default"].string.isRequired,
style: _propTypes2["default"].object
};
ColorPicker2.defaultProps = {
defaultColor: "#F00",
defaultAlpha: 100,
onChange: function onChange() {
},
onOpen: function onOpen() {
},
onClose: function onClose() {
},
children: _react2["default"].createElement("span", { className: "rc-color-picker-trigger" }),
className: "",
enableAlpha: true,
placement: "topLeft",
prefixCls: "rc-color-picker",
style: {}
};
module2.exports = exports2["default"];
})(ColorPicker$1, ColorPicker$1.exports);
(function(module2) {
module2.exports = ColorPicker$1.exports;
module2.exports.Panel = Panel$1.exports;
})(lib$1);
const ColorPicker = /* @__PURE__ */ getDefaultExportFromCjs(lib$1.exports);
const alphaHexMap = {
"1.00": "FF",
0.99: "FC",
0.98: "FA",
0.97: "F7",
0.96: "F5",
0.95: "F2",
0.94: "F0",
0.93: "ED",
0.92: "EB",
0.91: "E8",
"0.90": "E6",
0.89: "E3",
0.88: "E0",
0.87: "DE",
0.86: "DB",
0.85: "D9",
0.84: "D6",
0.83: "D4",
0.82: "D1",
0.81: "CF",
"0.80": "CC",
0.79: "C9",
0.78: "C7",
0.77: "C4",
0.76: "C2",
0.75: "BF",
0.74: "BD",
0.73: "BA",
0.72: "B8",
0.71: "B5",
"0.70": "B3",
0.69: "B0",
0.68: "AD",
0.67: "AB",
0.66: "A8",
0.65: "A6",
0.64: "A3",
0.63: "A1",
0.62: "9E",
0.61: "9C",
"0.60": "99",
0.59: "96",
0.58: "94",
0.57: "91",
0.56: "8F",
0.55: "8C",
0.54: "8A",
0.53: "87",
0.52: "85",
0.51: "82",
"0.50": "80",
0.49: "7D",
0.48: "7A",
0.47: "78",
0.46: "75",
0.45: "73",
0.44: "70",
0.43: "6E",
0.42: "6B",
0.41: "69",
"0.40": "66",
0.39: "63",
0.38: "61",
0.37: "5E",
0.36: "5C",
0.35: "59",
0.34: "57",
0.33: "54",
0.32: "52",
0.31: "4F",
"0.30": "4D",
0.29: "4A",
0.28: "47",
0.27: "45",
0.26: "42",
0.25: "40",
0.24: "3D",
0.23: "3B",
0.22: "38",
0.21: "36",
"0.20": "33",
0.19: "30",
0.18: "2E",
0.17: "2B",
0.16: "29",
0.15: "26",
0.14: "24",
0.13: "21",
0.12: "1F",
0.11: "1C",
"0.10": "1A",
0.09: "17",
0.08: "14",
0.07: "12",
0.06: "0F",
0.05: "0D",
0.04: "0A",
0.03: "08",
0.02: "05",
0.01: "03",
"0.00": "00"
};
const index$D = "";
const index$C = "";
var getAlphaFromHex = function getAlphaFromHex2() {
var hex = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "#ffffff";
var alphaHex = hex.slice(7);
var alpha = 100;
for (var key2 in alphaHexMap) {
if (alphaHexMap[key2] === alphaHex.toUpperCase()) {
alpha = Number(key2) * 100;
}
}
return alpha;
};
var Color = function Color2(props) {
var className = props.className, schema2 = props.schema, disabled = props.disabled, readOnly = props.readOnly, value = props.value, onChange = props.onChange, style2 = props.style;
var onPickerChange = function onPickerChange2(ev) {
if (disabled || readOnly) {
return;
}
var alphaHex = alphaHexMap[(ev.alpha / 100).toFixed(2)];
var hex = ev.color + (ev.alpha === 100 ? "" : alphaHex);
onChange(hex);
};
var onInputChange = function onInputChange2(ev) {
onChange(ev.target.value);
};
return /* @__PURE__ */ jsxs("div", {
className: "fr-color-picker",
style: style2,
children: [disabled || readOnly ? /* @__PURE__ */ jsx("span", {
className: "rc-color-picker-trigger",
style: {
backgroundColor: value || "#ffffff"
}
}) : /* @__PURE__ */ jsx(ColorPicker, {
type: schema2 === null || schema2 === void 0 ? void 0 : schema2.format,
animation: "slide-up",
color: value && value.slice(0, 7) || "#ffffff",
alpha: getAlphaFromHex(value),
onChange: onPickerChange,
disabled: true
}), readOnly ? /* @__PURE__ */ jsx("span", {
children: value || "#ffffff"
}) : /* @__PURE__ */ React__default.default.createElement(Input$2, {
className,
placeholder: "#ffffff",
disabled,
value,
onChange: onInputChange
})]
});
};
var quarterOfYear$1 = { exports: {} };
(function(module2, exports2) {
!function(t2, n2) {
module2.exports = n2();
}(commonjsGlobal, function() {
var t2 = "month", n2 = "quarter";
return function(e2, i2) {
var r2 = i2.prototype;
r2.quarter = function(t3) {
return this.$utils().u(t3) ? Math.ceil((this.month() + 1) / 3) : this.month(this.month() % 3 + 3 * (t3 - 1));
};
var s = r2.add;
r2.add = function(e3, i3) {
return e3 = Number(e3), this.$utils().p(i3) === n2 ? this.add(3 * e3, t2) : s.bind(this)(e3, i3);
};
var u2 = r2.startOf;
r2.startOf = function(e3, i3) {
var r3 = this.$utils(), s2 = !!r3.u(i3) || i3;
if (r3.p(e3) === n2) {
var o = this.quarter() - 1;
return s2 ? this.month(3 * o).startOf(t2).startOf("day") : this.month(3 * o + 2).endOf(t2).endOf("day");
}
return u2.bind(this)(e3, i3);
};
};
});
})(quarterOfYear$1);
const quarterOfYear = quarterOfYear$1.exports;
var weekOfYear$1 = { exports: {} };
(function(module2, exports2) {
!function(e2, t2) {
module2.exports = t2();
}(commonjsGlobal, function() {
var e2 = "week", t2 = "year";
return function(i2, n2, r2) {
var f2 = n2.prototype;
f2.week = function(i3) {
if (void 0 === i3 && (i3 = null), null !== i3)
return this.add(7 * (i3 - this.week()), "day");
var n3 = this.$locale().yearStart || 1;
if (11 === this.month() && this.date() > 25) {
var f3 = r2(this).startOf(t2).add(1, t2).date(n3), s = r2(this).endOf(e2);
if (f3.isBefore(s))
return 1;
}
var a = r2(this).startOf(t2).date(n3).startOf(e2).subtract(1, "millisecond"), o = this.diff(a, e2, true);
return o < 0 ? r2(this).startOf("week").week() : Math.ceil(o);
}, f2.weeks = function(e3) {
return void 0 === e3 && (e3 = null), this.week(e3);
};
};
});
})(weekOfYear$1);
const weekOfYear = weekOfYear$1.exports;
function _slicedToArray$a(arr, i2) {
return _arrayWithHoles$a(arr) || _iterableToArrayLimit$a(arr, i2) || _unsupportedIterableToArray$c(arr, i2) || _nonIterableRest$a();
}
function _nonIterableRest$a() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$c(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$c(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$c(o, minLen);
}
function _arrayLikeToArray$c(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArrayLimit$a(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _arrayWithHoles$a(arr) {
if (Array.isArray(arr))
return arr;
}
dayjs.extend(weekOfYear);
function isUrl(str) {
var protocolRE = /^(?:\w+:)?\/\/(\S+)$/;
if (typeof str !== "string")
return false;
return protocolRE.test(str);
}
function getFormat(format2) {
var dateFormat;
switch (format2) {
case "date":
dateFormat = "YYYY-MM-DD";
break;
case "time":
dateFormat = "HH:mm:ss";
break;
case "dateTime":
dateFormat = "YYYY-MM-DD HH:mm:ss";
break;
case "week":
dateFormat = "YYYY-w";
break;
case "year":
dateFormat = "YYYY";
break;
case "quarter":
dateFormat = "YYYY-Q";
break;
case "month":
dateFormat = "YYYY-MM";
break;
default:
if (typeof format2 === "string") {
dateFormat = format2;
} else {
dateFormat = "YYYY-MM-DD";
}
}
return dateFormat;
}
var transformDateValue = function transformDateValue2(value, format2, dateFormat) {
var _a;
var result = value || void 0;
if (typeof value === "string") {
if (format2 === "week") {
var _value$split = value.split("-"), _value$split2 = _slicedToArray$a(_value$split, 2), years = _value$split2[0], week = _value$split2[1];
result = (_a = dayjs(years)) === null || _a === void 0 ? void 0 : _a.week(Number(week));
}
if (format2 === "quarter") {
var _value$split3 = value.split("-"), _value$split4 = _slicedToArray$a(_value$split3, 2), yearx = _value$split4[0], quarter = _value$split4[1];
result = dayjs(yearx).quarter(quarter);
}
}
if (result) {
result = dayjs(result, dateFormat);
}
return result;
};
var translation = function translation2(configCtx) {
return function(key2) {
var _a;
var locale2 = (_a = configCtx === null || configCtx === void 0 ? void 0 : configCtx.locale) === null || _a === void 0 ? void 0 : _a.FormRender;
return locale2[key2];
};
};
var weekday$1 = { exports: {} };
(function(module2, exports2) {
!function(e2, t2) {
module2.exports = t2();
}(commonjsGlobal, function() {
return function(e2, t2) {
t2.prototype.weekday = function(e3) {
var t3 = this.$locale().weekStart || 0, i2 = this.$W, n2 = (i2 < t3 ? i2 + 7 : i2) - t3;
return this.$utils().u(e3) ? n2 : this.subtract(n2, "day").add(e3, "day");
};
};
});
})(weekday$1);
const weekday = weekday$1.exports;
var localeData$1 = { exports: {} };
(function(module2, exports2) {
!function(n2, e2) {
module2.exports = e2();
}(commonjsGlobal, function() {
return function(n2, e2, t2) {
var r2 = e2.prototype, o = function(n3) {
return n3 && (n3.indexOf ? n3 : n3.s);
}, u2 = function(n3, e3, t3, r3, u3) {
var i3 = n3.name ? n3 : n3.$locale(), a2 = o(i3[e3]), s2 = o(i3[t3]), f2 = a2 || s2.map(function(n4) {
return n4.slice(0, r3);
});
if (!u3)
return f2;
var d2 = i3.weekStart;
return f2.map(function(n4, e4) {
return f2[(e4 + (d2 || 0)) % 7];
});
}, i2 = function() {
return t2.Ls[t2.locale()];
}, a = function(n3, e3) {
return n3.formats[e3] || function(n4) {
return n4.replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g, function(n5, e4, t3) {
return e4 || t3.slice(1);
});
}(n3.formats[e3.toUpperCase()]);
}, s = function() {
var n3 = this;
return { months: function(e3) {
return e3 ? e3.format("MMMM") : u2(n3, "months");
}, monthsShort: function(e3) {
return e3 ? e3.format("MMM") : u2(n3, "monthsShort", "months", 3);
}, firstDayOfWeek: function() {
return n3.$locale().weekStart || 0;
}, weekdays: function(e3) {
return e3 ? e3.format("dddd") : u2(n3, "weekdays");
}, weekdaysMin: function(e3) {
return e3 ? e3.format("dd") : u2(n3, "weekdaysMin", "weekdays", 2);
}, weekdaysShort: function(e3) {
return e3 ? e3.format("ddd") : u2(n3, "weekdaysShort", "weekdays", 3);
}, longDateFormat: function(e3) {
return a(n3.$locale(), e3);
}, meridiem: this.$locale().meridiem, ordinal: this.$locale().ordinal };
};
r2.localeData = function() {
return s.bind(this)();
}, t2.localeData = function() {
var n3 = i2();
return { firstDayOfWeek: function() {
return n3.weekStart || 0;
}, weekdays: function() {
return t2.weekdays();
}, weekdaysShort: function() {
return t2.weekdaysShort();
}, weekdaysMin: function() {
return t2.weekdaysMin();
}, months: function() {
return t2.months();
}, monthsShort: function() {
return t2.monthsShort();
}, longDateFormat: function(e3) {
return a(n3, e3);
}, meridiem: n3.meridiem, ordinal: n3.ordinal };
}, t2.months = function() {
return u2(i2(), "months");
}, t2.monthsShort = function() {
return u2(i2(), "monthsShort", "months", 3);
}, t2.weekdays = function(n3) {
return u2(i2(), "weekdays", null, null, n3);
}, t2.weekdaysShort = function(n3) {
return u2(i2(), "weekdaysShort", "weekdays", 3, n3);
}, t2.weekdaysMin = function(n3) {
return u2(i2(), "weekdaysMin", "weekdays", 2, n3);
};
};
});
})(localeData$1);
const localeData = localeData$1.exports;
var weekYear$1 = { exports: {} };
(function(module2, exports2) {
!function(e2, t2) {
module2.exports = t2();
}(commonjsGlobal, function() {
return function(e2, t2) {
t2.prototype.weekYear = function() {
var e3 = this.month(), t3 = this.week(), n2 = this.year();
return 1 === t3 && 11 === e3 ? n2 + 1 : 0 === e3 && t3 >= 52 ? n2 - 1 : n2;
};
};
});
})(weekYear$1);
const weekYear = weekYear$1.exports;
var advancedFormat$1 = { exports: {} };
(function(module2, exports2) {
!function(e2, t2) {
module2.exports = t2();
}(commonjsGlobal, function() {
return function(e2, t2) {
var r2 = t2.prototype, n2 = r2.format;
r2.format = function(e3) {
var t3 = this, r3 = this.$locale();
if (!this.isValid())
return n2.bind(this)(e3);
var s = this.$utils(), a = (e3 || "YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g, function(e4) {
switch (e4) {
case "Q":
return Math.ceil((t3.$M + 1) / 3);
case "Do":
return r3.ordinal(t3.$D);
case "gggg":
return t3.weekYear();
case "GGGG":
return t3.isoWeekYear();
case "wo":
return r3.ordinal(t3.week(), "W");
case "w":
case "ww":
return s.s(t3.week(), "w" === e4 ? 1 : 2, "0");
case "W":
case "WW":
return s.s(t3.isoWeek(), "W" === e4 ? 1 : 2, "0");
case "k":
case "kk":
return s.s(String(0 === t3.$H ? 24 : t3.$H), "k" === e4 ? 1 : 2, "0");
case "X":
return Math.floor(t3.$d.getTime() / 1e3);
case "x":
return t3.$d.getTime();
case "z":
return "[" + t3.offsetName() + "]";
case "zzz":
return "[" + t3.offsetName("long") + "]";
default:
return e4;
}
});
return n2.bind(this)(a);
};
};
});
})(advancedFormat$1);
const advancedFormat = advancedFormat$1.exports;
var customParseFormat$1 = { exports: {} };
(function(module2, exports2) {
!function(e2, t2) {
module2.exports = t2();
}(commonjsGlobal, function() {
var e2 = { LTS: "h:mm:ss A", LT: "h:mm A", L: "MM/DD/YYYY", LL: "MMMM D, YYYY", LLL: "MMMM D, YYYY h:mm A", LLLL: "dddd, MMMM D, YYYY h:mm A" }, t2 = /(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|YYYY|YY?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g, n2 = /\d\d/, r2 = /\d\d?/, i2 = /\d*[^-_:/,()\s\d]+/, o = {}, s = function(e3) {
return (e3 = +e3) + (e3 > 68 ? 1900 : 2e3);
};
var a = function(e3) {
return function(t3) {
this[e3] = +t3;
};
}, f2 = [/[+-]\d\d:?(\d\d)?|Z/, function(e3) {
(this.zone || (this.zone = {})).offset = function(e4) {
if (!e4)
return 0;
if ("Z" === e4)
return 0;
var t3 = e4.match(/([+-]|\d\d)/g), n3 = 60 * t3[1] + (+t3[2] || 0);
return 0 === n3 ? 0 : "+" === t3[0] ? -n3 : n3;
}(e3);
}], h2 = function(e3) {
var t3 = o[e3];
return t3 && (t3.indexOf ? t3 : t3.s.concat(t3.f));
}, u2 = function(e3, t3) {
var n3, r3 = o.meridiem;
if (r3) {
for (var i3 = 1; i3 <= 24; i3 += 1)
if (e3.indexOf(r3(i3, 0, t3)) > -1) {
n3 = i3 > 12;
break;
}
} else
n3 = e3 === (t3 ? "pm" : "PM");
return n3;
}, d2 = { A: [i2, function(e3) {
this.afternoon = u2(e3, false);
}], a: [i2, function(e3) {
this.afternoon = u2(e3, true);
}], S: [/\d/, function(e3) {
this.milliseconds = 100 * +e3;
}], SS: [n2, function(e3) {
this.milliseconds = 10 * +e3;
}], SSS: [/\d{3}/, function(e3) {
this.milliseconds = +e3;
}], s: [r2, a("seconds")], ss: [r2, a("seconds")], m: [r2, a("minutes")], mm: [r2, a("minutes")], H: [r2, a("hours")], h: [r2, a("hours")], HH: [r2, a("hours")], hh: [r2, a("hours")], D: [r2, a("day")], DD: [n2, a("day")], Do: [i2, function(e3) {
var t3 = o.ordinal, n3 = e3.match(/\d+/);
if (this.day = n3[0], t3)
for (var r3 = 1; r3 <= 31; r3 += 1)
t3(r3).replace(/\[|\]/g, "") === e3 && (this.day = r3);
}], M: [r2, a("month")], MM: [n2, a("month")], MMM: [i2, function(e3) {
var t3 = h2("months"), n3 = (h2("monthsShort") || t3.map(function(e4) {
return e4.slice(0, 3);
})).indexOf(e3) + 1;
if (n3 < 1)
throw new Error();
this.month = n3 % 12 || n3;
}], MMMM: [i2, function(e3) {
var t3 = h2("months").indexOf(e3) + 1;
if (t3 < 1)
throw new Error();
this.month = t3 % 12 || t3;
}], Y: [/[+-]?\d+/, a("year")], YY: [n2, function(e3) {
this.year = s(e3);
}], YYYY: [/\d{4}/, a("year")], Z: f2, ZZ: f2 };
function c2(n3) {
var r3, i3;
r3 = n3, i3 = o && o.formats;
for (var s2 = (n3 = r3.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g, function(t3, n4, r4) {
var o2 = r4 && r4.toUpperCase();
return n4 || i3[r4] || e2[r4] || i3[o2].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g, function(e3, t4, n5) {
return t4 || n5.slice(1);
});
})).match(t2), a2 = s2.length, f3 = 0; f3 < a2; f3 += 1) {
var h3 = s2[f3], u3 = d2[h3], c3 = u3 && u3[0], l2 = u3 && u3[1];
s2[f3] = l2 ? { regex: c3, parser: l2 } : h3.replace(/^\[|\]$/g, "");
}
return function(e3) {
for (var t3 = {}, n4 = 0, r4 = 0; n4 < a2; n4 += 1) {
var i4 = s2[n4];
if ("string" == typeof i4)
r4 += i4.length;
else {
var o2 = i4.regex, f4 = i4.parser, h4 = e3.slice(r4), u4 = o2.exec(h4)[0];
f4.call(t3, u4), e3 = e3.replace(u4, "");
}
}
return function(e4) {
var t4 = e4.afternoon;
if (void 0 !== t4) {
var n5 = e4.hours;
t4 ? n5 < 12 && (e4.hours += 12) : 12 === n5 && (e4.hours = 0), delete e4.afternoon;
}
}(t3), t3;
};
}
return function(e3, t3, n3) {
n3.p.customParseFormat = true, e3 && e3.parseTwoDigitYear && (s = e3.parseTwoDigitYear);
var r3 = t3.prototype, i3 = r3.parse;
r3.parse = function(e4) {
var t4 = e4.date, r4 = e4.utc, s2 = e4.args;
this.$u = r4;
var a2 = s2[1];
if ("string" == typeof a2) {
var f3 = true === s2[2], h3 = true === s2[3], u3 = f3 || h3, d3 = s2[2];
h3 && (d3 = s2[2]), o = this.$locale(), !f3 && d3 && (o = n3.Ls[d3]), this.$d = function(e5, t5, n4) {
try {
if (["x", "X"].indexOf(t5) > -1)
return new Date(("X" === t5 ? 1e3 : 1) * e5);
var r5 = c2(t5)(e5), i4 = r5.year, o2 = r5.month, s3 = r5.day, a3 = r5.hours, f4 = r5.minutes, h4 = r5.seconds, u4 = r5.milliseconds, d4 = r5.zone, l3 = new Date(), m3 = s3 || (i4 || o2 ? 1 : l3.getDate()), M2 = i4 || l3.getFullYear(), Y = 0;
i4 && !o2 || (Y = o2 > 0 ? o2 - 1 : l3.getMonth());
var p2 = a3 || 0, v2 = f4 || 0, D = h4 || 0, g2 = u4 || 0;
return d4 ? new Date(Date.UTC(M2, Y, m3, p2, v2, D, g2 + 60 * d4.offset * 1e3)) : n4 ? new Date(Date.UTC(M2, Y, m3, p2, v2, D, g2)) : new Date(M2, Y, m3, p2, v2, D, g2);
} catch (e6) {
return new Date("");
}
}(t4, a2, r4), this.init(), d3 && true !== d3 && (this.$L = this.locale(d3).$L), u3 && t4 != this.format(a2) && (this.$d = new Date("")), o = {};
} else if (a2 instanceof Array)
for (var l2 = a2.length, m2 = 1; m2 <= l2; m2 += 1) {
s2[1] = a2[m2 - 1];
var M = n3.apply(this, s2);
if (M.isValid()) {
this.$d = M.$d, this.$L = M.$L, this.init();
break;
}
m2 === l2 && (this.$d = new Date(""));
}
else
i3.call(this, e4);
};
};
});
})(customParseFormat$1);
const customParseFormat = customParseFormat$1.exports;
dayjs.extend(customParseFormat);
dayjs.extend(advancedFormat);
dayjs.extend(weekday);
dayjs.extend(localeData);
dayjs.extend(weekOfYear);
dayjs.extend(weekYear);
dayjs.extend(function(o, c2) {
var proto2 = c2.prototype;
var oldFormat = proto2.format;
proto2.format = function f2(formatStr) {
var str = (formatStr || "").replace("Wo", "wo");
return oldFormat.bind(this)(str);
};
});
var localeMap = {
bn_BD: "bn-bd",
by_BY: "be",
en_GB: "en-gb",
en_US: "en",
fr_BE: "fr",
fr_CA: "fr-ca",
hy_AM: "hy-am",
kmr_IQ: "ku",
nl_BE: "nl-be",
pt_BR: "pt-br",
zh_CN: "zh-cn",
zh_HK: "zh-hk",
zh_TW: "zh-tw"
};
var parseLocale = function parseLocale2(locale2) {
var mapLocale = localeMap[locale2];
return mapLocale || locale2.split("_")[0];
};
var parseNoMatchNotice = function parseNoMatchNotice2() {
noteOnce(false, "Not match any format. Please help to fire a issue about this.");
};
var generateConfig = {
getNow: function getNow() {
return dayjs();
},
getFixedDate: function getFixedDate(string2) {
return dayjs(string2, ["YYYY-M-DD", "YYYY-MM-DD"]);
},
getEndDate: function getEndDate(date2) {
return date2.endOf("month");
},
getWeekDay: function getWeekDay(date2) {
var clone = date2.locale("en");
return clone.weekday() + clone.localeData().firstDayOfWeek();
},
getYear: function getYear(date2) {
return date2.year();
},
getMonth: function getMonth(date2) {
return date2.month();
},
getDate: function getDate(date2) {
return date2.date();
},
getHour: function getHour(date2) {
return date2.hour();
},
getMinute: function getMinute(date2) {
return date2.minute();
},
getSecond: function getSecond(date2) {
return date2.second();
},
addYear: function addYear(date2, diff) {
return date2.add(diff, "year");
},
addMonth: function addMonth(date2, diff) {
return date2.add(diff, "month");
},
addDate: function addDate(date2, diff) {
return date2.add(diff, "day");
},
setYear: function setYear(date2, year) {
return date2.year(year);
},
setMonth: function setMonth(date2, month) {
return date2.month(month);
},
setDate: function setDate(date2, num) {
return date2.date(num);
},
setHour: function setHour(date2, hour) {
return date2.hour(hour);
},
setMinute: function setMinute(date2, minute) {
return date2.minute(minute);
},
setSecond: function setSecond(date2, second) {
return date2.second(second);
},
isAfter: function isAfter(date1, date2) {
return date1.isAfter(date2);
},
isValidate: function isValidate(date2) {
return date2.isValid();
},
locale: {
getWeekFirstDay: function getWeekFirstDay(locale2) {
return dayjs().locale(parseLocale(locale2)).localeData().firstDayOfWeek();
},
getWeekFirstDate: function getWeekFirstDate(locale2, date2) {
return date2.locale(parseLocale(locale2)).weekday(0);
},
getWeek: function getWeek(locale2, date2) {
return date2.locale(parseLocale(locale2)).week();
},
getShortWeekDays: function getShortWeekDays(locale2) {
return dayjs().locale(parseLocale(locale2)).localeData().weekdaysMin();
},
getShortMonths: function getShortMonths(locale2) {
return dayjs().locale(parseLocale(locale2)).localeData().monthsShort();
},
format: function format2(locale2, date2, _format) {
return date2.locale(parseLocale(locale2)).format(_format);
},
parse: function parse(locale2, text, formats) {
var localeStr = parseLocale(locale2);
for (var i2 = 0; i2 < formats.length; i2 += 1) {
var format2 = formats[i2];
var formatText = text;
if (format2.includes("wo") || format2.includes("Wo")) {
var year = formatText.split("-")[0];
var weekStr = formatText.split("-")[1];
var firstWeek = dayjs(year, "YYYY").startOf("year").locale(localeStr);
for (var j2 = 0; j2 <= 52; j2 += 1) {
var nextWeek = firstWeek.add(j2, "week");
if (nextWeek.format("Wo") === weekStr) {
return nextWeek;
}
}
parseNoMatchNotice();
return null;
}
var date2 = dayjs(formatText, format2).locale(localeStr);
if (date2.isValid()) {
return date2;
}
}
if (text) {
parseNoMatchNotice();
}
return null;
}
}
};
const index$B = "";
const index$A = "";
var DatePicker$1 = generatePicker(generateConfig);
dayjs.extend(quarterOfYear);
var DateCmpt = function DateCmpt2(_a) {
var onChange = _a.onChange, format2 = _a.format, value = _a.value, style2 = _a.style, rest = __rest(_a, ["onChange", "format", "value", "style"]);
var dateFormat = getFormat(format2);
var valueObj = React$a.useMemo(function() {
return transformDateValue(value, format2, dateFormat);
}, [value]);
var handleChange = function handleChange2(dateValue, dateString) {
var newValue = dateString;
if (format2 === "week" || format2 === "quarter") {
newValue = dayjs(dateValue).format(dateFormat);
}
onChange(newValue);
};
var dateParams = {
value: valueObj,
style: Object.assign({
width: "100%"
}, style2),
onChange: handleChange
};
if (format2 === "dateTime") {
dateParams.showTime = true;
}
if (["week", "month", "quarter", "year"].indexOf(format2) > -1) {
dateParams.picker = format2;
}
if (dateFormat === format2) {
dateParams.format = format2;
}
return /* @__PURE__ */ jsx(DatePicker$1, {
...Object.assign({}, dateParams, rest)
});
};
const DatePicker = withFieldWrap(DateCmpt);
dayjs.extend(quarterOfYear);
var RangePicker$1 = DatePicker$1.RangePicker;
var DateRange = function DateRange2(_a) {
var onChange = _a.onChange, format2 = _a.format, value = _a.value, style2 = _a.style, rest = __rest(_a, ["onChange", "format", "value", "style"]);
var dateFormat = getFormat(format2);
var valueObj = React$a.useMemo(function() {
if (!value) {
return value;
}
return value.map(function(item) {
return transformDateValue(item, format2, dateFormat);
});
}, [value]);
var handleChange = function handleChange2(val, _stringList) {
var stringList = _stringList;
if (["week", "quarter"].includes(format2)) {
stringList = (val || []).map(function(item) {
return dayjs(item).format(dateFormat);
});
}
var isPass = stringList.every(function(item) {
return !!item;
});
if (!isPass) {
stringList = null;
}
onChange(stringList);
};
var dateParams = {
value: valueObj,
style: Object.assign({
width: "100%"
}, style2),
onChange: handleChange
};
if (format2 === "dateTime") {
dateParams.showTime = true;
}
if (["week", "month", "quarter", "year"].indexOf(format2) > -1) {
dateParams.picker = format2;
}
dateParams = Object.assign(Object.assign({}, dateParams), rest);
if (dateFormat === format2) {
dateParams.format = format2;
}
return /* @__PURE__ */ jsx(RangePicker$1, {
...Object.assign({}, dateParams)
});
};
const DateRange$1 = withFieldWrap(DateRange);
var TimePicker$1 = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
return /* @__PURE__ */ jsx(DatePicker$1, {
...Object.assign({}, props, {
picker: "time",
mode: void 0,
ref
})
});
});
TimePicker$1.displayName = "TimePicker";
TimePicker$1.RangePicker = /* @__PURE__ */ React__namespace.forwardRef(function(props, ref) {
return /* @__PURE__ */ jsx(DatePicker$1.RangePicker, {
...Object.assign({}, props, {
picker: "time",
mode: void 0,
ref
})
});
});
var Time = function Time2(_a) {
var onChange = _a.onChange, _a$format = _a.format, format2 = _a$format === void 0 ? "time" : _a$format, value = _a.value, style2 = _a.style, rest = __rest(_a, ["onChange", "format", "value", "style"]);
var timeFormat = getFormat(format2);
var _value = value ? dayjs(value, timeFormat) : void 0;
var handleChange = function handleChange2(_, valueStr) {
onChange(valueStr);
};
var timeParams = Object.assign({
value: _value,
style: Object.assign({
width: "100%"
}, style2),
onChange: handleChange,
format: timeFormat
}, rest);
return /* @__PURE__ */ jsx(TimePicker$1, {
...Object.assign({}, timeParams)
});
};
const TimePicker = withFieldWrap(Time);
function _slicedToArray$9(arr, i2) {
return _arrayWithHoles$9(arr) || _iterableToArrayLimit$9(arr, i2) || _unsupportedIterableToArray$b(arr, i2) || _nonIterableRest$9();
}
function _nonIterableRest$9() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$b(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$b(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$b(o, minLen);
}
function _arrayLikeToArray$b(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArrayLimit$9(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _arrayWithHoles$9(arr) {
if (Array.isArray(arr))
return arr;
}
var RangePicker = TimePicker$1.RangePicker;
var TimeRange = function TimeRange2(_ref) {
var onChange = _ref.onChange, _ref$format = _ref.format, format2 = _ref$format === void 0 ? "time" : _ref$format, value = _ref.value, style2 = _ref.style, schema2 = _ref.schema;
var _a, _b;
var timeFormat = getFormat(format2);
var _ref2 = Array.isArray(value) ? value : [], _ref3 = _slicedToArray$9(_ref2, 2), start = _ref3[0], end = _ref3[1];
var _value = start && end ? [dayjs(start, ((_a = schema2 === null || schema2 === void 0 ? void 0 : schema2.props) === null || _a === void 0 ? void 0 : _a.format) || timeFormat), dayjs(end, ((_b = schema2 === null || schema2 === void 0 ? void 0 : schema2.props) === null || _b === void 0 ? void 0 : _b.format) || timeFormat)] : [];
var handleChange = function handleChange2(_, stringList) {
var emptyList1 = stringList[0] === "" || stringList[1] === "";
var emptyList2 = stringList[0] === void 0 || stringList[1] === void 0;
if (emptyList1 || emptyList2) {
onChange(void 0);
} else {
onChange(stringList);
}
};
var timeParams = Object.assign({
style: Object.assign({
width: "100%"
}, style2),
value: _value,
onChange: handleChange
}, schema2.props || {});
return /* @__PURE__ */ jsx(RangePicker, {
...Object.assign({}, timeParams)
});
};
var PictureOutlined$2 = {};
var _typeof$g = { exports: {} };
(function(module2) {
function _typeof4(obj) {
"@babel/helpers - typeof";
return module2.exports = _typeof4 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, module2.exports.__esModule = true, module2.exports["default"] = module2.exports, _typeof4(obj);
}
module2.exports = _typeof4, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(_typeof$g);
var objectSpread2 = { exports: {} };
var defineProperty = { exports: {} };
var toPropertyKey = { exports: {} };
var toPrimitive = { exports: {} };
var hasRequiredToPrimitive;
function requireToPrimitive() {
if (hasRequiredToPrimitive)
return toPrimitive.exports;
hasRequiredToPrimitive = 1;
(function(module2) {
var _typeof4 = _typeof$g.exports["default"];
function _toPrimitive2(input, hint) {
if (_typeof4(input) !== "object" || input === null)
return input;
var prim = input[Symbol.toPrimitive];
if (prim !== void 0) {
var res = prim.call(input, hint || "default");
if (_typeof4(res) !== "object")
return res;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return (hint === "string" ? String : Number)(input);
}
module2.exports = _toPrimitive2, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(toPrimitive);
return toPrimitive.exports;
}
var hasRequiredToPropertyKey;
function requireToPropertyKey() {
if (hasRequiredToPropertyKey)
return toPropertyKey.exports;
hasRequiredToPropertyKey = 1;
(function(module2) {
var _typeof4 = _typeof$g.exports["default"];
var toPrimitive2 = requireToPrimitive();
function _toPropertyKey2(arg) {
var key2 = toPrimitive2(arg, "string");
return _typeof4(key2) === "symbol" ? key2 : String(key2);
}
module2.exports = _toPropertyKey2, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(toPropertyKey);
return toPropertyKey.exports;
}
var hasRequiredDefineProperty;
function requireDefineProperty() {
if (hasRequiredDefineProperty)
return defineProperty.exports;
hasRequiredDefineProperty = 1;
(function(module2) {
var toPropertyKey2 = requireToPropertyKey();
function _defineProperty3(obj, key2, value) {
key2 = toPropertyKey2(key2);
if (key2 in obj) {
Object.defineProperty(obj, key2, {
value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key2] = value;
}
return obj;
}
module2.exports = _defineProperty3, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(defineProperty);
return defineProperty.exports;
}
var hasRequiredObjectSpread2;
function requireObjectSpread2() {
if (hasRequiredObjectSpread2)
return objectSpread2.exports;
hasRequiredObjectSpread2 = 1;
(function(module2) {
var defineProperty2 = requireDefineProperty();
function ownKeys2(object2, enumerableOnly) {
var keys2 = Object.keys(object2);
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(object2);
enumerableOnly && (symbols = symbols.filter(function(sym) {
return Object.getOwnPropertyDescriptor(object2, sym).enumerable;
})), keys2.push.apply(keys2, symbols);
}
return keys2;
}
function _objectSpread22(target) {
for (var i2 = 1; i2 < arguments.length; i2++) {
var source = null != arguments[i2] ? arguments[i2] : {};
i2 % 2 ? ownKeys2(Object(source), true).forEach(function(key2) {
defineProperty2(target, key2, source[key2]);
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys2(Object(source)).forEach(function(key2) {
Object.defineProperty(target, key2, Object.getOwnPropertyDescriptor(source, key2));
});
}
return target;
}
module2.exports = _objectSpread22, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(objectSpread2);
return objectSpread2.exports;
}
var PictureOutlined$1 = {};
var hasRequiredPictureOutlined;
function requirePictureOutlined() {
if (hasRequiredPictureOutlined)
return PictureOutlined$1;
hasRequiredPictureOutlined = 1;
Object.defineProperty(PictureOutlined$1, "__esModule", { value: true });
var PictureOutlined2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M928 160H96c-17.7 0-32 14.3-32 32v640c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V192c0-17.7-14.3-32-32-32zm-40 632H136v-39.9l138.5-164.3 150.1 178L658.1 489 888 761.6V792zm0-129.8L664.2 396.8c-3.2-3.8-9-3.8-12.2 0L424.6 666.4l-144-170.7c-3.2-3.8-9-3.8-12.2 0L136 652.7V232h752v430.2zM304 456a88 88 0 100-176 88 88 0 000 176zm0-116c15.5 0 28 12.5 28 28s-12.5 28-28 28-28-12.5-28-28 12.5-28 28-28z" } }] }, "name": "picture", "theme": "outlined" };
PictureOutlined$1.default = PictureOutlined2;
return PictureOutlined$1;
}
var AntdIcon = {};
var slicedToArray = { exports: {} };
var arrayWithHoles = { exports: {} };
var hasRequiredArrayWithHoles;
function requireArrayWithHoles() {
if (hasRequiredArrayWithHoles)
return arrayWithHoles.exports;
hasRequiredArrayWithHoles = 1;
(function(module2) {
function _arrayWithHoles2(arr) {
if (Array.isArray(arr))
return arr;
}
module2.exports = _arrayWithHoles2, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(arrayWithHoles);
return arrayWithHoles.exports;
}
var iterableToArrayLimit = { exports: {} };
var hasRequiredIterableToArrayLimit;
function requireIterableToArrayLimit() {
if (hasRequiredIterableToArrayLimit)
return iterableToArrayLimit.exports;
hasRequiredIterableToArrayLimit = 1;
(function(module2) {
function _iterableToArrayLimit2(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i["return"] && (_r = _i["return"](), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
module2.exports = _iterableToArrayLimit2, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(iterableToArrayLimit);
return iterableToArrayLimit.exports;
}
var unsupportedIterableToArray = { exports: {} };
var arrayLikeToArray = { exports: {} };
var hasRequiredArrayLikeToArray;
function requireArrayLikeToArray() {
if (hasRequiredArrayLikeToArray)
return arrayLikeToArray.exports;
hasRequiredArrayLikeToArray = 1;
(function(module2) {
function _arrayLikeToArray2(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
module2.exports = _arrayLikeToArray2, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(arrayLikeToArray);
return arrayLikeToArray.exports;
}
var hasRequiredUnsupportedIterableToArray;
function requireUnsupportedIterableToArray() {
if (hasRequiredUnsupportedIterableToArray)
return unsupportedIterableToArray.exports;
hasRequiredUnsupportedIterableToArray = 1;
(function(module2) {
var arrayLikeToArray2 = requireArrayLikeToArray();
function _unsupportedIterableToArray2(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return arrayLikeToArray2(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return arrayLikeToArray2(o, minLen);
}
module2.exports = _unsupportedIterableToArray2, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(unsupportedIterableToArray);
return unsupportedIterableToArray.exports;
}
var nonIterableRest = { exports: {} };
var hasRequiredNonIterableRest;
function requireNonIterableRest() {
if (hasRequiredNonIterableRest)
return nonIterableRest.exports;
hasRequiredNonIterableRest = 1;
(function(module2) {
function _nonIterableRest2() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
module2.exports = _nonIterableRest2, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(nonIterableRest);
return nonIterableRest.exports;
}
var hasRequiredSlicedToArray;
function requireSlicedToArray() {
if (hasRequiredSlicedToArray)
return slicedToArray.exports;
hasRequiredSlicedToArray = 1;
(function(module2) {
var arrayWithHoles2 = requireArrayWithHoles();
var iterableToArrayLimit2 = requireIterableToArrayLimit();
var unsupportedIterableToArray2 = requireUnsupportedIterableToArray();
var nonIterableRest2 = requireNonIterableRest();
function _slicedToArray2(arr, i2) {
return arrayWithHoles2(arr) || iterableToArrayLimit2(arr, i2) || unsupportedIterableToArray2(arr, i2) || nonIterableRest2();
}
module2.exports = _slicedToArray2, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(slicedToArray);
return slicedToArray.exports;
}
var objectWithoutProperties = { exports: {} };
var objectWithoutPropertiesLoose = { exports: {} };
var hasRequiredObjectWithoutPropertiesLoose;
function requireObjectWithoutPropertiesLoose() {
if (hasRequiredObjectWithoutPropertiesLoose)
return objectWithoutPropertiesLoose.exports;
hasRequiredObjectWithoutPropertiesLoose = 1;
(function(module2) {
function _objectWithoutPropertiesLoose2(source, excluded) {
if (source == null)
return {};
var target = {};
var sourceKeys = Object.keys(source);
var key2, i2;
for (i2 = 0; i2 < sourceKeys.length; i2++) {
key2 = sourceKeys[i2];
if (excluded.indexOf(key2) >= 0)
continue;
target[key2] = source[key2];
}
return target;
}
module2.exports = _objectWithoutPropertiesLoose2, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(objectWithoutPropertiesLoose);
return objectWithoutPropertiesLoose.exports;
}
var hasRequiredObjectWithoutProperties;
function requireObjectWithoutProperties() {
if (hasRequiredObjectWithoutProperties)
return objectWithoutProperties.exports;
hasRequiredObjectWithoutProperties = 1;
(function(module2) {
var objectWithoutPropertiesLoose2 = requireObjectWithoutPropertiesLoose();
function _objectWithoutProperties2(source, excluded) {
if (source == null)
return {};
var target = objectWithoutPropertiesLoose2(source, excluded);
var key2, i2;
if (Object.getOwnPropertySymbols) {
var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
for (i2 = 0; i2 < sourceSymbolKeys.length; i2++) {
key2 = sourceSymbolKeys[i2];
if (excluded.indexOf(key2) >= 0)
continue;
if (!Object.prototype.propertyIsEnumerable.call(source, key2))
continue;
target[key2] = source[key2];
}
}
return target;
}
module2.exports = _objectWithoutProperties2, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
})(objectWithoutProperties);
return objectWithoutProperties.exports;
}
var Context = {};
var hasRequiredContext;
function requireContext() {
if (hasRequiredContext)
return Context;
hasRequiredContext = 1;
Object.defineProperty(Context, "__esModule", {
value: true
});
Context.default = void 0;
var _react = React__default.default;
var IconContext2 = /* @__PURE__ */ (0, _react.createContext)({});
var _default2 = IconContext2;
Context.default = _default2;
return Context;
}
var IconBase = {};
var utils$1 = {};
const require$$3 = /* @__PURE__ */ getAugmentedNamespace(index_esm);
var warning = {};
var hasRequiredWarning;
function requireWarning() {
if (hasRequiredWarning)
return warning;
hasRequiredWarning = 1;
Object.defineProperty(warning, "__esModule", {
value: true
});
warning.call = call2;
warning.default = void 0;
warning.note = note2;
warning.noteOnce = noteOnce2;
warning.preMessage = void 0;
warning.resetWarned = resetWarned2;
warning.warning = warning$12;
warning.warningOnce = warningOnce2;
var warned2 = {};
var preMessage2 = function preMessage3(fn) {
};
warning.preMessage = preMessage2;
function warning$12(valid, message) {
}
function note2(valid, message) {
}
function resetWarned2() {
warned2 = {};
}
function call2(method2, valid, message) {
if (!valid && !warned2[message]) {
method2(false, message);
warned2[message] = true;
}
}
function warningOnce2(valid, message) {
call2(warning$12, valid, message);
}
function noteOnce2(valid, message) {
call2(note2, valid, message);
}
warningOnce2.preMessage = preMessage2;
warningOnce2.resetWarned = resetWarned2;
warningOnce2.noteOnce = noteOnce2;
var _default2 = warningOnce2;
warning.default = _default2;
return warning;
}
var dynamicCSS = {};
var canUseDom = {};
var hasRequiredCanUseDom;
function requireCanUseDom() {
if (hasRequiredCanUseDom)
return canUseDom;
hasRequiredCanUseDom = 1;
Object.defineProperty(canUseDom, "__esModule", {
value: true
});
canUseDom.default = canUseDom$12;
function canUseDom$12() {
return !!(typeof window !== "undefined" && window.document && window.document.createElement);
}
return canUseDom;
}
var contains = {};
var hasRequiredContains;
function requireContains() {
if (hasRequiredContains)
return contains;
hasRequiredContains = 1;
Object.defineProperty(contains, "__esModule", {
value: true
});
contains.default = contains$12;
function contains$12(root2, n2) {
if (!root2) {
return false;
}
if (root2.contains) {
return root2.contains(n2);
}
var node = n2;
while (node) {
if (node === root2) {
return true;
}
node = node.parentNode;
}
return false;
}
return contains;
}
var hasRequiredDynamicCSS;
function requireDynamicCSS() {
if (hasRequiredDynamicCSS)
return dynamicCSS;
hasRequiredDynamicCSS = 1;
var _interopRequireDefault2 = interopRequireDefault.exports.default;
Object.defineProperty(dynamicCSS, "__esModule", {
value: true
});
dynamicCSS.clearContainerCache = clearContainerCache;
dynamicCSS.injectCSS = injectCSS2;
dynamicCSS.removeCSS = removeCSS2;
dynamicCSS.updateCSS = updateCSS2;
var _canUseDom = _interopRequireDefault2(requireCanUseDom());
var _contains = _interopRequireDefault2(requireContains());
var APPEND_ORDER2 = "data-rc-order";
var MARK_KEY2 = "rc-util-key";
var containerCache2 = /* @__PURE__ */ new Map();
function getMark2() {
var _ref = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}, mark = _ref.mark;
if (mark) {
return mark.startsWith("data-") ? mark : "data-".concat(mark);
}
return MARK_KEY2;
}
function getContainer2(option) {
if (option.attachTo) {
return option.attachTo;
}
var head = document.querySelector("head");
return head || document.body;
}
function getOrder2(prepend) {
if (prepend === "queue") {
return "prependQueue";
}
return prepend ? "prepend" : "append";
}
function findStyles2(container) {
return Array.from((containerCache2.get(container) || container).children).filter(function(node) {
return node.tagName === "STYLE";
});
}
function injectCSS2(css2) {
var option = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
if (!(0, _canUseDom.default)()) {
return null;
}
var csp = option.csp, prepend = option.prepend;
var styleNode = document.createElement("style");
styleNode.setAttribute(APPEND_ORDER2, getOrder2(prepend));
if (csp !== null && csp !== void 0 && csp.nonce) {
styleNode.nonce = csp === null || csp === void 0 ? void 0 : csp.nonce;
}
styleNode.innerHTML = css2;
var container = getContainer2(option);
var firstChild = container.firstChild;
if (prepend) {
if (prepend === "queue") {
var existStyle = findStyles2(container).filter(function(node) {
return ["prepend", "prependQueue"].includes(node.getAttribute(APPEND_ORDER2));
});
if (existStyle.length) {
container.insertBefore(styleNode, existStyle[existStyle.length - 1].nextSibling);
return styleNode;
}
}
container.insertBefore(styleNode, firstChild);
} else {
container.appendChild(styleNode);
}
return styleNode;
}
function findExistNode2(key2) {
var option = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var container = getContainer2(option);
return findStyles2(container).find(function(node) {
return node.getAttribute(getMark2(option)) === key2;
});
}
function removeCSS2(key2) {
var option = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var existNode = findExistNode2(key2, option);
if (existNode) {
var container = getContainer2(option);
container.removeChild(existNode);
}
}
function syncRealContainer2(container, option) {
var cachedRealContainer = containerCache2.get(container);
if (!cachedRealContainer || !(0, _contains.default)(document, cachedRealContainer)) {
var placeholderStyle = injectCSS2("", option);
var parentNode = placeholderStyle.parentNode;
containerCache2.set(container, parentNode);
container.removeChild(placeholderStyle);
}
}
function clearContainerCache() {
containerCache2.clear();
}
function updateCSS2(css2, key2) {
var option = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
var container = getContainer2(option);
syncRealContainer2(container, option);
var existNode = findExistNode2(key2, option);
if (existNode) {
var _option$csp, _option$csp2;
if ((_option$csp = option.csp) !== null && _option$csp !== void 0 && _option$csp.nonce && existNode.nonce !== ((_option$csp2 = option.csp) === null || _option$csp2 === void 0 ? void 0 : _option$csp2.nonce)) {
var _option$csp3;
existNode.nonce = (_option$csp3 = option.csp) === null || _option$csp3 === void 0 ? void 0 : _option$csp3.nonce;
}
if (existNode.innerHTML !== css2) {
existNode.innerHTML = css2;
}
return existNode;
}
var newNode = injectCSS2(css2, option);
newNode.setAttribute(getMark2(option), key2);
return newNode;
}
return dynamicCSS;
}
var hasRequiredUtils;
function requireUtils() {
if (hasRequiredUtils)
return utils$1;
hasRequiredUtils = 1;
var _interopRequireDefault2 = interopRequireDefault.exports;
var _typeof32 = _typeof$g.exports;
Object.defineProperty(utils$1, "__esModule", {
value: true
});
utils$1.generate = generate2;
utils$1.getSecondaryColor = getSecondaryColor2;
utils$1.iconStyles = void 0;
utils$1.isIconDefinition = isIconDefinition2;
utils$1.normalizeAttrs = normalizeAttrs2;
utils$1.normalizeTwoToneColors = normalizeTwoToneColors2;
utils$1.useInsertStyles = utils$1.svgBaseProps = void 0;
utils$1.warning = warning2;
var _objectSpread22 = _interopRequireDefault2(requireObjectSpread2());
var _typeof22 = _interopRequireDefault2(_typeof$g.exports);
var _colors = require$$3;
var _react = _interopRequireWildcard2(React__default.default);
var _warning = _interopRequireDefault2(requireWarning());
var _dynamicCSS = requireDynamicCSS();
var _Context = _interopRequireDefault2(requireContext());
function _getRequireWildcardCache2(nodeInterop) {
if (typeof WeakMap !== "function")
return null;
var cacheBabelInterop = /* @__PURE__ */ new WeakMap();
var cacheNodeInterop = /* @__PURE__ */ new WeakMap();
return (_getRequireWildcardCache2 = function _getRequireWildcardCache3(nodeInterop2) {
return nodeInterop2 ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard2(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || _typeof32(obj) !== "object" && typeof obj !== "function") {
return { default: obj };
}
var cache = _getRequireWildcardCache2(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for (var key2 in obj) {
if (key2 !== "default" && Object.prototype.hasOwnProperty.call(obj, key2)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key2) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key2, desc);
} else {
newObj[key2] = obj[key2];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
function warning2(valid, message) {
(0, _warning.default)(valid, "[@ant-design/icons] ".concat(message));
}
function isIconDefinition2(target) {
return (0, _typeof22.default)(target) === "object" && typeof target.name === "string" && typeof target.theme === "string" && ((0, _typeof22.default)(target.icon) === "object" || typeof target.icon === "function");
}
function normalizeAttrs2() {
var attrs = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
return Object.keys(attrs).reduce(function(acc, key2) {
var val = attrs[key2];
switch (key2) {
case "class":
acc.className = val;
delete acc.class;
break;
default:
acc[key2] = val;
}
return acc;
}, {});
}
function generate2(node, key2, rootProps) {
if (!rootProps) {
return /* @__PURE__ */ _react.default.createElement(node.tag, (0, _objectSpread22.default)({
key: key2
}, normalizeAttrs2(node.attrs)), (node.children || []).map(function(child, index2) {
return generate2(child, "".concat(key2, "-").concat(node.tag, "-").concat(index2));
}));
}
return /* @__PURE__ */ _react.default.createElement(node.tag, (0, _objectSpread22.default)((0, _objectSpread22.default)({
key: key2
}, normalizeAttrs2(node.attrs)), rootProps), (node.children || []).map(function(child, index2) {
return generate2(child, "".concat(key2, "-").concat(node.tag, "-").concat(index2));
}));
}
function getSecondaryColor2(primaryColor) {
return (0, _colors.generate)(primaryColor)[0];
}
function normalizeTwoToneColors2(twoToneColor) {
if (!twoToneColor) {
return [];
}
return Array.isArray(twoToneColor) ? twoToneColor : [twoToneColor];
}
var svgBaseProps = {
width: "1em",
height: "1em",
fill: "currentColor",
"aria-hidden": "true",
focusable: "false"
};
utils$1.svgBaseProps = svgBaseProps;
var iconStyles2 = "\n.anticon {\n display: inline-block;\n color: inherit;\n font-style: normal;\n line-height: 0;\n text-align: center;\n text-transform: none;\n vertical-align: -0.125em;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n.anticon > * {\n line-height: 1;\n}\n\n.anticon svg {\n display: inline-block;\n}\n\n.anticon::before {\n display: none;\n}\n\n.anticon .anticon-icon {\n display: block;\n}\n\n.anticon[tabindex] {\n cursor: pointer;\n}\n\n.anticon-spin::before,\n.anticon-spin {\n display: inline-block;\n -webkit-animation: loadingCircle 1s infinite linear;\n animation: loadingCircle 1s infinite linear;\n}\n\n@-webkit-keyframes loadingCircle {\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n\n@keyframes loadingCircle {\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n";
utils$1.iconStyles = iconStyles2;
var useInsertStyles2 = function useInsertStyles3() {
var styleStr = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : iconStyles2;
var _useContext = (0, _react.useContext)(_Context.default), csp = _useContext.csp;
(0, _react.useEffect)(function() {
(0, _dynamicCSS.updateCSS)(styleStr, "@ant-design-icons", {
prepend: true,
csp
});
}, []);
};
utils$1.useInsertStyles = useInsertStyles2;
return utils$1;
}
var hasRequiredIconBase;
function requireIconBase() {
if (hasRequiredIconBase)
return IconBase;
hasRequiredIconBase = 1;
var _interopRequireDefault2 = interopRequireDefault.exports;
Object.defineProperty(IconBase, "__esModule", {
value: true
});
IconBase.default = void 0;
var _objectWithoutProperties2 = _interopRequireDefault2(requireObjectWithoutProperties());
var _objectSpread22 = _interopRequireDefault2(requireObjectSpread2());
var _utils = requireUtils();
var _excluded4 = ["icon", "className", "onClick", "style", "primaryColor", "secondaryColor"];
var twoToneColorPalette2 = {
primaryColor: "#333",
secondaryColor: "#E6E6E6",
calculated: false
};
function setTwoToneColors2(_ref) {
var primaryColor = _ref.primaryColor, secondaryColor = _ref.secondaryColor;
twoToneColorPalette2.primaryColor = primaryColor;
twoToneColorPalette2.secondaryColor = secondaryColor || (0, _utils.getSecondaryColor)(primaryColor);
twoToneColorPalette2.calculated = !!secondaryColor;
}
function getTwoToneColors2() {
return (0, _objectSpread22.default)({}, twoToneColorPalette2);
}
var IconBase$12 = function IconBase2(props) {
var icon = props.icon, className = props.className, onClick = props.onClick, style2 = props.style, primaryColor = props.primaryColor, secondaryColor = props.secondaryColor, restProps = (0, _objectWithoutProperties2.default)(props, _excluded4);
var colors = twoToneColorPalette2;
if (primaryColor) {
colors = {
primaryColor,
secondaryColor: secondaryColor || (0, _utils.getSecondaryColor)(primaryColor)
};
}
(0, _utils.useInsertStyles)();
(0, _utils.warning)((0, _utils.isIconDefinition)(icon), "icon should be icon definiton, but got ".concat(icon));
if (!(0, _utils.isIconDefinition)(icon)) {
return null;
}
var target = icon;
if (target && typeof target.icon === "function") {
target = (0, _objectSpread22.default)((0, _objectSpread22.default)({}, target), {}, {
icon: target.icon(colors.primaryColor, colors.secondaryColor)
});
}
return (0, _utils.generate)(target.icon, "svg-".concat(target.name), (0, _objectSpread22.default)({
className,
onClick,
style: style2,
"data-icon": target.name,
width: "1em",
height: "1em",
fill: "currentColor",
"aria-hidden": "true"
}, restProps));
};
IconBase$12.displayName = "IconReact";
IconBase$12.getTwoToneColors = getTwoToneColors2;
IconBase$12.setTwoToneColors = setTwoToneColors2;
var _default2 = IconBase$12;
IconBase.default = _default2;
return IconBase;
}
var twoTonePrimaryColor = {};
var hasRequiredTwoTonePrimaryColor;
function requireTwoTonePrimaryColor() {
if (hasRequiredTwoTonePrimaryColor)
return twoTonePrimaryColor;
hasRequiredTwoTonePrimaryColor = 1;
var _interopRequireDefault2 = interopRequireDefault.exports;
Object.defineProperty(twoTonePrimaryColor, "__esModule", {
value: true
});
twoTonePrimaryColor.getTwoToneColor = getTwoToneColor2;
twoTonePrimaryColor.setTwoToneColor = setTwoToneColor2;
var _slicedToArray2 = _interopRequireDefault2(requireSlicedToArray());
var _IconBase = _interopRequireDefault2(requireIconBase());
var _utils = requireUtils();
function setTwoToneColor2(twoToneColor) {
var _normalizeTwoToneColo = (0, _utils.normalizeTwoToneColors)(twoToneColor), _normalizeTwoToneColo2 = (0, _slicedToArray2.default)(_normalizeTwoToneColo, 2), primaryColor = _normalizeTwoToneColo2[0], secondaryColor = _normalizeTwoToneColo2[1];
return _IconBase.default.setTwoToneColors({
primaryColor,
secondaryColor
});
}
function getTwoToneColor2() {
var colors = _IconBase.default.getTwoToneColors();
if (!colors.calculated) {
return colors.primaryColor;
}
return [colors.primaryColor, colors.secondaryColor];
}
return twoTonePrimaryColor;
}
var hasRequiredAntdIcon;
function requireAntdIcon() {
if (hasRequiredAntdIcon)
return AntdIcon;
hasRequiredAntdIcon = 1;
var _interopRequireDefault2 = interopRequireDefault.exports;
var _typeof4 = _typeof$g.exports;
Object.defineProperty(AntdIcon, "__esModule", {
value: true
});
AntdIcon.default = void 0;
var _objectSpread22 = _interopRequireDefault2(requireObjectSpread2());
var _slicedToArray2 = _interopRequireDefault2(requireSlicedToArray());
var _defineProperty22 = _interopRequireDefault2(requireDefineProperty());
var _objectWithoutProperties2 = _interopRequireDefault2(requireObjectWithoutProperties());
var React3 = _interopRequireWildcard2(React__default.default);
var _classnames = _interopRequireDefault2(classnames$1.exports);
var _Context = _interopRequireDefault2(requireContext());
var _IconBase = _interopRequireDefault2(requireIconBase());
var _twoTonePrimaryColor = requireTwoTonePrimaryColor();
var _utils = requireUtils();
var _excluded4 = ["className", "icon", "spin", "rotate", "tabIndex", "onClick", "twoToneColor"];
function _getRequireWildcardCache2(nodeInterop) {
if (typeof WeakMap !== "function")
return null;
var cacheBabelInterop = /* @__PURE__ */ new WeakMap();
var cacheNodeInterop = /* @__PURE__ */ new WeakMap();
return (_getRequireWildcardCache2 = function _getRequireWildcardCache3(nodeInterop2) {
return nodeInterop2 ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard2(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || _typeof4(obj) !== "object" && typeof obj !== "function") {
return { default: obj };
}
var cache = _getRequireWildcardCache2(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for (var key2 in obj) {
if (key2 !== "default" && Object.prototype.hasOwnProperty.call(obj, key2)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key2) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key2, desc);
} else {
newObj[key2] = obj[key2];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
(0, _twoTonePrimaryColor.setTwoToneColor)("#1890ff");
var Icon2 = /* @__PURE__ */ React3.forwardRef(function(props, ref) {
var _classNames;
var className = props.className, icon = props.icon, spin = props.spin, rotate = props.rotate, tabIndex = props.tabIndex, onClick = props.onClick, twoToneColor = props.twoToneColor, restProps = (0, _objectWithoutProperties2.default)(props, _excluded4);
var _React$useContext = React3.useContext(_Context.default), _React$useContext$pre = _React$useContext.prefixCls, prefixCls = _React$useContext$pre === void 0 ? "anticon" : _React$useContext$pre, rootClassName = _React$useContext.rootClassName;
var classString = (0, _classnames.default)(rootClassName, prefixCls, (_classNames = {}, (0, _defineProperty22.default)(_classNames, "".concat(prefixCls, "-").concat(icon.name), !!icon.name), (0, _defineProperty22.default)(_classNames, "".concat(prefixCls, "-spin"), !!spin || icon.name === "loading"), _classNames), className);
var iconTabIndex = tabIndex;
if (iconTabIndex === void 0 && onClick) {
iconTabIndex = -1;
}
var svgStyle = rotate ? {
msTransform: "rotate(".concat(rotate, "deg)"),
transform: "rotate(".concat(rotate, "deg)")
} : void 0;
var _normalizeTwoToneColo = (0, _utils.normalizeTwoToneColors)(twoToneColor), _normalizeTwoToneColo2 = (0, _slicedToArray2.default)(_normalizeTwoToneColo, 2), primaryColor = _normalizeTwoToneColo2[0], secondaryColor = _normalizeTwoToneColo2[1];
return /* @__PURE__ */ React3.createElement("span", (0, _objectSpread22.default)((0, _objectSpread22.default)({
role: "img",
"aria-label": icon.name
}, restProps), {}, {
ref,
tabIndex: iconTabIndex,
onClick,
className: classString
}), /* @__PURE__ */ React3.createElement(_IconBase.default, {
icon,
primaryColor,
secondaryColor,
style: svgStyle
}));
});
Icon2.displayName = "AntdIcon";
Icon2.getTwoToneColor = _twoTonePrimaryColor.getTwoToneColor;
Icon2.setTwoToneColor = _twoTonePrimaryColor.setTwoToneColor;
var _default2 = Icon2;
AntdIcon.default = _default2;
return AntdIcon;
}
var _interopRequireDefault$8 = interopRequireDefault.exports;
var _typeof$f = _typeof$g.exports;
Object.defineProperty(PictureOutlined$2, "__esModule", {
value: true
});
var default_1$8 = PictureOutlined$2.default = void 0;
var _objectSpread2$8 = _interopRequireDefault$8(requireObjectSpread2());
var React$8 = _interopRequireWildcard$8(React__default.default);
var _PictureOutlined = _interopRequireDefault$8(requirePictureOutlined());
var _AntdIcon$8 = _interopRequireDefault$8(requireAntdIcon());
function _getRequireWildcardCache$8(nodeInterop) {
if (typeof WeakMap !== "function")
return null;
var cacheBabelInterop = /* @__PURE__ */ new WeakMap();
var cacheNodeInterop = /* @__PURE__ */ new WeakMap();
return (_getRequireWildcardCache$8 = function _getRequireWildcardCache2(nodeInterop2) {
return nodeInterop2 ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard$8(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || _typeof$f(obj) !== "object" && typeof obj !== "function") {
return { default: obj };
}
var cache = _getRequireWildcardCache$8(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for (var key2 in obj) {
if (key2 !== "default" && Object.prototype.hasOwnProperty.call(obj, key2)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key2) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key2, desc);
} else {
newObj[key2] = obj[key2];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
var PictureOutlined = function PictureOutlined2(props, ref) {
return /* @__PURE__ */ React$8.createElement(_AntdIcon$8.default, (0, _objectSpread2$8.default)((0, _objectSpread2$8.default)({}, props), {}, {
ref,
icon: _PictureOutlined.default
}));
};
PictureOutlined.displayName = "PictureOutlined";
var _default$8 = /* @__PURE__ */ React$8.forwardRef(PictureOutlined);
default_1$8 = PictureOutlined$2.default = _default$8;
const index$z = "";
const index$y = "";
var DEFAULT_IMG = "https://img.alicdn.com/tfs/TB14tSiKhTpK1RjSZFKXXa2wXXa-354-330.png";
var PreviewNode = function PreviewNode2(_ref) {
var value = _ref.value;
var configCtx = React$a.useContext(_ConfigProvider.ConfigContext);
var t2 = translation(configCtx);
return /* @__PURE__ */ React__default.default.createElement(_Popover, {
content: /* @__PURE__ */ jsx("img", {
src: value || DEFAULT_IMG,
alt: t2("img_src_error"),
className: "fr-preview-image"
}),
className: "fr-preview",
placement: "bottom"
}, /* @__PURE__ */ React__default.default.createElement(default_1$8, null));
};
var ImageInput = function ImageInput2(_a) {
var value = _a.value, rest = __rest(_a, ["value"]);
return /* @__PURE__ */ React__default.default.createElement(Input$2, Object.assign({
value,
addonAfter: /* @__PURE__ */ jsx(PreviewNode, {
value
})
}, rest));
};
const ImageInput$1 = withFieldWrap(ImageInput);
var UrlNode = function UrlNode2(props) {
var configCtx = React$a.useContext(_ConfigProvider.ConfigContext);
var t2 = translation(configCtx);
var value = props.value, _props$addonText = props.addonText, addonText = _props$addonText === void 0 ? t2("test_src") : _props$addonText;
var useUrl = isUrl(value);
if (useUrl) {
return /* @__PURE__ */ jsx("a", {
target: "_blank",
href: value,
children: addonText
});
}
return /* @__PURE__ */ jsx("div", {
children: addonText
});
};
var UrlInput = function UrlInput2(_a) {
var value = _a.value, prefix = _a.prefix, suffix = _a.suffix, addonText = _a.addonText, onChange = _a.onChange, rest = __rest(_a, ["value", "prefix", "suffix", "addonText", "onChange"]);
var _value = value || "";
if (prefix) {
_value = _value.replace(prefix, "");
}
if (suffix) {
_value = _value.replace(suffix, "");
}
var handleChange = function handleChange2(e2) {
var _value2 = e2.target.value;
if (!_value2) {
onChange === null || onChange === void 0 ? void 0 : onChange(_value2);
return;
}
if (prefix) {
_value2 = prefix + _value2;
}
if (suffix) {
_value2 = _value2 + suffix;
}
onChange === null || onChange === void 0 ? void 0 : onChange(_value2);
};
return /* @__PURE__ */ React__default.default.createElement(Input$2, Object.assign({
value: _value,
prefix,
suffix,
onChange: handleChange,
addonAfter: /* @__PURE__ */ jsx(UrlNode, {
value,
addonText
})
}, rest));
};
const UrlInput$1 = withFieldWrap(UrlInput);
const index$x = "";
const index$w = "";
var SliderWithNumber = function SliderWithNumber2(_a) {
var schema2 = _a.schema, value = _a.value, onChange = _a.onChange, hideInput = _a.hideInput, inputProps = _a.inputProps, style2 = _a.style, rest = __rest(_a, ["schema", "value", "onChange", "hideInput", "inputProps", "style"]);
var max = schema2.max, min = schema2.min, step2 = schema2.step;
var setting = {};
if (max || max === 0) {
setting = {
max
};
}
if (min || min === 0) {
setting = Object.assign(Object.assign({}, setting), {
min
});
}
if (step2) {
setting = Object.assign(Object.assign({}, setting), {
step: step2
});
}
return /* @__PURE__ */ React__default.default.createElement("div", {
className: "fr-slider",
style: style2
}, /* @__PURE__ */ React__default.default.createElement(_Slider, Object.assign({
style: {
flexGrow: 1,
marginRight: hideInput ? 0 : 12
}
}, setting, {
onChange,
value: typeof value === "number" ? value : min || 0
}, rest)), hideInput ? null : /* @__PURE__ */ React__default.default.createElement(_InputNumber, Object.assign({}, setting, inputProps, {
style: {
width: "90px"
},
value,
onChange
})));
};
const Slider = withFieldWrap(SliderWithNumber, ["addons", "dependValues"]);
const index$v = "";
const index$u = "";
var UploadOutlined$2 = {};
var UploadOutlined$1 = {};
var hasRequiredUploadOutlined;
function requireUploadOutlined() {
if (hasRequiredUploadOutlined)
return UploadOutlined$1;
hasRequiredUploadOutlined = 1;
Object.defineProperty(UploadOutlined$1, "__esModule", { value: true });
var UploadOutlined2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M400 317.7h73.9V656c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V317.7H624c6.7 0 10.4-7.7 6.3-12.9L518.3 163a8 8 0 00-12.6 0l-112 141.7c-4.1 5.3-.4 13 6.3 13zM878 626h-60c-4.4 0-8 3.6-8 8v154H214V634c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v198c0 17.7 14.3 32 32 32h684c17.7 0 32-14.3 32-32V634c0-4.4-3.6-8-8-8z" } }] }, "name": "upload", "theme": "outlined" };
UploadOutlined$1.default = UploadOutlined2;
return UploadOutlined$1;
}
var _interopRequireDefault$7 = interopRequireDefault.exports;
var _typeof$e = _typeof$g.exports;
Object.defineProperty(UploadOutlined$2, "__esModule", {
value: true
});
var default_1$7 = UploadOutlined$2.default = void 0;
var _objectSpread2$7 = _interopRequireDefault$7(requireObjectSpread2());
var React$7 = _interopRequireWildcard$7(React__default.default);
var _UploadOutlined = _interopRequireDefault$7(requireUploadOutlined());
var _AntdIcon$7 = _interopRequireDefault$7(requireAntdIcon());
function _getRequireWildcardCache$7(nodeInterop) {
if (typeof WeakMap !== "function")
return null;
var cacheBabelInterop = /* @__PURE__ */ new WeakMap();
var cacheNodeInterop = /* @__PURE__ */ new WeakMap();
return (_getRequireWildcardCache$7 = function _getRequireWildcardCache2(nodeInterop2) {
return nodeInterop2 ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard$7(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || _typeof$e(obj) !== "object" && typeof obj !== "function") {
return { default: obj };
}
var cache = _getRequireWildcardCache$7(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for (var key2 in obj) {
if (key2 !== "default" && Object.prototype.hasOwnProperty.call(obj, key2)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key2) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key2, desc);
} else {
newObj[key2] = obj[key2];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
var UploadOutlined = function UploadOutlined2(props, ref) {
return /* @__PURE__ */ React$7.createElement(_AntdIcon$7.default, (0, _objectSpread2$7.default)((0, _objectSpread2$7.default)({}, props), {}, {
ref,
icon: _UploadOutlined.default
}));
};
UploadOutlined.displayName = "UploadOutlined";
var _default$7 = /* @__PURE__ */ React$7.forwardRef(UploadOutlined);
default_1$7 = UploadOutlined$2.default = _default$7;
const index$t = "";
var FrUpload = function FrUpload2(_ref) {
var action = _ref.action, value = _ref.value, _onChange = _ref.onChange, uploadProps = _ref.uploadProps, buttonProps = _ref.buttonProps, schema2 = _ref.schema;
var configCtx = React$a.useContext(_ConfigProvider.ConfigContext);
var t2 = translation(configCtx);
var props = Object.assign({
name: "file",
type: "file",
action,
onChange: function onChange(info) {
if (info.file.status === "done") {
_message.success("".concat(info.file.name, " ").concat(t2("upload_success")));
var path2 = get(schema2, "props.path", "");
var url = path2 ? get(info.file.response, path2) : info.file.response.url;
_onChange(url);
} else if (info.file.status === "error") {
_message.error("".concat(info.file.name, " ").concat(t2("upload_fail")));
}
},
onRemove: function onRemove() {
_onChange("");
}
}, uploadProps);
var defaultBtnProps = {
icon: /* @__PURE__ */ React__default.default.createElement(default_1$7, null),
children: t2("upload")
};
var btnProps = Object.assign(Object.assign({}, defaultBtnProps), buttonProps);
return /* @__PURE__ */ React__default.default.createElement("div", {
className: "fr-upload-mod"
}, /* @__PURE__ */ React__default.default.createElement(_Upload, Object.assign({}, props, {
className: "fr-upload-file"
}), /* @__PURE__ */ React__default.default.createElement(Button$2, Object.assign({}, btnProps))), value && /* @__PURE__ */ jsx("a", {
href: value,
target: "_blank",
rel: "noopener noreferrer",
className: "fr-upload-preview",
children: t2("uploaded_address")
}));
};
const index$s = "";
function _extends() {
_extends = Object.assign ? Object.assign.bind() : function(target) {
for (var i2 = 1; i2 < arguments.length; i2++) {
var source = arguments[i2];
for (var key2 in source) {
if (Object.prototype.hasOwnProperty.call(source, key2)) {
target[key2] = source[key2];
}
}
}
return target;
};
return _extends.apply(this, arguments);
}
function _typeof$d(obj) {
"@babel/helpers - typeof";
return _typeof$d = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof$d(obj);
}
function html(_ref) {
var value = _ref.value, options = _ref.options, _ref$schema = _ref.schema, schema2 = _ref$schema === void 0 ? {} : _ref$schema;
var __html = "-";
if (schema2.type === "boolean") {
__html = value === true ? "\u2714" : "\u2718";
} else if ((options === null || options === void 0 ? void 0 : options.length) > 0) {
if (["string", "number"].indexOf(_typeof$d(value)) > -1) {
var item = options.find(function(item2) {
return item2.value === value;
});
__html = (item === null || item === void 0 ? void 0 : item.label) || "-";
} else if (Array.isArray(value)) {
var idxStr = "-";
value.forEach(function(v2) {
var item2 = options.find(function(item3) {
return item3.value === v2;
});
var name2 = item2.label;
if (name2) {
idxStr += "," + name2;
}
});
__html = idxStr.replace("-,", "");
}
} else if (typeof value === "number") {
__html = String(value);
} else if (typeof value === "string") {
__html = value;
} else if (schema2.type === "range" && Array.isArray(value) && value[0] && value[1]) {
__html = "".concat(value[0], " - ").concat(value[1]);
} else if (value && ["number", "string"].indexOf(value) === -1) {
__html = JSON.stringify(value);
}
if (schema2.format === "image") {
return /* @__PURE__ */ React__default.default.createElement(_Image, _extends({
height: 56,
src: value
}, schema2.imageProps));
}
return /* @__PURE__ */ jsx("div", {
dangerouslySetInnerHTML: {
__html
}
});
}
var PercentSlider = function PercentSlider2(p2) {
var _p$schema = p2.schema, max = _p$schema.max, min = _p$schema.min, step2 = _p$schema.step;
var setting = {};
if (max || max === 0) {
setting = {
max
};
}
if (min || min === 0) {
setting = Object.assign(Object.assign({}, setting), {
min
});
}
if (step2) {
setting = Object.assign(Object.assign({}, setting), {
step: step2
});
}
var hideNumber = false;
if (p2.options && p2.options.hideNumber) {
hideNumber = true;
}
var isPercent = function isPercent2(string2) {
return typeof string2 === "string" && string2.endsWith("%");
};
var numberValue = 100;
if (isPercent(p2.value)) {
try {
numberValue = Number(p2.value.split("%")[0]);
if (Number.isNaN(numberValue))
numberValue = 100;
} catch (error) {
}
}
var handleChange = function handleChange2(newNumber) {
var a = newNumber + "%";
p2.onChange(a);
};
var renderNumber = p2.readonly ? /* @__PURE__ */ jsx("span", {
style: {
width: "80px"
},
children: p2.value === "" ? "-" : p2.value + "%"
}) : /* @__PURE__ */ React__namespace.createElement(_InputNumber, Object.assign({}, p2.options, setting, {
style: {
width: "80px"
},
value: numberValue,
disabled: p2.disabled,
onChange: handleChange,
formatter: function formatter(value) {
return "".concat(value, "%");
},
parser: function parser(value) {
return Number(value.replace("%", ""));
}
}));
return /* @__PURE__ */ React__namespace.createElement("div", {
className: "fr-slider"
}, /* @__PURE__ */ React__namespace.createElement(_Slider, Object.assign({
style: {
flexGrow: 1,
marginRight: hideNumber ? 0 : 12
}
}, setting, {
onChange: handleChange,
max: 100,
tooltip: {
formatter: function formatter(v2) {
return v2 + "%";
}
},
value: numberValue || 100,
disabled: p2.disabled || p2.readonly
})), hideNumber ? null : renderNumber);
};
const index$r = "";
const index$q = "";
const index$p = "";
const index$o = "";
var PanelView = function PanelView2(_ref) {
var children = _ref.children, bordered = _ref.bordered;
return /* @__PURE__ */ jsx("div", {
className: classnames("fr-panel", {
"fr-panel-bordered": bordered
}),
children
});
};
const index$n = "";
var BoxCard = function BoxCard2(_ref) {
var children = _ref.children, title = _ref.title, description = _ref.description;
if (!title) {
return /* @__PURE__ */ jsx(PanelView, {
children
});
}
return /* @__PURE__ */ React__default.default.createElement(_Card, {
className: "fr-obj-card",
title: /* @__PURE__ */ jsxs(Fragment, {
children: [title, description && /* @__PURE__ */ jsx("span", {
className: "fr-header-desc ",
children: description
})]
})
}, children);
};
var DownOutlined$2 = {};
var DownOutlined$1 = {};
var hasRequiredDownOutlined;
function requireDownOutlined() {
if (hasRequiredDownOutlined)
return DownOutlined$1;
hasRequiredDownOutlined = 1;
Object.defineProperty(DownOutlined$1, "__esModule", { value: true });
var DownOutlined2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z" } }] }, "name": "down", "theme": "outlined" };
DownOutlined$1.default = DownOutlined2;
return DownOutlined$1;
}
var _interopRequireDefault$6 = interopRequireDefault.exports;
var _typeof$c = _typeof$g.exports;
Object.defineProperty(DownOutlined$2, "__esModule", {
value: true
});
var default_1$6 = DownOutlined$2.default = void 0;
var _objectSpread2$6 = _interopRequireDefault$6(requireObjectSpread2());
var React$6 = _interopRequireWildcard$6(React__default.default);
var _DownOutlined = _interopRequireDefault$6(requireDownOutlined());
var _AntdIcon$6 = _interopRequireDefault$6(requireAntdIcon());
function _getRequireWildcardCache$6(nodeInterop) {
if (typeof WeakMap !== "function")
return null;
var cacheBabelInterop = /* @__PURE__ */ new WeakMap();
var cacheNodeInterop = /* @__PURE__ */ new WeakMap();
return (_getRequireWildcardCache$6 = function _getRequireWildcardCache2(nodeInterop2) {
return nodeInterop2 ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard$6(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || _typeof$c(obj) !== "object" && typeof obj !== "function") {
return { default: obj };
}
var cache = _getRequireWildcardCache$6(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for (var key2 in obj) {
if (key2 !== "default" && Object.prototype.hasOwnProperty.call(obj, key2)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key2) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key2, desc);
} else {
newObj[key2] = obj[key2];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
var DownOutlined = function DownOutlined2(props, ref) {
return /* @__PURE__ */ React$6.createElement(_AntdIcon$6.default, (0, _objectSpread2$6.default)((0, _objectSpread2$6.default)({}, props), {}, {
ref,
icon: _DownOutlined.default
}));
};
DownOutlined.displayName = "DownOutlined";
var _default$6 = /* @__PURE__ */ React$6.forwardRef(DownOutlined);
default_1$6 = DownOutlined$2.default = _default$6;
const index$m = "";
const index$l = "";
function _slicedToArray$8(arr, i2) {
return _arrayWithHoles$8(arr) || _iterableToArrayLimit$8(arr, i2) || _unsupportedIterableToArray$a(arr, i2) || _nonIterableRest$8();
}
function _nonIterableRest$8() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$a(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$a(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$a(o, minLen);
}
function _arrayLikeToArray$a(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArrayLimit$8(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _arrayWithHoles$8(arr) {
if (Array.isArray(arr))
return arr;
}
var Panel = Collapse$1.Panel;
var BoxCollapse = function BoxCollapse2(props) {
var style2 = props.style, children = props.children, title = props.title, description = props.description, _props$collapsed = props.collapsed, collapsed = _props$collapsed === void 0 ? true : _props$collapsed, displayType = props.displayType, _props$bordered = props.bordered, bordered = _props$bordered === void 0 ? false : _props$bordered, _props$ghost = props.ghost, ghost = _props$ghost === void 0 ? true : _props$ghost;
if (!title) {
return /* @__PURE__ */ jsx(PanelView, {
bordered: displayType !== "inline",
children
});
}
var _useState = React$a.useState(collapsed ? "single" : ""), _useState2 = _slicedToArray$8(_useState, 2), activeKey = _useState2[0], setActiveKey = _useState2[1];
var collapseHeader = /* @__PURE__ */ jsxs(Fragment, {
children: [title && /* @__PURE__ */ jsx("div", {
className: "collapse-title",
children: title
}), description && /* @__PURE__ */ jsx("span", {
className: "fr-header-desc ",
children: description
})]
});
var renderExpandIcon2 = function renderExpandIcon3(_ref) {
var isActive2 = _ref.isActive;
return /* @__PURE__ */ React__default.default.createElement("div", {
className: "expand-icon-box"
}, /* @__PURE__ */ React__default.default.createElement(default_1$6, {
rotate: isActive2 ? 0 : -90,
style: {
fontSize: "16px"
}
}));
};
return /* @__PURE__ */ React__default.default.createElement(
Collapse$1,
{
className: "fr-obj-collapse",
style: style2,
bordered,
ghost,
activeKey: [activeKey],
expandIcon: renderExpandIcon2,
onChange: function onChange() {
return setActiveKey(activeKey ? "" : "single");
}
},
/* @__PURE__ */ jsx(Panel, {
header: collapseHeader,
forceRender: true,
children
}, "single")
);
};
const index$k = "";
var BoxSubInline = function BoxSubInline2(props) {
var children = props.children, title = props.title, _props$hasBackground = props.hasBackground, hasBackground = _props$hasBackground === void 0 ? true : _props$hasBackground, description = props.description, tooltip = props.tooltip, fieldCol = props.fieldCol, labelCol = props.labelCol, labelWidth = props.labelWidth;
props.displayType;
var rest = __rest(props, ["children", "title", "hasBackground", "description", "tooltip", "fieldCol", "labelCol", "labelWidth", "displayType"]);
var _tooltip = null;
var _labelCol = {
span: 3
};
var _fieldCol = {
flex: 1
};
if (description) {
_tooltip = {
title: description
};
}
if (tooltip) {
_tooltip = tooltip;
}
if (labelWidth) {
_labelCol = {
flex: labelWidth + "px"
};
}
if (labelCol) {
_labelCol = labelCol;
}
if (fieldCol) {
_fieldCol = fieldCol;
}
return /* @__PURE__ */ React__default.default.createElement(_Form.Item, Object.assign({}, rest, {
className: classnames("fr-obj-subinline", {
"fr-obj-subinline-label-hidden": !title,
"fr-obj-subinline-background": hasBackground
}),
label: title || "notitle",
labelCol: _labelCol,
wrapperCol: _fieldCol,
tooltip: _tooltip
}), children);
};
const index$j = "";
var FLineTitle = function FLineTitle2(_ref) {
var children = _ref.children, title = _ref.title, description = _ref.description;
if (!title) {
return /* @__PURE__ */ jsx(PanelView, {
children
});
}
return /* @__PURE__ */ jsxs("div", {
className: "fr-obj-line-title",
children: [/* @__PURE__ */ jsxs("div", {
className: "fr-obj-header",
children: [/* @__PURE__ */ jsx("span", {
className: "fr-header-title",
children: title
}), description && /* @__PURE__ */ jsx("span", {
className: "fr-header-desc",
children: description
})]
}), /* @__PURE__ */ jsx("div", {
className: "fr-obj-content",
children
})]
});
};
var PlusOutlined$2 = {};
var PlusOutlined$1 = {};
var hasRequiredPlusOutlined;
function requirePlusOutlined() {
if (hasRequiredPlusOutlined)
return PlusOutlined$1;
hasRequiredPlusOutlined = 1;
Object.defineProperty(PlusOutlined$1, "__esModule", { value: true });
var PlusOutlined2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "defs", "attrs": {}, "children": [{ "tag": "style", "attrs": {} }] }, { "tag": "path", "attrs": { "d": "M482 152h60q8 0 8 8v704q0 8-8 8h-60q-8 0-8-8V160q0-8 8-8z" } }, { "tag": "path", "attrs": { "d": "M176 474h672q8 0 8 8v60q0 8-8 8H176q-8 0-8-8v-60q0-8 8-8z" } }] }, "name": "plus", "theme": "outlined" };
PlusOutlined$1.default = PlusOutlined2;
return PlusOutlined$1;
}
var _interopRequireDefault$5 = interopRequireDefault.exports;
var _typeof$b = _typeof$g.exports;
Object.defineProperty(PlusOutlined$2, "__esModule", {
value: true
});
var default_1$5 = PlusOutlined$2.default = void 0;
var _objectSpread2$5 = _interopRequireDefault$5(requireObjectSpread2());
var React$5 = _interopRequireWildcard$5(React__default.default);
var _PlusOutlined = _interopRequireDefault$5(requirePlusOutlined());
var _AntdIcon$5 = _interopRequireDefault$5(requireAntdIcon());
function _getRequireWildcardCache$5(nodeInterop) {
if (typeof WeakMap !== "function")
return null;
var cacheBabelInterop = /* @__PURE__ */ new WeakMap();
var cacheNodeInterop = /* @__PURE__ */ new WeakMap();
return (_getRequireWildcardCache$5 = function _getRequireWildcardCache2(nodeInterop2) {
return nodeInterop2 ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard$5(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || _typeof$b(obj) !== "object" && typeof obj !== "function") {
return { default: obj };
}
var cache = _getRequireWildcardCache$5(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for (var key2 in obj) {
if (key2 !== "default" && Object.prototype.hasOwnProperty.call(obj, key2)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key2) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key2, desc);
} else {
newObj[key2] = obj[key2];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
var PlusOutlined = function PlusOutlined2(props, ref) {
return /* @__PURE__ */ React$5.createElement(_AntdIcon$5.default, (0, _objectSpread2$5.default)((0, _objectSpread2$5.default)({}, props), {}, {
ref,
icon: _PlusOutlined.default
}));
};
PlusOutlined.displayName = "PlusOutlined";
var _default$5 = /* @__PURE__ */ React$5.forwardRef(PlusOutlined);
default_1$5 = PlusOutlined$2.default = _default$5;
var CopyOutlined$2 = {};
var CopyOutlined$1 = {};
var hasRequiredCopyOutlined;
function requireCopyOutlined() {
if (hasRequiredCopyOutlined)
return CopyOutlined$1;
hasRequiredCopyOutlined = 1;
Object.defineProperty(CopyOutlined$1, "__esModule", { value: true });
var CopyOutlined2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M832 64H296c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h496v688c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V96c0-17.7-14.3-32-32-32zM704 192H192c-17.7 0-32 14.3-32 32v530.7c0 8.5 3.4 16.6 9.4 22.6l173.3 173.3c2.2 2.2 4.7 4 7.4 5.5v1.9h4.2c3.5 1.3 7.2 2 11 2H704c17.7 0 32-14.3 32-32V224c0-17.7-14.3-32-32-32zM350 856.2L263.9 770H350v86.2zM664 888H414V746c0-22.1-17.9-40-40-40H232V264h432v624z" } }] }, "name": "copy", "theme": "outlined" };
CopyOutlined$1.default = CopyOutlined2;
return CopyOutlined$1;
}
var _interopRequireDefault$4 = interopRequireDefault.exports;
var _typeof$a = _typeof$g.exports;
Object.defineProperty(CopyOutlined$2, "__esModule", {
value: true
});
var default_1$4 = CopyOutlined$2.default = void 0;
var _objectSpread2$4 = _interopRequireDefault$4(requireObjectSpread2());
var React$4 = _interopRequireWildcard$4(React__default.default);
var _CopyOutlined = _interopRequireDefault$4(requireCopyOutlined());
var _AntdIcon$4 = _interopRequireDefault$4(requireAntdIcon());
function _getRequireWildcardCache$4(nodeInterop) {
if (typeof WeakMap !== "function")
return null;
var cacheBabelInterop = /* @__PURE__ */ new WeakMap();
var cacheNodeInterop = /* @__PURE__ */ new WeakMap();
return (_getRequireWildcardCache$4 = function _getRequireWildcardCache2(nodeInterop2) {
return nodeInterop2 ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard$4(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || _typeof$a(obj) !== "object" && typeof obj !== "function") {
return { default: obj };
}
var cache = _getRequireWildcardCache$4(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for (var key2 in obj) {
if (key2 !== "default" && Object.prototype.hasOwnProperty.call(obj, key2)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key2) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key2, desc);
} else {
newObj[key2] = obj[key2];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
var CopyOutlined = function CopyOutlined2(props, ref) {
return /* @__PURE__ */ React$4.createElement(_AntdIcon$4.default, (0, _objectSpread2$4.default)((0, _objectSpread2$4.default)({}, props), {}, {
ref,
icon: _CopyOutlined.default
}));
};
CopyOutlined.displayName = "CopyOutlined";
var _default$4 = /* @__PURE__ */ React$4.forwardRef(CopyOutlined);
default_1$4 = CopyOutlined$2.default = _default$4;
var CloseOutlined$2 = {};
var CloseOutlined$1 = {};
var hasRequiredCloseOutlined;
function requireCloseOutlined() {
if (hasRequiredCloseOutlined)
return CloseOutlined$1;
hasRequiredCloseOutlined = 1;
Object.defineProperty(CloseOutlined$1, "__esModule", { value: true });
var CloseOutlined2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M563.8 512l262.5-312.9c4.4-5.2.7-13.1-6.1-13.1h-79.8c-4.7 0-9.2 2.1-12.3 5.7L511.6 449.8 295.1 191.7c-3-3.6-7.5-5.7-12.3-5.7H203c-6.8 0-10.5 7.9-6.1 13.1L459.4 512 196.9 824.9A7.95 7.95 0 00203 838h79.8c4.7 0 9.2-2.1 12.3-5.7l216.5-258.1 216.5 258.1c3 3.6 7.5 5.7 12.3 5.7h79.8c6.8 0 10.5-7.9 6.1-13.1L563.8 512z" } }] }, "name": "close", "theme": "outlined" };
CloseOutlined$1.default = CloseOutlined2;
return CloseOutlined$1;
}
var _interopRequireDefault$3 = interopRequireDefault.exports;
var _typeof$9 = _typeof$g.exports;
Object.defineProperty(CloseOutlined$2, "__esModule", {
value: true
});
var default_1$3 = CloseOutlined$2.default = void 0;
var _objectSpread2$3 = _interopRequireDefault$3(requireObjectSpread2());
var React$3 = _interopRequireWildcard$3(React__default.default);
var _CloseOutlined = _interopRequireDefault$3(requireCloseOutlined());
var _AntdIcon$3 = _interopRequireDefault$3(requireAntdIcon());
function _getRequireWildcardCache$3(nodeInterop) {
if (typeof WeakMap !== "function")
return null;
var cacheBabelInterop = /* @__PURE__ */ new WeakMap();
var cacheNodeInterop = /* @__PURE__ */ new WeakMap();
return (_getRequireWildcardCache$3 = function _getRequireWildcardCache2(nodeInterop2) {
return nodeInterop2 ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard$3(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || _typeof$9(obj) !== "object" && typeof obj !== "function") {
return { default: obj };
}
var cache = _getRequireWildcardCache$3(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for (var key2 in obj) {
if (key2 !== "default" && Object.prototype.hasOwnProperty.call(obj, key2)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key2) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key2, desc);
} else {
newObj[key2] = obj[key2];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
var CloseOutlined = function CloseOutlined2(props, ref) {
return /* @__PURE__ */ React$3.createElement(_AntdIcon$3.default, (0, _objectSpread2$3.default)((0, _objectSpread2$3.default)({}, props), {}, {
ref,
icon: _CloseOutlined.default
}));
};
CloseOutlined.displayName = "CloseOutlined";
var _default$3 = /* @__PURE__ */ React$3.forwardRef(CloseOutlined);
default_1$3 = CloseOutlined$2.default = _default$3;
const index$i = "";
var ArrowDownOutlined$2 = {};
var ArrowDownOutlined$1 = {};
var hasRequiredArrowDownOutlined;
function requireArrowDownOutlined() {
if (hasRequiredArrowDownOutlined)
return ArrowDownOutlined$1;
hasRequiredArrowDownOutlined = 1;
Object.defineProperty(ArrowDownOutlined$1, "__esModule", { value: true });
var ArrowDownOutlined2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M862 465.3h-81c-4.6 0-9 2-12.1 5.5L550 723.1V160c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v563.1L255.1 470.8c-3-3.5-7.4-5.5-12.1-5.5h-81c-6.8 0-10.5 8.1-6 13.2L487.9 861a31.96 31.96 0 0048.3 0L868 478.5c4.5-5.2.8-13.2-6-13.2z" } }] }, "name": "arrow-down", "theme": "outlined" };
ArrowDownOutlined$1.default = ArrowDownOutlined2;
return ArrowDownOutlined$1;
}
var _interopRequireDefault$2 = interopRequireDefault.exports;
var _typeof$8 = _typeof$g.exports;
Object.defineProperty(ArrowDownOutlined$2, "__esModule", {
value: true
});
var default_1$2 = ArrowDownOutlined$2.default = void 0;
var _objectSpread2$2 = _interopRequireDefault$2(requireObjectSpread2());
var React$2 = _interopRequireWildcard$2(React__default.default);
var _ArrowDownOutlined = _interopRequireDefault$2(requireArrowDownOutlined());
var _AntdIcon$2 = _interopRequireDefault$2(requireAntdIcon());
function _getRequireWildcardCache$2(nodeInterop) {
if (typeof WeakMap !== "function")
return null;
var cacheBabelInterop = /* @__PURE__ */ new WeakMap();
var cacheNodeInterop = /* @__PURE__ */ new WeakMap();
return (_getRequireWildcardCache$2 = function _getRequireWildcardCache2(nodeInterop2) {
return nodeInterop2 ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard$2(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || _typeof$8(obj) !== "object" && typeof obj !== "function") {
return { default: obj };
}
var cache = _getRequireWildcardCache$2(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for (var key2 in obj) {
if (key2 !== "default" && Object.prototype.hasOwnProperty.call(obj, key2)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key2) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key2, desc);
} else {
newObj[key2] = obj[key2];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
var ArrowDownOutlined = function ArrowDownOutlined2(props, ref) {
return /* @__PURE__ */ React$2.createElement(_AntdIcon$2.default, (0, _objectSpread2$2.default)((0, _objectSpread2$2.default)({}, props), {}, {
ref,
icon: _ArrowDownOutlined.default
}));
};
ArrowDownOutlined.displayName = "ArrowDownOutlined";
var _default$2 = /* @__PURE__ */ React$2.forwardRef(ArrowDownOutlined);
default_1$2 = ArrowDownOutlined$2.default = _default$2;
var ArrowUpOutlined$2 = {};
var ArrowUpOutlined$1 = {};
var hasRequiredArrowUpOutlined;
function requireArrowUpOutlined() {
if (hasRequiredArrowUpOutlined)
return ArrowUpOutlined$1;
hasRequiredArrowUpOutlined = 1;
Object.defineProperty(ArrowUpOutlined$1, "__esModule", { value: true });
var ArrowUpOutlined2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M868 545.5L536.1 163a31.96 31.96 0 00-48.3 0L156 545.5a7.97 7.97 0 006 13.2h81c4.6 0 9-2 12.1-5.5L474 300.9V864c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V300.9l218.9 252.3c3 3.5 7.4 5.5 12.1 5.5h81c6.8 0 10.5-8 6-13.2z" } }] }, "name": "arrow-up", "theme": "outlined" };
ArrowUpOutlined$1.default = ArrowUpOutlined2;
return ArrowUpOutlined$1;
}
var _interopRequireDefault$1 = interopRequireDefault.exports;
var _typeof$7 = _typeof$g.exports;
Object.defineProperty(ArrowUpOutlined$2, "__esModule", {
value: true
});
var default_1$1 = ArrowUpOutlined$2.default = void 0;
var _objectSpread2$1 = _interopRequireDefault$1(requireObjectSpread2());
var React$1 = _interopRequireWildcard$1(React__default.default);
var _ArrowUpOutlined = _interopRequireDefault$1(requireArrowUpOutlined());
var _AntdIcon$1 = _interopRequireDefault$1(requireAntdIcon());
function _getRequireWildcardCache$1(nodeInterop) {
if (typeof WeakMap !== "function")
return null;
var cacheBabelInterop = /* @__PURE__ */ new WeakMap();
var cacheNodeInterop = /* @__PURE__ */ new WeakMap();
return (_getRequireWildcardCache$1 = function _getRequireWildcardCache2(nodeInterop2) {
return nodeInterop2 ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard$1(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || _typeof$7(obj) !== "object" && typeof obj !== "function") {
return { default: obj };
}
var cache = _getRequireWildcardCache$1(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for (var key2 in obj) {
if (key2 !== "default" && Object.prototype.hasOwnProperty.call(obj, key2)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key2) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key2, desc);
} else {
newObj[key2] = obj[key2];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
var ArrowUpOutlined = function ArrowUpOutlined2(props, ref) {
return /* @__PURE__ */ React$1.createElement(_AntdIcon$1.default, (0, _objectSpread2$1.default)((0, _objectSpread2$1.default)({}, props), {}, {
ref,
icon: _ArrowUpOutlined.default
}));
};
ArrowUpOutlined.displayName = "ArrowUpOutlined";
var _default$1 = /* @__PURE__ */ React$1.forwardRef(ArrowUpOutlined);
default_1$1 = ArrowUpOutlined$2.default = _default$1;
const index$h = "";
var HeaderTitle = function HeaderTitle2(props) {
var icon = props.icon, children = props.children, btnType = props.btnType, otherProps = __rest(props, ["icon", "children", "btnType"]);
var btnProps = Object.assign({}, otherProps);
if (btnType === "icon") {
btnProps.icon = icon;
btnProps.size = "small";
} else {
btnProps.children = children;
}
return /* @__PURE__ */ React__default.default.createElement(Button$2, Object.assign({
type: "link",
style: {
padding: 0
}
}, btnProps));
};
const index$g = "";
function _toConsumableArray$5(arr) {
return _arrayWithoutHoles$5(arr) || _iterableToArray$5(arr) || _unsupportedIterableToArray$9(arr) || _nonIterableSpread$5();
}
function _nonIterableSpread$5() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$9(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$9(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$9(o, minLen);
}
function _iterableToArray$5(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
return Array.from(iter);
}
function _arrayWithoutHoles$5(arr) {
if (Array.isArray(arr))
return _arrayLikeToArray$9(arr);
}
function _arrayLikeToArray$9(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
var getHasBackground = function getHasBackground2(fields, hasBackground) {
var result = hasBackground;
if (fields.length === 0) {
result = false;
}
return result;
};
var SimpleList = function SimpleList2(props) {
var form = props.form, schema2 = props.schema, fields = props.fields, rootPath = props.rootPath, renderCore = props.renderCore, hasBackground = props.hasBackground, operateBtnType = props.operateBtnType, addBtnProps = props.addBtnProps, delConfirmProps = props.delConfirmProps, copyBtnProps = props.copyBtnProps, deleteBtnProps = props.deleteBtnProps, moveUpBtnProps = props.moveUpBtnProps, moveDownBtnProps = props.moveDownBtnProps, hideDelete = props.hideDelete, hideCopy = props.hideCopy, hideMove = props.hideMove, hideAdd = props.hideAdd, addItem = props.addItem, copyItem = props.copyItem, moveItem = props.moveItem, removeItem = props.removeItem, temporary = props.temporary;
if (!schema2.items.displayType) {
schema2.items.displayType = "inline";
schema2.items.inlineMode = true;
}
var handleCopy = function handleCopy2(name2) {
var value = form.getFieldValue(rootPath.concat(name2));
copyItem(value);
};
var isColumm = temporary.displayType === "column";
return /* @__PURE__ */ jsxs("div", {
className: classnames("fr-list-simple", {
"fr-list-simple-background": getHasBackground(fields, hasBackground),
"fr-list-simple-column": isColumm
}),
children: [fields.map(function(_ref) {
var key2 = _ref.key, name2 = _ref.name;
var length = fields.length;
return /* @__PURE__ */ React__default.default.createElement("div", {
key: key2,
className: "fr-list-item"
}, renderCore({
schema: schema2,
parentPath: [name2],
rootPath: [].concat(_toConsumableArray$5(rootPath), [name2])
}), /* @__PURE__ */ React__default.default.createElement(_Space, {
className: classnames("fr-list-item-operate"),
split: operateBtnType !== "icon" && /* @__PURE__ */ React__default.default.createElement(_Divider, {
type: "vertical"
})
}, !hideMove && /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
disabled: name2 === 0,
onClick: function onClick() {
return moveItem(name2, name2 - 1);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$1, null)
}, moveUpBtnProps)
}), /* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
disabled: name2 === length - 1,
onClick: function onClick() {
return moveItem(name2, name2 + 1);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$2, null),
children: "\u4E0B\u79FB"
}, moveDownBtnProps)
})]
}), !hideDelete && /* @__PURE__ */ React__default.default.createElement(
_Popconfirm,
Object.assign({
onConfirm: function onConfirm() {
return removeItem(name2);
}
}, delConfirmProps),
/* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
icon: /* @__PURE__ */ React__default.default.createElement(default_1$3, null),
children: "\u5220\u9664",
btnType: operateBtnType
}, deleteBtnProps)
})
), !hideCopy && /* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
onClick: function onClick() {
return handleCopy(name2);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$4, null),
children: "\u590D\u5236"
}, copyBtnProps)
})));
}), (!schema2.max || fields.length < schema2.max) && !hideAdd && /* @__PURE__ */ React__default.default.createElement(Button$2, Object.assign({
className: "add-btn",
icon: /* @__PURE__ */ React__default.default.createElement(default_1$5, null),
onClick: function onClick() {
return addItem();
},
block: fields.length > 0 ? true : false
}, addBtnProps))]
});
};
const index$f = "";
function _toConsumableArray$4(arr) {
return _arrayWithoutHoles$4(arr) || _iterableToArray$4(arr) || _unsupportedIterableToArray$8(arr) || _nonIterableSpread$4();
}
function _nonIterableSpread$4() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$8(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$8(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$8(o, minLen);
}
function _iterableToArray$4(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
return Array.from(iter);
}
function _arrayWithoutHoles$4(arr) {
if (Array.isArray(arr))
return _arrayLikeToArray$8(arr);
}
function _arrayLikeToArray$8(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
var getOperateFixed = function getOperateFixed2(schema2) {
var _a, _b;
var fixed = true;
if ((_b = (_a = schema2 === null || schema2 === void 0 ? void 0 : schema2.items) === null || _a === void 0 ? void 0 : _a.props) === null || _b === void 0 ? void 0 : _b.extra) {
fixed = false;
}
return fixed;
};
var getOperateStyle = function getOperateStyle2(schema2) {
var _a, _b, _c, _d, _e;
var style2 = {};
var widgetName = ((_a = schema2 === null || schema2 === void 0 ? void 0 : schema2.items) === null || _a === void 0 ? void 0 : _a.theme) || ((_b = schema2 === null || schema2 === void 0 ? void 0 : schema2.items) === null || _b === void 0 ? void 0 : _b.widget) || "collapse";
if (["card", "collapse", "lineTitle"].includes(widgetName) && !((_d = (_c = schema2 === null || schema2 === void 0 ? void 0 : schema2.items) === null || _c === void 0 ? void 0 : _c.props) === null || _d === void 0 ? void 0 : _d.extra)) {
style2.top = "14px";
if (["lineTitle"].includes(widgetName)) {
style2.top = "3px";
style2.padding = 0;
}
if (!((_e = schema2 === null || schema2 === void 0 ? void 0 : schema2.items) === null || _e === void 0 ? void 0 : _e.title)) {
style2.right = "0";
}
}
return style2;
};
var CardList = function CardList2(props) {
var form = props.form, schema2 = props.schema, fields = props.fields, rootPath = props.rootPath, renderCore = props.renderCore, hasBackground = props.hasBackground, operateBtnType = props.operateBtnType, addBtnProps = props.addBtnProps, delConfirmProps = props.delConfirmProps, copyBtnProps = props.copyBtnProps, deleteBtnProps = props.deleteBtnProps, moveUpBtnProps = props.moveUpBtnProps, moveDownBtnProps = props.moveDownBtnProps, hideDelete = props.hideDelete, hideCopy = props.hideCopy, hideMove = props.hideMove, hideAdd = props.hideAdd, addItem = props.addItem, copyItem = props.copyItem, moveItem = props.moveItem, removeItem = props.removeItem;
var handleCopy = function handleCopy2(name2) {
var value = form.getFieldValue(rootPath.concat(name2));
copyItem(value);
};
return /* @__PURE__ */ jsx(Fragment, {
children: /* @__PURE__ */ jsxs("div", {
className: classnames("fr-list-card", {
"fr-list-card-background": hasBackground
}),
children: [fields.map(function(_ref) {
var key2 = _ref.key, name2 = _ref.name;
var length = fields.length;
var newSchema = cloneDeep(schema2);
if (newSchema.items.title && typeof newSchema.items.title === "string") {
newSchema.items.title += " ".concat(name2 + 1);
}
return /* @__PURE__ */ React__default.default.createElement(
"div",
{
key: key2,
className: "fr-list-item"
},
/* @__PURE__ */ jsx("div", {
style: {
width: 0,
flex: 1
},
children: renderCore({
schema: newSchema,
parentPath: [name2],
rootPath: [].concat(_toConsumableArray$4(rootPath), [name2])
})
}),
/* @__PURE__ */ React__default.default.createElement(_Space, {
className: classnames("fr-list-item-operate", {
"fr-list-item-operate-fixed": getOperateFixed(schema2)
}),
style: getOperateStyle(schema2),
split: operateBtnType !== "icon" && /* @__PURE__ */ React__default.default.createElement(_Divider, {
type: "vertical"
})
}, !hideMove && /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
disabled: name2 === 0,
onClick: function onClick() {
return moveItem(name2, name2 - 1);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$1, null)
}, moveUpBtnProps)
}), /* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
disabled: name2 === length - 1,
onClick: function onClick() {
return moveItem(name2, name2 + 1);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$2, null)
}, moveDownBtnProps)
})]
}), !hideDelete && /* @__PURE__ */ React__default.default.createElement(
_Popconfirm,
Object.assign({
onConfirm: function onConfirm() {
return removeItem(name2);
}
}, delConfirmProps),
/* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
icon: /* @__PURE__ */ React__default.default.createElement(default_1$3, null)
}, deleteBtnProps)
})
), !hideCopy && /* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
onClick: function onClick() {
return handleCopy(name2);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$4, null)
}, copyBtnProps)
}))
);
}), !hideAdd && /* @__PURE__ */ React__default.default.createElement("div", {
className: "fr-list-add-btn"
}, /* @__PURE__ */ React__default.default.createElement(Button$2, Object.assign({}, addBtnProps, {
onClick: function onClick() {
return addItem();
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$5, null),
block: fields.length > 0 ? true : false
})))]
})
});
};
const index$e = "";
const index$d = "";
const index$c = "";
const index$b = "";
const index$a = "";
const index$9 = "";
var InfoCircleOutlined$2 = {};
var InfoCircleOutlined$1 = {};
var hasRequiredInfoCircleOutlined;
function requireInfoCircleOutlined() {
if (hasRequiredInfoCircleOutlined)
return InfoCircleOutlined$1;
hasRequiredInfoCircleOutlined = 1;
Object.defineProperty(InfoCircleOutlined$1, "__esModule", { value: true });
var InfoCircleOutlined2 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z" } }, { "tag": "path", "attrs": { "d": "M464 336a48 48 0 1096 0 48 48 0 10-96 0zm72 112h-48c-4.4 0-8 3.6-8 8v272c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V456c0-4.4-3.6-8-8-8z" } }] }, "name": "info-circle", "theme": "outlined" };
InfoCircleOutlined$1.default = InfoCircleOutlined2;
return InfoCircleOutlined$1;
}
var _interopRequireDefault = interopRequireDefault.exports;
var _typeof$6 = _typeof$g.exports;
Object.defineProperty(InfoCircleOutlined$2, "__esModule", {
value: true
});
var default_1 = InfoCircleOutlined$2.default = void 0;
var _objectSpread2 = _interopRequireDefault(requireObjectSpread2());
var React2 = _interopRequireWildcard(React__default.default);
var _InfoCircleOutlined = _interopRequireDefault(requireInfoCircleOutlined());
var _AntdIcon = _interopRequireDefault(requireAntdIcon());
function _getRequireWildcardCache(nodeInterop) {
if (typeof WeakMap !== "function")
return null;
var cacheBabelInterop = /* @__PURE__ */ new WeakMap();
var cacheNodeInterop = /* @__PURE__ */ new WeakMap();
return (_getRequireWildcardCache = function _getRequireWildcardCache2(nodeInterop2) {
return nodeInterop2 ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interopRequireWildcard(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || _typeof$6(obj) !== "object" && typeof obj !== "function") {
return { default: obj };
}
var cache = _getRequireWildcardCache(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for (var key2 in obj) {
if (key2 !== "default" && Object.prototype.hasOwnProperty.call(obj, key2)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key2) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key2, desc);
} else {
newObj[key2] = obj[key2];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
var InfoCircleOutlined = function InfoCircleOutlined2(props, ref) {
return /* @__PURE__ */ React2.createElement(_AntdIcon.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, props), {}, {
ref,
icon: _InfoCircleOutlined.default
}));
};
InfoCircleOutlined.displayName = "InfoCircleOutlined";
var _default = /* @__PURE__ */ React2.forwardRef(InfoCircleOutlined);
default_1 = InfoCircleOutlined$2.default = _default;
function _slicedToArray$7(arr, i2) {
return _arrayWithHoles$7(arr) || _iterableToArrayLimit$7(arr, i2) || _unsupportedIterableToArray$7(arr, i2) || _nonIterableRest$7();
}
function _nonIterableRest$7() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$7(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$7(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$7(o, minLen);
}
function _arrayLikeToArray$7(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArrayLimit$7(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _arrayWithHoles$7(arr) {
if (Array.isArray(arr))
return arr;
}
var TableCell = function TableCell2(props) {
var renderCore = props.renderCore, schema2 = props.schema, dataIndex = props.dataIndex, otherProps = __rest(props, ["renderCore", "schema", "dataIndex"]);
var _useState = React$a.useState(null), _useState2 = _slicedToArray$7(_useState, 2), errorMsg = _useState2[0], setErrorMsg = _useState2[1];
var _useState3 = React$a.useState(), _useState4 = _slicedToArray$7(_useState3, 2), visible = _useState4[0], setVisible = _useState4[1];
var mouseRef = React$a.useRef();
var onStatusChange = function onStatusChange2(_, errors) {
var message = errors[0] || null;
setErrorMsg(message);
if (mouseRef.current && message) {
setVisible(true);
}
};
if (!schema2.properties[dataIndex].onStatusChange) {
schema2.properties[dataIndex].onStatusChange = onStatusChange;
}
return /* @__PURE__ */ React__default.default.createElement("div", {
className: "fr-table-cell-content",
onMouseEnter: function onMouseEnter() {
mouseRef.current = true;
setVisible(true);
},
onMouseLeave: function onMouseLeave() {
mouseRef.current = false;
setVisible(false);
}
}, /* @__PURE__ */ React__default.default.createElement(_Popover, {
overlayClassName: "fr-popover-error",
content: errorMsg,
placement: "topRight",
open: visible && errorMsg
}, renderCore(Object.assign(Object.assign({}, otherProps), {
schema: schema2
}))));
};
const index$8 = "";
function _typeof$5(obj) {
"@babel/helpers - typeof";
return _typeof$5 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof$5(obj);
}
function _toConsumableArray$3(arr) {
return _arrayWithoutHoles$3(arr) || _iterableToArray$3(arr) || _unsupportedIterableToArray$6(arr) || _nonIterableSpread$3();
}
function _nonIterableSpread$3() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _iterableToArray$3(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
return Array.from(iter);
}
function _arrayWithoutHoles$3(arr) {
if (Array.isArray(arr))
return _arrayLikeToArray$6(arr);
}
function _defineProperty$4(obj, key2, value) {
key2 = _toPropertyKey$4(key2);
if (key2 in obj) {
Object.defineProperty(obj, key2, {
value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key2] = value;
}
return obj;
}
function _toPropertyKey$4(arg) {
var key2 = _toPrimitive$4(arg, "string");
return _typeof$5(key2) === "symbol" ? key2 : String(key2);
}
function _toPrimitive$4(input, hint) {
if (_typeof$5(input) !== "object" || input === null)
return input;
var prim = input[Symbol.toPrimitive];
if (prim !== void 0) {
var res = prim.call(input, hint || "default");
if (_typeof$5(res) !== "object")
return res;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return (hint === "string" ? String : Number)(input);
}
function _slicedToArray$6(arr, i2) {
return _arrayWithHoles$6(arr) || _iterableToArrayLimit$6(arr, i2) || _unsupportedIterableToArray$6(arr, i2) || _nonIterableRest$6();
}
function _nonIterableRest$6() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$6(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$6(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$6(o, minLen);
}
function _arrayLikeToArray$6(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArrayLimit$6(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _arrayWithHoles$6(arr) {
if (Array.isArray(arr))
return arr;
}
var getTooltip$2 = function getTooltip2(tooltip) {
if (!tooltip) {
return;
}
if (typeof tooltip === "string") {
return {
title: /* @__PURE__ */ jsx("span", {
dangerouslySetInnerHTML: {
__html: tooltip
}
})
};
}
return Object.assign(Object.assign({}, tooltip), {
title: /* @__PURE__ */ jsx("span", {
dangerouslySetInnerHTML: {
__html: tooltip.title
}
})
});
};
var TableList$1 = function TableList2(props) {
var _a, _b;
var form = props.form, schema2 = props.schema, fields = props.fields, rootPath = props.rootPath, renderCore = props.renderCore, readOnly = props.readOnly, operateBtnType = props.operateBtnType, addBtnProps = props.addBtnProps, delConfirmProps = props.delConfirmProps, copyBtnProps = props.copyBtnProps, deleteBtnProps = props.deleteBtnProps, moveUpBtnProps = props.moveUpBtnProps, moveDownBtnProps = props.moveDownBtnProps, actionColumnProps = props.actionColumnProps, pagination = props.pagination, hideDelete = props.hideDelete, hideCopy = props.hideCopy, hideMove = props.hideMove, hideAdd = props.hideAdd, addItem = props.addItem, copyItem = props.copyItem, moveItem = props.moveItem, removeItem = props.removeItem, configContext = props.configContext, validatePopover = props.validatePopover;
var globalConfig2 = configContext.globalConfig;
var islidatePopover = (_a = validatePopover !== null && validatePopover !== void 0 ? validatePopover : globalConfig2 === null || globalConfig2 === void 0 ? void 0 : globalConfig2.listValidatePopover) !== null && _a !== void 0 ? _a : true;
var colHeaderText = actionColumnProps.colHeaderText, otherActionColumnProps = __rest(actionColumnProps, ["colHeaderText"]);
var itemSchema = ((_b = schema2 === null || schema2 === void 0 ? void 0 : schema2.items) === null || _b === void 0 ? void 0 : _b.properties) || {};
var paginationConfig = Object.assign({
size: "small",
hideOnSinglePage: true
}, pagination);
var handleCopy = function handleCopy2(name2) {
var value = form.getFieldValue(rootPath.concat(name2));
copyItem(value);
};
var columns = sortProperties(Object.entries(itemSchema)).map(function(_ref) {
var _ref2 = _slicedToArray$6(_ref, 2), dataIndex = _ref2[0], item = _ref2[1];
var required2 = item.required, title = item.title, width = item.width, tooltip = item.tooltip;
var tooltipProps = getTooltip$2(tooltip);
return {
dataIndex,
width,
title: /* @__PURE__ */ jsxs(Fragment, {
children: [required2 && /* @__PURE__ */ jsx("span", {
style: {
color: "red",
marginRight: "3px"
},
children: "*"
}), /* @__PURE__ */ jsx("span", {
children: title
}), tooltipProps && /* @__PURE__ */ React__default.default.createElement(_Tooltip, Object.assign({
placement: "top"
}, tooltipProps), /* @__PURE__ */ React__default.default.createElement(default_1, {
style: {
marginLeft: 6
}
}))]
}),
render: function render2(_, field) {
var fieldSchema = {
type: "object",
properties: _defineProperty$4({}, dataIndex, Object.assign(Object.assign({}, itemSchema[dataIndex]), {
fieldCol: 24
}))
};
if (!islidatePopover) {
return /* @__PURE__ */ jsx("div", {
className: "fr-table-cell-content",
children: renderCore({
parentPath: [field.name],
rootPath: [].concat(_toConsumableArray$3(rootPath), [field.name]),
schema: fieldSchema
})
});
}
return /* @__PURE__ */ jsx(TableCell, {
renderCore,
schema: fieldSchema,
parentPath: [field.name],
rootPath: [].concat(_toConsumableArray$3(rootPath), [field.name]),
dataIndex
});
}
};
});
if (!readOnly) {
columns.push(Object.assign(Object.assign({
title: colHeaderText,
width: "190px",
fixed: "right"
}, otherActionColumnProps), {
render: function render2(_, field) {
return /* @__PURE__ */ React__default.default.createElement(_Form.Item, null, /* @__PURE__ */ React__default.default.createElement(_Space, {
className: "fr-list-item-operate",
split: operateBtnType !== "icon" && /* @__PURE__ */ React__default.default.createElement(_Divider, {
type: "vertical"
})
}, !hideMove && /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
disabled: field.name === 0,
onClick: function onClick() {
return moveItem(field.name, field.name - 1);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$1, null)
}, moveUpBtnProps)
}), /* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
disabled: field.name === fields.length - 1,
onClick: function onClick() {
return moveItem(field.name, field.name + 1);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$2, null)
}, moveDownBtnProps)
})]
}), !hideDelete && /* @__PURE__ */ React__default.default.createElement(
_Popconfirm,
Object.assign({
onConfirm: function onConfirm() {
return removeItem(field.name);
}
}, delConfirmProps),
/* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
icon: /* @__PURE__ */ React__default.default.createElement(default_1$3, null),
btnType: operateBtnType
}, deleteBtnProps)
})
), !hideCopy && /* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
onClick: function onClick() {
return handleCopy(field.name);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$4, null)
}, copyBtnProps)
})));
}
}));
}
return /* @__PURE__ */ React__default.default.createElement("div", {
className: classnames("fr-table-list", {
"fr-table-list-no-popover": !islidatePopover
})
}, /* @__PURE__ */ React__default.default.createElement(Table$1, {
size: "middle",
columns,
dataSource: fields,
pagination: paginationConfig,
scroll: {
x: "max-content"
},
style: {
marginBottom: "12px"
}
}), (!schema2.max || fields.length < schema2.max) && !hideAdd && /* @__PURE__ */ React__default.default.createElement(Button$2, Object.assign({
icon: /* @__PURE__ */ React__default.default.createElement(default_1$5, null),
onClick: function onClick() {
return addItem();
}
}, addBtnProps)));
};
const index$7 = "";
var DrawerForm = function DrawerForm2(props) {
var schema2 = props.schema, widgets = props.widgets, onClose = props.onClose, data = props.data, configContext = props.configContext;
var form = useForm();
var configCtx = React$a.useContext(_ConfigProvider.ConfigContext);
var t2 = translation(configCtx);
var handleFinish = function handleFinish2(data2) {
onClose(data2);
};
var handleClose = function handleClose2() {
onClose();
};
var drawerProps = {
visible: true
};
return /* @__PURE__ */ React__default.default.createElement(
Drawer,
Object.assign({}, drawerProps, {
width: 600,
title: t2("operate"),
open: true,
onClose: handleClose,
extra: /* @__PURE__ */ React__default.default.createElement(_Space, null, /* @__PURE__ */ React__default.default.createElement(Button$2, {
onClick: handleClose
}, t2("cancel")), /* @__PURE__ */ React__default.default.createElement(Button$2, {
type: "primary",
onClick: form.submit
}, t2("confirm")))
}),
/* @__PURE__ */ jsx(FormRender, {
schema: schema2.items,
initialValues: data,
form,
labelCol: {
span: 8
},
widgets,
onFinish: handleFinish,
locale: configContext === null || configContext === void 0 ? void 0 : configContext.locale,
maxWidth: "auto"
})
);
};
const index$6 = "";
function _typeof$4(obj) {
"@babel/helpers - typeof";
return _typeof$4 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof$4(obj);
}
function _defineProperty$3(obj, key2, value) {
key2 = _toPropertyKey$3(key2);
if (key2 in obj) {
Object.defineProperty(obj, key2, {
value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key2] = value;
}
return obj;
}
function _toPropertyKey$3(arg) {
var key2 = _toPrimitive$3(arg, "string");
return _typeof$4(key2) === "symbol" ? key2 : String(key2);
}
function _toPrimitive$3(input, hint) {
if (_typeof$4(input) !== "object" || input === null)
return input;
var prim = input[Symbol.toPrimitive];
if (prim !== void 0) {
var res = prim.call(input, hint || "default");
if (_typeof$4(res) !== "object")
return res;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return (hint === "string" ? String : Number)(input);
}
function _toConsumableArray$2(arr) {
return _arrayWithoutHoles$2(arr) || _iterableToArray$2(arr) || _unsupportedIterableToArray$5(arr) || _nonIterableSpread$2();
}
function _nonIterableSpread$2() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _iterableToArray$2(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
return Array.from(iter);
}
function _arrayWithoutHoles$2(arr) {
if (Array.isArray(arr))
return _arrayLikeToArray$5(arr);
}
function _slicedToArray$5(arr, i2) {
return _arrayWithHoles$5(arr) || _iterableToArrayLimit$5(arr, i2) || _unsupportedIterableToArray$5(arr, i2) || _nonIterableRest$5();
}
function _nonIterableRest$5() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$5(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$5(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$5(o, minLen);
}
function _arrayLikeToArray$5(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArrayLimit$5(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _arrayWithHoles$5(arr) {
if (Array.isArray(arr))
return arr;
}
var getTooltip$1 = function getTooltip2(tooltip) {
if (!tooltip) {
return;
}
if (typeof tooltip === "string") {
return {
title: /* @__PURE__ */ jsx("span", {
dangerouslySetInnerHTML: {
__html: tooltip
}
})
};
}
return Object.assign(Object.assign({}, tooltip), {
title: /* @__PURE__ */ jsx("span", {
dangerouslySetInnerHTML: {
__html: tooltip.title
}
})
});
};
var TableList = function TableList2(props) {
var _a;
var form = props.form, schema2 = props.schema, fields = props.fields, rootPath = props.rootPath, renderCore = props.renderCore, readOnly = props.readOnly, widgets = props.widgets, pagination = props.pagination, operateBtnType = props.operateBtnType, addBtnProps = props.addBtnProps, delConfirmProps = props.delConfirmProps, copyBtnProps = props.copyBtnProps, deleteBtnProps = props.deleteBtnProps, moveUpBtnProps = props.moveUpBtnProps, moveDownBtnProps = props.moveDownBtnProps, actionColumnProps = props.actionColumnProps, editorBtnProps = props.editorBtnProps, hideDelete = props.hideDelete, hideCopy = props.hideCopy, hideMove = props.hideMove, hideAdd = props.hideAdd, hideEdit = props.hideEdit, addItem = props.addItem, copyItem = props.copyItem, moveItem = props.moveItem, removeItem = props.removeItem, configContext = props.configContext;
var colHeaderText = actionColumnProps.colHeaderText, otherActionColumnProps = __rest(actionColumnProps, ["colHeaderText"]);
React$a.useContext(_ConfigProvider.ConfigContext);
var paginationConfig = Object.assign({
size: "small",
hideOnSinglePage: true
}, pagination);
var columnSchema = ((_a = schema2 === null || schema2 === void 0 ? void 0 : schema2.items) === null || _a === void 0 ? void 0 : _a.properties) || {};
var _useState = React$a.useState(false), _useState2 = _slicedToArray$5(_useState, 2), visible = _useState2[0], setVisible = _useState2[1];
var _useState3 = React$a.useState(null), _useState4 = _slicedToArray$5(_useState3, 2), itemData = _useState4[0], setItemData = _useState4[1];
var indexRef = React$a.useRef(null);
var handleCopy = function handleCopy2(name2) {
var value = form.getFieldValue(rootPath.concat(name2));
copyItem(value);
};
var handleAdd = function handleAdd2() {
indexRef.current = -1;
setVisible(true);
};
var handleDrawerClose = function handleDrawerClose2(data) {
setVisible(false);
setItemData(null);
if (!data) {
return;
}
if (indexRef.current === -1) {
addItem(data);
} else {
form.setFieldValue([].concat(_toConsumableArray$2(rootPath), [indexRef.current]), data);
}
indexRef.current === null;
};
var columns = Object.keys(columnSchema).map(function(dataIndex) {
var _columnSchema$dataInd = columnSchema[dataIndex], title = _columnSchema$dataInd.title, tooltip = _columnSchema$dataInd.tooltip, width = _columnSchema$dataInd.width;
var tooltipProps = getTooltip$1(tooltip);
return {
dataIndex,
width,
title: /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx("span", {
children: title
}), tooltipProps && /* @__PURE__ */ React__default.default.createElement(_Tooltip, Object.assign({
placement: "top"
}, tooltipProps), /* @__PURE__ */ React__default.default.createElement(default_1, {
style: {
marginLeft: 6
}
}))]
}),
render: function render2(_, field) {
var fieldSchema = {
type: "object",
properties: _defineProperty$3({}, dataIndex, Object.assign(Object.assign({}, columnSchema[dataIndex]), {
noStyle: true,
readOnly: true
}))
};
return renderCore({
schema: fieldSchema,
parentPath: [field.name],
rootPath: [].concat(_toConsumableArray$2(rootPath), [field.name])
});
}
};
});
if (!readOnly) {
columns.push(Object.assign(Object.assign({
title: colHeaderText,
width: "190px",
fixed: "right"
}, otherActionColumnProps), {
render: function render2(_, field) {
return /* @__PURE__ */ React__default.default.createElement(_Form.Item, null, /* @__PURE__ */ React__default.default.createElement(_Space, {
className: "fr-list-item-operate",
split: operateBtnType !== "icon" && /* @__PURE__ */ React__default.default.createElement(_Divider, {
type: "vertical"
})
}, !hideMove && /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
disabled: field.name === 0,
onClick: function onClick() {
return moveItem(field.name, field.name - 1);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$1, null)
}, moveUpBtnProps)
}), /* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
disabled: field.name === fields.length - 1,
onClick: function onClick() {
return moveItem(field.name, field.name + 1);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$2, null)
}, moveDownBtnProps)
})]
}), !hideDelete && /* @__PURE__ */ React__default.default.createElement(
_Popconfirm,
Object.assign({
onConfirm: function onConfirm() {
return removeItem(field.name);
}
}, delConfirmProps),
/* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
icon: /* @__PURE__ */ React__default.default.createElement(default_1$3, null),
btnType: operateBtnType
}, deleteBtnProps)
})
), !hideCopy && /* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
onClick: function onClick() {
return handleCopy(field.name);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$4, null)
}, copyBtnProps)
}), !hideEdit && /* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
onClick: function onClick() {
setVisible(true);
indexRef.current = field.name;
setItemData(form.getFieldValue(rootPath.concat(field.name)));
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$4, null)
}, editorBtnProps)
})));
}
}));
}
return /* @__PURE__ */ React__default.default.createElement("div", {
className: "fr-list-drawer"
}, /* @__PURE__ */ React__default.default.createElement(Table$1, {
size: "middle",
dataSource: fields,
columns,
style: {
marginBottom: "12px"
},
scroll: {
x: "max-content"
},
pagination: paginationConfig
}), (!schema2.max || fields.length < schema2.max) && !hideAdd && /* @__PURE__ */ React__default.default.createElement(Button$2, Object.assign({
icon: /* @__PURE__ */ React__default.default.createElement(default_1$5, null),
onClick: handleAdd
}, addBtnProps)), visible && /* @__PURE__ */ jsx(DrawerForm, {
schema: schema2,
data: itemData,
widgets,
configContext,
onClose: handleDrawerClose
}));
};
function _slicedToArray$4(arr, i2) {
return _arrayWithHoles$4(arr) || _iterableToArrayLimit$4(arr, i2) || _unsupportedIterableToArray$4(arr, i2) || _nonIterableRest$4();
}
function _nonIterableRest$4() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$4(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$4(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$4(o, minLen);
}
function _arrayLikeToArray$4(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArrayLimit$4(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _arrayWithHoles$4(arr) {
if (Array.isArray(arr))
return arr;
}
var VirtualCell = function VirtualCell2(props) {
var renderCore = props.renderCore, schema2 = props.schema, dataIndex = props.dataIndex, otherProps = __rest(props, ["renderCore", "schema", "dataIndex"]);
var _useState = React$a.useState(null), _useState2 = _slicedToArray$4(_useState, 2), errorMsg = _useState2[0], setErrorMsg = _useState2[1];
var _useState3 = React$a.useState(), _useState4 = _slicedToArray$4(_useState3, 2), visible = _useState4[0], setVisible = _useState4[1];
var mouseRef = React$a.useRef();
var onStatusChange = function onStatusChange2(_, errors) {
var message = errors[0] || null;
setErrorMsg(message);
if (mouseRef.current && message) {
setVisible(true);
}
};
if (!schema2.properties[dataIndex].onStatusChange) {
schema2.properties[dataIndex].onStatusChange = onStatusChange;
}
return /* @__PURE__ */ React__default.default.createElement("div", {
onMouseEnter: function onMouseEnter() {
mouseRef.current = true;
setVisible(true);
},
onMouseLeave: function onMouseLeave() {
mouseRef.current = false;
setVisible(false);
}
}, /* @__PURE__ */ React__default.default.createElement(_Popover, {
overlayClassName: "fr-popover-error",
content: errorMsg,
placement: "topRight",
open: visible && errorMsg
}, renderCore(Object.assign(Object.assign({}, otherProps), {
schema: schema2
}))));
};
function _typeof$3(obj) {
"@babel/helpers - typeof";
return _typeof$3 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof$3(obj);
}
var _excluded = ["style", "context"], _excluded2 = ["ctx"];
function ownKeys(object2, enumerableOnly) {
var keys2 = Object.keys(object2);
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(object2);
enumerableOnly && (symbols = symbols.filter(function(sym) {
return Object.getOwnPropertyDescriptor(object2, sym).enumerable;
})), keys2.push.apply(keys2, symbols);
}
return keys2;
}
function _objectSpread(target) {
for (var i2 = 1; i2 < arguments.length; i2++) {
var source = null != arguments[i2] ? arguments[i2] : {};
i2 % 2 ? ownKeys(Object(source), true).forEach(function(key2) {
_defineProperty$2(target, key2, source[key2]);
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function(key2) {
Object.defineProperty(target, key2, Object.getOwnPropertyDescriptor(source, key2));
});
}
return target;
}
function _defineProperty$2(obj, key2, value) {
key2 = _toPropertyKey$2(key2);
if (key2 in obj) {
Object.defineProperty(obj, key2, {
value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key2] = value;
}
return obj;
}
function _toPropertyKey$2(arg) {
var key2 = _toPrimitive$2(arg, "string");
return _typeof$3(key2) === "symbol" ? key2 : String(key2);
}
function _toPrimitive$2(input, hint) {
if (_typeof$3(input) !== "object" || input === null)
return input;
var prim = input[Symbol.toPrimitive];
if (prim !== void 0) {
var res = prim.call(input, hint || "default");
if (_typeof$3(res) !== "object")
return res;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return (hint === "string" ? String : Number)(input);
}
function _objectWithoutProperties(source, excluded) {
if (source == null)
return {};
var target = _objectWithoutPropertiesLoose(source, excluded);
var key2, i2;
if (Object.getOwnPropertySymbols) {
var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
for (i2 = 0; i2 < sourceSymbolKeys.length; i2++) {
key2 = sourceSymbolKeys[i2];
if (excluded.indexOf(key2) >= 0)
continue;
if (!Object.prototype.propertyIsEnumerable.call(source, key2))
continue;
target[key2] = source[key2];
}
}
return target;
}
function _objectWithoutPropertiesLoose(source, excluded) {
if (source == null)
return {};
var target = {};
var sourceKeys = Object.keys(source);
var key2, i2;
for (i2 = 0; i2 < sourceKeys.length; i2++) {
key2 = sourceKeys[i2];
if (excluded.indexOf(key2) >= 0)
continue;
target[key2] = source[key2];
}
return target;
}
var SCROLLEVT_NULL = 0 << 0;
var SCROLLEVT_INIT = 1 << 0;
var SCROLLEVT_RECOMPUTE = 1 << 1;
var SCROLLEVT_NATIVE = 1 << 3;
var SCROLLEVT_BY_HOOK = 1 << 6;
var TOP_CONTINUE = 0;
var TOP_DONE = 1;
var e_VT_STATE;
(function(e_VT_STATE2) {
e_VT_STATE2[e_VT_STATE2["INIT"] = 1] = "INIT";
e_VT_STATE2[e_VT_STATE2["LOADED"] = 2] = "LOADED";
e_VT_STATE2[e_VT_STATE2["RUNNING"] = 4] = "RUNNING";
})(e_VT_STATE || (e_VT_STATE = {}));
function default_context() {
return {
vt_state: e_VT_STATE.INIT,
possible_hight_per_tr: -1,
computed_h: 0,
re_computed: 0,
row_height: [],
row_count: 0,
prev_row_count: 0,
_offset_top: 0 | 0,
_offset_head: 0 | 0,
_offset_tail: 0 | 1,
WH: 0,
top: 0,
left: 0,
evt: SCROLLEVT_NULL,
end: false,
final_top: 0,
f_final_top: TOP_DONE,
update_count: 0,
indexMap: /* @__PURE__ */ new WeakMap(),
HND_PAINT: 0,
retry_count: 5
};
}
function log_debug(ctx2, msg) {
if (ctx2.debug) {
if (msg[0] === "+") {
return console.debug(msg.slice(1));
}
var d2 = new Date();
var tid = "".concat(d2.toLocaleTimeString(), ".").concat(d2.getMilliseconds());
console.debug("%c[".concat(ctx2.id, "][").concat(tid, "][").concat(msg, "]"), "color:#a00", ctx2);
}
}
var TableImpl = /* @__PURE__ */ React__namespace.forwardRef(function TableImpl2(props, ref) {
return /* @__PURE__ */ jsx("table", {
ref,
...props
});
});
function WrapperImpl(props) {
return /* @__PURE__ */ jsx("tbody", {
...props
});
}
var RowImpl = /* @__PURE__ */ React__namespace.forwardRef(function RowImpl2(props, ref) {
return /* @__PURE__ */ jsx("tr", {
ref,
...props
});
});
function scroll_with_offset(ctx2, top) {
var row_height = ctx2.row_height, row_count = ctx2.row_count, overscanRowCount = ctx2.overscanRowCount;
ctx2._scroll_y = ctx2.scroll.y;
if (typeof ctx2._scroll_y === "number") {
ctx2._y = ctx2._scroll_y;
} else if (typeof ctx2._scroll_y === "string") {
ctx2._y = ctx2.wrap_inst.current.parentElement.offsetHeight;
} else {
console.assert(false, "VT: did you forget to set `scroll.y`?");
ctx2._y = ctx2.wrap_inst.current.parentElement.offsetHeight;
}
console.assert(ctx2._y >= 0);
var _top = 0, i2 = 0, j2 = 0;
var torender_h = 0;
if (top === -1 && row_count > 0) {
i2 = row_count;
while (i2 > 0 && torender_h < ctx2._y) {
torender_h += row_height[--i2];
}
return [0 | i2, 0 | row_count, 0 | ctx2.computed_h - torender_h];
}
for (; i2 < row_count && _top < top; ++i2) {
_top += row_height[i2];
}
j2 = i2;
for (; j2 < row_count && torender_h < ctx2._y; ++j2) {
torender_h += row_height[j2];
}
var overscan = overscanRowCount < 0 ? 0 : overscanRowCount;
while (i2 > 0 && overscan--) {
_top -= row_height[--i2];
}
j2 += overscanRowCount;
if (j2 > row_count)
j2 = row_count;
return [0 | i2, 0 | j2, 0 | _top];
}
function set_offset(ctx2, top, head, tail) {
ctx2._offset_top = 0 | top;
ctx2._offset_head = 0 | head;
ctx2._offset_tail = 0 | tail;
}
function set_scroll(ctx2, top, left, evt, end) {
ctx2.top = top;
ctx2.left = left;
ctx2.evt = evt;
ctx2.end = end;
}
function scroll_to(ctx2, top, left) {
if (!ctx2.wrap_inst.current)
return;
var ele = ctx2.wrap_inst.current.parentElement;
ele.scrollTop = top;
ele.scrollLeft = Math.max(left, ele.scrollLeft);
}
function repainting(ctx2) {
if (ctx2.HND_PAINT)
return;
var cq = ctx2.cq, wrap_inst = ctx2.wrap_inst;
var fn = function fn2() {
ctx2.HND_PAINT = 0;
for (var i2 = 0; i2 < cq.length; ++i2) {
if (cq[i2].index >= ctx2._offset_head && cq[i2].index < ctx2._offset_tail) {
cq[i2].func();
}
}
if (ctx2.vt_state !== e_VT_STATE.RUNNING || !wrap_inst.current)
return;
var h2 = ctx2.computed_h;
if (ctx2.WH === h2)
return;
ctx2.WH = h2;
var s = wrap_inst.current.style;
s.height = h2 ? (s.maxHeight = h2 + "px", s.maxHeight) : (s.maxHeight = "unset", s.maxHeight);
ctx2.on_update_wrap_style();
};
ctx2.HND_PAINT = ctx2.evt === SCROLLEVT_NATIVE ? window.requestAnimationFrame(fn) : window.setTimeout(fn);
}
function srs_expand(ctx2, len, prev_len, fill_value) {
var slen = len - prev_len;
var shadow_rows = new Array(slen).fill(fill_value);
ctx2.row_height = ctx2.row_height.concat(shadow_rows);
ctx2.computed_h += slen * fill_value;
}
function srs_shrink(ctx2, len, prev_len) {
if (len === 0) {
ctx2.computed_h = 0;
ctx2.row_height.length = 0;
ctx2.top = 0;
return;
}
var rows = ctx2.row_height;
var h2shrink = 0;
for (var i2 = len; i2 < prev_len; ++i2) {
h2shrink += rows[i2];
}
ctx2.computed_h -= h2shrink;
}
function set_tr_cnt(ctx2, n2) {
ctx2.re_computed = n2 - ctx2.row_count;
ctx2.prev_row_count = ctx2.row_count;
ctx2.row_count = n2;
}
var VTable = function VTable2(props, ref) {
var style2 = props.style, context2 = props.context, rest = _objectWithoutProperties(props, _excluded);
var force = React$a.useState(0);
var ref_func = React$a.useRef(function() {
});
var scroll_hook;
var wrap_inst = React$a.useMemo(function() {
return /* @__PURE__ */ React__namespace.createRef();
}, []);
var ctx2 = React$a.useContext(context2);
React$a.useMemo(function() {
Object.assign(ctx2, default_context());
if (ctx2.wrap_inst && ctx2.wrap_inst.current) {
ctx2.wrap_inst.current.parentElement.removeEventListener("scroll", scroll_hook);
}
ctx2.wrap_inst = wrap_inst;
ctx2.top = ctx2.initTop;
ctx2.on_update_wrap_style = function() {
if (ctx2._y === 0 && "".concat(ctx2._scroll_y).length) {
scroll_hook({
flag: SCROLLEVT_BY_HOOK,
target: {
scrollTop: ctx2.top,
scrollLeft: ctx2.left
}
});
}
};
ctx2.cq = [];
var pfirst = 0;
var circleBufferSize = 0;
ctx2.cq.push = function(item) {
if (ctx2.vt_state !== e_VT_STATE.RUNNING)
return;
var size = ctx2._offset_tail - ctx2._offset_head + ctx2.overscanRowCount * 2 + 10;
circleBufferSize = Math.max(circleBufferSize, size);
if (pfirst > circleBufferSize) {
pfirst = 0;
}
ctx2.cq[pfirst++] = item;
return 0;
};
}, []);
var event_queue = React$a.useRef([]).current;
var RAF_update_self;
scroll_hook = React$a.useCallback(function(ev) {
if (ctx2.vt_state !== e_VT_STATE.RUNNING)
return;
var t0 = performance.now();
if (ev) {
if ("flag" in ev) {
event_queue.push(ev);
} else {
var target = ev.target;
var top = Math.max(target.scrollTop, 0);
event_queue.push({
target: {
scrollTop: top,
scrollLeft: target.scrollLeft
},
end: Math.abs(target.scrollHeight - target.clientHeight - Math.round(top)) <= (ctx2.offset || 0),
flag: SCROLLEVT_NATIVE
});
}
if (ctx2.f_final_top === TOP_CONTINUE) {
return RAF_update_self(t0);
}
}
if (ctx2.HND_RAF)
return;
ctx2.HND_RAF = window.setTimeout(function() {
return Promise.resolve().then(function() {
return RAF_update_self(t0);
});
});
}, []);
RAF_update_self = React$a.useCallback(function(time) {
ctx2.HND_RAF = 0;
var t1 = performance.now();
if (t1 - time > 10 && ctx2.retry_count-- > 0) {
scroll_hook();
return;
}
ctx2.retry_count = 5;
if (ctx2.vt_state !== e_VT_STATE.RUNNING)
return;
var evq = event_queue;
var e2;
if (!evq.length) {
return;
}
e2 = evq.pop();
evq.length = 0;
var etop = e2.target.scrollTop;
var eleft = e2.target.scrollLeft;
var flag = e2.flag;
log_debug(ctx2, "top: ".concat(etop, ", left: ").concat(eleft));
var offset2 = scroll_with_offset(ctx2, ctx2.f_final_top === TOP_CONTINUE ? ctx2.final_top : etop);
var head = offset2[0];
var tail = offset2[1];
var top = offset2[2];
var prev_head = ctx2._offset_head;
var prev_tail = ctx2._offset_tail;
var prev_top = ctx2._offset_top;
var end = false;
switch (flag) {
case SCROLLEVT_INIT:
log_debug(ctx2, "SCROLLEVT_INIT");
break;
case SCROLLEVT_BY_HOOK:
log_debug(ctx2, "SCROLLEVT_BY_HOOK");
if (head === prev_head && tail === prev_tail && top === prev_top) {
ctx2.f_final_top = TOP_DONE;
if (ctx2.final_top === -1)
etop = ctx2.computed_h - ctx2._y;
end = true;
} else {
if (ctx2.final_top === -1)
etop = top;
}
break;
case SCROLLEVT_RECOMPUTE:
if (head === prev_head && tail === prev_tail && top === prev_top) {
return;
}
log_debug(ctx2, "SCROLLEVT_RECOMPUTE");
break;
case SCROLLEVT_NATIVE:
if (head === prev_head && tail === prev_tail && top === prev_top) {
return;
}
log_debug(ctx2, "SCROLLEVT_NATIVE");
if (ctx2.onScroll) {
ctx2.onScroll({
top: etop,
left: eleft,
isEnd: e2.end
});
}
end = e2.end;
break;
}
set_offset(ctx2, top, head, tail);
set_scroll(ctx2, etop, eleft, flag, end);
force[1](++ctx2.update_count);
}, []);
React$a.useImperativeHandle(ref, function() {
var _scrollTo = function scrollTo2(y2) {
ctx2.f_final_top = TOP_CONTINUE;
ctx2.final_top = y2;
scroll_hook({
target: {
scrollTop: y2,
scrollLeft: -1
},
flag: SCROLLEVT_BY_HOOK
});
};
return {
scrollTo: function scrollTo2(y2) {
ref_func.current = function() {
return _scrollTo(y2);
};
ref_func.current();
},
scrollToIndex: function scrollToIndex(idx) {
ref_func.current = function() {
if (idx > ctx2.row_count - 1)
idx = ctx2.row_count - 1;
if (idx < 0)
idx = 0;
var y2 = 0;
for (var i2 = 0; i2 < idx; ++i2) {
y2 += ctx2.row_height[i2];
}
_scrollTo(y2);
};
ref_func.current();
}
};
}, []);
React$a.useEffect(function() {
var el = wrap_inst.current.parentElement;
try {
el.addEventListener("scroll", scroll_hook, {
passive: true
});
} catch (_unused) {
el.addEventListener("scroll", scroll_hook, false);
}
}, [wrap_inst.current]);
React$a.useEffect(function() {
scroll_hook({
flag: SCROLLEVT_BY_HOOK,
target: {
scrollLeft: ctx2.left,
scrollTop: ctx2.top
}
});
}, [ctx2.scroll.y]);
React$a.useEffect(function() {
switch (ctx2.evt) {
case SCROLLEVT_BY_HOOK:
if (ctx2.f_final_top === TOP_CONTINUE) {
ref_func.current();
} else {
scroll_to(ctx2, ctx2.top, ctx2.left);
}
break;
case SCROLLEVT_INIT:
case SCROLLEVT_RECOMPUTE:
scroll_to(ctx2, ctx2.top, ctx2.left);
break;
}
}, [force[0]]);
React$a.useEffect(function() {
switch (ctx2.vt_state) {
case e_VT_STATE.LOADED:
ctx2.vt_state = e_VT_STATE.RUNNING;
scroll_hook({
target: {
scrollTop: ctx2.top,
scrollLeft: 0
},
flag: SCROLLEVT_BY_HOOK
});
break;
case e_VT_STATE.RUNNING:
if (ctx2.re_computed !== 0) {
ctx2.re_computed = 0;
scroll_hook({
target: {
scrollTop: ctx2.top,
scrollLeft: ctx2.left
},
flag: SCROLLEVT_RECOMPUTE
});
}
break;
}
});
var wrapStyle = React$a.useMemo(function() {
return {
width: style2.width,
minWidth: "100%",
position: "relative",
transform: "translate(0)"
};
}, [style2.width]);
var tableStyle = React$a.useMemo(function() {
return _objectSpread(_objectSpread({}, style2), {}, {
width: void 0,
position: "relative",
top: ctx2._offset_top,
transform: "translate(0)"
});
}, [ctx2._offset_top]);
var internalCtx = React$a.useMemo(function() {
return _objectSpread({}, ctx2);
}, [ctx2.update_count]);
var Table2 = ctx2.components.table;
return /* @__PURE__ */ React__namespace.createElement("div", {
ref: wrap_inst,
style: wrapStyle
}, /* @__PURE__ */ React__namespace.createElement(
context2.Provider,
{
value: internalCtx
},
/* @__PURE__ */ jsx(Table2, {
...rest,
style: tableStyle
})
));
};
var VWrapper = function VWrapper2(props) {
var children = props.children, className = props.className, ctx2 = props.ctx;
var measureRow = children[0];
var rows = children[1];
var len = Array.isArray(rows) ? rows.length : 0;
var head = ctx2._offset_head, tail = ctx2._offset_tail;
var trs = [];
switch (ctx2.vt_state) {
case e_VT_STATE.INIT:
if (len >= 0) {
console.assert(head === 0);
console.assert(tail === 1);
if (Array.isArray(rows)) {
trs = rows.slice(head, tail);
ctx2.indexMap.set(trs[0].props.record, 0);
} else {
trs = rows;
}
ctx2.re_computed = len;
ctx2.prev_row_count = len;
ctx2.row_count = len;
}
break;
case e_VT_STATE.RUNNING:
{
if (tail > len) {
var offset2 = tail - len;
tail -= offset2;
head -= offset2;
if (head < 0)
head = 0;
if (tail < 0)
tail = 0;
set_offset(ctx2, ctx2._offset_top, head, tail);
}
if (ctx2.row_count !== len) {
set_tr_cnt(ctx2, len);
}
len = ctx2.row_count;
var prev_len = ctx2.prev_row_count;
if (len < prev_len) {
srs_shrink(ctx2, len, prev_len);
} else if (len > prev_len) {
var row_h = ctx2.row_height;
if (len - row_h.length > 0) {
srs_expand(ctx2, len, prev_len, ctx2.possible_hight_per_tr);
} else {
row_h.fill(ctx2.possible_hight_per_tr, prev_len, len);
ctx2.computed_h += ctx2.possible_hight_per_tr * (len - prev_len);
}
}
if (len) {
var _idx = head;
trs = rows.slice(_idx, tail);
trs.forEach(function(el) {
return ctx2.indexMap.set(el.props.record, _idx++);
});
} else {
trs = rows;
}
ctx2.prev_row_count = ctx2.row_count;
}
break;
case e_VT_STATE.LOADED:
console.assert(false);
break;
}
var Wrapper = ctx2.components.body.wrapper;
return /* @__PURE__ */ jsxs(Wrapper, {
className,
children: [measureRow, trs]
});
};
var VTRow = function VTRow2(props) {
var ref = /* @__PURE__ */ React__namespace.createRef();
var ctx2 = props.ctx, rest = _objectWithoutProperties(props, _excluded2);
var children = props.children;
var Row2 = ctx2.components.body.row;
if (!Array.isArray(children)) {
return /* @__PURE__ */ jsx(Row2, {
...rest,
children
});
}
var row_props = children[0].props;
var index2 = ctx2.indexMap.get(row_props.record);
var last_index = React$a.useRef(index2);
var expanded_cls = React$a.useMemo(function() {
return ".".concat(row_props.prefixCls, "-expanded-row");
}, [row_props.prefixCls]);
var t0 = performance.now();
React$a.useLayoutEffect(function() {
var t1 = performance.now();
log_debug(ctx2, "+idx ".concat(index2, " tooks ").concat(t1 - t0, " ms"));
if (ctx2.vt_state === e_VT_STATE.RUNNING) {
repainting(ctx2);
} else {
ctx2.possible_hight_per_tr = ref.current.offsetHeight;
srs_expand(ctx2, ctx2.row_count, 0, ctx2.possible_hight_per_tr);
repainting(ctx2);
ctx2.vt_state = e_VT_STATE.LOADED;
}
return function() {
repainting(ctx2);
};
}, []);
React$a.useEffect(function() {
ctx2.cq.push({
index: index2,
func: function func() {
var rowElm = ref.current;
if (!rowElm)
return;
var h2 = rowElm.offsetHeight;
var sibling = rowElm.nextSibling;
while (sibling && sibling.matches(expanded_cls)) {
h2 += sibling.offsetHeight;
sibling = sibling.nextSibling;
}
var curr_h = ctx2.row_height[index2];
var last_h = ctx2.row_height[last_index.current];
ctx2.computed_h -= curr_h;
ctx2.computed_h += last_h;
ctx2.computed_h += h2 - last_h;
ctx2.row_height[index2] = h2;
}
});
repainting(ctx2);
});
return /* @__PURE__ */ jsx(Row2, {
...rest,
ref
});
};
function _set_components(ctx2, components) {
var table = components.table, body = components.body, header = components.header;
ctx2.components.body = _objectSpread(_objectSpread({}, ctx2.components.body), body);
if (body && body.cell) {
ctx2._vtcomponents.body.cell = body.cell;
}
if (header) {
ctx2.components.header = header;
ctx2._vtcomponents.header = header;
}
if (table) {
ctx2.components.table = table;
}
}
function init(fnOpts, deps) {
var ctx2 = React$a.useRef(/* @__PURE__ */ React__namespace.createContext({})).current;
var ctx_value = React$a.useContext(ctx2);
var default_ref = React$a.useRef({
scrollTo: function scrollTo2(y2) {
},
scrollToIndex: function scrollToIndex(idx) {
}
});
React$a.useMemo(function() {
return Object.assign(ctx_value, {
id: (+new Date()).toString(36).slice(4),
initTop: 0,
overscanRowCount: 5,
debug: false,
ref: default_ref
}, fnOpts());
}, deps);
React$a.useMemo(function() {
var VT = /* @__PURE__ */ React__namespace.forwardRef(VTable);
ctx_value._vtcomponents = {
table: function table(props) {
return /* @__PURE__ */ jsx(VT, {
...props,
context: ctx2,
ref: ctx_value.ref
});
},
body: {
wrapper: function wrapper(props) {
return /* @__PURE__ */ React__namespace.createElement(ctx2.Consumer, null, function() {
return /* @__PURE__ */ jsx(VWrapper, {
...props,
ctx: ctx_value
});
});
},
row: function row(props) {
return /* @__PURE__ */ jsx(VTRow, {
...props,
ctx: ctx_value
});
}
}
};
ctx_value.components = {};
_set_components(ctx_value, {
table: TableImpl,
body: {
wrapper: WrapperImpl,
row: RowImpl
}
});
ctx_value.vt_state = e_VT_STATE.INIT;
}, []);
return ctx_value;
}
function _typeof$2(obj) {
"@babel/helpers - typeof";
return _typeof$2 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof$2(obj);
}
var _brower = 1;
var _node = 2;
(function() {
var env = (typeof window === "undefined" ? "undefined" : _typeof$2(window)) === "object" && window instanceof Window ? _brower : _node;
if (env & _brower) {
if (!Object.hasOwnProperty.call(window, "requestAnimationFrame") && !window.requestAnimationFrame)
throw new Error("Please using the modern browers or appropriate polyfill!");
}
})();
function useVT(fnOpts, deps) {
var ctx2 = init(fnOpts, deps || []);
return [ctx2._vtcomponents, function(components) {
return _set_components(ctx2, components);
}, ctx2.ref];
}
const index$5 = "";
function _typeof$1(obj) {
"@babel/helpers - typeof";
return _typeof$1 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof$1(obj);
}
function _toConsumableArray$1(arr) {
return _arrayWithoutHoles$1(arr) || _iterableToArray$1(arr) || _unsupportedIterableToArray$3(arr) || _nonIterableSpread$1();
}
function _nonIterableSpread$1() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _iterableToArray$1(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
return Array.from(iter);
}
function _arrayWithoutHoles$1(arr) {
if (Array.isArray(arr))
return _arrayLikeToArray$3(arr);
}
function _defineProperty$1(obj, key2, value) {
key2 = _toPropertyKey$1(key2);
if (key2 in obj) {
Object.defineProperty(obj, key2, {
value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key2] = value;
}
return obj;
}
function _toPropertyKey$1(arg) {
var key2 = _toPrimitive$1(arg, "string");
return _typeof$1(key2) === "symbol" ? key2 : String(key2);
}
function _toPrimitive$1(input, hint) {
if (_typeof$1(input) !== "object" || input === null)
return input;
var prim = input[Symbol.toPrimitive];
if (prim !== void 0) {
var res = prim.call(input, hint || "default");
if (_typeof$1(res) !== "object")
return res;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return (hint === "string" ? String : Number)(input);
}
function _slicedToArray$3(arr, i2) {
return _arrayWithHoles$3(arr) || _iterableToArrayLimit$3(arr, i2) || _unsupportedIterableToArray$3(arr, i2) || _nonIterableRest$3();
}
function _nonIterableRest$3() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$3(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$3(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$3(o, minLen);
}
function _arrayLikeToArray$3(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArrayLimit$3(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _arrayWithHoles$3(arr) {
if (Array.isArray(arr))
return arr;
}
var getTooltip = function getTooltip2(tooltip) {
if (!tooltip) {
return;
}
if (typeof tooltip === "string") {
return {
title: /* @__PURE__ */ jsx("span", {
dangerouslySetInnerHTML: {
__html: tooltip
}
})
};
}
return Object.assign(Object.assign({}, tooltip), {
title: /* @__PURE__ */ jsx("span", {
dangerouslySetInnerHTML: {
__html: tooltip.title
}
})
});
};
var VirtualList = function VirtualList2(props) {
var _a, _b;
var form = props.form, schema2 = props.schema, fields = props.fields, rootPath = props.rootPath, renderCore = props.renderCore, readOnly = props.readOnly, operateBtnType = props.operateBtnType, addBtnProps = props.addBtnProps, delConfirmProps = props.delConfirmProps, copyBtnProps = props.copyBtnProps, deleteBtnProps = props.deleteBtnProps, moveUpBtnProps = props.moveUpBtnProps, moveDownBtnProps = props.moveDownBtnProps, actionColumnProps = props.actionColumnProps, _props$scrollY = props.scrollY, scrollY = _props$scrollY === void 0 ? 600 : _props$scrollY, hideDelete = props.hideDelete, hideCopy = props.hideCopy, hideMove = props.hideMove, hideAdd = props.hideAdd, addItem = props.addItem, copyItem = props.copyItem, moveItem = props.moveItem, removeItem = props.removeItem, configContext = props.configContext, validatePopover = props.validatePopover;
var globalConfig2 = configContext.globalConfig;
var islidatePopover = (_a = validatePopover !== null && validatePopover !== void 0 ? validatePopover : globalConfig2 === null || globalConfig2 === void 0 ? void 0 : globalConfig2.listValidatePopover) !== null && _a !== void 0 ? _a : true;
var colHeaderText = actionColumnProps.colHeaderText, otherActionColumnProps = __rest(actionColumnProps, ["colHeaderText"]);
var itemSchema = ((_b = schema2 === null || schema2 === void 0 ? void 0 : schema2.items) === null || _b === void 0 ? void 0 : _b.properties) || {};
var _useVT = useVT(function() {
return {
scroll: {
y: scrollY
}
};
}, []), _useVT2 = _slicedToArray$3(_useVT, 2), vt = _useVT2[0];
_useVT2[1];
var handleCopy = function handleCopy2(name2) {
var value = form.getFieldValue(rootPath.concat(name2));
copyItem(value);
};
var columns = sortProperties(Object.entries(itemSchema)).map(function(_ref) {
var _ref2 = _slicedToArray$3(_ref, 2), dataIndex = _ref2[0], item = _ref2[1];
var required2 = item.required, title = item.title, width = item.width, tooltip = item.tooltip;
var tooltipProps = getTooltip(tooltip);
return {
dataIndex,
width,
title: /* @__PURE__ */ jsxs(Fragment, {
children: [required2 && /* @__PURE__ */ jsx("span", {
style: {
color: "red",
marginRight: "3px"
},
children: "*"
}), /* @__PURE__ */ jsx("span", {
children: title
}), tooltipProps && /* @__PURE__ */ React__default.default.createElement(_Tooltip, Object.assign({
placement: "top"
}, tooltipProps), /* @__PURE__ */ React__default.default.createElement(default_1, {
style: {
marginLeft: 6
}
}))]
}),
render: function render2(_, field) {
var fieldSchema = {
type: "object",
properties: _defineProperty$1({}, dataIndex, Object.assign(Object.assign({}, itemSchema[dataIndex]), {
fieldCol: 24
}))
};
if (!islidatePopover) {
return /* @__PURE__ */ jsx("div", {
className: "fr-table-cell-content",
children: renderCore({
parentPath: [field.name],
rootPath: [].concat(_toConsumableArray$1(rootPath), [field.name]),
schema: fieldSchema
})
});
}
return /* @__PURE__ */ jsx(VirtualCell, {
renderCore,
schema: fieldSchema,
parentPath: [field.name],
rootPath: [].concat(_toConsumableArray$1(rootPath), [field.name]),
dataIndex
});
}
};
});
if (!readOnly) {
columns.push(Object.assign(Object.assign({
title: colHeaderText,
width: "190px",
fixed: "right"
}, otherActionColumnProps), {
render: function render2(_, field) {
return /* @__PURE__ */ React__default.default.createElement(_Form.Item, null, /* @__PURE__ */ React__default.default.createElement(_Space, {
className: "fr-list-item-operate",
split: operateBtnType !== "icon" && /* @__PURE__ */ React__default.default.createElement(_Divider, {
type: "vertical"
})
}, !hideMove && /* @__PURE__ */ jsxs(Fragment, {
children: [/* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
disabled: field.name === 0,
onClick: function onClick() {
return moveItem(field.name, field.name - 1);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$1, null)
}, moveUpBtnProps)
}), /* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
disabled: field.name === fields.length - 1,
onClick: function onClick() {
return moveItem(field.name, field.name + 1);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$2, null)
}, moveDownBtnProps)
})]
}), !hideDelete && /* @__PURE__ */ React__default.default.createElement(
_Popconfirm,
Object.assign({
onConfirm: function onConfirm() {
return removeItem(field.name);
}
}, delConfirmProps),
/* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
icon: /* @__PURE__ */ React__default.default.createElement(default_1$3, null),
btnType: operateBtnType
}, deleteBtnProps)
})
), !hideCopy && /* @__PURE__ */ jsx(HeaderTitle, {
...Object.assign({
onClick: function onClick() {
return handleCopy(field.name);
},
icon: /* @__PURE__ */ React__default.default.createElement(default_1$4, null)
}, copyBtnProps)
})));
}
}));
}
return /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, /* @__PURE__ */ React__default.default.createElement(Table$1, {
className: classnames("fr-virtual-list", {
"fr-virtual-list-no-popover": !islidatePopover
}),
size: "middle",
columns,
dataSource: fields,
pagination: false,
scroll: {
y: scrollY
},
components: vt
}), (!schema2.max || fields.length < schema2.max) && !hideAdd && /* @__PURE__ */ React__default.default.createElement(Button$2, Object.assign({
icon: /* @__PURE__ */ React__default.default.createElement(default_1$5, null),
onClick: function onClick() {
return addItem();
}
}, addBtnProps)));
};
const index$4 = "";
function _toConsumableArray(arr) {
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray$2(arr) || _nonIterableSpread();
}
function _nonIterableSpread() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _iterableToArray(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
return Array.from(iter);
}
function _arrayWithoutHoles(arr) {
if (Array.isArray(arr))
return _arrayLikeToArray$2(arr);
}
function _slicedToArray$2(arr, i2) {
return _arrayWithHoles$2(arr) || _iterableToArrayLimit$2(arr, i2) || _unsupportedIterableToArray$2(arr, i2) || _nonIterableRest$2();
}
function _nonIterableRest$2() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$2(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$2(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$2(o, minLen);
}
function _arrayLikeToArray$2(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArrayLimit$2(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _arrayWithHoles$2(arr) {
if (Array.isArray(arr))
return arr;
}
var TabPane = Tabs.TabPane;
var TabList = function TabList2(props) {
var schema2 = props.schema, fields = props.fields, rootPath = props.rootPath, renderCore = props.renderCore, readOnly = props.readOnly, delConfirmProps = props.delConfirmProps, tabName = props.tabName, hideDelete = props.hideDelete, hideAdd = props.hideAdd, addItem = props.addItem, removeItem = props.removeItem, _props$tabItemProps = props.tabItemProps, tabItemProps = _props$tabItemProps === void 0 ? {} : _props$tabItemProps;
var _useState = React$a.useState("0"), _useState2 = _slicedToArray$2(_useState, 2), activeKey = _useState2[0], setActiveKey = _useState2[1];
var configCtx = React$a.useContext(_ConfigProvider.ConfigContext);
var t2 = translation(configCtx);
var getCurrentTabPaneName = function getCurrentTabPaneName2(idx) {
return tabName instanceof Array ? tabName[idx] || idx + 1 : "".concat(tabName || t2("item"), " ").concat(idx + 1);
};
var handleDelete = function handleDelete2(targetKey) {
removeItem(targetKey);
setActiveKey("".concat(targetKey > 1 ? targetKey - 1 : 0));
};
var handleEdit = function handleEdit2(targetKey, action) {
if (action === "add") {
if ((!schema2.max || fields.length < schema2.max) && !readOnly && !hideAdd) {
addItem();
var currentKey = fields.length;
setActiveKey("".concat(currentKey));
}
} else if (action === "remove") {
return null;
} else {
return null;
}
};
var renderClose = function renderClose2(name2) {
return !readOnly && !hideDelete ? /* @__PURE__ */ React__default.default.createElement(_Popconfirm, Object.assign({
onConfirm: function onConfirm() {
return handleDelete(name2);
}
}, delConfirmProps), /* @__PURE__ */ React__default.default.createElement(default_1$3, null)) : /* @__PURE__ */ jsx(Fragment, {});
};
return /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, /* @__PURE__ */ React__default.default.createElement(Tabs, {
className: "fr-tab-list",
type: "editable-card",
onChange: setActiveKey,
activeKey: activeKey + "",
onEdit: handleEdit,
hideAdd: readOnly || hideAdd
}, fields.map(function(_ref) {
_ref.key;
var name2 = _ref.name;
return /* @__PURE__ */ jsx(TabPane, {
...Object.assign({}, tabItemProps, {
tab: getCurrentTabPaneName(name2),
key: name2,
className: "fr-list-item",
closeIcon: renderClose(name2)
}),
children: /* @__PURE__ */ jsx("div", {
style: {
flex: 1
},
children: renderCore({
schema: schema2,
parentPath: [name2],
rootPath: [].concat(_toConsumableArray(rootPath), [name2])
})
})
});
})));
};
const index$3 = "";
function _typeof(obj) {
"@babel/helpers - typeof";
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
return typeof obj2;
} : function(obj2) {
return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
}, _typeof(obj);
}
function _defineProperty(obj, key2, value) {
key2 = _toPropertyKey(key2);
if (key2 in obj) {
Object.defineProperty(obj, key2, {
value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key2] = value;
}
return obj;
}
function _toPropertyKey(arg) {
var key2 = _toPrimitive(arg, "string");
return _typeof(key2) === "symbol" ? key2 : String(key2);
}
function _toPrimitive(input, hint) {
if (_typeof(input) !== "object" || input === null)
return input;
var prim = input[Symbol.toPrimitive];
if (prim !== void 0) {
var res = prim.call(input, hint || "default");
if (_typeof(res) !== "object")
return res;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return (hint === "string" ? String : Number)(input);
}
const index$2 = function(_ref) {
var schema2 = _ref.schema;
return /* @__PURE__ */ jsx("div", {
className: classnames("fr-void-title", _defineProperty({}, schema2 === null || schema2 === void 0 ? void 0 : schema2.className, !!(schema2 === null || schema2 === void 0 ? void 0 : schema2.className))),
children: schema2.title
});
};
var ErrorSchema = function ErrorSchema2(schema2) {
var configCtx = React$a.useContext(_ConfigProvider.ConfigContext);
var t2 = translation(configCtx);
return /* @__PURE__ */ jsxs("div", {
children: [/* @__PURE__ */ jsx("div", {
style: {
color: "red"
},
children: t2("schema_not_match")
}), /* @__PURE__ */ jsx("div", {
children: JSON.stringify(schema2)
})]
});
};
const defaultWidgets = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
Input,
InputNumber,
TextArea: TextArea$1,
Select: MultiSelect,
MultiSelect,
Switch,
Radio,
Rate: index$H,
TreeSelect,
Checkbox,
Checkboxes: Checkboxes$1,
Color,
DatePicker,
DateRange: DateRange$1,
TimePicker,
TimeRange,
ImageInput: ImageInput$1,
UrlInput: UrlInput$1,
Slider,
Upload: FrUpload,
Html: html,
PercentSlider,
Card: BoxCard,
Collapse: BoxCollapse,
SubInline: BoxSubInline,
LineTitle: FLineTitle,
SimpleList,
CardList,
TableList: TableList$1,
DrawerList: TableList,
VirtualList,
TabList,
VoidTitle: index$2,
ErrorSchema
}, Symbol.toStringTag, { value: "Module" }));
function _slicedToArray$1(arr, i2) {
return _arrayWithHoles$1(arr) || _iterableToArrayLimit$1(arr, i2) || _unsupportedIterableToArray$1(arr, i2) || _nonIterableRest$1();
}
function _nonIterableRest$1() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray$1(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray$1(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray$1(o, minLen);
}
function _arrayLikeToArray$1(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArrayLimit$1(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _arrayWithHoles$1(arr) {
if (Array.isArray(arr))
return arr;
}
function flattenSchema() {
var _schema = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
var name2 = arguments.length > 1 ? arguments[1] : void 0;
var parent2 = arguments.length > 2 ? arguments[2] : void 0;
var _result = arguments.length > 3 ? arguments[3] : void 0;
var result = _result || {};
var schema2 = _cloneDeep(_schema) || {};
var _name = name2 || "#";
if (!schema2.$id) {
schema2.$id = _name;
}
var children = [];
if (isObjType(schema2)) {
sortProperties(Object.entries(schema2.properties)).forEach(function(_ref) {
var _ref2 = _slicedToArray$1(_ref, 2), key2 = _ref2[0], value = _ref2[1];
var _key = isListType(value) ? key2 + "[]" : key2;
var uniqueName = _name === "#" ? _key : _name + "." + _key;
children.push(uniqueName);
flattenSchema(value, uniqueName, _name, result);
});
schema2.properties = {};
}
if (isListType(schema2)) {
sortProperties(Object.entries(schema2.items.properties)).forEach(function(_ref3) {
var _ref4 = _slicedToArray$1(_ref3, 2), key2 = _ref4[0], value = _ref4[1];
var _key = isListType(value) ? key2 + "[]" : key2;
var uniqueName = _name === "#" ? _key : _name + "." + _key;
children.push(uniqueName);
flattenSchema(value, uniqueName, _name, result);
});
schema2.items.properties = {};
}
if (schema2.type) {
result[_name] = {
parent: parent2,
schema: schema2,
children
};
}
return result;
}
function _slicedToArray(arr, i2) {
return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i2) || _unsupportedIterableToArray(arr, i2) || _nonIterableRest();
}
function _nonIterableRest() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _arrayLikeToArray(o, minLen);
var n2 = Object.prototype.toString.call(o).slice(8, -1);
if (n2 === "Object" && o.constructor)
n2 = o.constructor.name;
if (n2 === "Map" || n2 === "Set")
return Array.from(o);
if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2))
return _arrayLikeToArray(o, minLen);
}
function _arrayLikeToArray(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i2 = 0, arr2 = new Array(len); i2 < len; i2++)
arr2[i2] = arr[i2];
return arr2;
}
function _iterableToArrayLimit(arr, i2) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null != _i) {
var _s, _e, _x, _r, _arr = [], _n = true, _d = false;
try {
if (_x = (_i = _i.call(arr)).next, 0 === i2) {
if (Object(_i) !== _i)
return;
_n = false;
} else
for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i2); _n = true)
;
} catch (err) {
_d = true, _e = err;
} finally {
try {
if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r))
return;
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
}
function _arrayWithHoles(arr) {
if (Array.isArray(arr))
return arr;
}
var updateSchemaByPath = function updateSchemaByPath2(_path, _newSchema, formSchema) {
var path2 = getSchemaFullPath(_path, formSchema);
var currSchema = _get(formSchema, path2, {});
var newSchema = isFunction$2(_newSchema) ? _newSchema(currSchema) : _newSchema;
var result = Object.assign(Object.assign({}, currSchema), newSchema);
if (newSchema.props) {
result.props = Object.assign(Object.assign({}, currSchema === null || currSchema === void 0 ? void 0 : currSchema.props), newSchema.props);
}
_set(formSchema, path2, result);
};
var getFieldName = function getFieldName2(_path) {
if (!_path) {
return void 0;
}
if (typeof _path === "boolean") {
return _path;
}
var result = [];
if (isArray$2(_path)) {
result = _path.map(function(item) {
return item.split(".").map(function(ite) {
if (!isNaN(Number(ite))) {
return ite * 1;
}
return ite;
});
});
}
result = _path.split(".").map(function(item) {
if (!isNaN(Number(item))) {
return item * 1;
}
return item;
});
result = result.map(function(item) {
if (typeof item === "string" && (item === null || item === void 0 ? void 0 : item.indexOf("[")) === 0 && (item === null || item === void 0 ? void 0 : item.indexOf("]")) === (item === null || item === void 0 ? void 0 : item.length) - 1) {
return Number(item.substring(1, item.length - 1));
}
return item;
});
return result;
};
var useForm = function useForm2() {
var _Form$useForm = _Form.useForm(), _Form$useForm2 = _slicedToArray(_Form$useForm, 1), form = _Form$useForm2[0];
var flattenSchemaRef = React$a.useRef({});
var storeRef = React$a.useRef();
var schemaRef = React$a.useRef({});
var fieldRefs = React$a.useRef({});
form.getFieldError;
var getFieldsError = form.getFieldsError, getFieldInstance = form.getFieldInstance, setFieldsValue = form.setFieldsValue, setFields = form.setFields, scrollToField = form.scrollToField, isFieldsTouched = form.isFieldsTouched, isFieldTouched = form.isFieldTouched, isFieldValidating = form.isFieldValidating, resetFields = form.resetFields, validateFields = form.validateFields, otherForm = __rest(form, ["getFieldError", "getFieldsError", "getFieldInstance", "setFieldsValue", "setFields", "scrollToField", "isFieldsTouched", "isFieldTouched", "isFieldValidating", "resetFields", "validateFields"]);
var xform = otherForm;
var setStoreData = function setStoreData2(data) {
var setState = storeRef.current.setState;
if (!setState) {
setTimeout(function() {
setState({
schema: schemaRef.current,
flattenSchema: flattenSchemaRef.current
});
}, 0);
}
setState(data);
};
var handleSchemaUpdate = function handleSchemaUpdate2(newSchema) {
flattenSchemaRef.current = flattenSchema(newSchema) || {};
schemaRef.current = newSchema;
setStoreData({
schema: newSchema,
flattenSchema: flattenSchemaRef.current
});
};
xform.setSchema = function(obj) {
var cover = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
if (!isObject$5(obj)) {
return;
}
if (cover) {
handleSchemaUpdate(obj);
return;
}
var schema2 = _cloneDeep(schemaRef.current);
Object.keys(obj || {}).forEach(function(path2) {
updateSchemaByPath(path2, obj[path2], schema2);
});
handleSchemaUpdate(schema2);
};
xform.setSchemaByPath = function(_path, _newSchema) {
if (!hasFuncProperty(_newSchema) && _isMatch(_newSchema, xform.getSchemaByPath(_path))) {
return;
}
var schema2 = _cloneDeep(schemaRef.current);
updateSchemaByPath(_path, _newSchema, schema2);
handleSchemaUpdate(schema2);
};
xform.setValues = function(_values) {
var values = parseBindToValues(_values, flattenSchemaRef.current);
setFieldsValue(values);
};
xform.getValues = function(nameList, filterFunc) {
var values = form.getFieldsValue(getFieldName(nameList), filterFunc);
values = valueRemoveUndefined(values);
return parseValuesToBind(values, flattenSchemaRef.current);
};
xform.getValueByPath = function(path2) {
var name2 = getFieldName(path2);
return form.getFieldValue(name2);
};
xform.setValueByPath = function(path2, value) {
if (!form.setFieldValue) {
var values = form.getFieldsValue();
_set(values, path2, value);
xform.setValues(values);
return;
}
var name2 = getFieldName(path2);
form.setFieldValue(name2, value);
try {
if (JSON.stringify(form.getFieldValue(name2)) !== JSON.stringify(value)) {
form.setFieldValue(name2, value);
}
} catch (error) {
}
};
xform.getSchemaByPath = function(_path) {
if (typeof _path !== "string") {
console.warn("\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u8DEF\u5F84");
}
var path2 = getSchemaFullPath(_path, schemaRef.current);
return _get(schemaRef.current, path2);
};
xform.getSchema = function() {
return schemaRef.current;
};
xform.setErrorFields = function(fieldsError) {
var fieldsData = transformFieldsData(fieldsError, getFieldName);
if (!fieldsData) {
return;
}
setFields(fieldsData);
};
xform.removeErrorField = function(path2) {
setFields([{
name: getFieldName(path2),
errors: []
}]);
};
xform.getFieldError = function(path2) {
var name2 = getFieldName(path2);
return form.getFieldError(name2);
};
xform.getFieldsError = function(path2) {
var name2 = getFieldName(path2);
return getFieldsError(name2);
};
xform.getFieldInstance = function(path2) {
var name2 = getFieldName(path2);
return getFieldInstance(name2);
};
xform.getHiddenValues = function() {
var values = xform.getValues();
var allValues = xform.getValues(true);
var hiddenValues = {};
var recursion = function recursion2(obj1, obj2, path2) {
Object.keys(obj1).forEach(function(key2) {
var value = obj1[key2];
var _path = path2 ? "".concat(path2, ".").concat(key2) : key2;
if (!obj2.hasOwnProperty(key2)) {
_set(hiddenValues, _path, value);
return;
}
if (isObject$5(value)) {
recursion2(value, obj2[key2], _path);
}
if (isArray$2(value)) {
value.map(function(item, index2) {
recursion2(item, _get(obj2, "".concat(key2, "[").concat(index2, "]"), []), "".concat(_path, "[").concat(index2, "]"));
});
}
});
};
recursion(allValues, values, null);
return hiddenValues;
};
xform.setFields = function(nameList) {
var fieldsData = transformFieldsData(nameList, getFieldName);
if (!fieldsData) {
return;
}
setFields(fieldsData);
};
xform.__initStore = function(store2) {
storeRef.current = store2;
};
xform.scrollToPath = function(path2) {
var name2 = getFieldName(path2);
for (var _len = arguments.length, rest = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
rest[_key - 1] = arguments[_key];
}
scrollToField.apply(void 0, [name2].concat(rest));
};
xform.isFieldsTouched = function(pathList, allTouched) {
var nameList = (pathList || []).map(function(path2) {
return getFieldName(path2);
});
return isFieldsTouched(nameList, allTouched);
};
xform.isFieldTouched = function(path2) {
var name2 = getFieldName(path2);
return isFieldTouched(name2);
};
xform.isFieldValidating = function(path2) {
var name2 = getFieldName(path2);
return isFieldValidating(name2);
};
xform.resetFields = function(pathList) {
var nameList = (pathList || []).map(function(path2) {
return getFieldName(path2);
});
if (nameList.length > 0) {
resetFields(nameList);
} else {
resetFields();
}
};
xform.validateFields = function(pathList) {
var nameList = (pathList || []).map(function(path2) {
return getFieldName(path2);
});
if (nameList.length > 0) {
return validateFields(nameList);
}
return validateFields();
};
xform.getFlattenSchema = function(path2) {
var _a;
if (!path2) {
return flattenSchemaRef.current;
}
return (_a = flattenSchemaRef.current) === null || _a === void 0 ? void 0 : _a[path2];
};
xform.onItemChange = xform.setValueByPath;
xform.setFieldRef = function(path2, ref) {
if (!path2) {
return;
}
fieldRefs.current[path2] = ref;
};
xform.getFieldRef = function(path2) {
return fieldRefs.current[path2];
};
return xform;
};
const index$1 = "";
const FormRender = withProvider(FormCore, defaultWidgets);
const schema = {
type: "object",
properties: {
list: {
title: "\u6536\u85CF\u7F51\u5740\u5217\u8868",
type: "array",
widget: "CardList",
defaultValue: [{}],
items: {
type: "object",
widget: "card",
title: "List.Item",
properties: {
input1: {
title: "\u7F51\u5740\u540D\u5B57",
type: "string"
},
input2: {
title: "\u7F51\u5740\u94FE\u63A5",
type: "string"
},
jump: {
widget: "JumpButton",
props: {
hrefUrl: "{{ formData.list }}"
}
}
}
}
}
}
};
const antd = "";
const App$1 = "";
function bind(fn, thisArg) {
return function wrap2() {
return fn.apply(thisArg, arguments);
};
}
const { toString } = Object.prototype;
const { getPrototypeOf } = Object;
const kindOf = ((cache) => (thing) => {
const str = toString.call(thing);
return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());
})(/* @__PURE__ */ Object.create(null));
const kindOfTest = (type2) => {
type2 = type2.toLowerCase();
return (thing) => kindOf(thing) === type2;
};
const typeOfTest = (type2) => (thing) => typeof thing === type2;
const { isArray } = Array;
const isUndefined = typeOfTest("undefined");
function isBuffer(val) {
return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);
}
const isArrayBuffer = kindOfTest("ArrayBuffer");
function isArrayBufferView(val) {
let result;
if (typeof ArrayBuffer !== "undefined" && ArrayBuffer.isView) {
result = ArrayBuffer.isView(val);
} else {
result = val && val.buffer && isArrayBuffer(val.buffer);
}
return result;
}
const isString = typeOfTest("string");
const isFunction = typeOfTest("function");
const isNumber = typeOfTest("number");
const isObject = (thing) => thing !== null && typeof thing === "object";
const isBoolean = (thing) => thing === true || thing === false;
const isPlainObject = (val) => {
if (kindOf(val) !== "object") {
return false;
}
const prototype2 = getPrototypeOf(val);
return (prototype2 === null || prototype2 === Object.prototype || Object.getPrototypeOf(prototype2) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);
};
const isDate = kindOfTest("Date");
const isFile = kindOfTest("File");
const isBlob = kindOfTest("Blob");
const isFileList = kindOfTest("FileList");
const isStream = (val) => isObject(val) && isFunction(val.pipe);
const isFormData = (thing) => {
const pattern2 = "[object FormData]";
return thing && (typeof FormData === "function" && thing instanceof FormData || toString.call(thing) === pattern2 || isFunction(thing.toString) && thing.toString() === pattern2);
};
const isURLSearchParams = kindOfTest("URLSearchParams");
const trim = (str) => str.trim ? str.trim() : str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, "");
function forEach(obj, fn, { allOwnKeys = false } = {}) {
if (obj === null || typeof obj === "undefined") {
return;
}
let i2;
let l2;
if (typeof obj !== "object") {
obj = [obj];
}
if (isArray(obj)) {
for (i2 = 0, l2 = obj.length; i2 < l2; i2++) {
fn.call(null, obj[i2], i2, obj);
}
} else {
const keys2 = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);
const len = keys2.length;
let key2;
for (i2 = 0; i2 < len; i2++) {
key2 = keys2[i2];
fn.call(null, obj[key2], key2, obj);
}
}
}
function findKey(obj, key2) {
key2 = key2.toLowerCase();
const keys2 = Object.keys(obj);
let i2 = keys2.length;
let _key;
while (i2-- > 0) {
_key = keys2[i2];
if (key2 === _key.toLowerCase()) {
return _key;
}
}
return null;
}
const _global = (() => {
if (typeof globalThis !== "undefined")
return globalThis;
return typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : global;
})();
const isContextDefined = (context2) => !isUndefined(context2) && context2 !== _global;
function merge() {
const { caseless } = isContextDefined(this) && this || {};
const result = {};
const assignValue2 = (val, key2) => {
const targetKey = caseless && findKey(result, key2) || key2;
if (isPlainObject(result[targetKey]) && isPlainObject(val)) {
result[targetKey] = merge(result[targetKey], val);
} else if (isPlainObject(val)) {
result[targetKey] = merge({}, val);
} else if (isArray(val)) {
result[targetKey] = val.slice();
} else {
result[targetKey] = val;
}
};
for (let i2 = 0, l2 = arguments.length; i2 < l2; i2++) {
arguments[i2] && forEach(arguments[i2], assignValue2);
}
return result;
}
const extend = (a, b2, thisArg, { allOwnKeys } = {}) => {
forEach(b2, (val, key2) => {
if (thisArg && isFunction(val)) {
a[key2] = bind(val, thisArg);
} else {
a[key2] = val;
}
}, { allOwnKeys });
return a;
};
const stripBOM = (content) => {
if (content.charCodeAt(0) === 65279) {
content = content.slice(1);
}
return content;
};
const inherits = (constructor, superConstructor, props, descriptors2) => {
constructor.prototype = Object.create(superConstructor.prototype, descriptors2);
constructor.prototype.constructor = constructor;
Object.defineProperty(constructor, "super", {
value: superConstructor.prototype
});
props && Object.assign(constructor.prototype, props);
};
const toFlatObject = (sourceObj, destObj, filter2, propFilter) => {
let props;
let i2;
let prop;
const merged = {};
destObj = destObj || {};
if (sourceObj == null)
return destObj;
do {
props = Object.getOwnPropertyNames(sourceObj);
i2 = props.length;
while (i2-- > 0) {
prop = props[i2];
if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {
destObj[prop] = sourceObj[prop];
merged[prop] = true;
}
}
sourceObj = filter2 !== false && getPrototypeOf(sourceObj);
} while (sourceObj && (!filter2 || filter2(sourceObj, destObj)) && sourceObj !== Object.prototype);
return destObj;
};
const endsWith = (str, searchString, position) => {
str = String(str);
if (position === void 0 || position > str.length) {
position = str.length;
}
position -= searchString.length;
const lastIndex = str.indexOf(searchString, position);
return lastIndex !== -1 && lastIndex === position;
};
const toArray = (thing) => {
if (!thing)
return null;
if (isArray(thing))
return thing;
let i2 = thing.length;
if (!isNumber(i2))
return null;
const arr = new Array(i2);
while (i2-- > 0) {
arr[i2] = thing[i2];
}
return arr;
};
const isTypedArray = ((TypedArray) => {
return (thing) => {
return TypedArray && thing instanceof TypedArray;
};
})(typeof Uint8Array !== "undefined" && getPrototypeOf(Uint8Array));
const forEachEntry = (obj, fn) => {
const generator = obj && obj[Symbol.iterator];
const iterator2 = generator.call(obj);
let result;
while ((result = iterator2.next()) && !result.done) {
const pair = result.value;
fn.call(obj, pair[0], pair[1]);
}
};
const matchAll = (regExp, str) => {
let matches;
const arr = [];
while ((matches = regExp.exec(str)) !== null) {
arr.push(matches);
}
return arr;
};
const isHTMLForm = kindOfTest("HTMLFormElement");
const toCamelCase = (str) => {
return str.toLowerCase().replace(
/[-_\s]([a-z\d])(\w*)/g,
function replacer(m2, p1, p2) {
return p1.toUpperCase() + p2;
}
);
};
const hasOwnProperty = (({ hasOwnProperty: hasOwnProperty2 }) => (obj, prop) => hasOwnProperty2.call(obj, prop))(Object.prototype);
const isRegExp = kindOfTest("RegExp");
const reduceDescriptors = (obj, reducer) => {
const descriptors2 = Object.getOwnPropertyDescriptors(obj);
const reducedDescriptors = {};
forEach(descriptors2, (descriptor2, name2) => {
if (reducer(descriptor2, name2, obj) !== false) {
reducedDescriptors[name2] = descriptor2;
}
});
Object.defineProperties(obj, reducedDescriptors);
};
const freezeMethods = (obj) => {
reduceDescriptors(obj, (descriptor2, name2) => {
if (isFunction(obj) && ["arguments", "caller", "callee"].indexOf(name2) !== -1) {
return false;
}
const value = obj[name2];
if (!isFunction(value))
return;
descriptor2.enumerable = false;
if ("writable" in descriptor2) {
descriptor2.writable = false;
return;
}
if (!descriptor2.set) {
descriptor2.set = () => {
throw Error("Can not rewrite read-only method '" + name2 + "'");
};
}
});
};
const toObjectSet = (arrayOrString, delimiter) => {
const obj = {};
const define = (arr) => {
arr.forEach((value) => {
obj[value] = true;
});
};
isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));
return obj;
};
const noop = () => {
};
const toFiniteNumber = (value, defaultValue) => {
value = +value;
return Number.isFinite(value) ? value : defaultValue;
};
const ALPHA = "abcdefghijklmnopqrstuvwxyz";
const DIGIT = "0123456789";
const ALPHABET = {
DIGIT,
ALPHA,
ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT
};
const generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {
let str = "";
const { length } = alphabet;
while (size--) {
str += alphabet[Math.random() * length | 0];
}
return str;
};
function isSpecCompliantForm(thing) {
return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === "FormData" && thing[Symbol.iterator]);
}
const toJSONObject = (obj) => {
const stack = new Array(10);
const visit = (source, i2) => {
if (isObject(source)) {
if (stack.indexOf(source) >= 0) {
return;
}
if (!("toJSON" in source)) {
stack[i2] = source;
const target = isArray(source) ? [] : {};
forEach(source, (value, key2) => {
const reducedValue = visit(value, i2 + 1);
!isUndefined(reducedValue) && (target[key2] = reducedValue);
});
stack[i2] = void 0;
return target;
}
}
return source;
};
return visit(obj, 0);
};
const utils = {
isArray,
isArrayBuffer,
isBuffer,
isFormData,
isArrayBufferView,
isString,
isNumber,
isBoolean,
isObject,
isPlainObject,
isUndefined,
isDate,
isFile,
isBlob,
isRegExp,
isFunction,
isStream,
isURLSearchParams,
isTypedArray,
isFileList,
forEach,
merge,
extend,
trim,
stripBOM,
inherits,
toFlatObject,
kindOf,
kindOfTest,
endsWith,
toArray,
forEachEntry,
matchAll,
isHTMLForm,
hasOwnProperty,
hasOwnProp: hasOwnProperty,
reduceDescriptors,
freezeMethods,
toObjectSet,
toCamelCase,
noop,
toFiniteNumber,
findKey,
global: _global,
isContextDefined,
ALPHABET,
generateString,
isSpecCompliantForm,
toJSONObject
};
function AxiosError(message, code, config, request, response) {
Error.call(this);
if (Error.captureStackTrace) {
Error.captureStackTrace(this, this.constructor);
} else {
this.stack = new Error().stack;
}
this.message = message;
this.name = "AxiosError";
code && (this.code = code);
config && (this.config = config);
request && (this.request = request);
response && (this.response = response);
}
utils.inherits(AxiosError, Error, {
toJSON: function toJSON() {
return {
message: this.message,
name: this.name,
description: this.description,
number: this.number,
fileName: this.fileName,
lineNumber: this.lineNumber,
columnNumber: this.columnNumber,
stack: this.stack,
config: utils.toJSONObject(this.config),
code: this.code,
status: this.response && this.response.status ? this.response.status : null
};
}
});
const prototype$1 = AxiosError.prototype;
const descriptors = {};
[
"ERR_BAD_OPTION_VALUE",
"ERR_BAD_OPTION",
"ECONNABORTED",
"ETIMEDOUT",
"ERR_NETWORK",
"ERR_FR_TOO_MANY_REDIRECTS",
"ERR_DEPRECATED",
"ERR_BAD_RESPONSE",
"ERR_BAD_REQUEST",
"ERR_CANCELED",
"ERR_NOT_SUPPORT",
"ERR_INVALID_URL"
].forEach((code) => {
descriptors[code] = { value: code };
});
Object.defineProperties(AxiosError, descriptors);
Object.defineProperty(prototype$1, "isAxiosError", { value: true });
AxiosError.from = (error, code, config, request, response, customProps) => {
const axiosError = Object.create(prototype$1);
utils.toFlatObject(error, axiosError, function filter2(obj) {
return obj !== Error.prototype;
}, (prop) => {
return prop !== "isAxiosError";
});
AxiosError.call(axiosError, error.message, code, config, request, response);
axiosError.cause = error;
axiosError.name = error.name;
customProps && Object.assign(axiosError, customProps);
return axiosError;
};
const httpAdapter = null;
function isVisitable(thing) {
return utils.isPlainObject(thing) || utils.isArray(thing);
}
function removeBrackets(key2) {
return utils.endsWith(key2, "[]") ? key2.slice(0, -2) : key2;
}
function renderKey(path2, key2, dots) {
if (!path2)
return key2;
return path2.concat(key2).map(function each2(token, i2) {
token = removeBrackets(token);
return !dots && i2 ? "[" + token + "]" : token;
}).join(dots ? "." : "");
}
function isFlatArray(arr) {
return utils.isArray(arr) && !arr.some(isVisitable);
}
const predicates = utils.toFlatObject(utils, {}, null, function filter2(prop) {
return /^is[A-Z]/.test(prop);
});
function toFormData(obj, formData, options) {
if (!utils.isObject(obj)) {
throw new TypeError("target must be an object");
}
formData = formData || new FormData();
options = utils.toFlatObject(options, {
metaTokens: true,
dots: false,
indexes: false
}, false, function defined2(option, source) {
return !utils.isUndefined(source[option]);
});
const metaTokens = options.metaTokens;
const visitor = options.visitor || defaultVisitor;
const dots = options.dots;
const indexes = options.indexes;
const _Blob = options.Blob || typeof Blob !== "undefined" && Blob;
const useBlob = _Blob && utils.isSpecCompliantForm(formData);
if (!utils.isFunction(visitor)) {
throw new TypeError("visitor must be a function");
}
function convertValue(value) {
if (value === null)
return "";
if (utils.isDate(value)) {
return value.toISOString();
}
if (!useBlob && utils.isBlob(value)) {
throw new AxiosError("Blob is not supported. Use a Buffer instead.");
}
if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {
return useBlob && typeof Blob === "function" ? new Blob([value]) : Buffer.from(value);
}
return value;
}
function defaultVisitor(value, key2, path2) {
let arr = value;
if (value && !path2 && typeof value === "object") {
if (utils.endsWith(key2, "{}")) {
key2 = metaTokens ? key2 : key2.slice(0, -2);
value = JSON.stringify(value);
} else if (utils.isArray(value) && isFlatArray(value) || (utils.isFileList(value) || utils.endsWith(key2, "[]")) && (arr = utils.toArray(value))) {
key2 = removeBrackets(key2);
arr.forEach(function each2(el, index2) {
!(utils.isUndefined(el) || el === null) && formData.append(
indexes === true ? renderKey([key2], index2, dots) : indexes === null ? key2 : key2 + "[]",
convertValue(el)
);
});
return false;
}
}
if (isVisitable(value)) {
return true;
}
formData.append(renderKey(path2, key2, dots), convertValue(value));
return false;
}
const stack = [];
const exposedHelpers = Object.assign(predicates, {
defaultVisitor,
convertValue,
isVisitable
});
function build(value, path2) {
if (utils.isUndefined(value))
return;
if (stack.indexOf(value) !== -1) {
throw Error("Circular reference detected in " + path2.join("."));
}
stack.push(value);
utils.forEach(value, function each2(el, key2) {
const result = !(utils.isUndefined(el) || el === null) && visitor.call(
formData,
el,
utils.isString(key2) ? key2.trim() : key2,
path2,
exposedHelpers
);
if (result === true) {
build(el, path2 ? path2.concat(key2) : [key2]);
}
});
stack.pop();
}
if (!utils.isObject(obj)) {
throw new TypeError("data must be an object");
}
build(obj);
return formData;
}
function encode$1(str) {
const charMap = {
"!": "%21",
"'": "%27",
"(": "%28",
")": "%29",
"~": "%7E",
"%20": "+",
"%00": "\0"
};
return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match2) {
return charMap[match2];
});
}
function AxiosURLSearchParams(params, options) {
this._pairs = [];
params && toFormData(params, this, options);
}
const prototype = AxiosURLSearchParams.prototype;
prototype.append = function append(name2, value) {
this._pairs.push([name2, value]);
};
prototype.toString = function toString2(encoder) {
const _encode = encoder ? function(value) {
return encoder.call(this, value, encode$1);
} : encode$1;
return this._pairs.map(function each2(pair) {
return _encode(pair[0]) + "=" + _encode(pair[1]);
}, "").join("&");
};
function encode(val) {
return encodeURIComponent(val).replace(/%3A/gi, ":").replace(/%24/g, "$").replace(/%2C/gi, ",").replace(/%20/g, "+").replace(/%5B/gi, "[").replace(/%5D/gi, "]");
}
function buildURL(url, params, options) {
if (!params) {
return url;
}
const _encode = options && options.encode || encode;
const serializeFn = options && options.serialize;
let serializedParams;
if (serializeFn) {
serializedParams = serializeFn(params, options);
} else {
serializedParams = utils.isURLSearchParams(params) ? params.toString() : new AxiosURLSearchParams(params, options).toString(_encode);
}
if (serializedParams) {
const hashmarkIndex = url.indexOf("#");
if (hashmarkIndex !== -1) {
url = url.slice(0, hashmarkIndex);
}
url += (url.indexOf("?") === -1 ? "?" : "&") + serializedParams;
}
return url;
}
class InterceptorManager {
constructor() {
this.handlers = [];
}
use(fulfilled, rejected, options) {
this.handlers.push({
fulfilled,
rejected,
synchronous: options ? options.synchronous : false,
runWhen: options ? options.runWhen : null
});
return this.handlers.length - 1;
}
eject(id2) {
if (this.handlers[id2]) {
this.handlers[id2] = null;
}
}
clear() {
if (this.handlers) {
this.handlers = [];
}
}
forEach(fn) {
utils.forEach(this.handlers, function forEachHandler(h2) {
if (h2 !== null) {
fn(h2);
}
});
}
}
const InterceptorManager$1 = InterceptorManager;
const transitionalDefaults = {
silentJSONParsing: true,
forcedJSONParsing: true,
clarifyTimeoutError: false
};
const URLSearchParams$1 = typeof URLSearchParams !== "undefined" ? URLSearchParams : AxiosURLSearchParams;
const FormData$1 = FormData;
const isStandardBrowserEnv = (() => {
let product;
if (typeof navigator !== "undefined" && ((product = navigator.product) === "ReactNative" || product === "NativeScript" || product === "NS")) {
return false;
}
return typeof window !== "undefined" && typeof document !== "undefined";
})();
const isStandardBrowserWebWorkerEnv = (() => {
return typeof WorkerGlobalScope !== "undefined" && self instanceof WorkerGlobalScope && typeof self.importScripts === "function";
})();
const platform = {
isBrowser: true,
classes: {
URLSearchParams: URLSearchParams$1,
FormData: FormData$1,
Blob
},
isStandardBrowserEnv,
isStandardBrowserWebWorkerEnv,
protocols: ["http", "https", "file", "blob", "url", "data"]
};
function toURLEncodedForm(data, options) {
return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({
visitor: function(value, key2, path2, helpers) {
if (platform.isNode && utils.isBuffer(value)) {
this.append(key2, value.toString("base64"));
return false;
}
return helpers.defaultVisitor.apply(this, arguments);
}
}, options));
}
function parsePropPath(name2) {
return utils.matchAll(/\w+|\[(\w*)]/g, name2).map((match2) => {
return match2[0] === "[]" ? "" : match2[1] || match2[0];
});
}
function arrayToObject(arr) {
const obj = {};
const keys2 = Object.keys(arr);
let i2;
const len = keys2.length;
let key2;
for (i2 = 0; i2 < len; i2++) {
key2 = keys2[i2];
obj[key2] = arr[key2];
}
return obj;
}
function formDataToJSON(formData) {
function buildPath(path2, value, target, index2) {
let name2 = path2[index2++];
const isNumericKey = Number.isFinite(+name2);
const isLast = index2 >= path2.length;
name2 = !name2 && utils.isArray(target) ? target.length : name2;
if (isLast) {
if (utils.hasOwnProp(target, name2)) {
target[name2] = [target[name2], value];
} else {
target[name2] = value;
}
return !isNumericKey;
}
if (!target[name2] || !utils.isObject(target[name2])) {
target[name2] = [];
}
const result = buildPath(path2, value, target[name2], index2);
if (result && utils.isArray(target[name2])) {
target[name2] = arrayToObject(target[name2]);
}
return !isNumericKey;
}
if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {
const obj = {};
utils.forEachEntry(formData, (name2, value) => {
buildPath(parsePropPath(name2), value, obj, 0);
});
return obj;
}
return null;
}
const DEFAULT_CONTENT_TYPE = {
"Content-Type": void 0
};
function stringifySafely(rawValue, parser, encoder) {
if (utils.isString(rawValue)) {
try {
(parser || JSON.parse)(rawValue);
return utils.trim(rawValue);
} catch (e2) {
if (e2.name !== "SyntaxError") {
throw e2;
}
}
}
return (encoder || JSON.stringify)(rawValue);
}
const defaults = {
transitional: transitionalDefaults,
adapter: ["xhr", "http"],
transformRequest: [function transformRequest(data, headers) {
const contentType = headers.getContentType() || "";
const hasJSONContentType = contentType.indexOf("application/json") > -1;
const isObjectPayload = utils.isObject(data);
if (isObjectPayload && utils.isHTMLForm(data)) {
data = new FormData(data);
}
const isFormData2 = utils.isFormData(data);
if (isFormData2) {
if (!hasJSONContentType) {
return data;
}
return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;
}
if (utils.isArrayBuffer(data) || utils.isBuffer(data) || utils.isStream(data) || utils.isFile(data) || utils.isBlob(data)) {
return data;
}
if (utils.isArrayBufferView(data)) {
return data.buffer;
}
if (utils.isURLSearchParams(data)) {
headers.setContentType("application/x-www-form-urlencoded;charset=utf-8", false);
return data.toString();
}
let isFileList2;
if (isObjectPayload) {
if (contentType.indexOf("application/x-www-form-urlencoded") > -1) {
return toURLEncodedForm(data, this.formSerializer).toString();
}
if ((isFileList2 = utils.isFileList(data)) || contentType.indexOf("multipart/form-data") > -1) {
const _FormData = this.env && this.env.FormData;
return toFormData(
isFileList2 ? { "files[]": data } : data,
_FormData && new _FormData(),
this.formSerializer
);
}
}
if (isObjectPayload || hasJSONContentType) {
headers.setContentType("application/json", false);
return stringifySafely(data);
}
return data;
}],
transformResponse: [function transformResponse(data) {
const transitional = this.transitional || defaults.transitional;
const forcedJSONParsing = transitional && transitional.forcedJSONParsing;
const JSONRequested = this.responseType === "json";
if (data && utils.isString(data) && (forcedJSONParsing && !this.responseType || JSONRequested)) {
const silentJSONParsing = transitional && transitional.silentJSONParsing;
const strictJSONParsing = !silentJSONParsing && JSONRequested;
try {
return JSON.parse(data);
} catch (e2) {
if (strictJSONParsing) {
if (e2.name === "SyntaxError") {
throw AxiosError.from(e2, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);
}
throw e2;
}
}
}
return data;
}],
timeout: 0,
xsrfCookieName: "XSRF-TOKEN",
xsrfHeaderName: "X-XSRF-TOKEN",
maxContentLength: -1,
maxBodyLength: -1,
env: {
FormData: platform.classes.FormData,
Blob: platform.classes.Blob
},
validateStatus: function validateStatus(status) {
return status >= 200 && status < 300;
},
headers: {
common: {
"Accept": "application/json, text/plain, */*"
}
}
};
utils.forEach(["delete", "get", "head"], function forEachMethodNoData(method2) {
defaults.headers[method2] = {};
});
utils.forEach(["post", "put", "patch"], function forEachMethodWithData(method2) {
defaults.headers[method2] = utils.merge(DEFAULT_CONTENT_TYPE);
});
const defaults$1 = defaults;
const ignoreDuplicateOf = utils.toObjectSet([
"age",
"authorization",
"content-length",
"content-type",
"etag",
"expires",
"from",
"host",
"if-modified-since",
"if-unmodified-since",
"last-modified",
"location",
"max-forwards",
"proxy-authorization",
"referer",
"retry-after",
"user-agent"
]);
const parseHeaders = (rawHeaders) => {
const parsed = {};
let key2;
let val;
let i2;
rawHeaders && rawHeaders.split("\n").forEach(function parser(line) {
i2 = line.indexOf(":");
key2 = line.substring(0, i2).trim().toLowerCase();
val = line.substring(i2 + 1).trim();
if (!key2 || parsed[key2] && ignoreDuplicateOf[key2]) {
return;
}
if (key2 === "set-cookie") {
if (parsed[key2]) {
parsed[key2].push(val);
} else {
parsed[key2] = [val];
}
} else {
parsed[key2] = parsed[key2] ? parsed[key2] + ", " + val : val;
}
});
return parsed;
};
const $internals = Symbol("internals");
function normalizeHeader(header) {
return header && String(header).trim().toLowerCase();
}
function normalizeValue(value) {
if (value === false || value == null) {
return value;
}
return utils.isArray(value) ? value.map(normalizeValue) : String(value);
}
function parseTokens(str) {
const tokens = /* @__PURE__ */ Object.create(null);
const tokensRE = /([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;
let match2;
while (match2 = tokensRE.exec(str)) {
tokens[match2[1]] = match2[2];
}
return tokens;
}
function isValidHeaderName(str) {
return /^[-_a-zA-Z]+$/.test(str.trim());
}
function matchHeaderValue(context2, value, header, filter2) {
if (utils.isFunction(filter2)) {
return filter2.call(this, value, header);
}
if (!utils.isString(value))
return;
if (utils.isString(filter2)) {
return value.indexOf(filter2) !== -1;
}
if (utils.isRegExp(filter2)) {
return filter2.test(value);
}
}
function formatHeader(header) {
return header.trim().toLowerCase().replace(/([a-z\d])(\w*)/g, (w2, char, str) => {
return char.toUpperCase() + str;
});
}
function buildAccessors(obj, header) {
const accessorName = utils.toCamelCase(" " + header);
["get", "set", "has"].forEach((methodName) => {
Object.defineProperty(obj, methodName + accessorName, {
value: function(arg1, arg2, arg3) {
return this[methodName].call(this, header, arg1, arg2, arg3);
},
configurable: true
});
});
}
class AxiosHeaders {
constructor(headers) {
headers && this.set(headers);
}
set(header, valueOrRewrite, rewrite) {
const self2 = this;
function setHeader(_value, _header, _rewrite) {
const lHeader = normalizeHeader(_header);
if (!lHeader) {
throw new Error("header name must be a non-empty string");
}
const key2 = utils.findKey(self2, lHeader);
if (!key2 || self2[key2] === void 0 || _rewrite === true || _rewrite === void 0 && self2[key2] !== false) {
self2[key2 || _header] = normalizeValue(_value);
}
}
const setHeaders = (headers, _rewrite) => utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));
if (utils.isPlainObject(header) || header instanceof this.constructor) {
setHeaders(header, valueOrRewrite);
} else if (utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {
setHeaders(parseHeaders(header), valueOrRewrite);
} else {
header != null && setHeader(valueOrRewrite, header, rewrite);
}
return this;
}
get(header, parser) {
header = normalizeHeader(header);
if (header) {
const key2 = utils.findKey(this, header);
if (key2) {
const value = this[key2];
if (!parser) {
return value;
}
if (parser === true) {
return parseTokens(value);
}
if (utils.isFunction(parser)) {
return parser.call(this, value, key2);
}
if (utils.isRegExp(parser)) {
return parser.exec(value);
}
throw new TypeError("parser must be boolean|regexp|function");
}
}
}
has(header, matcher) {
header = normalizeHeader(header);
if (header) {
const key2 = utils.findKey(this, header);
return !!(key2 && this[key2] !== void 0 && (!matcher || matchHeaderValue(this, this[key2], key2, matcher)));
}
return false;
}
delete(header, matcher) {
const self2 = this;
let deleted = false;
function deleteHeader(_header) {
_header = normalizeHeader(_header);
if (_header) {
const key2 = utils.findKey(self2, _header);
if (key2 && (!matcher || matchHeaderValue(self2, self2[key2], key2, matcher))) {
delete self2[key2];
deleted = true;
}
}
}
if (utils.isArray(header)) {
header.forEach(deleteHeader);
} else {
deleteHeader(header);
}
return deleted;
}
clear(matcher) {
const keys2 = Object.keys(this);
let i2 = keys2.length;
let deleted = false;
while (i2--) {
const key2 = keys2[i2];
if (!matcher || matchHeaderValue(this, this[key2], key2, matcher)) {
delete this[key2];
deleted = true;
}
}
return deleted;
}
normalize(format2) {
const self2 = this;
const headers = {};
utils.forEach(this, (value, header) => {
const key2 = utils.findKey(headers, header);
if (key2) {
self2[key2] = normalizeValue(value);
delete self2[header];
return;
}
const normalized = format2 ? formatHeader(header) : String(header).trim();
if (normalized !== header) {
delete self2[header];
}
self2[normalized] = normalizeValue(value);
headers[normalized] = true;
});
return this;
}
concat(...targets) {
return this.constructor.concat(this, ...targets);
}
toJSON(asStrings) {
const obj = /* @__PURE__ */ Object.create(null);
utils.forEach(this, (value, header) => {
value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(", ") : value);
});
return obj;
}
[Symbol.iterator]() {
return Object.entries(this.toJSON())[Symbol.iterator]();
}
toString() {
return Object.entries(this.toJSON()).map(([header, value]) => header + ": " + value).join("\n");
}
get [Symbol.toStringTag]() {
return "AxiosHeaders";
}
static from(thing) {
return thing instanceof this ? thing : new this(thing);
}
static concat(first, ...targets) {
const computed = new this(first);
targets.forEach((target) => computed.set(target));
return computed;
}
static accessor(header) {
const internals = this[$internals] = this[$internals] = {
accessors: {}
};
const accessors = internals.accessors;
const prototype2 = this.prototype;
function defineAccessor(_header) {
const lHeader = normalizeHeader(_header);
if (!accessors[lHeader]) {
buildAccessors(prototype2, _header);
accessors[lHeader] = true;
}
}
utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);
return this;
}
}
AxiosHeaders.accessor(["Content-Type", "Content-Length", "Accept", "Accept-Encoding", "User-Agent", "Authorization"]);
utils.freezeMethods(AxiosHeaders.prototype);
utils.freezeMethods(AxiosHeaders);
const AxiosHeaders$1 = AxiosHeaders;
function transformData(fns, response) {
const config = this || defaults$1;
const context2 = response || config;
const headers = AxiosHeaders$1.from(context2.headers);
let data = context2.data;
utils.forEach(fns, function transform(fn) {
data = fn.call(config, data, headers.normalize(), response ? response.status : void 0);
});
headers.normalize();
return data;
}
function isCancel(value) {
return !!(value && value.__CANCEL__);
}
function CanceledError(message, config, request) {
AxiosError.call(this, message == null ? "canceled" : message, AxiosError.ERR_CANCELED, config, request);
this.name = "CanceledError";
}
utils.inherits(CanceledError, AxiosError, {
__CANCEL__: true
});
function settle(resolve, reject, response) {
const validateStatus = response.config.validateStatus;
if (!response.status || !validateStatus || validateStatus(response.status)) {
resolve(response);
} else {
reject(new AxiosError(
"Request failed with status code " + response.status,
[AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],
response.config,
response.request,
response
));
}
}
const cookies = platform.isStandardBrowserEnv ? function standardBrowserEnv() {
return {
write: function write(name2, value, expires, path2, domain, secure) {
const cookie = [];
cookie.push(name2 + "=" + encodeURIComponent(value));
if (utils.isNumber(expires)) {
cookie.push("expires=" + new Date(expires).toGMTString());
}
if (utils.isString(path2)) {
cookie.push("path=" + path2);
}
if (utils.isString(domain)) {
cookie.push("domain=" + domain);
}
if (secure === true) {
cookie.push("secure");
}
document.cookie = cookie.join("; ");
},
read: function read(name2) {
const match2 = document.cookie.match(new RegExp("(^|;\\s*)(" + name2 + ")=([^;]*)"));
return match2 ? decodeURIComponent(match2[3]) : null;
},
remove: function remove(name2) {
this.write(name2, "", Date.now() - 864e5);
}
};
}() : function nonStandardBrowserEnv() {
return {
write: function write() {
},
read: function read() {
return null;
},
remove: function remove() {
}
};
}();
function isAbsoluteURL(url) {
return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url);
}
function combineURLs(baseURL, relativeURL) {
return relativeURL ? baseURL.replace(/\/+$/, "") + "/" + relativeURL.replace(/^\/+/, "") : baseURL;
}
function buildFullPath(baseURL, requestedURL) {
if (baseURL && !isAbsoluteURL(requestedURL)) {
return combineURLs(baseURL, requestedURL);
}
return requestedURL;
}
const isURLSameOrigin = platform.isStandardBrowserEnv ? function standardBrowserEnv() {
const msie = /(msie|trident)/i.test(navigator.userAgent);
const urlParsingNode = document.createElement("a");
let originURL;
function resolveURL(url) {
let href = url;
if (msie) {
urlParsingNode.setAttribute("href", href);
href = urlParsingNode.href;
}
urlParsingNode.setAttribute("href", href);
return {
href: urlParsingNode.href,
protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, "") : "",
host: urlParsingNode.host,
search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, "") : "",
hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, "") : "",
hostname: urlParsingNode.hostname,
port: urlParsingNode.port,
pathname: urlParsingNode.pathname.charAt(0) === "/" ? urlParsingNode.pathname : "/" + urlParsingNode.pathname
};
}
originURL = resolveURL(window.location.href);
return function isURLSameOrigin2(requestURL) {
const parsed = utils.isString(requestURL) ? resolveURL(requestURL) : requestURL;
return parsed.protocol === originURL.protocol && parsed.host === originURL.host;
};
}() : function nonStandardBrowserEnv() {
return function isURLSameOrigin2() {
return true;
};
}();
function parseProtocol(url) {
const match2 = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url);
return match2 && match2[1] || "";
}
function speedometer(samplesCount, min) {
samplesCount = samplesCount || 10;
const bytes = new Array(samplesCount);
const timestamps = new Array(samplesCount);
let head = 0;
let tail = 0;
let firstSampleTS;
min = min !== void 0 ? min : 1e3;
return function push(chunkLength) {
const now2 = Date.now();
const startedAt = timestamps[tail];
if (!firstSampleTS) {
firstSampleTS = now2;
}
bytes[head] = chunkLength;
timestamps[head] = now2;
let i2 = tail;
let bytesCount = 0;
while (i2 !== head) {
bytesCount += bytes[i2++];
i2 = i2 % samplesCount;
}
head = (head + 1) % samplesCount;
if (head === tail) {
tail = (tail + 1) % samplesCount;
}
if (now2 - firstSampleTS < min) {
return;
}
const passed = startedAt && now2 - startedAt;
return passed ? Math.round(bytesCount * 1e3 / passed) : void 0;
};
}
function progressEventReducer(listener, isDownloadStream) {
let bytesNotified = 0;
const _speedometer = speedometer(50, 250);
return (e2) => {
const loaded = e2.loaded;
const total = e2.lengthComputable ? e2.total : void 0;
const progressBytes = loaded - bytesNotified;
const rate = _speedometer(progressBytes);
const inRange = loaded <= total;
bytesNotified = loaded;
const data = {
loaded,
total,
progress: total ? loaded / total : void 0,
bytes: progressBytes,
rate: rate ? rate : void 0,
estimated: rate && total && inRange ? (total - loaded) / rate : void 0,
event: e2
};
data[isDownloadStream ? "download" : "upload"] = true;
listener(data);
};
}
const isXHRAdapterSupported = typeof XMLHttpRequest !== "undefined";
const xhrAdapter = isXHRAdapterSupported && function(config) {
return new Promise(function dispatchXhrRequest(resolve, reject) {
let requestData = config.data;
const requestHeaders = AxiosHeaders$1.from(config.headers).normalize();
const responseType = config.responseType;
let onCanceled;
function done() {
if (config.cancelToken) {
config.cancelToken.unsubscribe(onCanceled);
}
if (config.signal) {
config.signal.removeEventListener("abort", onCanceled);
}
}
if (utils.isFormData(requestData) && (platform.isStandardBrowserEnv || platform.isStandardBrowserWebWorkerEnv)) {
requestHeaders.setContentType(false);
}
let request = new XMLHttpRequest();
if (config.auth) {
const username = config.auth.username || "";
const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : "";
requestHeaders.set("Authorization", "Basic " + btoa(username + ":" + password));
}
const fullPath = buildFullPath(config.baseURL, config.url);
request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);
request.timeout = config.timeout;
function onloadend() {
if (!request) {
return;
}
const responseHeaders = AxiosHeaders$1.from(
"getAllResponseHeaders" in request && request.getAllResponseHeaders()
);
const responseData = !responseType || responseType === "text" || responseType === "json" ? request.responseText : request.response;
const response = {
data: responseData,
status: request.status,
statusText: request.statusText,
headers: responseHeaders,
config,
request
};
settle(function _resolve(value) {
resolve(value);
done();
}, function _reject(err) {
reject(err);
done();
}, response);
request = null;
}
if ("onloadend" in request) {
request.onloadend = onloadend;
} else {
request.onreadystatechange = function handleLoad() {
if (!request || request.readyState !== 4) {
return;
}
if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf("file:") === 0)) {
return;
}
setTimeout(onloadend);
};
}
request.onabort = function handleAbort() {
if (!request) {
return;
}
reject(new AxiosError("Request aborted", AxiosError.ECONNABORTED, config, request));
request = null;
};
request.onerror = function handleError() {
reject(new AxiosError("Network Error", AxiosError.ERR_NETWORK, config, request));
request = null;
};
request.ontimeout = function handleTimeout() {
let timeoutErrorMessage = config.timeout ? "timeout of " + config.timeout + "ms exceeded" : "timeout exceeded";
const transitional = config.transitional || transitionalDefaults;
if (config.timeoutErrorMessage) {
timeoutErrorMessage = config.timeoutErrorMessage;
}
reject(new AxiosError(
timeoutErrorMessage,
transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,
config,
request
));
request = null;
};
if (platform.isStandardBrowserEnv) {
const xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName && cookies.read(config.xsrfCookieName);
if (xsrfValue) {
requestHeaders.set(config.xsrfHeaderName, xsrfValue);
}
}
requestData === void 0 && requestHeaders.setContentType(null);
if ("setRequestHeader" in request) {
utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key2) {
request.setRequestHeader(key2, val);
});
}
if (!utils.isUndefined(config.withCredentials)) {
request.withCredentials = !!config.withCredentials;
}
if (responseType && responseType !== "json") {
request.responseType = config.responseType;
}
if (typeof config.onDownloadProgress === "function") {
request.addEventListener("progress", progressEventReducer(config.onDownloadProgress, true));
}
if (typeof config.onUploadProgress === "function" && request.upload) {
request.upload.addEventListener("progress", progressEventReducer(config.onUploadProgress));
}
if (config.cancelToken || config.signal) {
onCanceled = (cancel) => {
if (!request) {
return;
}
reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);
request.abort();
request = null;
};
config.cancelToken && config.cancelToken.subscribe(onCanceled);
if (config.signal) {
config.signal.aborted ? onCanceled() : config.signal.addEventListener("abort", onCanceled);
}
}
const protocol = parseProtocol(fullPath);
if (protocol && platform.protocols.indexOf(protocol) === -1) {
reject(new AxiosError("Unsupported protocol " + protocol + ":", AxiosError.ERR_BAD_REQUEST, config));
return;
}
request.send(requestData || null);
});
};
const knownAdapters = {
http: httpAdapter,
xhr: xhrAdapter
};
utils.forEach(knownAdapters, (fn, value) => {
if (fn) {
try {
Object.defineProperty(fn, "name", { value });
} catch (e2) {
}
Object.defineProperty(fn, "adapterName", { value });
}
});
const adapters = {
getAdapter: (adapters2) => {
adapters2 = utils.isArray(adapters2) ? adapters2 : [adapters2];
const { length } = adapters2;
let nameOrAdapter;
let adapter;
for (let i2 = 0; i2 < length; i2++) {
nameOrAdapter = adapters2[i2];
if (adapter = utils.isString(nameOrAdapter) ? knownAdapters[nameOrAdapter.toLowerCase()] : nameOrAdapter) {
break;
}
}
if (!adapter) {
if (adapter === false) {
throw new AxiosError(
`Adapter ${nameOrAdapter} is not supported by the environment`,
"ERR_NOT_SUPPORT"
);
}
throw new Error(
utils.hasOwnProp(knownAdapters, nameOrAdapter) ? `Adapter '${nameOrAdapter}' is not available in the build` : `Unknown adapter '${nameOrAdapter}'`
);
}
if (!utils.isFunction(adapter)) {
throw new TypeError("adapter is not a function");
}
return adapter;
},
adapters: knownAdapters
};
function throwIfCancellationRequested(config) {
if (config.cancelToken) {
config.cancelToken.throwIfRequested();
}
if (config.signal && config.signal.aborted) {
throw new CanceledError(null, config);
}
}
function dispatchRequest(config) {
throwIfCancellationRequested(config);
config.headers = AxiosHeaders$1.from(config.headers);
config.data = transformData.call(
config,
config.transformRequest
);
if (["post", "put", "patch"].indexOf(config.method) !== -1) {
config.headers.setContentType("application/x-www-form-urlencoded", false);
}
const adapter = adapters.getAdapter(config.adapter || defaults$1.adapter);
return adapter(config).then(function onAdapterResolution(response) {
throwIfCancellationRequested(config);
response.data = transformData.call(
config,
config.transformResponse,
response
);
response.headers = AxiosHeaders$1.from(response.headers);
return response;
}, function onAdapterRejection(reason) {
if (!isCancel(reason)) {
throwIfCancellationRequested(config);
if (reason && reason.response) {
reason.response.data = transformData.call(
config,
config.transformResponse,
reason.response
);
reason.response.headers = AxiosHeaders$1.from(reason.response.headers);
}
}
return Promise.reject(reason);
});
}
const headersToObject = (thing) => thing instanceof AxiosHeaders$1 ? thing.toJSON() : thing;
function mergeConfig(config1, config2) {
config2 = config2 || {};
const config = {};
function getMergedValue(target, source, caseless) {
if (utils.isPlainObject(target) && utils.isPlainObject(source)) {
return utils.merge.call({ caseless }, target, source);
} else if (utils.isPlainObject(source)) {
return utils.merge({}, source);
} else if (utils.isArray(source)) {
return source.slice();
}
return source;
}
function mergeDeepProperties(a, b2, caseless) {
if (!utils.isUndefined(b2)) {
return getMergedValue(a, b2, caseless);
} else if (!utils.isUndefined(a)) {
return getMergedValue(void 0, a, caseless);
}
}
function valueFromConfig2(a, b2) {
if (!utils.isUndefined(b2)) {
return getMergedValue(void 0, b2);
}
}
function defaultToConfig2(a, b2) {
if (!utils.isUndefined(b2)) {
return getMergedValue(void 0, b2);
} else if (!utils.isUndefined(a)) {
return getMergedValue(void 0, a);
}
}
function mergeDirectKeys(a, b2, prop) {
if (prop in config2) {
return getMergedValue(a, b2);
} else if (prop in config1) {
return getMergedValue(void 0, a);
}
}
const mergeMap = {
url: valueFromConfig2,
method: valueFromConfig2,
data: valueFromConfig2,
baseURL: defaultToConfig2,
transformRequest: defaultToConfig2,
transformResponse: defaultToConfig2,
paramsSerializer: defaultToConfig2,
timeout: defaultToConfig2,
timeoutMessage: defaultToConfig2,
withCredentials: defaultToConfig2,
adapter: defaultToConfig2,
responseType: defaultToConfig2,
xsrfCookieName: defaultToConfig2,
xsrfHeaderName: defaultToConfig2,
onUploadProgress: defaultToConfig2,
onDownloadProgress: defaultToConfig2,
decompress: defaultToConfig2,
maxContentLength: defaultToConfig2,
maxBodyLength: defaultToConfig2,
beforeRedirect: defaultToConfig2,
transport: defaultToConfig2,
httpAgent: defaultToConfig2,
httpsAgent: defaultToConfig2,
cancelToken: defaultToConfig2,
socketPath: defaultToConfig2,
responseEncoding: defaultToConfig2,
validateStatus: mergeDirectKeys,
headers: (a, b2) => mergeDeepProperties(headersToObject(a), headersToObject(b2), true)
};
utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) {
const merge2 = mergeMap[prop] || mergeDeepProperties;
const configValue = merge2(config1[prop], config2[prop], prop);
utils.isUndefined(configValue) && merge2 !== mergeDirectKeys || (config[prop] = configValue);
});
return config;
}
const VERSION = "1.3.2";
const validators$1 = {};
["object", "boolean", "number", "function", "string", "symbol"].forEach((type2, i2) => {
validators$1[type2] = function validator2(thing) {
return typeof thing === type2 || "a" + (i2 < 1 ? "n " : " ") + type2;
};
});
const deprecatedWarnings = {};
validators$1.transitional = function transitional(validator2, version2, message) {
function formatMessage(opt, desc) {
return "[Axios v" + VERSION + "] Transitional option '" + opt + "'" + desc + (message ? ". " + message : "");
}
return (value, opt, opts) => {
if (validator2 === false) {
throw new AxiosError(
formatMessage(opt, " has been removed" + (version2 ? " in " + version2 : "")),
AxiosError.ERR_DEPRECATED
);
}
if (version2 && !deprecatedWarnings[opt]) {
deprecatedWarnings[opt] = true;
console.warn(
formatMessage(
opt,
" has been deprecated since v" + version2 + " and will be removed in the near future"
)
);
}
return validator2 ? validator2(value, opt, opts) : true;
};
};
function assertOptions(options, schema2, allowUnknown) {
if (typeof options !== "object") {
throw new AxiosError("options must be an object", AxiosError.ERR_BAD_OPTION_VALUE);
}
const keys2 = Object.keys(options);
let i2 = keys2.length;
while (i2-- > 0) {
const opt = keys2[i2];
const validator2 = schema2[opt];
if (validator2) {
const value = options[opt];
const result = value === void 0 || validator2(value, opt, options);
if (result !== true) {
throw new AxiosError("option " + opt + " must be " + result, AxiosError.ERR_BAD_OPTION_VALUE);
}
continue;
}
if (allowUnknown !== true) {
throw new AxiosError("Unknown option " + opt, AxiosError.ERR_BAD_OPTION);
}
}
}
const validator = {
assertOptions,
validators: validators$1
};
const validators = validator.validators;
class Axios {
constructor(instanceConfig) {
this.defaults = instanceConfig;
this.interceptors = {
request: new InterceptorManager$1(),
response: new InterceptorManager$1()
};
}
request(configOrUrl, config) {
if (typeof configOrUrl === "string") {
config = config || {};
config.url = configOrUrl;
} else {
config = configOrUrl || {};
}
config = mergeConfig(this.defaults, config);
const { transitional, paramsSerializer, headers } = config;
if (transitional !== void 0) {
validator.assertOptions(transitional, {
silentJSONParsing: validators.transitional(validators.boolean),
forcedJSONParsing: validators.transitional(validators.boolean),
clarifyTimeoutError: validators.transitional(validators.boolean)
}, false);
}
if (paramsSerializer !== void 0) {
validator.assertOptions(paramsSerializer, {
encode: validators.function,
serialize: validators.function
}, true);
}
config.method = (config.method || this.defaults.method || "get").toLowerCase();
let contextHeaders;
contextHeaders = headers && utils.merge(
headers.common,
headers[config.method]
);
contextHeaders && utils.forEach(
["delete", "get", "head", "post", "put", "patch", "common"],
(method2) => {
delete headers[method2];
}
);
config.headers = AxiosHeaders$1.concat(contextHeaders, headers);
const requestInterceptorChain = [];
let synchronousRequestInterceptors = true;
this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
if (typeof interceptor.runWhen === "function" && interceptor.runWhen(config) === false) {
return;
}
synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;
requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);
});
const responseInterceptorChain = [];
this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);
});
let promise;
let i2 = 0;
let len;
if (!synchronousRequestInterceptors) {
const chain = [dispatchRequest.bind(this), void 0];
chain.unshift.apply(chain, requestInterceptorChain);
chain.push.apply(chain, responseInterceptorChain);
len = chain.length;
promise = Promise.resolve(config);
while (i2 < len) {
promise = promise.then(chain[i2++], chain[i2++]);
}
return promise;
}
len = requestInterceptorChain.length;
let newConfig = config;
i2 = 0;
while (i2 < len) {
const onFulfilled = requestInterceptorChain[i2++];
const onRejected = requestInterceptorChain[i2++];
try {
newConfig = onFulfilled(newConfig);
} catch (error) {
onRejected.call(this, error);
break;
}
}
try {
promise = dispatchRequest.call(this, newConfig);
} catch (error) {
return Promise.reject(error);
}
i2 = 0;
len = responseInterceptorChain.length;
while (i2 < len) {
promise = promise.then(responseInterceptorChain[i2++], responseInterceptorChain[i2++]);
}
return promise;
}
getUri(config) {
config = mergeConfig(this.defaults, config);
const fullPath = buildFullPath(config.baseURL, config.url);
return buildURL(fullPath, config.params, config.paramsSerializer);
}
}
utils.forEach(["delete", "get", "head", "options"], function forEachMethodNoData(method2) {
Axios.prototype[method2] = function(url, config) {
return this.request(mergeConfig(config || {}, {
method: method2,
url,
data: (config || {}).data
}));
};
});
utils.forEach(["post", "put", "patch"], function forEachMethodWithData(method2) {
function generateHTTPMethod(isForm) {
return function httpMethod(url, data, config) {
return this.request(mergeConfig(config || {}, {
method: method2,
headers: isForm ? {
"Content-Type": "multipart/form-data"
} : {},
url,
data
}));
};
}
Axios.prototype[method2] = generateHTTPMethod();
Axios.prototype[method2 + "Form"] = generateHTTPMethod(true);
});
const Axios$1 = Axios;
class CancelToken {
constructor(executor) {
if (typeof executor !== "function") {
throw new TypeError("executor must be a function.");
}
let resolvePromise;
this.promise = new Promise(function promiseExecutor(resolve) {
resolvePromise = resolve;
});
const token = this;
this.promise.then((cancel) => {
if (!token._listeners)
return;
let i2 = token._listeners.length;
while (i2-- > 0) {
token._listeners[i2](cancel);
}
token._listeners = null;
});
this.promise.then = (onfulfilled) => {
let _resolve;
const promise = new Promise((resolve) => {
token.subscribe(resolve);
_resolve = resolve;
}).then(onfulfilled);
promise.cancel = function reject() {
token.unsubscribe(_resolve);
};
return promise;
};
executor(function cancel(message, config, request) {
if (token.reason) {
return;
}
token.reason = new CanceledError(message, config, request);
resolvePromise(token.reason);
});
}
throwIfRequested() {
if (this.reason) {
throw this.reason;
}
}
subscribe(listener) {
if (this.reason) {
listener(this.reason);
return;
}
if (this._listeners) {
this._listeners.push(listener);
} else {
this._listeners = [listener];
}
}
unsubscribe(listener) {
if (!this._listeners) {
return;
}
const index2 = this._listeners.indexOf(listener);
if (index2 !== -1) {
this._listeners.splice(index2, 1);
}
}
static source() {
let cancel;
const token = new CancelToken(function executor(c2) {
cancel = c2;
});
return {
token,
cancel
};
}
}
const CancelToken$1 = CancelToken;
function spread(callback) {
return function wrap2(arr) {
return callback.apply(null, arr);
};
}
function isAxiosError(payload) {
return utils.isObject(payload) && payload.isAxiosError === true;
}
const HttpStatusCode = {
Continue: 100,
SwitchingProtocols: 101,
Processing: 102,
EarlyHints: 103,
Ok: 200,
Created: 201,
Accepted: 202,
NonAuthoritativeInformation: 203,
NoContent: 204,
ResetContent: 205,
PartialContent: 206,
MultiStatus: 207,
AlreadyReported: 208,
ImUsed: 226,
MultipleChoices: 300,
MovedPermanently: 301,
Found: 302,
SeeOther: 303,
NotModified: 304,
UseProxy: 305,
Unused: 306,
TemporaryRedirect: 307,
PermanentRedirect: 308,
BadRequest: 400,
Unauthorized: 401,
PaymentRequired: 402,
Forbidden: 403,
NotFound: 404,
MethodNotAllowed: 405,
NotAcceptable: 406,
ProxyAuthenticationRequired: 407,
RequestTimeout: 408,
Conflict: 409,
Gone: 410,
LengthRequired: 411,
PreconditionFailed: 412,
PayloadTooLarge: 413,
UriTooLong: 414,
UnsupportedMediaType: 415,
RangeNotSatisfiable: 416,
ExpectationFailed: 417,
ImATeapot: 418,
MisdirectedRequest: 421,
UnprocessableEntity: 422,
Locked: 423,
FailedDependency: 424,
TooEarly: 425,
UpgradeRequired: 426,
PreconditionRequired: 428,
TooManyRequests: 429,
RequestHeaderFieldsTooLarge: 431,
UnavailableForLegalReasons: 451,
InternalServerError: 500,
NotImplemented: 501,
BadGateway: 502,
ServiceUnavailable: 503,
GatewayTimeout: 504,
HttpVersionNotSupported: 505,
VariantAlsoNegotiates: 506,
InsufficientStorage: 507,
LoopDetected: 508,
NotExtended: 510,
NetworkAuthenticationRequired: 511
};
Object.entries(HttpStatusCode).forEach(([key2, value]) => {
HttpStatusCode[value] = key2;
});
const HttpStatusCode$1 = HttpStatusCode;
function createInstance(defaultConfig) {
const context2 = new Axios$1(defaultConfig);
const instance = bind(Axios$1.prototype.request, context2);
utils.extend(instance, Axios$1.prototype, context2, { allOwnKeys: true });
utils.extend(instance, context2, null, { allOwnKeys: true });
instance.create = function create2(instanceConfig) {
return createInstance(mergeConfig(defaultConfig, instanceConfig));
};
return instance;
}
const axios = createInstance(defaults$1);
axios.Axios = Axios$1;
axios.CanceledError = CanceledError;
axios.CancelToken = CancelToken$1;
axios.isCancel = isCancel;
axios.VERSION = VERSION;
axios.toFormData = toFormData;
axios.AxiosError = AxiosError;
axios.Cancel = axios.CanceledError;
axios.all = function all(promises) {
return Promise.all(promises);
};
axios.spread = spread;
axios.isAxiosError = isAxiosError;
axios.mergeConfig = mergeConfig;
axios.AxiosHeaders = AxiosHeaders$1;
axios.formToJSON = (thing) => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);
axios.HttpStatusCode = HttpStatusCode$1;
axios.default = axios;
const axios$1 = axios;
axios$1.defaults.withCredentials = true;
const JumpButton = (props) => {
const {
hrefUrl,
addons
} = props;
return /* @__PURE__ */ jsx(Button$2, {
onClick: () => {
console.log(addons["dataIndex"][0]);
console.log(hrefUrl[addons["dataIndex"][0]].input2);
window.open(hrefUrl[addons["dataIndex"][0]].input2);
},
children: "\u8DF3\u8F6C"
});
};
function App() {
const [open, setOpen] = React$a.useState(false);
const [jumpPageHref, setJumpPageHref] = React$a.useState("");
const [clipboardContent, setClipboardContent] = React$a.useState([]);
const form = useForm();
const showDrawer = () => {
setOpen(true);
};
const onClose = () => {
setOpen(false);
};
const onFinish = (formData) => {
console.log("formData:", formData);
GM_setValue("starPageHref", formData);
};
const jumpPage = (event) => {
setJumpPageHref(event.target.value);
GM_setValue("jumpPageHref", event.target.value);
};
const openJumpHref = () => {
let clipboardContent2 = [];
if (window.location.href.indexOf("bilibili") !== -1) {
clipboardContent2 = getBilibiliContent();
setClipboardContent(clipboardContent2);
console.log(clipboardContent2);
GM_setClipboard(clipboardContent2.join("\n"));
}
window.open(GM_getValue("jumpPageHref"));
};
const getBilibiliContent = () => {
const bilibiliList = [];
const bilibiliTitle = document.querySelector("#viewbox_report > h1").innerText;
const bilibiliUpName = document.querySelector(".up-detail-top a").innerText;
bilibiliList.push(window.location.href, bilibiliTitle, bilibiliUpName);
GM_setValue("clipboardContent", bilibiliList);
return bilibiliList;
};
React$a.useEffect(() => {
if (GM_getValue("starPageHref")) {
form.setValues(GM_getValue("starPageHref"));
}
if (GM_getValue("jumpPageHref")) {
setJumpPageHref(GM_getValue("jumpPageHref"));
}
}, []);
return /* @__PURE__ */ jsxs("div", {
children: [/* @__PURE__ */ jsx(Button$2, {
type: "primary",
onClick: showDrawer,
children: "\u6253\u5F00\u6536\u85CF\u94FE\u63A5"
}), /* @__PURE__ */ jsx("div", {
style: {
marginTop: "10px"
},
children: /* @__PURE__ */ jsx(Button$2, {
type: "primary",
onClick: openJumpHref,
children: "\u6536\u85CF"
})
}), /* @__PURE__ */ jsx(Drawer, {
title: "\u4F60\u6536\u85CF\u7684\u94FE\u63A5",
placement: "right",
onClose,
open,
children: /* @__PURE__ */ jsxs(Tabs, {
defaultActiveKey: "1",
onTabClick: (key2) => {
if (key2 == 2) {
const clipboardContent2 = GM_getValue("clipboardContent");
console.log(clipboardContent2);
setClipboardContent(clipboardContent2);
}
},
children: [/* @__PURE__ */ jsxs(Tabs.TabPane, {
tab: "\u6536\u85CF\u7F51\u5740",
children: [/* @__PURE__ */ jsxs("div", {
children: [/* @__PURE__ */ jsx("span", {
children: "\u8DF3\u8F6C\u5730\u5740:"
}), /* @__PURE__ */ jsx(Input$2, {
placeholder: "\u8BF7\u8F93\u5165\u4F60\u8981\u8DF3\u8F6C\u5230\u7684\u7F51\u5740",
onChange: jumpPage,
value: jumpPageHref
})]
}), /* @__PURE__ */ jsx(FormRender, {
schema,
form,
maxWidth: 400,
onFinish,
footer: true,
widgets: {
JumpButton
}
})]
}, "1"), /* @__PURE__ */ jsx(Tabs.TabPane, {
tab: "\u5185\u5BB9\u526A\u5207\u677F",
children: clipboardContent && clipboardContent.length > 0 ? clipboardContent.reverse().map((item, index2) => {
return /* @__PURE__ */ jsx("div", {
children: item
}, index2);
}) : null
}, "2")]
})
})]
});
}
const index = "";
client.createRoot((() => {
const app = document.createElement("div");
app.setAttribute("class", "upList");
document.body.append(app);
return app;
})()).render(/* @__PURE__ */ jsx(React__default.default.Fragment, {
children: /* @__PURE__ */ jsx(App, {})
}));
})(React, ReactDOM);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS1wcm9qZWN0LXlvdWhvdXpob25nd2Vud2FuZy51c2VyLmpzIiwic291cmNlcyI6WyJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2NsaWVudC5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZi5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b1ByaW1pdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b1Byb3BlcnR5S2V5LmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NldFByb3RvdHlwZU9mLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2dldFByb3RvdHlwZU9mLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdC5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcG9zc2libGVDb25zdHJ1Y3RvclJldHVybi5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlci5qcyIsIm5vZGVfbW9kdWxlcy9jbGFzc25hbWVzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWlzL2Nqcy9yZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1pcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy11dGlsL2VzL0NoaWxkcmVuL3RvQXJyYXkuanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9lcy93YXJuaW5nLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDIuanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9ob29rcy91c2VNZW1vLmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvcmVmLmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvRG9tL2ZpbmRET01Ob2RlLmpzIiwibm9kZV9tb2R1bGVzL3Jlc2l6ZS1vYnNlcnZlci1wb2x5ZmlsbC9kaXN0L1Jlc2l6ZU9ic2VydmVyLmVzLmpzIiwibm9kZV9tb2R1bGVzL3JjLXJlc2l6ZS1vYnNlcnZlci9lcy91dGlscy9vYnNlcnZlclV0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtcmVzaXplLW9ic2VydmVyL2VzL1NpbmdsZU9ic2VydmVyL0RvbVdyYXBwZXIuanMiLCJub2RlX21vZHVsZXMvcmVhY3QvY2pzL3JlYWN0LWpzeC1ydW50aW1lLnByb2R1Y3Rpb24ubWluLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0L2pzeC1ydW50aW1lLmpzIiwibm9kZV9tb2R1bGVzL3JjLXJlc2l6ZS1vYnNlcnZlci9lcy9Db2xsZWN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL3JjLXJlc2l6ZS1vYnNlcnZlci9lcy9TaW5nbGVPYnNlcnZlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1yZXNpemUtb2JzZXJ2ZXIvZXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9vbWl0LmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2NvbXBvbmVudHMvQ29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FycmF5TGlrZVRvQXJyYXkuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXJyYXlXaXRob3V0SG9sZXMuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaXRlcmFibGVUb0FycmF5LmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL25vbkl0ZXJhYmxlU3ByZWFkLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5LmpzIiwibm9kZV9tb2R1bGVzL3JjLWZpZWxkLWZvcm0vZXMvRmllbGRDb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL3JjLWZpZWxkLWZvcm0vZXMvdXRpbHMvdHlwZVV0aWwuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcmVnZW5lcmF0b3JSdW50aW1lLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FzeW5jVG9HZW5lcmF0b3IuanMiLCJub2RlX21vZHVsZXMvYXN5bmMtdmFsaWRhdG9yL2Rpc3Qtd2ViL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLWZpZWxkLWZvcm0vZXMvdXRpbHMvbWVzc2FnZXMuanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9lcy91dGlscy9nZXQuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXJyYXlXaXRoSG9sZXMuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vbm9uSXRlcmFibGVSZXN0LmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQXJyYXkuanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9lcy91dGlscy9zZXQuanMiLCJub2RlX21vZHVsZXMvcmMtZmllbGQtZm9ybS9lcy91dGlscy9jbG9uZURlZXAuanMiLCJub2RlX21vZHVsZXMvcmMtZmllbGQtZm9ybS9lcy91dGlscy92YWx1ZVV0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtZmllbGQtZm9ybS9lcy91dGlscy92YWxpZGF0ZVV0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtZmllbGQtZm9ybS9lcy9GaWVsZC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1maWVsZC1mb3JtL2VzL0xpc3RDb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL3JjLWZpZWxkLWZvcm0vZXMvTGlzdC5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5LmpzIiwibm9kZV9tb2R1bGVzL3JjLWZpZWxkLWZvcm0vZXMvdXRpbHMvYXN5bmNVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLWZpZWxkLWZvcm0vZXMvdXRpbHMvTmFtZU1hcC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1maWVsZC1mb3JtL2VzL3VzZUZvcm0uanMiLCJub2RlX21vZHVsZXMvcmMtZmllbGQtZm9ybS9lcy9Gb3JtQ29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1maWVsZC1mb3JtL2VzL0Zvcm0uanMiLCJub2RlX21vZHVsZXMvcmMtZmllbGQtZm9ybS9lcy91c2VXYXRjaC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1maWVsZC1mb3JtL2VzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLXBhZ2luYXRpb24vZXMvbG9jYWxlL2VuX1VTLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9sb2NhbGUvZW5fVVMuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy90aW1lLXBpY2tlci9sb2NhbGUvZW5fVVMuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9kYXRlLXBpY2tlci9sb2NhbGUvZW5fVVMuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9sb2NhbGUvZGVmYXVsdC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL21vZGFsL2xvY2FsZS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2xvY2FsZS1wcm92aWRlci9jb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvbG9jYWxlLXByb3ZpZGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvbG9jYWxlLXByb3ZpZGVyL0xvY2FsZVJlY2VpdmVyLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vQ2hlY2tDaXJjbGVGaWxsZWQuanMiLCJub2RlX21vZHVsZXMvQGN0cmwvdGlueWNvbG9yL2Rpc3QvbW9kdWxlL3V0aWwuanMiLCJub2RlX21vZHVsZXMvQGN0cmwvdGlueWNvbG9yL2Rpc3QvbW9kdWxlL2NvbnZlcnNpb24uanMiLCJub2RlX21vZHVsZXMvQGN0cmwvdGlueWNvbG9yL2Rpc3QvbW9kdWxlL2Nzcy1jb2xvci1uYW1lcy5qcyIsIm5vZGVfbW9kdWxlcy9AY3RybC90aW55Y29sb3IvZGlzdC9tb2R1bGUvZm9ybWF0LWlucHV0LmpzIiwibm9kZV9tb2R1bGVzL0BjdHJsL3Rpbnljb2xvci9kaXN0L21vZHVsZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9jb2xvcnMvZGlzdC9pbmRleC5lc20uanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9Eb20vY2FuVXNlRG9tLmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvRG9tL2NvbnRhaW5zLmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvRG9tL2R5bmFtaWNDU1MuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvdXRpbHMuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvY29tcG9uZW50cy9JY29uQmFzZS5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9jb21wb25lbnRzL3R3b1RvbmVQcmltYXJ5Q29sb3IuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvY29tcG9uZW50cy9BbnRkSWNvbi5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DaGVja0NpcmNsZUZpbGxlZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0Nsb3NlQ2lyY2xlRmlsbGVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Nsb3NlQ2lyY2xlRmlsbGVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRXhjbGFtYXRpb25DaXJjbGVGaWxsZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvRXhjbGFtYXRpb25DaXJjbGVGaWxsZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9JbmZvQ2lyY2xlRmlsbGVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0luZm9DaXJjbGVGaWxsZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Mb2FkaW5nT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvTG9hZGluZ091dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvUmVhY3QvcmVuZGVyLmpzIiwibm9kZV9tb2R1bGVzL3JjLW1vdGlvbi9lcy9jb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL3JjLW1vdGlvbi9lcy9Eb21XcmFwcGVyLmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvaG9va3MvdXNlU3RhdGUuanMiLCJub2RlX21vZHVsZXMvcmMtbW90aW9uL2VzL2ludGVyZmFjZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tb3Rpb24vZXMvdXRpbC9tb3Rpb24uanMiLCJub2RlX21vZHVsZXMvcmMtbW90aW9uL2VzL2hvb2tzL3VzZURvbU1vdGlvbkV2ZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tb3Rpb24vZXMvaG9va3MvdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdC5qcyIsIm5vZGVfbW9kdWxlcy9yYy11dGlsL2VzL3JhZi5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tb3Rpb24vZXMvaG9va3MvdXNlTmV4dEZyYW1lLmpzIiwibm9kZV9tb2R1bGVzL3JjLW1vdGlvbi9lcy9ob29rcy91c2VTdGVwUXVldWUuanMiLCJub2RlX21vZHVsZXMvcmMtbW90aW9uL2VzL2hvb2tzL3VzZVN0YXR1cy5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tb3Rpb24vZXMvQ1NTTW90aW9uLmpzIiwibm9kZV9tb2R1bGVzL3JjLW1vdGlvbi9lcy91dGlsL2RpZmYuanMiLCJub2RlX21vZHVsZXMvcmMtbW90aW9uL2VzL0NTU01vdGlvbkxpc3QuanMiLCJub2RlX21vZHVsZXMvcmMtbm90aWZpY2F0aW9uL2VzL05vdGljZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1ub3RpZmljYXRpb24vZXMvdXNlTm90aWZpY2F0aW9uLmpzIiwibm9kZV9tb2R1bGVzL3JjLW5vdGlmaWNhdGlvbi9lcy9Ob3RpZmljYXRpb24uanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9tZXNzYWdlL2hvb2tzL3VzZU1lc3NhZ2UuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9tZXNzYWdlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vQ2hlY2tDaXJjbGVPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DaGVja0NpcmNsZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vQ2xvc2VDaXJjbGVPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DbG9zZUNpcmNsZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vQ2xvc2VPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DbG9zZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9FeGNsYW1hdGlvbkNpcmNsZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vSW5mb0NpcmNsZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0luZm9DaXJjbGVPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL25vdGlmaWNhdGlvbi9ob29rcy91c2VOb3RpZmljYXRpb24uanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9ub3RpZmljYXRpb24vaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9jb25maWctcHJvdmlkZXIvY29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2NvbmZpZy1wcm92aWRlci9jc3NWYXJpYWJsZXMuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9jb25maWctcHJvdmlkZXIvRGlzYWJsZWRDb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvY29uZmlnLXByb3ZpZGVyL1NpemVDb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvY29uZmlnLXByb3ZpZGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvRG9tL2FkZEV2ZW50TGlzdGVuZXIuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9fdXRpbC9nZXREYXRhT3JBcmlhUHJvcHMuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9fdXRpbC9yZWFjdE5vZGUuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9fdXRpbC9nZXRTY3JvbGwuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9fdXRpbC9lYXNpbmdzLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvX3V0aWwvc2Nyb2xsVG8uanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9ob29rcy91c2VFdmVudC5qcyIsIm5vZGVfbW9kdWxlcy9yYy11dGlsL2VzL2hvb2tzL3VzZUxheW91dEVmZmVjdC5qcyIsIm5vZGVfbW9kdWxlcy9yYy11dGlsL2VzL2hvb2tzL3VzZU1lcmdlZFN0YXRlLmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvaXNNb2JpbGUuanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9LZXlDb2RlLmpzIiwibm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9ob29rcy91c2VCYXNlUHJvcHMuanMiLCJub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL2hvb2tzL3VzZURlbGF5UmVzZXQuanMiLCJub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL2hvb2tzL3VzZUxvY2suanMiLCJub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL2hvb2tzL3VzZVNlbGVjdFRyaWdnZXJDb250cm9sLmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvcGlja0F0dHJzLmpzIiwibm9kZV9tb2R1bGVzL3JjLW92ZXJmbG93L2VzL0l0ZW0uanMiLCJub2RlX21vZHVsZXMvcmMtb3ZlcmZsb3cvZXMvaG9va3MvY2hhbm5lbFVwZGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1vdmVyZmxvdy9lcy9ob29rcy91c2VFZmZlY3RTdGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1vdmVyZmxvdy9lcy9jb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL3JjLW92ZXJmbG93L2VzL1Jhd0l0ZW0uanMiLCJub2RlX21vZHVsZXMvcmMtb3ZlcmZsb3cvZXMvT3ZlcmZsb3cuanMiLCJub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL1RyYW5zQnRuLmpzIiwibm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9TZWxlY3Rvci9JbnB1dC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvdXRpbHMvY29tbW9uVXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvaG9va3MvdXNlTGF5b3V0RWZmZWN0LmpzIiwibm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9TZWxlY3Rvci9NdWx0aXBsZVNlbGVjdG9yLmpzIiwibm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9TZWxlY3Rvci9TaW5nbGVTZWxlY3Rvci5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvdXRpbHMva2V5VXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvU2VsZWN0b3IvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9Qb3J0YWwuanMiLCJub2RlX21vZHVsZXMvcmMtdHJpZ2dlci9lcy91dGlscy9hbGlnblV0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtdHJpZ2dlci9lcy91dGlscy9sZWdhY3lVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyaWdnZXIvZXMvUG9wdXAvTWFzay5qcyIsIm5vZGVfbW9kdWxlcy9kb20tYWxpZ24vZGlzdC13ZWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9pc0VxdWFsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvRG9tL2lzVmlzaWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1hbGlnbi9lcy9ob29rcy91c2VCdWZmZXIuanMiLCJub2RlX21vZHVsZXMvcmMtYWxpZ24vZXMvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1hbGlnbi9lcy9BbGlnbi5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmlnZ2VyL2VzL1BvcHVwL3VzZVZpc2libGVTdGF0dXMuanMiLCJub2RlX21vZHVsZXMvcmMtdHJpZ2dlci9lcy9Qb3B1cC91c2VTdHJldGNoU3R5bGUuanMiLCJub2RlX21vZHVsZXMvcmMtdHJpZ2dlci9lcy9Qb3B1cC9Qb3B1cElubmVyLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyaWdnZXIvZXMvUG9wdXAvTW9iaWxlUG9wdXBJbm5lci5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmlnZ2VyL2VzL1BvcHVwL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyaWdnZXIvZXMvY29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmlnZ2VyL2VzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9TZWxlY3RUcmlnZ2VyLmpzIiwibm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy91dGlscy92YWx1ZVV0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL0Jhc2VTZWxlY3QuanMiLCJub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL2hvb2tzL3VzZUNhY2hlLmpzIiwibm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9ob29rcy91c2VGaWx0ZXJPcHRpb25zLmpzIiwibm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy9ob29rcy91c2VJZC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvdXRpbHMvbGVnYWN5VXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvaG9va3MvdXNlT3B0aW9ucy5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvaG9va3MvdXNlUmVmRnVuYy5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zZWxlY3QvZXMvT3B0R3JvdXAuanMiLCJub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL09wdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvRmlsbGVyLmpzIiwibm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy9TY3JvbGxCYXIuanMiLCJub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2VzL0l0ZW0uanMiLCJub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2VzL2hvb2tzL3VzZUNoaWxkcmVuLmpzIiwibm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy91dGlscy9DYWNoZU1hcC5qcyIsIm5vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvaG9va3MvdXNlSGVpZ2h0cy5qcyIsIm5vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvaG9va3MvdXNlU2Nyb2xsVG8uanMiLCJub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2VzL3V0aWxzL2FsZ29yaXRobVV0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2VzL2hvb2tzL3VzZURpZmZJdGVtLmpzIiwibm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy91dGlscy9pc0ZpcmVmb3guanMiLCJub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2VzL2hvb2tzL3VzZU9yaWdpblNjcm9sbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvaG9va3MvdXNlRnJhbWVXaGVlbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvaG9va3MvdXNlTW9iaWxlVG91Y2hNb3ZlLmpzIiwibm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy9MaXN0LmpzIiwibm9kZV9tb2R1bGVzL3JjLXNlbGVjdC9lcy91dGlscy9wbGF0Zm9ybVV0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL1NlbGVjdENvbnRleHQuanMiLCJub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL09wdGlvbkxpc3QuanMiLCJub2RlX21vZHVsZXMvcmMtc2VsZWN0L2VzL1NlbGVjdC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2VtcHR5L2VtcHR5LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvZW1wdHkvc2ltcGxlLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvZW1wdHkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9jb25maWctcHJvdmlkZXIvZGVmYXVsdFJlbmRlckVtcHR5LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvZm9ybS9jb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvX3V0aWwvdHlwZS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL191dGlsL21vdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL191dGlsL3N0YXR1c1V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vQ2hlY2tPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DaGVja091dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRG93bk91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Rvd25PdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1NlYXJjaE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1NlYXJjaE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvc2VsZWN0L3V0aWxzL2ljb25VdGlsLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvc3BhY2UvQ29tcGFjdC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3NlbGVjdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL191dGlsL2hvb2tzL3VzZUZvcmNlVXBkYXRlLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvX3V0aWwvcmVzcG9uc2l2ZU9ic2VydmUuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9ncmlkL2hvb2tzL3VzZUJyZWFrcG9pbnQuanMiLCJub2RlX21vZHVsZXMvcmMtdG9vbHRpcC9lcy9wbGFjZW1lbnRzLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRvb2x0aXAvZXMvUG9wdXAuanMiLCJub2RlX21vZHVsZXMvcmMtdG9vbHRpcC9lcy9Ub29sdGlwLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvX3V0aWwvY29sb3JzLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvX3V0aWwvcGxhY2VtZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3Rvb2x0aXAvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9fdXRpbC9nZXRSZW5kZXJQcm9wVmFsdWUuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9wb3BvdmVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRWxsaXBzaXNPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9FbGxpcHNpc091dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnUvZXMvY29udGV4dC9JZENvbnRleHQuanMiLCJub2RlX21vZHVsZXMvcmMtbWVudS9lcy9jb250ZXh0L01lbnVDb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnUvZXMvY29udGV4dC9QYXRoQ29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tZW51L2VzL2NvbnRleHQvUHJpdmF0ZUNvbnRleHQuanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9Eb20vZm9jdXMuanMiLCJub2RlX21vZHVsZXMvcmMtbWVudS9lcy9ob29rcy91c2VBY2Nlc3NpYmlsaXR5LmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnUvZXMvdXRpbHMvdGltZVV0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtbWVudS9lcy9ob29rcy91c2VLZXlSZWNvcmRzLmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnUvZXMvaG9va3MvdXNlTWVtb0NhbGxiYWNrLmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnUvZXMvaG9va3MvdXNlVVVJRC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tZW51L2VzL2hvb2tzL3VzZUFjdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tZW51L2VzL2hvb2tzL3VzZURpcmVjdGlvblN0eWxlLmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnUvZXMvSWNvbi5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tZW51L2VzL3V0aWxzL3dhcm5VdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnUvZXMvTWVudUl0ZW0uanMiLCJub2RlX21vZHVsZXMvcmMtbWVudS9lcy9TdWJNZW51L1N1Yk1lbnVMaXN0LmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnUvZXMvdXRpbHMvbm9kZVV0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtbWVudS9lcy9wbGFjZW1lbnRzLmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnUvZXMvdXRpbHMvbW90aW9uVXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tZW51L2VzL1N1Yk1lbnUvUG9wdXBUcmlnZ2VyLmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnUvZXMvU3ViTWVudS9JbmxpbmVTdWJNZW51TGlzdC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tZW51L2VzL1N1Yk1lbnUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtbWVudS9lcy9NZW51LmpzIiwibm9kZV9tb2R1bGVzL3JjLW1lbnUvZXMvTWVudUl0ZW1Hcm91cC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1tZW51L2VzL0RpdmlkZXIuanMiLCJub2RlX21vZHVsZXMvcmMtbWVudS9lcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0xlZnRPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9MZWZ0T3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9SaWdodE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1JpZ2h0T3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9sYXlvdXQvU2lkZXIuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9tZW51L01lbnVEaXZpZGVyLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvbWVudS9NZW51Q29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL21lbnUvTWVudUl0ZW0uanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9tZW51L1N1Yk1lbnUuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9tZW51L2hvb2tzL3VzZUl0ZW1zLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvbWVudS9PdmVycmlkZUNvbnRleHQuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9tZW51L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLWRyb3Bkb3duL2VzL3BsYWNlbWVudHMuanMiLCJub2RlX21vZHVsZXMvcmMtZHJvcGRvd24vZXMvaG9va3MvdXNlQWNjZXNzaWJpbGl0eS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1kcm9wZG93bi9lcy9Ecm9wZG93bi5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL191dGlsL3JhZi5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL191dGlsL3dhdmUuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9idXR0b24vYnV0dG9uLWdyb3VwLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvYnV0dG9uL0xvYWRpbmdJY29uLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvYnV0dG9uL2J1dHRvbi5qcyIsIm5vZGVfbW9kdWxlcy9yYy11dGlsL2VzL0RvbS9zdHlsZUNoZWNrZXIuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9fdXRpbC9zdHlsZUNoZWNrZXIuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9fdXRpbC9ob29rcy91c2VGbGV4R2FwU3VwcG9ydC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3NwYWNlL0l0ZW0uanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9zcGFjZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2Ryb3Bkb3duL2Ryb3Bkb3duLWJ1dHRvbi5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2Ryb3Bkb3duL2Ryb3Bkb3duLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZnJlZUdsb2JhbC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3Jvb3QuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19TeW1ib2wuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRSYXdUYWcuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19vYmplY3RUb1N0cmluZy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHZXRUYWcuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2lzT2JqZWN0TGlrZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNTeW1ib2wuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL190cmltbWVkRW5kSW5kZXguanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVHJpbS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNPYmplY3QuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL3RvTnVtYmVyLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9QYW5lbENvbnRleHQuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3BhbmVscy9IZWFkZXIuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3BhbmVscy9EZWNhZGVQYW5lbC9EZWNhZGVIZWFkZXIuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3V0aWxzL3RpbWVVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9wYW5lbHMvUGFuZWxCb2R5LmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9wYW5lbHMvRGVjYWRlUGFuZWwvRGVjYWRlQm9keS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvZXMvdXRpbHMvdWlVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9wYW5lbHMvRGVjYWRlUGFuZWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3V0aWxzL2RhdGVVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9wYW5lbHMvVGltZVBhbmVsL1RpbWVIZWFkZXIuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3BhbmVscy9UaW1lUGFuZWwvVGltZVVuaXRDb2x1bW4uanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3V0aWxzL21pc2NVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9wYW5lbHMvVGltZVBhbmVsL1RpbWVCb2R5LmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9wYW5lbHMvVGltZVBhbmVsL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9SYW5nZUNvbnRleHQuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL2hvb2tzL3VzZUNlbGxDbGFzc05hbWUuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3BhbmVscy9EYXRlUGFuZWwvRGF0ZUJvZHkuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3BhbmVscy9EYXRlUGFuZWwvRGF0ZUhlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvZXMvcGFuZWxzL0RhdGVQYW5lbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvZXMvcGFuZWxzL0RhdGV0aW1lUGFuZWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3BhbmVscy9XZWVrUGFuZWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3BhbmVscy9Nb250aFBhbmVsL01vbnRoSGVhZGVyLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9wYW5lbHMvTW9udGhQYW5lbC9Nb250aEJvZHkuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3BhbmVscy9Nb250aFBhbmVsL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9wYW5lbHMvUXVhcnRlclBhbmVsL1F1YXJ0ZXJIZWFkZXIuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3BhbmVscy9RdWFydGVyUGFuZWwvUXVhcnRlckJvZHkuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3BhbmVscy9RdWFydGVyUGFuZWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3BhbmVscy9ZZWFyUGFuZWwvWWVhckhlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvZXMvcGFuZWxzL1llYXJQYW5lbC9ZZWFyQm9keS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvZXMvcGFuZWxzL1llYXJQYW5lbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvZXMvdXRpbHMvZ2V0RXh0cmFGb290ZXIuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL3V0aWxzL2dldFJhbmdlcy5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvZXMvUGlja2VyUGFuZWwuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL1BpY2tlclRyaWdnZXIuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2VzL2hvb2tzL3VzZVBpY2tlcklucHV0LmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9ob29rcy91c2VUZXh0VmFsdWVNYXBwaW5nLmpzIiwibm9kZV9tb2R1bGVzL3NoYWxsb3dlcXVhbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvZXMvaG9va3MvdXNlVmFsdWVUZXh0cy5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvZXMvaG9va3MvdXNlSG92ZXJWYWx1ZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvZXMvUGlja2VyLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9ob29rcy91c2VSYW5nZURpc2FibGVkLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBpY2tlci9lcy9ob29rcy91c2VSYW5nZVZpZXdEYXRlcy5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvZXMvUmFuZ2VQaWNrZXIuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9yYWRpby9jb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL3JjLWNoZWNrYm94L2VzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvcmFkaW8vcmFkaW8uanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9yYWRpby9ncm91cC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3JhZGlvL3JhZGlvQnV0dG9uLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvcmFkaW8vaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9za2VsZXRvbi9FbGVtZW50LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvc2tlbGV0b24vQXZhdGFyLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvc2tlbGV0b24vQnV0dG9uLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRG90Q2hhcnRPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9Eb3RDaGFydE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvc2tlbGV0b24vTm9kZS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3NrZWxldG9uL0ltYWdlLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvc2tlbGV0b24vSW5wdXQuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9za2VsZXRvbi9QYXJhZ3JhcGguanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9za2VsZXRvbi9UaXRsZS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3NrZWxldG9uL1NrZWxldG9uLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vUGx1c091dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1BsdXNPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJzL2VzL1RhYkNvbnRleHQuanMiLCJub2RlX21vZHVsZXMvcmMtdGFicy9lcy9UYWJQYW5lbExpc3QvVGFiUGFuZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJzL2VzL1RhYlBhbmVsTGlzdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJzL2VzL2hvb2tzL3VzZU9mZnNldHMuanMiLCJub2RlX21vZHVsZXMvcmMtdGFicy9lcy9ob29rcy91c2VTeW5jU3RhdGUuanMiLCJub2RlX21vZHVsZXMvcmMtdGFicy9lcy9ob29rcy91c2VUb3VjaE1vdmUuanMiLCJub2RlX21vZHVsZXMvcmMtdGFicy9lcy9ob29rcy91c2VVcGRhdGUuanMiLCJub2RlX21vZHVsZXMvcmMtdGFicy9lcy9ob29rcy91c2VWaXNpYmxlUmFuZ2UuanMiLCJub2RlX21vZHVsZXMvcmMtdGFicy9lcy91dGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYnMvZXMvVGFiTmF2TGlzdC9BZGRCdXR0b24uanMiLCJub2RlX21vZHVsZXMvcmMtdGFicy9lcy9UYWJOYXZMaXN0L0V4dHJhQ29udGVudC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJzL2VzL1RhYk5hdkxpc3QvT3BlcmF0aW9uTm9kZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJzL2VzL1RhYk5hdkxpc3QvVGFiTm9kZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJzL2VzL1RhYk5hdkxpc3QvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtdGFicy9lcy9UYWJOYXZMaXN0L1dyYXBwZXIuanMiLCJub2RlX21vZHVsZXMvcmMtdGFicy9lcy9ob29rcy91c2VBbmltYXRlQ29uZmlnLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYnMvZXMvVGFicy5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3RhYnMvaG9va3MvdXNlQW5pbWF0ZUNvbmZpZy5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3RhYnMvaG9va3MvdXNlTGVnYWN5SXRlbXMuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy90YWJzL1RhYlBhbmUuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy90YWJzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvY2FyZC9HcmlkLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvY2FyZC9DYXJkLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvY2FyZC9NZXRhLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvY2FyZC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvbm93LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9kZWJvdW5jZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlL2VzL3V0aWxzL2NvbmR1Y3RVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyZWUvZXMvdXRpbHMvdHJlZVV0aWwuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9jaGVja2JveC9Hcm91cC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2NoZWNrYm94L0NoZWNrYm94LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvY2hlY2tib3gvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9ncmlkL1Jvd0NvbnRleHQuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9ncmlkL2NvbC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2dyaWQvcm93LmpzIiwibm9kZV9tb2R1bGVzL3JjLWNvbGxhcHNlL2VzL1BhbmVsQ29udGVudC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1jb2xsYXBzZS9lcy9QYW5lbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1jb2xsYXBzZS9lcy9Db2xsYXBzZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1jb2xsYXBzZS9lcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2NvbGxhcHNlL0NvbGxhcHNlUGFuZWwuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9jb2xsYXBzZS9Db2xsYXBzZS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2RhdGUtcGlja2VyL1BpY2tlckJ1dHRvbi5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3RhZy9DaGVja2FibGVUYWcuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy90YWcvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9kYXRlLXBpY2tlci9QaWNrZXJUYWcuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9DYWxlbmRhck91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0NhbGVuZGFyT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9DbG9ja0NpcmNsZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Nsb2NrQ2lyY2xlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Td2FwUmlnaHRPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9Td2FwUmlnaHRPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2RhdGUtcGlja2VyL3V0aWwuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9kYXRlLXBpY2tlci9nZW5lcmF0ZVBpY2tlci9nZW5lcmF0ZVJhbmdlUGlja2VyLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvZGF0ZS1waWNrZXIvZ2VuZXJhdGVQaWNrZXIvZ2VuZXJhdGVTaW5nbGVQaWNrZXIuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9kYXRlLXBpY2tlci9nZW5lcmF0ZVBpY2tlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2RpdmlkZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9wb3J0YWwvZXMvQ29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9AcmMtY29tcG9uZW50L3BvcnRhbC9lcy91c2VEb20uanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9nZXRTY3JvbGxCYXJTaXplLmpzIiwibm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvcG9ydGFsL2VzL3V0aWwuanMiLCJub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9wb3J0YWwvZXMvdXNlU2Nyb2xsTG9ja2VyLmpzIiwibm9kZV9tb2R1bGVzL0ByYy1jb21wb25lbnQvcG9ydGFsL2VzL21vY2suanMiLCJub2RlX21vZHVsZXMvQHJjLWNvbXBvbmVudC9wb3J0YWwvZXMvUG9ydGFsLmpzIiwibm9kZV9tb2R1bGVzL3JjLWRyYXdlci9lcy9EcmF3ZXJQYW5lbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1kcmF3ZXIvZXMvY29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1kcmF3ZXIvZXMvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1kcmF3ZXIvZXMvRHJhd2VyUG9wdXAuanMiLCJub2RlX21vZHVsZXMvcmMtZHJhd2VyL2VzL0RyYXdlci5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2RyYXdlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2Zvcm0vaG9va3MvdXNlRGVib3VuY2UuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9mb3JtL0Vycm9yTGlzdC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wdXRlLXNjcm9sbC1pbnRvLXZpZXcvZGlzdC9pbmRleC5tanMiLCJub2RlX21vZHVsZXMvc2Nyb2xsLWludG8tdmlldy1pZi1uZWVkZWQvZXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9mb3JtL3V0aWwuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9mb3JtL2hvb2tzL3VzZUZvcm0uanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9mb3JtL0Zvcm0uanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9mb3JtL2hvb2tzL3VzZUZvcm1JdGVtU3RhdHVzLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvZm9ybS9ob29rcy91c2VGcmFtZVN0YXRlLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvZm9ybS9ob29rcy91c2VJdGVtUmVmLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vUXVlc3Rpb25DaXJjbGVPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9RdWVzdGlvbkNpcmNsZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvZm9ybS9Gb3JtSXRlbUxhYmVsLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvZm9ybS9Gb3JtSXRlbUlucHV0LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvZm9ybS9Gb3JtSXRlbS9JdGVtSG9sZGVyLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvZm9ybS9Gb3JtSXRlbS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2Zvcm0vRm9ybUxpc3QuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9mb3JtL2hvb2tzL3VzZUZvcm1JbnN0YW5jZS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2Zvcm0vaW5kZXguanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9FeWVPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9FeWVPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9yYy11dGlsL2VzL0RvbS9jc3MuanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9ob29rcy91c2VJZC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1kaWFsb2cvZXMvRGlhbG9nL01hc2suanMiLCJub2RlX21vZHVsZXMvcmMtZGlhbG9nL2VzL3V0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtZGlhbG9nL2VzL0RpYWxvZy9Db250ZW50L01lbW9DaGlsZHJlbi5qcyIsIm5vZGVfbW9kdWxlcy9yYy1kaWFsb2cvZXMvRGlhbG9nL0NvbnRlbnQvUGFuZWwuanMiLCJub2RlX21vZHVsZXMvcmMtZGlhbG9nL2VzL0RpYWxvZy9Db250ZW50L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLWRpYWxvZy9lcy9EaWFsb2cvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtZGlhbG9nL2VzL0RpYWxvZ1dyYXAuanMiLCJub2RlX21vZHVsZXMvcmMtaW1hZ2UvZXMvUHJldmlld0dyb3VwLmpzIiwibm9kZV9tb2R1bGVzL3JjLWltYWdlL2VzL3ByZXZpZXdDb25maWcuanMiLCJub2RlX21vZHVsZXMvcmMtaW1hZ2UvZXMvT3BlcmF0aW9ucy5qcyIsIm5vZGVfbW9kdWxlcy9yYy1pbWFnZS9lcy9ob29rcy91c2VJbWFnZVRyYW5zZm9ybS5qcyIsIm5vZGVfbW9kdWxlcy9yYy1pbWFnZS9lcy9nZXRGaXhTY2FsZUVsZVRyYW5zUG9zaXRpb24uanMiLCJub2RlX21vZHVsZXMvcmMtaW1hZ2UvZXMvUHJldmlldy5qcyIsIm5vZGVfbW9kdWxlcy9yYy1pbWFnZS9lcy9JbWFnZS5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1JvdGF0ZUxlZnRPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9Sb3RhdGVMZWZ0T3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Sb3RhdGVSaWdodE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1JvdGF0ZVJpZ2h0T3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9ab29tSW5PdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9ab29tSW5PdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1pvb21PdXRPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9ab29tT3V0T3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9pbWFnZS9QcmV2aWV3R3JvdXAuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9pbWFnZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0L0dyb3VwLmpzIiwibm9kZV9tb2R1bGVzL3JjLWlucHV0L2VzL3V0aWxzL2NvbW1vblV0aWxzLmpzIiwibm9kZV9tb2R1bGVzL3JjLWlucHV0L2VzL0Jhc2VJbnB1dC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1pbnB1dC9lcy9JbnB1dC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0L2hvb2tzL3VzZVJlbW92ZVBhc3N3b3JkVGltZW91dC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0L3V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvaW5wdXQvSW5wdXQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9FeWVJbnZpc2libGVPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9FeWVJbnZpc2libGVPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0L1Bhc3N3b3JkLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvaW5wdXQvU2VhcmNoLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRleHRhcmVhL2VzL2NhbGN1bGF0ZU5vZGVIZWlnaHQuanMiLCJub2RlX21vZHVsZXMvcmMtdGV4dGFyZWEvZXMvUmVzaXphYmxlVGV4dEFyZWEuanMiLCJub2RlX21vZHVsZXMvcmMtdGV4dGFyZWEvZXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9pbnB1dC9DbGVhcmFibGVMYWJlbGVkSW5wdXQuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9pbnB1dC9UZXh0QXJlYS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vVXBPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9VcE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL3JjLWlucHV0LW51bWJlci9lcy91dGlscy9zdXBwb3J0VXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1pbnB1dC1udW1iZXIvZXMvdXRpbHMvbnVtYmVyVXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1pbnB1dC1udW1iZXIvZXMvdXRpbHMvTWluaURlY2ltYWwuanMiLCJub2RlX21vZHVsZXMvcmMtaW5wdXQtbnVtYmVyL2VzL1N0ZXBIYW5kbGVyLmpzIiwibm9kZV9tb2R1bGVzL3JjLWlucHV0LW51bWJlci9lcy9ob29rcy91c2VDdXJzb3IuanMiLCJub2RlX21vZHVsZXMvcmMtaW5wdXQtbnVtYmVyL2VzL2hvb2tzL3VzZUZyYW1lLmpzIiwibm9kZV9tb2R1bGVzL3JjLWlucHV0LW51bWJlci9lcy9JbnB1dE51bWJlci5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL2lucHV0LW51bWJlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0RvdWJsZUxlZnRPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9Eb3VibGVMZWZ0T3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Eb3VibGVSaWdodE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0RvdWJsZVJpZ2h0T3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvcmMtcGFnaW5hdGlvbi9lcy9QYWdlci5qcyIsIm5vZGVfbW9kdWxlcy9yYy1wYWdpbmF0aW9uL2VzL0tleUNvZGUuanMiLCJub2RlX21vZHVsZXMvcmMtcGFnaW5hdGlvbi9lcy9PcHRpb25zLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBhZ2luYXRpb24vZXMvbG9jYWxlL3poX0NOLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBhZ2luYXRpb24vZXMvUGFnaW5hdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3BhZ2luYXRpb24vU2VsZWN0LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvcGFnaW5hdGlvbi9QYWdpbmF0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvc3Bpbi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL191dGlsL0FjdGlvbkJ1dHRvbi5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3BvcGNvbmZpcm0vUHVyZVBhbmVsLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvcG9wY29uZmlybS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1wcm9ncmVzcy9lcy9jb21tb24uanMiLCJub2RlX21vZHVsZXMvcmMtcHJvZ3Jlc3MvZXMvaG9va3MvdXNlSWQuanMiLCJub2RlX21vZHVsZXMvcmMtcHJvZ3Jlc3MvZXMvQ2lyY2xlLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvcHJvZ3Jlc3MvdXRpbHMuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9wcm9ncmVzcy9DaXJjbGUuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9wcm9ncmVzcy9MaW5lLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvcHJvZ3Jlc3MvU3RlcHMuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9wcm9ncmVzcy9wcm9ncmVzcy5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1N0YXJGaWxsZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvU3RhckZpbGxlZC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1yYXRlL2VzL3V0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtcmF0ZS9lcy9TdGFyLmpzIiwibm9kZV9tb2R1bGVzL3JjLXJhdGUvZXMvUmF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3JhdGUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtc2xpZGVyL2VzL2NvbnRleHQuanMiLCJub2RlX21vZHVsZXMvcmMtc2xpZGVyL2VzL3V0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtc2xpZGVyL2VzL0hhbmRsZXMvSGFuZGxlLmpzIiwibm9kZV9tb2R1bGVzL3JjLXNsaWRlci9lcy9IYW5kbGVzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLXNsaWRlci9lcy9ob29rcy91c2VEcmFnLmpzIiwibm9kZV9tb2R1bGVzL3JjLXNsaWRlci9lcy9UcmFja3MvVHJhY2suanMiLCJub2RlX21vZHVsZXMvcmMtc2xpZGVyL2VzL1RyYWNrcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zbGlkZXIvZXMvTWFya3MvTWFyay5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zbGlkZXIvZXMvTWFya3MvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtc2xpZGVyL2VzL1N0ZXBzL0RvdC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zbGlkZXIvZXMvU3RlcHMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtc2xpZGVyL2VzL2hvb2tzL3VzZU9mZnNldC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1zbGlkZXIvZXMvU2xpZGVyLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvc2xpZGVyL1NsaWRlclRvb2x0aXAuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy9zbGlkZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtc3dpdGNoL2VzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvc3dpdGNoL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2VzL3N1Z2FyL0NvbHVtbkdyb3VwLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2VzL3N1Z2FyL0NvbHVtbi5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy91dGlscy92YWx1ZVV0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvZXMvY29udGV4dC9TdGlja3lDb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2VzL0NvbnRleHRTZWxlY3Rvci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy9jb250ZXh0L0hvdmVyQ29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy9jb250ZXh0L0JvZHlDb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2VzL2NvbnRleHQvUGVyZkNvbnRleHQuanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvZXMvQ2VsbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy9jb250ZXh0L1RhYmxlQ29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy91dGlscy9maXhVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2VzL0hlYWRlci9IZWFkZXJSb3cuanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvZXMvSGVhZGVyL0hlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy9jb250ZXh0L0V4cGFuZGVkUm93Q29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy9Cb2R5L0V4cGFuZGVkUm93LmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2VzL2NvbnRleHQvUmVzaXplQ29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy9Cb2R5L0JvZHlSb3cuanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvZXMvaG9va3MvdXNlRmxhdHRlblJlY29yZHMuanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvZXMvQm9keS9NZWFzdXJlQ2VsbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy9Cb2R5L01lYXN1cmVSb3cuanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvZXMvQm9keS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy91dGlscy9sZWdhY3lVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2VzL2NvbnN0YW50LmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2VzL2hvb2tzL3VzZUNvbHVtbnMuanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvZXMvaG9va3MvdXNlRnJhbWUuanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvZXMvaG9va3MvdXNlU3RpY2t5T2Zmc2V0cy5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy9Db2xHcm91cC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy9QYW5lbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy9Gb290ZXIvU3VtbWFyeUNvbnRleHQuanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvZXMvRm9vdGVyL0NlbGwuanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvZXMvRm9vdGVyL1Jvdy5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy9Gb290ZXIvU3VtbWFyeS5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy9Gb290ZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvZXMvdXRpbHMvZXhwYW5kVXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10YWJsZS9lcy9zdGlja3lTY3JvbGxCYXIuanMiLCJub2RlX21vZHVsZXMvcmMtdGFibGUvZXMvaG9va3MvdXNlU3RpY2t5LmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2VzL0ZpeGVkSG9sZGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JjLXRhYmxlL2VzL1RhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvdGFibGUvQ29sdW1uLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvdGFibGUvQ29sdW1uR3JvdXAuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy90YWJsZS9FeHBhbmRJY29uLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvdGFibGUvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0ZpbHRlckZpbGxlZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9GaWx0ZXJGaWxsZWQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVDbGVhci5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvZXEuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19hc3NvY0luZGV4T2YuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVEZWxldGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVHZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVIYXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVTZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19MaXN0Q2FjaGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0NsZWFyLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tEZWxldGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0dldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrSGFzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9pc0Z1bmN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fY29yZUpzRGF0YS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzTWFza2VkLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fdG9Tb3VyY2UuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNOYXRpdmUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRWYWx1ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldE5hdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX01hcC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX25hdGl2ZUNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hDbGVhci5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hEZWxldGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoR2V0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaEhhcy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hTZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19IYXNoLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVDbGVhci5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzS2V5YWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldE1hcERhdGEuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZURlbGV0ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlR2V0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVIYXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZVNldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX01hcENhY2hlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tTZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19TdGFjay5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldENhY2hlQWRkLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fc2V0Q2FjaGVIYXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19TZXRDYWNoZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5U29tZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2NhY2hlSGFzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZXF1YWxBcnJheXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19VaW50OEFycmF5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwVG9BcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldFRvQXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19lcXVhbEJ5VGFnLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlQdXNoLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUdldEFsbEtleXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUZpbHRlci5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvc3R1YkFycmF5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0U3ltYm9scy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VUaW1lcy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc0FyZ3VtZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcmd1bWVudHMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL3N0dWJGYWxzZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNCdWZmZXIuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19pc0luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9pc0xlbmd0aC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc1R5cGVkQXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVW5hcnkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19ub2RlVXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNUeXBlZEFycmF5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlMaWtlS2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzUHJvdG90eXBlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fb3ZlckFyZy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX25hdGl2ZUtleXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlS2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcnJheUxpa2UuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL2tleXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRBbGxLZXlzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZXF1YWxPYmplY3RzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fRGF0YVZpZXcuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19Qcm9taXNlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fU2V0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fV2Vha01hcC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFRhZy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc0VxdWFsRGVlcC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc0VxdWFsLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9pc0VxdWFsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyZWUvZXMvY29udGV4dFR5cGVzLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyZWUvZXMvSW5kZW50LmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyZWUvZXMvVHJlZU5vZGUuanMiLCJub2RlX21vZHVsZXMvcmMtdHJlZS9lcy91dGlsLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdERlc3RydWN0dXJpbmdFbXB0eS5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlL2VzL3VzZVVubW91bnQuanMiLCJub2RlX21vZHVsZXMvcmMtdHJlZS9lcy9Nb3Rpb25UcmVlTm9kZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlL2VzL3V0aWxzL2RpZmZVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyZWUvZXMvTm9kZUxpc3QuanMiLCJub2RlX21vZHVsZXMvcmMtdHJlZS9lcy9Ecm9wSW5kaWNhdG9yLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyZWUvZXMvVHJlZS5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0hvbGRlck91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0hvbGRlck91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvdHJlZS91dGlscy9kcm9wSW5kaWNhdG9yLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vQ2FyZXREb3duRmlsbGVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0NhcmV0RG93bkZpbGxlZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0ZpbGVPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9GaWxlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9NaW51c1NxdWFyZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL01pbnVzU3F1YXJlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9QbHVzU3F1YXJlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvUGx1c1NxdWFyZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvdHJlZS91dGlscy9pY29uVXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3RyZWUvVHJlZS5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0ZvbGRlck9wZW5PdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9Gb2xkZXJPcGVuT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Gb2xkZXJPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9Gb2xkZXJPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3RyZWUvdXRpbHMvZGljdFV0aWwuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy90cmVlL0RpcmVjdG9yeVRyZWUuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy90cmVlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvX3V0aWwvaG9va3MvdXNlU3luY1N0YXRlLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvdGFibGUvaG9va3MvdXNlRmlsdGVyL0ZpbHRlclNlYXJjaC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3RhYmxlL2hvb2tzL3VzZUZpbHRlci9GaWx0ZXJXcmFwcGVyLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvdGFibGUvaG9va3MvdXNlRmlsdGVyL0ZpbHRlckRyb3Bkb3duLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvdGFibGUvaG9va3MvdXNlRmlsdGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvdGFibGUvaG9va3MvdXNlTGF6eUtWTWFwLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvdGFibGUvaG9va3MvdXNlUGFnaW5hdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3RhYmxlL2hvb2tzL3VzZVNlbGVjdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0NhcmV0RG93bk91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0NhcmV0RG93bk91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vQ2FyZXRVcE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0NhcmV0VXBPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3RhYmxlL2hvb2tzL3VzZVNvcnRlci5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3RhYmxlL2hvb2tzL3VzZVRpdGxlQ29sdW1ucy5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3RhYmxlL1RhYmxlLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRGVsZXRlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvRGVsZXRlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvcmMtdHJlZS1zZWxlY3QvZXMvTGVnYWN5Q29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlLXNlbGVjdC9lcy9UcmVlU2VsZWN0Q29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlLXNlbGVjdC9lcy91dGlscy92YWx1ZVV0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtdHJlZS1zZWxlY3QvZXMvT3B0aW9uTGlzdC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlLXNlbGVjdC9lcy9UcmVlTm9kZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlLXNlbGVjdC9lcy91dGlscy9zdHJhdGVneVV0aWwuanMiLCJub2RlX21vZHVsZXMvcmMtdHJlZS1zZWxlY3QvZXMvdXRpbHMvbGVnYWN5VXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlLXNlbGVjdC9lcy9ob29rcy91c2VUcmVlRGF0YS5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlLXNlbGVjdC9lcy9ob29rcy91c2VDYWNoZS5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlLXNlbGVjdC9lcy9ob29rcy91c2VSZWZGdW5jLmpzIiwibm9kZV9tb2R1bGVzL3JjLXRyZWUtc2VsZWN0L2VzL2hvb2tzL3VzZURhdGFFbnRpdGllcy5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlLXNlbGVjdC9lcy9ob29rcy91c2VDaGVja2VkS2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlLXNlbGVjdC9lcy9ob29rcy91c2VGaWx0ZXJUcmVlRGF0YS5qcyIsIm5vZGVfbW9kdWxlcy9yYy10cmVlLXNlbGVjdC9lcy9UcmVlU2VsZWN0LmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvdHJlZS1zZWxlY3QvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtdXBsb2FkL2VzL3JlcXVlc3QuanMiLCJub2RlX21vZHVsZXMvcmMtdXBsb2FkL2VzL3VpZC5qcyIsIm5vZGVfbW9kdWxlcy9yYy11cGxvYWQvZXMvYXR0ci1hY2NlcHQuanMiLCJub2RlX21vZHVsZXMvcmMtdXBsb2FkL2VzL3RyYXZlcnNlRmlsZVRyZWUuanMiLCJub2RlX21vZHVsZXMvcmMtdXBsb2FkL2VzL0FqYXhVcGxvYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9yYy11cGxvYWQvZXMvVXBsb2FkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRmlsZVR3b1RvbmUuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvRmlsZVR3b1RvbmUuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9QYXBlckNsaXBPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9QYXBlckNsaXBPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1BpY3R1cmVUd29Ub25lLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1BpY3R1cmVUd29Ub25lLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvdXBsb2FkL3V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRG93bmxvYWRPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9Eb3dubG9hZE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvZXMvdXBsb2FkL1VwbG9hZExpc3QvTGlzdEl0ZW0uanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy91cGxvYWQvVXBsb2FkTGlzdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3VwbG9hZC9VcGxvYWQuanMiLCJub2RlX21vZHVsZXMvYW50ZC9lcy91cGxvYWQvRHJhZ2dlci5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2VzL3VwbG9hZC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy92aXRlLXBsdWdpbi1tb25rZXkvZGlzdC9jbGllbnQvaW5kZXgubWpzIiwibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm5vZGVfbW9kdWxlcy96dXN0YW5kL2VzbS92YW5pbGxhLm1qcyIsIm5vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS5wcm9kdWN0aW9uLm1pbi5qcyIsIm5vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS9zaGltL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlL2Nqcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltL3dpdGgtc2VsZWN0b3IucHJvZHVjdGlvbi5taW4uanMiLCJub2RlX21vZHVsZXMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvc2hpbS93aXRoLXNlbGVjdG9yLmpzIiwibm9kZV9tb2R1bGVzL3p1c3RhbmQvZXNtL2luZGV4Lm1qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2ZyZWVHbG9iYWwuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19yb290LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fU3ltYm9sLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fZ2V0UmF3VGFnLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fb2JqZWN0VG9TdHJpbmcuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlR2V0VGFnLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc09iamVjdExpa2UuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzU3ltYm9sLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYXJyYXlNYXAuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzQXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlVG9TdHJpbmcuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzT2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pZGVudGl0eS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNGdW5jdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NvcmVKc0RhdGEuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19pc01hc2tlZC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3RvU291cmNlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUlzTmF0aXZlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fZ2V0VmFsdWUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19nZXROYXRpdmUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19XZWFrTWFwLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NvcHlBcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2RlZmluZVByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYXJyYXlFYWNoLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faXNJbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VBc3NpZ25WYWx1ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvZXEuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19hc3NpZ25WYWx1ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NvcHlPYmplY3QuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzTGVuZ3RoLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc0FycmF5TGlrZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2lzSXRlcmF0ZWVDYWxsLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faXNQcm90b3R5cGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlVGltZXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlSXNBcmd1bWVudHMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzQXJndW1lbnRzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9zdHViRmFsc2UuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzQnVmZmVyLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUlzVHlwZWRBcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VVbmFyeS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX25vZGVVdGlsLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc1R5cGVkQXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19hcnJheUxpa2VLZXlzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fb3ZlckFyZy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX25hdGl2ZUtleXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlS2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMva2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX25hdGl2ZUtleXNJbi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VLZXlzSW4uanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL2tleXNJbi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2lzS2V5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbmF0aXZlQ3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faGFzaENsZWFyLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faGFzaERlbGV0ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2hhc2hHZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19oYXNoSGFzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faGFzaFNldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX0hhc2guanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19saXN0Q2FjaGVDbGVhci5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Fzc29jSW5kZXhPZi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2xpc3RDYWNoZURlbGV0ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2xpc3RDYWNoZUdldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2xpc3RDYWNoZUhhcy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2xpc3RDYWNoZVNldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX0xpc3RDYWNoZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX01hcC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX21hcENhY2hlQ2xlYXIuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19pc0tleWFibGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19nZXRNYXBEYXRhLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbWFwQ2FjaGVEZWxldGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19tYXBDYWNoZUdldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX21hcENhY2hlSGFzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbWFwQ2FjaGVTZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19NYXBDYWNoZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvbWVtb2l6ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX21lbW9pemVDYXBwZWQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19zdHJpbmdUb1BhdGguanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL3RvU3RyaW5nLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY2FzdFBhdGguanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL190b0tleS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VHZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL2dldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2FycmF5UHVzaC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2dldFByb3RvdHlwZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VTbGljZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3N0YWNrQ2xlYXIuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19zdGFja0RlbGV0ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3N0YWNrR2V0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fc3RhY2tIYXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19zdGFja1NldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX1N0YWNrLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUFzc2lnbi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VBc3NpZ25Jbi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Nsb25lQnVmZmVyLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYXJyYXlGaWx0ZXIuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL3N0dWJBcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2dldFN5bWJvbHMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jb3B5U3ltYm9scy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2dldFN5bWJvbHNJbi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NvcHlTeW1ib2xzSW4uanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlR2V0QWxsS2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2dldEFsbEtleXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19nZXRBbGxLZXlzSW4uanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19EYXRhVmlldy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX1Byb21pc2UuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19TZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19nZXRUYWcuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19pbml0Q2xvbmVBcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX1VpbnQ4QXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jbG9uZUFycmF5QnVmZmVyLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY2xvbmVEYXRhVmlldy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Nsb25lUmVnRXhwLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY2xvbmVTeW1ib2wuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jbG9uZVR5cGVkQXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19pbml0Q2xvbmVCeVRhZy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2luaXRDbG9uZU9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VJc01hcC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNNYXAuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlSXNTZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzU2V0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUNsb25lLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9jbG9uZURlZXAuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19zZXRDYWNoZUFkZC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3NldENhY2hlSGFzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fU2V0Q2FjaGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19hcnJheVNvbWUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jYWNoZUhhcy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2VxdWFsQXJyYXlzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbWFwVG9BcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3NldFRvQXJyYXkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19lcXVhbEJ5VGFnLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fZXF1YWxPYmplY3RzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUlzRXF1YWxEZWVwLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUlzRXF1YWwuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlSXNNYXRjaC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2lzU3RyaWN0Q29tcGFyYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2dldE1hdGNoRGF0YS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX21hdGNoZXNTdHJpY3RDb21wYXJhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZU1hdGNoZXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlSGFzSW4uanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19oYXNQYXRoLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9oYXNJbi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VNYXRjaGVzUHJvcGVydHkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlUHJvcGVydHkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlUHJvcGVydHlEZWVwLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9wcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VJdGVyYXRlZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NyZWF0ZUJhc2VGb3IuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlRm9yLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUZvck93bi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NyZWF0ZUJhc2VFYWNoLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUVhY2guanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL2xhc3QuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlSGFzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9oYXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19wYXJlbnQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzTWF0Y2guanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzVW5kZWZpbmVkLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9uZWdhdGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlVW5zZXQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlU2V0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZVBpY2tCeS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvcGlja0J5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9vbWl0QnkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWVzL3NldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VTb21lLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9zb21lLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1lcy91bnNldC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy91dGlscy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy9tb2RlbHMvY29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy9tb2RlbHMvdHJhbnNmb3JtUHJvcHMuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvbW9kZWxzL2JpbmRWYWx1ZXMuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvbW9kZWxzL2xheW91dC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy9tb2RlbHMvZm9ybUNvcmVVdGlscy5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy9yZW5kZXItY29yZS9GaWVsZEl0ZW0vbW9kdWxlLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL21vZGVscy9mb3JtRGF0YVNrZWxldG9uLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL21vZGVscy9leHByZXNzaW9uLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL21vZGVscy9maWVsZFNob3VsZFVwZGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy9tb2RlbHMvbWFwcGluZy5qcyIsIm5vZGVfbW9kdWxlcy9jb2xvci1uYW1lL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2lzLWFycmF5aXNoL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3NpbXBsZS1zd2l6emxlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbG9yLXN0cmluZy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb2xvci1jb252ZXJ0L2NvbnZlcnNpb25zLmpzIiwibm9kZV9tb2R1bGVzL2NvbG9yLWNvbnZlcnQvcm91dGUuanMiLCJub2RlX21vZHVsZXMvY29sb3ItY29udmVydC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb2xvci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy9tb2RlbHMvdmFsaWRhdGVzLmpzIiwibm9kZV9tb2R1bGVzL2Fob29rcy9lcy9jcmVhdGVVcGRhdGVFZmZlY3QvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYWhvb2tzL2VzL3V0aWxzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Fob29rcy9lcy91dGlscy9pc0Rldi5qcyIsIm5vZGVfbW9kdWxlcy9haG9va3MvZXMvdXNlVXBkYXRlRWZmZWN0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Fob29rcy9lcy91c2VMYXRlc3QvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYWhvb2tzL2VzL3VzZVVubW91bnQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZGF5anMvZGF5anMubWluLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL3JlbmRlci1jb3JlL0ZpZWxkSXRlbS9maWVsZC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy9yZW5kZXItY29yZS9GaWVsZEl0ZW0vbWFpbi5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy9yZW5kZXItY29yZS9GaWVsZEl0ZW0vaW5kZXguanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvcmVuZGVyLWNvcmUvRmllbGRMaXN0L21vZHVsZXMuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvcmVuZGVyLWNvcmUvRmllbGRMaXN0L2ZpZWxkLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL3JlbmRlci1jb3JlL0ZpZWxkTGlzdC9tYWluLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL3JlbmRlci1jb3JlL0ZpZWxkTGlzdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy9tb2RlbHMvc29ydFByb3BlcnRpZXMuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvcmVuZGVyLWNvcmUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvZm9ybS1jb3JlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0LmpzIiwibm9kZV9tb2R1bGVzL3JjLXBhZ2luYXRpb24vbGliL2xvY2FsZS96aF9DTi5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHMuanMiLCJub2RlX21vZHVsZXMvcmMtcGlja2VyL2xpYi9sb2NhbGUvemhfQ04uanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvdGltZS1waWNrZXIvbG9jYWxlL3poX0NOLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2RhdGUtcGlja2VyL2xvY2FsZS96aF9DTi5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9jYWxlbmRhci9sb2NhbGUvemhfQ04uanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvbG9jYWxlL3poX0NOLmpzIiwibm9kZV9tb2R1bGVzL3JjLXBhZ2luYXRpb24vbGliL2xvY2FsZS9lbl9VUy5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvbGliL2xvY2FsZS9lbl9VUy5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi90aW1lLXBpY2tlci9sb2NhbGUvZW5fVVMuanMiLCJub2RlX21vZHVsZXMvYW50ZC9saWIvZGF0ZS1waWNrZXIvbG9jYWxlL2VuX1VTLmpzIiwibm9kZV9tb2R1bGVzL2FudGQvbGliL2NhbGVuZGFyL2xvY2FsZS9lbl9VUy5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9sb2NhbGUvZGVmYXVsdC5qcyIsIm5vZGVfbW9kdWxlcy9hbnRkL2xpYi9sb2NhbGUvZW5fVVMuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvbG9jYWxlcy9lbl9VUy5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy9sb2NhbGVzL3poX0NOLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL2xvY2FsZXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZGF5anMvbG9jYWxlL3poLWNuLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL21vZGVscy9zdG9yZS5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy9tb2RlbHMvdmFsaWRhdGVNZXNzYWdlLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL3dpdGhQcm92aWRlci5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL3V0aWxzL3dpdGhGaWVsZFdyYXAuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9maWVsZHMvaW5wdXQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9maWVsZHMvbnVtYmVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL3dpZGdldHMvZmllbGRzL3RleHRBcmVhL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL3dpZGdldHMvZmllbGRzL3NlbGVjdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL2ZpZWxkcy9zd2l0Y2gvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9maWVsZHMvcmFkaW8vaW5kZXguanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9maWVsZHMvcmF0ZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL2ZpZWxkcy90cmVlU2VsZWN0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL3dpZGdldHMvZmllbGRzL2NoZWNrYm94L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL3dpZGdldHMvZmllbGRzL2NoZWNrYm94ZXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiLCJub2RlX21vZHVsZXMvcHJvcC10eXBlcy9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMuanMiLCJub2RlX21vZHVsZXMvcHJvcC10eXBlcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZ2xvYmFsLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb3JlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jdHguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2lzLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYW4tb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19mYWlscy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZGVzY3JpcHRvcnMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2llOC1kb20tZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1wcmltaXRpdmUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1kcC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fcHJvcGVydHktZGVzYy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faGlkZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faGFzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19leHBvcnQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NvZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZGVmaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8taW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8taW50ZWdlci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tbGVuZ3RoLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1hYnNvbHV0ZS1pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2xpYnJhcnkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NoYXJlZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdWlkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zaGFyZWQta2V5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZW51bS1idWcta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWtleXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1nb3BzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtcGllLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1hc3NpZ24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm9iamVjdC5hc3NpZ24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9hc3NpZ24uanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9hc3NpZ24uanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMuanMiLCJub2RlX21vZHVsZXMvb2JqZWN0LWFzc2lnbi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jcmVhdGUtcmVhY3QtY2xhc3MvZmFjdG9yeS5qcyIsIm5vZGVfbW9kdWxlcy9jcmVhdGUtcmVhY3QtY2xhc3MvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvbm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvRG9tL2NvbnRhaW5zLmpzIiwibm9kZV9tb2R1bGVzL2FkZC1kb20tZXZlbnQtbGlzdGVuZXIvbGliL0V2ZW50QmFzZU9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9hZGQtZG9tLWV2ZW50LWxpc3RlbmVyL2xpYi9FdmVudE9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9hZGQtZG9tLWV2ZW50LWxpc3RlbmVyL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9ub2RlX21vZHVsZXMvcmMtdXRpbC9saWIvRG9tL2FkZEV2ZW50TGlzdGVuZXIuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZGVmaW5lLXByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvZGVmaW5lLXByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc3RyaW5nLWF0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19yZWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlcmF0b3JzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZHBzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19odG1sLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NldC10by1zdHJpbmctdGFnLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdwby5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1kZWZpbmUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1zdGVwLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MtZXh0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9zeW1ib2wvaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL3N5bWJvbC9pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fbWV0YS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fd2tzLWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZW51bS1rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1hcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcG4uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1nb3BuLWV4dC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcGQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LnN5bWJvbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5zeW1ib2wub2JzZXJ2YWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vc3ltYm9sL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9zeW1ib2wuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9oZWxwZXJzL3R5cGVvZi5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2V0LXByb3RvLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3Quc2V0LXByb3RvdHlwZS1vZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L3NldC1wcm90b3R5cGUtb2YuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9zZXQtcHJvdG90eXBlLW9mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3QuY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cy5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9ub2RlX21vZHVsZXMvcmMtdXRpbC9lcy9Eb20vYWRkRXZlbnRMaXN0ZW5lci5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9ub2RlX21vZHVsZXMvcmMtYWxpZ24vZXMvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9ub2RlX21vZHVsZXMvcmMtYWxpZ24vZXMvQWxpZ24uanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL3JjLWFuaW1hdGUvbm9kZV9tb2R1bGVzL3JjLXV0aWwvZXMvdW5zYWZlTGlmZWN5Y2xlc1BvbHlmaWxsLmpzIiwibm9kZV9tb2R1bGVzL3JjLWFuaW1hdGUvZXMvQ2hpbGRyZW5VdGlscy5qcyIsIm5vZGVfbW9kdWxlcy9jc3MtYW5pbWF0aW9uL2VzL0V2ZW50LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvbmVudC1pbmRleG9mL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvbmVudC1jbGFzc2VzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Nzcy1hbmltYXRpb24vZXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmMtYW5pbWF0ZS9lcy91dGlsL2FuaW1hdGUuanMiLCJub2RlX21vZHVsZXMvcmMtYW5pbWF0ZS9lcy9BbmltYXRlQ2hpbGQuanMiLCJub2RlX21vZHVsZXMvcmMtYW5pbWF0ZS9lcy9BbmltYXRlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcy5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9ub2RlX21vZHVsZXMvcmMtdHJpZ2dlci9lcy9MYXp5UmVuZGVyQm94LmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL25vZGVfbW9kdWxlcy9yYy10cmlnZ2VyL2VzL1BvcHVwSW5uZXIuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvbm9kZV9tb2R1bGVzL3JjLXRyaWdnZXIvZXMvdXRpbHMuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvbm9kZV9tb2R1bGVzL3JjLXRyaWdnZXIvZXMvUG9wdXAuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvbm9kZV9tb2R1bGVzL3JjLXV0aWwvbGliL2dldENvbnRhaW5lclJlbmRlck1peGluLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL25vZGVfbW9kdWxlcy9yYy10cmlnZ2VyL2VzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3Rpbnljb2xvcjIvY2pzL3Rpbnljb2xvci5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9ub2RlX21vZHVsZXMvcmMtY29sb3ItcGlja2VyL2xpYi9oZWxwZXJzL2NvbG9yLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL25vZGVfbW9kdWxlcy9yYy1jb2xvci1waWNrZXIvbGliL0JvYXJkLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL25vZGVfbW9kdWxlcy9yYy1jb2xvci1waWNrZXIvbGliL1ByZXZpZXcuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvbm9kZV9tb2R1bGVzL3JjLWNvbG9yLXBpY2tlci9saWIvUmliYm9uLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL25vZGVfbW9kdWxlcy9yYy1jb2xvci1waWNrZXIvbGliL0FscGhhLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL25vZGVfbW9kdWxlcy9yYy1jb2xvci1waWNrZXIvbGliL2hlbHBlcnMvcGVyY2VudGFnZS5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9ub2RlX21vZHVsZXMvcmMtY29sb3ItcGlja2VyL2xpYi9QYXJhbXMuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvbm9kZV9tb2R1bGVzL3JjLWNvbG9yLXBpY2tlci9saWIvdXRpbHMvdmFsaWRhdGlvbkNvbG9yLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL25vZGVfbW9kdWxlcy9yYy1jb2xvci1waWNrZXIvbGliL1BhbmVsLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL25vZGVfbW9kdWxlcy9yYy1jb2xvci1waWNrZXIvbGliL3BsYWNlbWVudHMuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvbm9kZV9tb2R1bGVzL3JjLWNvbG9yLXBpY2tlci9saWIvQ29sb3JQaWNrZXIuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvbm9kZV9tb2R1bGVzL3JjLWNvbG9yLXBpY2tlci9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9maWVsZHMvY29sb3IvYWxwaGFoZXhNYXAuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9maWVsZHMvY29sb3IvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZGF5anMvcGx1Z2luL3F1YXJ0ZXJPZlllYXIuanMiLCJub2RlX21vZHVsZXMvZGF5anMvcGx1Z2luL3dlZWtPZlllYXIuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy91dGlscy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9kYXlqcy9wbHVnaW4vd2Vla2RheS5qcyIsIm5vZGVfbW9kdWxlcy9kYXlqcy9wbHVnaW4vbG9jYWxlRGF0YS5qcyIsIm5vZGVfbW9kdWxlcy9kYXlqcy9wbHVnaW4vd2Vla1llYXIuanMiLCJub2RlX21vZHVsZXMvZGF5anMvcGx1Z2luL2FkdmFuY2VkRm9ybWF0LmpzIiwibm9kZV9tb2R1bGVzL2RheWpzL3BsdWdpbi9jdXN0b21QYXJzZUZvcm1hdC5qcyIsIm5vZGVfbW9kdWxlcy9yYy1waWNrZXIvZXMvZ2VuZXJhdGUvZGF5anMuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9jb21wb25lbnRzL0RhdGVQaWNrZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9maWVsZHMvZGF0ZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL2ZpZWxkcy9kYXRlUmFuZ2UvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9jb21wb25lbnRzL1RpbWVQaWNrZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9maWVsZHMvdGltZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL2ZpZWxkcy90aW1lUmFuZ2UvaW5kZXguanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2YuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b1ByaW1pdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvUHJvcGVydHlLZXkuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDIuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vUGljdHVyZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXJyYXlXaXRoSG9sZXMuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5TGlrZVRvQXJyYXkuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL25vbkl0ZXJhYmxlUmVzdC5qcyIsIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXkuanMiLCJub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlLmpzIiwibm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2NvbXBvbmVudHMvQ29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9yYy11dGlsL2xpYi93YXJuaW5nLmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvbGliL0RvbS9jYW5Vc2VEb20uanMiLCJub2RlX21vZHVsZXMvcmMtdXRpbC9saWIvRG9tL2NvbnRhaW5zLmpzIiwibm9kZV9tb2R1bGVzL3JjLXV0aWwvbGliL0RvbS9keW5hbWljQ1NTLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2xpYi91dGlscy5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9saWIvY29tcG9uZW50cy9JY29uQmFzZS5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy9saWIvY29tcG9uZW50cy90d29Ub25lUHJpbWFyeUNvbG9yLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2xpYi9jb21wb25lbnRzL0FudGRJY29uLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2xpYi9pY29ucy9QaWN0dXJlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9maWVsZHMvaW1hZ2VJbnB1dC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL2ZpZWxkcy91cmxJbnB1dC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL2ZpZWxkcy9zbGlkZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vVXBsb2FkT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL1VwbG9hZE91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL3dpZGdldHMvZmllbGRzL3VwbG9hZC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL2ZpZWxkcy9odG1sL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL3dpZGdldHMvZmllbGRzL3BlcmNlbnRTbGlkZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9jb21wb25lbnRzL1BhbmVsVmlldy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL2JveGNhcmQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vRG93bk91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2xpYi9pY29ucy9Eb3duT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9ib3hDb2xsYXBzZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL2JveFN1YklubGluZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL2JveExpbmVUaXRsZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9QbHVzT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL1BsdXNPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9Db3B5T3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0NvcHlPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9DbG9zZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2xpYi9pY29ucy9DbG9zZU91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0Fycm93RG93bk91dGxpbmVkLmpzIiwibm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2ljb25zL2xpYi9pY29ucy9BcnJvd0Rvd25PdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9BcnJvd1VwT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0Fycm93VXBPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL2NvbXBvbmVudHMvRkJ1dHRvbi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL2xpc3RTaW1wbGUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9saXN0Q2FyZC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9AYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9JbmZvQ2lyY2xlT3V0bGluZWQuanMiLCJub2RlX21vZHVsZXMvQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0luZm9DaXJjbGVPdXRsaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL2xpc3RUYWJsZS90YWJsZUNlbGwuanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9saXN0VGFibGUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9saXN0RHJhd2VyL2RyYXdlckZvcm0uanMiLCJub2RlX21vZHVsZXMvZm9ybS1yZW5kZXIvZXMvd2lkZ2V0cy9saXN0RHJhd2VyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL3dpZGdldHMvbGlzdFZpcnR1YWwvdmlydHVhbENlbGwuanMiLCJub2RlX21vZHVsZXMvdmlydHVhbGl6ZWR0YWJsZWZvcmFudGQ0L2Rpc3QvZXNtL3Z0LmpzIiwibm9kZV9tb2R1bGVzL3ZpcnR1YWxpemVkdGFibGVmb3JhbnRkNC9kaXN0L2VzbS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL2xpc3RWaXJ0dWFsL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL3dpZGdldHMvbGlzdFRhYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL3ZvaWRUaXRsZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mb3JtLXJlbmRlci9lcy93aWRnZXRzL0Vycm9yU2NoZW1hL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL21vZGVscy9mbGF0dGVuU2NoZW1hLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL21vZGVscy91c2VGb3JtLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm0tcmVuZGVyL2VzL2luZGV4LmpzIiwic3JjL3NjaGVtYS9zdGFyUGFnZUhyZWYuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYmluZC5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvdXRpbHMuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvQXhpb3NFcnJvci5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9udWxsLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3RvRm9ybURhdGEuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvQXhpb3NVUkxTZWFyY2hQYXJhbXMuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYnVpbGRVUkwuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvSW50ZXJjZXB0b3JNYW5hZ2VyLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9kZWZhdWx0cy90cmFuc2l0aW9uYWwuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2Jyb3dzZXIvY2xhc3Nlcy9VUkxTZWFyY2hQYXJhbXMuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2Jyb3dzZXIvY2xhc3Nlcy9Gb3JtRGF0YS5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvcGxhdGZvcm0vYnJvd3Nlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy90b1VSTEVuY29kZWRGb3JtLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2Zvcm1EYXRhVG9KU09OLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9kZWZhdWx0cy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9wYXJzZUhlYWRlcnMuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvQXhpb3NIZWFkZXJzLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL3RyYW5zZm9ybURhdGEuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9pc0NhbmNlbC5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvY2FuY2VsL0NhbmNlbGVkRXJyb3IuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvc2V0dGxlLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2Nvb2tpZXMuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNBYnNvbHV0ZVVSTC5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9jb21iaW5lVVJMcy5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9idWlsZEZ1bGxQYXRoLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzVVJMU2FtZU9yaWdpbi5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9wYXJzZVByb3RvY29sLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3NwZWVkb21ldGVyLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9hZGFwdGVycy94aHIuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2FkYXB0ZXJzL2FkYXB0ZXJzLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL2Rpc3BhdGNoUmVxdWVzdC5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9tZXJnZUNvbmZpZy5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvZW52L2RhdGEuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvdmFsaWRhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0F4aW9zLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jYW5jZWwvQ2FuY2VsVG9rZW4uanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvc3ByZWFkLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzQXhpb3NFcnJvci5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9IdHRwU3RhdHVzQ29kZS5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvYXhpb3MuanMiLCJzcmMvYXBpL3JlcXVlc3QuanMiLCJzcmMvQXBwLmpzeCIsInNyYy9tYWluLmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBtID0gcmVxdWlyZSgncmVhY3QtZG9tJyk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBleHBvcnRzLmNyZWF0ZVJvb3QgPSBtLmNyZWF0ZVJvb3Q7XG4gIGV4cG9ydHMuaHlkcmF0ZVJvb3QgPSBtLmh5ZHJhdGVSb290O1xufSBlbHNlIHtcbiAgdmFyIGkgPSBtLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEO1xuICBleHBvcnRzLmNyZWF0ZVJvb3QgPSBmdW5jdGlvbihjLCBvKSB7XG4gICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbS5jcmVhdGVSb290KGMsIG8pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpLnVzaW5nQ2xpZW50RW50cnlQb2ludCA9IGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgZXhwb3J0cy5oeWRyYXRlUm9vdCA9IGZ1bmN0aW9uKGMsIGgsIG8pIHtcbiAgICBpLnVzaW5nQ2xpZW50RW50cnlQb2ludCA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBtLmh5ZHJhdGVSb290KGMsIGgsIG8pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpLnVzaW5nQ2xpZW50RW50cnlQb2ludCA9IGZhbHNlO1xuICAgIH1cbiAgfTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG4gIHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iajtcbiAgfSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gb2JqICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xuICB9LCBfdHlwZW9mKG9iaik7XG59IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIi4vdHlwZW9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfdG9QcmltaXRpdmUoaW5wdXQsIGhpbnQpIHtcbiAgaWYgKF90eXBlb2YoaW5wdXQpICE9PSBcIm9iamVjdFwiIHx8IGlucHV0ID09PSBudWxsKSByZXR1cm4gaW5wdXQ7XG4gIHZhciBwcmltID0gaW5wdXRbU3ltYm9sLnRvUHJpbWl0aXZlXTtcbiAgaWYgKHByaW0gIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciByZXMgPSBwcmltLmNhbGwoaW5wdXQsIGhpbnQgfHwgXCJkZWZhdWx0XCIpO1xuICAgIGlmIChfdHlwZW9mKHJlcykgIT09IFwib2JqZWN0XCIpIHJldHVybiByZXM7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpO1xuICB9XG4gIHJldHVybiAoaGludCA9PT0gXCJzdHJpbmdcIiA/IFN0cmluZyA6IE51bWJlcikoaW5wdXQpO1xufSIsImltcG9ydCBfdHlwZW9mIGZyb20gXCIuL3R5cGVvZi5qc1wiO1xuaW1wb3J0IHRvUHJpbWl0aXZlIGZyb20gXCIuL3RvUHJpbWl0aXZlLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleShhcmcpIHtcbiAgdmFyIGtleSA9IHRvUHJpbWl0aXZlKGFyZywgXCJzdHJpbmdcIik7XG4gIHJldHVybiBfdHlwZW9mKGtleSkgPT09IFwic3ltYm9sXCIgPyBrZXkgOiBTdHJpbmcoa2V5KTtcbn0iLCJpbXBvcnQgdG9Qcm9wZXJ0eUtleSBmcm9tIFwiLi90b1Byb3BlcnR5S2V5LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGtleSA9IHRvUHJvcGVydHlLZXkoa2V5KTtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIG9iajtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufSIsImltcG9ydCB0b1Byb3BlcnR5S2V5IGZyb20gXCIuL3RvUHJvcGVydHlLZXkuanNcIjtcbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHRvUHJvcGVydHlLZXkoZGVzY3JpcHRvci5rZXkpLCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHtcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICBvLl9fcHJvdG9fXyA9IHA7XG4gICAgcmV0dXJuIG87XG4gIH07XG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG59IiwiaW1wb3J0IHNldFByb3RvdHlwZU9mIGZyb20gXCIuL3NldFByb3RvdHlwZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtcbiAgfVxuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgdmFsdWU6IHN1YkNsYXNzLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3ViQ2xhc3MsIFwicHJvdG90eXBlXCIsIHtcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSk7XG4gIGlmIChzdXBlckNsYXNzKSBzZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTtcbiAgfTtcbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7XG4gIGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7XG4gIGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7XG4gIHRyeSB7XG4gICAgQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7XG4gIGlmIChzZWxmID09PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIH1cbiAgcmV0dXJuIHNlbGY7XG59IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIi4vdHlwZW9mLmpzXCI7XG5pbXBvcnQgYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCIuL2Fzc2VydFRoaXNJbml0aWFsaXplZC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkge1xuICBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkge1xuICAgIHJldHVybiBjYWxsO1xuICB9IGVsc2UgaWYgKGNhbGwgIT09IHZvaWQgMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZFwiKTtcbiAgfVxuICByZXR1cm4gYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpO1xufSIsImltcG9ydCBnZXRQcm90b3R5cGVPZiBmcm9tIFwiLi9nZXRQcm90b3R5cGVPZi5qc1wiO1xuaW1wb3J0IGlzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCBmcm9tIFwiLi9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QuanNcIjtcbmltcG9ydCBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIGZyb20gXCIuL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4uanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7XG4gIHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7XG4gIHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHtcbiAgICB2YXIgU3VwZXIgPSBnZXRQcm90b3R5cGVPZihEZXJpdmVkKSxcbiAgICAgIHJlc3VsdDtcbiAgICBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkge1xuICAgICAgdmFyIE5ld1RhcmdldCA9IGdldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yO1xuICAgICAgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTtcbiAgfTtcbn0iLCIvKiFcblx0Q29weXJpZ2h0IChjKSAyMDE4IEplZCBXYXRzb24uXG5cdExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAoTUlUKSwgc2VlXG5cdGh0dHA6Ly9qZWR3YXRzb24uZ2l0aHViLmlvL2NsYXNzbmFtZXNcbiovXG4vKiBnbG9iYWwgZGVmaW5lICovXG5cbihmdW5jdGlvbiAoKSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuXHR2YXIgaGFzT3duID0ge30uaGFzT3duUHJvcGVydHk7XG5cdHZhciBuYXRpdmVDb2RlU3RyaW5nID0gJ1tuYXRpdmUgY29kZV0nO1xuXG5cdGZ1bmN0aW9uIGNsYXNzTmFtZXMoKSB7XG5cdFx0dmFyIGNsYXNzZXMgPSBbXTtcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgYXJnID0gYXJndW1lbnRzW2ldO1xuXHRcdFx0aWYgKCFhcmcpIGNvbnRpbnVlO1xuXG5cdFx0XHR2YXIgYXJnVHlwZSA9IHR5cGVvZiBhcmc7XG5cblx0XHRcdGlmIChhcmdUeXBlID09PSAnc3RyaW5nJyB8fCBhcmdUeXBlID09PSAnbnVtYmVyJykge1xuXHRcdFx0XHRjbGFzc2VzLnB1c2goYXJnKTtcblx0XHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG5cdFx0XHRcdGlmIChhcmcubGVuZ3RoKSB7XG5cdFx0XHRcdFx0dmFyIGlubmVyID0gY2xhc3NOYW1lcy5hcHBseShudWxsLCBhcmcpO1xuXHRcdFx0XHRcdGlmIChpbm5lcikge1xuXHRcdFx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGlubmVyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoYXJnVHlwZSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0aWYgKGFyZy50b1N0cmluZyAhPT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyAmJiAhYXJnLnRvU3RyaW5nLnRvU3RyaW5nKCkuaW5jbHVkZXMoJ1tuYXRpdmUgY29kZV0nKSkge1xuXHRcdFx0XHRcdGNsYXNzZXMucHVzaChhcmcudG9TdHJpbmcoKSk7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmb3IgKHZhciBrZXkgaW4gYXJnKSB7XG5cdFx0XHRcdFx0aWYgKGhhc093bi5jYWxsKGFyZywga2V5KSAmJiBhcmdba2V5XSkge1xuXHRcdFx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGtleSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNsYXNzZXMuam9pbignICcpO1xuXHR9XG5cblx0aWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG5cdFx0Y2xhc3NOYW1lcy5kZWZhdWx0ID0gY2xhc3NOYW1lcztcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGNsYXNzTmFtZXM7XG5cdH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PT0gJ29iamVjdCcgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIHJlZ2lzdGVyIGFzICdjbGFzc25hbWVzJywgY29uc2lzdGVudCB3aXRoIG5wbSBwYWNrYWdlIG5hbWVcblx0XHRkZWZpbmUoJ2NsYXNzbmFtZXMnLCBbXSwgZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIGNsYXNzTmFtZXM7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0d2luZG93LmNsYXNzTmFtZXMgPSBjbGFzc05hbWVzO1xuXHR9XG59KCkpO1xuIiwiLyoqIEBsaWNlbnNlIFJlYWN0IHYxNi4xMy4xXG4gKiByZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0Jzt2YXIgYj1cImZ1bmN0aW9uXCI9PT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuZm9yLGM9Yj9TeW1ib2wuZm9yKFwicmVhY3QuZWxlbWVudFwiKTo2MDEwMyxkPWI/U3ltYm9sLmZvcihcInJlYWN0LnBvcnRhbFwiKTo2MDEwNixlPWI/U3ltYm9sLmZvcihcInJlYWN0LmZyYWdtZW50XCIpOjYwMTA3LGY9Yj9TeW1ib2wuZm9yKFwicmVhY3Quc3RyaWN0X21vZGVcIik6NjAxMDgsZz1iP1N5bWJvbC5mb3IoXCJyZWFjdC5wcm9maWxlclwiKTo2MDExNCxoPWI/U3ltYm9sLmZvcihcInJlYWN0LnByb3ZpZGVyXCIpOjYwMTA5LGs9Yj9TeW1ib2wuZm9yKFwicmVhY3QuY29udGV4dFwiKTo2MDExMCxsPWI/U3ltYm9sLmZvcihcInJlYWN0LmFzeW5jX21vZGVcIik6NjAxMTEsbT1iP1N5bWJvbC5mb3IoXCJyZWFjdC5jb25jdXJyZW50X21vZGVcIik6NjAxMTEsbj1iP1N5bWJvbC5mb3IoXCJyZWFjdC5mb3J3YXJkX3JlZlwiKTo2MDExMixwPWI/U3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlXCIpOjYwMTEzLHE9Yj9cblN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZV9saXN0XCIpOjYwMTIwLHI9Yj9TeW1ib2wuZm9yKFwicmVhY3QubWVtb1wiKTo2MDExNSx0PWI/U3ltYm9sLmZvcihcInJlYWN0LmxhenlcIik6NjAxMTYsdj1iP1N5bWJvbC5mb3IoXCJyZWFjdC5ibG9ja1wiKTo2MDEyMSx3PWI/U3ltYm9sLmZvcihcInJlYWN0LmZ1bmRhbWVudGFsXCIpOjYwMTE3LHg9Yj9TeW1ib2wuZm9yKFwicmVhY3QucmVzcG9uZGVyXCIpOjYwMTE4LHk9Yj9TeW1ib2wuZm9yKFwicmVhY3Quc2NvcGVcIik6NjAxMTk7XG5mdW5jdGlvbiB6KGEpe2lmKFwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEpe3ZhciB1PWEuJCR0eXBlb2Y7c3dpdGNoKHUpe2Nhc2UgYzpzd2l0Y2goYT1hLnR5cGUsYSl7Y2FzZSBsOmNhc2UgbTpjYXNlIGU6Y2FzZSBnOmNhc2UgZjpjYXNlIHA6cmV0dXJuIGE7ZGVmYXVsdDpzd2l0Y2goYT1hJiZhLiQkdHlwZW9mLGEpe2Nhc2UgazpjYXNlIG46Y2FzZSB0OmNhc2UgcjpjYXNlIGg6cmV0dXJuIGE7ZGVmYXVsdDpyZXR1cm4gdX19Y2FzZSBkOnJldHVybiB1fX19ZnVuY3Rpb24gQShhKXtyZXR1cm4geihhKT09PW19ZXhwb3J0cy5Bc3luY01vZGU9bDtleHBvcnRzLkNvbmN1cnJlbnRNb2RlPW07ZXhwb3J0cy5Db250ZXh0Q29uc3VtZXI9aztleHBvcnRzLkNvbnRleHRQcm92aWRlcj1oO2V4cG9ydHMuRWxlbWVudD1jO2V4cG9ydHMuRm9yd2FyZFJlZj1uO2V4cG9ydHMuRnJhZ21lbnQ9ZTtleHBvcnRzLkxhenk9dDtleHBvcnRzLk1lbW89cjtleHBvcnRzLlBvcnRhbD1kO1xuZXhwb3J0cy5Qcm9maWxlcj1nO2V4cG9ydHMuU3RyaWN0TW9kZT1mO2V4cG9ydHMuU3VzcGVuc2U9cDtleHBvcnRzLmlzQXN5bmNNb2RlPWZ1bmN0aW9uKGEpe3JldHVybiBBKGEpfHx6KGEpPT09bH07ZXhwb3J0cy5pc0NvbmN1cnJlbnRNb2RlPUE7ZXhwb3J0cy5pc0NvbnRleHRDb25zdW1lcj1mdW5jdGlvbihhKXtyZXR1cm4geihhKT09PWt9O2V4cG9ydHMuaXNDb250ZXh0UHJvdmlkZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1ofTtleHBvcnRzLmlzRWxlbWVudD1mdW5jdGlvbihhKXtyZXR1cm5cIm9iamVjdFwiPT09dHlwZW9mIGEmJm51bGwhPT1hJiZhLiQkdHlwZW9mPT09Y307ZXhwb3J0cy5pc0ZvcndhcmRSZWY9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1ufTtleHBvcnRzLmlzRnJhZ21lbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1lfTtleHBvcnRzLmlzTGF6eT1mdW5jdGlvbihhKXtyZXR1cm4geihhKT09PXR9O1xuZXhwb3J0cy5pc01lbW89ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1yfTtleHBvcnRzLmlzUG9ydGFsPWZ1bmN0aW9uKGEpe3JldHVybiB6KGEpPT09ZH07ZXhwb3J0cy5pc1Byb2ZpbGVyPWZ1bmN0aW9uKGEpe3JldHVybiB6KGEpPT09Z307ZXhwb3J0cy5pc1N0cmljdE1vZGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1mfTtleHBvcnRzLmlzU3VzcGVuc2U9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1wfTtcbmV4cG9ydHMuaXNWYWxpZEVsZW1lbnRUeXBlPWZ1bmN0aW9uKGEpe3JldHVyblwic3RyaW5nXCI9PT10eXBlb2YgYXx8XCJmdW5jdGlvblwiPT09dHlwZW9mIGF8fGE9PT1lfHxhPT09bXx8YT09PWd8fGE9PT1mfHxhPT09cHx8YT09PXF8fFwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEmJihhLiQkdHlwZW9mPT09dHx8YS4kJHR5cGVvZj09PXJ8fGEuJCR0eXBlb2Y9PT1ofHxhLiQkdHlwZW9mPT09a3x8YS4kJHR5cGVvZj09PW58fGEuJCR0eXBlb2Y9PT13fHxhLiQkdHlwZW9mPT09eHx8YS4kJHR5cGVvZj09PXl8fGEuJCR0eXBlb2Y9PT12KX07ZXhwb3J0cy50eXBlT2Y9ejtcbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGlzRnJhZ21lbnQgfSBmcm9tICdyZWFjdC1pcyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0b0FycmF5KGNoaWxkcmVuKSB7XG4gIHZhciBvcHRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICB2YXIgcmV0ID0gW107XG4gIFJlYWN0LkNoaWxkcmVuLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIGlmICgoY2hpbGQgPT09IHVuZGVmaW5lZCB8fCBjaGlsZCA9PT0gbnVsbCkgJiYgIW9wdGlvbi5rZWVwRW1wdHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGQpKSB7XG4gICAgICByZXQgPSByZXQuY29uY2F0KHRvQXJyYXkoY2hpbGQpKTtcbiAgICB9IGVsc2UgaWYgKGlzRnJhZ21lbnQoY2hpbGQpICYmIGNoaWxkLnByb3BzKSB7XG4gICAgICByZXQgPSByZXQuY29uY2F0KHRvQXJyYXkoY2hpbGQucHJvcHMuY2hpbGRyZW4sIG9wdGlvbikpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXQucHVzaChjaGlsZCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJldDtcbn0iLCIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG52YXIgd2FybmVkID0ge307XG52YXIgcHJlV2FybmluZ0ZucyA9IFtdO1xuXG4vKipcbiAqIFByZSB3YXJuaW5nIGVuYWJsZSB5b3UgdG8gcGFyc2UgY29udGVudCBiZWZvcmUgY29uc29sZS5lcnJvci5cbiAqIE1vZGlmeSB0byBudWxsIHdpbGwgcHJldmVudCB3YXJuaW5nLlxuICovXG5leHBvcnQgdmFyIHByZU1lc3NhZ2UgPSBmdW5jdGlvbiBwcmVNZXNzYWdlKGZuKSB7XG4gIHByZVdhcm5pbmdGbnMucHVzaChmbik7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIHdhcm5pbmcodmFsaWQsIG1lc3NhZ2UpIHtcbiAgLy8gU3VwcG9ydCB1Z2xpZnlcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIXZhbGlkICYmIGNvbnNvbGUgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBmaW5hbE1lc3NhZ2UgPSBwcmVXYXJuaW5nRm5zLnJlZHVjZShmdW5jdGlvbiAobXNnLCBwcmVNZXNzYWdlRm4pIHtcbiAgICAgIHJldHVybiBwcmVNZXNzYWdlRm4obXNnICE9PSBudWxsICYmIG1zZyAhPT0gdm9pZCAwID8gbXNnIDogJycsICd3YXJuaW5nJyk7XG4gICAgfSwgbWVzc2FnZSk7XG4gICAgaWYgKGZpbmFsTWVzc2FnZSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIldhcm5pbmc6IFwiLmNvbmNhdChmaW5hbE1lc3NhZ2UpKTtcbiAgICB9XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBub3RlKHZhbGlkLCBtZXNzYWdlKSB7XG4gIC8vIFN1cHBvcnQgdWdsaWZ5XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICF2YWxpZCAmJiBjb25zb2xlICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZmluYWxNZXNzYWdlID0gcHJlV2FybmluZ0Zucy5yZWR1Y2UoZnVuY3Rpb24gKG1zZywgcHJlTWVzc2FnZUZuKSB7XG4gICAgICByZXR1cm4gcHJlTWVzc2FnZUZuKG1zZyAhPT0gbnVsbCAmJiBtc2cgIT09IHZvaWQgMCA/IG1zZyA6ICcnLCAnbm90ZScpO1xuICAgIH0sIG1lc3NhZ2UpO1xuICAgIGlmIChmaW5hbE1lc3NhZ2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIk5vdGU6IFwiLmNvbmNhdChmaW5hbE1lc3NhZ2UpKTtcbiAgICB9XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNldFdhcm5lZCgpIHtcbiAgd2FybmVkID0ge307XG59XG5leHBvcnQgZnVuY3Rpb24gY2FsbChtZXRob2QsIHZhbGlkLCBtZXNzYWdlKSB7XG4gIGlmICghdmFsaWQgJiYgIXdhcm5lZFttZXNzYWdlXSkge1xuICAgIG1ldGhvZChmYWxzZSwgbWVzc2FnZSk7XG4gICAgd2FybmVkW21lc3NhZ2VdID0gdHJ1ZTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHdhcm5pbmdPbmNlKHZhbGlkLCBtZXNzYWdlKSB7XG4gIGNhbGwod2FybmluZywgdmFsaWQsIG1lc3NhZ2UpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5vdGVPbmNlKHZhbGlkLCBtZXNzYWdlKSB7XG4gIGNhbGwobm90ZSwgdmFsaWQsIG1lc3NhZ2UpO1xufVxud2FybmluZ09uY2UucHJlTWVzc2FnZSA9IHByZU1lc3NhZ2U7XG53YXJuaW5nT25jZS5yZXNldFdhcm5lZCA9IHJlc2V0V2FybmVkO1xud2FybmluZ09uY2Uubm90ZU9uY2UgPSBub3RlT25jZTtcbmV4cG9ydCBkZWZhdWx0IHdhcm5pbmdPbmNlO1xuLyogZXNsaW50LWVuYWJsZSAqLyIsImltcG9ydCBkZWZpbmVQcm9wZXJ0eSBmcm9tIFwiLi9kZWZpbmVQcm9wZXJ0eS5qc1wiO1xuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcbiAgICBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG4gIHJldHVybiBrZXlzO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX29iamVjdFNwcmVhZDIodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307XG4gICAgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgIH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gdGFyZ2V0O1xufSIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZU1lbW8oZ2V0VmFsdWUsIGNvbmRpdGlvbiwgc2hvdWxkVXBkYXRlKSB7XG4gIHZhciBjYWNoZVJlZiA9IFJlYWN0LnVzZVJlZih7fSk7XG4gIGlmICghKCd2YWx1ZScgaW4gY2FjaGVSZWYuY3VycmVudCkgfHwgc2hvdWxkVXBkYXRlKGNhY2hlUmVmLmN1cnJlbnQuY29uZGl0aW9uLCBjb25kaXRpb24pKSB7XG4gICAgY2FjaGVSZWYuY3VycmVudC52YWx1ZSA9IGdldFZhbHVlKCk7XG4gICAgY2FjaGVSZWYuY3VycmVudC5jb25kaXRpb24gPSBjb25kaXRpb247XG4gIH1cbiAgcmV0dXJuIGNhY2hlUmVmLmN1cnJlbnQudmFsdWU7XG59IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cblxuaW1wb3J0IHsgaXNNZW1vIH0gZnJvbSAncmVhY3QtaXMnO1xuaW1wb3J0IHVzZU1lbW8gZnJvbSBcIi4vaG9va3MvdXNlTWVtb1wiO1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxSZWYocmVmLCBub2RlKSB7XG4gIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmVmKG5vZGUpO1xuICB9IGVsc2UgaWYgKF90eXBlb2YocmVmKSA9PT0gJ29iamVjdCcgJiYgcmVmICYmICdjdXJyZW50JyBpbiByZWYpIHtcbiAgICByZWYuY3VycmVudCA9IG5vZGU7XG4gIH1cbn1cblxuLyoqXG4gKiBNZXJnZSByZWZzIGludG8gb25lIHJlZiBmdW5jdGlvbiB0byBzdXBwb3J0IHJlZiBwYXNzaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZVJlZigpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHJlZnMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgcmVmc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuICB2YXIgcmVmTGlzdCA9IHJlZnMuZmlsdGVyKGZ1bmN0aW9uIChyZWYpIHtcbiAgICByZXR1cm4gcmVmO1xuICB9KTtcbiAgaWYgKHJlZkxpc3QubGVuZ3RoIDw9IDEpIHtcbiAgICByZXR1cm4gcmVmTGlzdFswXTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZWZzLmZvckVhY2goZnVuY3Rpb24gKHJlZikge1xuICAgICAgZmlsbFJlZihyZWYsIG5vZGUpO1xuICAgIH0pO1xuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVzZUNvbXBvc2VSZWYoKSB7XG4gIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgcmVmcyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgIHJlZnNbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgfVxuICByZXR1cm4gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGNvbXBvc2VSZWYuYXBwbHkodm9pZCAwLCByZWZzKTtcbiAgfSwgcmVmcywgZnVuY3Rpb24gKHByZXYsIG5leHQpIHtcbiAgICByZXR1cm4gcHJldi5sZW5ndGggPT09IG5leHQubGVuZ3RoICYmIHByZXYuZXZlcnkoZnVuY3Rpb24gKHJlZiwgaSkge1xuICAgICAgcmV0dXJuIHJlZiA9PT0gbmV4dFtpXTtcbiAgICB9KTtcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydFJlZihub2RlT3JDb21wb25lbnQpIHtcbiAgdmFyIF90eXBlJHByb3RvdHlwZSwgX25vZGVPckNvbXBvbmVudCRwcm90O1xuICB2YXIgdHlwZSA9IGlzTWVtbyhub2RlT3JDb21wb25lbnQpID8gbm9kZU9yQ29tcG9uZW50LnR5cGUudHlwZSA6IG5vZGVPckNvbXBvbmVudC50eXBlO1xuXG4gIC8vIEZ1bmN0aW9uIGNvbXBvbmVudCBub2RlXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhKChfdHlwZSRwcm90b3R5cGUgPSB0eXBlLnByb3RvdHlwZSkgIT09IG51bGwgJiYgX3R5cGUkcHJvdG90eXBlICE9PSB2b2lkIDAgJiYgX3R5cGUkcHJvdG90eXBlLnJlbmRlcikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBDbGFzcyBjb21wb25lbnRcbiAgaWYgKHR5cGVvZiBub2RlT3JDb21wb25lbnQgPT09ICdmdW5jdGlvbicgJiYgISgoX25vZGVPckNvbXBvbmVudCRwcm90ID0gbm9kZU9yQ29tcG9uZW50LnByb3RvdHlwZSkgIT09IG51bGwgJiYgX25vZGVPckNvbXBvbmVudCRwcm90ICE9PSB2b2lkIDAgJiYgX25vZGVPckNvbXBvbmVudCRwcm90LnJlbmRlcikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4vKiBlc2xpbnQtZW5hYmxlICovIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuZXhwb3J0IGZ1bmN0aW9uIGlzRE9NKG5vZGUpIHtcbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnRcbiAgLy8gU2luY2UgWFVMRWxlbWVudCBpcyBhbHNvIHN1YmNsYXNzIG9mIEVsZW1lbnQsIHdlIG9ubHkgbmVlZCBIVE1MRWxlbWVudCBhbmQgU1ZHRWxlbWVudFxuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBTVkdFbGVtZW50O1xufVxuXG4vKipcbiAqIFJldHVybiBpZiBhIG5vZGUgaXMgYSBET00gbm9kZS4gRWxzZSB3aWxsIHJldHVybiBieSBgZmluZERPTU5vZGVgXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZpbmRET01Ob2RlKG5vZGUpIHtcbiAgaWYgKGlzRE9NKG5vZGUpKSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cbiAgaWYgKG5vZGUgaW5zdGFuY2VvZiBSZWFjdC5Db21wb25lbnQpIHtcbiAgICByZXR1cm4gUmVhY3RET00uZmluZERPTU5vZGUobm9kZSk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59IiwiLyoqXHJcbiAqIEEgY29sbGVjdGlvbiBvZiBzaGltcyB0aGF0IHByb3ZpZGUgbWluaW1hbCBmdW5jdGlvbmFsaXR5IG9mIHRoZSBFUzYgY29sbGVjdGlvbnMuXHJcbiAqXHJcbiAqIFRoZXNlIGltcGxlbWVudGF0aW9ucyBhcmUgbm90IG1lYW50IHRvIGJlIHVzZWQgb3V0c2lkZSBvZiB0aGUgUmVzaXplT2JzZXJ2ZXJcclxuICogbW9kdWxlcyBhcyB0aGV5IGNvdmVyIG9ubHkgYSBsaW1pdGVkIHJhbmdlIG9mIHVzZSBjYXNlcy5cclxuICovXHJcbi8qIGVzbGludC1kaXNhYmxlIHJlcXVpcmUtanNkb2MsIHZhbGlkLWpzZG9jICovXHJcbnZhciBNYXBTaGltID0gKGZ1bmN0aW9uICgpIHtcclxuICAgIGlmICh0eXBlb2YgTWFwICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJldHVybiBNYXA7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgaW5kZXggaW4gcHJvdmlkZWQgYXJyYXkgdGhhdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQga2V5LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QXJyYXk8QXJyYXk+fSBhcnJcclxuICAgICAqIEBwYXJhbSB7Kn0ga2V5XHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBnZXRJbmRleChhcnIsIGtleSkge1xyXG4gICAgICAgIHZhciByZXN1bHQgPSAtMTtcclxuICAgICAgICBhcnIuc29tZShmdW5jdGlvbiAoZW50cnksIGluZGV4KSB7XHJcbiAgICAgICAgICAgIGlmIChlbnRyeVswXSA9PT0ga2V5KSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBpbmRleDtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBmdW5jdGlvbiBjbGFzc18xKCkge1xyXG4gICAgICAgICAgICB0aGlzLl9fZW50cmllc19fID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbGFzc18xLnByb3RvdHlwZSwgXCJzaXplXCIsIHtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fX2VudHJpZXNfXy5sZW5ndGg7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwYXJhbSB7Kn0ga2V5XHJcbiAgICAgICAgICogQHJldHVybnMgeyp9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY2xhc3NfMS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGtleSkge1xyXG4gICAgICAgICAgICB2YXIgaW5kZXggPSBnZXRJbmRleCh0aGlzLl9fZW50cmllc19fLCBrZXkpO1xyXG4gICAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLl9fZW50cmllc19fW2luZGV4XTtcclxuICAgICAgICAgICAgcmV0dXJuIGVudHJ5ICYmIGVudHJ5WzFdO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHBhcmFtIHsqfSBrZXlcclxuICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlXHJcbiAgICAgICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY2xhc3NfMS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcclxuICAgICAgICAgICAgdmFyIGluZGV4ID0gZ2V0SW5kZXgodGhpcy5fX2VudHJpZXNfXywga2V5KTtcclxuICAgICAgICAgICAgaWYgKH5pbmRleCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fX2VudHJpZXNfX1tpbmRleF1bMV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX19lbnRyaWVzX18ucHVzaChba2V5LCB2YWx1ZV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcGFyYW0geyp9IGtleVxyXG4gICAgICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNsYXNzXzEucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICAgICAgdmFyIGVudHJpZXMgPSB0aGlzLl9fZW50cmllc19fO1xyXG4gICAgICAgICAgICB2YXIgaW5kZXggPSBnZXRJbmRleChlbnRyaWVzLCBrZXkpO1xyXG4gICAgICAgICAgICBpZiAofmluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICBlbnRyaWVzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwYXJhbSB7Kn0ga2V5XHJcbiAgICAgICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY2xhc3NfMS5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGtleSkge1xyXG4gICAgICAgICAgICByZXR1cm4gISF+Z2V0SW5kZXgodGhpcy5fX2VudHJpZXNfXywga2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNsYXNzXzEucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLl9fZW50cmllc19fLnNwbGljZSgwKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXHJcbiAgICAgICAgICogQHBhcmFtIHsqfSBbY3R4PW51bGxdXHJcbiAgICAgICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY2xhc3NfMS5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIChjYWxsYmFjaywgY3R4KSB7XHJcbiAgICAgICAgICAgIGlmIChjdHggPT09IHZvaWQgMCkgeyBjdHggPSBudWxsOyB9XHJcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSB0aGlzLl9fZW50cmllc19fOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gX2FbX2ldO1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbChjdHgsIGVudHJ5WzFdLCBlbnRyeVswXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBjbGFzc18xO1xyXG4gICAgfSgpKTtcclxufSkoKTtcblxuLyoqXHJcbiAqIERldGVjdHMgd2hldGhlciB3aW5kb3cgYW5kIGRvY3VtZW50IG9iamVjdHMgYXJlIGF2YWlsYWJsZSBpbiBjdXJyZW50IGVudmlyb25tZW50LlxyXG4gKi9cclxudmFyIGlzQnJvd3NlciA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50ID09PSBkb2N1bWVudDtcblxuLy8gUmV0dXJucyBnbG9iYWwgb2JqZWN0IG9mIGEgY3VycmVudCBlbnZpcm9ubWVudC5cclxudmFyIGdsb2JhbCQxID0gKGZ1bmN0aW9uICgpIHtcclxuICAgIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWwuTWF0aCA9PT0gTWF0aCkge1xyXG4gICAgICAgIHJldHVybiBnbG9iYWw7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmIHNlbGYuTWF0aCA9PT0gTWF0aCkge1xyXG4gICAgICAgIHJldHVybiBzZWxmO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5NYXRoID09PSBNYXRoKSB7XHJcbiAgICAgICAgcmV0dXJuIHdpbmRvdztcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xyXG4gICAgcmV0dXJuIEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XHJcbn0pKCk7XG5cbi8qKlxyXG4gKiBBIHNoaW0gZm9yIHRoZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgd2hpY2ggZmFsbHMgYmFjayB0byB0aGUgc2V0VGltZW91dCBpZlxyXG4gKiBmaXJzdCBvbmUgaXMgbm90IHN1cHBvcnRlZC5cclxuICpcclxuICogQHJldHVybnMge251bWJlcn0gUmVxdWVzdHMnIGlkZW50aWZpZXIuXHJcbiAqL1xyXG52YXIgcmVxdWVzdEFuaW1hdGlvbkZyYW1lJDEgPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgaWYgKHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAvLyBJdCdzIHJlcXVpcmVkIHRvIHVzZSBhIGJvdW5kZWQgZnVuY3Rpb24gYmVjYXVzZSBJRSBzb21ldGltZXMgdGhyb3dzXHJcbiAgICAgICAgLy8gYW4gXCJJbnZhbGlkIGNhbGxpbmcgb2JqZWN0XCIgZXJyb3IgaWYgckFGIGlzIGludm9rZWQgd2l0aG91dCB0aGUgZ2xvYmFsXHJcbiAgICAgICAgLy8gb2JqZWN0IG9uIHRoZSBsZWZ0IGhhbmQgc2lkZS5cclxuICAgICAgICByZXR1cm4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQoZ2xvYmFsJDEpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChjYWxsYmFjaykgeyByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBjYWxsYmFjayhEYXRlLm5vdygpKTsgfSwgMTAwMCAvIDYwKTsgfTtcclxufSkoKTtcblxuLy8gRGVmaW5lcyBtaW5pbXVtIHRpbWVvdXQgYmVmb3JlIGFkZGluZyBhIHRyYWlsaW5nIGNhbGwuXHJcbnZhciB0cmFpbGluZ1RpbWVvdXQgPSAyO1xyXG4vKipcclxuICogQ3JlYXRlcyBhIHdyYXBwZXIgZnVuY3Rpb24gd2hpY2ggZW5zdXJlcyB0aGF0IHByb3ZpZGVkIGNhbGxiYWNrIHdpbGwgYmVcclxuICogaW52b2tlZCBvbmx5IG9uY2UgZHVyaW5nIHRoZSBzcGVjaWZpZWQgZGVsYXkgcGVyaW9kLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGJlIGludm9rZWQgYWZ0ZXIgdGhlIGRlbGF5IHBlcmlvZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGRlbGF5IC0gRGVsYXkgYWZ0ZXIgd2hpY2ggdG8gaW52b2tlIGNhbGxiYWNrLlxyXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XHJcbiAqL1xyXG5mdW5jdGlvbiB0aHJvdHRsZSAoY2FsbGJhY2ssIGRlbGF5KSB7XHJcbiAgICB2YXIgbGVhZGluZ0NhbGwgPSBmYWxzZSwgdHJhaWxpbmdDYWxsID0gZmFsc2UsIGxhc3RDYWxsVGltZSA9IDA7XHJcbiAgICAvKipcclxuICAgICAqIEludm9rZXMgdGhlIG9yaWdpbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIGFuZCBzY2hlZHVsZXMgbmV3IGludm9jYXRpb24gaWZcclxuICAgICAqIHRoZSBcInByb3h5XCIgd2FzIGNhbGxlZCBkdXJpbmcgY3VycmVudCByZXF1ZXN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiByZXNvbHZlUGVuZGluZygpIHtcclxuICAgICAgICBpZiAobGVhZGluZ0NhbGwpIHtcclxuICAgICAgICAgICAgbGVhZGluZ0NhbGwgPSBmYWxzZTtcclxuICAgICAgICAgICAgY2FsbGJhY2soKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRyYWlsaW5nQ2FsbCkge1xyXG4gICAgICAgICAgICBwcm94eSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGJhY2sgaW52b2tlZCBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5LiBJdCB3aWxsIGZ1cnRoZXIgcG9zdHBvbmVcclxuICAgICAqIGludm9jYXRpb24gb2YgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIGRlbGVnYXRpbmcgaXQgdG8gdGhlXHJcbiAgICAgKiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIHRpbWVvdXRDYWxsYmFjaygpIHtcclxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUkMShyZXNvbHZlUGVuZGluZyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFNjaGVkdWxlcyBpbnZvY2F0aW9uIG9mIHRoZSBvcmlnaW5hbCBmdW5jdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gcHJveHkoKSB7XHJcbiAgICAgICAgdmFyIHRpbWVTdGFtcCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgaWYgKGxlYWRpbmdDYWxsKSB7XHJcbiAgICAgICAgICAgIC8vIFJlamVjdCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgY2FsbHMuXHJcbiAgICAgICAgICAgIGlmICh0aW1lU3RhbXAgLSBsYXN0Q2FsbFRpbWUgPCB0cmFpbGluZ1RpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBTY2hlZHVsZSBuZXcgY2FsbCB0byBiZSBpbiBpbnZva2VkIHdoZW4gdGhlIHBlbmRpbmcgb25lIGlzIHJlc29sdmVkLlxyXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGltcG9ydGFudCBmb3IgXCJ0cmFuc2l0aW9uc1wiIHdoaWNoIG5ldmVyIGFjdHVhbGx5IHN0YXJ0XHJcbiAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5IHNvIHRoZXJlIGlzIGEgY2hhbmNlIHRoYXQgd2UgbWlnaHQgbWlzcyBvbmUgaWYgY2hhbmdlXHJcbiAgICAgICAgICAgIC8vIGhhcHBlbnMgYW1pZHMgdGhlIHBlbmRpbmcgaW52b2NhdGlvbi5cclxuICAgICAgICAgICAgdHJhaWxpbmdDYWxsID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxlYWRpbmdDYWxsID0gdHJ1ZTtcclxuICAgICAgICAgICAgdHJhaWxpbmdDYWxsID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQodGltZW91dENhbGxiYWNrLCBkZWxheSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxhc3RDYWxsVGltZSA9IHRpbWVTdGFtcDtcclxuICAgIH1cclxuICAgIHJldHVybiBwcm94eTtcclxufVxuXG4vLyBNaW5pbXVtIGRlbGF5IGJlZm9yZSBpbnZva2luZyB0aGUgdXBkYXRlIG9mIG9ic2VydmVycy5cclxudmFyIFJFRlJFU0hfREVMQVkgPSAyMDtcclxuLy8gQSBsaXN0IG9mIHN1YnN0cmluZ3Mgb2YgQ1NTIHByb3BlcnRpZXMgdXNlZCB0byBmaW5kIHRyYW5zaXRpb24gZXZlbnRzIHRoYXRcclxuLy8gbWlnaHQgYWZmZWN0IGRpbWVuc2lvbnMgb2Ygb2JzZXJ2ZWQgZWxlbWVudHMuXHJcbnZhciB0cmFuc2l0aW9uS2V5cyA9IFsndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsICdsZWZ0JywgJ3dpZHRoJywgJ2hlaWdodCcsICdzaXplJywgJ3dlaWdodCddO1xyXG4vLyBDaGVjayBpZiBNdXRhdGlvbk9ic2VydmVyIGlzIGF2YWlsYWJsZS5cclxudmFyIG11dGF0aW9uT2JzZXJ2ZXJTdXBwb3J0ZWQgPSB0eXBlb2YgTXV0YXRpb25PYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCc7XHJcbi8qKlxyXG4gKiBTaW5nbGV0b24gY29udHJvbGxlciBjbGFzcyB3aGljaCBoYW5kbGVzIHVwZGF0ZXMgb2YgUmVzaXplT2JzZXJ2ZXIgaW5zdGFuY2VzLlxyXG4gKi9cclxudmFyIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyKCkge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEluZGljYXRlcyB3aGV0aGVyIERPTSBsaXN0ZW5lcnMgaGF2ZSBiZWVuIGFkZGVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHByaXZhdGUge2Jvb2xlYW59XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jb25uZWN0ZWRfID0gZmFsc2U7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGVsbHMgdGhhdCBjb250cm9sbGVyIGhhcyBzdWJzY3JpYmVkIGZvciBNdXRhdGlvbiBFdmVudHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAcHJpdmF0ZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm11dGF0aW9uRXZlbnRzQWRkZWRfID0gZmFsc2U7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogS2VlcHMgcmVmZXJlbmNlIHRvIHRoZSBpbnN0YW5jZSBvZiBNdXRhdGlvbk9ic2VydmVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHByaXZhdGUge011dGF0aW9uT2JzZXJ2ZXJ9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5tdXRhdGlvbnNPYnNlcnZlcl8gPSBudWxsO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgbGlzdCBvZiBjb25uZWN0ZWQgb2JzZXJ2ZXJzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHByaXZhdGUge0FycmF5PFJlc2l6ZU9ic2VydmVyU1BJPn1cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm9ic2VydmVyc18gPSBbXTtcclxuICAgICAgICB0aGlzLm9uVHJhbnNpdGlvbkVuZF8gPSB0aGlzLm9uVHJhbnNpdGlvbkVuZF8uYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnJlZnJlc2ggPSB0aHJvdHRsZSh0aGlzLnJlZnJlc2guYmluZCh0aGlzKSwgUkVGUkVTSF9ERUxBWSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgb2JzZXJ2ZXIgdG8gb2JzZXJ2ZXJzIGxpc3QuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtSZXNpemVPYnNlcnZlclNQSX0gb2JzZXJ2ZXIgLSBPYnNlcnZlciB0byBiZSBhZGRlZC5cclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICovXHJcbiAgICBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIucHJvdG90eXBlLmFkZE9ic2VydmVyID0gZnVuY3Rpb24gKG9ic2VydmVyKSB7XHJcbiAgICAgICAgaWYgKCF+dGhpcy5vYnNlcnZlcnNfLmluZGV4T2Yob2JzZXJ2ZXIpKSB7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXJzXy5wdXNoKG9ic2VydmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQWRkIGxpc3RlbmVycyBpZiB0aGV5IGhhdmVuJ3QgYmVlbiBhZGRlZCB5ZXQuXHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbm5lY3RlZF8pIHtcclxuICAgICAgICAgICAgdGhpcy5jb25uZWN0XygpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgb2JzZXJ2ZXIgZnJvbSBvYnNlcnZlcnMgbGlzdC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1Jlc2l6ZU9ic2VydmVyU1BJfSBvYnNlcnZlciAtIE9ic2VydmVyIHRvIGJlIHJlbW92ZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLnByb3RvdHlwZS5yZW1vdmVPYnNlcnZlciA9IGZ1bmN0aW9uIChvYnNlcnZlcikge1xyXG4gICAgICAgIHZhciBvYnNlcnZlcnMgPSB0aGlzLm9ic2VydmVyc187XHJcbiAgICAgICAgdmFyIGluZGV4ID0gb2JzZXJ2ZXJzLmluZGV4T2Yob2JzZXJ2ZXIpO1xyXG4gICAgICAgIC8vIFJlbW92ZSBvYnNlcnZlciBpZiBpdCdzIHByZXNlbnQgaW4gcmVnaXN0cnkuXHJcbiAgICAgICAgaWYgKH5pbmRleCkge1xyXG4gICAgICAgICAgICBvYnNlcnZlcnMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUmVtb3ZlIGxpc3RlbmVycyBpZiBjb250cm9sbGVyIGhhcyBubyBjb25uZWN0ZWQgb2JzZXJ2ZXJzLlxyXG4gICAgICAgIGlmICghb2JzZXJ2ZXJzLmxlbmd0aCAmJiB0aGlzLmNvbm5lY3RlZF8pIHtcclxuICAgICAgICAgICAgdGhpcy5kaXNjb25uZWN0XygpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIEludm9rZXMgdGhlIHVwZGF0ZSBvZiBvYnNlcnZlcnMuIEl0IHdpbGwgY29udGludWUgcnVubmluZyB1cGRhdGVzIGluc29mYXJcclxuICAgICAqIGl0IGRldGVjdHMgY2hhbmdlcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLnByb3RvdHlwZS5yZWZyZXNoID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBjaGFuZ2VzRGV0ZWN0ZWQgPSB0aGlzLnVwZGF0ZU9ic2VydmVyc18oKTtcclxuICAgICAgICAvLyBDb250aW51ZSBydW5uaW5nIHVwZGF0ZXMgaWYgY2hhbmdlcyBoYXZlIGJlZW4gZGV0ZWN0ZWQgYXMgdGhlcmUgbWlnaHRcclxuICAgICAgICAvLyBiZSBmdXR1cmUgb25lcyBjYXVzZWQgYnkgQ1NTIHRyYW5zaXRpb25zLlxyXG4gICAgICAgIGlmIChjaGFuZ2VzRGV0ZWN0ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyBldmVyeSBvYnNlcnZlciBmcm9tIG9ic2VydmVycyBsaXN0IGFuZCBub3RpZmllcyB0aGVtIG9mIHF1ZXVlZFxyXG4gICAgICogZW50cmllcy5cclxuICAgICAqXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgXCJ0cnVlXCIgaWYgYW55IG9ic2VydmVyIGhhcyBkZXRlY3RlZCBjaGFuZ2VzIGluXHJcbiAgICAgKiAgICAgIGRpbWVuc2lvbnMgb2YgaXQncyBlbGVtZW50cy5cclxuICAgICAqL1xyXG4gICAgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLnByb3RvdHlwZS51cGRhdGVPYnNlcnZlcnNfID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIC8vIENvbGxlY3Qgb2JzZXJ2ZXJzIHRoYXQgaGF2ZSBhY3RpdmUgb2JzZXJ2YXRpb25zLlxyXG4gICAgICAgIHZhciBhY3RpdmVPYnNlcnZlcnMgPSB0aGlzLm9ic2VydmVyc18uZmlsdGVyKGZ1bmN0aW9uIChvYnNlcnZlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuZ2F0aGVyQWN0aXZlKCksIG9ic2VydmVyLmhhc0FjdGl2ZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIERlbGl2ZXIgbm90aWZpY2F0aW9ucyBpbiBhIHNlcGFyYXRlIGN5Y2xlIGluIG9yZGVyIHRvIGF2b2lkIGFueVxyXG4gICAgICAgIC8vIGNvbGxpc2lvbnMgYmV0d2VlbiBvYnNlcnZlcnMsIGUuZy4gd2hlbiBtdWx0aXBsZSBpbnN0YW5jZXMgb2ZcclxuICAgICAgICAvLyBSZXNpemVPYnNlcnZlciBhcmUgdHJhY2tpbmcgdGhlIHNhbWUgZWxlbWVudCBhbmQgdGhlIGNhbGxiYWNrIG9mIG9uZVxyXG4gICAgICAgIC8vIG9mIHRoZW0gY2hhbmdlcyBjb250ZW50IGRpbWVuc2lvbnMgb2YgdGhlIG9ic2VydmVkIHRhcmdldC4gU29tZXRpbWVzXHJcbiAgICAgICAgLy8gdGhpcyBtYXkgcmVzdWx0IGluIG5vdGlmaWNhdGlvbnMgYmVpbmcgYmxvY2tlZCBmb3IgdGhlIHJlc3Qgb2Ygb2JzZXJ2ZXJzLlxyXG4gICAgICAgIGFjdGl2ZU9ic2VydmVycy5mb3JFYWNoKGZ1bmN0aW9uIChvYnNlcnZlcikgeyByZXR1cm4gb2JzZXJ2ZXIuYnJvYWRjYXN0QWN0aXZlKCk7IH0pO1xyXG4gICAgICAgIHJldHVybiBhY3RpdmVPYnNlcnZlcnMubGVuZ3RoID4gMDtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemVzIERPTSBsaXN0ZW5lcnMuXHJcbiAgICAgKlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICovXHJcbiAgICBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIucHJvdG90eXBlLmNvbm5lY3RfID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIC8vIERvIG5vdGhpbmcgaWYgcnVubmluZyBpbiBhIG5vbi1icm93c2VyIGVudmlyb25tZW50IG9yIGlmIGxpc3RlbmVyc1xyXG4gICAgICAgIC8vIGhhdmUgYmVlbiBhbHJlYWR5IGFkZGVkLlxyXG4gICAgICAgIGlmICghaXNCcm93c2VyIHx8IHRoaXMuY29ubmVjdGVkXykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFN1YnNjcmlwdGlvbiB0byB0aGUgXCJUcmFuc2l0aW9uZW5kXCIgZXZlbnQgaXMgdXNlZCBhcyBhIHdvcmthcm91bmQgZm9yXHJcbiAgICAgICAgLy8gZGVsYXllZCB0cmFuc2l0aW9ucy4gVGhpcyB3YXkgaXQncyBwb3NzaWJsZSB0byBjYXB0dXJlIGF0IGxlYXN0IHRoZVxyXG4gICAgICAgIC8vIGZpbmFsIHN0YXRlIG9mIGFuIGVsZW1lbnQuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIHRoaXMub25UcmFuc2l0aW9uRW5kXyk7XHJcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMucmVmcmVzaCk7XHJcbiAgICAgICAgaWYgKG11dGF0aW9uT2JzZXJ2ZXJTdXBwb3J0ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tdXRhdGlvbnNPYnNlcnZlcl8gPSBuZXcgTXV0YXRpb25PYnNlcnZlcih0aGlzLnJlZnJlc2gpO1xyXG4gICAgICAgICAgICB0aGlzLm11dGF0aW9uc09ic2VydmVyXy5vYnNlcnZlKGRvY3VtZW50LCB7XHJcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHN1YnRyZWU6IHRydWVcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01TdWJ0cmVlTW9kaWZpZWQnLCB0aGlzLnJlZnJlc2gpO1xyXG4gICAgICAgICAgICB0aGlzLm11dGF0aW9uRXZlbnRzQWRkZWRfID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jb25uZWN0ZWRfID0gdHJ1ZTtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgRE9NIGxpc3RlbmVycy5cclxuICAgICAqXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5wcm90b3R5cGUuZGlzY29ubmVjdF8gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gRG8gbm90aGluZyBpZiBydW5uaW5nIGluIGEgbm9uLWJyb3dzZXIgZW52aXJvbm1lbnQgb3IgaWYgbGlzdGVuZXJzXHJcbiAgICAgICAgLy8gaGF2ZSBiZWVuIGFscmVhZHkgcmVtb3ZlZC5cclxuICAgICAgICBpZiAoIWlzQnJvd3NlciB8fCAhdGhpcy5jb25uZWN0ZWRfKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIHRoaXMub25UcmFuc2l0aW9uRW5kXyk7XHJcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMucmVmcmVzaCk7XHJcbiAgICAgICAgaWYgKHRoaXMubXV0YXRpb25zT2JzZXJ2ZXJfKSB7XHJcbiAgICAgICAgICAgIHRoaXMubXV0YXRpb25zT2JzZXJ2ZXJfLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMubXV0YXRpb25FdmVudHNBZGRlZF8pIHtcclxuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignRE9NU3VidHJlZU1vZGlmaWVkJywgdGhpcy5yZWZyZXNoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5tdXRhdGlvbnNPYnNlcnZlcl8gPSBudWxsO1xyXG4gICAgICAgIHRoaXMubXV0YXRpb25FdmVudHNBZGRlZF8gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNvbm5lY3RlZF8gPSBmYWxzZTtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIFwiVHJhbnNpdGlvbmVuZFwiIGV2ZW50IGhhbmRsZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBwYXJhbSB7VHJhbnNpdGlvbkV2ZW50fSBldmVudFxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5wcm90b3R5cGUub25UcmFuc2l0aW9uRW5kXyA9IGZ1bmN0aW9uIChfYSkge1xyXG4gICAgICAgIHZhciBfYiA9IF9hLnByb3BlcnR5TmFtZSwgcHJvcGVydHlOYW1lID0gX2IgPT09IHZvaWQgMCA/ICcnIDogX2I7XHJcbiAgICAgICAgLy8gRGV0ZWN0IHdoZXRoZXIgdHJhbnNpdGlvbiBtYXkgYWZmZWN0IGRpbWVuc2lvbnMgb2YgYW4gZWxlbWVudC5cclxuICAgICAgICB2YXIgaXNSZWZsb3dQcm9wZXJ0eSA9IHRyYW5zaXRpb25LZXlzLnNvbWUoZnVuY3Rpb24gKGtleSkge1xyXG4gICAgICAgICAgICByZXR1cm4gISF+cHJvcGVydHlOYW1lLmluZGV4T2Yoa2V5KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoaXNSZWZsb3dQcm9wZXJ0eSkge1xyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGluc3RhbmNlIG9mIHRoZSBSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge1Jlc2l6ZU9ic2VydmVyQ29udHJvbGxlcn1cclxuICAgICAqL1xyXG4gICAgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyLmdldEluc3RhbmNlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pbnN0YW5jZV8pIHtcclxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZV8gPSBuZXcgUmVzaXplT2JzZXJ2ZXJDb250cm9sbGVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlXztcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIEhvbGRzIHJlZmVyZW5jZSB0byB0aGUgY29udHJvbGxlcidzIGluc3RhbmNlLlxyXG4gICAgICpcclxuICAgICAqIEBwcml2YXRlIHtSZXNpemVPYnNlcnZlckNvbnRyb2xsZXJ9XHJcbiAgICAgKi9cclxuICAgIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5pbnN0YW5jZV8gPSBudWxsO1xyXG4gICAgcmV0dXJuIFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlcjtcclxufSgpKTtcblxuLyoqXHJcbiAqIERlZmluZXMgbm9uLXdyaXRhYmxlL2VudW1lcmFibGUgcHJvcGVydGllcyBvZiB0aGUgcHJvdmlkZWQgdGFyZ2V0IG9iamVjdC5cclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IHRhcmdldCAtIE9iamVjdCBmb3Igd2hpY2ggdG8gZGVmaW5lIHByb3BlcnRpZXMuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyAtIFByb3BlcnRpZXMgdG8gYmUgZGVmaW5lZC5cclxuICogQHJldHVybnMge09iamVjdH0gVGFyZ2V0IG9iamVjdC5cclxuICovXHJcbnZhciBkZWZpbmVDb25maWd1cmFibGUgPSAoZnVuY3Rpb24gKHRhcmdldCwgcHJvcHMpIHtcclxuICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBPYmplY3Qua2V5cyhwcm9wcyk7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgdmFyIGtleSA9IF9hW19pXTtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHtcclxuICAgICAgICAgICAgdmFsdWU6IHByb3BzW2tleV0sXHJcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRhcmdldDtcclxufSk7XG5cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBnbG9iYWwgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBwcm92aWRlZCBlbGVtZW50LlxyXG4gKlxyXG4gKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0XHJcbiAqIEByZXR1cm5zIHtPYmplY3R9XHJcbiAqL1xyXG52YXIgZ2V0V2luZG93T2YgPSAoZnVuY3Rpb24gKHRhcmdldCkge1xyXG4gICAgLy8gQXNzdW1lIHRoYXQgdGhlIGVsZW1lbnQgaXMgYW4gaW5zdGFuY2Ugb2YgTm9kZSwgd2hpY2ggbWVhbnMgdGhhdCBpdFxyXG4gICAgLy8gaGFzIHRoZSBcIm93bmVyRG9jdW1lbnRcIiBwcm9wZXJ0eSBmcm9tIHdoaWNoIHdlIGNhbiByZXRyaWV2ZSBhXHJcbiAgICAvLyBjb3JyZXNwb25kaW5nIGdsb2JhbCBvYmplY3QuXHJcbiAgICB2YXIgb3duZXJHbG9iYWwgPSB0YXJnZXQgJiYgdGFyZ2V0Lm93bmVyRG9jdW1lbnQgJiYgdGFyZ2V0Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7XHJcbiAgICAvLyBSZXR1cm4gdGhlIGxvY2FsIGdsb2JhbCBvYmplY3QgaWYgaXQncyBub3QgcG9zc2libGUgZXh0cmFjdCBvbmUgZnJvbVxyXG4gICAgLy8gcHJvdmlkZWQgZWxlbWVudC5cclxuICAgIHJldHVybiBvd25lckdsb2JhbCB8fCBnbG9iYWwkMTtcclxufSk7XG5cbi8vIFBsYWNlaG9sZGVyIG9mIGFuIGVtcHR5IGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG52YXIgZW1wdHlSZWN0ID0gY3JlYXRlUmVjdEluaXQoMCwgMCwgMCwgMCk7XHJcbi8qKlxyXG4gKiBDb252ZXJ0cyBwcm92aWRlZCBzdHJpbmcgdG8gYSBudW1iZXIuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gdmFsdWVcclxuICogQHJldHVybnMge251bWJlcn1cclxuICovXHJcbmZ1bmN0aW9uIHRvRmxvYXQodmFsdWUpIHtcclxuICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKSB8fCAwO1xyXG59XHJcbi8qKlxyXG4gKiBFeHRyYWN0cyBib3JkZXJzIHNpemUgZnJvbSBwcm92aWRlZCBzdHlsZXMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7Q1NTU3R5bGVEZWNsYXJhdGlvbn0gc3R5bGVzXHJcbiAqIEBwYXJhbSB7Li4uc3RyaW5nfSBwb3NpdGlvbnMgLSBCb3JkZXJzIHBvc2l0aW9ucyAodG9wLCByaWdodCwgLi4uKVxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0Qm9yZGVyc1NpemUoc3R5bGVzKSB7XHJcbiAgICB2YXIgcG9zaXRpb25zID0gW107XHJcbiAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgIHBvc2l0aW9uc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcclxuICAgIH1cclxuICAgIHJldHVybiBwb3NpdGlvbnMucmVkdWNlKGZ1bmN0aW9uIChzaXplLCBwb3NpdGlvbikge1xyXG4gICAgICAgIHZhciB2YWx1ZSA9IHN0eWxlc1snYm9yZGVyLScgKyBwb3NpdGlvbiArICctd2lkdGgnXTtcclxuICAgICAgICByZXR1cm4gc2l6ZSArIHRvRmxvYXQodmFsdWUpO1xyXG4gICAgfSwgMCk7XHJcbn1cclxuLyoqXHJcbiAqIEV4dHJhY3RzIHBhZGRpbmdzIHNpemVzIGZyb20gcHJvdmlkZWQgc3R5bGVzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0NTU1N0eWxlRGVjbGFyYXRpb259IHN0eWxlc1xyXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBQYWRkaW5ncyBib3guXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRQYWRkaW5ncyhzdHlsZXMpIHtcclxuICAgIHZhciBwb3NpdGlvbnMgPSBbJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCddO1xyXG4gICAgdmFyIHBhZGRpbmdzID0ge307XHJcbiAgICBmb3IgKHZhciBfaSA9IDAsIHBvc2l0aW9uc18xID0gcG9zaXRpb25zOyBfaSA8IHBvc2l0aW9uc18xLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgIHZhciBwb3NpdGlvbiA9IHBvc2l0aW9uc18xW19pXTtcclxuICAgICAgICB2YXIgdmFsdWUgPSBzdHlsZXNbJ3BhZGRpbmctJyArIHBvc2l0aW9uXTtcclxuICAgICAgICBwYWRkaW5nc1twb3NpdGlvbl0gPSB0b0Zsb2F0KHZhbHVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYWRkaW5ncztcclxufVxyXG4vKipcclxuICogQ2FsY3VsYXRlcyBjb250ZW50IHJlY3RhbmdsZSBvZiBwcm92aWRlZCBTVkcgZWxlbWVudC5cclxuICpcclxuICogQHBhcmFtIHtTVkdHcmFwaGljc0VsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgY29udGVudCByZWN0YW5nbGUgb2Ygd2hpY2ggbmVlZHNcclxuICogICAgICB0byBiZSBjYWxjdWxhdGVkLlxyXG4gKiBAcmV0dXJucyB7RE9NUmVjdEluaXR9XHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRTVkdDb250ZW50UmVjdCh0YXJnZXQpIHtcclxuICAgIHZhciBiYm94ID0gdGFyZ2V0LmdldEJCb3goKTtcclxuICAgIHJldHVybiBjcmVhdGVSZWN0SW5pdCgwLCAwLCBiYm94LndpZHRoLCBiYm94LmhlaWdodCk7XHJcbn1cclxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgY29udGVudCByZWN0YW5nbGUgb2YgcHJvdmlkZWQgSFRNTEVsZW1lbnQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgZm9yIHdoaWNoIHRvIGNhbGN1bGF0ZSB0aGUgY29udGVudCByZWN0YW5nbGUuXHJcbiAqIEByZXR1cm5zIHtET01SZWN0SW5pdH1cclxuICovXHJcbmZ1bmN0aW9uIGdldEhUTUxFbGVtZW50Q29udGVudFJlY3QodGFyZ2V0KSB7XHJcbiAgICAvLyBDbGllbnQgd2lkdGggJiBoZWlnaHQgcHJvcGVydGllcyBjYW4ndCBiZVxyXG4gICAgLy8gdXNlZCBleGNsdXNpdmVseSBhcyB0aGV5IHByb3ZpZGUgcm91bmRlZCB2YWx1ZXMuXHJcbiAgICB2YXIgY2xpZW50V2lkdGggPSB0YXJnZXQuY2xpZW50V2lkdGgsIGNsaWVudEhlaWdodCA9IHRhcmdldC5jbGllbnRIZWlnaHQ7XHJcbiAgICAvLyBCeSB0aGlzIGNvbmRpdGlvbiB3ZSBjYW4gY2F0Y2ggYWxsIG5vbi1yZXBsYWNlZCBpbmxpbmUsIGhpZGRlbiBhbmRcclxuICAgIC8vIGRldGFjaGVkIGVsZW1lbnRzLiBUaG91Z2ggZWxlbWVudHMgd2l0aCB3aWR0aCAmIGhlaWdodCBwcm9wZXJ0aWVzIGxlc3NcclxuICAgIC8vIHRoYW4gMC41IHdpbGwgYmUgZGlzY2FyZGVkIGFzIHdlbGwuXHJcbiAgICAvL1xyXG4gICAgLy8gV2l0aG91dCBpdCB3ZSB3b3VsZCBuZWVkIHRvIGltcGxlbWVudCBzZXBhcmF0ZSBtZXRob2RzIGZvciBlYWNoIG9mXHJcbiAgICAvLyB0aG9zZSBjYXNlcyBhbmQgaXQncyBub3QgcG9zc2libGUgdG8gcGVyZm9ybSBhIHByZWNpc2UgYW5kIHBlcmZvcm1hbmNlXHJcbiAgICAvLyBlZmZlY3RpdmUgdGVzdCBmb3IgaGlkZGVuIGVsZW1lbnRzLiBFLmcuIGV2ZW4galF1ZXJ5J3MgJzp2aXNpYmxlJyBmaWx0ZXJcclxuICAgIC8vIGdpdmVzIHdyb25nIHJlc3VsdHMgZm9yIGVsZW1lbnRzIHdpdGggd2lkdGggJiBoZWlnaHQgbGVzcyB0aGFuIDAuNS5cclxuICAgIGlmICghY2xpZW50V2lkdGggJiYgIWNsaWVudEhlaWdodCkge1xyXG4gICAgICAgIHJldHVybiBlbXB0eVJlY3Q7XHJcbiAgICB9XHJcbiAgICB2YXIgc3R5bGVzID0gZ2V0V2luZG93T2YodGFyZ2V0KS5nZXRDb21wdXRlZFN0eWxlKHRhcmdldCk7XHJcbiAgICB2YXIgcGFkZGluZ3MgPSBnZXRQYWRkaW5ncyhzdHlsZXMpO1xyXG4gICAgdmFyIGhvcml6UGFkID0gcGFkZGluZ3MubGVmdCArIHBhZGRpbmdzLnJpZ2h0O1xyXG4gICAgdmFyIHZlcnRQYWQgPSBwYWRkaW5ncy50b3AgKyBwYWRkaW5ncy5ib3R0b207XHJcbiAgICAvLyBDb21wdXRlZCBzdHlsZXMgb2Ygd2lkdGggJiBoZWlnaHQgYXJlIGJlaW5nIHVzZWQgYmVjYXVzZSB0aGV5IGFyZSB0aGVcclxuICAgIC8vIG9ubHkgZGltZW5zaW9ucyBhdmFpbGFibGUgdG8gSlMgdGhhdCBjb250YWluIG5vbi1yb3VuZGVkIHZhbHVlcy4gSXQgY291bGRcclxuICAgIC8vIGJlIHBvc3NpYmxlIHRvIHV0aWxpemUgdGhlIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBpZiBvbmx5IGl0J3MgZGF0YSB3YXNuJ3RcclxuICAgIC8vIGFmZmVjdGVkIGJ5IENTUyB0cmFuc2Zvcm1hdGlvbnMgbGV0IGFsb25lIHBhZGRpbmdzLCBib3JkZXJzIGFuZCBzY3JvbGwgYmFycy5cclxuICAgIHZhciB3aWR0aCA9IHRvRmxvYXQoc3R5bGVzLndpZHRoKSwgaGVpZ2h0ID0gdG9GbG9hdChzdHlsZXMuaGVpZ2h0KTtcclxuICAgIC8vIFdpZHRoICYgaGVpZ2h0IGluY2x1ZGUgcGFkZGluZ3MgYW5kIGJvcmRlcnMgd2hlbiB0aGUgJ2JvcmRlci1ib3gnIGJveFxyXG4gICAgLy8gbW9kZWwgaXMgYXBwbGllZCAoZXhjZXB0IGZvciBJRSkuXHJcbiAgICBpZiAoc3R5bGVzLmJveFNpemluZyA9PT0gJ2JvcmRlci1ib3gnKSB7XHJcbiAgICAgICAgLy8gRm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIHJlcXVpcmVkIHRvIGhhbmRsZSBJbnRlcm5ldCBFeHBsb3JlciB3aGljaFxyXG4gICAgICAgIC8vIGRvZXNuJ3QgaW5jbHVkZSBwYWRkaW5ncyBhbmQgYm9yZGVycyB0byBjb21wdXRlZCBDU1MgZGltZW5zaW9ucy5cclxuICAgICAgICAvL1xyXG4gICAgICAgIC8vIFdlIGNhbiBzYXkgdGhhdCBpZiBDU1MgZGltZW5zaW9ucyArIHBhZGRpbmdzIGFyZSBlcXVhbCB0byB0aGUgXCJjbGllbnRcIlxyXG4gICAgICAgIC8vIHByb3BlcnRpZXMgdGhlbiBpdCdzIGVpdGhlciBJRSwgYW5kIHRodXMgd2UgZG9uJ3QgbmVlZCB0byBzdWJ0cmFjdFxyXG4gICAgICAgIC8vIGFueXRoaW5nLCBvciBhbiBlbGVtZW50IG1lcmVseSBkb2Vzbid0IGhhdmUgcGFkZGluZ3MvYm9yZGVycyBzdHlsZXMuXHJcbiAgICAgICAgaWYgKE1hdGgucm91bmQod2lkdGggKyBob3JpelBhZCkgIT09IGNsaWVudFdpZHRoKSB7XHJcbiAgICAgICAgICAgIHdpZHRoIC09IGdldEJvcmRlcnNTaXplKHN0eWxlcywgJ2xlZnQnLCAncmlnaHQnKSArIGhvcml6UGFkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoTWF0aC5yb3VuZChoZWlnaHQgKyB2ZXJ0UGFkKSAhPT0gY2xpZW50SGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIGhlaWdodCAtPSBnZXRCb3JkZXJzU2l6ZShzdHlsZXMsICd0b3AnLCAnYm90dG9tJykgKyB2ZXJ0UGFkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIEZvbGxvd2luZyBzdGVwcyBjYW4ndCBiZSBhcHBsaWVkIHRvIHRoZSBkb2N1bWVudCdzIHJvb3QgZWxlbWVudCBhcyBpdHNcclxuICAgIC8vIGNsaWVudFtXaWR0aC9IZWlnaHRdIHByb3BlcnRpZXMgcmVwcmVzZW50IHZpZXdwb3J0IGFyZWEgb2YgdGhlIHdpbmRvdy5cclxuICAgIC8vIEJlc2lkZXMsIGl0J3MgYXMgd2VsbCBub3QgbmVjZXNzYXJ5IGFzIHRoZSA8aHRtbD4gaXRzZWxmIG5laXRoZXIgaGFzXHJcbiAgICAvLyByZW5kZXJlZCBzY3JvbGwgYmFycyBub3IgaXQgY2FuIGJlIGNsaXBwZWQuXHJcbiAgICBpZiAoIWlzRG9jdW1lbnRFbGVtZW50KHRhcmdldCkpIHtcclxuICAgICAgICAvLyBJbiBzb21lIGJyb3dzZXJzIChvbmx5IGluIEZpcmVmb3gsIGFjdHVhbGx5KSBDU1Mgd2lkdGggJiBoZWlnaHRcclxuICAgICAgICAvLyBpbmNsdWRlIHNjcm9sbCBiYXJzIHNpemUgd2hpY2ggY2FuIGJlIHJlbW92ZWQgYXQgdGhpcyBzdGVwIGFzIHNjcm9sbFxyXG4gICAgICAgIC8vIGJhcnMgYXJlIHRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiByb3VuZGVkIGRpbWVuc2lvbnMgKyBwYWRkaW5nc1xyXG4gICAgICAgIC8vIGFuZCBcImNsaWVudFwiIHByb3BlcnRpZXMsIHRob3VnaCB0aGF0IGlzIG5vdCBhbHdheXMgdHJ1ZSBpbiBDaHJvbWUuXHJcbiAgICAgICAgdmFyIHZlcnRTY3JvbGxiYXIgPSBNYXRoLnJvdW5kKHdpZHRoICsgaG9yaXpQYWQpIC0gY2xpZW50V2lkdGg7XHJcbiAgICAgICAgdmFyIGhvcml6U2Nyb2xsYmFyID0gTWF0aC5yb3VuZChoZWlnaHQgKyB2ZXJ0UGFkKSAtIGNsaWVudEhlaWdodDtcclxuICAgICAgICAvLyBDaHJvbWUgaGFzIGEgcmF0aGVyIHdlaXJkIHJvdW5kaW5nIG9mIFwiY2xpZW50XCIgcHJvcGVydGllcy5cclxuICAgICAgICAvLyBFLmcuIGZvciBhbiBlbGVtZW50IHdpdGggY29udGVudCB3aWR0aCBvZiAzMTQuMnB4IGl0IHNvbWV0aW1lcyBnaXZlc1xyXG4gICAgICAgIC8vIHRoZSBjbGllbnQgd2lkdGggb2YgMzE1cHggYW5kIGZvciB0aGUgd2lkdGggb2YgMzE0LjdweCBpdCBtYXkgZ2l2ZVxyXG4gICAgICAgIC8vIDMxNHB4LiBBbmQgaXQgZG9lc24ndCBoYXBwZW4gYWxsIHRoZSB0aW1lLiBTbyBqdXN0IGlnbm9yZSB0aGlzIGRlbHRhXHJcbiAgICAgICAgLy8gYXMgYSBub24tcmVsZXZhbnQuXHJcbiAgICAgICAgaWYgKE1hdGguYWJzKHZlcnRTY3JvbGxiYXIpICE9PSAxKSB7XHJcbiAgICAgICAgICAgIHdpZHRoIC09IHZlcnRTY3JvbGxiYXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChNYXRoLmFicyhob3JpelNjcm9sbGJhcikgIT09IDEpIHtcclxuICAgICAgICAgICAgaGVpZ2h0IC09IGhvcml6U2Nyb2xsYmFyO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjcmVhdGVSZWN0SW5pdChwYWRkaW5ncy5sZWZ0LCBwYWRkaW5ncy50b3AsIHdpZHRoLCBoZWlnaHQpO1xyXG59XHJcbi8qKlxyXG4gKiBDaGVja3Mgd2hldGhlciBwcm92aWRlZCBlbGVtZW50IGlzIGFuIGluc3RhbmNlIG9mIHRoZSBTVkdHcmFwaGljc0VsZW1lbnQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0IC0gRWxlbWVudCB0byBiZSBjaGVja2VkLlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbnZhciBpc1NWR0dyYXBoaWNzRWxlbWVudCA9IChmdW5jdGlvbiAoKSB7XHJcbiAgICAvLyBTb21lIGJyb3dzZXJzLCBuYW1lbHkgSUUgYW5kIEVkZ2UsIGRvbid0IGhhdmUgdGhlIFNWR0dyYXBoaWNzRWxlbWVudFxyXG4gICAgLy8gaW50ZXJmYWNlLlxyXG4gICAgaWYgKHR5cGVvZiBTVkdHcmFwaGljc0VsZW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQpIHsgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIGdldFdpbmRvd09mKHRhcmdldCkuU1ZHR3JhcGhpY3NFbGVtZW50OyB9O1xyXG4gICAgfVxyXG4gICAgLy8gSWYgaXQncyBzbywgdGhlbiBjaGVjayB0aGF0IGVsZW1lbnQgaXMgYXQgbGVhc3QgYW4gaW5zdGFuY2Ugb2YgdGhlXHJcbiAgICAvLyBTVkdFbGVtZW50IGFuZCB0aGF0IGl0IGhhcyB0aGUgXCJnZXRCQm94XCIgbWV0aG9kLlxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4dHJhLXBhcmVuc1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQpIHsgcmV0dXJuICh0YXJnZXQgaW5zdGFuY2VvZiBnZXRXaW5kb3dPZih0YXJnZXQpLlNWR0VsZW1lbnQgJiZcclxuICAgICAgICB0eXBlb2YgdGFyZ2V0LmdldEJCb3ggPT09ICdmdW5jdGlvbicpOyB9O1xyXG59KSgpO1xyXG4vKipcclxuICogQ2hlY2tzIHdoZXRoZXIgcHJvdmlkZWQgZWxlbWVudCBpcyBhIGRvY3VtZW50IGVsZW1lbnQgKDxodG1sPikuXHJcbiAqXHJcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0IC0gRWxlbWVudCB0byBiZSBjaGVja2VkLlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbmZ1bmN0aW9uIGlzRG9jdW1lbnRFbGVtZW50KHRhcmdldCkge1xyXG4gICAgcmV0dXJuIHRhcmdldCA9PT0gZ2V0V2luZG93T2YodGFyZ2V0KS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XHJcbn1cclxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgYW4gYXBwcm9wcmlhdGUgY29udGVudCByZWN0YW5nbGUgZm9yIHByb3ZpZGVkIGh0bWwgb3Igc3ZnIGVsZW1lbnQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0IC0gRWxlbWVudCBjb250ZW50IHJlY3RhbmdsZSBvZiB3aGljaCBuZWVkcyB0byBiZSBjYWxjdWxhdGVkLlxyXG4gKiBAcmV0dXJucyB7RE9NUmVjdEluaXR9XHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRDb250ZW50UmVjdCh0YXJnZXQpIHtcclxuICAgIGlmICghaXNCcm93c2VyKSB7XHJcbiAgICAgICAgcmV0dXJuIGVtcHR5UmVjdDtcclxuICAgIH1cclxuICAgIGlmIChpc1NWR0dyYXBoaWNzRWxlbWVudCh0YXJnZXQpKSB7XHJcbiAgICAgICAgcmV0dXJuIGdldFNWR0NvbnRlbnRSZWN0KHRhcmdldCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ2V0SFRNTEVsZW1lbnRDb250ZW50UmVjdCh0YXJnZXQpO1xyXG59XHJcbi8qKlxyXG4gKiBDcmVhdGVzIHJlY3RhbmdsZSB3aXRoIGFuIGludGVyZmFjZSBvZiB0aGUgRE9NUmVjdFJlYWRPbmx5LlxyXG4gKiBTcGVjOiBodHRwczovL2RyYWZ0cy5meHRmLm9yZy9nZW9tZXRyeS8jZG9tcmVjdHJlYWRvbmx5XHJcbiAqXHJcbiAqIEBwYXJhbSB7RE9NUmVjdEluaXR9IHJlY3RJbml0IC0gT2JqZWN0IHdpdGggcmVjdGFuZ2xlJ3MgeC95IGNvb3JkaW5hdGVzIGFuZCBkaW1lbnNpb25zLlxyXG4gKiBAcmV0dXJucyB7RE9NUmVjdFJlYWRPbmx5fVxyXG4gKi9cclxuZnVuY3Rpb24gY3JlYXRlUmVhZE9ubHlSZWN0KF9hKSB7XHJcbiAgICB2YXIgeCA9IF9hLngsIHkgPSBfYS55LCB3aWR0aCA9IF9hLndpZHRoLCBoZWlnaHQgPSBfYS5oZWlnaHQ7XHJcbiAgICAvLyBJZiBET01SZWN0UmVhZE9ubHkgaXMgYXZhaWxhYmxlIHVzZSBpdCBhcyBhIHByb3RvdHlwZSBmb3IgdGhlIHJlY3RhbmdsZS5cclxuICAgIHZhciBDb25zdHIgPSB0eXBlb2YgRE9NUmVjdFJlYWRPbmx5ICE9PSAndW5kZWZpbmVkJyA/IERPTVJlY3RSZWFkT25seSA6IE9iamVjdDtcclxuICAgIHZhciByZWN0ID0gT2JqZWN0LmNyZWF0ZShDb25zdHIucHJvdG90eXBlKTtcclxuICAgIC8vIFJlY3RhbmdsZSdzIHByb3BlcnRpZXMgYXJlIG5vdCB3cml0YWJsZSBhbmQgbm9uLWVudW1lcmFibGUuXHJcbiAgICBkZWZpbmVDb25maWd1cmFibGUocmVjdCwge1xyXG4gICAgICAgIHg6IHgsIHk6IHksIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQsXHJcbiAgICAgICAgdG9wOiB5LFxyXG4gICAgICAgIHJpZ2h0OiB4ICsgd2lkdGgsXHJcbiAgICAgICAgYm90dG9tOiBoZWlnaHQgKyB5LFxyXG4gICAgICAgIGxlZnQ6IHhcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJlY3Q7XHJcbn1cclxuLyoqXHJcbiAqIENyZWF0ZXMgRE9NUmVjdEluaXQgb2JqZWN0IGJhc2VkIG9uIHRoZSBwcm92aWRlZCBkaW1lbnNpb25zIGFuZCB0aGUgeC95IGNvb3JkaW5hdGVzLlxyXG4gKiBTcGVjOiBodHRwczovL2RyYWZ0cy5meHRmLm9yZy9nZW9tZXRyeS8jZGljdGRlZi1kb21yZWN0aW5pdFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFggY29vcmRpbmF0ZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBZIGNvb3JkaW5hdGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFJlY3RhbmdsZSdzIHdpZHRoLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gUmVjdGFuZ2xlJ3MgaGVpZ2h0LlxyXG4gKiBAcmV0dXJucyB7RE9NUmVjdEluaXR9XHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVSZWN0SW5pdCh4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XHJcbiAgICByZXR1cm4geyB4OiB4LCB5OiB5LCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07XHJcbn1cblxuLyoqXHJcbiAqIENsYXNzIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIGNvbXB1dGF0aW9ucyBvZiB0aGUgY29udGVudCByZWN0YW5nbGUgb2ZcclxuICogcHJvdmlkZWQgRE9NIGVsZW1lbnQgYW5kIGZvciBrZWVwaW5nIHRyYWNrIG9mIGl0J3MgY2hhbmdlcy5cclxuICovXHJcbnZhciBSZXNpemVPYnNlcnZhdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBSZXNpemVPYnNlcnZhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgdG8gYmUgb2JzZXJ2ZWQuXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIFJlc2l6ZU9ic2VydmF0aW9uKHRhcmdldCkge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEJyb2FkY2FzdGVkIHdpZHRoIG9mIGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJyb2FkY2FzdFdpZHRoID0gMDtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBCcm9hZGNhc3RlZCBoZWlnaHQgb2YgY29udGVudCByZWN0YW5nbGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYnJvYWRjYXN0SGVpZ2h0ID0gMDtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBSZWZlcmVuY2UgdG8gdGhlIGxhc3Qgb2JzZXJ2ZWQgY29udGVudCByZWN0YW5nbGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAcHJpdmF0ZSB7RE9NUmVjdEluaXR9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jb250ZW50UmVjdF8gPSBjcmVhdGVSZWN0SW5pdCgwLCAwLCAwLCAwKTtcclxuICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyBjb250ZW50IHJlY3RhbmdsZSBhbmQgdGVsbHMgd2hldGhlciBpdCdzIHdpZHRoIG9yIGhlaWdodCBwcm9wZXJ0aWVzXHJcbiAgICAgKiBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgYnJvYWRjYXN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICovXHJcbiAgICBSZXNpemVPYnNlcnZhdGlvbi5wcm90b3R5cGUuaXNBY3RpdmUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHJlY3QgPSBnZXRDb250ZW50UmVjdCh0aGlzLnRhcmdldCk7XHJcbiAgICAgICAgdGhpcy5jb250ZW50UmVjdF8gPSByZWN0O1xyXG4gICAgICAgIHJldHVybiAocmVjdC53aWR0aCAhPT0gdGhpcy5icm9hZGNhc3RXaWR0aCB8fFxyXG4gICAgICAgICAgICByZWN0LmhlaWdodCAhPT0gdGhpcy5icm9hZGNhc3RIZWlnaHQpO1xyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyAnYnJvYWRjYXN0V2lkdGgnIGFuZCAnYnJvYWRjYXN0SGVpZ2h0JyBwcm9wZXJ0aWVzIHdpdGggYSBkYXRhXHJcbiAgICAgKiBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnRpZXMgb2YgdGhlIGxhc3Qgb2JzZXJ2ZWQgY29udGVudCByZWN0YW5nbGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge0RPTVJlY3RJbml0fSBMYXN0IG9ic2VydmVkIGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG4gICAgICovXHJcbiAgICBSZXNpemVPYnNlcnZhdGlvbi5wcm90b3R5cGUuYnJvYWRjYXN0UmVjdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgcmVjdCA9IHRoaXMuY29udGVudFJlY3RfO1xyXG4gICAgICAgIHRoaXMuYnJvYWRjYXN0V2lkdGggPSByZWN0LndpZHRoO1xyXG4gICAgICAgIHRoaXMuYnJvYWRjYXN0SGVpZ2h0ID0gcmVjdC5oZWlnaHQ7XHJcbiAgICAgICAgcmV0dXJuIHJlY3Q7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIFJlc2l6ZU9ic2VydmF0aW9uO1xyXG59KCkpO1xuXG52YXIgUmVzaXplT2JzZXJ2ZXJFbnRyeSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBSZXNpemVPYnNlcnZlckVudHJ5LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0IC0gRWxlbWVudCB0aGF0IGlzIGJlaW5nIG9ic2VydmVkLlxyXG4gICAgICogQHBhcmFtIHtET01SZWN0SW5pdH0gcmVjdEluaXQgLSBEYXRhIG9mIHRoZSBlbGVtZW50J3MgY29udGVudCByZWN0YW5nbGUuXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIFJlc2l6ZU9ic2VydmVyRW50cnkodGFyZ2V0LCByZWN0SW5pdCkge1xyXG4gICAgICAgIHZhciBjb250ZW50UmVjdCA9IGNyZWF0ZVJlYWRPbmx5UmVjdChyZWN0SW5pdCk7XHJcbiAgICAgICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGFyZSBub3Qgd3JpdGFibGVcclxuICAgICAgICAvLyBhbmQgYXJlIGFsc28gbm90IGVudW1lcmFibGUgaW4gdGhlIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbi5cclxuICAgICAgICAvL1xyXG4gICAgICAgIC8vIFByb3BlcnR5IGFjY2Vzc29ycyBhcmUgbm90IGJlaW5nIHVzZWQgYXMgdGhleSdkIHJlcXVpcmUgdG8gZGVmaW5lIGFcclxuICAgICAgICAvLyBwcml2YXRlIFdlYWtNYXAgc3RvcmFnZSB3aGljaCBtYXkgY2F1c2UgbWVtb3J5IGxlYWtzIGluIGJyb3dzZXJzIHRoYXRcclxuICAgICAgICAvLyBkb24ndCBzdXBwb3J0IHRoaXMgdHlwZSBvZiBjb2xsZWN0aW9ucy5cclxuICAgICAgICBkZWZpbmVDb25maWd1cmFibGUodGhpcywgeyB0YXJnZXQ6IHRhcmdldCwgY29udGVudFJlY3Q6IGNvbnRlbnRSZWN0IH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFJlc2l6ZU9ic2VydmVyRW50cnk7XHJcbn0oKSk7XG5cbnZhciBSZXNpemVPYnNlcnZlclNQSSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBSZXNpemVPYnNlcnZlci5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1Jlc2l6ZU9ic2VydmVyQ2FsbGJhY2t9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkXHJcbiAgICAgKiAgICAgIHdoZW4gb25lIG9mIHRoZSBvYnNlcnZlZCBlbGVtZW50cyBjaGFuZ2VzIGl0J3MgY29udGVudCBkaW1lbnNpb25zLlxyXG4gICAgICogQHBhcmFtIHtSZXNpemVPYnNlcnZlckNvbnRyb2xsZXJ9IGNvbnRyb2xsZXIgLSBDb250cm9sbGVyIGluc3RhbmNlIHdoaWNoXHJcbiAgICAgKiAgICAgIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgdXBkYXRlcyBvZiBvYnNlcnZlci5cclxuICAgICAqIEBwYXJhbSB7UmVzaXplT2JzZXJ2ZXJ9IGNhbGxiYWNrQ3R4IC0gUmVmZXJlbmNlIHRvIHRoZSBwdWJsaWNcclxuICAgICAqICAgICAgUmVzaXplT2JzZXJ2ZXIgaW5zdGFuY2Ugd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gY2FsbGJhY2sgZnVuY3Rpb24uXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIFJlc2l6ZU9ic2VydmVyU1BJKGNhbGxiYWNrLCBjb250cm9sbGVyLCBjYWxsYmFja0N0eCkge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIENvbGxlY3Rpb24gb2YgcmVzaXplIG9ic2VydmF0aW9ucyB0aGF0IGhhdmUgZGV0ZWN0ZWQgY2hhbmdlcyBpbiBkaW1lbnNpb25zXHJcbiAgICAgICAgICogb2YgZWxlbWVudHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAcHJpdmF0ZSB7QXJyYXk8UmVzaXplT2JzZXJ2YXRpb24+fVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYWN0aXZlT2JzZXJ2YXRpb25zXyA9IFtdO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFJlZ2lzdHJ5IG9mIHRoZSBSZXNpemVPYnNlcnZhdGlvbiBpbnN0YW5jZXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAcHJpdmF0ZSB7TWFwPEVsZW1lbnQsIFJlc2l6ZU9ic2VydmF0aW9uPn1cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm9ic2VydmF0aW9uc18gPSBuZXcgTWFwU2hpbSgpO1xyXG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGNhbGxiYWNrIHByb3ZpZGVkIGFzIHBhcmFtZXRlciAxIGlzIG5vdCBhIGZ1bmN0aW9uLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNhbGxiYWNrXyA9IGNhbGxiYWNrO1xyXG4gICAgICAgIHRoaXMuY29udHJvbGxlcl8gPSBjb250cm9sbGVyO1xyXG4gICAgICAgIHRoaXMuY2FsbGJhY2tDdHhfID0gY2FsbGJhY2tDdHg7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFN0YXJ0cyBvYnNlcnZpbmcgcHJvdmlkZWQgZWxlbWVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCAtIEVsZW1lbnQgdG8gYmUgb2JzZXJ2ZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgUmVzaXplT2JzZXJ2ZXJTUEkucHJvdG90eXBlLm9ic2VydmUgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XHJcbiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJzEgYXJndW1lbnQgcmVxdWlyZWQsIGJ1dCBvbmx5IDAgcHJlc2VudC4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRG8gbm90aGluZyBpZiBjdXJyZW50IGVudmlyb25tZW50IGRvZXNuJ3QgaGF2ZSB0aGUgRWxlbWVudCBpbnRlcmZhY2UuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBFbGVtZW50ID09PSAndW5kZWZpbmVkJyB8fCAhKEVsZW1lbnQgaW5zdGFuY2VvZiBPYmplY3QpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgZ2V0V2luZG93T2YodGFyZ2V0KS5FbGVtZW50KSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwYXJhbWV0ZXIgMSBpcyBub3Qgb2YgdHlwZSBcIkVsZW1lbnRcIi4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIG9ic2VydmF0aW9ucyA9IHRoaXMub2JzZXJ2YXRpb25zXztcclxuICAgICAgICAvLyBEbyBub3RoaW5nIGlmIGVsZW1lbnQgaXMgYWxyZWFkeSBiZWluZyBvYnNlcnZlZC5cclxuICAgICAgICBpZiAob2JzZXJ2YXRpb25zLmhhcyh0YXJnZXQpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgb2JzZXJ2YXRpb25zLnNldCh0YXJnZXQsIG5ldyBSZXNpemVPYnNlcnZhdGlvbih0YXJnZXQpKTtcclxuICAgICAgICB0aGlzLmNvbnRyb2xsZXJfLmFkZE9ic2VydmVyKHRoaXMpO1xyXG4gICAgICAgIC8vIEZvcmNlIHRoZSB1cGRhdGUgb2Ygb2JzZXJ2YXRpb25zLlxyXG4gICAgICAgIHRoaXMuY29udHJvbGxlcl8ucmVmcmVzaCgpO1xyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogU3RvcHMgb2JzZXJ2aW5nIHByb3ZpZGVkIGVsZW1lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXQgLSBFbGVtZW50IHRvIHN0b3Agb2JzZXJ2aW5nLlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIFJlc2l6ZU9ic2VydmVyU1BJLnByb3RvdHlwZS51bm9ic2VydmUgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XHJcbiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJzEgYXJndW1lbnQgcmVxdWlyZWQsIGJ1dCBvbmx5IDAgcHJlc2VudC4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRG8gbm90aGluZyBpZiBjdXJyZW50IGVudmlyb25tZW50IGRvZXNuJ3QgaGF2ZSB0aGUgRWxlbWVudCBpbnRlcmZhY2UuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBFbGVtZW50ID09PSAndW5kZWZpbmVkJyB8fCAhKEVsZW1lbnQgaW5zdGFuY2VvZiBPYmplY3QpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgZ2V0V2luZG93T2YodGFyZ2V0KS5FbGVtZW50KSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwYXJhbWV0ZXIgMSBpcyBub3Qgb2YgdHlwZSBcIkVsZW1lbnRcIi4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIG9ic2VydmF0aW9ucyA9IHRoaXMub2JzZXJ2YXRpb25zXztcclxuICAgICAgICAvLyBEbyBub3RoaW5nIGlmIGVsZW1lbnQgaXMgbm90IGJlaW5nIG9ic2VydmVkLlxyXG4gICAgICAgIGlmICghb2JzZXJ2YXRpb25zLmhhcyh0YXJnZXQpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgb2JzZXJ2YXRpb25zLmRlbGV0ZSh0YXJnZXQpO1xyXG4gICAgICAgIGlmICghb2JzZXJ2YXRpb25zLnNpemUpIHtcclxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyXy5yZW1vdmVPYnNlcnZlcih0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBTdG9wcyBvYnNlcnZpbmcgYWxsIGVsZW1lbnRzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICovXHJcbiAgICBSZXNpemVPYnNlcnZlclNQSS5wcm90b3R5cGUuZGlzY29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLmNsZWFyQWN0aXZlKCk7XHJcbiAgICAgICAgdGhpcy5vYnNlcnZhdGlvbnNfLmNsZWFyKCk7XHJcbiAgICAgICAgdGhpcy5jb250cm9sbGVyXy5yZW1vdmVPYnNlcnZlcih0aGlzKTtcclxuICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIENvbGxlY3RzIG9ic2VydmF0aW9uIGluc3RhbmNlcyB0aGUgYXNzb2NpYXRlZCBlbGVtZW50IG9mIHdoaWNoIGhhcyBjaGFuZ2VkXHJcbiAgICAgKiBpdCdzIGNvbnRlbnQgcmVjdGFuZ2xlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAgICovXHJcbiAgICBSZXNpemVPYnNlcnZlclNQSS5wcm90b3R5cGUuZ2F0aGVyQWN0aXZlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5jbGVhckFjdGl2ZSgpO1xyXG4gICAgICAgIHRoaXMub2JzZXJ2YXRpb25zXy5mb3JFYWNoKGZ1bmN0aW9uIChvYnNlcnZhdGlvbikge1xyXG4gICAgICAgICAgICBpZiAob2JzZXJ2YXRpb24uaXNBY3RpdmUoKSkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuYWN0aXZlT2JzZXJ2YXRpb25zXy5wdXNoKG9ic2VydmF0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogSW52b2tlcyBpbml0aWFsIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggYSBsaXN0IG9mIFJlc2l6ZU9ic2VydmVyRW50cnlcclxuICAgICAqIGluc3RhbmNlcyBjb2xsZWN0ZWQgZnJvbSBhY3RpdmUgcmVzaXplIG9ic2VydmF0aW9ucy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgUmVzaXplT2JzZXJ2ZXJTUEkucHJvdG90eXBlLmJyb2FkY2FzdEFjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAvLyBEbyBub3RoaW5nIGlmIG9ic2VydmVyIGRvZXNuJ3QgaGF2ZSBhY3RpdmUgb2JzZXJ2YXRpb25zLlxyXG4gICAgICAgIGlmICghdGhpcy5oYXNBY3RpdmUoKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBjdHggPSB0aGlzLmNhbGxiYWNrQ3R4XztcclxuICAgICAgICAvLyBDcmVhdGUgUmVzaXplT2JzZXJ2ZXJFbnRyeSBpbnN0YW5jZSBmb3IgZXZlcnkgYWN0aXZlIG9ic2VydmF0aW9uLlxyXG4gICAgICAgIHZhciBlbnRyaWVzID0gdGhpcy5hY3RpdmVPYnNlcnZhdGlvbnNfLm1hcChmdW5jdGlvbiAob2JzZXJ2YXRpb24pIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNpemVPYnNlcnZlckVudHJ5KG9ic2VydmF0aW9uLnRhcmdldCwgb2JzZXJ2YXRpb24uYnJvYWRjYXN0UmVjdCgpKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmNhbGxiYWNrXy5jYWxsKGN0eCwgZW50cmllcywgY3R4KTtcclxuICAgICAgICB0aGlzLmNsZWFyQWN0aXZlKCk7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgdGhlIGNvbGxlY3Rpb24gb2YgYWN0aXZlIG9ic2VydmF0aW9ucy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgICAqL1xyXG4gICAgUmVzaXplT2JzZXJ2ZXJTUEkucHJvdG90eXBlLmNsZWFyQWN0aXZlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuYWN0aXZlT2JzZXJ2YXRpb25zXy5zcGxpY2UoMCk7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBUZWxscyB3aGV0aGVyIG9ic2VydmVyIGhhcyBhY3RpdmUgb2JzZXJ2YXRpb25zLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICovXHJcbiAgICBSZXNpemVPYnNlcnZlclNQSS5wcm90b3R5cGUuaGFzQWN0aXZlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZU9ic2VydmF0aW9uc18ubGVuZ3RoID4gMDtcclxuICAgIH07XHJcbiAgICByZXR1cm4gUmVzaXplT2JzZXJ2ZXJTUEk7XHJcbn0oKSk7XG5cbi8vIFJlZ2lzdHJ5IG9mIGludGVybmFsIG9ic2VydmVycy4gSWYgV2Vha01hcCBpcyBub3QgYXZhaWxhYmxlIHVzZSBjdXJyZW50IHNoaW1cclxuLy8gZm9yIHRoZSBNYXAgY29sbGVjdGlvbiBhcyBpdCBoYXMgYWxsIHJlcXVpcmVkIG1ldGhvZHMgYW5kIGJlY2F1c2UgV2Vha01hcFxyXG4vLyBjYW4ndCBiZSBmdWxseSBwb2x5ZmlsbGVkIGFueXdheS5cclxudmFyIG9ic2VydmVycyA9IHR5cGVvZiBXZWFrTWFwICE9PSAndW5kZWZpbmVkJyA/IG5ldyBXZWFrTWFwKCkgOiBuZXcgTWFwU2hpbSgpO1xyXG4vKipcclxuICogUmVzaXplT2JzZXJ2ZXIgQVBJLiBFbmNhcHN1bGF0ZXMgdGhlIFJlc2l6ZU9ic2VydmVyIFNQSSBpbXBsZW1lbnRhdGlvblxyXG4gKiBleHBvc2luZyBvbmx5IHRob3NlIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgc3BlYy5cclxuICovXHJcbnZhciBSZXNpemVPYnNlcnZlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBSZXNpemVPYnNlcnZlci5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1Jlc2l6ZU9ic2VydmVyQ2FsbGJhY2t9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdGhhdCBpcyBpbnZva2VkIHdoZW5cclxuICAgICAqICAgICAgZGltZW5zaW9ucyBvZiB0aGUgb2JzZXJ2ZWQgZWxlbWVudHMgY2hhbmdlLlxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBSZXNpemVPYnNlcnZlcihjYWxsYmFjaykge1xyXG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZXNpemVPYnNlcnZlcikpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignMSBhcmd1bWVudCByZXF1aXJlZCwgYnV0IG9ubHkgMCBwcmVzZW50LicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgY29udHJvbGxlciA9IFJlc2l6ZU9ic2VydmVyQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpO1xyXG4gICAgICAgIHZhciBvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlclNQSShjYWxsYmFjaywgY29udHJvbGxlciwgdGhpcyk7XHJcbiAgICAgICAgb2JzZXJ2ZXJzLnNldCh0aGlzLCBvYnNlcnZlcik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gUmVzaXplT2JzZXJ2ZXI7XHJcbn0oKSk7XHJcbi8vIEV4cG9zZSBwdWJsaWMgbWV0aG9kcyBvZiBSZXNpemVPYnNlcnZlci5cclxuW1xyXG4gICAgJ29ic2VydmUnLFxyXG4gICAgJ3Vub2JzZXJ2ZScsXHJcbiAgICAnZGlzY29ubmVjdCdcclxuXS5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHtcclxuICAgIFJlc2l6ZU9ic2VydmVyLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBfYTtcclxuICAgICAgICByZXR1cm4gKF9hID0gb2JzZXJ2ZXJzLmdldCh0aGlzKSlbbWV0aG9kXS5hcHBseShfYSwgYXJndW1lbnRzKTtcclxuICAgIH07XHJcbn0pO1xuXG52YXIgaW5kZXggPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgLy8gRXhwb3J0IGV4aXN0aW5nIGltcGxlbWVudGF0aW9uIGlmIGF2YWlsYWJsZS5cclxuICAgIGlmICh0eXBlb2YgZ2xvYmFsJDEuUmVzaXplT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgcmV0dXJuIGdsb2JhbCQxLlJlc2l6ZU9ic2VydmVyO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFJlc2l6ZU9ic2VydmVyO1xyXG59KSgpO1xuXG5leHBvcnQgZGVmYXVsdCBpbmRleDtcbiIsImltcG9ydCBSZXNpemVPYnNlcnZlciBmcm9tICdyZXNpemUtb2JzZXJ2ZXItcG9seWZpbGwnO1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDb25zdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG52YXIgZWxlbWVudExpc3RlbmVycyA9IG5ldyBNYXAoKTtcbmZ1bmN0aW9uIG9uUmVzaXplKGVudGl0aWVzKSB7XG4gIGVudGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkge1xuICAgIHZhciBfZWxlbWVudExpc3RlbmVycyRnZXQ7XG4gICAgdmFyIHRhcmdldCA9IGVudGl0eS50YXJnZXQ7XG4gICAgKF9lbGVtZW50TGlzdGVuZXJzJGdldCA9IGVsZW1lbnRMaXN0ZW5lcnMuZ2V0KHRhcmdldCkpID09PSBudWxsIHx8IF9lbGVtZW50TGlzdGVuZXJzJGdldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2VsZW1lbnRMaXN0ZW5lcnMkZ2V0LmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gbGlzdGVuZXIodGFyZ2V0KTtcbiAgICB9KTtcbiAgfSk7XG59XG4vLyBOb3RlOiBSZXNpemVPYnNlcnZlciBwb2x5ZmlsbCBub3Qgc3VwcG9ydCBvcHRpb24gdG8gbWVhc3VyZSBib3JkZXItYm94IHJlc2l6ZVxudmFyIHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKG9uUmVzaXplKTtcbi8vIERldiBlbnYgb25seVxuZXhwb3J0IHZhciBfZWwgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gZWxlbWVudExpc3RlbmVycyA6IG51bGw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbmV4cG9ydCB2YXIgX3JzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IG9uUmVzaXplIDogbnVsbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE9ic2VydmUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgZnVuY3Rpb24gb2JzZXJ2ZShlbGVtZW50LCBjYWxsYmFjaykge1xuICBpZiAoIWVsZW1lbnRMaXN0ZW5lcnMuaGFzKGVsZW1lbnQpKSB7XG4gICAgZWxlbWVudExpc3RlbmVycy5zZXQoZWxlbWVudCwgbmV3IFNldCgpKTtcbiAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQpO1xuICB9XG4gIGVsZW1lbnRMaXN0ZW5lcnMuZ2V0KGVsZW1lbnQpLmFkZChjYWxsYmFjayk7XG59XG5leHBvcnQgZnVuY3Rpb24gdW5vYnNlcnZlKGVsZW1lbnQsIGNhbGxiYWNrKSB7XG4gIGlmIChlbGVtZW50TGlzdGVuZXJzLmhhcyhlbGVtZW50KSkge1xuICAgIGVsZW1lbnRMaXN0ZW5lcnMuZ2V0KGVsZW1lbnQpLmRlbGV0ZShjYWxsYmFjayk7XG4gICAgaWYgKCFlbGVtZW50TGlzdGVuZXJzLmdldChlbGVtZW50KS5zaXplKSB7XG4gICAgICByZXNpemVPYnNlcnZlci51bm9ic2VydmUoZWxlbWVudCk7XG4gICAgICBlbGVtZW50TGlzdGVuZXJzLmRlbGV0ZShlbGVtZW50KTtcbiAgICB9XG4gIH1cbn0iLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX2NyZWF0ZVN1cGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlclwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuLyoqXG4gKiBGYWxsYmFjayB0byBmaW5kRE9NTm9kZSBpZiBvcmlnaW4gcmVmIGRvIG5vdCBwcm92aWRlIGFueSBkb20gZWxlbWVudFxuICovXG52YXIgRG9tV3JhcHBlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoRG9tV3JhcHBlciwgX1JlYWN0JENvbXBvbmVudCk7XG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoRG9tV3JhcHBlcik7XG4gIGZ1bmN0aW9uIERvbVdyYXBwZXIoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERvbVdyYXBwZXIpO1xuICAgIHJldHVybiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuICBfY3JlYXRlQ2xhc3MoRG9tV3JhcHBlciwgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gRG9tV3JhcHBlcjtcbn0oUmVhY3QuQ29tcG9uZW50KTtcbmV4cG9ydCB7IERvbVdyYXBwZXIgYXMgZGVmYXVsdCB9OyIsIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHJlYWN0LWpzeC1ydW50aW1lLnByb2R1Y3Rpb24ubWluLmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbid1c2Ugc3RyaWN0Jzt2YXIgZj1yZXF1aXJlKFwicmVhY3RcIiksaz1TeW1ib2wuZm9yKFwicmVhY3QuZWxlbWVudFwiKSxsPVN5bWJvbC5mb3IoXCJyZWFjdC5mcmFnbWVudFwiKSxtPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksbj1mLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVELlJlYWN0Q3VycmVudE93bmVyLHA9e2tleTohMCxyZWY6ITAsX19zZWxmOiEwLF9fc291cmNlOiEwfTtcbmZ1bmN0aW9uIHEoYyxhLGcpe3ZhciBiLGQ9e30sZT1udWxsLGg9bnVsbDt2b2lkIDAhPT1nJiYoZT1cIlwiK2cpO3ZvaWQgMCE9PWEua2V5JiYoZT1cIlwiK2Eua2V5KTt2b2lkIDAhPT1hLnJlZiYmKGg9YS5yZWYpO2ZvcihiIGluIGEpbS5jYWxsKGEsYikmJiFwLmhhc093blByb3BlcnR5KGIpJiYoZFtiXT1hW2JdKTtpZihjJiZjLmRlZmF1bHRQcm9wcylmb3IoYiBpbiBhPWMuZGVmYXVsdFByb3BzLGEpdm9pZCAwPT09ZFtiXSYmKGRbYl09YVtiXSk7cmV0dXJueyQkdHlwZW9mOmssdHlwZTpjLGtleTplLHJlZjpoLHByb3BzOmQsX293bmVyOm4uY3VycmVudH19ZXhwb3J0cy5GcmFnbWVudD1sO2V4cG9ydHMuanN4PXE7ZXhwb3J0cy5qc3hzPXE7XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtanN4LXJ1bnRpbWUucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtanN4LXJ1bnRpbWUuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCB2YXIgQ29sbGVjdGlvbkNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbi8qKlxuICogQ29sbGVjdCBhbGwgdGhlIHJlc2l6ZSBldmVudCBmcm9tIGNoaWxkcmVuIFJlc2l6ZU9ic2VydmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2xsZWN0aW9uKF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICBvbkJhdGNoUmVzaXplID0gX3JlZi5vbkJhdGNoUmVzaXplO1xuICB2YXIgcmVzaXplSWRSZWYgPSBSZWFjdC51c2VSZWYoMCk7XG4gIHZhciByZXNpemVJbmZvc1JlZiA9IFJlYWN0LnVzZVJlZihbXSk7XG4gIHZhciBvbkNvbGxlY3Rpb25SZXNpemUgPSBSZWFjdC51c2VDb250ZXh0KENvbGxlY3Rpb25Db250ZXh0KTtcbiAgdmFyIG9uUmVzaXplID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHNpemUsIGVsZW1lbnQsIGRhdGEpIHtcbiAgICByZXNpemVJZFJlZi5jdXJyZW50ICs9IDE7XG4gICAgdmFyIGN1cnJlbnRJZCA9IHJlc2l6ZUlkUmVmLmN1cnJlbnQ7XG4gICAgcmVzaXplSW5mb3NSZWYuY3VycmVudC5wdXNoKHtcbiAgICAgIHNpemU6IHNpemUsXG4gICAgICBlbGVtZW50OiBlbGVtZW50LFxuICAgICAgZGF0YTogZGF0YVxuICAgIH0pO1xuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGN1cnJlbnRJZCA9PT0gcmVzaXplSWRSZWYuY3VycmVudCkge1xuICAgICAgICBvbkJhdGNoUmVzaXplID09PSBudWxsIHx8IG9uQmF0Y2hSZXNpemUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQmF0Y2hSZXNpemUocmVzaXplSW5mb3NSZWYuY3VycmVudCk7XG4gICAgICAgIHJlc2l6ZUluZm9zUmVmLmN1cnJlbnQgPSBbXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBDb250aW51ZSBidWJibGluZyBpZiBwYXJlbnQgZXhpc3RcbiAgICBvbkNvbGxlY3Rpb25SZXNpemUgPT09IG51bGwgfHwgb25Db2xsZWN0aW9uUmVzaXplID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNvbGxlY3Rpb25SZXNpemUoc2l6ZSwgZWxlbWVudCwgZGF0YSk7XG4gIH0sIFtvbkJhdGNoUmVzaXplLCBvbkNvbGxlY3Rpb25SZXNpemVdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbGxlY3Rpb25Db250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IG9uUmVzaXplXG4gIH0sIGNoaWxkcmVuKTtcbn0iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IHsgY29tcG9zZVJlZiwgc3VwcG9ydFJlZiB9IGZyb20gXCJyYy11dGlsL2VzL3JlZlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGZpbmRET01Ob2RlIGZyb20gXCJyYy11dGlsL2VzL0RvbS9maW5kRE9NTm9kZVwiO1xuaW1wb3J0IHsgb2JzZXJ2ZSwgdW5vYnNlcnZlIH0gZnJvbSAnLi4vdXRpbHMvb2JzZXJ2ZXJVdGlsJztcbmltcG9ydCBEb21XcmFwcGVyIGZyb20gJy4vRG9tV3JhcHBlcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uQ29udGV4dCB9IGZyb20gJy4uL0NvbGxlY3Rpb24nO1xuZnVuY3Rpb24gU2luZ2xlT2JzZXJ2ZXIocHJvcHMsIHJlZikge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkO1xuICB2YXIgZWxlbWVudFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIHdyYXBwZXJSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBvbkNvbGxlY3Rpb25SZXNpemUgPSBSZWFjdC51c2VDb250ZXh0KENvbGxlY3Rpb25Db250ZXh0KTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IENoaWxkcmVuID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaXNSZW5kZXJQcm9wcyA9IHR5cGVvZiBjaGlsZHJlbiA9PT0gJ2Z1bmN0aW9uJztcbiAgdmFyIG1lcmdlZENoaWxkcmVuID0gaXNSZW5kZXJQcm9wcyA/IGNoaWxkcmVuKGVsZW1lbnRSZWYpIDogY2hpbGRyZW47XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNpemUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHNpemVSZWYgPSBSZWFjdC51c2VSZWYoe1xuICAgIHdpZHRoOiAtMSxcbiAgICBoZWlnaHQ6IC0xLFxuICAgIG9mZnNldFdpZHRoOiAtMSxcbiAgICBvZmZzZXRIZWlnaHQ6IC0xXG4gIH0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZWYgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBjYW5SZWYgPSAhaXNSZW5kZXJQcm9wcyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQobWVyZ2VkQ2hpbGRyZW4pICYmIHN1cHBvcnRSZWYobWVyZ2VkQ2hpbGRyZW4pO1xuICB2YXIgb3JpZ2luUmVmID0gY2FuUmVmID8gbWVyZ2VkQ2hpbGRyZW4ucmVmIDogbnVsbDtcbiAgdmFyIG1lcmdlZFJlZiA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjb21wb3NlUmVmKG9yaWdpblJlZiwgZWxlbWVudFJlZik7XG4gIH0sIFtvcmlnaW5SZWYsIGVsZW1lbnRSZWZdKTtcbiAgdmFyIGdldERvbSA9IGZ1bmN0aW9uIGdldERvbSgpIHtcbiAgICByZXR1cm4gZmluZERPTU5vZGUoZWxlbWVudFJlZi5jdXJyZW50KSB8fCBmaW5kRE9NTm9kZSh3cmFwcGVyUmVmLmN1cnJlbnQpO1xuICB9O1xuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnZXREb20oKTtcbiAgfSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBPYnNlcnZlID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHByb3BzUmVmID0gUmVhY3QudXNlUmVmKHByb3BzKTtcbiAgcHJvcHNSZWYuY3VycmVudCA9IHByb3BzO1xuICAvLyBIYW5kbGVyXG4gIHZhciBvbkludGVybmFsUmVzaXplID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIHZhciBfcHJvcHNSZWYkY3VycmVudCA9IHByb3BzUmVmLmN1cnJlbnQsXG4gICAgICBvblJlc2l6ZSA9IF9wcm9wc1JlZiRjdXJyZW50Lm9uUmVzaXplLFxuICAgICAgZGF0YSA9IF9wcm9wc1JlZiRjdXJyZW50LmRhdGE7XG4gICAgdmFyIF90YXJnZXQkZ2V0Qm91bmRpbmdDbCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgIHdpZHRoID0gX3RhcmdldCRnZXRCb3VuZGluZ0NsLndpZHRoLFxuICAgICAgaGVpZ2h0ID0gX3RhcmdldCRnZXRCb3VuZGluZ0NsLmhlaWdodDtcbiAgICB2YXIgb2Zmc2V0V2lkdGggPSB0YXJnZXQub2Zmc2V0V2lkdGgsXG4gICAgICBvZmZzZXRIZWlnaHQgPSB0YXJnZXQub2Zmc2V0SGVpZ2h0O1xuICAgIC8qKlxuICAgICAqIFJlc2l6ZSBvYnNlcnZlciB0cmlnZ2VyIHdoZW4gY29udGVudCBzaXplIGNoYW5nZWQuXG4gICAgICogSW4gbW9zdCBjYXNlIHdlIGp1c3QgY2FyZSBhYm91dCBlbGVtZW50IHNpemUsXG4gICAgICogbGV0J3MgdXNlIGBib3VuZGFyeWAgaW5zdGVhZCBvZiBgY29udGVudFJlY3RgIGhlcmUgdG8gYXZvaWQgc2hha2luZy5cbiAgICAgKi9cbiAgICB2YXIgZml4ZWRXaWR0aCA9IE1hdGguZmxvb3Iod2lkdGgpO1xuICAgIHZhciBmaXhlZEhlaWdodCA9IE1hdGguZmxvb3IoaGVpZ2h0KTtcbiAgICBpZiAoc2l6ZVJlZi5jdXJyZW50LndpZHRoICE9PSBmaXhlZFdpZHRoIHx8IHNpemVSZWYuY3VycmVudC5oZWlnaHQgIT09IGZpeGVkSGVpZ2h0IHx8IHNpemVSZWYuY3VycmVudC5vZmZzZXRXaWR0aCAhPT0gb2Zmc2V0V2lkdGggfHwgc2l6ZVJlZi5jdXJyZW50Lm9mZnNldEhlaWdodCAhPT0gb2Zmc2V0SGVpZ2h0KSB7XG4gICAgICB2YXIgc2l6ZSA9IHtcbiAgICAgICAgd2lkdGg6IGZpeGVkV2lkdGgsXG4gICAgICAgIGhlaWdodDogZml4ZWRIZWlnaHQsXG4gICAgICAgIG9mZnNldFdpZHRoOiBvZmZzZXRXaWR0aCxcbiAgICAgICAgb2Zmc2V0SGVpZ2h0OiBvZmZzZXRIZWlnaHRcbiAgICAgIH07XG4gICAgICBzaXplUmVmLmN1cnJlbnQgPSBzaXplO1xuICAgICAgLy8gSUUgaXMgc3RyYW5nZSwgcmlnaHQ/XG4gICAgICB2YXIgbWVyZ2VkT2Zmc2V0V2lkdGggPSBvZmZzZXRXaWR0aCA9PT0gTWF0aC5yb3VuZCh3aWR0aCkgPyB3aWR0aCA6IG9mZnNldFdpZHRoO1xuICAgICAgdmFyIG1lcmdlZE9mZnNldEhlaWdodCA9IG9mZnNldEhlaWdodCA9PT0gTWF0aC5yb3VuZChoZWlnaHQpID8gaGVpZ2h0IDogb2Zmc2V0SGVpZ2h0O1xuICAgICAgdmFyIHNpemVJbmZvID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzaXplKSwge30sIHtcbiAgICAgICAgb2Zmc2V0V2lkdGg6IG1lcmdlZE9mZnNldFdpZHRoLFxuICAgICAgICBvZmZzZXRIZWlnaHQ6IG1lcmdlZE9mZnNldEhlaWdodFxuICAgICAgfSk7XG4gICAgICAvLyBMZXQgY29sbGVjdGlvbiBrbm93IHdoYXQgaGFwcGVuZWRcbiAgICAgIG9uQ29sbGVjdGlvblJlc2l6ZSA9PT0gbnVsbCB8fCBvbkNvbGxlY3Rpb25SZXNpemUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ29sbGVjdGlvblJlc2l6ZShzaXplSW5mbywgdGFyZ2V0LCBkYXRhKTtcbiAgICAgIGlmIChvblJlc2l6ZSkge1xuICAgICAgICAvLyBkZWZlciB0aGUgY2FsbGJhY2sgYnV0IG5vdCBkZWZlciB0byBuZXh0IGZyYW1lXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIG9uUmVzaXplKHNpemVJbmZvLCB0YXJnZXQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtdKTtcbiAgLy8gRHluYW1pYyBvYnNlcnZlXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGN1cnJlbnRFbGVtZW50ID0gZ2V0RG9tKCk7XG4gICAgaWYgKGN1cnJlbnRFbGVtZW50ICYmICFkaXNhYmxlZCkge1xuICAgICAgb2JzZXJ2ZShjdXJyZW50RWxlbWVudCwgb25JbnRlcm5hbFJlc2l6ZSk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdW5vYnNlcnZlKGN1cnJlbnRFbGVtZW50LCBvbkludGVybmFsUmVzaXplKTtcbiAgICB9O1xuICB9LCBbZWxlbWVudFJlZi5jdXJyZW50LCBkaXNhYmxlZF0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEb21XcmFwcGVyLCB7XG4gICAgcmVmOiB3cmFwcGVyUmVmXG4gIH0sIGNhblJlZiA/IC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQobWVyZ2VkQ2hpbGRyZW4sIHtcbiAgICByZWY6IG1lcmdlZFJlZlxuICB9KSA6IG1lcmdlZENoaWxkcmVuKTtcbn1cbnZhciBSZWZTaW5nbGVPYnNlcnZlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKFNpbmdsZU9ic2VydmVyKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFJlZlNpbmdsZU9ic2VydmVyLmRpc3BsYXlOYW1lID0gJ1NpbmdsZU9ic2VydmVyJztcbn1cbmV4cG9ydCBkZWZhdWx0IFJlZlNpbmdsZU9ic2VydmVyOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHRvQXJyYXkgZnJvbSBcInJjLXV0aWwvZXMvQ2hpbGRyZW4vdG9BcnJheVwiO1xuaW1wb3J0IHsgd2FybmluZyB9IGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbmltcG9ydCBTaW5nbGVPYnNlcnZlciBmcm9tICcuL1NpbmdsZU9ic2VydmVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICcuL0NvbGxlY3Rpb24nO1xudmFyIElOVEVSTkFMX1BSRUZJWF9LRVkgPSAncmMtb2JzZXJ2ZXIta2V5JztcbmltcG9ydCB7IF9ycyB9IGZyb20gJy4vdXRpbHMvb2JzZXJ2ZXJVdGlsJztcbmV4cG9ydCB7IC8qKiBAcHJpdmF0ZSBUZXN0IG9ubHkgZm9yIG1vY2sgdHJpZ2dlciByZXNpemUgZXZlbnQgKi9cbl9ycyB9O1xuZnVuY3Rpb24gUmVzaXplT2JzZXJ2ZXIocHJvcHMsIHJlZikge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbjtcbiAgdmFyIGNoaWxkTm9kZXMgPSB0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicgPyBbY2hpbGRyZW5dIDogdG9BcnJheShjaGlsZHJlbik7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKGNoaWxkTm9kZXMubGVuZ3RoID4gMSkge1xuICAgICAgd2FybmluZyhmYWxzZSwgJ0ZpbmQgbW9yZSB0aGFuIG9uZSBjaGlsZCBub2RlIHdpdGggYGNoaWxkcmVuYCBpbiBSZXNpemVPYnNlcnZlci4gUGxlYXNlIHVzZSBSZXNpemVPYnNlcnZlci5Db2xsZWN0aW9uIGluc3RlYWQuJyk7XG4gICAgfSBlbHNlIGlmIChjaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgd2FybmluZyhmYWxzZSwgJ2BjaGlsZHJlbmAgb2YgUmVzaXplT2JzZXJ2ZXIgaXMgZW1wdHkuIE5vdGhpbmcgaXMgaW4gb2JzZXJ2ZS4nKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoaWxkTm9kZXMubWFwKGZ1bmN0aW9uIChjaGlsZCwgaW5kZXgpIHtcbiAgICB2YXIga2V5ID0gKGNoaWxkID09PSBudWxsIHx8IGNoaWxkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjaGlsZC5rZXkpIHx8IFwiXCIuY29uY2F0KElOVEVSTkFMX1BSRUZJWF9LRVksIFwiLVwiKS5jb25jYXQoaW5kZXgpO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTaW5nbGVPYnNlcnZlciwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgICBrZXk6IGtleSxcbiAgICAgIHJlZjogaW5kZXggPT09IDAgPyByZWYgOiB1bmRlZmluZWRcbiAgICB9KSwgY2hpbGQpO1xuICB9KTtcbn1cbnZhciBSZWZSZXNpemVPYnNlcnZlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKFJlc2l6ZU9ic2VydmVyKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFJlZlJlc2l6ZU9ic2VydmVyLmRpc3BsYXlOYW1lID0gJ1Jlc2l6ZU9ic2VydmVyJztcbn1cblJlZlJlc2l6ZU9ic2VydmVyLkNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uO1xuZXhwb3J0IGRlZmF1bHQgUmVmUmVzaXplT2JzZXJ2ZXI7IiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG9taXQob2JqLCBmaWVsZHMpIHtcbiAgdmFyIGNsb25lID0gX29iamVjdFNwcmVhZCh7fSwgb2JqKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGRzKSkge1xuICAgIGZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGRlbGV0ZSBjbG9uZVtrZXldO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBjbG9uZTtcbn0iLCJpbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xudmFyIEljb25Db250ZXh0ID0gLyojX19QVVJFX18qL2NyZWF0ZUNvbnRleHQoe30pO1xuZXhwb3J0IGRlZmF1bHQgSWNvbkNvbnRleHQ7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkge1xuICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTtcbiAgdmFyIHRhcmdldCA9IHt9O1xuICB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gIHZhciBrZXksIGk7XG4gIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAga2V5ID0gc291cmNlS2V5c1tpXTtcbiAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gIH1cbiAgcmV0dXJuIHRhcmdldDtcbn0iLCJpbXBvcnQgb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSBmcm9tIFwiLi9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkge1xuICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTtcbiAgdmFyIHRhcmdldCA9IG9iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCk7XG4gIHZhciBrZXksIGk7XG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7XG4gICAgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGtleSA9IHNvdXJjZVN5bWJvbEtleXNbaV07XG4gICAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTtcbiAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiB0YXJnZXQ7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHtcbiAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTtcbiAgcmV0dXJuIGFycjI7XG59IiwiaW1wb3J0IGFycmF5TGlrZVRvQXJyYXkgZnJvbSBcIi4vYXJyYXlMaWtlVG9BcnJheS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShhcnIpO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikge1xuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBpdGVyW1N5bWJvbC5pdGVyYXRvcl0gIT0gbnVsbCB8fCBpdGVyW1wiQEBpdGVyYXRvclwiXSAhPSBudWxsKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTtcbn0iLCJpbXBvcnQgYXJyYXlMaWtlVG9BcnJheSBmcm9tIFwiLi9hcnJheUxpa2VUb0FycmF5LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7XG4gIGlmICghbykgcmV0dXJuO1xuICBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7XG4gIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59IiwiaW1wb3J0IGFycmF5V2l0aG91dEhvbGVzIGZyb20gXCIuL2FycmF5V2l0aG91dEhvbGVzLmpzXCI7XG5pbXBvcnQgaXRlcmFibGVUb0FycmF5IGZyb20gXCIuL2l0ZXJhYmxlVG9BcnJheS5qc1wiO1xuaW1wb3J0IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IGZyb20gXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzXCI7XG5pbXBvcnQgbm9uSXRlcmFibGVTcHJlYWQgZnJvbSBcIi4vbm9uSXRlcmFibGVTcHJlYWQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHtcbiAgcmV0dXJuIGFycmF5V2l0aG91dEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5KGFycikgfHwgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBub25JdGVyYWJsZVNwcmVhZCgpO1xufSIsImltcG9ydCB3YXJuaW5nIGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCB2YXIgSE9PS19NQVJLID0gJ1JDX0ZPUk1fSU5URVJOQUxfSE9PS1MnO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbnZhciB3YXJuaW5nRnVuYyA9IGZ1bmN0aW9uIHdhcm5pbmdGdW5jKCkge1xuICB3YXJuaW5nKGZhbHNlLCAnQ2FuIG5vdCBmaW5kIEZvcm1Db250ZXh0LiBQbGVhc2UgbWFrZSBzdXJlIHlvdSB3cmFwIEZpZWxkIHVuZGVyIEZvcm0uJyk7XG59O1xudmFyIENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7XG4gIGdldEZpZWxkVmFsdWU6IHdhcm5pbmdGdW5jLFxuICBnZXRGaWVsZHNWYWx1ZTogd2FybmluZ0Z1bmMsXG4gIGdldEZpZWxkRXJyb3I6IHdhcm5pbmdGdW5jLFxuICBnZXRGaWVsZFdhcm5pbmc6IHdhcm5pbmdGdW5jLFxuICBnZXRGaWVsZHNFcnJvcjogd2FybmluZ0Z1bmMsXG4gIGlzRmllbGRzVG91Y2hlZDogd2FybmluZ0Z1bmMsXG4gIGlzRmllbGRUb3VjaGVkOiB3YXJuaW5nRnVuYyxcbiAgaXNGaWVsZFZhbGlkYXRpbmc6IHdhcm5pbmdGdW5jLFxuICBpc0ZpZWxkc1ZhbGlkYXRpbmc6IHdhcm5pbmdGdW5jLFxuICByZXNldEZpZWxkczogd2FybmluZ0Z1bmMsXG4gIHNldEZpZWxkczogd2FybmluZ0Z1bmMsXG4gIHNldEZpZWxkVmFsdWU6IHdhcm5pbmdGdW5jLFxuICBzZXRGaWVsZHNWYWx1ZTogd2FybmluZ0Z1bmMsXG4gIHZhbGlkYXRlRmllbGRzOiB3YXJuaW5nRnVuYyxcbiAgc3VibWl0OiB3YXJuaW5nRnVuYyxcbiAgZ2V0SW50ZXJuYWxIb29rczogZnVuY3Rpb24gZ2V0SW50ZXJuYWxIb29rcygpIHtcbiAgICB3YXJuaW5nRnVuYygpO1xuICAgIHJldHVybiB7XG4gICAgICBkaXNwYXRjaDogd2FybmluZ0Z1bmMsXG4gICAgICBpbml0RW50aXR5VmFsdWU6IHdhcm5pbmdGdW5jLFxuICAgICAgcmVnaXN0ZXJGaWVsZDogd2FybmluZ0Z1bmMsXG4gICAgICB1c2VTdWJzY3JpYmU6IHdhcm5pbmdGdW5jLFxuICAgICAgc2V0SW5pdGlhbFZhbHVlczogd2FybmluZ0Z1bmMsXG4gICAgICBkZXN0cm95Rm9ybTogd2FybmluZ0Z1bmMsXG4gICAgICBzZXRDYWxsYmFja3M6IHdhcm5pbmdGdW5jLFxuICAgICAgcmVnaXN0ZXJXYXRjaDogd2FybmluZ0Z1bmMsXG4gICAgICBnZXRGaWVsZHM6IHdhcm5pbmdGdW5jLFxuICAgICAgc2V0VmFsaWRhdGVNZXNzYWdlczogd2FybmluZ0Z1bmMsXG4gICAgICBzZXRQcmVzZXJ2ZTogd2FybmluZ0Z1bmMsXG4gICAgICBnZXRJbml0aWFsVmFsdWU6IHdhcm5pbmdGdW5jXG4gICAgfTtcbiAgfVxufSk7XG5leHBvcnQgZGVmYXVsdCBDb250ZXh0OyIsImV4cG9ydCBmdW5jdGlvbiB0b0FycmF5KHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbn0iLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiLi90eXBlb2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7XG4gIFwidXNlIHN0cmljdFwiOyAvKiEgcmVnZW5lcmF0b3ItcnVudGltZSAtLSBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4gLS0gbGljZW5zZSAoTUlUKTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2Jsb2IvbWFpbi9MSUNFTlNFICovXG4gIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSBmdW5jdGlvbiBfcmVnZW5lcmF0b3JSdW50aW1lKCkge1xuICAgIHJldHVybiBleHBvcnRzO1xuICB9O1xuICB2YXIgZXhwb3J0cyA9IHt9LFxuICAgIE9wID0gT2JqZWN0LnByb3RvdHlwZSxcbiAgICBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eSxcbiAgICBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBmdW5jdGlvbiAob2JqLCBrZXksIGRlc2MpIHtcbiAgICAgIG9ialtrZXldID0gZGVzYy52YWx1ZTtcbiAgICB9LFxuICAgICRTeW1ib2wgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCA/IFN5bWJvbCA6IHt9LFxuICAgIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIixcbiAgICBhc3luY0l0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8IFwiQEBhc3luY0l0ZXJhdG9yXCIsXG4gICAgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiO1xuICBmdW5jdGlvbiBkZWZpbmUob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwXG4gICAgfSksIG9ialtrZXldO1xuICB9XG4gIHRyeSB7XG4gICAgZGVmaW5lKHt9LCBcIlwiKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZGVmaW5lID0gZnVuY3Rpb24gZGVmaW5lKG9iaiwga2V5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG9ialtrZXldID0gdmFsdWU7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3IsXG4gICAgICBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSksXG4gICAgICBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0eShnZW5lcmF0b3IsIFwiX2ludm9rZVwiLCB7XG4gICAgICB2YWx1ZTogbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KVxuICAgIH0pLCBnZW5lcmF0b3I7XG4gIH1cbiAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwibm9ybWFsXCIsXG4gICAgICAgIGFyZzogZm4uY2FsbChvYmosIGFyZylcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcInRocm93XCIsXG4gICAgICAgIGFyZzogZXJyXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBleHBvcnRzLndyYXAgPSB3cmFwO1xuICB2YXIgQ29udGludWVTZW50aW5lbCA9IHt9O1xuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIGRlZmluZShJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSk7XG4gIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZixcbiAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTtcbiAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgJiYgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkgJiYgKEl0ZXJhdG9yUHJvdG90eXBlID0gTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUpO1xuICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPSBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7XG4gICAgICBkZWZpbmUocHJvdG90eXBlLCBtZXRob2QsIGZ1bmN0aW9uIChhcmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvciwgUHJvbWlzZUltcGwpIHtcbiAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7XG4gICAgICBpZiAoXCJ0aHJvd1wiICE9PSByZWNvcmQudHlwZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZyxcbiAgICAgICAgICB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlICYmIFwib2JqZWN0XCIgPT0gX3R5cGVvZih2YWx1ZSkgJiYgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKSA/IFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpbnZva2UoXCJuZXh0XCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KSA6IFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24gKHVud3JhcHBlZCkge1xuICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZCwgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gaW52b2tlKFwidGhyb3dcIiwgZXJyb3IsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgIH1cbiAgICB2YXIgcHJldmlvdXNQcm9taXNlO1xuICAgIGRlZmluZVByb3BlcnR5KHRoaXMsIFwiX2ludm9rZVwiLCB7XG4gICAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUobWV0aG9kLCBhcmcpIHtcbiAgICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlSW1wbChmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9IHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLCBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZykgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkge1xuICAgIHZhciBzdGF0ZSA9IFwic3VzcGVuZGVkU3RhcnRcIjtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1ldGhvZCwgYXJnKSB7XG4gICAgICBpZiAoXCJleGVjdXRpbmdcIiA9PT0gc3RhdGUpIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgICBpZiAoXCJjb21wbGV0ZWRcIiA9PT0gc3RhdGUpIHtcbiAgICAgICAgaWYgKFwidGhyb3dcIiA9PT0gbWV0aG9kKSB0aHJvdyBhcmc7XG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnRleHQubWV0aG9kID0gbWV0aG9kLCBjb250ZXh0LmFyZyA9IGFyZzs7KSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFwibmV4dFwiID09PSBjb250ZXh0Lm1ldGhvZCkgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO2Vsc2UgaWYgKFwidGhyb3dcIiA9PT0gY29udGV4dC5tZXRob2QpIHtcbiAgICAgICAgICBpZiAoXCJzdXNwZW5kZWRTdGFydFwiID09PSBzdGF0ZSkgdGhyb3cgc3RhdGUgPSBcImNvbXBsZXRlZFwiLCBjb250ZXh0LmFyZztcbiAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTtcbiAgICAgICAgfSBlbHNlIFwicmV0dXJuXCIgPT09IGNvbnRleHQubWV0aG9kICYmIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgc3RhdGUgPSBcImV4ZWN1dGluZ1wiO1xuICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG4gICAgICAgIGlmIChcIm5vcm1hbFwiID09PSByZWNvcmQudHlwZSkge1xuICAgICAgICAgIGlmIChzdGF0ZSA9IGNvbnRleHQuZG9uZSA/IFwiY29tcGxldGVkXCIgOiBcInN1c3BlbmRlZFlpZWxkXCIsIHJlY29yZC5hcmcgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZyxcbiAgICAgICAgICAgIGRvbmU6IGNvbnRleHQuZG9uZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXCJ0aHJvd1wiID09PSByZWNvcmQudHlwZSAmJiAoc3RhdGUgPSBcImNvbXBsZXRlZFwiLCBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIiwgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kTmFtZSA9IGNvbnRleHQubWV0aG9kLFxuICAgICAgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbbWV0aG9kTmFtZV07XG4gICAgaWYgKHVuZGVmaW5lZCA9PT0gbWV0aG9kKSByZXR1cm4gY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIFwidGhyb3dcIiA9PT0gbWV0aG9kTmFtZSAmJiBkZWxlZ2F0ZS5pdGVyYXRvcltcInJldHVyblwiXSAmJiAoY29udGV4dC5tZXRob2QgPSBcInJldHVyblwiLCBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCwgbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCksIFwidGhyb3dcIiA9PT0gY29udGV4dC5tZXRob2QpIHx8IFwicmV0dXJuXCIgIT09IG1ldGhvZE5hbWUgJiYgKGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiLCBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICdcIiArIG1ldGhvZE5hbWUgKyBcIicgbWV0aG9kXCIpKSwgQ29udGludWVTZW50aW5lbDtcbiAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpO1xuICAgIGlmIChcInRocm93XCIgPT09IHJlY29yZC50eXBlKSByZXR1cm4gY29udGV4dC5tZXRob2QgPSBcInRocm93XCIsIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZywgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWw7XG4gICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuICAgIHJldHVybiBpbmZvID8gaW5mby5kb25lID8gKGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlLCBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jLCBcInJldHVyblwiICE9PSBjb250ZXh0Lm1ldGhvZCAmJiAoY29udGV4dC5tZXRob2QgPSBcIm5leHRcIiwgY29udGV4dC5hcmcgPSB1bmRlZmluZWQpLCBjb250ZXh0LmRlbGVnYXRlID0gbnVsbCwgQ29udGludWVTZW50aW5lbCkgOiBpbmZvIDogKGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiLCBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKSwgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWwpO1xuICB9XG4gIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7XG4gICAgdmFyIGVudHJ5ID0ge1xuICAgICAgdHJ5TG9jOiBsb2NzWzBdXG4gICAgfTtcbiAgICAxIGluIGxvY3MgJiYgKGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXSksIDIgaW4gbG9jcyAmJiAoZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl0sIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXSksIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfVxuICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7XG4gICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307XG4gICAgcmVjb3JkLnR5cGUgPSBcIm5vcm1hbFwiLCBkZWxldGUgcmVjb3JkLmFyZywgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDtcbiAgfVxuICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7XG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3tcbiAgICAgIHRyeUxvYzogXCJyb290XCJcbiAgICB9XSwgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpLCB0aGlzLnJlc2V0KCEwKTtcbiAgfVxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgaXRlcmFibGUubmV4dCkgcmV0dXJuIGl0ZXJhYmxlO1xuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsXG4gICAgICAgICAgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgICBmb3IgKDsgKytpIDwgaXRlcmFibGUubGVuZ3RoOykgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkgcmV0dXJuIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXSwgbmV4dC5kb25lID0gITEsIG5leHQ7XG4gICAgICAgICAgICByZXR1cm4gbmV4dC52YWx1ZSA9IHVuZGVmaW5lZCwgbmV4dC5kb25lID0gITAsIG5leHQ7XG4gICAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBuZXh0OiBkb25lUmVzdWx0XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgZG9uZTogITBcbiAgICB9O1xuICB9XG4gIHJldHVybiBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgZGVmaW5lUHJvcGVydHkoR3AsIFwiY29uc3RydWN0b3JcIiwge1xuICAgIHZhbHVlOiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSxcbiAgICBjb25maWd1cmFibGU6ICEwXG4gIH0pLCBkZWZpbmVQcm9wZXJ0eShHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgXCJjb25zdHJ1Y3RvclwiLCB7XG4gICAgdmFsdWU6IEdlbmVyYXRvckZ1bmN0aW9uLFxuICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgfSksIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gZGVmaW5lKEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCB0b1N0cmluZ1RhZ1N5bWJvbCwgXCJHZW5lcmF0b3JGdW5jdGlvblwiKSwgZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24gKGdlbkZ1bikge1xuICAgIHZhciBjdG9yID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBnZW5GdW4gJiYgZ2VuRnVuLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiAhIWN0b3IgJiYgKGN0b3IgPT09IEdlbmVyYXRvckZ1bmN0aW9uIHx8IFwiR2VuZXJhdG9yRnVuY3Rpb25cIiA9PT0gKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSk7XG4gIH0sIGV4cG9ydHMubWFyayA9IGZ1bmN0aW9uIChnZW5GdW4pIHtcbiAgICByZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpIDogKGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgZGVmaW5lKGdlbkZ1biwgdG9TdHJpbmdUYWdTeW1ib2wsIFwiR2VuZXJhdG9yRnVuY3Rpb25cIikpLCBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCksIGdlbkZ1bjtcbiAgfSwgZXhwb3J0cy5hd3JhcCA9IGZ1bmN0aW9uIChhcmcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgX19hd2FpdDogYXJnXG4gICAgfTtcbiAgfSwgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKSwgZGVmaW5lKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlLCBhc3luY0l0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pLCBleHBvcnRzLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yLCBleHBvcnRzLmFzeW5jID0gZnVuY3Rpb24gKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0LCBQcm9taXNlSW1wbCkge1xuICAgIHZvaWQgMCA9PT0gUHJvbWlzZUltcGwgJiYgKFByb21pc2VJbXBsID0gUHJvbWlzZSk7XG4gICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcih3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSwgUHJvbWlzZUltcGwpO1xuICAgIHJldHVybiBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbikgPyBpdGVyIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICB9KTtcbiAgfSwgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKSwgZGVmaW5lKEdwLCB0b1N0cmluZ1RhZ1N5bWJvbCwgXCJHZW5lcmF0b3JcIiksIGRlZmluZShHcCwgaXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSksIGRlZmluZShHcCwgXCJ0b1N0cmluZ1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFwiW29iamVjdCBHZW5lcmF0b3JdXCI7XG4gIH0pLCBleHBvcnRzLmtleXMgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgdmFyIG9iamVjdCA9IE9iamVjdCh2YWwpLFxuICAgICAga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIGtleXMucHVzaChrZXkpO1xuICAgIHJldHVybiBrZXlzLnJldmVyc2UoKSwgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIGZvciAoOyBrZXlzLmxlbmd0aDspIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqZWN0KSByZXR1cm4gbmV4dC52YWx1ZSA9IGtleSwgbmV4dC5kb25lID0gITEsIG5leHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV4dC5kb25lID0gITAsIG5leHQ7XG4gICAgfTtcbiAgfSwgZXhwb3J0cy52YWx1ZXMgPSB2YWx1ZXMsIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldChza2lwVGVtcFJlc2V0KSB7XG4gICAgICBpZiAodGhpcy5wcmV2ID0gMCwgdGhpcy5uZXh0ID0gMCwgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZCwgdGhpcy5kb25lID0gITEsIHRoaXMuZGVsZWdhdGUgPSBudWxsLCB0aGlzLm1ldGhvZCA9IFwibmV4dFwiLCB0aGlzLmFyZyA9IHVuZGVmaW5lZCwgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSksICFza2lwVGVtcFJlc2V0KSBmb3IgKHZhciBuYW1lIGluIHRoaXMpIFwidFwiID09PSBuYW1lLmNoYXJBdCgwKSAmJiBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJiAhaXNOYU4oK25hbWUuc2xpY2UoMSkpICYmICh0aGlzW25hbWVdID0gdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIHN0b3A6IGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgICB0aGlzLmRvbmUgPSAhMDtcbiAgICAgIHZhciByb290UmVjb3JkID0gdGhpcy50cnlFbnRyaWVzWzBdLmNvbXBsZXRpb247XG4gICAgICBpZiAoXCJ0aHJvd1wiID09PSByb290UmVjb3JkLnR5cGUpIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgcmV0dXJuIHRoaXMucnZhbDtcbiAgICB9LFxuICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbiBkaXNwYXRjaEV4Y2VwdGlvbihleGNlcHRpb24pIHtcbiAgICAgIGlmICh0aGlzLmRvbmUpIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkge1xuICAgICAgICByZXR1cm4gcmVjb3JkLnR5cGUgPSBcInRocm93XCIsIHJlY29yZC5hcmcgPSBleGNlcHRpb24sIGNvbnRleHQubmV4dCA9IGxvYywgY2F1Z2h0ICYmIChjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiLCBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCksICEhY2F1Z2h0O1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV0sXG4gICAgICAgICAgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgaWYgKFwicm9vdFwiID09PSBlbnRyeS50cnlMb2MpIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2KSB7XG4gICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksIFwiY2F0Y2hMb2NcIiksXG4gICAgICAgICAgICBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcbiAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCAhMCk7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsICEwKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNGaW5hbGx5KSB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgYWJydXB0OiBmdW5jdGlvbiBhYnJ1cHQodHlwZSwgYXJnKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYgJiYgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJiB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgdmFyIGZpbmFsbHlFbnRyeSA9IGVudHJ5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmaW5hbGx5RW50cnkgJiYgKFwiYnJlYWtcIiA9PT0gdHlwZSB8fCBcImNvbnRpbnVlXCIgPT09IHR5cGUpICYmIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYyAmJiAoZmluYWxseUVudHJ5ID0gbnVsbCk7XG4gICAgICB2YXIgcmVjb3JkID0gZmluYWxseUVudHJ5ID8gZmluYWxseUVudHJ5LmNvbXBsZXRpb24gOiB7fTtcbiAgICAgIHJldHVybiByZWNvcmQudHlwZSA9IHR5cGUsIHJlY29yZC5hcmcgPSBhcmcsIGZpbmFsbHlFbnRyeSA/ICh0aGlzLm1ldGhvZCA9IFwibmV4dFwiLCB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYywgQ29udGludWVTZW50aW5lbCkgOiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgfSxcbiAgICBjb21wbGV0ZTogZnVuY3Rpb24gY29tcGxldGUocmVjb3JkLCBhZnRlckxvYykge1xuICAgICAgaWYgKFwidGhyb3dcIiA9PT0gcmVjb3JkLnR5cGUpIHRocm93IHJlY29yZC5hcmc7XG4gICAgICByZXR1cm4gXCJicmVha1wiID09PSByZWNvcmQudHlwZSB8fCBcImNvbnRpbnVlXCIgPT09IHJlY29yZC50eXBlID8gdGhpcy5uZXh0ID0gcmVjb3JkLmFyZyA6IFwicmV0dXJuXCIgPT09IHJlY29yZC50eXBlID8gKHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZywgdGhpcy5tZXRob2QgPSBcInJldHVyblwiLCB0aGlzLm5leHQgPSBcImVuZFwiKSA6IFwibm9ybWFsXCIgPT09IHJlY29yZC50eXBlICYmIGFmdGVyTG9jICYmICh0aGlzLm5leHQgPSBhZnRlckxvYyksIENvbnRpbnVlU2VudGluZWw7XG4gICAgfSxcbiAgICBmaW5pc2g6IGZ1bmN0aW9uIGZpbmlzaChmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHJldHVybiB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKSwgcmVzZXRUcnlFbnRyeShlbnRyeSksIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG4gICAgfSxcbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uIF9jYXRjaCh0cnlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHtcbiAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgICBpZiAoXCJ0aHJvd1wiID09PSByZWNvcmQudHlwZSkge1xuICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRocm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG4gICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24gZGVsZWdhdGVZaWVsZChpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLFxuICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLFxuICAgICAgICBuZXh0TG9jOiBuZXh0TG9jXG4gICAgICB9LCBcIm5leHRcIiA9PT0gdGhpcy5tZXRob2QgJiYgKHRoaXMuYXJnID0gdW5kZWZpbmVkKSwgQ29udGludWVTZW50aW5lbDtcbiAgICB9XG4gIH0sIGV4cG9ydHM7XG59IiwiZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykge1xuICB0cnkge1xuICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTtcbiAgICB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlamVjdChlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChpbmZvLmRvbmUpIHtcbiAgICByZXNvbHZlKHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7XG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHtcbiAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcIm5leHRcIiwgdmFsdWUpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX3Rocm93KGVycikge1xuICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwidGhyb3dcIiwgZXJyKTtcbiAgICAgIH1cbiAgICAgIF9uZXh0KHVuZGVmaW5lZCk7XG4gICAgfSk7XG4gIH07XG59IiwiZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG4gIHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZShzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTtcbiAgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7XG5cbiAgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTtcbn1cblxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTtcbiAgfTtcbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTtcbn1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgby5fX3Byb3RvX18gPSBwO1xuICAgIHJldHVybiBvO1xuICB9O1xuICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApO1xufVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7XG4gIGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7XG4gIGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7XG5cbiAgdHJ5IHtcbiAgICBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NvbnN0cnVjdChQYXJlbnQsIGFyZ3MsIENsYXNzKSB7XG4gIGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkpIHtcbiAgICBfY29uc3RydWN0ID0gUmVmbGVjdC5jb25zdHJ1Y3QuYmluZCgpO1xuICB9IGVsc2Uge1xuICAgIF9jb25zdHJ1Y3QgPSBmdW5jdGlvbiBfY29uc3RydWN0KFBhcmVudCwgYXJncywgQ2xhc3MpIHtcbiAgICAgIHZhciBhID0gW251bGxdO1xuICAgICAgYS5wdXNoLmFwcGx5KGEsIGFyZ3MpO1xuICAgICAgdmFyIENvbnN0cnVjdG9yID0gRnVuY3Rpb24uYmluZC5hcHBseShQYXJlbnQsIGEpO1xuICAgICAgdmFyIGluc3RhbmNlID0gbmV3IENvbnN0cnVjdG9yKCk7XG4gICAgICBpZiAoQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihpbnN0YW5jZSwgQ2xhc3MucHJvdG90eXBlKTtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF9jb25zdHJ1Y3QuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX2lzTmF0aXZlRnVuY3Rpb24oZm4pIHtcbiAgcmV0dXJuIEZ1bmN0aW9uLnRvU3RyaW5nLmNhbGwoZm4pLmluZGV4T2YoXCJbbmF0aXZlIGNvZGVdXCIpICE9PSAtMTtcbn1cblxuZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcihDbGFzcykge1xuICB2YXIgX2NhY2hlID0gdHlwZW9mIE1hcCA9PT0gXCJmdW5jdGlvblwiID8gbmV3IE1hcCgpIDogdW5kZWZpbmVkO1xuXG4gIF93cmFwTmF0aXZlU3VwZXIgPSBmdW5jdGlvbiBfd3JhcE5hdGl2ZVN1cGVyKENsYXNzKSB7XG4gICAgaWYgKENsYXNzID09PSBudWxsIHx8ICFfaXNOYXRpdmVGdW5jdGlvbihDbGFzcykpIHJldHVybiBDbGFzcztcblxuICAgIGlmICh0eXBlb2YgQ2xhc3MgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgX2NhY2hlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoX2NhY2hlLmhhcyhDbGFzcykpIHJldHVybiBfY2FjaGUuZ2V0KENsYXNzKTtcblxuICAgICAgX2NhY2hlLnNldChDbGFzcywgV3JhcHBlcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gV3JhcHBlcigpIHtcbiAgICAgIHJldHVybiBfY29uc3RydWN0KENsYXNzLCBhcmd1bWVudHMsIF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3Rvcik7XG4gICAgfVxuXG4gICAgV3JhcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKENsYXNzLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IFdyYXBwZXIsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihXcmFwcGVyLCBDbGFzcyk7XG4gIH07XG5cbiAgcmV0dXJuIF93cmFwTmF0aXZlU3VwZXIoQ2xhc3MpO1xufVxuXG4vKiBlc2xpbnQgbm8tY29uc29sZTowICovXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbnZhciB3YXJuaW5nID0gZnVuY3Rpb24gd2FybmluZygpIHt9OyAvLyBkb24ndCBwcmludCB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiBpbiBwcm9kdWN0aW9uIGVudiBvciBub2RlIHJ1bnRpbWVcblxuaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVudiAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgd2FybmluZyA9IGZ1bmN0aW9uIHdhcm5pbmcodHlwZSwgZXJyb3JzKSB7XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiBjb25zb2xlLndhcm4gJiYgdHlwZW9mIEFTWU5DX1ZBTElEQVRPUl9OT19XQVJOSU5HID09PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKGVycm9ycy5ldmVyeShmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGUgPT09ICdzdHJpbmcnO1xuICAgICAgfSkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKHR5cGUsIGVycm9ycyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0RmllbGRzRXJyb3IoZXJyb3JzKSB7XG4gIGlmICghZXJyb3JzIHx8ICFlcnJvcnMubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgdmFyIGZpZWxkcyA9IHt9O1xuICBlcnJvcnMuZm9yRWFjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICB2YXIgZmllbGQgPSBlcnJvci5maWVsZDtcbiAgICBmaWVsZHNbZmllbGRdID0gZmllbGRzW2ZpZWxkXSB8fCBbXTtcbiAgICBmaWVsZHNbZmllbGRdLnB1c2goZXJyb3IpO1xuICB9KTtcbiAgcmV0dXJuIGZpZWxkcztcbn1cbmZ1bmN0aW9uIGZvcm1hdCh0ZW1wbGF0ZSkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICB2YXIgaSA9IDA7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcblxuICBpZiAodHlwZW9mIHRlbXBsYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRlbXBsYXRlLmFwcGx5KG51bGwsIGFyZ3MpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0ZW1wbGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgc3RyID0gdGVtcGxhdGUucmVwbGFjZShmb3JtYXRSZWdFeHAsIGZ1bmN0aW9uICh4KSB7XG4gICAgICBpZiAoeCA9PT0gJyUlJykge1xuICAgICAgICByZXR1cm4gJyUnO1xuICAgICAgfVxuXG4gICAgICBpZiAoaSA+PSBsZW4pIHtcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoeCkge1xuICAgICAgICBjYXNlICclcyc6XG4gICAgICAgICAgcmV0dXJuIFN0cmluZyhhcmdzW2krK10pO1xuXG4gICAgICAgIGNhc2UgJyVkJzpcbiAgICAgICAgICByZXR1cm4gTnVtYmVyKGFyZ3NbaSsrXSk7XG5cbiAgICAgICAgY2FzZSAnJWonOlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcbiAgICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1tDaXJjdWxhcl0nO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHg7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIHJldHVybiB0ZW1wbGF0ZTtcbn1cblxuZnVuY3Rpb24gaXNOYXRpdmVTdHJpbmdUeXBlKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGUgPT09ICd1cmwnIHx8IHR5cGUgPT09ICdoZXgnIHx8IHR5cGUgPT09ICdlbWFpbCcgfHwgdHlwZSA9PT0gJ2RhdGUnIHx8IHR5cGUgPT09ICdwYXR0ZXJuJztcbn1cblxuZnVuY3Rpb24gaXNFbXB0eVZhbHVlKHZhbHVlLCB0eXBlKSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZSA9PT0gJ2FycmF5JyAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiAhdmFsdWUubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoaXNOYXRpdmVTdHJpbmdUeXBlKHR5cGUpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgIXZhbHVlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGFzeW5jUGFyYWxsZWxBcnJheShhcnIsIGZ1bmMsIGNhbGxiYWNrKSB7XG4gIHZhciByZXN1bHRzID0gW107XG4gIHZhciB0b3RhbCA9IDA7XG4gIHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoO1xuXG4gIGZ1bmN0aW9uIGNvdW50KGVycm9ycykge1xuICAgIHJlc3VsdHMucHVzaC5hcHBseShyZXN1bHRzLCBlcnJvcnMgfHwgW10pO1xuICAgIHRvdGFsKys7XG5cbiAgICBpZiAodG90YWwgPT09IGFyckxlbmd0aCkge1xuICAgICAgY2FsbGJhY2socmVzdWx0cyk7XG4gICAgfVxuICB9XG5cbiAgYXJyLmZvckVhY2goZnVuY3Rpb24gKGEpIHtcbiAgICBmdW5jKGEsIGNvdW50KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFzeW5jU2VyaWFsQXJyYXkoYXJyLCBmdW5jLCBjYWxsYmFjaykge1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aDtcblxuICBmdW5jdGlvbiBuZXh0KGVycm9ycykge1xuICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCkge1xuICAgICAgY2FsbGJhY2soZXJyb3JzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgb3JpZ2luYWwgPSBpbmRleDtcbiAgICBpbmRleCA9IGluZGV4ICsgMTtcblxuICAgIGlmIChvcmlnaW5hbCA8IGFyckxlbmd0aCkge1xuICAgICAgZnVuYyhhcnJbb3JpZ2luYWxdLCBuZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbGJhY2soW10pO1xuICAgIH1cbiAgfVxuXG4gIG5leHQoW10pO1xufVxuXG5mdW5jdGlvbiBmbGF0dGVuT2JqQXJyKG9iakFycikge1xuICB2YXIgcmV0ID0gW107XG4gIE9iamVjdC5rZXlzKG9iakFycikuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgIHJldC5wdXNoLmFwcGx5KHJldCwgb2JqQXJyW2tdIHx8IFtdKTtcbiAgfSk7XG4gIHJldHVybiByZXQ7XG59XG5cbnZhciBBc3luY1ZhbGlkYXRpb25FcnJvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Vycm9yKSB7XG4gIF9pbmhlcml0c0xvb3NlKEFzeW5jVmFsaWRhdGlvbkVycm9yLCBfRXJyb3IpO1xuXG4gIGZ1bmN0aW9uIEFzeW5jVmFsaWRhdGlvbkVycm9yKGVycm9ycywgZmllbGRzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX3RoaXMgPSBfRXJyb3IuY2FsbCh0aGlzLCAnQXN5bmMgVmFsaWRhdGlvbiBFcnJvcicpIHx8IHRoaXM7XG4gICAgX3RoaXMuZXJyb3JzID0gZXJyb3JzO1xuICAgIF90aGlzLmZpZWxkcyA9IGZpZWxkcztcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICByZXR1cm4gQXN5bmNWYWxpZGF0aW9uRXJyb3I7XG59KCAvKiNfX1BVUkVfXyovX3dyYXBOYXRpdmVTdXBlcihFcnJvcikpO1xuZnVuY3Rpb24gYXN5bmNNYXAob2JqQXJyLCBvcHRpb24sIGZ1bmMsIGNhbGxiYWNrLCBzb3VyY2UpIHtcbiAgaWYgKG9wdGlvbi5maXJzdCkge1xuICAgIHZhciBfcGVuZGluZyA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBuZXh0ID0gZnVuY3Rpb24gbmV4dChlcnJvcnMpIHtcbiAgICAgICAgY2FsbGJhY2soZXJyb3JzKTtcbiAgICAgICAgcmV0dXJuIGVycm9ycy5sZW5ndGggPyByZWplY3QobmV3IEFzeW5jVmFsaWRhdGlvbkVycm9yKGVycm9ycywgY29udmVydEZpZWxkc0Vycm9yKGVycm9ycykpKSA6IHJlc29sdmUoc291cmNlKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBmbGF0dGVuQXJyID0gZmxhdHRlbk9iakFycihvYmpBcnIpO1xuICAgICAgYXN5bmNTZXJpYWxBcnJheShmbGF0dGVuQXJyLCBmdW5jLCBuZXh0KTtcbiAgICB9KTtcblxuICAgIF9wZW5kaW5nW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIF9wZW5kaW5nO1xuICB9XG5cbiAgdmFyIGZpcnN0RmllbGRzID0gb3B0aW9uLmZpcnN0RmllbGRzID09PSB0cnVlID8gT2JqZWN0LmtleXMob2JqQXJyKSA6IG9wdGlvbi5maXJzdEZpZWxkcyB8fCBbXTtcbiAgdmFyIG9iakFycktleXMgPSBPYmplY3Qua2V5cyhvYmpBcnIpO1xuICB2YXIgb2JqQXJyTGVuZ3RoID0gb2JqQXJyS2V5cy5sZW5ndGg7XG4gIHZhciB0b3RhbCA9IDA7XG4gIHZhciByZXN1bHRzID0gW107XG4gIHZhciBwZW5kaW5nID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciBuZXh0ID0gZnVuY3Rpb24gbmV4dChlcnJvcnMpIHtcbiAgICAgIHJlc3VsdHMucHVzaC5hcHBseShyZXN1bHRzLCBlcnJvcnMpO1xuICAgICAgdG90YWwrKztcblxuICAgICAgaWYgKHRvdGFsID09PSBvYmpBcnJMZW5ndGgpIHtcbiAgICAgICAgY2FsbGJhY2socmVzdWx0cyk7XG4gICAgICAgIHJldHVybiByZXN1bHRzLmxlbmd0aCA/IHJlamVjdChuZXcgQXN5bmNWYWxpZGF0aW9uRXJyb3IocmVzdWx0cywgY29udmVydEZpZWxkc0Vycm9yKHJlc3VsdHMpKSkgOiByZXNvbHZlKHNvdXJjZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmICghb2JqQXJyS2V5cy5sZW5ndGgpIHtcbiAgICAgIGNhbGxiYWNrKHJlc3VsdHMpO1xuICAgICAgcmVzb2x2ZShzb3VyY2UpO1xuICAgIH1cblxuICAgIG9iakFycktleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgYXJyID0gb2JqQXJyW2tleV07XG5cbiAgICAgIGlmIChmaXJzdEZpZWxkcy5pbmRleE9mKGtleSkgIT09IC0xKSB7XG4gICAgICAgIGFzeW5jU2VyaWFsQXJyYXkoYXJyLCBmdW5jLCBuZXh0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFzeW5jUGFyYWxsZWxBcnJheShhcnIsIGZ1bmMsIG5leHQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgcGVuZGluZ1tcImNhdGNoXCJdKGZ1bmN0aW9uIChlKSB7XG4gICAgcmV0dXJuIGU7XG4gIH0pO1xuICByZXR1cm4gcGVuZGluZztcbn1cblxuZnVuY3Rpb24gaXNFcnJvck9iaihvYmopIHtcbiAgcmV0dXJuICEhKG9iaiAmJiBvYmoubWVzc2FnZSAhPT0gdW5kZWZpbmVkKTtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWUodmFsdWUsIHBhdGgpIHtcbiAgdmFyIHYgPSB2YWx1ZTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAodiA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB2O1xuICAgIH1cblxuICAgIHYgPSB2W3BhdGhbaV1dO1xuICB9XG5cbiAgcmV0dXJuIHY7XG59XG5cbmZ1bmN0aW9uIGNvbXBsZW1lbnRFcnJvcihydWxlLCBzb3VyY2UpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvZSkge1xuICAgIHZhciBmaWVsZFZhbHVlO1xuXG4gICAgaWYgKHJ1bGUuZnVsbEZpZWxkcykge1xuICAgICAgZmllbGRWYWx1ZSA9IGdldFZhbHVlKHNvdXJjZSwgcnVsZS5mdWxsRmllbGRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmllbGRWYWx1ZSA9IHNvdXJjZVtvZS5maWVsZCB8fCBydWxlLmZ1bGxGaWVsZF07XG4gICAgfVxuXG4gICAgaWYgKGlzRXJyb3JPYmoob2UpKSB7XG4gICAgICBvZS5maWVsZCA9IG9lLmZpZWxkIHx8IHJ1bGUuZnVsbEZpZWxkO1xuICAgICAgb2UuZmllbGRWYWx1ZSA9IGZpZWxkVmFsdWU7XG4gICAgICByZXR1cm4gb2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IHR5cGVvZiBvZSA9PT0gJ2Z1bmN0aW9uJyA/IG9lKCkgOiBvZSxcbiAgICAgIGZpZWxkVmFsdWU6IGZpZWxkVmFsdWUsXG4gICAgICBmaWVsZDogb2UuZmllbGQgfHwgcnVsZS5mdWxsRmllbGRcbiAgICB9O1xuICB9O1xufVxuZnVuY3Rpb24gZGVlcE1lcmdlKHRhcmdldCwgc291cmNlKSB7XG4gIGlmIChzb3VyY2UpIHtcbiAgICBmb3IgKHZhciBzIGluIHNvdXJjZSkge1xuICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShzKSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2Vbc107XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHRhcmdldFtzXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0YXJnZXRbc10gPSBfZXh0ZW5kcyh7fSwgdGFyZ2V0W3NdLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0W3NdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG52YXIgcmVxdWlyZWQkMSA9IGZ1bmN0aW9uIHJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucywgdHlwZSkge1xuICBpZiAocnVsZS5yZXF1aXJlZCAmJiAoIXNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKSB8fCBpc0VtcHR5VmFsdWUodmFsdWUsIHR5cGUgfHwgcnVsZS50eXBlKSkpIHtcbiAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy5yZXF1aXJlZCwgcnVsZS5mdWxsRmllbGQpKTtcbiAgfVxufTtcblxuLyoqXG4gKiAgUnVsZSBmb3IgdmFsaWRhdGluZyB3aGl0ZXNwYWNlLlxuICpcbiAqICBAcGFyYW0gcnVsZSBUaGUgdmFsaWRhdGlvbiBydWxlLlxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxuICogIEBwYXJhbSBlcnJvcnMgQW4gYXJyYXkgb2YgZXJyb3JzIHRoYXQgdGhpcyBydWxlIG1heSBhZGRcbiAqICB2YWxpZGF0aW9uIGVycm9ycyB0by5cbiAqICBAcGFyYW0gb3B0aW9ucyBUaGUgdmFsaWRhdGlvbiBvcHRpb25zLlxuICogIEBwYXJhbSBvcHRpb25zLm1lc3NhZ2VzIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxuICovXG5cbnZhciB3aGl0ZXNwYWNlID0gZnVuY3Rpb24gd2hpdGVzcGFjZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpIHtcbiAgaWYgKC9eXFxzKyQvLnRlc3QodmFsdWUpIHx8IHZhbHVlID09PSAnJykge1xuICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLndoaXRlc3BhY2UsIHJ1bGUuZnVsbEZpZWxkKSk7XG4gIH1cbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9rZXZ2YS91cmwtcmVnZXgvYmxvYi9tYXN0ZXIvaW5kZXguanNcbnZhciB1cmxSZWc7XG52YXIgZ2V0VXJsUmVnZXggPSAoZnVuY3Rpb24gKCkge1xuICBpZiAodXJsUmVnKSB7XG4gICAgcmV0dXJuIHVybFJlZztcbiAgfVxuXG4gIHZhciB3b3JkID0gJ1thLWZBLUZcXFxcZDpdJztcblxuICB2YXIgYiA9IGZ1bmN0aW9uIGIob3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zICYmIG9wdGlvbnMuaW5jbHVkZUJvdW5kYXJpZXMgPyBcIig/Oig/PD1cXFxcc3xeKSg/PVwiICsgd29yZCArIFwiKXwoPzw9XCIgKyB3b3JkICsgXCIpKD89XFxcXHN8JCkpXCIgOiAnJztcbiAgfTtcblxuICB2YXIgdjQgPSAnKD86MjVbMC01XXwyWzAtNF1cXFxcZHwxXFxcXGRcXFxcZHxbMS05XVxcXFxkfFxcXFxkKSg/OlxcXFwuKD86MjVbMC01XXwyWzAtNF1cXFxcZHwxXFxcXGRcXFxcZHxbMS05XVxcXFxkfFxcXFxkKSl7M30nO1xuICB2YXIgdjZzZWcgPSAnW2EtZkEtRlxcXFxkXXsxLDR9JztcbiAgdmFyIHY2ID0gKFwiXFxuKD86XFxuKD86XCIgKyB2NnNlZyArIFwiOil7N30oPzpcIiArIHY2c2VnICsgXCJ8Oil8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMToyOjM6NDo1OjY6Nzo6ICAxOjI6Mzo0OjU6Njo3OjhcXG4oPzpcIiArIHY2c2VnICsgXCI6KXs2fSg/OlwiICsgdjQgKyBcInw6XCIgKyB2NnNlZyArIFwifDopfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMToyOjM6NDo1OjY6OiAgICAxOjI6Mzo0OjU6Njo6OCAgIDE6MjozOjQ6NTo2Ojo4ICAxOjI6Mzo0OjU6Njo6MS4yLjMuNFxcbig/OlwiICsgdjZzZWcgKyBcIjopezV9KD86OlwiICsgdjQgKyBcInwoPzo6XCIgKyB2NnNlZyArIFwiKXsxLDJ9fDopfCAgICAgICAgICAgICAgICAgICAvLyAxOjI6Mzo0OjU6OiAgICAgIDE6MjozOjQ6NTo6Nzo4ICAgMToyOjM6NDo1Ojo4ICAgIDE6MjozOjQ6NTo6NzoxLjIuMy40XFxuKD86XCIgKyB2NnNlZyArIFwiOil7NH0oPzooPzo6XCIgKyB2NnNlZyArIFwiKXswLDF9OlwiICsgdjQgKyBcInwoPzo6XCIgKyB2NnNlZyArIFwiKXsxLDN9fDopfCAvLyAxOjI6Mzo0OjogICAgICAgIDE6MjozOjQ6OjY6Nzo4ICAgMToyOjM6NDo6OCAgICAgIDE6MjozOjQ6OjY6NzoxLjIuMy40XFxuKD86XCIgKyB2NnNlZyArIFwiOil7M30oPzooPzo6XCIgKyB2NnNlZyArIFwiKXswLDJ9OlwiICsgdjQgKyBcInwoPzo6XCIgKyB2NnNlZyArIFwiKXsxLDR9fDopfCAvLyAxOjI6Mzo6ICAgICAgICAgIDE6MjozOjo1OjY6Nzo4ICAgMToyOjM6OjggICAgICAgIDE6MjozOjo1OjY6NzoxLjIuMy40XFxuKD86XCIgKyB2NnNlZyArIFwiOil7Mn0oPzooPzo6XCIgKyB2NnNlZyArIFwiKXswLDN9OlwiICsgdjQgKyBcInwoPzo6XCIgKyB2NnNlZyArIFwiKXsxLDV9fDopfCAvLyAxOjI6OiAgICAgICAgICAgIDE6Mjo6NDo1OjY6Nzo4ICAgMToyOjo4ICAgICAgICAgIDE6Mjo6NDo1OjY6NzoxLjIuMy40XFxuKD86XCIgKyB2NnNlZyArIFwiOil7MX0oPzooPzo6XCIgKyB2NnNlZyArIFwiKXswLDR9OlwiICsgdjQgKyBcInwoPzo6XCIgKyB2NnNlZyArIFwiKXsxLDZ9fDopfCAvLyAxOjogICAgICAgICAgICAgIDE6OjM6NDo1OjY6Nzo4ICAgMTo6OCAgICAgICAgICAgIDE6OjM6NDo1OjY6NzoxLjIuMy40XFxuKD86Oig/Oig/OjpcIiArIHY2c2VnICsgXCIpezAsNX06XCIgKyB2NCArIFwifCg/OjpcIiArIHY2c2VnICsgXCIpezEsN318OikpICAgICAgICAgICAgIC8vIDo6MjozOjQ6NTo2Ojc6OCAgOjoyOjM6NDo1OjY6Nzo4ICA6OjggICAgICAgICAgICAgOjoxLjIuMy40XFxuKSg/OiVbMC05YS16QS1aXXsxLH0pPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICVldGgwICAgICAgICAgICAgJTFcXG5cIikucmVwbGFjZSgvXFxzKlxcL1xcLy4qJC9nbSwgJycpLnJlcGxhY2UoL1xcbi9nLCAnJykudHJpbSgpOyAvLyBQcmUtY29tcGlsZSBvbmx5IHRoZSBleGFjdCByZWdleGVzIGJlY2F1c2UgYWRkaW5nIGEgZ2xvYmFsIGZsYWcgbWFrZSByZWdleGVzIHN0YXRlZnVsXG5cbiAgdmFyIHY0NkV4YWN0ID0gbmV3IFJlZ0V4cChcIig/Ol5cIiArIHY0ICsgXCIkKXwoPzpeXCIgKyB2NiArIFwiJClcIik7XG4gIHZhciB2NGV4YWN0ID0gbmV3IFJlZ0V4cChcIl5cIiArIHY0ICsgXCIkXCIpO1xuICB2YXIgdjZleGFjdCA9IG5ldyBSZWdFeHAoXCJeXCIgKyB2NiArIFwiJFwiKTtcblxuICB2YXIgaXAgPSBmdW5jdGlvbiBpcChvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMgJiYgb3B0aW9ucy5leGFjdCA/IHY0NkV4YWN0IDogbmV3IFJlZ0V4cChcIig/OlwiICsgYihvcHRpb25zKSArIHY0ICsgYihvcHRpb25zKSArIFwiKXwoPzpcIiArIGIob3B0aW9ucykgKyB2NiArIGIob3B0aW9ucykgKyBcIilcIiwgJ2cnKTtcbiAgfTtcblxuICBpcC52NCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMgJiYgb3B0aW9ucy5leGFjdCA/IHY0ZXhhY3QgOiBuZXcgUmVnRXhwKFwiXCIgKyBiKG9wdGlvbnMpICsgdjQgKyBiKG9wdGlvbnMpLCAnZycpO1xuICB9O1xuXG4gIGlwLnY2ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3B0aW9ucyAmJiBvcHRpb25zLmV4YWN0ID8gdjZleGFjdCA6IG5ldyBSZWdFeHAoXCJcIiArIGIob3B0aW9ucykgKyB2NiArIGIob3B0aW9ucyksICdnJyk7XG4gIH07XG5cbiAgdmFyIHByb3RvY29sID0gXCIoPzooPzpbYS16XSs6KT8vLylcIjtcbiAgdmFyIGF1dGggPSAnKD86XFxcXFMrKD86OlxcXFxTKik/QCk/JztcbiAgdmFyIGlwdjQgPSBpcC52NCgpLnNvdXJjZTtcbiAgdmFyIGlwdjYgPSBpcC52NigpLnNvdXJjZTtcbiAgdmFyIGhvc3QgPSBcIig/Oig/OlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XVstX10qKSpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rKVwiO1xuICB2YXIgZG9tYWluID0gXCIoPzpcXFxcLig/OlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XS0qKSpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rKSpcIjtcbiAgdmFyIHRsZCA9IFwiKD86XFxcXC4oPzpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZl17Mix9KSlcIjtcbiAgdmFyIHBvcnQgPSAnKD86OlxcXFxkezIsNX0pPyc7XG4gIHZhciBwYXRoID0gJyg/OlsvPyNdW15cXFxcc1wiXSopPyc7XG4gIHZhciByZWdleCA9IFwiKD86XCIgKyBwcm90b2NvbCArIFwifHd3d1xcXFwuKVwiICsgYXV0aCArIFwiKD86bG9jYWxob3N0fFwiICsgaXB2NCArIFwifFwiICsgaXB2NiArIFwifFwiICsgaG9zdCArIGRvbWFpbiArIHRsZCArIFwiKVwiICsgcG9ydCArIHBhdGg7XG4gIHVybFJlZyA9IG5ldyBSZWdFeHAoXCIoPzpeXCIgKyByZWdleCArIFwiJClcIiwgJ2knKTtcbiAgcmV0dXJuIHVybFJlZztcbn0pO1xuXG4vKiBlc2xpbnQgbWF4LWxlbjowICovXG5cbnZhciBwYXR0ZXJuJDIgPSB7XG4gIC8vIGh0dHA6Ly9lbWFpbHJlZ2V4LmNvbS9cbiAgZW1haWw6IC9eKChbXjw+KClcXFtcXF1cXFxcLiw7Olxcc0BcIl0rKFxcLltePD4oKVxcW1xcXVxcXFwuLDs6XFxzQFwiXSspKil8KFwiLitcIikpQCgoXFxbWzAtOV17MSwzfVxcLlswLTldezEsM31cXC5bMC05XXsxLDN9XFwuWzAtOV17MSwzfV0pfCgoW2EtekEtWlxcLTAtOVxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0rXFwuKStbYS16QS1aXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXXsyLH0pKSQvLFxuICAvLyB1cmw6IG5ldyBSZWdFeHAoXG4gIC8vICAgJ14oPyFtYWlsdG86KSg/Oig/Omh0dHB8aHR0cHN8ZnRwKTovL3wvLykoPzpcXFxcUysoPzo6XFxcXFMqKT9AKT8oPzooPzooPzpbMS05XVxcXFxkP3wxXFxcXGRcXFxcZHwyWzAxXVxcXFxkfDIyWzAtM10pKD86XFxcXC4oPzoxP1xcXFxkezEsMn18MlswLTRdXFxcXGR8MjVbMC01XSkpezJ9KD86XFxcXC4oPzpbMC05XVxcXFxkP3wxXFxcXGRcXFxcZHwyWzAtNF1cXFxcZHwyNVswLTRdKSl8KD86KD86W2EtelxcXFx1MDBhMS1cXFxcdWZmZmYwLTldKy0qKSpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rKSg/OlxcXFwuKD86W2EtelxcXFx1MDBhMS1cXFxcdWZmZmYwLTldKy0qKSpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rKSooPzpcXFxcLig/OlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmXXsyLH0pKSl8bG9jYWxob3N0KSg/OjpcXFxcZHsyLDV9KT8oPzooL3xcXFxcP3wjKVteXFxcXHNdKik/JCcsXG4gIC8vICAgJ2knLFxuICAvLyApLFxuICBoZXg6IC9eIz8oW2EtZjAtOV17Nn18W2EtZjAtOV17M30pJC9pXG59O1xudmFyIHR5cGVzID0ge1xuICBpbnRlZ2VyOiBmdW5jdGlvbiBpbnRlZ2VyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVzLm51bWJlcih2YWx1ZSkgJiYgcGFyc2VJbnQodmFsdWUsIDEwKSA9PT0gdmFsdWU7XG4gIH0sXG4gIFwiZmxvYXRcIjogZnVuY3Rpb24gZmxvYXQodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZXMubnVtYmVyKHZhbHVlKSAmJiAhdHlwZXMuaW50ZWdlcih2YWx1ZSk7XG4gIH0sXG4gIGFycmF5OiBmdW5jdGlvbiBhcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgfSxcbiAgcmVnZXhwOiBmdW5jdGlvbiByZWdleHAodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISFuZXcgUmVnRXhwKHZhbHVlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxuICBkYXRlOiBmdW5jdGlvbiBkYXRlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZS5nZXRUaW1lID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZS5nZXRNb250aCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUuZ2V0WWVhciA9PT0gJ2Z1bmN0aW9uJyAmJiAhaXNOYU4odmFsdWUuZ2V0VGltZSgpKTtcbiAgfSxcbiAgbnVtYmVyOiBmdW5jdGlvbiBudW1iZXIodmFsdWUpIHtcbiAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gIH0sXG4gIG9iamVjdDogZnVuY3Rpb24gb2JqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIXR5cGVzLmFycmF5KHZhbHVlKTtcbiAgfSxcbiAgbWV0aG9kOiBmdW5jdGlvbiBtZXRob2QodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xuICB9LFxuICBlbWFpbDogZnVuY3Rpb24gZW1haWwodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPD0gMzIwICYmICEhdmFsdWUubWF0Y2gocGF0dGVybiQyLmVtYWlsKTtcbiAgfSxcbiAgdXJsOiBmdW5jdGlvbiB1cmwodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPD0gMjA0OCAmJiAhIXZhbHVlLm1hdGNoKGdldFVybFJlZ2V4KCkpO1xuICB9LFxuICBoZXg6IGZ1bmN0aW9uIGhleCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICEhdmFsdWUubWF0Y2gocGF0dGVybiQyLmhleCk7XG4gIH1cbn07XG5cbnZhciB0eXBlJDEgPSBmdW5jdGlvbiB0eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucykge1xuICBpZiAocnVsZS5yZXF1aXJlZCAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmVxdWlyZWQkMShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBjdXN0b20gPSBbJ2ludGVnZXInLCAnZmxvYXQnLCAnYXJyYXknLCAncmVnZXhwJywgJ29iamVjdCcsICdtZXRob2QnLCAnZW1haWwnLCAnbnVtYmVyJywgJ2RhdGUnLCAndXJsJywgJ2hleCddO1xuICB2YXIgcnVsZVR5cGUgPSBydWxlLnR5cGU7XG5cbiAgaWYgKGN1c3RvbS5pbmRleE9mKHJ1bGVUeXBlKSA+IC0xKSB7XG4gICAgaWYgKCF0eXBlc1tydWxlVHlwZV0odmFsdWUpKSB7XG4gICAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy50eXBlc1tydWxlVHlwZV0sIHJ1bGUuZnVsbEZpZWxkLCBydWxlLnR5cGUpKTtcbiAgICB9IC8vIHN0cmFpZ2h0IHR5cGVvZiBjaGVja1xuXG4gIH0gZWxzZSBpZiAocnVsZVR5cGUgJiYgdHlwZW9mIHZhbHVlICE9PSBydWxlLnR5cGUpIHtcbiAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy50eXBlc1tydWxlVHlwZV0sIHJ1bGUuZnVsbEZpZWxkLCBydWxlLnR5cGUpKTtcbiAgfVxufTtcblxudmFyIHJhbmdlID0gZnVuY3Rpb24gcmFuZ2UocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKSB7XG4gIHZhciBsZW4gPSB0eXBlb2YgcnVsZS5sZW4gPT09ICdudW1iZXInO1xuICB2YXIgbWluID0gdHlwZW9mIHJ1bGUubWluID09PSAnbnVtYmVyJztcbiAgdmFyIG1heCA9IHR5cGVvZiBydWxlLm1heCA9PT0gJ251bWJlcic7IC8vIOato+WImeWMuemFjeeggeeCueiMg+WbtOS7jlUrMDEwMDAw5LiA55u05YiwVSsxMEZGRkbnmoTmloflrZfvvIjooaXlhYXlubPpnaJTdXBwbGVtZW50YXJ5IFBsYW5l77yJXG5cbiAgdmFyIHNwUmVnZXhwID0gL1tcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl0vZztcbiAgdmFyIHZhbCA9IHZhbHVlO1xuICB2YXIga2V5ID0gbnVsbDtcbiAgdmFyIG51bSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gIHZhciBzdHIgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICB2YXIgYXJyID0gQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG5cbiAgaWYgKG51bSkge1xuICAgIGtleSA9ICdudW1iZXInO1xuICB9IGVsc2UgaWYgKHN0cikge1xuICAgIGtleSA9ICdzdHJpbmcnO1xuICB9IGVsc2UgaWYgKGFycikge1xuICAgIGtleSA9ICdhcnJheSc7XG4gIH0gLy8gaWYgdGhlIHZhbHVlIGlzIG5vdCBvZiBhIHN1cHBvcnRlZCB0eXBlIGZvciByYW5nZSB2YWxpZGF0aW9uXG4gIC8vIHRoZSB2YWxpZGF0aW9uIHJ1bGUgcnVsZSBzaG91bGQgdXNlIHRoZVxuICAvLyB0eXBlIHByb3BlcnR5IHRvIGFsc28gdGVzdCBmb3IgYSBwYXJ0aWN1bGFyIHR5cGVcblxuXG4gIGlmICgha2V5KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGFycikge1xuICAgIHZhbCA9IHZhbHVlLmxlbmd0aDtcbiAgfVxuXG4gIGlmIChzdHIpIHtcbiAgICAvLyDlpITnkIbnoIHngrnlpKfkuo5VKzAxMDAwMOeahOaWh+Wtl2xlbmd0aOWxnuaAp+S4jeWHhuehrueahGJ1Z++8jOWmglwi8KCut/CgrrfwoK63XCIubGVuZ2h0ICE9PSAzXG4gICAgdmFsID0gdmFsdWUucmVwbGFjZShzcFJlZ2V4cCwgJ18nKS5sZW5ndGg7XG4gIH1cblxuICBpZiAobGVuKSB7XG4gICAgaWYgKHZhbCAhPT0gcnVsZS5sZW4pIHtcbiAgICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzW2tleV0ubGVuLCBydWxlLmZ1bGxGaWVsZCwgcnVsZS5sZW4pKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAobWluICYmICFtYXggJiYgdmFsIDwgcnVsZS5taW4pIHtcbiAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlc1trZXldLm1pbiwgcnVsZS5mdWxsRmllbGQsIHJ1bGUubWluKSk7XG4gIH0gZWxzZSBpZiAobWF4ICYmICFtaW4gJiYgdmFsID4gcnVsZS5tYXgpIHtcbiAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlc1trZXldLm1heCwgcnVsZS5mdWxsRmllbGQsIHJ1bGUubWF4KSk7XG4gIH0gZWxzZSBpZiAobWluICYmIG1heCAmJiAodmFsIDwgcnVsZS5taW4gfHwgdmFsID4gcnVsZS5tYXgpKSB7XG4gICAgZXJyb3JzLnB1c2goZm9ybWF0KG9wdGlvbnMubWVzc2FnZXNba2V5XS5yYW5nZSwgcnVsZS5mdWxsRmllbGQsIHJ1bGUubWluLCBydWxlLm1heCkpO1xuICB9XG59O1xuXG52YXIgRU5VTSQxID0gJ2VudW0nO1xuXG52YXIgZW51bWVyYWJsZSQxID0gZnVuY3Rpb24gZW51bWVyYWJsZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpIHtcbiAgcnVsZVtFTlVNJDFdID0gQXJyYXkuaXNBcnJheShydWxlW0VOVU0kMV0pID8gcnVsZVtFTlVNJDFdIDogW107XG5cbiAgaWYgKHJ1bGVbRU5VTSQxXS5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHtcbiAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlc1tFTlVNJDFdLCBydWxlLmZ1bGxGaWVsZCwgcnVsZVtFTlVNJDFdLmpvaW4oJywgJykpKTtcbiAgfVxufTtcblxudmFyIHBhdHRlcm4kMSA9IGZ1bmN0aW9uIHBhdHRlcm4ocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKSB7XG4gIGlmIChydWxlLnBhdHRlcm4pIHtcbiAgICBpZiAocnVsZS5wYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAvLyBpZiBhIFJlZ0V4cCBpbnN0YW5jZSBpcyBwYXNzZWQsIHJlc2V0IGBsYXN0SW5kZXhgIGluIGNhc2UgaXRzIGBnbG9iYWxgXG4gICAgICAvLyBmbGFnIGlzIGFjY2lkZW50YWxseSBzZXQgdG8gYHRydWVgLCB3aGljaCBpbiBhIHZhbGlkYXRpb24gc2NlbmFyaW9cbiAgICAgIC8vIGlzIG5vdCBuZWNlc3NhcnkgYW5kIHRoZSByZXN1bHQgbWlnaHQgYmUgbWlzbGVhZGluZ1xuICAgICAgcnVsZS5wYXR0ZXJuLmxhc3RJbmRleCA9IDA7XG5cbiAgICAgIGlmICghcnVsZS5wYXR0ZXJuLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLnBhdHRlcm4ubWlzbWF0Y2gsIHJ1bGUuZnVsbEZpZWxkLCB2YWx1ZSwgcnVsZS5wYXR0ZXJuKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcnVsZS5wYXR0ZXJuID09PSAnc3RyaW5nJykge1xuICAgICAgdmFyIF9wYXR0ZXJuID0gbmV3IFJlZ0V4cChydWxlLnBhdHRlcm4pO1xuXG4gICAgICBpZiAoIV9wYXR0ZXJuLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLnBhdHRlcm4ubWlzbWF0Y2gsIHJ1bGUuZnVsbEZpZWxkLCB2YWx1ZSwgcnVsZS5wYXR0ZXJuKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG52YXIgcnVsZXMgPSB7XG4gIHJlcXVpcmVkOiByZXF1aXJlZCQxLFxuICB3aGl0ZXNwYWNlOiB3aGl0ZXNwYWNlLFxuICB0eXBlOiB0eXBlJDEsXG4gIHJhbmdlOiByYW5nZSxcbiAgXCJlbnVtXCI6IGVudW1lcmFibGUkMSxcbiAgcGF0dGVybjogcGF0dGVybiQxXG59O1xuXG52YXIgc3RyaW5nID0gZnVuY3Rpb24gc3RyaW5nKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG5cbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSwgJ3N0cmluZycpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMsICdzdHJpbmcnKTtcblxuICAgIGlmICghaXNFbXB0eVZhbHVlKHZhbHVlLCAnc3RyaW5nJykpIHtcbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICAgIHJ1bGVzLnJhbmdlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgICBydWxlcy5wYXR0ZXJuKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG5cbiAgICAgIGlmIChydWxlLndoaXRlc3BhY2UgPT09IHRydWUpIHtcbiAgICAgICAgcnVsZXMud2hpdGVzcGFjZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgbWV0aG9kID0gZnVuY3Rpb24gbWV0aG9kKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG5cbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG5cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgbnVtYmVyID0gZnVuY3Rpb24gbnVtYmVyKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG5cbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG5cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgICAgcnVsZXMucmFuZ2UocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcblxudmFyIF9ib29sZWFuID0gZnVuY3Rpb24gX2Jvb2xlYW4ocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5cbnZhciByZWdleHAgPSBmdW5jdGlvbiByZWdleHAocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgIGlmICghaXNFbXB0eVZhbHVlKHZhbHVlKSkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgaW50ZWdlciA9IGZ1bmN0aW9uIGludGVnZXIocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgICBydWxlcy5yYW5nZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgZmxvYXRGbiA9IGZ1bmN0aW9uIGZsb2F0Rm4ocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgICBydWxlcy5yYW5nZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgYXJyYXkgPSBmdW5jdGlvbiBhcnJheShydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmICgodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucywgJ2FycmF5Jyk7XG5cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgICAgcnVsZXMucmFuZ2UocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcblxudmFyIG9iamVjdCA9IGZ1bmN0aW9uIG9iamVjdChydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcblxudmFyIEVOVU0gPSAnZW51bSc7XG5cbnZhciBlbnVtZXJhYmxlID0gZnVuY3Rpb24gZW51bWVyYWJsZShydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJ1bGVzW0VOVU1dKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5cbnZhciBwYXR0ZXJuID0gZnVuY3Rpb24gcGF0dGVybihydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUsICdzdHJpbmcnKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgIGlmICghaXNFbXB0eVZhbHVlKHZhbHVlLCAnc3RyaW5nJykpIHtcbiAgICAgIHJ1bGVzLnBhdHRlcm4ocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcblxudmFyIGRhdGUgPSBmdW5jdGlvbiBkYXRlKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIC8vIGNvbnNvbGUubG9nKCdpbnRlZ2VyIHJ1bGUgY2FsbGVkICVqJywgcnVsZSk7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7IC8vIGNvbnNvbGUubG9nKCd2YWxpZGF0ZSBvbiAlcyB2YWx1ZScsIHZhbHVlKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlLCAnZGF0ZScpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKCFpc0VtcHR5VmFsdWUodmFsdWUsICdkYXRlJykpIHtcbiAgICAgIHZhciBkYXRlT2JqZWN0O1xuXG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIGRhdGVPYmplY3QgPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGVPYmplY3QgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgZGF0ZU9iamVjdCwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgICBpZiAoZGF0ZU9iamVjdCkge1xuICAgICAgICBydWxlcy5yYW5nZShydWxlLCBkYXRlT2JqZWN0LmdldFRpbWUoKSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgcmVxdWlyZWQgPSBmdW5jdGlvbiByZXF1aXJlZChydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB0eXBlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyAnYXJyYXknIDogdHlwZW9mIHZhbHVlO1xuICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMsIHR5cGUpO1xuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcblxudmFyIHR5cGUgPSBmdW5jdGlvbiB0eXBlKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBydWxlVHlwZSA9IHJ1bGUudHlwZTtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlLCBydWxlVHlwZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucywgcnVsZVR5cGUpO1xuXG4gICAgaWYgKCFpc0VtcHR5VmFsdWUodmFsdWUsIHJ1bGVUeXBlKSkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgYW55ID0gZnVuY3Rpb24gYW55KHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG5cbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gIH1cblxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcblxudmFyIHZhbGlkYXRvcnMgPSB7XG4gIHN0cmluZzogc3RyaW5nLFxuICBtZXRob2Q6IG1ldGhvZCxcbiAgbnVtYmVyOiBudW1iZXIsXG4gIFwiYm9vbGVhblwiOiBfYm9vbGVhbixcbiAgcmVnZXhwOiByZWdleHAsXG4gIGludGVnZXI6IGludGVnZXIsXG4gIFwiZmxvYXRcIjogZmxvYXRGbixcbiAgYXJyYXk6IGFycmF5LFxuICBvYmplY3Q6IG9iamVjdCxcbiAgXCJlbnVtXCI6IGVudW1lcmFibGUsXG4gIHBhdHRlcm46IHBhdHRlcm4sXG4gIGRhdGU6IGRhdGUsXG4gIHVybDogdHlwZSxcbiAgaGV4OiB0eXBlLFxuICBlbWFpbDogdHlwZSxcbiAgcmVxdWlyZWQ6IHJlcXVpcmVkLFxuICBhbnk6IGFueVxufTtcblxuZnVuY3Rpb24gbmV3TWVzc2FnZXMoKSB7XG4gIHJldHVybiB7XG4gICAgXCJkZWZhdWx0XCI6ICdWYWxpZGF0aW9uIGVycm9yIG9uIGZpZWxkICVzJyxcbiAgICByZXF1aXJlZDogJyVzIGlzIHJlcXVpcmVkJyxcbiAgICBcImVudW1cIjogJyVzIG11c3QgYmUgb25lIG9mICVzJyxcbiAgICB3aGl0ZXNwYWNlOiAnJXMgY2Fubm90IGJlIGVtcHR5JyxcbiAgICBkYXRlOiB7XG4gICAgICBmb3JtYXQ6ICclcyBkYXRlICVzIGlzIGludmFsaWQgZm9yIGZvcm1hdCAlcycsXG4gICAgICBwYXJzZTogJyVzIGRhdGUgY291bGQgbm90IGJlIHBhcnNlZCwgJXMgaXMgaW52YWxpZCAnLFxuICAgICAgaW52YWxpZDogJyVzIGRhdGUgJXMgaXMgaW52YWxpZCdcbiAgICB9LFxuICAgIHR5cGVzOiB7XG4gICAgICBzdHJpbmc6ICclcyBpcyBub3QgYSAlcycsXG4gICAgICBtZXRob2Q6ICclcyBpcyBub3QgYSAlcyAoZnVuY3Rpb24pJyxcbiAgICAgIGFycmF5OiAnJXMgaXMgbm90IGFuICVzJyxcbiAgICAgIG9iamVjdDogJyVzIGlzIG5vdCBhbiAlcycsXG4gICAgICBudW1iZXI6ICclcyBpcyBub3QgYSAlcycsXG4gICAgICBkYXRlOiAnJXMgaXMgbm90IGEgJXMnLFxuICAgICAgXCJib29sZWFuXCI6ICclcyBpcyBub3QgYSAlcycsXG4gICAgICBpbnRlZ2VyOiAnJXMgaXMgbm90IGFuICVzJyxcbiAgICAgIFwiZmxvYXRcIjogJyVzIGlzIG5vdCBhICVzJyxcbiAgICAgIHJlZ2V4cDogJyVzIGlzIG5vdCBhIHZhbGlkICVzJyxcbiAgICAgIGVtYWlsOiAnJXMgaXMgbm90IGEgdmFsaWQgJXMnLFxuICAgICAgdXJsOiAnJXMgaXMgbm90IGEgdmFsaWQgJXMnLFxuICAgICAgaGV4OiAnJXMgaXMgbm90IGEgdmFsaWQgJXMnXG4gICAgfSxcbiAgICBzdHJpbmc6IHtcbiAgICAgIGxlbjogJyVzIG11c3QgYmUgZXhhY3RseSAlcyBjaGFyYWN0ZXJzJyxcbiAgICAgIG1pbjogJyVzIG11c3QgYmUgYXQgbGVhc3QgJXMgY2hhcmFjdGVycycsXG4gICAgICBtYXg6ICclcyBjYW5ub3QgYmUgbG9uZ2VyIHRoYW4gJXMgY2hhcmFjdGVycycsXG4gICAgICByYW5nZTogJyVzIG11c3QgYmUgYmV0d2VlbiAlcyBhbmQgJXMgY2hhcmFjdGVycydcbiAgICB9LFxuICAgIG51bWJlcjoge1xuICAgICAgbGVuOiAnJXMgbXVzdCBlcXVhbCAlcycsXG4gICAgICBtaW46ICclcyBjYW5ub3QgYmUgbGVzcyB0aGFuICVzJyxcbiAgICAgIG1heDogJyVzIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gJXMnLFxuICAgICAgcmFuZ2U6ICclcyBtdXN0IGJlIGJldHdlZW4gJXMgYW5kICVzJ1xuICAgIH0sXG4gICAgYXJyYXk6IHtcbiAgICAgIGxlbjogJyVzIG11c3QgYmUgZXhhY3RseSAlcyBpbiBsZW5ndGgnLFxuICAgICAgbWluOiAnJXMgY2Fubm90IGJlIGxlc3MgdGhhbiAlcyBpbiBsZW5ndGgnLFxuICAgICAgbWF4OiAnJXMgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiAlcyBpbiBsZW5ndGgnLFxuICAgICAgcmFuZ2U6ICclcyBtdXN0IGJlIGJldHdlZW4gJXMgYW5kICVzIGluIGxlbmd0aCdcbiAgICB9LFxuICAgIHBhdHRlcm46IHtcbiAgICAgIG1pc21hdGNoOiAnJXMgdmFsdWUgJXMgZG9lcyBub3QgbWF0Y2ggcGF0dGVybiAlcydcbiAgICB9LFxuICAgIGNsb25lOiBmdW5jdGlvbiBjbG9uZSgpIHtcbiAgICAgIHZhciBjbG9uZWQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMpKTtcbiAgICAgIGNsb25lZC5jbG9uZSA9IHRoaXMuY2xvbmU7XG4gICAgICByZXR1cm4gY2xvbmVkO1xuICAgIH1cbiAgfTtcbn1cbnZhciBtZXNzYWdlcyA9IG5ld01lc3NhZ2VzKCk7XG5cbi8qKlxuICogIEVuY2Fwc3VsYXRlcyBhIHZhbGlkYXRpb24gc2NoZW1hLlxuICpcbiAqICBAcGFyYW0gZGVzY3JpcHRvciBBbiBvYmplY3QgZGVjbGFyaW5nIHZhbGlkYXRpb24gcnVsZXNcbiAqICBmb3IgdGhpcyBzY2hlbWEuXG4gKi9cblxudmFyIFNjaGVtYSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gU3RhdGljID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IEluc3RhbmNlID09PT09PT09PT09PT09PT09PT09PT09PVxuICBmdW5jdGlvbiBTY2hlbWEoZGVzY3JpcHRvcikge1xuICAgIHRoaXMucnVsZXMgPSBudWxsO1xuICAgIHRoaXMuX21lc3NhZ2VzID0gbWVzc2FnZXM7XG4gICAgdGhpcy5kZWZpbmUoZGVzY3JpcHRvcik7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gU2NoZW1hLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZGVmaW5lID0gZnVuY3Rpb24gZGVmaW5lKHJ1bGVzKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIGlmICghcnVsZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbmZpZ3VyZSBhIHNjaGVtYSB3aXRoIG5vIHJ1bGVzJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBydWxlcyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShydWxlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUnVsZXMgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICB9XG5cbiAgICB0aGlzLnJ1bGVzID0ge307XG4gICAgT2JqZWN0LmtleXMocnVsZXMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciBpdGVtID0gcnVsZXNbbmFtZV07XG4gICAgICBfdGhpcy5ydWxlc1tuYW1lXSA9IEFycmF5LmlzQXJyYXkoaXRlbSkgPyBpdGVtIDogW2l0ZW1dO1xuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90by5tZXNzYWdlcyA9IGZ1bmN0aW9uIG1lc3NhZ2VzKF9tZXNzYWdlcykge1xuICAgIGlmIChfbWVzc2FnZXMpIHtcbiAgICAgIHRoaXMuX21lc3NhZ2VzID0gZGVlcE1lcmdlKG5ld01lc3NhZ2VzKCksIF9tZXNzYWdlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX21lc3NhZ2VzO1xuICB9O1xuXG4gIF9wcm90by52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKHNvdXJjZV8sIG8sIG9jKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICBpZiAobyA9PT0gdm9pZCAwKSB7XG4gICAgICBvID0ge307XG4gICAgfVxuXG4gICAgaWYgKG9jID09PSB2b2lkIDApIHtcbiAgICAgIG9jID0gZnVuY3Rpb24gb2MoKSB7fTtcbiAgICB9XG5cbiAgICB2YXIgc291cmNlID0gc291cmNlXztcbiAgICB2YXIgb3B0aW9ucyA9IG87XG4gICAgdmFyIGNhbGxiYWNrID0gb2M7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucnVsZXMgfHwgT2JqZWN0LmtleXModGhpcy5ydWxlcykubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgc291cmNlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShzb3VyY2UpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbXBsZXRlKHJlc3VsdHMpIHtcbiAgICAgIHZhciBlcnJvcnMgPSBbXTtcbiAgICAgIHZhciBmaWVsZHMgPSB7fTtcblxuICAgICAgZnVuY3Rpb24gYWRkKGUpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHtcbiAgICAgICAgICB2YXIgX2Vycm9ycztcblxuICAgICAgICAgIGVycm9ycyA9IChfZXJyb3JzID0gZXJyb3JzKS5jb25jYXQuYXBwbHkoX2Vycm9ycywgZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFkZChyZXN1bHRzW2ldKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHNvdXJjZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWVsZHMgPSBjb252ZXJ0RmllbGRzRXJyb3IoZXJyb3JzKTtcbiAgICAgICAgY2FsbGJhY2soZXJyb3JzLCBmaWVsZHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm1lc3NhZ2VzKSB7XG4gICAgICB2YXIgbWVzc2FnZXMkMSA9IHRoaXMubWVzc2FnZXMoKTtcblxuICAgICAgaWYgKG1lc3NhZ2VzJDEgPT09IG1lc3NhZ2VzKSB7XG4gICAgICAgIG1lc3NhZ2VzJDEgPSBuZXdNZXNzYWdlcygpO1xuICAgICAgfVxuXG4gICAgICBkZWVwTWVyZ2UobWVzc2FnZXMkMSwgb3B0aW9ucy5tZXNzYWdlcyk7XG4gICAgICBvcHRpb25zLm1lc3NhZ2VzID0gbWVzc2FnZXMkMTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucy5tZXNzYWdlcyA9IHRoaXMubWVzc2FnZXMoKTtcbiAgICB9XG5cbiAgICB2YXIgc2VyaWVzID0ge307XG4gICAgdmFyIGtleXMgPSBvcHRpb25zLmtleXMgfHwgT2JqZWN0LmtleXModGhpcy5ydWxlcyk7XG4gICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uICh6KSB7XG4gICAgICB2YXIgYXJyID0gX3RoaXMyLnJ1bGVzW3pdO1xuICAgICAgdmFyIHZhbHVlID0gc291cmNlW3pdO1xuICAgICAgYXJyLmZvckVhY2goZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgdmFyIHJ1bGUgPSByO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcnVsZS50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBpZiAoc291cmNlID09PSBzb3VyY2VfKSB7XG4gICAgICAgICAgICBzb3VyY2UgPSBfZXh0ZW5kcyh7fSwgc291cmNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YWx1ZSA9IHNvdXJjZVt6XSA9IHJ1bGUudHJhbnNmb3JtKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgcnVsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJ1bGUgPSB7XG4gICAgICAgICAgICB2YWxpZGF0b3I6IHJ1bGVcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJ1bGUgPSBfZXh0ZW5kcyh7fSwgcnVsZSk7XG4gICAgICAgIH0gLy8gRmlsbCB2YWxpZGF0b3IuIFNraXAgaWYgbm90aGluZyBuZWVkIHRvIHZhbGlkYXRlXG5cblxuICAgICAgICBydWxlLnZhbGlkYXRvciA9IF90aGlzMi5nZXRWYWxpZGF0aW9uTWV0aG9kKHJ1bGUpO1xuXG4gICAgICAgIGlmICghcnVsZS52YWxpZGF0b3IpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBydWxlLmZpZWxkID0gejtcbiAgICAgICAgcnVsZS5mdWxsRmllbGQgPSBydWxlLmZ1bGxGaWVsZCB8fCB6O1xuICAgICAgICBydWxlLnR5cGUgPSBfdGhpczIuZ2V0VHlwZShydWxlKTtcbiAgICAgICAgc2VyaWVzW3pdID0gc2VyaWVzW3pdIHx8IFtdO1xuICAgICAgICBzZXJpZXNbel0ucHVzaCh7XG4gICAgICAgICAgcnVsZTogcnVsZSxcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgZmllbGQ6IHpcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB2YXIgZXJyb3JGaWVsZHMgPSB7fTtcbiAgICByZXR1cm4gYXN5bmNNYXAoc2VyaWVzLCBvcHRpb25zLCBmdW5jdGlvbiAoZGF0YSwgZG9JdCkge1xuICAgICAgdmFyIHJ1bGUgPSBkYXRhLnJ1bGU7XG4gICAgICB2YXIgZGVlcCA9IChydWxlLnR5cGUgPT09ICdvYmplY3QnIHx8IHJ1bGUudHlwZSA9PT0gJ2FycmF5JykgJiYgKHR5cGVvZiBydWxlLmZpZWxkcyA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHJ1bGUuZGVmYXVsdEZpZWxkID09PSAnb2JqZWN0Jyk7XG4gICAgICBkZWVwID0gZGVlcCAmJiAocnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBkYXRhLnZhbHVlKTtcbiAgICAgIHJ1bGUuZmllbGQgPSBkYXRhLmZpZWxkO1xuXG4gICAgICBmdW5jdGlvbiBhZGRGdWxsRmllbGQoa2V5LCBzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzY2hlbWEsIHtcbiAgICAgICAgICBmdWxsRmllbGQ6IHJ1bGUuZnVsbEZpZWxkICsgXCIuXCIgKyBrZXksXG4gICAgICAgICAgZnVsbEZpZWxkczogcnVsZS5mdWxsRmllbGRzID8gW10uY29uY2F0KHJ1bGUuZnVsbEZpZWxkcywgW2tleV0pIDogW2tleV1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGNiKGUpIHtcbiAgICAgICAgaWYgKGUgPT09IHZvaWQgMCkge1xuICAgICAgICAgIGUgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBlcnJvckxpc3QgPSBBcnJheS5pc0FycmF5KGUpID8gZSA6IFtlXTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMuc3VwcHJlc3NXYXJuaW5nICYmIGVycm9yTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICBTY2hlbWEud2FybmluZygnYXN5bmMtdmFsaWRhdG9yOicsIGVycm9yTGlzdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3JMaXN0Lmxlbmd0aCAmJiBydWxlLm1lc3NhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGVycm9yTGlzdCA9IFtdLmNvbmNhdChydWxlLm1lc3NhZ2UpO1xuICAgICAgICB9IC8vIEZpbGwgZXJyb3IgaW5mb1xuXG5cbiAgICAgICAgdmFyIGZpbGxlZEVycm9ycyA9IGVycm9yTGlzdC5tYXAoY29tcGxlbWVudEVycm9yKHJ1bGUsIHNvdXJjZSkpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmZpcnN0ICYmIGZpbGxlZEVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICBlcnJvckZpZWxkc1tydWxlLmZpZWxkXSA9IDE7XG4gICAgICAgICAgcmV0dXJuIGRvSXQoZmlsbGVkRXJyb3JzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGVlcCkge1xuICAgICAgICAgIGRvSXQoZmlsbGVkRXJyb3JzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBpZiBydWxlIGlzIHJlcXVpcmVkIGJ1dCB0aGUgdGFyZ2V0IG9iamVjdFxuICAgICAgICAgIC8vIGRvZXMgbm90IGV4aXN0IGZhaWwgYXQgdGhlIHJ1bGUgbGV2ZWwgYW5kIGRvbid0XG4gICAgICAgICAgLy8gZ28gZGVlcGVyXG4gICAgICAgICAgaWYgKHJ1bGUucmVxdWlyZWQgJiYgIWRhdGEudmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChydWxlLm1lc3NhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBmaWxsZWRFcnJvcnMgPSBbXS5jb25jYXQocnVsZS5tZXNzYWdlKS5tYXAoY29tcGxlbWVudEVycm9yKHJ1bGUsIHNvdXJjZSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmVycm9yKSB7XG4gICAgICAgICAgICAgIGZpbGxlZEVycm9ycyA9IFtvcHRpb25zLmVycm9yKHJ1bGUsIGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLnJlcXVpcmVkLCBydWxlLmZpZWxkKSldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZG9JdChmaWxsZWRFcnJvcnMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBmaWVsZHNTY2hlbWEgPSB7fTtcblxuICAgICAgICAgIGlmIChydWxlLmRlZmF1bHRGaWVsZCkge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZGF0YS52YWx1ZSkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgZmllbGRzU2NoZW1hW2tleV0gPSBydWxlLmRlZmF1bHRGaWVsZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZpZWxkc1NjaGVtYSA9IF9leHRlbmRzKHt9LCBmaWVsZHNTY2hlbWEsIGRhdGEucnVsZS5maWVsZHMpO1xuICAgICAgICAgIHZhciBwYXJlZEZpZWxkc1NjaGVtYSA9IHt9O1xuICAgICAgICAgIE9iamVjdC5rZXlzKGZpZWxkc1NjaGVtYSkuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgICAgIHZhciBmaWVsZFNjaGVtYSA9IGZpZWxkc1NjaGVtYVtmaWVsZF07XG4gICAgICAgICAgICB2YXIgZmllbGRTY2hlbWFMaXN0ID0gQXJyYXkuaXNBcnJheShmaWVsZFNjaGVtYSkgPyBmaWVsZFNjaGVtYSA6IFtmaWVsZFNjaGVtYV07XG4gICAgICAgICAgICBwYXJlZEZpZWxkc1NjaGVtYVtmaWVsZF0gPSBmaWVsZFNjaGVtYUxpc3QubWFwKGFkZEZ1bGxGaWVsZC5iaW5kKG51bGwsIGZpZWxkKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdmFyIHNjaGVtYSA9IG5ldyBTY2hlbWEocGFyZWRGaWVsZHNTY2hlbWEpO1xuICAgICAgICAgIHNjaGVtYS5tZXNzYWdlcyhvcHRpb25zLm1lc3NhZ2VzKTtcblxuICAgICAgICAgIGlmIChkYXRhLnJ1bGUub3B0aW9ucykge1xuICAgICAgICAgICAgZGF0YS5ydWxlLm9wdGlvbnMubWVzc2FnZXMgPSBvcHRpb25zLm1lc3NhZ2VzO1xuICAgICAgICAgICAgZGF0YS5ydWxlLm9wdGlvbnMuZXJyb3IgPSBvcHRpb25zLmVycm9yO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNjaGVtYS52YWxpZGF0ZShkYXRhLnZhbHVlLCBkYXRhLnJ1bGUub3B0aW9ucyB8fCBvcHRpb25zLCBmdW5jdGlvbiAoZXJycykge1xuICAgICAgICAgICAgdmFyIGZpbmFsRXJyb3JzID0gW107XG5cbiAgICAgICAgICAgIGlmIChmaWxsZWRFcnJvcnMgJiYgZmlsbGVkRXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBmaW5hbEVycm9ycy5wdXNoLmFwcGx5KGZpbmFsRXJyb3JzLCBmaWxsZWRFcnJvcnMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXJycyAmJiBlcnJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBmaW5hbEVycm9ycy5wdXNoLmFwcGx5KGZpbmFsRXJyb3JzLCBlcnJzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZG9JdChmaW5hbEVycm9ycy5sZW5ndGggPyBmaW5hbEVycm9ycyA6IG51bGwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciByZXM7XG5cbiAgICAgIGlmIChydWxlLmFzeW5jVmFsaWRhdG9yKSB7XG4gICAgICAgIHJlcyA9IHJ1bGUuYXN5bmNWYWxpZGF0b3IocnVsZSwgZGF0YS52YWx1ZSwgY2IsIGRhdGEuc291cmNlLCBvcHRpb25zKTtcbiAgICAgIH0gZWxzZSBpZiAocnVsZS52YWxpZGF0b3IpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXMgPSBydWxlLnZhbGlkYXRvcihydWxlLCBkYXRhLnZhbHVlLCBjYiwgZGF0YS5zb3VyY2UsIG9wdGlvbnMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IgPT0gbnVsbCA/IHZvaWQgMCA6IGNvbnNvbGUuZXJyb3IoZXJyb3IpOyAvLyByZXRocm93IHRvIHJlcG9ydCBlcnJvclxuXG4gICAgICAgICAgaWYgKCFvcHRpb25zLnN1cHByZXNzVmFsaWRhdG9yRXJyb3IpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNiKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlcyA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGNiKCk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzID09PSBmYWxzZSkge1xuICAgICAgICAgIGNiKHR5cGVvZiBydWxlLm1lc3NhZ2UgPT09ICdmdW5jdGlvbicgPyBydWxlLm1lc3NhZ2UocnVsZS5mdWxsRmllbGQgfHwgcnVsZS5maWVsZCkgOiBydWxlLm1lc3NhZ2UgfHwgKHJ1bGUuZnVsbEZpZWxkIHx8IHJ1bGUuZmllbGQpICsgXCIgZmFpbHNcIik7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICBjYihyZXMpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgY2IocmVzLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXMgJiYgcmVzLnRoZW4pIHtcbiAgICAgICAgcmVzLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjYigpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHJldHVybiBjYihlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgIGNvbXBsZXRlKHJlc3VsdHMpO1xuICAgIH0sIHNvdXJjZSk7XG4gIH07XG5cbiAgX3Byb3RvLmdldFR5cGUgPSBmdW5jdGlvbiBnZXRUeXBlKHJ1bGUpIHtcbiAgICBpZiAocnVsZS50eXBlID09PSB1bmRlZmluZWQgJiYgcnVsZS5wYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICBydWxlLnR5cGUgPSAncGF0dGVybic7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBydWxlLnZhbGlkYXRvciAhPT0gJ2Z1bmN0aW9uJyAmJiBydWxlLnR5cGUgJiYgIXZhbGlkYXRvcnMuaGFzT3duUHJvcGVydHkocnVsZS50eXBlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGZvcm1hdCgnVW5rbm93biBydWxlIHR5cGUgJXMnLCBydWxlLnR5cGUpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcnVsZS50eXBlIHx8ICdzdHJpbmcnO1xuICB9O1xuXG4gIF9wcm90by5nZXRWYWxpZGF0aW9uTWV0aG9kID0gZnVuY3Rpb24gZ2V0VmFsaWRhdGlvbk1ldGhvZChydWxlKSB7XG4gICAgaWYgKHR5cGVvZiBydWxlLnZhbGlkYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHJ1bGUudmFsaWRhdG9yO1xuICAgIH1cblxuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMocnVsZSk7XG4gICAgdmFyIG1lc3NhZ2VJbmRleCA9IGtleXMuaW5kZXhPZignbWVzc2FnZScpO1xuXG4gICAgaWYgKG1lc3NhZ2VJbmRleCAhPT0gLTEpIHtcbiAgICAgIGtleXMuc3BsaWNlKG1lc3NhZ2VJbmRleCwgMSk7XG4gICAgfVxuXG4gICAgaWYgKGtleXMubGVuZ3RoID09PSAxICYmIGtleXNbMF0gPT09ICdyZXF1aXJlZCcpIHtcbiAgICAgIHJldHVybiB2YWxpZGF0b3JzLnJlcXVpcmVkO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0b3JzW3RoaXMuZ2V0VHlwZShydWxlKV0gfHwgdW5kZWZpbmVkO1xuICB9O1xuXG4gIHJldHVybiBTY2hlbWE7XG59KCk7XG5cblNjaGVtYS5yZWdpc3RlciA9IGZ1bmN0aW9uIHJlZ2lzdGVyKHR5cGUsIHZhbGlkYXRvcikge1xuICBpZiAodHlwZW9mIHZhbGlkYXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlZ2lzdGVyIGEgdmFsaWRhdG9yIGJ5IHR5cGUsIHZhbGlkYXRvciBpcyBub3QgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgdmFsaWRhdG9yc1t0eXBlXSA9IHZhbGlkYXRvcjtcbn07XG5cblNjaGVtYS53YXJuaW5nID0gd2FybmluZztcblNjaGVtYS5tZXNzYWdlcyA9IG1lc3NhZ2VzO1xuU2NoZW1hLnZhbGlkYXRvcnMgPSB2YWxpZGF0b3JzO1xuXG5leHBvcnQgeyBTY2hlbWEgYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iLCJ2YXIgdHlwZVRlbXBsYXRlID0gXCInJHtuYW1lfScgaXMgbm90IGEgdmFsaWQgJHt0eXBlfVwiO1xuZXhwb3J0IHZhciBkZWZhdWx0VmFsaWRhdGVNZXNzYWdlcyA9IHtcbiAgZGVmYXVsdDogXCJWYWxpZGF0aW9uIGVycm9yIG9uIGZpZWxkICcke25hbWV9J1wiLFxuICByZXF1aXJlZDogXCInJHtuYW1lfScgaXMgcmVxdWlyZWRcIixcbiAgZW51bTogXCInJHtuYW1lfScgbXVzdCBiZSBvbmUgb2YgWyR7ZW51bX1dXCIsXG4gIHdoaXRlc3BhY2U6IFwiJyR7bmFtZX0nIGNhbm5vdCBiZSBlbXB0eVwiLFxuICBkYXRlOiB7XG4gICAgZm9ybWF0OiBcIicke25hbWV9JyBpcyBpbnZhbGlkIGZvciBmb3JtYXQgZGF0ZVwiLFxuICAgIHBhcnNlOiBcIicke25hbWV9JyBjb3VsZCBub3QgYmUgcGFyc2VkIGFzIGRhdGVcIixcbiAgICBpbnZhbGlkOiBcIicke25hbWV9JyBpcyBpbnZhbGlkIGRhdGVcIlxuICB9LFxuICB0eXBlczoge1xuICAgIHN0cmluZzogdHlwZVRlbXBsYXRlLFxuICAgIG1ldGhvZDogdHlwZVRlbXBsYXRlLFxuICAgIGFycmF5OiB0eXBlVGVtcGxhdGUsXG4gICAgb2JqZWN0OiB0eXBlVGVtcGxhdGUsXG4gICAgbnVtYmVyOiB0eXBlVGVtcGxhdGUsXG4gICAgZGF0ZTogdHlwZVRlbXBsYXRlLFxuICAgIGJvb2xlYW46IHR5cGVUZW1wbGF0ZSxcbiAgICBpbnRlZ2VyOiB0eXBlVGVtcGxhdGUsXG4gICAgZmxvYXQ6IHR5cGVUZW1wbGF0ZSxcbiAgICByZWdleHA6IHR5cGVUZW1wbGF0ZSxcbiAgICBlbWFpbDogdHlwZVRlbXBsYXRlLFxuICAgIHVybDogdHlwZVRlbXBsYXRlLFxuICAgIGhleDogdHlwZVRlbXBsYXRlXG4gIH0sXG4gIHN0cmluZzoge1xuICAgIGxlbjogXCInJHtuYW1lfScgbXVzdCBiZSBleGFjdGx5ICR7bGVufSBjaGFyYWN0ZXJzXCIsXG4gICAgbWluOiBcIicke25hbWV9JyBtdXN0IGJlIGF0IGxlYXN0ICR7bWlufSBjaGFyYWN0ZXJzXCIsXG4gICAgbWF4OiBcIicke25hbWV9JyBjYW5ub3QgYmUgbG9uZ2VyIHRoYW4gJHttYXh9IGNoYXJhY3RlcnNcIixcbiAgICByYW5nZTogXCInJHtuYW1lfScgbXVzdCBiZSBiZXR3ZWVuICR7bWlufSBhbmQgJHttYXh9IGNoYXJhY3RlcnNcIlxuICB9LFxuICBudW1iZXI6IHtcbiAgICBsZW46IFwiJyR7bmFtZX0nIG11c3QgZXF1YWwgJHtsZW59XCIsXG4gICAgbWluOiBcIicke25hbWV9JyBjYW5ub3QgYmUgbGVzcyB0aGFuICR7bWlufVwiLFxuICAgIG1heDogXCInJHtuYW1lfScgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiAke21heH1cIixcbiAgICByYW5nZTogXCInJHtuYW1lfScgbXVzdCBiZSBiZXR3ZWVuICR7bWlufSBhbmQgJHttYXh9XCJcbiAgfSxcbiAgYXJyYXk6IHtcbiAgICBsZW46IFwiJyR7bmFtZX0nIG11c3QgYmUgZXhhY3RseSAke2xlbn0gaW4gbGVuZ3RoXCIsXG4gICAgbWluOiBcIicke25hbWV9JyBjYW5ub3QgYmUgbGVzcyB0aGFuICR7bWlufSBpbiBsZW5ndGhcIixcbiAgICBtYXg6IFwiJyR7bmFtZX0nIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gJHttYXh9IGluIGxlbmd0aFwiLFxuICAgIHJhbmdlOiBcIicke25hbWV9JyBtdXN0IGJlIGJldHdlZW4gJHttaW59IGFuZCAke21heH0gaW4gbGVuZ3RoXCJcbiAgfSxcbiAgcGF0dGVybjoge1xuICAgIG1pc21hdGNoOiBcIicke25hbWV9JyBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuICR7cGF0dGVybn1cIlxuICB9XG59OyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldChlbnRpdHksIHBhdGgpIHtcbiAgdmFyIGN1cnJlbnQgPSBlbnRpdHk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnRbcGF0aFtpXV07XG4gIH1cbiAgcmV0dXJuIGN1cnJlbnQ7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59IiwiaW1wb3J0IGFycmF5V2l0aEhvbGVzIGZyb20gXCIuL2FycmF5V2l0aEhvbGVzLmpzXCI7XG5pbXBvcnQgaXRlcmFibGVUb0FycmF5IGZyb20gXCIuL2l0ZXJhYmxlVG9BcnJheS5qc1wiO1xuaW1wb3J0IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IGZyb20gXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzXCI7XG5pbXBvcnQgbm9uSXRlcmFibGVSZXN0IGZyb20gXCIuL25vbkl0ZXJhYmxlUmVzdC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3RvQXJyYXkoYXJyKSB7XG4gIHJldHVybiBhcnJheVdpdGhIb2xlcyhhcnIpIHx8IGl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgbm9uSXRlcmFibGVSZXN0KCk7XG59IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX3RvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQXJyYXlcIjtcbmltcG9ydCBnZXQgZnJvbSBcIi4vZ2V0XCI7XG5mdW5jdGlvbiBpbnRlcm5hbFNldChlbnRpdHksIHBhdGhzLCB2YWx1ZSwgcmVtb3ZlSWZVbmRlZmluZWQpIHtcbiAgaWYgKCFwYXRocy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgdmFyIF9wYXRocyA9IF90b0FycmF5KHBhdGhzKSxcbiAgICBwYXRoID0gX3BhdGhzWzBdLFxuICAgIHJlc3RQYXRoID0gX3BhdGhzLnNsaWNlKDEpO1xuICB2YXIgY2xvbmU7XG4gIGlmICghZW50aXR5ICYmIHR5cGVvZiBwYXRoID09PSAnbnVtYmVyJykge1xuICAgIGNsb25lID0gW107XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShlbnRpdHkpKSB7XG4gICAgY2xvbmUgPSBfdG9Db25zdW1hYmxlQXJyYXkoZW50aXR5KTtcbiAgfSBlbHNlIHtcbiAgICBjbG9uZSA9IF9vYmplY3RTcHJlYWQoe30sIGVudGl0eSk7XG4gIH1cblxuICAvLyBEZWxldGUgcHJvcCBpZiBgcmVtb3ZlSWZVbmRlZmluZWRgIGFuZCB2YWx1ZSBpcyB1bmRlZmluZWRcbiAgaWYgKHJlbW92ZUlmVW5kZWZpbmVkICYmIHZhbHVlID09PSB1bmRlZmluZWQgJiYgcmVzdFBhdGgubGVuZ3RoID09PSAxKSB7XG4gICAgZGVsZXRlIGNsb25lW3BhdGhdW3Jlc3RQYXRoWzBdXTtcbiAgfSBlbHNlIHtcbiAgICBjbG9uZVtwYXRoXSA9IGludGVybmFsU2V0KGNsb25lW3BhdGhdLCByZXN0UGF0aCwgdmFsdWUsIHJlbW92ZUlmVW5kZWZpbmVkKTtcbiAgfVxuICByZXR1cm4gY2xvbmU7XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzZXQoZW50aXR5LCBwYXRocywgdmFsdWUpIHtcbiAgdmFyIHJlbW92ZUlmVW5kZWZpbmVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBmYWxzZTtcbiAgLy8gRG8gbm90aGluZyBpZiBgcmVtb3ZlSWZVbmRlZmluZWRgIGFuZCBwYXJlbnQgb2JqZWN0IG5vdCBleGlzdFxuICBpZiAocGF0aHMubGVuZ3RoICYmIHJlbW92ZUlmVW5kZWZpbmVkICYmIHZhbHVlID09PSB1bmRlZmluZWQgJiYgIWdldChlbnRpdHksIHBhdGhzLnNsaWNlKDAsIC0xKSkpIHtcbiAgICByZXR1cm4gZW50aXR5O1xuICB9XG4gIHJldHVybiBpbnRlcm5hbFNldChlbnRpdHksIHBhdGhzLCB2YWx1ZSwgcmVtb3ZlSWZVbmRlZmluZWQpO1xufVxuZnVuY3Rpb24gaXNPYmplY3Qob2JqKSB7XG4gIHJldHVybiBfdHlwZW9mKG9iaikgPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSA9PT0gT2JqZWN0LnByb3RvdHlwZTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUVtcHR5KHNvdXJjZSkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShzb3VyY2UpID8gW10gOiB7fTtcbn1cbnZhciBrZXlzID0gdHlwZW9mIFJlZmxlY3QgPT09ICd1bmRlZmluZWQnID8gT2JqZWN0LmtleXMgOiBSZWZsZWN0Lm93bktleXM7XG5cbi8qKlxuICogTWVyZ2Ugb2JqZWN0cyB3aGljaCB3aWxsIGNyZWF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2UoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBzb3VyY2VzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIHNvdXJjZXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cbiAgdmFyIGNsb25lID0gY3JlYXRlRW1wdHkoc291cmNlc1swXSk7XG4gIHNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbiAoc3JjKSB7XG4gICAgZnVuY3Rpb24gaW50ZXJuYWxNZXJnZShwYXRoLCBwYXJlbnRMb29wU2V0KSB7XG4gICAgICB2YXIgbG9vcFNldCA9IG5ldyBTZXQocGFyZW50TG9vcFNldCk7XG4gICAgICB2YXIgdmFsdWUgPSBnZXQoc3JjLCBwYXRoKTtcbiAgICAgIHZhciBpc0FyciA9IEFycmF5LmlzQXJyYXkodmFsdWUpO1xuICAgICAgaWYgKGlzQXJyIHx8IGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAvLyBPbmx5IGFkZCBub3QgbG9vcCBvYmpcbiAgICAgICAgaWYgKCFsb29wU2V0Lmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICBsb29wU2V0LmFkZCh2YWx1ZSk7XG4gICAgICAgICAgdmFyIG9yaWdpblZhbHVlID0gZ2V0KGNsb25lLCBwYXRoKTtcbiAgICAgICAgICBpZiAoaXNBcnIpIHtcbiAgICAgICAgICAgIC8vIEFycmF5IHdpbGwgYWx3YXlzIGJlIG92ZXJyaWRlXG4gICAgICAgICAgICBjbG9uZSA9IHNldChjbG9uZSwgcGF0aCwgW10pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIW9yaWdpblZhbHVlIHx8IF90eXBlb2Yob3JpZ2luVmFsdWUpICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgLy8gSW5pdCBjb250YWluZXIgaWYgbm90IGV4aXN0XG4gICAgICAgICAgICBjbG9uZSA9IHNldChjbG9uZSwgcGF0aCwgY3JlYXRlRW1wdHkodmFsdWUpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAga2V5cyh2YWx1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBpbnRlcm5hbE1lcmdlKFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocGF0aCksIFtrZXldKSwgbG9vcFNldCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsb25lID0gc2V0KGNsb25lLCBwYXRoLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGludGVybmFsTWVyZ2UoW10pO1xuICB9KTtcbiAgcmV0dXJuIGNsb25lO1xufSIsImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmZ1bmN0aW9uIGNsb25lRGVlcCh2YWwpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgIHJldHVybiBjbG9uZUFycmF5RGVlcCh2YWwpO1xuICB9IGVsc2UgaWYgKF90eXBlb2YodmFsKSA9PT0gJ29iamVjdCcgJiYgdmFsICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIGNsb25lT2JqZWN0RGVlcCh2YWwpO1xuICB9XG4gIHJldHVybiB2YWw7XG59XG5mdW5jdGlvbiBjbG9uZU9iamVjdERlZXAodmFsKSB7XG4gIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsKSA9PT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIHZhciByZXMgPSB7fTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdmFsKSB7XG4gICAgICByZXNba2V5XSA9IGNsb25lRGVlcCh2YWxba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcmV0dXJuIHZhbDtcbn1cbmZ1bmN0aW9uIGNsb25lQXJyYXlEZWVwKHZhbCkge1xuICByZXR1cm4gdmFsLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgIHJldHVybiBjbG9uZURlZXAoaXRlbSk7XG4gIH0pO1xufVxuZXhwb3J0IGRlZmF1bHQgY2xvbmVEZWVwOyIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IGdldCBmcm9tIFwicmMtdXRpbC9lcy91dGlscy9nZXRcIjtcbmltcG9ydCBzZXQgZnJvbSBcInJjLXV0aWwvZXMvdXRpbHMvc2V0XCI7XG5pbXBvcnQgeyB0b0FycmF5IH0gZnJvbSAnLi90eXBlVXRpbCc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJy4uL3V0aWxzL2Nsb25lRGVlcCc7XG4vKipcbiAqIENvbnZlcnQgbmFtZSB0byBpbnRlcm5hbCBzdXBwb3J0ZWQgZm9ybWF0LlxuICogVGhpcyBmdW5jdGlvbiBzaG91bGQga2VlcCBzaW5jZSB3ZSBzdGlsbCB0aGlua2luZyBpZiBuZWVkIHN1cHBvcnQgbGlrZSBgYS5iLmNgIGZvcm1hdC5cbiAqICdhJyA9PiBbJ2EnXVxuICogMTIzID0+IFsxMjNdXG4gKiBbJ2EnLCAxMjNdID0+IFsnYScsIDEyM11cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5hbWVQYXRoKHBhdGgpIHtcbiAgcmV0dXJuIHRvQXJyYXkocGF0aCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWUoc3RvcmUsIG5hbWVQYXRoKSB7XG4gIHZhciB2YWx1ZSA9IGdldChzdG9yZSwgbmFtZVBhdGgpO1xuICByZXR1cm4gdmFsdWU7XG59XG5leHBvcnQgZnVuY3Rpb24gc2V0VmFsdWUoc3RvcmUsIG5hbWVQYXRoLCB2YWx1ZSkge1xuICB2YXIgcmVtb3ZlSWZVbmRlZmluZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IGZhbHNlO1xuICB2YXIgbmV3U3RvcmUgPSBzZXQoc3RvcmUsIG5hbWVQYXRoLCB2YWx1ZSwgcmVtb3ZlSWZVbmRlZmluZWQpO1xuICByZXR1cm4gbmV3U3RvcmU7XG59XG5leHBvcnQgZnVuY3Rpb24gY2xvbmVCeU5hbWVQYXRoTGlzdChzdG9yZSwgbmFtZVBhdGhMaXN0KSB7XG4gIHZhciBuZXdTdG9yZSA9IHt9O1xuICBuYW1lUGF0aExpc3QuZm9yRWFjaChmdW5jdGlvbiAobmFtZVBhdGgpIHtcbiAgICB2YXIgdmFsdWUgPSBnZXRWYWx1ZShzdG9yZSwgbmFtZVBhdGgpO1xuICAgIG5ld1N0b3JlID0gc2V0VmFsdWUobmV3U3RvcmUsIG5hbWVQYXRoLCB2YWx1ZSk7XG4gIH0pO1xuICByZXR1cm4gbmV3U3RvcmU7XG59XG5leHBvcnQgZnVuY3Rpb24gY29udGFpbnNOYW1lUGF0aChuYW1lUGF0aExpc3QsIG5hbWVQYXRoKSB7XG4gIHJldHVybiBuYW1lUGF0aExpc3QgJiYgbmFtZVBhdGhMaXN0LnNvbWUoZnVuY3Rpb24gKHBhdGgpIHtcbiAgICByZXR1cm4gbWF0Y2hOYW1lUGF0aChwYXRoLCBuYW1lUGF0aCk7XG4gIH0pO1xufVxuZnVuY3Rpb24gaXNPYmplY3Qob2JqKSB7XG4gIHJldHVybiBfdHlwZW9mKG9iaikgPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSA9PT0gT2JqZWN0LnByb3RvdHlwZTtcbn1cbi8qKlxuICogQ29weSB2YWx1ZXMgaW50byBzdG9yZSBhbmQgcmV0dXJuIGEgbmV3IHZhbHVlcyBvYmplY3RcbiAqICh7IGE6IDEsIGI6IHsgYzogMiB9IH0sIHsgYTogNCwgYjogeyBkOiA1IH0gfSkgPT4geyBhOiA0LCBiOiB7IGM6IDIsIGQ6IDUgfSB9XG4gKi9cbmZ1bmN0aW9uIGludGVybmFsU2V0VmFsdWVzKHN0b3JlLCB2YWx1ZXMpIHtcbiAgdmFyIG5ld1N0b3JlID0gQXJyYXkuaXNBcnJheShzdG9yZSkgPyBfdG9Db25zdW1hYmxlQXJyYXkoc3RvcmUpIDogX29iamVjdFNwcmVhZCh7fSwgc3RvcmUpO1xuICBpZiAoIXZhbHVlcykge1xuICAgIHJldHVybiBuZXdTdG9yZTtcbiAgfVxuICBPYmplY3Qua2V5cyh2YWx1ZXMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBwcmV2VmFsdWUgPSBuZXdTdG9yZVtrZXldO1xuICAgIHZhciB2YWx1ZSA9IHZhbHVlc1trZXldO1xuICAgIC8vIElmIGJvdGggYXJlIG9iamVjdCAoYnV0IHRhcmdldCBpcyBub3QgYXJyYXkpLCB3ZSB1c2UgcmVjdXJzaW9uIHRvIHNldCBkZWVwIHZhbHVlXG4gICAgdmFyIHJlY3Vyc2l2ZSA9IGlzT2JqZWN0KHByZXZWYWx1ZSkgJiYgaXNPYmplY3QodmFsdWUpO1xuICAgIG5ld1N0b3JlW2tleV0gPSByZWN1cnNpdmUgPyBpbnRlcm5hbFNldFZhbHVlcyhwcmV2VmFsdWUsIHZhbHVlIHx8IHt9KSA6IGNsb25lRGVlcCh2YWx1ZSk7IC8vIENsb25lIGRlZXAgZm9yIGFycmF5c1xuICB9KTtcblxuICByZXR1cm4gbmV3U3RvcmU7XG59XG5leHBvcnQgZnVuY3Rpb24gc2V0VmFsdWVzKHN0b3JlKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCByZXN0VmFsdWVzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICByZXN0VmFsdWVzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuICByZXR1cm4gcmVzdFZhbHVlcy5yZWR1Y2UoZnVuY3Rpb24gKGN1cnJlbnQsIG5ld1N0b3JlKSB7XG4gICAgcmV0dXJuIGludGVybmFsU2V0VmFsdWVzKGN1cnJlbnQsIG5ld1N0b3JlKTtcbiAgfSwgc3RvcmUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoTmFtZVBhdGgobmFtZVBhdGgsIGNoYW5nZWROYW1lUGF0aCkge1xuICBpZiAoIW5hbWVQYXRoIHx8ICFjaGFuZ2VkTmFtZVBhdGggfHwgbmFtZVBhdGgubGVuZ3RoICE9PSBjaGFuZ2VkTmFtZVBhdGgubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBuYW1lUGF0aC5ldmVyeShmdW5jdGlvbiAobmFtZVVuaXQsIGkpIHtcbiAgICByZXR1cm4gY2hhbmdlZE5hbWVQYXRoW2ldID09PSBuYW1lVW5pdDtcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTaW1pbGFyKHNvdXJjZSwgdGFyZ2V0KSB7XG4gIGlmIChzb3VyY2UgPT09IHRhcmdldCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICghc291cmNlICYmIHRhcmdldCB8fCBzb3VyY2UgJiYgIXRhcmdldCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoIXNvdXJjZSB8fCAhdGFyZ2V0IHx8IF90eXBlb2Yoc291cmNlKSAhPT0gJ29iamVjdCcgfHwgX3R5cGVvZih0YXJnZXQpICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gIHZhciB0YXJnZXRLZXlzID0gT2JqZWN0LmtleXModGFyZ2V0KTtcbiAgdmFyIGtleXMgPSBuZXcgU2V0KFtdLmNvbmNhdChzb3VyY2VLZXlzLCB0YXJnZXRLZXlzKSk7XG4gIHJldHVybiBfdG9Db25zdW1hYmxlQXJyYXkoa2V5cykuZXZlcnkoZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBzb3VyY2VWYWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgIHZhciB0YXJnZXRWYWx1ZSA9IHRhcmdldFtrZXldO1xuICAgIGlmICh0eXBlb2Ygc291cmNlVmFsdWUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHRhcmdldFZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZVZhbHVlID09PSB0YXJnZXRWYWx1ZTtcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdEdldFZhbHVlRnJvbUV2ZW50KHZhbHVlUHJvcE5hbWUpIHtcbiAgdmFyIGV2ZW50ID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxID8gdW5kZWZpbmVkIDogYXJndW1lbnRzWzFdO1xuICBpZiAoZXZlbnQgJiYgZXZlbnQudGFyZ2V0ICYmIF90eXBlb2YoZXZlbnQudGFyZ2V0KSA9PT0gJ29iamVjdCcgJiYgdmFsdWVQcm9wTmFtZSBpbiBldmVudC50YXJnZXQpIHtcbiAgICByZXR1cm4gZXZlbnQudGFyZ2V0W3ZhbHVlUHJvcE5hbWVdO1xuICB9XG4gIHJldHVybiBldmVudDtcbn1cbi8qKlxuICogTW92ZXMgYW4gYXJyYXkgaXRlbSBmcm9tIG9uZSBwb3NpdGlvbiBpbiBhbiBhcnJheSB0byBhbm90aGVyLlxuICpcbiAqIE5vdGU6IFRoaXMgaXMgYSBwdXJlIGZ1bmN0aW9uIHNvIGEgbmV3IGFycmF5IHdpbGwgYmUgcmV0dXJuZWQsIGluc3RlYWRcbiAqIG9mIGFsdGVyaW5nIHRoZSBhcnJheSBhcmd1bWVudC5cbiAqXG4gKiBAcGFyYW0gYXJyYXkgICAgICAgICBBcnJheSBpbiB3aGljaCB0byBtb3ZlIGFuIGl0ZW0uICAgICAgICAgKHJlcXVpcmVkKVxuICogQHBhcmFtIG1vdmVJbmRleCAgICAgVGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIG1vdmUuICAgICAgICAgIChyZXF1aXJlZClcbiAqIEBwYXJhbSB0b0luZGV4ICAgICAgIFRoZSBpbmRleCB0byBtb3ZlIGl0ZW0gYXQgbW92ZUluZGV4IHRvLiAocmVxdWlyZWQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb3ZlKGFycmF5LCBtb3ZlSW5kZXgsIHRvSW5kZXgpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgaWYgKG1vdmVJbmRleCA8IDAgfHwgbW92ZUluZGV4ID49IGxlbmd0aCB8fCB0b0luZGV4IDwgMCB8fCB0b0luZGV4ID49IGxlbmd0aCkge1xuICAgIHJldHVybiBhcnJheTtcbiAgfVxuICB2YXIgaXRlbSA9IGFycmF5W21vdmVJbmRleF07XG4gIHZhciBkaWZmID0gbW92ZUluZGV4IC0gdG9JbmRleDtcbiAgaWYgKGRpZmYgPiAwKSB7XG4gICAgLy8gbW92ZSBsZWZ0XG4gICAgcmV0dXJuIFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoYXJyYXkuc2xpY2UoMCwgdG9JbmRleCkpLCBbaXRlbV0sIF90b0NvbnN1bWFibGVBcnJheShhcnJheS5zbGljZSh0b0luZGV4LCBtb3ZlSW5kZXgpKSwgX3RvQ29uc3VtYWJsZUFycmF5KGFycmF5LnNsaWNlKG1vdmVJbmRleCArIDEsIGxlbmd0aCkpKTtcbiAgfVxuICBpZiAoZGlmZiA8IDApIHtcbiAgICAvLyBtb3ZlIHJpZ2h0XG4gICAgcmV0dXJuIFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoYXJyYXkuc2xpY2UoMCwgbW92ZUluZGV4KSksIF90b0NvbnN1bWFibGVBcnJheShhcnJheS5zbGljZShtb3ZlSW5kZXggKyAxLCB0b0luZGV4ICsgMSkpLCBbaXRlbV0sIF90b0NvbnN1bWFibGVBcnJheShhcnJheS5zbGljZSh0b0luZGV4ICsgMSwgbGVuZ3RoKSkpO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn0iLCJpbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfcmVnZW5lcmF0b3JSdW50aW1lIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9yZWdlbmVyYXRvclJ1bnRpbWVcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX2FzeW5jVG9HZW5lcmF0b3IgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FzeW5jVG9HZW5lcmF0b3JcIjtcbmltcG9ydCBSYXdBc3luY1ZhbGlkYXRvciBmcm9tICdhc3luYy12YWxpZGF0b3InO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0IHsgZGVmYXVsdFZhbGlkYXRlTWVzc2FnZXMgfSBmcm9tICcuL21lc3NhZ2VzJztcbmltcG9ydCB7IHNldFZhbHVlcyB9IGZyb20gJy4vdmFsdWVVdGlsJztcbi8vIFJlbW92ZSBpbmNvcnJlY3Qgb3JpZ2luYWwgdHMgZGVmaW5lXG52YXIgQXN5bmNWYWxpZGF0b3IgPSBSYXdBc3luY1ZhbGlkYXRvcjtcbi8qKlxuICogUmVwbGFjZSB3aXRoIHRlbXBsYXRlLlxuICogICBgSSdtICR7bmFtZX1gICsgeyBuYW1lOiAnYmFtYm9vJyB9ID0gSSdtIGJhbWJvb1xuICovXG5mdW5jdGlvbiByZXBsYWNlTWVzc2FnZSh0ZW1wbGF0ZSwga3YpIHtcbiAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoL1xcJFxce1xcdytcXH0vZywgZnVuY3Rpb24gKHN0cikge1xuICAgIHZhciBrZXkgPSBzdHIuc2xpY2UoMiwgLTEpO1xuICAgIHJldHVybiBrdltrZXldO1xuICB9KTtcbn1cbnZhciBDT0RFX0xPR0lDX0VSUk9SID0gJ0NPREVfTE9HSUNfRVJST1InO1xuZnVuY3Rpb24gdmFsaWRhdGVSdWxlKF94LCBfeDIsIF94MywgX3g0LCBfeDUpIHtcbiAgcmV0dXJuIF92YWxpZGF0ZVJ1bGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbi8qKlxuICogV2UgdXNlIGBhc3luYy12YWxpZGF0b3JgIHRvIHZhbGlkYXRlIHRoZSB2YWx1ZS5cbiAqIEJ1dCBvbmx5IGNoZWNrIG9uZSB2YWx1ZSBpbiBhIHRpbWUgdG8gYXZvaWQgbmFtZVBhdGggdmFsaWRhdGUgaXNzdWUuXG4gKi9cbmZ1bmN0aW9uIF92YWxpZGF0ZVJ1bGUoKSB7XG4gIF92YWxpZGF0ZVJ1bGUgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKG5hbWUsIHZhbHVlLCBydWxlLCBvcHRpb25zLCBtZXNzYWdlVmFyaWFibGVzKSB7XG4gICAgdmFyIGNsb25lUnVsZSwgb3JpZ2luVmFsaWRhdG9yLCBzdWJSdWxlRmllbGQsIHZhbGlkYXRvciwgbWVzc2FnZXMsIHJlc3VsdCwgc3ViUmVzdWx0cywga3YsIGZpbGxWYXJpYWJsZVJlc3VsdDtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0Mikge1xuICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgY2xvbmVSdWxlID0gX29iamVjdFNwcmVhZCh7fSwgcnVsZSk7IC8vIEJ1ZyBvZiBgYXN5bmMtdmFsaWRhdG9yYFxuICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1jb21wb25lbnQvZmllbGQtZm9ybS9pc3N1ZXMvMzE2XG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWNvbXBvbmVudC9maWVsZC1mb3JtL2lzc3Vlcy8zMTNcbiAgICAgICAgICBkZWxldGUgY2xvbmVSdWxlLnJ1bGVJbmRleDtcbiAgICAgICAgICBpZiAoY2xvbmVSdWxlLnZhbGlkYXRvcikge1xuICAgICAgICAgICAgb3JpZ2luVmFsaWRhdG9yID0gY2xvbmVSdWxlLnZhbGlkYXRvcjtcbiAgICAgICAgICAgIGNsb25lUnVsZS52YWxpZGF0b3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpblZhbGlkYXRvci5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KENPREVfTE9HSUNfRVJST1IpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBXZSBzaG91bGQgc3BlY2lhbCBoYW5kbGUgYXJyYXkgdmFsaWRhdGVcbiAgICAgICAgICBzdWJSdWxlRmllbGQgPSBudWxsO1xuICAgICAgICAgIGlmIChjbG9uZVJ1bGUgJiYgY2xvbmVSdWxlLnR5cGUgPT09ICdhcnJheScgJiYgY2xvbmVSdWxlLmRlZmF1bHRGaWVsZCkge1xuICAgICAgICAgICAgc3ViUnVsZUZpZWxkID0gY2xvbmVSdWxlLmRlZmF1bHRGaWVsZDtcbiAgICAgICAgICAgIGRlbGV0ZSBjbG9uZVJ1bGUuZGVmYXVsdEZpZWxkO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YWxpZGF0b3IgPSBuZXcgQXN5bmNWYWxpZGF0b3IoX2RlZmluZVByb3BlcnR5KHt9LCBuYW1lLCBbY2xvbmVSdWxlXSkpO1xuICAgICAgICAgIG1lc3NhZ2VzID0gc2V0VmFsdWVzKHt9LCBkZWZhdWx0VmFsaWRhdGVNZXNzYWdlcywgb3B0aW9ucy52YWxpZGF0ZU1lc3NhZ2VzKTtcbiAgICAgICAgICB2YWxpZGF0b3IubWVzc2FnZXMobWVzc2FnZXMpO1xuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuICAgICAgICAgIF9jb250ZXh0Mi5wcmV2ID0gOTtcbiAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDEyO1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsaWRhdG9yLnZhbGlkYXRlKF9kZWZpbmVQcm9wZXJ0eSh7fSwgbmFtZSwgdmFsdWUpLCBfb2JqZWN0U3ByZWFkKHt9LCBvcHRpb25zKSkpO1xuICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgX2NvbnRleHQyLnByZXYgPSAxNDtcbiAgICAgICAgICBfY29udGV4dDIudDAgPSBfY29udGV4dDJbXCJjYXRjaFwiXSg5KTtcbiAgICAgICAgICBpZiAoX2NvbnRleHQyLnQwLmVycm9ycykge1xuICAgICAgICAgICAgcmVzdWx0ID0gX2NvbnRleHQyLnQwLmVycm9ycy5tYXAoZnVuY3Rpb24gKF9yZWY0LCBpbmRleCkge1xuICAgICAgICAgICAgICB2YXIgbWVzc2FnZSA9IF9yZWY0Lm1lc3NhZ2U7XG4gICAgICAgICAgICAgIHZhciBtZXJnZWRNZXNzYWdlID0gbWVzc2FnZSA9PT0gQ09ERV9MT0dJQ19FUlJPUiA/IG1lc3NhZ2VzLmRlZmF1bHQgOiBtZXNzYWdlO1xuICAgICAgICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KG1lcmdlZE1lc3NhZ2UpID9cbiAgICAgICAgICAgICAgLyojX19QVVJFX18qL1xuICAgICAgICAgICAgICAvLyBXcmFwIFJlYWN0Tm9kZSB3aXRoIGBrZXlgXG4gICAgICAgICAgICAgIFJlYWN0LmNsb25lRWxlbWVudChtZXJnZWRNZXNzYWdlLCB7XG4gICAgICAgICAgICAgICAga2V5OiBcImVycm9yX1wiLmNvbmNhdChpbmRleClcbiAgICAgICAgICAgICAgfSkgOiBtZXJnZWRNZXNzYWdlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgIGlmICghKCFyZXN1bHQubGVuZ3RoICYmIHN1YlJ1bGVGaWVsZCkpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyMDtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwodmFsdWUubWFwKGZ1bmN0aW9uIChzdWJWYWx1ZSwgaSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlUnVsZShcIlwiLmNvbmNhdChuYW1lLCBcIi5cIikuY29uY2F0KGkpLCBzdWJWYWx1ZSwgc3ViUnVsZUZpZWxkLCBvcHRpb25zLCBtZXNzYWdlVmFyaWFibGVzKTtcbiAgICAgICAgICB9KSk7XG4gICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgc3ViUmVzdWx0cyA9IF9jb250ZXh0Mi5zZW50O1xuICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KFwicmV0dXJuXCIsIHN1YlJlc3VsdHMucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBlcnJvcnMpIHtcbiAgICAgICAgICAgIHJldHVybiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHByZXYpLCBfdG9Db25zdW1hYmxlQXJyYXkoZXJyb3JzKSk7XG4gICAgICAgICAgfSwgW10pKTtcbiAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICAvLyBSZXBsYWNlIG1lc3NhZ2Ugd2l0aCB2YXJpYWJsZXNcbiAgICAgICAgICBrdiA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcnVsZSksIHt9LCB7XG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgZW51bTogKHJ1bGUuZW51bSB8fCBbXSkuam9pbignLCAnKVxuICAgICAgICAgIH0sIG1lc3NhZ2VWYXJpYWJsZXMpO1xuICAgICAgICAgIGZpbGxWYXJpYWJsZVJlc3VsdCA9IHJlc3VsdC5tYXAoZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVycm9yID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICByZXR1cm4gcmVwbGFjZU1lc3NhZ2UoZXJyb3IsIGt2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdChcInJldHVyblwiLCBmaWxsVmFyaWFibGVSZXN1bHQpO1xuICAgICAgICBjYXNlIDI1OlxuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZTIsIG51bGwsIFtbOSwgMTRdXSk7XG4gIH0pKTtcbiAgcmV0dXJuIF92YWxpZGF0ZVJ1bGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVJ1bGVzKG5hbWVQYXRoLCB2YWx1ZSwgcnVsZXMsIG9wdGlvbnMsIHZhbGlkYXRlRmlyc3QsIG1lc3NhZ2VWYXJpYWJsZXMpIHtcbiAgdmFyIG5hbWUgPSBuYW1lUGF0aC5qb2luKCcuJyk7XG4gIC8vIEZpbGwgcnVsZSB3aXRoIGNvbnRleHRcbiAgdmFyIGZpbGxlZFJ1bGVzID0gcnVsZXMubWFwKGZ1bmN0aW9uIChjdXJyZW50UnVsZSwgcnVsZUluZGV4KSB7XG4gICAgdmFyIG9yaWdpblZhbGlkYXRvckZ1bmMgPSBjdXJyZW50UnVsZS52YWxpZGF0b3I7XG4gICAgdmFyIGNsb25lUnVsZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgY3VycmVudFJ1bGUpLCB7fSwge1xuICAgICAgcnVsZUluZGV4OiBydWxlSW5kZXhcbiAgICB9KTtcbiAgICAvLyBSZXBsYWNlIHZhbGlkYXRvciBpZiBuZWVkZWRcbiAgICBpZiAob3JpZ2luVmFsaWRhdG9yRnVuYykge1xuICAgICAgY2xvbmVSdWxlLnZhbGlkYXRvciA9IGZ1bmN0aW9uIChydWxlLCB2YWwsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBoYXNQcm9taXNlID0gZmFsc2U7XG4gICAgICAgIC8vIFdyYXAgY2FsbGJhY2sgb25seSBhY2NlcHQgd2hlbiBwcm9taXNlIG5vdCBwcm92aWRlZFxuICAgICAgICB2YXIgd3JhcHBlZENhbGxiYWNrID0gZnVuY3Rpb24gd3JhcHBlZENhbGxiYWNrKCkge1xuICAgICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gV2FpdCBhIHRpY2sgdG8gbWFrZSBzdXJlIHJldHVybiB0eXBlIGlzIGEgcHJvbWlzZVxuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgd2FybmluZyghaGFzUHJvbWlzZSwgJ1lvdXIgdmFsaWRhdG9yIGZ1bmN0aW9uIGhhcyBhbHJlYWR5IHJldHVybiBhIHByb21pc2UuIGBjYWxsYmFja2Agd2lsbCBiZSBpZ25vcmVkLicpO1xuICAgICAgICAgICAgaWYgKCFoYXNQcm9taXNlKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHZvaWQgMCwgYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIC8vIEdldCBwcm9taXNlXG4gICAgICAgIHZhciBwcm9taXNlID0gb3JpZ2luVmFsaWRhdG9yRnVuYyhydWxlLCB2YWwsIHdyYXBwZWRDYWxsYmFjayk7XG4gICAgICAgIGhhc1Byb21pc2UgPSBwcm9taXNlICYmIHR5cGVvZiBwcm9taXNlLnRoZW4gPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHByb21pc2UuY2F0Y2ggPT09ICdmdW5jdGlvbic7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAxLiBVc2UgcHJvbWlzZSBhcyB0aGUgZmlyc3QgcHJpb3JpdHkuXG4gICAgICAgICAqIDIuIElmIHByb21pc2Ugbm90IGV4aXN0LCB1c2UgY2FsbGJhY2sgd2l0aCB3YXJuaW5nIGluc3RlYWRcbiAgICAgICAgICovXG4gICAgICAgIHdhcm5pbmcoaGFzUHJvbWlzZSwgJ2BjYWxsYmFja2AgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHJldHVybiBhIHByb21pc2UgaW5zdGVhZC4nKTtcbiAgICAgICAgaWYgKGhhc1Byb21pc2UpIHtcbiAgICAgICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhlcnIgfHwgJyAnKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGNsb25lUnVsZTtcbiAgfSkuc29ydChmdW5jdGlvbiAoX3JlZiwgX3JlZjIpIHtcbiAgICB2YXIgdzEgPSBfcmVmLndhcm5pbmdPbmx5LFxuICAgICAgaTEgPSBfcmVmLnJ1bGVJbmRleDtcbiAgICB2YXIgdzIgPSBfcmVmMi53YXJuaW5nT25seSxcbiAgICAgIGkyID0gX3JlZjIucnVsZUluZGV4O1xuICAgIGlmICghIXcxID09PSAhIXcyKSB7XG4gICAgICAvLyBMZXQga2VlcCBvcmlnaW4gb3JkZXJcbiAgICAgIHJldHVybiBpMSAtIGkyO1xuICAgIH1cbiAgICBpZiAodzEpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH0pO1xuICAvLyBEbyB2YWxpZGF0ZSBydWxlc1xuICB2YXIgc3VtbWFyeVByb21pc2U7XG4gIGlmICh2YWxpZGF0ZUZpcnN0ID09PSB0cnVlKSB7XG4gICAgLy8gPj4+Pj4gVmFsaWRhdGUgYnkgc2VyaWFsaXphdGlvblxuICAgIHN1bW1hcnlQcm9taXNlID0gbmV3IFByb21pc2UoIC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3JlZjMgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciBpLCBydWxlLCBlcnJvcnM7XG4gICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIGkgPSAwO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICBpZiAoIShpIDwgZmlsbGVkUnVsZXMubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBydWxlID0gZmlsbGVkUnVsZXNbaV07XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1O1xuICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVSdWxlKG5hbWUsIHZhbHVlLCBydWxlLCBvcHRpb25zLCBtZXNzYWdlVmFyaWFibGVzKTtcbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgZXJyb3JzID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgICAgaWYgKCFlcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVqZWN0KFt7XG4gICAgICAgICAgICAgICAgZXJyb3JzOiBlcnJvcnMsXG4gICAgICAgICAgICAgICAgcnVsZTogcnVsZVxuICAgICAgICAgICAgICB9XSk7XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIik7XG4gICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgLyogZXNsaW50LWVuYWJsZSAqL1xuICAgICAgICAgICAgICByZXNvbHZlKFtdKTtcbiAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlKTtcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoX3g2LCBfeDcpIHtcbiAgICAgICAgcmV0dXJuIF9yZWYzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIH0oKSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gPj4+Pj4gVmFsaWRhdGUgYnkgcGFyYWxsZWxcbiAgICB2YXIgcnVsZVByb21pc2VzID0gZmlsbGVkUnVsZXMubWFwKGZ1bmN0aW9uIChydWxlKSB7XG4gICAgICByZXR1cm4gdmFsaWRhdGVSdWxlKG5hbWUsIHZhbHVlLCBydWxlLCBvcHRpb25zLCBtZXNzYWdlVmFyaWFibGVzKS50aGVuKGZ1bmN0aW9uIChlcnJvcnMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcnM6IGVycm9ycyxcbiAgICAgICAgICBydWxlOiBydWxlXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBzdW1tYXJ5UHJvbWlzZSA9ICh2YWxpZGF0ZUZpcnN0ID8gZmluaXNoT25GaXJzdEZhaWxlZChydWxlUHJvbWlzZXMpIDogZmluaXNoT25BbGxGYWlsZWQocnVsZVByb21pc2VzKSkudGhlbihmdW5jdGlvbiAoZXJyb3JzKSB7XG4gICAgICAvLyBBbHdheXMgY2hhbmdlIHRvIHJlamVjdGlvbiBmb3IgRmllbGQgdG8gY2F0Y2hcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcnMpO1xuICAgIH0pO1xuICB9XG4gIC8vIEludGVybmFsIGNhdGNoIGVycm9yIHRvIGF2b2lkIGNvbnNvbGUgZXJyb3IgbG9nLlxuICBzdW1tYXJ5UHJvbWlzZS5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgIHJldHVybiBlO1xuICB9KTtcbiAgcmV0dXJuIHN1bW1hcnlQcm9taXNlO1xufVxuZnVuY3Rpb24gZmluaXNoT25BbGxGYWlsZWQoX3g4KSB7XG4gIHJldHVybiBfZmluaXNoT25BbGxGYWlsZWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIF9maW5pc2hPbkFsbEZhaWxlZCgpIHtcbiAgX2ZpbmlzaE9uQWxsRmFpbGVkID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlMyhydWxlUHJvbWlzZXMpIHtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTMkKF9jb250ZXh0Mykge1xuICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoXCJyZXR1cm5cIiwgUHJvbWlzZS5hbGwocnVsZVByb21pc2VzKS50aGVuKGZ1bmN0aW9uIChlcnJvcnNMaXN0KSB7XG4gICAgICAgICAgICB2YXIgX3JlZjU7XG4gICAgICAgICAgICB2YXIgZXJyb3JzID0gKF9yZWY1ID0gW10pLmNvbmNhdC5hcHBseShfcmVmNSwgX3RvQ29uc3VtYWJsZUFycmF5KGVycm9yc0xpc3QpKTtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgICAgICAgfSkpO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTtcbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMyk7XG4gIH0pKTtcbiAgcmV0dXJuIF9maW5pc2hPbkFsbEZhaWxlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZnVuY3Rpb24gZmluaXNoT25GaXJzdEZhaWxlZChfeDkpIHtcbiAgcmV0dXJuIF9maW5pc2hPbkZpcnN0RmFpbGVkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBfZmluaXNoT25GaXJzdEZhaWxlZCgpIHtcbiAgX2ZpbmlzaE9uRmlyc3RGYWlsZWQgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU0KHJ1bGVQcm9taXNlcykge1xuICAgIHZhciBjb3VudDtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTQkKF9jb250ZXh0NCkge1xuICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ0LnByZXYgPSBfY29udGV4dDQubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgY291bnQgPSAwO1xuICAgICAgICAgIHJldHVybiBfY29udGV4dDQuYWJydXB0KFwicmV0dXJuXCIsIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICBydWxlUHJvbWlzZXMuZm9yRWFjaChmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICAgICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKHJ1bGVFcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChydWxlRXJyb3IuZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZShbcnVsZUVycm9yXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ID09PSBydWxlUHJvbWlzZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICByZXNvbHZlKFtdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkpO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LnN0b3AoKTtcbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlNCk7XG4gIH0pKTtcbiAgcmV0dXJuIF9maW5pc2hPbkZpcnN0RmFpbGVkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2Fzc2VydFRoaXNJbml0aWFsaXplZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXNzZXJ0VGhpc0luaXRpYWxpemVkXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c1wiO1xuaW1wb3J0IF9jcmVhdGVTdXBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlU3VwZXJcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJuYW1lXCJdO1xuaW1wb3J0IHRvQ2hpbGRyZW5BcnJheSBmcm9tIFwicmMtdXRpbC9lcy9DaGlsZHJlbi90b0FycmF5XCI7XG5pbXBvcnQgd2FybmluZyBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRmllbGRDb250ZXh0LCB7IEhPT0tfTUFSSyB9IGZyb20gJy4vRmllbGRDb250ZXh0JztcbmltcG9ydCB7IHRvQXJyYXkgfSBmcm9tICcuL3V0aWxzL3R5cGVVdGlsJztcbmltcG9ydCB7IHZhbGlkYXRlUnVsZXMgfSBmcm9tICcuL3V0aWxzL3ZhbGlkYXRlVXRpbCc7XG5pbXBvcnQgeyBjb250YWluc05hbWVQYXRoLCBkZWZhdWx0R2V0VmFsdWVGcm9tRXZlbnQsIGdldE5hbWVQYXRoLCBnZXRWYWx1ZSB9IGZyb20gJy4vdXRpbHMvdmFsdWVVdGlsJztcbnZhciBFTVBUWV9FUlJPUlMgPSBbXTtcbmZ1bmN0aW9uIHJlcXVpcmVVcGRhdGUoc2hvdWxkVXBkYXRlLCBwcmV2LCBuZXh0LCBwcmV2VmFsdWUsIG5leHRWYWx1ZSwgaW5mbykge1xuICBpZiAodHlwZW9mIHNob3VsZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBzaG91bGRVcGRhdGUocHJldiwgbmV4dCwgJ3NvdXJjZScgaW4gaW5mbyA/IHtcbiAgICAgIHNvdXJjZTogaW5mby5zb3VyY2VcbiAgICB9IDoge30pO1xuICB9XG4gIHJldHVybiBwcmV2VmFsdWUgIT09IG5leHRWYWx1ZTtcbn1cbi8vIFdlIHVzZSBDbGFzcyBpbnN0ZWFkIG9mIEhvb2tzIGhlcmUgc2luY2UgaXQgd2lsbCBjb3N0IG11Y2ggY29kZSBieSB1c2luZyBIb29rcy5cbnZhciBGaWVsZCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoRmllbGQsIF9SZWFjdCRDb21wb25lbnQpO1xuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKEZpZWxkKTtcbiAgLyoqXG4gICAqIEZvbGxvdyBzdGF0ZSBzaG91bGQgbm90IG1hbmFnZW1lbnQgaW4gU3RhdGUgc2luY2UgaXQgd2lsbCBhc3luYyB1cGRhdGUgYnkgUmVhY3QuXG4gICAqIFRoaXMgbWFrZXMgZmlyc3QgcmVuZGVyIG9mIGZvcm0gY2FuIG5vdCBnZXQgY29ycmVjdCBzdGF0ZSB2YWx1ZS5cbiAgICovXG5cbiAgLyoqXG4gICAqIE1hcmsgd2hlbiB0b3VjaGVkICYgdmFsaWRhdGVkLiBDdXJyZW50bHkgb25seSB1c2VkIGZvciBgZGVwZW5kZW5jaWVzYC5cbiAgICogTm90ZSB0aGF0IHdlIGRvIG5vdCB0aGluayBmaWVsZCB3aXRoIGBpbml0aWFsVmFsdWVgIGlzIGRpcnR5XG4gICAqIGJ1dCB0aGlzIHdpbGwgYmUgYnkgYGlzRmllbGREaXJ0eWAgZnVuYy5cbiAgICovXG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFN1YnNjcmlwdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGZ1bmN0aW9uIEZpZWxkKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGaWVsZCk7XG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcyk7XG4gICAgLy8gUmVnaXN0ZXIgb24gaW5pdFxuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgcmVzZXRDb3VudDogMFxuICAgIH07XG4gICAgX3RoaXMuY2FuY2VsUmVnaXN0ZXJGdW5jID0gbnVsbDtcbiAgICBfdGhpcy5tb3VudGVkID0gZmFsc2U7XG4gICAgX3RoaXMudG91Y2hlZCA9IGZhbHNlO1xuICAgIF90aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgX3RoaXMudmFsaWRhdGVQcm9taXNlID0gbnVsbDtcbiAgICBfdGhpcy5wcmV2VmFsaWRhdGluZyA9IHZvaWQgMDtcbiAgICBfdGhpcy5lcnJvcnMgPSBFTVBUWV9FUlJPUlM7XG4gICAgX3RoaXMud2FybmluZ3MgPSBFTVBUWV9FUlJPUlM7XG4gICAgX3RoaXMuY2FuY2VsUmVnaXN0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgcHJlc2VydmUgPSBfdGhpcyRwcm9wcy5wcmVzZXJ2ZSxcbiAgICAgICAgaXNMaXN0RmllbGQgPSBfdGhpcyRwcm9wcy5pc0xpc3RGaWVsZCxcbiAgICAgICAgbmFtZSA9IF90aGlzJHByb3BzLm5hbWU7XG4gICAgICBpZiAoX3RoaXMuY2FuY2VsUmVnaXN0ZXJGdW5jKSB7XG4gICAgICAgIF90aGlzLmNhbmNlbFJlZ2lzdGVyRnVuYyhpc0xpc3RGaWVsZCwgcHJlc2VydmUsIGdldE5hbWVQYXRoKG5hbWUpKTtcbiAgICAgIH1cbiAgICAgIF90aGlzLmNhbmNlbFJlZ2lzdGVyRnVuYyA9IG51bGw7XG4gICAgfTtcbiAgICBfdGhpcy5nZXROYW1lUGF0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgbmFtZSA9IF90aGlzJHByb3BzMi5uYW1lLFxuICAgICAgICBmaWVsZENvbnRleHQgPSBfdGhpcyRwcm9wczIuZmllbGRDb250ZXh0O1xuICAgICAgdmFyIF9maWVsZENvbnRleHQkcHJlZml4TiA9IGZpZWxkQ29udGV4dC5wcmVmaXhOYW1lLFxuICAgICAgICBwcmVmaXhOYW1lID0gX2ZpZWxkQ29udGV4dCRwcmVmaXhOID09PSB2b2lkIDAgPyBbXSA6IF9maWVsZENvbnRleHQkcHJlZml4TjtcbiAgICAgIHJldHVybiBuYW1lICE9PSB1bmRlZmluZWQgPyBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHByZWZpeE5hbWUpLCBfdG9Db25zdW1hYmxlQXJyYXkobmFtZSkpIDogW107XG4gICAgfTtcbiAgICBfdGhpcy5nZXRSdWxlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgX3RoaXMkcHJvcHMzJHJ1bGVzID0gX3RoaXMkcHJvcHMzLnJ1bGVzLFxuICAgICAgICBydWxlcyA9IF90aGlzJHByb3BzMyRydWxlcyA9PT0gdm9pZCAwID8gW10gOiBfdGhpcyRwcm9wczMkcnVsZXMsXG4gICAgICAgIGZpZWxkQ29udGV4dCA9IF90aGlzJHByb3BzMy5maWVsZENvbnRleHQ7XG4gICAgICByZXR1cm4gcnVsZXMubWFwKGZ1bmN0aW9uIChydWxlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcnVsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBydWxlKGZpZWxkQ29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJ1bGU7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIF90aGlzLnJlZnJlc2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIV90aGlzLm1vdW50ZWQpIHJldHVybjtcbiAgICAgIC8qKlxuICAgICAgICogQ2xlYW4gdXAgY3VycmVudCBub2RlLlxuICAgICAgICovXG4gICAgICBfdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgcmVzZXRDb3VudCA9IF9yZWYucmVzZXRDb3VudDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXNldENvdW50OiByZXNldENvdW50ICsgMVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfTtcbiAgICBfdGhpcy50cmlnZ2VyTWV0YUV2ZW50ID0gZnVuY3Rpb24gKGRlc3Ryb3kpIHtcbiAgICAgIHZhciBvbk1ldGFDaGFuZ2UgPSBfdGhpcy5wcm9wcy5vbk1ldGFDaGFuZ2U7XG4gICAgICBvbk1ldGFDaGFuZ2UgPT09IG51bGwgfHwgb25NZXRhQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbk1ldGFDaGFuZ2UoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfdGhpcy5nZXRNZXRhKCkpLCB7fSwge1xuICAgICAgICBkZXN0cm95OiBkZXN0cm95XG4gICAgICB9KSk7XG4gICAgfTtcbiAgICBfdGhpcy5vblN0b3JlQ2hhbmdlID0gZnVuY3Rpb24gKHByZXZTdG9yZSwgbmFtZVBhdGhMaXN0LCBpbmZvKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM0ID0gX3RoaXMucHJvcHMsXG4gICAgICAgIHNob3VsZFVwZGF0ZSA9IF90aGlzJHByb3BzNC5zaG91bGRVcGRhdGUsXG4gICAgICAgIF90aGlzJHByb3BzNCRkZXBlbmRlbiA9IF90aGlzJHByb3BzNC5kZXBlbmRlbmNpZXMsXG4gICAgICAgIGRlcGVuZGVuY2llcyA9IF90aGlzJHByb3BzNCRkZXBlbmRlbiA9PT0gdm9pZCAwID8gW10gOiBfdGhpcyRwcm9wczQkZGVwZW5kZW4sXG4gICAgICAgIG9uUmVzZXQgPSBfdGhpcyRwcm9wczQub25SZXNldDtcbiAgICAgIHZhciBzdG9yZSA9IGluZm8uc3RvcmU7XG4gICAgICB2YXIgbmFtZVBhdGggPSBfdGhpcy5nZXROYW1lUGF0aCgpO1xuICAgICAgdmFyIHByZXZWYWx1ZSA9IF90aGlzLmdldFZhbHVlKHByZXZTdG9yZSk7XG4gICAgICB2YXIgY3VyVmFsdWUgPSBfdGhpcy5nZXRWYWx1ZShzdG9yZSk7XG4gICAgICB2YXIgbmFtZVBhdGhNYXRjaCA9IG5hbWVQYXRoTGlzdCAmJiBjb250YWluc05hbWVQYXRoKG5hbWVQYXRoTGlzdCwgbmFtZVBhdGgpO1xuICAgICAgLy8gYHNldEZpZWxkc1ZhbHVlYCBpcyBhIHF1aWNrIGFjY2VzcyB0byB1cGRhdGUgcmVsYXRlZCBzdGF0dXNcbiAgICAgIGlmIChpbmZvLnR5cGUgPT09ICd2YWx1ZVVwZGF0ZScgJiYgaW5mby5zb3VyY2UgPT09ICdleHRlcm5hbCcgJiYgcHJldlZhbHVlICE9PSBjdXJWYWx1ZSkge1xuICAgICAgICBfdGhpcy50b3VjaGVkID0gdHJ1ZTtcbiAgICAgICAgX3RoaXMuZGlydHkgPSB0cnVlO1xuICAgICAgICBfdGhpcy52YWxpZGF0ZVByb21pc2UgPSBudWxsO1xuICAgICAgICBfdGhpcy5lcnJvcnMgPSBFTVBUWV9FUlJPUlM7XG4gICAgICAgIF90aGlzLndhcm5pbmdzID0gRU1QVFlfRVJST1JTO1xuICAgICAgICBfdGhpcy50cmlnZ2VyTWV0YUV2ZW50KCk7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKGluZm8udHlwZSkge1xuICAgICAgICBjYXNlICdyZXNldCc6XG4gICAgICAgICAgaWYgKCFuYW1lUGF0aExpc3QgfHwgbmFtZVBhdGhNYXRjaCkge1xuICAgICAgICAgICAgLy8gQ2xlYW4gdXAgc3RhdGVcbiAgICAgICAgICAgIF90aGlzLnRvdWNoZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIF90aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgICAgICAgICBfdGhpcy52YWxpZGF0ZVByb21pc2UgPSBudWxsO1xuICAgICAgICAgICAgX3RoaXMuZXJyb3JzID0gRU1QVFlfRVJST1JTO1xuICAgICAgICAgICAgX3RoaXMud2FybmluZ3MgPSBFTVBUWV9FUlJPUlM7XG4gICAgICAgICAgICBfdGhpcy50cmlnZ2VyTWV0YUV2ZW50KCk7XG4gICAgICAgICAgICBvblJlc2V0ID09PSBudWxsIHx8IG9uUmVzZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uUmVzZXQoKTtcbiAgICAgICAgICAgIF90aGlzLnJlZnJlc2goKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbiBjYXNlIGZpZWxkIHdpdGggYHByZXNlcnZlID0gZmFsc2VgIG5lc3QgZGVwcyBsaWtlOlxuICAgICAgICAgKiAtIEEgPSAxID0+IHNob3cgQlxuICAgICAgICAgKiAtIEIgPSAxID0+IHNob3cgQ1xuICAgICAgICAgKiAtIFJlc2V0IEEsIG5lZWQgY2xlYW4gQiwgQ1xuICAgICAgICAgKi9cbiAgICAgICAgY2FzZSAncmVtb3ZlJzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgICAgICAgICAgIF90aGlzLnJlUmVuZGVyKCk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAnc2V0RmllbGQnOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChuYW1lUGF0aE1hdGNoKSB7XG4gICAgICAgICAgICAgIHZhciBkYXRhID0gaW5mby5kYXRhO1xuICAgICAgICAgICAgICBpZiAoJ3RvdWNoZWQnIGluIGRhdGEpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy50b3VjaGVkID0gZGF0YS50b3VjaGVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICgndmFsaWRhdGluZycgaW4gZGF0YSAmJiAhKCdvcmlnaW5SQ0ZpZWxkJyBpbiBkYXRhKSkge1xuICAgICAgICAgICAgICAgIF90aGlzLnZhbGlkYXRlUHJvbWlzZSA9IGRhdGEudmFsaWRhdGluZyA/IFByb21pc2UucmVzb2x2ZShbXSkgOiBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICgnZXJyb3JzJyBpbiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuZXJyb3JzID0gZGF0YS5lcnJvcnMgfHwgRU1QVFlfRVJST1JTO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICgnd2FybmluZ3MnIGluIGRhdGEpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy53YXJuaW5ncyA9IGRhdGEud2FybmluZ3MgfHwgRU1QVFlfRVJST1JTO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF90aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgX3RoaXMudHJpZ2dlck1ldGFFdmVudCgpO1xuICAgICAgICAgICAgICBfdGhpcy5yZVJlbmRlcigpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBIYW5kbGUgdXBkYXRlIGJ5IGBzZXRGaWVsZGAgd2l0aCBgc2hvdWxkVXBkYXRlYFxuICAgICAgICAgICAgaWYgKHNob3VsZFVwZGF0ZSAmJiAhbmFtZVBhdGgubGVuZ3RoICYmIHJlcXVpcmVVcGRhdGUoc2hvdWxkVXBkYXRlLCBwcmV2U3RvcmUsIHN0b3JlLCBwcmV2VmFsdWUsIGN1clZhbHVlLCBpbmZvKSkge1xuICAgICAgICAgICAgICBfdGhpcy5yZVJlbmRlcigpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RlcGVuZGVuY2llc1VwZGF0ZSc6XG4gICAgICAgICAge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBUcmlnZ2VyIHdoZW4gbWFya2VkIGBkZXBlbmRlbmNpZXNgIHVwZGF0ZWQuIFJlbGF0ZWQgZmllbGRzIHdpbGwgYWxsIHVwZGF0ZVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICB2YXIgZGVwZW5kZW5jeUxpc3QgPSBkZXBlbmRlbmNpZXMubWFwKGdldE5hbWVQYXRoKTtcbiAgICAgICAgICAgIC8vIE5vIG5lZWQgZm9yIGBuYW1lUGF0aE1hdGhgIGNoZWNrIGFuZCBgc2hvdWxkVXBkYXRlYCBjaGVjaywgc2luY2UgYHZhbHVlVXBkYXRlYCB3aWxsIGJlXG4gICAgICAgICAgICAvLyBlbWl0dGVkIGVhcmxpZXIgYW5kIHRoZXkgd2lsbCB3b3JrIHRoZXJlXG4gICAgICAgICAgICAvLyBJZiBzZXQgaXQgbWF5IGNhdXNlIHVubmVjZXNzYXJ5IHR3aWNlIHJlcmVuZGVyaW5nXG4gICAgICAgICAgICBpZiAoZGVwZW5kZW5jeUxpc3Quc29tZShmdW5jdGlvbiAoZGVwZW5kZW5jeSkge1xuICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNOYW1lUGF0aChpbmZvLnJlbGF0ZWRGaWVsZHMsIGRlcGVuZGVuY3kpO1xuICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgICAgX3RoaXMucmVSZW5kZXIoKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIDEuIElmIGBuYW1lUGF0aGAgZXhpc3RzIGluIGBuYW1lUGF0aExpc3RgLCBtZWFucyBpdCdzIHJlbGF0ZWQgdmFsdWUgYW5kIHNob3VsZCB1cGRhdGVcbiAgICAgICAgICAvLyAgICAgIEZvciBleGFtcGxlIDxMaXN0IG5hbWU9XCJsaXN0XCI+PEZpZWxkIG5hbWU9e1snbGlzdCcsIDBdfT48L0xpc3Q+XG4gICAgICAgICAgLy8gICAgICBJZiBgbmFtZVBhdGhMaXN0YCBpcyBbWydsaXN0J11dIChMaXN0IHZhbHVlIHVwZGF0ZSksIEZpZWxkIHNob3VsZCBiZSB1cGRhdGVkXG4gICAgICAgICAgLy8gICAgICBJZiBgbmFtZVBhdGhMaXN0YCBpcyBbWydsaXN0JywgMF1dIChGaWVsZCB2YWx1ZSB1cGRhdGUpLCBMaXN0IHNob3VsZG4ndCBiZSB1cGRhdGVkXG4gICAgICAgICAgLy8gMi5cbiAgICAgICAgICAvLyAgIDIuMSBJZiBgZGVwZW5kZW5jaWVzYCBpcyBzZXQsIGBuYW1lYCBpcyBub3Qgc2V0IGFuZCBgc2hvdWxkVXBkYXRlYCBpcyBub3Qgc2V0LFxuICAgICAgICAgIC8vICAgICAgIGRvbid0IHVzZSBgc2hvdWxkVXBkYXRlYC4gYGRlcGVuZGVuY2llc2AgaXMgdmlldyBhcyBhIHNob3J0Y3V0IGlmIGBzaG91bGRVcGRhdGVgXG4gICAgICAgICAgLy8gICAgICAgaXMgbm90IHByb3ZpZGVkXG4gICAgICAgICAgLy8gICAyLjIgSWYgYHNob3VsZFVwZGF0ZWAgcHJvdmlkZWQsIHVzZSBjdXN0b21pemUgbG9naWMgdG8gdXBkYXRlIHRoZSBmaWVsZFxuICAgICAgICAgIC8vICAgICAgIGVsc2UgdG8gY2hlY2sgaWYgdmFsdWUgY2hhbmdlZFxuICAgICAgICAgIGlmIChuYW1lUGF0aE1hdGNoIHx8ICghZGVwZW5kZW5jaWVzLmxlbmd0aCB8fCBuYW1lUGF0aC5sZW5ndGggfHwgc2hvdWxkVXBkYXRlKSAmJiByZXF1aXJlVXBkYXRlKHNob3VsZFVwZGF0ZSwgcHJldlN0b3JlLCBzdG9yZSwgcHJldlZhbHVlLCBjdXJWYWx1ZSwgaW5mbykpIHtcbiAgICAgICAgICAgIF90aGlzLnJlUmVuZGVyKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFVwZGF0ZSA9PT0gdHJ1ZSkge1xuICAgICAgICBfdGhpcy5yZVJlbmRlcigpO1xuICAgICAgfVxuICAgIH07XG4gICAgX3RoaXMudmFsaWRhdGVSdWxlcyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAvLyBXZSBzaG91bGQgZml4ZWQgbmFtZVBhdGggJiB2YWx1ZSB0byBhdm9pZCBkZXZlbG9wZXIgY2hhbmdlIHRoZW4gYnkgZm9ybSBmdW5jdGlvblxuICAgICAgdmFyIG5hbWVQYXRoID0gX3RoaXMuZ2V0TmFtZVBhdGgoKTtcbiAgICAgIHZhciBjdXJyZW50VmFsdWUgPSBfdGhpcy5nZXRWYWx1ZSgpO1xuICAgICAgLy8gRm9yY2UgY2hhbmdlIHRvIGFzeW5jIHRvIGF2b2lkIHJ1bGUgT09EIHVuZGVyIHJlbmRlclByb3BzIGZpZWxkXG4gICAgICB2YXIgcm9vdFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFfdGhpcy5tb3VudGVkKSB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfdGhpcyRwcm9wczUgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBfdGhpcyRwcm9wczUkdmFsaWRhdGUgPSBfdGhpcyRwcm9wczUudmFsaWRhdGVGaXJzdCxcbiAgICAgICAgICB2YWxpZGF0ZUZpcnN0ID0gX3RoaXMkcHJvcHM1JHZhbGlkYXRlID09PSB2b2lkIDAgPyBmYWxzZSA6IF90aGlzJHByb3BzNSR2YWxpZGF0ZSxcbiAgICAgICAgICBtZXNzYWdlVmFyaWFibGVzID0gX3RoaXMkcHJvcHM1Lm1lc3NhZ2VWYXJpYWJsZXM7XG4gICAgICAgIHZhciBfcmVmMiA9IG9wdGlvbnMgfHwge30sXG4gICAgICAgICAgdHJpZ2dlck5hbWUgPSBfcmVmMi50cmlnZ2VyTmFtZTtcbiAgICAgICAgdmFyIGZpbHRlcmVkUnVsZXMgPSBfdGhpcy5nZXRSdWxlcygpO1xuICAgICAgICBpZiAodHJpZ2dlck5hbWUpIHtcbiAgICAgICAgICBmaWx0ZXJlZFJ1bGVzID0gZmlsdGVyZWRSdWxlcy5maWx0ZXIoZnVuY3Rpb24gKHJ1bGUpIHtcbiAgICAgICAgICAgIHJldHVybiBydWxlO1xuICAgICAgICAgIH0pLmZpbHRlcihmdW5jdGlvbiAocnVsZSkge1xuICAgICAgICAgICAgdmFyIHZhbGlkYXRlVHJpZ2dlciA9IHJ1bGUudmFsaWRhdGVUcmlnZ2VyO1xuICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZVRyaWdnZXIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdHJpZ2dlckxpc3QgPSB0b0FycmF5KHZhbGlkYXRlVHJpZ2dlcik7XG4gICAgICAgICAgICByZXR1cm4gdHJpZ2dlckxpc3QuaW5jbHVkZXModHJpZ2dlck5hbWUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwcm9taXNlID0gdmFsaWRhdGVSdWxlcyhuYW1lUGF0aCwgY3VycmVudFZhbHVlLCBmaWx0ZXJlZFJ1bGVzLCBvcHRpb25zLCB2YWxpZGF0ZUZpcnN0LCBtZXNzYWdlVmFyaWFibGVzKTtcbiAgICAgICAgcHJvbWlzZS5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgcnVsZUVycm9ycyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogRU1QVFlfRVJST1JTO1xuICAgICAgICAgIGlmIChfdGhpcy52YWxpZGF0ZVByb21pc2UgPT09IHJvb3RQcm9taXNlKSB7XG4gICAgICAgICAgICB2YXIgX3J1bGVFcnJvcnMkZm9yRWFjaDtcbiAgICAgICAgICAgIF90aGlzLnZhbGlkYXRlUHJvbWlzZSA9IG51bGw7XG4gICAgICAgICAgICAvLyBHZXQgZXJyb3JzICYgd2FybmluZ3NcbiAgICAgICAgICAgIHZhciBuZXh0RXJyb3JzID0gW107XG4gICAgICAgICAgICB2YXIgbmV4dFdhcm5pbmdzID0gW107XG4gICAgICAgICAgICAoX3J1bGVFcnJvcnMkZm9yRWFjaCA9IHJ1bGVFcnJvcnMuZm9yRWFjaCkgPT09IG51bGwgfHwgX3J1bGVFcnJvcnMkZm9yRWFjaCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3J1bGVFcnJvcnMkZm9yRWFjaC5jYWxsKHJ1bGVFcnJvcnMsIGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgICAgICAgICB2YXIgd2FybmluZ09ubHkgPSBfcmVmMy5ydWxlLndhcm5pbmdPbmx5LFxuICAgICAgICAgICAgICAgIF9yZWYzJGVycm9ycyA9IF9yZWYzLmVycm9ycyxcbiAgICAgICAgICAgICAgICBlcnJvcnMgPSBfcmVmMyRlcnJvcnMgPT09IHZvaWQgMCA/IEVNUFRZX0VSUk9SUyA6IF9yZWYzJGVycm9ycztcbiAgICAgICAgICAgICAgaWYgKHdhcm5pbmdPbmx5KSB7XG4gICAgICAgICAgICAgICAgbmV4dFdhcm5pbmdzLnB1c2guYXBwbHkobmV4dFdhcm5pbmdzLCBfdG9Db25zdW1hYmxlQXJyYXkoZXJyb3JzKSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV4dEVycm9ycy5wdXNoLmFwcGx5KG5leHRFcnJvcnMsIF90b0NvbnN1bWFibGVBcnJheShlcnJvcnMpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBfdGhpcy5lcnJvcnMgPSBuZXh0RXJyb3JzO1xuICAgICAgICAgICAgX3RoaXMud2FybmluZ3MgPSBuZXh0V2FybmluZ3M7XG4gICAgICAgICAgICBfdGhpcy50cmlnZ2VyTWV0YUV2ZW50KCk7XG4gICAgICAgICAgICBfdGhpcy5yZVJlbmRlcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgfSk7XG4gICAgICBfdGhpcy52YWxpZGF0ZVByb21pc2UgPSByb290UHJvbWlzZTtcbiAgICAgIF90aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICAgIF90aGlzLmVycm9ycyA9IEVNUFRZX0VSUk9SUztcbiAgICAgIF90aGlzLndhcm5pbmdzID0gRU1QVFlfRVJST1JTO1xuICAgICAgX3RoaXMudHJpZ2dlck1ldGFFdmVudCgpO1xuICAgICAgLy8gRm9yY2UgdHJpZ2dlciByZS1yZW5kZXIgc2luY2Ugd2UgbmVlZCBzeW5jIHJlbmRlclByb3BzIHdpdGggbmV3IG1ldGFcbiAgICAgIF90aGlzLnJlUmVuZGVyKCk7XG4gICAgICByZXR1cm4gcm9vdFByb21pc2U7XG4gICAgfTtcbiAgICBfdGhpcy5pc0ZpZWxkVmFsaWRhdGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhIV90aGlzLnZhbGlkYXRlUHJvbWlzZTtcbiAgICB9O1xuICAgIF90aGlzLmlzRmllbGRUb3VjaGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnRvdWNoZWQ7XG4gICAgfTtcbiAgICBfdGhpcy5pc0ZpZWxkRGlydHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBUb3VjaGVkIG9yIHZhbGlkYXRlIG9yIGhhcyBpbml0aWFsVmFsdWVcbiAgICAgIGlmIChfdGhpcy5kaXJ0eSB8fCBfdGhpcy5wcm9wcy5pbml0aWFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8vIEZvcm0gc2V0IGluaXRpYWxWYWx1ZVxuICAgICAgdmFyIGZpZWxkQ29udGV4dCA9IF90aGlzLnByb3BzLmZpZWxkQ29udGV4dDtcbiAgICAgIHZhciBfZmllbGRDb250ZXh0JGdldEludGUgPSBmaWVsZENvbnRleHQuZ2V0SW50ZXJuYWxIb29rcyhIT09LX01BUkspLFxuICAgICAgICBnZXRJbml0aWFsVmFsdWUgPSBfZmllbGRDb250ZXh0JGdldEludGUuZ2V0SW5pdGlhbFZhbHVlO1xuICAgICAgaWYgKGdldEluaXRpYWxWYWx1ZShfdGhpcy5nZXROYW1lUGF0aCgpKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgX3RoaXMuZ2V0RXJyb3JzID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLmVycm9ycztcbiAgICB9O1xuICAgIF90aGlzLmdldFdhcm5pbmdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLndhcm5pbmdzO1xuICAgIH07XG4gICAgX3RoaXMuaXNMaXN0RmllbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMucHJvcHMuaXNMaXN0RmllbGQ7XG4gICAgfTtcbiAgICBfdGhpcy5pc0xpc3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMucHJvcHMuaXNMaXN0O1xuICAgIH07XG4gICAgX3RoaXMuaXNQcmVzZXJ2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5wcm9wcy5wcmVzZXJ2ZTtcbiAgICB9O1xuICAgIF90aGlzLmdldE1ldGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBNYWtlIGVycm9yICYgdmFsaWRhdGluZyBpbiBjYWNoZSB0byBzYXZlIHBlcmZcbiAgICAgIF90aGlzLnByZXZWYWxpZGF0aW5nID0gX3RoaXMuaXNGaWVsZFZhbGlkYXRpbmcoKTtcbiAgICAgIHZhciBtZXRhID0ge1xuICAgICAgICB0b3VjaGVkOiBfdGhpcy5pc0ZpZWxkVG91Y2hlZCgpLFxuICAgICAgICB2YWxpZGF0aW5nOiBfdGhpcy5wcmV2VmFsaWRhdGluZyxcbiAgICAgICAgZXJyb3JzOiBfdGhpcy5lcnJvcnMsXG4gICAgICAgIHdhcm5pbmdzOiBfdGhpcy53YXJuaW5ncyxcbiAgICAgICAgbmFtZTogX3RoaXMuZ2V0TmFtZVBhdGgoKVxuICAgICAgfTtcbiAgICAgIHJldHVybiBtZXRhO1xuICAgIH07XG4gICAgX3RoaXMuZ2V0T25seUNoaWxkID0gZnVuY3Rpb24gKGNoaWxkcmVuKSB7XG4gICAgICAvLyBTdXBwb3J0IHJlbmRlciBwcm9wc1xuICAgICAgaWYgKHR5cGVvZiBjaGlsZHJlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YXIgbWV0YSA9IF90aGlzLmdldE1ldGEoKTtcbiAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3RoaXMuZ2V0T25seUNoaWxkKGNoaWxkcmVuKF90aGlzLmdldENvbnRyb2xsZWQoKSwgbWV0YSwgX3RoaXMucHJvcHMuZmllbGRDb250ZXh0KSkpLCB7fSwge1xuICAgICAgICAgIGlzRnVuY3Rpb246IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvLyBGaWxlZCBlbGVtZW50IG9ubHlcbiAgICAgIHZhciBjaGlsZExpc3QgPSB0b0NoaWxkcmVuQXJyYXkoY2hpbGRyZW4pO1xuICAgICAgaWYgKGNoaWxkTGlzdC5sZW5ndGggIT09IDEgfHwgISAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGRMaXN0WzBdKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNoaWxkOiBjaGlsZExpc3QsXG4gICAgICAgICAgaXNGdW5jdGlvbjogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNoaWxkOiBjaGlsZExpc3RbMF0sXG4gICAgICAgIGlzRnVuY3Rpb246IGZhbHNlXG4gICAgICB9O1xuICAgIH07XG4gICAgX3RoaXMuZ2V0VmFsdWUgPSBmdW5jdGlvbiAoc3RvcmUpIHtcbiAgICAgIHZhciBnZXRGaWVsZHNWYWx1ZSA9IF90aGlzLnByb3BzLmZpZWxkQ29udGV4dC5nZXRGaWVsZHNWYWx1ZTtcbiAgICAgIHZhciBuYW1lUGF0aCA9IF90aGlzLmdldE5hbWVQYXRoKCk7XG4gICAgICByZXR1cm4gZ2V0VmFsdWUoc3RvcmUgfHwgZ2V0RmllbGRzVmFsdWUodHJ1ZSksIG5hbWVQYXRoKTtcbiAgICB9O1xuICAgIF90aGlzLmdldENvbnRyb2xsZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgY2hpbGRQcm9wcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICB2YXIgX3RoaXMkcHJvcHM2ID0gX3RoaXMucHJvcHMsXG4gICAgICAgIHRyaWdnZXIgPSBfdGhpcyRwcm9wczYudHJpZ2dlcixcbiAgICAgICAgdmFsaWRhdGVUcmlnZ2VyID0gX3RoaXMkcHJvcHM2LnZhbGlkYXRlVHJpZ2dlcixcbiAgICAgICAgZ2V0VmFsdWVGcm9tRXZlbnQgPSBfdGhpcyRwcm9wczYuZ2V0VmFsdWVGcm9tRXZlbnQsXG4gICAgICAgIG5vcm1hbGl6ZSA9IF90aGlzJHByb3BzNi5ub3JtYWxpemUsXG4gICAgICAgIHZhbHVlUHJvcE5hbWUgPSBfdGhpcyRwcm9wczYudmFsdWVQcm9wTmFtZSxcbiAgICAgICAgZ2V0VmFsdWVQcm9wcyA9IF90aGlzJHByb3BzNi5nZXRWYWx1ZVByb3BzLFxuICAgICAgICBmaWVsZENvbnRleHQgPSBfdGhpcyRwcm9wczYuZmllbGRDb250ZXh0O1xuICAgICAgdmFyIG1lcmdlZFZhbGlkYXRlVHJpZ2dlciA9IHZhbGlkYXRlVHJpZ2dlciAhPT0gdW5kZWZpbmVkID8gdmFsaWRhdGVUcmlnZ2VyIDogZmllbGRDb250ZXh0LnZhbGlkYXRlVHJpZ2dlcjtcbiAgICAgIHZhciBuYW1lUGF0aCA9IF90aGlzLmdldE5hbWVQYXRoKCk7XG4gICAgICB2YXIgZ2V0SW50ZXJuYWxIb29rcyA9IGZpZWxkQ29udGV4dC5nZXRJbnRlcm5hbEhvb2tzLFxuICAgICAgICBnZXRGaWVsZHNWYWx1ZSA9IGZpZWxkQ29udGV4dC5nZXRGaWVsZHNWYWx1ZTtcbiAgICAgIHZhciBfZ2V0SW50ZXJuYWxIb29rcyA9IGdldEludGVybmFsSG9va3MoSE9PS19NQVJLKSxcbiAgICAgICAgZGlzcGF0Y2ggPSBfZ2V0SW50ZXJuYWxIb29rcy5kaXNwYXRjaDtcbiAgICAgIHZhciB2YWx1ZSA9IF90aGlzLmdldFZhbHVlKCk7XG4gICAgICB2YXIgbWVyZ2VkR2V0VmFsdWVQcm9wcyA9IGdldFZhbHVlUHJvcHMgfHwgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICByZXR1cm4gX2RlZmluZVByb3BlcnR5KHt9LCB2YWx1ZVByb3BOYW1lLCB2YWwpO1xuICAgICAgfTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICB2YXIgb3JpZ2luVHJpZ2dlckZ1bmMgPSBjaGlsZFByb3BzW3RyaWdnZXJdO1xuICAgICAgdmFyIGNvbnRyb2wgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGNoaWxkUHJvcHMpLCBtZXJnZWRHZXRWYWx1ZVByb3BzKHZhbHVlKSk7XG4gICAgICAvLyBBZGQgdHJpZ2dlclxuICAgICAgY29udHJvbFt0cmlnZ2VyXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gTWFyayBhcyB0b3VjaGVkXG4gICAgICAgIF90aGlzLnRvdWNoZWQgPSB0cnVlO1xuICAgICAgICBfdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgICAgIF90aGlzLnRyaWdnZXJNZXRhRXZlbnQoKTtcbiAgICAgICAgdmFyIG5ld1ZhbHVlO1xuICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChnZXRWYWx1ZUZyb21FdmVudCkge1xuICAgICAgICAgIG5ld1ZhbHVlID0gZ2V0VmFsdWVGcm9tRXZlbnQuYXBwbHkodm9pZCAwLCBhcmdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IGRlZmF1bHRHZXRWYWx1ZUZyb21FdmVudC5hcHBseSh2b2lkIDAsIFt2YWx1ZVByb3BOYW1lXS5jb25jYXQoYXJncykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub3JtYWxpemUpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IG5vcm1hbGl6ZShuZXdWYWx1ZSwgdmFsdWUsIGdldEZpZWxkc1ZhbHVlKHRydWUpKTtcbiAgICAgICAgfVxuICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgdHlwZTogJ3VwZGF0ZVZhbHVlJyxcbiAgICAgICAgICBuYW1lUGF0aDogbmFtZVBhdGgsXG4gICAgICAgICAgdmFsdWU6IG5ld1ZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAob3JpZ2luVHJpZ2dlckZ1bmMpIHtcbiAgICAgICAgICBvcmlnaW5UcmlnZ2VyRnVuYy5hcHBseSh2b2lkIDAsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLy8gQWRkIHZhbGlkYXRlVHJpZ2dlclxuICAgICAgdmFyIHZhbGlkYXRlVHJpZ2dlckxpc3QgPSB0b0FycmF5KG1lcmdlZFZhbGlkYXRlVHJpZ2dlciB8fCBbXSk7XG4gICAgICB2YWxpZGF0ZVRyaWdnZXJMaXN0LmZvckVhY2goZnVuY3Rpb24gKHRyaWdnZXJOYW1lKSB7XG4gICAgICAgIC8vIFdyYXAgYWRkaXRpb25hbCBmdW5jdGlvbiBvZiBjb21wb25lbnQsIHNvIHRoYXQgd2UgY2FuIGdldCBsYXRlc3QgdmFsdWUgZnJvbSBzdG9yZVxuICAgICAgICB2YXIgb3JpZ2luVHJpZ2dlciA9IGNvbnRyb2xbdHJpZ2dlck5hbWVdO1xuICAgICAgICBjb250cm9sW3RyaWdnZXJOYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAob3JpZ2luVHJpZ2dlcikge1xuICAgICAgICAgICAgb3JpZ2luVHJpZ2dlci5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEFsd2F5cyB1c2UgbGF0ZXN0IHJ1bGVzXG4gICAgICAgICAgdmFyIHJ1bGVzID0gX3RoaXMucHJvcHMucnVsZXM7XG4gICAgICAgICAgaWYgKHJ1bGVzICYmIHJ1bGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gV2UgZGlzcGF0Y2ggdmFsaWRhdGUgdG8gcm9vdCxcbiAgICAgICAgICAgIC8vIHNpbmNlIGl0IHdpbGwgdXBkYXRlIHJlbGF0ZWQgZGF0YSB3aXRoIG90aGVyIGZpZWxkIHdpdGggc2FtZSBuYW1lXG4gICAgICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgICAgIHR5cGU6ICd2YWxpZGF0ZUZpZWxkJyxcbiAgICAgICAgICAgICAgbmFtZVBhdGg6IG5hbWVQYXRoLFxuICAgICAgICAgICAgICB0cmlnZ2VyTmFtZTogdHJpZ2dlck5hbWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGNvbnRyb2w7XG4gICAgfTtcbiAgICBpZiAocHJvcHMuZmllbGRDb250ZXh0KSB7XG4gICAgICB2YXIgZ2V0SW50ZXJuYWxIb29rcyA9IHByb3BzLmZpZWxkQ29udGV4dC5nZXRJbnRlcm5hbEhvb2tzO1xuICAgICAgdmFyIF9nZXRJbnRlcm5hbEhvb2tzMiA9IGdldEludGVybmFsSG9va3MoSE9PS19NQVJLKSxcbiAgICAgICAgaW5pdEVudGl0eVZhbHVlID0gX2dldEludGVybmFsSG9va3MyLmluaXRFbnRpdHlWYWx1ZTtcbiAgICAgIGluaXRFbnRpdHlWYWx1ZShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgfVxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICBfY3JlYXRlQ2xhc3MoRmllbGQsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzNyA9IHRoaXMucHJvcHMsXG4gICAgICAgIHNob3VsZFVwZGF0ZSA9IF90aGlzJHByb3BzNy5zaG91bGRVcGRhdGUsXG4gICAgICAgIGZpZWxkQ29udGV4dCA9IF90aGlzJHByb3BzNy5maWVsZENvbnRleHQ7XG4gICAgICB0aGlzLm1vdW50ZWQgPSB0cnVlO1xuICAgICAgLy8gUmVnaXN0ZXIgb24gaW5pdFxuICAgICAgaWYgKGZpZWxkQ29udGV4dCkge1xuICAgICAgICB2YXIgZ2V0SW50ZXJuYWxIb29rcyA9IGZpZWxkQ29udGV4dC5nZXRJbnRlcm5hbEhvb2tzO1xuICAgICAgICB2YXIgX2dldEludGVybmFsSG9va3MzID0gZ2V0SW50ZXJuYWxIb29rcyhIT09LX01BUkspLFxuICAgICAgICAgIHJlZ2lzdGVyRmllbGQgPSBfZ2V0SW50ZXJuYWxIb29rczMucmVnaXN0ZXJGaWVsZDtcbiAgICAgICAgdGhpcy5jYW5jZWxSZWdpc3RlckZ1bmMgPSByZWdpc3RlckZpZWxkKHRoaXMpO1xuICAgICAgfVxuICAgICAgLy8gT25lIG1vcmUgcmVuZGVyIGZvciBjb21wb25lbnQgaW4gY2FzZSBmaWVsZHMgbm90IHJlYWR5XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMucmVSZW5kZXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLmNhbmNlbFJlZ2lzdGVyKCk7XG4gICAgICB0aGlzLnRyaWdnZXJNZXRhRXZlbnQodHJ1ZSk7XG4gICAgICB0aGlzLm1vdW50ZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVSZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVSZW5kZXIoKSB7XG4gICAgICBpZiAoIXRoaXMubW91bnRlZCkgcmV0dXJuO1xuICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIHJlc2V0Q291bnQgPSB0aGlzLnN0YXRlLnJlc2V0Q291bnQ7XG4gICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIF90aGlzJGdldE9ubHlDaGlsZCA9IHRoaXMuZ2V0T25seUNoaWxkKGNoaWxkcmVuKSxcbiAgICAgICAgY2hpbGQgPSBfdGhpcyRnZXRPbmx5Q2hpbGQuY2hpbGQsXG4gICAgICAgIGlzRnVuY3Rpb24gPSBfdGhpcyRnZXRPbmx5Q2hpbGQuaXNGdW5jdGlvbjtcbiAgICAgIC8vIE5vdCBuZWVkIHRvIGBjbG9uZUVsZW1lbnRgIHNpbmNlIHVzZXIgY2FuIGhhbmRsZSB0aGlzIGluIHJlbmRlciBmdW5jdGlvbiBzZWxmXG4gICAgICB2YXIgcmV0dXJuQ2hpbGROb2RlO1xuICAgICAgaWYgKGlzRnVuY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuQ2hpbGROb2RlID0gY2hpbGQ7XG4gICAgICB9IGVsc2UgaWYgKCAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICAgIHJldHVybkNoaWxkTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGQsIHRoaXMuZ2V0Q29udHJvbGxlZChjaGlsZC5wcm9wcykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FybmluZyghY2hpbGQsICdgY2hpbGRyZW5gIG9mIEZpZWxkIGlzIG5vdCB2YWxpZGF0ZSBSZWFjdEVsZW1lbnQuJyk7XG4gICAgICAgIHJldHVybkNoaWxkTm9kZSA9IGNoaWxkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCB7XG4gICAgICAgIGtleTogcmVzZXRDb3VudFxuICAgICAgfSwgcmV0dXJuQ2hpbGROb2RlKTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIEZpZWxkO1xufShSZWFjdC5Db21wb25lbnQpO1xuRmllbGQuY29udGV4dFR5cGUgPSBGaWVsZENvbnRleHQ7XG5GaWVsZC5kZWZhdWx0UHJvcHMgPSB7XG4gIHRyaWdnZXI6ICdvbkNoYW5nZScsXG4gIHZhbHVlUHJvcE5hbWU6ICd2YWx1ZSdcbn07XG5mdW5jdGlvbiBXcmFwcGVyRmllbGQoX3JlZjUpIHtcbiAgdmFyIG5hbWUgPSBfcmVmNS5uYW1lLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmNSwgX2V4Y2x1ZGVkKTtcbiAgdmFyIGZpZWxkQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoRmllbGRDb250ZXh0KTtcbiAgdmFyIG5hbWVQYXRoID0gbmFtZSAhPT0gdW5kZWZpbmVkID8gZ2V0TmFtZVBhdGgobmFtZSkgOiB1bmRlZmluZWQ7XG4gIHZhciBrZXkgPSAna2VlcCc7XG4gIGlmICghcmVzdFByb3BzLmlzTGlzdEZpZWxkKSB7XG4gICAga2V5ID0gXCJfXCIuY29uY2F0KChuYW1lUGF0aCB8fCBbXSkuam9pbignXycpKTtcbiAgfVxuICAvLyBXYXJuaW5nIGlmIGl0J3MgYSBkaXJlY3RseSBsaXN0IGZpZWxkLlxuICAvLyBXZSBjYW4gc3RpbGwgc3VwcG9ydCBtdWx0aXBsZSBsZXZlbCBmaWVsZCBwcmVzZXJ2ZS5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgcmVzdFByb3BzLnByZXNlcnZlID09PSBmYWxzZSAmJiByZXN0UHJvcHMuaXNMaXN0RmllbGQgJiYgbmFtZVBhdGgubGVuZ3RoIDw9IDEpIHtcbiAgICB3YXJuaW5nKGZhbHNlLCAnYHByZXNlcnZlYCBzaG91bGQgbm90IGFwcGx5IG9uIEZvcm0uTGlzdCBmaWVsZHMuJyk7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZpZWxkLCBfZXh0ZW5kcyh7XG4gICAga2V5OiBrZXksXG4gICAgbmFtZTogbmFtZVBhdGhcbiAgfSwgcmVzdFByb3BzLCB7XG4gICAgZmllbGRDb250ZXh0OiBmaWVsZENvbnRleHRcbiAgfSkpO1xufVxuZXhwb3J0IGRlZmF1bHQgV3JhcHBlckZpZWxkOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbnZhciBMaXN0Q29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuZXhwb3J0IGRlZmF1bHQgTGlzdENvbnRleHQ7IiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgd2FybmluZyBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5pbXBvcnQgRmllbGRDb250ZXh0IGZyb20gJy4vRmllbGRDb250ZXh0JztcbmltcG9ydCBGaWVsZCBmcm9tICcuL0ZpZWxkJztcbmltcG9ydCB7IG1vdmUgYXMgX21vdmUsIGdldE5hbWVQYXRoIH0gZnJvbSAnLi91dGlscy92YWx1ZVV0aWwnO1xuaW1wb3J0IExpc3RDb250ZXh0IGZyb20gJy4vTGlzdENvbnRleHQnO1xudmFyIExpc3QgPSBmdW5jdGlvbiBMaXN0KF9yZWYpIHtcbiAgdmFyIG5hbWUgPSBfcmVmLm5hbWUsXG4gICAgaW5pdGlhbFZhbHVlID0gX3JlZi5pbml0aWFsVmFsdWUsXG4gICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuLFxuICAgIHJ1bGVzID0gX3JlZi5ydWxlcyxcbiAgICB2YWxpZGF0ZVRyaWdnZXIgPSBfcmVmLnZhbGlkYXRlVHJpZ2dlcjtcbiAgdmFyIGNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KEZpZWxkQ29udGV4dCk7XG4gIHZhciBrZXlSZWYgPSBSZWFjdC51c2VSZWYoe1xuICAgIGtleXM6IFtdLFxuICAgIGlkOiAwXG4gIH0pO1xuICB2YXIga2V5TWFuYWdlciA9IGtleVJlZi5jdXJyZW50O1xuICB2YXIgcHJlZml4TmFtZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYXJlbnRQcmVmaXhOYW1lID0gZ2V0TmFtZVBhdGgoY29udGV4dC5wcmVmaXhOYW1lKSB8fCBbXTtcbiAgICByZXR1cm4gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShwYXJlbnRQcmVmaXhOYW1lKSwgX3RvQ29uc3VtYWJsZUFycmF5KGdldE5hbWVQYXRoKG5hbWUpKSk7XG4gIH0sIFtjb250ZXh0LnByZWZpeE5hbWUsIG5hbWVdKTtcbiAgdmFyIGZpZWxkQ29udGV4dCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGNvbnRleHQpLCB7fSwge1xuICAgICAgcHJlZml4TmFtZTogcHJlZml4TmFtZVxuICAgIH0pO1xuICB9LCBbY29udGV4dCwgcHJlZml4TmFtZV0pO1xuICAvLyBMaXN0IGNvbnRleHRcbiAgdmFyIGxpc3RDb250ZXh0ID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldEtleTogZnVuY3Rpb24gZ2V0S2V5KG5hbWVQYXRoKSB7XG4gICAgICAgIHZhciBsZW4gPSBwcmVmaXhOYW1lLmxlbmd0aDtcbiAgICAgICAgdmFyIHBhdGhOYW1lID0gbmFtZVBhdGhbbGVuXTtcbiAgICAgICAgcmV0dXJuIFtrZXlNYW5hZ2VyLmtleXNbcGF0aE5hbWVdLCBuYW1lUGF0aC5zbGljZShsZW4gKyAxKV07XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW3ByZWZpeE5hbWVdKTtcbiAgLy8gVXNlciBzaG91bGQgbm90IHBhc3MgYGNoaWxkcmVuYCBhcyBvdGhlciB0eXBlLlxuICBpZiAodHlwZW9mIGNoaWxkcmVuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgd2FybmluZyhmYWxzZSwgJ0Zvcm0uTGlzdCBvbmx5IGFjY2VwdHMgZnVuY3Rpb24gYXMgY2hpbGRyZW4uJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIHNob3VsZFVwZGF0ZSA9IGZ1bmN0aW9uIHNob3VsZFVwZGF0ZShwcmV2VmFsdWUsIG5leHRWYWx1ZSwgX3JlZjIpIHtcbiAgICB2YXIgc291cmNlID0gX3JlZjIuc291cmNlO1xuICAgIGlmIChzb3VyY2UgPT09ICdpbnRlcm5hbCcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHByZXZWYWx1ZSAhPT0gbmV4dFZhbHVlO1xuICB9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGlzdENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogbGlzdENvbnRleHRcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRmllbGRDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGZpZWxkQ29udGV4dFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGaWVsZCwge1xuICAgIG5hbWU6IFtdLFxuICAgIHNob3VsZFVwZGF0ZTogc2hvdWxkVXBkYXRlLFxuICAgIHJ1bGVzOiBydWxlcyxcbiAgICB2YWxpZGF0ZVRyaWdnZXI6IHZhbGlkYXRlVHJpZ2dlcixcbiAgICBpbml0aWFsVmFsdWU6IGluaXRpYWxWYWx1ZSxcbiAgICBpc0xpc3Q6IHRydWVcbiAgfSwgZnVuY3Rpb24gKF9yZWYzLCBtZXRhKSB7XG4gICAgdmFyIF9yZWYzJHZhbHVlID0gX3JlZjMudmFsdWUsXG4gICAgICB2YWx1ZSA9IF9yZWYzJHZhbHVlID09PSB2b2lkIDAgPyBbXSA6IF9yZWYzJHZhbHVlLFxuICAgICAgb25DaGFuZ2UgPSBfcmVmMy5vbkNoYW5nZTtcbiAgICB2YXIgZ2V0RmllbGRWYWx1ZSA9IGNvbnRleHQuZ2V0RmllbGRWYWx1ZTtcbiAgICB2YXIgZ2V0TmV3VmFsdWUgPSBmdW5jdGlvbiBnZXROZXdWYWx1ZSgpIHtcbiAgICAgIHZhciB2YWx1ZXMgPSBnZXRGaWVsZFZhbHVlKHByZWZpeE5hbWUgfHwgW10pO1xuICAgICAgcmV0dXJuIHZhbHVlcyB8fCBbXTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFsd2F5cyBnZXQgbGF0ZXN0IHZhbHVlIGluIGNhc2UgdXNlciB1cGRhdGUgZmllbGRzIGJ5IGBmb3JtYCBhcGkuXG4gICAgICovXG4gICAgdmFyIG9wZXJhdGlvbnMgPSB7XG4gICAgICBhZGQ6IGZ1bmN0aW9uIGFkZChkZWZhdWx0VmFsdWUsIGluZGV4KSB7XG4gICAgICAgIC8vIE1hcHBpbmcga2V5c1xuICAgICAgICB2YXIgbmV3VmFsdWUgPSBnZXROZXdWYWx1ZSgpO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8PSBuZXdWYWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICBrZXlNYW5hZ2VyLmtleXMgPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGtleU1hbmFnZXIua2V5cy5zbGljZSgwLCBpbmRleCkpLCBba2V5TWFuYWdlci5pZF0sIF90b0NvbnN1bWFibGVBcnJheShrZXlNYW5hZ2VyLmtleXMuc2xpY2UoaW5kZXgpKSk7XG4gICAgICAgICAgb25DaGFuZ2UoW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShuZXdWYWx1ZS5zbGljZSgwLCBpbmRleCkpLCBbZGVmYXVsdFZhbHVlXSwgX3RvQ29uc3VtYWJsZUFycmF5KG5ld1ZhbHVlLnNsaWNlKGluZGV4KSkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAoaW5kZXggPCAwIHx8IGluZGV4ID4gbmV3VmFsdWUubGVuZ3RoKSkge1xuICAgICAgICAgICAgd2FybmluZyhmYWxzZSwgJ1RoZSBzZWNvbmQgcGFyYW1ldGVyIG9mIHRoZSBhZGQgZnVuY3Rpb24gc2hvdWxkIGJlIGEgdmFsaWQgcG9zaXRpdmUgbnVtYmVyLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBrZXlNYW5hZ2VyLmtleXMgPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGtleU1hbmFnZXIua2V5cyksIFtrZXlNYW5hZ2VyLmlkXSk7XG4gICAgICAgICAgb25DaGFuZ2UoW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShuZXdWYWx1ZSksIFtkZWZhdWx0VmFsdWVdKSk7XG4gICAgICAgIH1cbiAgICAgICAga2V5TWFuYWdlci5pZCArPSAxO1xuICAgICAgfSxcbiAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKGluZGV4KSB7XG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IGdldE5ld1ZhbHVlKCk7XG4gICAgICAgIHZhciBpbmRleFNldCA9IG5ldyBTZXQoQXJyYXkuaXNBcnJheShpbmRleCkgPyBpbmRleCA6IFtpbmRleF0pO1xuICAgICAgICBpZiAoaW5kZXhTZXQuc2l6ZSA8PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGtleU1hbmFnZXIua2V5cyA9IGtleU1hbmFnZXIua2V5cy5maWx0ZXIoZnVuY3Rpb24gKF8sIGtleXNJbmRleCkge1xuICAgICAgICAgIHJldHVybiAhaW5kZXhTZXQuaGFzKGtleXNJbmRleCk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBUcmlnZ2VyIHN0b3JlIGNoYW5nZVxuICAgICAgICBvbkNoYW5nZShuZXdWYWx1ZS5maWx0ZXIoZnVuY3Rpb24gKF8sIHZhbHVlSW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gIWluZGV4U2V0Lmhhcyh2YWx1ZUluZGV4KTtcbiAgICAgICAgfSkpO1xuICAgICAgfSxcbiAgICAgIG1vdmU6IGZ1bmN0aW9uIG1vdmUoZnJvbSwgdG8pIHtcbiAgICAgICAgaWYgKGZyb20gPT09IHRvKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IGdldE5ld1ZhbHVlKCk7XG4gICAgICAgIC8vIERvIG5vdCBoYW5kbGUgb3V0IG9mIHJhbmdlXG4gICAgICAgIGlmIChmcm9tIDwgMCB8fCBmcm9tID49IG5ld1ZhbHVlLmxlbmd0aCB8fCB0byA8IDAgfHwgdG8gPj0gbmV3VmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGtleU1hbmFnZXIua2V5cyA9IF9tb3ZlKGtleU1hbmFnZXIua2V5cywgZnJvbSwgdG8pO1xuICAgICAgICAvLyBUcmlnZ2VyIHN0b3JlIGNoYW5nZVxuICAgICAgICBvbkNoYW5nZShfbW92ZShuZXdWYWx1ZSwgZnJvbSwgdG8pKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBsaXN0VmFsdWUgPSB2YWx1ZSB8fCBbXTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdFZhbHVlKSkge1xuICAgICAgbGlzdFZhbHVlID0gW107XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB3YXJuaW5nKGZhbHNlLCBcIkN1cnJlbnQgdmFsdWUgb2YgJ1wiLmNvbmNhdChwcmVmaXhOYW1lLmpvaW4oJyA+ICcpLCBcIicgaXMgbm90IGFuIGFycmF5IHR5cGUuXCIpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkcmVuKGxpc3RWYWx1ZS5tYXAoZnVuY3Rpb24gKF9fLCBpbmRleCkge1xuICAgICAgdmFyIGtleSA9IGtleU1hbmFnZXIua2V5c1tpbmRleF07XG4gICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAga2V5TWFuYWdlci5rZXlzW2luZGV4XSA9IGtleU1hbmFnZXIuaWQ7XG4gICAgICAgIGtleSA9IGtleU1hbmFnZXIua2V5c1tpbmRleF07XG4gICAgICAgIGtleU1hbmFnZXIuaWQgKz0gMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGluZGV4LFxuICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgaXNMaXN0RmllbGQ6IHRydWVcbiAgICAgIH07XG4gICAgfSksIG9wZXJhdGlvbnMsIG1ldGEpO1xuICB9KSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IExpc3Q7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkge1xuICB2YXIgX2kgPSBudWxsID09IGFyciA/IG51bGwgOiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBTeW1ib2wgJiYgYXJyW1N5bWJvbC5pdGVyYXRvcl0gfHwgYXJyW1wiQEBpdGVyYXRvclwiXTtcbiAgaWYgKG51bGwgIT0gX2kpIHtcbiAgICB2YXIgX3MsXG4gICAgICBfZSxcbiAgICAgIF94LFxuICAgICAgX3IsXG4gICAgICBfYXJyID0gW10sXG4gICAgICBfbiA9ICEwLFxuICAgICAgX2QgPSAhMTtcbiAgICB0cnkge1xuICAgICAgaWYgKF94ID0gKF9pID0gX2kuY2FsbChhcnIpKS5uZXh0LCAwID09PSBpKSB7XG4gICAgICAgIGlmIChPYmplY3QoX2kpICE9PSBfaSkgcmV0dXJuO1xuICAgICAgICBfbiA9ICExO1xuICAgICAgfSBlbHNlIGZvciAoOyAhKF9uID0gKF9zID0gX3guY2FsbChfaSkpLmRvbmUpICYmIChfYXJyLnB1c2goX3MudmFsdWUpLCBfYXJyLmxlbmd0aCAhPT0gaSk7IF9uID0gITApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgX2QgPSAhMCwgX2UgPSBlcnI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghX24gJiYgbnVsbCAhPSBfaVtcInJldHVyblwiXSAmJiAoX3IgPSBfaVtcInJldHVyblwiXSgpLCBPYmplY3QoX3IpICE9PSBfcikpIHJldHVybjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBfYXJyO1xuICB9XG59IiwiaW1wb3J0IGFycmF5V2l0aEhvbGVzIGZyb20gXCIuL2FycmF5V2l0aEhvbGVzLmpzXCI7XG5pbXBvcnQgaXRlcmFibGVUb0FycmF5TGltaXQgZnJvbSBcIi4vaXRlcmFibGVUb0FycmF5TGltaXQuanNcIjtcbmltcG9ydCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSBmcm9tIFwiLi91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qc1wiO1xuaW1wb3J0IG5vbkl0ZXJhYmxlUmVzdCBmcm9tIFwiLi9ub25JdGVyYWJsZVJlc3QuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkge1xuICByZXR1cm4gYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBpdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgbm9uSXRlcmFibGVSZXN0KCk7XG59IiwiZXhwb3J0IGZ1bmN0aW9uIGFsbFByb21pc2VGaW5pc2gocHJvbWlzZUxpc3QpIHtcbiAgdmFyIGhhc0Vycm9yID0gZmFsc2U7XG4gIHZhciBjb3VudCA9IHByb21pc2VMaXN0Lmxlbmd0aDtcbiAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgaWYgKCFwcm9taXNlTGlzdC5sZW5ndGgpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcbiAgfVxuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHByb21pc2VMaXN0LmZvckVhY2goZnVuY3Rpb24gKHByb21pc2UsIGluZGV4KSB7XG4gICAgICBwcm9taXNlLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgY291bnQgLT0gMTtcbiAgICAgICAgcmVzdWx0c1tpbmRleF0gPSByZXN1bHQ7XG4gICAgICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0Vycm9yKSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3VsdHMpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUocmVzdWx0cyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG52YXIgU1BMSVQgPSAnX19AZmllbGRfc3BsaXRfXyc7XG4vKipcbiAqIENvbnZlcnQgbmFtZSBwYXRoIGludG8gc3RyaW5nIHRvIGZhc3QgdGhlIGZldGNoIHNwZWVkIG9mIE1hcC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplKG5hbWVQYXRoKSB7XG4gIHJldHVybiBuYW1lUGF0aC5tYXAoZnVuY3Rpb24gKGNlbGwpIHtcbiAgICByZXR1cm4gXCJcIi5jb25jYXQoX3R5cGVvZihjZWxsKSwgXCI6XCIpLmNvbmNhdChjZWxsKTtcbiAgfSlcbiAgLy8gTWFnaWMgc3BsaXRcbiAgLmpvaW4oU1BMSVQpO1xufVxuLyoqXG4gKiBOYW1lTWFwIGxpa2UgYSBgTWFwYCBidXQgYWNjZXB0cyBgc3RyaW5nW11gIGFzIGtleS5cbiAqL1xudmFyIE5hbWVNYXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBOYW1lTWFwKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBOYW1lTWFwKTtcbiAgICB0aGlzLmt2cyA9IG5ldyBNYXAoKTtcbiAgfVxuICBfY3JlYXRlQ2xhc3MoTmFtZU1hcCwgW3tcbiAgICBrZXk6IFwic2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICB0aGlzLmt2cy5zZXQobm9ybWFsaXplKGtleSksIHZhbHVlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLmt2cy5nZXQobm9ybWFsaXplKGtleSkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1cGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlKGtleSwgdXBkYXRlcikge1xuICAgICAgdmFyIG9yaWdpbiA9IHRoaXMuZ2V0KGtleSk7XG4gICAgICB2YXIgbmV4dCA9IHVwZGF0ZXIob3JpZ2luKTtcbiAgICAgIGlmICghbmV4dCkge1xuICAgICAgICB0aGlzLmRlbGV0ZShrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXQoa2V5LCBuZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVsZXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9kZWxldGUoa2V5KSB7XG4gICAgICB0aGlzLmt2cy5kZWxldGUobm9ybWFsaXplKGtleSkpO1xuICAgIH1cbiAgICAvLyBTaW5jZSB3ZSBvbmx5IHVzZSB0aGlzIGluIHRlc3QsIGxldCBzaW1wbHkgcmVhbGl6ZSB0aGlzXG4gIH0sIHtcbiAgICBrZXk6IFwibWFwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hcChjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIF90b0NvbnN1bWFibGVBcnJheSh0aGlzLmt2cy5lbnRyaWVzKCkpLm1hcChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgX3JlZjIgPSBfc2xpY2VkVG9BcnJheShfcmVmLCAyKSxcbiAgICAgICAgICBrZXkgPSBfcmVmMlswXSxcbiAgICAgICAgICB2YWx1ZSA9IF9yZWYyWzFdO1xuICAgICAgICB2YXIgY2VsbHMgPSBrZXkuc3BsaXQoU1BMSVQpO1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soe1xuICAgICAgICAgIGtleTogY2VsbHMubWFwKGZ1bmN0aW9uIChjZWxsKSB7XG4gICAgICAgICAgICB2YXIgX2NlbGwkbWF0Y2ggPSBjZWxsLm1hdGNoKC9eKFteOl0qKTooLiopJC8pLFxuICAgICAgICAgICAgICBfY2VsbCRtYXRjaDIgPSBfc2xpY2VkVG9BcnJheShfY2VsbCRtYXRjaCwgMyksXG4gICAgICAgICAgICAgIHR5cGUgPSBfY2VsbCRtYXRjaDJbMV0sXG4gICAgICAgICAgICAgIHVuaXQgPSBfY2VsbCRtYXRjaDJbMl07XG4gICAgICAgICAgICByZXR1cm4gdHlwZSA9PT0gJ251bWJlcicgPyBOdW1iZXIodW5pdCkgOiB1bml0O1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b0pTT05cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9KU09OKCkge1xuICAgICAgdmFyIGpzb24gPSB7fTtcbiAgICAgIHRoaXMubWFwKGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgICB2YXIga2V5ID0gX3JlZjMua2V5LFxuICAgICAgICAgIHZhbHVlID0gX3JlZjMudmFsdWU7XG4gICAgICAgIGpzb25ba2V5LmpvaW4oJy4nKV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBqc29uO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gTmFtZU1hcDtcbn0oKTtcbmV4cG9ydCBkZWZhdWx0IE5hbWVNYXA7IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJuYW1lXCIsIFwiZXJyb3JzXCJdO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgSE9PS19NQVJLIH0gZnJvbSAnLi9GaWVsZENvbnRleHQnO1xuaW1wb3J0IHsgYWxsUHJvbWlzZUZpbmlzaCB9IGZyb20gJy4vdXRpbHMvYXN5bmNVdGlsJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnLi91dGlscy9jbG9uZURlZXAnO1xuaW1wb3J0IHsgZGVmYXVsdFZhbGlkYXRlTWVzc2FnZXMgfSBmcm9tICcuL3V0aWxzL21lc3NhZ2VzJztcbmltcG9ydCBOYW1lTWFwIGZyb20gJy4vdXRpbHMvTmFtZU1hcCc7XG5pbXBvcnQgeyBjbG9uZUJ5TmFtZVBhdGhMaXN0LCBjb250YWluc05hbWVQYXRoLCBnZXROYW1lUGF0aCwgZ2V0VmFsdWUsIG1hdGNoTmFtZVBhdGgsIHNldFZhbHVlLCBzZXRWYWx1ZXMgfSBmcm9tICcuL3V0aWxzL3ZhbHVlVXRpbCc7XG5leHBvcnQgdmFyIEZvcm1TdG9yZSA9IC8qI19fUFVSRV9fKi9fY3JlYXRlQ2xhc3MoZnVuY3Rpb24gRm9ybVN0b3JlKGZvcmNlUm9vdFVwZGF0ZSkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRm9ybVN0b3JlKTtcbiAgdGhpcy5mb3JtSG9va2VkID0gZmFsc2U7XG4gIHRoaXMuZm9yY2VSb290VXBkYXRlID0gdm9pZCAwO1xuICB0aGlzLnN1YnNjcmliYWJsZSA9IHRydWU7XG4gIHRoaXMuc3RvcmUgPSB7fTtcbiAgdGhpcy5maWVsZEVudGl0aWVzID0gW107XG4gIHRoaXMuaW5pdGlhbFZhbHVlcyA9IHt9O1xuICB0aGlzLmNhbGxiYWNrcyA9IHt9O1xuICB0aGlzLnZhbGlkYXRlTWVzc2FnZXMgPSBudWxsO1xuICB0aGlzLnByZXNlcnZlID0gbnVsbDtcbiAgdGhpcy5sYXN0VmFsaWRhdGVQcm9taXNlID0gbnVsbDtcbiAgdGhpcy5nZXRGb3JtID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBnZXRGaWVsZFZhbHVlOiBfdGhpcy5nZXRGaWVsZFZhbHVlLFxuICAgICAgZ2V0RmllbGRzVmFsdWU6IF90aGlzLmdldEZpZWxkc1ZhbHVlLFxuICAgICAgZ2V0RmllbGRFcnJvcjogX3RoaXMuZ2V0RmllbGRFcnJvcixcbiAgICAgIGdldEZpZWxkV2FybmluZzogX3RoaXMuZ2V0RmllbGRXYXJuaW5nLFxuICAgICAgZ2V0RmllbGRzRXJyb3I6IF90aGlzLmdldEZpZWxkc0Vycm9yLFxuICAgICAgaXNGaWVsZHNUb3VjaGVkOiBfdGhpcy5pc0ZpZWxkc1RvdWNoZWQsXG4gICAgICBpc0ZpZWxkVG91Y2hlZDogX3RoaXMuaXNGaWVsZFRvdWNoZWQsXG4gICAgICBpc0ZpZWxkVmFsaWRhdGluZzogX3RoaXMuaXNGaWVsZFZhbGlkYXRpbmcsXG4gICAgICBpc0ZpZWxkc1ZhbGlkYXRpbmc6IF90aGlzLmlzRmllbGRzVmFsaWRhdGluZyxcbiAgICAgIHJlc2V0RmllbGRzOiBfdGhpcy5yZXNldEZpZWxkcyxcbiAgICAgIHNldEZpZWxkczogX3RoaXMuc2V0RmllbGRzLFxuICAgICAgc2V0RmllbGRWYWx1ZTogX3RoaXMuc2V0RmllbGRWYWx1ZSxcbiAgICAgIHNldEZpZWxkc1ZhbHVlOiBfdGhpcy5zZXRGaWVsZHNWYWx1ZSxcbiAgICAgIHZhbGlkYXRlRmllbGRzOiBfdGhpcy52YWxpZGF0ZUZpZWxkcyxcbiAgICAgIHN1Ym1pdDogX3RoaXMuc3VibWl0LFxuICAgICAgX2luaXQ6IHRydWUsXG4gICAgICBnZXRJbnRlcm5hbEhvb2tzOiBfdGhpcy5nZXRJbnRlcm5hbEhvb2tzXG4gICAgfTtcbiAgfTtcbiAgdGhpcy5nZXRJbnRlcm5hbEhvb2tzID0gZnVuY3Rpb24gKGtleSkge1xuICAgIGlmIChrZXkgPT09IEhPT0tfTUFSSykge1xuICAgICAgX3RoaXMuZm9ybUhvb2tlZCA9IHRydWU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXNwYXRjaDogX3RoaXMuZGlzcGF0Y2gsXG4gICAgICAgIGluaXRFbnRpdHlWYWx1ZTogX3RoaXMuaW5pdEVudGl0eVZhbHVlLFxuICAgICAgICByZWdpc3RlckZpZWxkOiBfdGhpcy5yZWdpc3RlckZpZWxkLFxuICAgICAgICB1c2VTdWJzY3JpYmU6IF90aGlzLnVzZVN1YnNjcmliZSxcbiAgICAgICAgc2V0SW5pdGlhbFZhbHVlczogX3RoaXMuc2V0SW5pdGlhbFZhbHVlcyxcbiAgICAgICAgZGVzdHJveUZvcm06IF90aGlzLmRlc3Ryb3lGb3JtLFxuICAgICAgICBzZXRDYWxsYmFja3M6IF90aGlzLnNldENhbGxiYWNrcyxcbiAgICAgICAgc2V0VmFsaWRhdGVNZXNzYWdlczogX3RoaXMuc2V0VmFsaWRhdGVNZXNzYWdlcyxcbiAgICAgICAgZ2V0RmllbGRzOiBfdGhpcy5nZXRGaWVsZHMsXG4gICAgICAgIHNldFByZXNlcnZlOiBfdGhpcy5zZXRQcmVzZXJ2ZSxcbiAgICAgICAgZ2V0SW5pdGlhbFZhbHVlOiBfdGhpcy5nZXRJbml0aWFsVmFsdWUsXG4gICAgICAgIHJlZ2lzdGVyV2F0Y2g6IF90aGlzLnJlZ2lzdGVyV2F0Y2hcbiAgICAgIH07XG4gICAgfVxuICAgIHdhcm5pbmcoZmFsc2UsICdgZ2V0SW50ZXJuYWxIb29rc2AgaXMgaW50ZXJuYWwgdXNhZ2UuIFNob3VsZCBub3QgY2FsbCBkaXJlY3RseS4nKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcbiAgdGhpcy51c2VTdWJzY3JpYmUgPSBmdW5jdGlvbiAoc3Vic2NyaWJhYmxlKSB7XG4gICAgX3RoaXMuc3Vic2NyaWJhYmxlID0gc3Vic2NyaWJhYmxlO1xuICB9O1xuICB0aGlzLnByZXZXaXRob3V0UHJlc2VydmVzID0gbnVsbDtcbiAgdGhpcy5zZXRJbml0aWFsVmFsdWVzID0gZnVuY3Rpb24gKGluaXRpYWxWYWx1ZXMsIGluaXQpIHtcbiAgICBfdGhpcy5pbml0aWFsVmFsdWVzID0gaW5pdGlhbFZhbHVlcyB8fCB7fTtcbiAgICBpZiAoaW5pdCkge1xuICAgICAgdmFyIF90aGlzJHByZXZXaXRob3V0UHJlcztcbiAgICAgIHZhciBuZXh0U3RvcmUgPSBzZXRWYWx1ZXMoe30sIGluaXRpYWxWYWx1ZXMsIF90aGlzLnN0b3JlKTtcbiAgICAgIC8vIFdlIHdpbGwgdGFrZSBjb25zaWRlciBwcmV2IGZvcm0gdW5tb3VudCBmaWVsZHMuXG4gICAgICAvLyBXaGVuIHRoZSBmaWVsZCBpcyBub3QgYHByZXNlcnZlYCwgd2UgbmVlZCBmaWxsIHRoaXMgd2l0aCBpbml0aWFsVmFsdWVzIGluc3RlYWQgb2Ygc3RvcmUuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgYXJyYXktY2FsbGJhY2stcmV0dXJuXG4gICAgICAoX3RoaXMkcHJldldpdGhvdXRQcmVzID0gX3RoaXMucHJldldpdGhvdXRQcmVzZXJ2ZXMpID09PSBudWxsIHx8IF90aGlzJHByZXZXaXRob3V0UHJlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkcHJldldpdGhvdXRQcmVzLm1hcChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgbmFtZVBhdGggPSBfcmVmLmtleTtcbiAgICAgICAgbmV4dFN0b3JlID0gc2V0VmFsdWUobmV4dFN0b3JlLCBuYW1lUGF0aCwgZ2V0VmFsdWUoaW5pdGlhbFZhbHVlcywgbmFtZVBhdGgpKTtcbiAgICAgIH0pO1xuICAgICAgX3RoaXMucHJldldpdGhvdXRQcmVzZXJ2ZXMgPSBudWxsO1xuICAgICAgX3RoaXMudXBkYXRlU3RvcmUobmV4dFN0b3JlKTtcbiAgICB9XG4gIH07XG4gIHRoaXMuZGVzdHJveUZvcm0gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByZXZXaXRob3V0UHJlc2VydmVzID0gbmV3IE5hbWVNYXAoKTtcbiAgICBfdGhpcy5nZXRGaWVsZEVudGl0aWVzKHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgaWYgKCFfdGhpcy5pc01lcmdlZFByZXNlcnZlKGVudGl0eS5pc1ByZXNlcnZlKCkpKSB7XG4gICAgICAgIHByZXZXaXRob3V0UHJlc2VydmVzLnNldChlbnRpdHkuZ2V0TmFtZVBhdGgoKSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgX3RoaXMucHJldldpdGhvdXRQcmVzZXJ2ZXMgPSBwcmV2V2l0aG91dFByZXNlcnZlcztcbiAgfTtcbiAgdGhpcy5nZXRJbml0aWFsVmFsdWUgPSBmdW5jdGlvbiAobmFtZVBhdGgpIHtcbiAgICB2YXIgaW5pdFZhbHVlID0gZ2V0VmFsdWUoX3RoaXMuaW5pdGlhbFZhbHVlcywgbmFtZVBhdGgpO1xuICAgIC8vIE5vdCBjbG9uZURlZXAgd2hlbiB3aXRob3V0IGBuYW1lUGF0aGBcbiAgICByZXR1cm4gbmFtZVBhdGgubGVuZ3RoID8gY2xvbmVEZWVwKGluaXRWYWx1ZSkgOiBpbml0VmFsdWU7XG4gIH07XG4gIHRoaXMuc2V0Q2FsbGJhY2tzID0gZnVuY3Rpb24gKGNhbGxiYWNrcykge1xuICAgIF90aGlzLmNhbGxiYWNrcyA9IGNhbGxiYWNrcztcbiAgfTtcbiAgdGhpcy5zZXRWYWxpZGF0ZU1lc3NhZ2VzID0gZnVuY3Rpb24gKHZhbGlkYXRlTWVzc2FnZXMpIHtcbiAgICBfdGhpcy52YWxpZGF0ZU1lc3NhZ2VzID0gdmFsaWRhdGVNZXNzYWdlcztcbiAgfTtcbiAgdGhpcy5zZXRQcmVzZXJ2ZSA9IGZ1bmN0aW9uIChwcmVzZXJ2ZSkge1xuICAgIF90aGlzLnByZXNlcnZlID0gcHJlc2VydmU7XG4gIH07XG4gIHRoaXMud2F0Y2hMaXN0ID0gW107XG4gIHRoaXMucmVnaXN0ZXJXYXRjaCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIF90aGlzLndhdGNoTGlzdC5wdXNoKGNhbGxiYWNrKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMud2F0Y2hMaXN0ID0gX3RoaXMud2F0Y2hMaXN0LmZpbHRlcihmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgcmV0dXJuIGZuICE9PSBjYWxsYmFjaztcbiAgICAgIH0pO1xuICAgIH07XG4gIH07XG4gIHRoaXMubm90aWZ5V2F0Y2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG5hbWVQYXRoID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTtcbiAgICAvLyBObyBuZWVkIHRvIGNvc3QgcGVyZiB3aGVuIG5vdGhpbmcgbmVlZCB0byB3YXRjaFxuICAgIGlmIChfdGhpcy53YXRjaExpc3QubGVuZ3RoKSB7XG4gICAgICB2YXIgdmFsdWVzID0gX3RoaXMuZ2V0RmllbGRzVmFsdWUoKTtcbiAgICAgIF90aGlzLndhdGNoTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBjYWxsYmFjayh2YWx1ZXMsIG5hbWVQYXRoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgdGhpcy50aW1lb3V0SWQgPSBudWxsO1xuICB0aGlzLndhcm5pbmdVbmhvb2tlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhX3RoaXMudGltZW91dElkICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBfdGhpcy50aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMudGltZW91dElkID0gbnVsbDtcbiAgICAgICAgaWYgKCFfdGhpcy5mb3JtSG9va2VkKSB7XG4gICAgICAgICAgd2FybmluZyhmYWxzZSwgJ0luc3RhbmNlIGNyZWF0ZWQgYnkgYHVzZUZvcm1gIGlzIG5vdCBjb25uZWN0ZWQgdG8gYW55IEZvcm0gZWxlbWVudC4gRm9yZ2V0IHRvIHBhc3MgYGZvcm1gIHByb3A/Jyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgdGhpcy51cGRhdGVTdG9yZSA9IGZ1bmN0aW9uIChuZXh0U3RvcmUpIHtcbiAgICBfdGhpcy5zdG9yZSA9IG5leHRTdG9yZTtcbiAgfTtcbiAgdGhpcy5nZXRGaWVsZEVudGl0aWVzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwdXJlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgICBpZiAoIXB1cmUpIHtcbiAgICAgIHJldHVybiBfdGhpcy5maWVsZEVudGl0aWVzO1xuICAgIH1cbiAgICByZXR1cm4gX3RoaXMuZmllbGRFbnRpdGllcy5maWx0ZXIoZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICByZXR1cm4gZmllbGQuZ2V0TmFtZVBhdGgoKS5sZW5ndGg7XG4gICAgfSk7XG4gIH07XG4gIHRoaXMuZ2V0RmllbGRzTWFwID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwdXJlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgICB2YXIgY2FjaGUgPSBuZXcgTmFtZU1hcCgpO1xuICAgIF90aGlzLmdldEZpZWxkRW50aXRpZXMocHVyZSkuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgIHZhciBuYW1lUGF0aCA9IGZpZWxkLmdldE5hbWVQYXRoKCk7XG4gICAgICBjYWNoZS5zZXQobmFtZVBhdGgsIGZpZWxkKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY2FjaGU7XG4gIH07XG4gIHRoaXMuZ2V0RmllbGRFbnRpdGllc0Zvck5hbWVQYXRoTGlzdCA9IGZ1bmN0aW9uIChuYW1lTGlzdCkge1xuICAgIGlmICghbmFtZUxpc3QpIHtcbiAgICAgIHJldHVybiBfdGhpcy5nZXRGaWVsZEVudGl0aWVzKHRydWUpO1xuICAgIH1cbiAgICB2YXIgY2FjaGUgPSBfdGhpcy5nZXRGaWVsZHNNYXAodHJ1ZSk7XG4gICAgcmV0dXJuIG5hbWVMaXN0Lm1hcChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgdmFyIG5hbWVQYXRoID0gZ2V0TmFtZVBhdGgobmFtZSk7XG4gICAgICByZXR1cm4gY2FjaGUuZ2V0KG5hbWVQYXRoKSB8fCB7XG4gICAgICAgIElOVkFMSURBVEVfTkFNRV9QQVRIOiBnZXROYW1lUGF0aChuYW1lKVxuICAgICAgfTtcbiAgICB9KTtcbiAgfTtcbiAgdGhpcy5nZXRGaWVsZHNWYWx1ZSA9IGZ1bmN0aW9uIChuYW1lTGlzdCwgZmlsdGVyRnVuYykge1xuICAgIF90aGlzLndhcm5pbmdVbmhvb2tlZCgpO1xuICAgIGlmIChuYW1lTGlzdCA9PT0gdHJ1ZSAmJiAhZmlsdGVyRnVuYykge1xuICAgICAgcmV0dXJuIF90aGlzLnN0b3JlO1xuICAgIH1cbiAgICB2YXIgZmllbGRFbnRpdGllcyA9IF90aGlzLmdldEZpZWxkRW50aXRpZXNGb3JOYW1lUGF0aExpc3QoQXJyYXkuaXNBcnJheShuYW1lTGlzdCkgPyBuYW1lTGlzdCA6IG51bGwpO1xuICAgIHZhciBmaWx0ZXJlZE5hbWVMaXN0ID0gW107XG4gICAgZmllbGRFbnRpdGllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgIHZhciBfZW50aXR5JGlzTGlzdEZpZWxkO1xuICAgICAgdmFyIG5hbWVQYXRoID0gJ0lOVkFMSURBVEVfTkFNRV9QQVRIJyBpbiBlbnRpdHkgPyBlbnRpdHkuSU5WQUxJREFURV9OQU1FX1BBVEggOiBlbnRpdHkuZ2V0TmFtZVBhdGgoKTtcbiAgICAgIC8vIElnbm9yZSB3aGVuIGl0J3MgYSBsaXN0IGl0ZW0gYW5kIG5vdCBzcGVjaWZpYyB0aGUgbmFtZVBhdGgsXG4gICAgICAvLyBzaW5jZSBwYXJlbnQgZmllbGQgaXMgYWxyZWFkeSB0YWtlIGluIGNvdW50XG4gICAgICBpZiAoIW5hbWVMaXN0ICYmICgoX2VudGl0eSRpc0xpc3RGaWVsZCA9IGVudGl0eS5pc0xpc3RGaWVsZCkgPT09IG51bGwgfHwgX2VudGl0eSRpc0xpc3RGaWVsZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2VudGl0eSRpc0xpc3RGaWVsZC5jYWxsKGVudGl0eSkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghZmlsdGVyRnVuYykge1xuICAgICAgICBmaWx0ZXJlZE5hbWVMaXN0LnB1c2gobmFtZVBhdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG1ldGEgPSAnZ2V0TWV0YScgaW4gZW50aXR5ID8gZW50aXR5LmdldE1ldGEoKSA6IG51bGw7XG4gICAgICAgIGlmIChmaWx0ZXJGdW5jKG1ldGEpKSB7XG4gICAgICAgICAgZmlsdGVyZWROYW1lTGlzdC5wdXNoKG5hbWVQYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9uZUJ5TmFtZVBhdGhMaXN0KF90aGlzLnN0b3JlLCBmaWx0ZXJlZE5hbWVMaXN0Lm1hcChnZXROYW1lUGF0aCkpO1xuICB9O1xuICB0aGlzLmdldEZpZWxkVmFsdWUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIF90aGlzLndhcm5pbmdVbmhvb2tlZCgpO1xuICAgIHZhciBuYW1lUGF0aCA9IGdldE5hbWVQYXRoKG5hbWUpO1xuICAgIHJldHVybiBnZXRWYWx1ZShfdGhpcy5zdG9yZSwgbmFtZVBhdGgpO1xuICB9O1xuICB0aGlzLmdldEZpZWxkc0Vycm9yID0gZnVuY3Rpb24gKG5hbWVMaXN0KSB7XG4gICAgX3RoaXMud2FybmluZ1VuaG9va2VkKCk7XG4gICAgdmFyIGZpZWxkRW50aXRpZXMgPSBfdGhpcy5nZXRGaWVsZEVudGl0aWVzRm9yTmFtZVBhdGhMaXN0KG5hbWVMaXN0KTtcbiAgICByZXR1cm4gZmllbGRFbnRpdGllcy5tYXAoZnVuY3Rpb24gKGVudGl0eSwgaW5kZXgpIHtcbiAgICAgIGlmIChlbnRpdHkgJiYgISgnSU5WQUxJREFURV9OQU1FX1BBVEgnIGluIGVudGl0eSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBlbnRpdHkuZ2V0TmFtZVBhdGgoKSxcbiAgICAgICAgICBlcnJvcnM6IGVudGl0eS5nZXRFcnJvcnMoKSxcbiAgICAgICAgICB3YXJuaW5nczogZW50aXR5LmdldFdhcm5pbmdzKClcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGdldE5hbWVQYXRoKG5hbWVMaXN0W2luZGV4XSksXG4gICAgICAgIGVycm9yczogW10sXG4gICAgICAgIHdhcm5pbmdzOiBbXVxuICAgICAgfTtcbiAgICB9KTtcbiAgfTtcbiAgdGhpcy5nZXRGaWVsZEVycm9yID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBfdGhpcy53YXJuaW5nVW5ob29rZWQoKTtcbiAgICB2YXIgbmFtZVBhdGggPSBnZXROYW1lUGF0aChuYW1lKTtcbiAgICB2YXIgZmllbGRFcnJvciA9IF90aGlzLmdldEZpZWxkc0Vycm9yKFtuYW1lUGF0aF0pWzBdO1xuICAgIHJldHVybiBmaWVsZEVycm9yLmVycm9ycztcbiAgfTtcbiAgdGhpcy5nZXRGaWVsZFdhcm5pbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIF90aGlzLndhcm5pbmdVbmhvb2tlZCgpO1xuICAgIHZhciBuYW1lUGF0aCA9IGdldE5hbWVQYXRoKG5hbWUpO1xuICAgIHZhciBmaWVsZEVycm9yID0gX3RoaXMuZ2V0RmllbGRzRXJyb3IoW25hbWVQYXRoXSlbMF07XG4gICAgcmV0dXJuIGZpZWxkRXJyb3Iud2FybmluZ3M7XG4gIH07XG4gIHRoaXMuaXNGaWVsZHNUb3VjaGVkID0gZnVuY3Rpb24gKCkge1xuICAgIF90aGlzLndhcm5pbmdVbmhvb2tlZCgpO1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgdmFyIGFyZzAgPSBhcmdzWzBdLFxuICAgICAgYXJnMSA9IGFyZ3NbMV07XG4gICAgdmFyIG5hbWVQYXRoTGlzdDtcbiAgICB2YXIgaXNBbGxGaWVsZHNUb3VjaGVkID0gZmFsc2U7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBuYW1lUGF0aExpc3QgPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGFyZzApKSB7XG4gICAgICAgIG5hbWVQYXRoTGlzdCA9IGFyZzAubWFwKGdldE5hbWVQYXRoKTtcbiAgICAgICAgaXNBbGxGaWVsZHNUb3VjaGVkID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuYW1lUGF0aExpc3QgPSBudWxsO1xuICAgICAgICBpc0FsbEZpZWxkc1RvdWNoZWQgPSBhcmcwO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lUGF0aExpc3QgPSBhcmcwLm1hcChnZXROYW1lUGF0aCk7XG4gICAgICBpc0FsbEZpZWxkc1RvdWNoZWQgPSBhcmcxO1xuICAgIH1cbiAgICB2YXIgZmllbGRFbnRpdGllcyA9IF90aGlzLmdldEZpZWxkRW50aXRpZXModHJ1ZSk7XG4gICAgdmFyIGlzRmllbGRUb3VjaGVkID0gZnVuY3Rpb24gaXNGaWVsZFRvdWNoZWQoZmllbGQpIHtcbiAgICAgIHJldHVybiBmaWVsZC5pc0ZpZWxkVG91Y2hlZCgpO1xuICAgIH07XG4gICAgLy8gPT09PT0gV2lsbCBnZXQgZnVsbHkgY29tcGFyZSB3aGVuIG5vdCBjb25maWcgbmFtZVBhdGhMaXN0ID09PT09XG4gICAgaWYgKCFuYW1lUGF0aExpc3QpIHtcbiAgICAgIHJldHVybiBpc0FsbEZpZWxkc1RvdWNoZWQgPyBmaWVsZEVudGl0aWVzLmV2ZXJ5KGlzRmllbGRUb3VjaGVkKSA6IGZpZWxkRW50aXRpZXMuc29tZShpc0ZpZWxkVG91Y2hlZCk7XG4gICAgfVxuICAgIC8vIEdlbmVyYXRlIGEgbmVzdCB0cmVlIGZvciB2YWxpZGF0ZVxuICAgIHZhciBtYXAgPSBuZXcgTmFtZU1hcCgpO1xuICAgIG5hbWVQYXRoTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChzaG9ydE5hbWVQYXRoKSB7XG4gICAgICBtYXAuc2V0KHNob3J0TmFtZVBhdGgsIFtdKTtcbiAgICB9KTtcbiAgICBmaWVsZEVudGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICB2YXIgZmllbGROYW1lUGF0aCA9IGZpZWxkLmdldE5hbWVQYXRoKCk7XG4gICAgICAvLyBGaW5kIG1hdGNoZWQgZW50aXR5IGFuZCBwdXQgaW50byBsaXN0XG4gICAgICBuYW1lUGF0aExpc3QuZm9yRWFjaChmdW5jdGlvbiAoc2hvcnROYW1lUGF0aCkge1xuICAgICAgICBpZiAoc2hvcnROYW1lUGF0aC5ldmVyeShmdW5jdGlvbiAobmFtZVVuaXQsIGkpIHtcbiAgICAgICAgICByZXR1cm4gZmllbGROYW1lUGF0aFtpXSA9PT0gbmFtZVVuaXQ7XG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgbWFwLnVwZGF0ZShzaG9ydE5hbWVQYXRoLCBmdW5jdGlvbiAobGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkobGlzdCksIFtmaWVsZF0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICAvLyBDaGVjayBpZiBOYW1lTWFwIHZhbHVlIGlzIHRvdWNoZWRcbiAgICB2YXIgaXNOYW1lUGF0aExpc3RUb3VjaGVkID0gZnVuY3Rpb24gaXNOYW1lUGF0aExpc3RUb3VjaGVkKGVudGl0aWVzKSB7XG4gICAgICByZXR1cm4gZW50aXRpZXMuc29tZShpc0ZpZWxkVG91Y2hlZCk7XG4gICAgfTtcbiAgICB2YXIgbmFtZVBhdGhMaXN0RW50aXRpZXMgPSBtYXAubWFwKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgdmFyIHZhbHVlID0gX3JlZjIudmFsdWU7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIGlzQWxsRmllbGRzVG91Y2hlZCA/IG5hbWVQYXRoTGlzdEVudGl0aWVzLmV2ZXJ5KGlzTmFtZVBhdGhMaXN0VG91Y2hlZCkgOiBuYW1lUGF0aExpc3RFbnRpdGllcy5zb21lKGlzTmFtZVBhdGhMaXN0VG91Y2hlZCk7XG4gIH07XG4gIHRoaXMuaXNGaWVsZFRvdWNoZWQgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIF90aGlzLndhcm5pbmdVbmhvb2tlZCgpO1xuICAgIHJldHVybiBfdGhpcy5pc0ZpZWxkc1RvdWNoZWQoW25hbWVdKTtcbiAgfTtcbiAgdGhpcy5pc0ZpZWxkc1ZhbGlkYXRpbmcgPSBmdW5jdGlvbiAobmFtZUxpc3QpIHtcbiAgICBfdGhpcy53YXJuaW5nVW5ob29rZWQoKTtcbiAgICB2YXIgZmllbGRFbnRpdGllcyA9IF90aGlzLmdldEZpZWxkRW50aXRpZXMoKTtcbiAgICBpZiAoIW5hbWVMaXN0KSB7XG4gICAgICByZXR1cm4gZmllbGRFbnRpdGllcy5zb21lKGZ1bmN0aW9uICh0ZXN0RmllbGQpIHtcbiAgICAgICAgcmV0dXJuIHRlc3RGaWVsZC5pc0ZpZWxkVmFsaWRhdGluZygpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHZhciBuYW1lUGF0aExpc3QgPSBuYW1lTGlzdC5tYXAoZ2V0TmFtZVBhdGgpO1xuICAgIHJldHVybiBmaWVsZEVudGl0aWVzLnNvbWUoZnVuY3Rpb24gKHRlc3RGaWVsZCkge1xuICAgICAgdmFyIGZpZWxkTmFtZVBhdGggPSB0ZXN0RmllbGQuZ2V0TmFtZVBhdGgoKTtcbiAgICAgIHJldHVybiBjb250YWluc05hbWVQYXRoKG5hbWVQYXRoTGlzdCwgZmllbGROYW1lUGF0aCkgJiYgdGVzdEZpZWxkLmlzRmllbGRWYWxpZGF0aW5nKCk7XG4gICAgfSk7XG4gIH07XG4gIHRoaXMuaXNGaWVsZFZhbGlkYXRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIF90aGlzLndhcm5pbmdVbmhvb2tlZCgpO1xuICAgIHJldHVybiBfdGhpcy5pc0ZpZWxkc1ZhbGlkYXRpbmcoW25hbWVdKTtcbiAgfTtcbiAgdGhpcy5yZXNldFdpdGhGaWVsZEluaXRpYWxWYWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaW5mbyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgLy8gQ3JlYXRlIGNhY2hlXG4gICAgdmFyIGNhY2hlID0gbmV3IE5hbWVNYXAoKTtcbiAgICB2YXIgZmllbGRFbnRpdGllcyA9IF90aGlzLmdldEZpZWxkRW50aXRpZXModHJ1ZSk7XG4gICAgZmllbGRFbnRpdGllcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgdmFyIGluaXRpYWxWYWx1ZSA9IGZpZWxkLnByb3BzLmluaXRpYWxWYWx1ZTtcbiAgICAgIHZhciBuYW1lUGF0aCA9IGZpZWxkLmdldE5hbWVQYXRoKCk7XG4gICAgICAvLyBSZWNvcmQgb25seSBpZiBoYXMgYGluaXRpYWxWYWx1ZWBcbiAgICAgIGlmIChpbml0aWFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgcmVjb3JkcyA9IGNhY2hlLmdldChuYW1lUGF0aCkgfHwgbmV3IFNldCgpO1xuICAgICAgICByZWNvcmRzLmFkZCh7XG4gICAgICAgICAgZW50aXR5OiBmaWVsZCxcbiAgICAgICAgICB2YWx1ZTogaW5pdGlhbFZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICBjYWNoZS5zZXQobmFtZVBhdGgsIHJlY29yZHMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIFJlc2V0XG4gICAgdmFyIHJlc2V0V2l0aEZpZWxkcyA9IGZ1bmN0aW9uIHJlc2V0V2l0aEZpZWxkcyhlbnRpdGllcykge1xuICAgICAgZW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgdmFyIGluaXRpYWxWYWx1ZSA9IGZpZWxkLnByb3BzLmluaXRpYWxWYWx1ZTtcbiAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFyIG5hbWVQYXRoID0gZmllbGQuZ2V0TmFtZVBhdGgoKTtcbiAgICAgICAgICB2YXIgZm9ybUluaXRpYWxWYWx1ZSA9IF90aGlzLmdldEluaXRpYWxWYWx1ZShuYW1lUGF0aCk7XG4gICAgICAgICAgaWYgKGZvcm1Jbml0aWFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gV2FybmluZyBpZiBjb25mbGljdCB3aXRoIGZvcm0gaW5pdGlhbFZhbHVlcyBhbmQgZG8gbm90IG1vZGlmeSB2YWx1ZVxuICAgICAgICAgICAgd2FybmluZyhmYWxzZSwgXCJGb3JtIGFscmVhZHkgc2V0ICdpbml0aWFsVmFsdWVzJyB3aXRoIHBhdGggJ1wiLmNvbmNhdChuYW1lUGF0aC5qb2luKCcuJyksIFwiJy4gRmllbGQgY2FuIG5vdCBvdmVyd3JpdGUgaXQuXCIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHJlY29yZHMgPSBjYWNoZS5nZXQobmFtZVBhdGgpO1xuICAgICAgICAgICAgaWYgKHJlY29yZHMgJiYgcmVjb3Jkcy5zaXplID4gMSkge1xuICAgICAgICAgICAgICAvLyBXYXJuaW5nIGlmIG11bHRpcGxlIGZpZWxkIHNldCBgaW5pdGlhbFZhbHVlYGFuZCBkbyBub3QgbW9kaWZ5IHZhbHVlXG4gICAgICAgICAgICAgIHdhcm5pbmcoZmFsc2UsIFwiTXVsdGlwbGUgRmllbGQgd2l0aCBwYXRoICdcIi5jb25jYXQobmFtZVBhdGguam9pbignLicpLCBcIicgc2V0ICdpbml0aWFsVmFsdWUnLiBDYW4gbm90IGRlY2lkZSB3aGljaCBvbmUgdG8gcGljay5cIikpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChyZWNvcmRzKSB7XG4gICAgICAgICAgICAgIHZhciBvcmlnaW5WYWx1ZSA9IF90aGlzLmdldEZpZWxkVmFsdWUobmFtZVBhdGgpO1xuICAgICAgICAgICAgICAvLyBTZXQgYGluaXRpYWxWYWx1ZWBcbiAgICAgICAgICAgICAgaWYgKCFpbmZvLnNraXBFeGlzdCB8fCBvcmlnaW5WYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMudXBkYXRlU3RvcmUoc2V0VmFsdWUoX3RoaXMuc3RvcmUsIG5hbWVQYXRoLCBfdG9Db25zdW1hYmxlQXJyYXkocmVjb3JkcylbMF0udmFsdWUpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgICB2YXIgcmVxdWlyZWRGaWVsZEVudGl0aWVzO1xuICAgIGlmIChpbmZvLmVudGl0aWVzKSB7XG4gICAgICByZXF1aXJlZEZpZWxkRW50aXRpZXMgPSBpbmZvLmVudGl0aWVzO1xuICAgIH0gZWxzZSBpZiAoaW5mby5uYW1lUGF0aExpc3QpIHtcbiAgICAgIHJlcXVpcmVkRmllbGRFbnRpdGllcyA9IFtdO1xuICAgICAgaW5mby5uYW1lUGF0aExpc3QuZm9yRWFjaChmdW5jdGlvbiAobmFtZVBhdGgpIHtcbiAgICAgICAgdmFyIHJlY29yZHMgPSBjYWNoZS5nZXQobmFtZVBhdGgpO1xuICAgICAgICBpZiAocmVjb3Jkcykge1xuICAgICAgICAgIHZhciBfcmVxdWlyZWRGaWVsZEVudGl0aWU7XG4gICAgICAgICAgKF9yZXF1aXJlZEZpZWxkRW50aXRpZSA9IHJlcXVpcmVkRmllbGRFbnRpdGllcykucHVzaC5hcHBseShfcmVxdWlyZWRGaWVsZEVudGl0aWUsIF90b0NvbnN1bWFibGVBcnJheShfdG9Db25zdW1hYmxlQXJyYXkocmVjb3JkcykubWFwKGZ1bmN0aW9uIChyKSB7XG4gICAgICAgICAgICByZXR1cm4gci5lbnRpdHk7XG4gICAgICAgICAgfSkpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcXVpcmVkRmllbGRFbnRpdGllcyA9IGZpZWxkRW50aXRpZXM7XG4gICAgfVxuICAgIHJlc2V0V2l0aEZpZWxkcyhyZXF1aXJlZEZpZWxkRW50aXRpZXMpO1xuICB9O1xuICB0aGlzLnJlc2V0RmllbGRzID0gZnVuY3Rpb24gKG5hbWVMaXN0KSB7XG4gICAgX3RoaXMud2FybmluZ1VuaG9va2VkKCk7XG4gICAgdmFyIHByZXZTdG9yZSA9IF90aGlzLnN0b3JlO1xuICAgIGlmICghbmFtZUxpc3QpIHtcbiAgICAgIF90aGlzLnVwZGF0ZVN0b3JlKHNldFZhbHVlcyh7fSwgX3RoaXMuaW5pdGlhbFZhbHVlcykpO1xuICAgICAgX3RoaXMucmVzZXRXaXRoRmllbGRJbml0aWFsVmFsdWUoKTtcbiAgICAgIF90aGlzLm5vdGlmeU9ic2VydmVycyhwcmV2U3RvcmUsIG51bGwsIHtcbiAgICAgICAgdHlwZTogJ3Jlc2V0J1xuICAgICAgfSk7XG4gICAgICBfdGhpcy5ub3RpZnlXYXRjaCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBSZXNldCBieSBgbmFtZUxpc3RgXG4gICAgdmFyIG5hbWVQYXRoTGlzdCA9IG5hbWVMaXN0Lm1hcChnZXROYW1lUGF0aCk7XG4gICAgbmFtZVBhdGhMaXN0LmZvckVhY2goZnVuY3Rpb24gKG5hbWVQYXRoKSB7XG4gICAgICB2YXIgaW5pdGlhbFZhbHVlID0gX3RoaXMuZ2V0SW5pdGlhbFZhbHVlKG5hbWVQYXRoKTtcbiAgICAgIF90aGlzLnVwZGF0ZVN0b3JlKHNldFZhbHVlKF90aGlzLnN0b3JlLCBuYW1lUGF0aCwgaW5pdGlhbFZhbHVlKSk7XG4gICAgfSk7XG4gICAgX3RoaXMucmVzZXRXaXRoRmllbGRJbml0aWFsVmFsdWUoe1xuICAgICAgbmFtZVBhdGhMaXN0OiBuYW1lUGF0aExpc3RcbiAgICB9KTtcbiAgICBfdGhpcy5ub3RpZnlPYnNlcnZlcnMocHJldlN0b3JlLCBuYW1lUGF0aExpc3QsIHtcbiAgICAgIHR5cGU6ICdyZXNldCdcbiAgICB9KTtcbiAgICBfdGhpcy5ub3RpZnlXYXRjaChuYW1lUGF0aExpc3QpO1xuICB9O1xuICB0aGlzLnNldEZpZWxkcyA9IGZ1bmN0aW9uIChmaWVsZHMpIHtcbiAgICBfdGhpcy53YXJuaW5nVW5ob29rZWQoKTtcbiAgICB2YXIgcHJldlN0b3JlID0gX3RoaXMuc3RvcmU7XG4gICAgdmFyIG5hbWVQYXRoTGlzdCA9IFtdO1xuICAgIGZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWVsZERhdGEpIHtcbiAgICAgIHZhciBuYW1lID0gZmllbGREYXRhLm5hbWUsXG4gICAgICAgIGVycm9ycyA9IGZpZWxkRGF0YS5lcnJvcnMsXG4gICAgICAgIGRhdGEgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoZmllbGREYXRhLCBfZXhjbHVkZWQpO1xuICAgICAgdmFyIG5hbWVQYXRoID0gZ2V0TmFtZVBhdGgobmFtZSk7XG4gICAgICBuYW1lUGF0aExpc3QucHVzaChuYW1lUGF0aCk7XG4gICAgICAvLyBWYWx1ZVxuICAgICAgaWYgKCd2YWx1ZScgaW4gZGF0YSkge1xuICAgICAgICBfdGhpcy51cGRhdGVTdG9yZShzZXRWYWx1ZShfdGhpcy5zdG9yZSwgbmFtZVBhdGgsIGRhdGEudmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIF90aGlzLm5vdGlmeU9ic2VydmVycyhwcmV2U3RvcmUsIFtuYW1lUGF0aF0sIHtcbiAgICAgICAgdHlwZTogJ3NldEZpZWxkJyxcbiAgICAgICAgZGF0YTogZmllbGREYXRhXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBfdGhpcy5ub3RpZnlXYXRjaChuYW1lUGF0aExpc3QpO1xuICB9O1xuICB0aGlzLmdldEZpZWxkcyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZW50aXRpZXMgPSBfdGhpcy5nZXRGaWVsZEVudGl0aWVzKHRydWUpO1xuICAgIHZhciBmaWVsZHMgPSBlbnRpdGllcy5tYXAoZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICB2YXIgbmFtZVBhdGggPSBmaWVsZC5nZXROYW1lUGF0aCgpO1xuICAgICAgdmFyIG1ldGEgPSBmaWVsZC5nZXRNZXRhKCk7XG4gICAgICB2YXIgZmllbGREYXRhID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtZXRhKSwge30sIHtcbiAgICAgICAgbmFtZTogbmFtZVBhdGgsXG4gICAgICAgIHZhbHVlOiBfdGhpcy5nZXRGaWVsZFZhbHVlKG5hbWVQYXRoKVxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZmllbGREYXRhLCAnb3JpZ2luUkNGaWVsZCcsIHtcbiAgICAgICAgdmFsdWU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZpZWxkRGF0YTtcbiAgICB9KTtcbiAgICByZXR1cm4gZmllbGRzO1xuICB9O1xuICB0aGlzLmluaXRFbnRpdHlWYWx1ZSA9IGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICB2YXIgaW5pdGlhbFZhbHVlID0gZW50aXR5LnByb3BzLmluaXRpYWxWYWx1ZTtcbiAgICBpZiAoaW5pdGlhbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBuYW1lUGF0aCA9IGVudGl0eS5nZXROYW1lUGF0aCgpO1xuICAgICAgdmFyIHByZXZWYWx1ZSA9IGdldFZhbHVlKF90aGlzLnN0b3JlLCBuYW1lUGF0aCk7XG4gICAgICBpZiAocHJldlZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgX3RoaXMudXBkYXRlU3RvcmUoc2V0VmFsdWUoX3RoaXMuc3RvcmUsIG5hbWVQYXRoLCBpbml0aWFsVmFsdWUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHRoaXMuaXNNZXJnZWRQcmVzZXJ2ZSA9IGZ1bmN0aW9uIChmaWVsZFByZXNlcnZlKSB7XG4gICAgdmFyIG1lcmdlZFByZXNlcnZlID0gZmllbGRQcmVzZXJ2ZSAhPT0gdW5kZWZpbmVkID8gZmllbGRQcmVzZXJ2ZSA6IF90aGlzLnByZXNlcnZlO1xuICAgIHJldHVybiBtZXJnZWRQcmVzZXJ2ZSAhPT0gbnVsbCAmJiBtZXJnZWRQcmVzZXJ2ZSAhPT0gdm9pZCAwID8gbWVyZ2VkUHJlc2VydmUgOiB0cnVlO1xuICB9O1xuICB0aGlzLnJlZ2lzdGVyRmllbGQgPSBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgX3RoaXMuZmllbGRFbnRpdGllcy5wdXNoKGVudGl0eSk7XG4gICAgdmFyIG5hbWVQYXRoID0gZW50aXR5LmdldE5hbWVQYXRoKCk7XG4gICAgX3RoaXMubm90aWZ5V2F0Y2goW25hbWVQYXRoXSk7XG4gICAgLy8gU2V0IGluaXRpYWwgdmFsdWVzXG4gICAgaWYgKGVudGl0eS5wcm9wcy5pbml0aWFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHByZXZTdG9yZSA9IF90aGlzLnN0b3JlO1xuICAgICAgX3RoaXMucmVzZXRXaXRoRmllbGRJbml0aWFsVmFsdWUoe1xuICAgICAgICBlbnRpdGllczogW2VudGl0eV0sXG4gICAgICAgIHNraXBFeGlzdDogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBfdGhpcy5ub3RpZnlPYnNlcnZlcnMocHJldlN0b3JlLCBbZW50aXR5LmdldE5hbWVQYXRoKCldLCB7XG4gICAgICAgIHR5cGU6ICd2YWx1ZVVwZGF0ZScsXG4gICAgICAgIHNvdXJjZTogJ2ludGVybmFsJ1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIHVuLXJlZ2lzdGVyIGZpZWxkIGNhbGxiYWNrXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChpc0xpc3RGaWVsZCwgcHJlc2VydmUpIHtcbiAgICAgIHZhciBzdWJOYW1lUGF0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogW107XG4gICAgICBfdGhpcy5maWVsZEVudGl0aWVzID0gX3RoaXMuZmllbGRFbnRpdGllcy5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0gIT09IGVudGl0eTtcbiAgICAgIH0pO1xuICAgICAgLy8gQ2xlYW4gdXAgc3RvcmUgdmFsdWUgaWYgbm90IHByZXNlcnZlXG4gICAgICBpZiAoIV90aGlzLmlzTWVyZ2VkUHJlc2VydmUocHJlc2VydmUpICYmICghaXNMaXN0RmllbGQgfHwgc3ViTmFtZVBhdGgubGVuZ3RoID4gMSkpIHtcbiAgICAgICAgdmFyIGRlZmF1bHRWYWx1ZSA9IGlzTGlzdEZpZWxkID8gdW5kZWZpbmVkIDogX3RoaXMuZ2V0SW5pdGlhbFZhbHVlKG5hbWVQYXRoKTtcbiAgICAgICAgaWYgKG5hbWVQYXRoLmxlbmd0aCAmJiBfdGhpcy5nZXRGaWVsZFZhbHVlKG5hbWVQYXRoKSAhPT0gZGVmYXVsdFZhbHVlICYmIF90aGlzLmZpZWxkRW50aXRpZXMuZXZlcnkoZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIC8vIE9ubHkgcmVzZXQgd2hlbiBubyBuYW1lUGF0aCBleGlzdFxuICAgICAgICAgICAgIW1hdGNoTmFtZVBhdGgoZmllbGQuZ2V0TmFtZVBhdGgoKSwgbmFtZVBhdGgpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICB2YXIgX3ByZXZTdG9yZSA9IF90aGlzLnN0b3JlO1xuICAgICAgICAgIF90aGlzLnVwZGF0ZVN0b3JlKHNldFZhbHVlKF9wcmV2U3RvcmUsIG5hbWVQYXRoLCBkZWZhdWx0VmFsdWUsIHRydWUpKTtcbiAgICAgICAgICAvLyBOb3RpZnkgdGhhdCBmaWVsZCBpcyB1bm1vdW50XG4gICAgICAgICAgX3RoaXMubm90aWZ5T2JzZXJ2ZXJzKF9wcmV2U3RvcmUsIFtuYW1lUGF0aF0sIHtcbiAgICAgICAgICAgIHR5cGU6ICdyZW1vdmUnXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gRGVwZW5kZW5jaWVzIHVwZGF0ZVxuICAgICAgICAgIF90aGlzLnRyaWdnZXJEZXBlbmRlbmNpZXNVcGRhdGUoX3ByZXZTdG9yZSwgbmFtZVBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBfdGhpcy5ub3RpZnlXYXRjaChbbmFtZVBhdGhdKTtcbiAgICB9O1xuICB9O1xuICB0aGlzLmRpc3BhdGNoID0gZnVuY3Rpb24gKGFjdGlvbikge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3VwZGF0ZVZhbHVlJzpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBuYW1lUGF0aCA9IGFjdGlvbi5uYW1lUGF0aCxcbiAgICAgICAgICAgIHZhbHVlID0gYWN0aW9uLnZhbHVlO1xuICAgICAgICAgIF90aGlzLnVwZGF0ZVZhbHVlKG5hbWVQYXRoLCB2YWx1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ3ZhbGlkYXRlRmllbGQnOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9uYW1lUGF0aCA9IGFjdGlvbi5uYW1lUGF0aCxcbiAgICAgICAgICAgIHRyaWdnZXJOYW1lID0gYWN0aW9uLnRyaWdnZXJOYW1lO1xuICAgICAgICAgIF90aGlzLnZhbGlkYXRlRmllbGRzKFtfbmFtZVBhdGhdLCB7XG4gICAgICAgICAgICB0cmlnZ2VyTmFtZTogdHJpZ2dlck5hbWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgIC8vIEN1cnJlbnRseSB3ZSBkb24ndCBoYXZlIG90aGVyIGFjdGlvbi4gRG8gbm90aGluZy5cbiAgICB9XG4gIH07XG4gIHRoaXMubm90aWZ5T2JzZXJ2ZXJzID0gZnVuY3Rpb24gKHByZXZTdG9yZSwgbmFtZVBhdGhMaXN0LCBpbmZvKSB7XG4gICAgaWYgKF90aGlzLnN1YnNjcmliYWJsZSkge1xuICAgICAgdmFyIG1lcmdlZEluZm8gPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGluZm8pLCB7fSwge1xuICAgICAgICBzdG9yZTogX3RoaXMuZ2V0RmllbGRzVmFsdWUodHJ1ZSlcbiAgICAgIH0pO1xuICAgICAgX3RoaXMuZ2V0RmllbGRFbnRpdGllcygpLmZvckVhY2goZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgICAgIHZhciBvblN0b3JlQ2hhbmdlID0gX3JlZjMub25TdG9yZUNoYW5nZTtcbiAgICAgICAgb25TdG9yZUNoYW5nZShwcmV2U3RvcmUsIG5hbWVQYXRoTGlzdCwgbWVyZ2VkSW5mbyk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3RoaXMuZm9yY2VSb290VXBkYXRlKCk7XG4gICAgfVxuICB9O1xuICB0aGlzLnRyaWdnZXJEZXBlbmRlbmNpZXNVcGRhdGUgPSBmdW5jdGlvbiAocHJldlN0b3JlLCBuYW1lUGF0aCkge1xuICAgIHZhciBjaGlsZHJlbkZpZWxkcyA9IF90aGlzLmdldERlcGVuZGVuY3lDaGlsZHJlbkZpZWxkcyhuYW1lUGF0aCk7XG4gICAgaWYgKGNoaWxkcmVuRmllbGRzLmxlbmd0aCkge1xuICAgICAgX3RoaXMudmFsaWRhdGVGaWVsZHMoY2hpbGRyZW5GaWVsZHMpO1xuICAgIH1cbiAgICBfdGhpcy5ub3RpZnlPYnNlcnZlcnMocHJldlN0b3JlLCBjaGlsZHJlbkZpZWxkcywge1xuICAgICAgdHlwZTogJ2RlcGVuZGVuY2llc1VwZGF0ZScsXG4gICAgICByZWxhdGVkRmllbGRzOiBbbmFtZVBhdGhdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoY2hpbGRyZW5GaWVsZHMpKVxuICAgIH0pO1xuICAgIHJldHVybiBjaGlsZHJlbkZpZWxkcztcbiAgfTtcbiAgdGhpcy51cGRhdGVWYWx1ZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIHZhciBuYW1lUGF0aCA9IGdldE5hbWVQYXRoKG5hbWUpO1xuICAgIHZhciBwcmV2U3RvcmUgPSBfdGhpcy5zdG9yZTtcbiAgICBfdGhpcy51cGRhdGVTdG9yZShzZXRWYWx1ZShfdGhpcy5zdG9yZSwgbmFtZVBhdGgsIHZhbHVlKSk7XG4gICAgX3RoaXMubm90aWZ5T2JzZXJ2ZXJzKHByZXZTdG9yZSwgW25hbWVQYXRoXSwge1xuICAgICAgdHlwZTogJ3ZhbHVlVXBkYXRlJyxcbiAgICAgIHNvdXJjZTogJ2ludGVybmFsJ1xuICAgIH0pO1xuICAgIF90aGlzLm5vdGlmeVdhdGNoKFtuYW1lUGF0aF0pO1xuICAgIC8vIERlcGVuZGVuY2llcyB1cGRhdGVcbiAgICB2YXIgY2hpbGRyZW5GaWVsZHMgPSBfdGhpcy50cmlnZ2VyRGVwZW5kZW5jaWVzVXBkYXRlKHByZXZTdG9yZSwgbmFtZVBhdGgpO1xuICAgIC8vIHRyaWdnZXIgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICB2YXIgb25WYWx1ZXNDaGFuZ2UgPSBfdGhpcy5jYWxsYmFja3Mub25WYWx1ZXNDaGFuZ2U7XG4gICAgaWYgKG9uVmFsdWVzQ2hhbmdlKSB7XG4gICAgICB2YXIgY2hhbmdlZFZhbHVlcyA9IGNsb25lQnlOYW1lUGF0aExpc3QoX3RoaXMuc3RvcmUsIFtuYW1lUGF0aF0pO1xuICAgICAgb25WYWx1ZXNDaGFuZ2UoY2hhbmdlZFZhbHVlcywgX3RoaXMuZ2V0RmllbGRzVmFsdWUoKSk7XG4gICAgfVxuICAgIF90aGlzLnRyaWdnZXJPbkZpZWxkc0NoYW5nZShbbmFtZVBhdGhdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoY2hpbGRyZW5GaWVsZHMpKSk7XG4gIH07XG4gIHRoaXMuc2V0RmllbGRzVmFsdWUgPSBmdW5jdGlvbiAoc3RvcmUpIHtcbiAgICBfdGhpcy53YXJuaW5nVW5ob29rZWQoKTtcbiAgICB2YXIgcHJldlN0b3JlID0gX3RoaXMuc3RvcmU7XG4gICAgaWYgKHN0b3JlKSB7XG4gICAgICB2YXIgbmV4dFN0b3JlID0gc2V0VmFsdWVzKF90aGlzLnN0b3JlLCBzdG9yZSk7XG4gICAgICBfdGhpcy51cGRhdGVTdG9yZShuZXh0U3RvcmUpO1xuICAgIH1cbiAgICBfdGhpcy5ub3RpZnlPYnNlcnZlcnMocHJldlN0b3JlLCBudWxsLCB7XG4gICAgICB0eXBlOiAndmFsdWVVcGRhdGUnLFxuICAgICAgc291cmNlOiAnZXh0ZXJuYWwnXG4gICAgfSk7XG4gICAgX3RoaXMubm90aWZ5V2F0Y2goKTtcbiAgfTtcbiAgdGhpcy5zZXRGaWVsZFZhbHVlID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgX3RoaXMuc2V0RmllbGRzKFt7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IHZhbHVlXG4gICAgfV0pO1xuICB9O1xuICB0aGlzLmdldERlcGVuZGVuY3lDaGlsZHJlbkZpZWxkcyA9IGZ1bmN0aW9uIChyb290TmFtZVBhdGgpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBuZXcgU2V0KCk7XG4gICAgdmFyIGNoaWxkcmVuRmllbGRzID0gW107XG4gICAgdmFyIGRlcGVuZGVuY2llczJmaWVsZHMgPSBuZXcgTmFtZU1hcCgpO1xuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIG1hcHNcbiAgICAgKiBDYW4gdXNlIGNhY2hlIHRvIHNhdmUgcGVyZiBpZiB1c2VyIHJlcG9ydCBwZXJmb3JtYW5jZSBpc3N1ZSB3aXRoIHRoaXNcbiAgICAgKi9cbiAgICBfdGhpcy5nZXRGaWVsZEVudGl0aWVzKCkuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgIHZhciBkZXBlbmRlbmNpZXMgPSBmaWVsZC5wcm9wcy5kZXBlbmRlbmNpZXM7XG4gICAgICAoZGVwZW5kZW5jaWVzIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChkZXBlbmRlbmN5KSB7XG4gICAgICAgIHZhciBkZXBlbmRlbmN5TmFtZVBhdGggPSBnZXROYW1lUGF0aChkZXBlbmRlbmN5KTtcbiAgICAgICAgZGVwZW5kZW5jaWVzMmZpZWxkcy51cGRhdGUoZGVwZW5kZW5jeU5hbWVQYXRoLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGZpZWxkcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbmV3IFNldCgpO1xuICAgICAgICAgIGZpZWxkcy5hZGQoZmllbGQpO1xuICAgICAgICAgIHJldHVybiBmaWVsZHM7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdmFyIGZpbGxDaGlsZHJlbiA9IGZ1bmN0aW9uIGZpbGxDaGlsZHJlbihuYW1lUGF0aCkge1xuICAgICAgdmFyIGZpZWxkcyA9IGRlcGVuZGVuY2llczJmaWVsZHMuZ2V0KG5hbWVQYXRoKSB8fCBuZXcgU2V0KCk7XG4gICAgICBmaWVsZHMuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgaWYgKCFjaGlsZHJlbi5oYXMoZmllbGQpKSB7XG4gICAgICAgICAgY2hpbGRyZW4uYWRkKGZpZWxkKTtcbiAgICAgICAgICB2YXIgZmllbGROYW1lUGF0aCA9IGZpZWxkLmdldE5hbWVQYXRoKCk7XG4gICAgICAgICAgaWYgKGZpZWxkLmlzRmllbGREaXJ0eSgpICYmIGZpZWxkTmFtZVBhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICBjaGlsZHJlbkZpZWxkcy5wdXNoKGZpZWxkTmFtZVBhdGgpO1xuICAgICAgICAgICAgZmlsbENoaWxkcmVuKGZpZWxkTmFtZVBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgICBmaWxsQ2hpbGRyZW4ocm9vdE5hbWVQYXRoKTtcbiAgICByZXR1cm4gY2hpbGRyZW5GaWVsZHM7XG4gIH07XG4gIHRoaXMudHJpZ2dlck9uRmllbGRzQ2hhbmdlID0gZnVuY3Rpb24gKG5hbWVQYXRoTGlzdCwgZmlsZWRFcnJvcnMpIHtcbiAgICB2YXIgb25GaWVsZHNDaGFuZ2UgPSBfdGhpcy5jYWxsYmFja3Mub25GaWVsZHNDaGFuZ2U7XG4gICAgaWYgKG9uRmllbGRzQ2hhbmdlKSB7XG4gICAgICB2YXIgZmllbGRzID0gX3RoaXMuZ2V0RmllbGRzKCk7XG4gICAgICAvKipcbiAgICAgICAqIEZpbGwgZXJyb3JzIHNpbmNlIGBmaWVsZHNgIG1heSBiZSByZXBsYWNlZCBieSBjb250cm9sbGVkIGZpZWxkc1xuICAgICAgICovXG4gICAgICBpZiAoZmlsZWRFcnJvcnMpIHtcbiAgICAgICAgdmFyIGNhY2hlID0gbmV3IE5hbWVNYXAoKTtcbiAgICAgICAgZmlsZWRFcnJvcnMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjQpIHtcbiAgICAgICAgICB2YXIgbmFtZSA9IF9yZWY0Lm5hbWUsXG4gICAgICAgICAgICBlcnJvcnMgPSBfcmVmNC5lcnJvcnM7XG4gICAgICAgICAgY2FjaGUuc2V0KG5hbWUsIGVycm9ycyk7XG4gICAgICAgIH0pO1xuICAgICAgICBmaWVsZHMuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICBmaWVsZC5lcnJvcnMgPSBjYWNoZS5nZXQoZmllbGQubmFtZSkgfHwgZmllbGQuZXJyb3JzO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHZhciBjaGFuZ2VkRmllbGRzID0gZmllbGRzLmZpbHRlcihmdW5jdGlvbiAoX3JlZjUpIHtcbiAgICAgICAgdmFyIGZpZWxkTmFtZSA9IF9yZWY1Lm5hbWU7XG4gICAgICAgIHJldHVybiBjb250YWluc05hbWVQYXRoKG5hbWVQYXRoTGlzdCwgZmllbGROYW1lKTtcbiAgICAgIH0pO1xuICAgICAgb25GaWVsZHNDaGFuZ2UoY2hhbmdlZEZpZWxkcywgZmllbGRzKTtcbiAgICB9XG4gIH07XG4gIHRoaXMudmFsaWRhdGVGaWVsZHMgPSBmdW5jdGlvbiAobmFtZUxpc3QsIG9wdGlvbnMpIHtcbiAgICBfdGhpcy53YXJuaW5nVW5ob29rZWQoKTtcbiAgICB2YXIgcHJvdmlkZU5hbWVMaXN0ID0gISFuYW1lTGlzdDtcbiAgICB2YXIgbmFtZVBhdGhMaXN0ID0gcHJvdmlkZU5hbWVMaXN0ID8gbmFtZUxpc3QubWFwKGdldE5hbWVQYXRoKSA6IFtdO1xuICAgIC8vIENvbGxlY3QgcmVzdWx0IGluIHByb21pc2UgbGlzdFxuICAgIHZhciBwcm9taXNlTGlzdCA9IFtdO1xuICAgIF90aGlzLmdldEZpZWxkRW50aXRpZXModHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgIC8vIEFkZCBmaWVsZCBpZiBub3QgcHJvdmlkZSBgbmFtZUxpc3RgXG4gICAgICBpZiAoIXByb3ZpZGVOYW1lTGlzdCkge1xuICAgICAgICBuYW1lUGF0aExpc3QucHVzaChmaWVsZC5nZXROYW1lUGF0aCgpKTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogUmVjdXJzaXZlIHZhbGlkYXRlIGlmIGNvbmZpZ3VyZWQuXG4gICAgICAgKiBUT0RPOiBwZXJmIGltcHJvdmVtZW50IEB6b21iaWVKXG4gICAgICAgKi9cbiAgICAgIGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnJlY3Vyc2l2ZSkgJiYgcHJvdmlkZU5hbWVMaXN0KSB7XG4gICAgICAgIHZhciBuYW1lUGF0aCA9IGZpZWxkLmdldE5hbWVQYXRoKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgLy8gbmFtZUxpc3RbaV0gPT09IHVuZGVmaW5lZCDor7TmmI7mmK/ku6UgbmFtZUxpc3Qg5byA5aS055qEXG4gICAgICAgIC8vIFsnbmFtZSddIC0+IFsnbmFtZScsJ2xpc3QnXVxuICAgICAgICBuYW1lUGF0aC5ldmVyeShmdW5jdGlvbiAobmFtZVVuaXQsIGkpIHtcbiAgICAgICAgICByZXR1cm4gbmFtZUxpc3RbaV0gPT09IG5hbWVVbml0IHx8IG5hbWVMaXN0W2ldID09PSB1bmRlZmluZWQ7XG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgbmFtZVBhdGhMaXN0LnB1c2gobmFtZVBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBTa2lwIGlmIHdpdGhvdXQgcnVsZVxuICAgICAgaWYgKCFmaWVsZC5wcm9wcy5ydWxlcyB8fCAhZmllbGQucHJvcHMucnVsZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBmaWVsZE5hbWVQYXRoID0gZmllbGQuZ2V0TmFtZVBhdGgoKTtcbiAgICAgIC8vIEFkZCBmaWVsZCB2YWxpZGF0ZSBydWxlIGluIHRvIHByb21pc2UgbGlzdFxuICAgICAgaWYgKCFwcm92aWRlTmFtZUxpc3QgfHwgY29udGFpbnNOYW1lUGF0aChuYW1lUGF0aExpc3QsIGZpZWxkTmFtZVBhdGgpKSB7XG4gICAgICAgIHZhciBwcm9taXNlID0gZmllbGQudmFsaWRhdGVSdWxlcyhfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgICB2YWxpZGF0ZU1lc3NhZ2VzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGRlZmF1bHRWYWxpZGF0ZU1lc3NhZ2VzKSwgX3RoaXMudmFsaWRhdGVNZXNzYWdlcylcbiAgICAgICAgfSwgb3B0aW9ucykpO1xuICAgICAgICAvLyBXcmFwIHByb21pc2Ugd2l0aCBmaWVsZFxuICAgICAgICBwcm9taXNlTGlzdC5wdXNoKHByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IGZpZWxkTmFtZVBhdGgsXG4gICAgICAgICAgICBlcnJvcnM6IFtdLFxuICAgICAgICAgICAgd2FybmluZ3M6IFtdXG4gICAgICAgICAgfTtcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJ1bGVFcnJvcnMpIHtcbiAgICAgICAgICB2YXIgX3J1bGVFcnJvcnMkZm9yRWFjaDtcbiAgICAgICAgICB2YXIgbWVyZ2VkRXJyb3JzID0gW107XG4gICAgICAgICAgdmFyIG1lcmdlZFdhcm5pbmdzID0gW107XG4gICAgICAgICAgKF9ydWxlRXJyb3JzJGZvckVhY2ggPSBydWxlRXJyb3JzLmZvckVhY2gpID09PSBudWxsIHx8IF9ydWxlRXJyb3JzJGZvckVhY2ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ydWxlRXJyb3JzJGZvckVhY2guY2FsbChydWxlRXJyb3JzLCBmdW5jdGlvbiAoX3JlZjYpIHtcbiAgICAgICAgICAgIHZhciB3YXJuaW5nT25seSA9IF9yZWY2LnJ1bGUud2FybmluZ09ubHksXG4gICAgICAgICAgICAgIGVycm9ycyA9IF9yZWY2LmVycm9ycztcbiAgICAgICAgICAgIGlmICh3YXJuaW5nT25seSkge1xuICAgICAgICAgICAgICBtZXJnZWRXYXJuaW5ncy5wdXNoLmFwcGx5KG1lcmdlZFdhcm5pbmdzLCBfdG9Db25zdW1hYmxlQXJyYXkoZXJyb3JzKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBtZXJnZWRFcnJvcnMucHVzaC5hcHBseShtZXJnZWRFcnJvcnMsIF90b0NvbnN1bWFibGVBcnJheShlcnJvcnMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAobWVyZ2VkRXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHtcbiAgICAgICAgICAgICAgbmFtZTogZmllbGROYW1lUGF0aCxcbiAgICAgICAgICAgICAgZXJyb3JzOiBtZXJnZWRFcnJvcnMsXG4gICAgICAgICAgICAgIHdhcm5pbmdzOiBtZXJnZWRXYXJuaW5nc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBmaWVsZE5hbWVQYXRoLFxuICAgICAgICAgICAgZXJyb3JzOiBtZXJnZWRFcnJvcnMsXG4gICAgICAgICAgICB3YXJuaW5nczogbWVyZ2VkV2FybmluZ3NcbiAgICAgICAgICB9O1xuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdmFyIHN1bW1hcnlQcm9taXNlID0gYWxsUHJvbWlzZUZpbmlzaChwcm9taXNlTGlzdCk7XG4gICAgX3RoaXMubGFzdFZhbGlkYXRlUHJvbWlzZSA9IHN1bW1hcnlQcm9taXNlO1xuICAgIC8vIE5vdGlmeSBmaWVsZHMgd2l0aCBydWxlIHRoYXQgdmFsaWRhdGUgaGFzIGZpbmlzaGVkIGFuZCBuZWVkIHVwZGF0ZVxuICAgIHN1bW1hcnlQcm9taXNlLmNhdGNoKGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgICB2YXIgcmVzdWx0TmFtZVBhdGhMaXN0ID0gcmVzdWx0cy5tYXAoZnVuY3Rpb24gKF9yZWY3KSB7XG4gICAgICAgIHZhciBuYW1lID0gX3JlZjcubmFtZTtcbiAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgICB9KTtcbiAgICAgIF90aGlzLm5vdGlmeU9ic2VydmVycyhfdGhpcy5zdG9yZSwgcmVzdWx0TmFtZVBhdGhMaXN0LCB7XG4gICAgICAgIHR5cGU6ICd2YWxpZGF0ZUZpbmlzaCdcbiAgICAgIH0pO1xuICAgICAgX3RoaXMudHJpZ2dlck9uRmllbGRzQ2hhbmdlKHJlc3VsdE5hbWVQYXRoTGlzdCwgcmVzdWx0cyk7XG4gICAgfSk7XG4gICAgdmFyIHJldHVyblByb21pc2UgPSBzdW1tYXJ5UHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy5sYXN0VmFsaWRhdGVQcm9taXNlID09PSBzdW1tYXJ5UHJvbWlzZSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKF90aGlzLmdldEZpZWxkc1ZhbHVlKG5hbWVQYXRoTGlzdCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFtdKTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVzdWx0cykge1xuICAgICAgdmFyIGVycm9yTGlzdCA9IHJlc3VsdHMuZmlsdGVyKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiByZXN1bHQuZXJyb3JzLmxlbmd0aDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHtcbiAgICAgICAgdmFsdWVzOiBfdGhpcy5nZXRGaWVsZHNWYWx1ZShuYW1lUGF0aExpc3QpLFxuICAgICAgICBlcnJvckZpZWxkczogZXJyb3JMaXN0LFxuICAgICAgICBvdXRPZkRhdGU6IF90aGlzLmxhc3RWYWxpZGF0ZVByb21pc2UgIT09IHN1bW1hcnlQcm9taXNlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICAvLyBEbyBub3QgdGhyb3cgaW4gY29uc29sZVxuICAgIHJldHVyblByb21pc2UuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBlO1xuICAgIH0pO1xuICAgIHJldHVybiByZXR1cm5Qcm9taXNlO1xuICB9O1xuICB0aGlzLnN1Ym1pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpcy53YXJuaW5nVW5ob29rZWQoKTtcbiAgICBfdGhpcy52YWxpZGF0ZUZpZWxkcygpLnRoZW4oZnVuY3Rpb24gKHZhbHVlcykge1xuICAgICAgdmFyIG9uRmluaXNoID0gX3RoaXMuY2FsbGJhY2tzLm9uRmluaXNoO1xuICAgICAgaWYgKG9uRmluaXNoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgb25GaW5pc2godmFsdWVzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgLy8gU2hvdWxkIHByaW50IGVycm9yIGlmIHVzZXIgYG9uRmluaXNoYCBjYWxsYmFjayBmYWlsZWRcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIG9uRmluaXNoRmFpbGVkID0gX3RoaXMuY2FsbGJhY2tzLm9uRmluaXNoRmFpbGVkO1xuICAgICAgaWYgKG9uRmluaXNoRmFpbGVkKSB7XG4gICAgICAgIG9uRmluaXNoRmFpbGVkKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICB0aGlzLmZvcmNlUm9vdFVwZGF0ZSA9IGZvcmNlUm9vdFVwZGF0ZTtcbn0pO1xuZnVuY3Rpb24gdXNlRm9ybShmb3JtKSB7XG4gIHZhciBmb3JtUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSh7fSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgZm9yY2VVcGRhdGUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICBpZiAoIWZvcm1SZWYuY3VycmVudCkge1xuICAgIGlmIChmb3JtKSB7XG4gICAgICBmb3JtUmVmLmN1cnJlbnQgPSBmb3JtO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDcmVhdGUgYSBuZXcgRm9ybVN0b3JlIGlmIG5vdCBwcm92aWRlZFxuICAgICAgdmFyIGZvcmNlUmVSZW5kZXIgPSBmdW5jdGlvbiBmb3JjZVJlUmVuZGVyKCkge1xuICAgICAgICBmb3JjZVVwZGF0ZSh7fSk7XG4gICAgICB9O1xuICAgICAgdmFyIGZvcm1TdG9yZSA9IG5ldyBGb3JtU3RvcmUoZm9yY2VSZVJlbmRlcik7XG4gICAgICBmb3JtUmVmLmN1cnJlbnQgPSBmb3JtU3RvcmUuZ2V0Rm9ybSgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW2Zvcm1SZWYuY3VycmVudF07XG59XG5leHBvcnQgZGVmYXVsdCB1c2VGb3JtOyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIEZvcm1Db250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe1xuICB0cmlnZ2VyRm9ybUNoYW5nZTogZnVuY3Rpb24gdHJpZ2dlckZvcm1DaGFuZ2UoKSB7fSxcbiAgdHJpZ2dlckZvcm1GaW5pc2g6IGZ1bmN0aW9uIHRyaWdnZXJGb3JtRmluaXNoKCkge30sXG4gIHJlZ2lzdGVyRm9ybTogZnVuY3Rpb24gcmVnaXN0ZXJGb3JtKCkge30sXG4gIHVucmVnaXN0ZXJGb3JtOiBmdW5jdGlvbiB1bnJlZ2lzdGVyRm9ybSgpIHt9XG59KTtcbnZhciBGb3JtUHJvdmlkZXIgPSBmdW5jdGlvbiBGb3JtUHJvdmlkZXIoX3JlZikge1xuICB2YXIgdmFsaWRhdGVNZXNzYWdlcyA9IF9yZWYudmFsaWRhdGVNZXNzYWdlcyxcbiAgICBvbkZvcm1DaGFuZ2UgPSBfcmVmLm9uRm9ybUNoYW5nZSxcbiAgICBvbkZvcm1GaW5pc2ggPSBfcmVmLm9uRm9ybUZpbmlzaCxcbiAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG4gIHZhciBmb3JtQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoRm9ybUNvbnRleHQpO1xuICB2YXIgZm9ybXNSZWYgPSBSZWFjdC51c2VSZWYoe30pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRm9ybUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBmb3JtQ29udGV4dCksIHt9LCB7XG4gICAgICB2YWxpZGF0ZU1lc3NhZ2VzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGZvcm1Db250ZXh0LnZhbGlkYXRlTWVzc2FnZXMpLCB2YWxpZGF0ZU1lc3NhZ2VzKSxcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gPSAgICAgICAgICAgICAgICAgIEdsb2JhbCBGb3JtIENvbnRyb2wgICAgICAgICAgICAgICAgICA9XG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIHRyaWdnZXJGb3JtQ2hhbmdlOiBmdW5jdGlvbiB0cmlnZ2VyRm9ybUNoYW5nZShuYW1lLCBjaGFuZ2VkRmllbGRzKSB7XG4gICAgICAgIGlmIChvbkZvcm1DaGFuZ2UpIHtcbiAgICAgICAgICBvbkZvcm1DaGFuZ2UobmFtZSwge1xuICAgICAgICAgICAgY2hhbmdlZEZpZWxkczogY2hhbmdlZEZpZWxkcyxcbiAgICAgICAgICAgIGZvcm1zOiBmb3Jtc1JlZi5jdXJyZW50XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9ybUNvbnRleHQudHJpZ2dlckZvcm1DaGFuZ2UobmFtZSwgY2hhbmdlZEZpZWxkcyk7XG4gICAgICB9LFxuICAgICAgdHJpZ2dlckZvcm1GaW5pc2g6IGZ1bmN0aW9uIHRyaWdnZXJGb3JtRmluaXNoKG5hbWUsIHZhbHVlcykge1xuICAgICAgICBpZiAob25Gb3JtRmluaXNoKSB7XG4gICAgICAgICAgb25Gb3JtRmluaXNoKG5hbWUsIHtcbiAgICAgICAgICAgIHZhbHVlczogdmFsdWVzLFxuICAgICAgICAgICAgZm9ybXM6IGZvcm1zUmVmLmN1cnJlbnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3JtQ29udGV4dC50cmlnZ2VyRm9ybUZpbmlzaChuYW1lLCB2YWx1ZXMpO1xuICAgICAgfSxcbiAgICAgIHJlZ2lzdGVyRm9ybTogZnVuY3Rpb24gcmVnaXN0ZXJGb3JtKG5hbWUsIGZvcm0pIHtcbiAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICBmb3Jtc1JlZi5jdXJyZW50ID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBmb3Jtc1JlZi5jdXJyZW50KSwge30sIF9kZWZpbmVQcm9wZXJ0eSh7fSwgbmFtZSwgZm9ybSkpO1xuICAgICAgICB9XG4gICAgICAgIGZvcm1Db250ZXh0LnJlZ2lzdGVyRm9ybShuYW1lLCBmb3JtKTtcbiAgICAgIH0sXG4gICAgICB1bnJlZ2lzdGVyRm9ybTogZnVuY3Rpb24gdW5yZWdpc3RlckZvcm0obmFtZSkge1xuICAgICAgICB2YXIgbmV3Rm9ybXMgPSBfb2JqZWN0U3ByZWFkKHt9LCBmb3Jtc1JlZi5jdXJyZW50KTtcbiAgICAgICAgZGVsZXRlIG5ld0Zvcm1zW25hbWVdO1xuICAgICAgICBmb3Jtc1JlZi5jdXJyZW50ID0gbmV3Rm9ybXM7XG4gICAgICAgIGZvcm1Db250ZXh0LnVucmVnaXN0ZXJGb3JtKG5hbWUpO1xuICAgICAgfVxuICAgIH0pXG4gIH0sIGNoaWxkcmVuKTtcbn07XG5leHBvcnQgeyBGb3JtUHJvdmlkZXIgfTtcbmV4cG9ydCBkZWZhdWx0IEZvcm1Db250ZXh0OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJuYW1lXCIsIFwiaW5pdGlhbFZhbHVlc1wiLCBcImZpZWxkc1wiLCBcImZvcm1cIiwgXCJwcmVzZXJ2ZVwiLCBcImNoaWxkcmVuXCIsIFwiY29tcG9uZW50XCIsIFwidmFsaWRhdGVNZXNzYWdlc1wiLCBcInZhbGlkYXRlVHJpZ2dlclwiLCBcIm9uVmFsdWVzQ2hhbmdlXCIsIFwib25GaWVsZHNDaGFuZ2VcIiwgXCJvbkZpbmlzaFwiLCBcIm9uRmluaXNoRmFpbGVkXCJdO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZUZvcm0gZnJvbSAnLi91c2VGb3JtJztcbmltcG9ydCBGaWVsZENvbnRleHQsIHsgSE9PS19NQVJLIH0gZnJvbSAnLi9GaWVsZENvbnRleHQnO1xuaW1wb3J0IEZvcm1Db250ZXh0IGZyb20gJy4vRm9ybUNvbnRleHQnO1xuaW1wb3J0IHsgaXNTaW1pbGFyIH0gZnJvbSAnLi91dGlscy92YWx1ZVV0aWwnO1xudmFyIEZvcm0gPSBmdW5jdGlvbiBGb3JtKF9yZWYsIHJlZikge1xuICB2YXIgbmFtZSA9IF9yZWYubmFtZSxcbiAgICBpbml0aWFsVmFsdWVzID0gX3JlZi5pbml0aWFsVmFsdWVzLFxuICAgIGZpZWxkcyA9IF9yZWYuZmllbGRzLFxuICAgIGZvcm0gPSBfcmVmLmZvcm0sXG4gICAgcHJlc2VydmUgPSBfcmVmLnByZXNlcnZlLFxuICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICBfcmVmJGNvbXBvbmVudCA9IF9yZWYuY29tcG9uZW50LFxuICAgIENvbXBvbmVudCA9IF9yZWYkY29tcG9uZW50ID09PSB2b2lkIDAgPyAnZm9ybScgOiBfcmVmJGNvbXBvbmVudCxcbiAgICB2YWxpZGF0ZU1lc3NhZ2VzID0gX3JlZi52YWxpZGF0ZU1lc3NhZ2VzLFxuICAgIF9yZWYkdmFsaWRhdGVUcmlnZ2VyID0gX3JlZi52YWxpZGF0ZVRyaWdnZXIsXG4gICAgdmFsaWRhdGVUcmlnZ2VyID0gX3JlZiR2YWxpZGF0ZVRyaWdnZXIgPT09IHZvaWQgMCA/ICdvbkNoYW5nZScgOiBfcmVmJHZhbGlkYXRlVHJpZ2dlcixcbiAgICBvblZhbHVlc0NoYW5nZSA9IF9yZWYub25WYWx1ZXNDaGFuZ2UsXG4gICAgX29uRmllbGRzQ2hhbmdlID0gX3JlZi5vbkZpZWxkc0NoYW5nZSxcbiAgICBfb25GaW5pc2ggPSBfcmVmLm9uRmluaXNoLFxuICAgIG9uRmluaXNoRmFpbGVkID0gX3JlZi5vbkZpbmlzaEZhaWxlZCxcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgX2V4Y2x1ZGVkKTtcbiAgdmFyIGZvcm1Db250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChGb3JtQ29udGV4dCk7XG4gIC8vIFdlIGN1c3RvbWl6ZSBoYW5kbGUgZXZlbnQgc2luY2UgQ29udGV4dCB3aWxsIG1ha2VzIGFsbCB0aGUgY29uc3VtZXIgcmUtcmVuZGVyOlxuICAvLyBodHRwczovL3JlYWN0anMub3JnL2RvY3MvY29udGV4dC5odG1sI2NvbnRleHRwcm92aWRlclxuICB2YXIgX3VzZUZvcm0gPSB1c2VGb3JtKGZvcm0pLFxuICAgIF91c2VGb3JtMiA9IF9zbGljZWRUb0FycmF5KF91c2VGb3JtLCAxKSxcbiAgICBmb3JtSW5zdGFuY2UgPSBfdXNlRm9ybTJbMF07XG4gIHZhciBfZm9ybUluc3RhbmNlJGdldEludGUgPSBmb3JtSW5zdGFuY2UuZ2V0SW50ZXJuYWxIb29rcyhIT09LX01BUkspLFxuICAgIHVzZVN1YnNjcmliZSA9IF9mb3JtSW5zdGFuY2UkZ2V0SW50ZS51c2VTdWJzY3JpYmUsXG4gICAgc2V0SW5pdGlhbFZhbHVlcyA9IF9mb3JtSW5zdGFuY2UkZ2V0SW50ZS5zZXRJbml0aWFsVmFsdWVzLFxuICAgIHNldENhbGxiYWNrcyA9IF9mb3JtSW5zdGFuY2UkZ2V0SW50ZS5zZXRDYWxsYmFja3MsXG4gICAgc2V0VmFsaWRhdGVNZXNzYWdlcyA9IF9mb3JtSW5zdGFuY2UkZ2V0SW50ZS5zZXRWYWxpZGF0ZU1lc3NhZ2VzLFxuICAgIHNldFByZXNlcnZlID0gX2Zvcm1JbnN0YW5jZSRnZXRJbnRlLnNldFByZXNlcnZlLFxuICAgIGRlc3Ryb3lGb3JtID0gX2Zvcm1JbnN0YW5jZSRnZXRJbnRlLmRlc3Ryb3lGb3JtO1xuICAvLyBQYXNzIHJlZiB3aXRoIGZvcm0gaW5zdGFuY2VcbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZm9ybUluc3RhbmNlO1xuICB9KTtcbiAgLy8gUmVnaXN0ZXIgZm9ybSBpbnRvIENvbnRleHRcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBmb3JtQ29udGV4dC5yZWdpc3RlckZvcm0obmFtZSwgZm9ybUluc3RhbmNlKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgZm9ybUNvbnRleHQudW5yZWdpc3RlckZvcm0obmFtZSk7XG4gICAgfTtcbiAgfSwgW2Zvcm1Db250ZXh0LCBmb3JtSW5zdGFuY2UsIG5hbWVdKTtcbiAgLy8gUGFzcyBwcm9wcyB0byBzdG9yZVxuICBzZXRWYWxpZGF0ZU1lc3NhZ2VzKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZm9ybUNvbnRleHQudmFsaWRhdGVNZXNzYWdlcyksIHZhbGlkYXRlTWVzc2FnZXMpKTtcbiAgc2V0Q2FsbGJhY2tzKHtcbiAgICBvblZhbHVlc0NoYW5nZTogb25WYWx1ZXNDaGFuZ2UsXG4gICAgb25GaWVsZHNDaGFuZ2U6IGZ1bmN0aW9uIG9uRmllbGRzQ2hhbmdlKGNoYW5nZWRGaWVsZHMpIHtcbiAgICAgIGZvcm1Db250ZXh0LnRyaWdnZXJGb3JtQ2hhbmdlKG5hbWUsIGNoYW5nZWRGaWVsZHMpO1xuICAgICAgaWYgKF9vbkZpZWxkc0NoYW5nZSkge1xuICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcmVzdCA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgcmVzdFtfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgIH1cbiAgICAgICAgX29uRmllbGRzQ2hhbmdlLmFwcGx5KHZvaWQgMCwgW2NoYW5nZWRGaWVsZHNdLmNvbmNhdChyZXN0KSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvbkZpbmlzaDogZnVuY3Rpb24gb25GaW5pc2godmFsdWVzKSB7XG4gICAgICBmb3JtQ29udGV4dC50cmlnZ2VyRm9ybUZpbmlzaChuYW1lLCB2YWx1ZXMpO1xuICAgICAgaWYgKF9vbkZpbmlzaCkge1xuICAgICAgICBfb25GaW5pc2godmFsdWVzKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uRmluaXNoRmFpbGVkOiBvbkZpbmlzaEZhaWxlZFxuICB9KTtcbiAgc2V0UHJlc2VydmUocHJlc2VydmUpO1xuICAvLyBTZXQgaW5pdGlhbCB2YWx1ZSwgaW5pdCBzdG9yZSB2YWx1ZSB3aGVuIGZpcnN0IG1vdW50XG4gIHZhciBtb3VudFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgc2V0SW5pdGlhbFZhbHVlcyhpbml0aWFsVmFsdWVzLCAhbW91bnRSZWYuY3VycmVudCk7XG4gIGlmICghbW91bnRSZWYuY3VycmVudCkge1xuICAgIG1vdW50UmVmLmN1cnJlbnQgPSB0cnVlO1xuICB9XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGRlc3Ryb3lGb3JtO1xuICB9LFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIFtdKTtcbiAgLy8gUHJlcGFyZSBjaGlsZHJlbiBieSBgY2hpbGRyZW5gIHR5cGVcbiAgdmFyIGNoaWxkcmVuTm9kZTtcbiAgdmFyIGNoaWxkcmVuUmVuZGVyUHJvcHMgPSB0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbic7XG4gIGlmIChjaGlsZHJlblJlbmRlclByb3BzKSB7XG4gICAgdmFyIHZhbHVlcyA9IGZvcm1JbnN0YW5jZS5nZXRGaWVsZHNWYWx1ZSh0cnVlKTtcbiAgICBjaGlsZHJlbk5vZGUgPSBjaGlsZHJlbih2YWx1ZXMsIGZvcm1JbnN0YW5jZSk7XG4gIH0gZWxzZSB7XG4gICAgY2hpbGRyZW5Ob2RlID0gY2hpbGRyZW47XG4gIH1cbiAgLy8gTm90IHVzZSBzdWJzY3JpYmUgd2hlbiB1c2luZyByZW5kZXIgcHJvcHNcbiAgdXNlU3Vic2NyaWJlKCFjaGlsZHJlblJlbmRlclByb3BzKTtcbiAgLy8gTGlzdGVuIGlmIGZpZWxkcyBwcm92aWRlZC4gV2UgdXNlIHJlZiB0byBzYXZlIHByZXYgZGF0YSBoZXJlIHRvIGF2b2lkIGFkZGl0aW9uYWwgcmVuZGVyXG4gIHZhciBwcmV2RmllbGRzUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFpc1NpbWlsYXIocHJldkZpZWxkc1JlZi5jdXJyZW50IHx8IFtdLCBmaWVsZHMgfHwgW10pKSB7XG4gICAgICBmb3JtSW5zdGFuY2Uuc2V0RmllbGRzKGZpZWxkcyB8fCBbXSk7XG4gICAgfVxuICAgIHByZXZGaWVsZHNSZWYuY3VycmVudCA9IGZpZWxkcztcbiAgfSwgW2ZpZWxkcywgZm9ybUluc3RhbmNlXSk7XG4gIHZhciBmb3JtQ29udGV4dFZhbHVlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZm9ybUluc3RhbmNlKSwge30sIHtcbiAgICAgIHZhbGlkYXRlVHJpZ2dlcjogdmFsaWRhdGVUcmlnZ2VyXG4gICAgfSk7XG4gIH0sIFtmb3JtSW5zdGFuY2UsIHZhbGlkYXRlVHJpZ2dlcl0pO1xuICB2YXIgd3JhcHBlck5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGaWVsZENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogZm9ybUNvbnRleHRWYWx1ZVxuICB9LCBjaGlsZHJlbk5vZGUpO1xuICBpZiAoQ29tcG9uZW50ID09PSBmYWxzZSkge1xuICAgIHJldHVybiB3cmFwcGVyTm9kZTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBfZXh0ZW5kcyh7fSwgcmVzdFByb3BzLCB7XG4gICAgb25TdWJtaXQ6IGZ1bmN0aW9uIG9uU3VibWl0KGV2ZW50KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBmb3JtSW5zdGFuY2Uuc3VibWl0KCk7XG4gICAgfSxcbiAgICBvblJlc2V0OiBmdW5jdGlvbiBvblJlc2V0KGV2ZW50KSB7XG4gICAgICB2YXIgX3Jlc3RQcm9wcyRvblJlc2V0O1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGZvcm1JbnN0YW5jZS5yZXNldEZpZWxkcygpO1xuICAgICAgKF9yZXN0UHJvcHMkb25SZXNldCA9IHJlc3RQcm9wcy5vblJlc2V0KSA9PT0gbnVsbCB8fCBfcmVzdFByb3BzJG9uUmVzZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9yZXN0UHJvcHMkb25SZXNldC5jYWxsKHJlc3RQcm9wcywgZXZlbnQpO1xuICAgIH1cbiAgfSksIHdyYXBwZXJOb2RlKTtcbn07XG5leHBvcnQgZGVmYXVsdCBGb3JtOyIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IHsgRmllbGRDb250ZXh0IH0gZnJvbSAnLic7XG5pbXBvcnQgd2FybmluZyBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5pbXBvcnQgeyBIT09LX01BUksgfSBmcm9tICcuL0ZpZWxkQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VTdGF0ZSwgdXNlQ29udGV4dCwgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBnZXROYW1lUGF0aCwgZ2V0VmFsdWUgfSBmcm9tICcuL3V0aWxzL3ZhbHVlVXRpbCc7XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5KHZhbHVlKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIE1hdGgucmFuZG9tKCk7XG4gIH1cbn1cbnZhciB1c2VXYXRjaFdhcm5pbmcgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gZnVuY3Rpb24gKG5hbWVQYXRoKSB7XG4gIHZhciBmdWxseVN0ciA9IG5hbWVQYXRoLmpvaW4oJ19fUkNfRklFTERfRk9STV9TUExJVF9fJyk7XG4gIHZhciBuYW1lU3RyUmVmID0gdXNlUmVmKGZ1bGx5U3RyKTtcbiAgd2FybmluZyhuYW1lU3RyUmVmLmN1cnJlbnQgPT09IGZ1bGx5U3RyLCAnYHVzZVdhdGNoYCBpcyBub3Qgc3VwcG9ydCBkeW5hbWljIGBuYW1lUGF0aGAuIFBsZWFzZSBwcm92aWRlIHN0YXRpYyBpbnN0ZWFkLicpO1xufSA6IGZ1bmN0aW9uICgpIHt9O1xuZnVuY3Rpb24gdXNlV2F0Y2goKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cbiAgdmFyIF9hcmdzJCA9IGFyZ3NbMF0sXG4gICAgZGVwZW5kZW5jaWVzID0gX2FyZ3MkID09PSB2b2lkIDAgPyBbXSA6IF9hcmdzJCxcbiAgICBmb3JtID0gYXJnc1sxXTtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKCksXG4gICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgdmFsdWUgPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldFZhbHVlID0gX3VzZVN0YXRlMlsxXTtcbiAgdmFyIHZhbHVlU3RyID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHN0cmluZ2lmeSh2YWx1ZSk7XG4gIH0sIFt2YWx1ZV0pO1xuICB2YXIgdmFsdWVTdHJSZWYgPSB1c2VSZWYodmFsdWVTdHIpO1xuICB2YWx1ZVN0clJlZi5jdXJyZW50ID0gdmFsdWVTdHI7XG4gIHZhciBmaWVsZENvbnRleHQgPSB1c2VDb250ZXh0KEZpZWxkQ29udGV4dCk7XG4gIHZhciBmb3JtSW5zdGFuY2UgPSBmb3JtIHx8IGZpZWxkQ29udGV4dDtcbiAgdmFyIGlzVmFsaWRGb3JtID0gZm9ybUluc3RhbmNlICYmIGZvcm1JbnN0YW5jZS5faW5pdDtcbiAgLy8gV2FybmluZyBpZiBub3QgZXhpc3QgZm9ybSBpbnN0YW5jZVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHdhcm5pbmcoYXJncy5sZW5ndGggPT09IDIgPyBmb3JtID8gaXNWYWxpZEZvcm0gOiB0cnVlIDogaXNWYWxpZEZvcm0sICd1c2VXYXRjaCByZXF1aXJlcyBhIGZvcm0gaW5zdGFuY2Ugc2luY2UgaXQgY2FuIG5vdCBhdXRvIGRldGVjdCBmcm9tIGNvbnRleHQuJyk7XG4gIH1cbiAgdmFyIG5hbWVQYXRoID0gZ2V0TmFtZVBhdGgoZGVwZW5kZW5jaWVzKTtcbiAgdmFyIG5hbWVQYXRoUmVmID0gdXNlUmVmKG5hbWVQYXRoKTtcbiAgbmFtZVBhdGhSZWYuY3VycmVudCA9IG5hbWVQYXRoO1xuICB1c2VXYXRjaFdhcm5pbmcobmFtZVBhdGgpO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIC8vIFNraXAgaWYgbm90IGV4aXN0IGZvcm0gaW5zdGFuY2VcbiAgICBpZiAoIWlzVmFsaWRGb3JtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBnZXRGaWVsZHNWYWx1ZSA9IGZvcm1JbnN0YW5jZS5nZXRGaWVsZHNWYWx1ZSxcbiAgICAgIGdldEludGVybmFsSG9va3MgPSBmb3JtSW5zdGFuY2UuZ2V0SW50ZXJuYWxIb29rcztcbiAgICB2YXIgX2dldEludGVybmFsSG9va3MgPSBnZXRJbnRlcm5hbEhvb2tzKEhPT0tfTUFSSyksXG4gICAgICByZWdpc3RlcldhdGNoID0gX2dldEludGVybmFsSG9va3MucmVnaXN0ZXJXYXRjaDtcbiAgICB2YXIgY2FuY2VsUmVnaXN0ZXIgPSByZWdpc3RlcldhdGNoKGZ1bmN0aW9uIChzdG9yZSkge1xuICAgICAgdmFyIG5ld1ZhbHVlID0gZ2V0VmFsdWUoc3RvcmUsIG5hbWVQYXRoUmVmLmN1cnJlbnQpO1xuICAgICAgdmFyIG5leHRWYWx1ZVN0ciA9IHN0cmluZ2lmeShuZXdWYWx1ZSk7XG4gICAgICAvLyBDb21wYXJlIHN0cmluZ2lmeSBpbiBjYXNlIGl0J3MgbmVzdCBvYmplY3RcbiAgICAgIGlmICh2YWx1ZVN0clJlZi5jdXJyZW50ICE9PSBuZXh0VmFsdWVTdHIpIHtcbiAgICAgICAgdmFsdWVTdHJSZWYuY3VycmVudCA9IG5leHRWYWx1ZVN0cjtcbiAgICAgICAgc2V0VmFsdWUobmV3VmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIFRPRE86IFdlIGNhbiBpbXByb3ZlIHRoaXMgcGVyZiBpbiBmdXR1cmVcbiAgICB2YXIgaW5pdGlhbFZhbHVlID0gZ2V0VmFsdWUoZ2V0RmllbGRzVmFsdWUoKSwgbmFtZVBhdGhSZWYuY3VycmVudCk7XG4gICAgc2V0VmFsdWUoaW5pdGlhbFZhbHVlKTtcbiAgICByZXR1cm4gY2FuY2VsUmVnaXN0ZXI7XG4gIH0sXG4gIC8vIFdlIGRvIG5vdCBuZWVkIHJlLXJlZ2lzdGVyIHNpbmNlIG5hbWVQYXRoIGNvbnRlbnQgaXMgdGhlIHNhbWVcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICBbaXNWYWxpZEZvcm1dKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuZXhwb3J0IGRlZmF1bHQgdXNlV2F0Y2g7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEZpZWxkIGZyb20gJy4vRmllbGQnO1xuaW1wb3J0IExpc3QgZnJvbSAnLi9MaXN0JztcbmltcG9ydCB1c2VGb3JtIGZyb20gJy4vdXNlRm9ybSc7XG5pbXBvcnQgRmllbGRGb3JtIGZyb20gJy4vRm9ybSc7XG5pbXBvcnQgeyBGb3JtUHJvdmlkZXIgfSBmcm9tICcuL0Zvcm1Db250ZXh0JztcbmltcG9ydCBGaWVsZENvbnRleHQgZnJvbSAnLi9GaWVsZENvbnRleHQnO1xuaW1wb3J0IExpc3RDb250ZXh0IGZyb20gJy4vTGlzdENvbnRleHQnO1xuaW1wb3J0IHVzZVdhdGNoIGZyb20gJy4vdXNlV2F0Y2gnO1xudmFyIEludGVybmFsRm9ybSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEZpZWxkRm9ybSk7XG52YXIgUmVmRm9ybSA9IEludGVybmFsRm9ybTtcblJlZkZvcm0uRm9ybVByb3ZpZGVyID0gRm9ybVByb3ZpZGVyO1xuUmVmRm9ybS5GaWVsZCA9IEZpZWxkO1xuUmVmRm9ybS5MaXN0ID0gTGlzdDtcblJlZkZvcm0udXNlRm9ybSA9IHVzZUZvcm07XG5SZWZGb3JtLnVzZVdhdGNoID0gdXNlV2F0Y2g7XG5leHBvcnQgeyBGaWVsZCwgTGlzdCwgdXNlRm9ybSwgRm9ybVByb3ZpZGVyLCBGaWVsZENvbnRleHQsIExpc3RDb250ZXh0LCB1c2VXYXRjaCB9O1xuZXhwb3J0IGRlZmF1bHQgUmVmRm9ybTsiLCJleHBvcnQgZGVmYXVsdCB7XG4gIC8vIE9wdGlvbnMuanN4XG4gIGl0ZW1zX3Blcl9wYWdlOiAnLyBwYWdlJyxcbiAganVtcF90bzogJ0dvIHRvJyxcbiAganVtcF90b19jb25maXJtOiAnY29uZmlybScsXG4gIHBhZ2U6ICdQYWdlJyxcbiAgLy8gUGFnaW5hdGlvbi5qc3hcbiAgcHJldl9wYWdlOiAnUHJldmlvdXMgUGFnZScsXG4gIG5leHRfcGFnZTogJ05leHQgUGFnZScsXG4gIHByZXZfNTogJ1ByZXZpb3VzIDUgUGFnZXMnLFxuICBuZXh0XzU6ICdOZXh0IDUgUGFnZXMnLFxuICBwcmV2XzM6ICdQcmV2aW91cyAzIFBhZ2VzJyxcbiAgbmV4dF8zOiAnTmV4dCAzIFBhZ2VzJyxcbiAgcGFnZV9zaXplOiAnUGFnZSBTaXplJ1xufTsiLCJ2YXIgbG9jYWxlID0ge1xuICBsb2NhbGU6ICdlbl9VUycsXG4gIHRvZGF5OiAnVG9kYXknLFxuICBub3c6ICdOb3cnLFxuICBiYWNrVG9Ub2RheTogJ0JhY2sgdG8gdG9kYXknLFxuICBvazogJ09LJyxcbiAgY2xlYXI6ICdDbGVhcicsXG4gIG1vbnRoOiAnTW9udGgnLFxuICB5ZWFyOiAnWWVhcicsXG4gIHRpbWVTZWxlY3Q6ICdzZWxlY3QgdGltZScsXG4gIGRhdGVTZWxlY3Q6ICdzZWxlY3QgZGF0ZScsXG4gIHdlZWtTZWxlY3Q6ICdDaG9vc2UgYSB3ZWVrJyxcbiAgbW9udGhTZWxlY3Q6ICdDaG9vc2UgYSBtb250aCcsXG4gIHllYXJTZWxlY3Q6ICdDaG9vc2UgYSB5ZWFyJyxcbiAgZGVjYWRlU2VsZWN0OiAnQ2hvb3NlIGEgZGVjYWRlJyxcbiAgeWVhckZvcm1hdDogJ1lZWVknLFxuICBkYXRlRm9ybWF0OiAnTS9EL1lZWVknLFxuICBkYXlGb3JtYXQ6ICdEJyxcbiAgZGF0ZVRpbWVGb3JtYXQ6ICdNL0QvWVlZWSBISDptbTpzcycsXG4gIG1vbnRoQmVmb3JlWWVhcjogdHJ1ZSxcbiAgcHJldmlvdXNNb250aDogJ1ByZXZpb3VzIG1vbnRoIChQYWdlVXApJyxcbiAgbmV4dE1vbnRoOiAnTmV4dCBtb250aCAoUGFnZURvd24pJyxcbiAgcHJldmlvdXNZZWFyOiAnTGFzdCB5ZWFyIChDb250cm9sICsgbGVmdCknLFxuICBuZXh0WWVhcjogJ05leHQgeWVhciAoQ29udHJvbCArIHJpZ2h0KScsXG4gIHByZXZpb3VzRGVjYWRlOiAnTGFzdCBkZWNhZGUnLFxuICBuZXh0RGVjYWRlOiAnTmV4dCBkZWNhZGUnLFxuICBwcmV2aW91c0NlbnR1cnk6ICdMYXN0IGNlbnR1cnknLFxuICBuZXh0Q2VudHVyeTogJ05leHQgY2VudHVyeSdcbn07XG5leHBvcnQgZGVmYXVsdCBsb2NhbGU7IiwidmFyIGxvY2FsZSA9IHtcbiAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgdGltZScsXG4gIHJhbmdlUGxhY2Vob2xkZXI6IFsnU3RhcnQgdGltZScsICdFbmQgdGltZSddXG59O1xuZXhwb3J0IGRlZmF1bHQgbG9jYWxlOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IENhbGVuZGFyTG9jYWxlIGZyb20gXCJyYy1waWNrZXIvZXMvbG9jYWxlL2VuX1VTXCI7XG5pbXBvcnQgVGltZVBpY2tlckxvY2FsZSBmcm9tICcuLi8uLi90aW1lLXBpY2tlci9sb2NhbGUvZW5fVVMnO1xuLy8gTWVyZ2UgaW50byBhIGxvY2FsZSBvYmplY3RcbnZhciBsb2NhbGUgPSB7XG4gIGxhbmc6IF9leHRlbmRzKHtcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBkYXRlJyxcbiAgICB5ZWFyUGxhY2Vob2xkZXI6ICdTZWxlY3QgeWVhcicsXG4gICAgcXVhcnRlclBsYWNlaG9sZGVyOiAnU2VsZWN0IHF1YXJ0ZXInLFxuICAgIG1vbnRoUGxhY2Vob2xkZXI6ICdTZWxlY3QgbW9udGgnLFxuICAgIHdlZWtQbGFjZWhvbGRlcjogJ1NlbGVjdCB3ZWVrJyxcbiAgICByYW5nZVBsYWNlaG9sZGVyOiBbJ1N0YXJ0IGRhdGUnLCAnRW5kIGRhdGUnXSxcbiAgICByYW5nZVllYXJQbGFjZWhvbGRlcjogWydTdGFydCB5ZWFyJywgJ0VuZCB5ZWFyJ10sXG4gICAgcmFuZ2VRdWFydGVyUGxhY2Vob2xkZXI6IFsnU3RhcnQgcXVhcnRlcicsICdFbmQgcXVhcnRlciddLFxuICAgIHJhbmdlTW9udGhQbGFjZWhvbGRlcjogWydTdGFydCBtb250aCcsICdFbmQgbW9udGgnXSxcbiAgICByYW5nZVdlZWtQbGFjZWhvbGRlcjogWydTdGFydCB3ZWVrJywgJ0VuZCB3ZWVrJ11cbiAgfSwgQ2FsZW5kYXJMb2NhbGUpLFxuICB0aW1lUGlja2VyTG9jYWxlOiBfZXh0ZW5kcyh7fSwgVGltZVBpY2tlckxvY2FsZSlcbn07XG4vLyBBbGwgc2V0dGluZ3MgYXQ6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2Jsb2IvbWFzdGVyL2NvbXBvbmVudHMvZGF0ZS1waWNrZXIvbG9jYWxlL2V4YW1wbGUuanNvblxuZXhwb3J0IGRlZmF1bHQgbG9jYWxlOyIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZyAqL1xuaW1wb3J0IFBhZ2luYXRpb24gZnJvbSBcInJjLXBhZ2luYXRpb24vZXMvbG9jYWxlL2VuX1VTXCI7XG5pbXBvcnQgQ2FsZW5kYXIgZnJvbSAnLi4vY2FsZW5kYXIvbG9jYWxlL2VuX1VTJztcbmltcG9ydCBEYXRlUGlja2VyIGZyb20gJy4uL2RhdGUtcGlja2VyL2xvY2FsZS9lbl9VUyc7XG5pbXBvcnQgVGltZVBpY2tlciBmcm9tICcuLi90aW1lLXBpY2tlci9sb2NhbGUvZW5fVVMnO1xudmFyIHR5cGVUZW1wbGF0ZSA9ICcke2xhYmVsfSBpcyBub3QgYSB2YWxpZCAke3R5cGV9JztcbnZhciBsb2NhbGVWYWx1ZXMgPSB7XG4gIGxvY2FsZTogJ2VuJyxcbiAgUGFnaW5hdGlvbjogUGFnaW5hdGlvbixcbiAgRGF0ZVBpY2tlcjogRGF0ZVBpY2tlcixcbiAgVGltZVBpY2tlcjogVGltZVBpY2tlcixcbiAgQ2FsZW5kYXI6IENhbGVuZGFyLFxuICBnbG9iYWw6IHtcbiAgICBwbGFjZWhvbGRlcjogJ1BsZWFzZSBzZWxlY3QnXG4gIH0sXG4gIFRhYmxlOiB7XG4gICAgZmlsdGVyVGl0bGU6ICdGaWx0ZXIgbWVudScsXG4gICAgZmlsdGVyQ29uZmlybTogJ09LJyxcbiAgICBmaWx0ZXJSZXNldDogJ1Jlc2V0JyxcbiAgICBmaWx0ZXJFbXB0eVRleHQ6ICdObyBmaWx0ZXJzJyxcbiAgICBmaWx0ZXJDaGVja2FsbDogJ1NlbGVjdCBhbGwgaXRlbXMnLFxuICAgIGZpbHRlclNlYXJjaFBsYWNlaG9sZGVyOiAnU2VhcmNoIGluIGZpbHRlcnMnLFxuICAgIGVtcHR5VGV4dDogJ05vIGRhdGEnLFxuICAgIHNlbGVjdEFsbDogJ1NlbGVjdCBjdXJyZW50IHBhZ2UnLFxuICAgIHNlbGVjdEludmVydDogJ0ludmVydCBjdXJyZW50IHBhZ2UnLFxuICAgIHNlbGVjdE5vbmU6ICdDbGVhciBhbGwgZGF0YScsXG4gICAgc2VsZWN0aW9uQWxsOiAnU2VsZWN0IGFsbCBkYXRhJyxcbiAgICBzb3J0VGl0bGU6ICdTb3J0JyxcbiAgICBleHBhbmQ6ICdFeHBhbmQgcm93JyxcbiAgICBjb2xsYXBzZTogJ0NvbGxhcHNlIHJvdycsXG4gICAgdHJpZ2dlckRlc2M6ICdDbGljayB0byBzb3J0IGRlc2NlbmRpbmcnLFxuICAgIHRyaWdnZXJBc2M6ICdDbGljayB0byBzb3J0IGFzY2VuZGluZycsXG4gICAgY2FuY2VsU29ydDogJ0NsaWNrIHRvIGNhbmNlbCBzb3J0aW5nJ1xuICB9LFxuICBNb2RhbDoge1xuICAgIG9rVGV4dDogJ09LJyxcbiAgICBjYW5jZWxUZXh0OiAnQ2FuY2VsJyxcbiAgICBqdXN0T2tUZXh0OiAnT0snXG4gIH0sXG4gIFBvcGNvbmZpcm06IHtcbiAgICBva1RleHQ6ICdPSycsXG4gICAgY2FuY2VsVGV4dDogJ0NhbmNlbCdcbiAgfSxcbiAgVHJhbnNmZXI6IHtcbiAgICB0aXRsZXM6IFsnJywgJyddLFxuICAgIHNlYXJjaFBsYWNlaG9sZGVyOiAnU2VhcmNoIGhlcmUnLFxuICAgIGl0ZW1Vbml0OiAnaXRlbScsXG4gICAgaXRlbXNVbml0OiAnaXRlbXMnLFxuICAgIHJlbW92ZTogJ1JlbW92ZScsXG4gICAgc2VsZWN0Q3VycmVudDogJ1NlbGVjdCBjdXJyZW50IHBhZ2UnLFxuICAgIHJlbW92ZUN1cnJlbnQ6ICdSZW1vdmUgY3VycmVudCBwYWdlJyxcbiAgICBzZWxlY3RBbGw6ICdTZWxlY3QgYWxsIGRhdGEnLFxuICAgIHJlbW92ZUFsbDogJ1JlbW92ZSBhbGwgZGF0YScsXG4gICAgc2VsZWN0SW52ZXJ0OiAnSW52ZXJ0IGN1cnJlbnQgcGFnZSdcbiAgfSxcbiAgVXBsb2FkOiB7XG4gICAgdXBsb2FkaW5nOiAnVXBsb2FkaW5nLi4uJyxcbiAgICByZW1vdmVGaWxlOiAnUmVtb3ZlIGZpbGUnLFxuICAgIHVwbG9hZEVycm9yOiAnVXBsb2FkIGVycm9yJyxcbiAgICBwcmV2aWV3RmlsZTogJ1ByZXZpZXcgZmlsZScsXG4gICAgZG93bmxvYWRGaWxlOiAnRG93bmxvYWQgZmlsZSdcbiAgfSxcbiAgRW1wdHk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ05vIGRhdGEnXG4gIH0sXG4gIEljb246IHtcbiAgICBpY29uOiAnaWNvbidcbiAgfSxcbiAgVGV4dDoge1xuICAgIGVkaXQ6ICdFZGl0JyxcbiAgICBjb3B5OiAnQ29weScsXG4gICAgY29waWVkOiAnQ29waWVkJyxcbiAgICBleHBhbmQ6ICdFeHBhbmQnXG4gIH0sXG4gIFBhZ2VIZWFkZXI6IHtcbiAgICBiYWNrOiAnQmFjaydcbiAgfSxcbiAgRm9ybToge1xuICAgIG9wdGlvbmFsOiAnKG9wdGlvbmFsKScsXG4gICAgZGVmYXVsdFZhbGlkYXRlTWVzc2FnZXM6IHtcbiAgICAgIFwiZGVmYXVsdFwiOiAnRmllbGQgdmFsaWRhdGlvbiBlcnJvciBmb3IgJHtsYWJlbH0nLFxuICAgICAgcmVxdWlyZWQ6ICdQbGVhc2UgZW50ZXIgJHtsYWJlbH0nLFxuICAgICAgXCJlbnVtXCI6ICcke2xhYmVsfSBtdXN0IGJlIG9uZSBvZiBbJHtlbnVtfV0nLFxuICAgICAgd2hpdGVzcGFjZTogJyR7bGFiZWx9IGNhbm5vdCBiZSBhIGJsYW5rIGNoYXJhY3RlcicsXG4gICAgICBkYXRlOiB7XG4gICAgICAgIGZvcm1hdDogJyR7bGFiZWx9IGRhdGUgZm9ybWF0IGlzIGludmFsaWQnLFxuICAgICAgICBwYXJzZTogJyR7bGFiZWx9IGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gYSBkYXRlJyxcbiAgICAgICAgaW52YWxpZDogJyR7bGFiZWx9IGlzIGFuIGludmFsaWQgZGF0ZSdcbiAgICAgIH0sXG4gICAgICB0eXBlczoge1xuICAgICAgICBzdHJpbmc6IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgbWV0aG9kOiB0eXBlVGVtcGxhdGUsXG4gICAgICAgIGFycmF5OiB0eXBlVGVtcGxhdGUsXG4gICAgICAgIG9iamVjdDogdHlwZVRlbXBsYXRlLFxuICAgICAgICBudW1iZXI6IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgZGF0ZTogdHlwZVRlbXBsYXRlLFxuICAgICAgICBcImJvb2xlYW5cIjogdHlwZVRlbXBsYXRlLFxuICAgICAgICBpbnRlZ2VyOiB0eXBlVGVtcGxhdGUsXG4gICAgICAgIFwiZmxvYXRcIjogdHlwZVRlbXBsYXRlLFxuICAgICAgICByZWdleHA6IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgZW1haWw6IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgdXJsOiB0eXBlVGVtcGxhdGUsXG4gICAgICAgIGhleDogdHlwZVRlbXBsYXRlXG4gICAgICB9LFxuICAgICAgc3RyaW5nOiB7XG4gICAgICAgIGxlbjogJyR7bGFiZWx9IG11c3QgYmUgJHtsZW59IGNoYXJhY3RlcnMnLFxuICAgICAgICBtaW46ICcke2xhYmVsfSBtdXN0IGJlIGF0IGxlYXN0ICR7bWlufSBjaGFyYWN0ZXJzJyxcbiAgICAgICAgbWF4OiAnJHtsYWJlbH0gbXVzdCBiZSB1cCB0byAke21heH0gY2hhcmFjdGVycycsXG4gICAgICAgIHJhbmdlOiAnJHtsYWJlbH0gbXVzdCBiZSBiZXR3ZWVuICR7bWlufS0ke21heH0gY2hhcmFjdGVycydcbiAgICAgIH0sXG4gICAgICBudW1iZXI6IHtcbiAgICAgICAgbGVuOiAnJHtsYWJlbH0gbXVzdCBiZSBlcXVhbCB0byAke2xlbn0nLFxuICAgICAgICBtaW46ICcke2xhYmVsfSBtdXN0IGJlIG1pbmltdW0gJHttaW59JyxcbiAgICAgICAgbWF4OiAnJHtsYWJlbH0gbXVzdCBiZSBtYXhpbXVtICR7bWF4fScsXG4gICAgICAgIHJhbmdlOiAnJHtsYWJlbH0gbXVzdCBiZSBiZXR3ZWVuICR7bWlufS0ke21heH0nXG4gICAgICB9LFxuICAgICAgYXJyYXk6IHtcbiAgICAgICAgbGVuOiAnTXVzdCBiZSAke2xlbn0gJHtsYWJlbH0nLFxuICAgICAgICBtaW46ICdBdCBsZWFzdCAke21pbn0gJHtsYWJlbH0nLFxuICAgICAgICBtYXg6ICdBdCBtb3N0ICR7bWF4fSAke2xhYmVsfScsXG4gICAgICAgIHJhbmdlOiAnVGhlIGFtb3VudCBvZiAke2xhYmVsfSBtdXN0IGJlIGJldHdlZW4gJHttaW59LSR7bWF4fSdcbiAgICAgIH0sXG4gICAgICBwYXR0ZXJuOiB7XG4gICAgICAgIG1pc21hdGNoOiAnJHtsYWJlbH0gZG9lcyBub3QgbWF0Y2ggdGhlIHBhdHRlcm4gJHtwYXR0ZXJufSdcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIEltYWdlOiB7XG4gICAgcHJldmlldzogJ1ByZXZpZXcnXG4gIH1cbn07XG5leHBvcnQgZGVmYXVsdCBsb2NhbGVWYWx1ZXM7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgZGVmYXVsdExvY2FsZSBmcm9tICcuLi9sb2NhbGUvZGVmYXVsdCc7XG52YXIgcnVudGltZUxvY2FsZSA9IF9leHRlbmRzKHt9LCBkZWZhdWx0TG9jYWxlLk1vZGFsKTtcbmV4cG9ydCBmdW5jdGlvbiBjaGFuZ2VDb25maXJtTG9jYWxlKG5ld0xvY2FsZSkge1xuICBpZiAobmV3TG9jYWxlKSB7XG4gICAgcnVudGltZUxvY2FsZSA9IF9leHRlbmRzKF9leHRlbmRzKHt9LCBydW50aW1lTG9jYWxlKSwgbmV3TG9jYWxlKTtcbiAgfSBlbHNlIHtcbiAgICBydW50aW1lTG9jYWxlID0gX2V4dGVuZHMoe30sIGRlZmF1bHRMb2NhbGUuTW9kYWwpO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlybUxvY2FsZSgpIHtcbiAgcmV0dXJuIHJ1bnRpbWVMb2NhbGU7XG59IiwiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbnZhciBMb2NhbGVDb250ZXh0ID0gLyojX19QVVJFX18qL2NyZWF0ZUNvbnRleHQodW5kZWZpbmVkKTtcbmV4cG9ydCBkZWZhdWx0IExvY2FsZUNvbnRleHQ7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgd2FybmluZyBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmltcG9ydCB7IGNoYW5nZUNvbmZpcm1Mb2NhbGUgfSBmcm9tICcuLi9tb2RhbC9sb2NhbGUnO1xuaW1wb3J0IExvY2FsZUNvbnRleHQgZnJvbSAnLi9jb250ZXh0JztcbmV4cG9ydCB2YXIgQU5UX01BUksgPSAnaW50ZXJuYWxNYXJrJztcbnZhciBMb2NhbGVQcm92aWRlciA9IGZ1bmN0aW9uIExvY2FsZVByb3ZpZGVyKHByb3BzKSB7XG4gIHZhciBfcHJvcHMkbG9jYWxlID0gcHJvcHMubG9jYWxlLFxuICAgIGxvY2FsZSA9IF9wcm9wcyRsb2NhbGUgPT09IHZvaWQgMCA/IHt9IDogX3Byb3BzJGxvY2FsZSxcbiAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIF9BTlRfTUFSS19fID0gcHJvcHMuX0FOVF9NQVJLX187XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhfQU5UX01BUktfXyA9PT0gQU5UX01BUkssICdMb2NhbGVQcm92aWRlcicsICdgTG9jYWxlUHJvdmlkZXJgIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgYGxvY2FsZWAgd2l0aCBgQ29uZmlnUHJvdmlkZXJgIGluc3RlYWQ6IGh0dHA6Ly91LmFudC5kZXNpZ24vbG9jYWxlJykgOiB2b2lkIDA7XG4gIH1cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBjaGFuZ2VDb25maXJtTG9jYWxlKGxvY2FsZSAmJiBsb2NhbGUuTW9kYWwpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBjaGFuZ2VDb25maXJtTG9jYWxlKCk7XG4gICAgfTtcbiAgfSwgW2xvY2FsZV0pO1xuICB2YXIgZ2V0TWVtb2l6ZWRDb250ZXh0VmFsdWUgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX2V4dGVuZHMoX2V4dGVuZHMoe30sIGxvY2FsZSksIHtcbiAgICAgIGV4aXN0OiB0cnVlXG4gICAgfSk7XG4gIH0sIFtsb2NhbGVdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExvY2FsZUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogZ2V0TWVtb2l6ZWRDb250ZXh0VmFsdWVcbiAgfSwgY2hpbGRyZW4pO1xufTtcbmV4cG9ydCBkZWZhdWx0IExvY2FsZVByb3ZpZGVyOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IExvY2FsZUNvbnRleHQgZnJvbSAnLi9jb250ZXh0JztcbmltcG9ydCBkZWZhdWx0TG9jYWxlRGF0YSBmcm9tICcuL2RlZmF1bHQnO1xudmFyIExvY2FsZVJlY2VpdmVyID0gZnVuY3Rpb24gTG9jYWxlUmVjZWl2ZXIocHJvcHMpIHtcbiAgdmFyIF9wcm9wcyRjb21wb25lbnROYW1lID0gcHJvcHMuY29tcG9uZW50TmFtZSxcbiAgICBjb21wb25lbnROYW1lID0gX3Byb3BzJGNvbXBvbmVudE5hbWUgPT09IHZvaWQgMCA/ICdnbG9iYWwnIDogX3Byb3BzJGNvbXBvbmVudE5hbWUsXG4gICAgZGVmYXVsdExvY2FsZSA9IHByb3BzLmRlZmF1bHRMb2NhbGUsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbjtcbiAgdmFyIGFudExvY2FsZSA9IFJlYWN0LnVzZUNvbnRleHQoTG9jYWxlQ29udGV4dCk7XG4gIHZhciBnZXRMb2NhbGUgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIGxvY2FsZSA9IGRlZmF1bHRMb2NhbGUgfHwgZGVmYXVsdExvY2FsZURhdGFbY29tcG9uZW50TmFtZV07XG4gICAgdmFyIGxvY2FsZUZyb21Db250ZXh0ID0gKF9hID0gYW50TG9jYWxlID09PSBudWxsIHx8IGFudExvY2FsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogYW50TG9jYWxlW2NvbXBvbmVudE5hbWVdKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB7fTtcbiAgICByZXR1cm4gX2V4dGVuZHMoX2V4dGVuZHMoe30sIGxvY2FsZSBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gbG9jYWxlKCkgOiBsb2NhbGUpLCBsb2NhbGVGcm9tQ29udGV4dCB8fCB7fSk7XG4gIH0sIFtjb21wb25lbnROYW1lLCBkZWZhdWx0TG9jYWxlLCBhbnRMb2NhbGVdKTtcbiAgdmFyIGdldExvY2FsZUNvZGUgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbG9jYWxlQ29kZSA9IGFudExvY2FsZSAmJiBhbnRMb2NhbGUubG9jYWxlO1xuICAgIC8vIEhhZCB1c2UgTG9jYWxlUHJvdmlkZSBidXQgZGlkbid0IHNldCBsb2NhbGVcbiAgICBpZiAoYW50TG9jYWxlICYmIGFudExvY2FsZS5leGlzdCAmJiAhbG9jYWxlQ29kZSkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRMb2NhbGVEYXRhLmxvY2FsZTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsZUNvZGU7XG4gIH0sIFthbnRMb2NhbGVdKTtcbiAgcmV0dXJuIGNoaWxkcmVuKGdldExvY2FsZSwgZ2V0TG9jYWxlQ29kZSwgYW50TG9jYWxlKTtcbn07XG5leHBvcnQgZGVmYXVsdCBMb2NhbGVSZWNlaXZlcjtcbmV4cG9ydCB2YXIgdXNlTG9jYWxlUmVjZWl2ZXIgPSBmdW5jdGlvbiB1c2VMb2NhbGVSZWNlaXZlcihjb21wb25lbnROYW1lLCBkZWZhdWx0TG9jYWxlKSB7XG4gIHZhciBhbnRMb2NhbGUgPSBSZWFjdC51c2VDb250ZXh0KExvY2FsZUNvbnRleHQpO1xuICB2YXIgZ2V0TG9jYWxlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9hO1xuICAgIHZhciBsb2NhbGUgPSBkZWZhdWx0TG9jYWxlIHx8IGRlZmF1bHRMb2NhbGVEYXRhW2NvbXBvbmVudE5hbWVdO1xuICAgIHZhciBsb2NhbGVGcm9tQ29udGV4dCA9IChfYSA9IGFudExvY2FsZSA9PT0gbnVsbCB8fCBhbnRMb2NhbGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFudExvY2FsZVtjb21wb25lbnROYW1lXSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDoge307XG4gICAgcmV0dXJuIF9leHRlbmRzKF9leHRlbmRzKHt9LCB0eXBlb2YgbG9jYWxlID09PSAnZnVuY3Rpb24nID8gbG9jYWxlKCkgOiBsb2NhbGUpLCBsb2NhbGVGcm9tQ29udGV4dCB8fCB7fSk7XG4gIH0sIFtjb21wb25lbnROYW1lLCBkZWZhdWx0TG9jYWxlLCBhbnRMb2NhbGVdKTtcbiAgcmV0dXJuIFtnZXRMb2NhbGVdO1xufTsiLCIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBDaGVja0NpcmNsZUZpbGxlZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNTEyIDY0QzI2NC42IDY0IDY0IDI2NC42IDY0IDUxMnMyMDAuNiA0NDggNDQ4IDQ0OCA0NDgtMjAwLjYgNDQ4LTQ0OFM3NTkuNCA2NCA1MTIgNjR6bTE5My41IDMwMS43bC0yMTAuNiAyOTJhMzEuOCAzMS44IDAgMDEtNTEuNyAwTDMxOC41IDQ4NC45Yy0zLjgtNS4zIDAtMTIuNyA2LjUtMTIuN2g0Ni45YzEwLjIgMCAxOS45IDQuOSAyNS45IDEzLjNsNzEuMiA5OC44IDE1Ny4yLTIxOGM2LTguMyAxNS42LTEzLjMgMjUuOS0xMy4zSDY5OWM2LjUgMCAxMC4zIDcuNCA2LjUgMTIuN3pcIiB9IH1dIH0sIFwibmFtZVwiOiBcImNoZWNrLWNpcmNsZVwiLCBcInRoZW1lXCI6IFwiZmlsbGVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IENoZWNrQ2lyY2xlRmlsbGVkO1xuIiwiLyoqXG4gKiBUYWtlIGlucHV0IGZyb20gWzAsIG5dIGFuZCByZXR1cm4gaXQgYXMgWzAsIDFdXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBib3VuZDAxKG4sIG1heCkge1xuICAgIGlmIChpc09uZVBvaW50WmVybyhuKSkge1xuICAgICAgICBuID0gJzEwMCUnO1xuICAgIH1cbiAgICB2YXIgaXNQZXJjZW50ID0gaXNQZXJjZW50YWdlKG4pO1xuICAgIG4gPSBtYXggPT09IDM2MCA/IG4gOiBNYXRoLm1pbihtYXgsIE1hdGgubWF4KDAsIHBhcnNlRmxvYXQobikpKTtcbiAgICAvLyBBdXRvbWF0aWNhbGx5IGNvbnZlcnQgcGVyY2VudGFnZSBpbnRvIG51bWJlclxuICAgIGlmIChpc1BlcmNlbnQpIHtcbiAgICAgICAgbiA9IHBhcnNlSW50KFN0cmluZyhuICogbWF4KSwgMTApIC8gMTAwO1xuICAgIH1cbiAgICAvLyBIYW5kbGUgZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgZXJyb3JzXG4gICAgaWYgKE1hdGguYWJzKG4gLSBtYXgpIDwgMC4wMDAwMDEpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIC8vIENvbnZlcnQgaW50byBbMCwgMV0gcmFuZ2UgaWYgaXQgaXNuJ3QgYWxyZWFkeVxuICAgIGlmIChtYXggPT09IDM2MCkge1xuICAgICAgICAvLyBJZiBuIGlzIGEgaHVlIGdpdmVuIGluIGRlZ3JlZXMsXG4gICAgICAgIC8vIHdyYXAgYXJvdW5kIG91dC1vZi1yYW5nZSB2YWx1ZXMgaW50byBbMCwgMzYwXSByYW5nZVxuICAgICAgICAvLyB0aGVuIGNvbnZlcnQgaW50byBbMCwgMV0uXG4gICAgICAgIG4gPSAobiA8IDAgPyAobiAlIG1heCkgKyBtYXggOiBuICUgbWF4KSAvIHBhcnNlRmxvYXQoU3RyaW5nKG1heCkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gSWYgbiBub3QgYSBodWUgZ2l2ZW4gaW4gZGVncmVlc1xuICAgICAgICAvLyBDb252ZXJ0IGludG8gWzAsIDFdIHJhbmdlIGlmIGl0IGlzbid0IGFscmVhZHkuXG4gICAgICAgIG4gPSAobiAlIG1heCkgLyBwYXJzZUZsb2F0KFN0cmluZyhtYXgpKTtcbiAgICB9XG4gICAgcmV0dXJuIG47XG59XG4vKipcbiAqIEZvcmNlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMVxuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhbXAwMSh2YWwpIHtcbiAgICByZXR1cm4gTWF0aC5taW4oMSwgTWF0aC5tYXgoMCwgdmFsKSk7XG59XG4vKipcbiAqIE5lZWQgdG8gaGFuZGxlIDEuMCBhcyAxMDAlLCBzaW5jZSBvbmNlIGl0IGlzIGEgbnVtYmVyLCB0aGVyZSBpcyBubyBkaWZmZXJlbmNlIGJldHdlZW4gaXQgYW5kIDFcbiAqIDxodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzc0MjIwNzIvamF2YXNjcmlwdC1ob3ctdG8tZGV0ZWN0LW51bWJlci1hcy1hLWRlY2ltYWwtaW5jbHVkaW5nLTEtMD5cbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT25lUG9pbnRaZXJvKG4pIHtcbiAgICByZXR1cm4gdHlwZW9mIG4gPT09ICdzdHJpbmcnICYmIG4uaW5kZXhPZignLicpICE9PSAtMSAmJiBwYXJzZUZsb2F0KG4pID09PSAxO1xufVxuLyoqXG4gKiBDaGVjayB0byBzZWUgaWYgc3RyaW5nIHBhc3NlZCBpbiBpcyBhIHBlcmNlbnRhZ2VcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGVyY2VudGFnZShuKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBuID09PSAnc3RyaW5nJyAmJiBuLmluZGV4T2YoJyUnKSAhPT0gLTE7XG59XG4vKipcbiAqIFJldHVybiBhIHZhbGlkIGFscGhhIHZhbHVlIFswLDFdIHdpdGggYWxsIGludmFsaWQgdmFsdWVzIGJlaW5nIHNldCB0byAxXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBib3VuZEFscGhhKGEpIHtcbiAgICBhID0gcGFyc2VGbG9hdChhKTtcbiAgICBpZiAoaXNOYU4oYSkgfHwgYSA8IDAgfHwgYSA+IDEpIHtcbiAgICAgICAgYSA9IDE7XG4gICAgfVxuICAgIHJldHVybiBhO1xufVxuLyoqXG4gKiBSZXBsYWNlIGEgZGVjaW1hbCB3aXRoIGl0J3MgcGVyY2VudGFnZSB2YWx1ZVxuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFRvUGVyY2VudGFnZShuKSB7XG4gICAgaWYgKG4gPD0gMSkge1xuICAgICAgICByZXR1cm4gXCJcIi5jb25jYXQoTnVtYmVyKG4pICogMTAwLCBcIiVcIik7XG4gICAgfVxuICAgIHJldHVybiBuO1xufVxuLyoqXG4gKiBGb3JjZSBhIGhleCB2YWx1ZSB0byBoYXZlIDIgY2hhcmFjdGVyc1xuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFkMihjKSB7XG4gICAgcmV0dXJuIGMubGVuZ3RoID09PSAxID8gJzAnICsgYyA6IFN0cmluZyhjKTtcbn1cbiIsImltcG9ydCB7IGJvdW5kMDEsIHBhZDIgfSBmcm9tICcuL3V0aWwnO1xuLy8gYHJnYlRvSHNsYCwgYHJnYlRvSHN2YCwgYGhzbFRvUmdiYCwgYGhzdlRvUmdiYCBtb2RpZmllZCBmcm9tOlxuLy8gPGh0dHA6Ly9tamlqYWNrc29uLmNvbS8yMDA4LzAyL3JnYi10by1oc2wtYW5kLXJnYi10by1oc3YtY29sb3ItbW9kZWwtY29udmVyc2lvbi1hbGdvcml0aG1zLWluLWphdmFzY3JpcHQ+XG4vKipcbiAqIEhhbmRsZSBib3VuZHMgLyBwZXJjZW50YWdlIGNoZWNraW5nIHRvIGNvbmZvcm0gdG8gQ1NTIGNvbG9yIHNwZWNcbiAqIDxodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbG9yLz5cbiAqICpBc3N1bWVzOiogciwgZywgYiBpbiBbMCwgMjU1XSBvciBbMCwgMV1cbiAqICpSZXR1cm5zOiogeyByLCBnLCBiIH0gaW4gWzAsIDI1NV1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJnYlRvUmdiKHIsIGcsIGIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICByOiBib3VuZDAxKHIsIDI1NSkgKiAyNTUsXG4gICAgICAgIGc6IGJvdW5kMDEoZywgMjU1KSAqIDI1NSxcbiAgICAgICAgYjogYm91bmQwMShiLCAyNTUpICogMjU1LFxuICAgIH07XG59XG4vKipcbiAqIENvbnZlcnRzIGFuIFJHQiBjb2xvciB2YWx1ZSB0byBIU0wuXG4gKiAqQXNzdW1lczoqIHIsIGcsIGFuZCBiIGFyZSBjb250YWluZWQgaW4gWzAsIDI1NV0gb3IgWzAsIDFdXG4gKiAqUmV0dXJuczoqIHsgaCwgcywgbCB9IGluIFswLDFdXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZ2JUb0hzbChyLCBnLCBiKSB7XG4gICAgciA9IGJvdW5kMDEociwgMjU1KTtcbiAgICBnID0gYm91bmQwMShnLCAyNTUpO1xuICAgIGIgPSBib3VuZDAxKGIsIDI1NSk7XG4gICAgdmFyIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpO1xuICAgIHZhciBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKTtcbiAgICB2YXIgaCA9IDA7XG4gICAgdmFyIHMgPSAwO1xuICAgIHZhciBsID0gKG1heCArIG1pbikgLyAyO1xuICAgIGlmIChtYXggPT09IG1pbikge1xuICAgICAgICBzID0gMDtcbiAgICAgICAgaCA9IDA7IC8vIGFjaHJvbWF0aWNcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZhciBkID0gbWF4IC0gbWluO1xuICAgICAgICBzID0gbCA+IDAuNSA/IGQgLyAoMiAtIG1heCAtIG1pbikgOiBkIC8gKG1heCArIG1pbik7XG4gICAgICAgIHN3aXRjaCAobWF4KSB7XG4gICAgICAgICAgICBjYXNlIHI6XG4gICAgICAgICAgICAgICAgaCA9IChnIC0gYikgLyBkICsgKGcgPCBiID8gNiA6IDApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBnOlxuICAgICAgICAgICAgICAgIGggPSAoYiAtIHIpIC8gZCArIDI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIGI6XG4gICAgICAgICAgICAgICAgaCA9IChyIC0gZykgLyBkICsgNDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaCAvPSA2O1xuICAgIH1cbiAgICByZXR1cm4geyBoOiBoLCBzOiBzLCBsOiBsIH07XG59XG5mdW5jdGlvbiBodWUycmdiKHAsIHEsIHQpIHtcbiAgICBpZiAodCA8IDApIHtcbiAgICAgICAgdCArPSAxO1xuICAgIH1cbiAgICBpZiAodCA+IDEpIHtcbiAgICAgICAgdCAtPSAxO1xuICAgIH1cbiAgICBpZiAodCA8IDEgLyA2KSB7XG4gICAgICAgIHJldHVybiBwICsgKHEgLSBwKSAqICg2ICogdCk7XG4gICAgfVxuICAgIGlmICh0IDwgMSAvIDIpIHtcbiAgICAgICAgcmV0dXJuIHE7XG4gICAgfVxuICAgIGlmICh0IDwgMiAvIDMpIHtcbiAgICAgICAgcmV0dXJuIHAgKyAocSAtIHApICogKDIgLyAzIC0gdCkgKiA2O1xuICAgIH1cbiAgICByZXR1cm4gcDtcbn1cbi8qKlxuICogQ29udmVydHMgYW4gSFNMIGNvbG9yIHZhbHVlIHRvIFJHQi5cbiAqXG4gKiAqQXNzdW1lczoqIGggaXMgY29udGFpbmVkIGluIFswLCAxXSBvciBbMCwgMzYwXSBhbmQgcyBhbmQgbCBhcmUgY29udGFpbmVkIFswLCAxXSBvciBbMCwgMTAwXVxuICogKlJldHVybnM6KiB7IHIsIGcsIGIgfSBpbiB0aGUgc2V0IFswLCAyNTVdXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoc2xUb1JnYihoLCBzLCBsKSB7XG4gICAgdmFyIHI7XG4gICAgdmFyIGc7XG4gICAgdmFyIGI7XG4gICAgaCA9IGJvdW5kMDEoaCwgMzYwKTtcbiAgICBzID0gYm91bmQwMShzLCAxMDApO1xuICAgIGwgPSBib3VuZDAxKGwsIDEwMCk7XG4gICAgaWYgKHMgPT09IDApIHtcbiAgICAgICAgLy8gYWNocm9tYXRpY1xuICAgICAgICBnID0gbDtcbiAgICAgICAgYiA9IGw7XG4gICAgICAgIHIgPSBsO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIHEgPSBsIDwgMC41ID8gbCAqICgxICsgcykgOiBsICsgcyAtIGwgKiBzO1xuICAgICAgICB2YXIgcCA9IDIgKiBsIC0gcTtcbiAgICAgICAgciA9IGh1ZTJyZ2IocCwgcSwgaCArIDEgLyAzKTtcbiAgICAgICAgZyA9IGh1ZTJyZ2IocCwgcSwgaCk7XG4gICAgICAgIGIgPSBodWUycmdiKHAsIHEsIGggLSAxIC8gMyk7XG4gICAgfVxuICAgIHJldHVybiB7IHI6IHIgKiAyNTUsIGc6IGcgKiAyNTUsIGI6IGIgKiAyNTUgfTtcbn1cbi8qKlxuICogQ29udmVydHMgYW4gUkdCIGNvbG9yIHZhbHVlIHRvIEhTVlxuICpcbiAqICpBc3N1bWVzOiogciwgZywgYW5kIGIgYXJlIGNvbnRhaW5lZCBpbiB0aGUgc2V0IFswLCAyNTVdIG9yIFswLCAxXVxuICogKlJldHVybnM6KiB7IGgsIHMsIHYgfSBpbiBbMCwxXVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmdiVG9Ic3YociwgZywgYikge1xuICAgIHIgPSBib3VuZDAxKHIsIDI1NSk7XG4gICAgZyA9IGJvdW5kMDEoZywgMjU1KTtcbiAgICBiID0gYm91bmQwMShiLCAyNTUpO1xuICAgIHZhciBtYXggPSBNYXRoLm1heChyLCBnLCBiKTtcbiAgICB2YXIgbWluID0gTWF0aC5taW4ociwgZywgYik7XG4gICAgdmFyIGggPSAwO1xuICAgIHZhciB2ID0gbWF4O1xuICAgIHZhciBkID0gbWF4IC0gbWluO1xuICAgIHZhciBzID0gbWF4ID09PSAwID8gMCA6IGQgLyBtYXg7XG4gICAgaWYgKG1heCA9PT0gbWluKSB7XG4gICAgICAgIGggPSAwOyAvLyBhY2hyb21hdGljXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzd2l0Y2ggKG1heCkge1xuICAgICAgICAgICAgY2FzZSByOlxuICAgICAgICAgICAgICAgIGggPSAoZyAtIGIpIC8gZCArIChnIDwgYiA/IDYgOiAwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgZzpcbiAgICAgICAgICAgICAgICBoID0gKGIgLSByKSAvIGQgKyAyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBiOlxuICAgICAgICAgICAgICAgIGggPSAociAtIGcpIC8gZCArIDQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGggLz0gNjtcbiAgICB9XG4gICAgcmV0dXJuIHsgaDogaCwgczogcywgdjogdiB9O1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhbiBIU1YgY29sb3IgdmFsdWUgdG8gUkdCLlxuICpcbiAqICpBc3N1bWVzOiogaCBpcyBjb250YWluZWQgaW4gWzAsIDFdIG9yIFswLCAzNjBdIGFuZCBzIGFuZCB2IGFyZSBjb250YWluZWQgaW4gWzAsIDFdIG9yIFswLCAxMDBdXG4gKiAqUmV0dXJuczoqIHsgciwgZywgYiB9IGluIHRoZSBzZXQgWzAsIDI1NV1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhzdlRvUmdiKGgsIHMsIHYpIHtcbiAgICBoID0gYm91bmQwMShoLCAzNjApICogNjtcbiAgICBzID0gYm91bmQwMShzLCAxMDApO1xuICAgIHYgPSBib3VuZDAxKHYsIDEwMCk7XG4gICAgdmFyIGkgPSBNYXRoLmZsb29yKGgpO1xuICAgIHZhciBmID0gaCAtIGk7XG4gICAgdmFyIHAgPSB2ICogKDEgLSBzKTtcbiAgICB2YXIgcSA9IHYgKiAoMSAtIGYgKiBzKTtcbiAgICB2YXIgdCA9IHYgKiAoMSAtICgxIC0gZikgKiBzKTtcbiAgICB2YXIgbW9kID0gaSAlIDY7XG4gICAgdmFyIHIgPSBbdiwgcSwgcCwgcCwgdCwgdl1bbW9kXTtcbiAgICB2YXIgZyA9IFt0LCB2LCB2LCBxLCBwLCBwXVttb2RdO1xuICAgIHZhciBiID0gW3AsIHAsIHQsIHYsIHYsIHFdW21vZF07XG4gICAgcmV0dXJuIHsgcjogciAqIDI1NSwgZzogZyAqIDI1NSwgYjogYiAqIDI1NSB9O1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhbiBSR0IgY29sb3IgdG8gaGV4XG4gKlxuICogQXNzdW1lcyByLCBnLCBhbmQgYiBhcmUgY29udGFpbmVkIGluIHRoZSBzZXQgWzAsIDI1NV1cbiAqIFJldHVybnMgYSAzIG9yIDYgY2hhcmFjdGVyIGhleFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmdiVG9IZXgociwgZywgYiwgYWxsb3czQ2hhcikge1xuICAgIHZhciBoZXggPSBbXG4gICAgICAgIHBhZDIoTWF0aC5yb3VuZChyKS50b1N0cmluZygxNikpLFxuICAgICAgICBwYWQyKE1hdGgucm91bmQoZykudG9TdHJpbmcoMTYpKSxcbiAgICAgICAgcGFkMihNYXRoLnJvdW5kKGIpLnRvU3RyaW5nKDE2KSksXG4gICAgXTtcbiAgICAvLyBSZXR1cm4gYSAzIGNoYXJhY3RlciBoZXggaWYgcG9zc2libGVcbiAgICBpZiAoYWxsb3czQ2hhciAmJlxuICAgICAgICBoZXhbMF0uc3RhcnRzV2l0aChoZXhbMF0uY2hhckF0KDEpKSAmJlxuICAgICAgICBoZXhbMV0uc3RhcnRzV2l0aChoZXhbMV0uY2hhckF0KDEpKSAmJlxuICAgICAgICBoZXhbMl0uc3RhcnRzV2l0aChoZXhbMl0uY2hhckF0KDEpKSkge1xuICAgICAgICByZXR1cm4gaGV4WzBdLmNoYXJBdCgwKSArIGhleFsxXS5jaGFyQXQoMCkgKyBoZXhbMl0uY2hhckF0KDApO1xuICAgIH1cbiAgICByZXR1cm4gaGV4LmpvaW4oJycpO1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhbiBSR0JBIGNvbG9yIHBsdXMgYWxwaGEgdHJhbnNwYXJlbmN5IHRvIGhleFxuICpcbiAqIEFzc3VtZXMgciwgZywgYiBhcmUgY29udGFpbmVkIGluIHRoZSBzZXQgWzAsIDI1NV0gYW5kXG4gKiBhIGluIFswLCAxXS4gUmV0dXJucyBhIDQgb3IgOCBjaGFyYWN0ZXIgcmdiYSBoZXhcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1wYXJhbXNcbmV4cG9ydCBmdW5jdGlvbiByZ2JhVG9IZXgociwgZywgYiwgYSwgYWxsb3c0Q2hhcikge1xuICAgIHZhciBoZXggPSBbXG4gICAgICAgIHBhZDIoTWF0aC5yb3VuZChyKS50b1N0cmluZygxNikpLFxuICAgICAgICBwYWQyKE1hdGgucm91bmQoZykudG9TdHJpbmcoMTYpKSxcbiAgICAgICAgcGFkMihNYXRoLnJvdW5kKGIpLnRvU3RyaW5nKDE2KSksXG4gICAgICAgIHBhZDIoY29udmVydERlY2ltYWxUb0hleChhKSksXG4gICAgXTtcbiAgICAvLyBSZXR1cm4gYSA0IGNoYXJhY3RlciBoZXggaWYgcG9zc2libGVcbiAgICBpZiAoYWxsb3c0Q2hhciAmJlxuICAgICAgICBoZXhbMF0uc3RhcnRzV2l0aChoZXhbMF0uY2hhckF0KDEpKSAmJlxuICAgICAgICBoZXhbMV0uc3RhcnRzV2l0aChoZXhbMV0uY2hhckF0KDEpKSAmJlxuICAgICAgICBoZXhbMl0uc3RhcnRzV2l0aChoZXhbMl0uY2hhckF0KDEpKSAmJlxuICAgICAgICBoZXhbM10uc3RhcnRzV2l0aChoZXhbM10uY2hhckF0KDEpKSkge1xuICAgICAgICByZXR1cm4gaGV4WzBdLmNoYXJBdCgwKSArIGhleFsxXS5jaGFyQXQoMCkgKyBoZXhbMl0uY2hhckF0KDApICsgaGV4WzNdLmNoYXJBdCgwKTtcbiAgICB9XG4gICAgcmV0dXJuIGhleC5qb2luKCcnKTtcbn1cbi8qKlxuICogQ29udmVydHMgYW4gUkdCQSBjb2xvciB0byBhbiBBUkdCIEhleDggc3RyaW5nXG4gKiBSYXJlbHkgdXNlZCwgYnV0IHJlcXVpcmVkIGZvciBcInRvRmlsdGVyKClcIlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmdiYVRvQXJnYkhleChyLCBnLCBiLCBhKSB7XG4gICAgdmFyIGhleCA9IFtcbiAgICAgICAgcGFkMihjb252ZXJ0RGVjaW1hbFRvSGV4KGEpKSxcbiAgICAgICAgcGFkMihNYXRoLnJvdW5kKHIpLnRvU3RyaW5nKDE2KSksXG4gICAgICAgIHBhZDIoTWF0aC5yb3VuZChnKS50b1N0cmluZygxNikpLFxuICAgICAgICBwYWQyKE1hdGgucm91bmQoYikudG9TdHJpbmcoMTYpKSxcbiAgICBdO1xuICAgIHJldHVybiBoZXguam9pbignJyk7XG59XG4vKiogQ29udmVydHMgYSBkZWNpbWFsIHRvIGEgaGV4IHZhbHVlICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydERlY2ltYWxUb0hleChkKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQocGFyc2VGbG9hdChkKSAqIDI1NSkudG9TdHJpbmcoMTYpO1xufVxuLyoqIENvbnZlcnRzIGEgaGV4IHZhbHVlIHRvIGEgZGVjaW1hbCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRIZXhUb0RlY2ltYWwoaCkge1xuICAgIHJldHVybiBwYXJzZUludEZyb21IZXgoaCkgLyAyNTU7XG59XG4vKiogUGFyc2UgYSBiYXNlLTE2IGhleCB2YWx1ZSBpbnRvIGEgYmFzZS0xMCBpbnRlZ2VyICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJbnRGcm9tSGV4KHZhbCkge1xuICAgIHJldHVybiBwYXJzZUludCh2YWwsIDE2KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJJbnB1dFRvT2JqZWN0KGNvbG9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcjogY29sb3IgPj4gMTYsXG4gICAgICAgIGc6IChjb2xvciAmIDB4ZmYwMCkgPj4gOCxcbiAgICAgICAgYjogY29sb3IgJiAweGZmLFxuICAgIH07XG59XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vYmFoYW1hczEwL2Nzcy1jb2xvci1uYW1lcy9ibG9iL21hc3Rlci9jc3MtY29sb3ItbmFtZXMuanNvblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCB2YXIgbmFtZXMgPSB7XG4gICAgYWxpY2VibHVlOiAnI2YwZjhmZicsXG4gICAgYW50aXF1ZXdoaXRlOiAnI2ZhZWJkNycsXG4gICAgYXF1YTogJyMwMGZmZmYnLFxuICAgIGFxdWFtYXJpbmU6ICcjN2ZmZmQ0JyxcbiAgICBhenVyZTogJyNmMGZmZmYnLFxuICAgIGJlaWdlOiAnI2Y1ZjVkYycsXG4gICAgYmlzcXVlOiAnI2ZmZTRjNCcsXG4gICAgYmxhY2s6ICcjMDAwMDAwJyxcbiAgICBibGFuY2hlZGFsbW9uZDogJyNmZmViY2QnLFxuICAgIGJsdWU6ICcjMDAwMGZmJyxcbiAgICBibHVldmlvbGV0OiAnIzhhMmJlMicsXG4gICAgYnJvd246ICcjYTUyYTJhJyxcbiAgICBidXJseXdvb2Q6ICcjZGViODg3JyxcbiAgICBjYWRldGJsdWU6ICcjNWY5ZWEwJyxcbiAgICBjaGFydHJldXNlOiAnIzdmZmYwMCcsXG4gICAgY2hvY29sYXRlOiAnI2QyNjkxZScsXG4gICAgY29yYWw6ICcjZmY3ZjUwJyxcbiAgICBjb3JuZmxvd2VyYmx1ZTogJyM2NDk1ZWQnLFxuICAgIGNvcm5zaWxrOiAnI2ZmZjhkYycsXG4gICAgY3JpbXNvbjogJyNkYzE0M2MnLFxuICAgIGN5YW46ICcjMDBmZmZmJyxcbiAgICBkYXJrYmx1ZTogJyMwMDAwOGInLFxuICAgIGRhcmtjeWFuOiAnIzAwOGI4YicsXG4gICAgZGFya2dvbGRlbnJvZDogJyNiODg2MGInLFxuICAgIGRhcmtncmF5OiAnI2E5YTlhOScsXG4gICAgZGFya2dyZWVuOiAnIzAwNjQwMCcsXG4gICAgZGFya2dyZXk6ICcjYTlhOWE5JyxcbiAgICBkYXJra2hha2k6ICcjYmRiNzZiJyxcbiAgICBkYXJrbWFnZW50YTogJyM4YjAwOGInLFxuICAgIGRhcmtvbGl2ZWdyZWVuOiAnIzU1NmIyZicsXG4gICAgZGFya29yYW5nZTogJyNmZjhjMDAnLFxuICAgIGRhcmtvcmNoaWQ6ICcjOTkzMmNjJyxcbiAgICBkYXJrcmVkOiAnIzhiMDAwMCcsXG4gICAgZGFya3NhbG1vbjogJyNlOTk2N2EnLFxuICAgIGRhcmtzZWFncmVlbjogJyM4ZmJjOGYnLFxuICAgIGRhcmtzbGF0ZWJsdWU6ICcjNDgzZDhiJyxcbiAgICBkYXJrc2xhdGVncmF5OiAnIzJmNGY0ZicsXG4gICAgZGFya3NsYXRlZ3JleTogJyMyZjRmNGYnLFxuICAgIGRhcmt0dXJxdW9pc2U6ICcjMDBjZWQxJyxcbiAgICBkYXJrdmlvbGV0OiAnIzk0MDBkMycsXG4gICAgZGVlcHBpbms6ICcjZmYxNDkzJyxcbiAgICBkZWVwc2t5Ymx1ZTogJyMwMGJmZmYnLFxuICAgIGRpbWdyYXk6ICcjNjk2OTY5JyxcbiAgICBkaW1ncmV5OiAnIzY5Njk2OScsXG4gICAgZG9kZ2VyYmx1ZTogJyMxZTkwZmYnLFxuICAgIGZpcmVicmljazogJyNiMjIyMjInLFxuICAgIGZsb3JhbHdoaXRlOiAnI2ZmZmFmMCcsXG4gICAgZm9yZXN0Z3JlZW46ICcjMjI4YjIyJyxcbiAgICBmdWNoc2lhOiAnI2ZmMDBmZicsXG4gICAgZ2FpbnNib3JvOiAnI2RjZGNkYycsXG4gICAgZ2hvc3R3aGl0ZTogJyNmOGY4ZmYnLFxuICAgIGdvbGRlbnJvZDogJyNkYWE1MjAnLFxuICAgIGdvbGQ6ICcjZmZkNzAwJyxcbiAgICBncmF5OiAnIzgwODA4MCcsXG4gICAgZ3JlZW46ICcjMDA4MDAwJyxcbiAgICBncmVlbnllbGxvdzogJyNhZGZmMmYnLFxuICAgIGdyZXk6ICcjODA4MDgwJyxcbiAgICBob25leWRldzogJyNmMGZmZjAnLFxuICAgIGhvdHBpbms6ICcjZmY2OWI0JyxcbiAgICBpbmRpYW5yZWQ6ICcjY2Q1YzVjJyxcbiAgICBpbmRpZ286ICcjNGIwMDgyJyxcbiAgICBpdm9yeTogJyNmZmZmZjAnLFxuICAgIGtoYWtpOiAnI2YwZTY4YycsXG4gICAgbGF2ZW5kZXJibHVzaDogJyNmZmYwZjUnLFxuICAgIGxhdmVuZGVyOiAnI2U2ZTZmYScsXG4gICAgbGF3bmdyZWVuOiAnIzdjZmMwMCcsXG4gICAgbGVtb25jaGlmZm9uOiAnI2ZmZmFjZCcsXG4gICAgbGlnaHRibHVlOiAnI2FkZDhlNicsXG4gICAgbGlnaHRjb3JhbDogJyNmMDgwODAnLFxuICAgIGxpZ2h0Y3lhbjogJyNlMGZmZmYnLFxuICAgIGxpZ2h0Z29sZGVucm9keWVsbG93OiAnI2ZhZmFkMicsXG4gICAgbGlnaHRncmF5OiAnI2QzZDNkMycsXG4gICAgbGlnaHRncmVlbjogJyM5MGVlOTAnLFxuICAgIGxpZ2h0Z3JleTogJyNkM2QzZDMnLFxuICAgIGxpZ2h0cGluazogJyNmZmI2YzEnLFxuICAgIGxpZ2h0c2FsbW9uOiAnI2ZmYTA3YScsXG4gICAgbGlnaHRzZWFncmVlbjogJyMyMGIyYWEnLFxuICAgIGxpZ2h0c2t5Ymx1ZTogJyM4N2NlZmEnLFxuICAgIGxpZ2h0c2xhdGVncmF5OiAnIzc3ODg5OScsXG4gICAgbGlnaHRzbGF0ZWdyZXk6ICcjNzc4ODk5JyxcbiAgICBsaWdodHN0ZWVsYmx1ZTogJyNiMGM0ZGUnLFxuICAgIGxpZ2h0eWVsbG93OiAnI2ZmZmZlMCcsXG4gICAgbGltZTogJyMwMGZmMDAnLFxuICAgIGxpbWVncmVlbjogJyMzMmNkMzInLFxuICAgIGxpbmVuOiAnI2ZhZjBlNicsXG4gICAgbWFnZW50YTogJyNmZjAwZmYnLFxuICAgIG1hcm9vbjogJyM4MDAwMDAnLFxuICAgIG1lZGl1bWFxdWFtYXJpbmU6ICcjNjZjZGFhJyxcbiAgICBtZWRpdW1ibHVlOiAnIzAwMDBjZCcsXG4gICAgbWVkaXVtb3JjaGlkOiAnI2JhNTVkMycsXG4gICAgbWVkaXVtcHVycGxlOiAnIzkzNzBkYicsXG4gICAgbWVkaXVtc2VhZ3JlZW46ICcjM2NiMzcxJyxcbiAgICBtZWRpdW1zbGF0ZWJsdWU6ICcjN2I2OGVlJyxcbiAgICBtZWRpdW1zcHJpbmdncmVlbjogJyMwMGZhOWEnLFxuICAgIG1lZGl1bXR1cnF1b2lzZTogJyM0OGQxY2MnLFxuICAgIG1lZGl1bXZpb2xldHJlZDogJyNjNzE1ODUnLFxuICAgIG1pZG5pZ2h0Ymx1ZTogJyMxOTE5NzAnLFxuICAgIG1pbnRjcmVhbTogJyNmNWZmZmEnLFxuICAgIG1pc3R5cm9zZTogJyNmZmU0ZTEnLFxuICAgIG1vY2Nhc2luOiAnI2ZmZTRiNScsXG4gICAgbmF2YWpvd2hpdGU6ICcjZmZkZWFkJyxcbiAgICBuYXZ5OiAnIzAwMDA4MCcsXG4gICAgb2xkbGFjZTogJyNmZGY1ZTYnLFxuICAgIG9saXZlOiAnIzgwODAwMCcsXG4gICAgb2xpdmVkcmFiOiAnIzZiOGUyMycsXG4gICAgb3JhbmdlOiAnI2ZmYTUwMCcsXG4gICAgb3JhbmdlcmVkOiAnI2ZmNDUwMCcsXG4gICAgb3JjaGlkOiAnI2RhNzBkNicsXG4gICAgcGFsZWdvbGRlbnJvZDogJyNlZWU4YWEnLFxuICAgIHBhbGVncmVlbjogJyM5OGZiOTgnLFxuICAgIHBhbGV0dXJxdW9pc2U6ICcjYWZlZWVlJyxcbiAgICBwYWxldmlvbGV0cmVkOiAnI2RiNzA5MycsXG4gICAgcGFwYXlhd2hpcDogJyNmZmVmZDUnLFxuICAgIHBlYWNocHVmZjogJyNmZmRhYjknLFxuICAgIHBlcnU6ICcjY2Q4NTNmJyxcbiAgICBwaW5rOiAnI2ZmYzBjYicsXG4gICAgcGx1bTogJyNkZGEwZGQnLFxuICAgIHBvd2RlcmJsdWU6ICcjYjBlMGU2JyxcbiAgICBwdXJwbGU6ICcjODAwMDgwJyxcbiAgICByZWJlY2NhcHVycGxlOiAnIzY2MzM5OScsXG4gICAgcmVkOiAnI2ZmMDAwMCcsXG4gICAgcm9zeWJyb3duOiAnI2JjOGY4ZicsXG4gICAgcm95YWxibHVlOiAnIzQxNjllMScsXG4gICAgc2FkZGxlYnJvd246ICcjOGI0NTEzJyxcbiAgICBzYWxtb246ICcjZmE4MDcyJyxcbiAgICBzYW5keWJyb3duOiAnI2Y0YTQ2MCcsXG4gICAgc2VhZ3JlZW46ICcjMmU4YjU3JyxcbiAgICBzZWFzaGVsbDogJyNmZmY1ZWUnLFxuICAgIHNpZW5uYTogJyNhMDUyMmQnLFxuICAgIHNpbHZlcjogJyNjMGMwYzAnLFxuICAgIHNreWJsdWU6ICcjODdjZWViJyxcbiAgICBzbGF0ZWJsdWU6ICcjNmE1YWNkJyxcbiAgICBzbGF0ZWdyYXk6ICcjNzA4MDkwJyxcbiAgICBzbGF0ZWdyZXk6ICcjNzA4MDkwJyxcbiAgICBzbm93OiAnI2ZmZmFmYScsXG4gICAgc3ByaW5nZ3JlZW46ICcjMDBmZjdmJyxcbiAgICBzdGVlbGJsdWU6ICcjNDY4MmI0JyxcbiAgICB0YW46ICcjZDJiNDhjJyxcbiAgICB0ZWFsOiAnIzAwODA4MCcsXG4gICAgdGhpc3RsZTogJyNkOGJmZDgnLFxuICAgIHRvbWF0bzogJyNmZjYzNDcnLFxuICAgIHR1cnF1b2lzZTogJyM0MGUwZDAnLFxuICAgIHZpb2xldDogJyNlZTgyZWUnLFxuICAgIHdoZWF0OiAnI2Y1ZGViMycsXG4gICAgd2hpdGU6ICcjZmZmZmZmJyxcbiAgICB3aGl0ZXNtb2tlOiAnI2Y1ZjVmNScsXG4gICAgeWVsbG93OiAnI2ZmZmYwMCcsXG4gICAgeWVsbG93Z3JlZW46ICcjOWFjZDMyJyxcbn07XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVkdW5kYW50LXR5cGUtY29uc3RpdHVlbnRzICovXG5pbXBvcnQgeyBjb252ZXJ0SGV4VG9EZWNpbWFsLCBoc2xUb1JnYiwgaHN2VG9SZ2IsIHBhcnNlSW50RnJvbUhleCwgcmdiVG9SZ2IgfSBmcm9tICcuL2NvbnZlcnNpb24nO1xuaW1wb3J0IHsgbmFtZXMgfSBmcm9tICcuL2Nzcy1jb2xvci1uYW1lcyc7XG5pbXBvcnQgeyBib3VuZEFscGhhLCBjb252ZXJ0VG9QZXJjZW50YWdlIH0gZnJvbSAnLi91dGlsJztcbi8qKlxuICogR2l2ZW4gYSBzdHJpbmcgb3Igb2JqZWN0LCBjb252ZXJ0IHRoYXQgaW5wdXQgdG8gUkdCXG4gKlxuICogUG9zc2libGUgc3RyaW5nIGlucHV0czpcbiAqIGBgYFxuICogXCJyZWRcIlxuICogXCIjZjAwXCIgb3IgXCJmMDBcIlxuICogXCIjZmYwMDAwXCIgb3IgXCJmZjAwMDBcIlxuICogXCIjZmYwMDAwMDBcIiBvciBcImZmMDAwMDAwXCJcbiAqIFwicmdiIDI1NSAwIDBcIiBvciBcInJnYiAoMjU1LCAwLCAwKVwiXG4gKiBcInJnYiAxLjAgMCAwXCIgb3IgXCJyZ2IgKDEsIDAsIDApXCJcbiAqIFwicmdiYSAoMjU1LCAwLCAwLCAxKVwiIG9yIFwicmdiYSAyNTUsIDAsIDAsIDFcIlxuICogXCJyZ2JhICgxLjAsIDAsIDAsIDEpXCIgb3IgXCJyZ2JhIDEuMCwgMCwgMCwgMVwiXG4gKiBcImhzbCgwLCAxMDAlLCA1MCUpXCIgb3IgXCJoc2wgMCAxMDAlIDUwJVwiXG4gKiBcImhzbGEoMCwgMTAwJSwgNTAlLCAxKVwiIG9yIFwiaHNsYSAwIDEwMCUgNTAlLCAxXCJcbiAqIFwiaHN2KDAsIDEwMCUsIDEwMCUpXCIgb3IgXCJoc3YgMCAxMDAlIDEwMCVcIlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnB1dFRvUkdCKGNvbG9yKSB7XG4gICAgdmFyIHJnYiA9IHsgcjogMCwgZzogMCwgYjogMCB9O1xuICAgIHZhciBhID0gMTtcbiAgICB2YXIgcyA9IG51bGw7XG4gICAgdmFyIHYgPSBudWxsO1xuICAgIHZhciBsID0gbnVsbDtcbiAgICB2YXIgb2sgPSBmYWxzZTtcbiAgICB2YXIgZm9ybWF0ID0gZmFsc2U7XG4gICAgaWYgKHR5cGVvZiBjb2xvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29sb3IgPSBzdHJpbmdJbnB1dFRvT2JqZWN0KGNvbG9yKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb2xvciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKGlzVmFsaWRDU1NVbml0KGNvbG9yLnIpICYmIGlzVmFsaWRDU1NVbml0KGNvbG9yLmcpICYmIGlzVmFsaWRDU1NVbml0KGNvbG9yLmIpKSB7XG4gICAgICAgICAgICByZ2IgPSByZ2JUb1JnYihjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iKTtcbiAgICAgICAgICAgIG9rID0gdHJ1ZTtcbiAgICAgICAgICAgIGZvcm1hdCA9IFN0cmluZyhjb2xvci5yKS5zdWJzdHIoLTEpID09PSAnJScgPyAncHJnYicgOiAncmdiJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1ZhbGlkQ1NTVW5pdChjb2xvci5oKSAmJiBpc1ZhbGlkQ1NTVW5pdChjb2xvci5zKSAmJiBpc1ZhbGlkQ1NTVW5pdChjb2xvci52KSkge1xuICAgICAgICAgICAgcyA9IGNvbnZlcnRUb1BlcmNlbnRhZ2UoY29sb3Iucyk7XG4gICAgICAgICAgICB2ID0gY29udmVydFRvUGVyY2VudGFnZShjb2xvci52KTtcbiAgICAgICAgICAgIHJnYiA9IGhzdlRvUmdiKGNvbG9yLmgsIHMsIHYpO1xuICAgICAgICAgICAgb2sgPSB0cnVlO1xuICAgICAgICAgICAgZm9ybWF0ID0gJ2hzdic7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNWYWxpZENTU1VuaXQoY29sb3IuaCkgJiYgaXNWYWxpZENTU1VuaXQoY29sb3IucykgJiYgaXNWYWxpZENTU1VuaXQoY29sb3IubCkpIHtcbiAgICAgICAgICAgIHMgPSBjb252ZXJ0VG9QZXJjZW50YWdlKGNvbG9yLnMpO1xuICAgICAgICAgICAgbCA9IGNvbnZlcnRUb1BlcmNlbnRhZ2UoY29sb3IubCk7XG4gICAgICAgICAgICByZ2IgPSBoc2xUb1JnYihjb2xvci5oLCBzLCBsKTtcbiAgICAgICAgICAgIG9rID0gdHJ1ZTtcbiAgICAgICAgICAgIGZvcm1hdCA9ICdoc2wnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29sb3IsICdhJykpIHtcbiAgICAgICAgICAgIGEgPSBjb2xvci5hO1xuICAgICAgICB9XG4gICAgfVxuICAgIGEgPSBib3VuZEFscGhhKGEpO1xuICAgIHJldHVybiB7XG4gICAgICAgIG9rOiBvayxcbiAgICAgICAgZm9ybWF0OiBjb2xvci5mb3JtYXQgfHwgZm9ybWF0LFxuICAgICAgICByOiBNYXRoLm1pbigyNTUsIE1hdGgubWF4KHJnYi5yLCAwKSksXG4gICAgICAgIGc6IE1hdGgubWluKDI1NSwgTWF0aC5tYXgocmdiLmcsIDApKSxcbiAgICAgICAgYjogTWF0aC5taW4oMjU1LCBNYXRoLm1heChyZ2IuYiwgMCkpLFxuICAgICAgICBhOiBhLFxuICAgIH07XG59XG4vLyA8aHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy12YWx1ZXMvI2ludGVnZXJzPlxudmFyIENTU19JTlRFR0VSID0gJ1stXFxcXCtdP1xcXFxkKyU/Jztcbi8vIDxodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXZhbHVlcy8jbnVtYmVyLXZhbHVlPlxudmFyIENTU19OVU1CRVIgPSAnWy1cXFxcK10/XFxcXGQqXFxcXC5cXFxcZCslPyc7XG4vLyBBbGxvdyBwb3NpdGl2ZS9uZWdhdGl2ZSBpbnRlZ2VyL251bWJlci4gIERvbid0IGNhcHR1cmUgdGhlIGVpdGhlci9vciwganVzdCB0aGUgZW50aXJlIG91dGNvbWUuXG52YXIgQ1NTX1VOSVQgPSBcIig/OlwiLmNvbmNhdChDU1NfTlVNQkVSLCBcIil8KD86XCIpLmNvbmNhdChDU1NfSU5URUdFUiwgXCIpXCIpO1xuLy8gQWN0dWFsIG1hdGNoaW5nLlxuLy8gUGFyZW50aGVzZXMgYW5kIGNvbW1hcyBhcmUgb3B0aW9uYWwsIGJ1dCBub3QgcmVxdWlyZWQuXG4vLyBXaGl0ZXNwYWNlIGNhbiB0YWtlIHRoZSBwbGFjZSBvZiBjb21tYXMgb3Igb3BlbmluZyBwYXJlblxudmFyIFBFUk1JU1NJVkVfTUFUQ0gzID0gXCJbXFxcXHN8XFxcXChdKyhcIi5jb25jYXQoQ1NTX1VOSVQsIFwiKVssfFxcXFxzXSsoXCIpLmNvbmNhdChDU1NfVU5JVCwgXCIpWyx8XFxcXHNdKyhcIikuY29uY2F0KENTU19VTklULCBcIilcXFxccypcXFxcKT9cIik7XG52YXIgUEVSTUlTU0lWRV9NQVRDSDQgPSBcIltcXFxcc3xcXFxcKF0rKFwiLmNvbmNhdChDU1NfVU5JVCwgXCIpWyx8XFxcXHNdKyhcIikuY29uY2F0KENTU19VTklULCBcIilbLHxcXFxcc10rKFwiKS5jb25jYXQoQ1NTX1VOSVQsIFwiKVssfFxcXFxzXSsoXCIpLmNvbmNhdChDU1NfVU5JVCwgXCIpXFxcXHMqXFxcXCk/XCIpO1xudmFyIG1hdGNoZXJzID0ge1xuICAgIENTU19VTklUOiBuZXcgUmVnRXhwKENTU19VTklUKSxcbiAgICByZ2I6IG5ldyBSZWdFeHAoJ3JnYicgKyBQRVJNSVNTSVZFX01BVENIMyksXG4gICAgcmdiYTogbmV3IFJlZ0V4cCgncmdiYScgKyBQRVJNSVNTSVZFX01BVENINCksXG4gICAgaHNsOiBuZXcgUmVnRXhwKCdoc2wnICsgUEVSTUlTU0lWRV9NQVRDSDMpLFxuICAgIGhzbGE6IG5ldyBSZWdFeHAoJ2hzbGEnICsgUEVSTUlTU0lWRV9NQVRDSDQpLFxuICAgIGhzdjogbmV3IFJlZ0V4cCgnaHN2JyArIFBFUk1JU1NJVkVfTUFUQ0gzKSxcbiAgICBoc3ZhOiBuZXcgUmVnRXhwKCdoc3ZhJyArIFBFUk1JU1NJVkVfTUFUQ0g0KSxcbiAgICBoZXgzOiAvXiM/KFswLTlhLWZBLUZdezF9KShbMC05YS1mQS1GXXsxfSkoWzAtOWEtZkEtRl17MX0pJC8sXG4gICAgaGV4NjogL14jPyhbMC05YS1mQS1GXXsyfSkoWzAtOWEtZkEtRl17Mn0pKFswLTlhLWZBLUZdezJ9KSQvLFxuICAgIGhleDQ6IC9eIz8oWzAtOWEtZkEtRl17MX0pKFswLTlhLWZBLUZdezF9KShbMC05YS1mQS1GXXsxfSkoWzAtOWEtZkEtRl17MX0pJC8sXG4gICAgaGV4ODogL14jPyhbMC05YS1mQS1GXXsyfSkoWzAtOWEtZkEtRl17Mn0pKFswLTlhLWZBLUZdezJ9KShbMC05YS1mQS1GXXsyfSkkLyxcbn07XG4vKipcbiAqIFBlcm1pc3NpdmUgc3RyaW5nIHBhcnNpbmcuICBUYWtlIGluIGEgbnVtYmVyIG9mIGZvcm1hdHMsIGFuZCBvdXRwdXQgYW4gb2JqZWN0XG4gKiBiYXNlZCBvbiBkZXRlY3RlZCBmb3JtYXQuICBSZXR1cm5zIGB7IHIsIGcsIGIgfWAgb3IgYHsgaCwgcywgbCB9YCBvciBgeyBoLCBzLCB2fWBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ0lucHV0VG9PYmplY3QoY29sb3IpIHtcbiAgICBjb2xvciA9IGNvbG9yLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChjb2xvci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgbmFtZWQgPSBmYWxzZTtcbiAgICBpZiAobmFtZXNbY29sb3JdKSB7XG4gICAgICAgIGNvbG9yID0gbmFtZXNbY29sb3JdO1xuICAgICAgICBuYW1lZCA9IHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNvbG9yID09PSAndHJhbnNwYXJlbnQnKSB7XG4gICAgICAgIHJldHVybiB7IHI6IDAsIGc6IDAsIGI6IDAsIGE6IDAsIGZvcm1hdDogJ25hbWUnIH07XG4gICAgfVxuICAgIC8vIFRyeSB0byBtYXRjaCBzdHJpbmcgaW5wdXQgdXNpbmcgcmVndWxhciBleHByZXNzaW9ucy5cbiAgICAvLyBLZWVwIG1vc3Qgb2YgdGhlIG51bWJlciBib3VuZGluZyBvdXQgb2YgdGhpcyBmdW5jdGlvbiAtIGRvbid0IHdvcnJ5IGFib3V0IFswLDFdIG9yIFswLDEwMF0gb3IgWzAsMzYwXVxuICAgIC8vIEp1c3QgcmV0dXJuIGFuIG9iamVjdCBhbmQgbGV0IHRoZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBoYW5kbGUgdGhhdC5cbiAgICAvLyBUaGlzIHdheSB0aGUgcmVzdWx0IHdpbGwgYmUgdGhlIHNhbWUgd2hldGhlciB0aGUgdGlueWNvbG9yIGlzIGluaXRpYWxpemVkIHdpdGggc3RyaW5nIG9yIG9iamVjdC5cbiAgICB2YXIgbWF0Y2ggPSBtYXRjaGVycy5yZ2IuZXhlYyhjb2xvcik7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHJldHVybiB7IHI6IG1hdGNoWzFdLCBnOiBtYXRjaFsyXSwgYjogbWF0Y2hbM10gfTtcbiAgICB9XG4gICAgbWF0Y2ggPSBtYXRjaGVycy5yZ2JhLmV4ZWMoY29sb3IpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4geyByOiBtYXRjaFsxXSwgZzogbWF0Y2hbMl0sIGI6IG1hdGNoWzNdLCBhOiBtYXRjaFs0XSB9O1xuICAgIH1cbiAgICBtYXRjaCA9IG1hdGNoZXJzLmhzbC5leGVjKGNvbG9yKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIHsgaDogbWF0Y2hbMV0sIHM6IG1hdGNoWzJdLCBsOiBtYXRjaFszXSB9O1xuICAgIH1cbiAgICBtYXRjaCA9IG1hdGNoZXJzLmhzbGEuZXhlYyhjb2xvcik7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHJldHVybiB7IGg6IG1hdGNoWzFdLCBzOiBtYXRjaFsyXSwgbDogbWF0Y2hbM10sIGE6IG1hdGNoWzRdIH07XG4gICAgfVxuICAgIG1hdGNoID0gbWF0Y2hlcnMuaHN2LmV4ZWMoY29sb3IpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4geyBoOiBtYXRjaFsxXSwgczogbWF0Y2hbMl0sIHY6IG1hdGNoWzNdIH07XG4gICAgfVxuICAgIG1hdGNoID0gbWF0Y2hlcnMuaHN2YS5leGVjKGNvbG9yKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIHsgaDogbWF0Y2hbMV0sIHM6IG1hdGNoWzJdLCB2OiBtYXRjaFszXSwgYTogbWF0Y2hbNF0gfTtcbiAgICB9XG4gICAgbWF0Y2ggPSBtYXRjaGVycy5oZXg4LmV4ZWMoY29sb3IpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcjogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzFdKSxcbiAgICAgICAgICAgIGc6IHBhcnNlSW50RnJvbUhleChtYXRjaFsyXSksXG4gICAgICAgICAgICBiOiBwYXJzZUludEZyb21IZXgobWF0Y2hbM10pLFxuICAgICAgICAgICAgYTogY29udmVydEhleFRvRGVjaW1hbChtYXRjaFs0XSksXG4gICAgICAgICAgICBmb3JtYXQ6IG5hbWVkID8gJ25hbWUnIDogJ2hleDgnLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBtYXRjaCA9IG1hdGNoZXJzLmhleDYuZXhlYyhjb2xvcik7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByOiBwYXJzZUludEZyb21IZXgobWF0Y2hbMV0pLFxuICAgICAgICAgICAgZzogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzJdKSxcbiAgICAgICAgICAgIGI6IHBhcnNlSW50RnJvbUhleChtYXRjaFszXSksXG4gICAgICAgICAgICBmb3JtYXQ6IG5hbWVkID8gJ25hbWUnIDogJ2hleCcsXG4gICAgICAgIH07XG4gICAgfVxuICAgIG1hdGNoID0gbWF0Y2hlcnMuaGV4NC5leGVjKGNvbG9yKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHI6IHBhcnNlSW50RnJvbUhleChtYXRjaFsxXSArIG1hdGNoWzFdKSxcbiAgICAgICAgICAgIGc6IHBhcnNlSW50RnJvbUhleChtYXRjaFsyXSArIG1hdGNoWzJdKSxcbiAgICAgICAgICAgIGI6IHBhcnNlSW50RnJvbUhleChtYXRjaFszXSArIG1hdGNoWzNdKSxcbiAgICAgICAgICAgIGE6IGNvbnZlcnRIZXhUb0RlY2ltYWwobWF0Y2hbNF0gKyBtYXRjaFs0XSksXG4gICAgICAgICAgICBmb3JtYXQ6IG5hbWVkID8gJ25hbWUnIDogJ2hleDgnLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBtYXRjaCA9IG1hdGNoZXJzLmhleDMuZXhlYyhjb2xvcik7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByOiBwYXJzZUludEZyb21IZXgobWF0Y2hbMV0gKyBtYXRjaFsxXSksXG4gICAgICAgICAgICBnOiBwYXJzZUludEZyb21IZXgobWF0Y2hbMl0gKyBtYXRjaFsyXSksXG4gICAgICAgICAgICBiOiBwYXJzZUludEZyb21IZXgobWF0Y2hbM10gKyBtYXRjaFszXSksXG4gICAgICAgICAgICBmb3JtYXQ6IG5hbWVkID8gJ25hbWUnIDogJ2hleCcsXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8qKlxuICogQ2hlY2sgdG8gc2VlIGlmIGl0IGxvb2tzIGxpa2UgYSBDU1MgdW5pdFxuICogKHNlZSBgbWF0Y2hlcnNgIGFib3ZlIGZvciBkZWZpbml0aW9uKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRDU1NVbml0KGNvbG9yKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4obWF0Y2hlcnMuQ1NTX1VOSVQuZXhlYyhTdHJpbmcoY29sb3IpKSk7XG59XG4iLCJpbXBvcnQgeyBudW1iZXJJbnB1dFRvT2JqZWN0LCByZ2JhVG9IZXgsIHJnYlRvSGV4LCByZ2JUb0hzbCwgcmdiVG9Ic3YgfSBmcm9tICcuL2NvbnZlcnNpb24nO1xuaW1wb3J0IHsgbmFtZXMgfSBmcm9tICcuL2Nzcy1jb2xvci1uYW1lcyc7XG5pbXBvcnQgeyBpbnB1dFRvUkdCIH0gZnJvbSAnLi9mb3JtYXQtaW5wdXQnO1xuaW1wb3J0IHsgYm91bmQwMSwgYm91bmRBbHBoYSwgY2xhbXAwMSB9IGZyb20gJy4vdXRpbCc7XG52YXIgVGlueUNvbG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRpbnlDb2xvcihjb2xvciwgb3B0cykge1xuICAgICAgICBpZiAoY29sb3IgPT09IHZvaWQgMCkgeyBjb2xvciA9ICcnOyB9XG4gICAgICAgIGlmIChvcHRzID09PSB2b2lkIDApIHsgb3B0cyA9IHt9OyB9XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgLy8gSWYgaW5wdXQgaXMgYWxyZWFkeSBhIHRpbnljb2xvciwgcmV0dXJuIGl0c2VsZlxuICAgICAgICBpZiAoY29sb3IgaW5zdGFuY2VvZiBUaW55Q29sb3IpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdHJ1Y3Rvci1yZXR1cm5cbiAgICAgICAgICAgIHJldHVybiBjb2xvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNvbG9yID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgY29sb3IgPSBudW1iZXJJbnB1dFRvT2JqZWN0KGNvbG9yKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9yaWdpbmFsSW5wdXQgPSBjb2xvcjtcbiAgICAgICAgdmFyIHJnYiA9IGlucHV0VG9SR0IoY29sb3IpO1xuICAgICAgICB0aGlzLm9yaWdpbmFsSW5wdXQgPSBjb2xvcjtcbiAgICAgICAgdGhpcy5yID0gcmdiLnI7XG4gICAgICAgIHRoaXMuZyA9IHJnYi5nO1xuICAgICAgICB0aGlzLmIgPSByZ2IuYjtcbiAgICAgICAgdGhpcy5hID0gcmdiLmE7XG4gICAgICAgIHRoaXMucm91bmRBID0gTWF0aC5yb3VuZCgxMDAgKiB0aGlzLmEpIC8gMTAwO1xuICAgICAgICB0aGlzLmZvcm1hdCA9IChfYSA9IG9wdHMuZm9ybWF0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiByZ2IuZm9ybWF0O1xuICAgICAgICB0aGlzLmdyYWRpZW50VHlwZSA9IG9wdHMuZ3JhZGllbnRUeXBlO1xuICAgICAgICAvLyBEb24ndCBsZXQgdGhlIHJhbmdlIG9mIFswLDI1NV0gY29tZSBiYWNrIGluIFswLDFdLlxuICAgICAgICAvLyBQb3RlbnRpYWxseSBsb3NlIGEgbGl0dGxlIGJpdCBvZiBwcmVjaXNpb24gaGVyZSwgYnV0IHdpbGwgZml4IGlzc3VlcyB3aGVyZVxuICAgICAgICAvLyAuNSBnZXRzIGludGVycHJldGVkIGFzIGhhbGYgb2YgdGhlIHRvdGFsLCBpbnN0ZWFkIG9mIGhhbGYgb2YgMVxuICAgICAgICAvLyBJZiBpdCB3YXMgc3VwcG9zZWQgdG8gYmUgMTI4LCB0aGlzIHdhcyBhbHJlYWR5IHRha2VuIGNhcmUgb2YgYnkgYGlucHV0VG9SZ2JgXG4gICAgICAgIGlmICh0aGlzLnIgPCAxKSB7XG4gICAgICAgICAgICB0aGlzLnIgPSBNYXRoLnJvdW5kKHRoaXMucik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZyA8IDEpIHtcbiAgICAgICAgICAgIHRoaXMuZyA9IE1hdGgucm91bmQodGhpcy5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5iIDwgMSkge1xuICAgICAgICAgICAgdGhpcy5iID0gTWF0aC5yb3VuZCh0aGlzLmIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNWYWxpZCA9IHJnYi5vaztcbiAgICB9XG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS5pc0RhcmsgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJyaWdodG5lc3MoKSA8IDEyODtcbiAgICB9O1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUuaXNMaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzRGFyaygpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcGVyY2VpdmVkIGJyaWdodG5lc3Mgb2YgdGhlIGNvbG9yLCBmcm9tIDAtMjU1LlxuICAgICAqL1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUuZ2V0QnJpZ2h0bmVzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvQUVSVCNjb2xvci1jb250cmFzdFxuICAgICAgICB2YXIgcmdiID0gdGhpcy50b1JnYigpO1xuICAgICAgICByZXR1cm4gKHJnYi5yICogMjk5ICsgcmdiLmcgKiA1ODcgKyByZ2IuYiAqIDExNCkgLyAxMDAwO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcGVyY2VpdmVkIGx1bWluYW5jZSBvZiBhIGNvbG9yLCBmcm9tIDAtMS5cbiAgICAgKi9cbiAgICBUaW55Q29sb3IucHJvdG90eXBlLmdldEx1bWluYW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAwOC9SRUMtV0NBRzIwLTIwMDgxMjExLyNyZWxhdGl2ZWx1bWluYW5jZWRlZlxuICAgICAgICB2YXIgcmdiID0gdGhpcy50b1JnYigpO1xuICAgICAgICB2YXIgUjtcbiAgICAgICAgdmFyIEc7XG4gICAgICAgIHZhciBCO1xuICAgICAgICB2YXIgUnNSR0IgPSByZ2IuciAvIDI1NTtcbiAgICAgICAgdmFyIEdzUkdCID0gcmdiLmcgLyAyNTU7XG4gICAgICAgIHZhciBCc1JHQiA9IHJnYi5iIC8gMjU1O1xuICAgICAgICBpZiAoUnNSR0IgPD0gMC4wMzkyOCkge1xuICAgICAgICAgICAgUiA9IFJzUkdCIC8gMTIuOTI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWV4cG9uZW50aWF0aW9uLW9wZXJhdG9yXG4gICAgICAgICAgICBSID0gTWF0aC5wb3coKFJzUkdCICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEdzUkdCIDw9IDAuMDM5MjgpIHtcbiAgICAgICAgICAgIEcgPSBHc1JHQiAvIDEyLjkyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1leHBvbmVudGlhdGlvbi1vcGVyYXRvclxuICAgICAgICAgICAgRyA9IE1hdGgucG93KChHc1JHQiArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChCc1JHQiA8PSAwLjAzOTI4KSB7XG4gICAgICAgICAgICBCID0gQnNSR0IgLyAxMi45MjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItZXhwb25lbnRpYXRpb24tb3BlcmF0b3JcbiAgICAgICAgICAgIEIgPSBNYXRoLnBvdygoQnNSR0IgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMC4yMTI2ICogUiArIDAuNzE1MiAqIEcgKyAwLjA3MjIgKiBCO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYWxwaGEgdmFsdWUgb2YgYSBjb2xvciwgZnJvbSAwLTEuXG4gICAgICovXG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS5nZXRBbHBoYSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGFscGhhIHZhbHVlIG9uIHRoZSBjdXJyZW50IGNvbG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFscGhhIC0gVGhlIG5ldyBhbHBoYSB2YWx1ZS4gVGhlIGFjY2VwdGVkIHJhbmdlIGlzIDAtMS5cbiAgICAgKi9cbiAgICBUaW55Q29sb3IucHJvdG90eXBlLnNldEFscGhhID0gZnVuY3Rpb24gKGFscGhhKSB7XG4gICAgICAgIHRoaXMuYSA9IGJvdW5kQWxwaGEoYWxwaGEpO1xuICAgICAgICB0aGlzLnJvdW5kQSA9IE1hdGgucm91bmQoMTAwICogdGhpcy5hKSAvIDEwMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvbG9yIGlzIG1vbm9jaHJvbWUuXG4gICAgICovXG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS5pc01vbm9jaHJvbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzID0gdGhpcy50b0hzbCgpLnM7XG4gICAgICAgIHJldHVybiBzID09PSAwO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgb2JqZWN0IGFzIGEgSFNWQSBvYmplY3QuXG4gICAgICovXG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS50b0hzdiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGhzdiA9IHJnYlRvSHN2KHRoaXMuciwgdGhpcy5nLCB0aGlzLmIpO1xuICAgICAgICByZXR1cm4geyBoOiBoc3YuaCAqIDM2MCwgczogaHN2LnMsIHY6IGhzdi52LCBhOiB0aGlzLmEgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGhzdmEgdmFsdWVzIGludGVycG9sYXRlZCBpbnRvIGEgc3RyaW5nIHdpdGggdGhlIGZvbGxvd2luZyBmb3JtYXQ6XG4gICAgICogXCJoc3ZhKHh4eCwgeHh4LCB4eHgsIHh4KVwiLlxuICAgICAqL1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUudG9Ic3ZTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBoc3YgPSByZ2JUb0hzdih0aGlzLnIsIHRoaXMuZywgdGhpcy5iKTtcbiAgICAgICAgdmFyIGggPSBNYXRoLnJvdW5kKGhzdi5oICogMzYwKTtcbiAgICAgICAgdmFyIHMgPSBNYXRoLnJvdW5kKGhzdi5zICogMTAwKTtcbiAgICAgICAgdmFyIHYgPSBNYXRoLnJvdW5kKGhzdi52ICogMTAwKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYSA9PT0gMSA/IFwiaHN2KFwiLmNvbmNhdChoLCBcIiwgXCIpLmNvbmNhdChzLCBcIiUsIFwiKS5jb25jYXQodiwgXCIlKVwiKSA6IFwiaHN2YShcIi5jb25jYXQoaCwgXCIsIFwiKS5jb25jYXQocywgXCIlLCBcIikuY29uY2F0KHYsIFwiJSwgXCIpLmNvbmNhdCh0aGlzLnJvdW5kQSwgXCIpXCIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgb2JqZWN0IGFzIGEgSFNMQSBvYmplY3QuXG4gICAgICovXG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS50b0hzbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGhzbCA9IHJnYlRvSHNsKHRoaXMuciwgdGhpcy5nLCB0aGlzLmIpO1xuICAgICAgICByZXR1cm4geyBoOiBoc2wuaCAqIDM2MCwgczogaHNsLnMsIGw6IGhzbC5sLCBhOiB0aGlzLmEgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGhzbGEgdmFsdWVzIGludGVycG9sYXRlZCBpbnRvIGEgc3RyaW5nIHdpdGggdGhlIGZvbGxvd2luZyBmb3JtYXQ6XG4gICAgICogXCJoc2xhKHh4eCwgeHh4LCB4eHgsIHh4KVwiLlxuICAgICAqL1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUudG9Ic2xTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBoc2wgPSByZ2JUb0hzbCh0aGlzLnIsIHRoaXMuZywgdGhpcy5iKTtcbiAgICAgICAgdmFyIGggPSBNYXRoLnJvdW5kKGhzbC5oICogMzYwKTtcbiAgICAgICAgdmFyIHMgPSBNYXRoLnJvdW5kKGhzbC5zICogMTAwKTtcbiAgICAgICAgdmFyIGwgPSBNYXRoLnJvdW5kKGhzbC5sICogMTAwKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYSA9PT0gMSA/IFwiaHNsKFwiLmNvbmNhdChoLCBcIiwgXCIpLmNvbmNhdChzLCBcIiUsIFwiKS5jb25jYXQobCwgXCIlKVwiKSA6IFwiaHNsYShcIi5jb25jYXQoaCwgXCIsIFwiKS5jb25jYXQocywgXCIlLCBcIikuY29uY2F0KGwsIFwiJSwgXCIpLmNvbmNhdCh0aGlzLnJvdW5kQSwgXCIpXCIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaGV4IHZhbHVlIG9mIHRoZSBjb2xvci5cbiAgICAgKiBAcGFyYW0gYWxsb3czQ2hhciB3aWxsIHNob3J0ZW4gaGV4IHZhbHVlIHRvIDMgY2hhciBpZiBwb3NzaWJsZVxuICAgICAqL1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUudG9IZXggPSBmdW5jdGlvbiAoYWxsb3czQ2hhcikge1xuICAgICAgICBpZiAoYWxsb3czQ2hhciA9PT0gdm9pZCAwKSB7IGFsbG93M0NoYXIgPSBmYWxzZTsgfVxuICAgICAgICByZXR1cm4gcmdiVG9IZXgodGhpcy5yLCB0aGlzLmcsIHRoaXMuYiwgYWxsb3czQ2hhcik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBoZXggdmFsdWUgb2YgdGhlIGNvbG9yIC13aXRoIGEgIyBwcmVmaXhlZC5cbiAgICAgKiBAcGFyYW0gYWxsb3czQ2hhciB3aWxsIHNob3J0ZW4gaGV4IHZhbHVlIHRvIDMgY2hhciBpZiBwb3NzaWJsZVxuICAgICAqL1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUudG9IZXhTdHJpbmcgPSBmdW5jdGlvbiAoYWxsb3czQ2hhcikge1xuICAgICAgICBpZiAoYWxsb3czQ2hhciA9PT0gdm9pZCAwKSB7IGFsbG93M0NoYXIgPSBmYWxzZTsgfVxuICAgICAgICByZXR1cm4gJyMnICsgdGhpcy50b0hleChhbGxvdzNDaGFyKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGhleCA4IHZhbHVlIG9mIHRoZSBjb2xvci5cbiAgICAgKiBAcGFyYW0gYWxsb3c0Q2hhciB3aWxsIHNob3J0ZW4gaGV4IHZhbHVlIHRvIDQgY2hhciBpZiBwb3NzaWJsZVxuICAgICAqL1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUudG9IZXg4ID0gZnVuY3Rpb24gKGFsbG93NENoYXIpIHtcbiAgICAgICAgaWYgKGFsbG93NENoYXIgPT09IHZvaWQgMCkgeyBhbGxvdzRDaGFyID0gZmFsc2U7IH1cbiAgICAgICAgcmV0dXJuIHJnYmFUb0hleCh0aGlzLnIsIHRoaXMuZywgdGhpcy5iLCB0aGlzLmEsIGFsbG93NENoYXIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaGV4IDggdmFsdWUgb2YgdGhlIGNvbG9yIC13aXRoIGEgIyBwcmVmaXhlZC5cbiAgICAgKiBAcGFyYW0gYWxsb3c0Q2hhciB3aWxsIHNob3J0ZW4gaGV4IHZhbHVlIHRvIDQgY2hhciBpZiBwb3NzaWJsZVxuICAgICAqL1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUudG9IZXg4U3RyaW5nID0gZnVuY3Rpb24gKGFsbG93NENoYXIpIHtcbiAgICAgICAgaWYgKGFsbG93NENoYXIgPT09IHZvaWQgMCkgeyBhbGxvdzRDaGFyID0gZmFsc2U7IH1cbiAgICAgICAgcmV0dXJuICcjJyArIHRoaXMudG9IZXg4KGFsbG93NENoYXIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2hvcnRlciBoZXggdmFsdWUgb2YgdGhlIGNvbG9yIGRlcGVuZHMgb24gaXRzIGFscGhhIC13aXRoIGEgIyBwcmVmaXhlZC5cbiAgICAgKiBAcGFyYW0gYWxsb3dTaG9ydENoYXIgd2lsbCBzaG9ydGVuIGhleCB2YWx1ZSB0byAzIG9yIDQgY2hhciBpZiBwb3NzaWJsZVxuICAgICAqL1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUudG9IZXhTaG9ydFN0cmluZyA9IGZ1bmN0aW9uIChhbGxvd1Nob3J0Q2hhcikge1xuICAgICAgICBpZiAoYWxsb3dTaG9ydENoYXIgPT09IHZvaWQgMCkgeyBhbGxvd1Nob3J0Q2hhciA9IGZhbHNlOyB9XG4gICAgICAgIHJldHVybiB0aGlzLmEgPT09IDEgPyB0aGlzLnRvSGV4U3RyaW5nKGFsbG93U2hvcnRDaGFyKSA6IHRoaXMudG9IZXg4U3RyaW5nKGFsbG93U2hvcnRDaGFyKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG9iamVjdCBhcyBhIFJHQkEgb2JqZWN0LlxuICAgICAqL1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUudG9SZ2IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByOiBNYXRoLnJvdW5kKHRoaXMuciksXG4gICAgICAgICAgICBnOiBNYXRoLnJvdW5kKHRoaXMuZyksXG4gICAgICAgICAgICBiOiBNYXRoLnJvdW5kKHRoaXMuYiksXG4gICAgICAgICAgICBhOiB0aGlzLmEsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBSR0JBIHZhbHVlcyBpbnRlcnBvbGF0ZWQgaW50byBhIHN0cmluZyB3aXRoIHRoZSBmb2xsb3dpbmcgZm9ybWF0OlxuICAgICAqIFwiUkdCQSh4eHgsIHh4eCwgeHh4LCB4eClcIi5cbiAgICAgKi9cbiAgICBUaW55Q29sb3IucHJvdG90eXBlLnRvUmdiU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgciA9IE1hdGgucm91bmQodGhpcy5yKTtcbiAgICAgICAgdmFyIGcgPSBNYXRoLnJvdW5kKHRoaXMuZyk7XG4gICAgICAgIHZhciBiID0gTWF0aC5yb3VuZCh0aGlzLmIpO1xuICAgICAgICByZXR1cm4gdGhpcy5hID09PSAxID8gXCJyZ2IoXCIuY29uY2F0KHIsIFwiLCBcIikuY29uY2F0KGcsIFwiLCBcIikuY29uY2F0KGIsIFwiKVwiKSA6IFwicmdiYShcIi5jb25jYXQociwgXCIsIFwiKS5jb25jYXQoZywgXCIsIFwiKS5jb25jYXQoYiwgXCIsIFwiKS5jb25jYXQodGhpcy5yb3VuZEEsIFwiKVwiKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG9iamVjdCBhcyBhIFJHQkEgb2JqZWN0LlxuICAgICAqL1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUudG9QZXJjZW50YWdlUmdiID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZm10ID0gZnVuY3Rpb24gKHgpIHsgcmV0dXJuIFwiXCIuY29uY2F0KE1hdGgucm91bmQoYm91bmQwMSh4LCAyNTUpICogMTAwKSwgXCIlXCIpOyB9O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcjogZm10KHRoaXMuciksXG4gICAgICAgICAgICBnOiBmbXQodGhpcy5nKSxcbiAgICAgICAgICAgIGI6IGZtdCh0aGlzLmIpLFxuICAgICAgICAgICAgYTogdGhpcy5hLFxuICAgICAgICB9O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgUkdCQSByZWxhdGl2ZSB2YWx1ZXMgaW50ZXJwb2xhdGVkIGludG8gYSBzdHJpbmdcbiAgICAgKi9cbiAgICBUaW55Q29sb3IucHJvdG90eXBlLnRvUGVyY2VudGFnZVJnYlN0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJuZCA9IGZ1bmN0aW9uICh4KSB7IHJldHVybiBNYXRoLnJvdW5kKGJvdW5kMDEoeCwgMjU1KSAqIDEwMCk7IH07XG4gICAgICAgIHJldHVybiB0aGlzLmEgPT09IDFcbiAgICAgICAgICAgID8gXCJyZ2IoXCIuY29uY2F0KHJuZCh0aGlzLnIpLCBcIiUsIFwiKS5jb25jYXQocm5kKHRoaXMuZyksIFwiJSwgXCIpLmNvbmNhdChybmQodGhpcy5iKSwgXCIlKVwiKVxuICAgICAgICAgICAgOiBcInJnYmEoXCIuY29uY2F0KHJuZCh0aGlzLnIpLCBcIiUsIFwiKS5jb25jYXQocm5kKHRoaXMuZyksIFwiJSwgXCIpLmNvbmNhdChybmQodGhpcy5iKSwgXCIlLCBcIikuY29uY2F0KHRoaXMucm91bmRBLCBcIilcIik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUaGUgJ3JlYWwnIG5hbWUgb2YgdGhlIGNvbG9yIC1pZiB0aGVyZSBpcyBvbmUuXG4gICAgICovXG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS50b05hbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmEgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAndHJhbnNwYXJlbnQnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmEgPCAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGhleCA9ICcjJyArIHJnYlRvSGV4KHRoaXMuciwgdGhpcy5nLCB0aGlzLmIsIGZhbHNlKTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IE9iamVjdC5lbnRyaWVzKG5hbWVzKTsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhciBfYiA9IF9hW19pXSwga2V5ID0gX2JbMF0sIHZhbHVlID0gX2JbMV07XG4gICAgICAgICAgICBpZiAoaGV4ID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgdmFyIGZvcm1hdFNldCA9IEJvb2xlYW4oZm9ybWF0KTtcbiAgICAgICAgZm9ybWF0ID0gZm9ybWF0ICE9PSBudWxsICYmIGZvcm1hdCAhPT0gdm9pZCAwID8gZm9ybWF0IDogdGhpcy5mb3JtYXQ7XG4gICAgICAgIHZhciBmb3JtYXR0ZWRTdHJpbmcgPSBmYWxzZTtcbiAgICAgICAgdmFyIGhhc0FscGhhID0gdGhpcy5hIDwgMSAmJiB0aGlzLmEgPj0gMDtcbiAgICAgICAgdmFyIG5lZWRzQWxwaGFGb3JtYXQgPSAhZm9ybWF0U2V0ICYmIGhhc0FscGhhICYmIChmb3JtYXQuc3RhcnRzV2l0aCgnaGV4JykgfHwgZm9ybWF0ID09PSAnbmFtZScpO1xuICAgICAgICBpZiAobmVlZHNBbHBoYUZvcm1hdCkge1xuICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBcInRyYW5zcGFyZW50XCIsIGFsbCBvdGhlciBub24tYWxwaGEgZm9ybWF0c1xuICAgICAgICAgICAgLy8gd2lsbCByZXR1cm4gcmdiYSB3aGVuIHRoZXJlIGlzIHRyYW5zcGFyZW5jeS5cbiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICduYW1lJyAmJiB0aGlzLmEgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50b05hbWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvUmdiU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ3JnYicpIHtcbiAgICAgICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9SZ2JTdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9ybWF0ID09PSAncHJnYicpIHtcbiAgICAgICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9QZXJjZW50YWdlUmdiU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2hleCcgfHwgZm9ybWF0ID09PSAnaGV4NicpIHtcbiAgICAgICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9IZXhTdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9ybWF0ID09PSAnaGV4MycpIHtcbiAgICAgICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9IZXhTdHJpbmcodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2hleDQnKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvSGV4OFN0cmluZyh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9ybWF0ID09PSAnaGV4OCcpIHtcbiAgICAgICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9IZXg4U3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ25hbWUnKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvTmFtZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3JtYXQgPT09ICdoc2wnKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvSHNsU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2hzdicpIHtcbiAgICAgICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9Ic3ZTdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9ybWF0dGVkU3RyaW5nIHx8IHRoaXMudG9IZXhTdHJpbmcoKTtcbiAgICB9O1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUudG9OdW1iZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAoTWF0aC5yb3VuZCh0aGlzLnIpIDw8IDE2KSArIChNYXRoLnJvdW5kKHRoaXMuZykgPDwgOCkgKyBNYXRoLnJvdW5kKHRoaXMuYik7XG4gICAgfTtcbiAgICBUaW55Q29sb3IucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IFRpbnlDb2xvcih0aGlzLnRvU3RyaW5nKCkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTGlnaHRlbiB0aGUgY29sb3IgYSBnaXZlbiBhbW91bnQuIFByb3ZpZGluZyAxMDAgd2lsbCBhbHdheXMgcmV0dXJuIHdoaXRlLlxuICAgICAqIEBwYXJhbSBhbW91bnQgLSB2YWxpZCBiZXR3ZWVuIDEtMTAwXG4gICAgICovXG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS5saWdodGVuID0gZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICBpZiAoYW1vdW50ID09PSB2b2lkIDApIHsgYW1vdW50ID0gMTA7IH1cbiAgICAgICAgdmFyIGhzbCA9IHRoaXMudG9Ic2woKTtcbiAgICAgICAgaHNsLmwgKz0gYW1vdW50IC8gMTAwO1xuICAgICAgICBoc2wubCA9IGNsYW1wMDEoaHNsLmwpO1xuICAgICAgICByZXR1cm4gbmV3IFRpbnlDb2xvcihoc2wpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnJpZ2h0ZW4gdGhlIGNvbG9yIGEgZ2l2ZW4gYW1vdW50LCBmcm9tIDAgdG8gMTAwLlxuICAgICAqIEBwYXJhbSBhbW91bnQgLSB2YWxpZCBiZXR3ZWVuIDEtMTAwXG4gICAgICovXG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS5icmlnaHRlbiA9IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgaWYgKGFtb3VudCA9PT0gdm9pZCAwKSB7IGFtb3VudCA9IDEwOyB9XG4gICAgICAgIHZhciByZ2IgPSB0aGlzLnRvUmdiKCk7XG4gICAgICAgIHJnYi5yID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCByZ2IuciAtIE1hdGgucm91bmQoMjU1ICogLShhbW91bnQgLyAxMDApKSkpO1xuICAgICAgICByZ2IuZyA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgcmdiLmcgLSBNYXRoLnJvdW5kKDI1NSAqIC0oYW1vdW50IC8gMTAwKSkpKTtcbiAgICAgICAgcmdiLmIgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIHJnYi5iIC0gTWF0aC5yb3VuZCgyNTUgKiAtKGFtb3VudCAvIDEwMCkpKSk7XG4gICAgICAgIHJldHVybiBuZXcgVGlueUNvbG9yKHJnYik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEYXJrZW4gdGhlIGNvbG9yIGEgZ2l2ZW4gYW1vdW50LCBmcm9tIDAgdG8gMTAwLlxuICAgICAqIFByb3ZpZGluZyAxMDAgd2lsbCBhbHdheXMgcmV0dXJuIGJsYWNrLlxuICAgICAqIEBwYXJhbSBhbW91bnQgLSB2YWxpZCBiZXR3ZWVuIDEtMTAwXG4gICAgICovXG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS5kYXJrZW4gPSBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgIGlmIChhbW91bnQgPT09IHZvaWQgMCkgeyBhbW91bnQgPSAxMDsgfVxuICAgICAgICB2YXIgaHNsID0gdGhpcy50b0hzbCgpO1xuICAgICAgICBoc2wubCAtPSBhbW91bnQgLyAxMDA7XG4gICAgICAgIGhzbC5sID0gY2xhbXAwMShoc2wubCk7XG4gICAgICAgIHJldHVybiBuZXcgVGlueUNvbG9yKGhzbCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBNaXggdGhlIGNvbG9yIHdpdGggcHVyZSB3aGl0ZSwgZnJvbSAwIHRvIDEwMC5cbiAgICAgKiBQcm92aWRpbmcgMCB3aWxsIGRvIG5vdGhpbmcsIHByb3ZpZGluZyAxMDAgd2lsbCBhbHdheXMgcmV0dXJuIHdoaXRlLlxuICAgICAqIEBwYXJhbSBhbW91bnQgLSB2YWxpZCBiZXR3ZWVuIDEtMTAwXG4gICAgICovXG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS50aW50ID0gZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICBpZiAoYW1vdW50ID09PSB2b2lkIDApIHsgYW1vdW50ID0gMTA7IH1cbiAgICAgICAgcmV0dXJuIHRoaXMubWl4KCd3aGl0ZScsIGFtb3VudCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBNaXggdGhlIGNvbG9yIHdpdGggcHVyZSBibGFjaywgZnJvbSAwIHRvIDEwMC5cbiAgICAgKiBQcm92aWRpbmcgMCB3aWxsIGRvIG5vdGhpbmcsIHByb3ZpZGluZyAxMDAgd2lsbCBhbHdheXMgcmV0dXJuIGJsYWNrLlxuICAgICAqIEBwYXJhbSBhbW91bnQgLSB2YWxpZCBiZXR3ZWVuIDEtMTAwXG4gICAgICovXG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS5zaGFkZSA9IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgaWYgKGFtb3VudCA9PT0gdm9pZCAwKSB7IGFtb3VudCA9IDEwOyB9XG4gICAgICAgIHJldHVybiB0aGlzLm1peCgnYmxhY2snLCBhbW91bnQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRGVzYXR1cmF0ZSB0aGUgY29sb3IgYSBnaXZlbiBhbW91bnQsIGZyb20gMCB0byAxMDAuXG4gICAgICogUHJvdmlkaW5nIDEwMCB3aWxsIGlzIHRoZSBzYW1lIGFzIGNhbGxpbmcgZ3JleXNjYWxlXG4gICAgICogQHBhcmFtIGFtb3VudCAtIHZhbGlkIGJldHdlZW4gMS0xMDBcbiAgICAgKi9cbiAgICBUaW55Q29sb3IucHJvdG90eXBlLmRlc2F0dXJhdGUgPSBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgIGlmIChhbW91bnQgPT09IHZvaWQgMCkgeyBhbW91bnQgPSAxMDsgfVxuICAgICAgICB2YXIgaHNsID0gdGhpcy50b0hzbCgpO1xuICAgICAgICBoc2wucyAtPSBhbW91bnQgLyAxMDA7XG4gICAgICAgIGhzbC5zID0gY2xhbXAwMShoc2wucyk7XG4gICAgICAgIHJldHVybiBuZXcgVGlueUNvbG9yKGhzbCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTYXR1cmF0ZSB0aGUgY29sb3IgYSBnaXZlbiBhbW91bnQsIGZyb20gMCB0byAxMDAuXG4gICAgICogQHBhcmFtIGFtb3VudCAtIHZhbGlkIGJldHdlZW4gMS0xMDBcbiAgICAgKi9cbiAgICBUaW55Q29sb3IucHJvdG90eXBlLnNhdHVyYXRlID0gZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICBpZiAoYW1vdW50ID09PSB2b2lkIDApIHsgYW1vdW50ID0gMTA7IH1cbiAgICAgICAgdmFyIGhzbCA9IHRoaXMudG9Ic2woKTtcbiAgICAgICAgaHNsLnMgKz0gYW1vdW50IC8gMTAwO1xuICAgICAgICBoc2wucyA9IGNsYW1wMDEoaHNsLnMpO1xuICAgICAgICByZXR1cm4gbmV3IFRpbnlDb2xvcihoc2wpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29tcGxldGVseSBkZXNhdHVyYXRlcyBhIGNvbG9yIGludG8gZ3JleXNjYWxlLlxuICAgICAqIFNhbWUgYXMgY2FsbGluZyBgZGVzYXR1cmF0ZSgxMDApYFxuICAgICAqL1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUuZ3JleXNjYWxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kZXNhdHVyYXRlKDEwMCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTcGluIHRha2VzIGEgcG9zaXRpdmUgb3IgbmVnYXRpdmUgYW1vdW50IHdpdGhpbiBbLTM2MCwgMzYwXSBpbmRpY2F0aW5nIHRoZSBjaGFuZ2Ugb2YgaHVlLlxuICAgICAqIFZhbHVlcyBvdXRzaWRlIG9mIHRoaXMgcmFuZ2Ugd2lsbCBiZSB3cmFwcGVkIGludG8gdGhpcyByYW5nZS5cbiAgICAgKi9cbiAgICBUaW55Q29sb3IucHJvdG90eXBlLnNwaW4gPSBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgIHZhciBoc2wgPSB0aGlzLnRvSHNsKCk7XG4gICAgICAgIHZhciBodWUgPSAoaHNsLmggKyBhbW91bnQpICUgMzYwO1xuICAgICAgICBoc2wuaCA9IGh1ZSA8IDAgPyAzNjAgKyBodWUgOiBodWU7XG4gICAgICAgIHJldHVybiBuZXcgVGlueUNvbG9yKGhzbCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBNaXggdGhlIGN1cnJlbnQgY29sb3IgYSBnaXZlbiBhbW91bnQgd2l0aCBhbm90aGVyIGNvbG9yLCBmcm9tIDAgdG8gMTAwLlxuICAgICAqIDAgbWVhbnMgbm8gbWl4aW5nIChyZXR1cm4gY3VycmVudCBjb2xvcikuXG4gICAgICovXG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS5taXggPSBmdW5jdGlvbiAoY29sb3IsIGFtb3VudCkge1xuICAgICAgICBpZiAoYW1vdW50ID09PSB2b2lkIDApIHsgYW1vdW50ID0gNTA7IH1cbiAgICAgICAgdmFyIHJnYjEgPSB0aGlzLnRvUmdiKCk7XG4gICAgICAgIHZhciByZ2IyID0gbmV3IFRpbnlDb2xvcihjb2xvcikudG9SZ2IoKTtcbiAgICAgICAgdmFyIHAgPSBhbW91bnQgLyAxMDA7XG4gICAgICAgIHZhciByZ2JhID0ge1xuICAgICAgICAgICAgcjogKHJnYjIuciAtIHJnYjEucikgKiBwICsgcmdiMS5yLFxuICAgICAgICAgICAgZzogKHJnYjIuZyAtIHJnYjEuZykgKiBwICsgcmdiMS5nLFxuICAgICAgICAgICAgYjogKHJnYjIuYiAtIHJnYjEuYikgKiBwICsgcmdiMS5iLFxuICAgICAgICAgICAgYTogKHJnYjIuYSAtIHJnYjEuYSkgKiBwICsgcmdiMS5hLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbmV3IFRpbnlDb2xvcihyZ2JhKTtcbiAgICB9O1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUuYW5hbG9nb3VzID0gZnVuY3Rpb24gKHJlc3VsdHMsIHNsaWNlcykge1xuICAgICAgICBpZiAocmVzdWx0cyA9PT0gdm9pZCAwKSB7IHJlc3VsdHMgPSA2OyB9XG4gICAgICAgIGlmIChzbGljZXMgPT09IHZvaWQgMCkgeyBzbGljZXMgPSAzMDsgfVxuICAgICAgICB2YXIgaHNsID0gdGhpcy50b0hzbCgpO1xuICAgICAgICB2YXIgcGFydCA9IDM2MCAvIHNsaWNlcztcbiAgICAgICAgdmFyIHJldCA9IFt0aGlzXTtcbiAgICAgICAgZm9yIChoc2wuaCA9IChoc2wuaCAtICgocGFydCAqIHJlc3VsdHMpID4+IDEpICsgNzIwKSAlIDM2MDsgLS1yZXN1bHRzOykge1xuICAgICAgICAgICAgaHNsLmggPSAoaHNsLmggKyBwYXJ0KSAlIDM2MDtcbiAgICAgICAgICAgIHJldC5wdXNoKG5ldyBUaW55Q29sb3IoaHNsKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIHRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2luZnVzaW9uL2pRdWVyeS14Y29sb3IvYmxvYi9tYXN0ZXIvanF1ZXJ5Lnhjb2xvci5qc1xuICAgICAqL1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUuY29tcGxlbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGhzbCA9IHRoaXMudG9Ic2woKTtcbiAgICAgICAgaHNsLmggPSAoaHNsLmggKyAxODApICUgMzYwO1xuICAgICAgICByZXR1cm4gbmV3IFRpbnlDb2xvcihoc2wpO1xuICAgIH07XG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS5tb25vY2hyb21hdGljID0gZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgICAgaWYgKHJlc3VsdHMgPT09IHZvaWQgMCkgeyByZXN1bHRzID0gNjsgfVxuICAgICAgICB2YXIgaHN2ID0gdGhpcy50b0hzdigpO1xuICAgICAgICB2YXIgaCA9IGhzdi5oO1xuICAgICAgICB2YXIgcyA9IGhzdi5zO1xuICAgICAgICB2YXIgdiA9IGhzdi52O1xuICAgICAgICB2YXIgcmVzID0gW107XG4gICAgICAgIHZhciBtb2RpZmljYXRpb24gPSAxIC8gcmVzdWx0cztcbiAgICAgICAgd2hpbGUgKHJlc3VsdHMtLSkge1xuICAgICAgICAgICAgcmVzLnB1c2gobmV3IFRpbnlDb2xvcih7IGg6IGgsIHM6IHMsIHY6IHYgfSkpO1xuICAgICAgICAgICAgdiA9ICh2ICsgbW9kaWZpY2F0aW9uKSAlIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUuc3BsaXRjb21wbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaHNsID0gdGhpcy50b0hzbCgpO1xuICAgICAgICB2YXIgaCA9IGhzbC5oO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIG5ldyBUaW55Q29sb3IoeyBoOiAoaCArIDcyKSAlIDM2MCwgczogaHNsLnMsIGw6IGhzbC5sIH0pLFxuICAgICAgICAgICAgbmV3IFRpbnlDb2xvcih7IGg6IChoICsgMjE2KSAlIDM2MCwgczogaHNsLnMsIGw6IGhzbC5sIH0pLFxuICAgICAgICBdO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZSBob3cgdGhlIGNvbG9yIHdvdWxkIGFwcGVhciBvbiBhIGJhY2tncm91bmRcbiAgICAgKi9cbiAgICBUaW55Q29sb3IucHJvdG90eXBlLm9uQmFja2dyb3VuZCA9IGZ1bmN0aW9uIChiYWNrZ3JvdW5kKSB7XG4gICAgICAgIHZhciBmZyA9IHRoaXMudG9SZ2IoKTtcbiAgICAgICAgdmFyIGJnID0gbmV3IFRpbnlDb2xvcihiYWNrZ3JvdW5kKS50b1JnYigpO1xuICAgICAgICB2YXIgYWxwaGEgPSBmZy5hICsgYmcuYSAqICgxIC0gZmcuYSk7XG4gICAgICAgIHJldHVybiBuZXcgVGlueUNvbG9yKHtcbiAgICAgICAgICAgIHI6IChmZy5yICogZmcuYSArIGJnLnIgKiBiZy5hICogKDEgLSBmZy5hKSkgLyBhbHBoYSxcbiAgICAgICAgICAgIGc6IChmZy5nICogZmcuYSArIGJnLmcgKiBiZy5hICogKDEgLSBmZy5hKSkgLyBhbHBoYSxcbiAgICAgICAgICAgIGI6IChmZy5iICogZmcuYSArIGJnLmIgKiBiZy5hICogKDEgLSBmZy5hKSkgLyBhbHBoYSxcbiAgICAgICAgICAgIGE6IGFscGhhLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBgcG9seWFkKDMpYFxuICAgICAqL1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUudHJpYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvbHlhZCgzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBgcG9seWFkKDQpYFxuICAgICAqL1xuICAgIFRpbnlDb2xvci5wcm90b3R5cGUudGV0cmFkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wb2x5YWQoNCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgcG9seWFkIGNvbG9ycywgbGlrZSAoZm9yIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIGV0Yy4uLilcbiAgICAgKiBtb25hZCwgZHlhZCwgdHJpYWQsIHRldHJhZCwgcGVudGFkLCBoZXhhZCwgaGVwdGFkLCBvY3RhZCwgZXRjLi4uXG4gICAgICovXG4gICAgVGlueUNvbG9yLnByb3RvdHlwZS5wb2x5YWQgPSBmdW5jdGlvbiAobikge1xuICAgICAgICB2YXIgaHNsID0gdGhpcy50b0hzbCgpO1xuICAgICAgICB2YXIgaCA9IGhzbC5oO1xuICAgICAgICB2YXIgcmVzdWx0ID0gW3RoaXNdO1xuICAgICAgICB2YXIgaW5jcmVtZW50ID0gMzYwIC8gbjtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBUaW55Q29sb3IoeyBoOiAoaCArIGkgKiBpbmNyZW1lbnQpICUgMzYwLCBzOiBoc2wucywgbDogaHNsLmwgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBjb21wYXJlIGNvbG9yIHZzIGN1cnJlbnQgY29sb3JcbiAgICAgKi9cbiAgICBUaW55Q29sb3IucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIChjb2xvcikge1xuICAgICAgICByZXR1cm4gdGhpcy50b1JnYlN0cmluZygpID09PSBuZXcgVGlueUNvbG9yKGNvbG9yKS50b1JnYlN0cmluZygpO1xuICAgIH07XG4gICAgcmV0dXJuIFRpbnlDb2xvcjtcbn0oKSk7XG5leHBvcnQgeyBUaW55Q29sb3IgfTtcbi8vIGtlcHQgZm9yIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5IHdpdGggdjFcbmV4cG9ydCBmdW5jdGlvbiB0aW55Y29sb3IoY29sb3IsIG9wdHMpIHtcbiAgICBpZiAoY29sb3IgPT09IHZvaWQgMCkgeyBjb2xvciA9ICcnOyB9XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkgeyBvcHRzID0ge307IH1cbiAgICByZXR1cm4gbmV3IFRpbnlDb2xvcihjb2xvciwgb3B0cyk7XG59XG4iLCJpbXBvcnQgeyBpbnB1dFRvUkdCLCByZ2JUb0hleCwgcmdiVG9Ic3YgfSBmcm9tICdAY3RybC90aW55Y29sb3InO1xuXG52YXIgaHVlU3RlcCA9IDI7IC8vIOiJsuebuOmYtuair1xuXG52YXIgc2F0dXJhdGlvblN0ZXAgPSAwLjE2OyAvLyDppbHlkozluqbpmLbmoq/vvIzmtYXoibLpg6jliIZcblxudmFyIHNhdHVyYXRpb25TdGVwMiA9IDAuMDU7IC8vIOmlseWSjOW6pumYtuair++8jOa3seiJsumDqOWIhlxuXG52YXIgYnJpZ2h0bmVzc1N0ZXAxID0gMC4wNTsgLy8g5Lqu5bqm6Zi25qKv77yM5rWF6Imy6YOo5YiGXG5cbnZhciBicmlnaHRuZXNzU3RlcDIgPSAwLjE1OyAvLyDkuq7luqbpmLbmoq/vvIzmt7HoibLpg6jliIZcblxudmFyIGxpZ2h0Q29sb3JDb3VudCA9IDU7IC8vIOa1heiJsuaVsOmHj++8jOS4u+iJsuS4ilxuXG52YXIgZGFya0NvbG9yQ291bnQgPSA0OyAvLyDmt7HoibLmlbDph4/vvIzkuLvoibLkuItcbi8vIOaal+iJsuS4u+mimOminOiJsuaYoOWwhOWFs+ezu+ihqFxuXG52YXIgZGFya0NvbG9yTWFwID0gW3tcbiAgaW5kZXg6IDcsXG4gIG9wYWNpdHk6IDAuMTVcbn0sIHtcbiAgaW5kZXg6IDYsXG4gIG9wYWNpdHk6IDAuMjVcbn0sIHtcbiAgaW5kZXg6IDUsXG4gIG9wYWNpdHk6IDAuM1xufSwge1xuICBpbmRleDogNSxcbiAgb3BhY2l0eTogMC40NVxufSwge1xuICBpbmRleDogNSxcbiAgb3BhY2l0eTogMC42NVxufSwge1xuICBpbmRleDogNSxcbiAgb3BhY2l0eTogMC44NVxufSwge1xuICBpbmRleDogNCxcbiAgb3BhY2l0eTogMC45XG59LCB7XG4gIGluZGV4OiAzLFxuICBvcGFjaXR5OiAwLjk1XG59LCB7XG4gIGluZGV4OiAyLFxuICBvcGFjaXR5OiAwLjk3XG59LCB7XG4gIGluZGV4OiAxLFxuICBvcGFjaXR5OiAwLjk4XG59XTsgLy8gV3JhcHBlciBmdW5jdGlvbiBwb3J0ZWQgZnJvbSBUaW55Q29sb3IucHJvdG90eXBlLnRvSHN2XG4vLyBLZWVwIGl0IGhlcmUgYmVjYXVzZSBvZiBgaHN2LmggKiAzNjBgXG5cbmZ1bmN0aW9uIHRvSHN2KF9yZWYpIHtcbiAgdmFyIHIgPSBfcmVmLnIsXG4gICAgICBnID0gX3JlZi5nLFxuICAgICAgYiA9IF9yZWYuYjtcbiAgdmFyIGhzdiA9IHJnYlRvSHN2KHIsIGcsIGIpO1xuICByZXR1cm4ge1xuICAgIGg6IGhzdi5oICogMzYwLFxuICAgIHM6IGhzdi5zLFxuICAgIHY6IGhzdi52XG4gIH07XG59IC8vIFdyYXBwZXIgZnVuY3Rpb24gcG9ydGVkIGZyb20gVGlueUNvbG9yLnByb3RvdHlwZS50b0hleFN0cmluZ1xuLy8gS2VlcCBpdCBoZXJlIGJlY2F1c2Ugb2YgdGhlIHByZWZpeCBgI2BcblxuXG5mdW5jdGlvbiB0b0hleChfcmVmMikge1xuICB2YXIgciA9IF9yZWYyLnIsXG4gICAgICBnID0gX3JlZjIuZyxcbiAgICAgIGIgPSBfcmVmMi5iO1xuICByZXR1cm4gXCIjXCIuY29uY2F0KHJnYlRvSGV4KHIsIGcsIGIsIGZhbHNlKSk7XG59IC8vIFdyYXBwZXIgZnVuY3Rpb24gcG9ydGVkIGZyb20gVGlueUNvbG9yLnByb3RvdHlwZS5taXgsIG5vdCB0cmVlc2hha2FibGUuXG4vLyBBbW91bnQgaW4gcmFuZ2UgWzAsIDFdXG4vLyBBc3N1bWUgY29sb3IxICYgY29sb3IyIGhhcyBubyBhbHBoYSwgc2luY2UgdGhlIGZvbGxvd2luZyBzcmMgY29kZSBkaWQgc28uXG5cblxuZnVuY3Rpb24gbWl4KHJnYjEsIHJnYjIsIGFtb3VudCkge1xuICB2YXIgcCA9IGFtb3VudCAvIDEwMDtcbiAgdmFyIHJnYiA9IHtcbiAgICByOiAocmdiMi5yIC0gcmdiMS5yKSAqIHAgKyByZ2IxLnIsXG4gICAgZzogKHJnYjIuZyAtIHJnYjEuZykgKiBwICsgcmdiMS5nLFxuICAgIGI6IChyZ2IyLmIgLSByZ2IxLmIpICogcCArIHJnYjEuYlxuICB9O1xuICByZXR1cm4gcmdiO1xufVxuXG5mdW5jdGlvbiBnZXRIdWUoaHN2LCBpLCBsaWdodCkge1xuICB2YXIgaHVlOyAvLyDmoLnmja7oibLnm7jkuI3lkIzvvIzoibLnm7jovazlkJHkuI3lkIxcblxuICBpZiAoTWF0aC5yb3VuZChoc3YuaCkgPj0gNjAgJiYgTWF0aC5yb3VuZChoc3YuaCkgPD0gMjQwKSB7XG4gICAgaHVlID0gbGlnaHQgPyBNYXRoLnJvdW5kKGhzdi5oKSAtIGh1ZVN0ZXAgKiBpIDogTWF0aC5yb3VuZChoc3YuaCkgKyBodWVTdGVwICogaTtcbiAgfSBlbHNlIHtcbiAgICBodWUgPSBsaWdodCA/IE1hdGgucm91bmQoaHN2LmgpICsgaHVlU3RlcCAqIGkgOiBNYXRoLnJvdW5kKGhzdi5oKSAtIGh1ZVN0ZXAgKiBpO1xuICB9XG5cbiAgaWYgKGh1ZSA8IDApIHtcbiAgICBodWUgKz0gMzYwO1xuICB9IGVsc2UgaWYgKGh1ZSA+PSAzNjApIHtcbiAgICBodWUgLT0gMzYwO1xuICB9XG5cbiAgcmV0dXJuIGh1ZTtcbn1cblxuZnVuY3Rpb24gZ2V0U2F0dXJhdGlvbihoc3YsIGksIGxpZ2h0KSB7XG4gIC8vIGdyZXkgY29sb3IgZG9uJ3QgY2hhbmdlIHNhdHVyYXRpb25cbiAgaWYgKGhzdi5oID09PSAwICYmIGhzdi5zID09PSAwKSB7XG4gICAgcmV0dXJuIGhzdi5zO1xuICB9XG5cbiAgdmFyIHNhdHVyYXRpb247XG5cbiAgaWYgKGxpZ2h0KSB7XG4gICAgc2F0dXJhdGlvbiA9IGhzdi5zIC0gc2F0dXJhdGlvblN0ZXAgKiBpO1xuICB9IGVsc2UgaWYgKGkgPT09IGRhcmtDb2xvckNvdW50KSB7XG4gICAgc2F0dXJhdGlvbiA9IGhzdi5zICsgc2F0dXJhdGlvblN0ZXA7XG4gIH0gZWxzZSB7XG4gICAgc2F0dXJhdGlvbiA9IGhzdi5zICsgc2F0dXJhdGlvblN0ZXAyICogaTtcbiAgfSAvLyDovrnnlYzlgLzkv67mraNcblxuXG4gIGlmIChzYXR1cmF0aW9uID4gMSkge1xuICAgIHNhdHVyYXRpb24gPSAxO1xuICB9IC8vIOesrOS4gOagvOeahCBzIOmZkOWItuWcqCAwLjA2LTAuMSDkuYvpl7RcblxuXG4gIGlmIChsaWdodCAmJiBpID09PSBsaWdodENvbG9yQ291bnQgJiYgc2F0dXJhdGlvbiA+IDAuMSkge1xuICAgIHNhdHVyYXRpb24gPSAwLjE7XG4gIH1cblxuICBpZiAoc2F0dXJhdGlvbiA8IDAuMDYpIHtcbiAgICBzYXR1cmF0aW9uID0gMC4wNjtcbiAgfVxuXG4gIHJldHVybiBOdW1iZXIoc2F0dXJhdGlvbi50b0ZpeGVkKDIpKTtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWUoaHN2LCBpLCBsaWdodCkge1xuICB2YXIgdmFsdWU7XG5cbiAgaWYgKGxpZ2h0KSB7XG4gICAgdmFsdWUgPSBoc3YudiArIGJyaWdodG5lc3NTdGVwMSAqIGk7XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSBoc3YudiAtIGJyaWdodG5lc3NTdGVwMiAqIGk7XG4gIH1cblxuICBpZiAodmFsdWUgPiAxKSB7XG4gICAgdmFsdWUgPSAxO1xuICB9XG5cbiAgcmV0dXJuIE51bWJlcih2YWx1ZS50b0ZpeGVkKDIpKTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGUoY29sb3IpIHtcbiAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICB2YXIgcGF0dGVybnMgPSBbXTtcbiAgdmFyIHBDb2xvciA9IGlucHV0VG9SR0IoY29sb3IpO1xuXG4gIGZvciAodmFyIGkgPSBsaWdodENvbG9yQ291bnQ7IGkgPiAwOyBpIC09IDEpIHtcbiAgICB2YXIgaHN2ID0gdG9Ic3YocENvbG9yKTtcbiAgICB2YXIgY29sb3JTdHJpbmcgPSB0b0hleChpbnB1dFRvUkdCKHtcbiAgICAgIGg6IGdldEh1ZShoc3YsIGksIHRydWUpLFxuICAgICAgczogZ2V0U2F0dXJhdGlvbihoc3YsIGksIHRydWUpLFxuICAgICAgdjogZ2V0VmFsdWUoaHN2LCBpLCB0cnVlKVxuICAgIH0pKTtcbiAgICBwYXR0ZXJucy5wdXNoKGNvbG9yU3RyaW5nKTtcbiAgfVxuXG4gIHBhdHRlcm5zLnB1c2godG9IZXgocENvbG9yKSk7XG5cbiAgZm9yICh2YXIgX2kgPSAxOyBfaSA8PSBkYXJrQ29sb3JDb3VudDsgX2kgKz0gMSkge1xuICAgIHZhciBfaHN2ID0gdG9Ic3YocENvbG9yKTtcblxuICAgIHZhciBfY29sb3JTdHJpbmcgPSB0b0hleChpbnB1dFRvUkdCKHtcbiAgICAgIGg6IGdldEh1ZShfaHN2LCBfaSksXG4gICAgICBzOiBnZXRTYXR1cmF0aW9uKF9oc3YsIF9pKSxcbiAgICAgIHY6IGdldFZhbHVlKF9oc3YsIF9pKVxuICAgIH0pKTtcblxuICAgIHBhdHRlcm5zLnB1c2goX2NvbG9yU3RyaW5nKTtcbiAgfSAvLyBkYXJrIHRoZW1lIHBhdHRlcm5zXG5cblxuICBpZiAob3B0cy50aGVtZSA9PT0gJ2RhcmsnKSB7XG4gICAgcmV0dXJuIGRhcmtDb2xvck1hcC5tYXAoZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgICB2YXIgaW5kZXggPSBfcmVmMy5pbmRleCxcbiAgICAgICAgICBvcGFjaXR5ID0gX3JlZjMub3BhY2l0eTtcbiAgICAgIHZhciBkYXJrQ29sb3JTdHJpbmcgPSB0b0hleChtaXgoaW5wdXRUb1JHQihvcHRzLmJhY2tncm91bmRDb2xvciB8fCAnIzE0MTQxNCcpLCBpbnB1dFRvUkdCKHBhdHRlcm5zW2luZGV4XSksIG9wYWNpdHkgKiAxMDApKTtcbiAgICAgIHJldHVybiBkYXJrQ29sb3JTdHJpbmc7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcGF0dGVybnM7XG59XG5cbnZhciBwcmVzZXRQcmltYXJ5Q29sb3JzID0ge1xuICByZWQ6ICcjRjUyMjJEJyxcbiAgdm9sY2FubzogJyNGQTU0MUMnLFxuICBvcmFuZ2U6ICcjRkE4QzE2JyxcbiAgZ29sZDogJyNGQUFEMTQnLFxuICB5ZWxsb3c6ICcjRkFEQjE0JyxcbiAgbGltZTogJyNBMEQ5MTEnLFxuICBncmVlbjogJyM1MkM0MUEnLFxuICBjeWFuOiAnIzEzQzJDMicsXG4gIGJsdWU6ICcjMTg5MEZGJyxcbiAgZ2Vla2JsdWU6ICcjMkY1NEVCJyxcbiAgcHVycGxlOiAnIzcyMkVEMScsXG4gIG1hZ2VudGE6ICcjRUIyRjk2JyxcbiAgZ3JleTogJyM2NjY2NjYnXG59O1xudmFyIHByZXNldFBhbGV0dGVzID0ge307XG52YXIgcHJlc2V0RGFya1BhbGV0dGVzID0ge307XG5PYmplY3Qua2V5cyhwcmVzZXRQcmltYXJ5Q29sb3JzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgcHJlc2V0UGFsZXR0ZXNba2V5XSA9IGdlbmVyYXRlKHByZXNldFByaW1hcnlDb2xvcnNba2V5XSk7XG4gIHByZXNldFBhbGV0dGVzW2tleV0ucHJpbWFyeSA9IHByZXNldFBhbGV0dGVzW2tleV1bNV07IC8vIGRhcmsgcHJlc2V0UGFsZXR0ZXNcblxuICBwcmVzZXREYXJrUGFsZXR0ZXNba2V5XSA9IGdlbmVyYXRlKHByZXNldFByaW1hcnlDb2xvcnNba2V5XSwge1xuICAgIHRoZW1lOiAnZGFyaycsXG4gICAgYmFja2dyb3VuZENvbG9yOiAnIzE0MTQxNCdcbiAgfSk7XG4gIHByZXNldERhcmtQYWxldHRlc1trZXldLnByaW1hcnkgPSBwcmVzZXREYXJrUGFsZXR0ZXNba2V5XVs1XTtcbn0pO1xudmFyIHJlZCA9IHByZXNldFBhbGV0dGVzLnJlZDtcbnZhciB2b2xjYW5vID0gcHJlc2V0UGFsZXR0ZXMudm9sY2FubztcbnZhciBnb2xkID0gcHJlc2V0UGFsZXR0ZXMuZ29sZDtcbnZhciBvcmFuZ2UgPSBwcmVzZXRQYWxldHRlcy5vcmFuZ2U7XG52YXIgeWVsbG93ID0gcHJlc2V0UGFsZXR0ZXMueWVsbG93O1xudmFyIGxpbWUgPSBwcmVzZXRQYWxldHRlcy5saW1lO1xudmFyIGdyZWVuID0gcHJlc2V0UGFsZXR0ZXMuZ3JlZW47XG52YXIgY3lhbiA9IHByZXNldFBhbGV0dGVzLmN5YW47XG52YXIgYmx1ZSA9IHByZXNldFBhbGV0dGVzLmJsdWU7XG52YXIgZ2Vla2JsdWUgPSBwcmVzZXRQYWxldHRlcy5nZWVrYmx1ZTtcbnZhciBwdXJwbGUgPSBwcmVzZXRQYWxldHRlcy5wdXJwbGU7XG52YXIgbWFnZW50YSA9IHByZXNldFBhbGV0dGVzLm1hZ2VudGE7XG52YXIgZ3JleSA9IHByZXNldFBhbGV0dGVzLmdyZXk7XG5cbmV4cG9ydCB7IGJsdWUsIGN5YW4sIGdlZWtibHVlLCBnZW5lcmF0ZSwgZ29sZCwgZ3JlZW4sIGdyZXksIGxpbWUsIG1hZ2VudGEsIG9yYW5nZSwgcHJlc2V0RGFya1BhbGV0dGVzLCBwcmVzZXRQYWxldHRlcywgcHJlc2V0UHJpbWFyeUNvbG9ycywgcHVycGxlLCByZWQsIHZvbGNhbm8sIHllbGxvdyB9O1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2FuVXNlRG9tKCkge1xuICByZXR1cm4gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50ICYmIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb250YWlucyhyb290LCBuKSB7XG4gIGlmICghcm9vdCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFVzZSBuYXRpdmUgaWYgc3VwcG9ydFxuICBpZiAocm9vdC5jb250YWlucykge1xuICAgIHJldHVybiByb290LmNvbnRhaW5zKG4pO1xuICB9XG5cbiAgLy8gYGRvY3VtZW50LmNvbnRhaW5zYCBub3Qgc3VwcG9ydCB3aXRoIElFMTFcbiAgdmFyIG5vZGUgPSBuO1xuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlID09PSByb290KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59IiwiaW1wb3J0IGNhblVzZURvbSBmcm9tIFwiLi9jYW5Vc2VEb21cIjtcbmltcG9ydCBjb250YWlucyBmcm9tIFwiLi9jb250YWluc1wiO1xudmFyIEFQUEVORF9PUkRFUiA9ICdkYXRhLXJjLW9yZGVyJztcbnZhciBNQVJLX0tFWSA9IFwicmMtdXRpbC1rZXlcIjtcbnZhciBjb250YWluZXJDYWNoZSA9IG5ldyBNYXAoKTtcbmZ1bmN0aW9uIGdldE1hcmsoKSB7XG4gIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSxcbiAgICBtYXJrID0gX3JlZi5tYXJrO1xuICBpZiAobWFyaykge1xuICAgIHJldHVybiBtYXJrLnN0YXJ0c1dpdGgoJ2RhdGEtJykgPyBtYXJrIDogXCJkYXRhLVwiLmNvbmNhdChtYXJrKTtcbiAgfVxuICByZXR1cm4gTUFSS19LRVk7XG59XG5mdW5jdGlvbiBnZXRDb250YWluZXIob3B0aW9uKSB7XG4gIGlmIChvcHRpb24uYXR0YWNoVG8pIHtcbiAgICByZXR1cm4gb3B0aW9uLmF0dGFjaFRvO1xuICB9XG4gIHZhciBoZWFkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaGVhZCcpO1xuICByZXR1cm4gaGVhZCB8fCBkb2N1bWVudC5ib2R5O1xufVxuZnVuY3Rpb24gZ2V0T3JkZXIocHJlcGVuZCkge1xuICBpZiAocHJlcGVuZCA9PT0gJ3F1ZXVlJykge1xuICAgIHJldHVybiAncHJlcGVuZFF1ZXVlJztcbiAgfVxuICByZXR1cm4gcHJlcGVuZCA/ICdwcmVwZW5kJyA6ICdhcHBlbmQnO1xufVxuXG4vKipcbiAqIEZpbmQgc3R5bGUgd2hpY2ggaW5qZWN0IGJ5IHJjLXV0aWxcbiAqL1xuZnVuY3Rpb24gZmluZFN0eWxlcyhjb250YWluZXIpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20oKGNvbnRhaW5lckNhY2hlLmdldChjb250YWluZXIpIHx8IGNvbnRhaW5lcikuY2hpbGRyZW4pLmZpbHRlcihmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiBub2RlLnRhZ05hbWUgPT09ICdTVFlMRSc7XG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdENTUyhjc3MpIHtcbiAgdmFyIG9wdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gIGlmICghY2FuVXNlRG9tKCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgY3NwID0gb3B0aW9uLmNzcCxcbiAgICBwcmVwZW5kID0gb3B0aW9uLnByZXBlbmQ7XG4gIHZhciBzdHlsZU5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICBzdHlsZU5vZGUuc2V0QXR0cmlidXRlKEFQUEVORF9PUkRFUiwgZ2V0T3JkZXIocHJlcGVuZCkpO1xuICBpZiAoY3NwICE9PSBudWxsICYmIGNzcCAhPT0gdm9pZCAwICYmIGNzcC5ub25jZSkge1xuICAgIHN0eWxlTm9kZS5ub25jZSA9IGNzcCA9PT0gbnVsbCB8fCBjc3AgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNzcC5ub25jZTtcbiAgfVxuICBzdHlsZU5vZGUuaW5uZXJIVE1MID0gY3NzO1xuICB2YXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKG9wdGlvbik7XG4gIHZhciBmaXJzdENoaWxkID0gY29udGFpbmVyLmZpcnN0Q2hpbGQ7XG4gIGlmIChwcmVwZW5kKSB7XG4gICAgLy8gSWYgaXMgcXVldWUgYHByZXBlbmRgLCBpdCB3aWxsIHByZXBlbmQgZmlyc3Qgc3R5bGUgYW5kIHRoZW4gYXBwZW5kIHJlc3Qgc3R5bGVcbiAgICBpZiAocHJlcGVuZCA9PT0gJ3F1ZXVlJykge1xuICAgICAgdmFyIGV4aXN0U3R5bGUgPSBmaW5kU3R5bGVzKGNvbnRhaW5lcikuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHJldHVybiBbJ3ByZXBlbmQnLCAncHJlcGVuZFF1ZXVlJ10uaW5jbHVkZXMobm9kZS5nZXRBdHRyaWJ1dGUoQVBQRU5EX09SREVSKSk7XG4gICAgICB9KTtcbiAgICAgIGlmIChleGlzdFN0eWxlLmxlbmd0aCkge1xuICAgICAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKHN0eWxlTm9kZSwgZXhpc3RTdHlsZVtleGlzdFN0eWxlLmxlbmd0aCAtIDFdLm5leHRTaWJsaW5nKTtcbiAgICAgICAgcmV0dXJuIHN0eWxlTm9kZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVc2UgYGluc2VydEJlZm9yZWAgYXMgYHByZXBlbmRgXG4gICAgY29udGFpbmVyLmluc2VydEJlZm9yZShzdHlsZU5vZGUsIGZpcnN0Q2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChzdHlsZU5vZGUpO1xuICB9XG4gIHJldHVybiBzdHlsZU5vZGU7XG59XG5mdW5jdGlvbiBmaW5kRXhpc3ROb2RlKGtleSkge1xuICB2YXIgb3B0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgdmFyIGNvbnRhaW5lciA9IGdldENvbnRhaW5lcihvcHRpb24pO1xuICByZXR1cm4gZmluZFN0eWxlcyhjb250YWluZXIpLmZpbmQoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUoZ2V0TWFyayhvcHRpb24pKSA9PT0ga2V5O1xuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVDU1Moa2V5KSB7XG4gIHZhciBvcHRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICB2YXIgZXhpc3ROb2RlID0gZmluZEV4aXN0Tm9kZShrZXksIG9wdGlvbik7XG4gIGlmIChleGlzdE5vZGUpIHtcbiAgICB2YXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKG9wdGlvbik7XG4gICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGV4aXN0Tm9kZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBxaWFua3VuIHdpbGwgaW5qZWN0IGBhcHBlbmRDaGlsZGAgdG8gaW5zZXJ0IGludG8gb3RoZXJcbiAqL1xuZnVuY3Rpb24gc3luY1JlYWxDb250YWluZXIoY29udGFpbmVyLCBvcHRpb24pIHtcbiAgdmFyIGNhY2hlZFJlYWxDb250YWluZXIgPSBjb250YWluZXJDYWNoZS5nZXQoY29udGFpbmVyKTtcblxuICAvLyBGaW5kIHJlYWwgY29udGFpbmVyIHdoZW4gbm90IGNhY2hlZCBvciBjYWNoZWQgY29udGFpbmVyIHJlbW92ZWRcbiAgaWYgKCFjYWNoZWRSZWFsQ29udGFpbmVyIHx8ICFjb250YWlucyhkb2N1bWVudCwgY2FjaGVkUmVhbENvbnRhaW5lcikpIHtcbiAgICB2YXIgcGxhY2Vob2xkZXJTdHlsZSA9IGluamVjdENTUygnJywgb3B0aW9uKTtcbiAgICB2YXIgcGFyZW50Tm9kZSA9IHBsYWNlaG9sZGVyU3R5bGUucGFyZW50Tm9kZTtcbiAgICBjb250YWluZXJDYWNoZS5zZXQoY29udGFpbmVyLCBwYXJlbnROb2RlKTtcbiAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQocGxhY2Vob2xkZXJTdHlsZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBtYW51YWxseSBjbGVhciBjb250YWluZXIgY2FjaGUgdG8gYXZvaWQgZ2xvYmFsIGNhY2hlIGluIHVuaXQgdGVzdGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckNvbnRhaW5lckNhY2hlKCkge1xuICBjb250YWluZXJDYWNoZS5jbGVhcigpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUNTUyhjc3MsIGtleSkge1xuICB2YXIgb3B0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgdmFyIGNvbnRhaW5lciA9IGdldENvbnRhaW5lcihvcHRpb24pO1xuXG4gIC8vIFN5bmMgcmVhbCBwYXJlbnRcbiAgc3luY1JlYWxDb250YWluZXIoY29udGFpbmVyLCBvcHRpb24pO1xuICB2YXIgZXhpc3ROb2RlID0gZmluZEV4aXN0Tm9kZShrZXksIG9wdGlvbik7XG4gIGlmIChleGlzdE5vZGUpIHtcbiAgICB2YXIgX29wdGlvbiRjc3AsIF9vcHRpb24kY3NwMjtcbiAgICBpZiAoKF9vcHRpb24kY3NwID0gb3B0aW9uLmNzcCkgIT09IG51bGwgJiYgX29wdGlvbiRjc3AgIT09IHZvaWQgMCAmJiBfb3B0aW9uJGNzcC5ub25jZSAmJiBleGlzdE5vZGUubm9uY2UgIT09ICgoX29wdGlvbiRjc3AyID0gb3B0aW9uLmNzcCkgPT09IG51bGwgfHwgX29wdGlvbiRjc3AyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9uJGNzcDIubm9uY2UpKSB7XG4gICAgICB2YXIgX29wdGlvbiRjc3AzO1xuICAgICAgZXhpc3ROb2RlLm5vbmNlID0gKF9vcHRpb24kY3NwMyA9IG9wdGlvbi5jc3ApID09PSBudWxsIHx8IF9vcHRpb24kY3NwMyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbiRjc3AzLm5vbmNlO1xuICAgIH1cbiAgICBpZiAoZXhpc3ROb2RlLmlubmVySFRNTCAhPT0gY3NzKSB7XG4gICAgICBleGlzdE5vZGUuaW5uZXJIVE1MID0gY3NzO1xuICAgIH1cbiAgICByZXR1cm4gZXhpc3ROb2RlO1xuICB9XG4gIHZhciBuZXdOb2RlID0gaW5qZWN0Q1NTKGNzcywgb3B0aW9uKTtcbiAgbmV3Tm9kZS5zZXRBdHRyaWJ1dGUoZ2V0TWFyayhvcHRpb24pLCBrZXkpO1xuICByZXR1cm4gbmV3Tm9kZTtcbn0iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IHsgZ2VuZXJhdGUgYXMgZ2VuZXJhdGVDb2xvciB9IGZyb20gJ0BhbnQtZGVzaWduL2NvbG9ycyc7XG5pbXBvcnQgUmVhY3QsIHsgdXNlQ29udGV4dCwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHdhcm4gZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0IHsgdXBkYXRlQ1NTIH0gZnJvbSBcInJjLXV0aWwvZXMvRG9tL2R5bmFtaWNDU1NcIjtcbmltcG9ydCBJY29uQ29udGV4dCBmcm9tICcuL2NvbXBvbmVudHMvQ29udGV4dCc7XG5leHBvcnQgZnVuY3Rpb24gd2FybmluZyh2YWxpZCwgbWVzc2FnZSkge1xuICB3YXJuKHZhbGlkLCBcIltAYW50LWRlc2lnbi9pY29uc10gXCIuY29uY2F0KG1lc3NhZ2UpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0ljb25EZWZpbml0aW9uKHRhcmdldCkge1xuICByZXR1cm4gX3R5cGVvZih0YXJnZXQpID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdGFyZ2V0Lm5hbWUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiB0YXJnZXQudGhlbWUgPT09ICdzdHJpbmcnICYmIChfdHlwZW9mKHRhcmdldC5pY29uKSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHRhcmdldC5pY29uID09PSAnZnVuY3Rpb24nKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBdHRycygpIHtcbiAgdmFyIGF0dHJzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGF0dHJzKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywga2V5KSB7XG4gICAgdmFyIHZhbCA9IGF0dHJzW2tleV07XG4gICAgc3dpdGNoIChrZXkpIHtcbiAgICAgIGNhc2UgJ2NsYXNzJzpcbiAgICAgICAgYWNjLmNsYXNzTmFtZSA9IHZhbDtcbiAgICAgICAgZGVsZXRlIGFjYy5jbGFzcztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBhY2Nba2V5XSA9IHZhbDtcbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlKG5vZGUsIGtleSwgcm9vdFByb3BzKSB7XG4gIGlmICghcm9vdFByb3BzKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KG5vZGUudGFnLCBfb2JqZWN0U3ByZWFkKHtcbiAgICAgIGtleToga2V5XG4gICAgfSwgbm9ybWFsaXplQXR0cnMobm9kZS5hdHRycykpLCAobm9kZS5jaGlsZHJlbiB8fCBbXSkubWFwKGZ1bmN0aW9uIChjaGlsZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiBnZW5lcmF0ZShjaGlsZCwgXCJcIi5jb25jYXQoa2V5LCBcIi1cIikuY29uY2F0KG5vZGUudGFnLCBcIi1cIikuY29uY2F0KGluZGV4KSk7XG4gICAgfSkpO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChub2RlLnRhZywgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHtcbiAgICBrZXk6IGtleVxuICB9LCBub3JtYWxpemVBdHRycyhub2RlLmF0dHJzKSksIHJvb3RQcm9wcyksIChub2RlLmNoaWxkcmVuIHx8IFtdKS5tYXAoZnVuY3Rpb24gKGNoaWxkLCBpbmRleCkge1xuICAgIHJldHVybiBnZW5lcmF0ZShjaGlsZCwgXCJcIi5jb25jYXQoa2V5LCBcIi1cIikuY29uY2F0KG5vZGUudGFnLCBcIi1cIikuY29uY2F0KGluZGV4KSk7XG4gIH0pKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWNvbmRhcnlDb2xvcihwcmltYXJ5Q29sb3IpIHtcbiAgLy8gY2hvb3NlIHRoZSBzZWNvbmQgY29sb3JcbiAgcmV0dXJuIGdlbmVyYXRlQ29sb3IocHJpbWFyeUNvbG9yKVswXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVUd29Ub25lQ29sb3JzKHR3b1RvbmVDb2xvcikge1xuICBpZiAoIXR3b1RvbmVDb2xvcikge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICByZXR1cm4gQXJyYXkuaXNBcnJheSh0d29Ub25lQ29sb3IpID8gdHdvVG9uZUNvbG9yIDogW3R3b1RvbmVDb2xvcl07XG59XG4vLyBUaGVzZSBwcm9wcyBtYWtlIHN1cmUgdGhhdCB0aGUgU1ZHIGJlaGF2aW91cnMgbGlrZSBnZW5lcmFsIHRleHQuXG4vLyBSZWZlcmVuY2U6IGh0dHBzOi8vYmxvZy5wcm90b3R5cHIuaW8vYWxpZ24tc3ZnLWljb25zLXRvLXRleHQtYW5kLXNheS1nb29kYnllLXRvLWZvbnQtaWNvbnMtZDQ0YjNkN2IyNmI0XG5leHBvcnQgdmFyIHN2Z0Jhc2VQcm9wcyA9IHtcbiAgd2lkdGg6ICcxZW0nLFxuICBoZWlnaHQ6ICcxZW0nLFxuICBmaWxsOiAnY3VycmVudENvbG9yJyxcbiAgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLFxuICBmb2N1c2FibGU6ICdmYWxzZSdcbn07XG5leHBvcnQgdmFyIGljb25TdHlsZXMgPSBcIlxcbi5hbnRpY29uIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIGNvbG9yOiBpbmhlcml0O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGluZS1oZWlnaHQ6IDA7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG4gIHZlcnRpY2FsLWFsaWduOiAtMC4xMjVlbTtcXG4gIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7XFxuICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDtcXG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XFxufVxcblxcbi5hbnRpY29uID4gKiB7XFxuICBsaW5lLWhlaWdodDogMTtcXG59XFxuXFxuLmFudGljb24gc3ZnIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuXFxuLmFudGljb246OmJlZm9yZSB7XFxuICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4uYW50aWNvbiAuYW50aWNvbi1pY29uIHtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG5cXG4uYW50aWNvblt0YWJpbmRleF0ge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG5cXG4uYW50aWNvbi1zcGluOjpiZWZvcmUsXFxuLmFudGljb24tc3BpbiB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAtd2Via2l0LWFuaW1hdGlvbjogbG9hZGluZ0NpcmNsZSAxcyBpbmZpbml0ZSBsaW5lYXI7XFxuICBhbmltYXRpb246IGxvYWRpbmdDaXJjbGUgMXMgaW5maW5pdGUgbGluZWFyO1xcbn1cXG5cXG5ALXdlYmtpdC1rZXlmcmFtZXMgbG9hZGluZ0NpcmNsZSB7XFxuICAxMDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xcbiAgfVxcbn1cXG5cXG5Aa2V5ZnJhbWVzIGxvYWRpbmdDaXJjbGUge1xcbiAgMTAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcXG4gIH1cXG59XFxuXCI7XG5leHBvcnQgdmFyIHVzZUluc2VydFN0eWxlcyA9IGZ1bmN0aW9uIHVzZUluc2VydFN0eWxlcygpIHtcbiAgdmFyIHN0eWxlU3RyID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBpY29uU3R5bGVzO1xuICB2YXIgX3VzZUNvbnRleHQgPSB1c2VDb250ZXh0KEljb25Db250ZXh0KSxcbiAgICBjc3AgPSBfdXNlQ29udGV4dC5jc3A7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdXBkYXRlQ1NTKHN0eWxlU3RyLCAnQGFudC1kZXNpZ24taWNvbnMnLCB7XG4gICAgICBwcmVwZW5kOiB0cnVlLFxuICAgICAgY3NwOiBjc3BcbiAgICB9KTtcbiAgfSwgW10pO1xufTsiLCJpbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJpY29uXCIsIFwiY2xhc3NOYW1lXCIsIFwib25DbGlja1wiLCBcInN0eWxlXCIsIFwicHJpbWFyeUNvbG9yXCIsIFwic2Vjb25kYXJ5Q29sb3JcIl07XG5pbXBvcnQgeyBnZW5lcmF0ZSwgZ2V0U2Vjb25kYXJ5Q29sb3IsIGlzSWNvbkRlZmluaXRpb24sIHdhcm5pbmcsIHVzZUluc2VydFN0eWxlcyB9IGZyb20gJy4uL3V0aWxzJztcbnZhciB0d29Ub25lQ29sb3JQYWxldHRlID0ge1xuICBwcmltYXJ5Q29sb3I6ICcjMzMzJyxcbiAgc2Vjb25kYXJ5Q29sb3I6ICcjRTZFNkU2JyxcbiAgY2FsY3VsYXRlZDogZmFsc2Vcbn07XG5mdW5jdGlvbiBzZXRUd29Ub25lQ29sb3JzKF9yZWYpIHtcbiAgdmFyIHByaW1hcnlDb2xvciA9IF9yZWYucHJpbWFyeUNvbG9yLFxuICAgIHNlY29uZGFyeUNvbG9yID0gX3JlZi5zZWNvbmRhcnlDb2xvcjtcbiAgdHdvVG9uZUNvbG9yUGFsZXR0ZS5wcmltYXJ5Q29sb3IgPSBwcmltYXJ5Q29sb3I7XG4gIHR3b1RvbmVDb2xvclBhbGV0dGUuc2Vjb25kYXJ5Q29sb3IgPSBzZWNvbmRhcnlDb2xvciB8fCBnZXRTZWNvbmRhcnlDb2xvcihwcmltYXJ5Q29sb3IpO1xuICB0d29Ub25lQ29sb3JQYWxldHRlLmNhbGN1bGF0ZWQgPSAhIXNlY29uZGFyeUNvbG9yO1xufVxuZnVuY3Rpb24gZ2V0VHdvVG9uZUNvbG9ycygpIHtcbiAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIHR3b1RvbmVDb2xvclBhbGV0dGUpO1xufVxudmFyIEljb25CYXNlID0gZnVuY3Rpb24gSWNvbkJhc2UocHJvcHMpIHtcbiAgdmFyIGljb24gPSBwcm9wcy5pY29uLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBvbkNsaWNrID0gcHJvcHMub25DbGljayxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIHByaW1hcnlDb2xvciA9IHByb3BzLnByaW1hcnlDb2xvcixcbiAgICBzZWNvbmRhcnlDb2xvciA9IHByb3BzLnNlY29uZGFyeUNvbG9yLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgdmFyIGNvbG9ycyA9IHR3b1RvbmVDb2xvclBhbGV0dGU7XG4gIGlmIChwcmltYXJ5Q29sb3IpIHtcbiAgICBjb2xvcnMgPSB7XG4gICAgICBwcmltYXJ5Q29sb3I6IHByaW1hcnlDb2xvcixcbiAgICAgIHNlY29uZGFyeUNvbG9yOiBzZWNvbmRhcnlDb2xvciB8fCBnZXRTZWNvbmRhcnlDb2xvcihwcmltYXJ5Q29sb3IpXG4gICAgfTtcbiAgfVxuICB1c2VJbnNlcnRTdHlsZXMoKTtcbiAgd2FybmluZyhpc0ljb25EZWZpbml0aW9uKGljb24pLCBcImljb24gc2hvdWxkIGJlIGljb24gZGVmaW5pdG9uLCBidXQgZ290IFwiLmNvbmNhdChpY29uKSk7XG4gIGlmICghaXNJY29uRGVmaW5pdGlvbihpY29uKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciB0YXJnZXQgPSBpY29uO1xuICBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQuaWNvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRhcmdldCA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGFyZ2V0KSwge30sIHtcbiAgICAgIGljb246IHRhcmdldC5pY29uKGNvbG9ycy5wcmltYXJ5Q29sb3IsIGNvbG9ycy5zZWNvbmRhcnlDb2xvcilcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZ2VuZXJhdGUodGFyZ2V0Lmljb24sIFwic3ZnLVwiLmNvbmNhdCh0YXJnZXQubmFtZSksIF9vYmplY3RTcHJlYWQoe1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgIG9uQ2xpY2s6IG9uQ2xpY2ssXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgICdkYXRhLWljb24nOiB0YXJnZXQubmFtZSxcbiAgICB3aWR0aDogJzFlbScsXG4gICAgaGVpZ2h0OiAnMWVtJyxcbiAgICBmaWxsOiAnY3VycmVudENvbG9yJyxcbiAgICAnYXJpYS1oaWRkZW4nOiAndHJ1ZSdcbiAgfSwgcmVzdFByb3BzKSk7XG59O1xuSWNvbkJhc2UuZGlzcGxheU5hbWUgPSAnSWNvblJlYWN0Jztcbkljb25CYXNlLmdldFR3b1RvbmVDb2xvcnMgPSBnZXRUd29Ub25lQ29sb3JzO1xuSWNvbkJhc2Uuc2V0VHdvVG9uZUNvbG9ycyA9IHNldFR3b1RvbmVDb2xvcnM7XG5leHBvcnQgZGVmYXVsdCBJY29uQmFzZTsiLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBSZWFjdEljb24gZnJvbSAnLi9JY29uQmFzZSc7XG5pbXBvcnQgeyBub3JtYWxpemVUd29Ub25lQ29sb3JzIH0gZnJvbSAnLi4vdXRpbHMnO1xuZXhwb3J0IGZ1bmN0aW9uIHNldFR3b1RvbmVDb2xvcih0d29Ub25lQ29sb3IpIHtcbiAgdmFyIF9ub3JtYWxpemVUd29Ub25lQ29sbyA9IG5vcm1hbGl6ZVR3b1RvbmVDb2xvcnModHdvVG9uZUNvbG9yKSxcbiAgICBfbm9ybWFsaXplVHdvVG9uZUNvbG8yID0gX3NsaWNlZFRvQXJyYXkoX25vcm1hbGl6ZVR3b1RvbmVDb2xvLCAyKSxcbiAgICBwcmltYXJ5Q29sb3IgPSBfbm9ybWFsaXplVHdvVG9uZUNvbG8yWzBdLFxuICAgIHNlY29uZGFyeUNvbG9yID0gX25vcm1hbGl6ZVR3b1RvbmVDb2xvMlsxXTtcbiAgcmV0dXJuIFJlYWN0SWNvbi5zZXRUd29Ub25lQ29sb3JzKHtcbiAgICBwcmltYXJ5Q29sb3I6IHByaW1hcnlDb2xvcixcbiAgICBzZWNvbmRhcnlDb2xvcjogc2Vjb25kYXJ5Q29sb3JcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VHdvVG9uZUNvbG9yKCkge1xuICB2YXIgY29sb3JzID0gUmVhY3RJY29uLmdldFR3b1RvbmVDb2xvcnMoKTtcbiAgaWYgKCFjb2xvcnMuY2FsY3VsYXRlZCkge1xuICAgIHJldHVybiBjb2xvcnMucHJpbWFyeUNvbG9yO1xuICB9XG4gIHJldHVybiBbY29sb3JzLnByaW1hcnlDb2xvciwgY29sb3JzLnNlY29uZGFyeUNvbG9yXTtcbn0iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJjbGFzc05hbWVcIiwgXCJpY29uXCIsIFwic3BpblwiLCBcInJvdGF0ZVwiLCBcInRhYkluZGV4XCIsIFwib25DbGlja1wiLCBcInR3b1RvbmVDb2xvclwiXTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IENvbnRleHQgZnJvbSAnLi9Db250ZXh0JztcbmltcG9ydCBSZWFjdEljb24gZnJvbSAnLi9JY29uQmFzZSc7XG5pbXBvcnQgeyBnZXRUd29Ub25lQ29sb3IsIHNldFR3b1RvbmVDb2xvciB9IGZyb20gJy4vdHdvVG9uZVByaW1hcnlDb2xvcic7XG5pbXBvcnQgeyBub3JtYWxpemVUd29Ub25lQ29sb3JzIH0gZnJvbSAnLi4vdXRpbHMnO1xuLy8gSW5pdGlhbCBzZXR0aW5nXG4vLyBzaG91bGQgbW92ZSBpdCB0byBhbnRkIG1haW4gcmVwbz9cbnNldFR3b1RvbmVDb2xvcignIzE4OTBmZicpO1xudmFyIEljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgX2NsYXNzTmFtZXM7XG4gIHZhciBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgaWNvbiA9IHByb3BzLmljb24sXG4gICAgc3BpbiA9IHByb3BzLnNwaW4sXG4gICAgcm90YXRlID0gcHJvcHMucm90YXRlLFxuICAgIHRhYkluZGV4ID0gcHJvcHMudGFiSW5kZXgsXG4gICAgb25DbGljayA9IHByb3BzLm9uQ2xpY2ssXG4gICAgdHdvVG9uZUNvbG9yID0gcHJvcHMudHdvVG9uZUNvbG9yLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb250ZXh0KSxcbiAgICBfUmVhY3QkdXNlQ29udGV4dCRwcmUgPSBfUmVhY3QkdXNlQ29udGV4dC5wcmVmaXhDbHMsXG4gICAgcHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQkcHJlID09PSB2b2lkIDAgPyAnYW50aWNvbicgOiBfUmVhY3QkdXNlQ29udGV4dCRwcmUsXG4gICAgcm9vdENsYXNzTmFtZSA9IF9SZWFjdCR1c2VDb250ZXh0LnJvb3RDbGFzc05hbWU7XG4gIHZhciBjbGFzc1N0cmluZyA9IGNsYXNzTmFtZXMocm9vdENsYXNzTmFtZSwgcHJlZml4Q2xzLCAoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoaWNvbi5uYW1lKSwgISFpY29uLm5hbWUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3BpblwiKSwgISFzcGluIHx8IGljb24ubmFtZSA9PT0gJ2xvYWRpbmcnKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuICB2YXIgaWNvblRhYkluZGV4ID0gdGFiSW5kZXg7XG4gIGlmIChpY29uVGFiSW5kZXggPT09IHVuZGVmaW5lZCAmJiBvbkNsaWNrKSB7XG4gICAgaWNvblRhYkluZGV4ID0gLTE7XG4gIH1cbiAgdmFyIHN2Z1N0eWxlID0gcm90YXRlID8ge1xuICAgIG1zVHJhbnNmb3JtOiBcInJvdGF0ZShcIi5jb25jYXQocm90YXRlLCBcImRlZylcIiksXG4gICAgdHJhbnNmb3JtOiBcInJvdGF0ZShcIi5jb25jYXQocm90YXRlLCBcImRlZylcIilcbiAgfSA6IHVuZGVmaW5lZDtcbiAgdmFyIF9ub3JtYWxpemVUd29Ub25lQ29sbyA9IG5vcm1hbGl6ZVR3b1RvbmVDb2xvcnModHdvVG9uZUNvbG9yKSxcbiAgICBfbm9ybWFsaXplVHdvVG9uZUNvbG8yID0gX3NsaWNlZFRvQXJyYXkoX25vcm1hbGl6ZVR3b1RvbmVDb2xvLCAyKSxcbiAgICBwcmltYXJ5Q29sb3IgPSBfbm9ybWFsaXplVHdvVG9uZUNvbG8yWzBdLFxuICAgIHNlY29uZGFyeUNvbG9yID0gX25vcm1hbGl6ZVR3b1RvbmVDb2xvMlsxXTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe1xuICAgIHJvbGU6IFwiaW1nXCIsXG4gICAgXCJhcmlhLWxhYmVsXCI6IGljb24ubmFtZVxuICB9LCByZXN0UHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIHRhYkluZGV4OiBpY29uVGFiSW5kZXgsXG4gICAgb25DbGljazogb25DbGljayxcbiAgICBjbGFzc05hbWU6IGNsYXNzU3RyaW5nXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdEljb24sIHtcbiAgICBpY29uOiBpY29uLFxuICAgIHByaW1hcnlDb2xvcjogcHJpbWFyeUNvbG9yLFxuICAgIHNlY29uZGFyeUNvbG9yOiBzZWNvbmRhcnlDb2xvcixcbiAgICBzdHlsZTogc3ZnU3R5bGVcbiAgfSkpO1xufSk7XG5JY29uLmRpc3BsYXlOYW1lID0gJ0FudGRJY29uJztcbkljb24uZ2V0VHdvVG9uZUNvbG9yID0gZ2V0VHdvVG9uZUNvbG9yO1xuSWNvbi5zZXRUd29Ub25lQ29sb3IgPSBzZXRUd29Ub25lQ29sb3I7XG5leHBvcnQgZGVmYXVsdCBJY29uOyIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IENoZWNrQ2lyY2xlRmlsbGVkU3ZnIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0NoZWNrQ2lyY2xlRmlsbGVkXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSAnLi4vY29tcG9uZW50cy9BbnRkSWNvbic7XG52YXIgQ2hlY2tDaXJjbGVGaWxsZWQgPSBmdW5jdGlvbiBDaGVja0NpcmNsZUZpbGxlZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogQ2hlY2tDaXJjbGVGaWxsZWRTdmdcbiAgfSkpO1xufTtcbkNoZWNrQ2lyY2xlRmlsbGVkLmRpc3BsYXlOYW1lID0gJ0NoZWNrQ2lyY2xlRmlsbGVkJztcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKENoZWNrQ2lyY2xlRmlsbGVkKTsiLCIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBDbG9zZUNpcmNsZUZpbGxlZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNTEyIDY0QzI2NC42IDY0IDY0IDI2NC42IDY0IDUxMnMyMDAuNiA0NDggNDQ4IDQ0OCA0NDgtMjAwLjYgNDQ4LTQ0OFM3NTkuNCA2NCA1MTIgNjR6bTE2NS40IDYxOC4ybC02Ni0uM0w1MTIgNTYzLjRsLTk5LjMgMTE4LjQtNjYuMS4zYy00LjQgMC04LTMuNS04LTggMC0xLjkuNy0zLjcgMS45LTUuMmwxMzAuMS0xNTVMMzQwLjUgMzU5YTguMzIgOC4zMiAwIDAxLTEuOS01LjJjMC00LjQgMy42LTggOC04bDY2LjEuM0w1MTIgNDY0LjZsOTkuMy0xMTguNCA2Ni0uM2M0LjQgMCA4IDMuNSA4IDggMCAxLjktLjcgMy43LTEuOSA1LjJMNTUzLjUgNTE0bDEzMCAxNTVjMS4yIDEuNSAxLjkgMy4zIDEuOSA1LjIgMCA0LjQtMy42IDgtOCA4elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiY2xvc2UtY2lyY2xlXCIsIFwidGhlbWVcIjogXCJmaWxsZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgQ2xvc2VDaXJjbGVGaWxsZWQ7XG4iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBDbG9zZUNpcmNsZUZpbGxlZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9DbG9zZUNpcmNsZUZpbGxlZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIENsb3NlQ2lyY2xlRmlsbGVkID0gZnVuY3Rpb24gQ2xvc2VDaXJjbGVGaWxsZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IENsb3NlQ2lyY2xlRmlsbGVkU3ZnXG4gIH0pKTtcbn07XG5DbG9zZUNpcmNsZUZpbGxlZC5kaXNwbGF5TmFtZSA9ICdDbG9zZUNpcmNsZUZpbGxlZCc7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihDbG9zZUNpcmNsZUZpbGxlZCk7IiwiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgRXhjbGFtYXRpb25DaXJjbGVGaWxsZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTUxMiA2NEMyNjQuNiA2NCA2NCAyNjQuNiA2NCA1MTJzMjAwLjYgNDQ4IDQ0OCA0NDggNDQ4LTIwMC42IDQ0OC00NDhTNzU5LjQgNjQgNTEyIDY0em0tMzIgMjMyYzAtNC40IDMuNi04IDgtOGg0OGM0LjQgMCA4IDMuNiA4IDh2MjcyYzAgNC40LTMuNiA4LTggOGgtNDhjLTQuNCAwLTgtMy42LTgtOFYyOTZ6bTMyIDQ0MGE0OC4wMSA0OC4wMSAwIDAxMC05NiA0OC4wMSA0OC4wMSAwIDAxMCA5NnpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImV4Y2xhbWF0aW9uLWNpcmNsZVwiLCBcInRoZW1lXCI6IFwiZmlsbGVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IEV4Y2xhbWF0aW9uQ2lyY2xlRmlsbGVkO1xuIiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRXhjbGFtYXRpb25DaXJjbGVGaWxsZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRXhjbGFtYXRpb25DaXJjbGVGaWxsZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tICcuLi9jb21wb25lbnRzL0FudGRJY29uJztcbnZhciBFeGNsYW1hdGlvbkNpcmNsZUZpbGxlZCA9IGZ1bmN0aW9uIEV4Y2xhbWF0aW9uQ2lyY2xlRmlsbGVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBFeGNsYW1hdGlvbkNpcmNsZUZpbGxlZFN2Z1xuICB9KSk7XG59O1xuRXhjbGFtYXRpb25DaXJjbGVGaWxsZWQuZGlzcGxheU5hbWUgPSAnRXhjbGFtYXRpb25DaXJjbGVGaWxsZWQnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoRXhjbGFtYXRpb25DaXJjbGVGaWxsZWQpOyIsIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIEluZm9DaXJjbGVGaWxsZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTUxMiA2NEMyNjQuNiA2NCA2NCAyNjQuNiA2NCA1MTJzMjAwLjYgNDQ4IDQ0OCA0NDggNDQ4LTIwMC42IDQ0OC00NDhTNzU5LjQgNjQgNTEyIDY0em0zMiA2NjRjMCA0LjQtMy42IDgtOCA4aC00OGMtNC40IDAtOC0zLjYtOC04VjQ1NmMwLTQuNCAzLjYtOCA4LThoNDhjNC40IDAgOCAzLjYgOCA4djI3MnptLTMyLTM0NGE0OC4wMSA0OC4wMSAwIDAxMC05NiA0OC4wMSA0OC4wMSAwIDAxMCA5NnpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImluZm8tY2lyY2xlXCIsIFwidGhlbWVcIjogXCJmaWxsZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgSW5mb0NpcmNsZUZpbGxlZDtcbiIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEluZm9DaXJjbGVGaWxsZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vSW5mb0NpcmNsZUZpbGxlZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIEluZm9DaXJjbGVGaWxsZWQgPSBmdW5jdGlvbiBJbmZvQ2lyY2xlRmlsbGVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBJbmZvQ2lyY2xlRmlsbGVkU3ZnXG4gIH0pKTtcbn07XG5JbmZvQ2lyY2xlRmlsbGVkLmRpc3BsYXlOYW1lID0gJ0luZm9DaXJjbGVGaWxsZWQnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoSW5mb0NpcmNsZUZpbGxlZCk7IiwiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgTG9hZGluZ091dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiMCAwIDEwMjQgMTAyNFwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk05ODggNTQ4Yy0xOS45IDAtMzYtMTYuMS0zNi0zNiAwLTU5LjQtMTEuNi0xMTctMzQuNi0xNzEuM2E0NDAuNDUgNDQwLjQ1IDAgMDAtOTQuMy0xMzkuOSA0MzcuNzEgNDM3LjcxIDAgMDAtMTM5LjktOTQuM0M2MjkgODMuNiA1NzEuNCA3MiA1MTIgNzJjLTE5LjkgMC0zNi0xNi4xLTM2LTM2czE2LjEtMzYgMzYtMzZjNjkuMSAwIDEzNi4yIDEzLjUgMTk5LjMgNDAuM0M3NzIuMyA2NiA4MjcgMTAzIDg3NCAxNTBjNDcgNDcgODMuOSAxMDEuOCAxMDkuNyAxNjIuNyAyNi43IDYzLjEgNDAuMiAxMzAuMiA0MC4yIDE5OS4zLjEgMTkuOS0xNiAzNi0zNS45IDM2elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwibG9hZGluZ1wiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgTG9hZGluZ091dGxpbmVkO1xuIiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgTG9hZGluZ091dGxpbmVkU3ZnIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0xvYWRpbmdPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIExvYWRpbmdPdXRsaW5lZCA9IGZ1bmN0aW9uIExvYWRpbmdPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogTG9hZGluZ091dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5Mb2FkaW5nT3V0bGluZWQuZGlzcGxheU5hbWUgPSAnTG9hZGluZ091dGxpbmVkJztcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKExvYWRpbmdPdXRsaW5lZCk7IiwiaW1wb3J0IF9yZWdlbmVyYXRvclJ1bnRpbWUgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3JlZ2VuZXJhdG9yUnVudGltZVwiO1xuaW1wb3J0IF9hc3luY1RvR2VuZXJhdG9yIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3luY1RvR2VuZXJhdG9yXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0ICogYXMgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcbi8vIExldCBjb21waWxlciBub3QgdG8gc2VhcmNoIG1vZHVsZSB1c2FnZVxudmFyIGZ1bGxDbG9uZSA9IF9vYmplY3RTcHJlYWQoe30sIFJlYWN0RE9NKTtcbnZhciB2ZXJzaW9uID0gZnVsbENsb25lLnZlcnNpb24sXG4gIHJlYWN0UmVuZGVyID0gZnVsbENsb25lLnJlbmRlcixcbiAgdW5tb3VudENvbXBvbmVudEF0Tm9kZSA9IGZ1bGxDbG9uZS51bm1vdW50Q29tcG9uZW50QXROb2RlO1xudmFyIGNyZWF0ZVJvb3Q7XG50cnkge1xuICB2YXIgbWFpblZlcnNpb24gPSBOdW1iZXIoKHZlcnNpb24gfHwgJycpLnNwbGl0KCcuJylbMF0pO1xuICBpZiAobWFpblZlcnNpb24gPj0gMTgpIHtcbiAgICBjcmVhdGVSb290ID0gZnVsbENsb25lLmNyZWF0ZVJvb3Q7XG4gIH1cbn0gY2F0Y2ggKGUpIHtcbiAgLy8gRG8gbm90aGluZztcbn1cbmZ1bmN0aW9uIHRvZ2dsZVdhcm5pbmcoc2tpcCkge1xuICB2YXIgX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQgPSBmdWxsQ2xvbmUuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ7XG4gIGlmIChfX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCAmJiBfdHlwZW9mKF9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEKSA9PT0gJ29iamVjdCcpIHtcbiAgICBfX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRC51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSBza2lwO1xuICB9XG59XG52YXIgTUFSSyA9ICdfX3JjX3JlYWN0X3Jvb3RfXyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBtb2Rlcm5SZW5kZXIobm9kZSwgY29udGFpbmVyKSB7XG4gIHRvZ2dsZVdhcm5pbmcodHJ1ZSk7XG4gIHZhciByb290ID0gY29udGFpbmVyW01BUktdIHx8IGNyZWF0ZVJvb3QoY29udGFpbmVyKTtcbiAgdG9nZ2xlV2FybmluZyhmYWxzZSk7XG4gIHJvb3QucmVuZGVyKG5vZGUpO1xuICBjb250YWluZXJbTUFSS10gPSByb290O1xufVxuZnVuY3Rpb24gbGVnYWN5UmVuZGVyKG5vZGUsIGNvbnRhaW5lcikge1xuICByZWFjdFJlbmRlcihub2RlLCBjb250YWluZXIpO1xufVxuXG4vKiogQHByaXZhdGUgVGVzdCB1c2FnZS4gTm90IHdvcmsgaW4gcHJvZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yKG5vZGUsIGNvbnRhaW5lcikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHJldHVybiBsZWdhY3lSZW5kZXIobm9kZSwgY29udGFpbmVyKTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlcihub2RlLCBjb250YWluZXIpIHtcbiAgaWYgKGNyZWF0ZVJvb3QpIHtcbiAgICBtb2Rlcm5SZW5kZXIobm9kZSwgY29udGFpbmVyKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbGVnYWN5UmVuZGVyKG5vZGUsIGNvbnRhaW5lcik7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT0gVW5tb3VudCA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuZnVuY3Rpb24gbW9kZXJuVW5tb3VudChfeCkge1xuICByZXR1cm4gX21vZGVyblVubW91bnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIF9tb2Rlcm5Vbm1vdW50KCkge1xuICBfbW9kZXJuVW5tb3VudCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShjb250YWluZXIpIHtcbiAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9jb250YWluZXIkTUFSSztcbiAgICAgICAgICAgIChfY29udGFpbmVyJE1BUksgPSBjb250YWluZXJbTUFSS10pID09PSBudWxsIHx8IF9jb250YWluZXIkTUFSSyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2NvbnRhaW5lciRNQVJLLnVubW91bnQoKTtcbiAgICAgICAgICAgIGRlbGV0ZSBjb250YWluZXJbTUFSS107XG4gICAgICAgICAgfSkpO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgfVxuICAgIH0sIF9jYWxsZWUpO1xuICB9KSk7XG4gIHJldHVybiBfbW9kZXJuVW5tb3VudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZnVuY3Rpb24gbGVnYWN5VW5tb3VudChjb250YWluZXIpIHtcbiAgdW5tb3VudENvbXBvbmVudEF0Tm9kZShjb250YWluZXIpO1xufVxuXG4vKiogQHByaXZhdGUgVGVzdCB1c2FnZS4gTm90IHdvcmsgaW4gcHJvZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF91KGNvbnRhaW5lcikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHJldHVybiBsZWdhY3lVbm1vdW50KGNvbnRhaW5lcik7XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiB1bm1vdW50KF94Mikge1xuICByZXR1cm4gX3VubW91bnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIF91bm1vdW50KCkge1xuICBfdW5tb3VudCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGlmICghKGNyZWF0ZVJvb3QgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdChcInJldHVyblwiLCBtb2Rlcm5Vbm1vdW50KGNvbnRhaW5lcikpO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgbGVnYWN5VW5tb3VudChjb250YWluZXIpO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMik7XG4gIH0pKTtcbiAgcmV0dXJuIF91bm1vdW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59IiwiaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJjaGlsZHJlblwiXTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCB2YXIgQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHt9KTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE1vdGlvblByb3ZpZGVyKF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBwcm9wc1xuICB9LCBjaGlsZHJlbik7XG59IiwiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c1wiO1xuaW1wb3J0IF9jcmVhdGVTdXBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlU3VwZXJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbnZhciBEb21XcmFwcGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhEb21XcmFwcGVyLCBfUmVhY3QkQ29tcG9uZW50KTtcbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihEb21XcmFwcGVyKTtcbiAgZnVuY3Rpb24gRG9tV3JhcHBlcigpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRG9tV3JhcHBlcik7XG4gICAgcmV0dXJuIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG4gIF9jcmVhdGVDbGFzcyhEb21XcmFwcGVyLCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBEb21XcmFwcGVyO1xufShSZWFjdC5Db21wb25lbnQpO1xuZXhwb3J0IGRlZmF1bHQgRG9tV3JhcHBlcjsiLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0Jztcbi8qKlxuICogU2FtZSBhcyBSZWFjdC51c2VTdGF0ZSBidXQgYHNldFN0YXRlYCBhY2NlcHQgYGlnbm9yZURlc3Ryb3lgIHBhcmFtIHRvIG5vdCB0byBzZXRTdGF0ZSBhZnRlciBkZXN0cm95ZWQuXG4gKiBXZSBkbyBub3QgbWFrZSB0aGlzIGF1dG8gaXMgdG8gYXZvaWQgcmVhbCBtZW1vcnkgbGVhay5cbiAqIERldmVsb3BlciBzaG91bGQgY29uZmlybSBpdCdzIHNhZmUgdG8gaWdub3JlIHRoZW1zZWx2ZXMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVNhZmVTdGF0ZShkZWZhdWx0VmFsdWUpIHtcbiAgdmFyIGRlc3Ryb3lSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZGVmYXVsdFZhbHVlKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICB2YWx1ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0VmFsdWUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGRlc3Ryb3lSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBkZXN0cm95UmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgZnVuY3Rpb24gc2FmZVNldFN0YXRlKHVwZGF0ZXIsIGlnbm9yZURlc3Ryb3kpIHtcbiAgICBpZiAoaWdub3JlRGVzdHJveSAmJiBkZXN0cm95UmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0VmFsdWUodXBkYXRlcik7XG4gIH1cbiAgcmV0dXJuIFt2YWx1ZSwgc2FmZVNldFN0YXRlXTtcbn0iLCJleHBvcnQgdmFyIFNUQVRVU19OT05FID0gJ25vbmUnO1xuZXhwb3J0IHZhciBTVEFUVVNfQVBQRUFSID0gJ2FwcGVhcic7XG5leHBvcnQgdmFyIFNUQVRVU19FTlRFUiA9ICdlbnRlcic7XG5leHBvcnQgdmFyIFNUQVRVU19MRUFWRSA9ICdsZWF2ZSc7XG5leHBvcnQgdmFyIFNURVBfTk9ORSA9ICdub25lJztcbmV4cG9ydCB2YXIgU1RFUF9QUkVQQVJFID0gJ3ByZXBhcmUnO1xuZXhwb3J0IHZhciBTVEVQX1NUQVJUID0gJ3N0YXJ0JztcbmV4cG9ydCB2YXIgU1RFUF9BQ1RJVkUgPSAnYWN0aXZlJztcbmV4cG9ydCB2YXIgU1RFUF9BQ1RJVkFURUQgPSAnZW5kJztcbi8qKlxuICogVXNlZCBmb3IgZGlzYWJsZWQgbW90aW9uIGNhc2UuXG4gKiBQcmVwYXJlIHN0YWdlIHdpbGwgc3RpbGwgd29yayBidXQgc3RhcnQgJiBhY3RpdmUgd2lsbCBiZSBza2lwcGVkLlxuICovXG5leHBvcnQgdmFyIFNURVBfUFJFUEFSRUQgPSAncHJlcGFyZWQnOyIsImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBjYW5Vc2VET00gZnJvbSBcInJjLXV0aWwvZXMvRG9tL2NhblVzZURvbVwiO1xuLy8gPT09PT09PT09PT09PT09PT0gVHJhbnNpdGlvbiA9PT09PT09PT09PT09PT09PVxuLy8gRXZlbnQgd3JhcHBlci4gQ29weSBmcm9tIHJlYWN0IHNvdXJjZSBjb2RlXG5mdW5jdGlvbiBtYWtlUHJlZml4TWFwKHN0eWxlUHJvcCwgZXZlbnROYW1lKSB7XG4gIHZhciBwcmVmaXhlcyA9IHt9O1xuICBwcmVmaXhlc1tzdHlsZVByb3AudG9Mb3dlckNhc2UoKV0gPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcHJlZml4ZXNbXCJXZWJraXRcIi5jb25jYXQoc3R5bGVQcm9wKV0gPSBcIndlYmtpdFwiLmNvbmNhdChldmVudE5hbWUpO1xuICBwcmVmaXhlc1tcIk1velwiLmNvbmNhdChzdHlsZVByb3ApXSA9IFwibW96XCIuY29uY2F0KGV2ZW50TmFtZSk7XG4gIHByZWZpeGVzW1wibXNcIi5jb25jYXQoc3R5bGVQcm9wKV0gPSBcIk1TXCIuY29uY2F0KGV2ZW50TmFtZSk7XG4gIHByZWZpeGVzW1wiT1wiLmNvbmNhdChzdHlsZVByb3ApXSA9IFwib1wiLmNvbmNhdChldmVudE5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIHJldHVybiBwcmVmaXhlcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRWZW5kb3JQcmVmaXhlcyhkb21TdXBwb3J0LCB3aW4pIHtcbiAgdmFyIHByZWZpeGVzID0ge1xuICAgIGFuaW1hdGlvbmVuZDogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvbkVuZCcpLFxuICAgIHRyYW5zaXRpb25lbmQ6IG1ha2VQcmVmaXhNYXAoJ1RyYW5zaXRpb24nLCAnVHJhbnNpdGlvbkVuZCcpXG4gIH07XG4gIGlmIChkb21TdXBwb3J0KSB7XG4gICAgaWYgKCEoJ0FuaW1hdGlvbkV2ZW50JyBpbiB3aW4pKSB7XG4gICAgICBkZWxldGUgcHJlZml4ZXMuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbjtcbiAgICB9XG4gICAgaWYgKCEoJ1RyYW5zaXRpb25FdmVudCcgaW4gd2luKSkge1xuICAgICAgZGVsZXRlIHByZWZpeGVzLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHByZWZpeGVzO1xufVxudmFyIHZlbmRvclByZWZpeGVzID0gZ2V0VmVuZG9yUHJlZml4ZXMoY2FuVXNlRE9NKCksIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDoge30pO1xudmFyIHN0eWxlID0ge307XG5pZiAoY2FuVXNlRE9NKCkpIHtcbiAgdmFyIF9kb2N1bWVudCRjcmVhdGVFbGVtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBzdHlsZSA9IF9kb2N1bWVudCRjcmVhdGVFbGVtZS5zdHlsZTtcbn1cbnZhciBwcmVmaXhlZEV2ZW50TmFtZXMgPSB7fTtcbmV4cG9ydCBmdW5jdGlvbiBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZShldmVudE5hbWUpIHtcbiAgaWYgKHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdKSB7XG4gICAgcmV0dXJuIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdO1xuICB9XG4gIHZhciBwcmVmaXhNYXAgPSB2ZW5kb3JQcmVmaXhlc1tldmVudE5hbWVdO1xuICBpZiAocHJlZml4TWFwKSB7XG4gICAgdmFyIHN0eWxlUHJvcExpc3QgPSBPYmplY3Qua2V5cyhwcmVmaXhNYXApO1xuICAgIHZhciBsZW4gPSBzdHlsZVByb3BMaXN0Lmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICB2YXIgc3R5bGVQcm9wID0gc3R5bGVQcm9wTGlzdFtpXTtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocHJlZml4TWFwLCBzdHlsZVByb3ApICYmIHN0eWxlUHJvcCBpbiBzdHlsZSkge1xuICAgICAgICBwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXSA9IHByZWZpeE1hcFtzdHlsZVByb3BdO1xuICAgICAgICByZXR1cm4gcHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn1cbnZhciBpbnRlcm5hbEFuaW1hdGlvbkVuZE5hbWUgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uZW5kJyk7XG52YXIgaW50ZXJuYWxUcmFuc2l0aW9uRW5kTmFtZSA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCd0cmFuc2l0aW9uZW5kJyk7XG5leHBvcnQgdmFyIHN1cHBvcnRUcmFuc2l0aW9uID0gISEoaW50ZXJuYWxBbmltYXRpb25FbmROYW1lICYmIGludGVybmFsVHJhbnNpdGlvbkVuZE5hbWUpO1xuZXhwb3J0IHZhciBhbmltYXRpb25FbmROYW1lID0gaW50ZXJuYWxBbmltYXRpb25FbmROYW1lIHx8ICdhbmltYXRpb25lbmQnO1xuZXhwb3J0IHZhciB0cmFuc2l0aW9uRW5kTmFtZSA9IGludGVybmFsVHJhbnNpdGlvbkVuZE5hbWUgfHwgJ3RyYW5zaXRpb25lbmQnO1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRyYW5zaXRpb25OYW1lKHRyYW5zaXRpb25OYW1lLCB0cmFuc2l0aW9uVHlwZSkge1xuICBpZiAoIXRyYW5zaXRpb25OYW1lKSByZXR1cm4gbnVsbDtcbiAgaWYgKF90eXBlb2YodHJhbnNpdGlvbk5hbWUpID09PSAnb2JqZWN0Jykge1xuICAgIHZhciB0eXBlID0gdHJhbnNpdGlvblR5cGUucmVwbGFjZSgvLVxcdy9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgIHJldHVybiBtYXRjaFsxXS50b1VwcGVyQ2FzZSgpO1xuICAgIH0pO1xuICAgIHJldHVybiB0cmFuc2l0aW9uTmFtZVt0eXBlXTtcbiAgfVxuICByZXR1cm4gXCJcIi5jb25jYXQodHJhbnNpdGlvbk5hbWUsIFwiLVwiKS5jb25jYXQodHJhbnNpdGlvblR5cGUpO1xufSIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGFuaW1hdGlvbkVuZE5hbWUsIHRyYW5zaXRpb25FbmROYW1lIH0gZnJvbSBcIi4uL3V0aWwvbW90aW9uXCI7XG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHZhciBjYWNoZUVsZW1lbnRSZWYgPSB1c2VSZWYoKTtcblxuICAvLyBDYWNoZSBjYWxsYmFja1xuICB2YXIgY2FsbGJhY2tSZWYgPSB1c2VSZWYoY2FsbGJhY2spO1xuICBjYWxsYmFja1JlZi5jdXJyZW50ID0gY2FsbGJhY2s7XG5cbiAgLy8gSW50ZXJuYWwgbW90aW9uIGV2ZW50IGhhbmRsZXJcbiAgdmFyIG9uSW50ZXJuYWxNb3Rpb25FbmQgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBjYWxsYmFja1JlZi5jdXJyZW50KGV2ZW50KTtcbiAgfSwgW10pO1xuXG4gIC8vIFJlbW92ZSBldmVudHNcbiAgZnVuY3Rpb24gcmVtb3ZlTW90aW9uRXZlbnRzKGVsZW1lbnQpIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHRyYW5zaXRpb25FbmROYW1lLCBvbkludGVybmFsTW90aW9uRW5kKTtcbiAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhbmltYXRpb25FbmROYW1lLCBvbkludGVybmFsTW90aW9uRW5kKTtcbiAgICB9XG4gIH1cblxuICAvLyBQYXRjaCBldmVudHNcbiAgZnVuY3Rpb24gcGF0Y2hNb3Rpb25FdmVudHMoZWxlbWVudCkge1xuICAgIGlmIChjYWNoZUVsZW1lbnRSZWYuY3VycmVudCAmJiBjYWNoZUVsZW1lbnRSZWYuY3VycmVudCAhPT0gZWxlbWVudCkge1xuICAgICAgcmVtb3ZlTW90aW9uRXZlbnRzKGNhY2hlRWxlbWVudFJlZi5jdXJyZW50KTtcbiAgICB9XG4gICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudCAhPT0gY2FjaGVFbGVtZW50UmVmLmN1cnJlbnQpIHtcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0cmFuc2l0aW9uRW5kTmFtZSwgb25JbnRlcm5hbE1vdGlvbkVuZCk7XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoYW5pbWF0aW9uRW5kTmFtZSwgb25JbnRlcm5hbE1vdGlvbkVuZCk7XG5cbiAgICAgIC8vIFNhdmUgYXMgY2FjaGUgaW4gY2FzZSBkb20gcmVtb3ZlZCB0cmlnZ2VyIGJ5IGBtb3Rpb25EZWFkbGluZWBcbiAgICAgIGNhY2hlRWxlbWVudFJlZi5jdXJyZW50ID0gZWxlbWVudDtcbiAgICB9XG4gIH1cblxuICAvLyBDbGVhbiB1cCB3aGVuIHJlbW92ZWRcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmVtb3ZlTW90aW9uRXZlbnRzKGNhY2hlRWxlbWVudFJlZi5jdXJyZW50KTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiBbcGF0Y2hNb3Rpb25FdmVudHMsIHJlbW92ZU1vdGlvbkV2ZW50c107XG59KTsiLCJpbXBvcnQgeyB1c2VFZmZlY3QsIHVzZUxheW91dEVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjYW5Vc2VEb20gZnJvbSBcInJjLXV0aWwvZXMvRG9tL2NhblVzZURvbVwiO1xuXG4vLyBJdCdzIHNhZmUgdG8gdXNlIGB1c2VMYXlvdXRFZmZlY3RgIGJ1dCB0aGUgd2FybmluZyBpcyBhbm5veWluZ1xudmFyIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgPSBjYW5Vc2VEb20oKSA/IHVzZUxheW91dEVmZmVjdCA6IHVzZUVmZmVjdDtcbmV4cG9ydCBkZWZhdWx0IHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3Q7IiwidmFyIHJhZiA9IGZ1bmN0aW9uIHJhZihjYWxsYmFjaykge1xuICByZXR1cm4gK3NldFRpbWVvdXQoY2FsbGJhY2ssIDE2KTtcbn07XG52YXIgY2FmID0gZnVuY3Rpb24gY2FmKG51bSkge1xuICByZXR1cm4gY2xlYXJUaW1lb3V0KG51bSk7XG59O1xuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmICdyZXF1ZXN0QW5pbWF0aW9uRnJhbWUnIGluIHdpbmRvdykge1xuICByYWYgPSBmdW5jdGlvbiByYWYoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShjYWxsYmFjayk7XG4gIH07XG4gIGNhZiA9IGZ1bmN0aW9uIGNhZihoYW5kbGUpIHtcbiAgICByZXR1cm4gd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKGhhbmRsZSk7XG4gIH07XG59XG52YXIgcmFmVVVJRCA9IDA7XG52YXIgcmFmSWRzID0gbmV3IE1hcCgpO1xuZnVuY3Rpb24gY2xlYW51cChpZCkge1xuICByYWZJZHMuZGVsZXRlKGlkKTtcbn1cbnZhciB3cmFwcGVyUmFmID0gZnVuY3Rpb24gd3JhcHBlclJhZihjYWxsYmFjaykge1xuICB2YXIgdGltZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDE7XG4gIHJhZlVVSUQgKz0gMTtcbiAgdmFyIGlkID0gcmFmVVVJRDtcbiAgZnVuY3Rpb24gY2FsbFJlZihsZWZ0VGltZXMpIHtcbiAgICBpZiAobGVmdFRpbWVzID09PSAwKSB7XG4gICAgICAvLyBDbGVhbiB1cFxuICAgICAgY2xlYW51cChpZCk7XG5cbiAgICAgIC8vIFRyaWdnZXJcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5leHQgcmFmXG4gICAgICB2YXIgcmVhbElkID0gcmFmKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FsbFJlZihsZWZ0VGltZXMgLSAxKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBCaW5kIHJlYWwgcmFmIGlkXG4gICAgICByYWZJZHMuc2V0KGlkLCByZWFsSWQpO1xuICAgIH1cbiAgfVxuICBjYWxsUmVmKHRpbWVzKTtcbiAgcmV0dXJuIGlkO1xufTtcbndyYXBwZXJSYWYuY2FuY2VsID0gZnVuY3Rpb24gKGlkKSB7XG4gIHZhciByZWFsSWQgPSByYWZJZHMuZ2V0KGlkKTtcbiAgY2xlYW51cChyZWFsSWQpO1xuICByZXR1cm4gY2FmKHJlYWxJZCk7XG59O1xuZXhwb3J0IGRlZmF1bHQgd3JhcHBlclJhZjsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgcmFmIGZyb20gXCJyYy11dGlsL2VzL3JhZlwiO1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uICgpIHtcbiAgdmFyIG5leHRGcmFtZVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgZnVuY3Rpb24gY2FuY2VsTmV4dEZyYW1lKCkge1xuICAgIHJhZi5jYW5jZWwobmV4dEZyYW1lUmVmLmN1cnJlbnQpO1xuICB9XG4gIGZ1bmN0aW9uIG5leHRGcmFtZShjYWxsYmFjaykge1xuICAgIHZhciBkZWxheSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMjtcbiAgICBjYW5jZWxOZXh0RnJhbWUoKTtcbiAgICB2YXIgbmV4dEZyYW1lSWQgPSByYWYoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGRlbGF5IDw9IDEpIHtcbiAgICAgICAgY2FsbGJhY2soe1xuICAgICAgICAgIGlzQ2FuY2VsZWQ6IGZ1bmN0aW9uIGlzQ2FuY2VsZWQoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV4dEZyYW1lSWQgIT09IG5leHRGcmFtZVJlZi5jdXJyZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0RnJhbWUoY2FsbGJhY2ssIGRlbGF5IC0gMSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgbmV4dEZyYW1lUmVmLmN1cnJlbnQgPSBuZXh0RnJhbWVJZDtcbiAgfVxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBjYW5jZWxOZXh0RnJhbWUoKTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiBbbmV4dEZyYW1lLCBjYW5jZWxOZXh0RnJhbWVdO1xufSk7IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgdXNlU3RhdGUgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlU3RhdGVcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFNURVBfQUNUSVZBVEVELCBTVEVQX0FDVElWRSwgU1RFUF9OT05FLCBTVEVQX1BSRVBBUkUsIFNURVBfUFJFUEFSRUQsIFNURVBfU1RBUlQgfSBmcm9tIFwiLi4vaW50ZXJmYWNlXCI7XG5pbXBvcnQgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCBmcm9tIFwiLi91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0XCI7XG5pbXBvcnQgdXNlTmV4dEZyYW1lIGZyb20gXCIuL3VzZU5leHRGcmFtZVwiO1xudmFyIEZVTExfU1RFUF9RVUVVRSA9IFtTVEVQX1BSRVBBUkUsIFNURVBfU1RBUlQsIFNURVBfQUNUSVZFLCBTVEVQX0FDVElWQVRFRF07XG52YXIgU0lNUExFX1NURVBfUVVFVUUgPSBbU1RFUF9QUkVQQVJFLCBTVEVQX1BSRVBBUkVEXTtcblxuLyoqIFNraXAgY3VycmVudCBzdGVwICovXG5leHBvcnQgdmFyIFNraXBTdGVwID0gZmFsc2U7XG4vKiogQ3VycmVudCBzdGVwIHNob3VsZCBiZSB1cGRhdGUgaW4gKi9cbmV4cG9ydCB2YXIgRG9TdGVwID0gdHJ1ZTtcbmV4cG9ydCBmdW5jdGlvbiBpc0FjdGl2ZShzdGVwKSB7XG4gIHJldHVybiBzdGVwID09PSBTVEVQX0FDVElWRSB8fCBzdGVwID09PSBTVEVQX0FDVElWQVRFRDtcbn1cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoc3RhdHVzLCBwcmVwYXJlT25seSwgY2FsbGJhY2spIHtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKFNURVBfTk9ORSksXG4gICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgc3RlcCA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0U3RlcCA9IF91c2VTdGF0ZTJbMV07XG4gIHZhciBfdXNlTmV4dEZyYW1lID0gdXNlTmV4dEZyYW1lKCksXG4gICAgX3VzZU5leHRGcmFtZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlTmV4dEZyYW1lLCAyKSxcbiAgICBuZXh0RnJhbWUgPSBfdXNlTmV4dEZyYW1lMlswXSxcbiAgICBjYW5jZWxOZXh0RnJhbWUgPSBfdXNlTmV4dEZyYW1lMlsxXTtcbiAgZnVuY3Rpb24gc3RhcnRRdWV1ZSgpIHtcbiAgICBzZXRTdGVwKFNURVBfUFJFUEFSRSwgdHJ1ZSk7XG4gIH1cbiAgdmFyIFNURVBfUVVFVUUgPSBwcmVwYXJlT25seSA/IFNJTVBMRV9TVEVQX1FVRVVFIDogRlVMTF9TVEVQX1FVRVVFO1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc3RlcCAhPT0gU1RFUF9OT05FICYmIHN0ZXAgIT09IFNURVBfQUNUSVZBVEVEKSB7XG4gICAgICB2YXIgaW5kZXggPSBTVEVQX1FVRVVFLmluZGV4T2Yoc3RlcCk7XG4gICAgICB2YXIgbmV4dFN0ZXAgPSBTVEVQX1FVRVVFW2luZGV4ICsgMV07XG4gICAgICB2YXIgcmVzdWx0ID0gY2FsbGJhY2soc3RlcCk7XG4gICAgICBpZiAocmVzdWx0ID09PSBTa2lwU3RlcCkge1xuICAgICAgICAvLyBTa2lwIHdoZW4gbm8gbmVlZGVkXG4gICAgICAgIHNldFN0ZXAobmV4dFN0ZXAsIHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChuZXh0U3RlcCkge1xuICAgICAgICAvLyBEbyBhcyBmcmFtZSBmb3Igc3RlcCB1cGRhdGVcbiAgICAgICAgbmV4dEZyYW1lKGZ1bmN0aW9uIChpbmZvKSB7XG4gICAgICAgICAgZnVuY3Rpb24gZG9OZXh0KCkge1xuICAgICAgICAgICAgLy8gU2tpcCBzaW5jZSBjdXJyZW50IHF1ZXVlIGlzIG9vZFxuICAgICAgICAgICAgaWYgKGluZm8uaXNDYW5jZWxlZCgpKSByZXR1cm47XG4gICAgICAgICAgICBzZXRTdGVwKG5leHRTdGVwLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgZG9OZXh0KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE9ubHkgcHJvbWlzZSBzaG91bGQgYmUgYXN5bmNcbiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4oZG9OZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW3N0YXR1cywgc3RlcF0pO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBjYW5jZWxOZXh0RnJhbWUoKTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiBbc3RhcnRRdWV1ZSwgc3RlcF07XG59KTsiLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IHVzZVN0YXRlIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZVN0YXRlXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFNUQVRVU19BUFBFQVIsIFNUQVRVU19FTlRFUiwgU1RBVFVTX0xFQVZFLCBTVEFUVVNfTk9ORSwgU1RFUF9BQ1RJVkUsIFNURVBfUFJFUEFSRSwgU1RFUF9QUkVQQVJFRCwgU1RFUF9TVEFSVCB9IGZyb20gXCIuLi9pbnRlcmZhY2VcIjtcbmltcG9ydCB1c2VEb21Nb3Rpb25FdmVudHMgZnJvbSBcIi4vdXNlRG9tTW90aW9uRXZlbnRzXCI7XG5pbXBvcnQgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCBmcm9tIFwiLi91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0XCI7XG5pbXBvcnQgdXNlU3RlcFF1ZXVlLCB7IERvU3RlcCwgaXNBY3RpdmUsIFNraXBTdGVwIH0gZnJvbSBcIi4vdXNlU3RlcFF1ZXVlXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VTdGF0dXMoc3VwcG9ydE1vdGlvbiwgdmlzaWJsZSwgZ2V0RWxlbWVudCwgX3JlZikge1xuICB2YXIgX3JlZiRtb3Rpb25FbnRlciA9IF9yZWYubW90aW9uRW50ZXIsXG4gICAgbW90aW9uRW50ZXIgPSBfcmVmJG1vdGlvbkVudGVyID09PSB2b2lkIDAgPyB0cnVlIDogX3JlZiRtb3Rpb25FbnRlcixcbiAgICBfcmVmJG1vdGlvbkFwcGVhciA9IF9yZWYubW90aW9uQXBwZWFyLFxuICAgIG1vdGlvbkFwcGVhciA9IF9yZWYkbW90aW9uQXBwZWFyID09PSB2b2lkIDAgPyB0cnVlIDogX3JlZiRtb3Rpb25BcHBlYXIsXG4gICAgX3JlZiRtb3Rpb25MZWF2ZSA9IF9yZWYubW90aW9uTGVhdmUsXG4gICAgbW90aW9uTGVhdmUgPSBfcmVmJG1vdGlvbkxlYXZlID09PSB2b2lkIDAgPyB0cnVlIDogX3JlZiRtb3Rpb25MZWF2ZSxcbiAgICBtb3Rpb25EZWFkbGluZSA9IF9yZWYubW90aW9uRGVhZGxpbmUsXG4gICAgbW90aW9uTGVhdmVJbW1lZGlhdGVseSA9IF9yZWYubW90aW9uTGVhdmVJbW1lZGlhdGVseSxcbiAgICBvbkFwcGVhclByZXBhcmUgPSBfcmVmLm9uQXBwZWFyUHJlcGFyZSxcbiAgICBvbkVudGVyUHJlcGFyZSA9IF9yZWYub25FbnRlclByZXBhcmUsXG4gICAgb25MZWF2ZVByZXBhcmUgPSBfcmVmLm9uTGVhdmVQcmVwYXJlLFxuICAgIG9uQXBwZWFyU3RhcnQgPSBfcmVmLm9uQXBwZWFyU3RhcnQsXG4gICAgb25FbnRlclN0YXJ0ID0gX3JlZi5vbkVudGVyU3RhcnQsXG4gICAgb25MZWF2ZVN0YXJ0ID0gX3JlZi5vbkxlYXZlU3RhcnQsXG4gICAgb25BcHBlYXJBY3RpdmUgPSBfcmVmLm9uQXBwZWFyQWN0aXZlLFxuICAgIG9uRW50ZXJBY3RpdmUgPSBfcmVmLm9uRW50ZXJBY3RpdmUsXG4gICAgb25MZWF2ZUFjdGl2ZSA9IF9yZWYub25MZWF2ZUFjdGl2ZSxcbiAgICBvbkFwcGVhckVuZCA9IF9yZWYub25BcHBlYXJFbmQsXG4gICAgb25FbnRlckVuZCA9IF9yZWYub25FbnRlckVuZCxcbiAgICBvbkxlYXZlRW5kID0gX3JlZi5vbkxlYXZlRW5kLFxuICAgIG9uVmlzaWJsZUNoYW5nZWQgPSBfcmVmLm9uVmlzaWJsZUNoYW5nZWQ7XG4gIC8vIFVzZWQgZm9yIG91dGVyIHJlbmRlciB1c2FnZSB0byBhdm9pZCBgdmlzaWJsZTogZmFsc2UgJiBzdGF0dXM6IG5vbmVgIHRvIHJlbmRlciBub3RoaW5nXG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZSgpLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIGFzeW5jVmlzaWJsZSA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0QXN5bmNWaXNpYmxlID0gX3VzZVN0YXRlMlsxXTtcbiAgdmFyIF91c2VTdGF0ZTMgPSB1c2VTdGF0ZShTVEFUVVNfTk9ORSksXG4gICAgX3VzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTMsIDIpLFxuICAgIHN0YXR1cyA9IF91c2VTdGF0ZTRbMF0sXG4gICAgc2V0U3RhdHVzID0gX3VzZVN0YXRlNFsxXTtcbiAgdmFyIF91c2VTdGF0ZTUgPSB1c2VTdGF0ZShudWxsKSxcbiAgICBfdXNlU3RhdGU2ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlNSwgMiksXG4gICAgc3R5bGUgPSBfdXNlU3RhdGU2WzBdLFxuICAgIHNldFN0eWxlID0gX3VzZVN0YXRlNlsxXTtcbiAgdmFyIG1vdW50ZWRSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICB2YXIgZGVhZGxpbmVSZWYgPSB1c2VSZWYobnVsbCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IERvbSBOb2RlID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBmdW5jdGlvbiBnZXREb21FbGVtZW50KCkge1xuICAgIHJldHVybiBnZXRFbGVtZW50KCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBNb3Rpb24gRW5kID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBhY3RpdmVSZWYgPSB1c2VSZWYoZmFsc2UpO1xuXG4gIC8qKlxuICAgKiBDbGVhbiB1cCBzdGF0dXMgJiBzdHlsZVxuICAgKi9cbiAgZnVuY3Rpb24gdXBkYXRlTW90aW9uRW5kU3RhdHVzKCkge1xuICAgIHNldFN0YXR1cyhTVEFUVVNfTk9ORSwgdHJ1ZSk7XG4gICAgc2V0U3R5bGUobnVsbCwgdHJ1ZSk7XG4gIH1cbiAgZnVuY3Rpb24gb25JbnRlcm5hbE1vdGlvbkVuZChldmVudCkge1xuICAgIHZhciBlbGVtZW50ID0gZ2V0RG9tRWxlbWVudCgpO1xuICAgIGlmIChldmVudCAmJiAhZXZlbnQuZGVhZGxpbmUgJiYgZXZlbnQudGFyZ2V0ICE9PSBlbGVtZW50KSB7XG4gICAgICAvLyBldmVudCBleGlzdHNcbiAgICAgIC8vIG5vdCBpbml0aWF0ZWQgYnkgZGVhZGxpbmVcbiAgICAgIC8vIHRyYW5zaXRpb25FbmQgbm90IGZpcmVkIGJ5IGlubmVyIGVsZW1lbnRzXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBjdXJyZW50QWN0aXZlID0gYWN0aXZlUmVmLmN1cnJlbnQ7XG4gICAgdmFyIGNhbkVuZDtcbiAgICBpZiAoc3RhdHVzID09PSBTVEFUVVNfQVBQRUFSICYmIGN1cnJlbnRBY3RpdmUpIHtcbiAgICAgIGNhbkVuZCA9IG9uQXBwZWFyRW5kID09PSBudWxsIHx8IG9uQXBwZWFyRW5kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFwcGVhckVuZChlbGVtZW50LCBldmVudCk7XG4gICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IFNUQVRVU19FTlRFUiAmJiBjdXJyZW50QWN0aXZlKSB7XG4gICAgICBjYW5FbmQgPSBvbkVudGVyRW5kID09PSBudWxsIHx8IG9uRW50ZXJFbmQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRW50ZXJFbmQoZWxlbWVudCwgZXZlbnQpO1xuICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSBTVEFUVVNfTEVBVkUgJiYgY3VycmVudEFjdGl2ZSkge1xuICAgICAgY2FuRW5kID0gb25MZWF2ZUVuZCA9PT0gbnVsbCB8fCBvbkxlYXZlRW5kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkxlYXZlRW5kKGVsZW1lbnQsIGV2ZW50KTtcbiAgICB9XG5cbiAgICAvLyBPbmx5IHVwZGF0ZSBzdGF0dXMgd2hlbiBgY2FuRW5kYCBhbmQgbm90IGRlc3Ryb3llZFxuICAgIGlmIChzdGF0dXMgIT09IFNUQVRVU19OT05FICYmIGN1cnJlbnRBY3RpdmUgJiYgY2FuRW5kICE9PSBmYWxzZSkge1xuICAgICAgdXBkYXRlTW90aW9uRW5kU3RhdHVzKCk7XG4gICAgfVxuICB9XG4gIHZhciBfdXNlRG9tTW90aW9uRXZlbnRzID0gdXNlRG9tTW90aW9uRXZlbnRzKG9uSW50ZXJuYWxNb3Rpb25FbmQpLFxuICAgIF91c2VEb21Nb3Rpb25FdmVudHMyID0gX3NsaWNlZFRvQXJyYXkoX3VzZURvbU1vdGlvbkV2ZW50cywgMSksXG4gICAgcGF0Y2hNb3Rpb25FdmVudHMgPSBfdXNlRG9tTW90aW9uRXZlbnRzMlswXTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTdGVwID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBnZXRFdmVudEhhbmRsZXJzID0gZnVuY3Rpb24gZ2V0RXZlbnRIYW5kbGVycyh0YXJnZXRTdGF0dXMpIHtcbiAgICB2YXIgX3JlZjIsIF9yZWYzLCBfcmVmNDtcbiAgICBzd2l0Y2ggKHRhcmdldFN0YXR1cykge1xuICAgICAgY2FzZSBTVEFUVVNfQVBQRUFSOlxuICAgICAgICByZXR1cm4gX3JlZjIgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9yZWYyLCBTVEVQX1BSRVBBUkUsIG9uQXBwZWFyUHJlcGFyZSksIF9kZWZpbmVQcm9wZXJ0eShfcmVmMiwgU1RFUF9TVEFSVCwgb25BcHBlYXJTdGFydCksIF9kZWZpbmVQcm9wZXJ0eShfcmVmMiwgU1RFUF9BQ1RJVkUsIG9uQXBwZWFyQWN0aXZlKSwgX3JlZjI7XG4gICAgICBjYXNlIFNUQVRVU19FTlRFUjpcbiAgICAgICAgcmV0dXJuIF9yZWYzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfcmVmMywgU1RFUF9QUkVQQVJFLCBvbkVudGVyUHJlcGFyZSksIF9kZWZpbmVQcm9wZXJ0eShfcmVmMywgU1RFUF9TVEFSVCwgb25FbnRlclN0YXJ0KSwgX2RlZmluZVByb3BlcnR5KF9yZWYzLCBTVEVQX0FDVElWRSwgb25FbnRlckFjdGl2ZSksIF9yZWYzO1xuICAgICAgY2FzZSBTVEFUVVNfTEVBVkU6XG4gICAgICAgIHJldHVybiBfcmVmNCA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX3JlZjQsIFNURVBfUFJFUEFSRSwgb25MZWF2ZVByZXBhcmUpLCBfZGVmaW5lUHJvcGVydHkoX3JlZjQsIFNURVBfU1RBUlQsIG9uTGVhdmVTdGFydCksIF9kZWZpbmVQcm9wZXJ0eShfcmVmNCwgU1RFUF9BQ1RJVkUsIG9uTGVhdmVBY3RpdmUpLCBfcmVmNDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH07XG4gIHZhciBldmVudEhhbmRsZXJzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdldEV2ZW50SGFuZGxlcnMoc3RhdHVzKTtcbiAgfSwgW3N0YXR1c10pO1xuICB2YXIgX3VzZVN0ZXBRdWV1ZSA9IHVzZVN0ZXBRdWV1ZShzdGF0dXMsICFzdXBwb3J0TW90aW9uLCBmdW5jdGlvbiAobmV3U3RlcCkge1xuICAgICAgLy8gT25seSBwcmVwYXJlIHN0ZXAgY2FuIGJlIHNraXBcbiAgICAgIGlmIChuZXdTdGVwID09PSBTVEVQX1BSRVBBUkUpIHtcbiAgICAgICAgdmFyIG9uUHJlcGFyZSA9IGV2ZW50SGFuZGxlcnNbU1RFUF9QUkVQQVJFXTtcbiAgICAgICAgaWYgKCFvblByZXBhcmUpIHtcbiAgICAgICAgICByZXR1cm4gU2tpcFN0ZXA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9uUHJlcGFyZShnZXREb21FbGVtZW50KCkpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXN0IHN0ZXAgaXMgc3luYyB1cGRhdGVcbiAgICAgIGlmIChzdGVwIGluIGV2ZW50SGFuZGxlcnMpIHtcbiAgICAgICAgdmFyIF9ldmVudEhhbmRsZXJzJHN0ZXA7XG4gICAgICAgIHNldFN0eWxlKCgoX2V2ZW50SGFuZGxlcnMkc3RlcCA9IGV2ZW50SGFuZGxlcnNbc3RlcF0pID09PSBudWxsIHx8IF9ldmVudEhhbmRsZXJzJHN0ZXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ldmVudEhhbmRsZXJzJHN0ZXAuY2FsbChldmVudEhhbmRsZXJzLCBnZXREb21FbGVtZW50KCksIG51bGwpKSB8fCBudWxsKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGVwID09PSBTVEVQX0FDVElWRSkge1xuICAgICAgICAvLyBQYXRjaCBldmVudHMgd2hlbiBtb3Rpb24gbmVlZGVkXG4gICAgICAgIHBhdGNoTW90aW9uRXZlbnRzKGdldERvbUVsZW1lbnQoKSk7XG4gICAgICAgIGlmIChtb3Rpb25EZWFkbGluZSA+IDApIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoZGVhZGxpbmVSZWYuY3VycmVudCk7XG4gICAgICAgICAgZGVhZGxpbmVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgb25JbnRlcm5hbE1vdGlvbkVuZCh7XG4gICAgICAgICAgICAgIGRlYWRsaW5lOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LCBtb3Rpb25EZWFkbGluZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdGVwID09PSBTVEVQX1BSRVBBUkVEKSB7XG4gICAgICAgIHVwZGF0ZU1vdGlvbkVuZFN0YXR1cygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIERvU3RlcDtcbiAgICB9KSxcbiAgICBfdXNlU3RlcFF1ZXVlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGVwUXVldWUsIDIpLFxuICAgIHN0YXJ0U3RlcCA9IF91c2VTdGVwUXVldWUyWzBdLFxuICAgIHN0ZXAgPSBfdXNlU3RlcFF1ZXVlMlsxXTtcbiAgdmFyIGFjdGl2ZSA9IGlzQWN0aXZlKHN0ZXApO1xuICBhY3RpdmVSZWYuY3VycmVudCA9IGFjdGl2ZTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFN0YXR1cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFVwZGF0ZSB3aXRoIG5ldyBzdGF0dXNcbiAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc2V0QXN5bmNWaXNpYmxlKHZpc2libGUpO1xuICAgIHZhciBpc01vdW50ZWQgPSBtb3VudGVkUmVmLmN1cnJlbnQ7XG4gICAgbW91bnRlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcblxuICAgIC8vIGlmICghc3VwcG9ydE1vdGlvbikge1xuICAgIC8vICAgcmV0dXJuO1xuICAgIC8vIH1cblxuICAgIHZhciBuZXh0U3RhdHVzO1xuXG4gICAgLy8gQXBwZWFyXG4gICAgaWYgKCFpc01vdW50ZWQgJiYgdmlzaWJsZSAmJiBtb3Rpb25BcHBlYXIpIHtcbiAgICAgIG5leHRTdGF0dXMgPSBTVEFUVVNfQVBQRUFSO1xuICAgIH1cblxuICAgIC8vIEVudGVyXG4gICAgaWYgKGlzTW91bnRlZCAmJiB2aXNpYmxlICYmIG1vdGlvbkVudGVyKSB7XG4gICAgICBuZXh0U3RhdHVzID0gU1RBVFVTX0VOVEVSO1xuICAgIH1cblxuICAgIC8vIExlYXZlXG4gICAgaWYgKGlzTW91bnRlZCAmJiAhdmlzaWJsZSAmJiBtb3Rpb25MZWF2ZSB8fCAhaXNNb3VudGVkICYmIG1vdGlvbkxlYXZlSW1tZWRpYXRlbHkgJiYgIXZpc2libGUgJiYgbW90aW9uTGVhdmUpIHtcbiAgICAgIG5leHRTdGF0dXMgPSBTVEFUVVNfTEVBVkU7XG4gICAgfVxuICAgIHZhciBuZXh0RXZlbnRIYW5kbGVycyA9IGdldEV2ZW50SGFuZGxlcnMobmV4dFN0YXR1cyk7XG5cbiAgICAvLyBVcGRhdGUgdG8gbmV4dCBzdGF0dXNcbiAgICBpZiAobmV4dFN0YXR1cyAmJiAoc3VwcG9ydE1vdGlvbiB8fCBuZXh0RXZlbnRIYW5kbGVyc1tTVEVQX1BSRVBBUkVdKSkge1xuICAgICAgc2V0U3RhdHVzKG5leHRTdGF0dXMpO1xuICAgICAgc3RhcnRTdGVwKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNldCBiYWNrIGluIGNhc2Ugbm8gbW90aW9uIGJ1dCBwcmV2IHN0YXR1cyBoYXMgcHJlcGFyZSBzdGVwXG4gICAgICBzZXRTdGF0dXMoU1RBVFVTX05PTkUpO1xuICAgIH1cbiAgfSwgW3Zpc2libGVdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IEVmZmVjdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJlc2V0IHdoZW4gbW90aW9uIGNoYW5nZWRcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoXG4gICAgLy8gQ2FuY2VsIGFwcGVhclxuICAgIHN0YXR1cyA9PT0gU1RBVFVTX0FQUEVBUiAmJiAhbW90aW9uQXBwZWFyIHx8XG4gICAgLy8gQ2FuY2VsIGVudGVyXG4gICAgc3RhdHVzID09PSBTVEFUVVNfRU5URVIgJiYgIW1vdGlvbkVudGVyIHx8XG4gICAgLy8gQ2FuY2VsIGxlYXZlXG4gICAgc3RhdHVzID09PSBTVEFUVVNfTEVBVkUgJiYgIW1vdGlvbkxlYXZlKSB7XG4gICAgICBzZXRTdGF0dXMoU1RBVFVTX05PTkUpO1xuICAgIH1cbiAgfSwgW21vdGlvbkFwcGVhciwgbW90aW9uRW50ZXIsIG1vdGlvbkxlYXZlXSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vdW50ZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgY2xlYXJUaW1lb3V0KGRlYWRsaW5lUmVmLmN1cnJlbnQpO1xuICAgIH07XG4gIH0sIFtdKTtcblxuICAvLyBUcmlnZ2VyIGBvblZpc2libGVDaGFuZ2VkYFxuICB2YXIgZmlyc3RNb3VudENoYW5nZVJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgLy8gW3Zpc2libGUgJiBtb3Rpb24gbm90IGVuZF0gPT4gWyF2aXNpYmxlICYgbW90aW9uIGVuZF0gc3RpbGwgbmVlZCB0cmlnZ2VyIG9uVmlzaWJsZUNoYW5nZWRcbiAgICBpZiAoYXN5bmNWaXNpYmxlKSB7XG4gICAgICBmaXJzdE1vdW50Q2hhbmdlUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoYXN5bmNWaXNpYmxlICE9PSB1bmRlZmluZWQgJiYgc3RhdHVzID09PSBTVEFUVVNfTk9ORSkge1xuICAgICAgLy8gU2tpcCBmaXJzdCByZW5kZXIgaXMgaW52aXNpYmxlIHNpbmNlIGl0J3Mgbm90aGluZyBjaGFuZ2VkXG4gICAgICBpZiAoZmlyc3RNb3VudENoYW5nZVJlZi5jdXJyZW50IHx8IGFzeW5jVmlzaWJsZSkge1xuICAgICAgICBvblZpc2libGVDaGFuZ2VkID09PSBudWxsIHx8IG9uVmlzaWJsZUNoYW5nZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uVmlzaWJsZUNoYW5nZWQoYXN5bmNWaXNpYmxlKTtcbiAgICAgIH1cbiAgICAgIGZpcnN0TW91bnRDaGFuZ2VSZWYuY3VycmVudCA9IHRydWU7XG4gICAgfVxuICB9LCBbYXN5bmNWaXNpYmxlLCBzdGF0dXNdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFN0eWxlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtZXJnZWRTdHlsZSA9IHN0eWxlO1xuICBpZiAoZXZlbnRIYW5kbGVyc1tTVEVQX1BSRVBBUkVdICYmIHN0ZXAgPT09IFNURVBfU1RBUlQpIHtcbiAgICBtZXJnZWRTdHlsZSA9IF9vYmplY3RTcHJlYWQoe1xuICAgICAgdHJhbnNpdGlvbjogJ25vbmUnXG4gICAgfSwgbWVyZ2VkU3R5bGUpO1xuICB9XG4gIHJldHVybiBbc3RhdHVzLCBzdGVwLCBtZXJnZWRTdHlsZSwgYXN5bmNWaXNpYmxlICE9PSBudWxsICYmIGFzeW5jVmlzaWJsZSAhPT0gdm9pZCAwID8gYXN5bmNWaXNpYmxlIDogdmlzaWJsZV07XG59IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L2RlZmF1bHQtcHJvcHMtbWF0Y2gtcHJvcC10eXBlcywgcmVhY3Qvbm8tbXVsdGktY29tcCwgcmVhY3QvcHJvcC10eXBlcyAqL1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgZmluZERPTU5vZGUgZnJvbSBcInJjLXV0aWwvZXMvRG9tL2ZpbmRET01Ob2RlXCI7XG5pbXBvcnQgeyBmaWxsUmVmLCBzdXBwb3J0UmVmIH0gZnJvbSBcInJjLXV0aWwvZXMvcmVmXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFwiO1xuaW1wb3J0IERvbVdyYXBwZXIgZnJvbSBcIi4vRG9tV3JhcHBlclwiO1xuaW1wb3J0IHVzZVN0YXR1cyBmcm9tIFwiLi9ob29rcy91c2VTdGF0dXNcIjtcbmltcG9ydCB7IGlzQWN0aXZlIH0gZnJvbSBcIi4vaG9va3MvdXNlU3RlcFF1ZXVlXCI7XG5pbXBvcnQgeyBTVEFUVVNfTk9ORSwgU1RFUF9QUkVQQVJFLCBTVEVQX1NUQVJUIH0gZnJvbSBcIi4vaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBnZXRUcmFuc2l0aW9uTmFtZSwgc3VwcG9ydFRyYW5zaXRpb24gfSBmcm9tIFwiLi91dGlsL21vdGlvblwiO1xuLyoqXG4gKiBgdHJhbnNpdGlvblN1cHBvcnRgIGlzIHVzZWQgZm9yIG5vbmUgdHJhbnNpdGlvbiB0ZXN0IGNhc2UuXG4gKiBEZWZhdWx0IHdlIHVzZSBicm93c2VyIHRyYW5zaXRpb24gZXZlbnQgc3VwcG9ydCBjaGVjay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbkNTU01vdGlvbihjb25maWcpIHtcbiAgdmFyIHRyYW5zaXRpb25TdXBwb3J0ID0gY29uZmlnO1xuICBpZiAoX3R5cGVvZihjb25maWcpID09PSAnb2JqZWN0Jykge1xuICAgIHRyYW5zaXRpb25TdXBwb3J0ID0gY29uZmlnLnRyYW5zaXRpb25TdXBwb3J0O1xuICB9XG4gIGZ1bmN0aW9uIGlzU3VwcG9ydFRyYW5zaXRpb24ocHJvcHMsIGNvbnRleHRNb3Rpb24pIHtcbiAgICByZXR1cm4gISEocHJvcHMubW90aW9uTmFtZSAmJiB0cmFuc2l0aW9uU3VwcG9ydCAmJiBjb250ZXh0TW90aW9uICE9PSBmYWxzZSk7XG4gIH1cbiAgdmFyIENTU01vdGlvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gICAgdmFyIF9wcm9wcyR2aXNpYmxlID0gcHJvcHMudmlzaWJsZSxcbiAgICAgIHZpc2libGUgPSBfcHJvcHMkdmlzaWJsZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyR2aXNpYmxlLFxuICAgICAgX3Byb3BzJHJlbW92ZU9uTGVhdmUgPSBwcm9wcy5yZW1vdmVPbkxlYXZlLFxuICAgICAgcmVtb3ZlT25MZWF2ZSA9IF9wcm9wcyRyZW1vdmVPbkxlYXZlID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJHJlbW92ZU9uTGVhdmUsXG4gICAgICBmb3JjZVJlbmRlciA9IHByb3BzLmZvcmNlUmVuZGVyLFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIG1vdGlvbk5hbWUgPSBwcm9wcy5tb3Rpb25OYW1lLFxuICAgICAgbGVhdmVkQ2xhc3NOYW1lID0gcHJvcHMubGVhdmVkQ2xhc3NOYW1lLFxuICAgICAgZXZlbnRQcm9wcyA9IHByb3BzLmV2ZW50UHJvcHM7XG4gICAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb250ZXh0KSxcbiAgICAgIGNvbnRleHRNb3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5tb3Rpb247XG4gICAgdmFyIHN1cHBvcnRNb3Rpb24gPSBpc1N1cHBvcnRUcmFuc2l0aW9uKHByb3BzLCBjb250ZXh0TW90aW9uKTtcblxuICAgIC8vIFJlZiB0byB0aGUgcmVhY3Qgbm9kZSwgaXQgbWF5IGJlIGEgSFRNTEVsZW1lbnRcbiAgICB2YXIgbm9kZVJlZiA9IHVzZVJlZigpO1xuICAgIC8vIFJlZiB0byB0aGUgZG9tIHdyYXBwZXIgaW4gY2FzZSByZWYgY2FuIG5vdCBwYXNzIHRvIEhUTUxFbGVtZW50XG4gICAgdmFyIHdyYXBwZXJOb2RlUmVmID0gdXNlUmVmKCk7XG4gICAgZnVuY3Rpb24gZ2V0RG9tRWxlbWVudCgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEhlcmUgd2UncmUgYXZvaWRpbmcgY2FsbCBmb3IgZmluZERPTU5vZGUgc2luY2UgaXQncyBkZXByZWNhdGVkXG4gICAgICAgIC8vIGluIHN0cmljdCBtb2RlLiBXZSdyZSBjYWxsaW5nIGl0IG9ubHkgd2hlbiBub2RlIHJlZiBpcyBub3RcbiAgICAgICAgLy8gYW4gaW5zdGFuY2Ugb2YgRE9NIEhUTUxFbGVtZW50LiBPdGhlcndpc2UgdXNlXG4gICAgICAgIC8vIGZpbmRET01Ob2RlIGFzIGEgZmluYWwgcmVzb3J0XG4gICAgICAgIHJldHVybiBub2RlUmVmLmN1cnJlbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IG5vZGVSZWYuY3VycmVudCA6IGZpbmRET01Ob2RlKHdyYXBwZXJOb2RlUmVmLmN1cnJlbnQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBPbmx5IGhhcHBlbiB3aGVuIGBtb3Rpb25EZWFkbGluZWAgdHJpZ2dlciBidXQgZWxlbWVudCByZW1vdmVkLlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIF91c2VTdGF0dXMgPSB1c2VTdGF0dXMoc3VwcG9ydE1vdGlvbiwgdmlzaWJsZSwgZ2V0RG9tRWxlbWVudCwgcHJvcHMpLFxuICAgICAgX3VzZVN0YXR1czIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdHVzLCA0KSxcbiAgICAgIHN0YXR1cyA9IF91c2VTdGF0dXMyWzBdLFxuICAgICAgc3RhdHVzU3RlcCA9IF91c2VTdGF0dXMyWzFdLFxuICAgICAgc3RhdHVzU3R5bGUgPSBfdXNlU3RhdHVzMlsyXSxcbiAgICAgIG1lcmdlZFZpc2libGUgPSBfdXNlU3RhdHVzMlszXTtcblxuICAgIC8vIFJlY29yZCB3aGV0aGVyIGNvbnRlbnQgaGFzIHJlbmRlcmVkXG4gICAgLy8gV2lsbCByZXR1cm4gbnVsbCBmb3IgdW4tcmVuZGVyZWQgZXZlbiB3aGVuIGByZW1vdmVPbkxlYXZlPXtmYWxzZX1gXG4gICAgdmFyIHJlbmRlcmVkUmVmID0gUmVhY3QudXNlUmVmKG1lcmdlZFZpc2libGUpO1xuICAgIGlmIChtZXJnZWRWaXNpYmxlKSB7XG4gICAgICByZW5kZXJlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09IFJlZnMgPT09PT09PT09PT09PT09PT09PT09PVxuICAgIHZhciBzZXROb2RlUmVmID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIG5vZGVSZWYuY3VycmVudCA9IG5vZGU7XG4gICAgICBmaWxsUmVmKHJlZiwgbm9kZSk7XG4gICAgfSwgW3JlZl0pO1xuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT1cbiAgICB2YXIgbW90aW9uQ2hpbGRyZW47XG4gICAgdmFyIG1lcmdlZFByb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBldmVudFByb3BzKSwge30sIHtcbiAgICAgIHZpc2libGU6IHZpc2libGVcbiAgICB9KTtcbiAgICBpZiAoIWNoaWxkcmVuKSB7XG4gICAgICAvLyBObyBjaGlsZHJlblxuICAgICAgbW90aW9uQ2hpbGRyZW4gPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSBTVEFUVVNfTk9ORSkge1xuICAgICAgLy8gU3RhYmxlIGNoaWxkcmVuXG4gICAgICBpZiAobWVyZ2VkVmlzaWJsZSkge1xuICAgICAgICBtb3Rpb25DaGlsZHJlbiA9IGNoaWxkcmVuKF9vYmplY3RTcHJlYWQoe30sIG1lcmdlZFByb3BzKSwgc2V0Tm9kZVJlZik7XG4gICAgICB9IGVsc2UgaWYgKCFyZW1vdmVPbkxlYXZlICYmIHJlbmRlcmVkUmVmLmN1cnJlbnQgJiYgbGVhdmVkQ2xhc3NOYW1lKSB7XG4gICAgICAgIG1vdGlvbkNoaWxkcmVuID0gY2hpbGRyZW4oX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtZXJnZWRQcm9wcyksIHt9LCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBsZWF2ZWRDbGFzc05hbWVcbiAgICAgICAgfSksIHNldE5vZGVSZWYpO1xuICAgICAgfSBlbHNlIGlmIChmb3JjZVJlbmRlciB8fCAhcmVtb3ZlT25MZWF2ZSAmJiAhbGVhdmVkQ2xhc3NOYW1lKSB7XG4gICAgICAgIG1vdGlvbkNoaWxkcmVuID0gY2hpbGRyZW4oX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtZXJnZWRQcm9wcyksIHt9LCB7XG4gICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSksIHNldE5vZGVSZWYpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbW90aW9uQ2hpbGRyZW4gPSBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2NsYXNzTmFtZXM7XG4gICAgICAvLyBJbiBtb3Rpb25cbiAgICAgIHZhciBzdGF0dXNTdWZmaXg7XG4gICAgICBpZiAoc3RhdHVzU3RlcCA9PT0gU1RFUF9QUkVQQVJFKSB7XG4gICAgICAgIHN0YXR1c1N1ZmZpeCA9ICdwcmVwYXJlJztcbiAgICAgIH0gZWxzZSBpZiAoaXNBY3RpdmUoc3RhdHVzU3RlcCkpIHtcbiAgICAgICAgc3RhdHVzU3VmZml4ID0gJ2FjdGl2ZSc7XG4gICAgICB9IGVsc2UgaWYgKHN0YXR1c1N0ZXAgPT09IFNURVBfU1RBUlQpIHtcbiAgICAgICAgc3RhdHVzU3VmZml4ID0gJ3N0YXJ0JztcbiAgICAgIH1cbiAgICAgIHZhciBtb3Rpb25DbHMgPSBnZXRUcmFuc2l0aW9uTmFtZShtb3Rpb25OYW1lLCBcIlwiLmNvbmNhdChzdGF0dXMsIFwiLVwiKS5jb25jYXQoc3RhdHVzU3VmZml4KSk7XG4gICAgICBtb3Rpb25DaGlsZHJlbiA9IGNoaWxkcmVuKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgbWVyZ2VkUHJvcHMpLCB7fSwge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoZ2V0VHJhbnNpdGlvbk5hbWUobW90aW9uTmFtZSwgc3RhdHVzKSwgKF9jbGFzc05hbWVzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgbW90aW9uQ2xzLCBtb3Rpb25DbHMgJiYgc3RhdHVzU3VmZml4KSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBtb3Rpb25OYW1lLCB0eXBlb2YgbW90aW9uTmFtZSA9PT0gJ3N0cmluZycpLCBfY2xhc3NOYW1lcykpLFxuICAgICAgICBzdHlsZTogc3RhdHVzU3R5bGVcbiAgICAgIH0pLCBzZXROb2RlUmVmKTtcbiAgICB9XG5cbiAgICAvLyBBdXRvIGluamVjdCByZWYgaWYgY2hpbGQgbm9kZSBub3QgaGF2ZSBgcmVmYCBwcm9wc1xuICAgIGlmICggLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KG1vdGlvbkNoaWxkcmVuKSAmJiBzdXBwb3J0UmVmKG1vdGlvbkNoaWxkcmVuKSkge1xuICAgICAgdmFyIF9yZWYgPSBtb3Rpb25DaGlsZHJlbixcbiAgICAgICAgb3JpZ2luTm9kZVJlZiA9IF9yZWYucmVmO1xuICAgICAgaWYgKCFvcmlnaW5Ob2RlUmVmKSB7XG4gICAgICAgIG1vdGlvbkNoaWxkcmVuID0gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChtb3Rpb25DaGlsZHJlbiwge1xuICAgICAgICAgIHJlZjogc2V0Tm9kZVJlZlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERvbVdyYXBwZXIsIHtcbiAgICAgIHJlZjogd3JhcHBlck5vZGVSZWZcbiAgICB9LCBtb3Rpb25DaGlsZHJlbik7XG4gIH0pO1xuICBDU1NNb3Rpb24uZGlzcGxheU5hbWUgPSAnQ1NTTW90aW9uJztcbiAgcmV0dXJuIENTU01vdGlvbjtcbn1cbmV4cG9ydCBkZWZhdWx0IGdlbkNTU01vdGlvbihzdXBwb3J0VHJhbnNpdGlvbik7IiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmV4cG9ydCB2YXIgU1RBVFVTX0FERCA9ICdhZGQnO1xuZXhwb3J0IHZhciBTVEFUVVNfS0VFUCA9ICdrZWVwJztcbmV4cG9ydCB2YXIgU1RBVFVTX1JFTU9WRSA9ICdyZW1vdmUnO1xuZXhwb3J0IHZhciBTVEFUVVNfUkVNT1ZFRCA9ICdyZW1vdmVkJztcbmV4cG9ydCBmdW5jdGlvbiB3cmFwS2V5VG9PYmplY3Qoa2V5KSB7XG4gIHZhciBrZXlPYmo7XG4gIGlmIChrZXkgJiYgX3R5cGVvZihrZXkpID09PSAnb2JqZWN0JyAmJiAna2V5JyBpbiBrZXkpIHtcbiAgICBrZXlPYmogPSBrZXk7XG4gIH0gZWxzZSB7XG4gICAga2V5T2JqID0ge1xuICAgICAga2V5OiBrZXlcbiAgICB9O1xuICB9XG4gIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGtleU9iaiksIHt9LCB7XG4gICAga2V5OiBTdHJpbmcoa2V5T2JqLmtleSlcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VLZXlzKCkge1xuICB2YXIga2V5cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogW107XG4gIHJldHVybiBrZXlzLm1hcCh3cmFwS2V5VG9PYmplY3QpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZLZXlzKCkge1xuICB2YXIgcHJldktleXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdO1xuICB2YXIgY3VycmVudEtleXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFtdO1xuICB2YXIgbGlzdCA9IFtdO1xuICB2YXIgY3VycmVudEluZGV4ID0gMDtcbiAgdmFyIGN1cnJlbnRMZW4gPSBjdXJyZW50S2V5cy5sZW5ndGg7XG4gIHZhciBwcmV2S2V5T2JqZWN0cyA9IHBhcnNlS2V5cyhwcmV2S2V5cyk7XG4gIHZhciBjdXJyZW50S2V5T2JqZWN0cyA9IHBhcnNlS2V5cyhjdXJyZW50S2V5cyk7XG5cbiAgLy8gQ2hlY2sgcHJldiBrZXlzIHRvIGluc2VydCBvciBrZWVwXG4gIHByZXZLZXlPYmplY3RzLmZvckVhY2goZnVuY3Rpb24gKGtleU9iaikge1xuICAgIHZhciBoaXQgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gY3VycmVudEluZGV4OyBpIDwgY3VycmVudExlbjsgaSArPSAxKSB7XG4gICAgICB2YXIgY3VycmVudEtleU9iaiA9IGN1cnJlbnRLZXlPYmplY3RzW2ldO1xuICAgICAgaWYgKGN1cnJlbnRLZXlPYmoua2V5ID09PSBrZXlPYmoua2V5KSB7XG4gICAgICAgIC8vIE5ldyBhZGRlZCBrZXlzIHNob3VsZCBhZGQgYmVmb3JlIGN1cnJlbnQga2V5XG4gICAgICAgIGlmIChjdXJyZW50SW5kZXggPCBpKSB7XG4gICAgICAgICAgbGlzdCA9IGxpc3QuY29uY2F0KGN1cnJlbnRLZXlPYmplY3RzLnNsaWNlKGN1cnJlbnRJbmRleCwgaSkubWFwKGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG9iaiksIHt9LCB7XG4gICAgICAgICAgICAgIHN0YXR1czogU1RBVFVTX0FERFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIGN1cnJlbnRJbmRleCA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgbGlzdC5wdXNoKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgY3VycmVudEtleU9iaiksIHt9LCB7XG4gICAgICAgICAgc3RhdHVzOiBTVEFUVVNfS0VFUFxuICAgICAgICB9KSk7XG4gICAgICAgIGN1cnJlbnRJbmRleCArPSAxO1xuICAgICAgICBoaXQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBub3QgaGl0LCBpdCBtZWFucyBrZXkgaXMgcmVtb3ZlZFxuICAgIGlmICghaGl0KSB7XG4gICAgICBsaXN0LnB1c2goX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBrZXlPYmopLCB7fSwge1xuICAgICAgICBzdGF0dXM6IFNUQVRVU19SRU1PVkVcbiAgICAgIH0pKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEFkZCByZXN0IHRvIHRoZSBsaXN0XG4gIGlmIChjdXJyZW50SW5kZXggPCBjdXJyZW50TGVuKSB7XG4gICAgbGlzdCA9IGxpc3QuY29uY2F0KGN1cnJlbnRLZXlPYmplY3RzLnNsaWNlKGN1cnJlbnRJbmRleCkubWFwKGZ1bmN0aW9uIChvYmopIHtcbiAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG9iaiksIHt9LCB7XG4gICAgICAgIHN0YXR1czogU1RBVFVTX0FERFxuICAgICAgfSk7XG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlIHNhbWUga2V5IHdoZW4gaXQgcmVtb3ZlIGFuZCBhZGQgYWdhaW46XG4gICAqICAgIFsxIC0gYWRkLCAyIC0ga2VlcCwgMSAtIHJlbW92ZV0gLT4gWzEgLSBrZWVwLCAyIC0ga2VlcF1cbiAgICovXG4gIHZhciBrZXlzID0ge307XG4gIGxpc3QuZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBrZXkgPSBfcmVmLmtleTtcbiAgICBrZXlzW2tleV0gPSAoa2V5c1trZXldIHx8IDApICsgMTtcbiAgfSk7XG4gIHZhciBkdXBsaWNhdGVkS2V5cyA9IE9iamVjdC5rZXlzKGtleXMpLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIGtleXNba2V5XSA+IDE7XG4gIH0pO1xuICBkdXBsaWNhdGVkS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChtYXRjaEtleSkge1xuICAgIC8vIFJlbW92ZSBgU1RBVFVTX1JFTU9WRWAgbm9kZS5cbiAgICBsaXN0ID0gbGlzdC5maWx0ZXIoZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICB2YXIga2V5ID0gX3JlZjIua2V5LFxuICAgICAgICBzdGF0dXMgPSBfcmVmMi5zdGF0dXM7XG4gICAgICByZXR1cm4ga2V5ICE9PSBtYXRjaEtleSB8fCBzdGF0dXMgIT09IFNUQVRVU19SRU1PVkU7XG4gICAgfSk7XG5cbiAgICAvLyBVcGRhdGUgYFNUQVRVU19BRERgIHRvIGBTVEFUVVNfS0VFUGBcbiAgICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIGlmIChub2RlLmtleSA9PT0gbWF0Y2hLZXkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIG5vZGUuc3RhdHVzID0gU1RBVFVTX0tFRVA7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gbGlzdDtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2Fzc2VydFRoaXNJbml0aWFsaXplZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXNzZXJ0VGhpc0luaXRpYWxpemVkXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c1wiO1xuaW1wb3J0IF9jcmVhdGVTdXBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlU3VwZXJcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiY29tcG9uZW50XCIsIFwiY2hpbGRyZW5cIiwgXCJvblZpc2libGVDaGFuZ2VkXCIsIFwib25BbGxSZW1vdmVkXCJdLFxuICBfZXhjbHVkZWQyID0gW1wic3RhdHVzXCJdO1xuLyogZXNsaW50IHJlYWN0L3Byb3AtdHlwZXM6IDAgKi9cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBPcmlnaW5DU1NNb3Rpb24gZnJvbSBcIi4vQ1NTTW90aW9uXCI7XG5pbXBvcnQgeyBzdXBwb3J0VHJhbnNpdGlvbiB9IGZyb20gXCIuL3V0aWwvbW90aW9uXCI7XG5pbXBvcnQgeyBTVEFUVVNfQURELCBTVEFUVVNfS0VFUCwgU1RBVFVTX1JFTU9WRSwgU1RBVFVTX1JFTU9WRUQsIGRpZmZLZXlzLCBwYXJzZUtleXMgfSBmcm9tIFwiLi91dGlsL2RpZmZcIjtcbnZhciBNT1RJT05fUFJPUF9OQU1FUyA9IFsnZXZlbnRQcm9wcycsICd2aXNpYmxlJywgJ2NoaWxkcmVuJywgJ21vdGlvbk5hbWUnLCAnbW90aW9uQXBwZWFyJywgJ21vdGlvbkVudGVyJywgJ21vdGlvbkxlYXZlJywgJ21vdGlvbkxlYXZlSW1tZWRpYXRlbHknLCAnbW90aW9uRGVhZGxpbmUnLCAncmVtb3ZlT25MZWF2ZScsICdsZWF2ZWRDbGFzc05hbWUnLCAnb25BcHBlYXJTdGFydCcsICdvbkFwcGVhckFjdGl2ZScsICdvbkFwcGVhckVuZCcsICdvbkVudGVyU3RhcnQnLCAnb25FbnRlckFjdGl2ZScsICdvbkVudGVyRW5kJywgJ29uTGVhdmVTdGFydCcsICdvbkxlYXZlQWN0aXZlJywgJ29uTGVhdmVFbmQnXTtcbi8qKlxuICogR2VuZXJhdGUgYSBDU1NNb3Rpb25MaXN0IGNvbXBvbmVudCB3aXRoIGNvbmZpZ1xuICogQHBhcmFtIHRyYW5zaXRpb25TdXBwb3J0IE5vIG5lZWQgc2luY2UgQ1NTTW90aW9uTGlzdCBubyBsb25nZXIgZGVwZW5kcyBvbiB0cmFuc2l0aW9uIHN1cHBvcnRcbiAqIEBwYXJhbSBDU1NNb3Rpb24gQ1NTTW90aW9uIGNvbXBvbmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuQ1NTTW90aW9uTGlzdCh0cmFuc2l0aW9uU3VwcG9ydCkge1xuICB2YXIgQ1NTTW90aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBPcmlnaW5DU1NNb3Rpb247XG4gIHZhciBDU1NNb3Rpb25MaXN0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICAgX2luaGVyaXRzKENTU01vdGlvbkxpc3QsIF9SZWFjdCRDb21wb25lbnQpO1xuICAgIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoQ1NTTW90aW9uTGlzdCk7XG4gICAgZnVuY3Rpb24gQ1NTTW90aW9uTGlzdCgpIHtcbiAgICAgIHZhciBfdGhpcztcbiAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDU1NNb3Rpb25MaXN0KTtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbC5hcHBseShfc3VwZXIsIFt0aGlzXS5jb25jYXQoYXJncykpO1xuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInN0YXRlXCIsIHtcbiAgICAgICAga2V5RW50aXRpZXM6IFtdXG4gICAgICB9KTtcbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJyZW1vdmVLZXlcIiwgZnVuY3Rpb24gKHJlbW92ZUtleSkge1xuICAgICAgICB2YXIga2V5RW50aXRpZXMgPSBfdGhpcy5zdGF0ZS5rZXlFbnRpdGllcztcbiAgICAgICAgdmFyIG5leHRLZXlFbnRpdGllcyA9IGtleUVudGl0aWVzLm1hcChmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgICAgaWYgKGVudGl0eS5rZXkgIT09IHJlbW92ZUtleSkgcmV0dXJuIGVudGl0eTtcbiAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBlbnRpdHkpLCB7fSwge1xuICAgICAgICAgICAgc3RhdHVzOiBTVEFUVVNfUkVNT1ZFRFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGtleUVudGl0aWVzOiBuZXh0S2V5RW50aXRpZXNcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXh0S2V5RW50aXRpZXMuZmlsdGVyKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgICAgdmFyIHN0YXR1cyA9IF9yZWYuc3RhdHVzO1xuICAgICAgICAgIHJldHVybiBzdGF0dXMgIT09IFNUQVRVU19SRU1PVkVEO1xuICAgICAgICB9KS5sZW5ndGg7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgX2NyZWF0ZUNsYXNzKENTU01vdGlvbkxpc3QsIFt7XG4gICAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgICB2YXIgX3RoaXMyID0gdGhpcztcbiAgICAgICAgdmFyIGtleUVudGl0aWVzID0gdGhpcy5zdGF0ZS5rZXlFbnRpdGllcztcbiAgICAgICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBjb21wb25lbnQgPSBfdGhpcyRwcm9wcy5jb21wb25lbnQsXG4gICAgICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgICBfb25WaXNpYmxlQ2hhbmdlZCA9IF90aGlzJHByb3BzLm9uVmlzaWJsZUNoYW5nZWQsXG4gICAgICAgICAgb25BbGxSZW1vdmVkID0gX3RoaXMkcHJvcHMub25BbGxSZW1vdmVkLFxuICAgICAgICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfdGhpcyRwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgICAgICAgdmFyIENvbXBvbmVudCA9IGNvbXBvbmVudCB8fCBSZWFjdC5GcmFnbWVudDtcbiAgICAgICAgdmFyIG1vdGlvblByb3BzID0ge307XG4gICAgICAgIE1PVElPTl9QUk9QX05BTUVTLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICBtb3Rpb25Qcm9wc1twcm9wXSA9IHJlc3RQcm9wc1twcm9wXTtcbiAgICAgICAgICBkZWxldGUgcmVzdFByb3BzW3Byb3BdO1xuICAgICAgICB9KTtcbiAgICAgICAgZGVsZXRlIHJlc3RQcm9wcy5rZXlzO1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCByZXN0UHJvcHMsIGtleUVudGl0aWVzLm1hcChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgICAgICB2YXIgc3RhdHVzID0gX3JlZjIuc3RhdHVzLFxuICAgICAgICAgICAgZXZlbnRQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmMiwgX2V4Y2x1ZGVkMik7XG4gICAgICAgICAgdmFyIHZpc2libGUgPSBzdGF0dXMgPT09IFNUQVRVU19BREQgfHwgc3RhdHVzID09PSBTVEFUVVNfS0VFUDtcbiAgICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ1NTTW90aW9uLCBfZXh0ZW5kcyh7fSwgbW90aW9uUHJvcHMsIHtcbiAgICAgICAgICAgIGtleTogZXZlbnRQcm9wcy5rZXksXG4gICAgICAgICAgICB2aXNpYmxlOiB2aXNpYmxlLFxuICAgICAgICAgICAgZXZlbnRQcm9wczogZXZlbnRQcm9wcyxcbiAgICAgICAgICAgIG9uVmlzaWJsZUNoYW5nZWQ6IGZ1bmN0aW9uIG9uVmlzaWJsZUNoYW5nZWQoY2hhbmdlZFZpc2libGUpIHtcbiAgICAgICAgICAgICAgX29uVmlzaWJsZUNoYW5nZWQgPT09IG51bGwgfHwgX29uVmlzaWJsZUNoYW5nZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vblZpc2libGVDaGFuZ2VkKGNoYW5nZWRWaXNpYmxlLCB7XG4gICAgICAgICAgICAgICAga2V5OiBldmVudFByb3BzLmtleVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYgKCFjaGFuZ2VkVmlzaWJsZSkge1xuICAgICAgICAgICAgICAgIHZhciByZXN0S2V5c0NvdW50ID0gX3RoaXMyLnJlbW92ZUtleShldmVudFByb3BzLmtleSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3RLZXlzQ291bnQgPT09IDAgJiYgb25BbGxSZW1vdmVkKSB7XG4gICAgICAgICAgICAgICAgICBvbkFsbFJlbW92ZWQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSwgY2hpbGRyZW4pO1xuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfV0sIFt7XG4gICAgICBrZXk6IFwiZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKF9yZWYzLCBfcmVmNCkge1xuICAgICAgICB2YXIga2V5cyA9IF9yZWYzLmtleXM7XG4gICAgICAgIHZhciBrZXlFbnRpdGllcyA9IF9yZWY0LmtleUVudGl0aWVzO1xuICAgICAgICB2YXIgcGFyc2VkS2V5T2JqZWN0cyA9IHBhcnNlS2V5cyhrZXlzKTtcbiAgICAgICAgdmFyIG1peGVkS2V5RW50aXRpZXMgPSBkaWZmS2V5cyhrZXlFbnRpdGllcywgcGFyc2VkS2V5T2JqZWN0cyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAga2V5RW50aXRpZXM6IG1peGVkS2V5RW50aXRpZXMuZmlsdGVyKGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgICAgIHZhciBwcmV2RW50aXR5ID0ga2V5RW50aXRpZXMuZmluZChmdW5jdGlvbiAoX3JlZjUpIHtcbiAgICAgICAgICAgICAgdmFyIGtleSA9IF9yZWY1LmtleTtcbiAgICAgICAgICAgICAgcmV0dXJuIGVudGl0eS5rZXkgPT09IGtleTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBSZW1vdmUgaWYgYWxyZWFkeSBtYXJrIGFzIHJlbW92ZWRcbiAgICAgICAgICAgIGlmIChwcmV2RW50aXR5ICYmIHByZXZFbnRpdHkuc3RhdHVzID09PSBTVEFUVVNfUkVNT1ZFRCAmJiBlbnRpdHkuc3RhdHVzID09PSBTVEFUVVNfUkVNT1ZFKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0pXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIFpvbWJpZUo6IFJldHVybiB0aGUgY291bnQgb2YgcmVzdCBrZXlzLiBJdCdzIHNhZmUgdG8gcmVmYWN0b3IgaWYgbmVlZCBtb3JlIGluZm8uXG4gICAgfV0pO1xuICAgIHJldHVybiBDU1NNb3Rpb25MaXN0O1xuICB9KFJlYWN0LkNvbXBvbmVudCk7XG4gIF9kZWZpbmVQcm9wZXJ0eShDU1NNb3Rpb25MaXN0LCBcImRlZmF1bHRQcm9wc1wiLCB7XG4gICAgY29tcG9uZW50OiAnZGl2J1xuICB9KTtcbiAgcmV0dXJuIENTU01vdGlvbkxpc3Q7XG59XG5leHBvcnQgZGVmYXVsdCBnZW5DU1NNb3Rpb25MaXN0KHN1cHBvcnRUcmFuc2l0aW9uKTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX2NyZWF0ZVN1cGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlclwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbnZhciBOb3RpY2UgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzKE5vdGljZSwgX0NvbXBvbmVudCk7XG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoTm90aWNlKTtcbiAgZnVuY3Rpb24gTm90aWNlKCkge1xuICAgIHZhciBfdGhpcztcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTm90aWNlKTtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwuYXBwbHkoX3N1cGVyLCBbdGhpc10uY29uY2F0KGFyZ3MpKTtcbiAgICBfdGhpcy5jbG9zZVRpbWVyID0gbnVsbDtcbiAgICBfdGhpcy5jbG9zZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuICAgICAgX3RoaXMuY2xlYXJDbG9zZVRpbWVyKCk7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgb25DbG9zZSA9IF90aGlzJHByb3BzLm9uQ2xvc2UsXG4gICAgICAgIG5vdGljZUtleSA9IF90aGlzJHByb3BzLm5vdGljZUtleTtcbiAgICAgIGlmIChvbkNsb3NlKSB7XG4gICAgICAgIG9uQ2xvc2Uobm90aWNlS2V5KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIF90aGlzLnN0YXJ0Q2xvc2VUaW1lciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy5wcm9wcy5kdXJhdGlvbikge1xuICAgICAgICBfdGhpcy5jbG9zZVRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzLmNsb3NlKCk7XG4gICAgICAgIH0sIF90aGlzLnByb3BzLmR1cmF0aW9uICogMTAwMCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBfdGhpcy5jbGVhckNsb3NlVGltZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMuY2xvc2VUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQoX3RoaXMuY2xvc2VUaW1lcik7XG4gICAgICAgIF90aGlzLmNsb3NlVGltZXIgPSBudWxsO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIF9jcmVhdGVDbGFzcyhOb3RpY2UsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5zdGFydENsb3NlVGltZXIoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICAgIGlmICh0aGlzLnByb3BzLmR1cmF0aW9uICE9PSBwcmV2UHJvcHMuZHVyYXRpb24gfHwgdGhpcy5wcm9wcy51cGRhdGVNYXJrICE9PSBwcmV2UHJvcHMudXBkYXRlTWFyayB8fFxuICAgICAgLy8gVmlzaWJsZSBhZ2FpbiBuZWVkIHJlc2V0IHRpbWVyXG4gICAgICB0aGlzLnByb3BzLnZpc2libGUgIT09IHByZXZQcm9wcy52aXNpYmxlICYmIHRoaXMucHJvcHMudmlzaWJsZSkge1xuICAgICAgICB0aGlzLnJlc3RhcnRDbG9zZVRpbWVyKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudFdpbGxVbm1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgdGhpcy5jbGVhckNsb3NlVGltZXIoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzdGFydENsb3NlVGltZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzdGFydENsb3NlVGltZXIoKSB7XG4gICAgICB0aGlzLmNsZWFyQ2xvc2VUaW1lcigpO1xuICAgICAgdGhpcy5zdGFydENsb3NlVGltZXIoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgIHByZWZpeENscyA9IF90aGlzJHByb3BzMi5wcmVmaXhDbHMsXG4gICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzMi5jbGFzc05hbWUsXG4gICAgICAgIGNsb3NhYmxlID0gX3RoaXMkcHJvcHMyLmNsb3NhYmxlLFxuICAgICAgICBjbG9zZUljb24gPSBfdGhpcyRwcm9wczIuY2xvc2VJY29uLFxuICAgICAgICBzdHlsZSA9IF90aGlzJHByb3BzMi5zdHlsZSxcbiAgICAgICAgb25DbGljayA9IF90aGlzJHByb3BzMi5vbkNsaWNrLFxuICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzMi5jaGlsZHJlbixcbiAgICAgICAgaG9sZGVyID0gX3RoaXMkcHJvcHMyLmhvbGRlcjtcbiAgICAgIHZhciBjb21wb25lbnRDbGFzcyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbm90aWNlXCIpO1xuICAgICAgdmFyIGRhdGFPckFyaWFBdHRyaWJ1dGVQcm9wcyA9IE9iamVjdC5rZXlzKHRoaXMucHJvcHMpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICAgICAgaWYgKGtleS5zdWJzdHIoMCwgNSkgPT09ICdkYXRhLScgfHwga2V5LnN1YnN0cigwLCA1KSA9PT0gJ2FyaWEtJyB8fCBrZXkgPT09ICdyb2xlJykge1xuICAgICAgICAgIGFjY1trZXldID0gX3RoaXMyLnByb3BzW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9KTtcbiAgICAgIHZhciBub2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY29tcG9uZW50Q2xhc3MsIGNsYXNzTmFtZSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChjb21wb25lbnRDbGFzcywgXCItY2xvc2FibGVcIiksIGNsb3NhYmxlKSksXG4gICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgb25Nb3VzZUVudGVyOiB0aGlzLmNsZWFyQ2xvc2VUaW1lcixcbiAgICAgICAgb25Nb3VzZUxlYXZlOiB0aGlzLnN0YXJ0Q2xvc2VUaW1lcixcbiAgICAgICAgb25DbGljazogb25DbGlja1xuICAgICAgfSwgZGF0YU9yQXJpYUF0dHJpYnV0ZVByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KGNvbXBvbmVudENsYXNzLCBcIi1jb250ZW50XCIpXG4gICAgICB9LCBjaGlsZHJlbiksIGNsb3NhYmxlID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHtcbiAgICAgICAgdGFiSW5kZXg6IDAsXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuY2xvc2UsXG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoY29tcG9uZW50Q2xhc3MsIFwiLWNsb3NlXCIpXG4gICAgICB9LCBjbG9zZUljb24gfHwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChjb21wb25lbnRDbGFzcywgXCItY2xvc2UteFwiKVxuICAgICAgfSkpIDogbnVsbCk7XG4gICAgICBpZiAoaG9sZGVyKSB7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3RET00uY3JlYXRlUG9ydGFsKG5vZGUsIGhvbGRlcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIE5vdGljZTtcbn0oQ29tcG9uZW50KTtcbk5vdGljZS5kZWZhdWx0UHJvcHMgPSB7XG4gIG9uQ2xvc2U6IGZ1bmN0aW9uIG9uQ2xvc2UoKSB7fSxcbiAgZHVyYXRpb246IDEuNVxufTtcbmV4cG9ydCB7IE5vdGljZSBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgTm90aWNlIGZyb20gJy4vTm90aWNlJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb25JbnN0YW5jZSkge1xuICB2YXIgY3JlYXRlZFJlZiA9IFJlYWN0LnVzZVJlZih7fSk7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShbXSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgZWxlbWVudHMgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldEVsZW1lbnRzID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgZnVuY3Rpb24gbm90aWZ5KG5vdGljZVByb3BzKSB7XG4gICAgdmFyIGZpcnN0TW91bnQgPSB0cnVlO1xuICAgIG5vdGlmaWNhdGlvbkluc3RhbmNlLmFkZChub3RpY2VQcm9wcywgZnVuY3Rpb24gKGRpdiwgcHJvcHMpIHtcbiAgICAgIHZhciBrZXkgPSBwcm9wcy5rZXk7XG4gICAgICBpZiAoZGl2ICYmICghY3JlYXRlZFJlZi5jdXJyZW50W2tleV0gfHwgZmlyc3RNb3VudCkpIHtcbiAgICAgICAgdmFyIG5vdGljZUVsZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE5vdGljZSwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgICAgICAgaG9sZGVyOiBkaXZcbiAgICAgICAgfSkpO1xuICAgICAgICBjcmVhdGVkUmVmLmN1cnJlbnRba2V5XSA9IG5vdGljZUVsZTtcbiAgICAgICAgc2V0RWxlbWVudHMoZnVuY3Rpb24gKG9yaWdpbkVsZW1lbnRzKSB7XG4gICAgICAgICAgdmFyIGluZGV4ID0gb3JpZ2luRWxlbWVudHMuZmluZEluZGV4KGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGUua2V5ID09PSBwcm9wcy5rZXk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkob3JpZ2luRWxlbWVudHMpLCBbbm90aWNlRWxlXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBjbG9uZUxpc3QgPSBfdG9Db25zdW1hYmxlQXJyYXkob3JpZ2luRWxlbWVudHMpO1xuICAgICAgICAgIGNsb25lTGlzdFtpbmRleF0gPSBub3RpY2VFbGU7XG4gICAgICAgICAgcmV0dXJuIGNsb25lTGlzdDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBmaXJzdE1vdW50ID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIFtub3RpZnksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBlbGVtZW50cyldO1xufSIsImltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX2NyZWF0ZVN1cGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlclwiO1xudmFyIF9leGNsdWRlZCA9IFtcImdldENvbnRhaW5lclwiXTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHJlbmRlciwgdW5tb3VudCB9IGZyb20gXCJyYy11dGlsL2VzL1JlYWN0L3JlbmRlclwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBDU1NNb3Rpb25MaXN0IH0gZnJvbSAncmMtbW90aW9uJztcbmltcG9ydCBOb3RpY2UgZnJvbSAnLi9Ob3RpY2UnO1xuaW1wb3J0IF91c2VOb3RpZmljYXRpb24gZnJvbSAnLi91c2VOb3RpZmljYXRpb24nO1xudmFyIHNlZWQgPSAwO1xudmFyIG5vdyA9IERhdGUubm93KCk7XG5mdW5jdGlvbiBnZXRVdWlkKCkge1xuICB2YXIgaWQgPSBzZWVkO1xuICBzZWVkICs9IDE7XG4gIHJldHVybiBcInJjTm90aWZpY2F0aW9uX1wiLmNvbmNhdChub3csIFwiX1wiKS5jb25jYXQoaWQpO1xufVxudmFyIE5vdGlmaWNhdGlvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoTm90aWZpY2F0aW9uLCBfQ29tcG9uZW50KTtcbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihOb3RpZmljYXRpb24pO1xuICBmdW5jdGlvbiBOb3RpZmljYXRpb24oKSB7XG4gICAgdmFyIF90aGlzO1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBOb3RpZmljYXRpb24pO1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbC5hcHBseShfc3VwZXIsIFt0aGlzXS5jb25jYXQoYXJncykpO1xuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgbm90aWNlczogW11cbiAgICB9O1xuICAgIF90aGlzLmhvb2tSZWZzID0gbmV3IE1hcCgpO1xuICAgIF90aGlzLmFkZCA9IGZ1bmN0aW9uIChvcmlnaW5Ob3RpY2UsIGhvbGRlckNhbGxiYWNrKSB7XG4gICAgICB2YXIgX29yaWdpbk5vdGljZSRrZXk7XG4gICAgICB2YXIga2V5ID0gKF9vcmlnaW5Ob3RpY2Uka2V5ID0gb3JpZ2luTm90aWNlLmtleSkgIT09IG51bGwgJiYgX29yaWdpbk5vdGljZSRrZXkgIT09IHZvaWQgMCA/IF9vcmlnaW5Ob3RpY2Uka2V5IDogZ2V0VXVpZCgpO1xuICAgICAgdmFyIG5vdGljZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb3JpZ2luTm90aWNlKSwge30sIHtcbiAgICAgICAga2V5OiBrZXlcbiAgICAgIH0pO1xuICAgICAgdmFyIG1heENvdW50ID0gX3RoaXMucHJvcHMubWF4Q291bnQ7XG4gICAgICBfdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldmlvdXNTdGF0ZSkge1xuICAgICAgICB2YXIgbm90aWNlcyA9IHByZXZpb3VzU3RhdGUubm90aWNlcztcbiAgICAgICAgdmFyIG5vdGljZUluZGV4ID0gbm90aWNlcy5tYXAoZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICByZXR1cm4gdi5ub3RpY2Uua2V5O1xuICAgICAgICB9KS5pbmRleE9mKGtleSk7XG4gICAgICAgIHZhciB1cGRhdGVkTm90aWNlcyA9IG5vdGljZXMuY29uY2F0KCk7XG4gICAgICAgIGlmIChub3RpY2VJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICB1cGRhdGVkTm90aWNlcy5zcGxpY2Uobm90aWNlSW5kZXgsIDEsIHtcbiAgICAgICAgICAgIG5vdGljZTogbm90aWNlLFxuICAgICAgICAgICAgaG9sZGVyQ2FsbGJhY2s6IGhvbGRlckNhbGxiYWNrXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKG1heENvdW50ICYmIG5vdGljZXMubGVuZ3RoID49IG1heENvdW50KSB7XG4gICAgICAgICAgICAvLyBYWFgsIHVzZSBrZXkgb2YgZmlyc3QgaXRlbSB0byB1cGRhdGUgbmV3IGFkZGVkIChsZXQgUmVhY3QgdG8gbW92ZSBleHNpdGluZ1xuICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiByZW1vdmUgYW5kIG1vdW50KS4gU2FtZSBrZXkgd2FzIHVzZWQgYmVmb3JlIGZvciBib3RoIGEpIGV4dGVybmFsXG4gICAgICAgICAgICAvLyBtYW51YWwgY29udHJvbCBhbmQgYikgaW50ZXJuYWwgcmVhY3QgJ2tleScgcHJvcCAsIHdoaWNoIGlzIG5vdCB0aGF0IGdvb2QuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgIC8vIHpvbWJpZUo6IE5vdCBrbm93IHdoeSB1c2UgYHVwZGF0ZUtleWAuIFRoaXMgbWFrZXMgTm90aWNlIGluZmluaXRlIGxvb3AgaW4gamVzdC5cbiAgICAgICAgICAgIC8vIENoYW5nZSB0byBgdXBkYXRlTWFya2AgZm9yIGNvbXBhcmUgaW5zdGVhZC5cbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1jb21wb25lbnQvbm90aWZpY2F0aW9uL2NvbW1pdC8zMjI5OWU2YmUzOTZmOTQwNDBiZmE4MjUxN2VlYTk0MGRiOTQ3ZWNlXG4gICAgICAgICAgICBub3RpY2Uua2V5ID0gdXBkYXRlZE5vdGljZXNbMF0ubm90aWNlLmtleTtcbiAgICAgICAgICAgIG5vdGljZS51cGRhdGVNYXJrID0gZ2V0VXVpZCgpO1xuICAgICAgICAgICAgLy8gem9tYmllSjogVGhhdCdzIHdoeS4gVXNlciBtYXkgY2xvc2UgYnkga2V5IGRpcmVjdGx5LlxuICAgICAgICAgICAgLy8gV2UgbmVlZCByZWNvcmQgdGhpcyBidXQgbm90IHJlLXJlbmRlciB0byBhdm9pZCB1cHBlciBpc3N1ZVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWNvbXBvbmVudC9ub3RpZmljYXRpb24vaXNzdWVzLzEyOVxuICAgICAgICAgICAgbm90aWNlLnVzZXJQYXNzS2V5ID0ga2V5O1xuICAgICAgICAgICAgdXBkYXRlZE5vdGljZXMuc2hpZnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdXBkYXRlZE5vdGljZXMucHVzaCh7XG4gICAgICAgICAgICBub3RpY2U6IG5vdGljZSxcbiAgICAgICAgICAgIGhvbGRlckNhbGxiYWNrOiBob2xkZXJDYWxsYmFja1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbm90aWNlczogdXBkYXRlZE5vdGljZXNcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgX3RoaXMucmVtb3ZlID0gZnVuY3Rpb24gKHJlbW92ZUtleSkge1xuICAgICAgX3RoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgdmFyIG5vdGljZXMgPSBfcmVmLm5vdGljZXM7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbm90aWNlczogbm90aWNlcy5maWx0ZXIoZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICAgICAgICB2YXIgX3JlZjIkbm90aWNlID0gX3JlZjIubm90aWNlLFxuICAgICAgICAgICAgICBrZXkgPSBfcmVmMiRub3RpY2Uua2V5LFxuICAgICAgICAgICAgICB1c2VyUGFzc0tleSA9IF9yZWYyJG5vdGljZS51c2VyUGFzc0tleTtcbiAgICAgICAgICAgIHZhciBtZXJnZWRLZXkgPSB1c2VyUGFzc0tleSAhPT0gbnVsbCAmJiB1c2VyUGFzc0tleSAhPT0gdm9pZCAwID8gdXNlclBhc3NLZXkgOiBrZXk7XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VkS2V5ICE9PSByZW1vdmVLZXk7XG4gICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgX3RoaXMubm90aWNlUHJvcHNNYXAgPSB7fTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgX2NyZWF0ZUNsYXNzKE5vdGlmaWNhdGlvbiwgW3tcbiAgICBrZXk6IFwiZ2V0VHJhbnNpdGlvbk5hbWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VHJhbnNpdGlvbk5hbWUoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wcy5wcmVmaXhDbHMsXG4gICAgICAgIGFuaW1hdGlvbiA9IF90aGlzJHByb3BzLmFuaW1hdGlvbjtcbiAgICAgIHZhciB0cmFuc2l0aW9uTmFtZSA9IHRoaXMucHJvcHMudHJhbnNpdGlvbk5hbWU7XG4gICAgICBpZiAoIXRyYW5zaXRpb25OYW1lICYmIGFuaW1hdGlvbikge1xuICAgICAgICB0cmFuc2l0aW9uTmFtZSA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChhbmltYXRpb24pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRyYW5zaXRpb25OYW1lO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG4gICAgICB2YXIgbm90aWNlcyA9IHRoaXMuc3RhdGUubm90aWNlcztcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wczIucHJlZml4Q2xzLFxuICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wczIuY2xhc3NOYW1lLFxuICAgICAgICBjbG9zZUljb24gPSBfdGhpcyRwcm9wczIuY2xvc2VJY29uLFxuICAgICAgICBzdHlsZSA9IF90aGlzJHByb3BzMi5zdHlsZTtcbiAgICAgIHZhciBub3RpY2VLZXlzID0gW107XG4gICAgICBub3RpY2VzLmZvckVhY2goZnVuY3Rpb24gKF9yZWYzLCBpbmRleCkge1xuICAgICAgICB2YXIgbm90aWNlID0gX3JlZjMubm90aWNlLFxuICAgICAgICAgIGhvbGRlckNhbGxiYWNrID0gX3JlZjMuaG9sZGVyQ2FsbGJhY2s7XG4gICAgICAgIHZhciB1cGRhdGVNYXJrID0gaW5kZXggPT09IG5vdGljZXMubGVuZ3RoIC0gMSA/IG5vdGljZS51cGRhdGVNYXJrIDogdW5kZWZpbmVkO1xuICAgICAgICB2YXIga2V5ID0gbm90aWNlLmtleSxcbiAgICAgICAgICB1c2VyUGFzc0tleSA9IG5vdGljZS51c2VyUGFzc0tleTtcbiAgICAgICAgdmFyIG5vdGljZVByb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe1xuICAgICAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgICAgIGNsb3NlSWNvbjogY2xvc2VJY29uXG4gICAgICAgIH0sIG5vdGljZSksIG5vdGljZS5wcm9wcyksIHt9LCB7XG4gICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgbm90aWNlS2V5OiB1c2VyUGFzc0tleSB8fCBrZXksXG4gICAgICAgICAgdXBkYXRlTWFyazogdXBkYXRlTWFyayxcbiAgICAgICAgICBvbkNsb3NlOiBmdW5jdGlvbiBvbkNsb3NlKG5vdGljZUtleSkge1xuICAgICAgICAgICAgdmFyIF9ub3RpY2Ukb25DbG9zZTtcbiAgICAgICAgICAgIF90aGlzMi5yZW1vdmUobm90aWNlS2V5KTtcbiAgICAgICAgICAgIChfbm90aWNlJG9uQ2xvc2UgPSBub3RpY2Uub25DbG9zZSkgPT09IG51bGwgfHwgX25vdGljZSRvbkNsb3NlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbm90aWNlJG9uQ2xvc2UuY2FsbChub3RpY2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25DbGljazogbm90aWNlLm9uQ2xpY2ssXG4gICAgICAgICAgY2hpbGRyZW46IG5vdGljZS5jb250ZW50XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBHaXZlIHRvIG1vdGlvblxuICAgICAgICBub3RpY2VLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgX3RoaXMyLm5vdGljZVByb3BzTWFwW2tleV0gPSB7XG4gICAgICAgICAgcHJvcHM6IG5vdGljZVByb3BzLFxuICAgICAgICAgIGhvbGRlckNhbGxiYWNrOiBob2xkZXJDYWxsYmFja1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBjbGFzc05hbWUpLFxuICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENTU01vdGlvbkxpc3QsIHtcbiAgICAgICAga2V5czogbm90aWNlS2V5cyxcbiAgICAgICAgbW90aW9uTmFtZTogdGhpcy5nZXRUcmFuc2l0aW9uTmFtZSgpLFxuICAgICAgICBvblZpc2libGVDaGFuZ2VkOiBmdW5jdGlvbiBvblZpc2libGVDaGFuZ2VkKGNoYW5nZWRWaXNpYmxlLCBfcmVmNCkge1xuICAgICAgICAgIHZhciBrZXkgPSBfcmVmNC5rZXk7XG4gICAgICAgICAgaWYgKCFjaGFuZ2VkVmlzaWJsZSkge1xuICAgICAgICAgICAgZGVsZXRlIF90aGlzMi5ub3RpY2VQcm9wc01hcFtrZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgZnVuY3Rpb24gKF9yZWY1KSB7XG4gICAgICAgIHZhciBrZXkgPSBfcmVmNS5rZXksXG4gICAgICAgICAgbW90aW9uQ2xhc3NOYW1lID0gX3JlZjUuY2xhc3NOYW1lLFxuICAgICAgICAgIG1vdGlvblN0eWxlID0gX3JlZjUuc3R5bGUsXG4gICAgICAgICAgdmlzaWJsZSA9IF9yZWY1LnZpc2libGU7XG4gICAgICAgIHZhciBfdGhpczIkbm90aWNlUHJvcHNNYXAgPSBfdGhpczIubm90aWNlUHJvcHNNYXBba2V5XSxcbiAgICAgICAgICBub3RpY2VQcm9wcyA9IF90aGlzMiRub3RpY2VQcm9wc01hcC5wcm9wcyxcbiAgICAgICAgICBob2xkZXJDYWxsYmFjayA9IF90aGlzMiRub3RpY2VQcm9wc01hcC5ob2xkZXJDYWxsYmFjaztcbiAgICAgICAgaWYgKGhvbGRlckNhbGxiYWNrKSB7XG4gICAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKG1vdGlvbkNsYXNzTmFtZSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ob29rLWhvbGRlclwiKSksXG4gICAgICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZCh7fSwgbW90aW9uU3R5bGUpLFxuICAgICAgICAgICAgcmVmOiBmdW5jdGlvbiByZWYoZGl2KSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZGl2KSB7XG4gICAgICAgICAgICAgICAgX3RoaXMyLmhvb2tSZWZzLnNldChrZXksIGRpdik7XG4gICAgICAgICAgICAgICAgaG9sZGVyQ2FsbGJhY2soZGl2LCBub3RpY2VQcm9wcyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgX3RoaXMyLmhvb2tSZWZzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE5vdGljZSwgX2V4dGVuZHMoe30sIG5vdGljZVByb3BzLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKG1vdGlvbkNsYXNzTmFtZSwgbm90aWNlUHJvcHMgPT09IG51bGwgfHwgbm90aWNlUHJvcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5vdGljZVByb3BzLmNsYXNzTmFtZSksXG4gICAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgbW90aW9uU3R5bGUpLCBub3RpY2VQcm9wcyA9PT0gbnVsbCB8fCBub3RpY2VQcm9wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogbm90aWNlUHJvcHMuc3R5bGUpLFxuICAgICAgICAgIHZpc2libGU6IHZpc2libGVcbiAgICAgICAgfSkpO1xuICAgICAgfSkpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gTm90aWZpY2F0aW9uO1xufShDb21wb25lbnQpO1xuTm90aWZpY2F0aW9uLm5ld0luc3RhbmNlID0gdm9pZCAwO1xuTm90aWZpY2F0aW9uLmRlZmF1bHRQcm9wcyA9IHtcbiAgcHJlZml4Q2xzOiAncmMtbm90aWZpY2F0aW9uJyxcbiAgYW5pbWF0aW9uOiAnZmFkZScsXG4gIHN0eWxlOiB7XG4gICAgdG9wOiA2NSxcbiAgICBsZWZ0OiAnNTAlJ1xuICB9XG59O1xuTm90aWZpY2F0aW9uLm5ld0luc3RhbmNlID0gZnVuY3Rpb24gbmV3Tm90aWZpY2F0aW9uSW5zdGFuY2UocHJvcGVydGllcywgY2FsbGJhY2spIHtcbiAgdmFyIF9yZWY2ID0gcHJvcGVydGllcyB8fCB7fSxcbiAgICBnZXRDb250YWluZXIgPSBfcmVmNi5nZXRDb250YWluZXIsXG4gICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjYsIF9leGNsdWRlZCk7XG4gIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgaWYgKGdldENvbnRhaW5lcikge1xuICAgIHZhciByb290ID0gZ2V0Q29udGFpbmVyKCk7XG4gICAgcm9vdC5hcHBlbmRDaGlsZChkaXYpO1xuICB9IGVsc2Uge1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgfVxuICB2YXIgY2FsbGVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIHJlZihub3RpZmljYXRpb24pIHtcbiAgICBpZiAoY2FsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNhbGxlZCA9IHRydWU7XG4gICAgY2FsbGJhY2soe1xuICAgICAgbm90aWNlOiBmdW5jdGlvbiBub3RpY2Uobm90aWNlUHJvcHMpIHtcbiAgICAgICAgbm90aWZpY2F0aW9uLmFkZChub3RpY2VQcm9wcyk7XG4gICAgICB9LFxuICAgICAgcmVtb3ZlTm90aWNlOiBmdW5jdGlvbiByZW1vdmVOb3RpY2Uoa2V5KSB7XG4gICAgICAgIG5vdGlmaWNhdGlvbi5yZW1vdmUoa2V5KTtcbiAgICAgIH0sXG4gICAgICBjb21wb25lbnQ6IG5vdGlmaWNhdGlvbixcbiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICAgIHVubW91bnQoZGl2KTtcbiAgICAgICAgaWYgKGRpdi5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgZGl2LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZGl2KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIEhvb2tzXG4gICAgICB1c2VOb3RpZmljYXRpb246IGZ1bmN0aW9uIHVzZU5vdGlmaWNhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF91c2VOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvLyBPbmx5IHVzZWQgZm9yIHRlc3QgY2FzZSB1c2FnZVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICd0ZXN0JyAmJiBwcm9wZXJ0aWVzLlRFU1RfUkVOREVSKSB7XG4gICAgcHJvcGVydGllcy5URVNUX1JFTkRFUiggLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTm90aWZpY2F0aW9uLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgIHJlZjogcmVmXG4gICAgfSkpKTtcbiAgICByZXR1cm47XG4gIH1cbiAgcmVuZGVyKCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChOb3RpZmljYXRpb24sIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmXG4gIH0pKSwgZGl2KTtcbn07XG5leHBvcnQgZGVmYXVsdCBOb3RpZmljYXRpb247IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCB1c2VSQ05vdGlmaWNhdGlvbiBmcm9tIFwicmMtbm90aWZpY2F0aW9uL2VzL3VzZU5vdGlmaWNhdGlvblwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgYXR0YWNoVHlwZUFwaSwgZ2V0S2V5VGhlbkluY3JlYXNlS2V5LCB0eXBlTGlzdCB9IGZyb20gJy4uJztcbmltcG9ydCB7IENvbmZpZ0NvbnN1bWVyIH0gZnJvbSAnLi4vLi4vY29uZmlnLXByb3ZpZGVyJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZVVzZU1lc3NhZ2UoZ2V0UmNOb3RpZmljYXRpb25JbnN0YW5jZSwgZ2V0UkNOb3RpY2VQcm9wcykge1xuICB2YXIgdXNlTWVzc2FnZSA9IGZ1bmN0aW9uIHVzZU1lc3NhZ2UoKSB7XG4gICAgLy8gV2UgY2FuIG9ubHkgZ2V0IGNvbnRlbnQgYnkgcmVuZGVyXG4gICAgdmFyIGdldFByZWZpeENscztcbiAgICB2YXIgZ2V0UG9wdXBDb250YWluZXI7XG4gICAgLy8gV2UgY3JlYXRlIGEgcHJveHkgdG8gaGFuZGxlIGRlbGF5IGNyZWF0ZWQgaW5zdGFuY2VcbiAgICB2YXIgaW5uZXJJbnN0YW5jZSA9IG51bGw7XG4gICAgdmFyIHByb3h5ID0ge1xuICAgICAgYWRkOiBmdW5jdGlvbiBhZGQobm90aWNlUHJvcHMsIGhvbGRlckNhbGxiYWNrKSB7XG4gICAgICAgIGlubmVySW5zdGFuY2UgPT09IG51bGwgfHwgaW5uZXJJbnN0YW5jZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogaW5uZXJJbnN0YW5jZS5jb21wb25lbnQuYWRkKG5vdGljZVByb3BzLCBob2xkZXJDYWxsYmFjayk7XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgX3VzZVJDTm90aWZpY2F0aW9uID0gdXNlUkNOb3RpZmljYXRpb24ocHJveHkpLFxuICAgICAgX3VzZVJDTm90aWZpY2F0aW9uMiA9IF9zbGljZWRUb0FycmF5KF91c2VSQ05vdGlmaWNhdGlvbiwgMiksXG4gICAgICBob29rTm90aWZ5ID0gX3VzZVJDTm90aWZpY2F0aW9uMlswXSxcbiAgICAgIGhvbGRlciA9IF91c2VSQ05vdGlmaWNhdGlvbjJbMV07XG4gICAgZnVuY3Rpb24gbm90aWZ5KGFyZ3MpIHtcbiAgICAgIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBhcmdzLnByZWZpeENscztcbiAgICAgIHZhciBtZXJnZWRQcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ21lc3NhZ2UnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAgICAgdmFyIHJvb3RQcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoKTtcbiAgICAgIHZhciB0YXJnZXQgPSBhcmdzLmtleSB8fCBnZXRLZXlUaGVuSW5jcmVhc2VLZXkoKTtcbiAgICAgIHZhciBjbG9zZVByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbiBjYWxsYmFjaygpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGFyZ3Mub25DbG9zZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgYXJncy5vbkNsb3NlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXNvbHZlKHRydWUpO1xuICAgICAgICB9O1xuICAgICAgICBnZXRSY05vdGlmaWNhdGlvbkluc3RhbmNlKF9leHRlbmRzKF9leHRlbmRzKHt9LCBhcmdzKSwge1xuICAgICAgICAgIHByZWZpeENsczogbWVyZ2VkUHJlZml4Q2xzLFxuICAgICAgICAgIHJvb3RQcmVmaXhDbHM6IHJvb3RQcmVmaXhDbHMsXG4gICAgICAgICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFBvcHVwQ29udGFpbmVyXG4gICAgICAgIH0pLCBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICAgIHZhciBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICAgICAgICAgIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZTtcbiAgICAgICAgICBpbm5lckluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICAgICAgaG9va05vdGlmeShnZXRSQ05vdGljZVByb3BzKF9leHRlbmRzKF9leHRlbmRzKHt9LCBhcmdzKSwge1xuICAgICAgICAgICAga2V5OiB0YXJnZXQsXG4gICAgICAgICAgICBvbkNsb3NlOiBjYWxsYmFja1xuICAgICAgICAgIH0pLCBwcmVmaXhDbHMpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHZhciByZXN1bHQgPSBmdW5jdGlvbiByZXN1bHQoKSB7XG4gICAgICAgIGlmIChpbm5lckluc3RhbmNlKSB7XG4gICAgICAgICAgaW5uZXJJbnN0YW5jZS5yZW1vdmVOb3RpY2UodGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJlc3VsdC50aGVuID0gZnVuY3Rpb24gKGZpbGxlZCwgcmVqZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGNsb3NlUHJvbWlzZS50aGVuKGZpbGxlZCwgcmVqZWN0ZWQpO1xuICAgICAgfTtcbiAgICAgIHJlc3VsdC5wcm9taXNlID0gY2xvc2VQcm9taXNlO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLy8gRmlsbCBmdW5jdGlvbnNcbiAgICB2YXIgaG9va0FwaVJlZiA9IFJlYWN0LnVzZVJlZih7fSk7XG4gICAgaG9va0FwaVJlZi5jdXJyZW50Lm9wZW4gPSBub3RpZnk7XG4gICAgdHlwZUxpc3QuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkge1xuICAgICAgcmV0dXJuIGF0dGFjaFR5cGVBcGkoaG9va0FwaVJlZi5jdXJyZW50LCB0eXBlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gW2hvb2tBcGlSZWYuY3VycmVudCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29uZmlnQ29uc3VtZXIsIHtcbiAgICAgIGtleTogXCJob2xkZXJcIlxuICAgIH0sIGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBnZXRQcmVmaXhDbHMgPSBjb250ZXh0LmdldFByZWZpeENscztcbiAgICAgIGdldFBvcHVwQ29udGFpbmVyID0gY29udGV4dC5nZXRQb3B1cENvbnRhaW5lcjtcbiAgICAgIHJldHVybiBob2xkZXI7XG4gICAgfSldO1xuICB9O1xuICByZXR1cm4gdXNlTWVzc2FnZTtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgQ2hlY2tDaXJjbGVGaWxsZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0NoZWNrQ2lyY2xlRmlsbGVkXCI7XG5pbXBvcnQgQ2xvc2VDaXJjbGVGaWxsZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Nsb3NlQ2lyY2xlRmlsbGVkXCI7XG5pbXBvcnQgRXhjbGFtYXRpb25DaXJjbGVGaWxsZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0V4Y2xhbWF0aW9uQ2lyY2xlRmlsbGVkXCI7XG5pbXBvcnQgSW5mb0NpcmNsZUZpbGxlZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvSW5mb0NpcmNsZUZpbGxlZFwiO1xuaW1wb3J0IExvYWRpbmdPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvTG9hZGluZ091dGxpbmVkXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBSQ05vdGlmaWNhdGlvbiBmcm9tICdyYy1ub3RpZmljYXRpb24nO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IENvbmZpZ1Byb3ZpZGVyLCB7IGdsb2JhbENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgY3JlYXRlVXNlTWVzc2FnZSBmcm9tICcuL2hvb2tzL3VzZU1lc3NhZ2UnO1xudmFyIG1lc3NhZ2VJbnN0YW5jZTtcbnZhciBkZWZhdWx0RHVyYXRpb24gPSAzO1xudmFyIGRlZmF1bHRUb3A7XG52YXIga2V5ID0gMTtcbnZhciBsb2NhbFByZWZpeENscyA9ICcnO1xudmFyIHRyYW5zaXRpb25OYW1lID0gJ21vdmUtdXAnO1xudmFyIGhhc1RyYW5zaXRpb25OYW1lID0gZmFsc2U7XG52YXIgZ2V0Q29udGFpbmVyO1xudmFyIG1heENvdW50O1xudmFyIHJ0bCA9IGZhbHNlO1xuZXhwb3J0IGZ1bmN0aW9uIGdldEtleVRoZW5JbmNyZWFzZUtleSgpIHtcbiAgcmV0dXJuIGtleSsrO1xufVxuZnVuY3Rpb24gc2V0TWVzc2FnZUNvbmZpZyhvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zLnRvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZGVmYXVsdFRvcCA9IG9wdGlvbnMudG9wO1xuICAgIG1lc3NhZ2VJbnN0YW5jZSA9IG51bGw7IC8vIGRlbGV0ZSBtZXNzYWdlSW5zdGFuY2UgZm9yIG5ldyBkZWZhdWx0VG9wXG4gIH1cblxuICBpZiAob3B0aW9ucy5kdXJhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZGVmYXVsdER1cmF0aW9uID0gb3B0aW9ucy5kdXJhdGlvbjtcbiAgfVxuICBpZiAob3B0aW9ucy5wcmVmaXhDbHMgIT09IHVuZGVmaW5lZCkge1xuICAgIGxvY2FsUHJlZml4Q2xzID0gb3B0aW9ucy5wcmVmaXhDbHM7XG4gIH1cbiAgaWYgKG9wdGlvbnMuZ2V0Q29udGFpbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICBnZXRDb250YWluZXIgPSBvcHRpb25zLmdldENvbnRhaW5lcjtcbiAgICBtZXNzYWdlSW5zdGFuY2UgPSBudWxsOyAvLyBkZWxldGUgbWVzc2FnZUluc3RhbmNlIGZvciBuZXcgZ2V0Q29udGFpbmVyXG4gIH1cblxuICBpZiAob3B0aW9ucy50cmFuc2l0aW9uTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdHJhbnNpdGlvbk5hbWUgPSBvcHRpb25zLnRyYW5zaXRpb25OYW1lO1xuICAgIG1lc3NhZ2VJbnN0YW5jZSA9IG51bGw7IC8vIGRlbGV0ZSBtZXNzYWdlSW5zdGFuY2UgZm9yIG5ldyB0cmFuc2l0aW9uTmFtZVxuICAgIGhhc1RyYW5zaXRpb25OYW1lID0gdHJ1ZTtcbiAgfVxuICBpZiAob3B0aW9ucy5tYXhDb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbWF4Q291bnQgPSBvcHRpb25zLm1heENvdW50O1xuICAgIG1lc3NhZ2VJbnN0YW5jZSA9IG51bGw7XG4gIH1cbiAgaWYgKG9wdGlvbnMucnRsICE9PSB1bmRlZmluZWQpIHtcbiAgICBydGwgPSBvcHRpb25zLnJ0bDtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0UkNOb3RpZmljYXRpb25JbnN0YW5jZShhcmdzLCBjYWxsYmFjaykge1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gYXJncy5wcmVmaXhDbHMsXG4gICAgZ2V0Q29udGV4dFBvcHVwQ29udGFpbmVyID0gYXJncy5nZXRQb3B1cENvbnRhaW5lcjtcbiAgdmFyIF9nbG9iYWxDb25maWcgPSBnbG9iYWxDb25maWcoKSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfZ2xvYmFsQ29uZmlnLmdldFByZWZpeENscyxcbiAgICBnZXRSb290UHJlZml4Q2xzID0gX2dsb2JhbENvbmZpZy5nZXRSb290UHJlZml4Q2xzLFxuICAgIGdldEljb25QcmVmaXhDbHMgPSBfZ2xvYmFsQ29uZmlnLmdldEljb25QcmVmaXhDbHM7XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ21lc3NhZ2UnLCBjdXN0b21pemVQcmVmaXhDbHMgfHwgbG9jYWxQcmVmaXhDbHMpO1xuICB2YXIgcm9vdFByZWZpeENscyA9IGdldFJvb3RQcmVmaXhDbHMoYXJncy5yb290UHJlZml4Q2xzLCBwcmVmaXhDbHMpO1xuICB2YXIgaWNvblByZWZpeENscyA9IGdldEljb25QcmVmaXhDbHMoKTtcbiAgaWYgKG1lc3NhZ2VJbnN0YW5jZSkge1xuICAgIGNhbGxiYWNrKHtcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgcm9vdFByZWZpeENsczogcm9vdFByZWZpeENscyxcbiAgICAgIGljb25QcmVmaXhDbHM6IGljb25QcmVmaXhDbHMsXG4gICAgICBpbnN0YW5jZTogbWVzc2FnZUluc3RhbmNlXG4gICAgfSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBpbnN0YW5jZUNvbmZpZyA9IHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICB0cmFuc2l0aW9uTmFtZTogaGFzVHJhbnNpdGlvbk5hbWUgPyB0cmFuc2l0aW9uTmFtZSA6IFwiXCIuY29uY2F0KHJvb3RQcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQodHJhbnNpdGlvbk5hbWUpLFxuICAgIHN0eWxlOiB7XG4gICAgICB0b3A6IGRlZmF1bHRUb3BcbiAgICB9LFxuICAgIGdldENvbnRhaW5lcjogZ2V0Q29udGFpbmVyIHx8IGdldENvbnRleHRQb3B1cENvbnRhaW5lcixcbiAgICBtYXhDb3VudDogbWF4Q291bnRcbiAgfTtcbiAgUkNOb3RpZmljYXRpb24ubmV3SW5zdGFuY2UoaW5zdGFuY2VDb25maWcsIGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgIGlmIChtZXNzYWdlSW5zdGFuY2UpIHtcbiAgICAgIGNhbGxiYWNrKHtcbiAgICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgIHJvb3RQcmVmaXhDbHM6IHJvb3RQcmVmaXhDbHMsXG4gICAgICAgIGljb25QcmVmaXhDbHM6IGljb25QcmVmaXhDbHMsXG4gICAgICAgIGluc3RhbmNlOiBtZXNzYWdlSW5zdGFuY2VcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBtZXNzYWdlSW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICd0ZXN0Jykge1xuICAgICAgbWVzc2FnZUluc3RhbmNlLmNvbmZpZyA9IGluc3RhbmNlQ29uZmlnO1xuICAgIH1cbiAgICBjYWxsYmFjayh7XG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIHJvb3RQcmVmaXhDbHM6IHJvb3RQcmVmaXhDbHMsXG4gICAgICBpY29uUHJlZml4Q2xzOiBpY29uUHJlZml4Q2xzLFxuICAgICAgaW5zdGFuY2U6IGluc3RhbmNlXG4gICAgfSk7XG4gIH0pO1xufVxudmFyIHR5cGVUb0ljb24gPSB7XG4gIGluZm86IEluZm9DaXJjbGVGaWxsZWQsXG4gIHN1Y2Nlc3M6IENoZWNrQ2lyY2xlRmlsbGVkLFxuICBlcnJvcjogQ2xvc2VDaXJjbGVGaWxsZWQsXG4gIHdhcm5pbmc6IEV4Y2xhbWF0aW9uQ2lyY2xlRmlsbGVkLFxuICBsb2FkaW5nOiBMb2FkaW5nT3V0bGluZWRcbn07XG5leHBvcnQgdmFyIHR5cGVMaXN0ID0gT2JqZWN0LmtleXModHlwZVRvSWNvbik7XG5mdW5jdGlvbiBnZXRSQ05vdGljZVByb3BzKGFyZ3MsIHByZWZpeENscywgaWNvblByZWZpeENscykge1xuICB2YXIgX2NsYXNzTmFtZXM7XG4gIHZhciBkdXJhdGlvbiA9IGFyZ3MuZHVyYXRpb24gIT09IHVuZGVmaW5lZCA/IGFyZ3MuZHVyYXRpb24gOiBkZWZhdWx0RHVyYXRpb247XG4gIHZhciBJY29uQ29tcG9uZW50ID0gdHlwZVRvSWNvblthcmdzLnR5cGVdO1xuICB2YXIgbWVzc2FnZUNsYXNzID0gY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWN1c3RvbS1jb250ZW50XCIpLCAoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoYXJncy50eXBlKSwgYXJncy50eXBlKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgcnRsID09PSB0cnVlKSwgX2NsYXNzTmFtZXMpKTtcbiAgcmV0dXJuIHtcbiAgICBrZXk6IGFyZ3Mua2V5LFxuICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICBzdHlsZTogYXJncy5zdHlsZSB8fCB7fSxcbiAgICBjbGFzc05hbWU6IGFyZ3MuY2xhc3NOYW1lLFxuICAgIGNvbnRlbnQ6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbmZpZ1Byb3ZpZGVyLCB7XG4gICAgICBpY29uUHJlZml4Q2xzOiBpY29uUHJlZml4Q2xzXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBtZXNzYWdlQ2xhc3NcbiAgICB9LCBhcmdzLmljb24gfHwgSWNvbkNvbXBvbmVudCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJY29uQ29tcG9uZW50LCBudWxsKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIGFyZ3MuY29udGVudCkpKSxcbiAgICBvbkNsb3NlOiBhcmdzLm9uQ2xvc2UsXG4gICAgb25DbGljazogYXJncy5vbkNsaWNrXG4gIH07XG59XG5mdW5jdGlvbiBub3RpY2UoYXJncykge1xuICB2YXIgdGFyZ2V0ID0gYXJncy5rZXkgfHwgZ2V0S2V5VGhlbkluY3JlYXNlS2V5KCk7XG4gIHZhciBjbG9zZVByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uIGNhbGxiYWNrKCkge1xuICAgICAgaWYgKHR5cGVvZiBhcmdzLm9uQ2xvc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgYXJncy5vbkNsb3NlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzb2x2ZSh0cnVlKTtcbiAgICB9O1xuICAgIGdldFJDTm90aWZpY2F0aW9uSW5zdGFuY2UoYXJncywgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgIHZhciBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICAgICAgaWNvblByZWZpeENscyA9IF9yZWYuaWNvblByZWZpeENscyxcbiAgICAgICAgaW5zdGFuY2UgPSBfcmVmLmluc3RhbmNlO1xuICAgICAgaW5zdGFuY2Uubm90aWNlKGdldFJDTm90aWNlUHJvcHMoX2V4dGVuZHMoX2V4dGVuZHMoe30sIGFyZ3MpLCB7XG4gICAgICAgIGtleTogdGFyZ2V0LFxuICAgICAgICBvbkNsb3NlOiBjYWxsYmFja1xuICAgICAgfSksIHByZWZpeENscywgaWNvblByZWZpeENscykpO1xuICAgIH0pO1xuICB9KTtcbiAgdmFyIHJlc3VsdCA9IGZ1bmN0aW9uIHJlc3VsdCgpIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKG1lc3NhZ2VJbnN0YW5jZSkge1xuICAgICAgbWVzc2FnZUluc3RhbmNlLnJlbW92ZU5vdGljZSh0YXJnZXQpO1xuICAgICAgKF9hID0gYXJncy5vbkNsb3NlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChhcmdzKTtcbiAgICB9XG4gIH07XG4gIHJlc3VsdC50aGVuID0gZnVuY3Rpb24gKGZpbGxlZCwgcmVqZWN0ZWQpIHtcbiAgICByZXR1cm4gY2xvc2VQcm9taXNlLnRoZW4oZmlsbGVkLCByZWplY3RlZCk7XG4gIH07XG4gIHJlc3VsdC5wcm9taXNlID0gY2xvc2VQcm9taXNlO1xuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gaXNBcmdzUHJvcHMoY29udGVudCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGNvbnRlbnQpID09PSAnW29iamVjdCBPYmplY3RdJyAmJiAhIWNvbnRlbnQuY29udGVudDtcbn1cbnZhciBhcGkgPSB7XG4gIG9wZW46IG5vdGljZSxcbiAgY29uZmlnOiBzZXRNZXNzYWdlQ29uZmlnLFxuICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KG1lc3NhZ2VLZXkpIHtcbiAgICBpZiAobWVzc2FnZUluc3RhbmNlKSB7XG4gICAgICBpZiAobWVzc2FnZUtleSkge1xuICAgICAgICB2YXIgX21lc3NhZ2VJbnN0YW5jZSA9IG1lc3NhZ2VJbnN0YW5jZSxcbiAgICAgICAgICByZW1vdmVOb3RpY2UgPSBfbWVzc2FnZUluc3RhbmNlLnJlbW92ZU5vdGljZTtcbiAgICAgICAgcmVtb3ZlTm90aWNlKG1lc3NhZ2VLZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIF9tZXNzYWdlSW5zdGFuY2UyID0gbWVzc2FnZUluc3RhbmNlLFxuICAgICAgICAgIGRlc3Ryb3kgPSBfbWVzc2FnZUluc3RhbmNlMi5kZXN0cm95O1xuICAgICAgICBkZXN0cm95KCk7XG4gICAgICAgIG1lc3NhZ2VJbnN0YW5jZSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaFR5cGVBcGkob3JpZ2luYWxBcGksIHR5cGUpIHtcbiAgb3JpZ2luYWxBcGlbdHlwZV0gPSBmdW5jdGlvbiAoY29udGVudCwgZHVyYXRpb24sIG9uQ2xvc2UpIHtcbiAgICBpZiAoaXNBcmdzUHJvcHMoY29udGVudCkpIHtcbiAgICAgIHJldHVybiBvcmlnaW5hbEFwaS5vcGVuKF9leHRlbmRzKF9leHRlbmRzKHt9LCBjb250ZW50KSwge1xuICAgICAgICB0eXBlOiB0eXBlXG4gICAgICB9KSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZHVyYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9uQ2xvc2UgPSBkdXJhdGlvbjtcbiAgICAgIGR1cmF0aW9uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gb3JpZ2luYWxBcGkub3Blbih7XG4gICAgICBjb250ZW50OiBjb250ZW50LFxuICAgICAgZHVyYXRpb246IGR1cmF0aW9uLFxuICAgICAgdHlwZTogdHlwZSxcbiAgICAgIG9uQ2xvc2U6IG9uQ2xvc2VcbiAgICB9KTtcbiAgfTtcbn1cbnR5cGVMaXN0LmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgcmV0dXJuIGF0dGFjaFR5cGVBcGkoYXBpLCB0eXBlKTtcbn0pO1xuYXBpLndhcm4gPSBhcGkud2FybmluZztcbmFwaS51c2VNZXNzYWdlID0gY3JlYXRlVXNlTWVzc2FnZShnZXRSQ05vdGlmaWNhdGlvbkluc3RhbmNlLCBnZXRSQ05vdGljZVByb3BzKTtcbi8qKiBAaW50ZXJuYWwgdGVzdCBPbmx5IGZ1bmN0aW9uLiBOb3Qgd29yayBvbiBwcm9kdWN0aW9uICovXG5leHBvcnQgdmFyIGdldEluc3RhbmNlID0gZnVuY3Rpb24gZ2V0SW5zdGFuY2UoKSB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Rlc3QnID8gbWVzc2FnZUluc3RhbmNlIDogbnVsbDtcbn07XG5leHBvcnQgZGVmYXVsdCBhcGk7IiwiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgQ2hlY2tDaXJjbGVPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNjk5IDM1M2gtNDYuOWMtMTAuMiAwLTE5LjkgNC45LTI1LjkgMTMuM0w0NjkgNTg0LjNsLTcxLjItOTguOGMtNi04LjMtMTUuNi0xMy4zLTI1LjktMTMuM0gzMjVjLTYuNSAwLTEwLjMgNy40LTYuNSAxMi43bDEyNC42IDE3Mi44YTMxLjggMzEuOCAwIDAwNTEuNyAwbDIxMC42LTI5MmMzLjktNS4zLjEtMTIuNy02LjQtMTIuN3pcIiB9IH0sIHsgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNTEyIDY0QzI2NC42IDY0IDY0IDI2NC42IDY0IDUxMnMyMDAuNiA0NDggNDQ4IDQ0OCA0NDgtMjAwLjYgNDQ4LTQ0OFM3NTkuNCA2NCA1MTIgNjR6bTAgODIwYy0yMDUuNCAwLTM3Mi0xNjYuNi0zNzItMzcyczE2Ni42LTM3MiAzNzItMzcyIDM3MiAxNjYuNiAzNzIgMzcyLTE2Ni42IDM3Mi0zNzIgMzcyelwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiY2hlY2stY2lyY2xlXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnQgZGVmYXVsdCBDaGVja0NpcmNsZU91dGxpbmVkO1xuIiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQ2hlY2tDaXJjbGVPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9DaGVja0NpcmNsZU91dGxpbmVkXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSAnLi4vY29tcG9uZW50cy9BbnRkSWNvbic7XG52YXIgQ2hlY2tDaXJjbGVPdXRsaW5lZCA9IGZ1bmN0aW9uIENoZWNrQ2lyY2xlT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IENoZWNrQ2lyY2xlT3V0bGluZWRTdmdcbiAgfSkpO1xufTtcbkNoZWNrQ2lyY2xlT3V0bGluZWQuZGlzcGxheU5hbWUgPSAnQ2hlY2tDaXJjbGVPdXRsaW5lZCc7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihDaGVja0NpcmNsZU91dGxpbmVkKTsiLCIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBDbG9zZUNpcmNsZU91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk02ODUuNCAzNTQuOGMwLTQuNC0zLjYtOC04LThsLTY2IC4zTDUxMiA0NjUuNmwtOTkuMy0xMTguNC02Ni4xLS4zYy00LjQgMC04IDMuNS04IDggMCAxLjkuNyAzLjcgMS45IDUuMmwxMzAuMSAxNTVMMzQwLjUgNjcwYTguMzIgOC4zMiAwIDAwLTEuOSA1LjJjMCA0LjQgMy42IDggOCA4bDY2LjEtLjNMNTEyIDU2NC40bDk5LjMgMTE4LjQgNjYgLjNjNC40IDAgOC0zLjUgOC04IDAtMS45LS43LTMuNy0xLjktNS4yTDU1My41IDUxNWwxMzAuMS0xNTVjMS4yLTEuNCAxLjgtMy4zIDEuOC01LjJ6XCIgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTUxMiA2NUMyNjQuNiA2NSA2NCAyNjUuNiA2NCA1MTNzMjAwLjYgNDQ4IDQ0OCA0NDggNDQ4LTIwMC42IDQ0OC00NDhTNzU5LjQgNjUgNTEyIDY1em0wIDgyMGMtMjA1LjQgMC0zNzItMTY2LjYtMzcyLTM3MnMxNjYuNi0zNzIgMzcyLTM3MiAzNzIgMTY2LjYgMzcyIDM3Mi0xNjYuNiAzNzItMzcyIDM3MnpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImNsb3NlLWNpcmNsZVwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgQ2xvc2VDaXJjbGVPdXRsaW5lZDtcbiIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IENsb3NlQ2lyY2xlT3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vQ2xvc2VDaXJjbGVPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIENsb3NlQ2lyY2xlT3V0bGluZWQgPSBmdW5jdGlvbiBDbG9zZUNpcmNsZU91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBDbG9zZUNpcmNsZU91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5DbG9zZUNpcmNsZU91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ0Nsb3NlQ2lyY2xlT3V0bGluZWQnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoQ2xvc2VDaXJjbGVPdXRsaW5lZCk7IiwiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgQ2xvc2VPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNTYzLjggNTEybDI2Mi41LTMxMi45YzQuNC01LjIuNy0xMy4xLTYuMS0xMy4xaC03OS44Yy00LjcgMC05LjIgMi4xLTEyLjMgNS43TDUxMS42IDQ0OS44IDI5NS4xIDE5MS43Yy0zLTMuNi03LjUtNS43LTEyLjMtNS43SDIwM2MtNi44IDAtMTAuNSA3LjktNi4xIDEzLjFMNDU5LjQgNTEyIDE5Ni45IDgyNC45QTcuOTUgNy45NSAwIDAwMjAzIDgzOGg3OS44YzQuNyAwIDkuMi0yLjEgMTIuMy01LjdsMjE2LjUtMjU4LjEgMjE2LjUgMjU4LjFjMyAzLjYgNy41IDUuNyAxMi4zIDUuN2g3OS44YzYuOCAwIDEwLjUtNy45IDYuMS0xMy4xTDU2My44IDUxMnpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImNsb3NlXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnQgZGVmYXVsdCBDbG9zZU91dGxpbmVkO1xuIiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQ2xvc2VPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9DbG9zZU91dGxpbmVkXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSAnLi4vY29tcG9uZW50cy9BbnRkSWNvbic7XG52YXIgQ2xvc2VPdXRsaW5lZCA9IGZ1bmN0aW9uIENsb3NlT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IENsb3NlT3V0bGluZWRTdmdcbiAgfSkpO1xufTtcbkNsb3NlT3V0bGluZWQuZGlzcGxheU5hbWUgPSAnQ2xvc2VPdXRsaW5lZCc7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihDbG9zZU91dGxpbmVkKTsiLCIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBFeGNsYW1hdGlvbkNpcmNsZU91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk01MTIgNjRDMjY0LjYgNjQgNjQgMjY0LjYgNjQgNTEyczIwMC42IDQ0OCA0NDggNDQ4IDQ0OC0yMDAuNiA0NDgtNDQ4Uzc1OS40IDY0IDUxMiA2NHptMCA4MjBjLTIwNS40IDAtMzcyLTE2Ni42LTM3Mi0zNzJzMTY2LjYtMzcyIDM3Mi0zNzIgMzcyIDE2Ni42IDM3MiAzNzItMTY2LjYgMzcyLTM3MiAzNzJ6XCIgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTQ2NCA2ODhhNDggNDggMCAxMDk2IDAgNDggNDggMCAxMC05NiAwem0yNC0xMTJoNDhjNC40IDAgOC0zLjYgOC04VjI5NmMwLTQuNC0zLjYtOC04LThoLTQ4Yy00LjQgMC04IDMuNi04IDh2MjcyYzAgNC40IDMuNiA4IDggOHpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImV4Y2xhbWF0aW9uLWNpcmNsZVwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZDtcbiIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEV4Y2xhbWF0aW9uQ2lyY2xlT3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIEV4Y2xhbWF0aW9uQ2lyY2xlT3V0bGluZWQgPSBmdW5jdGlvbiBFeGNsYW1hdGlvbkNpcmNsZU91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBFeGNsYW1hdGlvbkNpcmNsZU91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5FeGNsYW1hdGlvbkNpcmNsZU91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ0V4Y2xhbWF0aW9uQ2lyY2xlT3V0bGluZWQnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZCk7IiwiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgSW5mb0NpcmNsZU91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk01MTIgNjRDMjY0LjYgNjQgNjQgMjY0LjYgNjQgNTEyczIwMC42IDQ0OCA0NDggNDQ4IDQ0OC0yMDAuNiA0NDgtNDQ4Uzc1OS40IDY0IDUxMiA2NHptMCA4MjBjLTIwNS40IDAtMzcyLTE2Ni42LTM3Mi0zNzJzMTY2LjYtMzcyIDM3Mi0zNzIgMzcyIDE2Ni42IDM3MiAzNzItMTY2LjYgMzcyLTM3MiAzNzJ6XCIgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTQ2NCAzMzZhNDggNDggMCAxMDk2IDAgNDggNDggMCAxMC05NiAwem03MiAxMTJoLTQ4Yy00LjQgMC04IDMuNi04IDh2MjcyYzAgNC40IDMuNiA4IDggOGg0OGM0LjQgMCA4LTMuNiA4LThWNDU2YzAtNC40LTMuNi04LTgtOHpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImluZm8tY2lyY2xlXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnQgZGVmYXVsdCBJbmZvQ2lyY2xlT3V0bGluZWQ7XG4iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBJbmZvQ2lyY2xlT3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vSW5mb0NpcmNsZU91dGxpbmVkXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSAnLi4vY29tcG9uZW50cy9BbnRkSWNvbic7XG52YXIgSW5mb0NpcmNsZU91dGxpbmVkID0gZnVuY3Rpb24gSW5mb0NpcmNsZU91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBJbmZvQ2lyY2xlT3V0bGluZWRTdmdcbiAgfSkpO1xufTtcbkluZm9DaXJjbGVPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdJbmZvQ2lyY2xlT3V0bGluZWQnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoSW5mb0NpcmNsZU91dGxpbmVkKTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IHVzZVJDTm90aWZpY2F0aW9uIGZyb20gXCJyYy1ub3RpZmljYXRpb24vZXMvdXNlTm90aWZpY2F0aW9uXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb25zdW1lciB9IGZyb20gJy4uLy4uL2NvbmZpZy1wcm92aWRlcic7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVVc2VOb3RpZmljYXRpb24oZ2V0Tm90aWZpY2F0aW9uSW5zdGFuY2UsIGdldFJDTm90aWNlUHJvcHMpIHtcbiAgdmFyIHVzZU5vdGlmaWNhdGlvbiA9IGZ1bmN0aW9uIHVzZU5vdGlmaWNhdGlvbigpIHtcbiAgICAvLyBXZSBjYW4gb25seSBnZXQgY29udGVudCBieSByZW5kZXJcbiAgICB2YXIgZ2V0UHJlZml4Q2xzO1xuICAgIC8vIFdlIGNyZWF0ZSBhIHByb3h5IHRvIGhhbmRsZSBkZWxheSBjcmVhdGVkIGluc3RhbmNlXG4gICAgdmFyIGlubmVySW5zdGFuY2UgPSBudWxsO1xuICAgIHZhciBwcm94eSA9IHtcbiAgICAgIGFkZDogZnVuY3Rpb24gYWRkKG5vdGljZVByb3BzLCBob2xkZXJDYWxsYmFjaykge1xuICAgICAgICBpbm5lckluc3RhbmNlID09PSBudWxsIHx8IGlubmVySW5zdGFuY2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGlubmVySW5zdGFuY2UuY29tcG9uZW50LmFkZChub3RpY2VQcm9wcywgaG9sZGVyQ2FsbGJhY2spO1xuICAgICAgfVxuICAgIH07XG4gICAgdmFyIF91c2VSQ05vdGlmaWNhdGlvbiA9IHVzZVJDTm90aWZpY2F0aW9uKHByb3h5KSxcbiAgICAgIF91c2VSQ05vdGlmaWNhdGlvbjIgPSBfc2xpY2VkVG9BcnJheShfdXNlUkNOb3RpZmljYXRpb24sIDIpLFxuICAgICAgaG9va05vdGlmeSA9IF91c2VSQ05vdGlmaWNhdGlvbjJbMF0sXG4gICAgICBob2xkZXIgPSBfdXNlUkNOb3RpZmljYXRpb24yWzFdO1xuICAgIGZ1bmN0aW9uIG5vdGlmeShhcmdzKSB7XG4gICAgICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gYXJncy5wcmVmaXhDbHM7XG4gICAgICB2YXIgbWVyZ2VkUHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdub3RpZmljYXRpb24nLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAgICAgZ2V0Tm90aWZpY2F0aW9uSW5zdGFuY2UoX2V4dGVuZHMoX2V4dGVuZHMoe30sIGFyZ3MpLCB7XG4gICAgICAgIHByZWZpeENsczogbWVyZ2VkUHJlZml4Q2xzXG4gICAgICB9KSwgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgICAgICAgIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZTtcbiAgICAgICAgaW5uZXJJbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICBob29rTm90aWZ5KGdldFJDTm90aWNlUHJvcHMoYXJncywgcHJlZml4Q2xzKSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gRmlsbCBmdW5jdGlvbnNcbiAgICB2YXIgaG9va0FwaVJlZiA9IFJlYWN0LnVzZVJlZih7fSk7XG4gICAgaG9va0FwaVJlZi5jdXJyZW50Lm9wZW4gPSBub3RpZnk7XG4gICAgWydzdWNjZXNzJywgJ2luZm8nLCAnd2FybmluZycsICdlcnJvciddLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgIGhvb2tBcGlSZWYuY3VycmVudFt0eXBlXSA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICAgIHJldHVybiBob29rQXBpUmVmLmN1cnJlbnQub3BlbihfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgYXJncyksIHtcbiAgICAgICAgICB0eXBlOiB0eXBlXG4gICAgICAgIH0pKTtcbiAgICAgIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIFtob29rQXBpUmVmLmN1cnJlbnQsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbmZpZ0NvbnN1bWVyLCB7XG4gICAgICBrZXk6IFwiaG9sZGVyXCJcbiAgICB9LCBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgZ2V0UHJlZml4Q2xzID0gY29udGV4dC5nZXRQcmVmaXhDbHM7XG4gICAgICByZXR1cm4gaG9sZGVyO1xuICAgIH0pXTtcbiAgfTtcbiAgcmV0dXJuIHVzZU5vdGlmaWNhdGlvbjtcbn0iLCJpbXBvcnQgX3JlZ2VuZXJhdG9yUnVudGltZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcmVnZW5lcmF0b3JSdW50aW1lXCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG52YXIgX19hd2FpdGVyID0gdGhpcyAmJiB0aGlzLl9fYXdhaXRlciB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHtcbiAgICAgIHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpO1xuICAgIH1cbiAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gIH0pO1xufTtcbmltcG9ydCBDaGVja0NpcmNsZU91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DaGVja0NpcmNsZU91dGxpbmVkXCI7XG5pbXBvcnQgQ2xvc2VDaXJjbGVPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvQ2xvc2VDaXJjbGVPdXRsaW5lZFwiO1xuaW1wb3J0IENsb3NlT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Nsb3NlT3V0bGluZWRcIjtcbmltcG9ydCBFeGNsYW1hdGlvbkNpcmNsZU91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9FeGNsYW1hdGlvbkNpcmNsZU91dGxpbmVkXCI7XG5pbXBvcnQgSW5mb0NpcmNsZU91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9JbmZvQ2lyY2xlT3V0bGluZWRcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IE5vdGlmaWNhdGlvbiBmcm9tICdyYy1ub3RpZmljYXRpb24nO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IENvbmZpZ1Byb3ZpZGVyLCB7IGdsb2JhbENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgY3JlYXRlVXNlTm90aWZpY2F0aW9uIGZyb20gJy4vaG9va3MvdXNlTm90aWZpY2F0aW9uJztcbnZhciBub3RpZmljYXRpb25JbnN0YW5jZSA9IHt9O1xudmFyIGRlZmF1bHREdXJhdGlvbiA9IDQuNTtcbnZhciBkZWZhdWx0VG9wID0gMjQ7XG52YXIgZGVmYXVsdEJvdHRvbSA9IDI0O1xudmFyIGRlZmF1bHRQcmVmaXhDbHMgPSAnJztcbnZhciBkZWZhdWx0UGxhY2VtZW50ID0gJ3RvcFJpZ2h0JztcbnZhciBkZWZhdWx0R2V0Q29udGFpbmVyO1xudmFyIGRlZmF1bHRDbG9zZUljb247XG52YXIgcnRsID0gZmFsc2U7XG52YXIgbWF4Q291bnQ7XG5mdW5jdGlvbiBzZXROb3RpZmljYXRpb25Db25maWcob3B0aW9ucykge1xuICB2YXIgZHVyYXRpb24gPSBvcHRpb25zLmR1cmF0aW9uLFxuICAgIHBsYWNlbWVudCA9IG9wdGlvbnMucGxhY2VtZW50LFxuICAgIGJvdHRvbSA9IG9wdGlvbnMuYm90dG9tLFxuICAgIHRvcCA9IG9wdGlvbnMudG9wLFxuICAgIGdldENvbnRhaW5lciA9IG9wdGlvbnMuZ2V0Q29udGFpbmVyLFxuICAgIGNsb3NlSWNvbiA9IG9wdGlvbnMuY2xvc2VJY29uLFxuICAgIHByZWZpeENscyA9IG9wdGlvbnMucHJlZml4Q2xzO1xuICBpZiAocHJlZml4Q2xzICE9PSB1bmRlZmluZWQpIHtcbiAgICBkZWZhdWx0UHJlZml4Q2xzID0gcHJlZml4Q2xzO1xuICB9XG4gIGlmIChkdXJhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZGVmYXVsdER1cmF0aW9uID0gZHVyYXRpb247XG4gIH1cbiAgaWYgKHBsYWNlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZGVmYXVsdFBsYWNlbWVudCA9IHBsYWNlbWVudDtcbiAgfSBlbHNlIGlmIChvcHRpb25zLnJ0bCkge1xuICAgIGRlZmF1bHRQbGFjZW1lbnQgPSAndG9wTGVmdCc7XG4gIH1cbiAgaWYgKGJvdHRvbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZGVmYXVsdEJvdHRvbSA9IGJvdHRvbTtcbiAgfVxuICBpZiAodG9wICE9PSB1bmRlZmluZWQpIHtcbiAgICBkZWZhdWx0VG9wID0gdG9wO1xuICB9XG4gIGlmIChnZXRDb250YWluZXIgIT09IHVuZGVmaW5lZCkge1xuICAgIGRlZmF1bHRHZXRDb250YWluZXIgPSBnZXRDb250YWluZXI7XG4gIH1cbiAgaWYgKGNsb3NlSWNvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZGVmYXVsdENsb3NlSWNvbiA9IGNsb3NlSWNvbjtcbiAgfVxuICBpZiAob3B0aW9ucy5ydGwgIT09IHVuZGVmaW5lZCkge1xuICAgIHJ0bCA9IG9wdGlvbnMucnRsO1xuICB9XG4gIGlmIChvcHRpb25zLm1heENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICBtYXhDb3VudCA9IG9wdGlvbnMubWF4Q291bnQ7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFBsYWNlbWVudFN0eWxlKHBsYWNlbWVudCkge1xuICB2YXIgdG9wID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBkZWZhdWx0VG9wO1xuICB2YXIgYm90dG9tID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBkZWZhdWx0Qm90dG9tO1xuICB2YXIgc3R5bGU7XG4gIHN3aXRjaCAocGxhY2VtZW50KSB7XG4gICAgY2FzZSAndG9wJzpcbiAgICAgIHN0eWxlID0ge1xuICAgICAgICBsZWZ0OiAnNTAlJyxcbiAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtNTAlKScsXG4gICAgICAgIHJpZ2h0OiAnYXV0bycsXG4gICAgICAgIHRvcDogdG9wLFxuICAgICAgICBib3R0b206ICdhdXRvJ1xuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RvcExlZnQnOlxuICAgICAgc3R5bGUgPSB7XG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIHRvcDogdG9wLFxuICAgICAgICBib3R0b206ICdhdXRvJ1xuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RvcFJpZ2h0JzpcbiAgICAgIHN0eWxlID0ge1xuICAgICAgICByaWdodDogMCxcbiAgICAgICAgdG9wOiB0b3AsXG4gICAgICAgIGJvdHRvbTogJ2F1dG8nXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYm90dG9tJzpcbiAgICAgIHN0eWxlID0ge1xuICAgICAgICBsZWZ0OiAnNTAlJyxcbiAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtNTAlKScsXG4gICAgICAgIHJpZ2h0OiAnYXV0bycsXG4gICAgICAgIHRvcDogJ2F1dG8nLFxuICAgICAgICBib3R0b206IGJvdHRvbVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2JvdHRvbUxlZnQnOlxuICAgICAgc3R5bGUgPSB7XG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIHRvcDogJ2F1dG8nLFxuICAgICAgICBib3R0b206IGJvdHRvbVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBzdHlsZSA9IHtcbiAgICAgICAgcmlnaHQ6IDAsXG4gICAgICAgIHRvcDogJ2F1dG8nLFxuICAgICAgICBib3R0b206IGJvdHRvbVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiBzdHlsZTtcbn1cbmZ1bmN0aW9uIGdldE5vdGlmaWNhdGlvbkluc3RhbmNlKGFyZ3MsIGNhbGxiYWNrKSB7XG4gIHZhciBfYXJncyRwbGFjZW1lbnQgPSBhcmdzLnBsYWNlbWVudCxcbiAgICBwbGFjZW1lbnQgPSBfYXJncyRwbGFjZW1lbnQgPT09IHZvaWQgMCA/IGRlZmF1bHRQbGFjZW1lbnQgOiBfYXJncyRwbGFjZW1lbnQsXG4gICAgdG9wID0gYXJncy50b3AsXG4gICAgYm90dG9tID0gYXJncy5ib3R0b20sXG4gICAgX2FyZ3MkZ2V0Q29udGFpbmVyID0gYXJncy5nZXRDb250YWluZXIsXG4gICAgZ2V0Q29udGFpbmVyID0gX2FyZ3MkZ2V0Q29udGFpbmVyID09PSB2b2lkIDAgPyBkZWZhdWx0R2V0Q29udGFpbmVyIDogX2FyZ3MkZ2V0Q29udGFpbmVyLFxuICAgIGN1c3RvbWl6ZVByZWZpeENscyA9IGFyZ3MucHJlZml4Q2xzO1xuICB2YXIgX2dsb2JhbENvbmZpZyA9IGdsb2JhbENvbmZpZygpLFxuICAgIGdldFByZWZpeENscyA9IF9nbG9iYWxDb25maWcuZ2V0UHJlZml4Q2xzLFxuICAgIGdldEljb25QcmVmaXhDbHMgPSBfZ2xvYmFsQ29uZmlnLmdldEljb25QcmVmaXhDbHM7XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ25vdGlmaWNhdGlvbicsIGN1c3RvbWl6ZVByZWZpeENscyB8fCBkZWZhdWx0UHJlZml4Q2xzKTtcbiAgdmFyIGljb25QcmVmaXhDbHMgPSBnZXRJY29uUHJlZml4Q2xzKCk7XG4gIHZhciBjYWNoZUtleSA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChwbGFjZW1lbnQpO1xuICB2YXIgY2FjaGVJbnN0YW5jZSA9IG5vdGlmaWNhdGlvbkluc3RhbmNlW2NhY2hlS2V5XTtcbiAgaWYgKGNhY2hlSW5zdGFuY2UpIHtcbiAgICBQcm9taXNlLnJlc29sdmUoY2FjaGVJbnN0YW5jZSkudGhlbihmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgIGNhbGxiYWNrKHtcbiAgICAgICAgcHJlZml4Q2xzOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW5vdGljZVwiKSxcbiAgICAgICAgaWNvblByZWZpeENsczogaWNvblByZWZpeENscyxcbiAgICAgICAgaW5zdGFuY2U6IGluc3RhbmNlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG5vdGlmaWNhdGlvbkNsYXNzID0gY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQocGxhY2VtZW50KSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgcnRsID09PSB0cnVlKSk7XG4gIG5vdGlmaWNhdGlvbkluc3RhbmNlW2NhY2hlS2V5XSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgTm90aWZpY2F0aW9uLm5ld0luc3RhbmNlKHtcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgY2xhc3NOYW1lOiBub3RpZmljYXRpb25DbGFzcyxcbiAgICAgIHN0eWxlOiBnZXRQbGFjZW1lbnRTdHlsZShwbGFjZW1lbnQsIHRvcCwgYm90dG9tKSxcbiAgICAgIGdldENvbnRhaW5lcjogZ2V0Q29udGFpbmVyLFxuICAgICAgbWF4Q291bnQ6IG1heENvdW50XG4gICAgfSwgZnVuY3Rpb24gKG5vdGlmaWNhdGlvbikge1xuICAgICAgcmVzb2x2ZShub3RpZmljYXRpb24pO1xuICAgICAgY2FsbGJhY2soe1xuICAgICAgICBwcmVmaXhDbHM6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbm90aWNlXCIpLFxuICAgICAgICBpY29uUHJlZml4Q2xzOiBpY29uUHJlZml4Q2xzLFxuICAgICAgICBpbnN0YW5jZTogbm90aWZpY2F0aW9uXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG52YXIgdHlwZVRvSWNvbiA9IHtcbiAgc3VjY2VzczogQ2hlY2tDaXJjbGVPdXRsaW5lZCxcbiAgaW5mbzogSW5mb0NpcmNsZU91dGxpbmVkLFxuICBlcnJvcjogQ2xvc2VDaXJjbGVPdXRsaW5lZCxcbiAgd2FybmluZzogRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZFxufTtcbmZ1bmN0aW9uIGdldFJDTm90aWNlUHJvcHMoYXJncywgcHJlZml4Q2xzLCBpY29uUHJlZml4Q2xzKSB7XG4gIHZhciBkdXJhdGlvbkFyZyA9IGFyZ3MuZHVyYXRpb24sXG4gICAgaWNvbiA9IGFyZ3MuaWNvbixcbiAgICB0eXBlID0gYXJncy50eXBlLFxuICAgIGRlc2NyaXB0aW9uID0gYXJncy5kZXNjcmlwdGlvbixcbiAgICBtZXNzYWdlID0gYXJncy5tZXNzYWdlLFxuICAgIGJ0biA9IGFyZ3MuYnRuLFxuICAgIG9uQ2xvc2UgPSBhcmdzLm9uQ2xvc2UsXG4gICAgb25DbGljayA9IGFyZ3Mub25DbGljayxcbiAgICBrZXkgPSBhcmdzLmtleSxcbiAgICBzdHlsZSA9IGFyZ3Muc3R5bGUsXG4gICAgY2xhc3NOYW1lID0gYXJncy5jbGFzc05hbWUsXG4gICAgX2FyZ3MkY2xvc2VJY29uID0gYXJncy5jbG9zZUljb24sXG4gICAgY2xvc2VJY29uID0gX2FyZ3MkY2xvc2VJY29uID09PSB2b2lkIDAgPyBkZWZhdWx0Q2xvc2VJY29uIDogX2FyZ3MkY2xvc2VJY29uLFxuICAgIHByb3BzID0gYXJncy5wcm9wcztcbiAgdmFyIGR1cmF0aW9uID0gZHVyYXRpb25BcmcgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHREdXJhdGlvbiA6IGR1cmF0aW9uQXJnO1xuICB2YXIgaWNvbk5vZGUgPSBudWxsO1xuICBpZiAoaWNvbikge1xuICAgIGljb25Ob2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pY29uXCIpXG4gICAgfSwgYXJncy5pY29uKTtcbiAgfSBlbHNlIGlmICh0eXBlKSB7XG4gICAgaWNvbk5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudCh0eXBlVG9JY29uW3R5cGVdIHx8IG51bGwsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pY29uIFwiKS5jb25jYXQocHJlZml4Q2xzLCBcIi1pY29uLVwiKS5jb25jYXQodHlwZSlcbiAgICB9KTtcbiAgfVxuICB2YXIgY2xvc2VJY29uVG9SZW5kZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jbG9zZS14XCIpXG4gIH0sIGNsb3NlSWNvbiB8fCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDbG9zZU91dGxpbmVkLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNsb3NlLWljb25cIilcbiAgfSkpO1xuICB2YXIgYXV0b01hcmdpblRhZyA9ICFkZXNjcmlwdGlvbiAmJiBpY29uTm9kZSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1lc3NhZ2Utc2luZ2xlLWxpbmUtYXV0by1tYXJnaW5cIilcbiAgfSkgOiBudWxsO1xuICByZXR1cm4ge1xuICAgIGNvbnRlbnQ6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbmZpZ1Byb3ZpZGVyLCB7XG4gICAgICBpY29uUHJlZml4Q2xzOiBpY29uUHJlZml4Q2xzXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBpY29uTm9kZSA/IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd2l0aC1pY29uXCIpIDogJycsXG4gICAgICByb2xlOiBcImFsZXJ0XCJcbiAgICB9LCBpY29uTm9kZSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1lc3NhZ2VcIilcbiAgICB9LCBhdXRvTWFyZ2luVGFnLCBtZXNzYWdlKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRlc2NyaXB0aW9uXCIpXG4gICAgfSwgZGVzY3JpcHRpb24pLCBidG4gPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWJ0blwiKVxuICAgIH0sIGJ0bikgOiBudWxsKSksXG4gICAgZHVyYXRpb246IGR1cmF0aW9uLFxuICAgIGNsb3NhYmxlOiB0cnVlLFxuICAgIGNsb3NlSWNvbjogY2xvc2VJY29uVG9SZW5kZXIsXG4gICAgb25DbG9zZTogb25DbG9zZSxcbiAgICBvbkNsaWNrOiBvbkNsaWNrLFxuICAgIGtleToga2V5LFxuICAgIHN0eWxlOiBzdHlsZSB8fCB7fSxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdCh0eXBlKSwgISF0eXBlKSksXG4gICAgcHJvcHM6IHByb3BzXG4gIH07XG59XG5mdW5jdGlvbiBub3RpY2UoYXJncykge1xuICBnZXROb3RpZmljYXRpb25JbnN0YW5jZShhcmdzLCBmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICAgIGljb25QcmVmaXhDbHMgPSBfcmVmLmljb25QcmVmaXhDbHMsXG4gICAgICBpbnN0YW5jZSA9IF9yZWYuaW5zdGFuY2U7XG4gICAgaW5zdGFuY2Uubm90aWNlKGdldFJDTm90aWNlUHJvcHMoYXJncywgcHJlZml4Q2xzLCBpY29uUHJlZml4Q2xzKSk7XG4gIH0pO1xufVxudmFyIGFwaSA9IHtcbiAgb3Blbjogbm90aWNlLFxuICBjbG9zZTogZnVuY3Rpb24gY2xvc2Uoa2V5KSB7XG4gICAgT2JqZWN0LmtleXMobm90aWZpY2F0aW9uSW5zdGFuY2UpLmZvckVhY2goZnVuY3Rpb24gKGNhY2hlS2V5KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5vdGlmaWNhdGlvbkluc3RhbmNlW2NhY2hlS2V5XSkudGhlbihmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgICAgaW5zdGFuY2UucmVtb3ZlTm90aWNlKGtleSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgY29uZmlnOiBzZXROb3RpZmljYXRpb25Db25maWcsXG4gIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgT2JqZWN0LmtleXMobm90aWZpY2F0aW9uSW5zdGFuY2UpLmZvckVhY2goZnVuY3Rpb24gKGNhY2hlS2V5KSB7XG4gICAgICBQcm9taXNlLnJlc29sdmUobm90aWZpY2F0aW9uSW5zdGFuY2VbY2FjaGVLZXldKS50aGVuKGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgICAgICBpbnN0YW5jZS5kZXN0cm95KCk7XG4gICAgICB9KTtcbiAgICAgIGRlbGV0ZSBub3RpZmljYXRpb25JbnN0YW5jZVtjYWNoZUtleV07IC8vIGxndG1banMvbWlzc2luZy1hd2FpdF1cbiAgICB9KTtcbiAgfVxufTtcblxuWydzdWNjZXNzJywgJ2luZm8nLCAnd2FybmluZycsICdlcnJvciddLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgYXBpW3R5cGVdID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICByZXR1cm4gYXBpLm9wZW4oX2V4dGVuZHMoX2V4dGVuZHMoe30sIGFyZ3MpLCB7XG4gICAgICB0eXBlOiB0eXBlXG4gICAgfSkpO1xuICB9O1xufSk7XG5hcGkud2FybiA9IGFwaS53YXJuaW5nO1xuYXBpLnVzZU5vdGlmaWNhdGlvbiA9IGNyZWF0ZVVzZU5vdGlmaWNhdGlvbihnZXROb3RpZmljYXRpb25JbnN0YW5jZSwgZ2V0UkNOb3RpY2VQcm9wcyk7XG4vKiogQGludGVybmFsIHRlc3QgT25seSBmdW5jdGlvbi4gTm90IHdvcmsgb24gcHJvZHVjdGlvbiAqL1xuZXhwb3J0IHZhciBnZXRJbnN0YW5jZSA9IGZ1bmN0aW9uIGdldEluc3RhbmNlKGNhY2hlS2V5KSB7XG4gIHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7XG4gICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiLCBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Rlc3QnID8gbm90aWZpY2F0aW9uSW5zdGFuY2VbY2FjaGVLZXldIDogbnVsbCk7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICB9XG4gICAgfSwgX2NhbGxlZSk7XG4gIH0pKTtcbn07XG5leHBvcnQgZGVmYXVsdCBhcGk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgZGVmYXVsdEdldFByZWZpeENscyA9IGZ1bmN0aW9uIGRlZmF1bHRHZXRQcmVmaXhDbHMoc3VmZml4Q2xzLCBjdXN0b21pemVQcmVmaXhDbHMpIHtcbiAgaWYgKGN1c3RvbWl6ZVByZWZpeENscykgcmV0dXJuIGN1c3RvbWl6ZVByZWZpeENscztcbiAgcmV0dXJuIHN1ZmZpeENscyA/IFwiYW50LVwiLmNvbmNhdChzdWZmaXhDbHMpIDogJ2FudCc7XG59O1xuLy8gem9tYmllSjog8J+aqCBEbyBub3QgcGFzcyBgZGVmYXVsdFJlbmRlckVtcHR5YCBoZXJlIHNpbmNlIGl0IHdpbGwgY2FzZSBjaXJjdWxhciBkZXBlbmRlbmN5LlxuZXhwb3J0IHZhciBDb25maWdDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe1xuICAvLyBXZSBwcm92aWRlIGEgZGVmYXVsdCBmdW5jdGlvbiBmb3IgQ29udGV4dCB3aXRob3V0IHByb3ZpZGVyXG4gIGdldFByZWZpeENsczogZGVmYXVsdEdldFByZWZpeENsc1xufSk7XG5leHBvcnQgdmFyIENvbmZpZ0NvbnN1bWVyID0gQ29uZmlnQ29udGV4dC5Db25zdW1lcjtcbi8qKiBAZGVwcmVjYXRlZCBVc2UgaG9va3MgaW5zdGVhZC4gVGhpcyBpcyBhIGxlZ2FjeSBmdW5jdGlvbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhDb25maWdDb25zdW1lcihjb25maWcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdpdGhDb25maWdDb25zdW1lckZ1bmMoQ29tcG9uZW50KSB7XG4gICAgLy8gV3JhcCB3aXRoIENvbmZpZ0NvbnN1bWVyLiBTaW5jZSB3ZSBuZWVkIGNvbXBhdGlibGUgd2l0aCByZWFjdCAxNSwgYmUgY2FyZSB3aGVuIHVzaW5nIHJlZiBtZXRob2RzXG4gICAgdmFyIFNGQyA9IGZ1bmN0aW9uIFNGQyhwcm9wcykge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbmZpZ0NvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoY29uZmlnUHJvcHMpIHtcbiAgICAgICAgdmFyIGJhc2ljUHJlZml4Q2xzID0gY29uZmlnLnByZWZpeENscztcbiAgICAgICAgdmFyIGdldFByZWZpeENscyA9IGNvbmZpZ1Byb3BzLmdldFByZWZpeENscztcbiAgICAgICAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscztcbiAgICAgICAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscyhiYXNpY1ByZWZpeENscywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgX2V4dGVuZHMoe30sIGNvbmZpZ1Byb3BzLCBwcm9wcywge1xuICAgICAgICAgIHByZWZpeENsczogcHJlZml4Q2xzXG4gICAgICAgIH0pKTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgdmFyIGNvbnMgPSBDb21wb25lbnQuY29uc3RydWN0b3I7XG4gICAgdmFyIG5hbWUgPSBjb25zICYmIGNvbnMuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCc7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIFNGQy5kaXNwbGF5TmFtZSA9IFwid2l0aENvbmZpZ0NvbnN1bWVyKFwiLmNvbmNhdChuYW1lLCBcIilcIik7XG4gICAgfVxuICAgIHJldHVybiBTRkM7XG4gIH07XG59IiwiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L3ByZWZlci1kZWZhdWx0LWV4cG9ydCwgcHJlZmVyLWRlc3RydWN0dXJpbmcgKi9cbmltcG9ydCB7IGdlbmVyYXRlIH0gZnJvbSAnQGFudC1kZXNpZ24vY29sb3JzJztcbmltcG9ydCB7IFRpbnlDb2xvciB9IGZyb20gJ0BjdHJsL3Rpbnljb2xvcic7XG5pbXBvcnQgY2FuVXNlRG9tIGZyb20gXCJyYy11dGlsL2VzL0RvbS9jYW5Vc2VEb21cIjtcbmltcG9ydCB7IHVwZGF0ZUNTUyB9IGZyb20gXCJyYy11dGlsL2VzL0RvbS9keW5hbWljQ1NTXCI7XG5pbXBvcnQgd2FybmluZyBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbnZhciBkeW5hbWljU3R5bGVNYXJrID0gXCItYW50LVwiLmNvbmNhdChEYXRlLm5vdygpLCBcIi1cIikuY29uY2F0KE1hdGgucmFuZG9tKCkpO1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0eWxlKGdsb2JhbFByZWZpeENscywgdGhlbWUpIHtcbiAgdmFyIHZhcmlhYmxlcyA9IHt9O1xuICB2YXIgZm9ybWF0Q29sb3IgPSBmdW5jdGlvbiBmb3JtYXRDb2xvcihjb2xvciwgdXBkYXRlcikge1xuICAgIHZhciBjbG9uZSA9IGNvbG9yLmNsb25lKCk7XG4gICAgY2xvbmUgPSAodXBkYXRlciA9PT0gbnVsbCB8fCB1cGRhdGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB1cGRhdGVyKGNsb25lKSkgfHwgY2xvbmU7XG4gICAgcmV0dXJuIGNsb25lLnRvUmdiU3RyaW5nKCk7XG4gIH07XG4gIHZhciBmaWxsQ29sb3IgPSBmdW5jdGlvbiBmaWxsQ29sb3IoY29sb3JWYWwsIHR5cGUpIHtcbiAgICB2YXIgYmFzZUNvbG9yID0gbmV3IFRpbnlDb2xvcihjb2xvclZhbCk7XG4gICAgdmFyIGNvbG9yUGFsZXR0ZXMgPSBnZW5lcmF0ZShiYXNlQ29sb3IudG9SZ2JTdHJpbmcoKSk7XG4gICAgdmFyaWFibGVzW1wiXCIuY29uY2F0KHR5cGUsIFwiLWNvbG9yXCIpXSA9IGZvcm1hdENvbG9yKGJhc2VDb2xvcik7XG4gICAgdmFyaWFibGVzW1wiXCIuY29uY2F0KHR5cGUsIFwiLWNvbG9yLWRpc2FibGVkXCIpXSA9IGNvbG9yUGFsZXR0ZXNbMV07XG4gICAgdmFyaWFibGVzW1wiXCIuY29uY2F0KHR5cGUsIFwiLWNvbG9yLWhvdmVyXCIpXSA9IGNvbG9yUGFsZXR0ZXNbNF07XG4gICAgdmFyaWFibGVzW1wiXCIuY29uY2F0KHR5cGUsIFwiLWNvbG9yLWFjdGl2ZVwiKV0gPSBjb2xvclBhbGV0dGVzWzZdO1xuICAgIHZhcmlhYmxlc1tcIlwiLmNvbmNhdCh0eXBlLCBcIi1jb2xvci1vdXRsaW5lXCIpXSA9IGJhc2VDb2xvci5jbG9uZSgpLnNldEFscGhhKDAuMikudG9SZ2JTdHJpbmcoKTtcbiAgICB2YXJpYWJsZXNbXCJcIi5jb25jYXQodHlwZSwgXCItY29sb3ItZGVwcmVjYXRlZC1iZ1wiKV0gPSBjb2xvclBhbGV0dGVzWzBdO1xuICAgIHZhcmlhYmxlc1tcIlwiLmNvbmNhdCh0eXBlLCBcIi1jb2xvci1kZXByZWNhdGVkLWJvcmRlclwiKV0gPSBjb2xvclBhbGV0dGVzWzJdO1xuICB9O1xuICAvLyA9PT09PT09PT09PT09PT09IFByaW1hcnkgQ29sb3IgPT09PT09PT09PT09PT09PVxuICBpZiAodGhlbWUucHJpbWFyeUNvbG9yKSB7XG4gICAgZmlsbENvbG9yKHRoZW1lLnByaW1hcnlDb2xvciwgJ3ByaW1hcnknKTtcbiAgICB2YXIgcHJpbWFyeUNvbG9yID0gbmV3IFRpbnlDb2xvcih0aGVtZS5wcmltYXJ5Q29sb3IpO1xuICAgIHZhciBwcmltYXJ5Q29sb3JzID0gZ2VuZXJhdGUocHJpbWFyeUNvbG9yLnRvUmdiU3RyaW5nKCkpO1xuICAgIC8vIExlZ2FjeSAtIFdlIHNob3VsZCB1c2Ugc2VtYW50aWMgbmFtaW5nIHN0YW5kYXJkXG4gICAgcHJpbWFyeUNvbG9ycy5mb3JFYWNoKGZ1bmN0aW9uIChjb2xvciwgaW5kZXgpIHtcbiAgICAgIHZhcmlhYmxlc1tcInByaW1hcnktXCIuY29uY2F0KGluZGV4ICsgMSldID0gY29sb3I7XG4gICAgfSk7XG4gICAgLy8gRGVwcmVjYXRlZFxuICAgIHZhcmlhYmxlc1sncHJpbWFyeS1jb2xvci1kZXByZWNhdGVkLWwtMzUnXSA9IGZvcm1hdENvbG9yKHByaW1hcnlDb2xvciwgZnVuY3Rpb24gKGMpIHtcbiAgICAgIHJldHVybiBjLmxpZ2h0ZW4oMzUpO1xuICAgIH0pO1xuICAgIHZhcmlhYmxlc1sncHJpbWFyeS1jb2xvci1kZXByZWNhdGVkLWwtMjAnXSA9IGZvcm1hdENvbG9yKHByaW1hcnlDb2xvciwgZnVuY3Rpb24gKGMpIHtcbiAgICAgIHJldHVybiBjLmxpZ2h0ZW4oMjApO1xuICAgIH0pO1xuICAgIHZhcmlhYmxlc1sncHJpbWFyeS1jb2xvci1kZXByZWNhdGVkLXQtMjAnXSA9IGZvcm1hdENvbG9yKHByaW1hcnlDb2xvciwgZnVuY3Rpb24gKGMpIHtcbiAgICAgIHJldHVybiBjLnRpbnQoMjApO1xuICAgIH0pO1xuICAgIHZhcmlhYmxlc1sncHJpbWFyeS1jb2xvci1kZXByZWNhdGVkLXQtNTAnXSA9IGZvcm1hdENvbG9yKHByaW1hcnlDb2xvciwgZnVuY3Rpb24gKGMpIHtcbiAgICAgIHJldHVybiBjLnRpbnQoNTApO1xuICAgIH0pO1xuICAgIHZhcmlhYmxlc1sncHJpbWFyeS1jb2xvci1kZXByZWNhdGVkLWYtMTInXSA9IGZvcm1hdENvbG9yKHByaW1hcnlDb2xvciwgZnVuY3Rpb24gKGMpIHtcbiAgICAgIHJldHVybiBjLnNldEFscGhhKGMuZ2V0QWxwaGEoKSAqIDAuMTIpO1xuICAgIH0pO1xuICAgIHZhciBwcmltYXJ5QWN0aXZlQ29sb3IgPSBuZXcgVGlueUNvbG9yKHByaW1hcnlDb2xvcnNbMF0pO1xuICAgIHZhcmlhYmxlc1sncHJpbWFyeS1jb2xvci1hY3RpdmUtZGVwcmVjYXRlZC1mLTMwJ10gPSBmb3JtYXRDb2xvcihwcmltYXJ5QWN0aXZlQ29sb3IsIGZ1bmN0aW9uIChjKSB7XG4gICAgICByZXR1cm4gYy5zZXRBbHBoYShjLmdldEFscGhhKCkgKiAwLjMpO1xuICAgIH0pO1xuICAgIHZhcmlhYmxlc1sncHJpbWFyeS1jb2xvci1hY3RpdmUtZGVwcmVjYXRlZC1kLTAyJ10gPSBmb3JtYXRDb2xvcihwcmltYXJ5QWN0aXZlQ29sb3IsIGZ1bmN0aW9uIChjKSB7XG4gICAgICByZXR1cm4gYy5kYXJrZW4oMik7XG4gICAgfSk7XG4gIH1cbiAgLy8gPT09PT09PT09PT09PT09PSBTdWNjZXNzIENvbG9yID09PT09PT09PT09PT09PT1cbiAgaWYgKHRoZW1lLnN1Y2Nlc3NDb2xvcikge1xuICAgIGZpbGxDb2xvcih0aGVtZS5zdWNjZXNzQ29sb3IsICdzdWNjZXNzJyk7XG4gIH1cbiAgLy8gPT09PT09PT09PT09PT09PSBXYXJuaW5nIENvbG9yID09PT09PT09PT09PT09PT1cbiAgaWYgKHRoZW1lLndhcm5pbmdDb2xvcikge1xuICAgIGZpbGxDb2xvcih0aGVtZS53YXJuaW5nQ29sb3IsICd3YXJuaW5nJyk7XG4gIH1cbiAgLy8gPT09PT09PT09PT09PT09PT0gRXJyb3IgQ29sb3IgPT09PT09PT09PT09PT09PT1cbiAgaWYgKHRoZW1lLmVycm9yQ29sb3IpIHtcbiAgICBmaWxsQ29sb3IodGhlbWUuZXJyb3JDb2xvciwgJ2Vycm9yJyk7XG4gIH1cbiAgLy8gPT09PT09PT09PT09PT09PT0gSW5mbyBDb2xvciA9PT09PT09PT09PT09PT09PT1cbiAgaWYgKHRoZW1lLmluZm9Db2xvcikge1xuICAgIGZpbGxDb2xvcih0aGVtZS5pbmZvQ29sb3IsICdpbmZvJyk7XG4gIH1cbiAgLy8gQ29udmVydCB0byBjc3MgdmFyaWFibGVzXG4gIHZhciBjc3NMaXN0ID0gT2JqZWN0LmtleXModmFyaWFibGVzKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBcIi0tXCIuY29uY2F0KGdsb2JhbFByZWZpeENscywgXCItXCIpLmNvbmNhdChrZXksIFwiOiBcIikuY29uY2F0KHZhcmlhYmxlc1trZXldLCBcIjtcIik7XG4gIH0pO1xuICByZXR1cm4gXCJcXG4gIDpyb290IHtcXG4gICAgXCIuY29uY2F0KGNzc0xpc3Quam9pbignXFxuJyksIFwiXFxuICB9XFxuICBcIikudHJpbSgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyVGhlbWUoZ2xvYmFsUHJlZml4Q2xzLCB0aGVtZSkge1xuICB2YXIgc3R5bGUgPSBnZXRTdHlsZShnbG9iYWxQcmVmaXhDbHMsIHRoZW1lKTtcbiAgaWYgKGNhblVzZURvbSgpKSB7XG4gICAgdXBkYXRlQ1NTKHN0eWxlLCBcIlwiLmNvbmNhdChkeW5hbWljU3R5bGVNYXJrLCBcIi1keW5hbWljLXRoZW1lXCIpKTtcbiAgfSBlbHNlIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGZhbHNlLCAnQ29uZmlnUHJvdmlkZXInLCAnU1NSIGRvIG5vdCBzdXBwb3J0IGR5bmFtaWMgdGhlbWUgd2l0aCBjc3MgdmFyaWFibGVzLicpIDogdm9pZCAwO1xuICB9XG59IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIERpc2FibGVkQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KGZhbHNlKTtcbmV4cG9ydCB2YXIgRGlzYWJsZWRDb250ZXh0UHJvdmlkZXIgPSBmdW5jdGlvbiBEaXNhYmxlZENvbnRleHRQcm92aWRlcihfcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgZGlzYWJsZWQgPSBfcmVmLmRpc2FibGVkO1xuICB2YXIgb3JpZ2luRGlzYWJsZWQgPSBSZWFjdC51c2VDb250ZXh0KERpc2FibGVkQ29udGV4dCk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEaXNhYmxlZENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogZGlzYWJsZWQgIT09IG51bGwgJiYgZGlzYWJsZWQgIT09IHZvaWQgMCA/IGRpc2FibGVkIDogb3JpZ2luRGlzYWJsZWRcbiAgfSwgY2hpbGRyZW4pO1xufTtcbmV4cG9ydCBkZWZhdWx0IERpc2FibGVkQ29udGV4dDsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgU2l6ZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh1bmRlZmluZWQpO1xuZXhwb3J0IHZhciBTaXplQ29udGV4dFByb3ZpZGVyID0gZnVuY3Rpb24gU2l6ZUNvbnRleHRQcm92aWRlcihfcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgc2l6ZSA9IF9yZWYuc2l6ZTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNpemVDb250ZXh0LkNvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAob3JpZ2luU2l6ZSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTaXplQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgdmFsdWU6IHNpemUgfHwgb3JpZ2luU2l6ZVxuICAgIH0sIGNoaWxkcmVuKTtcbiAgfSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgU2l6ZUNvbnRleHQ7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgSWNvbkNvbnRleHQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2NvbXBvbmVudHMvQ29udGV4dFwiO1xuaW1wb3J0IHsgRm9ybVByb3ZpZGVyIGFzIFJjRm9ybVByb3ZpZGVyIH0gZnJvbSAncmMtZmllbGQtZm9ybSc7XG5pbXBvcnQgdXNlTWVtbyBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZW1vXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgTG9jYWxlUHJvdmlkZXIsIHsgQU5UX01BUksgfSBmcm9tICcuLi9sb2NhbGUtcHJvdmlkZXInO1xuaW1wb3J0IExvY2FsZVJlY2VpdmVyIGZyb20gJy4uL2xvY2FsZS1wcm92aWRlci9Mb2NhbGVSZWNlaXZlcic7XG5pbXBvcnQgZGVmYXVsdExvY2FsZSBmcm9tICcuLi9sb2NhbGUvZGVmYXVsdCc7XG5pbXBvcnQgbWVzc2FnZSBmcm9tICcuLi9tZXNzYWdlJztcbmltcG9ydCBub3RpZmljYXRpb24gZnJvbSAnLi4vbm90aWZpY2F0aW9uJztcbmltcG9ydCB7IENvbmZpZ0NvbnN1bWVyLCBDb25maWdDb250ZXh0IH0gZnJvbSAnLi9jb250ZXh0JztcbmltcG9ydCB7IHJlZ2lzdGVyVGhlbWUgfSBmcm9tICcuL2Nzc1ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBEaXNhYmxlZENvbnRleHRQcm92aWRlciB9IGZyb20gJy4vRGlzYWJsZWRDb250ZXh0JztcbmltcG9ydCBTaXplQ29udGV4dCwgeyBTaXplQ29udGV4dFByb3ZpZGVyIH0gZnJvbSAnLi9TaXplQ29udGV4dCc7XG5leHBvcnQgeyBDb25maWdDb250ZXh0LCBDb25maWdDb25zdW1lciB9O1xuZXhwb3J0IHZhciBjb25maWdDb25zdW1lclByb3BzID0gWydnZXRUYXJnZXRDb250YWluZXInLCAnZ2V0UG9wdXBDb250YWluZXInLCAncm9vdFByZWZpeENscycsICdnZXRQcmVmaXhDbHMnLCAncmVuZGVyRW1wdHknLCAnY3NwJywgJ2F1dG9JbnNlcnRTcGFjZUluQnV0dG9uJywgJ2xvY2FsZScsICdwYWdlSGVhZGVyJ107XG4vLyBUaGVzZSBwcm9wcyBpcyB1c2VkIGJ5IGB1c2VDb250ZXh0YCBkaXJlY3RseSBpbiBzdWIgY29tcG9uZW50XG52YXIgUEFTU0VEX1BST1BTID0gWydnZXRUYXJnZXRDb250YWluZXInLCAnZ2V0UG9wdXBDb250YWluZXInLCAncmVuZGVyRW1wdHknLCAncGFnZUhlYWRlcicsICdpbnB1dCcsICdwYWdpbmF0aW9uJywgJ2Zvcm0nXTtcbmV4cG9ydCB2YXIgZGVmYXVsdFByZWZpeENscyA9ICdhbnQnO1xuZXhwb3J0IHZhciBkZWZhdWx0SWNvblByZWZpeENscyA9ICdhbnRpY29uJztcbnZhciBnbG9iYWxQcmVmaXhDbHM7XG52YXIgZ2xvYmFsSWNvblByZWZpeENscztcbmZ1bmN0aW9uIGdldEdsb2JhbFByZWZpeENscygpIHtcbiAgcmV0dXJuIGdsb2JhbFByZWZpeENscyB8fCBkZWZhdWx0UHJlZml4Q2xzO1xufVxuZnVuY3Rpb24gZ2V0R2xvYmFsSWNvblByZWZpeENscygpIHtcbiAgcmV0dXJuIGdsb2JhbEljb25QcmVmaXhDbHMgfHwgZGVmYXVsdEljb25QcmVmaXhDbHM7XG59XG52YXIgc2V0R2xvYmFsQ29uZmlnID0gZnVuY3Rpb24gc2V0R2xvYmFsQ29uZmlnKF9yZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgIGljb25QcmVmaXhDbHMgPSBfcmVmLmljb25QcmVmaXhDbHMsXG4gICAgdGhlbWUgPSBfcmVmLnRoZW1lO1xuICBpZiAocHJlZml4Q2xzICE9PSB1bmRlZmluZWQpIHtcbiAgICBnbG9iYWxQcmVmaXhDbHMgPSBwcmVmaXhDbHM7XG4gIH1cbiAgaWYgKGljb25QcmVmaXhDbHMgIT09IHVuZGVmaW5lZCkge1xuICAgIGdsb2JhbEljb25QcmVmaXhDbHMgPSBpY29uUHJlZml4Q2xzO1xuICB9XG4gIGlmICh0aGVtZSkge1xuICAgIHJlZ2lzdGVyVGhlbWUoZ2V0R2xvYmFsUHJlZml4Q2xzKCksIHRoZW1lKTtcbiAgfVxufTtcbmV4cG9ydCB2YXIgZ2xvYmFsQ29uZmlnID0gZnVuY3Rpb24gZ2xvYmFsQ29uZmlnKCkge1xuICByZXR1cm4ge1xuICAgIGdldFByZWZpeENsczogZnVuY3Rpb24gZ2V0UHJlZml4Q2xzKHN1ZmZpeENscywgY3VzdG9taXplUHJlZml4Q2xzKSB7XG4gICAgICBpZiAoY3VzdG9taXplUHJlZml4Q2xzKSByZXR1cm4gY3VzdG9taXplUHJlZml4Q2xzO1xuICAgICAgcmV0dXJuIHN1ZmZpeENscyA/IFwiXCIuY29uY2F0KGdldEdsb2JhbFByZWZpeENscygpLCBcIi1cIikuY29uY2F0KHN1ZmZpeENscykgOiBnZXRHbG9iYWxQcmVmaXhDbHMoKTtcbiAgICB9LFxuICAgIGdldEljb25QcmVmaXhDbHM6IGdldEdsb2JhbEljb25QcmVmaXhDbHMsXG4gICAgZ2V0Um9vdFByZWZpeENsczogZnVuY3Rpb24gZ2V0Um9vdFByZWZpeENscyhyb290UHJlZml4Q2xzLCBjdXN0b21pemVQcmVmaXhDbHMpIHtcbiAgICAgIC8vIEN1c3RvbWl6ZSByb290UHJlZml4Q2xzIGlzIGZpcnN0IHByaW9yaXR5XG4gICAgICBpZiAocm9vdFByZWZpeENscykge1xuICAgICAgICByZXR1cm4gcm9vdFByZWZpeENscztcbiAgICAgIH1cbiAgICAgIC8vIElmIEdsb2JhbCBwcmVmaXhDbHMgcHJvdmlkZWQsIHVzZSB0aGlzXG4gICAgICBpZiAoZ2xvYmFsUHJlZml4Q2xzKSB7XG4gICAgICAgIHJldHVybiBnbG9iYWxQcmVmaXhDbHM7XG4gICAgICB9XG4gICAgICAvLyBbTGVnYWN5XSBJZiBjdXN0b21pemUgcHJlZml4Q2xzIHByb3ZpZGVkLCB3ZSBjdXQgaXQgdG8gZ2V0IHRoZSBwcmVmaXhDbHNcbiAgICAgIGlmIChjdXN0b21pemVQcmVmaXhDbHMgJiYgY3VzdG9taXplUHJlZml4Q2xzLmluY2x1ZGVzKCctJykpIHtcbiAgICAgICAgcmV0dXJuIGN1c3RvbWl6ZVByZWZpeENscy5yZXBsYWNlKC9eKC4qKS1bXi1dKiQvLCAnJDEnKTtcbiAgICAgIH1cbiAgICAgIC8vIEZhbGxiYWNrIHRvIGRlZmF1bHQgcHJlZml4Q2xzXG4gICAgICByZXR1cm4gZ2V0R2xvYmFsUHJlZml4Q2xzKCk7XG4gICAgfVxuICB9O1xufTtcbnZhciBQcm92aWRlckNoaWxkcmVuID0gZnVuY3Rpb24gUHJvdmlkZXJDaGlsZHJlbihwcm9wcykge1xuICB2YXIgX2EsIF9iO1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBjc3AgPSBwcm9wcy5jc3AsXG4gICAgYXV0b0luc2VydFNwYWNlSW5CdXR0b24gPSBwcm9wcy5hdXRvSW5zZXJ0U3BhY2VJbkJ1dHRvbixcbiAgICBmb3JtID0gcHJvcHMuZm9ybSxcbiAgICBsb2NhbGUgPSBwcm9wcy5sb2NhbGUsXG4gICAgY29tcG9uZW50U2l6ZSA9IHByb3BzLmNvbXBvbmVudFNpemUsXG4gICAgZGlyZWN0aW9uID0gcHJvcHMuZGlyZWN0aW9uLFxuICAgIHNwYWNlID0gcHJvcHMuc3BhY2UsXG4gICAgdmlydHVhbCA9IHByb3BzLnZpcnR1YWwsXG4gICAgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoID0gcHJvcHMuZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoLFxuICAgIGxlZ2FjeUxvY2FsZSA9IHByb3BzLmxlZ2FjeUxvY2FsZSxcbiAgICBwYXJlbnRDb250ZXh0ID0gcHJvcHMucGFyZW50Q29udGV4dCxcbiAgICBpY29uUHJlZml4Q2xzID0gcHJvcHMuaWNvblByZWZpeENscyxcbiAgICBjb21wb25lbnREaXNhYmxlZCA9IHByb3BzLmNvbXBvbmVudERpc2FibGVkO1xuICB2YXIgZ2V0UHJlZml4Q2xzID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHN1ZmZpeENscywgY3VzdG9taXplUHJlZml4Q2xzKSB7XG4gICAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscztcbiAgICBpZiAoY3VzdG9taXplUHJlZml4Q2xzKSByZXR1cm4gY3VzdG9taXplUHJlZml4Q2xzO1xuICAgIHZhciBtZXJnZWRQcmVmaXhDbHMgPSBwcmVmaXhDbHMgfHwgcGFyZW50Q29udGV4dC5nZXRQcmVmaXhDbHMoJycpO1xuICAgIHJldHVybiBzdWZmaXhDbHMgPyBcIlwiLmNvbmNhdChtZXJnZWRQcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoc3VmZml4Q2xzKSA6IG1lcmdlZFByZWZpeENscztcbiAgfSwgW3BhcmVudENvbnRleHQuZ2V0UHJlZml4Q2xzLCBwcm9wcy5wcmVmaXhDbHNdKTtcbiAgdmFyIGNvbmZpZyA9IF9leHRlbmRzKF9leHRlbmRzKHt9LCBwYXJlbnRDb250ZXh0KSwge1xuICAgIGNzcDogY3NwLFxuICAgIGF1dG9JbnNlcnRTcGFjZUluQnV0dG9uOiBhdXRvSW5zZXJ0U3BhY2VJbkJ1dHRvbixcbiAgICBsb2NhbGU6IGxvY2FsZSB8fCBsZWdhY3lMb2NhbGUsXG4gICAgZGlyZWN0aW9uOiBkaXJlY3Rpb24sXG4gICAgc3BhY2U6IHNwYWNlLFxuICAgIHZpcnR1YWw6IHZpcnR1YWwsXG4gICAgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoOiBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGgsXG4gICAgZ2V0UHJlZml4Q2xzOiBnZXRQcmVmaXhDbHNcbiAgfSk7XG4gIC8vIFBhc3MgdGhlIHByb3BzIHVzZWQgYnkgYHVzZUNvbnRleHRgIGRpcmVjdGx5IHdpdGggY2hpbGQgY29tcG9uZW50LlxuICAvLyBUaGVzZSBwcm9wcyBzaG91bGQgbWVyZ2VkIGludG8gYGNvbmZpZ2AuXG4gIFBBU1NFRF9QUk9QUy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wTmFtZSkge1xuICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgaWYgKHByb3BWYWx1ZSkge1xuICAgICAgY29uZmlnW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcbiAgICB9XG4gIH0pO1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8yNzYxN1xuICB2YXIgbWVtb2VkQ29uZmlnID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfSwgY29uZmlnLCBmdW5jdGlvbiAocHJldkNvbmZpZywgY3VycmVudENvbmZpZykge1xuICAgIHZhciBwcmV2S2V5cyA9IE9iamVjdC5rZXlzKHByZXZDb25maWcpO1xuICAgIHZhciBjdXJyZW50S2V5cyA9IE9iamVjdC5rZXlzKGN1cnJlbnRDb25maWcpO1xuICAgIHJldHVybiBwcmV2S2V5cy5sZW5ndGggIT09IGN1cnJlbnRLZXlzLmxlbmd0aCB8fCBwcmV2S2V5cy5zb21lKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHJldHVybiBwcmV2Q29uZmlnW2tleV0gIT09IGN1cnJlbnRDb25maWdba2V5XTtcbiAgICB9KTtcbiAgfSk7XG4gIHZhciBtZW1vSWNvbkNvbnRleHRWYWx1ZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBwcmVmaXhDbHM6IGljb25QcmVmaXhDbHMsXG4gICAgICBjc3A6IGNzcFxuICAgIH07XG4gIH0sIFtpY29uUHJlZml4Q2xzLCBjc3BdKTtcbiAgdmFyIGNoaWxkTm9kZSA9IGNoaWxkcmVuO1xuICAvLyBBZGRpdGlvbmFsIEZvcm0gcHJvdmlkZXJcbiAgdmFyIHZhbGlkYXRlTWVzc2FnZXMgPSB7fTtcbiAgaWYgKGxvY2FsZSkge1xuICAgIHZhbGlkYXRlTWVzc2FnZXMgPSAoKF9hID0gbG9jYWxlLkZvcm0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kZWZhdWx0VmFsaWRhdGVNZXNzYWdlcykgfHwgKChfYiA9IGRlZmF1bHRMb2NhbGUuRm9ybSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmRlZmF1bHRWYWxpZGF0ZU1lc3NhZ2VzKSB8fCB7fTtcbiAgfVxuICBpZiAoZm9ybSAmJiBmb3JtLnZhbGlkYXRlTWVzc2FnZXMpIHtcbiAgICB2YWxpZGF0ZU1lc3NhZ2VzID0gX2V4dGVuZHMoX2V4dGVuZHMoe30sIHZhbGlkYXRlTWVzc2FnZXMpLCBmb3JtLnZhbGlkYXRlTWVzc2FnZXMpO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyh2YWxpZGF0ZU1lc3NhZ2VzKS5sZW5ndGggPiAwKSB7XG4gICAgY2hpbGROb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmNGb3JtUHJvdmlkZXIsIHtcbiAgICAgIHZhbGlkYXRlTWVzc2FnZXM6IHZhbGlkYXRlTWVzc2FnZXNcbiAgICB9LCBjaGlsZHJlbik7XG4gIH1cbiAgaWYgKGxvY2FsZSkge1xuICAgIGNoaWxkTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExvY2FsZVByb3ZpZGVyLCB7XG4gICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgIF9BTlRfTUFSS19fOiBBTlRfTUFSS1xuICAgIH0sIGNoaWxkTm9kZSk7XG4gIH1cbiAgaWYgKGljb25QcmVmaXhDbHMgfHwgY3NwKSB7XG4gICAgY2hpbGROb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSWNvbkNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgIHZhbHVlOiBtZW1vSWNvbkNvbnRleHRWYWx1ZVxuICAgIH0sIGNoaWxkTm9kZSk7XG4gIH1cbiAgaWYgKGNvbXBvbmVudFNpemUpIHtcbiAgICBjaGlsZE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTaXplQ29udGV4dFByb3ZpZGVyLCB7XG4gICAgICBzaXplOiBjb21wb25lbnRTaXplXG4gICAgfSwgY2hpbGROb2RlKTtcbiAgfVxuICBpZiAoY29tcG9uZW50RGlzYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNoaWxkTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERpc2FibGVkQ29udGV4dFByb3ZpZGVyLCB7XG4gICAgICBkaXNhYmxlZDogY29tcG9uZW50RGlzYWJsZWRcbiAgICB9LCBjaGlsZE5vZGUpO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb25maWdDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IG1lbW9lZENvbmZpZ1xuICB9LCBjaGlsZE5vZGUpO1xufTtcbnZhciBDb25maWdQcm92aWRlciA9IGZ1bmN0aW9uIENvbmZpZ1Byb3ZpZGVyKHByb3BzKSB7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHByb3BzLmRpcmVjdGlvbikge1xuICAgICAgbWVzc2FnZS5jb25maWcoe1xuICAgICAgICBydGw6IHByb3BzLmRpcmVjdGlvbiA9PT0gJ3J0bCdcbiAgICAgIH0pO1xuICAgICAgbm90aWZpY2F0aW9uLmNvbmZpZyh7XG4gICAgICAgIHJ0bDogcHJvcHMuZGlyZWN0aW9uID09PSAncnRsJ1xuICAgICAgfSk7XG4gICAgfVxuICB9LCBbcHJvcHMuZGlyZWN0aW9uXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMb2NhbGVSZWNlaXZlciwgbnVsbCwgZnVuY3Rpb24gKF8sIF9fLCBsZWdhY3lMb2NhbGUpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29uZmlnQ29uc3VtZXIsIG51bGwsIGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUHJvdmlkZXJDaGlsZHJlbiwgX2V4dGVuZHMoe1xuICAgICAgICBwYXJlbnRDb250ZXh0OiBjb250ZXh0LFxuICAgICAgICBsZWdhY3lMb2NhbGU6IGxlZ2FjeUxvY2FsZVxuICAgICAgfSwgcHJvcHMpKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuLyoqIEBwcml2YXRlIGludGVybmFsIFVzYWdlLiBkbyBub3QgdXNlIGluIHlvdXIgcHJvZHVjdGlvbiAqL1xuQ29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCA9IENvbmZpZ0NvbnRleHQ7XG5Db25maWdQcm92aWRlci5TaXplQ29udGV4dCA9IFNpemVDb250ZXh0O1xuQ29uZmlnUHJvdmlkZXIuY29uZmlnID0gc2V0R2xvYmFsQ29uZmlnO1xuZXhwb3J0IGRlZmF1bHQgQ29uZmlnUHJvdmlkZXI7IiwiaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyV3JhcCh0YXJnZXQsIGV2ZW50VHlwZSwgY2IsIG9wdGlvbikge1xuICAvKiBlc2xpbnQgY2FtZWxjYXNlOiAyICovXG4gIHZhciBjYWxsYmFjayA9IFJlYWN0RE9NLnVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzID8gZnVuY3Rpb24gcnVuKGUpIHtcbiAgICBSZWFjdERPTS51bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyhjYiwgZSk7XG4gIH0gOiBjYjtcbiAgaWYgKHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCAmJiB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgY2FsbGJhY2ssIG9wdGlvbik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgIGlmICh0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgJiYgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBjYWxsYmFjaywgb3B0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RGF0YU9yQXJpYVByb3BzKHByb3BzKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhwcm9wcykucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBrZXkpIHtcbiAgICBpZiAoKGtleS5zdGFydHNXaXRoKCdkYXRhLScpIHx8IGtleS5zdGFydHNXaXRoKCdhcmlhLScpIHx8IGtleSA9PT0gJ3JvbGUnKSAmJiAha2V5LnN0YXJ0c1dpdGgoJ2RhdGEtX18nKSkge1xuICAgICAgcHJldltrZXldID0gcHJvcHNba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHByZXY7XG4gIH0sIHt9KTtcbn0iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgaXNWYWxpZEVsZW1lbnQgPSBSZWFjdC5pc1ZhbGlkRWxlbWVudDtcbmV4cG9ydCB7IGlzVmFsaWRFbGVtZW50IH07XG5leHBvcnQgZnVuY3Rpb24gaXNGcmFnbWVudChjaGlsZCkge1xuICByZXR1cm4gY2hpbGQgJiYgaXNWYWxpZEVsZW1lbnQoY2hpbGQpICYmIGNoaWxkLnR5cGUgPT09IFJlYWN0LkZyYWdtZW50O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VFbGVtZW50KGVsZW1lbnQsIHJlcGxhY2VtZW50LCBwcm9wcykge1xuICBpZiAoIWlzVmFsaWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIHJlcGxhY2VtZW50O1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGVsZW1lbnQsIHR5cGVvZiBwcm9wcyA9PT0gJ2Z1bmN0aW9uJyA/IHByb3BzKGVsZW1lbnQucHJvcHMgfHwge30pIDogcHJvcHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lRWxlbWVudChlbGVtZW50LCBwcm9wcykge1xuICByZXR1cm4gcmVwbGFjZUVsZW1lbnQoZWxlbWVudCwgZWxlbWVudCwgcHJvcHMpO1xufSIsImV4cG9ydCBmdW5jdGlvbiBpc1dpbmRvdyhvYmopIHtcbiAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiBvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogPT09IG9iai53aW5kb3c7XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRTY3JvbGwodGFyZ2V0LCB0b3ApIHtcbiAgdmFyIF9hLCBfYjtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgdmFyIG1ldGhvZCA9IHRvcCA/ICdzY3JvbGxUb3AnIDogJ3Njcm9sbExlZnQnO1xuICB2YXIgcmVzdWx0ID0gMDtcbiAgaWYgKGlzV2luZG93KHRhcmdldCkpIHtcbiAgICByZXN1bHQgPSB0YXJnZXRbdG9wID8gJ3BhZ2VZT2Zmc2V0JyA6ICdwYWdlWE9mZnNldCddO1xuICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIERvY3VtZW50KSB7XG4gICAgcmVzdWx0ID0gdGFyZ2V0LmRvY3VtZW50RWxlbWVudFttZXRob2RdO1xuICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgcmVzdWx0ID0gdGFyZ2V0W21ldGhvZF07XG4gIH0gZWxzZSBpZiAodGFyZ2V0KSB7XG4gICAgLy8gQWNjb3JkaW5nIHRvIHRoZSB0eXBlIGluZmVyZW5jZSwgdGhlIGB0YXJnZXRgIGlzIGBuZXZlcmAgdHlwZS5cbiAgICAvLyBTaW5jZSB3ZSBjb25maWd1cmVkIHRoZSBsb29zZSBtb2RlIHR5cGUgY2hlY2tpbmcsIGFuZCBzdXBwb3J0cyBtb2NraW5nIHRoZSB0YXJnZXQgd2l0aCBzdWNoIHNoYXBlIGJlbG93OjpcbiAgICAvLyAgICBgeyBkb2N1bWVudEVsZW1lbnQ6IHsgc2Nyb2xsTGVmdDogMjAwLCBzY3JvbGxUb3A6IDQwMCB9IH1gLFxuICAgIC8vICAgIHRoZSBwcm9ncmFtIG1heSBmYWxscyBpbnRvIHRoaXMgYnJhbmNoLlxuICAgIC8vIENoZWNrIHRoZSBjb3JyZXNwb25kaW5nIHRlc3RzIGZvciBkZXRhaWxzLiBEb24ndCBzdXJlIHdoYXQgaXMgdGhlIHJlYWwgc2NlbmFyaW8gdGhpcyBoYXBwZW5zLlxuICAgIHJlc3VsdCA9IHRhcmdldFttZXRob2RdO1xuICB9XG4gIGlmICh0YXJnZXQgJiYgIWlzV2luZG93KHRhcmdldCkgJiYgdHlwZW9mIHJlc3VsdCAhPT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQgPSAoX2IgPSAoKF9hID0gdGFyZ2V0Lm93bmVyRG9jdW1lbnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRhcmdldCkuZG9jdW1lbnRFbGVtZW50KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2JbbWV0aG9kXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSIsIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvcHJlZmVyLWRlZmF1bHQtZXhwb3J0XG5leHBvcnQgZnVuY3Rpb24gZWFzZUluT3V0Q3ViaWModCwgYiwgYywgZCkge1xuICB2YXIgY2MgPSBjIC0gYjtcbiAgdCAvPSBkIC8gMjtcbiAgaWYgKHQgPCAxKSB7XG4gICAgcmV0dXJuIGNjIC8gMiAqIHQgKiB0ICogdCArIGI7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJldHVybi1hc3NpZ25cbiAgcmV0dXJuIGNjIC8gMiAqICgodCAtPSAyKSAqIHQgKiB0ICsgMikgKyBiO1xufSIsImltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG5pbXBvcnQgeyBlYXNlSW5PdXRDdWJpYyB9IGZyb20gJy4vZWFzaW5ncyc7XG5pbXBvcnQgZ2V0U2Nyb2xsLCB7IGlzV2luZG93IH0gZnJvbSAnLi9nZXRTY3JvbGwnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2Nyb2xsVG8oeSkge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gIHZhciBfb3B0aW9ucyRnZXRDb250YWluZXIgPSBvcHRpb25zLmdldENvbnRhaW5lcixcbiAgICBnZXRDb250YWluZXIgPSBfb3B0aW9ucyRnZXRDb250YWluZXIgPT09IHZvaWQgMCA/IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB3aW5kb3c7XG4gICAgfSA6IF9vcHRpb25zJGdldENvbnRhaW5lcixcbiAgICBjYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2ssXG4gICAgX29wdGlvbnMkZHVyYXRpb24gPSBvcHRpb25zLmR1cmF0aW9uLFxuICAgIGR1cmF0aW9uID0gX29wdGlvbnMkZHVyYXRpb24gPT09IHZvaWQgMCA/IDQ1MCA6IF9vcHRpb25zJGR1cmF0aW9uO1xuICB2YXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7XG4gIHZhciBzY3JvbGxUb3AgPSBnZXRTY3JvbGwoY29udGFpbmVyLCB0cnVlKTtcbiAgdmFyIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gIHZhciBmcmFtZUZ1bmMgPSBmdW5jdGlvbiBmcmFtZUZ1bmMoKSB7XG4gICAgdmFyIHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgdmFyIHRpbWUgPSB0aW1lc3RhbXAgLSBzdGFydFRpbWU7XG4gICAgdmFyIG5leHRTY3JvbGxUb3AgPSBlYXNlSW5PdXRDdWJpYyh0aW1lID4gZHVyYXRpb24gPyBkdXJhdGlvbiA6IHRpbWUsIHNjcm9sbFRvcCwgeSwgZHVyYXRpb24pO1xuICAgIGlmIChpc1dpbmRvdyhjb250YWluZXIpKSB7XG4gICAgICBjb250YWluZXIuc2Nyb2xsVG8od2luZG93LnBhZ2VYT2Zmc2V0LCBuZXh0U2Nyb2xsVG9wKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIERvY3VtZW50IHx8IGNvbnRhaW5lci5jb25zdHJ1Y3Rvci5uYW1lID09PSAnSFRNTERvY3VtZW50Jykge1xuICAgICAgY29udGFpbmVyLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgPSBuZXh0U2Nyb2xsVG9wO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250YWluZXIuc2Nyb2xsVG9wID0gbmV4dFNjcm9sbFRvcDtcbiAgICB9XG4gICAgaWYgKHRpbWUgPCBkdXJhdGlvbikge1xuICAgICAgcmFmKGZyYW1lRnVuYyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuICB9O1xuICByYWYoZnJhbWVGdW5jKTtcbn0iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VFdmVudChjYWxsYmFjaykge1xuICB2YXIgZm5SZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgZm5SZWYuY3VycmVudCA9IGNhbGxiYWNrO1xuICB2YXIgbWVtb0ZuID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIHZhciBfZm5SZWYkY3VycmVudDtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuICAgIHJldHVybiAoX2ZuUmVmJGN1cnJlbnQgPSBmblJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfZm5SZWYkY3VycmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ZuUmVmJGN1cnJlbnQuY2FsbC5hcHBseShfZm5SZWYkY3VycmVudCwgW2ZuUmVmXS5jb25jYXQoYXJncykpO1xuICB9LCBbXSk7XG4gIHJldHVybiBtZW1vRm47XG59IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNhblVzZURvbSBmcm9tIFwiLi4vRG9tL2NhblVzZURvbVwiO1xuXG4vKipcbiAqIFdyYXAgYFJlYWN0LnVzZUxheW91dEVmZmVjdGAgd2hpY2ggd2lsbCBub3QgdGhyb3cgd2FybmluZyBtZXNzYWdlIGluIHRlc3QgZW52XG4gKi9cbnZhciB1c2VJbnRlcm5hbExheW91dEVmZmVjdCA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAndGVzdCcgJiYgY2FuVXNlRG9tKCkgPyBSZWFjdC51c2VMYXlvdXRFZmZlY3QgOiBSZWFjdC51c2VFZmZlY3Q7XG52YXIgdXNlTGF5b3V0RWZmZWN0ID0gZnVuY3Rpb24gdXNlTGF5b3V0RWZmZWN0KGNhbGxiYWNrLCBkZXBzKSB7XG4gIHZhciBmaXJzdE1vdW50UmVmID0gUmVhY3QudXNlUmVmKHRydWUpO1xuICB1c2VJbnRlcm5hbExheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGZpcnN0TW91bnRSZWYuY3VycmVudCk7XG4gIH0sIGRlcHMpO1xuXG4gIC8vIFdlIHRlbGwgcmVhY3QgdGhhdCBmaXJzdCBtb3VudCBoYXMgcGFzc2VkXG4gIHVzZUludGVybmFsTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBmaXJzdE1vdW50UmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgZmlyc3RNb3VudFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9O1xuICB9LCBbXSk7XG59O1xuZXhwb3J0IHZhciB1c2VMYXlvdXRVcGRhdGVFZmZlY3QgPSBmdW5jdGlvbiB1c2VMYXlvdXRVcGRhdGVFZmZlY3QoY2FsbGJhY2ssIGRlcHMpIHtcbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uIChmaXJzdE1vdW50KSB7XG4gICAgaWYgKCFmaXJzdE1vdW50KSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG4gIH0sIGRlcHMpO1xufTtcbmV4cG9ydCBkZWZhdWx0IHVzZUxheW91dEVmZmVjdDsiLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCB1c2VFdmVudCBmcm9tIFwiLi91c2VFdmVudFwiO1xuaW1wb3J0IHsgdXNlTGF5b3V0VXBkYXRlRWZmZWN0IH0gZnJvbSBcIi4vdXNlTGF5b3V0RWZmZWN0XCI7XG5pbXBvcnQgdXNlU3RhdGUgZnJvbSBcIi4vdXNlU3RhdGVcIjtcbi8qKiBXZSBvbmx5IHRoaW5rIGB1bmRlZmluZWRgIGlzIGVtcHR5ICovXG5mdW5jdGlvbiBoYXNWYWx1ZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBTaW1pbGFyIHRvIGB1c2VTdGF0ZWAgYnV0IHdpbGwgdXNlIHByb3BzIHZhbHVlIGlmIHByb3ZpZGVkLlxuICogTm90ZSB0aGF0IGludGVybmFsIHVzZSByYy11dGlsIGB1c2VTdGF0ZWAgaG9vay5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlTWVyZ2VkU3RhdGUoZGVmYXVsdFN0YXRlVmFsdWUsIG9wdGlvbikge1xuICB2YXIgX3JlZiA9IG9wdGlvbiB8fCB7fSxcbiAgICBkZWZhdWx0VmFsdWUgPSBfcmVmLmRlZmF1bHRWYWx1ZSxcbiAgICB2YWx1ZSA9IF9yZWYudmFsdWUsXG4gICAgb25DaGFuZ2UgPSBfcmVmLm9uQ2hhbmdlLFxuICAgIHBvc3RTdGF0ZSA9IF9yZWYucG9zdFN0YXRlO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09IEluaXQgPT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChoYXNWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChoYXNWYWx1ZShkZWZhdWx0VmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgZGVmYXVsdFZhbHVlID09PSAnZnVuY3Rpb24nID8gZGVmYXVsdFZhbHVlKCkgOiBkZWZhdWx0VmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGRlZmF1bHRTdGF0ZVZhbHVlID09PSAnZnVuY3Rpb24nID8gZGVmYXVsdFN0YXRlVmFsdWUoKSA6IGRlZmF1bHRTdGF0ZVZhbHVlO1xuICAgICAgfVxuICAgIH0pLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIGlubmVyVmFsdWUgPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldElubmVyVmFsdWUgPSBfdXNlU3RhdGUyWzFdO1xuICB2YXIgbWVyZ2VkVmFsdWUgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBpbm5lclZhbHVlO1xuICB2YXIgcG9zdE1lcmdlZFZhbHVlID0gcG9zdFN0YXRlID8gcG9zdFN0YXRlKG1lcmdlZFZhbHVlKSA6IG1lcmdlZFZhbHVlO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gQ2hhbmdlID09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG9uQ2hhbmdlRm4gPSB1c2VFdmVudChvbkNoYW5nZSk7XG4gIHZhciBfdXNlU3RhdGUzID0gdXNlU3RhdGUoW21lcmdlZFZhbHVlXSksXG4gICAgX3VzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTMsIDIpLFxuICAgIHByZXZWYWx1ZSA9IF91c2VTdGF0ZTRbMF0sXG4gICAgc2V0UHJldlZhbHVlID0gX3VzZVN0YXRlNFsxXTtcbiAgdXNlTGF5b3V0VXBkYXRlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJldiA9IHByZXZWYWx1ZVswXTtcbiAgICBpZiAoaW5uZXJWYWx1ZSAhPT0gcHJldikge1xuICAgICAgb25DaGFuZ2VGbihpbm5lclZhbHVlLCBwcmV2KTtcbiAgICB9XG4gIH0sIFtwcmV2VmFsdWVdKTtcblxuICAvLyBTeW5jIHZhbHVlIGJhY2sgdG8gYHVuZGVmaW5lZGAgd2hlbiBpdCBmcm9tIGNvbnRyb2wgdG8gdW4tY29udHJvbFxuICB1c2VMYXlvdXRVcGRhdGVFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghaGFzVmFsdWUodmFsdWUpKSB7XG4gICAgICBzZXRJbm5lclZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH0sIFt2YWx1ZV0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gVXBkYXRlID09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHRyaWdnZXJDaGFuZ2UgPSB1c2VFdmVudChmdW5jdGlvbiAodXBkYXRlciwgaWdub3JlRGVzdHJveSkge1xuICAgIHNldElubmVyVmFsdWUodXBkYXRlciwgaWdub3JlRGVzdHJveSk7XG4gICAgc2V0UHJldlZhbHVlKFttZXJnZWRWYWx1ZV0sIGlnbm9yZURlc3Ryb3kpO1xuICB9KTtcbiAgcmV0dXJuIFtwb3N0TWVyZ2VkVmFsdWUsIHRyaWdnZXJDaGFuZ2VdO1xufSIsImV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoKSB7XG4gIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgYWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50IHx8IG5hdmlnYXRvci52ZW5kb3IgfHwgd2luZG93Lm9wZXJhO1xuICByZXR1cm4gLyhhbmRyb2lkfGJiXFxkK3xtZWVnbykuK21vYmlsZXxhdmFudGdvfGJhZGFcXC98YmxhY2tiZXJyeXxibGF6ZXJ8Y29tcGFsfGVsYWluZXxmZW5uZWN8aGlwdG9wfGllbW9iaWxlfGlwKGhvbmV8b2QpfGlyaXN8a2luZGxlfGxnZSB8bWFlbW98bWlkcHxtbXB8bW9iaWxlLitmaXJlZm94fG5ldGZyb250fG9wZXJhIG0ob2J8aW4paXxwYWxtKCBvcyk/fHBob25lfHAoaXhpfHJlKVxcL3xwbHVja2VyfHBvY2tldHxwc3B8c2VyaWVzKDR8NikwfHN5bWJpYW58dHJlb3x1cFxcLihicm93c2VyfGxpbmspfHZvZGFmb25lfHdhcHx3aW5kb3dzIGNlfHhkYXx4aWlub3xhbmRyb2lkfGlwYWR8cGxheWJvb2t8c2lsay9pLnRlc3QoYWdlbnQpIHx8IC8xMjA3fDYzMTB8NjU5MHwzZ3NvfDR0aHB8NTBbMS02XWl8Nzcwc3w4MDJzfGEgd2F8YWJhY3xhYyhlcnxvb3xzLSl8YWkoa298cm4pfGFsKGF2fGNhfGNvKXxhbW9pfGFuKGV4fG55fHl3KXxhcHR1fGFyKGNofGdvKXxhcyh0ZXx1cyl8YXR0d3xhdShkaXwtbXxyIHxzICl8YXZhbnxiZShja3xsbHxucSl8YmkobGJ8cmQpfGJsKGFjfGF6KXxicihlfHYpd3xidW1ifGJ3LShufHUpfGM1NVxcL3xjYXBpfGNjd2F8Y2RtLXxjZWxsfGNodG18Y2xkY3xjbWQtfGNvKG1wfG5kKXxjcmF3fGRhKGl0fGxsfG5nKXxkYnRlfGRjLXN8ZGV2aXxkaWNhfGRtb2J8ZG8oY3xwKW98ZHMoMTJ8LWQpfGVsKDQ5fGFpKXxlbShsMnx1bCl8ZXIoaWN8azApfGVzbDh8ZXooWzQtN10wfG9zfHdhfHplKXxmZXRjfGZseSgtfF8pfGcxIHV8ZzU2MHxnZW5lfGdmLTV8Zy1tb3xnbyhcXC53fG9kKXxncihhZHx1bil8aGFpZXxoY2l0fGhkLShtfHB8dCl8aGVpLXxoaShwdHx0YSl8aHAoIGl8aXApfGhzLWN8aHQoYygtfCB8X3xhfGd8cHxzfHQpfHRwKXxodShhd3x0Yyl8aS0oMjB8Z298bWEpfGkyMzB8aWFjKCB8LXxcXC8pfGlicm98aWRlYXxpZzAxfGlrb218aW0xa3xpbm5vfGlwYXF8aXJpc3xqYSh0fHYpYXxqYnJvfGplbXV8amlnc3xrZGRpfGtlaml8a2d0KCB8XFwvKXxrbG9ufGtwdCB8a3djLXxreW8oY3xrKXxsZShub3x4aSl8bGcoIGd8XFwvKGt8bHx1KXw1MHw1NHwtW2Etd10pfGxpYnd8bHlueHxtMS13fG0zZ2F8bTUwXFwvfG1hKHRlfHVpfHhvKXxtYygwMXwyMXxjYSl8bS1jcnxtZShyY3xyaSl8bWkobzh8b2F8dHMpfG1tZWZ8bW8oMDF8MDJ8Yml8ZGV8ZG98dCgtfCB8b3x2KXx6eil8bXQoNTB8cDF8diApfG13YnB8bXl3YXxuMTBbMC0yXXxuMjBbMi0zXXxuMzAoMHwyKXxuNTAoMHwyfDUpfG43KDAoMHwxKXwxMCl8bmUoKGN8bSktfG9ufHRmfHdmfHdnfHd0KXxub2soNnxpKXxuenBofG8yaW18b3AodGl8d3YpfG9yYW58b3dnMXxwODAwfHBhbihhfGR8dCl8cGR4Z3xwZygxM3wtKFsxLThdfGMpKXxwaGlsfHBpcmV8cGwoYXl8dWMpfHBuLTJ8cG8oY2t8cnR8c2UpfHByb3h8cHNpb3xwdC1nfHFhLWF8cWMoMDd8MTJ8MjF8MzJ8NjB8LVsyLTddfGktKXxxdGVrfHIzODB8cjYwMHxyYWtzfHJpbTl8cm8odmV8em8pfHM1NVxcL3xzYShnZXxtYXxtbXxtc3xueXx2YSl8c2MoMDF8aC18b298cC0pfHNka1xcL3xzZShjKC18MHwxKXw0N3xtY3xuZHxyaSl8c2doLXxzaGFyfHNpZSgtfG0pfHNrLTB8c2woNDV8aWQpfHNtKGFsfGFyfGIzfGl0fHQ1KXxzbyhmdHxueSl8c3AoMDF8aC18di18diApfHN5KDAxfG1iKXx0MigxOHw1MCl8dDYoMDB8MTB8MTgpfHRhKGd0fGxrKXx0Y2wtfHRkZy18dGVsKGl8bSl8dGltLXx0LW1vfHRvKHBsfHNoKXx0cyg3MHxtLXxtM3xtNSl8dHgtOXx1cChcXC5ifGcxfHNpKXx1dHN0fHY0MDB8djc1MHx2ZXJpfHZpKHJnfHRlKXx2ayg0MHw1WzAtM118LXYpfHZtNDB8dm9kYXx2dWxjfHZ4KDUyfDUzfDYwfDYxfDcwfDgwfDgxfDgzfDg1fDk4KXx3M2MoLXwgKXx3ZWJjfHdoaXR8d2koZyB8bmN8bncpfHdtbGJ8d29udXx4NzAwfHlhcy18eW91cnx6ZXRvfHp0ZS0vaS50ZXN0KGFnZW50ID09PSBudWxsIHx8IGFnZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhZ2VudC5zdWJzdHIoMCwgNCkpO1xufSk7IiwiLyoqXG4gKiBAaWdub3JlXG4gKiBzb21lIGtleS1jb2RlcyBkZWZpbml0aW9uIGFuZCB1dGlscyBmcm9tIGNsb3N1cmUtbGlicmFyeVxuICogQGF1dGhvciB5aW1pbmdoZUBnbWFpbC5jb21cbiAqL1xuXG52YXIgS2V5Q29kZSA9IHtcbiAgLyoqXG4gICAqIE1BQ19FTlRFUlxuICAgKi9cbiAgTUFDX0VOVEVSOiAzLFxuICAvKipcbiAgICogQkFDS1NQQUNFXG4gICAqL1xuICBCQUNLU1BBQ0U6IDgsXG4gIC8qKlxuICAgKiBUQUJcbiAgICovXG4gIFRBQjogOSxcbiAgLyoqXG4gICAqIE5VTUxPQ0sgb24gRkYvU2FmYXJpIE1hY1xuICAgKi9cbiAgTlVNX0NFTlRFUjogMTIsXG4gIC8vIE5VTUxPQ0sgb24gRkYvU2FmYXJpIE1hY1xuICAvKipcbiAgICogRU5URVJcbiAgICovXG4gIEVOVEVSOiAxMyxcbiAgLyoqXG4gICAqIFNISUZUXG4gICAqL1xuICBTSElGVDogMTYsXG4gIC8qKlxuICAgKiBDVFJMXG4gICAqL1xuICBDVFJMOiAxNyxcbiAgLyoqXG4gICAqIEFMVFxuICAgKi9cbiAgQUxUOiAxOCxcbiAgLyoqXG4gICAqIFBBVVNFXG4gICAqL1xuICBQQVVTRTogMTksXG4gIC8qKlxuICAgKiBDQVBTX0xPQ0tcbiAgICovXG4gIENBUFNfTE9DSzogMjAsXG4gIC8qKlxuICAgKiBFU0NcbiAgICovXG4gIEVTQzogMjcsXG4gIC8qKlxuICAgKiBTUEFDRVxuICAgKi9cbiAgU1BBQ0U6IDMyLFxuICAvKipcbiAgICogUEFHRV9VUFxuICAgKi9cbiAgUEFHRV9VUDogMzMsXG4gIC8vIGFsc28gTlVNX05PUlRIX0VBU1RcbiAgLyoqXG4gICAqIFBBR0VfRE9XTlxuICAgKi9cbiAgUEFHRV9ET1dOOiAzNCxcbiAgLy8gYWxzbyBOVU1fU09VVEhfRUFTVFxuICAvKipcbiAgICogRU5EXG4gICAqL1xuICBFTkQ6IDM1LFxuICAvLyBhbHNvIE5VTV9TT1VUSF9XRVNUXG4gIC8qKlxuICAgKiBIT01FXG4gICAqL1xuICBIT01FOiAzNixcbiAgLy8gYWxzbyBOVU1fTk9SVEhfV0VTVFxuICAvKipcbiAgICogTEVGVFxuICAgKi9cbiAgTEVGVDogMzcsXG4gIC8vIGFsc28gTlVNX1dFU1RcbiAgLyoqXG4gICAqIFVQXG4gICAqL1xuICBVUDogMzgsXG4gIC8vIGFsc28gTlVNX05PUlRIXG4gIC8qKlxuICAgKiBSSUdIVFxuICAgKi9cbiAgUklHSFQ6IDM5LFxuICAvLyBhbHNvIE5VTV9FQVNUXG4gIC8qKlxuICAgKiBET1dOXG4gICAqL1xuICBET1dOOiA0MCxcbiAgLy8gYWxzbyBOVU1fU09VVEhcbiAgLyoqXG4gICAqIFBSSU5UX1NDUkVFTlxuICAgKi9cbiAgUFJJTlRfU0NSRUVOOiA0NCxcbiAgLyoqXG4gICAqIElOU0VSVFxuICAgKi9cbiAgSU5TRVJUOiA0NSxcbiAgLy8gYWxzbyBOVU1fSU5TRVJUXG4gIC8qKlxuICAgKiBERUxFVEVcbiAgICovXG4gIERFTEVURTogNDYsXG4gIC8vIGFsc28gTlVNX0RFTEVURVxuICAvKipcbiAgICogWkVST1xuICAgKi9cbiAgWkVSTzogNDgsXG4gIC8qKlxuICAgKiBPTkVcbiAgICovXG4gIE9ORTogNDksXG4gIC8qKlxuICAgKiBUV09cbiAgICovXG4gIFRXTzogNTAsXG4gIC8qKlxuICAgKiBUSFJFRVxuICAgKi9cbiAgVEhSRUU6IDUxLFxuICAvKipcbiAgICogRk9VUlxuICAgKi9cbiAgRk9VUjogNTIsXG4gIC8qKlxuICAgKiBGSVZFXG4gICAqL1xuICBGSVZFOiA1MyxcbiAgLyoqXG4gICAqIFNJWFxuICAgKi9cbiAgU0lYOiA1NCxcbiAgLyoqXG4gICAqIFNFVkVOXG4gICAqL1xuICBTRVZFTjogNTUsXG4gIC8qKlxuICAgKiBFSUdIVFxuICAgKi9cbiAgRUlHSFQ6IDU2LFxuICAvKipcbiAgICogTklORVxuICAgKi9cbiAgTklORTogNTcsXG4gIC8qKlxuICAgKiBRVUVTVElPTl9NQVJLXG4gICAqL1xuICBRVUVTVElPTl9NQVJLOiA2MyxcbiAgLy8gbmVlZHMgbG9jYWxpemF0aW9uXG4gIC8qKlxuICAgKiBBXG4gICAqL1xuICBBOiA2NSxcbiAgLyoqXG4gICAqIEJcbiAgICovXG4gIEI6IDY2LFxuICAvKipcbiAgICogQ1xuICAgKi9cbiAgQzogNjcsXG4gIC8qKlxuICAgKiBEXG4gICAqL1xuICBEOiA2OCxcbiAgLyoqXG4gICAqIEVcbiAgICovXG4gIEU6IDY5LFxuICAvKipcbiAgICogRlxuICAgKi9cbiAgRjogNzAsXG4gIC8qKlxuICAgKiBHXG4gICAqL1xuICBHOiA3MSxcbiAgLyoqXG4gICAqIEhcbiAgICovXG4gIEg6IDcyLFxuICAvKipcbiAgICogSVxuICAgKi9cbiAgSTogNzMsXG4gIC8qKlxuICAgKiBKXG4gICAqL1xuICBKOiA3NCxcbiAgLyoqXG4gICAqIEtcbiAgICovXG4gIEs6IDc1LFxuICAvKipcbiAgICogTFxuICAgKi9cbiAgTDogNzYsXG4gIC8qKlxuICAgKiBNXG4gICAqL1xuICBNOiA3NyxcbiAgLyoqXG4gICAqIE5cbiAgICovXG4gIE46IDc4LFxuICAvKipcbiAgICogT1xuICAgKi9cbiAgTzogNzksXG4gIC8qKlxuICAgKiBQXG4gICAqL1xuICBQOiA4MCxcbiAgLyoqXG4gICAqIFFcbiAgICovXG4gIFE6IDgxLFxuICAvKipcbiAgICogUlxuICAgKi9cbiAgUjogODIsXG4gIC8qKlxuICAgKiBTXG4gICAqL1xuICBTOiA4MyxcbiAgLyoqXG4gICAqIFRcbiAgICovXG4gIFQ6IDg0LFxuICAvKipcbiAgICogVVxuICAgKi9cbiAgVTogODUsXG4gIC8qKlxuICAgKiBWXG4gICAqL1xuICBWOiA4NixcbiAgLyoqXG4gICAqIFdcbiAgICovXG4gIFc6IDg3LFxuICAvKipcbiAgICogWFxuICAgKi9cbiAgWDogODgsXG4gIC8qKlxuICAgKiBZXG4gICAqL1xuICBZOiA4OSxcbiAgLyoqXG4gICAqIFpcbiAgICovXG4gIFo6IDkwLFxuICAvKipcbiAgICogTUVUQVxuICAgKi9cbiAgTUVUQTogOTEsXG4gIC8vIFdJTl9LRVlfTEVGVFxuICAvKipcbiAgICogV0lOX0tFWV9SSUdIVFxuICAgKi9cbiAgV0lOX0tFWV9SSUdIVDogOTIsXG4gIC8qKlxuICAgKiBDT05URVhUX01FTlVcbiAgICovXG4gIENPTlRFWFRfTUVOVTogOTMsXG4gIC8qKlxuICAgKiBOVU1fWkVST1xuICAgKi9cbiAgTlVNX1pFUk86IDk2LFxuICAvKipcbiAgICogTlVNX09ORVxuICAgKi9cbiAgTlVNX09ORTogOTcsXG4gIC8qKlxuICAgKiBOVU1fVFdPXG4gICAqL1xuICBOVU1fVFdPOiA5OCxcbiAgLyoqXG4gICAqIE5VTV9USFJFRVxuICAgKi9cbiAgTlVNX1RIUkVFOiA5OSxcbiAgLyoqXG4gICAqIE5VTV9GT1VSXG4gICAqL1xuICBOVU1fRk9VUjogMTAwLFxuICAvKipcbiAgICogTlVNX0ZJVkVcbiAgICovXG4gIE5VTV9GSVZFOiAxMDEsXG4gIC8qKlxuICAgKiBOVU1fU0lYXG4gICAqL1xuICBOVU1fU0lYOiAxMDIsXG4gIC8qKlxuICAgKiBOVU1fU0VWRU5cbiAgICovXG4gIE5VTV9TRVZFTjogMTAzLFxuICAvKipcbiAgICogTlVNX0VJR0hUXG4gICAqL1xuICBOVU1fRUlHSFQ6IDEwNCxcbiAgLyoqXG4gICAqIE5VTV9OSU5FXG4gICAqL1xuICBOVU1fTklORTogMTA1LFxuICAvKipcbiAgICogTlVNX01VTFRJUExZXG4gICAqL1xuICBOVU1fTVVMVElQTFk6IDEwNixcbiAgLyoqXG4gICAqIE5VTV9QTFVTXG4gICAqL1xuICBOVU1fUExVUzogMTA3LFxuICAvKipcbiAgICogTlVNX01JTlVTXG4gICAqL1xuICBOVU1fTUlOVVM6IDEwOSxcbiAgLyoqXG4gICAqIE5VTV9QRVJJT0RcbiAgICovXG4gIE5VTV9QRVJJT0Q6IDExMCxcbiAgLyoqXG4gICAqIE5VTV9ESVZJU0lPTlxuICAgKi9cbiAgTlVNX0RJVklTSU9OOiAxMTEsXG4gIC8qKlxuICAgKiBGMVxuICAgKi9cbiAgRjE6IDExMixcbiAgLyoqXG4gICAqIEYyXG4gICAqL1xuICBGMjogMTEzLFxuICAvKipcbiAgICogRjNcbiAgICovXG4gIEYzOiAxMTQsXG4gIC8qKlxuICAgKiBGNFxuICAgKi9cbiAgRjQ6IDExNSxcbiAgLyoqXG4gICAqIEY1XG4gICAqL1xuICBGNTogMTE2LFxuICAvKipcbiAgICogRjZcbiAgICovXG4gIEY2OiAxMTcsXG4gIC8qKlxuICAgKiBGN1xuICAgKi9cbiAgRjc6IDExOCxcbiAgLyoqXG4gICAqIEY4XG4gICAqL1xuICBGODogMTE5LFxuICAvKipcbiAgICogRjlcbiAgICovXG4gIEY5OiAxMjAsXG4gIC8qKlxuICAgKiBGMTBcbiAgICovXG4gIEYxMDogMTIxLFxuICAvKipcbiAgICogRjExXG4gICAqL1xuICBGMTE6IDEyMixcbiAgLyoqXG4gICAqIEYxMlxuICAgKi9cbiAgRjEyOiAxMjMsXG4gIC8qKlxuICAgKiBOVU1MT0NLXG4gICAqL1xuICBOVU1MT0NLOiAxNDQsXG4gIC8qKlxuICAgKiBTRU1JQ09MT05cbiAgICovXG4gIFNFTUlDT0xPTjogMTg2LFxuICAvLyBuZWVkcyBsb2NhbGl6YXRpb25cbiAgLyoqXG4gICAqIERBU0hcbiAgICovXG4gIERBU0g6IDE4OSxcbiAgLy8gbmVlZHMgbG9jYWxpemF0aW9uXG4gIC8qKlxuICAgKiBFUVVBTFNcbiAgICovXG4gIEVRVUFMUzogMTg3LFxuICAvLyBuZWVkcyBsb2NhbGl6YXRpb25cbiAgLyoqXG4gICAqIENPTU1BXG4gICAqL1xuICBDT01NQTogMTg4LFxuICAvLyBuZWVkcyBsb2NhbGl6YXRpb25cbiAgLyoqXG4gICAqIFBFUklPRFxuICAgKi9cbiAgUEVSSU9EOiAxOTAsXG4gIC8vIG5lZWRzIGxvY2FsaXphdGlvblxuICAvKipcbiAgICogU0xBU0hcbiAgICovXG4gIFNMQVNIOiAxOTEsXG4gIC8vIG5lZWRzIGxvY2FsaXphdGlvblxuICAvKipcbiAgICogQVBPU1RST1BIRVxuICAgKi9cbiAgQVBPU1RST1BIRTogMTkyLFxuICAvLyBuZWVkcyBsb2NhbGl6YXRpb25cbiAgLyoqXG4gICAqIFNJTkdMRV9RVU9URVxuICAgKi9cbiAgU0lOR0xFX1FVT1RFOiAyMjIsXG4gIC8vIG5lZWRzIGxvY2FsaXphdGlvblxuICAvKipcbiAgICogT1BFTl9TUVVBUkVfQlJBQ0tFVFxuICAgKi9cbiAgT1BFTl9TUVVBUkVfQlJBQ0tFVDogMjE5LFxuICAvLyBuZWVkcyBsb2NhbGl6YXRpb25cbiAgLyoqXG4gICAqIEJBQ0tTTEFTSFxuICAgKi9cbiAgQkFDS1NMQVNIOiAyMjAsXG4gIC8vIG5lZWRzIGxvY2FsaXphdGlvblxuICAvKipcbiAgICogQ0xPU0VfU1FVQVJFX0JSQUNLRVRcbiAgICovXG4gIENMT1NFX1NRVUFSRV9CUkFDS0VUOiAyMjEsXG4gIC8vIG5lZWRzIGxvY2FsaXphdGlvblxuICAvKipcbiAgICogV0lOX0tFWVxuICAgKi9cbiAgV0lOX0tFWTogMjI0LFxuICAvKipcbiAgICogTUFDX0ZGX01FVEFcbiAgICovXG4gIE1BQ19GRl9NRVRBOiAyMjQsXG4gIC8vIEZpcmVmb3ggKEdlY2tvKSBmaXJlcyB0aGlzIGZvciB0aGUgbWV0YSBrZXkgaW5zdGVhZCBvZiA5MVxuICAvKipcbiAgICogV0lOX0lNRVxuICAgKi9cbiAgV0lOX0lNRTogMjI5LFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gRnVuY3Rpb24gPT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8qKlxuICAgKiB3aGV0aGVyIHRleHQgYW5kIG1vZGlmaWVkIGtleSBpcyBlbnRlcmVkIGF0IHRoZSBzYW1lIHRpbWUuXG4gICAqL1xuICBpc1RleHRNb2RpZnlpbmdLZXlFdmVudDogZnVuY3Rpb24gaXNUZXh0TW9kaWZ5aW5nS2V5RXZlbnQoZSkge1xuICAgIHZhciBrZXlDb2RlID0gZS5rZXlDb2RlO1xuICAgIGlmIChlLmFsdEtleSAmJiAhZS5jdHJsS2V5IHx8IGUubWV0YUtleSB8fFxuICAgIC8vIEZ1bmN0aW9uIGtleXMgZG9uJ3QgZ2VuZXJhdGUgdGV4dFxuICAgIGtleUNvZGUgPj0gS2V5Q29kZS5GMSAmJiBrZXlDb2RlIDw9IEtleUNvZGUuRjEyKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBrZXlzIGFyZSBxdWl0ZSBoYXJtbGVzcywgZXZlbiBpbiBjb21iaW5hdGlvbiB3aXRoXG4gICAgLy8gQ1RSTCwgQUxUIG9yIFNISUZULlxuICAgIHN3aXRjaCAoa2V5Q29kZSkge1xuICAgICAgY2FzZSBLZXlDb2RlLkFMVDpcbiAgICAgIGNhc2UgS2V5Q29kZS5DQVBTX0xPQ0s6XG4gICAgICBjYXNlIEtleUNvZGUuQ09OVEVYVF9NRU5VOlxuICAgICAgY2FzZSBLZXlDb2RlLkNUUkw6XG4gICAgICBjYXNlIEtleUNvZGUuRE9XTjpcbiAgICAgIGNhc2UgS2V5Q29kZS5FTkQ6XG4gICAgICBjYXNlIEtleUNvZGUuRVNDOlxuICAgICAgY2FzZSBLZXlDb2RlLkhPTUU6XG4gICAgICBjYXNlIEtleUNvZGUuSU5TRVJUOlxuICAgICAgY2FzZSBLZXlDb2RlLkxFRlQ6XG4gICAgICBjYXNlIEtleUNvZGUuTUFDX0ZGX01FVEE6XG4gICAgICBjYXNlIEtleUNvZGUuTUVUQTpcbiAgICAgIGNhc2UgS2V5Q29kZS5OVU1MT0NLOlxuICAgICAgY2FzZSBLZXlDb2RlLk5VTV9DRU5URVI6XG4gICAgICBjYXNlIEtleUNvZGUuUEFHRV9ET1dOOlxuICAgICAgY2FzZSBLZXlDb2RlLlBBR0VfVVA6XG4gICAgICBjYXNlIEtleUNvZGUuUEFVU0U6XG4gICAgICBjYXNlIEtleUNvZGUuUFJJTlRfU0NSRUVOOlxuICAgICAgY2FzZSBLZXlDb2RlLlJJR0hUOlxuICAgICAgY2FzZSBLZXlDb2RlLlNISUZUOlxuICAgICAgY2FzZSBLZXlDb2RlLlVQOlxuICAgICAgY2FzZSBLZXlDb2RlLldJTl9LRVk6XG4gICAgICBjYXNlIEtleUNvZGUuV0lOX0tFWV9SSUdIVDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogd2hldGhlciBjaGFyYWN0ZXIgaXMgZW50ZXJlZC5cbiAgICovXG4gIGlzQ2hhcmFjdGVyS2V5OiBmdW5jdGlvbiBpc0NoYXJhY3RlcktleShrZXlDb2RlKSB7XG4gICAgaWYgKGtleUNvZGUgPj0gS2V5Q29kZS5aRVJPICYmIGtleUNvZGUgPD0gS2V5Q29kZS5OSU5FKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGtleUNvZGUgPj0gS2V5Q29kZS5OVU1fWkVSTyAmJiBrZXlDb2RlIDw9IEtleUNvZGUuTlVNX01VTFRJUExZKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGtleUNvZGUgPj0gS2V5Q29kZS5BICYmIGtleUNvZGUgPD0gS2V5Q29kZS5aKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBTYWZhcmkgc2VuZHMgemVybyBrZXkgY29kZSBmb3Igbm9uLWxhdGluIGNoYXJhY3RlcnMuXG4gICAgaWYgKHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ1dlYktpdCcpICE9PSAtMSAmJiBrZXlDb2RlID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgc3dpdGNoIChrZXlDb2RlKSB7XG4gICAgICBjYXNlIEtleUNvZGUuU1BBQ0U6XG4gICAgICBjYXNlIEtleUNvZGUuUVVFU1RJT05fTUFSSzpcbiAgICAgIGNhc2UgS2V5Q29kZS5OVU1fUExVUzpcbiAgICAgIGNhc2UgS2V5Q29kZS5OVU1fTUlOVVM6XG4gICAgICBjYXNlIEtleUNvZGUuTlVNX1BFUklPRDpcbiAgICAgIGNhc2UgS2V5Q29kZS5OVU1fRElWSVNJT046XG4gICAgICBjYXNlIEtleUNvZGUuU0VNSUNPTE9OOlxuICAgICAgY2FzZSBLZXlDb2RlLkRBU0g6XG4gICAgICBjYXNlIEtleUNvZGUuRVFVQUxTOlxuICAgICAgY2FzZSBLZXlDb2RlLkNPTU1BOlxuICAgICAgY2FzZSBLZXlDb2RlLlBFUklPRDpcbiAgICAgIGNhc2UgS2V5Q29kZS5TTEFTSDpcbiAgICAgIGNhc2UgS2V5Q29kZS5BUE9TVFJPUEhFOlxuICAgICAgY2FzZSBLZXlDb2RlLlNJTkdMRV9RVU9URTpcbiAgICAgIGNhc2UgS2V5Q29kZS5PUEVOX1NRVUFSRV9CUkFDS0VUOlxuICAgICAgY2FzZSBLZXlDb2RlLkJBQ0tTTEFTSDpcbiAgICAgIGNhc2UgS2V5Q29kZS5DTE9TRV9TUVVBUkVfQlJBQ0tFVDpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgS2V5Q29kZTsiLCIvKipcbiAqIEJhc2VTZWxlY3QgcHJvdmlkZSBzb21lIHBhcnNlZCBkYXRhIGludG8gY29udGV4dC5cbiAqIFlvdSBjYW4gdXNlIHRoaXMgaG9va3MgdG8gZ2V0IHRoZW0uXG4gKi9cblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IHZhciBCYXNlU2VsZWN0Q29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlQmFzZVByb3BzKCkge1xuICByZXR1cm4gUmVhY3QudXNlQ29udGV4dChCYXNlU2VsZWN0Q29udGV4dCk7XG59IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbi8qKlxuICogU2ltaWxhciB3aXRoIGB1c2VMb2NrYCwgYnV0IHRoaXMgaG9vayB3aWxsIGFsd2F5cyBleGVjdXRlIGxhc3QgdmFsdWUuXG4gKiBXaGVuIHNldCB0byBgdHJ1ZWAsIGl0IHdpbGwga2VlcCBgdHJ1ZWAgZm9yIGEgc2hvcnQgdGltZSBldmVuIGlmIGBmYWxzZWAgaXMgc2V0LlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VEZWxheVJlc2V0KCkge1xuICB2YXIgdGltZW91dCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMTA7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShmYWxzZSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgYm9vbCA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0Qm9vbCA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBkZWxheVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIGNhbmNlbExhdGVzdCA9IGZ1bmN0aW9uIGNhbmNlbExhdGVzdCgpIHtcbiAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KGRlbGF5UmVmLmN1cnJlbnQpO1xuICB9O1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjYW5jZWxMYXRlc3Q7XG4gIH0sIFtdKTtcbiAgdmFyIGRlbGF5U2V0Qm9vbCA9IGZ1bmN0aW9uIGRlbGF5U2V0Qm9vbCh2YWx1ZSwgY2FsbGJhY2spIHtcbiAgICBjYW5jZWxMYXRlc3QoKTtcbiAgICBkZWxheVJlZi5jdXJyZW50ID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgc2V0Qm9vbCh2YWx1ZSk7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9LCB0aW1lb3V0KTtcbiAgfTtcbiAgcmV0dXJuIFtib29sLCBkZWxheVNldEJvb2wsIGNhbmNlbExhdGVzdF07XG59IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG4vKipcbiAqIExvY2tlciByZXR1cm4gY2FjaGVkIG1hcmsuXG4gKiBJZiBzZXQgdG8gYHRydWVgLCB3aWxsIHJldHVybiBgdHJ1ZWAgaW4gYSBzaG9ydCB0aW1lIGV2ZW4gaWYgc2V0IGBmYWxzZWAuXG4gKiBJZiBzZXQgdG8gYGZhbHNlYCBhbmQgdGhlbiBzZXQgdG8gYHRydWVgLCB3aWxsIGNoYW5nZSB0byBgdHJ1ZWAuXG4gKiBBbmQgYWZ0ZXIgdGltZSBkdXJhdGlvbiwgaXQgd2lsbCBiYWNrIHRvIGBudWxsYCBhdXRvbWF0aWNhbGx5LlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VMb2NrKCkge1xuICB2YXIgZHVyYXRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IDI1MDtcbiAgdmFyIGxvY2tSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciB0aW1lb3V0UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuXG4gIC8vIENsZWFuIHVwXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZW91dFJlZi5jdXJyZW50KTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIGZ1bmN0aW9uIGRvTG9jayhsb2NrZWQpIHtcbiAgICBpZiAobG9ja2VkIHx8IGxvY2tSZWYuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgbG9ja1JlZi5jdXJyZW50ID0gbG9ja2VkO1xuICAgIH1cbiAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgdGltZW91dFJlZi5jdXJyZW50ID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgbG9ja1JlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB9LCBkdXJhdGlvbik7XG4gIH1cbiAgcmV0dXJuIFtmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGxvY2tSZWYuY3VycmVudDtcbiAgfSwgZG9Mb2NrXTtcbn0iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VTZWxlY3RUcmlnZ2VyQ29udHJvbChlbGVtZW50cywgb3BlbiwgdHJpZ2dlck9wZW4sIGN1c3RvbWl6ZWRUcmlnZ2VyKSB7XG4gIHZhciBwcm9wc1JlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgcHJvcHNSZWYuY3VycmVudCA9IHtcbiAgICBvcGVuOiBvcGVuLFxuICAgIHRyaWdnZXJPcGVuOiB0cmlnZ2VyT3BlbixcbiAgICBjdXN0b21pemVkVHJpZ2dlcjogY3VzdG9taXplZFRyaWdnZXJcbiAgfTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBvbkdsb2JhbE1vdXNlRG93bihldmVudCkge1xuICAgICAgdmFyIF9wcm9wc1JlZiRjdXJyZW50O1xuICAgICAgLy8gSWYgdHJpZ2dlciBpcyBjdXN0b21pemVkLCBUcmlnZ2VyIHdpbGwgdGFrZSBjb250cm9sIG9mIHBvcHVwVmlzaWJsZVxuICAgICAgaWYgKChfcHJvcHNSZWYkY3VycmVudCA9IHByb3BzUmVmLmN1cnJlbnQpICE9PSBudWxsICYmIF9wcm9wc1JlZiRjdXJyZW50ICE9PSB2b2lkIDAgJiYgX3Byb3BzUmVmJGN1cnJlbnQuY3VzdG9taXplZFRyaWdnZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgIGlmICh0YXJnZXQuc2hhZG93Um9vdCAmJiBldmVudC5jb21wb3NlZCkge1xuICAgICAgICB0YXJnZXQgPSBldmVudC5jb21wb3NlZFBhdGgoKVswXSB8fCB0YXJnZXQ7XG4gICAgICB9XG4gICAgICBpZiAocHJvcHNSZWYuY3VycmVudC5vcGVuICYmIGVsZW1lbnRzKCkuZmlsdGVyKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgfSkuZXZlcnkoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuICFlbGVtZW50LmNvbnRhaW5zKHRhcmdldCkgJiYgZWxlbWVudCAhPT0gdGFyZ2V0O1xuICAgICAgfSkpIHtcbiAgICAgICAgLy8gU2hvdWxkIHRyaWdnZXIgY2xvc2VcbiAgICAgICAgcHJvcHNSZWYuY3VycmVudC50cmlnZ2VyT3BlbihmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbkdsb2JhbE1vdXNlRG93bik7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgb25HbG9iYWxNb3VzZURvd24pO1xuICAgIH07XG4gIH0sIFtdKTtcbn0iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xudmFyIGF0dHJpYnV0ZXMgPSBcImFjY2VwdCBhY2NlcHRDaGFyc2V0IGFjY2Vzc0tleSBhY3Rpb24gYWxsb3dGdWxsU2NyZWVuIGFsbG93VHJhbnNwYXJlbmN5XFxuICAgIGFsdCBhc3luYyBhdXRvQ29tcGxldGUgYXV0b0ZvY3VzIGF1dG9QbGF5IGNhcHR1cmUgY2VsbFBhZGRpbmcgY2VsbFNwYWNpbmcgY2hhbGxlbmdlXFxuICAgIGNoYXJTZXQgY2hlY2tlZCBjbGFzc0lEIGNsYXNzTmFtZSBjb2xTcGFuIGNvbHMgY29udGVudCBjb250ZW50RWRpdGFibGUgY29udGV4dE1lbnVcXG4gICAgY29udHJvbHMgY29vcmRzIGNyb3NzT3JpZ2luIGRhdGEgZGF0ZVRpbWUgZGVmYXVsdCBkZWZlciBkaXIgZGlzYWJsZWQgZG93bmxvYWQgZHJhZ2dhYmxlXFxuICAgIGVuY1R5cGUgZm9ybSBmb3JtQWN0aW9uIGZvcm1FbmNUeXBlIGZvcm1NZXRob2QgZm9ybU5vVmFsaWRhdGUgZm9ybVRhcmdldCBmcmFtZUJvcmRlclxcbiAgICBoZWFkZXJzIGhlaWdodCBoaWRkZW4gaGlnaCBocmVmIGhyZWZMYW5nIGh0bWxGb3IgaHR0cEVxdWl2IGljb24gaWQgaW5wdXRNb2RlIGludGVncml0eVxcbiAgICBpcyBrZXlQYXJhbXMga2V5VHlwZSBraW5kIGxhYmVsIGxhbmcgbGlzdCBsb29wIGxvdyBtYW5pZmVzdCBtYXJnaW5IZWlnaHQgbWFyZ2luV2lkdGggbWF4IG1heExlbmd0aCBtZWRpYVxcbiAgICBtZWRpYUdyb3VwIG1ldGhvZCBtaW4gbWluTGVuZ3RoIG11bHRpcGxlIG11dGVkIG5hbWUgbm9WYWxpZGF0ZSBub25jZSBvcGVuXFxuICAgIG9wdGltdW0gcGF0dGVybiBwbGFjZWhvbGRlciBwb3N0ZXIgcHJlbG9hZCByYWRpb0dyb3VwIHJlYWRPbmx5IHJlbCByZXF1aXJlZFxcbiAgICByZXZlcnNlZCByb2xlIHJvd1NwYW4gcm93cyBzYW5kYm94IHNjb3BlIHNjb3BlZCBzY3JvbGxpbmcgc2VhbWxlc3Mgc2VsZWN0ZWRcXG4gICAgc2hhcGUgc2l6ZSBzaXplcyBzcGFuIHNwZWxsQ2hlY2sgc3JjIHNyY0RvYyBzcmNMYW5nIHNyY1NldCBzdGFydCBzdGVwIHN0eWxlXFxuICAgIHN1bW1hcnkgdGFiSW5kZXggdGFyZ2V0IHRpdGxlIHR5cGUgdXNlTWFwIHZhbHVlIHdpZHRoIHdtb2RlIHdyYXBcIjtcbnZhciBldmVudHNOYW1lID0gXCJvbkNvcHkgb25DdXQgb25QYXN0ZSBvbkNvbXBvc2l0aW9uRW5kIG9uQ29tcG9zaXRpb25TdGFydCBvbkNvbXBvc2l0aW9uVXBkYXRlIG9uS2V5RG93blxcbiAgICBvbktleVByZXNzIG9uS2V5VXAgb25Gb2N1cyBvbkJsdXIgb25DaGFuZ2Ugb25JbnB1dCBvblN1Ym1pdCBvbkNsaWNrIG9uQ29udGV4dE1lbnUgb25Eb3VibGVDbGlja1xcbiAgICBvbkRyYWcgb25EcmFnRW5kIG9uRHJhZ0VudGVyIG9uRHJhZ0V4aXQgb25EcmFnTGVhdmUgb25EcmFnT3ZlciBvbkRyYWdTdGFydCBvbkRyb3Agb25Nb3VzZURvd25cXG4gICAgb25Nb3VzZUVudGVyIG9uTW91c2VMZWF2ZSBvbk1vdXNlTW92ZSBvbk1vdXNlT3V0IG9uTW91c2VPdmVyIG9uTW91c2VVcCBvblNlbGVjdCBvblRvdWNoQ2FuY2VsXFxuICAgIG9uVG91Y2hFbmQgb25Ub3VjaE1vdmUgb25Ub3VjaFN0YXJ0IG9uU2Nyb2xsIG9uV2hlZWwgb25BYm9ydCBvbkNhblBsYXkgb25DYW5QbGF5VGhyb3VnaFxcbiAgICBvbkR1cmF0aW9uQ2hhbmdlIG9uRW1wdGllZCBvbkVuY3J5cHRlZCBvbkVuZGVkIG9uRXJyb3Igb25Mb2FkZWREYXRhIG9uTG9hZGVkTWV0YWRhdGFcXG4gICAgb25Mb2FkU3RhcnQgb25QYXVzZSBvblBsYXkgb25QbGF5aW5nIG9uUHJvZ3Jlc3Mgb25SYXRlQ2hhbmdlIG9uU2Vla2VkIG9uU2Vla2luZyBvblN0YWxsZWQgb25TdXNwZW5kIG9uVGltZVVwZGF0ZSBvblZvbHVtZUNoYW5nZSBvbldhaXRpbmcgb25Mb2FkIG9uRXJyb3JcIjtcbnZhciBwcm9wTGlzdCA9IFwiXCIuY29uY2F0KGF0dHJpYnV0ZXMsIFwiIFwiKS5jb25jYXQoZXZlbnRzTmFtZSkuc3BsaXQoL1tcXHNcXG5dKy8pO1xuXG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4gKi9cbnZhciBhcmlhUHJlZml4ID0gJ2FyaWEtJztcbnZhciBkYXRhUHJlZml4ID0gJ2RhdGEtJztcbmZ1bmN0aW9uIG1hdGNoKGtleSwgcHJlZml4KSB7XG4gIHJldHVybiBrZXkuaW5kZXhPZihwcmVmaXgpID09PSAwO1xufVxuLyoqXG4gKiBQaWNrZXIgcHJvcHMgZnJvbSBleGlzdCBwcm9wcyB3aXRoIGZpbHRlclxuICogQHBhcmFtIHByb3BzIFBhc3NlZCBwcm9wc1xuICogQHBhcmFtIGFyaWFPbmx5IGJvb2xlYW4gfCB7IGFyaWE/OiBib29sZWFuOyBkYXRhPzogYm9vbGVhbjsgYXR0cj86IGJvb2xlYW47IH0gZmlsdGVyIGNvbmZpZ1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwaWNrQXR0cnMocHJvcHMpIHtcbiAgdmFyIGFyaWFPbmx5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgdmFyIG1lcmdlZENvbmZpZztcbiAgaWYgKGFyaWFPbmx5ID09PSBmYWxzZSkge1xuICAgIG1lcmdlZENvbmZpZyA9IHtcbiAgICAgIGFyaWE6IHRydWUsXG4gICAgICBkYXRhOiB0cnVlLFxuICAgICAgYXR0cjogdHJ1ZVxuICAgIH07XG4gIH0gZWxzZSBpZiAoYXJpYU9ubHkgPT09IHRydWUpIHtcbiAgICBtZXJnZWRDb25maWcgPSB7XG4gICAgICBhcmlhOiB0cnVlXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBtZXJnZWRDb25maWcgPSBfb2JqZWN0U3ByZWFkKHt9LCBhcmlhT25seSk7XG4gIH1cbiAgdmFyIGF0dHJzID0ge307XG4gIE9iamVjdC5rZXlzKHByb3BzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoXG4gICAgLy8gQXJpYVxuICAgIG1lcmdlZENvbmZpZy5hcmlhICYmIChrZXkgPT09ICdyb2xlJyB8fCBtYXRjaChrZXksIGFyaWFQcmVmaXgpKSB8fFxuICAgIC8vIERhdGFcbiAgICBtZXJnZWRDb25maWcuZGF0YSAmJiBtYXRjaChrZXksIGRhdGFQcmVmaXgpIHx8XG4gICAgLy8gQXR0clxuICAgIG1lcmdlZENvbmZpZy5hdHRyICYmIHByb3BMaXN0LmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIGF0dHJzW2tleV0gPSBwcm9wc1trZXldO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBhdHRycztcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcInByZWZpeENsc1wiLCBcImludmFsaWRhdGVcIiwgXCJpdGVtXCIsIFwicmVuZGVySXRlbVwiLCBcInJlc3BvbnNpdmVcIiwgXCJyZXNwb25zaXZlRGlzYWJsZWRcIiwgXCJyZWdpc3RlclNpemVcIiwgXCJpdGVtS2V5XCIsIFwiY2xhc3NOYW1lXCIsIFwic3R5bGVcIiwgXCJjaGlsZHJlblwiLCBcImRpc3BsYXlcIiwgXCJvcmRlclwiLCBcImNvbXBvbmVudFwiXTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJlc2l6ZU9ic2VydmVyIGZyb20gJ3JjLXJlc2l6ZS1vYnNlcnZlcic7XG4vLyBVc2Ugc2hhcmVkIHZhcmlhYmxlIHRvIHNhdmUgYnVuZGxlIHNpemVcbnZhciBVTkRFRklORUQgPSB1bmRlZmluZWQ7XG5mdW5jdGlvbiBJbnRlcm5hbEl0ZW0ocHJvcHMsIHJlZikge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGludmFsaWRhdGUgPSBwcm9wcy5pbnZhbGlkYXRlLFxuICAgIGl0ZW0gPSBwcm9wcy5pdGVtLFxuICAgIHJlbmRlckl0ZW0gPSBwcm9wcy5yZW5kZXJJdGVtLFxuICAgIHJlc3BvbnNpdmUgPSBwcm9wcy5yZXNwb25zaXZlLFxuICAgIHJlc3BvbnNpdmVEaXNhYmxlZCA9IHByb3BzLnJlc3BvbnNpdmVEaXNhYmxlZCxcbiAgICByZWdpc3RlclNpemUgPSBwcm9wcy5yZWdpc3RlclNpemUsXG4gICAgaXRlbUtleSA9IHByb3BzLml0ZW1LZXksXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBkaXNwbGF5ID0gcHJvcHMuZGlzcGxheSxcbiAgICBvcmRlciA9IHByb3BzLm9yZGVyLFxuICAgIF9wcm9wcyRjb21wb25lbnQgPSBwcm9wcy5jb21wb25lbnQsXG4gICAgQ29tcG9uZW50ID0gX3Byb3BzJGNvbXBvbmVudCA9PT0gdm9pZCAwID8gJ2RpdicgOiBfcHJvcHMkY29tcG9uZW50LFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgdmFyIG1lcmdlZEhpZGRlbiA9IHJlc3BvbnNpdmUgJiYgIWRpc3BsYXk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEVmZmVjdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBmdW5jdGlvbiBpbnRlcm5hbFJlZ2lzdGVyU2l6ZSh3aWR0aCkge1xuICAgIHJlZ2lzdGVyU2l6ZShpdGVtS2V5LCB3aWR0aCk7XG4gIH1cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgaW50ZXJuYWxSZWdpc3RlclNpemUobnVsbCk7XG4gICAgfTtcbiAgfSwgW10pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGNoaWxkTm9kZSA9IHJlbmRlckl0ZW0gJiYgaXRlbSAhPT0gVU5ERUZJTkVEID8gcmVuZGVySXRlbShpdGVtKSA6IGNoaWxkcmVuO1xuICB2YXIgb3ZlcmZsb3dTdHlsZTtcbiAgaWYgKCFpbnZhbGlkYXRlKSB7XG4gICAgb3ZlcmZsb3dTdHlsZSA9IHtcbiAgICAgIG9wYWNpdHk6IG1lcmdlZEhpZGRlbiA/IDAgOiAxLFxuICAgICAgaGVpZ2h0OiBtZXJnZWRIaWRkZW4gPyAwIDogVU5ERUZJTkVELFxuICAgICAgb3ZlcmZsb3dZOiBtZXJnZWRIaWRkZW4gPyAnaGlkZGVuJyA6IFVOREVGSU5FRCxcbiAgICAgIG9yZGVyOiByZXNwb25zaXZlID8gb3JkZXIgOiBVTkRFRklORUQsXG4gICAgICBwb2ludGVyRXZlbnRzOiBtZXJnZWRIaWRkZW4gPyAnbm9uZScgOiBVTkRFRklORUQsXG4gICAgICBwb3NpdGlvbjogbWVyZ2VkSGlkZGVuID8gJ2Fic29sdXRlJyA6IFVOREVGSU5FRFxuICAgIH07XG4gIH1cbiAgdmFyIG92ZXJmbG93UHJvcHMgPSB7fTtcbiAgaWYgKG1lcmdlZEhpZGRlbikge1xuICAgIG92ZXJmbG93UHJvcHNbJ2FyaWEtaGlkZGVuJ10gPSB0cnVlO1xuICB9XG4gIHZhciBpdGVtTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyghaW52YWxpZGF0ZSAmJiBwcmVmaXhDbHMsIGNsYXNzTmFtZSksXG4gICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb3ZlcmZsb3dTdHlsZSksIHN0eWxlKVxuICB9LCBvdmVyZmxvd1Byb3BzLCByZXN0UHJvcHMsIHtcbiAgICByZWY6IHJlZlxuICB9KSwgY2hpbGROb2RlKTtcbiAgaWYgKHJlc3BvbnNpdmUpIHtcbiAgICBpdGVtTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlc2l6ZU9ic2VydmVyLCB7XG4gICAgICBvblJlc2l6ZTogZnVuY3Rpb24gb25SZXNpemUoX3JlZikge1xuICAgICAgICB2YXIgb2Zmc2V0V2lkdGggPSBfcmVmLm9mZnNldFdpZHRoO1xuICAgICAgICBpbnRlcm5hbFJlZ2lzdGVyU2l6ZShvZmZzZXRXaWR0aCk7XG4gICAgICB9LFxuICAgICAgZGlzYWJsZWQ6IHJlc3BvbnNpdmVEaXNhYmxlZFxuICAgIH0sIGl0ZW1Ob2RlKTtcbiAgfVxuICByZXR1cm4gaXRlbU5vZGU7XG59XG52YXIgSXRlbSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEludGVybmFsSXRlbSk7XG5JdGVtLmRpc3BsYXlOYW1lID0gJ0l0ZW0nO1xuZXhwb3J0IGRlZmF1bHQgSXRlbTsiLCJpbXBvcnQgcmFmIGZyb20gXCJyYy11dGlsL2VzL3JhZlwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2hhbm5lbFVwZGF0ZShjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIE1lc3NhZ2VDaGFubmVsID09PSAndW5kZWZpbmVkJykge1xuICAgIHJhZihjYWxsYmFjayk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH07XG4gICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZSh1bmRlZmluZWQpO1xuICB9XG59IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgdXNlRXZlbnQgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlRXZlbnRcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzIH0gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCBjaGFubmVsVXBkYXRlIGZyb20gJy4vY2hhbm5lbFVwZGF0ZSc7XG4vKipcbiAqIEJhdGNoZXIgZm9yIHJlY29yZCBhbnkgYHVzZUVmZmVjdFN0YXRlYCBuZWVkIHVwZGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUJhdGNoZXIoKSB7XG4gIC8vIFVwZGF0ZXIgVHJpZ2dlclxuICB2YXIgdXBkYXRlRnVuY1JlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgLy8gTm90aWZ5IHVwZGF0ZVxuICB2YXIgbm90aWZ5RWZmZWN0VXBkYXRlID0gZnVuY3Rpb24gbm90aWZ5RWZmZWN0VXBkYXRlKGNhbGxiYWNrKSB7XG4gICAgaWYgKCF1cGRhdGVGdW5jUmVmLmN1cnJlbnQpIHtcbiAgICAgIHVwZGF0ZUZ1bmNSZWYuY3VycmVudCA9IFtdO1xuICAgICAgY2hhbm5lbFVwZGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB1cGRhdGVGdW5jUmVmLmN1cnJlbnQuZm9yRWFjaChmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICAgIGZuKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdXBkYXRlRnVuY1JlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdXBkYXRlRnVuY1JlZi5jdXJyZW50LnB1c2goY2FsbGJhY2spO1xuICB9O1xuICByZXR1cm4gbm90aWZ5RWZmZWN0VXBkYXRlO1xufVxuLyoqXG4gKiBUcmlnZ2VyIHN0YXRlIHVwZGF0ZSBieSBgdXNlTGF5b3V0RWZmZWN0YCB0byBzYXZlIHBlcmYuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUVmZmVjdFN0YXRlKG5vdGlmeUVmZmVjdFVwZGF0ZSwgZGVmYXVsdFZhbHVlKSB7XG4gIC8vIFZhbHVlXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShkZWZhdWx0VmFsdWUpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIHN0YXRlVmFsdWUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldFN0YXRlVmFsdWUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICAvLyBTZXQgU3RhdGVcbiAgdmFyIHNldEVmZmVjdFZhbCA9IHVzZUV2ZW50KGZ1bmN0aW9uIChuZXh0VmFsdWUpIHtcbiAgICBub3RpZnlFZmZlY3RVcGRhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgc2V0U3RhdGVWYWx1ZShuZXh0VmFsdWUpO1xuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIFtzdGF0ZVZhbHVlLCBzZXRFZmZlY3RWYWxdO1xufSIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgdmFyIE92ZXJmbG93Q29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJjb21wb25lbnRcIl0sXG4gIF9leGNsdWRlZDIgPSBbXCJjbGFzc05hbWVcIl0sXG4gIF9leGNsdWRlZDMgPSBbXCJjbGFzc05hbWVcIl07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBJdGVtIGZyb20gJy4vSXRlbSc7XG5pbXBvcnQgeyBPdmVyZmxvd0NvbnRleHQgfSBmcm9tICcuL2NvbnRleHQnO1xudmFyIEludGVybmFsUmF3SXRlbSA9IGZ1bmN0aW9uIEludGVybmFsUmF3SXRlbShwcm9wcywgcmVmKSB7XG4gIHZhciBjb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChPdmVyZmxvd0NvbnRleHQpO1xuICAvLyBSZW5kZXIgZGlyZWN0bHkgd2hlbiBjb250ZXh0IG5vdCBwcm92aWRlZFxuICBpZiAoIWNvbnRleHQpIHtcbiAgICB2YXIgX3Byb3BzJGNvbXBvbmVudCA9IHByb3BzLmNvbXBvbmVudCxcbiAgICAgIENvbXBvbmVudCA9IF9wcm9wcyRjb21wb25lbnQgPT09IHZvaWQgMCA/ICdkaXYnIDogX3Byb3BzJGNvbXBvbmVudCxcbiAgICAgIF9yZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgX2V4dGVuZHMoe30sIF9yZXN0UHJvcHMsIHtcbiAgICAgIHJlZjogcmVmXG4gICAgfSkpO1xuICB9XG4gIHZhciBjb250ZXh0Q2xhc3NOYW1lID0gY29udGV4dC5jbGFzc05hbWUsXG4gICAgcmVzdENvbnRleHQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoY29udGV4dCwgX2V4Y2x1ZGVkMik7XG4gIHZhciBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQzKTtcbiAgLy8gRG8gbm90IHBhc3MgY29udGV4dCB0byBzdWIgaXRlbSB0byBhdm9pZCBtdWx0aXBsZSBtZWFzdXJlXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChPdmVyZmxvd0NvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogbnVsbFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJdGVtLCBfZXh0ZW5kcyh7XG4gICAgcmVmOiByZWYsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNvbnRleHRDbGFzc05hbWUsIGNsYXNzTmFtZSlcbiAgfSwgcmVzdENvbnRleHQsIHJlc3RQcm9wcykpKTtcbn07XG52YXIgUmF3SXRlbSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEludGVybmFsUmF3SXRlbSk7XG5SYXdJdGVtLmRpc3BsYXlOYW1lID0gJ1Jhd0l0ZW0nO1xuZXhwb3J0IGRlZmF1bHQgUmF3SXRlbTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wicHJlZml4Q2xzXCIsIFwiZGF0YVwiLCBcInJlbmRlckl0ZW1cIiwgXCJyZW5kZXJSYXdJdGVtXCIsIFwiaXRlbUtleVwiLCBcIml0ZW1XaWR0aFwiLCBcInNzclwiLCBcInN0eWxlXCIsIFwiY2xhc3NOYW1lXCIsIFwibWF4Q291bnRcIiwgXCJyZW5kZXJSZXN0XCIsIFwicmVuZGVyUmF3UmVzdFwiLCBcInN1ZmZpeFwiLCBcImNvbXBvbmVudFwiLCBcIml0ZW1Db21wb25lbnRcIiwgXCJvblZpc2libGVDaGFuZ2VcIl07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VTdGF0ZSwgdXNlTWVtbywgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBSZXNpemVPYnNlcnZlciBmcm9tICdyYy1yZXNpemUtb2JzZXJ2ZXInO1xuaW1wb3J0IHVzZUxheW91dEVmZmVjdCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCBJdGVtIGZyb20gJy4vSXRlbSc7XG5pbXBvcnQgdXNlRWZmZWN0U3RhdGUsIHsgdXNlQmF0Y2hlciB9IGZyb20gJy4vaG9va3MvdXNlRWZmZWN0U3RhdGUnO1xuaW1wb3J0IFJhd0l0ZW0gZnJvbSAnLi9SYXdJdGVtJztcbmltcG9ydCB7IE92ZXJmbG93Q29udGV4dCB9IGZyb20gJy4vY29udGV4dCc7XG52YXIgUkVTUE9OU0lWRSA9ICdyZXNwb25zaXZlJztcbnZhciBJTlZBTElEQVRFID0gJ2ludmFsaWRhdGUnO1xuZXhwb3J0IHsgT3ZlcmZsb3dDb250ZXh0IH0gZnJvbSAnLi9jb250ZXh0JztcbmZ1bmN0aW9uIGRlZmF1bHRSZW5kZXJSZXN0KG9taXR0ZWRJdGVtcykge1xuICByZXR1cm4gXCIrIFwiLmNvbmNhdChvbWl0dGVkSXRlbXMubGVuZ3RoLCBcIiAuLi5cIik7XG59XG5mdW5jdGlvbiBPdmVyZmxvdyhwcm9wcywgcmVmKSB7XG4gIHZhciBfcHJvcHMkcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHByZWZpeENscyA9IF9wcm9wcyRwcmVmaXhDbHMgPT09IHZvaWQgMCA/ICdyYy1vdmVyZmxvdycgOiBfcHJvcHMkcHJlZml4Q2xzLFxuICAgIF9wcm9wcyRkYXRhID0gcHJvcHMuZGF0YSxcbiAgICBkYXRhID0gX3Byb3BzJGRhdGEgPT09IHZvaWQgMCA/IFtdIDogX3Byb3BzJGRhdGEsXG4gICAgcmVuZGVySXRlbSA9IHByb3BzLnJlbmRlckl0ZW0sXG4gICAgcmVuZGVyUmF3SXRlbSA9IHByb3BzLnJlbmRlclJhd0l0ZW0sXG4gICAgaXRlbUtleSA9IHByb3BzLml0ZW1LZXksXG4gICAgX3Byb3BzJGl0ZW1XaWR0aCA9IHByb3BzLml0ZW1XaWR0aCxcbiAgICBpdGVtV2lkdGggPSBfcHJvcHMkaXRlbVdpZHRoID09PSB2b2lkIDAgPyAxMCA6IF9wcm9wcyRpdGVtV2lkdGgsXG4gICAgc3NyID0gcHJvcHMuc3NyLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIG1heENvdW50ID0gcHJvcHMubWF4Q291bnQsXG4gICAgcmVuZGVyUmVzdCA9IHByb3BzLnJlbmRlclJlc3QsXG4gICAgcmVuZGVyUmF3UmVzdCA9IHByb3BzLnJlbmRlclJhd1Jlc3QsXG4gICAgc3VmZml4ID0gcHJvcHMuc3VmZml4LFxuICAgIF9wcm9wcyRjb21wb25lbnQgPSBwcm9wcy5jb21wb25lbnQsXG4gICAgQ29tcG9uZW50ID0gX3Byb3BzJGNvbXBvbmVudCA9PT0gdm9pZCAwID8gJ2RpdicgOiBfcHJvcHMkY29tcG9uZW50LFxuICAgIGl0ZW1Db21wb25lbnQgPSBwcm9wcy5pdGVtQ29tcG9uZW50LFxuICAgIG9uVmlzaWJsZUNoYW5nZSA9IHByb3BzLm9uVmlzaWJsZUNoYW5nZSxcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG4gIHZhciBmdWxseVNTUiA9IHNzciA9PT0gJ2Z1bGwnO1xuICB2YXIgbm90aWZ5RWZmZWN0VXBkYXRlID0gdXNlQmF0Y2hlcigpO1xuICB2YXIgX3VzZUVmZmVjdFN0YXRlID0gdXNlRWZmZWN0U3RhdGUobm90aWZ5RWZmZWN0VXBkYXRlLCBudWxsKSxcbiAgICBfdXNlRWZmZWN0U3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZUVmZmVjdFN0YXRlLCAyKSxcbiAgICBjb250YWluZXJXaWR0aCA9IF91c2VFZmZlY3RTdGF0ZTJbMF0sXG4gICAgc2V0Q29udGFpbmVyV2lkdGggPSBfdXNlRWZmZWN0U3RhdGUyWzFdO1xuICB2YXIgbWVyZ2VkQ29udGFpbmVyV2lkdGggPSBjb250YWluZXJXaWR0aCB8fCAwO1xuICB2YXIgX3VzZUVmZmVjdFN0YXRlMyA9IHVzZUVmZmVjdFN0YXRlKG5vdGlmeUVmZmVjdFVwZGF0ZSwgbmV3IE1hcCgpKSxcbiAgICBfdXNlRWZmZWN0U3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX3VzZUVmZmVjdFN0YXRlMywgMiksXG4gICAgaXRlbVdpZHRocyA9IF91c2VFZmZlY3RTdGF0ZTRbMF0sXG4gICAgc2V0SXRlbVdpZHRocyA9IF91c2VFZmZlY3RTdGF0ZTRbMV07XG4gIHZhciBfdXNlRWZmZWN0U3RhdGU1ID0gdXNlRWZmZWN0U3RhdGUobm90aWZ5RWZmZWN0VXBkYXRlLCAwKSxcbiAgICBfdXNlRWZmZWN0U3RhdGU2ID0gX3NsaWNlZFRvQXJyYXkoX3VzZUVmZmVjdFN0YXRlNSwgMiksXG4gICAgcHJldlJlc3RXaWR0aCA9IF91c2VFZmZlY3RTdGF0ZTZbMF0sXG4gICAgc2V0UHJldlJlc3RXaWR0aCA9IF91c2VFZmZlY3RTdGF0ZTZbMV07XG4gIHZhciBfdXNlRWZmZWN0U3RhdGU3ID0gdXNlRWZmZWN0U3RhdGUobm90aWZ5RWZmZWN0VXBkYXRlLCAwKSxcbiAgICBfdXNlRWZmZWN0U3RhdGU4ID0gX3NsaWNlZFRvQXJyYXkoX3VzZUVmZmVjdFN0YXRlNywgMiksXG4gICAgcmVzdFdpZHRoID0gX3VzZUVmZmVjdFN0YXRlOFswXSxcbiAgICBzZXRSZXN0V2lkdGggPSBfdXNlRWZmZWN0U3RhdGU4WzFdO1xuICB2YXIgX3VzZUVmZmVjdFN0YXRlOSA9IHVzZUVmZmVjdFN0YXRlKG5vdGlmeUVmZmVjdFVwZGF0ZSwgMCksXG4gICAgX3VzZUVmZmVjdFN0YXRlMTAgPSBfc2xpY2VkVG9BcnJheShfdXNlRWZmZWN0U3RhdGU5LCAyKSxcbiAgICBzdWZmaXhXaWR0aCA9IF91c2VFZmZlY3RTdGF0ZTEwWzBdLFxuICAgIHNldFN1ZmZpeFdpZHRoID0gX3VzZUVmZmVjdFN0YXRlMTBbMV07XG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShudWxsKSxcbiAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICBzdWZmaXhGaXhlZFN0YXJ0ID0gX3VzZVN0YXRlMlswXSxcbiAgICBzZXRTdWZmaXhGaXhlZFN0YXJ0ID0gX3VzZVN0YXRlMlsxXTtcbiAgdmFyIF91c2VTdGF0ZTMgPSB1c2VTdGF0ZShudWxsKSxcbiAgICBfdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlMywgMiksXG4gICAgZGlzcGxheUNvdW50ID0gX3VzZVN0YXRlNFswXSxcbiAgICBzZXREaXNwbGF5Q291bnQgPSBfdXNlU3RhdGU0WzFdO1xuICB2YXIgbWVyZ2VkRGlzcGxheUNvdW50ID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGRpc3BsYXlDb3VudCA9PT0gbnVsbCAmJiBmdWxseVNTUikge1xuICAgICAgcmV0dXJuIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgIH1cbiAgICByZXR1cm4gZGlzcGxheUNvdW50IHx8IDA7XG4gIH0sIFtkaXNwbGF5Q291bnQsIGNvbnRhaW5lcldpZHRoXSk7XG4gIHZhciBfdXNlU3RhdGU1ID0gdXNlU3RhdGUoZmFsc2UpLFxuICAgIF91c2VTdGF0ZTYgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGU1LCAyKSxcbiAgICByZXN0UmVhZHkgPSBfdXNlU3RhdGU2WzBdLFxuICAgIHNldFJlc3RSZWFkeSA9IF91c2VTdGF0ZTZbMV07XG4gIHZhciBpdGVtUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtXCIpO1xuICAvLyBBbHdheXMgdXNlIHRoZSBtYXggd2lkdGggdG8gYXZvaWQgYmxpbmtcbiAgdmFyIG1lcmdlZFJlc3RXaWR0aCA9IE1hdGgubWF4KHByZXZSZXN0V2lkdGgsIHJlc3RXaWR0aCk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBEYXRhID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaXNSZXNwb25zaXZlID0gbWF4Q291bnQgPT09IFJFU1BPTlNJVkU7XG4gIHZhciBzaG91bGRSZXNwb25zaXZlID0gZGF0YS5sZW5ndGggJiYgaXNSZXNwb25zaXZlO1xuICB2YXIgaW52YWxpZGF0ZSA9IG1heENvdW50ID09PSBJTlZBTElEQVRFO1xuICAvKipcbiAgICogV2hlbiBpcyBgcmVzcG9uc2l2ZWAsIHdlIHdpbGwgYWx3YXlzIHJlbmRlciByZXN0IG5vZGUgdG8gZ2V0IHRoZSByZWFsIHdpZHRoIG9mIGl0IGZvciBjYWxjdWxhdGlvblxuICAgKi9cbiAgdmFyIHNob3dSZXN0ID0gc2hvdWxkUmVzcG9uc2l2ZSB8fCB0eXBlb2YgbWF4Q291bnQgPT09ICdudW1iZXInICYmIGRhdGEubGVuZ3RoID4gbWF4Q291bnQ7XG4gIHZhciBtZXJnZWREYXRhID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGl0ZW1zID0gZGF0YTtcbiAgICBpZiAoc2hvdWxkUmVzcG9uc2l2ZSkge1xuICAgICAgaWYgKGNvbnRhaW5lcldpZHRoID09PSBudWxsICYmIGZ1bGx5U1NSKSB7XG4gICAgICAgIGl0ZW1zID0gZGF0YTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW1zID0gZGF0YS5zbGljZSgwLCBNYXRoLm1pbihkYXRhLmxlbmd0aCwgbWVyZ2VkQ29udGFpbmVyV2lkdGggLyBpdGVtV2lkdGgpKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtYXhDb3VudCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGl0ZW1zID0gZGF0YS5zbGljZSgwLCBtYXhDb3VudCk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfSwgW2RhdGEsIGl0ZW1XaWR0aCwgY29udGFpbmVyV2lkdGgsIG1heENvdW50LCBzaG91bGRSZXNwb25zaXZlXSk7XG4gIHZhciBvbWl0dGVkSXRlbXMgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc2hvdWxkUmVzcG9uc2l2ZSkge1xuICAgICAgcmV0dXJuIGRhdGEuc2xpY2UobWVyZ2VkRGlzcGxheUNvdW50ICsgMSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhLnNsaWNlKG1lcmdlZERhdGEubGVuZ3RoKTtcbiAgfSwgW2RhdGEsIG1lcmdlZERhdGEsIHNob3VsZFJlc3BvbnNpdmUsIG1lcmdlZERpc3BsYXlDb3VudF0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSXRlbSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGdldEtleSA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChpdGVtLCBpbmRleCkge1xuICAgIHZhciBfcmVmO1xuICAgIGlmICh0eXBlb2YgaXRlbUtleSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGl0ZW1LZXkoaXRlbSk7XG4gICAgfVxuICAgIHJldHVybiAoX3JlZiA9IGl0ZW1LZXkgJiYgKGl0ZW0gPT09IG51bGwgfHwgaXRlbSA9PT0gdm9pZCAwID8gdm9pZCAwIDogaXRlbVtpdGVtS2V5XSkpICE9PSBudWxsICYmIF9yZWYgIT09IHZvaWQgMCA/IF9yZWYgOiBpbmRleDtcbiAgfSwgW2l0ZW1LZXldKTtcbiAgdmFyIG1lcmdlZFJlbmRlckl0ZW0gPSB1c2VDYWxsYmFjayhyZW5kZXJJdGVtIHx8IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW07XG4gIH0sIFtyZW5kZXJJdGVtXSk7XG4gIGZ1bmN0aW9uIHVwZGF0ZURpc3BsYXlDb3VudChjb3VudCwgc3VmZml4Rml4ZWRTdGFydFZhbCwgbm90UmVhZHkpIHtcbiAgICAvLyBSZWFjdCAxOCB3aWxsIHN5bmMgcmVuZGVyIGV2ZW4gd2hlbiB0aGUgdmFsdWUgaXMgc2FtZSBpbiBzb21lIGNhc2UuXG4gICAgLy8gV2UgdGFrZSBgbWVyZ2VkRGF0YWAgYXMgZGVwcyB3aGljaCBtYXkgY2F1c2UgZGVhZCBsb29wIGlmIGl0J3MgZHluYW1pYyBnZW5lcmF0ZS5cbiAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzM2NTU5XG4gICAgaWYgKGRpc3BsYXlDb3VudCA9PT0gY291bnQgJiYgKHN1ZmZpeEZpeGVkU3RhcnRWYWwgPT09IHVuZGVmaW5lZCB8fCBzdWZmaXhGaXhlZFN0YXJ0VmFsID09PSBzdWZmaXhGaXhlZFN0YXJ0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZXREaXNwbGF5Q291bnQoY291bnQpO1xuICAgIGlmICghbm90UmVhZHkpIHtcbiAgICAgIHNldFJlc3RSZWFkeShjb3VudCA8IGRhdGEubGVuZ3RoIC0gMSk7XG4gICAgICBvblZpc2libGVDaGFuZ2UgPT09IG51bGwgfHwgb25WaXNpYmxlQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvblZpc2libGVDaGFuZ2UoY291bnQpO1xuICAgIH1cbiAgICBpZiAoc3VmZml4Rml4ZWRTdGFydFZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzZXRTdWZmaXhGaXhlZFN0YXJ0KHN1ZmZpeEZpeGVkU3RhcnRWYWwpO1xuICAgIH1cbiAgfVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2l6ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZnVuY3Rpb24gb25PdmVyZmxvd1Jlc2l6ZShfLCBlbGVtZW50KSB7XG4gICAgc2V0Q29udGFpbmVyV2lkdGgoZWxlbWVudC5jbGllbnRXaWR0aCk7XG4gIH1cbiAgZnVuY3Rpb24gcmVnaXN0ZXJTaXplKGtleSwgd2lkdGgpIHtcbiAgICBzZXRJdGVtV2lkdGhzKGZ1bmN0aW9uIChvcmlnaW4pIHtcbiAgICAgIHZhciBjbG9uZSA9IG5ldyBNYXAob3JpZ2luKTtcbiAgICAgIGlmICh3aWR0aCA9PT0gbnVsbCkge1xuICAgICAgICBjbG9uZS5kZWxldGUoa2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsb25lLnNldChrZXksIHdpZHRoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiByZWdpc3Rlck92ZXJmbG93U2l6ZShfLCB3aWR0aCkge1xuICAgIHNldFJlc3RXaWR0aCh3aWR0aCk7XG4gICAgc2V0UHJldlJlc3RXaWR0aChyZXN0V2lkdGgpO1xuICB9XG4gIGZ1bmN0aW9uIHJlZ2lzdGVyU3VmZml4U2l6ZShfLCB3aWR0aCkge1xuICAgIHNldFN1ZmZpeFdpZHRoKHdpZHRoKTtcbiAgfVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFZmZlY3QgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZnVuY3Rpb24gZ2V0SXRlbVdpZHRoKGluZGV4KSB7XG4gICAgcmV0dXJuIGl0ZW1XaWR0aHMuZ2V0KGdldEtleShtZXJnZWREYXRhW2luZGV4XSwgaW5kZXgpKTtcbiAgfVxuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChtZXJnZWRDb250YWluZXJXaWR0aCAmJiB0eXBlb2YgbWVyZ2VkUmVzdFdpZHRoID09PSAnbnVtYmVyJyAmJiBtZXJnZWREYXRhKSB7XG4gICAgICB2YXIgdG90YWxXaWR0aCA9IHN1ZmZpeFdpZHRoO1xuICAgICAgdmFyIGxlbiA9IG1lcmdlZERhdGEubGVuZ3RoO1xuICAgICAgdmFyIGxhc3RJbmRleCA9IGxlbiAtIDE7XG4gICAgICAvLyBXaGVuIGRhdGEgY291bnQgY2hhbmdlIHRvIDAsIHJlc2V0IHRoaXMgc2luY2Ugbm90IGxvb3Agd2lsbCByZWFjaFxuICAgICAgaWYgKCFsZW4pIHtcbiAgICAgICAgdXBkYXRlRGlzcGxheUNvdW50KDAsIG51bGwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgIHZhciBjdXJyZW50SXRlbVdpZHRoID0gZ2V0SXRlbVdpZHRoKGkpO1xuICAgICAgICAvLyBGdWxseSB3aWxsIGFsd2F5cyByZW5kZXJcbiAgICAgICAgaWYgKGZ1bGx5U1NSKSB7XG4gICAgICAgICAgY3VycmVudEl0ZW1XaWR0aCA9IGN1cnJlbnRJdGVtV2lkdGggfHwgMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBCcmVhayBzaW5jZSBkYXRhIG5vdCByZWFkeVxuICAgICAgICBpZiAoY3VycmVudEl0ZW1XaWR0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdXBkYXRlRGlzcGxheUNvdW50KGkgLSAxLCB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZpbmQgYmVzdCBtYXRjaFxuICAgICAgICB0b3RhbFdpZHRoICs9IGN1cnJlbnRJdGVtV2lkdGg7XG4gICAgICAgIGlmIChcbiAgICAgICAgLy8gT25seSBvbmUgbWVhbnMgYHRvdGFsV2lkdGhgIGlzIHRoZSBmaW5hbCB3aWR0aFxuICAgICAgICBsYXN0SW5kZXggPT09IDAgJiYgdG90YWxXaWR0aCA8PSBtZXJnZWRDb250YWluZXJXaWR0aCB8fFxuICAgICAgICAvLyBMYXN0IHR3byB3aWR0aCB3aWxsIGJlIHRoZSBmaW5hbCB3aWR0aFxuICAgICAgICBpID09PSBsYXN0SW5kZXggLSAxICYmIHRvdGFsV2lkdGggKyBnZXRJdGVtV2lkdGgobGFzdEluZGV4KSA8PSBtZXJnZWRDb250YWluZXJXaWR0aCkge1xuICAgICAgICAgIC8vIEFkZGl0aW9uYWwgY2hlY2sgaWYgbWF0Y2ggdGhlIGVuZFxuICAgICAgICAgIHVwZGF0ZURpc3BsYXlDb3VudChsYXN0SW5kZXgsIG51bGwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKHRvdGFsV2lkdGggKyBtZXJnZWRSZXN0V2lkdGggPiBtZXJnZWRDb250YWluZXJXaWR0aCkge1xuICAgICAgICAgIC8vIENhbiBub3QgaG9sZCBhbGwgdGhlIGNvbnRlbnQgdG8gc2hvdyByZXN0XG4gICAgICAgICAgdXBkYXRlRGlzcGxheUNvdW50KGkgLSAxLCB0b3RhbFdpZHRoIC0gY3VycmVudEl0ZW1XaWR0aCAtIHN1ZmZpeFdpZHRoICsgcmVzdFdpZHRoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHN1ZmZpeCAmJiBnZXRJdGVtV2lkdGgoMCkgKyBzdWZmaXhXaWR0aCA+IG1lcmdlZENvbnRhaW5lcldpZHRoKSB7XG4gICAgICAgIHNldFN1ZmZpeEZpeGVkU3RhcnQobnVsbCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBbbWVyZ2VkQ29udGFpbmVyV2lkdGgsIGl0ZW1XaWR0aHMsIHJlc3RXaWR0aCwgc3VmZml4V2lkdGgsIGdldEtleSwgbWVyZ2VkRGF0YV0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGRpc3BsYXlSZXN0ID0gcmVzdFJlYWR5ICYmICEhb21pdHRlZEl0ZW1zLmxlbmd0aDtcbiAgdmFyIHN1ZmZpeFN0eWxlID0ge307XG4gIGlmIChzdWZmaXhGaXhlZFN0YXJ0ICE9PSBudWxsICYmIHNob3VsZFJlc3BvbnNpdmUpIHtcbiAgICBzdWZmaXhTdHlsZSA9IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgbGVmdDogc3VmZml4Rml4ZWRTdGFydCxcbiAgICAgIHRvcDogMFxuICAgIH07XG4gIH1cbiAgdmFyIGl0ZW1TaGFyZWRQcm9wcyA9IHtcbiAgICBwcmVmaXhDbHM6IGl0ZW1QcmVmaXhDbHMsXG4gICAgcmVzcG9uc2l2ZTogc2hvdWxkUmVzcG9uc2l2ZSxcbiAgICBjb21wb25lbnQ6IGl0ZW1Db21wb25lbnQsXG4gICAgaW52YWxpZGF0ZTogaW52YWxpZGF0ZVxuICB9O1xuICAvLyA+Pj4+PiBDaG9pY2UgcmVuZGVyIGZ1biBieSBgcmVuZGVyUmF3SXRlbWBcbiAgdmFyIGludGVybmFsUmVuZGVySXRlbU5vZGUgPSByZW5kZXJSYXdJdGVtID8gZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7XG4gICAgdmFyIGtleSA9IGdldEtleShpdGVtLCBpbmRleCk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE92ZXJmbG93Q29udGV4dC5Qcm92aWRlciwge1xuICAgICAga2V5OiBrZXksXG4gICAgICB2YWx1ZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBpdGVtU2hhcmVkUHJvcHMpLCB7fSwge1xuICAgICAgICBvcmRlcjogaW5kZXgsXG4gICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgIGl0ZW1LZXk6IGtleSxcbiAgICAgICAgcmVnaXN0ZXJTaXplOiByZWdpc3RlclNpemUsXG4gICAgICAgIGRpc3BsYXk6IGluZGV4IDw9IG1lcmdlZERpc3BsYXlDb3VudFxuICAgICAgfSlcbiAgICB9LCByZW5kZXJSYXdJdGVtKGl0ZW0sIGluZGV4KSk7XG4gIH0gOiBmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICB2YXIga2V5ID0gZ2V0S2V5KGl0ZW0sIGluZGV4KTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSXRlbSwgX2V4dGVuZHMoe30sIGl0ZW1TaGFyZWRQcm9wcywge1xuICAgICAgb3JkZXI6IGluZGV4LFxuICAgICAga2V5OiBrZXksXG4gICAgICBpdGVtOiBpdGVtLFxuICAgICAgcmVuZGVySXRlbTogbWVyZ2VkUmVuZGVySXRlbSxcbiAgICAgIGl0ZW1LZXk6IGtleSxcbiAgICAgIHJlZ2lzdGVyU2l6ZTogcmVnaXN0ZXJTaXplLFxuICAgICAgZGlzcGxheTogaW5kZXggPD0gbWVyZ2VkRGlzcGxheUNvdW50XG4gICAgfSkpO1xuICB9O1xuICAvLyA+Pj4+PiBSZXN0IG5vZGVcbiAgdmFyIHJlc3ROb2RlO1xuICB2YXIgcmVzdENvbnRleHRQcm9wcyA9IHtcbiAgICBvcmRlcjogZGlzcGxheVJlc3QgPyBtZXJnZWREaXNwbGF5Q291bnQgOiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KGl0ZW1QcmVmaXhDbHMsIFwiLXJlc3RcIiksXG4gICAgcmVnaXN0ZXJTaXplOiByZWdpc3Rlck92ZXJmbG93U2l6ZSxcbiAgICBkaXNwbGF5OiBkaXNwbGF5UmVzdFxuICB9O1xuICBpZiAoIXJlbmRlclJhd1Jlc3QpIHtcbiAgICB2YXIgbWVyZ2VkUmVuZGVyUmVzdCA9IHJlbmRlclJlc3QgfHwgZGVmYXVsdFJlbmRlclJlc3Q7XG4gICAgcmVzdE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJdGVtLCBfZXh0ZW5kcyh7fSwgaXRlbVNoYXJlZFByb3BzLCByZXN0Q29udGV4dFByb3BzKSwgdHlwZW9mIG1lcmdlZFJlbmRlclJlc3QgPT09ICdmdW5jdGlvbicgPyBtZXJnZWRSZW5kZXJSZXN0KG9taXR0ZWRJdGVtcykgOiBtZXJnZWRSZW5kZXJSZXN0KTtcbiAgfSBlbHNlIGlmIChyZW5kZXJSYXdSZXN0KSB7XG4gICAgcmVzdE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChPdmVyZmxvd0NvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgIHZhbHVlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGl0ZW1TaGFyZWRQcm9wcyksIHJlc3RDb250ZXh0UHJvcHMpXG4gICAgfSwgcmVuZGVyUmF3UmVzdChvbWl0dGVkSXRlbXMpKTtcbiAgfVxuICB2YXIgb3ZlcmZsb3dOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKCFpbnZhbGlkYXRlICYmIHByZWZpeENscywgY2xhc3NOYW1lKSxcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgcmVmOiByZWZcbiAgfSwgcmVzdFByb3BzKSwgbWVyZ2VkRGF0YS5tYXAoaW50ZXJuYWxSZW5kZXJJdGVtTm9kZSksIHNob3dSZXN0ID8gcmVzdE5vZGUgOiBudWxsLCBzdWZmaXggJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSXRlbSwgX2V4dGVuZHMoe30sIGl0ZW1TaGFyZWRQcm9wcywge1xuICAgIHJlc3BvbnNpdmU6IGlzUmVzcG9uc2l2ZSxcbiAgICByZXNwb25zaXZlRGlzYWJsZWQ6ICFzaG91bGRSZXNwb25zaXZlLFxuICAgIG9yZGVyOiBtZXJnZWREaXNwbGF5Q291bnQsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChpdGVtUHJlZml4Q2xzLCBcIi1zdWZmaXhcIiksXG4gICAgcmVnaXN0ZXJTaXplOiByZWdpc3RlclN1ZmZpeFNpemUsXG4gICAgZGlzcGxheTogdHJ1ZSxcbiAgICBzdHlsZTogc3VmZml4U3R5bGVcbiAgfSksIHN1ZmZpeCkpO1xuICBpZiAoaXNSZXNwb25zaXZlKSB7XG4gICAgb3ZlcmZsb3dOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVzaXplT2JzZXJ2ZXIsIHtcbiAgICAgIG9uUmVzaXplOiBvbk92ZXJmbG93UmVzaXplLFxuICAgICAgZGlzYWJsZWQ6ICFzaG91bGRSZXNwb25zaXZlXG4gICAgfSwgb3ZlcmZsb3dOb2RlKTtcbiAgfVxuICByZXR1cm4gb3ZlcmZsb3dOb2RlO1xufVxudmFyIEZvcndhcmRPdmVyZmxvdyA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKE92ZXJmbG93KTtcbkZvcndhcmRPdmVyZmxvdy5kaXNwbGF5TmFtZSA9ICdPdmVyZmxvdyc7XG5Gb3J3YXJkT3ZlcmZsb3cuSXRlbSA9IFJhd0l0ZW07XG5Gb3J3YXJkT3ZlcmZsb3cuUkVTUE9OU0lWRSA9IFJFU1BPTlNJVkU7XG5Gb3J3YXJkT3ZlcmZsb3cuSU5WQUxJREFURSA9IElOVkFMSURBVEU7XG4vLyBDb252ZXJ0IHRvIGdlbmVyaWMgdHlwZVxuZXhwb3J0IGRlZmF1bHQgRm9yd2FyZE92ZXJmbG93OyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xudmFyIFRyYW5zQnRuID0gZnVuY3Rpb24gVHJhbnNCdG4oX3JlZikge1xuICB2YXIgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgY3VzdG9taXplSWNvbiA9IF9yZWYuY3VzdG9taXplSWNvbixcbiAgICBjdXN0b21pemVJY29uUHJvcHMgPSBfcmVmLmN1c3RvbWl6ZUljb25Qcm9wcyxcbiAgICBfb25Nb3VzZURvd24gPSBfcmVmLm9uTW91c2VEb3duLFxuICAgIG9uQ2xpY2sgPSBfcmVmLm9uQ2xpY2ssXG4gICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuO1xuICB2YXIgaWNvbjtcbiAgaWYgKHR5cGVvZiBjdXN0b21pemVJY29uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWNvbiA9IGN1c3RvbWl6ZUljb24oY3VzdG9taXplSWNvblByb3BzKTtcbiAgfSBlbHNlIHtcbiAgICBpY29uID0gY3VzdG9taXplSWNvbjtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICBvbk1vdXNlRG93bjogZnVuY3Rpb24gb25Nb3VzZURvd24oZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoX29uTW91c2VEb3duKSB7XG4gICAgICAgIF9vbk1vdXNlRG93bihldmVudCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBzdHlsZToge1xuICAgICAgdXNlclNlbGVjdDogJ25vbmUnLFxuICAgICAgV2Via2l0VXNlclNlbGVjdDogJ25vbmUnXG4gICAgfSxcbiAgICB1bnNlbGVjdGFibGU6IFwib25cIixcbiAgICBvbkNsaWNrOiBvbkNsaWNrLFxuICAgIFwiYXJpYS1oaWRkZW5cIjogdHJ1ZVxuICB9LCBpY29uICE9PSB1bmRlZmluZWQgPyBpY29uIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLnNwbGl0KC9cXHMrLykubWFwKGZ1bmN0aW9uIChjbHMpIHtcbiAgICAgIHJldHVybiBcIlwiLmNvbmNhdChjbHMsIFwiLWljb25cIik7XG4gICAgfSkpXG4gIH0sIGNoaWxkcmVuKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgVHJhbnNCdG47IiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgY29tcG9zZVJlZiB9IGZyb20gXCJyYy11dGlsL2VzL3JlZlwiO1xuaW1wb3J0IHsgd2FybmluZyB9IGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbnZhciBJbnB1dCA9IGZ1bmN0aW9uIElucHV0KF9yZWYsIHJlZikge1xuICB2YXIgX2lucHV0Tm9kZTIsIF9pbnB1dE5vZGUyJHByb3BzO1xuICB2YXIgcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHMsXG4gICAgaWQgPSBfcmVmLmlkLFxuICAgIGlucHV0RWxlbWVudCA9IF9yZWYuaW5wdXRFbGVtZW50LFxuICAgIGRpc2FibGVkID0gX3JlZi5kaXNhYmxlZCxcbiAgICB0YWJJbmRleCA9IF9yZWYudGFiSW5kZXgsXG4gICAgYXV0b0ZvY3VzID0gX3JlZi5hdXRvRm9jdXMsXG4gICAgYXV0b0NvbXBsZXRlID0gX3JlZi5hdXRvQ29tcGxldGUsXG4gICAgZWRpdGFibGUgPSBfcmVmLmVkaXRhYmxlLFxuICAgIGFjdGl2ZURlc2NlbmRhbnRJZCA9IF9yZWYuYWN0aXZlRGVzY2VuZGFudElkLFxuICAgIHZhbHVlID0gX3JlZi52YWx1ZSxcbiAgICBtYXhMZW5ndGggPSBfcmVmLm1heExlbmd0aCxcbiAgICBfb25LZXlEb3duID0gX3JlZi5vbktleURvd24sXG4gICAgX29uTW91c2VEb3duID0gX3JlZi5vbk1vdXNlRG93bixcbiAgICBfb25DaGFuZ2UgPSBfcmVmLm9uQ2hhbmdlLFxuICAgIG9uUGFzdGUgPSBfcmVmLm9uUGFzdGUsXG4gICAgX29uQ29tcG9zaXRpb25TdGFydCA9IF9yZWYub25Db21wb3NpdGlvblN0YXJ0LFxuICAgIF9vbkNvbXBvc2l0aW9uRW5kID0gX3JlZi5vbkNvbXBvc2l0aW9uRW5kLFxuICAgIG9wZW4gPSBfcmVmLm9wZW4sXG4gICAgYXR0cnMgPSBfcmVmLmF0dHJzO1xuICB2YXIgaW5wdXROb2RlID0gaW5wdXRFbGVtZW50IHx8IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgbnVsbCk7XG4gIHZhciBfaW5wdXROb2RlID0gaW5wdXROb2RlLFxuICAgIG9yaWdpblJlZiA9IF9pbnB1dE5vZGUucmVmLFxuICAgIG9yaWdpblByb3BzID0gX2lucHV0Tm9kZS5wcm9wcztcbiAgdmFyIG9uT3JpZ2luS2V5RG93biA9IG9yaWdpblByb3BzLm9uS2V5RG93bixcbiAgICBvbk9yaWdpbkNoYW5nZSA9IG9yaWdpblByb3BzLm9uQ2hhbmdlLFxuICAgIG9uT3JpZ2luTW91c2VEb3duID0gb3JpZ2luUHJvcHMub25Nb3VzZURvd24sXG4gICAgb25PcmlnaW5Db21wb3NpdGlvblN0YXJ0ID0gb3JpZ2luUHJvcHMub25Db21wb3NpdGlvblN0YXJ0LFxuICAgIG9uT3JpZ2luQ29tcG9zaXRpb25FbmQgPSBvcmlnaW5Qcm9wcy5vbkNvbXBvc2l0aW9uRW5kLFxuICAgIHN0eWxlID0gb3JpZ2luUHJvcHMuc3R5bGU7XG4gIHdhcm5pbmcoISgnbWF4TGVuZ3RoJyBpbiBpbnB1dE5vZGUucHJvcHMpLCBcIlBhc3NpbmcgJ21heExlbmd0aCcgdG8gaW5wdXQgZWxlbWVudCBkaXJlY3RseSBtYXkgbm90IHdvcmsgYmVjYXVzZSBpbnB1dCBpbiBCYXNlU2VsZWN0IGlzIGNvbnRyb2xsZWQuXCIpO1xuICBpbnB1dE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGlucHV0Tm9kZSwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe1xuICAgIHR5cGU6ICdzZWFyY2gnXG4gIH0sIG9yaWdpblByb3BzKSwge30sIHtcbiAgICAvLyBPdmVycmlkZSBvdmVyIG9yaWdpbiBwcm9wc1xuICAgIGlkOiBpZCxcbiAgICByZWY6IGNvbXBvc2VSZWYocmVmLCBvcmlnaW5SZWYpLFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICB0YWJJbmRleDogdGFiSW5kZXgsXG4gICAgYXV0b0NvbXBsZXRlOiBhdXRvQ29tcGxldGUgfHwgJ29mZicsXG4gICAgYXV0b0ZvY3VzOiBhdXRvRm9jdXMsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2VsZWN0aW9uLXNlYXJjaC1pbnB1dFwiKSwgKF9pbnB1dE5vZGUyID0gaW5wdXROb2RlKSA9PT0gbnVsbCB8fCBfaW5wdXROb2RlMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9pbnB1dE5vZGUyJHByb3BzID0gX2lucHV0Tm9kZTIucHJvcHMpID09PSBudWxsIHx8IF9pbnB1dE5vZGUyJHByb3BzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfaW5wdXROb2RlMiRwcm9wcy5jbGFzc05hbWUpLFxuICAgIHJvbGU6ICdjb21ib2JveCcsXG4gICAgJ2FyaWEtZXhwYW5kZWQnOiBvcGVuLFxuICAgICdhcmlhLWhhc3BvcHVwJzogJ2xpc3Rib3gnLFxuICAgICdhcmlhLW93bnMnOiBcIlwiLmNvbmNhdChpZCwgXCJfbGlzdFwiKSxcbiAgICAnYXJpYS1hdXRvY29tcGxldGUnOiAnbGlzdCcsXG4gICAgJ2FyaWEtY29udHJvbHMnOiBcIlwiLmNvbmNhdChpZCwgXCJfbGlzdFwiKSxcbiAgICAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JzogYWN0aXZlRGVzY2VuZGFudElkXG4gIH0sIGF0dHJzKSwge30sIHtcbiAgICB2YWx1ZTogZWRpdGFibGUgPyB2YWx1ZSA6ICcnLFxuICAgIG1heExlbmd0aDogbWF4TGVuZ3RoLFxuICAgIHJlYWRPbmx5OiAhZWRpdGFibGUsXG4gICAgdW5zZWxlY3RhYmxlOiAhZWRpdGFibGUgPyAnb24nIDogbnVsbCxcbiAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICBvcGFjaXR5OiBlZGl0YWJsZSA/IG51bGwgOiAwXG4gICAgfSksXG4gICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIF9vbktleURvd24oZXZlbnQpO1xuICAgICAgaWYgKG9uT3JpZ2luS2V5RG93bikge1xuICAgICAgICBvbk9yaWdpbktleURvd24oZXZlbnQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgb25Nb3VzZURvd246IGZ1bmN0aW9uIG9uTW91c2VEb3duKGV2ZW50KSB7XG4gICAgICBfb25Nb3VzZURvd24oZXZlbnQpO1xuICAgICAgaWYgKG9uT3JpZ2luTW91c2VEb3duKSB7XG4gICAgICAgIG9uT3JpZ2luTW91c2VEb3duKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShldmVudCkge1xuICAgICAgX29uQ2hhbmdlKGV2ZW50KTtcbiAgICAgIGlmIChvbk9yaWdpbkNoYW5nZSkge1xuICAgICAgICBvbk9yaWdpbkNoYW5nZShldmVudCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvbkNvbXBvc2l0aW9uU3RhcnQ6IGZ1bmN0aW9uIG9uQ29tcG9zaXRpb25TdGFydChldmVudCkge1xuICAgICAgX29uQ29tcG9zaXRpb25TdGFydChldmVudCk7XG4gICAgICBpZiAob25PcmlnaW5Db21wb3NpdGlvblN0YXJ0KSB7XG4gICAgICAgIG9uT3JpZ2luQ29tcG9zaXRpb25TdGFydChldmVudCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvbkNvbXBvc2l0aW9uRW5kOiBmdW5jdGlvbiBvbkNvbXBvc2l0aW9uRW5kKGV2ZW50KSB7XG4gICAgICBfb25Db21wb3NpdGlvbkVuZChldmVudCk7XG4gICAgICBpZiAob25PcmlnaW5Db21wb3NpdGlvbkVuZCkge1xuICAgICAgICBvbk9yaWdpbkNvbXBvc2l0aW9uRW5kKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uUGFzdGU6IG9uUGFzdGVcbiAgfSkpO1xuICByZXR1cm4gaW5wdXROb2RlO1xufTtcbnZhciBSZWZJbnB1dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKElucHV0KTtcblJlZklucHV0LmRpc3BsYXlOYW1lID0gJ0lucHV0JztcbmV4cG9ydCBkZWZhdWx0IFJlZklucHV0OyIsImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmV4cG9ydCBmdW5jdGlvbiB0b0FycmF5KHZhbHVlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IFt2YWx1ZV0gOiBbXTtcbn1cbmV4cG9ydCB2YXIgaXNDbGllbnQgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuZG9jdW1lbnQgJiYgd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuLyoqIElzIGNsaWVudCBzaWRlIGFuZCBub3QganNkb20gKi9cbmV4cG9ydCB2YXIgaXNCcm93c2VyQ2xpZW50ID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICd0ZXN0JyAmJiBpc0NsaWVudDtcbmV4cG9ydCBmdW5jdGlvbiBoYXNWYWx1ZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbDtcbn1cbmZ1bmN0aW9uIGlzVGl0bGVUeXBlKHRpdGxlKSB7XG4gIHJldHVybiBbJ3N0cmluZycsICdudW1iZXInXS5pbmNsdWRlcyhfdHlwZW9mKHRpdGxlKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VGl0bGUoaXRlbSkge1xuICB2YXIgdGl0bGUgPSB1bmRlZmluZWQ7XG4gIGlmIChpdGVtKSB7XG4gICAgaWYgKGlzVGl0bGVUeXBlKGl0ZW0udGl0bGUpKSB7XG4gICAgICB0aXRsZSA9IGl0ZW0udGl0bGUudG9TdHJpbmcoKTtcbiAgICB9IGVsc2UgaWYgKGlzVGl0bGVUeXBlKGl0ZW0ubGFiZWwpKSB7XG4gICAgICB0aXRsZSA9IGl0ZW0ubGFiZWwudG9TdHJpbmcoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRpdGxlO1xufSIsIi8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWhvb2tzL3J1bGVzLW9mLWhvb2tzICovXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBpc0Jyb3dzZXJDbGllbnQgfSBmcm9tIFwiLi4vdXRpbHMvY29tbW9uVXRpbFwiO1xuXG4vKipcbiAqIFdyYXAgYFJlYWN0LnVzZUxheW91dEVmZmVjdGAgd2hpY2ggd2lsbCBub3QgdGhyb3cgd2FybmluZyBtZXNzYWdlIGluIHRlc3QgZW52XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUxheW91dEVmZmVjdChlZmZlY3QsIGRlcHMpIHtcbiAgLy8gTmV2ZXIgaGFwcGVuIGluIHRlc3QgZW52XG4gIGlmIChpc0Jyb3dzZXJDbGllbnQpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIFJlYWN0LnVzZUxheW91dEVmZmVjdChlZmZlY3QsIGRlcHMpO1xuICB9IGVsc2Uge1xuICAgIFJlYWN0LnVzZUVmZmVjdChlZmZlY3QsIGRlcHMpO1xuICB9XG59XG4vKiBlc2xpbnQtZW5hYmxlICovIiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBwaWNrQXR0cnMgZnJvbSBcInJjLXV0aWwvZXMvcGlja0F0dHJzXCI7XG5pbXBvcnQgT3ZlcmZsb3cgZnJvbSAncmMtb3ZlcmZsb3cnO1xuaW1wb3J0IFRyYW5zQnRuIGZyb20gXCIuLi9UcmFuc0J0blwiO1xuaW1wb3J0IElucHV0IGZyb20gXCIuL0lucHV0XCI7XG5pbXBvcnQgdXNlTGF5b3V0RWZmZWN0IGZyb20gXCIuLi9ob29rcy91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCB7IGdldFRpdGxlIH0gZnJvbSBcIi4uL3V0aWxzL2NvbW1vblV0aWxcIjtcbmZ1bmN0aW9uIGl0ZW1LZXkodmFsdWUpIHtcbiAgdmFyIF92YWx1ZSRrZXk7XG4gIHJldHVybiAoX3ZhbHVlJGtleSA9IHZhbHVlLmtleSkgIT09IG51bGwgJiYgX3ZhbHVlJGtleSAhPT0gdm9pZCAwID8gX3ZhbHVlJGtleSA6IHZhbHVlLnZhbHVlO1xufVxudmFyIG9uUHJldmVudE1vdXNlRG93biA9IGZ1bmN0aW9uIG9uUHJldmVudE1vdXNlRG93bihldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbn07XG52YXIgU2VsZWN0U2VsZWN0b3IgPSBmdW5jdGlvbiBTZWxlY3RTZWxlY3Rvcihwcm9wcykge1xuICB2YXIgaWQgPSBwcm9wcy5pZCxcbiAgICBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgdmFsdWVzID0gcHJvcHMudmFsdWVzLFxuICAgIG9wZW4gPSBwcm9wcy5vcGVuLFxuICAgIHNlYXJjaFZhbHVlID0gcHJvcHMuc2VhcmNoVmFsdWUsXG4gICAgYXV0b0NsZWFyU2VhcmNoVmFsdWUgPSBwcm9wcy5hdXRvQ2xlYXJTZWFyY2hWYWx1ZSxcbiAgICBpbnB1dFJlZiA9IHByb3BzLmlucHV0UmVmLFxuICAgIHBsYWNlaG9sZGVyID0gcHJvcHMucGxhY2Vob2xkZXIsXG4gICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICBtb2RlID0gcHJvcHMubW9kZSxcbiAgICBzaG93U2VhcmNoID0gcHJvcHMuc2hvd1NlYXJjaCxcbiAgICBhdXRvRm9jdXMgPSBwcm9wcy5hdXRvRm9jdXMsXG4gICAgYXV0b0NvbXBsZXRlID0gcHJvcHMuYXV0b0NvbXBsZXRlLFxuICAgIGFjdGl2ZURlc2NlbmRhbnRJZCA9IHByb3BzLmFjdGl2ZURlc2NlbmRhbnRJZCxcbiAgICB0YWJJbmRleCA9IHByb3BzLnRhYkluZGV4LFxuICAgIHJlbW92ZUljb24gPSBwcm9wcy5yZW1vdmVJY29uLFxuICAgIG1heFRhZ0NvdW50ID0gcHJvcHMubWF4VGFnQ291bnQsXG4gICAgbWF4VGFnVGV4dExlbmd0aCA9IHByb3BzLm1heFRhZ1RleHRMZW5ndGgsXG4gICAgX3Byb3BzJG1heFRhZ1BsYWNlaG9sID0gcHJvcHMubWF4VGFnUGxhY2Vob2xkZXIsXG4gICAgbWF4VGFnUGxhY2Vob2xkZXIgPSBfcHJvcHMkbWF4VGFnUGxhY2Vob2wgPT09IHZvaWQgMCA/IGZ1bmN0aW9uIChvbWl0dGVkVmFsdWVzKSB7XG4gICAgICByZXR1cm4gXCIrIFwiLmNvbmNhdChvbWl0dGVkVmFsdWVzLmxlbmd0aCwgXCIgLi4uXCIpO1xuICAgIH0gOiBfcHJvcHMkbWF4VGFnUGxhY2Vob2wsXG4gICAgdGFnUmVuZGVyID0gcHJvcHMudGFnUmVuZGVyLFxuICAgIG9uVG9nZ2xlT3BlbiA9IHByb3BzLm9uVG9nZ2xlT3BlbixcbiAgICBvblJlbW92ZSA9IHByb3BzLm9uUmVtb3ZlLFxuICAgIG9uSW5wdXRDaGFuZ2UgPSBwcm9wcy5vbklucHV0Q2hhbmdlLFxuICAgIG9uSW5wdXRQYXN0ZSA9IHByb3BzLm9uSW5wdXRQYXN0ZSxcbiAgICBvbklucHV0S2V5RG93biA9IHByb3BzLm9uSW5wdXRLZXlEb3duLFxuICAgIG9uSW5wdXRNb3VzZURvd24gPSBwcm9wcy5vbklucHV0TW91c2VEb3duLFxuICAgIG9uSW5wdXRDb21wb3NpdGlvblN0YXJ0ID0gcHJvcHMub25JbnB1dENvbXBvc2l0aW9uU3RhcnQsXG4gICAgb25JbnB1dENvbXBvc2l0aW9uRW5kID0gcHJvcHMub25JbnB1dENvbXBvc2l0aW9uRW5kO1xuICB2YXIgbWVhc3VyZVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKDApLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIGlucHV0V2lkdGggPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldElucHV0V2lkdGggPSBfdXNlU3RhdGUyWzFdO1xuICB2YXIgX3VzZVN0YXRlMyA9IHVzZVN0YXRlKGZhbHNlKSxcbiAgICBfdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlMywgMiksXG4gICAgZm9jdXNlZCA9IF91c2VTdGF0ZTRbMF0sXG4gICAgc2V0Rm9jdXNlZCA9IF91c2VTdGF0ZTRbMV07XG4gIHZhciBzZWxlY3Rpb25QcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNlbGVjdGlvblwiKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gU2VhcmNoID09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGlucHV0VmFsdWUgPSBvcGVuIHx8IG1vZGUgPT09IFwibXVsdGlwbGVcIiAmJiBhdXRvQ2xlYXJTZWFyY2hWYWx1ZSA9PT0gZmFsc2UgfHwgbW9kZSA9PT0gJ3RhZ3MnID8gc2VhcmNoVmFsdWUgOiAnJztcbiAgdmFyIGlucHV0RWRpdGFibGUgPSBtb2RlID09PSAndGFncycgfHwgbW9kZSA9PT0gXCJtdWx0aXBsZVwiICYmIGF1dG9DbGVhclNlYXJjaFZhbHVlID09PSBmYWxzZSB8fCBzaG93U2VhcmNoICYmIChvcGVuIHx8IGZvY3VzZWQpO1xuXG4gIC8vIFdlIG1lYXN1cmUgd2lkdGggYW5kIHNldCB0byB0aGUgaW5wdXQgaW1tZWRpYXRlbHlcbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzZXRJbnB1dFdpZHRoKG1lYXN1cmVSZWYuY3VycmVudC5zY3JvbGxXaWR0aCk7XG4gIH0sIFtpbnB1dFZhbHVlXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID4+PiBSZW5kZXIgU2VsZWN0b3IgTm9kZS4gSW5jbHVkZXMgSXRlbSAmIFJlc3RcbiAgZnVuY3Rpb24gZGVmYXVsdFJlbmRlclNlbGVjdG9yKGl0ZW0sIGNvbnRlbnQsIGl0ZW1EaXNhYmxlZCwgY2xvc2FibGUsIG9uQ2xvc2UpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChzZWxlY3Rpb25QcmVmaXhDbHMsIFwiLWl0ZW1cIiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQoc2VsZWN0aW9uUHJlZml4Q2xzLCBcIi1pdGVtLWRpc2FibGVkXCIpLCBpdGVtRGlzYWJsZWQpKSxcbiAgICAgIHRpdGxlOiBnZXRUaXRsZShpdGVtKVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHNlbGVjdGlvblByZWZpeENscywgXCItaXRlbS1jb250ZW50XCIpXG4gICAgfSwgY29udGVudCksIGNsb3NhYmxlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRyYW5zQnRuLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHNlbGVjdGlvblByZWZpeENscywgXCItaXRlbS1yZW1vdmVcIiksXG4gICAgICBvbk1vdXNlRG93bjogb25QcmV2ZW50TW91c2VEb3duLFxuICAgICAgb25DbGljazogb25DbG9zZSxcbiAgICAgIGN1c3RvbWl6ZUljb246IHJlbW92ZUljb25cbiAgICB9LCBcIlxceEQ3XCIpKTtcbiAgfVxuICBmdW5jdGlvbiBjdXN0b21pemVSZW5kZXJTZWxlY3Rvcih2YWx1ZSwgY29udGVudCwgaXRlbURpc2FibGVkLCBjbG9zYWJsZSwgb25DbG9zZSkge1xuICAgIHZhciBvbk1vdXNlRG93biA9IGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgIG9uUHJldmVudE1vdXNlRG93bihlKTtcbiAgICAgIG9uVG9nZ2xlT3Blbighb3Blbik7XG4gICAgfTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIG9uTW91c2VEb3duOiBvbk1vdXNlRG93blxuICAgIH0sIHRhZ1JlbmRlcih7XG4gICAgICBsYWJlbDogY29udGVudCxcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGRpc2FibGVkOiBpdGVtRGlzYWJsZWQsXG4gICAgICBjbG9zYWJsZTogY2xvc2FibGUsXG4gICAgICBvbkNsb3NlOiBvbkNsb3NlXG4gICAgfSkpO1xuICB9XG4gIGZ1bmN0aW9uIHJlbmRlckl0ZW0odmFsdWVJdGVtKSB7XG4gICAgdmFyIGl0ZW1EaXNhYmxlZCA9IHZhbHVlSXRlbS5kaXNhYmxlZCxcbiAgICAgIGxhYmVsID0gdmFsdWVJdGVtLmxhYmVsLFxuICAgICAgdmFsdWUgPSB2YWx1ZUl0ZW0udmFsdWU7XG4gICAgdmFyIGNsb3NhYmxlID0gIWRpc2FibGVkICYmICFpdGVtRGlzYWJsZWQ7XG4gICAgdmFyIGRpc3BsYXlMYWJlbCA9IGxhYmVsO1xuICAgIGlmICh0eXBlb2YgbWF4VGFnVGV4dExlbmd0aCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmICh0eXBlb2YgbGFiZWwgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBsYWJlbCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdmFyIHN0ckxhYmVsID0gU3RyaW5nKGRpc3BsYXlMYWJlbCk7XG4gICAgICAgIGlmIChzdHJMYWJlbC5sZW5ndGggPiBtYXhUYWdUZXh0TGVuZ3RoKSB7XG4gICAgICAgICAgZGlzcGxheUxhYmVsID0gXCJcIi5jb25jYXQoc3RyTGFiZWwuc2xpY2UoMCwgbWF4VGFnVGV4dExlbmd0aCksIFwiLi4uXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBvbkNsb3NlID0gZnVuY3Rpb24gb25DbG9zZShldmVudCkge1xuICAgICAgaWYgKGV2ZW50KSBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIG9uUmVtb3ZlKHZhbHVlSXRlbSk7XG4gICAgfTtcbiAgICByZXR1cm4gdHlwZW9mIHRhZ1JlbmRlciA9PT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZVJlbmRlclNlbGVjdG9yKHZhbHVlLCBkaXNwbGF5TGFiZWwsIGl0ZW1EaXNhYmxlZCwgY2xvc2FibGUsIG9uQ2xvc2UpIDogZGVmYXVsdFJlbmRlclNlbGVjdG9yKHZhbHVlSXRlbSwgZGlzcGxheUxhYmVsLCBpdGVtRGlzYWJsZWQsIGNsb3NhYmxlLCBvbkNsb3NlKTtcbiAgfVxuICBmdW5jdGlvbiByZW5kZXJSZXN0KG9taXR0ZWRWYWx1ZXMpIHtcbiAgICB2YXIgY29udGVudCA9IHR5cGVvZiBtYXhUYWdQbGFjZWhvbGRlciA9PT0gJ2Z1bmN0aW9uJyA/IG1heFRhZ1BsYWNlaG9sZGVyKG9taXR0ZWRWYWx1ZXMpIDogbWF4VGFnUGxhY2Vob2xkZXI7XG4gICAgcmV0dXJuIGRlZmF1bHRSZW5kZXJTZWxlY3Rvcih7XG4gICAgICB0aXRsZTogY29udGVudFxuICAgIH0sIGNvbnRlbnQsIGZhbHNlKTtcbiAgfVxuXG4gIC8vID4+PiBJbnB1dCBOb2RlXG4gIHZhciBpbnB1dE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChzZWxlY3Rpb25QcmVmaXhDbHMsIFwiLXNlYXJjaFwiKSxcbiAgICBzdHlsZToge1xuICAgICAgd2lkdGg6IGlucHV0V2lkdGhcbiAgICB9LFxuICAgIG9uRm9jdXM6IGZ1bmN0aW9uIG9uRm9jdXMoKSB7XG4gICAgICBzZXRGb2N1c2VkKHRydWUpO1xuICAgIH0sXG4gICAgb25CbHVyOiBmdW5jdGlvbiBvbkJsdXIoKSB7XG4gICAgICBzZXRGb2N1c2VkKGZhbHNlKTtcbiAgICB9XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KElucHV0LCB7XG4gICAgcmVmOiBpbnB1dFJlZixcbiAgICBvcGVuOiBvcGVuLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGlkOiBpZCxcbiAgICBpbnB1dEVsZW1lbnQ6IG51bGwsXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgIGF1dG9Gb2N1czogYXV0b0ZvY3VzLFxuICAgIGF1dG9Db21wbGV0ZTogYXV0b0NvbXBsZXRlLFxuICAgIGVkaXRhYmxlOiBpbnB1dEVkaXRhYmxlLFxuICAgIGFjdGl2ZURlc2NlbmRhbnRJZDogYWN0aXZlRGVzY2VuZGFudElkLFxuICAgIHZhbHVlOiBpbnB1dFZhbHVlLFxuICAgIG9uS2V5RG93bjogb25JbnB1dEtleURvd24sXG4gICAgb25Nb3VzZURvd246IG9uSW5wdXRNb3VzZURvd24sXG4gICAgb25DaGFuZ2U6IG9uSW5wdXRDaGFuZ2UsXG4gICAgb25QYXN0ZTogb25JbnB1dFBhc3RlLFxuICAgIG9uQ29tcG9zaXRpb25TdGFydDogb25JbnB1dENvbXBvc2l0aW9uU3RhcnQsXG4gICAgb25Db21wb3NpdGlvbkVuZDogb25JbnB1dENvbXBvc2l0aW9uRW5kLFxuICAgIHRhYkluZGV4OiB0YWJJbmRleCxcbiAgICBhdHRyczogcGlja0F0dHJzKHByb3BzLCB0cnVlKVxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICByZWY6IG1lYXN1cmVSZWYsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChzZWxlY3Rpb25QcmVmaXhDbHMsIFwiLXNlYXJjaC1taXJyb3JcIiksXG4gICAgXCJhcmlhLWhpZGRlblwiOiB0cnVlXG4gIH0sIGlucHV0VmFsdWUsIFwiXFx4QTBcIikpO1xuXG4gIC8vID4+PiBTZWxlY3Rpb25zXG4gIHZhciBzZWxlY3Rpb25Ob2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoT3ZlcmZsb3csIHtcbiAgICBwcmVmaXhDbHM6IFwiXCIuY29uY2F0KHNlbGVjdGlvblByZWZpeENscywgXCItb3ZlcmZsb3dcIiksXG4gICAgZGF0YTogdmFsdWVzLFxuICAgIHJlbmRlckl0ZW06IHJlbmRlckl0ZW0sXG4gICAgcmVuZGVyUmVzdDogcmVuZGVyUmVzdCxcbiAgICBzdWZmaXg6IGlucHV0Tm9kZSxcbiAgICBpdGVtS2V5OiBpdGVtS2V5LFxuICAgIG1heENvdW50OiBtYXhUYWdDb3VudFxuICB9KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBzZWxlY3Rpb25Ob2RlLCAhdmFsdWVzLmxlbmd0aCAmJiAhaW5wdXRWYWx1ZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoc2VsZWN0aW9uUHJlZml4Q2xzLCBcIi1wbGFjZWhvbGRlclwiKVxuICB9LCBwbGFjZWhvbGRlcikpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFNlbGVjdFNlbGVjdG9yOyIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHBpY2tBdHRycyBmcm9tIFwicmMtdXRpbC9lcy9waWNrQXR0cnNcIjtcbmltcG9ydCBJbnB1dCBmcm9tIFwiLi9JbnB1dFwiO1xuaW1wb3J0IHsgZ2V0VGl0bGUgfSBmcm9tIFwiLi4vdXRpbHMvY29tbW9uVXRpbFwiO1xudmFyIFNpbmdsZVNlbGVjdG9yID0gZnVuY3Rpb24gU2luZ2xlU2VsZWN0b3IocHJvcHMpIHtcbiAgdmFyIGlucHV0RWxlbWVudCA9IHByb3BzLmlucHV0RWxlbWVudCxcbiAgICBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgaWQgPSBwcm9wcy5pZCxcbiAgICBpbnB1dFJlZiA9IHByb3BzLmlucHV0UmVmLFxuICAgIGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgYXV0b0ZvY3VzID0gcHJvcHMuYXV0b0ZvY3VzLFxuICAgIGF1dG9Db21wbGV0ZSA9IHByb3BzLmF1dG9Db21wbGV0ZSxcbiAgICBhY3RpdmVEZXNjZW5kYW50SWQgPSBwcm9wcy5hY3RpdmVEZXNjZW5kYW50SWQsXG4gICAgbW9kZSA9IHByb3BzLm1vZGUsXG4gICAgb3BlbiA9IHByb3BzLm9wZW4sXG4gICAgdmFsdWVzID0gcHJvcHMudmFsdWVzLFxuICAgIHBsYWNlaG9sZGVyID0gcHJvcHMucGxhY2Vob2xkZXIsXG4gICAgdGFiSW5kZXggPSBwcm9wcy50YWJJbmRleCxcbiAgICBzaG93U2VhcmNoID0gcHJvcHMuc2hvd1NlYXJjaCxcbiAgICBzZWFyY2hWYWx1ZSA9IHByb3BzLnNlYXJjaFZhbHVlLFxuICAgIGFjdGl2ZVZhbHVlID0gcHJvcHMuYWN0aXZlVmFsdWUsXG4gICAgbWF4TGVuZ3RoID0gcHJvcHMubWF4TGVuZ3RoLFxuICAgIG9uSW5wdXRLZXlEb3duID0gcHJvcHMub25JbnB1dEtleURvd24sXG4gICAgb25JbnB1dE1vdXNlRG93biA9IHByb3BzLm9uSW5wdXRNb3VzZURvd24sXG4gICAgb25JbnB1dENoYW5nZSA9IHByb3BzLm9uSW5wdXRDaGFuZ2UsXG4gICAgb25JbnB1dFBhc3RlID0gcHJvcHMub25JbnB1dFBhc3RlLFxuICAgIG9uSW5wdXRDb21wb3NpdGlvblN0YXJ0ID0gcHJvcHMub25JbnB1dENvbXBvc2l0aW9uU3RhcnQsXG4gICAgb25JbnB1dENvbXBvc2l0aW9uRW5kID0gcHJvcHMub25JbnB1dENvbXBvc2l0aW9uRW5kO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIGlucHV0Q2hhbmdlZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0SW5wdXRDaGFuZ2VkID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIGNvbWJvYm94ID0gbW9kZSA9PT0gJ2NvbWJvYm94JztcbiAgdmFyIGlucHV0RWRpdGFibGUgPSBjb21ib2JveCB8fCBzaG93U2VhcmNoO1xuICB2YXIgaXRlbSA9IHZhbHVlc1swXTtcbiAgdmFyIGlucHV0VmFsdWUgPSBzZWFyY2hWYWx1ZSB8fCAnJztcbiAgaWYgKGNvbWJvYm94ICYmIGFjdGl2ZVZhbHVlICYmICFpbnB1dENoYW5nZWQpIHtcbiAgICBpbnB1dFZhbHVlID0gYWN0aXZlVmFsdWU7XG4gIH1cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY29tYm9ib3gpIHtcbiAgICAgIHNldElucHV0Q2hhbmdlZChmYWxzZSk7XG4gICAgfVxuICB9LCBbY29tYm9ib3gsIGFjdGl2ZVZhbHVlXSk7XG5cbiAgLy8gTm90IHNob3cgdGV4dCB3aGVuIGNsb3NlZCBleHBlY3QgY29tYm9ib3ggbW9kZVxuICB2YXIgaGFzVGV4dElucHV0ID0gbW9kZSAhPT0gJ2NvbWJvYm94JyAmJiAhb3BlbiAmJiAhc2hvd1NlYXJjaCA/IGZhbHNlIDogISFpbnB1dFZhbHVlO1xuXG4gIC8vIEdldCB0aXRsZVxuICB2YXIgdGl0bGUgPSBnZXRUaXRsZShpdGVtKTtcbiAgdmFyIHJlbmRlclBsYWNlaG9sZGVyID0gZnVuY3Rpb24gcmVuZGVyUGxhY2Vob2xkZXIoKSB7XG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgaGlkZGVuU3R5bGUgPSBoYXNUZXh0SW5wdXQgPyB7XG4gICAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJ1xuICAgIH0gOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2VsZWN0aW9uLXBsYWNlaG9sZGVyXCIpLFxuICAgICAgc3R5bGU6IGhpZGRlblN0eWxlXG4gICAgfSwgcGxhY2Vob2xkZXIpO1xuICB9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNlbGVjdGlvbi1zZWFyY2hcIilcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSW5wdXQsIHtcbiAgICByZWY6IGlucHV0UmVmLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGlkOiBpZCxcbiAgICBvcGVuOiBvcGVuLFxuICAgIGlucHV0RWxlbWVudDogaW5wdXRFbGVtZW50LFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICBhdXRvRm9jdXM6IGF1dG9Gb2N1cyxcbiAgICBhdXRvQ29tcGxldGU6IGF1dG9Db21wbGV0ZSxcbiAgICBlZGl0YWJsZTogaW5wdXRFZGl0YWJsZSxcbiAgICBhY3RpdmVEZXNjZW5kYW50SWQ6IGFjdGl2ZURlc2NlbmRhbnRJZCxcbiAgICB2YWx1ZTogaW5wdXRWYWx1ZSxcbiAgICBvbktleURvd246IG9uSW5wdXRLZXlEb3duLFxuICAgIG9uTW91c2VEb3duOiBvbklucHV0TW91c2VEb3duLFxuICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShlKSB7XG4gICAgICBzZXRJbnB1dENoYW5nZWQodHJ1ZSk7XG4gICAgICBvbklucHV0Q2hhbmdlKGUpO1xuICAgIH0sXG4gICAgb25QYXN0ZTogb25JbnB1dFBhc3RlLFxuICAgIG9uQ29tcG9zaXRpb25TdGFydDogb25JbnB1dENvbXBvc2l0aW9uU3RhcnQsXG4gICAgb25Db21wb3NpdGlvbkVuZDogb25JbnB1dENvbXBvc2l0aW9uRW5kLFxuICAgIHRhYkluZGV4OiB0YWJJbmRleCxcbiAgICBhdHRyczogcGlja0F0dHJzKHByb3BzLCB0cnVlKSxcbiAgICBtYXhMZW5ndGg6IGNvbWJvYm94ID8gbWF4TGVuZ3RoIDogdW5kZWZpbmVkXG4gIH0pKSwgIWNvbWJvYm94ICYmIGl0ZW0gPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zZWxlY3Rpb24taXRlbVwiKSxcbiAgICB0aXRsZTogdGl0bGVcbiAgICAvLyDlvZMgU2VsZWN0IOW3sue7j+mAieS4remAiemhueaXtu+8jOi/mOmcgCBzZWxlY3Rpb24g6ZqQ6JeP5L2G55WZ5Zyo5Y6f5Zyw5Y2g5L2NXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMjc2ODhcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80MTUzMFxuICAgICxcbiAgICBzdHlsZTogaGFzVGV4dElucHV0ID8ge1xuICAgICAgdmlzaWJpbGl0eTogJ2hpZGRlbidcbiAgICB9IDogdW5kZWZpbmVkXG4gIH0sIGl0ZW0ubGFiZWwpIDogbnVsbCwgcmVuZGVyUGxhY2Vob2xkZXIoKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgU2luZ2xlU2VsZWN0b3I7IiwiaW1wb3J0IEtleUNvZGUgZnJvbSBcInJjLXV0aWwvZXMvS2V5Q29kZVwiO1xuXG4vKioga2V5Q29kZSBKdWRnbWVudCBmdW5jdGlvbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRhdGVPcGVuS2V5KGN1cnJlbnRLZXlDb2RlKSB7XG4gIHJldHVybiAhW1xuICAvLyBTeXN0ZW0gZnVuY3Rpb24gYnV0dG9uXG4gIEtleUNvZGUuRVNDLCBLZXlDb2RlLlNISUZULCBLZXlDb2RlLkJBQ0tTUEFDRSwgS2V5Q29kZS5UQUIsIEtleUNvZGUuV0lOX0tFWSwgS2V5Q29kZS5BTFQsIEtleUNvZGUuTUVUQSwgS2V5Q29kZS5XSU5fS0VZX1JJR0hULCBLZXlDb2RlLkNUUkwsIEtleUNvZGUuU0VNSUNPTE9OLCBLZXlDb2RlLkVRVUFMUywgS2V5Q29kZS5DQVBTX0xPQ0ssIEtleUNvZGUuQ09OVEVYVF9NRU5VLFxuICAvLyBGMS1GMTJcbiAgS2V5Q29kZS5GMSwgS2V5Q29kZS5GMiwgS2V5Q29kZS5GMywgS2V5Q29kZS5GNCwgS2V5Q29kZS5GNSwgS2V5Q29kZS5GNiwgS2V5Q29kZS5GNywgS2V5Q29kZS5GOCwgS2V5Q29kZS5GOSwgS2V5Q29kZS5GMTAsIEtleUNvZGUuRjExLCBLZXlDb2RlLkYxMl0uaW5jbHVkZXMoY3VycmVudEtleUNvZGUpO1xufSIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG4vKipcbiAqIEN1cnNvciBydWxlOlxuICogMS4gT25seSBgc2hvd1NlYXJjaGAgZW5hYmxlZFxuICogMi4gT25seSBgb3BlbmAgaXMgYHRydWVgXG4gKiAzLiBXaGVuIHR5cGluZywgc2V0IGBvcGVuYCB0byBgdHJ1ZWAgd2hpY2ggaGl0IHJ1bGUgb2YgMlxuICpcbiAqIEFjY2Vzc2liaWxpdHk6XG4gKiAtIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS1wcmFjdGljZXMvZXhhbXBsZXMvY29tYm9ib3gvYXJpYTEuMXBhdHRlcm4vbGlzdGJveC1jb21iby5odG1sXG4gKi9cblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IEtleUNvZGUgZnJvbSBcInJjLXV0aWwvZXMvS2V5Q29kZVwiO1xuaW1wb3J0IE11bHRpcGxlU2VsZWN0b3IgZnJvbSBcIi4vTXVsdGlwbGVTZWxlY3RvclwiO1xuaW1wb3J0IFNpbmdsZVNlbGVjdG9yIGZyb20gXCIuL1NpbmdsZVNlbGVjdG9yXCI7XG5pbXBvcnQgdXNlTG9jayBmcm9tIFwiLi4vaG9va3MvdXNlTG9ja1wiO1xuaW1wb3J0IHsgaXNWYWxpZGF0ZU9wZW5LZXkgfSBmcm9tIFwiLi4vdXRpbHMva2V5VXRpbFwiO1xudmFyIFNlbGVjdG9yID0gZnVuY3Rpb24gU2VsZWN0b3IocHJvcHMsIHJlZikge1xuICB2YXIgaW5wdXRSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciBjb21wb3NpdGlvblN0YXR1c1JlZiA9IHVzZVJlZihmYWxzZSk7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgb3BlbiA9IHByb3BzLm9wZW4sXG4gICAgbW9kZSA9IHByb3BzLm1vZGUsXG4gICAgc2hvd1NlYXJjaCA9IHByb3BzLnNob3dTZWFyY2gsXG4gICAgdG9rZW5XaXRoRW50ZXIgPSBwcm9wcy50b2tlbldpdGhFbnRlcixcbiAgICBhdXRvQ2xlYXJTZWFyY2hWYWx1ZSA9IHByb3BzLmF1dG9DbGVhclNlYXJjaFZhbHVlLFxuICAgIG9uU2VhcmNoID0gcHJvcHMub25TZWFyY2gsXG4gICAgb25TZWFyY2hTdWJtaXQgPSBwcm9wcy5vblNlYXJjaFN1Ym1pdCxcbiAgICBvblRvZ2dsZU9wZW4gPSBwcm9wcy5vblRvZ2dsZU9wZW4sXG4gICAgb25JbnB1dEtleURvd24gPSBwcm9wcy5vbklucHV0S2V5RG93bixcbiAgICBkb21SZWYgPSBwcm9wcy5kb21SZWY7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gUmVmID09PT09PT09PT09PT09PT09PT09PT09XG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvY3VzOiBmdW5jdGlvbiBmb2N1cygpIHtcbiAgICAgICAgaW5wdXRSZWYuY3VycmVudC5mb2N1cygpO1xuICAgICAgfSxcbiAgICAgIGJsdXI6IGZ1bmN0aW9uIGJsdXIoKSB7XG4gICAgICAgIGlucHV0UmVmLmN1cnJlbnQuYmx1cigpO1xuICAgICAgfVxuICAgIH07XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gSW5wdXQgPT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZUxvY2sgPSB1c2VMb2NrKDApLFxuICAgIF91c2VMb2NrMiA9IF9zbGljZWRUb0FycmF5KF91c2VMb2NrLCAyKSxcbiAgICBnZXRJbnB1dE1vdXNlRG93biA9IF91c2VMb2NrMlswXSxcbiAgICBzZXRJbnB1dE1vdXNlRG93biA9IF91c2VMb2NrMlsxXTtcbiAgdmFyIG9uSW50ZXJuYWxJbnB1dEtleURvd24gPSBmdW5jdGlvbiBvbkludGVybmFsSW5wdXRLZXlEb3duKGV2ZW50KSB7XG4gICAgdmFyIHdoaWNoID0gZXZlbnQud2hpY2g7XG4gICAgaWYgKHdoaWNoID09PSBLZXlDb2RlLlVQIHx8IHdoaWNoID09PSBLZXlDb2RlLkRPV04pIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGlmIChvbklucHV0S2V5RG93bikge1xuICAgICAgb25JbnB1dEtleURvd24oZXZlbnQpO1xuICAgIH1cbiAgICBpZiAod2hpY2ggPT09IEtleUNvZGUuRU5URVIgJiYgbW9kZSA9PT0gJ3RhZ3MnICYmICFjb21wb3NpdGlvblN0YXR1c1JlZi5jdXJyZW50ICYmICFvcGVuKSB7XG4gICAgICAvLyBXaGVuIG1lbnUgaXNuJ3Qgb3BlbiwgT3B0aW9uTGlzdCB3b24ndCB0cmlnZ2VyIGEgdmFsdWUgY2hhbmdlXG4gICAgICAvLyBTbyB3aGVuIGVudGVyIGlzIHByZXNzZWQsIHRoZSB0YWcncyBpbnB1dCB2YWx1ZSBzaG91bGQgYmUgZW1pdHRlZCBoZXJlIHRvIGxldCBzZWxlY3RvciBrbm93XG4gICAgICBvblNlYXJjaFN1Ym1pdCA9PT0gbnVsbCB8fCBvblNlYXJjaFN1Ym1pdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25TZWFyY2hTdWJtaXQoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICB9XG4gICAgaWYgKGlzVmFsaWRhdGVPcGVuS2V5KHdoaWNoKSkge1xuICAgICAgb25Ub2dnbGVPcGVuKHRydWUpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogV2UgY2FuIG5vdCB1c2UgYGZpbmRET01Ob2RlYCBzaW5lIGl0IHdpbGwgZ2V0IHdhcm5pbmcsXG4gICAqIGhhdmUgdG8gdXNlIHRpbWVyIHRvIGNoZWNrIGlmIGlzIGlucHV0IGVsZW1lbnQuXG4gICAqL1xuICB2YXIgb25JbnRlcm5hbElucHV0TW91c2VEb3duID0gZnVuY3Rpb24gb25JbnRlcm5hbElucHV0TW91c2VEb3duKCkge1xuICAgIHNldElucHV0TW91c2VEb3duKHRydWUpO1xuICB9O1xuXG4gIC8vIFdoZW4gcGFzdGUgY29tZSwgaWdub3JlIG5leHQgb25DaGFuZ2VcbiAgdmFyIHBhc3RlZFRleHRSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciB0cmlnZ2VyT25TZWFyY2ggPSBmdW5jdGlvbiB0cmlnZ2VyT25TZWFyY2godmFsdWUpIHtcbiAgICBpZiAob25TZWFyY2godmFsdWUsIHRydWUsIGNvbXBvc2l0aW9uU3RhdHVzUmVmLmN1cnJlbnQpICE9PSBmYWxzZSkge1xuICAgICAgb25Ub2dnbGVPcGVuKHRydWUpO1xuICAgIH1cbiAgfTtcbiAgdmFyIG9uSW5wdXRDb21wb3NpdGlvblN0YXJ0ID0gZnVuY3Rpb24gb25JbnB1dENvbXBvc2l0aW9uU3RhcnQoKSB7XG4gICAgY29tcG9zaXRpb25TdGF0dXNSZWYuY3VycmVudCA9IHRydWU7XG4gIH07XG4gIHZhciBvbklucHV0Q29tcG9zaXRpb25FbmQgPSBmdW5jdGlvbiBvbklucHV0Q29tcG9zaXRpb25FbmQoZSkge1xuICAgIGNvbXBvc2l0aW9uU3RhdHVzUmVmLmN1cnJlbnQgPSBmYWxzZTtcblxuICAgIC8vIFRyaWdnZXIgc2VhcmNoIGFnYWluIHRvIHN1cHBvcnQgYHRva2VuU2VwYXJhdG9yc2Agd2l0aCB0eXBld3JpdGluZ1xuICAgIGlmIChtb2RlICE9PSAnY29tYm9ib3gnKSB7XG4gICAgICB0cmlnZ2VyT25TZWFyY2goZS50YXJnZXQudmFsdWUpO1xuICAgIH1cbiAgfTtcbiAgdmFyIG9uSW5wdXRDaGFuZ2UgPSBmdW5jdGlvbiBvbklucHV0Q2hhbmdlKGV2ZW50KSB7XG4gICAgdmFyIHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuXG4gICAgLy8gUGFzdGVkIHRleHQgc2hvdWxkIHJlcGxhY2UgYmFjayB0byBvcmlnaW4gY29udGVudFxuICAgIGlmICh0b2tlbldpdGhFbnRlciAmJiBwYXN0ZWRUZXh0UmVmLmN1cnJlbnQgJiYgL1tcXHJcXG5dLy50ZXN0KHBhc3RlZFRleHRSZWYuY3VycmVudCkpIHtcbiAgICAgIC8vIENSTEYgd2lsbCBiZSB0cmVhdGVkIGFzIGEgc2luZ2xlIHNwYWNlIGZvciBpbnB1dCBlbGVtZW50XG4gICAgICB2YXIgcmVwbGFjZWRUZXh0ID0gcGFzdGVkVGV4dFJlZi5jdXJyZW50LnJlcGxhY2UoL1tcXHJcXG5dKyQvLCAnJykucmVwbGFjZSgvXFxyXFxuL2csICcgJykucmVwbGFjZSgvW1xcclxcbl0vZywgJyAnKTtcbiAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShyZXBsYWNlZFRleHQsIHBhc3RlZFRleHRSZWYuY3VycmVudCk7XG4gICAgfVxuICAgIHBhc3RlZFRleHRSZWYuY3VycmVudCA9IG51bGw7XG4gICAgdHJpZ2dlck9uU2VhcmNoKHZhbHVlKTtcbiAgfTtcbiAgdmFyIG9uSW5wdXRQYXN0ZSA9IGZ1bmN0aW9uIG9uSW5wdXRQYXN0ZShlKSB7XG4gICAgdmFyIGNsaXBib2FyZERhdGEgPSBlLmNsaXBib2FyZERhdGE7XG4gICAgdmFyIHZhbHVlID0gY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XG4gICAgcGFzdGVkVGV4dFJlZi5jdXJyZW50ID0gdmFsdWU7XG4gIH07XG4gIHZhciBvbkNsaWNrID0gZnVuY3Rpb24gb25DbGljayhfcmVmKSB7XG4gICAgdmFyIHRhcmdldCA9IF9yZWYudGFyZ2V0O1xuICAgIGlmICh0YXJnZXQgIT09IGlucHV0UmVmLmN1cnJlbnQpIHtcbiAgICAgIC8vIFNob3VsZCBmb2N1cyBpbnB1dCBpZiBjbGljayB0aGUgc2VsZWN0b3JcbiAgICAgIHZhciBpc0lFID0gZG9jdW1lbnQuYm9keS5zdHlsZS5tc1RvdWNoQWN0aW9uICE9PSB1bmRlZmluZWQ7XG4gICAgICBpZiAoaXNJRSkge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpbnB1dFJlZi5jdXJyZW50LmZvY3VzKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5wdXRSZWYuY3VycmVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgdmFyIG9uTW91c2VEb3duID0gZnVuY3Rpb24gb25Nb3VzZURvd24oZXZlbnQpIHtcbiAgICB2YXIgaW5wdXRNb3VzZURvd24gPSBnZXRJbnB1dE1vdXNlRG93bigpO1xuXG4gICAgLy8gd2hlbiBtb2RlIGlzIGNvbWJvYm94LCBkb24ndCBwcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3JcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8zNzMyMFxuICAgIGlmIChldmVudC50YXJnZXQgIT09IGlucHV0UmVmLmN1cnJlbnQgJiYgIWlucHV0TW91c2VEb3duICYmIG1vZGUgIT09ICdjb21ib2JveCcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGlmIChtb2RlICE9PSAnY29tYm9ib3gnICYmICghc2hvd1NlYXJjaCB8fCAhaW5wdXRNb3VzZURvd24pIHx8ICFvcGVuKSB7XG4gICAgICBpZiAob3BlbiAmJiBhdXRvQ2xlYXJTZWFyY2hWYWx1ZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgb25TZWFyY2goJycsIHRydWUsIGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIG9uVG9nZ2xlT3BlbigpO1xuICAgIH1cbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PSBJbm5lciBTZWxlY3RvciA9PT09PT09PT09PT09PT09PT1cbiAgdmFyIHNoYXJlZFByb3BzID0ge1xuICAgIGlucHV0UmVmOiBpbnB1dFJlZixcbiAgICBvbklucHV0S2V5RG93bjogb25JbnRlcm5hbElucHV0S2V5RG93bixcbiAgICBvbklucHV0TW91c2VEb3duOiBvbkludGVybmFsSW5wdXRNb3VzZURvd24sXG4gICAgb25JbnB1dENoYW5nZTogb25JbnB1dENoYW5nZSxcbiAgICBvbklucHV0UGFzdGU6IG9uSW5wdXRQYXN0ZSxcbiAgICBvbklucHV0Q29tcG9zaXRpb25TdGFydDogb25JbnB1dENvbXBvc2l0aW9uU3RhcnQsXG4gICAgb25JbnB1dENvbXBvc2l0aW9uRW5kOiBvbklucHV0Q29tcG9zaXRpb25FbmRcbiAgfTtcbiAgdmFyIHNlbGVjdE5vZGUgPSBtb2RlID09PSAnbXVsdGlwbGUnIHx8IG1vZGUgPT09ICd0YWdzJyA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE11bHRpcGxlU2VsZWN0b3IsIF9leHRlbmRzKHt9LCBwcm9wcywgc2hhcmVkUHJvcHMpKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNpbmdsZVNlbGVjdG9yLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHNoYXJlZFByb3BzKSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgcmVmOiBkb21SZWYsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNlbGVjdG9yXCIpLFxuICAgIG9uQ2xpY2s6IG9uQ2xpY2ssXG4gICAgb25Nb3VzZURvd246IG9uTW91c2VEb3duXG4gIH0sIHNlbGVjdE5vZGUpO1xufTtcbnZhciBGb3J3YXJkU2VsZWN0b3IgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihTZWxlY3Rvcik7XG5Gb3J3YXJkU2VsZWN0b3IuZGlzcGxheU5hbWUgPSAnU2VsZWN0b3InO1xuZXhwb3J0IGRlZmF1bHQgRm9yd2FyZFNlbGVjdG9yOyIsImltcG9ydCB7IHVzZVJlZiwgdXNlRWZmZWN0LCBmb3J3YXJkUmVmLCB1c2VJbXBlcmF0aXZlSGFuZGxlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgY2FuVXNlRG9tIGZyb20gXCIuL0RvbS9jYW5Vc2VEb21cIjtcbnZhciBQb3J0YWwgPSAvKiNfX1BVUkVfXyovZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgZGlkVXBkYXRlID0gcHJvcHMuZGlkVXBkYXRlLFxuICAgIGdldENvbnRhaW5lciA9IHByb3BzLmdldENvbnRhaW5lcixcbiAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuICB2YXIgcGFyZW50UmVmID0gdXNlUmVmKCk7XG4gIHZhciBjb250YWluZXJSZWYgPSB1c2VSZWYoKTtcblxuICAvLyBSZWYgcmV0dXJuIG5vdGhpbmcsIG9ubHkgZm9yIHdyYXBwZXIgY2hlY2sgZXhpc3RcbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge307XG4gIH0pO1xuXG4gIC8vIENyZWF0ZSBjb250YWluZXIgaW4gY2xpZW50IHNpZGUgd2l0aCBzeW5jIHRvIGF2b2lkIHVzZUVmZmVjdCBub3QgZ2V0IHJlZlxuICB2YXIgaW5pdFJlZiA9IHVzZVJlZihmYWxzZSk7XG4gIGlmICghaW5pdFJlZi5jdXJyZW50ICYmIGNhblVzZURvbSgpKSB7XG4gICAgY29udGFpbmVyUmVmLmN1cnJlbnQgPSBnZXRDb250YWluZXIoKTtcbiAgICBwYXJlbnRSZWYuY3VycmVudCA9IGNvbnRhaW5lclJlZi5jdXJyZW50LnBhcmVudE5vZGU7XG4gICAgaW5pdFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIFtMZWdhY3ldIFVzZWQgYnkgYHJjLXRyaWdnZXJgXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgZGlkVXBkYXRlID09PSBudWxsIHx8IGRpZFVwZGF0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGlkVXBkYXRlKHByb3BzKTtcbiAgfSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgLy8gUmVzdG9yZSBjb250YWluZXIgdG8gb3JpZ2luYWwgcGxhY2VcbiAgICAvLyBSZWFjdCAxOCBTdHJpY3RNb2RlIHdpbGwgdW5tb3VudCBmaXJzdCBhbmQgbW91bnQgYmFjayBmb3IgZWZmZWN0IHRlc3Q6XG4gICAgLy8gaHR0cHM6Ly9yZWFjdGpzLm9yZy9ibG9nLzIwMjIvMDMvMjkvcmVhY3QtdjE4Lmh0bWwjbmV3LXN0cmljdC1tb2RlLWJlaGF2aW9yc1xuICAgIGlmIChjb250YWluZXJSZWYuY3VycmVudC5wYXJlbnROb2RlID09PSBudWxsICYmIHBhcmVudFJlZi5jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICBwYXJlbnRSZWYuY3VycmVudC5hcHBlbmRDaGlsZChjb250YWluZXJSZWYuY3VycmVudCk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX2NvbnRhaW5lclJlZiRjdXJyZW50LCBfY29udGFpbmVyUmVmJGN1cnJlbnQyO1xuICAgICAgLy8gW0xlZ2FjeV0gVGhpcyBzaG91bGQgbm90IGJlIGhhbmRsZSBieSBQb3J0YWwgYnV0IHBhcmVudCBQb3J0YWxXcmFwcGVyIGluc3RlYWQuXG4gICAgICAvLyBTaW5jZSBzb21lIGNvbXBvbmVudCB1c2UgYFBvcnRhbGAgZGlyZWN0bHksIHdlIGhhdmUgdG8ga2VlcCB0aGUgbG9naWMgaGVyZS5cbiAgICAgIChfY29udGFpbmVyUmVmJGN1cnJlbnQgPSBjb250YWluZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2NvbnRhaW5lclJlZiRjdXJyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX2NvbnRhaW5lclJlZiRjdXJyZW50MiA9IF9jb250YWluZXJSZWYkY3VycmVudC5wYXJlbnROb2RlKSA9PT0gbnVsbCB8fCBfY29udGFpbmVyUmVmJGN1cnJlbnQyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY29udGFpbmVyUmVmJGN1cnJlbnQyLnJlbW92ZUNoaWxkKGNvbnRhaW5lclJlZi5jdXJyZW50KTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiBjb250YWluZXJSZWYuY3VycmVudCA/IC8qI19fUFVSRV9fKi9SZWFjdERPTS5jcmVhdGVQb3J0YWwoY2hpbGRyZW4sIGNvbnRhaW5lclJlZi5jdXJyZW50KSA6IG51bGw7XG59KTtcbmV4cG9ydCBkZWZhdWx0IFBvcnRhbDsiLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuXG5mdW5jdGlvbiBpc1BvaW50c0VxKGExLCBhMiwgaXNBbGlnblBvaW50KSB7XG4gIGlmIChpc0FsaWduUG9pbnQpIHtcbiAgICByZXR1cm4gYTFbMF0gPT09IGEyWzBdO1xuICB9XG5cbiAgcmV0dXJuIGExWzBdID09PSBhMlswXSAmJiBhMVsxXSA9PT0gYTJbMV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGlnbkZyb21QbGFjZW1lbnQoYnVpbHRpblBsYWNlbWVudHMsIHBsYWNlbWVudFN0ciwgYWxpZ24pIHtcbiAgdmFyIGJhc2VBbGlnbiA9IGJ1aWx0aW5QbGFjZW1lbnRzW3BsYWNlbWVudFN0cl0gfHwge307XG4gIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGJhc2VBbGlnbiksIGFsaWduKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGlnblBvcHVwQ2xhc3NOYW1lKGJ1aWx0aW5QbGFjZW1lbnRzLCBwcmVmaXhDbHMsIGFsaWduLCBpc0FsaWduUG9pbnQpIHtcbiAgdmFyIHBvaW50cyA9IGFsaWduLnBvaW50cztcbiAgdmFyIHBsYWNlbWVudHMgPSBPYmplY3Qua2V5cyhidWlsdGluUGxhY2VtZW50cyk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwbGFjZW1lbnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIHBsYWNlbWVudCA9IHBsYWNlbWVudHNbaV07XG5cbiAgICBpZiAoaXNQb2ludHNFcShidWlsdGluUGxhY2VtZW50c1twbGFjZW1lbnRdLnBvaW50cywgcG9pbnRzLCBpc0FsaWduUG9pbnQpKSB7XG4gICAgICByZXR1cm4gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wbGFjZW1lbnQtXCIpLmNvbmNhdChwbGFjZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn0iLCJleHBvcnQgZnVuY3Rpb24gZ2V0TW90aW9uKF9yZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgICAgbW90aW9uID0gX3JlZi5tb3Rpb24sXG4gICAgICBhbmltYXRpb24gPSBfcmVmLmFuaW1hdGlvbixcbiAgICAgIHRyYW5zaXRpb25OYW1lID0gX3JlZi50cmFuc2l0aW9uTmFtZTtcblxuICBpZiAobW90aW9uKSB7XG4gICAgcmV0dXJuIG1vdGlvbjtcbiAgfVxuXG4gIGlmIChhbmltYXRpb24pIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW90aW9uTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KGFuaW1hdGlvbilcbiAgICB9O1xuICB9XG5cbiAgaWYgKHRyYW5zaXRpb25OYW1lKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vdGlvbk5hbWU6IHRyYW5zaXRpb25OYW1lXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufSIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IENTU01vdGlvbiBmcm9tICdyYy1tb3Rpb24nO1xuaW1wb3J0IHsgZ2V0TW90aW9uIH0gZnJvbSBcIi4uL3V0aWxzL2xlZ2FjeVV0aWxcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE1hc2socHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIHZpc2libGUgPSBwcm9wcy52aXNpYmxlLFxuICAgICAgekluZGV4ID0gcHJvcHMuekluZGV4LFxuICAgICAgbWFzayA9IHByb3BzLm1hc2ssXG4gICAgICBtYXNrTW90aW9uID0gcHJvcHMubWFza01vdGlvbixcbiAgICAgIG1hc2tBbmltYXRpb24gPSBwcm9wcy5tYXNrQW5pbWF0aW9uLFxuICAgICAgbWFza1RyYW5zaXRpb25OYW1lID0gcHJvcHMubWFza1RyYW5zaXRpb25OYW1lO1xuXG4gIGlmICghbWFzaykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG1vdGlvbiA9IHt9O1xuXG4gIGlmIChtYXNrTW90aW9uIHx8IG1hc2tUcmFuc2l0aW9uTmFtZSB8fCBtYXNrQW5pbWF0aW9uKSB7XG4gICAgbW90aW9uID0gX29iamVjdFNwcmVhZCh7XG4gICAgICBtb3Rpb25BcHBlYXI6IHRydWVcbiAgICB9LCBnZXRNb3Rpb24oe1xuICAgICAgbW90aW9uOiBtYXNrTW90aW9uLFxuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICB0cmFuc2l0aW9uTmFtZTogbWFza1RyYW5zaXRpb25OYW1lLFxuICAgICAgYW5pbWF0aW9uOiBtYXNrQW5pbWF0aW9uXG4gICAgfSkpO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENTU01vdGlvbiwgX2V4dGVuZHMoe30sIG1vdGlvbiwge1xuICAgIHZpc2libGU6IHZpc2libGUsXG4gICAgcmVtb3ZlT25MZWF2ZTogdHJ1ZVxuICB9KSwgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWU7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIHpJbmRleDogekluZGV4XG4gICAgICB9LFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbWFza1wiKSwgY2xhc3NOYW1lKVxuICAgIH0pO1xuICB9KTtcbn0iLCJmdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7XG4gICAgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cbiAgcmV0dXJuIGtleXM7XG59XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkMih0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTtcbiAgICBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgIH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gdGFyZ2V0O1xufVxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICB9IDogZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gIH0sIF90eXBlb2Yob2JqKTtcbn1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cblxudmFyIHZlbmRvclByZWZpeDtcbnZhciBqc0Nzc01hcCA9IHtcbiAgV2Via2l0OiAnLXdlYmtpdC0nLFxuICBNb3o6ICctbW96LScsXG4gIC8vIElFIGRpZCBpdCB3cm9uZyBhZ2FpbiAuLi5cbiAgbXM6ICctbXMtJyxcbiAgTzogJy1vLSdcbn07XG5mdW5jdGlvbiBnZXRWZW5kb3JQcmVmaXgoKSB7XG4gIGlmICh2ZW5kb3JQcmVmaXggIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB2ZW5kb3JQcmVmaXg7XG4gIH1cbiAgdmVuZG9yUHJlZml4ID0gJyc7XG4gIHZhciBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKS5zdHlsZTtcbiAgdmFyIHRlc3RQcm9wID0gJ1RyYW5zZm9ybSc7XG4gIGZvciAodmFyIGtleSBpbiBqc0Nzc01hcCkge1xuICAgIGlmIChrZXkgKyB0ZXN0UHJvcCBpbiBzdHlsZSkge1xuICAgICAgdmVuZG9yUHJlZml4ID0ga2V5O1xuICAgIH1cbiAgfVxuICByZXR1cm4gdmVuZG9yUHJlZml4O1xufVxuZnVuY3Rpb24gZ2V0VHJhbnNpdGlvbk5hbWUoKSB7XG4gIHJldHVybiBnZXRWZW5kb3JQcmVmaXgoKSA/IFwiXCIuY29uY2F0KGdldFZlbmRvclByZWZpeCgpLCBcIlRyYW5zaXRpb25Qcm9wZXJ0eVwiKSA6ICd0cmFuc2l0aW9uUHJvcGVydHknO1xufVxuZnVuY3Rpb24gZ2V0VHJhbnNmb3JtTmFtZSgpIHtcbiAgcmV0dXJuIGdldFZlbmRvclByZWZpeCgpID8gXCJcIi5jb25jYXQoZ2V0VmVuZG9yUHJlZml4KCksIFwiVHJhbnNmb3JtXCIpIDogJ3RyYW5zZm9ybSc7XG59XG5mdW5jdGlvbiBzZXRUcmFuc2l0aW9uUHJvcGVydHkobm9kZSwgdmFsdWUpIHtcbiAgdmFyIG5hbWUgPSBnZXRUcmFuc2l0aW9uTmFtZSgpO1xuICBpZiAobmFtZSkge1xuICAgIG5vZGUuc3R5bGVbbmFtZV0gPSB2YWx1ZTtcbiAgICBpZiAobmFtZSAhPT0gJ3RyYW5zaXRpb25Qcm9wZXJ0eScpIHtcbiAgICAgIG5vZGUuc3R5bGUudHJhbnNpdGlvblByb3BlcnR5ID0gdmFsdWU7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBzZXRUcmFuc2Zvcm0obm9kZSwgdmFsdWUpIHtcbiAgdmFyIG5hbWUgPSBnZXRUcmFuc2Zvcm1OYW1lKCk7XG4gIGlmIChuYW1lKSB7XG4gICAgbm9kZS5zdHlsZVtuYW1lXSA9IHZhbHVlO1xuICAgIGlmIChuYW1lICE9PSAndHJhbnNmb3JtJykge1xuICAgICAgbm9kZS5zdHlsZS50cmFuc2Zvcm0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFRyYW5zaXRpb25Qcm9wZXJ0eShub2RlKSB7XG4gIHJldHVybiBub2RlLnN0eWxlLnRyYW5zaXRpb25Qcm9wZXJ0eSB8fCBub2RlLnN0eWxlW2dldFRyYW5zaXRpb25OYW1lKCldO1xufVxuZnVuY3Rpb24gZ2V0VHJhbnNmb3JtWFkobm9kZSkge1xuICB2YXIgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKTtcbiAgdmFyIHRyYW5zZm9ybSA9IHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3RyYW5zZm9ybScpIHx8IHN0eWxlLmdldFByb3BlcnR5VmFsdWUoZ2V0VHJhbnNmb3JtTmFtZSgpKTtcbiAgaWYgKHRyYW5zZm9ybSAmJiB0cmFuc2Zvcm0gIT09ICdub25lJykge1xuICAgIHZhciBtYXRyaXggPSB0cmFuc2Zvcm0ucmVwbGFjZSgvW14wLTlcXC0uLF0vZywgJycpLnNwbGl0KCcsJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHBhcnNlRmxvYXQobWF0cml4WzEyXSB8fCBtYXRyaXhbNF0sIDApLFxuICAgICAgeTogcGFyc2VGbG9hdChtYXRyaXhbMTNdIHx8IG1hdHJpeFs1XSwgMClcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG59XG52YXIgbWF0cml4MmQgPSAvbWF0cml4XFwoKC4qKVxcKS87XG52YXIgbWF0cml4M2QgPSAvbWF0cml4M2RcXCgoLiopXFwpLztcbmZ1bmN0aW9uIHNldFRyYW5zZm9ybVhZKG5vZGUsIHh5KSB7XG4gIHZhciBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpO1xuICB2YXIgdHJhbnNmb3JtID0gc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgndHJhbnNmb3JtJykgfHwgc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShnZXRUcmFuc2Zvcm1OYW1lKCkpO1xuICBpZiAodHJhbnNmb3JtICYmIHRyYW5zZm9ybSAhPT0gJ25vbmUnKSB7XG4gICAgdmFyIGFycjtcbiAgICB2YXIgbWF0Y2gyZCA9IHRyYW5zZm9ybS5tYXRjaChtYXRyaXgyZCk7XG4gICAgaWYgKG1hdGNoMmQpIHtcbiAgICAgIG1hdGNoMmQgPSBtYXRjaDJkWzFdO1xuICAgICAgYXJyID0gbWF0Y2gyZC5zcGxpdCgnLCcpLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChpdGVtLCAxMCk7XG4gICAgICB9KTtcbiAgICAgIGFycls0XSA9IHh5Lng7XG4gICAgICBhcnJbNV0gPSB4eS55O1xuICAgICAgc2V0VHJhbnNmb3JtKG5vZGUsIFwibWF0cml4KFwiLmNvbmNhdChhcnIuam9pbignLCcpLCBcIilcIikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbWF0Y2gzZCA9IHRyYW5zZm9ybS5tYXRjaChtYXRyaXgzZClbMV07XG4gICAgICBhcnIgPSBtYXRjaDNkLnNwbGl0KCcsJykubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KGl0ZW0sIDEwKTtcbiAgICAgIH0pO1xuICAgICAgYXJyWzEyXSA9IHh5Lng7XG4gICAgICBhcnJbMTNdID0geHkueTtcbiAgICAgIHNldFRyYW5zZm9ybShub2RlLCBcIm1hdHJpeDNkKFwiLmNvbmNhdChhcnIuam9pbignLCcpLCBcIilcIikpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzZXRUcmFuc2Zvcm0obm9kZSwgXCJ0cmFuc2xhdGVYKFwiLmNvbmNhdCh4eS54LCBcInB4KSB0cmFuc2xhdGVZKFwiKS5jb25jYXQoeHkueSwgXCJweCkgdHJhbnNsYXRlWigwKVwiKSk7XG4gIH1cbn1cblxudmFyIFJFX05VTSA9IC9bXFwtK10/KD86XFxkKlxcLnwpXFxkKyg/OltlRV1bXFwtK10/XFxkK3wpLy5zb3VyY2U7XG52YXIgZ2V0Q29tcHV0ZWRTdHlsZVg7XG5cbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zNDg1NjU0LzMwNDA2MDVcbmZ1bmN0aW9uIGZvcmNlUmVsYXlvdXQoZWxlbSkge1xuICB2YXIgb3JpZ2luYWxTdHlsZSA9IGVsZW0uc3R5bGUuZGlzcGxheTtcbiAgZWxlbS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBlbGVtLm9mZnNldEhlaWdodDsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICBlbGVtLnN0eWxlLmRpc3BsYXkgPSBvcmlnaW5hbFN0eWxlO1xufVxuZnVuY3Rpb24gY3NzKGVsLCBuYW1lLCB2KSB7XG4gIHZhciB2YWx1ZSA9IHY7XG4gIGlmIChfdHlwZW9mKG5hbWUpID09PSAnb2JqZWN0Jykge1xuICAgIGZvciAodmFyIGkgaW4gbmFtZSkge1xuICAgICAgaWYgKG5hbWUuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgY3NzKGVsLCBpLCBuYW1lW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICB2YWx1ZSA9IFwiXCIuY29uY2F0KHZhbHVlLCBcInB4XCIpO1xuICAgIH1cbiAgICBlbC5zdHlsZVtuYW1lXSA9IHZhbHVlO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIGdldENvbXB1dGVkU3R5bGVYKGVsLCBuYW1lKTtcbn1cbmZ1bmN0aW9uIGdldENsaWVudFBvc2l0aW9uKGVsZW0pIHtcbiAgdmFyIGJveDtcbiAgdmFyIHg7XG4gIHZhciB5O1xuICB2YXIgZG9jID0gZWxlbS5vd25lckRvY3VtZW50O1xuICB2YXIgYm9keSA9IGRvYy5ib2R5O1xuICB2YXIgZG9jRWxlbSA9IGRvYyAmJiBkb2MuZG9jdW1lbnRFbGVtZW50O1xuICAvLyDmoLnmja4gR0JTIOacgOaWsOaVsOaNru+8jEEtR3JhZGUgQnJvd3NlcnMg6YO95bey5pSv5oyBIGdldEJvdW5kaW5nQ2xpZW50UmVjdCDmlrnms5XvvIzkuI3nlKjlho3ogIPomZHkvKDnu5/nmoTlrp7njrDmlrnlvI9cbiAgYm94ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAvLyDms6jvvJpqUXVlcnkg6L+Y6ICD6JmR5YeP5Y67IGRvY0VsZW0uY2xpZW50TGVmdC9jbGllbnRUb3BcbiAgLy8g5L2G5rWL6K+V5Y+R546w77yM6L+Z5qC35Y+N6ICM5Lya5a+86Ie05b2TIGh0bWwg5ZKMIGJvZHkg5pyJ6L656LedL+i+ueahhuagt+W8j+aXtu+8jOiOt+WPlueahOWAvOS4jeato+ehrlxuICAvLyDmraTlpJbvvIxpZTYg5Lya5b+955WlIGh0bWwg55qEIG1hcmdpbiDlgLzvvIzlubjov5DlnLDmmK/msqHmnInosIHkvJrljrvorr7nva4gaHRtbCDnmoQgbWFyZ2luXG5cbiAgeCA9IE1hdGguZmxvb3IoYm94LmxlZnQpO1xuICB5ID0gTWF0aC5mbG9vcihib3gudG9wKTtcblxuICAvLyBJbiBJRSwgbW9zdCBvZiB0aGUgdGltZSwgMiBleHRyYSBwaXhlbHMgYXJlIGFkZGVkIHRvIHRoZSB0b3AgYW5kIGxlZnRcbiAgLy8gZHVlIHRvIHRoZSBpbXBsaWNpdCAyLXBpeGVsIGluc2V0IGJvcmRlci4gIEluIElFNi83IHF1aXJrcyBtb2RlIGFuZFxuICAvLyBJRTYgc3RhbmRhcmRzIG1vZGUsIHRoaXMgYm9yZGVyIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHNldHRpbmcgdGhlXG4gIC8vIGRvY3VtZW50IGVsZW1lbnQncyBib3JkZXIgdG8gemVybyAtLSB0aHVzLCB3ZSBjYW5ub3QgcmVseSBvbiB0aGVcbiAgLy8gb2Zmc2V0IGFsd2F5cyBiZWluZyAyIHBpeGVscy5cblxuICAvLyBJbiBxdWlya3MgbW9kZSwgdGhlIG9mZnNldCBjYW4gYmUgZGV0ZXJtaW5lZCBieSBxdWVyeWluZyB0aGUgYm9keSdzXG4gIC8vIGNsaWVudExlZnQvY2xpZW50VG9wLCBidXQgaW4gc3RhbmRhcmRzIG1vZGUsIGl0IGlzIGZvdW5kIGJ5IHF1ZXJ5aW5nXG4gIC8vIHRoZSBkb2N1bWVudCBlbGVtZW50J3MgY2xpZW50TGVmdC9jbGllbnRUb3AuICBTaW5jZSB3ZSBhbHJlYWR5IGNhbGxlZFxuICAvLyBnZXRDbGllbnRCb3VuZGluZ1JlY3Qgd2UgaGF2ZSBhbHJlYWR5IGZvcmNlZCBhIHJlZmxvdywgc28gaXQgaXMgbm90XG4gIC8vIHRvbyBleHBlbnNpdmUganVzdCB0byBxdWVyeSB0aGVtIGFsbC5cblxuICAvLyBpZSDkuIvlupTor6Xlh4/ljrvnqpflj6PnmoTovrnmoYblkKfvvIzmr5Xnq5/pu5jorqQgYWJzb2x1dGUg6YO95piv55u45a+556qX5Y+j5a6a5L2N55qEXG4gIC8vIOeql+WPo+i+ueahhuagh+WHhuaYr+iuviBkb2N1bWVudEVsZW1lbnQgLHF1aXJrcyDml7borr7nva4gYm9keVxuICAvLyDmnIDlpb3npoHmraLlnKggYm9keSDlkowgaHRtbCDkuIrovrnmoYYg77yM5L2GIGllIDwgOSBodG1sIOm7mOiupOaciSAycHgg77yM5YeP5Y67XG4gIC8vIOS9huaYr+mdniBpZSDkuI3lj6/og73orr7nva7nqpflj6PovrnmoYbvvIxib2R5IGh0bWwg5Lmf5LiN5piv56qX5Y+jICxpZSDlj6/ku6XpgJrov4cgaHRtbCxib2R5IOiuvue9rlxuICAvLyDmoIflh4YgaWUg5LiLIGRvY0VsZW0uY2xpZW50VG9wIOWwseaYryBib3JkZXItdG9wXG4gIC8vIGllNyBodG1sIOWNs+eql+WPo+i+ueahhuaUueWPmOS4jeS6huOAguawuOi/nOS4uiAyXG4gIC8vIOS9huagh+WHhiBmaXJlZm94L2Nocm9tZS9pZTkg5LiLIGRvY0VsZW0uY2xpZW50VG9wIOaYr+eql+WPo+i+ueahhu+8jOWNs+S9v+iuvuS6hiBib3JkZXItdG9wIOS5n+S4uiAwXG5cbiAgeCAtPSBkb2NFbGVtLmNsaWVudExlZnQgfHwgYm9keS5jbGllbnRMZWZ0IHx8IDA7XG4gIHkgLT0gZG9jRWxlbS5jbGllbnRUb3AgfHwgYm9keS5jbGllbnRUb3AgfHwgMDtcbiAgcmV0dXJuIHtcbiAgICBsZWZ0OiB4LFxuICAgIHRvcDogeVxuICB9O1xufVxuZnVuY3Rpb24gZ2V0U2Nyb2xsKHcsIHRvcCkge1xuICB2YXIgcmV0ID0gd1tcInBhZ2VcIi5jb25jYXQodG9wID8gJ1knIDogJ1gnLCBcIk9mZnNldFwiKV07XG4gIHZhciBtZXRob2QgPSBcInNjcm9sbFwiLmNvbmNhdCh0b3AgPyAnVG9wJyA6ICdMZWZ0Jyk7XG4gIGlmICh0eXBlb2YgcmV0ICE9PSAnbnVtYmVyJykge1xuICAgIHZhciBkID0gdy5kb2N1bWVudDtcbiAgICAvLyBpZTYsNyw4IHN0YW5kYXJkIG1vZGVcbiAgICByZXQgPSBkLmRvY3VtZW50RWxlbWVudFttZXRob2RdO1xuICAgIGlmICh0eXBlb2YgcmV0ICE9PSAnbnVtYmVyJykge1xuICAgICAgLy8gcXVpcmtzIG1vZGVcbiAgICAgIHJldCA9IGQuYm9keVttZXRob2RdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuZnVuY3Rpb24gZ2V0U2Nyb2xsTGVmdCh3KSB7XG4gIHJldHVybiBnZXRTY3JvbGwodyk7XG59XG5mdW5jdGlvbiBnZXRTY3JvbGxUb3Aodykge1xuICByZXR1cm4gZ2V0U2Nyb2xsKHcsIHRydWUpO1xufVxuZnVuY3Rpb24gZ2V0T2Zmc2V0KGVsKSB7XG4gIHZhciBwb3MgPSBnZXRDbGllbnRQb3NpdGlvbihlbCk7XG4gIHZhciBkb2MgPSBlbC5vd25lckRvY3VtZW50O1xuICB2YXIgdyA9IGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93O1xuICBwb3MubGVmdCArPSBnZXRTY3JvbGxMZWZ0KHcpO1xuICBwb3MudG9wICs9IGdldFNjcm9sbFRvcCh3KTtcbiAgcmV0dXJuIHBvcztcbn1cblxuLyoqXG4gKiBBIGNydWRlIHdheSBvZiBkZXRlcm1pbmluZyBpZiBhbiBvYmplY3QgaXMgYSB3aW5kb3dcbiAqIEBtZW1iZXIgdXRpbFxuICovXG5mdW5jdGlvbiBpc1dpbmRvdyhvYmopIHtcbiAgLy8gbXVzdCB1c2UgPT0gZm9yIGllOFxuICAvKiBlc2xpbnQgZXFlcWVxOjAgKi9cbiAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiBvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogPT0gb2JqLndpbmRvdztcbn1cbmZ1bmN0aW9uIGdldERvY3VtZW50KG5vZGUpIHtcbiAgaWYgKGlzV2luZG93KG5vZGUpKSB7XG4gICAgcmV0dXJuIG5vZGUuZG9jdW1lbnQ7XG4gIH1cbiAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDkpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50O1xufVxuZnVuY3Rpb24gX2dldENvbXB1dGVkU3R5bGUoZWxlbSwgbmFtZSwgY3MpIHtcbiAgdmFyIGNvbXB1dGVkU3R5bGUgPSBjcztcbiAgdmFyIHZhbCA9ICcnO1xuICB2YXIgZCA9IGdldERvY3VtZW50KGVsZW0pO1xuICBjb21wdXRlZFN0eWxlID0gY29tcHV0ZWRTdHlsZSB8fCBkLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSwgbnVsbCk7XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2tpc3N5dGVhbS9raXNzeS9pc3N1ZXMvNjFcbiAgaWYgKGNvbXB1dGVkU3R5bGUpIHtcbiAgICB2YWwgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSkgfHwgY29tcHV0ZWRTdHlsZVtuYW1lXTtcbiAgfVxuICByZXR1cm4gdmFsO1xufVxudmFyIF9SRV9OVU1fTk9fUFggPSBuZXcgUmVnRXhwKFwiXihcIi5jb25jYXQoUkVfTlVNLCBcIikoPyFweClbYS16JV0rJFwiKSwgJ2knKTtcbnZhciBSRV9QT1MgPSAvXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC87XG52YXIgQ1VSUkVOVF9TVFlMRSA9ICdjdXJyZW50U3R5bGUnO1xudmFyIFJVTlRJTUVfU1RZTEUgPSAncnVudGltZVN0eWxlJztcbnZhciBMRUZUID0gJ2xlZnQnO1xudmFyIFBYID0gJ3B4JztcbmZ1bmN0aW9uIF9nZXRDb21wdXRlZFN0eWxlSUUoZWxlbSwgbmFtZSkge1xuICAvLyBjdXJyZW50U3R5bGUgbWF5YmUgbnVsbFxuICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1MzUyMzEuYXNweFxuICB2YXIgcmV0ID0gZWxlbVtDVVJSRU5UX1NUWUxFXSAmJiBlbGVtW0NVUlJFTlRfU1RZTEVdW25hbWVdO1xuXG4gIC8vIOW9kyB3aWR0aC9oZWlnaHQg6K6+572u5Li655m+5YiG5q+U5pe277yM6YCa6L+HIHBpeGVsTGVmdCDmlrnlvI/ovazmjaLnmoQgd2lkdGgvaGVpZ2h0IOWAvFxuICAvLyDkuIDlvIDlp4vlsLHlpITnkIbkuoYhIENVU1RPTV9TVFlMRS5oZWlnaHQsQ1VTVE9NX1NUWUxFLndpZHRoICxjc3NIb29rIOino+WGs0AyMDExLTA4LTE5XG4gIC8vIOWcqCBpZSDkuIvkuI3lr7nvvIzpnIDopoHnm7TmjqXnlKggb2Zmc2V0IOaWueW8j1xuICAvLyBib3JkZXJXaWR0aCDnrYnlgLzkuZ/mnInpl67popjvvIzkvYbogIPomZHliLAgYm9yZGVyV2lkdGgg6K6+5Li655m+5YiG5q+U55qE5qaC546H5b6I5bCP77yM6L+Z6YeM5bCx5LiN6ICD6JmR5LqGXG5cbiAgLy8gRnJvbSB0aGUgYXdlc29tZSBoYWNrIGJ5IERlYW4gRWR3YXJkc1xuICAvLyBodHRwOi8vZXJpay5lYWUubmV0L2FyY2hpdmVzLzIwMDcvMDcvMjcvMTguNTQuMTUvI2NvbW1lbnQtMTAyMjkxXG4gIC8vIElmIHdlJ3JlIG5vdCBkZWFsaW5nIHdpdGggYSByZWd1bGFyIHBpeGVsIG51bWJlclxuICAvLyBidXQgYSBudW1iZXIgdGhhdCBoYXMgYSB3ZWlyZCBlbmRpbmcsIHdlIG5lZWQgdG8gY29udmVydCBpdCB0byBwaXhlbHNcbiAgLy8gZXhjbHVkZSBsZWZ0IHJpZ2h0IGZvciByZWxhdGl2aXR5XG4gIGlmIChfUkVfTlVNX05PX1BYLnRlc3QocmV0KSAmJiAhUkVfUE9TLnRlc3QobmFtZSkpIHtcbiAgICAvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzXG4gICAgdmFyIHN0eWxlID0gZWxlbS5zdHlsZTtcbiAgICB2YXIgbGVmdCA9IHN0eWxlW0xFRlRdO1xuICAgIHZhciByc0xlZnQgPSBlbGVtW1JVTlRJTUVfU1RZTEVdW0xFRlRdO1xuXG4gICAgLy8gcHJldmVudCBmbGFzaGluZyBvZiBjb250ZW50XG4gICAgZWxlbVtSVU5USU1FX1NUWUxFXVtMRUZUXSA9IGVsZW1bQ1VSUkVOVF9TVFlMRV1bTEVGVF07XG5cbiAgICAvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0XG4gICAgc3R5bGVbTEVGVF0gPSBuYW1lID09PSAnZm9udFNpemUnID8gJzFlbScgOiByZXQgfHwgMDtcbiAgICByZXQgPSBzdHlsZS5waXhlbExlZnQgKyBQWDtcblxuICAgIC8vIFJldmVydCB0aGUgY2hhbmdlZCB2YWx1ZXNcbiAgICBzdHlsZVtMRUZUXSA9IGxlZnQ7XG4gICAgZWxlbVtSVU5USU1FX1NUWUxFXVtMRUZUXSA9IHJzTGVmdDtcbiAgfVxuICByZXR1cm4gcmV0ID09PSAnJyA/ICdhdXRvJyA6IHJldDtcbn1cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICBnZXRDb21wdXRlZFN0eWxlWCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlID8gX2dldENvbXB1dGVkU3R5bGUgOiBfZ2V0Q29tcHV0ZWRTdHlsZUlFO1xufVxuZnVuY3Rpb24gZ2V0T2Zmc2V0RGlyZWN0aW9uKGRpciwgb3B0aW9uKSB7XG4gIGlmIChkaXIgPT09ICdsZWZ0Jykge1xuICAgIHJldHVybiBvcHRpb24udXNlQ3NzUmlnaHQgPyAncmlnaHQnIDogZGlyO1xuICB9XG4gIHJldHVybiBvcHRpb24udXNlQ3NzQm90dG9tID8gJ2JvdHRvbScgOiBkaXI7XG59XG5mdW5jdGlvbiBvcHBvc2l0ZU9mZnNldERpcmVjdGlvbihkaXIpIHtcbiAgaWYgKGRpciA9PT0gJ2xlZnQnKSB7XG4gICAgcmV0dXJuICdyaWdodCc7XG4gIH0gZWxzZSBpZiAoZGlyID09PSAncmlnaHQnKSB7XG4gICAgcmV0dXJuICdsZWZ0JztcbiAgfSBlbHNlIGlmIChkaXIgPT09ICd0b3AnKSB7XG4gICAgcmV0dXJuICdib3R0b20nO1xuICB9IGVsc2UgaWYgKGRpciA9PT0gJ2JvdHRvbScpIHtcbiAgICByZXR1cm4gJ3RvcCc7XG4gIH1cbn1cblxuLy8g6K6+572uIGVsZW0g55u45a+5IGVsZW0ub3duZXJEb2N1bWVudCDnmoTlnZDmoIdcbmZ1bmN0aW9uIHNldExlZnRUb3AoZWxlbSwgb2Zmc2V0LCBvcHRpb24pIHtcbiAgLy8gc2V0IHBvc2l0aW9uIGZpcnN0LCBpbi1jYXNlIHRvcC9sZWZ0IGFyZSBzZXQgZXZlbiBvbiBzdGF0aWMgZWxlbVxuICBpZiAoY3NzKGVsZW0sICdwb3NpdGlvbicpID09PSAnc3RhdGljJykge1xuICAgIGVsZW0uc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICB9XG4gIHZhciBwcmVzZXRIID0gLTk5OTtcbiAgdmFyIHByZXNldFYgPSAtOTk5O1xuICB2YXIgaG9yaXpvbnRhbFByb3BlcnR5ID0gZ2V0T2Zmc2V0RGlyZWN0aW9uKCdsZWZ0Jywgb3B0aW9uKTtcbiAgdmFyIHZlcnRpY2FsUHJvcGVydHkgPSBnZXRPZmZzZXREaXJlY3Rpb24oJ3RvcCcsIG9wdGlvbik7XG4gIHZhciBvcHBvc2l0ZUhvcml6b250YWxQcm9wZXJ0eSA9IG9wcG9zaXRlT2Zmc2V0RGlyZWN0aW9uKGhvcml6b250YWxQcm9wZXJ0eSk7XG4gIHZhciBvcHBvc2l0ZVZlcnRpY2FsUHJvcGVydHkgPSBvcHBvc2l0ZU9mZnNldERpcmVjdGlvbih2ZXJ0aWNhbFByb3BlcnR5KTtcbiAgaWYgKGhvcml6b250YWxQcm9wZXJ0eSAhPT0gJ2xlZnQnKSB7XG4gICAgcHJlc2V0SCA9IDk5OTtcbiAgfVxuICBpZiAodmVydGljYWxQcm9wZXJ0eSAhPT0gJ3RvcCcpIHtcbiAgICBwcmVzZXRWID0gOTk5O1xuICB9XG4gIHZhciBvcmlnaW5hbFRyYW5zaXRpb24gPSAnJztcbiAgdmFyIG9yaWdpbmFsT2Zmc2V0ID0gZ2V0T2Zmc2V0KGVsZW0pO1xuICBpZiAoJ2xlZnQnIGluIG9mZnNldCB8fCAndG9wJyBpbiBvZmZzZXQpIHtcbiAgICBvcmlnaW5hbFRyYW5zaXRpb24gPSBnZXRUcmFuc2l0aW9uUHJvcGVydHkoZWxlbSkgfHwgJyc7XG4gICAgc2V0VHJhbnNpdGlvblByb3BlcnR5KGVsZW0sICdub25lJyk7XG4gIH1cbiAgaWYgKCdsZWZ0JyBpbiBvZmZzZXQpIHtcbiAgICBlbGVtLnN0eWxlW29wcG9zaXRlSG9yaXpvbnRhbFByb3BlcnR5XSA9ICcnO1xuICAgIGVsZW0uc3R5bGVbaG9yaXpvbnRhbFByb3BlcnR5XSA9IFwiXCIuY29uY2F0KHByZXNldEgsIFwicHhcIik7XG4gIH1cbiAgaWYgKCd0b3AnIGluIG9mZnNldCkge1xuICAgIGVsZW0uc3R5bGVbb3Bwb3NpdGVWZXJ0aWNhbFByb3BlcnR5XSA9ICcnO1xuICAgIGVsZW0uc3R5bGVbdmVydGljYWxQcm9wZXJ0eV0gPSBcIlwiLmNvbmNhdChwcmVzZXRWLCBcInB4XCIpO1xuICB9XG4gIC8vIGZvcmNlIHJlbGF5b3V0XG4gIGZvcmNlUmVsYXlvdXQoZWxlbSk7XG4gIHZhciBvbGQgPSBnZXRPZmZzZXQoZWxlbSk7XG4gIHZhciBvcmlnaW5hbFN0eWxlID0ge307XG4gIGZvciAodmFyIGtleSBpbiBvZmZzZXQpIHtcbiAgICBpZiAob2Zmc2V0Lmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIHZhciBkaXIgPSBnZXRPZmZzZXREaXJlY3Rpb24oa2V5LCBvcHRpb24pO1xuICAgICAgdmFyIHByZXNldCA9IGtleSA9PT0gJ2xlZnQnID8gcHJlc2V0SCA6IHByZXNldFY7XG4gICAgICB2YXIgb2ZmID0gb3JpZ2luYWxPZmZzZXRba2V5XSAtIG9sZFtrZXldO1xuICAgICAgaWYgKGRpciA9PT0ga2V5KSB7XG4gICAgICAgIG9yaWdpbmFsU3R5bGVbZGlyXSA9IHByZXNldCArIG9mZjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9yaWdpbmFsU3R5bGVbZGlyXSA9IHByZXNldCAtIG9mZjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY3NzKGVsZW0sIG9yaWdpbmFsU3R5bGUpO1xuICAvLyBmb3JjZSByZWxheW91dFxuICBmb3JjZVJlbGF5b3V0KGVsZW0pO1xuICBpZiAoJ2xlZnQnIGluIG9mZnNldCB8fCAndG9wJyBpbiBvZmZzZXQpIHtcbiAgICBzZXRUcmFuc2l0aW9uUHJvcGVydHkoZWxlbSwgb3JpZ2luYWxUcmFuc2l0aW9uKTtcbiAgfVxuICB2YXIgcmV0ID0ge307XG4gIGZvciAodmFyIF9rZXkgaW4gb2Zmc2V0KSB7XG4gICAgaWYgKG9mZnNldC5oYXNPd25Qcm9wZXJ0eShfa2V5KSkge1xuICAgICAgdmFyIF9kaXIgPSBnZXRPZmZzZXREaXJlY3Rpb24oX2tleSwgb3B0aW9uKTtcbiAgICAgIHZhciBfb2ZmID0gb2Zmc2V0W19rZXldIC0gb3JpZ2luYWxPZmZzZXRbX2tleV07XG4gICAgICBpZiAoX2tleSA9PT0gX2Rpcikge1xuICAgICAgICByZXRbX2Rpcl0gPSBvcmlnaW5hbFN0eWxlW19kaXJdICsgX29mZjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldFtfZGlyXSA9IG9yaWdpbmFsU3R5bGVbX2Rpcl0gLSBfb2ZmO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjc3MoZWxlbSwgcmV0KTtcbn1cbmZ1bmN0aW9uIHNldFRyYW5zZm9ybSQxKGVsZW0sIG9mZnNldCkge1xuICB2YXIgb3JpZ2luYWxPZmZzZXQgPSBnZXRPZmZzZXQoZWxlbSk7XG4gIHZhciBvcmlnaW5hbFhZID0gZ2V0VHJhbnNmb3JtWFkoZWxlbSk7XG4gIHZhciByZXN1bHRYWSA9IHtcbiAgICB4OiBvcmlnaW5hbFhZLngsXG4gICAgeTogb3JpZ2luYWxYWS55XG4gIH07XG4gIGlmICgnbGVmdCcgaW4gb2Zmc2V0KSB7XG4gICAgcmVzdWx0WFkueCA9IG9yaWdpbmFsWFkueCArIG9mZnNldC5sZWZ0IC0gb3JpZ2luYWxPZmZzZXQubGVmdDtcbiAgfVxuICBpZiAoJ3RvcCcgaW4gb2Zmc2V0KSB7XG4gICAgcmVzdWx0WFkueSA9IG9yaWdpbmFsWFkueSArIG9mZnNldC50b3AgLSBvcmlnaW5hbE9mZnNldC50b3A7XG4gIH1cbiAgc2V0VHJhbnNmb3JtWFkoZWxlbSwgcmVzdWx0WFkpO1xufVxuZnVuY3Rpb24gc2V0T2Zmc2V0KGVsZW0sIG9mZnNldCwgb3B0aW9uKSB7XG4gIGlmIChvcHRpb24uaWdub3JlU2hha2UpIHtcbiAgICB2YXIgb3JpT2Zmc2V0ID0gZ2V0T2Zmc2V0KGVsZW0pO1xuICAgIHZhciBvTGVmdCA9IG9yaU9mZnNldC5sZWZ0LnRvRml4ZWQoMCk7XG4gICAgdmFyIG9Ub3AgPSBvcmlPZmZzZXQudG9wLnRvRml4ZWQoMCk7XG4gICAgdmFyIHRMZWZ0ID0gb2Zmc2V0LmxlZnQudG9GaXhlZCgwKTtcbiAgICB2YXIgdFRvcCA9IG9mZnNldC50b3AudG9GaXhlZCgwKTtcbiAgICBpZiAob0xlZnQgPT09IHRMZWZ0ICYmIG9Ub3AgPT09IHRUb3ApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgaWYgKG9wdGlvbi51c2VDc3NSaWdodCB8fCBvcHRpb24udXNlQ3NzQm90dG9tKSB7XG4gICAgc2V0TGVmdFRvcChlbGVtLCBvZmZzZXQsIG9wdGlvbik7XG4gIH0gZWxzZSBpZiAob3B0aW9uLnVzZUNzc1RyYW5zZm9ybSAmJiBnZXRUcmFuc2Zvcm1OYW1lKCkgaW4gZG9jdW1lbnQuYm9keS5zdHlsZSkge1xuICAgIHNldFRyYW5zZm9ybSQxKGVsZW0sIG9mZnNldCk7XG4gIH0gZWxzZSB7XG4gICAgc2V0TGVmdFRvcChlbGVtLCBvZmZzZXQsIG9wdGlvbik7XG4gIH1cbn1cbmZ1bmN0aW9uIGVhY2goYXJyLCBmbikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIGZuKGFycltpXSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzQm9yZGVyQm94Rm4oZWxlbSkge1xuICByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZVgoZWxlbSwgJ2JveFNpemluZycpID09PSAnYm9yZGVyLWJveCc7XG59XG52YXIgQk9YX01PREVMUyA9IFsnbWFyZ2luJywgJ2JvcmRlcicsICdwYWRkaW5nJ107XG52YXIgQ09OVEVOVF9JTkRFWCA9IC0xO1xudmFyIFBBRERJTkdfSU5ERVggPSAyO1xudmFyIEJPUkRFUl9JTkRFWCA9IDE7XG52YXIgTUFSR0lOX0lOREVYID0gMDtcbmZ1bmN0aW9uIHN3YXAoZWxlbSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgdmFyIG9sZCA9IHt9O1xuICB2YXIgc3R5bGUgPSBlbGVtLnN0eWxlO1xuICB2YXIgbmFtZTtcblxuICAvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9uZXNcbiAgZm9yIChuYW1lIGluIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgb2xkW25hbWVdID0gc3R5bGVbbmFtZV07XG4gICAgICBzdHlsZVtuYW1lXSA9IG9wdGlvbnNbbmFtZV07XG4gICAgfVxuICB9XG4gIGNhbGxiYWNrLmNhbGwoZWxlbSk7XG5cbiAgLy8gUmV2ZXJ0IHRoZSBvbGQgdmFsdWVzXG4gIGZvciAobmFtZSBpbiBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgIHN0eWxlW25hbWVdID0gb2xkW25hbWVdO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZ2V0UEJNV2lkdGgoZWxlbSwgcHJvcHMsIHdoaWNoKSB7XG4gIHZhciB2YWx1ZSA9IDA7XG4gIHZhciBwcm9wO1xuICB2YXIgajtcbiAgdmFyIGk7XG4gIGZvciAoaiA9IDA7IGogPCBwcm9wcy5sZW5ndGg7IGorKykge1xuICAgIHByb3AgPSBwcm9wc1tqXTtcbiAgICBpZiAocHJvcCkge1xuICAgICAgZm9yIChpID0gMDsgaSA8IHdoaWNoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjc3NQcm9wID0gdm9pZCAwO1xuICAgICAgICBpZiAocHJvcCA9PT0gJ2JvcmRlcicpIHtcbiAgICAgICAgICBjc3NQcm9wID0gXCJcIi5jb25jYXQocHJvcCkuY29uY2F0KHdoaWNoW2ldLCBcIldpZHRoXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNzc1Byb3AgPSBwcm9wICsgd2hpY2hbaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgKz0gcGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlWChlbGVtLCBjc3NQcm9wKSkgfHwgMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxudmFyIGRvbVV0aWxzID0ge1xuICBnZXRQYXJlbnQ6IGZ1bmN0aW9uIGdldFBhcmVudChlbGVtZW50KSB7XG4gICAgdmFyIHBhcmVudCA9IGVsZW1lbnQ7XG4gICAgZG8ge1xuICAgICAgaWYgKHBhcmVudC5ub2RlVHlwZSA9PT0gMTEgJiYgcGFyZW50Lmhvc3QpIHtcbiAgICAgICAgcGFyZW50ID0gcGFyZW50Lmhvc3Q7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZTtcbiAgICAgIH1cbiAgICB9IHdoaWxlIChwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9PSAxICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gOSk7XG4gICAgcmV0dXJuIHBhcmVudDtcbiAgfVxufTtcbmVhY2goWydXaWR0aCcsICdIZWlnaHQnXSwgZnVuY3Rpb24gKG5hbWUpIHtcbiAgZG9tVXRpbHNbXCJkb2NcIi5jb25jYXQobmFtZSldID0gZnVuY3Rpb24gKHJlZldpbikge1xuICAgIHZhciBkID0gcmVmV2luLmRvY3VtZW50O1xuICAgIHJldHVybiBNYXRoLm1heChcbiAgICAvLyBmaXJlZm94IGNocm9tZSBkb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0PCBib2R5LnNjcm9sbEhlaWdodFxuICAgIC8vIGllIHN0YW5kYXJkIG1vZGUgOiBkb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0PiBib2R5LnNjcm9sbEhlaWdodFxuICAgIGQuZG9jdW1lbnRFbGVtZW50W1wic2Nyb2xsXCIuY29uY2F0KG5hbWUpXSxcbiAgICAvLyBxdWlya3MgOiBkb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0IOacgOWkp+etieS6juWPr+inhueql+WPo+WkmuS4gOeCue+8n1xuICAgIGQuYm9keVtcInNjcm9sbFwiLmNvbmNhdChuYW1lKV0sIGRvbVV0aWxzW1widmlld3BvcnRcIi5jb25jYXQobmFtZSldKGQpKTtcbiAgfTtcbiAgZG9tVXRpbHNbXCJ2aWV3cG9ydFwiLmNvbmNhdChuYW1lKV0gPSBmdW5jdGlvbiAod2luKSB7XG4gICAgLy8gcGMgYnJvd3NlciBpbmNsdWRlcyBzY3JvbGxiYXIgaW4gd2luZG93LmlubmVyV2lkdGhcbiAgICB2YXIgcHJvcCA9IFwiY2xpZW50XCIuY29uY2F0KG5hbWUpO1xuICAgIHZhciBkb2MgPSB3aW4uZG9jdW1lbnQ7XG4gICAgdmFyIGJvZHkgPSBkb2MuYm9keTtcbiAgICB2YXIgZG9jdW1lbnRFbGVtZW50ID0gZG9jLmRvY3VtZW50RWxlbWVudDtcbiAgICB2YXIgZG9jdW1lbnRFbGVtZW50UHJvcCA9IGRvY3VtZW50RWxlbWVudFtwcm9wXTtcbiAgICAvLyDmoIflh4bmqKHlvI/lj5YgZG9jdW1lbnRFbGVtZW50XG4gICAgLy8gYmFja2NvbXBhdCDlj5YgYm9keVxuICAgIHJldHVybiBkb2MuY29tcGF0TW9kZSA9PT0gJ0NTUzFDb21wYXQnICYmIGRvY3VtZW50RWxlbWVudFByb3AgfHwgYm9keSAmJiBib2R5W3Byb3BdIHx8IGRvY3VtZW50RWxlbWVudFByb3A7XG4gIH07XG59KTtcblxuLypcbiDlvpfliLDlhYPntKDnmoTlpKflsI/kv6Hmga9cbiBAcGFyYW0gZWxlbVxuIEBwYXJhbSBuYW1lXG4gQHBhcmFtIHtTdHJpbmd9IFtleHRyYV0gICdwYWRkaW5nJyA6IChjc3Mgd2lkdGgpICsgcGFkZGluZ1xuICdib3JkZXInIDogKGNzcyB3aWR0aCkgKyBwYWRkaW5nICsgYm9yZGVyXG4gJ21hcmdpbicgOiAoY3NzIHdpZHRoKSArIHBhZGRpbmcgKyBib3JkZXIgKyBtYXJnaW5cbiAqL1xuZnVuY3Rpb24gZ2V0V0goZWxlbSwgbmFtZSwgZXgpIHtcbiAgdmFyIGV4dHJhID0gZXg7XG4gIGlmIChpc1dpbmRvdyhlbGVtKSkge1xuICAgIHJldHVybiBuYW1lID09PSAnd2lkdGgnID8gZG9tVXRpbHMudmlld3BvcnRXaWR0aChlbGVtKSA6IGRvbVV0aWxzLnZpZXdwb3J0SGVpZ2h0KGVsZW0pO1xuICB9IGVsc2UgaWYgKGVsZW0ubm9kZVR5cGUgPT09IDkpIHtcbiAgICByZXR1cm4gbmFtZSA9PT0gJ3dpZHRoJyA/IGRvbVV0aWxzLmRvY1dpZHRoKGVsZW0pIDogZG9tVXRpbHMuZG9jSGVpZ2h0KGVsZW0pO1xuICB9XG4gIHZhciB3aGljaCA9IG5hbWUgPT09ICd3aWR0aCcgPyBbJ0xlZnQnLCAnUmlnaHQnXSA6IFsnVG9wJywgJ0JvdHRvbSddO1xuICB2YXIgYm9yZGVyQm94VmFsdWUgPSBuYW1lID09PSAnd2lkdGgnID8gTWF0aC5mbG9vcihlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKSA6IE1hdGguZmxvb3IoZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpO1xuICB2YXIgaXNCb3JkZXJCb3ggPSBpc0JvcmRlckJveEZuKGVsZW0pO1xuICB2YXIgY3NzQm94VmFsdWUgPSAwO1xuICBpZiAoYm9yZGVyQm94VmFsdWUgPT09IG51bGwgfHwgYm9yZGVyQm94VmFsdWUgPT09IHVuZGVmaW5lZCB8fCBib3JkZXJCb3hWYWx1ZSA8PSAwKSB7XG4gICAgYm9yZGVyQm94VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgLy8gRmFsbCBiYWNrIHRvIGNvbXB1dGVkIHRoZW4gdW4gY29tcHV0ZWQgY3NzIGlmIG5lY2Vzc2FyeVxuICAgIGNzc0JveFZhbHVlID0gZ2V0Q29tcHV0ZWRTdHlsZVgoZWxlbSwgbmFtZSk7XG4gICAgaWYgKGNzc0JveFZhbHVlID09PSBudWxsIHx8IGNzc0JveFZhbHVlID09PSB1bmRlZmluZWQgfHwgTnVtYmVyKGNzc0JveFZhbHVlKSA8IDApIHtcbiAgICAgIGNzc0JveFZhbHVlID0gZWxlbS5zdHlsZVtuYW1lXSB8fCAwO1xuICAgIH1cbiAgICAvLyBOb3JtYWxpemUgJycsIGF1dG8sIGFuZCBwcmVwYXJlIGZvciBleHRyYVxuICAgIGNzc0JveFZhbHVlID0gTWF0aC5mbG9vcihwYXJzZUZsb2F0KGNzc0JveFZhbHVlKSkgfHwgMDtcbiAgfVxuICBpZiAoZXh0cmEgPT09IHVuZGVmaW5lZCkge1xuICAgIGV4dHJhID0gaXNCb3JkZXJCb3ggPyBCT1JERVJfSU5ERVggOiBDT05URU5UX0lOREVYO1xuICB9XG4gIHZhciBib3JkZXJCb3hWYWx1ZU9ySXNCb3JkZXJCb3ggPSBib3JkZXJCb3hWYWx1ZSAhPT0gdW5kZWZpbmVkIHx8IGlzQm9yZGVyQm94O1xuICB2YXIgdmFsID0gYm9yZGVyQm94VmFsdWUgfHwgY3NzQm94VmFsdWU7XG4gIGlmIChleHRyYSA9PT0gQ09OVEVOVF9JTkRFWCkge1xuICAgIGlmIChib3JkZXJCb3hWYWx1ZU9ySXNCb3JkZXJCb3gpIHtcbiAgICAgIHJldHVybiB2YWwgLSBnZXRQQk1XaWR0aChlbGVtLCBbJ2JvcmRlcicsICdwYWRkaW5nJ10sIHdoaWNoKTtcbiAgICB9XG4gICAgcmV0dXJuIGNzc0JveFZhbHVlO1xuICB9IGVsc2UgaWYgKGJvcmRlckJveFZhbHVlT3JJc0JvcmRlckJveCkge1xuICAgIGlmIChleHRyYSA9PT0gQk9SREVSX0lOREVYKSB7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gdmFsICsgKGV4dHJhID09PSBQQURESU5HX0lOREVYID8gLWdldFBCTVdpZHRoKGVsZW0sIFsnYm9yZGVyJ10sIHdoaWNoKSA6IGdldFBCTVdpZHRoKGVsZW0sIFsnbWFyZ2luJ10sIHdoaWNoKSk7XG4gIH1cbiAgcmV0dXJuIGNzc0JveFZhbHVlICsgZ2V0UEJNV2lkdGgoZWxlbSwgQk9YX01PREVMUy5zbGljZShleHRyYSksIHdoaWNoKTtcbn1cbnZhciBjc3NTaG93ID0ge1xuICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgdmlzaWJpbGl0eTogJ2hpZGRlbicsXG4gIGRpc3BsYXk6ICdibG9jaydcbn07XG5cbi8vIGZpeCAjMTE5IDogaHR0cHM6Ly9naXRodWIuY29tL2tpc3N5dGVhbS9raXNzeS9pc3N1ZXMvMTE5XG5mdW5jdGlvbiBnZXRXSElnbm9yZURpc3BsYXkoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjsgX2tleTIrKykge1xuICAgIGFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgfVxuICB2YXIgdmFsO1xuICB2YXIgZWxlbSA9IGFyZ3NbMF07XG4gIC8vIGluIGNhc2UgZWxlbSBpcyB3aW5kb3dcbiAgLy8gZWxlbS5vZmZzZXRXaWR0aCA9PT0gdW5kZWZpbmVkXG4gIGlmIChlbGVtLm9mZnNldFdpZHRoICE9PSAwKSB7XG4gICAgdmFsID0gZ2V0V0guYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICBzd2FwKGVsZW0sIGNzc1Nob3csIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhbCA9IGdldFdILmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHZhbDtcbn1cbmVhY2goWyd3aWR0aCcsICdoZWlnaHQnXSwgZnVuY3Rpb24gKG5hbWUpIHtcbiAgdmFyIGZpcnN0ID0gbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSk7XG4gIGRvbVV0aWxzW1wib3V0ZXJcIi5jb25jYXQoZmlyc3QpXSA9IGZ1bmN0aW9uIChlbCwgaW5jbHVkZU1hcmdpbikge1xuICAgIHJldHVybiBlbCAmJiBnZXRXSElnbm9yZURpc3BsYXkoZWwsIG5hbWUsIGluY2x1ZGVNYXJnaW4gPyBNQVJHSU5fSU5ERVggOiBCT1JERVJfSU5ERVgpO1xuICB9O1xuICB2YXIgd2hpY2ggPSBuYW1lID09PSAnd2lkdGgnID8gWydMZWZ0JywgJ1JpZ2h0J10gOiBbJ1RvcCcsICdCb3R0b20nXTtcbiAgZG9tVXRpbHNbbmFtZV0gPSBmdW5jdGlvbiAoZWxlbSwgdikge1xuICAgIHZhciB2YWwgPSB2O1xuICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGVsZW0pIHtcbiAgICAgICAgdmFyIGlzQm9yZGVyQm94ID0gaXNCb3JkZXJCb3hGbihlbGVtKTtcbiAgICAgICAgaWYgKGlzQm9yZGVyQm94KSB7XG4gICAgICAgICAgdmFsICs9IGdldFBCTVdpZHRoKGVsZW0sIFsncGFkZGluZycsICdib3JkZXInXSwgd2hpY2gpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjc3MoZWxlbSwgbmFtZSwgdmFsKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBlbGVtICYmIGdldFdISWdub3JlRGlzcGxheShlbGVtLCBuYW1lLCBDT05URU5UX0lOREVYKTtcbiAgfTtcbn0pO1xuZnVuY3Rpb24gbWl4KHRvLCBmcm9tKSB7XG4gIGZvciAodmFyIGkgaW4gZnJvbSkge1xuICAgIGlmIChmcm9tLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICB0b1tpXSA9IGZyb21baV07XG4gICAgfVxuICB9XG4gIHJldHVybiB0bztcbn1cbnZhciB1dGlscyA9IHtcbiAgZ2V0V2luZG93OiBmdW5jdGlvbiBnZXRXaW5kb3cobm9kZSkge1xuICAgIGlmIChub2RlICYmIG5vZGUuZG9jdW1lbnQgJiYgbm9kZS5zZXRUaW1lb3V0KSB7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgdmFyIGRvYyA9IG5vZGUub3duZXJEb2N1bWVudCB8fCBub2RlO1xuICAgIHJldHVybiBkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdztcbiAgfSxcbiAgZ2V0RG9jdW1lbnQ6IGdldERvY3VtZW50LFxuICBvZmZzZXQ6IGZ1bmN0aW9uIG9mZnNldChlbCwgdmFsdWUsIG9wdGlvbikge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBzZXRPZmZzZXQoZWwsIHZhbHVlLCBvcHRpb24gfHwge30pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0T2Zmc2V0KGVsKTtcbiAgICB9XG4gIH0sXG4gIGlzV2luZG93OiBpc1dpbmRvdyxcbiAgZWFjaDogZWFjaCxcbiAgY3NzOiBjc3MsXG4gIGNsb25lOiBmdW5jdGlvbiBjbG9uZShvYmopIHtcbiAgICB2YXIgaTtcbiAgICB2YXIgcmV0ID0ge307XG4gICAgZm9yIChpIGluIG9iaikge1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICByZXRbaV0gPSBvYmpbaV07XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBvdmVyZmxvdyA9IG9iai5vdmVyZmxvdztcbiAgICBpZiAob3ZlcmZsb3cpIHtcbiAgICAgIGZvciAoaSBpbiBvYmopIHtcbiAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgIHJldC5vdmVyZmxvd1tpXSA9IG9iai5vdmVyZmxvd1tpXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9LFxuICBtaXg6IG1peCxcbiAgZ2V0V2luZG93U2Nyb2xsTGVmdDogZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsTGVmdCh3KSB7XG4gICAgcmV0dXJuIGdldFNjcm9sbExlZnQodyk7XG4gIH0sXG4gIGdldFdpbmRvd1Njcm9sbFRvcDogZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsVG9wKHcpIHtcbiAgICByZXR1cm4gZ2V0U2Nyb2xsVG9wKHcpO1xuICB9LFxuICBtZXJnZTogZnVuY3Rpb24gbWVyZ2UoKSB7XG4gICAgdmFyIHJldCA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB1dGlscy5taXgocmV0LCBpIDwgMCB8fCBhcmd1bWVudHMubGVuZ3RoIDw9IGkgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9LFxuICB2aWV3cG9ydFdpZHRoOiAwLFxuICB2aWV3cG9ydEhlaWdodDogMFxufTtcbm1peCh1dGlscywgZG9tVXRpbHMpO1xuXG4vKipcbiAqIOW+l+WIsOS8muWvvOiHtOWFg+e0oOaYvuekuuS4jeWFqOeahOelluWFiOWFg+e0oFxuICovXG52YXIgZ2V0UGFyZW50ID0gdXRpbHMuZ2V0UGFyZW50O1xuZnVuY3Rpb24gZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgaWYgKHV0aWxzLmlzV2luZG93KGVsZW1lbnQpIHx8IGVsZW1lbnQubm9kZVR5cGUgPT09IDkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBpZSDov5nkuKrkuZ/kuI3mmK/lrozlhajlj6/ooYxcbiAgLypcbiAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogNTBweDtoZWlnaHQ6IDEwMHB4O292ZXJmbG93OiBoaWRkZW5cIj5cbiAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogNTBweDtoZWlnaHQ6IDEwMHB4O3Bvc2l0aW9uOiByZWxhdGl2ZTtcIiBpZD1cImQ2XCI+XG4gICDlhYPntKAgNiDpq5ggMTAwcHgg5a69IDUwcHg8YnIvPlxuICAgPC9kaXY+XG4gICA8L2Rpdj5cbiAgICovXG4gIC8vIGVsZW1lbnQub2Zmc2V0UGFyZW50IGRvZXMgdGhlIHJpZ2h0IHRoaW5nIGluIGllNyBhbmQgYmVsb3cuIFJldHVybiBwYXJlbnQgd2l0aCBsYXlvdXQhXG4gIC8vICBJbiBvdGhlciBicm93c2VycyBpdCBvbmx5IGluY2x1ZGVzIGVsZW1lbnRzIHdpdGggcG9zaXRpb24gYWJzb2x1dGUsIHJlbGF0aXZlIG9yXG4gIC8vIGZpeGVkLCBub3QgZWxlbWVudHMgd2l0aCBvdmVyZmxvdyBzZXQgdG8gYXV0byBvciBzY3JvbGwuXG4gIC8vICAgICAgICBpZiAoVUEuaWUgJiYgaWVNb2RlIDwgOCkge1xuICAvLyAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lm9mZnNldFBhcmVudDtcbiAgLy8gICAgICAgIH1cbiAgLy8g57uf5LiA55qEIG9mZnNldFBhcmVudCDmlrnms5VcbiAgdmFyIGRvYyA9IHV0aWxzLmdldERvY3VtZW50KGVsZW1lbnQpO1xuICB2YXIgYm9keSA9IGRvYy5ib2R5O1xuICB2YXIgcGFyZW50O1xuICB2YXIgcG9zaXRpb25TdHlsZSA9IHV0aWxzLmNzcyhlbGVtZW50LCAncG9zaXRpb24nKTtcbiAgdmFyIHNraXBTdGF0aWMgPSBwb3NpdGlvblN0eWxlID09PSAnZml4ZWQnIHx8IHBvc2l0aW9uU3R5bGUgPT09ICdhYnNvbHV0ZSc7XG4gIGlmICghc2tpcFN0YXRpYykge1xuICAgIHJldHVybiBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdodG1sJyA/IG51bGwgOiBnZXRQYXJlbnQoZWxlbWVudCk7XG4gIH1cbiAgZm9yIChwYXJlbnQgPSBnZXRQYXJlbnQoZWxlbWVudCk7IHBhcmVudCAmJiBwYXJlbnQgIT09IGJvZHkgJiYgcGFyZW50Lm5vZGVUeXBlICE9PSA5OyBwYXJlbnQgPSBnZXRQYXJlbnQocGFyZW50KSkge1xuICAgIHBvc2l0aW9uU3R5bGUgPSB1dGlscy5jc3MocGFyZW50LCAncG9zaXRpb24nKTtcbiAgICBpZiAocG9zaXRpb25TdHlsZSAhPT0gJ3N0YXRpYycpIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgZ2V0UGFyZW50JDEgPSB1dGlscy5nZXRQYXJlbnQ7XG5mdW5jdGlvbiBpc0FuY2VzdG9yRml4ZWQoZWxlbWVudCkge1xuICBpZiAodXRpbHMuaXNXaW5kb3coZWxlbWVudCkgfHwgZWxlbWVudC5ub2RlVHlwZSA9PT0gOSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgZG9jID0gdXRpbHMuZ2V0RG9jdW1lbnQoZWxlbWVudCk7XG4gIHZhciBib2R5ID0gZG9jLmJvZHk7XG4gIHZhciBwYXJlbnQgPSBudWxsO1xuICBmb3IgKHBhcmVudCA9IGdldFBhcmVudCQxKGVsZW1lbnQpO1xuICAvLyDkv67lpI3lhYPntKDkvY3kuo4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IOS4i+WvvOiHtOW0qea6g+mXrumimFxuICBwYXJlbnQgJiYgcGFyZW50ICE9PSBib2R5ICYmIHBhcmVudCAhPT0gZG9jOyBwYXJlbnQgPSBnZXRQYXJlbnQkMShwYXJlbnQpKSB7XG4gICAgdmFyIHBvc2l0aW9uU3R5bGUgPSB1dGlscy5jc3MocGFyZW50LCAncG9zaXRpb24nKTtcbiAgICBpZiAocG9zaXRpb25TdHlsZSA9PT0gJ2ZpeGVkJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiDojrflvpflhYPntKDnmoTmmL7npLrpg6jliIbnmoTljLrln59cbiAqL1xuZnVuY3Rpb24gZ2V0VmlzaWJsZVJlY3RGb3JFbGVtZW50KGVsZW1lbnQsIGFsd2F5c0J5Vmlld3BvcnQpIHtcbiAgdmFyIHZpc2libGVSZWN0ID0ge1xuICAgIGxlZnQ6IDAsXG4gICAgcmlnaHQ6IEluZmluaXR5LFxuICAgIHRvcDogMCxcbiAgICBib3R0b206IEluZmluaXR5XG4gIH07XG4gIHZhciBlbCA9IGdldE9mZnNldFBhcmVudChlbGVtZW50KTtcbiAgdmFyIGRvYyA9IHV0aWxzLmdldERvY3VtZW50KGVsZW1lbnQpO1xuICB2YXIgd2luID0gZG9jLmRlZmF1bHRWaWV3IHx8IGRvYy5wYXJlbnRXaW5kb3c7XG4gIHZhciBib2R5ID0gZG9jLmJvZHk7XG4gIHZhciBkb2N1bWVudEVsZW1lbnQgPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuXG4gIC8vIERldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgdmlzaWJsZSByZWN0IGJ5IGNsaW1iaW5nIHRoZSBkb20gYWNjb3VudGluZyBmb3JcbiAgLy8gYWxsIHNjcm9sbGFibGUgY29udGFpbmVycy5cbiAgd2hpbGUgKGVsKSB7XG4gICAgLy8gY2xpZW50V2lkdGggaXMgemVybyBmb3IgaW5saW5lIGJsb2NrIGVsZW1lbnRzIGluIGllLlxuICAgIGlmICgobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdNU0lFJykgPT09IC0xIHx8IGVsLmNsaWVudFdpZHRoICE9PSAwKSAmJlxuICAgIC8vIGJvZHkgbWF5IGhhdmUgb3ZlcmZsb3cgc2V0IG9uIGl0LCB5ZXQgd2Ugc3RpbGwgZ2V0IHRoZSBlbnRpcmVcbiAgICAvLyB2aWV3cG9ydC4gSW4gc29tZSBicm93c2VycywgZWwub2Zmc2V0UGFyZW50IG1heSBiZVxuICAgIC8vIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgc28gY2hlY2sgZm9yIHRoYXQgdG9vLlxuICAgIGVsICE9PSBib2R5ICYmIGVsICE9PSBkb2N1bWVudEVsZW1lbnQgJiYgdXRpbHMuY3NzKGVsLCAnb3ZlcmZsb3cnKSAhPT0gJ3Zpc2libGUnKSB7XG4gICAgICB2YXIgcG9zID0gdXRpbHMub2Zmc2V0KGVsKTtcbiAgICAgIC8vIGFkZCBib3JkZXJcbiAgICAgIHBvcy5sZWZ0ICs9IGVsLmNsaWVudExlZnQ7XG4gICAgICBwb3MudG9wICs9IGVsLmNsaWVudFRvcDtcbiAgICAgIHZpc2libGVSZWN0LnRvcCA9IE1hdGgubWF4KHZpc2libGVSZWN0LnRvcCwgcG9zLnRvcCk7XG4gICAgICB2aXNpYmxlUmVjdC5yaWdodCA9IE1hdGgubWluKHZpc2libGVSZWN0LnJpZ2h0LFxuICAgICAgLy8gY29uc2lkZXIgYXJlYSB3aXRob3V0IHNjcm9sbEJhclxuICAgICAgcG9zLmxlZnQgKyBlbC5jbGllbnRXaWR0aCk7XG4gICAgICB2aXNpYmxlUmVjdC5ib3R0b20gPSBNYXRoLm1pbih2aXNpYmxlUmVjdC5ib3R0b20sIHBvcy50b3AgKyBlbC5jbGllbnRIZWlnaHQpO1xuICAgICAgdmlzaWJsZVJlY3QubGVmdCA9IE1hdGgubWF4KHZpc2libGVSZWN0LmxlZnQsIHBvcy5sZWZ0KTtcbiAgICB9IGVsc2UgaWYgKGVsID09PSBib2R5IHx8IGVsID09PSBkb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBlbCA9IGdldE9mZnNldFBhcmVudChlbCk7XG4gIH1cblxuICAvLyBTZXQgZWxlbWVudCBwb3NpdGlvbiB0byBmaXhlZFxuICAvLyBtYWtlIHN1cmUgYWJzb2x1dGUgZWxlbWVudCBpdHNlbGYgZG9uJ3QgYWZmZWN0IGl0J3MgdmlzaWJsZSBhcmVhXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzc2MDFcbiAgdmFyIG9yaWdpbmFsUG9zaXRpb24gPSBudWxsO1xuICBpZiAoIXV0aWxzLmlzV2luZG93KGVsZW1lbnQpICYmIGVsZW1lbnQubm9kZVR5cGUgIT09IDkpIHtcbiAgICBvcmlnaW5hbFBvc2l0aW9uID0gZWxlbWVudC5zdHlsZS5wb3NpdGlvbjtcbiAgICB2YXIgcG9zaXRpb24gPSB1dGlscy5jc3MoZWxlbWVudCwgJ3Bvc2l0aW9uJyk7XG4gICAgaWYgKHBvc2l0aW9uID09PSAnYWJzb2x1dGUnKSB7XG4gICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICB9XG4gIH1cbiAgdmFyIHNjcm9sbFggPSB1dGlscy5nZXRXaW5kb3dTY3JvbGxMZWZ0KHdpbik7XG4gIHZhciBzY3JvbGxZID0gdXRpbHMuZ2V0V2luZG93U2Nyb2xsVG9wKHdpbik7XG4gIHZhciB2aWV3cG9ydFdpZHRoID0gdXRpbHMudmlld3BvcnRXaWR0aCh3aW4pO1xuICB2YXIgdmlld3BvcnRIZWlnaHQgPSB1dGlscy52aWV3cG9ydEhlaWdodCh3aW4pO1xuICB2YXIgZG9jdW1lbnRXaWR0aCA9IGRvY3VtZW50RWxlbWVudC5zY3JvbGxXaWR0aDtcbiAgdmFyIGRvY3VtZW50SGVpZ2h0ID0gZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodDtcblxuICAvLyBzY3JvbGxYWFggb24gaHRtbCBpcyBzeW5jIHdpdGggYm9keSB3aGljaCBtZWFucyBvdmVyZmxvdzogaGlkZGVuIG9uIGJvZHkgZ2V0cyB3cm9uZyBzY3JvbGxYWFguXG4gIC8vIFdlIHNob3VsZCBjdXQgdGhpcyBvdXJzZWxmLlxuICB2YXIgYm9keVN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoYm9keSk7XG4gIGlmIChib2R5U3R5bGUub3ZlcmZsb3dYID09PSAnaGlkZGVuJykge1xuICAgIGRvY3VtZW50V2lkdGggPSB3aW4uaW5uZXJXaWR0aDtcbiAgfVxuICBpZiAoYm9keVN0eWxlLm92ZXJmbG93WSA9PT0gJ2hpZGRlbicpIHtcbiAgICBkb2N1bWVudEhlaWdodCA9IHdpbi5pbm5lckhlaWdodDtcbiAgfVxuXG4gIC8vIFJlc2V0IGVsZW1lbnQgcG9zaXRpb24gYWZ0ZXIgY2FsY3VsYXRlIHRoZSB2aXNpYmxlIGFyZWFcbiAgaWYgKGVsZW1lbnQuc3R5bGUpIHtcbiAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gb3JpZ2luYWxQb3NpdGlvbjtcbiAgfVxuICBpZiAoYWx3YXlzQnlWaWV3cG9ydCB8fCBpc0FuY2VzdG9yRml4ZWQoZWxlbWVudCkpIHtcbiAgICAvLyBDbGlwIGJ5IHZpZXdwb3J0J3Mgc2l6ZS5cbiAgICB2aXNpYmxlUmVjdC5sZWZ0ID0gTWF0aC5tYXgodmlzaWJsZVJlY3QubGVmdCwgc2Nyb2xsWCk7XG4gICAgdmlzaWJsZVJlY3QudG9wID0gTWF0aC5tYXgodmlzaWJsZVJlY3QudG9wLCBzY3JvbGxZKTtcbiAgICB2aXNpYmxlUmVjdC5yaWdodCA9IE1hdGgubWluKHZpc2libGVSZWN0LnJpZ2h0LCBzY3JvbGxYICsgdmlld3BvcnRXaWR0aCk7XG4gICAgdmlzaWJsZVJlY3QuYm90dG9tID0gTWF0aC5taW4odmlzaWJsZVJlY3QuYm90dG9tLCBzY3JvbGxZICsgdmlld3BvcnRIZWlnaHQpO1xuICB9IGVsc2Uge1xuICAgIC8vIENsaXAgYnkgZG9jdW1lbnQncyBzaXplLlxuICAgIHZhciBtYXhWaXNpYmxlV2lkdGggPSBNYXRoLm1heChkb2N1bWVudFdpZHRoLCBzY3JvbGxYICsgdmlld3BvcnRXaWR0aCk7XG4gICAgdmlzaWJsZVJlY3QucmlnaHQgPSBNYXRoLm1pbih2aXNpYmxlUmVjdC5yaWdodCwgbWF4VmlzaWJsZVdpZHRoKTtcbiAgICB2YXIgbWF4VmlzaWJsZUhlaWdodCA9IE1hdGgubWF4KGRvY3VtZW50SGVpZ2h0LCBzY3JvbGxZICsgdmlld3BvcnRIZWlnaHQpO1xuICAgIHZpc2libGVSZWN0LmJvdHRvbSA9IE1hdGgubWluKHZpc2libGVSZWN0LmJvdHRvbSwgbWF4VmlzaWJsZUhlaWdodCk7XG4gIH1cbiAgcmV0dXJuIHZpc2libGVSZWN0LnRvcCA+PSAwICYmIHZpc2libGVSZWN0LmxlZnQgPj0gMCAmJiB2aXNpYmxlUmVjdC5ib3R0b20gPiB2aXNpYmxlUmVjdC50b3AgJiYgdmlzaWJsZVJlY3QucmlnaHQgPiB2aXNpYmxlUmVjdC5sZWZ0ID8gdmlzaWJsZVJlY3QgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBhZGp1c3RGb3JWaWV3cG9ydChlbEZ1dHVyZVBvcywgZWxSZWdpb24sIHZpc2libGVSZWN0LCBvdmVyZmxvdykge1xuICB2YXIgcG9zID0gdXRpbHMuY2xvbmUoZWxGdXR1cmVQb3MpO1xuICB2YXIgc2l6ZSA9IHtcbiAgICB3aWR0aDogZWxSZWdpb24ud2lkdGgsXG4gICAgaGVpZ2h0OiBlbFJlZ2lvbi5oZWlnaHRcbiAgfTtcbiAgaWYgKG92ZXJmbG93LmFkanVzdFggJiYgcG9zLmxlZnQgPCB2aXNpYmxlUmVjdC5sZWZ0KSB7XG4gICAgcG9zLmxlZnQgPSB2aXNpYmxlUmVjdC5sZWZ0O1xuICB9XG5cbiAgLy8gTGVmdCBlZGdlIGluc2lkZSBhbmQgcmlnaHQgZWRnZSBvdXRzaWRlIHZpZXdwb3J0LCB0cnkgdG8gcmVzaXplIGl0LlxuICBpZiAob3ZlcmZsb3cucmVzaXplV2lkdGggJiYgcG9zLmxlZnQgPj0gdmlzaWJsZVJlY3QubGVmdCAmJiBwb3MubGVmdCArIHNpemUud2lkdGggPiB2aXNpYmxlUmVjdC5yaWdodCkge1xuICAgIHNpemUud2lkdGggLT0gcG9zLmxlZnQgKyBzaXplLndpZHRoIC0gdmlzaWJsZVJlY3QucmlnaHQ7XG4gIH1cblxuICAvLyBSaWdodCBlZGdlIG91dHNpZGUgdmlld3BvcnQsIHRyeSB0byBtb3ZlIGl0LlxuICBpZiAob3ZlcmZsb3cuYWRqdXN0WCAmJiBwb3MubGVmdCArIHNpemUud2lkdGggPiB2aXNpYmxlUmVjdC5yaWdodCkge1xuICAgIC8vIOS/neivgeW3pui+ueeVjOWSjOWPr+inhuWMuuWfn+W3pui+ueeVjOWvuem9kFxuICAgIHBvcy5sZWZ0ID0gTWF0aC5tYXgodmlzaWJsZVJlY3QucmlnaHQgLSBzaXplLndpZHRoLCB2aXNpYmxlUmVjdC5sZWZ0KTtcbiAgfVxuXG4gIC8vIFRvcCBlZGdlIG91dHNpZGUgdmlld3BvcnQsIHRyeSB0byBtb3ZlIGl0LlxuICBpZiAob3ZlcmZsb3cuYWRqdXN0WSAmJiBwb3MudG9wIDwgdmlzaWJsZVJlY3QudG9wKSB7XG4gICAgcG9zLnRvcCA9IHZpc2libGVSZWN0LnRvcDtcbiAgfVxuXG4gIC8vIFRvcCBlZGdlIGluc2lkZSBhbmQgYm90dG9tIGVkZ2Ugb3V0c2lkZSB2aWV3cG9ydCwgdHJ5IHRvIHJlc2l6ZSBpdC5cbiAgaWYgKG92ZXJmbG93LnJlc2l6ZUhlaWdodCAmJiBwb3MudG9wID49IHZpc2libGVSZWN0LnRvcCAmJiBwb3MudG9wICsgc2l6ZS5oZWlnaHQgPiB2aXNpYmxlUmVjdC5ib3R0b20pIHtcbiAgICBzaXplLmhlaWdodCAtPSBwb3MudG9wICsgc2l6ZS5oZWlnaHQgLSB2aXNpYmxlUmVjdC5ib3R0b207XG4gIH1cblxuICAvLyBCb3R0b20gZWRnZSBvdXRzaWRlIHZpZXdwb3J0LCB0cnkgdG8gbW92ZSBpdC5cbiAgaWYgKG92ZXJmbG93LmFkanVzdFkgJiYgcG9zLnRvcCArIHNpemUuaGVpZ2h0ID4gdmlzaWJsZVJlY3QuYm90dG9tKSB7XG4gICAgLy8g5L+d6K+B5LiK6L6555WM5ZKM5Y+v6KeG5Yy65Z+f5LiK6L6555WM5a+56b2QXG4gICAgcG9zLnRvcCA9IE1hdGgubWF4KHZpc2libGVSZWN0LmJvdHRvbSAtIHNpemUuaGVpZ2h0LCB2aXNpYmxlUmVjdC50b3ApO1xuICB9XG4gIHJldHVybiB1dGlscy5taXgocG9zLCBzaXplKTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVnaW9uKG5vZGUpIHtcbiAgdmFyIG9mZnNldDtcbiAgdmFyIHc7XG4gIHZhciBoO1xuICBpZiAoIXV0aWxzLmlzV2luZG93KG5vZGUpICYmIG5vZGUubm9kZVR5cGUgIT09IDkpIHtcbiAgICBvZmZzZXQgPSB1dGlscy5vZmZzZXQobm9kZSk7XG4gICAgdyA9IHV0aWxzLm91dGVyV2lkdGgobm9kZSk7XG4gICAgaCA9IHV0aWxzLm91dGVySGVpZ2h0KG5vZGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciB3aW4gPSB1dGlscy5nZXRXaW5kb3cobm9kZSk7XG4gICAgb2Zmc2V0ID0ge1xuICAgICAgbGVmdDogdXRpbHMuZ2V0V2luZG93U2Nyb2xsTGVmdCh3aW4pLFxuICAgICAgdG9wOiB1dGlscy5nZXRXaW5kb3dTY3JvbGxUb3Aod2luKVxuICAgIH07XG4gICAgdyA9IHV0aWxzLnZpZXdwb3J0V2lkdGgod2luKTtcbiAgICBoID0gdXRpbHMudmlld3BvcnRIZWlnaHQod2luKTtcbiAgfVxuICBvZmZzZXQud2lkdGggPSB3O1xuICBvZmZzZXQuaGVpZ2h0ID0gaDtcbiAgcmV0dXJuIG9mZnNldDtcbn1cblxuLyoqXG4gKiDojrflj5Ygbm9kZSDkuIrnmoQgYWxpZ24g5a+56b2Q54K5IOebuOWvueS6jumhtemdoueahOWdkOagh1xuICovXG5cbmZ1bmN0aW9uIGdldEFsaWduT2Zmc2V0KHJlZ2lvbiwgYWxpZ24pIHtcbiAgdmFyIFYgPSBhbGlnbi5jaGFyQXQoMCk7XG4gIHZhciBIID0gYWxpZ24uY2hhckF0KDEpO1xuICB2YXIgdyA9IHJlZ2lvbi53aWR0aDtcbiAgdmFyIGggPSByZWdpb24uaGVpZ2h0O1xuICB2YXIgeCA9IHJlZ2lvbi5sZWZ0O1xuICB2YXIgeSA9IHJlZ2lvbi50b3A7XG4gIGlmIChWID09PSAnYycpIHtcbiAgICB5ICs9IGggLyAyO1xuICB9IGVsc2UgaWYgKFYgPT09ICdiJykge1xuICAgIHkgKz0gaDtcbiAgfVxuICBpZiAoSCA9PT0gJ2MnKSB7XG4gICAgeCArPSB3IC8gMjtcbiAgfSBlbHNlIGlmIChIID09PSAncicpIHtcbiAgICB4ICs9IHc7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBsZWZ0OiB4LFxuICAgIHRvcDogeVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRFbEZ1dHVyZVBvcyhlbFJlZ2lvbiwgcmVmTm9kZVJlZ2lvbiwgcG9pbnRzLCBvZmZzZXQsIHRhcmdldE9mZnNldCkge1xuICB2YXIgcDEgPSBnZXRBbGlnbk9mZnNldChyZWZOb2RlUmVnaW9uLCBwb2ludHNbMV0pO1xuICB2YXIgcDIgPSBnZXRBbGlnbk9mZnNldChlbFJlZ2lvbiwgcG9pbnRzWzBdKTtcbiAgdmFyIGRpZmYgPSBbcDIubGVmdCAtIHAxLmxlZnQsIHAyLnRvcCAtIHAxLnRvcF07XG4gIHJldHVybiB7XG4gICAgbGVmdDogTWF0aC5yb3VuZChlbFJlZ2lvbi5sZWZ0IC0gZGlmZlswXSArIG9mZnNldFswXSAtIHRhcmdldE9mZnNldFswXSksXG4gICAgdG9wOiBNYXRoLnJvdW5kKGVsUmVnaW9uLnRvcCAtIGRpZmZbMV0gKyBvZmZzZXRbMV0gLSB0YXJnZXRPZmZzZXRbMV0pXG4gIH07XG59XG5cbi8qKlxuICogYWxpZ24gZG9tIG5vZGUgZmxleGlibHlcbiAqIEBhdXRob3IgeWltaW5naGVAZ21haWwuY29tXG4gKi9cblxuLy8gaHR0cDovL3lpbWluZ2hlLml0ZXllLmNvbS9ibG9nLzExMjQ3MjBcblxuZnVuY3Rpb24gaXNGYWlsWChlbEZ1dHVyZVBvcywgZWxSZWdpb24sIHZpc2libGVSZWN0KSB7XG4gIHJldHVybiBlbEZ1dHVyZVBvcy5sZWZ0IDwgdmlzaWJsZVJlY3QubGVmdCB8fCBlbEZ1dHVyZVBvcy5sZWZ0ICsgZWxSZWdpb24ud2lkdGggPiB2aXNpYmxlUmVjdC5yaWdodDtcbn1cbmZ1bmN0aW9uIGlzRmFpbFkoZWxGdXR1cmVQb3MsIGVsUmVnaW9uLCB2aXNpYmxlUmVjdCkge1xuICByZXR1cm4gZWxGdXR1cmVQb3MudG9wIDwgdmlzaWJsZVJlY3QudG9wIHx8IGVsRnV0dXJlUG9zLnRvcCArIGVsUmVnaW9uLmhlaWdodCA+IHZpc2libGVSZWN0LmJvdHRvbTtcbn1cbmZ1bmN0aW9uIGlzQ29tcGxldGVGYWlsWChlbEZ1dHVyZVBvcywgZWxSZWdpb24sIHZpc2libGVSZWN0KSB7XG4gIHJldHVybiBlbEZ1dHVyZVBvcy5sZWZ0ID4gdmlzaWJsZVJlY3QucmlnaHQgfHwgZWxGdXR1cmVQb3MubGVmdCArIGVsUmVnaW9uLndpZHRoIDwgdmlzaWJsZVJlY3QubGVmdDtcbn1cbmZ1bmN0aW9uIGlzQ29tcGxldGVGYWlsWShlbEZ1dHVyZVBvcywgZWxSZWdpb24sIHZpc2libGVSZWN0KSB7XG4gIHJldHVybiBlbEZ1dHVyZVBvcy50b3AgPiB2aXNpYmxlUmVjdC5ib3R0b20gfHwgZWxGdXR1cmVQb3MudG9wICsgZWxSZWdpb24uaGVpZ2h0IDwgdmlzaWJsZVJlY3QudG9wO1xufVxuZnVuY3Rpb24gZmxpcChwb2ludHMsIHJlZywgbWFwKSB7XG4gIHZhciByZXQgPSBbXTtcbiAgdXRpbHMuZWFjaChwb2ludHMsIGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0LnB1c2gocC5yZXBsYWNlKHJlZywgZnVuY3Rpb24gKG0pIHtcbiAgICAgIHJldHVybiBtYXBbbV07XG4gICAgfSkpO1xuICB9KTtcbiAgcmV0dXJuIHJldDtcbn1cbmZ1bmN0aW9uIGZsaXBPZmZzZXQob2Zmc2V0LCBpbmRleCkge1xuICBvZmZzZXRbaW5kZXhdID0gLW9mZnNldFtpbmRleF07XG4gIHJldHVybiBvZmZzZXQ7XG59XG5mdW5jdGlvbiBjb252ZXJ0T2Zmc2V0KHN0ciwgb2Zmc2V0TGVuKSB7XG4gIHZhciBuO1xuICBpZiAoLyUkLy50ZXN0KHN0cikpIHtcbiAgICBuID0gcGFyc2VJbnQoc3RyLnN1YnN0cmluZygwLCBzdHIubGVuZ3RoIC0gMSksIDEwKSAvIDEwMCAqIG9mZnNldExlbjtcbiAgfSBlbHNlIHtcbiAgICBuID0gcGFyc2VJbnQoc3RyLCAxMCk7XG4gIH1cbiAgcmV0dXJuIG4gfHwgMDtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZU9mZnNldChvZmZzZXQsIGVsKSB7XG4gIG9mZnNldFswXSA9IGNvbnZlcnRPZmZzZXQob2Zmc2V0WzBdLCBlbC53aWR0aCk7XG4gIG9mZnNldFsxXSA9IGNvbnZlcnRPZmZzZXQob2Zmc2V0WzFdLCBlbC5oZWlnaHQpO1xufVxuXG4vKipcbiAqIEBwYXJhbSBlbFxuICogQHBhcmFtIHRndFJlZ2lvbiDlj4LnhafoioLngrnmiYDljaDnmoTljLrln586IHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH1cbiAqIEBwYXJhbSBhbGlnblxuICovXG5mdW5jdGlvbiBkb0FsaWduKGVsLCB0Z3RSZWdpb24sIGFsaWduLCBpc1RndFJlZ2lvblZpc2libGUpIHtcbiAgdmFyIHBvaW50cyA9IGFsaWduLnBvaW50cztcbiAgdmFyIG9mZnNldCA9IGFsaWduLm9mZnNldCB8fCBbMCwgMF07XG4gIHZhciB0YXJnZXRPZmZzZXQgPSBhbGlnbi50YXJnZXRPZmZzZXQgfHwgWzAsIDBdO1xuICB2YXIgb3ZlcmZsb3cgPSBhbGlnbi5vdmVyZmxvdztcbiAgdmFyIHNvdXJjZSA9IGFsaWduLnNvdXJjZSB8fCBlbDtcbiAgb2Zmc2V0ID0gW10uY29uY2F0KG9mZnNldCk7XG4gIHRhcmdldE9mZnNldCA9IFtdLmNvbmNhdCh0YXJnZXRPZmZzZXQpO1xuICBvdmVyZmxvdyA9IG92ZXJmbG93IHx8IHt9O1xuICB2YXIgbmV3T3ZlcmZsb3dDZmcgPSB7fTtcbiAgdmFyIGZhaWwgPSAwO1xuICB2YXIgYWx3YXlzQnlWaWV3cG9ydCA9ICEhKG92ZXJmbG93ICYmIG92ZXJmbG93LmFsd2F5c0J5Vmlld3BvcnQpO1xuICAvLyDlvZPliY3oioLngrnlj6/ku6XooqvmlL7nva7nmoTmmL7npLrljLrln59cbiAgdmFyIHZpc2libGVSZWN0ID0gZ2V0VmlzaWJsZVJlY3RGb3JFbGVtZW50KHNvdXJjZSwgYWx3YXlzQnlWaWV3cG9ydCk7XG4gIC8vIOW9k+WJjeiKgueCueaJgOWNoOeahOWMuuWfnywgbGVmdC90b3Avd2lkdGgvaGVpZ2h0XG4gIHZhciBlbFJlZ2lvbiA9IGdldFJlZ2lvbihzb3VyY2UpO1xuICAvLyDlsIYgb2Zmc2V0IOi9rOaNouaIkOaVsOWAvO+8jOaUr+aMgeeZvuWIhuavlFxuICBub3JtYWxpemVPZmZzZXQob2Zmc2V0LCBlbFJlZ2lvbik7XG4gIG5vcm1hbGl6ZU9mZnNldCh0YXJnZXRPZmZzZXQsIHRndFJlZ2lvbik7XG4gIC8vIOW9k+WJjeiKgueCueWwhuimgeiiq+aUvue9rueahOS9jee9rlxuICB2YXIgZWxGdXR1cmVQb3MgPSBnZXRFbEZ1dHVyZVBvcyhlbFJlZ2lvbiwgdGd0UmVnaW9uLCBwb2ludHMsIG9mZnNldCwgdGFyZ2V0T2Zmc2V0KTtcbiAgLy8g5b2T5YmN6IqC54K55bCG6KaB5omA5aSE55qE5Yy65Z+fXG4gIHZhciBuZXdFbFJlZ2lvbiA9IHV0aWxzLm1lcmdlKGVsUmVnaW9uLCBlbEZ1dHVyZVBvcyk7XG5cbiAgLy8g5aaC5p6c5Y+v6KeG5Yy65Z+f5LiN6IO95a6M5YWo5pS+572u5b2T5YmN6IqC54K55pe25YWB6K646LCD5pW0XG4gIGlmICh2aXNpYmxlUmVjdCAmJiAob3ZlcmZsb3cuYWRqdXN0WCB8fCBvdmVyZmxvdy5hZGp1c3RZKSAmJiBpc1RndFJlZ2lvblZpc2libGUpIHtcbiAgICBpZiAob3ZlcmZsb3cuYWRqdXN0WCkge1xuICAgICAgLy8g5aaC5p6c5qiq5ZCR5LiN6IO95pS+5LiLXG4gICAgICBpZiAoaXNGYWlsWChlbEZ1dHVyZVBvcywgZWxSZWdpb24sIHZpc2libGVSZWN0KSkge1xuICAgICAgICAvLyDlr7npvZDkvY3nva7lj43kuItcbiAgICAgICAgdmFyIG5ld1BvaW50cyA9IGZsaXAocG9pbnRzLCAvW2xyXS9naSwge1xuICAgICAgICAgIGw6ICdyJyxcbiAgICAgICAgICByOiAnbCdcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIOWBj+enu+mHj+S5n+WPjeS4i1xuICAgICAgICB2YXIgbmV3T2Zmc2V0ID0gZmxpcE9mZnNldChvZmZzZXQsIDApO1xuICAgICAgICB2YXIgbmV3VGFyZ2V0T2Zmc2V0ID0gZmxpcE9mZnNldCh0YXJnZXRPZmZzZXQsIDApO1xuICAgICAgICB2YXIgbmV3RWxGdXR1cmVQb3MgPSBnZXRFbEZ1dHVyZVBvcyhlbFJlZ2lvbiwgdGd0UmVnaW9uLCBuZXdQb2ludHMsIG5ld09mZnNldCwgbmV3VGFyZ2V0T2Zmc2V0KTtcbiAgICAgICAgaWYgKCFpc0NvbXBsZXRlRmFpbFgobmV3RWxGdXR1cmVQb3MsIGVsUmVnaW9uLCB2aXNpYmxlUmVjdCkpIHtcbiAgICAgICAgICBmYWlsID0gMTtcbiAgICAgICAgICBwb2ludHMgPSBuZXdQb2ludHM7XG4gICAgICAgICAgb2Zmc2V0ID0gbmV3T2Zmc2V0O1xuICAgICAgICAgIHRhcmdldE9mZnNldCA9IG5ld1RhcmdldE9mZnNldDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAob3ZlcmZsb3cuYWRqdXN0WSkge1xuICAgICAgLy8g5aaC5p6c57q15ZCR5LiN6IO95pS+5LiLXG4gICAgICBpZiAoaXNGYWlsWShlbEZ1dHVyZVBvcywgZWxSZWdpb24sIHZpc2libGVSZWN0KSkge1xuICAgICAgICAvLyDlr7npvZDkvY3nva7lj43kuItcbiAgICAgICAgdmFyIF9uZXdQb2ludHMgPSBmbGlwKHBvaW50cywgL1t0Yl0vZ2ksIHtcbiAgICAgICAgICB0OiAnYicsXG4gICAgICAgICAgYjogJ3QnXG4gICAgICAgIH0pO1xuICAgICAgICAvLyDlgY/np7vph4/kuZ/lj43kuItcbiAgICAgICAgdmFyIF9uZXdPZmZzZXQgPSBmbGlwT2Zmc2V0KG9mZnNldCwgMSk7XG4gICAgICAgIHZhciBfbmV3VGFyZ2V0T2Zmc2V0ID0gZmxpcE9mZnNldCh0YXJnZXRPZmZzZXQsIDEpO1xuICAgICAgICB2YXIgX25ld0VsRnV0dXJlUG9zID0gZ2V0RWxGdXR1cmVQb3MoZWxSZWdpb24sIHRndFJlZ2lvbiwgX25ld1BvaW50cywgX25ld09mZnNldCwgX25ld1RhcmdldE9mZnNldCk7XG4gICAgICAgIGlmICghaXNDb21wbGV0ZUZhaWxZKF9uZXdFbEZ1dHVyZVBvcywgZWxSZWdpb24sIHZpc2libGVSZWN0KSkge1xuICAgICAgICAgIGZhaWwgPSAxO1xuICAgICAgICAgIHBvaW50cyA9IF9uZXdQb2ludHM7XG4gICAgICAgICAgb2Zmc2V0ID0gX25ld09mZnNldDtcbiAgICAgICAgICB0YXJnZXRPZmZzZXQgPSBfbmV3VGFyZ2V0T2Zmc2V0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g5aaC5p6c5aSx6LSl77yM6YeN5paw6K6h566X5b2T5YmN6IqC54K55bCG6KaB6KKr5pS+572u55qE5L2N572uXG4gICAgaWYgKGZhaWwpIHtcbiAgICAgIGVsRnV0dXJlUG9zID0gZ2V0RWxGdXR1cmVQb3MoZWxSZWdpb24sIHRndFJlZ2lvbiwgcG9pbnRzLCBvZmZzZXQsIHRhcmdldE9mZnNldCk7XG4gICAgICB1dGlscy5taXgobmV3RWxSZWdpb24sIGVsRnV0dXJlUG9zKTtcbiAgICB9XG4gICAgdmFyIGlzU3RpbGxGYWlsWCA9IGlzRmFpbFgoZWxGdXR1cmVQb3MsIGVsUmVnaW9uLCB2aXNpYmxlUmVjdCk7XG4gICAgdmFyIGlzU3RpbGxGYWlsWSA9IGlzRmFpbFkoZWxGdXR1cmVQb3MsIGVsUmVnaW9uLCB2aXNpYmxlUmVjdCk7XG4gICAgLy8g5qOA5p+l5Y+N5LiL5ZCO55qE5L2N572u5piv5ZCm5Y+v5Lul5pS+5LiL5LqG77yM5aaC5p6c5LuN54S25pS+5LiN5LiL77yaXG4gICAgLy8gMS4g5aSN5Y6f5L+u5pS56L+H55qE5a6a5L2N5Y+C5pWwXG4gICAgaWYgKGlzU3RpbGxGYWlsWCB8fCBpc1N0aWxsRmFpbFkpIHtcbiAgICAgIHZhciBfbmV3UG9pbnRzMiA9IHBvaW50cztcblxuICAgICAgLy8g6YeN572u5a+55bqU6YOo5YiG55qE57+76L2s6YC76L6RXG4gICAgICBpZiAoaXNTdGlsbEZhaWxYKSB7XG4gICAgICAgIF9uZXdQb2ludHMyID0gZmxpcChwb2ludHMsIC9bbHJdL2dpLCB7XG4gICAgICAgICAgbDogJ3InLFxuICAgICAgICAgIHI6ICdsJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1N0aWxsRmFpbFkpIHtcbiAgICAgICAgX25ld1BvaW50czIgPSBmbGlwKHBvaW50cywgL1t0Yl0vZ2ksIHtcbiAgICAgICAgICB0OiAnYicsXG4gICAgICAgICAgYjogJ3QnXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcG9pbnRzID0gX25ld1BvaW50czI7XG4gICAgICBvZmZzZXQgPSBhbGlnbi5vZmZzZXQgfHwgWzAsIDBdO1xuICAgICAgdGFyZ2V0T2Zmc2V0ID0gYWxpZ24udGFyZ2V0T2Zmc2V0IHx8IFswLCAwXTtcbiAgICB9XG4gICAgLy8gMi4g5Y+q5pyJ5oyH5a6a5LqG5Y+v5Lul6LCD5pW05b2T5YmN5pa55ZCR5omN6LCD5pW0XG4gICAgbmV3T3ZlcmZsb3dDZmcuYWRqdXN0WCA9IG92ZXJmbG93LmFkanVzdFggJiYgaXNTdGlsbEZhaWxYO1xuICAgIG5ld092ZXJmbG93Q2ZnLmFkanVzdFkgPSBvdmVyZmxvdy5hZGp1c3RZICYmIGlzU3RpbGxGYWlsWTtcblxuICAgIC8vIOehruWunuimgeiwg+aVtO+8jOeUmuiHs+WPr+iDveS8muiwg+aVtOmrmOW6puWuveW6plxuICAgIGlmIChuZXdPdmVyZmxvd0NmZy5hZGp1c3RYIHx8IG5ld092ZXJmbG93Q2ZnLmFkanVzdFkpIHtcbiAgICAgIG5ld0VsUmVnaW9uID0gYWRqdXN0Rm9yVmlld3BvcnQoZWxGdXR1cmVQb3MsIGVsUmVnaW9uLCB2aXNpYmxlUmVjdCwgbmV3T3ZlcmZsb3dDZmcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIG5lZWQganVkZ2UgdG8gaW4gY2FzZSBzZXQgZml4ZWQgd2l0aCBpbiBjc3Mgb24gaGVpZ2h0IGF1dG8gZWxlbWVudFxuICBpZiAobmV3RWxSZWdpb24ud2lkdGggIT09IGVsUmVnaW9uLndpZHRoKSB7XG4gICAgdXRpbHMuY3NzKHNvdXJjZSwgJ3dpZHRoJywgdXRpbHMud2lkdGgoc291cmNlKSArIG5ld0VsUmVnaW9uLndpZHRoIC0gZWxSZWdpb24ud2lkdGgpO1xuICB9XG4gIGlmIChuZXdFbFJlZ2lvbi5oZWlnaHQgIT09IGVsUmVnaW9uLmhlaWdodCkge1xuICAgIHV0aWxzLmNzcyhzb3VyY2UsICdoZWlnaHQnLCB1dGlscy5oZWlnaHQoc291cmNlKSArIG5ld0VsUmVnaW9uLmhlaWdodCAtIGVsUmVnaW9uLmhlaWdodCk7XG4gIH1cblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20va2lzc3l0ZWFtL2tpc3N5L2lzc3Vlcy8xOTBcbiAgLy8g55u45a+55LqO5bGP5bmV5L2N572u5rKh5Y+Y77yM6ICMIGxlZnQvdG9wIOWPmOS6hlxuICAvLyDkvovlpoIgPGRpdiAncmVsYXRpdmUnPjxlbCBhYnNvbHV0ZT48L2Rpdj5cbiAgdXRpbHMub2Zmc2V0KHNvdXJjZSwge1xuICAgIGxlZnQ6IG5ld0VsUmVnaW9uLmxlZnQsXG4gICAgdG9wOiBuZXdFbFJlZ2lvbi50b3BcbiAgfSwge1xuICAgIHVzZUNzc1JpZ2h0OiBhbGlnbi51c2VDc3NSaWdodCxcbiAgICB1c2VDc3NCb3R0b206IGFsaWduLnVzZUNzc0JvdHRvbSxcbiAgICB1c2VDc3NUcmFuc2Zvcm06IGFsaWduLnVzZUNzc1RyYW5zZm9ybSxcbiAgICBpZ25vcmVTaGFrZTogYWxpZ24uaWdub3JlU2hha2VcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgcG9pbnRzOiBwb2ludHMsXG4gICAgb2Zmc2V0OiBvZmZzZXQsXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXQsXG4gICAgb3ZlcmZsb3c6IG5ld092ZXJmbG93Q2ZnXG4gIH07XG59XG4vKipcbiAqICAyMDEyLTA0LTI2IHlpbWluZ2hlQGdtYWlsLmNvbVxuICogICAtIOS8mOWMluaZuuiDveWvuem9kOeul+azlVxuICogICAtIOaFjueUqCByZXNpemVYWFxuICpcbiAqICAyMDExLTA3LTEzIHlpbWluZ2hlQGdtYWlsLmNvbSBub3RlOlxuICogICAtIOWinuWKoOaZuuiDveWvuem9kO+8jOS7peWPiuWkp+Wwj+iwg+aVtOmAiemhuVxuICoqL1xuXG5mdW5jdGlvbiBpc091dE9mVmlzaWJsZVJlY3QodGFyZ2V0LCBhbHdheXNCeVZpZXdwb3J0KSB7XG4gIHZhciB2aXNpYmxlUmVjdCA9IGdldFZpc2libGVSZWN0Rm9yRWxlbWVudCh0YXJnZXQsIGFsd2F5c0J5Vmlld3BvcnQpO1xuICB2YXIgdGFyZ2V0UmVnaW9uID0gZ2V0UmVnaW9uKHRhcmdldCk7XG4gIHJldHVybiAhdmlzaWJsZVJlY3QgfHwgdGFyZ2V0UmVnaW9uLmxlZnQgKyB0YXJnZXRSZWdpb24ud2lkdGggPD0gdmlzaWJsZVJlY3QubGVmdCB8fCB0YXJnZXRSZWdpb24udG9wICsgdGFyZ2V0UmVnaW9uLmhlaWdodCA8PSB2aXNpYmxlUmVjdC50b3AgfHwgdGFyZ2V0UmVnaW9uLmxlZnQgPj0gdmlzaWJsZVJlY3QucmlnaHQgfHwgdGFyZ2V0UmVnaW9uLnRvcCA+PSB2aXNpYmxlUmVjdC5ib3R0b207XG59XG5mdW5jdGlvbiBhbGlnbkVsZW1lbnQoZWwsIHJlZk5vZGUsIGFsaWduKSB7XG4gIHZhciB0YXJnZXQgPSBhbGlnbi50YXJnZXQgfHwgcmVmTm9kZTtcbiAgdmFyIHJlZk5vZGVSZWdpb24gPSBnZXRSZWdpb24odGFyZ2V0KTtcbiAgdmFyIGlzVGFyZ2V0Tm90T3V0T2ZWaXNpYmxlID0gIWlzT3V0T2ZWaXNpYmxlUmVjdCh0YXJnZXQsIGFsaWduLm92ZXJmbG93ICYmIGFsaWduLm92ZXJmbG93LmFsd2F5c0J5Vmlld3BvcnQpO1xuICByZXR1cm4gZG9BbGlnbihlbCwgcmVmTm9kZVJlZ2lvbiwgYWxpZ24sIGlzVGFyZ2V0Tm90T3V0T2ZWaXNpYmxlKTtcbn1cbmFsaWduRWxlbWVudC5fX2dldE9mZnNldFBhcmVudCA9IGdldE9mZnNldFBhcmVudDtcbmFsaWduRWxlbWVudC5fX2dldFZpc2libGVSZWN0Rm9yRWxlbWVudCA9IGdldFZpc2libGVSZWN0Rm9yRWxlbWVudDtcblxuLyoqXG4gKiBgdGd0UG9pbnRgOiB7IHBhZ2VYLCBwYWdlWSB9IG9yIHsgY2xpZW50WCwgY2xpZW50WSB9LlxuICogSWYgY2xpZW50IHBvc2l0aW9uIHByb3ZpZGVkLCB3aWxsIGludGVybmFsIGNvbnZlcnQgdG8gcGFnZSBwb3NpdGlvbi5cbiAqL1xuXG5mdW5jdGlvbiBhbGlnblBvaW50KGVsLCB0Z3RQb2ludCwgYWxpZ24pIHtcbiAgdmFyIHBhZ2VYO1xuICB2YXIgcGFnZVk7XG4gIHZhciBkb2MgPSB1dGlscy5nZXREb2N1bWVudChlbCk7XG4gIHZhciB3aW4gPSBkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdztcbiAgdmFyIHNjcm9sbFggPSB1dGlscy5nZXRXaW5kb3dTY3JvbGxMZWZ0KHdpbik7XG4gIHZhciBzY3JvbGxZID0gdXRpbHMuZ2V0V2luZG93U2Nyb2xsVG9wKHdpbik7XG4gIHZhciB2aWV3cG9ydFdpZHRoID0gdXRpbHMudmlld3BvcnRXaWR0aCh3aW4pO1xuICB2YXIgdmlld3BvcnRIZWlnaHQgPSB1dGlscy52aWV3cG9ydEhlaWdodCh3aW4pO1xuICBpZiAoJ3BhZ2VYJyBpbiB0Z3RQb2ludCkge1xuICAgIHBhZ2VYID0gdGd0UG9pbnQucGFnZVg7XG4gIH0gZWxzZSB7XG4gICAgcGFnZVggPSBzY3JvbGxYICsgdGd0UG9pbnQuY2xpZW50WDtcbiAgfVxuICBpZiAoJ3BhZ2VZJyBpbiB0Z3RQb2ludCkge1xuICAgIHBhZ2VZID0gdGd0UG9pbnQucGFnZVk7XG4gIH0gZWxzZSB7XG4gICAgcGFnZVkgPSBzY3JvbGxZICsgdGd0UG9pbnQuY2xpZW50WTtcbiAgfVxuICB2YXIgdGd0UmVnaW9uID0ge1xuICAgIGxlZnQ6IHBhZ2VYLFxuICAgIHRvcDogcGFnZVksXG4gICAgd2lkdGg6IDAsXG4gICAgaGVpZ2h0OiAwXG4gIH07XG4gIHZhciBwb2ludEluVmlldyA9IHBhZ2VYID49IDAgJiYgcGFnZVggPD0gc2Nyb2xsWCArIHZpZXdwb3J0V2lkdGggJiYgcGFnZVkgPj0gMCAmJiBwYWdlWSA8PSBzY3JvbGxZICsgdmlld3BvcnRIZWlnaHQ7XG5cbiAgLy8gUHJvdmlkZSBkZWZhdWx0IHRhcmdldCBwb2ludFxuICB2YXIgcG9pbnRzID0gW2FsaWduLnBvaW50c1swXSwgJ2NjJ107XG4gIHJldHVybiBkb0FsaWduKGVsLCB0Z3RSZWdpb24sIF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBhbGlnbiksIHt9LCB7XG4gICAgcG9pbnRzOiBwb2ludHNcbiAgfSksIHBvaW50SW5WaWV3KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYWxpZ25FbGVtZW50O1xuZXhwb3J0IHsgYWxpZ25FbGVtZW50LCBhbGlnblBvaW50IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcbiIsImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCB3YXJuaW5nIGZyb20gXCIuL3dhcm5pbmdcIjtcblxuLyoqXG4gKiBEZWVwbHkgY29tcGFyZXMgdHdvIG9iamVjdCBsaXRlcmFscy5cbiAqIEBwYXJhbSBvYmoxIG9iamVjdCAxXG4gKiBAcGFyYW0gb2JqMiBvYmplY3QgMlxuICogQHBhcmFtIHNoYWxsb3cgc2hhbGxvdyBjb21wYXJlXG4gKiBAcmV0dXJuc1xuICovXG5mdW5jdGlvbiBpc0VxdWFsKG9iajEsIG9iajIpIHtcbiAgdmFyIHNoYWxsb3cgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9wdWxsLzU5NzkvZmlsZXMjZGlmZi1mZGU3MTQ1MDUwYzQ3Y2MzYTMwNjg1NmVmZDVmOWMzMDE2ZTg2ZTg1OWRlOWFmYmQwMmM4NzliZTUwNjdlNThmXG4gIHZhciByZWZTZXQgPSBuZXcgU2V0KCk7XG4gIGZ1bmN0aW9uIGRlZXBFcXVhbChhLCBiKSB7XG4gICAgdmFyIGxldmVsID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAxO1xuICAgIHZhciBjaXJjdWxhciA9IHJlZlNldC5oYXMoYSk7XG4gICAgd2FybmluZyghY2lyY3VsYXIsICdXYXJuaW5nOiBUaGVyZSBtYXkgYmUgY2lyY3VsYXIgcmVmZXJlbmNlcycpO1xuICAgIGlmIChjaXJjdWxhcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoYSA9PT0gYikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChzaGFsbG93ICYmIGxldmVsID4gMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZWZTZXQuYWRkKGEpO1xuICAgIHZhciBuZXdMZXZlbCA9IGxldmVsICsgMTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGIpIHx8IGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFkZWVwRXF1YWwoYVtpXSwgYltpXSwgbmV3TGV2ZWwpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGEgJiYgYiAmJiBfdHlwZW9mKGEpID09PSAnb2JqZWN0JyAmJiBfdHlwZW9mKGIpID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhKTtcbiAgICAgIGlmIChrZXlzLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMoYikubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBrZXlzLmV2ZXJ5KGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIGRlZXBFcXVhbChhW2tleV0sIGJba2V5XSwgbmV3TGV2ZWwpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIG90aGVyXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBkZWVwRXF1YWwob2JqMSwgb2JqMik7XG59XG5leHBvcnQgZGVmYXVsdCBpc0VxdWFsOyIsImV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoZWxlbWVudCkge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgaWYgKGVsZW1lbnQub2Zmc2V0UGFyZW50KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGVsZW1lbnQuZ2V0QkJveCkge1xuICAgICAgdmFyIF9nZXRCQm94ID0gZWxlbWVudC5nZXRCQm94KCksXG4gICAgICAgIHdpZHRoID0gX2dldEJCb3gud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IF9nZXRCQm94LmhlaWdodDtcbiAgICAgIGlmICh3aWR0aCB8fCBoZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCkge1xuICAgICAgdmFyIF9lbGVtZW50JGdldEJvdW5kaW5nQyA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgIF93aWR0aCA9IF9lbGVtZW50JGdldEJvdW5kaW5nQy53aWR0aCxcbiAgICAgICAgX2hlaWdodCA9IF9lbGVtZW50JGdldEJvdW5kaW5nQy5oZWlnaHQ7XG4gICAgICBpZiAoX3dpZHRoIHx8IF9oZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn0pOyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gKGNhbGxiYWNrLCBidWZmZXIpIHtcbiAgdmFyIGNhbGxlZFJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIHZhciB0aW1lb3V0UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuXG4gIGZ1bmN0aW9uIGNhbmNlbFRyaWdnZXIoKSB7XG4gICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lb3V0UmVmLmN1cnJlbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJpZ2dlcihmb3JjZSkge1xuICAgIGNhbmNlbFRyaWdnZXIoKTtcblxuICAgIGlmICghY2FsbGVkUmVmLmN1cnJlbnQgfHwgZm9yY2UgPT09IHRydWUpIHtcbiAgICAgIGlmIChjYWxsYmFjayhmb3JjZSkgPT09IGZhbHNlKSB7XG4gICAgICAgIC8vIE5vdCBkZWxheSBzaW5jZSBjYWxsYmFjayBjYW5jZWxsZWQgc2VsZlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNhbGxlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIHRpbWVvdXRSZWYuY3VycmVudCA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FsbGVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIH0sIGJ1ZmZlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRpbWVvdXRSZWYuY3VycmVudCA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FsbGVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgdHJpZ2dlcigpO1xuICAgICAgfSwgYnVmZmVyKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gW3RyaWdnZXIsIGZ1bmN0aW9uICgpIHtcbiAgICBjYWxsZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIGNhbmNlbFRyaWdnZXIoKTtcbiAgfV07XG59KTsiLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBSZXNpemVPYnNlcnZlciBmcm9tICdyZXNpemUtb2JzZXJ2ZXItcG9seWZpbGwnO1xuaW1wb3J0IGNvbnRhaW5zIGZyb20gXCJyYy11dGlsL2VzL0RvbS9jb250YWluc1wiO1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2FtZVBvaW50KHByZXYsIG5leHQpIHtcbiAgaWYgKHByZXYgPT09IG5leHQpIHJldHVybiB0cnVlO1xuICBpZiAoIXByZXYgfHwgIW5leHQpIHJldHVybiBmYWxzZTtcblxuICBpZiAoJ3BhZ2VYJyBpbiBuZXh0ICYmICdwYWdlWScgaW4gbmV4dCkge1xuICAgIHJldHVybiBwcmV2LnBhZ2VYID09PSBuZXh0LnBhZ2VYICYmIHByZXYucGFnZVkgPT09IG5leHQucGFnZVk7XG4gIH1cblxuICBpZiAoJ2NsaWVudFgnIGluIG5leHQgJiYgJ2NsaWVudFknIGluIG5leHQpIHtcbiAgICByZXR1cm4gcHJldi5jbGllbnRYID09PSBuZXh0LmNsaWVudFggJiYgcHJldi5jbGllbnRZID09PSBuZXh0LmNsaWVudFk7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVzdG9yZUZvY3VzKGFjdGl2ZUVsZW1lbnQsIGNvbnRhaW5lcikge1xuICAvLyBGb2N1cyBiYWNrIGlmIGlzIGluIHRoZSBjb250YWluZXJcbiAgaWYgKGFjdGl2ZUVsZW1lbnQgIT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgY29udGFpbnMoY29udGFpbmVyLCBhY3RpdmVFbGVtZW50KSAmJiB0eXBlb2YgYWN0aXZlRWxlbWVudC5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFjdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIG1vbml0b3JSZXNpemUoZWxlbWVudCwgY2FsbGJhY2spIHtcbiAgdmFyIHByZXZXaWR0aCA9IG51bGw7XG4gIHZhciBwcmV2SGVpZ2h0ID0gbnVsbDtcblxuICBmdW5jdGlvbiBvblJlc2l6ZShfcmVmKSB7XG4gICAgdmFyIF9yZWYyID0gX3NsaWNlZFRvQXJyYXkoX3JlZiwgMSksXG4gICAgICAgIHRhcmdldCA9IF9yZWYyWzBdLnRhcmdldDtcblxuICAgIGlmICghZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkpIHJldHVybjtcblxuICAgIHZhciBfdGFyZ2V0JGdldEJvdW5kaW5nQ2wgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgIHdpZHRoID0gX3RhcmdldCRnZXRCb3VuZGluZ0NsLndpZHRoLFxuICAgICAgICBoZWlnaHQgPSBfdGFyZ2V0JGdldEJvdW5kaW5nQ2wuaGVpZ2h0O1xuXG4gICAgdmFyIGZpeGVkV2lkdGggPSBNYXRoLmZsb29yKHdpZHRoKTtcbiAgICB2YXIgZml4ZWRIZWlnaHQgPSBNYXRoLmZsb29yKGhlaWdodCk7XG5cbiAgICBpZiAocHJldldpZHRoICE9PSBmaXhlZFdpZHRoIHx8IHByZXZIZWlnaHQgIT09IGZpeGVkSGVpZ2h0KSB7XG4gICAgICAvLyBodHRwczovL3dlYmtpdC5vcmcvYmxvZy85OTk3L3Jlc2l6ZW9ic2VydmVyLWluLXdlYmtpdC9cbiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICBjYWxsYmFjayh7XG4gICAgICAgICAgd2lkdGg6IGZpeGVkV2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBmaXhlZEhlaWdodFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHByZXZXaWR0aCA9IGZpeGVkV2lkdGg7XG4gICAgcHJldkhlaWdodCA9IGZpeGVkSGVpZ2h0O1xuICB9XG5cbiAgdmFyIHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKG9uUmVzaXplKTtcblxuICBpZiAoZWxlbWVudCkge1xuICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZWxlbWVudCk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgfTtcbn0iLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcblxuLyoqXG4gKiBSZW1vdmVkIHByb3BzOlxuICogIC0gY2hpbGRyZW5Qcm9wc1xuICovXG5pbXBvcnQgeyBhbGlnbkVsZW1lbnQsIGFsaWduUG9pbnQgfSBmcm9tICdkb20tYWxpZ24nO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSBcInJjLXV0aWwvZXMvaXNFcXVhbFwiO1xuaW1wb3J0IGFkZEV2ZW50TGlzdGVuZXIgZnJvbSBcInJjLXV0aWwvZXMvRG9tL2FkZEV2ZW50TGlzdGVuZXJcIjtcbmltcG9ydCBpc1Zpc2libGUgZnJvbSBcInJjLXV0aWwvZXMvRG9tL2lzVmlzaWJsZVwiO1xuaW1wb3J0IHVzZUxheW91dEVmZmVjdCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCB7IGNvbXBvc2VSZWYgfSBmcm9tIFwicmMtdXRpbC9lcy9yZWZcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlQnVmZmVyIGZyb20gXCIuL2hvb2tzL3VzZUJ1ZmZlclwiO1xuaW1wb3J0IHsgaXNTYW1lUG9pbnQsIG1vbml0b3JSZXNpemUsIHJlc3RvcmVGb2N1cyB9IGZyb20gXCIuL3V0aWxcIjtcblxuZnVuY3Rpb24gZ2V0RWxlbWVudChmdW5jKSB7XG4gIGlmICh0eXBlb2YgZnVuYyAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIG51bGw7XG4gIHJldHVybiBmdW5jKCk7XG59XG5cbmZ1bmN0aW9uIGdldFBvaW50KHBvaW50KSB7XG4gIGlmIChfdHlwZW9mKHBvaW50KSAhPT0gJ29iamVjdCcgfHwgIXBvaW50KSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHBvaW50O1xufVxuXG52YXIgQWxpZ24gPSBmdW5jdGlvbiBBbGlnbihfcmVmLCByZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICAgIGRpc2FibGVkID0gX3JlZi5kaXNhYmxlZCxcbiAgICAgIHRhcmdldCA9IF9yZWYudGFyZ2V0LFxuICAgICAgYWxpZ24gPSBfcmVmLmFsaWduLFxuICAgICAgb25BbGlnbiA9IF9yZWYub25BbGlnbixcbiAgICAgIG1vbml0b3JXaW5kb3dSZXNpemUgPSBfcmVmLm1vbml0b3JXaW5kb3dSZXNpemUsXG4gICAgICBfcmVmJG1vbml0b3JCdWZmZXJUaW0gPSBfcmVmLm1vbml0b3JCdWZmZXJUaW1lLFxuICAgICAgbW9uaXRvckJ1ZmZlclRpbWUgPSBfcmVmJG1vbml0b3JCdWZmZXJUaW0gPT09IHZvaWQgMCA/IDAgOiBfcmVmJG1vbml0b3JCdWZmZXJUaW07XG4gIHZhciBjYWNoZVJlZiA9IFJlYWN0LnVzZVJlZih7fSk7XG4gIC8qKiBQb3B1cCBub2RlIHJlZiAqL1xuXG4gIHZhciBub2RlUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciBjaGlsZE5vZGUgPSBSZWFjdC5DaGlsZHJlbi5vbmx5KGNoaWxkcmVuKTsgLy8gPT09PT09PT09PT09PT09PT09PT09IEFsaWduID09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gV2Ugc2F2ZSB0aGUgcHJvcHMgaGVyZSB0byBhdm9pZCBjbG9zdXJlIG1ha2VzIHByb3BzIG9vZFxuXG4gIHZhciBmb3JjZUFsaWduUHJvcHNSZWYgPSBSZWFjdC51c2VSZWYoe30pO1xuICBmb3JjZUFsaWduUHJvcHNSZWYuY3VycmVudC5kaXNhYmxlZCA9IGRpc2FibGVkO1xuICBmb3JjZUFsaWduUHJvcHNSZWYuY3VycmVudC50YXJnZXQgPSB0YXJnZXQ7XG4gIGZvcmNlQWxpZ25Qcm9wc1JlZi5jdXJyZW50LmFsaWduID0gYWxpZ247XG4gIGZvcmNlQWxpZ25Qcm9wc1JlZi5jdXJyZW50Lm9uQWxpZ24gPSBvbkFsaWduO1xuXG4gIHZhciBfdXNlQnVmZmVyID0gdXNlQnVmZmVyKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2ZvcmNlQWxpZ25Qcm9wc1JlZiRjID0gZm9yY2VBbGlnblByb3BzUmVmLmN1cnJlbnQsXG4gICAgICAgIGxhdGVzdERpc2FibGVkID0gX2ZvcmNlQWxpZ25Qcm9wc1JlZiRjLmRpc2FibGVkLFxuICAgICAgICBsYXRlc3RUYXJnZXQgPSBfZm9yY2VBbGlnblByb3BzUmVmJGMudGFyZ2V0LFxuICAgICAgICBsYXRlc3RBbGlnbiA9IF9mb3JjZUFsaWduUHJvcHNSZWYkYy5hbGlnbixcbiAgICAgICAgbGF0ZXN0T25BbGlnbiA9IF9mb3JjZUFsaWduUHJvcHNSZWYkYy5vbkFsaWduO1xuICAgIHZhciBzb3VyY2UgPSBub2RlUmVmLmN1cnJlbnQ7XG5cbiAgICBpZiAoIWxhdGVzdERpc2FibGVkICYmIGxhdGVzdFRhcmdldCAmJiBzb3VyY2UpIHtcbiAgICAgIHZhciBfcmVzdWx0O1xuXG4gICAgICB2YXIgX2VsZW1lbnQgPSBnZXRFbGVtZW50KGxhdGVzdFRhcmdldCk7XG5cbiAgICAgIHZhciBfcG9pbnQgPSBnZXRQb2ludChsYXRlc3RUYXJnZXQpO1xuXG4gICAgICBjYWNoZVJlZi5jdXJyZW50LmVsZW1lbnQgPSBfZWxlbWVudDtcbiAgICAgIGNhY2hlUmVmLmN1cnJlbnQucG9pbnQgPSBfcG9pbnQ7XG4gICAgICBjYWNoZVJlZi5jdXJyZW50LmFsaWduID0gbGF0ZXN0QWxpZ247IC8vIElFIGxvc2UgZm9jdXMgYWZ0ZXIgZWxlbWVudCByZWFsaWduXG4gICAgICAvLyBXZSBzaG91bGQgcmVjb3JkIGFjdGl2ZUVsZW1lbnQgYW5kIHJlc3RvcmUgbGF0ZXJcblxuICAgICAgdmFyIF9kb2N1bWVudCA9IGRvY3VtZW50LFxuICAgICAgICAgIGFjdGl2ZUVsZW1lbnQgPSBfZG9jdW1lbnQuYWN0aXZlRWxlbWVudDsgLy8gV2Ugb25seSBhbGlnbiB3aGVuIGVsZW1lbnQgaXMgdmlzaWJsZVxuXG4gICAgICBpZiAoX2VsZW1lbnQgJiYgaXNWaXNpYmxlKF9lbGVtZW50KSkge1xuICAgICAgICBfcmVzdWx0ID0gYWxpZ25FbGVtZW50KHNvdXJjZSwgX2VsZW1lbnQsIGxhdGVzdEFsaWduKTtcbiAgICAgIH0gZWxzZSBpZiAoX3BvaW50KSB7XG4gICAgICAgIF9yZXN1bHQgPSBhbGlnblBvaW50KHNvdXJjZSwgX3BvaW50LCBsYXRlc3RBbGlnbik7XG4gICAgICB9XG5cbiAgICAgIHJlc3RvcmVGb2N1cyhhY3RpdmVFbGVtZW50LCBzb3VyY2UpO1xuXG4gICAgICBpZiAobGF0ZXN0T25BbGlnbiAmJiBfcmVzdWx0KSB7XG4gICAgICAgIGxhdGVzdE9uQWxpZ24oc291cmNlLCBfcmVzdWx0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LCBtb25pdG9yQnVmZmVyVGltZSksXG4gICAgICBfdXNlQnVmZmVyMiA9IF9zbGljZWRUb0FycmF5KF91c2VCdWZmZXIsIDIpLFxuICAgICAgX2ZvcmNlQWxpZ24gPSBfdXNlQnVmZmVyMlswXSxcbiAgICAgIGNhbmNlbEZvcmNlQWxpZ24gPSBfdXNlQnVmZmVyMlsxXTsgLy8gPT09PT09PT09PT09PT09PT09PT09IEVmZmVjdCA9PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSGFuZGxlIHByb3BzIGNoYW5nZVxuXG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKCksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICAgIGVsZW1lbnQgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0RWxlbWVudCA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTMgPSBSZWFjdC51c2VTdGF0ZSgpLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTMsIDIpLFxuICAgICAgcG9pbnQgPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgICAgc2V0UG9pbnQgPSBfUmVhY3QkdXNlU3RhdGU0WzFdO1xuXG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc2V0RWxlbWVudChnZXRFbGVtZW50KHRhcmdldCkpO1xuICAgIHNldFBvaW50KGdldFBvaW50KHRhcmdldCkpO1xuICB9KTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY2FjaGVSZWYuY3VycmVudC5lbGVtZW50ICE9PSBlbGVtZW50IHx8ICFpc1NhbWVQb2ludChjYWNoZVJlZi5jdXJyZW50LnBvaW50LCBwb2ludCkgfHwgIWlzRXF1YWwoY2FjaGVSZWYuY3VycmVudC5hbGlnbiwgYWxpZ24pKSB7XG4gICAgICBfZm9yY2VBbGlnbigpO1xuICAgIH1cbiAgfSk7IC8vIFdhdGNoIHBvcHVwIGVsZW1lbnQgcmVzaXplXG5cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY2FuY2VsRm4gPSBtb25pdG9yUmVzaXplKG5vZGVSZWYuY3VycmVudCwgX2ZvcmNlQWxpZ24pO1xuICAgIHJldHVybiBjYW5jZWxGbjtcbiAgfSwgW25vZGVSZWYuY3VycmVudF0pOyAvLyBXYXRjaCB0YXJnZXQgZWxlbWVudCByZXNpemVcblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBjYW5jZWxGbiA9IG1vbml0b3JSZXNpemUoZWxlbWVudCwgX2ZvcmNlQWxpZ24pO1xuICAgIHJldHVybiBjYW5jZWxGbjtcbiAgfSwgW2VsZW1lbnRdKTsgLy8gTGlzdGVuIGZvciBkaXNhYmxlZCBjaGFuZ2VcblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghZGlzYWJsZWQpIHtcbiAgICAgIF9mb3JjZUFsaWduKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbmNlbEZvcmNlQWxpZ24oKTtcbiAgICB9XG4gIH0sIFtkaXNhYmxlZF0pOyAvLyBMaXN0ZW4gZm9yIHdpbmRvdyByZXNpemVcblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChtb25pdG9yV2luZG93UmVzaXplKSB7XG4gICAgICB2YXIgY2FuY2VsRm4gPSBhZGRFdmVudExpc3RlbmVyKHdpbmRvdywgJ3Jlc2l6ZScsIF9mb3JjZUFsaWduKTtcbiAgICAgIHJldHVybiBjYW5jZWxGbi5yZW1vdmU7XG4gICAgfVxuICB9LCBbbW9uaXRvcldpbmRvd1Jlc2l6ZV0pOyAvLyBDbGVhciBhbGwgaWYgdW5tb3VudFxuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbmNlbEZvcmNlQWxpZ24oKTtcbiAgICB9O1xuICB9LCBbXSk7IC8vID09PT09PT09PT09PT09PT09PT09PT0gUmVmID09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZm9yY2VBbGlnbjogZnVuY3Rpb24gZm9yY2VBbGlnbigpIHtcbiAgICAgICAgcmV0dXJuIF9mb3JjZUFsaWduKHRydWUpO1xuICAgICAgfVxuICAgIH07XG4gIH0pOyAvLyA9PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PVxuXG4gIGlmICggLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkTm9kZSkpIHtcbiAgICBjaGlsZE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkTm9kZSwge1xuICAgICAgcmVmOiBjb21wb3NlUmVmKGNoaWxkTm9kZS5yZWYsIG5vZGVSZWYpXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gY2hpbGROb2RlO1xufTtcblxudmFyIFJjQWxpZ24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihBbGlnbik7XG5SY0FsaWduLmRpc3BsYXlOYW1lID0gJ0FsaWduJztcbmV4cG9ydCBkZWZhdWx0IFJjQWxpZ247IiwiaW1wb3J0IF9yZWdlbmVyYXRvclJ1bnRpbWUgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3JlZ2VuZXJhdG9yUnVudGltZVwiO1xuaW1wb3J0IF9hc3luY1RvR2VuZXJhdG9yIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3luY1RvR2VuZXJhdG9yXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHJhZiBmcm9tIFwicmMtdXRpbC9lcy9yYWZcIjtcbmltcG9ydCB1c2VTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VTdGF0ZVwiO1xuLyoqXG4gKiBQb3B1cCBzaG91bGQgZm9sbG93IHRoZSBzdGVwcyBmb3IgZWFjaCBjb21wb25lbnQgd29yayBjb3JyZWN0bHk6XG4gKiBtZWFzdXJlIC0gY2hlY2sgZm9yIHRoZSBjdXJyZW50IHN0cmV0Y2ggc2l6ZVxuICogYWxpZ24gLSBsZXQgY29tcG9uZW50IGFsaWduIHRoZSBwb3NpdGlvblxuICogYWxpZ25lZCAtIHJlLWFsaWduIGFnYWluIGluIGNhc2UgYWRkaXRpb25hbCBjbGFzc05hbWUgY2hhbmdlZCB0aGUgc2l6ZVxuICogYWZ0ZXJBbGlnbiAtIGNob2ljZSBuZXh0IHN0ZXAgaXMgdHJpZ2dlciBtb3Rpb24gb3IgZmluaXNoZWRcbiAqIGJlZm9yZU1vdGlvbiAtIHNob3VsZCByZXNldCBtb3Rpb24gdG8gaW52aXNpYmxlIHNvIHRoYXQgQ1NTTW90aW9uIGNhbiBkbyBub3JtYWwgbW90aW9uXG4gKiBtb3Rpb24gLSBwbGF5IHRoZSBtb3Rpb25cbiAqIHN0YWJsZSAtIGV2ZXJ5dGhpbmcgaXMgZG9uZVxuICovXG5cbnZhciBTdGF0dXNRdWV1ZSA9IFsnbWVhc3VyZScsICdhbGlnblByZScsICdhbGlnbicsIG51bGwsICdtb3Rpb24nXTtcbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAodmlzaWJsZSwgZG9NZWFzdXJlKSB7XG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShudWxsKSxcbiAgICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgICAgc3RhdHVzID0gX3VzZVN0YXRlMlswXSxcbiAgICAgIHNldEludGVybmFsU3RhdHVzID0gX3VzZVN0YXRlMlsxXTtcblxuICB2YXIgcmFmUmVmID0gdXNlUmVmKCk7XG5cbiAgZnVuY3Rpb24gc2V0U3RhdHVzKG5leHRTdGF0dXMpIHtcbiAgICBzZXRJbnRlcm5hbFN0YXR1cyhuZXh0U3RhdHVzLCB0cnVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbmNlbFJhZigpIHtcbiAgICByYWYuY2FuY2VsKHJhZlJlZi5jdXJyZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdvTmV4dFN0YXR1cyhjYWxsYmFjaykge1xuICAgIGNhbmNlbFJhZigpO1xuICAgIHJhZlJlZi5jdXJyZW50ID0gcmFmKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIE9ubHkgYWxpZ24gc2hvdWxkIGJlIG1hbnVhbGx5IHRyaWdnZXJcbiAgICAgIHNldFN0YXR1cyhmdW5jdGlvbiAocHJldikge1xuICAgICAgICBzd2l0Y2ggKHN0YXR1cykge1xuICAgICAgICAgIGNhc2UgJ2FsaWduJzpcbiAgICAgICAgICAgIHJldHVybiAnbW90aW9uJztcblxuICAgICAgICAgIGNhc2UgJ21vdGlvbic6XG4gICAgICAgICAgICByZXR1cm4gJ3N0YWJsZSc7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByZXY7XG4gICAgICB9KTtcbiAgICAgIGNhbGxiYWNrID09PSBudWxsIHx8IGNhbGxiYWNrID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjYWxsYmFjaygpO1xuICAgIH0pO1xuICB9IC8vIEluaXQgc3RhdHVzXG5cblxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHNldFN0YXR1cygnbWVhc3VyZScpO1xuICB9LCBbdmlzaWJsZV0pOyAvLyBHbyBuZXh0IHN0YXR1c1xuXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICAgIGNhc2UgJ21lYXN1cmUnOlxuICAgICAgICBkb01lYXN1cmUoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cykge1xuICAgICAgcmFmUmVmLmN1cnJlbnQgPSByYWYoIC8qI19fUFVSRV9fKi9fYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7XG4gICAgICAgIHZhciBpbmRleCwgbmV4dFN0YXR1cztcbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIGluZGV4ID0gU3RhdHVzUXVldWUuaW5kZXhPZihzdGF0dXMpO1xuICAgICAgICAgICAgICAgIG5leHRTdGF0dXMgPSBTdGF0dXNRdWV1ZVtpbmRleCArIDFdO1xuXG4gICAgICAgICAgICAgICAgaWYgKG5leHRTdGF0dXMgJiYgaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICBzZXRTdGF0dXMobmV4dFN0YXR1cyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlKTtcbiAgICAgIH0pKSk7XG4gICAgfVxuICB9LCBbc3RhdHVzXSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbmNlbFJhZigpO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgcmV0dXJuIFtzdGF0dXMsIGdvTmV4dFN0YXR1c107XG59KTsiLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoc3RyZXRjaCkge1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoe1xuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMFxuICB9KSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgICAgdGFyZ2V0U2l6ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRUYXJnZXRTaXplID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcblxuICBmdW5jdGlvbiBtZWFzdXJlU3RyZXRjaChlbGVtZW50KSB7XG4gICAgdmFyIHRndFdpZHRoID0gZWxlbWVudC5vZmZzZXRXaWR0aCxcbiAgICAgICAgdGd0SGVpZ2h0ID0gZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG5cbiAgICB2YXIgX2VsZW1lbnQkZ2V0Qm91bmRpbmdDID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgd2lkdGggPSBfZWxlbWVudCRnZXRCb3VuZGluZ0Mud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IF9lbGVtZW50JGdldEJvdW5kaW5nQy5oZWlnaHQ7IC8vIFJlY3QgaXMgbW9yZSBhY2N1cmF0ZSB0aGFuIG9mZnNldCwgdXNlIGlmIG5lYXJcblxuXG4gICAgaWYgKE1hdGguYWJzKHRndFdpZHRoIC0gd2lkdGgpIDwgMSAmJiBNYXRoLmFicyh0Z3RIZWlnaHQgLSBoZWlnaHQpIDwgMSkge1xuICAgICAgdGd0V2lkdGggPSB3aWR0aDtcbiAgICAgIHRndEhlaWdodCA9IGhlaWdodDtcbiAgICB9XG5cbiAgICBzZXRUYXJnZXRTaXplKHtcbiAgICAgIHdpZHRoOiB0Z3RXaWR0aCxcbiAgICAgIGhlaWdodDogdGd0SGVpZ2h0XG4gICAgfSk7XG4gIH0gLy8gTWVyZ2Ugc3RyZXRjaCBzdHlsZVxuXG5cbiAgdmFyIHN0eWxlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNpemVTdHlsZSA9IHt9O1xuXG4gICAgaWYgKHN0cmV0Y2gpIHtcbiAgICAgIHZhciB3aWR0aCA9IHRhcmdldFNpemUud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0ID0gdGFyZ2V0U2l6ZS5oZWlnaHQ7IC8vIFN0cmV0Y2ggd2l0aCB0YXJnZXRcblxuICAgICAgaWYgKHN0cmV0Y2guaW5kZXhPZignaGVpZ2h0JykgIT09IC0xICYmIGhlaWdodCkge1xuICAgICAgICBzaXplU3R5bGUuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgfSBlbHNlIGlmIChzdHJldGNoLmluZGV4T2YoJ21pbkhlaWdodCcpICE9PSAtMSAmJiBoZWlnaHQpIHtcbiAgICAgICAgc2l6ZVN0eWxlLm1pbkhlaWdodCA9IGhlaWdodDtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0cmV0Y2guaW5kZXhPZignd2lkdGgnKSAhPT0gLTEgJiYgd2lkdGgpIHtcbiAgICAgICAgc2l6ZVN0eWxlLndpZHRoID0gd2lkdGg7XG4gICAgICB9IGVsc2UgaWYgKHN0cmV0Y2guaW5kZXhPZignbWluV2lkdGgnKSAhPT0gLTEgJiYgd2lkdGgpIHtcbiAgICAgICAgc2l6ZVN0eWxlLm1pbldpZHRoID0gd2lkdGg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNpemVTdHlsZTtcbiAgfSwgW3N0cmV0Y2gsIHRhcmdldFNpemVdKTtcbiAgcmV0dXJuIFtzdHlsZSwgbWVhc3VyZVN0cmV0Y2hdO1xufSk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IEFsaWduIGZyb20gJ3JjLWFsaWduJztcbmltcG9ydCB1c2VMYXlvdXRFZmZlY3QgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTGF5b3V0RWZmZWN0XCI7XG5pbXBvcnQgQ1NTTW90aW9uIGZyb20gJ3JjLW1vdGlvbic7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB1c2VWaXNpYmxlU3RhdHVzIGZyb20gXCIuL3VzZVZpc2libGVTdGF0dXNcIjtcbmltcG9ydCB7IGdldE1vdGlvbiB9IGZyb20gXCIuLi91dGlscy9sZWdhY3lVdGlsXCI7XG5pbXBvcnQgdXNlU3RyZXRjaFN0eWxlIGZyb20gXCIuL3VzZVN0cmV0Y2hTdHlsZVwiO1xudmFyIFBvcHVwSW5uZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgdmlzaWJsZSA9IHByb3BzLnZpc2libGUsXG4gICAgICBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIHpJbmRleCA9IHByb3BzLnpJbmRleCxcbiAgICAgIHN0cmV0Y2ggPSBwcm9wcy5zdHJldGNoLFxuICAgICAgZGVzdHJveVBvcHVwT25IaWRlID0gcHJvcHMuZGVzdHJveVBvcHVwT25IaWRlLFxuICAgICAgZm9yY2VSZW5kZXIgPSBwcm9wcy5mb3JjZVJlbmRlcixcbiAgICAgIGFsaWduID0gcHJvcHMuYWxpZ24sXG4gICAgICBwb2ludCA9IHByb3BzLnBvaW50LFxuICAgICAgZ2V0Um9vdERvbU5vZGUgPSBwcm9wcy5nZXRSb290RG9tTm9kZSxcbiAgICAgIGdldENsYXNzTmFtZUZyb21BbGlnbiA9IHByb3BzLmdldENsYXNzTmFtZUZyb21BbGlnbixcbiAgICAgIG9uQWxpZ24gPSBwcm9wcy5vbkFsaWduLFxuICAgICAgb25Nb3VzZUVudGVyID0gcHJvcHMub25Nb3VzZUVudGVyLFxuICAgICAgb25Nb3VzZUxlYXZlID0gcHJvcHMub25Nb3VzZUxlYXZlLFxuICAgICAgb25Nb3VzZURvd24gPSBwcm9wcy5vbk1vdXNlRG93bixcbiAgICAgIG9uVG91Y2hTdGFydCA9IHByb3BzLm9uVG91Y2hTdGFydCxcbiAgICAgIG9uQ2xpY2sgPSBwcm9wcy5vbkNsaWNrO1xuICB2YXIgYWxpZ25SZWYgPSB1c2VSZWYoKTtcbiAgdmFyIGVsZW1lbnRSZWYgPSB1c2VSZWYoKTtcblxuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoKSxcbiAgICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgICAgYWxpZ25lZENsYXNzTmFtZSA9IF91c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRBbGlnbmVkQ2xhc3NOYW1lID0gX3VzZVN0YXRlMlsxXTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gTWVhc3VyZSA9PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIHZhciBfdXNlU3RyZXRjaFN0eWxlID0gdXNlU3RyZXRjaFN0eWxlKHN0cmV0Y2gpLFxuICAgICAgX3VzZVN0cmV0Y2hTdHlsZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RyZXRjaFN0eWxlLCAyKSxcbiAgICAgIHN0cmV0Y2hTdHlsZSA9IF91c2VTdHJldGNoU3R5bGUyWzBdLFxuICAgICAgbWVhc3VyZVN0cmV0Y2hTdHlsZSA9IF91c2VTdHJldGNoU3R5bGUyWzFdO1xuXG4gIGZ1bmN0aW9uIGRvTWVhc3VyZSgpIHtcbiAgICBpZiAoc3RyZXRjaCkge1xuICAgICAgbWVhc3VyZVN0cmV0Y2hTdHlsZShnZXRSb290RG9tTm9kZSgpKTtcbiAgICB9XG4gIH0gLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFN0YXR1cyA9PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIHZhciBfdXNlVmlzaWJsZVN0YXR1cyA9IHVzZVZpc2libGVTdGF0dXModmlzaWJsZSwgZG9NZWFzdXJlKSxcbiAgICAgIF91c2VWaXNpYmxlU3RhdHVzMiA9IF9zbGljZWRUb0FycmF5KF91c2VWaXNpYmxlU3RhdHVzLCAyKSxcbiAgICAgIHN0YXR1cyA9IF91c2VWaXNpYmxlU3RhdHVzMlswXSxcbiAgICAgIGdvTmV4dFN0YXR1cyA9IF91c2VWaXNpYmxlU3RhdHVzMlsxXTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IEFsaWducyA9PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogYGFsaWduZWRDbGFzc05hbWVgIG1heSBtb2RpZnkgYHNvdXJjZWAgc2l6ZSxcbiAgICogd2hpY2ggbWVhbnMgb25lIHRpbWUgYWxpZ24gbWF5IG5vdCBtb3ZlIHRvIHRoZSBjb3JyZWN0IHBvc2l0aW9uIGF0IG9uY2UuXG4gICAqXG4gICAqIFdlIHdpbGwgcmVzZXQgYGFsaWduVGltZXNgIGZvciBlYWNoIHN0YXR1cyBzd2l0Y2ggdG8gYGFsaWduUHJlYFxuICAgKiBhbmQgbGV0IGByYy1hbGlnbmAgdG8gYWxpZ24gZm9yIG11bHRpcGxlIHRpbWVzIHRvIGVuc3VyZSBnZXQgZmluYWwgc3RhYmxlIHBsYWNlLlxuICAgKiBDdXJyZW50bHkgd2UgbWFyayBgYWxpZ25UaW1lcyA8IDJgIHJlcGVhdCBhbGlnbiwgaXQgd2lsbCBpbmNyZWFzZSBpZiB1c2VyIHJlcG9ydCBmb3IgYWxpZ24gaXNzdWUuXG4gICAqIFxuICAgKiBVcGRhdGU6XG4gICAqIEluIFJlYWN0IDE4LiBgcmMtYWxpZ25gIGVmZmVjdCBvZiBhbGlnbiBtYXkgZmFzdGVyIHRoYW4gcmVmIGNhbGxlZCB0cmlnZ2VyIGBmb3JjZUFsaWduYC5cbiAgICogV2UgYWRqdXN0IHRoaXMgdG8gYGFsaWduVGltZXMgPCAyYC5cbiAgICogV2UgbmVlZCByZWZhY3RvciBgcmMtYWxpZ25gIHRvIHN1cHBvcnQgbWFyayBvZiBgZm9yY2VBbGlnbmAgY2FsbCBpZiB0aGlzIHN0aWxsIGhhcHBlbi5cbiAgICovXG5cblxuICB2YXIgX3VzZVN0YXRlMyA9IHVzZVN0YXRlKDApLFxuICAgICAgX3VzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTMsIDIpLFxuICAgICAgYWxpZ25UaW1lcyA9IF91c2VTdGF0ZTRbMF0sXG4gICAgICBzZXRBbGlnblRpbWVzID0gX3VzZVN0YXRlNFsxXTtcblxuICB2YXIgcHJlcGFyZVJlc29sdmVSZWYgPSB1c2VSZWYoKTtcbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc3RhdHVzID09PSAnYWxpZ25QcmUnKSB7XG4gICAgICBzZXRBbGlnblRpbWVzKDApO1xuICAgIH1cbiAgfSwgW3N0YXR1c10pOyAvLyBgdGFyZ2V0YCBvbiBgcmMtYWxpZ25gIGNhbiBhY2NlcHQgYXMgYSBmdW5jdGlvbiB0byBnZXQgdGhlIGJpbmQgZWxlbWVudCBvciBhIHBvaW50LlxuICAvLyByZWY6IGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL3JjLWFsaWduXG5cbiAgZnVuY3Rpb24gZ2V0QWxpZ25UYXJnZXQoKSB7XG4gICAgaWYgKHBvaW50KSB7XG4gICAgICByZXR1cm4gcG9pbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldFJvb3REb21Ob2RlO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9yY2VBbGlnbigpIHtcbiAgICB2YXIgX2FsaWduUmVmJGN1cnJlbnQ7XG5cbiAgICAoX2FsaWduUmVmJGN1cnJlbnQgPSBhbGlnblJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYWxpZ25SZWYkY3VycmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FsaWduUmVmJGN1cnJlbnQuZm9yY2VBbGlnbigpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25JbnRlcm5hbEFsaWduKHBvcHVwRG9tTm9kZSwgbWF0Y2hBbGlnbikge1xuICAgIHZhciBuZXh0QWxpZ25lZENsYXNzTmFtZSA9IGdldENsYXNzTmFtZUZyb21BbGlnbihtYXRjaEFsaWduKTtcblxuICAgIGlmIChhbGlnbmVkQ2xhc3NOYW1lICE9PSBuZXh0QWxpZ25lZENsYXNzTmFtZSkge1xuICAgICAgc2V0QWxpZ25lZENsYXNzTmFtZShuZXh0QWxpZ25lZENsYXNzTmFtZSk7XG4gICAgfSAvLyBXZSB3aWxsIHJldHJ5IG11bHRpIHRpbWVzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBlbGVtZW50IGhhcyBiZWVuIGFsaWduIGluIHRoZSByaWdodCBwb3NpdGlvbi5cblxuXG4gICAgc2V0QWxpZ25UaW1lcyhmdW5jdGlvbiAodmFsKSB7XG4gICAgICByZXR1cm4gdmFsICsgMTtcbiAgICB9KTtcblxuICAgIGlmIChzdGF0dXMgPT09ICdhbGlnbicpIHtcbiAgICAgIG9uQWxpZ24gPT09IG51bGwgfHwgb25BbGlnbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbGlnbihwb3B1cERvbU5vZGUsIG1hdGNoQWxpZ24pO1xuICAgIH1cbiAgfSAvLyBEZWxheSB0byBnbyB0byBuZXh0IHN0YXR1c1xuXG5cbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc3RhdHVzID09PSAnYWxpZ24nKSB7XG4gICAgICAvLyBSZXBlYXQgdW50aWwgbm90IG1vcmUgYWxpZ24gbmVlZGVkXG4gICAgICBpZiAoYWxpZ25UaW1lcyA8IDMpIHtcbiAgICAgICAgZm9yY2VBbGlnbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ29OZXh0U3RhdHVzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgX3ByZXBhcmVSZXNvbHZlUmVmJGN1O1xuXG4gICAgICAgICAgKF9wcmVwYXJlUmVzb2x2ZVJlZiRjdSA9IHByZXBhcmVSZXNvbHZlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9wcmVwYXJlUmVzb2x2ZVJlZiRjdSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3ByZXBhcmVSZXNvbHZlUmVmJGN1LmNhbGwocHJlcGFyZVJlc29sdmVSZWYpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFthbGlnblRpbWVzXSk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PSBNb3Rpb24gPT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIG1vdGlvbiA9IF9vYmplY3RTcHJlYWQoe30sIGdldE1vdGlvbihwcm9wcykpO1xuXG4gIFsnb25BcHBlYXJFbmQnLCAnb25FbnRlckVuZCcsICdvbkxlYXZlRW5kJ10uZm9yRWFjaChmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgdmFyIG9yaWdpbkhhbmRsZXIgPSBtb3Rpb25bZXZlbnROYW1lXTtcblxuICAgIG1vdGlvbltldmVudE5hbWVdID0gZnVuY3Rpb24gKGVsZW1lbnQsIGV2ZW50KSB7XG4gICAgICBnb05leHRTdGF0dXMoKTtcbiAgICAgIHJldHVybiBvcmlnaW5IYW5kbGVyID09PSBudWxsIHx8IG9yaWdpbkhhbmRsZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9yaWdpbkhhbmRsZXIoZWxlbWVudCwgZXZlbnQpO1xuICAgIH07XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIG9uU2hvd1ByZXBhcmUoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICBwcmVwYXJlUmVzb2x2ZVJlZi5jdXJyZW50ID0gcmVzb2x2ZTtcbiAgICB9KTtcbiAgfSAvLyBHbyB0byBzdGFibGUgZGlyZWN0bHkgd2hlbiBtb3Rpb24gbm90IHByb3ZpZGVkXG5cblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghbW90aW9uLm1vdGlvbk5hbWUgJiYgc3RhdHVzID09PSAnbW90aW9uJykge1xuICAgICAgZ29OZXh0U3RhdHVzKCk7XG4gICAgfVxuICB9LCBbbW90aW9uLm1vdGlvbk5hbWUsIHN0YXR1c10pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IFJlZnMgPT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvcmNlQWxpZ246IGZvcmNlQWxpZ24sXG4gICAgICBnZXRFbGVtZW50OiBmdW5jdGlvbiBnZXRFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudFJlZi5jdXJyZW50O1xuICAgICAgfVxuICAgIH07XG4gIH0pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBtZXJnZWRTdHlsZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3RyZXRjaFN0eWxlKSwge30sIHtcbiAgICB6SW5kZXg6IHpJbmRleCxcbiAgICBvcGFjaXR5OiBzdGF0dXMgPT09ICdtb3Rpb24nIHx8IHN0YXR1cyA9PT0gJ3N0YWJsZScgfHwgIXZpc2libGUgPyB1bmRlZmluZWQgOiAwLFxuICAgIC8vIENhbm5vdCBpbnRlcmFjdCB3aXRoIGRpc2FwcGVhcmluZyBlbGVtZW50c1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzM1MDUxI2lzc3VlY29tbWVudC0xMTAxMzQwNzE0XG4gICAgcG9pbnRlckV2ZW50czogIXZpc2libGUgJiYgc3RhdHVzICE9PSAnc3RhYmxlJyA/ICdub25lJyA6IHVuZGVmaW5lZFxuICB9LCBzdHlsZSk7IC8vIEFsaWduIHN0YXR1c1xuXG5cbiAgdmFyIGFsaWduRGlzYWJsZWQgPSB0cnVlO1xuXG4gIGlmIChhbGlnbiAhPT0gbnVsbCAmJiBhbGlnbiAhPT0gdm9pZCAwICYmIGFsaWduLnBvaW50cyAmJiAoc3RhdHVzID09PSAnYWxpZ24nIHx8IHN0YXR1cyA9PT0gJ3N0YWJsZScpKSB7XG4gICAgYWxpZ25EaXNhYmxlZCA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIGNoaWxkTm9kZSA9IGNoaWxkcmVuOyAvLyBXcmFwcGVyIHdoZW4gbXVsdGlwbGUgY2hpbGRyZW5cblxuICBpZiAoUmVhY3QuQ2hpbGRyZW4uY291bnQoY2hpbGRyZW4pID4gMSkge1xuICAgIGNoaWxkTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50XCIpXG4gICAgfSwgY2hpbGRyZW4pO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENTU01vdGlvbiwgX2V4dGVuZHMoe1xuICAgIHZpc2libGU6IHZpc2libGUsXG4gICAgcmVmOiBlbGVtZW50UmVmLFxuICAgIGxlYXZlZENsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oaWRkZW5cIilcbiAgfSwgbW90aW9uLCB7XG4gICAgb25BcHBlYXJQcmVwYXJlOiBvblNob3dQcmVwYXJlLFxuICAgIG9uRW50ZXJQcmVwYXJlOiBvblNob3dQcmVwYXJlLFxuICAgIHJlbW92ZU9uTGVhdmU6IGRlc3Ryb3lQb3B1cE9uSGlkZSxcbiAgICBmb3JjZVJlbmRlcjogZm9yY2VSZW5kZXJcbiAgfSksIGZ1bmN0aW9uIChfcmVmLCBtb3Rpb25SZWYpIHtcbiAgICB2YXIgbW90aW9uQ2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgICAgIG1vdGlvblN0eWxlID0gX3JlZi5zdHlsZTtcbiAgICB2YXIgbWVyZ2VkQ2xhc3NOYW1lID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIGNsYXNzTmFtZSwgYWxpZ25lZENsYXNzTmFtZSwgbW90aW9uQ2xhc3NOYW1lKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQWxpZ24sIHtcbiAgICAgIHRhcmdldDogZ2V0QWxpZ25UYXJnZXQoKSxcbiAgICAgIGtleTogXCJwb3B1cFwiLFxuICAgICAgcmVmOiBhbGlnblJlZixcbiAgICAgIG1vbml0b3JXaW5kb3dSZXNpemU6IHRydWUsXG4gICAgICBkaXNhYmxlZDogYWxpZ25EaXNhYmxlZCxcbiAgICAgIGFsaWduOiBhbGlnbixcbiAgICAgIG9uQWxpZ246IG9uSW50ZXJuYWxBbGlnblxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIHJlZjogbW90aW9uUmVmLFxuICAgICAgY2xhc3NOYW1lOiBtZXJnZWRDbGFzc05hbWUsXG4gICAgICBvbk1vdXNlRW50ZXI6IG9uTW91c2VFbnRlcixcbiAgICAgIG9uTW91c2VMZWF2ZTogb25Nb3VzZUxlYXZlLFxuICAgICAgb25Nb3VzZURvd25DYXB0dXJlOiBvbk1vdXNlRG93bixcbiAgICAgIG9uVG91Y2hTdGFydENhcHR1cmU6IG9uVG91Y2hTdGFydCxcbiAgICAgIG9uQ2xpY2s6IG9uQ2xpY2ssXG4gICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtb3Rpb25TdHlsZSksIG1lcmdlZFN0eWxlKVxuICAgIH0sIGNoaWxkTm9kZSkpO1xuICB9KTtcbn0pO1xuUG9wdXBJbm5lci5kaXNwbGF5TmFtZSA9ICdQb3B1cElubmVyJztcbmV4cG9ydCBkZWZhdWx0IFBvcHVwSW5uZXI7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IENTU01vdGlvbiBmcm9tICdyYy1tb3Rpb24nO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG52YXIgTW9iaWxlUG9wdXBJbm5lciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICB2aXNpYmxlID0gcHJvcHMudmlzaWJsZSxcbiAgICAgIHpJbmRleCA9IHByb3BzLnpJbmRleCxcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBfcHJvcHMkbW9iaWxlID0gcHJvcHMubW9iaWxlO1xuICBfcHJvcHMkbW9iaWxlID0gX3Byb3BzJG1vYmlsZSA9PT0gdm9pZCAwID8ge30gOiBfcHJvcHMkbW9iaWxlO1xuICB2YXIgcG9wdXBDbGFzc05hbWUgPSBfcHJvcHMkbW9iaWxlLnBvcHVwQ2xhc3NOYW1lLFxuICAgICAgcG9wdXBTdHlsZSA9IF9wcm9wcyRtb2JpbGUucG9wdXBTdHlsZSxcbiAgICAgIF9wcm9wcyRtb2JpbGUkcG9wdXBNbyA9IF9wcm9wcyRtb2JpbGUucG9wdXBNb3Rpb24sXG4gICAgICBwb3B1cE1vdGlvbiA9IF9wcm9wcyRtb2JpbGUkcG9wdXBNbyA9PT0gdm9pZCAwID8ge30gOiBfcHJvcHMkbW9iaWxlJHBvcHVwTW8sXG4gICAgICBwb3B1cFJlbmRlciA9IF9wcm9wcyRtb2JpbGUucG9wdXBSZW5kZXIsXG4gICAgICBvbkNsaWNrID0gcHJvcHMub25DbGljaztcbiAgdmFyIGVsZW1lbnRSZWYgPSBSZWFjdC51c2VSZWYoKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBSZWZzID09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBmb3JjZUFsaWduOiBmdW5jdGlvbiBmb3JjZUFsaWduKCkge30sXG4gICAgICBnZXRFbGVtZW50OiBmdW5jdGlvbiBnZXRFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudFJlZi5jdXJyZW50O1xuICAgICAgfVxuICAgIH07XG4gIH0pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBtZXJnZWRTdHlsZSA9IF9vYmplY3RTcHJlYWQoe1xuICAgIHpJbmRleDogekluZGV4XG4gIH0sIHBvcHVwU3R5bGUpO1xuXG4gIHZhciBjaGlsZE5vZGUgPSBjaGlsZHJlbjsgLy8gV3JhcHBlciB3aGVuIG11bHRpcGxlIGNoaWxkcmVuXG5cbiAgaWYgKFJlYWN0LkNoaWxkcmVuLmNvdW50KGNoaWxkcmVuKSA+IDEpIHtcbiAgICBjaGlsZE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29udGVudFwiKVxuICAgIH0sIGNoaWxkcmVuKTtcbiAgfSAvLyBNb2JpbGUgc3VwcG9ydCBhZGRpdGlvbmFsIHJlbmRlclxuXG5cbiAgaWYgKHBvcHVwUmVuZGVyKSB7XG4gICAgY2hpbGROb2RlID0gcG9wdXBSZW5kZXIoY2hpbGROb2RlKTtcbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDU1NNb3Rpb24sIF9leHRlbmRzKHtcbiAgICB2aXNpYmxlOiB2aXNpYmxlLFxuICAgIHJlZjogZWxlbWVudFJlZixcbiAgICByZW1vdmVPbkxlYXZlOiB0cnVlXG4gIH0sIHBvcHVwTW90aW9uKSwgZnVuY3Rpb24gKF9yZWYsIG1vdGlvblJlZikge1xuICAgIHZhciBtb3Rpb25DbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICAgICAgbW90aW9uU3R5bGUgPSBfcmVmLnN0eWxlO1xuICAgIHZhciBtZXJnZWRDbGFzc05hbWUgPSBjbGFzc05hbWVzKHByZWZpeENscywgcG9wdXBDbGFzc05hbWUsIG1vdGlvbkNsYXNzTmFtZSk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIHJlZjogbW90aW9uUmVmLFxuICAgICAgY2xhc3NOYW1lOiBtZXJnZWRDbGFzc05hbWUsXG4gICAgICBvbkNsaWNrOiBvbkNsaWNrLFxuICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgbW90aW9uU3R5bGUpLCBtZXJnZWRTdHlsZSlcbiAgICB9LCBjaGlsZE5vZGUpO1xuICB9KTtcbn0pO1xuTW9iaWxlUG9wdXBJbm5lci5kaXNwbGF5TmFtZSA9ICdNb2JpbGVQb3B1cElubmVyJztcbmV4cG9ydCBkZWZhdWx0IE1vYmlsZVBvcHVwSW5uZXI7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcInZpc2libGVcIiwgXCJtb2JpbGVcIl07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGlzTW9iaWxlIGZyb20gXCJyYy11dGlsL2VzL2lzTW9iaWxlXCI7XG5pbXBvcnQgTWFzayBmcm9tIFwiLi9NYXNrXCI7XG5pbXBvcnQgUG9wdXBJbm5lciBmcm9tIFwiLi9Qb3B1cElubmVyXCI7XG5pbXBvcnQgTW9iaWxlUG9wdXBJbm5lciBmcm9tIFwiLi9Nb2JpbGVQb3B1cElubmVyXCI7XG52YXIgUG9wdXAgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAoX3JlZiwgcmVmKSB7XG4gIHZhciB2aXNpYmxlID0gX3JlZi52aXNpYmxlLFxuICAgICAgbW9iaWxlID0gX3JlZi5tb2JpbGUsXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZSh2aXNpYmxlKSxcbiAgICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgICAgaW5uZXJWaXNpYmxlID0gX3VzZVN0YXRlMlswXSxcbiAgICAgIHNlcklubmVyVmlzaWJsZSA9IF91c2VTdGF0ZTJbMV07XG5cbiAgdmFyIF91c2VTdGF0ZTMgPSB1c2VTdGF0ZShmYWxzZSksXG4gICAgICBfdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlMywgMiksXG4gICAgICBpbk1vYmlsZSA9IF91c2VTdGF0ZTRbMF0sXG4gICAgICBzZXRJbk1vYmlsZSA9IF91c2VTdGF0ZTRbMV07XG5cbiAgdmFyIGNsb25lUHJvcHMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICB2aXNpYmxlOiBpbm5lclZpc2libGVcbiAgfSk7IC8vIFdlIGNoZWNrIG1vYmlsZSBpbiB2aXNpYmxlIGNoYW5nZWQgaGVyZS5cbiAgLy8gQW5kIHRoaXMgYWxzbyBkZWxheSBzZXQgYGlubmVyVmlzaWJsZWAgdG8gYXZvaWQgcG9wdXAgY29tcG9uZW50IHJlbmRlciBmbGFzaFxuXG5cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzZXJJbm5lclZpc2libGUodmlzaWJsZSk7XG5cbiAgICBpZiAodmlzaWJsZSAmJiBtb2JpbGUpIHtcbiAgICAgIHNldEluTW9iaWxlKGlzTW9iaWxlKCkpO1xuICAgIH1cbiAgfSwgW3Zpc2libGUsIG1vYmlsZV0pO1xuICB2YXIgcG9wdXBOb2RlID0gaW5Nb2JpbGUgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNb2JpbGVQb3B1cElubmVyLCBfZXh0ZW5kcyh7fSwgY2xvbmVQcm9wcywge1xuICAgIG1vYmlsZTogbW9iaWxlLFxuICAgIHJlZjogcmVmXG4gIH0pKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBvcHVwSW5uZXIsIF9leHRlbmRzKHt9LCBjbG9uZVByb3BzLCB7XG4gICAgcmVmOiByZWZcbiAgfSkpOyAvLyBXZSBjYW4gdXNlIGZyYWdtZW50IGRpcmVjdGx5IGJ1dCB0aGlzIG1heSBmYWlsZWQgc29tZSBzZWxlY3RvciB1c2FnZS4gS2VlcCBhcyBvcmlnaW4gbG9naWNcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTWFzaywgY2xvbmVQcm9wcyksIHBvcHVwTm9kZSk7XG59KTtcblBvcHVwLmRpc3BsYXlOYW1lID0gJ1BvcHVwJztcbmV4cG9ydCBkZWZhdWx0IFBvcHVwOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbnZhciBUcmlnZ2VyQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuZXhwb3J0IGRlZmF1bHQgVHJpZ2dlckNvbnRleHQ7IiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2Fzc2VydFRoaXNJbml0aWFsaXplZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXNzZXJ0VGhpc0luaXRpYWxpemVkXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c1wiO1xuaW1wb3J0IF9jcmVhdGVTdXBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlU3VwZXJcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG5pbXBvcnQgY29udGFpbnMgZnJvbSBcInJjLXV0aWwvZXMvRG9tL2NvbnRhaW5zXCI7XG5pbXBvcnQgZmluZERPTU5vZGUgZnJvbSBcInJjLXV0aWwvZXMvRG9tL2ZpbmRET01Ob2RlXCI7XG5pbXBvcnQgeyBjb21wb3NlUmVmLCBzdXBwb3J0UmVmIH0gZnJvbSBcInJjLXV0aWwvZXMvcmVmXCI7XG5pbXBvcnQgYWRkRXZlbnRMaXN0ZW5lciBmcm9tIFwicmMtdXRpbC9lcy9Eb20vYWRkRXZlbnRMaXN0ZW5lclwiO1xuaW1wb3J0IFBvcnRhbCBmcm9tIFwicmMtdXRpbC9lcy9Qb3J0YWxcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgZ2V0QWxpZ25Gcm9tUGxhY2VtZW50LCBnZXRBbGlnblBvcHVwQ2xhc3NOYW1lIH0gZnJvbSBcIi4vdXRpbHMvYWxpZ25VdGlsXCI7XG5pbXBvcnQgUG9wdXAgZnJvbSBcIi4vUG9wdXBcIjtcbmltcG9ydCBUcmlnZ2VyQ29udGV4dCBmcm9tIFwiLi9jb250ZXh0XCI7XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5mdW5jdGlvbiByZXR1cm5FbXB0eVN0cmluZygpIHtcbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiByZXR1cm5Eb2N1bWVudChlbGVtZW50KSB7XG4gIGlmIChlbGVtZW50KSB7XG4gICAgcmV0dXJuIGVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgfVxuXG4gIHJldHVybiB3aW5kb3cuZG9jdW1lbnQ7XG59XG5cbnZhciBBTExfSEFORExFUlMgPSBbJ29uQ2xpY2snLCAnb25Nb3VzZURvd24nLCAnb25Ub3VjaFN0YXJ0JywgJ29uTW91c2VFbnRlcicsICdvbk1vdXNlTGVhdmUnLCAnb25Gb2N1cycsICdvbkJsdXInLCAnb25Db250ZXh0TWVudSddO1xuXG4vKipcbiAqIEludGVybmFsIHVzYWdlLiBEbyBub3QgdXNlIGluIHlvdXIgY29kZSBzaW5jZSB0aGlzIHdpbGwgYmUgcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlVHJpZ2dlcihQb3J0YWxDb21wb25lbnQpIHtcbiAgdmFyIFRyaWdnZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgICBfaW5oZXJpdHMoVHJpZ2dlciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFRyaWdnZXIpO1xuXG4gICAgLy8gZW5zdXJlIGBnZXRDb250YWluZXJgIHdpbGwgYmUgY2FsbGVkIG9ubHkgb25jZVxuICAgIGZ1bmN0aW9uIFRyaWdnZXIocHJvcHMpIHtcbiAgICAgIHZhciBfdGhpcztcblxuICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRyaWdnZXIpO1xuXG4gICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzKTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInBvcHVwUmVmXCIsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVSZWYoKSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJ0cmlnZ2VyUmVmXCIsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVSZWYoKSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJwb3J0YWxDb250YWluZXJcIiwgdm9pZCAwKTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImF0dGFjaElkXCIsIHZvaWQgMCk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJjbGlja091dHNpZGVIYW5kbGVyXCIsIHZvaWQgMCk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJ0b3VjaE91dHNpZGVIYW5kbGVyXCIsIHZvaWQgMCk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJjb250ZXh0TWVudU91dHNpZGVIYW5kbGVyMVwiLCB2b2lkIDApO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiY29udGV4dE1lbnVPdXRzaWRlSGFuZGxlcjJcIiwgdm9pZCAwKTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm1vdXNlRG93blRpbWVvdXRcIiwgdm9pZCAwKTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImZvY3VzVGltZVwiLCB2b2lkIDApO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwicHJlQ2xpY2tUaW1lXCIsIHZvaWQgMCk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJwcmVUb3VjaFRpbWVcIiwgdm9pZCAwKTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImRlbGF5VGltZXJcIiwgdm9pZCAwKTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImhhc1BvcHVwTW91c2VEb3duXCIsIHZvaWQgMCk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbk1vdXNlRW50ZXJcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIG1vdXNlRW50ZXJEZWxheSA9IF90aGlzLnByb3BzLm1vdXNlRW50ZXJEZWxheTtcblxuICAgICAgICBfdGhpcy5maXJlRXZlbnRzKCdvbk1vdXNlRW50ZXInLCBlKTtcblxuICAgICAgICBfdGhpcy5kZWxheVNldFBvcHVwVmlzaWJsZSh0cnVlLCBtb3VzZUVudGVyRGVsYXksIG1vdXNlRW50ZXJEZWxheSA/IG51bGwgOiBlKTtcbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25Nb3VzZU1vdmVcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgX3RoaXMuZmlyZUV2ZW50cygnb25Nb3VzZU1vdmUnLCBlKTtcblxuICAgICAgICBfdGhpcy5zZXRQb2ludChlKTtcbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25Nb3VzZUxlYXZlXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIF90aGlzLmZpcmVFdmVudHMoJ29uTW91c2VMZWF2ZScsIGUpO1xuXG4gICAgICAgIF90aGlzLmRlbGF5U2V0UG9wdXBWaXNpYmxlKGZhbHNlLCBfdGhpcy5wcm9wcy5tb3VzZUxlYXZlRGVsYXkpO1xuICAgICAgfSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvblBvcHVwTW91c2VFbnRlclwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzLmNsZWFyRGVsYXlUaW1lcigpO1xuICAgICAgfSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvblBvcHVwTW91c2VMZWF2ZVwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgX3RoaXMkcG9wdXBSZWYkY3VycmVuO1xuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1jb21wb25lbnQvdHJpZ2dlci9wdWxsLzEzXG4gICAgICAgIC8vIHJlYWN0IGJ1Zz9cbiAgICAgICAgaWYgKGUucmVsYXRlZFRhcmdldCAmJiAhZS5yZWxhdGVkVGFyZ2V0LnNldFRpbWVvdXQgJiYgY29udGFpbnMoKF90aGlzJHBvcHVwUmVmJGN1cnJlbiA9IF90aGlzLnBvcHVwUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF90aGlzJHBvcHVwUmVmJGN1cnJlbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkcG9wdXBSZWYkY3VycmVuLmdldEVsZW1lbnQoKSwgZS5yZWxhdGVkVGFyZ2V0KSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLmRlbGF5U2V0UG9wdXBWaXNpYmxlKGZhbHNlLCBfdGhpcy5wcm9wcy5tb3VzZUxlYXZlRGVsYXkpO1xuICAgICAgfSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbkZvY3VzXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIF90aGlzLmZpcmVFdmVudHMoJ29uRm9jdXMnLCBlKTsgLy8gaW5jYXNlIGZvY3VzaW4gYW5kIGZvY3Vzb3V0XG5cblxuICAgICAgICBfdGhpcy5jbGVhckRlbGF5VGltZXIoKTtcblxuICAgICAgICBpZiAoX3RoaXMuaXNGb2N1c1RvU2hvdygpKSB7XG4gICAgICAgICAgX3RoaXMuZm9jdXNUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgICAgICAgIF90aGlzLmRlbGF5U2V0UG9wdXBWaXNpYmxlKHRydWUsIF90aGlzLnByb3BzLmZvY3VzRGVsYXkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uTW91c2VEb3duXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIF90aGlzLmZpcmVFdmVudHMoJ29uTW91c2VEb3duJywgZSk7XG5cbiAgICAgICAgX3RoaXMucHJlQ2xpY2tUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25Ub3VjaFN0YXJ0XCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIF90aGlzLmZpcmVFdmVudHMoJ29uVG91Y2hTdGFydCcsIGUpO1xuXG4gICAgICAgIF90aGlzLnByZVRvdWNoVGltZSA9IERhdGUubm93KCk7XG4gICAgICB9KTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uQmx1clwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBfdGhpcy5maXJlRXZlbnRzKCdvbkJsdXInLCBlKTtcblxuICAgICAgICBfdGhpcy5jbGVhckRlbGF5VGltZXIoKTtcblxuICAgICAgICBpZiAoX3RoaXMuaXNCbHVyVG9IaWRlKCkpIHtcbiAgICAgICAgICBfdGhpcy5kZWxheVNldFBvcHVwVmlzaWJsZShmYWxzZSwgX3RoaXMucHJvcHMuYmx1ckRlbGF5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbkNvbnRleHRNZW51XCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBfdGhpcy5maXJlRXZlbnRzKCdvbkNvbnRleHRNZW51JywgZSk7XG5cbiAgICAgICAgX3RoaXMuc2V0UG9wdXBWaXNpYmxlKHRydWUsIGUpO1xuICAgICAgfSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbkNvbnRleHRNZW51Q2xvc2VcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoX3RoaXMuaXNDb250ZXh0TWVudVRvU2hvdygpKSB7XG4gICAgICAgICAgX3RoaXMuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbkNsaWNrXCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBfdGhpcy5maXJlRXZlbnRzKCdvbkNsaWNrJywgZXZlbnQpOyAvLyBmb2N1cyB3aWxsIHRyaWdnZXIgY2xpY2tcblxuXG4gICAgICAgIGlmIChfdGhpcy5mb2N1c1RpbWUpIHtcbiAgICAgICAgICB2YXIgcHJlVGltZTtcblxuICAgICAgICAgIGlmIChfdGhpcy5wcmVDbGlja1RpbWUgJiYgX3RoaXMucHJlVG91Y2hUaW1lKSB7XG4gICAgICAgICAgICBwcmVUaW1lID0gTWF0aC5taW4oX3RoaXMucHJlQ2xpY2tUaW1lLCBfdGhpcy5wcmVUb3VjaFRpbWUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoX3RoaXMucHJlQ2xpY2tUaW1lKSB7XG4gICAgICAgICAgICBwcmVUaW1lID0gX3RoaXMucHJlQ2xpY2tUaW1lO1xuICAgICAgICAgIH0gZWxzZSBpZiAoX3RoaXMucHJlVG91Y2hUaW1lKSB7XG4gICAgICAgICAgICBwcmVUaW1lID0gX3RoaXMucHJlVG91Y2hUaW1lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChNYXRoLmFicyhwcmVUaW1lIC0gX3RoaXMuZm9jdXNUaW1lKSA8IDIwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RoaXMuZm9jdXNUaW1lID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLnByZUNsaWNrVGltZSA9IDA7XG4gICAgICAgIF90aGlzLnByZVRvdWNoVGltZSA9IDA7IC8vIE9ubHkgcHJldmVudCBkZWZhdWx0IHdoZW4gYWxsIHRoZSBhY3Rpb24gaXMgY2xpY2suXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzE3MDQzXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzE3MjkxXG5cbiAgICAgICAgaWYgKF90aGlzLmlzQ2xpY2tUb1Nob3coKSAmJiAoX3RoaXMuaXNDbGlja1RvSGlkZSgpIHx8IF90aGlzLmlzQmx1clRvSGlkZSgpKSAmJiBldmVudCAmJiBldmVudC5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbmV4dFZpc2libGUgPSAhX3RoaXMuc3RhdGUucG9wdXBWaXNpYmxlO1xuXG4gICAgICAgIGlmIChfdGhpcy5pc0NsaWNrVG9IaWRlKCkgJiYgIW5leHRWaXNpYmxlIHx8IG5leHRWaXNpYmxlICYmIF90aGlzLmlzQ2xpY2tUb1Nob3coKSkge1xuICAgICAgICAgIF90aGlzLnNldFBvcHVwVmlzaWJsZSghX3RoaXMuc3RhdGUucG9wdXBWaXNpYmxlLCBldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25Qb3B1cE1vdXNlRG93blwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzLmhhc1BvcHVwTW91c2VEb3duID0gdHJ1ZTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KF90aGlzLm1vdXNlRG93blRpbWVvdXQpO1xuICAgICAgICBfdGhpcy5tb3VzZURvd25UaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzLmhhc1BvcHVwTW91c2VEb3duID0gZmFsc2U7XG4gICAgICAgIH0sIDApO1xuXG4gICAgICAgIGlmIChfdGhpcy5jb250ZXh0KSB7XG4gICAgICAgICAgdmFyIF90aGlzJGNvbnRleHQ7XG5cbiAgICAgICAgICAoX3RoaXMkY29udGV4dCA9IF90aGlzLmNvbnRleHQpLm9uUG9wdXBNb3VzZURvd24uYXBwbHkoX3RoaXMkY29udGV4dCwgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbkRvY3VtZW50Q2xpY2tcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGlmIChfdGhpcy5wcm9wcy5tYXNrICYmICFfdGhpcy5wcm9wcy5tYXNrQ2xvc2FibGUpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuXG4gICAgICAgIHZhciByb290ID0gX3RoaXMuZ2V0Um9vdERvbU5vZGUoKTtcblxuICAgICAgICB2YXIgcG9wdXBOb2RlID0gX3RoaXMuZ2V0UG9wdXBEb21Ob2RlKCk7XG5cbiAgICAgICAgaWYgKCAvLyBtb3VzZWRvd24gb24gdGhlIHRhcmdldCBzaG91bGQgYWxzbyBjbG9zZSBwb3B1cCB3aGVuIGFjdGlvbiBpcyBjb250ZXh0TWVudS5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMjk4NTNcbiAgICAgICAgKCFjb250YWlucyhyb290LCB0YXJnZXQpIHx8IF90aGlzLmlzQ29udGV4dE1lbnVPbmx5KCkpICYmICFjb250YWlucyhwb3B1cE5vZGUsIHRhcmdldCkgJiYgIV90aGlzLmhhc1BvcHVwTW91c2VEb3duKSB7XG4gICAgICAgICAgX3RoaXMuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJnZXRSb290RG9tTm9kZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBnZXRUcmlnZ2VyRE9NTm9kZSA9IF90aGlzLnByb3BzLmdldFRyaWdnZXJET01Ob2RlO1xuXG4gICAgICAgIGlmIChnZXRUcmlnZ2VyRE9NTm9kZSkge1xuICAgICAgICAgIHJldHVybiBnZXRUcmlnZ2VyRE9NTm9kZShfdGhpcy50cmlnZ2VyUmVmLmN1cnJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgZG9tTm9kZSA9IGZpbmRET01Ob2RlKF90aGlzLnRyaWdnZXJSZWYuY3VycmVudCk7XG5cbiAgICAgICAgICBpZiAoZG9tTm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIGRvbU5vZGU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHsvLyBEbyBub3RoaW5nXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUmVhY3RET00uZmluZERPTU5vZGUoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgICAgfSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJnZXRQb3B1cENsYXNzTmFtZUZyb21BbGlnblwiLCBmdW5jdGlvbiAoYWxpZ24pIHtcbiAgICAgICAgdmFyIGNsYXNzTmFtZSA9IFtdO1xuICAgICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICAgIHBvcHVwUGxhY2VtZW50ID0gX3RoaXMkcHJvcHMucG9wdXBQbGFjZW1lbnQsXG4gICAgICAgICAgICBidWlsdGluUGxhY2VtZW50cyA9IF90aGlzJHByb3BzLmJ1aWx0aW5QbGFjZW1lbnRzLFxuICAgICAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkcHJvcHMucHJlZml4Q2xzLFxuICAgICAgICAgICAgYWxpZ25Qb2ludCA9IF90aGlzJHByb3BzLmFsaWduUG9pbnQsXG4gICAgICAgICAgICBnZXRQb3B1cENsYXNzTmFtZUZyb21BbGlnbiA9IF90aGlzJHByb3BzLmdldFBvcHVwQ2xhc3NOYW1lRnJvbUFsaWduO1xuXG4gICAgICAgIGlmIChwb3B1cFBsYWNlbWVudCAmJiBidWlsdGluUGxhY2VtZW50cykge1xuICAgICAgICAgIGNsYXNzTmFtZS5wdXNoKGdldEFsaWduUG9wdXBDbGFzc05hbWUoYnVpbHRpblBsYWNlbWVudHMsIHByZWZpeENscywgYWxpZ24sIGFsaWduUG9pbnQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChnZXRQb3B1cENsYXNzTmFtZUZyb21BbGlnbikge1xuICAgICAgICAgIGNsYXNzTmFtZS5wdXNoKGdldFBvcHVwQ2xhc3NOYW1lRnJvbUFsaWduKGFsaWduKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2xhc3NOYW1lLmpvaW4oJyAnKTtcbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiZ2V0Q29tcG9uZW50XCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzJHByb3BzMiA9IF90aGlzLnByb3BzLFxuICAgICAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkcHJvcHMyLnByZWZpeENscyxcbiAgICAgICAgICAgIGRlc3Ryb3lQb3B1cE9uSGlkZSA9IF90aGlzJHByb3BzMi5kZXN0cm95UG9wdXBPbkhpZGUsXG4gICAgICAgICAgICBwb3B1cENsYXNzTmFtZSA9IF90aGlzJHByb3BzMi5wb3B1cENsYXNzTmFtZSxcbiAgICAgICAgICAgIG9uUG9wdXBBbGlnbiA9IF90aGlzJHByb3BzMi5vblBvcHVwQWxpZ24sXG4gICAgICAgICAgICBwb3B1cE1vdGlvbiA9IF90aGlzJHByb3BzMi5wb3B1cE1vdGlvbixcbiAgICAgICAgICAgIHBvcHVwQW5pbWF0aW9uID0gX3RoaXMkcHJvcHMyLnBvcHVwQW5pbWF0aW9uLFxuICAgICAgICAgICAgcG9wdXBUcmFuc2l0aW9uTmFtZSA9IF90aGlzJHByb3BzMi5wb3B1cFRyYW5zaXRpb25OYW1lLFxuICAgICAgICAgICAgcG9wdXBTdHlsZSA9IF90aGlzJHByb3BzMi5wb3B1cFN0eWxlLFxuICAgICAgICAgICAgbWFzayA9IF90aGlzJHByb3BzMi5tYXNrLFxuICAgICAgICAgICAgbWFza0FuaW1hdGlvbiA9IF90aGlzJHByb3BzMi5tYXNrQW5pbWF0aW9uLFxuICAgICAgICAgICAgbWFza1RyYW5zaXRpb25OYW1lID0gX3RoaXMkcHJvcHMyLm1hc2tUcmFuc2l0aW9uTmFtZSxcbiAgICAgICAgICAgIG1hc2tNb3Rpb24gPSBfdGhpcyRwcm9wczIubWFza01vdGlvbixcbiAgICAgICAgICAgIHpJbmRleCA9IF90aGlzJHByb3BzMi56SW5kZXgsXG4gICAgICAgICAgICBwb3B1cCA9IF90aGlzJHByb3BzMi5wb3B1cCxcbiAgICAgICAgICAgIHN0cmV0Y2ggPSBfdGhpcyRwcm9wczIuc3RyZXRjaCxcbiAgICAgICAgICAgIGFsaWduUG9pbnQgPSBfdGhpcyRwcm9wczIuYWxpZ25Qb2ludCxcbiAgICAgICAgICAgIG1vYmlsZSA9IF90aGlzJHByb3BzMi5tb2JpbGUsXG4gICAgICAgICAgICBmb3JjZVJlbmRlciA9IF90aGlzJHByb3BzMi5mb3JjZVJlbmRlcixcbiAgICAgICAgICAgIG9uUG9wdXBDbGljayA9IF90aGlzJHByb3BzMi5vblBvcHVwQ2xpY2s7XG4gICAgICAgIHZhciBfdGhpcyRzdGF0ZSA9IF90aGlzLnN0YXRlLFxuICAgICAgICAgICAgcG9wdXBWaXNpYmxlID0gX3RoaXMkc3RhdGUucG9wdXBWaXNpYmxlLFxuICAgICAgICAgICAgcG9pbnQgPSBfdGhpcyRzdGF0ZS5wb2ludDtcblxuICAgICAgICB2YXIgYWxpZ24gPSBfdGhpcy5nZXRQb3B1cEFsaWduKCk7XG5cbiAgICAgICAgdmFyIG1vdXNlUHJvcHMgPSB7fTtcblxuICAgICAgICBpZiAoX3RoaXMuaXNNb3VzZUVudGVyVG9TaG93KCkpIHtcbiAgICAgICAgICBtb3VzZVByb3BzLm9uTW91c2VFbnRlciA9IF90aGlzLm9uUG9wdXBNb3VzZUVudGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKF90aGlzLmlzTW91c2VMZWF2ZVRvSGlkZSgpKSB7XG4gICAgICAgICAgbW91c2VQcm9wcy5vbk1vdXNlTGVhdmUgPSBfdGhpcy5vblBvcHVwTW91c2VMZWF2ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1vdXNlUHJvcHMub25Nb3VzZURvd24gPSBfdGhpcy5vblBvcHVwTW91c2VEb3duO1xuICAgICAgICBtb3VzZVByb3BzLm9uVG91Y2hTdGFydCA9IF90aGlzLm9uUG9wdXBNb3VzZURvd247XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQb3B1cCwgX2V4dGVuZHMoe1xuICAgICAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgICAgIGRlc3Ryb3lQb3B1cE9uSGlkZTogZGVzdHJveVBvcHVwT25IaWRlLFxuICAgICAgICAgIHZpc2libGU6IHBvcHVwVmlzaWJsZSxcbiAgICAgICAgICBwb2ludDogYWxpZ25Qb2ludCAmJiBwb2ludCxcbiAgICAgICAgICBjbGFzc05hbWU6IHBvcHVwQ2xhc3NOYW1lLFxuICAgICAgICAgIGFsaWduOiBhbGlnbixcbiAgICAgICAgICBvbkFsaWduOiBvblBvcHVwQWxpZ24sXG4gICAgICAgICAgYW5pbWF0aW9uOiBwb3B1cEFuaW1hdGlvbixcbiAgICAgICAgICBnZXRDbGFzc05hbWVGcm9tQWxpZ246IF90aGlzLmdldFBvcHVwQ2xhc3NOYW1lRnJvbUFsaWduXG4gICAgICAgIH0sIG1vdXNlUHJvcHMsIHtcbiAgICAgICAgICBzdHJldGNoOiBzdHJldGNoLFxuICAgICAgICAgIGdldFJvb3REb21Ob2RlOiBfdGhpcy5nZXRSb290RG9tTm9kZSxcbiAgICAgICAgICBzdHlsZTogcG9wdXBTdHlsZSxcbiAgICAgICAgICBtYXNrOiBtYXNrLFxuICAgICAgICAgIHpJbmRleDogekluZGV4LFxuICAgICAgICAgIHRyYW5zaXRpb25OYW1lOiBwb3B1cFRyYW5zaXRpb25OYW1lLFxuICAgICAgICAgIG1hc2tBbmltYXRpb246IG1hc2tBbmltYXRpb24sXG4gICAgICAgICAgbWFza1RyYW5zaXRpb25OYW1lOiBtYXNrVHJhbnNpdGlvbk5hbWUsXG4gICAgICAgICAgbWFza01vdGlvbjogbWFza01vdGlvbixcbiAgICAgICAgICByZWY6IF90aGlzLnBvcHVwUmVmLFxuICAgICAgICAgIG1vdGlvbjogcG9wdXBNb3Rpb24sXG4gICAgICAgICAgbW9iaWxlOiBtb2JpbGUsXG4gICAgICAgICAgZm9yY2VSZW5kZXI6IGZvcmNlUmVuZGVyLFxuICAgICAgICAgIG9uQ2xpY2s6IG9uUG9wdXBDbGlja1xuICAgICAgICB9KSwgdHlwZW9mIHBvcHVwID09PSAnZnVuY3Rpb24nID8gcG9wdXAoKSA6IHBvcHVwKTtcbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiYXR0YWNoUGFyZW50XCIsIGZ1bmN0aW9uIChwb3B1cENvbnRhaW5lcikge1xuICAgICAgICByYWYuY2FuY2VsKF90aGlzLmF0dGFjaElkKTtcbiAgICAgICAgdmFyIF90aGlzJHByb3BzMyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgICAgZ2V0UG9wdXBDb250YWluZXIgPSBfdGhpcyRwcm9wczMuZ2V0UG9wdXBDb250YWluZXIsXG4gICAgICAgICAgICBnZXREb2N1bWVudCA9IF90aGlzJHByb3BzMy5nZXREb2N1bWVudDtcblxuICAgICAgICB2YXIgZG9tTm9kZSA9IF90aGlzLmdldFJvb3REb21Ob2RlKCk7XG5cbiAgICAgICAgdmFyIG1vdW50Tm9kZTtcblxuICAgICAgICBpZiAoIWdldFBvcHVwQ29udGFpbmVyKSB7XG4gICAgICAgICAgbW91bnROb2RlID0gZ2V0RG9jdW1lbnQoX3RoaXMuZ2V0Um9vdERvbU5vZGUoKSkuYm9keTtcbiAgICAgICAgfSBlbHNlIGlmIChkb21Ob2RlIHx8IGdldFBvcHVwQ29udGFpbmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIC8vIENvbXBhdGlibGUgZm9yIGxlZ2FjeSBnZXRQb3B1cENvbnRhaW5lciB3aXRoIGRvbU5vZGUgYXJndW1lbnQuXG4gICAgICAgICAgLy8gSWYgbm8gbmVlZCBgZG9tTm9kZWAgYXJndW1lbnQsIHdpbGwgY2FsbCBkaXJlY3RseS5cbiAgICAgICAgICAvLyBodHRwczovL2NvZGVzYW5kYm94LmlvL3MvZWxvcXVlbnQtbWNsZWFuLXNzOTNtP2ZpbGU9L3NyYy9BcHAuanNcbiAgICAgICAgICBtb3VudE5vZGUgPSBnZXRQb3B1cENvbnRhaW5lcihkb21Ob2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtb3VudE5vZGUpIHtcbiAgICAgICAgICBtb3VudE5vZGUuYXBwZW5kQ2hpbGQocG9wdXBDb250YWluZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFJldHJ5IGFmdGVyIGZyYW1lIHJlbmRlciBpbiBjYXNlIHBhcmVudCBub3QgcmVhZHlcbiAgICAgICAgICBfdGhpcy5hdHRhY2hJZCA9IHJhZihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpcy5hdHRhY2hQYXJlbnQocG9wdXBDb250YWluZXIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImdldENvbnRhaW5lclwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghX3RoaXMucG9ydGFsQ29udGFpbmVyKSB7XG4gICAgICAgICAgLy8gSW4gUmVhY3QuU3RyaWN0TW9kZSBjb21wb25lbnQgd2lsbCBjYWxsIHJlbmRlciBtdWx0aXBsZSB0aW1lIGluIGZpcnN0IG1vdW50LlxuICAgICAgICAgIC8vIFdoZW4geW91IHdhbnQgdG8gcmVmYWN0b3Igd2l0aCBGQywgdXNlUmVmIHdpbGwgYWxzbyBpbml0IG11bHRpcGxlIHRpbWUgYW5kXG4gICAgICAgICAgLy8gcG9pbnQgdG8gZGlmZmVyZW50IHVzZVJlZiBpbnN0YW5jZSB3aGljaCB3aWxsIGNyZWF0ZSBtdWx0aXBsZSBlbGVtZW50XG4gICAgICAgICAgLy8gKFRoaXMgbXVsdGlwbGUgcmVuZGVyIHdpbGwgbm90IHRyaWdnZXIgZWZmZWN0IHNvIHlvdSBjYW4gbm90IGNsZWFuIHVwIHRoaXNcbiAgICAgICAgICAvLyBpbiBlZmZlY3QpLiBCdXQgdGhpcyBpcyBzYWZlIHdpdGggY2xhc3MgY29tcG9uZW50IHNpbmNlIGl0IGFsd2F5cyBwb2ludCB0byBzYW1lIGNsYXNzIGluc3RhbmNlLlxuICAgICAgICAgIHZhciBnZXREb2N1bWVudCA9IF90aGlzLnByb3BzLmdldERvY3VtZW50O1xuICAgICAgICAgIHZhciBwb3B1cENvbnRhaW5lciA9IGdldERvY3VtZW50KF90aGlzLmdldFJvb3REb21Ob2RlKCkpLmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyAvLyBNYWtlIHN1cmUgZGVmYXVsdCBwb3B1cCBjb250YWluZXIgd2lsbCBuZXZlciBjYXVzZSBzY3JvbGxiYXIgYXBwZWFyaW5nXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWNvbXBvbmVudC90cmlnZ2VyL2lzc3Vlcy80MVxuXG4gICAgICAgICAgcG9wdXBDb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICAgIHBvcHVwQ29udGFpbmVyLnN0eWxlLnRvcCA9ICcwJztcbiAgICAgICAgICBwb3B1cENvbnRhaW5lci5zdHlsZS5sZWZ0ID0gJzAnO1xuICAgICAgICAgIHBvcHVwQ29udGFpbmVyLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgICAgIF90aGlzLnBvcnRhbENvbnRhaW5lciA9IHBvcHVwQ29udGFpbmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMuYXR0YWNoUGFyZW50KF90aGlzLnBvcnRhbENvbnRhaW5lcik7XG5cbiAgICAgICAgcmV0dXJuIF90aGlzLnBvcnRhbENvbnRhaW5lcjtcbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwic2V0UG9pbnRcIiwgZnVuY3Rpb24gKHBvaW50KSB7XG4gICAgICAgIHZhciBhbGlnblBvaW50ID0gX3RoaXMucHJvcHMuYWxpZ25Qb2ludDtcbiAgICAgICAgaWYgKCFhbGlnblBvaW50IHx8ICFwb2ludCkgcmV0dXJuO1xuXG4gICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBwb2ludDoge1xuICAgICAgICAgICAgcGFnZVg6IHBvaW50LnBhZ2VYLFxuICAgICAgICAgICAgcGFnZVk6IHBvaW50LnBhZ2VZXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaGFuZGxlUG9ydGFsVXBkYXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKF90aGlzLnN0YXRlLnByZXZQb3B1cFZpc2libGUgIT09IF90aGlzLnN0YXRlLnBvcHVwVmlzaWJsZSkge1xuICAgICAgICAgIF90aGlzLnByb3BzLmFmdGVyUG9wdXBWaXNpYmxlQ2hhbmdlKF90aGlzLnN0YXRlLnBvcHVwVmlzaWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwidHJpZ2dlckNvbnRleHRWYWx1ZVwiLCB7XG4gICAgICAgIG9uUG9wdXBNb3VzZURvd246IF90aGlzLm9uUG9wdXBNb3VzZURvd25cbiAgICAgIH0pO1xuXG4gICAgICB2YXIgX3BvcHVwVmlzaWJsZTtcblxuICAgICAgaWYgKCdwb3B1cFZpc2libGUnIGluIHByb3BzKSB7XG4gICAgICAgIF9wb3B1cFZpc2libGUgPSAhIXByb3BzLnBvcHVwVmlzaWJsZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9wb3B1cFZpc2libGUgPSAhIXByb3BzLmRlZmF1bHRQb3B1cFZpc2libGU7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgICBwcmV2UG9wdXBWaXNpYmxlOiBfcG9wdXBWaXNpYmxlLFxuICAgICAgICBwb3B1cFZpc2libGU6IF9wb3B1cFZpc2libGVcbiAgICAgIH07XG4gICAgICBBTExfSEFORExFUlMuZm9yRWFjaChmdW5jdGlvbiAoaCkge1xuICAgICAgICBfdGhpc1tcImZpcmVcIi5jb25jYXQoaCldID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICBfdGhpcy5maXJlRXZlbnRzKGgsIGUpO1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUNsYXNzKFRyaWdnZXIsIFt7XG4gICAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgdGhpcy5jb21wb25lbnREaWRVcGRhdGUoKTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiY29tcG9uZW50RGlkVXBkYXRlXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLnN0YXRlOyAvLyBXZSBtdXN0IGxpc3RlbiB0byBgbW91c2Vkb3duYCBvciBgdG91Y2hzdGFydGAsIGVkZ2UgY2FzZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNTgwNFxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtY29tcG9uZW50L2NhbGVuZGFyL2lzc3Vlcy8yNTBcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWNvbXBvbmVudC90cmlnZ2VyL2lzc3Vlcy81MFxuXG4gICAgICAgIGlmIChzdGF0ZS5wb3B1cFZpc2libGUpIHtcbiAgICAgICAgICB2YXIgY3VycmVudERvY3VtZW50O1xuXG4gICAgICAgICAgaWYgKCF0aGlzLmNsaWNrT3V0c2lkZUhhbmRsZXIgJiYgKHRoaXMuaXNDbGlja1RvSGlkZSgpIHx8IHRoaXMuaXNDb250ZXh0TWVudVRvU2hvdygpKSkge1xuICAgICAgICAgICAgY3VycmVudERvY3VtZW50ID0gcHJvcHMuZ2V0RG9jdW1lbnQodGhpcy5nZXRSb290RG9tTm9kZSgpKTtcbiAgICAgICAgICAgIHRoaXMuY2xpY2tPdXRzaWRlSGFuZGxlciA9IGFkZEV2ZW50TGlzdGVuZXIoY3VycmVudERvY3VtZW50LCAnbW91c2Vkb3duJywgdGhpcy5vbkRvY3VtZW50Q2xpY2spO1xuICAgICAgICAgIH0gLy8gYWx3YXlzIGhpZGUgb24gbW9iaWxlXG5cblxuICAgICAgICAgIGlmICghdGhpcy50b3VjaE91dHNpZGVIYW5kbGVyKSB7XG4gICAgICAgICAgICBjdXJyZW50RG9jdW1lbnQgPSBjdXJyZW50RG9jdW1lbnQgfHwgcHJvcHMuZ2V0RG9jdW1lbnQodGhpcy5nZXRSb290RG9tTm9kZSgpKTtcbiAgICAgICAgICAgIHRoaXMudG91Y2hPdXRzaWRlSGFuZGxlciA9IGFkZEV2ZW50TGlzdGVuZXIoY3VycmVudERvY3VtZW50LCAndG91Y2hzdGFydCcsIHRoaXMub25Eb2N1bWVudENsaWNrKTtcbiAgICAgICAgICB9IC8vIGNsb3NlIHBvcHVwIHdoZW4gdHJpZ2dlciB0eXBlIGNvbnRhaW5zICdvbkNvbnRleHRNZW51JyBhbmQgZG9jdW1lbnQgaXMgc2Nyb2xsaW5nLlxuXG5cbiAgICAgICAgICBpZiAoIXRoaXMuY29udGV4dE1lbnVPdXRzaWRlSGFuZGxlcjEgJiYgdGhpcy5pc0NvbnRleHRNZW51VG9TaG93KCkpIHtcbiAgICAgICAgICAgIGN1cnJlbnREb2N1bWVudCA9IGN1cnJlbnREb2N1bWVudCB8fCBwcm9wcy5nZXREb2N1bWVudCh0aGlzLmdldFJvb3REb21Ob2RlKCkpO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0TWVudU91dHNpZGVIYW5kbGVyMSA9IGFkZEV2ZW50TGlzdGVuZXIoY3VycmVudERvY3VtZW50LCAnc2Nyb2xsJywgdGhpcy5vbkNvbnRleHRNZW51Q2xvc2UpO1xuICAgICAgICAgIH0gLy8gY2xvc2UgcG9wdXAgd2hlbiB0cmlnZ2VyIHR5cGUgY29udGFpbnMgJ29uQ29udGV4dE1lbnUnIGFuZCB3aW5kb3cgaXMgYmx1ci5cblxuXG4gICAgICAgICAgaWYgKCF0aGlzLmNvbnRleHRNZW51T3V0c2lkZUhhbmRsZXIyICYmIHRoaXMuaXNDb250ZXh0TWVudVRvU2hvdygpKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51T3V0c2lkZUhhbmRsZXIyID0gYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csICdibHVyJywgdGhpcy5vbkNvbnRleHRNZW51Q2xvc2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xlYXJPdXRzaWRlSGFuZGxlcigpO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICB0aGlzLmNsZWFyRGVsYXlUaW1lcigpO1xuICAgICAgICB0aGlzLmNsZWFyT3V0c2lkZUhhbmRsZXIoKTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMubW91c2VEb3duVGltZW91dCk7XG4gICAgICAgIHJhZi5jYW5jZWwodGhpcy5hdHRhY2hJZCk7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImdldFBvcHVwRG9tTm9kZVwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFBvcHVwRG9tTm9kZSgpIHtcbiAgICAgICAgdmFyIF90aGlzJHBvcHVwUmVmJGN1cnJlbjI7XG5cbiAgICAgICAgLy8gZm9yIHRlc3RcbiAgICAgICAgcmV0dXJuICgoX3RoaXMkcG9wdXBSZWYkY3VycmVuMiA9IHRoaXMucG9wdXBSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX3RoaXMkcG9wdXBSZWYkY3VycmVuMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkcG9wdXBSZWYkY3VycmVuMi5nZXRFbGVtZW50KCkpIHx8IG51bGw7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImdldFBvcHVwQWxpZ25cIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQb3B1cEFsaWduKCkge1xuICAgICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICB2YXIgcG9wdXBQbGFjZW1lbnQgPSBwcm9wcy5wb3B1cFBsYWNlbWVudCxcbiAgICAgICAgICAgIHBvcHVwQWxpZ24gPSBwcm9wcy5wb3B1cEFsaWduLFxuICAgICAgICAgICAgYnVpbHRpblBsYWNlbWVudHMgPSBwcm9wcy5idWlsdGluUGxhY2VtZW50cztcblxuICAgICAgICBpZiAocG9wdXBQbGFjZW1lbnQgJiYgYnVpbHRpblBsYWNlbWVudHMpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0QWxpZ25Gcm9tUGxhY2VtZW50KGJ1aWx0aW5QbGFjZW1lbnRzLCBwb3B1cFBsYWNlbWVudCwgcG9wdXBBbGlnbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcG9wdXBBbGlnbjtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwic2V0UG9wdXBWaXNpYmxlXCIsXG4gICAgICB2YWx1ZTpcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHBvcHVwVmlzaWJsZSAgICBTaG93IG9yIG5vdCB0aGUgcG9wdXAgZWxlbWVudFxuICAgICAgICogQHBhcmFtIGV2ZW50ICAgICAgICAgICBTeW50aGV0aWNFdmVudCwgdXNlZCBmb3IgYHBvaW50QWxpZ25gXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIHNldFBvcHVwVmlzaWJsZShwb3B1cFZpc2libGUsIGV2ZW50KSB7XG4gICAgICAgIHZhciBhbGlnblBvaW50ID0gdGhpcy5wcm9wcy5hbGlnblBvaW50O1xuICAgICAgICB2YXIgcHJldlBvcHVwVmlzaWJsZSA9IHRoaXMuc3RhdGUucG9wdXBWaXNpYmxlO1xuICAgICAgICB0aGlzLmNsZWFyRGVsYXlUaW1lcigpO1xuXG4gICAgICAgIGlmIChwcmV2UG9wdXBWaXNpYmxlICE9PSBwb3B1cFZpc2libGUpIHtcbiAgICAgICAgICBpZiAoISgncG9wdXBWaXNpYmxlJyBpbiB0aGlzLnByb3BzKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgIHBvcHVwVmlzaWJsZTogcG9wdXBWaXNpYmxlLFxuICAgICAgICAgICAgICBwcmV2UG9wdXBWaXNpYmxlOiBwcmV2UG9wdXBWaXNpYmxlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnByb3BzLm9uUG9wdXBWaXNpYmxlQ2hhbmdlKHBvcHVwVmlzaWJsZSk7XG4gICAgICAgIH0gLy8gQWx3YXlzIHJlY29yZCB0aGUgcG9pbnQgcG9zaXRpb24gc2luY2UgbW91c2VFbnRlckRlbGF5IHdpbGwgZGVsYXkgdGhlIHNob3dcblxuXG4gICAgICAgIGlmIChhbGlnblBvaW50ICYmIGV2ZW50ICYmIHBvcHVwVmlzaWJsZSkge1xuICAgICAgICAgIHRoaXMuc2V0UG9pbnQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImRlbGF5U2V0UG9wdXBWaXNpYmxlXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gZGVsYXlTZXRQb3B1cFZpc2libGUodmlzaWJsZSwgZGVsYXlTLCBldmVudCkge1xuICAgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgICB2YXIgZGVsYXkgPSBkZWxheVMgKiAxMDAwO1xuICAgICAgICB0aGlzLmNsZWFyRGVsYXlUaW1lcigpO1xuXG4gICAgICAgIGlmIChkZWxheSkge1xuICAgICAgICAgIHZhciBwb2ludCA9IGV2ZW50ID8ge1xuICAgICAgICAgICAgcGFnZVg6IGV2ZW50LnBhZ2VYLFxuICAgICAgICAgICAgcGFnZVk6IGV2ZW50LnBhZ2VZXG4gICAgICAgICAgfSA6IG51bGw7XG4gICAgICAgICAgdGhpcy5kZWxheVRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMyLnNldFBvcHVwVmlzaWJsZSh2aXNpYmxlLCBwb2ludCk7XG5cbiAgICAgICAgICAgIF90aGlzMi5jbGVhckRlbGF5VGltZXIoKTtcbiAgICAgICAgICB9LCBkZWxheSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXRQb3B1cFZpc2libGUodmlzaWJsZSwgZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImNsZWFyRGVsYXlUaW1lclwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyRGVsYXlUaW1lcigpIHtcbiAgICAgICAgaWYgKHRoaXMuZGVsYXlUaW1lcikge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmRlbGF5VGltZXIpO1xuICAgICAgICAgIHRoaXMuZGVsYXlUaW1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiY2xlYXJPdXRzaWRlSGFuZGxlclwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyT3V0c2lkZUhhbmRsZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmNsaWNrT3V0c2lkZUhhbmRsZXIpIHtcbiAgICAgICAgICB0aGlzLmNsaWNrT3V0c2lkZUhhbmRsZXIucmVtb3ZlKCk7XG4gICAgICAgICAgdGhpcy5jbGlja091dHNpZGVIYW5kbGVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvbnRleHRNZW51T3V0c2lkZUhhbmRsZXIxKSB7XG4gICAgICAgICAgdGhpcy5jb250ZXh0TWVudU91dHNpZGVIYW5kbGVyMS5yZW1vdmUoKTtcbiAgICAgICAgICB0aGlzLmNvbnRleHRNZW51T3V0c2lkZUhhbmRsZXIxID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvbnRleHRNZW51T3V0c2lkZUhhbmRsZXIyKSB7XG4gICAgICAgICAgdGhpcy5jb250ZXh0TWVudU91dHNpZGVIYW5kbGVyMi5yZW1vdmUoKTtcbiAgICAgICAgICB0aGlzLmNvbnRleHRNZW51T3V0c2lkZUhhbmRsZXIyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnRvdWNoT3V0c2lkZUhhbmRsZXIpIHtcbiAgICAgICAgICB0aGlzLnRvdWNoT3V0c2lkZUhhbmRsZXIucmVtb3ZlKCk7XG4gICAgICAgICAgdGhpcy50b3VjaE91dHNpZGVIYW5kbGVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJjcmVhdGVUd29DaGFpbnNcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVUd29DaGFpbnMoZXZlbnQpIHtcbiAgICAgICAgdmFyIGNoaWxkUHJvcyA9IHRoaXMucHJvcHMuY2hpbGRyZW4ucHJvcHM7XG4gICAgICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG5cbiAgICAgICAgaWYgKGNoaWxkUHJvc1tldmVudF0gJiYgcHJvcHNbZXZlbnRdKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXNbXCJmaXJlXCIuY29uY2F0KGV2ZW50KV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2hpbGRQcm9zW2V2ZW50XSB8fCBwcm9wc1tldmVudF07XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImlzQ2xpY2tUb1Nob3dcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBpc0NsaWNrVG9TaG93KCkge1xuICAgICAgICB2YXIgX3RoaXMkcHJvcHM0ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICAgIGFjdGlvbiA9IF90aGlzJHByb3BzNC5hY3Rpb24sXG4gICAgICAgICAgICBzaG93QWN0aW9uID0gX3RoaXMkcHJvcHM0LnNob3dBY3Rpb247XG4gICAgICAgIHJldHVybiBhY3Rpb24uaW5kZXhPZignY2xpY2snKSAhPT0gLTEgfHwgc2hvd0FjdGlvbi5pbmRleE9mKCdjbGljaycpICE9PSAtMTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiaXNDb250ZXh0TWVudU9ubHlcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBpc0NvbnRleHRNZW51T25seSgpIHtcbiAgICAgICAgdmFyIGFjdGlvbiA9IHRoaXMucHJvcHMuYWN0aW9uO1xuICAgICAgICByZXR1cm4gYWN0aW9uID09PSAnY29udGV4dE1lbnUnIHx8IGFjdGlvbi5sZW5ndGggPT09IDEgJiYgYWN0aW9uWzBdID09PSAnY29udGV4dE1lbnUnO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJpc0NvbnRleHRNZW51VG9TaG93XCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gaXNDb250ZXh0TWVudVRvU2hvdygpIHtcbiAgICAgICAgdmFyIF90aGlzJHByb3BzNSA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgICBhY3Rpb24gPSBfdGhpcyRwcm9wczUuYWN0aW9uLFxuICAgICAgICAgICAgc2hvd0FjdGlvbiA9IF90aGlzJHByb3BzNS5zaG93QWN0aW9uO1xuICAgICAgICByZXR1cm4gYWN0aW9uLmluZGV4T2YoJ2NvbnRleHRNZW51JykgIT09IC0xIHx8IHNob3dBY3Rpb24uaW5kZXhPZignY29udGV4dE1lbnUnKSAhPT0gLTE7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImlzQ2xpY2tUb0hpZGVcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBpc0NsaWNrVG9IaWRlKCkge1xuICAgICAgICB2YXIgX3RoaXMkcHJvcHM2ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICAgIGFjdGlvbiA9IF90aGlzJHByb3BzNi5hY3Rpb24sXG4gICAgICAgICAgICBoaWRlQWN0aW9uID0gX3RoaXMkcHJvcHM2LmhpZGVBY3Rpb247XG4gICAgICAgIHJldHVybiBhY3Rpb24uaW5kZXhPZignY2xpY2snKSAhPT0gLTEgfHwgaGlkZUFjdGlvbi5pbmRleE9mKCdjbGljaycpICE9PSAtMTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiaXNNb3VzZUVudGVyVG9TaG93XCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gaXNNb3VzZUVudGVyVG9TaG93KCkge1xuICAgICAgICB2YXIgX3RoaXMkcHJvcHM3ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICAgIGFjdGlvbiA9IF90aGlzJHByb3BzNy5hY3Rpb24sXG4gICAgICAgICAgICBzaG93QWN0aW9uID0gX3RoaXMkcHJvcHM3LnNob3dBY3Rpb247XG4gICAgICAgIHJldHVybiBhY3Rpb24uaW5kZXhPZignaG92ZXInKSAhPT0gLTEgfHwgc2hvd0FjdGlvbi5pbmRleE9mKCdtb3VzZUVudGVyJykgIT09IC0xO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJpc01vdXNlTGVhdmVUb0hpZGVcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBpc01vdXNlTGVhdmVUb0hpZGUoKSB7XG4gICAgICAgIHZhciBfdGhpcyRwcm9wczggPSB0aGlzLnByb3BzLFxuICAgICAgICAgICAgYWN0aW9uID0gX3RoaXMkcHJvcHM4LmFjdGlvbixcbiAgICAgICAgICAgIGhpZGVBY3Rpb24gPSBfdGhpcyRwcm9wczguaGlkZUFjdGlvbjtcbiAgICAgICAgcmV0dXJuIGFjdGlvbi5pbmRleE9mKCdob3ZlcicpICE9PSAtMSB8fCBoaWRlQWN0aW9uLmluZGV4T2YoJ21vdXNlTGVhdmUnKSAhPT0gLTE7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImlzRm9jdXNUb1Nob3dcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBpc0ZvY3VzVG9TaG93KCkge1xuICAgICAgICB2YXIgX3RoaXMkcHJvcHM5ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICAgIGFjdGlvbiA9IF90aGlzJHByb3BzOS5hY3Rpb24sXG4gICAgICAgICAgICBzaG93QWN0aW9uID0gX3RoaXMkcHJvcHM5LnNob3dBY3Rpb247XG4gICAgICAgIHJldHVybiBhY3Rpb24uaW5kZXhPZignZm9jdXMnKSAhPT0gLTEgfHwgc2hvd0FjdGlvbi5pbmRleE9mKCdmb2N1cycpICE9PSAtMTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiaXNCbHVyVG9IaWRlXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gaXNCbHVyVG9IaWRlKCkge1xuICAgICAgICB2YXIgX3RoaXMkcHJvcHMxMCA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgICBhY3Rpb24gPSBfdGhpcyRwcm9wczEwLmFjdGlvbixcbiAgICAgICAgICAgIGhpZGVBY3Rpb24gPSBfdGhpcyRwcm9wczEwLmhpZGVBY3Rpb247XG4gICAgICAgIHJldHVybiBhY3Rpb24uaW5kZXhPZignZm9jdXMnKSAhPT0gLTEgfHwgaGlkZUFjdGlvbi5pbmRleE9mKCdibHVyJykgIT09IC0xO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJmb3JjZVBvcHVwQWxpZ25cIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JjZVBvcHVwQWxpZ24oKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnBvcHVwVmlzaWJsZSkge1xuICAgICAgICAgIHZhciBfdGhpcyRwb3B1cFJlZiRjdXJyZW4zO1xuXG4gICAgICAgICAgKF90aGlzJHBvcHVwUmVmJGN1cnJlbjMgPSB0aGlzLnBvcHVwUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF90aGlzJHBvcHVwUmVmJGN1cnJlbjMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJHBvcHVwUmVmJGN1cnJlbjMuZm9yY2VBbGlnbigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImZpcmVFdmVudHNcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBmaXJlRXZlbnRzKHR5cGUsIGUpIHtcbiAgICAgICAgdmFyIGNoaWxkQ2FsbGJhY2sgPSB0aGlzLnByb3BzLmNoaWxkcmVuLnByb3BzW3R5cGVdO1xuXG4gICAgICAgIGlmIChjaGlsZENhbGxiYWNrKSB7XG4gICAgICAgICAgY2hpbGRDYWxsYmFjayhlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjYWxsYmFjayA9IHRoaXMucHJvcHNbdHlwZV07XG5cbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgY2FsbGJhY2soZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiY2xvc2VcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjbG9zZSgpIHtcbiAgICAgICAgdGhpcy5zZXRQb3B1cFZpc2libGUoZmFsc2UpO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJyZW5kZXJcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgIHZhciBwb3B1cFZpc2libGUgPSB0aGlzLnN0YXRlLnBvcHVwVmlzaWJsZTtcbiAgICAgICAgdmFyIF90aGlzJHByb3BzMTEgPSB0aGlzLnByb3BzLFxuICAgICAgICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wczExLmNoaWxkcmVuLFxuICAgICAgICAgICAgZm9yY2VSZW5kZXIgPSBfdGhpcyRwcm9wczExLmZvcmNlUmVuZGVyLFxuICAgICAgICAgICAgYWxpZ25Qb2ludCA9IF90aGlzJHByb3BzMTEuYWxpZ25Qb2ludCxcbiAgICAgICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzMTEuY2xhc3NOYW1lLFxuICAgICAgICAgICAgYXV0b0Rlc3Ryb3kgPSBfdGhpcyRwcm9wczExLmF1dG9EZXN0cm95O1xuICAgICAgICB2YXIgY2hpbGQgPSBSZWFjdC5DaGlsZHJlbi5vbmx5KGNoaWxkcmVuKTtcbiAgICAgICAgdmFyIG5ld0NoaWxkUHJvcHMgPSB7XG4gICAgICAgICAga2V5OiAndHJpZ2dlcidcbiAgICAgICAgfTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFZpc2libGUgSGFuZGxlcnMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIC8vID4+PiBDb250ZXh0TWVudVxuXG4gICAgICAgIGlmICh0aGlzLmlzQ29udGV4dE1lbnVUb1Nob3coKSkge1xuICAgICAgICAgIG5ld0NoaWxkUHJvcHMub25Db250ZXh0TWVudSA9IHRoaXMub25Db250ZXh0TWVudTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdDaGlsZFByb3BzLm9uQ29udGV4dE1lbnUgPSB0aGlzLmNyZWF0ZVR3b0NoYWlucygnb25Db250ZXh0TWVudScpO1xuICAgICAgICB9IC8vID4+PiBDbGlja1xuXG5cbiAgICAgICAgaWYgKHRoaXMuaXNDbGlja1RvSGlkZSgpIHx8IHRoaXMuaXNDbGlja1RvU2hvdygpKSB7XG4gICAgICAgICAgbmV3Q2hpbGRQcm9wcy5vbkNsaWNrID0gdGhpcy5vbkNsaWNrO1xuICAgICAgICAgIG5ld0NoaWxkUHJvcHMub25Nb3VzZURvd24gPSB0aGlzLm9uTW91c2VEb3duO1xuICAgICAgICAgIG5ld0NoaWxkUHJvcHMub25Ub3VjaFN0YXJ0ID0gdGhpcy5vblRvdWNoU3RhcnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3Q2hpbGRQcm9wcy5vbkNsaWNrID0gdGhpcy5jcmVhdGVUd29DaGFpbnMoJ29uQ2xpY2snKTtcbiAgICAgICAgICBuZXdDaGlsZFByb3BzLm9uTW91c2VEb3duID0gdGhpcy5jcmVhdGVUd29DaGFpbnMoJ29uTW91c2VEb3duJyk7XG4gICAgICAgICAgbmV3Q2hpbGRQcm9wcy5vblRvdWNoU3RhcnQgPSB0aGlzLmNyZWF0ZVR3b0NoYWlucygnb25Ub3VjaFN0YXJ0Jyk7XG4gICAgICAgIH0gLy8gPj4+IEhvdmVyKGVudGVyKVxuXG5cbiAgICAgICAgaWYgKHRoaXMuaXNNb3VzZUVudGVyVG9TaG93KCkpIHtcbiAgICAgICAgICBuZXdDaGlsZFByb3BzLm9uTW91c2VFbnRlciA9IHRoaXMub25Nb3VzZUVudGVyOyAvLyBQb2ludCBhbGlnblxuXG4gICAgICAgICAgaWYgKGFsaWduUG9pbnQpIHtcbiAgICAgICAgICAgIG5ld0NoaWxkUHJvcHMub25Nb3VzZU1vdmUgPSB0aGlzLm9uTW91c2VNb3ZlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdDaGlsZFByb3BzLm9uTW91c2VFbnRlciA9IHRoaXMuY3JlYXRlVHdvQ2hhaW5zKCdvbk1vdXNlRW50ZXInKTtcbiAgICAgICAgfSAvLyA+Pj4gSG92ZXIobGVhdmUpXG5cblxuICAgICAgICBpZiAodGhpcy5pc01vdXNlTGVhdmVUb0hpZGUoKSkge1xuICAgICAgICAgIG5ld0NoaWxkUHJvcHMub25Nb3VzZUxlYXZlID0gdGhpcy5vbk1vdXNlTGVhdmU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3Q2hpbGRQcm9wcy5vbk1vdXNlTGVhdmUgPSB0aGlzLmNyZWF0ZVR3b0NoYWlucygnb25Nb3VzZUxlYXZlJyk7XG4gICAgICAgIH0gLy8gPj4+IEZvY3VzXG5cblxuICAgICAgICBpZiAodGhpcy5pc0ZvY3VzVG9TaG93KCkgfHwgdGhpcy5pc0JsdXJUb0hpZGUoKSkge1xuICAgICAgICAgIG5ld0NoaWxkUHJvcHMub25Gb2N1cyA9IHRoaXMub25Gb2N1cztcbiAgICAgICAgICBuZXdDaGlsZFByb3BzLm9uQmx1ciA9IHRoaXMub25CbHVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0NoaWxkUHJvcHMub25Gb2N1cyA9IHRoaXMuY3JlYXRlVHdvQ2hhaW5zKCdvbkZvY3VzJyk7XG4gICAgICAgICAgbmV3Q2hpbGRQcm9wcy5vbkJsdXIgPSB0aGlzLmNyZWF0ZVR3b0NoYWlucygnb25CbHVyJyk7XG4gICAgICAgIH0gLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICAgICAgICB2YXIgY2hpbGRyZW5DbGFzc05hbWUgPSBjbGFzc05hbWVzKGNoaWxkICYmIGNoaWxkLnByb3BzICYmIGNoaWxkLnByb3BzLmNsYXNzTmFtZSwgY2xhc3NOYW1lKTtcblxuICAgICAgICBpZiAoY2hpbGRyZW5DbGFzc05hbWUpIHtcbiAgICAgICAgICBuZXdDaGlsZFByb3BzLmNsYXNzTmFtZSA9IGNoaWxkcmVuQ2xhc3NOYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNsb25lUHJvcHMgPSBfb2JqZWN0U3ByZWFkKHt9LCBuZXdDaGlsZFByb3BzKTtcblxuICAgICAgICBpZiAoc3VwcG9ydFJlZihjaGlsZCkpIHtcbiAgICAgICAgICBjbG9uZVByb3BzLnJlZiA9IGNvbXBvc2VSZWYodGhpcy50cmlnZ2VyUmVmLCBjaGlsZC5yZWYpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRyaWdnZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkLCBjbG9uZVByb3BzKTtcbiAgICAgICAgdmFyIHBvcnRhbDsgLy8gcHJldmVudCB1bm1vdW50aW5nIGFmdGVyIGl0J3MgcmVuZGVyZWRcblxuICAgICAgICBpZiAocG9wdXBWaXNpYmxlIHx8IHRoaXMucG9wdXBSZWYuY3VycmVudCB8fCBmb3JjZVJlbmRlcikge1xuICAgICAgICAgIHBvcnRhbCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBvcnRhbENvbXBvbmVudCwge1xuICAgICAgICAgICAga2V5OiBcInBvcnRhbFwiLFxuICAgICAgICAgICAgZ2V0Q29udGFpbmVyOiB0aGlzLmdldENvbnRhaW5lcixcbiAgICAgICAgICAgIGRpZFVwZGF0ZTogdGhpcy5oYW5kbGVQb3J0YWxVcGRhdGVcbiAgICAgICAgICB9LCB0aGlzLmdldENvbXBvbmVudCgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcG9wdXBWaXNpYmxlICYmIGF1dG9EZXN0cm95KSB7XG4gICAgICAgICAgcG9ydGFsID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmlnZ2VyQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgICAgIHZhbHVlOiB0aGlzLnRyaWdnZXJDb250ZXh0VmFsdWVcbiAgICAgICAgfSwgdHJpZ2dlciwgcG9ydGFsKTtcbiAgICAgIH1cbiAgICB9XSwgW3tcbiAgICAgIGtleTogXCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoX3JlZiwgcHJldlN0YXRlKSB7XG4gICAgICAgIHZhciBwb3B1cFZpc2libGUgPSBfcmVmLnBvcHVwVmlzaWJsZTtcbiAgICAgICAgdmFyIG5ld1N0YXRlID0ge307XG5cbiAgICAgICAgaWYgKHBvcHVwVmlzaWJsZSAhPT0gdW5kZWZpbmVkICYmIHByZXZTdGF0ZS5wb3B1cFZpc2libGUgIT09IHBvcHVwVmlzaWJsZSkge1xuICAgICAgICAgIG5ld1N0YXRlLnBvcHVwVmlzaWJsZSA9IHBvcHVwVmlzaWJsZTtcbiAgICAgICAgICBuZXdTdGF0ZS5wcmV2UG9wdXBWaXNpYmxlID0gcHJldlN0YXRlLnBvcHVwVmlzaWJsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXdTdGF0ZTtcbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gVHJpZ2dlcjtcbiAgfShSZWFjdC5Db21wb25lbnQpO1xuXG4gIF9kZWZpbmVQcm9wZXJ0eShUcmlnZ2VyLCBcImNvbnRleHRUeXBlXCIsIFRyaWdnZXJDb250ZXh0KTtcblxuICBfZGVmaW5lUHJvcGVydHkoVHJpZ2dlciwgXCJkZWZhdWx0UHJvcHNcIiwge1xuICAgIHByZWZpeENsczogJ3JjLXRyaWdnZXItcG9wdXAnLFxuICAgIGdldFBvcHVwQ2xhc3NOYW1lRnJvbUFsaWduOiByZXR1cm5FbXB0eVN0cmluZyxcbiAgICBnZXREb2N1bWVudDogcmV0dXJuRG9jdW1lbnQsXG4gICAgb25Qb3B1cFZpc2libGVDaGFuZ2U6IG5vb3AsXG4gICAgYWZ0ZXJQb3B1cFZpc2libGVDaGFuZ2U6IG5vb3AsXG4gICAgb25Qb3B1cEFsaWduOiBub29wLFxuICAgIHBvcHVwQ2xhc3NOYW1lOiAnJyxcbiAgICBtb3VzZUVudGVyRGVsYXk6IDAsXG4gICAgbW91c2VMZWF2ZURlbGF5OiAwLjEsXG4gICAgZm9jdXNEZWxheTogMCxcbiAgICBibHVyRGVsYXk6IDAuMTUsXG4gICAgcG9wdXBTdHlsZToge30sXG4gICAgZGVzdHJveVBvcHVwT25IaWRlOiBmYWxzZSxcbiAgICBwb3B1cEFsaWduOiB7fSxcbiAgICBkZWZhdWx0UG9wdXBWaXNpYmxlOiBmYWxzZSxcbiAgICBtYXNrOiBmYWxzZSxcbiAgICBtYXNrQ2xvc2FibGU6IHRydWUsXG4gICAgYWN0aW9uOiBbXSxcbiAgICBzaG93QWN0aW9uOiBbXSxcbiAgICBoaWRlQWN0aW9uOiBbXSxcbiAgICBhdXRvRGVzdHJveTogZmFsc2VcbiAgfSk7XG5cbiAgcmV0dXJuIFRyaWdnZXI7XG59XG5leHBvcnQgZGVmYXVsdCBnZW5lcmF0ZVRyaWdnZXIoUG9ydGFsKTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJwcmVmaXhDbHNcIiwgXCJkaXNhYmxlZFwiLCBcInZpc2libGVcIiwgXCJjaGlsZHJlblwiLCBcInBvcHVwRWxlbWVudFwiLCBcImNvbnRhaW5lcldpZHRoXCIsIFwiYW5pbWF0aW9uXCIsIFwidHJhbnNpdGlvbk5hbWVcIiwgXCJkcm9wZG93blN0eWxlXCIsIFwiZHJvcGRvd25DbGFzc05hbWVcIiwgXCJkaXJlY3Rpb25cIiwgXCJwbGFjZW1lbnRcIiwgXCJkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGhcIiwgXCJkcm9wZG93blJlbmRlclwiLCBcImRyb3Bkb3duQWxpZ25cIiwgXCJnZXRQb3B1cENvbnRhaW5lclwiLCBcImVtcHR5XCIsIFwiZ2V0VHJpZ2dlckRPTU5vZGVcIiwgXCJvblBvcHVwVmlzaWJsZUNoYW5nZVwiLCBcIm9uUG9wdXBNb3VzZUVudGVyXCJdO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFRyaWdnZXIgZnJvbSAncmMtdHJpZ2dlcic7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbnZhciBnZXRCdWlsdEluUGxhY2VtZW50cyA9IGZ1bmN0aW9uIGdldEJ1aWx0SW5QbGFjZW1lbnRzKGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCkge1xuICAvLyBFbmFibGUgaG9yaXpvbnRhbCBvdmVyZmxvdyBhdXRvLWFkanVzdG1lbnQgd2hlbiBhIGN1c3RvbSBkcm9wZG93biB3aWR0aCBpcyBwcm92aWRlZFxuICB2YXIgYWRqdXN0WCA9IGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCA9PT0gdHJ1ZSA/IDAgOiAxO1xuICByZXR1cm4ge1xuICAgIGJvdHRvbUxlZnQ6IHtcbiAgICAgIHBvaW50czogWyd0bCcsICdibCddLFxuICAgICAgb2Zmc2V0OiBbMCwgNF0sXG4gICAgICBvdmVyZmxvdzoge1xuICAgICAgICBhZGp1c3RYOiBhZGp1c3RYLFxuICAgICAgICBhZGp1c3RZOiAxXG4gICAgICB9XG4gICAgfSxcbiAgICBib3R0b21SaWdodDoge1xuICAgICAgcG9pbnRzOiBbJ3RyJywgJ2JyJ10sXG4gICAgICBvZmZzZXQ6IFswLCA0XSxcbiAgICAgIG92ZXJmbG93OiB7XG4gICAgICAgIGFkanVzdFg6IGFkanVzdFgsXG4gICAgICAgIGFkanVzdFk6IDFcbiAgICAgIH1cbiAgICB9LFxuICAgIHRvcExlZnQ6IHtcbiAgICAgIHBvaW50czogWydibCcsICd0bCddLFxuICAgICAgb2Zmc2V0OiBbMCwgLTRdLFxuICAgICAgb3ZlcmZsb3c6IHtcbiAgICAgICAgYWRqdXN0WDogYWRqdXN0WCxcbiAgICAgICAgYWRqdXN0WTogMVxuICAgICAgfVxuICAgIH0sXG4gICAgdG9wUmlnaHQ6IHtcbiAgICAgIHBvaW50czogWydicicsICd0ciddLFxuICAgICAgb2Zmc2V0OiBbMCwgLTRdLFxuICAgICAgb3ZlcmZsb3c6IHtcbiAgICAgICAgYWRqdXN0WDogYWRqdXN0WCxcbiAgICAgICAgYWRqdXN0WTogMVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG52YXIgU2VsZWN0VHJpZ2dlciA9IGZ1bmN0aW9uIFNlbGVjdFRyaWdnZXIocHJvcHMsIHJlZikge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgdmlzaWJsZSA9IHByb3BzLnZpc2libGUsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBwb3B1cEVsZW1lbnQgPSBwcm9wcy5wb3B1cEVsZW1lbnQsXG4gICAgY29udGFpbmVyV2lkdGggPSBwcm9wcy5jb250YWluZXJXaWR0aCxcbiAgICBhbmltYXRpb24gPSBwcm9wcy5hbmltYXRpb24sXG4gICAgdHJhbnNpdGlvbk5hbWUgPSBwcm9wcy50cmFuc2l0aW9uTmFtZSxcbiAgICBkcm9wZG93blN0eWxlID0gcHJvcHMuZHJvcGRvd25TdHlsZSxcbiAgICBkcm9wZG93bkNsYXNzTmFtZSA9IHByb3BzLmRyb3Bkb3duQ2xhc3NOYW1lLFxuICAgIF9wcm9wcyRkaXJlY3Rpb24gPSBwcm9wcy5kaXJlY3Rpb24sXG4gICAgZGlyZWN0aW9uID0gX3Byb3BzJGRpcmVjdGlvbiA9PT0gdm9pZCAwID8gJ2x0cicgOiBfcHJvcHMkZGlyZWN0aW9uLFxuICAgIHBsYWNlbWVudCA9IHByb3BzLnBsYWNlbWVudCxcbiAgICBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGggPSBwcm9wcy5kcm9wZG93bk1hdGNoU2VsZWN0V2lkdGgsXG4gICAgZHJvcGRvd25SZW5kZXIgPSBwcm9wcy5kcm9wZG93blJlbmRlcixcbiAgICBkcm9wZG93bkFsaWduID0gcHJvcHMuZHJvcGRvd25BbGlnbixcbiAgICBnZXRQb3B1cENvbnRhaW5lciA9IHByb3BzLmdldFBvcHVwQ29udGFpbmVyLFxuICAgIGVtcHR5ID0gcHJvcHMuZW1wdHksXG4gICAgZ2V0VHJpZ2dlckRPTU5vZGUgPSBwcm9wcy5nZXRUcmlnZ2VyRE9NTm9kZSxcbiAgICBvblBvcHVwVmlzaWJsZUNoYW5nZSA9IHByb3BzLm9uUG9wdXBWaXNpYmxlQ2hhbmdlLFxuICAgIG9uUG9wdXBNb3VzZUVudGVyID0gcHJvcHMub25Qb3B1cE1vdXNlRW50ZXIsXG4gICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQpO1xuICB2YXIgZHJvcGRvd25QcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRyb3Bkb3duXCIpO1xuICB2YXIgcG9wdXBOb2RlID0gcG9wdXBFbGVtZW50O1xuICBpZiAoZHJvcGRvd25SZW5kZXIpIHtcbiAgICBwb3B1cE5vZGUgPSBkcm9wZG93blJlbmRlcihwb3B1cEVsZW1lbnQpO1xuICB9XG4gIHZhciBidWlsdEluUGxhY2VtZW50cyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnZXRCdWlsdEluUGxhY2VtZW50cyhkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGgpO1xuICB9LCBbZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IE1vdGlvbiA9PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtZXJnZWRUcmFuc2l0aW9uTmFtZSA9IGFuaW1hdGlvbiA/IFwiXCIuY29uY2F0KGRyb3Bkb3duUHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KGFuaW1hdGlvbikgOiB0cmFuc2l0aW9uTmFtZTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBSZWYgPT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHBvcHVwUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBnZXRQb3B1cEVsZW1lbnQ6IGZ1bmN0aW9uIGdldFBvcHVwRWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHBvcHVwUmVmLmN1cnJlbnQ7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG4gIHZhciBwb3B1cFN0eWxlID0gX29iamVjdFNwcmVhZCh7XG4gICAgbWluV2lkdGg6IGNvbnRhaW5lcldpZHRoXG4gIH0sIGRyb3Bkb3duU3R5bGUpO1xuICBpZiAodHlwZW9mIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCA9PT0gJ251bWJlcicpIHtcbiAgICBwb3B1cFN0eWxlLndpZHRoID0gZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoO1xuICB9IGVsc2UgaWYgKGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCkge1xuICAgIHBvcHVwU3R5bGUud2lkdGggPSBjb250YWluZXJXaWR0aDtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVHJpZ2dlciwgX2V4dGVuZHMoe30sIHJlc3RQcm9wcywge1xuICAgIHNob3dBY3Rpb246IG9uUG9wdXBWaXNpYmxlQ2hhbmdlID8gWydjbGljayddIDogW10sXG4gICAgaGlkZUFjdGlvbjogb25Qb3B1cFZpc2libGVDaGFuZ2UgPyBbJ2NsaWNrJ10gOiBbXSxcbiAgICBwb3B1cFBsYWNlbWVudDogcGxhY2VtZW50IHx8IChkaXJlY3Rpb24gPT09ICdydGwnID8gJ2JvdHRvbVJpZ2h0JyA6ICdib3R0b21MZWZ0JyksXG4gICAgYnVpbHRpblBsYWNlbWVudHM6IGJ1aWx0SW5QbGFjZW1lbnRzLFxuICAgIHByZWZpeENsczogZHJvcGRvd25QcmVmaXhDbHMsXG4gICAgcG9wdXBUcmFuc2l0aW9uTmFtZTogbWVyZ2VkVHJhbnNpdGlvbk5hbWUsXG4gICAgcG9wdXA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIHJlZjogcG9wdXBSZWYsXG4gICAgICBvbk1vdXNlRW50ZXI6IG9uUG9wdXBNb3VzZUVudGVyXG4gICAgfSwgcG9wdXBOb2RlKSxcbiAgICBwb3B1cEFsaWduOiBkcm9wZG93bkFsaWduLFxuICAgIHBvcHVwVmlzaWJsZTogdmlzaWJsZSxcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXIsXG4gICAgcG9wdXBDbGFzc05hbWU6IGNsYXNzTmFtZXMoZHJvcGRvd25DbGFzc05hbWUsIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQoZHJvcGRvd25QcmVmaXhDbHMsIFwiLWVtcHR5XCIpLCBlbXB0eSkpLFxuICAgIHBvcHVwU3R5bGU6IHBvcHVwU3R5bGUsXG4gICAgZ2V0VHJpZ2dlckRPTU5vZGU6IGdldFRyaWdnZXJET01Ob2RlLFxuICAgIG9uUG9wdXBWaXNpYmxlQ2hhbmdlOiBvblBvcHVwVmlzaWJsZUNoYW5nZVxuICB9KSwgY2hpbGRyZW4pO1xufTtcbnZhciBSZWZTZWxlY3RUcmlnZ2VyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoU2VsZWN0VHJpZ2dlcik7XG5SZWZTZWxlY3RUcmlnZ2VyLmRpc3BsYXlOYW1lID0gJ1NlbGVjdFRyaWdnZXInO1xuZXhwb3J0IGRlZmF1bHQgUmVmU2VsZWN0VHJpZ2dlcjsiLCJpbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF90b0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuZnVuY3Rpb24gZ2V0S2V5KGRhdGEsIGluZGV4KSB7XG4gIHZhciBrZXkgPSBkYXRhLmtleTtcbiAgdmFyIHZhbHVlO1xuICBpZiAoJ3ZhbHVlJyBpbiBkYXRhKSB7XG4gICAgdmFsdWUgPSBkYXRhLnZhbHVlO1xuICB9XG4gIGlmIChrZXkgIT09IG51bGwgJiYga2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4ga2V5O1xuICB9XG4gIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiBcInJjLWluZGV4LWtleS1cIi5jb25jYXQoaW5kZXgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZpbGxGaWVsZE5hbWVzKGZpZWxkTmFtZXMsIGNoaWxkcmVuQXNEYXRhKSB7XG4gIHZhciBfcmVmID0gZmllbGROYW1lcyB8fCB7fSxcbiAgICBsYWJlbCA9IF9yZWYubGFiZWwsXG4gICAgdmFsdWUgPSBfcmVmLnZhbHVlLFxuICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnM7XG4gIHJldHVybiB7XG4gICAgbGFiZWw6IGxhYmVsIHx8IChjaGlsZHJlbkFzRGF0YSA/ICdjaGlsZHJlbicgOiAnbGFiZWwnKSxcbiAgICB2YWx1ZTogdmFsdWUgfHwgJ3ZhbHVlJyxcbiAgICBvcHRpb25zOiBvcHRpb25zIHx8ICdvcHRpb25zJ1xuICB9O1xufVxuXG4vKipcbiAqIEZsYXQgb3B0aW9ucyBpbnRvIGZsYXR0ZW4gbGlzdC5cbiAqIFdlIHVzZSBgb3B0aW9uT25seWAgaGVyZSBpcyBhaW0gdG8gYXZvaWQgdXNlciB1c2UgbmVzdGVkIG9wdGlvbiBncm91cC5cbiAqIEhlcmUgaXMgc2ltcGx5IHNldCBga2V5YCB0byB0aGUgaW5kZXggaWYgbm90IHByb3ZpZGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlbk9wdGlvbnMob3B0aW9ucykge1xuICB2YXIgX3JlZjIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuICAgIGZpZWxkTmFtZXMgPSBfcmVmMi5maWVsZE5hbWVzLFxuICAgIGNoaWxkcmVuQXNEYXRhID0gX3JlZjIuY2hpbGRyZW5Bc0RhdGE7XG4gIHZhciBmbGF0dGVuTGlzdCA9IFtdO1xuICB2YXIgX2ZpbGxGaWVsZE5hbWVzID0gZmlsbEZpZWxkTmFtZXMoZmllbGROYW1lcywgZmFsc2UpLFxuICAgIGZpZWxkTGFiZWwgPSBfZmlsbEZpZWxkTmFtZXMubGFiZWwsXG4gICAgZmllbGRWYWx1ZSA9IF9maWxsRmllbGROYW1lcy52YWx1ZSxcbiAgICBmaWVsZE9wdGlvbnMgPSBfZmlsbEZpZWxkTmFtZXMub3B0aW9ucztcbiAgZnVuY3Rpb24gZGlnKGxpc3QsIGlzR3JvdXBPcHRpb24pIHtcbiAgICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIHZhciBsYWJlbCA9IGRhdGFbZmllbGRMYWJlbF07XG4gICAgICBpZiAoaXNHcm91cE9wdGlvbiB8fCAhKGZpZWxkT3B0aW9ucyBpbiBkYXRhKSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBkYXRhW2ZpZWxkVmFsdWVdO1xuXG4gICAgICAgIC8vIE9wdGlvblxuICAgICAgICBmbGF0dGVuTGlzdC5wdXNoKHtcbiAgICAgICAgICBrZXk6IGdldEtleShkYXRhLCBmbGF0dGVuTGlzdC5sZW5ndGgpLFxuICAgICAgICAgIGdyb3VwT3B0aW9uOiBpc0dyb3VwT3B0aW9uLFxuICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgbGFiZWw6IGxhYmVsLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBncnBMYWJlbCA9IGxhYmVsO1xuICAgICAgICBpZiAoZ3JwTGFiZWwgPT09IHVuZGVmaW5lZCAmJiBjaGlsZHJlbkFzRGF0YSkge1xuICAgICAgICAgIGdycExhYmVsID0gZGF0YS5sYWJlbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9wdGlvbiBHcm91cFxuICAgICAgICBmbGF0dGVuTGlzdC5wdXNoKHtcbiAgICAgICAgICBrZXk6IGdldEtleShkYXRhLCBmbGF0dGVuTGlzdC5sZW5ndGgpLFxuICAgICAgICAgIGdyb3VwOiB0cnVlLFxuICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgbGFiZWw6IGdycExhYmVsXG4gICAgICAgIH0pO1xuICAgICAgICBkaWcoZGF0YVtmaWVsZE9wdGlvbnNdLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBkaWcob3B0aW9ucywgZmFsc2UpO1xuICByZXR1cm4gZmxhdHRlbkxpc3Q7XG59XG5cbi8qKlxuICogSW5qZWN0IGBwcm9wc2AgaW50byBgb3B0aW9uYCBmb3IgbGVnYWN5IHVzYWdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RQcm9wc1dpdGhPcHRpb24ob3B0aW9uKSB7XG4gIHZhciBuZXdPcHRpb24gPSBfb2JqZWN0U3ByZWFkKHt9LCBvcHRpb24pO1xuICBpZiAoISgncHJvcHMnIGluIG5ld09wdGlvbikpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T3B0aW9uLCAncHJvcHMnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgd2FybmluZyhmYWxzZSwgJ1JldHVybiB0eXBlIGlzIG9wdGlvbiBpbnN0ZWFkIG9mIE9wdGlvbiBpbnN0YW5jZS4gUGxlYXNlIHJlYWQgdmFsdWUgZGlyZWN0bHkgaW5zdGVhZCBvZiByZWFkaW5nIGZyb20gYHByb3BzYC4nKTtcbiAgICAgICAgcmV0dXJuIG5ld09wdGlvbjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gbmV3T3B0aW9uO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlcGFyYXRlZENvbnRlbnQodGV4dCwgdG9rZW5zKSB7XG4gIGlmICghdG9rZW5zIHx8ICF0b2tlbnMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIG1hdGNoID0gZmFsc2U7XG4gIGZ1bmN0aW9uIHNlcGFyYXRlKHN0ciwgX3JlZjMpIHtcbiAgICB2YXIgX3JlZjQgPSBfdG9BcnJheShfcmVmMyksXG4gICAgICB0b2tlbiA9IF9yZWY0WzBdLFxuICAgICAgcmVzdFRva2VucyA9IF9yZWY0LnNsaWNlKDEpO1xuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIHJldHVybiBbc3RyXTtcbiAgICB9XG4gICAgdmFyIGxpc3QgPSBzdHIuc3BsaXQodG9rZW4pO1xuICAgIG1hdGNoID0gbWF0Y2ggfHwgbGlzdC5sZW5ndGggPiAxO1xuICAgIHJldHVybiBsaXN0LnJlZHVjZShmdW5jdGlvbiAocHJldkxpc3QsIHVuaXRTdHIpIHtcbiAgICAgIHJldHVybiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHByZXZMaXN0KSwgX3RvQ29uc3VtYWJsZUFycmF5KHNlcGFyYXRlKHVuaXRTdHIsIHJlc3RUb2tlbnMpKSk7XG4gICAgfSwgW10pLmZpbHRlcihmdW5jdGlvbiAodW5pdCkge1xuICAgICAgcmV0dXJuIHVuaXQ7XG4gICAgfSk7XG4gIH1cbiAgdmFyIGxpc3QgPSBzZXBhcmF0ZSh0ZXh0LCB0b2tlbnMpO1xuICByZXR1cm4gbWF0Y2ggPyBsaXN0IDogbnVsbDtcbn0iLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJpZFwiLCBcInByZWZpeENsc1wiLCBcImNsYXNzTmFtZVwiLCBcInNob3dTZWFyY2hcIiwgXCJ0YWdSZW5kZXJcIiwgXCJkaXJlY3Rpb25cIiwgXCJvbWl0RG9tUHJvcHNcIiwgXCJkaXNwbGF5VmFsdWVzXCIsIFwib25EaXNwbGF5VmFsdWVzQ2hhbmdlXCIsIFwiZW1wdHlPcHRpb25zXCIsIFwibm90Rm91bmRDb250ZW50XCIsIFwib25DbGVhclwiLCBcIm1vZGVcIiwgXCJkaXNhYmxlZFwiLCBcImxvYWRpbmdcIiwgXCJnZXRJbnB1dEVsZW1lbnRcIiwgXCJnZXRSYXdJbnB1dEVsZW1lbnRcIiwgXCJvcGVuXCIsIFwiZGVmYXVsdE9wZW5cIiwgXCJvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZVwiLCBcImFjdGl2ZVZhbHVlXCIsIFwib25BY3RpdmVWYWx1ZUNoYW5nZVwiLCBcImFjdGl2ZURlc2NlbmRhbnRJZFwiLCBcInNlYXJjaFZhbHVlXCIsIFwiYXV0b0NsZWFyU2VhcmNoVmFsdWVcIiwgXCJvblNlYXJjaFwiLCBcIm9uU2VhcmNoU3BsaXRcIiwgXCJ0b2tlblNlcGFyYXRvcnNcIiwgXCJhbGxvd0NsZWFyXCIsIFwic2hvd0Fycm93XCIsIFwiaW5wdXRJY29uXCIsIFwiY2xlYXJJY29uXCIsIFwiT3B0aW9uTGlzdFwiLCBcImFuaW1hdGlvblwiLCBcInRyYW5zaXRpb25OYW1lXCIsIFwiZHJvcGRvd25TdHlsZVwiLCBcImRyb3Bkb3duQ2xhc3NOYW1lXCIsIFwiZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoXCIsIFwiZHJvcGRvd25SZW5kZXJcIiwgXCJkcm9wZG93bkFsaWduXCIsIFwicGxhY2VtZW50XCIsIFwiZ2V0UG9wdXBDb250YWluZXJcIiwgXCJzaG93QWN0aW9uXCIsIFwib25Gb2N1c1wiLCBcIm9uQmx1clwiLCBcIm9uS2V5VXBcIiwgXCJvbktleURvd25cIiwgXCJvbk1vdXNlRG93blwiXTtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHVzZUxheW91dEVmZmVjdCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCB1c2VNZXJnZWRTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZXJnZWRTdGF0ZVwiO1xuaW1wb3J0IGlzTW9iaWxlIGZyb20gXCJyYy11dGlsL2VzL2lzTW9iaWxlXCI7XG5pbXBvcnQgS2V5Q29kZSBmcm9tIFwicmMtdXRpbC9lcy9LZXlDb2RlXCI7XG5pbXBvcnQgeyB1c2VDb21wb3NlUmVmIH0gZnJvbSBcInJjLXV0aWwvZXMvcmVmXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBCYXNlU2VsZWN0Q29udGV4dCB9IGZyb20gXCIuL2hvb2tzL3VzZUJhc2VQcm9wc1wiO1xuaW1wb3J0IHVzZURlbGF5UmVzZXQgZnJvbSBcIi4vaG9va3MvdXNlRGVsYXlSZXNldFwiO1xuaW1wb3J0IHVzZUxvY2sgZnJvbSBcIi4vaG9va3MvdXNlTG9ja1wiO1xuaW1wb3J0IHVzZVNlbGVjdFRyaWdnZXJDb250cm9sIGZyb20gXCIuL2hvb2tzL3VzZVNlbGVjdFRyaWdnZXJDb250cm9sXCI7XG5pbXBvcnQgU2VsZWN0b3IgZnJvbSBcIi4vU2VsZWN0b3JcIjtcbmltcG9ydCBTZWxlY3RUcmlnZ2VyIGZyb20gXCIuL1NlbGVjdFRyaWdnZXJcIjtcbmltcG9ydCBUcmFuc0J0biBmcm9tIFwiLi9UcmFuc0J0blwiO1xuaW1wb3J0IHsgZ2V0U2VwYXJhdGVkQ29udGVudCB9IGZyb20gXCIuL3V0aWxzL3ZhbHVlVXRpbFwiO1xudmFyIERFRkFVTFRfT01JVF9QUk9QUyA9IFsndmFsdWUnLCAnb25DaGFuZ2UnLCAncmVtb3ZlSWNvbicsICdwbGFjZWhvbGRlcicsICdhdXRvRm9jdXMnLCAnbWF4VGFnQ291bnQnLCAnbWF4VGFnVGV4dExlbmd0aCcsICdtYXhUYWdQbGFjZWhvbGRlcicsICdjaG9pY2VUcmFuc2l0aW9uTmFtZScsICdvbklucHV0S2V5RG93bicsICdvblBvcHVwU2Nyb2xsJywgJ3RhYkluZGV4J107XG5leHBvcnQgZnVuY3Rpb24gaXNNdWx0aXBsZShtb2RlKSB7XG4gIHJldHVybiBtb2RlID09PSAndGFncycgfHwgbW9kZSA9PT0gJ211bHRpcGxlJztcbn1cbnZhciBCYXNlU2VsZWN0ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIF9jdXN0b21pemVSYXdJbnB1dEVsZSwgX2NsYXNzTmFtZXMyO1xuICB2YXIgaWQgPSBwcm9wcy5pZCxcbiAgICBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIHNob3dTZWFyY2ggPSBwcm9wcy5zaG93U2VhcmNoLFxuICAgIHRhZ1JlbmRlciA9IHByb3BzLnRhZ1JlbmRlcixcbiAgICBkaXJlY3Rpb24gPSBwcm9wcy5kaXJlY3Rpb24sXG4gICAgb21pdERvbVByb3BzID0gcHJvcHMub21pdERvbVByb3BzLFxuICAgIGRpc3BsYXlWYWx1ZXMgPSBwcm9wcy5kaXNwbGF5VmFsdWVzLFxuICAgIG9uRGlzcGxheVZhbHVlc0NoYW5nZSA9IHByb3BzLm9uRGlzcGxheVZhbHVlc0NoYW5nZSxcbiAgICBlbXB0eU9wdGlvbnMgPSBwcm9wcy5lbXB0eU9wdGlvbnMsXG4gICAgX3Byb3BzJG5vdEZvdW5kQ29udGVuID0gcHJvcHMubm90Rm91bmRDb250ZW50LFxuICAgIG5vdEZvdW5kQ29udGVudCA9IF9wcm9wcyRub3RGb3VuZENvbnRlbiA9PT0gdm9pZCAwID8gJ05vdCBGb3VuZCcgOiBfcHJvcHMkbm90Rm91bmRDb250ZW4sXG4gICAgb25DbGVhciA9IHByb3BzLm9uQ2xlYXIsXG4gICAgbW9kZSA9IHByb3BzLm1vZGUsXG4gICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICBsb2FkaW5nID0gcHJvcHMubG9hZGluZyxcbiAgICBnZXRJbnB1dEVsZW1lbnQgPSBwcm9wcy5nZXRJbnB1dEVsZW1lbnQsXG4gICAgZ2V0UmF3SW5wdXRFbGVtZW50ID0gcHJvcHMuZ2V0UmF3SW5wdXRFbGVtZW50LFxuICAgIG9wZW4gPSBwcm9wcy5vcGVuLFxuICAgIGRlZmF1bHRPcGVuID0gcHJvcHMuZGVmYXVsdE9wZW4sXG4gICAgb25Ecm9wZG93blZpc2libGVDaGFuZ2UgPSBwcm9wcy5vbkRyb3Bkb3duVmlzaWJsZUNoYW5nZSxcbiAgICBhY3RpdmVWYWx1ZSA9IHByb3BzLmFjdGl2ZVZhbHVlLFxuICAgIG9uQWN0aXZlVmFsdWVDaGFuZ2UgPSBwcm9wcy5vbkFjdGl2ZVZhbHVlQ2hhbmdlLFxuICAgIGFjdGl2ZURlc2NlbmRhbnRJZCA9IHByb3BzLmFjdGl2ZURlc2NlbmRhbnRJZCxcbiAgICBzZWFyY2hWYWx1ZSA9IHByb3BzLnNlYXJjaFZhbHVlLFxuICAgIGF1dG9DbGVhclNlYXJjaFZhbHVlID0gcHJvcHMuYXV0b0NsZWFyU2VhcmNoVmFsdWUsXG4gICAgb25TZWFyY2ggPSBwcm9wcy5vblNlYXJjaCxcbiAgICBvblNlYXJjaFNwbGl0ID0gcHJvcHMub25TZWFyY2hTcGxpdCxcbiAgICB0b2tlblNlcGFyYXRvcnMgPSBwcm9wcy50b2tlblNlcGFyYXRvcnMsXG4gICAgYWxsb3dDbGVhciA9IHByb3BzLmFsbG93Q2xlYXIsXG4gICAgc2hvd0Fycm93ID0gcHJvcHMuc2hvd0Fycm93LFxuICAgIGlucHV0SWNvbiA9IHByb3BzLmlucHV0SWNvbixcbiAgICBjbGVhckljb24gPSBwcm9wcy5jbGVhckljb24sXG4gICAgT3B0aW9uTGlzdCA9IHByb3BzLk9wdGlvbkxpc3QsXG4gICAgYW5pbWF0aW9uID0gcHJvcHMuYW5pbWF0aW9uLFxuICAgIHRyYW5zaXRpb25OYW1lID0gcHJvcHMudHJhbnNpdGlvbk5hbWUsXG4gICAgZHJvcGRvd25TdHlsZSA9IHByb3BzLmRyb3Bkb3duU3R5bGUsXG4gICAgZHJvcGRvd25DbGFzc05hbWUgPSBwcm9wcy5kcm9wZG93bkNsYXNzTmFtZSxcbiAgICBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGggPSBwcm9wcy5kcm9wZG93bk1hdGNoU2VsZWN0V2lkdGgsXG4gICAgZHJvcGRvd25SZW5kZXIgPSBwcm9wcy5kcm9wZG93blJlbmRlcixcbiAgICBkcm9wZG93bkFsaWduID0gcHJvcHMuZHJvcGRvd25BbGlnbixcbiAgICBwbGFjZW1lbnQgPSBwcm9wcy5wbGFjZW1lbnQsXG4gICAgZ2V0UG9wdXBDb250YWluZXIgPSBwcm9wcy5nZXRQb3B1cENvbnRhaW5lcixcbiAgICBfcHJvcHMkc2hvd0FjdGlvbiA9IHByb3BzLnNob3dBY3Rpb24sXG4gICAgc2hvd0FjdGlvbiA9IF9wcm9wcyRzaG93QWN0aW9uID09PSB2b2lkIDAgPyBbXSA6IF9wcm9wcyRzaG93QWN0aW9uLFxuICAgIG9uRm9jdXMgPSBwcm9wcy5vbkZvY3VzLFxuICAgIG9uQmx1ciA9IHByb3BzLm9uQmx1cixcbiAgICBvbktleVVwID0gcHJvcHMub25LZXlVcCxcbiAgICBvbktleURvd24gPSBwcm9wcy5vbktleURvd24sXG4gICAgb25Nb3VzZURvd24gPSBwcm9wcy5vbk1vdXNlRG93bixcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE1JU0MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtdWx0aXBsZSA9IGlzTXVsdGlwbGUobW9kZSk7XG4gIHZhciBtZXJnZWRTaG93U2VhcmNoID0gKHNob3dTZWFyY2ggIT09IHVuZGVmaW5lZCA/IHNob3dTZWFyY2ggOiBtdWx0aXBsZSkgfHwgbW9kZSA9PT0gJ2NvbWJvYm94JztcbiAgdmFyIGRvbVByb3BzID0gX29iamVjdFNwcmVhZCh7fSwgcmVzdFByb3BzKTtcbiAgREVGQVVMVF9PTUlUX1BST1BTLmZvckVhY2goZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gICAgZGVsZXRlIGRvbVByb3BzW3Byb3BOYW1lXTtcbiAgfSk7XG4gIG9taXREb21Qcm9wcyA9PT0gbnVsbCB8fCBvbWl0RG9tUHJvcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9taXREb21Qcm9wcy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wTmFtZSkge1xuICAgIGRlbGV0ZSBkb21Qcm9wc1twcm9wTmFtZV07XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE1vYmlsZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIG1vYmlsZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0TW9iaWxlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAvLyBPbmx5IHVwZGF0ZSBvbiB0aGUgY2xpZW50IHNpZGVcbiAgICBzZXRNb2JpbGUoaXNNb2JpbGUoKSk7XG4gIH0sIFtdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVmcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGNvbnRhaW5lclJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIHNlbGVjdG9yRG9tUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB2YXIgdHJpZ2dlclJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIHNlbGVjdG9yUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB2YXIgbGlzdFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcblxuICAvKiogVXNlZCBmb3IgY29tcG9uZW50IGZvY3VzZWQgbWFuYWdlbWVudCAqL1xuICB2YXIgX3VzZURlbGF5UmVzZXQgPSB1c2VEZWxheVJlc2V0KCksXG4gICAgX3VzZURlbGF5UmVzZXQyID0gX3NsaWNlZFRvQXJyYXkoX3VzZURlbGF5UmVzZXQsIDMpLFxuICAgIG1vY2tGb2N1c2VkID0gX3VzZURlbGF5UmVzZXQyWzBdLFxuICAgIHNldE1vY2tGb2N1c2VkID0gX3VzZURlbGF5UmVzZXQyWzFdLFxuICAgIGNhbmNlbFNldE1vY2tGb2N1c2VkID0gX3VzZURlbGF5UmVzZXQyWzJdO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBJbXBlcmF0aXZlID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBfc2VsZWN0b3JSZWYkY3VycmVudCwgX3NlbGVjdG9yUmVmJGN1cnJlbnQyO1xuICAgIHJldHVybiB7XG4gICAgICBmb2N1czogKF9zZWxlY3RvclJlZiRjdXJyZW50ID0gc2VsZWN0b3JSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX3NlbGVjdG9yUmVmJGN1cnJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9zZWxlY3RvclJlZiRjdXJyZW50LmZvY3VzLFxuICAgICAgYmx1cjogKF9zZWxlY3RvclJlZiRjdXJyZW50MiA9IHNlbGVjdG9yUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9zZWxlY3RvclJlZiRjdXJyZW50MiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3NlbGVjdG9yUmVmJGN1cnJlbnQyLmJsdXIsXG4gICAgICBzY3JvbGxUbzogZnVuY3Rpb24gc2Nyb2xsVG8oYXJnKSB7XG4gICAgICAgIHZhciBfbGlzdFJlZiRjdXJyZW50O1xuICAgICAgICByZXR1cm4gKF9saXN0UmVmJGN1cnJlbnQgPSBsaXN0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9saXN0UmVmJGN1cnJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9saXN0UmVmJGN1cnJlbnQuc2Nyb2xsVG8oYXJnKTtcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBTZWFyY2ggVmFsdWUgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG1lcmdlZFNlYXJjaFZhbHVlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9kaXNwbGF5VmFsdWVzJDtcbiAgICBpZiAobW9kZSAhPT0gJ2NvbWJvYm94Jykge1xuICAgICAgcmV0dXJuIHNlYXJjaFZhbHVlO1xuICAgIH1cbiAgICB2YXIgdmFsID0gKF9kaXNwbGF5VmFsdWVzJCA9IGRpc3BsYXlWYWx1ZXNbMF0pID09PSBudWxsIHx8IF9kaXNwbGF5VmFsdWVzJCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Rpc3BsYXlWYWx1ZXMkLnZhbHVlO1xuICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsID09PSAnbnVtYmVyJyA/IFN0cmluZyh2YWwpIDogJyc7XG4gIH0sIFtzZWFyY2hWYWx1ZSwgbW9kZSwgZGlzcGxheVZhbHVlc10pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IEN1c3RvbSBJbnB1dCA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBPbmx5IHdvcmtzIGluIGBjb21ib2JveGBcbiAgdmFyIGN1c3RvbWl6ZUlucHV0RWxlbWVudCA9IG1vZGUgPT09ICdjb21ib2JveCcgJiYgdHlwZW9mIGdldElucHV0RWxlbWVudCA9PT0gJ2Z1bmN0aW9uJyAmJiBnZXRJbnB1dEVsZW1lbnQoKSB8fCBudWxsO1xuXG4gIC8vIFVzZWQgZm9yIGN1c3RvbWl6ZSByZXBsYWNlbWVudCBmb3IgYHJjLWNhc2NhZGVyYFxuICB2YXIgY3VzdG9taXplUmF3SW5wdXRFbGVtZW50ID0gdHlwZW9mIGdldFJhd0lucHV0RWxlbWVudCA9PT0gJ2Z1bmN0aW9uJyAmJiBnZXRSYXdJbnB1dEVsZW1lbnQoKTtcbiAgdmFyIGN1c3RvbWl6ZVJhd0lucHV0UmVmID0gdXNlQ29tcG9zZVJlZihzZWxlY3RvckRvbVJlZiwgY3VzdG9taXplUmF3SW5wdXRFbGVtZW50ID09PSBudWxsIHx8IGN1c3RvbWl6ZVJhd0lucHV0RWxlbWVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9jdXN0b21pemVSYXdJbnB1dEVsZSA9IGN1c3RvbWl6ZVJhd0lucHV0RWxlbWVudC5wcm9wcykgPT09IG51bGwgfHwgX2N1c3RvbWl6ZVJhd0lucHV0RWxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY3VzdG9taXplUmF3SW5wdXRFbGUucmVmKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gT3BlbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZSA9IHVzZU1lcmdlZFN0YXRlKHVuZGVmaW5lZCwge1xuICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0T3BlbixcbiAgICAgIHZhbHVlOiBvcGVuXG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZSwgMiksXG4gICAgaW5uZXJPcGVuID0gX3VzZU1lcmdlZFN0YXRlMlswXSxcbiAgICBzZXRJbm5lck9wZW4gPSBfdXNlTWVyZ2VkU3RhdGUyWzFdO1xuICB2YXIgbWVyZ2VkT3BlbiA9IGlubmVyT3BlbjtcblxuICAvLyBOb3QgdHJpZ2dlciBgb3BlbmAgaW4gYGNvbWJvYm94YCB3aGVuIGBub3RGb3VuZENvbnRlbnRgIGlzIGVtcHR5XG4gIHZhciBlbXB0eUxpc3RDb250ZW50ID0gIW5vdEZvdW5kQ29udGVudCAmJiBlbXB0eU9wdGlvbnM7XG4gIGlmIChkaXNhYmxlZCB8fCBlbXB0eUxpc3RDb250ZW50ICYmIG1lcmdlZE9wZW4gJiYgbW9kZSA9PT0gJ2NvbWJvYm94Jykge1xuICAgIG1lcmdlZE9wZW4gPSBmYWxzZTtcbiAgfVxuICB2YXIgdHJpZ2dlck9wZW4gPSBlbXB0eUxpc3RDb250ZW50ID8gZmFsc2UgOiBtZXJnZWRPcGVuO1xuICB2YXIgb25Ub2dnbGVPcGVuID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKG5ld09wZW4pIHtcbiAgICB2YXIgbmV4dE9wZW4gPSBuZXdPcGVuICE9PSB1bmRlZmluZWQgPyBuZXdPcGVuIDogIW1lcmdlZE9wZW47XG4gICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgc2V0SW5uZXJPcGVuKG5leHRPcGVuKTtcbiAgICAgIGlmIChtZXJnZWRPcGVuICE9PSBuZXh0T3Blbikge1xuICAgICAgICBvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZSA9PT0gbnVsbCB8fCBvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25Ecm9wZG93blZpc2libGVDaGFuZ2UobmV4dE9wZW4pO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW2Rpc2FibGVkLCBtZXJnZWRPcGVuLCBzZXRJbm5lck9wZW4sIG9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2VhcmNoID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciB0b2tlbldpdGhFbnRlciA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAodG9rZW5TZXBhcmF0b3JzIHx8IFtdKS5zb21lKGZ1bmN0aW9uICh0b2tlblNlcGFyYXRvcikge1xuICAgICAgcmV0dXJuIFsnXFxuJywgJ1xcclxcbiddLmluY2x1ZGVzKHRva2VuU2VwYXJhdG9yKTtcbiAgICB9KTtcbiAgfSwgW3Rva2VuU2VwYXJhdG9yc10pO1xuICB2YXIgb25JbnRlcm5hbFNlYXJjaCA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxTZWFyY2goc2VhcmNoVGV4dCwgZnJvbVR5cGluZywgaXNDb21wb3NpdGluZykge1xuICAgIHZhciByZXQgPSB0cnVlO1xuICAgIHZhciBuZXdTZWFyY2hUZXh0ID0gc2VhcmNoVGV4dDtcbiAgICBvbkFjdGl2ZVZhbHVlQ2hhbmdlID09PSBudWxsIHx8IG9uQWN0aXZlVmFsdWVDaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQWN0aXZlVmFsdWVDaGFuZ2UobnVsbCk7XG5cbiAgICAvLyBDaGVjayBpZiBtYXRjaCB0aGUgYHRva2VuU2VwYXJhdG9yc2BcbiAgICB2YXIgcGF0Y2hMYWJlbHMgPSBpc0NvbXBvc2l0aW5nID8gbnVsbCA6IGdldFNlcGFyYXRlZENvbnRlbnQoc2VhcmNoVGV4dCwgdG9rZW5TZXBhcmF0b3JzKTtcblxuICAgIC8vIElnbm9yZSBjb21ib2JveCBzaW5jZSBpdCdzIG5vdCBzcGxpdC1hYmxlXG4gICAgaWYgKG1vZGUgIT09ICdjb21ib2JveCcgJiYgcGF0Y2hMYWJlbHMpIHtcbiAgICAgIG5ld1NlYXJjaFRleHQgPSAnJztcbiAgICAgIG9uU2VhcmNoU3BsaXQgPT09IG51bGwgfHwgb25TZWFyY2hTcGxpdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25TZWFyY2hTcGxpdChwYXRjaExhYmVscyk7XG5cbiAgICAgIC8vIFNob3VsZCBjbG9zZSB3aGVuIHBhc3RlIGZpbmlzaFxuICAgICAgb25Ub2dnbGVPcGVuKGZhbHNlKTtcblxuICAgICAgLy8gVGVsbCBTZWxlY3RvciB0aGF0IGJyZWFrIG5leHQgYWN0aW9uc1xuICAgICAgcmV0ID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChvblNlYXJjaCAmJiBtZXJnZWRTZWFyY2hWYWx1ZSAhPT0gbmV3U2VhcmNoVGV4dCkge1xuICAgICAgb25TZWFyY2gobmV3U2VhcmNoVGV4dCwge1xuICAgICAgICBzb3VyY2U6IGZyb21UeXBpbmcgPyAndHlwaW5nJyA6ICdlZmZlY3QnXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfTtcblxuICAvLyBPbmx5IHRyaWdnZXJlZCB3aGVuIG1lbnUgaXMgY2xvc2VkICYgbW9kZSBpcyB0YWdzXG4gIC8vIElmIG1lbnUgaXMgb3BlbiwgT3B0aW9uTGlzdCB3aWxsIHRha2UgY2hhcmdlXG4gIC8vIElmIG1vZGUgaXNuJ3QgdGFncywgcHJlc3MgZW50ZXIgaXMgbm90IG1lYW5pbmdmdWwgd2hlbiB5b3UgY2FuJ3Qgc2VlIGFueSBvcHRpb25cbiAgdmFyIG9uSW50ZXJuYWxTZWFyY2hTdWJtaXQgPSBmdW5jdGlvbiBvbkludGVybmFsU2VhcmNoU3VibWl0KHNlYXJjaFRleHQpIHtcbiAgICAvLyBwcmV2ZW50IGVtcHR5IHRhZ3MgZnJvbSBhcHBlYXJpbmcgd2hlbiB5b3UgY2xpY2sgdGhlIEVudGVyIGJ1dHRvblxuICAgIGlmICghc2VhcmNoVGV4dCB8fCAhc2VhcmNoVGV4dC50cmltKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgb25TZWFyY2goc2VhcmNoVGV4dCwge1xuICAgICAgc291cmNlOiAnc3VibWl0J1xuICAgIH0pO1xuICB9O1xuXG4gIC8vIENsb3NlIHdpbGwgY2xlYW4gdXAgc2luZ2xlIG1vZGUgc2VhcmNoIHRleHRcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIW1lcmdlZE9wZW4gJiYgIW11bHRpcGxlICYmIG1vZGUgIT09ICdjb21ib2JveCcpIHtcbiAgICAgIG9uSW50ZXJuYWxTZWFyY2goJycsIGZhbHNlLCBmYWxzZSk7XG4gICAgfVxuICB9LCBbbWVyZ2VkT3Blbl0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRGlzYWJsZWQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDbG9zZSBkcm9wZG93biAmIHJlbW92ZSBmb2N1cyBzdGF0ZSB3aGVuIGRpc2FibGVkIGNoYW5nZVxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChpbm5lck9wZW4gJiYgZGlzYWJsZWQpIHtcbiAgICAgIHNldElubmVyT3BlbihmYWxzZSk7XG4gICAgfVxuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgc2V0TW9ja0ZvY3VzZWQoZmFsc2UpO1xuICAgIH1cbiAgfSwgW2Rpc2FibGVkXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBLZXlib2FyZCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8qKlxuICAgKiBXZSByZWNvcmQgaW5wdXQgdmFsdWUgaGVyZSB0byBjaGVjayBpZiBjYW4gcHJlc3MgdG8gY2xlYW4gdXAgYnkgYmFja3NwYWNlXG4gICAqIC0gbnVsbDogS2V5IGlzIG5vdCBkb3duLCB0aGlzIGlzIHJlc2V0IGJ5IGtleSB1cFxuICAgKiAtIHRydWU6IFNlYXJjaCB0ZXh0IGlzIGVtcHR5IHdoZW4gZmlyc3QgdGltZSBiYWNrc3BhY2UgZG93blxuICAgKiAtIGZhbHNlOiBTZWFyY2ggdGV4dCBpcyBub3QgZW1wdHkgd2hlbiBmaXJzdCB0aW1lIGJhY2tzcGFjZSBkb3duXG4gICAqL1xuICB2YXIgX3VzZUxvY2sgPSB1c2VMb2NrKCksXG4gICAgX3VzZUxvY2syID0gX3NsaWNlZFRvQXJyYXkoX3VzZUxvY2ssIDIpLFxuICAgIGdldENsZWFyTG9jayA9IF91c2VMb2NrMlswXSxcbiAgICBzZXRDbGVhckxvY2sgPSBfdXNlTG9jazJbMV07XG5cbiAgLy8gS2V5RG93blxuICB2YXIgb25JbnRlcm5hbEtleURvd24gPSBmdW5jdGlvbiBvbkludGVybmFsS2V5RG93bihldmVudCkge1xuICAgIHZhciBjbGVhckxvY2sgPSBnZXRDbGVhckxvY2soKTtcbiAgICB2YXIgd2hpY2ggPSBldmVudC53aGljaDtcbiAgICBpZiAod2hpY2ggPT09IEtleUNvZGUuRU5URVIpIHtcbiAgICAgIC8vIERvIG5vdCBzdWJtaXQgZm9ybSB3aGVuIHR5cGUgaW4gdGhlIGlucHV0XG4gICAgICBpZiAobW9kZSAhPT0gJ2NvbWJvYm94Jykge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSBvbmx5IG1hbmFnZSBvcGVuIHN0YXRlIGhlcmUsIGNsb3NlIGxvZ2ljIHNob3VsZCBoYW5kbGUgYnkgbGlzdCBjb21wb25lbnRcbiAgICAgIGlmICghbWVyZ2VkT3Blbikge1xuICAgICAgICBvblRvZ2dsZU9wZW4odHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHNldENsZWFyTG9jayghIW1lcmdlZFNlYXJjaFZhbHVlKTtcblxuICAgIC8vIFJlbW92ZSB2YWx1ZSBieSBgYmFja3NwYWNlYFxuICAgIGlmICh3aGljaCA9PT0gS2V5Q29kZS5CQUNLU1BBQ0UgJiYgIWNsZWFyTG9jayAmJiBtdWx0aXBsZSAmJiAhbWVyZ2VkU2VhcmNoVmFsdWUgJiYgZGlzcGxheVZhbHVlcy5sZW5ndGgpIHtcbiAgICAgIHZhciBjbG9uZURpc3BsYXlWYWx1ZXMgPSBfdG9Db25zdW1hYmxlQXJyYXkoZGlzcGxheVZhbHVlcyk7XG4gICAgICB2YXIgcmVtb3ZlZERpc3BsYXlWYWx1ZSA9IG51bGw7XG4gICAgICBmb3IgKHZhciBpID0gY2xvbmVEaXNwbGF5VmFsdWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgICAgIHZhciBjdXJyZW50ID0gY2xvbmVEaXNwbGF5VmFsdWVzW2ldO1xuICAgICAgICBpZiAoIWN1cnJlbnQuZGlzYWJsZWQpIHtcbiAgICAgICAgICBjbG9uZURpc3BsYXlWYWx1ZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIHJlbW92ZWREaXNwbGF5VmFsdWUgPSBjdXJyZW50O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocmVtb3ZlZERpc3BsYXlWYWx1ZSkge1xuICAgICAgICBvbkRpc3BsYXlWYWx1ZXNDaGFuZ2UoY2xvbmVEaXNwbGF5VmFsdWVzLCB7XG4gICAgICAgICAgdHlwZTogJ3JlbW92ZScsXG4gICAgICAgICAgdmFsdWVzOiBbcmVtb3ZlZERpc3BsYXlWYWx1ZV1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCByZXN0ID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIHJlc3RbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cbiAgICBpZiAobWVyZ2VkT3BlbiAmJiBsaXN0UmVmLmN1cnJlbnQpIHtcbiAgICAgIHZhciBfbGlzdFJlZiRjdXJyZW50MjtcbiAgICAgIChfbGlzdFJlZiRjdXJyZW50MiA9IGxpc3RSZWYuY3VycmVudCkub25LZXlEb3duLmFwcGx5KF9saXN0UmVmJGN1cnJlbnQyLCBbZXZlbnRdLmNvbmNhdChyZXN0KSk7XG4gICAgfVxuICAgIG9uS2V5RG93biA9PT0gbnVsbCB8fCBvbktleURvd24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uS2V5RG93bi5hcHBseSh2b2lkIDAsIFtldmVudF0uY29uY2F0KHJlc3QpKTtcbiAgfTtcblxuICAvLyBLZXlVcFxuICB2YXIgb25JbnRlcm5hbEtleVVwID0gZnVuY3Rpb24gb25JbnRlcm5hbEtleVVwKGV2ZW50KSB7XG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCByZXN0ID0gbmV3IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIHJlc3RbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgfVxuICAgIGlmIChtZXJnZWRPcGVuICYmIGxpc3RSZWYuY3VycmVudCkge1xuICAgICAgdmFyIF9saXN0UmVmJGN1cnJlbnQzO1xuICAgICAgKF9saXN0UmVmJGN1cnJlbnQzID0gbGlzdFJlZi5jdXJyZW50KS5vbktleVVwLmFwcGx5KF9saXN0UmVmJGN1cnJlbnQzLCBbZXZlbnRdLmNvbmNhdChyZXN0KSk7XG4gICAgfVxuICAgIG9uS2V5VXAgPT09IG51bGwgfHwgb25LZXlVcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25LZXlVcC5hcHBseSh2b2lkIDAsIFtldmVudF0uY29uY2F0KHJlc3QpKTtcbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNlbGVjdG9yID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG9uU2VsZWN0b3JSZW1vdmUgPSBmdW5jdGlvbiBvblNlbGVjdG9yUmVtb3ZlKHZhbCkge1xuICAgIHZhciBuZXdWYWx1ZXMgPSBkaXNwbGF5VmFsdWVzLmZpbHRlcihmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIGkgIT09IHZhbDtcbiAgICB9KTtcbiAgICBvbkRpc3BsYXlWYWx1ZXNDaGFuZ2UobmV3VmFsdWVzLCB7XG4gICAgICB0eXBlOiAncmVtb3ZlJyxcbiAgICAgIHZhbHVlczogW3ZhbF1cbiAgICB9KTtcbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBGb2N1cyAvIEJsdXIgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqIFJlY29yZCByZWFsIGZvY3VzIHN0YXR1cyAqL1xuICB2YXIgZm9jdXNSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICB2YXIgb25Db250YWluZXJGb2N1cyA9IGZ1bmN0aW9uIG9uQ29udGFpbmVyRm9jdXMoKSB7XG4gICAgc2V0TW9ja0ZvY3VzZWQodHJ1ZSk7XG4gICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgaWYgKG9uRm9jdXMgJiYgIWZvY3VzUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgb25Gb2N1cy5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIC8vIGBzaG93QWN0aW9uYCBzaG91bGQgaGFuZGxlIGBmb2N1c2AgaWYgc2V0XG4gICAgICBpZiAoc2hvd0FjdGlvbi5pbmNsdWRlcygnZm9jdXMnKSkge1xuICAgICAgICBvblRvZ2dsZU9wZW4odHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvY3VzUmVmLmN1cnJlbnQgPSB0cnVlO1xuICB9O1xuICB2YXIgb25Db250YWluZXJCbHVyID0gZnVuY3Rpb24gb25Db250YWluZXJCbHVyKCkge1xuICAgIHNldE1vY2tGb2N1c2VkKGZhbHNlLCBmdW5jdGlvbiAoKSB7XG4gICAgICBmb2N1c1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICBvblRvZ2dsZU9wZW4oZmFsc2UpO1xuICAgIH0pO1xuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobWVyZ2VkU2VhcmNoVmFsdWUpIHtcbiAgICAgIC8vIGB0YWdzYCBtb2RlIHNob3VsZCBtb3ZlIGBzZWFyY2hWYWx1ZWAgaW50byB2YWx1ZXNcbiAgICAgIGlmIChtb2RlID09PSAndGFncycpIHtcbiAgICAgICAgb25TZWFyY2gobWVyZ2VkU2VhcmNoVmFsdWUsIHtcbiAgICAgICAgICBzb3VyY2U6ICdzdWJtaXQnXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAnbXVsdGlwbGUnKSB7XG4gICAgICAgIC8vIGBtdWx0aXBsZWAgbW9kZSBvbmx5IGNsZWFuIHRoZSBzZWFyY2ggdmFsdWUgYnV0IG5vdCB0cmlnZ2VyIGV2ZW50XG4gICAgICAgIG9uU2VhcmNoKCcnLCB7XG4gICAgICAgICAgc291cmNlOiAnYmx1cidcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvbkJsdXIpIHtcbiAgICAgIG9uQmx1ci5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9O1xuXG4gIC8vIEdpdmUgZm9jdXMgYmFjayBvZiBTZWxlY3RcbiAgdmFyIGFjdGl2ZVRpbWVvdXRJZHMgPSBbXTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgYWN0aXZlVGltZW91dElkcy5mb3JFYWNoKGZ1bmN0aW9uICh0aW1lb3V0SWQpIHtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgfSk7XG4gICAgICBhY3RpdmVUaW1lb3V0SWRzLnNwbGljZSgwLCBhY3RpdmVUaW1lb3V0SWRzLmxlbmd0aCk7XG4gICAgfTtcbiAgfSwgW10pO1xuICB2YXIgb25JbnRlcm5hbE1vdXNlRG93biA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxNb3VzZURvd24oZXZlbnQpIHtcbiAgICB2YXIgX3RyaWdnZXJSZWYkY3VycmVudDtcbiAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIHZhciBwb3B1cEVsZW1lbnQgPSAoX3RyaWdnZXJSZWYkY3VycmVudCA9IHRyaWdnZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX3RyaWdnZXJSZWYkY3VycmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RyaWdnZXJSZWYkY3VycmVudC5nZXRQb3B1cEVsZW1lbnQoKTtcblxuICAgIC8vIFdlIHNob3VsZCBnaXZlIGZvY3VzIGJhY2sgdG8gc2VsZWN0b3IgaWYgY2xpY2tlZCBpdGVtIGlzIG5vdCBmb2N1c2FibGVcbiAgICBpZiAocG9wdXBFbGVtZW50ICYmIHBvcHVwRWxlbWVudC5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICB2YXIgdGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGFjdGl2ZVRpbWVvdXRJZHMuaW5kZXhPZih0aW1lb3V0SWQpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgYWN0aXZlVGltZW91dElkcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICAgIGNhbmNlbFNldE1vY2tGb2N1c2VkKCk7XG4gICAgICAgIGlmICghbW9iaWxlICYmICFwb3B1cEVsZW1lbnQuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICB2YXIgX3NlbGVjdG9yUmVmJGN1cnJlbnQzO1xuICAgICAgICAgIChfc2VsZWN0b3JSZWYkY3VycmVudDMgPSBzZWxlY3RvclJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfc2VsZWN0b3JSZWYkY3VycmVudDMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9zZWxlY3RvclJlZiRjdXJyZW50My5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGFjdGl2ZVRpbWVvdXRJZHMucHVzaCh0aW1lb3V0SWQpO1xuICAgIH1cbiAgICBmb3IgKHZhciBfbGVuMyA9IGFyZ3VtZW50cy5sZW5ndGgsIHJlc3RBcmdzID0gbmV3IEFycmF5KF9sZW4zID4gMSA/IF9sZW4zIC0gMSA6IDApLCBfa2V5MyA9IDE7IF9rZXkzIDwgX2xlbjM7IF9rZXkzKyspIHtcbiAgICAgIHJlc3RBcmdzW19rZXkzIC0gMV0gPSBhcmd1bWVudHNbX2tleTNdO1xuICAgIH1cbiAgICBvbk1vdXNlRG93biA9PT0gbnVsbCB8fCBvbk1vdXNlRG93biA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25Nb3VzZURvd24uYXBwbHkodm9pZCAwLCBbZXZlbnRdLmNvbmNhdChyZXN0QXJncykpO1xuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRHJvcGRvd24gPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKG51bGwpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUzLCAyKSxcbiAgICBjb250YWluZXJXaWR0aCA9IF9SZWFjdCR1c2VTdGF0ZTRbMF0sXG4gICAgc2V0Q29udGFpbmVyV2lkdGggPSBfUmVhY3QkdXNlU3RhdGU0WzFdO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlNSA9IFJlYWN0LnVzZVN0YXRlKHt9KSxcbiAgICBfUmVhY3QkdXNlU3RhdGU2ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlNSwgMiksXG4gICAgZm9yY2VVcGRhdGUgPSBfUmVhY3QkdXNlU3RhdGU2WzFdO1xuICAvLyBXZSBuZWVkIGZvcmNlIHVwZGF0ZSBoZXJlIHNpbmNlIHBvcHVwIGRvbSBpcyByZW5kZXIgYXN5bmNcbiAgZnVuY3Rpb24gb25Qb3B1cE1vdXNlRW50ZXIoKSB7XG4gICAgZm9yY2VVcGRhdGUoe30pO1xuICB9XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRyaWdnZXJPcGVuKSB7XG4gICAgICB2YXIgX2NvbnRhaW5lclJlZiRjdXJyZW50O1xuICAgICAgdmFyIG5ld1dpZHRoID0gTWF0aC5jZWlsKChfY29udGFpbmVyUmVmJGN1cnJlbnQgPSBjb250YWluZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2NvbnRhaW5lclJlZiRjdXJyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY29udGFpbmVyUmVmJGN1cnJlbnQub2Zmc2V0V2lkdGgpO1xuICAgICAgaWYgKGNvbnRhaW5lcldpZHRoICE9PSBuZXdXaWR0aCAmJiAhTnVtYmVyLmlzTmFOKG5ld1dpZHRoKSkge1xuICAgICAgICBzZXRDb250YWluZXJXaWR0aChuZXdXaWR0aCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBbdHJpZ2dlck9wZW5dKTtcblxuICAvLyBVc2VkIGZvciByYXcgY3VzdG9tIGlucHV0IHRyaWdnZXJcbiAgdmFyIG9uVHJpZ2dlclZpc2libGVDaGFuZ2U7XG4gIGlmIChjdXN0b21pemVSYXdJbnB1dEVsZW1lbnQpIHtcbiAgICBvblRyaWdnZXJWaXNpYmxlQ2hhbmdlID0gZnVuY3Rpb24gb25UcmlnZ2VyVmlzaWJsZUNoYW5nZShuZXdPcGVuKSB7XG4gICAgICBvblRvZ2dsZU9wZW4obmV3T3Blbik7XG4gICAgfTtcbiAgfVxuXG4gIC8vIENsb3NlIHdoZW4gY2xpY2sgb24gbm9uLXNlbGVjdCBlbGVtZW50XG4gIHVzZVNlbGVjdFRyaWdnZXJDb250cm9sKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3RyaWdnZXJSZWYkY3VycmVudDI7XG4gICAgcmV0dXJuIFtjb250YWluZXJSZWYuY3VycmVudCwgKF90cmlnZ2VyUmVmJGN1cnJlbnQyID0gdHJpZ2dlclJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfdHJpZ2dlclJlZiRjdXJyZW50MiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RyaWdnZXJSZWYkY3VycmVudDIuZ2V0UG9wdXBFbGVtZW50KCldO1xuICB9LCB0cmlnZ2VyT3Blbiwgb25Ub2dnbGVPcGVuLCAhIWN1c3RvbWl6ZVJhd0lucHV0RWxlbWVudCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDb250ZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBiYXNlU2VsZWN0Q29udGV4dCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICAgIG5vdEZvdW5kQ29udGVudDogbm90Rm91bmRDb250ZW50LFxuICAgICAgb3BlbjogbWVyZ2VkT3BlbixcbiAgICAgIHRyaWdnZXJPcGVuOiB0cmlnZ2VyT3BlbixcbiAgICAgIGlkOiBpZCxcbiAgICAgIHNob3dTZWFyY2g6IG1lcmdlZFNob3dTZWFyY2gsXG4gICAgICBtdWx0aXBsZTogbXVsdGlwbGUsXG4gICAgICB0b2dnbGVPcGVuOiBvblRvZ2dsZU9wZW5cbiAgICB9KTtcbiAgfSwgW3Byb3BzLCBub3RGb3VuZENvbnRlbnQsIHRyaWdnZXJPcGVuLCBtZXJnZWRPcGVuLCBpZCwgbWVyZ2VkU2hvd1NlYXJjaCwgbXVsdGlwbGUsIG9uVG9nZ2xlT3Blbl0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyA9PSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQXJyb3cgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtZXJnZWRTaG93QXJyb3cgPSBzaG93QXJyb3cgIT09IHVuZGVmaW5lZCA/IHNob3dBcnJvdyA6IGxvYWRpbmcgfHwgIW11bHRpcGxlICYmIG1vZGUgIT09ICdjb21ib2JveCc7XG4gIHZhciBhcnJvd05vZGU7XG4gIGlmIChtZXJnZWRTaG93QXJyb3cpIHtcbiAgICBhcnJvd05vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmFuc0J0biwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYXJyb3dcIiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hcnJvdy1sb2FkaW5nXCIpLCBsb2FkaW5nKSksXG4gICAgICBjdXN0b21pemVJY29uOiBpbnB1dEljb24sXG4gICAgICBjdXN0b21pemVJY29uUHJvcHM6IHtcbiAgICAgICAgbG9hZGluZzogbG9hZGluZyxcbiAgICAgICAgc2VhcmNoVmFsdWU6IG1lcmdlZFNlYXJjaFZhbHVlLFxuICAgICAgICBvcGVuOiBtZXJnZWRPcGVuLFxuICAgICAgICBmb2N1c2VkOiBtb2NrRm9jdXNlZCxcbiAgICAgICAgc2hvd1NlYXJjaDogbWVyZ2VkU2hvd1NlYXJjaFxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ2xlYXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBjbGVhck5vZGU7XG4gIHZhciBvbkNsZWFyTW91c2VEb3duID0gZnVuY3Rpb24gb25DbGVhck1vdXNlRG93bigpIHtcbiAgICB2YXIgX3NlbGVjdG9yUmVmJGN1cnJlbnQ0O1xuICAgIG9uQ2xlYXIgPT09IG51bGwgfHwgb25DbGVhciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DbGVhcigpO1xuICAgIChfc2VsZWN0b3JSZWYkY3VycmVudDQgPSBzZWxlY3RvclJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfc2VsZWN0b3JSZWYkY3VycmVudDQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9zZWxlY3RvclJlZiRjdXJyZW50NC5mb2N1cygpO1xuICAgIG9uRGlzcGxheVZhbHVlc0NoYW5nZShbXSwge1xuICAgICAgdHlwZTogJ2NsZWFyJyxcbiAgICAgIHZhbHVlczogZGlzcGxheVZhbHVlc1xuICAgIH0pO1xuICAgIG9uSW50ZXJuYWxTZWFyY2goJycsIGZhbHNlLCBmYWxzZSk7XG4gIH07XG4gIGlmICghZGlzYWJsZWQgJiYgYWxsb3dDbGVhciAmJiAoZGlzcGxheVZhbHVlcy5sZW5ndGggfHwgbWVyZ2VkU2VhcmNoVmFsdWUpICYmICEobW9kZSA9PT0gJ2NvbWJvYm94JyAmJiBtZXJnZWRTZWFyY2hWYWx1ZSA9PT0gJycpKSB7XG4gICAgY2xlYXJOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVHJhbnNCdG4sIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jbGVhclwiKSxcbiAgICAgIG9uTW91c2VEb3duOiBvbkNsZWFyTW91c2VEb3duLFxuICAgICAgY3VzdG9taXplSWNvbjogY2xlYXJJY29uXG4gICAgfSwgXCJcXHhEN1wiKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBPcHRpb25MaXN0ID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb3B0aW9uTGlzdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE9wdGlvbkxpc3QsIHtcbiAgICByZWY6IGxpc3RSZWZcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2VsZWN0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtZXJnZWRDbGFzc05hbWUgPSBjbGFzc05hbWVzKHByZWZpeENscywgY2xhc3NOYW1lLCAoX2NsYXNzTmFtZXMyID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZm9jdXNlZFwiKSwgbW9ja0ZvY3VzZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW11bHRpcGxlXCIpLCBtdWx0aXBsZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2luZ2xlXCIpLCAhbXVsdGlwbGUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFsbG93LWNsZWFyXCIpLCBhbGxvd0NsZWFyKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zaG93LWFycm93XCIpLCBtZXJnZWRTaG93QXJyb3cpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRpc2FibGVkXCIpLCBkaXNhYmxlZCksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbG9hZGluZ1wiKSwgbG9hZGluZyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItb3BlblwiKSwgbWVyZ2VkT3BlbiksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY3VzdG9taXplLWlucHV0XCIpLCBjdXN0b21pemVJbnB1dEVsZW1lbnQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNob3ctc2VhcmNoXCIpLCBtZXJnZWRTaG93U2VhcmNoKSwgX2NsYXNzTmFtZXMyKSk7XG5cbiAgLy8gPj4+IFNlbGVjdG9yXG4gIHZhciBzZWxlY3Rvck5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTZWxlY3RUcmlnZ2VyLCB7XG4gICAgcmVmOiB0cmlnZ2VyUmVmLFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICB2aXNpYmxlOiB0cmlnZ2VyT3BlbixcbiAgICBwb3B1cEVsZW1lbnQ6IG9wdGlvbkxpc3QsXG4gICAgY29udGFpbmVyV2lkdGg6IGNvbnRhaW5lcldpZHRoLFxuICAgIGFuaW1hdGlvbjogYW5pbWF0aW9uLFxuICAgIHRyYW5zaXRpb25OYW1lOiB0cmFuc2l0aW9uTmFtZSxcbiAgICBkcm9wZG93blN0eWxlOiBkcm9wZG93blN0eWxlLFxuICAgIGRyb3Bkb3duQ2xhc3NOYW1lOiBkcm9wZG93bkNsYXNzTmFtZSxcbiAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGg6IGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCxcbiAgICBkcm9wZG93blJlbmRlcjogZHJvcGRvd25SZW5kZXIsXG4gICAgZHJvcGRvd25BbGlnbjogZHJvcGRvd25BbGlnbixcbiAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXIsXG4gICAgZW1wdHk6IGVtcHR5T3B0aW9ucyxcbiAgICBnZXRUcmlnZ2VyRE9NTm9kZTogZnVuY3Rpb24gZ2V0VHJpZ2dlckRPTU5vZGUoKSB7XG4gICAgICByZXR1cm4gc2VsZWN0b3JEb21SZWYuY3VycmVudDtcbiAgICB9LFxuICAgIG9uUG9wdXBWaXNpYmxlQ2hhbmdlOiBvblRyaWdnZXJWaXNpYmxlQ2hhbmdlLFxuICAgIG9uUG9wdXBNb3VzZUVudGVyOiBvblBvcHVwTW91c2VFbnRlclxuICB9LCBjdXN0b21pemVSYXdJbnB1dEVsZW1lbnQgPyAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGN1c3RvbWl6ZVJhd0lucHV0RWxlbWVudCwge1xuICAgIHJlZjogY3VzdG9taXplUmF3SW5wdXRSZWZcbiAgfSkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTZWxlY3RvciwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgZG9tUmVmOiBzZWxlY3RvckRvbVJlZixcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBpbnB1dEVsZW1lbnQ6IGN1c3RvbWl6ZUlucHV0RWxlbWVudCxcbiAgICByZWY6IHNlbGVjdG9yUmVmLFxuICAgIGlkOiBpZCxcbiAgICBzaG93U2VhcmNoOiBtZXJnZWRTaG93U2VhcmNoLFxuICAgIGF1dG9DbGVhclNlYXJjaFZhbHVlOiBhdXRvQ2xlYXJTZWFyY2hWYWx1ZSxcbiAgICBtb2RlOiBtb2RlLFxuICAgIGFjdGl2ZURlc2NlbmRhbnRJZDogYWN0aXZlRGVzY2VuZGFudElkLFxuICAgIHRhZ1JlbmRlcjogdGFnUmVuZGVyLFxuICAgIHZhbHVlczogZGlzcGxheVZhbHVlcyxcbiAgICBvcGVuOiBtZXJnZWRPcGVuLFxuICAgIG9uVG9nZ2xlT3Blbjogb25Ub2dnbGVPcGVuLFxuICAgIGFjdGl2ZVZhbHVlOiBhY3RpdmVWYWx1ZSxcbiAgICBzZWFyY2hWYWx1ZTogbWVyZ2VkU2VhcmNoVmFsdWUsXG4gICAgb25TZWFyY2g6IG9uSW50ZXJuYWxTZWFyY2gsXG4gICAgb25TZWFyY2hTdWJtaXQ6IG9uSW50ZXJuYWxTZWFyY2hTdWJtaXQsXG4gICAgb25SZW1vdmU6IG9uU2VsZWN0b3JSZW1vdmUsXG4gICAgdG9rZW5XaXRoRW50ZXI6IHRva2VuV2l0aEVudGVyXG4gIH0pKSk7XG5cbiAgLy8gPj4+IFJlbmRlclxuICB2YXIgcmVuZGVyTm9kZTtcblxuICAvLyBSZW5kZXIgcmF3XG4gIGlmIChjdXN0b21pemVSYXdJbnB1dEVsZW1lbnQpIHtcbiAgICByZW5kZXJOb2RlID0gc2VsZWN0b3JOb2RlO1xuICB9IGVsc2Uge1xuICAgIHJlbmRlck5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgICBjbGFzc05hbWU6IG1lcmdlZENsYXNzTmFtZVxuICAgIH0sIGRvbVByb3BzLCB7XG4gICAgICByZWY6IGNvbnRhaW5lclJlZixcbiAgICAgIG9uTW91c2VEb3duOiBvbkludGVybmFsTW91c2VEb3duLFxuICAgICAgb25LZXlEb3duOiBvbkludGVybmFsS2V5RG93bixcbiAgICAgIG9uS2V5VXA6IG9uSW50ZXJuYWxLZXlVcCxcbiAgICAgIG9uRm9jdXM6IG9uQ29udGFpbmVyRm9jdXMsXG4gICAgICBvbkJsdXI6IG9uQ29udGFpbmVyQmx1clxuICAgIH0pLCBtb2NrRm9jdXNlZCAmJiAhbWVyZ2VkT3BlbiAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgICAgb3BhY2l0eTogMFxuICAgICAgfSxcbiAgICAgIFwiYXJpYS1saXZlXCI6IFwicG9saXRlXCJcbiAgICB9LCBcIlwiLmNvbmNhdChkaXNwbGF5VmFsdWVzLm1hcChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIGxhYmVsID0gX3JlZi5sYWJlbCxcbiAgICAgICAgdmFsdWUgPSBfcmVmLnZhbHVlO1xuICAgICAgcmV0dXJuIFsnbnVtYmVyJywgJ3N0cmluZyddLmluY2x1ZGVzKF90eXBlb2YobGFiZWwpKSA/IGxhYmVsIDogdmFsdWU7XG4gICAgfSkuam9pbignLCAnKSkpLCBzZWxlY3Rvck5vZGUsIGFycm93Tm9kZSwgY2xlYXJOb2RlKTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQmFzZVNlbGVjdENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogYmFzZVNlbGVjdENvbnRleHRcbiAgfSwgcmVuZGVyTm9kZSk7XG59KTtcblxuLy8gU2V0IGRpc3BsYXkgbmFtZSBmb3IgZGV2XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBCYXNlU2VsZWN0LmRpc3BsYXlOYW1lID0gJ0Jhc2VTZWxlY3QnO1xufVxuZXhwb3J0IGRlZmF1bHQgQmFzZVNlbGVjdDsiLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuLyoqXG4gKiBDYWNoZSBgdmFsdWVgIHJlbGF0ZWQgTGFiZWxlZFZhbHVlICYgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIChsYWJlbGVkVmFsdWVzLCB2YWx1ZU9wdGlvbnMpIHtcbiAgdmFyIGNhY2hlUmVmID0gUmVhY3QudXNlUmVmKHtcbiAgICB2YWx1ZXM6IG5ldyBNYXAoKSxcbiAgICBvcHRpb25zOiBuZXcgTWFwKClcbiAgfSk7XG4gIHZhciBmaWxsZWRMYWJlbGVkVmFsdWVzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9jYWNoZVJlZiRjdXJyZW50ID0gY2FjaGVSZWYuY3VycmVudCxcbiAgICAgIHByZXZWYWx1ZUNhY2hlID0gX2NhY2hlUmVmJGN1cnJlbnQudmFsdWVzLFxuICAgICAgcHJldk9wdGlvbkNhY2hlID0gX2NhY2hlUmVmJGN1cnJlbnQub3B0aW9ucztcblxuICAgIC8vIEZpbGwgbGFiZWwgYnkgY2FjaGVcbiAgICB2YXIgcGF0Y2hlZFZhbHVlcyA9IGxhYmVsZWRWYWx1ZXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBfcHJldlZhbHVlQ2FjaGUkZ2V0O1xuICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBpdGVtKSwge30sIHtcbiAgICAgICAgICBsYWJlbDogKF9wcmV2VmFsdWVDYWNoZSRnZXQgPSBwcmV2VmFsdWVDYWNoZS5nZXQoaXRlbS52YWx1ZSkpID09PSBudWxsIHx8IF9wcmV2VmFsdWVDYWNoZSRnZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9wcmV2VmFsdWVDYWNoZSRnZXQubGFiZWxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9KTtcblxuICAgIC8vIFJlZnJlc2ggY2FjaGVcbiAgICB2YXIgdmFsdWVDYWNoZSA9IG5ldyBNYXAoKTtcbiAgICB2YXIgb3B0aW9uQ2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgcGF0Y2hlZFZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YWx1ZUNhY2hlLnNldChpdGVtLnZhbHVlLCBpdGVtKTtcbiAgICAgIG9wdGlvbkNhY2hlLnNldChpdGVtLnZhbHVlLCB2YWx1ZU9wdGlvbnMuZ2V0KGl0ZW0udmFsdWUpIHx8IHByZXZPcHRpb25DYWNoZS5nZXQoaXRlbS52YWx1ZSkpO1xuICAgIH0pO1xuICAgIGNhY2hlUmVmLmN1cnJlbnQudmFsdWVzID0gdmFsdWVDYWNoZTtcbiAgICBjYWNoZVJlZi5jdXJyZW50Lm9wdGlvbnMgPSBvcHRpb25DYWNoZTtcbiAgICByZXR1cm4gcGF0Y2hlZFZhbHVlcztcbiAgfSwgW2xhYmVsZWRWYWx1ZXMsIHZhbHVlT3B0aW9uc10pO1xuICB2YXIgZ2V0T3B0aW9uID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiB2YWx1ZU9wdGlvbnMuZ2V0KHZhbCkgfHwgY2FjaGVSZWYuY3VycmVudC5vcHRpb25zLmdldCh2YWwpO1xuICB9LCBbdmFsdWVPcHRpb25zXSk7XG4gIHJldHVybiBbZmlsbGVkTGFiZWxlZFZhbHVlcywgZ2V0T3B0aW9uXTtcbn0pOyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdG9BcnJheSB9IGZyb20gXCIuLi91dGlscy9jb21tb25VdGlsXCI7XG5pbXBvcnQgeyBpbmplY3RQcm9wc1dpdGhPcHRpb24gfSBmcm9tIFwiLi4vdXRpbHMvdmFsdWVVdGlsXCI7XG5mdW5jdGlvbiBpbmNsdWRlcyh0ZXN0LCBzZWFyY2gpIHtcbiAgcmV0dXJuIHRvQXJyYXkodGVzdCkuam9pbignJykudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2gpO1xufVxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIChvcHRpb25zLCBmaWVsZE5hbWVzLCBzZWFyY2hWYWx1ZSwgZmlsdGVyT3B0aW9uLCBvcHRpb25GaWx0ZXJQcm9wKSB7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXNlYXJjaFZhbHVlIHx8IGZpbHRlck9wdGlvbiA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH1cbiAgICB2YXIgZmllbGRPcHRpb25zID0gZmllbGROYW1lcy5vcHRpb25zLFxuICAgICAgZmllbGRMYWJlbCA9IGZpZWxkTmFtZXMubGFiZWwsXG4gICAgICBmaWVsZFZhbHVlID0gZmllbGROYW1lcy52YWx1ZTtcbiAgICB2YXIgZmlsdGVyZWRPcHRpb25zID0gW107XG4gICAgdmFyIGN1c3RvbWl6ZUZpbHRlciA9IHR5cGVvZiBmaWx0ZXJPcHRpb24gPT09ICdmdW5jdGlvbic7XG4gICAgdmFyIHVwcGVyU2VhcmNoID0gc2VhcmNoVmFsdWUudG9VcHBlckNhc2UoKTtcbiAgICB2YXIgZmlsdGVyRnVuYyA9IGN1c3RvbWl6ZUZpbHRlciA/IGZpbHRlck9wdGlvbiA6IGZ1bmN0aW9uIChfLCBvcHRpb24pIHtcbiAgICAgIC8vIFVzZSBwcm92aWRlZCBgb3B0aW9uRmlsdGVyUHJvcGBcbiAgICAgIGlmIChvcHRpb25GaWx0ZXJQcm9wKSB7XG4gICAgICAgIHJldHVybiBpbmNsdWRlcyhvcHRpb25bb3B0aW9uRmlsdGVyUHJvcF0sIHVwcGVyU2VhcmNoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXV0byBzZWxlY3QgYGxhYmVsYCBvciBgdmFsdWVgIGJ5IG9wdGlvbiB0eXBlXG4gICAgICBpZiAob3B0aW9uW2ZpZWxkT3B0aW9uc10pIHtcbiAgICAgICAgLy8gaGFjayBgZmllbGRMYWJlbGAgc2luY2UgYE9wdGlvbkdyb3VwYCBjaGlsZHJlbiBpcyBub3QgYGxhYmVsYFxuICAgICAgICByZXR1cm4gaW5jbHVkZXMob3B0aW9uW2ZpZWxkTGFiZWwgIT09ICdjaGlsZHJlbicgPyBmaWVsZExhYmVsIDogJ2xhYmVsJ10sIHVwcGVyU2VhcmNoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpbmNsdWRlcyhvcHRpb25bZmllbGRWYWx1ZV0sIHVwcGVyU2VhcmNoKTtcbiAgICB9O1xuICAgIHZhciB3cmFwT3B0aW9uID0gY3VzdG9taXplRmlsdGVyID8gZnVuY3Rpb24gKG9wdCkge1xuICAgICAgcmV0dXJuIGluamVjdFByb3BzV2l0aE9wdGlvbihvcHQpO1xuICAgIH0gOiBmdW5jdGlvbiAob3B0KSB7XG4gICAgICByZXR1cm4gb3B0O1xuICAgIH07XG4gICAgb3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAvLyBHcm91cCBzaG91bGQgY2hlY2sgY2hpbGQgb3B0aW9uc1xuICAgICAgaWYgKGl0ZW1bZmllbGRPcHRpb25zXSkge1xuICAgICAgICAvLyBDaGVjayBncm91cCBmaXJzdFxuICAgICAgICB2YXIgbWF0Y2hHcm91cCA9IGZpbHRlckZ1bmMoc2VhcmNoVmFsdWUsIHdyYXBPcHRpb24oaXRlbSkpO1xuICAgICAgICBpZiAobWF0Y2hHcm91cCkge1xuICAgICAgICAgIGZpbHRlcmVkT3B0aW9ucy5wdXNoKGl0ZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIENoZWNrIG9wdGlvblxuICAgICAgICAgIHZhciBzdWJPcHRpb25zID0gaXRlbVtmaWVsZE9wdGlvbnNdLmZpbHRlcihmdW5jdGlvbiAoc3ViSXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbHRlckZ1bmMoc2VhcmNoVmFsdWUsIHdyYXBPcHRpb24oc3ViSXRlbSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChzdWJPcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgZmlsdGVyZWRPcHRpb25zLnB1c2goX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBpdGVtKSwge30sIF9kZWZpbmVQcm9wZXJ0eSh7fSwgZmllbGRPcHRpb25zLCBzdWJPcHRpb25zKSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZmlsdGVyRnVuYyhzZWFyY2hWYWx1ZSwgd3JhcE9wdGlvbihpdGVtKSkpIHtcbiAgICAgICAgZmlsdGVyZWRPcHRpb25zLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGZpbHRlcmVkT3B0aW9ucztcbiAgfSwgW29wdGlvbnMsIGZpbHRlck9wdGlvbiwgb3B0aW9uRmlsdGVyUHJvcCwgc2VhcmNoVmFsdWUsIGZpZWxkTmFtZXNdKTtcbn0pOyIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNhblVzZURvbSBmcm9tIFwicmMtdXRpbC9lcy9Eb20vY2FuVXNlRG9tXCI7XG52YXIgdXVpZCA9IDA7XG5cbi8qKiBJcyBjbGllbnQgc2lkZSBhbmQgbm90IGpzZG9tICovXG5leHBvcnQgdmFyIGlzQnJvd3NlckNsaWVudCA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAndGVzdCcgJiYgY2FuVXNlRG9tKCk7XG5cbi8qKiBHZXQgdW5pcXVlIGlkIGZvciBhY2Nlc3NpYmlsaXR5IHVzYWdlICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VVVJRCgpIHtcbiAgdmFyIHJldElkO1xuXG4gIC8vIFRlc3QgbmV2ZXIgcmVhY2hcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChpc0Jyb3dzZXJDbGllbnQpIHtcbiAgICByZXRJZCA9IHV1aWQ7XG4gICAgdXVpZCArPSAxO1xuICB9IGVsc2Uge1xuICAgIHJldElkID0gJ1RFU1RfT1JfU1NSJztcbiAgfVxuICByZXR1cm4gcmV0SWQ7XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VJZChpZCkge1xuICAvLyBJbm5lciBpZCBmb3IgYWNjZXNzaWJpbGl0eSB1c2FnZS4gT25seSB3b3JrIGluIGNsaWVudCBzaWRlXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSgpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIGlubmVySWQgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldElubmVySWQgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHNldElubmVySWQoXCJyY19zZWxlY3RfXCIuY29uY2F0KGdldFVVSUQoKSkpO1xuICB9LCBbXSk7XG4gIHJldHVybiBpZCB8fCBpbm5lcklkO1xufSIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcImNoaWxkcmVuXCIsIFwidmFsdWVcIl0sXG4gIF9leGNsdWRlZDIgPSBbXCJjaGlsZHJlblwiXTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0b0FycmF5IGZyb20gXCJyYy11dGlsL2VzL0NoaWxkcmVuL3RvQXJyYXlcIjtcbmZ1bmN0aW9uIGNvbnZlcnROb2RlVG9PcHRpb24obm9kZSkge1xuICB2YXIgX3JlZiA9IG5vZGUsXG4gICAga2V5ID0gX3JlZi5rZXksXG4gICAgX3JlZiRwcm9wcyA9IF9yZWYucHJvcHMsXG4gICAgY2hpbGRyZW4gPSBfcmVmJHByb3BzLmNoaWxkcmVuLFxuICAgIHZhbHVlID0gX3JlZiRwcm9wcy52YWx1ZSxcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiRwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe1xuICAgIGtleToga2V5LFxuICAgIHZhbHVlOiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBrZXksXG4gICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gIH0sIHJlc3RQcm9wcyk7XG59XG5leHBvcnQgZnVuY3Rpb24gY29udmVydENoaWxkcmVuVG9EYXRhKG5vZGVzKSB7XG4gIHZhciBvcHRpb25Pbmx5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgcmV0dXJuIHRvQXJyYXkobm9kZXMpLm1hcChmdW5jdGlvbiAobm9kZSwgaW5kZXgpIHtcbiAgICBpZiAoISAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQobm9kZSkgfHwgIW5vZGUudHlwZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBfcmVmMiA9IG5vZGUsXG4gICAgICBpc1NlbGVjdE9wdEdyb3VwID0gX3JlZjIudHlwZS5pc1NlbGVjdE9wdEdyb3VwLFxuICAgICAga2V5ID0gX3JlZjIua2V5LFxuICAgICAgX3JlZjIkcHJvcHMgPSBfcmVmMi5wcm9wcyxcbiAgICAgIGNoaWxkcmVuID0gX3JlZjIkcHJvcHMuY2hpbGRyZW4sXG4gICAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjIkcHJvcHMsIF9leGNsdWRlZDIpO1xuICAgIGlmIChvcHRpb25Pbmx5IHx8ICFpc1NlbGVjdE9wdEdyb3VwKSB7XG4gICAgICByZXR1cm4gY29udmVydE5vZGVUb09wdGlvbihub2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7XG4gICAgICBrZXk6IFwiX19SQ19TRUxFQ1RfR1JQX19cIi5jb25jYXQoa2V5ID09PSBudWxsID8gaW5kZXggOiBrZXksIFwiX19cIiksXG4gICAgICBsYWJlbDoga2V5XG4gICAgfSwgcmVzdFByb3BzKSwge30sIHtcbiAgICAgIG9wdGlvbnM6IGNvbnZlcnRDaGlsZHJlblRvRGF0YShjaGlsZHJlbilcbiAgICB9KTtcbiAgfSkuZmlsdGVyKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH0pO1xufSIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNvbnZlcnRDaGlsZHJlblRvRGF0YSB9IGZyb20gXCIuLi91dGlscy9sZWdhY3lVdGlsXCI7XG5cbi8qKlxuICogUGFyc2UgYGNoaWxkcmVuYCB0byBgb3B0aW9uc2AgaWYgYG9wdGlvbnNgIGlzIG5vdCBwcm92aWRlZC5cbiAqIFRoZW4gZmxhdHRlbiB0aGUgYG9wdGlvbnNgLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VPcHRpb25zKG9wdGlvbnMsIGNoaWxkcmVuLCBmaWVsZE5hbWVzLCBvcHRpb25GaWx0ZXJQcm9wLCBvcHRpb25MYWJlbFByb3ApIHtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBtZXJnZWRPcHRpb25zID0gb3B0aW9ucztcbiAgICB2YXIgY2hpbGRyZW5Bc0RhdGEgPSAhb3B0aW9ucztcbiAgICBpZiAoY2hpbGRyZW5Bc0RhdGEpIHtcbiAgICAgIG1lcmdlZE9wdGlvbnMgPSBjb252ZXJ0Q2hpbGRyZW5Ub0RhdGEoY2hpbGRyZW4pO1xuICAgIH1cbiAgICB2YXIgdmFsdWVPcHRpb25zID0gbmV3IE1hcCgpO1xuICAgIHZhciBsYWJlbE9wdGlvbnMgPSBuZXcgTWFwKCk7XG4gICAgdmFyIHNldExhYmVsT3B0aW9ucyA9IGZ1bmN0aW9uIHNldExhYmVsT3B0aW9ucyhsYWJlbE9wdGlvbnNNYXAsIG9wdGlvbiwga2V5KSB7XG4gICAgICBpZiAoa2V5ICYmIHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGxhYmVsT3B0aW9uc01hcC5zZXQob3B0aW9uW2tleV0sIG9wdGlvbik7XG4gICAgICB9XG4gICAgfTtcbiAgICBmdW5jdGlvbiBkaWcob3B0aW9uTGlzdCkge1xuICAgICAgdmFyIGlzQ2hpbGRyZW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICAgICAgLy8gZm9yIGxvb3AgdG8gc3BlZWQgdXAgY29sbGVjdGlvbiBzcGVlZFxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHRpb25MaXN0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBvcHRpb24gPSBvcHRpb25MaXN0W2ldO1xuICAgICAgICBpZiAoIW9wdGlvbltmaWVsZE5hbWVzLm9wdGlvbnNdIHx8IGlzQ2hpbGRyZW4pIHtcbiAgICAgICAgICB2YWx1ZU9wdGlvbnMuc2V0KG9wdGlvbltmaWVsZE5hbWVzLnZhbHVlXSwgb3B0aW9uKTtcbiAgICAgICAgICBzZXRMYWJlbE9wdGlvbnMobGFiZWxPcHRpb25zLCBvcHRpb24sIGZpZWxkTmFtZXMubGFiZWwpO1xuICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzM1MzA0XG4gICAgICAgICAgc2V0TGFiZWxPcHRpb25zKGxhYmVsT3B0aW9ucywgb3B0aW9uLCBvcHRpb25GaWx0ZXJQcm9wKTtcbiAgICAgICAgICBzZXRMYWJlbE9wdGlvbnMobGFiZWxPcHRpb25zLCBvcHRpb24sIG9wdGlvbkxhYmVsUHJvcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGlnKG9wdGlvbltmaWVsZE5hbWVzLm9wdGlvbnNdLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBkaWcobWVyZ2VkT3B0aW9ucyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wdGlvbnM6IG1lcmdlZE9wdGlvbnMsXG4gICAgICB2YWx1ZU9wdGlvbnM6IHZhbHVlT3B0aW9ucyxcbiAgICAgIGxhYmVsT3B0aW9uczogbGFiZWxPcHRpb25zXG4gICAgfTtcbiAgfSwgW29wdGlvbnMsIGNoaWxkcmVuLCBmaWVsZE5hbWVzLCBvcHRpb25GaWx0ZXJQcm9wLCBvcHRpb25MYWJlbFByb3BdKTtcbn0iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbi8qKlxuICogU2FtZSBhcyBgUmVhY3QudXNlQ2FsbGJhY2tgIGJ1dCBhbHdheXMgcmV0dXJuIGEgbWVtb2l6ZWQgZnVuY3Rpb25cbiAqIGJ1dCByZWRpcmVjdCB0byByZWFsIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VSZWZGdW5jKGNhbGxiYWNrKSB7XG4gIHZhciBmdW5jUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIGZ1bmNSZWYuY3VycmVudCA9IGNhbGxiYWNrO1xuICB2YXIgY2FjaGVGbiA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY1JlZi5jdXJyZW50LmFwcGx5KGZ1bmNSZWYsIGFyZ3VtZW50cyk7XG4gIH0sIFtdKTtcbiAgcmV0dXJuIGNhY2hlRm47XG59IiwiLyogaXN0YW5idWwgaWdub3JlIGZpbGUgKi9cblxuLyoqIFRoaXMgaXMgYSBwbGFjZWhvbGRlciwgbm90IHJlYWwgcmVuZGVyIGluIGRvbSAqL1xudmFyIE9wdEdyb3VwID0gZnVuY3Rpb24gT3B0R3JvdXAoKSB7XG4gIHJldHVybiBudWxsO1xufTtcbk9wdEdyb3VwLmlzU2VsZWN0T3B0R3JvdXAgPSB0cnVlO1xuZXhwb3J0IGRlZmF1bHQgT3B0R3JvdXA7IiwiLyogaXN0YW5idWwgaWdub3JlIGZpbGUgKi9cblxuLyoqIFRoaXMgaXMgYSBwbGFjZWhvbGRlciwgbm90IHJlYWwgcmVuZGVyIGluIGRvbSAqL1xudmFyIE9wdGlvbiA9IGZ1bmN0aW9uIE9wdGlvbigpIHtcbiAgcmV0dXJuIG51bGw7XG59O1xuT3B0aW9uLmlzU2VsZWN0T3B0aW9uID0gdHJ1ZTtcbmV4cG9ydCBkZWZhdWx0IE9wdGlvbjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlc2l6ZU9ic2VydmVyIGZyb20gJ3JjLXJlc2l6ZS1vYnNlcnZlcic7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbi8qKlxuICogRmlsbCBjb21wb25lbnQgdG8gcHJvdmlkZWQgdGhlIHNjcm9sbCBjb250ZW50IHJlYWwgaGVpZ2h0LlxuICovXG52YXIgRmlsbGVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKF9yZWYsIHJlZikge1xuICB2YXIgaGVpZ2h0ID0gX3JlZi5oZWlnaHQsXG4gICAgb2Zmc2V0ID0gX3JlZi5vZmZzZXQsXG4gICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuLFxuICAgIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgIG9uSW5uZXJSZXNpemUgPSBfcmVmLm9uSW5uZXJSZXNpemUsXG4gICAgaW5uZXJQcm9wcyA9IF9yZWYuaW5uZXJQcm9wcztcbiAgdmFyIG91dGVyU3R5bGUgPSB7fTtcbiAgdmFyIGlubmVyU3R5bGUgPSB7XG4gICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nXG4gIH07XG4gIGlmIChvZmZzZXQgIT09IHVuZGVmaW5lZCkge1xuICAgIG91dGVyU3R5bGUgPSB7XG4gICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nXG4gICAgfTtcbiAgICBpbm5lclN0eWxlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBpbm5lclN0eWxlKSwge30sIHtcbiAgICAgIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGVZKFwiLmNvbmNhdChvZmZzZXQsIFwicHgpXCIpLFxuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgcmlnaHQ6IDAsXG4gICAgICB0b3A6IDBcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHN0eWxlOiBvdXRlclN0eWxlXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlc2l6ZU9ic2VydmVyLCB7XG4gICAgb25SZXNpemU6IGZ1bmN0aW9uIG9uUmVzaXplKF9yZWYyKSB7XG4gICAgICB2YXIgb2Zmc2V0SGVpZ2h0ID0gX3JlZjIub2Zmc2V0SGVpZ2h0O1xuICAgICAgaWYgKG9mZnNldEhlaWdodCAmJiBvbklubmVyUmVzaXplKSB7XG4gICAgICAgIG9uSW5uZXJSZXNpemUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICBzdHlsZTogaW5uZXJTdHlsZSxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhvbGRlci1pbm5lclwiKSwgcHJlZml4Q2xzKSksXG4gICAgcmVmOiByZWZcbiAgfSwgaW5uZXJQcm9wcyksIGNoaWxkcmVuKSkpO1xufSk7XG5GaWxsZXIuZGlzcGxheU5hbWUgPSAnRmlsbGVyJztcbmV4cG9ydCBkZWZhdWx0IEZpbGxlcjsiLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNcIjtcbmltcG9ydCBfY3JlYXRlU3VwZXIgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZVN1cGVyXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG52YXIgTUlOX1NJWkUgPSAyMDtcbmZ1bmN0aW9uIGdldFBhZ2VZKGUpIHtcbiAgcmV0dXJuICd0b3VjaGVzJyBpbiBlID8gZS50b3VjaGVzWzBdLnBhZ2VZIDogZS5wYWdlWTtcbn1cbnZhciBTY3JvbGxCYXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFNjcm9sbEJhciwgX1JlYWN0JENvbXBvbmVudCk7XG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoU2Nyb2xsQmFyKTtcbiAgZnVuY3Rpb24gU2Nyb2xsQmFyKCkge1xuICAgIHZhciBfdGhpcztcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU2Nyb2xsQmFyKTtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwuYXBwbHkoX3N1cGVyLCBbdGhpc10uY29uY2F0KGFyZ3MpKTtcbiAgICBfdGhpcy5tb3ZlUmFmID0gbnVsbDtcbiAgICBfdGhpcy5zY3JvbGxiYXJSZWYgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlUmVmKCk7XG4gICAgX3RoaXMudGh1bWJSZWYgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlUmVmKCk7XG4gICAgX3RoaXMudmlzaWJsZVRpbWVvdXQgPSBudWxsO1xuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgZHJhZ2dpbmc6IGZhbHNlLFxuICAgICAgcGFnZVk6IG51bGwsXG4gICAgICBzdGFydFRvcDogbnVsbCxcbiAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgfTtcbiAgICBfdGhpcy5kZWxheUhpZGRlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNsZWFyVGltZW91dChfdGhpcy52aXNpYmxlVGltZW91dCk7XG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHZpc2libGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgX3RoaXMudmlzaWJsZVRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfSwgMjAwMCk7XG4gICAgfTtcbiAgICBfdGhpcy5vblNjcm9sbGJhclRvdWNoU3RhcnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH07XG4gICAgX3RoaXMub25Db250YWluZXJNb3VzZURvd24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9O1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09IENsZWFuID09PT09PT09PT09PT09PT09PT09PT09XG4gICAgX3RoaXMucGF0Y2hFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgX3RoaXMub25Nb3VzZU1vdmUpO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBfdGhpcy5vbk1vdXNlVXApO1xuICAgICAgX3RoaXMudGh1bWJSZWYuY3VycmVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBfdGhpcy5vbk1vdXNlTW92ZSk7XG4gICAgICBfdGhpcy50aHVtYlJlZi5jdXJyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgX3RoaXMub25Nb3VzZVVwKTtcbiAgICB9O1xuICAgIF90aGlzLnJlbW92ZUV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRzY3JvbGxiYXJSZWYkY3U7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgX3RoaXMub25Nb3VzZU1vdmUpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBfdGhpcy5vbk1vdXNlVXApO1xuICAgICAgKF90aGlzJHNjcm9sbGJhclJlZiRjdSA9IF90aGlzLnNjcm9sbGJhclJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfdGhpcyRzY3JvbGxiYXJSZWYkY3UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJHNjcm9sbGJhclJlZiRjdS5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgX3RoaXMub25TY3JvbGxiYXJUb3VjaFN0YXJ0KTtcbiAgICAgIGlmIChfdGhpcy50aHVtYlJlZi5jdXJyZW50KSB7XG4gICAgICAgIF90aGlzLnRodW1iUmVmLmN1cnJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIF90aGlzLm9uTW91c2VEb3duKTtcbiAgICAgICAgX3RoaXMudGh1bWJSZWYuY3VycmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBfdGhpcy5vbk1vdXNlTW92ZSk7XG4gICAgICAgIF90aGlzLnRodW1iUmVmLmN1cnJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBfdGhpcy5vbk1vdXNlVXApO1xuICAgICAgfVxuICAgICAgcmFmLmNhbmNlbChfdGhpcy5tb3ZlUmFmKTtcbiAgICB9O1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09IFRodW1iID09PT09PT09PT09PT09PT09PT09PT09XG4gICAgX3RoaXMub25Nb3VzZURvd24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIG9uU3RhcnRNb3ZlID0gX3RoaXMucHJvcHMub25TdGFydE1vdmU7XG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGRyYWdnaW5nOiB0cnVlLFxuICAgICAgICBwYWdlWTogZ2V0UGFnZVkoZSksXG4gICAgICAgIHN0YXJ0VG9wOiBfdGhpcy5nZXRUb3AoKVxuICAgICAgfSk7XG4gICAgICBvblN0YXJ0TW92ZSgpO1xuICAgICAgX3RoaXMucGF0Y2hFdmVudHMoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfTtcbiAgICBfdGhpcy5vbk1vdXNlTW92ZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUgPSBfdGhpcy5zdGF0ZSxcbiAgICAgICAgZHJhZ2dpbmcgPSBfdGhpcyRzdGF0ZS5kcmFnZ2luZyxcbiAgICAgICAgcGFnZVkgPSBfdGhpcyRzdGF0ZS5wYWdlWSxcbiAgICAgICAgc3RhcnRUb3AgPSBfdGhpcyRzdGF0ZS5zdGFydFRvcDtcbiAgICAgIHZhciBvblNjcm9sbCA9IF90aGlzLnByb3BzLm9uU2Nyb2xsO1xuICAgICAgcmFmLmNhbmNlbChfdGhpcy5tb3ZlUmFmKTtcbiAgICAgIGlmIChkcmFnZ2luZykge1xuICAgICAgICB2YXIgb2Zmc2V0WSA9IGdldFBhZ2VZKGUpIC0gcGFnZVk7XG4gICAgICAgIHZhciBuZXdUb3AgPSBzdGFydFRvcCArIG9mZnNldFk7XG4gICAgICAgIHZhciBlbmFibGVTY3JvbGxSYW5nZSA9IF90aGlzLmdldEVuYWJsZVNjcm9sbFJhbmdlKCk7XG4gICAgICAgIHZhciBlbmFibGVIZWlnaHRSYW5nZSA9IF90aGlzLmdldEVuYWJsZUhlaWdodFJhbmdlKCk7XG4gICAgICAgIHZhciBwdGcgPSBlbmFibGVIZWlnaHRSYW5nZSA/IG5ld1RvcCAvIGVuYWJsZUhlaWdodFJhbmdlIDogMDtcbiAgICAgICAgdmFyIG5ld1Njcm9sbFRvcCA9IE1hdGguY2VpbChwdGcgKiBlbmFibGVTY3JvbGxSYW5nZSk7XG4gICAgICAgIF90aGlzLm1vdmVSYWYgPSByYWYoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIG9uU2Nyb2xsKG5ld1Njcm9sbFRvcCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgX3RoaXMub25Nb3VzZVVwID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG9uU3RvcE1vdmUgPSBfdGhpcy5wcm9wcy5vblN0b3BNb3ZlO1xuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBkcmFnZ2luZzogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgb25TdG9wTW92ZSgpO1xuICAgICAgX3RoaXMucmVtb3ZlRXZlbnRzKCk7XG4gICAgfTtcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0gQ2FsY3VsYXRlID09PT09PT09PT09PT09PT09PT09PVxuICAgIF90aGlzLmdldFNwaW5IZWlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgaGVpZ2h0ID0gX3RoaXMkcHJvcHMuaGVpZ2h0LFxuICAgICAgICBjb3VudCA9IF90aGlzJHByb3BzLmNvdW50O1xuICAgICAgdmFyIGJhc2VIZWlnaHQgPSBoZWlnaHQgLyBjb3VudCAqIDEwO1xuICAgICAgYmFzZUhlaWdodCA9IE1hdGgubWF4KGJhc2VIZWlnaHQsIE1JTl9TSVpFKTtcbiAgICAgIGJhc2VIZWlnaHQgPSBNYXRoLm1pbihiYXNlSGVpZ2h0LCBoZWlnaHQgLyAyKTtcbiAgICAgIHJldHVybiBNYXRoLmZsb29yKGJhc2VIZWlnaHQpO1xuICAgIH07XG4gICAgX3RoaXMuZ2V0RW5hYmxlU2Nyb2xsUmFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gX3RoaXMucHJvcHMsXG4gICAgICAgIHNjcm9sbEhlaWdodCA9IF90aGlzJHByb3BzMi5zY3JvbGxIZWlnaHQsXG4gICAgICAgIGhlaWdodCA9IF90aGlzJHByb3BzMi5oZWlnaHQ7XG4gICAgICByZXR1cm4gc2Nyb2xsSGVpZ2h0IC0gaGVpZ2h0IHx8IDA7XG4gICAgfTtcbiAgICBfdGhpcy5nZXRFbmFibGVIZWlnaHRSYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBoZWlnaHQgPSBfdGhpcy5wcm9wcy5oZWlnaHQ7XG4gICAgICB2YXIgc3BpbkhlaWdodCA9IF90aGlzLmdldFNwaW5IZWlnaHQoKTtcbiAgICAgIHJldHVybiBoZWlnaHQgLSBzcGluSGVpZ2h0IHx8IDA7XG4gICAgfTtcbiAgICBfdGhpcy5nZXRUb3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc2Nyb2xsVG9wID0gX3RoaXMucHJvcHMuc2Nyb2xsVG9wO1xuICAgICAgdmFyIGVuYWJsZVNjcm9sbFJhbmdlID0gX3RoaXMuZ2V0RW5hYmxlU2Nyb2xsUmFuZ2UoKTtcbiAgICAgIHZhciBlbmFibGVIZWlnaHRSYW5nZSA9IF90aGlzLmdldEVuYWJsZUhlaWdodFJhbmdlKCk7XG4gICAgICBpZiAoc2Nyb2xsVG9wID09PSAwIHx8IGVuYWJsZVNjcm9sbFJhbmdlID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgdmFyIHB0ZyA9IHNjcm9sbFRvcCAvIGVuYWJsZVNjcm9sbFJhbmdlO1xuICAgICAgcmV0dXJuIHB0ZyAqIGVuYWJsZUhlaWdodFJhbmdlO1xuICAgIH07XG4gICAgLy8gTm90IHNob3cgc2Nyb2xsYmFyIHdoZW4gaGVpZ2h0IGlzIGxhcmdlIHRoYW4gc2Nyb2xsSGVpZ2h0XG4gICAgX3RoaXMuc2hvd1Njcm9sbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgaGVpZ2h0ID0gX3RoaXMkcHJvcHMzLmhlaWdodCxcbiAgICAgICAgc2Nyb2xsSGVpZ2h0ID0gX3RoaXMkcHJvcHMzLnNjcm9sbEhlaWdodDtcbiAgICAgIHJldHVybiBzY3JvbGxIZWlnaHQgPiBoZWlnaHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgX2NyZWF0ZUNsYXNzKFNjcm9sbEJhciwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLnNjcm9sbGJhclJlZi5jdXJyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLm9uU2Nyb2xsYmFyVG91Y2hTdGFydCk7XG4gICAgICB0aGlzLnRodW1iUmVmLmN1cnJlbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMub25Nb3VzZURvd24pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgICAgaWYgKHByZXZQcm9wcy5zY3JvbGxUb3AgIT09IHRoaXMucHJvcHMuc2Nyb2xsVG9wKSB7XG4gICAgICAgIHRoaXMuZGVsYXlIaWRkZW4oKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50cygpO1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudmlzaWJsZVRpbWVvdXQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTpcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZTIgPSB0aGlzLnN0YXRlLFxuICAgICAgICBkcmFnZ2luZyA9IF90aGlzJHN0YXRlMi5kcmFnZ2luZyxcbiAgICAgICAgdmlzaWJsZSA9IF90aGlzJHN0YXRlMi52aXNpYmxlO1xuICAgICAgdmFyIF90aGlzJHByb3BzNCA9IHRoaXMucHJvcHMsXG4gICAgICAgIHByZWZpeENscyA9IF90aGlzJHByb3BzNC5wcmVmaXhDbHMsXG4gICAgICAgIGRpcmVjdGlvbiA9IF90aGlzJHByb3BzNC5kaXJlY3Rpb247XG4gICAgICB2YXIgc3BpbkhlaWdodCA9IHRoaXMuZ2V0U3BpbkhlaWdodCgpO1xuICAgICAgdmFyIHRvcCA9IHRoaXMuZ2V0VG9wKCk7XG4gICAgICB2YXIgY2FuU2Nyb2xsID0gdGhpcy5zaG93U2Nyb2xsKCk7XG4gICAgICB2YXIgbWVyZ2VkVmlzaWJsZSA9IGNhblNjcm9sbCAmJiB2aXNpYmxlO1xuICAgICAgdmFyIHNjcm9sbEJhckRpcmVjdGlvbiA9IGRpcmVjdGlvbiA9PT0gJ3J0bCcgPyB7XG4gICAgICAgIGxlZnQ6IDBcbiAgICAgIH0gOiB7XG4gICAgICAgIHJpZ2h0OiAwXG4gICAgICB9O1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgcmVmOiB0aGlzLnNjcm9sbGJhclJlZixcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2Nyb2xsYmFyXCIpLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2Nyb2xsYmFyLXNob3dcIiksIGNhblNjcm9sbCkpLFxuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgICB3aWR0aDogOCxcbiAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgYm90dG9tOiAwXG4gICAgICAgIH0sIHNjcm9sbEJhckRpcmVjdGlvbiksIHt9LCB7XG4gICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgZGlzcGxheTogbWVyZ2VkVmlzaWJsZSA/IG51bGwgOiAnbm9uZSdcbiAgICAgICAgfSksXG4gICAgICAgIG9uTW91c2VEb3duOiB0aGlzLm9uQ29udGFpbmVyTW91c2VEb3duLFxuICAgICAgICBvbk1vdXNlTW92ZTogdGhpcy5kZWxheUhpZGRlblxuICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICByZWY6IHRoaXMudGh1bWJSZWYsXG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNjcm9sbGJhci10aHVtYlwiKSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNjcm9sbGJhci10aHVtYi1tb3ZpbmdcIiksIGRyYWdnaW5nKSksXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICBoZWlnaHQ6IHNwaW5IZWlnaHQsXG4gICAgICAgICAgdG9wOiB0b3AsXG4gICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICBiYWNrZ3JvdW5kOiAncmdiYSgwLCAwLCAwLCAwLjUpJyxcbiAgICAgICAgICBib3JkZXJSYWRpdXM6IDk5LFxuICAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgICAgIHVzZXJTZWxlY3Q6ICdub25lJ1xuICAgICAgICB9LFxuICAgICAgICBvbk1vdXNlRG93bjogdGhpcy5vbk1vdXNlRG93blxuICAgICAgfSkpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gU2Nyb2xsQmFyO1xufShSZWFjdC5Db21wb25lbnQpO1xuZXhwb3J0IHsgU2Nyb2xsQmFyIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgZnVuY3Rpb24gSXRlbShfcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgc2V0UmVmID0gX3JlZi5zZXRSZWY7XG4gIHZhciByZWZGdW5jID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBzZXRSZWYobm9kZSk7XG4gIH0sIFtdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGRyZW4sIHtcbiAgICByZWY6IHJlZkZ1bmNcbiAgfSk7XG59IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgSXRlbSB9IGZyb20gJy4uL0l0ZW0nO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlQ2hpbGRyZW4obGlzdCwgc3RhcnRJbmRleCwgZW5kSW5kZXgsIHNldE5vZGVSZWYsIHJlbmRlckZ1bmMsIF9yZWYpIHtcbiAgdmFyIGdldEtleSA9IF9yZWYuZ2V0S2V5O1xuICByZXR1cm4gbGlzdC5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCArIDEpLm1hcChmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICB2YXIgZWxlSW5kZXggPSBzdGFydEluZGV4ICsgaW5kZXg7XG4gICAgdmFyIG5vZGUgPSByZW5kZXJGdW5jKGl0ZW0sIGVsZUluZGV4LCB7XG4gICAgICAvLyBzdHlsZTogc3RhdHVzID09PSAnTUVBU1VSRV9TVEFSVCcgPyB7IHZpc2liaWxpdHk6ICdoaWRkZW4nIH0gOiB7fSxcbiAgICB9KTtcbiAgICB2YXIga2V5ID0gZ2V0S2V5KGl0ZW0pO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJdGVtLCB7XG4gICAgICBrZXk6IGtleSxcbiAgICAgIHNldFJlZjogZnVuY3Rpb24gc2V0UmVmKGVsZSkge1xuICAgICAgICByZXR1cm4gc2V0Tm9kZVJlZihpdGVtLCBlbGUpO1xuICAgICAgfVxuICAgIH0sIG5vZGUpO1xuICB9KTtcbn0iLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbi8vIEZpcmVmb3ggaGFzIGxvdyBwZXJmb3JtYW5jZSBvZiBtYXAuXG52YXIgQ2FjaGVNYXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDYWNoZU1hcCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2FjaGVNYXApO1xuICAgIHRoaXMubWFwcyA9IHZvaWQgMDtcbiAgICB0aGlzLm1hcHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9XG4gIF9jcmVhdGVDbGFzcyhDYWNoZU1hcCwgW3tcbiAgICBrZXk6IFwic2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICB0aGlzLm1hcHNba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMubWFwc1trZXldO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQ2FjaGVNYXA7XG59KCk7XG5leHBvcnQgZGVmYXVsdCBDYWNoZU1hcDsiLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVJlZiwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGZpbmRET01Ob2RlIGZyb20gXCJyYy11dGlsL2VzL0RvbS9maW5kRE9NTm9kZVwiO1xuaW1wb3J0IHJhZiBmcm9tIFwicmMtdXRpbC9lcy9yYWZcIjtcbmltcG9ydCBDYWNoZU1hcCBmcm9tICcuLi91dGlscy9DYWNoZU1hcCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VIZWlnaHRzKGdldEtleSwgb25JdGVtQWRkLCBvbkl0ZW1SZW1vdmUpIHtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKDApLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIHVwZGF0ZWRNYXJrID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRVcGRhdGVkTWFyayA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBpbnN0YW5jZVJlZiA9IHVzZVJlZihuZXcgTWFwKCkpO1xuICB2YXIgaGVpZ2h0c1JlZiA9IHVzZVJlZihuZXcgQ2FjaGVNYXAoKSk7XG4gIHZhciBjb2xsZWN0UmFmUmVmID0gdXNlUmVmKCk7XG4gIGZ1bmN0aW9uIGNhbmNlbFJhZigpIHtcbiAgICByYWYuY2FuY2VsKGNvbGxlY3RSYWZSZWYuY3VycmVudCk7XG4gIH1cbiAgZnVuY3Rpb24gY29sbGVjdEhlaWdodCgpIHtcbiAgICBjYW5jZWxSYWYoKTtcbiAgICBjb2xsZWN0UmFmUmVmLmN1cnJlbnQgPSByYWYoZnVuY3Rpb24gKCkge1xuICAgICAgaW5zdGFuY2VSZWYuY3VycmVudC5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50LCBrZXkpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5vZmZzZXRQYXJlbnQpIHtcbiAgICAgICAgICB2YXIgaHRtbEVsZW1lbnQgPSBmaW5kRE9NTm9kZShlbGVtZW50KTtcbiAgICAgICAgICB2YXIgb2Zmc2V0SGVpZ2h0ID0gaHRtbEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgIGlmIChoZWlnaHRzUmVmLmN1cnJlbnQuZ2V0KGtleSkgIT09IG9mZnNldEhlaWdodCkge1xuICAgICAgICAgICAgaGVpZ2h0c1JlZi5jdXJyZW50LnNldChrZXksIGh0bWxFbGVtZW50Lm9mZnNldEhlaWdodCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8vIEFsd2F5cyB0cmlnZ2VyIHVwZGF0ZSBtYXJrIHRvIHRlbGwgcGFyZW50IHRoYXQgc2hvdWxkIHJlLWNhbGN1bGF0ZSBoZWlnaHRzIHdoZW4gcmVzaXplZFxuICAgICAgc2V0VXBkYXRlZE1hcmsoZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgcmV0dXJuIGMgKyAxO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gc2V0SW5zdGFuY2VSZWYoaXRlbSwgaW5zdGFuY2UpIHtcbiAgICB2YXIga2V5ID0gZ2V0S2V5KGl0ZW0pO1xuICAgIHZhciBvcmlnaW4gPSBpbnN0YW5jZVJlZi5jdXJyZW50LmdldChrZXkpO1xuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgaW5zdGFuY2VSZWYuY3VycmVudC5zZXQoa2V5LCBpbnN0YW5jZSk7XG4gICAgICBjb2xsZWN0SGVpZ2h0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluc3RhbmNlUmVmLmN1cnJlbnQuZGVsZXRlKGtleSk7XG4gICAgfVxuICAgIC8vIEluc3RhbmNlIGNoYW5nZWRcbiAgICBpZiAoIW9yaWdpbiAhPT0gIWluc3RhbmNlKSB7XG4gICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgb25JdGVtQWRkID09PSBudWxsIHx8IG9uSXRlbUFkZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25JdGVtQWRkKGl0ZW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25JdGVtUmVtb3ZlID09PSBudWxsIHx8IG9uSXRlbVJlbW92ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25JdGVtUmVtb3ZlKGl0ZW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjYW5jZWxSYWY7XG4gIH0sIFtdKTtcbiAgcmV0dXJuIFtzZXRJbnN0YW5jZVJlZiwgY29sbGVjdEhlaWdodCwgaGVpZ2h0c1JlZi5jdXJyZW50LCB1cGRhdGVkTWFya107XG59IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VTY3JvbGxUbyhjb250YWluZXJSZWYsIGRhdGEsIGhlaWdodHMsIGl0ZW1IZWlnaHQsIGdldEtleSwgY29sbGVjdEhlaWdodCwgc3luY1Njcm9sbFRvcCwgdHJpZ2dlckZsYXNoKSB7XG4gIHZhciBzY3JvbGxSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhcmcpIHtcbiAgICAvLyBXaGVuIG5vdCBhcmd1bWVudCBwcm92aWRlZCwgd2UgdGhpbmsgZGV2IG1heSB3YW50IHRvIHNob3cgdGhlIHNjcm9sbGJhclxuICAgIGlmIChhcmcgPT09IG51bGwgfHwgYXJnID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRyaWdnZXJGbGFzaCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBOb3JtYWwgc2Nyb2xsIGxvZ2ljXG4gICAgcmFmLmNhbmNlbChzY3JvbGxSZWYuY3VycmVudCk7XG4gICAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgICBzeW5jU2Nyb2xsVG9wKGFyZyk7XG4gICAgfSBlbHNlIGlmIChhcmcgJiYgX3R5cGVvZihhcmcpID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFyIGluZGV4O1xuICAgICAgdmFyIGFsaWduID0gYXJnLmFsaWduO1xuICAgICAgaWYgKCdpbmRleCcgaW4gYXJnKSB7XG4gICAgICAgIGluZGV4ID0gYXJnLmluZGV4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5kZXggPSBkYXRhLmZpbmRJbmRleChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgIHJldHVybiBnZXRLZXkoaXRlbSkgPT09IGFyZy5rZXk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdmFyIF9hcmckb2Zmc2V0ID0gYXJnLm9mZnNldCxcbiAgICAgICAgb2Zmc2V0ID0gX2FyZyRvZmZzZXQgPT09IHZvaWQgMCA/IDAgOiBfYXJnJG9mZnNldDtcbiAgICAgIC8vIFdlIHdpbGwgcmV0cnkgMyB0aW1lcyBpbiBjYXNlIGR5bmFtaWMgaGVpZ2h0IHNoYWtpbmdcbiAgICAgIHZhciBzeW5jU2Nyb2xsID0gZnVuY3Rpb24gc3luY1Njcm9sbCh0aW1lcywgdGFyZ2V0QWxpZ24pIHtcbiAgICAgICAgaWYgKHRpbWVzIDwgMCB8fCAhY29udGFpbmVyUmVmLmN1cnJlbnQpIHJldHVybjtcbiAgICAgICAgdmFyIGhlaWdodCA9IGNvbnRhaW5lclJlZi5jdXJyZW50LmNsaWVudEhlaWdodDtcbiAgICAgICAgdmFyIG5lZWRDb2xsZWN0SGVpZ2h0ID0gZmFsc2U7XG4gICAgICAgIHZhciBuZXdUYXJnZXRBbGlnbiA9IHRhcmdldEFsaWduO1xuICAgICAgICAvLyBHbyB0byBuZXh0IGZyYW1lIGlmIGhlaWdodCBub3QgZXhpc3RcbiAgICAgICAgaWYgKGhlaWdodCkge1xuICAgICAgICAgIHZhciBtZXJnZWRBbGlnbiA9IHRhcmdldEFsaWduIHx8IGFsaWduO1xuICAgICAgICAgIC8vIEdldCB0b3AgJiBib3R0b21cbiAgICAgICAgICB2YXIgc3RhY2tUb3AgPSAwO1xuICAgICAgICAgIHZhciBpdGVtVG9wID0gMDtcbiAgICAgICAgICB2YXIgaXRlbUJvdHRvbSA9IDA7XG4gICAgICAgICAgdmFyIG1heExlbiA9IE1hdGgubWluKGRhdGEubGVuZ3RoLCBpbmRleCk7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gbWF4TGVuOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBnZXRLZXkoZGF0YVtpXSk7XG4gICAgICAgICAgICBpdGVtVG9wID0gc3RhY2tUb3A7XG4gICAgICAgICAgICB2YXIgY2FjaGVIZWlnaHQgPSBoZWlnaHRzLmdldChrZXkpO1xuICAgICAgICAgICAgaXRlbUJvdHRvbSA9IGl0ZW1Ub3AgKyAoY2FjaGVIZWlnaHQgPT09IHVuZGVmaW5lZCA/IGl0ZW1IZWlnaHQgOiBjYWNoZUhlaWdodCk7XG4gICAgICAgICAgICBzdGFja1RvcCA9IGl0ZW1Cb3R0b207XG4gICAgICAgICAgICBpZiAoaSA9PT0gaW5kZXggJiYgY2FjaGVIZWlnaHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBuZWVkQ29sbGVjdEhlaWdodCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFNjcm9sbCB0b1xuICAgICAgICAgIHZhciB0YXJnZXRUb3AgPSBudWxsO1xuICAgICAgICAgIHN3aXRjaCAobWVyZ2VkQWxpZ24pIHtcbiAgICAgICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgICAgIHRhcmdldFRvcCA9IGl0ZW1Ub3AgLSBvZmZzZXQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICAgICAgdGFyZ2V0VG9wID0gaXRlbUJvdHRvbSAtIGhlaWdodCArIG9mZnNldDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIHNjcm9sbFRvcCA9IGNvbnRhaW5lclJlZi5jdXJyZW50LnNjcm9sbFRvcDtcbiAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsQm90dG9tID0gc2Nyb2xsVG9wICsgaGVpZ2h0O1xuICAgICAgICAgICAgICAgIGlmIChpdGVtVG9wIDwgc2Nyb2xsVG9wKSB7XG4gICAgICAgICAgICAgICAgICBuZXdUYXJnZXRBbGlnbiA9ICd0b3AnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbUJvdHRvbSA+IHNjcm9sbEJvdHRvbSkge1xuICAgICAgICAgICAgICAgICAgbmV3VGFyZ2V0QWxpZ24gPSAnYm90dG9tJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRhcmdldFRvcCAhPT0gbnVsbCAmJiB0YXJnZXRUb3AgIT09IGNvbnRhaW5lclJlZi5jdXJyZW50LnNjcm9sbFRvcCkge1xuICAgICAgICAgICAgc3luY1Njcm9sbFRvcCh0YXJnZXRUb3ApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBXZSB3aWxsIHJldHJ5IHNpbmNlIGVsZW1lbnQgbWF5IG5vdCBzeW5jIGhlaWdodCBhcyBpdCBkZXNjcmliZWRcbiAgICAgICAgc2Nyb2xsUmVmLmN1cnJlbnQgPSByYWYoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChuZWVkQ29sbGVjdEhlaWdodCkge1xuICAgICAgICAgICAgY29sbGVjdEhlaWdodCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzeW5jU2Nyb2xsKHRpbWVzIC0gMSwgbmV3VGFyZ2V0QWxpZ24pO1xuICAgICAgICB9LCAyKTsgLy8gRGVsYXkgMiB0byB3YWl0IGZvciBMaXN0IGNvbGxlY3QgaGVpZ2h0c1xuICAgICAgfTtcblxuICAgICAgc3luY1Njcm9sbCgzKTtcbiAgICB9XG4gIH07XG59IiwiLyoqXG4gKiBHZXQgaW5kZXggd2l0aCBzcGVjaWZpYyBzdGFydCBpbmRleCBvbmUgYnkgb25lLiBlLmcuXG4gKiBtaW46IDMsIG1heDogOSwgc3RhcnQ6IDZcbiAqXG4gKiBSZXR1cm4gaW5kZXggaXM6XG4gKiBbMF06IDZcbiAqIFsxXTogN1xuICogWzJdOiA1XG4gKiBbM106IDhcbiAqIFs0XTogNFxuICogWzVdOiA5XG4gKiBbNl06IDNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEluZGV4QnlTdGFydExvYyhtaW4sIG1heCwgc3RhcnQsIGluZGV4KSB7XG4gIHZhciBiZWZvcmVDb3VudCA9IHN0YXJ0IC0gbWluO1xuICB2YXIgYWZ0ZXJDb3VudCA9IG1heCAtIHN0YXJ0O1xuICB2YXIgYmFsYW5jZUNvdW50ID0gTWF0aC5taW4oYmVmb3JlQ291bnQsIGFmdGVyQ291bnQpICogMjtcbiAgLy8gQmFsYW5jZVxuICBpZiAoaW5kZXggPD0gYmFsYW5jZUNvdW50KSB7XG4gICAgdmFyIHN0ZXBJbmRleCA9IE1hdGguZmxvb3IoaW5kZXggLyAyKTtcbiAgICBpZiAoaW5kZXggJSAyKSB7XG4gICAgICByZXR1cm4gc3RhcnQgKyBzdGVwSW5kZXggKyAxO1xuICAgIH1cbiAgICByZXR1cm4gc3RhcnQgLSBzdGVwSW5kZXg7XG4gIH1cbiAgLy8gT25lIGlzIG91dCBvZiByYW5nZVxuICBpZiAoYmVmb3JlQ291bnQgPiBhZnRlckNvdW50KSB7XG4gICAgcmV0dXJuIHN0YXJ0IC0gKGluZGV4IC0gYWZ0ZXJDb3VudCk7XG4gIH1cbiAgcmV0dXJuIHN0YXJ0ICsgKGluZGV4IC0gYmVmb3JlQ291bnQpO1xufVxuLyoqXG4gKiBXZSBhc3N1bWUgdGhhdCAyIGxpc3QgaGFzIG9ubHkgMSBpdGVtIGRpZmYgYW5kIG90aGVycyBrZWVwaW5nIHRoZSBvcmRlci5cbiAqIFNvIHdlIGNhbiB1c2UgZGljaG90b215IGFsZ29yaXRobSB0byBmaW5kIGNoYW5nZWQgb25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZExpc3REaWZmSW5kZXgob3JpZ2luTGlzdCwgdGFyZ2V0TGlzdCwgZ2V0S2V5KSB7XG4gIHZhciBvcmlnaW5MZW4gPSBvcmlnaW5MaXN0Lmxlbmd0aDtcbiAgdmFyIHRhcmdldExlbiA9IHRhcmdldExpc3QubGVuZ3RoO1xuICB2YXIgc2hvcnRMaXN0O1xuICB2YXIgbG9uZ0xpc3Q7XG4gIGlmIChvcmlnaW5MZW4gPT09IDAgJiYgdGFyZ2V0TGVuID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKG9yaWdpbkxlbiA8IHRhcmdldExlbikge1xuICAgIHNob3J0TGlzdCA9IG9yaWdpbkxpc3Q7XG4gICAgbG9uZ0xpc3QgPSB0YXJnZXRMaXN0O1xuICB9IGVsc2Uge1xuICAgIHNob3J0TGlzdCA9IHRhcmdldExpc3Q7XG4gICAgbG9uZ0xpc3QgPSBvcmlnaW5MaXN0O1xuICB9XG4gIHZhciBub3RFeGlzdEtleSA9IHtcbiAgICBfX0VNUFRZX0lURU1fXzogdHJ1ZVxuICB9O1xuICBmdW5jdGlvbiBnZXRJdGVtS2V5KGl0ZW0pIHtcbiAgICBpZiAoaXRlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZ2V0S2V5KGl0ZW0pO1xuICAgIH1cbiAgICByZXR1cm4gbm90RXhpc3RLZXk7XG4gIH1cbiAgLy8gTG9vcCB0byBmaW5kIGRpZmYgb25lXG4gIHZhciBkaWZmSW5kZXggPSBudWxsO1xuICB2YXIgbXVsdGlwbGUgPSBNYXRoLmFicyhvcmlnaW5MZW4gLSB0YXJnZXRMZW4pICE9PSAxO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxvbmdMaXN0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIHNob3J0S2V5ID0gZ2V0SXRlbUtleShzaG9ydExpc3RbaV0pO1xuICAgIHZhciBsb25nS2V5ID0gZ2V0SXRlbUtleShsb25nTGlzdFtpXSk7XG4gICAgaWYgKHNob3J0S2V5ICE9PSBsb25nS2V5KSB7XG4gICAgICBkaWZmSW5kZXggPSBpO1xuICAgICAgbXVsdGlwbGUgPSBtdWx0aXBsZSB8fCBzaG9ydEtleSAhPT0gZ2V0SXRlbUtleShsb25nTGlzdFtpICsgMV0pO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBkaWZmSW5kZXggPT09IG51bGwgPyBudWxsIDoge1xuICAgIGluZGV4OiBkaWZmSW5kZXgsXG4gICAgbXVsdGlwbGU6IG11bHRpcGxlXG4gIH07XG59IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBmaW5kTGlzdERpZmZJbmRleCB9IGZyb20gJy4uL3V0aWxzL2FsZ29yaXRobVV0aWwnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlRGlmZkl0ZW0oZGF0YSwgZ2V0S2V5LCBvbkRpZmYpIHtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGRhdGEpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIHByZXZEYXRhID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRQcmV2RGF0YSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUzID0gUmVhY3QudXNlU3RhdGUobnVsbCksXG4gICAgX1JlYWN0JHVzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTMsIDIpLFxuICAgIGRpZmZJdGVtID0gX1JlYWN0JHVzZVN0YXRlNFswXSxcbiAgICBzZXREaWZmSXRlbSA9IF9SZWFjdCR1c2VTdGF0ZTRbMV07XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRpZmYgPSBmaW5kTGlzdERpZmZJbmRleChwcmV2RGF0YSB8fCBbXSwgZGF0YSB8fCBbXSwgZ2V0S2V5KTtcbiAgICBpZiAoKGRpZmYgPT09IG51bGwgfHwgZGlmZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGlmZi5pbmRleCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb25EaWZmID09PSBudWxsIHx8IG9uRGlmZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25EaWZmKGRpZmYuaW5kZXgpO1xuICAgICAgc2V0RGlmZkl0ZW0oZGF0YVtkaWZmLmluZGV4XSk7XG4gICAgfVxuICAgIHNldFByZXZEYXRhKGRhdGEpO1xuICB9LCBbZGF0YV0pO1xuICByZXR1cm4gW2RpZmZJdGVtXTtcbn0iLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG52YXIgaXNGRiA9ICh0eXBlb2YgbmF2aWdhdG9yID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YobmF2aWdhdG9yKSkgPT09ICdvYmplY3QnICYmIC9GaXJlZm94L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbmV4cG9ydCBkZWZhdWx0IGlzRkY7IiwiaW1wb3J0IHsgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIChpc1Njcm9sbEF0VG9wLCBpc1Njcm9sbEF0Qm90dG9tKSB7XG4gIC8vIERvIGxvY2sgZm9yIGEgd2hlZWwgd2hlbiBzY3JvbGxpbmdcbiAgdmFyIGxvY2tSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICB2YXIgbG9ja1RpbWVvdXRSZWYgPSB1c2VSZWYobnVsbCk7XG4gIGZ1bmN0aW9uIGxvY2tTY3JvbGwoKSB7XG4gICAgY2xlYXJUaW1lb3V0KGxvY2tUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgIGxvY2tSZWYuY3VycmVudCA9IHRydWU7XG4gICAgbG9ja1RpbWVvdXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgbG9ja1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfSwgNTApO1xuICB9XG4gIC8vIFBhc3MgdG8gcmVmIHNpbmNlIGdsb2JhbCBhZGQgaXMgaW4gY2xvc3VyZVxuICB2YXIgc2Nyb2xsUGluZ1JlZiA9IHVzZVJlZih7XG4gICAgdG9wOiBpc1Njcm9sbEF0VG9wLFxuICAgIGJvdHRvbTogaXNTY3JvbGxBdEJvdHRvbVxuICB9KTtcbiAgc2Nyb2xsUGluZ1JlZi5jdXJyZW50LnRvcCA9IGlzU2Nyb2xsQXRUb3A7XG4gIHNjcm9sbFBpbmdSZWYuY3VycmVudC5ib3R0b20gPSBpc1Njcm9sbEF0Qm90dG9tO1xuICByZXR1cm4gZnVuY3Rpb24gKGRlbHRhWSkge1xuICAgIHZhciBzbW9vdGhPZmZzZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICAgIHZhciBvcmlnaW5TY3JvbGwgPVxuICAgIC8vIFBhc3Mgb3JpZ2luIHdoZWVsIHdoZW4gb24gdGhlIHRvcFxuICAgIGRlbHRhWSA8IDAgJiYgc2Nyb2xsUGluZ1JlZi5jdXJyZW50LnRvcCB8fFxuICAgIC8vIFBhc3Mgb3JpZ2luIHdoZWVsIHdoZW4gb24gdGhlIGJvdHRvbVxuICAgIGRlbHRhWSA+IDAgJiYgc2Nyb2xsUGluZ1JlZi5jdXJyZW50LmJvdHRvbTtcbiAgICBpZiAoc21vb3RoT2Zmc2V0ICYmIG9yaWdpblNjcm9sbCkge1xuICAgICAgLy8gTm8gbmVlZCBsb2NrIGFueW1vcmUgd2hlbiBpdCdzIHNtb290aCBvZmZzZXQgZnJvbSB0b3VjaE1vdmUgaW50ZXJ2YWxcbiAgICAgIGNsZWFyVGltZW91dChsb2NrVGltZW91dFJlZi5jdXJyZW50KTtcbiAgICAgIGxvY2tSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoIW9yaWdpblNjcm9sbCB8fCBsb2NrUmVmLmN1cnJlbnQpIHtcbiAgICAgIGxvY2tTY3JvbGwoKTtcbiAgICB9XG4gICAgcmV0dXJuICFsb2NrUmVmLmN1cnJlbnQgJiYgb3JpZ2luU2Nyb2xsO1xuICB9O1xufSk7IiwiaW1wb3J0IHsgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHJhZiBmcm9tIFwicmMtdXRpbC9lcy9yYWZcIjtcbmltcG9ydCBpc0ZGIGZyb20gJy4uL3V0aWxzL2lzRmlyZWZveCc7XG5pbXBvcnQgdXNlT3JpZ2luU2Nyb2xsIGZyb20gJy4vdXNlT3JpZ2luU2Nyb2xsJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUZyYW1lV2hlZWwoaW5WaXJ0dWFsLCBpc1Njcm9sbEF0VG9wLCBpc1Njcm9sbEF0Qm90dG9tLCBvbldoZWVsRGVsdGEpIHtcbiAgdmFyIG9mZnNldFJlZiA9IHVzZVJlZigwKTtcbiAgdmFyIG5leHRGcmFtZVJlZiA9IHVzZVJlZihudWxsKTtcbiAgLy8gRmlyZWZveCBwYXRjaFxuICB2YXIgd2hlZWxWYWx1ZVJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIGlzTW91c2VTY3JvbGxSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICAvLyBTY3JvbGwgc3RhdHVzIHN5bmNcbiAgdmFyIG9yaWdpblNjcm9sbCA9IHVzZU9yaWdpblNjcm9sbChpc1Njcm9sbEF0VG9wLCBpc1Njcm9sbEF0Qm90dG9tKTtcbiAgZnVuY3Rpb24gb25XaGVlbChldmVudCkge1xuICAgIGlmICghaW5WaXJ0dWFsKSByZXR1cm47XG4gICAgcmFmLmNhbmNlbChuZXh0RnJhbWVSZWYuY3VycmVudCk7XG4gICAgdmFyIGRlbHRhWSA9IGV2ZW50LmRlbHRhWTtcbiAgICBvZmZzZXRSZWYuY3VycmVudCArPSBkZWx0YVk7XG4gICAgd2hlZWxWYWx1ZVJlZi5jdXJyZW50ID0gZGVsdGFZO1xuICAgIC8vIERvIG5vdGhpbmcgd2hlbiBzY3JvbGwgYXQgdGhlIGVkZ2UsIFNraXAgY2hlY2sgd2hlbiBpcyBpbiBzY3JvbGxcbiAgICBpZiAob3JpZ2luU2Nyb2xsKGRlbHRhWSkpIHJldHVybjtcbiAgICAvLyBQcm94eSBvZiBzY3JvbGwgZXZlbnRzXG4gICAgaWYgKCFpc0ZGKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBuZXh0RnJhbWVSZWYuY3VycmVudCA9IHJhZihmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBQYXRjaCBhIG11bHRpcGxlIGZvciBGaXJlZm94IHRvIGZpeCB3aGVlbCBudW1iZXIgdG9vIHNtYWxsXG4gICAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzI2MzcyI2lzc3VlY29tbWVudC02Nzk0NjAyNjZcbiAgICAgIHZhciBwYXRjaE11bHRpcGxlID0gaXNNb3VzZVNjcm9sbFJlZi5jdXJyZW50ID8gMTAgOiAxO1xuICAgICAgb25XaGVlbERlbHRhKG9mZnNldFJlZi5jdXJyZW50ICogcGF0Y2hNdWx0aXBsZSk7XG4gICAgICBvZmZzZXRSZWYuY3VycmVudCA9IDA7XG4gICAgfSk7XG4gIH1cbiAgLy8gQSBwYXRjaCBmb3IgZmlyZWZveFxuICBmdW5jdGlvbiBvbkZpcmVGb3hTY3JvbGwoZXZlbnQpIHtcbiAgICBpZiAoIWluVmlydHVhbCkgcmV0dXJuO1xuICAgIGlzTW91c2VTY3JvbGxSZWYuY3VycmVudCA9IGV2ZW50LmRldGFpbCA9PT0gd2hlZWxWYWx1ZVJlZi5jdXJyZW50O1xuICB9XG4gIHJldHVybiBbb25XaGVlbCwgb25GaXJlRm94U2Nyb2xsXTtcbn0iLCJpbXBvcnQgeyB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlTGF5b3V0RWZmZWN0IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUxheW91dEVmZmVjdFwiO1xudmFyIFNNT09USF9QVEcgPSAxNCAvIDE1O1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlTW9iaWxlVG91Y2hNb3ZlKGluVmlydHVhbCwgbGlzdFJlZiwgY2FsbGJhY2spIHtcbiAgdmFyIHRvdWNoZWRSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICB2YXIgdG91Y2hZUmVmID0gdXNlUmVmKDApO1xuICB2YXIgZWxlbWVudFJlZiA9IHVzZVJlZihudWxsKTtcbiAgLy8gU21vb3RoIHNjcm9sbFxuICB2YXIgaW50ZXJ2YWxSZWYgPSB1c2VSZWYobnVsbCk7XG4gIC8qIGVzbGludC1kaXNhYmxlIHByZWZlci1jb25zdCAqL1xuICB2YXIgY2xlYW5VcEV2ZW50cztcbiAgdmFyIG9uVG91Y2hNb3ZlID0gZnVuY3Rpb24gb25Ub3VjaE1vdmUoZSkge1xuICAgIGlmICh0b3VjaGVkUmVmLmN1cnJlbnQpIHtcbiAgICAgIHZhciBjdXJyZW50WSA9IE1hdGguY2VpbChlLnRvdWNoZXNbMF0ucGFnZVkpO1xuICAgICAgdmFyIG9mZnNldFkgPSB0b3VjaFlSZWYuY3VycmVudCAtIGN1cnJlbnRZO1xuICAgICAgdG91Y2hZUmVmLmN1cnJlbnQgPSBjdXJyZW50WTtcbiAgICAgIGlmIChjYWxsYmFjayhvZmZzZXRZKSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgICAvLyBTbW9vdGggaW50ZXJ2YWxcbiAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxSZWYuY3VycmVudCk7XG4gICAgICBpbnRlcnZhbFJlZi5jdXJyZW50ID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgICAgICBvZmZzZXRZICo9IFNNT09USF9QVEc7XG4gICAgICAgIGlmICghY2FsbGJhY2sob2Zmc2V0WSwgdHJ1ZSkgfHwgTWF0aC5hYnMob2Zmc2V0WSkgPD0gMC4xKSB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbFJlZi5jdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgfSwgMTYpO1xuICAgIH1cbiAgfTtcbiAgdmFyIG9uVG91Y2hFbmQgPSBmdW5jdGlvbiBvblRvdWNoRW5kKCkge1xuICAgIHRvdWNoZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIGNsZWFuVXBFdmVudHMoKTtcbiAgfTtcbiAgdmFyIG9uVG91Y2hTdGFydCA9IGZ1bmN0aW9uIG9uVG91Y2hTdGFydChlKSB7XG4gICAgY2xlYW5VcEV2ZW50cygpO1xuICAgIGlmIChlLnRvdWNoZXMubGVuZ3RoID09PSAxICYmICF0b3VjaGVkUmVmLmN1cnJlbnQpIHtcbiAgICAgIHRvdWNoZWRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICB0b3VjaFlSZWYuY3VycmVudCA9IE1hdGguY2VpbChlLnRvdWNoZXNbMF0ucGFnZVkpO1xuICAgICAgZWxlbWVudFJlZi5jdXJyZW50ID0gZS50YXJnZXQ7XG4gICAgICBlbGVtZW50UmVmLmN1cnJlbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25Ub3VjaE1vdmUpO1xuICAgICAgZWxlbWVudFJlZi5jdXJyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgb25Ub3VjaEVuZCk7XG4gICAgfVxuICB9O1xuICBjbGVhblVwRXZlbnRzID0gZnVuY3Rpb24gY2xlYW5VcEV2ZW50cygpIHtcbiAgICBpZiAoZWxlbWVudFJlZi5jdXJyZW50KSB7XG4gICAgICBlbGVtZW50UmVmLmN1cnJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25Ub3VjaE1vdmUpO1xuICAgICAgZWxlbWVudFJlZi5jdXJyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgb25Ub3VjaEVuZCk7XG4gICAgfVxuICB9O1xuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChpblZpcnR1YWwpIHtcbiAgICAgIGxpc3RSZWYuY3VycmVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgb25Ub3VjaFN0YXJ0KTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfbGlzdFJlZiRjdXJyZW50O1xuICAgICAgKF9saXN0UmVmJGN1cnJlbnQgPSBsaXN0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9saXN0UmVmJGN1cnJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9saXN0UmVmJGN1cnJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uVG91Y2hTdGFydCk7XG4gICAgICBjbGVhblVwRXZlbnRzKCk7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsUmVmLmN1cnJlbnQpO1xuICAgIH07XG4gIH0sIFtpblZpcnR1YWxdKTtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcInByZWZpeENsc1wiLCBcImNsYXNzTmFtZVwiLCBcImhlaWdodFwiLCBcIml0ZW1IZWlnaHRcIiwgXCJmdWxsSGVpZ2h0XCIsIFwic3R5bGVcIiwgXCJkYXRhXCIsIFwiY2hpbGRyZW5cIiwgXCJpdGVtS2V5XCIsIFwidmlydHVhbFwiLCBcImRpcmVjdGlvblwiLCBcImNvbXBvbmVudFwiLCBcIm9uU2Nyb2xsXCIsIFwib25WaXNpYmxlQ2hhbmdlXCIsIFwiaW5uZXJQcm9wc1wiXTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBGaWxsZXIgZnJvbSAnLi9GaWxsZXInO1xuaW1wb3J0IFNjcm9sbEJhciBmcm9tICcuL1Njcm9sbEJhcic7XG5pbXBvcnQgdXNlQ2hpbGRyZW4gZnJvbSAnLi9ob29rcy91c2VDaGlsZHJlbic7XG5pbXBvcnQgdXNlSGVpZ2h0cyBmcm9tICcuL2hvb2tzL3VzZUhlaWdodHMnO1xuaW1wb3J0IHVzZVNjcm9sbFRvIGZyb20gJy4vaG9va3MvdXNlU2Nyb2xsVG8nO1xuaW1wb3J0IHVzZURpZmZJdGVtIGZyb20gJy4vaG9va3MvdXNlRGlmZkl0ZW0nO1xuaW1wb3J0IHVzZUZyYW1lV2hlZWwgZnJvbSAnLi9ob29rcy91c2VGcmFtZVdoZWVsJztcbmltcG9ydCB1c2VNb2JpbGVUb3VjaE1vdmUgZnJvbSAnLi9ob29rcy91c2VNb2JpbGVUb3VjaE1vdmUnO1xuaW1wb3J0IHVzZU9yaWdpblNjcm9sbCBmcm9tICcuL2hvb2tzL3VzZU9yaWdpblNjcm9sbCc7XG5pbXBvcnQgdXNlTGF5b3V0RWZmZWN0IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUxheW91dEVmZmVjdFwiO1xudmFyIEVNUFRZX0RBVEEgPSBbXTtcbnZhciBTY3JvbGxTdHlsZSA9IHtcbiAgb3ZlcmZsb3dZOiAnYXV0bycsXG4gIG92ZXJmbG93QW5jaG9yOiAnbm9uZSdcbn07XG5leHBvcnQgZnVuY3Rpb24gUmF3TGlzdChwcm9wcywgcmVmKSB7XG4gIHZhciBfcHJvcHMkcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHByZWZpeENscyA9IF9wcm9wcyRwcmVmaXhDbHMgPT09IHZvaWQgMCA/ICdyYy12aXJ0dWFsLWxpc3QnIDogX3Byb3BzJHByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgaGVpZ2h0ID0gcHJvcHMuaGVpZ2h0LFxuICAgIGl0ZW1IZWlnaHQgPSBwcm9wcy5pdGVtSGVpZ2h0LFxuICAgIF9wcm9wcyRmdWxsSGVpZ2h0ID0gcHJvcHMuZnVsbEhlaWdodCxcbiAgICBmdWxsSGVpZ2h0ID0gX3Byb3BzJGZ1bGxIZWlnaHQgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkZnVsbEhlaWdodCxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIGRhdGEgPSBwcm9wcy5kYXRhLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgaXRlbUtleSA9IHByb3BzLml0ZW1LZXksXG4gICAgdmlydHVhbCA9IHByb3BzLnZpcnR1YWwsXG4gICAgZGlyZWN0aW9uID0gcHJvcHMuZGlyZWN0aW9uLFxuICAgIF9wcm9wcyRjb21wb25lbnQgPSBwcm9wcy5jb21wb25lbnQsXG4gICAgQ29tcG9uZW50ID0gX3Byb3BzJGNvbXBvbmVudCA9PT0gdm9pZCAwID8gJ2RpdicgOiBfcHJvcHMkY29tcG9uZW50LFxuICAgIG9uU2Nyb2xsID0gcHJvcHMub25TY3JvbGwsXG4gICAgb25WaXNpYmxlQ2hhbmdlID0gcHJvcHMub25WaXNpYmxlQ2hhbmdlLFxuICAgIGlubmVyUHJvcHMgPSBwcm9wcy5pbm5lclByb3BzLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE1JU0MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciB1c2VWaXJ0dWFsID0gISEodmlydHVhbCAhPT0gZmFsc2UgJiYgaGVpZ2h0ICYmIGl0ZW1IZWlnaHQpO1xuICB2YXIgaW5WaXJ0dWFsID0gdXNlVmlydHVhbCAmJiBkYXRhICYmIGl0ZW1IZWlnaHQgKiBkYXRhLmxlbmd0aCA+IGhlaWdodDtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKDApLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIHNjcm9sbFRvcCA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0U2Nyb2xsVG9wID0gX3VzZVN0YXRlMlsxXTtcbiAgdmFyIF91c2VTdGF0ZTMgPSB1c2VTdGF0ZShmYWxzZSksXG4gICAgX3VzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTMsIDIpLFxuICAgIHNjcm9sbE1vdmluZyA9IF91c2VTdGF0ZTRbMF0sXG4gICAgc2V0U2Nyb2xsTW92aW5nID0gX3VzZVN0YXRlNFsxXTtcbiAgdmFyIG1lcmdlZENsYXNzTmFtZSA9IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgY2xhc3NOYW1lKTtcbiAgdmFyIG1lcmdlZERhdGEgPSBkYXRhIHx8IEVNUFRZX0RBVEE7XG4gIHZhciBjb21wb25lbnRSZWYgPSB1c2VSZWYoKTtcbiAgdmFyIGZpbGxlcklubmVyUmVmID0gdXNlUmVmKCk7XG4gIHZhciBzY3JvbGxCYXJSZWYgPSB1c2VSZWYoKTsgLy8gSGFjayBvbiBzY3JvbGxiYXIgdG8gZW5hYmxlIGZsYXNoIGNhbGxcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJdGVtIEtleSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBnZXRLZXkgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoaXRlbSkge1xuICAgIGlmICh0eXBlb2YgaXRlbUtleSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGl0ZW1LZXkoaXRlbSk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtID09PSBudWxsIHx8IGl0ZW0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGl0ZW1baXRlbUtleV07XG4gIH0sIFtpdGVtS2V5XSk7XG4gIHZhciBzaGFyZWRDb25maWcgPSB7XG4gICAgZ2V0S2V5OiBnZXRLZXlcbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2Nyb2xsID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGZ1bmN0aW9uIHN5bmNTY3JvbGxUb3AobmV3VG9wKSB7XG4gICAgc2V0U2Nyb2xsVG9wKGZ1bmN0aW9uIChvcmlnaW4pIHtcbiAgICAgIHZhciB2YWx1ZTtcbiAgICAgIGlmICh0eXBlb2YgbmV3VG9wID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhbHVlID0gbmV3VG9wKG9yaWdpbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IG5ld1RvcDtcbiAgICAgIH1cbiAgICAgIHZhciBhbGlnbmVkVG9wID0ga2VlcEluUmFuZ2UodmFsdWUpO1xuICAgICAgY29tcG9uZW50UmVmLmN1cnJlbnQuc2Nyb2xsVG9wID0gYWxpZ25lZFRvcDtcbiAgICAgIHJldHVybiBhbGlnbmVkVG9wO1xuICAgIH0pO1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IExlZ2FjeSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQdXQgcmVmIGhlcmUgc2luY2UgdGhlIHJhbmdlIGlzIGdlbmVyYXRlIGJ5IGZvbGxvd1xuICB2YXIgcmFuZ2VSZWYgPSB1c2VSZWYoe1xuICAgIHN0YXJ0OiAwLFxuICAgIGVuZDogbWVyZ2VkRGF0YS5sZW5ndGhcbiAgfSk7XG4gIHZhciBkaWZmSXRlbVJlZiA9IHVzZVJlZigpO1xuICB2YXIgX3VzZURpZmZJdGVtID0gdXNlRGlmZkl0ZW0obWVyZ2VkRGF0YSwgZ2V0S2V5KSxcbiAgICBfdXNlRGlmZkl0ZW0yID0gX3NsaWNlZFRvQXJyYXkoX3VzZURpZmZJdGVtLCAxKSxcbiAgICBkaWZmSXRlbSA9IF91c2VEaWZmSXRlbTJbMF07XG4gIGRpZmZJdGVtUmVmLmN1cnJlbnQgPSBkaWZmSXRlbTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSGVpZ2h0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfdXNlSGVpZ2h0cyA9IHVzZUhlaWdodHMoZ2V0S2V5LCBudWxsLCBudWxsKSxcbiAgICBfdXNlSGVpZ2h0czIgPSBfc2xpY2VkVG9BcnJheShfdXNlSGVpZ2h0cywgNCksXG4gICAgc2V0SW5zdGFuY2VSZWYgPSBfdXNlSGVpZ2h0czJbMF0sXG4gICAgY29sbGVjdEhlaWdodCA9IF91c2VIZWlnaHRzMlsxXSxcbiAgICBoZWlnaHRzID0gX3VzZUhlaWdodHMyWzJdLFxuICAgIGhlaWdodFVwZGF0ZWRNYXJrID0gX3VzZUhlaWdodHMyWzNdO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBWaXNpYmxlIENhbGN1bGF0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF9SZWFjdCR1c2VNZW1vID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXVzZVZpcnR1YWwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzY3JvbGxIZWlnaHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICBlbmQ6IG1lcmdlZERhdGEubGVuZ3RoIC0gMSxcbiAgICAgICAgICBvZmZzZXQ6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgLy8gQWx3YXlzIHVzZSB2aXJ0dWFsIHNjcm9sbCBiYXIgaW4gYXZvaWQgc2hha2luZ1xuICAgICAgaWYgKCFpblZpcnR1YWwpIHtcbiAgICAgICAgdmFyIF9maWxsZXJJbm5lclJlZiRjdXJyZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzY3JvbGxIZWlnaHQ6ICgoX2ZpbGxlcklubmVyUmVmJGN1cnJlID0gZmlsbGVySW5uZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2ZpbGxlcklubmVyUmVmJGN1cnJlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZmlsbGVySW5uZXJSZWYkY3VycmUub2Zmc2V0SGVpZ2h0KSB8fCAwLFxuICAgICAgICAgIHN0YXJ0OiAwLFxuICAgICAgICAgIGVuZDogbWVyZ2VkRGF0YS5sZW5ndGggLSAxLFxuICAgICAgICAgIG9mZnNldDogdW5kZWZpbmVkXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2YXIgaXRlbVRvcCA9IDA7XG4gICAgICB2YXIgc3RhcnRJbmRleDtcbiAgICAgIHZhciBzdGFydE9mZnNldDtcbiAgICAgIHZhciBlbmRJbmRleDtcbiAgICAgIHZhciBkYXRhTGVuID0gbWVyZ2VkRGF0YS5sZW5ndGg7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFMZW47IGkgKz0gMSkge1xuICAgICAgICB2YXIgaXRlbSA9IG1lcmdlZERhdGFbaV07XG4gICAgICAgIHZhciBrZXkgPSBnZXRLZXkoaXRlbSk7XG4gICAgICAgIHZhciBjYWNoZUhlaWdodCA9IGhlaWdodHMuZ2V0KGtleSk7XG4gICAgICAgIHZhciBjdXJyZW50SXRlbUJvdHRvbSA9IGl0ZW1Ub3AgKyAoY2FjaGVIZWlnaHQgPT09IHVuZGVmaW5lZCA/IGl0ZW1IZWlnaHQgOiBjYWNoZUhlaWdodCk7XG4gICAgICAgIC8vIENoZWNrIGl0ZW0gdG9wIGluIHRoZSByYW5nZVxuICAgICAgICBpZiAoY3VycmVudEl0ZW1Cb3R0b20gPj0gc2Nyb2xsVG9wICYmIHN0YXJ0SW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHN0YXJ0SW5kZXggPSBpO1xuICAgICAgICAgIHN0YXJ0T2Zmc2V0ID0gaXRlbVRvcDtcbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayBpdGVtIGJvdHRvbSBpbiB0aGUgcmFuZ2UuIFdlIHdpbGwgcmVuZGVyIGFkZGl0aW9uYWwgb25lIGl0ZW0gZm9yIG1vdGlvbiB1c2FnZVxuICAgICAgICBpZiAoY3VycmVudEl0ZW1Cb3R0b20gPiBzY3JvbGxUb3AgKyBoZWlnaHQgJiYgZW5kSW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGVuZEluZGV4ID0gaTtcbiAgICAgICAgfVxuICAgICAgICBpdGVtVG9wID0gY3VycmVudEl0ZW1Cb3R0b207XG4gICAgICB9XG4gICAgICAvLyBXaGVuIHNjcm9sbFRvcCBhdCB0aGUgZW5kIGJ1dCBkYXRhIGN1dCB0byBzbWFsbCBjb3VudCB3aWxsIHJlYWNoIHRoaXNcbiAgICAgIGlmIChzdGFydEluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc3RhcnRJbmRleCA9IDA7XG4gICAgICAgIHN0YXJ0T2Zmc2V0ID0gMDtcbiAgICAgICAgZW5kSW5kZXggPSBNYXRoLmNlaWwoaGVpZ2h0IC8gaXRlbUhlaWdodCk7XG4gICAgICB9XG4gICAgICBpZiAoZW5kSW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbmRJbmRleCA9IG1lcmdlZERhdGEubGVuZ3RoIC0gMTtcbiAgICAgIH1cbiAgICAgIC8vIEdpdmUgY2FjaGUgdG8gaW1wcm92ZSBzY3JvbGwgZXhwZXJpZW5jZVxuICAgICAgZW5kSW5kZXggPSBNYXRoLm1pbihlbmRJbmRleCArIDEsIG1lcmdlZERhdGEubGVuZ3RoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNjcm9sbEhlaWdodDogaXRlbVRvcCxcbiAgICAgICAgc3RhcnQ6IHN0YXJ0SW5kZXgsXG4gICAgICAgIGVuZDogZW5kSW5kZXgsXG4gICAgICAgIG9mZnNldDogc3RhcnRPZmZzZXRcbiAgICAgIH07XG4gICAgfSwgW2luVmlydHVhbCwgdXNlVmlydHVhbCwgc2Nyb2xsVG9wLCBtZXJnZWREYXRhLCBoZWlnaHRVcGRhdGVkTWFyaywgaGVpZ2h0XSksXG4gICAgc2Nyb2xsSGVpZ2h0ID0gX1JlYWN0JHVzZU1lbW8uc2Nyb2xsSGVpZ2h0LFxuICAgIHN0YXJ0ID0gX1JlYWN0JHVzZU1lbW8uc3RhcnQsXG4gICAgZW5kID0gX1JlYWN0JHVzZU1lbW8uZW5kLFxuICAgIG9mZnNldCA9IF9SZWFjdCR1c2VNZW1vLm9mZnNldDtcbiAgcmFuZ2VSZWYuY3VycmVudC5zdGFydCA9IHN0YXJ0O1xuICByYW5nZVJlZi5jdXJyZW50LmVuZCA9IGVuZDtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJbiBSYW5nZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtYXhTY3JvbGxIZWlnaHQgPSBzY3JvbGxIZWlnaHQgLSBoZWlnaHQ7XG4gIHZhciBtYXhTY3JvbGxIZWlnaHRSZWYgPSB1c2VSZWYobWF4U2Nyb2xsSGVpZ2h0KTtcbiAgbWF4U2Nyb2xsSGVpZ2h0UmVmLmN1cnJlbnQgPSBtYXhTY3JvbGxIZWlnaHQ7XG4gIGZ1bmN0aW9uIGtlZXBJblJhbmdlKG5ld1Njcm9sbFRvcCkge1xuICAgIHZhciBuZXdUb3AgPSBuZXdTY3JvbGxUb3A7XG4gICAgaWYgKCFOdW1iZXIuaXNOYU4obWF4U2Nyb2xsSGVpZ2h0UmVmLmN1cnJlbnQpKSB7XG4gICAgICBuZXdUb3AgPSBNYXRoLm1pbihuZXdUb3AsIG1heFNjcm9sbEhlaWdodFJlZi5jdXJyZW50KTtcbiAgICB9XG4gICAgbmV3VG9wID0gTWF0aC5tYXgobmV3VG9wLCAwKTtcbiAgICByZXR1cm4gbmV3VG9wO1xuICB9XG4gIHZhciBpc1Njcm9sbEF0VG9wID0gc2Nyb2xsVG9wIDw9IDA7XG4gIHZhciBpc1Njcm9sbEF0Qm90dG9tID0gc2Nyb2xsVG9wID49IG1heFNjcm9sbEhlaWdodDtcbiAgdmFyIG9yaWdpblNjcm9sbCA9IHVzZU9yaWdpblNjcm9sbChpc1Njcm9sbEF0VG9wLCBpc1Njcm9sbEF0Qm90dG9tKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2Nyb2xsID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGZ1bmN0aW9uIG9uU2Nyb2xsQmFyKG5ld1Njcm9sbFRvcCkge1xuICAgIHZhciBuZXdUb3AgPSBuZXdTY3JvbGxUb3A7XG4gICAgc3luY1Njcm9sbFRvcChuZXdUb3ApO1xuICB9XG4gIC8vIFdoZW4gZGF0YSBzaXplIHJlZHVjZS4gSXQgbWF5IHRyaWdnZXIgbmF0aXZlIHNjcm9sbCBldmVudCBiYWNrIHRvIGZpdCBzY3JvbGwgcG9zaXRpb25cbiAgZnVuY3Rpb24gb25GYWxsYmFja1Njcm9sbChlKSB7XG4gICAgdmFyIG5ld1Njcm9sbFRvcCA9IGUuY3VycmVudFRhcmdldC5zY3JvbGxUb3A7XG4gICAgaWYgKG5ld1Njcm9sbFRvcCAhPT0gc2Nyb2xsVG9wKSB7XG4gICAgICBzeW5jU2Nyb2xsVG9wKG5ld1Njcm9sbFRvcCk7XG4gICAgfVxuICAgIC8vIFRyaWdnZXIgb3JpZ2luIG9uU2Nyb2xsXG4gICAgb25TY3JvbGwgPT09IG51bGwgfHwgb25TY3JvbGwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uU2Nyb2xsKGUpO1xuICB9XG4gIC8vIFNpbmNlIHRoaXMgYWRkZWQgaW4gZ2xvYmFsLHNob3VsZCB1c2UgcmVmIHRvIGtlZXAgdXBkYXRlXG4gIHZhciBfdXNlRnJhbWVXaGVlbCA9IHVzZUZyYW1lV2hlZWwodXNlVmlydHVhbCwgaXNTY3JvbGxBdFRvcCwgaXNTY3JvbGxBdEJvdHRvbSwgZnVuY3Rpb24gKG9mZnNldFkpIHtcbiAgICAgIHN5bmNTY3JvbGxUb3AoZnVuY3Rpb24gKHRvcCkge1xuICAgICAgICB2YXIgbmV3VG9wID0gdG9wICsgb2Zmc2V0WTtcbiAgICAgICAgcmV0dXJuIG5ld1RvcDtcbiAgICAgIH0pO1xuICAgIH0pLFxuICAgIF91c2VGcmFtZVdoZWVsMiA9IF9zbGljZWRUb0FycmF5KF91c2VGcmFtZVdoZWVsLCAyKSxcbiAgICBvblJhd1doZWVsID0gX3VzZUZyYW1lV2hlZWwyWzBdLFxuICAgIG9uRmlyZUZveFNjcm9sbCA9IF91c2VGcmFtZVdoZWVsMlsxXTtcbiAgLy8gTW9iaWxlIHRvdWNoIG1vdmVcbiAgdXNlTW9iaWxlVG91Y2hNb3ZlKHVzZVZpcnR1YWwsIGNvbXBvbmVudFJlZiwgZnVuY3Rpb24gKGRlbHRhWSwgc21vb3RoT2Zmc2V0KSB7XG4gICAgaWYgKG9yaWdpblNjcm9sbChkZWx0YVksIHNtb290aE9mZnNldCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgb25SYXdXaGVlbCh7XG4gICAgICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24gcHJldmVudERlZmF1bHQoKSB7fSxcbiAgICAgIGRlbHRhWTogZGVsdGFZXG4gICAgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIC8vIEZpcmVmb3ggb25seVxuICAgIGZ1bmN0aW9uIG9uTW96TW91c2VQaXhlbFNjcm9sbChlKSB7XG4gICAgICBpZiAodXNlVmlydHVhbCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbXBvbmVudFJlZi5jdXJyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgb25SYXdXaGVlbCk7XG4gICAgY29tcG9uZW50UmVmLmN1cnJlbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NTW91c2VTY3JvbGwnLCBvbkZpcmVGb3hTY3JvbGwpO1xuICAgIGNvbXBvbmVudFJlZi5jdXJyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ01vek1vdXNlUGl4ZWxTY3JvbGwnLCBvbk1vek1vdXNlUGl4ZWxTY3JvbGwpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoY29tcG9uZW50UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgY29tcG9uZW50UmVmLmN1cnJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBvblJhd1doZWVsKTtcbiAgICAgICAgY29tcG9uZW50UmVmLmN1cnJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignRE9NTW91c2VTY3JvbGwnLCBvbkZpcmVGb3hTY3JvbGwpO1xuICAgICAgICBjb21wb25lbnRSZWYuY3VycmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdNb3pNb3VzZVBpeGVsU2Nyb2xsJywgb25Nb3pNb3VzZVBpeGVsU2Nyb2xsKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBbdXNlVmlydHVhbF0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVmID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHNjcm9sbFRvID0gdXNlU2Nyb2xsVG8oY29tcG9uZW50UmVmLCBtZXJnZWREYXRhLCBoZWlnaHRzLCBpdGVtSGVpZ2h0LCBnZXRLZXksIGNvbGxlY3RIZWlnaHQsIHN5bmNTY3JvbGxUb3AsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3Njcm9sbEJhclJlZiRjdXJyZW50O1xuICAgIChfc2Nyb2xsQmFyUmVmJGN1cnJlbnQgPSBzY3JvbGxCYXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX3Njcm9sbEJhclJlZiRjdXJyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfc2Nyb2xsQmFyUmVmJGN1cnJlbnQuZGVsYXlIaWRkZW4oKTtcbiAgfSk7XG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjcm9sbFRvOiBzY3JvbGxUb1xuICAgIH07XG4gIH0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFZmZlY3QgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqIFdlIG5lZWQgdG9sZCBvdXRzaWRlIHRoYXQgc29tZSBsaXN0IG5vdCByZW5kZXJlZCAqL1xuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChvblZpc2libGVDaGFuZ2UpIHtcbiAgICAgIHZhciByZW5kZXJMaXN0ID0gbWVyZ2VkRGF0YS5zbGljZShzdGFydCwgZW5kICsgMSk7XG4gICAgICBvblZpc2libGVDaGFuZ2UocmVuZGVyTGlzdCwgbWVyZ2VkRGF0YSk7XG4gICAgfVxuICB9LCBbc3RhcnQsIGVuZCwgbWVyZ2VkRGF0YV0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGxpc3RDaGlsZHJlbiA9IHVzZUNoaWxkcmVuKG1lcmdlZERhdGEsIHN0YXJ0LCBlbmQsIHNldEluc3RhbmNlUmVmLCBjaGlsZHJlbiwgc2hhcmVkQ29uZmlnKTtcbiAgdmFyIGNvbXBvbmVudFN0eWxlID0gbnVsbDtcbiAgaWYgKGhlaWdodCkge1xuICAgIGNvbXBvbmVudFN0eWxlID0gX29iamVjdFNwcmVhZChfZGVmaW5lUHJvcGVydHkoe30sIGZ1bGxIZWlnaHQgPyAnaGVpZ2h0JyA6ICdtYXhIZWlnaHQnLCBoZWlnaHQpLCBTY3JvbGxTdHlsZSk7XG4gICAgaWYgKHVzZVZpcnR1YWwpIHtcbiAgICAgIGNvbXBvbmVudFN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nO1xuICAgICAgaWYgKHNjcm9sbE1vdmluZykge1xuICAgICAgICBjb21wb25lbnRTdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0eWxlKSwge30sIHtcbiAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnXG4gICAgfSksXG4gICAgY2xhc3NOYW1lOiBtZXJnZWRDbGFzc05hbWVcbiAgfSwgcmVzdFByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhvbGRlclwiKSxcbiAgICBzdHlsZTogY29tcG9uZW50U3R5bGUsXG4gICAgcmVmOiBjb21wb25lbnRSZWYsXG4gICAgb25TY3JvbGw6IG9uRmFsbGJhY2tTY3JvbGxcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRmlsbGVyLCB7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgaGVpZ2h0OiBzY3JvbGxIZWlnaHQsXG4gICAgb2Zmc2V0OiBvZmZzZXQsXG4gICAgb25Jbm5lclJlc2l6ZTogY29sbGVjdEhlaWdodCxcbiAgICByZWY6IGZpbGxlcklubmVyUmVmLFxuICAgIGlubmVyUHJvcHM6IGlubmVyUHJvcHNcbiAgfSwgbGlzdENoaWxkcmVuKSksIHVzZVZpcnR1YWwgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2Nyb2xsQmFyLCB7XG4gICAgcmVmOiBzY3JvbGxCYXJSZWYsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgc2Nyb2xsVG9wOiBzY3JvbGxUb3AsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgc2Nyb2xsSGVpZ2h0OiBzY3JvbGxIZWlnaHQsXG4gICAgY291bnQ6IG1lcmdlZERhdGEubGVuZ3RoLFxuICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uLFxuICAgIG9uU2Nyb2xsOiBvblNjcm9sbEJhcixcbiAgICBvblN0YXJ0TW92ZTogZnVuY3Rpb24gb25TdGFydE1vdmUoKSB7XG4gICAgICBzZXRTY3JvbGxNb3ZpbmcodHJ1ZSk7XG4gICAgfSxcbiAgICBvblN0b3BNb3ZlOiBmdW5jdGlvbiBvblN0b3BNb3ZlKCkge1xuICAgICAgc2V0U2Nyb2xsTW92aW5nKGZhbHNlKTtcbiAgICB9XG4gIH0pKTtcbn1cbnZhciBMaXN0ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoUmF3TGlzdCk7XG5MaXN0LmRpc3BsYXlOYW1lID0gJ0xpc3QnO1xuZXhwb3J0IGRlZmF1bHQgTGlzdDsiLCIvKiBpc3RhbmJ1bCBpZ25vcmUgZmlsZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGxhdGZvcm1NYWMoKSB7XG4gIHJldHVybiAvKG1hY1xcc29zfG1hY2ludG9zaCkvaS50ZXN0KG5hdmlnYXRvci5hcHBWZXJzaW9uKTtcbn0iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgU2VsZWN0Q29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuZXhwb3J0IGRlZmF1bHQgU2VsZWN0Q29udGV4dDsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xudmFyIF9leGNsdWRlZCA9IFtcImRpc2FibGVkXCIsIFwidGl0bGVcIiwgXCJjaGlsZHJlblwiLCBcInN0eWxlXCIsIFwiY2xhc3NOYW1lXCJdO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IEtleUNvZGUgZnJvbSBcInJjLXV0aWwvZXMvS2V5Q29kZVwiO1xuaW1wb3J0IG9taXQgZnJvbSBcInJjLXV0aWwvZXMvb21pdFwiO1xuaW1wb3J0IHBpY2tBdHRycyBmcm9tIFwicmMtdXRpbC9lcy9waWNrQXR0cnNcIjtcbmltcG9ydCB1c2VNZW1vIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lbW9cIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IExpc3QgZnJvbSAncmMtdmlydHVhbC1saXN0JztcbmltcG9ydCBUcmFuc0J0biBmcm9tIFwiLi9UcmFuc0J0blwiO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybU1hYyB9IGZyb20gXCIuL3V0aWxzL3BsYXRmb3JtVXRpbFwiO1xuaW1wb3J0IHVzZUJhc2VQcm9wcyBmcm9tIFwiLi9ob29rcy91c2VCYXNlUHJvcHNcIjtcbmltcG9ydCBTZWxlY3RDb250ZXh0IGZyb20gXCIuL1NlbGVjdENvbnRleHRcIjtcbmZ1bmN0aW9uIGlzVGl0bGVUeXBlKGNvbnRlbnQpIHtcbiAgcmV0dXJuIHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgY29udGVudCA9PT0gJ251bWJlcic7XG59XG5cbi8qKlxuICogVXNpbmcgdmlydHVhbCBsaXN0IG9mIG9wdGlvbiBkaXNwbGF5LlxuICogV2lsbCBmYWxsYmFjayB0byBkb20gaWYgdXNlIGN1c3RvbWl6ZSByZW5kZXIuXG4gKi9cbnZhciBPcHRpb25MaXN0ID0gZnVuY3Rpb24gT3B0aW9uTGlzdChfLCByZWYpIHtcbiAgdmFyIF91c2VCYXNlUHJvcHMgPSB1c2VCYXNlUHJvcHMoKSxcbiAgICBwcmVmaXhDbHMgPSBfdXNlQmFzZVByb3BzLnByZWZpeENscyxcbiAgICBpZCA9IF91c2VCYXNlUHJvcHMuaWQsXG4gICAgb3BlbiA9IF91c2VCYXNlUHJvcHMub3BlbixcbiAgICBtdWx0aXBsZSA9IF91c2VCYXNlUHJvcHMubXVsdGlwbGUsXG4gICAgbW9kZSA9IF91c2VCYXNlUHJvcHMubW9kZSxcbiAgICBzZWFyY2hWYWx1ZSA9IF91c2VCYXNlUHJvcHMuc2VhcmNoVmFsdWUsXG4gICAgdG9nZ2xlT3BlbiA9IF91c2VCYXNlUHJvcHMudG9nZ2xlT3BlbixcbiAgICBub3RGb3VuZENvbnRlbnQgPSBfdXNlQmFzZVByb3BzLm5vdEZvdW5kQ29udGVudCxcbiAgICBvblBvcHVwU2Nyb2xsID0gX3VzZUJhc2VQcm9wcy5vblBvcHVwU2Nyb2xsO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFNlbGVjdENvbnRleHQpLFxuICAgIGZsYXR0ZW5PcHRpb25zID0gX1JlYWN0JHVzZUNvbnRleHQuZmxhdHRlbk9wdGlvbnMsXG4gICAgb25BY3RpdmVWYWx1ZSA9IF9SZWFjdCR1c2VDb250ZXh0Lm9uQWN0aXZlVmFsdWUsXG4gICAgZGVmYXVsdEFjdGl2ZUZpcnN0T3B0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGVmYXVsdEFjdGl2ZUZpcnN0T3B0aW9uLFxuICAgIG9uU2VsZWN0ID0gX1JlYWN0JHVzZUNvbnRleHQub25TZWxlY3QsXG4gICAgbWVudUl0ZW1TZWxlY3RlZEljb24gPSBfUmVhY3QkdXNlQ29udGV4dC5tZW51SXRlbVNlbGVjdGVkSWNvbixcbiAgICByYXdWYWx1ZXMgPSBfUmVhY3QkdXNlQ29udGV4dC5yYXdWYWx1ZXMsXG4gICAgZmllbGROYW1lcyA9IF9SZWFjdCR1c2VDb250ZXh0LmZpZWxkTmFtZXMsXG4gICAgdmlydHVhbCA9IF9SZWFjdCR1c2VDb250ZXh0LnZpcnR1YWwsXG4gICAgbGlzdEhlaWdodCA9IF9SZWFjdCR1c2VDb250ZXh0Lmxpc3RIZWlnaHQsXG4gICAgbGlzdEl0ZW1IZWlnaHQgPSBfUmVhY3QkdXNlQ29udGV4dC5saXN0SXRlbUhlaWdodDtcbiAgdmFyIGl0ZW1QcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW1cIik7XG4gIHZhciBtZW1vRmxhdHRlbk9wdGlvbnMgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZmxhdHRlbk9wdGlvbnM7XG4gIH0sIFtvcGVuLCBmbGF0dGVuT3B0aW9uc10sIGZ1bmN0aW9uIChwcmV2LCBuZXh0KSB7XG4gICAgcmV0dXJuIG5leHRbMF0gJiYgcHJldlsxXSAhPT0gbmV4dFsxXTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IExpc3QgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBsaXN0UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB2YXIgb25MaXN0TW91c2VEb3duID0gZnVuY3Rpb24gb25MaXN0TW91c2VEb3duKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfTtcbiAgdmFyIHNjcm9sbEludG9WaWV3ID0gZnVuY3Rpb24gc2Nyb2xsSW50b1ZpZXcoYXJncykge1xuICAgIGlmIChsaXN0UmVmLmN1cnJlbnQpIHtcbiAgICAgIGxpc3RSZWYuY3VycmVudC5zY3JvbGxUbyh0eXBlb2YgYXJncyA9PT0gJ251bWJlcicgPyB7XG4gICAgICAgIGluZGV4OiBhcmdzXG4gICAgICB9IDogYXJncyk7XG4gICAgfVxuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IEFjdGl2ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgZ2V0RW5hYmxlZEFjdGl2ZUluZGV4ID0gZnVuY3Rpb24gZ2V0RW5hYmxlZEFjdGl2ZUluZGV4KGluZGV4KSB7XG4gICAgdmFyIG9mZnNldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMTtcbiAgICB2YXIgbGVuID0gbWVtb0ZsYXR0ZW5PcHRpb25zLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICB2YXIgY3VycmVudCA9IChpbmRleCArIGkgKiBvZmZzZXQgKyBsZW4pICUgbGVuO1xuICAgICAgdmFyIF9tZW1vRmxhdHRlbk9wdGlvbnMkYyA9IG1lbW9GbGF0dGVuT3B0aW9uc1tjdXJyZW50XSxcbiAgICAgICAgZ3JvdXAgPSBfbWVtb0ZsYXR0ZW5PcHRpb25zJGMuZ3JvdXAsXG4gICAgICAgIGRhdGEgPSBfbWVtb0ZsYXR0ZW5PcHRpb25zJGMuZGF0YTtcbiAgICAgIGlmICghZ3JvdXAgJiYgIWRhdGEuZGlzYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnZXRFbmFibGVkQWN0aXZlSW5kZXgoMCk7XG4gICAgfSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgYWN0aXZlSW5kZXggPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldEFjdGl2ZUluZGV4ID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIHNldEFjdGl2ZSA9IGZ1bmN0aW9uIHNldEFjdGl2ZShpbmRleCkge1xuICAgIHZhciBmcm9tS2V5Ym9hcmQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICAgIHNldEFjdGl2ZUluZGV4KGluZGV4KTtcbiAgICB2YXIgaW5mbyA9IHtcbiAgICAgIHNvdXJjZTogZnJvbUtleWJvYXJkID8gJ2tleWJvYXJkJyA6ICdtb3VzZSdcbiAgICB9O1xuXG4gICAgLy8gVHJpZ2dlciBhY3RpdmUgZXZlbnRcbiAgICB2YXIgZmxhdHRlbkl0ZW0gPSBtZW1vRmxhdHRlbk9wdGlvbnNbaW5kZXhdO1xuICAgIGlmICghZmxhdHRlbkl0ZW0pIHtcbiAgICAgIG9uQWN0aXZlVmFsdWUobnVsbCwgLTEsIGluZm8pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBvbkFjdGl2ZVZhbHVlKGZsYXR0ZW5JdGVtLnZhbHVlLCBpbmRleCwgaW5mbyk7XG4gIH07XG5cbiAgLy8gQXV0byBhY3RpdmUgZmlyc3QgaXRlbSB3aGVuIGxpc3QgbGVuZ3RoIG9yIHNlYXJjaFZhbHVlIGNoYW5nZWRcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzZXRBY3RpdmUoZGVmYXVsdEFjdGl2ZUZpcnN0T3B0aW9uICE9PSBmYWxzZSA/IGdldEVuYWJsZWRBY3RpdmVJbmRleCgwKSA6IC0xKTtcbiAgfSwgW21lbW9GbGF0dGVuT3B0aW9ucy5sZW5ndGgsIHNlYXJjaFZhbHVlXSk7XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMzQ5NzVcbiAgdmFyIGlzU2VsZWN0ZWQgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gcmF3VmFsdWVzLmhhcyh2YWx1ZSkgJiYgbW9kZSAhPT0gJ2NvbWJvYm94JztcbiAgfSwgW21vZGUsIF90b0NvbnN1bWFibGVBcnJheShyYXdWYWx1ZXMpLnRvU3RyaW5nKCksIHJhd1ZhbHVlcy5zaXplXSk7XG5cbiAgLy8gQXV0byBzY3JvbGwgdG8gaXRlbSBwb3NpdGlvbiBpbiBzaW5nbGUgbW9kZVxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIFJlYWN0IHdpbGwgc2tpcCBgb25DaGFuZ2VgIHdoZW4gY29tcG9uZW50IHVwZGF0ZS5cbiAgICAgKiBgc2V0QWN0aXZlYCBmdW5jdGlvbiB3aWxsIGNhbGwgcm9vdCBhY2Nlc3NpYmlsaXR5IHN0YXRlIHVwZGF0ZSB3aGljaCBtYWtlcyByZS1yZW5kZXIuXG4gICAgICogU28gd2UgbmVlZCB0byBkZWxheSB0byBsZXQgSW5wdXQgY29tcG9uZW50IHRyaWdnZXIgb25DaGFuZ2UgZmlyc3QuXG4gICAgICovXG4gICAgdmFyIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFtdWx0aXBsZSAmJiBvcGVuICYmIHJhd1ZhbHVlcy5zaXplID09PSAxKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IEFycmF5LmZyb20ocmF3VmFsdWVzKVswXTtcbiAgICAgICAgdmFyIGluZGV4ID0gbWVtb0ZsYXR0ZW5PcHRpb25zLmZpbmRJbmRleChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICAgIHZhciBkYXRhID0gX3JlZi5kYXRhO1xuICAgICAgICAgIHJldHVybiBkYXRhLnZhbHVlID09PSB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICBzZXRBY3RpdmUoaW5kZXgpO1xuICAgICAgICAgIHNjcm9sbEludG9WaWV3KGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gRm9yY2UgdHJpZ2dlciBzY3JvbGxiYXIgdmlzaWJsZSB3aGVuIG9wZW5cbiAgICBpZiAob3Blbikge1xuICAgICAgdmFyIF9saXN0UmVmJGN1cnJlbnQ7XG4gICAgICAoX2xpc3RSZWYkY3VycmVudCA9IGxpc3RSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2xpc3RSZWYkY3VycmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2xpc3RSZWYkY3VycmVudC5zY3JvbGxUbyh1bmRlZmluZWQpO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgIH07XG4gIH0sIFtvcGVuLCBzZWFyY2hWYWx1ZV0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFZhbHVlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb25TZWxlY3RWYWx1ZSA9IGZ1bmN0aW9uIG9uU2VsZWN0VmFsdWUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb25TZWxlY3QodmFsdWUsIHtcbiAgICAgICAgc2VsZWN0ZWQ6ICFyYXdWYWx1ZXMuaGFzKHZhbHVlKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU2luZ2xlIG1vZGUgc2hvdWxkIGFsd2F5cyBjbG9zZSBieSBzZWxlY3RcbiAgICBpZiAoIW11bHRpcGxlKSB7XG4gICAgICB0b2dnbGVPcGVuKGZhbHNlKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBLZXlib2FyZCA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9uS2V5RG93bjogZnVuY3Rpb24gb25LZXlEb3duKGV2ZW50KSB7XG4gICAgICAgIHZhciB3aGljaCA9IGV2ZW50LndoaWNoLFxuICAgICAgICAgIGN0cmxLZXkgPSBldmVudC5jdHJsS2V5O1xuICAgICAgICBzd2l0Y2ggKHdoaWNoKSB7XG4gICAgICAgICAgLy8gPj4+IEFycm93IGtleXMgJiBjdHJsICsgbi9wIG9uIE1hY1xuICAgICAgICAgIGNhc2UgS2V5Q29kZS5OOlxuICAgICAgICAgIGNhc2UgS2V5Q29kZS5QOlxuICAgICAgICAgIGNhc2UgS2V5Q29kZS5VUDpcbiAgICAgICAgICBjYXNlIEtleUNvZGUuRE9XTjpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IDA7XG4gICAgICAgICAgICAgIGlmICh3aGljaCA9PT0gS2V5Q29kZS5VUCkge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IC0xO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoaWNoID09PSBLZXlDb2RlLkRPV04pIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSAxO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzUGxhdGZvcm1NYWMoKSAmJiBjdHJsS2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKHdoaWNoID09PSBLZXlDb2RlLk4pIHtcbiAgICAgICAgICAgICAgICAgIG9mZnNldCA9IDE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGljaCA9PT0gS2V5Q29kZS5QKSB7XG4gICAgICAgICAgICAgICAgICBvZmZzZXQgPSAtMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKG9mZnNldCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHZhciBuZXh0QWN0aXZlSW5kZXggPSBnZXRFbmFibGVkQWN0aXZlSW5kZXgoYWN0aXZlSW5kZXggKyBvZmZzZXQsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgc2Nyb2xsSW50b1ZpZXcobmV4dEFjdGl2ZUluZGV4KTtcbiAgICAgICAgICAgICAgICBzZXRBY3RpdmUobmV4dEFjdGl2ZUluZGV4LCB0cnVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIC8vID4+PiBTZWxlY3RcbiAgICAgICAgICBjYXNlIEtleUNvZGUuRU5URVI6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC8vIHZhbHVlXG4gICAgICAgICAgICAgIHZhciBpdGVtID0gbWVtb0ZsYXR0ZW5PcHRpb25zW2FjdGl2ZUluZGV4XTtcbiAgICAgICAgICAgICAgaWYgKGl0ZW0gJiYgIWl0ZW0uZGF0YS5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIG9uU2VsZWN0VmFsdWUoaXRlbS52YWx1ZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb25TZWxlY3RWYWx1ZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChvcGVuKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIC8vID4+PiBDbG9zZVxuICAgICAgICAgIGNhc2UgS2V5Q29kZS5FU0M6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRvZ2dsZU9wZW4oZmFsc2UpO1xuICAgICAgICAgICAgICBpZiAob3Blbikge1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvbktleVVwOiBmdW5jdGlvbiBvbktleVVwKCkge30sXG4gICAgICBzY3JvbGxUbzogZnVuY3Rpb24gc2Nyb2xsVG8oaW5kZXgpIHtcbiAgICAgICAgc2Nyb2xsSW50b1ZpZXcoaW5kZXgpO1xuICAgICAgfVxuICAgIH07XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBpZiAobWVtb0ZsYXR0ZW5PcHRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICByb2xlOiBcImxpc3Rib3hcIixcbiAgICAgIGlkOiBcIlwiLmNvbmNhdChpZCwgXCJfbGlzdFwiKSxcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoaXRlbVByZWZpeENscywgXCItZW1wdHlcIiksXG4gICAgICBvbk1vdXNlRG93bjogb25MaXN0TW91c2VEb3duXG4gICAgfSwgbm90Rm91bmRDb250ZW50KTtcbiAgfVxuICB2YXIgb21pdEZpZWxkTmFtZUxpc3QgPSBPYmplY3Qua2V5cyhmaWVsZE5hbWVzKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBmaWVsZE5hbWVzW2tleV07XG4gIH0pO1xuICB2YXIgZ2V0TGFiZWwgPSBmdW5jdGlvbiBnZXRMYWJlbChpdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW0ubGFiZWw7XG4gIH07XG4gIHZhciByZW5kZXJJdGVtID0gZnVuY3Rpb24gcmVuZGVySXRlbShpbmRleCkge1xuICAgIHZhciBpdGVtID0gbWVtb0ZsYXR0ZW5PcHRpb25zW2luZGV4XTtcbiAgICBpZiAoIWl0ZW0pIHJldHVybiBudWxsO1xuICAgIHZhciBpdGVtRGF0YSA9IGl0ZW0uZGF0YSB8fCB7fTtcbiAgICB2YXIgdmFsdWUgPSBpdGVtRGF0YS52YWx1ZTtcbiAgICB2YXIgZ3JvdXAgPSBpdGVtLmdyb3VwO1xuICAgIHZhciBhdHRycyA9IHBpY2tBdHRycyhpdGVtRGF0YSwgdHJ1ZSk7XG4gICAgdmFyIG1lcmdlZExhYmVsID0gZ2V0TGFiZWwoaXRlbSk7XG4gICAgcmV0dXJuIGl0ZW0gPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgICBcImFyaWEtbGFiZWxcIjogdHlwZW9mIG1lcmdlZExhYmVsID09PSAnc3RyaW5nJyAmJiAhZ3JvdXAgPyBtZXJnZWRMYWJlbCA6IG51bGxcbiAgICB9LCBhdHRycywge1xuICAgICAga2V5OiBpbmRleCxcbiAgICAgIHJvbGU6IGdyb3VwID8gJ3ByZXNlbnRhdGlvbicgOiAnb3B0aW9uJyxcbiAgICAgIGlkOiBcIlwiLmNvbmNhdChpZCwgXCJfbGlzdF9cIikuY29uY2F0KGluZGV4KSxcbiAgICAgIFwiYXJpYS1zZWxlY3RlZFwiOiBpc1NlbGVjdGVkKHZhbHVlKVxuICAgIH0pLCB2YWx1ZSkgOiBudWxsO1xuICB9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICByb2xlOiBcImxpc3Rib3hcIixcbiAgICBpZDogXCJcIi5jb25jYXQoaWQsIFwiX2xpc3RcIiksXG4gICAgc3R5bGU6IHtcbiAgICAgIGhlaWdodDogMCxcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nXG4gICAgfVxuICB9LCByZW5kZXJJdGVtKGFjdGl2ZUluZGV4IC0gMSksIHJlbmRlckl0ZW0oYWN0aXZlSW5kZXgpLCByZW5kZXJJdGVtKGFjdGl2ZUluZGV4ICsgMSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMaXN0LCB7XG4gICAgaXRlbUtleTogXCJrZXlcIixcbiAgICByZWY6IGxpc3RSZWYsXG4gICAgZGF0YTogbWVtb0ZsYXR0ZW5PcHRpb25zLFxuICAgIGhlaWdodDogbGlzdEhlaWdodCxcbiAgICBpdGVtSGVpZ2h0OiBsaXN0SXRlbUhlaWdodCxcbiAgICBmdWxsSGVpZ2h0OiBmYWxzZSxcbiAgICBvbk1vdXNlRG93bjogb25MaXN0TW91c2VEb3duLFxuICAgIG9uU2Nyb2xsOiBvblBvcHVwU2Nyb2xsLFxuICAgIHZpcnR1YWw6IHZpcnR1YWxcbiAgfSwgZnVuY3Rpb24gKGl0ZW0sIGl0ZW1JbmRleCkge1xuICAgIHZhciBfY2xhc3NOYW1lcztcbiAgICB2YXIgZ3JvdXAgPSBpdGVtLmdyb3VwLFxuICAgICAgZ3JvdXBPcHRpb24gPSBpdGVtLmdyb3VwT3B0aW9uLFxuICAgICAgZGF0YSA9IGl0ZW0uZGF0YSxcbiAgICAgIGxhYmVsID0gaXRlbS5sYWJlbCxcbiAgICAgIHZhbHVlID0gaXRlbS52YWx1ZTtcbiAgICB2YXIga2V5ID0gZGF0YS5rZXk7XG5cbiAgICAvLyBHcm91cFxuICAgIGlmIChncm91cCkge1xuICAgICAgdmFyIF9kYXRhJHRpdGxlO1xuICAgICAgdmFyIGdyb3VwVGl0bGUgPSAoX2RhdGEkdGl0bGUgPSBkYXRhLnRpdGxlKSAhPT0gbnVsbCAmJiBfZGF0YSR0aXRsZSAhPT0gdm9pZCAwID8gX2RhdGEkdGl0bGUgOiBpc1RpdGxlVHlwZShsYWJlbCkgPyBsYWJlbC50b1N0cmluZygpIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGl0ZW1QcmVmaXhDbHMsIFwiXCIuY29uY2F0KGl0ZW1QcmVmaXhDbHMsIFwiLWdyb3VwXCIpKSxcbiAgICAgICAgdGl0bGU6IGdyb3VwVGl0bGVcbiAgICAgIH0sIGxhYmVsICE9PSB1bmRlZmluZWQgPyBsYWJlbCA6IGtleSk7XG4gICAgfVxuICAgIHZhciBkaXNhYmxlZCA9IGRhdGEuZGlzYWJsZWQsXG4gICAgICB0aXRsZSA9IGRhdGEudGl0bGUsXG4gICAgICBjaGlsZHJlbiA9IGRhdGEuY2hpbGRyZW4sXG4gICAgICBzdHlsZSA9IGRhdGEuc3R5bGUsXG4gICAgICBjbGFzc05hbWUgPSBkYXRhLmNsYXNzTmFtZSxcbiAgICAgIG90aGVyUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoZGF0YSwgX2V4Y2x1ZGVkKTtcbiAgICB2YXIgcGFzc2VkUHJvcHMgPSBvbWl0KG90aGVyUHJvcHMsIG9taXRGaWVsZE5hbWVMaXN0KTtcblxuICAgIC8vIE9wdGlvblxuICAgIHZhciBzZWxlY3RlZCA9IGlzU2VsZWN0ZWQodmFsdWUpO1xuICAgIHZhciBvcHRpb25QcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChpdGVtUHJlZml4Q2xzLCBcIi1vcHRpb25cIik7XG4gICAgdmFyIG9wdGlvbkNsYXNzTmFtZSA9IGNsYXNzTmFtZXMoaXRlbVByZWZpeENscywgb3B0aW9uUHJlZml4Q2xzLCBjbGFzc05hbWUsIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KG9wdGlvblByZWZpeENscywgXCItZ3JvdXBlZFwiKSwgZ3JvdXBPcHRpb24pLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KG9wdGlvblByZWZpeENscywgXCItYWN0aXZlXCIpLCBhY3RpdmVJbmRleCA9PT0gaXRlbUluZGV4ICYmICFkaXNhYmxlZCksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQob3B0aW9uUHJlZml4Q2xzLCBcIi1kaXNhYmxlZFwiKSwgZGlzYWJsZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KG9wdGlvblByZWZpeENscywgXCItc2VsZWN0ZWRcIiksIHNlbGVjdGVkKSwgX2NsYXNzTmFtZXMpKTtcbiAgICB2YXIgbWVyZ2VkTGFiZWwgPSBnZXRMYWJlbChpdGVtKTtcbiAgICB2YXIgaWNvblZpc2libGUgPSAhbWVudUl0ZW1TZWxlY3RlZEljb24gfHwgdHlwZW9mIG1lbnVJdGVtU2VsZWN0ZWRJY29uID09PSAnZnVuY3Rpb24nIHx8IHNlbGVjdGVkO1xuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMzQxNDVcbiAgICB2YXIgY29udGVudCA9IHR5cGVvZiBtZXJnZWRMYWJlbCA9PT0gJ251bWJlcicgPyBtZXJnZWRMYWJlbCA6IG1lcmdlZExhYmVsIHx8IHZhbHVlO1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzI2NzE3XG4gICAgdmFyIG9wdGlvblRpdGxlID0gaXNUaXRsZVR5cGUoY29udGVudCkgPyBjb250ZW50LnRvU3RyaW5nKCkgOiB1bmRlZmluZWQ7XG4gICAgaWYgKHRpdGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9wdGlvblRpdGxlID0gdGl0bGU7XG4gICAgfVxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7fSwgcGlja0F0dHJzKHBhc3NlZFByb3BzKSwge1xuICAgICAgXCJhcmlhLXNlbGVjdGVkXCI6IHNlbGVjdGVkLFxuICAgICAgY2xhc3NOYW1lOiBvcHRpb25DbGFzc05hbWUsXG4gICAgICB0aXRsZTogb3B0aW9uVGl0bGUsXG4gICAgICBvbk1vdXNlTW92ZTogZnVuY3Rpb24gb25Nb3VzZU1vdmUoKSB7XG4gICAgICAgIGlmIChhY3RpdmVJbmRleCA9PT0gaXRlbUluZGV4IHx8IGRpc2FibGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNldEFjdGl2ZShpdGVtSW5kZXgpO1xuICAgICAgfSxcbiAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgIGlmICghZGlzYWJsZWQpIHtcbiAgICAgICAgICBvblNlbGVjdFZhbHVlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHN0eWxlOiBzdHlsZVxuICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KG9wdGlvblByZWZpeENscywgXCItY29udGVudFwiKVxuICAgIH0sIGNvbnRlbnQpLCAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQobWVudUl0ZW1TZWxlY3RlZEljb24pIHx8IHNlbGVjdGVkLCBpY29uVmlzaWJsZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmFuc0J0biwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChpdGVtUHJlZml4Q2xzLCBcIi1vcHRpb24tc3RhdGVcIiksXG4gICAgICBjdXN0b21pemVJY29uOiBtZW51SXRlbVNlbGVjdGVkSWNvbixcbiAgICAgIGN1c3RvbWl6ZUljb25Qcm9wczoge1xuICAgICAgICBpc1NlbGVjdGVkOiBzZWxlY3RlZFxuICAgICAgfVxuICAgIH0sIHNlbGVjdGVkID8gJ+KckycgOiBudWxsKSk7XG4gIH0pKTtcbn07XG52YXIgUmVmT3B0aW9uTGlzdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKE9wdGlvbkxpc3QpO1xuUmVmT3B0aW9uTGlzdC5kaXNwbGF5TmFtZSA9ICdPcHRpb25MaXN0JztcbmV4cG9ydCBkZWZhdWx0IFJlZk9wdGlvbkxpc3Q7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiaWRcIiwgXCJtb2RlXCIsIFwicHJlZml4Q2xzXCIsIFwiYmFja2ZpbGxcIiwgXCJmaWVsZE5hbWVzXCIsIFwiaW5wdXRWYWx1ZVwiLCBcInNlYXJjaFZhbHVlXCIsIFwib25TZWFyY2hcIiwgXCJhdXRvQ2xlYXJTZWFyY2hWYWx1ZVwiLCBcIm9uU2VsZWN0XCIsIFwib25EZXNlbGVjdFwiLCBcImRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aFwiLCBcImZpbHRlck9wdGlvblwiLCBcImZpbHRlclNvcnRcIiwgXCJvcHRpb25GaWx0ZXJQcm9wXCIsIFwib3B0aW9uTGFiZWxQcm9wXCIsIFwib3B0aW9uc1wiLCBcImNoaWxkcmVuXCIsIFwiZGVmYXVsdEFjdGl2ZUZpcnN0T3B0aW9uXCIsIFwibWVudUl0ZW1TZWxlY3RlZEljb25cIiwgXCJ2aXJ0dWFsXCIsIFwibGlzdEhlaWdodFwiLCBcImxpc3RJdGVtSGVpZ2h0XCIsIFwidmFsdWVcIiwgXCJkZWZhdWx0VmFsdWVcIiwgXCJsYWJlbEluVmFsdWVcIiwgXCJvbkNoYW5nZVwiXTtcbi8qKlxuICogVG8gbWF0Y2ggYWNjZXNzaWJpbGl0eSByZXF1aXJlbWVudCwgd2UgYWx3YXlzIHByb3ZpZGUgYW4gaW5wdXQgaW4gdGhlIGNvbXBvbmVudC5cbiAqIE90aGVyIGVsZW1lbnQgd2lsbCBub3Qgc2V0IGB0YWJJbmRleGAgdG8gYXZvaWQgYG9uQmx1cmAgc2VxdWVuY2UgcHJvYmxlbS5cbiAqIEZvciBmb2N1c2VkIHNlbGVjdCwgd2Ugc2V0IGBhcmlhLWxpdmU9XCJwb2xpdGVcImAgdG8gdXBkYXRlIHRoZSBhY2Nlc3NpYmlsaXR5IGNvbnRlbnQuXG4gKlxuICogcmVmOlxuICogLSBrZXlib2FyZDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQWNjZXNzaWJpbGl0eS9BUklBL1JvbGVzL2xpc3Rib3hfcm9sZSNLZXlib2FyZF9pbnRlcmFjdGlvbnNcbiAqXG4gKiBOZXcgYXBpOlxuICogLSBsaXN0SGVpZ2h0XG4gKiAtIGxpc3RJdGVtSGVpZ2h0XG4gKiAtIGNvbXBvbmVudFxuICpcbiAqIFJlbW92ZSBkZXByZWNhdGVkIGFwaTpcbiAqIC0gbXVsdGlwbGVcbiAqIC0gdGFnc1xuICogLSBjb21ib2JveFxuICogLSBmaXJzdEFjdGl2ZVZhbHVlXG4gKiAtIGRyb3Bkb3duTWVudVN0eWxlXG4gKiAtIG9wZW5DbGFzc05hbWUgKE5vdCBsaXN0IGluIGFwaSlcbiAqXG4gKiBVcGRhdGU6XG4gKiAtIGBiYWNrZmlsbGAgb25seSBzdXBwb3J0IGBjb21ib2JveGAgbW9kZVxuICogLSBgY29tYm9ib3hgIG1vZGUgbm90IHN1cHBvcnQgYGxhYmVsSW5WYWx1ZWAgc2luY2UgaXQncyBtZWFuaW5nbGVzc1xuICogLSBgZ2V0SW5wdXRFbGVtZW50YCBvbmx5IHN1cHBvcnQgYGNvbWJvYm94YCBtb2RlXG4gKiAtIGBvbkNoYW5nZWAgcmV0dXJuIE9wdGlvbkRhdGEgaW5zdGVhZCBvZiBSZWFjdE5vZGVcbiAqIC0gYGZpbHRlck9wdGlvbmAgYG9uQ2hhbmdlYCBgb25TZWxlY3RgIGFjY2VwdCBPcHRpb25EYXRhIGluc3RlYWQgb2YgUmVhY3ROb2RlXG4gKiAtIGBjb21ib2JveGAgbW9kZSB0cmlnZ2VyIGBvbkNoYW5nZWAgd2lsbCBnZXQgYHVuZGVmaW5lZGAgaWYgbm8gYHZhbHVlYCBtYXRjaCBpbiBPcHRpb25cbiAqIC0gYGNvbWJvYm94YCBtb2RlIG5vdCBzdXBwb3J0IGBvcHRpb25MYWJlbFByb3BgXG4gKi9cblxuaW1wb3J0IHVzZU1lcmdlZFN0YXRlIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lcmdlZFN0YXRlXCI7XG5pbXBvcnQgd2FybmluZyBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQmFzZVNlbGVjdCwgeyBpc011bHRpcGxlIH0gZnJvbSBcIi4vQmFzZVNlbGVjdFwiO1xuaW1wb3J0IHVzZUNhY2hlIGZyb20gXCIuL2hvb2tzL3VzZUNhY2hlXCI7XG5pbXBvcnQgdXNlRmlsdGVyT3B0aW9ucyBmcm9tIFwiLi9ob29rcy91c2VGaWx0ZXJPcHRpb25zXCI7XG5pbXBvcnQgdXNlSWQgZnJvbSBcIi4vaG9va3MvdXNlSWRcIjtcbmltcG9ydCB1c2VPcHRpb25zIGZyb20gXCIuL2hvb2tzL3VzZU9wdGlvbnNcIjtcbmltcG9ydCB1c2VSZWZGdW5jIGZyb20gXCIuL2hvb2tzL3VzZVJlZkZ1bmNcIjtcbmltcG9ydCBPcHRHcm91cCBmcm9tIFwiLi9PcHRHcm91cFwiO1xuaW1wb3J0IE9wdGlvbiBmcm9tIFwiLi9PcHRpb25cIjtcbmltcG9ydCBPcHRpb25MaXN0IGZyb20gXCIuL09wdGlvbkxpc3RcIjtcbmltcG9ydCBTZWxlY3RDb250ZXh0IGZyb20gXCIuL1NlbGVjdENvbnRleHRcIjtcbmltcG9ydCB7IGhhc1ZhbHVlLCB0b0FycmF5IH0gZnJvbSBcIi4vdXRpbHMvY29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgZmlsbEZpZWxkTmFtZXMsIGZsYXR0ZW5PcHRpb25zLCBpbmplY3RQcm9wc1dpdGhPcHRpb24gfSBmcm9tIFwiLi91dGlscy92YWx1ZVV0aWxcIjtcbmltcG9ydCB3YXJuaW5nUHJvcHMsIHsgd2FybmluZ051bGxPcHRpb25zIH0gZnJvbSBcIi4vdXRpbHMvd2FybmluZ1Byb3BzVXRpbFwiO1xudmFyIE9NSVRfRE9NX1BST1BTID0gWydpbnB1dFZhbHVlJ107XG5mdW5jdGlvbiBpc1Jhd1ZhbHVlKHZhbHVlKSB7XG4gIHJldHVybiAhdmFsdWUgfHwgX3R5cGVvZih2YWx1ZSkgIT09ICdvYmplY3QnO1xufVxudmFyIFNlbGVjdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBpZCA9IHByb3BzLmlkLFxuICAgIG1vZGUgPSBwcm9wcy5tb2RlLFxuICAgIF9wcm9wcyRwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgcHJlZml4Q2xzID0gX3Byb3BzJHByZWZpeENscyA9PT0gdm9pZCAwID8gJ3JjLXNlbGVjdCcgOiBfcHJvcHMkcHJlZml4Q2xzLFxuICAgIGJhY2tmaWxsID0gcHJvcHMuYmFja2ZpbGwsXG4gICAgZmllbGROYW1lcyA9IHByb3BzLmZpZWxkTmFtZXMsXG4gICAgaW5wdXRWYWx1ZSA9IHByb3BzLmlucHV0VmFsdWUsXG4gICAgc2VhcmNoVmFsdWUgPSBwcm9wcy5zZWFyY2hWYWx1ZSxcbiAgICBvblNlYXJjaCA9IHByb3BzLm9uU2VhcmNoLFxuICAgIF9wcm9wcyRhdXRvQ2xlYXJTZWFyYyA9IHByb3BzLmF1dG9DbGVhclNlYXJjaFZhbHVlLFxuICAgIGF1dG9DbGVhclNlYXJjaFZhbHVlID0gX3Byb3BzJGF1dG9DbGVhclNlYXJjID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJGF1dG9DbGVhclNlYXJjLFxuICAgIG9uU2VsZWN0ID0gcHJvcHMub25TZWxlY3QsXG4gICAgb25EZXNlbGVjdCA9IHByb3BzLm9uRGVzZWxlY3QsXG4gICAgX3Byb3BzJGRyb3Bkb3duTWF0Y2hTID0gcHJvcHMuZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoLFxuICAgIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCA9IF9wcm9wcyRkcm9wZG93bk1hdGNoUyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRkcm9wZG93bk1hdGNoUyxcbiAgICBmaWx0ZXJPcHRpb24gPSBwcm9wcy5maWx0ZXJPcHRpb24sXG4gICAgZmlsdGVyU29ydCA9IHByb3BzLmZpbHRlclNvcnQsXG4gICAgb3B0aW9uRmlsdGVyUHJvcCA9IHByb3BzLm9wdGlvbkZpbHRlclByb3AsXG4gICAgb3B0aW9uTGFiZWxQcm9wID0gcHJvcHMub3B0aW9uTGFiZWxQcm9wLFxuICAgIG9wdGlvbnMgPSBwcm9wcy5vcHRpb25zLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgZGVmYXVsdEFjdGl2ZUZpcnN0T3B0aW9uID0gcHJvcHMuZGVmYXVsdEFjdGl2ZUZpcnN0T3B0aW9uLFxuICAgIG1lbnVJdGVtU2VsZWN0ZWRJY29uID0gcHJvcHMubWVudUl0ZW1TZWxlY3RlZEljb24sXG4gICAgdmlydHVhbCA9IHByb3BzLnZpcnR1YWwsXG4gICAgX3Byb3BzJGxpc3RIZWlnaHQgPSBwcm9wcy5saXN0SGVpZ2h0LFxuICAgIGxpc3RIZWlnaHQgPSBfcHJvcHMkbGlzdEhlaWdodCA9PT0gdm9pZCAwID8gMjAwIDogX3Byb3BzJGxpc3RIZWlnaHQsXG4gICAgX3Byb3BzJGxpc3RJdGVtSGVpZ2h0ID0gcHJvcHMubGlzdEl0ZW1IZWlnaHQsXG4gICAgbGlzdEl0ZW1IZWlnaHQgPSBfcHJvcHMkbGlzdEl0ZW1IZWlnaHQgPT09IHZvaWQgMCA/IDIwIDogX3Byb3BzJGxpc3RJdGVtSGVpZ2h0LFxuICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgZGVmYXVsdFZhbHVlID0gcHJvcHMuZGVmYXVsdFZhbHVlLFxuICAgIGxhYmVsSW5WYWx1ZSA9IHByb3BzLmxhYmVsSW5WYWx1ZSxcbiAgICBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgdmFyIG1lcmdlZElkID0gdXNlSWQoaWQpO1xuICB2YXIgbXVsdGlwbGUgPSBpc011bHRpcGxlKG1vZGUpO1xuICB2YXIgY2hpbGRyZW5Bc0RhdGEgPSAhISghb3B0aW9ucyAmJiBjaGlsZHJlbik7XG4gIHZhciBtZXJnZWRGaWx0ZXJPcHRpb24gPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZmlsdGVyT3B0aW9uID09PSB1bmRlZmluZWQgJiYgbW9kZSA9PT0gJ2NvbWJvYm94Jykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZmlsdGVyT3B0aW9uO1xuICB9LCBbZmlsdGVyT3B0aW9uLCBtb2RlXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBGaWVsZE5hbWVzID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG1lcmdlZEZpZWxkTmFtZXMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZmlsbEZpZWxkTmFtZXMoZmllbGROYW1lcywgY2hpbGRyZW5Bc0RhdGEpO1xuICB9LCAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHMgKi9cbiAgW1xuICAvLyBXZSBzdHJpbmdpZnkgZmllbGROYW1lcyB0byBhdm9pZCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzLlxuICBKU09OLnN0cmluZ2lmeShmaWVsZE5hbWVzKSwgY2hpbGRyZW5Bc0RhdGFdXG4gIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzICovKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2VhcmNoID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZU1lcmdlZFN0YXRlID0gdXNlTWVyZ2VkU3RhdGUoJycsIHtcbiAgICAgIHZhbHVlOiBzZWFyY2hWYWx1ZSAhPT0gdW5kZWZpbmVkID8gc2VhcmNoVmFsdWUgOiBpbnB1dFZhbHVlLFxuICAgICAgcG9zdFN0YXRlOiBmdW5jdGlvbiBwb3N0U3RhdGUoc2VhcmNoKSB7XG4gICAgICAgIHJldHVybiBzZWFyY2ggfHwgJyc7XG4gICAgICB9XG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZSwgMiksXG4gICAgbWVyZ2VkU2VhcmNoVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzBdLFxuICAgIHNldFNlYXJjaFZhbHVlID0gX3VzZU1lcmdlZFN0YXRlMlsxXTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gT3B0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgcGFyc2VkT3B0aW9ucyA9IHVzZU9wdGlvbnMob3B0aW9ucywgY2hpbGRyZW4sIG1lcmdlZEZpZWxkTmFtZXMsIG9wdGlvbkZpbHRlclByb3AsIG9wdGlvbkxhYmVsUHJvcCk7XG4gIHZhciB2YWx1ZU9wdGlvbnMgPSBwYXJzZWRPcHRpb25zLnZhbHVlT3B0aW9ucyxcbiAgICBsYWJlbE9wdGlvbnMgPSBwYXJzZWRPcHRpb25zLmxhYmVsT3B0aW9ucyxcbiAgICBtZXJnZWRPcHRpb25zID0gcGFyc2VkT3B0aW9ucy5vcHRpb25zO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gV3JhcCBWYWx1ZSA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBjb252ZXJ0MkxhYmVsVmFsdWVzID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGRyYWZ0VmFsdWVzKSB7XG4gICAgLy8gQ29udmVydCB0byBhcnJheVxuICAgIHZhciB2YWx1ZUxpc3QgPSB0b0FycmF5KGRyYWZ0VmFsdWVzKTtcblxuICAgIC8vIENvbnZlcnQgdG8gbGFiZWxJblZhbHVlIHR5cGVcbiAgICByZXR1cm4gdmFsdWVMaXN0Lm1hcChmdW5jdGlvbiAodmFsKSB7XG4gICAgICB2YXIgcmF3VmFsdWU7XG4gICAgICB2YXIgcmF3TGFiZWw7XG4gICAgICB2YXIgcmF3S2V5O1xuICAgICAgdmFyIHJhd0Rpc2FibGVkO1xuICAgICAgdmFyIHJhd1RpdGxlO1xuXG4gICAgICAvLyBGaWxsIGxhYmVsICYgdmFsdWVcbiAgICAgIGlmIChpc1Jhd1ZhbHVlKHZhbCkpIHtcbiAgICAgICAgcmF3VmFsdWUgPSB2YWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgX3ZhbCR2YWx1ZTtcbiAgICAgICAgcmF3S2V5ID0gdmFsLmtleTtcbiAgICAgICAgcmF3TGFiZWwgPSB2YWwubGFiZWw7XG4gICAgICAgIHJhd1ZhbHVlID0gKF92YWwkdmFsdWUgPSB2YWwudmFsdWUpICE9PSBudWxsICYmIF92YWwkdmFsdWUgIT09IHZvaWQgMCA/IF92YWwkdmFsdWUgOiByYXdLZXk7XG4gICAgICB9XG4gICAgICB2YXIgb3B0aW9uID0gdmFsdWVPcHRpb25zLmdldChyYXdWYWx1ZSk7XG4gICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgIHZhciBfb3B0aW9uJGtleTtcbiAgICAgICAgLy8gRmlsbCBtaXNzaW5nIHByb3BzXG4gICAgICAgIGlmIChyYXdMYWJlbCA9PT0gdW5kZWZpbmVkKSByYXdMYWJlbCA9IG9wdGlvbiA9PT0gbnVsbCB8fCBvcHRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbltvcHRpb25MYWJlbFByb3AgfHwgbWVyZ2VkRmllbGROYW1lcy5sYWJlbF07XG4gICAgICAgIGlmIChyYXdLZXkgPT09IHVuZGVmaW5lZCkgcmF3S2V5ID0gKF9vcHRpb24ka2V5ID0gb3B0aW9uID09PSBudWxsIHx8IG9wdGlvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9uLmtleSkgIT09IG51bGwgJiYgX29wdGlvbiRrZXkgIT09IHZvaWQgMCA/IF9vcHRpb24ka2V5IDogcmF3VmFsdWU7XG4gICAgICAgIHJhd0Rpc2FibGVkID0gb3B0aW9uID09PSBudWxsIHx8IG9wdGlvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9uLmRpc2FibGVkO1xuICAgICAgICByYXdUaXRsZSA9IG9wdGlvbiA9PT0gbnVsbCB8fCBvcHRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbi50aXRsZTtcblxuICAgICAgICAvLyBXYXJuaW5nIGlmIGxhYmVsIG5vdCBzYW1lIGFzIHByb3ZpZGVkXG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFvcHRpb25MYWJlbFByb3ApIHtcbiAgICAgICAgICB2YXIgb3B0aW9uTGFiZWwgPSBvcHRpb24gPT09IG51bGwgfHwgb3B0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25bbWVyZ2VkRmllbGROYW1lcy5sYWJlbF07XG4gICAgICAgICAgaWYgKG9wdGlvbkxhYmVsICE9PSB1bmRlZmluZWQgJiYgb3B0aW9uTGFiZWwgIT09IHJhd0xhYmVsKSB7XG4gICAgICAgICAgICB3YXJuaW5nKGZhbHNlLCAnYGxhYmVsYCBvZiBgdmFsdWVgIGlzIG5vdCBzYW1lIGFzIGBsYWJlbGAgaW4gU2VsZWN0IG9wdGlvbnMuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYWJlbDogcmF3TGFiZWwsXG4gICAgICAgIHZhbHVlOiByYXdWYWx1ZSxcbiAgICAgICAga2V5OiByYXdLZXksXG4gICAgICAgIGRpc2FibGVkOiByYXdEaXNhYmxlZCxcbiAgICAgICAgdGl0bGU6IHJhd1RpdGxlXG4gICAgICB9O1xuICAgIH0pO1xuICB9LCBbbWVyZ2VkRmllbGROYW1lcywgb3B0aW9uTGFiZWxQcm9wLCB2YWx1ZU9wdGlvbnNdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gVmFsdWVzID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZU1lcmdlZFN0YXRlMyA9IHVzZU1lcmdlZFN0YXRlKGRlZmF1bHRWYWx1ZSwge1xuICAgICAgdmFsdWU6IHZhbHVlXG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZTMsIDIpLFxuICAgIGludGVybmFsVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGU0WzBdLFxuICAgIHNldEludGVybmFsVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGU0WzFdO1xuXG4gIC8vIE1lcmdlZCB2YWx1ZSB3aXRoIExhYmVsVmFsdWVUeXBlXG4gIHZhciByYXdMYWJlbGVkVmFsdWVzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF92YWx1ZXMkO1xuICAgIHZhciB2YWx1ZXMgPSBjb252ZXJ0MkxhYmVsVmFsdWVzKGludGVybmFsVmFsdWUpO1xuXG4gICAgLy8gY29tYm9ib3ggbm8gbmVlZCBzYXZlIHZhbHVlIHdoZW4gaXQncyBubyB2YWx1ZVxuICAgIGlmIChtb2RlID09PSAnY29tYm9ib3gnICYmICEoKF92YWx1ZXMkID0gdmFsdWVzWzBdKSAhPT0gbnVsbCAmJiBfdmFsdWVzJCAhPT0gdm9pZCAwICYmIF92YWx1ZXMkLnZhbHVlKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9LCBbaW50ZXJuYWxWYWx1ZSwgY29udmVydDJMYWJlbFZhbHVlcywgbW9kZV0pO1xuXG4gIC8vIEZpbGwgbGFiZWwgd2l0aCBjYWNoZSB0byBhdm9pZCBvcHRpb24gcmVtb3ZlXG4gIHZhciBfdXNlQ2FjaGUgPSB1c2VDYWNoZShyYXdMYWJlbGVkVmFsdWVzLCB2YWx1ZU9wdGlvbnMpLFxuICAgIF91c2VDYWNoZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlQ2FjaGUsIDIpLFxuICAgIG1lcmdlZFZhbHVlcyA9IF91c2VDYWNoZTJbMF0sXG4gICAgZ2V0TWl4ZWRPcHRpb24gPSBfdXNlQ2FjaGUyWzFdO1xuICB2YXIgZGlzcGxheVZhbHVlcyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIC8vIGBudWxsYCBuZWVkIHNob3cgYXMgcGxhY2Vob2xkZXIgaW5zdGVhZFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzI1MDU3XG4gICAgaWYgKCFtb2RlICYmIG1lcmdlZFZhbHVlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBmaXJzdFZhbHVlID0gbWVyZ2VkVmFsdWVzWzBdO1xuICAgICAgaWYgKGZpcnN0VmFsdWUudmFsdWUgPT09IG51bGwgJiYgKGZpcnN0VmFsdWUubGFiZWwgPT09IG51bGwgfHwgZmlyc3RWYWx1ZS5sYWJlbCA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtZXJnZWRWYWx1ZXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgX2l0ZW0kbGFiZWw7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBpdGVtKSwge30sIHtcbiAgICAgICAgbGFiZWw6IChfaXRlbSRsYWJlbCA9IGl0ZW0ubGFiZWwpICE9PSBudWxsICYmIF9pdGVtJGxhYmVsICE9PSB2b2lkIDAgPyBfaXRlbSRsYWJlbCA6IGl0ZW0udmFsdWVcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LCBbbW9kZSwgbWVyZ2VkVmFsdWVzXSk7XG5cbiAgLyoqIENvbnZlcnQgYGRpc3BsYXlWYWx1ZXNgIHRvIHJhdyB2YWx1ZSB0eXBlIHNldCAqL1xuICB2YXIgcmF3VmFsdWVzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBTZXQobWVyZ2VkVmFsdWVzLm1hcChmdW5jdGlvbiAodmFsKSB7XG4gICAgICByZXR1cm4gdmFsLnZhbHVlO1xuICAgIH0pKTtcbiAgfSwgW21lcmdlZFZhbHVlc10pO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChtb2RlID09PSAnY29tYm9ib3gnKSB7XG4gICAgICB2YXIgX21lcmdlZFZhbHVlcyQ7XG4gICAgICB2YXIgc3RyVmFsdWUgPSAoX21lcmdlZFZhbHVlcyQgPSBtZXJnZWRWYWx1ZXNbMF0pID09PSBudWxsIHx8IF9tZXJnZWRWYWx1ZXMkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbWVyZ2VkVmFsdWVzJC52YWx1ZTtcbiAgICAgIHNldFNlYXJjaFZhbHVlKGhhc1ZhbHVlKHN0clZhbHVlKSA/IFN0cmluZyhzdHJWYWx1ZSkgOiAnJyk7XG4gICAgfVxuICB9LCBbbWVyZ2VkVmFsdWVzXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gRGlzcGxheSBPcHRpb24gPT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ3JlYXRlIGEgcGxhY2Vob2xkZXIgaXRlbSBpZiBub3QgZXhpc3QgaW4gYG9wdGlvbnNgXG4gIHZhciBjcmVhdGVUYWdPcHRpb24gPSB1c2VSZWZGdW5jKGZ1bmN0aW9uICh2YWwsIGxhYmVsKSB7XG4gICAgdmFyIF9yZWY7XG4gICAgdmFyIG1lcmdlZExhYmVsID0gbGFiZWwgIT09IG51bGwgJiYgbGFiZWwgIT09IHZvaWQgMCA/IGxhYmVsIDogdmFsO1xuICAgIHJldHVybiBfcmVmID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfcmVmLCBtZXJnZWRGaWVsZE5hbWVzLnZhbHVlLCB2YWwpLCBfZGVmaW5lUHJvcGVydHkoX3JlZiwgbWVyZ2VkRmllbGROYW1lcy5sYWJlbCwgbWVyZ2VkTGFiZWwpLCBfcmVmO1xuICB9KTtcblxuICAvLyBGaWxsIHRhZyBhcyBvcHRpb24gaWYgbW9kZSBpcyBgdGFnc2BcbiAgdmFyIGZpbGxlZFRhZ09wdGlvbnMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAobW9kZSAhPT0gJ3RhZ3MnKSB7XG4gICAgICByZXR1cm4gbWVyZ2VkT3B0aW9ucztcbiAgICB9XG5cbiAgICAvLyA+Pj4gVGFnIG1vZGVcbiAgICB2YXIgY2xvbmVPcHRpb25zID0gX3RvQ29uc3VtYWJsZUFycmF5KG1lcmdlZE9wdGlvbnMpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdmFsdWUgZXhpc3QgaW4gb3B0aW9ucyAoaW5jbHVkZSBuZXcgcGF0Y2ggaXRlbSlcbiAgICB2YXIgZXhpc3RPcHRpb25zID0gZnVuY3Rpb24gZXhpc3RPcHRpb25zKHZhbCkge1xuICAgICAgcmV0dXJuIHZhbHVlT3B0aW9ucy5oYXModmFsKTtcbiAgICB9O1xuXG4gICAgLy8gRmlsbCBjdXJyZW50IHZhbHVlIGFzIG9wdGlvblxuICAgIF90b0NvbnN1bWFibGVBcnJheShtZXJnZWRWYWx1ZXMpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhLnZhbHVlIDwgYi52YWx1ZSA/IC0xIDogMTtcbiAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgdmFsID0gaXRlbS52YWx1ZTtcbiAgICAgIGlmICghZXhpc3RPcHRpb25zKHZhbCkpIHtcbiAgICAgICAgY2xvbmVPcHRpb25zLnB1c2goY3JlYXRlVGFnT3B0aW9uKHZhbCwgaXRlbS5sYWJlbCkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9uZU9wdGlvbnM7XG4gIH0sIFtjcmVhdGVUYWdPcHRpb24sIG1lcmdlZE9wdGlvbnMsIHZhbHVlT3B0aW9ucywgbWVyZ2VkVmFsdWVzLCBtb2RlXSk7XG4gIHZhciBmaWx0ZXJlZE9wdGlvbnMgPSB1c2VGaWx0ZXJPcHRpb25zKGZpbGxlZFRhZ09wdGlvbnMsIG1lcmdlZEZpZWxkTmFtZXMsIG1lcmdlZFNlYXJjaFZhbHVlLCBtZXJnZWRGaWx0ZXJPcHRpb24sIG9wdGlvbkZpbHRlclByb3ApO1xuXG4gIC8vIEZpbGwgb3B0aW9ucyB3aXRoIHNlYXJjaCB2YWx1ZSBpZiBuZWVkZWRcbiAgdmFyIGZpbGxlZFNlYXJjaE9wdGlvbnMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAobW9kZSAhPT0gJ3RhZ3MnIHx8ICFtZXJnZWRTZWFyY2hWYWx1ZSB8fCBmaWx0ZXJlZE9wdGlvbnMuc29tZShmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIGl0ZW1bb3B0aW9uRmlsdGVyUHJvcCB8fCAndmFsdWUnXSA9PT0gbWVyZ2VkU2VhcmNoVmFsdWU7XG4gICAgfSkpIHtcbiAgICAgIHJldHVybiBmaWx0ZXJlZE9wdGlvbnM7XG4gICAgfVxuXG4gICAgLy8gRmlsbCBzZWFyY2ggdmFsdWUgYXMgb3B0aW9uXG4gICAgcmV0dXJuIFtjcmVhdGVUYWdPcHRpb24obWVyZ2VkU2VhcmNoVmFsdWUpXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGZpbHRlcmVkT3B0aW9ucykpO1xuICB9LCBbY3JlYXRlVGFnT3B0aW9uLCBvcHRpb25GaWx0ZXJQcm9wLCBtb2RlLCBmaWx0ZXJlZE9wdGlvbnMsIG1lcmdlZFNlYXJjaFZhbHVlXSk7XG4gIHZhciBvcmRlcmVkRmlsdGVyZWRPcHRpb25zID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFmaWx0ZXJTb3J0KSB7XG4gICAgICByZXR1cm4gZmlsbGVkU2VhcmNoT3B0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIF90b0NvbnN1bWFibGVBcnJheShmaWxsZWRTZWFyY2hPcHRpb25zKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gZmlsdGVyU29ydChhLCBiKTtcbiAgICB9KTtcbiAgfSwgW2ZpbGxlZFNlYXJjaE9wdGlvbnMsIGZpbHRlclNvcnRdKTtcbiAgdmFyIGRpc3BsYXlPcHRpb25zID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZsYXR0ZW5PcHRpb25zKG9yZGVyZWRGaWx0ZXJlZE9wdGlvbnMsIHtcbiAgICAgIGZpZWxkTmFtZXM6IG1lcmdlZEZpZWxkTmFtZXMsXG4gICAgICBjaGlsZHJlbkFzRGF0YTogY2hpbGRyZW5Bc0RhdGFcbiAgICB9KTtcbiAgfSwgW29yZGVyZWRGaWx0ZXJlZE9wdGlvbnMsIG1lcmdlZEZpZWxkTmFtZXMsIGNoaWxkcmVuQXNEYXRhXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IENoYW5nZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHRyaWdnZXJDaGFuZ2UgPSBmdW5jdGlvbiB0cmlnZ2VyQ2hhbmdlKHZhbHVlcykge1xuICAgIHZhciBsYWJlbGVkVmFsdWVzID0gY29udmVydDJMYWJlbFZhbHVlcyh2YWx1ZXMpO1xuICAgIHNldEludGVybmFsVmFsdWUobGFiZWxlZFZhbHVlcyk7XG4gICAgaWYgKG9uQ2hhbmdlICYmIChcbiAgICAvLyBUcmlnZ2VyIGV2ZW50IG9ubHkgd2hlbiB2YWx1ZSBjaGFuZ2VkXG4gICAgbGFiZWxlZFZhbHVlcy5sZW5ndGggIT09IG1lcmdlZFZhbHVlcy5sZW5ndGggfHwgbGFiZWxlZFZhbHVlcy5zb21lKGZ1bmN0aW9uIChuZXdWYWwsIGluZGV4KSB7XG4gICAgICB2YXIgX21lcmdlZFZhbHVlcyRpbmRleDtcbiAgICAgIHJldHVybiAoKF9tZXJnZWRWYWx1ZXMkaW5kZXggPSBtZXJnZWRWYWx1ZXNbaW5kZXhdKSA9PT0gbnVsbCB8fCBfbWVyZ2VkVmFsdWVzJGluZGV4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbWVyZ2VkVmFsdWVzJGluZGV4LnZhbHVlKSAhPT0gKG5ld1ZhbCA9PT0gbnVsbCB8fCBuZXdWYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5ld1ZhbC52YWx1ZSk7XG4gICAgfSkpKSB7XG4gICAgICB2YXIgcmV0dXJuVmFsdWVzID0gbGFiZWxJblZhbHVlID8gbGFiZWxlZFZhbHVlcyA6IGxhYmVsZWRWYWx1ZXMubWFwKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIHJldHVybiB2LnZhbHVlO1xuICAgICAgfSk7XG4gICAgICB2YXIgcmV0dXJuT3B0aW9ucyA9IGxhYmVsZWRWYWx1ZXMubWFwKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIHJldHVybiBpbmplY3RQcm9wc1dpdGhPcHRpb24oZ2V0TWl4ZWRPcHRpb24odi52YWx1ZSkpO1xuICAgICAgfSk7XG4gICAgICBvbkNoYW5nZShcbiAgICAgIC8vIFZhbHVlXG4gICAgICBtdWx0aXBsZSA/IHJldHVyblZhbHVlcyA6IHJldHVyblZhbHVlc1swXSxcbiAgICAgIC8vIE9wdGlvblxuICAgICAgbXVsdGlwbGUgPyByZXR1cm5PcHRpb25zIDogcmV0dXJuT3B0aW9uc1swXSk7XG4gICAgfVxuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09IEFjY2Vzc2liaWxpdHkgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShudWxsKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBhY3RpdmVWYWx1ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0QWN0aXZlVmFsdWUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKDApLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUzLCAyKSxcbiAgICBhY2Nlc3NpYmlsaXR5SW5kZXggPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgIHNldEFjY2Vzc2liaWxpdHlJbmRleCA9IF9SZWFjdCR1c2VTdGF0ZTRbMV07XG4gIHZhciBtZXJnZWREZWZhdWx0QWN0aXZlRmlyc3RPcHRpb24gPSBkZWZhdWx0QWN0aXZlRmlyc3RPcHRpb24gIT09IHVuZGVmaW5lZCA/IGRlZmF1bHRBY3RpdmVGaXJzdE9wdGlvbiA6IG1vZGUgIT09ICdjb21ib2JveCc7XG4gIHZhciBvbkFjdGl2ZVZhbHVlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGFjdGl2ZSwgaW5kZXgpIHtcbiAgICB2YXIgX3JlZjIgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9LFxuICAgICAgX3JlZjIkc291cmNlID0gX3JlZjIuc291cmNlLFxuICAgICAgc291cmNlID0gX3JlZjIkc291cmNlID09PSB2b2lkIDAgPyAna2V5Ym9hcmQnIDogX3JlZjIkc291cmNlO1xuICAgIHNldEFjY2Vzc2liaWxpdHlJbmRleChpbmRleCk7XG4gICAgaWYgKGJhY2tmaWxsICYmIG1vZGUgPT09ICdjb21ib2JveCcgJiYgYWN0aXZlICE9PSBudWxsICYmIHNvdXJjZSA9PT0gJ2tleWJvYXJkJykge1xuICAgICAgc2V0QWN0aXZlVmFsdWUoU3RyaW5nKGFjdGl2ZSkpO1xuICAgIH1cbiAgfSwgW2JhY2tmaWxsLCBtb2RlXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBPcHRpb25MaXN0ID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHRyaWdnZXJTZWxlY3QgPSBmdW5jdGlvbiB0cmlnZ2VyU2VsZWN0KHZhbCwgc2VsZWN0ZWQsIHR5cGUpIHtcbiAgICB2YXIgZ2V0U2VsZWN0RW50ID0gZnVuY3Rpb24gZ2V0U2VsZWN0RW50KCkge1xuICAgICAgdmFyIF9vcHRpb24ka2V5MjtcbiAgICAgIHZhciBvcHRpb24gPSBnZXRNaXhlZE9wdGlvbih2YWwpO1xuICAgICAgcmV0dXJuIFtsYWJlbEluVmFsdWUgPyB7XG4gICAgICAgIGxhYmVsOiBvcHRpb24gPT09IG51bGwgfHwgb3B0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25bbWVyZ2VkRmllbGROYW1lcy5sYWJlbF0sXG4gICAgICAgIHZhbHVlOiB2YWwsXG4gICAgICAgIGtleTogKF9vcHRpb24ka2V5MiA9IG9wdGlvbiA9PT0gbnVsbCB8fCBvcHRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbi5rZXkpICE9PSBudWxsICYmIF9vcHRpb24ka2V5MiAhPT0gdm9pZCAwID8gX29wdGlvbiRrZXkyIDogdmFsXG4gICAgICB9IDogdmFsLCBpbmplY3RQcm9wc1dpdGhPcHRpb24ob3B0aW9uKV07XG4gICAgfTtcbiAgICBpZiAoc2VsZWN0ZWQgJiYgb25TZWxlY3QpIHtcbiAgICAgIHZhciBfZ2V0U2VsZWN0RW50ID0gZ2V0U2VsZWN0RW50KCksXG4gICAgICAgIF9nZXRTZWxlY3RFbnQyID0gX3NsaWNlZFRvQXJyYXkoX2dldFNlbGVjdEVudCwgMiksXG4gICAgICAgIHdyYXBwZWRWYWx1ZSA9IF9nZXRTZWxlY3RFbnQyWzBdLFxuICAgICAgICBfb3B0aW9uID0gX2dldFNlbGVjdEVudDJbMV07XG4gICAgICBvblNlbGVjdCh3cmFwcGVkVmFsdWUsIF9vcHRpb24pO1xuICAgIH0gZWxzZSBpZiAoIXNlbGVjdGVkICYmIG9uRGVzZWxlY3QgJiYgdHlwZSAhPT0gJ2NsZWFyJykge1xuICAgICAgdmFyIF9nZXRTZWxlY3RFbnQzID0gZ2V0U2VsZWN0RW50KCksXG4gICAgICAgIF9nZXRTZWxlY3RFbnQ0ID0gX3NsaWNlZFRvQXJyYXkoX2dldFNlbGVjdEVudDMsIDIpLFxuICAgICAgICBfd3JhcHBlZFZhbHVlID0gX2dldFNlbGVjdEVudDRbMF0sXG4gICAgICAgIF9vcHRpb24yID0gX2dldFNlbGVjdEVudDRbMV07XG4gICAgICBvbkRlc2VsZWN0KF93cmFwcGVkVmFsdWUsIF9vcHRpb24yKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gVXNlZCBmb3IgT3B0aW9uTGlzdCBzZWxlY3Rpb25cbiAgdmFyIG9uSW50ZXJuYWxTZWxlY3QgPSB1c2VSZWZGdW5jKGZ1bmN0aW9uICh2YWwsIGluZm8pIHtcbiAgICB2YXIgY2xvbmVWYWx1ZXM7XG5cbiAgICAvLyBTaW5nbGUgbW9kZSBhbHdheXMgdHJpZ2dlciBzZWxlY3Qgb25seSB3aXRoIG9wdGlvbiBsaXN0XG4gICAgdmFyIG1lcmdlZFNlbGVjdCA9IG11bHRpcGxlID8gaW5mby5zZWxlY3RlZCA6IHRydWU7XG4gICAgaWYgKG1lcmdlZFNlbGVjdCkge1xuICAgICAgY2xvbmVWYWx1ZXMgPSBtdWx0aXBsZSA/IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkobWVyZ2VkVmFsdWVzKSwgW3ZhbF0pIDogW3ZhbF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNsb25lVmFsdWVzID0gbWVyZ2VkVmFsdWVzLmZpbHRlcihmdW5jdGlvbiAodikge1xuICAgICAgICByZXR1cm4gdi52YWx1ZSAhPT0gdmFsO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRyaWdnZXJDaGFuZ2UoY2xvbmVWYWx1ZXMpO1xuICAgIHRyaWdnZXJTZWxlY3QodmFsLCBtZXJnZWRTZWxlY3QpO1xuXG4gICAgLy8gQ2xlYW4gc2VhcmNoIHZhbHVlIGlmIHNpbmdsZSBvciBjb25maWd1cmVkXG4gICAgaWYgKG1vZGUgPT09ICdjb21ib2JveCcpIHtcbiAgICAgIC8vIHNldFNlYXJjaFZhbHVlKFN0cmluZyh2YWwpKTtcbiAgICAgIHNldEFjdGl2ZVZhbHVlKCcnKTtcbiAgICB9IGVsc2UgaWYgKCFpc011bHRpcGxlIHx8IGF1dG9DbGVhclNlYXJjaFZhbHVlKSB7XG4gICAgICBzZXRTZWFyY2hWYWx1ZSgnJyk7XG4gICAgICBzZXRBY3RpdmVWYWx1ZSgnJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBEaXNwbGF5IENoYW5nZSA9PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBCYXNlU2VsZWN0IGRpc3BsYXkgdmFsdWVzIGNoYW5nZVxuICB2YXIgb25EaXNwbGF5VmFsdWVzQ2hhbmdlID0gZnVuY3Rpb24gb25EaXNwbGF5VmFsdWVzQ2hhbmdlKG5leHRWYWx1ZXMsIGluZm8pIHtcbiAgICB0cmlnZ2VyQ2hhbmdlKG5leHRWYWx1ZXMpO1xuICAgIHZhciB0eXBlID0gaW5mby50eXBlLFxuICAgICAgdmFsdWVzID0gaW5mby52YWx1ZXM7XG4gICAgaWYgKHR5cGUgPT09ICdyZW1vdmUnIHx8IHR5cGUgPT09ICdjbGVhcicpIHtcbiAgICAgIHZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHRyaWdnZXJTZWxlY3QoaXRlbS52YWx1ZSwgZmFsc2UsIHR5cGUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBTZWFyY2ggPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBvbkludGVybmFsU2VhcmNoID0gZnVuY3Rpb24gb25JbnRlcm5hbFNlYXJjaChzZWFyY2hUZXh0LCBpbmZvKSB7XG4gICAgc2V0U2VhcmNoVmFsdWUoc2VhcmNoVGV4dCk7XG4gICAgc2V0QWN0aXZlVmFsdWUobnVsbCk7XG5cbiAgICAvLyBbU3VibWl0XSBUYWcgbW9kZSBzaG91bGQgZmx1c2ggaW5wdXRcbiAgICBpZiAoaW5mby5zb3VyY2UgPT09ICdzdWJtaXQnKSB7XG4gICAgICB2YXIgZm9ybWF0dGVkID0gKHNlYXJjaFRleHQgfHwgJycpLnRyaW0oKTtcbiAgICAgIC8vIHByZXZlbnQgZW1wdHkgdGFncyBmcm9tIGFwcGVhcmluZyB3aGVuIHlvdSBjbGljayB0aGUgRW50ZXIgYnV0dG9uXG4gICAgICBpZiAoZm9ybWF0dGVkKSB7XG4gICAgICAgIHZhciBuZXdSYXdWYWx1ZXMgPSBBcnJheS5mcm9tKG5ldyBTZXQoW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShyYXdWYWx1ZXMpLCBbZm9ybWF0dGVkXSkpKTtcbiAgICAgICAgdHJpZ2dlckNoYW5nZShuZXdSYXdWYWx1ZXMpO1xuICAgICAgICB0cmlnZ2VyU2VsZWN0KGZvcm1hdHRlZCwgdHJ1ZSk7XG4gICAgICAgIHNldFNlYXJjaFZhbHVlKCcnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGluZm8uc291cmNlICE9PSAnYmx1cicpIHtcbiAgICAgIGlmIChtb2RlID09PSAnY29tYm9ib3gnKSB7XG4gICAgICAgIHRyaWdnZXJDaGFuZ2Uoc2VhcmNoVGV4dCk7XG4gICAgICB9XG4gICAgICBvblNlYXJjaCA9PT0gbnVsbCB8fCBvblNlYXJjaCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25TZWFyY2goc2VhcmNoVGV4dCk7XG4gICAgfVxuICB9O1xuICB2YXIgb25JbnRlcm5hbFNlYXJjaFNwbGl0ID0gZnVuY3Rpb24gb25JbnRlcm5hbFNlYXJjaFNwbGl0KHdvcmRzKSB7XG4gICAgdmFyIHBhdGNoVmFsdWVzID0gd29yZHM7XG4gICAgaWYgKG1vZGUgIT09ICd0YWdzJykge1xuICAgICAgcGF0Y2hWYWx1ZXMgPSB3b3Jkcy5tYXAoZnVuY3Rpb24gKHdvcmQpIHtcbiAgICAgICAgdmFyIG9wdCA9IGxhYmVsT3B0aW9ucy5nZXQod29yZCk7XG4gICAgICAgIHJldHVybiBvcHQgPT09IG51bGwgfHwgb3B0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHQudmFsdWU7XG4gICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICByZXR1cm4gdmFsICE9PSB1bmRlZmluZWQ7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdmFyIG5ld1Jhd1ZhbHVlcyA9IEFycmF5LmZyb20obmV3IFNldChbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHJhd1ZhbHVlcyksIF90b0NvbnN1bWFibGVBcnJheShwYXRjaFZhbHVlcykpKSk7XG4gICAgdHJpZ2dlckNoYW5nZShuZXdSYXdWYWx1ZXMpO1xuICAgIG5ld1Jhd1ZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uIChuZXdSYXdWYWx1ZSkge1xuICAgICAgdHJpZ2dlclNlbGVjdChuZXdSYXdWYWx1ZSwgdHJ1ZSk7XG4gICAgfSk7XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gQ29udGV4dCA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHNlbGVjdENvbnRleHQgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVhbFZpcnR1YWwgPSB2aXJ0dWFsICE9PSBmYWxzZSAmJiBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGggIT09IGZhbHNlO1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHBhcnNlZE9wdGlvbnMpLCB7fSwge1xuICAgICAgZmxhdHRlbk9wdGlvbnM6IGRpc3BsYXlPcHRpb25zLFxuICAgICAgb25BY3RpdmVWYWx1ZTogb25BY3RpdmVWYWx1ZSxcbiAgICAgIGRlZmF1bHRBY3RpdmVGaXJzdE9wdGlvbjogbWVyZ2VkRGVmYXVsdEFjdGl2ZUZpcnN0T3B0aW9uLFxuICAgICAgb25TZWxlY3Q6IG9uSW50ZXJuYWxTZWxlY3QsXG4gICAgICBtZW51SXRlbVNlbGVjdGVkSWNvbjogbWVudUl0ZW1TZWxlY3RlZEljb24sXG4gICAgICByYXdWYWx1ZXM6IHJhd1ZhbHVlcyxcbiAgICAgIGZpZWxkTmFtZXM6IG1lcmdlZEZpZWxkTmFtZXMsXG4gICAgICB2aXJ0dWFsOiByZWFsVmlydHVhbCxcbiAgICAgIGxpc3RIZWlnaHQ6IGxpc3RIZWlnaHQsXG4gICAgICBsaXN0SXRlbUhlaWdodDogbGlzdEl0ZW1IZWlnaHQsXG4gICAgICBjaGlsZHJlbkFzRGF0YTogY2hpbGRyZW5Bc0RhdGFcbiAgICB9KTtcbiAgfSwgW3BhcnNlZE9wdGlvbnMsIGRpc3BsYXlPcHRpb25zLCBvbkFjdGl2ZVZhbHVlLCBtZXJnZWREZWZhdWx0QWN0aXZlRmlyc3RPcHRpb24sIG9uSW50ZXJuYWxTZWxlY3QsIG1lbnVJdGVtU2VsZWN0ZWRJY29uLCByYXdWYWx1ZXMsIG1lcmdlZEZpZWxkTmFtZXMsIHZpcnR1YWwsIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCwgbGlzdEhlaWdodCwgbGlzdEl0ZW1IZWlnaHQsIGNoaWxkcmVuQXNEYXRhXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gV2FybmluZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB3YXJuaW5nUHJvcHMocHJvcHMpO1xuICAgIHdhcm5pbmdOdWxsT3B0aW9ucyhtZXJnZWRPcHRpb25zLCBtZXJnZWRGaWVsZE5hbWVzKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID09ICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXIgICAgICAgICAgICAgICAgICAgICAgICAgID09XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTZWxlY3RDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IHNlbGVjdENvbnRleHRcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQmFzZVNlbGVjdCwgX2V4dGVuZHMoe30sIHJlc3RQcm9wcywge1xuICAgIC8vID4+PiBNSVNDXG4gICAgaWQ6IG1lcmdlZElkLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIHJlZjogcmVmLFxuICAgIG9taXREb21Qcm9wczogT01JVF9ET01fUFJPUFMsXG4gICAgbW9kZTogbW9kZVxuICAgIC8vID4+PiBWYWx1ZXNcbiAgICAsXG4gICAgZGlzcGxheVZhbHVlczogZGlzcGxheVZhbHVlcyxcbiAgICBvbkRpc3BsYXlWYWx1ZXNDaGFuZ2U6IG9uRGlzcGxheVZhbHVlc0NoYW5nZVxuICAgIC8vID4+PiBTZWFyY2hcbiAgICAsXG4gICAgc2VhcmNoVmFsdWU6IG1lcmdlZFNlYXJjaFZhbHVlLFxuICAgIG9uU2VhcmNoOiBvbkludGVybmFsU2VhcmNoLFxuICAgIGF1dG9DbGVhclNlYXJjaFZhbHVlOiBhdXRvQ2xlYXJTZWFyY2hWYWx1ZSxcbiAgICBvblNlYXJjaFNwbGl0OiBvbkludGVybmFsU2VhcmNoU3BsaXQsXG4gICAgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoOiBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGhcbiAgICAvLyA+Pj4gT3B0aW9uTGlzdFxuICAgICxcbiAgICBPcHRpb25MaXN0OiBPcHRpb25MaXN0LFxuICAgIGVtcHR5T3B0aW9uczogIWRpc3BsYXlPcHRpb25zLmxlbmd0aFxuICAgIC8vID4+PiBBY2Nlc3NpYmlsaXR5XG4gICAgLFxuICAgIGFjdGl2ZVZhbHVlOiBhY3RpdmVWYWx1ZSxcbiAgICBhY3RpdmVEZXNjZW5kYW50SWQ6IFwiXCIuY29uY2F0KG1lcmdlZElkLCBcIl9saXN0X1wiKS5jb25jYXQoYWNjZXNzaWJpbGl0eUluZGV4KVxuICB9KSkpO1xufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBTZWxlY3QuZGlzcGxheU5hbWUgPSAnU2VsZWN0Jztcbn1cbnZhciBUeXBlZFNlbGVjdCA9IFNlbGVjdDtcblR5cGVkU2VsZWN0Lk9wdGlvbiA9IE9wdGlvbjtcblR5cGVkU2VsZWN0Lk9wdEdyb3VwID0gT3B0R3JvdXA7XG5leHBvcnQgZGVmYXVsdCBUeXBlZFNlbGVjdDsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbnZhciBFbXB0eSA9IGZ1bmN0aW9uIEVtcHR5KCkge1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscztcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnZW1wdHktaW1nLWRlZmF1bHQnKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICBjbGFzc05hbWU6IHByZWZpeENscyxcbiAgICB3aWR0aDogXCIxODRcIixcbiAgICBoZWlnaHQ6IFwiMTUyXCIsXG4gICAgdmlld0JveDogXCIwIDAgMTg0IDE1MlwiLFxuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIHtcbiAgICBmaWxsOiBcIm5vbmVcIixcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIHtcbiAgICB0cmFuc2Zvcm06IFwidHJhbnNsYXRlKDI0IDMxLjY3KVwiXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZWxsaXBzZVwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWVsbGlwc2VcIiksXG4gICAgY3g6IFwiNjcuNzk3XCIsXG4gICAgY3k6IFwiMTA2Ljg5XCIsXG4gICAgcng6IFwiNjcuNzk3XCIsXG4gICAgcnk6IFwiMTIuNjY4XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBhdGgtMVwiKSxcbiAgICBkOiBcIk0xMjIuMDM0IDY5LjY3NEw5OC4xMDkgNDAuMjI5Yy0xLjE0OC0xLjM4Ni0yLjgyNi0yLjIyNS00LjU5My0yLjIyNWgtNTEuNDRjLTEuNzY2IDAtMy40NDQuODM5LTQuNTkyIDIuMjI1TDEzLjU2IDY5LjY3NHYxNS4zODNoMTA4LjQ3NVY2OS42NzR6XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBhdGgtMlwiKSxcbiAgICBkOiBcIk0xMDEuNTM3IDg2LjIxNEw4MC42MyA2MS4xMDJjLTEuMDAxLTEuMjA3LTIuNTA3LTEuODY3LTQuMDQ4LTEuODY3SDMxLjcyNGMtMS41NCAwLTMuMDQ3LjY2LTQuMDQ4IDEuODY3TDYuNzY5IDg2LjIxNHYxMy43OTJoOTQuNzY4Vjg2LjIxNHpcIixcbiAgICB0cmFuc2Zvcm06IFwidHJhbnNsYXRlKDEzLjU2KVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wYXRoLTNcIiksXG4gICAgZDogXCJNMzMuODMgMGg2Ny45MzNhNCA0IDAgMCAxIDQgNHY5My4zNDRhNCA0IDAgMCAxLTQgNEgzMy44M2E0IDQgMCAwIDEtNC00VjRhNCA0IDAgMCAxIDQtNHpcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGF0aC00XCIpLFxuICAgIGQ6IFwiTTQyLjY3OCA5Ljk1M2g1MC4yMzdhMiAyIDAgMCAxIDIgMlYzNi45MWEyIDIgMCAwIDEtMiAySDQyLjY3OGEyIDIgMCAwIDEtMi0yVjExLjk1M2EyIDIgMCAwIDEgMi0yek00Mi45NCA0OS43NjdoNDkuNzEzYTIuMjYyIDIuMjYyIDAgMSAxIDAgNC41MjRINDIuOTRhMi4yNjIgMi4yNjIgMCAwIDEgMC00LjUyNHpNNDIuOTQgNjEuNTNoNDkuNzEzYTIuMjYyIDIuMjYyIDAgMSAxIDAgNC41MjVINDIuOTRhMi4yNjIgMi4yNjIgMCAwIDEgMC00LjUyNXpNMTIxLjgxMyAxMDUuMDMyYy0uNzc1IDMuMDcxLTMuNDk3IDUuMzYtNi43MzUgNS4zNkgyMC41MTVjLTMuMjM4IDAtNS45Ni0yLjI5LTYuNzM0LTUuMzZhNy4zMDkgNy4zMDkgMCAwIDEtLjIyMi0xLjc5VjY5LjY3NWgyNi4zMThjMi45MDcgMCA1LjI1IDIuNDQ4IDUuMjUgNS40MnYuMDRjMCAyLjk3MSAyLjM3IDUuMzcgNS4yNzcgNS4zN2gzNC43ODVjMi45MDcgMCA1LjI3Ny0yLjQyMSA1LjI3Ny01LjM5M1Y3NS4xYzAtMi45NzIgMi4zNDMtNS40MjYgNS4yNS01LjQyNmgyNi4zMTh2MzMuNTY5YzAgLjYxNy0uMDc3IDEuMjE2LS4yMjEgMS43ODl6XCJcbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wYXRoLTVcIiksXG4gICAgZDogXCJNMTQ5LjEyMSAzMy4yOTJsLTYuODMgMi42NWExIDEgMCAwIDEtMS4zMTctMS4yM2wxLjkzNy02LjIwN2MtMi41ODktMi45NDQtNC4xMDktNi41MzQtNC4xMDktMTAuNDA4QzEzOC44MDIgOC4xMDIgMTQ4LjkyIDAgMTYxLjQwMiAwIDE3My44ODEgMCAxODQgOC4xMDIgMTg0IDE4LjA5N2MwIDkuOTk1LTEwLjExOCAxOC4wOTctMjIuNTk5IDE4LjA5Ny00LjUyOCAwLTguNzQ0LTEuMDY2LTEyLjI4LTIuOTAyelwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImdcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1nXCIpLFxuICAgIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGUoMTQ5LjY1IDE1LjM4MylcIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImVsbGlwc2VcIiwge1xuICAgIGN4OiBcIjIwLjY1NFwiLFxuICAgIGN5OiBcIjMuMTY3XCIsXG4gICAgcng6IFwiMi44NDlcIixcbiAgICByeTogXCIyLjgxNVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTUuNjk4IDUuNjNIMEwyLjg5OC43MDR6TTkuMjU5LjcwNGg0Ljk4NVY1LjYzSDkuMjU5elwiXG4gIH0pKSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IEVtcHR5OyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xudmFyIFNpbXBsZSA9IGZ1bmN0aW9uIFNpbXBsZSgpIHtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHM7XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2VtcHR5LWltZy1zaW1wbGUnKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICBjbGFzc05hbWU6IHByZWZpeENscyxcbiAgICB3aWR0aDogXCI2NFwiLFxuICAgIGhlaWdodDogXCI0MVwiLFxuICAgIHZpZXdCb3g6IFwiMCAwIDY0IDQxXCIsXG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImdcIiwge1xuICAgIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGUoMCAxKVwiLFxuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImVsbGlwc2VcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1lbGxpcHNlXCIpLFxuICAgIGN4OiBcIjMyXCIsXG4gICAgY3k6IFwiMzNcIixcbiAgICByeDogXCIzMlwiLFxuICAgIHJ5OiBcIjdcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZ1wiKSxcbiAgICBmaWxsUnVsZTogXCJub256ZXJvXCJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk01NSAxMi43Nkw0NC44NTQgMS4yNThDNDQuMzY3LjQ3NCA0My42NTYgMCA0Mi45MDcgMEgyMS4wOTNjLS43NDkgMC0xLjQ2LjQ3NC0xLjk0NyAxLjI1N0w5IDEyLjc2MVYyMmg0NnYtOS4yNHpcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk00MS42MTMgMTUuOTMxYzAtMS42MDUuOTk0LTIuOTMgMi4yMjctMi45MzFINTV2MTguMTM3QzU1IDMzLjI2IDUzLjY4IDM1IDUyLjA1IDM1aC00MC4xQzEwLjMyIDM1IDkgMzMuMjU5IDkgMzEuMTM3VjEzaDExLjE2YzEuMjMzIDAgMi4yMjcgMS4zMjMgMi4yMjcgMi45Mjh2LjAyMmMwIDEuNjA1IDEuMDA1IDIuOTAxIDIuMjM3IDIuOTAxaDE0Ljc1MmMxLjIzMiAwIDIuMjM3LTEuMzA4IDIuMjM3LTIuOTEzdi0uMDA3elwiLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wYXRoXCIpXG4gIH0pKSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFNpbXBsZTsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCBMb2NhbGVSZWNlaXZlciBmcm9tICcuLi9sb2NhbGUtcHJvdmlkZXIvTG9jYWxlUmVjZWl2ZXInO1xuaW1wb3J0IERlZmF1bHRFbXB0eUltZyBmcm9tICcuL2VtcHR5JztcbmltcG9ydCBTaW1wbGVFbXB0eUltZyBmcm9tICcuL3NpbXBsZSc7XG52YXIgZGVmYXVsdEVtcHR5SW1nID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRGVmYXVsdEVtcHR5SW1nLCBudWxsKTtcbnZhciBzaW1wbGVFbXB0eUltZyA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNpbXBsZUVtcHR5SW1nLCBudWxsKTtcbnZhciBFbXB0eSA9IGZ1bmN0aW9uIEVtcHR5KF9hKSB7XG4gIHZhciBjbGFzc05hbWUgPSBfYS5jbGFzc05hbWUsXG4gICAgY3VzdG9taXplUHJlZml4Q2xzID0gX2EucHJlZml4Q2xzLFxuICAgIF9hJGltYWdlID0gX2EuaW1hZ2UsXG4gICAgaW1hZ2UgPSBfYSRpbWFnZSA9PT0gdm9pZCAwID8gZGVmYXVsdEVtcHR5SW1nIDogX2EkaW1hZ2UsXG4gICAgZGVzY3JpcHRpb24gPSBfYS5kZXNjcmlwdGlvbixcbiAgICBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLFxuICAgIGltYWdlU3R5bGUgPSBfYS5pbWFnZVN0eWxlLFxuICAgIHJlc3RQcm9wcyA9IF9fcmVzdChfYSwgW1wiY2xhc3NOYW1lXCIsIFwicHJlZml4Q2xzXCIsIFwiaW1hZ2VcIiwgXCJkZXNjcmlwdGlvblwiLCBcImNoaWxkcmVuXCIsIFwiaW1hZ2VTdHlsZVwiXSk7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCksXG4gICAgZ2V0UHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UHJlZml4Q2xzLFxuICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExvY2FsZVJlY2VpdmVyLCB7XG4gICAgY29tcG9uZW50TmFtZTogXCJFbXB0eVwiXG4gIH0sIGZ1bmN0aW9uIChjb250ZXh0TG9jYWxlKSB7XG4gICAgdmFyIF9jbGFzc05hbWVzO1xuICAgIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2VtcHR5JywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgICB2YXIgZGVzID0gdHlwZW9mIGRlc2NyaXB0aW9uICE9PSAndW5kZWZpbmVkJyA/IGRlc2NyaXB0aW9uIDogY29udGV4dExvY2FsZS5kZXNjcmlwdGlvbjtcbiAgICB2YXIgYWx0ID0gdHlwZW9mIGRlcyA9PT0gJ3N0cmluZycgPyBkZXMgOiAnZW1wdHknO1xuICAgIHZhciBpbWFnZU5vZGUgPSBudWxsO1xuICAgIGlmICh0eXBlb2YgaW1hZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpbWFnZU5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImltZ1wiLCB7XG4gICAgICAgIGFsdDogYWx0LFxuICAgICAgICBzcmM6IGltYWdlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW1hZ2VOb2RlID0gaW1hZ2U7XG4gICAgfVxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMocHJlZml4Q2xzLCAoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW5vcm1hbFwiKSwgaW1hZ2UgPT09IHNpbXBsZUVtcHR5SW1nKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lKVxuICAgIH0sIHJlc3RQcm9wcyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbWFnZVwiKSxcbiAgICAgIHN0eWxlOiBpbWFnZVN0eWxlXG4gICAgfSwgaW1hZ2VOb2RlKSwgZGVzICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kZXNjcmlwdGlvblwiKVxuICAgIH0sIGRlcyksIGNoaWxkcmVuICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1mb290ZXJcIilcbiAgICB9LCBjaGlsZHJlbikpO1xuICB9KTtcbn07XG5FbXB0eS5QUkVTRU5URURfSU1BR0VfREVGQVVMVCA9IGRlZmF1bHRFbXB0eUltZztcbkVtcHR5LlBSRVNFTlRFRF9JTUFHRV9TSU1QTEUgPSBzaW1wbGVFbXB0eUltZztcbmV4cG9ydCBkZWZhdWx0IEVtcHR5OyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnN1bWVyIH0gZnJvbSAnLic7XG5pbXBvcnQgRW1wdHkgZnJvbSAnLi4vZW1wdHknO1xudmFyIGRlZmF1bHRSZW5kZXJFbXB0eSA9IGZ1bmN0aW9uIGRlZmF1bHRSZW5kZXJFbXB0eShjb21wb25lbnROYW1lKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb25maWdDb25zdW1lciwgbnVsbCwgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgZ2V0UHJlZml4Q2xzID0gX3JlZi5nZXRQcmVmaXhDbHM7XG4gICAgdmFyIHByZWZpeCA9IGdldFByZWZpeENscygnZW1wdHknKTtcbiAgICBzd2l0Y2ggKGNvbXBvbmVudE5hbWUpIHtcbiAgICAgIGNhc2UgJ1RhYmxlJzpcbiAgICAgIGNhc2UgJ0xpc3QnOlxuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRW1wdHksIHtcbiAgICAgICAgICBpbWFnZTogRW1wdHkuUFJFU0VOVEVEX0lNQUdFX1NJTVBMRVxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgJ1NlbGVjdCc6XG4gICAgICBjYXNlICdUcmVlU2VsZWN0JzpcbiAgICAgIGNhc2UgJ0Nhc2NhZGVyJzpcbiAgICAgIGNhc2UgJ1RyYW5zZmVyJzpcbiAgICAgIGNhc2UgJ01lbnRpb25zJzpcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVtcHR5LCB7XG4gICAgICAgICAgaW1hZ2U6IEVtcHR5LlBSRVNFTlRFRF9JTUFHRV9TSU1QTEUsXG4gICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXgsIFwiLXNtYWxsXCIpXG4gICAgICAgIH0pO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIFNob3VsZCBuZXZlciBoaXQgaWYgd2UgdGFrZSBhbGwgdGhlIGNvbXBvbmVudCBpbnRvIGNvbnNpZGVyLlxuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRW1wdHksIG51bGwpO1xuICAgIH1cbiAgfSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgZGVmYXVsdFJlbmRlckVtcHR5OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IHsgRm9ybVByb3ZpZGVyIGFzIFJjRm9ybVByb3ZpZGVyIH0gZnJvbSAncmMtZmllbGQtZm9ybSc7XG5pbXBvcnQgb21pdCBmcm9tIFwicmMtdXRpbC9lcy9vbWl0XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250ZXh0LCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuZXhwb3J0IHZhciBGb3JtQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgbGFiZWxBbGlnbjogJ3JpZ2h0JyxcbiAgdmVydGljYWw6IGZhbHNlLFxuICBpdGVtUmVmOiBmdW5jdGlvbiBpdGVtUmVmKCkge31cbn0pO1xuZXhwb3J0IHZhciBOb1N0eWxlSXRlbUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmV4cG9ydCB2YXIgRm9ybVByb3ZpZGVyID0gZnVuY3Rpb24gRm9ybVByb3ZpZGVyKHByb3BzKSB7XG4gIHZhciBwcm92aWRlclByb3BzID0gb21pdChwcm9wcywgWydwcmVmaXhDbHMnXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSY0Zvcm1Qcm92aWRlciwgX2V4dGVuZHMoe30sIHByb3ZpZGVyUHJvcHMpKTtcbn07XG5leHBvcnQgdmFyIEZvcm1JdGVtUHJlZml4Q29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgcHJlZml4Q2xzOiAnJ1xufSk7XG5leHBvcnQgdmFyIEZvcm1JdGVtSW5wdXRDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe30pO1xuZXhwb3J0IHZhciBOb0Zvcm1TdHlsZSA9IGZ1bmN0aW9uIE5vRm9ybVN0eWxlKF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICBzdGF0dXMgPSBfcmVmLnN0YXR1cyxcbiAgICBvdmVycmlkZSA9IF9yZWYub3ZlcnJpZGU7XG4gIHZhciBmb3JtSXRlbUlucHV0Q29udGV4dCA9IHVzZUNvbnRleHQoRm9ybUl0ZW1JbnB1dENvbnRleHQpO1xuICB2YXIgbmV3Rm9ybUl0ZW1JbnB1dENvbnRleHQgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbmV3Q29udGV4dCA9IF9leHRlbmRzKHt9LCBmb3JtSXRlbUlucHV0Q29udGV4dCk7XG4gICAgaWYgKG92ZXJyaWRlKSB7XG4gICAgICBkZWxldGUgbmV3Q29udGV4dC5pc0Zvcm1JdGVtSW5wdXQ7XG4gICAgfVxuICAgIGlmIChzdGF0dXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdDb250ZXh0LnN0YXR1cztcbiAgICAgIGRlbGV0ZSBuZXdDb250ZXh0Lmhhc0ZlZWRiYWNrO1xuICAgICAgZGVsZXRlIG5ld0NvbnRleHQuZmVlZGJhY2tJY29uO1xuICAgIH1cbiAgICByZXR1cm4gbmV3Q29udGV4dDtcbiAgfSwgW3N0YXR1cywgb3ZlcnJpZGUsIGZvcm1JdGVtSW5wdXRDb250ZXh0XSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGb3JtSXRlbUlucHV0Q29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBuZXdGb3JtSXRlbUlucHV0Q29udGV4dFxuICB9LCBjaGlsZHJlbik7XG59OyIsIi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ2MTc2MTY1L3dheXMtdG8tZ2V0LXN0cmluZy1saXRlcmFsLXR5cGUtb2YtYXJyYXktdmFsdWVzLXdpdGhvdXQtZW51bS1vdmVyaGVhZFxuZXhwb3J0IHZhciB0dXBsZSA9IGZ1bmN0aW9uIHR1cGxlKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG4gIHJldHVybiBhcmdzO1xufTtcbmV4cG9ydCB2YXIgdHVwbGVOdW0gPSBmdW5jdGlvbiB0dXBsZU51bSgpIHtcbiAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICB9XG4gIHJldHVybiBhcmdzO1xufTsiLCJpbXBvcnQgeyB0dXBsZSB9IGZyb20gJy4vdHlwZSc7XG4vLyA9PT09PT09PT09PT09PT09PT0gQ29sbGFwc2UgTW90aW9uID09PT09PT09PT09PT09PT09PVxudmFyIGdldENvbGxhcHNlZEhlaWdodCA9IGZ1bmN0aW9uIGdldENvbGxhcHNlZEhlaWdodCgpIHtcbiAgcmV0dXJuIHtcbiAgICBoZWlnaHQ6IDAsXG4gICAgb3BhY2l0eTogMFxuICB9O1xufTtcbnZhciBnZXRSZWFsSGVpZ2h0ID0gZnVuY3Rpb24gZ2V0UmVhbEhlaWdodChub2RlKSB7XG4gIHZhciBzY3JvbGxIZWlnaHQgPSBub2RlLnNjcm9sbEhlaWdodDtcbiAgcmV0dXJuIHtcbiAgICBoZWlnaHQ6IHNjcm9sbEhlaWdodCxcbiAgICBvcGFjaXR5OiAxXG4gIH07XG59O1xudmFyIGdldEN1cnJlbnRIZWlnaHQgPSBmdW5jdGlvbiBnZXRDdXJyZW50SGVpZ2h0KG5vZGUpIHtcbiAgcmV0dXJuIHtcbiAgICBoZWlnaHQ6IG5vZGUgPyBub2RlLm9mZnNldEhlaWdodCA6IDBcbiAgfTtcbn07XG52YXIgc2tpcE9wYWNpdHlUcmFuc2l0aW9uID0gZnVuY3Rpb24gc2tpcE9wYWNpdHlUcmFuc2l0aW9uKF8sIGV2ZW50KSB7XG4gIHJldHVybiAoZXZlbnQgPT09IG51bGwgfHwgZXZlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGV2ZW50LmRlYWRsaW5lKSA9PT0gdHJ1ZSB8fCBldmVudC5wcm9wZXJ0eU5hbWUgPT09ICdoZWlnaHQnO1xufTtcbnZhciBjb2xsYXBzZU1vdGlvbiA9IHtcbiAgbW90aW9uTmFtZTogJ2FudC1tb3Rpb24tY29sbGFwc2UnLFxuICBvbkFwcGVhclN0YXJ0OiBnZXRDb2xsYXBzZWRIZWlnaHQsXG4gIG9uRW50ZXJTdGFydDogZ2V0Q29sbGFwc2VkSGVpZ2h0LFxuICBvbkFwcGVhckFjdGl2ZTogZ2V0UmVhbEhlaWdodCxcbiAgb25FbnRlckFjdGl2ZTogZ2V0UmVhbEhlaWdodCxcbiAgb25MZWF2ZVN0YXJ0OiBnZXRDdXJyZW50SGVpZ2h0LFxuICBvbkxlYXZlQWN0aXZlOiBnZXRDb2xsYXBzZWRIZWlnaHQsXG4gIG9uQXBwZWFyRW5kOiBza2lwT3BhY2l0eVRyYW5zaXRpb24sXG4gIG9uRW50ZXJFbmQ6IHNraXBPcGFjaXR5VHJhbnNpdGlvbixcbiAgb25MZWF2ZUVuZDogc2tpcE9wYWNpdHlUcmFuc2l0aW9uLFxuICBtb3Rpb25EZWFkbGluZTogNTAwXG59O1xudmFyIFNlbGVjdFBsYWNlbWVudHMgPSB0dXBsZSgnYm90dG9tTGVmdCcsICdib3R0b21SaWdodCcsICd0b3BMZWZ0JywgJ3RvcFJpZ2h0Jyk7XG52YXIgZ2V0VHJhbnNpdGlvbkRpcmVjdGlvbiA9IGZ1bmN0aW9uIGdldFRyYW5zaXRpb25EaXJlY3Rpb24ocGxhY2VtZW50KSB7XG4gIGlmIChwbGFjZW1lbnQgIT09IHVuZGVmaW5lZCAmJiAocGxhY2VtZW50ID09PSAndG9wTGVmdCcgfHwgcGxhY2VtZW50ID09PSAndG9wUmlnaHQnKSkge1xuICAgIHJldHVybiBcInNsaWRlLWRvd25cIjtcbiAgfVxuICByZXR1cm4gXCJzbGlkZS11cFwiO1xufTtcbnZhciBnZXRUcmFuc2l0aW9uTmFtZSA9IGZ1bmN0aW9uIGdldFRyYW5zaXRpb25OYW1lKHJvb3RQcmVmaXhDbHMsIG1vdGlvbiwgdHJhbnNpdGlvbk5hbWUpIHtcbiAgaWYgKHRyYW5zaXRpb25OYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdHJhbnNpdGlvbk5hbWU7XG4gIH1cbiAgcmV0dXJuIFwiXCIuY29uY2F0KHJvb3RQcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQobW90aW9uKTtcbn07XG5leHBvcnQgeyBnZXRUcmFuc2l0aW9uTmFtZSwgZ2V0VHJhbnNpdGlvbkRpcmVjdGlvbiB9O1xuZXhwb3J0IGRlZmF1bHQgY29sbGFwc2VNb3Rpb247IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgdHVwbGUgfSBmcm9tICcuL3R5cGUnO1xudmFyIElucHV0U3RhdHVzZXMgPSB0dXBsZSgnd2FybmluZycsICdlcnJvcicsICcnKTtcbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGF0dXNDbGFzc05hbWVzKHByZWZpeENscywgc3RhdHVzLCBoYXNGZWVkYmFjaykge1xuICB2YXIgX2NsYXNzTmFtZXM7XG4gIHJldHVybiBjbGFzc05hbWVzKChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3RhdHVzLXN1Y2Nlc3NcIiksIHN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN0YXR1cy13YXJuaW5nXCIpLCBzdGF0dXMgPT09ICd3YXJuaW5nJyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zdGF0dXMtZXJyb3JcIiksIHN0YXR1cyA9PT0gJ2Vycm9yJyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zdGF0dXMtdmFsaWRhdGluZ1wiKSwgc3RhdHVzID09PSAndmFsaWRhdGluZycpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGFzLWZlZWRiYWNrXCIpLCBoYXNGZWVkYmFjayksIF9jbGFzc05hbWVzKSk7XG59XG5leHBvcnQgdmFyIGdldE1lcmdlZFN0YXR1cyA9IGZ1bmN0aW9uIGdldE1lcmdlZFN0YXR1cyhjb250ZXh0U3RhdHVzLCBjdXN0b21TdGF0dXMpIHtcbiAgcmV0dXJuIGN1c3RvbVN0YXR1cyB8fCBjb250ZXh0U3RhdHVzO1xufTsiLCIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBDaGVja091dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk05MTIgMTkwaC02OS45Yy05LjggMC0xOS4xIDQuNS0yNS4xIDEyLjJMNDA0LjcgNzI0LjUgMjA3IDQ3NGEzMiAzMiAwIDAwLTI1LjEtMTIuMkgxMTJjLTYuNyAwLTEwLjQgNy43LTYuMyAxMi45bDI3My45IDM0N2MxMi44IDE2LjIgMzcuNCAxNi4yIDUwLjMgMGw0ODguNC02MTguOWM0LjEtNS4xLjQtMTIuOC02LjMtMTIuOHpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImNoZWNrXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnQgZGVmYXVsdCBDaGVja091dGxpbmVkO1xuIiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQ2hlY2tPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9DaGVja091dGxpbmVkXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSAnLi4vY29tcG9uZW50cy9BbnRkSWNvbic7XG52YXIgQ2hlY2tPdXRsaW5lZCA9IGZ1bmN0aW9uIENoZWNrT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IENoZWNrT3V0bGluZWRTdmdcbiAgfSkpO1xufTtcbkNoZWNrT3V0bGluZWQuZGlzcGxheU5hbWUgPSAnQ2hlY2tPdXRsaW5lZCc7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihDaGVja091dGxpbmVkKTsiLCIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBEb3duT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTg4NCAyNTZoLTc1Yy01LjEgMC05LjkgMi41LTEyLjkgNi42TDUxMiA2NTQuMiAyMjcuOSAyNjIuNmMtMy00LjEtNy44LTYuNi0xMi45LTYuNmgtNzVjLTYuNSAwLTEwLjMgNy40LTYuNSAxMi43bDM1Mi42IDQ4Ni4xYzEyLjggMTcuNiAzOSAxNy42IDUxLjcgMGwzNTIuNi00ODYuMWMzLjktNS4zLjEtMTIuNy02LjQtMTIuN3pcIiB9IH1dIH0sIFwibmFtZVwiOiBcImRvd25cIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IERvd25PdXRsaW5lZDtcbiIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IERvd25PdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Eb3duT3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tICcuLi9jb21wb25lbnRzL0FudGRJY29uJztcbnZhciBEb3duT3V0bGluZWQgPSBmdW5jdGlvbiBEb3duT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IERvd25PdXRsaW5lZFN2Z1xuICB9KSk7XG59O1xuRG93bk91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ0Rvd25PdXRsaW5lZCc7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihEb3duT3V0bGluZWQpOyIsIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIFNlYXJjaE91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk05MDkuNiA4NTQuNUw2NDkuOSA1OTQuOEM2OTAuMiA1NDIuNyA3MTIgNDc5IDcxMiA0MTJjMC04MC4yLTMxLjMtMTU1LjQtODcuOS0yMTIuMS01Ni42LTU2LjctMTMyLTg3LjktMjEyLjEtODcuOXMtMTU1LjUgMzEuMy0yMTIuMSA4Ny45QzE0My4yIDI1Ni41IDExMiAzMzEuOCAxMTIgNDEyYzAgODAuMSAzMS4zIDE1NS41IDg3LjkgMjEyLjFDMjU2LjUgNjgwLjggMzMxLjggNzEyIDQxMiA3MTJjNjcgMCAxMzAuNi0yMS44IDE4Mi43LTYybDI1OS43IDI1OS42YTguMiA4LjIgMCAwMDExLjYgMGw0My42LTQzLjVhOC4yIDguMiAwIDAwMC0xMS42ek01NzAuNCA1NzAuNEM1MjggNjEyLjcgNDcxLjggNjM2IDQxMiA2MzZzLTExNi0yMy4zLTE1OC40LTY1LjZDMjExLjMgNTI4IDE4OCA0NzEuOCAxODggNDEyczIzLjMtMTE2LjEgNjUuNi0xNTguNEMyOTYgMjExLjMgMzUyLjIgMTg4IDQxMiAxODhzMTE2LjEgMjMuMiAxNTguNCA2NS42UzYzNiAzNTIuMiA2MzYgNDEycy0yMy4zIDExNi4xLTY1LjYgMTU4LjR6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJzZWFyY2hcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IFNlYXJjaE91dGxpbmVkO1xuIiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgU2VhcmNoT3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vU2VhcmNoT3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tICcuLi9jb21wb25lbnRzL0FudGRJY29uJztcbnZhciBTZWFyY2hPdXRsaW5lZCA9IGZ1bmN0aW9uIFNlYXJjaE91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBTZWFyY2hPdXRsaW5lZFN2Z1xuICB9KSk7XG59O1xuU2VhcmNoT3V0bGluZWQuZGlzcGxheU5hbWUgPSAnU2VhcmNoT3V0bGluZWQnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoU2VhcmNoT3V0bGluZWQpOyIsImltcG9ydCBDaGVja091dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DaGVja091dGxpbmVkXCI7XG5pbXBvcnQgQ2xvc2VDaXJjbGVGaWxsZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Nsb3NlQ2lyY2xlRmlsbGVkXCI7XG5pbXBvcnQgQ2xvc2VPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvQ2xvc2VPdXRsaW5lZFwiO1xuaW1wb3J0IERvd25PdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvRG93bk91dGxpbmVkXCI7XG5pbXBvcnQgTG9hZGluZ091dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9Mb2FkaW5nT3V0bGluZWRcIjtcbmltcG9ydCBTZWFyY2hPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvU2VhcmNoT3V0bGluZWRcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEljb25zKF9yZWYpIHtcbiAgdmFyIHN1ZmZpeEljb24gPSBfcmVmLnN1ZmZpeEljb24sXG4gICAgY2xlYXJJY29uID0gX3JlZi5jbGVhckljb24sXG4gICAgbWVudUl0ZW1TZWxlY3RlZEljb24gPSBfcmVmLm1lbnVJdGVtU2VsZWN0ZWRJY29uLFxuICAgIHJlbW92ZUljb24gPSBfcmVmLnJlbW92ZUljb24sXG4gICAgbG9hZGluZyA9IF9yZWYubG9hZGluZyxcbiAgICBtdWx0aXBsZSA9IF9yZWYubXVsdGlwbGUsXG4gICAgaGFzRmVlZGJhY2sgPSBfcmVmLmhhc0ZlZWRiYWNrLFxuICAgIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgIHNob3dBcnJvdyA9IF9yZWYuc2hvd0Fycm93LFxuICAgIGZlZWRiYWNrSWNvbiA9IF9yZWYuZmVlZGJhY2tJY29uO1xuICAvLyBDbGVhciBJY29uXG4gIHZhciBtZXJnZWRDbGVhckljb24gPSBjbGVhckljb24gIT09IG51bGwgJiYgY2xlYXJJY29uICE9PSB2b2lkIDAgPyBjbGVhckljb24gOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDbG9zZUNpcmNsZUZpbGxlZCwgbnVsbCk7XG4gIC8vIFZhbGlkYXRpb24gRmVlZGJhY2sgSWNvblxuICB2YXIgZ2V0U3VmZml4SWNvbk5vZGUgPSBmdW5jdGlvbiBnZXRTdWZmaXhJY29uTm9kZShhcnJvd0ljb24pIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIHNob3dBcnJvdyAhPT0gZmFsc2UgJiYgYXJyb3dJY29uLCBoYXNGZWVkYmFjayAmJiBmZWVkYmFja0ljb24pO1xuICB9O1xuICAvLyBBcnJvdyBpdGVtIGljb25cbiAgdmFyIG1lcmdlZFN1ZmZpeEljb24gPSBudWxsO1xuICBpZiAoc3VmZml4SWNvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbWVyZ2VkU3VmZml4SWNvbiA9IGdldFN1ZmZpeEljb25Ob2RlKHN1ZmZpeEljb24pO1xuICB9IGVsc2UgaWYgKGxvYWRpbmcpIHtcbiAgICBtZXJnZWRTdWZmaXhJY29uID0gZ2V0U3VmZml4SWNvbk5vZGUoIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExvYWRpbmdPdXRsaW5lZCwge1xuICAgICAgc3BpbjogdHJ1ZVxuICAgIH0pKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgaWNvbkNscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3VmZml4XCIpO1xuICAgIG1lcmdlZFN1ZmZpeEljb24gPSBmdW5jdGlvbiBtZXJnZWRTdWZmaXhJY29uKF9yZWYyKSB7XG4gICAgICB2YXIgb3BlbiA9IF9yZWYyLm9wZW4sXG4gICAgICAgIHNob3dTZWFyY2ggPSBfcmVmMi5zaG93U2VhcmNoO1xuICAgICAgaWYgKG9wZW4gJiYgc2hvd1NlYXJjaCkge1xuICAgICAgICByZXR1cm4gZ2V0U3VmZml4SWNvbk5vZGUoIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNlYXJjaE91dGxpbmVkLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBpY29uQ2xzXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBnZXRTdWZmaXhJY29uTm9kZSggLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRG93bk91dGxpbmVkLCB7XG4gICAgICAgIGNsYXNzTmFtZTogaWNvbkNsc1xuICAgICAgfSkpO1xuICAgIH07XG4gIH1cbiAgLy8gQ2hlY2tlZCBpdGVtIGljb25cbiAgdmFyIG1lcmdlZEl0ZW1JY29uID0gbnVsbDtcbiAgaWYgKG1lbnVJdGVtU2VsZWN0ZWRJY29uICE9PSB1bmRlZmluZWQpIHtcbiAgICBtZXJnZWRJdGVtSWNvbiA9IG1lbnVJdGVtU2VsZWN0ZWRJY29uO1xuICB9IGVsc2UgaWYgKG11bHRpcGxlKSB7XG4gICAgbWVyZ2VkSXRlbUljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDaGVja091dGxpbmVkLCBudWxsKTtcbiAgfSBlbHNlIHtcbiAgICBtZXJnZWRJdGVtSWNvbiA9IG51bGw7XG4gIH1cbiAgdmFyIG1lcmdlZFJlbW92ZUljb24gPSBudWxsO1xuICBpZiAocmVtb3ZlSWNvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbWVyZ2VkUmVtb3ZlSWNvbiA9IHJlbW92ZUljb247XG4gIH0gZWxzZSB7XG4gICAgbWVyZ2VkUmVtb3ZlSWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENsb3NlT3V0bGluZWQsIG51bGwpO1xuICB9XG4gIHJldHVybiB7XG4gICAgY2xlYXJJY29uOiBtZXJnZWRDbGVhckljb24sXG4gICAgc3VmZml4SWNvbjogbWVyZ2VkU3VmZml4SWNvbixcbiAgICBpdGVtSWNvbjogbWVyZ2VkSXRlbUljb24sXG4gICAgcmVtb3ZlSWNvbjogbWVyZ2VkUmVtb3ZlSWNvblxuICB9O1xufSIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB0b0FycmF5IGZyb20gXCJyYy11dGlsL2VzL0NoaWxkcmVuL3RvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuZXhwb3J0IHZhciBTcGFjZUNvbXBhY3RJdGVtQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuZXhwb3J0IHZhciB1c2VDb21wYWN0SXRlbUNvbnRleHQgPSBmdW5jdGlvbiB1c2VDb21wYWN0SXRlbUNvbnRleHQocHJlZml4Q2xzLCBkaXJlY3Rpb24pIHtcbiAgdmFyIGNvbXBhY3RJdGVtQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoU3BhY2VDb21wYWN0SXRlbUNvbnRleHQpO1xuICB2YXIgY29tcGFjdEl0ZW1DbGFzc25hbWVzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9jbGFzc05hbWVzO1xuICAgIGlmICghY29tcGFjdEl0ZW1Db250ZXh0KSByZXR1cm4gJyc7XG4gICAgdmFyIGNvbXBhY3REaXJlY3Rpb24gPSBjb21wYWN0SXRlbUNvbnRleHQuY29tcGFjdERpcmVjdGlvbixcbiAgICAgIGlzRmlyc3RJdGVtID0gY29tcGFjdEl0ZW1Db250ZXh0LmlzRmlyc3RJdGVtLFxuICAgICAgaXNMYXN0SXRlbSA9IGNvbXBhY3RJdGVtQ29udGV4dC5pc0xhc3RJdGVtO1xuICAgIHZhciBzZXBhcmF0b3IgPSBjb21wYWN0RGlyZWN0aW9uID09PSAndmVydGljYWwnID8gJy12ZXJ0aWNhbC0nIDogJy0nO1xuICAgIHJldHVybiBjbGFzc05hbWVzKChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29tcGFjdFwiKS5jb25jYXQoc2VwYXJhdG9yLCBcIml0ZW1cIiksIHRydWUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29tcGFjdFwiKS5jb25jYXQoc2VwYXJhdG9yLCBcImZpcnN0LWl0ZW1cIiksIGlzRmlyc3RJdGVtKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbXBhY3RcIikuY29uY2F0KHNlcGFyYXRvciwgXCJsYXN0LWl0ZW1cIiksIGlzTGFzdEl0ZW0pLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29tcGFjdFwiKS5jb25jYXQoc2VwYXJhdG9yLCBcIml0ZW0tcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX2NsYXNzTmFtZXMpKTtcbiAgfSwgW3ByZWZpeENscywgZGlyZWN0aW9uLCBjb21wYWN0SXRlbUNvbnRleHRdKTtcbiAgcmV0dXJuIHtcbiAgICBjb21wYWN0U2l6ZTogY29tcGFjdEl0ZW1Db250ZXh0ID09PSBudWxsIHx8IGNvbXBhY3RJdGVtQ29udGV4dCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29tcGFjdEl0ZW1Db250ZXh0LmNvbXBhY3RTaXplLFxuICAgIGNvbXBhY3REaXJlY3Rpb246IGNvbXBhY3RJdGVtQ29udGV4dCA9PT0gbnVsbCB8fCBjb21wYWN0SXRlbUNvbnRleHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbXBhY3RJdGVtQ29udGV4dC5jb21wYWN0RGlyZWN0aW9uLFxuICAgIGNvbXBhY3RJdGVtQ2xhc3NuYW1lczogY29tcGFjdEl0ZW1DbGFzc25hbWVzXG4gIH07XG59O1xuZXhwb3J0IHZhciBOb0NvbXBhY3RTdHlsZSA9IGZ1bmN0aW9uIE5vQ29tcGFjdFN0eWxlKF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNwYWNlQ29tcGFjdEl0ZW1Db250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IG51bGxcbiAgfSwgY2hpbGRyZW4pO1xufTtcbnZhciBDb21wYWN0SXRlbSA9IGZ1bmN0aW9uIENvbXBhY3RJdGVtKF9hKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLFxuICAgIG90aGVyUHJvcHMgPSBfX3Jlc3QoX2EsIFtcImNoaWxkcmVuXCJdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNwYWNlQ29tcGFjdEl0ZW1Db250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IG90aGVyUHJvcHNcbiAgfSwgY2hpbGRyZW4pO1xufTtcbnZhciBDb21wYWN0ID0gZnVuY3Rpb24gQ29tcGFjdChwcm9wcykge1xuICB2YXIgX2NsYXNzTmFtZXMyO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICBkaXJlY3Rpb25Db25maWcgPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb247XG4gIHZhciBfcHJvcHMkc2l6ZSA9IHByb3BzLnNpemUsXG4gICAgc2l6ZSA9IF9wcm9wcyRzaXplID09PSB2b2lkIDAgPyAnbWlkZGxlJyA6IF9wcm9wcyRzaXplLFxuICAgIGRpcmVjdGlvbiA9IHByb3BzLmRpcmVjdGlvbixcbiAgICBibG9jayA9IHByb3BzLmJsb2NrLFxuICAgIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICByZXN0UHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInNpemVcIiwgXCJkaXJlY3Rpb25cIiwgXCJibG9ja1wiLCBcInByZWZpeENsc1wiLCBcImNsYXNzTmFtZVwiLCBcImNoaWxkcmVuXCJdKTtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnc3BhY2UtY29tcGFjdCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIHZhciBjbHggPSBjbGFzc05hbWVzKHByZWZpeENscywgKF9jbGFzc05hbWVzMiA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uQ29uZmlnID09PSAncnRsJyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYmxvY2tcIiksIGJsb2NrKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi12ZXJ0aWNhbFwiKSwgZGlyZWN0aW9uID09PSAndmVydGljYWwnKSwgX2NsYXNzTmFtZXMyKSwgY2xhc3NOYW1lKTtcbiAgdmFyIGNvbXBhY3RJdGVtQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoU3BhY2VDb21wYWN0SXRlbUNvbnRleHQpO1xuICB2YXIgY2hpbGROb2RlcyA9IHRvQXJyYXkoY2hpbGRyZW4pO1xuICB2YXIgbm9kZXMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY2hpbGROb2Rlcy5tYXAoZnVuY3Rpb24gKGNoaWxkLCBpKSB7XG4gICAgICB2YXIga2V5ID0gY2hpbGQgJiYgY2hpbGQua2V5IHx8IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1cIikuY29uY2F0KGkpO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBhY3RJdGVtLCB7XG4gICAgICAgIGtleToga2V5LFxuICAgICAgICBjb21wYWN0U2l6ZTogc2l6ZSxcbiAgICAgICAgY29tcGFjdERpcmVjdGlvbjogZGlyZWN0aW9uLFxuICAgICAgICBpc0ZpcnN0SXRlbTogaSA9PT0gMCAmJiAoIWNvbXBhY3RJdGVtQ29udGV4dCB8fCAoY29tcGFjdEl0ZW1Db250ZXh0ID09PSBudWxsIHx8IGNvbXBhY3RJdGVtQ29udGV4dCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29tcGFjdEl0ZW1Db250ZXh0LmlzRmlyc3RJdGVtKSksXG4gICAgICAgIGlzTGFzdEl0ZW06IGkgPT09IGNoaWxkTm9kZXMubGVuZ3RoIC0gMSAmJiAoIWNvbXBhY3RJdGVtQ29udGV4dCB8fCAoY29tcGFjdEl0ZW1Db250ZXh0ID09PSBudWxsIHx8IGNvbXBhY3RJdGVtQ29udGV4dCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29tcGFjdEl0ZW1Db250ZXh0LmlzTGFzdEl0ZW0pKVxuICAgICAgfSwgY2hpbGQpO1xuICAgIH0pO1xuICB9LCBbc2l6ZSwgY2hpbGROb2RlcywgY29tcGFjdEl0ZW1Db250ZXh0XSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGlmIChjaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbHhcbiAgfSwgcmVzdFByb3BzKSwgbm9kZXMpO1xufTtcbmV4cG9ydCBkZWZhdWx0IENvbXBhY3Q7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuLy8gVE9ETzogNC4wIC0gY29kZW1vZCBzaG91bGQgaGVscCB0byBjaGFuZ2UgYGZpbHRlck9wdGlvbmAgdG8gc3VwcG9ydCBub2RlIHByb3BzLlxudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJjU2VsZWN0LCB7IE9wdEdyb3VwLCBPcHRpb24gfSBmcm9tICdyYy1zZWxlY3QnO1xuaW1wb3J0IG9taXQgZnJvbSBcInJjLXV0aWwvZXMvb21pdFwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IGRlZmF1bHRSZW5kZXJFbXB0eSBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvZGVmYXVsdFJlbmRlckVtcHR5JztcbmltcG9ydCBEaXNhYmxlZENvbnRleHQgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL0Rpc2FibGVkQ29udGV4dCc7XG5pbXBvcnQgU2l6ZUNvbnRleHQgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL1NpemVDb250ZXh0JztcbmltcG9ydCB7IEZvcm1JdGVtSW5wdXRDb250ZXh0IH0gZnJvbSAnLi4vZm9ybS9jb250ZXh0JztcbmltcG9ydCB7IGdldFRyYW5zaXRpb25EaXJlY3Rpb24sIGdldFRyYW5zaXRpb25OYW1lIH0gZnJvbSAnLi4vX3V0aWwvbW90aW9uJztcbmltcG9ydCB7IGdldE1lcmdlZFN0YXR1cywgZ2V0U3RhdHVzQ2xhc3NOYW1lcyB9IGZyb20gJy4uL191dGlsL3N0YXR1c1V0aWxzJztcbmltcG9ydCBnZXRJY29ucyBmcm9tICcuL3V0aWxzL2ljb25VdGlsJztcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4uL191dGlsL3dhcm5pbmcnO1xuaW1wb3J0IHsgdXNlQ29tcGFjdEl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vc3BhY2UvQ29tcGFjdCc7XG52YXIgU0VDUkVUX0NPTUJPQk9YX01PREVfRE9fTk9UX1VTRSA9ICdTRUNSRVRfQ09NQk9CT1hfTU9ERV9ET19OT1RfVVNFJztcbnZhciBJbnRlcm5hbFNlbGVjdCA9IGZ1bmN0aW9uIEludGVybmFsU2VsZWN0KF9hLCByZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzMjtcbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IF9hLnByZWZpeENscyxcbiAgICBfYSRib3JkZXJlZCA9IF9hLmJvcmRlcmVkLFxuICAgIGJvcmRlcmVkID0gX2EkYm9yZGVyZWQgPT09IHZvaWQgMCA/IHRydWUgOiBfYSRib3JkZXJlZCxcbiAgICBjbGFzc05hbWUgPSBfYS5jbGFzc05hbWUsXG4gICAgZ2V0UG9wdXBDb250YWluZXIgPSBfYS5nZXRQb3B1cENvbnRhaW5lcixcbiAgICBkcm9wZG93bkNsYXNzTmFtZSA9IF9hLmRyb3Bkb3duQ2xhc3NOYW1lLFxuICAgIHBvcHVwQ2xhc3NOYW1lID0gX2EucG9wdXBDbGFzc05hbWUsXG4gICAgX2EkbGlzdEhlaWdodCA9IF9hLmxpc3RIZWlnaHQsXG4gICAgbGlzdEhlaWdodCA9IF9hJGxpc3RIZWlnaHQgPT09IHZvaWQgMCA/IDI1NiA6IF9hJGxpc3RIZWlnaHQsXG4gICAgcGxhY2VtZW50ID0gX2EucGxhY2VtZW50LFxuICAgIF9hJGxpc3RJdGVtSGVpZ2h0ID0gX2EubGlzdEl0ZW1IZWlnaHQsXG4gICAgbGlzdEl0ZW1IZWlnaHQgPSBfYSRsaXN0SXRlbUhlaWdodCA9PT0gdm9pZCAwID8gMjQgOiBfYSRsaXN0SXRlbUhlaWdodCxcbiAgICBjdXN0b21pemVTaXplID0gX2Euc2l6ZSxcbiAgICBjdXN0b21EaXNhYmxlZCA9IF9hLmRpc2FibGVkLFxuICAgIG5vdEZvdW5kQ29udGVudCA9IF9hLm5vdEZvdW5kQ29udGVudCxcbiAgICBjdXN0b21TdGF0dXMgPSBfYS5zdGF0dXMsXG4gICAgc2hvd0Fycm93ID0gX2Euc2hvd0Fycm93LFxuICAgIHByb3BzID0gX19yZXN0KF9hLCBbXCJwcmVmaXhDbHNcIiwgXCJib3JkZXJlZFwiLCBcImNsYXNzTmFtZVwiLCBcImdldFBvcHVwQ29udGFpbmVyXCIsIFwiZHJvcGRvd25DbGFzc05hbWVcIiwgXCJwb3B1cENsYXNzTmFtZVwiLCBcImxpc3RIZWlnaHRcIiwgXCJwbGFjZW1lbnRcIiwgXCJsaXN0SXRlbUhlaWdodFwiLCBcInNpemVcIiwgXCJkaXNhYmxlZFwiLCBcIm5vdEZvdW5kQ29udGVudFwiLCBcInN0YXR1c1wiLCBcInNob3dBcnJvd1wiXSk7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCksXG4gICAgZ2V0Q29udGV4dFBvcHVwQ29udGFpbmVyID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UG9wdXBDb250YWluZXIsXG4gICAgZ2V0UHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UHJlZml4Q2xzLFxuICAgIHJlbmRlckVtcHR5ID0gX1JlYWN0JHVzZUNvbnRleHQucmVuZGVyRW1wdHksXG4gICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uLFxuICAgIHZpcnR1YWwgPSBfUmVhY3QkdXNlQ29udGV4dC52aXJ0dWFsLFxuICAgIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCA9IF9SZWFjdCR1c2VDb250ZXh0LmRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aDtcbiAgdmFyIHNpemUgPSBSZWFjdC51c2VDb250ZXh0KFNpemVDb250ZXh0KTtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnc2VsZWN0JywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIHJvb3RQcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoKTtcbiAgdmFyIF91c2VDb21wYWN0SXRlbUNvbnRleCA9IHVzZUNvbXBhY3RJdGVtQ29udGV4dChwcmVmaXhDbHMsIGRpcmVjdGlvbiksXG4gICAgY29tcGFjdFNpemUgPSBfdXNlQ29tcGFjdEl0ZW1Db250ZXguY29tcGFjdFNpemUsXG4gICAgY29tcGFjdEl0ZW1DbGFzc25hbWVzID0gX3VzZUNvbXBhY3RJdGVtQ29udGV4LmNvbXBhY3RJdGVtQ2xhc3NuYW1lcztcbiAgdmFyIG1vZGUgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbSA9IHByb3BzLm1vZGU7XG4gICAgaWYgKG0gPT09ICdjb21ib2JveCcpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChtID09PSBTRUNSRVRfQ09NQk9CT1hfTU9ERV9ET19OT1RfVVNFKSB7XG4gICAgICByZXR1cm4gJ2NvbWJvYm94JztcbiAgICB9XG4gICAgcmV0dXJuIG07XG4gIH0sIFtwcm9wcy5tb2RlXSk7XG4gIHZhciBpc011bHRpcGxlID0gbW9kZSA9PT0gJ211bHRpcGxlJyB8fCBtb2RlID09PSAndGFncyc7XG4gIHZhciBtZXJnZWRTaG93QXJyb3cgPSBzaG93QXJyb3cgIT09IHVuZGVmaW5lZCA/IHNob3dBcnJvdyA6IHByb3BzLmxvYWRpbmcgfHwgIShpc011bHRpcGxlIHx8IG1vZGUgPT09ICdjb21ib2JveCcpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09IFdhcm5pbmcgPT09PT09PT09PT09PT09PT09PT09XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoIWRyb3Bkb3duQ2xhc3NOYW1lLCAnU2VsZWN0JywgJ2Bkcm9wZG93bkNsYXNzTmFtZWAgaXMgZGVwcmVjYXRlZCB3aGljaCB3aWxsIGJlIHJlbW92ZWQgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLiBQbGVhc2UgdXNlIGBwb3B1cENsYXNzTmFtZWAgaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IEZvcm0gU3RhdHVzID09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZUNvbnRleHQgPSB1c2VDb250ZXh0KEZvcm1JdGVtSW5wdXRDb250ZXh0KSxcbiAgICBjb250ZXh0U3RhdHVzID0gX3VzZUNvbnRleHQuc3RhdHVzLFxuICAgIGhhc0ZlZWRiYWNrID0gX3VzZUNvbnRleHQuaGFzRmVlZGJhY2ssXG4gICAgaXNGb3JtSXRlbUlucHV0ID0gX3VzZUNvbnRleHQuaXNGb3JtSXRlbUlucHV0LFxuICAgIGZlZWRiYWNrSWNvbiA9IF91c2VDb250ZXh0LmZlZWRiYWNrSWNvbjtcbiAgdmFyIG1lcmdlZFN0YXR1cyA9IGdldE1lcmdlZFN0YXR1cyhjb250ZXh0U3RhdHVzLCBjdXN0b21TdGF0dXMpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gRW1wdHkgPT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtZXJnZWROb3RGb3VuZDtcbiAgaWYgKG5vdEZvdW5kQ29udGVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbWVyZ2VkTm90Rm91bmQgPSBub3RGb3VuZENvbnRlbnQ7XG4gIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2NvbWJvYm94Jykge1xuICAgIG1lcmdlZE5vdEZvdW5kID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICBtZXJnZWROb3RGb3VuZCA9IChyZW5kZXJFbXB0eSB8fCBkZWZhdWx0UmVuZGVyRW1wdHkpKCdTZWxlY3QnKTtcbiAgfVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gSWNvbnMgPT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfZ2V0SWNvbnMgPSBnZXRJY29ucyhfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgcHJvcHMpLCB7XG4gICAgICBtdWx0aXBsZTogaXNNdWx0aXBsZSxcbiAgICAgIGhhc0ZlZWRiYWNrOiBoYXNGZWVkYmFjayxcbiAgICAgIGZlZWRiYWNrSWNvbjogZmVlZGJhY2tJY29uLFxuICAgICAgc2hvd0Fycm93OiBtZXJnZWRTaG93QXJyb3csXG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENsc1xuICAgIH0pKSxcbiAgICBzdWZmaXhJY29uID0gX2dldEljb25zLnN1ZmZpeEljb24sXG4gICAgaXRlbUljb24gPSBfZ2V0SWNvbnMuaXRlbUljb24sXG4gICAgcmVtb3ZlSWNvbiA9IF9nZXRJY29ucy5yZW1vdmVJY29uLFxuICAgIGNsZWFySWNvbiA9IF9nZXRJY29ucy5jbGVhckljb247XG4gIHZhciBzZWxlY3RQcm9wcyA9IG9taXQocHJvcHMsIFsnc3VmZml4SWNvbicsICdpdGVtSWNvbiddKTtcbiAgdmFyIHJjU2VsZWN0UnRsRHJvcGRvd25DbGFzc05hbWUgPSBjbGFzc05hbWVzKHBvcHVwQ2xhc3NOYW1lIHx8IGRyb3Bkb3duQ2xhc3NOYW1lLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZHJvcGRvd24tXCIpLmNvbmNhdChkaXJlY3Rpb24pLCBkaXJlY3Rpb24gPT09ICdydGwnKSk7XG4gIHZhciBtZXJnZWRTaXplID0gY29tcGFjdFNpemUgfHwgY3VzdG9taXplU2l6ZSB8fCBzaXplO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gRGlzYWJsZWQgPT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBkaXNhYmxlZCA9IFJlYWN0LnVzZUNvbnRleHQoRGlzYWJsZWRDb250ZXh0KTtcbiAgdmFyIG1lcmdlZERpc2FibGVkID0gY3VzdG9tRGlzYWJsZWQgIT09IG51bGwgJiYgY3VzdG9tRGlzYWJsZWQgIT09IHZvaWQgMCA/IGN1c3RvbURpc2FibGVkIDogZGlzYWJsZWQ7XG4gIHZhciBtZXJnZWRDbGFzc05hbWUgPSBjbGFzc05hbWVzKChfY2xhc3NOYW1lczIgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1sZ1wiKSwgbWVyZ2VkU2l6ZSA9PT0gJ2xhcmdlJyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc21cIiksIG1lcmdlZFNpemUgPT09ICdzbWFsbCcpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYm9yZGVybGVzc1wiKSwgIWJvcmRlcmVkKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbi1mb3JtLWl0ZW1cIiksIGlzRm9ybUl0ZW1JbnB1dCksIF9jbGFzc05hbWVzMiksIGdldFN0YXR1c0NsYXNzTmFtZXMocHJlZml4Q2xzLCBtZXJnZWRTdGF0dXMsIGhhc0ZlZWRiYWNrKSwgY29tcGFjdEl0ZW1DbGFzc25hbWVzLCBjbGFzc05hbWUpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gUGxhY2VtZW50ID09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgZ2V0UGxhY2VtZW50ID0gZnVuY3Rpb24gZ2V0UGxhY2VtZW50KCkge1xuICAgIGlmIChwbGFjZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHBsYWNlbWVudDtcbiAgICB9XG4gICAgcmV0dXJuIGRpcmVjdGlvbiA9PT0gJ3J0bCcgPyAnYm90dG9tUmlnaHQnIDogJ2JvdHRvbUxlZnQnO1xuICB9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmNTZWxlY3QsIF9leHRlbmRzKHtcbiAgICByZWY6IHJlZixcbiAgICB2aXJ0dWFsOiB2aXJ0dWFsLFxuICAgIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aDogZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoXG4gIH0sIHNlbGVjdFByb3BzLCB7XG4gICAgdHJhbnNpdGlvbk5hbWU6IGdldFRyYW5zaXRpb25OYW1lKHJvb3RQcmVmaXhDbHMsIGdldFRyYW5zaXRpb25EaXJlY3Rpb24ocGxhY2VtZW50KSwgcHJvcHMudHJhbnNpdGlvbk5hbWUpLFxuICAgIGxpc3RIZWlnaHQ6IGxpc3RIZWlnaHQsXG4gICAgbGlzdEl0ZW1IZWlnaHQ6IGxpc3RJdGVtSGVpZ2h0LFxuICAgIG1vZGU6IG1vZGUsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgcGxhY2VtZW50OiBnZXRQbGFjZW1lbnQoKSxcbiAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICBpbnB1dEljb246IHN1ZmZpeEljb24sXG4gICAgbWVudUl0ZW1TZWxlY3RlZEljb246IGl0ZW1JY29uLFxuICAgIHJlbW92ZUljb246IHJlbW92ZUljb24sXG4gICAgY2xlYXJJY29uOiBjbGVhckljb24sXG4gICAgbm90Rm91bmRDb250ZW50OiBtZXJnZWROb3RGb3VuZCxcbiAgICBjbGFzc05hbWU6IG1lcmdlZENsYXNzTmFtZSxcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXIgfHwgZ2V0Q29udGV4dFBvcHVwQ29udGFpbmVyLFxuICAgIGRyb3Bkb3duQ2xhc3NOYW1lOiByY1NlbGVjdFJ0bERyb3Bkb3duQ2xhc3NOYW1lLFxuICAgIHNob3dBcnJvdzogaGFzRmVlZGJhY2sgfHwgc2hvd0Fycm93LFxuICAgIGRpc2FibGVkOiBtZXJnZWREaXNhYmxlZFxuICB9KSk7XG59O1xudmFyIFNlbGVjdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEludGVybmFsU2VsZWN0KTtcblNlbGVjdC5TRUNSRVRfQ09NQk9CT1hfTU9ERV9ET19OT1RfVVNFID0gU0VDUkVUX0NPTUJPQk9YX01PREVfRE9fTk9UX1VTRTtcblNlbGVjdC5PcHRpb24gPSBPcHRpb247XG5TZWxlY3QuT3B0R3JvdXAgPSBPcHRHcm91cDtcbmV4cG9ydCBkZWZhdWx0IFNlbGVjdDsiLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUZvcmNlVXBkYXRlKCkge1xuICB2YXIgX1JlYWN0JHVzZVJlZHVjZXIgPSBSZWFjdC51c2VSZWR1Y2VyKGZ1bmN0aW9uICh4KSB7XG4gICAgICByZXR1cm4geCArIDE7XG4gICAgfSwgMCksXG4gICAgX1JlYWN0JHVzZVJlZHVjZXIyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVJlZHVjZXIsIDIpLFxuICAgIGZvcmNlVXBkYXRlID0gX1JlYWN0JHVzZVJlZHVjZXIyWzFdO1xuICByZXR1cm4gZm9yY2VVcGRhdGU7XG59IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuZXhwb3J0IHZhciByZXNwb25zaXZlQXJyYXkgPSBbJ3h4bCcsICd4bCcsICdsZycsICdtZCcsICdzbScsICd4cyddO1xuZXhwb3J0IHZhciByZXNwb25zaXZlTWFwID0ge1xuICB4czogJyhtYXgtd2lkdGg6IDU3NXB4KScsXG4gIHNtOiAnKG1pbi13aWR0aDogNTc2cHgpJyxcbiAgbWQ6ICcobWluLXdpZHRoOiA3NjhweCknLFxuICBsZzogJyhtaW4td2lkdGg6IDk5MnB4KScsXG4gIHhsOiAnKG1pbi13aWR0aDogMTIwMHB4KScsXG4gIHh4bDogJyhtaW4td2lkdGg6IDE2MDBweCknXG59O1xudmFyIHN1YnNjcmliZXJzID0gbmV3IE1hcCgpO1xudmFyIHN1YlVpZCA9IC0xO1xudmFyIHNjcmVlbnMgPSB7fTtcbnZhciByZXNwb25zaXZlT2JzZXJ2ZSA9IHtcbiAgbWF0Y2hIYW5kbGVyczoge30sXG4gIGRpc3BhdGNoOiBmdW5jdGlvbiBkaXNwYXRjaChwb2ludE1hcCkge1xuICAgIHNjcmVlbnMgPSBwb2ludE1hcDtcbiAgICBzdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICByZXR1cm4gZnVuYyhzY3JlZW5zKTtcbiAgICB9KTtcbiAgICByZXR1cm4gc3Vic2NyaWJlcnMuc2l6ZSA+PSAxO1xuICB9LFxuICBzdWJzY3JpYmU6IGZ1bmN0aW9uIHN1YnNjcmliZShmdW5jKSB7XG4gICAgaWYgKCFzdWJzY3JpYmVycy5zaXplKSB0aGlzLnJlZ2lzdGVyKCk7XG4gICAgc3ViVWlkICs9IDE7XG4gICAgc3Vic2NyaWJlcnMuc2V0KHN1YlVpZCwgZnVuYyk7XG4gICAgZnVuYyhzY3JlZW5zKTtcbiAgICByZXR1cm4gc3ViVWlkO1xuICB9LFxuICB1bnN1YnNjcmliZTogZnVuY3Rpb24gdW5zdWJzY3JpYmUodG9rZW4pIHtcbiAgICBzdWJzY3JpYmVyc1tcImRlbGV0ZVwiXSh0b2tlbik7XG4gICAgaWYgKCFzdWJzY3JpYmVycy5zaXplKSB0aGlzLnVucmVnaXN0ZXIoKTtcbiAgfSxcbiAgdW5yZWdpc3RlcjogZnVuY3Rpb24gdW5yZWdpc3RlcigpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIE9iamVjdC5rZXlzKHJlc3BvbnNpdmVNYXApLmZvckVhY2goZnVuY3Rpb24gKHNjcmVlbikge1xuICAgICAgdmFyIG1hdGNoTWVkaWFRdWVyeSA9IHJlc3BvbnNpdmVNYXBbc2NyZWVuXTtcbiAgICAgIHZhciBoYW5kbGVyID0gX3RoaXMubWF0Y2hIYW5kbGVyc1ttYXRjaE1lZGlhUXVlcnldO1xuICAgICAgaGFuZGxlciA9PT0gbnVsbCB8fCBoYW5kbGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBoYW5kbGVyLm1xbC5yZW1vdmVMaXN0ZW5lcihoYW5kbGVyID09PSBudWxsIHx8IGhhbmRsZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGhhbmRsZXIubGlzdGVuZXIpO1xuICAgIH0pO1xuICAgIHN1YnNjcmliZXJzLmNsZWFyKCk7XG4gIH0sXG4gIHJlZ2lzdGVyOiBmdW5jdGlvbiByZWdpc3RlcigpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcbiAgICBPYmplY3Qua2V5cyhyZXNwb25zaXZlTWFwKS5mb3JFYWNoKGZ1bmN0aW9uIChzY3JlZW4pIHtcbiAgICAgIHZhciBtYXRjaE1lZGlhUXVlcnkgPSByZXNwb25zaXZlTWFwW3NjcmVlbl07XG4gICAgICB2YXIgbGlzdGVuZXIgPSBmdW5jdGlvbiBsaXN0ZW5lcihfcmVmKSB7XG4gICAgICAgIHZhciBtYXRjaGVzID0gX3JlZi5tYXRjaGVzO1xuICAgICAgICBfdGhpczIuZGlzcGF0Y2goX2V4dGVuZHMoX2V4dGVuZHMoe30sIHNjcmVlbnMpLCBfZGVmaW5lUHJvcGVydHkoe30sIHNjcmVlbiwgbWF0Y2hlcykpKTtcbiAgICAgIH07XG4gICAgICB2YXIgbXFsID0gd2luZG93Lm1hdGNoTWVkaWEobWF0Y2hNZWRpYVF1ZXJ5KTtcbiAgICAgIG1xbC5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgICBfdGhpczIubWF0Y2hIYW5kbGVyc1ttYXRjaE1lZGlhUXVlcnldID0ge1xuICAgICAgICBtcWw6IG1xbCxcbiAgICAgICAgbGlzdGVuZXI6IGxpc3RlbmVyXG4gICAgICB9O1xuICAgICAgbGlzdGVuZXIobXFsKTtcbiAgICB9KTtcbiAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IHJlc3BvbnNpdmVPYnNlcnZlOyIsImltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZUZvcmNlVXBkYXRlIGZyb20gJy4uLy4uL191dGlsL2hvb2tzL3VzZUZvcmNlVXBkYXRlJztcbmltcG9ydCBSZXNwb25zaXZlT2JzZXJ2ZSBmcm9tICcuLi8uLi9fdXRpbC9yZXNwb25zaXZlT2JzZXJ2ZSc7XG5mdW5jdGlvbiB1c2VCcmVha3BvaW50KCkge1xuICB2YXIgcmVmcmVzaE9uQ2hhbmdlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0cnVlO1xuICB2YXIgc2NyZWVuc1JlZiA9IHVzZVJlZih7fSk7XG4gIHZhciBmb3JjZVVwZGF0ZSA9IHVzZUZvcmNlVXBkYXRlKCk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRva2VuID0gUmVzcG9uc2l2ZU9ic2VydmUuc3Vic2NyaWJlKGZ1bmN0aW9uIChzdXBwb3J0U2NyZWVucykge1xuICAgICAgc2NyZWVuc1JlZi5jdXJyZW50ID0gc3VwcG9ydFNjcmVlbnM7XG4gICAgICBpZiAocmVmcmVzaE9uQ2hhbmdlKSB7XG4gICAgICAgIGZvcmNlVXBkYXRlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBSZXNwb25zaXZlT2JzZXJ2ZS51bnN1YnNjcmliZSh0b2tlbik7XG4gICAgfTtcbiAgfSwgW10pO1xuICByZXR1cm4gc2NyZWVuc1JlZi5jdXJyZW50O1xufVxuZXhwb3J0IGRlZmF1bHQgdXNlQnJlYWtwb2ludDsiLCJ2YXIgYXV0b0FkanVzdE92ZXJmbG93ID0ge1xuICBhZGp1c3RYOiAxLFxuICBhZGp1c3RZOiAxXG59O1xudmFyIHRhcmdldE9mZnNldCA9IFswLCAwXTtcbmV4cG9ydCB2YXIgcGxhY2VtZW50cyA9IHtcbiAgbGVmdDoge1xuICAgIHBvaW50czogWydjcicsICdjbCddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgb2Zmc2V0OiBbLTQsIDBdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIHJpZ2h0OiB7XG4gICAgcG9pbnRzOiBbJ2NsJywgJ2NyJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvdyxcbiAgICBvZmZzZXQ6IFs0LCAwXSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICB0b3A6IHtcbiAgICBwb2ludHM6IFsnYmMnLCAndGMnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIC00XSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICBib3R0b206IHtcbiAgICBwb2ludHM6IFsndGMnLCAnYmMnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIDRdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIHRvcExlZnQ6IHtcbiAgICBwb2ludHM6IFsnYmwnLCAndGwnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIC00XSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICBsZWZ0VG9wOiB7XG4gICAgcG9pbnRzOiBbJ3RyJywgJ3RsJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvdyxcbiAgICBvZmZzZXQ6IFstNCwgMF0sXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgfSxcbiAgdG9wUmlnaHQ6IHtcbiAgICBwb2ludHM6IFsnYnInLCAndHInXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIC00XSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICByaWdodFRvcDoge1xuICAgIHBvaW50czogWyd0bCcsICd0ciddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgb2Zmc2V0OiBbNCwgMF0sXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgfSxcbiAgYm90dG9tUmlnaHQ6IHtcbiAgICBwb2ludHM6IFsndHInLCAnYnInXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIDRdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIHJpZ2h0Qm90dG9tOiB7XG4gICAgcG9pbnRzOiBbJ2JsJywgJ2JyJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvdyxcbiAgICBvZmZzZXQ6IFs0LCAwXSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICBib3R0b21MZWZ0OiB7XG4gICAgcG9pbnRzOiBbJ3RsJywgJ2JsJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvdyxcbiAgICBvZmZzZXQ6IFswLCA0XSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICBsZWZ0Qm90dG9tOiB7XG4gICAgcG9pbnRzOiBbJ2JyJywgJ2JsJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvdyxcbiAgICBvZmZzZXQ6IFstNCwgMF0sXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IHBsYWNlbWVudHM7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBQb3B1cChwcm9wcykge1xuICB2YXIgc2hvd0Fycm93ID0gcHJvcHMuc2hvd0Fycm93LFxuICAgICAgYXJyb3dDb250ZW50ID0gcHJvcHMuYXJyb3dDb250ZW50LFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIGlkID0gcHJvcHMuaWQsXG4gICAgICBvdmVybGF5SW5uZXJTdHlsZSA9IHByb3BzLm92ZXJsYXlJbm5lclN0eWxlLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgc3R5bGUgPSBwcm9wcy5zdHlsZTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50XCIpLCBjbGFzc05hbWUpLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCBzaG93QXJyb3cgIT09IGZhbHNlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYXJyb3dcIiksXG4gICAga2V5OiBcImFycm93XCJcbiAgfSwgYXJyb3dDb250ZW50KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbm5lclwiKSxcbiAgICBpZDogaWQsXG4gICAgcm9sZTogXCJ0b29sdGlwXCIsXG4gICAgc3R5bGU6IG92ZXJsYXlJbm5lclN0eWxlXG4gIH0sIHR5cGVvZiBjaGlsZHJlbiA9PT0gJ2Z1bmN0aW9uJyA/IGNoaWxkcmVuKCkgOiBjaGlsZHJlbikpO1xufSIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VSZWYsIHVzZUltcGVyYXRpdmVIYW5kbGUsIGZvcndhcmRSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgVHJpZ2dlciBmcm9tICdyYy10cmlnZ2VyJztcbmltcG9ydCB7IHBsYWNlbWVudHMgfSBmcm9tICcuL3BsYWNlbWVudHMnO1xuaW1wb3J0IFBvcHVwIGZyb20gJy4vUG9wdXAnO1xuXG52YXIgVG9vbHRpcCA9IGZ1bmN0aW9uIFRvb2x0aXAocHJvcHMsIHJlZikge1xuICB2YXIgb3ZlcmxheUNsYXNzTmFtZSA9IHByb3BzLm92ZXJsYXlDbGFzc05hbWUsXG4gICAgICBfcHJvcHMkdHJpZ2dlciA9IHByb3BzLnRyaWdnZXIsXG4gICAgICB0cmlnZ2VyID0gX3Byb3BzJHRyaWdnZXIgPT09IHZvaWQgMCA/IFsnaG92ZXInXSA6IF9wcm9wcyR0cmlnZ2VyLFxuICAgICAgX3Byb3BzJG1vdXNlRW50ZXJEZWxhID0gcHJvcHMubW91c2VFbnRlckRlbGF5LFxuICAgICAgbW91c2VFbnRlckRlbGF5ID0gX3Byb3BzJG1vdXNlRW50ZXJEZWxhID09PSB2b2lkIDAgPyAwIDogX3Byb3BzJG1vdXNlRW50ZXJEZWxhLFxuICAgICAgX3Byb3BzJG1vdXNlTGVhdmVEZWxhID0gcHJvcHMubW91c2VMZWF2ZURlbGF5LFxuICAgICAgbW91c2VMZWF2ZURlbGF5ID0gX3Byb3BzJG1vdXNlTGVhdmVEZWxhID09PSB2b2lkIDAgPyAwLjEgOiBfcHJvcHMkbW91c2VMZWF2ZURlbGEsXG4gICAgICBvdmVybGF5U3R5bGUgPSBwcm9wcy5vdmVybGF5U3R5bGUsXG4gICAgICBfcHJvcHMkcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgcHJlZml4Q2xzID0gX3Byb3BzJHByZWZpeENscyA9PT0gdm9pZCAwID8gJ3JjLXRvb2x0aXAnIDogX3Byb3BzJHByZWZpeENscyxcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBvblZpc2libGVDaGFuZ2UgPSBwcm9wcy5vblZpc2libGVDaGFuZ2UsXG4gICAgICBhZnRlclZpc2libGVDaGFuZ2UgPSBwcm9wcy5hZnRlclZpc2libGVDaGFuZ2UsXG4gICAgICB0cmFuc2l0aW9uTmFtZSA9IHByb3BzLnRyYW5zaXRpb25OYW1lLFxuICAgICAgYW5pbWF0aW9uID0gcHJvcHMuYW5pbWF0aW9uLFxuICAgICAgbW90aW9uID0gcHJvcHMubW90aW9uLFxuICAgICAgX3Byb3BzJHBsYWNlbWVudCA9IHByb3BzLnBsYWNlbWVudCxcbiAgICAgIHBsYWNlbWVudCA9IF9wcm9wcyRwbGFjZW1lbnQgPT09IHZvaWQgMCA/ICdyaWdodCcgOiBfcHJvcHMkcGxhY2VtZW50LFxuICAgICAgX3Byb3BzJGFsaWduID0gcHJvcHMuYWxpZ24sXG4gICAgICBhbGlnbiA9IF9wcm9wcyRhbGlnbiA9PT0gdm9pZCAwID8ge30gOiBfcHJvcHMkYWxpZ24sXG4gICAgICBfcHJvcHMkZGVzdHJveVRvb2x0aXAgPSBwcm9wcy5kZXN0cm95VG9vbHRpcE9uSGlkZSxcbiAgICAgIGRlc3Ryb3lUb29sdGlwT25IaWRlID0gX3Byb3BzJGRlc3Ryb3lUb29sdGlwID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRkZXN0cm95VG9vbHRpcCxcbiAgICAgIGRlZmF1bHRWaXNpYmxlID0gcHJvcHMuZGVmYXVsdFZpc2libGUsXG4gICAgICBnZXRUb29sdGlwQ29udGFpbmVyID0gcHJvcHMuZ2V0VG9vbHRpcENvbnRhaW5lcixcbiAgICAgIG92ZXJsYXlJbm5lclN0eWxlID0gcHJvcHMub3ZlcmxheUlubmVyU3R5bGUsXG4gICAgICBhcnJvd0NvbnRlbnQgPSBwcm9wcy5hcnJvd0NvbnRlbnQsXG4gICAgICBvdmVybGF5ID0gcHJvcHMub3ZlcmxheSxcbiAgICAgIGlkID0gcHJvcHMuaWQsXG4gICAgICBzaG93QXJyb3cgPSBwcm9wcy5zaG93QXJyb3csXG4gICAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIFtcIm92ZXJsYXlDbGFzc05hbWVcIiwgXCJ0cmlnZ2VyXCIsIFwibW91c2VFbnRlckRlbGF5XCIsIFwibW91c2VMZWF2ZURlbGF5XCIsIFwib3ZlcmxheVN0eWxlXCIsIFwicHJlZml4Q2xzXCIsIFwiY2hpbGRyZW5cIiwgXCJvblZpc2libGVDaGFuZ2VcIiwgXCJhZnRlclZpc2libGVDaGFuZ2VcIiwgXCJ0cmFuc2l0aW9uTmFtZVwiLCBcImFuaW1hdGlvblwiLCBcIm1vdGlvblwiLCBcInBsYWNlbWVudFwiLCBcImFsaWduXCIsIFwiZGVzdHJveVRvb2x0aXBPbkhpZGVcIiwgXCJkZWZhdWx0VmlzaWJsZVwiLCBcImdldFRvb2x0aXBDb250YWluZXJcIiwgXCJvdmVybGF5SW5uZXJTdHlsZVwiLCBcImFycm93Q29udGVudFwiLCBcIm92ZXJsYXlcIiwgXCJpZFwiLCBcInNob3dBcnJvd1wiXSk7XG5cbiAgdmFyIGRvbVJlZiA9IHVzZVJlZihudWxsKTtcbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZG9tUmVmLmN1cnJlbnQ7XG4gIH0pO1xuXG4gIHZhciBleHRyYVByb3BzID0gX29iamVjdFNwcmVhZCh7fSwgcmVzdFByb3BzKTtcblxuICBpZiAoJ3Zpc2libGUnIGluIHByb3BzKSB7XG4gICAgZXh0cmFQcm9wcy5wb3B1cFZpc2libGUgPSBwcm9wcy52aXNpYmxlO1xuICB9XG5cbiAgdmFyIGdldFBvcHVwRWxlbWVudCA9IGZ1bmN0aW9uIGdldFBvcHVwRWxlbWVudCgpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUG9wdXAsIHtcbiAgICAgIHNob3dBcnJvdzogc2hvd0Fycm93LFxuICAgICAgYXJyb3dDb250ZW50OiBhcnJvd0NvbnRlbnQsXG4gICAgICBrZXk6IFwiY29udGVudFwiLFxuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICBpZDogaWQsXG4gICAgICBvdmVybGF5SW5uZXJTdHlsZTogb3ZlcmxheUlubmVyU3R5bGVcbiAgICB9LCBvdmVybGF5KTtcbiAgfTtcblxuICB2YXIgZGVzdHJveVRvb2x0aXAgPSBmYWxzZTtcbiAgdmFyIGF1dG9EZXN0cm95ID0gZmFsc2U7XG5cbiAgaWYgKHR5cGVvZiBkZXN0cm95VG9vbHRpcE9uSGlkZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgZGVzdHJveVRvb2x0aXAgPSBkZXN0cm95VG9vbHRpcE9uSGlkZTtcbiAgfSBlbHNlIGlmIChkZXN0cm95VG9vbHRpcE9uSGlkZSAmJiBfdHlwZW9mKGRlc3Ryb3lUb29sdGlwT25IaWRlKSA9PT0gJ29iamVjdCcpIHtcbiAgICB2YXIga2VlcFBhcmVudCA9IGRlc3Ryb3lUb29sdGlwT25IaWRlLmtlZXBQYXJlbnQ7XG4gICAgZGVzdHJveVRvb2x0aXAgPSBrZWVwUGFyZW50ID09PSB0cnVlO1xuICAgIGF1dG9EZXN0cm95ID0ga2VlcFBhcmVudCA9PT0gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVHJpZ2dlciwgX2V4dGVuZHMoe1xuICAgIHBvcHVwQ2xhc3NOYW1lOiBvdmVybGF5Q2xhc3NOYW1lLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIHBvcHVwOiBnZXRQb3B1cEVsZW1lbnQsXG4gICAgYWN0aW9uOiB0cmlnZ2VyLFxuICAgIGJ1aWx0aW5QbGFjZW1lbnRzOiBwbGFjZW1lbnRzLFxuICAgIHBvcHVwUGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgcmVmOiBkb21SZWYsXG4gICAgcG9wdXBBbGlnbjogYWxpZ24sXG4gICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFRvb2x0aXBDb250YWluZXIsXG4gICAgb25Qb3B1cFZpc2libGVDaGFuZ2U6IG9uVmlzaWJsZUNoYW5nZSxcbiAgICBhZnRlclBvcHVwVmlzaWJsZUNoYW5nZTogYWZ0ZXJWaXNpYmxlQ2hhbmdlLFxuICAgIHBvcHVwVHJhbnNpdGlvbk5hbWU6IHRyYW5zaXRpb25OYW1lLFxuICAgIHBvcHVwQW5pbWF0aW9uOiBhbmltYXRpb24sXG4gICAgcG9wdXBNb3Rpb246IG1vdGlvbixcbiAgICBkZWZhdWx0UG9wdXBWaXNpYmxlOiBkZWZhdWx0VmlzaWJsZSxcbiAgICBkZXN0cm95UG9wdXBPbkhpZGU6IGRlc3Ryb3lUb29sdGlwLFxuICAgIGF1dG9EZXN0cm95OiBhdXRvRGVzdHJveSxcbiAgICBtb3VzZUxlYXZlRGVsYXk6IG1vdXNlTGVhdmVEZWxheSxcbiAgICBwb3B1cFN0eWxlOiBvdmVybGF5U3R5bGUsXG4gICAgbW91c2VFbnRlckRlbGF5OiBtb3VzZUVudGVyRGVsYXlcbiAgfSwgZXh0cmFQcm9wcyksIGNoaWxkcmVuKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9mb3J3YXJkUmVmKFRvb2x0aXApOyIsImltcG9ydCB7IHR1cGxlIH0gZnJvbSAnLi90eXBlJztcbmV4cG9ydCB2YXIgUHJlc2V0U3RhdHVzQ29sb3JUeXBlcyA9IHR1cGxlKCdzdWNjZXNzJywgJ3Byb2Nlc3NpbmcnLCAnZXJyb3InLCAnZGVmYXVsdCcsICd3YXJuaW5nJyk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L3ByZWZlci1kZWZhdWx0LWV4cG9ydFxuZXhwb3J0IHZhciBQcmVzZXRDb2xvclR5cGVzID0gdHVwbGUoJ3BpbmsnLCAncmVkJywgJ3llbGxvdycsICdvcmFuZ2UnLCAnY3lhbicsICdncmVlbicsICdibHVlJywgJ3B1cnBsZScsICdnZWVrYmx1ZScsICdtYWdlbnRhJywgJ3ZvbGNhbm8nLCAnZ29sZCcsICdsaW1lJyk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgeyBwbGFjZW1lbnRzIH0gZnJvbSBcInJjLXRvb2x0aXAvZXMvcGxhY2VtZW50c1wiO1xudmFyIGF1dG9BZGp1c3RPdmVyZmxvd0VuYWJsZWQgPSB7XG4gIGFkanVzdFg6IDEsXG4gIGFkanVzdFk6IDFcbn07XG52YXIgYXV0b0FkanVzdE92ZXJmbG93RGlzYWJsZWQgPSB7XG4gIGFkanVzdFg6IDAsXG4gIGFkanVzdFk6IDBcbn07XG52YXIgdGFyZ2V0T2Zmc2V0ID0gWzAsIDBdO1xuZXhwb3J0IGZ1bmN0aW9uIGdldE92ZXJmbG93T3B0aW9ucyhhdXRvQWRqdXN0T3ZlcmZsb3cpIHtcbiAgaWYgKHR5cGVvZiBhdXRvQWRqdXN0T3ZlcmZsb3cgPT09ICdib29sZWFuJykge1xuICAgIHJldHVybiBhdXRvQWRqdXN0T3ZlcmZsb3cgPyBhdXRvQWRqdXN0T3ZlcmZsb3dFbmFibGVkIDogYXV0b0FkanVzdE92ZXJmbG93RGlzYWJsZWQ7XG4gIH1cbiAgcmV0dXJuIF9leHRlbmRzKF9leHRlbmRzKHt9LCBhdXRvQWRqdXN0T3ZlcmZsb3dEaXNhYmxlZCksIGF1dG9BZGp1c3RPdmVyZmxvdyk7XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRQbGFjZW1lbnRzKGNvbmZpZykge1xuICB2YXIgX2NvbmZpZyRhcnJvd1dpZHRoID0gY29uZmlnLmFycm93V2lkdGgsXG4gICAgYXJyb3dXaWR0aCA9IF9jb25maWckYXJyb3dXaWR0aCA9PT0gdm9pZCAwID8gNCA6IF9jb25maWckYXJyb3dXaWR0aCxcbiAgICBfY29uZmlnJGhvcml6b250YWxBcnIgPSBjb25maWcuaG9yaXpvbnRhbEFycm93U2hpZnQsXG4gICAgaG9yaXpvbnRhbEFycm93U2hpZnQgPSBfY29uZmlnJGhvcml6b250YWxBcnIgPT09IHZvaWQgMCA/IDE2IDogX2NvbmZpZyRob3Jpem9udGFsQXJyLFxuICAgIF9jb25maWckdmVydGljYWxBcnJvdyA9IGNvbmZpZy52ZXJ0aWNhbEFycm93U2hpZnQsXG4gICAgdmVydGljYWxBcnJvd1NoaWZ0ID0gX2NvbmZpZyR2ZXJ0aWNhbEFycm93ID09PSB2b2lkIDAgPyA4IDogX2NvbmZpZyR2ZXJ0aWNhbEFycm93LFxuICAgIGF1dG9BZGp1c3RPdmVyZmxvdyA9IGNvbmZpZy5hdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgYXJyb3dQb2ludEF0Q2VudGVyID0gY29uZmlnLmFycm93UG9pbnRBdENlbnRlcjtcbiAgdmFyIHBsYWNlbWVudE1hcCA9IHtcbiAgICBsZWZ0OiB7XG4gICAgICBwb2ludHM6IFsnY3InLCAnY2wnXSxcbiAgICAgIG9mZnNldDogWy00LCAwXVxuICAgIH0sXG4gICAgcmlnaHQ6IHtcbiAgICAgIHBvaW50czogWydjbCcsICdjciddLFxuICAgICAgb2Zmc2V0OiBbNCwgMF1cbiAgICB9LFxuICAgIHRvcDoge1xuICAgICAgcG9pbnRzOiBbJ2JjJywgJ3RjJ10sXG4gICAgICBvZmZzZXQ6IFswLCAtNF1cbiAgICB9LFxuICAgIGJvdHRvbToge1xuICAgICAgcG9pbnRzOiBbJ3RjJywgJ2JjJ10sXG4gICAgICBvZmZzZXQ6IFswLCA0XVxuICAgIH0sXG4gICAgdG9wTGVmdDoge1xuICAgICAgcG9pbnRzOiBbJ2JsJywgJ3RjJ10sXG4gICAgICBvZmZzZXQ6IFstKGhvcml6b250YWxBcnJvd1NoaWZ0ICsgYXJyb3dXaWR0aCksIC00XVxuICAgIH0sXG4gICAgbGVmdFRvcDoge1xuICAgICAgcG9pbnRzOiBbJ3RyJywgJ2NsJ10sXG4gICAgICBvZmZzZXQ6IFstNCwgLSh2ZXJ0aWNhbEFycm93U2hpZnQgKyBhcnJvd1dpZHRoKV1cbiAgICB9LFxuICAgIHRvcFJpZ2h0OiB7XG4gICAgICBwb2ludHM6IFsnYnInLCAndGMnXSxcbiAgICAgIG9mZnNldDogW2hvcml6b250YWxBcnJvd1NoaWZ0ICsgYXJyb3dXaWR0aCwgLTRdXG4gICAgfSxcbiAgICByaWdodFRvcDoge1xuICAgICAgcG9pbnRzOiBbJ3RsJywgJ2NyJ10sXG4gICAgICBvZmZzZXQ6IFs0LCAtKHZlcnRpY2FsQXJyb3dTaGlmdCArIGFycm93V2lkdGgpXVxuICAgIH0sXG4gICAgYm90dG9tUmlnaHQ6IHtcbiAgICAgIHBvaW50czogWyd0cicsICdiYyddLFxuICAgICAgb2Zmc2V0OiBbaG9yaXpvbnRhbEFycm93U2hpZnQgKyBhcnJvd1dpZHRoLCA0XVxuICAgIH0sXG4gICAgcmlnaHRCb3R0b206IHtcbiAgICAgIHBvaW50czogWydibCcsICdjciddLFxuICAgICAgb2Zmc2V0OiBbNCwgdmVydGljYWxBcnJvd1NoaWZ0ICsgYXJyb3dXaWR0aF1cbiAgICB9LFxuICAgIGJvdHRvbUxlZnQ6IHtcbiAgICAgIHBvaW50czogWyd0bCcsICdiYyddLFxuICAgICAgb2Zmc2V0OiBbLShob3Jpem9udGFsQXJyb3dTaGlmdCArIGFycm93V2lkdGgpLCA0XVxuICAgIH0sXG4gICAgbGVmdEJvdHRvbToge1xuICAgICAgcG9pbnRzOiBbJ2JyJywgJ2NsJ10sXG4gICAgICBvZmZzZXQ6IFstNCwgdmVydGljYWxBcnJvd1NoaWZ0ICsgYXJyb3dXaWR0aF1cbiAgICB9XG4gIH07XG4gIE9iamVjdC5rZXlzKHBsYWNlbWVudE1hcCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgcGxhY2VtZW50TWFwW2tleV0gPSBhcnJvd1BvaW50QXRDZW50ZXIgPyBfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgcGxhY2VtZW50TWFwW2tleV0pLCB7XG4gICAgICBvdmVyZmxvdzogZ2V0T3ZlcmZsb3dPcHRpb25zKGF1dG9BZGp1c3RPdmVyZmxvdyksXG4gICAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICAgIH0pIDogX2V4dGVuZHMoX2V4dGVuZHMoe30sIHBsYWNlbWVudHNba2V5XSksIHtcbiAgICAgIG92ZXJmbG93OiBnZXRPdmVyZmxvd09wdGlvbnMoYXV0b0FkanVzdE92ZXJmbG93KVxuICAgIH0pO1xuICAgIHBsYWNlbWVudE1hcFtrZXldLmlnbm9yZVNoYWtlID0gdHJ1ZTtcbiAgfSk7XG4gIHJldHVybiBwbGFjZW1lbnRNYXA7XG59IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUmNUb29sdGlwIGZyb20gJ3JjLXRvb2x0aXAnO1xuaW1wb3J0IHVzZU1lcmdlZFN0YXRlIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lcmdlZFN0YXRlXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCB7IFByZXNldENvbG9yVHlwZXMgfSBmcm9tICcuLi9fdXRpbC9jb2xvcnMnO1xuaW1wb3J0IHsgZ2V0VHJhbnNpdGlvbk5hbWUgfSBmcm9tICcuLi9fdXRpbC9tb3Rpb24nO1xuaW1wb3J0IGdldFBsYWNlbWVudHMgZnJvbSAnLi4vX3V0aWwvcGxhY2VtZW50cyc7XG5pbXBvcnQgeyBjbG9uZUVsZW1lbnQsIGlzVmFsaWRFbGVtZW50LCBpc0ZyYWdtZW50IH0gZnJvbSAnLi4vX3V0aWwvcmVhY3ROb2RlJztcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4uL191dGlsL3dhcm5pbmcnO1xudmFyIHNwbGl0T2JqZWN0ID0gZnVuY3Rpb24gc3BsaXRPYmplY3Qob2JqLCBrZXlzKSB7XG4gIHZhciBwaWNrZWQgPSB7fTtcbiAgdmFyIG9taXR0ZWQgPSBfZXh0ZW5kcyh7fSwgb2JqKTtcbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAob2JqICYmIGtleSBpbiBvYmopIHtcbiAgICAgIHBpY2tlZFtrZXldID0gb2JqW2tleV07XG4gICAgICBkZWxldGUgb21pdHRlZFtrZXldO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiB7XG4gICAgcGlja2VkOiBwaWNrZWQsXG4gICAgb21pdHRlZDogb21pdHRlZFxuICB9O1xufTtcbnZhciBQcmVzZXRDb2xvclJlZ2V4ID0gbmV3IFJlZ0V4cChcIl4oXCIuY29uY2F0KFByZXNldENvbG9yVHlwZXMuam9pbignfCcpLCBcIikoLWludmVyc2UpPyRcIikpO1xuLy8gRml4IFRvb2x0aXAgd29uJ3QgaGlkZSBhdCBkaXNhYmxlZCBidXR0b25cbi8vIG1vdXNlIGV2ZW50cyBkb24ndCB0cmlnZ2VyIGF0IGRpc2FibGVkIGJ1dHRvbiBpbiBDaHJvbWVcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1jb21wb25lbnQvdG9vbHRpcC9pc3N1ZXMvMThcbmZ1bmN0aW9uIGdldERpc2FibGVkQ29tcGF0aWJsZUNoaWxkcmVuKGVsZW1lbnQsIHByZWZpeENscykge1xuICB2YXIgZWxlbWVudFR5cGUgPSBlbGVtZW50LnR5cGU7XG4gIGlmICgoZWxlbWVudFR5cGUuX19BTlRfQlVUVE9OID09PSB0cnVlIHx8IGVsZW1lbnQudHlwZSA9PT0gJ2J1dHRvbicpICYmIGVsZW1lbnQucHJvcHMuZGlzYWJsZWQgfHwgZWxlbWVudFR5cGUuX19BTlRfU1dJVENIID09PSB0cnVlICYmIChlbGVtZW50LnByb3BzLmRpc2FibGVkIHx8IGVsZW1lbnQucHJvcHMubG9hZGluZykgfHwgZWxlbWVudFR5cGUuX19BTlRfUkFESU8gPT09IHRydWUgJiYgZWxlbWVudC5wcm9wcy5kaXNhYmxlZCkge1xuICAgIC8vIFBpY2sgc29tZSBsYXlvdXQgcmVsYXRlZCBzdHlsZSBwcm9wZXJ0aWVzIHVwIHRvIHNwYW5cbiAgICAvLyBQcmV2ZW50IGxheW91dCBidWdzIGxpa2UgaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNTI1NFxuICAgIHZhciBfc3BsaXRPYmplY3QgPSBzcGxpdE9iamVjdChlbGVtZW50LnByb3BzLnN0eWxlLCBbJ3Bvc2l0aW9uJywgJ2xlZnQnLCAncmlnaHQnLCAndG9wJywgJ2JvdHRvbScsICdmbG9hdCcsICdkaXNwbGF5JywgJ3pJbmRleCddKSxcbiAgICAgIHBpY2tlZCA9IF9zcGxpdE9iamVjdC5waWNrZWQsXG4gICAgICBvbWl0dGVkID0gX3NwbGl0T2JqZWN0Lm9taXR0ZWQ7XG4gICAgdmFyIHNwYW5TdHlsZSA9IF9leHRlbmRzKF9leHRlbmRzKHtcbiAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snXG4gICAgfSwgcGlja2VkKSwge1xuICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQnLFxuICAgICAgd2lkdGg6IGVsZW1lbnQucHJvcHMuYmxvY2sgPyAnMTAwJScgOiB1bmRlZmluZWRcbiAgICB9KTtcbiAgICB2YXIgYnV0dG9uU3R5bGUgPSBfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgb21pdHRlZCksIHtcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJ1xuICAgIH0pO1xuICAgIHZhciBjaGlsZCA9IGNsb25lRWxlbWVudChlbGVtZW50LCB7XG4gICAgICBzdHlsZTogYnV0dG9uU3R5bGUsXG4gICAgICBjbGFzc05hbWU6IG51bGxcbiAgICB9KTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIHN0eWxlOiBzcGFuU3R5bGUsXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoZWxlbWVudC5wcm9wcy5jbGFzc05hbWUsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWQtY29tcGF0aWJsZS13cmFwcGVyXCIpKVxuICAgIH0sIGNoaWxkKTtcbiAgfVxuICByZXR1cm4gZWxlbWVudDtcbn1cbnZhciBUb29sdGlwID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzMjtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRDb250ZXh0UG9wdXBDb250YWluZXIgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQb3B1cENvbnRhaW5lcixcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuICAvLyBXYXJuaW5nIGZvciBkZXByZWNhdGVkIHVzYWdlXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgW1sndmlzaWJsZScsICdvcGVuJ10sIFsnZGVmYXVsdFZpc2libGUnLCAnZGVmYXVsdE9wZW4nXSwgWydvblZpc2libGVDaGFuZ2UnLCAnb25PcGVuQ2hhbmdlJ10sIFsnYWZ0ZXJWaXNpYmxlQ2hhbmdlJywgJ2FmdGVyT3BlbkNoYW5nZSddXS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICB2YXIgX3JlZjIgPSBfc2xpY2VkVG9BcnJheShfcmVmLCAyKSxcbiAgICAgICAgZGVwcmVjYXRlZE5hbWUgPSBfcmVmMlswXSxcbiAgICAgICAgbmV3TmFtZSA9IF9yZWYyWzFdO1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghKGRlcHJlY2F0ZWROYW1lIGluIHByb3BzKSwgJ1Rvb2x0aXAnLCBcImBcIi5jb25jYXQoZGVwcmVjYXRlZE5hbWUsIFwiYCBpcyBkZXByZWNhdGVkIHdoaWNoIHdpbGwgYmUgcmVtb3ZlZCBpbiBuZXh0IG1ham9yIHZlcnNpb24sIHBsZWFzZSB1c2UgYFwiKS5jb25jYXQobmV3TmFtZSwgXCJgIGluc3RlYWQuXCIpKSA6IHZvaWQgMDtcbiAgICB9KTtcbiAgfVxuICB2YXIgX3VzZU1lcmdlZFN0YXRlID0gdXNlTWVyZ2VkU3RhdGUoZmFsc2UsIHtcbiAgICAgIHZhbHVlOiBwcm9wcy5vcGVuICE9PSB1bmRlZmluZWQgPyBwcm9wcy5vcGVuIDogcHJvcHMudmlzaWJsZSxcbiAgICAgIGRlZmF1bHRWYWx1ZTogcHJvcHMuZGVmYXVsdE9wZW4gIT09IHVuZGVmaW5lZCA/IHByb3BzLmRlZmF1bHRPcGVuIDogcHJvcHMuZGVmYXVsdFZpc2libGVcbiAgICB9KSxcbiAgICBfdXNlTWVyZ2VkU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZU1lcmdlZFN0YXRlLCAyKSxcbiAgICBvcGVuID0gX3VzZU1lcmdlZFN0YXRlMlswXSxcbiAgICBzZXRPcGVuID0gX3VzZU1lcmdlZFN0YXRlMlsxXTtcbiAgdmFyIGlzTm9UaXRsZSA9IGZ1bmN0aW9uIGlzTm9UaXRsZSgpIHtcbiAgICB2YXIgdGl0bGUgPSBwcm9wcy50aXRsZSxcbiAgICAgIG92ZXJsYXkgPSBwcm9wcy5vdmVybGF5O1xuICAgIHJldHVybiAhdGl0bGUgJiYgIW92ZXJsYXkgJiYgdGl0bGUgIT09IDA7IC8vIG92ZXJsYXkgZm9yIG9sZCB2ZXJzaW9uIGNvbXBhdGliaWxpdHlcbiAgfTtcblxuICB2YXIgb25PcGVuQ2hhbmdlID0gZnVuY3Rpb24gb25PcGVuQ2hhbmdlKHZpcykge1xuICAgIHZhciBfYSwgX2I7XG4gICAgc2V0T3Blbihpc05vVGl0bGUoKSA/IGZhbHNlIDogdmlzKTtcbiAgICBpZiAoIWlzTm9UaXRsZSgpKSB7XG4gICAgICAoX2EgPSBwcm9wcy5vbk9wZW5DaGFuZ2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKHByb3BzLCB2aXMpO1xuICAgICAgKF9iID0gcHJvcHMub25WaXNpYmxlQ2hhbmdlKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChwcm9wcywgdmlzKTtcbiAgICB9XG4gIH07XG4gIHZhciBnZXRUb29sdGlwUGxhY2VtZW50cyA9IGZ1bmN0aW9uIGdldFRvb2x0aXBQbGFjZW1lbnRzKCkge1xuICAgIHZhciBidWlsdGluUGxhY2VtZW50cyA9IHByb3BzLmJ1aWx0aW5QbGFjZW1lbnRzLFxuICAgICAgX3Byb3BzJGFycm93UG9pbnRBdENlID0gcHJvcHMuYXJyb3dQb2ludEF0Q2VudGVyLFxuICAgICAgYXJyb3dQb2ludEF0Q2VudGVyID0gX3Byb3BzJGFycm93UG9pbnRBdENlID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRhcnJvd1BvaW50QXRDZSxcbiAgICAgIF9wcm9wcyRhdXRvQWRqdXN0T3ZlciA9IHByb3BzLmF1dG9BZGp1c3RPdmVyZmxvdyxcbiAgICAgIGF1dG9BZGp1c3RPdmVyZmxvdyA9IF9wcm9wcyRhdXRvQWRqdXN0T3ZlciA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRhdXRvQWRqdXN0T3ZlcjtcbiAgICByZXR1cm4gYnVpbHRpblBsYWNlbWVudHMgfHwgZ2V0UGxhY2VtZW50cyh7XG4gICAgICBhcnJvd1BvaW50QXRDZW50ZXI6IGFycm93UG9pbnRBdENlbnRlcixcbiAgICAgIGF1dG9BZGp1c3RPdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93XG4gICAgfSk7XG4gIH07XG4gIC8vIOWKqOaAgeiuvue9ruWKqOeUu+eCuVxuICB2YXIgb25Qb3B1cEFsaWduID0gZnVuY3Rpb24gb25Qb3B1cEFsaWduKGRvbU5vZGUsIGFsaWduKSB7XG4gICAgdmFyIHBsYWNlbWVudHMgPSBnZXRUb29sdGlwUGxhY2VtZW50cygpO1xuICAgIC8vIOW9k+WJjei/lOWbnueahOS9jee9rlxuICAgIHZhciBwbGFjZW1lbnQgPSBPYmplY3Qua2V5cyhwbGFjZW1lbnRzKS5maW5kKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBfYSwgX2I7XG4gICAgICByZXR1cm4gcGxhY2VtZW50c1trZXldLnBvaW50c1swXSA9PT0gKChfYSA9IGFsaWduLnBvaW50cykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hWzBdKSAmJiBwbGFjZW1lbnRzW2tleV0ucG9pbnRzWzFdID09PSAoKF9iID0gYWxpZ24ucG9pbnRzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2JbMV0pO1xuICAgIH0pO1xuICAgIGlmICghcGxhY2VtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIOagueaNruW9k+WJjeWdkOagh+iuvue9ruWKqOeUu+eCuVxuICAgIHZhciByZWN0ID0gZG9tTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB2YXIgdHJhbnNmb3JtT3JpZ2luID0ge1xuICAgICAgdG9wOiAnNTAlJyxcbiAgICAgIGxlZnQ6ICc1MCUnXG4gICAgfTtcbiAgICBpZiAoL3RvcHxCb3R0b20vLnRlc3QocGxhY2VtZW50KSkge1xuICAgICAgdHJhbnNmb3JtT3JpZ2luLnRvcCA9IFwiXCIuY29uY2F0KHJlY3QuaGVpZ2h0IC0gYWxpZ24ub2Zmc2V0WzFdLCBcInB4XCIpO1xuICAgIH0gZWxzZSBpZiAoL1RvcHxib3R0b20vLnRlc3QocGxhY2VtZW50KSkge1xuICAgICAgdHJhbnNmb3JtT3JpZ2luLnRvcCA9IFwiXCIuY29uY2F0KC1hbGlnbi5vZmZzZXRbMV0sIFwicHhcIik7XG4gICAgfVxuICAgIGlmICgvbGVmdHxSaWdodC8udGVzdChwbGFjZW1lbnQpKSB7XG4gICAgICB0cmFuc2Zvcm1PcmlnaW4ubGVmdCA9IFwiXCIuY29uY2F0KHJlY3Qud2lkdGggLSBhbGlnbi5vZmZzZXRbMF0sIFwicHhcIik7XG4gICAgfSBlbHNlIGlmICgvcmlnaHR8TGVmdC8udGVzdChwbGFjZW1lbnQpKSB7XG4gICAgICB0cmFuc2Zvcm1PcmlnaW4ubGVmdCA9IFwiXCIuY29uY2F0KC1hbGlnbi5vZmZzZXRbMF0sIFwicHhcIik7XG4gICAgfVxuICAgIGRvbU5vZGUuc3R5bGUudHJhbnNmb3JtT3JpZ2luID0gXCJcIi5jb25jYXQodHJhbnNmb3JtT3JpZ2luLmxlZnQsIFwiIFwiKS5jb25jYXQodHJhbnNmb3JtT3JpZ2luLnRvcCk7XG4gIH07XG4gIHZhciBnZXRPdmVybGF5ID0gZnVuY3Rpb24gZ2V0T3ZlcmxheSgpIHtcbiAgICB2YXIgdGl0bGUgPSBwcm9wcy50aXRsZSxcbiAgICAgIG92ZXJsYXkgPSBwcm9wcy5vdmVybGF5O1xuICAgIGlmICh0aXRsZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRpdGxlO1xuICAgIH1cbiAgICByZXR1cm4gb3ZlcmxheSB8fCB0aXRsZSB8fCAnJztcbiAgfTtcbiAgdmFyIGdldFBvcHVwQ29udGFpbmVyID0gcHJvcHMuZ2V0UG9wdXBDb250YWluZXIsXG4gICAgX3Byb3BzJHBsYWNlbWVudCA9IHByb3BzLnBsYWNlbWVudCxcbiAgICBwbGFjZW1lbnQgPSBfcHJvcHMkcGxhY2VtZW50ID09PSB2b2lkIDAgPyAndG9wJyA6IF9wcm9wcyRwbGFjZW1lbnQsXG4gICAgX3Byb3BzJG1vdXNlRW50ZXJEZWxhID0gcHJvcHMubW91c2VFbnRlckRlbGF5LFxuICAgIG1vdXNlRW50ZXJEZWxheSA9IF9wcm9wcyRtb3VzZUVudGVyRGVsYSA9PT0gdm9pZCAwID8gMC4xIDogX3Byb3BzJG1vdXNlRW50ZXJEZWxhLFxuICAgIF9wcm9wcyRtb3VzZUxlYXZlRGVsYSA9IHByb3BzLm1vdXNlTGVhdmVEZWxheSxcbiAgICBtb3VzZUxlYXZlRGVsYXkgPSBfcHJvcHMkbW91c2VMZWF2ZURlbGEgPT09IHZvaWQgMCA/IDAuMSA6IF9wcm9wcyRtb3VzZUxlYXZlRGVsYSxcbiAgICBvdGhlclByb3BzID0gX19yZXN0KHByb3BzLCBbXCJnZXRQb3B1cENvbnRhaW5lclwiLCBcInBsYWNlbWVudFwiLCBcIm1vdXNlRW50ZXJEZWxheVwiLCBcIm1vdXNlTGVhdmVEZWxheVwiXSk7XG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgb3BlbkNsYXNzTmFtZSA9IHByb3BzLm9wZW5DbGFzc05hbWUsXG4gICAgZ2V0VG9vbHRpcENvbnRhaW5lciA9IHByb3BzLmdldFRvb2x0aXBDb250YWluZXIsXG4gICAgb3ZlcmxheUNsYXNzTmFtZSA9IHByb3BzLm92ZXJsYXlDbGFzc05hbWUsXG4gICAgY29sb3IgPSBwcm9wcy5jb2xvcixcbiAgICBvdmVybGF5SW5uZXJTdHlsZSA9IHByb3BzLm92ZXJsYXlJbm5lclN0eWxlLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW47XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3Rvb2x0aXAnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgcm9vdFByZWZpeENscyA9IGdldFByZWZpeENscygpO1xuICB2YXIgdGVtcE9wZW4gPSBvcGVuO1xuICAvLyBIaWRlIHRvb2x0aXAgd2hlbiB0aGVyZSBpcyBubyB0aXRsZVxuICBpZiAoISgnb3BlbicgaW4gcHJvcHMpICYmICEoJ3Zpc2libGUnIGluIHByb3BzKSAmJiBpc05vVGl0bGUoKSkge1xuICAgIHRlbXBPcGVuID0gZmFsc2U7XG4gIH1cbiAgdmFyIGNoaWxkID0gZ2V0RGlzYWJsZWRDb21wYXRpYmxlQ2hpbGRyZW4oaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pICYmICFpc0ZyYWdtZW50KGNoaWxkcmVuKSA/IGNoaWxkcmVuIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIGNoaWxkcmVuKSwgcHJlZml4Q2xzKTtcbiAgdmFyIGNoaWxkUHJvcHMgPSBjaGlsZC5wcm9wcztcbiAgdmFyIGNoaWxkQ2xzID0gIWNoaWxkUHJvcHMuY2xhc3NOYW1lIHx8IHR5cGVvZiBjaGlsZFByb3BzLmNsYXNzTmFtZSA9PT0gJ3N0cmluZycgPyBjbGFzc05hbWVzKGNoaWxkUHJvcHMuY2xhc3NOYW1lLCBfZGVmaW5lUHJvcGVydHkoe30sIG9wZW5DbGFzc05hbWUgfHwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1vcGVuXCIpLCB0cnVlKSkgOiBjaGlsZFByb3BzLmNsYXNzTmFtZTtcbiAgdmFyIGN1c3RvbU92ZXJsYXlDbGFzc05hbWUgPSBjbGFzc05hbWVzKG92ZXJsYXlDbGFzc05hbWUsIChfY2xhc3NOYW1lczIgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoY29sb3IpLCBjb2xvciAmJiBQcmVzZXRDb2xvclJlZ2V4LnRlc3QoY29sb3IpKSwgX2NsYXNzTmFtZXMyKSk7XG4gIHZhciBmb3JtYXR0ZWRPdmVybGF5SW5uZXJTdHlsZSA9IG92ZXJsYXlJbm5lclN0eWxlO1xuICB2YXIgYXJyb3dDb250ZW50U3R5bGUgPSB7fTtcbiAgaWYgKGNvbG9yICYmICFQcmVzZXRDb2xvclJlZ2V4LnRlc3QoY29sb3IpKSB7XG4gICAgZm9ybWF0dGVkT3ZlcmxheUlubmVyU3R5bGUgPSBfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgb3ZlcmxheUlubmVyU3R5bGUpLCB7XG4gICAgICBiYWNrZ3JvdW5kOiBjb2xvclxuICAgIH0pO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBhcnJvd0NvbnRlbnRTdHlsZSA9IHtcbiAgICAgICctLWFudGQtYXJyb3ctYmFja2dyb3VuZC1jb2xvcic6IGNvbG9yXG4gICAgfTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmNUb29sdGlwLCBfZXh0ZW5kcyh7fSwgb3RoZXJQcm9wcywge1xuICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgIG1vdXNlRW50ZXJEZWxheTogbW91c2VFbnRlckRlbGF5LFxuICAgIG1vdXNlTGVhdmVEZWxheTogbW91c2VMZWF2ZURlbGF5LFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIG92ZXJsYXlDbGFzc05hbWU6IGN1c3RvbU92ZXJsYXlDbGFzc05hbWUsXG4gICAgZ2V0VG9vbHRpcENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXIgfHwgZ2V0VG9vbHRpcENvbnRhaW5lciB8fCBnZXRDb250ZXh0UG9wdXBDb250YWluZXIsXG4gICAgcmVmOiByZWYsXG4gICAgYnVpbHRpblBsYWNlbWVudHM6IGdldFRvb2x0aXBQbGFjZW1lbnRzKCksXG4gICAgb3ZlcmxheTogZ2V0T3ZlcmxheSgpLFxuICAgIHZpc2libGU6IHRlbXBPcGVuLFxuICAgIG9uVmlzaWJsZUNoYW5nZTogb25PcGVuQ2hhbmdlLFxuICAgIG9uUG9wdXBBbGlnbjogb25Qb3B1cEFsaWduLFxuICAgIG92ZXJsYXlJbm5lclN0eWxlOiBmb3JtYXR0ZWRPdmVybGF5SW5uZXJTdHlsZSxcbiAgICBhcnJvd0NvbnRlbnQ6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYXJyb3ctY29udGVudFwiKSxcbiAgICAgIHN0eWxlOiBhcnJvd0NvbnRlbnRTdHlsZVxuICAgIH0pLFxuICAgIG1vdGlvbjoge1xuICAgICAgbW90aW9uTmFtZTogZ2V0VHJhbnNpdGlvbk5hbWUocm9vdFByZWZpeENscywgJ3pvb20tYmlnLWZhc3QnLCBwcm9wcy50cmFuc2l0aW9uTmFtZSksXG4gICAgICBtb3Rpb25EZWFkbGluZTogMTAwMFxuICAgIH1cbiAgfSksIHRlbXBPcGVuID8gY2xvbmVFbGVtZW50KGNoaWxkLCB7XG4gICAgY2xhc3NOYW1lOiBjaGlsZENsc1xuICB9KSA6IGNoaWxkKTtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgVG9vbHRpcC5kaXNwbGF5TmFtZSA9ICdUb29sdGlwJztcbn1cbmV4cG9ydCBkZWZhdWx0IFRvb2x0aXA7IiwiZXhwb3J0IHZhciBnZXRSZW5kZXJQcm9wVmFsdWUgPSBmdW5jdGlvbiBnZXRSZW5kZXJQcm9wVmFsdWUocHJvcFZhbHVlKSB7XG4gIGlmICghcHJvcFZhbHVlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKHR5cGVvZiBwcm9wVmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gcHJvcFZhbHVlKCk7XG4gIH1cbiAgcmV0dXJuIHByb3BWYWx1ZTtcbn07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgVG9vbHRpcCBmcm9tICcuLi90b29sdGlwJztcbmltcG9ydCB7IGdldFJlbmRlclByb3BWYWx1ZSB9IGZyb20gJy4uL191dGlsL2dldFJlbmRlclByb3BWYWx1ZSc7XG5pbXBvcnQgeyBnZXRUcmFuc2l0aW9uTmFtZSB9IGZyb20gJy4uL191dGlsL21vdGlvbic7XG52YXIgT3ZlcmxheSA9IGZ1bmN0aW9uIE92ZXJsYXkoX3JlZikge1xuICB2YXIgdGl0bGUgPSBfcmVmLnRpdGxlLFxuICAgIGNvbnRlbnQgPSBfcmVmLmNvbnRlbnQsXG4gICAgcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHM7XG4gIGlmICghdGl0bGUgJiYgIWNvbnRlbnQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIHRpdGxlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdGl0bGVcIilcbiAgfSwgZ2V0UmVuZGVyUHJvcFZhbHVlKHRpdGxlKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5uZXItY29udGVudFwiKVxuICB9LCBnZXRSZW5kZXJQcm9wVmFsdWUoY29udGVudCkpKTtcbn07XG52YXIgUG9wb3ZlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgdGl0bGUgPSBwcm9wcy50aXRsZSxcbiAgICBjb250ZW50ID0gcHJvcHMuY29udGVudCxcbiAgICBfb3ZlcmxheSA9IHByb3BzLl9vdmVybGF5LFxuICAgIF9wcm9wcyRwbGFjZW1lbnQgPSBwcm9wcy5wbGFjZW1lbnQsXG4gICAgcGxhY2VtZW50ID0gX3Byb3BzJHBsYWNlbWVudCA9PT0gdm9pZCAwID8gJ3RvcCcgOiBfcHJvcHMkcGxhY2VtZW50LFxuICAgIF9wcm9wcyR0cmlnZ2VyID0gcHJvcHMudHJpZ2dlcixcbiAgICB0cmlnZ2VyID0gX3Byb3BzJHRyaWdnZXIgPT09IHZvaWQgMCA/ICdob3ZlcicgOiBfcHJvcHMkdHJpZ2dlcixcbiAgICBfcHJvcHMkbW91c2VFbnRlckRlbGEgPSBwcm9wcy5tb3VzZUVudGVyRGVsYXksXG4gICAgbW91c2VFbnRlckRlbGF5ID0gX3Byb3BzJG1vdXNlRW50ZXJEZWxhID09PSB2b2lkIDAgPyAwLjEgOiBfcHJvcHMkbW91c2VFbnRlckRlbGEsXG4gICAgX3Byb3BzJG1vdXNlTGVhdmVEZWxhID0gcHJvcHMubW91c2VMZWF2ZURlbGF5LFxuICAgIG1vdXNlTGVhdmVEZWxheSA9IF9wcm9wcyRtb3VzZUxlYXZlRGVsYSA9PT0gdm9pZCAwID8gMC4xIDogX3Byb3BzJG1vdXNlTGVhdmVEZWxhLFxuICAgIF9wcm9wcyRvdmVybGF5U3R5bGUgPSBwcm9wcy5vdmVybGF5U3R5bGUsXG4gICAgb3ZlcmxheVN0eWxlID0gX3Byb3BzJG92ZXJsYXlTdHlsZSA9PT0gdm9pZCAwID8ge30gOiBfcHJvcHMkb3ZlcmxheVN0eWxlLFxuICAgIG90aGVyUHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcInRpdGxlXCIsIFwiY29udGVudFwiLCBcIl9vdmVybGF5XCIsIFwicGxhY2VtZW50XCIsIFwidHJpZ2dlclwiLCBcIm1vdXNlRW50ZXJEZWxheVwiLCBcIm1vdXNlTGVhdmVEZWxheVwiLCBcIm92ZXJsYXlTdHlsZVwiXSk7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCksXG4gICAgZ2V0UHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UHJlZml4Q2xzO1xuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdwb3BvdmVyJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIHJvb3RQcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXAsIF9leHRlbmRzKHtcbiAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICB0cmlnZ2VyOiB0cmlnZ2VyLFxuICAgIG1vdXNlRW50ZXJEZWxheTogbW91c2VFbnRlckRlbGF5LFxuICAgIG1vdXNlTGVhdmVEZWxheTogbW91c2VMZWF2ZURlbGF5LFxuICAgIG92ZXJsYXlTdHlsZTogb3ZlcmxheVN0eWxlXG4gIH0sIG90aGVyUHJvcHMsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICByZWY6IHJlZixcbiAgICBvdmVybGF5OiBfb3ZlcmxheSB8fCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChPdmVybGF5LCB7XG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgIGNvbnRlbnQ6IGNvbnRlbnRcbiAgICB9KSxcbiAgICB0cmFuc2l0aW9uTmFtZTogZ2V0VHJhbnNpdGlvbk5hbWUocm9vdFByZWZpeENscywgJ3pvb20tYmlnJywgb3RoZXJQcm9wcy50cmFuc2l0aW9uTmFtZSlcbiAgfSkpO1xufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBQb3BvdmVyLmRpc3BsYXlOYW1lID0gJ1BvcG92ZXInO1xufVxuZXhwb3J0IGRlZmF1bHQgUG9wb3ZlcjsiLCIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBFbGxpcHNpc091dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk0xNzYgNTExYTU2IDU2IDAgMTAxMTIgMCA1NiA1NiAwIDEwLTExMiAwem0yODAgMGE1NiA1NiAwIDEwMTEyIDAgNTYgNTYgMCAxMC0xMTIgMHptMjgwIDBhNTYgNTYgMCAxMDExMiAwIDU2IDU2IDAgMTAtMTEyIDB6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJlbGxpcHNpc1wiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgRWxsaXBzaXNPdXRsaW5lZDtcbiIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEVsbGlwc2lzT3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRWxsaXBzaXNPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIEVsbGlwc2lzT3V0bGluZWQgPSBmdW5jdGlvbiBFbGxpcHNpc091dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBFbGxpcHNpc091dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5FbGxpcHNpc091dGxpbmVkLmRpc3BsYXlOYW1lID0gJ0VsbGlwc2lzT3V0bGluZWQnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoRWxsaXBzaXNPdXRsaW5lZCk7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IHZhciBJZENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmV4cG9ydCBmdW5jdGlvbiBnZXRNZW51SWQodXVpZCwgZXZlbnRLZXkpIHtcbiAgaWYgKHV1aWQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBcIlwiLmNvbmNhdCh1dWlkLCBcIi1cIikuY29uY2F0KGV2ZW50S2V5KTtcbn1cblxuLyoqXG4gKiBHZXQgYGRhdGEtbWVudS1pZGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1lbnVJZChldmVudEtleSkge1xuICB2YXIgaWQgPSBSZWFjdC51c2VDb250ZXh0KElkQ29udGV4dCk7XG4gIHJldHVybiBnZXRNZW51SWQoaWQsIGV2ZW50S2V5KTtcbn0iLCJpbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJjaGlsZHJlblwiLCBcImxvY2tlZFwiXTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VNZW1vIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lbW9cIjtcbmltcG9ydCBpc0VxdWFsIGZyb20gXCJyYy11dGlsL2VzL2lzRXF1YWxcIjtcbmV4cG9ydCB2YXIgTWVudUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmZ1bmN0aW9uIG1lcmdlUHJvcHMob3JpZ2luLCB0YXJnZXQpIHtcbiAgdmFyIGNsb25lID0gX29iamVjdFNwcmVhZCh7fSwgb3JpZ2luKTtcbiAgT2JqZWN0LmtleXModGFyZ2V0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgdmFsdWUgPSB0YXJnZXRba2V5XTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xvbmVba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBjbG9uZTtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEluaGVyaXRhYmxlQ29udGV4dFByb3ZpZGVyKF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICBsb2NrZWQgPSBfcmVmLmxvY2tlZCxcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgX2V4Y2x1ZGVkKTtcbiAgdmFyIGNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KE1lbnVDb250ZXh0KTtcbiAgdmFyIGluaGVyaXRhYmxlQ29udGV4dCA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBtZXJnZVByb3BzKGNvbnRleHQsIHJlc3RQcm9wcyk7XG4gIH0sIFtjb250ZXh0LCByZXN0UHJvcHNdLCBmdW5jdGlvbiAocHJldiwgbmV4dCkge1xuICAgIHJldHVybiAhbG9ja2VkICYmIChwcmV2WzBdICE9PSBuZXh0WzBdIHx8ICFpc0VxdWFsKHByZXZbMV0sIG5leHRbMV0sIHRydWUpKTtcbiAgfSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNZW51Q29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBpbmhlcml0YWJsZUNvbnRleHRcbiAgfSwgY2hpbGRyZW4pO1xufSIsImltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgRW1wdHlMaXN0ID0gW107XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT0gUGF0aCBSZWdpc3RlciA9PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB2YXIgUGF0aFJlZ2lzdGVyQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1lYXN1cmUoKSB7XG4gIHJldHVybiBSZWFjdC51c2VDb250ZXh0KFBhdGhSZWdpc3RlckNvbnRleHQpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09IFBhdGggVHJhY2tlciA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuZXhwb3J0IHZhciBQYXRoVHJhY2tlckNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChFbXB0eUxpc3QpO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUZ1bGxQYXRoKGV2ZW50S2V5KSB7XG4gIHZhciBwYXJlbnRLZXlQYXRoID0gUmVhY3QudXNlQ29udGV4dChQYXRoVHJhY2tlckNvbnRleHQpO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGV2ZW50S2V5ICE9PSB1bmRlZmluZWQgPyBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHBhcmVudEtleVBhdGgpLCBbZXZlbnRLZXldKSA6IHBhcmVudEtleVBhdGg7XG4gIH0sIFtwYXJlbnRLZXlQYXRoLCBldmVudEtleV0pO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gUGF0aCBVc2VyID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgdmFyIFBhdGhVc2VyQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbnZhciBQcml2YXRlQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHt9KTtcbmV4cG9ydCBkZWZhdWx0IFByaXZhdGVDb250ZXh0OyIsImltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgaXNWaXNpYmxlIGZyb20gXCIuL2lzVmlzaWJsZVwiO1xuZnVuY3Rpb24gZm9jdXNhYmxlKG5vZGUpIHtcbiAgdmFyIGluY2x1ZGVQb3NpdGl2ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gIGlmIChpc1Zpc2libGUobm9kZSkpIHtcbiAgICB2YXIgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIGlzRm9jdXNhYmxlRWxlbWVudCA9XG4gICAgLy8gRm9jdXNhYmxlIGVsZW1lbnRcbiAgICBbJ2lucHV0JywgJ3NlbGVjdCcsICd0ZXh0YXJlYScsICdidXR0b24nXS5pbmNsdWRlcyhub2RlTmFtZSkgfHxcbiAgICAvLyBFZGl0YWJsZSBlbGVtZW50XG4gICAgbm9kZS5pc0NvbnRlbnRFZGl0YWJsZSB8fFxuICAgIC8vIEFuY2hvciB3aXRoIGhyZWYgZWxlbWVudFxuICAgIG5vZGVOYW1lID09PSAnYScgJiYgISFub2RlLmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuXG4gICAgLy8gR2V0IHRhYkluZGV4XG4gICAgdmFyIHRhYkluZGV4QXR0ciA9IG5vZGUuZ2V0QXR0cmlidXRlKCd0YWJpbmRleCcpO1xuICAgIHZhciB0YWJJbmRleE51bSA9IE51bWJlcih0YWJJbmRleEF0dHIpO1xuXG4gICAgLy8gUGFyc2UgYXMgbnVtYmVyIGlmIHZhbGlkYXRlXG4gICAgdmFyIHRhYkluZGV4ID0gbnVsbDtcbiAgICBpZiAodGFiSW5kZXhBdHRyICYmICFOdW1iZXIuaXNOYU4odGFiSW5kZXhOdW0pKSB7XG4gICAgICB0YWJJbmRleCA9IHRhYkluZGV4TnVtO1xuICAgIH0gZWxzZSBpZiAoaXNGb2N1c2FibGVFbGVtZW50ICYmIHRhYkluZGV4ID09PSBudWxsKSB7XG4gICAgICB0YWJJbmRleCA9IDA7XG4gICAgfVxuXG4gICAgLy8gQmxvY2sgZm9jdXNhYmxlIGlmIGRpc2FibGVkXG4gICAgaWYgKGlzRm9jdXNhYmxlRWxlbWVudCAmJiBub2RlLmRpc2FibGVkKSB7XG4gICAgICB0YWJJbmRleCA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0YWJJbmRleCAhPT0gbnVsbCAmJiAodGFiSW5kZXggPj0gMCB8fCBpbmNsdWRlUG9zaXRpdmUgJiYgdGFiSW5kZXggPCAwKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9jdXNOb2RlTGlzdChub2RlKSB7XG4gIHZhciBpbmNsdWRlUG9zaXRpdmUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICB2YXIgcmVzID0gX3RvQ29uc3VtYWJsZUFycmF5KG5vZGUucXVlcnlTZWxlY3RvckFsbCgnKicpKS5maWx0ZXIoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgcmV0dXJuIGZvY3VzYWJsZShjaGlsZCwgaW5jbHVkZVBvc2l0aXZlKTtcbiAgfSk7XG4gIGlmIChmb2N1c2FibGUobm9kZSwgaW5jbHVkZVBvc2l0aXZlKSkge1xuICAgIHJlcy51bnNoaWZ0KG5vZGUpO1xuICB9XG4gIHJldHVybiByZXM7XG59XG52YXIgbGFzdEZvY3VzRWxlbWVudCA9IG51bGw7XG5cbi8qKiBAZGVwcmVjYXRlZCBEbyBub3QgdXNlIHNpbmNlIHRoaXMgbWF5IGZhaWxlZCB3aGVuIHVzZWQgaW4gYXN5bmMgKi9cbmV4cG9ydCBmdW5jdGlvbiBzYXZlTGFzdEZvY3VzTm9kZSgpIHtcbiAgbGFzdEZvY3VzRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCBEbyBub3QgdXNlIHNpbmNlIHRoaXMgbWF5IGZhaWxlZCB3aGVuIHVzZWQgaW4gYXN5bmMgKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckxhc3RGb2N1c05vZGUoKSB7XG4gIGxhc3RGb2N1c0VsZW1lbnQgPSBudWxsO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgRG8gbm90IHVzZSBzaW5jZSB0aGlzIG1heSBmYWlsZWQgd2hlbiB1c2VkIGluIGFzeW5jICovXG5leHBvcnQgZnVuY3Rpb24gYmFja0xhc3RGb2N1c05vZGUoKSB7XG4gIGlmIChsYXN0Rm9jdXNFbGVtZW50KSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWFg+e0oOWPr+iDveW3sue7j+iiq+enu+WKqOS6hlxuICAgICAgbGFzdEZvY3VzRWxlbWVudC5mb2N1cygpO1xuXG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1lbXB0eSAqL1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGVtcHR5XG4gICAgfVxuICAgIC8qIGVzbGludC1lbmFibGUgbm8tZW1wdHkgKi9cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbGltaXRUYWJSYW5nZShub2RlLCBlKSB7XG4gIGlmIChlLmtleUNvZGUgPT09IDkpIHtcbiAgICB2YXIgdGFiTm9kZUxpc3QgPSBnZXRGb2N1c05vZGVMaXN0KG5vZGUpO1xuICAgIHZhciBsYXN0VGFiTm9kZSA9IHRhYk5vZGVMaXN0W2Uuc2hpZnRLZXkgPyAwIDogdGFiTm9kZUxpc3QubGVuZ3RoIC0gMV07XG4gICAgdmFyIGxlYXZpbmdUYWIgPSBsYXN0VGFiTm9kZSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCB8fCBub2RlID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgIGlmIChsZWF2aW5nVGFiKSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gdGFiTm9kZUxpc3RbZS5zaGlmdEtleSA/IHRhYk5vZGVMaXN0Lmxlbmd0aCAtIDEgOiAwXTtcbiAgICAgIHRhcmdldC5mb2N1cygpO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxufSIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgS2V5Q29kZSBmcm9tIFwicmMtdXRpbC9lcy9LZXlDb2RlXCI7XG5pbXBvcnQgcmFmIGZyb20gXCJyYy11dGlsL2VzL3JhZlwiO1xuaW1wb3J0IHsgZ2V0Rm9jdXNOb2RlTGlzdCB9IGZyb20gXCJyYy11dGlsL2VzL0RvbS9mb2N1c1wiO1xuaW1wb3J0IHsgZ2V0TWVudUlkIH0gZnJvbSBcIi4uL2NvbnRleHQvSWRDb250ZXh0XCI7XG5cbi8vIGRlc3RydWN0IHRvIHJlZHVjZSBtaW5pZnkgc2l6ZVxudmFyIExFRlQgPSBLZXlDb2RlLkxFRlQsXG4gIFJJR0hUID0gS2V5Q29kZS5SSUdIVCxcbiAgVVAgPSBLZXlDb2RlLlVQLFxuICBET1dOID0gS2V5Q29kZS5ET1dOLFxuICBFTlRFUiA9IEtleUNvZGUuRU5URVIsXG4gIEVTQyA9IEtleUNvZGUuRVNDLFxuICBIT01FID0gS2V5Q29kZS5IT01FLFxuICBFTkQgPSBLZXlDb2RlLkVORDtcbnZhciBBcnJvd0tleXMgPSBbVVAsIERPV04sIExFRlQsIFJJR0hUXTtcbmZ1bmN0aW9uIGdldE9mZnNldChtb2RlLCBpc1Jvb3RMZXZlbCwgaXNSdGwsIHdoaWNoKSB7XG4gIHZhciBfaW5saW5lLCBfaG9yaXpvbnRhbCwgX3ZlcnRpY2FsLCBfb2Zmc2V0cztcbiAgdmFyIHByZXYgPSAncHJldic7XG4gIHZhciBuZXh0ID0gJ25leHQnO1xuICB2YXIgY2hpbGRyZW4gPSAnY2hpbGRyZW4nO1xuICB2YXIgcGFyZW50ID0gJ3BhcmVudCc7XG5cbiAgLy8gSW5saW5lIGVudGVyIGlzIHNwZWNpYWwgdGhhdCB3ZSB1c2UgdW5pcXVlIG9wZXJhdGlvblxuICBpZiAobW9kZSA9PT0gJ2lubGluZScgJiYgd2hpY2ggPT09IEVOVEVSKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlubGluZVRyaWdnZXI6IHRydWVcbiAgICB9O1xuICB9XG4gIHZhciBpbmxpbmUgPSAoX2lubGluZSA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2lubGluZSwgVVAsIHByZXYpLCBfZGVmaW5lUHJvcGVydHkoX2lubGluZSwgRE9XTiwgbmV4dCksIF9pbmxpbmUpO1xuICB2YXIgaG9yaXpvbnRhbCA9IChfaG9yaXpvbnRhbCA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2hvcml6b250YWwsIExFRlQsIGlzUnRsID8gbmV4dCA6IHByZXYpLCBfZGVmaW5lUHJvcGVydHkoX2hvcml6b250YWwsIFJJR0hULCBpc1J0bCA/IHByZXYgOiBuZXh0KSwgX2RlZmluZVByb3BlcnR5KF9ob3Jpem9udGFsLCBET1dOLCBjaGlsZHJlbiksIF9kZWZpbmVQcm9wZXJ0eShfaG9yaXpvbnRhbCwgRU5URVIsIGNoaWxkcmVuKSwgX2hvcml6b250YWwpO1xuICB2YXIgdmVydGljYWwgPSAoX3ZlcnRpY2FsID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfdmVydGljYWwsIFVQLCBwcmV2KSwgX2RlZmluZVByb3BlcnR5KF92ZXJ0aWNhbCwgRE9XTiwgbmV4dCksIF9kZWZpbmVQcm9wZXJ0eShfdmVydGljYWwsIEVOVEVSLCBjaGlsZHJlbiksIF9kZWZpbmVQcm9wZXJ0eShfdmVydGljYWwsIEVTQywgcGFyZW50KSwgX2RlZmluZVByb3BlcnR5KF92ZXJ0aWNhbCwgTEVGVCwgaXNSdGwgPyBjaGlsZHJlbiA6IHBhcmVudCksIF9kZWZpbmVQcm9wZXJ0eShfdmVydGljYWwsIFJJR0hULCBpc1J0bCA/IHBhcmVudCA6IGNoaWxkcmVuKSwgX3ZlcnRpY2FsKTtcbiAgdmFyIG9mZnNldHMgPSB7XG4gICAgaW5saW5lOiBpbmxpbmUsXG4gICAgaG9yaXpvbnRhbDogaG9yaXpvbnRhbCxcbiAgICB2ZXJ0aWNhbDogdmVydGljYWwsXG4gICAgaW5saW5lU3ViOiBpbmxpbmUsXG4gICAgaG9yaXpvbnRhbFN1YjogdmVydGljYWwsXG4gICAgdmVydGljYWxTdWI6IHZlcnRpY2FsXG4gIH07XG4gIHZhciB0eXBlID0gKF9vZmZzZXRzID0gb2Zmc2V0c1tcIlwiLmNvbmNhdChtb2RlKS5jb25jYXQoaXNSb290TGV2ZWwgPyAnJyA6ICdTdWInKV0pID09PSBudWxsIHx8IF9vZmZzZXRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb2Zmc2V0c1t3aGljaF07XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgcHJldjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9mZnNldDogLTEsXG4gICAgICAgIHNpYmxpbmc6IHRydWVcbiAgICAgIH07XG4gICAgY2FzZSBuZXh0OlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb2Zmc2V0OiAxLFxuICAgICAgICBzaWJsaW5nOiB0cnVlXG4gICAgICB9O1xuICAgIGNhc2UgcGFyZW50OlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb2Zmc2V0OiAtMSxcbiAgICAgICAgc2libGluZzogZmFsc2VcbiAgICAgIH07XG4gICAgY2FzZSBjaGlsZHJlbjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9mZnNldDogMSxcbiAgICAgICAgc2libGluZzogZmFsc2VcbiAgICAgIH07XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG5mdW5jdGlvbiBmaW5kQ29udGFpbmVyVUwoZWxlbWVudCkge1xuICB2YXIgY3VycmVudCA9IGVsZW1lbnQ7XG4gIHdoaWxlIChjdXJyZW50KSB7XG4gICAgaWYgKGN1cnJlbnQuZ2V0QXR0cmlidXRlKCdkYXRhLW1lbnUtbGlzdCcpKSB7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50RWxlbWVudDtcbiAgfVxuXG4gIC8vIE5vcm1hbGx5IHNob3VsZCBub3QgcmVhY2ggdGhpcyBsaW5lXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEZpbmQgZm9jdXNlZCBlbGVtZW50IHdpdGhpbiBlbGVtZW50IHNldCBwcm92aWRlZFxuICovXG5mdW5jdGlvbiBnZXRGb2N1c0VsZW1lbnQoYWN0aXZlRWxlbWVudCwgZWxlbWVudHMpIHtcbiAgdmFyIGN1cnJlbnQgPSBhY3RpdmVFbGVtZW50IHx8IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIHdoaWxlIChjdXJyZW50KSB7XG4gICAgaWYgKGVsZW1lbnRzLmhhcyhjdXJyZW50KSkge1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogR2V0IGZvY3VzYWJsZSBlbGVtZW50cyBmcm9tIHRoZSBlbGVtZW50IHNldCB1bmRlciBwcm92aWRlZCBjb250YWluZXJcbiAqL1xuZnVuY3Rpb24gZ2V0Rm9jdXNhYmxlRWxlbWVudHMoY29udGFpbmVyLCBlbGVtZW50cykge1xuICB2YXIgbGlzdCA9IGdldEZvY3VzTm9kZUxpc3QoY29udGFpbmVyLCB0cnVlKTtcbiAgcmV0dXJuIGxpc3QuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICByZXR1cm4gZWxlbWVudHMuaGFzKGVsZSk7XG4gIH0pO1xufVxuZnVuY3Rpb24gZ2V0TmV4dEZvY3VzRWxlbWVudChwYXJlbnRRdWVyeUNvbnRhaW5lciwgZWxlbWVudHMsIGZvY3VzTWVudUVsZW1lbnQpIHtcbiAgdmFyIG9mZnNldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogMTtcbiAgLy8gS2V5IG9uIHRoZSBtZW51IGl0ZW0gd2lsbCBub3QgZ2V0IHZhbGlkYXRlIHBhcmVudCBjb250YWluZXJcbiAgaWYgKCFwYXJlbnRRdWVyeUNvbnRhaW5lcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gTGlzdCBjdXJyZW50IGxldmVsIG1lbnUgaXRlbSBlbGVtZW50c1xuICB2YXIgc2FtZUxldmVsRm9jdXNhYmxlTWVudUVsZW1lbnRMaXN0ID0gZ2V0Rm9jdXNhYmxlRWxlbWVudHMocGFyZW50UXVlcnlDb250YWluZXIsIGVsZW1lbnRzKTtcblxuICAvLyBGaW5kIG5leHQgZm9jdXMgaW5kZXhcbiAgdmFyIGNvdW50ID0gc2FtZUxldmVsRm9jdXNhYmxlTWVudUVsZW1lbnRMaXN0Lmxlbmd0aDtcbiAgdmFyIGZvY3VzSW5kZXggPSBzYW1lTGV2ZWxGb2N1c2FibGVNZW51RWxlbWVudExpc3QuZmluZEluZGV4KGZ1bmN0aW9uIChlbGUpIHtcbiAgICByZXR1cm4gZm9jdXNNZW51RWxlbWVudCA9PT0gZWxlO1xuICB9KTtcbiAgaWYgKG9mZnNldCA8IDApIHtcbiAgICBpZiAoZm9jdXNJbmRleCA9PT0gLTEpIHtcbiAgICAgIGZvY3VzSW5kZXggPSBjb3VudCAtIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvY3VzSW5kZXggLT0gMTtcbiAgICB9XG4gIH0gZWxzZSBpZiAob2Zmc2V0ID4gMCkge1xuICAgIGZvY3VzSW5kZXggKz0gMTtcbiAgfVxuICBmb2N1c0luZGV4ID0gKGZvY3VzSW5kZXggKyBjb3VudCkgJSBjb3VudDtcblxuICAvLyBGb2N1cyBtZW51IGl0ZW1cbiAgcmV0dXJuIHNhbWVMZXZlbEZvY3VzYWJsZU1lbnVFbGVtZW50TGlzdFtmb2N1c0luZGV4XTtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUFjY2Vzc2liaWxpdHkobW9kZSwgYWN0aXZlS2V5LCBpc1J0bCwgaWQsIGNvbnRhaW5lclJlZiwgZ2V0S2V5cywgZ2V0S2V5UGF0aCwgdHJpZ2dlckFjdGl2ZUtleSwgdHJpZ2dlckFjY2Vzc2liaWxpdHlPcGVuLCBvcmlnaW5PbktleURvd24pIHtcbiAgdmFyIHJhZlJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICB2YXIgYWN0aXZlUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIGFjdGl2ZVJlZi5jdXJyZW50ID0gYWN0aXZlS2V5O1xuICB2YXIgY2xlYW5SYWYgPSBmdW5jdGlvbiBjbGVhblJhZigpIHtcbiAgICByYWYuY2FuY2VsKHJhZlJlZi5jdXJyZW50KTtcbiAgfTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgY2xlYW5SYWYoKTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiBmdW5jdGlvbiAoZSkge1xuICAgIHZhciB3aGljaCA9IGUud2hpY2g7XG4gICAgaWYgKFtdLmNvbmNhdChBcnJvd0tleXMsIFtFTlRFUiwgRVNDLCBIT01FLCBFTkRdKS5pbmNsdWRlcyh3aGljaCkpIHtcbiAgICAgIC8vIENvbnZlcnQga2V5IHRvIGVsZW1lbnRzXG4gICAgICB2YXIgZWxlbWVudHM7XG4gICAgICB2YXIga2V5MmVsZW1lbnQ7XG4gICAgICB2YXIgZWxlbWVudDJrZXk7XG5cbiAgICAgIC8vID4+PiBXcmFwIGFzIGZ1bmN0aW9uIHNpbmNlIHdlIHVzZSByYWYgZm9yIHNvbWUgY2FzZVxuICAgICAgdmFyIHJlZnJlc2hFbGVtZW50cyA9IGZ1bmN0aW9uIHJlZnJlc2hFbGVtZW50cygpIHtcbiAgICAgICAgZWxlbWVudHMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGtleTJlbGVtZW50ID0gbmV3IE1hcCgpO1xuICAgICAgICBlbGVtZW50MmtleSA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIGtleXMgPSBnZXRLZXlzKCk7XG4gICAgICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiW2RhdGEtbWVudS1pZD0nXCIuY29uY2F0KGdldE1lbnVJZChpZCwga2V5KSwgXCInXVwiKSk7XG4gICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGVsZW1lbnRzLmFkZChlbGVtZW50KTtcbiAgICAgICAgICAgIGVsZW1lbnQya2V5LnNldChlbGVtZW50LCBrZXkpO1xuICAgICAgICAgICAga2V5MmVsZW1lbnQuc2V0KGtleSwgZWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRzO1xuICAgICAgfTtcbiAgICAgIHJlZnJlc2hFbGVtZW50cygpO1xuXG4gICAgICAvLyBGaXJzdCB3ZSBzaG91bGQgZmluZCBjdXJyZW50IGZvY3VzZWQgTWVudUl0ZW0vU3ViTWVudSBlbGVtZW50XG4gICAgICB2YXIgYWN0aXZlRWxlbWVudCA9IGtleTJlbGVtZW50LmdldChhY3RpdmVLZXkpO1xuICAgICAgdmFyIGZvY3VzTWVudUVsZW1lbnQgPSBnZXRGb2N1c0VsZW1lbnQoYWN0aXZlRWxlbWVudCwgZWxlbWVudHMpO1xuICAgICAgdmFyIGZvY3VzTWVudUtleSA9IGVsZW1lbnQya2V5LmdldChmb2N1c01lbnVFbGVtZW50KTtcbiAgICAgIHZhciBvZmZzZXRPYmogPSBnZXRPZmZzZXQobW9kZSwgZ2V0S2V5UGF0aChmb2N1c01lbnVLZXksIHRydWUpLmxlbmd0aCA9PT0gMSwgaXNSdGwsIHdoaWNoKTtcblxuICAgICAgLy8gU29tZSBtb2RlIGRvIG5vdCBoYXZlIGZ1bGx5IGFycm93IG9wZXJhdGlvbiBsaWtlIGlubGluZVxuICAgICAgaWYgKCFvZmZzZXRPYmogJiYgd2hpY2ggIT09IEhPTUUgJiYgd2hpY2ggIT09IEVORCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEFycm93IHByZXZlbnQgZGVmYXVsdCB0byBhdm9pZCBwYWdlIHNjcm9sbFxuICAgICAgaWYgKEFycm93S2V5cy5pbmNsdWRlcyh3aGljaCkgfHwgW0hPTUUsIEVORF0uaW5jbHVkZXMod2hpY2gpKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICAgIHZhciB0cnlGb2N1cyA9IGZ1bmN0aW9uIHRyeUZvY3VzKG1lbnVFbGVtZW50KSB7XG4gICAgICAgIGlmIChtZW51RWxlbWVudCkge1xuICAgICAgICAgIHZhciBmb2N1c1RhcmdldEVsZW1lbnQgPSBtZW51RWxlbWVudDtcblxuICAgICAgICAgIC8vIEZvY3VzIHRvIGxpbmsgaW5zdGVhZCBvZiBtZW51IGl0ZW0gaWYgcG9zc2libGVcbiAgICAgICAgICB2YXIgbGluayA9IG1lbnVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2EnKTtcbiAgICAgICAgICBpZiAobGluayAhPT0gbnVsbCAmJiBsaW5rICE9PSB2b2lkIDAgJiYgbGluay5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSkge1xuICAgICAgICAgICAgZm9jdXNUYXJnZXRFbGVtZW50ID0gbGluaztcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHRhcmdldEtleSA9IGVsZW1lbnQya2V5LmdldChtZW51RWxlbWVudCk7XG4gICAgICAgICAgdHJpZ2dlckFjdGl2ZUtleSh0YXJnZXRLZXkpO1xuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogRG8gbm90IGB1c2VFZmZlY3RgIGhlcmUgc2luY2UgYHRyeUZvY3VzYCBtYXkgdHJpZ2dlciBhc3luY1xuICAgICAgICAgICAqIHdoaWNoIG1ha2VzIFJlYWN0IHN5bmMgdXBkYXRlIHRoZSBgYWN0aXZlS2V5YFxuICAgICAgICAgICAqIHRoYXQgZm9yY2UgcmVuZGVyIGJlZm9yZSBgdXNlUmVmYCBzZXQgdGhlIG5leHQgYWN0aXZlS2V5XG4gICAgICAgICAgICovXG4gICAgICAgICAgY2xlYW5SYWYoKTtcbiAgICAgICAgICByYWZSZWYuY3VycmVudCA9IHJhZihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoYWN0aXZlUmVmLmN1cnJlbnQgPT09IHRhcmdldEtleSkge1xuICAgICAgICAgICAgICBmb2N1c1RhcmdldEVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGlmIChbSE9NRSwgRU5EXS5pbmNsdWRlcyh3aGljaCkgfHwgb2Zmc2V0T2JqLnNpYmxpbmcgfHwgIWZvY3VzTWVudUVsZW1lbnQpIHtcbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gU2libGluZyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyBGaW5kIHdhbGthYmxlIGZvY3VzIG1lbnUgZWxlbWVudCBjb250YWluZXJcbiAgICAgICAgdmFyIHBhcmVudFF1ZXJ5Q29udGFpbmVyO1xuICAgICAgICBpZiAoIWZvY3VzTWVudUVsZW1lbnQgfHwgbW9kZSA9PT0gJ2lubGluZScpIHtcbiAgICAgICAgICBwYXJlbnRRdWVyeUNvbnRhaW5lciA9IGNvbnRhaW5lclJlZi5jdXJyZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcmVudFF1ZXJ5Q29udGFpbmVyID0gZmluZENvbnRhaW5lclVMKGZvY3VzTWVudUVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IG5leHQgZm9jdXMgZWxlbWVudFxuICAgICAgICB2YXIgdGFyZ2V0RWxlbWVudDtcbiAgICAgICAgdmFyIGZvY3VzYWJsZUVsZW1lbnRzID0gZ2V0Rm9jdXNhYmxlRWxlbWVudHMocGFyZW50UXVlcnlDb250YWluZXIsIGVsZW1lbnRzKTtcbiAgICAgICAgaWYgKHdoaWNoID09PSBIT01FKSB7XG4gICAgICAgICAgdGFyZ2V0RWxlbWVudCA9IGZvY3VzYWJsZUVsZW1lbnRzWzBdO1xuICAgICAgICB9IGVsc2UgaWYgKHdoaWNoID09PSBFTkQpIHtcbiAgICAgICAgICB0YXJnZXRFbGVtZW50ID0gZm9jdXNhYmxlRWxlbWVudHNbZm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoIC0gMV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0RWxlbWVudCA9IGdldE5leHRGb2N1c0VsZW1lbnQocGFyZW50UXVlcnlDb250YWluZXIsIGVsZW1lbnRzLCBmb2N1c01lbnVFbGVtZW50LCBvZmZzZXRPYmoub2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb2N1cyBtZW51IGl0ZW1cbiAgICAgICAgdHJ5Rm9jdXModGFyZ2V0RWxlbWVudCk7XG5cbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gSW5saW5lVHJpZ2dlciA9PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgfSBlbHNlIGlmIChvZmZzZXRPYmouaW5saW5lVHJpZ2dlcikge1xuICAgICAgICAvLyBJbmxpbmUgdHJpZ2dlciBubyBuZWVkIHN3aXRjaCB0byBzdWIgbWVudSBpdGVtXG4gICAgICAgIHRyaWdnZXJBY2Nlc3NpYmlsaXR5T3Blbihmb2N1c01lbnVLZXkpO1xuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gTGV2ZWwgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICB9IGVsc2UgaWYgKG9mZnNldE9iai5vZmZzZXQgPiAwKSB7XG4gICAgICAgIHRyaWdnZXJBY2Nlc3NpYmlsaXR5T3Blbihmb2N1c01lbnVLZXksIHRydWUpO1xuICAgICAgICBjbGVhblJhZigpO1xuICAgICAgICByYWZSZWYuY3VycmVudCA9IHJhZihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gQXN5bmMgc2hvdWxkIHJlc3luYyBlbGVtZW50c1xuICAgICAgICAgIHJlZnJlc2hFbGVtZW50cygpO1xuICAgICAgICAgIHZhciBjb250cm9sSWQgPSBmb2N1c01lbnVFbGVtZW50LmdldEF0dHJpYnV0ZSgnYXJpYS1jb250cm9scycpO1xuICAgICAgICAgIHZhciBzdWJRdWVyeUNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvbnRyb2xJZCk7XG5cbiAgICAgICAgICAvLyBHZXQgc3ViIGZvY3VzYWJsZSBtZW51IGl0ZW1cbiAgICAgICAgICB2YXIgdGFyZ2V0RWxlbWVudCA9IGdldE5leHRGb2N1c0VsZW1lbnQoc3ViUXVlcnlDb250YWluZXIsIGVsZW1lbnRzKTtcblxuICAgICAgICAgIC8vIEZvY3VzIG1lbnUgaXRlbVxuICAgICAgICAgIHRyeUZvY3VzKHRhcmdldEVsZW1lbnQpO1xuICAgICAgICB9LCA1KTtcbiAgICAgIH0gZWxzZSBpZiAob2Zmc2V0T2JqLm9mZnNldCA8IDApIHtcbiAgICAgICAgdmFyIGtleVBhdGggPSBnZXRLZXlQYXRoKGZvY3VzTWVudUtleSwgdHJ1ZSk7XG4gICAgICAgIHZhciBwYXJlbnRLZXkgPSBrZXlQYXRoW2tleVBhdGgubGVuZ3RoIC0gMl07XG4gICAgICAgIHZhciBwYXJlbnRNZW51RWxlbWVudCA9IGtleTJlbGVtZW50LmdldChwYXJlbnRLZXkpO1xuXG4gICAgICAgIC8vIEZvY3VzIG1lbnUgaXRlbVxuICAgICAgICB0cmlnZ2VyQWNjZXNzaWJpbGl0eU9wZW4ocGFyZW50S2V5LCBmYWxzZSk7XG4gICAgICAgIHRyeUZvY3VzKHBhcmVudE1lbnVFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQYXNzIG9yaWdpbiBrZXkgZG93biBldmVudFxuICAgIG9yaWdpbk9uS2V5RG93biA9PT0gbnVsbCB8fCBvcmlnaW5PbktleURvd24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9yaWdpbk9uS2V5RG93bihlKTtcbiAgfTtcbn0iLCJleHBvcnQgZnVuY3Rpb24gbmV4dFNsaWNlKGNhbGxiYWNrKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oY2FsbGJhY2spO1xufSIsImltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVJlZiwgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgd2FybmluZyBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5pbXBvcnQgeyBuZXh0U2xpY2UgfSBmcm9tIFwiLi4vdXRpbHMvdGltZVV0aWxcIjtcbnZhciBQQVRIX1NQTElUID0gJ19fUkNfVVRJTF9QQVRIX1NQTElUX18nO1xudmFyIGdldFBhdGhTdHIgPSBmdW5jdGlvbiBnZXRQYXRoU3RyKGtleVBhdGgpIHtcbiAgcmV0dXJuIGtleVBhdGguam9pbihQQVRIX1NQTElUKTtcbn07XG52YXIgZ2V0UGF0aEtleXMgPSBmdW5jdGlvbiBnZXRQYXRoS2V5cyhrZXlQYXRoU3RyKSB7XG4gIHJldHVybiBrZXlQYXRoU3RyLnNwbGl0KFBBVEhfU1BMSVQpO1xufTtcbmV4cG9ydCB2YXIgT1ZFUkZMT1dfS0VZID0gJ3JjLW1lbnUtbW9yZSc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VLZXlSZWNvcmRzKCkge1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoe30pLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIGludGVybmFsRm9yY2VVcGRhdGUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIga2V5MnBhdGhSZWYgPSB1c2VSZWYobmV3IE1hcCgpKTtcbiAgdmFyIHBhdGgya2V5UmVmID0gdXNlUmVmKG5ldyBNYXAoKSk7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUzID0gUmVhY3QudXNlU3RhdGUoW10pLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUzLCAyKSxcbiAgICBvdmVyZmxvd0tleXMgPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgIHNldE92ZXJmbG93S2V5cyA9IF9SZWFjdCR1c2VTdGF0ZTRbMV07XG4gIHZhciB1cGRhdGVSZWYgPSB1c2VSZWYoMCk7XG4gIHZhciBkZXN0cm95UmVmID0gdXNlUmVmKGZhbHNlKTtcbiAgdmFyIGZvcmNlVXBkYXRlID0gZnVuY3Rpb24gZm9yY2VVcGRhdGUoKSB7XG4gICAgaWYgKCFkZXN0cm95UmVmLmN1cnJlbnQpIHtcbiAgICAgIGludGVybmFsRm9yY2VVcGRhdGUoe30pO1xuICAgIH1cbiAgfTtcbiAgdmFyIHJlZ2lzdGVyUGF0aCA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChrZXksIGtleVBhdGgpIHtcbiAgICAvLyBXYXJuaW5nIGZvciBpbnZhbGlkYXRlIG9yIGR1cGxpY2F0ZWQgYGtleWBcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgd2FybmluZygha2V5MnBhdGhSZWYuY3VycmVudC5oYXMoa2V5KSwgXCJEdXBsaWNhdGVkIGtleSAnXCIuY29uY2F0KGtleSwgXCInIHVzZWQgaW4gTWVudSBieSBwYXRoIFtcIikuY29uY2F0KGtleVBhdGguam9pbignID4gJyksIFwiXVwiKSk7XG4gICAgfVxuXG4gICAgLy8gRmlsbCBtYXBcbiAgICB2YXIgY29ubmVjdGVkUGF0aCA9IGdldFBhdGhTdHIoa2V5UGF0aCk7XG4gICAgcGF0aDJrZXlSZWYuY3VycmVudC5zZXQoY29ubmVjdGVkUGF0aCwga2V5KTtcbiAgICBrZXkycGF0aFJlZi5jdXJyZW50LnNldChrZXksIGNvbm5lY3RlZFBhdGgpO1xuICAgIHVwZGF0ZVJlZi5jdXJyZW50ICs9IDE7XG4gICAgdmFyIGlkID0gdXBkYXRlUmVmLmN1cnJlbnQ7XG4gICAgbmV4dFNsaWNlKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChpZCA9PT0gdXBkYXRlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgZm9yY2VVcGRhdGUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSwgW10pO1xuICB2YXIgdW5yZWdpc3RlclBhdGggPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoa2V5LCBrZXlQYXRoKSB7XG4gICAgdmFyIGNvbm5lY3RlZFBhdGggPSBnZXRQYXRoU3RyKGtleVBhdGgpO1xuICAgIHBhdGgya2V5UmVmLmN1cnJlbnQuZGVsZXRlKGNvbm5lY3RlZFBhdGgpO1xuICAgIGtleTJwYXRoUmVmLmN1cnJlbnQuZGVsZXRlKGtleSk7XG4gIH0sIFtdKTtcbiAgdmFyIHJlZnJlc2hPdmVyZmxvd0tleXMgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoa2V5cykge1xuICAgIHNldE92ZXJmbG93S2V5cyhrZXlzKTtcbiAgfSwgW10pO1xuICB2YXIgZ2V0S2V5UGF0aCA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChldmVudEtleSwgaW5jbHVkZU92ZXJmbG93KSB7XG4gICAgdmFyIGZ1bGxQYXRoID0ga2V5MnBhdGhSZWYuY3VycmVudC5nZXQoZXZlbnRLZXkpIHx8ICcnO1xuICAgIHZhciBrZXlzID0gZ2V0UGF0aEtleXMoZnVsbFBhdGgpO1xuICAgIGlmIChpbmNsdWRlT3ZlcmZsb3cgJiYgb3ZlcmZsb3dLZXlzLmluY2x1ZGVzKGtleXNbMF0pKSB7XG4gICAgICBrZXlzLnVuc2hpZnQoT1ZFUkZMT1dfS0VZKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleXM7XG4gIH0sIFtvdmVyZmxvd0tleXNdKTtcbiAgdmFyIGlzU3ViUGF0aEtleSA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChwYXRoS2V5cywgZXZlbnRLZXkpIHtcbiAgICByZXR1cm4gcGF0aEtleXMuc29tZShmdW5jdGlvbiAocGF0aEtleSkge1xuICAgICAgdmFyIHBhdGhLZXlMaXN0ID0gZ2V0S2V5UGF0aChwYXRoS2V5LCB0cnVlKTtcbiAgICAgIHJldHVybiBwYXRoS2V5TGlzdC5pbmNsdWRlcyhldmVudEtleSk7XG4gICAgfSk7XG4gIH0sIFtnZXRLZXlQYXRoXSk7XG4gIHZhciBnZXRLZXlzID0gZnVuY3Rpb24gZ2V0S2V5cygpIHtcbiAgICB2YXIga2V5cyA9IF90b0NvbnN1bWFibGVBcnJheShrZXkycGF0aFJlZi5jdXJyZW50LmtleXMoKSk7XG4gICAgaWYgKG92ZXJmbG93S2V5cy5sZW5ndGgpIHtcbiAgICAgIGtleXMucHVzaChPVkVSRkxPV19LRVkpO1xuICAgIH1cbiAgICByZXR1cm4ga2V5cztcbiAgfTtcblxuICAvKipcbiAgICogRmluZCBjdXJyZW50IGtleSByZWxhdGVkIGNoaWxkIHBhdGgga2V5c1xuICAgKi9cbiAgdmFyIGdldFN1YlBhdGhLZXlzID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBjb25uZWN0ZWRQYXRoID0gXCJcIi5jb25jYXQoa2V5MnBhdGhSZWYuY3VycmVudC5nZXQoa2V5KSkuY29uY2F0KFBBVEhfU1BMSVQpO1xuICAgIHZhciBwYXRoS2V5cyA9IG5ldyBTZXQoKTtcbiAgICBfdG9Db25zdW1hYmxlQXJyYXkocGF0aDJrZXlSZWYuY3VycmVudC5rZXlzKCkpLmZvckVhY2goZnVuY3Rpb24gKHBhdGhLZXkpIHtcbiAgICAgIGlmIChwYXRoS2V5LnN0YXJ0c1dpdGgoY29ubmVjdGVkUGF0aCkpIHtcbiAgICAgICAgcGF0aEtleXMuYWRkKHBhdGgya2V5UmVmLmN1cnJlbnQuZ2V0KHBhdGhLZXkpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcGF0aEtleXM7XG4gIH0sIFtdKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgZGVzdHJveVJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiB7XG4gICAgLy8gUmVnaXN0ZXJcbiAgICByZWdpc3RlclBhdGg6IHJlZ2lzdGVyUGF0aCxcbiAgICB1bnJlZ2lzdGVyUGF0aDogdW5yZWdpc3RlclBhdGgsXG4gICAgcmVmcmVzaE92ZXJmbG93S2V5czogcmVmcmVzaE92ZXJmbG93S2V5cyxcbiAgICAvLyBVdGlsXG4gICAgaXNTdWJQYXRoS2V5OiBpc1N1YlBhdGhLZXksXG4gICAgZ2V0S2V5UGF0aDogZ2V0S2V5UGF0aCxcbiAgICBnZXRLZXlzOiBnZXRLZXlzLFxuICAgIGdldFN1YlBhdGhLZXlzOiBnZXRTdWJQYXRoS2V5c1xuICB9O1xufSIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcblxuLyoqXG4gKiBDYWNoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGFsd2F5cyByZXR1cm4gc2FtZSByZWYgaW5zdGVhZC5cbiAqIFRoaXMgaXMgdXNlZCBmb3IgY29udGV4dCBvcHRpbWl6YXRpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZU1lbW9DYWxsYmFjayhmdW5jKSB7XG4gIHZhciBmdW5SZWYgPSBSZWFjdC51c2VSZWYoZnVuYyk7XG4gIGZ1blJlZi5jdXJyZW50ID0gZnVuYztcbiAgdmFyIGNhbGxiYWNrID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIHZhciBfZnVuUmVmJGN1cnJlbnQ7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cbiAgICByZXR1cm4gKF9mdW5SZWYkY3VycmVudCA9IGZ1blJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfZnVuUmVmJGN1cnJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9mdW5SZWYkY3VycmVudC5jYWxsLmFwcGx5KF9mdW5SZWYkY3VycmVudCwgW2Z1blJlZl0uY29uY2F0KGFyZ3MpKTtcbiAgfSwgW10pO1xuICByZXR1cm4gZnVuYyA/IGNhbGxiYWNrIDogdW5kZWZpbmVkO1xufSIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZU1lcmdlZFN0YXRlIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lcmdlZFN0YXRlXCI7XG52YXIgdW5pcXVlUHJlZml4ID0gTWF0aC5yYW5kb20oKS50b0ZpeGVkKDUpLnRvU3RyaW5nKCkuc2xpY2UoMik7XG52YXIgaW50ZXJuYWxJZCA9IDA7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VVVUlEKGlkKSB7XG4gIHZhciBfdXNlTWVyZ2VkU3RhdGUgPSB1c2VNZXJnZWRTdGF0ZShpZCwge1xuICAgICAgdmFsdWU6IGlkXG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZSwgMiksXG4gICAgdXVpZCA9IF91c2VNZXJnZWRTdGF0ZTJbMF0sXG4gICAgc2V0VVVJRCA9IF91c2VNZXJnZWRTdGF0ZTJbMV07XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaW50ZXJuYWxJZCArPSAxO1xuICAgIHZhciBuZXdJZCA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAndGVzdCcgPyAndGVzdCcgOiBcIlwiLmNvbmNhdCh1bmlxdWVQcmVmaXgsIFwiLVwiKS5jb25jYXQoaW50ZXJuYWxJZCk7XG4gICAgc2V0VVVJRChcInJjLW1lbnUtdXVpZC1cIi5jb25jYXQobmV3SWQpKTtcbiAgfSwgW10pO1xuICByZXR1cm4gdXVpZDtcbn0iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBNZW51Q29udGV4dCB9IGZyb20gXCIuLi9jb250ZXh0L01lbnVDb250ZXh0XCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VBY3RpdmUoZXZlbnRLZXksIGRpc2FibGVkLCBvbk1vdXNlRW50ZXIsIG9uTW91c2VMZWF2ZSkge1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KE1lbnVDb250ZXh0KSxcbiAgICBhY3RpdmVLZXkgPSBfUmVhY3QkdXNlQ29udGV4dC5hY3RpdmVLZXksXG4gICAgb25BY3RpdmUgPSBfUmVhY3QkdXNlQ29udGV4dC5vbkFjdGl2ZSxcbiAgICBvbkluYWN0aXZlID0gX1JlYWN0JHVzZUNvbnRleHQub25JbmFjdGl2ZTtcbiAgdmFyIHJldCA9IHtcbiAgICBhY3RpdmU6IGFjdGl2ZUtleSA9PT0gZXZlbnRLZXlcbiAgfTtcblxuICAvLyBTa2lwIHdoZW4gZGlzYWJsZWRcbiAgaWYgKCFkaXNhYmxlZCkge1xuICAgIHJldC5vbk1vdXNlRW50ZXIgPSBmdW5jdGlvbiAoZG9tRXZlbnQpIHtcbiAgICAgIG9uTW91c2VFbnRlciA9PT0gbnVsbCB8fCBvbk1vdXNlRW50ZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uTW91c2VFbnRlcih7XG4gICAgICAgIGtleTogZXZlbnRLZXksXG4gICAgICAgIGRvbUV2ZW50OiBkb21FdmVudFxuICAgICAgfSk7XG4gICAgICBvbkFjdGl2ZShldmVudEtleSk7XG4gICAgfTtcbiAgICByZXQub25Nb3VzZUxlYXZlID0gZnVuY3Rpb24gKGRvbUV2ZW50KSB7XG4gICAgICBvbk1vdXNlTGVhdmUgPT09IG51bGwgfHwgb25Nb3VzZUxlYXZlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbk1vdXNlTGVhdmUoe1xuICAgICAgICBrZXk6IGV2ZW50S2V5LFxuICAgICAgICBkb21FdmVudDogZG9tRXZlbnRcbiAgICAgIH0pO1xuICAgICAgb25JbmFjdGl2ZShldmVudEtleSk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gcmV0O1xufSIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IE1lbnVDb250ZXh0IH0gZnJvbSBcIi4uL2NvbnRleHQvTWVudUNvbnRleHRcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZURpcmVjdGlvblN0eWxlKGxldmVsKSB7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoTWVudUNvbnRleHQpLFxuICAgIG1vZGUgPSBfUmVhY3QkdXNlQ29udGV4dC5tb2RlLFxuICAgIHJ0bCA9IF9SZWFjdCR1c2VDb250ZXh0LnJ0bCxcbiAgICBpbmxpbmVJbmRlbnQgPSBfUmVhY3QkdXNlQ29udGV4dC5pbmxpbmVJbmRlbnQ7XG4gIGlmIChtb2RlICE9PSAnaW5saW5lJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBsZW4gPSBsZXZlbDtcbiAgcmV0dXJuIHJ0bCA/IHtcbiAgICBwYWRkaW5nUmlnaHQ6IGxlbiAqIGlubGluZUluZGVudFxuICB9IDoge1xuICAgIHBhZGRpbmdMZWZ0OiBsZW4gKiBpbmxpbmVJbmRlbnRcbiAgfTtcbn0iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gSWNvbihfcmVmKSB7XG4gIHZhciBpY29uID0gX3JlZi5pY29uLFxuICAgIHByb3BzID0gX3JlZi5wcm9wcyxcbiAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG4gIHZhciBpY29uTm9kZTtcbiAgaWYgKHR5cGVvZiBpY29uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWNvbk5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChpY29uLCBfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcykpO1xuICB9IGVsc2Uge1xuICAgIC8vIENvbXBhdGlibGUgZm9yIG9yaWdpbiBkZWZpbml0aW9uXG4gICAgaWNvbk5vZGUgPSBpY29uO1xuICB9XG4gIHJldHVybiBpY29uTm9kZSB8fCBjaGlsZHJlbiB8fCBudWxsO1xufSIsImltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiaXRlbVwiXTtcbmltcG9ydCB3YXJuaW5nIGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcblxuLyoqXG4gKiBgb25DbGlja2AgZXZlbnQgcmV0dXJuIGBpbmZvLml0ZW1gIHdoaWNoIHBvaW50IHRvIHJlYWN0IG5vZGUgZGlyZWN0bHkuXG4gKiBXZSBzaG91bGQgd2FybmluZyB0aGlzIHNpbmNlIGl0IHdpbGwgbm90IHdvcmsgb24gRkMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YXJuSXRlbVByb3AoX3JlZikge1xuICB2YXIgaXRlbSA9IF9yZWYuaXRlbSxcbiAgICByZXN0SW5mbyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzdEluZm8sICdpdGVtJywge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgd2FybmluZyhmYWxzZSwgJ2BpbmZvLml0ZW1gIGlzIGRlcHJlY2F0ZWQgc2luY2Ugd2Ugd2lsbCBtb3ZlIHRvIGZ1bmN0aW9uIGNvbXBvbmVudCB0aGF0IG5vdCBwcm92aWRlcyBSZWFjdCBOb2RlIGluc3RhbmNlIGluIGZ1dHVyZS4nKTtcbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN0SW5mbztcbn0iLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX2NyZWF0ZVN1cGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlclwiO1xudmFyIF9leGNsdWRlZCA9IFtcInRpdGxlXCIsIFwiYXR0cmlidXRlXCIsIFwiZWxlbWVudFJlZlwiXSxcbiAgX2V4Y2x1ZGVkMiA9IFtcInN0eWxlXCIsIFwiY2xhc3NOYW1lXCIsIFwiZXZlbnRLZXlcIiwgXCJ3YXJuS2V5XCIsIFwiZGlzYWJsZWRcIiwgXCJpdGVtSWNvblwiLCBcImNoaWxkcmVuXCIsIFwicm9sZVwiLCBcIm9uTW91c2VFbnRlclwiLCBcIm9uTW91c2VMZWF2ZVwiLCBcIm9uQ2xpY2tcIiwgXCJvbktleURvd25cIiwgXCJvbkZvY3VzXCJdLFxuICBfZXhjbHVkZWQzID0gW1wiYWN0aXZlXCJdO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgT3ZlcmZsb3cgZnJvbSAncmMtb3ZlcmZsb3cnO1xuaW1wb3J0IEtleUNvZGUgZnJvbSBcInJjLXV0aWwvZXMvS2V5Q29kZVwiO1xuaW1wb3J0IG9taXQgZnJvbSBcInJjLXV0aWwvZXMvb21pdFwiO1xuaW1wb3J0IHsgdXNlQ29tcG9zZVJlZiB9IGZyb20gXCJyYy11dGlsL2VzL3JlZlwiO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlTWVudUlkIH0gZnJvbSBcIi4vY29udGV4dC9JZENvbnRleHRcIjtcbmltcG9ydCB7IE1lbnVDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dC9NZW51Q29udGV4dFwiO1xuaW1wb3J0IHsgdXNlRnVsbFBhdGgsIHVzZU1lYXN1cmUgfSBmcm9tIFwiLi9jb250ZXh0L1BhdGhDb250ZXh0XCI7XG5pbXBvcnQgUHJpdmF0ZUNvbnRleHQgZnJvbSBcIi4vY29udGV4dC9Qcml2YXRlQ29udGV4dFwiO1xuaW1wb3J0IHVzZUFjdGl2ZSBmcm9tIFwiLi9ob29rcy91c2VBY3RpdmVcIjtcbmltcG9ydCB1c2VEaXJlY3Rpb25TdHlsZSBmcm9tIFwiLi9ob29rcy91c2VEaXJlY3Rpb25TdHlsZVwiO1xuaW1wb3J0IEljb24gZnJvbSBcIi4vSWNvblwiO1xuaW1wb3J0IHsgd2Fybkl0ZW1Qcm9wIH0gZnJvbSBcIi4vdXRpbHMvd2FyblV0aWxcIjtcbi8vIFNpbmNlIE1lbnUgZXZlbnQgcHJvdmlkZSB0aGUgYGluZm8uaXRlbWAgd2hpY2ggcG9pbnQgdG8gdGhlIE1lbnVJdGVtIG5vZGUgaW5zdGFuY2UuXG4vLyBXZSBoYXZlIHRvIHVzZSBjbGFzcyBjb21wb25lbnQgaGVyZS5cbi8vIFRoaXMgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSBkb2MgJiBhcGkgaW4gZnV0dXJlLlxudmFyIExlZ2FjeU1lbnVJdGVtID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhMZWdhY3lNZW51SXRlbSwgX1JlYWN0JENvbXBvbmVudCk7XG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoTGVnYWN5TWVudUl0ZW0pO1xuICBmdW5jdGlvbiBMZWdhY3lNZW51SXRlbSgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTGVnYWN5TWVudUl0ZW0pO1xuICAgIHJldHVybiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuICBfY3JlYXRlQ2xhc3MoTGVnYWN5TWVudUl0ZW0sIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICB0aXRsZSA9IF90aGlzJHByb3BzLnRpdGxlLFxuICAgICAgICBhdHRyaWJ1dGUgPSBfdGhpcyRwcm9wcy5hdHRyaWJ1dGUsXG4gICAgICAgIGVsZW1lbnRSZWYgPSBfdGhpcyRwcm9wcy5lbGVtZW50UmVmLFxuICAgICAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3RoaXMkcHJvcHMsIF9leGNsdWRlZCk7XG5cbiAgICAgIC8vIEhlcmUgdGhlIHByb3BzIGFyZSBldmVudHVhbGx5IHBhc3NlZCB0byB0aGUgRE9NIGVsZW1lbnQuXG4gICAgICAvLyBSZWFjdCBkb2VzIG5vdCByZWNvZ25pemUgbm9uLXN0YW5kYXJkIGF0dHJpYnV0ZXMuXG4gICAgICAvLyBUaGVyZWZvcmUsIHJlbW92ZSB0aGUgcHJvcHMgdGhhdCBpcyBub3QgdXNlZCBoZXJlLlxuICAgICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80MTM5NVxuICAgICAgdmFyIHBhc3NlZFByb3BzID0gb21pdChyZXN0UHJvcHMsIFsnZXZlbnRLZXknLCAncG9wdXBDbGFzc05hbWUnLCAncG9wdXBPZmZzZXQnLCAnb25UaXRsZUNsaWNrJ10pO1xuICAgICAgd2FybmluZyghYXR0cmlidXRlLCAnYGF0dHJpYnV0ZWAgb2YgTWVudS5JdGVtIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBwYXNzIGF0dHJpYnV0ZSBkaXJlY3RseS4nKTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChPdmVyZmxvdy5JdGVtLCBfZXh0ZW5kcyh7fSwgYXR0cmlidXRlLCB7XG4gICAgICAgIHRpdGxlOiB0eXBlb2YgdGl0bGUgPT09ICdzdHJpbmcnID8gdGl0bGUgOiB1bmRlZmluZWRcbiAgICAgIH0sIHBhc3NlZFByb3BzLCB7XG4gICAgICAgIHJlZjogZWxlbWVudFJlZlxuICAgICAgfSkpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gTGVnYWN5TWVudUl0ZW07XG59KFJlYWN0LkNvbXBvbmVudCk7XG4vKipcbiAqIFJlYWwgTWVudSBJdGVtIGNvbXBvbmVudFxuICovXG52YXIgSW50ZXJuYWxNZW51SXRlbSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBfY2xhc3NOYW1lcztcbiAgdmFyIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIGV2ZW50S2V5ID0gcHJvcHMuZXZlbnRLZXksXG4gICAgd2FybktleSA9IHByb3BzLndhcm5LZXksXG4gICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICBpdGVtSWNvbiA9IHByb3BzLml0ZW1JY29uLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgcm9sZSA9IHByb3BzLnJvbGUsXG4gICAgb25Nb3VzZUVudGVyID0gcHJvcHMub25Nb3VzZUVudGVyLFxuICAgIG9uTW91c2VMZWF2ZSA9IHByb3BzLm9uTW91c2VMZWF2ZSxcbiAgICBvbkNsaWNrID0gcHJvcHMub25DbGljayxcbiAgICBvbktleURvd24gPSBwcm9wcy5vbktleURvd24sXG4gICAgb25Gb2N1cyA9IHByb3BzLm9uRm9jdXMsXG4gICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQyKTtcbiAgdmFyIGRvbURhdGFJZCA9IHVzZU1lbnVJZChldmVudEtleSk7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoTWVudUNvbnRleHQpLFxuICAgIHByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LnByZWZpeENscyxcbiAgICBvbkl0ZW1DbGljayA9IF9SZWFjdCR1c2VDb250ZXh0Lm9uSXRlbUNsaWNrLFxuICAgIGNvbnRleHREaXNhYmxlZCA9IF9SZWFjdCR1c2VDb250ZXh0LmRpc2FibGVkLFxuICAgIG92ZXJmbG93RGlzYWJsZWQgPSBfUmVhY3QkdXNlQ29udGV4dC5vdmVyZmxvd0Rpc2FibGVkLFxuICAgIGNvbnRleHRJdGVtSWNvbiA9IF9SZWFjdCR1c2VDb250ZXh0Lml0ZW1JY29uLFxuICAgIHNlbGVjdGVkS2V5cyA9IF9SZWFjdCR1c2VDb250ZXh0LnNlbGVjdGVkS2V5cyxcbiAgICBvbkFjdGl2ZSA9IF9SZWFjdCR1c2VDb250ZXh0Lm9uQWN0aXZlO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQyID0gUmVhY3QudXNlQ29udGV4dChQcml2YXRlQ29udGV4dCksXG4gICAgX2ludGVybmFsUmVuZGVyTWVudUl0ZW0gPSBfUmVhY3QkdXNlQ29udGV4dDIuX2ludGVybmFsUmVuZGVyTWVudUl0ZW07XG4gIHZhciBpdGVtQ2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtXCIpO1xuICB2YXIgbGVnYWN5TWVudUl0ZW1SZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgdmFyIGVsZW1lbnRSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgdmFyIG1lcmdlZERpc2FibGVkID0gY29udGV4dERpc2FibGVkIHx8IGRpc2FibGVkO1xuICB2YXIgbWVyZ2VkRWxlUmVmID0gdXNlQ29tcG9zZVJlZihyZWYsIGVsZW1lbnRSZWYpO1xuICB2YXIgY29ubmVjdGVkS2V5cyA9IHVzZUZ1bGxQYXRoKGV2ZW50S2V5KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBXYXJuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm5LZXkpIHtcbiAgICB3YXJuaW5nKGZhbHNlLCAnTWVudUl0ZW0gc2hvdWxkIG5vdCBsZWF2ZSB1bmRlZmluZWQgYGtleWAuJyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJbmZvID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBnZXRFdmVudEluZm8gPSBmdW5jdGlvbiBnZXRFdmVudEluZm8oZSkge1xuICAgIHJldHVybiB7XG4gICAgICBrZXk6IGV2ZW50S2V5LFxuICAgICAgLy8gTm90ZTogRm9yIGxlZ2FjeSBjb2RlIGlzIHJldmVyc2VkIHdoaWNoIG5vdCBsaWtlIG90aGVyIGFudGQgY29tcG9uZW50XG4gICAgICBrZXlQYXRoOiBfdG9Db25zdW1hYmxlQXJyYXkoY29ubmVjdGVkS2V5cykucmV2ZXJzZSgpLFxuICAgICAgaXRlbTogbGVnYWN5TWVudUl0ZW1SZWYuY3VycmVudCxcbiAgICAgIGRvbUV2ZW50OiBlXG4gICAgfTtcbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJY29uID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtZXJnZWRJdGVtSWNvbiA9IGl0ZW1JY29uIHx8IGNvbnRleHRJdGVtSWNvbjtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IEFjdGl2ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfdXNlQWN0aXZlID0gdXNlQWN0aXZlKGV2ZW50S2V5LCBtZXJnZWREaXNhYmxlZCwgb25Nb3VzZUVudGVyLCBvbk1vdXNlTGVhdmUpLFxuICAgIGFjdGl2ZSA9IF91c2VBY3RpdmUuYWN0aXZlLFxuICAgIGFjdGl2ZVByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF91c2VBY3RpdmUsIF9leGNsdWRlZDMpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2VsZWN0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHNlbGVjdGVkID0gc2VsZWN0ZWRLZXlzLmluY2x1ZGVzKGV2ZW50S2V5KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gRGlyZWN0aW9uU3R5bGUgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBkaXJlY3Rpb25TdHlsZSA9IHVzZURpcmVjdGlvblN0eWxlKGNvbm5lY3RlZEtleXMubGVuZ3RoKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IEV2ZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBvbkludGVybmFsQ2xpY2sgPSBmdW5jdGlvbiBvbkludGVybmFsQ2xpY2soZSkge1xuICAgIGlmIChtZXJnZWREaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgaW5mbyA9IGdldEV2ZW50SW5mbyhlKTtcbiAgICBvbkNsaWNrID09PSBudWxsIHx8IG9uQ2xpY2sgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2xpY2sod2Fybkl0ZW1Qcm9wKGluZm8pKTtcbiAgICBvbkl0ZW1DbGljayhpbmZvKTtcbiAgfTtcbiAgdmFyIG9uSW50ZXJuYWxLZXlEb3duID0gZnVuY3Rpb24gb25JbnRlcm5hbEtleURvd24oZSkge1xuICAgIG9uS2V5RG93biA9PT0gbnVsbCB8fCBvbktleURvd24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uS2V5RG93bihlKTtcbiAgICBpZiAoZS53aGljaCA9PT0gS2V5Q29kZS5FTlRFUikge1xuICAgICAgdmFyIGluZm8gPSBnZXRFdmVudEluZm8oZSk7XG5cbiAgICAgIC8vIExlZ2FjeS4gS2V5IHdpbGwgYWxzbyB0cmlnZ2VyIGNsaWNrIGV2ZW50XG4gICAgICBvbkNsaWNrID09PSBudWxsIHx8IG9uQ2xpY2sgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2xpY2sod2Fybkl0ZW1Qcm9wKGluZm8pKTtcbiAgICAgIG9uSXRlbUNsaWNrKGluZm8pO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogVXNlZCBmb3IgYWNjZXNzaWJpbGl0eS4gSGVscGVyIHdpbGwgZm9jdXMgZWxlbWVudCB3aXRob3V0IGtleSBib2FyZC5cbiAgICogV2Ugc2hvdWxkIG1hbnVhbGx5IHRyaWdnZXIgYW4gYWN0aXZlXG4gICAqL1xuICB2YXIgb25JbnRlcm5hbEZvY3VzID0gZnVuY3Rpb24gb25JbnRlcm5hbEZvY3VzKGUpIHtcbiAgICBvbkFjdGl2ZShldmVudEtleSk7XG4gICAgb25Gb2N1cyA9PT0gbnVsbCB8fCBvbkZvY3VzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkZvY3VzKGUpO1xuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG9wdGlvblJvbGVQcm9wcyA9IHt9O1xuICBpZiAocHJvcHMucm9sZSA9PT0gJ29wdGlvbicpIHtcbiAgICBvcHRpb25Sb2xlUHJvcHNbJ2FyaWEtc2VsZWN0ZWQnXSA9IHNlbGVjdGVkO1xuICB9XG4gIHZhciByZW5kZXJOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGVnYWN5TWVudUl0ZW0sIF9leHRlbmRzKHtcbiAgICByZWY6IGxlZ2FjeU1lbnVJdGVtUmVmLFxuICAgIGVsZW1lbnRSZWY6IG1lcmdlZEVsZVJlZixcbiAgICByb2xlOiByb2xlID09PSBudWxsID8gJ25vbmUnIDogcm9sZSB8fCAnbWVudWl0ZW0nLFxuICAgIHRhYkluZGV4OiBkaXNhYmxlZCA/IG51bGwgOiAtMSxcbiAgICBcImRhdGEtbWVudS1pZFwiOiBvdmVyZmxvd0Rpc2FibGVkICYmIGRvbURhdGFJZCA/IG51bGwgOiBkb21EYXRhSWRcbiAgfSwgcmVzdFByb3BzLCBhY3RpdmVQcm9wcywgb3B0aW9uUm9sZVByb3BzLCB7XG4gICAgY29tcG9uZW50OiBcImxpXCIsXG4gICAgXCJhcmlhLWRpc2FibGVkXCI6IGRpc2FibGVkLFxuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGRpcmVjdGlvblN0eWxlKSwgc3R5bGUpLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhpdGVtQ2xzLCAoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChpdGVtQ2xzLCBcIi1hY3RpdmVcIiksIGFjdGl2ZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQoaXRlbUNscywgXCItc2VsZWN0ZWRcIiksIHNlbGVjdGVkKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChpdGVtQ2xzLCBcIi1kaXNhYmxlZFwiKSwgbWVyZ2VkRGlzYWJsZWQpLCBfY2xhc3NOYW1lcyksIGNsYXNzTmFtZSksXG4gICAgb25DbGljazogb25JbnRlcm5hbENsaWNrLFxuICAgIG9uS2V5RG93bjogb25JbnRlcm5hbEtleURvd24sXG4gICAgb25Gb2N1czogb25JbnRlcm5hbEZvY3VzXG4gIH0pLCBjaGlsZHJlbiwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSWNvbiwge1xuICAgIHByb3BzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICAgIGlzU2VsZWN0ZWQ6IHNlbGVjdGVkXG4gICAgfSksXG4gICAgaWNvbjogbWVyZ2VkSXRlbUljb25cbiAgfSkpO1xuICBpZiAoX2ludGVybmFsUmVuZGVyTWVudUl0ZW0pIHtcbiAgICByZW5kZXJOb2RlID0gX2ludGVybmFsUmVuZGVyTWVudUl0ZW0ocmVuZGVyTm9kZSwgcHJvcHMsIHtcbiAgICAgIHNlbGVjdGVkOiBzZWxlY3RlZFxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZW5kZXJOb2RlO1xufSk7XG5mdW5jdGlvbiBNZW51SXRlbShwcm9wcywgcmVmKSB7XG4gIHZhciBldmVudEtleSA9IHByb3BzLmV2ZW50S2V5O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09IFJlY29yZCBLZXlQYXRoID09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtZWFzdXJlID0gdXNlTWVhc3VyZSgpO1xuICB2YXIgY29ubmVjdGVkS2V5UGF0aCA9IHVzZUZ1bGxQYXRoKGV2ZW50S2V5KTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAobWVhc3VyZSkge1xuICAgICAgbWVhc3VyZS5yZWdpc3RlclBhdGgoZXZlbnRLZXksIGNvbm5lY3RlZEtleVBhdGgpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbWVhc3VyZS51bnJlZ2lzdGVyUGF0aChldmVudEtleSwgY29ubmVjdGVkS2V5UGF0aCk7XG4gICAgICB9O1xuICAgIH1cbiAgfSwgW2Nvbm5lY3RlZEtleVBhdGhdKTtcbiAgaWYgKG1lYXN1cmUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJbnRlcm5hbE1lbnVJdGVtLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICByZWY6IHJlZlxuICB9KSk7XG59XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihNZW51SXRlbSk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcImNsYXNzTmFtZVwiLCBcImNoaWxkcmVuXCJdO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBNZW51Q29udGV4dCB9IGZyb20gXCIuLi9jb250ZXh0L01lbnVDb250ZXh0XCI7XG52YXIgSW50ZXJuYWxTdWJNZW51TGlzdCA9IGZ1bmN0aW9uIEludGVybmFsU3ViTWVudUxpc3QoX3JlZiwgcmVmKSB7XG4gIHZhciBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYsIF9leGNsdWRlZCk7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoTWVudUNvbnRleHQpLFxuICAgIHByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LnByZWZpeENscyxcbiAgICBtb2RlID0gX1JlYWN0JHVzZUNvbnRleHQubW9kZSxcbiAgICBydGwgPSBfUmVhY3QkdXNlQ29udGV4dC5ydGw7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInVsXCIsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBydGwgJiYgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3ViXCIpLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQobW9kZSA9PT0gJ2lubGluZScgPyAnaW5saW5lJyA6ICd2ZXJ0aWNhbCcpLCBjbGFzc05hbWUpLFxuICAgIHJvbGU6IFwibWVudVwiXG4gIH0sIHJlc3RQcm9wcywge1xuICAgIFwiZGF0YS1tZW51LWxpc3RcIjogdHJ1ZSxcbiAgICByZWY6IHJlZlxuICB9KSwgY2hpbGRyZW4pO1xufTtcbnZhciBTdWJNZW51TGlzdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEludGVybmFsU3ViTWVudUxpc3QpO1xuU3ViTWVudUxpc3QuZGlzcGxheU5hbWUgPSAnU3ViTWVudUxpc3QnO1xuZXhwb3J0IGRlZmF1bHQgU3ViTWVudUxpc3Q7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJsYWJlbFwiLCBcImNoaWxkcmVuXCIsIFwia2V5XCIsIFwidHlwZVwiXTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0b0FycmF5IGZyb20gXCJyYy11dGlsL2VzL0NoaWxkcmVuL3RvQXJyYXlcIjtcbmltcG9ydCB7IERpdmlkZXIsIE1lbnVJdGVtLCBNZW51SXRlbUdyb3VwLCBTdWJNZW51IH0gZnJvbSAnLi4nO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ2hpbGRyZW4oY2hpbGRyZW4sIGtleVBhdGgpIHtcbiAgcmV0dXJuIHRvQXJyYXkoY2hpbGRyZW4pLm1hcChmdW5jdGlvbiAoY2hpbGQsIGluZGV4KSB7XG4gICAgaWYgKCAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICB2YXIgX2V2ZW50S2V5LCBfY2hpbGQkcHJvcHM7XG4gICAgICB2YXIga2V5ID0gY2hpbGQua2V5O1xuICAgICAgdmFyIGV2ZW50S2V5ID0gKF9ldmVudEtleSA9IChfY2hpbGQkcHJvcHMgPSBjaGlsZC5wcm9wcykgPT09IG51bGwgfHwgX2NoaWxkJHByb3BzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY2hpbGQkcHJvcHMuZXZlbnRLZXkpICE9PSBudWxsICYmIF9ldmVudEtleSAhPT0gdm9pZCAwID8gX2V2ZW50S2V5IDoga2V5O1xuICAgICAgdmFyIGVtcHR5S2V5ID0gZXZlbnRLZXkgPT09IG51bGwgfHwgZXZlbnRLZXkgPT09IHVuZGVmaW5lZDtcbiAgICAgIGlmIChlbXB0eUtleSkge1xuICAgICAgICBldmVudEtleSA9IFwidG1wX2tleS1cIi5jb25jYXQoW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShrZXlQYXRoKSwgW2luZGV4XSkuam9pbignLScpKTtcbiAgICAgIH1cbiAgICAgIHZhciBjbG9uZVByb3BzID0ge1xuICAgICAgICBrZXk6IGV2ZW50S2V5LFxuICAgICAgICBldmVudEtleTogZXZlbnRLZXlcbiAgICAgIH07XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBlbXB0eUtleSkge1xuICAgICAgICBjbG9uZVByb3BzLndhcm5LZXkgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGQsIGNsb25lUHJvcHMpO1xuICAgIH1cbiAgICByZXR1cm4gY2hpbGQ7XG4gIH0pO1xufVxuZnVuY3Rpb24gY29udmVydEl0ZW1zVG9Ob2RlcyhsaXN0KSB7XG4gIHJldHVybiAobGlzdCB8fCBbXSkubWFwKGZ1bmN0aW9uIChvcHQsIGluZGV4KSB7XG4gICAgaWYgKG9wdCAmJiBfdHlwZW9mKG9wdCkgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YXIgX3JlZiA9IG9wdCxcbiAgICAgICAgbGFiZWwgPSBfcmVmLmxhYmVsLFxuICAgICAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgICAgIGtleSA9IF9yZWYua2V5LFxuICAgICAgICB0eXBlID0gX3JlZi50eXBlLFxuICAgICAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgX2V4Y2x1ZGVkKTtcbiAgICAgIHZhciBtZXJnZWRLZXkgPSBrZXkgIT09IG51bGwgJiYga2V5ICE9PSB2b2lkIDAgPyBrZXkgOiBcInRtcC1cIi5jb25jYXQoaW5kZXgpO1xuXG4gICAgICAvLyBNZW51SXRlbUdyb3VwICYgU3ViTWVudUl0ZW1cbiAgICAgIGlmIChjaGlsZHJlbiB8fCB0eXBlID09PSAnZ3JvdXAnKSB7XG4gICAgICAgIGlmICh0eXBlID09PSAnZ3JvdXAnKSB7XG4gICAgICAgICAgLy8gR3JvdXBcbiAgICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTWVudUl0ZW1Hcm91cCwgX2V4dGVuZHMoe1xuICAgICAgICAgICAga2V5OiBtZXJnZWRLZXlcbiAgICAgICAgICB9LCByZXN0UHJvcHMsIHtcbiAgICAgICAgICAgIHRpdGxlOiBsYWJlbFxuICAgICAgICAgIH0pLCBjb252ZXJ0SXRlbXNUb05vZGVzKGNoaWxkcmVuKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdWIgTWVudVxuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU3ViTWVudSwgX2V4dGVuZHMoe1xuICAgICAgICAgIGtleTogbWVyZ2VkS2V5XG4gICAgICAgIH0sIHJlc3RQcm9wcywge1xuICAgICAgICAgIHRpdGxlOiBsYWJlbFxuICAgICAgICB9KSwgY29udmVydEl0ZW1zVG9Ob2RlcyhjaGlsZHJlbikpO1xuICAgICAgfVxuXG4gICAgICAvLyBNZW51SXRlbSAmIERpdmlkZXJcbiAgICAgIGlmICh0eXBlID09PSAnZGl2aWRlcicpIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERpdmlkZXIsIF9leHRlbmRzKHtcbiAgICAgICAgICBrZXk6IG1lcmdlZEtleVxuICAgICAgICB9LCByZXN0UHJvcHMpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNZW51SXRlbSwgX2V4dGVuZHMoe1xuICAgICAgICBrZXk6IG1lcmdlZEtleVxuICAgICAgfSwgcmVzdFByb3BzKSwgbGFiZWwpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfSkuZmlsdGVyKGZ1bmN0aW9uIChvcHQpIHtcbiAgICByZXR1cm4gb3B0O1xuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUl0ZW1zKGNoaWxkcmVuLCBpdGVtcywga2V5UGF0aCkge1xuICB2YXIgY2hpbGROb2RlcyA9IGNoaWxkcmVuO1xuICBpZiAoaXRlbXMpIHtcbiAgICBjaGlsZE5vZGVzID0gY29udmVydEl0ZW1zVG9Ob2RlcyhpdGVtcyk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlQ2hpbGRyZW4oY2hpbGROb2Rlcywga2V5UGF0aCk7XG59IiwidmFyIGF1dG9BZGp1c3RPdmVyZmxvdyA9IHtcbiAgYWRqdXN0WDogMSxcbiAgYWRqdXN0WTogMVxufTtcbmV4cG9ydCB2YXIgcGxhY2VtZW50cyA9IHtcbiAgdG9wTGVmdDoge1xuICAgIHBvaW50czogWydibCcsICd0bCddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgb2Zmc2V0OiBbMCwgLTddXG4gIH0sXG4gIGJvdHRvbUxlZnQ6IHtcbiAgICBwb2ludHM6IFsndGwnLCAnYmwnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIDddXG4gIH0sXG4gIGxlZnRUb3A6IHtcbiAgICBwb2ludHM6IFsndHInLCAndGwnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWy00LCAwXVxuICB9LFxuICByaWdodFRvcDoge1xuICAgIHBvaW50czogWyd0bCcsICd0ciddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgb2Zmc2V0OiBbNCwgMF1cbiAgfVxufTtcbmV4cG9ydCB2YXIgcGxhY2VtZW50c1J0bCA9IHtcbiAgdG9wTGVmdDoge1xuICAgIHBvaW50czogWydibCcsICd0bCddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgb2Zmc2V0OiBbMCwgLTddXG4gIH0sXG4gIGJvdHRvbUxlZnQ6IHtcbiAgICBwb2ludHM6IFsndGwnLCAnYmwnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIDddXG4gIH0sXG4gIHJpZ2h0VG9wOiB7XG4gICAgcG9pbnRzOiBbJ3RyJywgJ3RsJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvdyxcbiAgICBvZmZzZXQ6IFstNCwgMF1cbiAgfSxcbiAgbGVmdFRvcDoge1xuICAgIHBvaW50czogWyd0bCcsICd0ciddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgb2Zmc2V0OiBbNCwgMF1cbiAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IHBsYWNlbWVudHM7IiwiZXhwb3J0IGZ1bmN0aW9uIGdldE1vdGlvbihtb2RlLCBtb3Rpb24sIGRlZmF1bHRNb3Rpb25zKSB7XG4gIGlmIChtb3Rpb24pIHtcbiAgICByZXR1cm4gbW90aW9uO1xuICB9XG4gIGlmIChkZWZhdWx0TW90aW9ucykge1xuICAgIHJldHVybiBkZWZhdWx0TW90aW9uc1ttb2RlXSB8fCBkZWZhdWx0TW90aW9ucy5vdGhlcjtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufSIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgVHJpZ2dlciBmcm9tICdyYy10cmlnZ2VyJztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHJhZiBmcm9tIFwicmMtdXRpbC9lcy9yYWZcIjtcbmltcG9ydCB7IE1lbnVDb250ZXh0IH0gZnJvbSBcIi4uL2NvbnRleHQvTWVudUNvbnRleHRcIjtcbmltcG9ydCB7IHBsYWNlbWVudHMsIHBsYWNlbWVudHNSdGwgfSBmcm9tIFwiLi4vcGxhY2VtZW50c1wiO1xuaW1wb3J0IHsgZ2V0TW90aW9uIH0gZnJvbSBcIi4uL3V0aWxzL21vdGlvblV0aWxcIjtcbnZhciBwb3B1cFBsYWNlbWVudE1hcCA9IHtcbiAgaG9yaXpvbnRhbDogJ2JvdHRvbUxlZnQnLFxuICB2ZXJ0aWNhbDogJ3JpZ2h0VG9wJyxcbiAgJ3ZlcnRpY2FsLWxlZnQnOiAncmlnaHRUb3AnLFxuICAndmVydGljYWwtcmlnaHQnOiAnbGVmdFRvcCdcbn07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBQb3B1cFRyaWdnZXIoX3JlZikge1xuICB2YXIgcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHMsXG4gICAgdmlzaWJsZSA9IF9yZWYudmlzaWJsZSxcbiAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgcG9wdXAgPSBfcmVmLnBvcHVwLFxuICAgIHBvcHVwQ2xhc3NOYW1lID0gX3JlZi5wb3B1cENsYXNzTmFtZSxcbiAgICBwb3B1cE9mZnNldCA9IF9yZWYucG9wdXBPZmZzZXQsXG4gICAgZGlzYWJsZWQgPSBfcmVmLmRpc2FibGVkLFxuICAgIG1vZGUgPSBfcmVmLm1vZGUsXG4gICAgb25WaXNpYmxlQ2hhbmdlID0gX3JlZi5vblZpc2libGVDaGFuZ2U7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoTWVudUNvbnRleHQpLFxuICAgIGdldFBvcHVwQ29udGFpbmVyID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UG9wdXBDb250YWluZXIsXG4gICAgcnRsID0gX1JlYWN0JHVzZUNvbnRleHQucnRsLFxuICAgIHN1Yk1lbnVPcGVuRGVsYXkgPSBfUmVhY3QkdXNlQ29udGV4dC5zdWJNZW51T3BlbkRlbGF5LFxuICAgIHN1Yk1lbnVDbG9zZURlbGF5ID0gX1JlYWN0JHVzZUNvbnRleHQuc3ViTWVudUNsb3NlRGVsYXksXG4gICAgYnVpbHRpblBsYWNlbWVudHMgPSBfUmVhY3QkdXNlQ29udGV4dC5idWlsdGluUGxhY2VtZW50cyxcbiAgICB0cmlnZ2VyU3ViTWVudUFjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LnRyaWdnZXJTdWJNZW51QWN0aW9uLFxuICAgIGZvcmNlU3ViTWVudVJlbmRlciA9IF9SZWFjdCR1c2VDb250ZXh0LmZvcmNlU3ViTWVudVJlbmRlcixcbiAgICByb290Q2xhc3NOYW1lID0gX1JlYWN0JHVzZUNvbnRleHQucm9vdENsYXNzTmFtZSxcbiAgICBtb3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5tb3Rpb24sXG4gICAgZGVmYXVsdE1vdGlvbnMgPSBfUmVhY3QkdXNlQ29udGV4dC5kZWZhdWx0TW90aW9ucztcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBpbm5lclZpc2libGUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldElubmVyVmlzaWJsZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBwbGFjZW1lbnQgPSBydGwgPyBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHBsYWNlbWVudHNSdGwpLCBidWlsdGluUGxhY2VtZW50cykgOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHBsYWNlbWVudHMpLCBidWlsdGluUGxhY2VtZW50cyk7XG4gIHZhciBwb3B1cFBsYWNlbWVudCA9IHBvcHVwUGxhY2VtZW50TWFwW21vZGVdO1xuICB2YXIgdGFyZ2V0TW90aW9uID0gZ2V0TW90aW9uKG1vZGUsIG1vdGlvbiwgZGVmYXVsdE1vdGlvbnMpO1xuICB2YXIgdGFyZ2V0TW90aW9uUmVmID0gUmVhY3QudXNlUmVmKHRhcmdldE1vdGlvbik7XG4gIGlmIChtb2RlICE9PSAnaW5saW5lJykge1xuICAgIC8qKlxuICAgICAqIFBvcHVwVHJpZ2dlciBpcyBvbmx5IHVzZWQgZm9yIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIHR5cGVzLlxuICAgICAqIFdoZW4gY29sbGFwc2VkIGlzIHVuZm9sZGVkLCB0aGUgaW5saW5lIGFuaW1hdGlvbiB3aWxsIGRlc3Ryb3kgdGhlIHZlcnRpY2FsIGFuaW1hdGlvbi5cbiAgICAgKi9cbiAgICB0YXJnZXRNb3Rpb25SZWYuY3VycmVudCA9IHRhcmdldE1vdGlvbjtcbiAgfVxuICB2YXIgbWVyZ2VkTW90aW9uID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB0YXJnZXRNb3Rpb25SZWYuY3VycmVudCksIHt9LCB7XG4gICAgbGVhdmVkQ2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhpZGRlblwiKSxcbiAgICByZW1vdmVPbkxlYXZlOiBmYWxzZSxcbiAgICBtb3Rpb25BcHBlYXI6IHRydWVcbiAgfSk7XG5cbiAgLy8gRGVsYXkgdG8gY2hhbmdlIHZpc2libGVcbiAgdmFyIHZpc2libGVSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2aXNpYmxlUmVmLmN1cnJlbnQgPSByYWYoZnVuY3Rpb24gKCkge1xuICAgICAgc2V0SW5uZXJWaXNpYmxlKHZpc2libGUpO1xuICAgIH0pO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByYWYuY2FuY2VsKHZpc2libGVSZWYuY3VycmVudCk7XG4gICAgfTtcbiAgfSwgW3Zpc2libGVdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRyaWdnZXIsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBwb3B1cENsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBvcHVwXCIpLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBydGwpLCBwb3B1cENsYXNzTmFtZSwgcm9vdENsYXNzTmFtZSksXG4gICAgc3RyZXRjaDogbW9kZSA9PT0gJ2hvcml6b250YWwnID8gJ21pbldpZHRoJyA6IG51bGwsXG4gICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFBvcHVwQ29udGFpbmVyLFxuICAgIGJ1aWx0aW5QbGFjZW1lbnRzOiBwbGFjZW1lbnQsXG4gICAgcG9wdXBQbGFjZW1lbnQ6IHBvcHVwUGxhY2VtZW50LFxuICAgIHBvcHVwVmlzaWJsZTogaW5uZXJWaXNpYmxlLFxuICAgIHBvcHVwOiBwb3B1cCxcbiAgICBwb3B1cEFsaWduOiBwb3B1cE9mZnNldCAmJiB7XG4gICAgICBvZmZzZXQ6IHBvcHVwT2Zmc2V0XG4gICAgfSxcbiAgICBhY3Rpb246IGRpc2FibGVkID8gW10gOiBbdHJpZ2dlclN1Yk1lbnVBY3Rpb25dLFxuICAgIG1vdXNlRW50ZXJEZWxheTogc3ViTWVudU9wZW5EZWxheSxcbiAgICBtb3VzZUxlYXZlRGVsYXk6IHN1Yk1lbnVDbG9zZURlbGF5LFxuICAgIG9uUG9wdXBWaXNpYmxlQ2hhbmdlOiBvblZpc2libGVDaGFuZ2UsXG4gICAgZm9yY2VSZW5kZXI6IGZvcmNlU3ViTWVudVJlbmRlcixcbiAgICBwb3B1cE1vdGlvbjogbWVyZ2VkTW90aW9uXG4gIH0sIGNoaWxkcmVuKTtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBDU1NNb3Rpb24gZnJvbSAncmMtbW90aW9uJztcbmltcG9ydCB7IGdldE1vdGlvbiB9IGZyb20gXCIuLi91dGlscy9tb3Rpb25VdGlsXCI7XG5pbXBvcnQgTWVudUNvbnRleHRQcm92aWRlciwgeyBNZW51Q29udGV4dCB9IGZyb20gXCIuLi9jb250ZXh0L01lbnVDb250ZXh0XCI7XG5pbXBvcnQgU3ViTWVudUxpc3QgZnJvbSBcIi4vU3ViTWVudUxpc3RcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIElubGluZVN1Yk1lbnVMaXN0KF9yZWYpIHtcbiAgdmFyIGlkID0gX3JlZi5pZCxcbiAgICBvcGVuID0gX3JlZi5vcGVuLFxuICAgIGtleVBhdGggPSBfcmVmLmtleVBhdGgsXG4gICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuO1xuICB2YXIgZml4ZWRNb2RlID0gJ2lubGluZSc7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoTWVudUNvbnRleHQpLFxuICAgIHByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LnByZWZpeENscyxcbiAgICBmb3JjZVN1Yk1lbnVSZW5kZXIgPSBfUmVhY3QkdXNlQ29udGV4dC5mb3JjZVN1Yk1lbnVSZW5kZXIsXG4gICAgbW90aW9uID0gX1JlYWN0JHVzZUNvbnRleHQubW90aW9uLFxuICAgIGRlZmF1bHRNb3Rpb25zID0gX1JlYWN0JHVzZUNvbnRleHQuZGVmYXVsdE1vdGlvbnMsXG4gICAgbW9kZSA9IF9SZWFjdCR1c2VDb250ZXh0Lm1vZGU7XG5cbiAgLy8gQWx3YXlzIHVzZSBsYXRlc3QgbW9kZSBjaGVja1xuICB2YXIgc2FtZU1vZGVSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBzYW1lTW9kZVJlZi5jdXJyZW50ID0gbW9kZSA9PT0gZml4ZWRNb2RlO1xuXG4gIC8vIFdlIHJlY29yZCBgZGVzdHJveWAgbWFyayBoZXJlIHNpbmNlIHdoZW4gbW9kZSBjaGFuZ2UgZnJvbSBgaW5saW5lYCB0byBvdGhlcnMuXG4gIC8vIFRoZSBpbmxpbmUgbGlzdCBzaG91bGQgcmVtb3ZlIHdoZW4gbW90aW9uIGVuZC5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKCFzYW1lTW9kZVJlZi5jdXJyZW50KSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBkZXN0cm95ID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXREZXN0cm95ID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIG1lcmdlZE9wZW4gPSBzYW1lTW9kZVJlZi5jdXJyZW50ID8gb3BlbiA6IGZhbHNlO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFZmZlY3QgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJlc2V0IGRlc3Ryb3kgc3RhdGUgd2hlbiBtb2RlIGNoYW5nZSBiYWNrXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNhbWVNb2RlUmVmLmN1cnJlbnQpIHtcbiAgICAgIHNldERlc3Ryb3koZmFsc2UpO1xuICAgIH1cbiAgfSwgW21vZGVdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbWVyZ2VkTW90aW9uID0gX29iamVjdFNwcmVhZCh7fSwgZ2V0TW90aW9uKGZpeGVkTW9kZSwgbW90aW9uLCBkZWZhdWx0TW90aW9ucykpO1xuXG4gIC8vIE5vIG5lZWQgYXBwZWFyIHNpbmNlIG5lc3QgaW5saW5lQ29sbGFwc2UgY2hhbmdlZFxuICBpZiAoa2V5UGF0aC5sZW5ndGggPiAxKSB7XG4gICAgbWVyZ2VkTW90aW9uLm1vdGlvbkFwcGVhciA9IGZhbHNlO1xuICB9XG5cbiAgLy8gSGlkZSBpbmxpbmUgbGlzdCB3aGVuIG1vZGUgY2hhbmdlZCBhbmQgbW90aW9uIGVuZFxuICB2YXIgb3JpZ2luT25WaXNpYmxlQ2hhbmdlZCA9IG1lcmdlZE1vdGlvbi5vblZpc2libGVDaGFuZ2VkO1xuICBtZXJnZWRNb3Rpb24ub25WaXNpYmxlQ2hhbmdlZCA9IGZ1bmN0aW9uIChuZXdWaXNpYmxlKSB7XG4gICAgaWYgKCFzYW1lTW9kZVJlZi5jdXJyZW50ICYmICFuZXdWaXNpYmxlKSB7XG4gICAgICBzZXREZXN0cm95KHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gb3JpZ2luT25WaXNpYmxlQ2hhbmdlZCA9PT0gbnVsbCB8fCBvcmlnaW5PblZpc2libGVDaGFuZ2VkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnaW5PblZpc2libGVDaGFuZ2VkKG5ld1Zpc2libGUpO1xuICB9O1xuICBpZiAoZGVzdHJveSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNZW51Q29udGV4dFByb3ZpZGVyLCB7XG4gICAgbW9kZTogZml4ZWRNb2RlLFxuICAgIGxvY2tlZDogIXNhbWVNb2RlUmVmLmN1cnJlbnRcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ1NTTW90aW9uLCBfZXh0ZW5kcyh7XG4gICAgdmlzaWJsZTogbWVyZ2VkT3BlblxuICB9LCBtZXJnZWRNb3Rpb24sIHtcbiAgICBmb3JjZVJlbmRlcjogZm9yY2VTdWJNZW51UmVuZGVyLFxuICAgIHJlbW92ZU9uTGVhdmU6IGZhbHNlLFxuICAgIGxlYXZlZENsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oaWRkZW5cIilcbiAgfSksIGZ1bmN0aW9uIChfcmVmMikge1xuICAgIHZhciBtb3Rpb25DbGFzc05hbWUgPSBfcmVmMi5jbGFzc05hbWUsXG4gICAgICBtb3Rpb25TdHlsZSA9IF9yZWYyLnN0eWxlO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTdWJNZW51TGlzdCwge1xuICAgICAgaWQ6IGlkLFxuICAgICAgY2xhc3NOYW1lOiBtb3Rpb25DbGFzc05hbWUsXG4gICAgICBzdHlsZTogbW90aW9uU3R5bGVcbiAgICB9LCBjaGlsZHJlbik7XG4gIH0pKTtcbn0iLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcInN0eWxlXCIsIFwiY2xhc3NOYW1lXCIsIFwidGl0bGVcIiwgXCJldmVudEtleVwiLCBcIndhcm5LZXlcIiwgXCJkaXNhYmxlZFwiLCBcImludGVybmFsUG9wdXBDbG9zZVwiLCBcImNoaWxkcmVuXCIsIFwiaXRlbUljb25cIiwgXCJleHBhbmRJY29uXCIsIFwicG9wdXBDbGFzc05hbWVcIiwgXCJwb3B1cE9mZnNldFwiLCBcIm9uQ2xpY2tcIiwgXCJvbk1vdXNlRW50ZXJcIiwgXCJvbk1vdXNlTGVhdmVcIiwgXCJvblRpdGxlQ2xpY2tcIiwgXCJvblRpdGxlTW91c2VFbnRlclwiLCBcIm9uVGl0bGVNb3VzZUxlYXZlXCJdLFxuICBfZXhjbHVkZWQyID0gW1wiYWN0aXZlXCJdO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgT3ZlcmZsb3cgZnJvbSAncmMtb3ZlcmZsb3cnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0IFN1Yk1lbnVMaXN0IGZyb20gXCIuL1N1Yk1lbnVMaXN0XCI7XG5pbXBvcnQgeyBwYXJzZUNoaWxkcmVuIH0gZnJvbSBcIi4uL3V0aWxzL25vZGVVdGlsXCI7XG5pbXBvcnQgTWVudUNvbnRleHRQcm92aWRlciwgeyBNZW51Q29udGV4dCB9IGZyb20gXCIuLi9jb250ZXh0L01lbnVDb250ZXh0XCI7XG5pbXBvcnQgdXNlTWVtb0NhbGxiYWNrIGZyb20gXCIuLi9ob29rcy91c2VNZW1vQ2FsbGJhY2tcIjtcbmltcG9ydCBQb3B1cFRyaWdnZXIgZnJvbSBcIi4vUG9wdXBUcmlnZ2VyXCI7XG5pbXBvcnQgSWNvbiBmcm9tIFwiLi4vSWNvblwiO1xuaW1wb3J0IHVzZUFjdGl2ZSBmcm9tIFwiLi4vaG9va3MvdXNlQWN0aXZlXCI7XG5pbXBvcnQgeyB3YXJuSXRlbVByb3AgfSBmcm9tIFwiLi4vdXRpbHMvd2FyblV0aWxcIjtcbmltcG9ydCB1c2VEaXJlY3Rpb25TdHlsZSBmcm9tIFwiLi4vaG9va3MvdXNlRGlyZWN0aW9uU3R5bGVcIjtcbmltcG9ydCBJbmxpbmVTdWJNZW51TGlzdCBmcm9tIFwiLi9JbmxpbmVTdWJNZW51TGlzdFwiO1xuaW1wb3J0IHsgUGF0aFRyYWNrZXJDb250ZXh0LCBQYXRoVXNlckNvbnRleHQsIHVzZUZ1bGxQYXRoLCB1c2VNZWFzdXJlIH0gZnJvbSBcIi4uL2NvbnRleHQvUGF0aENvbnRleHRcIjtcbmltcG9ydCB7IHVzZU1lbnVJZCB9IGZyb20gXCIuLi9jb250ZXh0L0lkQ29udGV4dFwiO1xuaW1wb3J0IFByaXZhdGVDb250ZXh0IGZyb20gXCIuLi9jb250ZXh0L1ByaXZhdGVDb250ZXh0XCI7XG52YXIgSW50ZXJuYWxTdWJNZW51ID0gZnVuY3Rpb24gSW50ZXJuYWxTdWJNZW51KHByb3BzKSB7XG4gIHZhciBfY2xhc3NOYW1lcztcbiAgdmFyIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIHRpdGxlID0gcHJvcHMudGl0bGUsXG4gICAgZXZlbnRLZXkgPSBwcm9wcy5ldmVudEtleSxcbiAgICB3YXJuS2V5ID0gcHJvcHMud2FybktleSxcbiAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgIGludGVybmFsUG9wdXBDbG9zZSA9IHByb3BzLmludGVybmFsUG9wdXBDbG9zZSxcbiAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIGl0ZW1JY29uID0gcHJvcHMuaXRlbUljb24sXG4gICAgZXhwYW5kSWNvbiA9IHByb3BzLmV4cGFuZEljb24sXG4gICAgcG9wdXBDbGFzc05hbWUgPSBwcm9wcy5wb3B1cENsYXNzTmFtZSxcbiAgICBwb3B1cE9mZnNldCA9IHByb3BzLnBvcHVwT2Zmc2V0LFxuICAgIG9uQ2xpY2sgPSBwcm9wcy5vbkNsaWNrLFxuICAgIG9uTW91c2VFbnRlciA9IHByb3BzLm9uTW91c2VFbnRlcixcbiAgICBvbk1vdXNlTGVhdmUgPSBwcm9wcy5vbk1vdXNlTGVhdmUsXG4gICAgb25UaXRsZUNsaWNrID0gcHJvcHMub25UaXRsZUNsaWNrLFxuICAgIG9uVGl0bGVNb3VzZUVudGVyID0gcHJvcHMub25UaXRsZU1vdXNlRW50ZXIsXG4gICAgb25UaXRsZU1vdXNlTGVhdmUgPSBwcm9wcy5vblRpdGxlTW91c2VMZWF2ZSxcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG4gIHZhciBkb21EYXRhSWQgPSB1c2VNZW51SWQoZXZlbnRLZXkpO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KE1lbnVDb250ZXh0KSxcbiAgICBwcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5wcmVmaXhDbHMsXG4gICAgbW9kZSA9IF9SZWFjdCR1c2VDb250ZXh0Lm1vZGUsXG4gICAgb3BlbktleXMgPSBfUmVhY3QkdXNlQ29udGV4dC5vcGVuS2V5cyxcbiAgICBjb250ZXh0RGlzYWJsZWQgPSBfUmVhY3QkdXNlQ29udGV4dC5kaXNhYmxlZCxcbiAgICBvdmVyZmxvd0Rpc2FibGVkID0gX1JlYWN0JHVzZUNvbnRleHQub3ZlcmZsb3dEaXNhYmxlZCxcbiAgICBhY3RpdmVLZXkgPSBfUmVhY3QkdXNlQ29udGV4dC5hY3RpdmVLZXksXG4gICAgc2VsZWN0ZWRLZXlzID0gX1JlYWN0JHVzZUNvbnRleHQuc2VsZWN0ZWRLZXlzLFxuICAgIGNvbnRleHRJdGVtSWNvbiA9IF9SZWFjdCR1c2VDb250ZXh0Lml0ZW1JY29uLFxuICAgIGNvbnRleHRFeHBhbmRJY29uID0gX1JlYWN0JHVzZUNvbnRleHQuZXhwYW5kSWNvbixcbiAgICBvbkl0ZW1DbGljayA9IF9SZWFjdCR1c2VDb250ZXh0Lm9uSXRlbUNsaWNrLFxuICAgIG9uT3BlbkNoYW5nZSA9IF9SZWFjdCR1c2VDb250ZXh0Lm9uT3BlbkNoYW5nZSxcbiAgICBvbkFjdGl2ZSA9IF9SZWFjdCR1c2VDb250ZXh0Lm9uQWN0aXZlO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQyID0gUmVhY3QudXNlQ29udGV4dChQcml2YXRlQ29udGV4dCksXG4gICAgX2ludGVybmFsUmVuZGVyU3ViTWVudUl0ZW0gPSBfUmVhY3QkdXNlQ29udGV4dDIuX2ludGVybmFsUmVuZGVyU3ViTWVudUl0ZW07XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dDMgPSBSZWFjdC51c2VDb250ZXh0KFBhdGhVc2VyQ29udGV4dCksXG4gICAgaXNTdWJQYXRoS2V5ID0gX1JlYWN0JHVzZUNvbnRleHQzLmlzU3ViUGF0aEtleTtcbiAgdmFyIGNvbm5lY3RlZFBhdGggPSB1c2VGdWxsUGF0aCgpO1xuICB2YXIgc3ViTWVudVByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3VibWVudVwiKTtcbiAgdmFyIG1lcmdlZERpc2FibGVkID0gY29udGV4dERpc2FibGVkIHx8IGRpc2FibGVkO1xuICB2YXIgZWxlbWVudFJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICB2YXIgcG9wdXBSZWYgPSBSZWFjdC51c2VSZWYoKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBXYXJuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm5LZXkpIHtcbiAgICB3YXJuaW5nKGZhbHNlLCAnU3ViTWVudSBzaG91bGQgbm90IGxlYXZlIHVuZGVmaW5lZCBga2V5YC4nKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEljb24gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG1lcmdlZEl0ZW1JY29uID0gaXRlbUljb24gfHwgY29udGV4dEl0ZW1JY29uO1xuICB2YXIgbWVyZ2VkRXhwYW5kSWNvbiA9IGV4cGFuZEljb24gfHwgY29udGV4dEV4cGFuZEljb247XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gT3BlbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb3JpZ2luT3BlbiA9IG9wZW5LZXlzLmluY2x1ZGVzKGV2ZW50S2V5KTtcbiAgdmFyIG9wZW4gPSAhb3ZlcmZsb3dEaXNhYmxlZCAmJiBvcmlnaW5PcGVuO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2VsZWN0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGNoaWxkcmVuU2VsZWN0ZWQgPSBpc1N1YlBhdGhLZXkoc2VsZWN0ZWRLZXlzLCBldmVudEtleSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBBY3RpdmUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZUFjdGl2ZSA9IHVzZUFjdGl2ZShldmVudEtleSwgbWVyZ2VkRGlzYWJsZWQsIG9uVGl0bGVNb3VzZUVudGVyLCBvblRpdGxlTW91c2VMZWF2ZSksXG4gICAgYWN0aXZlID0gX3VzZUFjdGl2ZS5hY3RpdmUsXG4gICAgYWN0aXZlUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3VzZUFjdGl2ZSwgX2V4Y2x1ZGVkMik7XG5cbiAgLy8gRmFsbGJhY2sgb2YgYWN0aXZlIGNoZWNrIHRvIGF2b2lkIGhvdmVyIG9uIG1lbnUgdGl0bGUgb3IgZGlzYWJsZWQgaXRlbVxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIGNoaWxkcmVuQWN0aXZlID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRDaGlsZHJlbkFjdGl2ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciB0cmlnZ2VyQ2hpbGRyZW5BY3RpdmUgPSBmdW5jdGlvbiB0cmlnZ2VyQ2hpbGRyZW5BY3RpdmUobmV3QWN0aXZlKSB7XG4gICAgaWYgKCFtZXJnZWREaXNhYmxlZCkge1xuICAgICAgc2V0Q2hpbGRyZW5BY3RpdmUobmV3QWN0aXZlKTtcbiAgICB9XG4gIH07XG4gIHZhciBvbkludGVybmFsTW91c2VFbnRlciA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxNb3VzZUVudGVyKGRvbUV2ZW50KSB7XG4gICAgdHJpZ2dlckNoaWxkcmVuQWN0aXZlKHRydWUpO1xuICAgIG9uTW91c2VFbnRlciA9PT0gbnVsbCB8fCBvbk1vdXNlRW50ZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uTW91c2VFbnRlcih7XG4gICAgICBrZXk6IGV2ZW50S2V5LFxuICAgICAgZG9tRXZlbnQ6IGRvbUV2ZW50XG4gICAgfSk7XG4gIH07XG4gIHZhciBvbkludGVybmFsTW91c2VMZWF2ZSA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxNb3VzZUxlYXZlKGRvbUV2ZW50KSB7XG4gICAgdHJpZ2dlckNoaWxkcmVuQWN0aXZlKGZhbHNlKTtcbiAgICBvbk1vdXNlTGVhdmUgPT09IG51bGwgfHwgb25Nb3VzZUxlYXZlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbk1vdXNlTGVhdmUoe1xuICAgICAga2V5OiBldmVudEtleSxcbiAgICAgIGRvbUV2ZW50OiBkb21FdmVudFxuICAgIH0pO1xuICB9O1xuICB2YXIgbWVyZ2VkQWN0aXZlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGFjdGl2ZSkge1xuICAgICAgcmV0dXJuIGFjdGl2ZTtcbiAgICB9XG4gICAgaWYgKG1vZGUgIT09ICdpbmxpbmUnKSB7XG4gICAgICByZXR1cm4gY2hpbGRyZW5BY3RpdmUgfHwgaXNTdWJQYXRoS2V5KFthY3RpdmVLZXldLCBldmVudEtleSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSwgW21vZGUsIGFjdGl2ZSwgYWN0aXZlS2V5LCBjaGlsZHJlbkFjdGl2ZSwgZXZlbnRLZXksIGlzU3ViUGF0aEtleV0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IERpcmVjdGlvblN0eWxlID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBkaXJlY3Rpb25TdHlsZSA9IHVzZURpcmVjdGlvblN0eWxlKGNvbm5lY3RlZFBhdGgubGVuZ3RoKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEV2ZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID4+Pj4gVGl0bGUgY2xpY2tcbiAgdmFyIG9uSW50ZXJuYWxUaXRsZUNsaWNrID0gZnVuY3Rpb24gb25JbnRlcm5hbFRpdGxlQ2xpY2soZSkge1xuICAgIC8vIFNraXAgaWYgZGlzYWJsZWRcbiAgICBpZiAobWVyZ2VkRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgb25UaXRsZUNsaWNrID09PSBudWxsIHx8IG9uVGl0bGVDbGljayA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25UaXRsZUNsaWNrKHtcbiAgICAgIGtleTogZXZlbnRLZXksXG4gICAgICBkb21FdmVudDogZVxuICAgIH0pO1xuXG4gICAgLy8gVHJpZ2dlciBvcGVuIGJ5IGNsaWNrIHdoZW4gbW9kZSBpcyBgaW5saW5lYFxuICAgIGlmIChtb2RlID09PSAnaW5saW5lJykge1xuICAgICAgb25PcGVuQ2hhbmdlKGV2ZW50S2V5LCAhb3JpZ2luT3Blbik7XG4gICAgfVxuICB9O1xuXG4gIC8vID4+Pj4gQ29udGV4dCBmb3IgY2hpbGRyZW4gY2xpY2tcbiAgdmFyIG9uTWVyZ2VkSXRlbUNsaWNrID0gdXNlTWVtb0NhbGxiYWNrKGZ1bmN0aW9uIChpbmZvKSB7XG4gICAgb25DbGljayA9PT0gbnVsbCB8fCBvbkNsaWNrID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNsaWNrKHdhcm5JdGVtUHJvcChpbmZvKSk7XG4gICAgb25JdGVtQ2xpY2soaW5mbyk7XG4gIH0pO1xuXG4gIC8vID4+Pj4+IFZpc2libGUgY2hhbmdlXG4gIHZhciBvblBvcHVwVmlzaWJsZUNoYW5nZSA9IGZ1bmN0aW9uIG9uUG9wdXBWaXNpYmxlQ2hhbmdlKG5ld1Zpc2libGUpIHtcbiAgICBpZiAobW9kZSAhPT0gJ2lubGluZScpIHtcbiAgICAgIG9uT3BlbkNoYW5nZShldmVudEtleSwgbmV3VmlzaWJsZSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBVc2VkIGZvciBhY2Nlc3NpYmlsaXR5LiBIZWxwZXIgd2lsbCBmb2N1cyBlbGVtZW50IHdpdGhvdXQga2V5IGJvYXJkLlxuICAgKiBXZSBzaG91bGQgbWFudWFsbHkgdHJpZ2dlciBhbiBhY3RpdmVcbiAgICovXG4gIHZhciBvbkludGVybmFsRm9jdXMgPSBmdW5jdGlvbiBvbkludGVybmFsRm9jdXMoKSB7XG4gICAgb25BY3RpdmUoZXZlbnRLZXkpO1xuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHBvcHVwSWQgPSBkb21EYXRhSWQgJiYgXCJcIi5jb25jYXQoZG9tRGF0YUlkLCBcIi1wb3B1cFwiKTtcblxuICAvLyA+Pj4+PiBUaXRsZVxuICB2YXIgdGl0bGVOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIHJvbGU6IFwibWVudWl0ZW1cIixcbiAgICBzdHlsZTogZGlyZWN0aW9uU3R5bGUsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChzdWJNZW51UHJlZml4Q2xzLCBcIi10aXRsZVwiKSxcbiAgICB0YWJJbmRleDogbWVyZ2VkRGlzYWJsZWQgPyBudWxsIDogLTEsXG4gICAgcmVmOiBlbGVtZW50UmVmLFxuICAgIHRpdGxlOiB0eXBlb2YgdGl0bGUgPT09ICdzdHJpbmcnID8gdGl0bGUgOiBudWxsLFxuICAgIFwiZGF0YS1tZW51LWlkXCI6IG92ZXJmbG93RGlzYWJsZWQgJiYgZG9tRGF0YUlkID8gbnVsbCA6IGRvbURhdGFJZCxcbiAgICBcImFyaWEtZXhwYW5kZWRcIjogb3BlbixcbiAgICBcImFyaWEtaGFzcG9wdXBcIjogdHJ1ZSxcbiAgICBcImFyaWEtY29udHJvbHNcIjogcG9wdXBJZCxcbiAgICBcImFyaWEtZGlzYWJsZWRcIjogbWVyZ2VkRGlzYWJsZWQsXG4gICAgb25DbGljazogb25JbnRlcm5hbFRpdGxlQ2xpY2ssXG4gICAgb25Gb2N1czogb25JbnRlcm5hbEZvY3VzXG4gIH0sIGFjdGl2ZVByb3BzKSwgdGl0bGUsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEljb24sIHtcbiAgICBpY29uOiBtb2RlICE9PSAnaG9yaXpvbnRhbCcgPyBtZXJnZWRFeHBhbmRJY29uIDogbnVsbCxcbiAgICBwcm9wczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgICBpc09wZW46IG9wZW4sXG4gICAgICAvLyBbTGVnYWN5XSBOb3Qgc3VyZSB3aHkgbmVlZCB0aGlzIG1hcmtcbiAgICAgIGlzU3ViTWVudTogdHJ1ZVxuICAgIH0pXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiaVwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChzdWJNZW51UHJlZml4Q2xzLCBcIi1hcnJvd1wiKVxuICB9KSkpO1xuXG4gIC8vIENhY2hlIG1vZGUgaWYgaXQgY2hhbmdlIHRvIGBpbmxpbmVgIHdoaWNoIGRvIG5vdCBoYXZlIHBvcHVwIG1vdGlvblxuICB2YXIgdHJpZ2dlck1vZGVSZWYgPSBSZWFjdC51c2VSZWYobW9kZSk7XG4gIGlmIChtb2RlICE9PSAnaW5saW5lJyAmJiBjb25uZWN0ZWRQYXRoLmxlbmd0aCA+IDEpIHtcbiAgICB0cmlnZ2VyTW9kZVJlZi5jdXJyZW50ID0gJ3ZlcnRpY2FsJztcbiAgfSBlbHNlIHtcbiAgICB0cmlnZ2VyTW9kZVJlZi5jdXJyZW50ID0gbW9kZTtcbiAgfVxuICBpZiAoIW92ZXJmbG93RGlzYWJsZWQpIHtcbiAgICB2YXIgdHJpZ2dlck1vZGUgPSB0cmlnZ2VyTW9kZVJlZi5jdXJyZW50O1xuXG4gICAgLy8gU3RpbGwgd3JhcCB3aXRoIFRyaWdnZXIgaGVyZSBzaW5jZSB3ZSBuZWVkIGF2b2lkIHJlYWN0IHJlLW1vdW50IGRvbSBub2RlXG4gICAgLy8gV2hpY2ggbWFrZXMgbW90aW9uIGZhaWxlZFxuICAgIHRpdGxlTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBvcHVwVHJpZ2dlciwge1xuICAgICAgbW9kZTogdHJpZ2dlck1vZGUsXG4gICAgICBwcmVmaXhDbHM6IHN1Yk1lbnVQcmVmaXhDbHMsXG4gICAgICB2aXNpYmxlOiAhaW50ZXJuYWxQb3B1cENsb3NlICYmIG9wZW4gJiYgbW9kZSAhPT0gJ2lubGluZScsXG4gICAgICBwb3B1cENsYXNzTmFtZTogcG9wdXBDbGFzc05hbWUsXG4gICAgICBwb3B1cE9mZnNldDogcG9wdXBPZmZzZXQsXG4gICAgICBwb3B1cDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTWVudUNvbnRleHRQcm92aWRlclxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGUgb2YgaG9yaXpvbnRhbCBtb2RlXG4gICAgICAsIHtcbiAgICAgICAgbW9kZTogdHJpZ2dlck1vZGUgPT09ICdob3Jpem9udGFsJyA/ICd2ZXJ0aWNhbCcgOiB0cmlnZ2VyTW9kZVxuICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU3ViTWVudUxpc3QsIHtcbiAgICAgICAgaWQ6IHBvcHVwSWQsXG4gICAgICAgIHJlZjogcG9wdXBSZWZcbiAgICAgIH0sIGNoaWxkcmVuKSksXG4gICAgICBkaXNhYmxlZDogbWVyZ2VkRGlzYWJsZWQsXG4gICAgICBvblZpc2libGVDaGFuZ2U6IG9uUG9wdXBWaXNpYmxlQ2hhbmdlXG4gICAgfSwgdGl0bGVOb2RlKTtcbiAgfVxuXG4gIC8vID4+Pj4+IExpc3Qgbm9kZVxuICB2YXIgbGlzdE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChPdmVyZmxvdy5JdGVtLCBfZXh0ZW5kcyh7XG4gICAgcm9sZTogXCJub25lXCJcbiAgfSwgcmVzdFByb3BzLCB7XG4gICAgY29tcG9uZW50OiBcImxpXCIsXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhzdWJNZW51UHJlZml4Q2xzLCBcIlwiLmNvbmNhdChzdWJNZW51UHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KG1vZGUpLCBjbGFzc05hbWUsIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHN1Yk1lbnVQcmVmaXhDbHMsIFwiLW9wZW5cIiksIG9wZW4pLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHN1Yk1lbnVQcmVmaXhDbHMsIFwiLWFjdGl2ZVwiKSwgbWVyZ2VkQWN0aXZlKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChzdWJNZW51UHJlZml4Q2xzLCBcIi1zZWxlY3RlZFwiKSwgY2hpbGRyZW5TZWxlY3RlZCksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQoc3ViTWVudVByZWZpeENscywgXCItZGlzYWJsZWRcIiksIG1lcmdlZERpc2FibGVkKSwgX2NsYXNzTmFtZXMpKSxcbiAgICBvbk1vdXNlRW50ZXI6IG9uSW50ZXJuYWxNb3VzZUVudGVyLFxuICAgIG9uTW91c2VMZWF2ZTogb25JbnRlcm5hbE1vdXNlTGVhdmVcbiAgfSksIHRpdGxlTm9kZSwgIW92ZXJmbG93RGlzYWJsZWQgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSW5saW5lU3ViTWVudUxpc3QsIHtcbiAgICBpZDogcG9wdXBJZCxcbiAgICBvcGVuOiBvcGVuLFxuICAgIGtleVBhdGg6IGNvbm5lY3RlZFBhdGhcbiAgfSwgY2hpbGRyZW4pKTtcbiAgaWYgKF9pbnRlcm5hbFJlbmRlclN1Yk1lbnVJdGVtKSB7XG4gICAgbGlzdE5vZGUgPSBfaW50ZXJuYWxSZW5kZXJTdWJNZW51SXRlbShsaXN0Tm9kZSwgcHJvcHMsIHtcbiAgICAgIHNlbGVjdGVkOiBjaGlsZHJlblNlbGVjdGVkLFxuICAgICAgYWN0aXZlOiBtZXJnZWRBY3RpdmUsXG4gICAgICBvcGVuOiBvcGVuLFxuICAgICAgZGlzYWJsZWQ6IG1lcmdlZERpc2FibGVkXG4gICAgfSk7XG4gIH1cblxuICAvLyA+Pj4+PiBSZW5kZXJcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE1lbnVDb250ZXh0UHJvdmlkZXIsIHtcbiAgICBvbkl0ZW1DbGljazogb25NZXJnZWRJdGVtQ2xpY2ssXG4gICAgbW9kZTogbW9kZSA9PT0gJ2hvcml6b250YWwnID8gJ3ZlcnRpY2FsJyA6IG1vZGUsXG4gICAgaXRlbUljb246IG1lcmdlZEl0ZW1JY29uLFxuICAgIGV4cGFuZEljb246IG1lcmdlZEV4cGFuZEljb25cbiAgfSwgbGlzdE5vZGUpO1xufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFN1Yk1lbnUocHJvcHMpIHtcbiAgdmFyIGV2ZW50S2V5ID0gcHJvcHMuZXZlbnRLZXksXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbjtcbiAgdmFyIGNvbm5lY3RlZEtleVBhdGggPSB1c2VGdWxsUGF0aChldmVudEtleSk7XG4gIHZhciBjaGlsZExpc3QgPSBwYXJzZUNoaWxkcmVuKGNoaWxkcmVuLCBjb25uZWN0ZWRLZXlQYXRoKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBSZWNvcmQgS2V5UGF0aCA9PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbWVhc3VyZSA9IHVzZU1lYXN1cmUoKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAobWVhc3VyZSkge1xuICAgICAgbWVhc3VyZS5yZWdpc3RlclBhdGgoZXZlbnRLZXksIGNvbm5lY3RlZEtleVBhdGgpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbWVhc3VyZS51bnJlZ2lzdGVyUGF0aChldmVudEtleSwgY29ubmVjdGVkS2V5UGF0aCk7XG4gICAgICB9O1xuICAgIH1cbiAgfSwgW2Nvbm5lY3RlZEtleVBhdGhdKTtcbiAgdmFyIHJlbmRlck5vZGU7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgaWYgKG1lYXN1cmUpIHtcbiAgICByZW5kZXJOb2RlID0gY2hpbGRMaXN0O1xuICB9IGVsc2Uge1xuICAgIHJlbmRlck5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJbnRlcm5hbFN1Yk1lbnUsIHByb3BzLCBjaGlsZExpc3QpO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQYXRoVHJhY2tlckNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogY29ubmVjdGVkS2V5UGF0aFxuICB9LCByZW5kZXJOb2RlKTtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJwcmVmaXhDbHNcIiwgXCJyb290Q2xhc3NOYW1lXCIsIFwic3R5bGVcIiwgXCJjbGFzc05hbWVcIiwgXCJ0YWJJbmRleFwiLCBcIml0ZW1zXCIsIFwiY2hpbGRyZW5cIiwgXCJkaXJlY3Rpb25cIiwgXCJpZFwiLCBcIm1vZGVcIiwgXCJpbmxpbmVDb2xsYXBzZWRcIiwgXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkT3ZlcmZsb3dcIiwgXCJzdWJNZW51T3BlbkRlbGF5XCIsIFwic3ViTWVudUNsb3NlRGVsYXlcIiwgXCJmb3JjZVN1Yk1lbnVSZW5kZXJcIiwgXCJkZWZhdWx0T3BlbktleXNcIiwgXCJvcGVuS2V5c1wiLCBcImFjdGl2ZUtleVwiLCBcImRlZmF1bHRBY3RpdmVGaXJzdFwiLCBcInNlbGVjdGFibGVcIiwgXCJtdWx0aXBsZVwiLCBcImRlZmF1bHRTZWxlY3RlZEtleXNcIiwgXCJzZWxlY3RlZEtleXNcIiwgXCJvblNlbGVjdFwiLCBcIm9uRGVzZWxlY3RcIiwgXCJpbmxpbmVJbmRlbnRcIiwgXCJtb3Rpb25cIiwgXCJkZWZhdWx0TW90aW9uc1wiLCBcInRyaWdnZXJTdWJNZW51QWN0aW9uXCIsIFwiYnVpbHRpblBsYWNlbWVudHNcIiwgXCJpdGVtSWNvblwiLCBcImV4cGFuZEljb25cIiwgXCJvdmVyZmxvd2VkSW5kaWNhdG9yXCIsIFwib3ZlcmZsb3dlZEluZGljYXRvclBvcHVwQ2xhc3NOYW1lXCIsIFwiZ2V0UG9wdXBDb250YWluZXJcIiwgXCJvbkNsaWNrXCIsIFwib25PcGVuQ2hhbmdlXCIsIFwib25LZXlEb3duXCIsIFwib3BlbkFuaW1hdGlvblwiLCBcIm9wZW5UcmFuc2l0aW9uTmFtZVwiLCBcIl9pbnRlcm5hbFJlbmRlck1lbnVJdGVtXCIsIFwiX2ludGVybmFsUmVuZGVyU3ViTWVudUl0ZW1cIl07XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBPdmVyZmxvdyBmcm9tICdyYy1vdmVyZmxvdyc7XG5pbXBvcnQgdXNlTWVyZ2VkU3RhdGUgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTWVyZ2VkU3RhdGVcIjtcbmltcG9ydCB3YXJuaW5nIGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUltcGVyYXRpdmVIYW5kbGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBmbHVzaFN5bmMgfSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSBcInJjLXV0aWwvZXMvaXNFcXVhbFwiO1xuaW1wb3J0IHsgZ2V0TWVudUlkLCBJZENvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0L0lkQ29udGV4dFwiO1xuaW1wb3J0IE1lbnVDb250ZXh0UHJvdmlkZXIgZnJvbSBcIi4vY29udGV4dC9NZW51Q29udGV4dFwiO1xuaW1wb3J0IHsgUGF0aFJlZ2lzdGVyQ29udGV4dCwgUGF0aFVzZXJDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dC9QYXRoQ29udGV4dFwiO1xuaW1wb3J0IFByaXZhdGVDb250ZXh0IGZyb20gXCIuL2NvbnRleHQvUHJpdmF0ZUNvbnRleHRcIjtcbmltcG9ydCB1c2VBY2Nlc3NpYmlsaXR5IGZyb20gXCIuL2hvb2tzL3VzZUFjY2Vzc2liaWxpdHlcIjtcbmltcG9ydCB1c2VLZXlSZWNvcmRzLCB7IE9WRVJGTE9XX0tFWSB9IGZyb20gXCIuL2hvb2tzL3VzZUtleVJlY29yZHNcIjtcbmltcG9ydCB1c2VNZW1vQ2FsbGJhY2sgZnJvbSBcIi4vaG9va3MvdXNlTWVtb0NhbGxiYWNrXCI7XG5pbXBvcnQgdXNlVVVJRCBmcm9tIFwiLi9ob29rcy91c2VVVUlEXCI7XG5pbXBvcnQgTWVudUl0ZW0gZnJvbSBcIi4vTWVudUl0ZW1cIjtcbmltcG9ydCBTdWJNZW51IGZyb20gXCIuL1N1Yk1lbnVcIjtcbmltcG9ydCB7IHBhcnNlSXRlbXMgfSBmcm9tIFwiLi91dGlscy9ub2RlVXRpbFwiO1xuaW1wb3J0IHsgd2Fybkl0ZW1Qcm9wIH0gZnJvbSBcIi4vdXRpbHMvd2FyblV0aWxcIjtcblxuLyoqXG4gKiBNZW51IG1vZGlmeSBhZnRlciByZWZhY3RvcjpcbiAqICMjIEFkZFxuICogLSBkaXNhYmxlZFxuICpcbiAqICMjIFJlbW92ZVxuICogLSBvcGVuVHJhbnNpdGlvbk5hbWVcbiAqIC0gb3BlbkFuaW1hdGlvblxuICogLSBvbkRlc3Ryb3lcbiAqIC0gc2lkZXJDb2xsYXBzZWQ6IFNlZW1zIGFudGQgZG8gbm90IHVzZSB0aGlzIHByb3AgKE5lZWQgdGVzdCBpbiBhbnRkKVxuICogLSBjb2xsYXBzZWRXaWR0aDogU2VlbXMgdGhpcyBsb2dpYyBzaG91bGQgYmUgaGFuZGxlIGJ5IGFudGQgTGF5b3V0LlNpZGVyXG4gKi9cblxuLy8gb3B0aW1pemUgZm9yIHJlbmRlclxudmFyIEVNUFRZX0xJU1QgPSBbXTtcbnZhciBNZW51ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIF9jaGlsZExpc3QkLCBfY2xhc3NOYW1lcztcbiAgdmFyIF9yZWYgPSBwcm9wcyxcbiAgICBfcmVmJHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgIHByZWZpeENscyA9IF9yZWYkcHJlZml4Q2xzID09PSB2b2lkIDAgPyAncmMtbWVudScgOiBfcmVmJHByZWZpeENscyxcbiAgICByb290Q2xhc3NOYW1lID0gX3JlZi5yb290Q2xhc3NOYW1lLFxuICAgIHN0eWxlID0gX3JlZi5zdHlsZSxcbiAgICBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICBfcmVmJHRhYkluZGV4ID0gX3JlZi50YWJJbmRleCxcbiAgICB0YWJJbmRleCA9IF9yZWYkdGFiSW5kZXggPT09IHZvaWQgMCA/IDAgOiBfcmVmJHRhYkluZGV4LFxuICAgIGl0ZW1zID0gX3JlZi5pdGVtcyxcbiAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgZGlyZWN0aW9uID0gX3JlZi5kaXJlY3Rpb24sXG4gICAgaWQgPSBfcmVmLmlkLFxuICAgIF9yZWYkbW9kZSA9IF9yZWYubW9kZSxcbiAgICBtb2RlID0gX3JlZiRtb2RlID09PSB2b2lkIDAgPyAndmVydGljYWwnIDogX3JlZiRtb2RlLFxuICAgIGlubGluZUNvbGxhcHNlZCA9IF9yZWYuaW5saW5lQ29sbGFwc2VkLFxuICAgIGRpc2FibGVkID0gX3JlZi5kaXNhYmxlZCxcbiAgICBkaXNhYmxlZE92ZXJmbG93ID0gX3JlZi5kaXNhYmxlZE92ZXJmbG93LFxuICAgIF9yZWYkc3ViTWVudU9wZW5EZWxheSA9IF9yZWYuc3ViTWVudU9wZW5EZWxheSxcbiAgICBzdWJNZW51T3BlbkRlbGF5ID0gX3JlZiRzdWJNZW51T3BlbkRlbGF5ID09PSB2b2lkIDAgPyAwLjEgOiBfcmVmJHN1Yk1lbnVPcGVuRGVsYXksXG4gICAgX3JlZiRzdWJNZW51Q2xvc2VEZWxhID0gX3JlZi5zdWJNZW51Q2xvc2VEZWxheSxcbiAgICBzdWJNZW51Q2xvc2VEZWxheSA9IF9yZWYkc3ViTWVudUNsb3NlRGVsYSA9PT0gdm9pZCAwID8gMC4xIDogX3JlZiRzdWJNZW51Q2xvc2VEZWxhLFxuICAgIGZvcmNlU3ViTWVudVJlbmRlciA9IF9yZWYuZm9yY2VTdWJNZW51UmVuZGVyLFxuICAgIGRlZmF1bHRPcGVuS2V5cyA9IF9yZWYuZGVmYXVsdE9wZW5LZXlzLFxuICAgIG9wZW5LZXlzID0gX3JlZi5vcGVuS2V5cyxcbiAgICBhY3RpdmVLZXkgPSBfcmVmLmFjdGl2ZUtleSxcbiAgICBkZWZhdWx0QWN0aXZlRmlyc3QgPSBfcmVmLmRlZmF1bHRBY3RpdmVGaXJzdCxcbiAgICBfcmVmJHNlbGVjdGFibGUgPSBfcmVmLnNlbGVjdGFibGUsXG4gICAgc2VsZWN0YWJsZSA9IF9yZWYkc2VsZWN0YWJsZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9yZWYkc2VsZWN0YWJsZSxcbiAgICBfcmVmJG11bHRpcGxlID0gX3JlZi5tdWx0aXBsZSxcbiAgICBtdWx0aXBsZSA9IF9yZWYkbXVsdGlwbGUgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZiRtdWx0aXBsZSxcbiAgICBkZWZhdWx0U2VsZWN0ZWRLZXlzID0gX3JlZi5kZWZhdWx0U2VsZWN0ZWRLZXlzLFxuICAgIHNlbGVjdGVkS2V5cyA9IF9yZWYuc2VsZWN0ZWRLZXlzLFxuICAgIG9uU2VsZWN0ID0gX3JlZi5vblNlbGVjdCxcbiAgICBvbkRlc2VsZWN0ID0gX3JlZi5vbkRlc2VsZWN0LFxuICAgIF9yZWYkaW5saW5lSW5kZW50ID0gX3JlZi5pbmxpbmVJbmRlbnQsXG4gICAgaW5saW5lSW5kZW50ID0gX3JlZiRpbmxpbmVJbmRlbnQgPT09IHZvaWQgMCA/IDI0IDogX3JlZiRpbmxpbmVJbmRlbnQsXG4gICAgbW90aW9uID0gX3JlZi5tb3Rpb24sXG4gICAgZGVmYXVsdE1vdGlvbnMgPSBfcmVmLmRlZmF1bHRNb3Rpb25zLFxuICAgIF9yZWYkdHJpZ2dlclN1Yk1lbnVBYyA9IF9yZWYudHJpZ2dlclN1Yk1lbnVBY3Rpb24sXG4gICAgdHJpZ2dlclN1Yk1lbnVBY3Rpb24gPSBfcmVmJHRyaWdnZXJTdWJNZW51QWMgPT09IHZvaWQgMCA/ICdob3ZlcicgOiBfcmVmJHRyaWdnZXJTdWJNZW51QWMsXG4gICAgYnVpbHRpblBsYWNlbWVudHMgPSBfcmVmLmJ1aWx0aW5QbGFjZW1lbnRzLFxuICAgIGl0ZW1JY29uID0gX3JlZi5pdGVtSWNvbixcbiAgICBleHBhbmRJY29uID0gX3JlZi5leHBhbmRJY29uLFxuICAgIF9yZWYkb3ZlcmZsb3dlZEluZGljYSA9IF9yZWYub3ZlcmZsb3dlZEluZGljYXRvcixcbiAgICBvdmVyZmxvd2VkSW5kaWNhdG9yID0gX3JlZiRvdmVyZmxvd2VkSW5kaWNhID09PSB2b2lkIDAgPyAnLi4uJyA6IF9yZWYkb3ZlcmZsb3dlZEluZGljYSxcbiAgICBvdmVyZmxvd2VkSW5kaWNhdG9yUG9wdXBDbGFzc05hbWUgPSBfcmVmLm92ZXJmbG93ZWRJbmRpY2F0b3JQb3B1cENsYXNzTmFtZSxcbiAgICBnZXRQb3B1cENvbnRhaW5lciA9IF9yZWYuZ2V0UG9wdXBDb250YWluZXIsXG4gICAgb25DbGljayA9IF9yZWYub25DbGljayxcbiAgICBvbk9wZW5DaGFuZ2UgPSBfcmVmLm9uT3BlbkNoYW5nZSxcbiAgICBvbktleURvd24gPSBfcmVmLm9uS2V5RG93bixcbiAgICBvcGVuQW5pbWF0aW9uID0gX3JlZi5vcGVuQW5pbWF0aW9uLFxuICAgIG9wZW5UcmFuc2l0aW9uTmFtZSA9IF9yZWYub3BlblRyYW5zaXRpb25OYW1lLFxuICAgIF9pbnRlcm5hbFJlbmRlck1lbnVJdGVtID0gX3JlZi5faW50ZXJuYWxSZW5kZXJNZW51SXRlbSxcbiAgICBfaW50ZXJuYWxSZW5kZXJTdWJNZW51SXRlbSA9IF9yZWYuX2ludGVybmFsUmVuZGVyU3ViTWVudUl0ZW0sXG4gICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYsIF9leGNsdWRlZCk7XG4gIHZhciBjaGlsZExpc3QgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcGFyc2VJdGVtcyhjaGlsZHJlbiwgaXRlbXMsIEVNUFRZX0xJU1QpO1xuICB9LCBbY2hpbGRyZW4sIGl0ZW1zXSk7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShmYWxzZSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgbW91bnRlZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0TW91bnRlZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBjb250YWluZXJSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgdmFyIHV1aWQgPSB1c2VVVUlEKGlkKTtcbiAgdmFyIGlzUnRsID0gZGlyZWN0aW9uID09PSAncnRsJztcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IFdhcm4gPT09PT09PT09PT09PT09PT09PT09PT09PVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHdhcm5pbmcoIW9wZW5BbmltYXRpb24gJiYgIW9wZW5UcmFuc2l0aW9uTmFtZSwgJ2BvcGVuQW5pbWF0aW9uYCBhbmQgYG9wZW5UcmFuc2l0aW9uTmFtZWAgaXMgcmVtb3ZlZC4gUGxlYXNlIHVzZSBgbW90aW9uYCBvciBgZGVmYXVsdE1vdGlvbmAgaW5zdGVhZC4nKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gT3BlbiA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfdXNlTWVyZ2VkU3RhdGUgPSB1c2VNZXJnZWRTdGF0ZShkZWZhdWx0T3BlbktleXMsIHtcbiAgICAgIHZhbHVlOiBvcGVuS2V5cyxcbiAgICAgIHBvc3RTdGF0ZTogZnVuY3Rpb24gcG9zdFN0YXRlKGtleXMpIHtcbiAgICAgICAgcmV0dXJuIGtleXMgfHwgRU1QVFlfTElTVDtcbiAgICAgIH1cbiAgICB9KSxcbiAgICBfdXNlTWVyZ2VkU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZU1lcmdlZFN0YXRlLCAyKSxcbiAgICBtZXJnZWRPcGVuS2V5cyA9IF91c2VNZXJnZWRTdGF0ZTJbMF0sXG4gICAgc2V0TWVyZ2VkT3BlbktleXMgPSBfdXNlTWVyZ2VkU3RhdGUyWzFdO1xuXG4gIC8vIFJlYWN0IDE4IHdpbGwgbWVyZ2UgbW91c2UgZXZlbnQgd2hpY2ggbWVhbnMgd2Ugb3BlbiBrZXkgd2lsbCBub3Qgc3luY1xuICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzM4ODE4XG4gIHZhciB0cmlnZ2VyT3BlbktleXMgPSBmdW5jdGlvbiB0cmlnZ2VyT3BlbktleXMoa2V5cykge1xuICAgIHZhciBmb3JjZUZsdXNoID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgICBmdW5jdGlvbiBkb1VwZGF0ZSgpIHtcbiAgICAgIHNldE1lcmdlZE9wZW5LZXlzKGtleXMpO1xuICAgICAgb25PcGVuQ2hhbmdlID09PSBudWxsIHx8IG9uT3BlbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25PcGVuQ2hhbmdlKGtleXMpO1xuICAgIH1cbiAgICBpZiAoZm9yY2VGbHVzaCkge1xuICAgICAgZmx1c2hTeW5jKGRvVXBkYXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9VcGRhdGUoKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gPj4+Pj4gQ2FjaGUgJiBSZXNldCBvcGVuIGtleXMgd2hlbiBpbmxpbmVDb2xsYXBzZWQgY2hhbmdlZFxuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKG1lcmdlZE9wZW5LZXlzKSxcbiAgICBfUmVhY3QkdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlMywgMiksXG4gICAgaW5saW5lQ2FjaGVPcGVuS2V5cyA9IF9SZWFjdCR1c2VTdGF0ZTRbMF0sXG4gICAgc2V0SW5saW5lQ2FjaGVPcGVuS2V5cyA9IF9SZWFjdCR1c2VTdGF0ZTRbMV07XG4gIHZhciBtb3VudFJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBNb2RlID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF9SZWFjdCR1c2VNZW1vID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoKG1vZGUgPT09ICdpbmxpbmUnIHx8IG1vZGUgPT09ICd2ZXJ0aWNhbCcpICYmIGlubGluZUNvbGxhcHNlZCkge1xuICAgICAgICByZXR1cm4gWyd2ZXJ0aWNhbCcsIGlubGluZUNvbGxhcHNlZF07XG4gICAgICB9XG4gICAgICByZXR1cm4gW21vZGUsIGZhbHNlXTtcbiAgICB9LCBbbW9kZSwgaW5saW5lQ29sbGFwc2VkXSksXG4gICAgX1JlYWN0JHVzZU1lbW8yID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZU1lbW8sIDIpLFxuICAgIG1lcmdlZE1vZGUgPSBfUmVhY3QkdXNlTWVtbzJbMF0sXG4gICAgbWVyZ2VkSW5saW5lQ29sbGFwc2VkID0gX1JlYWN0JHVzZU1lbW8yWzFdO1xuICB2YXIgaXNJbmxpbmVNb2RlID0gbWVyZ2VkTW9kZSA9PT0gJ2lubGluZSc7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGU1ID0gUmVhY3QudXNlU3RhdGUobWVyZ2VkTW9kZSksXG4gICAgX1JlYWN0JHVzZVN0YXRlNiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTUsIDIpLFxuICAgIGludGVybmFsTW9kZSA9IF9SZWFjdCR1c2VTdGF0ZTZbMF0sXG4gICAgc2V0SW50ZXJuYWxNb2RlID0gX1JlYWN0JHVzZVN0YXRlNlsxXTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTcgPSBSZWFjdC51c2VTdGF0ZShtZXJnZWRJbmxpbmVDb2xsYXBzZWQpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTggPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGU3LCAyKSxcbiAgICBpbnRlcm5hbElubGluZUNvbGxhcHNlZCA9IF9SZWFjdCR1c2VTdGF0ZThbMF0sXG4gICAgc2V0SW50ZXJuYWxJbmxpbmVDb2xsYXBzZWQgPSBfUmVhY3QkdXNlU3RhdGU4WzFdO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHNldEludGVybmFsTW9kZShtZXJnZWRNb2RlKTtcbiAgICBzZXRJbnRlcm5hbElubGluZUNvbGxhcHNlZChtZXJnZWRJbmxpbmVDb2xsYXBzZWQpO1xuICAgIGlmICghbW91bnRSZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBTeW5jaHJvbm91c2x5IHVwZGF0ZSBNZXJnZWRPcGVuS2V5c1xuICAgIGlmIChpc0lubGluZU1vZGUpIHtcbiAgICAgIHNldE1lcmdlZE9wZW5LZXlzKGlubGluZUNhY2hlT3BlbktleXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUcmlnZ2VyIG9wZW4gZXZlbnQgaW4gY2FzZSBpdHMgaW4gY29udHJvbFxuICAgICAgdHJpZ2dlck9wZW5LZXlzKEVNUFRZX0xJU1QpO1xuICAgIH1cbiAgfSwgW21lcmdlZE1vZGUsIG1lcmdlZElubGluZUNvbGxhcHNlZF0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gUmVzcG9uc2l2ZSA9PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfUmVhY3QkdXNlU3RhdGU5ID0gUmVhY3QudXNlU3RhdGUoMCksXG4gICAgX1JlYWN0JHVzZVN0YXRlMTAgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGU5LCAyKSxcbiAgICBsYXN0VmlzaWJsZUluZGV4ID0gX1JlYWN0JHVzZVN0YXRlMTBbMF0sXG4gICAgc2V0TGFzdFZpc2libGVJbmRleCA9IF9SZWFjdCR1c2VTdGF0ZTEwWzFdO1xuICB2YXIgYWxsVmlzaWJsZSA9IGxhc3RWaXNpYmxlSW5kZXggPj0gY2hpbGRMaXN0Lmxlbmd0aCAtIDEgfHwgaW50ZXJuYWxNb2RlICE9PSAnaG9yaXpvbnRhbCcgfHwgZGlzYWJsZWRPdmVyZmxvdztcblxuICAvLyBDYWNoZVxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChpc0lubGluZU1vZGUpIHtcbiAgICAgIHNldElubGluZUNhY2hlT3BlbktleXMobWVyZ2VkT3BlbktleXMpO1xuICAgIH1cbiAgfSwgW21lcmdlZE9wZW5LZXlzXSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgbW91bnRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vdW50UmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBQYXRoID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF91c2VLZXlSZWNvcmRzID0gdXNlS2V5UmVjb3JkcygpLFxuICAgIHJlZ2lzdGVyUGF0aCA9IF91c2VLZXlSZWNvcmRzLnJlZ2lzdGVyUGF0aCxcbiAgICB1bnJlZ2lzdGVyUGF0aCA9IF91c2VLZXlSZWNvcmRzLnVucmVnaXN0ZXJQYXRoLFxuICAgIHJlZnJlc2hPdmVyZmxvd0tleXMgPSBfdXNlS2V5UmVjb3Jkcy5yZWZyZXNoT3ZlcmZsb3dLZXlzLFxuICAgIGlzU3ViUGF0aEtleSA9IF91c2VLZXlSZWNvcmRzLmlzU3ViUGF0aEtleSxcbiAgICBnZXRLZXlQYXRoID0gX3VzZUtleVJlY29yZHMuZ2V0S2V5UGF0aCxcbiAgICBnZXRLZXlzID0gX3VzZUtleVJlY29yZHMuZ2V0S2V5cyxcbiAgICBnZXRTdWJQYXRoS2V5cyA9IF91c2VLZXlSZWNvcmRzLmdldFN1YlBhdGhLZXlzO1xuICB2YXIgcmVnaXN0ZXJQYXRoQ29udGV4dCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICByZWdpc3RlclBhdGg6IHJlZ2lzdGVyUGF0aCxcbiAgICAgIHVucmVnaXN0ZXJQYXRoOiB1bnJlZ2lzdGVyUGF0aFxuICAgIH07XG4gIH0sIFtyZWdpc3RlclBhdGgsIHVucmVnaXN0ZXJQYXRoXSk7XG4gIHZhciBwYXRoVXNlckNvbnRleHQgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNTdWJQYXRoS2V5OiBpc1N1YlBhdGhLZXlcbiAgICB9O1xuICB9LCBbaXNTdWJQYXRoS2V5XSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmVmcmVzaE92ZXJmbG93S2V5cyhhbGxWaXNpYmxlID8gRU1QVFlfTElTVCA6IGNoaWxkTGlzdC5zbGljZShsYXN0VmlzaWJsZUluZGV4ICsgMSkubWFwKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgcmV0dXJuIGNoaWxkLmtleTtcbiAgICB9KSk7XG4gIH0sIFtsYXN0VmlzaWJsZUluZGV4LCBhbGxWaXNpYmxlXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IEFjdGl2ZSA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZTMgPSB1c2VNZXJnZWRTdGF0ZShhY3RpdmVLZXkgfHwgZGVmYXVsdEFjdGl2ZUZpcnN0ICYmICgoX2NoaWxkTGlzdCQgPSBjaGlsZExpc3RbMF0pID09PSBudWxsIHx8IF9jaGlsZExpc3QkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY2hpbGRMaXN0JC5rZXkpLCB7XG4gICAgICB2YWx1ZTogYWN0aXZlS2V5XG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZTMsIDIpLFxuICAgIG1lcmdlZEFjdGl2ZUtleSA9IF91c2VNZXJnZWRTdGF0ZTRbMF0sXG4gICAgc2V0TWVyZ2VkQWN0aXZlS2V5ID0gX3VzZU1lcmdlZFN0YXRlNFsxXTtcbiAgdmFyIG9uQWN0aXZlID0gdXNlTWVtb0NhbGxiYWNrKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBzZXRNZXJnZWRBY3RpdmVLZXkoa2V5KTtcbiAgfSk7XG4gIHZhciBvbkluYWN0aXZlID0gdXNlTWVtb0NhbGxiYWNrKGZ1bmN0aW9uICgpIHtcbiAgICBzZXRNZXJnZWRBY3RpdmVLZXkodW5kZWZpbmVkKTtcbiAgfSk7XG4gIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpc3Q6IGNvbnRhaW5lclJlZi5jdXJyZW50LFxuICAgICAgZm9jdXM6IGZ1bmN0aW9uIGZvY3VzKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9jaGlsZExpc3QkZmluZDtcbiAgICAgICAgdmFyIHNob3VsZEZvY3VzS2V5ID0gbWVyZ2VkQWN0aXZlS2V5ICE9PSBudWxsICYmIG1lcmdlZEFjdGl2ZUtleSAhPT0gdm9pZCAwID8gbWVyZ2VkQWN0aXZlS2V5IDogKF9jaGlsZExpc3QkZmluZCA9IGNoaWxkTGlzdC5maW5kKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgcmV0dXJuICFub2RlLnByb3BzLmRpc2FibGVkO1xuICAgICAgICB9KSkgPT09IG51bGwgfHwgX2NoaWxkTGlzdCRmaW5kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY2hpbGRMaXN0JGZpbmQua2V5O1xuICAgICAgICBpZiAoc2hvdWxkRm9jdXNLZXkpIHtcbiAgICAgICAgICB2YXIgX2NvbnRhaW5lclJlZiRjdXJyZW50LCBfY29udGFpbmVyUmVmJGN1cnJlbnQyLCBfY29udGFpbmVyUmVmJGN1cnJlbnQzO1xuICAgICAgICAgIChfY29udGFpbmVyUmVmJGN1cnJlbnQgPSBjb250YWluZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2NvbnRhaW5lclJlZiRjdXJyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX2NvbnRhaW5lclJlZiRjdXJyZW50MiA9IF9jb250YWluZXJSZWYkY3VycmVudC5xdWVyeVNlbGVjdG9yKFwibGlbZGF0YS1tZW51LWlkPSdcIi5jb25jYXQoZ2V0TWVudUlkKHV1aWQsIHNob3VsZEZvY3VzS2V5KSwgXCInXVwiKSkpID09PSBudWxsIHx8IF9jb250YWluZXJSZWYkY3VycmVudDIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfY29udGFpbmVyUmVmJGN1cnJlbnQzID0gX2NvbnRhaW5lclJlZiRjdXJyZW50Mi5mb2N1cykgPT09IG51bGwgfHwgX2NvbnRhaW5lclJlZiRjdXJyZW50MyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2NvbnRhaW5lclJlZiRjdXJyZW50My5jYWxsKF9jb250YWluZXJSZWYkY3VycmVudDIsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFNlbGVjdCA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gPj4+Pj4gU2VsZWN0IGtleXNcbiAgdmFyIF91c2VNZXJnZWRTdGF0ZTUgPSB1c2VNZXJnZWRTdGF0ZShkZWZhdWx0U2VsZWN0ZWRLZXlzIHx8IFtdLCB7XG4gICAgICB2YWx1ZTogc2VsZWN0ZWRLZXlzLFxuICAgICAgLy8gTGVnYWN5IGNvbnZlcnQga2V5IHRvIGFycmF5XG4gICAgICBwb3N0U3RhdGU6IGZ1bmN0aW9uIHBvc3RTdGF0ZShrZXlzKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGtleXMpKSB7XG4gICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleXMgPT09IG51bGwgfHwga2V5cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIEVNUFRZX0xJU1Q7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtrZXlzXTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICBfdXNlTWVyZ2VkU3RhdGU2ID0gX3NsaWNlZFRvQXJyYXkoX3VzZU1lcmdlZFN0YXRlNSwgMiksXG4gICAgbWVyZ2VkU2VsZWN0S2V5cyA9IF91c2VNZXJnZWRTdGF0ZTZbMF0sXG4gICAgc2V0TWVyZ2VkU2VsZWN0S2V5cyA9IF91c2VNZXJnZWRTdGF0ZTZbMV07XG5cbiAgLy8gPj4+Pj4gVHJpZ2dlciBzZWxlY3RcbiAgdmFyIHRyaWdnZXJTZWxlY3Rpb24gPSBmdW5jdGlvbiB0cmlnZ2VyU2VsZWN0aW9uKGluZm8pIHtcbiAgICBpZiAoc2VsZWN0YWJsZSkge1xuICAgICAgLy8gSW5zZXJ0IG9yIFJlbW92ZVxuICAgICAgdmFyIHRhcmdldEtleSA9IGluZm8ua2V5O1xuICAgICAgdmFyIGV4aXN0ID0gbWVyZ2VkU2VsZWN0S2V5cy5pbmNsdWRlcyh0YXJnZXRLZXkpO1xuICAgICAgdmFyIG5ld1NlbGVjdEtleXM7XG4gICAgICBpZiAobXVsdGlwbGUpIHtcbiAgICAgICAgaWYgKGV4aXN0KSB7XG4gICAgICAgICAgbmV3U2VsZWN0S2V5cyA9IG1lcmdlZFNlbGVjdEtleXMuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBrZXkgIT09IHRhcmdldEtleTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdTZWxlY3RLZXlzID0gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShtZXJnZWRTZWxlY3RLZXlzKSwgW3RhcmdldEtleV0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdTZWxlY3RLZXlzID0gW3RhcmdldEtleV07XG4gICAgICB9XG4gICAgICBzZXRNZXJnZWRTZWxlY3RLZXlzKG5ld1NlbGVjdEtleXMpO1xuXG4gICAgICAvLyBUcmlnZ2VyIGV2ZW50XG4gICAgICB2YXIgc2VsZWN0SW5mbyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgaW5mbyksIHt9LCB7XG4gICAgICAgIHNlbGVjdGVkS2V5czogbmV3U2VsZWN0S2V5c1xuICAgICAgfSk7XG4gICAgICBpZiAoZXhpc3QpIHtcbiAgICAgICAgb25EZXNlbGVjdCA9PT0gbnVsbCB8fCBvbkRlc2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkRlc2VsZWN0KHNlbGVjdEluZm8pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25TZWxlY3QgPT09IG51bGwgfHwgb25TZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uU2VsZWN0KHNlbGVjdEluZm8pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdoYXRldmVyIHNlbGVjdGFibGUsIGFsd2F5cyBjbG9zZSBpdFxuICAgIGlmICghbXVsdGlwbGUgJiYgbWVyZ2VkT3BlbktleXMubGVuZ3RoICYmIGludGVybmFsTW9kZSAhPT0gJ2lubGluZScpIHtcbiAgICAgIHRyaWdnZXJPcGVuS2V5cyhFTVBUWV9MSVNUKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBPcGVuID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqXG4gICAqIENsaWNrIGZvciBpdGVtLiBTdWJNZW51IGRvIG5vdCBoYXZlIHNlbGVjdGlvbiBzdGF0dXNcbiAgICovXG4gIHZhciBvbkludGVybmFsQ2xpY2sgPSB1c2VNZW1vQ2FsbGJhY2soZnVuY3Rpb24gKGluZm8pIHtcbiAgICBvbkNsaWNrID09PSBudWxsIHx8IG9uQ2xpY2sgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2xpY2sod2Fybkl0ZW1Qcm9wKGluZm8pKTtcbiAgICB0cmlnZ2VyU2VsZWN0aW9uKGluZm8pO1xuICB9KTtcbiAgdmFyIG9uSW50ZXJuYWxPcGVuQ2hhbmdlID0gdXNlTWVtb0NhbGxiYWNrKGZ1bmN0aW9uIChrZXksIG9wZW4pIHtcbiAgICB2YXIgbmV3T3BlbktleXMgPSBtZXJnZWRPcGVuS2V5cy5maWx0ZXIoZnVuY3Rpb24gKGspIHtcbiAgICAgIHJldHVybiBrICE9PSBrZXk7XG4gICAgfSk7XG4gICAgaWYgKG9wZW4pIHtcbiAgICAgIG5ld09wZW5LZXlzLnB1c2goa2V5KTtcbiAgICB9IGVsc2UgaWYgKGludGVybmFsTW9kZSAhPT0gJ2lubGluZScpIHtcbiAgICAgIC8vIFdlIG5lZWQgZmluZCBhbGwgcmVsYXRlZCBwb3B1cCB0byBjbG9zZVxuICAgICAgdmFyIHN1YlBhdGhLZXlzID0gZ2V0U3ViUGF0aEtleXMoa2V5KTtcbiAgICAgIG5ld09wZW5LZXlzID0gbmV3T3BlbktleXMuZmlsdGVyKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgIHJldHVybiAhc3ViUGF0aEtleXMuaGFzKGspO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghaXNFcXVhbChtZXJnZWRPcGVuS2V5cywgbmV3T3BlbktleXMsIHRydWUpKSB7XG4gICAgICB0cmlnZ2VyT3BlbktleXMobmV3T3BlbktleXMsIHRydWUpO1xuICAgIH1cbiAgfSk7XG4gIHZhciBnZXRJbnRlcm5hbFBvcHVwQ29udGFpbmVyID0gdXNlTWVtb0NhbGxiYWNrKGdldFBvcHVwQ29udGFpbmVyKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBBY2Nlc3NpYmlsaXR5ID09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgdHJpZ2dlckFjY2Vzc2liaWxpdHlPcGVuID0gZnVuY3Rpb24gdHJpZ2dlckFjY2Vzc2liaWxpdHlPcGVuKGtleSwgb3Blbikge1xuICAgIHZhciBuZXh0T3BlbiA9IG9wZW4gIT09IG51bGwgJiYgb3BlbiAhPT0gdm9pZCAwID8gb3BlbiA6ICFtZXJnZWRPcGVuS2V5cy5pbmNsdWRlcyhrZXkpO1xuICAgIG9uSW50ZXJuYWxPcGVuQ2hhbmdlKGtleSwgbmV4dE9wZW4pO1xuICB9O1xuICB2YXIgb25JbnRlcm5hbEtleURvd24gPSB1c2VBY2Nlc3NpYmlsaXR5KGludGVybmFsTW9kZSwgbWVyZ2VkQWN0aXZlS2V5LCBpc1J0bCwgdXVpZCwgY29udGFpbmVyUmVmLCBnZXRLZXlzLCBnZXRLZXlQYXRoLCBzZXRNZXJnZWRBY3RpdmVLZXksIHRyaWdnZXJBY2Nlc3NpYmlsaXR5T3Blbiwgb25LZXlEb3duKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gRWZmZWN0ID09PT09PT09PT09PT09PT09PT09PT09PVxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHNldE1vdW50ZWQodHJ1ZSk7XG4gIH0sIFtdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBDb250ZXh0ID09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgcHJpdmF0ZUNvbnRleHQgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgX2ludGVybmFsUmVuZGVyTWVudUl0ZW06IF9pbnRlcm5hbFJlbmRlck1lbnVJdGVtLFxuICAgICAgX2ludGVybmFsUmVuZGVyU3ViTWVudUl0ZW06IF9pbnRlcm5hbFJlbmRlclN1Yk1lbnVJdGVtXG4gICAgfTtcbiAgfSwgW19pbnRlcm5hbFJlbmRlck1lbnVJdGVtLCBfaW50ZXJuYWxSZW5kZXJTdWJNZW51SXRlbV0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLy8gPj4+Pj4gQ2hpbGRyZW5cbiAgdmFyIHdyYXBwZWRDaGlsZExpc3QgPSBpbnRlcm5hbE1vZGUgIT09ICdob3Jpem9udGFsJyB8fCBkaXNhYmxlZE92ZXJmbG93ID8gY2hpbGRMaXN0IDpcbiAgLy8gTmVlZCB3cmFwIGZvciBvdmVyZmxvdyBkcm9wZG93biB0aGF0IGRvIG5vdCByZXNwb25zZSBmb3Igb3BlblxuICBjaGlsZExpc3QubWFwKGZ1bmN0aW9uIChjaGlsZCwgaW5kZXgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgLyojX19QVVJFX18qL1xuICAgICAgLy8gQWx3YXlzIHdyYXAgcHJvdmlkZXIgdG8gYXZvaWQgc3ViIG5vZGUgcmUtbW91bnRcbiAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTWVudUNvbnRleHRQcm92aWRlciwge1xuICAgICAgICBrZXk6IGNoaWxkLmtleSxcbiAgICAgICAgb3ZlcmZsb3dEaXNhYmxlZDogaW5kZXggPiBsYXN0VmlzaWJsZUluZGV4XG4gICAgICB9LCBjaGlsZClcbiAgICApO1xuICB9KTtcblxuICAvLyA+Pj4+PiBDb250YWluZXJcbiAgdmFyIGNvbnRhaW5lciA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE92ZXJmbG93LCBfZXh0ZW5kcyh7XG4gICAgaWQ6IGlkLFxuICAgIHJlZjogY29udGFpbmVyUmVmLFxuICAgIHByZWZpeENsczogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1vdmVyZmxvd1wiKSxcbiAgICBjb21wb25lbnQ6IFwidWxcIixcbiAgICBpdGVtQ29tcG9uZW50OiBNZW51SXRlbSxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJvb3RcIiksIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChpbnRlcm5hbE1vZGUpLCBjbGFzc05hbWUsIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5saW5lLWNvbGxhcHNlZFwiKSwgaW50ZXJuYWxJbmxpbmVDb2xsYXBzZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBpc1J0bCksIF9jbGFzc05hbWVzKSwgcm9vdENsYXNzTmFtZSksXG4gICAgZGlyOiBkaXJlY3Rpb24sXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIHJvbGU6IFwibWVudVwiLFxuICAgIHRhYkluZGV4OiB0YWJJbmRleCxcbiAgICBkYXRhOiB3cmFwcGVkQ2hpbGRMaXN0LFxuICAgIHJlbmRlclJhd0l0ZW06IGZ1bmN0aW9uIHJlbmRlclJhd0l0ZW0obm9kZSkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSxcbiAgICByZW5kZXJSYXdSZXN0OiBmdW5jdGlvbiByZW5kZXJSYXdSZXN0KG9taXRJdGVtcykge1xuICAgICAgLy8gV2UgdXNlIG9yaWdpbiBsaXN0IHNpbmNlIHdyYXBwZWQgbGlzdCB1c2UgY29udGV4dCB0byBwcmV2ZW50IG9wZW5cbiAgICAgIHZhciBsZW4gPSBvbWl0SXRlbXMubGVuZ3RoO1xuICAgICAgdmFyIG9yaWdpbk9taXRJdGVtcyA9IGxlbiA/IGNoaWxkTGlzdC5zbGljZSgtbGVuKSA6IG51bGw7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU3ViTWVudSwge1xuICAgICAgICBldmVudEtleTogT1ZFUkZMT1dfS0VZLFxuICAgICAgICB0aXRsZTogb3ZlcmZsb3dlZEluZGljYXRvcixcbiAgICAgICAgZGlzYWJsZWQ6IGFsbFZpc2libGUsXG4gICAgICAgIGludGVybmFsUG9wdXBDbG9zZTogbGVuID09PSAwLFxuICAgICAgICBwb3B1cENsYXNzTmFtZTogb3ZlcmZsb3dlZEluZGljYXRvclBvcHVwQ2xhc3NOYW1lXG4gICAgICB9LCBvcmlnaW5PbWl0SXRlbXMpO1xuICAgIH0sXG4gICAgbWF4Q291bnQ6IGludGVybmFsTW9kZSAhPT0gJ2hvcml6b250YWwnIHx8IGRpc2FibGVkT3ZlcmZsb3cgPyBPdmVyZmxvdy5JTlZBTElEQVRFIDogT3ZlcmZsb3cuUkVTUE9OU0lWRSxcbiAgICBzc3I6IFwiZnVsbFwiLFxuICAgIFwiZGF0YS1tZW51LWxpc3RcIjogdHJ1ZSxcbiAgICBvblZpc2libGVDaGFuZ2U6IGZ1bmN0aW9uIG9uVmlzaWJsZUNoYW5nZShuZXdMYXN0SW5kZXgpIHtcbiAgICAgIHNldExhc3RWaXNpYmxlSW5kZXgobmV3TGFzdEluZGV4KTtcbiAgICB9LFxuICAgIG9uS2V5RG93bjogb25JbnRlcm5hbEtleURvd25cbiAgfSwgcmVzdFByb3BzKSk7XG5cbiAgLy8gPj4+Pj4gUmVuZGVyXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQcml2YXRlQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBwcml2YXRlQ29udGV4dFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJZENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogdXVpZFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNZW51Q29udGV4dFByb3ZpZGVyLCB7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgcm9vdENsYXNzTmFtZTogcm9vdENsYXNzTmFtZSxcbiAgICBtb2RlOiBpbnRlcm5hbE1vZGUsXG4gICAgb3BlbktleXM6IG1lcmdlZE9wZW5LZXlzLFxuICAgIHJ0bDogaXNSdGxcbiAgICAvLyBEaXNhYmxlZFxuICAgICxcbiAgICBkaXNhYmxlZDogZGlzYWJsZWRcbiAgICAvLyBNb3Rpb25cbiAgICAsXG4gICAgbW90aW9uOiBtb3VudGVkID8gbW90aW9uIDogbnVsbCxcbiAgICBkZWZhdWx0TW90aW9uczogbW91bnRlZCA/IGRlZmF1bHRNb3Rpb25zIDogbnVsbFxuICAgIC8vIEFjdGl2ZVxuICAgICxcbiAgICBhY3RpdmVLZXk6IG1lcmdlZEFjdGl2ZUtleSxcbiAgICBvbkFjdGl2ZTogb25BY3RpdmUsXG4gICAgb25JbmFjdGl2ZTogb25JbmFjdGl2ZVxuICAgIC8vIFNlbGVjdGlvblxuICAgICxcbiAgICBzZWxlY3RlZEtleXM6IG1lcmdlZFNlbGVjdEtleXNcbiAgICAvLyBMZXZlbFxuICAgICxcbiAgICBpbmxpbmVJbmRlbnQ6IGlubGluZUluZGVudFxuICAgIC8vIFBvcHVwXG4gICAgLFxuICAgIHN1Yk1lbnVPcGVuRGVsYXk6IHN1Yk1lbnVPcGVuRGVsYXksXG4gICAgc3ViTWVudUNsb3NlRGVsYXk6IHN1Yk1lbnVDbG9zZURlbGF5LFxuICAgIGZvcmNlU3ViTWVudVJlbmRlcjogZm9yY2VTdWJNZW51UmVuZGVyLFxuICAgIGJ1aWx0aW5QbGFjZW1lbnRzOiBidWlsdGluUGxhY2VtZW50cyxcbiAgICB0cmlnZ2VyU3ViTWVudUFjdGlvbjogdHJpZ2dlclN1Yk1lbnVBY3Rpb24sXG4gICAgZ2V0UG9wdXBDb250YWluZXI6IGdldEludGVybmFsUG9wdXBDb250YWluZXJcbiAgICAvLyBJY29uXG4gICAgLFxuICAgIGl0ZW1JY29uOiBpdGVtSWNvbixcbiAgICBleHBhbmRJY29uOiBleHBhbmRJY29uXG4gICAgLy8gRXZlbnRzXG4gICAgLFxuICAgIG9uSXRlbUNsaWNrOiBvbkludGVybmFsQ2xpY2ssXG4gICAgb25PcGVuQ2hhbmdlOiBvbkludGVybmFsT3BlbkNoYW5nZVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQYXRoVXNlckNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogcGF0aFVzZXJDb250ZXh0XG4gIH0sIGNvbnRhaW5lciksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBzdHlsZToge1xuICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgfSxcbiAgICBcImFyaWEtaGlkZGVuXCI6IHRydWVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUGF0aFJlZ2lzdGVyQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiByZWdpc3RlclBhdGhDb250ZXh0XG4gIH0sIGNoaWxkTGlzdCkpKSkpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBNZW51OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJjbGFzc05hbWVcIiwgXCJ0aXRsZVwiLCBcImV2ZW50S2V5XCIsIFwiY2hpbGRyZW5cIl0sXG4gIF9leGNsdWRlZDIgPSBbXCJjaGlsZHJlblwiXTtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IG9taXQgZnJvbSBcInJjLXV0aWwvZXMvb21pdFwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgTWVudUNvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0L01lbnVDb250ZXh0XCI7XG5pbXBvcnQgeyB1c2VGdWxsUGF0aCwgdXNlTWVhc3VyZSB9IGZyb20gXCIuL2NvbnRleHQvUGF0aENvbnRleHRcIjtcbmltcG9ydCB7IHBhcnNlQ2hpbGRyZW4gfSBmcm9tIFwiLi91dGlscy9ub2RlVXRpbFwiO1xudmFyIEludGVybmFsTWVudUl0ZW1Hcm91cCA9IGZ1bmN0aW9uIEludGVybmFsTWVudUl0ZW1Hcm91cChfcmVmKSB7XG4gIHZhciBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICB0aXRsZSA9IF9yZWYudGl0bGUsXG4gICAgZXZlbnRLZXkgPSBfcmVmLmV2ZW50S2V5LFxuICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgX2V4Y2x1ZGVkKTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChNZW51Q29udGV4dCksXG4gICAgcHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQucHJlZml4Q2xzO1xuICB2YXIgZ3JvdXBQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tZ3JvdXBcIik7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIF9leHRlbmRzKHtcbiAgICByb2xlOiBcInByZXNlbnRhdGlvblwiXG4gIH0sIHJlc3RQcm9wcywge1xuICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuICAgICAgcmV0dXJuIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoZ3JvdXBQcmVmaXhDbHMsIGNsYXNzTmFtZSlcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICByb2xlOiBcInByZXNlbnRhdGlvblwiLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoZ3JvdXBQcmVmaXhDbHMsIFwiLXRpdGxlXCIpLFxuICAgIHRpdGxlOiB0eXBlb2YgdGl0bGUgPT09ICdzdHJpbmcnID8gdGl0bGUgOiB1bmRlZmluZWRcbiAgfSwgdGl0bGUpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInVsXCIsIHtcbiAgICByb2xlOiBcImdyb3VwXCIsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChncm91cFByZWZpeENscywgXCItbGlzdFwiKVxuICB9LCBjaGlsZHJlbikpO1xufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE1lbnVJdGVtR3JvdXAoX3JlZjIpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZjIuY2hpbGRyZW4sXG4gICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjIsIF9leGNsdWRlZDIpO1xuICB2YXIgY29ubmVjdGVkS2V5UGF0aCA9IHVzZUZ1bGxQYXRoKHByb3BzLmV2ZW50S2V5KTtcbiAgdmFyIGNoaWxkTGlzdCA9IHBhcnNlQ2hpbGRyZW4oY2hpbGRyZW4sIGNvbm5lY3RlZEtleVBhdGgpO1xuICB2YXIgbWVhc3VyZSA9IHVzZU1lYXN1cmUoKTtcbiAgaWYgKG1lYXN1cmUpIHtcbiAgICByZXR1cm4gY2hpbGRMaXN0O1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJbnRlcm5hbE1lbnVJdGVtR3JvdXAsIG9taXQocHJvcHMsIFsnd2FybktleSddKSwgY2hpbGRMaXN0KTtcbn0iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IE1lbnVDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dC9NZW51Q29udGV4dFwiO1xuaW1wb3J0IHsgdXNlTWVhc3VyZSB9IGZyb20gXCIuL2NvbnRleHQvUGF0aENvbnRleHRcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIERpdmlkZXIoX3JlZikge1xuICB2YXIgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgc3R5bGUgPSBfcmVmLnN0eWxlO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KE1lbnVDb250ZXh0KSxcbiAgICBwcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5wcmVmaXhDbHM7XG4gIHZhciBtZWFzdXJlID0gdXNlTWVhc3VyZSgpO1xuICBpZiAobWVhc3VyZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLWRpdmlkZXJcIiksIGNsYXNzTmFtZSksXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0pO1xufSIsImltcG9ydCBNZW51IGZyb20gXCIuL01lbnVcIjtcbmltcG9ydCBNZW51SXRlbSBmcm9tIFwiLi9NZW51SXRlbVwiO1xuaW1wb3J0IFN1Yk1lbnUgZnJvbSBcIi4vU3ViTWVudVwiO1xuaW1wb3J0IE1lbnVJdGVtR3JvdXAgZnJvbSBcIi4vTWVudUl0ZW1Hcm91cFwiO1xuaW1wb3J0IHsgdXNlRnVsbFBhdGggfSBmcm9tIFwiLi9jb250ZXh0L1BhdGhDb250ZXh0XCI7XG5pbXBvcnQgRGl2aWRlciBmcm9tIFwiLi9EaXZpZGVyXCI7XG5leHBvcnQgeyBTdWJNZW51LCBNZW51SXRlbSBhcyBJdGVtLCBNZW51SXRlbSwgTWVudUl0ZW1Hcm91cCwgTWVudUl0ZW1Hcm91cCBhcyBJdGVtR3JvdXAsIERpdmlkZXIsIC8qKiBAcHJpdmF0ZSBPbmx5IHVzZWQgZm9yIGFudGQgaW50ZXJuYWwuIERvIG5vdCB1c2UgaW4geW91ciBwcm9kdWN0aW9uLiAqL1xudXNlRnVsbFBhdGggfTtcbnZhciBFeHBvcnRNZW51ID0gTWVudTtcbkV4cG9ydE1lbnUuSXRlbSA9IE1lbnVJdGVtO1xuRXhwb3J0TWVudS5TdWJNZW51ID0gU3ViTWVudTtcbkV4cG9ydE1lbnUuSXRlbUdyb3VwID0gTWVudUl0ZW1Hcm91cDtcbkV4cG9ydE1lbnUuRGl2aWRlciA9IERpdmlkZXI7XG5leHBvcnQgZGVmYXVsdCBFeHBvcnRNZW51OyIsIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIExlZnRPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNzI0IDIxOC4zVjE0MWMwLTYuNy03LjctMTAuNC0xMi45LTYuM0wyNjAuMyA0ODYuOGEzMS44NiAzMS44NiAwIDAwMCA1MC4zbDQ1MC44IDM1Mi4xYzUuMyA0LjEgMTIuOS40IDEyLjktNi4zdi03Ny4zYzAtNC45LTIuMy05LjYtNi4xLTEyLjZsLTM2MC0yODEgMzYwLTI4MS4xYzMuOC0zIDYuMS03LjcgNi4xLTEyLjZ6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJsZWZ0XCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnQgZGVmYXVsdCBMZWZ0T3V0bGluZWQ7XG4iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBMZWZ0T3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vTGVmdE91dGxpbmVkXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSAnLi4vY29tcG9uZW50cy9BbnRkSWNvbic7XG52YXIgTGVmdE91dGxpbmVkID0gZnVuY3Rpb24gTGVmdE91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBMZWZ0T3V0bGluZWRTdmdcbiAgfSkpO1xufTtcbkxlZnRPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdMZWZ0T3V0bGluZWQnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoTGVmdE91dGxpbmVkKTsiLCIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBSaWdodE91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk03NjUuNyA0ODYuOEwzMTQuOSAxMzQuN0E3Ljk3IDcuOTcgMCAwMDMwMiAxNDF2NzcuM2MwIDQuOSAyLjMgOS42IDYuMSAxMi42bDM2MCAyODEuMS0zNjAgMjgxLjFjLTMuOSAzLTYuMSA3LjctNi4xIDEyLjZWODgzYzAgNi43IDcuNyAxMC40IDEyLjkgNi4zbDQ1MC44LTM1Mi4xYTMxLjk2IDMxLjk2IDAgMDAwLTUwLjR6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJyaWdodFwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgUmlnaHRPdXRsaW5lZDtcbiIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJpZ2h0T3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vUmlnaHRPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIFJpZ2h0T3V0bGluZWQgPSBmdW5jdGlvbiBSaWdodE91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBSaWdodE91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5SaWdodE91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ1JpZ2h0T3V0bGluZWQnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoUmlnaHRPdXRsaW5lZCk7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IEJhcnNPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvQmFyc091dGxpbmVkXCI7XG5pbXBvcnQgTGVmdE91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9MZWZ0T3V0bGluZWRcIjtcbmltcG9ydCBSaWdodE91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9SaWdodE91dGxpbmVkXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBvbWl0IGZyb20gXCJyYy11dGlsL2VzL29taXRcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IGlzTnVtZXJpYyBmcm9tICcuLi9fdXRpbC9pc051bWVyaWMnO1xuaW1wb3J0IHsgTGF5b3V0Q29udGV4dCB9IGZyb20gJy4vbGF5b3V0JztcbnZhciBkaW1lbnNpb25NYXhNYXAgPSB7XG4gIHhzOiAnNDc5Ljk4cHgnLFxuICBzbTogJzU3NS45OHB4JyxcbiAgbWQ6ICc3NjcuOThweCcsXG4gIGxnOiAnOTkxLjk4cHgnLFxuICB4bDogJzExOTkuOThweCcsXG4gIHh4bDogJzE1OTkuOThweCdcbn07XG5leHBvcnQgdmFyIFNpZGVyQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHt9KTtcbnZhciBnZW5lcmF0ZUlkID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaSA9IDA7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByZWZpeCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJyc7XG4gICAgaSArPSAxO1xuICAgIHJldHVybiBcIlwiLmNvbmNhdChwcmVmaXgpLmNvbmNhdChpKTtcbiAgfTtcbn0oKTtcbnZhciBTaWRlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChfYSwgcmVmKSB7XG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBfYS5wcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lLFxuICAgIHRyaWdnZXIgPSBfYS50cmlnZ2VyLFxuICAgIGNoaWxkcmVuID0gX2EuY2hpbGRyZW4sXG4gICAgX2EkZGVmYXVsdENvbGxhcHNlZCA9IF9hLmRlZmF1bHRDb2xsYXBzZWQsXG4gICAgZGVmYXVsdENvbGxhcHNlZCA9IF9hJGRlZmF1bHRDb2xsYXBzZWQgPT09IHZvaWQgMCA/IGZhbHNlIDogX2EkZGVmYXVsdENvbGxhcHNlZCxcbiAgICBfYSR0aGVtZSA9IF9hLnRoZW1lLFxuICAgIHRoZW1lID0gX2EkdGhlbWUgPT09IHZvaWQgMCA/ICdkYXJrJyA6IF9hJHRoZW1lLFxuICAgIF9hJHN0eWxlID0gX2Euc3R5bGUsXG4gICAgc3R5bGUgPSBfYSRzdHlsZSA9PT0gdm9pZCAwID8ge30gOiBfYSRzdHlsZSxcbiAgICBfYSRjb2xsYXBzaWJsZSA9IF9hLmNvbGxhcHNpYmxlLFxuICAgIGNvbGxhcHNpYmxlID0gX2EkY29sbGFwc2libGUgPT09IHZvaWQgMCA/IGZhbHNlIDogX2EkY29sbGFwc2libGUsXG4gICAgX2EkcmV2ZXJzZUFycm93ID0gX2EucmV2ZXJzZUFycm93LFxuICAgIHJldmVyc2VBcnJvdyA9IF9hJHJldmVyc2VBcnJvdyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYSRyZXZlcnNlQXJyb3csXG4gICAgX2Ekd2lkdGggPSBfYS53aWR0aCxcbiAgICB3aWR0aCA9IF9hJHdpZHRoID09PSB2b2lkIDAgPyAyMDAgOiBfYSR3aWR0aCxcbiAgICBfYSRjb2xsYXBzZWRXaWR0aCA9IF9hLmNvbGxhcHNlZFdpZHRoLFxuICAgIGNvbGxhcHNlZFdpZHRoID0gX2EkY29sbGFwc2VkV2lkdGggPT09IHZvaWQgMCA/IDgwIDogX2EkY29sbGFwc2VkV2lkdGgsXG4gICAgemVyb1dpZHRoVHJpZ2dlclN0eWxlID0gX2EuemVyb1dpZHRoVHJpZ2dlclN0eWxlLFxuICAgIGJyZWFrcG9pbnQgPSBfYS5icmVha3BvaW50LFxuICAgIG9uQ29sbGFwc2UgPSBfYS5vbkNvbGxhcHNlLFxuICAgIG9uQnJlYWtwb2ludCA9IF9hLm9uQnJlYWtwb2ludCxcbiAgICBwcm9wcyA9IF9fcmVzdChfYSwgW1wicHJlZml4Q2xzXCIsIFwiY2xhc3NOYW1lXCIsIFwidHJpZ2dlclwiLCBcImNoaWxkcmVuXCIsIFwiZGVmYXVsdENvbGxhcHNlZFwiLCBcInRoZW1lXCIsIFwic3R5bGVcIiwgXCJjb2xsYXBzaWJsZVwiLCBcInJldmVyc2VBcnJvd1wiLCBcIndpZHRoXCIsIFwiY29sbGFwc2VkV2lkdGhcIiwgXCJ6ZXJvV2lkdGhUcmlnZ2VyU3R5bGVcIiwgXCJicmVha3BvaW50XCIsIFwib25Db2xsYXBzZVwiLCBcIm9uQnJlYWtwb2ludFwiXSk7XG4gIHZhciBfdXNlQ29udGV4dCA9IHVzZUNvbnRleHQoTGF5b3V0Q29udGV4dCksXG4gICAgc2lkZXJIb29rID0gX3VzZUNvbnRleHQuc2lkZXJIb29rO1xuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoJ2NvbGxhcHNlZCcgaW4gcHJvcHMgPyBwcm9wcy5jb2xsYXBzZWQgOiBkZWZhdWx0Q29sbGFwc2VkKSxcbiAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICBjb2xsYXBzZWQgPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldENvbGxhcHNlZCA9IF91c2VTdGF0ZTJbMV07XG4gIHZhciBfdXNlU3RhdGUzID0gdXNlU3RhdGUoZmFsc2UpLFxuICAgIF91c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUzLCAyKSxcbiAgICBiZWxvdyA9IF91c2VTdGF0ZTRbMF0sXG4gICAgc2V0QmVsb3cgPSBfdXNlU3RhdGU0WzFdO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICgnY29sbGFwc2VkJyBpbiBwcm9wcykge1xuICAgICAgc2V0Q29sbGFwc2VkKHByb3BzLmNvbGxhcHNlZCk7XG4gICAgfVxuICB9LCBbcHJvcHMuY29sbGFwc2VkXSk7XG4gIHZhciBoYW5kbGVTZXRDb2xsYXBzZWQgPSBmdW5jdGlvbiBoYW5kbGVTZXRDb2xsYXBzZWQodmFsdWUsIHR5cGUpIHtcbiAgICBpZiAoISgnY29sbGFwc2VkJyBpbiBwcm9wcykpIHtcbiAgICAgIHNldENvbGxhcHNlZCh2YWx1ZSk7XG4gICAgfVxuICAgIG9uQ29sbGFwc2UgPT09IG51bGwgfHwgb25Db2xsYXBzZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25Db2xsYXBzZSh2YWx1ZSwgdHlwZSk7XG4gIH07XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gUmVzcG9uc2l2ZSA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciByZXNwb25zaXZlSGFuZGxlclJlZiA9IHVzZVJlZigpO1xuICByZXNwb25zaXZlSGFuZGxlclJlZi5jdXJyZW50ID0gZnVuY3Rpb24gKG1xbCkge1xuICAgIHNldEJlbG93KG1xbC5tYXRjaGVzKTtcbiAgICBvbkJyZWFrcG9pbnQgPT09IG51bGwgfHwgb25CcmVha3BvaW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJyZWFrcG9pbnQobXFsLm1hdGNoZXMpO1xuICAgIGlmIChjb2xsYXBzZWQgIT09IG1xbC5tYXRjaGVzKSB7XG4gICAgICBoYW5kbGVTZXRDb2xsYXBzZWQobXFsLm1hdGNoZXMsICdyZXNwb25zaXZlJyk7XG4gICAgfVxuICB9O1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIHJlc3BvbnNpdmVIYW5kbGVyKG1xbCkge1xuICAgICAgcmV0dXJuIHJlc3BvbnNpdmVIYW5kbGVyUmVmLmN1cnJlbnQobXFsKTtcbiAgICB9XG4gICAgdmFyIG1xbDtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhciBfd2luZG93ID0gd2luZG93LFxuICAgICAgICBtYXRjaE1lZGlhID0gX3dpbmRvdy5tYXRjaE1lZGlhO1xuICAgICAgaWYgKG1hdGNoTWVkaWEgJiYgYnJlYWtwb2ludCAmJiBicmVha3BvaW50IGluIGRpbWVuc2lvbk1heE1hcCkge1xuICAgICAgICBtcWwgPSBtYXRjaE1lZGlhKFwiKG1heC13aWR0aDogXCIuY29uY2F0KGRpbWVuc2lvbk1heE1hcFticmVha3BvaW50XSwgXCIpXCIpKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBtcWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgcmVzcG9uc2l2ZUhhbmRsZXIpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIG1xbC5hZGRMaXN0ZW5lcihyZXNwb25zaXZlSGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzcG9uc2l2ZUhhbmRsZXIobXFsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG1xbCA9PT0gbnVsbCB8fCBtcWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1xbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCByZXNwb25zaXZlSGFuZGxlcik7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBtcWwgPT09IG51bGwgfHwgbXFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtcWwucmVtb3ZlTGlzdGVuZXIocmVzcG9uc2l2ZUhhbmRsZXIpO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFticmVha3BvaW50XSk7IC8vIGluIG9yZGVyIHRvIGFjY2VwdCBkeW5hbWljICdicmVha3BvaW50JyBwcm9wZXJ0eSwgd2UgbmVlZCB0byBhZGQgJ2JyZWFrcG9pbnQnIGludG8gZGVwZW5kZW5jeSBhcnJheS5cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdW5pcXVlSWQgPSBnZW5lcmF0ZUlkKCdhbnQtc2lkZXItJyk7XG4gICAgc2lkZXJIb29rLmFkZFNpZGVyKHVuaXF1ZUlkKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHNpZGVySG9vay5yZW1vdmVTaWRlcih1bmlxdWVJZCk7XG4gICAgfTtcbiAgfSwgW10pO1xuICB2YXIgdG9nZ2xlID0gZnVuY3Rpb24gdG9nZ2xlKCkge1xuICAgIGhhbmRsZVNldENvbGxhcHNlZCghY29sbGFwc2VkLCAnY2xpY2tUcmlnZ2VyJyk7XG4gIH07XG4gIHZhciBfdXNlQ29udGV4dDIgPSB1c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF91c2VDb250ZXh0Mi5nZXRQcmVmaXhDbHM7XG4gIHZhciByZW5kZXJTaWRlciA9IGZ1bmN0aW9uIHJlbmRlclNpZGVyKCkge1xuICAgIHZhciBfY2xhc3NOYW1lcztcbiAgICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdsYXlvdXQtc2lkZXInLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAgIHZhciBkaXZQcm9wcyA9IG9taXQocHJvcHMsIFsnY29sbGFwc2VkJ10pO1xuICAgIHZhciByYXdXaWR0aCA9IGNvbGxhcHNlZCA/IGNvbGxhcHNlZFdpZHRoIDogd2lkdGg7XG4gICAgLy8gdXNlIFwicHhcIiBhcyBmYWxsYmFjayB1bml0IGZvciB3aWR0aFxuICAgIHZhciBzaWRlcldpZHRoID0gaXNOdW1lcmljKHJhd1dpZHRoKSA/IFwiXCIuY29uY2F0KHJhd1dpZHRoLCBcInB4XCIpIDogU3RyaW5nKHJhd1dpZHRoKTtcbiAgICAvLyBzcGVjaWFsIHRyaWdnZXIgd2hlbiBjb2xsYXBzZWRXaWR0aCA9PSAwXG4gICAgdmFyIHplcm9XaWR0aFRyaWdnZXIgPSBwYXJzZUZsb2F0KFN0cmluZyhjb2xsYXBzZWRXaWR0aCB8fCAwKSkgPT09IDAgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgb25DbGljazogdG9nZ2xlLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItemVyby13aWR0aC10cmlnZ2VyXCIpLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXplcm8td2lkdGgtdHJpZ2dlci1cIikuY29uY2F0KHJldmVyc2VBcnJvdyA/ICdyaWdodCcgOiAnbGVmdCcpKSxcbiAgICAgIHN0eWxlOiB6ZXJvV2lkdGhUcmlnZ2VyU3R5bGVcbiAgICB9LCB0cmlnZ2VyIHx8IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEJhcnNPdXRsaW5lZCwgbnVsbCkpIDogbnVsbDtcbiAgICB2YXIgaWNvbk9iaiA9IHtcbiAgICAgIGV4cGFuZGVkOiByZXZlcnNlQXJyb3cgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSaWdodE91dGxpbmVkLCBudWxsKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExlZnRPdXRsaW5lZCwgbnVsbCksXG4gICAgICBjb2xsYXBzZWQ6IHJldmVyc2VBcnJvdyA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExlZnRPdXRsaW5lZCwgbnVsbCkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSaWdodE91dGxpbmVkLCBudWxsKVxuICAgIH07XG4gICAgdmFyIHN0YXR1cyA9IGNvbGxhcHNlZCA/ICdjb2xsYXBzZWQnIDogJ2V4cGFuZGVkJztcbiAgICB2YXIgZGVmYXVsdFRyaWdnZXIgPSBpY29uT2JqW3N0YXR1c107XG4gICAgdmFyIHRyaWdnZXJEb20gPSB0cmlnZ2VyICE9PSBudWxsID8gemVyb1dpZHRoVHJpZ2dlciB8fCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdHJpZ2dlclwiKSxcbiAgICAgIG9uQ2xpY2s6IHRvZ2dsZSxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIHdpZHRoOiBzaWRlcldpZHRoXG4gICAgICB9XG4gICAgfSwgdHJpZ2dlciB8fCBkZWZhdWx0VHJpZ2dlcikgOiBudWxsO1xuICAgIHZhciBkaXZTdHlsZSA9IF9leHRlbmRzKF9leHRlbmRzKHt9LCBzdHlsZSksIHtcbiAgICAgIGZsZXg6IFwiMCAwIFwiLmNvbmNhdChzaWRlcldpZHRoKSxcbiAgICAgIG1heFdpZHRoOiBzaWRlcldpZHRoLFxuICAgICAgbWluV2lkdGg6IHNpZGVyV2lkdGgsXG4gICAgICB3aWR0aDogc2lkZXJXaWR0aFxuICAgIH0pO1xuICAgIHZhciBzaWRlckNscyA9IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQodGhlbWUpLCAoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbGxhcHNlZFwiKSwgISFjb2xsYXBzZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGFzLXRyaWdnZXJcIiksIGNvbGxhcHNpYmxlICYmIHRyaWdnZXIgIT09IG51bGwgJiYgIXplcm9XaWR0aFRyaWdnZXIpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYmVsb3dcIiksICEhYmVsb3cpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItemVyby13aWR0aFwiKSwgcGFyc2VGbG9hdChzaWRlcldpZHRoKSA9PT0gMCksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJhc2lkZVwiLCBfZXh0ZW5kcyh7XG4gICAgICBjbGFzc05hbWU6IHNpZGVyQ2xzXG4gICAgfSwgZGl2UHJvcHMsIHtcbiAgICAgIHN0eWxlOiBkaXZTdHlsZSxcbiAgICAgIHJlZjogcmVmXG4gICAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jaGlsZHJlblwiKVxuICAgIH0sIGNoaWxkcmVuKSwgY29sbGFwc2libGUgfHwgYmVsb3cgJiYgemVyb1dpZHRoVHJpZ2dlciA/IHRyaWdnZXJEb20gOiBudWxsKTtcbiAgfTtcbiAgdmFyIGNvbnRleHRWYWx1ZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzaWRlckNvbGxhcHNlZDogY29sbGFwc2VkXG4gICAgfTtcbiAgfSwgW2NvbGxhcHNlZF0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2lkZXJDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGNvbnRleHRWYWx1ZVxuICB9LCByZW5kZXJTaWRlcigpKTtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgU2lkZXIuZGlzcGxheU5hbWUgPSAnU2lkZXInO1xufVxuZXhwb3J0IGRlZmF1bHQgU2lkZXI7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgRGl2aWRlciB9IGZyb20gJ3JjLW1lbnUnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG52YXIgTWVudURpdmlkZXIgPSBmdW5jdGlvbiBNZW51RGl2aWRlcihfYSkge1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gX2EucHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZSxcbiAgICBkYXNoZWQgPSBfYS5kYXNoZWQsXG4gICAgcmVzdFByb3BzID0gX19yZXN0KF9hLCBbXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJkYXNoZWRcIl0pO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscztcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnbWVudScsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIHZhciBjbGFzc1N0cmluZyA9IGNsYXNzTmFtZXMoX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tZGl2aWRlci1kYXNoZWRcIiksICEhZGFzaGVkKSwgY2xhc3NOYW1lKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERpdmlkZXIsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IGNsYXNzU3RyaW5nXG4gIH0sIHJlc3RQcm9wcykpO1xufTtcbmV4cG9ydCBkZWZhdWx0IE1lbnVEaXZpZGVyOyIsImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG52YXIgTWVudUNvbnRleHQgPSAvKiNfX1BVUkVfXyovY3JlYXRlQ29udGV4dCh7XG4gIHByZWZpeENsczogJycsXG4gIGZpcnN0TGV2ZWw6IHRydWUsXG4gIGlubGluZUNvbGxhcHNlZDogZmFsc2Vcbn0pO1xuZXhwb3J0IGRlZmF1bHQgTWVudUNvbnRleHQ7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c1wiO1xuaW1wb3J0IF9jcmVhdGVTdXBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlU3VwZXJcIjtcbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IEl0ZW0gfSBmcm9tICdyYy1tZW51JztcbmltcG9ydCB0b0FycmF5IGZyb20gXCJyYy11dGlsL2VzL0NoaWxkcmVuL3RvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFNpZGVyQ29udGV4dCB9IGZyb20gJy4uL2xheW91dC9TaWRlcic7XG5pbXBvcnQgVG9vbHRpcCBmcm9tICcuLi90b29sdGlwJztcbmltcG9ydCB7IGNsb25lRWxlbWVudCwgaXNWYWxpZEVsZW1lbnQgfSBmcm9tICcuLi9fdXRpbC9yZWFjdE5vZGUnO1xuaW1wb3J0IE1lbnVDb250ZXh0IGZyb20gJy4vTWVudUNvbnRleHQnO1xudmFyIE1lbnVJdGVtID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhNZW51SXRlbSwgX1JlYWN0JENvbXBvbmVudCk7XG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoTWVudUl0ZW0pO1xuICBmdW5jdGlvbiBNZW51SXRlbSgpIHtcbiAgICB2YXIgX3RoaXM7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1lbnVJdGVtKTtcbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF90aGlzLnJlbmRlckl0ZW0gPSBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIF9jbGFzc05hbWVzO1xuICAgICAgdmFyIHNpZGVyQ29sbGFwc2VkID0gX3JlZi5zaWRlckNvbGxhcHNlZDtcbiAgICAgIHZhciBfYTtcbiAgICAgIHZhciBfdGhpcyRjb250ZXh0ID0gX3RoaXMuY29udGV4dCxcbiAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkY29udGV4dC5wcmVmaXhDbHMsXG4gICAgICAgIGZpcnN0TGV2ZWwgPSBfdGhpcyRjb250ZXh0LmZpcnN0TGV2ZWwsXG4gICAgICAgIGlubGluZUNvbGxhcHNlZCA9IF90aGlzJGNvbnRleHQuaW5saW5lQ29sbGFwc2VkLFxuICAgICAgICBkaXJlY3Rpb24gPSBfdGhpcyRjb250ZXh0LmRpcmVjdGlvbixcbiAgICAgICAgZGlzYWJsZU1lbnVJdGVtVGl0bGVUb29sdGlwID0gX3RoaXMkY29udGV4dC5kaXNhYmxlTWVudUl0ZW1UaXRsZVRvb2x0aXA7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIF9iID0gX3RoaXMucHJvcHMsXG4gICAgICAgIHRpdGxlID0gX2IudGl0bGUsXG4gICAgICAgIGljb24gPSBfYi5pY29uLFxuICAgICAgICBkYW5nZXIgPSBfYi5kYW5nZXIsXG4gICAgICAgIHJlc3QgPSBfX3Jlc3QoX2IsIFtcInRpdGxlXCIsIFwiaWNvblwiLCBcImRhbmdlclwiXSk7XG4gICAgICB2YXIgdG9vbHRpcFRpdGxlID0gdGl0bGU7XG4gICAgICBpZiAodHlwZW9mIHRpdGxlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0b29sdGlwVGl0bGUgPSBmaXJzdExldmVsID8gY2hpbGRyZW4gOiAnJztcbiAgICAgIH0gZWxzZSBpZiAodGl0bGUgPT09IGZhbHNlKSB7XG4gICAgICAgIHRvb2x0aXBUaXRsZSA9ICcnO1xuICAgICAgfVxuICAgICAgdmFyIHRvb2x0aXBQcm9wcyA9IHtcbiAgICAgICAgdGl0bGU6IHRvb2x0aXBUaXRsZVxuICAgICAgfTtcbiAgICAgIGlmICghc2lkZXJDb2xsYXBzZWQgJiYgIWlubGluZUNvbGxhcHNlZCkge1xuICAgICAgICB0b29sdGlwUHJvcHMudGl0bGUgPSBudWxsO1xuICAgICAgICAvLyBSZXNldCBgb3BlbmAgdG8gZml4IGNvbnRyb2wgbW9kZSB0b29sdGlwIGRpc3BsYXkgbm90IGNvcnJlY3RcbiAgICAgICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8xNjc0MlxuICAgICAgICB0b29sdGlwUHJvcHMub3BlbiA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIGNoaWxkcmVuTGVuZ3RoID0gdG9BcnJheShjaGlsZHJlbikubGVuZ3RoO1xuICAgICAgdmFyIHJldHVybk5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJdGVtLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoKF9jbGFzc05hbWVzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLWRhbmdlclwiKSwgZGFuZ2VyKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tb25seS1jaGlsZFwiKSwgKGljb24gPyBjaGlsZHJlbkxlbmd0aCArIDEgOiBjaGlsZHJlbkxlbmd0aCkgPT09IDEpLCBfY2xhc3NOYW1lcyksIGNsYXNzTmFtZSksXG4gICAgICAgIHRpdGxlOiB0eXBlb2YgdGl0bGUgPT09ICdzdHJpbmcnID8gdGl0bGUgOiB1bmRlZmluZWRcbiAgICAgIH0pLCBjbG9uZUVsZW1lbnQoaWNvbiwge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoaXNWYWxpZEVsZW1lbnQoaWNvbikgPyAoX2EgPSBpY29uLnByb3BzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2xhc3NOYW1lIDogJycsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1pY29uXCIpKVxuICAgICAgfSksIF90aGlzLnJlbmRlckl0ZW1DaGlsZHJlbihpbmxpbmVDb2xsYXBzZWQpKTtcbiAgICAgIGlmICghZGlzYWJsZU1lbnVJdGVtVGl0bGVUb29sdGlwKSB7XG4gICAgICAgIHJldHVybk5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwLCBfZXh0ZW5kcyh7fSwgdG9vbHRpcFByb3BzLCB7XG4gICAgICAgICAgcGxhY2VtZW50OiBkaXJlY3Rpb24gPT09ICdydGwnID8gJ2xlZnQnIDogJ3JpZ2h0JyxcbiAgICAgICAgICBvdmVybGF5Q2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWlubGluZS1jb2xsYXBzZWQtdG9vbHRpcFwiKVxuICAgICAgICB9KSwgcmV0dXJuTm9kZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0dXJuTm9kZTtcbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICBfY3JlYXRlQ2xhc3MoTWVudUl0ZW0sIFt7XG4gICAga2V5OiBcInJlbmRlckl0ZW1DaGlsZHJlblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJJdGVtQ2hpbGRyZW4oaW5saW5lQ29sbGFwc2VkKSB7XG4gICAgICB2YXIgX3RoaXMkY29udGV4dDIgPSB0aGlzLmNvbnRleHQsXG4gICAgICAgIHByZWZpeENscyA9IF90aGlzJGNvbnRleHQyLnByZWZpeENscyxcbiAgICAgICAgZmlyc3RMZXZlbCA9IF90aGlzJGNvbnRleHQyLmZpcnN0TGV2ZWw7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgaWNvbiA9IF90aGlzJHByb3BzMi5pY29uLFxuICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzMi5jaGlsZHJlbjtcbiAgICAgIHZhciB3cmFwTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10aXRsZS1jb250ZW50XCIpXG4gICAgICB9LCBjaGlsZHJlbik7XG4gICAgICAvLyBpbmxpbmUtY29sbGFwc2VkLm1kIGRlbW8g5L6d6LWWIHNwYW4g5p2l6ZqQ6JeP5paH5a2XLOaciSBpY29uIOWxnuaAp++8jOWImeWGhemDqOWMheijueS4gOS4qiBzcGFuXG4gICAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vcHVsbC8yMzQ1NlxuICAgICAgaWYgKCFpY29uIHx8IGlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSAmJiBjaGlsZHJlbi50eXBlID09PSAnc3BhbicpIHtcbiAgICAgICAgaWYgKGNoaWxkcmVuICYmIGlubGluZUNvbGxhcHNlZCAmJiBmaXJzdExldmVsICYmIHR5cGVvZiBjaGlsZHJlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWlubGluZS1jb2xsYXBzZWQtbm9pY29uXCIpXG4gICAgICAgICAgfSwgY2hpbGRyZW4uY2hhckF0KDApKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHdyYXBOb2RlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNpZGVyQ29udGV4dC5Db25zdW1lciwgbnVsbCwgdGhpcy5yZW5kZXJJdGVtKTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIE1lbnVJdGVtO1xufShSZWFjdC5Db21wb25lbnQpO1xuZXhwb3J0IHsgTWVudUl0ZW0gYXMgZGVmYXVsdCB9O1xuTWVudUl0ZW0uY29udGV4dFR5cGUgPSBNZW51Q29udGV4dDsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgU3ViTWVudSBhcyBSY1N1Yk1lbnUsIHVzZUZ1bGxQYXRoIH0gZnJvbSAncmMtbWVudSc7XG5pbXBvcnQgb21pdCBmcm9tIFwicmMtdXRpbC9lcy9vbWl0XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjbG9uZUVsZW1lbnQsIGlzVmFsaWRFbGVtZW50IH0gZnJvbSAnLi4vX3V0aWwvcmVhY3ROb2RlJztcbmltcG9ydCBNZW51Q29udGV4dCBmcm9tICcuL01lbnVDb250ZXh0JztcbmZ1bmN0aW9uIFN1Yk1lbnUocHJvcHMpIHtcbiAgdmFyIF9hO1xuICB2YXIgcG9wdXBDbGFzc05hbWUgPSBwcm9wcy5wb3B1cENsYXNzTmFtZSxcbiAgICBpY29uID0gcHJvcHMuaWNvbixcbiAgICB0aXRsZSA9IHByb3BzLnRpdGxlLFxuICAgIHRoZW1lID0gcHJvcHMudGhlbWU7XG4gIHZhciBjb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChNZW51Q29udGV4dCk7XG4gIHZhciBwcmVmaXhDbHMgPSBjb250ZXh0LnByZWZpeENscyxcbiAgICBpbmxpbmVDb2xsYXBzZWQgPSBjb250ZXh0LmlubGluZUNvbGxhcHNlZCxcbiAgICBhbnRkTWVudVRoZW1lID0gY29udGV4dC5hbnRkTWVudVRoZW1lO1xuICB2YXIgcGFyZW50UGF0aCA9IHVzZUZ1bGxQYXRoKCk7XG4gIHZhciB0aXRsZU5vZGU7XG4gIGlmICghaWNvbikge1xuICAgIHRpdGxlTm9kZSA9IGlubGluZUNvbGxhcHNlZCAmJiAhcGFyZW50UGF0aC5sZW5ndGggJiYgdGl0bGUgJiYgdHlwZW9mIHRpdGxlID09PSAnc3RyaW5nJyA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbmxpbmUtY29sbGFwc2VkLW5vaWNvblwiKVxuICAgIH0sIHRpdGxlLmNoYXJBdCgwKSkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRpdGxlLWNvbnRlbnRcIilcbiAgICB9LCB0aXRsZSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gaW5saW5lLWNvbGxhcHNlZC5tZCBkZW1vIOS+nei1liBzcGFuIOadpemakOiXj+aWh+WtlyzmnIkgaWNvbiDlsZ7mgKfvvIzliJnlhoXpg6jljIXoo7nkuIDkuKogc3BhblxuICAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9wdWxsLzIzNDU2XG4gICAgdmFyIHRpdGxlSXNTcGFuID0gaXNWYWxpZEVsZW1lbnQodGl0bGUpICYmIHRpdGxlLnR5cGUgPT09ICdzcGFuJztcbiAgICB0aXRsZU5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgY2xvbmVFbGVtZW50KGljb24sIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhpc1ZhbGlkRWxlbWVudChpY29uKSA/IChfYSA9IGljb24ucHJvcHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jbGFzc05hbWUgOiAnJywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLWljb25cIikpXG4gICAgfSksIHRpdGxlSXNTcGFuID8gdGl0bGUgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRpdGxlLWNvbnRlbnRcIilcbiAgICB9LCB0aXRsZSkpO1xuICB9XG4gIHZhciBjb250ZXh0VmFsdWUgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX2V4dGVuZHMoX2V4dGVuZHMoe30sIGNvbnRleHQpLCB7XG4gICAgICBmaXJzdExldmVsOiBmYWxzZVxuICAgIH0pO1xuICB9LCBbY29udGV4dF0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTWVudUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogY29udGV4dFZhbHVlXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJjU3ViTWVudSwgX2V4dGVuZHMoe30sIG9taXQocHJvcHMsIFsnaWNvbiddKSwge1xuICAgIHRpdGxlOiB0aXRsZU5vZGUsXG4gICAgcG9wdXBDbGFzc05hbWU6IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQodGhlbWUgfHwgYW50ZE1lbnVUaGVtZSksIHBvcHVwQ2xhc3NOYW1lKVxuICB9KSkpO1xufVxuZXhwb3J0IGRlZmF1bHQgU3ViTWVudTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgeyBJdGVtR3JvdXAgfSBmcm9tICdyYy1tZW51JztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBNZW51RGl2aWRlciBmcm9tICcuLi9NZW51RGl2aWRlcic7XG5pbXBvcnQgTWVudUl0ZW0gZnJvbSAnLi4vTWVudUl0ZW0nO1xuaW1wb3J0IFN1Yk1lbnUgZnJvbSAnLi4vU3ViTWVudSc7XG5mdW5jdGlvbiBjb252ZXJ0SXRlbXNUb05vZGVzKGxpc3QpIHtcbiAgcmV0dXJuIChsaXN0IHx8IFtdKS5tYXAoZnVuY3Rpb24gKG9wdCwgaW5kZXgpIHtcbiAgICBpZiAob3B0ICYmIF90eXBlb2Yob3B0KSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHZhciBfYSA9IG9wdCxcbiAgICAgICAgbGFiZWwgPSBfYS5sYWJlbCxcbiAgICAgICAgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbixcbiAgICAgICAga2V5ID0gX2Eua2V5LFxuICAgICAgICB0eXBlID0gX2EudHlwZSxcbiAgICAgICAgcmVzdFByb3BzID0gX19yZXN0KF9hLCBbXCJsYWJlbFwiLCBcImNoaWxkcmVuXCIsIFwia2V5XCIsIFwidHlwZVwiXSk7XG4gICAgICB2YXIgbWVyZ2VkS2V5ID0ga2V5ICE9PSBudWxsICYmIGtleSAhPT0gdm9pZCAwID8ga2V5IDogXCJ0bXAtXCIuY29uY2F0KGluZGV4KTtcbiAgICAgIC8vIE1lbnVJdGVtR3JvdXAgJiBTdWJNZW51SXRlbVxuICAgICAgaWYgKGNoaWxkcmVuIHx8IHR5cGUgPT09ICdncm91cCcpIHtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdncm91cCcpIHtcbiAgICAgICAgICAvLyBHcm91cFxuICAgICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJdGVtR3JvdXAsIF9leHRlbmRzKHtcbiAgICAgICAgICAgIGtleTogbWVyZ2VkS2V5XG4gICAgICAgICAgfSwgcmVzdFByb3BzLCB7XG4gICAgICAgICAgICB0aXRsZTogbGFiZWxcbiAgICAgICAgICB9KSwgY29udmVydEl0ZW1zVG9Ob2RlcyhjaGlsZHJlbikpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFN1YiBNZW51XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTdWJNZW51LCBfZXh0ZW5kcyh7XG4gICAgICAgICAga2V5OiBtZXJnZWRLZXlcbiAgICAgICAgfSwgcmVzdFByb3BzLCB7XG4gICAgICAgICAgdGl0bGU6IGxhYmVsXG4gICAgICAgIH0pLCBjb252ZXJ0SXRlbXNUb05vZGVzKGNoaWxkcmVuKSk7XG4gICAgICB9XG4gICAgICAvLyBNZW51SXRlbSAmIERpdmlkZXJcbiAgICAgIGlmICh0eXBlID09PSAnZGl2aWRlcicpIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE1lbnVEaXZpZGVyLCBfZXh0ZW5kcyh7XG4gICAgICAgICAga2V5OiBtZXJnZWRLZXlcbiAgICAgICAgfSwgcmVzdFByb3BzKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTWVudUl0ZW0sIF9leHRlbmRzKHtcbiAgICAgICAga2V5OiBtZXJnZWRLZXlcbiAgICAgIH0sIHJlc3RQcm9wcyksIGxhYmVsKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0pLmZpbHRlcihmdW5jdGlvbiAob3B0KSB7XG4gICAgcmV0dXJuIG9wdDtcbiAgfSk7XG59XG4vLyBGSVhNRTogTW92ZSBsb2dpYyBoZXJlIGluIHY1XG4vKipcbiAqIFdlIHNpbXBseSBjb252ZXJ0IGBpdGVtc2AgdG8gUmVhY3ROb2RlIGZvciByZXVzZSBvcmlnaW4gY29tcG9uZW50IGxvZ2ljLiBCdXQgd2UgbmVlZCBtb3ZlIGFsbCB0aGVcbiAqIGxvZ2ljIGZyb20gY29tcG9uZW50IGludG8gdGhpcyBob29rcyB3aGVuIGluIHY1XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUl0ZW1zKGl0ZW1zKSB7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWl0ZW1zKSB7XG4gICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuICAgIHJldHVybiBjb252ZXJ0SXRlbXNUb05vZGVzKGl0ZW1zKTtcbiAgfSwgW2l0ZW1zXSk7XG59IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuLyoqIEBpbnRlcm5hbCBPbmx5IHVzZWQgZm9yIERyb3Bkb3duIGNvbXBvbmVudC4gRG8gbm90IHVzZSB0aGlzIGluIHlvdXIgcHJvZHVjdGlvbi4gKi9cbnZhciBPdmVycmlkZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbi8qKiBAaW50ZXJuYWwgT25seSB1c2VkIGZvciBEcm9wZG93biBjb21wb25lbnQuIERvIG5vdCB1c2UgdGhpcyBpbiB5b3VyIHByb2R1Y3Rpb24uICovXG5leHBvcnQgdmFyIE92ZXJyaWRlUHJvdmlkZXIgPSBmdW5jdGlvbiBPdmVycmlkZVByb3ZpZGVyKF9hKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLFxuICAgIHJlc3RQcm9wcyA9IF9fcmVzdChfYSwgW1wiY2hpbGRyZW5cIl0pO1xuICB2YXIgb3ZlcnJpZGUgPSBSZWFjdC51c2VDb250ZXh0KE92ZXJyaWRlQ29udGV4dCk7XG4gIHZhciBjb250ZXh0ID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9leHRlbmRzKF9leHRlbmRzKHt9LCBvdmVycmlkZSksIHJlc3RQcm9wcyk7XG4gIH0sIFtvdmVycmlkZSwgcmVzdFByb3BzLnByZWZpeENscyxcbiAgLy8gcmVzdFByb3BzLmV4cGFuZEljb24sIE5vdCBtYXJrIGFzIGRlcHMgc2luY2UgdGhpcyBpcyBhIFJlYWN0Tm9kZVxuICByZXN0UHJvcHMubW9kZSwgcmVzdFByb3BzLnNlbGVjdGFibGVcbiAgLy8gcmVzdFByb3BzLnZhbGlkYXRvciwgTm90IG1hcmsgYXMgZGVwcyBzaW5jZSB0aGlzIGlzIGEgZnVuY3Rpb25cbiAgXSk7XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE92ZXJyaWRlQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBjb250ZXh0XG4gIH0sIGNoaWxkcmVuKTtcbn07XG5leHBvcnQgZGVmYXVsdCBPdmVycmlkZUNvbnRleHQ7IiwiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c1wiO1xuaW1wb3J0IF9jcmVhdGVTdXBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlU3VwZXJcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBFbGxpcHNpc091dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9FbGxpcHNpc091dGxpbmVkXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBSY01lbnUsIHsgSXRlbUdyb3VwIH0gZnJvbSAncmMtbWVudSc7XG5pbXBvcnQgdXNlRXZlbnQgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlRXZlbnRcIjtcbmltcG9ydCBvbWl0IGZyb20gXCJyYy11dGlsL2VzL29taXRcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGZvcndhcmRSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCB7IFNpZGVyQ29udGV4dCB9IGZyb20gJy4uL2xheW91dC9TaWRlcic7XG5pbXBvcnQgY29sbGFwc2VNb3Rpb24gZnJvbSAnLi4vX3V0aWwvbW90aW9uJztcbmltcG9ydCB7IGNsb25lRWxlbWVudCB9IGZyb20gJy4uL191dGlsL3JlYWN0Tm9kZSc7XG5pbXBvcnQgd2FybmluZyBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmltcG9ydCB1c2VJdGVtcyBmcm9tICcuL2hvb2tzL3VzZUl0ZW1zJztcbmltcG9ydCBNZW51Q29udGV4dCBmcm9tICcuL01lbnVDb250ZXh0JztcbmltcG9ydCBNZW51RGl2aWRlciBmcm9tICcuL01lbnVEaXZpZGVyJztcbmltcG9ydCBJdGVtIGZyb20gJy4vTWVudUl0ZW0nO1xuaW1wb3J0IE92ZXJyaWRlQ29udGV4dCBmcm9tICcuL092ZXJyaWRlQ29udGV4dCc7XG5pbXBvcnQgU3ViTWVudSBmcm9tICcuL1N1Yk1lbnUnO1xudmFyIEludGVybmFsTWVudSA9IC8qI19fUFVSRV9fKi9mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBfYTtcbiAgdmFyIG92ZXJyaWRlID0gUmVhY3QudXNlQ29udGV4dChPdmVycmlkZUNvbnRleHQpIHx8IHt9O1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICBnZXRQb3B1cENvbnRhaW5lciA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFBvcHVwQ29udGFpbmVyLFxuICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcbiAgdmFyIHJvb3RQcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoKTtcbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgX3Byb3BzJHRoZW1lID0gcHJvcHMudGhlbWUsXG4gICAgdGhlbWUgPSBfcHJvcHMkdGhlbWUgPT09IHZvaWQgMCA/ICdsaWdodCcgOiBfcHJvcHMkdGhlbWUsXG4gICAgZXhwYW5kSWNvbiA9IHByb3BzLmV4cGFuZEljb24sXG4gICAgX2ludGVybmFsRGlzYWJsZU1lbnVJdGVtVGl0bGVUb29sdGlwID0gcHJvcHMuX2ludGVybmFsRGlzYWJsZU1lbnVJdGVtVGl0bGVUb29sdGlwLFxuICAgIGlubGluZUNvbGxhcHNlZCA9IHByb3BzLmlubGluZUNvbGxhcHNlZCxcbiAgICBzaWRlckNvbGxhcHNlZCA9IHByb3BzLnNpZGVyQ29sbGFwc2VkLFxuICAgIGl0ZW1zID0gcHJvcHMuaXRlbXMsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBtb2RlID0gcHJvcHMubW9kZSxcbiAgICBzZWxlY3RhYmxlID0gcHJvcHMuc2VsZWN0YWJsZSxcbiAgICBvbkNsaWNrID0gcHJvcHMub25DbGljayxcbiAgICByZXN0UHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcImNsYXNzTmFtZVwiLCBcInRoZW1lXCIsIFwiZXhwYW5kSWNvblwiLCBcIl9pbnRlcm5hbERpc2FibGVNZW51SXRlbVRpdGxlVG9vbHRpcFwiLCBcImlubGluZUNvbGxhcHNlZFwiLCBcInNpZGVyQ29sbGFwc2VkXCIsIFwiaXRlbXNcIiwgXCJjaGlsZHJlblwiLCBcIm1vZGVcIiwgXCJzZWxlY3RhYmxlXCIsIFwib25DbGlja1wiXSk7XG4gIHZhciBwYXNzZWRQcm9wcyA9IG9taXQocmVzdFByb3BzLCBbJ2NvbGxhcHNlZFdpZHRoJ10pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IEl0ZW1zID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbWVyZ2VkQ2hpbGRyZW4gPSB1c2VJdGVtcyhpdGVtcykgfHwgY2hpbGRyZW47XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBXYXJuaW5nID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoISgnaW5saW5lQ29sbGFwc2VkJyBpbiBwcm9wcyAmJiBtb2RlICE9PSAnaW5saW5lJyksICdNZW51JywgJ2BpbmxpbmVDb2xsYXBzZWRgIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBgbW9kZWAgaXMgaW5saW5lLicpIDogdm9pZCAwO1xuICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCEocHJvcHMuc2lkZXJDb2xsYXBzZWQgIT09IHVuZGVmaW5lZCAmJiAnaW5saW5lQ29sbGFwc2VkJyBpbiBwcm9wcyksICdNZW51JywgJ2BpbmxpbmVDb2xsYXBzZWRgIG5vdCBjb250cm9sIE1lbnUgdW5kZXIgU2lkZXIuIFNob3VsZCBzZXQgYGNvbGxhcHNlZGAgb24gU2lkZXIgaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZygnaXRlbXMnIGluIHByb3BzICYmICFjaGlsZHJlbiwgJ01lbnUnLCAnYGNoaWxkcmVuYCB3aWxsIGJlIHJlbW92ZWQgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLiBQbGVhc2UgdXNlIGBpdGVtc2AgaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgKF9hID0gb3ZlcnJpZGUudmFsaWRhdG9yKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChvdmVycmlkZSwge1xuICAgIG1vZGU6IG1vZGVcbiAgfSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IENsaWNrID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFRlbGwgZHJvcGRvd24gdGhhdCBpdGVtIGNsaWNrZWRcbiAgdmFyIG9uSXRlbUNsaWNrID0gdXNlRXZlbnQoZnVuY3Rpb24gKCkge1xuICAgIHZhciBfYTtcbiAgICBvbkNsaWNrID09PSBudWxsIHx8IG9uQ2xpY2sgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2xpY2suYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuICAgIChfYSA9IG92ZXJyaWRlID09PSBudWxsIHx8IG92ZXJyaWRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvdmVycmlkZS5vbkNsaWNrKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChvdmVycmlkZSk7XG4gIH0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBNb2RlID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbWVyZ2VkTW9kZSA9IG92ZXJyaWRlLm1vZGUgfHwgbW9kZTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gU2VsZWN0YWJsZSA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG1lcmdlZFNlbGVjdGFibGUgPSBzZWxlY3RhYmxlICE9PSBudWxsICYmIHNlbGVjdGFibGUgIT09IHZvaWQgMCA/IHNlbGVjdGFibGUgOiBvdmVycmlkZS5zZWxlY3RhYmxlO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gQ29sbGFwc2VkID09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbmxpbmUgQ29sbGFwc2VkXG4gIHZhciBtZXJnZWRJbmxpbmVDb2xsYXBzZWQgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc2lkZXJDb2xsYXBzZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHNpZGVyQ29sbGFwc2VkO1xuICAgIH1cbiAgICByZXR1cm4gaW5saW5lQ29sbGFwc2VkO1xuICB9LCBbaW5saW5lQ29sbGFwc2VkLCBzaWRlckNvbGxhcHNlZF0pO1xuICB2YXIgZGVmYXVsdE1vdGlvbnMgPSB7XG4gICAgaG9yaXpvbnRhbDoge1xuICAgICAgbW90aW9uTmFtZTogXCJcIi5jb25jYXQocm9vdFByZWZpeENscywgXCItc2xpZGUtdXBcIilcbiAgICB9LFxuICAgIGlubGluZTogY29sbGFwc2VNb3Rpb24sXG4gICAgb3RoZXI6IHtcbiAgICAgIG1vdGlvbk5hbWU6IFwiXCIuY29uY2F0KHJvb3RQcmVmaXhDbHMsIFwiLXpvb20tYmlnXCIpXG4gICAgfVxuICB9O1xuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdtZW51JywgY3VzdG9taXplUHJlZml4Q2xzIHx8IG92ZXJyaWRlLnByZWZpeENscyk7XG4gIHZhciBtZW51Q2xhc3NOYW1lID0gY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQodGhlbWUpLCBjbGFzc05hbWUpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IEV4cGFuZCBJY29uID09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbWVyZ2VkRXhwYW5kSWNvbjtcbiAgaWYgKHR5cGVvZiBleHBhbmRJY29uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgbWVyZ2VkRXhwYW5kSWNvbiA9IGV4cGFuZEljb247XG4gIH0gZWxzZSB7XG4gICAgbWVyZ2VkRXhwYW5kSWNvbiA9IGNsb25lRWxlbWVudChleHBhbmRJY29uIHx8IG92ZXJyaWRlLmV4cGFuZEljb24sIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zdWJtZW51LWV4cGFuZC1pY29uXCIpXG4gICAgfSk7XG4gIH1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IENvbnRleHQgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGNvbnRleHRWYWx1ZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIGlubGluZUNvbGxhcHNlZDogbWVyZ2VkSW5saW5lQ29sbGFwc2VkIHx8IGZhbHNlLFxuICAgICAgYW50ZE1lbnVUaGVtZTogdGhlbWUsXG4gICAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICAgIGZpcnN0TGV2ZWw6IHRydWUsXG4gICAgICBkaXNhYmxlTWVudUl0ZW1UaXRsZVRvb2x0aXA6IF9pbnRlcm5hbERpc2FibGVNZW51SXRlbVRpdGxlVG9vbHRpcFxuICAgIH07XG4gIH0sIFtwcmVmaXhDbHMsIG1lcmdlZElubGluZUNvbGxhcHNlZCwgdGhlbWUsIGRpcmVjdGlvbiwgX2ludGVybmFsRGlzYWJsZU1lbnVJdGVtVGl0bGVUb29sdGlwXSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChPdmVycmlkZUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogbnVsbFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNZW51Q29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBjb250ZXh0VmFsdWVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmNNZW51LCBfZXh0ZW5kcyh7XG4gICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFBvcHVwQ29udGFpbmVyLFxuICAgIG92ZXJmbG93ZWRJbmRpY2F0b3I6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsbGlwc2lzT3V0bGluZWQsIG51bGwpLFxuICAgIG92ZXJmbG93ZWRJbmRpY2F0b3JQb3B1cENsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHRoZW1lKSxcbiAgICBtb2RlOiBtZXJnZWRNb2RlLFxuICAgIHNlbGVjdGFibGU6IG1lcmdlZFNlbGVjdGFibGUsXG4gICAgb25DbGljazogb25JdGVtQ2xpY2tcbiAgfSwgcGFzc2VkUHJvcHMsIHtcbiAgICBpbmxpbmVDb2xsYXBzZWQ6IG1lcmdlZElubGluZUNvbGxhcHNlZCxcbiAgICBjbGFzc05hbWU6IG1lbnVDbGFzc05hbWUsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uOiBkaXJlY3Rpb24sXG4gICAgZGVmYXVsdE1vdGlvbnM6IGRlZmF1bHRNb3Rpb25zLFxuICAgIGV4cGFuZEljb246IG1lcmdlZEV4cGFuZEljb24sXG4gICAgcmVmOiByZWZcbiAgfSksIG1lcmdlZENoaWxkcmVuKSkpO1xufSk7XG4vLyBXZSBzaG91bGQga2VlcCB0aGlzIGFzIHJlZi1hYmxlXG52YXIgTWVudSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoTWVudSwgX1JlYWN0JENvbXBvbmVudCk7XG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoTWVudSk7XG4gIGZ1bmN0aW9uIE1lbnUoKSB7XG4gICAgdmFyIF90aGlzO1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNZW51KTtcbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF90aGlzLmZvY3VzID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgIHZhciBfYTtcbiAgICAgIChfYSA9IF90aGlzLm1lbnUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5mb2N1cyhvcHRpb25zKTtcbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICBfY3JlYXRlQ2xhc3MoTWVudSwgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNpZGVyQ29udGV4dC5Db25zdW1lciwgbnVsbCwgZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEludGVybmFsTWVudSwgX2V4dGVuZHMoe1xuICAgICAgICAgIHJlZjogZnVuY3Rpb24gcmVmKG5vZGUpIHtcbiAgICAgICAgICAgIF90aGlzMi5tZW51ID0gbm9kZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIF90aGlzMi5wcm9wcywgY29udGV4dCkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBNZW51O1xufShSZWFjdC5Db21wb25lbnQpO1xuTWVudS5EaXZpZGVyID0gTWVudURpdmlkZXI7XG5NZW51Lkl0ZW0gPSBJdGVtO1xuTWVudS5TdWJNZW51ID0gU3ViTWVudTtcbk1lbnUuSXRlbUdyb3VwID0gSXRlbUdyb3VwO1xuZXhwb3J0IGRlZmF1bHQgTWVudTsiLCJ2YXIgYXV0b0FkanVzdE92ZXJmbG93ID0ge1xuICBhZGp1c3RYOiAxLFxuICBhZGp1c3RZOiAxXG59O1xudmFyIHRhcmdldE9mZnNldCA9IFswLCAwXTtcbnZhciBwbGFjZW1lbnRzID0ge1xuICB0b3BMZWZ0OiB7XG4gICAgcG9pbnRzOiBbJ2JsJywgJ3RsJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvdyxcbiAgICBvZmZzZXQ6IFswLCAtNF0sXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgfSxcbiAgdG9wQ2VudGVyOiB7XG4gICAgcG9pbnRzOiBbJ2JjJywgJ3RjJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvdyxcbiAgICBvZmZzZXQ6IFswLCAtNF0sXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgfSxcbiAgdG9wUmlnaHQ6IHtcbiAgICBwb2ludHM6IFsnYnInLCAndHInXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIC00XSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICBib3R0b21MZWZ0OiB7XG4gICAgcG9pbnRzOiBbJ3RsJywgJ2JsJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvdyxcbiAgICBvZmZzZXQ6IFswLCA0XSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICBib3R0b21DZW50ZXI6IHtcbiAgICBwb2ludHM6IFsndGMnLCAnYmMnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIDRdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIGJvdHRvbVJpZ2h0OiB7XG4gICAgcG9pbnRzOiBbJ3RyJywgJ2JyJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvdyxcbiAgICBvZmZzZXQ6IFswLCA0XSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgcGxhY2VtZW50czsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgS2V5Q29kZSBmcm9tIFwicmMtdXRpbC9lcy9LZXlDb2RlXCI7XG5pbXBvcnQgcmFmIGZyb20gXCJyYy11dGlsL2VzL3JhZlwiO1xuaW1wb3J0IHsgZ2V0Rm9jdXNOb2RlTGlzdCB9IGZyb20gXCJyYy11dGlsL2VzL0RvbS9mb2N1c1wiO1xudmFyIEVTQyA9IEtleUNvZGUuRVNDLFxuICAgIFRBQiA9IEtleUNvZGUuVEFCO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlQWNjZXNzaWJpbGl0eShfcmVmKSB7XG4gIHZhciB2aXNpYmxlID0gX3JlZi52aXNpYmxlLFxuICAgICAgc2V0VHJpZ2dlclZpc2libGUgPSBfcmVmLnNldFRyaWdnZXJWaXNpYmxlLFxuICAgICAgdHJpZ2dlclJlZiA9IF9yZWYudHJpZ2dlclJlZixcbiAgICAgIG9uVmlzaWJsZUNoYW5nZSA9IF9yZWYub25WaXNpYmxlQ2hhbmdlLFxuICAgICAgYXV0b0ZvY3VzID0gX3JlZi5hdXRvRm9jdXM7XG4gIHZhciBmb2N1c01lbnVSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuXG4gIHZhciBoYW5kbGVDbG9zZU1lbnVBbmRSZXR1cm5Gb2N1cyA9IGZ1bmN0aW9uIGhhbmRsZUNsb3NlTWVudUFuZFJldHVybkZvY3VzKCkge1xuICAgIGlmICh2aXNpYmxlICYmIHRyaWdnZXJSZWYuY3VycmVudCkge1xuICAgICAgdmFyIF90cmlnZ2VyUmVmJGN1cnJlbnQsIF90cmlnZ2VyUmVmJGN1cnJlbnQkdCwgX3RyaWdnZXJSZWYkY3VycmVudCR0MiwgX3RyaWdnZXJSZWYkY3VycmVudCR0MztcblxuICAgICAgKF90cmlnZ2VyUmVmJGN1cnJlbnQgPSB0cmlnZ2VyUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF90cmlnZ2VyUmVmJGN1cnJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfdHJpZ2dlclJlZiRjdXJyZW50JHQgPSBfdHJpZ2dlclJlZiRjdXJyZW50LnRyaWdnZXJSZWYpID09PSBudWxsIHx8IF90cmlnZ2VyUmVmJGN1cnJlbnQkdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF90cmlnZ2VyUmVmJGN1cnJlbnQkdDIgPSBfdHJpZ2dlclJlZiRjdXJyZW50JHQuY3VycmVudCkgPT09IG51bGwgfHwgX3RyaWdnZXJSZWYkY3VycmVudCR0MiA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF90cmlnZ2VyUmVmJGN1cnJlbnQkdDMgPSBfdHJpZ2dlclJlZiRjdXJyZW50JHQyLmZvY3VzKSA9PT0gbnVsbCB8fCBfdHJpZ2dlclJlZiRjdXJyZW50JHQzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdHJpZ2dlclJlZiRjdXJyZW50JHQzLmNhbGwoX3RyaWdnZXJSZWYkY3VycmVudCR0Mik7XG4gICAgICBzZXRUcmlnZ2VyVmlzaWJsZShmYWxzZSk7XG5cbiAgICAgIGlmICh0eXBlb2Ygb25WaXNpYmxlQ2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9uVmlzaWJsZUNoYW5nZShmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHZhciBmb2N1c01lbnUgPSBmdW5jdGlvbiBmb2N1c01lbnUoKSB7XG4gICAgdmFyIF90cmlnZ2VyUmVmJGN1cnJlbnQyLCBfdHJpZ2dlclJlZiRjdXJyZW50MiQsIF90cmlnZ2VyUmVmJGN1cnJlbnQyJDIsIF90cmlnZ2VyUmVmJGN1cnJlbnQyJDM7XG5cbiAgICB2YXIgZWxlbWVudHMgPSBnZXRGb2N1c05vZGVMaXN0KChfdHJpZ2dlclJlZiRjdXJyZW50MiA9IHRyaWdnZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX3RyaWdnZXJSZWYkY3VycmVudDIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfdHJpZ2dlclJlZiRjdXJyZW50MiQgPSBfdHJpZ2dlclJlZiRjdXJyZW50Mi5wb3B1cFJlZikgPT09IG51bGwgfHwgX3RyaWdnZXJSZWYkY3VycmVudDIkID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX3RyaWdnZXJSZWYkY3VycmVudDIkMiA9IF90cmlnZ2VyUmVmJGN1cnJlbnQyJC5jdXJyZW50KSA9PT0gbnVsbCB8fCBfdHJpZ2dlclJlZiRjdXJyZW50MiQyID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX3RyaWdnZXJSZWYkY3VycmVudDIkMyA9IF90cmlnZ2VyUmVmJGN1cnJlbnQyJDIuZ2V0RWxlbWVudCkgPT09IG51bGwgfHwgX3RyaWdnZXJSZWYkY3VycmVudDIkMyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RyaWdnZXJSZWYkY3VycmVudDIkMy5jYWxsKF90cmlnZ2VyUmVmJGN1cnJlbnQyJDIpKTtcbiAgICB2YXIgZmlyc3RFbGVtZW50ID0gZWxlbWVudHNbMF07XG5cbiAgICBpZiAoZmlyc3RFbGVtZW50ID09PSBudWxsIHx8IGZpcnN0RWxlbWVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZmlyc3RFbGVtZW50LmZvY3VzKSB7XG4gICAgICBmaXJzdEVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIGZvY3VzTWVudVJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICB2YXIgaGFuZGxlS2V5RG93biA9IGZ1bmN0aW9uIGhhbmRsZUtleURvd24oZXZlbnQpIHtcbiAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcbiAgICAgIGNhc2UgRVNDOlxuICAgICAgICBoYW5kbGVDbG9zZU1lbnVBbmRSZXR1cm5Gb2N1cygpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUQUI6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgZm9jdXNSZXN1bHQgPSBmYWxzZTtcblxuICAgICAgICAgIGlmICghZm9jdXNNZW51UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIGZvY3VzUmVzdWx0ID0gZm9jdXNNZW51KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZvY3VzUmVzdWx0KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVDbG9zZU1lbnVBbmRSZXR1cm5Gb2N1cygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICB9O1xuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHZpc2libGUpIHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgaGFuZGxlS2V5RG93bik7XG5cbiAgICAgIGlmIChhdXRvRm9jdXMpIHtcbiAgICAgICAgLy8gRklYTUU6IGhhY2sgd2l0aCByYWZcbiAgICAgICAgcmFmKGZvY3VzTWVudSwgMyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgaGFuZGxlS2V5RG93bik7XG4gICAgICAgIGZvY3VzTWVudVJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBmb2N1c01lbnVSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH07XG4gIH0sIFt2aXNpYmxlXSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG59IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiYXJyb3dcIiwgXCJwcmVmaXhDbHNcIiwgXCJ0cmFuc2l0aW9uTmFtZVwiLCBcImFuaW1hdGlvblwiLCBcImFsaWduXCIsIFwicGxhY2VtZW50XCIsIFwicGxhY2VtZW50c1wiLCBcImdldFBvcHVwQ29udGFpbmVyXCIsIFwic2hvd0FjdGlvblwiLCBcImhpZGVBY3Rpb25cIiwgXCJvdmVybGF5Q2xhc3NOYW1lXCIsIFwib3ZlcmxheVN0eWxlXCIsIFwidmlzaWJsZVwiLCBcInRyaWdnZXJcIiwgXCJhdXRvRm9jdXNcIl07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgVHJpZ2dlciBmcm9tICdyYy10cmlnZ2VyJztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFBsYWNlbWVudHMgZnJvbSAnLi9wbGFjZW1lbnRzJztcbmltcG9ydCB1c2VBY2Nlc3NpYmlsaXR5IGZyb20gJy4vaG9va3MvdXNlQWNjZXNzaWJpbGl0eSc7XG5cbmZ1bmN0aW9uIERyb3Bkb3duKHByb3BzLCByZWYpIHtcbiAgdmFyIF9wcm9wcyRhcnJvdyA9IHByb3BzLmFycm93LFxuICAgICAgYXJyb3cgPSBfcHJvcHMkYXJyb3cgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGFycm93LFxuICAgICAgX3Byb3BzJHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIHByZWZpeENscyA9IF9wcm9wcyRwcmVmaXhDbHMgPT09IHZvaWQgMCA/ICdyYy1kcm9wZG93bicgOiBfcHJvcHMkcHJlZml4Q2xzLFxuICAgICAgdHJhbnNpdGlvbk5hbWUgPSBwcm9wcy50cmFuc2l0aW9uTmFtZSxcbiAgICAgIGFuaW1hdGlvbiA9IHByb3BzLmFuaW1hdGlvbixcbiAgICAgIGFsaWduID0gcHJvcHMuYWxpZ24sXG4gICAgICBfcHJvcHMkcGxhY2VtZW50ID0gcHJvcHMucGxhY2VtZW50LFxuICAgICAgcGxhY2VtZW50ID0gX3Byb3BzJHBsYWNlbWVudCA9PT0gdm9pZCAwID8gJ2JvdHRvbUxlZnQnIDogX3Byb3BzJHBsYWNlbWVudCxcbiAgICAgIF9wcm9wcyRwbGFjZW1lbnRzID0gcHJvcHMucGxhY2VtZW50cyxcbiAgICAgIHBsYWNlbWVudHMgPSBfcHJvcHMkcGxhY2VtZW50cyA9PT0gdm9pZCAwID8gUGxhY2VtZW50cyA6IF9wcm9wcyRwbGFjZW1lbnRzLFxuICAgICAgZ2V0UG9wdXBDb250YWluZXIgPSBwcm9wcy5nZXRQb3B1cENvbnRhaW5lcixcbiAgICAgIHNob3dBY3Rpb24gPSBwcm9wcy5zaG93QWN0aW9uLFxuICAgICAgaGlkZUFjdGlvbiA9IHByb3BzLmhpZGVBY3Rpb24sXG4gICAgICBvdmVybGF5Q2xhc3NOYW1lID0gcHJvcHMub3ZlcmxheUNsYXNzTmFtZSxcbiAgICAgIG92ZXJsYXlTdHlsZSA9IHByb3BzLm92ZXJsYXlTdHlsZSxcbiAgICAgIHZpc2libGUgPSBwcm9wcy52aXNpYmxlLFxuICAgICAgX3Byb3BzJHRyaWdnZXIgPSBwcm9wcy50cmlnZ2VyLFxuICAgICAgdHJpZ2dlciA9IF9wcm9wcyR0cmlnZ2VyID09PSB2b2lkIDAgPyBbJ2hvdmVyJ10gOiBfcHJvcHMkdHJpZ2dlcixcbiAgICAgIGF1dG9Gb2N1cyA9IHByb3BzLmF1dG9Gb2N1cyxcbiAgICAgIG90aGVyUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKCksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICAgIHRyaWdnZXJWaXNpYmxlID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICAgIHNldFRyaWdnZXJWaXNpYmxlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcblxuICB2YXIgbWVyZ2VkVmlzaWJsZSA9ICd2aXNpYmxlJyBpbiBwcm9wcyA/IHZpc2libGUgOiB0cmlnZ2VyVmlzaWJsZTtcbiAgdmFyIHRyaWdnZXJSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRyaWdnZXJSZWYuY3VycmVudDtcbiAgfSk7XG4gIHVzZUFjY2Vzc2liaWxpdHkoe1xuICAgIHZpc2libGU6IG1lcmdlZFZpc2libGUsXG4gICAgc2V0VHJpZ2dlclZpc2libGU6IHNldFRyaWdnZXJWaXNpYmxlLFxuICAgIHRyaWdnZXJSZWY6IHRyaWdnZXJSZWYsXG4gICAgb25WaXNpYmxlQ2hhbmdlOiBwcm9wcy5vblZpc2libGVDaGFuZ2UsXG4gICAgYXV0b0ZvY3VzOiBhdXRvRm9jdXNcbiAgfSk7XG5cbiAgdmFyIGdldE92ZXJsYXlFbGVtZW50ID0gZnVuY3Rpb24gZ2V0T3ZlcmxheUVsZW1lbnQoKSB7XG4gICAgdmFyIG92ZXJsYXkgPSBwcm9wcy5vdmVybGF5O1xuICAgIHZhciBvdmVybGF5RWxlbWVudDtcblxuICAgIGlmICh0eXBlb2Ygb3ZlcmxheSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb3ZlcmxheUVsZW1lbnQgPSBvdmVybGF5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG92ZXJsYXlFbGVtZW50ID0gb3ZlcmxheTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3ZlcmxheUVsZW1lbnQ7XG4gIH07XG5cbiAgdmFyIG9uQ2xpY2sgPSBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICB2YXIgb25PdmVybGF5Q2xpY2sgPSBwcm9wcy5vbk92ZXJsYXlDbGljaztcbiAgICBzZXRUcmlnZ2VyVmlzaWJsZShmYWxzZSk7XG5cbiAgICBpZiAob25PdmVybGF5Q2xpY2spIHtcbiAgICAgIG9uT3ZlcmxheUNsaWNrKGUpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgb25WaXNpYmxlQ2hhbmdlID0gZnVuY3Rpb24gb25WaXNpYmxlQ2hhbmdlKG5ld1Zpc2libGUpIHtcbiAgICB2YXIgb25WaXNpYmxlQ2hhbmdlUHJvcCA9IHByb3BzLm9uVmlzaWJsZUNoYW5nZTtcbiAgICBzZXRUcmlnZ2VyVmlzaWJsZShuZXdWaXNpYmxlKTtcblxuICAgIGlmICh0eXBlb2Ygb25WaXNpYmxlQ2hhbmdlUHJvcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb25WaXNpYmxlQ2hhbmdlUHJvcChuZXdWaXNpYmxlKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGdldE1lbnVFbGVtZW50ID0gZnVuY3Rpb24gZ2V0TWVudUVsZW1lbnQoKSB7XG4gICAgdmFyIG92ZXJsYXlFbGVtZW50ID0gZ2V0T3ZlcmxheUVsZW1lbnQoKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIGFycm93ICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hcnJvd1wiKVxuICAgIH0pLCBvdmVybGF5RWxlbWVudCk7XG4gIH07XG5cbiAgdmFyIGdldE1lbnVFbGVtZW50T3JMYW1iZGEgPSBmdW5jdGlvbiBnZXRNZW51RWxlbWVudE9yTGFtYmRhKCkge1xuICAgIHZhciBvdmVybGF5ID0gcHJvcHMub3ZlcmxheTtcblxuICAgIGlmICh0eXBlb2Ygb3ZlcmxheSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGdldE1lbnVFbGVtZW50O1xuICAgIH1cblxuICAgIHJldHVybiBnZXRNZW51RWxlbWVudCgpO1xuICB9O1xuXG4gIHZhciBnZXRNaW5PdmVybGF5V2lkdGhNYXRjaFRyaWdnZXIgPSBmdW5jdGlvbiBnZXRNaW5PdmVybGF5V2lkdGhNYXRjaFRyaWdnZXIoKSB7XG4gICAgdmFyIG1pbk92ZXJsYXlXaWR0aE1hdGNoVHJpZ2dlciA9IHByb3BzLm1pbk92ZXJsYXlXaWR0aE1hdGNoVHJpZ2dlcixcbiAgICAgICAgYWxpZ25Qb2ludCA9IHByb3BzLmFsaWduUG9pbnQ7XG5cbiAgICBpZiAoJ21pbk92ZXJsYXlXaWR0aE1hdGNoVHJpZ2dlcicgaW4gcHJvcHMpIHtcbiAgICAgIHJldHVybiBtaW5PdmVybGF5V2lkdGhNYXRjaFRyaWdnZXI7XG4gICAgfVxuXG4gICAgcmV0dXJuICFhbGlnblBvaW50O1xuICB9O1xuXG4gIHZhciBnZXRPcGVuQ2xhc3NOYW1lID0gZnVuY3Rpb24gZ2V0T3BlbkNsYXNzTmFtZSgpIHtcbiAgICB2YXIgb3BlbkNsYXNzTmFtZSA9IHByb3BzLm9wZW5DbGFzc05hbWU7XG5cbiAgICBpZiAob3BlbkNsYXNzTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gb3BlbkNsYXNzTmFtZTtcbiAgICB9XG5cbiAgICByZXR1cm4gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1vcGVuXCIpO1xuICB9O1xuXG4gIHZhciByZW5kZXJDaGlsZHJlbiA9IGZ1bmN0aW9uIHJlbmRlckNoaWxkcmVuKCkge1xuICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuICAgIHZhciBjaGlsZHJlblByb3BzID0gY2hpbGRyZW4ucHJvcHMgPyBjaGlsZHJlbi5wcm9wcyA6IHt9O1xuICAgIHZhciBjaGlsZENsYXNzTmFtZSA9IGNsYXNzTmFtZXMoY2hpbGRyZW5Qcm9wcy5jbGFzc05hbWUsIGdldE9wZW5DbGFzc05hbWUoKSk7XG4gICAgcmV0dXJuIG1lcmdlZFZpc2libGUgJiYgY2hpbGRyZW4gPyAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkcmVuLCB7XG4gICAgICBjbGFzc05hbWU6IGNoaWxkQ2xhc3NOYW1lXG4gICAgfSkgOiBjaGlsZHJlbjtcbiAgfTtcblxuICB2YXIgdHJpZ2dlckhpZGVBY3Rpb24gPSBoaWRlQWN0aW9uO1xuXG4gIGlmICghdHJpZ2dlckhpZGVBY3Rpb24gJiYgdHJpZ2dlci5pbmRleE9mKCdjb250ZXh0TWVudScpICE9PSAtMSkge1xuICAgIHRyaWdnZXJIaWRlQWN0aW9uID0gWydjbGljayddO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRyaWdnZXIsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7XG4gICAgYnVpbHRpblBsYWNlbWVudHM6IHBsYWNlbWVudHNcbiAgfSwgb3RoZXJQcm9wcyksIHt9LCB7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgcmVmOiB0cmlnZ2VyUmVmLFxuICAgIHBvcHVwQ2xhc3NOYW1lOiBjbGFzc05hbWVzKG92ZXJsYXlDbGFzc05hbWUsIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zaG93LWFycm93XCIpLCBhcnJvdykpLFxuICAgIHBvcHVwU3R5bGU6IG92ZXJsYXlTdHlsZSxcbiAgICBhY3Rpb246IHRyaWdnZXIsXG4gICAgc2hvd0FjdGlvbjogc2hvd0FjdGlvbixcbiAgICBoaWRlQWN0aW9uOiB0cmlnZ2VySGlkZUFjdGlvbiB8fCBbXSxcbiAgICBwb3B1cFBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgIHBvcHVwQWxpZ246IGFsaWduLFxuICAgIHBvcHVwVHJhbnNpdGlvbk5hbWU6IHRyYW5zaXRpb25OYW1lLFxuICAgIHBvcHVwQW5pbWF0aW9uOiBhbmltYXRpb24sXG4gICAgcG9wdXBWaXNpYmxlOiBtZXJnZWRWaXNpYmxlLFxuICAgIHN0cmV0Y2g6IGdldE1pbk92ZXJsYXlXaWR0aE1hdGNoVHJpZ2dlcigpID8gJ21pbldpZHRoJyA6ICcnLFxuICAgIHBvcHVwOiBnZXRNZW51RWxlbWVudE9yTGFtYmRhKCksXG4gICAgb25Qb3B1cFZpc2libGVDaGFuZ2U6IG9uVmlzaWJsZUNoYW5nZSxcbiAgICBvblBvcHVwQ2xpY2s6IG9uQ2xpY2ssXG4gICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFBvcHVwQ29udGFpbmVyXG4gIH0pLCByZW5kZXJDaGlsZHJlbigpKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoRHJvcGRvd24pOyIsImltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG52YXIgaWQgPSAwO1xudmFyIGlkcyA9IHt9O1xuLy8gU3VwcG9ydCBjYWxsIHJhZiB3aXRoIGRlbGF5IHNwZWNpZmllZCBmcmFtZVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gd3JhcHBlclJhZihjYWxsYmFjaykge1xuICB2YXIgZGVsYXlGcmFtZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDE7XG4gIHZhciBteUlkID0gaWQrKztcbiAgdmFyIHJlc3RGcmFtZXMgPSBkZWxheUZyYW1lcztcbiAgZnVuY3Rpb24gaW50ZXJuYWxDYWxsYmFjaygpIHtcbiAgICByZXN0RnJhbWVzIC09IDE7XG4gICAgaWYgKHJlc3RGcmFtZXMgPD0gMCkge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICAgIGRlbGV0ZSBpZHNbbXlJZF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlkc1tteUlkXSA9IHJhZihpbnRlcm5hbENhbGxiYWNrKTtcbiAgICB9XG4gIH1cbiAgaWRzW215SWRdID0gcmFmKGludGVybmFsQ2FsbGJhY2spO1xuICByZXR1cm4gbXlJZDtcbn1cbndyYXBwZXJSYWYuY2FuY2VsID0gZnVuY3Rpb24gY2FuY2VsKHBpZCkge1xuICBpZiAocGlkID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgcmFmLmNhbmNlbChpZHNbcGlkXSk7XG4gIGRlbGV0ZSBpZHNbcGlkXTtcbn07XG53cmFwcGVyUmFmLmlkcyA9IGlkczsgLy8gZXhwb3J0IHRoaXMgZm9yIHRlc3QgdXNhZ2UiLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX2NyZWF0ZVN1cGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlclwiO1xuaW1wb3J0IHsgdXBkYXRlQ1NTIH0gZnJvbSBcInJjLXV0aWwvZXMvRG9tL2R5bmFtaWNDU1NcIjtcbmltcG9ydCB7IGNvbXBvc2VSZWYsIHN1cHBvcnRSZWYgfSBmcm9tIFwicmMtdXRpbC9lcy9yZWZcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnN1bWVyLCBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCByYWYgZnJvbSAnLi9yYWYnO1xuaW1wb3J0IHsgY2xvbmVFbGVtZW50IH0gZnJvbSAnLi9yZWFjdE5vZGUnO1xudmFyIHN0eWxlRm9yUHNldWRvO1xuLy8gV2hlcmUgZWwgaXMgdGhlIERPTSBlbGVtZW50IHlvdSdkIGxpa2UgdG8gdGVzdCBmb3IgdmlzaWJpbGl0eVxuZnVuY3Rpb24gaXNIaWRkZW4oZWxlbWVudCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICd0ZXN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gIWVsZW1lbnQgfHwgZWxlbWVudC5vZmZzZXRQYXJlbnQgPT09IG51bGwgfHwgZWxlbWVudC5oaWRkZW47XG59XG5mdW5jdGlvbiBnZXRWYWxpZGF0ZUNvbnRhaW5lcihub2RlUm9vdCkge1xuICBpZiAobm9kZVJvb3QgaW5zdGFuY2VvZiBEb2N1bWVudCkge1xuICAgIHJldHVybiBub2RlUm9vdC5ib2R5O1xuICB9XG4gIHJldHVybiBBcnJheS5mcm9tKG5vZGVSb290LmNoaWxkTm9kZXMpLmZpbmQoZnVuY3Rpb24gKGVsZSkge1xuICAgIHJldHVybiAoZWxlID09PSBudWxsIHx8IGVsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWxlLm5vZGVUeXBlKSA9PT0gTm9kZS5FTEVNRU5UX05PREU7XG4gIH0pO1xufVxuZnVuY3Rpb24gaXNOb3RHcmV5KGNvbG9yKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuICB2YXIgbWF0Y2ggPSAoY29sb3IgfHwgJycpLm1hdGNoKC9yZ2JhP1xcKChcXGQqKSwgKFxcZCopLCAoXFxkKikoLCBbXFxkLl0qKT9cXCkvKTtcbiAgaWYgKG1hdGNoICYmIG1hdGNoWzFdICYmIG1hdGNoWzJdICYmIG1hdGNoWzNdKSB7XG4gICAgcmV0dXJuICEobWF0Y2hbMV0gPT09IG1hdGNoWzJdICYmIG1hdGNoWzJdID09PSBtYXRjaFszXSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG52YXIgV2F2ZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoV2F2ZSwgX1JlYWN0JENvbXBvbmVudCk7XG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoV2F2ZSk7XG4gIGZ1bmN0aW9uIFdhdmUoKSB7XG4gICAgdmFyIF90aGlzO1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBXYXZlKTtcbiAgICBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF90aGlzLmNvbnRhaW5lclJlZiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVSZWYoKTtcbiAgICBfdGhpcy5hbmltYXRpb25TdGFydCA9IGZhbHNlO1xuICAgIF90aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgIF90aGlzLm9uQ2xpY2sgPSBmdW5jdGlvbiAobm9kZSwgd2F2ZUNvbG9yKSB7XG4gICAgICB2YXIgX2EsIF9iO1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgIGluc2VydEV4dHJhTm9kZSA9IF90aGlzJHByb3BzLmluc2VydEV4dHJhTm9kZSxcbiAgICAgICAgZGlzYWJsZWQgPSBfdGhpcyRwcm9wcy5kaXNhYmxlZDtcbiAgICAgIGlmIChkaXNhYmxlZCB8fCAhbm9kZSB8fCBpc0hpZGRlbihub2RlKSB8fCBub2RlLmNsYXNzTmFtZS5pbmNsdWRlcygnLWxlYXZlJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgX3RoaXMuZXh0cmFOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB2YXIgX2Fzc2VydFRoaXNJbml0aWFsaXplID0gX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksXG4gICAgICAgIGV4dHJhTm9kZSA9IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZS5leHRyYU5vZGU7XG4gICAgICB2YXIgZ2V0UHJlZml4Q2xzID0gX3RoaXMuY29udGV4dC5nZXRQcmVmaXhDbHM7XG4gICAgICBleHRyYU5vZGUuY2xhc3NOYW1lID0gXCJcIi5jb25jYXQoZ2V0UHJlZml4Q2xzKCcnKSwgXCItY2xpY2stYW5pbWF0aW5nLW5vZGVcIik7XG4gICAgICB2YXIgYXR0cmlidXRlTmFtZSA9IF90aGlzLmdldEF0dHJpYnV0ZU5hbWUoKTtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsICd0cnVlJyk7XG4gICAgICAvLyBOb3Qgd2hpdGUgb3IgdHJhbnNwYXJlbnQgb3IgZ3JleVxuICAgICAgaWYgKHdhdmVDb2xvciAmJiB3YXZlQ29sb3IgIT09ICcjZmZmJyAmJiB3YXZlQ29sb3IgIT09ICcjZmZmZmZmJyAmJiB3YXZlQ29sb3IgIT09ICdyZ2IoMjU1LCAyNTUsIDI1NSknICYmIHdhdmVDb2xvciAhPT0gJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMSknICYmIGlzTm90R3JleSh3YXZlQ29sb3IpICYmICEvcmdiYVxcKCg/OlxcZCosICl7M30wXFwpLy50ZXN0KHdhdmVDb2xvcikgJiZcbiAgICAgIC8vIGFueSB0cmFuc3BhcmVudCByZ2JhIGNvbG9yXG4gICAgICB3YXZlQ29sb3IgIT09ICd0cmFuc3BhcmVudCcpIHtcbiAgICAgICAgZXh0cmFOb2RlLnN0eWxlLmJvcmRlckNvbG9yID0gd2F2ZUNvbG9yO1xuICAgICAgICB2YXIgbm9kZVJvb3QgPSAoKF9hID0gbm9kZS5nZXRSb290Tm9kZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwobm9kZSkpIHx8IG5vZGUub3duZXJEb2N1bWVudDtcbiAgICAgICAgdmFyIG5vZGVCb2R5ID0gKF9iID0gZ2V0VmFsaWRhdGVDb250YWluZXIobm9kZVJvb3QpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBub2RlUm9vdDtcbiAgICAgICAgc3R5bGVGb3JQc2V1ZG8gPSB1cGRhdGVDU1MoXCJcXG4gICAgICBbXCIuY29uY2F0KGdldFByZWZpeENscygnJyksIFwiLWNsaWNrLWFuaW1hdGluZy13aXRob3V0LWV4dHJhLW5vZGU9J3RydWUnXTo6YWZ0ZXIsIC5cIikuY29uY2F0KGdldFByZWZpeENscygnJyksIFwiLWNsaWNrLWFuaW1hdGluZy1ub2RlIHtcXG4gICAgICAgIC0tYW50ZC13YXZlLXNoYWRvdy1jb2xvcjogXCIpLmNvbmNhdCh3YXZlQ29sb3IsIFwiO1xcbiAgICAgIH1cIiksICdhbnRkLXdhdmUnLCB7XG4gICAgICAgICAgY3NwOiBfdGhpcy5jc3AsXG4gICAgICAgICAgYXR0YWNoVG86IG5vZGVCb2R5XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGluc2VydEV4dHJhTm9kZSkge1xuICAgICAgICBub2RlLmFwcGVuZENoaWxkKGV4dHJhTm9kZSk7XG4gICAgICB9XG4gICAgICBbJ3RyYW5zaXRpb24nLCAnYW5pbWF0aW9uJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJcIi5jb25jYXQobmFtZSwgXCJzdGFydFwiKSwgX3RoaXMub25UcmFuc2l0aW9uU3RhcnQpO1xuICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJcIi5jb25jYXQobmFtZSwgXCJlbmRcIiksIF90aGlzLm9uVHJhbnNpdGlvbkVuZCk7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIF90aGlzLm9uVHJhbnNpdGlvblN0YXJ0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChfdGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIG5vZGUgPSBfdGhpcy5jb250YWluZXJSZWYuY3VycmVudDtcbiAgICAgIGlmICghZSB8fCBlLnRhcmdldCAhPT0gbm9kZSB8fCBfdGhpcy5hbmltYXRpb25TdGFydCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBfdGhpcy5yZXNldEVmZmVjdChub2RlKTtcbiAgICB9O1xuICAgIF90aGlzLm9uVHJhbnNpdGlvbkVuZCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoIWUgfHwgZS5hbmltYXRpb25OYW1lICE9PSAnZmFkZUVmZmVjdCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgX3RoaXMucmVzZXRFZmZlY3QoZS50YXJnZXQpO1xuICAgIH07XG4gICAgX3RoaXMuYmluZEFuaW1hdGlvbkV2ZW50ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIGlmICghbm9kZSB8fCAhbm9kZS5nZXRBdHRyaWJ1dGUgfHwgbm9kZS5nZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgfHwgbm9kZS5jbGFzc05hbWUuaW5jbHVkZXMoJ2Rpc2FibGVkJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIG9uQ2xpY2sgPSBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgICAgLy8gRml4IHJhZGlvIGJ1dHRvbiBjbGljayB0d2ljZVxuICAgICAgICBpZiAoZS50YXJnZXQudGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCBpc0hpZGRlbihlLnRhcmdldCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgX3RoaXMucmVzZXRFZmZlY3Qobm9kZSk7XG4gICAgICAgIC8vIEdldCB3YXZlIGNvbG9yIGZyb20gdGFyZ2V0XG4gICAgICAgIHZhciB3YXZlQ29sb3IgPSBnZXRDb21wdXRlZFN0eWxlKG5vZGUpLmdldFByb3BlcnR5VmFsdWUoJ2JvcmRlci10b3AtY29sb3InKSB8fFxuICAgICAgICAvLyBGaXJlZm94IENvbXBhdGlibGVcbiAgICAgICAgZ2V0Q29tcHV0ZWRTdHlsZShub2RlKS5nZXRQcm9wZXJ0eVZhbHVlKCdib3JkZXItY29sb3InKSB8fCBnZXRDb21wdXRlZFN0eWxlKG5vZGUpLmdldFByb3BlcnR5VmFsdWUoJ2JhY2tncm91bmQtY29sb3InKTtcbiAgICAgICAgX3RoaXMuY2xpY2tXYXZlVGltZW91dElkID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfdGhpcy5vbkNsaWNrKG5vZGUsIHdhdmVDb2xvcik7XG4gICAgICAgIH0sIDApO1xuICAgICAgICByYWYuY2FuY2VsKF90aGlzLmFuaW1hdGlvblN0YXJ0SWQpO1xuICAgICAgICBfdGhpcy5hbmltYXRpb25TdGFydCA9IHRydWU7XG4gICAgICAgIC8vIFJlbmRlciB0byB0cmlnZ2VyIHRyYW5zaXRpb24gZXZlbnQgY29zdCAzIGZyYW1lcy4gTGV0J3MgZGVsYXkgMTAgZnJhbWVzIHRvIHJlc2V0IHRoaXMuXG4gICAgICAgIF90aGlzLmFuaW1hdGlvblN0YXJ0SWQgPSByYWYoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzLmFuaW1hdGlvblN0YXJ0ID0gZmFsc2U7XG4gICAgICAgIH0sIDEwKTtcbiAgICAgIH07XG4gICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25DbGljaywgdHJ1ZSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25DbGljaywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcbiAgICBfdGhpcy5yZW5kZXJXYXZlID0gZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgIHZhciBjc3AgPSBfcmVmLmNzcDtcbiAgICAgIHZhciBjaGlsZHJlbiA9IF90aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgICAgX3RoaXMuY3NwID0gY3NwO1xuICAgICAgaWYgKCEgLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSkgcmV0dXJuIGNoaWxkcmVuO1xuICAgICAgdmFyIHJlZiA9IF90aGlzLmNvbnRhaW5lclJlZjtcbiAgICAgIGlmIChzdXBwb3J0UmVmKGNoaWxkcmVuKSkge1xuICAgICAgICByZWYgPSBjb21wb3NlUmVmKGNoaWxkcmVuLnJlZiwgX3RoaXMuY29udGFpbmVyUmVmKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbG9uZUVsZW1lbnQoY2hpbGRyZW4sIHtcbiAgICAgICAgcmVmOiByZWZcbiAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIF9jcmVhdGVDbGFzcyhXYXZlLCBbe1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgICB2YXIgbm9kZSA9IHRoaXMuY29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgICBpZiAoIW5vZGUgfHwgbm9kZS5ub2RlVHlwZSAhPT0gMSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmluc3RhbmNlID0gdGhpcy5iaW5kQW5pbWF0aW9uRXZlbnQobm9kZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudFdpbGxVbm1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgaWYgKHRoaXMuaW5zdGFuY2UpIHtcbiAgICAgICAgdGhpcy5pbnN0YW5jZS5jYW5jZWwoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNsaWNrV2F2ZVRpbWVvdXRJZCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5jbGlja1dhdmVUaW1lb3V0SWQpO1xuICAgICAgfVxuICAgICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRBdHRyaWJ1dGVOYW1lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEF0dHJpYnV0ZU5hbWUoKSB7XG4gICAgICB2YXIgZ2V0UHJlZml4Q2xzID0gdGhpcy5jb250ZXh0LmdldFByZWZpeENscztcbiAgICAgIHZhciBpbnNlcnRFeHRyYU5vZGUgPSB0aGlzLnByb3BzLmluc2VydEV4dHJhTm9kZTtcbiAgICAgIHJldHVybiBpbnNlcnRFeHRyYU5vZGUgPyBcIlwiLmNvbmNhdChnZXRQcmVmaXhDbHMoJycpLCBcIi1jbGljay1hbmltYXRpbmdcIikgOiBcIlwiLmNvbmNhdChnZXRQcmVmaXhDbHMoJycpLCBcIi1jbGljay1hbmltYXRpbmctd2l0aG91dC1leHRyYS1ub2RlXCIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZXNldEVmZmVjdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNldEVmZmVjdChub2RlKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcbiAgICAgIGlmICghbm9kZSB8fCBub2RlID09PSB0aGlzLmV4dHJhTm9kZSB8fCAhKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgaW5zZXJ0RXh0cmFOb2RlID0gdGhpcy5wcm9wcy5pbnNlcnRFeHRyYU5vZGU7XG4gICAgICB2YXIgYXR0cmlidXRlTmFtZSA9IHRoaXMuZ2V0QXR0cmlidXRlTmFtZSgpO1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgJ2ZhbHNlJyk7IC8vIGVkZ2UgaGFzIGJ1ZyBvbiBgcmVtb3ZlQXR0cmlidXRlYCAjMTQ0NjZcbiAgICAgIGlmIChzdHlsZUZvclBzZXVkbykge1xuICAgICAgICBzdHlsZUZvclBzZXVkby5pbm5lckhUTUwgPSAnJztcbiAgICAgIH1cbiAgICAgIGlmIChpbnNlcnRFeHRyYU5vZGUgJiYgdGhpcy5leHRyYU5vZGUgJiYgbm9kZS5jb250YWlucyh0aGlzLmV4dHJhTm9kZSkpIHtcbiAgICAgICAgbm9kZS5yZW1vdmVDaGlsZCh0aGlzLmV4dHJhTm9kZSk7XG4gICAgICB9XG4gICAgICBbJ3RyYW5zaXRpb24nLCAnYW5pbWF0aW9uJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJcIi5jb25jYXQobmFtZSwgXCJzdGFydFwiKSwgX3RoaXMyLm9uVHJhbnNpdGlvblN0YXJ0KTtcbiAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKFwiXCIuY29uY2F0KG5hbWUsIFwiZW5kXCIpLCBfdGhpczIub25UcmFuc2l0aW9uRW5kKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbmZpZ0NvbnN1bWVyLCBudWxsLCB0aGlzLnJlbmRlcldhdmUpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gV2F2ZTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcbldhdmUuY29udGV4dFR5cGUgPSBDb25maWdDb250ZXh0O1xuZXhwb3J0IGRlZmF1bHQgV2F2ZTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4uL191dGlsL3dhcm5pbmcnO1xuZXhwb3J0IHZhciBHcm91cFNpemVDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQodW5kZWZpbmVkKTtcbnZhciBCdXR0b25Hcm91cCA9IGZ1bmN0aW9uIEJ1dHRvbkdyb3VwKHByb3BzKSB7XG4gIHZhciBfY2xhc3NOYW1lcztcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHNpemUgPSBwcm9wcy5zaXplLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBvdGhlcnMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcInNpemVcIiwgXCJjbGFzc05hbWVcIl0pO1xuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdidG4tZ3JvdXAnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAvLyBsYXJnZSA9PiBsZ1xuICAvLyBzbWFsbCA9PiBzbVxuICB2YXIgc2l6ZUNscyA9ICcnO1xuICBzd2l0Y2ggKHNpemUpIHtcbiAgICBjYXNlICdsYXJnZSc6XG4gICAgICBzaXplQ2xzID0gJ2xnJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NtYWxsJzpcbiAgICAgIHNpemVDbHMgPSAnc20nO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbWlkZGxlJzpcbiAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCFzaXplLCAnQnV0dG9uLkdyb3VwJywgJ0ludmFsaWQgcHJvcCBgc2l6ZWAuJykgOiB2b2lkIDA7XG4gIH1cbiAgdmFyIGNsYXNzZXMgPSBjbGFzc05hbWVzKHByZWZpeENscywgKF9jbGFzc05hbWVzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHNpemVDbHMpLCBzaXplQ2xzKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEdyb3VwU2l6ZUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogc2l6ZVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7fSwgb3RoZXJzLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgQnV0dG9uR3JvdXA7IiwiaW1wb3J0IExvYWRpbmdPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvTG9hZGluZ091dGxpbmVkXCI7XG5pbXBvcnQgQ1NTTW90aW9uIGZyb20gJ3JjLW1vdGlvbic7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIGdldENvbGxhcHNlZFdpZHRoID0gZnVuY3Rpb24gZ2V0Q29sbGFwc2VkV2lkdGgoKSB7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IDAsXG4gICAgb3BhY2l0eTogMCxcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgwKSdcbiAgfTtcbn07XG52YXIgZ2V0UmVhbFdpZHRoID0gZnVuY3Rpb24gZ2V0UmVhbFdpZHRoKG5vZGUpIHtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogbm9kZS5zY3JvbGxXaWR0aCxcbiAgICBvcGFjaXR5OiAxLFxuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDEpJ1xuICB9O1xufTtcbnZhciBMb2FkaW5nSWNvbiA9IGZ1bmN0aW9uIExvYWRpbmdJY29uKF9yZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgIGxvYWRpbmcgPSBfcmVmLmxvYWRpbmcsXG4gICAgZXhpc3RJY29uID0gX3JlZi5leGlzdEljb247XG4gIHZhciB2aXNpYmxlID0gISFsb2FkaW5nO1xuICBpZiAoZXhpc3RJY29uKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbG9hZGluZy1pY29uXCIpXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTG9hZGluZ091dGxpbmVkLCBudWxsKSk7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENTU01vdGlvbiwge1xuICAgIHZpc2libGU6IHZpc2libGUsXG4gICAgLy8gV2UgZG8gbm90IHJlYWxseSB1c2UgdGhpcyBtb3Rpb25OYW1lXG4gICAgbW90aW9uTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1sb2FkaW5nLWljb24tbW90aW9uXCIpLFxuICAgIHJlbW92ZU9uTGVhdmU6IHRydWUsXG4gICAgb25BcHBlYXJTdGFydDogZ2V0Q29sbGFwc2VkV2lkdGgsXG4gICAgb25BcHBlYXJBY3RpdmU6IGdldFJlYWxXaWR0aCxcbiAgICBvbkVudGVyU3RhcnQ6IGdldENvbGxhcHNlZFdpZHRoLFxuICAgIG9uRW50ZXJBY3RpdmU6IGdldFJlYWxXaWR0aCxcbiAgICBvbkxlYXZlU3RhcnQ6IGdldFJlYWxXaWR0aCxcbiAgICBvbkxlYXZlQWN0aXZlOiBnZXRDb2xsYXBzZWRXaWR0aFxuICB9LCBmdW5jdGlvbiAoX3JlZjIsIHJlZikge1xuICAgIHZhciBjbGFzc05hbWUgPSBfcmVmMi5jbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IF9yZWYyLnN0eWxlO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxvYWRpbmctaWNvblwiKSxcbiAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgIHJlZjogcmVmXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTG9hZGluZ091dGxpbmVkLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVxuICAgIH0pKTtcbiAgfSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgTG9hZGluZ0ljb247IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuLyogZXNsaW50LWRpc2FibGUgcmVhY3QvYnV0dG9uLWhhcy10eXBlICovXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBvbWl0IGZyb20gXCJyYy11dGlsL2VzL29taXRcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IERpc2FibGVkQ29udGV4dCBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvRGlzYWJsZWRDb250ZXh0JztcbmltcG9ydCBTaXplQ29udGV4dCBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvU2l6ZUNvbnRleHQnO1xuaW1wb3J0IHsgdXNlQ29tcGFjdEl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vc3BhY2UvQ29tcGFjdCc7XG5pbXBvcnQgeyBjbG9uZUVsZW1lbnQsIGlzRnJhZ21lbnQgfSBmcm9tICcuLi9fdXRpbC9yZWFjdE5vZGUnO1xuaW1wb3J0IHsgdHVwbGUgfSBmcm9tICcuLi9fdXRpbC90eXBlJztcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4uL191dGlsL3dhcm5pbmcnO1xuaW1wb3J0IFdhdmUgZnJvbSAnLi4vX3V0aWwvd2F2ZSc7XG5pbXBvcnQgR3JvdXAsIHsgR3JvdXBTaXplQ29udGV4dCB9IGZyb20gJy4vYnV0dG9uLWdyb3VwJztcbmltcG9ydCBMb2FkaW5nSWNvbiBmcm9tICcuL0xvYWRpbmdJY29uJztcbnZhciByeFR3b0NOQ2hhciA9IC9eW1xcdTRlMDAtXFx1OWZhNV17Mn0kLztcbnZhciBpc1R3b0NOQ2hhciA9IHJ4VHdvQ05DaGFyLnRlc3QuYmluZChyeFR3b0NOQ2hhcik7XG5mdW5jdGlvbiBpc1N0cmluZyhzdHIpIHtcbiAgcmV0dXJuIHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnO1xufVxuZnVuY3Rpb24gaXNVbkJvcmRlcmVkQnV0dG9uVHlwZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlID09PSAndGV4dCcgfHwgdHlwZSA9PT0gJ2xpbmsnO1xufVxuLy8gSW5zZXJ0IG9uZSBzcGFjZSBiZXR3ZWVuIHR3byBjaGluZXNlIGNoYXJhY3RlcnMgYXV0b21hdGljYWxseS5cbmZ1bmN0aW9uIGluc2VydFNwYWNlKGNoaWxkLCBuZWVkSW5zZXJ0ZWQpIHtcbiAgLy8gQ2hlY2sgdGhlIGNoaWxkIGlmIGlzIHVuZGVmaW5lZCBvciBudWxsLlxuICBpZiAoY2hpbGQgPT09IG51bGwgfHwgY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgU1BBQ0UgPSBuZWVkSW5zZXJ0ZWQgPyAnICcgOiAnJztcbiAgLy8gc3RyaWN0TnVsbENoZWNrcyBvb3BzLlxuICBpZiAodHlwZW9mIGNoaWxkICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgY2hpbGQgIT09ICdudW1iZXInICYmIGlzU3RyaW5nKGNoaWxkLnR5cGUpICYmIGlzVHdvQ05DaGFyKGNoaWxkLnByb3BzLmNoaWxkcmVuKSkge1xuICAgIHJldHVybiBjbG9uZUVsZW1lbnQoY2hpbGQsIHtcbiAgICAgIGNoaWxkcmVuOiBjaGlsZC5wcm9wcy5jaGlsZHJlbi5zcGxpdCgnJykuam9pbihTUEFDRSlcbiAgICB9KTtcbiAgfVxuICBpZiAodHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBpc1R3b0NOQ2hhcihjaGlsZCkgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgY2hpbGQuc3BsaXQoJycpLmpvaW4oU1BBQ0UpKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBjaGlsZCk7XG4gIH1cbiAgaWYgKGlzRnJhZ21lbnQoY2hpbGQpKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBjaGlsZCk7XG4gIH1cbiAgcmV0dXJuIGNoaWxkO1xufVxuZnVuY3Rpb24gc3BhY2VDaGlsZHJlbihjaGlsZHJlbiwgbmVlZEluc2VydGVkKSB7XG4gIHZhciBpc1ByZXZDaGlsZFB1cmUgPSBmYWxzZTtcbiAgdmFyIGNoaWxkTGlzdCA9IFtdO1xuICBSZWFjdC5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICB2YXIgdHlwZSA9IF90eXBlb2YoY2hpbGQpO1xuICAgIHZhciBpc0N1cnJlbnRDaGlsZFB1cmUgPSB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlID09PSAnbnVtYmVyJztcbiAgICBpZiAoaXNQcmV2Q2hpbGRQdXJlICYmIGlzQ3VycmVudENoaWxkUHVyZSkge1xuICAgICAgdmFyIGxhc3RJbmRleCA9IGNoaWxkTGlzdC5sZW5ndGggLSAxO1xuICAgICAgdmFyIGxhc3RDaGlsZCA9IGNoaWxkTGlzdFtsYXN0SW5kZXhdO1xuICAgICAgY2hpbGRMaXN0W2xhc3RJbmRleF0gPSBcIlwiLmNvbmNhdChsYXN0Q2hpbGQpLmNvbmNhdChjaGlsZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoaWxkTGlzdC5wdXNoKGNoaWxkKTtcbiAgICB9XG4gICAgaXNQcmV2Q2hpbGRQdXJlID0gaXNDdXJyZW50Q2hpbGRQdXJlO1xuICB9KTtcbiAgLy8gUGFzcyB0byBSZWFjdC5DaGlsZHJlbi5tYXAgdG8gYXV0byBmaWxsIGtleVxuICByZXR1cm4gUmVhY3QuQ2hpbGRyZW4ubWFwKGNoaWxkTGlzdCwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgcmV0dXJuIGluc2VydFNwYWNlKGNoaWxkLCBuZWVkSW5zZXJ0ZWQpO1xuICB9KTtcbn1cbnZhciBCdXR0b25UeXBlcyA9IHR1cGxlKCdkZWZhdWx0JywgJ3ByaW1hcnknLCAnZ2hvc3QnLCAnZGFzaGVkJywgJ2xpbmsnLCAndGV4dCcpO1xudmFyIEJ1dHRvblNoYXBlcyA9IHR1cGxlKCdkZWZhdWx0JywgJ2NpcmNsZScsICdyb3VuZCcpO1xudmFyIEJ1dHRvbkhUTUxUeXBlcyA9IHR1cGxlKCdzdWJtaXQnLCAnYnV0dG9uJywgJ3Jlc2V0Jyk7XG5leHBvcnQgZnVuY3Rpb24gY29udmVydExlZ2FjeVByb3BzKHR5cGUpIHtcbiAgaWYgKHR5cGUgPT09ICdkYW5nZXInKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRhbmdlcjogdHJ1ZVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiB0eXBlXG4gIH07XG59XG52YXIgSW50ZXJuYWxCdXR0b24gPSBmdW5jdGlvbiBJbnRlcm5hbEJ1dHRvbihwcm9wcywgcmVmKSB7XG4gIHZhciBfY2xhc3NOYW1lcztcbiAgdmFyIF9wcm9wcyRsb2FkaW5nID0gcHJvcHMubG9hZGluZyxcbiAgICBsb2FkaW5nID0gX3Byb3BzJGxvYWRpbmcgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGxvYWRpbmcsXG4gICAgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIF9wcm9wcyR0eXBlID0gcHJvcHMudHlwZSxcbiAgICB0eXBlID0gX3Byb3BzJHR5cGUgPT09IHZvaWQgMCA/ICdkZWZhdWx0JyA6IF9wcm9wcyR0eXBlLFxuICAgIGRhbmdlciA9IHByb3BzLmRhbmdlcixcbiAgICBfcHJvcHMkc2hhcGUgPSBwcm9wcy5zaGFwZSxcbiAgICBzaGFwZSA9IF9wcm9wcyRzaGFwZSA9PT0gdm9pZCAwID8gJ2RlZmF1bHQnIDogX3Byb3BzJHNoYXBlLFxuICAgIGN1c3RvbWl6ZVNpemUgPSBwcm9wcy5zaXplLFxuICAgIGN1c3RvbURpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgaWNvbiA9IHByb3BzLmljb24sXG4gICAgX3Byb3BzJGdob3N0ID0gcHJvcHMuZ2hvc3QsXG4gICAgZ2hvc3QgPSBfcHJvcHMkZ2hvc3QgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGdob3N0LFxuICAgIF9wcm9wcyRibG9jayA9IHByb3BzLmJsb2NrLFxuICAgIGJsb2NrID0gX3Byb3BzJGJsb2NrID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRibG9jayxcbiAgICBfcHJvcHMkaHRtbFR5cGUgPSBwcm9wcy5odG1sVHlwZSxcbiAgICBodG1sVHlwZSA9IF9wcm9wcyRodG1sVHlwZSA9PT0gdm9pZCAwID8gJ2J1dHRvbicgOiBfcHJvcHMkaHRtbFR5cGUsXG4gICAgcmVzdCA9IF9fcmVzdChwcm9wcywgW1wibG9hZGluZ1wiLCBcInByZWZpeENsc1wiLCBcInR5cGVcIiwgXCJkYW5nZXJcIiwgXCJzaGFwZVwiLCBcInNpemVcIiwgXCJkaXNhYmxlZFwiLCBcImNsYXNzTmFtZVwiLCBcImNoaWxkcmVuXCIsIFwiaWNvblwiLCBcImdob3N0XCIsIFwiYmxvY2tcIiwgXCJodG1sVHlwZVwiXSk7XG4gIHZhciBzaXplID0gUmVhY3QudXNlQ29udGV4dChTaXplQ29udGV4dCk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PSBEaXNhYmxlZCA9PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGRpc2FibGVkID0gUmVhY3QudXNlQ29udGV4dChEaXNhYmxlZENvbnRleHQpO1xuICB2YXIgbWVyZ2VkRGlzYWJsZWQgPSBjdXN0b21EaXNhYmxlZCAhPT0gbnVsbCAmJiBjdXN0b21EaXNhYmxlZCAhPT0gdm9pZCAwID8gY3VzdG9tRGlzYWJsZWQgOiBkaXNhYmxlZDtcbiAgdmFyIGdyb3VwU2l6ZSA9IFJlYWN0LnVzZUNvbnRleHQoR3JvdXBTaXplQ29udGV4dCk7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSghIWxvYWRpbmcpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIGlubmVyTG9hZGluZyA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0TG9hZGluZyA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUzID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUzLCAyKSxcbiAgICBoYXNUd29DTkNoYXIgPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgIHNldEhhc1R3b0NOQ2hhciA9IF9SZWFjdCR1c2VTdGF0ZTRbMV07XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCksXG4gICAgZ2V0UHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UHJlZml4Q2xzLFxuICAgIGF1dG9JbnNlcnRTcGFjZUluQnV0dG9uID0gX1JlYWN0JHVzZUNvbnRleHQuYXV0b0luc2VydFNwYWNlSW5CdXR0b24sXG4gICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuICB2YXIgYnV0dG9uUmVmID0gcmVmIHx8IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVSZWYoKTtcbiAgdmFyIGlzTmVlZEluc2VydGVkID0gZnVuY3Rpb24gaXNOZWVkSW5zZXJ0ZWQoKSB7XG4gICAgcmV0dXJuIFJlYWN0LkNoaWxkcmVuLmNvdW50KGNoaWxkcmVuKSA9PT0gMSAmJiAhaWNvbiAmJiAhaXNVbkJvcmRlcmVkQnV0dG9uVHlwZSh0eXBlKTtcbiAgfTtcbiAgdmFyIGZpeFR3b0NOQ2hhciA9IGZ1bmN0aW9uIGZpeFR3b0NOQ2hhcigpIHtcbiAgICAvLyBGaXggZm9yIEhPQyB1c2FnZSBsaWtlIDxGb3JtYXRNZXNzYWdlIC8+XG4gICAgaWYgKCFidXR0b25SZWYgfHwgIWJ1dHRvblJlZi5jdXJyZW50IHx8IGF1dG9JbnNlcnRTcGFjZUluQnV0dG9uID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgYnV0dG9uVGV4dCA9IGJ1dHRvblJlZi5jdXJyZW50LnRleHRDb250ZW50O1xuICAgIGlmIChpc05lZWRJbnNlcnRlZCgpICYmIGlzVHdvQ05DaGFyKGJ1dHRvblRleHQpKSB7XG4gICAgICBpZiAoIWhhc1R3b0NOQ2hhcikge1xuICAgICAgICBzZXRIYXNUd29DTkNoYXIodHJ1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChoYXNUd29DTkNoYXIpIHtcbiAgICAgIHNldEhhc1R3b0NOQ2hhcihmYWxzZSk7XG4gICAgfVxuICB9O1xuICAvLyA9PT09PT09PT09PT09PT0gVXBkYXRlIExvYWRpbmcgPT09PT09PT09PT09PT09XG4gIHZhciBsb2FkaW5nT3JEZWxheSA9IHR5cGVvZiBsb2FkaW5nID09PSAnYm9vbGVhbicgPyBsb2FkaW5nIDogKGxvYWRpbmcgPT09IG51bGwgfHwgbG9hZGluZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogbG9hZGluZy5kZWxheSkgfHwgdHJ1ZTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZGVsYXlUaW1lciA9IG51bGw7XG4gICAgaWYgKHR5cGVvZiBsb2FkaW5nT3JEZWxheSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGRlbGF5VGltZXIgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRlbGF5VGltZXIgPSBudWxsO1xuICAgICAgICBzZXRMb2FkaW5nKGxvYWRpbmdPckRlbGF5KTtcbiAgICAgIH0sIGxvYWRpbmdPckRlbGF5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0TG9hZGluZyhsb2FkaW5nT3JEZWxheSk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoZGVsYXlUaW1lcikge1xuICAgICAgICAvLyBpbiBvcmRlciB0byBub3QgcGVyZm9ybSBhIFJlYWN0IHN0YXRlIHVwZGF0ZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50XG4gICAgICAgIC8vIGFuZCBjbGVhciB0aW1lciBhZnRlciAnbG9hZGluZ09yRGVsYXknIHVwZGF0ZWQuXG4gICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoZGVsYXlUaW1lcik7XG4gICAgICAgIGRlbGF5VGltZXIgPSBudWxsO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFtsb2FkaW5nT3JEZWxheV0pO1xuICBSZWFjdC51c2VFZmZlY3QoZml4VHdvQ05DaGFyLCBbYnV0dG9uUmVmXSk7XG4gIHZhciBoYW5kbGVDbGljayA9IGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGUpIHtcbiAgICB2YXIgb25DbGljayA9IHByb3BzLm9uQ2xpY2s7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMzAyMDdcbiAgICBpZiAoaW5uZXJMb2FkaW5nIHx8IG1lcmdlZERpc2FibGVkKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG9uQ2xpY2sgPT09IG51bGwgfHwgb25DbGljayA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DbGljayhlKTtcbiAgfTtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghKHR5cGVvZiBpY29uID09PSAnc3RyaW5nJyAmJiBpY29uLmxlbmd0aCA+IDIpLCAnQnV0dG9uJywgXCJgaWNvbmAgaXMgdXNpbmcgUmVhY3ROb2RlIGluc3RlYWQgb2Ygc3RyaW5nIG5hbWluZyBpbiB2NC4gUGxlYXNlIGNoZWNrIGBcIi5jb25jYXQoaWNvbiwgXCJgIGF0IGh0dHBzOi8vYW50LmRlc2lnbi9jb21wb25lbnRzL2ljb25cIikpIDogdm9pZCAwO1xuICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCEoZ2hvc3QgJiYgaXNVbkJvcmRlcmVkQnV0dG9uVHlwZSh0eXBlKSksICdCdXR0b24nLCBcImBsaW5rYCBvciBgdGV4dGAgYnV0dG9uIGNhbid0IGJlIGEgYGdob3N0YCBidXR0b24uXCIpIDogdm9pZCAwO1xuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdidG4nLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgYXV0b0luc2VydFNwYWNlID0gYXV0b0luc2VydFNwYWNlSW5CdXR0b24gIT09IGZhbHNlO1xuICB2YXIgX3VzZUNvbXBhY3RJdGVtQ29udGV4ID0gdXNlQ29tcGFjdEl0ZW1Db250ZXh0KHByZWZpeENscywgZGlyZWN0aW9uKSxcbiAgICBjb21wYWN0U2l6ZSA9IF91c2VDb21wYWN0SXRlbUNvbnRleC5jb21wYWN0U2l6ZSxcbiAgICBjb21wYWN0SXRlbUNsYXNzbmFtZXMgPSBfdXNlQ29tcGFjdEl0ZW1Db250ZXguY29tcGFjdEl0ZW1DbGFzc25hbWVzO1xuICB2YXIgc2l6ZUNsYXNzTmFtZU1hcCA9IHtcbiAgICBsYXJnZTogJ2xnJyxcbiAgICBzbWFsbDogJ3NtJyxcbiAgICBtaWRkbGU6IHVuZGVmaW5lZFxuICB9O1xuICB2YXIgc2l6ZUZ1bGxuYW1lID0gY29tcGFjdFNpemUgfHwgZ3JvdXBTaXplIHx8IGN1c3RvbWl6ZVNpemUgfHwgc2l6ZTtcbiAgdmFyIHNpemVDbHMgPSBzaXplRnVsbG5hbWUgPyBzaXplQ2xhc3NOYW1lTWFwW3NpemVGdWxsbmFtZV0gfHwgJycgOiAnJztcbiAgdmFyIGljb25UeXBlID0gaW5uZXJMb2FkaW5nID8gJ2xvYWRpbmcnIDogaWNvbjtcbiAgdmFyIGxpbmtCdXR0b25SZXN0UHJvcHMgPSBvbWl0KHJlc3QsIFsnbmF2aWdhdGUnXSk7XG4gIHZhciBjbGFzc2VzID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChzaGFwZSksIHNoYXBlICE9PSAnZGVmYXVsdCcgJiYgc2hhcGUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdCh0eXBlKSwgdHlwZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHNpemVDbHMpLCBzaXplQ2xzKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWljb24tb25seVwiKSwgIWNoaWxkcmVuICYmIGNoaWxkcmVuICE9PSAwICYmICEhaWNvblR5cGUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYmFja2dyb3VuZC1naG9zdFwiKSwgZ2hvc3QgJiYgIWlzVW5Cb3JkZXJlZEJ1dHRvblR5cGUodHlwZSkpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbG9hZGluZ1wiKSwgaW5uZXJMb2FkaW5nKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXR3by1jaGluZXNlLWNoYXJzXCIpLCBoYXNUd29DTkNoYXIgJiYgYXV0b0luc2VydFNwYWNlICYmICFpbm5lckxvYWRpbmcpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYmxvY2tcIiksIGJsb2NrKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRhbmdlcm91c1wiKSwgISFkYW5nZXIpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRpc2FibGVkXCIpLCBsaW5rQnV0dG9uUmVzdFByb3BzLmhyZWYgIT09IHVuZGVmaW5lZCAmJiBtZXJnZWREaXNhYmxlZCksIF9jbGFzc05hbWVzKSwgY29tcGFjdEl0ZW1DbGFzc25hbWVzLCBjbGFzc05hbWUpO1xuICB2YXIgaWNvbk5vZGUgPSBpY29uICYmICFpbm5lckxvYWRpbmcgPyBpY29uIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTG9hZGluZ0ljb24sIHtcbiAgICBleGlzdEljb246ICEhaWNvbixcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBsb2FkaW5nOiAhIWlubmVyTG9hZGluZ1xuICB9KTtcbiAgdmFyIGtpZHMgPSBjaGlsZHJlbiB8fCBjaGlsZHJlbiA9PT0gMCA/IHNwYWNlQ2hpbGRyZW4oY2hpbGRyZW4sIGlzTmVlZEluc2VydGVkKCkgJiYgYXV0b0luc2VydFNwYWNlKSA6IG51bGw7XG4gIGlmIChsaW5rQnV0dG9uUmVzdFByb3BzLmhyZWYgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImFcIiwgX2V4dGVuZHMoe30sIGxpbmtCdXR0b25SZXN0UHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NlcyxcbiAgICAgIG9uQ2xpY2s6IGhhbmRsZUNsaWNrLFxuICAgICAgcmVmOiBidXR0b25SZWZcbiAgICB9KSwgaWNvbk5vZGUsIGtpZHMpO1xuICB9XG4gIHZhciBidXR0b25Ob2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICB0eXBlOiBodG1sVHlwZSxcbiAgICBjbGFzc05hbWU6IGNsYXNzZXMsXG4gICAgb25DbGljazogaGFuZGxlQ2xpY2ssXG4gICAgZGlzYWJsZWQ6IG1lcmdlZERpc2FibGVkLFxuICAgIHJlZjogYnV0dG9uUmVmXG4gIH0pLCBpY29uTm9kZSwga2lkcyk7XG4gIGlmIChpc1VuQm9yZGVyZWRCdXR0b25UeXBlKHR5cGUpKSB7XG4gICAgcmV0dXJuIGJ1dHRvbk5vZGU7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFdhdmUsIHtcbiAgICBkaXNhYmxlZDogISFpbm5lckxvYWRpbmdcbiAgfSwgYnV0dG9uTm9kZSk7XG59O1xudmFyIEJ1dHRvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEludGVybmFsQnV0dG9uKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIEJ1dHRvbi5kaXNwbGF5TmFtZSA9ICdCdXR0b24nO1xufVxuQnV0dG9uLkdyb3VwID0gR3JvdXA7XG5CdXR0b24uX19BTlRfQlVUVE9OID0gdHJ1ZTtcbmV4cG9ydCBkZWZhdWx0IEJ1dHRvbjsiLCJpbXBvcnQgY2FuVXNlRG9tIGZyb20gXCIuL2NhblVzZURvbVwiO1xudmFyIGlzU3R5bGVOYW1lU3VwcG9ydCA9IGZ1bmN0aW9uIGlzU3R5bGVOYW1lU3VwcG9ydChzdHlsZU5hbWUpIHtcbiAgaWYgKGNhblVzZURvbSgpICYmIHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICB2YXIgc3R5bGVOYW1lTGlzdCA9IEFycmF5LmlzQXJyYXkoc3R5bGVOYW1lKSA/IHN0eWxlTmFtZSA6IFtzdHlsZU5hbWVdO1xuICAgIHZhciBkb2N1bWVudEVsZW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIHJldHVybiBzdHlsZU5hbWVMaXN0LnNvbWUoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHJldHVybiBuYW1lIGluIGRvY3VtZW50RWxlbWVudC5zdHlsZTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xudmFyIGlzU3R5bGVWYWx1ZVN1cHBvcnQgPSBmdW5jdGlvbiBpc1N0eWxlVmFsdWVTdXBwb3J0KHN0eWxlTmFtZSwgdmFsdWUpIHtcbiAgaWYgKCFpc1N0eWxlTmFtZVN1cHBvcnQoc3R5bGVOYW1lKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgZWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHZhciBvcmlnaW4gPSBlbGUuc3R5bGVbc3R5bGVOYW1lXTtcbiAgZWxlLnN0eWxlW3N0eWxlTmFtZV0gPSB2YWx1ZTtcbiAgcmV0dXJuIGVsZS5zdHlsZVtzdHlsZU5hbWVdICE9PSBvcmlnaW47XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3R5bGVTdXBwb3J0KHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoc3R5bGVOYW1lKSAmJiBzdHlsZVZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gaXNTdHlsZVZhbHVlU3VwcG9ydChzdHlsZU5hbWUsIHN0eWxlVmFsdWUpO1xuICB9XG4gIHJldHVybiBpc1N0eWxlTmFtZVN1cHBvcnQoc3R5bGVOYW1lKTtcbn0iLCJpbXBvcnQgY2FuVXNlRG9tIGZyb20gXCJyYy11dGlsL2VzL0RvbS9jYW5Vc2VEb21cIjtcbmltcG9ydCB7IGlzU3R5bGVTdXBwb3J0IH0gZnJvbSBcInJjLXV0aWwvZXMvRG9tL3N0eWxlQ2hlY2tlclwiO1xuZXhwb3J0IHZhciBjYW5Vc2VEb2NFbGVtZW50ID0gZnVuY3Rpb24gY2FuVXNlRG9jRWxlbWVudCgpIHtcbiAgcmV0dXJuIGNhblVzZURvbSgpICYmIHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG59O1xuZXhwb3J0IHsgaXNTdHlsZVN1cHBvcnQgfTtcbnZhciBmbGV4R2FwU3VwcG9ydGVkO1xuZXhwb3J0IHZhciBkZXRlY3RGbGV4R2FwU3VwcG9ydGVkID0gZnVuY3Rpb24gZGV0ZWN0RmxleEdhcFN1cHBvcnRlZCgpIHtcbiAgaWYgKCFjYW5Vc2VEb2NFbGVtZW50KCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGZsZXhHYXBTdXBwb3J0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBmbGV4R2FwU3VwcG9ydGVkO1xuICB9XG4gIC8vIGNyZWF0ZSBmbGV4IGNvbnRhaW5lciB3aXRoIHJvdy1nYXAgc2V0XG4gIHZhciBmbGV4ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGZsZXguc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgZmxleC5zdHlsZS5mbGV4RGlyZWN0aW9uID0gJ2NvbHVtbic7XG4gIGZsZXguc3R5bGUucm93R2FwID0gJzFweCc7XG4gIC8vIGNyZWF0ZSB0d28sIGVsZW1lbnRzIGluc2lkZSBpdFxuICBmbGV4LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTtcbiAgZmxleC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7XG4gIC8vIGFwcGVuZCB0byB0aGUgRE9NIChuZWVkZWQgdG8gb2J0YWluIHNjcm9sbEhlaWdodClcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmbGV4KTtcbiAgZmxleEdhcFN1cHBvcnRlZCA9IGZsZXguc2Nyb2xsSGVpZ2h0ID09PSAxOyAvLyBmbGV4IGNvbnRhaW5lciBzaG91bGQgYmUgMXB4IGhpZ2ggZnJvbSB0aGUgcm93LWdhcFxuICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGZsZXgpO1xuICByZXR1cm4gZmxleEdhcFN1cHBvcnRlZDtcbn07IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBkZXRlY3RGbGV4R2FwU3VwcG9ydGVkIH0gZnJvbSAnLi4vc3R5bGVDaGVja2VyJztcbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoKSB7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShmYWxzZSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgZmxleGlibGUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldEZsZXhpYmxlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzZXRGbGV4aWJsZShkZXRlY3RGbGV4R2FwU3VwcG9ydGVkKCkpO1xuICB9LCBbXSk7XG4gIHJldHVybiBmbGV4aWJsZTtcbn0pOyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFNwYWNlQ29udGV4dCB9IGZyb20gJy4nO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gSXRlbShfcmVmKSB7XG4gIHZhciBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICBkaXJlY3Rpb24gPSBfcmVmLmRpcmVjdGlvbixcbiAgICBpbmRleCA9IF9yZWYuaW5kZXgsXG4gICAgbWFyZ2luRGlyZWN0aW9uID0gX3JlZi5tYXJnaW5EaXJlY3Rpb24sXG4gICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuLFxuICAgIHNwbGl0ID0gX3JlZi5zcGxpdCxcbiAgICB3cmFwID0gX3JlZi53cmFwO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFNwYWNlQ29udGV4dCksXG4gICAgaG9yaXpvbnRhbFNpemUgPSBfUmVhY3QkdXNlQ29udGV4dC5ob3Jpem9udGFsU2l6ZSxcbiAgICB2ZXJ0aWNhbFNpemUgPSBfUmVhY3QkdXNlQ29udGV4dC52ZXJ0aWNhbFNpemUsXG4gICAgbGF0ZXN0SW5kZXggPSBfUmVhY3QkdXNlQ29udGV4dC5sYXRlc3RJbmRleCxcbiAgICBzdXBwb3J0RmxleEdhcCA9IF9SZWFjdCR1c2VDb250ZXh0LnN1cHBvcnRGbGV4R2FwO1xuICB2YXIgc3R5bGUgPSB7fTtcbiAgaWYgKCFzdXBwb3J0RmxleEdhcCkge1xuICAgIGlmIChkaXJlY3Rpb24gPT09ICd2ZXJ0aWNhbCcpIHtcbiAgICAgIGlmIChpbmRleCA8IGxhdGVzdEluZGV4KSB7XG4gICAgICAgIHN0eWxlID0ge1xuICAgICAgICAgIG1hcmdpbkJvdHRvbTogaG9yaXpvbnRhbFNpemUgLyAoc3BsaXQgPyAyIDogMSlcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3R5bGUgPSBfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgaW5kZXggPCBsYXRlc3RJbmRleCAmJiBfZGVmaW5lUHJvcGVydHkoe30sIG1hcmdpbkRpcmVjdGlvbiwgaG9yaXpvbnRhbFNpemUgLyAoc3BsaXQgPyAyIDogMSkpKSwgd3JhcCAmJiB7XG4gICAgICAgIHBhZGRpbmdCb3R0b206IHZlcnRpY2FsU2l6ZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmIChjaGlsZHJlbiA9PT0gbnVsbCB8fCBjaGlsZHJlbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0sIGNoaWxkcmVuKSwgaW5kZXggPCBsYXRlc3RJbmRleCAmJiBzcGxpdCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoY2xhc3NOYW1lLCBcIi1zcGxpdFwiKSxcbiAgICBzdHlsZTogc3R5bGVcbiAgfSwgc3BsaXQpKTtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB0b0FycmF5IGZyb20gXCJyYy11dGlsL2VzL0NoaWxkcmVuL3RvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHVzZUZsZXhHYXBTdXBwb3J0IGZyb20gJy4uL191dGlsL2hvb2tzL3VzZUZsZXhHYXBTdXBwb3J0JztcbmltcG9ydCBJdGVtIGZyb20gJy4vSXRlbSc7XG5pbXBvcnQgQ29tcGFjdCBmcm9tICcuL0NvbXBhY3QnO1xuZXhwb3J0IHZhciBTcGFjZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7XG4gIGxhdGVzdEluZGV4OiAwLFxuICBob3Jpem9udGFsU2l6ZTogMCxcbiAgdmVydGljYWxTaXplOiAwLFxuICBzdXBwb3J0RmxleEdhcDogZmFsc2Vcbn0pO1xudmFyIHNwYWNlU2l6ZSA9IHtcbiAgc21hbGw6IDgsXG4gIG1pZGRsZTogMTYsXG4gIGxhcmdlOiAyNFxufTtcbmZ1bmN0aW9uIGdldE51bWJlclNpemUoc2l6ZSkge1xuICByZXR1cm4gdHlwZW9mIHNpemUgPT09ICdzdHJpbmcnID8gc3BhY2VTaXplW3NpemVdIDogc2l6ZSB8fCAwO1xufVxudmFyIFNwYWNlID0gZnVuY3Rpb24gU3BhY2UocHJvcHMpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICBzcGFjZSA9IF9SZWFjdCR1c2VDb250ZXh0LnNwYWNlLFxuICAgIGRpcmVjdGlvbkNvbmZpZyA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcbiAgdmFyIF9wcm9wcyRzaXplID0gcHJvcHMuc2l6ZSxcbiAgICBzaXplID0gX3Byb3BzJHNpemUgPT09IHZvaWQgMCA/IChzcGFjZSA9PT0gbnVsbCB8fCBzcGFjZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3BhY2Uuc2l6ZSkgfHwgJ3NtYWxsJyA6IF9wcm9wcyRzaXplLFxuICAgIGFsaWduID0gcHJvcHMuYWxpZ24sXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgX3Byb3BzJGRpcmVjdGlvbiA9IHByb3BzLmRpcmVjdGlvbixcbiAgICBkaXJlY3Rpb24gPSBfcHJvcHMkZGlyZWN0aW9uID09PSB2b2lkIDAgPyAnaG9yaXpvbnRhbCcgOiBfcHJvcHMkZGlyZWN0aW9uLFxuICAgIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBzcGxpdCA9IHByb3BzLnNwbGl0LFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgX3Byb3BzJHdyYXAgPSBwcm9wcy53cmFwLFxuICAgIHdyYXAgPSBfcHJvcHMkd3JhcCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkd3JhcCxcbiAgICBvdGhlclByb3BzID0gX19yZXN0KHByb3BzLCBbXCJzaXplXCIsIFwiYWxpZ25cIiwgXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiLCBcImRpcmVjdGlvblwiLCBcInByZWZpeENsc1wiLCBcInNwbGl0XCIsIFwic3R5bGVcIiwgXCJ3cmFwXCJdKTtcbiAgdmFyIHN1cHBvcnRGbGV4R2FwID0gdXNlRmxleEdhcFN1cHBvcnQoKTtcbiAgdmFyIF9SZWFjdCR1c2VNZW1vID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gKEFycmF5LmlzQXJyYXkoc2l6ZSkgPyBzaXplIDogW3NpemUsIHNpemVdKS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGdldE51bWJlclNpemUoaXRlbSk7XG4gICAgICB9KTtcbiAgICB9LCBbc2l6ZV0pLFxuICAgIF9SZWFjdCR1c2VNZW1vMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VNZW1vLCAyKSxcbiAgICBob3Jpem9udGFsU2l6ZSA9IF9SZWFjdCR1c2VNZW1vMlswXSxcbiAgICB2ZXJ0aWNhbFNpemUgPSBfUmVhY3QkdXNlTWVtbzJbMV07XG4gIHZhciBjaGlsZE5vZGVzID0gdG9BcnJheShjaGlsZHJlbiwge1xuICAgIGtlZXBFbXB0eTogdHJ1ZVxuICB9KTtcbiAgdmFyIG1lcmdlZEFsaWduID0gYWxpZ24gPT09IHVuZGVmaW5lZCAmJiBkaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJyA/ICdjZW50ZXInIDogYWxpZ247XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3NwYWNlJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIGNuID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChkaXJlY3Rpb24pLCAoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uQ29uZmlnID09PSAncnRsJyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hbGlnbi1cIikuY29uY2F0KG1lcmdlZEFsaWduKSwgbWVyZ2VkQWxpZ24pLCBfY2xhc3NOYW1lcyksIGNsYXNzTmFtZSk7XG4gIHZhciBpdGVtQ2xhc3NOYW1lID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtXCIpO1xuICB2YXIgbWFyZ2luRGlyZWN0aW9uID0gZGlyZWN0aW9uQ29uZmlnID09PSAncnRsJyA/ICdtYXJnaW5MZWZ0JyA6ICdtYXJnaW5SaWdodCc7XG4gIC8vIENhbGN1bGF0ZSBsYXRlc3Qgb25lXG4gIHZhciBsYXRlc3RJbmRleCA9IDA7XG4gIHZhciBub2RlcyA9IGNoaWxkTm9kZXMubWFwKGZ1bmN0aW9uIChjaGlsZCwgaSkge1xuICAgIGlmIChjaGlsZCAhPT0gbnVsbCAmJiBjaGlsZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsYXRlc3RJbmRleCA9IGk7XG4gICAgfVxuICAgIHZhciBrZXkgPSBjaGlsZCAmJiBjaGlsZC5rZXkgfHwgXCJcIi5jb25jYXQoaXRlbUNsYXNzTmFtZSwgXCItXCIpLmNvbmNhdChpKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSXRlbSwge1xuICAgICAgY2xhc3NOYW1lOiBpdGVtQ2xhc3NOYW1lLFxuICAgICAga2V5OiBrZXksXG4gICAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICAgIGluZGV4OiBpLFxuICAgICAgbWFyZ2luRGlyZWN0aW9uOiBtYXJnaW5EaXJlY3Rpb24sXG4gICAgICBzcGxpdDogc3BsaXQsXG4gICAgICB3cmFwOiB3cmFwXG4gICAgfSwgY2hpbGQpO1xuICB9KTtcbiAgdmFyIHNwYWNlQ29udGV4dCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBob3Jpem9udGFsU2l6ZTogaG9yaXpvbnRhbFNpemUsXG4gICAgICB2ZXJ0aWNhbFNpemU6IHZlcnRpY2FsU2l6ZSxcbiAgICAgIGxhdGVzdEluZGV4OiBsYXRlc3RJbmRleCxcbiAgICAgIHN1cHBvcnRGbGV4R2FwOiBzdXBwb3J0RmxleEdhcFxuICAgIH07XG4gIH0sIFtob3Jpem9udGFsU2l6ZSwgdmVydGljYWxTaXplLCBsYXRlc3RJbmRleCwgc3VwcG9ydEZsZXhHYXBdKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgaWYgKGNoaWxkTm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGdhcFN0eWxlID0ge307XG4gIGlmICh3cmFwKSB7XG4gICAgZ2FwU3R5bGUuZmxleFdyYXAgPSAnd3JhcCc7XG4gICAgLy8gUGF0Y2ggZm9yIGdhcCBub3Qgc3VwcG9ydFxuICAgIGlmICghc3VwcG9ydEZsZXhHYXApIHtcbiAgICAgIGdhcFN0eWxlLm1hcmdpbkJvdHRvbSA9IC12ZXJ0aWNhbFNpemU7XG4gICAgfVxuICB9XG4gIGlmIChzdXBwb3J0RmxleEdhcCkge1xuICAgIGdhcFN0eWxlLmNvbHVtbkdhcCA9IGhvcml6b250YWxTaXplO1xuICAgIGdhcFN0eWxlLnJvd0dhcCA9IHZlcnRpY2FsU2l6ZTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY24sXG4gICAgc3R5bGU6IF9leHRlbmRzKF9leHRlbmRzKHt9LCBnYXBTdHlsZSksIHN0eWxlKVxuICB9LCBvdGhlclByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU3BhY2VDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IHNwYWNlQ29udGV4dFxuICB9LCBub2RlcykpO1xufTtcbnZhciBDb21wb3VuZGVkU3BhY2UgPSBTcGFjZTtcbkNvbXBvdW5kZWRTcGFjZS5Db21wYWN0ID0gQ29tcGFjdDtcbmV4cG9ydCBkZWZhdWx0IENvbXBvdW5kZWRTcGFjZTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBFbGxpcHNpc091dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9FbGxpcHNpc091dGxpbmVkXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBCdXR0b24gZnJvbSAnLi4vYnV0dG9uJztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHsgdXNlQ29tcGFjdEl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vc3BhY2UvQ29tcGFjdCc7XG5pbXBvcnQgRHJvcGRvd24gZnJvbSAnLi9kcm9wZG93bic7XG5pbXBvcnQgU3BhY2UgZnJvbSAnLi4vc3BhY2UnO1xudmFyIERyb3Bkb3duQnV0dG9uID0gZnVuY3Rpb24gRHJvcGRvd25CdXR0b24ocHJvcHMpIHtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRDb250ZXh0UG9wdXBDb250YWluZXIgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQb3B1cENvbnRhaW5lcixcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIF9wcm9wcyR0eXBlID0gcHJvcHMudHlwZSxcbiAgICB0eXBlID0gX3Byb3BzJHR5cGUgPT09IHZvaWQgMCA/ICdkZWZhdWx0JyA6IF9wcm9wcyR0eXBlLFxuICAgIGRhbmdlciA9IHByb3BzLmRhbmdlcixcbiAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgIGxvYWRpbmcgPSBwcm9wcy5sb2FkaW5nLFxuICAgIG9uQ2xpY2sgPSBwcm9wcy5vbkNsaWNrLFxuICAgIGh0bWxUeXBlID0gcHJvcHMuaHRtbFR5cGUsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgbWVudSA9IHByb3BzLm1lbnUsXG4gICAgYXJyb3cgPSBwcm9wcy5hcnJvdyxcbiAgICBhdXRvRm9jdXMgPSBwcm9wcy5hdXRvRm9jdXMsXG4gICAgb3ZlcmxheSA9IHByb3BzLm92ZXJsYXksXG4gICAgdHJpZ2dlciA9IHByb3BzLnRyaWdnZXIsXG4gICAgYWxpZ24gPSBwcm9wcy5hbGlnbixcbiAgICB2aXNpYmxlID0gcHJvcHMudmlzaWJsZSxcbiAgICBvcGVuID0gcHJvcHMub3BlbixcbiAgICBvblZpc2libGVDaGFuZ2UgPSBwcm9wcy5vblZpc2libGVDaGFuZ2UsXG4gICAgb25PcGVuQ2hhbmdlID0gcHJvcHMub25PcGVuQ2hhbmdlLFxuICAgIHBsYWNlbWVudCA9IHByb3BzLnBsYWNlbWVudCxcbiAgICBnZXRQb3B1cENvbnRhaW5lciA9IHByb3BzLmdldFBvcHVwQ29udGFpbmVyLFxuICAgIGhyZWYgPSBwcm9wcy5ocmVmLFxuICAgIF9wcm9wcyRpY29uID0gcHJvcHMuaWNvbixcbiAgICBpY29uID0gX3Byb3BzJGljb24gPT09IHZvaWQgMCA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsbGlwc2lzT3V0bGluZWQsIG51bGwpIDogX3Byb3BzJGljb24sXG4gICAgdGl0bGUgPSBwcm9wcy50aXRsZSxcbiAgICBfcHJvcHMkYnV0dG9uc1JlbmRlciA9IHByb3BzLmJ1dHRvbnNSZW5kZXIsXG4gICAgYnV0dG9uc1JlbmRlciA9IF9wcm9wcyRidXR0b25zUmVuZGVyID09PSB2b2lkIDAgPyBmdW5jdGlvbiAoYnV0dG9ucykge1xuICAgICAgcmV0dXJuIGJ1dHRvbnM7XG4gICAgfSA6IF9wcm9wcyRidXR0b25zUmVuZGVyLFxuICAgIG1vdXNlRW50ZXJEZWxheSA9IHByb3BzLm1vdXNlRW50ZXJEZWxheSxcbiAgICBtb3VzZUxlYXZlRGVsYXkgPSBwcm9wcy5tb3VzZUxlYXZlRGVsYXksXG4gICAgb3ZlcmxheUNsYXNzTmFtZSA9IHByb3BzLm92ZXJsYXlDbGFzc05hbWUsXG4gICAgb3ZlcmxheVN0eWxlID0gcHJvcHMub3ZlcmxheVN0eWxlLFxuICAgIGRlc3Ryb3lQb3B1cE9uSGlkZSA9IHByb3BzLmRlc3Ryb3lQb3B1cE9uSGlkZSxcbiAgICByZXN0UHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcInR5cGVcIiwgXCJkYW5nZXJcIiwgXCJkaXNhYmxlZFwiLCBcImxvYWRpbmdcIiwgXCJvbkNsaWNrXCIsIFwiaHRtbFR5cGVcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcIm1lbnVcIiwgXCJhcnJvd1wiLCBcImF1dG9Gb2N1c1wiLCBcIm92ZXJsYXlcIiwgXCJ0cmlnZ2VyXCIsIFwiYWxpZ25cIiwgXCJ2aXNpYmxlXCIsIFwib3BlblwiLCBcIm9uVmlzaWJsZUNoYW5nZVwiLCBcIm9uT3BlbkNoYW5nZVwiLCBcInBsYWNlbWVudFwiLCBcImdldFBvcHVwQ29udGFpbmVyXCIsIFwiaHJlZlwiLCBcImljb25cIiwgXCJ0aXRsZVwiLCBcImJ1dHRvbnNSZW5kZXJcIiwgXCJtb3VzZUVudGVyRGVsYXlcIiwgXCJtb3VzZUxlYXZlRGVsYXlcIiwgXCJvdmVybGF5Q2xhc3NOYW1lXCIsIFwib3ZlcmxheVN0eWxlXCIsIFwiZGVzdHJveVBvcHVwT25IaWRlXCJdKTtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnZHJvcGRvd24tYnV0dG9uJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIGRyb3Bkb3duUHJvcHMgPSB7XG4gICAgbWVudTogbWVudSxcbiAgICBhcnJvdzogYXJyb3csXG4gICAgYXV0b0ZvY3VzOiBhdXRvRm9jdXMsXG4gICAgYWxpZ246IGFsaWduLFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICB0cmlnZ2VyOiBkaXNhYmxlZCA/IFtdIDogdHJpZ2dlcixcbiAgICBvbk9wZW5DaGFuZ2U6IG9uT3BlbkNoYW5nZSB8fCBvblZpc2libGVDaGFuZ2UsXG4gICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFBvcHVwQ29udGFpbmVyIHx8IGdldENvbnRleHRQb3B1cENvbnRhaW5lcixcbiAgICBtb3VzZUVudGVyRGVsYXk6IG1vdXNlRW50ZXJEZWxheSxcbiAgICBtb3VzZUxlYXZlRGVsYXk6IG1vdXNlTGVhdmVEZWxheSxcbiAgICBvdmVybGF5Q2xhc3NOYW1lOiBvdmVybGF5Q2xhc3NOYW1lLFxuICAgIG92ZXJsYXlTdHlsZTogb3ZlcmxheVN0eWxlLFxuICAgIGRlc3Ryb3lQb3B1cE9uSGlkZTogZGVzdHJveVBvcHVwT25IaWRlXG4gIH07XG4gIHZhciBfdXNlQ29tcGFjdEl0ZW1Db250ZXggPSB1c2VDb21wYWN0SXRlbUNvbnRleHQocHJlZml4Q2xzLCBkaXJlY3Rpb24pLFxuICAgIGNvbXBhY3RTaXplID0gX3VzZUNvbXBhY3RJdGVtQ29udGV4LmNvbXBhY3RTaXplLFxuICAgIGNvbXBhY3RJdGVtQ2xhc3NuYW1lcyA9IF91c2VDb21wYWN0SXRlbUNvbnRleC5jb21wYWN0SXRlbUNsYXNzbmFtZXM7XG4gIHZhciBjbGFzc2VzID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIGNvbXBhY3RJdGVtQ2xhc3NuYW1lcywgY2xhc3NOYW1lKTtcbiAgaWYgKCdvdmVybGF5JyBpbiBwcm9wcykge1xuICAgIGRyb3Bkb3duUHJvcHMub3ZlcmxheSA9IG92ZXJsYXk7XG4gIH1cbiAgaWYgKCdvcGVuJyBpbiBwcm9wcykge1xuICAgIGRyb3Bkb3duUHJvcHMub3BlbiA9IG9wZW47XG4gIH0gZWxzZSBpZiAoJ3Zpc2libGUnIGluIHByb3BzKSB7XG4gICAgZHJvcGRvd25Qcm9wcy5vcGVuID0gdmlzaWJsZTtcbiAgfVxuICBpZiAoJ3BsYWNlbWVudCcgaW4gcHJvcHMpIHtcbiAgICBkcm9wZG93blByb3BzLnBsYWNlbWVudCA9IHBsYWNlbWVudDtcbiAgfSBlbHNlIHtcbiAgICBkcm9wZG93blByb3BzLnBsYWNlbWVudCA9IGRpcmVjdGlvbiA9PT0gJ3J0bCcgPyAnYm90dG9tTGVmdCcgOiAnYm90dG9tUmlnaHQnO1xuICB9XG4gIHZhciBsZWZ0QnV0dG9uID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQnV0dG9uLCB7XG4gICAgdHlwZTogdHlwZSxcbiAgICBkYW5nZXI6IGRhbmdlcixcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgbG9hZGluZzogbG9hZGluZyxcbiAgICBvbkNsaWNrOiBvbkNsaWNrLFxuICAgIGh0bWxUeXBlOiBodG1sVHlwZSxcbiAgICBocmVmOiBocmVmLFxuICAgIHRpdGxlOiB0aXRsZVxuICB9LCBjaGlsZHJlbik7XG4gIHZhciByaWdodEJ1dHRvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEJ1dHRvbiwge1xuICAgIHR5cGU6IHR5cGUsXG4gICAgZGFuZ2VyOiBkYW5nZXIsXG4gICAgaWNvbjogaWNvblxuICB9KTtcbiAgdmFyIF9idXR0b25zUmVuZGVyID0gYnV0dG9uc1JlbmRlcihbbGVmdEJ1dHRvbiwgcmlnaHRCdXR0b25dKSxcbiAgICBfYnV0dG9uc1JlbmRlcjIgPSBfc2xpY2VkVG9BcnJheShfYnV0dG9uc1JlbmRlciwgMiksXG4gICAgbGVmdEJ1dHRvblRvUmVuZGVyID0gX2J1dHRvbnNSZW5kZXIyWzBdLFxuICAgIHJpZ2h0QnV0dG9uVG9SZW5kZXIgPSBfYnV0dG9uc1JlbmRlcjJbMV07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTcGFjZS5Db21wYWN0LCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzLFxuICAgIHNpemU6IGNvbXBhY3RTaXplLFxuICAgIGJsb2NrOiB0cnVlXG4gIH0sIHJlc3RQcm9wcyksIGxlZnRCdXR0b25Ub1JlbmRlciwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRHJvcGRvd24sIF9leHRlbmRzKHt9LCBkcm9wZG93blByb3BzKSwgcmlnaHRCdXR0b25Ub1JlbmRlcikpO1xufTtcbkRyb3Bkb3duQnV0dG9uLl9fQU5UX0JVVFRPTiA9IHRydWU7XG5leHBvcnQgZGVmYXVsdCBEcm9wZG93bkJ1dHRvbjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBSaWdodE91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9SaWdodE91dGxpbmVkXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBSY0Ryb3Bkb3duIGZyb20gJ3JjLWRyb3Bkb3duJztcbmltcG9ydCB1c2VFdmVudCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VFdmVudFwiO1xuaW1wb3J0IHVzZU1lcmdlZFN0YXRlIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lcmdlZFN0YXRlXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgTWVudSBmcm9tICcuLi9tZW51JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHsgT3ZlcnJpZGVQcm92aWRlciB9IGZyb20gJy4uL21lbnUvT3ZlcnJpZGVDb250ZXh0JztcbmltcG9ydCBnZXRQbGFjZW1lbnRzIGZyb20gJy4uL191dGlsL3BsYWNlbWVudHMnO1xuaW1wb3J0IHsgY2xvbmVFbGVtZW50IH0gZnJvbSAnLi4vX3V0aWwvcmVhY3ROb2RlJztcbmltcG9ydCB7IHR1cGxlIH0gZnJvbSAnLi4vX3V0aWwvdHlwZSc7XG5pbXBvcnQgd2FybmluZyBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmltcG9ydCBEcm9wZG93bkJ1dHRvbiBmcm9tICcuL2Ryb3Bkb3duLWJ1dHRvbic7XG5pbXBvcnQgeyBOb0NvbXBhY3RTdHlsZSB9IGZyb20gJy4uL3NwYWNlL0NvbXBhY3QnO1xudmFyIFBsYWNlbWVudHMgPSB0dXBsZSgndG9wTGVmdCcsICd0b3BDZW50ZXInLCAndG9wUmlnaHQnLCAnYm90dG9tTGVmdCcsICdib3R0b21DZW50ZXInLCAnYm90dG9tUmlnaHQnLCAndG9wJywgJ2JvdHRvbScpO1xudmFyIERyb3Bkb3duID0gZnVuY3Rpb24gRHJvcGRvd24ocHJvcHMpIHtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRDb250ZXh0UG9wdXBDb250YWluZXIgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQb3B1cENvbnRhaW5lcixcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuICAvLyBXYXJuaW5nIGZvciBkZXByZWNhdGVkIHVzYWdlXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgW1sndmlzaWJsZScsICdvcGVuJ10sIFsnb25WaXNpYmxlQ2hhbmdlJywgJ29uT3BlbkNoYW5nZSddXS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICB2YXIgX3JlZjIgPSBfc2xpY2VkVG9BcnJheShfcmVmLCAyKSxcbiAgICAgICAgZGVwcmVjYXRlZE5hbWUgPSBfcmVmMlswXSxcbiAgICAgICAgbmV3TmFtZSA9IF9yZWYyWzFdO1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghKGRlcHJlY2F0ZWROYW1lIGluIHByb3BzKSwgJ0Ryb3Bkb3duJywgXCJgXCIuY29uY2F0KGRlcHJlY2F0ZWROYW1lLCBcImAgaXMgZGVwcmVjYXRlZCB3aGljaCB3aWxsIGJlIHJlbW92ZWQgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLCBwbGVhc2UgdXNlIGBcIikuY29uY2F0KG5ld05hbWUsIFwiYCBpbnN0ZWFkLlwiKSkgOiB2b2lkIDA7XG4gICAgfSk7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghKCdvdmVybGF5JyBpbiBwcm9wcyksICdEcm9wZG93bicsICdgb3ZlcmxheWAgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBgbWVudWAgaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgfVxuICB2YXIgZ2V0VHJhbnNpdGlvbk5hbWUgPSBmdW5jdGlvbiBnZXRUcmFuc2l0aW9uTmFtZSgpIHtcbiAgICB2YXIgcm9vdFByZWZpeENscyA9IGdldFByZWZpeENscygpO1xuICAgIHZhciBfcHJvcHMkcGxhY2VtZW50ID0gcHJvcHMucGxhY2VtZW50LFxuICAgICAgcGxhY2VtZW50ID0gX3Byb3BzJHBsYWNlbWVudCA9PT0gdm9pZCAwID8gJycgOiBfcHJvcHMkcGxhY2VtZW50LFxuICAgICAgdHJhbnNpdGlvbk5hbWUgPSBwcm9wcy50cmFuc2l0aW9uTmFtZTtcbiAgICBpZiAodHJhbnNpdGlvbk5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRyYW5zaXRpb25OYW1lO1xuICAgIH1cbiAgICBpZiAocGxhY2VtZW50LmluY2x1ZGVzKCd0b3AnKSkge1xuICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KHJvb3RQcmVmaXhDbHMsIFwiLXNsaWRlLWRvd25cIik7XG4gICAgfVxuICAgIHJldHVybiBcIlwiLmNvbmNhdChyb290UHJlZml4Q2xzLCBcIi1zbGlkZS11cFwiKTtcbiAgfTtcbiAgdmFyIGdldFBsYWNlbWVudCA9IGZ1bmN0aW9uIGdldFBsYWNlbWVudCgpIHtcbiAgICB2YXIgcGxhY2VtZW50ID0gcHJvcHMucGxhY2VtZW50O1xuICAgIGlmICghcGxhY2VtZW50KSB7XG4gICAgICByZXR1cm4gZGlyZWN0aW9uID09PSAncnRsJyA/ICdib3R0b21SaWdodCcgOiAnYm90dG9tTGVmdCc7XG4gICAgfVxuICAgIGlmIChwbGFjZW1lbnQuaW5jbHVkZXMoJ0NlbnRlcicpKSB7XG4gICAgICB2YXIgbmV3UGxhY2VtZW50ID0gcGxhY2VtZW50LnNsaWNlKDAsIHBsYWNlbWVudC5pbmRleE9mKCdDZW50ZXInKSk7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCFwbGFjZW1lbnQuaW5jbHVkZXMoJ0NlbnRlcicpLCAnRHJvcGRvd24nLCBcIllvdSBhcmUgdXNpbmcgJ1wiLmNvbmNhdChwbGFjZW1lbnQsIFwiJyBwbGFjZW1lbnQgaW4gRHJvcGRvd24sIHdoaWNoIGlzIGRlcHJlY2F0ZWQuIFRyeSB0byB1c2UgJ1wiKS5jb25jYXQobmV3UGxhY2VtZW50LCBcIicgaW5zdGVhZC5cIikpIDogdm9pZCAwO1xuICAgICAgcmV0dXJuIG5ld1BsYWNlbWVudDtcbiAgICB9XG4gICAgcmV0dXJuIHBsYWNlbWVudDtcbiAgfTtcbiAgdmFyIG1lbnUgPSBwcm9wcy5tZW51LFxuICAgIGFycm93ID0gcHJvcHMuYXJyb3csXG4gICAgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgdHJpZ2dlciA9IHByb3BzLnRyaWdnZXIsXG4gICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICBkcm9wZG93blJlbmRlciA9IHByb3BzLmRyb3Bkb3duUmVuZGVyLFxuICAgIGdldFBvcHVwQ29udGFpbmVyID0gcHJvcHMuZ2V0UG9wdXBDb250YWluZXIsXG4gICAgb3ZlcmxheUNsYXNzTmFtZSA9IHByb3BzLm92ZXJsYXlDbGFzc05hbWUsXG4gICAgdmlzaWJsZSA9IHByb3BzLnZpc2libGUsXG4gICAgb3BlbiA9IHByb3BzLm9wZW4sXG4gICAgb25WaXNpYmxlQ2hhbmdlID0gcHJvcHMub25WaXNpYmxlQ2hhbmdlLFxuICAgIG9uT3BlbkNoYW5nZSA9IHByb3BzLm9uT3BlbkNoYW5nZSxcbiAgICBfcHJvcHMkbW91c2VFbnRlckRlbGEgPSBwcm9wcy5tb3VzZUVudGVyRGVsYXksXG4gICAgbW91c2VFbnRlckRlbGF5ID0gX3Byb3BzJG1vdXNlRW50ZXJEZWxhID09PSB2b2lkIDAgPyAwLjE1IDogX3Byb3BzJG1vdXNlRW50ZXJEZWxhLFxuICAgIF9wcm9wcyRtb3VzZUxlYXZlRGVsYSA9IHByb3BzLm1vdXNlTGVhdmVEZWxheSxcbiAgICBtb3VzZUxlYXZlRGVsYXkgPSBfcHJvcHMkbW91c2VMZWF2ZURlbGEgPT09IHZvaWQgMCA/IDAuMSA6IF9wcm9wcyRtb3VzZUxlYXZlRGVsYSxcbiAgICBfcHJvcHMkYXV0b0FkanVzdE92ZXIgPSBwcm9wcy5hdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgYXV0b0FkanVzdE92ZXJmbG93ID0gX3Byb3BzJGF1dG9BZGp1c3RPdmVyID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJGF1dG9BZGp1c3RPdmVyO1xuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdkcm9wZG93bicsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIHZhciBjaGlsZCA9IFJlYWN0LkNoaWxkcmVuLm9ubHkoY2hpbGRyZW4pO1xuICB2YXIgZHJvcGRvd25UcmlnZ2VyID0gY2xvbmVFbGVtZW50KGNoaWxkLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdHJpZ2dlclwiKSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIGNoaWxkLnByb3BzLmNsYXNzTmFtZSksXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkXG4gIH0pO1xuICB2YXIgdHJpZ2dlckFjdGlvbnMgPSBkaXNhYmxlZCA/IFtdIDogdHJpZ2dlcjtcbiAgdmFyIGFsaWduUG9pbnQ7XG4gIGlmICh0cmlnZ2VyQWN0aW9ucyAmJiB0cmlnZ2VyQWN0aW9ucy5pbmNsdWRlcygnY29udGV4dE1lbnUnKSkge1xuICAgIGFsaWduUG9pbnQgPSB0cnVlO1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBWaXNpYmxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZSA9IHVzZU1lcmdlZFN0YXRlKGZhbHNlLCB7XG4gICAgICB2YWx1ZTogb3BlbiAhPT0gdW5kZWZpbmVkID8gb3BlbiA6IHZpc2libGVcbiAgICB9KSxcbiAgICBfdXNlTWVyZ2VkU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZU1lcmdlZFN0YXRlLCAyKSxcbiAgICBtZXJnZWRPcGVuID0gX3VzZU1lcmdlZFN0YXRlMlswXSxcbiAgICBzZXRPcGVuID0gX3VzZU1lcmdlZFN0YXRlMlsxXTtcbiAgdmFyIG9uSW5uZXJPcGVuQ2hhbmdlID0gdXNlRXZlbnQoZnVuY3Rpb24gKG5leHRPcGVuKSB7XG4gICAgb25WaXNpYmxlQ2hhbmdlID09PSBudWxsIHx8IG9uVmlzaWJsZUNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25WaXNpYmxlQ2hhbmdlKG5leHRPcGVuKTtcbiAgICBvbk9wZW5DaGFuZ2UgPT09IG51bGwgfHwgb25PcGVuQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbk9wZW5DaGFuZ2UobmV4dE9wZW4pO1xuICAgIHNldE9wZW4obmV4dE9wZW4pO1xuICB9KTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IE92ZXJsYXkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb3ZlcmxheUNsYXNzTmFtZUN1c3RvbWl6ZWQgPSBjbGFzc05hbWVzKG92ZXJsYXlDbGFzc05hbWUsIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpKTtcbiAgdmFyIGJ1aWx0aW5QbGFjZW1lbnRzID0gZ2V0UGxhY2VtZW50cyh7XG4gICAgYXJyb3dQb2ludEF0Q2VudGVyOiBfdHlwZW9mKGFycm93KSA9PT0gJ29iamVjdCcgJiYgYXJyb3cucG9pbnRBdENlbnRlcixcbiAgICBhdXRvQWRqdXN0T3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvd1xuICB9KTtcbiAgdmFyIG9uTWVudUNsaWNrID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIHNldE9wZW4oZmFsc2UpO1xuICB9LCBbXSk7XG4gIHZhciByZW5kZXJPdmVybGF5ID0gZnVuY3Rpb24gcmVuZGVyT3ZlcmxheSgpIHtcbiAgICAvLyByYy1kcm9wZG93biBhbHJlYWR5IGNhbiBwcm9jZXNzIHRoZSBmdW5jdGlvbiBvZiBvdmVybGF5LCBidXQgd2UgaGF2ZSBjaGVjayBsb2dpYyBoZXJlLlxuICAgIC8vIFNvIHdlIG5lZWQgcmVuZGVyIHRoZSBlbGVtZW50IHRvIGNoZWNrIGFuZCBwYXNzIGJhY2sgdG8gcmMtZHJvcGRvd24uXG4gICAgdmFyIG92ZXJsYXkgPSBwcm9wcy5vdmVybGF5O1xuICAgIHZhciBvdmVybGF5Tm9kZTtcbiAgICBpZiAobWVudSA9PT0gbnVsbCB8fCBtZW51ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZW51Lml0ZW1zKSB7XG4gICAgICBvdmVybGF5Tm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE1lbnUsIF9leHRlbmRzKHt9LCBtZW51KSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygb3ZlcmxheSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb3ZlcmxheU5vZGUgPSBvdmVybGF5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG92ZXJsYXlOb2RlID0gb3ZlcmxheTtcbiAgICB9XG4gICAgaWYgKGRyb3Bkb3duUmVuZGVyKSB7XG4gICAgICBvdmVybGF5Tm9kZSA9IGRyb3Bkb3duUmVuZGVyKG92ZXJsYXlOb2RlKTtcbiAgICB9XG4gICAgb3ZlcmxheU5vZGUgPSBSZWFjdC5DaGlsZHJlbi5vbmx5KHR5cGVvZiBvdmVybGF5Tm9kZSA9PT0gJ3N0cmluZycgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgb3ZlcmxheU5vZGUpIDogb3ZlcmxheU5vZGUpO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChPdmVycmlkZVByb3ZpZGVyLCB7XG4gICAgICBwcmVmaXhDbHM6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbWVudVwiKSxcbiAgICAgIGV4cGFuZEljb246IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1tZW51LXN1Ym1lbnUtYXJyb3dcIilcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJpZ2h0T3V0bGluZWQsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1lbnUtc3VibWVudS1hcnJvdy1pY29uXCIpXG4gICAgICB9KSksXG4gICAgICBtb2RlOiBcInZlcnRpY2FsXCIsXG4gICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcbiAgICAgIG9uQ2xpY2s6IG9uTWVudUNsaWNrLFxuICAgICAgdmFsaWRhdG9yOiBmdW5jdGlvbiB2YWxpZGF0b3IoX3JlZjMpIHtcbiAgICAgICAgdmFyIG1vZGUgPSBfcmVmMy5tb2RlO1xuICAgICAgICAvLyBXYXJuaW5nIGlmIHVzZSBvdGhlciBtb2RlXG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoIW1vZGUgfHwgbW9kZSA9PT0gJ3ZlcnRpY2FsJywgJ0Ryb3Bkb3duJywgXCJtb2RlPVxcXCJcIi5jb25jYXQobW9kZSwgXCJcXFwiIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIERyb3Bkb3duJ3MgTWVudS5cIikpIDogdm9pZCAwO1xuICAgICAgfVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE5vQ29tcGFjdFN0eWxlLCBudWxsLCBvdmVybGF5Tm9kZSkpO1xuICB9O1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSY0Ryb3Bkb3duLCBfZXh0ZW5kcyh7XG4gICAgYWxpZ25Qb2ludDogYWxpZ25Qb2ludFxuICB9LCBwcm9wcywge1xuICAgIG1vdXNlRW50ZXJEZWxheTogbW91c2VFbnRlckRlbGF5LFxuICAgIG1vdXNlTGVhdmVEZWxheTogbW91c2VMZWF2ZURlbGF5LFxuICAgIHZpc2libGU6IG1lcmdlZE9wZW4sXG4gICAgYnVpbHRpblBsYWNlbWVudHM6IGJ1aWx0aW5QbGFjZW1lbnRzLFxuICAgIGFycm93OiAhIWFycm93LFxuICAgIG92ZXJsYXlDbGFzc05hbWU6IG92ZXJsYXlDbGFzc05hbWVDdXN0b21pemVkLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lciB8fCBnZXRDb250ZXh0UG9wdXBDb250YWluZXIsXG4gICAgdHJhbnNpdGlvbk5hbWU6IGdldFRyYW5zaXRpb25OYW1lKCksXG4gICAgdHJpZ2dlcjogdHJpZ2dlckFjdGlvbnMsXG4gICAgb3ZlcmxheTogcmVuZGVyT3ZlcmxheSxcbiAgICBwbGFjZW1lbnQ6IGdldFBsYWNlbWVudCgpLFxuICAgIG9uVmlzaWJsZUNoYW5nZTogb25Jbm5lck9wZW5DaGFuZ2VcbiAgfSksIGRyb3Bkb3duVHJpZ2dlcik7XG59O1xuRHJvcGRvd24uQnV0dG9uID0gRHJvcGRvd25CdXR0b247XG5leHBvcnQgZGVmYXVsdCBEcm9wZG93bjsiLCIvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZyZWVHbG9iYWw7XG4iLCJ2YXIgZnJlZUdsb2JhbCA9IHJlcXVpcmUoJy4vX2ZyZWVHbG9iYWwnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJvb3Q7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgU3ltYm9sID0gcm9vdC5TeW1ib2w7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ltYm9sO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcnJheTtcbiIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmF3IGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyksXG4gICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgdHJ5IHtcbiAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQ7XG4gICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIGlmICh1bm1hc2tlZCkge1xuICAgIGlmIChpc093bikge1xuICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFJhd1RhZztcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgdXNpbmcgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG9iamVjdFRvU3RyaW5nO1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIGdldFJhd1RhZyA9IHJlcXVpcmUoJy4vX2dldFJhd1RhZycpLFxuICAgIG9iamVjdFRvU3RyaW5nID0gcmVxdWlyZSgnLi9fb2JqZWN0VG9TdHJpbmcnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG51bGxUYWcgPSAnW29iamVjdCBOdWxsXScsXG4gICAgdW5kZWZpbmVkVGFnID0gJ1tvYmplY3QgVW5kZWZpbmVkXSc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRUYWdgIHdpdGhvdXQgZmFsbGJhY2tzIGZvciBidWdneSBlbnZpcm9ubWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkVGFnIDogbnVsbFRhZztcbiAgfVxuICByZXR1cm4gKHN5bVRvU3RyaW5nVGFnICYmIHN5bVRvU3RyaW5nVGFnIGluIE9iamVjdCh2YWx1ZSkpXG4gICAgPyBnZXRSYXdUYWcodmFsdWUpXG4gICAgOiBvYmplY3RUb1N0cmluZyh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUdldFRhZztcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzT2JqZWN0TGlrZTtcbiIsInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1N5bWJvbDtcbiIsIi8qKiBVc2VkIHRvIG1hdGNoIGEgc2luZ2xlIHdoaXRlc3BhY2UgY2hhcmFjdGVyLiAqL1xudmFyIHJlV2hpdGVzcGFjZSA9IC9cXHMvO1xuXG4vKipcbiAqIFVzZWQgYnkgYF8udHJpbWAgYW5kIGBfLnRyaW1FbmRgIHRvIGdldCB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgbm9uLXdoaXRlc3BhY2VcbiAqIGNoYXJhY3RlciBvZiBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIuXG4gKi9cbmZ1bmN0aW9uIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpIHtcbiAgdmFyIGluZGV4ID0gc3RyaW5nLmxlbmd0aDtcblxuICB3aGlsZSAoaW5kZXgtLSAmJiByZVdoaXRlc3BhY2UudGVzdChzdHJpbmcuY2hhckF0KGluZGV4KSkpIHt9XG4gIHJldHVybiBpbmRleDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0cmltbWVkRW5kSW5kZXg7XG4iLCJ2YXIgdHJpbW1lZEVuZEluZGV4ID0gcmVxdWlyZSgnLi9fdHJpbW1lZEVuZEluZGV4Jyk7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgd2hpdGVzcGFjZS4gKi9cbnZhciByZVRyaW1TdGFydCA9IC9eXFxzKy87XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udHJpbWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byB0cmltLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUcmltKHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nXG4gICAgPyBzdHJpbmcuc2xpY2UoMCwgdHJpbW1lZEVuZEluZGV4KHN0cmluZykgKyAxKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAnJylcbiAgICA6IHN0cmluZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVHJpbTtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzT2JqZWN0O1xuIiwidmFyIGJhc2VUcmltID0gcmVxdWlyZSgnLi9fYmFzZVRyaW0nKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTkFOID0gMCAvIDA7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvTnVtYmVyKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiBJbmZpbml0eVxuICpcbiAqIF8udG9OdW1iZXIoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHZhciBvdGhlciA9IHR5cGVvZiB2YWx1ZS52YWx1ZU9mID09ICdmdW5jdGlvbicgPyB2YWx1ZS52YWx1ZU9mKCkgOiB2YWx1ZTtcbiAgICB2YWx1ZSA9IGlzT2JqZWN0KG90aGVyKSA/IChvdGhlciArICcnKSA6IG90aGVyO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTtcbiAgfVxuICB2YWx1ZSA9IGJhc2VUcmltKHZhbHVlKTtcbiAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9OdW1iZXI7XG4iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgUGFuZWxDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe30pO1xuZXhwb3J0IGRlZmF1bHQgUGFuZWxDb250ZXh0OyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQYW5lbENvbnRleHQgZnJvbSAnLi4vUGFuZWxDb250ZXh0JztcbnZhciBISURERU5fU1RZTEUgPSB7XG4gIHZpc2liaWxpdHk6ICdoaWRkZW4nXG59O1xuZnVuY3Rpb24gSGVhZGVyKF9yZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgIF9yZWYkcHJldkljb24gPSBfcmVmLnByZXZJY29uLFxuICAgIHByZXZJY29uID0gX3JlZiRwcmV2SWNvbiA9PT0gdm9pZCAwID8gXCJcXHUyMDM5XCIgOiBfcmVmJHByZXZJY29uLFxuICAgIF9yZWYkbmV4dEljb24gPSBfcmVmLm5leHRJY29uLFxuICAgIG5leHRJY29uID0gX3JlZiRuZXh0SWNvbiA9PT0gdm9pZCAwID8gXCJcXHUyMDNBXCIgOiBfcmVmJG5leHRJY29uLFxuICAgIF9yZWYkc3VwZXJQcmV2SWNvbiA9IF9yZWYuc3VwZXJQcmV2SWNvbixcbiAgICBzdXBlclByZXZJY29uID0gX3JlZiRzdXBlclByZXZJY29uID09PSB2b2lkIDAgPyBcIlxceEFCXCIgOiBfcmVmJHN1cGVyUHJldkljb24sXG4gICAgX3JlZiRzdXBlck5leHRJY29uID0gX3JlZi5zdXBlck5leHRJY29uLFxuICAgIHN1cGVyTmV4dEljb24gPSBfcmVmJHN1cGVyTmV4dEljb24gPT09IHZvaWQgMCA/IFwiXFx4QkJcIiA6IF9yZWYkc3VwZXJOZXh0SWNvbixcbiAgICBvblN1cGVyUHJldiA9IF9yZWYub25TdXBlclByZXYsXG4gICAgb25TdXBlck5leHQgPSBfcmVmLm9uU3VwZXJOZXh0LFxuICAgIG9uUHJldiA9IF9yZWYub25QcmV2LFxuICAgIG9uTmV4dCA9IF9yZWYub25OZXh0LFxuICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChQYW5lbENvbnRleHQpLFxuICAgIGhpZGVOZXh0QnRuID0gX1JlYWN0JHVzZUNvbnRleHQuaGlkZU5leHRCdG4sXG4gICAgaGlkZVByZXZCdG4gPSBfUmVhY3QkdXNlQ29udGV4dC5oaWRlUHJldkJ0bjtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IHByZWZpeENsc1xuICB9LCBvblN1cGVyUHJldiAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgdHlwZTogXCJidXR0b25cIixcbiAgICBvbkNsaWNrOiBvblN1cGVyUHJldixcbiAgICB0YWJJbmRleDogLTEsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN1cGVyLXByZXYtYnRuXCIpLFxuICAgIHN0eWxlOiBoaWRlUHJldkJ0biA/IEhJRERFTl9TVFlMRSA6IHt9XG4gIH0sIHN1cGVyUHJldkljb24pLCBvblByZXYgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgb25DbGljazogb25QcmV2LFxuICAgIHRhYkluZGV4OiAtMSxcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcHJldi1idG5cIiksXG4gICAgc3R5bGU6IGhpZGVQcmV2QnRuID8gSElEREVOX1NUWUxFIDoge31cbiAgfSwgcHJldkljb24pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXZpZXdcIilcbiAgfSwgY2hpbGRyZW4pLCBvbk5leHQgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgb25DbGljazogb25OZXh0LFxuICAgIHRhYkluZGV4OiAtMSxcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbmV4dC1idG5cIiksXG4gICAgc3R5bGU6IGhpZGVOZXh0QnRuID8gSElEREVOX1NUWUxFIDoge31cbiAgfSwgbmV4dEljb24pLCBvblN1cGVyTmV4dCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgdHlwZTogXCJidXR0b25cIixcbiAgICBvbkNsaWNrOiBvblN1cGVyTmV4dCxcbiAgICB0YWJJbmRleDogLTEsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN1cGVyLW5leHQtYnRuXCIpLFxuICAgIHN0eWxlOiBoaWRlTmV4dEJ0biA/IEhJRERFTl9TVFlMRSA6IHt9XG4gIH0sIHN1cGVyTmV4dEljb24pKTtcbn1cbmV4cG9ydCBkZWZhdWx0IEhlYWRlcjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBIZWFkZXIgZnJvbSAnLi4vSGVhZGVyJztcbmltcG9ydCB7IERFQ0FERV9ESVNUQU5DRV9DT1VOVCB9IGZyb20gJy4nO1xuaW1wb3J0IFBhbmVsQ29udGV4dCBmcm9tICcuLi8uLi9QYW5lbENvbnRleHQnO1xuZnVuY3Rpb24gRGVjYWRlSGVhZGVyKHByb3BzKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgZ2VuZXJhdGVDb25maWcgPSBwcm9wcy5nZW5lcmF0ZUNvbmZpZyxcbiAgICB2aWV3RGF0ZSA9IHByb3BzLnZpZXdEYXRlLFxuICAgIG9uUHJldkRlY2FkZXMgPSBwcm9wcy5vblByZXZEZWNhZGVzLFxuICAgIG9uTmV4dERlY2FkZXMgPSBwcm9wcy5vbk5leHREZWNhZGVzO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFBhbmVsQ29udGV4dCksXG4gICAgaGlkZUhlYWRlciA9IF9SZWFjdCR1c2VDb250ZXh0LmhpZGVIZWFkZXI7XG4gIGlmIChoaWRlSGVhZGVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGhlYWRlclByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGVhZGVyXCIpO1xuICB2YXIgeWVhck51bWJlciA9IGdlbmVyYXRlQ29uZmlnLmdldFllYXIodmlld0RhdGUpO1xuICB2YXIgc3RhcnRZZWFyID0gTWF0aC5mbG9vcih5ZWFyTnVtYmVyIC8gREVDQURFX0RJU1RBTkNFX0NPVU5UKSAqIERFQ0FERV9ESVNUQU5DRV9DT1VOVDtcbiAgdmFyIGVuZFllYXIgPSBzdGFydFllYXIgKyBERUNBREVfRElTVEFOQ0VfQ09VTlQgLSAxO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSGVhZGVyLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICBwcmVmaXhDbHM6IGhlYWRlclByZWZpeENscyxcbiAgICBvblN1cGVyUHJldjogb25QcmV2RGVjYWRlcyxcbiAgICBvblN1cGVyTmV4dDogb25OZXh0RGVjYWRlc1xuICB9KSwgc3RhcnRZZWFyLCBcIi1cIiwgZW5kWWVhcik7XG59XG5leHBvcnQgZGVmYXVsdCBEZWNhZGVIZWFkZXI7IiwiZXhwb3J0IGZ1bmN0aW9uIHNldFRpbWUoZ2VuZXJhdGVDb25maWcsIGRhdGUsIGhvdXIsIG1pbnV0ZSwgc2Vjb25kKSB7XG4gIHZhciBuZXh0VGltZSA9IGdlbmVyYXRlQ29uZmlnLnNldEhvdXIoZGF0ZSwgaG91cik7XG4gIG5leHRUaW1lID0gZ2VuZXJhdGVDb25maWcuc2V0TWludXRlKG5leHRUaW1lLCBtaW51dGUpO1xuICBuZXh0VGltZSA9IGdlbmVyYXRlQ29uZmlnLnNldFNlY29uZChuZXh0VGltZSwgc2Vjb25kKTtcbiAgcmV0dXJuIG5leHRUaW1lO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldERhdGVUaW1lKGdlbmVyYXRlQ29uZmlnLCBkYXRlLCBkZWZhdWx0RGF0ZSkge1xuICBpZiAoIWRlZmF1bHREYXRlKSB7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cbiAgdmFyIG5ld0RhdGUgPSBkYXRlO1xuICBuZXdEYXRlID0gZ2VuZXJhdGVDb25maWcuc2V0SG91cihuZXdEYXRlLCBnZW5lcmF0ZUNvbmZpZy5nZXRIb3VyKGRlZmF1bHREYXRlKSk7XG4gIG5ld0RhdGUgPSBnZW5lcmF0ZUNvbmZpZy5zZXRNaW51dGUobmV3RGF0ZSwgZ2VuZXJhdGVDb25maWcuZ2V0TWludXRlKGRlZmF1bHREYXRlKSk7XG4gIG5ld0RhdGUgPSBnZW5lcmF0ZUNvbmZpZy5zZXRTZWNvbmQobmV3RGF0ZSwgZ2VuZXJhdGVDb25maWcuZ2V0U2Vjb25kKGRlZmF1bHREYXRlKSk7XG4gIHJldHVybiBuZXdEYXRlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldExvd2VyQm91bmRUaW1lKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBob3VyU3RlcCwgbWludXRlU3RlcCwgc2Vjb25kU3RlcCkge1xuICB2YXIgbG93ZXJCb3VuZEhvdXIgPSBNYXRoLmZsb29yKGhvdXIgLyBob3VyU3RlcCkgKiBob3VyU3RlcDtcbiAgaWYgKGxvd2VyQm91bmRIb3VyIDwgaG91cikge1xuICAgIHJldHVybiBbbG93ZXJCb3VuZEhvdXIsIDYwIC0gbWludXRlU3RlcCwgNjAgLSBzZWNvbmRTdGVwXTtcbiAgfVxuICB2YXIgbG93ZXJCb3VuZE1pbnV0ZSA9IE1hdGguZmxvb3IobWludXRlIC8gbWludXRlU3RlcCkgKiBtaW51dGVTdGVwO1xuICBpZiAobG93ZXJCb3VuZE1pbnV0ZSA8IG1pbnV0ZSkge1xuICAgIHJldHVybiBbbG93ZXJCb3VuZEhvdXIsIGxvd2VyQm91bmRNaW51dGUsIDYwIC0gc2Vjb25kU3RlcF07XG4gIH1cbiAgdmFyIGxvd2VyQm91bmRTZWNvbmQgPSBNYXRoLmZsb29yKHNlY29uZCAvIHNlY29uZFN0ZXApICogc2Vjb25kU3RlcDtcbiAgcmV0dXJuIFtsb3dlckJvdW5kSG91ciwgbG93ZXJCb3VuZE1pbnV0ZSwgbG93ZXJCb3VuZFNlY29uZF07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0TGFzdERheShnZW5lcmF0ZUNvbmZpZywgZGF0ZSkge1xuICB2YXIgeWVhciA9IGdlbmVyYXRlQ29uZmlnLmdldFllYXIoZGF0ZSk7XG4gIHZhciBtb250aCA9IGdlbmVyYXRlQ29uZmlnLmdldE1vbnRoKGRhdGUpICsgMTtcbiAgdmFyIGVuZERhdGUgPSBnZW5lcmF0ZUNvbmZpZy5nZXRFbmREYXRlKGdlbmVyYXRlQ29uZmlnLmdldEZpeGVkRGF0ZShcIlwiLmNvbmNhdCh5ZWFyLCBcIi1cIikuY29uY2F0KG1vbnRoLCBcIi0wMVwiKSkpO1xuICB2YXIgbGFzdERheSA9IGdlbmVyYXRlQ29uZmlnLmdldERhdGUoZW5kRGF0ZSk7XG4gIHZhciBtb250aFNob3cgPSBtb250aCA8IDEwID8gXCIwXCIuY29uY2F0KG1vbnRoKSA6IFwiXCIuY29uY2F0KG1vbnRoKTtcbiAgcmV0dXJuIFwiXCIuY29uY2F0KHllYXIsIFwiLVwiKS5jb25jYXQobW9udGhTaG93LCBcIi1cIikuY29uY2F0KGxhc3REYXkpO1xufSIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUGFuZWxDb250ZXh0IGZyb20gJy4uL1BhbmVsQ29udGV4dCc7XG5pbXBvcnQgeyBnZXRMYXN0RGF5IH0gZnJvbSAnLi4vdXRpbHMvdGltZVV0aWwnO1xuaW1wb3J0IHsgZ2V0Q2VsbERhdGVEaXNhYmxlZCB9IGZyb20gJy4uL3V0aWxzL2RhdGVVdGlsJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFBhbmVsQm9keShfcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICBkaXNhYmxlZERhdGUgPSBfcmVmLmRpc2FibGVkRGF0ZSxcbiAgICBvblNlbGVjdCA9IF9yZWYub25TZWxlY3QsXG4gICAgcGlja2VyID0gX3JlZi5waWNrZXIsXG4gICAgcm93TnVtID0gX3JlZi5yb3dOdW0sXG4gICAgY29sTnVtID0gX3JlZi5jb2xOdW0sXG4gICAgcHJlZml4Q29sdW1uID0gX3JlZi5wcmVmaXhDb2x1bW4sXG4gICAgcm93Q2xhc3NOYW1lID0gX3JlZi5yb3dDbGFzc05hbWUsXG4gICAgYmFzZURhdGUgPSBfcmVmLmJhc2VEYXRlLFxuICAgIGdldENlbGxDbGFzc05hbWUgPSBfcmVmLmdldENlbGxDbGFzc05hbWUsXG4gICAgZ2V0Q2VsbFRleHQgPSBfcmVmLmdldENlbGxUZXh0LFxuICAgIGdldENlbGxOb2RlID0gX3JlZi5nZXRDZWxsTm9kZSxcbiAgICBnZXRDZWxsRGF0ZSA9IF9yZWYuZ2V0Q2VsbERhdGUsXG4gICAgZ2VuZXJhdGVDb25maWcgPSBfcmVmLmdlbmVyYXRlQ29uZmlnLFxuICAgIHRpdGxlQ2VsbCA9IF9yZWYudGl0bGVDZWxsLFxuICAgIGhlYWRlckNlbGxzID0gX3JlZi5oZWFkZXJDZWxscztcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChQYW5lbENvbnRleHQpLFxuICAgIG9uRGF0ZU1vdXNlRW50ZXIgPSBfUmVhY3QkdXNlQ29udGV4dC5vbkRhdGVNb3VzZUVudGVyLFxuICAgIG9uRGF0ZU1vdXNlTGVhdmUgPSBfUmVhY3QkdXNlQ29udGV4dC5vbkRhdGVNb3VzZUxlYXZlLFxuICAgIG1vZGUgPSBfUmVhY3QkdXNlQ29udGV4dC5tb2RlO1xuICB2YXIgY2VsbFByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2VsbFwiKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBCb2R5ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHJvd3MgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dOdW07IGkgKz0gMSkge1xuICAgIHZhciByb3cgPSBbXTtcbiAgICB2YXIgcm93U3RhcnREYXRlID0gdm9pZCAwO1xuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKCkge1xuICAgICAgdmFyIF9vYmplY3RTcHJlYWQyO1xuICAgICAgdmFyIG9mZnNldCA9IGkgKiBjb2xOdW0gKyBqO1xuICAgICAgdmFyIGN1cnJlbnREYXRlID0gZ2V0Q2VsbERhdGUoYmFzZURhdGUsIG9mZnNldCk7XG4gICAgICB2YXIgZGlzYWJsZWQgPSBnZXRDZWxsRGF0ZURpc2FibGVkKHtcbiAgICAgICAgY2VsbERhdGU6IGN1cnJlbnREYXRlLFxuICAgICAgICBtb2RlOiBtb2RlLFxuICAgICAgICBkaXNhYmxlZERhdGU6IGRpc2FibGVkRGF0ZSxcbiAgICAgICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnXG4gICAgICB9KTtcbiAgICAgIGlmIChqID09PSAwKSB7XG4gICAgICAgIHJvd1N0YXJ0RGF0ZSA9IGN1cnJlbnREYXRlO1xuICAgICAgICBpZiAocHJlZml4Q29sdW1uKSB7XG4gICAgICAgICAgcm93LnB1c2gocHJlZml4Q29sdW1uKHJvd1N0YXJ0RGF0ZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgdGl0bGUgPSB0aXRsZUNlbGwgJiYgdGl0bGVDZWxsKGN1cnJlbnREYXRlKTtcbiAgICAgIHJvdy5wdXNoKCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInRkXCIsIHtcbiAgICAgICAga2V5OiBqLFxuICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjZWxsUHJlZml4Q2xzLCBfb2JqZWN0U3ByZWFkKChfb2JqZWN0U3ByZWFkMiA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX29iamVjdFNwcmVhZDIsIFwiXCIuY29uY2F0KGNlbGxQcmVmaXhDbHMsIFwiLWRpc2FibGVkXCIpLCBkaXNhYmxlZCksIF9kZWZpbmVQcm9wZXJ0eShfb2JqZWN0U3ByZWFkMiwgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItc3RhcnRcIiksIGdldENlbGxUZXh0KGN1cnJlbnREYXRlKSA9PT0gMSB8fCBwaWNrZXIgPT09ICd5ZWFyJyAmJiBOdW1iZXIodGl0bGUpICUgMTAgPT09IDApLCBfZGVmaW5lUHJvcGVydHkoX29iamVjdFNwcmVhZDIsIFwiXCIuY29uY2F0KGNlbGxQcmVmaXhDbHMsIFwiLWVuZFwiKSwgdGl0bGUgPT09IGdldExhc3REYXkoZ2VuZXJhdGVDb25maWcsIGN1cnJlbnREYXRlKSB8fCBwaWNrZXIgPT09ICd5ZWFyJyAmJiBOdW1iZXIodGl0bGUpICUgMTAgPT09IDkpLCBfb2JqZWN0U3ByZWFkMiksIGdldENlbGxDbGFzc05hbWUoY3VycmVudERhdGUpKSksXG4gICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgICAgICAgb25TZWxlY3QoY3VycmVudERhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25Nb3VzZUVudGVyOiBmdW5jdGlvbiBvbk1vdXNlRW50ZXIoKSB7XG4gICAgICAgICAgaWYgKCFkaXNhYmxlZCAmJiBvbkRhdGVNb3VzZUVudGVyKSB7XG4gICAgICAgICAgICBvbkRhdGVNb3VzZUVudGVyKGN1cnJlbnREYXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9uTW91c2VMZWF2ZTogZnVuY3Rpb24gb25Nb3VzZUxlYXZlKCkge1xuICAgICAgICAgIGlmICghZGlzYWJsZWQgJiYgb25EYXRlTW91c2VMZWF2ZSkge1xuICAgICAgICAgICAgb25EYXRlTW91c2VMZWF2ZShjdXJyZW50RGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBnZXRDZWxsTm9kZSA/IGdldENlbGxOb2RlKGN1cnJlbnREYXRlKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1pbm5lclwiKVxuICAgICAgfSwgZ2V0Q2VsbFRleHQoY3VycmVudERhdGUpKSkpO1xuICAgIH07XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb2xOdW07IGogKz0gMSkge1xuICAgICAgX2xvb3AoKTtcbiAgICB9XG4gICAgcm93cy5wdXNoKCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInRyXCIsIHtcbiAgICAgIGtleTogaSxcbiAgICAgIGNsYXNzTmFtZTogcm93Q2xhc3NOYW1lICYmIHJvd0NsYXNzTmFtZShyb3dTdGFydERhdGUpXG4gICAgfSwgcm93KSk7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYm9keVwiKVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInRhYmxlXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29udGVudFwiKVxuICB9LCBoZWFkZXJDZWxscyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInRoZWFkXCIsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwidHJcIiwgbnVsbCwgaGVhZGVyQ2VsbHMpKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0Ym9keVwiLCBudWxsLCByb3dzKSkpO1xufSIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IERFQ0FERV9ESVNUQU5DRV9DT1VOVCwgREVDQURFX1VOSVRfRElGRiB9IGZyb20gJy4nO1xuaW1wb3J0IFBhbmVsQm9keSBmcm9tICcuLi9QYW5lbEJvZHknO1xuZXhwb3J0IHZhciBERUNBREVfQ09MX0NPVU5UID0gMztcbnZhciBERUNBREVfUk9XX0NPVU5UID0gNDtcbmZ1bmN0aW9uIERlY2FkZUJvZHkocHJvcHMpIHtcbiAgdmFyIERFQ0FERV9VTklUX0RJRkZfREVTID0gREVDQURFX1VOSVRfRElGRiAtIDE7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgdmlld0RhdGUgPSBwcm9wcy52aWV3RGF0ZSxcbiAgICBnZW5lcmF0ZUNvbmZpZyA9IHByb3BzLmdlbmVyYXRlQ29uZmlnO1xuICB2YXIgY2VsbFByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2VsbFwiKTtcbiAgdmFyIHllYXJOdW1iZXIgPSBnZW5lcmF0ZUNvbmZpZy5nZXRZZWFyKHZpZXdEYXRlKTtcbiAgdmFyIGRlY2FkZVllYXJOdW1iZXIgPSBNYXRoLmZsb29yKHllYXJOdW1iZXIgLyBERUNBREVfVU5JVF9ESUZGKSAqIERFQ0FERV9VTklUX0RJRkY7XG4gIHZhciBzdGFydERlY2FkZVllYXIgPSBNYXRoLmZsb29yKHllYXJOdW1iZXIgLyBERUNBREVfRElTVEFOQ0VfQ09VTlQpICogREVDQURFX0RJU1RBTkNFX0NPVU5UO1xuICB2YXIgZW5kRGVjYWRlWWVhciA9IHN0YXJ0RGVjYWRlWWVhciArIERFQ0FERV9ESVNUQU5DRV9DT1VOVCAtIDE7XG4gIHZhciBiYXNlRGVjYWRlWWVhciA9IGdlbmVyYXRlQ29uZmlnLnNldFllYXIodmlld0RhdGUsIHN0YXJ0RGVjYWRlWWVhciAtIE1hdGguY2VpbCgoREVDQURFX0NPTF9DT1VOVCAqIERFQ0FERV9ST1dfQ09VTlQgKiBERUNBREVfVU5JVF9ESUZGIC0gREVDQURFX0RJU1RBTkNFX0NPVU5UKSAvIDIpKTtcbiAgdmFyIGdldENlbGxDbGFzc05hbWUgPSBmdW5jdGlvbiBnZXRDZWxsQ2xhc3NOYW1lKGRhdGUpIHtcbiAgICB2YXIgX3JlZjtcbiAgICB2YXIgc3RhcnREZWNhZGVOdW1iZXIgPSBnZW5lcmF0ZUNvbmZpZy5nZXRZZWFyKGRhdGUpO1xuICAgIHZhciBlbmREZWNhZGVOdW1iZXIgPSBzdGFydERlY2FkZU51bWJlciArIERFQ0FERV9VTklUX0RJRkZfREVTO1xuICAgIHJldHVybiBfcmVmID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfcmVmLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1pbi12aWV3XCIpLCBzdGFydERlY2FkZVllYXIgPD0gc3RhcnREZWNhZGVOdW1iZXIgJiYgZW5kRGVjYWRlTnVtYmVyIDw9IGVuZERlY2FkZVllYXIpLCBfZGVmaW5lUHJvcGVydHkoX3JlZiwgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItc2VsZWN0ZWRcIiksIHN0YXJ0RGVjYWRlTnVtYmVyID09PSBkZWNhZGVZZWFyTnVtYmVyKSwgX3JlZjtcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBhbmVsQm9keSwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcm93TnVtOiBERUNBREVfUk9XX0NPVU5ULFxuICAgIGNvbE51bTogREVDQURFX0NPTF9DT1VOVCxcbiAgICBiYXNlRGF0ZTogYmFzZURlY2FkZVllYXIsXG4gICAgZ2V0Q2VsbFRleHQ6IGZ1bmN0aW9uIGdldENlbGxUZXh0KGRhdGUpIHtcbiAgICAgIHZhciBzdGFydERlY2FkZU51bWJlciA9IGdlbmVyYXRlQ29uZmlnLmdldFllYXIoZGF0ZSk7XG4gICAgICByZXR1cm4gXCJcIi5jb25jYXQoc3RhcnREZWNhZGVOdW1iZXIsIFwiLVwiKS5jb25jYXQoc3RhcnREZWNhZGVOdW1iZXIgKyBERUNBREVfVU5JVF9ESUZGX0RFUyk7XG4gICAgfSxcbiAgICBnZXRDZWxsQ2xhc3NOYW1lOiBnZXRDZWxsQ2xhc3NOYW1lLFxuICAgIGdldENlbGxEYXRlOiBmdW5jdGlvbiBnZXRDZWxsRGF0ZShkYXRlLCBvZmZzZXQpIHtcbiAgICAgIHJldHVybiBnZW5lcmF0ZUNvbmZpZy5hZGRZZWFyKGRhdGUsIG9mZnNldCAqIERFQ0FERV9VTklUX0RJRkYpO1xuICAgIH1cbiAgfSkpO1xufVxuZXhwb3J0IGRlZmF1bHQgRGVjYWRlQm9keTsiLCJpbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IEtleUNvZGUgZnJvbSBcInJjLXV0aWwvZXMvS2V5Q29kZVwiO1xuaW1wb3J0IHJhZiBmcm9tIFwicmMtdXRpbC9lcy9yYWZcIjtcbmltcG9ydCBpc1Zpc2libGUgZnJvbSBcInJjLXV0aWwvZXMvRG9tL2lzVmlzaWJsZVwiO1xudmFyIHNjcm9sbElkcyA9IG5ldyBNYXAoKTtcbi8qKiBUcmlnZ2VyIHdoZW4gZWxlbWVudCBpcyB2aXNpYmxlIGluIHZpZXcgKi9cbmV4cG9ydCBmdW5jdGlvbiB3YWl0RWxlbWVudFJlYWR5KGVsZW1lbnQsIGNhbGxiYWNrKSB7XG4gIHZhciBpZDtcbiAgZnVuY3Rpb24gdHJ5T3JOZXh0RnJhbWUoKSB7XG4gICAgaWYgKGlzVmlzaWJsZShlbGVtZW50KSkge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWQgPSByYWYoZnVuY3Rpb24gKCkge1xuICAgICAgICB0cnlPck5leHRGcmFtZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHRyeU9yTmV4dEZyYW1lKCk7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmFmLmNhbmNlbChpZCk7XG4gIH07XG59XG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjcm9sbFRvKGVsZW1lbnQsIHRvLCBkdXJhdGlvbikge1xuICBpZiAoc2Nyb2xsSWRzLmdldChlbGVtZW50KSkge1xuICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHNjcm9sbElkcy5nZXQoZWxlbWVudCkpO1xuICB9XG4gIC8vIGp1bXAgdG8gdGFyZ2V0IGlmIGR1cmF0aW9uIHplcm9cbiAgaWYgKGR1cmF0aW9uIDw9IDApIHtcbiAgICBzY3JvbGxJZHMuc2V0KGVsZW1lbnQsIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICBlbGVtZW50LnNjcm9sbFRvcCA9IHRvO1xuICAgIH0pKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGRpZmZlcmVuY2UgPSB0byAtIGVsZW1lbnQuc2Nyb2xsVG9wO1xuICB2YXIgcGVyVGljayA9IGRpZmZlcmVuY2UgLyBkdXJhdGlvbiAqIDEwO1xuICBzY3JvbGxJZHMuc2V0KGVsZW1lbnQsIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgZWxlbWVudC5zY3JvbGxUb3AgKz0gcGVyVGljaztcbiAgICBpZiAoZWxlbWVudC5zY3JvbGxUb3AgIT09IHRvKSB7XG4gICAgICBzY3JvbGxUbyhlbGVtZW50LCB0bywgZHVyYXRpb24gLSAxMCk7XG4gICAgfVxuICB9KSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlS2V5RG93bkhhbmRsZXIoZXZlbnQsIF9yZWYpIHtcbiAgdmFyIG9uTGVmdFJpZ2h0ID0gX3JlZi5vbkxlZnRSaWdodCxcbiAgICBvbkN0cmxMZWZ0UmlnaHQgPSBfcmVmLm9uQ3RybExlZnRSaWdodCxcbiAgICBvblVwRG93biA9IF9yZWYub25VcERvd24sXG4gICAgb25QYWdlVXBEb3duID0gX3JlZi5vblBhZ2VVcERvd24sXG4gICAgb25FbnRlciA9IF9yZWYub25FbnRlcjtcbiAgdmFyIHdoaWNoID0gZXZlbnQud2hpY2gsXG4gICAgY3RybEtleSA9IGV2ZW50LmN0cmxLZXksXG4gICAgbWV0YUtleSA9IGV2ZW50Lm1ldGFLZXk7XG4gIHN3aXRjaCAod2hpY2gpIHtcbiAgICBjYXNlIEtleUNvZGUuTEVGVDpcbiAgICAgIGlmIChjdHJsS2V5IHx8IG1ldGFLZXkpIHtcbiAgICAgICAgaWYgKG9uQ3RybExlZnRSaWdodCkge1xuICAgICAgICAgIG9uQ3RybExlZnRSaWdodCgtMSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAob25MZWZ0UmlnaHQpIHtcbiAgICAgICAgb25MZWZ0UmlnaHQoLTEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBicmVhaztcbiAgICBjYXNlIEtleUNvZGUuUklHSFQ6XG4gICAgICBpZiAoY3RybEtleSB8fCBtZXRhS2V5KSB7XG4gICAgICAgIGlmIChvbkN0cmxMZWZ0UmlnaHQpIHtcbiAgICAgICAgICBvbkN0cmxMZWZ0UmlnaHQoMSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAob25MZWZ0UmlnaHQpIHtcbiAgICAgICAgb25MZWZ0UmlnaHQoMSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgS2V5Q29kZS5VUDpcbiAgICAgIGlmIChvblVwRG93bikge1xuICAgICAgICBvblVwRG93bigtMSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgS2V5Q29kZS5ET1dOOlxuICAgICAgaWYgKG9uVXBEb3duKSB7XG4gICAgICAgIG9uVXBEb3duKDEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBicmVhaztcbiAgICBjYXNlIEtleUNvZGUuUEFHRV9VUDpcbiAgICAgIGlmIChvblBhZ2VVcERvd24pIHtcbiAgICAgICAgb25QYWdlVXBEb3duKC0xKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBLZXlDb2RlLlBBR0VfRE9XTjpcbiAgICAgIGlmIChvblBhZ2VVcERvd24pIHtcbiAgICAgICAgb25QYWdlVXBEb3duKDEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBicmVhaztcbiAgICBjYXNlIEtleUNvZGUuRU5URVI6XG4gICAgICBpZiAob25FbnRlcikge1xuICAgICAgICBvbkVudGVyKCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbi8vID09PT09PT09PT09PT09PT09PT09PSBGb3JtYXQgPT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdEZvcm1hdChmb3JtYXQsIHBpY2tlciwgc2hvd1RpbWUsIHVzZTEySG91cnMpIHtcbiAgdmFyIG1lcmdlZEZvcm1hdCA9IGZvcm1hdDtcbiAgaWYgKCFtZXJnZWRGb3JtYXQpIHtcbiAgICBzd2l0Y2ggKHBpY2tlcikge1xuICAgICAgY2FzZSAndGltZSc6XG4gICAgICAgIG1lcmdlZEZvcm1hdCA9IHVzZTEySG91cnMgPyAnaGg6bW06c3MgYScgOiAnSEg6bW06c3MnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICBtZXJnZWRGb3JtYXQgPSAnZ2dnZy13byc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICBtZXJnZWRGb3JtYXQgPSAnWVlZWS1NTSc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncXVhcnRlcic6XG4gICAgICAgIG1lcmdlZEZvcm1hdCA9ICdZWVlZLVtRXVEnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICBtZXJnZWRGb3JtYXQgPSAnWVlZWSc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbWVyZ2VkRm9ybWF0ID0gc2hvd1RpbWUgPyAnWVlZWS1NTS1ERCBISDptbTpzcycgOiAnWVlZWS1NTS1ERCc7XG4gICAgfVxuICB9XG4gIHJldHVybiBtZXJnZWRGb3JtYXQ7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5wdXRTaXplKHBpY2tlciwgZm9ybWF0LCBnZW5lcmF0ZUNvbmZpZykge1xuICB2YXIgZGVmYXVsdFNpemUgPSBwaWNrZXIgPT09ICd0aW1lJyA/IDggOiAxMDtcbiAgdmFyIGxlbmd0aCA9IHR5cGVvZiBmb3JtYXQgPT09ICdmdW5jdGlvbicgPyBmb3JtYXQoZ2VuZXJhdGVDb25maWcuZ2V0Tm93KCkpLmxlbmd0aCA6IGZvcm1hdC5sZW5ndGg7XG4gIHJldHVybiBNYXRoLm1heChkZWZhdWx0U2l6ZSwgbGVuZ3RoKSArIDI7XG59XG52YXIgZ2xvYmFsQ2xpY2tGdW5jID0gbnVsbDtcbnZhciBjbGlja0NhbGxiYWNrcyA9IG5ldyBTZXQoKTtcbmV4cG9ydCBmdW5jdGlvbiBhZGRHbG9iYWxNb3VzZURvd25FdmVudChjYWxsYmFjaykge1xuICBpZiAoIWdsb2JhbENsaWNrRnVuYyAmJiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgIGdsb2JhbENsaWNrRnVuYyA9IGZ1bmN0aW9uIGdsb2JhbENsaWNrRnVuYyhlKSB7XG4gICAgICAvLyBDbG9uZSBhIG5ldyBsaXN0IHRvIGF2b2lkIHJlcGVhdCB0cmlnZ2VyIGV2ZW50c1xuICAgICAgX3RvQ29uc3VtYWJsZUFycmF5KGNsaWNrQ2FsbGJhY2tzKS5mb3JFYWNoKGZ1bmN0aW9uIChxdWV1ZUZ1bmMpIHtcbiAgICAgICAgcXVldWVGdW5jKGUpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgZ2xvYmFsQ2xpY2tGdW5jKTtcbiAgfVxuICBjbGlja0NhbGxiYWNrcy5hZGQoY2FsbGJhY2spO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGNsaWNrQ2FsbGJhY2tzLmRlbGV0ZShjYWxsYmFjayk7XG4gICAgaWYgKGNsaWNrQ2FsbGJhY2tzLnNpemUgPT09IDApIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBnbG9iYWxDbGlja0Z1bmMpO1xuICAgICAgZ2xvYmFsQ2xpY2tGdW5jID0gbnVsbDtcbiAgICB9XG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFyZ2V0RnJvbUV2ZW50KGUpIHtcbiAgdmFyIHRhcmdldCA9IGUudGFyZ2V0O1xuICAvLyBnZXQgdGFyZ2V0IGlmIGluIHNoYWRvdyBkb21cbiAgaWYgKGUuY29tcG9zZWQgJiYgdGFyZ2V0LnNoYWRvd1Jvb3QpIHtcbiAgICB2YXIgX2UkY29tcG9zZWRQYXRoO1xuICAgIHJldHVybiAoKF9lJGNvbXBvc2VkUGF0aCA9IGUuY29tcG9zZWRQYXRoKSA9PT0gbnVsbCB8fCBfZSRjb21wb3NlZFBhdGggPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lJGNvbXBvc2VkUGF0aC5jYWxsKGUpWzBdKSB8fCB0YXJnZXQ7XG4gIH1cbiAgcmV0dXJuIHRhcmdldDtcbn1cbi8vID09PT09PT09PT09PT09PT09PT09PT0gTW9kZSA9PT09PT09PT09PT09PT09PT09PT09XG52YXIgZ2V0WWVhck5leHRNb2RlID0gZnVuY3Rpb24gZ2V0WWVhck5leHRNb2RlKG5leHQpIHtcbiAgaWYgKG5leHQgPT09ICdtb250aCcgfHwgbmV4dCA9PT0gJ2RhdGUnKSB7XG4gICAgcmV0dXJuICd5ZWFyJztcbiAgfVxuICByZXR1cm4gbmV4dDtcbn07XG52YXIgZ2V0TW9udGhOZXh0TW9kZSA9IGZ1bmN0aW9uIGdldE1vbnRoTmV4dE1vZGUobmV4dCkge1xuICBpZiAobmV4dCA9PT0gJ2RhdGUnKSB7XG4gICAgcmV0dXJuICdtb250aCc7XG4gIH1cbiAgcmV0dXJuIG5leHQ7XG59O1xudmFyIGdldFF1YXJ0ZXJOZXh0TW9kZSA9IGZ1bmN0aW9uIGdldFF1YXJ0ZXJOZXh0TW9kZShuZXh0KSB7XG4gIGlmIChuZXh0ID09PSAnbW9udGgnIHx8IG5leHQgPT09ICdkYXRlJykge1xuICAgIHJldHVybiAncXVhcnRlcic7XG4gIH1cbiAgcmV0dXJuIG5leHQ7XG59O1xudmFyIGdldFdlZWtOZXh0TW9kZSA9IGZ1bmN0aW9uIGdldFdlZWtOZXh0TW9kZShuZXh0KSB7XG4gIGlmIChuZXh0ID09PSAnZGF0ZScpIHtcbiAgICByZXR1cm4gJ3dlZWsnO1xuICB9XG4gIHJldHVybiBuZXh0O1xufTtcbmV4cG9ydCB2YXIgUGlja2VyTW9kZU1hcCA9IHtcbiAgeWVhcjogZ2V0WWVhck5leHRNb2RlLFxuICBtb250aDogZ2V0TW9udGhOZXh0TW9kZSxcbiAgcXVhcnRlcjogZ2V0UXVhcnRlck5leHRNb2RlLFxuICB3ZWVrOiBnZXRXZWVrTmV4dE1vZGUsXG4gIHRpbWU6IG51bGwsXG4gIGRhdGU6IG51bGxcbn07XG5leHBvcnQgZnVuY3Rpb24gZWxlbWVudHNDb250YWlucyhlbGVtZW50cywgdGFyZ2V0KSB7XG4gIHJldHVybiBlbGVtZW50cy5zb21lKGZ1bmN0aW9uIChlbGUpIHtcbiAgICByZXR1cm4gZWxlICYmIGVsZS5jb250YWlucyh0YXJnZXQpO1xuICB9KTtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBEZWNhZGVIZWFkZXIgZnJvbSAnLi9EZWNhZGVIZWFkZXInO1xuaW1wb3J0IERlY2FkZUJvZHksIHsgREVDQURFX0NPTF9DT1VOVCB9IGZyb20gJy4vRGVjYWRlQm9keSc7XG5pbXBvcnQgeyBjcmVhdGVLZXlEb3duSGFuZGxlciB9IGZyb20gJy4uLy4uL3V0aWxzL3VpVXRpbCc7XG5leHBvcnQgdmFyIERFQ0FERV9VTklUX0RJRkYgPSAxMDtcbmV4cG9ydCB2YXIgREVDQURFX0RJU1RBTkNFX0NPVU5UID0gREVDQURFX1VOSVRfRElGRiAqIDEwO1xuZnVuY3Rpb24gRGVjYWRlUGFuZWwocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBvblZpZXdEYXRlQ2hhbmdlID0gcHJvcHMub25WaWV3RGF0ZUNoYW5nZSxcbiAgICBnZW5lcmF0ZUNvbmZpZyA9IHByb3BzLmdlbmVyYXRlQ29uZmlnLFxuICAgIHZpZXdEYXRlID0gcHJvcHMudmlld0RhdGUsXG4gICAgb3BlcmF0aW9uUmVmID0gcHJvcHMub3BlcmF0aW9uUmVmLFxuICAgIG9uU2VsZWN0ID0gcHJvcHMub25TZWxlY3QsXG4gICAgb25QYW5lbENoYW5nZSA9IHByb3BzLm9uUGFuZWxDaGFuZ2U7XG4gIHZhciBwYW5lbFByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGVjYWRlLXBhbmVsXCIpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBLZXlib2FyZCA9PT09PT09PT09PT09PT09PT09PT09PVxuICBvcGVyYXRpb25SZWYuY3VycmVudCA9IHtcbiAgICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihldmVudCkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUtleURvd25IYW5kbGVyKGV2ZW50LCB7XG4gICAgICAgIG9uTGVmdFJpZ2h0OiBmdW5jdGlvbiBvbkxlZnRSaWdodChkaWZmKSB7XG4gICAgICAgICAgb25TZWxlY3QoZ2VuZXJhdGVDb25maWcuYWRkWWVhcih2aWV3RGF0ZSwgZGlmZiAqIERFQ0FERV9VTklUX0RJRkYpLCAna2V5Jyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ3RybExlZnRSaWdodDogZnVuY3Rpb24gb25DdHJsTGVmdFJpZ2h0KGRpZmYpIHtcbiAgICAgICAgICBvblNlbGVjdChnZW5lcmF0ZUNvbmZpZy5hZGRZZWFyKHZpZXdEYXRlLCBkaWZmICogREVDQURFX0RJU1RBTkNFX0NPVU5UKSwgJ2tleScpO1xuICAgICAgICB9LFxuICAgICAgICBvblVwRG93bjogZnVuY3Rpb24gb25VcERvd24oZGlmZikge1xuICAgICAgICAgIG9uU2VsZWN0KGdlbmVyYXRlQ29uZmlnLmFkZFllYXIodmlld0RhdGUsIGRpZmYgKiBERUNBREVfVU5JVF9ESUZGICogREVDQURFX0NPTF9DT1VOVCksICdrZXknKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FbnRlcjogZnVuY3Rpb24gb25FbnRlcigpIHtcbiAgICAgICAgICBvblBhbmVsQ2hhbmdlKCd5ZWFyJywgdmlld0RhdGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIC8vID09PT09PT09PT09PT09PT09PT09IFZpZXcgT3BlcmF0aW9uID09PT09PT09PT09PT09PT09PT09XG4gIHZhciBvbkRlY2FkZXNDaGFuZ2UgPSBmdW5jdGlvbiBvbkRlY2FkZXNDaGFuZ2UoZGlmZikge1xuICAgIHZhciBuZXdEYXRlID0gZ2VuZXJhdGVDb25maWcuYWRkWWVhcih2aWV3RGF0ZSwgZGlmZiAqIERFQ0FERV9ESVNUQU5DRV9DT1VOVCk7XG4gICAgb25WaWV3RGF0ZUNoYW5nZShuZXdEYXRlKTtcbiAgICBvblBhbmVsQ2hhbmdlKG51bGwsIG5ld0RhdGUpO1xuICB9O1xuICB2YXIgb25JbnRlcm5hbFNlbGVjdCA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxTZWxlY3QoZGF0ZSkge1xuICAgIG9uU2VsZWN0KGRhdGUsICdtb3VzZScpO1xuICAgIG9uUGFuZWxDaGFuZ2UoJ3llYXInLCBkYXRlKTtcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IHBhbmVsUHJlZml4Q2xzXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERlY2FkZUhlYWRlciwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgb25QcmV2RGVjYWRlczogZnVuY3Rpb24gb25QcmV2RGVjYWRlcygpIHtcbiAgICAgIG9uRGVjYWRlc0NoYW5nZSgtMSk7XG4gICAgfSxcbiAgICBvbk5leHREZWNhZGVzOiBmdW5jdGlvbiBvbk5leHREZWNhZGVzKCkge1xuICAgICAgb25EZWNhZGVzQ2hhbmdlKDEpO1xuICAgIH1cbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEZWNhZGVCb2R5LCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBvblNlbGVjdDogb25JbnRlcm5hbFNlbGVjdFxuICB9KSkpO1xufVxuZXhwb3J0IGRlZmF1bHQgRGVjYWRlUGFuZWw7IiwiaW1wb3J0IHsgREVDQURFX1VOSVRfRElGRiB9IGZyb20gJy4uL3BhbmVscy9EZWNhZGVQYW5lbC9pbmRleCc7XG5leHBvcnQgdmFyIFdFRUtfREFZX0NPVU5UID0gNztcbmV4cG9ydCBmdW5jdGlvbiBpc051bGxFcXVhbCh2YWx1ZTEsIHZhbHVlMikge1xuICBpZiAoIXZhbHVlMSAmJiAhdmFsdWUyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKCF2YWx1ZTEgfHwgIXZhbHVlMikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU2FtZURlY2FkZShnZW5lcmF0ZUNvbmZpZywgZGVjYWRlMSwgZGVjYWRlMikge1xuICB2YXIgZXF1YWwgPSBpc051bGxFcXVhbChkZWNhZGUxLCBkZWNhZGUyKTtcbiAgaWYgKHR5cGVvZiBlcXVhbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIGVxdWFsO1xuICB9XG4gIHZhciBudW0xID0gTWF0aC5mbG9vcihnZW5lcmF0ZUNvbmZpZy5nZXRZZWFyKGRlY2FkZTEpIC8gMTApO1xuICB2YXIgbnVtMiA9IE1hdGguZmxvb3IoZ2VuZXJhdGVDb25maWcuZ2V0WWVhcihkZWNhZGUyKSAvIDEwKTtcbiAgcmV0dXJuIG51bTEgPT09IG51bTI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTYW1lWWVhcihnZW5lcmF0ZUNvbmZpZywgeWVhcjEsIHllYXIyKSB7XG4gIHZhciBlcXVhbCA9IGlzTnVsbEVxdWFsKHllYXIxLCB5ZWFyMik7XG4gIGlmICh0eXBlb2YgZXF1YWwgPT09ICdib29sZWFuJykge1xuICAgIHJldHVybiBlcXVhbDtcbiAgfVxuICByZXR1cm4gZ2VuZXJhdGVDb25maWcuZ2V0WWVhcih5ZWFyMSkgPT09IGdlbmVyYXRlQ29uZmlnLmdldFllYXIoeWVhcjIpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFF1YXJ0ZXIoZ2VuZXJhdGVDb25maWcsIGRhdGUpIHtcbiAgdmFyIHF1b3RhID0gTWF0aC5mbG9vcihnZW5lcmF0ZUNvbmZpZy5nZXRNb250aChkYXRlKSAvIDMpO1xuICByZXR1cm4gcXVvdGEgKyAxO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU2FtZVF1YXJ0ZXIoZ2VuZXJhdGVDb25maWcsIHF1YXJ0ZXIxLCBxdWFydGVyMikge1xuICB2YXIgZXF1YWwgPSBpc051bGxFcXVhbChxdWFydGVyMSwgcXVhcnRlcjIpO1xuICBpZiAodHlwZW9mIGVxdWFsID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gZXF1YWw7XG4gIH1cbiAgcmV0dXJuIGlzU2FtZVllYXIoZ2VuZXJhdGVDb25maWcsIHF1YXJ0ZXIxLCBxdWFydGVyMikgJiYgZ2V0UXVhcnRlcihnZW5lcmF0ZUNvbmZpZywgcXVhcnRlcjEpID09PSBnZXRRdWFydGVyKGdlbmVyYXRlQ29uZmlnLCBxdWFydGVyMik7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTYW1lTW9udGgoZ2VuZXJhdGVDb25maWcsIG1vbnRoMSwgbW9udGgyKSB7XG4gIHZhciBlcXVhbCA9IGlzTnVsbEVxdWFsKG1vbnRoMSwgbW9udGgyKTtcbiAgaWYgKHR5cGVvZiBlcXVhbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIGVxdWFsO1xuICB9XG4gIHJldHVybiBpc1NhbWVZZWFyKGdlbmVyYXRlQ29uZmlnLCBtb250aDEsIG1vbnRoMikgJiYgZ2VuZXJhdGVDb25maWcuZ2V0TW9udGgobW9udGgxKSA9PT0gZ2VuZXJhdGVDb25maWcuZ2V0TW9udGgobW9udGgyKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1NhbWVEYXRlKGdlbmVyYXRlQ29uZmlnLCBkYXRlMSwgZGF0ZTIpIHtcbiAgdmFyIGVxdWFsID0gaXNOdWxsRXF1YWwoZGF0ZTEsIGRhdGUyKTtcbiAgaWYgKHR5cGVvZiBlcXVhbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIGVxdWFsO1xuICB9XG4gIHJldHVybiBnZW5lcmF0ZUNvbmZpZy5nZXRZZWFyKGRhdGUxKSA9PT0gZ2VuZXJhdGVDb25maWcuZ2V0WWVhcihkYXRlMikgJiYgZ2VuZXJhdGVDb25maWcuZ2V0TW9udGgoZGF0ZTEpID09PSBnZW5lcmF0ZUNvbmZpZy5nZXRNb250aChkYXRlMikgJiYgZ2VuZXJhdGVDb25maWcuZ2V0RGF0ZShkYXRlMSkgPT09IGdlbmVyYXRlQ29uZmlnLmdldERhdGUoZGF0ZTIpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU2FtZVRpbWUoZ2VuZXJhdGVDb25maWcsIHRpbWUxLCB0aW1lMikge1xuICB2YXIgZXF1YWwgPSBpc051bGxFcXVhbCh0aW1lMSwgdGltZTIpO1xuICBpZiAodHlwZW9mIGVxdWFsID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gZXF1YWw7XG4gIH1cbiAgcmV0dXJuIGdlbmVyYXRlQ29uZmlnLmdldEhvdXIodGltZTEpID09PSBnZW5lcmF0ZUNvbmZpZy5nZXRIb3VyKHRpbWUyKSAmJiBnZW5lcmF0ZUNvbmZpZy5nZXRNaW51dGUodGltZTEpID09PSBnZW5lcmF0ZUNvbmZpZy5nZXRNaW51dGUodGltZTIpICYmIGdlbmVyYXRlQ29uZmlnLmdldFNlY29uZCh0aW1lMSkgPT09IGdlbmVyYXRlQ29uZmlnLmdldFNlY29uZCh0aW1lMik7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTYW1lV2VlayhnZW5lcmF0ZUNvbmZpZywgbG9jYWxlLCBkYXRlMSwgZGF0ZTIpIHtcbiAgdmFyIGVxdWFsID0gaXNOdWxsRXF1YWwoZGF0ZTEsIGRhdGUyKTtcbiAgaWYgKHR5cGVvZiBlcXVhbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIGVxdWFsO1xuICB9XG4gIHJldHVybiBnZW5lcmF0ZUNvbmZpZy5sb2NhbGUuZ2V0V2Vlayhsb2NhbGUsIGRhdGUxKSA9PT0gZ2VuZXJhdGVDb25maWcubG9jYWxlLmdldFdlZWsobG9jYWxlLCBkYXRlMik7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFcXVhbChnZW5lcmF0ZUNvbmZpZywgdmFsdWUxLCB2YWx1ZTIpIHtcbiAgcmV0dXJuIGlzU2FtZURhdGUoZ2VuZXJhdGVDb25maWcsIHZhbHVlMSwgdmFsdWUyKSAmJiBpc1NhbWVUaW1lKGdlbmVyYXRlQ29uZmlnLCB2YWx1ZTEsIHZhbHVlMik7XG59XG4vKiogQmV0d2VlbiBpbiBkYXRlIGJ1dCBub3QgZXF1YWwgb2YgZGF0ZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW5SYW5nZShnZW5lcmF0ZUNvbmZpZywgc3RhcnREYXRlLCBlbmREYXRlLCBjdXJyZW50KSB7XG4gIGlmICghc3RhcnREYXRlIHx8ICFlbmREYXRlIHx8ICFjdXJyZW50KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAhaXNTYW1lRGF0ZShnZW5lcmF0ZUNvbmZpZywgc3RhcnREYXRlLCBjdXJyZW50KSAmJiAhaXNTYW1lRGF0ZShnZW5lcmF0ZUNvbmZpZywgZW5kRGF0ZSwgY3VycmVudCkgJiYgZ2VuZXJhdGVDb25maWcuaXNBZnRlcihjdXJyZW50LCBzdGFydERhdGUpICYmIGdlbmVyYXRlQ29uZmlnLmlzQWZ0ZXIoZW5kRGF0ZSwgY3VycmVudCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0V2Vla1N0YXJ0RGF0ZShsb2NhbGUsIGdlbmVyYXRlQ29uZmlnLCB2YWx1ZSkge1xuICB2YXIgd2Vla0ZpcnN0RGF5ID0gZ2VuZXJhdGVDb25maWcubG9jYWxlLmdldFdlZWtGaXJzdERheShsb2NhbGUpO1xuICB2YXIgbW9udGhTdGFydERhdGUgPSBnZW5lcmF0ZUNvbmZpZy5zZXREYXRlKHZhbHVlLCAxKTtcbiAgdmFyIHN0YXJ0RGF0ZVdlZWtEYXkgPSBnZW5lcmF0ZUNvbmZpZy5nZXRXZWVrRGF5KG1vbnRoU3RhcnREYXRlKTtcbiAgdmFyIGFsaWduU3RhcnREYXRlID0gZ2VuZXJhdGVDb25maWcuYWRkRGF0ZShtb250aFN0YXJ0RGF0ZSwgd2Vla0ZpcnN0RGF5IC0gc3RhcnREYXRlV2Vla0RheSk7XG4gIGlmIChnZW5lcmF0ZUNvbmZpZy5nZXRNb250aChhbGlnblN0YXJ0RGF0ZSkgPT09IGdlbmVyYXRlQ29uZmlnLmdldE1vbnRoKHZhbHVlKSAmJiBnZW5lcmF0ZUNvbmZpZy5nZXREYXRlKGFsaWduU3RhcnREYXRlKSA+IDEpIHtcbiAgICBhbGlnblN0YXJ0RGF0ZSA9IGdlbmVyYXRlQ29uZmlnLmFkZERhdGUoYWxpZ25TdGFydERhdGUsIC03KTtcbiAgfVxuICByZXR1cm4gYWxpZ25TdGFydERhdGU7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2xvc2luZ1ZpZXdEYXRlKHZpZXdEYXRlLCBwaWNrZXIsIGdlbmVyYXRlQ29uZmlnKSB7XG4gIHZhciBvZmZzZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IDE7XG4gIHN3aXRjaCAocGlja2VyKSB7XG4gICAgY2FzZSAneWVhcic6XG4gICAgICByZXR1cm4gZ2VuZXJhdGVDb25maWcuYWRkWWVhcih2aWV3RGF0ZSwgb2Zmc2V0ICogMTApO1xuICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgIHJldHVybiBnZW5lcmF0ZUNvbmZpZy5hZGRZZWFyKHZpZXdEYXRlLCBvZmZzZXQpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZ2VuZXJhdGVDb25maWcuYWRkTW9udGgodmlld0RhdGUsIG9mZnNldCk7XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRWYWx1ZSh2YWx1ZSwgX3JlZikge1xuICB2YXIgZ2VuZXJhdGVDb25maWcgPSBfcmVmLmdlbmVyYXRlQ29uZmlnLFxuICAgIGxvY2FsZSA9IF9yZWYubG9jYWxlLFxuICAgIGZvcm1hdCA9IF9yZWYuZm9ybWF0O1xuICByZXR1cm4gdHlwZW9mIGZvcm1hdCA9PT0gJ2Z1bmN0aW9uJyA/IGZvcm1hdCh2YWx1ZSkgOiBnZW5lcmF0ZUNvbmZpZy5sb2NhbGUuZm9ybWF0KGxvY2FsZS5sb2NhbGUsIHZhbHVlLCBmb3JtYXQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVmFsdWUodmFsdWUsIF9yZWYyKSB7XG4gIHZhciBnZW5lcmF0ZUNvbmZpZyA9IF9yZWYyLmdlbmVyYXRlQ29uZmlnLFxuICAgIGxvY2FsZSA9IF9yZWYyLmxvY2FsZSxcbiAgICBmb3JtYXRMaXN0ID0gX3JlZjIuZm9ybWF0TGlzdDtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgZm9ybWF0TGlzdFswXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBnZW5lcmF0ZUNvbmZpZy5sb2NhbGUucGFyc2UobG9jYWxlLmxvY2FsZSwgdmFsdWUsIGZvcm1hdExpc3QpO1xufVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2VsbERhdGVEaXNhYmxlZChfcmVmMykge1xuICB2YXIgY2VsbERhdGUgPSBfcmVmMy5jZWxsRGF0ZSxcbiAgICBtb2RlID0gX3JlZjMubW9kZSxcbiAgICBkaXNhYmxlZERhdGUgPSBfcmVmMy5kaXNhYmxlZERhdGUsXG4gICAgZ2VuZXJhdGVDb25maWcgPSBfcmVmMy5nZW5lcmF0ZUNvbmZpZztcbiAgaWYgKCFkaXNhYmxlZERhdGUpIHJldHVybiBmYWxzZTtcbiAgLy8gV2hldGhlciBjZWxsRGF0ZSBpcyBkaXNhYmxlZCBpbiByYW5nZVxuICB2YXIgZ2V0RGlzYWJsZWRGcm9tUmFuZ2UgPSBmdW5jdGlvbiBnZXREaXNhYmxlZEZyb21SYW5nZShjdXJyZW50TW9kZSwgc3RhcnQsIGVuZCkge1xuICAgIHZhciBjdXJyZW50ID0gc3RhcnQ7XG4gICAgd2hpbGUgKGN1cnJlbnQgPD0gZW5kKSB7XG4gICAgICB2YXIgZGF0ZSA9IHZvaWQgMDtcbiAgICAgIHN3aXRjaCAoY3VycmVudE1vZGUpIHtcbiAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgICAge1xuICAgICAgICAgICAgZGF0ZSA9IGdlbmVyYXRlQ29uZmlnLnNldERhdGUoY2VsbERhdGUsIGN1cnJlbnQpO1xuICAgICAgICAgICAgaWYgKCFkaXNhYmxlZERhdGUoZGF0ZSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAge1xuICAgICAgICAgICAgZGF0ZSA9IGdlbmVyYXRlQ29uZmlnLnNldE1vbnRoKGNlbGxEYXRlLCBjdXJyZW50KTtcbiAgICAgICAgICAgIGlmICghZ2V0Q2VsbERhdGVEaXNhYmxlZCh7XG4gICAgICAgICAgICAgIGNlbGxEYXRlOiBkYXRlLFxuICAgICAgICAgICAgICBtb2RlOiAnbW9udGgnLFxuICAgICAgICAgICAgICBnZW5lcmF0ZUNvbmZpZzogZ2VuZXJhdGVDb25maWcsXG4gICAgICAgICAgICAgIGRpc2FibGVkRGF0ZTogZGlzYWJsZWREYXRlXG4gICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRhdGUgPSBnZW5lcmF0ZUNvbmZpZy5zZXRZZWFyKGNlbGxEYXRlLCBjdXJyZW50KTtcbiAgICAgICAgICAgIGlmICghZ2V0Q2VsbERhdGVEaXNhYmxlZCh7XG4gICAgICAgICAgICAgIGNlbGxEYXRlOiBkYXRlLFxuICAgICAgICAgICAgICBtb2RlOiAneWVhcicsXG4gICAgICAgICAgICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZyxcbiAgICAgICAgICAgICAgZGlzYWJsZWREYXRlOiBkaXNhYmxlZERhdGVcbiAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgKz0gMTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG4gIHN3aXRjaCAobW9kZSkge1xuICAgIGNhc2UgJ2RhdGUnOlxuICAgIGNhc2UgJ3dlZWsnOlxuICAgICAge1xuICAgICAgICByZXR1cm4gZGlzYWJsZWREYXRlKGNlbGxEYXRlKTtcbiAgICAgIH1cbiAgICBjYXNlICdtb250aCc6XG4gICAgICB7XG4gICAgICAgIHZhciBzdGFydERhdGUgPSAxO1xuICAgICAgICB2YXIgZW5kRGF0ZSA9IGdlbmVyYXRlQ29uZmlnLmdldERhdGUoZ2VuZXJhdGVDb25maWcuZ2V0RW5kRGF0ZShjZWxsRGF0ZSkpO1xuICAgICAgICByZXR1cm4gZ2V0RGlzYWJsZWRGcm9tUmFuZ2UoJ2RhdGUnLCBzdGFydERhdGUsIGVuZERhdGUpO1xuICAgICAgfVxuICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAge1xuICAgICAgICB2YXIgc3RhcnRNb250aCA9IE1hdGguZmxvb3IoZ2VuZXJhdGVDb25maWcuZ2V0TW9udGgoY2VsbERhdGUpIC8gMykgKiAzO1xuICAgICAgICB2YXIgZW5kTW9udGggPSBzdGFydE1vbnRoICsgMjtcbiAgICAgICAgcmV0dXJuIGdldERpc2FibGVkRnJvbVJhbmdlKCdtb250aCcsIHN0YXJ0TW9udGgsIGVuZE1vbnRoKTtcbiAgICAgIH1cbiAgICBjYXNlICd5ZWFyJzpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIGdldERpc2FibGVkRnJvbVJhbmdlKCdtb250aCcsIDAsIDExKTtcbiAgICAgIH1cbiAgICBjYXNlICdkZWNhZGUnOlxuICAgICAge1xuICAgICAgICB2YXIgeWVhciA9IGdlbmVyYXRlQ29uZmlnLmdldFllYXIoY2VsbERhdGUpO1xuICAgICAgICB2YXIgc3RhcnRZZWFyID0gTWF0aC5mbG9vcih5ZWFyIC8gREVDQURFX1VOSVRfRElGRikgKiBERUNBREVfVU5JVF9ESUZGO1xuICAgICAgICB2YXIgZW5kWWVhciA9IHN0YXJ0WWVhciArIERFQ0FERV9VTklUX0RJRkYgLSAxO1xuICAgICAgICByZXR1cm4gZ2V0RGlzYWJsZWRGcm9tUmFuZ2UoJ3llYXInLCBzdGFydFllYXIsIGVuZFllYXIpO1xuICAgICAgfVxuICB9XG59IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEhlYWRlciBmcm9tICcuLi9IZWFkZXInO1xuaW1wb3J0IFBhbmVsQ29udGV4dCBmcm9tICcuLi8uLi9QYW5lbENvbnRleHQnO1xuaW1wb3J0IHsgZm9ybWF0VmFsdWUgfSBmcm9tICcuLi8uLi91dGlscy9kYXRlVXRpbCc7XG5mdW5jdGlvbiBUaW1lSGVhZGVyKHByb3BzKSB7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoUGFuZWxDb250ZXh0KSxcbiAgICBoaWRlSGVhZGVyID0gX1JlYWN0JHVzZUNvbnRleHQuaGlkZUhlYWRlcjtcbiAgaWYgKGhpZGVIZWFkZXIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGdlbmVyYXRlQ29uZmlnID0gcHJvcHMuZ2VuZXJhdGVDb25maWcsXG4gICAgbG9jYWxlID0gcHJvcHMubG9jYWxlLFxuICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgZm9ybWF0ID0gcHJvcHMuZm9ybWF0O1xuICB2YXIgaGVhZGVyUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oZWFkZXJcIik7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChIZWFkZXIsIHtcbiAgICBwcmVmaXhDbHM6IGhlYWRlclByZWZpeENsc1xuICB9LCB2YWx1ZSA/IGZvcm1hdFZhbHVlKHZhbHVlLCB7XG4gICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgZm9ybWF0OiBmb3JtYXQsXG4gICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnXG4gIH0pIDogXCJcXHhBMFwiKTtcbn1cbmV4cG9ydCBkZWZhdWx0IFRpbWVIZWFkZXI7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVJlZiwgdXNlTGF5b3V0RWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBzY3JvbGxUbywgd2FpdEVsZW1lbnRSZWFkeSB9IGZyb20gJy4uLy4uL3V0aWxzL3VpVXRpbCc7XG5pbXBvcnQgUGFuZWxDb250ZXh0IGZyb20gJy4uLy4uL1BhbmVsQ29udGV4dCc7XG5mdW5jdGlvbiBUaW1lVW5pdENvbHVtbihwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHVuaXRzID0gcHJvcHMudW5pdHMsXG4gICAgb25TZWxlY3QgPSBwcm9wcy5vblNlbGVjdCxcbiAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgIGFjdGl2ZSA9IHByb3BzLmFjdGl2ZSxcbiAgICBoaWRlRGlzYWJsZWRPcHRpb25zID0gcHJvcHMuaGlkZURpc2FibGVkT3B0aW9ucztcbiAgdmFyIGNlbGxQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNlbGxcIik7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoUGFuZWxDb250ZXh0KSxcbiAgICBvcGVuID0gX1JlYWN0JHVzZUNvbnRleHQub3BlbjtcbiAgdmFyIHVsUmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgbGlSZWZzID0gdXNlUmVmKG5ldyBNYXAoKSk7XG4gIHZhciBzY3JvbGxSZWYgPSB1c2VSZWYoKTtcbiAgLy8gYHVzZUxheW91dEVmZmVjdGAgaGVyZSB0byBhdm9pZCBibGluayBieSBkdXJhdGlvbiBpcyAwXG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGxpID0gbGlSZWZzLmN1cnJlbnQuZ2V0KHZhbHVlKTtcbiAgICBpZiAobGkgJiYgb3BlbiAhPT0gZmFsc2UpIHtcbiAgICAgIHNjcm9sbFRvKHVsUmVmLmN1cnJlbnQsIGxpLm9mZnNldFRvcCwgMTIwKTtcbiAgICB9XG4gIH0sIFt2YWx1ZV0pO1xuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChvcGVuKSB7XG4gICAgICB2YXIgbGkgPSBsaVJlZnMuY3VycmVudC5nZXQodmFsdWUpO1xuICAgICAgaWYgKGxpKSB7XG4gICAgICAgIHNjcm9sbFJlZi5jdXJyZW50ID0gd2FpdEVsZW1lbnRSZWFkeShsaSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNjcm9sbFRvKHVsUmVmLmN1cnJlbnQsIGxpLm9mZnNldFRvcCwgMCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9zY3JvbGxSZWYkY3VycmVudDtcbiAgICAgIChfc2Nyb2xsUmVmJGN1cnJlbnQgPSBzY3JvbGxSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX3Njcm9sbFJlZiRjdXJyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfc2Nyb2xsUmVmJGN1cnJlbnQuY2FsbChzY3JvbGxSZWYpO1xuICAgIH07XG4gIH0sIFtvcGVuXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInVsXCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb2x1bW5cIiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb2x1bW4tYWN0aXZlXCIpLCBhY3RpdmUpKSxcbiAgICByZWY6IHVsUmVmLFxuICAgIHN0eWxlOiB7XG4gICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJ1xuICAgIH1cbiAgfSwgdW5pdHMubWFwKGZ1bmN0aW9uICh1bml0KSB7XG4gICAgdmFyIF9jbGFzc05hbWVzMjtcbiAgICBpZiAoaGlkZURpc2FibGVkT3B0aW9ucyAmJiB1bml0LmRpc2FibGVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgICAga2V5OiB1bml0LnZhbHVlLFxuICAgICAgcmVmOiBmdW5jdGlvbiByZWYoZWxlbWVudCkge1xuICAgICAgICBsaVJlZnMuY3VycmVudC5zZXQodW5pdC52YWx1ZSwgZWxlbWVudCk7XG4gICAgICB9LFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNlbGxQcmVmaXhDbHMsIChfY2xhc3NOYW1lczIgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItZGlzYWJsZWRcIiksIHVuaXQuZGlzYWJsZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1zZWxlY3RlZFwiKSwgdmFsdWUgPT09IHVuaXQudmFsdWUpLCBfY2xhc3NOYW1lczIpKSxcbiAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgIGlmICh1bml0LmRpc2FibGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG9uU2VsZWN0KHVuaXQudmFsdWUpO1xuICAgICAgfVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItaW5uZXJcIilcbiAgICB9LCB1bml0LmxhYmVsKSk7XG4gIH0pKTtcbn1cbmV4cG9ydCBkZWZhdWx0IFRpbWVVbml0Q29sdW1uOyIsImV4cG9ydCBmdW5jdGlvbiBsZWZ0UGFkKHN0ciwgbGVuZ3RoKSB7XG4gIHZhciBmaWxsID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAnMCc7XG4gIHZhciBjdXJyZW50ID0gU3RyaW5nKHN0cik7XG4gIHdoaWxlIChjdXJyZW50Lmxlbmd0aCA8IGxlbmd0aCkge1xuICAgIGN1cnJlbnQgPSBcIlwiLmNvbmNhdChmaWxsKS5jb25jYXQoc3RyKTtcbiAgfVxuICByZXR1cm4gY3VycmVudDtcbn1cbmV4cG9ydCB2YXIgdHVwbGUgPSBmdW5jdGlvbiB0dXBsZSgpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuICByZXR1cm4gYXJncztcbn07XG5leHBvcnQgZnVuY3Rpb24gdG9BcnJheSh2YWwpIHtcbiAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsIDogW3ZhbF07XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXREYXRhT3JBcmlhUHJvcHMocHJvcHMpIHtcbiAgdmFyIHJldFByb3BzID0ge307XG4gIE9iamVjdC5rZXlzKHByb3BzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoKGtleS5zdWJzdHIoMCwgNSkgPT09ICdkYXRhLScgfHwga2V5LnN1YnN0cigwLCA1KSA9PT0gJ2FyaWEtJyB8fCBrZXkgPT09ICdyb2xlJyB8fCBrZXkgPT09ICduYW1lJykgJiYga2V5LnN1YnN0cigwLCA3KSAhPT0gJ2RhdGEtX18nKSB7XG4gICAgICByZXRQcm9wc1trZXldID0gcHJvcHNba2V5XTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmV0UHJvcHM7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWUodmFsdWVzLCBpbmRleCkge1xuICByZXR1cm4gdmFsdWVzID8gdmFsdWVzW2luZGV4XSA6IG51bGw7XG59XG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlVmFsdWVzKHZhbHVlcywgdmFsdWUsIGluZGV4KSB7XG4gIHZhciBuZXdWYWx1ZXMgPSBbZ2V0VmFsdWUodmFsdWVzLCAwKSwgZ2V0VmFsdWUodmFsdWVzLCAxKV07XG4gIG5ld1ZhbHVlc1tpbmRleF0gPSB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgPyB2YWx1ZShuZXdWYWx1ZXNbaW5kZXhdKSA6IHZhbHVlO1xuICBpZiAoIW5ld1ZhbHVlc1swXSAmJiAhbmV3VmFsdWVzWzFdKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIG5ld1ZhbHVlcztcbn0iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlTWVtbyBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZW1vXCI7XG5pbXBvcnQgVGltZVVuaXRDb2x1bW4gZnJvbSAnLi9UaW1lVW5pdENvbHVtbic7XG5pbXBvcnQgeyBsZWZ0UGFkIH0gZnJvbSAnLi4vLi4vdXRpbHMvbWlzY1V0aWwnO1xuaW1wb3J0IHsgc2V0VGltZSBhcyB1dGlsU2V0VGltZSB9IGZyb20gJy4uLy4uL3V0aWxzL3RpbWVVdGlsJztcbmZ1bmN0aW9uIHNob3VsZFVuaXRzVXBkYXRlKHByZXZVbml0cywgbmV4dFVuaXRzKSB7XG4gIGlmIChwcmV2VW5pdHMubGVuZ3RoICE9PSBuZXh0VW5pdHMubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcbiAgLy8gaWYgYW55IHVuaXQncyBkaXNhYmxlZCBzdGF0dXMgaXMgZGlmZmVyZW50LCB0aGUgdW5pdHMgc2hvdWxkIGJlIHJlLWV2YWx1dGVkXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJldlVuaXRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgaWYgKHByZXZVbml0c1tpXS5kaXNhYmxlZCAhPT0gbmV4dFVuaXRzW2ldLmRpc2FibGVkKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBnZW5lcmF0ZVVuaXRzKHN0YXJ0LCBlbmQsIHN0ZXAsIGRpc2FibGVkVW5pdHMpIHtcbiAgdmFyIHVuaXRzID0gW107XG4gIHZhciBpbnRlZ2VyU3RlcCA9IHN0ZXAgPj0gMSA/IHN0ZXAgfCAwIDogMTtcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSArPSBpbnRlZ2VyU3RlcCkge1xuICAgIHVuaXRzLnB1c2goe1xuICAgICAgbGFiZWw6IGxlZnRQYWQoaSwgMiksXG4gICAgICB2YWx1ZTogaSxcbiAgICAgIGRpc2FibGVkOiAoZGlzYWJsZWRVbml0cyB8fCBbXSkuaW5jbHVkZXMoaSlcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gdW5pdHM7XG59XG5mdW5jdGlvbiBUaW1lQm9keShwcm9wcykge1xuICB2YXIgZ2VuZXJhdGVDb25maWcgPSBwcm9wcy5nZW5lcmF0ZUNvbmZpZyxcbiAgICBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgb3BlcmF0aW9uUmVmID0gcHJvcHMub3BlcmF0aW9uUmVmLFxuICAgIGFjdGl2ZUNvbHVtbkluZGV4ID0gcHJvcHMuYWN0aXZlQ29sdW1uSW5kZXgsXG4gICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICBzaG93SG91ciA9IHByb3BzLnNob3dIb3VyLFxuICAgIHNob3dNaW51dGUgPSBwcm9wcy5zaG93TWludXRlLFxuICAgIHNob3dTZWNvbmQgPSBwcm9wcy5zaG93U2Vjb25kLFxuICAgIHVzZTEySG91cnMgPSBwcm9wcy51c2UxMkhvdXJzLFxuICAgIF9wcm9wcyRob3VyU3RlcCA9IHByb3BzLmhvdXJTdGVwLFxuICAgIGhvdXJTdGVwID0gX3Byb3BzJGhvdXJTdGVwID09PSB2b2lkIDAgPyAxIDogX3Byb3BzJGhvdXJTdGVwLFxuICAgIF9wcm9wcyRtaW51dGVTdGVwID0gcHJvcHMubWludXRlU3RlcCxcbiAgICBtaW51dGVTdGVwID0gX3Byb3BzJG1pbnV0ZVN0ZXAgPT09IHZvaWQgMCA/IDEgOiBfcHJvcHMkbWludXRlU3RlcCxcbiAgICBfcHJvcHMkc2Vjb25kU3RlcCA9IHByb3BzLnNlY29uZFN0ZXAsXG4gICAgc2Vjb25kU3RlcCA9IF9wcm9wcyRzZWNvbmRTdGVwID09PSB2b2lkIDAgPyAxIDogX3Byb3BzJHNlY29uZFN0ZXAsXG4gICAgZGlzYWJsZWRIb3VycyA9IHByb3BzLmRpc2FibGVkSG91cnMsXG4gICAgZGlzYWJsZWRNaW51dGVzID0gcHJvcHMuZGlzYWJsZWRNaW51dGVzLFxuICAgIGRpc2FibGVkU2Vjb25kcyA9IHByb3BzLmRpc2FibGVkU2Vjb25kcyxcbiAgICBkaXNhYmxlZFRpbWUgPSBwcm9wcy5kaXNhYmxlZFRpbWUsXG4gICAgaGlkZURpc2FibGVkT3B0aW9ucyA9IHByb3BzLmhpZGVEaXNhYmxlZE9wdGlvbnMsXG4gICAgb25TZWxlY3QgPSBwcm9wcy5vblNlbGVjdDtcbiAgLy8gTWlzY1xuICB2YXIgY29sdW1ucyA9IFtdO1xuICB2YXIgY29udGVudFByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29udGVudFwiKTtcbiAgdmFyIGNvbHVtblByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdGltZS1wYW5lbFwiKTtcbiAgdmFyIGlzUE07XG4gIHZhciBvcmlnaW5Ib3VyID0gdmFsdWUgPyBnZW5lcmF0ZUNvbmZpZy5nZXRIb3VyKHZhbHVlKSA6IC0xO1xuICB2YXIgaG91ciA9IG9yaWdpbkhvdXI7XG4gIHZhciBtaW51dGUgPSB2YWx1ZSA/IGdlbmVyYXRlQ29uZmlnLmdldE1pbnV0ZSh2YWx1ZSkgOiAtMTtcbiAgdmFyIHNlY29uZCA9IHZhbHVlID8gZ2VuZXJhdGVDb25maWcuZ2V0U2Vjb25kKHZhbHVlKSA6IC0xO1xuICAvLyBEaXNhYmxlZCBUaW1lXG4gIHZhciBub3cgPSBnZW5lcmF0ZUNvbmZpZy5nZXROb3coKTtcbiAgdmFyIF9SZWFjdCR1c2VNZW1vID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoZGlzYWJsZWRUaW1lKSB7XG4gICAgICAgIHZhciBkaXNhYmxlZENvbmZpZyA9IGRpc2FibGVkVGltZShub3cpO1xuICAgICAgICByZXR1cm4gW2Rpc2FibGVkQ29uZmlnLmRpc2FibGVkSG91cnMsIGRpc2FibGVkQ29uZmlnLmRpc2FibGVkTWludXRlcywgZGlzYWJsZWRDb25maWcuZGlzYWJsZWRTZWNvbmRzXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbZGlzYWJsZWRIb3VycywgZGlzYWJsZWRNaW51dGVzLCBkaXNhYmxlZFNlY29uZHNdO1xuICAgIH0sIFtkaXNhYmxlZEhvdXJzLCBkaXNhYmxlZE1pbnV0ZXMsIGRpc2FibGVkU2Vjb25kcywgZGlzYWJsZWRUaW1lLCBub3ddKSxcbiAgICBfUmVhY3QkdXNlTWVtbzIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlTWVtbywgMyksXG4gICAgbWVyZ2VkRGlzYWJsZWRIb3VycyA9IF9SZWFjdCR1c2VNZW1vMlswXSxcbiAgICBtZXJnZWREaXNhYmxlZE1pbnV0ZXMgPSBfUmVhY3QkdXNlTWVtbzJbMV0sXG4gICAgbWVyZ2VkRGlzYWJsZWRTZWNvbmRzID0gX1JlYWN0JHVzZU1lbW8yWzJdO1xuICAvLyBTZXQgVGltZVxuICB2YXIgc2V0VGltZSA9IGZ1bmN0aW9uIHNldFRpbWUoaXNOZXdQTSwgbmV3SG91ciwgbmV3TWludXRlLCBuZXdTZWNvbmQpIHtcbiAgICB2YXIgbmV3RGF0ZSA9IHZhbHVlIHx8IGdlbmVyYXRlQ29uZmlnLmdldE5vdygpO1xuICAgIHZhciBtZXJnZWRIb3VyID0gTWF0aC5tYXgoMCwgbmV3SG91cik7XG4gICAgdmFyIG1lcmdlZE1pbnV0ZSA9IE1hdGgubWF4KDAsIG5ld01pbnV0ZSk7XG4gICAgdmFyIG1lcmdlZFNlY29uZCA9IE1hdGgubWF4KDAsIG5ld1NlY29uZCk7XG4gICAgbmV3RGF0ZSA9IHV0aWxTZXRUaW1lKGdlbmVyYXRlQ29uZmlnLCBuZXdEYXRlLCAhdXNlMTJIb3VycyB8fCAhaXNOZXdQTSA/IG1lcmdlZEhvdXIgOiBtZXJnZWRIb3VyICsgMTIsIG1lcmdlZE1pbnV0ZSwgbWVyZ2VkU2Vjb25kKTtcbiAgICByZXR1cm4gbmV3RGF0ZTtcbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBVbml0ID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHJhd0hvdXJzID0gZ2VuZXJhdGVVbml0cygwLCAyMywgaG91clN0ZXAsIG1lcmdlZERpc2FibGVkSG91cnMgJiYgbWVyZ2VkRGlzYWJsZWRIb3VycygpKTtcbiAgdmFyIG1lbW9yaXplZFJhd0hvdXJzID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHJhd0hvdXJzO1xuICB9LCByYXdIb3Vycywgc2hvdWxkVW5pdHNVcGRhdGUpO1xuICAvLyBTaG91bGQgYWRkaXRpb25hbCBsb2dpYyB0byBoYW5kbGUgMTIgaG91cnNcbiAgaWYgKHVzZTEySG91cnMpIHtcbiAgICBpc1BNID0gaG91ciA+PSAxMjsgLy8gLTEgbWVhbnMgc2hvdWxkIGRpc3BsYXkgQU1cbiAgICBob3VyICU9IDEyO1xuICB9XG4gIHZhciBfUmVhY3QkdXNlTWVtbzMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghdXNlMTJIb3Vycykge1xuICAgICAgICByZXR1cm4gW2ZhbHNlLCBmYWxzZV07XG4gICAgICB9XG4gICAgICB2YXIgQU1QTURpc2FibGVkID0gW3RydWUsIHRydWVdO1xuICAgICAgbWVtb3JpemVkUmF3SG91cnMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgZGlzYWJsZWQgPSBfcmVmLmRpc2FibGVkLFxuICAgICAgICAgIGhvdXJWYWx1ZSA9IF9yZWYudmFsdWU7XG4gICAgICAgIGlmIChkaXNhYmxlZCkgcmV0dXJuO1xuICAgICAgICBpZiAoaG91clZhbHVlID49IDEyKSB7XG4gICAgICAgICAgQU1QTURpc2FibGVkWzFdID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgQU1QTURpc2FibGVkWzBdID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIEFNUE1EaXNhYmxlZDtcbiAgICB9LCBbdXNlMTJIb3VycywgbWVtb3JpemVkUmF3SG91cnNdKSxcbiAgICBfUmVhY3QkdXNlTWVtbzQgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlTWVtbzMsIDIpLFxuICAgIEFNRGlzYWJsZWQgPSBfUmVhY3QkdXNlTWVtbzRbMF0sXG4gICAgUE1EaXNhYmxlZCA9IF9SZWFjdCR1c2VNZW1vNFsxXTtcbiAgdmFyIGhvdXJzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF1c2UxMkhvdXJzKSByZXR1cm4gbWVtb3JpemVkUmF3SG91cnM7XG4gICAgcmV0dXJuIG1lbW9yaXplZFJhd0hvdXJzLmZpbHRlcihpc1BNID8gZnVuY3Rpb24gKGhvdXJNZXRhKSB7XG4gICAgICByZXR1cm4gaG91ck1ldGEudmFsdWUgPj0gMTI7XG4gICAgfSA6IGZ1bmN0aW9uIChob3VyTWV0YSkge1xuICAgICAgcmV0dXJuIGhvdXJNZXRhLnZhbHVlIDwgMTI7XG4gICAgfSkubWFwKGZ1bmN0aW9uIChob3VyTWV0YSkge1xuICAgICAgdmFyIGhvdXJWYWx1ZSA9IGhvdXJNZXRhLnZhbHVlICUgMTI7XG4gICAgICB2YXIgaG91ckxhYmVsID0gaG91clZhbHVlID09PSAwID8gJzEyJyA6IGxlZnRQYWQoaG91clZhbHVlLCAyKTtcbiAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGhvdXJNZXRhKSwge30sIHtcbiAgICAgICAgbGFiZWw6IGhvdXJMYWJlbCxcbiAgICAgICAgdmFsdWU6IGhvdXJWYWx1ZVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sIFt1c2UxMkhvdXJzLCBpc1BNLCBtZW1vcml6ZWRSYXdIb3Vyc10pO1xuICB2YXIgbWludXRlcyA9IGdlbmVyYXRlVW5pdHMoMCwgNTksIG1pbnV0ZVN0ZXAsIG1lcmdlZERpc2FibGVkTWludXRlcyAmJiBtZXJnZWREaXNhYmxlZE1pbnV0ZXMob3JpZ2luSG91cikpO1xuICB2YXIgc2Vjb25kcyA9IGdlbmVyYXRlVW5pdHMoMCwgNTksIHNlY29uZFN0ZXAsIG1lcmdlZERpc2FibGVkU2Vjb25kcyAmJiBtZXJnZWREaXNhYmxlZFNlY29uZHMob3JpZ2luSG91ciwgbWludXRlKSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gT3BlcmF0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09XG4gIG9wZXJhdGlvblJlZi5jdXJyZW50ID0ge1xuICAgIG9uVXBEb3duOiBmdW5jdGlvbiBvblVwRG93bihkaWZmKSB7XG4gICAgICB2YXIgY29sdW1uID0gY29sdW1uc1thY3RpdmVDb2x1bW5JbmRleF07XG4gICAgICBpZiAoY29sdW1uKSB7XG4gICAgICAgIHZhciB2YWx1ZUluZGV4ID0gY29sdW1uLnVuaXRzLmZpbmRJbmRleChmdW5jdGlvbiAodW5pdCkge1xuICAgICAgICAgIHJldHVybiB1bml0LnZhbHVlID09PSBjb2x1bW4udmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgdW5pdExlbiA9IGNvbHVtbi51bml0cy5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgdW5pdExlbjsgaSArPSAxKSB7XG4gICAgICAgICAgdmFyIG5leHRVbml0ID0gY29sdW1uLnVuaXRzWyh2YWx1ZUluZGV4ICsgZGlmZiAqIGkgKyB1bml0TGVuKSAlIHVuaXRMZW5dO1xuICAgICAgICAgIGlmIChuZXh0VW5pdC5kaXNhYmxlZCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29sdW1uLm9uU2VsZWN0KG5leHRVbml0LnZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZnVuY3Rpb24gYWRkQ29sdW1uTm9kZShjb25kaXRpb24sIG5vZGUsIGNvbHVtblZhbHVlLCB1bml0cywgb25Db2x1bW5TZWxlY3QpIHtcbiAgICBpZiAoY29uZGl0aW9uICE9PSBmYWxzZSkge1xuICAgICAgY29sdW1ucy5wdXNoKHtcbiAgICAgICAgbm9kZTogLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChub2RlLCB7XG4gICAgICAgICAgcHJlZml4Q2xzOiBjb2x1bW5QcmVmaXhDbHMsXG4gICAgICAgICAgdmFsdWU6IGNvbHVtblZhbHVlLFxuICAgICAgICAgIGFjdGl2ZTogYWN0aXZlQ29sdW1uSW5kZXggPT09IGNvbHVtbnMubGVuZ3RoLFxuICAgICAgICAgIG9uU2VsZWN0OiBvbkNvbHVtblNlbGVjdCxcbiAgICAgICAgICB1bml0czogdW5pdHMsXG4gICAgICAgICAgaGlkZURpc2FibGVkT3B0aW9uczogaGlkZURpc2FibGVkT3B0aW9uc1xuICAgICAgICB9KSxcbiAgICAgICAgb25TZWxlY3Q6IG9uQ29sdW1uU2VsZWN0LFxuICAgICAgICB2YWx1ZTogY29sdW1uVmFsdWUsXG4gICAgICAgIHVuaXRzOiB1bml0c1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIC8vIEhvdXJcbiAgYWRkQ29sdW1uTm9kZShzaG93SG91ciwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVGltZVVuaXRDb2x1bW4sIHtcbiAgICBrZXk6IFwiaG91clwiXG4gIH0pLCBob3VyLCBob3VycywgZnVuY3Rpb24gKG51bSkge1xuICAgIG9uU2VsZWN0KHNldFRpbWUoaXNQTSwgbnVtLCBtaW51dGUsIHNlY29uZCksICdtb3VzZScpO1xuICB9KTtcbiAgLy8gTWludXRlXG4gIGFkZENvbHVtbk5vZGUoc2hvd01pbnV0ZSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVGltZVVuaXRDb2x1bW4sIHtcbiAgICBrZXk6IFwibWludXRlXCJcbiAgfSksIG1pbnV0ZSwgbWludXRlcywgZnVuY3Rpb24gKG51bSkge1xuICAgIG9uU2VsZWN0KHNldFRpbWUoaXNQTSwgaG91ciwgbnVtLCBzZWNvbmQpLCAnbW91c2UnKTtcbiAgfSk7XG4gIC8vIFNlY29uZFxuICBhZGRDb2x1bW5Ob2RlKHNob3dTZWNvbmQsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRpbWVVbml0Q29sdW1uLCB7XG4gICAga2V5OiBcInNlY29uZFwiXG4gIH0pLCBzZWNvbmQsIHNlY29uZHMsIGZ1bmN0aW9uIChudW0pIHtcbiAgICBvblNlbGVjdChzZXRUaW1lKGlzUE0sIGhvdXIsIG1pbnV0ZSwgbnVtKSwgJ21vdXNlJyk7XG4gIH0pO1xuICAvLyAxMiBIb3Vyc1xuICB2YXIgUE1JbmRleCA9IC0xO1xuICBpZiAodHlwZW9mIGlzUE0gPT09ICdib29sZWFuJykge1xuICAgIFBNSW5kZXggPSBpc1BNID8gMSA6IDA7XG4gIH1cbiAgYWRkQ29sdW1uTm9kZSh1c2UxMkhvdXJzID09PSB0cnVlLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUaW1lVW5pdENvbHVtbiwge1xuICAgIGtleTogXCIxMmhvdXJzXCJcbiAgfSksIFBNSW5kZXgsIFt7XG4gICAgbGFiZWw6ICdBTScsXG4gICAgdmFsdWU6IDAsXG4gICAgZGlzYWJsZWQ6IEFNRGlzYWJsZWRcbiAgfSwge1xuICAgIGxhYmVsOiAnUE0nLFxuICAgIHZhbHVlOiAxLFxuICAgIGRpc2FibGVkOiBQTURpc2FibGVkXG4gIH1dLCBmdW5jdGlvbiAobnVtKSB7XG4gICAgb25TZWxlY3Qoc2V0VGltZSghIW51bSwgaG91ciwgbWludXRlLCBzZWNvbmQpLCAnbW91c2UnKTtcbiAgfSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjb250ZW50UHJlZml4Q2xzXG4gIH0sIGNvbHVtbnMubWFwKGZ1bmN0aW9uIChfcmVmMikge1xuICAgIHZhciBub2RlID0gX3JlZjIubm9kZTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfSkpO1xufVxuZXhwb3J0IGRlZmF1bHQgVGltZUJvZHk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBUaW1lSGVhZGVyIGZyb20gJy4vVGltZUhlYWRlcic7XG5pbXBvcnQgVGltZUJvZHkgZnJvbSAnLi9UaW1lQm9keSc7XG5pbXBvcnQgeyBjcmVhdGVLZXlEb3duSGFuZGxlciB9IGZyb20gJy4uLy4uL3V0aWxzL3VpVXRpbCc7XG52YXIgY291bnRCb29sZWFuID0gZnVuY3Rpb24gY291bnRCb29sZWFuKGJvb2xMaXN0KSB7XG4gIHJldHVybiBib29sTGlzdC5maWx0ZXIoZnVuY3Rpb24gKGJvb2wpIHtcbiAgICByZXR1cm4gYm9vbCAhPT0gZmFsc2U7XG4gIH0pLmxlbmd0aDtcbn07XG5mdW5jdGlvbiBUaW1lUGFuZWwocHJvcHMpIHtcbiAgdmFyIGdlbmVyYXRlQ29uZmlnID0gcHJvcHMuZ2VuZXJhdGVDb25maWcsXG4gICAgX3Byb3BzJGZvcm1hdCA9IHByb3BzLmZvcm1hdCxcbiAgICBmb3JtYXQgPSBfcHJvcHMkZm9ybWF0ID09PSB2b2lkIDAgPyAnSEg6bW06c3MnIDogX3Byb3BzJGZvcm1hdCxcbiAgICBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgYWN0aXZlID0gcHJvcHMuYWN0aXZlLFxuICAgIG9wZXJhdGlvblJlZiA9IHByb3BzLm9wZXJhdGlvblJlZixcbiAgICBzaG93SG91ciA9IHByb3BzLnNob3dIb3VyLFxuICAgIHNob3dNaW51dGUgPSBwcm9wcy5zaG93TWludXRlLFxuICAgIHNob3dTZWNvbmQgPSBwcm9wcy5zaG93U2Vjb25kLFxuICAgIF9wcm9wcyR1c2UxMkhvdXJzID0gcHJvcHMudXNlMTJIb3VycyxcbiAgICB1c2UxMkhvdXJzID0gX3Byb3BzJHVzZTEySG91cnMgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJHVzZTEySG91cnMsXG4gICAgb25TZWxlY3QgPSBwcm9wcy5vblNlbGVjdCxcbiAgICB2YWx1ZSA9IHByb3BzLnZhbHVlO1xuICB2YXIgcGFuZWxQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRpbWUtcGFuZWxcIik7XG4gIHZhciBib2R5T3BlcmF0aW9uUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09IEtleWJvYXJkID09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSgtMSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgYWN0aXZlQ29sdW1uSW5kZXggPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldEFjdGl2ZUNvbHVtbkluZGV4ID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIGNvbHVtbnNDb3VudCA9IGNvdW50Qm9vbGVhbihbc2hvd0hvdXIsIHNob3dNaW51dGUsIHNob3dTZWNvbmQsIHVzZTEySG91cnNdKTtcbiAgb3BlcmF0aW9uUmVmLmN1cnJlbnQgPSB7XG4gICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIHJldHVybiBjcmVhdGVLZXlEb3duSGFuZGxlcihldmVudCwge1xuICAgICAgICBvbkxlZnRSaWdodDogZnVuY3Rpb24gb25MZWZ0UmlnaHQoZGlmZikge1xuICAgICAgICAgIHNldEFjdGl2ZUNvbHVtbkluZGV4KChhY3RpdmVDb2x1bW5JbmRleCArIGRpZmYgKyBjb2x1bW5zQ291bnQpICUgY29sdW1uc0NvdW50KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VcERvd246IGZ1bmN0aW9uIG9uVXBEb3duKGRpZmYpIHtcbiAgICAgICAgICBpZiAoYWN0aXZlQ29sdW1uSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICBzZXRBY3RpdmVDb2x1bW5JbmRleCgwKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGJvZHlPcGVyYXRpb25SZWYuY3VycmVudCkge1xuICAgICAgICAgICAgYm9keU9wZXJhdGlvblJlZi5jdXJyZW50Lm9uVXBEb3duKGRpZmYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25FbnRlcjogZnVuY3Rpb24gb25FbnRlcigpIHtcbiAgICAgICAgICBvblNlbGVjdCh2YWx1ZSB8fCBnZW5lcmF0ZUNvbmZpZy5nZXROb3coKSwgJ2tleScpO1xuICAgICAgICAgIHNldEFjdGl2ZUNvbHVtbkluZGV4KC0xKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBvbkJsdXI6IGZ1bmN0aW9uIG9uQmx1cigpIHtcbiAgICAgIHNldEFjdGl2ZUNvbHVtbkluZGV4KC0xKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKHBhbmVsUHJlZml4Q2xzLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHBhbmVsUHJlZml4Q2xzLCBcIi1hY3RpdmVcIiksIGFjdGl2ZSkpXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRpbWVIZWFkZXIsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIGZvcm1hdDogZm9ybWF0LFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzXG4gIH0pKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVGltZUJvZHksIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGFjdGl2ZUNvbHVtbkluZGV4OiBhY3RpdmVDb2x1bW5JbmRleCxcbiAgICBvcGVyYXRpb25SZWY6IGJvZHlPcGVyYXRpb25SZWZcbiAgfSkpKTtcbn1cbmV4cG9ydCBkZWZhdWx0IFRpbWVQYW5lbDsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgUmFuZ2VDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe30pO1xuZXhwb3J0IGRlZmF1bHQgUmFuZ2VDb250ZXh0OyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgeyBpc0luUmFuZ2UgfSBmcm9tICcuLi91dGlscy9kYXRlVXRpbCc7XG5pbXBvcnQgeyBnZXRWYWx1ZSB9IGZyb20gJy4uL3V0aWxzL21pc2NVdGlsJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUNlbGxDbGFzc05hbWUoX3JlZikge1xuICB2YXIgY2VsbFByZWZpeENscyA9IF9yZWYuY2VsbFByZWZpeENscyxcbiAgICBnZW5lcmF0ZUNvbmZpZyA9IF9yZWYuZ2VuZXJhdGVDb25maWcsXG4gICAgcmFuZ2VkVmFsdWUgPSBfcmVmLnJhbmdlZFZhbHVlLFxuICAgIGhvdmVyUmFuZ2VkVmFsdWUgPSBfcmVmLmhvdmVyUmFuZ2VkVmFsdWUsXG4gICAgaXNJblZpZXcgPSBfcmVmLmlzSW5WaWV3LFxuICAgIGlzU2FtZUNlbGwgPSBfcmVmLmlzU2FtZUNlbGwsXG4gICAgb2Zmc2V0Q2VsbCA9IF9yZWYub2Zmc2V0Q2VsbCxcbiAgICB0b2RheSA9IF9yZWYudG9kYXksXG4gICAgdmFsdWUgPSBfcmVmLnZhbHVlO1xuICBmdW5jdGlvbiBnZXRDbGFzc05hbWUoY3VycmVudERhdGUpIHtcbiAgICB2YXIgX3JlZjI7XG4gICAgdmFyIHByZXZEYXRlID0gb2Zmc2V0Q2VsbChjdXJyZW50RGF0ZSwgLTEpO1xuICAgIHZhciBuZXh0RGF0ZSA9IG9mZnNldENlbGwoY3VycmVudERhdGUsIDEpO1xuICAgIHZhciByYW5nZVN0YXJ0ID0gZ2V0VmFsdWUocmFuZ2VkVmFsdWUsIDApO1xuICAgIHZhciByYW5nZUVuZCA9IGdldFZhbHVlKHJhbmdlZFZhbHVlLCAxKTtcbiAgICB2YXIgaG92ZXJTdGFydCA9IGdldFZhbHVlKGhvdmVyUmFuZ2VkVmFsdWUsIDApO1xuICAgIHZhciBob3ZlckVuZCA9IGdldFZhbHVlKGhvdmVyUmFuZ2VkVmFsdWUsIDEpO1xuICAgIHZhciBpc1JhbmdlSG92ZXJlZCA9IGlzSW5SYW5nZShnZW5lcmF0ZUNvbmZpZywgaG92ZXJTdGFydCwgaG92ZXJFbmQsIGN1cnJlbnREYXRlKTtcbiAgICBmdW5jdGlvbiBpc1JhbmdlU3RhcnQoZGF0ZSkge1xuICAgICAgcmV0dXJuIGlzU2FtZUNlbGwocmFuZ2VTdGFydCwgZGF0ZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzUmFuZ2VFbmQoZGF0ZSkge1xuICAgICAgcmV0dXJuIGlzU2FtZUNlbGwocmFuZ2VFbmQsIGRhdGUpO1xuICAgIH1cbiAgICB2YXIgaXNIb3ZlclN0YXJ0ID0gaXNTYW1lQ2VsbChob3ZlclN0YXJ0LCBjdXJyZW50RGF0ZSk7XG4gICAgdmFyIGlzSG92ZXJFbmQgPSBpc1NhbWVDZWxsKGhvdmVyRW5kLCBjdXJyZW50RGF0ZSk7XG4gICAgdmFyIGlzSG92ZXJFZGdlU3RhcnQgPSAoaXNSYW5nZUhvdmVyZWQgfHwgaXNIb3ZlckVuZCkgJiYgKCFpc0luVmlldyhwcmV2RGF0ZSkgfHwgaXNSYW5nZUVuZChwcmV2RGF0ZSkpO1xuICAgIHZhciBpc0hvdmVyRWRnZUVuZCA9IChpc1JhbmdlSG92ZXJlZCB8fCBpc0hvdmVyU3RhcnQpICYmICghaXNJblZpZXcobmV4dERhdGUpIHx8IGlzUmFuZ2VTdGFydChuZXh0RGF0ZSkpO1xuICAgIHJldHVybiBfcmVmMiA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX3JlZjIsIFwiXCIuY29uY2F0KGNlbGxQcmVmaXhDbHMsIFwiLWluLXZpZXdcIiksIGlzSW5WaWV3KGN1cnJlbnREYXRlKSksIF9kZWZpbmVQcm9wZXJ0eShfcmVmMiwgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItaW4tcmFuZ2VcIiksIGlzSW5SYW5nZShnZW5lcmF0ZUNvbmZpZywgcmFuZ2VTdGFydCwgcmFuZ2VFbmQsIGN1cnJlbnREYXRlKSksIF9kZWZpbmVQcm9wZXJ0eShfcmVmMiwgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItcmFuZ2Utc3RhcnRcIiksIGlzUmFuZ2VTdGFydChjdXJyZW50RGF0ZSkpLCBfZGVmaW5lUHJvcGVydHkoX3JlZjIsIFwiXCIuY29uY2F0KGNlbGxQcmVmaXhDbHMsIFwiLXJhbmdlLWVuZFwiKSwgaXNSYW5nZUVuZChjdXJyZW50RGF0ZSkpLCBfZGVmaW5lUHJvcGVydHkoX3JlZjIsIFwiXCIuY29uY2F0KGNlbGxQcmVmaXhDbHMsIFwiLXJhbmdlLXN0YXJ0LXNpbmdsZVwiKSwgaXNSYW5nZVN0YXJ0KGN1cnJlbnREYXRlKSAmJiAhcmFuZ2VFbmQpLCBfZGVmaW5lUHJvcGVydHkoX3JlZjIsIFwiXCIuY29uY2F0KGNlbGxQcmVmaXhDbHMsIFwiLXJhbmdlLWVuZC1zaW5nbGVcIiksIGlzUmFuZ2VFbmQoY3VycmVudERhdGUpICYmICFyYW5nZVN0YXJ0KSwgX2RlZmluZVByb3BlcnR5KF9yZWYyLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1yYW5nZS1zdGFydC1uZWFyLWhvdmVyXCIpLCBpc1JhbmdlU3RhcnQoY3VycmVudERhdGUpICYmIChpc1NhbWVDZWxsKHByZXZEYXRlLCBob3ZlclN0YXJ0KSB8fCBpc0luUmFuZ2UoZ2VuZXJhdGVDb25maWcsIGhvdmVyU3RhcnQsIGhvdmVyRW5kLCBwcmV2RGF0ZSkpKSwgX2RlZmluZVByb3BlcnR5KF9yZWYyLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1yYW5nZS1lbmQtbmVhci1ob3ZlclwiKSwgaXNSYW5nZUVuZChjdXJyZW50RGF0ZSkgJiYgKGlzU2FtZUNlbGwobmV4dERhdGUsIGhvdmVyRW5kKSB8fCBpc0luUmFuZ2UoZ2VuZXJhdGVDb25maWcsIGhvdmVyU3RhcnQsIGhvdmVyRW5kLCBuZXh0RGF0ZSkpKSwgX2RlZmluZVByb3BlcnR5KF9yZWYyLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1yYW5nZS1ob3ZlclwiKSwgaXNSYW5nZUhvdmVyZWQpLCBfZGVmaW5lUHJvcGVydHkoX3JlZjIsIFwiXCIuY29uY2F0KGNlbGxQcmVmaXhDbHMsIFwiLXJhbmdlLWhvdmVyLXN0YXJ0XCIpLCBpc0hvdmVyU3RhcnQpLCBfZGVmaW5lUHJvcGVydHkoX3JlZjIsIFwiXCIuY29uY2F0KGNlbGxQcmVmaXhDbHMsIFwiLXJhbmdlLWhvdmVyLWVuZFwiKSwgaXNIb3ZlckVuZCksIF9kZWZpbmVQcm9wZXJ0eShfcmVmMiwgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItcmFuZ2UtaG92ZXItZWRnZS1zdGFydFwiKSwgaXNIb3ZlckVkZ2VTdGFydCksIF9kZWZpbmVQcm9wZXJ0eShfcmVmMiwgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItcmFuZ2UtaG92ZXItZWRnZS1lbmRcIiksIGlzSG92ZXJFZGdlRW5kKSwgX2RlZmluZVByb3BlcnR5KF9yZWYyLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1yYW5nZS1ob3Zlci1lZGdlLXN0YXJ0LW5lYXItcmFuZ2VcIiksIGlzSG92ZXJFZGdlU3RhcnQgJiYgaXNTYW1lQ2VsbChwcmV2RGF0ZSwgcmFuZ2VFbmQpKSwgX2RlZmluZVByb3BlcnR5KF9yZWYyLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1yYW5nZS1ob3Zlci1lZGdlLWVuZC1uZWFyLXJhbmdlXCIpLCBpc0hvdmVyRWRnZUVuZCAmJiBpc1NhbWVDZWxsKG5leHREYXRlLCByYW5nZVN0YXJ0KSksIF9kZWZpbmVQcm9wZXJ0eShfcmVmMiwgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItdG9kYXlcIiksIGlzU2FtZUNlbGwodG9kYXksIGN1cnJlbnREYXRlKSksIF9kZWZpbmVQcm9wZXJ0eShfcmVmMiwgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItc2VsZWN0ZWRcIiksIGlzU2FtZUNlbGwodmFsdWUsIGN1cnJlbnREYXRlKSksIF9yZWYyO1xuICB9XG4gIHJldHVybiBnZXRDbGFzc05hbWU7XG59IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBXRUVLX0RBWV9DT1VOVCwgZ2V0V2Vla1N0YXJ0RGF0ZSwgaXNTYW1lRGF0ZSwgaXNTYW1lTW9udGgsIGZvcm1hdFZhbHVlIH0gZnJvbSAnLi4vLi4vdXRpbHMvZGF0ZVV0aWwnO1xuaW1wb3J0IFJhbmdlQ29udGV4dCBmcm9tICcuLi8uLi9SYW5nZUNvbnRleHQnO1xuaW1wb3J0IHVzZUNlbGxDbGFzc05hbWUgZnJvbSAnLi4vLi4vaG9va3MvdXNlQ2VsbENsYXNzTmFtZSc7XG5pbXBvcnQgUGFuZWxCb2R5IGZyb20gJy4uL1BhbmVsQm9keSc7XG5mdW5jdGlvbiBEYXRlQm9keShwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGdlbmVyYXRlQ29uZmlnID0gcHJvcHMuZ2VuZXJhdGVDb25maWcsXG4gICAgcHJlZml4Q29sdW1uID0gcHJvcHMucHJlZml4Q29sdW1uLFxuICAgIGxvY2FsZSA9IHByb3BzLmxvY2FsZSxcbiAgICByb3dDb3VudCA9IHByb3BzLnJvd0NvdW50LFxuICAgIHZpZXdEYXRlID0gcHJvcHMudmlld0RhdGUsXG4gICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICBkYXRlUmVuZGVyID0gcHJvcHMuZGF0ZVJlbmRlcjtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChSYW5nZUNvbnRleHQpLFxuICAgIHJhbmdlZFZhbHVlID0gX1JlYWN0JHVzZUNvbnRleHQucmFuZ2VkVmFsdWUsXG4gICAgaG92ZXJSYW5nZWRWYWx1ZSA9IF9SZWFjdCR1c2VDb250ZXh0LmhvdmVyUmFuZ2VkVmFsdWU7XG4gIHZhciBiYXNlRGF0ZSA9IGdldFdlZWtTdGFydERhdGUobG9jYWxlLmxvY2FsZSwgZ2VuZXJhdGVDb25maWcsIHZpZXdEYXRlKTtcbiAgdmFyIGNlbGxQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNlbGxcIik7XG4gIHZhciB3ZWVrRmlyc3REYXkgPSBnZW5lcmF0ZUNvbmZpZy5sb2NhbGUuZ2V0V2Vla0ZpcnN0RGF5KGxvY2FsZS5sb2NhbGUpO1xuICB2YXIgdG9kYXkgPSBnZW5lcmF0ZUNvbmZpZy5nZXROb3coKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEhlYWRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGhlYWRlckNlbGxzID0gW107XG4gIHZhciB3ZWVrRGF5c0xvY2FsZSA9IGxvY2FsZS5zaG9ydFdlZWtEYXlzIHx8IChnZW5lcmF0ZUNvbmZpZy5sb2NhbGUuZ2V0U2hvcnRXZWVrRGF5cyA/IGdlbmVyYXRlQ29uZmlnLmxvY2FsZS5nZXRTaG9ydFdlZWtEYXlzKGxvY2FsZS5sb2NhbGUpIDogW10pO1xuICBpZiAocHJlZml4Q29sdW1uKSB7XG4gICAgaGVhZGVyQ2VsbHMucHVzaCggLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0aFwiLCB7XG4gICAgICBrZXk6IFwiZW1wdHlcIixcbiAgICAgIFwiYXJpYS1sYWJlbFwiOiBcImVtcHR5IGNlbGxcIlxuICAgIH0pKTtcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IFdFRUtfREFZX0NPVU5UOyBpICs9IDEpIHtcbiAgICBoZWFkZXJDZWxscy5wdXNoKCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInRoXCIsIHtcbiAgICAgIGtleTogaVxuICAgIH0sIHdlZWtEYXlzTG9jYWxlWyhpICsgd2Vla0ZpcnN0RGF5KSAlIFdFRUtfREFZX0NPVU5UXSkpO1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQm9keSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBnZXRDZWxsQ2xhc3NOYW1lID0gdXNlQ2VsbENsYXNzTmFtZSh7XG4gICAgY2VsbFByZWZpeENsczogY2VsbFByZWZpeENscyxcbiAgICB0b2RheTogdG9kYXksXG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZyxcbiAgICByYW5nZWRWYWx1ZTogcHJlZml4Q29sdW1uID8gbnVsbCA6IHJhbmdlZFZhbHVlLFxuICAgIGhvdmVyUmFuZ2VkVmFsdWU6IHByZWZpeENvbHVtbiA/IG51bGwgOiBob3ZlclJhbmdlZFZhbHVlLFxuICAgIGlzU2FtZUNlbGw6IGZ1bmN0aW9uIGlzU2FtZUNlbGwoY3VycmVudCwgdGFyZ2V0KSB7XG4gICAgICByZXR1cm4gaXNTYW1lRGF0ZShnZW5lcmF0ZUNvbmZpZywgY3VycmVudCwgdGFyZ2V0KTtcbiAgICB9LFxuICAgIGlzSW5WaWV3OiBmdW5jdGlvbiBpc0luVmlldyhkYXRlKSB7XG4gICAgICByZXR1cm4gaXNTYW1lTW9udGgoZ2VuZXJhdGVDb25maWcsIGRhdGUsIHZpZXdEYXRlKTtcbiAgICB9LFxuICAgIG9mZnNldENlbGw6IGZ1bmN0aW9uIG9mZnNldENlbGwoZGF0ZSwgb2Zmc2V0KSB7XG4gICAgICByZXR1cm4gZ2VuZXJhdGVDb25maWcuYWRkRGF0ZShkYXRlLCBvZmZzZXQpO1xuICAgIH1cbiAgfSk7XG4gIHZhciBnZXRDZWxsTm9kZSA9IGRhdGVSZW5kZXIgPyBmdW5jdGlvbiAoZGF0ZSkge1xuICAgIHJldHVybiBkYXRlUmVuZGVyKGRhdGUsIHRvZGF5KTtcbiAgfSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBhbmVsQm9keSwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcm93TnVtOiByb3dDb3VudCxcbiAgICBjb2xOdW06IFdFRUtfREFZX0NPVU5ULFxuICAgIGJhc2VEYXRlOiBiYXNlRGF0ZSxcbiAgICBnZXRDZWxsTm9kZTogZ2V0Q2VsbE5vZGUsXG4gICAgZ2V0Q2VsbFRleHQ6IGdlbmVyYXRlQ29uZmlnLmdldERhdGUsXG4gICAgZ2V0Q2VsbENsYXNzTmFtZTogZ2V0Q2VsbENsYXNzTmFtZSxcbiAgICBnZXRDZWxsRGF0ZTogZ2VuZXJhdGVDb25maWcuYWRkRGF0ZSxcbiAgICB0aXRsZUNlbGw6IGZ1bmN0aW9uIHRpdGxlQ2VsbChkYXRlKSB7XG4gICAgICByZXR1cm4gZm9ybWF0VmFsdWUoZGF0ZSwge1xuICAgICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgICAgZm9ybWF0OiAnWVlZWS1NTS1ERCcsXG4gICAgICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZ1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBoZWFkZXJDZWxsczogaGVhZGVyQ2VsbHNcbiAgfSkpO1xufVxuZXhwb3J0IGRlZmF1bHQgRGF0ZUJvZHk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgSGVhZGVyIGZyb20gJy4uL0hlYWRlcic7XG5pbXBvcnQgUGFuZWxDb250ZXh0IGZyb20gJy4uLy4uL1BhbmVsQ29udGV4dCc7XG5pbXBvcnQgeyBmb3JtYXRWYWx1ZSB9IGZyb20gJy4uLy4uL3V0aWxzL2RhdGVVdGlsJztcbmZ1bmN0aW9uIERhdGVIZWFkZXIocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBnZW5lcmF0ZUNvbmZpZyA9IHByb3BzLmdlbmVyYXRlQ29uZmlnLFxuICAgIGxvY2FsZSA9IHByb3BzLmxvY2FsZSxcbiAgICB2aWV3RGF0ZSA9IHByb3BzLnZpZXdEYXRlLFxuICAgIG9uTmV4dE1vbnRoID0gcHJvcHMub25OZXh0TW9udGgsXG4gICAgb25QcmV2TW9udGggPSBwcm9wcy5vblByZXZNb250aCxcbiAgICBvbk5leHRZZWFyID0gcHJvcHMub25OZXh0WWVhcixcbiAgICBvblByZXZZZWFyID0gcHJvcHMub25QcmV2WWVhcixcbiAgICBvblllYXJDbGljayA9IHByb3BzLm9uWWVhckNsaWNrLFxuICAgIG9uTW9udGhDbGljayA9IHByb3BzLm9uTW9udGhDbGljaztcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChQYW5lbENvbnRleHQpLFxuICAgIGhpZGVIZWFkZXIgPSBfUmVhY3QkdXNlQ29udGV4dC5oaWRlSGVhZGVyO1xuICBpZiAoaGlkZUhlYWRlcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBoZWFkZXJQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhlYWRlclwiKTtcbiAgdmFyIG1vbnRoc0xvY2FsZSA9IGxvY2FsZS5zaG9ydE1vbnRocyB8fCAoZ2VuZXJhdGVDb25maWcubG9jYWxlLmdldFNob3J0TW9udGhzID8gZ2VuZXJhdGVDb25maWcubG9jYWxlLmdldFNob3J0TW9udGhzKGxvY2FsZS5sb2NhbGUpIDogW10pO1xuICB2YXIgbW9udGggPSBnZW5lcmF0ZUNvbmZpZy5nZXRNb250aCh2aWV3RGF0ZSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT0gTW9udGggJiBZZWFyID09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHllYXJOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAga2V5OiBcInllYXJcIixcbiAgICBvbkNsaWNrOiBvblllYXJDbGljayxcbiAgICB0YWJJbmRleDogLTEsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXllYXItYnRuXCIpXG4gIH0sIGZvcm1hdFZhbHVlKHZpZXdEYXRlLCB7XG4gICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgZm9ybWF0OiBsb2NhbGUueWVhckZvcm1hdCxcbiAgICBnZW5lcmF0ZUNvbmZpZzogZ2VuZXJhdGVDb25maWdcbiAgfSkpO1xuICB2YXIgbW9udGhOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAga2V5OiBcIm1vbnRoXCIsXG4gICAgb25DbGljazogb25Nb250aENsaWNrLFxuICAgIHRhYkluZGV4OiAtMSxcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbW9udGgtYnRuXCIpXG4gIH0sIGxvY2FsZS5tb250aEZvcm1hdCA/IGZvcm1hdFZhbHVlKHZpZXdEYXRlLCB7XG4gICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgZm9ybWF0OiBsb2NhbGUubW9udGhGb3JtYXQsXG4gICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnXG4gIH0pIDogbW9udGhzTG9jYWxlW21vbnRoXSk7XG4gIHZhciBtb250aFllYXJOb2RlcyA9IGxvY2FsZS5tb250aEJlZm9yZVllYXIgPyBbbW9udGhOb2RlLCB5ZWFyTm9kZV0gOiBbeWVhck5vZGUsIG1vbnRoTm9kZV07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChIZWFkZXIsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHByZWZpeENsczogaGVhZGVyUHJlZml4Q2xzLFxuICAgIG9uU3VwZXJQcmV2OiBvblByZXZZZWFyLFxuICAgIG9uUHJldjogb25QcmV2TW9udGgsXG4gICAgb25OZXh0OiBvbk5leHRNb250aCxcbiAgICBvblN1cGVyTmV4dDogb25OZXh0WWVhclxuICB9KSwgbW9udGhZZWFyTm9kZXMpO1xufVxuZXhwb3J0IGRlZmF1bHQgRGF0ZUhlYWRlcjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgRGF0ZUJvZHkgZnJvbSAnLi9EYXRlQm9keSc7XG5pbXBvcnQgRGF0ZUhlYWRlciBmcm9tICcuL0RhdGVIZWFkZXInO1xuaW1wb3J0IHsgV0VFS19EQVlfQ09VTlQgfSBmcm9tICcuLi8uLi91dGlscy9kYXRlVXRpbCc7XG5pbXBvcnQgeyBjcmVhdGVLZXlEb3duSGFuZGxlciB9IGZyb20gJy4uLy4uL3V0aWxzL3VpVXRpbCc7XG52YXIgREFURV9ST1dfQ09VTlQgPSA2O1xuZnVuY3Rpb24gRGF0ZVBhbmVsKHByb3BzKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgX3Byb3BzJHBhbmVsTmFtZSA9IHByb3BzLnBhbmVsTmFtZSxcbiAgICBwYW5lbE5hbWUgPSBfcHJvcHMkcGFuZWxOYW1lID09PSB2b2lkIDAgPyAnZGF0ZScgOiBfcHJvcHMkcGFuZWxOYW1lLFxuICAgIGtleWJvYXJkQ29uZmlnID0gcHJvcHMua2V5Ym9hcmRDb25maWcsXG4gICAgYWN0aXZlID0gcHJvcHMuYWN0aXZlLFxuICAgIG9wZXJhdGlvblJlZiA9IHByb3BzLm9wZXJhdGlvblJlZixcbiAgICBnZW5lcmF0ZUNvbmZpZyA9IHByb3BzLmdlbmVyYXRlQ29uZmlnLFxuICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgdmlld0RhdGUgPSBwcm9wcy52aWV3RGF0ZSxcbiAgICBvblZpZXdEYXRlQ2hhbmdlID0gcHJvcHMub25WaWV3RGF0ZUNoYW5nZSxcbiAgICBvblBhbmVsQ2hhbmdlID0gcHJvcHMub25QYW5lbENoYW5nZSxcbiAgICBfb25TZWxlY3QgPSBwcm9wcy5vblNlbGVjdDtcbiAgdmFyIHBhbmVsUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHBhbmVsTmFtZSwgXCItcGFuZWxcIik7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09IEtleWJvYXJkID09PT09PT09PT09PT09PT09PT09PT09XG4gIG9wZXJhdGlvblJlZi5jdXJyZW50ID0ge1xuICAgIG9uS2V5RG93bjogZnVuY3Rpb24gb25LZXlEb3duKGV2ZW50KSB7XG4gICAgICByZXR1cm4gY3JlYXRlS2V5RG93bkhhbmRsZXIoZXZlbnQsIF9vYmplY3RTcHJlYWQoe1xuICAgICAgICBvbkxlZnRSaWdodDogZnVuY3Rpb24gb25MZWZ0UmlnaHQoZGlmZikge1xuICAgICAgICAgIF9vblNlbGVjdChnZW5lcmF0ZUNvbmZpZy5hZGREYXRlKHZhbHVlIHx8IHZpZXdEYXRlLCBkaWZmKSwgJ2tleScpO1xuICAgICAgICB9LFxuICAgICAgICBvbkN0cmxMZWZ0UmlnaHQ6IGZ1bmN0aW9uIG9uQ3RybExlZnRSaWdodChkaWZmKSB7XG4gICAgICAgICAgX29uU2VsZWN0KGdlbmVyYXRlQ29uZmlnLmFkZFllYXIodmFsdWUgfHwgdmlld0RhdGUsIGRpZmYpLCAna2V5Jyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVXBEb3duOiBmdW5jdGlvbiBvblVwRG93bihkaWZmKSB7XG4gICAgICAgICAgX29uU2VsZWN0KGdlbmVyYXRlQ29uZmlnLmFkZERhdGUodmFsdWUgfHwgdmlld0RhdGUsIGRpZmYgKiBXRUVLX0RBWV9DT1VOVCksICdrZXknKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25QYWdlVXBEb3duOiBmdW5jdGlvbiBvblBhZ2VVcERvd24oZGlmZikge1xuICAgICAgICAgIF9vblNlbGVjdChnZW5lcmF0ZUNvbmZpZy5hZGRNb250aCh2YWx1ZSB8fCB2aWV3RGF0ZSwgZGlmZiksICdrZXknKTtcbiAgICAgICAgfVxuICAgICAgfSwga2V5Ym9hcmRDb25maWcpKTtcbiAgICB9XG4gIH07XG4gIC8vID09PT09PT09PT09PT09PT09PT09IFZpZXcgT3BlcmF0aW9uID09PT09PT09PT09PT09PT09PT09XG4gIHZhciBvblllYXJDaGFuZ2UgPSBmdW5jdGlvbiBvblllYXJDaGFuZ2UoZGlmZikge1xuICAgIHZhciBuZXdEYXRlID0gZ2VuZXJhdGVDb25maWcuYWRkWWVhcih2aWV3RGF0ZSwgZGlmZik7XG4gICAgb25WaWV3RGF0ZUNoYW5nZShuZXdEYXRlKTtcbiAgICBvblBhbmVsQ2hhbmdlKG51bGwsIG5ld0RhdGUpO1xuICB9O1xuICB2YXIgb25Nb250aENoYW5nZSA9IGZ1bmN0aW9uIG9uTW9udGhDaGFuZ2UoZGlmZikge1xuICAgIHZhciBuZXdEYXRlID0gZ2VuZXJhdGVDb25maWcuYWRkTW9udGgodmlld0RhdGUsIGRpZmYpO1xuICAgIG9uVmlld0RhdGVDaGFuZ2UobmV3RGF0ZSk7XG4gICAgb25QYW5lbENoYW5nZShudWxsLCBuZXdEYXRlKTtcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMocGFuZWxQcmVmaXhDbHMsIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocGFuZWxQcmVmaXhDbHMsIFwiLWFjdGl2ZVwiKSwgYWN0aXZlKSlcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRGF0ZUhlYWRlciwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIHZpZXdEYXRlOiB2aWV3RGF0ZVxuICAgIC8vIFZpZXcgT3BlcmF0aW9uXG4gICAgLFxuICAgIG9uUHJldlllYXI6IGZ1bmN0aW9uIG9uUHJldlllYXIoKSB7XG4gICAgICBvblllYXJDaGFuZ2UoLTEpO1xuICAgIH0sXG4gICAgb25OZXh0WWVhcjogZnVuY3Rpb24gb25OZXh0WWVhcigpIHtcbiAgICAgIG9uWWVhckNoYW5nZSgxKTtcbiAgICB9LFxuICAgIG9uUHJldk1vbnRoOiBmdW5jdGlvbiBvblByZXZNb250aCgpIHtcbiAgICAgIG9uTW9udGhDaGFuZ2UoLTEpO1xuICAgIH0sXG4gICAgb25OZXh0TW9udGg6IGZ1bmN0aW9uIG9uTmV4dE1vbnRoKCkge1xuICAgICAgb25Nb250aENoYW5nZSgxKTtcbiAgICB9LFxuICAgIG9uTW9udGhDbGljazogZnVuY3Rpb24gb25Nb250aENsaWNrKCkge1xuICAgICAgb25QYW5lbENoYW5nZSgnbW9udGgnLCB2aWV3RGF0ZSk7XG4gICAgfSxcbiAgICBvblllYXJDbGljazogZnVuY3Rpb24gb25ZZWFyQ2xpY2soKSB7XG4gICAgICBvblBhbmVsQ2hhbmdlKCd5ZWFyJywgdmlld0RhdGUpO1xuICAgIH1cbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEYXRlQm9keSwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgb25TZWxlY3Q6IGZ1bmN0aW9uIG9uU2VsZWN0KGRhdGUpIHtcbiAgICAgIHJldHVybiBfb25TZWxlY3QoZGF0ZSwgJ21vdXNlJyk7XG4gICAgfSxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgdmlld0RhdGU6IHZpZXdEYXRlLFxuICAgIHJvd0NvdW50OiBEQVRFX1JPV19DT1VOVFxuICB9KSkpO1xufVxuZXhwb3J0IGRlZmF1bHQgRGF0ZVBhbmVsOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IEtleUNvZGUgZnJvbSBcInJjLXV0aWwvZXMvS2V5Q29kZVwiO1xuaW1wb3J0IERhdGVQYW5lbCBmcm9tICcuLi9EYXRlUGFuZWwnO1xuaW1wb3J0IFRpbWVQYW5lbCBmcm9tICcuLi9UaW1lUGFuZWwnO1xuaW1wb3J0IHsgdHVwbGUgfSBmcm9tICcuLi8uLi91dGlscy9taXNjVXRpbCc7XG5pbXBvcnQgeyBzZXREYXRlVGltZSBhcyBzZXRUaW1lIH0gZnJvbSAnLi4vLi4vdXRpbHMvdGltZVV0aWwnO1xudmFyIEFDVElWRV9QQU5FTCA9IHR1cGxlKCdkYXRlJywgJ3RpbWUnKTtcbmZ1bmN0aW9uIERhdGV0aW1lUGFuZWwocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBvcGVyYXRpb25SZWYgPSBwcm9wcy5vcGVyYXRpb25SZWYsXG4gICAgZ2VuZXJhdGVDb25maWcgPSBwcm9wcy5nZW5lcmF0ZUNvbmZpZyxcbiAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZSxcbiAgICBkaXNhYmxlZFRpbWUgPSBwcm9wcy5kaXNhYmxlZFRpbWUsXG4gICAgc2hvd1RpbWUgPSBwcm9wcy5zaG93VGltZSxcbiAgICBvblNlbGVjdCA9IHByb3BzLm9uU2VsZWN0O1xuICB2YXIgcGFuZWxQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRhdGV0aW1lLXBhbmVsXCIpO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUobnVsbCksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgYWN0aXZlUGFuZWwgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldEFjdGl2ZVBhbmVsID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIGRhdGVPcGVyYXRpb25SZWYgPSBSZWFjdC51c2VSZWYoe30pO1xuICB2YXIgdGltZU9wZXJhdGlvblJlZiA9IFJlYWN0LnVzZVJlZih7fSk7XG4gIHZhciB0aW1lUHJvcHMgPSBfdHlwZW9mKHNob3dUaW1lKSA9PT0gJ29iamVjdCcgPyBfb2JqZWN0U3ByZWFkKHt9LCBzaG93VGltZSkgOiB7fTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gS2V5Ym9hcmQgPT09PT09PT09PT09PT09PT09PT09PT1cbiAgZnVuY3Rpb24gZ2V0TmV4dEFjdGl2ZShvZmZzZXQpIHtcbiAgICB2YXIgYWN0aXZlSW5kZXggPSBBQ1RJVkVfUEFORUwuaW5kZXhPZihhY3RpdmVQYW5lbCkgKyBvZmZzZXQ7XG4gICAgdmFyIG5leHRBY3RpdmVQYW5lbCA9IEFDVElWRV9QQU5FTFthY3RpdmVJbmRleF0gfHwgbnVsbDtcbiAgICByZXR1cm4gbmV4dEFjdGl2ZVBhbmVsO1xuICB9XG4gIHZhciBvbkJsdXIgPSBmdW5jdGlvbiBvbkJsdXIoZSkge1xuICAgIGlmICh0aW1lT3BlcmF0aW9uUmVmLmN1cnJlbnQub25CbHVyKSB7XG4gICAgICB0aW1lT3BlcmF0aW9uUmVmLmN1cnJlbnQub25CbHVyKGUpO1xuICAgIH1cbiAgICBzZXRBY3RpdmVQYW5lbChudWxsKTtcbiAgfTtcbiAgb3BlcmF0aW9uUmVmLmN1cnJlbnQgPSB7XG4gICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIC8vIFN3aXRjaCBhY3RpdmUgcGFuZWxcbiAgICAgIGlmIChldmVudC53aGljaCA9PT0gS2V5Q29kZS5UQUIpIHtcbiAgICAgICAgdmFyIG5leHRBY3RpdmVQYW5lbCA9IGdldE5leHRBY3RpdmUoZXZlbnQuc2hpZnRLZXkgPyAtMSA6IDEpO1xuICAgICAgICBzZXRBY3RpdmVQYW5lbChuZXh0QWN0aXZlUGFuZWwpO1xuICAgICAgICBpZiAobmV4dEFjdGl2ZVBhbmVsKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8vIE9wZXJhdGUgb24gY3VycmVudCBhY3RpdmUgcGFuZWxcbiAgICAgIGlmIChhY3RpdmVQYW5lbCkge1xuICAgICAgICB2YXIgcmVmID0gYWN0aXZlUGFuZWwgPT09ICdkYXRlJyA/IGRhdGVPcGVyYXRpb25SZWYgOiB0aW1lT3BlcmF0aW9uUmVmO1xuICAgICAgICBpZiAocmVmLmN1cnJlbnQgJiYgcmVmLmN1cnJlbnQub25LZXlEb3duKSB7XG4gICAgICAgICAgcmVmLmN1cnJlbnQub25LZXlEb3duKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8vIFN3aXRjaCBmaXJzdCBhY3RpdmUgcGFuZWwgaWYgb3BlcmF0ZSB3aXRob3V0IHBhbmVsXG4gICAgICBpZiAoW0tleUNvZGUuTEVGVCwgS2V5Q29kZS5SSUdIVCwgS2V5Q29kZS5VUCwgS2V5Q29kZS5ET1dOXS5pbmNsdWRlcyhldmVudC53aGljaCkpIHtcbiAgICAgICAgc2V0QWN0aXZlUGFuZWwoJ2RhdGUnKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBvbkJsdXI6IG9uQmx1cixcbiAgICBvbkNsb3NlOiBvbkJsdXJcbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IEV2ZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG9uSW50ZXJuYWxTZWxlY3QgPSBmdW5jdGlvbiBvbkludGVybmFsU2VsZWN0KGRhdGUsIHNvdXJjZSkge1xuICAgIHZhciBzZWxlY3RlZERhdGUgPSBkYXRlO1xuICAgIGlmIChzb3VyY2UgPT09ICdkYXRlJyAmJiAhdmFsdWUgJiYgdGltZVByb3BzLmRlZmF1bHRWYWx1ZSkge1xuICAgICAgLy8gRGF0ZSB3aXRoIHRpbWUgZGVmYXVsdFZhbHVlXG4gICAgICBzZWxlY3RlZERhdGUgPSBnZW5lcmF0ZUNvbmZpZy5zZXRIb3VyKHNlbGVjdGVkRGF0ZSwgZ2VuZXJhdGVDb25maWcuZ2V0SG91cih0aW1lUHJvcHMuZGVmYXVsdFZhbHVlKSk7XG4gICAgICBzZWxlY3RlZERhdGUgPSBnZW5lcmF0ZUNvbmZpZy5zZXRNaW51dGUoc2VsZWN0ZWREYXRlLCBnZW5lcmF0ZUNvbmZpZy5nZXRNaW51dGUodGltZVByb3BzLmRlZmF1bHRWYWx1ZSkpO1xuICAgICAgc2VsZWN0ZWREYXRlID0gZ2VuZXJhdGVDb25maWcuc2V0U2Vjb25kKHNlbGVjdGVkRGF0ZSwgZ2VuZXJhdGVDb25maWcuZ2V0U2Vjb25kKHRpbWVQcm9wcy5kZWZhdWx0VmFsdWUpKTtcbiAgICB9IGVsc2UgaWYgKHNvdXJjZSA9PT0gJ3RpbWUnICYmICF2YWx1ZSAmJiBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHNlbGVjdGVkRGF0ZSA9IGdlbmVyYXRlQ29uZmlnLnNldFllYXIoc2VsZWN0ZWREYXRlLCBnZW5lcmF0ZUNvbmZpZy5nZXRZZWFyKGRlZmF1bHRWYWx1ZSkpO1xuICAgICAgc2VsZWN0ZWREYXRlID0gZ2VuZXJhdGVDb25maWcuc2V0TW9udGgoc2VsZWN0ZWREYXRlLCBnZW5lcmF0ZUNvbmZpZy5nZXRNb250aChkZWZhdWx0VmFsdWUpKTtcbiAgICAgIHNlbGVjdGVkRGF0ZSA9IGdlbmVyYXRlQ29uZmlnLnNldERhdGUoc2VsZWN0ZWREYXRlLCBnZW5lcmF0ZUNvbmZpZy5nZXREYXRlKGRlZmF1bHRWYWx1ZSkpO1xuICAgIH1cbiAgICBpZiAob25TZWxlY3QpIHtcbiAgICAgIG9uU2VsZWN0KHNlbGVjdGVkRGF0ZSwgJ21vdXNlJyk7XG4gICAgfVxuICB9O1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgZGlzYWJsZWRUaW1lcyA9IGRpc2FibGVkVGltZSA/IGRpc2FibGVkVGltZSh2YWx1ZSB8fCBudWxsKSA6IHt9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhwYW5lbFByZWZpeENscywgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwYW5lbFByZWZpeENscywgXCItYWN0aXZlXCIpLCBhY3RpdmVQYW5lbCkpXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERhdGVQYW5lbCwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgb3BlcmF0aW9uUmVmOiBkYXRlT3BlcmF0aW9uUmVmLFxuICAgIGFjdGl2ZTogYWN0aXZlUGFuZWwgPT09ICdkYXRlJyxcbiAgICBvblNlbGVjdDogZnVuY3Rpb24gb25TZWxlY3QoZGF0ZSkge1xuICAgICAgb25JbnRlcm5hbFNlbGVjdChzZXRUaW1lKGdlbmVyYXRlQ29uZmlnLCBkYXRlLCAhdmFsdWUgJiYgX3R5cGVvZihzaG93VGltZSkgPT09ICdvYmplY3QnID8gc2hvd1RpbWUuZGVmYXVsdFZhbHVlIDogbnVsbCksICdkYXRlJyk7XG4gICAgfVxuICB9KSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRpbWVQYW5lbCwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgZm9ybWF0OiB1bmRlZmluZWRcbiAgfSwgdGltZVByb3BzLCBkaXNhYmxlZFRpbWVzLCB7XG4gICAgZGlzYWJsZWRUaW1lOiBudWxsLFxuICAgIGRlZmF1bHRWYWx1ZTogdW5kZWZpbmVkLFxuICAgIG9wZXJhdGlvblJlZjogdGltZU9wZXJhdGlvblJlZixcbiAgICBhY3RpdmU6IGFjdGl2ZVBhbmVsID09PSAndGltZScsXG4gICAgb25TZWxlY3Q6IGZ1bmN0aW9uIG9uU2VsZWN0KGRhdGUpIHtcbiAgICAgIG9uSW50ZXJuYWxTZWxlY3QoZGF0ZSwgJ3RpbWUnKTtcbiAgICB9XG4gIH0pKSk7XG59XG5leHBvcnQgZGVmYXVsdCBEYXRldGltZVBhbmVsOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IERhdGVQYW5lbCBmcm9tICcuLi9EYXRlUGFuZWwnO1xuaW1wb3J0IHsgaXNTYW1lV2VlayB9IGZyb20gJy4uLy4uL3V0aWxzL2RhdGVVdGlsJztcbmZ1bmN0aW9uIFdlZWtQYW5lbChwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGdlbmVyYXRlQ29uZmlnID0gcHJvcHMuZ2VuZXJhdGVDb25maWcsXG4gICAgbG9jYWxlID0gcHJvcHMubG9jYWxlLFxuICAgIHZhbHVlID0gcHJvcHMudmFsdWU7XG4gIC8vIFJlbmRlciBhZGRpdGlvbmFsIGNvbHVtblxuICB2YXIgY2VsbFByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2VsbFwiKTtcbiAgdmFyIHByZWZpeENvbHVtbiA9IGZ1bmN0aW9uIHByZWZpeENvbHVtbihkYXRlKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwidGRcIiwge1xuICAgICAga2V5OiBcIndlZWtcIixcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjZWxsUHJlZml4Q2xzLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi13ZWVrXCIpKVxuICAgIH0sIGdlbmVyYXRlQ29uZmlnLmxvY2FsZS5nZXRXZWVrKGxvY2FsZS5sb2NhbGUsIGRhdGUpKTtcbiAgfTtcbiAgLy8gQWRkIHJvdyBjbGFzc05hbWVcbiAgdmFyIHJvd1ByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd2Vlay1wYW5lbC1yb3dcIik7XG4gIHZhciByb3dDbGFzc05hbWUgPSBmdW5jdGlvbiByb3dDbGFzc05hbWUoZGF0ZSkge1xuICAgIHJldHVybiBjbGFzc05hbWVzKHJvd1ByZWZpeENscywgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChyb3dQcmVmaXhDbHMsIFwiLXNlbGVjdGVkXCIpLCBpc1NhbWVXZWVrKGdlbmVyYXRlQ29uZmlnLCBsb2NhbGUubG9jYWxlLCB2YWx1ZSwgZGF0ZSkpKTtcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERhdGVQYW5lbCwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcGFuZWxOYW1lOiBcIndlZWtcIixcbiAgICBwcmVmaXhDb2x1bW46IHByZWZpeENvbHVtbixcbiAgICByb3dDbGFzc05hbWU6IHJvd0NsYXNzTmFtZSxcbiAgICBrZXlib2FyZENvbmZpZzoge1xuICAgICAgb25MZWZ0UmlnaHQ6IG51bGxcbiAgICB9XG4gIH0pKTtcbn1cbmV4cG9ydCBkZWZhdWx0IFdlZWtQYW5lbDsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBIZWFkZXIgZnJvbSAnLi4vSGVhZGVyJztcbmltcG9ydCBQYW5lbENvbnRleHQgZnJvbSAnLi4vLi4vUGFuZWxDb250ZXh0JztcbmltcG9ydCB7IGZvcm1hdFZhbHVlIH0gZnJvbSAnLi4vLi4vdXRpbHMvZGF0ZVV0aWwnO1xuZnVuY3Rpb24gTW9udGhIZWFkZXIocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBnZW5lcmF0ZUNvbmZpZyA9IHByb3BzLmdlbmVyYXRlQ29uZmlnLFxuICAgIGxvY2FsZSA9IHByb3BzLmxvY2FsZSxcbiAgICB2aWV3RGF0ZSA9IHByb3BzLnZpZXdEYXRlLFxuICAgIG9uTmV4dFllYXIgPSBwcm9wcy5vbk5leHRZZWFyLFxuICAgIG9uUHJldlllYXIgPSBwcm9wcy5vblByZXZZZWFyLFxuICAgIG9uWWVhckNsaWNrID0gcHJvcHMub25ZZWFyQ2xpY2s7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoUGFuZWxDb250ZXh0KSxcbiAgICBoaWRlSGVhZGVyID0gX1JlYWN0JHVzZUNvbnRleHQuaGlkZUhlYWRlcjtcbiAgaWYgKGhpZGVIZWFkZXIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgaGVhZGVyUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oZWFkZXJcIik7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChIZWFkZXIsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHByZWZpeENsczogaGVhZGVyUHJlZml4Q2xzLFxuICAgIG9uU3VwZXJQcmV2OiBvblByZXZZZWFyLFxuICAgIG9uU3VwZXJOZXh0OiBvbk5leHRZZWFyXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgdHlwZTogXCJidXR0b25cIixcbiAgICBvbkNsaWNrOiBvblllYXJDbGljayxcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCIteWVhci1idG5cIilcbiAgfSwgZm9ybWF0VmFsdWUodmlld0RhdGUsIHtcbiAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICBmb3JtYXQ6IGxvY2FsZS55ZWFyRm9ybWF0LFxuICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZ1xuICB9KSkpO1xufVxuZXhwb3J0IGRlZmF1bHQgTW9udGhIZWFkZXI7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBmb3JtYXRWYWx1ZSwgaXNTYW1lTW9udGggfSBmcm9tICcuLi8uLi91dGlscy9kYXRlVXRpbCc7XG5pbXBvcnQgUmFuZ2VDb250ZXh0IGZyb20gJy4uLy4uL1JhbmdlQ29udGV4dCc7XG5pbXBvcnQgdXNlQ2VsbENsYXNzTmFtZSBmcm9tICcuLi8uLi9ob29rcy91c2VDZWxsQ2xhc3NOYW1lJztcbmltcG9ydCBQYW5lbEJvZHkgZnJvbSAnLi4vUGFuZWxCb2R5JztcbmV4cG9ydCB2YXIgTU9OVEhfQ09MX0NPVU5UID0gMztcbnZhciBNT05USF9ST1dfQ09VTlQgPSA0O1xuZnVuY3Rpb24gTW9udGhCb2R5KHByb3BzKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgbG9jYWxlID0gcHJvcHMubG9jYWxlLFxuICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgdmlld0RhdGUgPSBwcm9wcy52aWV3RGF0ZSxcbiAgICBnZW5lcmF0ZUNvbmZpZyA9IHByb3BzLmdlbmVyYXRlQ29uZmlnLFxuICAgIG1vbnRoQ2VsbFJlbmRlciA9IHByb3BzLm1vbnRoQ2VsbFJlbmRlcjtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChSYW5nZUNvbnRleHQpLFxuICAgIHJhbmdlZFZhbHVlID0gX1JlYWN0JHVzZUNvbnRleHQucmFuZ2VkVmFsdWUsXG4gICAgaG92ZXJSYW5nZWRWYWx1ZSA9IF9SZWFjdCR1c2VDb250ZXh0LmhvdmVyUmFuZ2VkVmFsdWU7XG4gIHZhciBjZWxsUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jZWxsXCIpO1xuICB2YXIgZ2V0Q2VsbENsYXNzTmFtZSA9IHVzZUNlbGxDbGFzc05hbWUoe1xuICAgIGNlbGxQcmVmaXhDbHM6IGNlbGxQcmVmaXhDbHMsXG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZyxcbiAgICByYW5nZWRWYWx1ZTogcmFuZ2VkVmFsdWUsXG4gICAgaG92ZXJSYW5nZWRWYWx1ZTogaG92ZXJSYW5nZWRWYWx1ZSxcbiAgICBpc1NhbWVDZWxsOiBmdW5jdGlvbiBpc1NhbWVDZWxsKGN1cnJlbnQsIHRhcmdldCkge1xuICAgICAgcmV0dXJuIGlzU2FtZU1vbnRoKGdlbmVyYXRlQ29uZmlnLCBjdXJyZW50LCB0YXJnZXQpO1xuICAgIH0sXG4gICAgaXNJblZpZXc6IGZ1bmN0aW9uIGlzSW5WaWV3KCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBvZmZzZXRDZWxsOiBmdW5jdGlvbiBvZmZzZXRDZWxsKGRhdGUsIG9mZnNldCkge1xuICAgICAgcmV0dXJuIGdlbmVyYXRlQ29uZmlnLmFkZE1vbnRoKGRhdGUsIG9mZnNldCk7XG4gICAgfVxuICB9KTtcbiAgdmFyIG1vbnRoc0xvY2FsZSA9IGxvY2FsZS5zaG9ydE1vbnRocyB8fCAoZ2VuZXJhdGVDb25maWcubG9jYWxlLmdldFNob3J0TW9udGhzID8gZ2VuZXJhdGVDb25maWcubG9jYWxlLmdldFNob3J0TW9udGhzKGxvY2FsZS5sb2NhbGUpIDogW10pO1xuICB2YXIgYmFzZU1vbnRoID0gZ2VuZXJhdGVDb25maWcuc2V0TW9udGgodmlld0RhdGUsIDApO1xuICB2YXIgZ2V0Q2VsbE5vZGUgPSBtb250aENlbGxSZW5kZXIgPyBmdW5jdGlvbiAoZGF0ZSkge1xuICAgIHJldHVybiBtb250aENlbGxSZW5kZXIoZGF0ZSwgbG9jYWxlKTtcbiAgfSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBhbmVsQm9keSwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcm93TnVtOiBNT05USF9ST1dfQ09VTlQsXG4gICAgY29sTnVtOiBNT05USF9DT0xfQ09VTlQsXG4gICAgYmFzZURhdGU6IGJhc2VNb250aCxcbiAgICBnZXRDZWxsTm9kZTogZ2V0Q2VsbE5vZGUsXG4gICAgZ2V0Q2VsbFRleHQ6IGZ1bmN0aW9uIGdldENlbGxUZXh0KGRhdGUpIHtcbiAgICAgIHJldHVybiBsb2NhbGUubW9udGhGb3JtYXQgPyBmb3JtYXRWYWx1ZShkYXRlLCB7XG4gICAgICAgIGxvY2FsZTogbG9jYWxlLFxuICAgICAgICBmb3JtYXQ6IGxvY2FsZS5tb250aEZvcm1hdCxcbiAgICAgICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnXG4gICAgICB9KSA6IG1vbnRoc0xvY2FsZVtnZW5lcmF0ZUNvbmZpZy5nZXRNb250aChkYXRlKV07XG4gICAgfSxcbiAgICBnZXRDZWxsQ2xhc3NOYW1lOiBnZXRDZWxsQ2xhc3NOYW1lLFxuICAgIGdldENlbGxEYXRlOiBnZW5lcmF0ZUNvbmZpZy5hZGRNb250aCxcbiAgICB0aXRsZUNlbGw6IGZ1bmN0aW9uIHRpdGxlQ2VsbChkYXRlKSB7XG4gICAgICByZXR1cm4gZm9ybWF0VmFsdWUoZGF0ZSwge1xuICAgICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgICAgZm9ybWF0OiAnWVlZWS1NTScsXG4gICAgICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZ1xuICAgICAgfSk7XG4gICAgfVxuICB9KSk7XG59XG5leHBvcnQgZGVmYXVsdCBNb250aEJvZHk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgTW9udGhIZWFkZXIgZnJvbSAnLi9Nb250aEhlYWRlcic7XG5pbXBvcnQgTW9udGhCb2R5LCB7IE1PTlRIX0NPTF9DT1VOVCB9IGZyb20gJy4vTW9udGhCb2R5JztcbmltcG9ydCB7IGNyZWF0ZUtleURvd25IYW5kbGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvdWlVdGlsJztcbmZ1bmN0aW9uIE1vbnRoUGFuZWwocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBvcGVyYXRpb25SZWYgPSBwcm9wcy5vcGVyYXRpb25SZWYsXG4gICAgb25WaWV3RGF0ZUNoYW5nZSA9IHByb3BzLm9uVmlld0RhdGVDaGFuZ2UsXG4gICAgZ2VuZXJhdGVDb25maWcgPSBwcm9wcy5nZW5lcmF0ZUNvbmZpZyxcbiAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgIHZpZXdEYXRlID0gcHJvcHMudmlld0RhdGUsXG4gICAgb25QYW5lbENoYW5nZSA9IHByb3BzLm9uUGFuZWxDaGFuZ2UsXG4gICAgX29uU2VsZWN0ID0gcHJvcHMub25TZWxlY3Q7XG4gIHZhciBwYW5lbFByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbW9udGgtcGFuZWxcIik7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09IEtleWJvYXJkID09PT09PT09PT09PT09PT09PT09PT09XG4gIG9wZXJhdGlvblJlZi5jdXJyZW50ID0ge1xuICAgIG9uS2V5RG93bjogZnVuY3Rpb24gb25LZXlEb3duKGV2ZW50KSB7XG4gICAgICByZXR1cm4gY3JlYXRlS2V5RG93bkhhbmRsZXIoZXZlbnQsIHtcbiAgICAgICAgb25MZWZ0UmlnaHQ6IGZ1bmN0aW9uIG9uTGVmdFJpZ2h0KGRpZmYpIHtcbiAgICAgICAgICBfb25TZWxlY3QoZ2VuZXJhdGVDb25maWcuYWRkTW9udGgodmFsdWUgfHwgdmlld0RhdGUsIGRpZmYpLCAna2V5Jyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ3RybExlZnRSaWdodDogZnVuY3Rpb24gb25DdHJsTGVmdFJpZ2h0KGRpZmYpIHtcbiAgICAgICAgICBfb25TZWxlY3QoZ2VuZXJhdGVDb25maWcuYWRkWWVhcih2YWx1ZSB8fCB2aWV3RGF0ZSwgZGlmZiksICdrZXknKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VcERvd246IGZ1bmN0aW9uIG9uVXBEb3duKGRpZmYpIHtcbiAgICAgICAgICBfb25TZWxlY3QoZ2VuZXJhdGVDb25maWcuYWRkTW9udGgodmFsdWUgfHwgdmlld0RhdGUsIGRpZmYgKiBNT05USF9DT0xfQ09VTlQpLCAna2V5Jyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRW50ZXI6IGZ1bmN0aW9uIG9uRW50ZXIoKSB7XG4gICAgICAgICAgb25QYW5lbENoYW5nZSgnZGF0ZScsIHZhbHVlIHx8IHZpZXdEYXRlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICAvLyA9PT09PT09PT09PT09PT09PT09PSBWaWV3IE9wZXJhdGlvbiA9PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb25ZZWFyQ2hhbmdlID0gZnVuY3Rpb24gb25ZZWFyQ2hhbmdlKGRpZmYpIHtcbiAgICB2YXIgbmV3RGF0ZSA9IGdlbmVyYXRlQ29uZmlnLmFkZFllYXIodmlld0RhdGUsIGRpZmYpO1xuICAgIG9uVmlld0RhdGVDaGFuZ2UobmV3RGF0ZSk7XG4gICAgb25QYW5lbENoYW5nZShudWxsLCBuZXdEYXRlKTtcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IHBhbmVsUHJlZml4Q2xzXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE1vbnRoSGVhZGVyLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBvblByZXZZZWFyOiBmdW5jdGlvbiBvblByZXZZZWFyKCkge1xuICAgICAgb25ZZWFyQ2hhbmdlKC0xKTtcbiAgICB9LFxuICAgIG9uTmV4dFllYXI6IGZ1bmN0aW9uIG9uTmV4dFllYXIoKSB7XG4gICAgICBvblllYXJDaGFuZ2UoMSk7XG4gICAgfSxcbiAgICBvblllYXJDbGljazogZnVuY3Rpb24gb25ZZWFyQ2xpY2soKSB7XG4gICAgICBvblBhbmVsQ2hhbmdlKCd5ZWFyJywgdmlld0RhdGUpO1xuICAgIH1cbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNb250aEJvZHksIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIG9uU2VsZWN0OiBmdW5jdGlvbiBvblNlbGVjdChkYXRlKSB7XG4gICAgICBfb25TZWxlY3QoZGF0ZSwgJ21vdXNlJyk7XG4gICAgICBvblBhbmVsQ2hhbmdlKCdkYXRlJywgZGF0ZSk7XG4gICAgfVxuICB9KSkpO1xufVxuZXhwb3J0IGRlZmF1bHQgTW9udGhQYW5lbDsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBIZWFkZXIgZnJvbSAnLi4vSGVhZGVyJztcbmltcG9ydCBQYW5lbENvbnRleHQgZnJvbSAnLi4vLi4vUGFuZWxDb250ZXh0JztcbmltcG9ydCB7IGZvcm1hdFZhbHVlIH0gZnJvbSAnLi4vLi4vdXRpbHMvZGF0ZVV0aWwnO1xuZnVuY3Rpb24gUXVhcnRlckhlYWRlcihwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGdlbmVyYXRlQ29uZmlnID0gcHJvcHMuZ2VuZXJhdGVDb25maWcsXG4gICAgbG9jYWxlID0gcHJvcHMubG9jYWxlLFxuICAgIHZpZXdEYXRlID0gcHJvcHMudmlld0RhdGUsXG4gICAgb25OZXh0WWVhciA9IHByb3BzLm9uTmV4dFllYXIsXG4gICAgb25QcmV2WWVhciA9IHByb3BzLm9uUHJldlllYXIsXG4gICAgb25ZZWFyQ2xpY2sgPSBwcm9wcy5vblllYXJDbGljaztcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChQYW5lbENvbnRleHQpLFxuICAgIGhpZGVIZWFkZXIgPSBfUmVhY3QkdXNlQ29udGV4dC5oaWRlSGVhZGVyO1xuICBpZiAoaGlkZUhlYWRlcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBoZWFkZXJQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhlYWRlclwiKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEhlYWRlciwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcHJlZml4Q2xzOiBoZWFkZXJQcmVmaXhDbHMsXG4gICAgb25TdXBlclByZXY6IG9uUHJldlllYXIsXG4gICAgb25TdXBlck5leHQ6IG9uTmV4dFllYXJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgIG9uQ2xpY2s6IG9uWWVhckNsaWNrLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi15ZWFyLWJ0blwiKVxuICB9LCBmb3JtYXRWYWx1ZSh2aWV3RGF0ZSwge1xuICAgIGxvY2FsZTogbG9jYWxlLFxuICAgIGZvcm1hdDogbG9jYWxlLnllYXJGb3JtYXQsXG4gICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnXG4gIH0pKSk7XG59XG5leHBvcnQgZGVmYXVsdCBRdWFydGVySGVhZGVyOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZm9ybWF0VmFsdWUsIGlzU2FtZVF1YXJ0ZXIgfSBmcm9tICcuLi8uLi91dGlscy9kYXRlVXRpbCc7XG5pbXBvcnQgUmFuZ2VDb250ZXh0IGZyb20gJy4uLy4uL1JhbmdlQ29udGV4dCc7XG5pbXBvcnQgdXNlQ2VsbENsYXNzTmFtZSBmcm9tICcuLi8uLi9ob29rcy91c2VDZWxsQ2xhc3NOYW1lJztcbmltcG9ydCBQYW5lbEJvZHkgZnJvbSAnLi4vUGFuZWxCb2R5JztcbmV4cG9ydCB2YXIgUVVBUlRFUl9DT0xfQ09VTlQgPSA0O1xudmFyIFFVQVJURVJfUk9XX0NPVU5UID0gMTtcbmZ1bmN0aW9uIFF1YXJ0ZXJCb2R5KHByb3BzKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgbG9jYWxlID0gcHJvcHMubG9jYWxlLFxuICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgdmlld0RhdGUgPSBwcm9wcy52aWV3RGF0ZSxcbiAgICBnZW5lcmF0ZUNvbmZpZyA9IHByb3BzLmdlbmVyYXRlQ29uZmlnO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFJhbmdlQ29udGV4dCksXG4gICAgcmFuZ2VkVmFsdWUgPSBfUmVhY3QkdXNlQ29udGV4dC5yYW5nZWRWYWx1ZSxcbiAgICBob3ZlclJhbmdlZFZhbHVlID0gX1JlYWN0JHVzZUNvbnRleHQuaG92ZXJSYW5nZWRWYWx1ZTtcbiAgdmFyIGNlbGxQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNlbGxcIik7XG4gIHZhciBnZXRDZWxsQ2xhc3NOYW1lID0gdXNlQ2VsbENsYXNzTmFtZSh7XG4gICAgY2VsbFByZWZpeENsczogY2VsbFByZWZpeENscyxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnLFxuICAgIHJhbmdlZFZhbHVlOiByYW5nZWRWYWx1ZSxcbiAgICBob3ZlclJhbmdlZFZhbHVlOiBob3ZlclJhbmdlZFZhbHVlLFxuICAgIGlzU2FtZUNlbGw6IGZ1bmN0aW9uIGlzU2FtZUNlbGwoY3VycmVudCwgdGFyZ2V0KSB7XG4gICAgICByZXR1cm4gaXNTYW1lUXVhcnRlcihnZW5lcmF0ZUNvbmZpZywgY3VycmVudCwgdGFyZ2V0KTtcbiAgICB9LFxuICAgIGlzSW5WaWV3OiBmdW5jdGlvbiBpc0luVmlldygpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgb2Zmc2V0Q2VsbDogZnVuY3Rpb24gb2Zmc2V0Q2VsbChkYXRlLCBvZmZzZXQpIHtcbiAgICAgIHJldHVybiBnZW5lcmF0ZUNvbmZpZy5hZGRNb250aChkYXRlLCBvZmZzZXQgKiAzKTtcbiAgICB9XG4gIH0pO1xuICB2YXIgYmFzZVF1YXJ0ZXIgPSBnZW5lcmF0ZUNvbmZpZy5zZXREYXRlKGdlbmVyYXRlQ29uZmlnLnNldE1vbnRoKHZpZXdEYXRlLCAwKSwgMSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQYW5lbEJvZHksIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHJvd051bTogUVVBUlRFUl9ST1dfQ09VTlQsXG4gICAgY29sTnVtOiBRVUFSVEVSX0NPTF9DT1VOVCxcbiAgICBiYXNlRGF0ZTogYmFzZVF1YXJ0ZXIsXG4gICAgZ2V0Q2VsbFRleHQ6IGZ1bmN0aW9uIGdldENlbGxUZXh0KGRhdGUpIHtcbiAgICAgIHJldHVybiBmb3JtYXRWYWx1ZShkYXRlLCB7XG4gICAgICAgIGxvY2FsZTogbG9jYWxlLFxuICAgICAgICBmb3JtYXQ6IGxvY2FsZS5xdWFydGVyRm9ybWF0IHx8ICdbUV1RJyxcbiAgICAgICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnXG4gICAgICB9KTtcbiAgICB9LFxuICAgIGdldENlbGxDbGFzc05hbWU6IGdldENlbGxDbGFzc05hbWUsXG4gICAgZ2V0Q2VsbERhdGU6IGZ1bmN0aW9uIGdldENlbGxEYXRlKGRhdGUsIG9mZnNldCkge1xuICAgICAgcmV0dXJuIGdlbmVyYXRlQ29uZmlnLmFkZE1vbnRoKGRhdGUsIG9mZnNldCAqIDMpO1xuICAgIH0sXG4gICAgdGl0bGVDZWxsOiBmdW5jdGlvbiB0aXRsZUNlbGwoZGF0ZSkge1xuICAgICAgcmV0dXJuIGZvcm1hdFZhbHVlKGRhdGUsIHtcbiAgICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICAgIGZvcm1hdDogJ1lZWVktW1FdUScsXG4gICAgICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZ1xuICAgICAgfSk7XG4gICAgfVxuICB9KSk7XG59XG5leHBvcnQgZGVmYXVsdCBRdWFydGVyQm9keTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBRdWFydGVySGVhZGVyIGZyb20gJy4vUXVhcnRlckhlYWRlcic7XG5pbXBvcnQgUXVhcnRlckJvZHkgZnJvbSAnLi9RdWFydGVyQm9keSc7XG5pbXBvcnQgeyBjcmVhdGVLZXlEb3duSGFuZGxlciB9IGZyb20gJy4uLy4uL3V0aWxzL3VpVXRpbCc7XG5mdW5jdGlvbiBRdWFydGVyUGFuZWwocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBvcGVyYXRpb25SZWYgPSBwcm9wcy5vcGVyYXRpb25SZWYsXG4gICAgb25WaWV3RGF0ZUNoYW5nZSA9IHByb3BzLm9uVmlld0RhdGVDaGFuZ2UsXG4gICAgZ2VuZXJhdGVDb25maWcgPSBwcm9wcy5nZW5lcmF0ZUNvbmZpZyxcbiAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgIHZpZXdEYXRlID0gcHJvcHMudmlld0RhdGUsXG4gICAgb25QYW5lbENoYW5nZSA9IHByb3BzLm9uUGFuZWxDaGFuZ2UsXG4gICAgX29uU2VsZWN0ID0gcHJvcHMub25TZWxlY3Q7XG4gIHZhciBwYW5lbFByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcXVhcnRlci1wYW5lbFwiKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gS2V5Ym9hcmQgPT09PT09PT09PT09PT09PT09PT09PT1cbiAgb3BlcmF0aW9uUmVmLmN1cnJlbnQgPSB7XG4gICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIHJldHVybiBjcmVhdGVLZXlEb3duSGFuZGxlcihldmVudCwge1xuICAgICAgICBvbkxlZnRSaWdodDogZnVuY3Rpb24gb25MZWZ0UmlnaHQoZGlmZikge1xuICAgICAgICAgIF9vblNlbGVjdChnZW5lcmF0ZUNvbmZpZy5hZGRNb250aCh2YWx1ZSB8fCB2aWV3RGF0ZSwgZGlmZiAqIDMpLCAna2V5Jyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ3RybExlZnRSaWdodDogZnVuY3Rpb24gb25DdHJsTGVmdFJpZ2h0KGRpZmYpIHtcbiAgICAgICAgICBfb25TZWxlY3QoZ2VuZXJhdGVDb25maWcuYWRkWWVhcih2YWx1ZSB8fCB2aWV3RGF0ZSwgZGlmZiksICdrZXknKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VcERvd246IGZ1bmN0aW9uIG9uVXBEb3duKGRpZmYpIHtcbiAgICAgICAgICBfb25TZWxlY3QoZ2VuZXJhdGVDb25maWcuYWRkWWVhcih2YWx1ZSB8fCB2aWV3RGF0ZSwgZGlmZiksICdrZXknKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICAvLyA9PT09PT09PT09PT09PT09PT09PSBWaWV3IE9wZXJhdGlvbiA9PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb25ZZWFyQ2hhbmdlID0gZnVuY3Rpb24gb25ZZWFyQ2hhbmdlKGRpZmYpIHtcbiAgICB2YXIgbmV3RGF0ZSA9IGdlbmVyYXRlQ29uZmlnLmFkZFllYXIodmlld0RhdGUsIGRpZmYpO1xuICAgIG9uVmlld0RhdGVDaGFuZ2UobmV3RGF0ZSk7XG4gICAgb25QYW5lbENoYW5nZShudWxsLCBuZXdEYXRlKTtcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IHBhbmVsUHJlZml4Q2xzXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFF1YXJ0ZXJIZWFkZXIsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIG9uUHJldlllYXI6IGZ1bmN0aW9uIG9uUHJldlllYXIoKSB7XG4gICAgICBvblllYXJDaGFuZ2UoLTEpO1xuICAgIH0sXG4gICAgb25OZXh0WWVhcjogZnVuY3Rpb24gb25OZXh0WWVhcigpIHtcbiAgICAgIG9uWWVhckNoYW5nZSgxKTtcbiAgICB9LFxuICAgIG9uWWVhckNsaWNrOiBmdW5jdGlvbiBvblllYXJDbGljaygpIHtcbiAgICAgIG9uUGFuZWxDaGFuZ2UoJ3llYXInLCB2aWV3RGF0ZSk7XG4gICAgfVxuICB9KSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFF1YXJ0ZXJCb2R5LCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBvblNlbGVjdDogZnVuY3Rpb24gb25TZWxlY3QoZGF0ZSkge1xuICAgICAgX29uU2VsZWN0KGRhdGUsICdtb3VzZScpO1xuICAgIH1cbiAgfSkpKTtcbn1cbmV4cG9ydCBkZWZhdWx0IFF1YXJ0ZXJQYW5lbDsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBIZWFkZXIgZnJvbSAnLi4vSGVhZGVyJztcbmltcG9ydCB7IFlFQVJfREVDQURFX0NPVU5UIH0gZnJvbSAnLic7XG5pbXBvcnQgUGFuZWxDb250ZXh0IGZyb20gJy4uLy4uL1BhbmVsQ29udGV4dCc7XG5mdW5jdGlvbiBZZWFySGVhZGVyKHByb3BzKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgZ2VuZXJhdGVDb25maWcgPSBwcm9wcy5nZW5lcmF0ZUNvbmZpZyxcbiAgICB2aWV3RGF0ZSA9IHByb3BzLnZpZXdEYXRlLFxuICAgIG9uUHJldkRlY2FkZSA9IHByb3BzLm9uUHJldkRlY2FkZSxcbiAgICBvbk5leHREZWNhZGUgPSBwcm9wcy5vbk5leHREZWNhZGUsXG4gICAgb25EZWNhZGVDbGljayA9IHByb3BzLm9uRGVjYWRlQ2xpY2s7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoUGFuZWxDb250ZXh0KSxcbiAgICBoaWRlSGVhZGVyID0gX1JlYWN0JHVzZUNvbnRleHQuaGlkZUhlYWRlcjtcbiAgaWYgKGhpZGVIZWFkZXIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgaGVhZGVyUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oZWFkZXJcIik7XG4gIHZhciB5ZWFyTnVtYmVyID0gZ2VuZXJhdGVDb25maWcuZ2V0WWVhcih2aWV3RGF0ZSk7XG4gIHZhciBzdGFydFllYXIgPSBNYXRoLmZsb29yKHllYXJOdW1iZXIgLyBZRUFSX0RFQ0FERV9DT1VOVCkgKiBZRUFSX0RFQ0FERV9DT1VOVDtcbiAgdmFyIGVuZFllYXIgPSBzdGFydFllYXIgKyBZRUFSX0RFQ0FERV9DT1VOVCAtIDE7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChIZWFkZXIsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHByZWZpeENsczogaGVhZGVyUHJlZml4Q2xzLFxuICAgIG9uU3VwZXJQcmV2OiBvblByZXZEZWNhZGUsXG4gICAgb25TdXBlck5leHQ6IG9uTmV4dERlY2FkZVxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgb25DbGljazogb25EZWNhZGVDbGljayxcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGVjYWRlLWJ0blwiKVxuICB9LCBzdGFydFllYXIsIFwiLVwiLCBlbmRZZWFyKSk7XG59XG5leHBvcnQgZGVmYXVsdCBZZWFySGVhZGVyOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgWUVBUl9ERUNBREVfQ09VTlQgfSBmcm9tICcuJztcbmltcG9ydCB1c2VDZWxsQ2xhc3NOYW1lIGZyb20gJy4uLy4uL2hvb2tzL3VzZUNlbGxDbGFzc05hbWUnO1xuaW1wb3J0IHsgZm9ybWF0VmFsdWUsIGlzU2FtZVllYXIgfSBmcm9tICcuLi8uLi91dGlscy9kYXRlVXRpbCc7XG5pbXBvcnQgUmFuZ2VDb250ZXh0IGZyb20gJy4uLy4uL1JhbmdlQ29udGV4dCc7XG5pbXBvcnQgUGFuZWxCb2R5IGZyb20gJy4uL1BhbmVsQm9keSc7XG5leHBvcnQgdmFyIFlFQVJfQ09MX0NPVU5UID0gMztcbnZhciBZRUFSX1JPV19DT1VOVCA9IDQ7XG5mdW5jdGlvbiBZZWFyQm9keShwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgdmlld0RhdGUgPSBwcm9wcy52aWV3RGF0ZSxcbiAgICBsb2NhbGUgPSBwcm9wcy5sb2NhbGUsXG4gICAgZ2VuZXJhdGVDb25maWcgPSBwcm9wcy5nZW5lcmF0ZUNvbmZpZztcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChSYW5nZUNvbnRleHQpLFxuICAgIHJhbmdlZFZhbHVlID0gX1JlYWN0JHVzZUNvbnRleHQucmFuZ2VkVmFsdWUsXG4gICAgaG92ZXJSYW5nZWRWYWx1ZSA9IF9SZWFjdCR1c2VDb250ZXh0LmhvdmVyUmFuZ2VkVmFsdWU7XG4gIHZhciB5ZWFyUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jZWxsXCIpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFllYXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgeWVhck51bWJlciA9IGdlbmVyYXRlQ29uZmlnLmdldFllYXIodmlld0RhdGUpO1xuICB2YXIgc3RhcnRZZWFyID0gTWF0aC5mbG9vcih5ZWFyTnVtYmVyIC8gWUVBUl9ERUNBREVfQ09VTlQpICogWUVBUl9ERUNBREVfQ09VTlQ7XG4gIHZhciBlbmRZZWFyID0gc3RhcnRZZWFyICsgWUVBUl9ERUNBREVfQ09VTlQgLSAxO1xuICB2YXIgYmFzZVllYXIgPSBnZW5lcmF0ZUNvbmZpZy5zZXRZZWFyKHZpZXdEYXRlLCBzdGFydFllYXIgLSBNYXRoLmNlaWwoKFlFQVJfQ09MX0NPVU5UICogWUVBUl9ST1dfQ09VTlQgLSBZRUFSX0RFQ0FERV9DT1VOVCkgLyAyKSk7XG4gIHZhciBpc0luVmlldyA9IGZ1bmN0aW9uIGlzSW5WaWV3KGRhdGUpIHtcbiAgICB2YXIgY3VycmVudFllYXJOdW1iZXIgPSBnZW5lcmF0ZUNvbmZpZy5nZXRZZWFyKGRhdGUpO1xuICAgIHJldHVybiBzdGFydFllYXIgPD0gY3VycmVudFllYXJOdW1iZXIgJiYgY3VycmVudFllYXJOdW1iZXIgPD0gZW5kWWVhcjtcbiAgfTtcbiAgdmFyIGdldENlbGxDbGFzc05hbWUgPSB1c2VDZWxsQ2xhc3NOYW1lKHtcbiAgICBjZWxsUHJlZml4Q2xzOiB5ZWFyUHJlZml4Q2xzLFxuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBnZW5lcmF0ZUNvbmZpZzogZ2VuZXJhdGVDb25maWcsXG4gICAgcmFuZ2VkVmFsdWU6IHJhbmdlZFZhbHVlLFxuICAgIGhvdmVyUmFuZ2VkVmFsdWU6IGhvdmVyUmFuZ2VkVmFsdWUsXG4gICAgaXNTYW1lQ2VsbDogZnVuY3Rpb24gaXNTYW1lQ2VsbChjdXJyZW50LCB0YXJnZXQpIHtcbiAgICAgIHJldHVybiBpc1NhbWVZZWFyKGdlbmVyYXRlQ29uZmlnLCBjdXJyZW50LCB0YXJnZXQpO1xuICAgIH0sXG4gICAgaXNJblZpZXc6IGlzSW5WaWV3LFxuICAgIG9mZnNldENlbGw6IGZ1bmN0aW9uIG9mZnNldENlbGwoZGF0ZSwgb2Zmc2V0KSB7XG4gICAgICByZXR1cm4gZ2VuZXJhdGVDb25maWcuYWRkWWVhcihkYXRlLCBvZmZzZXQpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQYW5lbEJvZHksIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHJvd051bTogWUVBUl9ST1dfQ09VTlQsXG4gICAgY29sTnVtOiBZRUFSX0NPTF9DT1VOVCxcbiAgICBiYXNlRGF0ZTogYmFzZVllYXIsXG4gICAgZ2V0Q2VsbFRleHQ6IGdlbmVyYXRlQ29uZmlnLmdldFllYXIsXG4gICAgZ2V0Q2VsbENsYXNzTmFtZTogZ2V0Q2VsbENsYXNzTmFtZSxcbiAgICBnZXRDZWxsRGF0ZTogZ2VuZXJhdGVDb25maWcuYWRkWWVhcixcbiAgICB0aXRsZUNlbGw6IGZ1bmN0aW9uIHRpdGxlQ2VsbChkYXRlKSB7XG4gICAgICByZXR1cm4gZm9ybWF0VmFsdWUoZGF0ZSwge1xuICAgICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgICAgZm9ybWF0OiAnWVlZWScsXG4gICAgICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZ1xuICAgICAgfSk7XG4gICAgfVxuICB9KSk7XG59XG5leHBvcnQgZGVmYXVsdCBZZWFyQm9keTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBZZWFySGVhZGVyIGZyb20gJy4vWWVhckhlYWRlcic7XG5pbXBvcnQgWWVhckJvZHksIHsgWUVBUl9DT0xfQ09VTlQgfSBmcm9tICcuL1llYXJCb2R5JztcbmltcG9ydCB7IGNyZWF0ZUtleURvd25IYW5kbGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvdWlVdGlsJztcbmV4cG9ydCB2YXIgWUVBUl9ERUNBREVfQ09VTlQgPSAxMDtcbmZ1bmN0aW9uIFllYXJQYW5lbChwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIG9wZXJhdGlvblJlZiA9IHByb3BzLm9wZXJhdGlvblJlZixcbiAgICBvblZpZXdEYXRlQ2hhbmdlID0gcHJvcHMub25WaWV3RGF0ZUNoYW5nZSxcbiAgICBnZW5lcmF0ZUNvbmZpZyA9IHByb3BzLmdlbmVyYXRlQ29uZmlnLFxuICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgdmlld0RhdGUgPSBwcm9wcy52aWV3RGF0ZSxcbiAgICBzb3VyY2VNb2RlID0gcHJvcHMuc291cmNlTW9kZSxcbiAgICBfb25TZWxlY3QgPSBwcm9wcy5vblNlbGVjdCxcbiAgICBvblBhbmVsQ2hhbmdlID0gcHJvcHMub25QYW5lbENoYW5nZTtcbiAgdmFyIHBhbmVsUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi15ZWFyLXBhbmVsXCIpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBLZXlib2FyZCA9PT09PT09PT09PT09PT09PT09PT09PVxuICBvcGVyYXRpb25SZWYuY3VycmVudCA9IHtcbiAgICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihldmVudCkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUtleURvd25IYW5kbGVyKGV2ZW50LCB7XG4gICAgICAgIG9uTGVmdFJpZ2h0OiBmdW5jdGlvbiBvbkxlZnRSaWdodChkaWZmKSB7XG4gICAgICAgICAgX29uU2VsZWN0KGdlbmVyYXRlQ29uZmlnLmFkZFllYXIodmFsdWUgfHwgdmlld0RhdGUsIGRpZmYpLCAna2V5Jyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ3RybExlZnRSaWdodDogZnVuY3Rpb24gb25DdHJsTGVmdFJpZ2h0KGRpZmYpIHtcbiAgICAgICAgICBfb25TZWxlY3QoZ2VuZXJhdGVDb25maWcuYWRkWWVhcih2YWx1ZSB8fCB2aWV3RGF0ZSwgZGlmZiAqIFlFQVJfREVDQURFX0NPVU5UKSwgJ2tleScpO1xuICAgICAgICB9LFxuICAgICAgICBvblVwRG93bjogZnVuY3Rpb24gb25VcERvd24oZGlmZikge1xuICAgICAgICAgIF9vblNlbGVjdChnZW5lcmF0ZUNvbmZpZy5hZGRZZWFyKHZhbHVlIHx8IHZpZXdEYXRlLCBkaWZmICogWUVBUl9DT0xfQ09VTlQpLCAna2V5Jyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRW50ZXI6IGZ1bmN0aW9uIG9uRW50ZXIoKSB7XG4gICAgICAgICAgb25QYW5lbENoYW5nZShzb3VyY2VNb2RlID09PSAnZGF0ZScgPyAnZGF0ZScgOiAnbW9udGgnLCB2YWx1ZSB8fCB2aWV3RGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gVmlldyBPcGVyYXRpb24gPT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG9uRGVjYWRlQ2hhbmdlID0gZnVuY3Rpb24gb25EZWNhZGVDaGFuZ2UoZGlmZikge1xuICAgIHZhciBuZXdEYXRlID0gZ2VuZXJhdGVDb25maWcuYWRkWWVhcih2aWV3RGF0ZSwgZGlmZiAqIDEwKTtcbiAgICBvblZpZXdEYXRlQ2hhbmdlKG5ld0RhdGUpO1xuICAgIG9uUGFuZWxDaGFuZ2UobnVsbCwgbmV3RGF0ZSk7XG4gIH07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBwYW5lbFByZWZpeENsc1xuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChZZWFySGVhZGVyLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBvblByZXZEZWNhZGU6IGZ1bmN0aW9uIG9uUHJldkRlY2FkZSgpIHtcbiAgICAgIG9uRGVjYWRlQ2hhbmdlKC0xKTtcbiAgICB9LFxuICAgIG9uTmV4dERlY2FkZTogZnVuY3Rpb24gb25OZXh0RGVjYWRlKCkge1xuICAgICAgb25EZWNhZGVDaGFuZ2UoMSk7XG4gICAgfSxcbiAgICBvbkRlY2FkZUNsaWNrOiBmdW5jdGlvbiBvbkRlY2FkZUNsaWNrKCkge1xuICAgICAgb25QYW5lbENoYW5nZSgnZGVjYWRlJywgdmlld0RhdGUpO1xuICAgIH1cbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChZZWFyQm9keSwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgb25TZWxlY3Q6IGZ1bmN0aW9uIG9uU2VsZWN0KGRhdGUpIHtcbiAgICAgIG9uUGFuZWxDaGFuZ2Uoc291cmNlTW9kZSA9PT0gJ2RhdGUnID8gJ2RhdGUnIDogJ21vbnRoJywgZGF0ZSk7XG4gICAgICBfb25TZWxlY3QoZGF0ZSwgJ21vdXNlJyk7XG4gICAgfVxuICB9KSkpO1xufVxuZXhwb3J0IGRlZmF1bHQgWWVhclBhbmVsOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEV4dHJhRm9vdGVyKHByZWZpeENscywgbW9kZSwgcmVuZGVyRXh0cmFGb290ZXIpIHtcbiAgaWYgKCFyZW5kZXJFeHRyYUZvb3Rlcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWZvb3Rlci1leHRyYVwiKVxuICB9LCByZW5kZXJFeHRyYUZvb3Rlcihtb2RlKSk7XG59IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0UmFuZ2VzKF9yZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgIF9yZWYkcmFuZ2VMaXN0ID0gX3JlZi5yYW5nZUxpc3QsXG4gICAgcmFuZ2VMaXN0ID0gX3JlZiRyYW5nZUxpc3QgPT09IHZvaWQgMCA/IFtdIDogX3JlZiRyYW5nZUxpc3QsXG4gICAgX3JlZiRjb21wb25lbnRzID0gX3JlZi5jb21wb25lbnRzLFxuICAgIGNvbXBvbmVudHMgPSBfcmVmJGNvbXBvbmVudHMgPT09IHZvaWQgMCA/IHt9IDogX3JlZiRjb21wb25lbnRzLFxuICAgIG5lZWRDb25maXJtQnV0dG9uID0gX3JlZi5uZWVkQ29uZmlybUJ1dHRvbixcbiAgICBvbk5vdyA9IF9yZWYub25Ob3csXG4gICAgb25PayA9IF9yZWYub25PayxcbiAgICBva0Rpc2FibGVkID0gX3JlZi5va0Rpc2FibGVkLFxuICAgIHNob3dOb3cgPSBfcmVmLnNob3dOb3csXG4gICAgbG9jYWxlID0gX3JlZi5sb2NhbGU7XG4gIHZhciBwcmVzZXROb2RlO1xuICB2YXIgb2tOb2RlO1xuICBpZiAocmFuZ2VMaXN0Lmxlbmd0aCkge1xuICAgIHZhciBJdGVtID0gY29tcG9uZW50cy5yYW5nZUl0ZW0gfHwgJ3NwYW4nO1xuICAgIHByZXNldE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgcmFuZ2VMaXN0Lm1hcChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgIHZhciBsYWJlbCA9IF9yZWYyLmxhYmVsLFxuICAgICAgICBvbkNsaWNrID0gX3JlZjIub25DbGljayxcbiAgICAgICAgb25Nb3VzZUVudGVyID0gX3JlZjIub25Nb3VzZUVudGVyLFxuICAgICAgICBvbk1vdXNlTGVhdmUgPSBfcmVmMi5vbk1vdXNlTGVhdmU7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICAgIGtleTogbGFiZWwsXG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wcmVzZXRcIilcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEl0ZW0sIHtcbiAgICAgICAgb25DbGljazogb25DbGljayxcbiAgICAgICAgb25Nb3VzZUVudGVyOiBvbk1vdXNlRW50ZXIsXG4gICAgICAgIG9uTW91c2VMZWF2ZTogb25Nb3VzZUxlYXZlXG4gICAgICB9LCBsYWJlbCkpO1xuICAgIH0pKTtcbiAgfVxuICBpZiAobmVlZENvbmZpcm1CdXR0b24pIHtcbiAgICB2YXIgQnV0dG9uID0gY29tcG9uZW50cy5idXR0b24gfHwgJ2J1dHRvbic7XG4gICAgaWYgKG9uTm93ICYmICFwcmVzZXROb2RlICYmIHNob3dOb3cgIT09IGZhbHNlKSB7XG4gICAgICBwcmVzZXROb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ub3dcIilcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYVwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ub3ctYnRuXCIpLFxuICAgICAgICBvbkNsaWNrOiBvbk5vd1xuICAgICAgfSwgbG9jYWxlLm5vdykpO1xuICAgIH1cbiAgICBva05vZGUgPSBuZWVkQ29uZmlybUJ1dHRvbiAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1va1wiKVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEJ1dHRvbiwge1xuICAgICAgZGlzYWJsZWQ6IG9rRGlzYWJsZWQsXG4gICAgICBvbkNsaWNrOiBvbk9rXG4gICAgfSwgbG9jYWxlLm9rKSk7XG4gIH1cbiAgaWYgKCFwcmVzZXROb2RlICYmICFva05vZGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJhbmdlc1wiKVxuICB9LCBwcmVzZXROb2RlLCBva05vZGUpO1xufSIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbi8qKlxuICogTG9naWM6XG4gKiAgV2hlbiBgbW9kZWAgPT09IGBwaWNrZXJgLFxuICogIGNsaWNrIHdpbGwgdHJpZ2dlciBgb25TZWxlY3RgIChpZiB2YWx1ZSBjaGFuZ2VkIHRyaWdnZXIgYG9uQ2hhbmdlYCBhbHNvKS5cbiAqICBQYW5lbCBjaGFuZ2Ugd2lsbCBub3QgdHJpZ2dlciBgb25TZWxlY3RgIGJ1dCB0cmlnZ2VyIGBvblBhbmVsQ2hhbmdlYFxuICovXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBLZXlDb2RlIGZyb20gXCJyYy11dGlsL2VzL0tleUNvZGVcIjtcbmltcG9ydCB3YXJuaW5nIGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbmltcG9ydCB1c2VNZXJnZWRTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZXJnZWRTdGF0ZVwiO1xuaW1wb3J0IFRpbWVQYW5lbCBmcm9tICcuL3BhbmVscy9UaW1lUGFuZWwnO1xuaW1wb3J0IERhdGV0aW1lUGFuZWwgZnJvbSAnLi9wYW5lbHMvRGF0ZXRpbWVQYW5lbCc7XG5pbXBvcnQgRGF0ZVBhbmVsIGZyb20gJy4vcGFuZWxzL0RhdGVQYW5lbCc7XG5pbXBvcnQgV2Vla1BhbmVsIGZyb20gJy4vcGFuZWxzL1dlZWtQYW5lbCc7XG5pbXBvcnQgTW9udGhQYW5lbCBmcm9tICcuL3BhbmVscy9Nb250aFBhbmVsJztcbmltcG9ydCBRdWFydGVyUGFuZWwgZnJvbSAnLi9wYW5lbHMvUXVhcnRlclBhbmVsJztcbmltcG9ydCBZZWFyUGFuZWwgZnJvbSAnLi9wYW5lbHMvWWVhclBhbmVsJztcbmltcG9ydCBEZWNhZGVQYW5lbCBmcm9tICcuL3BhbmVscy9EZWNhZGVQYW5lbCc7XG5pbXBvcnQgeyBXRUVLX0RBWV9DT1VOVCwgaXNFcXVhbCB9IGZyb20gJy4vdXRpbHMvZGF0ZVV0aWwnO1xuaW1wb3J0IFBhbmVsQ29udGV4dCBmcm9tICcuL1BhbmVsQ29udGV4dCc7XG5pbXBvcnQgeyBQaWNrZXJNb2RlTWFwIH0gZnJvbSAnLi91dGlscy91aVV0aWwnO1xuaW1wb3J0IHsgTU9OVEhfQ09MX0NPVU5UIH0gZnJvbSAnLi9wYW5lbHMvTW9udGhQYW5lbC9Nb250aEJvZHknO1xuaW1wb3J0IFJhbmdlQ29udGV4dCBmcm9tICcuL1JhbmdlQ29udGV4dCc7XG5pbXBvcnQgZ2V0RXh0cmFGb290ZXIgZnJvbSAnLi91dGlscy9nZXRFeHRyYUZvb3Rlcic7XG5pbXBvcnQgZ2V0UmFuZ2VzIGZyb20gJy4vdXRpbHMvZ2V0UmFuZ2VzJztcbmltcG9ydCB7IGdldExvd2VyQm91bmRUaW1lLCBzZXREYXRlVGltZSwgc2V0VGltZSB9IGZyb20gJy4vdXRpbHMvdGltZVV0aWwnO1xuLy8gQ2FsZW5kYXIgcGlja2VyIHR5cGVcbnZhciBDQUxFTkRBUl9QQU5FTF9NT0RFID0gWydkYXRlJywgJ21vbnRoJ107XG5mdW5jdGlvbiBQaWNrZXJQYW5lbChwcm9wcykge1xuICB2YXIgX2NsYXNzTmFtZXM7XG4gIHZhciBfcHJvcHMkcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHByZWZpeENscyA9IF9wcm9wcyRwcmVmaXhDbHMgPT09IHZvaWQgMCA/ICdyYy1waWNrZXInIDogX3Byb3BzJHByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICBsb2NhbGUgPSBwcm9wcy5sb2NhbGUsXG4gICAgZ2VuZXJhdGVDb25maWcgPSBwcm9wcy5nZW5lcmF0ZUNvbmZpZyxcbiAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZSxcbiAgICBwaWNrZXJWYWx1ZSA9IHByb3BzLnBpY2tlclZhbHVlLFxuICAgIGRlZmF1bHRQaWNrZXJWYWx1ZSA9IHByb3BzLmRlZmF1bHRQaWNrZXJWYWx1ZSxcbiAgICBkaXNhYmxlZERhdGUgPSBwcm9wcy5kaXNhYmxlZERhdGUsXG4gICAgbW9kZSA9IHByb3BzLm1vZGUsXG4gICAgX3Byb3BzJHBpY2tlciA9IHByb3BzLnBpY2tlcixcbiAgICBwaWNrZXIgPSBfcHJvcHMkcGlja2VyID09PSB2b2lkIDAgPyAnZGF0ZScgOiBfcHJvcHMkcGlja2VyLFxuICAgIF9wcm9wcyR0YWJJbmRleCA9IHByb3BzLnRhYkluZGV4LFxuICAgIHRhYkluZGV4ID0gX3Byb3BzJHRhYkluZGV4ID09PSB2b2lkIDAgPyAwIDogX3Byb3BzJHRhYkluZGV4LFxuICAgIHNob3dOb3cgPSBwcm9wcy5zaG93Tm93LFxuICAgIHNob3dUaW1lID0gcHJvcHMuc2hvd1RpbWUsXG4gICAgc2hvd1RvZGF5ID0gcHJvcHMuc2hvd1RvZGF5LFxuICAgIHJlbmRlckV4dHJhRm9vdGVyID0gcHJvcHMucmVuZGVyRXh0cmFGb290ZXIsXG4gICAgaGlkZUhlYWRlciA9IHByb3BzLmhpZGVIZWFkZXIsXG4gICAgb25TZWxlY3QgPSBwcm9wcy5vblNlbGVjdCxcbiAgICBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLFxuICAgIG9uUGFuZWxDaGFuZ2UgPSBwcm9wcy5vblBhbmVsQ2hhbmdlLFxuICAgIG9uTW91c2VEb3duID0gcHJvcHMub25Nb3VzZURvd24sXG4gICAgb25QaWNrZXJWYWx1ZUNoYW5nZSA9IHByb3BzLm9uUGlja2VyVmFsdWVDaGFuZ2UsXG4gICAgX29uT2sgPSBwcm9wcy5vbk9rLFxuICAgIGNvbXBvbmVudHMgPSBwcm9wcy5jb21wb25lbnRzLFxuICAgIGRpcmVjdGlvbiA9IHByb3BzLmRpcmVjdGlvbixcbiAgICBfcHJvcHMkaG91clN0ZXAgPSBwcm9wcy5ob3VyU3RlcCxcbiAgICBob3VyU3RlcCA9IF9wcm9wcyRob3VyU3RlcCA9PT0gdm9pZCAwID8gMSA6IF9wcm9wcyRob3VyU3RlcCxcbiAgICBfcHJvcHMkbWludXRlU3RlcCA9IHByb3BzLm1pbnV0ZVN0ZXAsXG4gICAgbWludXRlU3RlcCA9IF9wcm9wcyRtaW51dGVTdGVwID09PSB2b2lkIDAgPyAxIDogX3Byb3BzJG1pbnV0ZVN0ZXAsXG4gICAgX3Byb3BzJHNlY29uZFN0ZXAgPSBwcm9wcy5zZWNvbmRTdGVwLFxuICAgIHNlY29uZFN0ZXAgPSBfcHJvcHMkc2Vjb25kU3RlcCA9PT0gdm9pZCAwID8gMSA6IF9wcm9wcyRzZWNvbmRTdGVwO1xuICB2YXIgbmVlZENvbmZpcm1CdXR0b24gPSBwaWNrZXIgPT09ICdkYXRlJyAmJiAhIXNob3dUaW1lIHx8IHBpY2tlciA9PT0gJ3RpbWUnO1xuICB2YXIgaXNIb3VyU3RlcFZhbGlkID0gMjQgJSBob3VyU3RlcCA9PT0gMDtcbiAgdmFyIGlzTWludXRlU3RlcFZhbGlkID0gNjAgJSBtaW51dGVTdGVwID09PSAwO1xuICB2YXIgaXNTZWNvbmRTdGVwVmFsaWQgPSA2MCAlIHNlY29uZFN0ZXAgPT09IDA7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgd2FybmluZyghdmFsdWUgfHwgZ2VuZXJhdGVDb25maWcuaXNWYWxpZGF0ZSh2YWx1ZSksICdJbnZhbGlkYXRlIGRhdGUgcGFzcyB0byBgdmFsdWVgLicpO1xuICAgIHdhcm5pbmcoIXZhbHVlIHx8IGdlbmVyYXRlQ29uZmlnLmlzVmFsaWRhdGUodmFsdWUpLCAnSW52YWxpZGF0ZSBkYXRlIHBhc3MgdG8gYGRlZmF1bHRWYWx1ZWAuJyk7XG4gICAgd2FybmluZyhpc0hvdXJTdGVwVmFsaWQsIFwiYGhvdXJTdGVwYCBcIi5jb25jYXQoaG91clN0ZXAsIFwiIGlzIGludmFsaWQuIEl0IHNob3VsZCBiZSBhIGZhY3RvciBvZiAyNC5cIikpO1xuICAgIHdhcm5pbmcoaXNNaW51dGVTdGVwVmFsaWQsIFwiYG1pbnV0ZVN0ZXBgIFwiLmNvbmNhdChtaW51dGVTdGVwLCBcIiBpcyBpbnZhbGlkLiBJdCBzaG91bGQgYmUgYSBmYWN0b3Igb2YgNjAuXCIpKTtcbiAgICB3YXJuaW5nKGlzU2Vjb25kU3RlcFZhbGlkLCBcImBzZWNvbmRTdGVwYCBcIi5jb25jYXQoc2Vjb25kU3RlcCwgXCIgaXMgaW52YWxpZC4gSXQgc2hvdWxkIGJlIGEgZmFjdG9yIG9mIDYwLlwiKSk7XG4gIH1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTdGF0ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgcGFuZWxDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChQYW5lbENvbnRleHQpO1xuICB2YXIgb3BlcmF0aW9uUmVmID0gcGFuZWxDb250ZXh0Lm9wZXJhdGlvblJlZixcbiAgICBwYW5lbERpdlJlZiA9IHBhbmVsQ29udGV4dC5wYW5lbFJlZixcbiAgICBvbkNvbnRleHRTZWxlY3QgPSBwYW5lbENvbnRleHQub25TZWxlY3QsXG4gICAgaGlkZVJhbmdlcyA9IHBhbmVsQ29udGV4dC5oaWRlUmFuZ2VzLFxuICAgIGRlZmF1bHRPcGVuVmFsdWUgPSBwYW5lbENvbnRleHQuZGVmYXVsdE9wZW5WYWx1ZTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChSYW5nZUNvbnRleHQpLFxuICAgIGluUmFuZ2UgPSBfUmVhY3QkdXNlQ29udGV4dC5pblJhbmdlLFxuICAgIHBhbmVsUG9zaXRpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5wYW5lbFBvc2l0aW9uLFxuICAgIHJhbmdlZFZhbHVlID0gX1JlYWN0JHVzZUNvbnRleHQucmFuZ2VkVmFsdWUsXG4gICAgaG92ZXJSYW5nZWRWYWx1ZSA9IF9SZWFjdCR1c2VDb250ZXh0LmhvdmVyUmFuZ2VkVmFsdWU7XG4gIHZhciBwYW5lbFJlZiA9IFJlYWN0LnVzZVJlZih7fSk7XG4gIC8vIEhhbmRsZSBpbml0IGxvZ2ljXG4gIHZhciBpbml0UmVmID0gUmVhY3QudXNlUmVmKHRydWUpO1xuICAvLyBWYWx1ZVxuICB2YXIgX3VzZU1lcmdlZFN0YXRlID0gdXNlTWVyZ2VkU3RhdGUobnVsbCwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0VmFsdWUsXG4gICAgICBwb3N0U3RhdGU6IGZ1bmN0aW9uIHBvc3RTdGF0ZSh2YWwpIHtcbiAgICAgICAgaWYgKCF2YWwgJiYgZGVmYXVsdE9wZW5WYWx1ZSAmJiBwaWNrZXIgPT09ICd0aW1lJykge1xuICAgICAgICAgIHJldHVybiBkZWZhdWx0T3BlblZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgICB9XG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZSwgMiksXG4gICAgbWVyZ2VkVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzBdLFxuICAgIHNldElubmVyVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzFdO1xuICAvLyBWaWV3IGRhdGUgY29udHJvbFxuICB2YXIgX3VzZU1lcmdlZFN0YXRlMyA9IHVzZU1lcmdlZFN0YXRlKG51bGwsIHtcbiAgICAgIHZhbHVlOiBwaWNrZXJWYWx1ZSxcbiAgICAgIGRlZmF1bHRWYWx1ZTogZGVmYXVsdFBpY2tlclZhbHVlIHx8IG1lcmdlZFZhbHVlLFxuICAgICAgcG9zdFN0YXRlOiBmdW5jdGlvbiBwb3N0U3RhdGUoZGF0ZSkge1xuICAgICAgICB2YXIgbm93ID0gZ2VuZXJhdGVDb25maWcuZ2V0Tm93KCk7XG4gICAgICAgIGlmICghZGF0ZSkge1xuICAgICAgICAgIHJldHVybiBub3c7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2hlbiB2YWx1ZSBpcyBudWxsIGFuZCBzZXQgc2hvd1RpbWVcbiAgICAgICAgaWYgKCFtZXJnZWRWYWx1ZSAmJiBzaG93VGltZSkge1xuICAgICAgICAgIHZhciBkZWZhdWx0RGF0ZU9iamVjdCA9IF90eXBlb2Yoc2hvd1RpbWUpID09PSAnb2JqZWN0JyA/IHNob3dUaW1lLmRlZmF1bHRWYWx1ZSA6IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICByZXR1cm4gc2V0RGF0ZVRpbWUoZ2VuZXJhdGVDb25maWcsIEFycmF5LmlzQXJyYXkoZGF0ZSkgPyBkYXRlWzBdIDogZGF0ZSwgZGVmYXVsdERhdGVPYmplY3QgfHwgbm93KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShkYXRlKSA/IGRhdGVbMF0gOiBkYXRlO1xuICAgICAgfVxuICAgIH0pLFxuICAgIF91c2VNZXJnZWRTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGUzLCAyKSxcbiAgICB2aWV3RGF0ZSA9IF91c2VNZXJnZWRTdGF0ZTRbMF0sXG4gICAgc2V0SW5uZXJWaWV3RGF0ZSA9IF91c2VNZXJnZWRTdGF0ZTRbMV07XG4gIHZhciBzZXRWaWV3RGF0ZSA9IGZ1bmN0aW9uIHNldFZpZXdEYXRlKGRhdGUpIHtcbiAgICBzZXRJbm5lclZpZXdEYXRlKGRhdGUpO1xuICAgIGlmIChvblBpY2tlclZhbHVlQ2hhbmdlKSB7XG4gICAgICBvblBpY2tlclZhbHVlQ2hhbmdlKGRhdGUpO1xuICAgIH1cbiAgfTtcbiAgLy8gUGFuZWwgY29udHJvbFxuICB2YXIgZ2V0SW50ZXJuYWxOZXh0TW9kZSA9IGZ1bmN0aW9uIGdldEludGVybmFsTmV4dE1vZGUobmV4dE1vZGUpIHtcbiAgICB2YXIgZ2V0TmV4dE1vZGUgPSBQaWNrZXJNb2RlTWFwW3BpY2tlcl07XG4gICAgaWYgKGdldE5leHRNb2RlKSB7XG4gICAgICByZXR1cm4gZ2V0TmV4dE1vZGUobmV4dE1vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gbmV4dE1vZGU7XG4gIH07XG4gIC8vIFNhdmUgcGFuZWwgaXMgY2hhbmdlZCBmcm9tIHdoaWNoIHBhbmVsXG4gIHZhciBfdXNlTWVyZ2VkU3RhdGU1ID0gdXNlTWVyZ2VkU3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHBpY2tlciA9PT0gJ3RpbWUnKSB7XG4gICAgICAgIHJldHVybiAndGltZSc7XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2V0SW50ZXJuYWxOZXh0TW9kZSgnZGF0ZScpO1xuICAgIH0sIHtcbiAgICAgIHZhbHVlOiBtb2RlXG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlNiA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZTUsIDIpLFxuICAgIG1lcmdlZE1vZGUgPSBfdXNlTWVyZ2VkU3RhdGU2WzBdLFxuICAgIHNldElubmVyTW9kZSA9IF91c2VNZXJnZWRTdGF0ZTZbMV07XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc2V0SW5uZXJNb2RlKHBpY2tlcik7XG4gIH0sIFtwaWNrZXJdKTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBtZXJnZWRNb2RlO1xuICAgIH0pLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIHNvdXJjZU1vZGUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldFNvdXJjZU1vZGUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIgb25JbnRlcm5hbFBhbmVsQ2hhbmdlID0gZnVuY3Rpb24gb25JbnRlcm5hbFBhbmVsQ2hhbmdlKG5ld01vZGUsIHZpZXdWYWx1ZSkge1xuICAgIHZhciBuZXh0TW9kZSA9IGdldEludGVybmFsTmV4dE1vZGUobmV3TW9kZSB8fCBtZXJnZWRNb2RlKTtcbiAgICBzZXRTb3VyY2VNb2RlKG1lcmdlZE1vZGUpO1xuICAgIHNldElubmVyTW9kZShuZXh0TW9kZSk7XG4gICAgaWYgKG9uUGFuZWxDaGFuZ2UgJiYgKG1lcmdlZE1vZGUgIT09IG5leHRNb2RlIHx8IGlzRXF1YWwoZ2VuZXJhdGVDb25maWcsIHZpZXdEYXRlLCB2aWV3RGF0ZSkpKSB7XG4gICAgICBvblBhbmVsQ2hhbmdlKHZpZXdWYWx1ZSwgbmV4dE1vZGUpO1xuICAgIH1cbiAgfTtcbiAgdmFyIHRyaWdnZXJTZWxlY3QgPSBmdW5jdGlvbiB0cmlnZ2VyU2VsZWN0KGRhdGUsIHR5cGUpIHtcbiAgICB2YXIgZm9yY2VUcmlnZ2VyU2VsZWN0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICBpZiAobWVyZ2VkTW9kZSA9PT0gcGlja2VyIHx8IGZvcmNlVHJpZ2dlclNlbGVjdCkge1xuICAgICAgc2V0SW5uZXJWYWx1ZShkYXRlKTtcbiAgICAgIGlmIChvblNlbGVjdCkge1xuICAgICAgICBvblNlbGVjdChkYXRlKTtcbiAgICAgIH1cbiAgICAgIGlmIChvbkNvbnRleHRTZWxlY3QpIHtcbiAgICAgICAgb25Db250ZXh0U2VsZWN0KGRhdGUsIHR5cGUpO1xuICAgICAgfVxuICAgICAgaWYgKG9uQ2hhbmdlICYmICFpc0VxdWFsKGdlbmVyYXRlQ29uZmlnLCBkYXRlLCBtZXJnZWRWYWx1ZSkgJiYgIShkaXNhYmxlZERhdGUgPT09IG51bGwgfHwgZGlzYWJsZWREYXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkaXNhYmxlZERhdGUoZGF0ZSkpKSB7XG4gICAgICAgIG9uQ2hhbmdlKGRhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgdmFyIGlzU2VsZWN0YWJsZSA9IGZ1bmN0aW9uIGlzU2VsZWN0YWJsZShrZXkpIHtcbiAgICBpZiAoQ0FMRU5EQVJfUEFORUxfTU9ERS5pbmNsdWRlcyhtZXJnZWRNb2RlKSkge1xuICAgICAgdmFyIGRhdGU7XG4gICAgICB2YXIgb3BlcmF0aW9uRm5jO1xuICAgICAgdmFyIGlzRGF0ZU1vZGUgPSBtZXJnZWRNb2RlID09PSAnZGF0ZSc7XG4gICAgICBpZiAoa2V5ID09PSBLZXlDb2RlLlBBR0VfVVAgfHwga2V5ID09PSBLZXlDb2RlLlBBR0VfRE9XTikge1xuICAgICAgICBvcGVyYXRpb25GbmMgPSBpc0RhdGVNb2RlID8gZ2VuZXJhdGVDb25maWcuYWRkTW9udGggOiBnZW5lcmF0ZUNvbmZpZy5hZGRZZWFyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3BlcmF0aW9uRm5jID0gaXNEYXRlTW9kZSA/IGdlbmVyYXRlQ29uZmlnLmFkZERhdGUgOiBnZW5lcmF0ZUNvbmZpZy5hZGRNb250aDtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgS2V5Q29kZS5MRUZUOlxuICAgICAgICBjYXNlIEtleUNvZGUuUEFHRV9VUDpcbiAgICAgICAgICBkYXRlID0gb3BlcmF0aW9uRm5jKHZpZXdEYXRlLCAtMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgS2V5Q29kZS5SSUdIVDpcbiAgICAgICAgY2FzZSBLZXlDb2RlLlBBR0VfRE9XTjpcbiAgICAgICAgICBkYXRlID0gb3BlcmF0aW9uRm5jKHZpZXdEYXRlLCAxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBLZXlDb2RlLlVQOlxuICAgICAgICBjYXNlIEtleUNvZGUuRE9XTjpcbiAgICAgICAgICBkYXRlID0gb3BlcmF0aW9uRm5jKHZpZXdEYXRlLCBOdW1iZXIoXCJcIi5jb25jYXQoa2V5ID09PSBLZXlDb2RlLlVQID8gJy0nIDogJycpLmNvbmNhdChpc0RhdGVNb2RlID8gV0VFS19EQVlfQ09VTlQgOiBNT05USF9DT0xfQ09VTlQpKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoZGF0ZSkge1xuICAgICAgICByZXR1cm4gIShkaXNhYmxlZERhdGUgPT09IG51bGwgfHwgZGlzYWJsZWREYXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkaXNhYmxlZERhdGUoZGF0ZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBJbnRlcmFjdGl2ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb25JbnRlcm5hbEtleURvd24gPSBmdW5jdGlvbiBvbkludGVybmFsS2V5RG93bihlKSB7XG4gICAgaWYgKHBhbmVsUmVmLmN1cnJlbnQgJiYgcGFuZWxSZWYuY3VycmVudC5vbktleURvd24pIHtcbiAgICAgIHZhciBzZWxlY3RhYmxlID0gdHJ1ZTtcbiAgICAgIHZhciB3aGljaCA9IGUud2hpY2g7XG4gICAgICBpZiAoW0tleUNvZGUuTEVGVCwgS2V5Q29kZS5SSUdIVCwgS2V5Q29kZS5VUCwgS2V5Q29kZS5ET1dOLCBLZXlDb2RlLlBBR0VfVVAsIEtleUNvZGUuUEFHRV9ET1dOLCBLZXlDb2RlLkVOVEVSXS5pbmNsdWRlcyh3aGljaCkpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAod2hpY2ggIT09IEtleUNvZGUuRU5URVIgJiYgdGFiSW5kZXggPT09IDApIHtcbiAgICAgICAgICBzZWxlY3RhYmxlID0gaXNTZWxlY3RhYmxlKHdoaWNoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gQ2Fubm90IHVzZSBrZXlib2FyZCB0byBzZWxlY3QgZGlzYWJsZWQgZGF0ZVxuICAgICAgaWYgKHNlbGVjdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIHBhbmVsUmVmLmN1cnJlbnQub25LZXlEb3duKGUpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWxvbmUtYmxvY2tzICovXG4gICAge1xuICAgICAgd2FybmluZyhmYWxzZSwgJ1BhbmVsIG5vdCBjb3JyZWN0IGhhbmRsZSBrZXlEb3duIGV2ZW50LiBQbGVhc2UgaGVscCB0byBmaXJlIGlzc3VlIGFib3V0IHRoaXMuJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qIGVzbGludC1lbmFibGUgbm8tbG9uZS1ibG9ja3MgKi9cbiAgfTtcblxuICB2YXIgb25JbnRlcm5hbEJsdXIgPSBmdW5jdGlvbiBvbkludGVybmFsQmx1cihlKSB7XG4gICAgaWYgKHBhbmVsUmVmLmN1cnJlbnQgJiYgcGFuZWxSZWYuY3VycmVudC5vbkJsdXIpIHtcbiAgICAgIHBhbmVsUmVmLmN1cnJlbnQub25CbHVyKGUpO1xuICAgIH1cbiAgfTtcbiAgaWYgKG9wZXJhdGlvblJlZiAmJiBwYW5lbFBvc2l0aW9uICE9PSAncmlnaHQnKSB7XG4gICAgb3BlcmF0aW9uUmVmLmN1cnJlbnQgPSB7XG4gICAgICBvbktleURvd246IG9uSW50ZXJuYWxLZXlEb3duLFxuICAgICAgb25DbG9zZTogZnVuY3Rpb24gb25DbG9zZSgpIHtcbiAgICAgICAgaWYgKHBhbmVsUmVmLmN1cnJlbnQgJiYgcGFuZWxSZWYuY3VycmVudC5vbkNsb3NlKSB7XG4gICAgICAgICAgcGFuZWxSZWYuY3VycmVudC5vbkNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRWZmZWN0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodmFsdWUgJiYgIWluaXRSZWYuY3VycmVudCkge1xuICAgICAgc2V0SW5uZXJWaWV3RGF0ZSh2YWx1ZSk7XG4gICAgfVxuICB9LCBbdmFsdWVdKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpbml0UmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgfSwgW10pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFBhbmVscyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBwYW5lbE5vZGU7XG4gIHZhciBwaWNrZXJQcm9wcyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIG9wZXJhdGlvblJlZjogcGFuZWxSZWYsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgdmlld0RhdGU6IHZpZXdEYXRlLFxuICAgIHZhbHVlOiBtZXJnZWRWYWx1ZSxcbiAgICBvblZpZXdEYXRlQ2hhbmdlOiBzZXRWaWV3RGF0ZSxcbiAgICBzb3VyY2VNb2RlOiBzb3VyY2VNb2RlLFxuICAgIG9uUGFuZWxDaGFuZ2U6IG9uSW50ZXJuYWxQYW5lbENoYW5nZSxcbiAgICBkaXNhYmxlZERhdGU6IGRpc2FibGVkRGF0ZVxuICB9KTtcbiAgZGVsZXRlIHBpY2tlclByb3BzLm9uQ2hhbmdlO1xuICBkZWxldGUgcGlja2VyUHJvcHMub25TZWxlY3Q7XG4gIHN3aXRjaCAobWVyZ2VkTW9kZSkge1xuICAgIGNhc2UgJ2RlY2FkZSc6XG4gICAgICBwYW5lbE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEZWNhZGVQYW5lbCwgX2V4dGVuZHMoe30sIHBpY2tlclByb3BzLCB7XG4gICAgICAgIG9uU2VsZWN0OiBmdW5jdGlvbiBvblNlbGVjdChkYXRlLCB0eXBlKSB7XG4gICAgICAgICAgc2V0Vmlld0RhdGUoZGF0ZSk7XG4gICAgICAgICAgdHJpZ2dlclNlbGVjdChkYXRlLCB0eXBlKTtcbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAneWVhcic6XG4gICAgICBwYW5lbE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChZZWFyUGFuZWwsIF9leHRlbmRzKHt9LCBwaWNrZXJQcm9wcywge1xuICAgICAgICBvblNlbGVjdDogZnVuY3Rpb24gb25TZWxlY3QoZGF0ZSwgdHlwZSkge1xuICAgICAgICAgIHNldFZpZXdEYXRlKGRhdGUpO1xuICAgICAgICAgIHRyaWdnZXJTZWxlY3QoZGF0ZSwgdHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgIHBhbmVsTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE1vbnRoUGFuZWwsIF9leHRlbmRzKHt9LCBwaWNrZXJQcm9wcywge1xuICAgICAgICBvblNlbGVjdDogZnVuY3Rpb24gb25TZWxlY3QoZGF0ZSwgdHlwZSkge1xuICAgICAgICAgIHNldFZpZXdEYXRlKGRhdGUpO1xuICAgICAgICAgIHRyaWdnZXJTZWxlY3QoZGF0ZSwgdHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgcGFuZWxOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUXVhcnRlclBhbmVsLCBfZXh0ZW5kcyh7fSwgcGlja2VyUHJvcHMsIHtcbiAgICAgICAgb25TZWxlY3Q6IGZ1bmN0aW9uIG9uU2VsZWN0KGRhdGUsIHR5cGUpIHtcbiAgICAgICAgICBzZXRWaWV3RGF0ZShkYXRlKTtcbiAgICAgICAgICB0cmlnZ2VyU2VsZWN0KGRhdGUsIHR5cGUpO1xuICAgICAgICB9XG4gICAgICB9KSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd3ZWVrJzpcbiAgICAgIHBhbmVsTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFdlZWtQYW5lbCwgX2V4dGVuZHMoe30sIHBpY2tlclByb3BzLCB7XG4gICAgICAgIG9uU2VsZWN0OiBmdW5jdGlvbiBvblNlbGVjdChkYXRlLCB0eXBlKSB7XG4gICAgICAgICAgc2V0Vmlld0RhdGUoZGF0ZSk7XG4gICAgICAgICAgdHJpZ2dlclNlbGVjdChkYXRlLCB0eXBlKTtcbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndGltZSc6XG4gICAgICBkZWxldGUgcGlja2VyUHJvcHMuc2hvd1RpbWU7XG4gICAgICBwYW5lbE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUaW1lUGFuZWwsIF9leHRlbmRzKHt9LCBwaWNrZXJQcm9wcywgX3R5cGVvZihzaG93VGltZSkgPT09ICdvYmplY3QnID8gc2hvd1RpbWUgOiBudWxsLCB7XG4gICAgICAgIG9uU2VsZWN0OiBmdW5jdGlvbiBvblNlbGVjdChkYXRlLCB0eXBlKSB7XG4gICAgICAgICAgc2V0Vmlld0RhdGUoZGF0ZSk7XG4gICAgICAgICAgdHJpZ2dlclNlbGVjdChkYXRlLCB0eXBlKTtcbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmIChzaG93VGltZSkge1xuICAgICAgICBwYW5lbE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEYXRldGltZVBhbmVsLCBfZXh0ZW5kcyh7fSwgcGlja2VyUHJvcHMsIHtcbiAgICAgICAgICBvblNlbGVjdDogZnVuY3Rpb24gb25TZWxlY3QoZGF0ZSwgdHlwZSkge1xuICAgICAgICAgICAgc2V0Vmlld0RhdGUoZGF0ZSk7XG4gICAgICAgICAgICB0cmlnZ2VyU2VsZWN0KGRhdGUsIHR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFuZWxOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRGF0ZVBhbmVsLCBfZXh0ZW5kcyh7fSwgcGlja2VyUHJvcHMsIHtcbiAgICAgICAgICBvblNlbGVjdDogZnVuY3Rpb24gb25TZWxlY3QoZGF0ZSwgdHlwZSkge1xuICAgICAgICAgICAgc2V0Vmlld0RhdGUoZGF0ZSk7XG4gICAgICAgICAgICB0cmlnZ2VyU2VsZWN0KGRhdGUsIHR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgICAgfVxuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRm9vdGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGV4dHJhRm9vdGVyO1xuICB2YXIgcmFuZ2VzTm9kZTtcbiAgdmFyIG9uTm93ID0gZnVuY3Rpb24gb25Ob3coKSB7XG4gICAgdmFyIG5vdyA9IGdlbmVyYXRlQ29uZmlnLmdldE5vdygpO1xuICAgIHZhciBsb3dlckJvdW5kVGltZSA9IGdldExvd2VyQm91bmRUaW1lKGdlbmVyYXRlQ29uZmlnLmdldEhvdXIobm93KSwgZ2VuZXJhdGVDb25maWcuZ2V0TWludXRlKG5vdyksIGdlbmVyYXRlQ29uZmlnLmdldFNlY29uZChub3cpLCBpc0hvdXJTdGVwVmFsaWQgPyBob3VyU3RlcCA6IDEsIGlzTWludXRlU3RlcFZhbGlkID8gbWludXRlU3RlcCA6IDEsIGlzU2Vjb25kU3RlcFZhbGlkID8gc2Vjb25kU3RlcCA6IDEpO1xuICAgIHZhciBhZGp1c3RlZE5vdyA9IHNldFRpbWUoZ2VuZXJhdGVDb25maWcsIG5vdywgbG93ZXJCb3VuZFRpbWVbMF0sXG4gICAgLy8gaG91clxuICAgIGxvd2VyQm91bmRUaW1lWzFdLFxuICAgIC8vIG1pbnV0ZVxuICAgIGxvd2VyQm91bmRUaW1lWzJdKTtcbiAgICB0cmlnZ2VyU2VsZWN0KGFkanVzdGVkTm93LCAnc3VibWl0Jyk7XG4gIH07XG4gIGlmICghaGlkZVJhbmdlcykge1xuICAgIGV4dHJhRm9vdGVyID0gZ2V0RXh0cmFGb290ZXIocHJlZml4Q2xzLCBtZXJnZWRNb2RlLCByZW5kZXJFeHRyYUZvb3Rlcik7XG4gICAgcmFuZ2VzTm9kZSA9IGdldFJhbmdlcyh7XG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIGNvbXBvbmVudHM6IGNvbXBvbmVudHMsXG4gICAgICBuZWVkQ29uZmlybUJ1dHRvbjogbmVlZENvbmZpcm1CdXR0b24sXG4gICAgICBva0Rpc2FibGVkOiAhbWVyZ2VkVmFsdWUgfHwgZGlzYWJsZWREYXRlICYmIGRpc2FibGVkRGF0ZShtZXJnZWRWYWx1ZSksXG4gICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgIHNob3dOb3c6IHNob3dOb3csXG4gICAgICBvbk5vdzogbmVlZENvbmZpcm1CdXR0b24gJiYgb25Ob3csXG4gICAgICBvbk9rOiBmdW5jdGlvbiBvbk9rKCkge1xuICAgICAgICBpZiAobWVyZ2VkVmFsdWUpIHtcbiAgICAgICAgICB0cmlnZ2VyU2VsZWN0KG1lcmdlZFZhbHVlLCAnc3VibWl0JywgdHJ1ZSk7XG4gICAgICAgICAgaWYgKF9vbk9rKSB7XG4gICAgICAgICAgICBfb25PayhtZXJnZWRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgdmFyIHRvZGF5Tm9kZTtcbiAgaWYgKHNob3dUb2RheSAmJiBtZXJnZWRNb2RlID09PSAnZGF0ZScgJiYgcGlja2VyID09PSAnZGF0ZScgJiYgIXNob3dUaW1lKSB7XG4gICAgdmFyIG5vdyA9IGdlbmVyYXRlQ29uZmlnLmdldE5vdygpO1xuICAgIHZhciB0b2RheUNscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdG9kYXktYnRuXCIpO1xuICAgIHZhciBkaXNhYmxlZCA9IGRpc2FibGVkRGF0ZSAmJiBkaXNhYmxlZERhdGUobm93KTtcbiAgICB0b2RheU5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImFcIiwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKHRvZGF5Q2xzLCBkaXNhYmxlZCAmJiBcIlwiLmNvbmNhdCh0b2RheUNscywgXCItZGlzYWJsZWRcIikpLFxuICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IGRpc2FibGVkLFxuICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgICAgIHRyaWdnZXJTZWxlY3Qobm93LCAnbW91c2UnLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIGxvY2FsZS50b2RheSk7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBhbmVsQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHBhbmVsQ29udGV4dCksIHt9LCB7XG4gICAgICBtb2RlOiBtZXJnZWRNb2RlLFxuICAgICAgaGlkZUhlYWRlcjogJ2hpZGVIZWFkZXInIGluIHByb3BzID8gaGlkZUhlYWRlciA6IHBhbmVsQ29udGV4dC5oaWRlSGVhZGVyLFxuICAgICAgaGlkZVByZXZCdG46IGluUmFuZ2UgJiYgcGFuZWxQb3NpdGlvbiA9PT0gJ3JpZ2h0JyxcbiAgICAgIGhpZGVOZXh0QnRuOiBpblJhbmdlICYmIHBhbmVsUG9zaXRpb24gPT09ICdsZWZ0J1xuICAgIH0pXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICB0YWJJbmRleDogdGFiSW5kZXgsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGFuZWxcIiksIGNsYXNzTmFtZSwgKF9jbGFzc05hbWVzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wYW5lbC1oYXMtcmFuZ2VcIiksIHJhbmdlZFZhbHVlICYmIHJhbmdlZFZhbHVlWzBdICYmIHJhbmdlZFZhbHVlWzFdKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBhbmVsLWhhcy1yYW5nZS1ob3ZlclwiKSwgaG92ZXJSYW5nZWRWYWx1ZSAmJiBob3ZlclJhbmdlZFZhbHVlWzBdICYmIGhvdmVyUmFuZ2VkVmFsdWVbMV0pLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGFuZWwtcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX2NsYXNzTmFtZXMpKSxcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgb25LZXlEb3duOiBvbkludGVybmFsS2V5RG93bixcbiAgICBvbkJsdXI6IG9uSW50ZXJuYWxCbHVyLFxuICAgIG9uTW91c2VEb3duOiBvbk1vdXNlRG93bixcbiAgICByZWY6IHBhbmVsRGl2UmVmXG4gIH0sIHBhbmVsTm9kZSwgZXh0cmFGb290ZXIgfHwgcmFuZ2VzTm9kZSB8fCB0b2RheU5vZGUgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWZvb3RlclwiKVxuICB9LCBleHRyYUZvb3RlciwgcmFuZ2VzTm9kZSwgdG9kYXlOb2RlKSA6IG51bGwpKTtcbn1cbmV4cG9ydCBkZWZhdWx0IFBpY2tlclBhbmVsO1xuLyogZXNsaW50LWVuYWJsZSAqLyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBUcmlnZ2VyIGZyb20gJ3JjLXRyaWdnZXInO1xudmFyIEJVSUxUX0lOX1BMQUNFTUVOVFMgPSB7XG4gIGJvdHRvbUxlZnQ6IHtcbiAgICBwb2ludHM6IFsndGwnLCAnYmwnXSxcbiAgICBvZmZzZXQ6IFswLCA0XSxcbiAgICBvdmVyZmxvdzoge1xuICAgICAgYWRqdXN0WDogMSxcbiAgICAgIGFkanVzdFk6IDFcbiAgICB9XG4gIH0sXG4gIGJvdHRvbVJpZ2h0OiB7XG4gICAgcG9pbnRzOiBbJ3RyJywgJ2JyJ10sXG4gICAgb2Zmc2V0OiBbMCwgNF0sXG4gICAgb3ZlcmZsb3c6IHtcbiAgICAgIGFkanVzdFg6IDEsXG4gICAgICBhZGp1c3RZOiAxXG4gICAgfVxuICB9LFxuICB0b3BMZWZ0OiB7XG4gICAgcG9pbnRzOiBbJ2JsJywgJ3RsJ10sXG4gICAgb2Zmc2V0OiBbMCwgLTRdLFxuICAgIG92ZXJmbG93OiB7XG4gICAgICBhZGp1c3RYOiAwLFxuICAgICAgYWRqdXN0WTogMVxuICAgIH1cbiAgfSxcbiAgdG9wUmlnaHQ6IHtcbiAgICBwb2ludHM6IFsnYnInLCAndHInXSxcbiAgICBvZmZzZXQ6IFswLCAtNF0sXG4gICAgb3ZlcmZsb3c6IHtcbiAgICAgIGFkanVzdFg6IDAsXG4gICAgICBhZGp1c3RZOiAxXG4gICAgfVxuICB9XG59O1xuZnVuY3Rpb24gUGlja2VyVHJpZ2dlcihfcmVmKSB7XG4gIHZhciBfY2xhc3NOYW1lcztcbiAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgIHBvcHVwRWxlbWVudCA9IF9yZWYucG9wdXBFbGVtZW50LFxuICAgIHBvcHVwU3R5bGUgPSBfcmVmLnBvcHVwU3R5bGUsXG4gICAgdmlzaWJsZSA9IF9yZWYudmlzaWJsZSxcbiAgICBkcm9wZG93bkNsYXNzTmFtZSA9IF9yZWYuZHJvcGRvd25DbGFzc05hbWUsXG4gICAgZHJvcGRvd25BbGlnbiA9IF9yZWYuZHJvcGRvd25BbGlnbixcbiAgICB0cmFuc2l0aW9uTmFtZSA9IF9yZWYudHJhbnNpdGlvbk5hbWUsXG4gICAgZ2V0UG9wdXBDb250YWluZXIgPSBfcmVmLmdldFBvcHVwQ29udGFpbmVyLFxuICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICByYW5nZSA9IF9yZWYucmFuZ2UsXG4gICAgcG9wdXBQbGFjZW1lbnQgPSBfcmVmLnBvcHVwUGxhY2VtZW50LFxuICAgIGRpcmVjdGlvbiA9IF9yZWYuZGlyZWN0aW9uO1xuICB2YXIgZHJvcGRvd25QcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRyb3Bkb3duXCIpO1xuICB2YXIgZ2V0UG9wdXBQbGFjZW1lbnQgPSBmdW5jdGlvbiBnZXRQb3B1cFBsYWNlbWVudCgpIHtcbiAgICBpZiAocG9wdXBQbGFjZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHBvcHVwUGxhY2VtZW50O1xuICAgIH1cbiAgICByZXR1cm4gZGlyZWN0aW9uID09PSAncnRsJyA/ICdib3R0b21SaWdodCcgOiAnYm90dG9tTGVmdCc7XG4gIH07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmlnZ2VyLCB7XG4gICAgc2hvd0FjdGlvbjogW10sXG4gICAgaGlkZUFjdGlvbjogW10sXG4gICAgcG9wdXBQbGFjZW1lbnQ6IGdldFBvcHVwUGxhY2VtZW50KCksXG4gICAgYnVpbHRpblBsYWNlbWVudHM6IEJVSUxUX0lOX1BMQUNFTUVOVFMsXG4gICAgcHJlZml4Q2xzOiBkcm9wZG93blByZWZpeENscyxcbiAgICBwb3B1cFRyYW5zaXRpb25OYW1lOiB0cmFuc2l0aW9uTmFtZSxcbiAgICBwb3B1cDogcG9wdXBFbGVtZW50LFxuICAgIHBvcHVwQWxpZ246IGRyb3Bkb3duQWxpZ24sXG4gICAgcG9wdXBWaXNpYmxlOiB2aXNpYmxlLFxuICAgIHBvcHVwQ2xhc3NOYW1lOiBjbGFzc05hbWVzKGRyb3Bkb3duQ2xhc3NOYW1lLCAoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChkcm9wZG93blByZWZpeENscywgXCItcmFuZ2VcIiksIHJhbmdlKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChkcm9wZG93blByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX2NsYXNzTmFtZXMpKSxcbiAgICBwb3B1cFN0eWxlOiBwb3B1cFN0eWxlLFxuICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lclxuICB9LCBjaGlsZHJlbik7XG59XG5leHBvcnQgZGVmYXVsdCBQaWNrZXJUcmlnZ2VyOyIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IHsgdXNlU3RhdGUsIHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IEtleUNvZGUgZnJvbSBcInJjLXV0aWwvZXMvS2V5Q29kZVwiO1xuaW1wb3J0IHsgYWRkR2xvYmFsTW91c2VEb3duRXZlbnQsIGdldFRhcmdldEZyb21FdmVudCB9IGZyb20gJy4uL3V0aWxzL3VpVXRpbCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VQaWNrZXJJbnB1dChfcmVmKSB7XG4gIHZhciBvcGVuID0gX3JlZi5vcGVuLFxuICAgIHZhbHVlID0gX3JlZi52YWx1ZSxcbiAgICBpc0NsaWNrT3V0c2lkZSA9IF9yZWYuaXNDbGlja091dHNpZGUsXG4gICAgdHJpZ2dlck9wZW4gPSBfcmVmLnRyaWdnZXJPcGVuLFxuICAgIGZvcndhcmRLZXlEb3duID0gX3JlZi5mb3J3YXJkS2V5RG93bixcbiAgICBfb25LZXlEb3duID0gX3JlZi5vbktleURvd24sXG4gICAgYmx1clRvQ2FuY2VsID0gX3JlZi5ibHVyVG9DYW5jZWwsXG4gICAgb25TdWJtaXQgPSBfcmVmLm9uU3VibWl0LFxuICAgIG9uQ2FuY2VsID0gX3JlZi5vbkNhbmNlbCxcbiAgICBfb25Gb2N1cyA9IF9yZWYub25Gb2N1cyxcbiAgICBfb25CbHVyID0gX3JlZi5vbkJsdXIsXG4gICAgY3VycmVudEZvY3VzZWRLZXkgPSBfcmVmLmN1cnJlbnRGb2N1c2VkS2V5LFxuICAgIF9yZWYka2V5ID0gX3JlZi5rZXksXG4gICAga2V5ID0gX3JlZiRrZXkgPT09IHZvaWQgMCA/ICdzdGFydCcgOiBfcmVmJGtleTtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKGZhbHNlKSxcbiAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICB0eXBpbmcgPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldFR5cGluZyA9IF91c2VTdGF0ZTJbMV07XG4gIHZhciBfdXNlU3RhdGUzID0gdXNlU3RhdGUoZmFsc2UpLFxuICAgIF91c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUzLCAyKSxcbiAgICBmb2N1c2VkID0gX3VzZVN0YXRlNFswXSxcbiAgICBzZXRGb2N1c2VkID0gX3VzZVN0YXRlNFsxXTtcbiAgdmFyIGRlbGF5Qmx1clRpbWVyID0gdXNlUmVmKCk7XG4gIC8qKlxuICAgKiBXZSB3aWxsIHByZXZlbnQgYmx1ciB0byBoYW5kbGUgb3BlbiBldmVudCB3aGVuIHVzZXIgY2xpY2sgb3V0c2lkZSxcbiAgICogc2luY2UgdGhpcyB3aWxsIHJlcGVhdCB0cmlnZ2VyIGBvbk9wZW5DaGFuZ2VgIGV2ZW50LlxuICAgKi9cbiAgdmFyIHByZXZlbnRCbHVyUmVmID0gdXNlUmVmKGZhbHNlKTtcbiAgdmFyIHZhbHVlQ2hhbmdlZFJlZiA9IHVzZVJlZihmYWxzZSk7XG4gIHZhciBwcmV2ZW50RGVmYXVsdFJlZiA9IHVzZVJlZihmYWxzZSk7XG4gIHZhciBpbnB1dFByb3BzID0ge1xuICAgIG9uTW91c2VEb3duOiBmdW5jdGlvbiBvbk1vdXNlRG93bigpIHtcbiAgICAgIHNldFR5cGluZyh0cnVlKTtcbiAgICAgIHRyaWdnZXJPcGVuKHRydWUpO1xuICAgIH0sXG4gICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oZSkge1xuICAgICAgdmFyIHByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24gcHJldmVudERlZmF1bHQoKSB7XG4gICAgICAgIHByZXZlbnREZWZhdWx0UmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgfTtcbiAgICAgIF9vbktleURvd24oZSwgcHJldmVudERlZmF1bHQpO1xuICAgICAgaWYgKHByZXZlbnREZWZhdWx0UmVmLmN1cnJlbnQpIHJldHVybjtcbiAgICAgIHN3aXRjaCAoZS53aGljaCkge1xuICAgICAgICBjYXNlIEtleUNvZGUuRU5URVI6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKCFvcGVuKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJPcGVuKHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvblN1Ym1pdCgpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICBzZXRUeXBpbmcodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlIEtleUNvZGUuVEFCOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICh0eXBpbmcgJiYgb3BlbiAmJiAhZS5zaGlmdEtleSkge1xuICAgICAgICAgICAgICBzZXRUeXBpbmcoZmFsc2UpO1xuICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0eXBpbmcgJiYgb3Blbikge1xuICAgICAgICAgICAgICBpZiAoIWZvcndhcmRLZXlEb3duKGUpICYmIGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICBzZXRUeXBpbmcodHJ1ZSk7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlIEtleUNvZGUuRVNDOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNldFR5cGluZyh0cnVlKTtcbiAgICAgICAgICAgIG9uQ2FuY2VsKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFvcGVuICYmICFbS2V5Q29kZS5TSElGVF0uaW5jbHVkZXMoZS53aGljaCkpIHtcbiAgICAgICAgdHJpZ2dlck9wZW4odHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKCF0eXBpbmcpIHtcbiAgICAgICAgLy8gTGV0IHBvcHVwIHBhbmVsIGhhbmRsZSBrZXlib2FyZFxuICAgICAgICBmb3J3YXJkS2V5RG93bihlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uRm9jdXM6IGZ1bmN0aW9uIG9uRm9jdXMoZSkge1xuICAgICAgc2V0VHlwaW5nKHRydWUpO1xuICAgICAgc2V0Rm9jdXNlZCh0cnVlKTtcbiAgICAgIGlmIChjdXJyZW50Rm9jdXNlZEtleSkge1xuICAgICAgICBjdXJyZW50Rm9jdXNlZEtleS5jdXJyZW50ID0ga2V5O1xuICAgICAgfVxuICAgICAgY2xlYXJUaW1lb3V0KGRlbGF5Qmx1clRpbWVyLmN1cnJlbnQpO1xuICAgICAgaWYgKF9vbkZvY3VzKSB7XG4gICAgICAgIF9vbkZvY3VzKGUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgb25CbHVyOiBmdW5jdGlvbiBvbkJsdXIoZSkge1xuICAgICAgaWYgKHByZXZlbnRCbHVyUmVmLmN1cnJlbnQgfHwgIWlzQ2xpY2tPdXRzaWRlKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgIHByZXZlbnRCbHVyUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGJsdXJUb0NhbmNlbCkge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgX2RvY3VtZW50ID0gZG9jdW1lbnQsXG4gICAgICAgICAgICBhY3RpdmVFbGVtZW50ID0gX2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgd2hpbGUgKGFjdGl2ZUVsZW1lbnQgJiYgYWN0aXZlRWxlbWVudC5zaGFkb3dSb290KSB7XG4gICAgICAgICAgICBhY3RpdmVFbGVtZW50ID0gYWN0aXZlRWxlbWVudC5zaGFkb3dSb290LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc0NsaWNrT3V0c2lkZShhY3RpdmVFbGVtZW50KSkge1xuICAgICAgICAgICAgb25DYW5jZWwoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDApO1xuICAgICAgfSBlbHNlIGlmIChvcGVuKSB7XG4gICAgICAgIHRyaWdnZXJPcGVuKGZhbHNlKTtcbiAgICAgICAgaWYgKHZhbHVlQ2hhbmdlZFJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgb25TdWJtaXQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2V0Rm9jdXNlZChmYWxzZSk7XG4gICAgICBpZiAoY3VycmVudEZvY3VzZWRLZXkpIHtcbiAgICAgICAgY3VycmVudEZvY3VzZWRLZXkuY3VycmVudCA9ICcnO1xuICAgICAgICAvLyBEZWxheSB0byBwcmV2ZW50ICdyYW5nZScgZm9jdXMgdHJhbnNpdGlvbnMgZnJvbSBmaXJpbmcgcmVzdWx0aW5nIGluIGluY29ycmVjdCBvdXQtb2YtZm9jdXMgZXZlbnRzXG4gICAgICAgIGRlbGF5Qmx1clRpbWVyLmN1cnJlbnQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBQcmV2ZW50IHRoZSAnYmx1cicgZXZlbnQgZnJvbSBmaXJpbmcgd2hlbiB0aGVyZSBpcyBjdXJyZW50bHkgYSBmb2N1c2VkIGlucHV0XG4gICAgICAgICAgaWYgKGN1cnJlbnRGb2N1c2VkS2V5LmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgX29uQmx1ciA9PT0gbnVsbCB8fCBfb25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb25CbHVyKGUpO1xuICAgICAgICB9LCAxMDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX29uQmx1ciA9PT0gbnVsbCB8fCBfb25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb25CbHVyKGUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgLy8gY2hlY2sgaWYgdmFsdWUgY2hhbmdlZFxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhbHVlQ2hhbmdlZFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gIH0sIFtvcGVuXSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFsdWVDaGFuZ2VkUmVmLmN1cnJlbnQgPSB0cnVlO1xuICB9LCBbdmFsdWVdKTtcbiAgLy8gR2xvYmFsIGNsaWNrIGhhbmRsZXJcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gYWRkR2xvYmFsTW91c2VEb3duRXZlbnQoZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBnZXRUYXJnZXRGcm9tRXZlbnQoZSk7XG4gICAgICB2YXIgY2xpY2tlZE91dHNpZGUgPSBpc0NsaWNrT3V0c2lkZSh0YXJnZXQpO1xuICAgICAgaWYgKG9wZW4pIHtcbiAgICAgICAgaWYgKCFjbGlja2VkT3V0c2lkZSkge1xuICAgICAgICAgIHByZXZlbnRCbHVyUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICAgIC8vIEFsd2F5cyBzZXQgYmFjayBpbiBjYXNlIGBvbkJsdXJgIHByZXZlbnRlZCBieSB1c2VyXG4gICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHByZXZlbnRCbHVyUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICghZm9jdXNlZCB8fCBjbGlja2VkT3V0c2lkZSkge1xuICAgICAgICAgIHRyaWdnZXJPcGVuKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChmb2N1c2VkICYmICFjbGlja2VkT3V0c2lkZSkge1xuICAgICAgICBwcmV2ZW50Qmx1clJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjbGVhclRpbWVvdXQoZGVsYXlCbHVyVGltZXIuY3VycmVudCk7XG4gICAgfTtcbiAgfSwgW10pO1xuICByZXR1cm4gW2lucHV0UHJvcHMsIHtcbiAgICBmb2N1c2VkOiBmb2N1c2VkLFxuICAgIHR5cGluZzogdHlwaW5nXG4gIH1dO1xufSIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlVGV4dFZhbHVlTWFwcGluZyhfcmVmKSB7XG4gIHZhciB2YWx1ZVRleHRzID0gX3JlZi52YWx1ZVRleHRzLFxuICAgIG9uVGV4dENoYW5nZSA9IF9yZWYub25UZXh0Q2hhbmdlO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoJycpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIHRleHQgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldElubmVyVGV4dCA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciB2YWx1ZVRleHRzUmVmID0gUmVhY3QudXNlUmVmKFtdKTtcbiAgdmFsdWVUZXh0c1JlZi5jdXJyZW50ID0gdmFsdWVUZXh0cztcbiAgZnVuY3Rpb24gdHJpZ2dlclRleHRDaGFuZ2UodmFsdWUpIHtcbiAgICBzZXRJbm5lclRleHQodmFsdWUpO1xuICAgIG9uVGV4dENoYW5nZSh2YWx1ZSk7XG4gIH1cbiAgZnVuY3Rpb24gcmVzZXRUZXh0KCkge1xuICAgIHNldElubmVyVGV4dCh2YWx1ZVRleHRzUmVmLmN1cnJlbnRbMF0pO1xuICB9XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHZhbHVlVGV4dHMuZXZlcnkoZnVuY3Rpb24gKHZhbFRleHQpIHtcbiAgICAgIHJldHVybiB2YWxUZXh0ICE9PSB0ZXh0O1xuICAgIH0pKSB7XG4gICAgICByZXNldFRleHQoKTtcbiAgICB9XG4gIH0sIFt2YWx1ZVRleHRzLmpvaW4oJ3x8JyldKTtcbiAgcmV0dXJuIFt0ZXh0LCB0cmlnZ2VyVGV4dENoYW5nZSwgcmVzZXRUZXh0XTtcbn0iLCIvL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNoYWxsb3dFcXVhbChvYmpBLCBvYmpCLCBjb21wYXJlLCBjb21wYXJlQ29udGV4dCkge1xuICB2YXIgcmV0ID0gY29tcGFyZSA/IGNvbXBhcmUuY2FsbChjb21wYXJlQ29udGV4dCwgb2JqQSwgb2JqQikgOiB2b2lkIDA7XG5cbiAgaWYgKHJldCAhPT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuICEhcmV0O1xuICB9XG5cbiAgaWYgKG9iakEgPT09IG9iakIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqQSAhPT0gXCJvYmplY3RcIiB8fCAhb2JqQSB8fCB0eXBlb2Ygb2JqQiAhPT0gXCJvYmplY3RcIiB8fCAhb2JqQikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpO1xuICB2YXIga2V5c0IgPSBPYmplY3Qua2V5cyhvYmpCKTtcblxuICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgYkhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5iaW5kKG9iakIpO1xuXG4gIC8vIFRlc3QgZm9yIEEncyBrZXlzIGRpZmZlcmVudCBmcm9tIEIuXG4gIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGtleXNBLmxlbmd0aDsgaWR4KyspIHtcbiAgICB2YXIga2V5ID0ga2V5c0FbaWR4XTtcblxuICAgIGlmICghYkhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgdmFsdWVBID0gb2JqQVtrZXldO1xuICAgIHZhciB2YWx1ZUIgPSBvYmpCW2tleV07XG5cbiAgICByZXQgPSBjb21wYXJlID8gY29tcGFyZS5jYWxsKGNvbXBhcmVDb250ZXh0LCB2YWx1ZUEsIHZhbHVlQiwga2V5KSA6IHZvaWQgMDtcblxuICAgIGlmIChyZXQgPT09IGZhbHNlIHx8IChyZXQgPT09IHZvaWQgMCAmJiB2YWx1ZUEgIT09IHZhbHVlQikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCJpbXBvcnQgc2hhbGxvd0VxdWFsIGZyb20gJ3NoYWxsb3dlcXVhbCc7XG5pbXBvcnQgdXNlTWVtbyBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZW1vXCI7XG5pbXBvcnQgeyBmb3JtYXRWYWx1ZSB9IGZyb20gJy4uL3V0aWxzL2RhdGVVdGlsJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVZhbHVlVGV4dHModmFsdWUsIF9yZWYpIHtcbiAgdmFyIGZvcm1hdExpc3QgPSBfcmVmLmZvcm1hdExpc3QsXG4gICAgZ2VuZXJhdGVDb25maWcgPSBfcmVmLmdlbmVyYXRlQ29uZmlnLFxuICAgIGxvY2FsZSA9IF9yZWYubG9jYWxlO1xuICByZXR1cm4gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIFtbJyddLCAnJ107XG4gICAgfVxuICAgIC8vIFdlIHdpbGwgY29udmVydCBkYXRhIGZvcm1hdCBiYWNrIHRvIGZpcnN0IGZvcm1hdFxuICAgIHZhciBmaXJzdFZhbHVlVGV4dCA9ICcnO1xuICAgIHZhciBmdWxsVmFsdWVUZXh0cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm9ybWF0TGlzdC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgdmFyIGZvcm1hdCA9IGZvcm1hdExpc3RbaV07XG4gICAgICB2YXIgZm9ybWF0U3RyID0gZm9ybWF0VmFsdWUodmFsdWUsIHtcbiAgICAgICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnLFxuICAgICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgICAgZm9ybWF0OiBmb3JtYXRcbiAgICAgIH0pO1xuICAgICAgZnVsbFZhbHVlVGV4dHMucHVzaChmb3JtYXRTdHIpO1xuICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgZmlyc3RWYWx1ZVRleHQgPSBmb3JtYXRTdHI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbZnVsbFZhbHVlVGV4dHMsIGZpcnN0VmFsdWVUZXh0XTtcbiAgfSwgW3ZhbHVlLCBmb3JtYXRMaXN0XSwgZnVuY3Rpb24gKHByZXYsIG5leHQpIHtcbiAgICByZXR1cm4gcHJldlswXSAhPT0gbmV4dFswXSB8fCAhc2hhbGxvd0VxdWFsKHByZXZbMV0sIG5leHRbMV0pO1xuICB9KTtcbn0iLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCB7IHVzZVN0YXRlLCB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VWYWx1ZVRleHRzIGZyb20gJy4vdXNlVmFsdWVUZXh0cyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VIb3ZlclZhbHVlKHZhbHVlVGV4dCwgX3JlZikge1xuICB2YXIgZm9ybWF0TGlzdCA9IF9yZWYuZm9ybWF0TGlzdCxcbiAgICBnZW5lcmF0ZUNvbmZpZyA9IF9yZWYuZ2VuZXJhdGVDb25maWcsXG4gICAgbG9jYWxlID0gX3JlZi5sb2NhbGU7XG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShudWxsKSxcbiAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICB2YWx1ZSA9IF91c2VTdGF0ZTJbMF0sXG4gICAgaW50ZXJuYWxTZXRWYWx1ZSA9IF91c2VTdGF0ZTJbMV07XG4gIHZhciByYWYgPSB1c2VSZWYobnVsbCk7XG4gIGZ1bmN0aW9uIHNldFZhbHVlKHZhbCkge1xuICAgIHZhciBpbW1lZGlhdGVseSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmLmN1cnJlbnQpO1xuICAgIGlmIChpbW1lZGlhdGVseSkge1xuICAgICAgaW50ZXJuYWxTZXRWYWx1ZSh2YWwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByYWYuY3VycmVudCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICBpbnRlcm5hbFNldFZhbHVlKHZhbCk7XG4gICAgfSk7XG4gIH1cbiAgdmFyIF91c2VWYWx1ZVRleHRzID0gdXNlVmFsdWVUZXh0cyh2YWx1ZSwge1xuICAgICAgZm9ybWF0TGlzdDogZm9ybWF0TGlzdCxcbiAgICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZyxcbiAgICAgIGxvY2FsZTogbG9jYWxlXG4gICAgfSksXG4gICAgX3VzZVZhbHVlVGV4dHMyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVZhbHVlVGV4dHMsIDIpLFxuICAgIGZpcnN0VGV4dCA9IF91c2VWYWx1ZVRleHRzMlsxXTtcbiAgZnVuY3Rpb24gb25FbnRlcihkYXRlKSB7XG4gICAgc2V0VmFsdWUoZGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gb25MZWF2ZSgpIHtcbiAgICB2YXIgaW1tZWRpYXRlbHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuICAgIHNldFZhbHVlKG51bGwsIGltbWVkaWF0ZWx5KTtcbiAgfVxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIG9uTGVhdmUodHJ1ZSk7XG4gIH0sIFt2YWx1ZVRleHRdKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZi5jdXJyZW50KTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiBbZmlyc3RUZXh0LCBvbkVudGVyLCBvbkxlYXZlXTtcbn0iLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX2NyZWF0ZVN1cGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlclwiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuLyoqXG4gKiBSZW1vdmVkOlxuICogIC0gZ2V0Q2FsZW5kYXJDb250YWluZXI6IHVzZSBgZ2V0UG9wdXBDb250YWluZXJgIGluc3RlYWRcbiAqICAtIG9uT2tcbiAqXG4gKiBOZXcgRmVhdHVyZTpcbiAqICAtIHBpY2tlclxuICogIC0gYWxsb3dFbXB0eVxuICogIC0gc2VsZWN0YWJsZVxuICpcbiAqIFRpcHM6IFNob3VsZCBhZGQgZmFxIGFib3V0IGBkYXRldGltZWAgbW9kZSB3aXRoIGBkZWZhdWx0VmFsdWVgXG4gKi9cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0IHVzZU1lcmdlZFN0YXRlIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lcmdlZFN0YXRlXCI7XG5pbXBvcnQgUGlja2VyUGFuZWwgZnJvbSAnLi9QaWNrZXJQYW5lbCc7XG5pbXBvcnQgUGlja2VyVHJpZ2dlciBmcm9tICcuL1BpY2tlclRyaWdnZXInO1xuaW1wb3J0IHsgZm9ybWF0VmFsdWUsIGlzRXF1YWwsIHBhcnNlVmFsdWUgfSBmcm9tICcuL3V0aWxzL2RhdGVVdGlsJztcbmltcG9ydCBnZXREYXRhT3JBcmlhUHJvcHMsIHsgdG9BcnJheSB9IGZyb20gJy4vdXRpbHMvbWlzY1V0aWwnO1xuaW1wb3J0IFBhbmVsQ29udGV4dCBmcm9tICcuL1BhbmVsQ29udGV4dCc7XG5pbXBvcnQgeyBnZXREZWZhdWx0Rm9ybWF0LCBnZXRJbnB1dFNpemUsIGVsZW1lbnRzQ29udGFpbnMgfSBmcm9tICcuL3V0aWxzL3VpVXRpbCc7XG5pbXBvcnQgdXNlUGlja2VySW5wdXQgZnJvbSAnLi9ob29rcy91c2VQaWNrZXJJbnB1dCc7XG5pbXBvcnQgdXNlVGV4dFZhbHVlTWFwcGluZyBmcm9tICcuL2hvb2tzL3VzZVRleHRWYWx1ZU1hcHBpbmcnO1xuaW1wb3J0IHVzZVZhbHVlVGV4dHMgZnJvbSAnLi9ob29rcy91c2VWYWx1ZVRleHRzJztcbmltcG9ydCB1c2VIb3ZlclZhbHVlIGZyb20gJy4vaG9va3MvdXNlSG92ZXJWYWx1ZSc7XG5pbXBvcnQgeyBsZWdhY3lQcm9wc1dhcm5pbmcgfSBmcm9tICcuL3V0aWxzL3dhcm5VdGlsJztcbmZ1bmN0aW9uIElubmVyUGlja2VyKHByb3BzKSB7XG4gIHZhciBfY2xhc3NOYW1lczI7XG4gIHZhciBfcHJvcHMkcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHByZWZpeENscyA9IF9wcm9wcyRwcmVmaXhDbHMgPT09IHZvaWQgMCA/ICdyYy1waWNrZXInIDogX3Byb3BzJHByZWZpeENscyxcbiAgICBpZCA9IHByb3BzLmlkLFxuICAgIHRhYkluZGV4ID0gcHJvcHMudGFiSW5kZXgsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgZHJvcGRvd25DbGFzc05hbWUgPSBwcm9wcy5kcm9wZG93bkNsYXNzTmFtZSxcbiAgICBkcm9wZG93bkFsaWduID0gcHJvcHMuZHJvcGRvd25BbGlnbixcbiAgICBwb3B1cFN0eWxlID0gcHJvcHMucG9wdXBTdHlsZSxcbiAgICB0cmFuc2l0aW9uTmFtZSA9IHByb3BzLnRyYW5zaXRpb25OYW1lLFxuICAgIGdlbmVyYXRlQ29uZmlnID0gcHJvcHMuZ2VuZXJhdGVDb25maWcsXG4gICAgbG9jYWxlID0gcHJvcHMubG9jYWxlLFxuICAgIGlucHV0UmVhZE9ubHkgPSBwcm9wcy5pbnB1dFJlYWRPbmx5LFxuICAgIGFsbG93Q2xlYXIgPSBwcm9wcy5hbGxvd0NsZWFyLFxuICAgIGF1dG9Gb2N1cyA9IHByb3BzLmF1dG9Gb2N1cyxcbiAgICBzaG93VGltZSA9IHByb3BzLnNob3dUaW1lLFxuICAgIF9wcm9wcyRwaWNrZXIgPSBwcm9wcy5waWNrZXIsXG4gICAgcGlja2VyID0gX3Byb3BzJHBpY2tlciA9PT0gdm9pZCAwID8gJ2RhdGUnIDogX3Byb3BzJHBpY2tlcixcbiAgICBmb3JtYXQgPSBwcm9wcy5mb3JtYXQsXG4gICAgdXNlMTJIb3VycyA9IHByb3BzLnVzZTEySG91cnMsXG4gICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICBkZWZhdWx0VmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWUsXG4gICAgb3BlbiA9IHByb3BzLm9wZW4sXG4gICAgZGVmYXVsdE9wZW4gPSBwcm9wcy5kZWZhdWx0T3BlbixcbiAgICBkZWZhdWx0T3BlblZhbHVlID0gcHJvcHMuZGVmYXVsdE9wZW5WYWx1ZSxcbiAgICBzdWZmaXhJY29uID0gcHJvcHMuc3VmZml4SWNvbixcbiAgICBjbGVhckljb24gPSBwcm9wcy5jbGVhckljb24sXG4gICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICBkaXNhYmxlZERhdGUgPSBwcm9wcy5kaXNhYmxlZERhdGUsXG4gICAgcGxhY2Vob2xkZXIgPSBwcm9wcy5wbGFjZWhvbGRlcixcbiAgICBnZXRQb3B1cENvbnRhaW5lciA9IHByb3BzLmdldFBvcHVwQ29udGFpbmVyLFxuICAgIHBpY2tlclJlZiA9IHByb3BzLnBpY2tlclJlZixcbiAgICBwYW5lbFJlbmRlciA9IHByb3BzLnBhbmVsUmVuZGVyLFxuICAgIG9uQ2hhbmdlID0gcHJvcHMub25DaGFuZ2UsXG4gICAgb25PcGVuQ2hhbmdlID0gcHJvcHMub25PcGVuQ2hhbmdlLFxuICAgIG9uRm9jdXMgPSBwcm9wcy5vbkZvY3VzLFxuICAgIG9uQmx1ciA9IHByb3BzLm9uQmx1cixcbiAgICBvbk1vdXNlRG93biA9IHByb3BzLm9uTW91c2VEb3duLFxuICAgIG9uTW91c2VVcCA9IHByb3BzLm9uTW91c2VVcCxcbiAgICBvbk1vdXNlRW50ZXIgPSBwcm9wcy5vbk1vdXNlRW50ZXIsXG4gICAgb25Nb3VzZUxlYXZlID0gcHJvcHMub25Nb3VzZUxlYXZlLFxuICAgIG9uQ29udGV4dE1lbnUgPSBwcm9wcy5vbkNvbnRleHRNZW51LFxuICAgIG9uQ2xpY2sgPSBwcm9wcy5vbkNsaWNrLFxuICAgIF9vbktleURvd24gPSBwcm9wcy5vbktleURvd24sXG4gICAgX29uU2VsZWN0ID0gcHJvcHMub25TZWxlY3QsXG4gICAgZGlyZWN0aW9uID0gcHJvcHMuZGlyZWN0aW9uLFxuICAgIF9wcm9wcyRhdXRvQ29tcGxldGUgPSBwcm9wcy5hdXRvQ29tcGxldGUsXG4gICAgYXV0b0NvbXBsZXRlID0gX3Byb3BzJGF1dG9Db21wbGV0ZSA9PT0gdm9pZCAwID8gJ29mZicgOiBfcHJvcHMkYXV0b0NvbXBsZXRlLFxuICAgIGlucHV0UmVuZGVyID0gcHJvcHMuaW5wdXRSZW5kZXI7XG4gIHZhciBpbnB1dFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIG5lZWRDb25maXJtQnV0dG9uID0gcGlja2VyID09PSAnZGF0ZScgJiYgISFzaG93VGltZSB8fCBwaWNrZXIgPT09ICd0aW1lJztcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBXYXJuaW5nID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBsZWdhY3lQcm9wc1dhcm5pbmcocHJvcHMpO1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFN0YXRlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBmb3JtYXRMaXN0ID0gdG9BcnJheShnZXREZWZhdWx0Rm9ybWF0KGZvcm1hdCwgcGlja2VyLCBzaG93VGltZSwgdXNlMTJIb3VycykpO1xuICAvLyBQYW5lbCByZWZcbiAgdmFyIHBhbmVsRGl2UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB2YXIgaW5wdXREaXZSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBjb250YWluZXJSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIC8vIFJlYWwgdmFsdWVcbiAgdmFyIF91c2VNZXJnZWRTdGF0ZSA9IHVzZU1lcmdlZFN0YXRlKG51bGwsIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGRlZmF1bHRWYWx1ZTogZGVmYXVsdFZhbHVlXG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZSwgMiksXG4gICAgbWVyZ2VkVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzBdLFxuICAgIHNldElubmVyVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzFdO1xuICAvLyBTZWxlY3RlZCB2YWx1ZVxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUobWVyZ2VkVmFsdWUpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIHNlbGVjdGVkVmFsdWUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldFNlbGVjdGVkVmFsdWUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICAvLyBPcGVyYXRpb24gcmVmXG4gIHZhciBvcGVyYXRpb25SZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIC8vIE9wZW5cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZTMgPSB1c2VNZXJnZWRTdGF0ZShmYWxzZSwge1xuICAgICAgdmFsdWU6IG9wZW4sXG4gICAgICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRPcGVuLFxuICAgICAgcG9zdFN0YXRlOiBmdW5jdGlvbiBwb3N0U3RhdGUocG9zdE9wZW4pIHtcbiAgICAgICAgcmV0dXJuIGRpc2FibGVkID8gZmFsc2UgOiBwb3N0T3BlbjtcbiAgICAgIH0sXG4gICAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UobmV3T3Blbikge1xuICAgICAgICBpZiAob25PcGVuQ2hhbmdlKSB7XG4gICAgICAgICAgb25PcGVuQ2hhbmdlKG5ld09wZW4pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbmV3T3BlbiAmJiBvcGVyYXRpb25SZWYuY3VycmVudCAmJiBvcGVyYXRpb25SZWYuY3VycmVudC5vbkNsb3NlKSB7XG4gICAgICAgICAgb3BlcmF0aW9uUmVmLmN1cnJlbnQub25DbG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZTMsIDIpLFxuICAgIG1lcmdlZE9wZW4gPSBfdXNlTWVyZ2VkU3RhdGU0WzBdLFxuICAgIHRyaWdnZXJJbm5lck9wZW4gPSBfdXNlTWVyZ2VkU3RhdGU0WzFdO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBUZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZVZhbHVlVGV4dHMgPSB1c2VWYWx1ZVRleHRzKHNlbGVjdGVkVmFsdWUsIHtcbiAgICAgIGZvcm1hdExpc3Q6IGZvcm1hdExpc3QsXG4gICAgICBnZW5lcmF0ZUNvbmZpZzogZ2VuZXJhdGVDb25maWcsXG4gICAgICBsb2NhbGU6IGxvY2FsZVxuICAgIH0pLFxuICAgIF91c2VWYWx1ZVRleHRzMiA9IF9zbGljZWRUb0FycmF5KF91c2VWYWx1ZVRleHRzLCAyKSxcbiAgICB2YWx1ZVRleHRzID0gX3VzZVZhbHVlVGV4dHMyWzBdLFxuICAgIGZpcnN0VmFsdWVUZXh0ID0gX3VzZVZhbHVlVGV4dHMyWzFdO1xuICB2YXIgX3VzZVRleHRWYWx1ZU1hcHBpbmcgPSB1c2VUZXh0VmFsdWVNYXBwaW5nKHtcbiAgICAgIHZhbHVlVGV4dHM6IHZhbHVlVGV4dHMsXG4gICAgICBvblRleHRDaGFuZ2U6IGZ1bmN0aW9uIG9uVGV4dENoYW5nZShuZXdUZXh0KSB7XG4gICAgICAgIHZhciBpbnB1dERhdGUgPSBwYXJzZVZhbHVlKG5ld1RleHQsIHtcbiAgICAgICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgICAgICBmb3JtYXRMaXN0OiBmb3JtYXRMaXN0LFxuICAgICAgICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZ1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGlucHV0RGF0ZSAmJiAoIWRpc2FibGVkRGF0ZSB8fCAhZGlzYWJsZWREYXRlKGlucHV0RGF0ZSkpKSB7XG4gICAgICAgICAgc2V0U2VsZWN0ZWRWYWx1ZShpbnB1dERhdGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSksXG4gICAgX3VzZVRleHRWYWx1ZU1hcHBpbmcyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVRleHRWYWx1ZU1hcHBpbmcsIDMpLFxuICAgIHRleHQgPSBfdXNlVGV4dFZhbHVlTWFwcGluZzJbMF0sXG4gICAgdHJpZ2dlclRleHRDaGFuZ2UgPSBfdXNlVGV4dFZhbHVlTWFwcGluZzJbMV0sXG4gICAgcmVzZXRUZXh0ID0gX3VzZVRleHRWYWx1ZU1hcHBpbmcyWzJdO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFRyaWdnZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgdHJpZ2dlckNoYW5nZSA9IGZ1bmN0aW9uIHRyaWdnZXJDaGFuZ2UobmV3VmFsdWUpIHtcbiAgICBzZXRTZWxlY3RlZFZhbHVlKG5ld1ZhbHVlKTtcbiAgICBzZXRJbm5lclZhbHVlKG5ld1ZhbHVlKTtcbiAgICBpZiAob25DaGFuZ2UgJiYgIWlzRXF1YWwoZ2VuZXJhdGVDb25maWcsIG1lcmdlZFZhbHVlLCBuZXdWYWx1ZSkpIHtcbiAgICAgIG9uQ2hhbmdlKG5ld1ZhbHVlLCBuZXdWYWx1ZSA/IGZvcm1hdFZhbHVlKG5ld1ZhbHVlLCB7XG4gICAgICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZyxcbiAgICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICAgIGZvcm1hdDogZm9ybWF0TGlzdFswXVxuICAgICAgfSkgOiAnJyk7XG4gICAgfVxuICB9O1xuICB2YXIgdHJpZ2dlck9wZW4gPSBmdW5jdGlvbiB0cmlnZ2VyT3BlbihuZXdPcGVuKSB7XG4gICAgaWYgKGRpc2FibGVkICYmIG5ld09wZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJpZ2dlcklubmVyT3BlbihuZXdPcGVuKTtcbiAgfTtcbiAgdmFyIGZvcndhcmRLZXlEb3duID0gZnVuY3Rpb24gZm9yd2FyZEtleURvd24oZSkge1xuICAgIGlmIChtZXJnZWRPcGVuICYmIG9wZXJhdGlvblJlZi5jdXJyZW50ICYmIG9wZXJhdGlvblJlZi5jdXJyZW50Lm9uS2V5RG93bikge1xuICAgICAgLy8gTGV0IHBvcHVwIHBhbmVsIGhhbmRsZSBrZXlib2FyZFxuICAgICAgcmV0dXJuIG9wZXJhdGlvblJlZi5jdXJyZW50Lm9uS2V5RG93bihlKTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1sb25lLWJsb2NrcyAqL1xuICAgIHtcbiAgICAgIHdhcm5pbmcoZmFsc2UsICdQaWNrZXIgbm90IGNvcnJlY3QgZm9yd2FyZCBLZXlEb3duIG9wZXJhdGlvbi4gUGxlYXNlIGhlbHAgdG8gZmlyZSBpc3N1ZSBhYm91dCB0aGlzLicpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgdmFyIG9uSW50ZXJuYWxDbGljayA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxDbGljaygpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuICAgIG9uQ2xpY2sgPT09IG51bGwgfHwgb25DbGljayA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DbGljay5hcHBseSh2b2lkIDAsIGFyZ3MpO1xuICAgIGlmIChpbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICBpbnB1dFJlZi5jdXJyZW50LmZvY3VzKCk7XG4gICAgICB0cmlnZ2VyT3Blbih0cnVlKTtcbiAgICB9XG4gIH07XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IElucHV0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfdXNlUGlja2VySW5wdXQgPSB1c2VQaWNrZXJJbnB1dCh7XG4gICAgICBibHVyVG9DYW5jZWw6IG5lZWRDb25maXJtQnV0dG9uLFxuICAgICAgb3BlbjogbWVyZ2VkT3BlbixcbiAgICAgIHZhbHVlOiB0ZXh0LFxuICAgICAgdHJpZ2dlck9wZW46IHRyaWdnZXJPcGVuLFxuICAgICAgZm9yd2FyZEtleURvd246IGZvcndhcmRLZXlEb3duLFxuICAgICAgaXNDbGlja091dHNpZGU6IGZ1bmN0aW9uIGlzQ2xpY2tPdXRzaWRlKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gIWVsZW1lbnRzQ29udGFpbnMoW3BhbmVsRGl2UmVmLmN1cnJlbnQsIGlucHV0RGl2UmVmLmN1cnJlbnQsIGNvbnRhaW5lclJlZi5jdXJyZW50XSwgdGFyZ2V0KTtcbiAgICAgIH0sXG4gICAgICBvblN1Ym1pdDogZnVuY3Rpb24gb25TdWJtaXQoKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgLy8gV2hlbiB1c2VyIHR5cGluZyBkaXNhYmxlZERhdGUgd2l0aCBrZXlib2FyZCBhbmQgZW50ZXIsIHRoaXMgdmFsdWUgd2lsbCBiZSBlbXB0eVxuICAgICAgICAhc2VsZWN0ZWRWYWx1ZSB8fFxuICAgICAgICAvLyBOb3JtYWwgZGlzYWJsZWQgY2hlY2tcbiAgICAgICAgZGlzYWJsZWREYXRlICYmIGRpc2FibGVkRGF0ZShzZWxlY3RlZFZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyQ2hhbmdlKHNlbGVjdGVkVmFsdWUpO1xuICAgICAgICB0cmlnZ2VyT3BlbihmYWxzZSk7XG4gICAgICAgIHJlc2V0VGV4dCgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICBvbkNhbmNlbDogZnVuY3Rpb24gb25DYW5jZWwoKSB7XG4gICAgICAgIHRyaWdnZXJPcGVuKGZhbHNlKTtcbiAgICAgICAgc2V0U2VsZWN0ZWRWYWx1ZShtZXJnZWRWYWx1ZSk7XG4gICAgICAgIHJlc2V0VGV4dCgpO1xuICAgICAgfSxcbiAgICAgIG9uS2V5RG93bjogZnVuY3Rpb24gb25LZXlEb3duKGUsIHByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgIF9vbktleURvd24gPT09IG51bGwgfHwgX29uS2V5RG93biA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29uS2V5RG93bihlLCBwcmV2ZW50RGVmYXVsdCk7XG4gICAgICB9LFxuICAgICAgb25Gb2N1czogb25Gb2N1cyxcbiAgICAgIG9uQmx1cjogb25CbHVyXG4gICAgfSksXG4gICAgX3VzZVBpY2tlcklucHV0MiA9IF9zbGljZWRUb0FycmF5KF91c2VQaWNrZXJJbnB1dCwgMiksXG4gICAgaW5wdXRQcm9wcyA9IF91c2VQaWNrZXJJbnB1dDJbMF0sXG4gICAgX3VzZVBpY2tlcklucHV0MiQgPSBfdXNlUGlja2VySW5wdXQyWzFdLFxuICAgIGZvY3VzZWQgPSBfdXNlUGlja2VySW5wdXQyJC5mb2N1c2VkLFxuICAgIHR5cGluZyA9IF91c2VQaWNrZXJJbnB1dDIkLnR5cGluZztcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU3luYyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ2xvc2Ugc2hvdWxkIHN5bmMgYmFjayB3aXRoIHRleHQgdmFsdWVcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIW1lcmdlZE9wZW4pIHtcbiAgICAgIHNldFNlbGVjdGVkVmFsdWUobWVyZ2VkVmFsdWUpO1xuICAgICAgaWYgKCF2YWx1ZVRleHRzLmxlbmd0aCB8fCB2YWx1ZVRleHRzWzBdID09PSAnJykge1xuICAgICAgICB0cmlnZ2VyVGV4dENoYW5nZSgnJyk7XG4gICAgICB9IGVsc2UgaWYgKGZpcnN0VmFsdWVUZXh0ICE9PSB0ZXh0KSB7XG4gICAgICAgIHJlc2V0VGV4dCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW21lcmdlZE9wZW4sIHZhbHVlVGV4dHNdKTtcbiAgLy8gQ2hhbmdlIHBpY2tlciBzaG91bGQgc3luYyBiYWNrIHdpdGggdGV4dCB2YWx1ZVxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghbWVyZ2VkT3Blbikge1xuICAgICAgcmVzZXRUZXh0KCk7XG4gICAgfVxuICB9LCBbcGlja2VyXSk7XG4gIC8vIFN5bmMgaW5uZXJWYWx1ZSB3aXRoIGNvbnRyb2wgbW9kZVxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIC8vIFN5bmMgc2VsZWN0IHZhbHVlXG4gICAgc2V0U2VsZWN0ZWRWYWx1ZShtZXJnZWRWYWx1ZSk7XG4gIH0sIFttZXJnZWRWYWx1ZV0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFByaXZhdGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBpZiAocGlja2VyUmVmKSB7XG4gICAgcGlja2VyUmVmLmN1cnJlbnQgPSB7XG4gICAgICBmb2N1czogZnVuY3Rpb24gZm9jdXMoKSB7XG4gICAgICAgIGlmIChpbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgaW5wdXRSZWYuY3VycmVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYmx1cjogZnVuY3Rpb24gYmx1cigpIHtcbiAgICAgICAgaWYgKGlucHV0UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBpbnB1dFJlZi5jdXJyZW50LmJsdXIoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cbiAgdmFyIF91c2VIb3ZlclZhbHVlID0gdXNlSG92ZXJWYWx1ZSh0ZXh0LCB7XG4gICAgICBmb3JtYXRMaXN0OiBmb3JtYXRMaXN0LFxuICAgICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnLFxuICAgICAgbG9jYWxlOiBsb2NhbGVcbiAgICB9KSxcbiAgICBfdXNlSG92ZXJWYWx1ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlSG92ZXJWYWx1ZSwgMyksXG4gICAgaG92ZXJWYWx1ZSA9IF91c2VIb3ZlclZhbHVlMlswXSxcbiAgICBvbkVudGVyID0gX3VzZUhvdmVyVmFsdWUyWzFdLFxuICAgIG9uTGVhdmUgPSBfdXNlSG92ZXJWYWx1ZTJbMl07XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFBhbmVsID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBwYW5lbFByb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgY2xhc3NOYW1lOiB1bmRlZmluZWQsXG4gICAgc3R5bGU6IHVuZGVmaW5lZCxcbiAgICBwaWNrZXJWYWx1ZTogdW5kZWZpbmVkLFxuICAgIG9uUGlja2VyVmFsdWVDaGFuZ2U6IHVuZGVmaW5lZCxcbiAgICBvbkNoYW5nZTogbnVsbFxuICB9KTtcbiAgdmFyIHBhbmVsTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBpY2tlclBhbmVsLCBfZXh0ZW5kcyh7fSwgcGFuZWxQcm9wcywge1xuICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZyxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBhbmVsLWZvY3VzZWRcIiksICF0eXBpbmcpKSxcbiAgICB2YWx1ZTogc2VsZWN0ZWRWYWx1ZSxcbiAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICB0YWJJbmRleDogLTEsXG4gICAgb25TZWxlY3Q6IGZ1bmN0aW9uIG9uU2VsZWN0KGRhdGUpIHtcbiAgICAgIF9vblNlbGVjdCA9PT0gbnVsbCB8fCBfb25TZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vblNlbGVjdChkYXRlKTtcbiAgICAgIHNldFNlbGVjdGVkVmFsdWUoZGF0ZSk7XG4gICAgfSxcbiAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICBvblBhbmVsQ2hhbmdlOiBmdW5jdGlvbiBvblBhbmVsQ2hhbmdlKHZpZXdEYXRlLCBtb2RlKSB7XG4gICAgICB2YXIgb25QYW5lbENoYW5nZSA9IHByb3BzLm9uUGFuZWxDaGFuZ2U7XG4gICAgICBvbkxlYXZlKHRydWUpO1xuICAgICAgb25QYW5lbENoYW5nZSA9PT0gbnVsbCB8fCBvblBhbmVsQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvblBhbmVsQ2hhbmdlKHZpZXdEYXRlLCBtb2RlKTtcbiAgICB9XG4gIH0pKTtcbiAgaWYgKHBhbmVsUmVuZGVyKSB7XG4gICAgcGFuZWxOb2RlID0gcGFuZWxSZW5kZXIocGFuZWxOb2RlKTtcbiAgfVxuICB2YXIgcGFuZWwgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBhbmVsLWNvbnRhaW5lclwiKSxcbiAgICBvbk1vdXNlRG93bjogZnVuY3Rpb24gb25Nb3VzZURvd24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSwgcGFuZWxOb2RlKTtcbiAgdmFyIHN1ZmZpeE5vZGU7XG4gIGlmIChzdWZmaXhJY29uKSB7XG4gICAgc3VmZml4Tm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3VmZml4XCIpXG4gICAgfSwgc3VmZml4SWNvbik7XG4gIH1cbiAgdmFyIGNsZWFyTm9kZTtcbiAgaWYgKGFsbG93Q2xlYXIgJiYgbWVyZ2VkVmFsdWUgJiYgIWRpc2FibGVkKSB7XG4gICAgY2xlYXJOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIG9uTW91c2VEb3duOiBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH0sXG4gICAgICBvbk1vdXNlVXA6IGZ1bmN0aW9uIG9uTW91c2VVcChlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdHJpZ2dlckNoYW5nZShudWxsKTtcbiAgICAgICAgdHJpZ2dlck9wZW4oZmFsc2UpO1xuICAgICAgfSxcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jbGVhclwiKSxcbiAgICAgIHJvbGU6IFwiYnV0dG9uXCJcbiAgICB9LCBjbGVhckljb24gfHwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jbGVhci1idG5cIilcbiAgICB9KSk7XG4gIH1cbiAgdmFyIG1lcmdlZElucHV0UHJvcHMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7XG4gICAgaWQ6IGlkLFxuICAgIHRhYkluZGV4OiB0YWJJbmRleCxcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgcmVhZE9ubHk6IGlucHV0UmVhZE9ubHkgfHwgdHlwZW9mIGZvcm1hdExpc3RbMF0gPT09ICdmdW5jdGlvbicgfHwgIXR5cGluZyxcbiAgICB2YWx1ZTogaG92ZXJWYWx1ZSB8fCB0ZXh0LFxuICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShlKSB7XG4gICAgICB0cmlnZ2VyVGV4dENoYW5nZShlLnRhcmdldC52YWx1ZSk7XG4gICAgfSxcbiAgICBhdXRvRm9jdXM6IGF1dG9Gb2N1cyxcbiAgICBwbGFjZWhvbGRlcjogcGxhY2Vob2xkZXIsXG4gICAgcmVmOiBpbnB1dFJlZixcbiAgICB0aXRsZTogdGV4dFxuICB9LCBpbnB1dFByb3BzKSwge30sIHtcbiAgICBzaXplOiBnZXRJbnB1dFNpemUocGlja2VyLCBmb3JtYXRMaXN0WzBdLCBnZW5lcmF0ZUNvbmZpZylcbiAgfSwgZ2V0RGF0YU9yQXJpYVByb3BzKHByb3BzKSksIHt9LCB7XG4gICAgYXV0b0NvbXBsZXRlOiBhdXRvQ29tcGxldGVcbiAgfSk7XG4gIHZhciBpbnB1dE5vZGUgPSBpbnB1dFJlbmRlciA/IGlucHV0UmVuZGVyKG1lcmdlZElucHV0UHJvcHMpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCBtZXJnZWRJbnB1dFByb3BzKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBXYXJuaW5nID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB3YXJuaW5nKCFkZWZhdWx0T3BlblZhbHVlLCAnYGRlZmF1bHRPcGVuVmFsdWVgIG1heSBjb25mdXNlIHVzZXIgZm9yIHRoZSBjdXJyZW50IHZhbHVlIHN0YXR1cy4gUGxlYXNlIHVzZSBgZGVmYXVsdFZhbHVlYCBpbnN0ZWFkLicpO1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmV0dXJuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBvbkNvbnRleHRTZWxlY3QgPSBmdW5jdGlvbiBvbkNvbnRleHRTZWxlY3QoZGF0ZSwgdHlwZSkge1xuICAgIGlmICh0eXBlID09PSAnc3VibWl0JyB8fCB0eXBlICE9PSAna2V5JyAmJiAhbmVlZENvbmZpcm1CdXR0b24pIHtcbiAgICAgIC8vIHRyaWdnZXJDaGFuZ2Ugd2lsbCBhbHNvIHVwZGF0ZSBzZWxlY3RlZCB2YWx1ZXNcbiAgICAgIHRyaWdnZXJDaGFuZ2UoZGF0ZSk7XG4gICAgICB0cmlnZ2VyT3BlbihmYWxzZSk7XG4gICAgfVxuICB9O1xuICB2YXIgcG9wdXBQbGFjZW1lbnQgPSBkaXJlY3Rpb24gPT09ICdydGwnID8gJ2JvdHRvbVJpZ2h0JyA6ICdib3R0b21MZWZ0JztcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBhbmVsQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiB7XG4gICAgICBvcGVyYXRpb25SZWY6IG9wZXJhdGlvblJlZixcbiAgICAgIGhpZGVIZWFkZXI6IHBpY2tlciA9PT0gJ3RpbWUnLFxuICAgICAgcGFuZWxSZWY6IHBhbmVsRGl2UmVmLFxuICAgICAgb25TZWxlY3Q6IG9uQ29udGV4dFNlbGVjdCxcbiAgICAgIG9wZW46IG1lcmdlZE9wZW4sXG4gICAgICBkZWZhdWx0T3BlblZhbHVlOiBkZWZhdWx0T3BlblZhbHVlLFxuICAgICAgb25EYXRlTW91c2VFbnRlcjogb25FbnRlcixcbiAgICAgIG9uRGF0ZU1vdXNlTGVhdmU6IG9uTGVhdmVcbiAgICB9XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBpY2tlclRyaWdnZXIsIHtcbiAgICB2aXNpYmxlOiBtZXJnZWRPcGVuLFxuICAgIHBvcHVwRWxlbWVudDogcGFuZWwsXG4gICAgcG9wdXBTdHlsZTogcG9wdXBTdHlsZSxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBkcm9wZG93bkNsYXNzTmFtZTogZHJvcGRvd25DbGFzc05hbWUsXG4gICAgZHJvcGRvd25BbGlnbjogZHJvcGRvd25BbGlnbixcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXIsXG4gICAgdHJhbnNpdGlvbk5hbWU6IHRyYW5zaXRpb25OYW1lLFxuICAgIHBvcHVwUGxhY2VtZW50OiBwb3B1cFBsYWNlbWVudCxcbiAgICBkaXJlY3Rpb246IGRpcmVjdGlvblxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgcmVmOiBjb250YWluZXJSZWYsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKHByZWZpeENscywgY2xhc3NOYW1lLCAoX2NsYXNzTmFtZXMyID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWRcIiksIGRpc2FibGVkKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1mb2N1c2VkXCIpLCBmb2N1c2VkKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBfY2xhc3NOYW1lczIpKSxcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgb25Nb3VzZURvd246IG9uTW91c2VEb3duLFxuICAgIG9uTW91c2VVcDogb25Nb3VzZVVwLFxuICAgIG9uTW91c2VFbnRlcjogb25Nb3VzZUVudGVyLFxuICAgIG9uTW91c2VMZWF2ZTogb25Nb3VzZUxlYXZlLFxuICAgIG9uQ29udGV4dE1lbnU6IG9uQ29udGV4dE1lbnUsXG4gICAgb25DbGljazogb25JbnRlcm5hbENsaWNrXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbnB1dFwiKSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWlucHV0LXBsYWNlaG9sZGVyXCIpLCAhIWhvdmVyVmFsdWUpKSxcbiAgICByZWY6IGlucHV0RGl2UmVmXG4gIH0sIGlucHV0Tm9kZSwgc3VmZml4Tm9kZSwgY2xlYXJOb2RlKSkpKTtcbn1cbi8vIFdyYXAgd2l0aCBjbGFzcyBjb21wb25lbnQgdG8gZW5hYmxlIHBhc3MgZ2VuZXJpYyB3aXRoIGluc3RhbmNlIG1ldGhvZFxudmFyIFBpY2tlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoUGlja2VyLCBfUmVhY3QkQ29tcG9uZW50KTtcbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihQaWNrZXIpO1xuICBmdW5jdGlvbiBQaWNrZXIoKSB7XG4gICAgdmFyIF90aGlzO1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQaWNrZXIpO1xuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsLmFwcGx5KF9zdXBlciwgW3RoaXNdLmNvbmNhdChhcmdzKSk7XG4gICAgX3RoaXMucGlja2VyUmVmID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZVJlZigpO1xuICAgIF90aGlzLmZvY3VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLnBpY2tlclJlZi5jdXJyZW50KSB7XG4gICAgICAgIF90aGlzLnBpY2tlclJlZi5jdXJyZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBfdGhpcy5ibHVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLnBpY2tlclJlZi5jdXJyZW50KSB7XG4gICAgICAgIF90aGlzLnBpY2tlclJlZi5jdXJyZW50LmJsdXIoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICBfY3JlYXRlQ2xhc3MoUGlja2VyLCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KElubmVyUGlja2VyLCBfZXh0ZW5kcyh7fSwgdGhpcy5wcm9wcywge1xuICAgICAgICBwaWNrZXJSZWY6IHRoaXMucGlja2VyUmVmXG4gICAgICB9KSk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBQaWNrZXI7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5leHBvcnQgZGVmYXVsdCBQaWNrZXI7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0VmFsdWUgfSBmcm9tICcuLi91dGlscy9taXNjVXRpbCc7XG5pbXBvcnQgeyBpc1NhbWVEYXRlLCBnZXRRdWFydGVyIH0gZnJvbSAnLi4vdXRpbHMvZGF0ZVV0aWwnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlUmFuZ2VEaXNhYmxlZChfcmVmLCBkaXNhYmxlZFN0YXJ0LCBkaXNhYmxlZEVuZCkge1xuICB2YXIgcGlja2VyID0gX3JlZi5waWNrZXIsXG4gICAgbG9jYWxlID0gX3JlZi5sb2NhbGUsXG4gICAgc2VsZWN0ZWRWYWx1ZSA9IF9yZWYuc2VsZWN0ZWRWYWx1ZSxcbiAgICBkaXNhYmxlZERhdGUgPSBfcmVmLmRpc2FibGVkRGF0ZSxcbiAgICBkaXNhYmxlZCA9IF9yZWYuZGlzYWJsZWQsXG4gICAgZ2VuZXJhdGVDb25maWcgPSBfcmVmLmdlbmVyYXRlQ29uZmlnO1xuICB2YXIgc3RhcnREYXRlID0gZ2V0VmFsdWUoc2VsZWN0ZWRWYWx1ZSwgMCk7XG4gIHZhciBlbmREYXRlID0gZ2V0VmFsdWUoc2VsZWN0ZWRWYWx1ZSwgMSk7XG4gIGZ1bmN0aW9uIHdlZWtGaXJzdERhdGUoZGF0ZSkge1xuICAgIHJldHVybiBnZW5lcmF0ZUNvbmZpZy5sb2NhbGUuZ2V0V2Vla0ZpcnN0RGF0ZShsb2NhbGUubG9jYWxlLCBkYXRlKTtcbiAgfVxuICBmdW5jdGlvbiBtb250aE51bWJlcihkYXRlKSB7XG4gICAgdmFyIHllYXIgPSBnZW5lcmF0ZUNvbmZpZy5nZXRZZWFyKGRhdGUpO1xuICAgIHZhciBtb250aCA9IGdlbmVyYXRlQ29uZmlnLmdldE1vbnRoKGRhdGUpO1xuICAgIHJldHVybiB5ZWFyICogMTAwICsgbW9udGg7XG4gIH1cbiAgZnVuY3Rpb24gcXVhcnRlck51bWJlcihkYXRlKSB7XG4gICAgdmFyIHllYXIgPSBnZW5lcmF0ZUNvbmZpZy5nZXRZZWFyKGRhdGUpO1xuICAgIHZhciBxdWFydGVyID0gZ2V0UXVhcnRlcihnZW5lcmF0ZUNvbmZpZywgZGF0ZSk7XG4gICAgcmV0dXJuIHllYXIgKiAxMCArIHF1YXJ0ZXI7XG4gIH1cbiAgdmFyIGRpc2FibGVkU3RhcnREYXRlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGRhdGUpIHtcbiAgICBpZiAoZGlzYWJsZWREYXRlICYmIGRpc2FibGVkRGF0ZShkYXRlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIERpc2FibGVkIHJhbmdlXG4gICAgaWYgKGRpc2FibGVkWzFdICYmIGVuZERhdGUpIHtcbiAgICAgIHJldHVybiAhaXNTYW1lRGF0ZShnZW5lcmF0ZUNvbmZpZywgZGF0ZSwgZW5kRGF0ZSkgJiYgZ2VuZXJhdGVDb25maWcuaXNBZnRlcihkYXRlLCBlbmREYXRlKTtcbiAgICB9XG4gICAgLy8gRGlzYWJsZWQgcGFydFxuICAgIGlmIChkaXNhYmxlZFN0YXJ0ICYmIGVuZERhdGUpIHtcbiAgICAgIHN3aXRjaCAocGlja2VyKSB7XG4gICAgICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgICAgIHJldHVybiBxdWFydGVyTnVtYmVyKGRhdGUpID4gcXVhcnRlck51bWJlcihlbmREYXRlKTtcbiAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgIHJldHVybiBtb250aE51bWJlcihkYXRlKSA+IG1vbnRoTnVtYmVyKGVuZERhdGUpO1xuICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgICByZXR1cm4gd2Vla0ZpcnN0RGF0ZShkYXRlKSA+IHdlZWtGaXJzdERhdGUoZW5kRGF0ZSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuICFpc1NhbWVEYXRlKGdlbmVyYXRlQ29uZmlnLCBkYXRlLCBlbmREYXRlKSAmJiBnZW5lcmF0ZUNvbmZpZy5pc0FmdGVyKGRhdGUsIGVuZERhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sIFtkaXNhYmxlZERhdGUsIGRpc2FibGVkWzFdLCBlbmREYXRlLCBkaXNhYmxlZFN0YXJ0XSk7XG4gIHZhciBkaXNhYmxlZEVuZERhdGUgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoZGF0ZSkge1xuICAgIGlmIChkaXNhYmxlZERhdGUgJiYgZGlzYWJsZWREYXRlKGRhdGUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gRGlzYWJsZWQgcmFuZ2VcbiAgICBpZiAoZGlzYWJsZWRbMF0gJiYgc3RhcnREYXRlKSB7XG4gICAgICByZXR1cm4gIWlzU2FtZURhdGUoZ2VuZXJhdGVDb25maWcsIGRhdGUsIGVuZERhdGUpICYmIGdlbmVyYXRlQ29uZmlnLmlzQWZ0ZXIoc3RhcnREYXRlLCBkYXRlKTtcbiAgICB9XG4gICAgLy8gRGlzYWJsZWQgcGFydFxuICAgIGlmIChkaXNhYmxlZEVuZCAmJiBzdGFydERhdGUpIHtcbiAgICAgIHN3aXRjaCAocGlja2VyKSB7XG4gICAgICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgICAgIHJldHVybiBxdWFydGVyTnVtYmVyKGRhdGUpIDwgcXVhcnRlck51bWJlcihzdGFydERhdGUpO1xuICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgcmV0dXJuIG1vbnRoTnVtYmVyKGRhdGUpIDwgbW9udGhOdW1iZXIoc3RhcnREYXRlKTtcbiAgICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgICAgcmV0dXJuIHdlZWtGaXJzdERhdGUoZGF0ZSkgPCB3ZWVrRmlyc3REYXRlKHN0YXJ0RGF0ZSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuICFpc1NhbWVEYXRlKGdlbmVyYXRlQ29uZmlnLCBkYXRlLCBzdGFydERhdGUpICYmIGdlbmVyYXRlQ29uZmlnLmlzQWZ0ZXIoc3RhcnREYXRlLCBkYXRlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LCBbZGlzYWJsZWREYXRlLCBkaXNhYmxlZFswXSwgc3RhcnREYXRlLCBkaXNhYmxlZEVuZF0pO1xuICByZXR1cm4gW2Rpc2FibGVkU3RhcnREYXRlLCBkaXNhYmxlZEVuZERhdGVdO1xufSIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0VmFsdWUsIHVwZGF0ZVZhbHVlcyB9IGZyb20gJy4uL3V0aWxzL21pc2NVdGlsJztcbmltcG9ydCB7IGdldENsb3NpbmdWaWV3RGF0ZSwgaXNTYW1lWWVhciwgaXNTYW1lTW9udGgsIGlzU2FtZURlY2FkZSB9IGZyb20gJy4uL3V0aWxzL2RhdGVVdGlsJztcbmZ1bmN0aW9uIGdldFN0YXJ0RW5kRGlzdGFuY2Uoc3RhcnREYXRlLCBlbmREYXRlLCBwaWNrZXIsIGdlbmVyYXRlQ29uZmlnKSB7XG4gIHZhciBzdGFydE5leHQgPSBnZXRDbG9zaW5nVmlld0RhdGUoc3RhcnREYXRlLCBwaWNrZXIsIGdlbmVyYXRlQ29uZmlnLCAxKTtcbiAgZnVuY3Rpb24gZ2V0RGlzdGFuY2UoY29tcGFyZUZ1bmMpIHtcbiAgICBpZiAoY29tcGFyZUZ1bmMoc3RhcnREYXRlLCBlbmREYXRlKSkge1xuICAgICAgcmV0dXJuICdzYW1lJztcbiAgICB9XG4gICAgaWYgKGNvbXBhcmVGdW5jKHN0YXJ0TmV4dCwgZW5kRGF0ZSkpIHtcbiAgICAgIHJldHVybiAnY2xvc2luZyc7XG4gICAgfVxuICAgIHJldHVybiAnZmFyJztcbiAgfVxuICBzd2l0Y2ggKHBpY2tlcikge1xuICAgIGNhc2UgJ3llYXInOlxuICAgICAgcmV0dXJuIGdldERpc3RhbmNlKGZ1bmN0aW9uIChzdGFydCwgZW5kKSB7XG4gICAgICAgIHJldHVybiBpc1NhbWVEZWNhZGUoZ2VuZXJhdGVDb25maWcsIHN0YXJ0LCBlbmQpO1xuICAgICAgfSk7XG4gICAgY2FzZSAncXVhcnRlcic6XG4gICAgY2FzZSAnbW9udGgnOlxuICAgICAgcmV0dXJuIGdldERpc3RhbmNlKGZ1bmN0aW9uIChzdGFydCwgZW5kKSB7XG4gICAgICAgIHJldHVybiBpc1NhbWVZZWFyKGdlbmVyYXRlQ29uZmlnLCBzdGFydCwgZW5kKTtcbiAgICAgIH0pO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZ2V0RGlzdGFuY2UoZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgcmV0dXJuIGlzU2FtZU1vbnRoKGdlbmVyYXRlQ29uZmlnLCBzdGFydCwgZW5kKTtcbiAgICAgIH0pO1xuICB9XG59XG5mdW5jdGlvbiBnZXRSYW5nZVZpZXdEYXRlKHZhbHVlcywgaW5kZXgsIHBpY2tlciwgZ2VuZXJhdGVDb25maWcpIHtcbiAgdmFyIHN0YXJ0RGF0ZSA9IGdldFZhbHVlKHZhbHVlcywgMCk7XG4gIHZhciBlbmREYXRlID0gZ2V0VmFsdWUodmFsdWVzLCAxKTtcbiAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgcmV0dXJuIHN0YXJ0RGF0ZTtcbiAgfVxuICBpZiAoc3RhcnREYXRlICYmIGVuZERhdGUpIHtcbiAgICB2YXIgZGlzdGFuY2UgPSBnZXRTdGFydEVuZERpc3RhbmNlKHN0YXJ0RGF0ZSwgZW5kRGF0ZSwgcGlja2VyLCBnZW5lcmF0ZUNvbmZpZyk7XG4gICAgc3dpdGNoIChkaXN0YW5jZSkge1xuICAgICAgY2FzZSAnc2FtZSc6XG4gICAgICAgIHJldHVybiBzdGFydERhdGU7XG4gICAgICBjYXNlICdjbG9zaW5nJzpcbiAgICAgICAgcmV0dXJuIHN0YXJ0RGF0ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBnZXRDbG9zaW5nVmlld0RhdGUoZW5kRGF0ZSwgcGlja2VyLCBnZW5lcmF0ZUNvbmZpZywgLTEpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RhcnREYXRlO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlUmFuZ2VWaWV3RGF0ZXMoX3JlZikge1xuICB2YXIgdmFsdWVzID0gX3JlZi52YWx1ZXMsXG4gICAgcGlja2VyID0gX3JlZi5waWNrZXIsXG4gICAgZGVmYXVsdERhdGVzID0gX3JlZi5kZWZhdWx0RGF0ZXMsXG4gICAgZ2VuZXJhdGVDb25maWcgPSBfcmVmLmdlbmVyYXRlQ29uZmlnO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFtnZXRWYWx1ZShkZWZhdWx0RGF0ZXMsIDApLCBnZXRWYWx1ZShkZWZhdWx0RGF0ZXMsIDEpXTtcbiAgICB9KSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBkZWZhdWx0Vmlld0RhdGVzID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXREZWZhdWx0Vmlld0RhdGVzID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTMgPSBSZWFjdC51c2VTdGF0ZShudWxsKSxcbiAgICBfUmVhY3QkdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlMywgMiksXG4gICAgdmlld0RhdGVzID0gX1JlYWN0JHVzZVN0YXRlNFswXSxcbiAgICBzZXRJbnRlcm5hbFZpZXdEYXRlcyA9IF9SZWFjdCR1c2VTdGF0ZTRbMV07XG4gIHZhciBzdGFydERhdGUgPSBnZXRWYWx1ZSh2YWx1ZXMsIDApO1xuICB2YXIgZW5kRGF0ZSA9IGdldFZhbHVlKHZhbHVlcywgMSk7XG4gIGZ1bmN0aW9uIGdldFZpZXdEYXRlKGluZGV4KSB7XG4gICAgLy8gSWYgc2V0IGRlZmF1bHQgdmlldyBkYXRlLCB1c2UgaXRcbiAgICBpZiAoZGVmYXVsdFZpZXdEYXRlc1tpbmRleF0pIHtcbiAgICAgIHJldHVybiBkZWZhdWx0Vmlld0RhdGVzW2luZGV4XTtcbiAgICB9XG4gICAgcmV0dXJuIGdldFZhbHVlKHZpZXdEYXRlcywgaW5kZXgpIHx8IGdldFJhbmdlVmlld0RhdGUodmFsdWVzLCBpbmRleCwgcGlja2VyLCBnZW5lcmF0ZUNvbmZpZykgfHwgc3RhcnREYXRlIHx8IGVuZERhdGUgfHwgZ2VuZXJhdGVDb25maWcuZ2V0Tm93KCk7XG4gIH1cbiAgZnVuY3Rpb24gc2V0Vmlld0RhdGUodmlld0RhdGUsIGluZGV4KSB7XG4gICAgaWYgKHZpZXdEYXRlKSB7XG4gICAgICB2YXIgbmV3Vmlld0RhdGVzID0gdXBkYXRlVmFsdWVzKHZpZXdEYXRlcywgdmlld0RhdGUsIGluZGV4KTtcbiAgICAgIC8vIFNldCB2aWV3IGRhdGUgd2lsbCBjbGVhbiB1cCBkZWZhdWx0IG9uZVxuICAgICAgc2V0RGVmYXVsdFZpZXdEYXRlcyhcbiAgICAgIC8vIFNob3VsZCBhbHdheXMgYmUgYW4gYXJyYXlcbiAgICAgIHVwZGF0ZVZhbHVlcyhkZWZhdWx0Vmlld0RhdGVzLCBudWxsLCBpbmRleCkgfHwgW251bGwsIG51bGxdKTtcbiAgICAgIC8vIFJlc2V0IGFub3RoZXIgb25lIHdoZW4gbm90IGhhdmUgdmFsdWVcbiAgICAgIHZhciBhbm90aGVySW5kZXggPSAoaW5kZXggKyAxKSAlIDI7XG4gICAgICBpZiAoIWdldFZhbHVlKHZhbHVlcywgYW5vdGhlckluZGV4KSkge1xuICAgICAgICBuZXdWaWV3RGF0ZXMgPSB1cGRhdGVWYWx1ZXMobmV3Vmlld0RhdGVzLCB2aWV3RGF0ZSwgYW5vdGhlckluZGV4KTtcbiAgICAgIH1cbiAgICAgIHNldEludGVybmFsVmlld0RhdGVzKG5ld1ZpZXdEYXRlcyk7XG4gICAgfSBlbHNlIGlmIChzdGFydERhdGUgfHwgZW5kRGF0ZSkge1xuICAgICAgLy8gUmVzZXQgYWxsIHdoZW4gaGFzIHZhbHVlcyB3aGVuIGB2aWV3RGF0ZWAgaXMgYG51bGxgIHdoaWNoIG1lYW5zIGZyb20gb3BlbiB0cmlnZ2VyXG4gICAgICBzZXRJbnRlcm5hbFZpZXdEYXRlcyhudWxsKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtnZXRWaWV3RGF0ZSwgc2V0Vmlld0RhdGVdO1xufSIsImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNcIjtcbmltcG9ydCBfY3JlYXRlU3VwZXIgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZVN1cGVyXCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VSZWYsIHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB3YXJuaW5nIGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbmltcG9ydCB1c2VNZXJnZWRTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZXJnZWRTdGF0ZVwiO1xuaW1wb3J0IFBpY2tlclRyaWdnZXIgZnJvbSAnLi9QaWNrZXJUcmlnZ2VyJztcbmltcG9ydCBQaWNrZXJQYW5lbCBmcm9tICcuL1BpY2tlclBhbmVsJztcbmltcG9ydCB1c2VQaWNrZXJJbnB1dCBmcm9tICcuL2hvb2tzL3VzZVBpY2tlcklucHV0JztcbmltcG9ydCBnZXREYXRhT3JBcmlhUHJvcHMsIHsgdG9BcnJheSwgZ2V0VmFsdWUsIHVwZGF0ZVZhbHVlcyB9IGZyb20gJy4vdXRpbHMvbWlzY1V0aWwnO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdEZvcm1hdCwgZ2V0SW5wdXRTaXplLCBlbGVtZW50c0NvbnRhaW5zIH0gZnJvbSAnLi91dGlscy91aVV0aWwnO1xuaW1wb3J0IFBhbmVsQ29udGV4dCBmcm9tICcuL1BhbmVsQ29udGV4dCc7XG5pbXBvcnQgeyBpc0VxdWFsLCBnZXRDbG9zaW5nVmlld0RhdGUsIGlzU2FtZURhdGUsIGlzU2FtZVdlZWssIGlzU2FtZVF1YXJ0ZXIsIGZvcm1hdFZhbHVlLCBwYXJzZVZhbHVlIH0gZnJvbSAnLi91dGlscy9kYXRlVXRpbCc7XG5pbXBvcnQgdXNlVmFsdWVUZXh0cyBmcm9tICcuL2hvb2tzL3VzZVZhbHVlVGV4dHMnO1xuaW1wb3J0IHVzZVRleHRWYWx1ZU1hcHBpbmcgZnJvbSAnLi9ob29rcy91c2VUZXh0VmFsdWVNYXBwaW5nJztcbmltcG9ydCBSYW5nZUNvbnRleHQgZnJvbSAnLi9SYW5nZUNvbnRleHQnO1xuaW1wb3J0IHVzZVJhbmdlRGlzYWJsZWQgZnJvbSAnLi9ob29rcy91c2VSYW5nZURpc2FibGVkJztcbmltcG9ydCBnZXRFeHRyYUZvb3RlciBmcm9tICcuL3V0aWxzL2dldEV4dHJhRm9vdGVyJztcbmltcG9ydCBnZXRSYW5nZXMgZnJvbSAnLi91dGlscy9nZXRSYW5nZXMnO1xuaW1wb3J0IHVzZVJhbmdlVmlld0RhdGVzIGZyb20gJy4vaG9va3MvdXNlUmFuZ2VWaWV3RGF0ZXMnO1xuaW1wb3J0IHVzZUhvdmVyVmFsdWUgZnJvbSAnLi9ob29rcy91c2VIb3ZlclZhbHVlJztcbmltcG9ydCB7IGxlZ2FjeVByb3BzV2FybmluZyB9IGZyb20gJy4vdXRpbHMvd2FyblV0aWwnO1xuZnVuY3Rpb24gcmVvcmRlclZhbHVlcyh2YWx1ZXMsIGdlbmVyYXRlQ29uZmlnKSB7XG4gIGlmICh2YWx1ZXMgJiYgdmFsdWVzWzBdICYmIHZhbHVlc1sxXSAmJiBnZW5lcmF0ZUNvbmZpZy5pc0FmdGVyKHZhbHVlc1swXSwgdmFsdWVzWzFdKSkge1xuICAgIHJldHVybiBbdmFsdWVzWzFdLCB2YWx1ZXNbMF1dO1xuICB9XG4gIHJldHVybiB2YWx1ZXM7XG59XG5mdW5jdGlvbiBjYW5WYWx1ZVRyaWdnZXIodmFsdWUsIGluZGV4LCBkaXNhYmxlZCwgYWxsb3dFbXB0eSkge1xuICBpZiAodmFsdWUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoYWxsb3dFbXB0eSAmJiBhbGxvd0VtcHR5W2luZGV4XSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChkaXNhYmxlZFsoaW5kZXggKyAxKSAlIDJdKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gSW5uZXJSYW5nZVBpY2tlcihwcm9wcykge1xuICB2YXIgX2NsYXNzTmFtZXMyLCBfY2xhc3NOYW1lczMsIF9jbGFzc05hbWVzNDtcbiAgdmFyIF9wcm9wcyRwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgcHJlZml4Q2xzID0gX3Byb3BzJHByZWZpeENscyA9PT0gdm9pZCAwID8gJ3JjLXBpY2tlcicgOiBfcHJvcHMkcHJlZml4Q2xzLFxuICAgIGlkID0gcHJvcHMuaWQsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgcG9wdXBTdHlsZSA9IHByb3BzLnBvcHVwU3R5bGUsXG4gICAgZHJvcGRvd25DbGFzc05hbWUgPSBwcm9wcy5kcm9wZG93bkNsYXNzTmFtZSxcbiAgICB0cmFuc2l0aW9uTmFtZSA9IHByb3BzLnRyYW5zaXRpb25OYW1lLFxuICAgIGRyb3Bkb3duQWxpZ24gPSBwcm9wcy5kcm9wZG93bkFsaWduLFxuICAgIGdldFBvcHVwQ29udGFpbmVyID0gcHJvcHMuZ2V0UG9wdXBDb250YWluZXIsXG4gICAgZ2VuZXJhdGVDb25maWcgPSBwcm9wcy5nZW5lcmF0ZUNvbmZpZyxcbiAgICBsb2NhbGUgPSBwcm9wcy5sb2NhbGUsXG4gICAgcGxhY2Vob2xkZXIgPSBwcm9wcy5wbGFjZWhvbGRlcixcbiAgICBhdXRvRm9jdXMgPSBwcm9wcy5hdXRvRm9jdXMsXG4gICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICBmb3JtYXQgPSBwcm9wcy5mb3JtYXQsXG4gICAgX3Byb3BzJHBpY2tlciA9IHByb3BzLnBpY2tlcixcbiAgICBwaWNrZXIgPSBfcHJvcHMkcGlja2VyID09PSB2b2lkIDAgPyAnZGF0ZScgOiBfcHJvcHMkcGlja2VyLFxuICAgIHNob3dUaW1lID0gcHJvcHMuc2hvd1RpbWUsXG4gICAgdXNlMTJIb3VycyA9IHByb3BzLnVzZTEySG91cnMsXG4gICAgX3Byb3BzJHNlcGFyYXRvciA9IHByb3BzLnNlcGFyYXRvcixcbiAgICBzZXBhcmF0b3IgPSBfcHJvcHMkc2VwYXJhdG9yID09PSB2b2lkIDAgPyAnficgOiBfcHJvcHMkc2VwYXJhdG9yLFxuICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgZGVmYXVsdFZhbHVlID0gcHJvcHMuZGVmYXVsdFZhbHVlLFxuICAgIGRlZmF1bHRQaWNrZXJWYWx1ZSA9IHByb3BzLmRlZmF1bHRQaWNrZXJWYWx1ZSxcbiAgICBvcGVuID0gcHJvcHMub3BlbixcbiAgICBkZWZhdWx0T3BlbiA9IHByb3BzLmRlZmF1bHRPcGVuLFxuICAgIGRpc2FibGVkRGF0ZSA9IHByb3BzLmRpc2FibGVkRGF0ZSxcbiAgICBfZGlzYWJsZWRUaW1lID0gcHJvcHMuZGlzYWJsZWRUaW1lLFxuICAgIGRhdGVSZW5kZXIgPSBwcm9wcy5kYXRlUmVuZGVyLFxuICAgIHBhbmVsUmVuZGVyID0gcHJvcHMucGFuZWxSZW5kZXIsXG4gICAgcmFuZ2VzID0gcHJvcHMucmFuZ2VzLFxuICAgIGFsbG93RW1wdHkgPSBwcm9wcy5hbGxvd0VtcHR5LFxuICAgIGFsbG93Q2xlYXIgPSBwcm9wcy5hbGxvd0NsZWFyLFxuICAgIHN1ZmZpeEljb24gPSBwcm9wcy5zdWZmaXhJY29uLFxuICAgIGNsZWFySWNvbiA9IHByb3BzLmNsZWFySWNvbixcbiAgICBwaWNrZXJSZWYgPSBwcm9wcy5waWNrZXJSZWYsXG4gICAgaW5wdXRSZWFkT25seSA9IHByb3BzLmlucHV0UmVhZE9ubHksXG4gICAgbW9kZSA9IHByb3BzLm1vZGUsXG4gICAgcmVuZGVyRXh0cmFGb290ZXIgPSBwcm9wcy5yZW5kZXJFeHRyYUZvb3RlcixcbiAgICBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLFxuICAgIG9uT3BlbkNoYW5nZSA9IHByb3BzLm9uT3BlbkNoYW5nZSxcbiAgICBvblBhbmVsQ2hhbmdlID0gcHJvcHMub25QYW5lbENoYW5nZSxcbiAgICBvbkNhbGVuZGFyQ2hhbmdlID0gcHJvcHMub25DYWxlbmRhckNoYW5nZSxcbiAgICBfb25Gb2N1cyA9IHByb3BzLm9uRm9jdXMsXG4gICAgb25CbHVyID0gcHJvcHMub25CbHVyLFxuICAgIG9uTW91c2VEb3duID0gcHJvcHMub25Nb3VzZURvd24sXG4gICAgb25Nb3VzZVVwID0gcHJvcHMub25Nb3VzZVVwLFxuICAgIG9uTW91c2VFbnRlciA9IHByb3BzLm9uTW91c2VFbnRlcixcbiAgICBvbk1vdXNlTGVhdmUgPSBwcm9wcy5vbk1vdXNlTGVhdmUsXG4gICAgb25DbGljayA9IHByb3BzLm9uQ2xpY2ssXG4gICAgX29uT2sgPSBwcm9wcy5vbk9rLFxuICAgIF9vbktleURvd24gPSBwcm9wcy5vbktleURvd24sXG4gICAgY29tcG9uZW50cyA9IHByb3BzLmNvbXBvbmVudHMsXG4gICAgb3JkZXIgPSBwcm9wcy5vcmRlcixcbiAgICBkaXJlY3Rpb24gPSBwcm9wcy5kaXJlY3Rpb24sXG4gICAgYWN0aXZlUGlja2VySW5kZXggPSBwcm9wcy5hY3RpdmVQaWNrZXJJbmRleCxcbiAgICBfcHJvcHMkYXV0b0NvbXBsZXRlID0gcHJvcHMuYXV0b0NvbXBsZXRlLFxuICAgIGF1dG9Db21wbGV0ZSA9IF9wcm9wcyRhdXRvQ29tcGxldGUgPT09IHZvaWQgMCA/ICdvZmYnIDogX3Byb3BzJGF1dG9Db21wbGV0ZTtcbiAgdmFyIG5lZWRDb25maXJtQnV0dG9uID0gcGlja2VyID09PSAnZGF0ZScgJiYgISFzaG93VGltZSB8fCBwaWNrZXIgPT09ICd0aW1lJztcbiAgLy8gV2UgcmVjb3JkIG9wZW5lZCBzdGF0dXMgaGVyZSBpbiBjYXNlIHJlcGVhdCBvcGVuIHdpdGggcGlja2VyXG4gIHZhciBvcGVuUmVjb3Jkc1JlZiA9IHVzZVJlZih7fSk7XG4gIHZhciBjb250YWluZXJSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciBwYW5lbERpdlJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIHN0YXJ0SW5wdXREaXZSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciBlbmRJbnB1dERpdlJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIHNlcGFyYXRvclJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIHN0YXJ0SW5wdXRSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciBlbmRJbnB1dFJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIGFycm93UmVmID0gdXNlUmVmKG51bGwpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFdhcm5pbmcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGxlZ2FjeVByb3BzV2FybmluZyhwcm9wcyk7XG4gIH1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gTWlzYyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGZvcm1hdExpc3QgPSB0b0FycmF5KGdldERlZmF1bHRGb3JtYXQoZm9ybWF0LCBwaWNrZXIsIHNob3dUaW1lLCB1c2UxMkhvdXJzKSk7XG4gIC8vIEFjdGl2ZSBwaWNrZXJcbiAgdmFyIF91c2VNZXJnZWRTdGF0ZSA9IHVzZU1lcmdlZFN0YXRlKDAsIHtcbiAgICAgIHZhbHVlOiBhY3RpdmVQaWNrZXJJbmRleFxuICAgIH0pLFxuICAgIF91c2VNZXJnZWRTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGUsIDIpLFxuICAgIG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4ID0gX3VzZU1lcmdlZFN0YXRlMlswXSxcbiAgICBzZXRNZXJnZWRBY3RpdmVQaWNrZXJJbmRleCA9IF91c2VNZXJnZWRTdGF0ZTJbMV07XG4gIC8vIE9wZXJhdGlvbiByZWZcbiAgdmFyIG9wZXJhdGlvblJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIG1lcmdlZERpc2FibGVkID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGlzYWJsZWQpKSB7XG4gICAgICByZXR1cm4gZGlzYWJsZWQ7XG4gICAgfVxuICAgIHJldHVybiBbZGlzYWJsZWQgfHwgZmFsc2UsIGRpc2FibGVkIHx8IGZhbHNlXTtcbiAgfSwgW2Rpc2FibGVkXSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFZhbHVlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfdXNlTWVyZ2VkU3RhdGUzID0gdXNlTWVyZ2VkU3RhdGUobnVsbCwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0VmFsdWUsXG4gICAgICBwb3N0U3RhdGU6IGZ1bmN0aW9uIHBvc3RTdGF0ZSh2YWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIHBpY2tlciA9PT0gJ3RpbWUnICYmICFvcmRlciA/IHZhbHVlcyA6IHJlb3JkZXJWYWx1ZXModmFsdWVzLCBnZW5lcmF0ZUNvbmZpZyk7XG4gICAgICB9XG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZTMsIDIpLFxuICAgIG1lcmdlZFZhbHVlID0gX3VzZU1lcmdlZFN0YXRlNFswXSxcbiAgICBzZXRJbm5lclZhbHVlID0gX3VzZU1lcmdlZFN0YXRlNFsxXTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IFZpZXcgRGF0ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29uZmlnIHZpZXcgcGFuZWxcbiAgdmFyIF91c2VSYW5nZVZpZXdEYXRlcyA9IHVzZVJhbmdlVmlld0RhdGVzKHtcbiAgICAgIHZhbHVlczogbWVyZ2VkVmFsdWUsXG4gICAgICBwaWNrZXI6IHBpY2tlcixcbiAgICAgIGRlZmF1bHREYXRlczogZGVmYXVsdFBpY2tlclZhbHVlLFxuICAgICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnXG4gICAgfSksXG4gICAgX3VzZVJhbmdlVmlld0RhdGVzMiA9IF9zbGljZWRUb0FycmF5KF91c2VSYW5nZVZpZXdEYXRlcywgMiksXG4gICAgZ2V0Vmlld0RhdGUgPSBfdXNlUmFuZ2VWaWV3RGF0ZXMyWzBdLFxuICAgIHNldFZpZXdEYXRlID0gX3VzZVJhbmdlVmlld0RhdGVzMlsxXTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBTZWxlY3QgVmFsdWVzID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZTUgPSB1c2VNZXJnZWRTdGF0ZShtZXJnZWRWYWx1ZSwge1xuICAgICAgcG9zdFN0YXRlOiBmdW5jdGlvbiBwb3N0U3RhdGUodmFsdWVzKSB7XG4gICAgICAgIHZhciBwb3N0VmFsdWVzID0gdmFsdWVzO1xuICAgICAgICBpZiAobWVyZ2VkRGlzYWJsZWRbMF0gJiYgbWVyZ2VkRGlzYWJsZWRbMV0pIHtcbiAgICAgICAgICByZXR1cm4gcG9zdFZhbHVlcztcbiAgICAgICAgfVxuICAgICAgICAvLyBGaWxsIGRpc2FibGVkIHVuaXRcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyOyBpICs9IDEpIHtcbiAgICAgICAgICBpZiAobWVyZ2VkRGlzYWJsZWRbaV0gJiYgIXBvc3RWYWx1ZXMgJiYgIWdldFZhbHVlKHBvc3RWYWx1ZXMsIGkpICYmICFnZXRWYWx1ZShhbGxvd0VtcHR5LCBpKSkge1xuICAgICAgICAgICAgcG9zdFZhbHVlcyA9IHVwZGF0ZVZhbHVlcyhwb3N0VmFsdWVzLCBnZW5lcmF0ZUNvbmZpZy5nZXROb3coKSwgaSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwb3N0VmFsdWVzO1xuICAgICAgfVxuICAgIH0pLFxuICAgIF91c2VNZXJnZWRTdGF0ZTYgPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGU1LCAyKSxcbiAgICBzZWxlY3RlZFZhbHVlID0gX3VzZU1lcmdlZFN0YXRlNlswXSxcbiAgICBzZXRTZWxlY3RlZFZhbHVlID0gX3VzZU1lcmdlZFN0YXRlNlsxXTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gTW9kZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZTcgPSB1c2VNZXJnZWRTdGF0ZShbcGlja2VyLCBwaWNrZXJdLCB7XG4gICAgICB2YWx1ZTogbW9kZVxuICAgIH0pLFxuICAgIF91c2VNZXJnZWRTdGF0ZTggPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGU3LCAyKSxcbiAgICBtZXJnZWRNb2RlcyA9IF91c2VNZXJnZWRTdGF0ZThbMF0sXG4gICAgc2V0SW5uZXJNb2RlcyA9IF91c2VNZXJnZWRTdGF0ZThbMV07XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc2V0SW5uZXJNb2RlcyhbcGlja2VyLCBwaWNrZXJdKTtcbiAgfSwgW3BpY2tlcl0pO1xuICB2YXIgdHJpZ2dlck1vZGVzQ2hhbmdlID0gZnVuY3Rpb24gdHJpZ2dlck1vZGVzQ2hhbmdlKG1vZGVzLCB2YWx1ZXMpIHtcbiAgICBzZXRJbm5lck1vZGVzKG1vZGVzKTtcbiAgICBpZiAob25QYW5lbENoYW5nZSkge1xuICAgICAgb25QYW5lbENoYW5nZSh2YWx1ZXMsIG1vZGVzKTtcbiAgICB9XG4gIH07XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gRGlzYWJsZSBEYXRlID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfdXNlUmFuZ2VEaXNhYmxlZCA9IHVzZVJhbmdlRGlzYWJsZWQoe1xuICAgICAgcGlja2VyOiBwaWNrZXIsXG4gICAgICBzZWxlY3RlZFZhbHVlOiBzZWxlY3RlZFZhbHVlLFxuICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICBkaXNhYmxlZDogbWVyZ2VkRGlzYWJsZWQsXG4gICAgICBkaXNhYmxlZERhdGU6IGRpc2FibGVkRGF0ZSxcbiAgICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZ1xuICAgIH0sIG9wZW5SZWNvcmRzUmVmLmN1cnJlbnRbMV0sIG9wZW5SZWNvcmRzUmVmLmN1cnJlbnRbMF0pLFxuICAgIF91c2VSYW5nZURpc2FibGVkMiA9IF9zbGljZWRUb0FycmF5KF91c2VSYW5nZURpc2FibGVkLCAyKSxcbiAgICBkaXNhYmxlZFN0YXJ0RGF0ZSA9IF91c2VSYW5nZURpc2FibGVkMlswXSxcbiAgICBkaXNhYmxlZEVuZERhdGUgPSBfdXNlUmFuZ2VEaXNhYmxlZDJbMV07XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE9wZW4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfdXNlTWVyZ2VkU3RhdGU5ID0gdXNlTWVyZ2VkU3RhdGUoZmFsc2UsIHtcbiAgICAgIHZhbHVlOiBvcGVuLFxuICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0T3BlbixcbiAgICAgIHBvc3RTdGF0ZTogZnVuY3Rpb24gcG9zdFN0YXRlKHBvc3RPcGVuKSB7XG4gICAgICAgIHJldHVybiBtZXJnZWREaXNhYmxlZFttZXJnZWRBY3RpdmVQaWNrZXJJbmRleF0gPyBmYWxzZSA6IHBvc3RPcGVuO1xuICAgICAgfSxcbiAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShuZXdPcGVuKSB7XG4gICAgICAgIGlmIChvbk9wZW5DaGFuZ2UpIHtcbiAgICAgICAgICBvbk9wZW5DaGFuZ2UobmV3T3Blbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFuZXdPcGVuICYmIG9wZXJhdGlvblJlZi5jdXJyZW50ICYmIG9wZXJhdGlvblJlZi5jdXJyZW50Lm9uQ2xvc2UpIHtcbiAgICAgICAgICBvcGVyYXRpb25SZWYuY3VycmVudC5vbkNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSxcbiAgICBfdXNlTWVyZ2VkU3RhdGUxMCA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZTksIDIpLFxuICAgIG1lcmdlZE9wZW4gPSBfdXNlTWVyZ2VkU3RhdGUxMFswXSxcbiAgICB0cmlnZ2VySW5uZXJPcGVuID0gX3VzZU1lcmdlZFN0YXRlMTBbMV07XG4gIHZhciBzdGFydE9wZW4gPSBtZXJnZWRPcGVuICYmIG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4ID09PSAwO1xuICB2YXIgZW5kT3BlbiA9IG1lcmdlZE9wZW4gJiYgbWVyZ2VkQWN0aXZlUGlja2VySW5kZXggPT09IDE7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFBvcHVwID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBvcHVwIG1pbiB3aWR0aFxuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoMCksXG4gICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgcG9wdXBNaW5XaWR0aCA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0UG9wdXBNaW5XaWR0aCA9IF91c2VTdGF0ZTJbMV07XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFtZXJnZWRPcGVuICYmIGNvbnRhaW5lclJlZi5jdXJyZW50KSB7XG4gICAgICBzZXRQb3B1cE1pbldpZHRoKGNvbnRhaW5lclJlZi5jdXJyZW50Lm9mZnNldFdpZHRoKTtcbiAgICB9XG4gIH0sIFttZXJnZWRPcGVuXSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVHJpZ2dlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciB0cmlnZ2VyUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIGZ1bmN0aW9uIF90cmlnZ2VyT3BlbihuZXdPcGVuLCBpbmRleCkge1xuICAgIGlmIChuZXdPcGVuKSB7XG4gICAgICBjbGVhclRpbWVvdXQodHJpZ2dlclJlZi5jdXJyZW50KTtcbiAgICAgIG9wZW5SZWNvcmRzUmVmLmN1cnJlbnRbaW5kZXhdID0gdHJ1ZTtcbiAgICAgIHNldE1lcmdlZEFjdGl2ZVBpY2tlckluZGV4KGluZGV4KTtcbiAgICAgIHRyaWdnZXJJbm5lck9wZW4obmV3T3Blbik7XG4gICAgICAvLyBPcGVuIHRvIHJlc2V0IHZpZXcgZGF0ZVxuICAgICAgaWYgKCFtZXJnZWRPcGVuKSB7XG4gICAgICAgIHNldFZpZXdEYXRlKG51bGwsIGluZGV4KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4ID09PSBpbmRleCkge1xuICAgICAgdHJpZ2dlcklubmVyT3BlbihuZXdPcGVuKTtcbiAgICAgIC8vIENsZWFuIHVwIGFzeW5jXG4gICAgICAvLyBUaGlzIG1ha2VzIHJlZiBub3QgcXVpY2sgcmVmcmVzaCBpbiBjYXNlIHVzZXIgb3BlbiBhbm90aGVyIGlucHV0IHdpdGggYmx1ciB0cmlnZ2VyXG4gICAgICB2YXIgb3BlblJlY29yZHMgPSBvcGVuUmVjb3Jkc1JlZi5jdXJyZW50O1xuICAgICAgdHJpZ2dlclJlZi5jdXJyZW50ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChvcGVuUmVjb3JkcyA9PT0gb3BlblJlY29yZHNSZWYuY3VycmVudCkge1xuICAgICAgICAgIG9wZW5SZWNvcmRzUmVmLmN1cnJlbnQgPSB7fTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHRyaWdnZXJPcGVuQW5kRm9jdXMoaW5kZXgpIHtcbiAgICBfdHJpZ2dlck9wZW4odHJ1ZSwgaW5kZXgpO1xuICAgIC8vIFVzZSBzZXRUaW1lb3V0IHRvIG1ha2Ugc3VyZSBwYW5lbCBET00gZXhpc3RzXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaW5wdXRSZWYgPSBbc3RhcnRJbnB1dFJlZiwgZW5kSW5wdXRSZWZdW2luZGV4XTtcbiAgICAgIGlmIChpbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICAgIGlucHV0UmVmLmN1cnJlbnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuICBmdW5jdGlvbiB0cmlnZ2VyQ2hhbmdlKG5ld1ZhbHVlLCBzb3VyY2VJbmRleCkge1xuICAgIHZhciB2YWx1ZXMgPSBuZXdWYWx1ZTtcbiAgICB2YXIgc3RhcnRWYWx1ZSA9IGdldFZhbHVlKHZhbHVlcywgMCk7XG4gICAgdmFyIGVuZFZhbHVlID0gZ2V0VmFsdWUodmFsdWVzLCAxKTtcbiAgICAvLyA+Pj4+PiBGb3JtYXQgc3RhcnQgJiBlbmQgdmFsdWVzXG4gICAgaWYgKHN0YXJ0VmFsdWUgJiYgZW5kVmFsdWUgJiYgZ2VuZXJhdGVDb25maWcuaXNBZnRlcihzdGFydFZhbHVlLCBlbmRWYWx1ZSkpIHtcbiAgICAgIGlmIChcbiAgICAgIC8vIFdlZWtQaWNrZXIgb25seSBjb21wYXJlIHdlZWtcbiAgICAgIHBpY2tlciA9PT0gJ3dlZWsnICYmICFpc1NhbWVXZWVrKGdlbmVyYXRlQ29uZmlnLCBsb2NhbGUubG9jYWxlLCBzdGFydFZhbHVlLCBlbmRWYWx1ZSkgfHxcbiAgICAgIC8vIFF1b3RhUGlja2VyIG9ubHkgY29tcGFyZSB3ZWVrXG4gICAgICBwaWNrZXIgPT09ICdxdWFydGVyJyAmJiAhaXNTYW1lUXVhcnRlcihnZW5lcmF0ZUNvbmZpZywgc3RhcnRWYWx1ZSwgZW5kVmFsdWUpIHx8XG4gICAgICAvLyBPdGhlciBub24tVGltZVBpY2tlciBjb21wYXJlIGRhdGVcbiAgICAgIHBpY2tlciAhPT0gJ3dlZWsnICYmIHBpY2tlciAhPT0gJ3F1YXJ0ZXInICYmIHBpY2tlciAhPT0gJ3RpbWUnICYmICFpc1NhbWVEYXRlKGdlbmVyYXRlQ29uZmlnLCBzdGFydFZhbHVlLCBlbmRWYWx1ZSkpIHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgZW5kIGRhdGUgd2hlbiBzdGFydCBkYXRlIGlzIGFmdGVyIGVuZCBkYXRlXG4gICAgICAgIGlmIChzb3VyY2VJbmRleCA9PT0gMCkge1xuICAgICAgICAgIHZhbHVlcyA9IFtzdGFydFZhbHVlLCBudWxsXTtcbiAgICAgICAgICBlbmRWYWx1ZSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhcnRWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgdmFsdWVzID0gW251bGwsIGVuZFZhbHVlXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDbGVhbiB1cCBjYWNoZSBzaW5jZSBpbnZhbGlkYXRlXG4gICAgICAgIG9wZW5SZWNvcmRzUmVmLmN1cnJlbnQgPSBfZGVmaW5lUHJvcGVydHkoe30sIHNvdXJjZUluZGV4LCB0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAocGlja2VyICE9PSAndGltZScgfHwgb3JkZXIgIT09IGZhbHNlKSB7XG4gICAgICAgIC8vIFJlb3JkZXIgd2hlbiBpbiBzYW1lIGRhdGVcbiAgICAgICAgdmFsdWVzID0gcmVvcmRlclZhbHVlcyh2YWx1ZXMsIGdlbmVyYXRlQ29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc2V0U2VsZWN0ZWRWYWx1ZSh2YWx1ZXMpO1xuICAgIHZhciBzdGFydFN0ciA9IHZhbHVlcyAmJiB2YWx1ZXNbMF0gPyBmb3JtYXRWYWx1ZSh2YWx1ZXNbMF0sIHtcbiAgICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZyxcbiAgICAgIGxvY2FsZTogbG9jYWxlLFxuICAgICAgZm9ybWF0OiBmb3JtYXRMaXN0WzBdXG4gICAgfSkgOiAnJztcbiAgICB2YXIgZW5kU3RyID0gdmFsdWVzICYmIHZhbHVlc1sxXSA/IGZvcm1hdFZhbHVlKHZhbHVlc1sxXSwge1xuICAgICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnLFxuICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICBmb3JtYXQ6IGZvcm1hdExpc3RbMF1cbiAgICB9KSA6ICcnO1xuICAgIGlmIChvbkNhbGVuZGFyQ2hhbmdlKSB7XG4gICAgICB2YXIgaW5mbyA9IHtcbiAgICAgICAgcmFuZ2U6IHNvdXJjZUluZGV4ID09PSAwID8gJ3N0YXJ0JyA6ICdlbmQnXG4gICAgICB9O1xuICAgICAgb25DYWxlbmRhckNoYW5nZSh2YWx1ZXMsIFtzdGFydFN0ciwgZW5kU3RyXSwgaW5mbyk7XG4gICAgfVxuICAgIC8vID4+Pj4+IFRyaWdnZXIgYG9uQ2hhbmdlYCBldmVudFxuICAgIHZhciBjYW5TdGFydFZhbHVlVHJpZ2dlciA9IGNhblZhbHVlVHJpZ2dlcihzdGFydFZhbHVlLCAwLCBtZXJnZWREaXNhYmxlZCwgYWxsb3dFbXB0eSk7XG4gICAgdmFyIGNhbkVuZFZhbHVlVHJpZ2dlciA9IGNhblZhbHVlVHJpZ2dlcihlbmRWYWx1ZSwgMSwgbWVyZ2VkRGlzYWJsZWQsIGFsbG93RW1wdHkpO1xuICAgIHZhciBjYW5UcmlnZ2VyID0gdmFsdWVzID09PSBudWxsIHx8IGNhblN0YXJ0VmFsdWVUcmlnZ2VyICYmIGNhbkVuZFZhbHVlVHJpZ2dlcjtcbiAgICBpZiAoY2FuVHJpZ2dlcikge1xuICAgICAgLy8gVHJpZ2dlciBvbkNoYW5nZSBvbmx5IHdoZW4gdmFsdWUgaXMgdmFsaWRhdGVcbiAgICAgIHNldElubmVyVmFsdWUodmFsdWVzKTtcbiAgICAgIGlmIChvbkNoYW5nZSAmJiAoIWlzRXF1YWwoZ2VuZXJhdGVDb25maWcsIGdldFZhbHVlKG1lcmdlZFZhbHVlLCAwKSwgc3RhcnRWYWx1ZSkgfHwgIWlzRXF1YWwoZ2VuZXJhdGVDb25maWcsIGdldFZhbHVlKG1lcmdlZFZhbHVlLCAxKSwgZW5kVmFsdWUpKSkge1xuICAgICAgICBvbkNoYW5nZSh2YWx1ZXMsIFtzdGFydFN0ciwgZW5kU3RyXSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vID4+Pj4+IE9wZW4gcGlja2VyIHdoZW5cbiAgICAvLyBBbHdheXMgb3BlbiBhbm90aGVyIHBpY2tlciBpZiBwb3NzaWJsZVxuICAgIHZhciBuZXh0T3BlbkluZGV4ID0gbnVsbDtcbiAgICBpZiAoc291cmNlSW5kZXggPT09IDAgJiYgIW1lcmdlZERpc2FibGVkWzFdKSB7XG4gICAgICBuZXh0T3BlbkluZGV4ID0gMTtcbiAgICB9IGVsc2UgaWYgKHNvdXJjZUluZGV4ID09PSAxICYmICFtZXJnZWREaXNhYmxlZFswXSkge1xuICAgICAgbmV4dE9wZW5JbmRleCA9IDA7XG4gICAgfVxuICAgIGlmIChuZXh0T3BlbkluZGV4ICE9PSBudWxsICYmIG5leHRPcGVuSW5kZXggIT09IG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4ICYmICghb3BlblJlY29yZHNSZWYuY3VycmVudFtuZXh0T3BlbkluZGV4XSB8fCAhZ2V0VmFsdWUodmFsdWVzLCBuZXh0T3BlbkluZGV4KSkgJiYgZ2V0VmFsdWUodmFsdWVzLCBzb3VyY2VJbmRleCkpIHtcbiAgICAgIC8vIERlbGF5IHRvIGZvY3VzIHRvIGF2b2lkIGlucHV0IGJsdXIgdHJpZ2dlciBleHBpcmVkIHNlbGVjdGVkVmFsdWVzXG4gICAgICB0cmlnZ2VyT3BlbkFuZEZvY3VzKG5leHRPcGVuSW5kZXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfdHJpZ2dlck9wZW4oZmFsc2UsIHNvdXJjZUluZGV4KTtcbiAgICB9XG4gIH1cbiAgdmFyIGZvcndhcmRLZXlEb3duID0gZnVuY3Rpb24gZm9yd2FyZEtleURvd24oZSkge1xuICAgIGlmIChtZXJnZWRPcGVuICYmIG9wZXJhdGlvblJlZi5jdXJyZW50ICYmIG9wZXJhdGlvblJlZi5jdXJyZW50Lm9uS2V5RG93bikge1xuICAgICAgLy8gTGV0IHBvcHVwIHBhbmVsIGhhbmRsZSBrZXlib2FyZFxuICAgICAgcmV0dXJuIG9wZXJhdGlvblJlZi5jdXJyZW50Lm9uS2V5RG93bihlKTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1sb25lLWJsb2NrcyAqL1xuICAgIHtcbiAgICAgIHdhcm5pbmcoZmFsc2UsICdQaWNrZXIgbm90IGNvcnJlY3QgZm9yd2FyZCBLZXlEb3duIG9wZXJhdGlvbi4gUGxlYXNlIGhlbHAgdG8gZmlyZSBpc3N1ZSBhYm91dCB0aGlzLicpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVGV4dCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHNoYXJlZFRleHRIb29rc1Byb3BzID0ge1xuICAgIGZvcm1hdExpc3Q6IGZvcm1hdExpc3QsXG4gICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnLFxuICAgIGxvY2FsZTogbG9jYWxlXG4gIH07XG4gIHZhciBfdXNlVmFsdWVUZXh0cyA9IHVzZVZhbHVlVGV4dHMoZ2V0VmFsdWUoc2VsZWN0ZWRWYWx1ZSwgMCksIHNoYXJlZFRleHRIb29rc1Byb3BzKSxcbiAgICBfdXNlVmFsdWVUZXh0czIgPSBfc2xpY2VkVG9BcnJheShfdXNlVmFsdWVUZXh0cywgMiksXG4gICAgc3RhcnRWYWx1ZVRleHRzID0gX3VzZVZhbHVlVGV4dHMyWzBdLFxuICAgIGZpcnN0U3RhcnRWYWx1ZVRleHQgPSBfdXNlVmFsdWVUZXh0czJbMV07XG4gIHZhciBfdXNlVmFsdWVUZXh0czMgPSB1c2VWYWx1ZVRleHRzKGdldFZhbHVlKHNlbGVjdGVkVmFsdWUsIDEpLCBzaGFyZWRUZXh0SG9va3NQcm9wcyksXG4gICAgX3VzZVZhbHVlVGV4dHM0ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVZhbHVlVGV4dHMzLCAyKSxcbiAgICBlbmRWYWx1ZVRleHRzID0gX3VzZVZhbHVlVGV4dHM0WzBdLFxuICAgIGZpcnN0RW5kVmFsdWVUZXh0ID0gX3VzZVZhbHVlVGV4dHM0WzFdO1xuICB2YXIgX29uVGV4dENoYW5nZSA9IGZ1bmN0aW9uIG9uVGV4dENoYW5nZShuZXdUZXh0LCBpbmRleCkge1xuICAgIHZhciBpbnB1dERhdGUgPSBwYXJzZVZhbHVlKG5ld1RleHQsIHtcbiAgICAgIGxvY2FsZTogbG9jYWxlLFxuICAgICAgZm9ybWF0TGlzdDogZm9ybWF0TGlzdCxcbiAgICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZ1xuICAgIH0pO1xuICAgIHZhciBkaXNhYmxlZEZ1bmMgPSBpbmRleCA9PT0gMCA/IGRpc2FibGVkU3RhcnREYXRlIDogZGlzYWJsZWRFbmREYXRlO1xuICAgIGlmIChpbnB1dERhdGUgJiYgIWRpc2FibGVkRnVuYyhpbnB1dERhdGUpKSB7XG4gICAgICBzZXRTZWxlY3RlZFZhbHVlKHVwZGF0ZVZhbHVlcyhzZWxlY3RlZFZhbHVlLCBpbnB1dERhdGUsIGluZGV4KSk7XG4gICAgICBzZXRWaWV3RGF0ZShpbnB1dERhdGUsIGluZGV4KTtcbiAgICB9XG4gIH07XG4gIHZhciBfdXNlVGV4dFZhbHVlTWFwcGluZyA9IHVzZVRleHRWYWx1ZU1hcHBpbmcoe1xuICAgICAgdmFsdWVUZXh0czogc3RhcnRWYWx1ZVRleHRzLFxuICAgICAgb25UZXh0Q2hhbmdlOiBmdW5jdGlvbiBvblRleHRDaGFuZ2UobmV3VGV4dCkge1xuICAgICAgICByZXR1cm4gX29uVGV4dENoYW5nZShuZXdUZXh0LCAwKTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICBfdXNlVGV4dFZhbHVlTWFwcGluZzIgPSBfc2xpY2VkVG9BcnJheShfdXNlVGV4dFZhbHVlTWFwcGluZywgMyksXG4gICAgc3RhcnRUZXh0ID0gX3VzZVRleHRWYWx1ZU1hcHBpbmcyWzBdLFxuICAgIHRyaWdnZXJTdGFydFRleHRDaGFuZ2UgPSBfdXNlVGV4dFZhbHVlTWFwcGluZzJbMV0sXG4gICAgcmVzZXRTdGFydFRleHQgPSBfdXNlVGV4dFZhbHVlTWFwcGluZzJbMl07XG4gIHZhciBfdXNlVGV4dFZhbHVlTWFwcGluZzMgPSB1c2VUZXh0VmFsdWVNYXBwaW5nKHtcbiAgICAgIHZhbHVlVGV4dHM6IGVuZFZhbHVlVGV4dHMsXG4gICAgICBvblRleHRDaGFuZ2U6IGZ1bmN0aW9uIG9uVGV4dENoYW5nZShuZXdUZXh0KSB7XG4gICAgICAgIHJldHVybiBfb25UZXh0Q2hhbmdlKG5ld1RleHQsIDEpO1xuICAgICAgfVxuICAgIH0pLFxuICAgIF91c2VUZXh0VmFsdWVNYXBwaW5nNCA9IF9zbGljZWRUb0FycmF5KF91c2VUZXh0VmFsdWVNYXBwaW5nMywgMyksXG4gICAgZW5kVGV4dCA9IF91c2VUZXh0VmFsdWVNYXBwaW5nNFswXSxcbiAgICB0cmlnZ2VyRW5kVGV4dENoYW5nZSA9IF91c2VUZXh0VmFsdWVNYXBwaW5nNFsxXSxcbiAgICByZXNldEVuZFRleHQgPSBfdXNlVGV4dFZhbHVlTWFwcGluZzRbMl07XG4gIHZhciBfdXNlU3RhdGUzID0gdXNlU3RhdGUobnVsbCksXG4gICAgX3VzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTMsIDIpLFxuICAgIHJhbmdlSG92ZXJWYWx1ZSA9IF91c2VTdGF0ZTRbMF0sXG4gICAgc2V0UmFuZ2VIb3ZlclZhbHVlID0gX3VzZVN0YXRlNFsxXTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gSG92ZXIgUmFuZ2UgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF91c2VTdGF0ZTUgPSB1c2VTdGF0ZShudWxsKSxcbiAgICBfdXNlU3RhdGU2ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlNSwgMiksXG4gICAgaG92ZXJSYW5nZWRWYWx1ZSA9IF91c2VTdGF0ZTZbMF0sXG4gICAgc2V0SG92ZXJSYW5nZWRWYWx1ZSA9IF91c2VTdGF0ZTZbMV07XG4gIHZhciBfdXNlSG92ZXJWYWx1ZSA9IHVzZUhvdmVyVmFsdWUoc3RhcnRUZXh0LCB7XG4gICAgICBmb3JtYXRMaXN0OiBmb3JtYXRMaXN0LFxuICAgICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnLFxuICAgICAgbG9jYWxlOiBsb2NhbGVcbiAgICB9KSxcbiAgICBfdXNlSG92ZXJWYWx1ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlSG92ZXJWYWx1ZSwgMyksXG4gICAgc3RhcnRIb3ZlclZhbHVlID0gX3VzZUhvdmVyVmFsdWUyWzBdLFxuICAgIG9uU3RhcnRFbnRlciA9IF91c2VIb3ZlclZhbHVlMlsxXSxcbiAgICBvblN0YXJ0TGVhdmUgPSBfdXNlSG92ZXJWYWx1ZTJbMl07XG4gIHZhciBfdXNlSG92ZXJWYWx1ZTMgPSB1c2VIb3ZlclZhbHVlKGVuZFRleHQsIHtcbiAgICAgIGZvcm1hdExpc3Q6IGZvcm1hdExpc3QsXG4gICAgICBnZW5lcmF0ZUNvbmZpZzogZ2VuZXJhdGVDb25maWcsXG4gICAgICBsb2NhbGU6IGxvY2FsZVxuICAgIH0pLFxuICAgIF91c2VIb3ZlclZhbHVlNCA9IF9zbGljZWRUb0FycmF5KF91c2VIb3ZlclZhbHVlMywgMyksXG4gICAgZW5kSG92ZXJWYWx1ZSA9IF91c2VIb3ZlclZhbHVlNFswXSxcbiAgICBvbkVuZEVudGVyID0gX3VzZUhvdmVyVmFsdWU0WzFdLFxuICAgIG9uRW5kTGVhdmUgPSBfdXNlSG92ZXJWYWx1ZTRbMl07XG4gIHZhciBvbkRhdGVNb3VzZUVudGVyID0gZnVuY3Rpb24gb25EYXRlTW91c2VFbnRlcihkYXRlKSB7XG4gICAgc2V0SG92ZXJSYW5nZWRWYWx1ZSh1cGRhdGVWYWx1ZXMoc2VsZWN0ZWRWYWx1ZSwgZGF0ZSwgbWVyZ2VkQWN0aXZlUGlja2VySW5kZXgpKTtcbiAgICBpZiAobWVyZ2VkQWN0aXZlUGlja2VySW5kZXggPT09IDApIHtcbiAgICAgIG9uU3RhcnRFbnRlcihkYXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb25FbmRFbnRlcihkYXRlKTtcbiAgICB9XG4gIH07XG4gIHZhciBvbkRhdGVNb3VzZUxlYXZlID0gZnVuY3Rpb24gb25EYXRlTW91c2VMZWF2ZSgpIHtcbiAgICBzZXRIb3ZlclJhbmdlZFZhbHVlKHVwZGF0ZVZhbHVlcyhzZWxlY3RlZFZhbHVlLCBudWxsLCBtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCkpO1xuICAgIGlmIChtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCA9PT0gMCkge1xuICAgICAgb25TdGFydExlYXZlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9uRW5kTGVhdmUoKTtcbiAgICB9XG4gIH07XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IElucHV0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBnZXRTaGFyZWRJbnB1dEhvb2tQcm9wcyA9IGZ1bmN0aW9uIGdldFNoYXJlZElucHV0SG9va1Byb3BzKGluZGV4LCByZXNldFRleHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYmx1clRvQ2FuY2VsOiBuZWVkQ29uZmlybUJ1dHRvbixcbiAgICAgIGZvcndhcmRLZXlEb3duOiBmb3J3YXJkS2V5RG93bixcbiAgICAgIG9uQmx1cjogb25CbHVyLFxuICAgICAgaXNDbGlja091dHNpZGU6IGZ1bmN0aW9uIGlzQ2xpY2tPdXRzaWRlKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gIWVsZW1lbnRzQ29udGFpbnMoW3BhbmVsRGl2UmVmLmN1cnJlbnQsIHN0YXJ0SW5wdXREaXZSZWYuY3VycmVudCwgZW5kSW5wdXREaXZSZWYuY3VycmVudCwgY29udGFpbmVyUmVmLmN1cnJlbnRdLCB0YXJnZXQpO1xuICAgICAgfSxcbiAgICAgIG9uRm9jdXM6IGZ1bmN0aW9uIG9uRm9jdXMoZSkge1xuICAgICAgICBzZXRNZXJnZWRBY3RpdmVQaWNrZXJJbmRleChpbmRleCk7XG4gICAgICAgIGlmIChfb25Gb2N1cykge1xuICAgICAgICAgIF9vbkZvY3VzKGUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdHJpZ2dlck9wZW46IGZ1bmN0aW9uIHRyaWdnZXJPcGVuKG5ld09wZW4pIHtcbiAgICAgICAgX3RyaWdnZXJPcGVuKG5ld09wZW4sIGluZGV4KTtcbiAgICAgIH0sXG4gICAgICBvblN1Ym1pdDogZnVuY3Rpb24gb25TdWJtaXQoKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgLy8gV2hlbiB1c2VyIHR5cGluZyBkaXNhYmxlZERhdGUgd2l0aCBrZXlib2FyZCBhbmQgZW50ZXIsIHRoaXMgdmFsdWUgd2lsbCBiZSBlbXB0eVxuICAgICAgICAhc2VsZWN0ZWRWYWx1ZSB8fFxuICAgICAgICAvLyBOb3JtYWwgZGlzYWJsZWQgY2hlY2tcbiAgICAgICAgZGlzYWJsZWREYXRlICYmIGRpc2FibGVkRGF0ZShzZWxlY3RlZFZhbHVlW2luZGV4XSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckNoYW5nZShzZWxlY3RlZFZhbHVlLCBpbmRleCk7XG4gICAgICAgIHJlc2V0VGV4dCgpO1xuICAgICAgfSxcbiAgICAgIG9uQ2FuY2VsOiBmdW5jdGlvbiBvbkNhbmNlbCgpIHtcbiAgICAgICAgX3RyaWdnZXJPcGVuKGZhbHNlLCBpbmRleCk7XG4gICAgICAgIHNldFNlbGVjdGVkVmFsdWUobWVyZ2VkVmFsdWUpO1xuICAgICAgICByZXNldFRleHQoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuICB2YXIgY3VycmVudEZvY3VzZWRLZXkgPSB1c2VSZWYoJycpO1xuICB2YXIgX3VzZVBpY2tlcklucHV0ID0gdXNlUGlja2VySW5wdXQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBnZXRTaGFyZWRJbnB1dEhvb2tQcm9wcygwLCByZXNldFN0YXJ0VGV4dCkpLCB7fSwge1xuICAgICAgb3Blbjogc3RhcnRPcGVuLFxuICAgICAgdmFsdWU6IHN0YXJ0VGV4dCxcbiAgICAgIGN1cnJlbnRGb2N1c2VkS2V5OiBjdXJyZW50Rm9jdXNlZEtleSxcbiAgICAgIGtleTogJ3N0YXJ0JyxcbiAgICAgIG9uS2V5RG93bjogZnVuY3Rpb24gb25LZXlEb3duKGUsIHByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgIF9vbktleURvd24gPT09IG51bGwgfHwgX29uS2V5RG93biA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29uS2V5RG93bihlLCBwcmV2ZW50RGVmYXVsdCk7XG4gICAgICB9XG4gICAgfSkpLFxuICAgIF91c2VQaWNrZXJJbnB1dDIgPSBfc2xpY2VkVG9BcnJheShfdXNlUGlja2VySW5wdXQsIDIpLFxuICAgIHN0YXJ0SW5wdXRQcm9wcyA9IF91c2VQaWNrZXJJbnB1dDJbMF0sXG4gICAgX3VzZVBpY2tlcklucHV0MiQgPSBfdXNlUGlja2VySW5wdXQyWzFdLFxuICAgIHN0YXJ0Rm9jdXNlZCA9IF91c2VQaWNrZXJJbnB1dDIkLmZvY3VzZWQsXG4gICAgc3RhcnRUeXBpbmcgPSBfdXNlUGlja2VySW5wdXQyJC50eXBpbmc7XG4gIHZhciBfdXNlUGlja2VySW5wdXQzID0gdXNlUGlja2VySW5wdXQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBnZXRTaGFyZWRJbnB1dEhvb2tQcm9wcygxLCByZXNldEVuZFRleHQpKSwge30sIHtcbiAgICAgIG9wZW46IGVuZE9wZW4sXG4gICAgICB2YWx1ZTogZW5kVGV4dCxcbiAgICAgIGN1cnJlbnRGb2N1c2VkS2V5OiBjdXJyZW50Rm9jdXNlZEtleSxcbiAgICAgIGtleTogJ2VuZCcsXG4gICAgICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihlLCBwcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICBfb25LZXlEb3duID09PSBudWxsIHx8IF9vbktleURvd24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vbktleURvd24oZSwgcHJldmVudERlZmF1bHQpO1xuICAgICAgfVxuICAgIH0pKSxcbiAgICBfdXNlUGlja2VySW5wdXQ0ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVBpY2tlcklucHV0MywgMiksXG4gICAgZW5kSW5wdXRQcm9wcyA9IF91c2VQaWNrZXJJbnB1dDRbMF0sXG4gICAgX3VzZVBpY2tlcklucHV0NCQgPSBfdXNlUGlja2VySW5wdXQ0WzFdLFxuICAgIGVuZEZvY3VzZWQgPSBfdXNlUGlja2VySW5wdXQ0JC5mb2N1c2VkLFxuICAgIGVuZFR5cGluZyA9IF91c2VQaWNrZXJJbnB1dDQkLnR5cGluZztcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gQ2xpY2sgUGlja2VyID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBvblBpY2tlckNsaWNrID0gZnVuY3Rpb24gb25QaWNrZXJDbGljayhlKSB7XG4gICAgLy8gV2hlbiBjbGljayBpbnNpZGUgdGhlIHBpY2tlciAmIG91dHNpZGUgdGhlIHBpY2tlcidzIGlucHV0IGVsZW1lbnRzXG4gICAgLy8gdGhlIHBhbmVsIHNob3VsZCBzdGlsbCBiZSBvcGVuZWRcbiAgICBpZiAob25DbGljaykge1xuICAgICAgb25DbGljayhlKTtcbiAgICB9XG4gICAgaWYgKCFtZXJnZWRPcGVuICYmICFzdGFydElucHV0UmVmLmN1cnJlbnQuY29udGFpbnMoZS50YXJnZXQpICYmICFlbmRJbnB1dFJlZi5jdXJyZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkge1xuICAgICAgaWYgKCFtZXJnZWREaXNhYmxlZFswXSkge1xuICAgICAgICB0cmlnZ2VyT3BlbkFuZEZvY3VzKDApO1xuICAgICAgfSBlbHNlIGlmICghbWVyZ2VkRGlzYWJsZWRbMV0pIHtcbiAgICAgICAgdHJpZ2dlck9wZW5BbmRGb2N1cygxKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHZhciBvblBpY2tlck1vdXNlRG93biA9IGZ1bmN0aW9uIG9uUGlja2VyTW91c2VEb3duKGUpIHtcbiAgICAvLyBzaG91bGRuJ3QgYWZmZWN0IGlucHV0IGVsZW1lbnRzIGlmIHBpY2tlciBpcyBhY3RpdmVcbiAgICBpZiAob25Nb3VzZURvd24pIHtcbiAgICAgIG9uTW91c2VEb3duKGUpO1xuICAgIH1cbiAgICBpZiAobWVyZ2VkT3BlbiAmJiAoc3RhcnRGb2N1c2VkIHx8IGVuZEZvY3VzZWQpICYmICFzdGFydElucHV0UmVmLmN1cnJlbnQuY29udGFpbnMoZS50YXJnZXQpICYmICFlbmRJbnB1dFJlZi5jdXJyZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU3luYyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ2xvc2Ugc2hvdWxkIHN5bmMgYmFjayB3aXRoIHRleHQgdmFsdWVcbiAgdmFyIHN0YXJ0U3RyID0gbWVyZ2VkVmFsdWUgJiYgbWVyZ2VkVmFsdWVbMF0gPyBmb3JtYXRWYWx1ZShtZXJnZWRWYWx1ZVswXSwge1xuICAgIGxvY2FsZTogbG9jYWxlLFxuICAgIGZvcm1hdDogJ1lZWVlNTURESEhtbXNzJyxcbiAgICBnZW5lcmF0ZUNvbmZpZzogZ2VuZXJhdGVDb25maWdcbiAgfSkgOiAnJztcbiAgdmFyIGVuZFN0ciA9IG1lcmdlZFZhbHVlICYmIG1lcmdlZFZhbHVlWzFdID8gZm9ybWF0VmFsdWUobWVyZ2VkVmFsdWVbMV0sIHtcbiAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICBmb3JtYXQ6ICdZWVlZTU1EREhIbW1zcycsXG4gICAgZ2VuZXJhdGVDb25maWc6IGdlbmVyYXRlQ29uZmlnXG4gIH0pIDogJyc7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFtZXJnZWRPcGVuKSB7XG4gICAgICBzZXRTZWxlY3RlZFZhbHVlKG1lcmdlZFZhbHVlKTtcbiAgICAgIGlmICghc3RhcnRWYWx1ZVRleHRzLmxlbmd0aCB8fCBzdGFydFZhbHVlVGV4dHNbMF0gPT09ICcnKSB7XG4gICAgICAgIHRyaWdnZXJTdGFydFRleHRDaGFuZ2UoJycpO1xuICAgICAgfSBlbHNlIGlmIChmaXJzdFN0YXJ0VmFsdWVUZXh0ICE9PSBzdGFydFRleHQpIHtcbiAgICAgICAgcmVzZXRTdGFydFRleHQoKTtcbiAgICAgIH1cbiAgICAgIGlmICghZW5kVmFsdWVUZXh0cy5sZW5ndGggfHwgZW5kVmFsdWVUZXh0c1swXSA9PT0gJycpIHtcbiAgICAgICAgdHJpZ2dlckVuZFRleHRDaGFuZ2UoJycpO1xuICAgICAgfSBlbHNlIGlmIChmaXJzdEVuZFZhbHVlVGV4dCAhPT0gZW5kVGV4dCkge1xuICAgICAgICByZXNldEVuZFRleHQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFttZXJnZWRPcGVuLCBzdGFydFZhbHVlVGV4dHMsIGVuZFZhbHVlVGV4dHNdKTtcbiAgLy8gU3luYyBpbm5lclZhbHVlIHdpdGggY29udHJvbCBtb2RlXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc2V0U2VsZWN0ZWRWYWx1ZShtZXJnZWRWYWx1ZSk7XG4gIH0sIFtzdGFydFN0ciwgZW5kU3RyXSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gV2FybmluZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKHZhbHVlICYmIEFycmF5LmlzQXJyYXkoZGlzYWJsZWQpICYmIChnZXRWYWx1ZShkaXNhYmxlZCwgMCkgJiYgIWdldFZhbHVlKHZhbHVlLCAwKSB8fCBnZXRWYWx1ZShkaXNhYmxlZCwgMSkgJiYgIWdldFZhbHVlKHZhbHVlLCAxKSkpIHtcbiAgICAgIHdhcm5pbmcoZmFsc2UsICdgZGlzYWJsZWRgIHNob3VsZCBub3Qgc2V0IHdpdGggZW1wdHkgYHZhbHVlYC4gWW91IHNob3VsZCBzZXQgYGFsbG93RW1wdHlgIG9yIGB2YWx1ZWAgaW5zdGVhZC4nKTtcbiAgICB9XG4gIH1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBQcml2YXRlID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgaWYgKHBpY2tlclJlZikge1xuICAgIHBpY2tlclJlZi5jdXJyZW50ID0ge1xuICAgICAgZm9jdXM6IGZ1bmN0aW9uIGZvY3VzKCkge1xuICAgICAgICBpZiAoc3RhcnRJbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgc3RhcnRJbnB1dFJlZi5jdXJyZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBibHVyOiBmdW5jdGlvbiBibHVyKCkge1xuICAgICAgICBpZiAoc3RhcnRJbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgc3RhcnRJbnB1dFJlZi5jdXJyZW50LmJsdXIoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kSW5wdXRSZWYuY3VycmVudCkge1xuICAgICAgICAgIGVuZElucHV0UmVmLmN1cnJlbnQuYmx1cigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJhbmdlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgcmFuZ2VMYWJlbHMgPSBPYmplY3Qua2V5cyhyYW5nZXMgfHwge30pO1xuICB2YXIgcmFuZ2VMaXN0ID0gcmFuZ2VMYWJlbHMubWFwKGZ1bmN0aW9uIChsYWJlbCkge1xuICAgIHZhciByYW5nZSA9IHJhbmdlc1tsYWJlbF07XG4gICAgdmFyIG5ld1ZhbHVlcyA9IHR5cGVvZiByYW5nZSA9PT0gJ2Z1bmN0aW9uJyA/IHJhbmdlKCkgOiByYW5nZTtcbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWw6IGxhYmVsLFxuICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgdHJpZ2dlckNoYW5nZShuZXdWYWx1ZXMsIG51bGwpO1xuICAgICAgICBfdHJpZ2dlck9wZW4oZmFsc2UsIG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4KTtcbiAgICAgIH0sXG4gICAgICBvbk1vdXNlRW50ZXI6IGZ1bmN0aW9uIG9uTW91c2VFbnRlcigpIHtcbiAgICAgICAgc2V0UmFuZ2VIb3ZlclZhbHVlKG5ld1ZhbHVlcyk7XG4gICAgICB9LFxuICAgICAgb25Nb3VzZUxlYXZlOiBmdW5jdGlvbiBvbk1vdXNlTGVhdmUoKSB7XG4gICAgICAgIHNldFJhbmdlSG92ZXJWYWx1ZShudWxsKTtcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUGFuZWwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZnVuY3Rpb24gcmVuZGVyUGFuZWwoKSB7XG4gICAgdmFyIHBhbmVsUG9zaXRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuICAgIHZhciBwYW5lbFByb3BzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICB2YXIgcGFuZWxIb3ZlclJhbmdlZFZhbHVlID0gbnVsbDtcbiAgICBpZiAobWVyZ2VkT3BlbiAmJiBob3ZlclJhbmdlZFZhbHVlICYmIGhvdmVyUmFuZ2VkVmFsdWVbMF0gJiYgaG92ZXJSYW5nZWRWYWx1ZVsxXSAmJiBnZW5lcmF0ZUNvbmZpZy5pc0FmdGVyKGhvdmVyUmFuZ2VkVmFsdWVbMV0sIGhvdmVyUmFuZ2VkVmFsdWVbMF0pKSB7XG4gICAgICBwYW5lbEhvdmVyUmFuZ2VkVmFsdWUgPSBob3ZlclJhbmdlZFZhbHVlO1xuICAgIH1cbiAgICB2YXIgcGFuZWxTaG93VGltZSA9IHNob3dUaW1lO1xuICAgIGlmIChzaG93VGltZSAmJiBfdHlwZW9mKHNob3dUaW1lKSA9PT0gJ29iamVjdCcgJiYgc2hvd1RpbWUuZGVmYXVsdFZhbHVlKSB7XG4gICAgICB2YXIgdGltZURlZmF1bHRWYWx1ZXMgPSBzaG93VGltZS5kZWZhdWx0VmFsdWU7XG4gICAgICBwYW5lbFNob3dUaW1lID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzaG93VGltZSksIHt9LCB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFsdWUodGltZURlZmF1bHRWYWx1ZXMsIG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4KSB8fCB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgIH1cbiAgICB2YXIgcGFuZWxEYXRlUmVuZGVyID0gbnVsbDtcbiAgICBpZiAoZGF0ZVJlbmRlcikge1xuICAgICAgcGFuZWxEYXRlUmVuZGVyID0gZnVuY3Rpb24gcGFuZWxEYXRlUmVuZGVyKGRhdGUsIHRvZGF5KSB7XG4gICAgICAgIHJldHVybiBkYXRlUmVuZGVyKGRhdGUsIHRvZGF5LCB7XG4gICAgICAgICAgcmFuZ2U6IG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4ID8gJ2VuZCcgOiAnc3RhcnQnXG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJhbmdlQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgdmFsdWU6IHtcbiAgICAgICAgaW5SYW5nZTogdHJ1ZSxcbiAgICAgICAgcGFuZWxQb3NpdGlvbjogcGFuZWxQb3NpdGlvbixcbiAgICAgICAgcmFuZ2VkVmFsdWU6IHJhbmdlSG92ZXJWYWx1ZSB8fCBzZWxlY3RlZFZhbHVlLFxuICAgICAgICBob3ZlclJhbmdlZFZhbHVlOiBwYW5lbEhvdmVyUmFuZ2VkVmFsdWVcbiAgICAgIH1cbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQaWNrZXJQYW5lbCwgX2V4dGVuZHMoe30sIHByb3BzLCBwYW5lbFByb3BzLCB7XG4gICAgICBkYXRlUmVuZGVyOiBwYW5lbERhdGVSZW5kZXIsXG4gICAgICBzaG93VGltZTogcGFuZWxTaG93VGltZSxcbiAgICAgIG1vZGU6IG1lcmdlZE1vZGVzW21lcmdlZEFjdGl2ZVBpY2tlckluZGV4XSxcbiAgICAgIGdlbmVyYXRlQ29uZmlnOiBnZW5lcmF0ZUNvbmZpZyxcbiAgICAgIHN0eWxlOiB1bmRlZmluZWQsXG4gICAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICAgIGRpc2FibGVkRGF0ZTogbWVyZ2VkQWN0aXZlUGlja2VySW5kZXggPT09IDAgPyBkaXNhYmxlZFN0YXJ0RGF0ZSA6IGRpc2FibGVkRW5kRGF0ZSxcbiAgICAgIGRpc2FibGVkVGltZTogZnVuY3Rpb24gZGlzYWJsZWRUaW1lKGRhdGUpIHtcbiAgICAgICAgaWYgKF9kaXNhYmxlZFRpbWUpIHtcbiAgICAgICAgICByZXR1cm4gX2Rpc2FibGVkVGltZShkYXRlLCBtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCA9PT0gMCA/ICdzdGFydCcgOiAnZW5kJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGFuZWwtZm9jdXNlZFwiKSwgbWVyZ2VkQWN0aXZlUGlja2VySW5kZXggPT09IDAgPyAhc3RhcnRUeXBpbmcgOiAhZW5kVHlwaW5nKSksXG4gICAgICB2YWx1ZTogZ2V0VmFsdWUoc2VsZWN0ZWRWYWx1ZSwgbWVyZ2VkQWN0aXZlUGlja2VySW5kZXgpLFxuICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICB0YWJJbmRleDogLTEsXG4gICAgICBvblBhbmVsQ2hhbmdlOiBmdW5jdGlvbiBvblBhbmVsQ2hhbmdlKGRhdGUsIG5ld01vZGUpIHtcbiAgICAgICAgLy8gY2xlYXIgaG92ZXIgdmFsdWUgd2hlbiBwYW5lbCBjaGFuZ2VcbiAgICAgICAgaWYgKG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4ID09PSAwKSB7XG4gICAgICAgICAgb25TdGFydExlYXZlKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCA9PT0gMSkge1xuICAgICAgICAgIG9uRW5kTGVhdmUodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlck1vZGVzQ2hhbmdlKHVwZGF0ZVZhbHVlcyhtZXJnZWRNb2RlcywgbmV3TW9kZSwgbWVyZ2VkQWN0aXZlUGlja2VySW5kZXgpLCB1cGRhdGVWYWx1ZXMoc2VsZWN0ZWRWYWx1ZSwgZGF0ZSwgbWVyZ2VkQWN0aXZlUGlja2VySW5kZXgpKTtcbiAgICAgICAgdmFyIHZpZXdEYXRlID0gZGF0ZTtcbiAgICAgICAgaWYgKHBhbmVsUG9zaXRpb24gPT09ICdyaWdodCcgJiYgbWVyZ2VkTW9kZXNbbWVyZ2VkQWN0aXZlUGlja2VySW5kZXhdID09PSBuZXdNb2RlKSB7XG4gICAgICAgICAgdmlld0RhdGUgPSBnZXRDbG9zaW5nVmlld0RhdGUodmlld0RhdGUsIG5ld01vZGUsIGdlbmVyYXRlQ29uZmlnLCAtMSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0Vmlld0RhdGUodmlld0RhdGUsIG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4KTtcbiAgICAgIH0sXG4gICAgICBvbk9rOiBudWxsLFxuICAgICAgb25TZWxlY3Q6IHVuZGVmaW5lZCxcbiAgICAgIG9uQ2hhbmdlOiB1bmRlZmluZWQsXG4gICAgICBkZWZhdWx0VmFsdWU6IG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4ID09PSAwID8gZ2V0VmFsdWUoc2VsZWN0ZWRWYWx1ZSwgMSkgOiBnZXRWYWx1ZShzZWxlY3RlZFZhbHVlLCAwKVxuICAgIH0pKSk7XG4gIH1cbiAgdmFyIGFycm93TGVmdCA9IDA7XG4gIHZhciBwYW5lbExlZnQgPSAwO1xuICBpZiAobWVyZ2VkQWN0aXZlUGlja2VySW5kZXggJiYgc3RhcnRJbnB1dERpdlJlZi5jdXJyZW50ICYmIHNlcGFyYXRvclJlZi5jdXJyZW50ICYmIHBhbmVsRGl2UmVmLmN1cnJlbnQpIHtcbiAgICAvLyBBcnJvdyBvZmZzZXRcbiAgICBhcnJvd0xlZnQgPSBzdGFydElucHV0RGl2UmVmLmN1cnJlbnQub2Zmc2V0V2lkdGggKyBzZXBhcmF0b3JSZWYuY3VycmVudC5vZmZzZXRXaWR0aDtcbiAgICAvLyBJZiBwYW5lbFdpZHRoIC0gYXJyb3dXaWR0aCAtIGFycm93TWFyZ2luTGVmdCA8IGFycm93TGVmdCwgcGFuZWwgc2hvdWxkIG1vdmUgdG8gcmlnaHQgc2lkZS5cbiAgICAvLyBJZiBhcnJvd09mZnNldExlZnQgPiBhcnJvd0xlZnQsIGFycm93TWFyZ2luTGVmdCA9IGFycm93T2Zmc2V0TGVmdCAtIGFycm93TGVmdFxuICAgIHZhciBhcnJvd01hcmdpbkxlZnQgPSBhcnJvd1JlZi5jdXJyZW50Lm9mZnNldExlZnQgPiBhcnJvd0xlZnQgPyBhcnJvd1JlZi5jdXJyZW50Lm9mZnNldExlZnQgLSBhcnJvd0xlZnQgOiBhcnJvd1JlZi5jdXJyZW50Lm9mZnNldExlZnQ7XG4gICAgaWYgKHBhbmVsRGl2UmVmLmN1cnJlbnQub2Zmc2V0V2lkdGggJiYgYXJyb3dSZWYuY3VycmVudC5vZmZzZXRXaWR0aCAmJiBhcnJvd0xlZnQgPiBwYW5lbERpdlJlZi5jdXJyZW50Lm9mZnNldFdpZHRoIC0gYXJyb3dSZWYuY3VycmVudC5vZmZzZXRXaWR0aCAtIChkaXJlY3Rpb24gPT09ICdydGwnID8gMCA6IGFycm93TWFyZ2luTGVmdCkpIHtcbiAgICAgIHBhbmVsTGVmdCA9IGFycm93TGVmdDtcbiAgICB9XG4gIH1cbiAgdmFyIGFycm93UG9zaXRpb25TdHlsZSA9IGRpcmVjdGlvbiA9PT0gJ3J0bCcgPyB7XG4gICAgcmlnaHQ6IGFycm93TGVmdFxuICB9IDoge1xuICAgIGxlZnQ6IGFycm93TGVmdFxuICB9O1xuICBmdW5jdGlvbiByZW5kZXJQYW5lbHMoKSB7XG4gICAgdmFyIHBhbmVscztcbiAgICB2YXIgZXh0cmFOb2RlID0gZ2V0RXh0cmFGb290ZXIocHJlZml4Q2xzLCBtZXJnZWRNb2Rlc1ttZXJnZWRBY3RpdmVQaWNrZXJJbmRleF0sIHJlbmRlckV4dHJhRm9vdGVyKTtcbiAgICB2YXIgcmFuZ2VzTm9kZSA9IGdldFJhbmdlcyh7XG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIGNvbXBvbmVudHM6IGNvbXBvbmVudHMsXG4gICAgICBuZWVkQ29uZmlybUJ1dHRvbjogbmVlZENvbmZpcm1CdXR0b24sXG4gICAgICBva0Rpc2FibGVkOiAhZ2V0VmFsdWUoc2VsZWN0ZWRWYWx1ZSwgbWVyZ2VkQWN0aXZlUGlja2VySW5kZXgpIHx8IGRpc2FibGVkRGF0ZSAmJiBkaXNhYmxlZERhdGUoc2VsZWN0ZWRWYWx1ZVttZXJnZWRBY3RpdmVQaWNrZXJJbmRleF0pLFxuICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICByYW5nZUxpc3Q6IHJhbmdlTGlzdCxcbiAgICAgIG9uT2s6IGZ1bmN0aW9uIG9uT2soKSB7XG4gICAgICAgIGlmIChnZXRWYWx1ZShzZWxlY3RlZFZhbHVlLCBtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCkpIHtcbiAgICAgICAgICAvLyB0cmlnZ2VyQ2hhbmdlT2xkKHNlbGVjdGVkVmFsdWUpO1xuICAgICAgICAgIHRyaWdnZXJDaGFuZ2Uoc2VsZWN0ZWRWYWx1ZSwgbWVyZ2VkQWN0aXZlUGlja2VySW5kZXgpO1xuICAgICAgICAgIGlmIChfb25Paykge1xuICAgICAgICAgICAgX29uT2soc2VsZWN0ZWRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHBpY2tlciAhPT0gJ3RpbWUnICYmICFzaG93VGltZSkge1xuICAgICAgdmFyIHZpZXdEYXRlID0gZ2V0Vmlld0RhdGUobWVyZ2VkQWN0aXZlUGlja2VySW5kZXgpO1xuICAgICAgdmFyIG5leHRWaWV3RGF0ZSA9IGdldENsb3NpbmdWaWV3RGF0ZSh2aWV3RGF0ZSwgcGlja2VyLCBnZW5lcmF0ZUNvbmZpZyk7XG4gICAgICB2YXIgY3VycmVudE1vZGUgPSBtZXJnZWRNb2Rlc1ttZXJnZWRBY3RpdmVQaWNrZXJJbmRleF07XG4gICAgICB2YXIgc2hvd0RvdWJsZVBhbmVsID0gY3VycmVudE1vZGUgPT09IHBpY2tlcjtcbiAgICAgIHZhciBsZWZ0UGFuZWwgPSByZW5kZXJQYW5lbChzaG93RG91YmxlUGFuZWwgPyAnbGVmdCcgOiBmYWxzZSwge1xuICAgICAgICBwaWNrZXJWYWx1ZTogdmlld0RhdGUsXG4gICAgICAgIG9uUGlja2VyVmFsdWVDaGFuZ2U6IGZ1bmN0aW9uIG9uUGlja2VyVmFsdWVDaGFuZ2UobmV3Vmlld0RhdGUpIHtcbiAgICAgICAgICBzZXRWaWV3RGF0ZShuZXdWaWV3RGF0ZSwgbWVyZ2VkQWN0aXZlUGlja2VySW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHZhciByaWdodFBhbmVsID0gcmVuZGVyUGFuZWwoJ3JpZ2h0Jywge1xuICAgICAgICBwaWNrZXJWYWx1ZTogbmV4dFZpZXdEYXRlLFxuICAgICAgICBvblBpY2tlclZhbHVlQ2hhbmdlOiBmdW5jdGlvbiBvblBpY2tlclZhbHVlQ2hhbmdlKG5ld1ZpZXdEYXRlKSB7XG4gICAgICAgICAgc2V0Vmlld0RhdGUoZ2V0Q2xvc2luZ1ZpZXdEYXRlKG5ld1ZpZXdEYXRlLCBwaWNrZXIsIGdlbmVyYXRlQ29uZmlnLCAtMSksIG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoZGlyZWN0aW9uID09PSAncnRsJykge1xuICAgICAgICBwYW5lbHMgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgcmlnaHRQYW5lbCwgc2hvd0RvdWJsZVBhbmVsICYmIGxlZnRQYW5lbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYW5lbHMgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgbGVmdFBhbmVsLCBzaG93RG91YmxlUGFuZWwgJiYgcmlnaHRQYW5lbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhbmVscyA9IHJlbmRlclBhbmVsKCk7XG4gICAgfVxuICAgIHZhciBtZXJnZWROb2RlcyA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGFuZWxzXCIpXG4gICAgfSwgcGFuZWxzKSwgKGV4dHJhTm9kZSB8fCByYW5nZXNOb2RlKSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZm9vdGVyXCIpXG4gICAgfSwgZXh0cmFOb2RlLCByYW5nZXNOb2RlKSk7XG4gICAgaWYgKHBhbmVsUmVuZGVyKSB7XG4gICAgICBtZXJnZWROb2RlcyA9IHBhbmVsUmVuZGVyKG1lcmdlZE5vZGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wYW5lbC1jb250YWluZXJcIiksXG4gICAgICBzdHlsZToge1xuICAgICAgICBtYXJnaW5MZWZ0OiBwYW5lbExlZnRcbiAgICAgIH0sXG4gICAgICByZWY6IHBhbmVsRGl2UmVmLFxuICAgICAgb25Nb3VzZURvd246IGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH0sIG1lcmdlZE5vZGVzKTtcbiAgfVxuICB2YXIgcmFuZ2VQYW5lbCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1yYW5nZS13cmFwcGVyXCIpLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQocGlja2VyLCBcIi1yYW5nZS13cmFwcGVyXCIpKSxcbiAgICBzdHlsZToge1xuICAgICAgbWluV2lkdGg6IHBvcHVwTWluV2lkdGhcbiAgICB9XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICByZWY6IGFycm93UmVmLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1yYW5nZS1hcnJvd1wiKSxcbiAgICBzdHlsZTogYXJyb3dQb3NpdGlvblN0eWxlXG4gIH0pLCByZW5kZXJQYW5lbHMoKSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEljb25zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBzdWZmaXhOb2RlO1xuICBpZiAoc3VmZml4SWNvbikge1xuICAgIHN1ZmZpeE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN1ZmZpeFwiKVxuICAgIH0sIHN1ZmZpeEljb24pO1xuICB9XG4gIHZhciBjbGVhck5vZGU7XG4gIGlmIChhbGxvd0NsZWFyICYmIChnZXRWYWx1ZShtZXJnZWRWYWx1ZSwgMCkgJiYgIW1lcmdlZERpc2FibGVkWzBdIHx8IGdldFZhbHVlKG1lcmdlZFZhbHVlLCAxKSAmJiAhbWVyZ2VkRGlzYWJsZWRbMV0pKSB7XG4gICAgY2xlYXJOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIG9uTW91c2VEb3duOiBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH0sXG4gICAgICBvbk1vdXNlVXA6IGZ1bmN0aW9uIG9uTW91c2VVcChlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdmFyIHZhbHVlcyA9IG1lcmdlZFZhbHVlO1xuICAgICAgICBpZiAoIW1lcmdlZERpc2FibGVkWzBdKSB7XG4gICAgICAgICAgdmFsdWVzID0gdXBkYXRlVmFsdWVzKHZhbHVlcywgbnVsbCwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtZXJnZWREaXNhYmxlZFsxXSkge1xuICAgICAgICAgIHZhbHVlcyA9IHVwZGF0ZVZhbHVlcyh2YWx1ZXMsIG51bGwsIDEpO1xuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJDaGFuZ2UodmFsdWVzLCBudWxsKTtcbiAgICAgICAgX3RyaWdnZXJPcGVuKGZhbHNlLCBtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCk7XG4gICAgICB9LFxuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNsZWFyXCIpXG4gICAgfSwgY2xlYXJJY29uIHx8IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2xlYXItYnRuXCIpXG4gICAgfSkpO1xuICB9XG4gIHZhciBpbnB1dFNoYXJlZFByb3BzID0ge1xuICAgIHNpemU6IGdldElucHV0U2l6ZShwaWNrZXIsIGZvcm1hdExpc3RbMF0sIGdlbmVyYXRlQ29uZmlnKVxuICB9O1xuICB2YXIgYWN0aXZlQmFyTGVmdCA9IDA7XG4gIHZhciBhY3RpdmVCYXJXaWR0aCA9IDA7XG4gIGlmIChzdGFydElucHV0RGl2UmVmLmN1cnJlbnQgJiYgZW5kSW5wdXREaXZSZWYuY3VycmVudCAmJiBzZXBhcmF0b3JSZWYuY3VycmVudCkge1xuICAgIGlmIChtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCA9PT0gMCkge1xuICAgICAgYWN0aXZlQmFyV2lkdGggPSBzdGFydElucHV0RGl2UmVmLmN1cnJlbnQub2Zmc2V0V2lkdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdGl2ZUJhckxlZnQgPSBhcnJvd0xlZnQ7XG4gICAgICBhY3RpdmVCYXJXaWR0aCA9IGVuZElucHV0RGl2UmVmLmN1cnJlbnQub2Zmc2V0V2lkdGg7XG4gICAgfVxuICB9XG4gIHZhciBhY3RpdmVCYXJQb3NpdGlvblN0eWxlID0gZGlyZWN0aW9uID09PSAncnRsJyA/IHtcbiAgICByaWdodDogYWN0aXZlQmFyTGVmdFxuICB9IDoge1xuICAgIGxlZnQ6IGFjdGl2ZUJhckxlZnRcbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZXR1cm4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG9uQ29udGV4dFNlbGVjdCA9IGZ1bmN0aW9uIG9uQ29udGV4dFNlbGVjdChkYXRlLCB0eXBlKSB7XG4gICAgdmFyIHZhbHVlcyA9IHVwZGF0ZVZhbHVlcyhzZWxlY3RlZFZhbHVlLCBkYXRlLCBtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCk7XG4gICAgaWYgKHR5cGUgPT09ICdzdWJtaXQnIHx8IHR5cGUgIT09ICdrZXknICYmICFuZWVkQ29uZmlybUJ1dHRvbikge1xuICAgICAgLy8gdHJpZ2dlckNoYW5nZSB3aWxsIGFsc28gdXBkYXRlIHNlbGVjdGVkIHZhbHVlc1xuICAgICAgdHJpZ2dlckNoYW5nZSh2YWx1ZXMsIG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4KTtcbiAgICAgIC8vIGNsZWFyIGhvdmVyIHZhbHVlIHN0eWxlXG4gICAgICBpZiAobWVyZ2VkQWN0aXZlUGlja2VySW5kZXggPT09IDApIHtcbiAgICAgICAgb25TdGFydExlYXZlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbkVuZExlYXZlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFNlbGVjdGVkVmFsdWUodmFsdWVzKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQYW5lbENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZToge1xuICAgICAgb3BlcmF0aW9uUmVmOiBvcGVyYXRpb25SZWYsXG4gICAgICBoaWRlSGVhZGVyOiBwaWNrZXIgPT09ICd0aW1lJyxcbiAgICAgIG9uRGF0ZU1vdXNlRW50ZXI6IG9uRGF0ZU1vdXNlRW50ZXIsXG4gICAgICBvbkRhdGVNb3VzZUxlYXZlOiBvbkRhdGVNb3VzZUxlYXZlLFxuICAgICAgaGlkZVJhbmdlczogdHJ1ZSxcbiAgICAgIG9uU2VsZWN0OiBvbkNvbnRleHRTZWxlY3QsXG4gICAgICBvcGVuOiBtZXJnZWRPcGVuXG4gICAgfVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQaWNrZXJUcmlnZ2VyLCB7XG4gICAgdmlzaWJsZTogbWVyZ2VkT3BlbixcbiAgICBwb3B1cEVsZW1lbnQ6IHJhbmdlUGFuZWwsXG4gICAgcG9wdXBTdHlsZTogcG9wdXBTdHlsZSxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBkcm9wZG93bkNsYXNzTmFtZTogZHJvcGRvd25DbGFzc05hbWUsXG4gICAgZHJvcGRvd25BbGlnbjogZHJvcGRvd25BbGlnbixcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXIsXG4gICAgdHJhbnNpdGlvbk5hbWU6IHRyYW5zaXRpb25OYW1lLFxuICAgIHJhbmdlOiB0cnVlLFxuICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICByZWY6IGNvbnRhaW5lclJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJhbmdlXCIpLCBjbGFzc05hbWUsIChfY2xhc3NOYW1lczIgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kaXNhYmxlZFwiKSwgbWVyZ2VkRGlzYWJsZWRbMF0gJiYgbWVyZ2VkRGlzYWJsZWRbMV0pLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWZvY3VzZWRcIiksIG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4ID09PSAwID8gc3RhcnRGb2N1c2VkIDogZW5kRm9jdXNlZCksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX2NsYXNzTmFtZXMyKSksXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIG9uQ2xpY2s6IG9uUGlja2VyQ2xpY2ssXG4gICAgb25Nb3VzZUVudGVyOiBvbk1vdXNlRW50ZXIsXG4gICAgb25Nb3VzZUxlYXZlOiBvbk1vdXNlTGVhdmUsXG4gICAgb25Nb3VzZURvd246IG9uUGlja2VyTW91c2VEb3duLFxuICAgIG9uTW91c2VVcDogb25Nb3VzZVVwXG4gIH0sIGdldERhdGFPckFyaWFQcm9wcyhwcm9wcykpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5wdXRcIiksIChfY2xhc3NOYW1lczMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbnB1dC1hY3RpdmVcIiksIG1lcmdlZEFjdGl2ZVBpY2tlckluZGV4ID09PSAwKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbnB1dC1wbGFjZWhvbGRlclwiKSwgISFzdGFydEhvdmVyVmFsdWUpLCBfY2xhc3NOYW1lczMpKSxcbiAgICByZWY6IHN0YXJ0SW5wdXREaXZSZWZcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCBfZXh0ZW5kcyh7XG4gICAgaWQ6IGlkLFxuICAgIGRpc2FibGVkOiBtZXJnZWREaXNhYmxlZFswXSxcbiAgICByZWFkT25seTogaW5wdXRSZWFkT25seSB8fCB0eXBlb2YgZm9ybWF0TGlzdFswXSA9PT0gJ2Z1bmN0aW9uJyB8fCAhc3RhcnRUeXBpbmcsXG4gICAgdmFsdWU6IHN0YXJ0SG92ZXJWYWx1ZSB8fCBzdGFydFRleHQsXG4gICAgb25DaGFuZ2U6IGZ1bmN0aW9uIG9uQ2hhbmdlKGUpIHtcbiAgICAgIHRyaWdnZXJTdGFydFRleHRDaGFuZ2UoZS50YXJnZXQudmFsdWUpO1xuICAgIH0sXG4gICAgYXV0b0ZvY3VzOiBhdXRvRm9jdXMsXG4gICAgcGxhY2Vob2xkZXI6IGdldFZhbHVlKHBsYWNlaG9sZGVyLCAwKSB8fCAnJyxcbiAgICByZWY6IHN0YXJ0SW5wdXRSZWZcbiAgfSwgc3RhcnRJbnB1dFByb3BzLCBpbnB1dFNoYXJlZFByb3BzLCB7XG4gICAgYXV0b0NvbXBsZXRlOiBhdXRvQ29tcGxldGVcbiAgfSkpKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1yYW5nZS1zZXBhcmF0b3JcIiksXG4gICAgcmVmOiBzZXBhcmF0b3JSZWZcbiAgfSwgc2VwYXJhdG9yKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWlucHV0XCIpLCAoX2NsYXNzTmFtZXM0ID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczQsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5wdXQtYWN0aXZlXCIpLCBtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCA9PT0gMSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczQsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5wdXQtcGxhY2Vob2xkZXJcIiksICEhZW5kSG92ZXJWYWx1ZSksIF9jbGFzc05hbWVzNCkpLFxuICAgIHJlZjogZW5kSW5wdXREaXZSZWZcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCBfZXh0ZW5kcyh7XG4gICAgZGlzYWJsZWQ6IG1lcmdlZERpc2FibGVkWzFdLFxuICAgIHJlYWRPbmx5OiBpbnB1dFJlYWRPbmx5IHx8IHR5cGVvZiBmb3JtYXRMaXN0WzBdID09PSAnZnVuY3Rpb24nIHx8ICFlbmRUeXBpbmcsXG4gICAgdmFsdWU6IGVuZEhvdmVyVmFsdWUgfHwgZW5kVGV4dCxcbiAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZSkge1xuICAgICAgdHJpZ2dlckVuZFRleHRDaGFuZ2UoZS50YXJnZXQudmFsdWUpO1xuICAgIH0sXG4gICAgcGxhY2Vob2xkZXI6IGdldFZhbHVlKHBsYWNlaG9sZGVyLCAxKSB8fCAnJyxcbiAgICByZWY6IGVuZElucHV0UmVmXG4gIH0sIGVuZElucHV0UHJvcHMsIGlucHV0U2hhcmVkUHJvcHMsIHtcbiAgICBhdXRvQ29tcGxldGU6IGF1dG9Db21wbGV0ZVxuICB9KSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFjdGl2ZS1iYXJcIiksXG4gICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgYWN0aXZlQmFyUG9zaXRpb25TdHlsZSksIHt9LCB7XG4gICAgICB3aWR0aDogYWN0aXZlQmFyV2lkdGgsXG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xuICAgIH0pXG4gIH0pLCBzdWZmaXhOb2RlLCBjbGVhck5vZGUpKSk7XG59XG4vLyBXcmFwIHdpdGggY2xhc3MgY29tcG9uZW50IHRvIGVuYWJsZSBwYXNzIGdlbmVyaWMgd2l0aCBpbnN0YW5jZSBtZXRob2RcbnZhciBSYW5nZVBpY2tlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoUmFuZ2VQaWNrZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFJhbmdlUGlja2VyKTtcbiAgZnVuY3Rpb24gUmFuZ2VQaWNrZXIoKSB7XG4gICAgdmFyIF90aGlzO1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSYW5nZVBpY2tlcik7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsLmFwcGx5KF9zdXBlciwgW3RoaXNdLmNvbmNhdChhcmdzKSk7XG4gICAgX3RoaXMucGlja2VyUmVmID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZVJlZigpO1xuICAgIF90aGlzLmZvY3VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLnBpY2tlclJlZi5jdXJyZW50KSB7XG4gICAgICAgIF90aGlzLnBpY2tlclJlZi5jdXJyZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBfdGhpcy5ibHVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLnBpY2tlclJlZi5jdXJyZW50KSB7XG4gICAgICAgIF90aGlzLnBpY2tlclJlZi5jdXJyZW50LmJsdXIoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICBfY3JlYXRlQ2xhc3MoUmFuZ2VQaWNrZXIsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSW5uZXJSYW5nZVBpY2tlciwgX2V4dGVuZHMoe30sIHRoaXMucHJvcHMsIHtcbiAgICAgICAgcGlja2VyUmVmOiB0aGlzLnBpY2tlclJlZlxuICAgICAgfSkpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gUmFuZ2VQaWNrZXI7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5leHBvcnQgZGVmYXVsdCBSYW5nZVBpY2tlcjsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgUmFkaW9Hcm91cENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmV4cG9ydCB2YXIgUmFkaW9Hcm91cENvbnRleHRQcm92aWRlciA9IFJhZGlvR3JvdXBDb250ZXh0LlByb3ZpZGVyO1xuZXhwb3J0IGRlZmF1bHQgUmFkaW9Hcm91cENvbnRleHQ7XG5leHBvcnQgdmFyIFJhZGlvT3B0aW9uVHlwZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmV4cG9ydCB2YXIgUmFkaW9PcHRpb25UeXBlQ29udGV4dFByb3ZpZGVyID0gUmFkaW9PcHRpb25UeXBlQ29udGV4dC5Qcm92aWRlcjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNcIjtcbmltcG9ydCBfY3JlYXRlU3VwZXIgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZVN1cGVyXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5cbnZhciBDaGVja2JveCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoQ2hlY2tib3gsIF9Db21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoQ2hlY2tib3gpO1xuXG4gIGZ1bmN0aW9uIENoZWNrYm94KHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENoZWNrYm94KTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcHJvcHMpO1xuXG4gICAgX3RoaXMuaGFuZGxlQ2hhbmdlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGRpc2FibGVkID0gX3RoaXMkcHJvcHMuZGlzYWJsZWQsXG4gICAgICAgICAgb25DaGFuZ2UgPSBfdGhpcyRwcm9wcy5vbkNoYW5nZTtcblxuICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCEoJ2NoZWNrZWQnIGluIF90aGlzLnByb3BzKSkge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgY2hlY2tlZDogZS50YXJnZXQuY2hlY2tlZFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICAgIG9uQ2hhbmdlKHtcbiAgICAgICAgICB0YXJnZXQ6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3RoaXMucHJvcHMpLCB7fSwge1xuICAgICAgICAgICAgY2hlY2tlZDogZS50YXJnZXQuY2hlY2tlZFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uKCkge1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbiBwcmV2ZW50RGVmYXVsdCgpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5hdGl2ZUV2ZW50OiBlLm5hdGl2ZUV2ZW50XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5zYXZlSW5wdXQgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgX3RoaXMuaW5wdXQgPSBub2RlO1xuICAgIH07XG5cbiAgICB2YXIgY2hlY2tlZCA9ICdjaGVja2VkJyBpbiBwcm9wcyA/IHByb3BzLmNoZWNrZWQgOiBwcm9wcy5kZWZhdWx0Q2hlY2tlZDtcbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGNoZWNrZWQ6IGNoZWNrZWRcbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhDaGVja2JveCwgW3tcbiAgICBrZXk6IFwiZm9jdXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZm9jdXMoKSB7XG4gICAgICB0aGlzLmlucHV0LmZvY3VzKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJsdXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYmx1cigpIHtcbiAgICAgIHRoaXMuaW5wdXQuYmx1cigpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF9jbGFzc05hbWVzO1xuXG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wczIucHJlZml4Q2xzLFxuICAgICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzMi5jbGFzc05hbWUsXG4gICAgICAgICAgc3R5bGUgPSBfdGhpcyRwcm9wczIuc3R5bGUsXG4gICAgICAgICAgbmFtZSA9IF90aGlzJHByb3BzMi5uYW1lLFxuICAgICAgICAgIGlkID0gX3RoaXMkcHJvcHMyLmlkLFxuICAgICAgICAgIHR5cGUgPSBfdGhpcyRwcm9wczIudHlwZSxcbiAgICAgICAgICBkaXNhYmxlZCA9IF90aGlzJHByb3BzMi5kaXNhYmxlZCxcbiAgICAgICAgICByZWFkT25seSA9IF90aGlzJHByb3BzMi5yZWFkT25seSxcbiAgICAgICAgICB0YWJJbmRleCA9IF90aGlzJHByb3BzMi50YWJJbmRleCxcbiAgICAgICAgICBvbkNsaWNrID0gX3RoaXMkcHJvcHMyLm9uQ2xpY2ssXG4gICAgICAgICAgb25Gb2N1cyA9IF90aGlzJHByb3BzMi5vbkZvY3VzLFxuICAgICAgICAgIG9uQmx1ciA9IF90aGlzJHByb3BzMi5vbkJsdXIsXG4gICAgICAgICAgb25LZXlEb3duID0gX3RoaXMkcHJvcHMyLm9uS2V5RG93bixcbiAgICAgICAgICBvbktleVByZXNzID0gX3RoaXMkcHJvcHMyLm9uS2V5UHJlc3MsXG4gICAgICAgICAgb25LZXlVcCA9IF90aGlzJHByb3BzMi5vbktleVVwLFxuICAgICAgICAgIGF1dG9Gb2N1cyA9IF90aGlzJHByb3BzMi5hdXRvRm9jdXMsXG4gICAgICAgICAgdmFsdWUgPSBfdGhpcyRwcm9wczIudmFsdWUsXG4gICAgICAgICAgcmVxdWlyZWQgPSBfdGhpcyRwcm9wczIucmVxdWlyZWQsXG4gICAgICAgICAgb3RoZXJzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF90aGlzJHByb3BzMiwgW1wicHJlZml4Q2xzXCIsIFwiY2xhc3NOYW1lXCIsIFwic3R5bGVcIiwgXCJuYW1lXCIsIFwiaWRcIiwgXCJ0eXBlXCIsIFwiZGlzYWJsZWRcIiwgXCJyZWFkT25seVwiLCBcInRhYkluZGV4XCIsIFwib25DbGlja1wiLCBcIm9uRm9jdXNcIiwgXCJvbkJsdXJcIiwgXCJvbktleURvd25cIiwgXCJvbktleVByZXNzXCIsIFwib25LZXlVcFwiLCBcImF1dG9Gb2N1c1wiLCBcInZhbHVlXCIsIFwicmVxdWlyZWRcIl0pO1xuXG4gICAgICB2YXIgZ2xvYmFsUHJvcHMgPSBPYmplY3Qua2V5cyhvdGhlcnMpLnJlZHVjZShmdW5jdGlvbiAocHJldiwga2V5KSB7XG4gICAgICAgIGlmIChrZXkuc3Vic3RyKDAsIDUpID09PSAnYXJpYS0nIHx8IGtleS5zdWJzdHIoMCwgNSkgPT09ICdkYXRhLScgfHwga2V5ID09PSAncm9sZScpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICBwcmV2W2tleV0gPSBvdGhlcnNba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgfSwge30pO1xuICAgICAgdmFyIGNoZWNrZWQgPSB0aGlzLnN0YXRlLmNoZWNrZWQ7XG4gICAgICB2YXIgY2xhc3NTdHJpbmcgPSBjbGFzc05hbWVzKHByZWZpeENscywgY2xhc3NOYW1lLCAoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNoZWNrZWRcIiksIGNoZWNrZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWRcIiksIGRpc2FibGVkKSwgX2NsYXNzTmFtZXMpKTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzU3RyaW5nLFxuICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgX2V4dGVuZHMoe1xuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICBpZDogaWQsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIHJlcXVpcmVkOiByZXF1aXJlZCxcbiAgICAgICAgcmVhZE9ubHk6IHJlYWRPbmx5LFxuICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgIHRhYkluZGV4OiB0YWJJbmRleCxcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWlucHV0XCIpLFxuICAgICAgICBjaGVja2VkOiAhIWNoZWNrZWQsXG4gICAgICAgIG9uQ2xpY2s6IG9uQ2xpY2ssXG4gICAgICAgIG9uRm9jdXM6IG9uRm9jdXMsXG4gICAgICAgIG9uQmx1cjogb25CbHVyLFxuICAgICAgICBvbktleVVwOiBvbktleVVwLFxuICAgICAgICBvbktleURvd246IG9uS2V5RG93bixcbiAgICAgICAgb25LZXlQcmVzczogb25LZXlQcmVzcyxcbiAgICAgICAgb25DaGFuZ2U6IHRoaXMuaGFuZGxlQ2hhbmdlLFxuICAgICAgICBhdXRvRm9jdXM6IGF1dG9Gb2N1cyxcbiAgICAgICAgcmVmOiB0aGlzLnNhdmVJbnB1dCxcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9LCBnbG9iYWxQcm9wcykpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5uZXJcIilcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKHByb3BzLCBzdGF0ZSkge1xuICAgICAgaWYgKCdjaGVja2VkJyBpbiBwcm9wcykge1xuICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdGF0ZSksIHt9LCB7XG4gICAgICAgICAgY2hlY2tlZDogcHJvcHMuY2hlY2tlZFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIENoZWNrYm94O1xufShDb21wb25lbnQpO1xuXG5DaGVja2JveC5kZWZhdWx0UHJvcHMgPSB7XG4gIHByZWZpeENsczogJ3JjLWNoZWNrYm94JyxcbiAgY2xhc3NOYW1lOiAnJyxcbiAgc3R5bGU6IHt9LFxuICB0eXBlOiAnY2hlY2tib3gnLFxuICBkZWZhdWx0Q2hlY2tlZDogZmFsc2UsXG4gIG9uRm9jdXM6IGZ1bmN0aW9uIG9uRm9jdXMoKSB7fSxcbiAgb25CbHVyOiBmdW5jdGlvbiBvbkJsdXIoKSB7fSxcbiAgb25DaGFuZ2U6IGZ1bmN0aW9uIG9uQ2hhbmdlKCkge30sXG4gIG9uS2V5RG93bjogZnVuY3Rpb24gb25LZXlEb3duKCkge30sXG4gIG9uS2V5UHJlc3M6IGZ1bmN0aW9uIG9uS2V5UHJlc3MoKSB7fSxcbiAgb25LZXlVcDogZnVuY3Rpb24gb25LZXlVcCgpIHt9XG59O1xuZXhwb3J0IGRlZmF1bHQgQ2hlY2tib3g7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJjQ2hlY2tib3ggZnJvbSAncmMtY2hlY2tib3gnO1xuaW1wb3J0IHsgY29tcG9zZVJlZiB9IGZyb20gXCJyYy11dGlsL2VzL3JlZlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IERpc2FibGVkQ29udGV4dCBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvRGlzYWJsZWRDb250ZXh0JztcbmltcG9ydCB7IEZvcm1JdGVtSW5wdXRDb250ZXh0IH0gZnJvbSAnLi4vZm9ybS9jb250ZXh0JztcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4uL191dGlsL3dhcm5pbmcnO1xuaW1wb3J0IFJhZGlvR3JvdXBDb250ZXh0LCB7IFJhZGlvT3B0aW9uVHlwZUNvbnRleHQgfSBmcm9tICcuL2NvbnRleHQnO1xudmFyIEludGVybmFsUmFkaW8gPSBmdW5jdGlvbiBJbnRlcm5hbFJhZGlvKHByb3BzLCByZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuICB2YXIgZ3JvdXBDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChSYWRpb0dyb3VwQ29udGV4dCk7XG4gIHZhciByYWRpb09wdGlvblR5cGVDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChSYWRpb09wdGlvblR5cGVDb250ZXh0KTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuICB2YXIgaW5uZXJSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgdmFyIG1lcmdlZFJlZiA9IGNvbXBvc2VSZWYocmVmLCBpbm5lclJlZik7XG4gIHZhciBfdXNlQ29udGV4dCA9IHVzZUNvbnRleHQoRm9ybUl0ZW1JbnB1dENvbnRleHQpLFxuICAgIGlzRm9ybUl0ZW1JbnB1dCA9IF91c2VDb250ZXh0LmlzRm9ybUl0ZW1JbnB1dDtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghKCdvcHRpb25UeXBlJyBpbiBwcm9wcyksICdSYWRpbycsICdgb3B0aW9uVHlwZWAgaXMgb25seSBzdXBwb3J0IGluIFJhZGlvLkdyb3VwLicpIDogdm9pZCAwO1xuICB2YXIgb25DaGFuZ2UgPSBmdW5jdGlvbiBvbkNoYW5nZShlKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICAoX2EgPSBwcm9wcy5vbkNoYW5nZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwocHJvcHMsIGUpO1xuICAgIChfYiA9IGdyb3VwQ29udGV4dCA9PT0gbnVsbCB8fCBncm91cENvbnRleHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGdyb3VwQ29udGV4dC5vbkNoYW5nZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoZ3JvdXBDb250ZXh0LCBlKTtcbiAgfTtcbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIGN1c3RvbURpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgcmVzdFByb3BzID0gX19yZXN0KHByb3BzLCBbXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiLCBcInN0eWxlXCIsIFwiZGlzYWJsZWRcIl0pO1xuICB2YXIgcmFkaW9QcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3JhZGlvJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIHByZWZpeENscyA9ICgoZ3JvdXBDb250ZXh0ID09PSBudWxsIHx8IGdyb3VwQ29udGV4dCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZ3JvdXBDb250ZXh0Lm9wdGlvblR5cGUpIHx8IHJhZGlvT3B0aW9uVHlwZUNvbnRleHQpID09PSAnYnV0dG9uJyA/IFwiXCIuY29uY2F0KHJhZGlvUHJlZml4Q2xzLCBcIi1idXR0b25cIikgOiByYWRpb1ByZWZpeENscztcbiAgdmFyIHJhZGlvUHJvcHMgPSBfZXh0ZW5kcyh7fSwgcmVzdFByb3BzKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IERpc2FibGVkID09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgZGlzYWJsZWQgPSBSZWFjdC51c2VDb250ZXh0KERpc2FibGVkQ29udGV4dCk7XG4gIHJhZGlvUHJvcHMuZGlzYWJsZWQgPSBjdXN0b21EaXNhYmxlZCB8fCBkaXNhYmxlZDtcbiAgaWYgKGdyb3VwQ29udGV4dCkge1xuICAgIHJhZGlvUHJvcHMubmFtZSA9IGdyb3VwQ29udGV4dC5uYW1lO1xuICAgIHJhZGlvUHJvcHMub25DaGFuZ2UgPSBvbkNoYW5nZTtcbiAgICByYWRpb1Byb3BzLmNoZWNrZWQgPSBwcm9wcy52YWx1ZSA9PT0gZ3JvdXBDb250ZXh0LnZhbHVlO1xuICAgIHJhZGlvUHJvcHMuZGlzYWJsZWQgPSByYWRpb1Byb3BzLmRpc2FibGVkIHx8IGdyb3VwQ29udGV4dC5kaXNhYmxlZDtcbiAgfVxuICB2YXIgd3JhcHBlckNsYXNzU3RyaW5nID0gY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXdyYXBwZXJcIiksIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd3JhcHBlci1jaGVja2VkXCIpLCByYWRpb1Byb3BzLmNoZWNrZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd3JhcHBlci1kaXNhYmxlZFwiKSwgcmFkaW9Qcm9wcy5kaXNhYmxlZCksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi13cmFwcGVyLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi13cmFwcGVyLWluLWZvcm0taXRlbVwiKSwgaXNGb3JtSXRlbUlucHV0KSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuICByZXR1cm4gKFxuICAgIC8qI19fUFVSRV9fKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganN4LWExMXkvbGFiZWwtaGFzLWFzc29jaWF0ZWQtY29udHJvbFxuICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiLCB7XG4gICAgICBjbGFzc05hbWU6IHdyYXBwZXJDbGFzc1N0cmluZyxcbiAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgIG9uTW91c2VFbnRlcjogcHJvcHMub25Nb3VzZUVudGVyLFxuICAgICAgb25Nb3VzZUxlYXZlOiBwcm9wcy5vbk1vdXNlTGVhdmVcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSY0NoZWNrYm94LCBfZXh0ZW5kcyh7fSwgcmFkaW9Qcm9wcywge1xuICAgICAgdHlwZTogXCJyYWRpb1wiLFxuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICByZWY6IG1lcmdlZFJlZlxuICAgIH0pKSwgY2hpbGRyZW4gIT09IHVuZGVmaW5lZCA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBjaGlsZHJlbikgOiBudWxsKVxuICApO1xufTtcbnZhciBSYWRpbyA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEludGVybmFsUmFkaW8pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUmFkaW8uZGlzcGxheU5hbWUgPSAnUmFkaW8nO1xufVxuZXhwb3J0IGRlZmF1bHQgUmFkaW87IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB1c2VNZXJnZWRTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZXJnZWRTdGF0ZVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgU2l6ZUNvbnRleHQgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL1NpemVDb250ZXh0JztcbmltcG9ydCBnZXREYXRhT3JBcmlhUHJvcHMgZnJvbSAnLi4vX3V0aWwvZ2V0RGF0YU9yQXJpYVByb3BzJztcbmltcG9ydCB7IFJhZGlvR3JvdXBDb250ZXh0UHJvdmlkZXIgfSBmcm9tICcuL2NvbnRleHQnO1xuaW1wb3J0IFJhZGlvIGZyb20gJy4vcmFkaW8nO1xudmFyIFJhZGlvR3JvdXAgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgX2NsYXNzTmFtZXM7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCksXG4gICAgZ2V0UHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UHJlZml4Q2xzLFxuICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcbiAgdmFyIHNpemUgPSBSZWFjdC51c2VDb250ZXh0KFNpemVDb250ZXh0KTtcbiAgdmFyIF91c2VNZXJnZWRTdGF0ZSA9IHVzZU1lcmdlZFN0YXRlKHByb3BzLmRlZmF1bHRWYWx1ZSwge1xuICAgICAgdmFsdWU6IHByb3BzLnZhbHVlXG4gICAgfSksXG4gICAgX3VzZU1lcmdlZFN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZSwgMiksXG4gICAgdmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzBdLFxuICAgIHNldFZhbHVlID0gX3VzZU1lcmdlZFN0YXRlMlsxXTtcbiAgdmFyIG9uUmFkaW9DaGFuZ2UgPSBmdW5jdGlvbiBvblJhZGlvQ2hhbmdlKGV2KSB7XG4gICAgdmFyIGxhc3RWYWx1ZSA9IHZhbHVlO1xuICAgIHZhciB2YWwgPSBldi50YXJnZXQudmFsdWU7XG4gICAgaWYgKCEoJ3ZhbHVlJyBpbiBwcm9wcykpIHtcbiAgICAgIHNldFZhbHVlKHZhbCk7XG4gICAgfVxuICAgIHZhciBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlO1xuICAgIGlmIChvbkNoYW5nZSAmJiB2YWwgIT09IGxhc3RWYWx1ZSkge1xuICAgICAgb25DaGFuZ2UoZXYpO1xuICAgIH1cbiAgfTtcbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBfcHJvcHMkY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIGNsYXNzTmFtZSA9IF9wcm9wcyRjbGFzc05hbWUgPT09IHZvaWQgMCA/ICcnIDogX3Byb3BzJGNsYXNzTmFtZSxcbiAgICBvcHRpb25zID0gcHJvcHMub3B0aW9ucyxcbiAgICBfcHJvcHMkYnV0dG9uU3R5bGUgPSBwcm9wcy5idXR0b25TdHlsZSxcbiAgICBidXR0b25TdHlsZSA9IF9wcm9wcyRidXR0b25TdHlsZSA9PT0gdm9pZCAwID8gJ291dGxpbmUnIDogX3Byb3BzJGJ1dHRvblN0eWxlLFxuICAgIGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBjdXN0b21pemVTaXplID0gcHJvcHMuc2l6ZSxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIGlkID0gcHJvcHMuaWQsXG4gICAgb25Nb3VzZUVudGVyID0gcHJvcHMub25Nb3VzZUVudGVyLFxuICAgIG9uTW91c2VMZWF2ZSA9IHByb3BzLm9uTW91c2VMZWF2ZSxcbiAgICBvbkZvY3VzID0gcHJvcHMub25Gb2N1cyxcbiAgICBvbkJsdXIgPSBwcm9wcy5vbkJsdXI7XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3JhZGlvJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIGdyb3VwUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ncm91cFwiKTtcbiAgdmFyIGNoaWxkcmVuVG9SZW5kZXIgPSBjaGlsZHJlbjtcbiAgLy8g5aaC5p6c5a2Y5ZyoIG9wdGlvbnMsIOS8mOWFiOS9v+eUqFxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICBjaGlsZHJlblRvUmVuZGVyID0gb3B0aW9ucy5tYXAoZnVuY3Rpb24gKG9wdGlvbikge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBvcHRpb24gPT09ICdudW1iZXInKSB7XG4gICAgICAgIC8vIOatpOWkhOexu+Wei+iHquWKqOaOqOWvvOS4uiBzdHJpbmdcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJhZGlvLCB7XG4gICAgICAgICAga2V5OiBvcHRpb24udG9TdHJpbmcoKSxcbiAgICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgICAgdmFsdWU6IG9wdGlvbixcbiAgICAgICAgICBjaGVja2VkOiB2YWx1ZSA9PT0gb3B0aW9uXG4gICAgICAgIH0sIG9wdGlvbik7XG4gICAgICB9XG4gICAgICAvLyDmraTlpITnsbvlnovoh6rliqjmjqjlr7zkuLogeyBsYWJlbDogc3RyaW5nIHZhbHVlOiBzdHJpbmcgfVxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJhZGlvLCB7XG4gICAgICAgIGtleTogXCJyYWRpby1ncm91cC12YWx1ZS1vcHRpb25zLVwiLmNvbmNhdChvcHRpb24udmFsdWUpLFxuICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgZGlzYWJsZWQ6IG9wdGlvbi5kaXNhYmxlZCB8fCBkaXNhYmxlZCxcbiAgICAgICAgdmFsdWU6IG9wdGlvbi52YWx1ZSxcbiAgICAgICAgY2hlY2tlZDogdmFsdWUgPT09IG9wdGlvbi52YWx1ZSxcbiAgICAgICAgc3R5bGU6IG9wdGlvbi5zdHlsZVxuICAgICAgfSwgb3B0aW9uLmxhYmVsKTtcbiAgICB9KTtcbiAgfVxuICB2YXIgbWVyZ2VkU2l6ZSA9IGN1c3RvbWl6ZVNpemUgfHwgc2l6ZTtcbiAgdmFyIGNsYXNzU3RyaW5nID0gY2xhc3NOYW1lcyhncm91cFByZWZpeENscywgXCJcIi5jb25jYXQoZ3JvdXBQcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoYnV0dG9uU3R5bGUpLCAoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChncm91cFByZWZpeENscywgXCItXCIpLmNvbmNhdChtZXJnZWRTaXplKSwgbWVyZ2VkU2l6ZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQoZ3JvdXBQcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHt9LCBnZXREYXRhT3JBcmlhUHJvcHMocHJvcHMpLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc1N0cmluZyxcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgb25Nb3VzZUVudGVyOiBvbk1vdXNlRW50ZXIsXG4gICAgb25Nb3VzZUxlYXZlOiBvbk1vdXNlTGVhdmUsXG4gICAgb25Gb2N1czogb25Gb2N1cyxcbiAgICBvbkJsdXI6IG9uQmx1cixcbiAgICBpZDogaWQsXG4gICAgcmVmOiByZWZcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJhZGlvR3JvdXBDb250ZXh0UHJvdmlkZXIsIHtcbiAgICB2YWx1ZToge1xuICAgICAgb25DaGFuZ2U6IG9uUmFkaW9DaGFuZ2UsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBkaXNhYmxlZDogcHJvcHMuZGlzYWJsZWQsXG4gICAgICBuYW1lOiBwcm9wcy5uYW1lLFxuICAgICAgb3B0aW9uVHlwZTogcHJvcHMub3B0aW9uVHlwZVxuICAgIH1cbiAgfSwgY2hpbGRyZW5Ub1JlbmRlcikpO1xufSk7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QubWVtbyhSYWRpb0dyb3VwKTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCB7IFJhZGlvT3B0aW9uVHlwZUNvbnRleHRQcm92aWRlciB9IGZyb20gJy4vY29udGV4dCc7XG5pbXBvcnQgUmFkaW8gZnJvbSAnLi9yYWRpbyc7XG52YXIgUmFkaW9CdXR0b24gPSBmdW5jdGlvbiBSYWRpb0J1dHRvbihwcm9wcywgcmVmKSB7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCksXG4gICAgZ2V0UHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UHJlZml4Q2xzO1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHJhZGlvUHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiXSk7XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3JhZGlvJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJhZGlvT3B0aW9uVHlwZUNvbnRleHRQcm92aWRlciwge1xuICAgIHZhbHVlOiBcImJ1dHRvblwiXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJhZGlvLCBfZXh0ZW5kcyh7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHNcbiAgfSwgcmFkaW9Qcm9wcywge1xuICAgIHR5cGU6IFwicmFkaW9cIixcbiAgICByZWY6IHJlZlxuICB9KSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKFJhZGlvQnV0dG9uKTsiLCJpbXBvcnQgR3JvdXAgZnJvbSAnLi9ncm91cCc7XG5pbXBvcnQgSW50ZXJuYWxSYWRpbyBmcm9tICcuL3JhZGlvJztcbmltcG9ydCBCdXR0b24gZnJvbSAnLi9yYWRpb0J1dHRvbic7XG5leHBvcnQgeyBCdXR0b24sIEdyb3VwIH07XG52YXIgUmFkaW8gPSBJbnRlcm5hbFJhZGlvO1xuUmFkaW8uQnV0dG9uID0gQnV0dG9uO1xuUmFkaW8uR3JvdXAgPSBHcm91cDtcblJhZGlvLl9fQU5UX1JBRElPID0gdHJ1ZTtcbmV4cG9ydCBkZWZhdWx0IFJhZGlvOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIEVsZW1lbnQgPSBmdW5jdGlvbiBFbGVtZW50KHByb3BzKSB7XG4gIHZhciBfY2xhc3NOYW1lcywgX2NsYXNzTmFtZXMyO1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIHNpemUgPSBwcm9wcy5zaXplLFxuICAgIHNoYXBlID0gcHJvcHMuc2hhcGU7XG4gIHZhciBzaXplQ2xzID0gY2xhc3NOYW1lcygoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxnXCIpLCBzaXplID09PSAnbGFyZ2UnKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNtXCIpLCBzaXplID09PSAnc21hbGwnKSwgX2NsYXNzTmFtZXMpKTtcbiAgdmFyIHNoYXBlQ2xzID0gY2xhc3NOYW1lcygoX2NsYXNzTmFtZXMyID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2lyY2xlXCIpLCBzaGFwZSA9PT0gJ2NpcmNsZScpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNxdWFyZVwiKSwgc2hhcGUgPT09ICdzcXVhcmUnKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1yb3VuZFwiKSwgc2hhcGUgPT09ICdyb3VuZCcpLCBfY2xhc3NOYW1lczIpKTtcbiAgdmFyIHNpemVTdHlsZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0eXBlb2Ygc2l6ZSA9PT0gJ251bWJlcicgPyB7XG4gICAgICB3aWR0aDogc2l6ZSxcbiAgICAgIGhlaWdodDogc2l6ZSxcbiAgICAgIGxpbmVIZWlnaHQ6IFwiXCIuY29uY2F0KHNpemUsIFwicHhcIilcbiAgICB9IDoge307XG4gIH0sIFtzaXplXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhwcmVmaXhDbHMsIHNpemVDbHMsIHNoYXBlQ2xzLCBjbGFzc05hbWUpLFxuICAgIHN0eWxlOiBfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgc2l6ZVN0eWxlKSwgc3R5bGUpXG4gIH0pO1xufTtcbmV4cG9ydCBkZWZhdWx0IEVsZW1lbnQ7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgb21pdCBmcm9tIFwicmMtdXRpbC9lcy9vbWl0XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCBFbGVtZW50IGZyb20gJy4vRWxlbWVudCc7XG52YXIgU2tlbGV0b25BdmF0YXIgPSBmdW5jdGlvbiBTa2VsZXRvbkF2YXRhcihwcm9wcykge1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBhY3RpdmUgPSBwcm9wcy5hY3RpdmUsXG4gICAgX3Byb3BzJHNoYXBlID0gcHJvcHMuc2hhcGUsXG4gICAgc2hhcGUgPSBfcHJvcHMkc2hhcGUgPT09IHZvaWQgMCA/ICdjaXJjbGUnIDogX3Byb3BzJHNoYXBlLFxuICAgIF9wcm9wcyRzaXplID0gcHJvcHMuc2l6ZSxcbiAgICBzaXplID0gX3Byb3BzJHNpemUgPT09IHZvaWQgMCA/ICdkZWZhdWx0JyA6IF9wcm9wcyRzaXplO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscztcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnc2tlbGV0b24nLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgb3RoZXJQcm9wcyA9IG9taXQocHJvcHMsIFsncHJlZml4Q2xzJywgJ2NsYXNzTmFtZSddKTtcbiAgdmFyIGNscyA9IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWVsZW1lbnRcIiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hY3RpdmVcIiksIGFjdGl2ZSksIGNsYXNzTmFtZSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbHNcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudCwgX2V4dGVuZHMoe1xuICAgIHByZWZpeENsczogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hdmF0YXJcIiksXG4gICAgc2hhcGU6IHNoYXBlLFxuICAgIHNpemU6IHNpemVcbiAgfSwgb3RoZXJQcm9wcykpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTa2VsZXRvbkF2YXRhcjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBvbWl0IGZyb20gXCJyYy11dGlsL2VzL29taXRcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IEVsZW1lbnQgZnJvbSAnLi9FbGVtZW50JztcbnZhciBTa2VsZXRvbkJ1dHRvbiA9IGZ1bmN0aW9uIFNrZWxldG9uQnV0dG9uKHByb3BzKSB7XG4gIHZhciBfY2xhc3NOYW1lcztcbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgYWN0aXZlID0gcHJvcHMuYWN0aXZlLFxuICAgIF9wcm9wcyRibG9jayA9IHByb3BzLmJsb2NrLFxuICAgIGJsb2NrID0gX3Byb3BzJGJsb2NrID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRibG9jayxcbiAgICBfcHJvcHMkc2l6ZSA9IHByb3BzLnNpemUsXG4gICAgc2l6ZSA9IF9wcm9wcyRzaXplID09PSB2b2lkIDAgPyAnZGVmYXVsdCcgOiBfcHJvcHMkc2l6ZTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHM7XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3NrZWxldG9uJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIG90aGVyUHJvcHMgPSBvbWl0KHByb3BzLCBbJ3ByZWZpeENscyddKTtcbiAgdmFyIGNscyA9IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWVsZW1lbnRcIiksIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYWN0aXZlXCIpLCBhY3RpdmUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYmxvY2tcIiksIGJsb2NrKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xzXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnQsIF9leHRlbmRzKHtcbiAgICBwcmVmaXhDbHM6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYnV0dG9uXCIpLFxuICAgIHNpemU6IHNpemVcbiAgfSwgb3RoZXJQcm9wcykpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTa2VsZXRvbkJ1dHRvbjsiLCIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBEb3RDaGFydE91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk04ODggNzkySDIwMFYxNjhjMC00LjQtMy42LTgtOC04aC01NmMtNC40IDAtOCAzLjYtOCA4djY4OGMwIDQuNCAzLjYgOCA4IDhoNzUyYzQuNCAwIDgtMy42IDgtOHYtNTZjMC00LjQtMy42LTgtOC04ek0yODggNjA0YTY0IDY0IDAgMTAxMjggMCA2NCA2NCAwIDEwLTEyOCAwem0xMTgtMjI0YTQ4IDQ4IDAgMTA5NiAwIDQ4IDQ4IDAgMTAtOTYgMHptMTU4IDIyOGE5NiA5NiAwIDEwMTkyIDAgOTYgOTYgMCAxMC0xOTIgMHptMTQ4LTMxNGE1NiA1NiAwIDEwMTEyIDAgNTYgNTYgMCAxMC0xMTIgMHpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImRvdC1jaGFydFwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgRG90Q2hhcnRPdXRsaW5lZDtcbiIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IERvdENoYXJ0T3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRG90Q2hhcnRPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIERvdENoYXJ0T3V0bGluZWQgPSBmdW5jdGlvbiBEb3RDaGFydE91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBEb3RDaGFydE91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5Eb3RDaGFydE91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ0RvdENoYXJ0T3V0bGluZWQnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoRG90Q2hhcnRPdXRsaW5lZCk7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBEb3RDaGFydE91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9Eb3RDaGFydE91dGxpbmVkXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xudmFyIFNrZWxldG9uTm9kZSA9IGZ1bmN0aW9uIFNrZWxldG9uTm9kZShwcm9wcykge1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIGFjdGl2ZSA9IHByb3BzLmFjdGl2ZSxcbiAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscztcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnc2tlbGV0b24nLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgY2xzID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZWxlbWVudFwiKSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFjdGl2ZVwiKSwgYWN0aXZlKSwgY2xhc3NOYW1lKTtcbiAgdmFyIGNvbnRlbnQgPSBjaGlsZHJlbiAhPT0gbnVsbCAmJiBjaGlsZHJlbiAhPT0gdm9pZCAwID8gY2hpbGRyZW4gOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEb3RDaGFydE91dGxpbmVkLCBudWxsKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsc1xuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW1hZ2VcIiksIGNsYXNzTmFtZSksXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0sIGNvbnRlbnQpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTa2VsZXRvbk5vZGU7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG52YXIgcGF0aCA9ICdNMzY1LjcxNDI4NiAzMjkuMTQyODU3cTAgNDUuNzE0Mjg2LTMyLjAzNjU3MSA3Ny42Nzc3MTR0LTc3LjY3NzcxNCAzMi4wMzY1NzEtNzcuNjc3NzE0LTMyLjAzNjU3MS0zMi4wMzY1NzEtNzcuNjc3NzE0IDMyLjAzNjU3MS03Ny42Nzc3MTQgNzcuNjc3NzE0LTMyLjAzNjU3MSA3Ny42Nzc3MTQgMzIuMDM2NTcxIDMyLjAzNjU3MSA3Ny42Nzc3MTR6TTk1MC44NTcxNDMgNTQ4LjU3MTQyOWwwIDI1Ni04MDQuNTcxNDI5IDAgMC0xMDkuNzE0Mjg2IDE4Mi44NTcxNDMtMTgyLjg1NzE0MyA5MS40Mjg1NzEgOTEuNDI4NTcxIDI5Mi41NzE0MjktMjkyLjU3MTQyOXpNMTAwNS43MTQyODYgMTQ2LjI4NTcxNGwtOTE0LjI4NTcxNCAwcS03LjQ2MDU3MSAwLTEyLjg3MzE0MyA1LjQxMjU3MXQtNS40MTI1NzEgMTIuODczMTQzbDAgNjk0Ljg1NzE0M3EwIDcuNDYwNTcxIDUuNDEyNTcxIDEyLjg3MzE0M3QxMi44NzMxNDMgNS40MTI1NzFsOTE0LjI4NTcxNCAwcTcuNDYwNTcxIDAgMTIuODczMTQzLTUuNDEyNTcxdDUuNDEyNTcxLTEyLjg3MzE0M2wwLTY5NC44NTcxNDNxMC03LjQ2MDU3MS01LjQxMjU3MS0xMi44NzMxNDN0LTEyLjg3MzE0My01LjQxMjU3MXpNMTA5Ny4xNDI4NTcgMTY0LjU3MTQyOWwwIDY5NC44NTcxNDNxMCAzNy43NDE3MTQtMjYuODQzNDI5IDY0LjU4NTE0M3QtNjQuNTg1MTQzIDI2Ljg0MzQyOWwtOTE0LjI4NTcxNCAwcS0zNy43NDE3MTQgMC02NC41ODUxNDMtMjYuODQzNDI5dC0yNi44NDM0MjktNjQuNTg1MTQzbDAtNjk0Ljg1NzE0M3EwLTM3Ljc0MTcxNCAyNi44NDM0MjktNjQuNTg1MTQzdDY0LjU4NTE0My0yNi44NDM0MjlsOTE0LjI4NTcxNCAwcTM3Ljc0MTcxNCAwIDY0LjU4NTE0MyAyNi44NDM0Mjl0MjYuODQzNDI5IDY0LjU4NTE0M3onO1xudmFyIFNrZWxldG9uSW1hZ2UgPSBmdW5jdGlvbiBTa2VsZXRvbkltYWdlKHByb3BzKSB7XG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgYWN0aXZlID0gcHJvcHMuYWN0aXZlO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscztcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnc2tlbGV0b24nLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgY2xzID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZWxlbWVudFwiKSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFjdGl2ZVwiKSwgYWN0aXZlKSwgY2xhc3NOYW1lKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsc1xuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW1hZ2VcIiksIGNsYXNzTmFtZSksXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICB2aWV3Qm94OiBcIjAgMCAxMDk4IDEwMjRcIixcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbWFnZS1zdmdcIilcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBwYXRoLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbWFnZS1wYXRoXCIpXG4gIH0pKSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFNrZWxldG9uSW1hZ2U7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgb21pdCBmcm9tIFwicmMtdXRpbC9lcy9vbWl0XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCBFbGVtZW50IGZyb20gJy4vRWxlbWVudCc7XG52YXIgU2tlbGV0b25JbnB1dCA9IGZ1bmN0aW9uIFNrZWxldG9uSW5wdXQocHJvcHMpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBhY3RpdmUgPSBwcm9wcy5hY3RpdmUsXG4gICAgYmxvY2sgPSBwcm9wcy5ibG9jayxcbiAgICBfcHJvcHMkc2l6ZSA9IHByb3BzLnNpemUsXG4gICAgc2l6ZSA9IF9wcm9wcyRzaXplID09PSB2b2lkIDAgPyAnZGVmYXVsdCcgOiBfcHJvcHMkc2l6ZTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHM7XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3NrZWxldG9uJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIG90aGVyUHJvcHMgPSBvbWl0KHByb3BzLCBbJ3ByZWZpeENscyddKTtcbiAgdmFyIGNscyA9IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWVsZW1lbnRcIiksIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYWN0aXZlXCIpLCBhY3RpdmUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYmxvY2tcIiksIGJsb2NrKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xzXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnQsIF9leHRlbmRzKHtcbiAgICBwcmVmaXhDbHM6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5wdXRcIiksXG4gICAgc2l6ZTogc2l6ZVxuICB9LCBvdGhlclByb3BzKSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFNrZWxldG9uSW5wdXQ7IiwiaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIFBhcmFncmFwaCA9IGZ1bmN0aW9uIFBhcmFncmFwaChwcm9wcykge1xuICB2YXIgZ2V0V2lkdGggPSBmdW5jdGlvbiBnZXRXaWR0aChpbmRleCkge1xuICAgIHZhciB3aWR0aCA9IHByb3BzLndpZHRoLFxuICAgICAgX3Byb3BzJHJvd3MgPSBwcm9wcy5yb3dzLFxuICAgICAgcm93cyA9IF9wcm9wcyRyb3dzID09PSB2b2lkIDAgPyAyIDogX3Byb3BzJHJvd3M7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkod2lkdGgpKSB7XG4gICAgICByZXR1cm4gd2lkdGhbaW5kZXhdO1xuICAgIH1cbiAgICAvLyBsYXN0IHBhcmFncmFwaFxuICAgIGlmIChyb3dzIC0gMSA9PT0gaW5kZXgpIHtcbiAgICAgIHJldHVybiB3aWR0aDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfTtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICByb3dzID0gcHJvcHMucm93cztcbiAgdmFyIHJvd0xpc3QgPSBfdG9Db25zdW1hYmxlQXJyYXkoQXJyYXkocm93cykpLm1hcChmdW5jdGlvbiAoXywgaW5kZXgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgLyojX19QVVJFX18qL1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L25vLWFycmF5LWluZGV4LWtleVxuICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgICAga2V5OiBpbmRleCxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICB3aWR0aDogZ2V0V2lkdGgoaW5kZXgpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInVsXCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBjbGFzc05hbWUpLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCByb3dMaXN0KTtcbn07XG5leHBvcnQgZGVmYXVsdCBQYXJhZ3JhcGg7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG4vKiBlc2xpbnQtZGlzYWJsZSBqc3gtYTExeS9oZWFkaW5nLWhhcy1jb250ZW50ICovXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbnZhciBUaXRsZSA9IGZ1bmN0aW9uIFRpdGxlKF9yZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgIHdpZHRoID0gX3JlZi53aWR0aCxcbiAgICBzdHlsZSA9IF9yZWYuc3R5bGU7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImgzXCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBjbGFzc05hbWUpLFxuICAgIHN0eWxlOiBfZXh0ZW5kcyh7XG4gICAgICB3aWR0aDogd2lkdGhcbiAgICB9LCBzdHlsZSlcbiAgfSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgVGl0bGU7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCBTa2VsZXRvbkF2YXRhciBmcm9tICcuL0F2YXRhcic7XG5pbXBvcnQgU2tlbGV0b25CdXR0b24gZnJvbSAnLi9CdXR0b24nO1xuaW1wb3J0IFNrZWxldG9uTm9kZSBmcm9tICcuL05vZGUnO1xuaW1wb3J0IEVsZW1lbnQgZnJvbSAnLi9FbGVtZW50JztcbmltcG9ydCBTa2VsZXRvbkltYWdlIGZyb20gJy4vSW1hZ2UnO1xuaW1wb3J0IFNrZWxldG9uSW5wdXQgZnJvbSAnLi9JbnB1dCc7XG5pbXBvcnQgUGFyYWdyYXBoIGZyb20gJy4vUGFyYWdyYXBoJztcbmltcG9ydCBUaXRsZSBmcm9tICcuL1RpdGxlJztcbmZ1bmN0aW9uIGdldENvbXBvbmVudFByb3BzKHByb3ApIHtcbiAgaWYgKHByb3AgJiYgX3R5cGVvZihwcm9wKSA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gcHJvcDtcbiAgfVxuICByZXR1cm4ge307XG59XG5mdW5jdGlvbiBnZXRBdmF0YXJCYXNpY1Byb3BzKGhhc1RpdGxlLCBoYXNQYXJhZ3JhcGgpIHtcbiAgaWYgKGhhc1RpdGxlICYmICFoYXNQYXJhZ3JhcGgpIHtcbiAgICAvLyBTcXVhcmUgYXZhdGFyXG4gICAgcmV0dXJuIHtcbiAgICAgIHNpemU6ICdsYXJnZScsXG4gICAgICBzaGFwZTogJ3NxdWFyZSdcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgc2l6ZTogJ2xhcmdlJyxcbiAgICBzaGFwZTogJ2NpcmNsZSdcbiAgfTtcbn1cbmZ1bmN0aW9uIGdldFRpdGxlQmFzaWNQcm9wcyhoYXNBdmF0YXIsIGhhc1BhcmFncmFwaCkge1xuICBpZiAoIWhhc0F2YXRhciAmJiBoYXNQYXJhZ3JhcGgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6ICczOCUnXG4gICAgfTtcbiAgfVxuICBpZiAoaGFzQXZhdGFyICYmIGhhc1BhcmFncmFwaCkge1xuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogJzUwJSdcbiAgICB9O1xuICB9XG4gIHJldHVybiB7fTtcbn1cbmZ1bmN0aW9uIGdldFBhcmFncmFwaEJhc2ljUHJvcHMoaGFzQXZhdGFyLCBoYXNUaXRsZSkge1xuICB2YXIgYmFzaWNQcm9wcyA9IHt9O1xuICAvLyBXaWR0aFxuICBpZiAoIWhhc0F2YXRhciB8fCAhaGFzVGl0bGUpIHtcbiAgICBiYXNpY1Byb3BzLndpZHRoID0gJzYxJSc7XG4gIH1cbiAgLy8gUm93c1xuICBpZiAoIWhhc0F2YXRhciAmJiBoYXNUaXRsZSkge1xuICAgIGJhc2ljUHJvcHMucm93cyA9IDM7XG4gIH0gZWxzZSB7XG4gICAgYmFzaWNQcm9wcy5yb3dzID0gMjtcbiAgfVxuICByZXR1cm4gYmFzaWNQcm9wcztcbn1cbnZhciBTa2VsZXRvbiA9IGZ1bmN0aW9uIFNrZWxldG9uKHByb3BzKSB7XG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgbG9hZGluZyA9IHByb3BzLmxvYWRpbmcsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBfcHJvcHMkYXZhdGFyID0gcHJvcHMuYXZhdGFyLFxuICAgIGF2YXRhciA9IF9wcm9wcyRhdmF0YXIgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGF2YXRhcixcbiAgICBfcHJvcHMkdGl0bGUgPSBwcm9wcy50aXRsZSxcbiAgICB0aXRsZSA9IF9wcm9wcyR0aXRsZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyR0aXRsZSxcbiAgICBfcHJvcHMkcGFyYWdyYXBoID0gcHJvcHMucGFyYWdyYXBoLFxuICAgIHBhcmFncmFwaCA9IF9wcm9wcyRwYXJhZ3JhcGggPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkcGFyYWdyYXBoLFxuICAgIGFjdGl2ZSA9IHByb3BzLmFjdGl2ZSxcbiAgICByb3VuZCA9IHByb3BzLnJvdW5kO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICBkaXJlY3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb247XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3NrZWxldG9uJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgaWYgKGxvYWRpbmcgfHwgISgnbG9hZGluZycgaW4gcHJvcHMpKSB7XG4gICAgdmFyIF9jbGFzc05hbWVzO1xuICAgIHZhciBoYXNBdmF0YXIgPSAhIWF2YXRhcjtcbiAgICB2YXIgaGFzVGl0bGUgPSAhIXRpdGxlO1xuICAgIHZhciBoYXNQYXJhZ3JhcGggPSAhIXBhcmFncmFwaDtcbiAgICAvLyBBdmF0YXJcbiAgICB2YXIgYXZhdGFyTm9kZTtcbiAgICBpZiAoaGFzQXZhdGFyKSB7XG4gICAgICB2YXIgYXZhdGFyUHJvcHMgPSBfZXh0ZW5kcyhfZXh0ZW5kcyh7XG4gICAgICAgIHByZWZpeENsczogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hdmF0YXJcIilcbiAgICAgIH0sIGdldEF2YXRhckJhc2ljUHJvcHMoaGFzVGl0bGUsIGhhc1BhcmFncmFwaCkpLCBnZXRDb21wb25lbnRQcm9wcyhhdmF0YXIpKTtcbiAgICAgIC8vIFdlIGRpcmVjdCB1c2UgU2tlbGV0b25FbGVtZW50IGFzIGF2YXRhciBpbiBza2VsZXRvbiBpbnRlcm5hbC5cbiAgICAgIGF2YXRhck5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oZWFkZXJcIilcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnQsIF9leHRlbmRzKHt9LCBhdmF0YXJQcm9wcykpKTtcbiAgICB9XG4gICAgdmFyIGNvbnRlbnROb2RlO1xuICAgIGlmIChoYXNUaXRsZSB8fCBoYXNQYXJhZ3JhcGgpIHtcbiAgICAgIC8vIFRpdGxlXG4gICAgICB2YXIgJHRpdGxlO1xuICAgICAgaWYgKGhhc1RpdGxlKSB7XG4gICAgICAgIHZhciB0aXRsZVByb3BzID0gX2V4dGVuZHMoX2V4dGVuZHMoe1xuICAgICAgICAgIHByZWZpeENsczogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10aXRsZVwiKVxuICAgICAgICB9LCBnZXRUaXRsZUJhc2ljUHJvcHMoaGFzQXZhdGFyLCBoYXNQYXJhZ3JhcGgpKSwgZ2V0Q29tcG9uZW50UHJvcHModGl0bGUpKTtcbiAgICAgICAgJHRpdGxlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVGl0bGUsIF9leHRlbmRzKHt9LCB0aXRsZVByb3BzKSk7XG4gICAgICB9XG4gICAgICAvLyBQYXJhZ3JhcGhcbiAgICAgIHZhciBwYXJhZ3JhcGhOb2RlO1xuICAgICAgaWYgKGhhc1BhcmFncmFwaCkge1xuICAgICAgICB2YXIgcGFyYWdyYXBoUHJvcHMgPSBfZXh0ZW5kcyhfZXh0ZW5kcyh7XG4gICAgICAgICAgcHJlZml4Q2xzOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBhcmFncmFwaFwiKVxuICAgICAgICB9LCBnZXRQYXJhZ3JhcGhCYXNpY1Byb3BzKGhhc0F2YXRhciwgaGFzVGl0bGUpKSwgZ2V0Q29tcG9uZW50UHJvcHMocGFyYWdyYXBoKSk7XG4gICAgICAgIHBhcmFncmFwaE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQYXJhZ3JhcGgsIF9leHRlbmRzKHt9LCBwYXJhZ3JhcGhQcm9wcykpO1xuICAgICAgfVxuICAgICAgY29udGVudE5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50XCIpXG4gICAgICB9LCAkdGl0bGUsIHBhcmFncmFwaE5vZGUpO1xuICAgIH1cbiAgICB2YXIgY2xzID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd2l0aC1hdmF0YXJcIiksIGhhc0F2YXRhciksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hY3RpdmVcIiksIGFjdGl2ZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcm91bmRcIiksIHJvdW5kKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IGNscyxcbiAgICAgIHN0eWxlOiBzdHlsZVxuICAgIH0sIGF2YXRhck5vZGUsIGNvbnRlbnROb2RlKTtcbiAgfVxuICByZXR1cm4gdHlwZW9mIGNoaWxkcmVuICE9PSAndW5kZWZpbmVkJyA/IGNoaWxkcmVuIDogbnVsbDtcbn07XG5Ta2VsZXRvbi5CdXR0b24gPSBTa2VsZXRvbkJ1dHRvbjtcblNrZWxldG9uLkF2YXRhciA9IFNrZWxldG9uQXZhdGFyO1xuU2tlbGV0b24uSW5wdXQgPSBTa2VsZXRvbklucHV0O1xuU2tlbGV0b24uSW1hZ2UgPSBTa2VsZXRvbkltYWdlO1xuU2tlbGV0b24uTm9kZSA9IFNrZWxldG9uTm9kZTtcbmV4cG9ydCBkZWZhdWx0IFNrZWxldG9uOyIsIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIFBsdXNPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJkZWZzXCIsIFwiYXR0cnNcIjoge30sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJzdHlsZVwiLCBcImF0dHJzXCI6IHt9IH1dIH0sIHsgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNDgyIDE1Mmg2MHE4IDAgOCA4djcwNHEwIDgtOCA4aC02MHEtOCAwLTgtOFYxNjBxMC04IDgtOHpcIiB9IH0sIHsgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNMTc2IDQ3NGg2NzJxOCAwIDggOHY2MHEwIDgtOCA4SDE3NnEtOCAwLTgtOHYtNjBxMC04IDgtOHpcIiB9IH1dIH0sIFwibmFtZVwiOiBcInBsdXNcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IFBsdXNPdXRsaW5lZDtcbiIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFBsdXNPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9QbHVzT3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tICcuLi9jb21wb25lbnRzL0FudGRJY29uJztcbnZhciBQbHVzT3V0bGluZWQgPSBmdW5jdGlvbiBQbHVzT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IFBsdXNPdXRsaW5lZFN2Z1xuICB9KSk7XG59O1xuUGx1c091dGxpbmVkLmRpc3BsYXlOYW1lID0gJ1BsdXNPdXRsaW5lZCc7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihQbHVzT3V0bGluZWQpOyIsImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovY3JlYXRlQ29udGV4dChudWxsKTsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbnZhciBUYWJQYW5lID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKF9yZWYsIHJlZikge1xuICB2YXIgcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgc3R5bGUgPSBfcmVmLnN0eWxlLFxuICAgIGlkID0gX3JlZi5pZCxcbiAgICBhY3RpdmUgPSBfcmVmLmFjdGl2ZSxcbiAgICB0YWJLZXkgPSBfcmVmLnRhYktleSxcbiAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgaWQ6IGlkICYmIFwiXCIuY29uY2F0KGlkLCBcIi1wYW5lbC1cIikuY29uY2F0KHRhYktleSksXG4gICAgcm9sZTogXCJ0YWJwYW5lbFwiLFxuICAgIHRhYkluZGV4OiBhY3RpdmUgPyAwIDogLTEsXG4gICAgXCJhcmlhLWxhYmVsbGVkYnlcIjogaWQgJiYgXCJcIi5jb25jYXQoaWQsIFwiLXRhYi1cIikuY29uY2F0KHRhYktleSksXG4gICAgXCJhcmlhLWhpZGRlblwiOiAhYWN0aXZlLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBhY3RpdmUgJiYgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hY3RpdmVcIiksIGNsYXNzTmFtZSksXG4gICAgcmVmOiByZWZcbiAgfSwgY2hpbGRyZW4pO1xufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBUYWJQYW5lLmRpc3BsYXlOYW1lID0gJ1RhYlBhbmUnO1xufVxuZXhwb3J0IGRlZmF1bHQgVGFiUGFuZTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJrZXlcIiwgXCJmb3JjZVJlbmRlclwiLCBcInN0eWxlXCIsIFwiY2xhc3NOYW1lXCJdO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgQ1NTTW90aW9uIGZyb20gJ3JjLW1vdGlvbic7XG5pbXBvcnQgVGFiQ29udGV4dCBmcm9tIFwiLi4vVGFiQ29udGV4dFwiO1xuaW1wb3J0IFRhYlBhbmUgZnJvbSBcIi4vVGFiUGFuZVwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gVGFiUGFuZWxMaXN0KF9yZWYpIHtcbiAgdmFyIGlkID0gX3JlZi5pZCxcbiAgICBhY3RpdmVLZXkgPSBfcmVmLmFjdGl2ZUtleSxcbiAgICBhbmltYXRlZCA9IF9yZWYuYW5pbWF0ZWQsXG4gICAgdGFiUG9zaXRpb24gPSBfcmVmLnRhYlBvc2l0aW9uLFxuICAgIGRlc3Ryb3lJbmFjdGl2ZVRhYlBhbmUgPSBfcmVmLmRlc3Ryb3lJbmFjdGl2ZVRhYlBhbmU7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoVGFiQ29udGV4dCksXG4gICAgcHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQucHJlZml4Q2xzLFxuICAgIHRhYnMgPSBfUmVhY3QkdXNlQ29udGV4dC50YWJzO1xuICB2YXIgdGFiUGFuZUFuaW1hdGVkID0gYW5pbWF0ZWQudGFiUGFuZTtcbiAgdmFyIHRhYlBhbmVQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRhYnBhbmVcIik7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29udGVudC1ob2xkZXJcIikpXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50XCIpLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbnRlbnQtXCIpLmNvbmNhdCh0YWJQb3NpdGlvbiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50LWFuaW1hdGVkXCIpLCB0YWJQYW5lQW5pbWF0ZWQpKVxuICB9LCB0YWJzLm1hcChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICB2YXIga2V5ID0gX3JlZjIua2V5LFxuICAgICAgZm9yY2VSZW5kZXIgPSBfcmVmMi5mb3JjZVJlbmRlcixcbiAgICAgIHBhbmVTdHlsZSA9IF9yZWYyLnN0eWxlLFxuICAgICAgcGFuZUNsYXNzTmFtZSA9IF9yZWYyLmNsYXNzTmFtZSxcbiAgICAgIHJlc3RUYWJQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmMiwgX2V4Y2x1ZGVkKTtcbiAgICB2YXIgYWN0aXZlID0ga2V5ID09PSBhY3RpdmVLZXk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENTU01vdGlvbiwgX2V4dGVuZHMoe1xuICAgICAga2V5OiBrZXksXG4gICAgICB2aXNpYmxlOiBhY3RpdmUsXG4gICAgICBmb3JjZVJlbmRlcjogZm9yY2VSZW5kZXIsXG4gICAgICByZW1vdmVPbkxlYXZlOiAhIWRlc3Ryb3lJbmFjdGl2ZVRhYlBhbmUsXG4gICAgICBsZWF2ZWRDbGFzc05hbWU6IFwiXCIuY29uY2F0KHRhYlBhbmVQcmVmaXhDbHMsIFwiLWhpZGRlblwiKVxuICAgIH0sIGFuaW1hdGVkLnRhYlBhbmVNb3Rpb24pLCBmdW5jdGlvbiAoX3JlZjMsIHJlZikge1xuICAgICAgdmFyIG1vdGlvblN0eWxlID0gX3JlZjMuc3R5bGUsXG4gICAgICAgIG1vdGlvbkNsYXNzTmFtZSA9IF9yZWYzLmNsYXNzTmFtZTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUYWJQYW5lLCBfZXh0ZW5kcyh7fSwgcmVzdFRhYlByb3BzLCB7XG4gICAgICAgIHByZWZpeENsczogdGFiUGFuZVByZWZpeENscyxcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICB0YWJLZXk6IGtleSxcbiAgICAgICAgYW5pbWF0ZWQ6IHRhYlBhbmVBbmltYXRlZCxcbiAgICAgICAgYWN0aXZlOiBhY3RpdmUsXG4gICAgICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHBhbmVTdHlsZSksIG1vdGlvblN0eWxlKSxcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKHBhbmVDbGFzc05hbWUsIG1vdGlvbkNsYXNzTmFtZSksXG4gICAgICAgIHJlZjogcmVmXG4gICAgICB9KSk7XG4gICAgfSk7XG4gIH0pKSk7XG59IiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG52YXIgREVGQVVMVF9TSVpFID0ge1xuICB3aWR0aDogMCxcbiAgaGVpZ2h0OiAwLFxuICBsZWZ0OiAwLFxuICB0b3A6IDBcbn07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VPZmZzZXRzKHRhYnMsIHRhYlNpemVzLCBob2xkZXJTY3JvbGxXaWR0aCkge1xuICByZXR1cm4gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF90YWJzJDtcbiAgICB2YXIgbWFwID0gbmV3IE1hcCgpO1xuICAgIHZhciBsYXN0T2Zmc2V0ID0gdGFiU2l6ZXMuZ2V0KChfdGFicyQgPSB0YWJzWzBdKSA9PT0gbnVsbCB8fCBfdGFicyQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90YWJzJC5rZXkpIHx8IERFRkFVTFRfU0laRTtcbiAgICB2YXIgcmlnaHRPZmZzZXQgPSBsYXN0T2Zmc2V0LmxlZnQgKyBsYXN0T2Zmc2V0LndpZHRoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFicy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgdmFyIGtleSA9IHRhYnNbaV0ua2V5O1xuICAgICAgdmFyIGRhdGEgPSB0YWJTaXplcy5nZXQoa2V5KTtcblxuICAgICAgLy8gUmV1c2UgbGFzdCBvbmUgd2hlbiBub3QgZXhpc3QgeWV0XG4gICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgdmFyIF90YWJzO1xuICAgICAgICBkYXRhID0gdGFiU2l6ZXMuZ2V0KChfdGFicyA9IHRhYnNbaSAtIDFdKSA9PT0gbnVsbCB8fCBfdGFicyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RhYnMua2V5KSB8fCBERUZBVUxUX1NJWkU7XG4gICAgICB9XG4gICAgICB2YXIgZW50aXR5ID0gbWFwLmdldChrZXkpIHx8IF9vYmplY3RTcHJlYWQoe30sIGRhdGEpO1xuXG4gICAgICAvLyBSaWdodFxuICAgICAgZW50aXR5LnJpZ2h0ID0gcmlnaHRPZmZzZXQgLSBlbnRpdHkubGVmdCAtIGVudGl0eS53aWR0aDtcblxuICAgICAgLy8gVXBkYXRlIGVudGl0eVxuICAgICAgbWFwLnNldChrZXksIGVudGl0eSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH0sIFt0YWJzLm1hcChmdW5jdGlvbiAodGFiKSB7XG4gICAgcmV0dXJuIHRhYi5rZXk7XG4gIH0pLmpvaW4oJ18nKSwgdGFiU2l6ZXMsIGhvbGRlclNjcm9sbFdpZHRoXSk7XG59IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VTeW5jU3RhdGUoZGVmYXVsdFN0YXRlLCBvbkNoYW5nZSkge1xuICB2YXIgc3RhdGVSZWYgPSBSZWFjdC51c2VSZWYoZGVmYXVsdFN0YXRlKTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKHt9KSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBmb3JjZVVwZGF0ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIGZ1bmN0aW9uIHNldFN0YXRlKHVwZGF0ZXIpIHtcbiAgICB2YXIgbmV3VmFsdWUgPSB0eXBlb2YgdXBkYXRlciA9PT0gJ2Z1bmN0aW9uJyA/IHVwZGF0ZXIoc3RhdGVSZWYuY3VycmVudCkgOiB1cGRhdGVyO1xuICAgIGlmIChuZXdWYWx1ZSAhPT0gc3RhdGVSZWYuY3VycmVudCkge1xuICAgICAgb25DaGFuZ2UobmV3VmFsdWUsIHN0YXRlUmVmLmN1cnJlbnQpO1xuICAgIH1cbiAgICBzdGF0ZVJlZi5jdXJyZW50ID0gbmV3VmFsdWU7XG4gICAgZm9yY2VVcGRhdGUoe30pO1xuICB9XG4gIHJldHVybiBbc3RhdGVSZWYuY3VycmVudCwgc2V0U3RhdGVdO1xufSIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlU3RhdGUsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbnZhciBNSU5fU1dJUEVfRElTVEFOQ0UgPSAwLjE7XG52YXIgU1RPUF9TV0lQRV9ESVNUQU5DRSA9IDAuMDE7XG52YXIgUkVGUkVTSF9JTlRFUlZBTCA9IDIwO1xudmFyIFNQRUVEX09GRl9NVUxUSVBMRSA9IE1hdGgucG93KDAuOTk1LCBSRUZSRVNIX0lOVEVSVkFMKTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEhvb2sgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VUb3VjaE1vdmUocmVmLCBvbk9mZnNldCkge1xuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoKSxcbiAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICB0b3VjaFBvc2l0aW9uID0gX3VzZVN0YXRlMlswXSxcbiAgICBzZXRUb3VjaFBvc2l0aW9uID0gX3VzZVN0YXRlMlsxXTtcbiAgdmFyIF91c2VTdGF0ZTMgPSB1c2VTdGF0ZSgwKSxcbiAgICBfdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlMywgMiksXG4gICAgbGFzdFRpbWVzdGFtcCA9IF91c2VTdGF0ZTRbMF0sXG4gICAgc2V0TGFzdFRpbWVzdGFtcCA9IF91c2VTdGF0ZTRbMV07XG4gIHZhciBfdXNlU3RhdGU1ID0gdXNlU3RhdGUoMCksXG4gICAgX3VzZVN0YXRlNiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTUsIDIpLFxuICAgIGxhc3RUaW1lRGlmZiA9IF91c2VTdGF0ZTZbMF0sXG4gICAgc2V0TGFzdFRpbWVEaWZmID0gX3VzZVN0YXRlNlsxXTtcbiAgdmFyIF91c2VTdGF0ZTcgPSB1c2VTdGF0ZSgpLFxuICAgIF91c2VTdGF0ZTggPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGU3LCAyKSxcbiAgICBsYXN0T2Zmc2V0ID0gX3VzZVN0YXRlOFswXSxcbiAgICBzZXRMYXN0T2Zmc2V0ID0gX3VzZVN0YXRlOFsxXTtcbiAgdmFyIG1vdGlvblJlZiA9IHVzZVJlZigpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gRXZlbnRzID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gPj4+IFRvdWNoIGV2ZW50c1xuICBmdW5jdGlvbiBvblRvdWNoU3RhcnQoZSkge1xuICAgIHZhciBfZSR0b3VjaGVzJCA9IGUudG91Y2hlc1swXSxcbiAgICAgIHNjcmVlblggPSBfZSR0b3VjaGVzJC5zY3JlZW5YLFxuICAgICAgc2NyZWVuWSA9IF9lJHRvdWNoZXMkLnNjcmVlblk7XG4gICAgc2V0VG91Y2hQb3NpdGlvbih7XG4gICAgICB4OiBzY3JlZW5YLFxuICAgICAgeTogc2NyZWVuWVxuICAgIH0pO1xuICAgIHdpbmRvdy5jbGVhckludGVydmFsKG1vdGlvblJlZi5jdXJyZW50KTtcbiAgfVxuICBmdW5jdGlvbiBvblRvdWNoTW92ZShlKSB7XG4gICAgaWYgKCF0b3VjaFBvc2l0aW9uKSByZXR1cm47XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHZhciBfZSR0b3VjaGVzJDIgPSBlLnRvdWNoZXNbMF0sXG4gICAgICBzY3JlZW5YID0gX2UkdG91Y2hlcyQyLnNjcmVlblgsXG4gICAgICBzY3JlZW5ZID0gX2UkdG91Y2hlcyQyLnNjcmVlblk7XG4gICAgc2V0VG91Y2hQb3NpdGlvbih7XG4gICAgICB4OiBzY3JlZW5YLFxuICAgICAgeTogc2NyZWVuWVxuICAgIH0pO1xuICAgIHZhciBvZmZzZXRYID0gc2NyZWVuWCAtIHRvdWNoUG9zaXRpb24ueDtcbiAgICB2YXIgb2Zmc2V0WSA9IHNjcmVlblkgLSB0b3VjaFBvc2l0aW9uLnk7XG4gICAgb25PZmZzZXQob2Zmc2V0WCwgb2Zmc2V0WSk7XG4gICAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gICAgc2V0TGFzdFRpbWVzdGFtcChub3cpO1xuICAgIHNldExhc3RUaW1lRGlmZihub3cgLSBsYXN0VGltZXN0YW1wKTtcbiAgICBzZXRMYXN0T2Zmc2V0KHtcbiAgICAgIHg6IG9mZnNldFgsXG4gICAgICB5OiBvZmZzZXRZXG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gb25Ub3VjaEVuZCgpIHtcbiAgICBpZiAoIXRvdWNoUG9zaXRpb24pIHJldHVybjtcbiAgICBzZXRUb3VjaFBvc2l0aW9uKG51bGwpO1xuICAgIHNldExhc3RPZmZzZXQobnVsbCk7XG5cbiAgICAvLyBTd2lwZSBpZiBuZWVkZWRcbiAgICBpZiAobGFzdE9mZnNldCkge1xuICAgICAgdmFyIGRpc3RhbmNlWCA9IGxhc3RPZmZzZXQueCAvIGxhc3RUaW1lRGlmZjtcbiAgICAgIHZhciBkaXN0YW5jZVkgPSBsYXN0T2Zmc2V0LnkgLyBsYXN0VGltZURpZmY7XG4gICAgICB2YXIgYWJzWCA9IE1hdGguYWJzKGRpc3RhbmNlWCk7XG4gICAgICB2YXIgYWJzWSA9IE1hdGguYWJzKGRpc3RhbmNlWSk7XG5cbiAgICAgIC8vIFNraXAgc3dpcGUgaWYgbG93IGRpc3RhbmNlXG4gICAgICBpZiAoTWF0aC5tYXgoYWJzWCwgYWJzWSkgPCBNSU5fU1dJUEVfRElTVEFOQ0UpIHJldHVybjtcbiAgICAgIHZhciBjdXJyZW50WCA9IGRpc3RhbmNlWDtcbiAgICAgIHZhciBjdXJyZW50WSA9IGRpc3RhbmNlWTtcbiAgICAgIG1vdGlvblJlZi5jdXJyZW50ID0gd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKE1hdGguYWJzKGN1cnJlbnRYKSA8IFNUT1BfU1dJUEVfRElTVEFOQ0UgJiYgTWF0aC5hYnMoY3VycmVudFkpIDwgU1RPUF9TV0lQRV9ESVNUQU5DRSkge1xuICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKG1vdGlvblJlZi5jdXJyZW50KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudFggKj0gU1BFRURfT0ZGX01VTFRJUExFO1xuICAgICAgICBjdXJyZW50WSAqPSBTUEVFRF9PRkZfTVVMVElQTEU7XG4gICAgICAgIG9uT2Zmc2V0KGN1cnJlbnRYICogUkVGUkVTSF9JTlRFUlZBTCwgY3VycmVudFkgKiBSRUZSRVNIX0lOVEVSVkFMKTtcbiAgICAgIH0sIFJFRlJFU0hfSU5URVJWQUwpO1xuICAgIH1cbiAgfVxuXG4gIC8vID4+PiBXaGVlbCBldmVudFxuICB2YXIgbGFzdFdoZWVsRGlyZWN0aW9uUmVmID0gdXNlUmVmKCk7XG4gIGZ1bmN0aW9uIG9uV2hlZWwoZSkge1xuICAgIHZhciBkZWx0YVggPSBlLmRlbHRhWCxcbiAgICAgIGRlbHRhWSA9IGUuZGVsdGFZO1xuXG4gICAgLy8gQ29udmVydCBib3RoIHRvIHggJiB5IHNpbmNlIHdoZWVsIG9ubHkgaGFwcGVuZWQgb24gUENcbiAgICB2YXIgbWl4ZWQgPSAwO1xuICAgIHZhciBhYnNYID0gTWF0aC5hYnMoZGVsdGFYKTtcbiAgICB2YXIgYWJzWSA9IE1hdGguYWJzKGRlbHRhWSk7XG4gICAgaWYgKGFic1ggPT09IGFic1kpIHtcbiAgICAgIG1peGVkID0gbGFzdFdoZWVsRGlyZWN0aW9uUmVmLmN1cnJlbnQgPT09ICd4JyA/IGRlbHRhWCA6IGRlbHRhWTtcbiAgICB9IGVsc2UgaWYgKGFic1ggPiBhYnNZKSB7XG4gICAgICBtaXhlZCA9IGRlbHRhWDtcbiAgICAgIGxhc3RXaGVlbERpcmVjdGlvblJlZi5jdXJyZW50ID0gJ3gnO1xuICAgIH0gZWxzZSB7XG4gICAgICBtaXhlZCA9IGRlbHRhWTtcbiAgICAgIGxhc3RXaGVlbERpcmVjdGlvblJlZi5jdXJyZW50ID0gJ3knO1xuICAgIH1cbiAgICBpZiAob25PZmZzZXQoLW1peGVkLCAtbWl4ZWQpKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBFZmZlY3QgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgdG91Y2hFdmVudHNSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHRvdWNoRXZlbnRzUmVmLmN1cnJlbnQgPSB7XG4gICAgb25Ub3VjaFN0YXJ0OiBvblRvdWNoU3RhcnQsXG4gICAgb25Ub3VjaE1vdmU6IG9uVG91Y2hNb3ZlLFxuICAgIG9uVG91Y2hFbmQ6IG9uVG91Y2hFbmQsXG4gICAgb25XaGVlbDogb25XaGVlbFxuICB9O1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIG9uUHJveHlUb3VjaFN0YXJ0KGUpIHtcbiAgICAgIHRvdWNoRXZlbnRzUmVmLmN1cnJlbnQub25Ub3VjaFN0YXJ0KGUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBvblByb3h5VG91Y2hNb3ZlKGUpIHtcbiAgICAgIHRvdWNoRXZlbnRzUmVmLmN1cnJlbnQub25Ub3VjaE1vdmUoZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9uUHJveHlUb3VjaEVuZChlKSB7XG4gICAgICB0b3VjaEV2ZW50c1JlZi5jdXJyZW50Lm9uVG91Y2hFbmQoZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9uUHJveHlXaGVlbChlKSB7XG4gICAgICB0b3VjaEV2ZW50c1JlZi5jdXJyZW50Lm9uV2hlZWwoZSk7XG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uUHJveHlUb3VjaE1vdmUsIHtcbiAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBvblByb3h5VG91Y2hFbmQsIHtcbiAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgfSk7XG5cbiAgICAvLyBObyBuZWVkIHRvIGNsZWFuIHVwIHNpbmNlIGVsZW1lbnQgcmVtb3ZlZFxuICAgIHJlZi5jdXJyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvblByb3h5VG91Y2hTdGFydCwge1xuICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICB9KTtcbiAgICByZWYuY3VycmVudC5hZGRFdmVudExpc3RlbmVyKCd3aGVlbCcsIG9uUHJveHlXaGVlbCk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uUHJveHlUb3VjaE1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBvblByb3h5VG91Y2hFbmQpO1xuICAgIH07XG4gIH0sIFtdKTtcbn0iLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCB7IHVzZUxheW91dFVwZGF0ZUVmZmVjdCB9IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUxheW91dEVmZmVjdFwiO1xuaW1wb3J0IHsgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcblxuLyoqXG4gKiBIZWxwIHRvIG1lcmdlIGNhbGxiYWNrIHdpdGggYHVzZUxheW91dEVmZmVjdGAuXG4gKiBPbmUgdGltZSB3aWxsIG9ubHkgdHJpZ2dlciBvbmNlLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VVcGRhdGUoY2FsbGJhY2spIHtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKDApLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIGNvdW50ID0gX3VzZVN0YXRlMlswXSxcbiAgICBzZXRDb3VudCA9IF91c2VTdGF0ZTJbMV07XG4gIHZhciBlZmZlY3RSZWYgPSB1c2VSZWYoMCk7XG4gIHZhciBjYWxsYmFja1JlZiA9IHVzZVJlZigpO1xuICBjYWxsYmFja1JlZi5jdXJyZW50ID0gY2FsbGJhY2s7XG5cbiAgLy8gVHJpZ2dlciBvbiBgdXNlTGF5b3V0RWZmZWN0YFxuICB1c2VMYXlvdXRVcGRhdGVFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBfY2FsbGJhY2tSZWYkY3VycmVudDtcbiAgICAoX2NhbGxiYWNrUmVmJGN1cnJlbnQgPSBjYWxsYmFja1JlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfY2FsbGJhY2tSZWYkY3VycmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2NhbGxiYWNrUmVmJGN1cnJlbnQuY2FsbChjYWxsYmFja1JlZik7XG4gIH0sIFtjb3VudF0pO1xuXG4gIC8vIFRyaWdnZXIgdG8gdXBkYXRlIGNvdW50XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGVmZmVjdFJlZi5jdXJyZW50ICE9PSBjb3VudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZmZlY3RSZWYuY3VycmVudCArPSAxO1xuICAgIHNldENvdW50KGVmZmVjdFJlZi5jdXJyZW50KTtcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1c2VVcGRhdGVTdGF0ZShkZWZhdWx0U3RhdGUpIHtcbiAgdmFyIGJhdGNoUmVmID0gdXNlUmVmKFtdKTtcbiAgdmFyIF91c2VTdGF0ZTMgPSB1c2VTdGF0ZSh7fSksXG4gICAgX3VzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTMsIDIpLFxuICAgIGZvcmNlVXBkYXRlID0gX3VzZVN0YXRlNFsxXTtcbiAgdmFyIHN0YXRlID0gdXNlUmVmKHR5cGVvZiBkZWZhdWx0U3RhdGUgPT09ICdmdW5jdGlvbicgPyBkZWZhdWx0U3RhdGUoKSA6IGRlZmF1bHRTdGF0ZSk7XG4gIHZhciBmbHVzaFVwZGF0ZSA9IHVzZVVwZGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBzdGF0ZS5jdXJyZW50O1xuICAgIGJhdGNoUmVmLmN1cnJlbnQuZm9yRWFjaChmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgIGN1cnJlbnQgPSBjYWxsYmFjayhjdXJyZW50KTtcbiAgICB9KTtcbiAgICBiYXRjaFJlZi5jdXJyZW50ID0gW107XG4gICAgc3RhdGUuY3VycmVudCA9IGN1cnJlbnQ7XG4gICAgZm9yY2VVcGRhdGUoe30pO1xuICB9KTtcbiAgZnVuY3Rpb24gdXBkYXRlcihjYWxsYmFjaykge1xuICAgIGJhdGNoUmVmLmN1cnJlbnQucHVzaChjYWxsYmFjayk7XG4gICAgZmx1c2hVcGRhdGUoKTtcbiAgfVxuICByZXR1cm4gW3N0YXRlLmN1cnJlbnQsIHVwZGF0ZXJdO1xufSIsImltcG9ydCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG52YXIgREVGQVVMVF9TSVpFID0ge1xuICB3aWR0aDogMCxcbiAgaGVpZ2h0OiAwLFxuICBsZWZ0OiAwLFxuICB0b3A6IDAsXG4gIHJpZ2h0OiAwXG59O1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlVmlzaWJsZVJhbmdlKHRhYk9mZnNldHMsIHZpc2libGVUYWJDb250ZW50VmFsdWUsIHRyYW5zZm9ybSwgdGFiQ29udGVudFNpemVWYWx1ZSwgYWRkTm9kZVNpemVWYWx1ZSwgb3BlcmF0aW9uTm9kZVNpemVWYWx1ZSwgX3JlZikge1xuICB2YXIgdGFicyA9IF9yZWYudGFicyxcbiAgICB0YWJQb3NpdGlvbiA9IF9yZWYudGFiUG9zaXRpb24sXG4gICAgcnRsID0gX3JlZi5ydGw7XG4gIHZhciBjaGFyVW5pdDtcbiAgdmFyIHBvc2l0aW9uO1xuICB2YXIgdHJhbnNmb3JtU2l6ZTtcbiAgaWYgKFsndG9wJywgJ2JvdHRvbSddLmluY2x1ZGVzKHRhYlBvc2l0aW9uKSkge1xuICAgIGNoYXJVbml0ID0gJ3dpZHRoJztcbiAgICBwb3NpdGlvbiA9IHJ0bCA/ICdyaWdodCcgOiAnbGVmdCc7XG4gICAgdHJhbnNmb3JtU2l6ZSA9IE1hdGguYWJzKHRyYW5zZm9ybSk7XG4gIH0gZWxzZSB7XG4gICAgY2hhclVuaXQgPSAnaGVpZ2h0JztcbiAgICBwb3NpdGlvbiA9ICd0b3AnO1xuICAgIHRyYW5zZm9ybVNpemUgPSAtdHJhbnNmb3JtO1xuICB9XG4gIHJldHVybiB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRhYnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gWzAsIDBdO1xuICAgIH1cbiAgICB2YXIgbGVuID0gdGFicy5sZW5ndGg7XG4gICAgdmFyIGVuZEluZGV4ID0gbGVuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgIHZhciBvZmZzZXQgPSB0YWJPZmZzZXRzLmdldCh0YWJzW2ldLmtleSkgfHwgREVGQVVMVF9TSVpFO1xuICAgICAgaWYgKG9mZnNldFtwb3NpdGlvbl0gKyBvZmZzZXRbY2hhclVuaXRdID4gdHJhbnNmb3JtU2l6ZSArIHZpc2libGVUYWJDb250ZW50VmFsdWUpIHtcbiAgICAgICAgZW5kSW5kZXggPSBpIC0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBzdGFydEluZGV4ID0gMDtcbiAgICBmb3IgKHZhciBfaSA9IGxlbiAtIDE7IF9pID49IDA7IF9pIC09IDEpIHtcbiAgICAgIHZhciBfb2Zmc2V0ID0gdGFiT2Zmc2V0cy5nZXQodGFic1tfaV0ua2V5KSB8fCBERUZBVUxUX1NJWkU7XG4gICAgICBpZiAoX29mZnNldFtwb3NpdGlvbl0gPCB0cmFuc2Zvcm1TaXplKSB7XG4gICAgICAgIHN0YXJ0SW5kZXggPSBfaSArIDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW3N0YXJ0SW5kZXgsIGVuZEluZGV4XTtcbiAgfSwgW3RhYk9mZnNldHMsIHZpc2libGVUYWJDb250ZW50VmFsdWUsIHRhYkNvbnRlbnRTaXplVmFsdWUsIGFkZE5vZGVTaXplVmFsdWUsIG9wZXJhdGlvbk5vZGVTaXplVmFsdWUsIHRyYW5zZm9ybVNpemUsIHRhYlBvc2l0aW9uLCB0YWJzLm1hcChmdW5jdGlvbiAodGFiKSB7XG4gICAgcmV0dXJuIHRhYi5rZXk7XG4gIH0pLmpvaW4oJ18nKSwgcnRsXSk7XG59IiwiLyoqXG4gKiBXZSB0cmFkZSBNYXAgYXMgZGVwcyB3aGljaCBtYXkgY2hhbmdlIHdpdGggc2FtZSB2YWx1ZSBidXQgZGlmZmVyZW50IHJlZiBvYmplY3QuXG4gKiBXZSBzaG91bGQgbWFrZSBpdCBhcyBoYXNoIGZvciBkZXBzXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeShvYmopIHtcbiAgdmFyIHRndDtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIE1hcCkge1xuICAgIHRndCA9IHt9O1xuICAgIG9iai5mb3JFYWNoKGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgICB0Z3Rba10gPSB2O1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHRndCA9IG9iajtcbiAgfVxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGd0KTtcbn1cbnZhciBSQ19UQUJTX0RPVUJMRV9RVU9URSA9ICdUQUJTX0RRJztcbmV4cG9ydCBmdW5jdGlvbiBnZW5EYXRhTm9kZUtleShrZXkpIHtcbiAgcmV0dXJuIFN0cmluZyhrZXkpLnJlcGxhY2UoL1wiL2csIFJDX1RBQlNfRE9VQkxFX1FVT1RFKTtcbn0iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5mdW5jdGlvbiBBZGRCdXR0b24oX3JlZiwgcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICBlZGl0YWJsZSA9IF9yZWYuZWRpdGFibGUsXG4gICAgbG9jYWxlID0gX3JlZi5sb2NhbGUsXG4gICAgc3R5bGUgPSBfcmVmLnN0eWxlO1xuICBpZiAoIWVkaXRhYmxlIHx8IGVkaXRhYmxlLnNob3dBZGQgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICByZWY6IHJlZixcbiAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1uYXYtYWRkXCIpLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBcImFyaWEtbGFiZWxcIjogKGxvY2FsZSA9PT0gbnVsbCB8fCBsb2NhbGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxvY2FsZS5hZGRBcmlhTGFiZWwpIHx8ICdBZGQgdGFiJyxcbiAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGV2ZW50KSB7XG4gICAgICBlZGl0YWJsZS5vbkVkaXQoJ2FkZCcsIHtcbiAgICAgICAgZXZlbnQ6IGV2ZW50XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIGVkaXRhYmxlLmFkZEljb24gfHwgJysnKTtcbn1cbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEFkZEJ1dHRvbik7IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIEV4dHJhQ29udGVudCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChfcmVmLCByZWYpIHtcbiAgdmFyIHBvc2l0aW9uID0gX3JlZi5wb3NpdGlvbixcbiAgICBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICBleHRyYSA9IF9yZWYuZXh0cmE7XG4gIGlmICghZXh0cmEpIHJldHVybiBudWxsO1xuICB2YXIgY29udGVudDtcblxuICAvLyBQYXJzZSBleHRyYVxuICB2YXIgYXNzZXJ0RXh0cmEgPSB7fTtcbiAgaWYgKF90eXBlb2YoZXh0cmEpID09PSAnb2JqZWN0JyAmJiAhIC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChleHRyYSkpIHtcbiAgICBhc3NlcnRFeHRyYSA9IGV4dHJhO1xuICB9IGVsc2Uge1xuICAgIGFzc2VydEV4dHJhLnJpZ2h0ID0gZXh0cmE7XG4gIH1cbiAgaWYgKHBvc2l0aW9uID09PSAncmlnaHQnKSB7XG4gICAgY29udGVudCA9IGFzc2VydEV4dHJhLnJpZ2h0O1xuICB9XG4gIGlmIChwb3NpdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgY29udGVudCA9IGFzc2VydEV4dHJhLmxlZnQ7XG4gIH1cbiAgcmV0dXJuIGNvbnRlbnQgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWV4dHJhLWNvbnRlbnRcIiksXG4gICAgcmVmOiByZWZcbiAgfSwgY29udGVudCkgOiBudWxsO1xufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBFeHRyYUNvbnRlbnQuZGlzcGxheU5hbWUgPSAnRXh0cmFDb250ZW50Jztcbn1cbmV4cG9ydCBkZWZhdWx0IEV4dHJhQ29udGVudDsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBEcm9wZG93biBmcm9tICdyYy1kcm9wZG93bic7XG5pbXBvcnQgTWVudSwgeyBNZW51SXRlbSB9IGZyb20gJ3JjLW1lbnUnO1xuaW1wb3J0IEtleUNvZGUgZnJvbSBcInJjLXV0aWwvZXMvS2V5Q29kZVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBBZGRCdXR0b24gZnJvbSBcIi4vQWRkQnV0dG9uXCI7XG5mdW5jdGlvbiBPcGVyYXRpb25Ob2RlKF9yZWYsIHJlZikge1xuICB2YXIgcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHMsXG4gICAgaWQgPSBfcmVmLmlkLFxuICAgIHRhYnMgPSBfcmVmLnRhYnMsXG4gICAgbG9jYWxlID0gX3JlZi5sb2NhbGUsXG4gICAgbW9iaWxlID0gX3JlZi5tb2JpbGUsXG4gICAgX3JlZiRtb3JlSWNvbiA9IF9yZWYubW9yZUljb24sXG4gICAgbW9yZUljb24gPSBfcmVmJG1vcmVJY29uID09PSB2b2lkIDAgPyAnTW9yZScgOiBfcmVmJG1vcmVJY29uLFxuICAgIG1vcmVUcmFuc2l0aW9uTmFtZSA9IF9yZWYubW9yZVRyYW5zaXRpb25OYW1lLFxuICAgIHN0eWxlID0gX3JlZi5zdHlsZSxcbiAgICBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICBlZGl0YWJsZSA9IF9yZWYuZWRpdGFibGUsXG4gICAgdGFiQmFyR3V0dGVyID0gX3JlZi50YWJCYXJHdXR0ZXIsXG4gICAgcnRsID0gX3JlZi5ydGwsXG4gICAgcmVtb3ZlQXJpYUxhYmVsID0gX3JlZi5yZW1vdmVBcmlhTGFiZWwsXG4gICAgb25UYWJDbGljayA9IF9yZWYub25UYWJDbGljayxcbiAgICBnZXRQb3B1cENvbnRhaW5lciA9IF9yZWYuZ2V0UG9wdXBDb250YWluZXIsXG4gICAgcG9wdXBDbGFzc05hbWUgPSBfcmVmLnBvcHVwQ2xhc3NOYW1lO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gRHJvcGRvd24gPT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShmYWxzZSksXG4gICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgb3BlbiA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0T3BlbiA9IF91c2VTdGF0ZTJbMV07XG4gIHZhciBfdXNlU3RhdGUzID0gdXNlU3RhdGUobnVsbCksXG4gICAgX3VzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTMsIDIpLFxuICAgIHNlbGVjdGVkS2V5ID0gX3VzZVN0YXRlNFswXSxcbiAgICBzZXRTZWxlY3RlZEtleSA9IF91c2VTdGF0ZTRbMV07XG4gIHZhciBwb3B1cElkID0gXCJcIi5jb25jYXQoaWQsIFwiLW1vcmUtcG9wdXBcIik7XG4gIHZhciBkcm9wZG93blByZWZpeCA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZHJvcGRvd25cIik7XG4gIHZhciBzZWxlY3RlZEl0ZW1JZCA9IHNlbGVjdGVkS2V5ICE9PSBudWxsID8gXCJcIi5jb25jYXQocG9wdXBJZCwgXCItXCIpLmNvbmNhdChzZWxlY3RlZEtleSkgOiBudWxsO1xuICB2YXIgZHJvcGRvd25BcmlhTGFiZWwgPSBsb2NhbGUgPT09IG51bGwgfHwgbG9jYWxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBsb2NhbGUuZHJvcGRvd25BcmlhTGFiZWw7XG4gIGZ1bmN0aW9uIG9uUmVtb3ZlVGFiKGV2ZW50LCBrZXkpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGVkaXRhYmxlLm9uRWRpdCgncmVtb3ZlJywge1xuICAgICAga2V5OiBrZXksXG4gICAgICBldmVudDogZXZlbnRcbiAgICB9KTtcbiAgfVxuICB2YXIgbWVudSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE1lbnUsIHtcbiAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKF9yZWYyKSB7XG4gICAgICB2YXIga2V5ID0gX3JlZjIua2V5LFxuICAgICAgICBkb21FdmVudCA9IF9yZWYyLmRvbUV2ZW50O1xuICAgICAgb25UYWJDbGljayhrZXksIGRvbUV2ZW50KTtcbiAgICAgIHNldE9wZW4oZmFsc2UpO1xuICAgIH0sXG4gICAgcHJlZml4Q2xzOiBcIlwiLmNvbmNhdChkcm9wZG93blByZWZpeCwgXCItbWVudVwiKSxcbiAgICBpZDogcG9wdXBJZCxcbiAgICB0YWJJbmRleDogLTEsXG4gICAgcm9sZTogXCJsaXN0Ym94XCIsXG4gICAgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIjogc2VsZWN0ZWRJdGVtSWQsXG4gICAgc2VsZWN0ZWRLZXlzOiBbc2VsZWN0ZWRLZXldLFxuICAgIFwiYXJpYS1sYWJlbFwiOiBkcm9wZG93bkFyaWFMYWJlbCAhPT0gdW5kZWZpbmVkID8gZHJvcGRvd25BcmlhTGFiZWwgOiAnZXhwYW5kZWQgZHJvcGRvd24nXG4gIH0sIHRhYnMubWFwKGZ1bmN0aW9uICh0YWIpIHtcbiAgICB2YXIgcmVtb3ZhYmxlID0gZWRpdGFibGUgJiYgdGFiLmNsb3NhYmxlICE9PSBmYWxzZSAmJiAhdGFiLmRpc2FibGVkO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNZW51SXRlbSwge1xuICAgICAga2V5OiB0YWIua2V5LFxuICAgICAgaWQ6IFwiXCIuY29uY2F0KHBvcHVwSWQsIFwiLVwiKS5jb25jYXQodGFiLmtleSksXG4gICAgICByb2xlOiBcIm9wdGlvblwiLFxuICAgICAgXCJhcmlhLWNvbnRyb2xzXCI6IGlkICYmIFwiXCIuY29uY2F0KGlkLCBcIi1wYW5lbC1cIikuY29uY2F0KHRhYi5rZXkpLFxuICAgICAgZGlzYWJsZWQ6IHRhYi5kaXNhYmxlZFxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCB0YWIubGFiZWwpLCByZW1vdmFibGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgIFwiYXJpYS1sYWJlbFwiOiByZW1vdmVBcmlhTGFiZWwgfHwgJ3JlbW92ZScsXG4gICAgICB0YWJJbmRleDogMCxcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoZHJvcGRvd25QcmVmaXgsIFwiLW1lbnUtaXRlbS1yZW1vdmVcIiksXG4gICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgb25SZW1vdmVUYWIoZSwgdGFiLmtleSk7XG4gICAgICB9XG4gICAgfSwgdGFiLmNsb3NlSWNvbiB8fCBlZGl0YWJsZS5yZW1vdmVJY29uIHx8ICfDlycpKTtcbiAgfSkpO1xuICBmdW5jdGlvbiBzZWxlY3RPZmZzZXQob2Zmc2V0KSB7XG4gICAgdmFyIGVuYWJsZWRUYWJzID0gdGFicy5maWx0ZXIoZnVuY3Rpb24gKHRhYikge1xuICAgICAgcmV0dXJuICF0YWIuZGlzYWJsZWQ7XG4gICAgfSk7XG4gICAgdmFyIHNlbGVjdGVkSW5kZXggPSBlbmFibGVkVGFicy5maW5kSW5kZXgoZnVuY3Rpb24gKHRhYikge1xuICAgICAgcmV0dXJuIHRhYi5rZXkgPT09IHNlbGVjdGVkS2V5O1xuICAgIH0pIHx8IDA7XG4gICAgdmFyIGxlbiA9IGVuYWJsZWRUYWJzLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICBzZWxlY3RlZEluZGV4ID0gKHNlbGVjdGVkSW5kZXggKyBvZmZzZXQgKyBsZW4pICUgbGVuO1xuICAgICAgdmFyIHRhYiA9IGVuYWJsZWRUYWJzW3NlbGVjdGVkSW5kZXhdO1xuICAgICAgaWYgKCF0YWIuZGlzYWJsZWQpIHtcbiAgICAgICAgc2V0U2VsZWN0ZWRLZXkodGFiLmtleSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gb25LZXlEb3duKGUpIHtcbiAgICB2YXIgd2hpY2ggPSBlLndoaWNoO1xuICAgIGlmICghb3Blbikge1xuICAgICAgaWYgKFtLZXlDb2RlLkRPV04sIEtleUNvZGUuU1BBQ0UsIEtleUNvZGUuRU5URVJdLmluY2x1ZGVzKHdoaWNoKSkge1xuICAgICAgICBzZXRPcGVuKHRydWUpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN3aXRjaCAod2hpY2gpIHtcbiAgICAgIGNhc2UgS2V5Q29kZS5VUDpcbiAgICAgICAgc2VsZWN0T2Zmc2V0KC0xKTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgS2V5Q29kZS5ET1dOOlxuICAgICAgICBzZWxlY3RPZmZzZXQoMSk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEtleUNvZGUuRVNDOlxuICAgICAgICBzZXRPcGVuKGZhbHNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEtleUNvZGUuU1BBQ0U6XG4gICAgICBjYXNlIEtleUNvZGUuRU5URVI6XG4gICAgICAgIGlmIChzZWxlY3RlZEtleSAhPT0gbnVsbCkgb25UYWJDbGljayhzZWxlY3RlZEtleSwgZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gRWZmZWN0ID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAvLyBXZSB1c2UgcXVlcnkgZWxlbWVudCBoZXJlIHRvIGF2b2lkIFJlYWN0IHN0cmljdCB3YXJuaW5nXG4gICAgdmFyIGVsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbGVjdGVkSXRlbUlkKTtcbiAgICBpZiAoZWxlICYmIGVsZS5zY3JvbGxJbnRvVmlldykge1xuICAgICAgZWxlLnNjcm9sbEludG9WaWV3KGZhbHNlKTtcbiAgICB9XG4gIH0sIFtzZWxlY3RlZEtleV0pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghb3Blbikge1xuICAgICAgc2V0U2VsZWN0ZWRLZXkobnVsbCk7XG4gICAgfVxuICB9LCBbb3Blbl0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG1vcmVTdHlsZSA9IF9kZWZpbmVQcm9wZXJ0eSh7fSwgcnRsID8gJ21hcmdpblJpZ2h0JyA6ICdtYXJnaW5MZWZ0JywgdGFiQmFyR3V0dGVyKTtcbiAgaWYgKCF0YWJzLmxlbmd0aCkge1xuICAgIG1vcmVTdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgbW9yZVN0eWxlLm9yZGVyID0gMTtcbiAgfVxuICB2YXIgb3ZlcmxheUNsYXNzTmFtZSA9IGNsYXNzTmFtZXMoX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChkcm9wZG93blByZWZpeCwgXCItcnRsXCIpLCBydGwpKTtcbiAgdmFyIG1vcmVOb2RlID0gbW9iaWxlID8gbnVsbCA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERyb3Bkb3duLCB7XG4gICAgcHJlZml4Q2xzOiBkcm9wZG93blByZWZpeCxcbiAgICBvdmVybGF5OiBtZW51LFxuICAgIHRyaWdnZXI6IFsnaG92ZXInXSxcbiAgICB2aXNpYmxlOiB0YWJzLmxlbmd0aCA/IG9wZW4gOiBmYWxzZSxcbiAgICB0cmFuc2l0aW9uTmFtZTogbW9yZVRyYW5zaXRpb25OYW1lLFxuICAgIG9uVmlzaWJsZUNoYW5nZTogc2V0T3BlbixcbiAgICBvdmVybGF5Q2xhc3NOYW1lOiBjbGFzc05hbWVzKG92ZXJsYXlDbGFzc05hbWUsIHBvcHVwQ2xhc3NOYW1lKSxcbiAgICBtb3VzZUVudGVyRGVsYXk6IDAuMSxcbiAgICBtb3VzZUxlYXZlRGVsYXk6IDAuMSxcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW5hdi1tb3JlXCIpLFxuICAgIHN0eWxlOiBtb3JlU3R5bGUsXG4gICAgdGFiSW5kZXg6IC0xLFxuICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCIsXG4gICAgXCJhcmlhLWhhc3BvcHVwXCI6IFwibGlzdGJveFwiLFxuICAgIFwiYXJpYS1jb250cm9sc1wiOiBwb3B1cElkLFxuICAgIGlkOiBcIlwiLmNvbmNhdChpZCwgXCItbW9yZVwiKSxcbiAgICBcImFyaWEtZXhwYW5kZWRcIjogb3BlbixcbiAgICBvbktleURvd246IG9uS2V5RG93blxuICB9LCBtb3JlSWNvbikpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW5hdi1vcGVyYXRpb25zXCIpLCBjbGFzc05hbWUpLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICByZWY6IHJlZlxuICB9LCBtb3JlTm9kZSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQWRkQnV0dG9uLCB7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgZWRpdGFibGU6IGVkaXRhYmxlXG4gIH0pKTtcbn1cbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9SZWFjdC5tZW1vKCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihPcGVyYXRpb25Ob2RlKSwgZnVuY3Rpb24gKF8sIG5leHQpIHtcbiAgcmV0dXJuIChcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8zMjU0NFxuICAgIC8vIFdlJ2QgYmV0dGVyIHJlbW92ZSBzeW50YWN0aWMgc3VnYXIgaW4gYHJjLW1lbnVgIHNpbmNlIHRoaXMgaGFzIHBlcmYgaXNzdWVcbiAgICBuZXh0LnRhYk1vdmluZ1xuICApO1xufSk7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IEtleUNvZGUgZnJvbSBcInJjLXV0aWwvZXMvS2V5Q29kZVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2VuRGF0YU5vZGVLZXkgfSBmcm9tIFwiLi4vdXRpbFwiO1xuZnVuY3Rpb24gVGFiTm9kZShfcmVmKSB7XG4gIHZhciBfY2xhc3NOYW1lcztcbiAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgIGlkID0gX3JlZi5pZCxcbiAgICBhY3RpdmUgPSBfcmVmLmFjdGl2ZSxcbiAgICBfcmVmJHRhYiA9IF9yZWYudGFiLFxuICAgIGtleSA9IF9yZWYkdGFiLmtleSxcbiAgICBsYWJlbCA9IF9yZWYkdGFiLmxhYmVsLFxuICAgIGRpc2FibGVkID0gX3JlZiR0YWIuZGlzYWJsZWQsXG4gICAgY2xvc2VJY29uID0gX3JlZiR0YWIuY2xvc2VJY29uLFxuICAgIGNsb3NhYmxlID0gX3JlZi5jbG9zYWJsZSxcbiAgICByZW5kZXJXcmFwcGVyID0gX3JlZi5yZW5kZXJXcmFwcGVyLFxuICAgIHJlbW92ZUFyaWFMYWJlbCA9IF9yZWYucmVtb3ZlQXJpYUxhYmVsLFxuICAgIGVkaXRhYmxlID0gX3JlZi5lZGl0YWJsZSxcbiAgICBvbkNsaWNrID0gX3JlZi5vbkNsaWNrLFxuICAgIG9uRm9jdXMgPSBfcmVmLm9uRm9jdXMsXG4gICAgc3R5bGUgPSBfcmVmLnN0eWxlO1xuICB2YXIgdGFiUHJlZml4ID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10YWJcIik7XG4gIHZhciByZW1vdmFibGUgPSBlZGl0YWJsZSAmJiBjbG9zYWJsZSAhPT0gZmFsc2UgJiYgIWRpc2FibGVkO1xuICBmdW5jdGlvbiBvbkludGVybmFsQ2xpY2soZSkge1xuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBvbkNsaWNrKGUpO1xuICB9XG4gIGZ1bmN0aW9uIG9uUmVtb3ZlVGFiKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBlZGl0YWJsZS5vbkVkaXQoJ3JlbW92ZScsIHtcbiAgICAgIGtleToga2V5LFxuICAgICAgZXZlbnQ6IGV2ZW50XG4gICAgfSk7XG4gIH1cbiAgdmFyIG5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAga2V5OiBrZXlcbiAgICAvLyByZWY9e3JlZn1cbiAgICAsXG4gICAgXCJkYXRhLW5vZGUta2V5XCI6IGdlbkRhdGFOb2RlS2V5KGtleSksXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKHRhYlByZWZpeCwgKF9jbGFzc05hbWVzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQodGFiUHJlZml4LCBcIi13aXRoLXJlbW92ZVwiKSwgcmVtb3ZhYmxlKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdCh0YWJQcmVmaXgsIFwiLWFjdGl2ZVwiKSwgYWN0aXZlKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdCh0YWJQcmVmaXgsIFwiLWRpc2FibGVkXCIpLCBkaXNhYmxlZCksIF9jbGFzc05hbWVzKSksXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIG9uQ2xpY2s6IG9uSW50ZXJuYWxDbGlja1xuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgcm9sZTogXCJ0YWJcIixcbiAgICBcImFyaWEtc2VsZWN0ZWRcIjogYWN0aXZlLFxuICAgIGlkOiBpZCAmJiBcIlwiLmNvbmNhdChpZCwgXCItdGFiLVwiKS5jb25jYXQoa2V5KSxcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHRhYlByZWZpeCwgXCItYnRuXCIpLFxuICAgIFwiYXJpYS1jb250cm9sc1wiOiBpZCAmJiBcIlwiLmNvbmNhdChpZCwgXCItcGFuZWwtXCIpLmNvbmNhdChrZXkpLFxuICAgIFwiYXJpYS1kaXNhYmxlZFwiOiBkaXNhYmxlZCxcbiAgICB0YWJJbmRleDogZGlzYWJsZWQgPyBudWxsIDogMCxcbiAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBvbkludGVybmFsQ2xpY2soZSk7XG4gICAgfSxcbiAgICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XG4gICAgICBpZiAoW0tleUNvZGUuU1BBQ0UsIEtleUNvZGUuRU5URVJdLmluY2x1ZGVzKGUud2hpY2gpKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgb25JbnRlcm5hbENsaWNrKGUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgb25Gb2N1czogb25Gb2N1c1xuICB9LCBsYWJlbCksIHJlbW92YWJsZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgdHlwZTogXCJidXR0b25cIixcbiAgICBcImFyaWEtbGFiZWxcIjogcmVtb3ZlQXJpYUxhYmVsIHx8ICdyZW1vdmUnLFxuICAgIHRhYkluZGV4OiAwLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQodGFiUHJlZml4LCBcIi1yZW1vdmVcIiksXG4gICAgb25DbGljazogZnVuY3Rpb24gb25DbGljayhlKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgb25SZW1vdmVUYWIoZSk7XG4gICAgfVxuICB9LCBjbG9zZUljb24gfHwgZWRpdGFibGUucmVtb3ZlSWNvbiB8fCAnw5cnKSk7XG4gIHJldHVybiByZW5kZXJXcmFwcGVyID8gcmVuZGVyV3JhcHBlcihub2RlKSA6IG5vZGU7XG59XG5leHBvcnQgZGVmYXVsdCBUYWJOb2RlOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBSZXNpemVPYnNlcnZlciBmcm9tICdyYy1yZXNpemUtb2JzZXJ2ZXInO1xuaW1wb3J0IHVzZUV2ZW50IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUV2ZW50XCI7XG5pbXBvcnQgcmFmIGZyb20gXCJyYy11dGlsL2VzL3JhZlwiO1xuaW1wb3J0IHsgdXNlQ29tcG9zZVJlZiB9IGZyb20gXCJyYy11dGlsL2VzL3JlZlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZU9mZnNldHMgZnJvbSBcIi4uL2hvb2tzL3VzZU9mZnNldHNcIjtcbmltcG9ydCB1c2VTeW5jU3RhdGUgZnJvbSBcIi4uL2hvb2tzL3VzZVN5bmNTdGF0ZVwiO1xuaW1wb3J0IHVzZVRvdWNoTW92ZSBmcm9tIFwiLi4vaG9va3MvdXNlVG91Y2hNb3ZlXCI7XG5pbXBvcnQgdXNlVXBkYXRlLCB7IHVzZVVwZGF0ZVN0YXRlIH0gZnJvbSBcIi4uL2hvb2tzL3VzZVVwZGF0ZVwiO1xuaW1wb3J0IHVzZVZpc2libGVSYW5nZSBmcm9tIFwiLi4vaG9va3MvdXNlVmlzaWJsZVJhbmdlXCI7XG5pbXBvcnQgVGFiQ29udGV4dCBmcm9tIFwiLi4vVGFiQ29udGV4dFwiO1xuaW1wb3J0IHsgZ2VuRGF0YU5vZGVLZXksIHN0cmluZ2lmeSB9IGZyb20gXCIuLi91dGlsXCI7XG5pbXBvcnQgQWRkQnV0dG9uIGZyb20gXCIuL0FkZEJ1dHRvblwiO1xuaW1wb3J0IEV4dHJhQ29udGVudCBmcm9tIFwiLi9FeHRyYUNvbnRlbnRcIjtcbmltcG9ydCBPcGVyYXRpb25Ob2RlIGZyb20gXCIuL09wZXJhdGlvbk5vZGVcIjtcbmltcG9ydCBUYWJOb2RlIGZyb20gXCIuL1RhYk5vZGVcIjtcbnZhciBnZXRTaXplID0gZnVuY3Rpb24gZ2V0U2l6ZShyZWZPYmopIHtcbiAgdmFyIF9yZWYgPSByZWZPYmouY3VycmVudCB8fCB7fSxcbiAgICBfcmVmJG9mZnNldFdpZHRoID0gX3JlZi5vZmZzZXRXaWR0aCxcbiAgICBvZmZzZXRXaWR0aCA9IF9yZWYkb2Zmc2V0V2lkdGggPT09IHZvaWQgMCA/IDAgOiBfcmVmJG9mZnNldFdpZHRoLFxuICAgIF9yZWYkb2Zmc2V0SGVpZ2h0ID0gX3JlZi5vZmZzZXRIZWlnaHQsXG4gICAgb2Zmc2V0SGVpZ2h0ID0gX3JlZiRvZmZzZXRIZWlnaHQgPT09IHZvaWQgMCA/IDAgOiBfcmVmJG9mZnNldEhlaWdodDtcbiAgcmV0dXJuIFtvZmZzZXRXaWR0aCwgb2Zmc2V0SGVpZ2h0XTtcbn07XG5cbi8qKlxuICogQ29udmVydCBgU2l6ZUluZm9gIHRvIHVuaXQgdmFsdWUuIFN1Y2ggYXMgWzEyMywgNDU2XSB3aXRoIGB0b3BgIHBvc2l0aW9uIGdldCBgMTIzYFxuICovXG52YXIgZ2V0VW5pdFZhbHVlID0gZnVuY3Rpb24gZ2V0VW5pdFZhbHVlKHNpemUsIHRhYlBvc2l0aW9uVG9wT3JCb3R0b20pIHtcbiAgcmV0dXJuIHNpemVbdGFiUG9zaXRpb25Ub3BPckJvdHRvbSA/IDAgOiAxXTtcbn07XG5mdW5jdGlvbiBUYWJOYXZMaXN0KHByb3BzLCByZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFRhYkNvbnRleHQpLFxuICAgIHByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LnByZWZpeENscyxcbiAgICB0YWJzID0gX1JlYWN0JHVzZUNvbnRleHQudGFicztcbiAgdmFyIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIGlkID0gcHJvcHMuaWQsXG4gICAgYW5pbWF0ZWQgPSBwcm9wcy5hbmltYXRlZCxcbiAgICBhY3RpdmVLZXkgPSBwcm9wcy5hY3RpdmVLZXksXG4gICAgcnRsID0gcHJvcHMucnRsLFxuICAgIGV4dHJhID0gcHJvcHMuZXh0cmEsXG4gICAgZWRpdGFibGUgPSBwcm9wcy5lZGl0YWJsZSxcbiAgICBsb2NhbGUgPSBwcm9wcy5sb2NhbGUsXG4gICAgdGFiUG9zaXRpb24gPSBwcm9wcy50YWJQb3NpdGlvbixcbiAgICB0YWJCYXJHdXR0ZXIgPSBwcm9wcy50YWJCYXJHdXR0ZXIsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBvblRhYkNsaWNrID0gcHJvcHMub25UYWJDbGljayxcbiAgICBvblRhYlNjcm9sbCA9IHByb3BzLm9uVGFiU2Nyb2xsO1xuICB2YXIgY29udGFpbmVyUmVmID0gdXNlUmVmKCk7XG4gIHZhciBleHRyYUxlZnRSZWYgPSB1c2VSZWYoKTtcbiAgdmFyIGV4dHJhUmlnaHRSZWYgPSB1c2VSZWYoKTtcbiAgdmFyIHRhYnNXcmFwcGVyUmVmID0gdXNlUmVmKCk7XG4gIHZhciB0YWJMaXN0UmVmID0gdXNlUmVmKCk7XG4gIHZhciBvcGVyYXRpb25zUmVmID0gdXNlUmVmKCk7XG4gIHZhciBpbm5lckFkZEJ1dHRvblJlZiA9IHVzZVJlZigpO1xuICAvLyBjb25zdCBbZ2V0QnRuUmVmLCByZW1vdmVCdG5SZWZdID0gdXNlUmVmczxIVE1MRGl2RWxlbWVudD4oKTtcblxuICB2YXIgdGFiUG9zaXRpb25Ub3BPckJvdHRvbSA9IHRhYlBvc2l0aW9uID09PSAndG9wJyB8fCB0YWJQb3NpdGlvbiA9PT0gJ2JvdHRvbSc7XG4gIHZhciBfdXNlU3luY1N0YXRlID0gdXNlU3luY1N0YXRlKDAsIGZ1bmN0aW9uIChuZXh0LCBwcmV2KSB7XG4gICAgICBpZiAodGFiUG9zaXRpb25Ub3BPckJvdHRvbSAmJiBvblRhYlNjcm9sbCkge1xuICAgICAgICBvblRhYlNjcm9sbCh7XG4gICAgICAgICAgZGlyZWN0aW9uOiBuZXh0ID4gcHJldiA/ICdsZWZ0JyA6ICdyaWdodCdcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSksXG4gICAgX3VzZVN5bmNTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3luY1N0YXRlLCAyKSxcbiAgICB0cmFuc2Zvcm1MZWZ0ID0gX3VzZVN5bmNTdGF0ZTJbMF0sXG4gICAgc2V0VHJhbnNmb3JtTGVmdCA9IF91c2VTeW5jU3RhdGUyWzFdO1xuICB2YXIgX3VzZVN5bmNTdGF0ZTMgPSB1c2VTeW5jU3RhdGUoMCwgZnVuY3Rpb24gKG5leHQsIHByZXYpIHtcbiAgICAgIGlmICghdGFiUG9zaXRpb25Ub3BPckJvdHRvbSAmJiBvblRhYlNjcm9sbCkge1xuICAgICAgICBvblRhYlNjcm9sbCh7XG4gICAgICAgICAgZGlyZWN0aW9uOiBuZXh0ID4gcHJldiA/ICd0b3AnIDogJ2JvdHRvbSdcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSksXG4gICAgX3VzZVN5bmNTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfdXNlU3luY1N0YXRlMywgMiksXG4gICAgdHJhbnNmb3JtVG9wID0gX3VzZVN5bmNTdGF0ZTRbMF0sXG4gICAgc2V0VHJhbnNmb3JtVG9wID0gX3VzZVN5bmNTdGF0ZTRbMV07XG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShbMCwgMF0pLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIGNvbnRhaW5lckV4Y2x1ZGVFeHRyYVNpemUgPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldENvbnRhaW5lckV4Y2x1ZGVFeHRyYVNpemUgPSBfdXNlU3RhdGUyWzFdO1xuICB2YXIgX3VzZVN0YXRlMyA9IHVzZVN0YXRlKFswLCAwXSksXG4gICAgX3VzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTMsIDIpLFxuICAgIHRhYkNvbnRlbnRTaXplID0gX3VzZVN0YXRlNFswXSxcbiAgICBzZXRUYWJDb250ZW50U2l6ZSA9IF91c2VTdGF0ZTRbMV07XG4gIHZhciBfdXNlU3RhdGU1ID0gdXNlU3RhdGUoWzAsIDBdKSxcbiAgICBfdXNlU3RhdGU2ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlNSwgMiksXG4gICAgYWRkU2l6ZSA9IF91c2VTdGF0ZTZbMF0sXG4gICAgc2V0QWRkU2l6ZSA9IF91c2VTdGF0ZTZbMV07XG4gIHZhciBfdXNlU3RhdGU3ID0gdXNlU3RhdGUoWzAsIDBdKSxcbiAgICBfdXNlU3RhdGU4ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlNywgMiksXG4gICAgb3BlcmF0aW9uU2l6ZSA9IF91c2VTdGF0ZThbMF0sXG4gICAgc2V0T3BlcmF0aW9uU2l6ZSA9IF91c2VTdGF0ZThbMV07XG4gIHZhciBfdXNlVXBkYXRlU3RhdGUgPSB1c2VVcGRhdGVTdGF0ZShuZXcgTWFwKCkpLFxuICAgIF91c2VVcGRhdGVTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlVXBkYXRlU3RhdGUsIDIpLFxuICAgIHRhYlNpemVzID0gX3VzZVVwZGF0ZVN0YXRlMlswXSxcbiAgICBzZXRUYWJTaXplcyA9IF91c2VVcGRhdGVTdGF0ZTJbMV07XG4gIHZhciB0YWJPZmZzZXRzID0gdXNlT2Zmc2V0cyh0YWJzLCB0YWJTaXplcywgdGFiQ29udGVudFNpemVbMF0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFVuaXQgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgY29udGFpbmVyRXhjbHVkZUV4dHJhU2l6ZVZhbHVlID0gZ2V0VW5pdFZhbHVlKGNvbnRhaW5lckV4Y2x1ZGVFeHRyYVNpemUsIHRhYlBvc2l0aW9uVG9wT3JCb3R0b20pO1xuICB2YXIgdGFiQ29udGVudFNpemVWYWx1ZSA9IGdldFVuaXRWYWx1ZSh0YWJDb250ZW50U2l6ZSwgdGFiUG9zaXRpb25Ub3BPckJvdHRvbSk7XG4gIHZhciBhZGRTaXplVmFsdWUgPSBnZXRVbml0VmFsdWUoYWRkU2l6ZSwgdGFiUG9zaXRpb25Ub3BPckJvdHRvbSk7XG4gIHZhciBvcGVyYXRpb25TaXplVmFsdWUgPSBnZXRVbml0VmFsdWUob3BlcmF0aW9uU2l6ZSwgdGFiUG9zaXRpb25Ub3BPckJvdHRvbSk7XG4gIHZhciBuZWVkU2Nyb2xsID0gY29udGFpbmVyRXhjbHVkZUV4dHJhU2l6ZVZhbHVlIDwgdGFiQ29udGVudFNpemVWYWx1ZSArIGFkZFNpemVWYWx1ZTtcbiAgdmFyIHZpc2libGVUYWJDb250ZW50VmFsdWUgPSBuZWVkU2Nyb2xsID8gY29udGFpbmVyRXhjbHVkZUV4dHJhU2l6ZVZhbHVlIC0gb3BlcmF0aW9uU2l6ZVZhbHVlIDogY29udGFpbmVyRXhjbHVkZUV4dHJhU2l6ZVZhbHVlIC0gYWRkU2l6ZVZhbHVlO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFV0aWwgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb3BlcmF0aW9uc0hpZGRlbkNsYXNzTmFtZSA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbmF2LW9wZXJhdGlvbnMtaGlkZGVuXCIpO1xuICB2YXIgdHJhbnNmb3JtTWluID0gMDtcbiAgdmFyIHRyYW5zZm9ybU1heCA9IDA7XG4gIGlmICghdGFiUG9zaXRpb25Ub3BPckJvdHRvbSkge1xuICAgIHRyYW5zZm9ybU1pbiA9IE1hdGgubWluKDAsIHZpc2libGVUYWJDb250ZW50VmFsdWUgLSB0YWJDb250ZW50U2l6ZVZhbHVlKTtcbiAgICB0cmFuc2Zvcm1NYXggPSAwO1xuICB9IGVsc2UgaWYgKHJ0bCkge1xuICAgIHRyYW5zZm9ybU1pbiA9IDA7XG4gICAgdHJhbnNmb3JtTWF4ID0gTWF0aC5tYXgoMCwgdGFiQ29udGVudFNpemVWYWx1ZSAtIHZpc2libGVUYWJDb250ZW50VmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIHRyYW5zZm9ybU1pbiA9IE1hdGgubWluKDAsIHZpc2libGVUYWJDb250ZW50VmFsdWUgLSB0YWJDb250ZW50U2l6ZVZhbHVlKTtcbiAgICB0cmFuc2Zvcm1NYXggPSAwO1xuICB9XG4gIGZ1bmN0aW9uIGFsaWduSW5SYW5nZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA8IHRyYW5zZm9ybU1pbikge1xuICAgICAgcmV0dXJuIHRyYW5zZm9ybU1pbjtcbiAgICB9XG4gICAgaWYgKHZhbHVlID4gdHJhbnNmb3JtTWF4KSB7XG4gICAgICByZXR1cm4gdHJhbnNmb3JtTWF4O1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IE1vYmlsZSA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHRvdWNoTW92aW5nUmVmID0gdXNlUmVmKCk7XG4gIHZhciBfdXNlU3RhdGU5ID0gdXNlU3RhdGUoKSxcbiAgICBfdXNlU3RhdGUxMCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTksIDIpLFxuICAgIGxvY2tBbmltYXRpb24gPSBfdXNlU3RhdGUxMFswXSxcbiAgICBzZXRMb2NrQW5pbWF0aW9uID0gX3VzZVN0YXRlMTBbMV07XG4gIGZ1bmN0aW9uIGRvTG9ja0FuaW1hdGlvbigpIHtcbiAgICBzZXRMb2NrQW5pbWF0aW9uKERhdGUubm93KCkpO1xuICB9XG4gIGZ1bmN0aW9uIGNsZWFyVG91Y2hNb3ZpbmcoKSB7XG4gICAgd2luZG93LmNsZWFyVGltZW91dCh0b3VjaE1vdmluZ1JlZi5jdXJyZW50KTtcbiAgfVxuICB1c2VUb3VjaE1vdmUodGFic1dyYXBwZXJSZWYsIGZ1bmN0aW9uIChvZmZzZXRYLCBvZmZzZXRZKSB7XG4gICAgZnVuY3Rpb24gZG9Nb3ZlKHNldFN0YXRlLCBvZmZzZXQpIHtcbiAgICAgIHNldFN0YXRlKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgbmV3VmFsdWUgPSBhbGlnbkluUmFuZ2UodmFsdWUgKyBvZmZzZXQpO1xuICAgICAgICByZXR1cm4gbmV3VmFsdWU7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTa2lwIHNjcm9sbCBpZiBwbGFjZSBpcyBlbm91Z2hcbiAgICBpZiAoIW5lZWRTY3JvbGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRhYlBvc2l0aW9uVG9wT3JCb3R0b20pIHtcbiAgICAgIGRvTW92ZShzZXRUcmFuc2Zvcm1MZWZ0LCBvZmZzZXRYKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9Nb3ZlKHNldFRyYW5zZm9ybVRvcCwgb2Zmc2V0WSk7XG4gICAgfVxuICAgIGNsZWFyVG91Y2hNb3ZpbmcoKTtcbiAgICBkb0xvY2tBbmltYXRpb24oKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgY2xlYXJUb3VjaE1vdmluZygpO1xuICAgIGlmIChsb2NrQW5pbWF0aW9uKSB7XG4gICAgICB0b3VjaE1vdmluZ1JlZi5jdXJyZW50ID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBzZXRMb2NrQW5pbWF0aW9uKDApO1xuICAgICAgfSwgMTAwKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsZWFyVG91Y2hNb3Zpbmc7XG4gIH0sIFtsb2NrQW5pbWF0aW9uXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IFZpc2libGUgUmFuZ2UgPT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJlbmRlciB0YWIgbm9kZSAmIGNvbGxlY3QgdGFiIG9mZnNldFxuICB2YXIgX3VzZVZpc2libGVSYW5nZSA9IHVzZVZpc2libGVSYW5nZSh0YWJPZmZzZXRzLFxuICAgIC8vIENvbnRhaW5lclxuICAgIHZpc2libGVUYWJDb250ZW50VmFsdWUsXG4gICAgLy8gVHJhbnNmb3JtXG4gICAgdGFiUG9zaXRpb25Ub3BPckJvdHRvbSA/IHRyYW5zZm9ybUxlZnQgOiB0cmFuc2Zvcm1Ub3AsXG4gICAgLy8gVGFic1xuICAgIHRhYkNvbnRlbnRTaXplVmFsdWUsXG4gICAgLy8gQWRkXG4gICAgYWRkU2l6ZVZhbHVlLFxuICAgIC8vIE9wZXJhdGlvblxuICAgIG9wZXJhdGlvblNpemVWYWx1ZSwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgICB0YWJzOiB0YWJzXG4gICAgfSkpLFxuICAgIF91c2VWaXNpYmxlUmFuZ2UyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVZpc2libGVSYW5nZSwgMiksXG4gICAgdmlzaWJsZVN0YXJ0ID0gX3VzZVZpc2libGVSYW5nZTJbMF0sXG4gICAgdmlzaWJsZUVuZCA9IF91c2VWaXNpYmxlUmFuZ2UyWzFdO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gU2Nyb2xsID09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgc2Nyb2xsVG9UYWIgPSB1c2VFdmVudChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogYWN0aXZlS2V5O1xuICAgIHZhciB0YWJPZmZzZXQgPSB0YWJPZmZzZXRzLmdldChrZXkpIHx8IHtcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwLFxuICAgICAgbGVmdDogMCxcbiAgICAgIHJpZ2h0OiAwLFxuICAgICAgdG9wOiAwXG4gICAgfTtcbiAgICBpZiAodGFiUG9zaXRpb25Ub3BPckJvdHRvbSkge1xuICAgICAgLy8gPT09PT09PT09PT09IEFsaWduIHdpdGggdG9wICYgYm90dG9tID09PT09PT09PT09PVxuICAgICAgdmFyIG5ld1RyYW5zZm9ybSA9IHRyYW5zZm9ybUxlZnQ7XG5cbiAgICAgIC8vIFJUTFxuICAgICAgaWYgKHJ0bCkge1xuICAgICAgICBpZiAodGFiT2Zmc2V0LnJpZ2h0IDwgdHJhbnNmb3JtTGVmdCkge1xuICAgICAgICAgIG5ld1RyYW5zZm9ybSA9IHRhYk9mZnNldC5yaWdodDtcbiAgICAgICAgfSBlbHNlIGlmICh0YWJPZmZzZXQucmlnaHQgKyB0YWJPZmZzZXQud2lkdGggPiB0cmFuc2Zvcm1MZWZ0ICsgdmlzaWJsZVRhYkNvbnRlbnRWYWx1ZSkge1xuICAgICAgICAgIG5ld1RyYW5zZm9ybSA9IHRhYk9mZnNldC5yaWdodCArIHRhYk9mZnNldC53aWR0aCAtIHZpc2libGVUYWJDb250ZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIExUUlxuICAgICAgZWxzZSBpZiAodGFiT2Zmc2V0LmxlZnQgPCAtdHJhbnNmb3JtTGVmdCkge1xuICAgICAgICBuZXdUcmFuc2Zvcm0gPSAtdGFiT2Zmc2V0LmxlZnQ7XG4gICAgICB9IGVsc2UgaWYgKHRhYk9mZnNldC5sZWZ0ICsgdGFiT2Zmc2V0LndpZHRoID4gLXRyYW5zZm9ybUxlZnQgKyB2aXNpYmxlVGFiQ29udGVudFZhbHVlKSB7XG4gICAgICAgIG5ld1RyYW5zZm9ybSA9IC0odGFiT2Zmc2V0LmxlZnQgKyB0YWJPZmZzZXQud2lkdGggLSB2aXNpYmxlVGFiQ29udGVudFZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHNldFRyYW5zZm9ybVRvcCgwKTtcbiAgICAgIHNldFRyYW5zZm9ybUxlZnQoYWxpZ25JblJhbmdlKG5ld1RyYW5zZm9ybSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyA9PT09PT09PT09PT0gQWxpZ24gd2l0aCBsZWZ0ICYgcmlnaHQgPT09PT09PT09PT09XG4gICAgICB2YXIgX25ld1RyYW5zZm9ybSA9IHRyYW5zZm9ybVRvcDtcbiAgICAgIGlmICh0YWJPZmZzZXQudG9wIDwgLXRyYW5zZm9ybVRvcCkge1xuICAgICAgICBfbmV3VHJhbnNmb3JtID0gLXRhYk9mZnNldC50b3A7XG4gICAgICB9IGVsc2UgaWYgKHRhYk9mZnNldC50b3AgKyB0YWJPZmZzZXQuaGVpZ2h0ID4gLXRyYW5zZm9ybVRvcCArIHZpc2libGVUYWJDb250ZW50VmFsdWUpIHtcbiAgICAgICAgX25ld1RyYW5zZm9ybSA9IC0odGFiT2Zmc2V0LnRvcCArIHRhYk9mZnNldC5oZWlnaHQgLSB2aXNpYmxlVGFiQ29udGVudFZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHNldFRyYW5zZm9ybUxlZnQoMCk7XG4gICAgICBzZXRUcmFuc2Zvcm1Ub3AoYWxpZ25JblJhbmdlKF9uZXdUcmFuc2Zvcm0pKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFRhYiA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgdGFiTm9kZVN0eWxlID0ge307XG4gIGlmICh0YWJQb3NpdGlvbiA9PT0gJ3RvcCcgfHwgdGFiUG9zaXRpb24gPT09ICdib3R0b20nKSB7XG4gICAgdGFiTm9kZVN0eWxlW3J0bCA/ICdtYXJnaW5SaWdodCcgOiAnbWFyZ2luTGVmdCddID0gdGFiQmFyR3V0dGVyO1xuICB9IGVsc2Uge1xuICAgIHRhYk5vZGVTdHlsZS5tYXJnaW5Ub3AgPSB0YWJCYXJHdXR0ZXI7XG4gIH1cbiAgdmFyIHRhYk5vZGVzID0gdGFicy5tYXAoZnVuY3Rpb24gKHRhYiwgaSkge1xuICAgIHZhciBrZXkgPSB0YWIua2V5O1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUYWJOb2RlLCB7XG4gICAgICBpZDogaWQsXG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIGtleToga2V5LFxuICAgICAgdGFiOiB0YWJcbiAgICAgIC8qIGZpcnN0IG5vZGUgc2hvdWxkIG5vdCBoYXZlIG1hcmdpbiBsZWZ0ICovLFxuICAgICAgc3R5bGU6IGkgPT09IDAgPyB1bmRlZmluZWQgOiB0YWJOb2RlU3R5bGUsXG4gICAgICBjbG9zYWJsZTogdGFiLmNsb3NhYmxlLFxuICAgICAgZWRpdGFibGU6IGVkaXRhYmxlLFxuICAgICAgYWN0aXZlOiBrZXkgPT09IGFjdGl2ZUtleSxcbiAgICAgIHJlbmRlcldyYXBwZXI6IGNoaWxkcmVuLFxuICAgICAgcmVtb3ZlQXJpYUxhYmVsOiBsb2NhbGUgPT09IG51bGwgfHwgbG9jYWxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBsb2NhbGUucmVtb3ZlQXJpYUxhYmVsLFxuICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljayhlKSB7XG4gICAgICAgIG9uVGFiQ2xpY2soa2V5LCBlKTtcbiAgICAgIH0sXG4gICAgICBvbkZvY3VzOiBmdW5jdGlvbiBvbkZvY3VzKCkge1xuICAgICAgICBzY3JvbGxUb1RhYihrZXkpO1xuICAgICAgICBkb0xvY2tBbmltYXRpb24oKTtcbiAgICAgICAgaWYgKCF0YWJzV3JhcHBlclJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZvY3VzIGVsZW1lbnQgd2lsbCBtYWtlIHNjcm9sbExlZnQgY2hhbmdlIHdoaWNoIHdlIHNob3VsZCByZXNldCBiYWNrXG4gICAgICAgIGlmICghcnRsKSB7XG4gICAgICAgICAgdGFic1dyYXBwZXJSZWYuY3VycmVudC5zY3JvbGxMZWZ0ID0gMDtcbiAgICAgICAgfVxuICAgICAgICB0YWJzV3JhcHBlclJlZi5jdXJyZW50LnNjcm9sbFRvcCA9IDA7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIFVwZGF0ZSBidXR0b25zIHJlY29yZHNcbiAgdmFyIHVwZGF0ZVRhYlNpemVzID0gZnVuY3Rpb24gdXBkYXRlVGFiU2l6ZXMoKSB7XG4gICAgcmV0dXJuIHNldFRhYlNpemVzKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBuZXdTaXplcyA9IG5ldyBNYXAoKTtcbiAgICAgIHRhYnMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgICAgdmFyIF90YWJMaXN0UmVmJGN1cnJlbnQ7XG4gICAgICAgIHZhciBrZXkgPSBfcmVmMi5rZXk7XG4gICAgICAgIHZhciBidG5Ob2RlID0gKF90YWJMaXN0UmVmJGN1cnJlbnQgPSB0YWJMaXN0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF90YWJMaXN0UmVmJGN1cnJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90YWJMaXN0UmVmJGN1cnJlbnQucXVlcnlTZWxlY3RvcihcIltkYXRhLW5vZGUta2V5PVxcXCJcIi5jb25jYXQoZ2VuRGF0YU5vZGVLZXkoa2V5KSwgXCJcXFwiXVwiKSk7XG4gICAgICAgIGlmIChidG5Ob2RlKSB7XG4gICAgICAgICAgbmV3U2l6ZXMuc2V0KGtleSwge1xuICAgICAgICAgICAgd2lkdGg6IGJ0bk5vZGUub2Zmc2V0V2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGJ0bk5vZGUub2Zmc2V0SGVpZ2h0LFxuICAgICAgICAgICAgbGVmdDogYnRuTm9kZS5vZmZzZXRMZWZ0LFxuICAgICAgICAgICAgdG9wOiBidG5Ob2RlLm9mZnNldFRvcFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXdTaXplcztcbiAgICB9KTtcbiAgfTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB1cGRhdGVUYWJTaXplcygpO1xuICB9LCBbdGFicy5tYXAoZnVuY3Rpb24gKHRhYikge1xuICAgIHJldHVybiB0YWIua2V5O1xuICB9KS5qb2luKCdfJyldKTtcbiAgdmFyIG9uTGlzdEhvbGRlclJlc2l6ZSA9IHVzZVVwZGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgLy8gVXBkYXRlIHdyYXBwZXIgcmVjb3Jkc1xuICAgIHZhciBjb250YWluZXJTaXplID0gZ2V0U2l6ZShjb250YWluZXJSZWYpO1xuICAgIHZhciBleHRyYUxlZnRTaXplID0gZ2V0U2l6ZShleHRyYUxlZnRSZWYpO1xuICAgIHZhciBleHRyYVJpZ2h0U2l6ZSA9IGdldFNpemUoZXh0cmFSaWdodFJlZik7XG4gICAgc2V0Q29udGFpbmVyRXhjbHVkZUV4dHJhU2l6ZShbY29udGFpbmVyU2l6ZVswXSAtIGV4dHJhTGVmdFNpemVbMF0gLSBleHRyYVJpZ2h0U2l6ZVswXSwgY29udGFpbmVyU2l6ZVsxXSAtIGV4dHJhTGVmdFNpemVbMV0gLSBleHRyYVJpZ2h0U2l6ZVsxXV0pO1xuICAgIHZhciBuZXdBZGRTaXplID0gZ2V0U2l6ZShpbm5lckFkZEJ1dHRvblJlZik7XG4gICAgc2V0QWRkU2l6ZShuZXdBZGRTaXplKTtcbiAgICB2YXIgbmV3T3BlcmF0aW9uU2l6ZSA9IGdldFNpemUob3BlcmF0aW9uc1JlZik7XG4gICAgc2V0T3BlcmF0aW9uU2l6ZShuZXdPcGVyYXRpb25TaXplKTtcblxuICAgIC8vIFdoaWNoIGluY2x1ZGVzIGFkZCBidXR0b24gc2l6ZVxuICAgIHZhciB0YWJDb250ZW50RnVsbFNpemUgPSBnZXRTaXplKHRhYkxpc3RSZWYpO1xuICAgIHNldFRhYkNvbnRlbnRTaXplKFt0YWJDb250ZW50RnVsbFNpemVbMF0gLSBuZXdBZGRTaXplWzBdLCB0YWJDb250ZW50RnVsbFNpemVbMV0gLSBuZXdBZGRTaXplWzFdXSk7XG5cbiAgICAvLyBVcGRhdGUgYnV0dG9ucyByZWNvcmRzXG4gICAgdXBkYXRlVGFiU2l6ZXMoKTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IERyb3Bkb3duID09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBzdGFydEhpZGRlblRhYnMgPSB0YWJzLnNsaWNlKDAsIHZpc2libGVTdGFydCk7XG4gIHZhciBlbmRIaWRkZW5UYWJzID0gdGFicy5zbGljZSh2aXNpYmxlRW5kICsgMSk7XG4gIHZhciBoaWRkZW5UYWJzID0gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShzdGFydEhpZGRlblRhYnMpLCBfdG9Db25zdW1hYmxlQXJyYXkoZW5kSGlkZGVuVGFicykpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT0gTGluayAmIE9wZXJhdGlvbnMgPT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZVN0YXRlMTEgPSB1c2VTdGF0ZSgpLFxuICAgIF91c2VTdGF0ZTEyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlMTEsIDIpLFxuICAgIGlua1N0eWxlID0gX3VzZVN0YXRlMTJbMF0sXG4gICAgc2V0SW5rU3R5bGUgPSBfdXNlU3RhdGUxMlsxXTtcbiAgdmFyIGFjdGl2ZVRhYk9mZnNldCA9IHRhYk9mZnNldHMuZ2V0KGFjdGl2ZUtleSk7XG5cbiAgLy8gRGVsYXkgc2V0IGluayBzdHlsZSB0byBhdm9pZCByZW1vdmUgdGFiIGJsaW5rXG4gIHZhciBpbmtCYXJSYWZSZWYgPSB1c2VSZWYoKTtcbiAgZnVuY3Rpb24gY2xlYW5JbmtCYXJSYWYoKSB7XG4gICAgcmFmLmNhbmNlbChpbmtCYXJSYWZSZWYuY3VycmVudCk7XG4gIH1cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbmV3SW5rU3R5bGUgPSB7fTtcbiAgICBpZiAoYWN0aXZlVGFiT2Zmc2V0KSB7XG4gICAgICBpZiAodGFiUG9zaXRpb25Ub3BPckJvdHRvbSkge1xuICAgICAgICBpZiAocnRsKSB7XG4gICAgICAgICAgbmV3SW5rU3R5bGUucmlnaHQgPSBhY3RpdmVUYWJPZmZzZXQucmlnaHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3SW5rU3R5bGUubGVmdCA9IGFjdGl2ZVRhYk9mZnNldC5sZWZ0O1xuICAgICAgICB9XG4gICAgICAgIG5ld0lua1N0eWxlLndpZHRoID0gYWN0aXZlVGFiT2Zmc2V0LndpZHRoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3SW5rU3R5bGUudG9wID0gYWN0aXZlVGFiT2Zmc2V0LnRvcDtcbiAgICAgICAgbmV3SW5rU3R5bGUuaGVpZ2h0ID0gYWN0aXZlVGFiT2Zmc2V0LmhlaWdodDtcbiAgICAgIH1cbiAgICB9XG4gICAgY2xlYW5JbmtCYXJSYWYoKTtcbiAgICBpbmtCYXJSYWZSZWYuY3VycmVudCA9IHJhZihmdW5jdGlvbiAoKSB7XG4gICAgICBzZXRJbmtTdHlsZShuZXdJbmtTdHlsZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNsZWFuSW5rQmFyUmFmO1xuICB9LCBbYWN0aXZlVGFiT2Zmc2V0LCB0YWJQb3NpdGlvblRvcE9yQm90dG9tLCBydGxdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IEVmZmVjdCA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzY3JvbGxUb1RhYigpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICB9LCBbYWN0aXZlS2V5LCB0cmFuc2Zvcm1NaW4sIHRyYW5zZm9ybU1heCwgc3RyaW5naWZ5KGFjdGl2ZVRhYk9mZnNldCksIHN0cmluZ2lmeSh0YWJPZmZzZXRzKSwgdGFiUG9zaXRpb25Ub3BPckJvdHRvbV0pO1xuXG4gIC8vIFNob3VsZCByZWNhbGN1bGF0ZSB3aGVuIHJ0bCBjaGFuZ2VkXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgb25MaXN0SG9sZGVyUmVzaXplKCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIH0sIFtydGxdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGhhc0Ryb3Bkb3duID0gISFoaWRkZW5UYWJzLmxlbmd0aDtcbiAgdmFyIHdyYXBQcmVmaXggPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW5hdi13cmFwXCIpO1xuICB2YXIgcGluZ0xlZnQ7XG4gIHZhciBwaW5nUmlnaHQ7XG4gIHZhciBwaW5nVG9wO1xuICB2YXIgcGluZ0JvdHRvbTtcbiAgaWYgKHRhYlBvc2l0aW9uVG9wT3JCb3R0b20pIHtcbiAgICBpZiAocnRsKSB7XG4gICAgICBwaW5nUmlnaHQgPSB0cmFuc2Zvcm1MZWZ0ID4gMDtcbiAgICAgIHBpbmdMZWZ0ID0gdHJhbnNmb3JtTGVmdCAhPT0gdHJhbnNmb3JtTWF4O1xuICAgIH0gZWxzZSB7XG4gICAgICBwaW5nTGVmdCA9IHRyYW5zZm9ybUxlZnQgPCAwO1xuICAgICAgcGluZ1JpZ2h0ID0gdHJhbnNmb3JtTGVmdCAhPT0gdHJhbnNmb3JtTWluO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBwaW5nVG9wID0gdHJhbnNmb3JtVG9wIDwgMDtcbiAgICBwaW5nQm90dG9tID0gdHJhbnNmb3JtVG9wICE9PSB0cmFuc2Zvcm1NaW47XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlc2l6ZU9ic2VydmVyLCB7XG4gICAgb25SZXNpemU6IG9uTGlzdEhvbGRlclJlc2l6ZVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgcmVmOiB1c2VDb21wb3NlUmVmKHJlZiwgY29udGFpbmVyUmVmKSxcbiAgICByb2xlOiBcInRhYmxpc3RcIixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1uYXZcIiksIGNsYXNzTmFtZSksXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIG9uS2V5RG93bjogZnVuY3Rpb24gb25LZXlEb3duKCkge1xuICAgICAgLy8gTm8gbmVlZCBhbmltYXRpb24gd2hlbiB1c2Uga2V5Ym9hcmRcbiAgICAgIGRvTG9ja0FuaW1hdGlvbigpO1xuICAgIH1cbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRXh0cmFDb250ZW50LCB7XG4gICAgcmVmOiBleHRyYUxlZnRSZWYsXG4gICAgcG9zaXRpb246IFwibGVmdFwiLFxuICAgIGV4dHJhOiBleHRyYSxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENsc1xuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyh3cmFwUHJlZml4LCAoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdCh3cmFwUHJlZml4LCBcIi1waW5nLWxlZnRcIiksIHBpbmdMZWZ0KSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdCh3cmFwUHJlZml4LCBcIi1waW5nLXJpZ2h0XCIpLCBwaW5nUmlnaHQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHdyYXBQcmVmaXgsIFwiLXBpbmctdG9wXCIpLCBwaW5nVG9wKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdCh3cmFwUHJlZml4LCBcIi1waW5nLWJvdHRvbVwiKSwgcGluZ0JvdHRvbSksIF9jbGFzc05hbWVzKSksXG4gICAgcmVmOiB0YWJzV3JhcHBlclJlZlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZXNpemVPYnNlcnZlciwge1xuICAgIG9uUmVzaXplOiBvbkxpc3RIb2xkZXJSZXNpemVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHJlZjogdGFiTGlzdFJlZixcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbmF2LWxpc3RcIiksXG4gICAgc3R5bGU6IHtcbiAgICAgIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGUoXCIuY29uY2F0KHRyYW5zZm9ybUxlZnQsIFwicHgsIFwiKS5jb25jYXQodHJhbnNmb3JtVG9wLCBcInB4KVwiKSxcbiAgICAgIHRyYW5zaXRpb246IGxvY2tBbmltYXRpb24gPyAnbm9uZScgOiB1bmRlZmluZWRcbiAgICB9XG4gIH0sIHRhYk5vZGVzLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBZGRCdXR0b24sIHtcbiAgICByZWY6IGlubmVyQWRkQnV0dG9uUmVmLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGxvY2FsZTogbG9jYWxlLFxuICAgIGVkaXRhYmxlOiBlZGl0YWJsZSxcbiAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB0YWJOb2Rlcy5sZW5ndGggPT09IDAgPyB1bmRlZmluZWQgOiB0YWJOb2RlU3R5bGUpLCB7fSwge1xuICAgICAgdmlzaWJpbGl0eTogaGFzRHJvcGRvd24gPyAnaGlkZGVuJyA6IG51bGxcbiAgICB9KVxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWluay1iYXJcIiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbmstYmFyLWFuaW1hdGVkXCIpLCBhbmltYXRlZC5pbmtCYXIpKSxcbiAgICBzdHlsZTogaW5rU3R5bGVcbiAgfSkpKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE9wZXJhdGlvbk5vZGUsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHJlbW92ZUFyaWFMYWJlbDogbG9jYWxlID09PSBudWxsIHx8IGxvY2FsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbG9jYWxlLnJlbW92ZUFyaWFMYWJlbCxcbiAgICByZWY6IG9wZXJhdGlvbnNSZWYsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgdGFiczogaGlkZGVuVGFicyxcbiAgICBjbGFzc05hbWU6ICFoYXNEcm9wZG93biAmJiBvcGVyYXRpb25zSGlkZGVuQ2xhc3NOYW1lLFxuICAgIHRhYk1vdmluZzogISFsb2NrQW5pbWF0aW9uXG4gIH0pKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRXh0cmFDb250ZW50LCB7XG4gICAgcmVmOiBleHRyYVJpZ2h0UmVmLFxuICAgIHBvc2l0aW9uOiBcInJpZ2h0XCIsXG4gICAgZXh0cmE6IGV4dHJhLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzXG4gIH0pKSk7XG4gIC8qIGVzbGludC1lbmFibGUgKi9cbn1cblxuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoVGFiTmF2TGlzdCk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJyZW5kZXJUYWJCYXJcIl0sXG4gIF9leGNsdWRlZDIgPSBbXCJsYWJlbFwiLCBcImtleVwiXTtcbi8vIHpvbWJpZUo6IFRvIGNvbXBhdGlibGUgd2l0aCBgcmVuZGVyVGFiQmFyYCB1c2FnZS5cblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFRhYk5hdkxpc3QgZnJvbSAnLic7XG5pbXBvcnQgVGFiQ29udGV4dCBmcm9tIFwiLi4vVGFiQ29udGV4dFwiO1xuaW1wb3J0IFRhYlBhbmUgZnJvbSBcIi4uL1RhYlBhbmVsTGlzdC9UYWJQYW5lXCI7XG4vLyBXZSBoYXZlIHRvIGNyZWF0ZSBhIFRhYk5hdkxpc3QgY29tcG9uZW50cy5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFRhYk5hdkxpc3RXcmFwcGVyKF9yZWYpIHtcbiAgdmFyIHJlbmRlclRhYkJhciA9IF9yZWYucmVuZGVyVGFiQmFyLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFRhYkNvbnRleHQpLFxuICAgIHRhYnMgPSBfUmVhY3QkdXNlQ29udGV4dC50YWJzO1xuICBpZiAocmVuZGVyVGFiQmFyKSB7XG4gICAgdmFyIHRhYk5hdkJhclByb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCByZXN0UHJvcHMpLCB7fSwge1xuICAgICAgLy8gTGVnYWN5IHN1cHBvcnQuIFdlIGRvIG5vdCB1c2UgdGhpcyBhY3R1YWxseVxuICAgICAgcGFuZXM6IHRhYnMubWFwKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgICB2YXIgbGFiZWwgPSBfcmVmMi5sYWJlbCxcbiAgICAgICAgICBrZXkgPSBfcmVmMi5rZXksXG4gICAgICAgICAgcmVzdFRhYlByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYyLCBfZXhjbHVkZWQyKTtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRhYlBhbmUsIF9leHRlbmRzKHtcbiAgICAgICAgICB0YWI6IGxhYmVsLFxuICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgIHRhYktleToga2V5XG4gICAgICAgIH0sIHJlc3RUYWJQcm9wcykpO1xuICAgICAgfSlcbiAgICB9KTtcbiAgICByZXR1cm4gcmVuZGVyVGFiQmFyKHRhYk5hdkJhclByb3BzLCBUYWJOYXZMaXN0KTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiTmF2TGlzdCwgcmVzdFByb3BzKTtcbn0iLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlQW5pbWF0ZUNvbmZpZygpIHtcbiAgdmFyIGFuaW1hdGVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7XG4gICAgaW5rQmFyOiB0cnVlLFxuICAgIHRhYlBhbmU6IGZhbHNlXG4gIH07XG4gIHZhciBtZXJnZWRBbmltYXRlZDtcbiAgaWYgKGFuaW1hdGVkID09PSBmYWxzZSkge1xuICAgIG1lcmdlZEFuaW1hdGVkID0ge1xuICAgICAgaW5rQmFyOiBmYWxzZSxcbiAgICAgIHRhYlBhbmU6IGZhbHNlXG4gICAgfTtcbiAgfSBlbHNlIGlmIChhbmltYXRlZCA9PT0gdHJ1ZSkge1xuICAgIG1lcmdlZEFuaW1hdGVkID0ge1xuICAgICAgaW5rQmFyOiB0cnVlLFxuICAgICAgdGFiUGFuZTogZmFsc2VcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIG1lcmdlZEFuaW1hdGVkID0gX29iamVjdFNwcmVhZCh7XG4gICAgICBpbmtCYXI6IHRydWVcbiAgICB9LCBfdHlwZW9mKGFuaW1hdGVkKSA9PT0gJ29iamVjdCcgPyBhbmltYXRlZCA6IHt9KTtcbiAgfVxuXG4gIC8vIEVuYWJsZSB0YWJQYW5lIGFuaW1hdGlvbiBpZiBwcm92aWRlIG1vdGlvblxuICBpZiAobWVyZ2VkQW5pbWF0ZWQudGFiUGFuZU1vdGlvbiAmJiBtZXJnZWRBbmltYXRlZC50YWJQYW5lID09PSB1bmRlZmluZWQpIHtcbiAgICBtZXJnZWRBbmltYXRlZC50YWJQYW5lID0gdHJ1ZTtcbiAgfVxuICBpZiAoIW1lcmdlZEFuaW1hdGVkLnRhYlBhbmVNb3Rpb24gJiYgbWVyZ2VkQW5pbWF0ZWQudGFiUGFuZSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB3YXJuaW5nKGZhbHNlLCAnYGFuaW1hdGVkLnRhYlBhbmVgIGlzIHRydWUgYnV0IGBhbmltYXRlZC50YWJQYW5lTW90aW9uYCBpcyBub3QgcHJvdmlkZWQuIE1vdGlvbiB3aWxsIG5vdCB3b3JrLicpO1xuICAgIH1cbiAgICBtZXJnZWRBbmltYXRlZC50YWJQYW5lID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIG1lcmdlZEFuaW1hdGVkO1xufSIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiaWRcIiwgXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJpdGVtc1wiLCBcImRpcmVjdGlvblwiLCBcImFjdGl2ZUtleVwiLCBcImRlZmF1bHRBY3RpdmVLZXlcIiwgXCJlZGl0YWJsZVwiLCBcImFuaW1hdGVkXCIsIFwidGFiUG9zaXRpb25cIiwgXCJ0YWJCYXJHdXR0ZXJcIiwgXCJ0YWJCYXJTdHlsZVwiLCBcInRhYkJhckV4dHJhQ29udGVudFwiLCBcImxvY2FsZVwiLCBcIm1vcmVJY29uXCIsIFwibW9yZVRyYW5zaXRpb25OYW1lXCIsIFwiZGVzdHJveUluYWN0aXZlVGFiUGFuZVwiLCBcInJlbmRlclRhYkJhclwiLCBcIm9uQ2hhbmdlXCIsIFwib25UYWJDbGlja1wiLCBcIm9uVGFiU2Nyb2xsXCIsIFwiZ2V0UG9wdXBDb250YWluZXJcIiwgXCJwb3B1cENsYXNzTmFtZVwiXTtcbi8vIEFjY2Vzc2liaWxpdHkgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQWNjZXNzaWJpbGl0eS9BUklBL1JvbGVzL1RhYl9Sb2xlXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgaXNNb2JpbGUgZnJvbSBcInJjLXV0aWwvZXMvaXNNb2JpbGVcIjtcbmltcG9ydCB1c2VNZXJnZWRTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZXJnZWRTdGF0ZVwiO1xuaW1wb3J0IFRhYlBhbmVsTGlzdCBmcm9tIFwiLi9UYWJQYW5lbExpc3RcIjtcbmltcG9ydCBUYWJDb250ZXh0IGZyb20gXCIuL1RhYkNvbnRleHRcIjtcbmltcG9ydCBUYWJOYXZMaXN0V3JhcHBlciBmcm9tIFwiLi9UYWJOYXZMaXN0L1dyYXBwZXJcIjtcbmltcG9ydCB1c2VBbmltYXRlQ29uZmlnIGZyb20gXCIuL2hvb2tzL3VzZUFuaW1hdGVDb25maWdcIjtcblxuLyoqXG4gKiBTaG91bGQgYWRkZWQgYW50ZDpcbiAqIC0gdHlwZVxuICpcbiAqIFJlbW92ZWQ6XG4gKiAtIG9uTmV4dENsaWNrXG4gKiAtIG9uUHJldkNsaWNrXG4gKiAtIGtleWJvYXJkXG4gKi9cblxuLy8gVXNlZCBmb3IgYWNjZXNzaWJpbGl0eVxudmFyIHV1aWQgPSAwO1xuZnVuY3Rpb24gVGFicyhfcmVmLCByZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuICB2YXIgaWQgPSBfcmVmLmlkLFxuICAgIF9yZWYkcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHMsXG4gICAgcHJlZml4Q2xzID0gX3JlZiRwcmVmaXhDbHMgPT09IHZvaWQgMCA/ICdyYy10YWJzJyA6IF9yZWYkcHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgIGl0ZW1zID0gX3JlZi5pdGVtcyxcbiAgICBkaXJlY3Rpb24gPSBfcmVmLmRpcmVjdGlvbixcbiAgICBhY3RpdmVLZXkgPSBfcmVmLmFjdGl2ZUtleSxcbiAgICBkZWZhdWx0QWN0aXZlS2V5ID0gX3JlZi5kZWZhdWx0QWN0aXZlS2V5LFxuICAgIGVkaXRhYmxlID0gX3JlZi5lZGl0YWJsZSxcbiAgICBhbmltYXRlZCA9IF9yZWYuYW5pbWF0ZWQsXG4gICAgX3JlZiR0YWJQb3NpdGlvbiA9IF9yZWYudGFiUG9zaXRpb24sXG4gICAgdGFiUG9zaXRpb24gPSBfcmVmJHRhYlBvc2l0aW9uID09PSB2b2lkIDAgPyAndG9wJyA6IF9yZWYkdGFiUG9zaXRpb24sXG4gICAgdGFiQmFyR3V0dGVyID0gX3JlZi50YWJCYXJHdXR0ZXIsXG4gICAgdGFiQmFyU3R5bGUgPSBfcmVmLnRhYkJhclN0eWxlLFxuICAgIHRhYkJhckV4dHJhQ29udGVudCA9IF9yZWYudGFiQmFyRXh0cmFDb250ZW50LFxuICAgIGxvY2FsZSA9IF9yZWYubG9jYWxlLFxuICAgIG1vcmVJY29uID0gX3JlZi5tb3JlSWNvbixcbiAgICBtb3JlVHJhbnNpdGlvbk5hbWUgPSBfcmVmLm1vcmVUcmFuc2l0aW9uTmFtZSxcbiAgICBkZXN0cm95SW5hY3RpdmVUYWJQYW5lID0gX3JlZi5kZXN0cm95SW5hY3RpdmVUYWJQYW5lLFxuICAgIHJlbmRlclRhYkJhciA9IF9yZWYucmVuZGVyVGFiQmFyLFxuICAgIG9uQ2hhbmdlID0gX3JlZi5vbkNoYW5nZSxcbiAgICBvblRhYkNsaWNrID0gX3JlZi5vblRhYkNsaWNrLFxuICAgIG9uVGFiU2Nyb2xsID0gX3JlZi5vblRhYlNjcm9sbCxcbiAgICBnZXRQb3B1cENvbnRhaW5lciA9IF9yZWYuZ2V0UG9wdXBDb250YWluZXIsXG4gICAgcG9wdXBDbGFzc05hbWUgPSBfcmVmLnBvcHVwQ2xhc3NOYW1lLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuICB2YXIgdGFicyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAoaXRlbXMgfHwgW10pLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIGl0ZW0gJiYgX3R5cGVvZihpdGVtKSA9PT0gJ29iamVjdCcgJiYgJ2tleScgaW4gaXRlbTtcbiAgICB9KTtcbiAgfSwgW2l0ZW1zXSk7XG4gIHZhciBydGwgPSBkaXJlY3Rpb24gPT09ICdydGwnO1xuICB2YXIgbWVyZ2VkQW5pbWF0ZWQgPSB1c2VBbmltYXRlQ29uZmlnKGFuaW1hdGVkKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gTW9iaWxlID09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoZmFsc2UpLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIG1vYmlsZSA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0TW9iaWxlID0gX3VzZVN0YXRlMlsxXTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAvLyBPbmx5IHVwZGF0ZSBvbiB0aGUgY2xpZW50IHNpZGVcbiAgICBzZXRNb2JpbGUoaXNNb2JpbGUoKSk7XG4gIH0sIFtdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IEFjdGl2ZSBLZXkgPT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZU1lcmdlZFN0YXRlID0gdXNlTWVyZ2VkU3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90YWJzJDtcbiAgICAgIHJldHVybiAoX3RhYnMkID0gdGFic1swXSkgPT09IG51bGwgfHwgX3RhYnMkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGFicyQua2V5O1xuICAgIH0sIHtcbiAgICAgIHZhbHVlOiBhY3RpdmVLZXksXG4gICAgICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRBY3RpdmVLZXlcbiAgICB9KSxcbiAgICBfdXNlTWVyZ2VkU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZU1lcmdlZFN0YXRlLCAyKSxcbiAgICBtZXJnZWRBY3RpdmVLZXkgPSBfdXNlTWVyZ2VkU3RhdGUyWzBdLFxuICAgIHNldE1lcmdlZEFjdGl2ZUtleSA9IF91c2VNZXJnZWRTdGF0ZTJbMV07XG4gIHZhciBfdXNlU3RhdGUzID0gdXNlU3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRhYnMuZmluZEluZGV4KGZ1bmN0aW9uICh0YWIpIHtcbiAgICAgICAgcmV0dXJuIHRhYi5rZXkgPT09IG1lcmdlZEFjdGl2ZUtleTtcbiAgICAgIH0pO1xuICAgIH0pLFxuICAgIF91c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUzLCAyKSxcbiAgICBhY3RpdmVJbmRleCA9IF91c2VTdGF0ZTRbMF0sXG4gICAgc2V0QWN0aXZlSW5kZXggPSBfdXNlU3RhdGU0WzFdO1xuXG4gIC8vIFJlc2V0IGFjdGl2ZSBrZXkgaWYgbm90IGV4aXN0IGFueW1vcmVcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbmV3QWN0aXZlSW5kZXggPSB0YWJzLmZpbmRJbmRleChmdW5jdGlvbiAodGFiKSB7XG4gICAgICByZXR1cm4gdGFiLmtleSA9PT0gbWVyZ2VkQWN0aXZlS2V5O1xuICAgIH0pO1xuICAgIGlmIChuZXdBY3RpdmVJbmRleCA9PT0gLTEpIHtcbiAgICAgIHZhciBfdGFicyRuZXdBY3RpdmVJbmRleDtcbiAgICAgIG5ld0FjdGl2ZUluZGV4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oYWN0aXZlSW5kZXgsIHRhYnMubGVuZ3RoIC0gMSkpO1xuICAgICAgc2V0TWVyZ2VkQWN0aXZlS2V5KChfdGFicyRuZXdBY3RpdmVJbmRleCA9IHRhYnNbbmV3QWN0aXZlSW5kZXhdKSA9PT0gbnVsbCB8fCBfdGFicyRuZXdBY3RpdmVJbmRleCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RhYnMkbmV3QWN0aXZlSW5kZXgua2V5KTtcbiAgICB9XG4gICAgc2V0QWN0aXZlSW5kZXgobmV3QWN0aXZlSW5kZXgpO1xuICB9LCBbdGFicy5tYXAoZnVuY3Rpb24gKHRhYikge1xuICAgIHJldHVybiB0YWIua2V5O1xuICB9KS5qb2luKCdfJyksIG1lcmdlZEFjdGl2ZUtleSwgYWN0aXZlSW5kZXhdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gQWNjZXNzaWJpbGl0eSA9PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZU1lcmdlZFN0YXRlMyA9IHVzZU1lcmdlZFN0YXRlKG51bGwsIHtcbiAgICAgIHZhbHVlOiBpZFxuICAgIH0pLFxuICAgIF91c2VNZXJnZWRTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGUzLCAyKSxcbiAgICBtZXJnZWRJZCA9IF91c2VNZXJnZWRTdGF0ZTRbMF0sXG4gICAgc2V0TWVyZ2VkSWQgPSBfdXNlTWVyZ2VkU3RhdGU0WzFdO1xuXG4gIC8vIEFzeW5jIGdlbmVyYXRlIGlkIHRvIGF2b2lkIHNzciBtYXBwaW5nIGZhaWxlZFxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghaWQpIHtcbiAgICAgIHNldE1lcmdlZElkKFwicmMtdGFicy1cIi5jb25jYXQocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICd0ZXN0JyA/ICd0ZXN0JyA6IHV1aWQpKTtcbiAgICAgIHV1aWQgKz0gMTtcbiAgICB9XG4gIH0sIFtdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gRXZlbnRzID09PT09PT09PT09PT09PT09PT09PT09PVxuICBmdW5jdGlvbiBvbkludGVybmFsVGFiQ2xpY2soa2V5LCBlKSB7XG4gICAgb25UYWJDbGljayA9PT0gbnVsbCB8fCBvblRhYkNsaWNrID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvblRhYkNsaWNrKGtleSwgZSk7XG4gICAgdmFyIGlzQWN0aXZlQ2hhbmdlZCA9IGtleSAhPT0gbWVyZ2VkQWN0aXZlS2V5O1xuICAgIHNldE1lcmdlZEFjdGl2ZUtleShrZXkpO1xuICAgIGlmIChpc0FjdGl2ZUNoYW5nZWQpIHtcbiAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShrZXkpO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBzaGFyZWRQcm9wcyA9IHtcbiAgICBpZDogbWVyZ2VkSWQsXG4gICAgYWN0aXZlS2V5OiBtZXJnZWRBY3RpdmVLZXksXG4gICAgYW5pbWF0ZWQ6IG1lcmdlZEFuaW1hdGVkLFxuICAgIHRhYlBvc2l0aW9uOiB0YWJQb3NpdGlvbixcbiAgICBydGw6IHJ0bCxcbiAgICBtb2JpbGU6IG1vYmlsZVxuICB9O1xuICB2YXIgdGFiTmF2QmFyO1xuICB2YXIgdGFiTmF2QmFyUHJvcHMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHNoYXJlZFByb3BzKSwge30sIHtcbiAgICBlZGl0YWJsZTogZWRpdGFibGUsXG4gICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgbW9yZUljb246IG1vcmVJY29uLFxuICAgIG1vcmVUcmFuc2l0aW9uTmFtZTogbW9yZVRyYW5zaXRpb25OYW1lLFxuICAgIHRhYkJhckd1dHRlcjogdGFiQmFyR3V0dGVyLFxuICAgIG9uVGFiQ2xpY2s6IG9uSW50ZXJuYWxUYWJDbGljayxcbiAgICBvblRhYlNjcm9sbDogb25UYWJTY3JvbGwsXG4gICAgZXh0cmE6IHRhYkJhckV4dHJhQ29udGVudCxcbiAgICBzdHlsZTogdGFiQmFyU3R5bGUsXG4gICAgcGFuZXM6IG51bGwsXG4gICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFBvcHVwQ29udGFpbmVyLFxuICAgIHBvcHVwQ2xhc3NOYW1lOiBwb3B1cENsYXNzTmFtZVxuICB9KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRhYkNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZToge1xuICAgICAgdGFiczogdGFicyxcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzXG4gICAgfVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgcmVmOiByZWYsXG4gICAgaWQ6IGlkLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhwcmVmaXhDbHMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdCh0YWJQb3NpdGlvbiksIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbW9iaWxlXCIpLCBtb2JpbGUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZWRpdGFibGVcIiksIGVkaXRhYmxlKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgcnRsKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpXG4gIH0sIHJlc3RQcm9wcyksIHRhYk5hdkJhciwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiTmF2TGlzdFdyYXBwZXIsIF9leHRlbmRzKHt9LCB0YWJOYXZCYXJQcm9wcywge1xuICAgIHJlbmRlclRhYkJhcjogcmVuZGVyVGFiQmFyXG4gIH0pKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiUGFuZWxMaXN0LCBfZXh0ZW5kcyh7XG4gICAgZGVzdHJveUluYWN0aXZlVGFiUGFuZTogZGVzdHJveUluYWN0aXZlVGFiUGFuZVxuICB9LCBzaGFyZWRQcm9wcywge1xuICAgIGFuaW1hdGVkOiBtZXJnZWRBbmltYXRlZFxuICB9KSkpKTtcbn1cbnZhciBGb3J3YXJkVGFicyA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKFRhYnMpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgRm9yd2FyZFRhYnMuZGlzcGxheU5hbWUgPSAnVGFicyc7XG59XG5leHBvcnQgZGVmYXVsdCBGb3J3YXJkVGFiczsiLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCB7IGdldFRyYW5zaXRpb25OYW1lIH0gZnJvbSAnLi4vLi4vX3V0aWwvbW90aW9uJztcbnZhciBtb3Rpb24gPSB7XG4gIG1vdGlvbkFwcGVhcjogZmFsc2UsXG4gIG1vdGlvbkVudGVyOiB0cnVlLFxuICBtb3Rpb25MZWF2ZTogdHJ1ZVxufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUFuaW1hdGVDb25maWcocHJlZml4Q2xzKSB7XG4gIHZhciBhbmltYXRlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge1xuICAgIGlua0JhcjogdHJ1ZSxcbiAgICB0YWJQYW5lOiBmYWxzZVxuICB9O1xuICB2YXIgbWVyZ2VkQW5pbWF0ZWQ7XG4gIGlmIChhbmltYXRlZCA9PT0gZmFsc2UpIHtcbiAgICBtZXJnZWRBbmltYXRlZCA9IHtcbiAgICAgIGlua0JhcjogZmFsc2UsXG4gICAgICB0YWJQYW5lOiBmYWxzZVxuICAgIH07XG4gIH0gZWxzZSBpZiAoYW5pbWF0ZWQgPT09IHRydWUpIHtcbiAgICBtZXJnZWRBbmltYXRlZCA9IHtcbiAgICAgIGlua0JhcjogdHJ1ZSxcbiAgICAgIHRhYlBhbmU6IHRydWVcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIG1lcmdlZEFuaW1hdGVkID0gX2V4dGVuZHMoe1xuICAgICAgaW5rQmFyOiB0cnVlXG4gICAgfSwgX3R5cGVvZihhbmltYXRlZCkgPT09ICdvYmplY3QnID8gYW5pbWF0ZWQgOiB7fSk7XG4gIH1cbiAgaWYgKG1lcmdlZEFuaW1hdGVkLnRhYlBhbmUpIHtcbiAgICBtZXJnZWRBbmltYXRlZC50YWJQYW5lTW90aW9uID0gX2V4dGVuZHMoX2V4dGVuZHMoe30sIG1vdGlvbiksIHtcbiAgICAgIG1vdGlvbk5hbWU6IGdldFRyYW5zaXRpb25OYW1lKHByZWZpeENscywgJ3N3aXRjaCcpXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG1lcmdlZEFuaW1hdGVkO1xufSIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0b0FycmF5IGZyb20gXCJyYy11dGlsL2VzL0NoaWxkcmVuL3RvQXJyYXlcIjtcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4uLy4uL191dGlsL3dhcm5pbmcnO1xuZnVuY3Rpb24gZmlsdGVyKGl0ZW1zKSB7XG4gIHJldHVybiBpdGVtcy5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICByZXR1cm4gaXRlbTtcbiAgfSk7XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VMZWdhY3lJdGVtcyhpdGVtcywgY2hpbGRyZW4pIHtcbiAgaWYgKGl0ZW1zKSB7XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoIWNoaWxkcmVuLCAnVGFicycsICdUYWJzLlRhYlBhbmUgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBgaXRlbXNgIGRpcmVjdGx5LicpIDogdm9pZCAwO1xuICB2YXIgY2hpbGRyZW5JdGVtcyA9IHRvQXJyYXkoY2hpbGRyZW4pLm1hcChmdW5jdGlvbiAobm9kZSkge1xuICAgIGlmICggLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KG5vZGUpKSB7XG4gICAgICB2YXIga2V5ID0gbm9kZS5rZXksXG4gICAgICAgIHByb3BzID0gbm9kZS5wcm9wcztcbiAgICAgIHZhciBfYSA9IHByb3BzIHx8IHt9LFxuICAgICAgICB0YWIgPSBfYS50YWIsXG4gICAgICAgIHJlc3RQcm9wcyA9IF9fcmVzdChfYSwgW1widGFiXCJdKTtcbiAgICAgIHZhciBpdGVtID0gX2V4dGVuZHMoX2V4dGVuZHMoe1xuICAgICAgICBrZXk6IFN0cmluZyhrZXkpXG4gICAgICB9LCByZXN0UHJvcHMpLCB7XG4gICAgICAgIGxhYmVsOiB0YWJcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9KTtcbiAgcmV0dXJuIGZpbHRlcihjaGlsZHJlbkl0ZW1zKTtcbn0iLCJ2YXIgVGFiUGFuZSA9IGZ1bmN0aW9uIFRhYlBhbmUoKSB7XG4gIHJldHVybiBudWxsO1xufTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFRhYlBhbmUuZGlzcGxheU5hbWUgPSAnRGVwcmVjYXRlZFRhYlBhbmUnO1xufVxuZXhwb3J0IGRlZmF1bHQgVGFiUGFuZTsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IENsb3NlT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Nsb3NlT3V0bGluZWRcIjtcbmltcG9ydCBFbGxpcHNpc091dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9FbGxpcHNpc091dGxpbmVkXCI7XG5pbXBvcnQgUGx1c091dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9QbHVzT3V0bGluZWRcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJjVGFicyBmcm9tICdyYy10YWJzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IFNpemVDb250ZXh0IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlci9TaXplQ29udGV4dCc7XG5pbXBvcnQgd2FybmluZyBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmltcG9ydCB1c2VBbmltYXRlQ29uZmlnIGZyb20gJy4vaG9va3MvdXNlQW5pbWF0ZUNvbmZpZyc7XG5pbXBvcnQgdXNlTGVnYWN5SXRlbXMgZnJvbSAnLi9ob29rcy91c2VMZWdhY3lJdGVtcyc7XG5pbXBvcnQgVGFiUGFuZSBmcm9tICcuL1RhYlBhbmUnO1xuZnVuY3Rpb24gVGFicyhfYSkge1xuICB2YXIgdHlwZSA9IF9hLnR5cGUsXG4gICAgY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lLFxuICAgIHByb3BTaXplID0gX2Euc2l6ZSxcbiAgICBfb25FZGl0ID0gX2Eub25FZGl0LFxuICAgIGhpZGVBZGQgPSBfYS5oaWRlQWRkLFxuICAgIGNlbnRlcmVkID0gX2EuY2VudGVyZWQsXG4gICAgYWRkSWNvbiA9IF9hLmFkZEljb24sXG4gICAgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbixcbiAgICBpdGVtcyA9IF9hLml0ZW1zLFxuICAgIGFuaW1hdGVkID0gX2EuYW5pbWF0ZWQsXG4gICAgcHJvcHMgPSBfX3Jlc3QoX2EsIFtcInR5cGVcIiwgXCJjbGFzc05hbWVcIiwgXCJzaXplXCIsIFwib25FZGl0XCIsIFwiaGlkZUFkZFwiLCBcImNlbnRlcmVkXCIsIFwiYWRkSWNvblwiLCBcImNoaWxkcmVuXCIsIFwiaXRlbXNcIiwgXCJhbmltYXRlZFwiXSk7XG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgX3Byb3BzJG1vcmVJY29uID0gcHJvcHMubW9yZUljb24sXG4gICAgbW9yZUljb24gPSBfcHJvcHMkbW9yZUljb24gPT09IHZvaWQgMCA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsbGlwc2lzT3V0bGluZWQsIG51bGwpIDogX3Byb3BzJG1vcmVJY29uO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICBkaXJlY3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb24sXG4gICAgZ2V0UG9wdXBDb250YWluZXIgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQb3B1cENvbnRhaW5lcjtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygndGFicycsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIHZhciBlZGl0YWJsZTtcbiAgaWYgKHR5cGUgPT09ICdlZGl0YWJsZS1jYXJkJykge1xuICAgIGVkaXRhYmxlID0ge1xuICAgICAgb25FZGl0OiBmdW5jdGlvbiBvbkVkaXQoZWRpdFR5cGUsIF9yZWYpIHtcbiAgICAgICAgdmFyIGtleSA9IF9yZWYua2V5LFxuICAgICAgICAgIGV2ZW50ID0gX3JlZi5ldmVudDtcbiAgICAgICAgX29uRWRpdCA9PT0gbnVsbCB8fCBfb25FZGl0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb25FZGl0KGVkaXRUeXBlID09PSAnYWRkJyA/IGV2ZW50IDoga2V5LCBlZGl0VHlwZSk7XG4gICAgICB9LFxuICAgICAgcmVtb3ZlSWNvbjogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2xvc2VPdXRsaW5lZCwgbnVsbCksXG4gICAgICBhZGRJY29uOiBhZGRJY29uIHx8IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBsdXNPdXRsaW5lZCwgbnVsbCksXG4gICAgICBzaG93QWRkOiBoaWRlQWRkICE9PSB0cnVlXG4gICAgfTtcbiAgfVxuICB2YXIgcm9vdFByZWZpeENscyA9IGdldFByZWZpeENscygpO1xuICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCEoJ29uUHJldkNsaWNrJyBpbiBwcm9wcykgJiYgISgnb25OZXh0Q2xpY2snIGluIHByb3BzKSwgJ1RhYnMnLCAnYG9uUHJldkNsaWNrYCBhbmQgYG9uTmV4dENsaWNrYCBoYXMgYmVlbiByZW1vdmVkLiBQbGVhc2UgdXNlIGBvblRhYlNjcm9sbGAgaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgdmFyIG1lcmdlZEl0ZW1zID0gdXNlTGVnYWN5SXRlbXMoaXRlbXMsIGNoaWxkcmVuKTtcbiAgdmFyIG1lcmdlZEFuaW1hdGVkID0gdXNlQW5pbWF0ZUNvbmZpZyhwcmVmaXhDbHMsIGFuaW1hdGVkKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNpemVDb250ZXh0LkNvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoY29udGV4dFNpemUpIHtcbiAgICB2YXIgX2NsYXNzTmFtZXM7XG4gICAgdmFyIHNpemUgPSBwcm9wU2l6ZSAhPT0gdW5kZWZpbmVkID8gcHJvcFNpemUgOiBjb250ZXh0U2l6ZTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmNUYWJzLCBfZXh0ZW5kcyh7XG4gICAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lcixcbiAgICAgIG1vcmVUcmFuc2l0aW9uTmFtZTogXCJcIi5jb25jYXQocm9vdFByZWZpeENscywgXCItc2xpZGUtdXBcIilcbiAgICB9LCBwcm9wcywge1xuICAgICAgaXRlbXM6IG1lcmdlZEl0ZW1zLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChzaXplKSwgc2l6ZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jYXJkXCIpLCBbJ2NhcmQnLCAnZWRpdGFibGUtY2FyZCddLmluY2x1ZGVzKHR5cGUpKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWVkaXRhYmxlLWNhcmRcIiksIHR5cGUgPT09ICdlZGl0YWJsZS1jYXJkJyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jZW50ZXJlZFwiKSwgY2VudGVyZWQpLCBfY2xhc3NOYW1lcyksIGNsYXNzTmFtZSksXG4gICAgICBlZGl0YWJsZTogZWRpdGFibGUsXG4gICAgICBtb3JlSWNvbjogbW9yZUljb24sXG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIGFuaW1hdGVkOiBtZXJnZWRBbmltYXRlZFxuICAgIH0pKTtcbiAgfSk7XG59XG5UYWJzLlRhYlBhbmUgPSBUYWJQYW5lO1xuZXhwb3J0IGRlZmF1bHQgVGFiczsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb25zdW1lciB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG52YXIgR3JpZCA9IGZ1bmN0aW9uIEdyaWQoX2EpIHtcbiAgdmFyIHByZWZpeENscyA9IF9hLnByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBfYS5jbGFzc05hbWUsXG4gICAgX2EkaG92ZXJhYmxlID0gX2EuaG92ZXJhYmxlLFxuICAgIGhvdmVyYWJsZSA9IF9hJGhvdmVyYWJsZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9hJGhvdmVyYWJsZSxcbiAgICBwcm9wcyA9IF9fcmVzdChfYSwgW1wicHJlZml4Q2xzXCIsIFwiY2xhc3NOYW1lXCIsIFwiaG92ZXJhYmxlXCJdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbmZpZ0NvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBnZXRQcmVmaXhDbHMgPSBfcmVmLmdldFByZWZpeENscztcbiAgICB2YXIgcHJlZml4ID0gZ2V0UHJlZml4Q2xzKCdjYXJkJywgcHJlZml4Q2xzKTtcbiAgICB2YXIgY2xhc3NTdHJpbmcgPSBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeCwgXCItZ3JpZFwiKSwgY2xhc3NOYW1lLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeCwgXCItZ3JpZC1ob3ZlcmFibGVcIiksIGhvdmVyYWJsZSkpO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NTdHJpbmdcbiAgICB9KSk7XG4gIH0pO1xufTtcbmV4cG9ydCBkZWZhdWx0IEdyaWQ7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IG9taXQgZnJvbSBcInJjLXV0aWwvZXMvb21pdFwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgU2l6ZUNvbnRleHQgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL1NpemVDb250ZXh0JztcbmltcG9ydCBTa2VsZXRvbiBmcm9tICcuLi9za2VsZXRvbic7XG5pbXBvcnQgVGFicyBmcm9tICcuLi90YWJzJztcbmltcG9ydCBHcmlkIGZyb20gJy4vR3JpZCc7XG5mdW5jdGlvbiBnZXRBY3Rpb24oYWN0aW9ucykge1xuICB2YXIgYWN0aW9uTGlzdCA9IGFjdGlvbnMubWFwKGZ1bmN0aW9uIChhY3Rpb24sIGluZGV4KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIC8qI19fUFVSRV9fKi9cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9uby1hcnJheS1pbmRleC1rZXlcbiAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgd2lkdGg6IFwiXCIuY29uY2F0KDEwMCAvIGFjdGlvbnMubGVuZ3RoLCBcIiVcIilcbiAgICAgICAgfSxcbiAgICAgICAga2V5OiBcImFjdGlvbi1cIi5jb25jYXQoaW5kZXgpXG4gICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgYWN0aW9uKSlcbiAgICApO1xuICB9KTtcbiAgcmV0dXJuIGFjdGlvbkxpc3Q7XG59XG52YXIgQ2FyZCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBfZXh0ZW5kczIsIF9jbGFzc05hbWVzO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICBkaXJlY3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb247XG4gIHZhciBzaXplID0gUmVhY3QudXNlQ29udGV4dChTaXplQ29udGV4dCk7XG4gIHZhciBvblRhYkNoYW5nZSA9IGZ1bmN0aW9uIG9uVGFiQ2hhbmdlKGtleSkge1xuICAgIHZhciBfYTtcbiAgICAoX2EgPSBwcm9wcy5vblRhYkNoYW5nZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwocHJvcHMsIGtleSk7XG4gIH07XG4gIHZhciBpc0NvbnRhaW5HcmlkID0gZnVuY3Rpb24gaXNDb250YWluR3JpZCgpIHtcbiAgICB2YXIgY29udGFpbkdyaWQ7XG4gICAgUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaChwcm9wcy5jaGlsZHJlbiwgZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQudHlwZSAmJiBlbGVtZW50LnR5cGUgPT09IEdyaWQpIHtcbiAgICAgICAgY29udGFpbkdyaWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjb250YWluR3JpZDtcbiAgfTtcbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgZXh0cmEgPSBwcm9wcy5leHRyYSxcbiAgICBfcHJvcHMkaGVhZFN0eWxlID0gcHJvcHMuaGVhZFN0eWxlLFxuICAgIGhlYWRTdHlsZSA9IF9wcm9wcyRoZWFkU3R5bGUgPT09IHZvaWQgMCA/IHt9IDogX3Byb3BzJGhlYWRTdHlsZSxcbiAgICBfcHJvcHMkYm9keVN0eWxlID0gcHJvcHMuYm9keVN0eWxlLFxuICAgIGJvZHlTdHlsZSA9IF9wcm9wcyRib2R5U3R5bGUgPT09IHZvaWQgMCA/IHt9IDogX3Byb3BzJGJvZHlTdHlsZSxcbiAgICB0aXRsZSA9IHByb3BzLnRpdGxlLFxuICAgIGxvYWRpbmcgPSBwcm9wcy5sb2FkaW5nLFxuICAgIF9wcm9wcyRib3JkZXJlZCA9IHByb3BzLmJvcmRlcmVkLFxuICAgIGJvcmRlcmVkID0gX3Byb3BzJGJvcmRlcmVkID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJGJvcmRlcmVkLFxuICAgIGN1c3RvbWl6ZVNpemUgPSBwcm9wcy5zaXplLFxuICAgIHR5cGUgPSBwcm9wcy50eXBlLFxuICAgIGNvdmVyID0gcHJvcHMuY292ZXIsXG4gICAgYWN0aW9ucyA9IHByb3BzLmFjdGlvbnMsXG4gICAgdGFiTGlzdCA9IHByb3BzLnRhYkxpc3QsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBhY3RpdmVUYWJLZXkgPSBwcm9wcy5hY3RpdmVUYWJLZXksXG4gICAgZGVmYXVsdEFjdGl2ZVRhYktleSA9IHByb3BzLmRlZmF1bHRBY3RpdmVUYWJLZXksXG4gICAgdGFiQmFyRXh0cmFDb250ZW50ID0gcHJvcHMudGFiQmFyRXh0cmFDb250ZW50LFxuICAgIGhvdmVyYWJsZSA9IHByb3BzLmhvdmVyYWJsZSxcbiAgICBfcHJvcHMkdGFiUHJvcHMgPSBwcm9wcy50YWJQcm9wcyxcbiAgICB0YWJQcm9wcyA9IF9wcm9wcyR0YWJQcm9wcyA9PT0gdm9pZCAwID8ge30gOiBfcHJvcHMkdGFiUHJvcHMsXG4gICAgb3RoZXJzID0gX19yZXN0KHByb3BzLCBbXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJleHRyYVwiLCBcImhlYWRTdHlsZVwiLCBcImJvZHlTdHlsZVwiLCBcInRpdGxlXCIsIFwibG9hZGluZ1wiLCBcImJvcmRlcmVkXCIsIFwic2l6ZVwiLCBcInR5cGVcIiwgXCJjb3ZlclwiLCBcImFjdGlvbnNcIiwgXCJ0YWJMaXN0XCIsIFwiY2hpbGRyZW5cIiwgXCJhY3RpdmVUYWJLZXlcIiwgXCJkZWZhdWx0QWN0aXZlVGFiS2V5XCIsIFwidGFiQmFyRXh0cmFDb250ZW50XCIsIFwiaG92ZXJhYmxlXCIsIFwidGFiUHJvcHNcIl0pO1xuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdjYXJkJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIGxvYWRpbmdCbG9jayA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNrZWxldG9uLCB7XG4gICAgbG9hZGluZzogdHJ1ZSxcbiAgICBhY3RpdmU6IHRydWUsXG4gICAgcGFyYWdyYXBoOiB7XG4gICAgICByb3dzOiA0XG4gICAgfSxcbiAgICB0aXRsZTogZmFsc2VcbiAgfSwgY2hpbGRyZW4pO1xuICB2YXIgaGFzQWN0aXZlVGFiS2V5ID0gYWN0aXZlVGFiS2V5ICE9PSB1bmRlZmluZWQ7XG4gIHZhciBleHRyYVByb3BzID0gX2V4dGVuZHMoX2V4dGVuZHMoe30sIHRhYlByb3BzKSwgKF9leHRlbmRzMiA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2V4dGVuZHMyLCBoYXNBY3RpdmVUYWJLZXkgPyAnYWN0aXZlS2V5JyA6ICdkZWZhdWx0QWN0aXZlS2V5JywgaGFzQWN0aXZlVGFiS2V5ID8gYWN0aXZlVGFiS2V5IDogZGVmYXVsdEFjdGl2ZVRhYktleSksIF9kZWZpbmVQcm9wZXJ0eShfZXh0ZW5kczIsIFwidGFiQmFyRXh0cmFDb250ZW50XCIsIHRhYkJhckV4dHJhQ29udGVudCksIF9leHRlbmRzMikpO1xuICB2YXIgaGVhZDtcbiAgdmFyIHRhYnMgPSB0YWJMaXN0ICYmIHRhYkxpc3QubGVuZ3RoID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVGFicywgX2V4dGVuZHMoe1xuICAgIHNpemU6IFwibGFyZ2VcIlxuICB9LCBleHRyYVByb3BzLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhlYWQtdGFic1wiKSxcbiAgICBvbkNoYW5nZTogb25UYWJDaGFuZ2UsXG4gICAgaXRlbXM6IHRhYkxpc3QubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgX2E7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYWJlbDogaXRlbS50YWIsXG4gICAgICAgIGtleTogaXRlbS5rZXksXG4gICAgICAgIGRpc2FibGVkOiAoX2EgPSBpdGVtLmRpc2FibGVkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZVxuICAgICAgfTtcbiAgICB9KVxuICB9KSkgOiBudWxsO1xuICBpZiAodGl0bGUgfHwgZXh0cmEgfHwgdGFicykge1xuICAgIGhlYWQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGVhZFwiKSxcbiAgICAgIHN0eWxlOiBoZWFkU3R5bGVcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGVhZC13cmFwcGVyXCIpXG4gICAgfSwgdGl0bGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhlYWQtdGl0bGVcIilcbiAgICB9LCB0aXRsZSksIGV4dHJhICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1leHRyYVwiKVxuICAgIH0sIGV4dHJhKSksIHRhYnMpO1xuICB9XG4gIHZhciBjb3ZlckRvbSA9IGNvdmVyID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb3ZlclwiKVxuICB9LCBjb3ZlcikgOiBudWxsO1xuICB2YXIgYm9keSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYm9keVwiKSxcbiAgICBzdHlsZTogYm9keVN0eWxlXG4gIH0sIGxvYWRpbmcgPyBsb2FkaW5nQmxvY2sgOiBjaGlsZHJlbik7XG4gIHZhciBhY3Rpb25Eb20gPSBhY3Rpb25zICYmIGFjdGlvbnMubGVuZ3RoID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFjdGlvbnNcIilcbiAgfSwgZ2V0QWN0aW9uKGFjdGlvbnMpKSA6IG51bGw7XG4gIHZhciBkaXZQcm9wcyA9IG9taXQob3RoZXJzLCBbJ29uVGFiQ2hhbmdlJ10pO1xuICB2YXIgbWVyZ2VkU2l6ZSA9IGN1c3RvbWl6ZVNpemUgfHwgc2l6ZTtcbiAgdmFyIGNsYXNzU3RyaW5nID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbG9hZGluZ1wiKSwgbG9hZGluZyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ib3JkZXJlZFwiKSwgYm9yZGVyZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaG92ZXJhYmxlXCIpLCBob3ZlcmFibGUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29udGFpbi1ncmlkXCIpLCBpc0NvbnRhaW5HcmlkKCkpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29udGFpbi10YWJzXCIpLCB0YWJMaXN0ICYmIHRhYkxpc3QubGVuZ3RoKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQobWVyZ2VkU2l6ZSksIG1lcmdlZFNpemUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdHlwZS1cIikuY29uY2F0KHR5cGUpLCAhIXR5cGUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIHJlZjogcmVmXG4gIH0sIGRpdlByb3BzLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc1N0cmluZ1xuICB9KSwgaGVhZCwgY292ZXJEb20sIGJvZHksIGFjdGlvbkRvbSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IENhcmQ7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb25zdW1lciB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG52YXIgTWV0YSA9IGZ1bmN0aW9uIE1ldGEocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbmZpZ0NvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBnZXRQcmVmaXhDbHMgPSBfcmVmLmdldFByZWZpeENscztcbiAgICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgYXZhdGFyID0gcHJvcHMuYXZhdGFyLFxuICAgICAgdGl0bGUgPSBwcm9wcy50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uID0gcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICBvdGhlcnMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcImNsYXNzTmFtZVwiLCBcImF2YXRhclwiLCBcInRpdGxlXCIsIFwiZGVzY3JpcHRpb25cIl0pO1xuICAgIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2NhcmQnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAgIHZhciBjbGFzc1N0cmluZyA9IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1tZXRhXCIpLCBjbGFzc05hbWUpO1xuICAgIHZhciBhdmF0YXJEb20gPSBhdmF0YXIgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbWV0YS1hdmF0YXJcIilcbiAgICB9LCBhdmF0YXIpIDogbnVsbDtcbiAgICB2YXIgdGl0bGVEb20gPSB0aXRsZSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1tZXRhLXRpdGxlXCIpXG4gICAgfSwgdGl0bGUpIDogbnVsbDtcbiAgICB2YXIgZGVzY3JpcHRpb25Eb20gPSBkZXNjcmlwdGlvbiA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1tZXRhLWRlc2NyaXB0aW9uXCIpXG4gICAgfSwgZGVzY3JpcHRpb24pIDogbnVsbDtcbiAgICB2YXIgTWV0YURldGFpbCA9IHRpdGxlRG9tIHx8IGRlc2NyaXB0aW9uRG9tID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1ldGEtZGV0YWlsXCIpXG4gICAgfSwgdGl0bGVEb20sIGRlc2NyaXB0aW9uRG9tKSA6IG51bGw7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHt9LCBvdGhlcnMsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NTdHJpbmdcbiAgICB9KSwgYXZhdGFyRG9tLCBNZXRhRGV0YWlsKTtcbiAgfSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgTWV0YTsiLCJpbXBvcnQgSW50ZXJuYWxDYXJkIGZyb20gJy4vQ2FyZCc7XG5pbXBvcnQgR3JpZCBmcm9tICcuL0dyaWQnO1xuaW1wb3J0IE1ldGEgZnJvbSAnLi9NZXRhJztcbnZhciBDYXJkID0gSW50ZXJuYWxDYXJkO1xuQ2FyZC5HcmlkID0gR3JpZDtcbkNhcmQuTWV0YSA9IE1ldGE7XG5leHBvcnQgZGVmYXVsdCBDYXJkOyIsInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKipcbiAqIEdldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZVxuICogdGhlIFVuaXggZXBvY2ggKDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IERhdGVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVzdGFtcC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5kZWZlcihmdW5jdGlvbihzdGFtcCkge1xuICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICogfSwgXy5ub3coKSk7XG4gKiAvLyA9PiBMb2dzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sgZm9yIHRoZSBkZWZlcnJlZCBpbnZvY2F0aW9uLlxuICovXG52YXIgbm93ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiByb290LkRhdGUubm93KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5vdztcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBub3cgPSByZXF1aXJlKCcuL25vdycpLFxuICAgIHRvTnVtYmVyID0gcmVxdWlyZSgnLi90b051bWJlcicpO1xuXG4vKiogRXJyb3IgbWVzc2FnZSBjb25zdGFudHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgbmF0aXZlTWluID0gTWF0aC5taW47XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlYm91bmNlZCBmdW5jdGlvbiB0aGF0IGRlbGF5cyBpbnZva2luZyBgZnVuY2AgdW50aWwgYWZ0ZXIgYHdhaXRgXG4gKiBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB3YXNcbiAqIGludm9rZWQuIFRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgIG1ldGhvZCB0byBjYW5jZWxcbiAqIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLlxuICogUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2Agc2hvdWxkIGJlIGludm9rZWQgb24gdGhlXG4gKiBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGAgdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkXG4gKiB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50XG4gKiBjYWxscyB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYFxuICogaW52b2NhdGlvbi5cbiAqXG4gKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzXG4gKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIGRlYm91bmNlZCBmdW5jdGlvblxuICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICpcbiAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICpcbiAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy5kZWJvdW5jZWAgYW5kIGBfLnRocm90dGxlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlLlxuICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9ZmFsc2VdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFdhaXRdXG4gKiAgVGhlIG1heGltdW0gdGltZSBgZnVuY2AgaXMgYWxsb3dlZCB0byBiZSBkZWxheWVkIGJlZm9yZSBpdCdzIGludm9rZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGRlYm91bmNlZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gQXZvaWQgY29zdGx5IGNhbGN1bGF0aW9ucyB3aGlsZSB0aGUgd2luZG93IHNpemUgaXMgaW4gZmx1eC5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUnLCBfLmRlYm91bmNlKGNhbGN1bGF0ZUxheW91dCwgMTUwKSk7XG4gKlxuICogLy8gSW52b2tlIGBzZW5kTWFpbGAgd2hlbiBjbGlja2VkLCBkZWJvdW5jaW5nIHN1YnNlcXVlbnQgY2FsbHMuXG4gKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgXy5kZWJvdW5jZShzZW5kTWFpbCwgMzAwLCB7XG4gKiAgICdsZWFkaW5nJzogdHJ1ZSxcbiAqICAgJ3RyYWlsaW5nJzogZmFsc2VcbiAqIH0pKTtcbiAqXG4gKiAvLyBFbnN1cmUgYGJhdGNoTG9nYCBpcyBpbnZva2VkIG9uY2UgYWZ0ZXIgMSBzZWNvbmQgb2YgZGVib3VuY2VkIGNhbGxzLlxuICogdmFyIGRlYm91bmNlZCA9IF8uZGVib3VuY2UoYmF0Y2hMb2csIDI1MCwgeyAnbWF4V2FpdCc6IDEwMDAgfSk7XG4gKiB2YXIgc291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvc3RyZWFtJyk7XG4gKiBqUXVlcnkoc291cmNlKS5vbignbWVzc2FnZScsIGRlYm91bmNlZCk7XG4gKlxuICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyBkZWJvdW5jZWQgaW52b2NhdGlvbi5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIGRlYm91bmNlZC5jYW5jZWwpO1xuICovXG5mdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gIHZhciBsYXN0QXJncyxcbiAgICAgIGxhc3RUaGlzLFxuICAgICAgbWF4V2FpdCxcbiAgICAgIHJlc3VsdCxcbiAgICAgIHRpbWVySWQsXG4gICAgICBsYXN0Q2FsbFRpbWUsXG4gICAgICBsYXN0SW52b2tlVGltZSA9IDAsXG4gICAgICBsZWFkaW5nID0gZmFsc2UsXG4gICAgICBtYXhpbmcgPSBmYWxzZSxcbiAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICB3YWl0ID0gdG9OdW1iZXIod2FpdCkgfHwgMDtcbiAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgbGVhZGluZyA9ICEhb3B0aW9ucy5sZWFkaW5nO1xuICAgIG1heGluZyA9ICdtYXhXYWl0JyBpbiBvcHRpb25zO1xuICAgIG1heFdhaXQgPSBtYXhpbmcgPyBuYXRpdmVNYXgodG9OdW1iZXIob3B0aW9ucy5tYXhXYWl0KSB8fCAwLCB3YWl0KSA6IG1heFdhaXQ7XG4gICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgfVxuXG4gIGZ1bmN0aW9uIGludm9rZUZ1bmModGltZSkge1xuICAgIHZhciBhcmdzID0gbGFzdEFyZ3MsXG4gICAgICAgIHRoaXNBcmcgPSBsYXN0VGhpcztcblxuICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxlYWRpbmdFZGdlKHRpbWUpIHtcbiAgICAvLyBSZXNldCBhbnkgYG1heFdhaXRgIHRpbWVyLlxuICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICAvLyBTdGFydCB0aGUgdGltZXIgZm9yIHRoZSB0cmFpbGluZyBlZGdlLlxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgLy8gSW52b2tlIHRoZSBsZWFkaW5nIGVkZ2UuXG4gICAgcmV0dXJuIGxlYWRpbmcgPyBpbnZva2VGdW5jKHRpbWUpIDogcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtYWluaW5nV2FpdCh0aW1lKSB7XG4gICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZSxcbiAgICAgICAgdGltZVdhaXRpbmcgPSB3YWl0IC0gdGltZVNpbmNlTGFzdENhbGw7XG5cbiAgICByZXR1cm4gbWF4aW5nXG4gICAgICA/IG5hdGl2ZU1pbih0aW1lV2FpdGluZywgbWF4V2FpdCAtIHRpbWVTaW5jZUxhc3RJbnZva2UpXG4gICAgICA6IHRpbWVXYWl0aW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvdWxkSW52b2tlKHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lO1xuXG4gICAgLy8gRWl0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwsIGFjdGl2aXR5IGhhcyBzdG9wcGVkIGFuZCB3ZSdyZSBhdCB0aGVcbiAgICAvLyB0cmFpbGluZyBlZGdlLCB0aGUgc3lzdGVtIHRpbWUgaGFzIGdvbmUgYmFja3dhcmRzIGFuZCB3ZSdyZSB0cmVhdGluZ1xuICAgIC8vIGl0IGFzIHRoZSB0cmFpbGluZyBlZGdlLCBvciB3ZSd2ZSBoaXQgdGhlIGBtYXhXYWl0YCBsaW1pdC5cbiAgICByZXR1cm4gKGxhc3RDYWxsVGltZSA9PT0gdW5kZWZpbmVkIHx8ICh0aW1lU2luY2VMYXN0Q2FsbCA+PSB3YWl0KSB8fFxuICAgICAgKHRpbWVTaW5jZUxhc3RDYWxsIDwgMCkgfHwgKG1heGluZyAmJiB0aW1lU2luY2VMYXN0SW52b2tlID49IG1heFdhaXQpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRpbWVyRXhwaXJlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vdygpO1xuICAgIGlmIChzaG91bGRJbnZva2UodGltZSkpIHtcbiAgICAgIHJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7XG4gICAgfVxuICAgIC8vIFJlc3RhcnQgdGhlIHRpbWVyLlxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgcmVtYWluaW5nV2FpdCh0aW1lKSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSkge1xuICAgIHRpbWVySWQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBPbmx5IGludm9rZSBpZiB3ZSBoYXZlIGBsYXN0QXJnc2Agd2hpY2ggbWVhbnMgYGZ1bmNgIGhhcyBiZWVuXG4gICAgLy8gZGVib3VuY2VkIGF0IGxlYXN0IG9uY2UuXG4gICAgaWYgKHRyYWlsaW5nICYmIGxhc3RBcmdzKSB7XG4gICAgICByZXR1cm4gaW52b2tlRnVuYyh0aW1lKTtcbiAgICB9XG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgIGlmICh0aW1lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICB9XG4gICAgbGFzdEludm9rZVRpbWUgPSAwO1xuICAgIGxhc3RBcmdzID0gbGFzdENhbGxUaW1lID0gbGFzdFRoaXMgPSB0aW1lcklkID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgcmV0dXJuIHRpbWVySWQgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IHRyYWlsaW5nRWRnZShub3coKSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7XG4gICAgdmFyIHRpbWUgPSBub3coKSxcbiAgICAgICAgaXNJbnZva2luZyA9IHNob3VsZEludm9rZSh0aW1lKTtcblxuICAgIGxhc3RBcmdzID0gYXJndW1lbnRzO1xuICAgIGxhc3RUaGlzID0gdGhpcztcbiAgICBsYXN0Q2FsbFRpbWUgPSB0aW1lO1xuXG4gICAgaWYgKGlzSW52b2tpbmcpIHtcbiAgICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGxlYWRpbmdFZGdlKGxhc3RDYWxsVGltZSk7XG4gICAgICB9XG4gICAgICBpZiAobWF4aW5nKSB7XG4gICAgICAgIC8vIEhhbmRsZSBpbnZvY2F0aW9ucyBpbiBhIHRpZ2h0IGxvb3AuXG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgcmV0dXJuIGludm9rZUZ1bmMobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBkZWJvdW5jZWQuY2FuY2VsID0gY2FuY2VsO1xuICBkZWJvdW5jZWQuZmx1c2ggPSBmbHVzaDtcbiAgcmV0dXJuIGRlYm91bmNlZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkZWJvdW5jZTtcbiIsImltcG9ydCB3YXJuaW5nIGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbmZ1bmN0aW9uIHJlbW92ZUZyb21DaGVja2VkS2V5cyhoYWxmQ2hlY2tlZEtleXMsIGNoZWNrZWRLZXlzKSB7XG4gIHZhciBmaWx0ZXJlZEtleXMgPSBuZXcgU2V0KCk7XG4gIGhhbGZDaGVja2VkS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoIWNoZWNrZWRLZXlzLmhhcyhrZXkpKSB7XG4gICAgICBmaWx0ZXJlZEtleXMuYWRkKGtleSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGZpbHRlcmVkS2V5cztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0NoZWNrRGlzYWJsZWQobm9kZSkge1xuICB2YXIgX3JlZiA9IG5vZGUgfHwge30sXG4gICAgZGlzYWJsZWQgPSBfcmVmLmRpc2FibGVkLFxuICAgIGRpc2FibGVDaGVja2JveCA9IF9yZWYuZGlzYWJsZUNoZWNrYm94LFxuICAgIGNoZWNrYWJsZSA9IF9yZWYuY2hlY2thYmxlO1xuICByZXR1cm4gISEoZGlzYWJsZWQgfHwgZGlzYWJsZUNoZWNrYm94KSB8fCBjaGVja2FibGUgPT09IGZhbHNlO1xufVxuLy8gRmlsbCBtaXNzIGtleXNcbmZ1bmN0aW9uIGZpbGxDb25kdWN0Q2hlY2soa2V5cywgbGV2ZWxFbnRpdGllcywgbWF4TGV2ZWwsIHN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQpIHtcbiAgdmFyIGNoZWNrZWRLZXlzID0gbmV3IFNldChrZXlzKTtcbiAgdmFyIGhhbGZDaGVja2VkS2V5cyA9IG5ldyBTZXQoKTtcbiAgLy8gQWRkIGNoZWNrZWQga2V5cyB0b3AgdG8gYm90dG9tXG4gIGZvciAodmFyIGxldmVsID0gMDsgbGV2ZWwgPD0gbWF4TGV2ZWw7IGxldmVsICs9IDEpIHtcbiAgICB2YXIgZW50aXRpZXMgPSBsZXZlbEVudGl0aWVzLmdldChsZXZlbCkgfHwgbmV3IFNldCgpO1xuICAgIGVudGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgdmFyIGtleSA9IGVudGl0eS5rZXksXG4gICAgICAgIG5vZGUgPSBlbnRpdHkubm9kZSxcbiAgICAgICAgX2VudGl0eSRjaGlsZHJlbiA9IGVudGl0eS5jaGlsZHJlbixcbiAgICAgICAgY2hpbGRyZW4gPSBfZW50aXR5JGNoaWxkcmVuID09PSB2b2lkIDAgPyBbXSA6IF9lbnRpdHkkY2hpbGRyZW47XG4gICAgICBpZiAoY2hlY2tlZEtleXMuaGFzKGtleSkgJiYgIXN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQobm9kZSkpIHtcbiAgICAgICAgY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uIChjaGlsZEVudGl0eSkge1xuICAgICAgICAgIHJldHVybiAhc3ludGhldGljR2V0Q2hlY2tEaXNhYmxlZChjaGlsZEVudGl0eS5ub2RlKTtcbiAgICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGRFbnRpdHkpIHtcbiAgICAgICAgICBjaGVja2VkS2V5cy5hZGQoY2hpbGRFbnRpdHkua2V5KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLy8gQWRkIGNoZWNrZWQga2V5cyBmcm9tIGJvdHRvbSB0byB0b3BcbiAgdmFyIHZpc2l0ZWRLZXlzID0gbmV3IFNldCgpO1xuICBmb3IgKHZhciBfbGV2ZWwgPSBtYXhMZXZlbDsgX2xldmVsID49IDA7IF9sZXZlbCAtPSAxKSB7XG4gICAgdmFyIF9lbnRpdGllcyA9IGxldmVsRW50aXRpZXMuZ2V0KF9sZXZlbCkgfHwgbmV3IFNldCgpO1xuICAgIF9lbnRpdGllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgIHZhciBwYXJlbnQgPSBlbnRpdHkucGFyZW50LFxuICAgICAgICBub2RlID0gZW50aXR5Lm5vZGU7XG4gICAgICAvLyBTa2lwIGlmIG5vIG5lZWQgdG8gY2hlY2tcbiAgICAgIGlmIChzeW50aGV0aWNHZXRDaGVja0Rpc2FibGVkKG5vZGUpIHx8ICFlbnRpdHkucGFyZW50IHx8IHZpc2l0ZWRLZXlzLmhhcyhlbnRpdHkucGFyZW50LmtleSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gU2tpcCBpZiBwYXJlbnQgaXMgZGlzYWJsZWRcbiAgICAgIGlmIChzeW50aGV0aWNHZXRDaGVja0Rpc2FibGVkKGVudGl0eS5wYXJlbnQubm9kZSkpIHtcbiAgICAgICAgdmlzaXRlZEtleXMuYWRkKHBhcmVudC5rZXkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgYWxsQ2hlY2tlZCA9IHRydWU7XG4gICAgICB2YXIgcGFydGlhbENoZWNrZWQgPSBmYWxzZTtcbiAgICAgIChwYXJlbnQuY2hpbGRyZW4gfHwgW10pLmZpbHRlcihmdW5jdGlvbiAoY2hpbGRFbnRpdHkpIHtcbiAgICAgICAgcmV0dXJuICFzeW50aGV0aWNHZXRDaGVja0Rpc2FibGVkKGNoaWxkRW50aXR5Lm5vZGUpO1xuICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgICAgdmFyIGtleSA9IF9yZWYyLmtleTtcbiAgICAgICAgdmFyIGNoZWNrZWQgPSBjaGVja2VkS2V5cy5oYXMoa2V5KTtcbiAgICAgICAgaWYgKGFsbENoZWNrZWQgJiYgIWNoZWNrZWQpIHtcbiAgICAgICAgICBhbGxDaGVja2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXJ0aWFsQ2hlY2tlZCAmJiAoY2hlY2tlZCB8fCBoYWxmQ2hlY2tlZEtleXMuaGFzKGtleSkpKSB7XG4gICAgICAgICAgcGFydGlhbENoZWNrZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChhbGxDaGVja2VkKSB7XG4gICAgICAgIGNoZWNrZWRLZXlzLmFkZChwYXJlbnQua2V5KTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJ0aWFsQ2hlY2tlZCkge1xuICAgICAgICBoYWxmQ2hlY2tlZEtleXMuYWRkKHBhcmVudC5rZXkpO1xuICAgICAgfVxuICAgICAgdmlzaXRlZEtleXMuYWRkKHBhcmVudC5rZXkpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiB7XG4gICAgY2hlY2tlZEtleXM6IEFycmF5LmZyb20oY2hlY2tlZEtleXMpLFxuICAgIGhhbGZDaGVja2VkS2V5czogQXJyYXkuZnJvbShyZW1vdmVGcm9tQ2hlY2tlZEtleXMoaGFsZkNoZWNrZWRLZXlzLCBjaGVja2VkS2V5cykpXG4gIH07XG59XG4vLyBSZW1vdmUgdXNlbGVzcyBrZXlcbmZ1bmN0aW9uIGNsZWFuQ29uZHVjdENoZWNrKGtleXMsIGhhbGZLZXlzLCBsZXZlbEVudGl0aWVzLCBtYXhMZXZlbCwgc3ludGhldGljR2V0Q2hlY2tEaXNhYmxlZCkge1xuICB2YXIgY2hlY2tlZEtleXMgPSBuZXcgU2V0KGtleXMpO1xuICB2YXIgaGFsZkNoZWNrZWRLZXlzID0gbmV3IFNldChoYWxmS2V5cyk7XG4gIC8vIFJlbW92ZSBjaGVja2VkIGtleXMgZnJvbSB0b3AgdG8gYm90dG9tXG4gIGZvciAodmFyIGxldmVsID0gMDsgbGV2ZWwgPD0gbWF4TGV2ZWw7IGxldmVsICs9IDEpIHtcbiAgICB2YXIgZW50aXRpZXMgPSBsZXZlbEVudGl0aWVzLmdldChsZXZlbCkgfHwgbmV3IFNldCgpO1xuICAgIGVudGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgdmFyIGtleSA9IGVudGl0eS5rZXksXG4gICAgICAgIG5vZGUgPSBlbnRpdHkubm9kZSxcbiAgICAgICAgX2VudGl0eSRjaGlsZHJlbjIgPSBlbnRpdHkuY2hpbGRyZW4sXG4gICAgICAgIGNoaWxkcmVuID0gX2VudGl0eSRjaGlsZHJlbjIgPT09IHZvaWQgMCA/IFtdIDogX2VudGl0eSRjaGlsZHJlbjI7XG4gICAgICBpZiAoIWNoZWNrZWRLZXlzLmhhcyhrZXkpICYmICFoYWxmQ2hlY2tlZEtleXMuaGFzKGtleSkgJiYgIXN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQobm9kZSkpIHtcbiAgICAgICAgY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uIChjaGlsZEVudGl0eSkge1xuICAgICAgICAgIHJldHVybiAhc3ludGhldGljR2V0Q2hlY2tEaXNhYmxlZChjaGlsZEVudGl0eS5ub2RlKTtcbiAgICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGRFbnRpdHkpIHtcbiAgICAgICAgICBjaGVja2VkS2V5cy5kZWxldGUoY2hpbGRFbnRpdHkua2V5KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLy8gUmVtb3ZlIGNoZWNrZWQga2V5cyBmb3JtIGJvdHRvbSB0byB0b3BcbiAgaGFsZkNoZWNrZWRLZXlzID0gbmV3IFNldCgpO1xuICB2YXIgdmlzaXRlZEtleXMgPSBuZXcgU2V0KCk7XG4gIGZvciAodmFyIF9sZXZlbDIgPSBtYXhMZXZlbDsgX2xldmVsMiA+PSAwOyBfbGV2ZWwyIC09IDEpIHtcbiAgICB2YXIgX2VudGl0aWVzMiA9IGxldmVsRW50aXRpZXMuZ2V0KF9sZXZlbDIpIHx8IG5ldyBTZXQoKTtcbiAgICBfZW50aXRpZXMyLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgdmFyIHBhcmVudCA9IGVudGl0eS5wYXJlbnQsXG4gICAgICAgIG5vZGUgPSBlbnRpdHkubm9kZTtcbiAgICAgIC8vIFNraXAgaWYgbm8gbmVlZCB0byBjaGVja1xuICAgICAgaWYgKHN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQobm9kZSkgfHwgIWVudGl0eS5wYXJlbnQgfHwgdmlzaXRlZEtleXMuaGFzKGVudGl0eS5wYXJlbnQua2V5KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBTa2lwIGlmIHBhcmVudCBpcyBkaXNhYmxlZFxuICAgICAgaWYgKHN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQoZW50aXR5LnBhcmVudC5ub2RlKSkge1xuICAgICAgICB2aXNpdGVkS2V5cy5hZGQocGFyZW50LmtleSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBhbGxDaGVja2VkID0gdHJ1ZTtcbiAgICAgIHZhciBwYXJ0aWFsQ2hlY2tlZCA9IGZhbHNlO1xuICAgICAgKHBhcmVudC5jaGlsZHJlbiB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uIChjaGlsZEVudGl0eSkge1xuICAgICAgICByZXR1cm4gIXN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQoY2hpbGRFbnRpdHkubm9kZSk7XG4gICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgICB2YXIga2V5ID0gX3JlZjMua2V5O1xuICAgICAgICB2YXIgY2hlY2tlZCA9IGNoZWNrZWRLZXlzLmhhcyhrZXkpO1xuICAgICAgICBpZiAoYWxsQ2hlY2tlZCAmJiAhY2hlY2tlZCkge1xuICAgICAgICAgIGFsbENoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBhcnRpYWxDaGVja2VkICYmIChjaGVja2VkIHx8IGhhbGZDaGVja2VkS2V5cy5oYXMoa2V5KSkpIHtcbiAgICAgICAgICBwYXJ0aWFsQ2hlY2tlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKCFhbGxDaGVja2VkKSB7XG4gICAgICAgIGNoZWNrZWRLZXlzLmRlbGV0ZShwYXJlbnQua2V5KTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJ0aWFsQ2hlY2tlZCkge1xuICAgICAgICBoYWxmQ2hlY2tlZEtleXMuYWRkKHBhcmVudC5rZXkpO1xuICAgICAgfVxuICAgICAgdmlzaXRlZEtleXMuYWRkKHBhcmVudC5rZXkpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiB7XG4gICAgY2hlY2tlZEtleXM6IEFycmF5LmZyb20oY2hlY2tlZEtleXMpLFxuICAgIGhhbGZDaGVja2VkS2V5czogQXJyYXkuZnJvbShyZW1vdmVGcm9tQ2hlY2tlZEtleXMoaGFsZkNoZWNrZWRLZXlzLCBjaGVja2VkS2V5cykpXG4gIH07XG59XG4vKipcbiAqIENvbmR1Y3Qgd2l0aCBrZXlzLlxuICogQHBhcmFtIGtleUxpc3QgY3VycmVudCBrZXkgbGlzdFxuICogQHBhcmFtIGtleUVudGl0aWVzIGtleSAtIGRhdGFFbnRpdHkgbWFwXG4gKiBAcGFyYW0gbW9kZSBgZmlsbGAgdG8gZmlsbCBtaXNzaW5nIGtleSwgYGNsZWFuYCB0byByZW1vdmUgdXNlbGVzcyBrZXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmR1Y3RDaGVjayhrZXlMaXN0LCBjaGVja2VkLCBrZXlFbnRpdGllcywgZ2V0Q2hlY2tEaXNhYmxlZCkge1xuICB2YXIgd2FybmluZ01pc3NLZXlzID0gW107XG4gIHZhciBzeW50aGV0aWNHZXRDaGVja0Rpc2FibGVkO1xuICBpZiAoZ2V0Q2hlY2tEaXNhYmxlZCkge1xuICAgIHN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQgPSBnZXRDaGVja0Rpc2FibGVkO1xuICB9IGVsc2Uge1xuICAgIHN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQgPSBpc0NoZWNrRGlzYWJsZWQ7XG4gIH1cbiAgLy8gV2Ugb25seSBoYW5kbGUgZXhpc3Qga2V5c1xuICB2YXIga2V5cyA9IG5ldyBTZXQoa2V5TGlzdC5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBoYXNFbnRpdHkgPSAhIWtleUVudGl0aWVzW2tleV07XG4gICAgaWYgKCFoYXNFbnRpdHkpIHtcbiAgICAgIHdhcm5pbmdNaXNzS2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIHJldHVybiBoYXNFbnRpdHk7XG4gIH0pKTtcbiAgdmFyIGxldmVsRW50aXRpZXMgPSBuZXcgTWFwKCk7XG4gIHZhciBtYXhMZXZlbCA9IDA7XG4gIC8vIENvbnZlcnQgZW50aXRpZXMgYnkgbGV2ZWwgZm9yIGNhbGN1bGF0aW9uXG4gIE9iamVjdC5rZXlzKGtleUVudGl0aWVzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgZW50aXR5ID0ga2V5RW50aXRpZXNba2V5XTtcbiAgICB2YXIgbGV2ZWwgPSBlbnRpdHkubGV2ZWw7XG4gICAgdmFyIGxldmVsU2V0ID0gbGV2ZWxFbnRpdGllcy5nZXQobGV2ZWwpO1xuICAgIGlmICghbGV2ZWxTZXQpIHtcbiAgICAgIGxldmVsU2V0ID0gbmV3IFNldCgpO1xuICAgICAgbGV2ZWxFbnRpdGllcy5zZXQobGV2ZWwsIGxldmVsU2V0KTtcbiAgICB9XG4gICAgbGV2ZWxTZXQuYWRkKGVudGl0eSk7XG4gICAgbWF4TGV2ZWwgPSBNYXRoLm1heChtYXhMZXZlbCwgbGV2ZWwpO1xuICB9KTtcbiAgd2FybmluZyghd2FybmluZ01pc3NLZXlzLmxlbmd0aCwgXCJUcmVlIG1pc3NpbmcgZm9sbG93IGtleXM6IFwiLmNvbmNhdCh3YXJuaW5nTWlzc0tleXMuc2xpY2UoMCwgMTAwKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBcIidcIi5jb25jYXQoa2V5LCBcIidcIik7XG4gIH0pLmpvaW4oJywgJykpKTtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKGNoZWNrZWQgPT09IHRydWUpIHtcbiAgICByZXN1bHQgPSBmaWxsQ29uZHVjdENoZWNrKGtleXMsIGxldmVsRW50aXRpZXMsIG1heExldmVsLCBzeW50aGV0aWNHZXRDaGVja0Rpc2FibGVkKTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSBjbGVhbkNvbmR1Y3RDaGVjayhrZXlzLCBjaGVja2VkLmhhbGZDaGVja2VkS2V5cywgbGV2ZWxFbnRpdGllcywgbWF4TGV2ZWwsIHN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcImNoaWxkcmVuXCJdO1xuaW1wb3J0IHRvQXJyYXkgZnJvbSBcInJjLXV0aWwvZXMvQ2hpbGRyZW4vdG9BcnJheVwiO1xuaW1wb3J0IG9taXQgZnJvbSBcInJjLXV0aWwvZXMvb21pdFwiO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBvc2l0aW9uKGxldmVsLCBpbmRleCkge1xuICByZXR1cm4gXCJcIi5jb25jYXQobGV2ZWwsIFwiLVwiKS5jb25jYXQoaW5kZXgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVHJlZU5vZGUobm9kZSkge1xuICByZXR1cm4gbm9kZSAmJiBub2RlLnR5cGUgJiYgbm9kZS50eXBlLmlzVHJlZU5vZGU7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0S2V5KGtleSwgcG9zKSB7XG4gIGlmIChrZXkgIT09IG51bGwgJiYga2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4ga2V5O1xuICB9XG4gIHJldHVybiBwb3M7XG59XG5leHBvcnQgZnVuY3Rpb24gZmlsbEZpZWxkTmFtZXMoZmllbGROYW1lcykge1xuICB2YXIgX3JlZiA9IGZpZWxkTmFtZXMgfHwge30sXG4gICAgdGl0bGUgPSBfcmVmLnRpdGxlLFxuICAgIF90aXRsZSA9IF9yZWYuX3RpdGxlLFxuICAgIGtleSA9IF9yZWYua2V5LFxuICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgdmFyIG1lcmdlZFRpdGxlID0gdGl0bGUgfHwgJ3RpdGxlJztcbiAgcmV0dXJuIHtcbiAgICB0aXRsZTogbWVyZ2VkVGl0bGUsXG4gICAgX3RpdGxlOiBfdGl0bGUgfHwgW21lcmdlZFRpdGxlXSxcbiAgICBrZXk6IGtleSB8fCAna2V5JyxcbiAgICBjaGlsZHJlbjogY2hpbGRyZW4gfHwgJ2NoaWxkcmVuJ1xuICB9O1xufVxuLyoqXG4gKiBXYXJuaW5nIGlmIFRyZWVOb2RlIGRvIG5vdCBwcm92aWRlcyBrZXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhcm5pbmdXaXRob3V0S2V5KHRyZWVEYXRhLCBmaWVsZE5hbWVzKSB7XG4gIHZhciBrZXlzID0gbmV3IE1hcCgpO1xuICBmdW5jdGlvbiBkaWcobGlzdCkge1xuICAgIHZhciBwYXRoID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAnJztcbiAgICAobGlzdCB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAodHJlZU5vZGUpIHtcbiAgICAgIHZhciBrZXkgPSB0cmVlTm9kZVtmaWVsZE5hbWVzLmtleV07XG4gICAgICB2YXIgY2hpbGRyZW4gPSB0cmVlTm9kZVtmaWVsZE5hbWVzLmNoaWxkcmVuXTtcbiAgICAgIHdhcm5pbmcoa2V5ICE9PSBudWxsICYmIGtleSAhPT0gdW5kZWZpbmVkLCBcIlRyZWUgbm9kZSBtdXN0IGhhdmUgYSBjZXJ0YWluIGtleTogW1wiLmNvbmNhdChwYXRoKS5jb25jYXQoa2V5LCBcIl1cIikpO1xuICAgICAgdmFyIHJlY29yZEtleSA9IFN0cmluZyhrZXkpO1xuICAgICAgd2FybmluZygha2V5cy5oYXMocmVjb3JkS2V5KSB8fCBrZXkgPT09IG51bGwgfHwga2V5ID09PSB1bmRlZmluZWQsIFwiU2FtZSAna2V5JyBleGlzdCBpbiB0aGUgVHJlZTogXCIuY29uY2F0KHJlY29yZEtleSkpO1xuICAgICAga2V5cy5zZXQocmVjb3JkS2V5LCB0cnVlKTtcbiAgICAgIGRpZyhjaGlsZHJlbiwgXCJcIi5jb25jYXQocGF0aCkuY29uY2F0KHJlY29yZEtleSwgXCIgPiBcIikpO1xuICAgIH0pO1xuICB9XG4gIGRpZyh0cmVlRGF0YSk7XG59XG4vKipcbiAqIENvbnZlcnQgYGNoaWxkcmVuYCBvZiBUcmVlIGludG8gYHRyZWVEYXRhYCBzdHJ1Y3R1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VHJlZVRvRGF0YShyb290Tm9kZXMpIHtcbiAgZnVuY3Rpb24gZGlnKG5vZGUpIHtcbiAgICB2YXIgdHJlZU5vZGVzID0gdG9BcnJheShub2RlKTtcbiAgICByZXR1cm4gdHJlZU5vZGVzLm1hcChmdW5jdGlvbiAodHJlZU5vZGUpIHtcbiAgICAgIC8vIEZpbHRlciBpbnZhbGlkYXRlIG5vZGVcbiAgICAgIGlmICghaXNUcmVlTm9kZSh0cmVlTm9kZSkpIHtcbiAgICAgICAgd2FybmluZyghdHJlZU5vZGUsICdUcmVlL1RyZWVOb2RlIGNhbiBvbmx5IGFjY2VwdCBUcmVlTm9kZSBhcyBjaGlsZHJlbi4nKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICB2YXIga2V5ID0gdHJlZU5vZGUua2V5O1xuICAgICAgdmFyIF90cmVlTm9kZSRwcm9wcyA9IHRyZWVOb2RlLnByb3BzLFxuICAgICAgICBjaGlsZHJlbiA9IF90cmVlTm9kZSRwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfdHJlZU5vZGUkcHJvcHMsIF9leGNsdWRlZCk7XG4gICAgICB2YXIgZGF0YU5vZGUgPSBfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAga2V5OiBrZXlcbiAgICAgIH0sIHJlc3QpO1xuICAgICAgdmFyIHBhcnNlZENoaWxkcmVuID0gZGlnKGNoaWxkcmVuKTtcbiAgICAgIGlmIChwYXJzZWRDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgZGF0YU5vZGUuY2hpbGRyZW4gPSBwYXJzZWRDaGlsZHJlbjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRhTm9kZTtcbiAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKGRhdGFOb2RlKSB7XG4gICAgICByZXR1cm4gZGF0YU5vZGU7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGRpZyhyb290Tm9kZXMpO1xufVxuLyoqXG4gKiBGbGF0IG5lc3QgdHJlZSBkYXRhIGludG8gZmxhdHRlbiBsaXN0LiBUaGlzIGlzIHVzZWQgZm9yIHZpcnR1YWwgbGlzdCByZW5kZXIuXG4gKiBAcGFyYW0gdHJlZU5vZGVMaXN0IE9yaWdpbiBkYXRhIG5vZGUgbGlzdFxuICogQHBhcmFtIGV4cGFuZGVkS2V5c1xuICogbmVlZCBleHBhbmRlZCBrZXlzLCBwcm92aWRlcyBgdHJ1ZWAgbWVhbnMgYWxsIGV4cGFuZGVkICh1c2VkIGluIGByYy10cmVlLXNlbGVjdGApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlblRyZWVEYXRhKHRyZWVOb2RlTGlzdCwgZXhwYW5kZWRLZXlzLCBmaWVsZE5hbWVzKSB7XG4gIHZhciBfZmlsbEZpZWxkTmFtZXMgPSBmaWxsRmllbGROYW1lcyhmaWVsZE5hbWVzKSxcbiAgICBmaWVsZFRpdGxlcyA9IF9maWxsRmllbGROYW1lcy5fdGl0bGUsXG4gICAgZmllbGRLZXkgPSBfZmlsbEZpZWxkTmFtZXMua2V5LFxuICAgIGZpZWxkQ2hpbGRyZW4gPSBfZmlsbEZpZWxkTmFtZXMuY2hpbGRyZW47XG4gIHZhciBleHBhbmRlZEtleVNldCA9IG5ldyBTZXQoZXhwYW5kZWRLZXlzID09PSB0cnVlID8gW10gOiBleHBhbmRlZEtleXMpO1xuICB2YXIgZmxhdHRlbkxpc3QgPSBbXTtcbiAgZnVuY3Rpb24gZGlnKGxpc3QpIHtcbiAgICB2YXIgcGFyZW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuICAgIHJldHVybiBsaXN0Lm1hcChmdW5jdGlvbiAodHJlZU5vZGUsIGluZGV4KSB7XG4gICAgICB2YXIgcG9zID0gZ2V0UG9zaXRpb24ocGFyZW50ID8gcGFyZW50LnBvcyA6ICcwJywgaW5kZXgpO1xuICAgICAgdmFyIG1lcmdlZEtleSA9IGdldEtleSh0cmVlTm9kZVtmaWVsZEtleV0sIHBvcyk7XG4gICAgICAvLyBQaWNrIG1hdGNoZWQgdGl0bGUgaW4gZmllbGQgdGl0bGUgbGlzdFxuICAgICAgdmFyIG1lcmdlZFRpdGxlO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZFRpdGxlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgZmllbGRUaXRsZSA9IGZpZWxkVGl0bGVzW2ldO1xuICAgICAgICBpZiAodHJlZU5vZGVbZmllbGRUaXRsZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG1lcmdlZFRpdGxlID0gdHJlZU5vZGVbZmllbGRUaXRsZV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEFkZCBGbGF0dGVuRGF0YU5vZGUgaW50byBsaXN0XG4gICAgICB2YXIgZmxhdHRlbk5vZGUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG9taXQodHJlZU5vZGUsIFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoZmllbGRUaXRsZXMpLCBbZmllbGRLZXksIGZpZWxkQ2hpbGRyZW5dKSkpLCB7fSwge1xuICAgICAgICB0aXRsZTogbWVyZ2VkVGl0bGUsXG4gICAgICAgIGtleTogbWVyZ2VkS2V5LFxuICAgICAgICBwYXJlbnQ6IHBhcmVudCxcbiAgICAgICAgcG9zOiBwb3MsXG4gICAgICAgIGNoaWxkcmVuOiBudWxsLFxuICAgICAgICBkYXRhOiB0cmVlTm9kZSxcbiAgICAgICAgaXNTdGFydDogW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShwYXJlbnQgPyBwYXJlbnQuaXNTdGFydCA6IFtdKSwgW2luZGV4ID09PSAwXSksXG4gICAgICAgIGlzRW5kOiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHBhcmVudCA/IHBhcmVudC5pc0VuZCA6IFtdKSwgW2luZGV4ID09PSBsaXN0Lmxlbmd0aCAtIDFdKVxuICAgICAgfSk7XG4gICAgICBmbGF0dGVuTGlzdC5wdXNoKGZsYXR0ZW5Ob2RlKTtcbiAgICAgIC8vIExvb3AgdHJlZU5vZGUgY2hpbGRyZW5cbiAgICAgIGlmIChleHBhbmRlZEtleXMgPT09IHRydWUgfHwgZXhwYW5kZWRLZXlTZXQuaGFzKG1lcmdlZEtleSkpIHtcbiAgICAgICAgZmxhdHRlbk5vZGUuY2hpbGRyZW4gPSBkaWcodHJlZU5vZGVbZmllbGRDaGlsZHJlbl0gfHwgW10sIGZsYXR0ZW5Ob2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZsYXR0ZW5Ob2RlLmNoaWxkcmVuID0gW107XG4gICAgICB9XG4gICAgICByZXR1cm4gZmxhdHRlbk5vZGU7XG4gICAgfSk7XG4gIH1cbiAgZGlnKHRyZWVOb2RlTGlzdCk7XG4gIHJldHVybiBmbGF0dGVuTGlzdDtcbn1cbi8qKlxuICogVHJhdmVyc2UgYWxsIHRoZSBkYXRhIGJ5IGB0cmVlRGF0YWAuXG4gKiBQbGVhc2Ugbm90IHVzZSBpdCBvdXQgb2YgdGhlIGByYy10cmVlYCBzaW5jZSB3ZSBtYXkgcmVmYWN0b3IgdGhpcyBjb2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhdmVyc2VEYXRhTm9kZXMoZGF0YU5vZGVzLCBjYWxsYmFjayxcbi8vIFRvIGF2b2lkIHRvbyBtYW55IHBhcmFtcywgbGV0IHVzZSBjb25maWcgaW5zdGVhZCBvZiBvcmlnaW4gcGFyYW1cbmNvbmZpZykge1xuICB2YXIgbWVyZ2VkQ29uZmlnID0ge307XG4gIGlmIChfdHlwZW9mKGNvbmZpZykgPT09ICdvYmplY3QnKSB7XG4gICAgbWVyZ2VkQ29uZmlnID0gY29uZmlnO1xuICB9IGVsc2Uge1xuICAgIG1lcmdlZENvbmZpZyA9IHtcbiAgICAgIGV4dGVybmFsR2V0S2V5OiBjb25maWdcbiAgICB9O1xuICB9XG4gIG1lcmdlZENvbmZpZyA9IG1lcmdlZENvbmZpZyB8fCB7fTtcbiAgLy8gSW5pdCBjb25maWdcbiAgdmFyIF9tZXJnZWRDb25maWcgPSBtZXJnZWRDb25maWcsXG4gICAgY2hpbGRyZW5Qcm9wTmFtZSA9IF9tZXJnZWRDb25maWcuY2hpbGRyZW5Qcm9wTmFtZSxcbiAgICBleHRlcm5hbEdldEtleSA9IF9tZXJnZWRDb25maWcuZXh0ZXJuYWxHZXRLZXksXG4gICAgZmllbGROYW1lcyA9IF9tZXJnZWRDb25maWcuZmllbGROYW1lcztcbiAgdmFyIF9maWxsRmllbGROYW1lczIgPSBmaWxsRmllbGROYW1lcyhmaWVsZE5hbWVzKSxcbiAgICBmaWVsZEtleSA9IF9maWxsRmllbGROYW1lczIua2V5LFxuICAgIGZpZWxkQ2hpbGRyZW4gPSBfZmlsbEZpZWxkTmFtZXMyLmNoaWxkcmVuO1xuICB2YXIgbWVyZ2VDaGlsZHJlblByb3BOYW1lID0gY2hpbGRyZW5Qcm9wTmFtZSB8fCBmaWVsZENoaWxkcmVuO1xuICAvLyBHZXQga2V5c1xuICB2YXIgc3ludGhldGljR2V0S2V5O1xuICBpZiAoZXh0ZXJuYWxHZXRLZXkpIHtcbiAgICBpZiAodHlwZW9mIGV4dGVybmFsR2V0S2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgc3ludGhldGljR2V0S2V5ID0gZnVuY3Rpb24gc3ludGhldGljR2V0S2V5KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVbZXh0ZXJuYWxHZXRLZXldO1xuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHRlcm5hbEdldEtleSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgc3ludGhldGljR2V0S2V5ID0gZnVuY3Rpb24gc3ludGhldGljR2V0S2V5KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGV4dGVybmFsR2V0S2V5KG5vZGUpO1xuICAgICAgfTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc3ludGhldGljR2V0S2V5ID0gZnVuY3Rpb24gc3ludGhldGljR2V0S2V5KG5vZGUsIHBvcykge1xuICAgICAgcmV0dXJuIGdldEtleShub2RlW2ZpZWxkS2V5XSwgcG9zKTtcbiAgICB9O1xuICB9XG4gIC8vIFByb2Nlc3NcbiAgZnVuY3Rpb24gcHJvY2Vzc05vZGUobm9kZSwgaW5kZXgsIHBhcmVudCwgcGF0aE5vZGVzKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gbm9kZSA/IG5vZGVbbWVyZ2VDaGlsZHJlblByb3BOYW1lXSA6IGRhdGFOb2RlcztcbiAgICB2YXIgcG9zID0gbm9kZSA/IGdldFBvc2l0aW9uKHBhcmVudC5wb3MsIGluZGV4KSA6ICcwJztcbiAgICB2YXIgY29ubmVjdE5vZGVzID0gbm9kZSA/IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocGF0aE5vZGVzKSwgW25vZGVdKSA6IFtdO1xuICAgIC8vIFByb2Nlc3Mgbm9kZSBpZiBpcyBub3Qgcm9vdFxuICAgIGlmIChub2RlKSB7XG4gICAgICB2YXIga2V5ID0gc3ludGhldGljR2V0S2V5KG5vZGUsIHBvcyk7XG4gICAgICB2YXIgZGF0YSA9IHtcbiAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICBwb3M6IHBvcyxcbiAgICAgICAga2V5OiBrZXksXG4gICAgICAgIHBhcmVudFBvczogcGFyZW50Lm5vZGUgPyBwYXJlbnQucG9zIDogbnVsbCxcbiAgICAgICAgbGV2ZWw6IHBhcmVudC5sZXZlbCArIDEsXG4gICAgICAgIG5vZGVzOiBjb25uZWN0Tm9kZXNcbiAgICAgIH07XG4gICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICB9XG4gICAgLy8gUHJvY2VzcyBjaGlsZHJlbiBub2RlXG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChzdWJOb2RlLCBzdWJJbmRleCkge1xuICAgICAgICBwcm9jZXNzTm9kZShzdWJOb2RlLCBzdWJJbmRleCwge1xuICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgcG9zOiBwb3MsXG4gICAgICAgICAgbGV2ZWw6IHBhcmVudCA/IHBhcmVudC5sZXZlbCArIDEgOiAtMVxuICAgICAgICB9LCBjb25uZWN0Tm9kZXMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHByb2Nlc3NOb2RlKG51bGwpO1xufVxuLyoqXG4gKiBDb252ZXJ0IGB0cmVlRGF0YWAgaW50byBlbnRpdHkgcmVjb3Jkcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnREYXRhVG9FbnRpdGllcyhkYXRhTm9kZXMpIHtcbiAgdmFyIF9yZWYyID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSxcbiAgICBpbml0V3JhcHBlciA9IF9yZWYyLmluaXRXcmFwcGVyLFxuICAgIHByb2Nlc3NFbnRpdHkgPSBfcmVmMi5wcm9jZXNzRW50aXR5LFxuICAgIG9uUHJvY2Vzc0ZpbmlzaGVkID0gX3JlZjIub25Qcm9jZXNzRmluaXNoZWQsXG4gICAgZXh0ZXJuYWxHZXRLZXkgPSBfcmVmMi5leHRlcm5hbEdldEtleSxcbiAgICBjaGlsZHJlblByb3BOYW1lID0gX3JlZjIuY2hpbGRyZW5Qcm9wTmFtZSxcbiAgICBmaWVsZE5hbWVzID0gX3JlZjIuZmllbGROYW1lcztcbiAgdmFyIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGNvbmZpZy5leHRlcm5hbEdldEtleWAgaW5zdGVhZCAqL1xuICBsZWdhY3lFeHRlcm5hbEdldEtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkO1xuICAvLyBJbml0IGNvbmZpZ1xuICB2YXIgbWVyZ2VkRXh0ZXJuYWxHZXRLZXkgPSBleHRlcm5hbEdldEtleSB8fCBsZWdhY3lFeHRlcm5hbEdldEtleTtcbiAgdmFyIHBvc0VudGl0aWVzID0ge307XG4gIHZhciBrZXlFbnRpdGllcyA9IHt9O1xuICB2YXIgd3JhcHBlciA9IHtcbiAgICBwb3NFbnRpdGllczogcG9zRW50aXRpZXMsXG4gICAga2V5RW50aXRpZXM6IGtleUVudGl0aWVzXG4gIH07XG4gIGlmIChpbml0V3JhcHBlcikge1xuICAgIHdyYXBwZXIgPSBpbml0V3JhcHBlcih3cmFwcGVyKSB8fCB3cmFwcGVyO1xuICB9XG4gIHRyYXZlcnNlRGF0YU5vZGVzKGRhdGFOb2RlcywgZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICB2YXIgbm9kZSA9IGl0ZW0ubm9kZSxcbiAgICAgIGluZGV4ID0gaXRlbS5pbmRleCxcbiAgICAgIHBvcyA9IGl0ZW0ucG9zLFxuICAgICAga2V5ID0gaXRlbS5rZXksXG4gICAgICBwYXJlbnRQb3MgPSBpdGVtLnBhcmVudFBvcyxcbiAgICAgIGxldmVsID0gaXRlbS5sZXZlbCxcbiAgICAgIG5vZGVzID0gaXRlbS5ub2RlcztcbiAgICB2YXIgZW50aXR5ID0ge1xuICAgICAgbm9kZTogbm9kZSxcbiAgICAgIG5vZGVzOiBub2RlcyxcbiAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgIGtleToga2V5LFxuICAgICAgcG9zOiBwb3MsXG4gICAgICBsZXZlbDogbGV2ZWxcbiAgICB9O1xuICAgIHZhciBtZXJnZWRLZXkgPSBnZXRLZXkoa2V5LCBwb3MpO1xuICAgIHBvc0VudGl0aWVzW3Bvc10gPSBlbnRpdHk7XG4gICAga2V5RW50aXRpZXNbbWVyZ2VkS2V5XSA9IGVudGl0eTtcbiAgICAvLyBGaWxsIGNoaWxkcmVuXG4gICAgZW50aXR5LnBhcmVudCA9IHBvc0VudGl0aWVzW3BhcmVudFBvc107XG4gICAgaWYgKGVudGl0eS5wYXJlbnQpIHtcbiAgICAgIGVudGl0eS5wYXJlbnQuY2hpbGRyZW4gPSBlbnRpdHkucGFyZW50LmNoaWxkcmVuIHx8IFtdO1xuICAgICAgZW50aXR5LnBhcmVudC5jaGlsZHJlbi5wdXNoKGVudGl0eSk7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzRW50aXR5KSB7XG4gICAgICBwcm9jZXNzRW50aXR5KGVudGl0eSwgd3JhcHBlcik7XG4gICAgfVxuICB9LCB7XG4gICAgZXh0ZXJuYWxHZXRLZXk6IG1lcmdlZEV4dGVybmFsR2V0S2V5LFxuICAgIGNoaWxkcmVuUHJvcE5hbWU6IGNoaWxkcmVuUHJvcE5hbWUsXG4gICAgZmllbGROYW1lczogZmllbGROYW1lc1xuICB9KTtcbiAgaWYgKG9uUHJvY2Vzc0ZpbmlzaGVkKSB7XG4gICAgb25Qcm9jZXNzRmluaXNoZWQod3JhcHBlcik7XG4gIH1cbiAgcmV0dXJuIHdyYXBwZXI7XG59XG4vKipcbiAqIEdldCBUcmVlTm9kZSBwcm9wcyB3aXRoIFRyZWUgcHJvcHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmVlTm9kZVByb3BzKGtleSwgX3JlZjMpIHtcbiAgdmFyIGV4cGFuZGVkS2V5cyA9IF9yZWYzLmV4cGFuZGVkS2V5cyxcbiAgICBzZWxlY3RlZEtleXMgPSBfcmVmMy5zZWxlY3RlZEtleXMsXG4gICAgbG9hZGVkS2V5cyA9IF9yZWYzLmxvYWRlZEtleXMsXG4gICAgbG9hZGluZ0tleXMgPSBfcmVmMy5sb2FkaW5nS2V5cyxcbiAgICBjaGVja2VkS2V5cyA9IF9yZWYzLmNoZWNrZWRLZXlzLFxuICAgIGhhbGZDaGVja2VkS2V5cyA9IF9yZWYzLmhhbGZDaGVja2VkS2V5cyxcbiAgICBkcmFnT3Zlck5vZGVLZXkgPSBfcmVmMy5kcmFnT3Zlck5vZGVLZXksXG4gICAgZHJvcFBvc2l0aW9uID0gX3JlZjMuZHJvcFBvc2l0aW9uLFxuICAgIGtleUVudGl0aWVzID0gX3JlZjMua2V5RW50aXRpZXM7XG4gIHZhciBlbnRpdHkgPSBrZXlFbnRpdGllc1trZXldO1xuICB2YXIgdHJlZU5vZGVQcm9wcyA9IHtcbiAgICBldmVudEtleToga2V5LFxuICAgIGV4cGFuZGVkOiBleHBhbmRlZEtleXMuaW5kZXhPZihrZXkpICE9PSAtMSxcbiAgICBzZWxlY3RlZDogc2VsZWN0ZWRLZXlzLmluZGV4T2Yoa2V5KSAhPT0gLTEsXG4gICAgbG9hZGVkOiBsb2FkZWRLZXlzLmluZGV4T2Yoa2V5KSAhPT0gLTEsXG4gICAgbG9hZGluZzogbG9hZGluZ0tleXMuaW5kZXhPZihrZXkpICE9PSAtMSxcbiAgICBjaGVja2VkOiBjaGVja2VkS2V5cy5pbmRleE9mKGtleSkgIT09IC0xLFxuICAgIGhhbGZDaGVja2VkOiBoYWxmQ2hlY2tlZEtleXMuaW5kZXhPZihrZXkpICE9PSAtMSxcbiAgICBwb3M6IFN0cmluZyhlbnRpdHkgPyBlbnRpdHkucG9zIDogJycpLFxuICAgIC8vIFtMZWdhY3ldIERyYWcgcHJvcHNcbiAgICAvLyBTaW5jZSB0aGUgaW50ZXJhY3Rpb24gb2YgZHJhZyBpcyBjaGFuZ2VkLCB0aGUgc2VtYW50aWMgb2YgdGhlIHByb3BzIGFyZVxuICAgIC8vIG5vdCBhY2N1cmFjeSwgSSB0aGluayBpdCBzaG91bGQgYmUgZmluYWxseSByZW1vdmVkXG4gICAgZHJhZ092ZXI6IGRyYWdPdmVyTm9kZUtleSA9PT0ga2V5ICYmIGRyb3BQb3NpdGlvbiA9PT0gMCxcbiAgICBkcmFnT3ZlckdhcFRvcDogZHJhZ092ZXJOb2RlS2V5ID09PSBrZXkgJiYgZHJvcFBvc2l0aW9uID09PSAtMSxcbiAgICBkcmFnT3ZlckdhcEJvdHRvbTogZHJhZ092ZXJOb2RlS2V5ID09PSBrZXkgJiYgZHJvcFBvc2l0aW9uID09PSAxXG4gIH07XG4gIHJldHVybiB0cmVlTm9kZVByb3BzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnROb2RlUHJvcHNUb0V2ZW50RGF0YShwcm9wcykge1xuICB2YXIgZGF0YSA9IHByb3BzLmRhdGEsXG4gICAgZXhwYW5kZWQgPSBwcm9wcy5leHBhbmRlZCxcbiAgICBzZWxlY3RlZCA9IHByb3BzLnNlbGVjdGVkLFxuICAgIGNoZWNrZWQgPSBwcm9wcy5jaGVja2VkLFxuICAgIGxvYWRlZCA9IHByb3BzLmxvYWRlZCxcbiAgICBsb2FkaW5nID0gcHJvcHMubG9hZGluZyxcbiAgICBoYWxmQ2hlY2tlZCA9IHByb3BzLmhhbGZDaGVja2VkLFxuICAgIGRyYWdPdmVyID0gcHJvcHMuZHJhZ092ZXIsXG4gICAgZHJhZ092ZXJHYXBUb3AgPSBwcm9wcy5kcmFnT3ZlckdhcFRvcCxcbiAgICBkcmFnT3ZlckdhcEJvdHRvbSA9IHByb3BzLmRyYWdPdmVyR2FwQm90dG9tLFxuICAgIHBvcyA9IHByb3BzLnBvcyxcbiAgICBhY3RpdmUgPSBwcm9wcy5hY3RpdmUsXG4gICAgZXZlbnRLZXkgPSBwcm9wcy5ldmVudEtleTtcbiAgdmFyIGV2ZW50RGF0YSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZGF0YSksIHt9LCB7XG4gICAgZXhwYW5kZWQ6IGV4cGFuZGVkLFxuICAgIHNlbGVjdGVkOiBzZWxlY3RlZCxcbiAgICBjaGVja2VkOiBjaGVja2VkLFxuICAgIGxvYWRlZDogbG9hZGVkLFxuICAgIGxvYWRpbmc6IGxvYWRpbmcsXG4gICAgaGFsZkNoZWNrZWQ6IGhhbGZDaGVja2VkLFxuICAgIGRyYWdPdmVyOiBkcmFnT3ZlcixcbiAgICBkcmFnT3ZlckdhcFRvcDogZHJhZ092ZXJHYXBUb3AsXG4gICAgZHJhZ092ZXJHYXBCb3R0b206IGRyYWdPdmVyR2FwQm90dG9tLFxuICAgIHBvczogcG9zLFxuICAgIGFjdGl2ZTogYWN0aXZlLFxuICAgIGtleTogZXZlbnRLZXlcbiAgfSk7XG4gIGlmICghKCdwcm9wcycgaW4gZXZlbnREYXRhKSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShldmVudERhdGEsICdwcm9wcycsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICB3YXJuaW5nKGZhbHNlLCAnU2Vjb25kIHBhcmFtIHJldHVybiBmcm9tIGV2ZW50IGlzIG5vZGUgZGF0YSBpbnN0ZWFkIG9mIFRyZWVOb2RlIGluc3RhbmNlLiBQbGVhc2UgcmVhZCB2YWx1ZSBkaXJlY3RseSBpbnN0ZWFkIG9mIHJlYWRpbmcgZnJvbSBgcHJvcHNgLicpO1xuICAgICAgICByZXR1cm4gcHJvcHM7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGV2ZW50RGF0YTtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgb21pdCBmcm9tIFwicmMtdXRpbC9lcy9vbWl0XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCBDaGVja2JveCBmcm9tICcuL0NoZWNrYm94JztcbmV4cG9ydCB2YXIgR3JvdXBDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG52YXIgSW50ZXJuYWxDaGVja2JveEdyb3VwID0gZnVuY3Rpb24gSW50ZXJuYWxDaGVja2JveEdyb3VwKF9hLCByZWYpIHtcbiAgdmFyIGRlZmF1bHRWYWx1ZSA9IF9hLmRlZmF1bHRWYWx1ZSxcbiAgICBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLFxuICAgIF9hJG9wdGlvbnMgPSBfYS5vcHRpb25zLFxuICAgIG9wdGlvbnMgPSBfYSRvcHRpb25zID09PSB2b2lkIDAgPyBbXSA6IF9hJG9wdGlvbnMsXG4gICAgY3VzdG9taXplUHJlZml4Q2xzID0gX2EucHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZSxcbiAgICBzdHlsZSA9IF9hLnN0eWxlLFxuICAgIG9uQ2hhbmdlID0gX2Eub25DaGFuZ2UsXG4gICAgcmVzdFByb3BzID0gX19yZXN0KF9hLCBbXCJkZWZhdWx0VmFsdWVcIiwgXCJjaGlsZHJlblwiLCBcIm9wdGlvbnNcIiwgXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJzdHlsZVwiLCBcIm9uQ2hhbmdlXCJdKTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUocmVzdFByb3BzLnZhbHVlIHx8IGRlZmF1bHRWYWx1ZSB8fCBbXSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgdmFsdWUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldFZhbHVlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTMgPSBSZWFjdC51c2VTdGF0ZShbXSksXG4gICAgX1JlYWN0JHVzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTMsIDIpLFxuICAgIHJlZ2lzdGVyZWRWYWx1ZXMgPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgIHNldFJlZ2lzdGVyZWRWYWx1ZXMgPSBfUmVhY3QkdXNlU3RhdGU0WzFdO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICgndmFsdWUnIGluIHJlc3RQcm9wcykge1xuICAgICAgc2V0VmFsdWUocmVzdFByb3BzLnZhbHVlIHx8IFtdKTtcbiAgICB9XG4gIH0sIFtyZXN0UHJvcHMudmFsdWVdKTtcbiAgdmFyIGdldE9wdGlvbnMgPSBmdW5jdGlvbiBnZXRPcHRpb25zKCkge1xuICAgIHJldHVybiBvcHRpb25zLm1hcChmdW5jdGlvbiAob3B0aW9uKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG9wdGlvbiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsYWJlbDogb3B0aW9uLFxuICAgICAgICAgIHZhbHVlOiBvcHRpb25cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHRpb247XG4gICAgfSk7XG4gIH07XG4gIHZhciBjYW5jZWxWYWx1ZSA9IGZ1bmN0aW9uIGNhbmNlbFZhbHVlKHZhbCkge1xuICAgIHNldFJlZ2lzdGVyZWRWYWx1ZXMoZnVuY3Rpb24gKHByZXZWYWx1ZXMpIHtcbiAgICAgIHJldHVybiBwcmV2VmFsdWVzLmZpbHRlcihmdW5jdGlvbiAodikge1xuICAgICAgICByZXR1cm4gdiAhPT0gdmFsO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG4gIHZhciByZWdpc3RlclZhbHVlID0gZnVuY3Rpb24gcmVnaXN0ZXJWYWx1ZSh2YWwpIHtcbiAgICBzZXRSZWdpc3RlcmVkVmFsdWVzKGZ1bmN0aW9uIChwcmV2VmFsdWVzKSB7XG4gICAgICByZXR1cm4gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShwcmV2VmFsdWVzKSwgW3ZhbF0pO1xuICAgIH0pO1xuICB9O1xuICB2YXIgdG9nZ2xlT3B0aW9uID0gZnVuY3Rpb24gdG9nZ2xlT3B0aW9uKG9wdGlvbikge1xuICAgIHZhciBvcHRpb25JbmRleCA9IHZhbHVlLmluZGV4T2Yob3B0aW9uLnZhbHVlKTtcbiAgICB2YXIgbmV3VmFsdWUgPSBfdG9Db25zdW1hYmxlQXJyYXkodmFsdWUpO1xuICAgIGlmIChvcHRpb25JbmRleCA9PT0gLTEpIHtcbiAgICAgIG5ld1ZhbHVlLnB1c2gob3B0aW9uLnZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3VmFsdWUuc3BsaWNlKG9wdGlvbkluZGV4LCAxKTtcbiAgICB9XG4gICAgaWYgKCEoJ3ZhbHVlJyBpbiByZXN0UHJvcHMpKSB7XG4gICAgICBzZXRWYWx1ZShuZXdWYWx1ZSk7XG4gICAgfVxuICAgIHZhciBvcHRzID0gZ2V0T3B0aW9ucygpO1xuICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXdWYWx1ZS5maWx0ZXIoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgcmV0dXJuIHJlZ2lzdGVyZWRWYWx1ZXMuaW5jbHVkZXModmFsKTtcbiAgICB9KS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICB2YXIgaW5kZXhBID0gb3B0cy5maW5kSW5kZXgoZnVuY3Rpb24gKG9wdCkge1xuICAgICAgICByZXR1cm4gb3B0LnZhbHVlID09PSBhO1xuICAgICAgfSk7XG4gICAgICB2YXIgaW5kZXhCID0gb3B0cy5maW5kSW5kZXgoZnVuY3Rpb24gKG9wdCkge1xuICAgICAgICByZXR1cm4gb3B0LnZhbHVlID09PSBiO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gaW5kZXhBIC0gaW5kZXhCO1xuICAgIH0pKTtcbiAgfTtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnY2hlY2tib3gnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgZ3JvdXBQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWdyb3VwXCIpO1xuICB2YXIgZG9tUHJvcHMgPSBvbWl0KHJlc3RQcm9wcywgWyd2YWx1ZScsICdkaXNhYmxlZCddKTtcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgY2hpbGRyZW4gPSBnZXRPcHRpb25zKCkubWFwKGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDaGVja2JveCwge1xuICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAga2V5OiBvcHRpb24udmFsdWUudG9TdHJpbmcoKSxcbiAgICAgICAgZGlzYWJsZWQ6ICdkaXNhYmxlZCcgaW4gb3B0aW9uID8gb3B0aW9uLmRpc2FibGVkIDogcmVzdFByb3BzLmRpc2FibGVkLFxuICAgICAgICB2YWx1ZTogb3B0aW9uLnZhbHVlLFxuICAgICAgICBjaGVja2VkOiB2YWx1ZS5pbmNsdWRlcyhvcHRpb24udmFsdWUpLFxuICAgICAgICBvbkNoYW5nZTogb3B0aW9uLm9uQ2hhbmdlLFxuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KGdyb3VwUHJlZml4Q2xzLCBcIi1pdGVtXCIpLFxuICAgICAgICBzdHlsZTogb3B0aW9uLnN0eWxlXG4gICAgICB9LCBvcHRpb24ubGFiZWwpO1xuICAgIH0pO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9qc3gtbm8tY29uc3RydWN0ZWQtY29udGV4dC12YWx1ZXNcbiAgdmFyIGNvbnRleHQgPSB7XG4gICAgdG9nZ2xlT3B0aW9uOiB0b2dnbGVPcHRpb24sXG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIGRpc2FibGVkOiByZXN0UHJvcHMuZGlzYWJsZWQsXG4gICAgbmFtZTogcmVzdFByb3BzLm5hbWUsXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMTYzNzZcbiAgICByZWdpc3RlclZhbHVlOiByZWdpc3RlclZhbHVlLFxuICAgIGNhbmNlbFZhbHVlOiBjYW5jZWxWYWx1ZVxuICB9O1xuICB2YXIgY2xhc3NTdHJpbmcgPSBjbGFzc05hbWVzKGdyb3VwUHJlZml4Q2xzLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KGdyb3VwUHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBjbGFzc05hbWUpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xhc3NTdHJpbmcsXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0sIGRvbVByb3BzLCB7XG4gICAgcmVmOiByZWZcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEdyb3VwQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBjb250ZXh0XG4gIH0sIGNoaWxkcmVuKSk7XG59O1xudmFyIENoZWNrYm94R3JvdXAgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihJbnRlcm5hbENoZWNrYm94R3JvdXApO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0Lm1lbW8oQ2hlY2tib3hHcm91cCk7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJjQ2hlY2tib3ggZnJvbSAncmMtY2hlY2tib3gnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHsgRm9ybUl0ZW1JbnB1dENvbnRleHQgfSBmcm9tICcuLi9mb3JtL2NvbnRleHQnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi4vX3V0aWwvd2FybmluZyc7XG5pbXBvcnQgeyBHcm91cENvbnRleHQgfSBmcm9tICcuL0dyb3VwJztcbmltcG9ydCBEaXNhYmxlZENvbnRleHQgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL0Rpc2FibGVkQ29udGV4dCc7XG52YXIgSW50ZXJuYWxDaGVja2JveCA9IGZ1bmN0aW9uIEludGVybmFsQ2hlY2tib3goX2EsIHJlZikge1xuICB2YXIgX2NsYXNzTmFtZXM7XG4gIHZhciBfYjtcbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IF9hLnByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBfYS5jbGFzc05hbWUsXG4gICAgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbixcbiAgICBfYSRpbmRldGVybWluYXRlID0gX2EuaW5kZXRlcm1pbmF0ZSxcbiAgICBpbmRldGVybWluYXRlID0gX2EkaW5kZXRlcm1pbmF0ZSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYSRpbmRldGVybWluYXRlLFxuICAgIHN0eWxlID0gX2Euc3R5bGUsXG4gICAgb25Nb3VzZUVudGVyID0gX2Eub25Nb3VzZUVudGVyLFxuICAgIG9uTW91c2VMZWF2ZSA9IF9hLm9uTW91c2VMZWF2ZSxcbiAgICBfYSRza2lwR3JvdXAgPSBfYS5za2lwR3JvdXAsXG4gICAgc2tpcEdyb3VwID0gX2Ekc2tpcEdyb3VwID09PSB2b2lkIDAgPyBmYWxzZSA6IF9hJHNraXBHcm91cCxcbiAgICBkaXNhYmxlZCA9IF9hLmRpc2FibGVkLFxuICAgIHJlc3RQcm9wcyA9IF9fcmVzdChfYSwgW1wicHJlZml4Q2xzXCIsIFwiY2xhc3NOYW1lXCIsIFwiY2hpbGRyZW5cIiwgXCJpbmRldGVybWluYXRlXCIsIFwic3R5bGVcIiwgXCJvbk1vdXNlRW50ZXJcIiwgXCJvbk1vdXNlTGVhdmVcIiwgXCJza2lwR3JvdXBcIiwgXCJkaXNhYmxlZFwiXSk7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCksXG4gICAgZ2V0UHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UHJlZml4Q2xzLFxuICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcbiAgdmFyIGNoZWNrYm94R3JvdXAgPSBSZWFjdC51c2VDb250ZXh0KEdyb3VwQ29udGV4dCk7XG4gIHZhciBfdXNlQ29udGV4dCA9IHVzZUNvbnRleHQoRm9ybUl0ZW1JbnB1dENvbnRleHQpLFxuICAgIGlzRm9ybUl0ZW1JbnB1dCA9IF91c2VDb250ZXh0LmlzRm9ybUl0ZW1JbnB1dDtcbiAgdmFyIGNvbnRleHREaXNhYmxlZCA9IHVzZUNvbnRleHQoRGlzYWJsZWRDb250ZXh0KTtcbiAgdmFyIG1lcmdlZERpc2FibGVkID0gKF9iID0gKGNoZWNrYm94R3JvdXAgPT09IG51bGwgfHwgY2hlY2tib3hHcm91cCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hlY2tib3hHcm91cC5kaXNhYmxlZCkgfHwgZGlzYWJsZWQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGNvbnRleHREaXNhYmxlZDtcbiAgdmFyIHByZXZWYWx1ZSA9IFJlYWN0LnVzZVJlZihyZXN0UHJvcHMudmFsdWUpO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGNoZWNrYm94R3JvdXAgPT09IG51bGwgfHwgY2hlY2tib3hHcm91cCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hlY2tib3hHcm91cC5yZWdpc3RlclZhbHVlKHJlc3RQcm9wcy52YWx1ZSk7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZygnY2hlY2tlZCcgaW4gcmVzdFByb3BzIHx8ICEhY2hlY2tib3hHcm91cCB8fCAhKCd2YWx1ZScgaW4gcmVzdFByb3BzKSwgJ0NoZWNrYm94JywgJ2B2YWx1ZWAgaXMgbm90IGEgdmFsaWQgcHJvcCwgZG8geW91IG1lYW4gYGNoZWNrZWRgPycpIDogdm9pZCAwO1xuICB9LCBbXSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNraXBHcm91cCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocmVzdFByb3BzLnZhbHVlICE9PSBwcmV2VmFsdWUuY3VycmVudCkge1xuICAgICAgY2hlY2tib3hHcm91cCA9PT0gbnVsbCB8fCBjaGVja2JveEdyb3VwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjaGVja2JveEdyb3VwLmNhbmNlbFZhbHVlKHByZXZWYWx1ZS5jdXJyZW50KTtcbiAgICAgIGNoZWNrYm94R3JvdXAgPT09IG51bGwgfHwgY2hlY2tib3hHcm91cCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hlY2tib3hHcm91cC5yZWdpc3RlclZhbHVlKHJlc3RQcm9wcy52YWx1ZSk7XG4gICAgICBwcmV2VmFsdWUuY3VycmVudCA9IHJlc3RQcm9wcy52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjaGVja2JveEdyb3VwID09PSBudWxsIHx8IGNoZWNrYm94R3JvdXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNoZWNrYm94R3JvdXAuY2FuY2VsVmFsdWUocmVzdFByb3BzLnZhbHVlKTtcbiAgICB9O1xuICB9LCBbcmVzdFByb3BzLnZhbHVlXSk7XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2NoZWNrYm94JywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIGNoZWNrYm94UHJvcHMgPSBfZXh0ZW5kcyh7fSwgcmVzdFByb3BzKTtcbiAgaWYgKGNoZWNrYm94R3JvdXAgJiYgIXNraXBHcm91cCkge1xuICAgIGNoZWNrYm94UHJvcHMub25DaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAocmVzdFByb3BzLm9uQ2hhbmdlKSB7XG4gICAgICAgIHJlc3RQcm9wcy5vbkNoYW5nZS5hcHBseShyZXN0UHJvcHMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgICBpZiAoY2hlY2tib3hHcm91cC50b2dnbGVPcHRpb24pIHtcbiAgICAgICAgY2hlY2tib3hHcm91cC50b2dnbGVPcHRpb24oe1xuICAgICAgICAgIGxhYmVsOiBjaGlsZHJlbixcbiAgICAgICAgICB2YWx1ZTogcmVzdFByb3BzLnZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgY2hlY2tib3hQcm9wcy5uYW1lID0gY2hlY2tib3hHcm91cC5uYW1lO1xuICAgIGNoZWNrYm94UHJvcHMuY2hlY2tlZCA9IGNoZWNrYm94R3JvdXAudmFsdWUuaW5jbHVkZXMocmVzdFByb3BzLnZhbHVlKTtcbiAgfVxuICB2YXIgY2xhc3NTdHJpbmcgPSBjbGFzc05hbWVzKChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd3JhcHBlclwiKSwgdHJ1ZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd3JhcHBlci1jaGVja2VkXCIpLCBjaGVja2JveFByb3BzLmNoZWNrZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd3JhcHBlci1kaXNhYmxlZFwiKSwgbWVyZ2VkRGlzYWJsZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd3JhcHBlci1pbi1mb3JtLWl0ZW1cIiksIGlzRm9ybUl0ZW1JbnB1dCksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lKTtcbiAgdmFyIGNoZWNrYm94Q2xhc3MgPSBjbGFzc05hbWVzKF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbmRldGVybWluYXRlXCIpLCBpbmRldGVybWluYXRlKSk7XG4gIHZhciBhcmlhQ2hlY2tlZCA9IGluZGV0ZXJtaW5hdGUgPyAnbWl4ZWQnIDogdW5kZWZpbmVkO1xuICByZXR1cm4gKFxuICAgIC8qI19fUFVSRV9fKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganN4LWExMXkvbGFiZWwtaGFzLWFzc29jaWF0ZWQtY29udHJvbFxuICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzU3RyaW5nLFxuICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgb25Nb3VzZUVudGVyOiBvbk1vdXNlRW50ZXIsXG4gICAgICBvbk1vdXNlTGVhdmU6IG9uTW91c2VMZWF2ZVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJjQ2hlY2tib3gsIF9leHRlbmRzKHtcbiAgICAgIFwiYXJpYS1jaGVja2VkXCI6IGFyaWFDaGVja2VkXG4gICAgfSwgY2hlY2tib3hQcm9wcywge1xuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICBjbGFzc05hbWU6IGNoZWNrYm94Q2xhc3MsXG4gICAgICBkaXNhYmxlZDogbWVyZ2VkRGlzYWJsZWQsXG4gICAgICByZWY6IHJlZlxuICAgIH0pKSwgY2hpbGRyZW4gIT09IHVuZGVmaW5lZCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgY2hpbGRyZW4pKVxuICApO1xufTtcbnZhciBDaGVja2JveCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEludGVybmFsQ2hlY2tib3gpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgQ2hlY2tib3guZGlzcGxheU5hbWUgPSAnQ2hlY2tib3gnO1xufVxuZXhwb3J0IGRlZmF1bHQgQ2hlY2tib3g7IiwiaW1wb3J0IEludGVybmFsQ2hlY2tib3ggZnJvbSAnLi9DaGVja2JveCc7XG5pbXBvcnQgR3JvdXAgZnJvbSAnLi9Hcm91cCc7XG52YXIgQ2hlY2tib3ggPSBJbnRlcm5hbENoZWNrYm94O1xuQ2hlY2tib3guR3JvdXAgPSBHcm91cDtcbkNoZWNrYm94Ll9fQU5UX0NIRUNLQk9YID0gdHJ1ZTtcbmV4cG9ydCBkZWZhdWx0IENoZWNrYm94OyIsImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG52YXIgUm93Q29udGV4dCA9IC8qI19fUFVSRV9fKi9jcmVhdGVDb250ZXh0KHt9KTtcbmV4cG9ydCBkZWZhdWx0IFJvd0NvbnRleHQ7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgUm93Q29udGV4dCBmcm9tICcuL1Jvd0NvbnRleHQnO1xuZnVuY3Rpb24gcGFyc2VGbGV4KGZsZXgpIHtcbiAgaWYgKHR5cGVvZiBmbGV4ID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBcIlwiLmNvbmNhdChmbGV4LCBcIiBcIikuY29uY2F0KGZsZXgsIFwiIGF1dG9cIik7XG4gIH1cbiAgaWYgKC9eXFxkKyhcXC5cXGQrKT8ocHh8ZW18cmVtfCUpJC8udGVzdChmbGV4KSkge1xuICAgIHJldHVybiBcIjAgMCBcIi5jb25jYXQoZmxleCk7XG4gIH1cbiAgcmV0dXJuIGZsZXg7XG59XG52YXIgc2l6ZXMgPSBbJ3hzJywgJ3NtJywgJ21kJywgJ2xnJywgJ3hsJywgJ3h4bCddO1xudmFyIENvbCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBfY2xhc3NOYW1lcztcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQyID0gUmVhY3QudXNlQ29udGV4dChSb3dDb250ZXh0KSxcbiAgICBndXR0ZXIgPSBfUmVhY3QkdXNlQ29udGV4dDIuZ3V0dGVyLFxuICAgIHdyYXAgPSBfUmVhY3QkdXNlQ29udGV4dDIud3JhcCxcbiAgICBzdXBwb3J0RmxleEdhcCA9IF9SZWFjdCR1c2VDb250ZXh0Mi5zdXBwb3J0RmxleEdhcDtcbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBzcGFuID0gcHJvcHMuc3BhbixcbiAgICBvcmRlciA9IHByb3BzLm9yZGVyLFxuICAgIG9mZnNldCA9IHByb3BzLm9mZnNldCxcbiAgICBwdXNoID0gcHJvcHMucHVzaCxcbiAgICBwdWxsID0gcHJvcHMucHVsbCxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBmbGV4ID0gcHJvcHMuZmxleCxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIG90aGVycyA9IF9fcmVzdChwcm9wcywgW1wicHJlZml4Q2xzXCIsIFwic3BhblwiLCBcIm9yZGVyXCIsIFwib2Zmc2V0XCIsIFwicHVzaFwiLCBcInB1bGxcIiwgXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiLCBcImZsZXhcIiwgXCJzdHlsZVwiXSk7XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2NvbCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIHZhciBzaXplQ2xhc3NPYmogPSB7fTtcbiAgc2l6ZXMuZm9yRWFjaChmdW5jdGlvbiAoc2l6ZSkge1xuICAgIHZhciBfZXh0ZW5kczI7XG4gICAgdmFyIHNpemVQcm9wcyA9IHt9O1xuICAgIHZhciBwcm9wU2l6ZSA9IHByb3BzW3NpemVdO1xuICAgIGlmICh0eXBlb2YgcHJvcFNpemUgPT09ICdudW1iZXInKSB7XG4gICAgICBzaXplUHJvcHMuc3BhbiA9IHByb3BTaXplO1xuICAgIH0gZWxzZSBpZiAoX3R5cGVvZihwcm9wU2l6ZSkgPT09ICdvYmplY3QnKSB7XG4gICAgICBzaXplUHJvcHMgPSBwcm9wU2l6ZSB8fCB7fTtcbiAgICB9XG4gICAgZGVsZXRlIG90aGVyc1tzaXplXTtcbiAgICBzaXplQ2xhc3NPYmogPSBfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgc2l6ZUNsYXNzT2JqKSwgKF9leHRlbmRzMiA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2V4dGVuZHMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoc2l6ZSwgXCItXCIpLmNvbmNhdChzaXplUHJvcHMuc3BhbiksIHNpemVQcm9wcy5zcGFuICE9PSB1bmRlZmluZWQpLCBfZGVmaW5lUHJvcGVydHkoX2V4dGVuZHMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoc2l6ZSwgXCItb3JkZXItXCIpLmNvbmNhdChzaXplUHJvcHMub3JkZXIpLCBzaXplUHJvcHMub3JkZXIgfHwgc2l6ZVByb3BzLm9yZGVyID09PSAwKSwgX2RlZmluZVByb3BlcnR5KF9leHRlbmRzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHNpemUsIFwiLW9mZnNldC1cIikuY29uY2F0KHNpemVQcm9wcy5vZmZzZXQpLCBzaXplUHJvcHMub2Zmc2V0IHx8IHNpemVQcm9wcy5vZmZzZXQgPT09IDApLCBfZGVmaW5lUHJvcGVydHkoX2V4dGVuZHMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoc2l6ZSwgXCItcHVzaC1cIikuY29uY2F0KHNpemVQcm9wcy5wdXNoKSwgc2l6ZVByb3BzLnB1c2ggfHwgc2l6ZVByb3BzLnB1c2ggPT09IDApLCBfZGVmaW5lUHJvcGVydHkoX2V4dGVuZHMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoc2l6ZSwgXCItcHVsbC1cIikuY29uY2F0KHNpemVQcm9wcy5wdWxsKSwgc2l6ZVByb3BzLnB1bGwgfHwgc2l6ZVByb3BzLnB1bGwgPT09IDApLCBfZGVmaW5lUHJvcGVydHkoX2V4dGVuZHMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9leHRlbmRzMikpO1xuICB9KTtcbiAgdmFyIGNsYXNzZXMgPSBjbGFzc05hbWVzKHByZWZpeENscywgKF9jbGFzc05hbWVzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHNwYW4pLCBzcGFuICE9PSB1bmRlZmluZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItb3JkZXItXCIpLmNvbmNhdChvcmRlciksIG9yZGVyKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW9mZnNldC1cIikuY29uY2F0KG9mZnNldCksIG9mZnNldCksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wdXNoLVwiKS5jb25jYXQocHVzaCksIHB1c2gpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcHVsbC1cIikuY29uY2F0KHB1bGwpLCBwdWxsKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUsIHNpemVDbGFzc09iaik7XG4gIHZhciBtZXJnZWRTdHlsZSA9IHt9O1xuICAvLyBIb3Jpem9udGFsIGd1dHRlciB1c2UgcGFkZGluZ1xuICBpZiAoZ3V0dGVyICYmIGd1dHRlclswXSA+IDApIHtcbiAgICB2YXIgaG9yaXpvbnRhbEd1dHRlciA9IGd1dHRlclswXSAvIDI7XG4gICAgbWVyZ2VkU3R5bGUucGFkZGluZ0xlZnQgPSBob3Jpem9udGFsR3V0dGVyO1xuICAgIG1lcmdlZFN0eWxlLnBhZGRpbmdSaWdodCA9IGhvcml6b250YWxHdXR0ZXI7XG4gIH1cbiAgLy8gVmVydGljYWwgZ3V0dGVyIHVzZSBwYWRkaW5nIHdoZW4gZ2FwIG5vdCBzdXBwb3J0XG4gIGlmIChndXR0ZXIgJiYgZ3V0dGVyWzFdID4gMCAmJiAhc3VwcG9ydEZsZXhHYXApIHtcbiAgICB2YXIgdmVydGljYWxHdXR0ZXIgPSBndXR0ZXJbMV0gLyAyO1xuICAgIG1lcmdlZFN0eWxlLnBhZGRpbmdUb3AgPSB2ZXJ0aWNhbEd1dHRlcjtcbiAgICBtZXJnZWRTdHlsZS5wYWRkaW5nQm90dG9tID0gdmVydGljYWxHdXR0ZXI7XG4gIH1cbiAgaWYgKGZsZXgpIHtcbiAgICBtZXJnZWRTdHlsZS5mbGV4ID0gcGFyc2VGbGV4KGZsZXgpO1xuICAgIC8vIEhhY2sgZm9yIEZpcmVmb3ggdG8gYXZvaWQgc2l6ZSBpc3N1ZVxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vcHVsbC8yMDAyMyNpc3N1ZWNvbW1lbnQtNTY0Mzg5NTUzXG4gICAgaWYgKHdyYXAgPT09IGZhbHNlICYmICFtZXJnZWRTdHlsZS5taW5XaWR0aCkge1xuICAgICAgbWVyZ2VkU3R5bGUubWluV2lkdGggPSAwO1xuICAgIH1cbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe30sIG90aGVycywge1xuICAgIHN0eWxlOiBfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgbWVyZ2VkU3R5bGUpLCBzdHlsZSksXG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzLFxuICAgIHJlZjogcmVmXG4gIH0pLCBjaGlsZHJlbik7XG59KTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIENvbC5kaXNwbGF5TmFtZSA9ICdDb2wnO1xufVxuZXhwb3J0IGRlZmF1bHQgQ29sOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgdXNlRmxleEdhcFN1cHBvcnQgZnJvbSAnLi4vX3V0aWwvaG9va3MvdXNlRmxleEdhcFN1cHBvcnQnO1xuaW1wb3J0IFJlc3BvbnNpdmVPYnNlcnZlLCB7IHJlc3BvbnNpdmVBcnJheSB9IGZyb20gJy4uL191dGlsL3Jlc3BvbnNpdmVPYnNlcnZlJztcbmltcG9ydCB7IHR1cGxlIH0gZnJvbSAnLi4vX3V0aWwvdHlwZSc7XG5pbXBvcnQgUm93Q29udGV4dCBmcm9tICcuL1Jvd0NvbnRleHQnO1xudmFyIFJvd0FsaWducyA9IHR1cGxlKCd0b3AnLCAnbWlkZGxlJywgJ2JvdHRvbScsICdzdHJldGNoJyk7XG52YXIgUm93SnVzdGlmeSA9IHR1cGxlKCdzdGFydCcsICdlbmQnLCAnY2VudGVyJywgJ3NwYWNlLWFyb3VuZCcsICdzcGFjZS1iZXR3ZWVuJywgJ3NwYWNlLWV2ZW5seScpO1xuZnVuY3Rpb24gdXNlTWVyZ2VQcm9wQnlTY3JlZW4ob3JpUHJvcCwgc2NyZWVuKSB7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSh0eXBlb2Ygb3JpUHJvcCA9PT0gJ3N0cmluZycgPyBvcmlQcm9wIDogJycpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIHByb3AgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldFByb3AgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIgY2xhY01lcmdlQWxpZ25Pckp1c3RpZnkgPSBmdW5jdGlvbiBjbGFjTWVyZ2VBbGlnbk9ySnVzdGlmeSgpIHtcbiAgICBpZiAodHlwZW9mIG9yaVByb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICBzZXRQcm9wKG9yaVByb3ApO1xuICAgIH1cbiAgICBpZiAoX3R5cGVvZihvcmlQcm9wKSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXNwb25zaXZlQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBicmVha3BvaW50ID0gcmVzcG9uc2l2ZUFycmF5W2ldO1xuICAgICAgLy8gaWYgZG8gbm90IG1hdGNoLCBkbyBub3RoaW5nXG4gICAgICBpZiAoIXNjcmVlblticmVha3BvaW50XSkgY29udGludWU7XG4gICAgICB2YXIgY3VyVmFsID0gb3JpUHJvcFticmVha3BvaW50XTtcbiAgICAgIGlmIChjdXJWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzZXRQcm9wKGN1clZhbCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgY2xhY01lcmdlQWxpZ25Pckp1c3RpZnkoKTtcbiAgfSwgW0pTT04uc3RyaW5naWZ5KG9yaVByb3ApLCBzY3JlZW5dKTtcbiAgcmV0dXJuIHByb3A7XG59XG52YXIgUm93ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGp1c3RpZnkgPSBwcm9wcy5qdXN0aWZ5LFxuICAgIGFsaWduID0gcHJvcHMuYWxpZ24sXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBfcHJvcHMkZ3V0dGVyID0gcHJvcHMuZ3V0dGVyLFxuICAgIGd1dHRlciA9IF9wcm9wcyRndXR0ZXIgPT09IHZvaWQgMCA/IDAgOiBfcHJvcHMkZ3V0dGVyLFxuICAgIHdyYXAgPSBwcm9wcy53cmFwLFxuICAgIG90aGVycyA9IF9fcmVzdChwcm9wcywgW1wicHJlZml4Q2xzXCIsIFwianVzdGlmeVwiLCBcImFsaWduXCIsIFwiY2xhc3NOYW1lXCIsIFwic3R5bGVcIiwgXCJjaGlsZHJlblwiLCBcImd1dHRlclwiLCBcIndyYXBcIl0pO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICBkaXJlY3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb247XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUzID0gUmVhY3QudXNlU3RhdGUoe1xuICAgICAgeHM6IHRydWUsXG4gICAgICBzbTogdHJ1ZSxcbiAgICAgIG1kOiB0cnVlLFxuICAgICAgbGc6IHRydWUsXG4gICAgICB4bDogdHJ1ZSxcbiAgICAgIHh4bDogdHJ1ZVxuICAgIH0pLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUzLCAyKSxcbiAgICBzY3JlZW5zID0gX1JlYWN0JHVzZVN0YXRlNFswXSxcbiAgICBzZXRTY3JlZW5zID0gX1JlYWN0JHVzZVN0YXRlNFsxXTtcbiAgLy8gdG8gc2F2ZSBzY3JlZW5zIGluZm8gd2hlbiByZXNwb25zaXZlT2JzZXJ2ZSBjYWxsYmFjayBoYWQgYmVlbiBjYWxsXG4gIHZhciBfUmVhY3QkdXNlU3RhdGU1ID0gUmVhY3QudXNlU3RhdGUoe1xuICAgICAgeHM6IGZhbHNlLFxuICAgICAgc206IGZhbHNlLFxuICAgICAgbWQ6IGZhbHNlLFxuICAgICAgbGc6IGZhbHNlLFxuICAgICAgeGw6IGZhbHNlLFxuICAgICAgeHhsOiBmYWxzZVxuICAgIH0pLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTYgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGU1LCAyKSxcbiAgICBjdXJTY3JlZW5zID0gX1JlYWN0JHVzZVN0YXRlNlswXSxcbiAgICBzZXRDdXJTY3JlZW5zID0gX1JlYWN0JHVzZVN0YXRlNlsxXTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBjYWxjIHJlcG9uc2l2ZSBkYXRhID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG1lcmdlQWxpZ24gPSB1c2VNZXJnZVByb3BCeVNjcmVlbihhbGlnbiwgY3VyU2NyZWVucyk7XG4gIHZhciBtZXJnZUp1c3RpZnkgPSB1c2VNZXJnZVByb3BCeVNjcmVlbihqdXN0aWZ5LCBjdXJTY3JlZW5zKTtcbiAgdmFyIHN1cHBvcnRGbGV4R2FwID0gdXNlRmxleEdhcFN1cHBvcnQoKTtcbiAgdmFyIGd1dHRlclJlZiA9IFJlYWN0LnVzZVJlZihndXR0ZXIpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEVmZmVjdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRva2VuID0gUmVzcG9uc2l2ZU9ic2VydmUuc3Vic2NyaWJlKGZ1bmN0aW9uIChzY3JlZW4pIHtcbiAgICAgIHNldEN1clNjcmVlbnMoc2NyZWVuKTtcbiAgICAgIHZhciBjdXJyZW50R3V0dGVyID0gZ3V0dGVyUmVmLmN1cnJlbnQgfHwgMDtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShjdXJyZW50R3V0dGVyKSAmJiBfdHlwZW9mKGN1cnJlbnRHdXR0ZXIpID09PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGN1cnJlbnRHdXR0ZXIpICYmIChfdHlwZW9mKGN1cnJlbnRHdXR0ZXJbMF0pID09PSAnb2JqZWN0JyB8fCBfdHlwZW9mKGN1cnJlbnRHdXR0ZXJbMV0pID09PSAnb2JqZWN0JykpIHtcbiAgICAgICAgc2V0U2NyZWVucyhzY3JlZW4pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gUmVzcG9uc2l2ZU9ic2VydmUudW5zdWJzY3JpYmUodG9rZW4pO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgZ2V0R3V0dGVyID0gZnVuY3Rpb24gZ2V0R3V0dGVyKCkge1xuICAgIHZhciByZXN1bHRzID0gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXTtcbiAgICB2YXIgbm9ybWFsaXplZEd1dHRlciA9IEFycmF5LmlzQXJyYXkoZ3V0dGVyKSA/IGd1dHRlciA6IFtndXR0ZXIsIHVuZGVmaW5lZF07XG4gICAgbm9ybWFsaXplZEd1dHRlci5mb3JFYWNoKGZ1bmN0aW9uIChnLCBpbmRleCkge1xuICAgICAgaWYgKF90eXBlb2YoZykgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzcG9uc2l2ZUFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGJyZWFrcG9pbnQgPSByZXNwb25zaXZlQXJyYXlbaV07XG4gICAgICAgICAgaWYgKHNjcmVlbnNbYnJlYWtwb2ludF0gJiYgZ1ticmVha3BvaW50XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHRzW2luZGV4XSA9IGdbYnJlYWtwb2ludF07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdHNbaW5kZXhdID0gZztcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfTtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygncm93JywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIGd1dHRlcnMgPSBnZXRHdXR0ZXIoKTtcbiAgdmFyIGNsYXNzZXMgPSBjbGFzc05hbWVzKHByZWZpeENscywgKF9jbGFzc05hbWVzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1uby13cmFwXCIpLCB3cmFwID09PSBmYWxzZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KG1lcmdlSnVzdGlmeSksIG1lcmdlSnVzdGlmeSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KG1lcmdlQWxpZ24pLCBtZXJnZUFsaWduKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lKTtcbiAgLy8gQWRkIGd1dHRlciByZWxhdGVkIHN0eWxlXG4gIHZhciByb3dTdHlsZSA9IHt9O1xuICB2YXIgaG9yaXpvbnRhbEd1dHRlciA9IGd1dHRlcnNbMF0gIT0gbnVsbCAmJiBndXR0ZXJzWzBdID4gMCA/IGd1dHRlcnNbMF0gLyAtMiA6IHVuZGVmaW5lZDtcbiAgdmFyIHZlcnRpY2FsR3V0dGVyID0gZ3V0dGVyc1sxXSAhPSBudWxsICYmIGd1dHRlcnNbMV0gPiAwID8gZ3V0dGVyc1sxXSAvIC0yIDogdW5kZWZpbmVkO1xuICBpZiAoaG9yaXpvbnRhbEd1dHRlcikge1xuICAgIHJvd1N0eWxlLm1hcmdpbkxlZnQgPSBob3Jpem9udGFsR3V0dGVyO1xuICAgIHJvd1N0eWxlLm1hcmdpblJpZ2h0ID0gaG9yaXpvbnRhbEd1dHRlcjtcbiAgfVxuICBpZiAoc3VwcG9ydEZsZXhHYXApIHtcbiAgICAvLyBTZXQgZ2FwIGRpcmVjdCBpZiBmbGV4IGdhcCBzdXBwb3J0XG4gICAgdmFyIF9ndXR0ZXJzID0gX3NsaWNlZFRvQXJyYXkoZ3V0dGVycywgMik7XG4gICAgcm93U3R5bGUucm93R2FwID0gX2d1dHRlcnNbMV07XG4gIH0gZWxzZSBpZiAodmVydGljYWxHdXR0ZXIpIHtcbiAgICByb3dTdHlsZS5tYXJnaW5Ub3AgPSB2ZXJ0aWNhbEd1dHRlcjtcbiAgICByb3dTdHlsZS5tYXJnaW5Cb3R0b20gPSB2ZXJ0aWNhbEd1dHRlcjtcbiAgfVxuICAvLyBcImd1dHRlcnNcIiBpcyBhIG5ldyBhcnJheSBpbiBlYWNoIHJlbmRlcmluZyBwaGFzZSwgaXQnbGwgbWFrZSAnUmVhY3QudXNlTWVtbycgZWZmZWN0bGVzcy5cbiAgLy8gU28gd2UgZGVjb25zdHJ1Y3QgXCJndXR0ZXJzXCIgdmFyaWFibGUgaGVyZS5cbiAgdmFyIF9ndXR0ZXJzMiA9IF9zbGljZWRUb0FycmF5KGd1dHRlcnMsIDIpLFxuICAgIGd1dHRlckggPSBfZ3V0dGVyczJbMF0sXG4gICAgZ3V0dGVyViA9IF9ndXR0ZXJzMlsxXTtcbiAgdmFyIHJvd0NvbnRleHQgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZ3V0dGVyOiBbZ3V0dGVySCwgZ3V0dGVyVl0sXG4gICAgICB3cmFwOiB3cmFwLFxuICAgICAgc3VwcG9ydEZsZXhHYXA6IHN1cHBvcnRGbGV4R2FwXG4gICAgfTtcbiAgfSwgW2d1dHRlckgsIGd1dHRlclYsIHdyYXAsIHN1cHBvcnRGbGV4R2FwXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSb3dDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IHJvd0NvbnRleHRcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe30sIG90aGVycywge1xuICAgIGNsYXNzTmFtZTogY2xhc3NlcyxcbiAgICBzdHlsZTogX2V4dGVuZHMoX2V4dGVuZHMoe30sIHJvd1N0eWxlKSwgc3R5bGUpLFxuICAgIHJlZjogcmVmXG4gIH0pLCBjaGlsZHJlbikpO1xufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSb3cuZGlzcGxheU5hbWUgPSAnUm93Jztcbn1cbmV4cG9ydCBkZWZhdWx0IFJvdzsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVyc2NvcmUtZGFuZ2xlICovXG5cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L3Byb3AtdHlwZXMgKi9cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xudmFyIFBhbmVsQ29udGVudCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBfY2xhc3NuYW1lcztcblxuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgZm9yY2VSZW5kZXIgPSBwcm9wcy5mb3JjZVJlbmRlcixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgaXNBY3RpdmUgPSBwcm9wcy5pc0FjdGl2ZSxcbiAgICAgIHJvbGUgPSBwcm9wcy5yb2xlO1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShpc0FjdGl2ZSB8fCBmb3JjZVJlbmRlciksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICAgIHJlbmRlcmVkID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICAgIHNldFJlbmRlcmVkID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChmb3JjZVJlbmRlciB8fCBpc0FjdGl2ZSkge1xuICAgICAgc2V0UmVuZGVyZWQodHJ1ZSk7XG4gICAgfVxuICB9LCBbZm9yY2VSZW5kZXIsIGlzQWN0aXZlXSk7XG5cbiAgaWYgKCFyZW5kZXJlZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICByZWY6IHJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50XCIpLCAoX2NsYXNzbmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc25hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbnRlbnQtYWN0aXZlXCIpLCBpc0FjdGl2ZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NuYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50LWluYWN0aXZlXCIpLCAhaXNBY3RpdmUpLCBfY2xhc3NuYW1lcyksIGNsYXNzTmFtZSksXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIHJvbGU6IHJvbGVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50LWJveFwiKVxuICB9LCBjaGlsZHJlbikpO1xufSk7XG5QYW5lbENvbnRlbnQuZGlzcGxheU5hbWUgPSAnUGFuZWxDb250ZW50JztcbmV4cG9ydCBkZWZhdWx0IFBhbmVsQ29udGVudDsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c1wiO1xuaW1wb3J0IF9jcmVhdGVTdXBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlU3VwZXJcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJjbGFzc05hbWVcIiwgXCJpZFwiLCBcInN0eWxlXCIsIFwicHJlZml4Q2xzXCIsIFwiaGVhZGVyQ2xhc3NcIiwgXCJjaGlsZHJlblwiLCBcImlzQWN0aXZlXCIsIFwiZGVzdHJveUluYWN0aXZlUGFuZWxcIiwgXCJhY2NvcmRpb25cIiwgXCJmb3JjZVJlbmRlclwiLCBcIm9wZW5Nb3Rpb25cIiwgXCJleHRyYVwiLCBcImNvbGxhcHNpYmxlXCJdO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9wcm9wLXR5cGVzICovXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBDU1NNb3Rpb24gZnJvbSAncmMtbW90aW9uJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBzaGFsbG93RXF1YWwgZnJvbSAnc2hhbGxvd2VxdWFsJztcbmltcG9ydCBQYW5lbENvbnRlbnQgZnJvbSAnLi9QYW5lbENvbnRlbnQnO1xuXG52YXIgQ29sbGFwc2VQYW5lbCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoQ29sbGFwc2VQYW5lbCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihDb2xsYXBzZVBhbmVsKTtcblxuICBmdW5jdGlvbiBDb2xsYXBzZVBhbmVsKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb2xsYXBzZVBhbmVsKTtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsLmFwcGx5KF9zdXBlciwgW3RoaXNdLmNvbmNhdChhcmdzKSk7XG5cbiAgICBfdGhpcy5vbkl0ZW1DbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIG9uSXRlbUNsaWNrID0gX3RoaXMkcHJvcHMub25JdGVtQ2xpY2ssXG4gICAgICAgICAgcGFuZWxLZXkgPSBfdGhpcyRwcm9wcy5wYW5lbEtleTtcblxuICAgICAgaWYgKHR5cGVvZiBvbkl0ZW1DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvbkl0ZW1DbGljayhwYW5lbEtleSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUtleVByZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyB8fCBlLmtleUNvZGUgPT09IDEzIHx8IGUud2hpY2ggPT09IDEzKSB7XG4gICAgICAgIF90aGlzLm9uSXRlbUNsaWNrKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLnJlbmRlckljb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgc2hvd0Fycm93ID0gX3RoaXMkcHJvcHMyLnNob3dBcnJvdyxcbiAgICAgICAgICBleHBhbmRJY29uID0gX3RoaXMkcHJvcHMyLmV4cGFuZEljb24sXG4gICAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkcHJvcHMyLnByZWZpeENscyxcbiAgICAgICAgICBjb2xsYXBzaWJsZSA9IF90aGlzJHByb3BzMi5jb2xsYXBzaWJsZTtcblxuICAgICAgaWYgKCFzaG93QXJyb3cpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciBpY29uTm9kZSA9IHR5cGVvZiBleHBhbmRJY29uID09PSAnZnVuY3Rpb24nID8gZXhwYW5kSWNvbihfdGhpcy5wcm9wcykgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImlcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiYXJyb3dcIlxuICAgICAgfSk7XG4gICAgICByZXR1cm4gaWNvbk5vZGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZXhwYW5kLWljb25cIiksXG4gICAgICAgIG9uQ2xpY2s6IGNvbGxhcHNpYmxlID09PSAnaGVhZGVyJyB8fCBjb2xsYXBzaWJsZSA9PT0gJ2ljb24nID8gX3RoaXMub25JdGVtQ2xpY2sgOiBudWxsXG4gICAgICB9LCBpY29uTm9kZSk7XG4gICAgfTtcblxuICAgIF90aGlzLnJlbmRlclRpdGxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGhlYWRlciA9IF90aGlzJHByb3BzMy5oZWFkZXIsXG4gICAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkcHJvcHMzLnByZWZpeENscyxcbiAgICAgICAgICBjb2xsYXBzaWJsZSA9IF90aGlzJHByb3BzMy5jb2xsYXBzaWJsZTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGVhZGVyLXRleHRcIiksXG4gICAgICAgIG9uQ2xpY2s6IGNvbGxhcHNpYmxlID09PSAnaGVhZGVyJyA/IF90aGlzLm9uSXRlbUNsaWNrIDogbnVsbFxuICAgICAgfSwgaGVhZGVyKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKENvbGxhcHNlUGFuZWwsIFt7XG4gICAga2V5OiBcInNob3VsZENvbXBvbmVudFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzKSB7XG4gICAgICByZXR1cm4gIXNoYWxsb3dFcXVhbCh0aGlzLnByb3BzLCBuZXh0UHJvcHMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF9jbGFzc05hbWVzLCBfY2xhc3NOYW1lczI7XG5cbiAgICAgIHZhciBfdGhpcyRwcm9wczQgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzNC5jbGFzc05hbWUsXG4gICAgICAgICAgaWQgPSBfdGhpcyRwcm9wczQuaWQsXG4gICAgICAgICAgc3R5bGUgPSBfdGhpcyRwcm9wczQuc3R5bGUsXG4gICAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkcHJvcHM0LnByZWZpeENscyxcbiAgICAgICAgICBoZWFkZXJDbGFzcyA9IF90aGlzJHByb3BzNC5oZWFkZXJDbGFzcyxcbiAgICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzNC5jaGlsZHJlbixcbiAgICAgICAgICBpc0FjdGl2ZSA9IF90aGlzJHByb3BzNC5pc0FjdGl2ZSxcbiAgICAgICAgICBkZXN0cm95SW5hY3RpdmVQYW5lbCA9IF90aGlzJHByb3BzNC5kZXN0cm95SW5hY3RpdmVQYW5lbCxcbiAgICAgICAgICBhY2NvcmRpb24gPSBfdGhpcyRwcm9wczQuYWNjb3JkaW9uLFxuICAgICAgICAgIGZvcmNlUmVuZGVyID0gX3RoaXMkcHJvcHM0LmZvcmNlUmVuZGVyLFxuICAgICAgICAgIG9wZW5Nb3Rpb24gPSBfdGhpcyRwcm9wczQub3Blbk1vdGlvbixcbiAgICAgICAgICBleHRyYSA9IF90aGlzJHByb3BzNC5leHRyYSxcbiAgICAgICAgICBjb2xsYXBzaWJsZSA9IF90aGlzJHByb3BzNC5jb2xsYXBzaWJsZSxcbiAgICAgICAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF90aGlzJHByb3BzNCwgX2V4Y2x1ZGVkKTtcblxuICAgICAgdmFyIGRpc2FibGVkID0gY29sbGFwc2libGUgPT09ICdkaXNhYmxlZCc7XG4gICAgICB2YXIgY29sbGFwc2libGVIZWFkZXIgPSBjb2xsYXBzaWJsZSA9PT0gJ2hlYWRlcic7XG4gICAgICB2YXIgY29sbGFwc2libGVJY29uID0gY29sbGFwc2libGUgPT09ICdpY29uJztcbiAgICAgIHZhciBpdGVtQ2xzID0gY2xhc3NOYW1lcygoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW1cIiksIHRydWUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1hY3RpdmVcIiksIGlzQWN0aXZlKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tZGlzYWJsZWRcIiksIGRpc2FibGVkKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuICAgICAgdmFyIGhlYWRlckNscyA9IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oZWFkZXJcIiksIChfY2xhc3NOYW1lczIgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgaGVhZGVyQ2xhc3MsIGhlYWRlckNsYXNzKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oZWFkZXItY29sbGFwc2libGUtb25seVwiKSwgY29sbGFwc2libGVIZWFkZXIpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWljb24tY29sbGFwc2libGUtb25seVwiKSwgY29sbGFwc2libGVJY29uKSwgX2NsYXNzTmFtZXMyKSk7XG4gICAgICAvKiogaGVhZGVyIOiKgueCueWxnuaApyAqL1xuXG4gICAgICB2YXIgaGVhZGVyUHJvcHMgPSB7XG4gICAgICAgIGNsYXNzTmFtZTogaGVhZGVyQ2xzLFxuICAgICAgICAnYXJpYS1leHBhbmRlZCc6IGlzQWN0aXZlLFxuICAgICAgICAnYXJpYS1kaXNhYmxlZCc6IGRpc2FibGVkLFxuICAgICAgICBvbktleVByZXNzOiB0aGlzLmhhbmRsZUtleVByZXNzXG4gICAgICB9O1xuXG4gICAgICBpZiAoIWNvbGxhcHNpYmxlSGVhZGVyICYmICFjb2xsYXBzaWJsZUljb24pIHtcbiAgICAgICAgaGVhZGVyUHJvcHMub25DbGljayA9IHRoaXMub25JdGVtQ2xpY2s7XG4gICAgICAgIGhlYWRlclByb3BzLnJvbGUgPSBhY2NvcmRpb24gPyAndGFiJyA6ICdidXR0b24nO1xuICAgICAgICBoZWFkZXJQcm9wcy50YWJJbmRleCA9IGRpc2FibGVkID8gLTEgOiAwO1xuICAgICAgfVxuXG4gICAgICB2YXIgaWZFeHRyYUV4aXN0ID0gZXh0cmEgIT09IG51bGwgJiYgZXh0cmEgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZXh0cmEgIT09ICdib29sZWFuJzsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9wdWxsLzM3NDE5I2lzc3VlY29tbWVudC0xMjM4ODEyNzk3XG5cbiAgICAgIGRlbGV0ZSByZXN0LmhlYWRlcjtcbiAgICAgIGRlbGV0ZSByZXN0LnBhbmVsS2V5O1xuICAgICAgZGVsZXRlIHJlc3Qub25JdGVtQ2xpY2s7XG4gICAgICBkZWxldGUgcmVzdC5zaG93QXJyb3c7XG4gICAgICBkZWxldGUgcmVzdC5leHBhbmRJY29uO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgICAgIGNsYXNzTmFtZTogaXRlbUNscyxcbiAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICBpZDogaWRcbiAgICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBoZWFkZXJQcm9wcywgdGhpcy5yZW5kZXJJY29uKCksIHRoaXMucmVuZGVyVGl0bGUoKSwgaWZFeHRyYUV4aXN0ICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWV4dHJhXCIpXG4gICAgICB9LCBleHRyYSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDU1NNb3Rpb24sIF9leHRlbmRzKHtcbiAgICAgICAgdmlzaWJsZTogaXNBY3RpdmUsXG4gICAgICAgIGxlYXZlZENsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50LWhpZGRlblwiKVxuICAgICAgfSwgb3Blbk1vdGlvbiwge1xuICAgICAgICBmb3JjZVJlbmRlcjogZm9yY2VSZW5kZXIsXG4gICAgICAgIHJlbW92ZU9uTGVhdmU6IGRlc3Ryb3lJbmFjdGl2ZVBhbmVsXG4gICAgICB9KSwgZnVuY3Rpb24gKF9yZWYsIHJlZikge1xuICAgICAgICB2YXIgbW90aW9uQ2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgICAgICAgICBtb3Rpb25TdHlsZSA9IF9yZWYuc3R5bGU7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQYW5lbENvbnRlbnQsIHtcbiAgICAgICAgICByZWY6IHJlZixcbiAgICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgICBjbGFzc05hbWU6IG1vdGlvbkNsYXNzTmFtZSxcbiAgICAgICAgICBzdHlsZTogbW90aW9uU3R5bGUsXG4gICAgICAgICAgaXNBY3RpdmU6IGlzQWN0aXZlLFxuICAgICAgICAgIGZvcmNlUmVuZGVyOiBmb3JjZVJlbmRlcixcbiAgICAgICAgICByb2xlOiBhY2NvcmRpb24gPyAndGFicGFuZWwnIDogbnVsbFxuICAgICAgICB9LCBjaGlsZHJlbik7XG4gICAgICB9KSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIENvbGxhcHNlUGFuZWw7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbkNvbGxhcHNlUGFuZWwuZGVmYXVsdFByb3BzID0ge1xuICBzaG93QXJyb3c6IHRydWUsXG4gIGlzQWN0aXZlOiBmYWxzZSxcbiAgb25JdGVtQ2xpY2s6IGZ1bmN0aW9uIG9uSXRlbUNsaWNrKCkge30sXG4gIGhlYWRlckNsYXNzOiAnJyxcbiAgZm9yY2VSZW5kZXI6IGZhbHNlXG59O1xuZXhwb3J0IGRlZmF1bHQgQ29sbGFwc2VQYW5lbDsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNcIjtcbmltcG9ydCBfY3JlYXRlU3VwZXIgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZVN1cGVyXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L3Byb3AtdHlwZXMgKi9cbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHRvQXJyYXkgZnJvbSBcInJjLXV0aWwvZXMvQ2hpbGRyZW4vdG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHNoYWxsb3dFcXVhbCBmcm9tICdzaGFsbG93ZXF1YWwnO1xuaW1wb3J0IENvbGxhcHNlUGFuZWwgZnJvbSAnLi9QYW5lbCc7XG5cbmZ1bmN0aW9uIGdldEFjdGl2ZUtleXNBcnJheShhY3RpdmVLZXkpIHtcbiAgdmFyIGN1cnJlbnRBY3RpdmVLZXkgPSBhY3RpdmVLZXk7XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGN1cnJlbnRBY3RpdmVLZXkpKSB7XG4gICAgdmFyIGFjdGl2ZUtleVR5cGUgPSBfdHlwZW9mKGN1cnJlbnRBY3RpdmVLZXkpO1xuXG4gICAgY3VycmVudEFjdGl2ZUtleSA9IGFjdGl2ZUtleVR5cGUgPT09ICdudW1iZXInIHx8IGFjdGl2ZUtleVR5cGUgPT09ICdzdHJpbmcnID8gW2N1cnJlbnRBY3RpdmVLZXldIDogW107XG4gIH1cblxuICByZXR1cm4gY3VycmVudEFjdGl2ZUtleS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBTdHJpbmcoa2V5KTtcbiAgfSk7XG59XG5cbnZhciBDb2xsYXBzZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoQ29sbGFwc2UsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoQ29sbGFwc2UpO1xuXG4gIGZ1bmN0aW9uIENvbGxhcHNlKF9wcm9wcykge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb2xsYXBzZSk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIF9wcm9wcyk7XG5cbiAgICBfdGhpcy5vbkNsaWNrSXRlbSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBhY3RpdmVLZXkgPSBfdGhpcy5zdGF0ZS5hY3RpdmVLZXk7XG5cbiAgICAgIGlmIChfdGhpcy5wcm9wcy5hY2NvcmRpb24pIHtcbiAgICAgICAgYWN0aXZlS2V5ID0gYWN0aXZlS2V5WzBdID09PSBrZXkgPyBbXSA6IFtrZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aXZlS2V5ID0gX3RvQ29uc3VtYWJsZUFycmF5KGFjdGl2ZUtleSk7XG4gICAgICAgIHZhciBpbmRleCA9IGFjdGl2ZUtleS5pbmRleE9mKGtleSk7XG4gICAgICAgIHZhciBpc0FjdGl2ZSA9IGluZGV4ID4gLTE7XG5cbiAgICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgICAgLy8gcmVtb3ZlIGFjdGl2ZSBzdGF0ZVxuICAgICAgICAgIGFjdGl2ZUtleS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFjdGl2ZUtleS5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgX3RoaXMuc2V0QWN0aXZlS2V5KGFjdGl2ZUtleSk7XG4gICAgfTtcblxuICAgIF90aGlzLmdldE5ld0NoaWxkID0gZnVuY3Rpb24gKGNoaWxkLCBpbmRleCkge1xuICAgICAgaWYgKCFjaGlsZCkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgYWN0aXZlS2V5ID0gX3RoaXMuc3RhdGUuYWN0aXZlS2V5O1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkcHJvcHMucHJlZml4Q2xzLFxuICAgICAgICAgIG9wZW5Nb3Rpb24gPSBfdGhpcyRwcm9wcy5vcGVuTW90aW9uLFxuICAgICAgICAgIGFjY29yZGlvbiA9IF90aGlzJHByb3BzLmFjY29yZGlvbixcbiAgICAgICAgICByb290RGVzdHJveUluYWN0aXZlUGFuZWwgPSBfdGhpcyRwcm9wcy5kZXN0cm95SW5hY3RpdmVQYW5lbCxcbiAgICAgICAgICBleHBhbmRJY29uID0gX3RoaXMkcHJvcHMuZXhwYW5kSWNvbixcbiAgICAgICAgICBjb2xsYXBzaWJsZSA9IF90aGlzJHByb3BzLmNvbGxhcHNpYmxlOyAvLyBJZiB0aGVyZSBpcyBubyBrZXkgcHJvdmlkZSwgdXNlIHRoZSBwYW5lbCBvcmRlciBhcyBkZWZhdWx0IGtleVxuXG4gICAgICB2YXIga2V5ID0gY2hpbGQua2V5IHx8IFN0cmluZyhpbmRleCk7XG4gICAgICB2YXIgX2NoaWxkJHByb3BzID0gY2hpbGQucHJvcHMsXG4gICAgICAgICAgaGVhZGVyID0gX2NoaWxkJHByb3BzLmhlYWRlcixcbiAgICAgICAgICBoZWFkZXJDbGFzcyA9IF9jaGlsZCRwcm9wcy5oZWFkZXJDbGFzcyxcbiAgICAgICAgICBkZXN0cm95SW5hY3RpdmVQYW5lbCA9IF9jaGlsZCRwcm9wcy5kZXN0cm95SW5hY3RpdmVQYW5lbCxcbiAgICAgICAgICBjaGlsZENvbGxhcHNpYmxlID0gX2NoaWxkJHByb3BzLmNvbGxhcHNpYmxlO1xuICAgICAgdmFyIGlzQWN0aXZlID0gZmFsc2U7XG5cbiAgICAgIGlmIChhY2NvcmRpb24pIHtcbiAgICAgICAgaXNBY3RpdmUgPSBhY3RpdmVLZXlbMF0gPT09IGtleTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzQWN0aXZlID0gYWN0aXZlS2V5LmluZGV4T2Yoa2V5KSA+IC0xO1xuICAgICAgfVxuXG4gICAgICB2YXIgbWVyZ2VDb2xsYXBzaWJsZSA9IGNoaWxkQ29sbGFwc2libGUgIT09IG51bGwgJiYgY2hpbGRDb2xsYXBzaWJsZSAhPT0gdm9pZCAwID8gY2hpbGRDb2xsYXBzaWJsZSA6IGNvbGxhcHNpYmxlO1xuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgcGFuZWxLZXk6IGtleSxcbiAgICAgICAgaGVhZGVyOiBoZWFkZXIsXG4gICAgICAgIGhlYWRlckNsYXNzOiBoZWFkZXJDbGFzcyxcbiAgICAgICAgaXNBY3RpdmU6IGlzQWN0aXZlLFxuICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgZGVzdHJveUluYWN0aXZlUGFuZWw6IGRlc3Ryb3lJbmFjdGl2ZVBhbmVsICE9PSBudWxsICYmIGRlc3Ryb3lJbmFjdGl2ZVBhbmVsICE9PSB2b2lkIDAgPyBkZXN0cm95SW5hY3RpdmVQYW5lbCA6IHJvb3REZXN0cm95SW5hY3RpdmVQYW5lbCxcbiAgICAgICAgb3Blbk1vdGlvbjogb3Blbk1vdGlvbixcbiAgICAgICAgYWNjb3JkaW9uOiBhY2NvcmRpb24sXG4gICAgICAgIGNoaWxkcmVuOiBjaGlsZC5wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgb25JdGVtQ2xpY2s6IG1lcmdlQ29sbGFwc2libGUgPT09ICdkaXNhYmxlZCcgPyBudWxsIDogX3RoaXMub25DbGlja0l0ZW0sXG4gICAgICAgIGV4cGFuZEljb246IGV4cGFuZEljb24sXG4gICAgICAgIGNvbGxhcHNpYmxlOiBtZXJnZUNvbGxhcHNpYmxlXG4gICAgICB9OyAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8yMDQ3OVxuXG4gICAgICBpZiAodHlwZW9mIGNoaWxkLnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cblxuICAgICAgT2JqZWN0LmtleXMocHJvcHMpLmZvckVhY2goZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcHNbcHJvcE5hbWVdID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGRlbGV0ZSBwcm9wc1twcm9wTmFtZV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGQsIHByb3BzKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuZ2V0SXRlbXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgY2hpbGRyZW4gPSBfdGhpcy5wcm9wcy5jaGlsZHJlbjtcbiAgICAgIHJldHVybiB0b0FycmF5KGNoaWxkcmVuKS5tYXAoX3RoaXMuZ2V0TmV3Q2hpbGQpO1xuICAgIH07XG5cbiAgICBfdGhpcy5zZXRBY3RpdmVLZXkgPSBmdW5jdGlvbiAoYWN0aXZlS2V5KSB7XG4gICAgICBpZiAoISgnYWN0aXZlS2V5JyBpbiBfdGhpcy5wcm9wcykpIHtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGFjdGl2ZUtleTogYWN0aXZlS2V5XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5wcm9wcy5vbkNoYW5nZShfdGhpcy5wcm9wcy5hY2NvcmRpb24gPyBhY3RpdmVLZXlbMF0gOiBhY3RpdmVLZXkpO1xuICAgIH07XG5cbiAgICB2YXIgX2FjdGl2ZUtleSA9IF9wcm9wcy5hY3RpdmVLZXksXG4gICAgICAgIGRlZmF1bHRBY3RpdmVLZXkgPSBfcHJvcHMuZGVmYXVsdEFjdGl2ZUtleTtcbiAgICB2YXIgY3VycmVudEFjdGl2ZUtleSA9IGRlZmF1bHRBY3RpdmVLZXk7XG5cbiAgICBpZiAoJ2FjdGl2ZUtleScgaW4gX3Byb3BzKSB7XG4gICAgICBjdXJyZW50QWN0aXZlS2V5ID0gX2FjdGl2ZUtleTtcbiAgICB9XG5cbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGFjdGl2ZUtleTogZ2V0QWN0aXZlS2V5c0FycmF5KGN1cnJlbnRBY3RpdmVLZXkpXG4gICAgfTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQ29sbGFwc2UsIFt7XG4gICAga2V5OiBcInNob3VsZENvbXBvbmVudFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzLCBuZXh0U3RhdGUpIHtcbiAgICAgIHJldHVybiAhc2hhbGxvd0VxdWFsKHRoaXMucHJvcHMsIG5leHRQcm9wcykgfHwgIXNoYWxsb3dFcXVhbCh0aGlzLnN0YXRlLCBuZXh0U3RhdGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF9jbGFzc05hbWVzO1xuXG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wczIucHJlZml4Q2xzLFxuICAgICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzMi5jbGFzc05hbWUsXG4gICAgICAgICAgc3R5bGUgPSBfdGhpcyRwcm9wczIuc3R5bGUsXG4gICAgICAgICAgYWNjb3JkaW9uID0gX3RoaXMkcHJvcHMyLmFjY29yZGlvbjtcbiAgICAgIHZhciBjb2xsYXBzZUNsYXNzTmFtZSA9IGNsYXNzTmFtZXMoKF9jbGFzc05hbWVzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgcHJlZml4Q2xzLCB0cnVlKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBjbGFzc05hbWUsICEhY2xhc3NOYW1lKSwgX2NsYXNzTmFtZXMpKTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogY29sbGFwc2VDbGFzc05hbWUsXG4gICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgcm9sZTogYWNjb3JkaW9uID8gJ3RhYmxpc3QnIDogbnVsbFxuICAgICAgfSwgdGhpcy5nZXRJdGVtcygpKTtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKG5leHRQcm9wcykge1xuICAgICAgdmFyIG5ld1N0YXRlID0ge307XG5cbiAgICAgIGlmICgnYWN0aXZlS2V5JyBpbiBuZXh0UHJvcHMpIHtcbiAgICAgICAgbmV3U3RhdGUuYWN0aXZlS2V5ID0gZ2V0QWN0aXZlS2V5c0FycmF5KG5leHRQcm9wcy5hY3RpdmVLZXkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3U3RhdGU7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIENvbGxhcHNlO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5Db2xsYXBzZS5kZWZhdWx0UHJvcHMgPSB7XG4gIHByZWZpeENsczogJ3JjLWNvbGxhcHNlJyxcbiAgb25DaGFuZ2U6IGZ1bmN0aW9uIG9uQ2hhbmdlKCkge30sXG4gIGFjY29yZGlvbjogZmFsc2UsXG4gIGRlc3Ryb3lJbmFjdGl2ZVBhbmVsOiBmYWxzZVxufTtcbkNvbGxhcHNlLlBhbmVsID0gQ29sbGFwc2VQYW5lbDtcbmV4cG9ydCBkZWZhdWx0IENvbGxhcHNlOyIsImltcG9ydCBDb2xsYXBzZSBmcm9tICcuL0NvbGxhcHNlJztcbmV4cG9ydCBkZWZhdWx0IENvbGxhcHNlO1xudmFyIFBhbmVsID0gQ29sbGFwc2UuUGFuZWw7XG5leHBvcnQgeyBQYW5lbCB9OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJjQ29sbGFwc2UgZnJvbSAncmMtY29sbGFwc2UnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgd2FybmluZyBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbnZhciBDb2xsYXBzZVBhbmVsID0gZnVuY3Rpb24gQ29sbGFwc2VQYW5lbChwcm9wcykge1xuICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCEoJ2Rpc2FibGVkJyBpbiBwcm9wcyksICdDb2xsYXBzZS5QYW5lbCcsICdgZGlzYWJsZWRgIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgYGNvbGxhcHNpYmxlPVwiZGlzYWJsZWRcImAgaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHM7XG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgX3Byb3BzJGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBjbGFzc05hbWUgPSBfcHJvcHMkY2xhc3NOYW1lID09PSB2b2lkIDAgPyAnJyA6IF9wcm9wcyRjbGFzc05hbWUsXG4gICAgX3Byb3BzJHNob3dBcnJvdyA9IHByb3BzLnNob3dBcnJvdyxcbiAgICBzaG93QXJyb3cgPSBfcHJvcHMkc2hvd0Fycm93ID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJHNob3dBcnJvdztcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnY29sbGFwc2UnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgY29sbGFwc2VQYW5lbENsYXNzTmFtZSA9IGNsYXNzTmFtZXMoX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW5vLWFycm93XCIpLCAhc2hvd0Fycm93KSwgY2xhc3NOYW1lKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJjQ29sbGFwc2UuUGFuZWwsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZTogY29sbGFwc2VQYW5lbENsYXNzTmFtZVxuICB9KSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgQ29sbGFwc2VQYW5lbDsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgUmlnaHRPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvUmlnaHRPdXRsaW5lZFwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUmNDb2xsYXBzZSBmcm9tICdyYy1jb2xsYXBzZSc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdG9BcnJheSBmcm9tIFwicmMtdXRpbC9lcy9DaGlsZHJlbi90b0FycmF5XCI7XG5pbXBvcnQgb21pdCBmcm9tIFwicmMtdXRpbC9lcy9vbWl0XCI7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCBjb2xsYXBzZU1vdGlvbiBmcm9tICcuLi9fdXRpbC9tb3Rpb24nO1xuaW1wb3J0IHsgY2xvbmVFbGVtZW50IH0gZnJvbSAnLi4vX3V0aWwvcmVhY3ROb2RlJztcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4uL191dGlsL3dhcm5pbmcnO1xuaW1wb3J0IENvbGxhcHNlUGFuZWwgZnJvbSAnLi9Db2xsYXBzZVBhbmVsJztcbnZhciBDb2xsYXBzZSA9IGZ1bmN0aW9uIENvbGxhcHNlKHByb3BzKSB7XG4gIHZhciBfY2xhc3NOYW1lcztcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIF9wcm9wcyRjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgY2xhc3NOYW1lID0gX3Byb3BzJGNsYXNzTmFtZSA9PT0gdm9pZCAwID8gJycgOiBfcHJvcHMkY2xhc3NOYW1lLFxuICAgIF9wcm9wcyRib3JkZXJlZCA9IHByb3BzLmJvcmRlcmVkLFxuICAgIGJvcmRlcmVkID0gX3Byb3BzJGJvcmRlcmVkID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJGJvcmRlcmVkLFxuICAgIGdob3N0ID0gcHJvcHMuZ2hvc3QsXG4gICAgX3Byb3BzJGV4cGFuZEljb25Qb3NpID0gcHJvcHMuZXhwYW5kSWNvblBvc2l0aW9uLFxuICAgIGV4cGFuZEljb25Qb3NpdGlvbiA9IF9wcm9wcyRleHBhbmRJY29uUG9zaSA9PT0gdm9pZCAwID8gJ3N0YXJ0JyA6IF9wcm9wcyRleHBhbmRJY29uUG9zaTtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnY29sbGFwc2UnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAvLyBXYXJuaW5nIGlmIHVzZSBsZWdhY3kgdHlwZSBgZXhwYW5kSWNvblBvc2l0aW9uYFxuICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGV4cGFuZEljb25Qb3NpdGlvbiAhPT0gJ2xlZnQnICYmIGV4cGFuZEljb25Qb3NpdGlvbiAhPT0gJ3JpZ2h0JywgJ0NvbGxhcHNlJywgJ2BleHBhbmRJY29uUG9zaXRpb25gIHdpdGggYGxlZnRgIG9yIGByaWdodGAgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBgc3RhcnRgIG9yIGBlbmRgIGluc3RlYWQuJykgOiB2b2lkIDA7XG4gIC8vIEFsaWduIHdpdGggbG9naWMgcG9zaXRpb25cbiAgdmFyIG1lcmdlZEV4cGFuZEljb25Qb3NpdGlvbiA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmIChleHBhbmRJY29uUG9zaXRpb24gPT09ICdsZWZ0Jykge1xuICAgICAgcmV0dXJuICdzdGFydCc7XG4gICAgfVxuICAgIHJldHVybiBleHBhbmRJY29uUG9zaXRpb24gPT09ICdyaWdodCcgPyAnZW5kJyA6IGV4cGFuZEljb25Qb3NpdGlvbjtcbiAgfSwgW2V4cGFuZEljb25Qb3NpdGlvbl0pO1xuICB2YXIgcmVuZGVyRXhwYW5kSWNvbiA9IGZ1bmN0aW9uIHJlbmRlckV4cGFuZEljb24oKSB7XG4gICAgdmFyIHBhbmVsUHJvcHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIHZhciBleHBhbmRJY29uID0gcHJvcHMuZXhwYW5kSWNvbjtcbiAgICB2YXIgaWNvbiA9IGV4cGFuZEljb24gPyBleHBhbmRJY29uKHBhbmVsUHJvcHMpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmlnaHRPdXRsaW5lZCwge1xuICAgICAgcm90YXRlOiBwYW5lbFByb3BzLmlzQWN0aXZlID8gOTAgOiB1bmRlZmluZWRcbiAgICB9KTtcbiAgICByZXR1cm4gY2xvbmVFbGVtZW50KGljb24sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhpY29uLnByb3BzLmNsYXNzTmFtZSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hcnJvd1wiKSlcbiAgICAgIH07XG4gICAgfSk7XG4gIH07XG4gIHZhciBjb2xsYXBzZUNsYXNzTmFtZSA9IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pY29uLXBvc2l0aW9uLVwiKS5jb25jYXQobWVyZ2VkRXhwYW5kSWNvblBvc2l0aW9uKSwgKF9jbGFzc05hbWVzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ib3JkZXJsZXNzXCIpLCAhYm9yZGVyZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWdob3N0XCIpLCAhIWdob3N0KSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuICB2YXIgb3Blbk1vdGlvbiA9IF9leHRlbmRzKF9leHRlbmRzKHt9LCBjb2xsYXBzZU1vdGlvbiksIHtcbiAgICBtb3Rpb25BcHBlYXI6IGZhbHNlLFxuICAgIGxlYXZlZENsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50LWhpZGRlblwiKVxuICB9KTtcbiAgdmFyIGdldEl0ZW1zID0gZnVuY3Rpb24gZ2V0SXRlbXMoKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW47XG4gICAgcmV0dXJuIHRvQXJyYXkoY2hpbGRyZW4pLm1hcChmdW5jdGlvbiAoY2hpbGQsIGluZGV4KSB7XG4gICAgICB2YXIgX2E7XG4gICAgICBpZiAoKF9hID0gY2hpbGQucHJvcHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kaXNhYmxlZCkge1xuICAgICAgICB2YXIga2V5ID0gY2hpbGQua2V5IHx8IFN0cmluZyhpbmRleCk7XG4gICAgICAgIHZhciBfY2hpbGQkcHJvcHMgPSBjaGlsZC5wcm9wcyxcbiAgICAgICAgICBkaXNhYmxlZCA9IF9jaGlsZCRwcm9wcy5kaXNhYmxlZCxcbiAgICAgICAgICBjb2xsYXBzaWJsZSA9IF9jaGlsZCRwcm9wcy5jb2xsYXBzaWJsZTtcbiAgICAgICAgdmFyIGNoaWxkUHJvcHMgPSBfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgb21pdChjaGlsZC5wcm9wcywgWydkaXNhYmxlZCddKSksIHtcbiAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICBjb2xsYXBzaWJsZTogY29sbGFwc2libGUgIT09IG51bGwgJiYgY29sbGFwc2libGUgIT09IHZvaWQgMCA/IGNvbGxhcHNpYmxlIDogZGlzYWJsZWQgPyAnZGlzYWJsZWQnIDogdW5kZWZpbmVkXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY2xvbmVFbGVtZW50KGNoaWxkLCBjaGlsZFByb3BzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9KTtcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJjQ29sbGFwc2UsIF9leHRlbmRzKHtcbiAgICBvcGVuTW90aW9uOiBvcGVuTW90aW9uXG4gIH0sIHByb3BzLCB7XG4gICAgZXhwYW5kSWNvbjogcmVuZGVyRXhwYW5kSWNvbixcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBjbGFzc05hbWU6IGNvbGxhcHNlQ2xhc3NOYW1lXG4gIH0pLCBnZXRJdGVtcygpKTtcbn07XG5Db2xsYXBzZS5QYW5lbCA9IENvbGxhcHNlUGFuZWw7XG5leHBvcnQgZGVmYXVsdCBDb2xsYXBzZTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBCdXR0b24gZnJvbSAnLi4vYnV0dG9uJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFBpY2tlckJ1dHRvbihwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQnV0dG9uLCBfZXh0ZW5kcyh7XG4gICAgc2l6ZTogXCJzbWFsbFwiLFxuICAgIHR5cGU6IFwicHJpbWFyeVwiXG4gIH0sIHByb3BzKSk7XG59IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG52YXIgQ2hlY2thYmxlVGFnID0gZnVuY3Rpb24gQ2hlY2thYmxlVGFnKF9hKSB7XG4gIHZhciBfY2xhc3NOYW1lcztcbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IF9hLnByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBfYS5jbGFzc05hbWUsXG4gICAgY2hlY2tlZCA9IF9hLmNoZWNrZWQsXG4gICAgb25DaGFuZ2UgPSBfYS5vbkNoYW5nZSxcbiAgICBvbkNsaWNrID0gX2Eub25DbGljayxcbiAgICByZXN0UHJvcHMgPSBfX3Jlc3QoX2EsIFtcInByZWZpeENsc1wiLCBcImNsYXNzTmFtZVwiLCBcImNoZWNrZWRcIiwgXCJvbkNoYW5nZVwiLCBcIm9uQ2xpY2tcIl0pO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscztcbiAgdmFyIGhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZSkge1xuICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZSghY2hlY2tlZCk7XG4gICAgb25DbGljayA9PT0gbnVsbCB8fCBvbkNsaWNrID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNsaWNrKGUpO1xuICB9O1xuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCd0YWcnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgY2xzID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2hlY2thYmxlXCIpLCB0cnVlKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNoZWNrYWJsZS1jaGVja2VkXCIpLCBjaGVja2VkKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIF9leHRlbmRzKHt9LCByZXN0UHJvcHMsIHtcbiAgICBjbGFzc05hbWU6IGNscyxcbiAgICBvbkNsaWNrOiBoYW5kbGVDbGlja1xuICB9KSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgQ2hlY2thYmxlVGFnOyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBDbG9zZU91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DbG9zZU91dGxpbmVkXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBvbWl0IGZyb20gXCJyYy11dGlsL2VzL29taXRcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHsgUHJlc2V0Q29sb3JUeXBlcywgUHJlc2V0U3RhdHVzQ29sb3JUeXBlcyB9IGZyb20gJy4uL191dGlsL2NvbG9ycyc7XG5pbXBvcnQgV2F2ZSBmcm9tICcuLi9fdXRpbC93YXZlJztcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4uL191dGlsL3dhcm5pbmcnO1xuaW1wb3J0IENoZWNrYWJsZVRhZyBmcm9tICcuL0NoZWNrYWJsZVRhZyc7XG52YXIgUHJlc2V0Q29sb3JSZWdleCA9IG5ldyBSZWdFeHAoXCJeKFwiLmNvbmNhdChQcmVzZXRDb2xvclR5cGVzLmpvaW4oJ3wnKSwgXCIpKC1pbnZlcnNlKT8kXCIpKTtcbnZhciBQcmVzZXRTdGF0dXNDb2xvclJlZ2V4ID0gbmV3IFJlZ0V4cChcIl4oXCIuY29uY2F0KFByZXNldFN0YXR1c0NvbG9yVHlwZXMuam9pbignfCcpLCBcIikkXCIpKTtcbnZhciBJbnRlcm5hbFRhZyA9IGZ1bmN0aW9uIEludGVybmFsVGFnKF9hLCByZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gX2EucHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZSxcbiAgICBzdHlsZSA9IF9hLnN0eWxlLFxuICAgIGNoaWxkcmVuID0gX2EuY2hpbGRyZW4sXG4gICAgaWNvbiA9IF9hLmljb24sXG4gICAgY29sb3IgPSBfYS5jb2xvcixcbiAgICBvbkNsb3NlID0gX2Eub25DbG9zZSxcbiAgICBjbG9zZUljb24gPSBfYS5jbG9zZUljb24sXG4gICAgX2EkY2xvc2FibGUgPSBfYS5jbG9zYWJsZSxcbiAgICBjbG9zYWJsZSA9IF9hJGNsb3NhYmxlID09PSB2b2lkIDAgPyBmYWxzZSA6IF9hJGNsb3NhYmxlLFxuICAgIHByb3BzID0gX19yZXN0KF9hLCBbXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJzdHlsZVwiLCBcImNoaWxkcmVuXCIsIFwiaWNvblwiLCBcImNvbG9yXCIsIFwib25DbG9zZVwiLCBcImNsb3NlSWNvblwiLCBcImNsb3NhYmxlXCJdKTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUodHJ1ZSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgdmlzaWJsZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0VmlzaWJsZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIC8vIFdhcm5pbmcgZm9yIGRlcHJlY2F0ZWQgdXNhZ2VcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCEoJ3Zpc2libGUnIGluIHByb3BzKSwgJ1RhZycsICdgdmlzaWJsZWAgd2lsbCBiZSByZW1vdmVkIGluIG5leHQgbWFqb3IgdmVyc2lvbiwgcGxlYXNlIHVzZSBgdmlzaWJsZSAmJiA8VGFnIC8+YCBpbnN0ZWFkLicpIDogdm9pZCAwO1xuICB9XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCd2aXNpYmxlJyBpbiBwcm9wcykge1xuICAgICAgc2V0VmlzaWJsZShwcm9wcy52aXNpYmxlKTtcbiAgICB9XG4gIH0sIFtwcm9wcy52aXNpYmxlXSk7XG4gIHZhciBpc1ByZXNldENvbG9yID0gZnVuY3Rpb24gaXNQcmVzZXRDb2xvcigpIHtcbiAgICBpZiAoIWNvbG9yKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBQcmVzZXRDb2xvclJlZ2V4LnRlc3QoY29sb3IpIHx8IFByZXNldFN0YXR1c0NvbG9yUmVnZXgudGVzdChjb2xvcik7XG4gIH07XG4gIHZhciB0YWdTdHlsZSA9IF9leHRlbmRzKHtcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9yICYmICFpc1ByZXNldENvbG9yKCkgPyBjb2xvciA6IHVuZGVmaW5lZFxuICB9LCBzdHlsZSk7XG4gIHZhciBwcmVzZXRDb2xvciA9IGlzUHJlc2V0Q29sb3IoKTtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygndGFnJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIHRhZ0NsYXNzTmFtZSA9IGNsYXNzTmFtZXMocHJlZml4Q2xzLCAoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoY29sb3IpLCBwcmVzZXRDb2xvciksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oYXMtY29sb3JcIiksIGNvbG9yICYmICFwcmVzZXRDb2xvciksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oaWRkZW5cIiksICF2aXNpYmxlKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lKTtcbiAgdmFyIGhhbmRsZUNsb3NlQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVDbG9zZUNsaWNrKGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIG9uQ2xvc2UgPT09IG51bGwgfHwgb25DbG9zZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DbG9zZShlKTtcbiAgICBpZiAoZS5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghKCd2aXNpYmxlJyBpbiBwcm9wcykpIHtcbiAgICAgIHNldFZpc2libGUoZmFsc2UpO1xuICAgIH1cbiAgfTtcbiAgdmFyIHJlbmRlckNsb3NlSWNvbiA9IGZ1bmN0aW9uIHJlbmRlckNsb3NlSWNvbigpIHtcbiAgICBpZiAoY2xvc2FibGUpIHtcbiAgICAgIHJldHVybiBjbG9zZUljb24gPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2xvc2UtaWNvblwiKSxcbiAgICAgICAgb25DbGljazogaGFuZGxlQ2xvc2VDbGlja1xuICAgICAgfSwgY2xvc2VJY29uKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENsb3NlT3V0bGluZWQsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNsb3NlLWljb25cIiksXG4gICAgICAgIG9uQ2xpY2s6IGhhbmRsZUNsb3NlQ2xpY2tcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcbiAgdmFyIGlzTmVlZFdhdmUgPSAnb25DbGljaycgaW4gcHJvcHMgfHwgY2hpbGRyZW4gJiYgY2hpbGRyZW4udHlwZSA9PT0gJ2EnO1xuICB2YXIgdGFnUHJvcHMgPSBvbWl0KHByb3BzLCBbJ3Zpc2libGUnXSk7XG4gIHZhciBpY29uTm9kZSA9IGljb24gfHwgbnVsbDtcbiAgdmFyIGtpZHMgPSBpY29uTm9kZSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBpY29uTm9kZSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIGNoaWxkcmVuKSkgOiBjaGlsZHJlbjtcbiAgdmFyIHRhZ05vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgX2V4dGVuZHMoe30sIHRhZ1Byb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgY2xhc3NOYW1lOiB0YWdDbGFzc05hbWUsXG4gICAgc3R5bGU6IHRhZ1N0eWxlXG4gIH0pLCBraWRzLCByZW5kZXJDbG9zZUljb24oKSk7XG4gIHJldHVybiBpc05lZWRXYXZlID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoV2F2ZSwgbnVsbCwgdGFnTm9kZSkgOiB0YWdOb2RlO1xufTtcbnZhciBUYWcgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihJbnRlcm5hbFRhZyk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBUYWcuZGlzcGxheU5hbWUgPSAnVGFnJztcbn1cblRhZy5DaGVja2FibGVUYWcgPSBDaGVja2FibGVUYWc7XG5leHBvcnQgZGVmYXVsdCBUYWc7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgVGFnIGZyb20gJy4uL3RhZyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBQaWNrZXJUYWcocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRhZywgX2V4dGVuZHMoe1xuICAgIGNvbG9yOiBcImJsdWVcIlxuICB9LCBwcm9wcykpO1xufSIsIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIENhbGVuZGFyT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTg4MCAxODRINzEydi02NGMwLTQuNC0zLjYtOC04LThoLTU2Yy00LjQgMC04IDMuNi04IDh2NjRIMzg0di02NGMwLTQuNC0zLjYtOC04LThoLTU2Yy00LjQgMC04IDMuNi04IDh2NjRIMTQ0Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnY2NjRjMCAxNy43IDE0LjMgMzIgMzIgMzJoNzM2YzE3LjcgMCAzMi0xNC4zIDMyLTMyVjIxNmMwLTE3LjctMTQuMy0zMi0zMi0zMnptLTQwIDY1NkgxODRWNDYwaDY1NnYzODB6TTE4NCAzOTJWMjU2aDEyOHY0OGMwIDQuNCAzLjYgOCA4IDhoNTZjNC40IDAgOC0zLjYgOC04di00OGgyNTZ2NDhjMCA0LjQgMy42IDggOCA4aDU2YzQuNCAwIDgtMy42IDgtOHYtNDhoMTI4djEzNkgxODR6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJjYWxlbmRhclwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgQ2FsZW5kYXJPdXRsaW5lZDtcbiIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IENhbGVuZGFyT3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vQ2FsZW5kYXJPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIENhbGVuZGFyT3V0bGluZWQgPSBmdW5jdGlvbiBDYWxlbmRhck91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBDYWxlbmRhck91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5DYWxlbmRhck91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ0NhbGVuZGFyT3V0bGluZWQnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoQ2FsZW5kYXJPdXRsaW5lZCk7IiwiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgQ2xvY2tDaXJjbGVPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNTEyIDY0QzI2NC42IDY0IDY0IDI2NC42IDY0IDUxMnMyMDAuNiA0NDggNDQ4IDQ0OCA0NDgtMjAwLjYgNDQ4LTQ0OFM3NTkuNCA2NCA1MTIgNjR6bTAgODIwYy0yMDUuNCAwLTM3Mi0xNjYuNi0zNzItMzcyczE2Ni42LTM3MiAzNzItMzcyIDM3MiAxNjYuNiAzNzIgMzcyLTE2Ni42IDM3Mi0zNzIgMzcyelwiIH0gfSwgeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk02ODYuNyA2MzguNkw1NDQuMSA1MzUuNVYyODhjMC00LjQtMy42LTgtOC04SDQ4OGMtNC40IDAtOCAzLjYtOCA4djI3NS40YzAgMi42IDEuMiA1IDMuMyA2LjVsMTY1LjQgMTIwLjZjMy42IDIuNiA4LjYgMS44IDExLjItMS43bDI4LjYtMzljMi42LTMuNyAxLjgtOC43LTEuOC0xMS4yelwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiY2xvY2stY2lyY2xlXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnQgZGVmYXVsdCBDbG9ja0NpcmNsZU91dGxpbmVkO1xuIiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQ2xvY2tDaXJjbGVPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9DbG9ja0NpcmNsZU91dGxpbmVkXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSAnLi4vY29tcG9uZW50cy9BbnRkSWNvbic7XG52YXIgQ2xvY2tDaXJjbGVPdXRsaW5lZCA9IGZ1bmN0aW9uIENsb2NrQ2lyY2xlT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IENsb2NrQ2lyY2xlT3V0bGluZWRTdmdcbiAgfSkpO1xufTtcbkNsb2NrQ2lyY2xlT3V0bGluZWQuZGlzcGxheU5hbWUgPSAnQ2xvY2tDaXJjbGVPdXRsaW5lZCc7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihDbG9ja0NpcmNsZU91dGxpbmVkKTsiLCIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBTd2FwUmlnaHRPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjAgMCAxMDI0IDEwMjRcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNODczLjEgNTk2LjJsLTE2NC0yMDhBMzIgMzIgMCAwMDY4NCAzNzZoLTY0LjhjLTYuNyAwLTEwLjQgNy43LTYuMyAxM2wxNDQuMyAxODNIMTUyYy00LjQgMC04IDMuNi04IDh2NjBjMCA0LjQgMy42IDggOCA4aDY5NS45YzI2LjggMCA0MS43LTMwLjggMjUuMi01MS44elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwic3dhcC1yaWdodFwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgU3dhcFJpZ2h0T3V0bGluZWQ7XG4iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBTd2FwUmlnaHRPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Td2FwUmlnaHRPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIFN3YXBSaWdodE91dGxpbmVkID0gZnVuY3Rpb24gU3dhcFJpZ2h0T3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IFN3YXBSaWdodE91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5Td2FwUmlnaHRPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdTd2FwUmlnaHRPdXRsaW5lZCc7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihTd2FwUmlnaHRPdXRsaW5lZCk7IiwiZXhwb3J0IGZ1bmN0aW9uIGdldFBsYWNlaG9sZGVyKHBpY2tlciwgbG9jYWxlLCBjdXN0b21pemVQbGFjZWhvbGRlcikge1xuICBpZiAoY3VzdG9taXplUGxhY2Vob2xkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjdXN0b21pemVQbGFjZWhvbGRlcjtcbiAgfVxuICBpZiAocGlja2VyID09PSAneWVhcicgJiYgbG9jYWxlLmxhbmcueWVhclBsYWNlaG9sZGVyKSB7XG4gICAgcmV0dXJuIGxvY2FsZS5sYW5nLnllYXJQbGFjZWhvbGRlcjtcbiAgfVxuICBpZiAocGlja2VyID09PSAncXVhcnRlcicgJiYgbG9jYWxlLmxhbmcucXVhcnRlclBsYWNlaG9sZGVyKSB7XG4gICAgcmV0dXJuIGxvY2FsZS5sYW5nLnF1YXJ0ZXJQbGFjZWhvbGRlcjtcbiAgfVxuICBpZiAocGlja2VyID09PSAnbW9udGgnICYmIGxvY2FsZS5sYW5nLm1vbnRoUGxhY2Vob2xkZXIpIHtcbiAgICByZXR1cm4gbG9jYWxlLmxhbmcubW9udGhQbGFjZWhvbGRlcjtcbiAgfVxuICBpZiAocGlja2VyID09PSAnd2VlaycgJiYgbG9jYWxlLmxhbmcud2Vla1BsYWNlaG9sZGVyKSB7XG4gICAgcmV0dXJuIGxvY2FsZS5sYW5nLndlZWtQbGFjZWhvbGRlcjtcbiAgfVxuICBpZiAocGlja2VyID09PSAndGltZScgJiYgbG9jYWxlLnRpbWVQaWNrZXJMb2NhbGUucGxhY2Vob2xkZXIpIHtcbiAgICByZXR1cm4gbG9jYWxlLnRpbWVQaWNrZXJMb2NhbGUucGxhY2Vob2xkZXI7XG4gIH1cbiAgcmV0dXJuIGxvY2FsZS5sYW5nLnBsYWNlaG9sZGVyO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFJhbmdlUGxhY2Vob2xkZXIocGlja2VyLCBsb2NhbGUsIGN1c3RvbWl6ZVBsYWNlaG9sZGVyKSB7XG4gIGlmIChjdXN0b21pemVQbGFjZWhvbGRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGN1c3RvbWl6ZVBsYWNlaG9sZGVyO1xuICB9XG4gIGlmIChwaWNrZXIgPT09ICd5ZWFyJyAmJiBsb2NhbGUubGFuZy55ZWFyUGxhY2Vob2xkZXIpIHtcbiAgICByZXR1cm4gbG9jYWxlLmxhbmcucmFuZ2VZZWFyUGxhY2Vob2xkZXI7XG4gIH1cbiAgaWYgKHBpY2tlciA9PT0gJ3F1YXJ0ZXInICYmIGxvY2FsZS5sYW5nLnF1YXJ0ZXJQbGFjZWhvbGRlcikge1xuICAgIHJldHVybiBsb2NhbGUubGFuZy5yYW5nZVF1YXJ0ZXJQbGFjZWhvbGRlcjtcbiAgfVxuICBpZiAocGlja2VyID09PSAnbW9udGgnICYmIGxvY2FsZS5sYW5nLm1vbnRoUGxhY2Vob2xkZXIpIHtcbiAgICByZXR1cm4gbG9jYWxlLmxhbmcucmFuZ2VNb250aFBsYWNlaG9sZGVyO1xuICB9XG4gIGlmIChwaWNrZXIgPT09ICd3ZWVrJyAmJiBsb2NhbGUubGFuZy53ZWVrUGxhY2Vob2xkZXIpIHtcbiAgICByZXR1cm4gbG9jYWxlLmxhbmcucmFuZ2VXZWVrUGxhY2Vob2xkZXI7XG4gIH1cbiAgaWYgKHBpY2tlciA9PT0gJ3RpbWUnICYmIGxvY2FsZS50aW1lUGlja2VyTG9jYWxlLnBsYWNlaG9sZGVyKSB7XG4gICAgcmV0dXJuIGxvY2FsZS50aW1lUGlja2VyTG9jYWxlLnJhbmdlUGxhY2Vob2xkZXI7XG4gIH1cbiAgcmV0dXJuIGxvY2FsZS5sYW5nLnJhbmdlUGxhY2Vob2xkZXI7XG59XG5leHBvcnQgZnVuY3Rpb24gdHJhbnNQbGFjZW1lbnQyRHJvcGRvd25BbGlnbihkaXJlY3Rpb24sIHBsYWNlbWVudCkge1xuICB2YXIgb3ZlcmZsb3cgPSB7XG4gICAgYWRqdXN0WDogMSxcbiAgICBhZGp1c3RZOiAxXG4gIH07XG4gIHN3aXRjaCAocGxhY2VtZW50KSB7XG4gICAgY2FzZSAnYm90dG9tTGVmdCc6XG4gICAgICB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcG9pbnRzOiBbJ3RsJywgJ2JsJ10sXG4gICAgICAgICAgb2Zmc2V0OiBbMCwgNF0sXG4gICAgICAgICAgb3ZlcmZsb3c6IG92ZXJmbG93XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgY2FzZSAnYm90dG9tUmlnaHQnOlxuICAgICAge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBvaW50czogWyd0cicsICdiciddLFxuICAgICAgICAgIG9mZnNldDogWzAsIDRdLFxuICAgICAgICAgIG92ZXJmbG93OiBvdmVyZmxvd1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIGNhc2UgJ3RvcExlZnQnOlxuICAgICAge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBvaW50czogWydibCcsICd0bCddLFxuICAgICAgICAgIG9mZnNldDogWzAsIC00XSxcbiAgICAgICAgICBvdmVyZmxvdzogb3ZlcmZsb3dcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICBjYXNlICd0b3BSaWdodCc6XG4gICAgICB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcG9pbnRzOiBbJ2JyJywgJ3RyJ10sXG4gICAgICAgICAgb2Zmc2V0OiBbMCwgLTRdLFxuICAgICAgICAgIG92ZXJmbG93OiBvdmVyZmxvd1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcG9pbnRzOiBkaXJlY3Rpb24gPT09ICdydGwnID8gWyd0cicsICdiciddIDogWyd0bCcsICdibCddLFxuICAgICAgICAgIG9mZnNldDogWzAsIDRdLFxuICAgICAgICAgIG92ZXJmbG93OiBvdmVyZmxvd1xuICAgICAgICB9O1xuICAgICAgfVxuICB9XG59IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBDYWxlbmRhck91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DYWxlbmRhck91dGxpbmVkXCI7XG5pbXBvcnQgQ2xvY2tDaXJjbGVPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvQ2xvY2tDaXJjbGVPdXRsaW5lZFwiO1xuaW1wb3J0IENsb3NlQ2lyY2xlRmlsbGVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DbG9zZUNpcmNsZUZpbGxlZFwiO1xuaW1wb3J0IFN3YXBSaWdodE91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9Td2FwUmlnaHRPdXRsaW5lZFwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBSYW5nZVBpY2tlciBhcyBSQ1JhbmdlUGlja2VyIH0gZnJvbSAncmMtcGlja2VyJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGZvcndhcmRSZWYsIHVzZUNvbnRleHQsIHVzZUltcGVyYXRpdmVIYW5kbGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb21wb25lbnRzLCBnZXRUaW1lUHJvcHMgfSBmcm9tICcuJztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi8uLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IERpc2FibGVkQ29udGV4dCBmcm9tICcuLi8uLi9jb25maWctcHJvdmlkZXIvRGlzYWJsZWRDb250ZXh0JztcbmltcG9ydCBTaXplQ29udGV4dCBmcm9tICcuLi8uLi9jb25maWctcHJvdmlkZXIvU2l6ZUNvbnRleHQnO1xuaW1wb3J0IHsgRm9ybUl0ZW1JbnB1dENvbnRleHQgfSBmcm9tICcuLi8uLi9mb3JtL2NvbnRleHQnO1xuaW1wb3J0IHsgdXNlQ29tcGFjdEl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vLi4vc3BhY2UvQ29tcGFjdCc7XG5pbXBvcnQgTG9jYWxlUmVjZWl2ZXIgZnJvbSAnLi4vLi4vbG9jYWxlLXByb3ZpZGVyL0xvY2FsZVJlY2VpdmVyJztcbmltcG9ydCB7IGdldE1lcmdlZFN0YXR1cywgZ2V0U3RhdHVzQ2xhc3NOYW1lcyB9IGZyb20gJy4uLy4uL191dGlsL3N0YXR1c1V0aWxzJztcbmltcG9ydCBlblVTIGZyb20gJy4uL2xvY2FsZS9lbl9VUyc7XG5pbXBvcnQgeyBnZXRSYW5nZVBsYWNlaG9sZGVyLCB0cmFuc1BsYWNlbWVudDJEcm9wZG93bkFsaWduIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgd2FybmluZyBmcm9tICcuLi8uLi9fdXRpbC93YXJuaW5nJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdlbmVyYXRlUmFuZ2VQaWNrZXIoZ2VuZXJhdGVDb25maWcpIHtcbiAgdmFyIFJhbmdlUGlja2VyID0gLyojX19QVVJFX18qL2ZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgY3VzdG9tR2V0UG9wdXBDb250YWluZXIgPSBwcm9wcy5nZXRQb3B1cENvbnRhaW5lcixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIHBsYWNlbWVudCA9IHByb3BzLnBsYWNlbWVudCxcbiAgICAgIGN1c3RvbWl6ZVNpemUgPSBwcm9wcy5zaXplLFxuICAgICAgY3VzdG9tRGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICAgIF9wcm9wcyRib3JkZXJlZCA9IHByb3BzLmJvcmRlcmVkLFxuICAgICAgYm9yZGVyZWQgPSBfcHJvcHMkYm9yZGVyZWQgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkYm9yZGVyZWQsXG4gICAgICBwbGFjZWhvbGRlciA9IHByb3BzLnBsYWNlaG9sZGVyLFxuICAgICAgcG9wdXBDbGFzc05hbWUgPSBwcm9wcy5wb3B1cENsYXNzTmFtZSxcbiAgICAgIGRyb3Bkb3duQ2xhc3NOYW1lID0gcHJvcHMuZHJvcGRvd25DbGFzc05hbWUsXG4gICAgICBjdXN0b21TdGF0dXMgPSBwcm9wcy5zdGF0dXMsXG4gICAgICByZXN0UHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcImdldFBvcHVwQ29udGFpbmVyXCIsIFwiY2xhc3NOYW1lXCIsIFwicGxhY2VtZW50XCIsIFwic2l6ZVwiLCBcImRpc2FibGVkXCIsIFwiYm9yZGVyZWRcIiwgXCJwbGFjZWhvbGRlclwiLCBcInBvcHVwQ2xhc3NOYW1lXCIsIFwiZHJvcGRvd25DbGFzc05hbWVcIiwgXCJzdGF0dXNcIl0pO1xuICAgIHZhciBpbm5lclJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICB2YXIgX3VzZUNvbnRleHQgPSB1c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgICAgZ2V0UHJlZml4Q2xzID0gX3VzZUNvbnRleHQuZ2V0UHJlZml4Q2xzLFxuICAgICAgZGlyZWN0aW9uID0gX3VzZUNvbnRleHQuZGlyZWN0aW9uLFxuICAgICAgZ2V0UG9wdXBDb250YWluZXIgPSBfdXNlQ29udGV4dC5nZXRQb3B1cENvbnRhaW5lcjtcbiAgICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdwaWNrZXInLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAgIHZhciBfdXNlQ29tcGFjdEl0ZW1Db250ZXggPSB1c2VDb21wYWN0SXRlbUNvbnRleHQocHJlZml4Q2xzLCBkaXJlY3Rpb24pLFxuICAgICAgY29tcGFjdFNpemUgPSBfdXNlQ29tcGFjdEl0ZW1Db250ZXguY29tcGFjdFNpemUsXG4gICAgICBjb21wYWN0SXRlbUNsYXNzbmFtZXMgPSBfdXNlQ29tcGFjdEl0ZW1Db250ZXguY29tcGFjdEl0ZW1DbGFzc25hbWVzO1xuICAgIHZhciBmb3JtYXQgPSBwcm9wcy5mb3JtYXQsXG4gICAgICBzaG93VGltZSA9IHByb3BzLnNob3dUaW1lLFxuICAgICAgcGlja2VyID0gcHJvcHMucGlja2VyO1xuICAgIHZhciByb290UHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCk7XG4gICAgdmFyIGFkZGl0aW9uYWxPdmVycmlkZVByb3BzID0ge307XG4gICAgYWRkaXRpb25hbE92ZXJyaWRlUHJvcHMgPSBfZXh0ZW5kcyhfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgYWRkaXRpb25hbE92ZXJyaWRlUHJvcHMpLCBzaG93VGltZSA/IGdldFRpbWVQcm9wcyhfZXh0ZW5kcyh7XG4gICAgICBmb3JtYXQ6IGZvcm1hdCxcbiAgICAgIHBpY2tlcjogcGlja2VyXG4gICAgfSwgc2hvd1RpbWUpKSA6IHt9KSwgcGlja2VyID09PSAndGltZScgPyBnZXRUaW1lUHJvcHMoX2V4dGVuZHMoX2V4dGVuZHMoe1xuICAgICAgZm9ybWF0OiBmb3JtYXRcbiAgICB9LCBwcm9wcyksIHtcbiAgICAgIHBpY2tlcjogcGlja2VyXG4gICAgfSkpIDoge30pO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoIWRyb3Bkb3duQ2xhc3NOYW1lLCAnUmFuZ2VQaWNrZXInLCAnYGRyb3Bkb3duQ2xhc3NOYW1lYCBpcyBkZXByZWNhdGVkIHdoaWNoIHdpbGwgYmUgcmVtb3ZlZCBpbiBuZXh0IG1ham9yIHZlcnNpb24uIFBsZWFzZSB1c2UgYHBvcHVwQ2xhc3NOYW1lYCBpbnN0ZWFkLicpIDogdm9pZCAwO1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PSBTaXplID09PT09PT09PT09PT09PT09PT09PVxuICAgIHZhciBzaXplID0gUmVhY3QudXNlQ29udGV4dChTaXplQ29udGV4dCk7XG4gICAgdmFyIG1lcmdlZFNpemUgPSBjb21wYWN0U2l6ZSB8fCBjdXN0b21pemVTaXplIHx8IHNpemU7XG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09IERpc2FibGVkID09PT09PT09PT09PT09PT09PT09PVxuICAgIHZhciBkaXNhYmxlZCA9IFJlYWN0LnVzZUNvbnRleHQoRGlzYWJsZWRDb250ZXh0KTtcbiAgICB2YXIgbWVyZ2VkRGlzYWJsZWQgPSBjdXN0b21EaXNhYmxlZCAhPT0gbnVsbCAmJiBjdXN0b21EaXNhYmxlZCAhPT0gdm9pZCAwID8gY3VzdG9tRGlzYWJsZWQgOiBkaXNhYmxlZDtcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0gRm9ybUl0ZW1JbnB1dCA9PT09PT09PT09PT09PT09PT09PT1cbiAgICB2YXIgZm9ybUl0ZW1Db250ZXh0ID0gdXNlQ29udGV4dChGb3JtSXRlbUlucHV0Q29udGV4dCk7XG4gICAgdmFyIGhhc0ZlZWRiYWNrID0gZm9ybUl0ZW1Db250ZXh0Lmhhc0ZlZWRiYWNrLFxuICAgICAgY29udGV4dFN0YXR1cyA9IGZvcm1JdGVtQ29udGV4dC5zdGF0dXMsXG4gICAgICBmZWVkYmFja0ljb24gPSBmb3JtSXRlbUNvbnRleHQuZmVlZGJhY2tJY29uO1xuICAgIHZhciBzdWZmaXhOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIHBpY2tlciA9PT0gJ3RpbWUnID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2xvY2tDaXJjbGVPdXRsaW5lZCwgbnVsbCkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDYWxlbmRhck91dGxpbmVkLCBudWxsKSwgaGFzRmVlZGJhY2sgJiYgZmVlZGJhY2tJY29uKTtcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZm9jdXM6IGZ1bmN0aW9uIGZvY3VzKCkge1xuICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICByZXR1cm4gKF9hID0gaW5uZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZvY3VzKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGJsdXI6IGZ1bmN0aW9uIGJsdXIoKSB7XG4gICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgIHJldHVybiAoX2EgPSBpbm5lclJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYmx1cigpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMb2NhbGVSZWNlaXZlciwge1xuICAgICAgY29tcG9uZW50TmFtZTogXCJEYXRlUGlja2VyXCIsXG4gICAgICBkZWZhdWx0TG9jYWxlOiBlblVTXG4gICAgfSwgZnVuY3Rpb24gKGNvbnRleHRMb2NhbGUpIHtcbiAgICAgIHZhciBfY2xhc3NOYW1lcztcbiAgICAgIHZhciBsb2NhbGUgPSBfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgY29udGV4dExvY2FsZSksIHByb3BzLmxvY2FsZSk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUkNSYW5nZVBpY2tlciwgX2V4dGVuZHMoe1xuICAgICAgICBzZXBhcmF0b3I6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgXCJhcmlhLWxhYmVsXCI6IFwidG9cIixcbiAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2VwYXJhdG9yXCIpXG4gICAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFN3YXBSaWdodE91dGxpbmVkLCBudWxsKSksXG4gICAgICAgIGRpc2FibGVkOiBtZXJnZWREaXNhYmxlZCxcbiAgICAgICAgcmVmOiBpbm5lclJlZixcbiAgICAgICAgZHJvcGRvd25BbGlnbjogdHJhbnNQbGFjZW1lbnQyRHJvcGRvd25BbGlnbihkaXJlY3Rpb24sIHBsYWNlbWVudCksXG4gICAgICAgIHBsYWNlaG9sZGVyOiBnZXRSYW5nZVBsYWNlaG9sZGVyKHBpY2tlciwgbG9jYWxlLCBwbGFjZWhvbGRlciksXG4gICAgICAgIHN1ZmZpeEljb246IHN1ZmZpeE5vZGUsXG4gICAgICAgIGNsZWFySWNvbjogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2xvc2VDaXJjbGVGaWxsZWQsIG51bGwpLFxuICAgICAgICBwcmV2SWNvbjogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcHJldi1pY29uXCIpXG4gICAgICAgIH0pLFxuICAgICAgICBuZXh0SWNvbjogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbmV4dC1pY29uXCIpXG4gICAgICAgIH0pLFxuICAgICAgICBzdXBlclByZXZJY29uOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zdXBlci1wcmV2LWljb25cIilcbiAgICAgICAgfSksXG4gICAgICAgIHN1cGVyTmV4dEljb246IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN1cGVyLW5leHQtaWNvblwiKVxuICAgICAgICB9KSxcbiAgICAgICAgYWxsb3dDbGVhcjogdHJ1ZSxcbiAgICAgICAgdHJhbnNpdGlvbk5hbWU6IFwiXCIuY29uY2F0KHJvb3RQcmVmaXhDbHMsIFwiLXNsaWRlLXVwXCIpXG4gICAgICB9LCByZXN0UHJvcHMsIGFkZGl0aW9uYWxPdmVycmlkZVByb3BzLCB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcygoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQobWVyZ2VkU2l6ZSksIG1lcmdlZFNpemUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYm9yZGVybGVzc1wiKSwgIWJvcmRlcmVkKSwgX2NsYXNzTmFtZXMpLCBnZXRTdGF0dXNDbGFzc05hbWVzKHByZWZpeENscywgZ2V0TWVyZ2VkU3RhdHVzKGNvbnRleHRTdGF0dXMsIGN1c3RvbVN0YXR1cyksIGhhc0ZlZWRiYWNrKSwgY29tcGFjdEl0ZW1DbGFzc25hbWVzLCBjbGFzc05hbWUpLFxuICAgICAgICBsb2NhbGU6IGxvY2FsZS5sYW5nLFxuICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgZ2V0UG9wdXBDb250YWluZXI6IGN1c3RvbUdldFBvcHVwQ29udGFpbmVyIHx8IGdldFBvcHVwQ29udGFpbmVyLFxuICAgICAgICBnZW5lcmF0ZUNvbmZpZzogZ2VuZXJhdGVDb25maWcsXG4gICAgICAgIGNvbXBvbmVudHM6IENvbXBvbmVudHMsXG4gICAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uLFxuICAgICAgICBkcm9wZG93bkNsYXNzTmFtZTogcG9wdXBDbGFzc05hbWUgfHwgZHJvcGRvd25DbGFzc05hbWVcbiAgICAgIH0pKTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBSYW5nZVBpY2tlcjtcbn0iLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IENhbGVuZGFyT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0NhbGVuZGFyT3V0bGluZWRcIjtcbmltcG9ydCBDbG9ja0NpcmNsZU91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DbG9ja0NpcmNsZU91dGxpbmVkXCI7XG5pbXBvcnQgQ2xvc2VDaXJjbGVGaWxsZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Nsb3NlQ2lyY2xlRmlsbGVkXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBSQ1BpY2tlciBmcm9tICdyYy1waWNrZXInO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZm9yd2FyZFJlZiwgdXNlQ29udGV4dCwgdXNlSW1wZXJhdGl2ZUhhbmRsZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbXBhY3RJdGVtQ29udGV4dCB9IGZyb20gJy4uLy4uL3NwYWNlL0NvbXBhY3QnO1xuaW1wb3J0IHsgQ29tcG9uZW50cywgZ2V0VGltZVByb3BzIH0gZnJvbSAnLic7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCBEaXNhYmxlZENvbnRleHQgZnJvbSAnLi4vLi4vY29uZmlnLXByb3ZpZGVyL0Rpc2FibGVkQ29udGV4dCc7XG5pbXBvcnQgU2l6ZUNvbnRleHQgZnJvbSAnLi4vLi4vY29uZmlnLXByb3ZpZGVyL1NpemVDb250ZXh0JztcbmltcG9ydCB7IEZvcm1JdGVtSW5wdXRDb250ZXh0IH0gZnJvbSAnLi4vLi4vZm9ybS9jb250ZXh0JztcbmltcG9ydCBMb2NhbGVSZWNlaXZlciBmcm9tICcuLi8uLi9sb2NhbGUtcHJvdmlkZXIvTG9jYWxlUmVjZWl2ZXInO1xuaW1wb3J0IHsgZ2V0TWVyZ2VkU3RhdHVzLCBnZXRTdGF0dXNDbGFzc05hbWVzIH0gZnJvbSAnLi4vLi4vX3V0aWwvc3RhdHVzVXRpbHMnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi4vLi4vX3V0aWwvd2FybmluZyc7XG5pbXBvcnQgZW5VUyBmcm9tICcuLi9sb2NhbGUvZW5fVVMnO1xuaW1wb3J0IHsgZ2V0UGxhY2Vob2xkZXIsIHRyYW5zUGxhY2VtZW50MkRyb3Bkb3duQWxpZ24gfSBmcm9tICcuLi91dGlsJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdlbmVyYXRlUGlja2VyKGdlbmVyYXRlQ29uZmlnKSB7XG4gIGZ1bmN0aW9uIGdldFBpY2tlcihwaWNrZXIsIGRpc3BsYXlOYW1lKSB7XG4gICAgdmFyIFBpY2tlciA9IC8qI19fUFVSRV9fKi9mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gICAgICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgICBjdXN0b21pemVHZXRQb3B1cENvbnRhaW5lciA9IHByb3BzLmdldFBvcHVwQ29udGFpbmVyLFxuICAgICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIGN1c3RvbWl6ZVNpemUgPSBwcm9wcy5zaXplLFxuICAgICAgICBfcHJvcHMkYm9yZGVyZWQgPSBwcm9wcy5ib3JkZXJlZCxcbiAgICAgICAgYm9yZGVyZWQgPSBfcHJvcHMkYm9yZGVyZWQgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkYm9yZGVyZWQsXG4gICAgICAgIHBsYWNlbWVudCA9IHByb3BzLnBsYWNlbWVudCxcbiAgICAgICAgcGxhY2Vob2xkZXIgPSBwcm9wcy5wbGFjZWhvbGRlcixcbiAgICAgICAgcG9wdXBDbGFzc05hbWUgPSBwcm9wcy5wb3B1cENsYXNzTmFtZSxcbiAgICAgICAgZHJvcGRvd25DbGFzc05hbWUgPSBwcm9wcy5kcm9wZG93bkNsYXNzTmFtZSxcbiAgICAgICAgY3VzdG9tRGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICAgICAgY3VzdG9tU3RhdHVzID0gcHJvcHMuc3RhdHVzLFxuICAgICAgICByZXN0UHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcImdldFBvcHVwQ29udGFpbmVyXCIsIFwiY2xhc3NOYW1lXCIsIFwic2l6ZVwiLCBcImJvcmRlcmVkXCIsIFwicGxhY2VtZW50XCIsIFwicGxhY2Vob2xkZXJcIiwgXCJwb3B1cENsYXNzTmFtZVwiLCBcImRyb3Bkb3duQ2xhc3NOYW1lXCIsIFwiZGlzYWJsZWRcIiwgXCJzdGF0dXNcIl0pO1xuICAgICAgdmFyIF91c2VDb250ZXh0ID0gdXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICAgICAgZ2V0UHJlZml4Q2xzID0gX3VzZUNvbnRleHQuZ2V0UHJlZml4Q2xzLFxuICAgICAgICBkaXJlY3Rpb24gPSBfdXNlQ29udGV4dC5kaXJlY3Rpb24sXG4gICAgICAgIGdldFBvcHVwQ29udGFpbmVyID0gX3VzZUNvbnRleHQuZ2V0UG9wdXBDb250YWluZXI7XG4gICAgICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdwaWNrZXInLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAgICAgdmFyIF91c2VDb21wYWN0SXRlbUNvbnRleCA9IHVzZUNvbXBhY3RJdGVtQ29udGV4dChwcmVmaXhDbHMsIGRpcmVjdGlvbiksXG4gICAgICAgIGNvbXBhY3RTaXplID0gX3VzZUNvbXBhY3RJdGVtQ29udGV4LmNvbXBhY3RTaXplLFxuICAgICAgICBjb21wYWN0SXRlbUNsYXNzbmFtZXMgPSBfdXNlQ29tcGFjdEl0ZW1Db250ZXguY29tcGFjdEl0ZW1DbGFzc25hbWVzO1xuICAgICAgdmFyIGlubmVyUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgICAgdmFyIGZvcm1hdCA9IHByb3BzLmZvcm1hdCxcbiAgICAgICAgc2hvd1RpbWUgPSBwcm9wcy5zaG93VGltZTtcbiAgICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZm9jdXM6IGZ1bmN0aW9uIGZvY3VzKCkge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgcmV0dXJuIChfYSA9IGlubmVyUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5mb2N1cygpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgYmx1cjogZnVuY3Rpb24gYmx1cigpIHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIHJldHVybiAoX2EgPSBpbm5lclJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYmx1cigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgdmFyIGFkZGl0aW9uYWxQcm9wcyA9IHtcbiAgICAgICAgc2hvd1RvZGF5OiB0cnVlXG4gICAgICB9O1xuICAgICAgdmFyIGFkZGl0aW9uYWxPdmVycmlkZVByb3BzID0ge307XG4gICAgICBpZiAocGlja2VyKSB7XG4gICAgICAgIGFkZGl0aW9uYWxPdmVycmlkZVByb3BzLnBpY2tlciA9IHBpY2tlcjtcbiAgICAgIH1cbiAgICAgIHZhciBtZXJnZWRQaWNrZXIgPSBwaWNrZXIgfHwgcHJvcHMucGlja2VyO1xuICAgICAgYWRkaXRpb25hbE92ZXJyaWRlUHJvcHMgPSBfZXh0ZW5kcyhfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgYWRkaXRpb25hbE92ZXJyaWRlUHJvcHMpLCBzaG93VGltZSA/IGdldFRpbWVQcm9wcyhfZXh0ZW5kcyh7XG4gICAgICAgIGZvcm1hdDogZm9ybWF0LFxuICAgICAgICBwaWNrZXI6IG1lcmdlZFBpY2tlclxuICAgICAgfSwgc2hvd1RpbWUpKSA6IHt9KSwgbWVyZ2VkUGlja2VyID09PSAndGltZScgPyBnZXRUaW1lUHJvcHMoX2V4dGVuZHMoX2V4dGVuZHMoe1xuICAgICAgICBmb3JtYXQ6IGZvcm1hdFxuICAgICAgfSwgcHJvcHMpLCB7XG4gICAgICAgIHBpY2tlcjogbWVyZ2VkUGlja2VyXG4gICAgICB9KSkgOiB7fSk7XG4gICAgICB2YXIgcm9vdFByZWZpeENscyA9IGdldFByZWZpeENscygpO1xuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PSBXYXJuaW5nID09PT09PT09PT09PT09PT09PT09PVxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhwaWNrZXIgIT09ICdxdWFydGVyJywgZGlzcGxheU5hbWUsIFwiRGF0ZVBpY2tlci5cIi5jb25jYXQoZGlzcGxheU5hbWUsIFwiIGlzIGxlZ2FjeSB1c2FnZS4gUGxlYXNlIHVzZSBEYXRlUGlja2VyW3BpY2tlcj0nXCIpLmNvbmNhdChwaWNrZXIsIFwiJ10gZGlyZWN0bHkuXCIpKSA6IHZvaWQgMDtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoIWRyb3Bkb3duQ2xhc3NOYW1lLCBtZXJnZWRQaWNrZXIgPT09ICd0aW1lJyA/ICdUaW1lUGlja2VyJyA6ICdEYXRlUGlja2VyJywgJ2Bkcm9wZG93bkNsYXNzTmFtZWAgaXMgZGVwcmVjYXRlZCB3aGljaCB3aWxsIGJlIHJlbW92ZWQgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLiBQbGVhc2UgdXNlIGBwb3B1cENsYXNzTmFtZWAgaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PSBTaXplID09PT09PT09PT09PT09PT09PT09PVxuICAgICAgdmFyIHNpemUgPSBSZWFjdC51c2VDb250ZXh0KFNpemVDb250ZXh0KTtcbiAgICAgIHZhciBtZXJnZWRTaXplID0gY29tcGFjdFNpemUgfHwgY3VzdG9taXplU2l6ZSB8fCBzaXplO1xuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09IERpc2FibGVkID09PT09PT09PT09PT09PT09PT09PVxuICAgICAgdmFyIGRpc2FibGVkID0gUmVhY3QudXNlQ29udGV4dChEaXNhYmxlZENvbnRleHQpO1xuICAgICAgdmFyIG1lcmdlZERpc2FibGVkID0gY3VzdG9tRGlzYWJsZWQgIT09IG51bGwgJiYgY3VzdG9tRGlzYWJsZWQgIT09IHZvaWQgMCA/IGN1c3RvbURpc2FibGVkIDogZGlzYWJsZWQ7XG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0gRm9ybUl0ZW1JbnB1dCA9PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIHZhciBmb3JtSXRlbUNvbnRleHQgPSB1c2VDb250ZXh0KEZvcm1JdGVtSW5wdXRDb250ZXh0KTtcbiAgICAgIHZhciBoYXNGZWVkYmFjayA9IGZvcm1JdGVtQ29udGV4dC5oYXNGZWVkYmFjayxcbiAgICAgICAgY29udGV4dFN0YXR1cyA9IGZvcm1JdGVtQ29udGV4dC5zdGF0dXMsXG4gICAgICAgIGZlZWRiYWNrSWNvbiA9IGZvcm1JdGVtQ29udGV4dC5mZWVkYmFja0ljb247XG4gICAgICB2YXIgc3VmZml4Tm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBtZXJnZWRQaWNrZXIgPT09ICd0aW1lJyA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENsb2NrQ2lyY2xlT3V0bGluZWQsIG51bGwpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2FsZW5kYXJPdXRsaW5lZCwgbnVsbCksIGhhc0ZlZWRiYWNrICYmIGZlZWRiYWNrSWNvbik7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTG9jYWxlUmVjZWl2ZXIsIHtcbiAgICAgICAgY29tcG9uZW50TmFtZTogXCJEYXRlUGlja2VyXCIsXG4gICAgICAgIGRlZmF1bHRMb2NhbGU6IGVuVVNcbiAgICAgIH0sIGZ1bmN0aW9uIChjb250ZXh0TG9jYWxlKSB7XG4gICAgICAgIHZhciBfY2xhc3NOYW1lcztcbiAgICAgICAgdmFyIGxvY2FsZSA9IF9leHRlbmRzKF9leHRlbmRzKHt9LCBjb250ZXh0TG9jYWxlKSwgcHJvcHMubG9jYWxlKTtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJDUGlja2VyLCBfZXh0ZW5kcyh7XG4gICAgICAgICAgcmVmOiBpbm5lclJlZixcbiAgICAgICAgICBwbGFjZWhvbGRlcjogZ2V0UGxhY2Vob2xkZXIobWVyZ2VkUGlja2VyLCBsb2NhbGUsIHBsYWNlaG9sZGVyKSxcbiAgICAgICAgICBzdWZmaXhJY29uOiBzdWZmaXhOb2RlLFxuICAgICAgICAgIGRyb3Bkb3duQWxpZ246IHRyYW5zUGxhY2VtZW50MkRyb3Bkb3duQWxpZ24oZGlyZWN0aW9uLCBwbGFjZW1lbnQpLFxuICAgICAgICAgIGNsZWFySWNvbjogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2xvc2VDaXJjbGVGaWxsZWQsIG51bGwpLFxuICAgICAgICAgIHByZXZJY29uOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXByZXYtaWNvblwiKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIG5leHRJY29uOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW5leHQtaWNvblwiKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHN1cGVyUHJldkljb246IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3VwZXItcHJldi1pY29uXCIpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgc3VwZXJOZXh0SWNvbjogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zdXBlci1uZXh0LWljb25cIilcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBhbGxvd0NsZWFyOiB0cnVlLFxuICAgICAgICAgIHRyYW5zaXRpb25OYW1lOiBcIlwiLmNvbmNhdChyb290UHJlZml4Q2xzLCBcIi1zbGlkZS11cFwiKVxuICAgICAgICB9LCBhZGRpdGlvbmFsUHJvcHMsIHJlc3RQcm9wcywgYWRkaXRpb25hbE92ZXJyaWRlUHJvcHMsIHtcbiAgICAgICAgICBsb2NhbGU6IGxvY2FsZS5sYW5nLFxuICAgICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcygoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQobWVyZ2VkU2l6ZSksIG1lcmdlZFNpemUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYm9yZGVybGVzc1wiKSwgIWJvcmRlcmVkKSwgX2NsYXNzTmFtZXMpLCBnZXRTdGF0dXNDbGFzc05hbWVzKHByZWZpeENscywgZ2V0TWVyZ2VkU3RhdHVzKGNvbnRleHRTdGF0dXMsIGN1c3RvbVN0YXR1cyksIGhhc0ZlZWRiYWNrKSwgY29tcGFjdEl0ZW1DbGFzc25hbWVzLCBjbGFzc05hbWUpLFxuICAgICAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgICAgIGdldFBvcHVwQ29udGFpbmVyOiBjdXN0b21pemVHZXRQb3B1cENvbnRhaW5lciB8fCBnZXRQb3B1cENvbnRhaW5lcixcbiAgICAgICAgICBnZW5lcmF0ZUNvbmZpZzogZ2VuZXJhdGVDb25maWcsXG4gICAgICAgICAgY29tcG9uZW50czogQ29tcG9uZW50cyxcbiAgICAgICAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICAgICAgICBkaXNhYmxlZDogbWVyZ2VkRGlzYWJsZWQsXG4gICAgICAgICAgZHJvcGRvd25DbGFzc05hbWU6IHBvcHVwQ2xhc3NOYW1lIHx8IGRyb3Bkb3duQ2xhc3NOYW1lXG4gICAgICAgIH0pKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGlmIChkaXNwbGF5TmFtZSkge1xuICAgICAgUGlja2VyLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7XG4gICAgfVxuICAgIHJldHVybiBQaWNrZXI7XG4gIH1cbiAgdmFyIERhdGVQaWNrZXIgPSBnZXRQaWNrZXIoKTtcbiAgdmFyIFdlZWtQaWNrZXIgPSBnZXRQaWNrZXIoJ3dlZWsnLCAnV2Vla1BpY2tlcicpO1xuICB2YXIgTW9udGhQaWNrZXIgPSBnZXRQaWNrZXIoJ21vbnRoJywgJ01vbnRoUGlja2VyJyk7XG4gIHZhciBZZWFyUGlja2VyID0gZ2V0UGlja2VyKCd5ZWFyJywgJ1llYXJQaWNrZXInKTtcbiAgdmFyIFRpbWVQaWNrZXIgPSBnZXRQaWNrZXIoJ3RpbWUnLCAnVGltZVBpY2tlcicpO1xuICB2YXIgUXVhcnRlclBpY2tlciA9IGdldFBpY2tlcigncXVhcnRlcicsICdRdWFydGVyUGlja2VyJyk7XG4gIHJldHVybiB7XG4gICAgRGF0ZVBpY2tlcjogRGF0ZVBpY2tlcixcbiAgICBXZWVrUGlja2VyOiBXZWVrUGlja2VyLFxuICAgIE1vbnRoUGlja2VyOiBNb250aFBpY2tlcixcbiAgICBZZWFyUGlja2VyOiBZZWFyUGlja2VyLFxuICAgIFRpbWVQaWNrZXI6IFRpbWVQaWNrZXIsXG4gICAgUXVhcnRlclBpY2tlcjogUXVhcnRlclBpY2tlclxuICB9O1xufSIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IHsgdHVwbGUgfSBmcm9tICcuLi8uLi9fdXRpbC90eXBlJztcbmltcG9ydCBQaWNrZXJCdXR0b24gZnJvbSAnLi4vUGlja2VyQnV0dG9uJztcbmltcG9ydCBQaWNrZXJUYWcgZnJvbSAnLi4vUGlja2VyVGFnJztcbmltcG9ydCBnZW5lcmF0ZVJhbmdlUGlja2VyIGZyb20gJy4vZ2VuZXJhdGVSYW5nZVBpY2tlcic7XG5pbXBvcnQgZ2VuZXJhdGVTaW5nbGVQaWNrZXIgZnJvbSAnLi9nZW5lcmF0ZVNpbmdsZVBpY2tlcic7XG5leHBvcnQgdmFyIENvbXBvbmVudHMgPSB7XG4gIGJ1dHRvbjogUGlja2VyQnV0dG9uLFxuICByYW5nZUl0ZW06IFBpY2tlclRhZ1xufTtcbmZ1bmN0aW9uIHRvQXJyYXkobGlzdCkge1xuICBpZiAoIWxpc3QpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkobGlzdCkgPyBsaXN0IDogW2xpc3RdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFRpbWVQcm9wcyhwcm9wcykge1xuICB2YXIgZm9ybWF0ID0gcHJvcHMuZm9ybWF0LFxuICAgIHBpY2tlciA9IHByb3BzLnBpY2tlcixcbiAgICBzaG93SG91ciA9IHByb3BzLnNob3dIb3VyLFxuICAgIHNob3dNaW51dGUgPSBwcm9wcy5zaG93TWludXRlLFxuICAgIHNob3dTZWNvbmQgPSBwcm9wcy5zaG93U2Vjb25kLFxuICAgIHVzZTEySG91cnMgPSBwcm9wcy51c2UxMkhvdXJzO1xuICB2YXIgZmlyc3RGb3JtYXQgPSB0b0FycmF5KGZvcm1hdClbMF07XG4gIHZhciBzaG93VGltZU9iaiA9IF9leHRlbmRzKHt9LCBwcm9wcyk7XG4gIGlmIChmaXJzdEZvcm1hdCAmJiB0eXBlb2YgZmlyc3RGb3JtYXQgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCFmaXJzdEZvcm1hdC5pbmNsdWRlcygncycpICYmIHNob3dTZWNvbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgc2hvd1RpbWVPYmouc2hvd1NlY29uZCA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWZpcnN0Rm9ybWF0LmluY2x1ZGVzKCdtJykgJiYgc2hvd01pbnV0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzaG93VGltZU9iai5zaG93TWludXRlID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICghZmlyc3RGb3JtYXQuaW5jbHVkZXMoJ0gnKSAmJiAhZmlyc3RGb3JtYXQuaW5jbHVkZXMoJ2gnKSAmJiBzaG93SG91ciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzaG93VGltZU9iai5zaG93SG91ciA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoKGZpcnN0Rm9ybWF0LmluY2x1ZGVzKCdhJykgfHwgZmlyc3RGb3JtYXQuaW5jbHVkZXMoJ0EnKSkgJiYgdXNlMTJIb3VycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzaG93VGltZU9iai51c2UxMkhvdXJzID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKHBpY2tlciA9PT0gJ3RpbWUnKSB7XG4gICAgcmV0dXJuIHNob3dUaW1lT2JqO1xuICB9XG4gIGlmICh0eXBlb2YgZmlyc3RGb3JtYXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBmb3JtYXQgb2Ygc2hvd1RpbWUgc2hvdWxkIHVzZSBkZWZhdWx0IHdoZW4gZm9ybWF0IGlzIGN1c3RvbSBmb3JtYXQgZnVuY3Rpb25cbiAgICBkZWxldGUgc2hvd1RpbWVPYmouZm9ybWF0O1xuICB9XG4gIHJldHVybiB7XG4gICAgc2hvd1RpbWU6IHNob3dUaW1lT2JqXG4gIH07XG59XG52YXIgRGF0YVBpY2tlclBsYWNlbWVudHMgPSB0dXBsZSgnYm90dG9tTGVmdCcsICdib3R0b21SaWdodCcsICd0b3BMZWZ0JywgJ3RvcFJpZ2h0Jyk7XG5mdW5jdGlvbiBnZW5lcmF0ZVBpY2tlcihnZW5lcmF0ZUNvbmZpZykge1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gUGlja2VyID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX2dlbmVyYXRlU2luZ2xlUGlja2VyID0gZ2VuZXJhdGVTaW5nbGVQaWNrZXIoZ2VuZXJhdGVDb25maWcpLFxuICAgIERhdGVQaWNrZXIgPSBfZ2VuZXJhdGVTaW5nbGVQaWNrZXIuRGF0ZVBpY2tlcixcbiAgICBXZWVrUGlja2VyID0gX2dlbmVyYXRlU2luZ2xlUGlja2VyLldlZWtQaWNrZXIsXG4gICAgTW9udGhQaWNrZXIgPSBfZ2VuZXJhdGVTaW5nbGVQaWNrZXIuTW9udGhQaWNrZXIsXG4gICAgWWVhclBpY2tlciA9IF9nZW5lcmF0ZVNpbmdsZVBpY2tlci5ZZWFyUGlja2VyLFxuICAgIFRpbWVQaWNrZXIgPSBfZ2VuZXJhdGVTaW5nbGVQaWNrZXIuVGltZVBpY2tlcixcbiAgICBRdWFydGVyUGlja2VyID0gX2dlbmVyYXRlU2luZ2xlUGlja2VyLlF1YXJ0ZXJQaWNrZXI7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBSYW5nZSBQaWNrZXIgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBSYW5nZVBpY2tlciA9IGdlbmVyYXRlUmFuZ2VQaWNrZXIoZ2VuZXJhdGVDb25maWcpO1xuICB2YXIgTWVyZ2VkRGF0ZVBpY2tlciA9IERhdGVQaWNrZXI7XG4gIE1lcmdlZERhdGVQaWNrZXIuV2Vla1BpY2tlciA9IFdlZWtQaWNrZXI7XG4gIE1lcmdlZERhdGVQaWNrZXIuTW9udGhQaWNrZXIgPSBNb250aFBpY2tlcjtcbiAgTWVyZ2VkRGF0ZVBpY2tlci5ZZWFyUGlja2VyID0gWWVhclBpY2tlcjtcbiAgTWVyZ2VkRGF0ZVBpY2tlci5SYW5nZVBpY2tlciA9IFJhbmdlUGlja2VyO1xuICBNZXJnZWREYXRlUGlja2VyLlRpbWVQaWNrZXIgPSBUaW1lUGlja2VyO1xuICBNZXJnZWREYXRlUGlja2VyLlF1YXJ0ZXJQaWNrZXIgPSBRdWFydGVyUGlja2VyO1xuICByZXR1cm4gTWVyZ2VkRGF0ZVBpY2tlcjtcbn1cbmV4cG9ydCBkZWZhdWx0IGdlbmVyYXRlUGlja2VyOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi4vX3V0aWwvd2FybmluZyc7XG52YXIgRGl2aWRlciA9IGZ1bmN0aW9uIERpdmlkZXIocHJvcHMpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICBkaXJlY3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb247XG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgX3Byb3BzJHR5cGUgPSBwcm9wcy50eXBlLFxuICAgIHR5cGUgPSBfcHJvcHMkdHlwZSA9PT0gdm9pZCAwID8gJ2hvcml6b250YWwnIDogX3Byb3BzJHR5cGUsXG4gICAgX3Byb3BzJG9yaWVudGF0aW9uID0gcHJvcHMub3JpZW50YXRpb24sXG4gICAgb3JpZW50YXRpb24gPSBfcHJvcHMkb3JpZW50YXRpb24gPT09IHZvaWQgMCA/ICdjZW50ZXInIDogX3Byb3BzJG9yaWVudGF0aW9uLFxuICAgIG9yaWVudGF0aW9uTWFyZ2luID0gcHJvcHMub3JpZW50YXRpb25NYXJnaW4sXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgZGFzaGVkID0gcHJvcHMuZGFzaGVkLFxuICAgIHBsYWluID0gcHJvcHMucGxhaW4sXG4gICAgcmVzdFByb3BzID0gX19yZXN0KHByb3BzLCBbXCJwcmVmaXhDbHNcIiwgXCJ0eXBlXCIsIFwib3JpZW50YXRpb25cIiwgXCJvcmllbnRhdGlvbk1hcmdpblwiLCBcImNsYXNzTmFtZVwiLCBcImNoaWxkcmVuXCIsIFwiZGFzaGVkXCIsIFwicGxhaW5cIl0pO1xuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdkaXZpZGVyJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIG9yaWVudGF0aW9uUHJlZml4ID0gb3JpZW50YXRpb24ubGVuZ3RoID4gMCA/IFwiLVwiLmNvbmNhdChvcmllbnRhdGlvbikgOiBvcmllbnRhdGlvbjtcbiAgdmFyIGhhc0NoaWxkcmVuID0gISFjaGlsZHJlbjtcbiAgdmFyIGhhc0N1c3RvbU1hcmdpbkxlZnQgPSBvcmllbnRhdGlvbiA9PT0gJ2xlZnQnICYmIG9yaWVudGF0aW9uTWFyZ2luICE9IG51bGw7XG4gIHZhciBoYXNDdXN0b21NYXJnaW5SaWdodCA9IG9yaWVudGF0aW9uID09PSAncmlnaHQnICYmIG9yaWVudGF0aW9uTWFyZ2luICE9IG51bGw7XG4gIHZhciBjbGFzc1N0cmluZyA9IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQodHlwZSksIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd2l0aC10ZXh0XCIpLCBoYXNDaGlsZHJlbiksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi13aXRoLXRleHRcIikuY29uY2F0KG9yaWVudGF0aW9uUHJlZml4KSwgaGFzQ2hpbGRyZW4pLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGFzaGVkXCIpLCAhIWRhc2hlZCksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wbGFpblwiKSwgISFwbGFpbiksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbm8tZGVmYXVsdC1vcmllbnRhdGlvbi1tYXJnaW4tbGVmdFwiKSwgaGFzQ3VzdG9tTWFyZ2luTGVmdCksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1uby1kZWZhdWx0LW9yaWVudGF0aW9uLW1hcmdpbi1yaWdodFwiKSwgaGFzQ3VzdG9tTWFyZ2luUmlnaHQpLCBfY2xhc3NOYW1lcyksIGNsYXNzTmFtZSk7XG4gIHZhciBpbm5lclN0eWxlID0gX2V4dGVuZHMoX2V4dGVuZHMoe30sIGhhc0N1c3RvbU1hcmdpbkxlZnQgJiYge1xuICAgIG1hcmdpbkxlZnQ6IG9yaWVudGF0aW9uTWFyZ2luXG4gIH0pLCBoYXNDdXN0b21NYXJnaW5SaWdodCAmJiB7XG4gICAgbWFyZ2luUmlnaHQ6IG9yaWVudGF0aW9uTWFyZ2luXG4gIH0pO1xuICAvLyBXYXJuaW5nIGNoaWxkcmVuIG5vdCB3b3JrIGluIHZlcnRpY2FsIG1vZGVcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCFjaGlsZHJlbiB8fCB0eXBlICE9PSAndmVydGljYWwnLCAnRGl2aWRlcicsICdgY2hpbGRyZW5gIG5vdCB3b3JraW5nIGluIGB2ZXJ0aWNhbGAgbW9kZS4nKSA6IHZvaWQgMDtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xhc3NTdHJpbmdcbiAgfSwgcmVzdFByb3BzLCB7XG4gICAgcm9sZTogXCJzZXBhcmF0b3JcIlxuICB9KSwgY2hpbGRyZW4gJiYgdHlwZSAhPT0gJ3ZlcnRpY2FsJyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbm5lci10ZXh0XCIpLFxuICAgIHN0eWxlOiBpbm5lclN0eWxlXG4gIH0sIGNoaWxkcmVuKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgRGl2aWRlcjsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgT3JkZXJDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5leHBvcnQgZGVmYXVsdCBPcmRlckNvbnRleHQ7IiwiaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZUxheW91dEVmZmVjdCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCBjYW5Vc2VEb20gZnJvbSBcInJjLXV0aWwvZXMvRG9tL2NhblVzZURvbVwiO1xuaW1wb3J0IE9yZGVyQ29udGV4dCBmcm9tIFwiLi9Db250ZXh0XCI7XG52YXIgRU1QVFlfTElTVCA9IFtdO1xuXG4vKipcbiAqIFdpbGwgYWRkIGBkaXZgIHRvIGRvY3VtZW50LiBOZXN0IGNhbGwgd2lsbCBrZWVwIG9yZGVyXG4gKiBAcGFyYW0gcmVuZGVyIFJlbmRlciBET00gaW4gZG9jdW1lbnRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlRG9tKHJlbmRlciwgZGVidWcpIHtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghY2FuVXNlRG9tKCkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICB2YXIgZGVmYXVsdEVsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgZGVidWcpIHtcbiAgICAgICAgZGVmYXVsdEVsZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtZGVidWcnLCBkZWJ1Zyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVmYXVsdEVsZTtcbiAgICB9KSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAxKSxcbiAgICBlbGUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IE9yZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBhcHBlbmRlZFJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIHZhciBxdWV1ZUNyZWF0ZSA9IFJlYWN0LnVzZUNvbnRleHQoT3JkZXJDb250ZXh0KTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTMgPSBSZWFjdC51c2VTdGF0ZShFTVBUWV9MSVNUKSxcbiAgICBfUmVhY3QkdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlMywgMiksXG4gICAgcXVldWUgPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgIHNldFF1ZXVlID0gX1JlYWN0JHVzZVN0YXRlNFsxXTtcbiAgdmFyIG1lcmdlZFF1ZXVlQ3JlYXRlID0gcXVldWVDcmVhdGUgfHwgKGFwcGVuZGVkUmVmLmN1cnJlbnQgPyB1bmRlZmluZWQgOiBmdW5jdGlvbiAoYXBwZW5kRm4pIHtcbiAgICBzZXRRdWV1ZShmdW5jdGlvbiAob3JpZ2luKSB7XG4gICAgICB2YXIgbmV3UXVldWUgPSBbYXBwZW5kRm5dLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkob3JpZ2luKSk7XG4gICAgICByZXR1cm4gbmV3UXVldWU7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBET00gPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGZ1bmN0aW9uIGFwcGVuZCgpIHtcbiAgICBpZiAoIWVsZS5wYXJlbnRFbGVtZW50KSB7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsZSk7XG4gICAgfVxuICAgIGFwcGVuZGVkUmVmLmN1cnJlbnQgPSB0cnVlO1xuICB9XG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgdmFyIF9lbGUkcGFyZW50RWxlbWVudDtcbiAgICAoX2VsZSRwYXJlbnRFbGVtZW50ID0gZWxlLnBhcmVudEVsZW1lbnQpID09PSBudWxsIHx8IF9lbGUkcGFyZW50RWxlbWVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2VsZSRwYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGVsZSk7XG4gICAgYXBwZW5kZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuICB9XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHJlbmRlcikge1xuICAgICAgaWYgKHF1ZXVlQ3JlYXRlKSB7XG4gICAgICAgIHF1ZXVlQ3JlYXRlKGFwcGVuZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcHBlbmQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY2xlYW51cCgpO1xuICAgIH1cbiAgICByZXR1cm4gY2xlYW51cDtcbiAgfSwgW3JlbmRlcl0pO1xuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgIHF1ZXVlLmZvckVhY2goZnVuY3Rpb24gKGFwcGVuZEZuKSB7XG4gICAgICAgIHJldHVybiBhcHBlbmRGbigpO1xuICAgICAgfSk7XG4gICAgICBzZXRRdWV1ZShFTVBUWV9MSVNUKTtcbiAgICB9XG4gIH0sIFtxdWV1ZV0pO1xuICByZXR1cm4gW2VsZSwgbWVyZ2VkUXVldWVDcmVhdGVdO1xufSIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXG5cbnZhciBjYWNoZWQ7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRTY3JvbGxCYXJTaXplKGZyZXNoKSB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgaWYgKGZyZXNoIHx8IGNhY2hlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGlubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgaW5uZXIuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgaW5uZXIuc3R5bGUuaGVpZ2h0ID0gJzIwMHB4JztcbiAgICB2YXIgb3V0ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB2YXIgb3V0ZXJTdHlsZSA9IG91dGVyLnN0eWxlO1xuICAgIG91dGVyU3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIG91dGVyU3R5bGUudG9wID0gJzAnO1xuICAgIG91dGVyU3R5bGUubGVmdCA9ICcwJztcbiAgICBvdXRlclN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gICAgb3V0ZXJTdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgb3V0ZXJTdHlsZS53aWR0aCA9ICcyMDBweCc7XG4gICAgb3V0ZXJTdHlsZS5oZWlnaHQgPSAnMTUwcHgnO1xuICAgIG91dGVyU3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICBvdXRlci5hcHBlbmRDaGlsZChpbm5lcik7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChvdXRlcik7XG4gICAgdmFyIHdpZHRoQ29udGFpbmVkID0gaW5uZXIub2Zmc2V0V2lkdGg7XG4gICAgb3V0ZXIuc3R5bGUub3ZlcmZsb3cgPSAnc2Nyb2xsJztcbiAgICB2YXIgd2lkdGhTY3JvbGwgPSBpbm5lci5vZmZzZXRXaWR0aDtcbiAgICBpZiAod2lkdGhDb250YWluZWQgPT09IHdpZHRoU2Nyb2xsKSB7XG4gICAgICB3aWR0aFNjcm9sbCA9IG91dGVyLmNsaWVudFdpZHRoO1xuICAgIH1cbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKG91dGVyKTtcbiAgICBjYWNoZWQgPSB3aWR0aENvbnRhaW5lZCAtIHdpZHRoU2Nyb2xsO1xuICB9XG4gIHJldHVybiBjYWNoZWQ7XG59XG5mdW5jdGlvbiBlbnN1cmVTaXplKHN0cikge1xuICB2YXIgbWF0Y2ggPSBzdHIubWF0Y2goL14oLiopcHgkLyk7XG4gIHZhciB2YWx1ZSA9IE51bWJlcihtYXRjaCA9PT0gbnVsbCB8fCBtYXRjaCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbWF0Y2hbMV0pO1xuICByZXR1cm4gTnVtYmVyLmlzTmFOKHZhbHVlKSA/IGdldFNjcm9sbEJhclNpemUoKSA6IHZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhcmdldFNjcm9sbEJhclNpemUodGFyZ2V0KSB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8ICF0YXJnZXQgfHwgISh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50KSkge1xuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogMCxcbiAgICAgIGhlaWdodDogMFxuICAgIH07XG4gIH1cbiAgdmFyIF9nZXRDb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQsICc6Oi13ZWJraXQtc2Nyb2xsYmFyJyksXG4gICAgd2lkdGggPSBfZ2V0Q29tcHV0ZWRTdHlsZS53aWR0aCxcbiAgICBoZWlnaHQgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5oZWlnaHQ7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IGVuc3VyZVNpemUod2lkdGgpLFxuICAgIGhlaWdodDogZW5zdXJlU2l6ZShoZWlnaHQpXG4gIH07XG59IiwiLyoqXG4gKiBUZXN0IHVzYWdlIGV4cG9ydC4gRG8gbm90IHVzZSBpbiB5b3VyIHByb2R1Y3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQm9keU92ZXJmbG93aW5nKCkge1xuICByZXR1cm4gZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQgPiAod2luZG93LmlubmVySGVpZ2h0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpICYmIHdpbmRvdy5pbm5lcldpZHRoID4gZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aDtcbn0iLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVwZGF0ZUNTUywgcmVtb3ZlQ1NTIH0gZnJvbSBcInJjLXV0aWwvZXMvRG9tL2R5bmFtaWNDU1NcIjtcbmltcG9ydCB1c2VMYXlvdXRFZmZlY3QgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTGF5b3V0RWZmZWN0XCI7XG5pbXBvcnQgZ2V0U2Nyb2xsQmFyU2l6ZSBmcm9tIFwicmMtdXRpbC9lcy9nZXRTY3JvbGxCYXJTaXplXCI7XG5pbXBvcnQgeyBpc0JvZHlPdmVyZmxvd2luZyB9IGZyb20gXCIuL3V0aWxcIjtcbnZhciBVTklRVUVfSUQgPSBcInJjLXV0aWwtbG9ja2VyLVwiLmNvbmNhdChEYXRlLm5vdygpKTtcbnZhciB1dWlkID0gMDtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVNjcm9sbExvY2tlcihsb2NrKSB7XG4gIHZhciBtZXJnZWRMb2NrID0gISFsb2NrO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgdXVpZCArPSAxO1xuICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KFVOSVFVRV9JRCwgXCJfXCIpLmNvbmNhdCh1dWlkKTtcbiAgICB9KSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAxKSxcbiAgICBpZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMF07XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG1lcmdlZExvY2spIHtcbiAgICAgIHZhciBzY3JvbGxiYXJTaXplID0gZ2V0U2Nyb2xsQmFyU2l6ZSgpO1xuICAgICAgdmFyIGlzT3ZlcmZsb3cgPSBpc0JvZHlPdmVyZmxvd2luZygpO1xuICAgICAgdXBkYXRlQ1NTKFwiXFxuaHRtbCBib2R5IHtcXG4gIG92ZXJmbG93LXk6IGhpZGRlbjtcXG4gIFwiLmNvbmNhdChpc092ZXJmbG93ID8gXCJ3aWR0aDogY2FsYygxMDAlIC0gXCIuY29uY2F0KHNjcm9sbGJhclNpemUsIFwicHgpO1wiKSA6ICcnLCBcIlxcbn1cIiksIGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVtb3ZlQ1NTKGlkKTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlbW92ZUNTUyhpZCk7XG4gICAgfTtcbiAgfSwgW21lcmdlZExvY2ssIGlkXSk7XG59IiwiZXhwb3J0IHZhciBpbmxpbmUgPSBmYWxzZTtcbmV4cG9ydCBmdW5jdGlvbiBpbmxpbmVNb2NrKG5leHRJbmxpbmUpIHtcbiAgaWYgKHR5cGVvZiBuZXh0SW5saW5lID09PSAnYm9vbGVhbicpIHtcbiAgICBpbmxpbmUgPSBuZXh0SW5saW5lO1xuICB9XG4gIHJldHVybiBpbmxpbmU7XG59IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjcmVhdGVQb3J0YWwgfSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IGNhblVzZURvbSBmcm9tIFwicmMtdXRpbC9lcy9Eb20vY2FuVXNlRG9tXCI7XG5pbXBvcnQgd2FybmluZyBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5pbXBvcnQgeyBzdXBwb3J0UmVmLCB1c2VDb21wb3NlUmVmIH0gZnJvbSBcInJjLXV0aWwvZXMvcmVmXCI7XG5pbXBvcnQgT3JkZXJDb250ZXh0IGZyb20gXCIuL0NvbnRleHRcIjtcbmltcG9ydCB1c2VEb20gZnJvbSBcIi4vdXNlRG9tXCI7XG5pbXBvcnQgdXNlU2Nyb2xsTG9ja2VyIGZyb20gXCIuL3VzZVNjcm9sbExvY2tlclwiO1xuaW1wb3J0IHsgaW5saW5lTW9jayB9IGZyb20gXCIuL21vY2tcIjtcbnZhciBnZXRQb3J0YWxDb250YWluZXIgPSBmdW5jdGlvbiBnZXRQb3J0YWxDb250YWluZXIoZ2V0Q29udGFpbmVyKSB7XG4gIGlmIChnZXRDb250YWluZXIgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICghY2FuVXNlRG9tKCkgfHwgIWdldENvbnRhaW5lcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmICh0eXBlb2YgZ2V0Q29udGFpbmVyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGdldENvbnRhaW5lcik7XG4gIH1cbiAgaWYgKHR5cGVvZiBnZXRDb250YWluZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZ2V0Q29udGFpbmVyKCk7XG4gIH1cbiAgcmV0dXJuIGdldENvbnRhaW5lcjtcbn07XG52YXIgUG9ydGFsID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIG9wZW4gPSBwcm9wcy5vcGVuLFxuICAgIGF1dG9Mb2NrID0gcHJvcHMuYXV0b0xvY2ssXG4gICAgZ2V0Q29udGFpbmVyID0gcHJvcHMuZ2V0Q29udGFpbmVyLFxuICAgIGRlYnVnID0gcHJvcHMuZGVidWcsXG4gICAgX3Byb3BzJGF1dG9EZXN0cm95ID0gcHJvcHMuYXV0b0Rlc3Ryb3ksXG4gICAgYXV0b0Rlc3Ryb3kgPSBfcHJvcHMkYXV0b0Rlc3Ryb3kgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkYXV0b0Rlc3Ryb3ksXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbjtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKG9wZW4pLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIHNob3VsZFJlbmRlciA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0U2hvdWxkUmVuZGVyID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIG1lcmdlZFJlbmRlciA9IHNob3VsZFJlbmRlciB8fCBvcGVuO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gV2FybmluZyA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgd2FybmluZyhjYW5Vc2VEb20oKSB8fCAhb3BlbiwgXCJQb3J0YWwgb25seSB3b3JrIGluIGNsaWVudCBzaWRlLiBQbGVhc2UgY2FsbCAndXNlRWZmZWN0JyB0byBzaG93IFBvcnRhbCBpbnN0ZWFkIGRlZmF1bHQgcmVuZGVyIGluIFNTUi5cIik7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IFNob3VsZCBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PVxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChhdXRvRGVzdHJveSB8fCBvcGVuKSB7XG4gICAgICBzZXRTaG91bGRSZW5kZXIob3Blbik7XG4gICAgfVxuICB9LCBbb3BlbiwgYXV0b0Rlc3Ryb3ldKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gQ29udGFpbmVyID09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnZXRQb3J0YWxDb250YWluZXIoZ2V0Q29udGFpbmVyKTtcbiAgICB9KSxcbiAgICBfUmVhY3QkdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlMywgMiksXG4gICAgaW5uZXJDb250YWluZXIgPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgIHNldElubmVyQ29udGFpbmVyID0gX1JlYWN0JHVzZVN0YXRlNFsxXTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY3VzdG9taXplQ29udGFpbmVyID0gZ2V0UG9ydGFsQ29udGFpbmVyKGdldENvbnRhaW5lcik7XG5cbiAgICAvLyBUZWxsIGNvbXBvbmVudCB0aGF0IHdlIGNoZWNrIHRoaXMgaW4gZWZmZWN0IHdoaWNoIGlzIHNhZmUgdG8gYmUgYG51bGxgXG4gICAgc2V0SW5uZXJDb250YWluZXIoY3VzdG9taXplQ29udGFpbmVyICE9PSBudWxsICYmIGN1c3RvbWl6ZUNvbnRhaW5lciAhPT0gdm9pZCAwID8gY3VzdG9taXplQ29udGFpbmVyIDogbnVsbCk7XG4gIH0pO1xuICB2YXIgX3VzZURvbSA9IHVzZURvbShtZXJnZWRSZW5kZXIgJiYgIWlubmVyQ29udGFpbmVyLCBkZWJ1ZyksXG4gICAgX3VzZURvbTIgPSBfc2xpY2VkVG9BcnJheShfdXNlRG9tLCAyKSxcbiAgICBkZWZhdWx0Q29udGFpbmVyID0gX3VzZURvbTJbMF0sXG4gICAgcXVldWVDcmVhdGUgPSBfdXNlRG9tMlsxXTtcbiAgdmFyIG1lcmdlZENvbnRhaW5lciA9IGlubmVyQ29udGFpbmVyICE9PSBudWxsICYmIGlubmVyQ29udGFpbmVyICE9PSB2b2lkIDAgPyBpbm5lckNvbnRhaW5lciA6IGRlZmF1bHRDb250YWluZXI7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBMb2NrZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdXNlU2Nyb2xsTG9ja2VyKGF1dG9Mb2NrICYmIG9wZW4gJiYgY2FuVXNlRG9tKCkgJiYgKG1lcmdlZENvbnRhaW5lciA9PT0gZGVmYXVsdENvbnRhaW5lciB8fCBtZXJnZWRDb250YWluZXIgPT09IGRvY3VtZW50LmJvZHkpKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVmID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgY2hpbGRSZWYgPSBudWxsO1xuICBpZiAoY2hpbGRyZW4gJiYgc3VwcG9ydFJlZihjaGlsZHJlbikgJiYgcmVmKSB7XG4gICAgdmFyIF9yZWYgPSBjaGlsZHJlbjtcbiAgICBjaGlsZFJlZiA9IF9yZWYucmVmO1xuICB9XG4gIHZhciBtZXJnZWRSZWYgPSB1c2VDb21wb3NlUmVmKGNoaWxkUmVmLCByZWYpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIERvIG5vdCByZW5kZXIgd2hlbiBub3RoaW5nIG5lZWQgcmVuZGVyXG4gIC8vIFdoZW4gaW5uZXJDb250YWluZXIgaXMgYHVuZGVmaW5lZGAsIGl0IG1heSBub3QgcmVhZHkgc2luY2UgdXNlciB1c2UgcmVmIGluIHRoZSBzYW1lIHJlbmRlclxuICBpZiAoIW1lcmdlZFJlbmRlciB8fCAhY2FuVXNlRG9tKCkgfHwgaW5uZXJDb250YWluZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gUmVuZGVyIGlubGluZVxuICB2YXIgcmVuZGVySW5saW5lID0gbWVyZ2VkQ29udGFpbmVyID09PSBmYWxzZSB8fCBpbmxpbmVNb2NrKCk7XG4gIHZhciByZWZmZWRDaGlsZHJlbiA9IGNoaWxkcmVuO1xuICBpZiAocmVmKSB7XG4gICAgcmVmZmVkQ2hpbGRyZW4gPSAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkcmVuLCB7XG4gICAgICByZWY6IG1lcmdlZFJlZlxuICAgIH0pO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChPcmRlckNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogcXVldWVDcmVhdGVcbiAgfSwgcmVuZGVySW5saW5lID8gcmVmZmVkQ2hpbGRyZW4gOiAvKiNfX1BVUkVfXyovY3JlYXRlUG9ydGFsKHJlZmZlZENoaWxkcmVuLCBtZXJnZWRDb250YWluZXIpKTtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUG9ydGFsLmRpc3BsYXlOYW1lID0gJ1BvcnRhbCc7XG59XG5leHBvcnQgZGVmYXVsdCBQb3J0YWw7IiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xudmFyIERyYXdlclBhbmVsID0gZnVuY3Rpb24gRHJhd2VyUGFuZWwocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIGNvbnRhaW5lclJlZiA9IHByb3BzLmNvbnRhaW5lclJlZjtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50XCIpLCBjbGFzc05hbWUpLFxuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksXG4gICAgXCJhcmlhLW1vZGFsXCI6IFwidHJ1ZVwiLFxuICAgIHJvbGU6IFwiZGlhbG9nXCIsXG4gICAgcmVmOiBjb250YWluZXJSZWZcbiAgfSwgY2hpbGRyZW4pKTtcbn07XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBEcmF3ZXJQYW5lbC5kaXNwbGF5TmFtZSA9ICdEcmF3ZXJQYW5lbCc7XG59XG5leHBvcnQgZGVmYXVsdCBEcmF3ZXJQYW5lbDsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgRHJhd2VyQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuZXhwb3J0IGRlZmF1bHQgRHJhd2VyQ29udGV4dDsiLCJpbXBvcnQgd2FybmluZyBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5pbXBvcnQgY2FuVXNlRG9tIGZyb20gXCJyYy11dGlsL2VzL0RvbS9jYW5Vc2VEb21cIjtcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVdpZHRoSGVpZ2h0KHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIFN0cmluZyhOdW1iZXIodmFsdWUpKSA9PT0gdmFsdWUpIHtcbiAgICB3YXJuaW5nKGZhbHNlLCAnSW52YWxpZCB2YWx1ZSB0eXBlIG9mIGB3aWR0aGAgb3IgYGhlaWdodGAgd2hpY2ggc2hvdWxkIGJlIG51bWJlciB0eXBlIGluc3RlYWQuJyk7XG4gICAgcmV0dXJuIE51bWJlcih2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdhcm5DaGVjayhwcm9wcykge1xuICB3YXJuaW5nKCEoJ3dyYXBwZXJDbGFzc05hbWUnIGluIHByb3BzKSwgXCInd3JhcHBlckNsYXNzTmFtZScgaXMgcmVtb3ZlZC4gUGxlYXNlIHVzZSAncm9vdENsYXNzTmFtZScgaW5zdGVhZC5cIik7XG4gIHdhcm5pbmcoY2FuVXNlRG9tKCkgfHwgIXByb3BzLm9wZW4sIFwiRHJhd2VyIHdpdGggJ29wZW4nIGluIFNTUiBpcyBub3Qgd29yayBzaW5jZSBubyBwbGFjZSB0byBjcmVhdGVQb3J0YWwuIFBsZWFzZSBtb3ZlIHRvICd1c2VFZmZlY3QnIGluc3RlYWQuXCIpO1xufSIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IENTU01vdGlvbiBmcm9tICdyYy1tb3Rpb24nO1xuaW1wb3J0IERyYXdlclBhbmVsIGZyb20gJy4vRHJhd2VyUGFuZWwnO1xuaW1wb3J0IERyYXdlckNvbnRleHQgZnJvbSAnLi9jb250ZXh0JztcbmltcG9ydCBLZXlDb2RlIGZyb20gXCJyYy11dGlsL2VzL0tleUNvZGVcIjtcbmltcG9ydCB7IHBhcnNlV2lkdGhIZWlnaHQgfSBmcm9tICcuL3V0aWwnO1xudmFyIHNlbnRpbmVsU3R5bGUgPSB7XG4gIHdpZHRoOiAwLFxuICBoZWlnaHQ6IDAsXG4gIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgb3V0bGluZTogJ25vbmUnLFxuICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xufTtcbmZ1bmN0aW9uIERyYXdlclBvcHVwKHByb3BzLCByZWYpIHtcbiAgdmFyIF9yZWYsIF9wdXNoQ29uZmlnJGRpc3RhbmNlLCBfcHVzaENvbmZpZywgX2NsYXNzTmFtZXM7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgb3BlbiA9IHByb3BzLm9wZW4sXG4gICAgcGxhY2VtZW50ID0gcHJvcHMucGxhY2VtZW50LFxuICAgIGlubGluZSA9IHByb3BzLmlubGluZSxcbiAgICBwdXNoID0gcHJvcHMucHVzaCxcbiAgICBmb3JjZVJlbmRlciA9IHByb3BzLmZvcmNlUmVuZGVyLFxuICAgIGF1dG9Gb2N1cyA9IHByb3BzLmF1dG9Gb2N1cyxcbiAgICBrZXlib2FyZCA9IHByb3BzLmtleWJvYXJkLFxuICAgIHJvb3RDbGFzc05hbWUgPSBwcm9wcy5yb290Q2xhc3NOYW1lLFxuICAgIHJvb3RTdHlsZSA9IHByb3BzLnJvb3RTdHlsZSxcbiAgICB6SW5kZXggPSBwcm9wcy56SW5kZXgsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgbW90aW9uID0gcHJvcHMubW90aW9uLFxuICAgIHdpZHRoID0gcHJvcHMud2lkdGgsXG4gICAgaGVpZ2h0ID0gcHJvcHMuaGVpZ2h0LFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgY29udGVudFdyYXBwZXJTdHlsZSA9IHByb3BzLmNvbnRlbnRXcmFwcGVyU3R5bGUsXG4gICAgbWFzayA9IHByb3BzLm1hc2ssXG4gICAgbWFza0Nsb3NhYmxlID0gcHJvcHMubWFza0Nsb3NhYmxlLFxuICAgIG1hc2tNb3Rpb24gPSBwcm9wcy5tYXNrTW90aW9uLFxuICAgIG1hc2tDbGFzc05hbWUgPSBwcm9wcy5tYXNrQ2xhc3NOYW1lLFxuICAgIG1hc2tTdHlsZSA9IHByb3BzLm1hc2tTdHlsZSxcbiAgICBhZnRlck9wZW5DaGFuZ2UgPSBwcm9wcy5hZnRlck9wZW5DaGFuZ2UsXG4gICAgb25DbG9zZSA9IHByb3BzLm9uQ2xvc2U7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlZnMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHBhbmVsUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciBzZW50aW5lbFN0YXJ0UmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciBzZW50aW5lbEVuZFJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBwYW5lbFJlZi5jdXJyZW50O1xuICB9KTtcbiAgdmFyIG9uUGFuZWxLZXlEb3duID0gZnVuY3Rpb24gb25QYW5lbEtleURvd24oZXZlbnQpIHtcbiAgICB2YXIga2V5Q29kZSA9IGV2ZW50LmtleUNvZGUsXG4gICAgICBzaGlmdEtleSA9IGV2ZW50LnNoaWZ0S2V5O1xuICAgIHN3aXRjaCAoa2V5Q29kZSkge1xuICAgICAgLy8gVGFiIGFjdGl2ZVxuICAgICAgY2FzZSBLZXlDb2RlLlRBQjpcbiAgICAgICAge1xuICAgICAgICAgIGlmIChrZXlDb2RlID09PSBLZXlDb2RlLlRBQikge1xuICAgICAgICAgICAgaWYgKCFzaGlmdEtleSAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBzZW50aW5lbEVuZFJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgICAgIHZhciBfc2VudGluZWxTdGFydFJlZiRjdXI7XG4gICAgICAgICAgICAgIChfc2VudGluZWxTdGFydFJlZiRjdXIgPSBzZW50aW5lbFN0YXJ0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9zZW50aW5lbFN0YXJ0UmVmJGN1ciA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3NlbnRpbmVsU3RhcnRSZWYkY3VyLmZvY3VzKHtcbiAgICAgICAgICAgICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGlmdEtleSAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBzZW50aW5lbFN0YXJ0UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgdmFyIF9zZW50aW5lbEVuZFJlZiRjdXJyZTtcbiAgICAgICAgICAgICAgKF9zZW50aW5lbEVuZFJlZiRjdXJyZSA9IHNlbnRpbmVsRW5kUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9zZW50aW5lbEVuZFJlZiRjdXJyZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3NlbnRpbmVsRW5kUmVmJGN1cnJlLmZvY3VzKHtcbiAgICAgICAgICAgICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgLy8gQ2xvc2VcbiAgICAgIGNhc2UgS2V5Q29kZS5FU0M6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAob25DbG9zZSAmJiBrZXlib2FyZCkge1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBvbkNsb3NlKGV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gIH07XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IENvbnRyb2wgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEF1dG8gRm9jdXNcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAob3BlbiAmJiBhdXRvRm9jdXMpIHtcbiAgICAgIHZhciBfcGFuZWxSZWYkY3VycmVudDtcbiAgICAgIChfcGFuZWxSZWYkY3VycmVudCA9IHBhbmVsUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9wYW5lbFJlZiRjdXJyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfcGFuZWxSZWYkY3VycmVudC5mb2N1cyh7XG4gICAgICAgIHByZXZlbnRTY3JvbGw6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgW29wZW5dKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBQdXNoID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBwdXNoZWQgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldFB1c2hlZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBwYXJlbnRDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChEcmF3ZXJDb250ZXh0KTtcbiAgLy8gTWVyZ2UgcHVzaCBkaXN0YW5jZVxuICB2YXIgcHVzaENvbmZpZztcbiAgaWYgKHB1c2ggPT09IGZhbHNlKSB7XG4gICAgcHVzaENvbmZpZyA9IHtcbiAgICAgIGRpc3RhbmNlOiAwXG4gICAgfTtcbiAgfSBlbHNlIGlmIChwdXNoID09PSB0cnVlKSB7XG4gICAgcHVzaENvbmZpZyA9IHt9O1xuICB9IGVsc2Uge1xuICAgIHB1c2hDb25maWcgPSBwdXNoIHx8IHt9O1xuICB9XG4gIHZhciBwdXNoRGlzdGFuY2UgPSAoX3JlZiA9IChfcHVzaENvbmZpZyRkaXN0YW5jZSA9IChfcHVzaENvbmZpZyA9IHB1c2hDb25maWcpID09PSBudWxsIHx8IF9wdXNoQ29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfcHVzaENvbmZpZy5kaXN0YW5jZSkgIT09IG51bGwgJiYgX3B1c2hDb25maWckZGlzdGFuY2UgIT09IHZvaWQgMCA/IF9wdXNoQ29uZmlnJGRpc3RhbmNlIDogcGFyZW50Q29udGV4dCA9PT0gbnVsbCB8fCBwYXJlbnRDb250ZXh0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJlbnRDb250ZXh0LnB1c2hEaXN0YW5jZSkgIT09IG51bGwgJiYgX3JlZiAhPT0gdm9pZCAwID8gX3JlZiA6IDE4MDtcbiAgdmFyIG1lcmdlZENvbnRleHQgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHVzaERpc3RhbmNlOiBwdXNoRGlzdGFuY2UsXG4gICAgICBwdXNoOiBmdW5jdGlvbiBwdXNoKCkge1xuICAgICAgICBzZXRQdXNoZWQodHJ1ZSk7XG4gICAgICB9LFxuICAgICAgcHVsbDogZnVuY3Rpb24gcHVsbCgpIHtcbiAgICAgICAgc2V0UHVzaGVkKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBbcHVzaERpc3RhbmNlXSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gU2Nyb2xsTG9jayA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFRlbGwgcGFyZW50IHRvIHB1c2hcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAob3Blbikge1xuICAgICAgdmFyIF9wYXJlbnRDb250ZXh0JHB1c2g7XG4gICAgICBwYXJlbnRDb250ZXh0ID09PSBudWxsIHx8IHBhcmVudENvbnRleHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfcGFyZW50Q29udGV4dCRwdXNoID0gcGFyZW50Q29udGV4dC5wdXNoKSA9PT0gbnVsbCB8fCBfcGFyZW50Q29udGV4dCRwdXNoID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfcGFyZW50Q29udGV4dCRwdXNoLmNhbGwocGFyZW50Q29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfcGFyZW50Q29udGV4dCRwdWxsO1xuICAgICAgcGFyZW50Q29udGV4dCA9PT0gbnVsbCB8fCBwYXJlbnRDb250ZXh0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX3BhcmVudENvbnRleHQkcHVsbCA9IHBhcmVudENvbnRleHQucHVsbCkgPT09IG51bGwgfHwgX3BhcmVudENvbnRleHQkcHVsbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3BhcmVudENvbnRleHQkcHVsbC5jYWxsKHBhcmVudENvbnRleHQpO1xuICAgIH1cbiAgfSwgW29wZW5dKTtcbiAgLy8gQ2xlYW4gdXBcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9wYXJlbnRDb250ZXh0JHB1bGwyO1xuICAgICAgcGFyZW50Q29udGV4dCA9PT0gbnVsbCB8fCBwYXJlbnRDb250ZXh0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX3BhcmVudENvbnRleHQkcHVsbDIgPSBwYXJlbnRDb250ZXh0LnB1bGwpID09PSBudWxsIHx8IF9wYXJlbnRDb250ZXh0JHB1bGwyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfcGFyZW50Q29udGV4dCRwdWxsMi5jYWxsKHBhcmVudENvbnRleHQpO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBNYXNrID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG1hc2tOb2RlID0gbWFzayAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDU1NNb3Rpb24sIF9leHRlbmRzKHtcbiAgICBrZXk6IFwibWFza1wiXG4gIH0sIG1hc2tNb3Rpb24sIHtcbiAgICB2aXNpYmxlOiBvcGVuXG4gIH0pLCBmdW5jdGlvbiAoX3JlZjIsIG1hc2tSZWYpIHtcbiAgICB2YXIgbW90aW9uTWFza0NsYXNzTmFtZSA9IF9yZWYyLmNsYXNzTmFtZSxcbiAgICAgIG1vdGlvbk1hc2tTdHlsZSA9IF9yZWYyLnN0eWxlO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1tYXNrXCIpLCBtb3Rpb25NYXNrQ2xhc3NOYW1lLCBtYXNrQ2xhc3NOYW1lKSxcbiAgICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG1vdGlvbk1hc2tTdHlsZSksIG1hc2tTdHlsZSksXG4gICAgICBvbkNsaWNrOiBtYXNrQ2xvc2FibGUgJiYgb3BlbiA/IG9uQ2xvc2UgOiB1bmRlZmluZWQsXG4gICAgICByZWY6IG1hc2tSZWZcbiAgICB9KTtcbiAgfSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBQYW5lbCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtb3Rpb25Qcm9wcyA9IHR5cGVvZiBtb3Rpb24gPT09ICdmdW5jdGlvbicgPyBtb3Rpb24ocGxhY2VtZW50KSA6IG1vdGlvbjtcbiAgdmFyIHdyYXBwZXJTdHlsZSA9IHt9O1xuICBpZiAocHVzaGVkICYmIHB1c2hEaXN0YW5jZSkge1xuICAgIHN3aXRjaCAocGxhY2VtZW50KSB7XG4gICAgICBjYXNlICd0b3AnOlxuICAgICAgICB3cmFwcGVyU3R5bGUudHJhbnNmb3JtID0gXCJ0cmFuc2xhdGVZKFwiLmNvbmNhdChwdXNoRGlzdGFuY2UsIFwicHgpXCIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgIHdyYXBwZXJTdHlsZS50cmFuc2Zvcm0gPSBcInRyYW5zbGF0ZVkoXCIuY29uY2F0KC1wdXNoRGlzdGFuY2UsIFwicHgpXCIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICB3cmFwcGVyU3R5bGUudHJhbnNmb3JtID0gXCJ0cmFuc2xhdGVYKFwiLmNvbmNhdChwdXNoRGlzdGFuY2UsIFwicHgpXCIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHdyYXBwZXJTdHlsZS50cmFuc2Zvcm0gPSBcInRyYW5zbGF0ZVgoXCIuY29uY2F0KC1wdXNoRGlzdGFuY2UsIFwicHgpXCIpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKHBsYWNlbWVudCA9PT0gJ2xlZnQnIHx8IHBsYWNlbWVudCA9PT0gJ3JpZ2h0Jykge1xuICAgIHdyYXBwZXJTdHlsZS53aWR0aCA9IHBhcnNlV2lkdGhIZWlnaHQod2lkdGgpO1xuICB9IGVsc2Uge1xuICAgIHdyYXBwZXJTdHlsZS5oZWlnaHQgPSBwYXJzZVdpZHRoSGVpZ2h0KGhlaWdodCk7XG4gIH1cbiAgdmFyIHBhbmVsTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENTU01vdGlvbiwgX2V4dGVuZHMoe1xuICAgIGtleTogXCJwYW5lbFwiXG4gIH0sIG1vdGlvblByb3BzLCB7XG4gICAgdmlzaWJsZTogb3BlbixcbiAgICBmb3JjZVJlbmRlcjogZm9yY2VSZW5kZXIsXG4gICAgb25WaXNpYmxlQ2hhbmdlZDogZnVuY3Rpb24gb25WaXNpYmxlQ2hhbmdlZChuZXh0VmlzaWJsZSkge1xuICAgICAgYWZ0ZXJPcGVuQ2hhbmdlID09PSBudWxsIHx8IGFmdGVyT3BlbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogYWZ0ZXJPcGVuQ2hhbmdlKG5leHRWaXNpYmxlKTtcbiAgICB9LFxuICAgIHJlbW92ZU9uTGVhdmU6IGZhbHNlLFxuICAgIGxlYXZlZENsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50LXdyYXBwZXItaGlkZGVuXCIpXG4gIH0pLCBmdW5jdGlvbiAoX3JlZjMsIG1vdGlvblJlZikge1xuICAgIHZhciBtb3Rpb25DbGFzc05hbWUgPSBfcmVmMy5jbGFzc05hbWUsXG4gICAgICBtb3Rpb25TdHlsZSA9IF9yZWYzLnN0eWxlO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50LXdyYXBwZXJcIiksIG1vdGlvbkNsYXNzTmFtZSksXG4gICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHdyYXBwZXJTdHlsZSksIG1vdGlvblN0eWxlKSwgY29udGVudFdyYXBwZXJTdHlsZSlcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEcmF3ZXJQYW5lbCwge1xuICAgICAgY29udGFpbmVyUmVmOiBtb3Rpb25SZWYsXG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgc3R5bGU6IHN0eWxlXG4gICAgfSwgY2hpbGRyZW4pKTtcbiAgfSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBjb250YWluZXJTdHlsZSA9IF9vYmplY3RTcHJlYWQoe30sIHJvb3RTdHlsZSk7XG4gIGlmICh6SW5kZXgpIHtcbiAgICBjb250YWluZXJTdHlsZS56SW5kZXggPSB6SW5kZXg7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERyYXdlckNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogbWVyZ2VkQ29udGV4dFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKHByZWZpeENscywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHBsYWNlbWVudCksIHJvb3RDbGFzc05hbWUsIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItb3BlblwiKSwgb3BlbiksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbmxpbmVcIiksIGlubGluZSksIF9jbGFzc05hbWVzKSksXG4gICAgc3R5bGU6IGNvbnRhaW5lclN0eWxlLFxuICAgIHRhYkluZGV4OiAtMSxcbiAgICByZWY6IHBhbmVsUmVmLFxuICAgIG9uS2V5RG93bjogb25QYW5lbEtleURvd25cbiAgfSwgbWFza05vZGUsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICB0YWJJbmRleDogMCxcbiAgICByZWY6IHNlbnRpbmVsU3RhcnRSZWYsXG4gICAgc3R5bGU6IHNlbnRpbmVsU3R5bGUsXG4gICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIixcbiAgICBcImRhdGEtc2VudGluZWxcIjogXCJzdGFydFwiXG4gIH0pLCBwYW5lbE5vZGUsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICB0YWJJbmRleDogMCxcbiAgICByZWY6IHNlbnRpbmVsRW5kUmVmLFxuICAgIHN0eWxlOiBzZW50aW5lbFN0eWxlLFxuICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCIsXG4gICAgXCJkYXRhLXNlbnRpbmVsXCI6IFwiZW5kXCJcbiAgfSkpKTtcbn1cbnZhciBSZWZEcmF3ZXJQb3B1cCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKERyYXdlclBvcHVwKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFJlZkRyYXdlclBvcHVwLmRpc3BsYXlOYW1lID0gJ0RyYXdlclBvcHVwJztcbn1cbmV4cG9ydCBkZWZhdWx0IFJlZkRyYXdlclBvcHVwOyIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQb3J0YWwgZnJvbSAnQHJjLWNvbXBvbmVudC9wb3J0YWwnO1xuaW1wb3J0IHVzZUxheW91dEVmZmVjdCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCBEcmF3ZXJQb3B1cCBmcm9tICcuL0RyYXdlclBvcHVwJztcbmltcG9ydCB7IHdhcm5DaGVjayB9IGZyb20gJy4vdXRpbCc7XG52YXIgRHJhd2VyID0gZnVuY3Rpb24gRHJhd2VyKHByb3BzKSB7XG4gIHZhciBfcHJvcHMkb3BlbiA9IHByb3BzLm9wZW4sXG4gICAgb3BlbiA9IF9wcm9wcyRvcGVuID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRvcGVuLFxuICAgIF9wcm9wcyRwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgcHJlZml4Q2xzID0gX3Byb3BzJHByZWZpeENscyA9PT0gdm9pZCAwID8gJ3JjLWRyYXdlcicgOiBfcHJvcHMkcHJlZml4Q2xzLFxuICAgIF9wcm9wcyRwbGFjZW1lbnQgPSBwcm9wcy5wbGFjZW1lbnQsXG4gICAgcGxhY2VtZW50ID0gX3Byb3BzJHBsYWNlbWVudCA9PT0gdm9pZCAwID8gJ3JpZ2h0JyA6IF9wcm9wcyRwbGFjZW1lbnQsXG4gICAgX3Byb3BzJGF1dG9Gb2N1cyA9IHByb3BzLmF1dG9Gb2N1cyxcbiAgICBhdXRvRm9jdXMgPSBfcHJvcHMkYXV0b0ZvY3VzID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJGF1dG9Gb2N1cyxcbiAgICBfcHJvcHMka2V5Ym9hcmQgPSBwcm9wcy5rZXlib2FyZCxcbiAgICBrZXlib2FyZCA9IF9wcm9wcyRrZXlib2FyZCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRrZXlib2FyZCxcbiAgICBfcHJvcHMkd2lkdGggPSBwcm9wcy53aWR0aCxcbiAgICB3aWR0aCA9IF9wcm9wcyR3aWR0aCA9PT0gdm9pZCAwID8gMzc4IDogX3Byb3BzJHdpZHRoLFxuICAgIF9wcm9wcyRtYXNrID0gcHJvcHMubWFzayxcbiAgICBtYXNrID0gX3Byb3BzJG1hc2sgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkbWFzayxcbiAgICBfcHJvcHMkbWFza0Nsb3NhYmxlID0gcHJvcHMubWFza0Nsb3NhYmxlLFxuICAgIG1hc2tDbG9zYWJsZSA9IF9wcm9wcyRtYXNrQ2xvc2FibGUgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkbWFza0Nsb3NhYmxlLFxuICAgIGdldENvbnRhaW5lciA9IHByb3BzLmdldENvbnRhaW5lcixcbiAgICBmb3JjZVJlbmRlciA9IHByb3BzLmZvcmNlUmVuZGVyLFxuICAgIGFmdGVyT3BlbkNoYW5nZSA9IHByb3BzLmFmdGVyT3BlbkNoYW5nZSxcbiAgICBkZXN0cm95T25DbG9zZSA9IHByb3BzLmRlc3Ryb3lPbkNsb3NlO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIGFuaW1hdGVkVmlzaWJsZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0QW5pbWF0ZWRWaXNpYmxlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gV2FybiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHdhcm5DaGVjayhwcm9wcyk7XG4gIH1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gT3BlbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKSxcbiAgICBfUmVhY3QkdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlMywgMiksXG4gICAgbW91bnRlZCA9IF9SZWFjdCR1c2VTdGF0ZTRbMF0sXG4gICAgc2V0TW91bnRlZCA9IF9SZWFjdCR1c2VTdGF0ZTRbMV07XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc2V0TW91bnRlZCh0cnVlKTtcbiAgfSwgW10pO1xuICB2YXIgbWVyZ2VkT3BlbiA9IG1vdW50ZWQgPyBvcGVuIDogZmFsc2U7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRm9jdXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHBhbmVsUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciBsYXN0QWN0aXZlUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG1lcmdlZE9wZW4pIHtcbiAgICAgIGxhc3RBY3RpdmVSZWYuY3VycmVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgfVxuICB9LCBbbWVyZ2VkT3Blbl0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBPcGVuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBpbnRlcm5hbEFmdGVyT3BlbkNoYW5nZSA9IGZ1bmN0aW9uIGludGVybmFsQWZ0ZXJPcGVuQ2hhbmdlKG5leHRWaXNpYmxlKSB7XG4gICAgdmFyIF9wYW5lbFJlZiRjdXJyZW50O1xuICAgIHNldEFuaW1hdGVkVmlzaWJsZShuZXh0VmlzaWJsZSk7XG4gICAgYWZ0ZXJPcGVuQ2hhbmdlID09PSBudWxsIHx8IGFmdGVyT3BlbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogYWZ0ZXJPcGVuQ2hhbmdlKG5leHRWaXNpYmxlKTtcbiAgICBpZiAoIW5leHRWaXNpYmxlICYmIGxhc3RBY3RpdmVSZWYuY3VycmVudCAmJiAhKChfcGFuZWxSZWYkY3VycmVudCA9IHBhbmVsUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9wYW5lbFJlZiRjdXJyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfcGFuZWxSZWYkY3VycmVudC5jb250YWlucyhsYXN0QWN0aXZlUmVmLmN1cnJlbnQpKSkge1xuICAgICAgdmFyIF9sYXN0QWN0aXZlUmVmJGN1cnJlbjtcbiAgICAgIChfbGFzdEFjdGl2ZVJlZiRjdXJyZW4gPSBsYXN0QWN0aXZlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9sYXN0QWN0aXZlUmVmJGN1cnJlbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2xhc3RBY3RpdmVSZWYkY3VycmVuLmZvY3VzKHtcbiAgICAgICAgcHJldmVudFNjcm9sbDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGlmICghZm9yY2VSZW5kZXIgJiYgIWFuaW1hdGVkVmlzaWJsZSAmJiAhbWVyZ2VkT3BlbiAmJiBkZXN0cm95T25DbG9zZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBkcmF3ZXJQb3B1cFByb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgb3BlbjogbWVyZ2VkT3BlbixcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICBhdXRvRm9jdXM6IGF1dG9Gb2N1cyxcbiAgICBrZXlib2FyZDoga2V5Ym9hcmQsXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIG1hc2s6IG1hc2ssXG4gICAgbWFza0Nsb3NhYmxlOiBtYXNrQ2xvc2FibGUsXG4gICAgaW5saW5lOiBnZXRDb250YWluZXIgPT09IGZhbHNlLFxuICAgIGFmdGVyT3BlbkNoYW5nZTogaW50ZXJuYWxBZnRlck9wZW5DaGFuZ2UsXG4gICAgcmVmOiBwYW5lbFJlZlxuICB9KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBvcnRhbCwge1xuICAgIG9wZW46IG1lcmdlZE9wZW4gfHwgZm9yY2VSZW5kZXIgfHwgYW5pbWF0ZWRWaXNpYmxlLFxuICAgIGF1dG9EZXN0cm95OiBmYWxzZSxcbiAgICBnZXRDb250YWluZXI6IGdldENvbnRhaW5lcixcbiAgICBhdXRvTG9jazogbWFzayAmJiAobWVyZ2VkT3BlbiB8fCBhbmltYXRlZFZpc2libGUpXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERyYXdlclBvcHVwLCBkcmF3ZXJQb3B1cFByb3BzKSk7XG59O1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgRHJhd2VyLmRpc3BsYXlOYW1lID0gJ0RyYXdlcic7XG59XG5leHBvcnQgZGVmYXVsdCBEcmF3ZXI7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IENsb3NlT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Nsb3NlT3V0bGluZWRcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJjRHJhd2VyIGZyb20gJ3JjLWRyYXdlcic7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCB7IE5vRm9ybVN0eWxlIH0gZnJvbSAnLi4vZm9ybS9jb250ZXh0JztcbmltcG9ydCB7IGdldFRyYW5zaXRpb25OYW1lIH0gZnJvbSAnLi4vX3V0aWwvbW90aW9uJztcbmltcG9ydCB7IHR1cGxlIH0gZnJvbSAnLi4vX3V0aWwvdHlwZSc7XG5pbXBvcnQgd2FybmluZyBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmltcG9ydCB7IE5vQ29tcGFjdFN0eWxlIH0gZnJvbSAnLi4vc3BhY2UvQ29tcGFjdCc7XG52YXIgU2l6ZVR5cGVzID0gdHVwbGUoJ2RlZmF1bHQnLCAnbGFyZ2UnKTtcbnZhciBkZWZhdWx0UHVzaFN0YXRlID0ge1xuICBkaXN0YW5jZTogMTgwXG59O1xuZnVuY3Rpb24gRHJhd2VyKHByb3BzKSB7XG4gIHZhciB3aWR0aCA9IHByb3BzLndpZHRoLFxuICAgIGhlaWdodCA9IHByb3BzLmhlaWdodCxcbiAgICBfcHJvcHMkc2l6ZSA9IHByb3BzLnNpemUsXG4gICAgc2l6ZSA9IF9wcm9wcyRzaXplID09PSB2b2lkIDAgPyAnZGVmYXVsdCcgOiBfcHJvcHMkc2l6ZSxcbiAgICBfcHJvcHMkY2xvc2FibGUgPSBwcm9wcy5jbG9zYWJsZSxcbiAgICBjbG9zYWJsZSA9IF9wcm9wcyRjbG9zYWJsZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRjbG9zYWJsZSxcbiAgICBfcHJvcHMkbWFzayA9IHByb3BzLm1hc2ssXG4gICAgbWFzayA9IF9wcm9wcyRtYXNrID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJG1hc2ssXG4gICAgX3Byb3BzJHB1c2ggPSBwcm9wcy5wdXNoLFxuICAgIHB1c2ggPSBfcHJvcHMkcHVzaCA9PT0gdm9pZCAwID8gZGVmYXVsdFB1c2hTdGF0ZSA6IF9wcm9wcyRwdXNoLFxuICAgIF9wcm9wcyRjbG9zZUljb24gPSBwcm9wcy5jbG9zZUljb24sXG4gICAgY2xvc2VJY29uID0gX3Byb3BzJGNsb3NlSWNvbiA9PT0gdm9pZCAwID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2xvc2VPdXRsaW5lZCwgbnVsbCkgOiBfcHJvcHMkY2xvc2VJY29uLFxuICAgIGJvZHlTdHlsZSA9IHByb3BzLmJvZHlTdHlsZSxcbiAgICBkcmF3ZXJTdHlsZSA9IHByb3BzLmRyYXdlclN0eWxlLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICB2aXNpYmxlID0gcHJvcHMudmlzaWJsZSxcbiAgICBvcGVuID0gcHJvcHMub3BlbixcbiAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgdGl0bGUgPSBwcm9wcy50aXRsZSxcbiAgICBoZWFkZXJTdHlsZSA9IHByb3BzLmhlYWRlclN0eWxlLFxuICAgIG9uQ2xvc2UgPSBwcm9wcy5vbkNsb3NlLFxuICAgIGZvb3RlciA9IHByb3BzLmZvb3RlcixcbiAgICBmb290ZXJTdHlsZSA9IHByb3BzLmZvb3RlclN0eWxlLFxuICAgIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBjdXN0b21pemVHZXRDb250YWluZXIgPSBwcm9wcy5nZXRDb250YWluZXIsXG4gICAgZXh0cmEgPSBwcm9wcy5leHRyYSxcbiAgICBhZnRlclZpc2libGVDaGFuZ2UgPSBwcm9wcy5hZnRlclZpc2libGVDaGFuZ2UsXG4gICAgX2FmdGVyT3BlbkNoYW5nZSA9IHByb3BzLmFmdGVyT3BlbkNoYW5nZSxcbiAgICByZXN0ID0gX19yZXN0KHByb3BzLCBbXCJ3aWR0aFwiLCBcImhlaWdodFwiLCBcInNpemVcIiwgXCJjbG9zYWJsZVwiLCBcIm1hc2tcIiwgXCJwdXNoXCIsIFwiY2xvc2VJY29uXCIsIFwiYm9keVN0eWxlXCIsIFwiZHJhd2VyU3R5bGVcIiwgXCJjbGFzc05hbWVcIiwgXCJ2aXNpYmxlXCIsIFwib3BlblwiLCBcImNoaWxkcmVuXCIsIFwic3R5bGVcIiwgXCJ0aXRsZVwiLCBcImhlYWRlclN0eWxlXCIsIFwib25DbG9zZVwiLCBcImZvb3RlclwiLCBcImZvb3RlclN0eWxlXCIsIFwicHJlZml4Q2xzXCIsIFwiZ2V0Q29udGFpbmVyXCIsIFwiZXh0cmFcIiwgXCJhZnRlclZpc2libGVDaGFuZ2VcIiwgXCJhZnRlck9wZW5DaGFuZ2VcIl0pO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFBvcHVwQ29udGFpbmVyID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UG9wdXBDb250YWluZXIsXG4gICAgZ2V0UHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UHJlZml4Q2xzLFxuICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnZHJhd2VyJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIGdldENvbnRhaW5lciA9XG4gIC8vIOacieWPr+iDveS4uiBmYWxzZe+8jOaJgOS7peS4jeiDveebtOaOpeWIpOaWrVxuICBjdXN0b21pemVHZXRDb250YWluZXIgPT09IHVuZGVmaW5lZCAmJiBnZXRQb3B1cENvbnRhaW5lciA/IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZ2V0UG9wdXBDb250YWluZXIoZG9jdW1lbnQuYm9keSk7XG4gIH0gOiBjdXN0b21pemVHZXRDb250YWluZXI7XG4gIHZhciBjbG9zZUljb25Ob2RlID0gY2xvc2FibGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgb25DbGljazogb25DbG9zZSxcbiAgICBcImFyaWEtbGFiZWxcIjogXCJDbG9zZVwiLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jbG9zZVwiKVxuICB9LCBjbG9zZUljb24pO1xuICBbWyd2aXNpYmxlJywgJ29wZW4nXSwgWydhZnRlclZpc2libGVDaGFuZ2UnLCAnYWZ0ZXJPcGVuQ2hhbmdlJ11dLmZvckVhY2goZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgX3JlZjIgPSBfc2xpY2VkVG9BcnJheShfcmVmLCAyKSxcbiAgICAgIGRlcHJlY2F0ZWROYW1lID0gX3JlZjJbMF0sXG4gICAgICBuZXdOYW1lID0gX3JlZjJbMV07XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghKGRlcHJlY2F0ZWROYW1lIGluIHByb3BzKSwgJ0RyYXdlcicsIFwiYFwiLmNvbmNhdChkZXByZWNhdGVkTmFtZSwgXCJgIGlzIGRlcHJlY2F0ZWQgd2hpY2ggd2lsbCBiZSByZW1vdmVkIGluIG5leHQgbWFqb3IgdmVyc2lvbiwgcGxlYXNlIHVzZSBgXCIpLmNvbmNhdChuZXdOYW1lLCBcImAgaW5zdGVhZC5cIikpIDogdm9pZCAwO1xuICB9KTtcbiAgZnVuY3Rpb24gcmVuZGVySGVhZGVyKCkge1xuICAgIGlmICghdGl0bGUgJiYgIWNsb3NhYmxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhlYWRlclwiKSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhlYWRlci1jbG9zZS1vbmx5XCIpLCBjbG9zYWJsZSAmJiAhdGl0bGUgJiYgIWV4dHJhKSksXG4gICAgICBzdHlsZTogaGVhZGVyU3R5bGVcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGVhZGVyLXRpdGxlXCIpXG4gICAgfSwgY2xvc2VJY29uTm9kZSwgdGl0bGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRpdGxlXCIpXG4gICAgfSwgdGl0bGUpKSwgZXh0cmEgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWV4dHJhXCIpXG4gICAgfSwgZXh0cmEpKTtcbiAgfVxuICBmdW5jdGlvbiByZW5kZXJGb290ZXIoKSB7XG4gICAgaWYgKCFmb290ZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgZm9vdGVyQ2xhc3NOYW1lID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1mb290ZXJcIik7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogZm9vdGVyQ2xhc3NOYW1lLFxuICAgICAgc3R5bGU6IGZvb3RlclN0eWxlXG4gICAgfSwgZm9vdGVyKTtcbiAgfVxuICB2YXIgZHJhd2VyQ2xhc3NOYW1lID0gY2xhc3NOYW1lcyhfZGVmaW5lUHJvcGVydHkoe1xuICAgICduby1tYXNrJzogIW1hc2tcbiAgfSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBjbGFzc05hbWUpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNpemUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbWVyZ2VkV2lkdGggPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gd2lkdGggIT09IG51bGwgJiYgd2lkdGggIT09IHZvaWQgMCA/IHdpZHRoIDogc2l6ZSA9PT0gJ2xhcmdlJyA/IDczNiA6IDM3ODtcbiAgfSwgW3dpZHRoLCBzaXplXSk7XG4gIHZhciBtZXJnZWRIZWlnaHQgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaGVpZ2h0ICE9PSBudWxsICYmIGhlaWdodCAhPT0gdm9pZCAwID8gaGVpZ2h0IDogc2l6ZSA9PT0gJ2xhcmdlJyA/IDczNiA6IDM3ODtcbiAgfSwgW2hlaWdodCwgc2l6ZV0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gTW90aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbWFza01vdGlvbiA9IHtcbiAgICBtb3Rpb25OYW1lOiBnZXRUcmFuc2l0aW9uTmFtZShwcmVmaXhDbHMsICdtYXNrLW1vdGlvbicpLFxuICAgIG1vdGlvbkFwcGVhcjogdHJ1ZSxcbiAgICBtb3Rpb25FbnRlcjogdHJ1ZSxcbiAgICBtb3Rpb25MZWF2ZTogdHJ1ZSxcbiAgICBtb3Rpb25EZWFkbGluZTogNTAwXG4gIH07XG4gIHZhciBwYW5lbE1vdGlvbiA9IGZ1bmN0aW9uIHBhbmVsTW90aW9uKG1vdGlvblBsYWNlbWVudCkge1xuICAgIHJldHVybiB7XG4gICAgICBtb3Rpb25OYW1lOiBnZXRUcmFuc2l0aW9uTmFtZShwcmVmaXhDbHMsIFwicGFuZWwtbW90aW9uLVwiLmNvbmNhdChtb3Rpb25QbGFjZW1lbnQpKSxcbiAgICAgIG1vdGlvbkFwcGVhcjogdHJ1ZSxcbiAgICAgIG1vdGlvbkVudGVyOiB0cnVlLFxuICAgICAgbW90aW9uTGVhdmU6IHRydWUsXG4gICAgICBtb3Rpb25EZWFkbGluZTogNTAwXG4gICAgfTtcbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE5vQ29tcGFjdFN0eWxlLCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChOb0Zvcm1TdHlsZSwge1xuICAgIHN0YXR1czogdHJ1ZSxcbiAgICBvdmVycmlkZTogdHJ1ZVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSY0RyYXdlciwgX2V4dGVuZHMoe1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIG9uQ2xvc2U6IG9uQ2xvc2VcbiAgfSwgcmVzdCwge1xuICAgIG9wZW46IG9wZW4gIT09IG51bGwgJiYgb3BlbiAhPT0gdm9pZCAwID8gb3BlbiA6IHZpc2libGUsXG4gICAgbWFzazogbWFzayxcbiAgICBwdXNoOiBwdXNoLFxuICAgIHdpZHRoOiBtZXJnZWRXaWR0aCxcbiAgICBoZWlnaHQ6IG1lcmdlZEhlaWdodCxcbiAgICByb290Q2xhc3NOYW1lOiBkcmF3ZXJDbGFzc05hbWUsXG4gICAgZ2V0Q29udGFpbmVyOiBnZXRDb250YWluZXIsXG4gICAgYWZ0ZXJPcGVuQ2hhbmdlOiBmdW5jdGlvbiBhZnRlck9wZW5DaGFuZ2UoaXNPcGVuKSB7XG4gICAgICBfYWZ0ZXJPcGVuQ2hhbmdlID09PSBudWxsIHx8IF9hZnRlck9wZW5DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hZnRlck9wZW5DaGFuZ2UoaXNPcGVuKTtcbiAgICAgIGFmdGVyVmlzaWJsZUNoYW5nZSA9PT0gbnVsbCB8fCBhZnRlclZpc2libGVDaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFmdGVyVmlzaWJsZUNoYW5nZShpc09wZW4pO1xuICAgIH0sXG4gICAgbWFza01vdGlvbjogbWFza01vdGlvbixcbiAgICBtb3Rpb246IHBhbmVsTW90aW9uLFxuICAgIHJvb3RTdHlsZTogc3R5bGVcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd3JhcHBlci1ib2R5XCIpLFxuICAgIHN0eWxlOiBfZXh0ZW5kcyh7fSwgZHJhd2VyU3R5bGUpXG4gIH0sIHJlbmRlckhlYWRlcigpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWJvZHlcIiksXG4gICAgc3R5bGU6IGJvZHlTdHlsZVxuICB9LCBjaGlsZHJlbiksIHJlbmRlckZvb3RlcigpKSkpKTtcbn1cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIERyYXdlci5kaXNwbGF5TmFtZSA9ICdEcmF3ZXInO1xufVxuZXhwb3J0IGRlZmF1bHQgRHJhd2VyOyIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlRGVib3VuY2UodmFsdWUpIHtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKHZhbHVlKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBjYWNoZVZhbHVlID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRDYWNoZVZhbHVlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgc2V0Q2FjaGVWYWx1ZSh2YWx1ZSk7XG4gICAgfSwgdmFsdWUubGVuZ3RoID8gMCA6IDEwKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgIH07XG4gIH0sIFt2YWx1ZV0pO1xuICByZXR1cm4gY2FjaGVWYWx1ZTtcbn0iLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgQ1NTTW90aW9uLCB7IENTU01vdGlvbkxpc3QgfSBmcm9tICdyYy1tb3Rpb24nO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgY29sbGFwc2VNb3Rpb24gZnJvbSAnLi4vX3V0aWwvbW90aW9uJztcbmltcG9ydCB7IEZvcm1JdGVtUHJlZml4Q29udGV4dCB9IGZyb20gJy4vY29udGV4dCc7XG5pbXBvcnQgdXNlRGVib3VuY2UgZnJvbSAnLi9ob29rcy91c2VEZWJvdW5jZSc7XG52YXIgRU1QVFlfTElTVCA9IFtdO1xuZnVuY3Rpb24gdG9FcnJvckVudGl0eShlcnJvciwgZXJyb3JTdGF0dXMsIHByZWZpeCkge1xuICB2YXIgaW5kZXggPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IDA7XG4gIHJldHVybiB7XG4gICAga2V5OiB0eXBlb2YgZXJyb3IgPT09ICdzdHJpbmcnID8gZXJyb3IgOiBcIlwiLmNvbmNhdChwcmVmaXgsIFwiLVwiKS5jb25jYXQoaW5kZXgpLFxuICAgIGVycm9yOiBlcnJvcixcbiAgICBlcnJvclN0YXR1czogZXJyb3JTdGF0dXNcbiAgfTtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEVycm9yTGlzdChfcmVmKSB7XG4gIHZhciBoZWxwID0gX3JlZi5oZWxwLFxuICAgIGhlbHBTdGF0dXMgPSBfcmVmLmhlbHBTdGF0dXMsXG4gICAgX3JlZiRlcnJvcnMgPSBfcmVmLmVycm9ycyxcbiAgICBlcnJvcnMgPSBfcmVmJGVycm9ycyA9PT0gdm9pZCAwID8gRU1QVFlfTElTVCA6IF9yZWYkZXJyb3JzLFxuICAgIF9yZWYkd2FybmluZ3MgPSBfcmVmLndhcm5pbmdzLFxuICAgIHdhcm5pbmdzID0gX3JlZiR3YXJuaW5ncyA9PT0gdm9pZCAwID8gRU1QVFlfTElTVCA6IF9yZWYkd2FybmluZ3MsXG4gICAgcm9vdENsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgIGZpZWxkSWQgPSBfcmVmLmZpZWxkSWQsXG4gICAgb25WaXNpYmxlQ2hhbmdlZCA9IF9yZWYub25WaXNpYmxlQ2hhbmdlZDtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChGb3JtSXRlbVByZWZpeENvbnRleHQpLFxuICAgIHByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LnByZWZpeENscztcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0MiA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCksXG4gICAgZ2V0UHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQyLmdldFByZWZpeENscztcbiAgdmFyIGJhc2VDbGFzc05hbWUgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tZXhwbGFpblwiKTtcbiAgdmFyIHJvb3RQcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoKTtcbiAgLy8gV2UgaGF2ZSB0byBkZWJvdW5jZSBoZXJlIGFnYWluIHNpbmNlIHNvbWV3aGVyZSB1c2UgRXJyb3JMaXN0IGRpcmVjdGx5IHN0aWxsIG5lZWQgbm8gc2hha2luZ1xuICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzM2MzM2XG4gIHZhciBkZWJvdW5jZUVycm9ycyA9IHVzZURlYm91bmNlKGVycm9ycyk7XG4gIHZhciBkZWJvdW5jZVdhcm5pbmdzID0gdXNlRGVib3VuY2Uod2FybmluZ3MpO1xuICB2YXIgZnVsbEtleUxpc3QgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoaGVscCAhPT0gdW5kZWZpbmVkICYmIGhlbHAgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBbdG9FcnJvckVudGl0eShoZWxwLCBoZWxwU3RhdHVzLCAnaGVscCcpXTtcbiAgICB9XG4gICAgcmV0dXJuIFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoZGVib3VuY2VFcnJvcnMubWFwKGZ1bmN0aW9uIChlcnJvciwgaW5kZXgpIHtcbiAgICAgIHJldHVybiB0b0Vycm9yRW50aXR5KGVycm9yLCAnZXJyb3InLCAnZXJyb3InLCBpbmRleCk7XG4gICAgfSkpLCBfdG9Db25zdW1hYmxlQXJyYXkoZGVib3VuY2VXYXJuaW5ncy5tYXAoZnVuY3Rpb24gKHdhcm5pbmcsIGluZGV4KSB7XG4gICAgICByZXR1cm4gdG9FcnJvckVudGl0eSh3YXJuaW5nLCAnd2FybmluZycsICd3YXJuaW5nJywgaW5kZXgpO1xuICAgIH0pKSk7XG4gIH0sIFtoZWxwLCBoZWxwU3RhdHVzLCBkZWJvdW5jZUVycm9ycywgZGVib3VuY2VXYXJuaW5nc10pO1xuICB2YXIgaGVscFByb3BzID0ge307XG4gIGlmIChmaWVsZElkKSB7XG4gICAgaGVscFByb3BzLmlkID0gXCJcIi5jb25jYXQoZmllbGRJZCwgXCJfaGVscFwiKTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ1NTTW90aW9uLCB7XG4gICAgbW90aW9uRGVhZGxpbmU6IGNvbGxhcHNlTW90aW9uLm1vdGlvbkRlYWRsaW5lLFxuICAgIG1vdGlvbk5hbWU6IFwiXCIuY29uY2F0KHJvb3RQcmVmaXhDbHMsIFwiLXNob3ctaGVscFwiKSxcbiAgICB2aXNpYmxlOiAhIWZ1bGxLZXlMaXN0Lmxlbmd0aCxcbiAgICBvblZpc2libGVDaGFuZ2VkOiBvblZpc2libGVDaGFuZ2VkXG4gIH0sIGZ1bmN0aW9uIChob2xkZXJQcm9wcykge1xuICAgIHZhciBob2xkZXJDbGFzc05hbWUgPSBob2xkZXJQcm9wcy5jbGFzc05hbWUsXG4gICAgICBob2xkZXJTdHlsZSA9IGhvbGRlclByb3BzLnN0eWxlO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7fSwgaGVscFByb3BzLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoYmFzZUNsYXNzTmFtZSwgaG9sZGVyQ2xhc3NOYW1lLCByb290Q2xhc3NOYW1lKSxcbiAgICAgIHN0eWxlOiBob2xkZXJTdHlsZSxcbiAgICAgIHJvbGU6IFwiYWxlcnRcIlxuICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDU1NNb3Rpb25MaXN0LCBfZXh0ZW5kcyh7XG4gICAgICBrZXlzOiBmdWxsS2V5TGlzdFxuICAgIH0sIGNvbGxhcHNlTW90aW9uLCB7XG4gICAgICBtb3Rpb25OYW1lOiBcIlwiLmNvbmNhdChyb290UHJlZml4Q2xzLCBcIi1zaG93LWhlbHAtaXRlbVwiKSxcbiAgICAgIGNvbXBvbmVudDogZmFsc2VcbiAgICB9KSwgZnVuY3Rpb24gKGl0ZW1Qcm9wcykge1xuICAgICAgdmFyIGtleSA9IGl0ZW1Qcm9wcy5rZXksXG4gICAgICAgIGVycm9yID0gaXRlbVByb3BzLmVycm9yLFxuICAgICAgICBlcnJvclN0YXR1cyA9IGl0ZW1Qcm9wcy5lcnJvclN0YXR1cyxcbiAgICAgICAgaXRlbUNsYXNzTmFtZSA9IGl0ZW1Qcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIGl0ZW1TdHlsZSA9IGl0ZW1Qcm9wcy5zdHlsZTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGtleToga2V5LFxuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoaXRlbUNsYXNzTmFtZSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChiYXNlQ2xhc3NOYW1lLCBcIi1cIikuY29uY2F0KGVycm9yU3RhdHVzKSwgZXJyb3JTdGF0dXMpKSxcbiAgICAgICAgc3R5bGU6IGl0ZW1TdHlsZVxuICAgICAgfSwgZXJyb3IpO1xuICAgIH0pKTtcbiAgfSk7XG59IiwiZnVuY3Rpb24gdCh0KXtyZXR1cm5cIm9iamVjdFwiPT10eXBlb2YgdCYmbnVsbCE9dCYmMT09PXQubm9kZVR5cGV9ZnVuY3Rpb24gZSh0LGUpe3JldHVybighZXx8XCJoaWRkZW5cIiE9PXQpJiZcInZpc2libGVcIiE9PXQmJlwiY2xpcFwiIT09dH1mdW5jdGlvbiBuKHQsbil7aWYodC5jbGllbnRIZWlnaHQ8dC5zY3JvbGxIZWlnaHR8fHQuY2xpZW50V2lkdGg8dC5zY3JvbGxXaWR0aCl7dmFyIHI9Z2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpO3JldHVybiBlKHIub3ZlcmZsb3dZLG4pfHxlKHIub3ZlcmZsb3dYLG4pfHxmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbih0KXtpZighdC5vd25lckRvY3VtZW50fHwhdC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KXJldHVybiBudWxsO3RyeXtyZXR1cm4gdC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmZyYW1lRWxlbWVudH1jYXRjaCh0KXtyZXR1cm4gbnVsbH19KHQpO3JldHVybiEhZSYmKGUuY2xpZW50SGVpZ2h0PHQuc2Nyb2xsSGVpZ2h0fHxlLmNsaWVudFdpZHRoPHQuc2Nyb2xsV2lkdGgpfSh0KX1yZXR1cm4hMX1mdW5jdGlvbiByKHQsZSxuLHIsaSxvLGwsZCl7cmV0dXJuIG88dCYmbD5lfHxvPnQmJmw8ZT8wOm88PXQmJmQ8PW58fGw+PWUmJmQ+PW4/by10LXI6bD5lJiZkPG58fG88dCYmZD5uP2wtZStpOjB9dmFyIGk9ZnVuY3Rpb24oZSxpKXt2YXIgbz13aW5kb3csbD1pLnNjcm9sbE1vZGUsZD1pLmJsb2NrLGY9aS5pbmxpbmUsaD1pLmJvdW5kYXJ5LHU9aS5za2lwT3ZlcmZsb3dIaWRkZW5FbGVtZW50cyxzPVwiZnVuY3Rpb25cIj09dHlwZW9mIGg/aDpmdW5jdGlvbih0KXtyZXR1cm4gdCE9PWh9O2lmKCF0KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIHRhcmdldFwiKTtmb3IodmFyIGEsYyxnPWRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxwPVtdLG09ZTt0KG0pJiZzKG0pOyl7aWYoKG09bnVsbD09KGM9KGE9bSkucGFyZW50RWxlbWVudCk/YS5nZXRSb290Tm9kZSgpLmhvc3R8fG51bGw6Yyk9PT1nKXtwLnB1c2gobSk7YnJlYWt9bnVsbCE9bSYmbT09PWRvY3VtZW50LmJvZHkmJm4obSkmJiFuKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCl8fG51bGwhPW0mJm4obSx1KSYmcC5wdXNoKG0pfWZvcih2YXIgdz1vLnZpc3VhbFZpZXdwb3J0P28udmlzdWFsVmlld3BvcnQud2lkdGg6aW5uZXJXaWR0aCx2PW8udmlzdWFsVmlld3BvcnQ/by52aXN1YWxWaWV3cG9ydC5oZWlnaHQ6aW5uZXJIZWlnaHQsVz13aW5kb3cuc2Nyb2xsWHx8cGFnZVhPZmZzZXQsSD13aW5kb3cuc2Nyb2xsWXx8cGFnZVlPZmZzZXQsYj1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHk9Yi5oZWlnaHQsRT1iLndpZHRoLE09Yi50b3AsVj1iLnJpZ2h0LHg9Yi5ib3R0b20sST1iLmxlZnQsQz1cInN0YXJ0XCI9PT1kfHxcIm5lYXJlc3RcIj09PWQ/TTpcImVuZFwiPT09ZD94Ok0reS8yLFI9XCJjZW50ZXJcIj09PWY/SStFLzI6XCJlbmRcIj09PWY/VjpJLFQ9W10saz0wO2s8cC5sZW5ndGg7aysrKXt2YXIgQj1wW2tdLEQ9Qi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxPPUQuaGVpZ2h0LFg9RC53aWR0aCxZPUQudG9wLEw9RC5yaWdodCxTPUQuYm90dG9tLGo9RC5sZWZ0O2lmKFwiaWYtbmVlZGVkXCI9PT1sJiZNPj0wJiZJPj0wJiZ4PD12JiZWPD13JiZNPj1ZJiZ4PD1TJiZJPj1qJiZWPD1MKXJldHVybiBUO3ZhciBOPWdldENvbXB1dGVkU3R5bGUoQikscT1wYXJzZUludChOLmJvcmRlckxlZnRXaWR0aCwxMCksej1wYXJzZUludChOLmJvcmRlclRvcFdpZHRoLDEwKSxBPXBhcnNlSW50KE4uYm9yZGVyUmlnaHRXaWR0aCwxMCksRj1wYXJzZUludChOLmJvcmRlckJvdHRvbVdpZHRoLDEwKSxHPTAsSj0wLEs9XCJvZmZzZXRXaWR0aFwiaW4gQj9CLm9mZnNldFdpZHRoLUIuY2xpZW50V2lkdGgtcS1BOjAsUD1cIm9mZnNldEhlaWdodFwiaW4gQj9CLm9mZnNldEhlaWdodC1CLmNsaWVudEhlaWdodC16LUY6MCxRPVwib2Zmc2V0V2lkdGhcImluIEI/MD09PUIub2Zmc2V0V2lkdGg/MDpYL0Iub2Zmc2V0V2lkdGg6MCxVPVwib2Zmc2V0SGVpZ2h0XCJpbiBCPzA9PT1CLm9mZnNldEhlaWdodD8wOk8vQi5vZmZzZXRIZWlnaHQ6MDtpZihnPT09QilHPVwic3RhcnRcIj09PWQ/QzpcImVuZFwiPT09ZD9DLXY6XCJuZWFyZXN0XCI9PT1kP3IoSCxIK3Ysdix6LEYsSCtDLEgrQyt5LHkpOkMtdi8yLEo9XCJzdGFydFwiPT09Zj9SOlwiY2VudGVyXCI9PT1mP1Itdy8yOlwiZW5kXCI9PT1mP1ItdzpyKFcsVyt3LHcscSxBLFcrUixXK1IrRSxFKSxHPU1hdGgubWF4KDAsRytIKSxKPU1hdGgubWF4KDAsSitXKTtlbHNle0c9XCJzdGFydFwiPT09ZD9DLVktejpcImVuZFwiPT09ZD9DLVMrRitQOlwibmVhcmVzdFwiPT09ZD9yKFksUyxPLHosRitQLEMsQyt5LHkpOkMtKFkrTy8yKStQLzIsSj1cInN0YXJ0XCI9PT1mP1Itai1xOlwiY2VudGVyXCI9PT1mP1ItKGorWC8yKStLLzI6XCJlbmRcIj09PWY/Ui1MK0ErSzpyKGosTCxYLHEsQStLLFIsUitFLEUpO3ZhciBaPUIuc2Nyb2xsTGVmdCwkPUIuc2Nyb2xsVG9wO0MrPSQtKEc9TWF0aC5tYXgoMCxNYXRoLm1pbigkK0cvVSxCLnNjcm9sbEhlaWdodC1PL1UrUCkpKSxSKz1aLShKPU1hdGgubWF4KDAsTWF0aC5taW4oWitKL1EsQi5zY3JvbGxXaWR0aC1YL1ErSykpKX1ULnB1c2goe2VsOkIsdG9wOkcsbGVmdDpKfSl9cmV0dXJuIFR9O2V4cG9ydHtpIGFzIGRlZmF1bHR9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiaW1wb3J0IGNvbXB1dGUgZnJvbSAnY29tcHV0ZS1zY3JvbGwtaW50by12aWV3JztcbmZ1bmN0aW9uIGlzT3B0aW9uc09iamVjdChvcHRpb25zKSB7XG4gIHJldHVybiBvcHRpb25zID09PSBPYmplY3Qob3B0aW9ucykgJiYgT2JqZWN0LmtleXMob3B0aW9ucykubGVuZ3RoICE9PSAwO1xufVxuZnVuY3Rpb24gZGVmYXVsdEJlaGF2aW9yKGFjdGlvbnMsIGJlaGF2aW9yKSB7XG4gIGlmIChiZWhhdmlvciA9PT0gdm9pZCAwKSB7XG4gICAgYmVoYXZpb3IgPSAnYXV0byc7XG4gIH1cbiAgdmFyIGNhblNtb290aFNjcm9sbCA9ICgnc2Nyb2xsQmVoYXZpb3InIGluIGRvY3VtZW50LmJvZHkuc3R5bGUpO1xuICBhY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgZWwgPSBfcmVmLmVsLFxuICAgICAgdG9wID0gX3JlZi50b3AsXG4gICAgICBsZWZ0ID0gX3JlZi5sZWZ0O1xuICAgIGlmIChlbC5zY3JvbGwgJiYgY2FuU21vb3RoU2Nyb2xsKSB7XG4gICAgICBlbC5zY3JvbGwoe1xuICAgICAgICB0b3A6IHRvcCxcbiAgICAgICAgbGVmdDogbGVmdCxcbiAgICAgICAgYmVoYXZpb3I6IGJlaGF2aW9yXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWwuc2Nyb2xsVG9wID0gdG9wO1xuICAgICAgZWwuc2Nyb2xsTGVmdCA9IGxlZnQ7XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIGdldE9wdGlvbnMob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYmxvY2s6ICdlbmQnLFxuICAgICAgaW5saW5lOiAnbmVhcmVzdCdcbiAgICB9O1xuICB9XG4gIGlmIChpc09wdGlvbnNPYmplY3Qob3B0aW9ucykpIHtcbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfVxuICByZXR1cm4ge1xuICAgIGJsb2NrOiAnc3RhcnQnLFxuICAgIGlubGluZTogJ25lYXJlc3QnXG4gIH07XG59XG5mdW5jdGlvbiBzY3JvbGxJbnRvVmlldyh0YXJnZXQsIG9wdGlvbnMpIHtcbiAgdmFyIGlzVGFyZ2V0QXR0YWNoZWQgPSB0YXJnZXQuaXNDb25uZWN0ZWQgfHwgdGFyZ2V0Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zKHRhcmdldCk7XG4gIGlmIChpc09wdGlvbnNPYmplY3Qob3B0aW9ucykgJiYgdHlwZW9mIG9wdGlvbnMuYmVoYXZpb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5iZWhhdmlvcihpc1RhcmdldEF0dGFjaGVkID8gY29tcHV0ZSh0YXJnZXQsIG9wdGlvbnMpIDogW10pO1xuICB9XG4gIGlmICghaXNUYXJnZXRBdHRhY2hlZCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgY29tcHV0ZU9wdGlvbnMgPSBnZXRPcHRpb25zKG9wdGlvbnMpO1xuICByZXR1cm4gZGVmYXVsdEJlaGF2aW9yKGNvbXB1dGUodGFyZ2V0LCBjb21wdXRlT3B0aW9ucyksIGNvbXB1dGVPcHRpb25zLmJlaGF2aW9yKTtcbn1cbmV4cG9ydCBkZWZhdWx0IHNjcm9sbEludG9WaWV3OyIsIi8vIGZvcm0gaXRlbSBuYW1lIGJsYWNrIGxpc3QuICBpbiBmb3JtICx5b3UgY2FuIHVzZSBmb3JtLmlkIGdldCB0aGUgZm9ybSBpdGVtIGVsZW1lbnQuXG4vLyB1c2Ugb2JqZWN0IGhhc093blByb3BlcnR5IHdpbGwgZ2V0IGJldHRlciBwZXJmb3JtYW5jZSBpZiBibGFjayBsaXN0IGlzIGxvbmdlci5cbnZhciBmb3JtSXRlbU5hbWVCbGFja0xpc3QgPSBbJ3BhcmVudE5vZGUnXTtcbi8vIGRlZmF1bHQgZm9ybSBpdGVtIGlkIHByZWZpeC5cbnZhciBkZWZhdWx0SXRlbU5hbWVQcmVmaXhDbHMgPSAnZm9ybV9pdGVtJztcbmV4cG9ydCBmdW5jdGlvbiB0b0FycmF5KGNhbmRpZGF0ZSkge1xuICBpZiAoY2FuZGlkYXRlID09PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlID09PSBmYWxzZSkgcmV0dXJuIFtdO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShjYW5kaWRhdGUpID8gY2FuZGlkYXRlIDogW2NhbmRpZGF0ZV07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RmllbGRJZChuYW1lUGF0aCwgZm9ybU5hbWUpIHtcbiAgaWYgKCFuYW1lUGF0aC5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gIHZhciBtZXJnZWRJZCA9IG5hbWVQYXRoLmpvaW4oJ18nKTtcbiAgaWYgKGZvcm1OYW1lKSB7XG4gICAgcmV0dXJuIFwiXCIuY29uY2F0KGZvcm1OYW1lLCBcIl9cIikuY29uY2F0KG1lcmdlZElkKTtcbiAgfVxuICB2YXIgaXNJbGxlZ2FsTmFtZSA9IGZvcm1JdGVtTmFtZUJsYWNrTGlzdC5pbmNsdWRlcyhtZXJnZWRJZCk7XG4gIHJldHVybiBpc0lsbGVnYWxOYW1lID8gXCJcIi5jb25jYXQoZGVmYXVsdEl0ZW1OYW1lUHJlZml4Q2xzLCBcIl9cIikuY29uY2F0KG1lcmdlZElkKSA6IG1lcmdlZElkO1xufSIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgeyB1c2VGb3JtIGFzIHVzZVJjRm9ybSB9IGZyb20gJ3JjLWZpZWxkLWZvcm0nO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHNjcm9sbEludG9WaWV3IGZyb20gJ3Njcm9sbC1pbnRvLXZpZXctaWYtbmVlZGVkJztcbmltcG9ydCB7IGdldEZpZWxkSWQsIHRvQXJyYXkgfSBmcm9tICcuLi91dGlsJztcbmZ1bmN0aW9uIHRvTmFtZVBhdGhTdHIobmFtZSkge1xuICB2YXIgbmFtZVBhdGggPSB0b0FycmF5KG5hbWUpO1xuICByZXR1cm4gbmFtZVBhdGguam9pbignXycpO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlRm9ybShmb3JtKSB7XG4gIHZhciBfdXNlUmNGb3JtID0gdXNlUmNGb3JtKCksXG4gICAgX3VzZVJjRm9ybTIgPSBfc2xpY2VkVG9BcnJheShfdXNlUmNGb3JtLCAxKSxcbiAgICByY0Zvcm0gPSBfdXNlUmNGb3JtMlswXTtcbiAgdmFyIGl0ZW1zUmVmID0gUmVhY3QudXNlUmVmKHt9KTtcbiAgdmFyIHdyYXBGb3JtID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZvcm0gIT09IG51bGwgJiYgZm9ybSAhPT0gdm9pZCAwID8gZm9ybSA6IF9leHRlbmRzKF9leHRlbmRzKHt9LCByY0Zvcm0pLCB7XG4gICAgICBfX0lOVEVSTkFMX186IHtcbiAgICAgICAgaXRlbVJlZjogZnVuY3Rpb24gaXRlbVJlZihuYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICB2YXIgbmFtZVBhdGhTdHIgPSB0b05hbWVQYXRoU3RyKG5hbWUpO1xuICAgICAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgICAgaXRlbXNSZWYuY3VycmVudFtuYW1lUGF0aFN0cl0gPSBub2RlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGVsZXRlIGl0ZW1zUmVmLmN1cnJlbnRbbmFtZVBhdGhTdHJdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzY3JvbGxUb0ZpZWxkOiBmdW5jdGlvbiBzY3JvbGxUb0ZpZWxkKG5hbWUpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgICAgICB2YXIgbmFtZVBhdGggPSB0b0FycmF5KG5hbWUpO1xuICAgICAgICB2YXIgZmllbGRJZCA9IGdldEZpZWxkSWQobmFtZVBhdGgsIHdyYXBGb3JtLl9fSU5URVJOQUxfXy5uYW1lKTtcbiAgICAgICAgdmFyIG5vZGUgPSBmaWVsZElkID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZmllbGRJZCkgOiBudWxsO1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgIHNjcm9sbEludG9WaWV3KG5vZGUsIF9leHRlbmRzKHtcbiAgICAgICAgICAgIHNjcm9sbE1vZGU6ICdpZi1uZWVkZWQnLFxuICAgICAgICAgICAgYmxvY2s6ICduZWFyZXN0J1xuICAgICAgICAgIH0sIG9wdGlvbnMpKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGdldEZpZWxkSW5zdGFuY2U6IGZ1bmN0aW9uIGdldEZpZWxkSW5zdGFuY2UobmFtZSkge1xuICAgICAgICB2YXIgbmFtZVBhdGhTdHIgPSB0b05hbWVQYXRoU3RyKG5hbWUpO1xuICAgICAgICByZXR1cm4gaXRlbXNSZWYuY3VycmVudFtuYW1lUGF0aFN0cl07XG4gICAgICB9XG4gICAgfSk7XG4gIH0sIFtmb3JtLCByY0Zvcm1dKTtcbiAgcmV0dXJuIFt3cmFwRm9ybV07XG59IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgRmllbGRGb3JtLCB7IExpc3QsIHVzZVdhdGNoIH0gZnJvbSAncmMtZmllbGQtZm9ybSc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgRGlzYWJsZWRDb250ZXh0LCB7IERpc2FibGVkQ29udGV4dFByb3ZpZGVyIH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL0Rpc2FibGVkQ29udGV4dCc7XG5pbXBvcnQgU2l6ZUNvbnRleHQsIHsgU2l6ZUNvbnRleHRQcm92aWRlciB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlci9TaXplQ29udGV4dCc7XG5pbXBvcnQgeyBGb3JtQ29udGV4dCB9IGZyb20gJy4vY29udGV4dCc7XG5pbXBvcnQgdXNlRm9ybSBmcm9tICcuL2hvb2tzL3VzZUZvcm0nO1xudmFyIEludGVybmFsRm9ybSA9IGZ1bmN0aW9uIEludGVybmFsRm9ybShwcm9wcywgcmVmKSB7XG4gIHZhciBfY2xhc3NOYW1lcztcbiAgdmFyIGNvbnRleHRTaXplID0gUmVhY3QudXNlQ29udGV4dChTaXplQ29udGV4dCk7XG4gIHZhciBjb250ZXh0RGlzYWJsZWQgPSBSZWFjdC51c2VDb250ZXh0KERpc2FibGVkQ29udGV4dCk7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCksXG4gICAgZ2V0UHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UHJlZml4Q2xzLFxuICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbixcbiAgICBjb250ZXh0Rm9ybSA9IF9SZWFjdCR1c2VDb250ZXh0LmZvcm07XG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgX3Byb3BzJGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBjbGFzc05hbWUgPSBfcHJvcHMkY2xhc3NOYW1lID09PSB2b2lkIDAgPyAnJyA6IF9wcm9wcyRjbGFzc05hbWUsXG4gICAgX3Byb3BzJHNpemUgPSBwcm9wcy5zaXplLFxuICAgIHNpemUgPSBfcHJvcHMkc2l6ZSA9PT0gdm9pZCAwID8gY29udGV4dFNpemUgOiBfcHJvcHMkc2l6ZSxcbiAgICBfcHJvcHMkZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICBkaXNhYmxlZCA9IF9wcm9wcyRkaXNhYmxlZCA9PT0gdm9pZCAwID8gY29udGV4dERpc2FibGVkIDogX3Byb3BzJGRpc2FibGVkLFxuICAgIGZvcm0gPSBwcm9wcy5mb3JtLFxuICAgIGNvbG9uID0gcHJvcHMuY29sb24sXG4gICAgbGFiZWxBbGlnbiA9IHByb3BzLmxhYmVsQWxpZ24sXG4gICAgbGFiZWxXcmFwID0gcHJvcHMubGFiZWxXcmFwLFxuICAgIGxhYmVsQ29sID0gcHJvcHMubGFiZWxDb2wsXG4gICAgd3JhcHBlckNvbCA9IHByb3BzLndyYXBwZXJDb2wsXG4gICAgaGlkZVJlcXVpcmVkTWFyayA9IHByb3BzLmhpZGVSZXF1aXJlZE1hcmssXG4gICAgX3Byb3BzJGxheW91dCA9IHByb3BzLmxheW91dCxcbiAgICBsYXlvdXQgPSBfcHJvcHMkbGF5b3V0ID09PSB2b2lkIDAgPyAnaG9yaXpvbnRhbCcgOiBfcHJvcHMkbGF5b3V0LFxuICAgIHNjcm9sbFRvRmlyc3RFcnJvciA9IHByb3BzLnNjcm9sbFRvRmlyc3RFcnJvcixcbiAgICByZXF1aXJlZE1hcmsgPSBwcm9wcy5yZXF1aXJlZE1hcmssXG4gICAgb25GaW5pc2hGYWlsZWQgPSBwcm9wcy5vbkZpbmlzaEZhaWxlZCxcbiAgICBuYW1lID0gcHJvcHMubmFtZSxcbiAgICByZXN0Rm9ybVByb3BzID0gX19yZXN0KHByb3BzLCBbXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJzaXplXCIsIFwiZGlzYWJsZWRcIiwgXCJmb3JtXCIsIFwiY29sb25cIiwgXCJsYWJlbEFsaWduXCIsIFwibGFiZWxXcmFwXCIsIFwibGFiZWxDb2xcIiwgXCJ3cmFwcGVyQ29sXCIsIFwiaGlkZVJlcXVpcmVkTWFya1wiLCBcImxheW91dFwiLCBcInNjcm9sbFRvRmlyc3RFcnJvclwiLCBcInJlcXVpcmVkTWFya1wiLCBcIm9uRmluaXNoRmFpbGVkXCIsIFwibmFtZVwiXSk7XG4gIHZhciBtZXJnZWRSZXF1aXJlZE1hcmsgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocmVxdWlyZWRNYXJrICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiByZXF1aXJlZE1hcms7XG4gICAgfVxuICAgIGlmIChjb250ZXh0Rm9ybSAmJiBjb250ZXh0Rm9ybS5yZXF1aXJlZE1hcmsgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNvbnRleHRGb3JtLnJlcXVpcmVkTWFyaztcbiAgICB9XG4gICAgaWYgKGhpZGVSZXF1aXJlZE1hcmspIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sIFtoaWRlUmVxdWlyZWRNYXJrLCByZXF1aXJlZE1hcmssIGNvbnRleHRGb3JtXSk7XG4gIHZhciBtZXJnZWRDb2xvbiA9IGNvbG9uICE9PSBudWxsICYmIGNvbG9uICE9PSB2b2lkIDAgPyBjb2xvbiA6IGNvbnRleHRGb3JtID09PSBudWxsIHx8IGNvbnRleHRGb3JtID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb250ZXh0Rm9ybS5jb2xvbjtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnZm9ybScsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIHZhciBmb3JtQ2xhc3NOYW1lID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChsYXlvdXQpLCB0cnVlKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhpZGUtcmVxdWlyZWQtbWFya1wiKSwgbWVyZ2VkUmVxdWlyZWRNYXJrID09PSBmYWxzZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChzaXplKSwgc2l6ZSksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lKTtcbiAgdmFyIF91c2VGb3JtID0gdXNlRm9ybShmb3JtKSxcbiAgICBfdXNlRm9ybTIgPSBfc2xpY2VkVG9BcnJheShfdXNlRm9ybSwgMSksXG4gICAgd3JhcEZvcm0gPSBfdXNlRm9ybTJbMF07XG4gIHZhciBfX0lOVEVSTkFMX18gPSB3cmFwRm9ybS5fX0lOVEVSTkFMX187XG4gIF9fSU5URVJOQUxfXy5uYW1lID0gbmFtZTtcbiAgdmFyIGZvcm1Db250ZXh0VmFsdWUgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIGxhYmVsQWxpZ246IGxhYmVsQWxpZ24sXG4gICAgICBsYWJlbENvbDogbGFiZWxDb2wsXG4gICAgICBsYWJlbFdyYXA6IGxhYmVsV3JhcCxcbiAgICAgIHdyYXBwZXJDb2w6IHdyYXBwZXJDb2wsXG4gICAgICB2ZXJ0aWNhbDogbGF5b3V0ID09PSAndmVydGljYWwnLFxuICAgICAgY29sb246IG1lcmdlZENvbG9uLFxuICAgICAgcmVxdWlyZWRNYXJrOiBtZXJnZWRSZXF1aXJlZE1hcmssXG4gICAgICBpdGVtUmVmOiBfX0lOVEVSTkFMX18uaXRlbVJlZixcbiAgICAgIGZvcm06IHdyYXBGb3JtXG4gICAgfTtcbiAgfSwgW25hbWUsIGxhYmVsQWxpZ24sIGxhYmVsQ29sLCB3cmFwcGVyQ29sLCBsYXlvdXQsIG1lcmdlZENvbG9uLCBtZXJnZWRSZXF1aXJlZE1hcmssIHdyYXBGb3JtXSk7XG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHdyYXBGb3JtO1xuICB9KTtcbiAgdmFyIG9uSW50ZXJuYWxGaW5pc2hGYWlsZWQgPSBmdW5jdGlvbiBvbkludGVybmFsRmluaXNoRmFpbGVkKGVycm9ySW5mbykge1xuICAgIG9uRmluaXNoRmFpbGVkID09PSBudWxsIHx8IG9uRmluaXNoRmFpbGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkZpbmlzaEZhaWxlZChlcnJvckluZm8pO1xuICAgIHZhciBkZWZhdWx0U2Nyb2xsVG9GaXJzdEVycm9yID0ge1xuICAgICAgYmxvY2s6ICduZWFyZXN0J1xuICAgIH07XG4gICAgaWYgKHNjcm9sbFRvRmlyc3RFcnJvciAmJiBlcnJvckluZm8uZXJyb3JGaWVsZHMubGVuZ3RoKSB7XG4gICAgICBpZiAoX3R5cGVvZihzY3JvbGxUb0ZpcnN0RXJyb3IpID09PSAnb2JqZWN0Jykge1xuICAgICAgICBkZWZhdWx0U2Nyb2xsVG9GaXJzdEVycm9yID0gc2Nyb2xsVG9GaXJzdEVycm9yO1xuICAgICAgfVxuICAgICAgd3JhcEZvcm0uc2Nyb2xsVG9GaWVsZChlcnJvckluZm8uZXJyb3JGaWVsZHNbMF0ubmFtZSwgZGVmYXVsdFNjcm9sbFRvRmlyc3RFcnJvcik7XG4gICAgfVxuICB9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRGlzYWJsZWRDb250ZXh0UHJvdmlkZXIsIHtcbiAgICBkaXNhYmxlZDogZGlzYWJsZWRcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2l6ZUNvbnRleHRQcm92aWRlciwge1xuICAgIHNpemU6IHNpemVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRm9ybUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogZm9ybUNvbnRleHRWYWx1ZVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGaWVsZEZvcm0sIF9leHRlbmRzKHtcbiAgICBpZDogbmFtZVxuICB9LCByZXN0Rm9ybVByb3BzLCB7XG4gICAgbmFtZTogbmFtZSxcbiAgICBvbkZpbmlzaEZhaWxlZDogb25JbnRlcm5hbEZpbmlzaEZhaWxlZCxcbiAgICBmb3JtOiB3cmFwRm9ybSxcbiAgICBjbGFzc05hbWU6IGZvcm1DbGFzc05hbWVcbiAgfSkpKSkpO1xufTtcbnZhciBGb3JtID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoSW50ZXJuYWxGb3JtKTtcbmV4cG9ydCB7IHVzZUZvcm0sIExpc3QsIHVzZVdhdGNoIH07XG5leHBvcnQgZGVmYXVsdCBGb3JtOyIsImltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBGb3JtSXRlbUlucHV0Q29udGV4dCB9IGZyb20gJy4uL2NvbnRleHQnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi4vLi4vX3V0aWwvd2FybmluZyc7XG52YXIgdXNlRm9ybUl0ZW1TdGF0dXMgPSBmdW5jdGlvbiB1c2VGb3JtSXRlbVN0YXR1cygpIHtcbiAgdmFyIF91c2VDb250ZXh0ID0gdXNlQ29udGV4dChGb3JtSXRlbUlucHV0Q29udGV4dCksXG4gICAgc3RhdHVzID0gX3VzZUNvbnRleHQuc3RhdHVzO1xuICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKHN0YXR1cyAhPT0gdW5kZWZpbmVkLCAnRm9ybS5JdGVtJywgXCJGb3JtLkl0ZW0udXNlU3RhdHVzIHNob3VsZCBiZSB1c2VkIHVuZGVyIEZvcm0uSXRlbSBjb21wb25lbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uOiBcIi5jb25jYXQod2luZG93LmxvY2F0aW9uLnByb3RvY29sLCBcIi8vXCIpLmNvbmNhdCh3aW5kb3cubG9jYXRpb24uaG9zdCwgXCIvY29tcG9uZW50cy9mb3JtLWNuLyNGb3JtLkl0ZW0udXNlU3RhdHVzXCIpKSA6IHZvaWQgMDtcbiAgcmV0dXJuIHtcbiAgICBzdGF0dXM6IHN0YXR1c1xuICB9O1xufTtcbmV4cG9ydCBkZWZhdWx0IHVzZUZvcm1JdGVtU3RhdHVzOyIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IHJhZiBmcm9tIFwicmMtdXRpbC9lcy9yYWZcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUZyYW1lU3RhdGUoZGVmYXVsdFZhbHVlKSB7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShkZWZhdWx0VmFsdWUpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIHZhbHVlID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRWYWx1ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBmcmFtZVJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIGJhdGNoUmVmID0gdXNlUmVmKFtdKTtcbiAgdmFyIGRlc3Ryb3lSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGRlc3Ryb3lSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBkZXN0cm95UmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgcmFmLmNhbmNlbChmcmFtZVJlZi5jdXJyZW50KTtcbiAgICAgIGZyYW1lUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgZnVuY3Rpb24gc2V0RnJhbWVWYWx1ZSh1cGRhdGVyKSB7XG4gICAgaWYgKGRlc3Ryb3lSZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZnJhbWVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgYmF0Y2hSZWYuY3VycmVudCA9IFtdO1xuICAgICAgZnJhbWVSZWYuY3VycmVudCA9IHJhZihmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZyYW1lUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICBzZXRWYWx1ZShmdW5jdGlvbiAocHJldlZhbHVlKSB7XG4gICAgICAgICAgdmFyIGN1cnJlbnQgPSBwcmV2VmFsdWU7XG4gICAgICAgICAgYmF0Y2hSZWYuY3VycmVudC5mb3JFYWNoKGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICBjdXJyZW50ID0gZnVuYyhjdXJyZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgYmF0Y2hSZWYuY3VycmVudC5wdXNoKHVwZGF0ZXIpO1xuICB9XG4gIHJldHVybiBbdmFsdWUsIHNldEZyYW1lVmFsdWVdO1xufSIsImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCB7IGNvbXBvc2VSZWYgfSBmcm9tIFwicmMtdXRpbC9lcy9yZWZcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEZvcm1Db250ZXh0IH0gZnJvbSAnLi4vY29udGV4dCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VJdGVtUmVmKCkge1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KEZvcm1Db250ZXh0KSxcbiAgICBpdGVtUmVmID0gX1JlYWN0JHVzZUNvbnRleHQuaXRlbVJlZjtcbiAgdmFyIGNhY2hlUmVmID0gUmVhY3QudXNlUmVmKHt9KTtcbiAgZnVuY3Rpb24gZ2V0UmVmKG5hbWUsIGNoaWxkcmVuKSB7XG4gICAgdmFyIGNoaWxkcmVuUmVmID0gY2hpbGRyZW4gJiYgX3R5cGVvZihjaGlsZHJlbikgPT09ICdvYmplY3QnICYmIGNoaWxkcmVuLnJlZjtcbiAgICB2YXIgbmFtZVN0ciA9IG5hbWUuam9pbignXycpO1xuICAgIGlmIChjYWNoZVJlZi5jdXJyZW50Lm5hbWUgIT09IG5hbWVTdHIgfHwgY2FjaGVSZWYuY3VycmVudC5vcmlnaW5SZWYgIT09IGNoaWxkcmVuUmVmKSB7XG4gICAgICBjYWNoZVJlZi5jdXJyZW50Lm5hbWUgPSBuYW1lU3RyO1xuICAgICAgY2FjaGVSZWYuY3VycmVudC5vcmlnaW5SZWYgPSBjaGlsZHJlblJlZjtcbiAgICAgIGNhY2hlUmVmLmN1cnJlbnQucmVmID0gY29tcG9zZVJlZihpdGVtUmVmKG5hbWUpLCBjaGlsZHJlblJlZik7XG4gICAgfVxuICAgIHJldHVybiBjYWNoZVJlZi5jdXJyZW50LnJlZjtcbiAgfVxuICByZXR1cm4gZ2V0UmVmO1xufSIsIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIFF1ZXN0aW9uQ2lyY2xlT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTUxMiA2NEMyNjQuNiA2NCA2NCAyNjQuNiA2NCA1MTJzMjAwLjYgNDQ4IDQ0OCA0NDggNDQ4LTIwMC42IDQ0OC00NDhTNzU5LjQgNjQgNTEyIDY0em0wIDgyMGMtMjA1LjQgMC0zNzItMTY2LjYtMzcyLTM3MnMxNjYuNi0zNzIgMzcyLTM3MiAzNzIgMTY2LjYgMzcyIDM3Mi0xNjYuNiAzNzItMzcyIDM3MnpcIiB9IH0sIHsgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNjIzLjYgMzE2LjdDNTkzLjYgMjkwLjQgNTU0IDI3NiA1MTIgMjc2cy04MS42IDE0LjUtMTExLjYgNDAuN0MzNjkuMiAzNDQgMzUyIDM4MC43IDM1MiA0MjB2Ny42YzAgNC40IDMuNiA4IDggOGg0OGM0LjQgMCA4LTMuNiA4LThWNDIwYzAtNDQuMSA0My4xLTgwIDk2LTgwczk2IDM1LjkgOTYgODBjMCAzMS4xLTIyIDU5LjYtNTYuMSA3Mi43LTIxLjIgOC4xLTM5LjIgMjIuMy01Mi4xIDQwLjktMTMuMSAxOS0xOS45IDQxLjgtMTkuOSA2NC45VjYyMGMwIDQuNCAzLjYgOCA4IDhoNDhjNC40IDAgOC0zLjYgOC04di0yMi43YTQ4LjMgNDguMyAwIDAxMzAuOS00NC44YzU5LTIyLjcgOTcuMS03NC43IDk3LjEtMTMyLjUuMS0zOS4zLTE3LjEtNzYtNDguMy0xMDMuM3pNNDcyIDczMmE0MCA0MCAwIDEwODAgMCA0MCA0MCAwIDEwLTgwIDB6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJxdWVzdGlvbi1jaXJjbGVcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IFF1ZXN0aW9uQ2lyY2xlT3V0bGluZWQ7XG4iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBRdWVzdGlvbkNpcmNsZU91dGxpbmVkU3ZnIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1F1ZXN0aW9uQ2lyY2xlT3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tICcuLi9jb21wb25lbnRzL0FudGRJY29uJztcbnZhciBRdWVzdGlvbkNpcmNsZU91dGxpbmVkID0gZnVuY3Rpb24gUXVlc3Rpb25DaXJjbGVPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogUXVlc3Rpb25DaXJjbGVPdXRsaW5lZFN2Z1xuICB9KSk7XG59O1xuUXVlc3Rpb25DaXJjbGVPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdRdWVzdGlvbkNpcmNsZU91dGxpbmVkJztcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKFF1ZXN0aW9uQ2lyY2xlT3V0bGluZWQpOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBRdWVzdGlvbkNpcmNsZU91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9RdWVzdGlvbkNpcmNsZU91dGxpbmVkXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBDb2wgZnJvbSAnLi4vZ3JpZC9jb2wnO1xuaW1wb3J0IHsgdXNlTG9jYWxlUmVjZWl2ZXIgfSBmcm9tICcuLi9sb2NhbGUtcHJvdmlkZXIvTG9jYWxlUmVjZWl2ZXInO1xuaW1wb3J0IGRlZmF1bHRMb2NhbGUgZnJvbSAnLi4vbG9jYWxlL2RlZmF1bHQnO1xuaW1wb3J0IFRvb2x0aXAgZnJvbSAnLi4vdG9vbHRpcCc7XG5pbXBvcnQgeyBGb3JtQ29udGV4dCB9IGZyb20gJy4vY29udGV4dCc7XG5mdW5jdGlvbiB0b1Rvb2x0aXBQcm9wcyh0b29sdGlwKSB7XG4gIGlmICghdG9vbHRpcCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmIChfdHlwZW9mKHRvb2x0aXApID09PSAnb2JqZWN0JyAmJiAhIC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudCh0b29sdGlwKSkge1xuICAgIHJldHVybiB0b29sdGlwO1xuICB9XG4gIHJldHVybiB7XG4gICAgdGl0bGU6IHRvb2x0aXBcbiAgfTtcbn1cbnZhciBGb3JtSXRlbUxhYmVsID0gZnVuY3Rpb24gRm9ybUl0ZW1MYWJlbChfcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICBsYWJlbCA9IF9yZWYubGFiZWwsXG4gICAgaHRtbEZvciA9IF9yZWYuaHRtbEZvcixcbiAgICBsYWJlbENvbCA9IF9yZWYubGFiZWxDb2wsXG4gICAgbGFiZWxBbGlnbiA9IF9yZWYubGFiZWxBbGlnbixcbiAgICBjb2xvbiA9IF9yZWYuY29sb24sXG4gICAgcmVxdWlyZWQgPSBfcmVmLnJlcXVpcmVkLFxuICAgIHJlcXVpcmVkTWFyayA9IF9yZWYucmVxdWlyZWRNYXJrLFxuICAgIHRvb2x0aXAgPSBfcmVmLnRvb2x0aXA7XG4gIHZhciBfdXNlTG9jYWxlUmVjZWl2ZXIgPSB1c2VMb2NhbGVSZWNlaXZlcignRm9ybScpLFxuICAgIF91c2VMb2NhbGVSZWNlaXZlcjIgPSBfc2xpY2VkVG9BcnJheShfdXNlTG9jYWxlUmVjZWl2ZXIsIDEpLFxuICAgIGZvcm1Mb2NhbGUgPSBfdXNlTG9jYWxlUmVjZWl2ZXIyWzBdO1xuICBpZiAoIWxhYmVsKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZvcm1Db250ZXh0LkNvbnN1bWVyLCB7XG4gICAga2V5OiBcImxhYmVsXCJcbiAgfSwgZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgdmFyIF9jbGFzc05hbWVzMjtcbiAgICB2YXIgdmVydGljYWwgPSBfcmVmMi52ZXJ0aWNhbCxcbiAgICAgIGNvbnRleHRMYWJlbEFsaWduID0gX3JlZjIubGFiZWxBbGlnbixcbiAgICAgIGNvbnRleHRMYWJlbENvbCA9IF9yZWYyLmxhYmVsQ29sLFxuICAgICAgbGFiZWxXcmFwID0gX3JlZjIubGFiZWxXcmFwLFxuICAgICAgY29udGV4dENvbG9uID0gX3JlZjIuY29sb247XG4gICAgdmFyIF9hO1xuICAgIHZhciBtZXJnZWRMYWJlbENvbCA9IGxhYmVsQ29sIHx8IGNvbnRleHRMYWJlbENvbCB8fCB7fTtcbiAgICB2YXIgbWVyZ2VkTGFiZWxBbGlnbiA9IGxhYmVsQWxpZ24gfHwgY29udGV4dExhYmVsQWxpZ247XG4gICAgdmFyIGxhYmVsQ2xzQmFzaWMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tbGFiZWxcIik7XG4gICAgdmFyIGxhYmVsQ29sQ2xhc3NOYW1lID0gY2xhc3NOYW1lcyhsYWJlbENsc0Jhc2ljLCBtZXJnZWRMYWJlbEFsaWduID09PSAnbGVmdCcgJiYgXCJcIi5jb25jYXQobGFiZWxDbHNCYXNpYywgXCItbGVmdFwiKSwgbWVyZ2VkTGFiZWxDb2wuY2xhc3NOYW1lLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KGxhYmVsQ2xzQmFzaWMsIFwiLXdyYXBcIiksICEhbGFiZWxXcmFwKSk7XG4gICAgdmFyIGxhYmVsQ2hpbGRyZW4gPSBsYWJlbDtcbiAgICAvLyBLZWVwIGxhYmVsIGlzIG9yaWdpbmFsIHdoZXJlIHRoZXJlIHNob3VsZCBoYXZlIG5vIGNvbG9uXG4gICAgdmFyIGNvbXB1dGVkQ29sb24gPSBjb2xvbiA9PT0gdHJ1ZSB8fCBjb250ZXh0Q29sb24gIT09IGZhbHNlICYmIGNvbG9uICE9PSBmYWxzZTtcbiAgICB2YXIgaGF2ZUNvbG9uID0gY29tcHV0ZWRDb2xvbiAmJiAhdmVydGljYWw7XG4gICAgLy8gUmVtb3ZlIGR1cGxpY2F0ZWQgdXNlciBpbnB1dCBjb2xvblxuICAgIGlmIChoYXZlQ29sb24gJiYgdHlwZW9mIGxhYmVsID09PSAnc3RyaW5nJyAmJiBsYWJlbC50cmltKCkgIT09ICcnKSB7XG4gICAgICBsYWJlbENoaWxkcmVuID0gbGFiZWwucmVwbGFjZSgvWzp877yaXVxccyokLywgJycpO1xuICAgIH1cbiAgICAvLyBUb29sdGlwXG4gICAgdmFyIHRvb2x0aXBQcm9wcyA9IHRvVG9vbHRpcFByb3BzKHRvb2x0aXApO1xuICAgIGlmICh0b29sdGlwUHJvcHMpIHtcbiAgICAgIHZhciBfdG9vbHRpcFByb3BzJGljb24gPSB0b29sdGlwUHJvcHMuaWNvbixcbiAgICAgICAgaWNvbiA9IF90b29sdGlwUHJvcHMkaWNvbiA9PT0gdm9pZCAwID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUXVlc3Rpb25DaXJjbGVPdXRsaW5lZCwgbnVsbCkgOiBfdG9vbHRpcFByb3BzJGljb24sXG4gICAgICAgIHJlc3RUb29sdGlwUHJvcHMgPSBfX3Jlc3QodG9vbHRpcFByb3BzLCBbXCJpY29uXCJdKTtcbiAgICAgIHZhciB0b29sdGlwTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXAsIF9leHRlbmRzKHt9LCByZXN0VG9vbHRpcFByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChpY29uLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLXRvb2x0aXBcIiksXG4gICAgICAgIHRpdGxlOiAnJ1xuICAgICAgfSkpO1xuICAgICAgbGFiZWxDaGlsZHJlbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBsYWJlbENoaWxkcmVuLCB0b29sdGlwTm9kZSk7XG4gICAgfVxuICAgIC8vIEFkZCByZXF1aXJlZCBtYXJrIGlmIG9wdGlvbmFsXG4gICAgaWYgKHJlcXVpcmVkTWFyayA9PT0gJ29wdGlvbmFsJyAmJiAhcmVxdWlyZWQpIHtcbiAgICAgIGxhYmVsQ2hpbGRyZW4gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgbGFiZWxDaGlsZHJlbiwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tb3B0aW9uYWxcIiksXG4gICAgICAgIHRpdGxlOiBcIlwiXG4gICAgICB9LCAoZm9ybUxvY2FsZSA9PT0gbnVsbCB8fCBmb3JtTG9jYWxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmb3JtTG9jYWxlLm9wdGlvbmFsKSB8fCAoKF9hID0gZGVmYXVsdExvY2FsZS5Gb3JtKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eub3B0aW9uYWwpKSk7XG4gICAgfVxuICAgIHZhciBsYWJlbENsYXNzTmFtZSA9IGNsYXNzTmFtZXMoKF9jbGFzc05hbWVzMiA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tcmVxdWlyZWRcIiksIHJlcXVpcmVkKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLXJlcXVpcmVkLW1hcmstb3B0aW9uYWxcIiksIHJlcXVpcmVkTWFyayA9PT0gJ29wdGlvbmFsJyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1uby1jb2xvblwiKSwgIWNvbXB1dGVkQ29sb24pLCBfY2xhc3NOYW1lczIpKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29sLCBfZXh0ZW5kcyh7fSwgbWVyZ2VkTGFiZWxDb2wsIHtcbiAgICAgIGNsYXNzTmFtZTogbGFiZWxDb2xDbGFzc05hbWVcbiAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiLCB7XG4gICAgICBodG1sRm9yOiBodG1sRm9yLFxuICAgICAgY2xhc3NOYW1lOiBsYWJlbENsYXNzTmFtZSxcbiAgICAgIHRpdGxlOiB0eXBlb2YgbGFiZWwgPT09ICdzdHJpbmcnID8gbGFiZWwgOiAnJ1xuICAgIH0sIGxhYmVsQ2hpbGRyZW4pKTtcbiAgfSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgRm9ybUl0ZW1MYWJlbDsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IENvbCBmcm9tICcuLi9ncmlkL2NvbCc7XG5pbXBvcnQgeyBGb3JtQ29udGV4dCwgRm9ybUl0ZW1QcmVmaXhDb250ZXh0IH0gZnJvbSAnLi9jb250ZXh0JztcbmltcG9ydCBFcnJvckxpc3QgZnJvbSAnLi9FcnJvckxpc3QnO1xudmFyIEZvcm1JdGVtSW5wdXQgPSBmdW5jdGlvbiBGb3JtSXRlbUlucHV0KHByb3BzKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgc3RhdHVzID0gcHJvcHMuc3RhdHVzLFxuICAgIHdyYXBwZXJDb2wgPSBwcm9wcy53cmFwcGVyQ29sLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgZXJyb3JzID0gcHJvcHMuZXJyb3JzLFxuICAgIHdhcm5pbmdzID0gcHJvcHMud2FybmluZ3MsXG4gICAgZm9ybUl0ZW1SZW5kZXIgPSBwcm9wcy5faW50ZXJuYWxJdGVtUmVuZGVyLFxuICAgIGV4dHJhID0gcHJvcHMuZXh0cmEsXG4gICAgaGVscCA9IHByb3BzLmhlbHAsXG4gICAgZmllbGRJZCA9IHByb3BzLmZpZWxkSWQsXG4gICAgbWFyZ2luQm90dG9tID0gcHJvcHMubWFyZ2luQm90dG9tLFxuICAgIG9uRXJyb3JWaXNpYmxlQ2hhbmdlZCA9IHByb3BzLm9uRXJyb3JWaXNpYmxlQ2hhbmdlZDtcbiAgdmFyIGJhc2VDbGFzc05hbWUgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW1cIik7XG4gIHZhciBmb3JtQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoRm9ybUNvbnRleHQpO1xuICB2YXIgbWVyZ2VkV3JhcHBlckNvbCA9IHdyYXBwZXJDb2wgfHwgZm9ybUNvbnRleHQud3JhcHBlckNvbCB8fCB7fTtcbiAgdmFyIGNsYXNzTmFtZSA9IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQoYmFzZUNsYXNzTmFtZSwgXCItY29udHJvbFwiKSwgbWVyZ2VkV3JhcHBlckNvbC5jbGFzc05hbWUpO1xuICAvLyBQYXNzIHRvIHN1YiBGb3JtSXRlbSBzaG91bGQgbm90IHdpdGggY29sIGluZm9cbiAgdmFyIHN1YkZvcm1Db250ZXh0ID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9leHRlbmRzKHt9LCBmb3JtQ29udGV4dCk7XG4gIH0sIFtmb3JtQ29udGV4dF0pO1xuICBkZWxldGUgc3ViRm9ybUNvbnRleHQubGFiZWxDb2w7XG4gIGRlbGV0ZSBzdWJGb3JtQ29udGV4dC53cmFwcGVyQ29sO1xuICB2YXIgaW5wdXREb20gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChiYXNlQ2xhc3NOYW1lLCBcIi1jb250cm9sLWlucHV0XCIpXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KGJhc2VDbGFzc05hbWUsIFwiLWNvbnRyb2wtaW5wdXQtY29udGVudFwiKVxuICB9LCBjaGlsZHJlbikpO1xuICB2YXIgZm9ybUl0ZW1Db250ZXh0ID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgc3RhdHVzOiBzdGF0dXNcbiAgICB9O1xuICB9LCBbcHJlZml4Q2xzLCBzdGF0dXNdKTtcbiAgdmFyIGVycm9yTGlzdERvbSA9IG1hcmdpbkJvdHRvbSAhPT0gbnVsbCB8fCBlcnJvcnMubGVuZ3RoIHx8IHdhcm5pbmdzLmxlbmd0aCA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBzdHlsZToge1xuICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgZmxleFdyYXA6ICdub3dyYXAnXG4gICAgfVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGb3JtSXRlbVByZWZpeENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogZm9ybUl0ZW1Db250ZXh0XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVycm9yTGlzdCwge1xuICAgIGZpZWxkSWQ6IGZpZWxkSWQsXG4gICAgZXJyb3JzOiBlcnJvcnMsXG4gICAgd2FybmluZ3M6IHdhcm5pbmdzLFxuICAgIGhlbHA6IGhlbHAsXG4gICAgaGVscFN0YXR1czogc3RhdHVzLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoYmFzZUNsYXNzTmFtZSwgXCItZXhwbGFpbi1jb25uZWN0ZWRcIiksXG4gICAgb25WaXNpYmxlQ2hhbmdlZDogb25FcnJvclZpc2libGVDaGFuZ2VkXG4gIH0pKSwgISFtYXJnaW5Cb3R0b20gJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHN0eWxlOiB7XG4gICAgICB3aWR0aDogMCxcbiAgICAgIGhlaWdodDogbWFyZ2luQm90dG9tXG4gICAgfVxuICB9KSkgOiBudWxsO1xuICB2YXIgZXh0cmFQcm9wcyA9IHt9O1xuICBpZiAoZmllbGRJZCkge1xuICAgIGV4dHJhUHJvcHMuaWQgPSBcIlwiLmNvbmNhdChmaWVsZElkLCBcIl9leHRyYVwiKTtcbiAgfVxuICAvLyBJZiBleHRyYSA9IDAsICYmIHdpbGwgZ29lcyB3cm9uZ1xuICAvLyAwJiZlcnJvciAtPiAwXG4gIHZhciBleHRyYURvbSA9IGV4dHJhID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe30sIGV4dHJhUHJvcHMsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KGJhc2VDbGFzc05hbWUsIFwiLWV4dHJhXCIpXG4gIH0pLCBleHRyYSkgOiBudWxsO1xuICB2YXIgZG9tID0gZm9ybUl0ZW1SZW5kZXIgJiYgZm9ybUl0ZW1SZW5kZXIubWFyayA9PT0gJ3Byb190YWJsZV9yZW5kZXInICYmIGZvcm1JdGVtUmVuZGVyLnJlbmRlciA/IGZvcm1JdGVtUmVuZGVyLnJlbmRlcihwcm9wcywge1xuICAgIGlucHV0OiBpbnB1dERvbSxcbiAgICBlcnJvckxpc3Q6IGVycm9yTGlzdERvbSxcbiAgICBleHRyYTogZXh0cmFEb21cbiAgfSkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgaW5wdXREb20sIGVycm9yTGlzdERvbSwgZXh0cmFEb20pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRm9ybUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogc3ViRm9ybUNvbnRleHRcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29sLCBfZXh0ZW5kcyh7fSwgbWVyZ2VkV3JhcHBlckNvbCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lXG4gIH0pLCBkb20pKTtcbn07XG5leHBvcnQgZGVmYXVsdCBGb3JtSXRlbUlucHV0OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBDaGVja0NpcmNsZUZpbGxlZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvQ2hlY2tDaXJjbGVGaWxsZWRcIjtcbmltcG9ydCBDbG9zZUNpcmNsZUZpbGxlZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvQ2xvc2VDaXJjbGVGaWxsZWRcIjtcbmltcG9ydCBFeGNsYW1hdGlvbkNpcmNsZUZpbGxlZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvRXhjbGFtYXRpb25DaXJjbGVGaWxsZWRcIjtcbmltcG9ydCBMb2FkaW5nT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0xvYWRpbmdPdXRsaW5lZFwiO1xuaW1wb3J0IHVzZUxheW91dEVmZmVjdCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IG9taXQgZnJvbSBcInJjLXV0aWwvZXMvb21pdFwiO1xuaW1wb3J0IHsgUm93IH0gZnJvbSAnLi4vLi4vZ3JpZCc7XG5pbXBvcnQgRm9ybUl0ZW1MYWJlbCBmcm9tICcuLi9Gb3JtSXRlbUxhYmVsJztcbmltcG9ydCBGb3JtSXRlbUlucHV0IGZyb20gJy4uL0Zvcm1JdGVtSW5wdXQnO1xuaW1wb3J0IHsgRm9ybUNvbnRleHQsIEZvcm1JdGVtSW5wdXRDb250ZXh0LCBOb1N0eWxlSXRlbUNvbnRleHQgfSBmcm9tICcuLi9jb250ZXh0JztcbmltcG9ydCB1c2VEZWJvdW5jZSBmcm9tICcuLi9ob29rcy91c2VEZWJvdW5jZSc7XG52YXIgaWNvbk1hcCA9IHtcbiAgc3VjY2VzczogQ2hlY2tDaXJjbGVGaWxsZWQsXG4gIHdhcm5pbmc6IEV4Y2xhbWF0aW9uQ2lyY2xlRmlsbGVkLFxuICBlcnJvcjogQ2xvc2VDaXJjbGVGaWxsZWQsXG4gIHZhbGlkYXRpbmc6IExvYWRpbmdPdXRsaW5lZFxufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEl0ZW1Ib2xkZXIocHJvcHMpIHtcbiAgdmFyIF9pdGVtQ2xhc3NOYW1lO1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIGhlbHAgPSBwcm9wcy5oZWxwLFxuICAgIGVycm9ycyA9IHByb3BzLmVycm9ycyxcbiAgICB3YXJuaW5ncyA9IHByb3BzLndhcm5pbmdzLFxuICAgIHZhbGlkYXRlU3RhdHVzID0gcHJvcHMudmFsaWRhdGVTdGF0dXMsXG4gICAgbWV0YSA9IHByb3BzLm1ldGEsXG4gICAgaGFzRmVlZGJhY2sgPSBwcm9wcy5oYXNGZWVkYmFjayxcbiAgICBoaWRkZW4gPSBwcm9wcy5oaWRkZW4sXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBmaWVsZElkID0gcHJvcHMuZmllbGRJZCxcbiAgICBpc1JlcXVpcmVkID0gcHJvcHMuaXNSZXF1aXJlZCxcbiAgICBvblN1Ykl0ZW1NZXRhQ2hhbmdlID0gcHJvcHMub25TdWJJdGVtTWV0YUNoYW5nZSxcbiAgICByZXN0UHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcImNsYXNzTmFtZVwiLCBcInN0eWxlXCIsIFwiaGVscFwiLCBcImVycm9yc1wiLCBcIndhcm5pbmdzXCIsIFwidmFsaWRhdGVTdGF0dXNcIiwgXCJtZXRhXCIsIFwiaGFzRmVlZGJhY2tcIiwgXCJoaWRkZW5cIiwgXCJjaGlsZHJlblwiLCBcImZpZWxkSWRcIiwgXCJpc1JlcXVpcmVkXCIsIFwib25TdWJJdGVtTWV0YUNoYW5nZVwiXSk7XG4gIHZhciBpdGVtUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtXCIpO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KEZvcm1Db250ZXh0KSxcbiAgICByZXF1aXJlZE1hcmsgPSBfUmVhY3QkdXNlQ29udGV4dC5yZXF1aXJlZE1hcms7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBNYXJnaW4gPT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBpdGVtUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB2YXIgZGVib3VuY2VFcnJvcnMgPSB1c2VEZWJvdW5jZShlcnJvcnMpO1xuICB2YXIgZGVib3VuY2VXYXJuaW5ncyA9IHVzZURlYm91bmNlKHdhcm5pbmdzKTtcbiAgdmFyIGhhc0hlbHAgPSBoZWxwICE9PSB1bmRlZmluZWQgJiYgaGVscCAhPT0gbnVsbDtcbiAgdmFyIGhhc0Vycm9yID0gISEoaGFzSGVscCB8fCBlcnJvcnMubGVuZ3RoIHx8IHdhcm5pbmdzLmxlbmd0aCk7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShudWxsKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBtYXJnaW5Cb3R0b20gPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldE1hcmdpbkJvdHRvbSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGhhc0Vycm9yICYmIGl0ZW1SZWYuY3VycmVudCkge1xuICAgICAgdmFyIGl0ZW1TdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoaXRlbVJlZi5jdXJyZW50KTtcbiAgICAgIHNldE1hcmdpbkJvdHRvbShwYXJzZUludChpdGVtU3R5bGUubWFyZ2luQm90dG9tLCAxMCkpO1xuICAgIH1cbiAgfSwgW2hhc0Vycm9yXSk7XG4gIHZhciBvbkVycm9yVmlzaWJsZUNoYW5nZWQgPSBmdW5jdGlvbiBvbkVycm9yVmlzaWJsZUNoYW5nZWQobmV4dFZpc2libGUpIHtcbiAgICBpZiAoIW5leHRWaXNpYmxlKSB7XG4gICAgICBzZXRNYXJnaW5Cb3R0b20obnVsbCk7XG4gICAgfVxuICB9O1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gU3RhdHVzID09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbWVyZ2VkVmFsaWRhdGVTdGF0dXMgPSAnJztcbiAgaWYgKHZhbGlkYXRlU3RhdHVzICE9PSB1bmRlZmluZWQpIHtcbiAgICBtZXJnZWRWYWxpZGF0ZVN0YXR1cyA9IHZhbGlkYXRlU3RhdHVzO1xuICB9IGVsc2UgaWYgKG1ldGEudmFsaWRhdGluZykge1xuICAgIG1lcmdlZFZhbGlkYXRlU3RhdHVzID0gJ3ZhbGlkYXRpbmcnO1xuICB9IGVsc2UgaWYgKGRlYm91bmNlRXJyb3JzLmxlbmd0aCkge1xuICAgIG1lcmdlZFZhbGlkYXRlU3RhdHVzID0gJ2Vycm9yJztcbiAgfSBlbHNlIGlmIChkZWJvdW5jZVdhcm5pbmdzLmxlbmd0aCkge1xuICAgIG1lcmdlZFZhbGlkYXRlU3RhdHVzID0gJ3dhcm5pbmcnO1xuICB9IGVsc2UgaWYgKG1ldGEudG91Y2hlZCkge1xuICAgIG1lcmdlZFZhbGlkYXRlU3RhdHVzID0gJ3N1Y2Nlc3MnO1xuICB9XG4gIHZhciBmb3JtSXRlbVN0YXR1c0NvbnRleHQgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZmVlZGJhY2tJY29uO1xuICAgIGlmIChoYXNGZWVkYmFjaykge1xuICAgICAgdmFyIEljb25Ob2RlID0gbWVyZ2VkVmFsaWRhdGVTdGF0dXMgJiYgaWNvbk1hcFttZXJnZWRWYWxpZGF0ZVN0YXR1c107XG4gICAgICBmZWVkYmFja0ljb24gPSBJY29uTm9kZSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChpdGVtUHJlZml4Q2xzLCBcIi1mZWVkYmFjay1pY29uXCIpLCBcIlwiLmNvbmNhdChpdGVtUHJlZml4Q2xzLCBcIi1mZWVkYmFjay1pY29uLVwiKS5jb25jYXQobWVyZ2VkVmFsaWRhdGVTdGF0dXMpKVxuICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSWNvbk5vZGUsIG51bGwpKSA6IG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IG1lcmdlZFZhbGlkYXRlU3RhdHVzLFxuICAgICAgaGFzRmVlZGJhY2s6IGhhc0ZlZWRiYWNrLFxuICAgICAgZmVlZGJhY2tJY29uOiBmZWVkYmFja0ljb24sXG4gICAgICBpc0Zvcm1JdGVtSW5wdXQ6IHRydWVcbiAgICB9O1xuICB9LCBbbWVyZ2VkVmFsaWRhdGVTdGF0dXMsIGhhc0ZlZWRiYWNrXSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBpdGVtQ2xhc3NOYW1lID0gKF9pdGVtQ2xhc3NOYW1lID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfaXRlbUNsYXNzTmFtZSwgaXRlbVByZWZpeENscywgdHJ1ZSksIF9kZWZpbmVQcm9wZXJ0eShfaXRlbUNsYXNzTmFtZSwgXCJcIi5jb25jYXQoaXRlbVByZWZpeENscywgXCItd2l0aC1oZWxwXCIpLCBoYXNIZWxwIHx8IGRlYm91bmNlRXJyb3JzLmxlbmd0aCB8fCBkZWJvdW5jZVdhcm5pbmdzLmxlbmd0aCksIF9kZWZpbmVQcm9wZXJ0eShfaXRlbUNsYXNzTmFtZSwgXCJcIi5jb25jYXQoY2xhc3NOYW1lKSwgISFjbGFzc05hbWUpLCBfZGVmaW5lUHJvcGVydHkoX2l0ZW1DbGFzc05hbWUsIFwiXCIuY29uY2F0KGl0ZW1QcmVmaXhDbHMsIFwiLWhhcy1mZWVkYmFja1wiKSwgbWVyZ2VkVmFsaWRhdGVTdGF0dXMgJiYgaGFzRmVlZGJhY2spLCBfZGVmaW5lUHJvcGVydHkoX2l0ZW1DbGFzc05hbWUsIFwiXCIuY29uY2F0KGl0ZW1QcmVmaXhDbHMsIFwiLWhhcy1zdWNjZXNzXCIpLCBtZXJnZWRWYWxpZGF0ZVN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSwgX2RlZmluZVByb3BlcnR5KF9pdGVtQ2xhc3NOYW1lLCBcIlwiLmNvbmNhdChpdGVtUHJlZml4Q2xzLCBcIi1oYXMtd2FybmluZ1wiKSwgbWVyZ2VkVmFsaWRhdGVTdGF0dXMgPT09ICd3YXJuaW5nJyksIF9kZWZpbmVQcm9wZXJ0eShfaXRlbUNsYXNzTmFtZSwgXCJcIi5jb25jYXQoaXRlbVByZWZpeENscywgXCItaGFzLWVycm9yXCIpLCBtZXJnZWRWYWxpZGF0ZVN0YXR1cyA9PT0gJ2Vycm9yJyksIF9kZWZpbmVQcm9wZXJ0eShfaXRlbUNsYXNzTmFtZSwgXCJcIi5jb25jYXQoaXRlbVByZWZpeENscywgXCItaXMtdmFsaWRhdGluZ1wiKSwgbWVyZ2VkVmFsaWRhdGVTdGF0dXMgPT09ICd2YWxpZGF0aW5nJyksIF9kZWZpbmVQcm9wZXJ0eShfaXRlbUNsYXNzTmFtZSwgXCJcIi5jb25jYXQoaXRlbVByZWZpeENscywgXCItaGlkZGVuXCIpLCBoaWRkZW4pLCBfaXRlbUNsYXNzTmFtZSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGl0ZW1DbGFzc05hbWUpLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICByZWY6IGl0ZW1SZWZcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUm93LCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChpdGVtUHJlZml4Q2xzLCBcIi1yb3dcIilcbiAgfSwgb21pdChyZXN0UHJvcHMsIFsnX2ludGVybmFsSXRlbVJlbmRlcicsICdjb2xvbicsICdkZXBlbmRlbmNpZXMnLCAnZXh0cmEnLCAnZmllbGRLZXknLCAnZ2V0VmFsdWVGcm9tRXZlbnQnLCAnZ2V0VmFsdWVQcm9wcycsICdodG1sRm9yJywgJ2lkJywgJ2luaXRpYWxWYWx1ZScsICdpc0xpc3RGaWVsZCcsICdsYWJlbCcsICdsYWJlbEFsaWduJywgJ2xhYmVsQ29sJywgJ2xhYmVsV3JhcCcsICdtZXNzYWdlVmFyaWFibGVzJywgJ25hbWUnLCAnbm9ybWFsaXplJywgJ25vU3R5bGUnLCAncHJlc2VydmUnLCAncmVxdWlyZWQnLCAncmVxdWlyZWRNYXJrJywgJ3J1bGVzJywgJ3Nob3VsZFVwZGF0ZScsICd0cmlnZ2VyJywgJ3Rvb2x0aXAnLCAndmFsaWRhdGVGaXJzdCcsICd2YWxpZGF0ZVRyaWdnZXInLCAndmFsdWVQcm9wTmFtZScsICd3cmFwcGVyQ29sJ10pKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRm9ybUl0ZW1MYWJlbCwgX2V4dGVuZHMoe1xuICAgIGh0bWxGb3I6IGZpZWxkSWQsXG4gICAgcmVxdWlyZWQ6IGlzUmVxdWlyZWQsXG4gICAgcmVxdWlyZWRNYXJrOiByZXF1aXJlZE1hcmtcbiAgfSwgcHJvcHMsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENsc1xuICB9KSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZvcm1JdGVtSW5wdXQsIF9leHRlbmRzKHt9LCBwcm9wcywgbWV0YSwge1xuICAgIGVycm9yczogZGVib3VuY2VFcnJvcnMsXG4gICAgd2FybmluZ3M6IGRlYm91bmNlV2FybmluZ3MsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgc3RhdHVzOiBtZXJnZWRWYWxpZGF0ZVN0YXR1cyxcbiAgICBoZWxwOiBoZWxwLFxuICAgIG1hcmdpbkJvdHRvbTogbWFyZ2luQm90dG9tLFxuICAgIG9uRXJyb3JWaXNpYmxlQ2hhbmdlZDogb25FcnJvclZpc2libGVDaGFuZ2VkXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChOb1N0eWxlSXRlbUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogb25TdWJJdGVtTWV0YUNoYW5nZVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGb3JtSXRlbUlucHV0Q29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBmb3JtSXRlbVN0YXR1c0NvbnRleHRcbiAgfSwgY2hpbGRyZW4pKSkpLCAhIW1hcmdpbkJvdHRvbSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChpdGVtUHJlZml4Q2xzLCBcIi1tYXJnaW4tb2Zmc2V0XCIpLFxuICAgIHN0eWxlOiB7XG4gICAgICBtYXJnaW5Cb3R0b206IC1tYXJnaW5Cb3R0b21cbiAgICB9XG4gIH0pKTtcbn0iLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCB7IEZpZWxkLCBGaWVsZENvbnRleHQsIExpc3RDb250ZXh0IH0gZnJvbSAncmMtZmllbGQtZm9ybSc7XG5pbXBvcnQgdXNlU3RhdGUgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlU3RhdGVcIjtcbmltcG9ydCB7IHN1cHBvcnRSZWYgfSBmcm9tIFwicmMtdXRpbC9lcy9yZWZcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlRm9ybUl0ZW1TdGF0dXMgZnJvbSAnLi4vaG9va3MvdXNlRm9ybUl0ZW1TdGF0dXMnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uLy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgeyBjbG9uZUVsZW1lbnQsIGlzVmFsaWRFbGVtZW50IH0gZnJvbSAnLi4vLi4vX3V0aWwvcmVhY3ROb2RlJztcbmltcG9ydCB7IHR1cGxlIH0gZnJvbSAnLi4vLi4vX3V0aWwvdHlwZSc7XG5pbXBvcnQgd2FybmluZyBmcm9tICcuLi8uLi9fdXRpbC93YXJuaW5nJztcbmltcG9ydCB7IEZvcm1Db250ZXh0LCBOb1N0eWxlSXRlbUNvbnRleHQgfSBmcm9tICcuLi9jb250ZXh0JztcbmltcG9ydCB1c2VGcmFtZVN0YXRlIGZyb20gJy4uL2hvb2tzL3VzZUZyYW1lU3RhdGUnO1xuaW1wb3J0IHVzZUl0ZW1SZWYgZnJvbSAnLi4vaG9va3MvdXNlSXRlbVJlZic7XG5pbXBvcnQgeyBnZXRGaWVsZElkLCB0b0FycmF5IH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgSXRlbUhvbGRlciBmcm9tICcuL0l0ZW1Ib2xkZXInO1xudmFyIE5BTUVfU1BMSVQgPSAnX19TUExJVF9fJztcbnZhciBWYWxpZGF0ZVN0YXR1c2VzID0gdHVwbGUoJ3N1Y2Nlc3MnLCAnd2FybmluZycsICdlcnJvcicsICd2YWxpZGF0aW5nJywgJycpO1xudmFyIE1lbW9JbnB1dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5tZW1vKGZ1bmN0aW9uIChfcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG4gIHJldHVybiBjaGlsZHJlbjtcbn0sIGZ1bmN0aW9uIChwcmV2LCBuZXh0KSB7XG4gIHJldHVybiBwcmV2LnZhbHVlID09PSBuZXh0LnZhbHVlICYmIHByZXYudXBkYXRlID09PSBuZXh0LnVwZGF0ZSAmJiBwcmV2LmNoaWxkUHJvcHMubGVuZ3RoID09PSBuZXh0LmNoaWxkUHJvcHMubGVuZ3RoICYmIHByZXYuY2hpbGRQcm9wcy5ldmVyeShmdW5jdGlvbiAodmFsdWUsIGluZGV4KSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSBuZXh0LmNoaWxkUHJvcHNbaW5kZXhdO1xuICB9KTtcbn0pO1xuZnVuY3Rpb24gaGFzVmFsaWROYW1lKG5hbWUpIHtcbiAgaWYgKG5hbWUgPT09IG51bGwpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGZhbHNlLCAnRm9ybS5JdGVtJywgJ2BudWxsYCBpcyBwYXNzZWQgYXMgYG5hbWVgIHByb3BlcnR5JykgOiB2b2lkIDA7XG4gIH1cbiAgcmV0dXJuICEobmFtZSA9PT0gdW5kZWZpbmVkIHx8IG5hbWUgPT09IG51bGwpO1xufVxuZnVuY3Rpb24gZ2VuRW1wdHlNZXRhKCkge1xuICByZXR1cm4ge1xuICAgIGVycm9yczogW10sXG4gICAgd2FybmluZ3M6IFtdLFxuICAgIHRvdWNoZWQ6IGZhbHNlLFxuICAgIHZhbGlkYXRpbmc6IGZhbHNlLFxuICAgIG5hbWU6IFtdXG4gIH07XG59XG5mdW5jdGlvbiBJbnRlcm5hbEZvcm1JdGVtKHByb3BzKSB7XG4gIHZhciBuYW1lID0gcHJvcHMubmFtZSxcbiAgICBub1N0eWxlID0gcHJvcHMubm9TdHlsZSxcbiAgICBkZXBlbmRlbmNpZXMgPSBwcm9wcy5kZXBlbmRlbmNpZXMsXG4gICAgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHNob3VsZFVwZGF0ZSA9IHByb3BzLnNob3VsZFVwZGF0ZSxcbiAgICBydWxlcyA9IHByb3BzLnJ1bGVzLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgcmVxdWlyZWQgPSBwcm9wcy5yZXF1aXJlZCxcbiAgICBsYWJlbCA9IHByb3BzLmxhYmVsLFxuICAgIG1lc3NhZ2VWYXJpYWJsZXMgPSBwcm9wcy5tZXNzYWdlVmFyaWFibGVzLFxuICAgIF9wcm9wcyR0cmlnZ2VyID0gcHJvcHMudHJpZ2dlcixcbiAgICB0cmlnZ2VyID0gX3Byb3BzJHRyaWdnZXIgPT09IHZvaWQgMCA/ICdvbkNoYW5nZScgOiBfcHJvcHMkdHJpZ2dlcixcbiAgICB2YWxpZGF0ZVRyaWdnZXIgPSBwcm9wcy52YWxpZGF0ZVRyaWdnZXIsXG4gICAgaGlkZGVuID0gcHJvcHMuaGlkZGVuO1xuICB2YXIgX3VzZUNvbnRleHQgPSB1c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF91c2VDb250ZXh0LmdldFByZWZpeENscztcbiAgdmFyIF91c2VDb250ZXh0MiA9IHVzZUNvbnRleHQoRm9ybUNvbnRleHQpLFxuICAgIGZvcm1OYW1lID0gX3VzZUNvbnRleHQyLm5hbWU7XG4gIHZhciBpc1JlbmRlclByb3BzID0gdHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nO1xuICB2YXIgbm90aWZ5UGFyZW50TWV0YUNoYW5nZSA9IHVzZUNvbnRleHQoTm9TdHlsZUl0ZW1Db250ZXh0KTtcbiAgdmFyIF91c2VDb250ZXh0MyA9IHVzZUNvbnRleHQoRmllbGRDb250ZXh0KSxcbiAgICBjb250ZXh0VmFsaWRhdGVUcmlnZ2VyID0gX3VzZUNvbnRleHQzLnZhbGlkYXRlVHJpZ2dlcjtcbiAgdmFyIG1lcmdlZFZhbGlkYXRlVHJpZ2dlciA9IHZhbGlkYXRlVHJpZ2dlciAhPT0gdW5kZWZpbmVkID8gdmFsaWRhdGVUcmlnZ2VyIDogY29udGV4dFZhbGlkYXRlVHJpZ2dlcjtcbiAgdmFyIGhhc05hbWUgPSBoYXNWYWxpZE5hbWUobmFtZSk7XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2Zvcm0nLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IE1JU0MgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBHZXQgYG5vU3R5bGVgIHJlcXVpcmVkIGluZm9cbiAgdmFyIGxpc3RDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChMaXN0Q29udGV4dCk7XG4gIHZhciBmaWVsZEtleVBhdGhSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IEVycm9ycyA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gPj4+Pj4gQ29sbGVjdCBzdWIgZmllbGQgZXJyb3JzXG4gIHZhciBfdXNlRnJhbWVTdGF0ZSA9IHVzZUZyYW1lU3RhdGUoe30pLFxuICAgIF91c2VGcmFtZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VGcmFtZVN0YXRlLCAyKSxcbiAgICBzdWJGaWVsZEVycm9ycyA9IF91c2VGcmFtZVN0YXRlMlswXSxcbiAgICBzZXRTdWJGaWVsZEVycm9ycyA9IF91c2VGcmFtZVN0YXRlMlsxXTtcbiAgLy8gPj4+Pj4gQ3VycmVudCBmaWVsZCBlcnJvcnNcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnZW5FbXB0eU1ldGEoKTtcbiAgICB9KSxcbiAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICBtZXRhID0gX3VzZVN0YXRlMlswXSxcbiAgICBzZXRNZXRhID0gX3VzZVN0YXRlMlsxXTtcbiAgdmFyIG9uTWV0YUNoYW5nZSA9IGZ1bmN0aW9uIG9uTWV0YUNoYW5nZShuZXh0TWV0YSkge1xuICAgIC8vIFRoaXMga2V5SW5mbyBpcyBub3QgY29ycmVjdCB3aGVuIGZpZWxkIGlzIHJlbW92ZWRcbiAgICAvLyBTaW5jZSBvcmlnaW4ga2V5TWFuYWdlciBubyBsb25nZXIga2VlcCB0aGUgb3JpZ2luIGtleSBhbnltb3JlXG4gICAgLy8gV2hpY2ggbWVhbnMgd2UgbmVlZCBjYWNoZSBvcmlnaW4gb25lIGFuZCByZXVzZSB3aGVuIHJlbW92ZWRcbiAgICB2YXIga2V5SW5mbyA9IGxpc3RDb250ZXh0ID09PSBudWxsIHx8IGxpc3RDb250ZXh0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBsaXN0Q29udGV4dC5nZXRLZXkobmV4dE1ldGEubmFtZSk7XG4gICAgLy8gRGVzdHJveSB3aWxsIHJlc2V0IGFsbCB0aGUgbWV0YVxuICAgIHNldE1ldGEobmV4dE1ldGEuZGVzdHJveSA/IGdlbkVtcHR5TWV0YSgpIDogbmV4dE1ldGEsIHRydWUpO1xuICAgIC8vIEJ1bXAgdG8gcGFyZW50IHNpbmNlIG5vU3R5bGVcbiAgICBpZiAobm9TdHlsZSAmJiBub3RpZnlQYXJlbnRNZXRhQ2hhbmdlKSB7XG4gICAgICB2YXIgbmFtZVBhdGggPSBuZXh0TWV0YS5uYW1lO1xuICAgICAgaWYgKCFuZXh0TWV0YS5kZXN0cm95KSB7XG4gICAgICAgIGlmIChrZXlJbmZvICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB2YXIgX2tleUluZm8gPSBfc2xpY2VkVG9BcnJheShrZXlJbmZvLCAyKSxcbiAgICAgICAgICAgIGZpZWxkS2V5ID0gX2tleUluZm9bMF0sXG4gICAgICAgICAgICByZXN0UGF0aCA9IF9rZXlJbmZvWzFdO1xuICAgICAgICAgIG5hbWVQYXRoID0gW2ZpZWxkS2V5XS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHJlc3RQYXRoKSk7XG4gICAgICAgICAgZmllbGRLZXlQYXRoUmVmLmN1cnJlbnQgPSBuYW1lUGF0aDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVXNlIG9yaWdpbiBjYWNoZSBkYXRhXG4gICAgICAgIG5hbWVQYXRoID0gZmllbGRLZXlQYXRoUmVmLmN1cnJlbnQgfHwgbmFtZVBhdGg7XG4gICAgICB9XG4gICAgICBub3RpZnlQYXJlbnRNZXRhQ2hhbmdlKG5leHRNZXRhLCBuYW1lUGF0aCk7XG4gICAgfVxuICB9O1xuICAvLyA+Pj4+PiBDb2xsZWN0IG5vU3R5bGUgRmllbGQgZXJyb3IgdG8gdGhlIHRvcCBGb3JtSXRlbVxuICB2YXIgb25TdWJJdGVtTWV0YUNoYW5nZSA9IGZ1bmN0aW9uIG9uU3ViSXRlbU1ldGFDaGFuZ2Uoc3ViTWV0YSwgdW5pcXVlS2V5cykge1xuICAgIC8vIE9ubHkgYG5vU3R5bGVgIHN1YiBpdGVtIHdpbGwgdHJpZ2dlclxuICAgIHNldFN1YkZpZWxkRXJyb3JzKGZ1bmN0aW9uIChwcmV2U3ViRmllbGRFcnJvcnMpIHtcbiAgICAgIHZhciBjbG9uZSA9IF9leHRlbmRzKHt9LCBwcmV2U3ViRmllbGRFcnJvcnMpO1xuICAgICAgLy8gbmFtZTogWyd1c2VyJywgMV0gKyBrZXk6IFs0XSA9IFsndXNlcicsIDRdXG4gICAgICB2YXIgbWVyZ2VkTmFtZVBhdGggPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHN1Yk1ldGEubmFtZS5zbGljZSgwLCAtMSkpLCBfdG9Db25zdW1hYmxlQXJyYXkodW5pcXVlS2V5cykpO1xuICAgICAgdmFyIG1lcmdlZE5hbWVLZXkgPSBtZXJnZWROYW1lUGF0aC5qb2luKE5BTUVfU1BMSVQpO1xuICAgICAgaWYgKHN1Yk1ldGEuZGVzdHJveSkge1xuICAgICAgICAvLyBSZW1vdmVcbiAgICAgICAgZGVsZXRlIGNsb25lW21lcmdlZE5hbWVLZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVXBkYXRlXG4gICAgICAgIGNsb25lW21lcmdlZE5hbWVLZXldID0gc3ViTWV0YTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9KTtcbiAgfTtcbiAgLy8gPj4+Pj4gR2V0IG1lcmdlZCBlcnJvcnNcbiAgdmFyIF9SZWFjdCR1c2VNZW1vID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZXJyb3JMaXN0ID0gX3RvQ29uc3VtYWJsZUFycmF5KG1ldGEuZXJyb3JzKTtcbiAgICAgIHZhciB3YXJuaW5nTGlzdCA9IF90b0NvbnN1bWFibGVBcnJheShtZXRhLndhcm5pbmdzKTtcbiAgICAgIE9iamVjdC52YWx1ZXMoc3ViRmllbGRFcnJvcnMpLmZvckVhY2goZnVuY3Rpb24gKHN1YkZpZWxkRXJyb3IpIHtcbiAgICAgICAgZXJyb3JMaXN0LnB1c2guYXBwbHkoZXJyb3JMaXN0LCBfdG9Db25zdW1hYmxlQXJyYXkoc3ViRmllbGRFcnJvci5lcnJvcnMgfHwgW10pKTtcbiAgICAgICAgd2FybmluZ0xpc3QucHVzaC5hcHBseSh3YXJuaW5nTGlzdCwgX3RvQ29uc3VtYWJsZUFycmF5KHN1YkZpZWxkRXJyb3Iud2FybmluZ3MgfHwgW10pKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFtlcnJvckxpc3QsIHdhcm5pbmdMaXN0XTtcbiAgICB9LCBbc3ViRmllbGRFcnJvcnMsIG1ldGEuZXJyb3JzLCBtZXRhLndhcm5pbmdzXSksXG4gICAgX1JlYWN0JHVzZU1lbW8yID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZU1lbW8sIDIpLFxuICAgIG1lcmdlZEVycm9ycyA9IF9SZWFjdCR1c2VNZW1vMlswXSxcbiAgICBtZXJnZWRXYXJuaW5ncyA9IF9SZWFjdCR1c2VNZW1vMlsxXTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IENoaWxkcmVuIFJlZiA9PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGdldEl0ZW1SZWYgPSB1c2VJdGVtUmVmKCk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIGZ1bmN0aW9uIHJlbmRlckxheW91dChiYXNlQ2hpbGRyZW4sIGZpZWxkSWQsIGlzUmVxdWlyZWQpIHtcbiAgICBpZiAobm9TdHlsZSAmJiAhaGlkZGVuKSB7XG4gICAgICByZXR1cm4gYmFzZUNoaWxkcmVuO1xuICAgIH1cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSXRlbUhvbGRlciwgX2V4dGVuZHMoe1xuICAgICAga2V5OiBcInJvd1wiXG4gICAgfSwgcHJvcHMsIHtcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgZmllbGRJZDogZmllbGRJZCxcbiAgICAgIGlzUmVxdWlyZWQ6IGlzUmVxdWlyZWQsXG4gICAgICBlcnJvcnM6IG1lcmdlZEVycm9ycyxcbiAgICAgIHdhcm5pbmdzOiBtZXJnZWRXYXJuaW5ncyxcbiAgICAgIG1ldGE6IG1ldGEsXG4gICAgICBvblN1Ykl0ZW1NZXRhQ2hhbmdlOiBvblN1Ykl0ZW1NZXRhQ2hhbmdlXG4gICAgfSksIGJhc2VDaGlsZHJlbik7XG4gIH1cbiAgaWYgKCFoYXNOYW1lICYmICFpc1JlbmRlclByb3BzICYmICFkZXBlbmRlbmNpZXMpIHtcbiAgICByZXR1cm4gcmVuZGVyTGF5b3V0KGNoaWxkcmVuKTtcbiAgfVxuICB2YXIgdmFyaWFibGVzID0ge307XG4gIGlmICh0eXBlb2YgbGFiZWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyaWFibGVzLmxhYmVsID0gbGFiZWw7XG4gIH0gZWxzZSBpZiAobmFtZSkge1xuICAgIHZhcmlhYmxlcy5sYWJlbCA9IFN0cmluZyhuYW1lKTtcbiAgfVxuICBpZiAobWVzc2FnZVZhcmlhYmxlcykge1xuICAgIHZhcmlhYmxlcyA9IF9leHRlbmRzKF9leHRlbmRzKHt9LCB2YXJpYWJsZXMpLCBtZXNzYWdlVmFyaWFibGVzKTtcbiAgfVxuICAvLyA+Pj4+PiBXaXRoIEZpZWxkXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGaWVsZCwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgbWVzc2FnZVZhcmlhYmxlczogdmFyaWFibGVzLFxuICAgIHRyaWdnZXI6IHRyaWdnZXIsXG4gICAgdmFsaWRhdGVUcmlnZ2VyOiBtZXJnZWRWYWxpZGF0ZVRyaWdnZXIsXG4gICAgb25NZXRhQ2hhbmdlOiBvbk1ldGFDaGFuZ2VcbiAgfSksIGZ1bmN0aW9uIChjb250cm9sLCByZW5kZXJNZXRhLCBjb250ZXh0KSB7XG4gICAgdmFyIG1lcmdlZE5hbWUgPSB0b0FycmF5KG5hbWUpLmxlbmd0aCAmJiByZW5kZXJNZXRhID8gcmVuZGVyTWV0YS5uYW1lIDogW107XG4gICAgdmFyIGZpZWxkSWQgPSBnZXRGaWVsZElkKG1lcmdlZE5hbWUsIGZvcm1OYW1lKTtcbiAgICB2YXIgaXNSZXF1aXJlZCA9IHJlcXVpcmVkICE9PSB1bmRlZmluZWQgPyByZXF1aXJlZCA6ICEhKHJ1bGVzICYmIHJ1bGVzLnNvbWUoZnVuY3Rpb24gKHJ1bGUpIHtcbiAgICAgIGlmIChydWxlICYmIF90eXBlb2YocnVsZSkgPT09ICdvYmplY3QnICYmIHJ1bGUucmVxdWlyZWQgJiYgIXJ1bGUud2FybmluZ09ubHkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHJ1bGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIHJ1bGVFbnRpdHkgPSBydWxlKGNvbnRleHQpO1xuICAgICAgICByZXR1cm4gcnVsZUVudGl0eSAmJiBydWxlRW50aXR5LnJlcXVpcmVkICYmICFydWxlRW50aXR5Lndhcm5pbmdPbmx5O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pKTtcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBDaGlsZHJlbiA9PT09PT09PT09PT09PT09PT09PT09PVxuICAgIHZhciBtZXJnZWRDb250cm9sID0gX2V4dGVuZHMoe30sIGNvbnRyb2wpO1xuICAgIHZhciBjaGlsZE5vZGUgPSBudWxsO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoIShzaG91bGRVcGRhdGUgJiYgZGVwZW5kZW5jaWVzKSwgJ0Zvcm0uSXRlbScsIFwiYHNob3VsZFVwZGF0ZWAgYW5kIGBkZXBlbmRlbmNpZXNgIHNob3VsZG4ndCBiZSB1c2VkIHRvZ2V0aGVyLiBTZWUgaHR0cHM6Ly91LmFudC5kZXNpZ24vZm9ybS1kZXBzLlwiKSA6IHZvaWQgMDtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikgJiYgaGFzTmFtZSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhmYWxzZSwgJ0Zvcm0uSXRlbScsICdBIGBGb3JtLkl0ZW1gIHdpdGggYSBgbmFtZWAgcHJvcCBtdXN0IGhhdmUgYSBzaW5nbGUgY2hpbGQgZWxlbWVudC4gRm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byByZW5kZXIgbW9yZSBjb21wbGV4IGZvcm0gaXRlbXMsIHNlZSBodHRwczovL3UuYW50LmRlc2lnbi9jb21wbGV4LWZvcm0taXRlbS4nKSA6IHZvaWQgMDtcbiAgICAgIGNoaWxkTm9kZSA9IGNoaWxkcmVuO1xuICAgIH0gZWxzZSBpZiAoaXNSZW5kZXJQcm9wcyAmJiAoIShzaG91bGRVcGRhdGUgfHwgZGVwZW5kZW5jaWVzKSB8fCBoYXNOYW1lKSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghIShzaG91bGRVcGRhdGUgfHwgZGVwZW5kZW5jaWVzKSwgJ0Zvcm0uSXRlbScsICdBIGBGb3JtLkl0ZW1gIHdpdGggYSByZW5kZXIgZnVuY3Rpb24gbXVzdCBoYXZlIGVpdGhlciBgc2hvdWxkVXBkYXRlYCBvciBgZGVwZW5kZW5jaWVzYC4nKSA6IHZvaWQgMDtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoIWhhc05hbWUsICdGb3JtLkl0ZW0nLCBcIkEgYEZvcm0uSXRlbWAgd2l0aCBhIHJlbmRlciBmdW5jdGlvbiBjYW5ub3QgYmUgYSBmaWVsZCwgYW5kIHRodXMgY2Fubm90IGhhdmUgYSBgbmFtZWAgcHJvcC5cIikgOiB2b2lkIDA7XG4gICAgfSBlbHNlIGlmIChkZXBlbmRlbmNpZXMgJiYgIWlzUmVuZGVyUHJvcHMgJiYgIWhhc05hbWUpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoZmFsc2UsICdGb3JtLkl0ZW0nLCAnTXVzdCBzZXQgYG5hbWVgIG9yIHVzZSBhIHJlbmRlciBmdW5jdGlvbiB3aGVuIGBkZXBlbmRlbmNpZXNgIGlzIHNldC4nKSA6IHZvaWQgMDtcbiAgICB9IGVsc2UgaWYgKGlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhjaGlsZHJlbi5wcm9wcy5kZWZhdWx0VmFsdWUgPT09IHVuZGVmaW5lZCwgJ0Zvcm0uSXRlbScsICdgZGVmYXVsdFZhbHVlYCB3aWxsIG5vdCB3b3JrIG9uIGNvbnRyb2xsZWQgRmllbGQuIFlvdSBzaG91bGQgdXNlIGBpbml0aWFsVmFsdWVzYCBvZiBGb3JtIGluc3RlYWQuJykgOiB2b2lkIDA7XG4gICAgICB2YXIgY2hpbGRQcm9wcyA9IF9leHRlbmRzKF9leHRlbmRzKHt9LCBjaGlsZHJlbi5wcm9wcyksIG1lcmdlZENvbnRyb2wpO1xuICAgICAgaWYgKCFjaGlsZFByb3BzLmlkKSB7XG4gICAgICAgIGNoaWxkUHJvcHMuaWQgPSBmaWVsZElkO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BzLmhlbHAgfHwgbWVyZ2VkRXJyb3JzLmxlbmd0aCA+IDAgfHwgbWVyZ2VkV2FybmluZ3MubGVuZ3RoID4gMCB8fCBwcm9wcy5leHRyYSkge1xuICAgICAgICB2YXIgZGVzY3JpYmVkYnlBcnIgPSBbXTtcbiAgICAgICAgaWYgKHByb3BzLmhlbHAgfHwgbWVyZ2VkRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBkZXNjcmliZWRieUFyci5wdXNoKFwiXCIuY29uY2F0KGZpZWxkSWQsIFwiX2hlbHBcIikpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wcy5leHRyYSkge1xuICAgICAgICAgIGRlc2NyaWJlZGJ5QXJyLnB1c2goXCJcIi5jb25jYXQoZmllbGRJZCwgXCJfZXh0cmFcIikpO1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkUHJvcHNbJ2FyaWEtZGVzY3JpYmVkYnknXSA9IGRlc2NyaWJlZGJ5QXJyLmpvaW4oJyAnKTtcbiAgICAgIH1cbiAgICAgIGlmIChtZXJnZWRFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjaGlsZFByb3BzWydhcmlhLWludmFsaWQnXSA9ICd0cnVlJztcbiAgICAgIH1cbiAgICAgIGlmIChpc1JlcXVpcmVkKSB7XG4gICAgICAgIGNoaWxkUHJvcHNbJ2FyaWEtcmVxdWlyZWQnXSA9ICd0cnVlJztcbiAgICAgIH1cbiAgICAgIGlmIChzdXBwb3J0UmVmKGNoaWxkcmVuKSkge1xuICAgICAgICBjaGlsZFByb3BzLnJlZiA9IGdldEl0ZW1SZWYobWVyZ2VkTmFtZSwgY2hpbGRyZW4pO1xuICAgICAgfVxuICAgICAgLy8gV2Ugc2hvdWxkIGtlZXAgdXNlciBvcmlnaW4gZXZlbnQgaGFuZGxlclxuICAgICAgdmFyIHRyaWdnZXJzID0gbmV3IFNldChbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHRvQXJyYXkodHJpZ2dlcikpLCBfdG9Db25zdW1hYmxlQXJyYXkodG9BcnJheShtZXJnZWRWYWxpZGF0ZVRyaWdnZXIpKSkpO1xuICAgICAgdHJpZ2dlcnMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgICAgIGNoaWxkUHJvcHNbZXZlbnROYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgX2EyLCBfYzI7XG4gICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgICAoX2EgPSBtZXJnZWRDb250cm9sW2V2ZW50TmFtZV0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX2EyID0gX2EpLmNhbGwuYXBwbHkoX2EyLCBbbWVyZ2VkQ29udHJvbF0uY29uY2F0KGFyZ3MpKTtcbiAgICAgICAgICAoX2MgPSAoX2IgPSBjaGlsZHJlbi5wcm9wcylbZXZlbnROYW1lXSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfYzIgPSBfYykuY2FsbC5hcHBseShfYzIsIFtfYl0uY29uY2F0KGFyZ3MpKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgLy8gTGlzdCBvZiBwcm9wcyB0aGF0IG5lZWQgdG8gYmUgd2F0Y2hlZCBmb3IgY2hhbmdlcyAtPiBpZiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCBpbiBNZW1vSW5wdXQgLT4gcmVyZW5kZXJcbiAgICAgIHZhciB3YXRjaGluZ0NoaWxkUHJvcHMgPSBbY2hpbGRQcm9wc1snYXJpYS1yZXF1aXJlZCddLCBjaGlsZFByb3BzWydhcmlhLWludmFsaWQnXSwgY2hpbGRQcm9wc1snYXJpYS1kZXNjcmliZWRieSddXTtcbiAgICAgIGNoaWxkTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE1lbW9JbnB1dCwge1xuICAgICAgICB2YWx1ZTogbWVyZ2VkQ29udHJvbFtwcm9wcy52YWx1ZVByb3BOYW1lIHx8ICd2YWx1ZSddLFxuICAgICAgICB1cGRhdGU6IGNoaWxkcmVuLFxuICAgICAgICBjaGlsZFByb3BzOiB3YXRjaGluZ0NoaWxkUHJvcHNcbiAgICAgIH0sIGNsb25lRWxlbWVudChjaGlsZHJlbiwgY2hpbGRQcm9wcykpO1xuICAgIH0gZWxzZSBpZiAoaXNSZW5kZXJQcm9wcyAmJiAoc2hvdWxkVXBkYXRlIHx8IGRlcGVuZGVuY2llcykgJiYgIWhhc05hbWUpIHtcbiAgICAgIGNoaWxkTm9kZSA9IGNoaWxkcmVuKGNvbnRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCFtZXJnZWROYW1lLmxlbmd0aCwgJ0Zvcm0uSXRlbScsICdgbmFtZWAgaXMgb25seSB1c2VkIGZvciB2YWxpZGF0ZSBSZWFjdCBlbGVtZW50LiBJZiB5b3UgYXJlIHVzaW5nIEZvcm0uSXRlbSBhcyBsYXlvdXQgZGlzcGxheSwgcGxlYXNlIHJlbW92ZSBgbmFtZWAgaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgICAgIGNoaWxkTm9kZSA9IGNoaWxkcmVuO1xuICAgIH1cbiAgICByZXR1cm4gcmVuZGVyTGF5b3V0KGNoaWxkTm9kZSwgZmllbGRJZCwgaXNSZXF1aXJlZCk7XG4gIH0pO1xufVxudmFyIEZvcm1JdGVtID0gSW50ZXJuYWxGb3JtSXRlbTtcbkZvcm1JdGVtLnVzZVN0YXR1cyA9IHVzZUZvcm1JdGVtU3RhdHVzO1xuZXhwb3J0IGRlZmF1bHQgRm9ybUl0ZW07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IHsgTGlzdCB9IGZyb20gJ3JjLWZpZWxkLWZvcm0nO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgd2FybmluZyBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmltcG9ydCB7IEZvcm1JdGVtUHJlZml4Q29udGV4dCB9IGZyb20gJy4vY29udGV4dCc7XG52YXIgRm9ybUxpc3QgPSBmdW5jdGlvbiBGb3JtTGlzdChfYSkge1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gX2EucHJlZml4Q2xzLFxuICAgIGNoaWxkcmVuID0gX2EuY2hpbGRyZW4sXG4gICAgcHJvcHMgPSBfX3Jlc3QoX2EsIFtcInByZWZpeENsc1wiLCBcImNoaWxkcmVuXCJdKTtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghIXByb3BzLm5hbWUsICdGb3JtLkxpc3QnLCAnTWlzcyBgbmFtZWAgcHJvcC4nKSA6IHZvaWQgMDtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHM7XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2Zvcm0nLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgY29udGV4dFZhbHVlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgc3RhdHVzOiAnZXJyb3InXG4gICAgfTtcbiAgfSwgW3ByZWZpeENsc10pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGlzdCwgX2V4dGVuZHMoe30sIHByb3BzKSwgZnVuY3Rpb24gKGZpZWxkcywgb3BlcmF0aW9uLCBtZXRhKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZvcm1JdGVtUHJlZml4Q29udGV4dC5Qcm92aWRlciwge1xuICAgICAgdmFsdWU6IGNvbnRleHRWYWx1ZVxuICAgIH0sIGNoaWxkcmVuKGZpZWxkcy5tYXAoZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoX2V4dGVuZHMoe30sIGZpZWxkKSwge1xuICAgICAgICBmaWVsZEtleTogZmllbGQua2V5XG4gICAgICB9KTtcbiAgICB9KSwgb3BlcmF0aW9uLCB7XG4gICAgICBlcnJvcnM6IG1ldGEuZXJyb3JzLFxuICAgICAgd2FybmluZ3M6IG1ldGEud2FybmluZ3NcbiAgICB9KSk7XG4gIH0pO1xufTtcbmV4cG9ydCBkZWZhdWx0IEZvcm1MaXN0OyIsImltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBGb3JtQ29udGV4dCB9IGZyb20gJy4uL2NvbnRleHQnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlRm9ybUluc3RhbmNlKCkge1xuICB2YXIgX3VzZUNvbnRleHQgPSB1c2VDb250ZXh0KEZvcm1Db250ZXh0KSxcbiAgICBmb3JtID0gX3VzZUNvbnRleHQuZm9ybTtcbiAgcmV0dXJuIGZvcm07XG59IiwiaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi4vX3V0aWwvd2FybmluZyc7XG5pbXBvcnQgeyBGb3JtUHJvdmlkZXIgfSBmcm9tICcuL2NvbnRleHQnO1xuaW1wb3J0IEVycm9yTGlzdCBmcm9tICcuL0Vycm9yTGlzdCc7XG5pbXBvcnQgSW50ZXJuYWxGb3JtLCB7IHVzZUZvcm0sIHVzZVdhdGNoIH0gZnJvbSAnLi9Gb3JtJztcbmltcG9ydCBJdGVtIGZyb20gJy4vRm9ybUl0ZW0nO1xuaW1wb3J0IExpc3QgZnJvbSAnLi9Gb3JtTGlzdCc7XG5pbXBvcnQgdXNlRm9ybUluc3RhbmNlIGZyb20gJy4vaG9va3MvdXNlRm9ybUluc3RhbmNlJztcbnZhciBGb3JtID0gSW50ZXJuYWxGb3JtO1xuRm9ybS5JdGVtID0gSXRlbTtcbkZvcm0uTGlzdCA9IExpc3Q7XG5Gb3JtLkVycm9yTGlzdCA9IEVycm9yTGlzdDtcbkZvcm0udXNlRm9ybSA9IHVzZUZvcm07XG5Gb3JtLnVzZUZvcm1JbnN0YW5jZSA9IHVzZUZvcm1JbnN0YW5jZTtcbkZvcm0udXNlV2F0Y2ggPSB1c2VXYXRjaDtcbkZvcm0uUHJvdmlkZXIgPSBGb3JtUHJvdmlkZXI7XG5Gb3JtLmNyZWF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhmYWxzZSwgJ0Zvcm0nLCAnYW50ZCB2NCByZW1vdmVkIGBGb3JtLmNyZWF0ZWAuIFBsZWFzZSByZW1vdmUgb3IgdXNlIGBAYW50LWRlc2lnbi9jb21wYXRpYmxlYCBpbnN0ZWFkLicpIDogdm9pZCAwO1xufTtcbmV4cG9ydCBkZWZhdWx0IEZvcm07IiwiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgRXllT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTk0Mi4yIDQ4Ni4yQzg0Ny40IDI4Ni41IDcwNC4xIDE4NiA1MTIgMTg2Yy0xOTIuMiAwLTMzNS40IDEwMC41LTQzMC4yIDMwMC4zYTYwLjMgNjAuMyAwIDAwMCA1MS41QzE3Ni42IDczNy41IDMxOS45IDgzOCA1MTIgODM4YzE5Mi4yIDAgMzM1LjQtMTAwLjUgNDMwLjItMzAwLjMgNy43LTE2LjIgNy43LTM1IDAtNTEuNXpNNTEyIDc2NmMtMTYxLjMgMC0yNzkuNC04MS44LTM2Mi43LTI1NEMyMzIuNiAzMzkuOCAzNTAuNyAyNTggNTEyIDI1OGMxNjEuMyAwIDI3OS40IDgxLjggMzYyLjcgMjU0Qzc5MS41IDY4NC4yIDY3My40IDc2NiA1MTIgNzY2em0tNC00MzBjLTk3LjIgMC0xNzYgNzguOC0xNzYgMTc2czc4LjggMTc2IDE3NiAxNzYgMTc2LTc4LjggMTc2LTE3Ni03OC44LTE3Ni0xNzYtMTc2em0wIDI4OGMtNjEuOSAwLTExMi01MC4xLTExMi0xMTJzNTAuMS0xMTIgMTEyLTExMiAxMTIgNTAuMSAxMTIgMTEyLTUwLjEgMTEyLTExMiAxMTJ6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJleWVcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IEV5ZU91dGxpbmVkO1xuIiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRXllT3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRXllT3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tICcuLi9jb21wb25lbnRzL0FudGRJY29uJztcbnZhciBFeWVPdXRsaW5lZCA9IGZ1bmN0aW9uIEV5ZU91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBFeWVPdXRsaW5lZFN2Z1xuICB9KSk7XG59O1xuRXllT3V0bGluZWQuZGlzcGxheU5hbWUgPSAnRXllT3V0bGluZWQnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoRXllT3V0bGluZWQpOyIsIi8qIGVzbGludC1kaXNhYmxlIG5vLW5lc3RlZC10ZXJuYXJ5ICovXG52YXIgUElYRUxfUEFUVEVSTiA9IC9tYXJnaW58cGFkZGluZ3x3aWR0aHxoZWlnaHR8bWF4fG1pbnxvZmZzZXQvO1xudmFyIHJlbW92ZVBpeGVsID0ge1xuICBsZWZ0OiB0cnVlLFxuICB0b3A6IHRydWVcbn07XG52YXIgZmxvYXRNYXAgPSB7XG4gIGNzc0Zsb2F0OiAxLFxuICBzdHlsZUZsb2F0OiAxLFxuICBmbG9hdDogMVxufTtcbmZ1bmN0aW9uIGdldENvbXB1dGVkU3R5bGUobm9kZSkge1xuICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gMSA/IG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpIDoge307XG59XG5mdW5jdGlvbiBnZXRTdHlsZVZhbHVlKG5vZGUsIHR5cGUsIHZhbHVlKSB7XG4gIHR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gIGlmICh2YWx1ZSA9PT0gJ2F1dG8nKSB7XG4gICAgaWYgKHR5cGUgPT09ICdoZWlnaHQnKSB7XG4gICAgICByZXR1cm4gbm9kZS5vZmZzZXRIZWlnaHQ7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnd2lkdGgnKSB7XG4gICAgICByZXR1cm4gbm9kZS5vZmZzZXRXaWR0aDtcbiAgICB9XG4gIH1cbiAgaWYgKCEodHlwZSBpbiByZW1vdmVQaXhlbCkpIHtcbiAgICByZW1vdmVQaXhlbFt0eXBlXSA9IFBJWEVMX1BBVFRFUk4udGVzdCh0eXBlKTtcbiAgfVxuICByZXR1cm4gcmVtb3ZlUGl4ZWxbdHlwZV0gPyBwYXJzZUZsb2F0KHZhbHVlKSB8fCAwIDogdmFsdWU7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0KG5vZGUsIG5hbWUpIHtcbiAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gIG5hbWUgPSBmbG9hdE1hcFtuYW1lXSA/ICdjc3NGbG9hdCcgaW4gbm9kZS5zdHlsZSA/ICdjc3NGbG9hdCcgOiAnc3R5bGVGbG9hdCcgOiBuYW1lO1xuICByZXR1cm4gbGVuZ3RoID09PSAxID8gc3R5bGUgOiBnZXRTdHlsZVZhbHVlKG5vZGUsIG5hbWUsIHN0eWxlW25hbWVdIHx8IG5vZGUuc3R5bGVbbmFtZV0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldChub2RlLCBuYW1lLCB2YWx1ZSkge1xuICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgbmFtZSA9IGZsb2F0TWFwW25hbWVdID8gJ2Nzc0Zsb2F0JyBpbiBub2RlLnN0eWxlID8gJ2Nzc0Zsb2F0JyA6ICdzdHlsZUZsb2F0JyA6IG5hbWU7XG4gIGlmIChsZW5ndGggPT09IDMpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBQSVhFTF9QQVRURVJOLnRlc3QobmFtZSkpIHtcbiAgICAgIHZhbHVlID0gXCJcIi5jb25jYXQodmFsdWUsIFwicHhcIik7XG4gICAgfVxuICAgIG5vZGUuc3R5bGVbbmFtZV0gPSB2YWx1ZTsgLy8gTnVtYmVyXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGZvciAodmFyIHggaW4gbmFtZSkge1xuICAgIGlmIChuYW1lLmhhc093blByb3BlcnR5KHgpKSB7XG4gICAgICBzZXQobm9kZSwgeCwgbmFtZVt4XSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBnZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldE91dGVyV2lkdGgoZWwpIHtcbiAgaWYgKGVsID09PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcbiAgfVxuICByZXR1cm4gZWwub2Zmc2V0V2lkdGg7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0T3V0ZXJIZWlnaHQoZWwpIHtcbiAgaWYgKGVsID09PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgcmV0dXJuIHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICB9XG4gIHJldHVybiBlbC5vZmZzZXRIZWlnaHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RG9jU2l6ZSgpIHtcbiAgdmFyIHdpZHRoID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoLCBkb2N1bWVudC5ib2R5LnNjcm9sbFdpZHRoKTtcbiAgdmFyIGhlaWdodCA9IE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQsIGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0KTtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbGllbnRTaXplKCkge1xuICB2YXIgd2lkdGggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7XG4gIHZhciBoZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY3JvbGwoKSB7XG4gIHJldHVybiB7XG4gICAgc2Nyb2xsTGVmdDogTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQsIGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCksXG4gICAgc2Nyb2xsVG9wOiBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wLCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcClcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRPZmZzZXQobm9kZSkge1xuICB2YXIgYm94ID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIGRvY0VsZW0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgLy8gPCBpZTgg5LiN5pSv5oyBIHdpbi5wYWdlWE9mZnNldCwg5YiZ5L2/55SoIGRvY0VsZW0uc2Nyb2xsTGVmdFxuICByZXR1cm4ge1xuICAgIGxlZnQ6IGJveC5sZWZ0ICsgKHdpbmRvdy5wYWdlWE9mZnNldCB8fCBkb2NFbGVtLnNjcm9sbExlZnQpIC0gKGRvY0VsZW0uY2xpZW50TGVmdCB8fCBkb2N1bWVudC5ib2R5LmNsaWVudExlZnQgfHwgMCksXG4gICAgdG9wOiBib3gudG9wICsgKHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2NFbGVtLnNjcm9sbFRvcCkgLSAoZG9jRWxlbS5jbGllbnRUb3AgfHwgZG9jdW1lbnQuYm9keS5jbGllbnRUb3AgfHwgMClcbiAgfTtcbn0iLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5mdW5jdGlvbiBnZXRVc2VJZCgpIHtcbiAgLy8gV2UgbmVlZCBmdWxseSBjbG9uZSBSZWFjdCBmdW5jdGlvbiBoZXJlIHRvIGF2b2lkIHdlYnBhY2sgd2FybmluZyBSZWFjdCAxNyBkbyBub3QgZXhwb3J0IGB1c2VJZGBcbiAgdmFyIGZ1bGxDbG9uZSA9IF9vYmplY3RTcHJlYWQoe30sIFJlYWN0KTtcbiAgcmV0dXJuIGZ1bGxDbG9uZS51c2VJZDtcbn1cbnZhciB1dWlkID0gMDtcblxuLyoqIEBwcml2YXRlIE5vdGUgb25seSB3b3JrZWQgaW4gZGV2ZWxvcCBlbnYuIE5vdCB3b3JrIGluIHByb2R1Y3Rpb24uICovXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRVdWlkKCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHV1aWQgPSAwO1xuICB9XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VJZChpZCkge1xuICAvLyBJbm5lciBpZCBmb3IgYWNjZXNzaWJpbGl0eSB1c2FnZS4gT25seSB3b3JrIGluIGNsaWVudCBzaWRlXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSgnc3NyLWlkJyksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgaW5uZXJJZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0SW5uZXJJZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciB1c2VPcmlnaW5JZCA9IGdldFVzZUlkKCk7XG4gIHZhciByZWFjdE5hdGl2ZUlkID0gdXNlT3JpZ2luSWQgPT09IG51bGwgfHwgdXNlT3JpZ2luSWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHVzZU9yaWdpbklkKCk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF1c2VPcmlnaW5JZCkge1xuICAgICAgdmFyIG5leHRJZCA9IHV1aWQ7XG4gICAgICB1dWlkICs9IDE7XG4gICAgICBzZXRJbm5lcklkKFwicmNfdW5pcXVlX1wiLmNvbmNhdChuZXh0SWQpKTtcbiAgICB9XG4gIH0sIFtdKTtcblxuICAvLyBEZXZlbG9wZXIgcGFzc2VkIGlkIGlzIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGhcbiAgaWYgKGlkKSB7XG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgLy8gVGVzdCBlbnYgYWx3YXlzIHJldHVybiBtb2NrIGlkXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Rlc3QnKSB7XG4gICAgcmV0dXJuICd0ZXN0LWlkJztcbiAgfVxuXG4gIC8vIFJldHVybiByZWFjdCBuYXRpdmUgaWQgb3IgaW5uZXIgaWRcbiAgcmV0dXJuIHJlYWN0TmF0aXZlSWQgfHwgaW5uZXJJZDtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBDU1NNb3Rpb24gZnJvbSAncmMtbW90aW9uJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE1hc2socHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIHZpc2libGUgPSBwcm9wcy52aXNpYmxlLFxuICAgIG1hc2tQcm9wcyA9IHByb3BzLm1hc2tQcm9wcyxcbiAgICBtb3Rpb25OYW1lID0gcHJvcHMubW90aW9uTmFtZTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENTU01vdGlvbiwge1xuICAgIGtleTogXCJtYXNrXCIsXG4gICAgdmlzaWJsZTogdmlzaWJsZSxcbiAgICBtb3Rpb25OYW1lOiBtb3Rpb25OYW1lLFxuICAgIGxlYXZlZENsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1tYXNrLWhpZGRlblwiKVxuICB9LCBmdW5jdGlvbiAoX3JlZiwgcmVmKSB7XG4gICAgdmFyIG1vdGlvbkNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgICAgbW90aW9uU3R5bGUgPSBfcmVmLnN0eWxlO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgICByZWY6IHJlZixcbiAgICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG1vdGlvblN0eWxlKSwgc3R5bGUpLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbWFza1wiKSwgbW90aW9uQ2xhc3NOYW1lKVxuICAgIH0sIG1hc2tQcm9wcykpO1xuICB9KTtcbn0iLCIvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE1vdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgZnVuY3Rpb24gZ2V0TW90aW9uTmFtZShwcmVmaXhDbHMsIHRyYW5zaXRpb25OYW1lLCBhbmltYXRpb25OYW1lKSB7XG4gIHZhciBtb3Rpb25OYW1lID0gdHJhbnNpdGlvbk5hbWU7XG4gIGlmICghbW90aW9uTmFtZSAmJiBhbmltYXRpb25OYW1lKSB7XG4gICAgbW90aW9uTmFtZSA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChhbmltYXRpb25OYW1lKTtcbiAgfVxuICByZXR1cm4gbW90aW9uTmFtZTtcbn1cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gT2Zmc2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmZ1bmN0aW9uIGdldFNjcm9sbCh3LCB0b3ApIHtcbiAgdmFyIHJldCA9IHdbXCJwYWdlXCIuY29uY2F0KHRvcCA/ICdZJyA6ICdYJywgXCJPZmZzZXRcIildO1xuICB2YXIgbWV0aG9kID0gXCJzY3JvbGxcIi5jb25jYXQodG9wID8gJ1RvcCcgOiAnTGVmdCcpO1xuICBpZiAodHlwZW9mIHJldCAhPT0gJ251bWJlcicpIHtcbiAgICB2YXIgZCA9IHcuZG9jdW1lbnQ7XG4gICAgcmV0ID0gZC5kb2N1bWVudEVsZW1lbnRbbWV0aG9kXTtcbiAgICBpZiAodHlwZW9mIHJldCAhPT0gJ251bWJlcicpIHtcbiAgICAgIHJldCA9IGQuYm9keVttZXRob2RdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIG9mZnNldChlbCkge1xuICB2YXIgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgcG9zID0ge1xuICAgIGxlZnQ6IHJlY3QubGVmdCxcbiAgICB0b3A6IHJlY3QudG9wXG4gIH07XG4gIHZhciBkb2MgPSBlbC5vd25lckRvY3VtZW50O1xuICB2YXIgdyA9IGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93O1xuICBwb3MubGVmdCArPSBnZXRTY3JvbGwodyk7XG4gIHBvcy50b3AgKz0gZ2V0U2Nyb2xsKHcsIHRydWUpO1xuICByZXR1cm4gcG9zO1xufSIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9SZWFjdC5tZW1vKGZ1bmN0aW9uIChfcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG4gIHJldHVybiBjaGlsZHJlbjtcbn0sIGZ1bmN0aW9uIChfLCBfcmVmMikge1xuICB2YXIgc2hvdWxkVXBkYXRlID0gX3JlZjIuc2hvdWxkVXBkYXRlO1xuICByZXR1cm4gIXNob3VsZFVwZGF0ZTtcbn0pOyIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBNZW1vQ2hpbGRyZW4gZnJvbSAnLi9NZW1vQ2hpbGRyZW4nO1xudmFyIHNlbnRpbmVsU3R5bGUgPSB7XG4gIHdpZHRoOiAwLFxuICBoZWlnaHQ6IDAsXG4gIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgb3V0bGluZTogJ25vbmUnXG59O1xudmFyIFBhbmVsID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICB0aXRsZSA9IHByb3BzLnRpdGxlLFxuICAgIGFyaWFJZCA9IHByb3BzLmFyaWFJZCxcbiAgICBmb290ZXIgPSBwcm9wcy5mb290ZXIsXG4gICAgY2xvc2FibGUgPSBwcm9wcy5jbG9zYWJsZSxcbiAgICBjbG9zZUljb24gPSBwcm9wcy5jbG9zZUljb24sXG4gICAgb25DbG9zZSA9IHByb3BzLm9uQ2xvc2UsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBib2R5U3R5bGUgPSBwcm9wcy5ib2R5U3R5bGUsXG4gICAgYm9keVByb3BzID0gcHJvcHMuYm9keVByb3BzLFxuICAgIG1vZGFsUmVuZGVyID0gcHJvcHMubW9kYWxSZW5kZXIsXG4gICAgb25Nb3VzZURvd24gPSBwcm9wcy5vbk1vdXNlRG93bixcbiAgICBvbk1vdXNlVXAgPSBwcm9wcy5vbk1vdXNlVXAsXG4gICAgaG9sZGVyUmVmID0gcHJvcHMuaG9sZGVyUmVmLFxuICAgIHZpc2libGUgPSBwcm9wcy52aXNpYmxlLFxuICAgIGZvcmNlUmVuZGVyID0gcHJvcHMuZm9yY2VSZW5kZXIsXG4gICAgd2lkdGggPSBwcm9wcy53aWR0aCxcbiAgICBoZWlnaHQgPSBwcm9wcy5oZWlnaHQ7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZWZzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgc2VudGluZWxTdGFydFJlZiA9IHVzZVJlZigpO1xuICB2YXIgc2VudGluZWxFbmRSZWYgPSB1c2VSZWYoKTtcbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZm9jdXM6IGZ1bmN0aW9uIGZvY3VzKCkge1xuICAgICAgICB2YXIgX3NlbnRpbmVsU3RhcnRSZWYkY3VyO1xuICAgICAgICAoX3NlbnRpbmVsU3RhcnRSZWYkY3VyID0gc2VudGluZWxTdGFydFJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfc2VudGluZWxTdGFydFJlZiRjdXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9zZW50aW5lbFN0YXJ0UmVmJGN1ci5mb2N1cygpO1xuICAgICAgfSxcbiAgICAgIGNoYW5nZUFjdGl2ZTogZnVuY3Rpb24gY2hhbmdlQWN0aXZlKG5leHQpIHtcbiAgICAgICAgdmFyIF9kb2N1bWVudCA9IGRvY3VtZW50LFxuICAgICAgICAgIGFjdGl2ZUVsZW1lbnQgPSBfZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKG5leHQgJiYgYWN0aXZlRWxlbWVudCA9PT0gc2VudGluZWxFbmRSZWYuY3VycmVudCkge1xuICAgICAgICAgIHNlbnRpbmVsU3RhcnRSZWYuY3VycmVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2UgaWYgKCFuZXh0ICYmIGFjdGl2ZUVsZW1lbnQgPT09IHNlbnRpbmVsU3RhcnRSZWYuY3VycmVudCkge1xuICAgICAgICAgIHNlbnRpbmVsRW5kUmVmLmN1cnJlbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTdHlsZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGNvbnRlbnRTdHlsZSA9IHt9O1xuICBpZiAod2lkdGggIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnRlbnRTdHlsZS53aWR0aCA9IHdpZHRoO1xuICB9XG4gIGlmIChoZWlnaHQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnRlbnRTdHlsZS5oZWlnaHQgPSBoZWlnaHQ7XG4gIH1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBmb290ZXJOb2RlO1xuICBpZiAoZm9vdGVyKSB7XG4gICAgZm9vdGVyTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1mb290ZXJcIilcbiAgICB9LCBmb290ZXIpO1xuICB9XG4gIHZhciBoZWFkZXJOb2RlO1xuICBpZiAodGl0bGUpIHtcbiAgICBoZWFkZXJOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhlYWRlclwiKVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10aXRsZVwiKSxcbiAgICAgIGlkOiBhcmlhSWRcbiAgICB9LCB0aXRsZSkpO1xuICB9XG4gIHZhciBjbG9zZXI7XG4gIGlmIChjbG9zYWJsZSkge1xuICAgIGNsb3NlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICBvbkNsaWNrOiBvbkNsb3NlLFxuICAgICAgXCJhcmlhLWxhYmVsXCI6IFwiQ2xvc2VcIixcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jbG9zZVwiKVxuICAgIH0sIGNsb3NlSWNvbiB8fCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNsb3NlLXhcIilcbiAgICB9KSk7XG4gIH1cbiAgdmFyIGNvbnRlbnQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbnRlbnRcIilcbiAgfSwgY2xvc2VyLCBoZWFkZXJOb2RlLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWJvZHlcIiksXG4gICAgc3R5bGU6IGJvZHlTdHlsZVxuICB9LCBib2R5UHJvcHMpLCBjaGlsZHJlbiksIGZvb3Rlck5vZGUpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGtleTogXCJkaWFsb2ctZWxlbWVudFwiLFxuICAgIHJvbGU6IFwiZGlhbG9nXCIsXG4gICAgXCJhcmlhLWxhYmVsbGVkYnlcIjogdGl0bGUgPyBhcmlhSWQgOiBudWxsLFxuICAgIFwiYXJpYS1tb2RhbFwiOiBcInRydWVcIixcbiAgICByZWY6IGhvbGRlclJlZixcbiAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIGNvbnRlbnRTdHlsZSksXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKHByZWZpeENscywgY2xhc3NOYW1lKSxcbiAgICBvbk1vdXNlRG93bjogb25Nb3VzZURvd24sXG4gICAgb25Nb3VzZVVwOiBvbk1vdXNlVXBcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHRhYkluZGV4OiAwLFxuICAgIHJlZjogc2VudGluZWxTdGFydFJlZixcbiAgICBzdHlsZTogc2VudGluZWxTdHlsZSxcbiAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNZW1vQ2hpbGRyZW4sIHtcbiAgICBzaG91bGRVcGRhdGU6IHZpc2libGUgfHwgZm9yY2VSZW5kZXJcbiAgfSwgbW9kYWxSZW5kZXIgPyBtb2RhbFJlbmRlcihjb250ZW50KSA6IGNvbnRlbnQpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgdGFiSW5kZXg6IDAsXG4gICAgcmVmOiBzZW50aW5lbEVuZFJlZixcbiAgICBzdHlsZTogc2VudGluZWxTdHlsZSxcbiAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG4gIH0pKTtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUGFuZWwuZGlzcGxheU5hbWUgPSAnUGFuZWwnO1xufVxuZXhwb3J0IGRlZmF1bHQgUGFuZWw7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBDU1NNb3Rpb24gZnJvbSAncmMtbW90aW9uJztcbmltcG9ydCB7IG9mZnNldCB9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IFBhbmVsIGZyb20gJy4vUGFuZWwnO1xudmFyIENvbnRlbnQgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHRpdGxlID0gcHJvcHMudGl0bGUsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgdmlzaWJsZSA9IHByb3BzLnZpc2libGUsXG4gICAgZm9yY2VSZW5kZXIgPSBwcm9wcy5mb3JjZVJlbmRlcixcbiAgICBkZXN0cm95T25DbG9zZSA9IHByb3BzLmRlc3Ryb3lPbkNsb3NlLFxuICAgIG1vdGlvbk5hbWUgPSBwcm9wcy5tb3Rpb25OYW1lLFxuICAgIGFyaWFJZCA9IHByb3BzLmFyaWFJZCxcbiAgICBvblZpc2libGVDaGFuZ2VkID0gcHJvcHMub25WaXNpYmxlQ2hhbmdlZCxcbiAgICBtb3VzZVBvc2l0aW9uID0gcHJvcHMubW91c2VQb3NpdGlvbjtcbiAgdmFyIGRpYWxvZ1JlZiA9IHVzZVJlZigpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTdHlsZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKCksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgdHJhbnNmb3JtT3JpZ2luID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRUcmFuc2Zvcm1PcmlnaW4gPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIgY29udGVudFN0eWxlID0ge307XG4gIGlmICh0cmFuc2Zvcm1PcmlnaW4pIHtcbiAgICBjb250ZW50U3R5bGUudHJhbnNmb3JtT3JpZ2luID0gdHJhbnNmb3JtT3JpZ2luO1xuICB9XG4gIGZ1bmN0aW9uIG9uUHJlcGFyZSgpIHtcbiAgICB2YXIgZWxlbWVudE9mZnNldCA9IG9mZnNldChkaWFsb2dSZWYuY3VycmVudCk7XG4gICAgc2V0VHJhbnNmb3JtT3JpZ2luKG1vdXNlUG9zaXRpb24gPyBcIlwiLmNvbmNhdChtb3VzZVBvc2l0aW9uLnggLSBlbGVtZW50T2Zmc2V0LmxlZnQsIFwicHggXCIpLmNvbmNhdChtb3VzZVBvc2l0aW9uLnkgLSBlbGVtZW50T2Zmc2V0LnRvcCwgXCJweFwiKSA6ICcnKTtcbiAgfVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENTU01vdGlvbiwge1xuICAgIHZpc2libGU6IHZpc2libGUsXG4gICAgb25WaXNpYmxlQ2hhbmdlZDogb25WaXNpYmxlQ2hhbmdlZCxcbiAgICBvbkFwcGVhclByZXBhcmU6IG9uUHJlcGFyZSxcbiAgICBvbkVudGVyUHJlcGFyZTogb25QcmVwYXJlLFxuICAgIGZvcmNlUmVuZGVyOiBmb3JjZVJlbmRlcixcbiAgICBtb3Rpb25OYW1lOiBtb3Rpb25OYW1lLFxuICAgIHJlbW92ZU9uTGVhdmU6IGRlc3Ryb3lPbkNsb3NlLFxuICAgIHJlZjogZGlhbG9nUmVmXG4gIH0sIGZ1bmN0aW9uIChfcmVmLCBtb3Rpb25SZWYpIHtcbiAgICB2YXIgbW90aW9uQ2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgICBtb3Rpb25TdHlsZSA9IF9yZWYuc3R5bGU7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBhbmVsLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgIHJlZjogcmVmLFxuICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgYXJpYUlkOiBhcmlhSWQsXG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIGhvbGRlclJlZjogbW90aW9uUmVmLFxuICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtb3Rpb25TdHlsZSksIHN0eWxlKSwgY29udGVudFN0eWxlKSxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIG1vdGlvbkNsYXNzTmFtZSlcbiAgICB9KSk7XG4gIH0pO1xufSk7XG5Db250ZW50LmRpc3BsYXlOYW1lID0gJ0NvbnRlbnQnO1xuZXhwb3J0IGRlZmF1bHQgQ29udGVudDsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVJlZiwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgS2V5Q29kZSBmcm9tIFwicmMtdXRpbC9lcy9LZXlDb2RlXCI7XG5pbXBvcnQgdXNlSWQgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlSWRcIjtcbmltcG9ydCBjb250YWlucyBmcm9tIFwicmMtdXRpbC9lcy9Eb20vY29udGFpbnNcIjtcbmltcG9ydCBwaWNrQXR0cnMgZnJvbSBcInJjLXV0aWwvZXMvcGlja0F0dHJzXCI7XG5pbXBvcnQgTWFzayBmcm9tICcuL01hc2snO1xuaW1wb3J0IHsgZ2V0TW90aW9uTmFtZSB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IENvbnRlbnQgZnJvbSAnLi9Db250ZW50JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIERpYWxvZyhwcm9wcykge1xuICB2YXIgX3Byb3BzJHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBwcmVmaXhDbHMgPSBfcHJvcHMkcHJlZml4Q2xzID09PSB2b2lkIDAgPyAncmMtZGlhbG9nJyA6IF9wcm9wcyRwcmVmaXhDbHMsXG4gICAgekluZGV4ID0gcHJvcHMuekluZGV4LFxuICAgIF9wcm9wcyR2aXNpYmxlID0gcHJvcHMudmlzaWJsZSxcbiAgICB2aXNpYmxlID0gX3Byb3BzJHZpc2libGUgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJHZpc2libGUsXG4gICAgX3Byb3BzJGtleWJvYXJkID0gcHJvcHMua2V5Ym9hcmQsXG4gICAga2V5Ym9hcmQgPSBfcHJvcHMka2V5Ym9hcmQgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMka2V5Ym9hcmQsXG4gICAgX3Byb3BzJGZvY3VzVHJpZ2dlckFmID0gcHJvcHMuZm9jdXNUcmlnZ2VyQWZ0ZXJDbG9zZSxcbiAgICBmb2N1c1RyaWdnZXJBZnRlckNsb3NlID0gX3Byb3BzJGZvY3VzVHJpZ2dlckFmID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJGZvY3VzVHJpZ2dlckFmLFxuICAgIHdyYXBTdHlsZSA9IHByb3BzLndyYXBTdHlsZSxcbiAgICB3cmFwQ2xhc3NOYW1lID0gcHJvcHMud3JhcENsYXNzTmFtZSxcbiAgICB3cmFwUHJvcHMgPSBwcm9wcy53cmFwUHJvcHMsXG4gICAgb25DbG9zZSA9IHByb3BzLm9uQ2xvc2UsXG4gICAgYWZ0ZXJDbG9zZSA9IHByb3BzLmFmdGVyQ2xvc2UsXG4gICAgdHJhbnNpdGlvbk5hbWUgPSBwcm9wcy50cmFuc2l0aW9uTmFtZSxcbiAgICBhbmltYXRpb24gPSBwcm9wcy5hbmltYXRpb24sXG4gICAgX3Byb3BzJGNsb3NhYmxlID0gcHJvcHMuY2xvc2FibGUsXG4gICAgY2xvc2FibGUgPSBfcHJvcHMkY2xvc2FibGUgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkY2xvc2FibGUsXG4gICAgX3Byb3BzJG1hc2sgPSBwcm9wcy5tYXNrLFxuICAgIG1hc2sgPSBfcHJvcHMkbWFzayA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRtYXNrLFxuICAgIG1hc2tUcmFuc2l0aW9uTmFtZSA9IHByb3BzLm1hc2tUcmFuc2l0aW9uTmFtZSxcbiAgICBtYXNrQW5pbWF0aW9uID0gcHJvcHMubWFza0FuaW1hdGlvbixcbiAgICBfcHJvcHMkbWFza0Nsb3NhYmxlID0gcHJvcHMubWFza0Nsb3NhYmxlLFxuICAgIG1hc2tDbG9zYWJsZSA9IF9wcm9wcyRtYXNrQ2xvc2FibGUgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkbWFza0Nsb3NhYmxlLFxuICAgIG1hc2tTdHlsZSA9IHByb3BzLm1hc2tTdHlsZSxcbiAgICBtYXNrUHJvcHMgPSBwcm9wcy5tYXNrUHJvcHMsXG4gICAgcm9vdENsYXNzTmFtZSA9IHByb3BzLnJvb3RDbGFzc05hbWU7XG4gIHZhciBsYXN0T3V0U2lkZUFjdGl2ZUVsZW1lbnRSZWYgPSB1c2VSZWYoKTtcbiAgdmFyIHdyYXBwZXJSZWYgPSB1c2VSZWYoKTtcbiAgdmFyIGNvbnRlbnRSZWYgPSB1c2VSZWYoKTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKHZpc2libGUpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIGFuaW1hdGVkVmlzaWJsZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0QW5pbWF0ZWRWaXNpYmxlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gSW5pdCA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgYXJpYUlkID0gdXNlSWQoKTtcbiAgZnVuY3Rpb24gc2F2ZUxhc3RPdXRTaWRlQWN0aXZlRWxlbWVudFJlZigpIHtcbiAgICBpZiAoIWNvbnRhaW5zKHdyYXBwZXJSZWYuY3VycmVudCwgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgIGxhc3RPdXRTaWRlQWN0aXZlRWxlbWVudFJlZi5jdXJyZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZm9jdXNEaWFsb2dDb250ZW50KCkge1xuICAgIGlmICghY29udGFpbnMod3JhcHBlclJlZi5jdXJyZW50LCBkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgdmFyIF9jb250ZW50UmVmJGN1cnJlbnQ7XG4gICAgICAoX2NvbnRlbnRSZWYkY3VycmVudCA9IGNvbnRlbnRSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2NvbnRlbnRSZWYkY3VycmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2NvbnRlbnRSZWYkY3VycmVudC5mb2N1cygpO1xuICAgIH1cbiAgfVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IEV2ZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGZ1bmN0aW9uIG9uRGlhbG9nVmlzaWJsZUNoYW5nZWQobmV3VmlzaWJsZSkge1xuICAgIC8vIFRyeSB0byBmb2N1c1xuICAgIGlmIChuZXdWaXNpYmxlKSB7XG4gICAgICBmb2N1c0RpYWxvZ0NvbnRlbnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2xlYW4gdXAgc2Nyb2xsIGJhciAmIGZvY3VzIGJhY2tcbiAgICAgIHNldEFuaW1hdGVkVmlzaWJsZShmYWxzZSk7XG4gICAgICBpZiAobWFzayAmJiBsYXN0T3V0U2lkZUFjdGl2ZUVsZW1lbnRSZWYuY3VycmVudCAmJiBmb2N1c1RyaWdnZXJBZnRlckNsb3NlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGFzdE91dFNpZGVBY3RpdmVFbGVtZW50UmVmLmN1cnJlbnQuZm9jdXMoe1xuICAgICAgICAgICAgcHJldmVudFNjcm9sbDogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gRG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgICAgIGxhc3RPdXRTaWRlQWN0aXZlRWxlbWVudFJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIC8vIFRyaWdnZXIgYWZ0ZXJDbG9zZSBvbmx5IHdoZW4gY2hhbmdlIHZpc2libGUgZnJvbSB0cnVlIHRvIGZhbHNlXG4gICAgICBpZiAoYW5pbWF0ZWRWaXNpYmxlKSB7XG4gICAgICAgIGFmdGVyQ2xvc2UgPT09IG51bGwgfHwgYWZ0ZXJDbG9zZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogYWZ0ZXJDbG9zZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBvbkludGVybmFsQ2xvc2UoZSkge1xuICAgIG9uQ2xvc2UgPT09IG51bGwgfHwgb25DbG9zZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DbG9zZShlKTtcbiAgfVxuICAvLyA+Pj4gQ29udGVudFxuICB2YXIgY29udGVudENsaWNrUmVmID0gdXNlUmVmKGZhbHNlKTtcbiAgdmFyIGNvbnRlbnRUaW1lb3V0UmVmID0gdXNlUmVmKCk7XG4gIC8vIFdlIG5lZWQgcmVjb3JkIGNvbnRlbnQgY2xpY2sgaW5jYXNlIGNvbnRlbnQgcG9wdXAgb3V0IG9mIGRpYWxvZ1xuICB2YXIgb25Db250ZW50TW91c2VEb3duID0gZnVuY3Rpb24gb25Db250ZW50TW91c2VEb3duKCkge1xuICAgIGNsZWFyVGltZW91dChjb250ZW50VGltZW91dFJlZi5jdXJyZW50KTtcbiAgICBjb250ZW50Q2xpY2tSZWYuY3VycmVudCA9IHRydWU7XG4gIH07XG4gIHZhciBvbkNvbnRlbnRNb3VzZVVwID0gZnVuY3Rpb24gb25Db250ZW50TW91c2VVcCgpIHtcbiAgICBjb250ZW50VGltZW91dFJlZi5jdXJyZW50ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBjb250ZW50Q2xpY2tSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH0pO1xuICB9O1xuICAvLyA+Pj4gV3JhcHBlclxuICAvLyBDbG9zZSBvbmx5IHdoZW4gZWxlbWVudCBub3Qgb24gZGlhbG9nXG4gIHZhciBvbldyYXBwZXJDbGljayA9IG51bGw7XG4gIGlmIChtYXNrQ2xvc2FibGUpIHtcbiAgICBvbldyYXBwZXJDbGljayA9IGZ1bmN0aW9uIG9uV3JhcHBlckNsaWNrKGUpIHtcbiAgICAgIGlmIChjb250ZW50Q2xpY2tSZWYuY3VycmVudCkge1xuICAgICAgICBjb250ZW50Q2xpY2tSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmICh3cmFwcGVyUmVmLmN1cnJlbnQgPT09IGUudGFyZ2V0KSB7XG4gICAgICAgIG9uSW50ZXJuYWxDbG9zZShlKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIG9uV3JhcHBlcktleURvd24oZSkge1xuICAgIGlmIChrZXlib2FyZCAmJiBlLmtleUNvZGUgPT09IEtleUNvZGUuRVNDKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgb25JbnRlcm5hbENsb3NlKGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBrZWVwIGZvY3VzIGluc2lkZSBkaWFsb2dcbiAgICBpZiAodmlzaWJsZSkge1xuICAgICAgaWYgKGUua2V5Q29kZSA9PT0gS2V5Q29kZS5UQUIpIHtcbiAgICAgICAgY29udGVudFJlZi5jdXJyZW50LmNoYW5nZUFjdGl2ZSghZS5zaGlmdEtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gRWZmZWN0ID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodmlzaWJsZSkge1xuICAgICAgc2V0QW5pbWF0ZWRWaXNpYmxlKHRydWUpO1xuICAgICAgc2F2ZUxhc3RPdXRTaWRlQWN0aXZlRWxlbWVudFJlZigpO1xuICAgIH1cbiAgfSwgW3Zpc2libGVdKTtcbiAgLy8gUmVtb3ZlIGRpcmVjdCBzaG91bGQgYWxzbyBjaGVjayB0aGUgc2Nyb2xsIGJhciB1cGRhdGVcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGNvbnRlbnRUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJvb3RcIiksIHJvb3RDbGFzc05hbWUpXG4gIH0sIHBpY2tBdHRycyhwcm9wcywge1xuICAgIGRhdGE6IHRydWVcbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNYXNrLCB7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgdmlzaWJsZTogbWFzayAmJiB2aXNpYmxlLFxuICAgIG1vdGlvbk5hbWU6IGdldE1vdGlvbk5hbWUocHJlZml4Q2xzLCBtYXNrVHJhbnNpdGlvbk5hbWUsIG1hc2tBbmltYXRpb24pLFxuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKHtcbiAgICAgIHpJbmRleDogekluZGV4XG4gICAgfSwgbWFza1N0eWxlKSxcbiAgICBtYXNrUHJvcHM6IG1hc2tQcm9wc1xuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIHRhYkluZGV4OiAtMSxcbiAgICBvbktleURvd246IG9uV3JhcHBlcktleURvd24sXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd3JhcFwiKSwgd3JhcENsYXNzTmFtZSksXG4gICAgcmVmOiB3cmFwcGVyUmVmLFxuICAgIG9uQ2xpY2s6IG9uV3JhcHBlckNsaWNrLFxuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe1xuICAgICAgekluZGV4OiB6SW5kZXhcbiAgICB9LCB3cmFwU3R5bGUpLCB7fSwge1xuICAgICAgZGlzcGxheTogIWFuaW1hdGVkVmlzaWJsZSA/ICdub25lJyA6IG51bGxcbiAgICB9KVxuICB9LCB3cmFwUHJvcHMpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb250ZW50LCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICBvbk1vdXNlRG93bjogb25Db250ZW50TW91c2VEb3duLFxuICAgIG9uTW91c2VVcDogb25Db250ZW50TW91c2VVcCxcbiAgICByZWY6IGNvbnRlbnRSZWYsXG4gICAgY2xvc2FibGU6IGNsb3NhYmxlLFxuICAgIGFyaWFJZDogYXJpYUlkLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIHZpc2libGU6IHZpc2libGUgJiYgYW5pbWF0ZWRWaXNpYmxlLFxuICAgIG9uQ2xvc2U6IG9uSW50ZXJuYWxDbG9zZSxcbiAgICBvblZpc2libGVDaGFuZ2VkOiBvbkRpYWxvZ1Zpc2libGVDaGFuZ2VkLFxuICAgIG1vdGlvbk5hbWU6IGdldE1vdGlvbk5hbWUocHJlZml4Q2xzLCB0cmFuc2l0aW9uTmFtZSwgYW5pbWF0aW9uKVxuICB9KSkpKTtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFBvcnRhbCBmcm9tICdAcmMtY29tcG9uZW50L3BvcnRhbCc7XG5pbXBvcnQgRGlhbG9nIGZyb20gJy4vRGlhbG9nJztcbi8vIGZpeCBpc3N1ZSAjMTA2NTZcbi8qXG4gKiBnZXRDb250YWluZXIgcmVtYXJrc1xuICogQ3VzdG9tIGNvbnRhaW5lciBzaG91bGQgbm90IGJlIHJldHVybiwgYmVjYXVzZSBpbiB0aGUgUG9ydGFsIGNvbXBvbmVudCwgaXQgd2lsbCByZW1vdmUgdGhlXG4gKiByZXR1cm4gY29udGFpbmVyIGVsZW1lbnQgaGVyZSwgaWYgdGhlIGN1c3RvbSBjb250YWluZXIgaXMgdGhlIG9ubHkgY2hpbGQgb2YgaXQncyBjb21wb25lbnQsXG4gKiBsaWtlIGlzc3VlICMxMDY1NiwgSXQgd2lsbCBoYXMgYSBjb25mbGljdCB3aXRoIHJlbW92ZUNoaWxkIG1ldGhvZCBpbiByZWFjdC1kb20uXG4gKiBTbyBoZXJlIHNob3VsZCBhZGQgYSBjaGlsZCAoZGl2IGVsZW1lbnQpIHRvIGN1c3RvbSBjb250YWluZXIuXG4gKiAqL1xudmFyIERpYWxvZ1dyYXAgPSBmdW5jdGlvbiBEaWFsb2dXcmFwKHByb3BzKSB7XG4gIHZhciB2aXNpYmxlID0gcHJvcHMudmlzaWJsZSxcbiAgICBnZXRDb250YWluZXIgPSBwcm9wcy5nZXRDb250YWluZXIsXG4gICAgZm9yY2VSZW5kZXIgPSBwcm9wcy5mb3JjZVJlbmRlcixcbiAgICBfcHJvcHMkZGVzdHJveU9uQ2xvc2UgPSBwcm9wcy5kZXN0cm95T25DbG9zZSxcbiAgICBkZXN0cm95T25DbG9zZSA9IF9wcm9wcyRkZXN0cm95T25DbG9zZSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZGVzdHJveU9uQ2xvc2UsXG4gICAgX2FmdGVyQ2xvc2UgPSBwcm9wcy5hZnRlckNsb3NlO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUodmlzaWJsZSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgYW5pbWF0ZWRWaXNpYmxlID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRBbmltYXRlZFZpc2libGUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICh2aXNpYmxlKSB7XG4gICAgICBzZXRBbmltYXRlZFZpc2libGUodHJ1ZSk7XG4gICAgfVxuICB9LCBbdmlzaWJsZV0pO1xuICAvLyAvLyDmuLLmn5PlnKjlvZPliY0gZG9tIOmHjO+8m1xuICAvLyBpZiAoZ2V0Q29udGFpbmVyID09PSBmYWxzZSkge1xuICAvLyAgIHJldHVybiAoXG4gIC8vICAgICA8RGlhbG9nXG4gIC8vICAgICAgIHsuLi5wcm9wc31cbiAgLy8gICAgICAgZ2V0T3BlbkNvdW50PXsoKSA9PiAyfSAvLyDkuI3lr7kgYm9keSDlgZrku7vkvZXmk43kvZzjgILjgIJcbiAgLy8gICAgIC8+XG4gIC8vICAgKTtcbiAgLy8gfVxuICAvLyBEZXN0cm95IG9uIGNsb3NlIHdpbGwgcmVtb3ZlIHdyYXBwZWQgZGl2XG4gIGlmICghZm9yY2VSZW5kZXIgJiYgZGVzdHJveU9uQ2xvc2UgJiYgIWFuaW1hdGVkVmlzaWJsZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQb3J0YWwsIHtcbiAgICBvcGVuOiB2aXNpYmxlIHx8IGZvcmNlUmVuZGVyIHx8IGFuaW1hdGVkVmlzaWJsZSxcbiAgICBhdXRvRGVzdHJveTogZmFsc2UsXG4gICAgZ2V0Q29udGFpbmVyOiBnZXRDb250YWluZXIsXG4gICAgYXV0b0xvY2s6IHZpc2libGUgfHwgYW5pbWF0ZWRWaXNpYmxlXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERpYWxvZywgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgZGVzdHJveU9uQ2xvc2U6IGRlc3Ryb3lPbkNsb3NlLFxuICAgIGFmdGVyQ2xvc2U6IGZ1bmN0aW9uIGFmdGVyQ2xvc2UoKSB7XG4gICAgICBfYWZ0ZXJDbG9zZSA9PT0gbnVsbCB8fCBfYWZ0ZXJDbG9zZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FmdGVyQ2xvc2UoKTtcbiAgICAgIHNldEFuaW1hdGVkVmlzaWJsZShmYWxzZSk7XG4gICAgfVxuICB9KSkpO1xufTtcbkRpYWxvZ1dyYXAuZGlzcGxheU5hbWUgPSAnRGlhbG9nJztcbmV4cG9ydCBkZWZhdWx0IERpYWxvZ1dyYXA7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1widmlzaWJsZVwiLCBcIm9uVmlzaWJsZUNoYW5nZVwiLCBcImdldENvbnRhaW5lclwiLCBcImN1cnJlbnRcIiwgXCJjb3VudFJlbmRlclwiXTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZU1lcmdlZFN0YXRlIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lcmdlZFN0YXRlXCI7XG5pbXBvcnQgUHJldmlldyBmcm9tIFwiLi9QcmV2aWV3XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5leHBvcnQgdmFyIGNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7XG4gIHByZXZpZXdVcmxzOiBuZXcgTWFwKCksXG4gIHNldFByZXZpZXdVcmxzOiBmdW5jdGlvbiBzZXRQcmV2aWV3VXJscygpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcbiAgY3VycmVudDogbnVsbCxcbiAgc2V0Q3VycmVudDogZnVuY3Rpb24gc2V0Q3VycmVudCgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcbiAgc2V0U2hvd1ByZXZpZXc6IGZ1bmN0aW9uIHNldFNob3dQcmV2aWV3KCkge1xuICAgIHJldHVybiBudWxsO1xuICB9LFxuICBzZXRNb3VzZVBvc2l0aW9uOiBmdW5jdGlvbiBzZXRNb3VzZVBvc2l0aW9uKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9LFxuICByZWdpc3RlckltYWdlOiBmdW5jdGlvbiByZWdpc3RlckltYWdlKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICB9LFxuICByb290Q2xhc3NOYW1lOiAnJ1xufSk7XG52YXIgUHJvdmlkZXIgPSBjb250ZXh0LlByb3ZpZGVyO1xuXG52YXIgR3JvdXAgPSBmdW5jdGlvbiBHcm91cChfcmVmKSB7XG4gIHZhciBfcmVmJHByZXZpZXdQcmVmaXhDbHMgPSBfcmVmLnByZXZpZXdQcmVmaXhDbHMsXG4gICAgICBwcmV2aWV3UHJlZml4Q2xzID0gX3JlZiRwcmV2aWV3UHJlZml4Q2xzID09PSB2b2lkIDAgPyAncmMtaW1hZ2UtcHJldmlldycgOiBfcmVmJHByZXZpZXdQcmVmaXhDbHMsXG4gICAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgICBfcmVmJGljb25zID0gX3JlZi5pY29ucyxcbiAgICAgIGljb25zID0gX3JlZiRpY29ucyA9PT0gdm9pZCAwID8ge30gOiBfcmVmJGljb25zLFxuICAgICAgcHJldmlldyA9IF9yZWYucHJldmlldztcblxuICB2YXIgX3JlZjIgPSBfdHlwZW9mKHByZXZpZXcpID09PSAnb2JqZWN0JyA/IHByZXZpZXcgOiB7fSxcbiAgICAgIF9yZWYyJHZpc2libGUgPSBfcmVmMi52aXNpYmxlLFxuICAgICAgcHJldmlld1Zpc2libGUgPSBfcmVmMiR2aXNpYmxlID09PSB2b2lkIDAgPyB1bmRlZmluZWQgOiBfcmVmMiR2aXNpYmxlLFxuICAgICAgX3JlZjIkb25WaXNpYmxlQ2hhbmdlID0gX3JlZjIub25WaXNpYmxlQ2hhbmdlLFxuICAgICAgb25QcmV2aWV3VmlzaWJsZUNoYW5nZSA9IF9yZWYyJG9uVmlzaWJsZUNoYW5nZSA9PT0gdm9pZCAwID8gdW5kZWZpbmVkIDogX3JlZjIkb25WaXNpYmxlQ2hhbmdlLFxuICAgICAgX3JlZjIkZ2V0Q29udGFpbmVyID0gX3JlZjIuZ2V0Q29udGFpbmVyLFxuICAgICAgZ2V0Q29udGFpbmVyID0gX3JlZjIkZ2V0Q29udGFpbmVyID09PSB2b2lkIDAgPyB1bmRlZmluZWQgOiBfcmVmMiRnZXRDb250YWluZXIsXG4gICAgICBfcmVmMiRjdXJyZW50ID0gX3JlZjIuY3VycmVudCxcbiAgICAgIGN1cnJlbnRJbmRleCA9IF9yZWYyJGN1cnJlbnQgPT09IHZvaWQgMCA/IDAgOiBfcmVmMiRjdXJyZW50LFxuICAgICAgX3JlZjIkY291bnRSZW5kZXIgPSBfcmVmMi5jb3VudFJlbmRlcixcbiAgICAgIGNvdW50UmVuZGVyID0gX3JlZjIkY291bnRSZW5kZXIgPT09IHZvaWQgMCA/IHVuZGVmaW5lZCA6IF9yZWYyJGNvdW50UmVuZGVyLFxuICAgICAgZGlhbG9nUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjIsIF9leGNsdWRlZCk7XG5cbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKG5ldyBNYXAoKSksXG4gICAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICAgIHByZXZpZXdVcmxzID0gX3VzZVN0YXRlMlswXSxcbiAgICAgIHNldFByZXZpZXdVcmxzID0gX3VzZVN0YXRlMlsxXTtcblxuICB2YXIgX3VzZVN0YXRlMyA9IHVzZVN0YXRlKCksXG4gICAgICBfdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlMywgMiksXG4gICAgICBjdXJyZW50ID0gX3VzZVN0YXRlNFswXSxcbiAgICAgIHNldEN1cnJlbnQgPSBfdXNlU3RhdGU0WzFdO1xuXG4gIHZhciBfdXNlTWVyZ2VkU3RhdGUgPSB1c2VNZXJnZWRTdGF0ZSghIXByZXZpZXdWaXNpYmxlLCB7XG4gICAgdmFsdWU6IHByZXZpZXdWaXNpYmxlLFxuICAgIG9uQ2hhbmdlOiBvblByZXZpZXdWaXNpYmxlQ2hhbmdlXG4gIH0pLFxuICAgICAgX3VzZU1lcmdlZFN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZSwgMiksXG4gICAgICBpc1Nob3dQcmV2aWV3ID0gX3VzZU1lcmdlZFN0YXRlMlswXSxcbiAgICAgIHNldFNob3dQcmV2aWV3ID0gX3VzZU1lcmdlZFN0YXRlMlsxXTtcblxuICB2YXIgX3VzZVN0YXRlNSA9IHVzZVN0YXRlKG51bGwpLFxuICAgICAgX3VzZVN0YXRlNiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTUsIDIpLFxuICAgICAgbW91c2VQb3NpdGlvbiA9IF91c2VTdGF0ZTZbMF0sXG4gICAgICBzZXRNb3VzZVBvc2l0aW9uID0gX3VzZVN0YXRlNlsxXTtcblxuICB2YXIgaXNDb250cm9sbGVkID0gcHJldmlld1Zpc2libGUgIT09IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpZXdVcmxzS2V5cyA9IEFycmF5LmZyb20ocHJldmlld1VybHMua2V5cygpKTtcbiAgdmFyIGN1cnJlbnRDb250cm9sbGVkS2V5ID0gcHJldmlld1VybHNLZXlzW2N1cnJlbnRJbmRleF07XG4gIHZhciBjYW5QcmV2aWV3VXJscyA9IG5ldyBNYXAoQXJyYXkuZnJvbShwcmV2aWV3VXJscykuZmlsdGVyKGZ1bmN0aW9uIChfcmVmMykge1xuICAgIHZhciBfcmVmNCA9IF9zbGljZWRUb0FycmF5KF9yZWYzLCAyKSxcbiAgICAgICAgY2FuUHJldmlldyA9IF9yZWY0WzFdLmNhblByZXZpZXc7XG5cbiAgICByZXR1cm4gISFjYW5QcmV2aWV3O1xuICB9KS5tYXAoZnVuY3Rpb24gKF9yZWY1KSB7XG4gICAgdmFyIF9yZWY2ID0gX3NsaWNlZFRvQXJyYXkoX3JlZjUsIDIpLFxuICAgICAgICBpZCA9IF9yZWY2WzBdLFxuICAgICAgICB1cmwgPSBfcmVmNlsxXS51cmw7XG5cbiAgICByZXR1cm4gW2lkLCB1cmxdO1xuICB9KSk7XG5cbiAgdmFyIHJlZ2lzdGVySW1hZ2UgPSBmdW5jdGlvbiByZWdpc3RlckltYWdlKGlkLCB1cmwpIHtcbiAgICB2YXIgY2FuUHJldmlldyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdHJ1ZTtcblxuICAgIHZhciB1blJlZ2lzdGVyID0gZnVuY3Rpb24gdW5SZWdpc3RlcigpIHtcbiAgICAgIHNldFByZXZpZXdVcmxzKGZ1bmN0aW9uIChvbGRQcmV2aWV3VXJscykge1xuICAgICAgICB2YXIgY2xvbmVQcmV2aWV3VXJscyA9IG5ldyBNYXAob2xkUHJldmlld1VybHMpO1xuICAgICAgICB2YXIgZGVsZXRlUmVzdWx0ID0gY2xvbmVQcmV2aWV3VXJscy5kZWxldGUoaWQpO1xuICAgICAgICByZXR1cm4gZGVsZXRlUmVzdWx0ID8gY2xvbmVQcmV2aWV3VXJscyA6IG9sZFByZXZpZXdVcmxzO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHNldFByZXZpZXdVcmxzKGZ1bmN0aW9uIChvbGRQcmV2aWV3VXJscykge1xuICAgICAgcmV0dXJuIG5ldyBNYXAob2xkUHJldmlld1VybHMpLnNldChpZCwge1xuICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgY2FuUHJldmlldzogY2FuUHJldmlld1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHVuUmVnaXN0ZXI7XG4gIH07XG5cbiAgdmFyIG9uUHJldmlld0Nsb3NlID0gZnVuY3Rpb24gb25QcmV2aWV3Q2xvc2UoZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgc2V0U2hvd1ByZXZpZXcoZmFsc2UpO1xuICAgIHNldE1vdXNlUG9zaXRpb24obnVsbCk7XG4gIH07XG5cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzZXRDdXJyZW50KGN1cnJlbnRDb250cm9sbGVkS2V5KTtcbiAgfSwgW2N1cnJlbnRDb250cm9sbGVkS2V5XSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFpc1Nob3dQcmV2aWV3ICYmIGlzQ29udHJvbGxlZCkge1xuICAgICAgc2V0Q3VycmVudChjdXJyZW50Q29udHJvbGxlZEtleSk7XG4gICAgfVxuICB9LCBbY3VycmVudENvbnRyb2xsZWRLZXksIGlzQ29udHJvbGxlZCwgaXNTaG93UHJldmlld10pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUHJvdmlkZXIsIHtcbiAgICB2YWx1ZToge1xuICAgICAgaXNQcmV2aWV3R3JvdXA6IHRydWUsXG4gICAgICBwcmV2aWV3VXJsczogY2FuUHJldmlld1VybHMsXG4gICAgICBzZXRQcmV2aWV3VXJsczogc2V0UHJldmlld1VybHMsXG4gICAgICBjdXJyZW50OiBjdXJyZW50LFxuICAgICAgc2V0Q3VycmVudDogc2V0Q3VycmVudCxcbiAgICAgIHNldFNob3dQcmV2aWV3OiBzZXRTaG93UHJldmlldyxcbiAgICAgIHNldE1vdXNlUG9zaXRpb246IHNldE1vdXNlUG9zaXRpb24sXG4gICAgICByZWdpc3RlckltYWdlOiByZWdpc3RlckltYWdlXG4gICAgfVxuICB9LCBjaGlsZHJlbiwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUHJldmlldywgX2V4dGVuZHMoe1xuICAgIFwiYXJpYS1oaWRkZW5cIjogIWlzU2hvd1ByZXZpZXcsXG4gICAgdmlzaWJsZTogaXNTaG93UHJldmlldyxcbiAgICBwcmVmaXhDbHM6IHByZXZpZXdQcmVmaXhDbHMsXG4gICAgb25DbG9zZTogb25QcmV2aWV3Q2xvc2UsXG4gICAgbW91c2VQb3NpdGlvbjogbW91c2VQb3NpdGlvbixcbiAgICBzcmM6IGNhblByZXZpZXdVcmxzLmdldChjdXJyZW50KSxcbiAgICBpY29uczogaWNvbnMsXG4gICAgZ2V0Q29udGFpbmVyOiBnZXRDb250YWluZXIsXG4gICAgY291bnRSZW5kZXI6IGNvdW50UmVuZGVyXG4gIH0sIGRpYWxvZ1Byb3BzKSkpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgR3JvdXA7IiwiLyoqIE1pbmltdW0gc2NhbGUgKi9cbmV4cG9ydCB2YXIgTUlOX1NDQUxFID0gMTtcbi8qKiBNYXhpbXVtIFNjYWxlICovXG5cbmV4cG9ydCB2YXIgTUFYX1NDQUxFID0gNTA7XG4vKiogU2NhbGUgdGhlIHJhdGlvIGJhc2UgKi9cblxuZXhwb3J0IHZhciBCQVNFX1NDQUxFX1JBVElPID0gMTtcbi8qKiBUaGUgbWF4aW11bSB6b29tIHJhdGlvIHdoZW4gdGhlIG1vdXNlIHpvb21zIGluLCBhZGp1c3RhYmxlICovXG5cbmV4cG9ydCB2YXIgV0hFRUxfTUFYX1NDQUxFX1JBVElPID0gMC4yOyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBDU1NNb3Rpb24gZnJvbSAncmMtbW90aW9uJztcbmltcG9ydCBQb3J0YWwgZnJvbSAnQHJjLWNvbXBvbmVudC9wb3J0YWwnO1xuaW1wb3J0IHsgTUlOX1NDQUxFLCBNQVhfU0NBTEUgfSBmcm9tIFwiLi9wcmV2aWV3Q29uZmlnXCI7XG5cbnZhciBPcGVyYXRpb25zID0gZnVuY3Rpb24gT3BlcmF0aW9ucyhwcm9wcykge1xuICB2YXIgX2NvdW50UmVuZGVyO1xuXG4gIHZhciB2aXNpYmxlID0gcHJvcHMudmlzaWJsZSxcbiAgICAgIG1hc2tUcmFuc2l0aW9uTmFtZSA9IHByb3BzLm1hc2tUcmFuc2l0aW9uTmFtZSxcbiAgICAgIGdldENvbnRhaW5lciA9IHByb3BzLmdldENvbnRhaW5lcixcbiAgICAgIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIHJvb3RDbGFzc05hbWUgPSBwcm9wcy5yb290Q2xhc3NOYW1lLFxuICAgICAgaWNvbnMgPSBwcm9wcy5pY29ucyxcbiAgICAgIGNvdW50UmVuZGVyID0gcHJvcHMuY291bnRSZW5kZXIsXG4gICAgICBzaG93U3dpdGNoID0gcHJvcHMuc2hvd1N3aXRjaCxcbiAgICAgIHNob3dQcm9ncmVzcyA9IHByb3BzLnNob3dQcm9ncmVzcyxcbiAgICAgIGN1cnJlbnQgPSBwcm9wcy5jdXJyZW50LFxuICAgICAgY291bnQgPSBwcm9wcy5jb3VudCxcbiAgICAgIHNjYWxlID0gcHJvcHMuc2NhbGUsXG4gICAgICBvblN3aXRjaExlZnQgPSBwcm9wcy5vblN3aXRjaExlZnQsXG4gICAgICBvblN3aXRjaFJpZ2h0ID0gcHJvcHMub25Td2l0Y2hSaWdodCxcbiAgICAgIG9uQ2xvc2UgPSBwcm9wcy5vbkNsb3NlLFxuICAgICAgb25ab29tSW4gPSBwcm9wcy5vblpvb21JbixcbiAgICAgIG9uWm9vbU91dCA9IHByb3BzLm9uWm9vbU91dCxcbiAgICAgIG9uUm90YXRlUmlnaHQgPSBwcm9wcy5vblJvdGF0ZVJpZ2h0LFxuICAgICAgb25Sb3RhdGVMZWZ0ID0gcHJvcHMub25Sb3RhdGVMZWZ0O1xuICB2YXIgcm90YXRlTGVmdCA9IGljb25zLnJvdGF0ZUxlZnQsXG4gICAgICByb3RhdGVSaWdodCA9IGljb25zLnJvdGF0ZVJpZ2h0LFxuICAgICAgem9vbUluID0gaWNvbnMuem9vbUluLFxuICAgICAgem9vbU91dCA9IGljb25zLnpvb21PdXQsXG4gICAgICBjbG9zZSA9IGljb25zLmNsb3NlLFxuICAgICAgbGVmdCA9IGljb25zLmxlZnQsXG4gICAgICByaWdodCA9IGljb25zLnJpZ2h0O1xuICB2YXIgdG9vbENsYXNzTmFtZSA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItb3BlcmF0aW9ucy1vcGVyYXRpb25cIik7XG4gIHZhciBpY29uQ2xhc3NOYW1lID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1vcGVyYXRpb25zLWljb25cIik7XG4gIHZhciB0b29scyA9IFt7XG4gICAgaWNvbjogY2xvc2UsXG4gICAgb25DbGljazogb25DbG9zZSxcbiAgICB0eXBlOiAnY2xvc2UnXG4gIH0sIHtcbiAgICBpY29uOiB6b29tSW4sXG4gICAgb25DbGljazogb25ab29tSW4sXG4gICAgdHlwZTogJ3pvb21JbicsXG4gICAgZGlzYWJsZWQ6IHNjYWxlID09PSBNQVhfU0NBTEVcbiAgfSwge1xuICAgIGljb246IHpvb21PdXQsXG4gICAgb25DbGljazogb25ab29tT3V0LFxuICAgIHR5cGU6ICd6b29tT3V0JyxcbiAgICBkaXNhYmxlZDogc2NhbGUgPT09IE1JTl9TQ0FMRVxuICB9LCB7XG4gICAgaWNvbjogcm90YXRlUmlnaHQsXG4gICAgb25DbGljazogb25Sb3RhdGVSaWdodCxcbiAgICB0eXBlOiAncm90YXRlUmlnaHQnXG4gIH0sIHtcbiAgICBpY29uOiByb3RhdGVMZWZ0LFxuICAgIG9uQ2xpY2s6IG9uUm90YXRlTGVmdCxcbiAgICB0eXBlOiAncm90YXRlTGVmdCdcbiAgfV07XG4gIHZhciBvcGVyYXRpb25zID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIHNob3dTd2l0Y2ggJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zd2l0Y2gtbGVmdFwiKSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN3aXRjaC1sZWZ0LWRpc2FibGVkXCIpLCBjdXJyZW50ID09PSAwKSksXG4gICAgb25DbGljazogb25Td2l0Y2hMZWZ0XG4gIH0sIGxlZnQpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc25hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3dpdGNoLXJpZ2h0XCIpLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3dpdGNoLXJpZ2h0LWRpc2FibGVkXCIpLCBjdXJyZW50ID09PSBjb3VudCAtIDEpKSxcbiAgICBvbkNsaWNrOiBvblN3aXRjaFJpZ2h0XG4gIH0sIHJpZ2h0KSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwidWxcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1vcGVyYXRpb25zXCIpXG4gIH0sIHNob3dQcm9ncmVzcyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItb3BlcmF0aW9ucy1wcm9ncmVzc1wiKVxuICB9LCAoX2NvdW50UmVuZGVyID0gY291bnRSZW5kZXIgPT09IG51bGwgfHwgY291bnRSZW5kZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvdW50UmVuZGVyKGN1cnJlbnQgKyAxLCBjb3VudCkpICE9PSBudWxsICYmIF9jb3VudFJlbmRlciAhPT0gdm9pZCAwID8gX2NvdW50UmVuZGVyIDogXCJcIi5jb25jYXQoY3VycmVudCArIDEsIFwiIC8gXCIpLmNvbmNhdChjb3VudCkpLCB0b29scy5tYXAoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgX2NsYXNzbmFtZXMzO1xuXG4gICAgdmFyIGljb24gPSBfcmVmLmljb24sXG4gICAgICAgIG9uQ2xpY2sgPSBfcmVmLm9uQ2xpY2ssXG4gICAgICAgIHR5cGUgPSBfcmVmLnR5cGUsXG4gICAgICAgIGRpc2FibGVkID0gX3JlZi5kaXNhYmxlZDtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXModG9vbENsYXNzTmFtZSwgKF9jbGFzc25hbWVzMyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzbmFtZXMzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW9wZXJhdGlvbnMtb3BlcmF0aW9uLVwiKS5jb25jYXQodHlwZSksIHRydWUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzbmFtZXMzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW9wZXJhdGlvbnMtb3BlcmF0aW9uLWRpc2FibGVkXCIpLCAhIWRpc2FibGVkKSwgX2NsYXNzbmFtZXMzKSksXG4gICAgICBvbkNsaWNrOiBvbkNsaWNrLFxuICAgICAga2V5OiB0eXBlXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KGljb24pID8gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChpY29uLCB7XG4gICAgICBjbGFzc05hbWU6IGljb25DbGFzc05hbWVcbiAgICB9KSA6IGljb24pO1xuICB9KSkpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ1NTTW90aW9uLCB7XG4gICAgdmlzaWJsZTogdmlzaWJsZSxcbiAgICBtb3Rpb25OYW1lOiBtYXNrVHJhbnNpdGlvbk5hbWVcbiAgfSwgZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgdmFyIGNsYXNzTmFtZSA9IF9yZWYyLmNsYXNzTmFtZSxcbiAgICAgICAgc3R5bGUgPSBfcmVmMi5zdHlsZTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUG9ydGFsLCB7XG4gICAgICBvcGVuOiB0cnVlLFxuICAgICAgZ2V0Q29udGFpbmVyOiBnZXRDb250YWluZXIgIT09IG51bGwgJiYgZ2V0Q29udGFpbmVyICE9PSB2b2lkIDAgPyBnZXRDb250YWluZXIgOiBkb2N1bWVudC5ib2R5XG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc25hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItb3BlcmF0aW9ucy13cmFwcGVyXCIpLCBjbGFzc05hbWUsIHJvb3RDbGFzc05hbWUpLFxuICAgICAgc3R5bGU6IHN0eWxlXG4gICAgfSwgb3BlcmF0aW9ucykpO1xuICB9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE9wZXJhdGlvbnM7IiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IHsgdXNlU3RhdGUsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG5pbXBvcnQgeyBnZXRDbGllbnRTaXplIH0gZnJvbSBcInJjLXV0aWwvZXMvRG9tL2Nzc1wiO1xuaW1wb3J0IHsgTUlOX1NDQUxFLCBNQVhfU0NBTEUgfSBmcm9tIFwiLi4vcHJldmlld0NvbmZpZ1wiO1xudmFyIGluaXRpYWxUcmFuc2Zvcm0gPSB7XG4gIHg6IDAsXG4gIHk6IDAsXG4gIHJvdGF0ZTogMCxcbiAgc2NhbGU6IDFcbn07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VJbWFnZVRyYW5zZm9ybShpbWdSZWYpIHtcbiAgdmFyIGZyYW1lID0gdXNlUmVmKG51bGwpO1xuICB2YXIgcXVldWUgPSB1c2VSZWYoW10pO1xuXG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShpbml0aWFsVHJhbnNmb3JtKSxcbiAgICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgICAgdHJhbnNmb3JtID0gX3VzZVN0YXRlMlswXSxcbiAgICAgIHNldFRyYW5zZm9ybSA9IF91c2VTdGF0ZTJbMV07XG5cbiAgdmFyIHJlc2V0VHJhbnNmb3JtID0gZnVuY3Rpb24gcmVzZXRUcmFuc2Zvcm0oKSB7XG4gICAgc2V0VHJhbnNmb3JtKGluaXRpYWxUcmFuc2Zvcm0pO1xuICB9O1xuICAvKiogRGlyZWN0IHVwZGF0ZSB0cmFuc2Zvcm0gKi9cblxuXG4gIHZhciB1cGRhdGVUcmFuc2Zvcm0gPSBmdW5jdGlvbiB1cGRhdGVUcmFuc2Zvcm0obmV3VHJhbnNmb3JtKSB7XG4gICAgaWYgKGZyYW1lLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIHF1ZXVlLmN1cnJlbnQgPSBbXTtcbiAgICAgIGZyYW1lLmN1cnJlbnQgPSByYWYoZnVuY3Rpb24gKCkge1xuICAgICAgICBzZXRUcmFuc2Zvcm0oZnVuY3Rpb24gKHByZVN0YXRlKSB7XG4gICAgICAgICAgdmFyIG1lbW9TdGF0ZSA9IHByZVN0YXRlO1xuICAgICAgICAgIHF1ZXVlLmN1cnJlbnQuZm9yRWFjaChmdW5jdGlvbiAocXVldWVTdGF0ZSkge1xuICAgICAgICAgICAgbWVtb1N0YXRlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtZW1vU3RhdGUpLCBxdWV1ZVN0YXRlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmcmFtZS5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgICByZXR1cm4gbWVtb1N0YXRlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHF1ZXVlLmN1cnJlbnQucHVzaChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHRyYW5zZm9ybSksIG5ld1RyYW5zZm9ybSkpO1xuICB9O1xuICAvKiogU2NhbGUgYWNjb3JkaW5nIHRvIHRoZSBwb3NpdGlvbiBvZiBjbGllbnRYIGFuZCBjbGllbnRZICovXG5cblxuICB2YXIgZGlzcGF0Y2hab29uQ2hhbmdlID0gZnVuY3Rpb24gZGlzcGF0Y2hab29uQ2hhbmdlKHJhdGlvLCBjbGllbnRYLCBjbGllbnRZKSB7XG4gICAgdmFyIF9pbWdSZWYkY3VycmVudCA9IGltZ1JlZi5jdXJyZW50LFxuICAgICAgICB3aWR0aCA9IF9pbWdSZWYkY3VycmVudC53aWR0aCxcbiAgICAgICAgaGVpZ2h0ID0gX2ltZ1JlZiRjdXJyZW50LmhlaWdodCxcbiAgICAgICAgb2Zmc2V0V2lkdGggPSBfaW1nUmVmJGN1cnJlbnQub2Zmc2V0V2lkdGgsXG4gICAgICAgIG9mZnNldEhlaWdodCA9IF9pbWdSZWYkY3VycmVudC5vZmZzZXRIZWlnaHQsXG4gICAgICAgIG9mZnNldExlZnQgPSBfaW1nUmVmJGN1cnJlbnQub2Zmc2V0TGVmdCxcbiAgICAgICAgb2Zmc2V0VG9wID0gX2ltZ1JlZiRjdXJyZW50Lm9mZnNldFRvcDtcbiAgICB2YXIgbmV3UmF0aW8gPSByYXRpbztcbiAgICB2YXIgbmV3U2NhbGUgPSB0cmFuc2Zvcm0uc2NhbGUgKiByYXRpbztcblxuICAgIGlmIChuZXdTY2FsZSA+IE1BWF9TQ0FMRSkge1xuICAgICAgbmV3UmF0aW8gPSBNQVhfU0NBTEUgLyB0cmFuc2Zvcm0uc2NhbGU7XG4gICAgICBuZXdTY2FsZSA9IE1BWF9TQ0FMRTtcbiAgICB9IGVsc2UgaWYgKG5ld1NjYWxlIDwgTUlOX1NDQUxFKSB7XG4gICAgICBuZXdSYXRpbyA9IE1JTl9TQ0FMRSAvIHRyYW5zZm9ybS5zY2FsZTtcbiAgICAgIG5ld1NjYWxlID0gTUlOX1NDQUxFO1xuICAgIH1cbiAgICAvKiogRGVmYXVsdCBjZW50ZXIgcG9pbnQgc2NhbGluZyAqL1xuXG5cbiAgICB2YXIgbWVyZ2VkQ2xpZW50WCA9IGNsaWVudFggIT09IG51bGwgJiYgY2xpZW50WCAhPT0gdm9pZCAwID8gY2xpZW50WCA6IGlubmVyV2lkdGggLyAyO1xuICAgIHZhciBtZXJnZWRDbGllbnRZID0gY2xpZW50WSAhPT0gbnVsbCAmJiBjbGllbnRZICE9PSB2b2lkIDAgPyBjbGllbnRZIDogaW5uZXJIZWlnaHQgLyAyO1xuICAgIHZhciBkaWZmUmF0aW8gPSBuZXdSYXRpbyAtIDE7XG4gICAgLyoqIERldmlhdGlvbiBjYWxjdWxhdGVkIGZyb20gaW1hZ2Ugc2l6ZSAqL1xuXG4gICAgdmFyIGRpZmZJbWdYID0gZGlmZlJhdGlvICogd2lkdGggKiAwLjU7XG4gICAgdmFyIGRpZmZJbWdZID0gZGlmZlJhdGlvICogaGVpZ2h0ICogMC41O1xuICAgIC8qKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjbGljayBwb3NpdGlvbiBhbmQgdGhlIGVkZ2Ugb2YgdGhlIGRvY3VtZW50ICovXG5cbiAgICB2YXIgZGlmZk9mZnNldExlZnQgPSBkaWZmUmF0aW8gKiAobWVyZ2VkQ2xpZW50WCAtIHRyYW5zZm9ybS54IC0gb2Zmc2V0TGVmdCk7XG4gICAgdmFyIGRpZmZPZmZzZXRUb3AgPSBkaWZmUmF0aW8gKiAobWVyZ2VkQ2xpZW50WSAtIHRyYW5zZm9ybS55IC0gb2Zmc2V0VG9wKTtcbiAgICAvKiogRmluYWwgcG9zaXRpb25pbmcgKi9cblxuICAgIHZhciBuZXdYID0gdHJhbnNmb3JtLnggLSAoZGlmZk9mZnNldExlZnQgLSBkaWZmSW1nWCk7XG4gICAgdmFyIG5ld1kgPSB0cmFuc2Zvcm0ueSAtIChkaWZmT2Zmc2V0VG9wIC0gZGlmZkltZ1kpO1xuICAgIC8qKlxuICAgICAqIFdoZW4gem9vbWluZyB0aGUgaW1hZ2VcbiAgICAgKiBXaGVuIHRoZSBpbWFnZSBzaXplIGlzIHNtYWxsZXIgdGhhbiB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgd2luZG93LCB0aGUgcG9zaXRpb24gaXMgaW5pdGlhbGl6ZWRcbiAgICAgKi9cblxuICAgIGlmIChyYXRpbyA8IDEgJiYgbmV3U2NhbGUgPT09IDEpIHtcbiAgICAgIHZhciBtZXJnZWRXaWR0aCA9IG9mZnNldFdpZHRoICogbmV3U2NhbGU7XG4gICAgICB2YXIgbWVyZ2VkSGVpZ2h0ID0gb2Zmc2V0SGVpZ2h0ICogbmV3U2NhbGU7XG5cbiAgICAgIHZhciBfZ2V0Q2xpZW50U2l6ZSA9IGdldENsaWVudFNpemUoKSxcbiAgICAgICAgICBjbGllbnRXaWR0aCA9IF9nZXRDbGllbnRTaXplLndpZHRoLFxuICAgICAgICAgIGNsaWVudEhlaWdodCA9IF9nZXRDbGllbnRTaXplLmhlaWdodDtcblxuICAgICAgaWYgKG1lcmdlZFdpZHRoIDw9IGNsaWVudFdpZHRoICYmIG1lcmdlZEhlaWdodCA8PSBjbGllbnRIZWlnaHQpIHtcbiAgICAgICAgbmV3WCA9IDA7XG4gICAgICAgIG5ld1kgPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZVRyYW5zZm9ybSh7XG4gICAgICB4OiBuZXdYLFxuICAgICAgeTogbmV3WSxcbiAgICAgIHNjYWxlOiBuZXdTY2FsZVxuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0sXG4gICAgcmVzZXRUcmFuc2Zvcm06IHJlc2V0VHJhbnNmb3JtLFxuICAgIHVwZGF0ZVRyYW5zZm9ybTogdXBkYXRlVHJhbnNmb3JtLFxuICAgIGRpc3BhdGNoWm9vbkNoYW5nZTogZGlzcGF0Y2hab29uQ2hhbmdlXG4gIH07XG59XG47IiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgeyBnZXRDbGllbnRTaXplIH0gZnJvbSBcInJjLXV0aWwvZXMvRG9tL2Nzc1wiO1xuXG5mdW5jdGlvbiBmaXhQb2ludChrZXksIHN0YXJ0LCB3aWR0aCwgY2xpZW50V2lkdGgpIHtcbiAgdmFyIHN0YXJ0QWRkV2lkdGggPSBzdGFydCArIHdpZHRoO1xuICB2YXIgb2Zmc2V0U3RhcnQgPSAod2lkdGggLSBjbGllbnRXaWR0aCkgLyAyO1xuXG4gIGlmICh3aWR0aCA+IGNsaWVudFdpZHRoKSB7XG4gICAgaWYgKHN0YXJ0ID4gMCkge1xuICAgICAgcmV0dXJuIF9kZWZpbmVQcm9wZXJ0eSh7fSwga2V5LCBvZmZzZXRTdGFydCk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0IDwgMCAmJiBzdGFydEFkZFdpZHRoIDwgY2xpZW50V2lkdGgpIHtcbiAgICAgIHJldHVybiBfZGVmaW5lUHJvcGVydHkoe30sIGtleSwgLW9mZnNldFN0YXJ0KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0QWRkV2lkdGggPiBjbGllbnRXaWR0aCkge1xuICAgIHJldHVybiBfZGVmaW5lUHJvcGVydHkoe30sIGtleSwgc3RhcnQgPCAwID8gb2Zmc2V0U3RhcnQgOiAtb2Zmc2V0U3RhcnQpO1xuICB9XG5cbiAgcmV0dXJuIHt9O1xufVxuLyoqXG4gKiBGaXggcG9zaXRvbiB4LHkgcG9pbnQgd2hlblxuICpcbiAqIEVsZSB3aWR0aCAmJiBoZWlnaHQgPCBjbGllbnRcbiAqIC0gQmFjayBvcmlnaW5cbiAqXG4gKiAtIEVsZSB3aWR0aCB8IGhlaWdodCA+IGNsaWVudFdpZHRoIHwgY2xpZW50SGVpZ2h0XG4gKiAtIGxlZnQgfCB0b3AgPiAwIC0+IEJhY2sgMFxuICogLSBsZWZ0IHwgdG9wICsgd2lkdGggfCBoZWlnaHQgPCBjbGllbnRXaWR0aCB8IGNsaWVudEhlaWdodCAtPiBCYWNrIGxlZnQgfCB0b3AgKyB3aWR0aCB8IGhlaWdodCA9PT0gY2xpZW50V2lkdGggfCBjbGllbnRIZWlnaHRcbiAqXG4gKiBSZWdhcmRsZXNzIG9mIG90aGVyXG4gKi9cblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRGaXhTY2FsZUVsZVRyYW5zUG9zaXRpb24od2lkdGgsIGhlaWdodCwgbGVmdCwgdG9wKSB7XG4gIHZhciBfZ2V0Q2xpZW50U2l6ZSA9IGdldENsaWVudFNpemUoKSxcbiAgICAgIGNsaWVudFdpZHRoID0gX2dldENsaWVudFNpemUud2lkdGgsXG4gICAgICBjbGllbnRIZWlnaHQgPSBfZ2V0Q2xpZW50U2l6ZS5oZWlnaHQ7XG5cbiAgdmFyIGZpeFBvcyA9IG51bGw7XG5cbiAgaWYgKHdpZHRoIDw9IGNsaWVudFdpZHRoICYmIGhlaWdodCA8PSBjbGllbnRIZWlnaHQpIHtcbiAgICBmaXhQb3MgPSB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMFxuICAgIH07XG4gIH0gZWxzZSBpZiAod2lkdGggPiBjbGllbnRXaWR0aCB8fCBoZWlnaHQgPiBjbGllbnRIZWlnaHQpIHtcbiAgICBmaXhQb3MgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGZpeFBvaW50KCd4JywgbGVmdCwgd2lkdGgsIGNsaWVudFdpZHRoKSksIGZpeFBvaW50KCd5JywgdG9wLCBoZWlnaHQsIGNsaWVudEhlaWdodCkpO1xuICB9XG5cbiAgcmV0dXJuIGZpeFBvcztcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcInByZWZpeENsc1wiLCBcInNyY1wiLCBcImFsdFwiLCBcIm9uQ2xvc2VcIiwgXCJhZnRlckNsb3NlXCIsIFwidmlzaWJsZVwiLCBcImljb25zXCIsIFwicm9vdENsYXNzTmFtZVwiLCBcImdldENvbnRhaW5lclwiLCBcImNvdW50UmVuZGVyXCIsIFwic2NhbGVTdGVwXCIsIFwidHJhbnNpdGlvbk5hbWVcIiwgXCJtYXNrVHJhbnNpdGlvbk5hbWVcIl07XG5pbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZUVmZmVjdCwgdXNlQ2FsbGJhY2ssIHVzZVJlZiwgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBEaWFsb2cgZnJvbSAncmMtZGlhbG9nJztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IGFkZEV2ZW50TGlzdGVuZXIgZnJvbSBcInJjLXV0aWwvZXMvRG9tL2FkZEV2ZW50TGlzdGVuZXJcIjtcbmltcG9ydCBLZXlDb2RlIGZyb20gXCJyYy11dGlsL2VzL0tleUNvZGVcIjtcbmltcG9ydCB7IHdhcm5pbmcgfSBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5pbXBvcnQgeyBjb250ZXh0IH0gZnJvbSBcIi4vUHJldmlld0dyb3VwXCI7XG5pbXBvcnQgT3BlcmF0aW9ucyBmcm9tIFwiLi9PcGVyYXRpb25zXCI7XG5pbXBvcnQgdXNlSW1hZ2VUcmFuc2Zvcm0gZnJvbSBcIi4vaG9va3MvdXNlSW1hZ2VUcmFuc2Zvcm1cIjtcbmltcG9ydCBnZXRGaXhTY2FsZUVsZVRyYW5zUG9zaXRpb24gZnJvbSBcIi4vZ2V0Rml4U2NhbGVFbGVUcmFuc1Bvc2l0aW9uXCI7XG5pbXBvcnQgeyBCQVNFX1NDQUxFX1JBVElPLCBXSEVFTF9NQVhfU0NBTEVfUkFUSU8gfSBmcm9tIFwiLi9wcmV2aWV3Q29uZmlnXCI7XG5cbnZhciBQcmV2aWV3ID0gZnVuY3Rpb24gUHJldmlldyhwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgc3JjID0gcHJvcHMuc3JjLFxuICAgICAgYWx0ID0gcHJvcHMuYWx0LFxuICAgICAgb25DbG9zZSA9IHByb3BzLm9uQ2xvc2UsXG4gICAgICBhZnRlckNsb3NlID0gcHJvcHMuYWZ0ZXJDbG9zZSxcbiAgICAgIHZpc2libGUgPSBwcm9wcy52aXNpYmxlLFxuICAgICAgX3Byb3BzJGljb25zID0gcHJvcHMuaWNvbnMsXG4gICAgICBpY29ucyA9IF9wcm9wcyRpY29ucyA9PT0gdm9pZCAwID8ge30gOiBfcHJvcHMkaWNvbnMsXG4gICAgICByb290Q2xhc3NOYW1lID0gcHJvcHMucm9vdENsYXNzTmFtZSxcbiAgICAgIGdldENvbnRhaW5lciA9IHByb3BzLmdldENvbnRhaW5lcixcbiAgICAgIGNvdW50UmVuZGVyID0gcHJvcHMuY291bnRSZW5kZXIsXG4gICAgICBfcHJvcHMkc2NhbGVTdGVwID0gcHJvcHMuc2NhbGVTdGVwLFxuICAgICAgc2NhbGVTdGVwID0gX3Byb3BzJHNjYWxlU3RlcCA9PT0gdm9pZCAwID8gMC41IDogX3Byb3BzJHNjYWxlU3RlcCxcbiAgICAgIF9wcm9wcyR0cmFuc2l0aW9uTmFtZSA9IHByb3BzLnRyYW5zaXRpb25OYW1lLFxuICAgICAgdHJhbnNpdGlvbk5hbWUgPSBfcHJvcHMkdHJhbnNpdGlvbk5hbWUgPT09IHZvaWQgMCA/ICd6b29tJyA6IF9wcm9wcyR0cmFuc2l0aW9uTmFtZSxcbiAgICAgIF9wcm9wcyRtYXNrVHJhbnNpdGlvbiA9IHByb3BzLm1hc2tUcmFuc2l0aW9uTmFtZSxcbiAgICAgIG1hc2tUcmFuc2l0aW9uTmFtZSA9IF9wcm9wcyRtYXNrVHJhbnNpdGlvbiA9PT0gdm9pZCAwID8gJ2ZhZGUnIDogX3Byb3BzJG1hc2tUcmFuc2l0aW9uLFxuICAgICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQpO1xuXG4gIHZhciBpbWdSZWYgPSB1c2VSZWYoKTtcbiAgdmFyIGRvd25Qb3NpdGlvblJlZiA9IHVzZVJlZih7XG4gICAgZGVsdGFYOiAwLFxuICAgIGRlbHRhWTogMCxcbiAgICB0cmFuc2Zvcm1YOiAwLFxuICAgIHRyYW5zZm9ybVk6IDBcbiAgfSk7XG5cbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKGZhbHNlKSxcbiAgICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgICAgaXNNb3ZpbmcgPSBfdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0TW92aW5nID0gX3VzZVN0YXRlMlsxXTtcblxuICB2YXIgX3VzZUNvbnRleHQgPSB1c2VDb250ZXh0KGNvbnRleHQpLFxuICAgICAgcHJldmlld1VybHMgPSBfdXNlQ29udGV4dC5wcmV2aWV3VXJscyxcbiAgICAgIGN1cnJlbnQgPSBfdXNlQ29udGV4dC5jdXJyZW50LFxuICAgICAgaXNQcmV2aWV3R3JvdXAgPSBfdXNlQ29udGV4dC5pc1ByZXZpZXdHcm91cCxcbiAgICAgIHNldEN1cnJlbnQgPSBfdXNlQ29udGV4dC5zZXRDdXJyZW50O1xuXG4gIHZhciBwcmV2aWV3R3JvdXBDb3VudCA9IHByZXZpZXdVcmxzLnNpemU7XG4gIHZhciBwcmV2aWV3VXJsc0tleXMgPSBBcnJheS5mcm9tKHByZXZpZXdVcmxzLmtleXMoKSk7XG4gIHZhciBjdXJyZW50UHJldmlld0luZGV4ID0gcHJldmlld1VybHNLZXlzLmluZGV4T2YoY3VycmVudCk7XG4gIHZhciBjb21iaW5hdGlvblNyYyA9IGlzUHJldmlld0dyb3VwID8gcHJldmlld1VybHMuZ2V0KGN1cnJlbnQpIDogc3JjO1xuICB2YXIgc2hvd0xlZnRPclJpZ2h0U3dpdGNoZXMgPSBpc1ByZXZpZXdHcm91cCAmJiBwcmV2aWV3R3JvdXBDb3VudCA+IDE7XG4gIHZhciBzaG93T3BlcmF0aW9uc1Byb2dyZXNzID0gaXNQcmV2aWV3R3JvdXAgJiYgcHJldmlld0dyb3VwQ291bnQgPj0gMTtcblxuICB2YXIgX3VzZUltYWdlVHJhbnNmb3JtID0gdXNlSW1hZ2VUcmFuc2Zvcm0oaW1nUmVmKSxcbiAgICAgIHRyYW5zZm9ybSA9IF91c2VJbWFnZVRyYW5zZm9ybS50cmFuc2Zvcm0sXG4gICAgICByZXNldFRyYW5zZm9ybSA9IF91c2VJbWFnZVRyYW5zZm9ybS5yZXNldFRyYW5zZm9ybSxcbiAgICAgIHVwZGF0ZVRyYW5zZm9ybSA9IF91c2VJbWFnZVRyYW5zZm9ybS51cGRhdGVUcmFuc2Zvcm0sXG4gICAgICBkaXNwYXRjaFpvb25DaGFuZ2UgPSBfdXNlSW1hZ2VUcmFuc2Zvcm0uZGlzcGF0Y2hab29uQ2hhbmdlO1xuXG4gIHZhciByb3RhdGUgPSB0cmFuc2Zvcm0ucm90YXRlLFxuICAgICAgc2NhbGUgPSB0cmFuc2Zvcm0uc2NhbGU7XG4gIHZhciB3cmFwQ2xhc3NOYW1lID0gY2xhc3NuYW1lcyhfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbW92aW5nXCIpLCBpc01vdmluZykpO1xuXG4gIHZhciBvbkFmdGVyQ2xvc2UgPSBmdW5jdGlvbiBvbkFmdGVyQ2xvc2UoKSB7XG4gICAgcmVzZXRUcmFuc2Zvcm0oKTtcbiAgfTtcblxuICB2YXIgb25ab29tSW4gPSBmdW5jdGlvbiBvblpvb21JbigpIHtcbiAgICBkaXNwYXRjaFpvb25DaGFuZ2UoQkFTRV9TQ0FMRV9SQVRJTyArIHNjYWxlU3RlcCk7XG4gIH07XG5cbiAgdmFyIG9uWm9vbU91dCA9IGZ1bmN0aW9uIG9uWm9vbU91dCgpIHtcbiAgICBkaXNwYXRjaFpvb25DaGFuZ2UoQkFTRV9TQ0FMRV9SQVRJTyAtIHNjYWxlU3RlcCk7XG4gIH07XG5cbiAgdmFyIG9uUm90YXRlUmlnaHQgPSBmdW5jdGlvbiBvblJvdGF0ZVJpZ2h0KCkge1xuICAgIHVwZGF0ZVRyYW5zZm9ybSh7XG4gICAgICByb3RhdGU6IHJvdGF0ZSArIDkwXG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIG9uUm90YXRlTGVmdCA9IGZ1bmN0aW9uIG9uUm90YXRlTGVmdCgpIHtcbiAgICB1cGRhdGVUcmFuc2Zvcm0oe1xuICAgICAgcm90YXRlOiByb3RhdGUgLSA5MFxuICAgIH0pO1xuICB9O1xuXG4gIHZhciBvblN3aXRjaExlZnQgPSBmdW5jdGlvbiBvblN3aXRjaExlZnQoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKGN1cnJlbnRQcmV2aWV3SW5kZXggPiAwKSB7XG4gICAgICBzZXRDdXJyZW50KHByZXZpZXdVcmxzS2V5c1tjdXJyZW50UHJldmlld0luZGV4IC0gMV0pO1xuICAgIH1cbiAgfTtcblxuICB2YXIgb25Td2l0Y2hSaWdodCA9IGZ1bmN0aW9uIG9uU3dpdGNoUmlnaHQoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKGN1cnJlbnRQcmV2aWV3SW5kZXggPCBwcmV2aWV3R3JvdXBDb3VudCAtIDEpIHtcbiAgICAgIHNldEN1cnJlbnQocHJldmlld1VybHNLZXlzW2N1cnJlbnRQcmV2aWV3SW5kZXggKyAxXSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBvbk1vdXNlVXAgPSBmdW5jdGlvbiBvbk1vdXNlVXAoKSB7XG4gICAgaWYgKHZpc2libGUgJiYgaXNNb3ZpbmcpIHtcbiAgICAgIHNldE1vdmluZyhmYWxzZSk7XG4gICAgICAvKiogTm8gbmVlZCB0byByZXN0b3JlIHRoZSBwb3NpdGlvbiB3aGVuIHRoZSBwaWN0dXJlIGlzIG5vdCBtb3ZlZCwgU28gYXMgbm90IHRvIGludGVyZmVyZSB3aXRoIHRoZSBjbGljayAqL1xuXG4gICAgICB2YXIgX2Rvd25Qb3NpdGlvblJlZiRjdXJyID0gZG93blBvc2l0aW9uUmVmLmN1cnJlbnQsXG4gICAgICAgICAgdHJhbnNmb3JtWCA9IF9kb3duUG9zaXRpb25SZWYkY3Vyci50cmFuc2Zvcm1YLFxuICAgICAgICAgIHRyYW5zZm9ybVkgPSBfZG93blBvc2l0aW9uUmVmJGN1cnIudHJhbnNmb3JtWTtcbiAgICAgIHZhciBoYXNDaGFuZ2VkUG9zaXRpb24gPSB0cmFuc2Zvcm0ueCAhPT0gdHJhbnNmb3JtWCAmJiB0cmFuc2Zvcm0ueSAhPT0gdHJhbnNmb3JtWTtcblxuICAgICAgaWYgKCFoYXNDaGFuZ2VkUG9zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgd2lkdGggPSBpbWdSZWYuY3VycmVudC5vZmZzZXRXaWR0aCAqIHNjYWxlO1xuICAgICAgdmFyIGhlaWdodCA9IGltZ1JlZi5jdXJyZW50Lm9mZnNldEhlaWdodCAqIHNjYWxlOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXNoYWRvd1xuXG4gICAgICB2YXIgX2ltZ1JlZiRjdXJyZW50JGdldEJvID0gaW1nUmVmLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgbGVmdCA9IF9pbWdSZWYkY3VycmVudCRnZXRCby5sZWZ0LFxuICAgICAgICAgIHRvcCA9IF9pbWdSZWYkY3VycmVudCRnZXRCby50b3A7XG5cbiAgICAgIHZhciBpc1JvdGF0ZSA9IHJvdGF0ZSAlIDE4MCAhPT0gMDtcbiAgICAgIHZhciBmaXhTdGF0ZSA9IGdldEZpeFNjYWxlRWxlVHJhbnNQb3NpdGlvbihpc1JvdGF0ZSA/IGhlaWdodCA6IHdpZHRoLCBpc1JvdGF0ZSA/IHdpZHRoIDogaGVpZ2h0LCBsZWZ0LCB0b3ApO1xuXG4gICAgICBpZiAoZml4U3RhdGUpIHtcbiAgICAgICAgdXBkYXRlVHJhbnNmb3JtKF9vYmplY3RTcHJlYWQoe30sIGZpeFN0YXRlKSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHZhciBvbk1vdXNlRG93biA9IGZ1bmN0aW9uIG9uTW91c2VEb3duKGV2ZW50KSB7XG4gICAgLy8gT25seSBhbGxvdyBtYWluIGJ1dHRvblxuICAgIGlmIChldmVudC5idXR0b24gIT09IDApIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGRvd25Qb3NpdGlvblJlZi5jdXJyZW50ID0ge1xuICAgICAgZGVsdGFYOiBldmVudC5wYWdlWCAtIHRyYW5zZm9ybS54LFxuICAgICAgZGVsdGFZOiBldmVudC5wYWdlWSAtIHRyYW5zZm9ybS55LFxuICAgICAgdHJhbnNmb3JtWDogdHJhbnNmb3JtLngsXG4gICAgICB0cmFuc2Zvcm1ZOiB0cmFuc2Zvcm0ueVxuICAgIH07XG4gICAgc2V0TW92aW5nKHRydWUpO1xuICB9O1xuXG4gIHZhciBvbk1vdXNlTW92ZSA9IGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGV2ZW50KSB7XG4gICAgaWYgKHZpc2libGUgJiYgaXNNb3ZpbmcpIHtcbiAgICAgIHVwZGF0ZVRyYW5zZm9ybSh7XG4gICAgICAgIHg6IGV2ZW50LnBhZ2VYIC0gZG93blBvc2l0aW9uUmVmLmN1cnJlbnQuZGVsdGFYLFxuICAgICAgICB5OiBldmVudC5wYWdlWSAtIGRvd25Qb3NpdGlvblJlZi5jdXJyZW50LmRlbHRhWVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBvbldoZWVsID0gZnVuY3Rpb24gb25XaGVlbChldmVudCkge1xuICAgIGlmICghdmlzaWJsZSB8fCBldmVudC5kZWx0YVkgPT0gMCkgcmV0dXJuOyAvLyBTY2FsZSByYXRpbyBkZXBlbmRzIG9uIHRoZSBkZWx0YVkgc2l6ZVxuXG4gICAgdmFyIHNjYWxlUmF0aW8gPSBNYXRoLmFicyhldmVudC5kZWx0YVkgLyAxMDApOyAvLyBMaW1pdCB0aGUgbWF4aW11bSBzY2FsZSByYXRpb1xuXG4gICAgdmFyIG1lcmdlZFNjYWxlUmF0aW8gPSBNYXRoLm1pbihzY2FsZVJhdGlvLCBXSEVFTF9NQVhfU0NBTEVfUkFUSU8pOyAvLyBTY2FsZSB0aGUgcmF0aW8gZWFjaCB0aW1lXG5cbiAgICB2YXIgcmF0aW8gPSBCQVNFX1NDQUxFX1JBVElPICsgbWVyZ2VkU2NhbGVSYXRpbyAqIHNjYWxlU3RlcDtcblxuICAgIGlmIChldmVudC5kZWx0YVkgPiAwKSB7XG4gICAgICByYXRpbyA9IEJBU0VfU0NBTEVfUkFUSU8gLyByYXRpbztcbiAgICB9XG5cbiAgICBkaXNwYXRjaFpvb25DaGFuZ2UocmF0aW8sIGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICB9O1xuXG4gIHZhciBvbktleURvd24gPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoIXZpc2libGUgfHwgIXNob3dMZWZ0T3JSaWdodFN3aXRjaGVzKSByZXR1cm47XG5cbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS2V5Q29kZS5MRUZUKSB7XG4gICAgICBpZiAoY3VycmVudFByZXZpZXdJbmRleCA+IDApIHtcbiAgICAgICAgc2V0Q3VycmVudChwcmV2aWV3VXJsc0tleXNbY3VycmVudFByZXZpZXdJbmRleCAtIDFdKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtleUNvZGUuUklHSFQpIHtcbiAgICAgIGlmIChjdXJyZW50UHJldmlld0luZGV4IDwgcHJldmlld0dyb3VwQ291bnQgLSAxKSB7XG4gICAgICAgIHNldEN1cnJlbnQocHJldmlld1VybHNLZXlzW2N1cnJlbnRQcmV2aWV3SW5kZXggKyAxXSk7XG4gICAgICB9XG4gICAgfVxuICB9LCBbY3VycmVudFByZXZpZXdJbmRleCwgcHJldmlld0dyb3VwQ291bnQsIHByZXZpZXdVcmxzS2V5cywgc2V0Q3VycmVudCwgc2hvd0xlZnRPclJpZ2h0U3dpdGNoZXMsIHZpc2libGVdKTtcblxuICB2YXIgb25Eb3VibGVDbGljayA9IGZ1bmN0aW9uIG9uRG91YmxlQ2xpY2soZXZlbnQpIHtcbiAgICBpZiAodmlzaWJsZSkge1xuICAgICAgaWYgKHNjYWxlICE9PSAxKSB7XG4gICAgICAgIHVwZGF0ZVRyYW5zZm9ybSh7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwLFxuICAgICAgICAgIHNjYWxlOiAxXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlzcGF0Y2hab29uQ2hhbmdlKEJBU0VfU0NBTEVfUkFUSU8gKyBzY2FsZVN0ZXAsIGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBvblRvcE1vdXNlVXBMaXN0ZW5lcjtcbiAgICB2YXIgb25Ub3BNb3VzZU1vdmVMaXN0ZW5lcjtcbiAgICB2YXIgb25Nb3VzZVVwTGlzdGVuZXIgPSBhZGRFdmVudExpc3RlbmVyKHdpbmRvdywgJ21vdXNldXAnLCBvbk1vdXNlVXAsIGZhbHNlKTtcbiAgICB2YXIgb25Nb3VzZU1vdmVMaXN0ZW5lciA9IGFkZEV2ZW50TGlzdGVuZXIod2luZG93LCAnbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUsIGZhbHNlKTtcbiAgICB2YXIgb25LZXlEb3duTGlzdGVuZXIgPSBhZGRFdmVudExpc3RlbmVyKHdpbmRvdywgJ2tleWRvd24nLCBvbktleURvd24sIGZhbHNlKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBSZXNvbHZlIGlmIGluIGlmcmFtZSBsb3N0IGV2ZW50XG5cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBpZiAod2luZG93LnRvcCAhPT0gd2luZG93LnNlbGYpIHtcbiAgICAgICAgb25Ub3BNb3VzZVVwTGlzdGVuZXIgPSBhZGRFdmVudExpc3RlbmVyKHdpbmRvdy50b3AsICdtb3VzZXVwJywgb25Nb3VzZVVwLCBmYWxzZSk7XG4gICAgICAgIG9uVG9wTW91c2VNb3ZlTGlzdGVuZXIgPSBhZGRFdmVudExpc3RlbmVyKHdpbmRvdy50b3AsICdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSwgZmFsc2UpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgd2FybmluZyhmYWxzZSwgXCJbcmMtaW1hZ2VdIFwiLmNvbmNhdChlcnJvcikpO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX29uVG9wTW91c2VVcExpc3RlbmVyLCBfb25Ub3BNb3VzZU1vdmVMaXN0ZW47XG5cbiAgICAgIG9uTW91c2VVcExpc3RlbmVyLnJlbW92ZSgpO1xuICAgICAgb25Nb3VzZU1vdmVMaXN0ZW5lci5yZW1vdmUoKTtcbiAgICAgIG9uS2V5RG93bkxpc3RlbmVyLnJlbW92ZSgpO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuICAgICAgKF9vblRvcE1vdXNlVXBMaXN0ZW5lciA9IG9uVG9wTW91c2VVcExpc3RlbmVyKSA9PT0gbnVsbCB8fCBfb25Ub3BNb3VzZVVwTGlzdGVuZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vblRvcE1vdXNlVXBMaXN0ZW5lci5yZW1vdmUoKTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cbiAgICAgIChfb25Ub3BNb3VzZU1vdmVMaXN0ZW4gPSBvblRvcE1vdXNlTW92ZUxpc3RlbmVyKSA9PT0gbnVsbCB8fCBfb25Ub3BNb3VzZU1vdmVMaXN0ZW4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vblRvcE1vdXNlTW92ZUxpc3Rlbi5yZW1vdmUoKTtcbiAgICB9O1xuICB9LCBbdmlzaWJsZSwgaXNNb3ZpbmcsIG9uS2V5RG93bl0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERpYWxvZywgX2V4dGVuZHMoe1xuICAgIHRyYW5zaXRpb25OYW1lOiB0cmFuc2l0aW9uTmFtZSxcbiAgICBtYXNrVHJhbnNpdGlvbk5hbWU6IG1hc2tUcmFuc2l0aW9uTmFtZSxcbiAgICBjbG9zYWJsZTogZmFsc2UsXG4gICAga2V5Ym9hcmQ6IHRydWUsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgb25DbG9zZTogb25DbG9zZSxcbiAgICBhZnRlckNsb3NlOiBvbkFmdGVyQ2xvc2UsXG4gICAgdmlzaWJsZTogdmlzaWJsZSxcbiAgICB3cmFwQ2xhc3NOYW1lOiB3cmFwQ2xhc3NOYW1lLFxuICAgIHJvb3RDbGFzc05hbWU6IHJvb3RDbGFzc05hbWUsXG4gICAgZ2V0Q29udGFpbmVyOiBnZXRDb250YWluZXJcbiAgfSwgcmVzdFByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbWctd3JhcHBlclwiKVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImltZ1wiLCB7XG4gICAgd2lkdGg6IHByb3BzLndpZHRoLFxuICAgIGhlaWdodDogcHJvcHMuaGVpZ2h0LFxuICAgIG9uV2hlZWw6IG9uV2hlZWwsXG4gICAgb25Nb3VzZURvd246IG9uTW91c2VEb3duLFxuICAgIG9uRG91YmxlQ2xpY2s6IG9uRG91YmxlQ2xpY2ssXG4gICAgcmVmOiBpbWdSZWYsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWltZ1wiKSxcbiAgICBzcmM6IGNvbWJpbmF0aW9uU3JjLFxuICAgIGFsdDogYWx0LFxuICAgIHN0eWxlOiB7XG4gICAgICB0cmFuc2Zvcm06IFwidHJhbnNsYXRlM2QoXCIuY29uY2F0KHRyYW5zZm9ybS54LCBcInB4LCBcIikuY29uY2F0KHRyYW5zZm9ybS55LCBcInB4LCAwKSBzY2FsZTNkKFwiKS5jb25jYXQoc2NhbGUsIFwiLCBcIikuY29uY2F0KHNjYWxlLCBcIiwgMSkgcm90YXRlKFwiKS5jb25jYXQocm90YXRlLCBcImRlZylcIilcbiAgICB9XG4gIH0pKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE9wZXJhdGlvbnMsIHtcbiAgICB2aXNpYmxlOiB2aXNpYmxlLFxuICAgIG1hc2tUcmFuc2l0aW9uTmFtZTogbWFza1RyYW5zaXRpb25OYW1lLFxuICAgIGdldENvbnRhaW5lcjogZ2V0Q29udGFpbmVyLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIHJvb3RDbGFzc05hbWU6IHJvb3RDbGFzc05hbWUsXG4gICAgaWNvbnM6IGljb25zLFxuICAgIGNvdW50UmVuZGVyOiBjb3VudFJlbmRlcixcbiAgICBzaG93U3dpdGNoOiBzaG93TGVmdE9yUmlnaHRTd2l0Y2hlcyxcbiAgICBzaG93UHJvZ3Jlc3M6IHNob3dPcGVyYXRpb25zUHJvZ3Jlc3MsXG4gICAgY3VycmVudDogY3VycmVudFByZXZpZXdJbmRleCxcbiAgICBjb3VudDogcHJldmlld0dyb3VwQ291bnQsXG4gICAgc2NhbGU6IHNjYWxlLFxuICAgIG9uU3dpdGNoTGVmdDogb25Td2l0Y2hMZWZ0LFxuICAgIG9uU3dpdGNoUmlnaHQ6IG9uU3dpdGNoUmlnaHQsXG4gICAgb25ab29tSW46IG9uWm9vbUluLFxuICAgIG9uWm9vbU91dDogb25ab29tT3V0LFxuICAgIG9uUm90YXRlUmlnaHQ6IG9uUm90YXRlUmlnaHQsXG4gICAgb25Sb3RhdGVMZWZ0OiBvblJvdGF0ZUxlZnQsXG4gICAgb25DbG9zZTogb25DbG9zZVxuICB9KSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBQcmV2aWV3OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wic3JjXCIsIFwiYWx0XCIsIFwib25QcmV2aWV3Q2xvc2VcIiwgXCJwcmVmaXhDbHNcIiwgXCJwcmV2aWV3UHJlZml4Q2xzXCIsIFwicGxhY2Vob2xkZXJcIiwgXCJmYWxsYmFja1wiLCBcIndpZHRoXCIsIFwiaGVpZ2h0XCIsIFwic3R5bGVcIiwgXCJwcmV2aWV3XCIsIFwiY2xhc3NOYW1lXCIsIFwib25DbGlja1wiLCBcIm9uRXJyb3JcIiwgXCJ3cmFwcGVyQ2xhc3NOYW1lXCIsIFwid3JhcHBlclN0eWxlXCIsIFwicm9vdENsYXNzTmFtZVwiLCBcImNyb3NzT3JpZ2luXCIsIFwiZGVjb2RpbmdcIiwgXCJsb2FkaW5nXCIsIFwicmVmZXJyZXJQb2xpY3lcIiwgXCJzaXplc1wiLCBcInNyY1NldFwiLCBcInVzZU1hcFwiLCBcImRyYWdnYWJsZVwiXSxcbiAgICBfZXhjbHVkZWQyID0gW1wic3JjXCIsIFwidmlzaWJsZVwiLCBcIm9uVmlzaWJsZUNoYW5nZVwiLCBcImdldENvbnRhaW5lclwiLCBcIm1hc2tcIiwgXCJtYXNrQ2xhc3NOYW1lXCIsIFwiaWNvbnNcIiwgXCJzY2FsZVN0ZXBcIl07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbiBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IGdldE9mZnNldCB9IGZyb20gXCJyYy11dGlsL2VzL0RvbS9jc3NcIjtcbmltcG9ydCB1c2VNZXJnZWRTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZXJnZWRTdGF0ZVwiO1xuaW1wb3J0IFByZXZpZXcgZnJvbSBcIi4vUHJldmlld1wiO1xuaW1wb3J0IFByZXZpZXdHcm91cCwgeyBjb250ZXh0IH0gZnJvbSBcIi4vUHJldmlld0dyb3VwXCI7XG52YXIgdXVpZCA9IDA7XG5cbnZhciBJbWFnZUludGVybmFsID0gZnVuY3Rpb24gSW1hZ2VJbnRlcm5hbChfcmVmKSB7XG4gIHZhciBfaW1nQ29tbW9uUHJvcHMkc3R5bGU7XG5cbiAgdmFyIGltZ1NyYyA9IF9yZWYuc3JjLFxuICAgICAgYWx0ID0gX3JlZi5hbHQsXG4gICAgICBvbkluaXRpYWxQcmV2aWV3Q2xvc2UgPSBfcmVmLm9uUHJldmlld0Nsb3NlLFxuICAgICAgX3JlZiRwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICAgIHByZWZpeENscyA9IF9yZWYkcHJlZml4Q2xzID09PSB2b2lkIDAgPyAncmMtaW1hZ2UnIDogX3JlZiRwcmVmaXhDbHMsXG4gICAgICBfcmVmJHByZXZpZXdQcmVmaXhDbHMgPSBfcmVmLnByZXZpZXdQcmVmaXhDbHMsXG4gICAgICBwcmV2aWV3UHJlZml4Q2xzID0gX3JlZiRwcmV2aWV3UHJlZml4Q2xzID09PSB2b2lkIDAgPyBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXByZXZpZXdcIikgOiBfcmVmJHByZXZpZXdQcmVmaXhDbHMsXG4gICAgICBwbGFjZWhvbGRlciA9IF9yZWYucGxhY2Vob2xkZXIsXG4gICAgICBmYWxsYmFjayA9IF9yZWYuZmFsbGJhY2ssXG4gICAgICB3aWR0aCA9IF9yZWYud2lkdGgsXG4gICAgICBoZWlnaHQgPSBfcmVmLmhlaWdodCxcbiAgICAgIHN0eWxlID0gX3JlZi5zdHlsZSxcbiAgICAgIF9yZWYkcHJldmlldyA9IF9yZWYucHJldmlldyxcbiAgICAgIHByZXZpZXcgPSBfcmVmJHByZXZpZXcgPT09IHZvaWQgMCA/IHRydWUgOiBfcmVmJHByZXZpZXcsXG4gICAgICBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICAgIG9uQ2xpY2sgPSBfcmVmLm9uQ2xpY2ssXG4gICAgICBvbkltYWdlRXJyb3IgPSBfcmVmLm9uRXJyb3IsXG4gICAgICB3cmFwcGVyQ2xhc3NOYW1lID0gX3JlZi53cmFwcGVyQ2xhc3NOYW1lLFxuICAgICAgd3JhcHBlclN0eWxlID0gX3JlZi53cmFwcGVyU3R5bGUsXG4gICAgICByb290Q2xhc3NOYW1lID0gX3JlZi5yb290Q2xhc3NOYW1lLFxuICAgICAgY3Jvc3NPcmlnaW4gPSBfcmVmLmNyb3NzT3JpZ2luLFxuICAgICAgZGVjb2RpbmcgPSBfcmVmLmRlY29kaW5nLFxuICAgICAgbG9hZGluZyA9IF9yZWYubG9hZGluZyxcbiAgICAgIHJlZmVycmVyUG9saWN5ID0gX3JlZi5yZWZlcnJlclBvbGljeSxcbiAgICAgIHNpemVzID0gX3JlZi5zaXplcyxcbiAgICAgIHNyY1NldCA9IF9yZWYuc3JjU2V0LFxuICAgICAgdXNlTWFwID0gX3JlZi51c2VNYXAsXG4gICAgICBkcmFnZ2FibGUgPSBfcmVmLmRyYWdnYWJsZSxcbiAgICAgIG90aGVyUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgX2V4Y2x1ZGVkKTtcblxuICB2YXIgaXNDdXN0b21QbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyICYmIHBsYWNlaG9sZGVyICE9PSB0cnVlO1xuXG4gIHZhciBfcmVmMiA9IF90eXBlb2YocHJldmlldykgPT09ICdvYmplY3QnID8gcHJldmlldyA6IHt9LFxuICAgICAgcHJldmlld1NyYyA9IF9yZWYyLnNyYyxcbiAgICAgIF9yZWYyJHZpc2libGUgPSBfcmVmMi52aXNpYmxlLFxuICAgICAgcHJldmlld1Zpc2libGUgPSBfcmVmMiR2aXNpYmxlID09PSB2b2lkIDAgPyB1bmRlZmluZWQgOiBfcmVmMiR2aXNpYmxlLFxuICAgICAgX3JlZjIkb25WaXNpYmxlQ2hhbmdlID0gX3JlZjIub25WaXNpYmxlQ2hhbmdlLFxuICAgICAgb25QcmV2aWV3VmlzaWJsZUNoYW5nZSA9IF9yZWYyJG9uVmlzaWJsZUNoYW5nZSA9PT0gdm9pZCAwID8gb25Jbml0aWFsUHJldmlld0Nsb3NlIDogX3JlZjIkb25WaXNpYmxlQ2hhbmdlLFxuICAgICAgX3JlZjIkZ2V0Q29udGFpbmVyID0gX3JlZjIuZ2V0Q29udGFpbmVyLFxuICAgICAgZ2V0UHJldmlld0NvbnRhaW5lciA9IF9yZWYyJGdldENvbnRhaW5lciA9PT0gdm9pZCAwID8gdW5kZWZpbmVkIDogX3JlZjIkZ2V0Q29udGFpbmVyLFxuICAgICAgcHJldmlld01hc2sgPSBfcmVmMi5tYXNrLFxuICAgICAgbWFza0NsYXNzTmFtZSA9IF9yZWYyLm1hc2tDbGFzc05hbWUsXG4gICAgICBpY29ucyA9IF9yZWYyLmljb25zLFxuICAgICAgc2NhbGVTdGVwID0gX3JlZjIuc2NhbGVTdGVwLFxuICAgICAgZGlhbG9nUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjIsIF9leGNsdWRlZDIpO1xuXG4gIHZhciBzcmMgPSBwcmV2aWV3U3JjICE9PSBudWxsICYmIHByZXZpZXdTcmMgIT09IHZvaWQgMCA/IHByZXZpZXdTcmMgOiBpbWdTcmM7XG4gIHZhciBpc0NvbnRyb2xsZWQgPSBwcmV2aWV3VmlzaWJsZSAhPT0gdW5kZWZpbmVkO1xuXG4gIHZhciBfdXNlTWVyZ2VkU3RhdGUgPSB1c2VNZXJnZWRTdGF0ZSghIXByZXZpZXdWaXNpYmxlLCB7XG4gICAgdmFsdWU6IHByZXZpZXdWaXNpYmxlLFxuICAgIG9uQ2hhbmdlOiBvblByZXZpZXdWaXNpYmxlQ2hhbmdlXG4gIH0pLFxuICAgICAgX3VzZU1lcmdlZFN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZSwgMiksXG4gICAgICBpc1Nob3dQcmV2aWV3ID0gX3VzZU1lcmdlZFN0YXRlMlswXSxcbiAgICAgIHNldFNob3dQcmV2aWV3ID0gX3VzZU1lcmdlZFN0YXRlMlsxXTtcblxuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoaXNDdXN0b21QbGFjZWhvbGRlciA/ICdsb2FkaW5nJyA6ICdub3JtYWwnKSxcbiAgICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgICAgc3RhdHVzID0gX3VzZVN0YXRlMlswXSxcbiAgICAgIHNldFN0YXR1cyA9IF91c2VTdGF0ZTJbMV07XG5cbiAgdmFyIF91c2VTdGF0ZTMgPSB1c2VTdGF0ZShudWxsKSxcbiAgICAgIF91c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUzLCAyKSxcbiAgICAgIG1vdXNlUG9zaXRpb24gPSBfdXNlU3RhdGU0WzBdLFxuICAgICAgc2V0TW91c2VQb3NpdGlvbiA9IF91c2VTdGF0ZTRbMV07XG5cbiAgdmFyIGlzRXJyb3IgPSBzdGF0dXMgPT09ICdlcnJvcic7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChjb250ZXh0KSxcbiAgICAgIGlzUHJldmlld0dyb3VwID0gX1JlYWN0JHVzZUNvbnRleHQuaXNQcmV2aWV3R3JvdXAsXG4gICAgICBzZXRDdXJyZW50ID0gX1JlYWN0JHVzZUNvbnRleHQuc2V0Q3VycmVudCxcbiAgICAgIHNldEdyb3VwU2hvd1ByZXZpZXcgPSBfUmVhY3QkdXNlQ29udGV4dC5zZXRTaG93UHJldmlldyxcbiAgICAgIHNldEdyb3VwTW91c2VQb3NpdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LnNldE1vdXNlUG9zaXRpb24sXG4gICAgICByZWdpc3RlckltYWdlID0gX1JlYWN0JHVzZUNvbnRleHQucmVnaXN0ZXJJbWFnZTtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZnVuY3Rpb24gKCkge1xuICAgIHV1aWQgKz0gMTtcbiAgICByZXR1cm4gdXVpZDtcbiAgfSksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAxKSxcbiAgICAgIGN1cnJlbnRJZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMF07XG5cbiAgdmFyIGNhblByZXZpZXcgPSAhIXByZXZpZXc7XG4gIHZhciBpc0xvYWRlZCA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG5cbiAgdmFyIG9uTG9hZCA9IGZ1bmN0aW9uIG9uTG9hZCgpIHtcbiAgICBzZXRTdGF0dXMoJ25vcm1hbCcpO1xuICB9O1xuXG4gIHZhciBvbkVycm9yID0gZnVuY3Rpb24gb25FcnJvcihlKSB7XG4gICAgaWYgKG9uSW1hZ2VFcnJvcikge1xuICAgICAgb25JbWFnZUVycm9yKGUpO1xuICAgIH1cblxuICAgIHNldFN0YXR1cygnZXJyb3InKTtcbiAgfTtcblxuICB2YXIgb25QcmV2aWV3ID0gZnVuY3Rpb24gb25QcmV2aWV3KGUpIHtcbiAgICBpZiAoIWlzQ29udHJvbGxlZCkge1xuICAgICAgdmFyIF9nZXRPZmZzZXQgPSBnZXRPZmZzZXQoZS50YXJnZXQpLFxuICAgICAgICAgIGxlZnQgPSBfZ2V0T2Zmc2V0LmxlZnQsXG4gICAgICAgICAgdG9wID0gX2dldE9mZnNldC50b3A7XG5cbiAgICAgIGlmIChpc1ByZXZpZXdHcm91cCkge1xuICAgICAgICBzZXRDdXJyZW50KGN1cnJlbnRJZCk7XG4gICAgICAgIHNldEdyb3VwTW91c2VQb3NpdGlvbih7XG4gICAgICAgICAgeDogbGVmdCxcbiAgICAgICAgICB5OiB0b3BcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRNb3VzZVBvc2l0aW9uKHtcbiAgICAgICAgICB4OiBsZWZ0LFxuICAgICAgICAgIHk6IHRvcFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNQcmV2aWV3R3JvdXApIHtcbiAgICAgIHNldEdyb3VwU2hvd1ByZXZpZXcodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFNob3dQcmV2aWV3KHRydWUpO1xuICAgIH1cblxuICAgIGlmIChvbkNsaWNrKSBvbkNsaWNrKGUpO1xuICB9O1xuXG4gIHZhciBvblByZXZpZXdDbG9zZSA9IGZ1bmN0aW9uIG9uUHJldmlld0Nsb3NlKGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHNldFNob3dQcmV2aWV3KGZhbHNlKTtcblxuICAgIGlmICghaXNDb250cm9sbGVkKSB7XG4gICAgICBzZXRNb3VzZVBvc2l0aW9uKG51bGwpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgZ2V0SW1nUmVmID0gZnVuY3Rpb24gZ2V0SW1nUmVmKGltZykge1xuICAgIGlzTG9hZGVkLmN1cnJlbnQgPSBmYWxzZTtcbiAgICBpZiAoc3RhdHVzICE9PSAnbG9hZGluZycpIHJldHVybjtcblxuICAgIGlmIChpbWcgIT09IG51bGwgJiYgaW1nICE9PSB2b2lkIDAgJiYgaW1nLmNvbXBsZXRlICYmIChpbWcubmF0dXJhbFdpZHRoIHx8IGltZy5uYXR1cmFsSGVpZ2h0KSkge1xuICAgICAgaXNMb2FkZWQuY3VycmVudCA9IHRydWU7XG4gICAgICBvbkxvYWQoKTtcbiAgICB9XG4gIH07IC8vIEtlZXAgb3JkZXIgc3RhcnRcbiAgLy8gUmVzb2x2ZSBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8yODg4MVxuICAvLyBPbmx5IG5lZWQgdW5SZWdpc3RlciB3aGVuIGNvbXBvbmVudCB1bk1vdW50XG5cblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciB1blJlZ2lzdGVyID0gcmVnaXN0ZXJJbWFnZShjdXJyZW50SWQsIHNyYyk7XG4gICAgcmV0dXJuIHVuUmVnaXN0ZXI7XG4gIH0sIFtdKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZWdpc3RlckltYWdlKGN1cnJlbnRJZCwgc3JjLCBjYW5QcmV2aWV3KTtcbiAgfSwgW3NyYywgY2FuUHJldmlld10pOyAvLyBLZWVwIG9yZGVyIGVuZFxuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGlzRXJyb3IpIHtcbiAgICAgIHNldFN0YXR1cygnbm9ybWFsJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzQ3VzdG9tUGxhY2Vob2xkZXIgJiYgIWlzTG9hZGVkLmN1cnJlbnQpIHtcbiAgICAgIHNldFN0YXR1cygnbG9hZGluZycpO1xuICAgIH1cbiAgfSwgW2ltZ1NyY10pO1xuICB2YXIgd3JhcHBlckNsYXNzID0gY24ocHJlZml4Q2xzLCB3cmFwcGVyQ2xhc3NOYW1lLCByb290Q2xhc3NOYW1lLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZXJyb3JcIiksIGlzRXJyb3IpKTtcbiAgdmFyIG1lcmdlZFNyYyA9IGlzRXJyb3IgJiYgZmFsbGJhY2sgPyBmYWxsYmFjayA6IHNyYztcbiAgdmFyIGltZ0NvbW1vblByb3BzID0ge1xuICAgIGNyb3NzT3JpZ2luOiBjcm9zc09yaWdpbixcbiAgICBkZWNvZGluZzogZGVjb2RpbmcsXG4gICAgZHJhZ2dhYmxlOiBkcmFnZ2FibGUsXG4gICAgbG9hZGluZzogbG9hZGluZyxcbiAgICByZWZlcnJlclBvbGljeTogcmVmZXJyZXJQb2xpY3ksXG4gICAgc2l6ZXM6IHNpemVzLFxuICAgIHNyY1NldDogc3JjU2V0LFxuICAgIHVzZU1hcDogdXNlTWFwLFxuICAgIGFsdDogYWx0LFxuICAgIGNsYXNzTmFtZTogY24oXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbWdcIiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbWctcGxhY2Vob2xkZXJcIiksIHBsYWNlaG9sZGVyID09PSB0cnVlKSwgY2xhc3NOYW1lKSxcbiAgICBzdHlsZTogX29iamVjdFNwcmVhZCh7XG4gICAgICBoZWlnaHQ6IGhlaWdodFxuICAgIH0sIHN0eWxlKVxuICB9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHt9LCBvdGhlclByb3BzLCB7XG4gICAgY2xhc3NOYW1lOiB3cmFwcGVyQ2xhc3MsXG4gICAgb25DbGljazogY2FuUHJldmlldyA/IG9uUHJldmlldyA6IG9uQ2xpY2ssXG4gICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoe1xuICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICB9LCB3cmFwcGVyU3R5bGUpXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImltZ1wiLCBfZXh0ZW5kcyh7fSwgaW1nQ29tbW9uUHJvcHMsIHtcbiAgICByZWY6IGdldEltZ1JlZlxuICB9LCBpc0Vycm9yICYmIGZhbGxiYWNrID8ge1xuICAgIHNyYzogZmFsbGJhY2tcbiAgfSA6IHtcbiAgICBvbkxvYWQ6IG9uTG9hZCxcbiAgICBvbkVycm9yOiBvbkVycm9yLFxuICAgIHNyYzogaW1nU3JjXG4gIH0sIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfSkpLCBzdGF0dXMgPT09ICdsb2FkaW5nJyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIixcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGxhY2Vob2xkZXJcIilcbiAgfSwgcGxhY2Vob2xkZXIpLCBwcmV2aWV3TWFzayAmJiBjYW5QcmV2aWV3ICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNuKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbWFza1wiKSwgbWFza0NsYXNzTmFtZSksXG4gICAgc3R5bGU6IHtcbiAgICAgIGRpc3BsYXk6ICgoX2ltZ0NvbW1vblByb3BzJHN0eWxlID0gaW1nQ29tbW9uUHJvcHMuc3R5bGUpID09PSBudWxsIHx8IF9pbWdDb21tb25Qcm9wcyRzdHlsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ltZ0NvbW1vblByb3BzJHN0eWxlLmRpc3BsYXkpID09PSAnbm9uZScgPyAnbm9uZScgOiB1bmRlZmluZWRcbiAgICB9XG4gIH0sIHByZXZpZXdNYXNrKSksICFpc1ByZXZpZXdHcm91cCAmJiBjYW5QcmV2aWV3ICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFByZXZpZXcsIF9leHRlbmRzKHtcbiAgICBcImFyaWEtaGlkZGVuXCI6ICFpc1Nob3dQcmV2aWV3LFxuICAgIHZpc2libGU6IGlzU2hvd1ByZXZpZXcsXG4gICAgcHJlZml4Q2xzOiBwcmV2aWV3UHJlZml4Q2xzLFxuICAgIG9uQ2xvc2U6IG9uUHJldmlld0Nsb3NlLFxuICAgIG1vdXNlUG9zaXRpb246IG1vdXNlUG9zaXRpb24sXG4gICAgc3JjOiBtZXJnZWRTcmMsXG4gICAgYWx0OiBhbHQsXG4gICAgZ2V0Q29udGFpbmVyOiBnZXRQcmV2aWV3Q29udGFpbmVyLFxuICAgIGljb25zOiBpY29ucyxcbiAgICBzY2FsZVN0ZXA6IHNjYWxlU3RlcCxcbiAgICByb290Q2xhc3NOYW1lOiByb290Q2xhc3NOYW1lXG4gIH0sIGRpYWxvZ1Byb3BzKSkpO1xufTtcblxuSW1hZ2VJbnRlcm5hbC5QcmV2aWV3R3JvdXAgPSBQcmV2aWV3R3JvdXA7XG5JbWFnZUludGVybmFsLmRpc3BsYXlOYW1lID0gJ0ltYWdlJztcbmV4cG9ydCBkZWZhdWx0IEltYWdlSW50ZXJuYWw7IiwiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgUm90YXRlTGVmdE91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcImRlZnNcIiwgXCJhdHRyc1wiOiB7fSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInN0eWxlXCIsIFwiYXR0cnNcIjoge30gfV0gfSwgeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk02NzIgNDE4SDE0NGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ2NDE0YzAgMTcuNyAxNC4zIDMyIDMyIDMyaDUyOGMxNy43IDAgMzItMTQuMyAzMi0zMlY0NTBjMC0xNy43LTE0LjMtMzItMzItMzJ6bS00NCA0MDJIMTg4VjQ5NGg0NDB2MzI2elwiIH0gfSwgeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk04MTkuMyAzMjguNWMtNzguOC0xMDAuNy0xOTYtMTUzLjYtMzE0LjYtMTU0LjJsLS4yLTY0YzAtNi41LTcuNi0xMC4xLTEyLjYtNi4xbC0xMjggMTAxYy00IDMuMS0zLjkgOS4xIDAgMTIuM0w0OTIgMzE4LjZjNS4xIDQgMTIuNy40IDEyLjYtNi4xdi02My45YzEyLjkuMSAyNS45LjkgMzguOCAyLjUgNDIuMSA1LjIgODIuMSAxOC4yIDExOSAzOC43IDM4LjEgMjEuMiA3MS4yIDQ5LjcgOTguNCA4NC4zIDI3LjEgMzQuNyA0Ni43IDczLjcgNTguMSAxMTUuOGEzMjUuOTUgMzI1Ljk1IDAgMDE2LjUgMTQwLjloNzQuOWMxNC44LTEwMy42LTExLjMtMjEzLTgxLTMwMi4zelwiIH0gfV0gfSwgXCJuYW1lXCI6IFwicm90YXRlLWxlZnRcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IFJvdGF0ZUxlZnRPdXRsaW5lZDtcbiIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJvdGF0ZUxlZnRPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Sb3RhdGVMZWZ0T3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tICcuLi9jb21wb25lbnRzL0FudGRJY29uJztcbnZhciBSb3RhdGVMZWZ0T3V0bGluZWQgPSBmdW5jdGlvbiBSb3RhdGVMZWZ0T3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IFJvdGF0ZUxlZnRPdXRsaW5lZFN2Z1xuICB9KSk7XG59O1xuUm90YXRlTGVmdE91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ1JvdGF0ZUxlZnRPdXRsaW5lZCc7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihSb3RhdGVMZWZ0T3V0bGluZWQpOyIsIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIFJvdGF0ZVJpZ2h0T3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwiZGVmc1wiLCBcImF0dHJzXCI6IHt9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwic3R5bGVcIiwgXCJhdHRyc1wiOiB7fSB9XSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTQ4MC41IDI1MS4yYzEzLTEuNiAyNS45LTIuNCAzOC44LTIuNXY2My45YzAgNi41IDcuNSAxMC4xIDEyLjYgNi4xTDY2MCAyMTcuNmM0LTMuMiA0LTkuMiAwLTEyLjNsLTEyOC0xMDFjLTUuMS00LTEyLjYtLjQtMTIuNiA2LjFsLS4yIDY0Yy0xMTguNi41LTIzNS44IDUzLjQtMzE0LjYgMTU0LjJBMzk5Ljc1IDM5OS43NSAwIDAwMTIzLjUgNjMxaDc0LjljLS45LTUuMy0xLjctMTAuNy0yLjQtMTYuMS01LjEtNDIuMS0yLjEtODQuMSA4LjktMTI0LjggMTEuNC00Mi4yIDMxLTgxLjEgNTguMS0xMTUuOCAyNy4yLTM0LjcgNjAuMy02My4yIDk4LjQtODQuMyAzNy0yMC42IDc2LjktMzMuNiAxMTkuMS0zOC44elwiIH0gfSwgeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk04ODAgNDE4SDM1MmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ2NDE0YzAgMTcuNyAxNC4zIDMyIDMyIDMyaDUyOGMxNy43IDAgMzItMTQuMyAzMi0zMlY0NTBjMC0xNy43LTE0LjMtMzItMzItMzJ6bS00NCA0MDJIMzk2VjQ5NGg0NDB2MzI2elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwicm90YXRlLXJpZ2h0XCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnQgZGVmYXVsdCBSb3RhdGVSaWdodE91dGxpbmVkO1xuIiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUm90YXRlUmlnaHRPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Sb3RhdGVSaWdodE91dGxpbmVkXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSAnLi4vY29tcG9uZW50cy9BbnRkSWNvbic7XG52YXIgUm90YXRlUmlnaHRPdXRsaW5lZCA9IGZ1bmN0aW9uIFJvdGF0ZVJpZ2h0T3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IFJvdGF0ZVJpZ2h0T3V0bGluZWRTdmdcbiAgfSkpO1xufTtcblJvdGF0ZVJpZ2h0T3V0bGluZWQuZGlzcGxheU5hbWUgPSAnUm90YXRlUmlnaHRPdXRsaW5lZCc7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihSb3RhdGVSaWdodE91dGxpbmVkKTsiLCIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBab29tSW5PdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNjM3IDQ0M0g1MTlWMzA5YzAtNC40LTMuNi04LTgtOGgtNjBjLTQuNCAwLTggMy42LTggOHYxMzRIMzI1Yy00LjQgMC04IDMuNi04IDh2NjBjMCA0LjQgMy42IDggOCA4aDExOHYxMzRjMCA0LjQgMy42IDggOCA4aDYwYzQuNCAwIDgtMy42IDgtOFY1MTloMTE4YzQuNCAwIDgtMy42IDgtOHYtNjBjMC00LjQtMy42LTgtOC04em0yODQgNDI0TDc3NSA3MjFjMTIyLjEtMTQ4LjkgMTEzLjYtMzY5LjUtMjYtNTA5LTE0OC0xNDguMS0zODguNC0xNDguMS01MzcgMC0xNDguMSAxNDguNi0xNDguMSAzODkgMCA1MzcgMTM5LjUgMTM5LjYgMzYwLjEgMTQ4LjEgNTA5IDI2bDE0NiAxNDZjMy4yIDIuOCA4LjMgMi44IDExIDBsNDMtNDNjMi44LTIuNyAyLjgtNy44IDAtMTF6TTY5NiA2OTZjLTExOC44IDExOC43LTMxMS4yIDExOC43LTQzMCAwLTExOC43LTExOC44LTExOC43LTMxMS4yIDAtNDMwIDExOC44LTExOC43IDMxMS4yLTExOC43IDQzMCAwIDExOC43IDExOC44IDExOC43IDMxMS4yIDAgNDMwelwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiem9vbS1pblwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgWm9vbUluT3V0bGluZWQ7XG4iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBab29tSW5PdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9ab29tSW5PdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIFpvb21Jbk91dGxpbmVkID0gZnVuY3Rpb24gWm9vbUluT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IFpvb21Jbk91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5ab29tSW5PdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdab29tSW5PdXRsaW5lZCc7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihab29tSW5PdXRsaW5lZCk7IiwiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgWm9vbU91dE91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk02MzcgNDQzSDMyNWMtNC40IDAtOCAzLjYtOCA4djYwYzAgNC40IDMuNiA4IDggOGgzMTJjNC40IDAgOC0zLjYgOC04di02MGMwLTQuNC0zLjYtOC04LTh6bTI4NCA0MjRMNzc1IDcyMWMxMjIuMS0xNDguOSAxMTMuNi0zNjkuNS0yNi01MDktMTQ4LTE0OC4xLTM4OC40LTE0OC4xLTUzNyAwLTE0OC4xIDE0OC42LTE0OC4xIDM4OSAwIDUzNyAxMzkuNSAxMzkuNiAzNjAuMSAxNDguMSA1MDkgMjZsMTQ2IDE0NmMzLjIgMi44IDguMyAyLjggMTEgMGw0My00M2MyLjgtMi43IDIuOC03LjggMC0xMXpNNjk2IDY5NmMtMTE4LjggMTE4LjctMzExLjIgMTE4LjctNDMwIDAtMTE4LjctMTE4LjgtMTE4LjctMzExLjIgMC00MzAgMTE4LjgtMTE4LjcgMzExLjItMTE4LjcgNDMwIDAgMTE4LjcgMTE4LjggMTE4LjcgMzExLjIgMCA0MzB6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJ6b29tLW91dFwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgWm9vbU91dE91dGxpbmVkO1xuIiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgWm9vbU91dE91dGxpbmVkU3ZnIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1pvb21PdXRPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIFpvb21PdXRPdXRsaW5lZCA9IGZ1bmN0aW9uIFpvb21PdXRPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogWm9vbU91dE91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5ab29tT3V0T3V0bGluZWQuZGlzcGxheU5hbWUgPSAnWm9vbU91dE91dGxpbmVkJztcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKFpvb21PdXRPdXRsaW5lZCk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IENsb3NlT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Nsb3NlT3V0bGluZWRcIjtcbmltcG9ydCBMZWZ0T3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0xlZnRPdXRsaW5lZFwiO1xuaW1wb3J0IFJpZ2h0T3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1JpZ2h0T3V0bGluZWRcIjtcbmltcG9ydCBSb3RhdGVMZWZ0T3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1JvdGF0ZUxlZnRPdXRsaW5lZFwiO1xuaW1wb3J0IFJvdGF0ZVJpZ2h0T3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1JvdGF0ZVJpZ2h0T3V0bGluZWRcIjtcbmltcG9ydCBab29tSW5PdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvWm9vbUluT3V0bGluZWRcIjtcbmltcG9ydCBab29tT3V0T3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1pvb21PdXRPdXRsaW5lZFwiO1xuaW1wb3J0IFJjSW1hZ2UgZnJvbSAncmMtaW1hZ2UnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgeyBnZXRUcmFuc2l0aW9uTmFtZSB9IGZyb20gJy4uL191dGlsL21vdGlvbic7XG5leHBvcnQgdmFyIGljb25zID0ge1xuICByb3RhdGVMZWZ0OiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSb3RhdGVMZWZ0T3V0bGluZWQsIG51bGwpLFxuICByb3RhdGVSaWdodDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUm90YXRlUmlnaHRPdXRsaW5lZCwgbnVsbCksXG4gIHpvb21JbjogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoWm9vbUluT3V0bGluZWQsIG51bGwpLFxuICB6b29tT3V0OiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChab29tT3V0T3V0bGluZWQsIG51bGwpLFxuICBjbG9zZTogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2xvc2VPdXRsaW5lZCwgbnVsbCksXG4gIGxlZnQ6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExlZnRPdXRsaW5lZCwgbnVsbCksXG4gIHJpZ2h0OiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSaWdodE91dGxpbmVkLCBudWxsKVxufTtcbnZhciBJbnRlcm5hbFByZXZpZXdHcm91cCA9IGZ1bmN0aW9uIEludGVybmFsUHJldmlld0dyb3VwKF9hKSB7XG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBfYS5wcmV2aWV3UHJlZml4Q2xzLFxuICAgIHByZXZpZXcgPSBfYS5wcmV2aWV3LFxuICAgIHByb3BzID0gX19yZXN0KF9hLCBbXCJwcmV2aWV3UHJlZml4Q2xzXCIsIFwicHJldmlld1wiXSk7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCksXG4gICAgZ2V0UHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UHJlZml4Q2xzO1xuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdpbWFnZS1wcmV2aWV3JywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIHJvb3RQcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoKTtcbiAgdmFyIG1lcmdlZFByZXZpZXcgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocHJldmlldyA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBwcmV2aWV3O1xuICAgIH1cbiAgICB2YXIgX3ByZXZpZXcgPSBfdHlwZW9mKHByZXZpZXcpID09PSAnb2JqZWN0JyA/IHByZXZpZXcgOiB7fTtcbiAgICByZXR1cm4gX2V4dGVuZHMoX2V4dGVuZHMoe30sIF9wcmV2aWV3KSwge1xuICAgICAgdHJhbnNpdGlvbk5hbWU6IGdldFRyYW5zaXRpb25OYW1lKHJvb3RQcmVmaXhDbHMsICd6b29tJywgX3ByZXZpZXcudHJhbnNpdGlvbk5hbWUpLFxuICAgICAgbWFza1RyYW5zaXRpb25OYW1lOiBnZXRUcmFuc2l0aW9uTmFtZShyb290UHJlZml4Q2xzLCAnZmFkZScsIF9wcmV2aWV3Lm1hc2tUcmFuc2l0aW9uTmFtZSlcbiAgICB9KTtcbiAgfSwgW3ByZXZpZXddKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJjSW1hZ2UuUHJldmlld0dyb3VwLCBfZXh0ZW5kcyh7XG4gICAgcHJldmlldzogbWVyZ2VkUHJldmlldyxcbiAgICBwcmV2aWV3UHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgaWNvbnM6IGljb25zXG4gIH0sIHByb3BzKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgSW50ZXJuYWxQcmV2aWV3R3JvdXA7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IEV5ZU91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9FeWVPdXRsaW5lZFwiO1xuaW1wb3J0IFJjSW1hZ2UgZnJvbSAncmMtaW1hZ2UnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IGRlZmF1bHRMb2NhbGUgZnJvbSAnLi4vbG9jYWxlL2VuX1VTJztcbmltcG9ydCB7IGdldFRyYW5zaXRpb25OYW1lIH0gZnJvbSAnLi4vX3V0aWwvbW90aW9uJztcbmltcG9ydCBQcmV2aWV3R3JvdXAsIHsgaWNvbnMgfSBmcm9tICcuL1ByZXZpZXdHcm91cCc7XG52YXIgSW1hZ2UgPSBmdW5jdGlvbiBJbWFnZShfYSkge1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gX2EucHJlZml4Q2xzLFxuICAgIHByZXZpZXcgPSBfYS5wcmV2aWV3LFxuICAgIG90aGVyUHJvcHMgPSBfX3Jlc3QoX2EsIFtcInByZWZpeENsc1wiLCBcInByZXZpZXdcIl0pO1xuICB2YXIgX3VzZUNvbnRleHQgPSB1c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF91c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICBfdXNlQ29udGV4dCRsb2NhbGUgPSBfdXNlQ29udGV4dC5sb2NhbGUsXG4gICAgY29udGV4dExvY2FsZSA9IF91c2VDb250ZXh0JGxvY2FsZSA9PT0gdm9pZCAwID8gZGVmYXVsdExvY2FsZSA6IF91c2VDb250ZXh0JGxvY2FsZSxcbiAgICBnZXRDb250ZXh0UG9wdXBDb250YWluZXIgPSBfdXNlQ29udGV4dC5nZXRQb3B1cENvbnRhaW5lcjtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnaW1hZ2UnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgcm9vdFByZWZpeENscyA9IGdldFByZWZpeENscygpO1xuICB2YXIgaW1hZ2VMb2NhbGUgPSBjb250ZXh0TG9jYWxlLkltYWdlIHx8IGRlZmF1bHRMb2NhbGUuSW1hZ2U7XG4gIHZhciBtZXJnZWRQcmV2aWV3ID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHByZXZpZXcgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gcHJldmlldztcbiAgICB9XG4gICAgdmFyIF9wcmV2aWV3ID0gX3R5cGVvZihwcmV2aWV3KSA9PT0gJ29iamVjdCcgPyBwcmV2aWV3IDoge307XG4gICAgdmFyIGdldENvbnRhaW5lciA9IF9wcmV2aWV3LmdldENvbnRhaW5lcixcbiAgICAgIHJlc3RQcmV2aWV3UHJvcHMgPSBfX3Jlc3QoX3ByZXZpZXcsIFtcImdldENvbnRhaW5lclwiXSk7XG4gICAgcmV0dXJuIF9leHRlbmRzKF9leHRlbmRzKHtcbiAgICAgIG1hc2s6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1hc2staW5mb1wiKVxuICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRXllT3V0bGluZWQsIG51bGwpLCBpbWFnZUxvY2FsZSA9PT0gbnVsbCB8fCBpbWFnZUxvY2FsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogaW1hZ2VMb2NhbGUucHJldmlldyksXG4gICAgICBpY29uczogaWNvbnNcbiAgICB9LCByZXN0UHJldmlld1Byb3BzKSwge1xuICAgICAgZ2V0Q29udGFpbmVyOiBnZXRDb250YWluZXIgfHwgZ2V0Q29udGV4dFBvcHVwQ29udGFpbmVyLFxuICAgICAgdHJhbnNpdGlvbk5hbWU6IGdldFRyYW5zaXRpb25OYW1lKHJvb3RQcmVmaXhDbHMsICd6b29tJywgX3ByZXZpZXcudHJhbnNpdGlvbk5hbWUpLFxuICAgICAgbWFza1RyYW5zaXRpb25OYW1lOiBnZXRUcmFuc2l0aW9uTmFtZShyb290UHJlZml4Q2xzLCAnZmFkZScsIF9wcmV2aWV3Lm1hc2tUcmFuc2l0aW9uTmFtZSlcbiAgICB9KTtcbiAgfSwgW3ByZXZpZXcsIGltYWdlTG9jYWxlXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSY0ltYWdlLCBfZXh0ZW5kcyh7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgcHJldmlldzogbWVyZ2VkUHJldmlld1xuICB9LCBvdGhlclByb3BzKSk7XG59O1xuSW1hZ2UuUHJldmlld0dyb3VwID0gUHJldmlld0dyb3VwO1xuZXhwb3J0IGRlZmF1bHQgSW1hZ2U7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250ZXh0LCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgeyBGb3JtSXRlbUlucHV0Q29udGV4dCB9IGZyb20gJy4uL2Zvcm0vY29udGV4dCc7XG52YXIgR3JvdXAgPSBmdW5jdGlvbiBHcm91cChwcm9wcykge1xuICB2YXIgX2NsYXNzTmFtZXM7XG4gIHZhciBfdXNlQ29udGV4dCA9IHVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCksXG4gICAgZ2V0UHJlZml4Q2xzID0gX3VzZUNvbnRleHQuZ2V0UHJlZml4Q2xzLFxuICAgIGRpcmVjdGlvbiA9IF91c2VDb250ZXh0LmRpcmVjdGlvbjtcbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBfcHJvcHMkY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIGNsYXNzTmFtZSA9IF9wcm9wcyRjbGFzc05hbWUgPT09IHZvaWQgMCA/ICcnIDogX3Byb3BzJGNsYXNzTmFtZTtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnaW5wdXQtZ3JvdXAnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgY2xzID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbGdcIiksIHByb3BzLnNpemUgPT09ICdsYXJnZScpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc21cIiksIHByb3BzLnNpemUgPT09ICdzbWFsbCcpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29tcGFjdFwiKSwgcHJvcHMuY29tcGFjdCksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBfY2xhc3NOYW1lcyksIGNsYXNzTmFtZSk7XG4gIHZhciBmb3JtSXRlbUNvbnRleHQgPSB1c2VDb250ZXh0KEZvcm1JdGVtSW5wdXRDb250ZXh0KTtcbiAgdmFyIGdyb3VwRm9ybUl0ZW1Db250ZXh0ID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9leHRlbmRzKF9leHRlbmRzKHt9LCBmb3JtSXRlbUNvbnRleHQpLCB7XG4gICAgICBpc0Zvcm1JdGVtSW5wdXQ6IGZhbHNlXG4gICAgfSk7XG4gIH0sIFtmb3JtSXRlbUNvbnRleHRdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbHMsXG4gICAgc3R5bGU6IHByb3BzLnN0eWxlLFxuICAgIG9uTW91c2VFbnRlcjogcHJvcHMub25Nb3VzZUVudGVyLFxuICAgIG9uTW91c2VMZWF2ZTogcHJvcHMub25Nb3VzZUxlYXZlLFxuICAgIG9uRm9jdXM6IHByb3BzLm9uRm9jdXMsXG4gICAgb25CbHVyOiBwcm9wcy5vbkJsdXJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRm9ybUl0ZW1JbnB1dENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogZ3JvdXBGb3JtSXRlbUNvbnRleHRcbiAgfSwgcHJvcHMuY2hpbGRyZW4pKTtcbn07XG5leHBvcnQgZGVmYXVsdCBHcm91cDsiLCJleHBvcnQgZnVuY3Rpb24gaGFzQWRkb24ocHJvcHMpIHtcbiAgcmV0dXJuICEhKHByb3BzLmFkZG9uQmVmb3JlIHx8IHByb3BzLmFkZG9uQWZ0ZXIpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhhc1ByZWZpeFN1ZmZpeChwcm9wcykge1xuICByZXR1cm4gISEocHJvcHMucHJlZml4IHx8IHByb3BzLnN1ZmZpeCB8fCBwcm9wcy5hbGxvd0NsZWFyKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlT25DaGFuZ2UodGFyZ2V0LCBlLCBvbkNoYW5nZSwgdGFyZ2V0VmFsdWUpIHtcbiAgaWYgKCFvbkNoYW5nZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBldmVudCA9IGU7XG5cbiAgaWYgKGUudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgIC8vIENsb25lIGEgbmV3IHRhcmdldCBmb3IgZXZlbnQuXG4gICAgLy8gQXZvaWQgdGhlIGZvbGxvd2luZyB1c2FnZSwgdGhlIHNldFF1ZXJ5IG1ldGhvZCBnZXRzIHRoZSBvcmlnaW5hbCB2YWx1ZS5cbiAgICAvL1xuICAgIC8vIGNvbnN0IFtxdWVyeSwgc2V0UXVlcnldID0gUmVhY3QudXNlU3RhdGUoJycpO1xuICAgIC8vIDxJbnB1dFxuICAgIC8vICAgYWxsb3dDbGVhclxuICAgIC8vICAgdmFsdWU9e3F1ZXJ5fVxuICAgIC8vICAgb25DaGFuZ2U9eyhlKT0+IHtcbiAgICAvLyAgICAgc2V0UXVlcnkoKHByZXZTdGF0dXMpID0+IGUudGFyZ2V0LnZhbHVlKTtcbiAgICAvLyAgIH19XG4gICAgLy8gLz5cbiAgICB2YXIgY3VycmVudFRhcmdldCA9IHRhcmdldC5jbG9uZU5vZGUodHJ1ZSk7IC8vIGNsaWNrIGNsZWFyIGljb25cblxuICAgIGV2ZW50ID0gT2JqZWN0LmNyZWF0ZShlLCB7XG4gICAgICB0YXJnZXQ6IHtcbiAgICAgICAgdmFsdWU6IGN1cnJlbnRUYXJnZXRcbiAgICAgIH0sXG4gICAgICBjdXJyZW50VGFyZ2V0OiB7XG4gICAgICAgIHZhbHVlOiBjdXJyZW50VGFyZ2V0XG4gICAgICB9XG4gICAgfSk7XG4gICAgY3VycmVudFRhcmdldC52YWx1ZSA9ICcnO1xuICAgIG9uQ2hhbmdlKGV2ZW50KTtcbiAgICByZXR1cm47XG4gIH0gLy8gVHJpZ2dlciBieSBjb21wb3NpdGlvbiBldmVudCwgdGhpcyBtZWFucyB3ZSBuZWVkIGZvcmNlIGNoYW5nZSB0aGUgaW5wdXQgdmFsdWVcblxuXG4gIGlmICh0YXJnZXRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZXZlbnQgPSBPYmplY3QuY3JlYXRlKGUsIHtcbiAgICAgIHRhcmdldDoge1xuICAgICAgICB2YWx1ZTogdGFyZ2V0XG4gICAgICB9LFxuICAgICAgY3VycmVudFRhcmdldDoge1xuICAgICAgICB2YWx1ZTogdGFyZ2V0XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGFyZ2V0LnZhbHVlID0gdGFyZ2V0VmFsdWU7XG4gICAgb25DaGFuZ2UoZXZlbnQpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIG9uQ2hhbmdlKGV2ZW50KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyRm9jdXMoZWxlbWVudCwgb3B0aW9uKSB7XG4gIGlmICghZWxlbWVudCkgcmV0dXJuO1xuICBlbGVtZW50LmZvY3VzKG9wdGlvbik7IC8vIFNlbGVjdGlvbiBjb250ZW50XG5cbiAgdmFyIF9yZWYgPSBvcHRpb24gfHwge30sXG4gICAgICBjdXJzb3IgPSBfcmVmLmN1cnNvcjtcblxuICBpZiAoY3Vyc29yKSB7XG4gICAgdmFyIGxlbiA9IGVsZW1lbnQudmFsdWUubGVuZ3RoO1xuXG4gICAgc3dpdGNoIChjdXJzb3IpIHtcbiAgICAgIGNhc2UgJ3N0YXJ0JzpcbiAgICAgICAgZWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZSgwLCAwKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgIGVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UobGVuLCBsZW4pO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgZWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZSgwLCBsZW4pO1xuICAgIH1cbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGZpeENvbnRyb2xsZWRWYWx1ZSh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHJldHVybiBTdHJpbmcodmFsdWUpO1xufSIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgUmVhY3QsIHsgY2xvbmVFbGVtZW50LCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IGhhc0FkZG9uLCBoYXNQcmVmaXhTdWZmaXggfSBmcm9tIFwiLi91dGlscy9jb21tb25VdGlsc1wiO1xuXG52YXIgQmFzZUlucHV0ID0gZnVuY3Rpb24gQmFzZUlucHV0KHByb3BzKSB7XG4gIHZhciBpbnB1dEVsZW1lbnQgPSBwcm9wcy5pbnB1dEVsZW1lbnQsXG4gICAgICBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICBwcmVmaXggPSBwcm9wcy5wcmVmaXgsXG4gICAgICBzdWZmaXggPSBwcm9wcy5zdWZmaXgsXG4gICAgICBhZGRvbkJlZm9yZSA9IHByb3BzLmFkZG9uQmVmb3JlLFxuICAgICAgYWRkb25BZnRlciA9IHByb3BzLmFkZG9uQWZ0ZXIsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgICAgYWZmaXhXcmFwcGVyQ2xhc3NOYW1lID0gcHJvcHMuYWZmaXhXcmFwcGVyQ2xhc3NOYW1lLFxuICAgICAgZ3JvdXBDbGFzc05hbWUgPSBwcm9wcy5ncm91cENsYXNzTmFtZSxcbiAgICAgIHdyYXBwZXJDbGFzc05hbWUgPSBwcm9wcy53cmFwcGVyQ2xhc3NOYW1lLFxuICAgICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICAgIHJlYWRPbmx5ID0gcHJvcHMucmVhZE9ubHksXG4gICAgICBmb2N1c2VkID0gcHJvcHMuZm9jdXNlZCxcbiAgICAgIHRyaWdnZXJGb2N1cyA9IHByb3BzLnRyaWdnZXJGb2N1cyxcbiAgICAgIGFsbG93Q2xlYXIgPSBwcm9wcy5hbGxvd0NsZWFyLFxuICAgICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICAgIGhhbmRsZVJlc2V0ID0gcHJvcHMuaGFuZGxlUmVzZXQsXG4gICAgICBoaWRkZW4gPSBwcm9wcy5oaWRkZW47XG4gIHZhciBjb250YWluZXJSZWYgPSB1c2VSZWYobnVsbCk7XG5cbiAgdmFyIG9uSW5wdXRDbGljayA9IGZ1bmN0aW9uIG9uSW5wdXRDbGljayhlKSB7XG4gICAgdmFyIF9jb250YWluZXJSZWYkY3VycmVudDtcblxuICAgIGlmICgoX2NvbnRhaW5lclJlZiRjdXJyZW50ID0gY29udGFpbmVyUmVmLmN1cnJlbnQpICE9PSBudWxsICYmIF9jb250YWluZXJSZWYkY3VycmVudCAhPT0gdm9pZCAwICYmIF9jb250YWluZXJSZWYkY3VycmVudC5jb250YWlucyhlLnRhcmdldCkpIHtcbiAgICAgIHRyaWdnZXJGb2N1cyA9PT0gbnVsbCB8fCB0cmlnZ2VyRm9jdXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRyaWdnZXJGb2N1cygpO1xuICAgIH1cbiAgfTsgLy8gPT09PT09PT09PT09PT09PT09IENsZWFyIEljb24gPT09PT09PT09PT09PT09PT09IC8vXG5cblxuICB2YXIgZ2V0Q2xlYXJJY29uID0gZnVuY3Rpb24gZ2V0Q2xlYXJJY29uKCkge1xuICAgIHZhciBfY2xhc3NOYW1lcztcblxuICAgIGlmICghYWxsb3dDbGVhcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIG5lZWRDbGVhciA9ICFkaXNhYmxlZCAmJiAhcmVhZE9ubHkgJiYgdmFsdWU7XG4gICAgdmFyIGNsZWFySWNvbkNscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2xlYXItaWNvblwiKTtcbiAgICB2YXIgaWNvbk5vZGUgPSBfdHlwZW9mKGFsbG93Q2xlYXIpID09PSAnb2JqZWN0JyAmJiBhbGxvd0NsZWFyICE9PSBudWxsICYmIGFsbG93Q2xlYXIgIT09IHZvaWQgMCAmJiBhbGxvd0NsZWFyLmNsZWFySWNvbiA/IGFsbG93Q2xlYXIuY2xlYXJJY29uIDogJ+Kclic7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBvbkNsaWNrOiBoYW5kbGVSZXNldCAvLyBEbyBub3QgdHJpZ2dlciBvbkJsdXIgd2hlbiBjbGVhciBpbnB1dFxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMzEyMDBcbiAgICAgICxcbiAgICAgIG9uTW91c2VEb3duOiBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7XG4gICAgICAgIHJldHVybiBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9LFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsZWFySWNvbkNscywgKF9jbGFzc05hbWVzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQoY2xlYXJJY29uQ2xzLCBcIi1oaWRkZW5cIiksICFuZWVkQ2xlYXIpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KGNsZWFySWNvbkNscywgXCItaGFzLXN1ZmZpeFwiKSwgISFzdWZmaXgpLCBfY2xhc3NOYW1lcykpLFxuICAgICAgcm9sZTogXCJidXR0b25cIixcbiAgICAgIHRhYkluZGV4OiAtMVxuICAgIH0sIGljb25Ob2RlKTtcbiAgfTtcblxuICB2YXIgZWxlbWVudCA9IC8qI19fUFVSRV9fKi9jbG9uZUVsZW1lbnQoaW5wdXRFbGVtZW50LCB7XG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIGhpZGRlbjogaGlkZGVuXG4gIH0pOyAvLyA9PT09PT09PT09PT09PT09PT0gUHJlZml4ICYgU3VmZml4ID09PT09PT09PT09PT09PT09PSAvL1xuXG4gIGlmIChoYXNQcmVmaXhTdWZmaXgocHJvcHMpKSB7XG4gICAgdmFyIF9jbGFzc05hbWVzMjtcblxuICAgIHZhciBhZmZpeFdyYXBwZXJQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFmZml4LXdyYXBwZXJcIik7XG4gICAgdmFyIGFmZml4V3JhcHBlckNscyA9IGNsYXNzTmFtZXMoYWZmaXhXcmFwcGVyUHJlZml4Q2xzLCAoX2NsYXNzTmFtZXMyID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KGFmZml4V3JhcHBlclByZWZpeENscywgXCItZGlzYWJsZWRcIiksIGRpc2FibGVkKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQoYWZmaXhXcmFwcGVyUHJlZml4Q2xzLCBcIi1mb2N1c2VkXCIpLCBmb2N1c2VkKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQoYWZmaXhXcmFwcGVyUHJlZml4Q2xzLCBcIi1yZWFkb25seVwiKSwgcmVhZE9ubHkpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChhZmZpeFdyYXBwZXJQcmVmaXhDbHMsIFwiLWlucHV0LXdpdGgtY2xlYXItYnRuXCIpLCBzdWZmaXggJiYgYWxsb3dDbGVhciAmJiB2YWx1ZSksIF9jbGFzc05hbWVzMiksICFoYXNBZGRvbihwcm9wcykgJiYgY2xhc3NOYW1lLCBhZmZpeFdyYXBwZXJDbGFzc05hbWUpO1xuICAgIHZhciBzdWZmaXhOb2RlID0gKHN1ZmZpeCB8fCBhbGxvd0NsZWFyKSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN1ZmZpeFwiKVxuICAgIH0sIGdldENsZWFySWNvbigpLCBzdWZmaXgpO1xuICAgIGVsZW1lbnQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBhZmZpeFdyYXBwZXJDbHMsXG4gICAgICBzdHlsZTogc3R5bGUsXG4gICAgICBoaWRkZW46ICFoYXNBZGRvbihwcm9wcykgJiYgaGlkZGVuLFxuICAgICAgb25DbGljazogb25JbnB1dENsaWNrLFxuICAgICAgcmVmOiBjb250YWluZXJSZWZcbiAgICB9LCBwcmVmaXggJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wcmVmaXhcIilcbiAgICB9LCBwcmVmaXgpLCAvKiNfX1BVUkVfXyovY2xvbmVFbGVtZW50KGlucHV0RWxlbWVudCwge1xuICAgICAgc3R5bGU6IG51bGwsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBoaWRkZW46IG51bGxcbiAgICB9KSwgc3VmZml4Tm9kZSk7XG4gIH0gLy8gPT09PT09PT09PT09PT09PT09IEFkZG9uID09PT09PT09PT09PT09PT09PSAvL1xuXG5cbiAgaWYgKGhhc0FkZG9uKHByb3BzKSkge1xuICAgIHZhciB3cmFwcGVyQ2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ncm91cFwiKTtcbiAgICB2YXIgYWRkb25DbHMgPSBcIlwiLmNvbmNhdCh3cmFwcGVyQ2xzLCBcIi1hZGRvblwiKTtcbiAgICB2YXIgbWVyZ2VkV3JhcHBlckNsYXNzTmFtZSA9IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi13cmFwcGVyXCIpLCB3cmFwcGVyQ2xzLCB3cmFwcGVyQ2xhc3NOYW1lKTtcbiAgICB2YXIgbWVyZ2VkR3JvdXBDbGFzc05hbWUgPSBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZ3JvdXAtd3JhcHBlclwiKSwgY2xhc3NOYW1lLCBncm91cENsYXNzTmFtZSk7IC8vIE5lZWQgYW5vdGhlciB3cmFwcGVyIGZvciBjaGFuZ2luZyBkaXNwbGF5OnRhYmxlIHRvIGRpc3BsYXk6aW5saW5lLWJsb2NrXG4gICAgLy8gYW5kIHB1dCBzdHlsZSBwcm9wIGluIHdyYXBwZXJcblxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBtZXJnZWRHcm91cENsYXNzTmFtZSxcbiAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgIGhpZGRlbjogaGlkZGVuXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogbWVyZ2VkV3JhcHBlckNsYXNzTmFtZVxuICAgIH0sIGFkZG9uQmVmb3JlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IGFkZG9uQ2xzXG4gICAgfSwgYWRkb25CZWZvcmUpLCAvKiNfX1BVUkVfXyovY2xvbmVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgIHN0eWxlOiBudWxsLFxuICAgICAgaGlkZGVuOiBudWxsXG4gICAgfSksIGFkZG9uQWZ0ZXIgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogYWRkb25DbHNcbiAgICB9LCBhZGRvbkFmdGVyKSkpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBCYXNlSW5wdXQ7IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJhdXRvQ29tcGxldGVcIiwgXCJvbkNoYW5nZVwiLCBcIm9uRm9jdXNcIiwgXCJvbkJsdXJcIiwgXCJvblByZXNzRW50ZXJcIiwgXCJvbktleURvd25cIiwgXCJwcmVmaXhDbHNcIiwgXCJkaXNhYmxlZFwiLCBcImh0bWxTaXplXCIsIFwiY2xhc3NOYW1lXCIsIFwibWF4TGVuZ3RoXCIsIFwic3VmZml4XCIsIFwic2hvd0NvdW50XCIsIFwidHlwZVwiLCBcImlucHV0Q2xhc3NOYW1lXCJdO1xuaW1wb3J0IFJlYWN0LCB7IHVzZVJlZiwgdXNlU3RhdGUsIGZvcndhcmRSZWYsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBCYXNlSW5wdXQgZnJvbSBcIi4vQmFzZUlucHV0XCI7XG5pbXBvcnQgb21pdCBmcm9tIFwicmMtdXRpbC9lcy9vbWl0XCI7XG5pbXBvcnQgeyBmaXhDb250cm9sbGVkVmFsdWUsIGhhc0FkZG9uLCBoYXNQcmVmaXhTdWZmaXgsIHJlc29sdmVPbkNoYW5nZSwgdHJpZ2dlckZvY3VzIH0gZnJvbSBcIi4vdXRpbHMvY29tbW9uVXRpbHNcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHVzZU1lcmdlZFN0YXRlIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lcmdlZFN0YXRlXCI7XG52YXIgSW5wdXQgPSAvKiNfX1BVUkVfXyovZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgYXV0b0NvbXBsZXRlID0gcHJvcHMuYXV0b0NvbXBsZXRlLFxuICAgICAgb25DaGFuZ2UgPSBwcm9wcy5vbkNoYW5nZSxcbiAgICAgIG9uRm9jdXMgPSBwcm9wcy5vbkZvY3VzLFxuICAgICAgb25CbHVyID0gcHJvcHMub25CbHVyLFxuICAgICAgb25QcmVzc0VudGVyID0gcHJvcHMub25QcmVzc0VudGVyLFxuICAgICAgb25LZXlEb3duID0gcHJvcHMub25LZXlEb3duLFxuICAgICAgX3Byb3BzJHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIHByZWZpeENscyA9IF9wcm9wcyRwcmVmaXhDbHMgPT09IHZvaWQgMCA/ICdyYy1pbnB1dCcgOiBfcHJvcHMkcHJlZml4Q2xzLFxuICAgICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICAgIGh0bWxTaXplID0gcHJvcHMuaHRtbFNpemUsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBtYXhMZW5ndGggPSBwcm9wcy5tYXhMZW5ndGgsXG4gICAgICBzdWZmaXggPSBwcm9wcy5zdWZmaXgsXG4gICAgICBzaG93Q291bnQgPSBwcm9wcy5zaG93Q291bnQsXG4gICAgICBfcHJvcHMkdHlwZSA9IHByb3BzLnR5cGUsXG4gICAgICB0eXBlID0gX3Byb3BzJHR5cGUgPT09IHZvaWQgMCA/ICd0ZXh0JyA6IF9wcm9wcyR0eXBlLFxuICAgICAgaW5wdXRDbGFzc05hbWUgPSBwcm9wcy5pbnB1dENsYXNzTmFtZSxcbiAgICAgIHJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG5cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZSA9IHVzZU1lcmdlZFN0YXRlKHByb3BzLmRlZmF1bHRWYWx1ZSwge1xuICAgIHZhbHVlOiBwcm9wcy52YWx1ZVxuICB9KSxcbiAgICAgIF91c2VNZXJnZWRTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGUsIDIpLFxuICAgICAgdmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzBdLFxuICAgICAgc2V0VmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzFdO1xuXG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShmYWxzZSksXG4gICAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICAgIGZvY3VzZWQgPSBfdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0Rm9jdXNlZCA9IF91c2VTdGF0ZTJbMV07XG5cbiAgdmFyIGlucHV0UmVmID0gdXNlUmVmKG51bGwpO1xuXG4gIHZhciBmb2N1cyA9IGZ1bmN0aW9uIGZvY3VzKG9wdGlvbikge1xuICAgIGlmIChpbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICB0cmlnZ2VyRm9jdXMoaW5wdXRSZWYuY3VycmVudCwgb3B0aW9uKTtcbiAgICB9XG4gIH07XG5cbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZm9jdXM6IGZvY3VzLFxuICAgICAgYmx1cjogZnVuY3Rpb24gYmx1cigpIHtcbiAgICAgICAgdmFyIF9pbnB1dFJlZiRjdXJyZW50O1xuXG4gICAgICAgIChfaW5wdXRSZWYkY3VycmVudCA9IGlucHV0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9pbnB1dFJlZiRjdXJyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfaW5wdXRSZWYkY3VycmVudC5ibHVyKCk7XG4gICAgICB9LFxuICAgICAgc2V0U2VsZWN0aW9uUmFuZ2U6IGZ1bmN0aW9uIHNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBlbmQsIGRpcmVjdGlvbikge1xuICAgICAgICB2YXIgX2lucHV0UmVmJGN1cnJlbnQyO1xuXG4gICAgICAgIChfaW5wdXRSZWYkY3VycmVudDIgPSBpbnB1dFJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfaW5wdXRSZWYkY3VycmVudDIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9pbnB1dFJlZiRjdXJyZW50Mi5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgZW5kLCBkaXJlY3Rpb24pO1xuICAgICAgfSxcbiAgICAgIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KCkge1xuICAgICAgICB2YXIgX2lucHV0UmVmJGN1cnJlbnQzO1xuXG4gICAgICAgIChfaW5wdXRSZWYkY3VycmVudDMgPSBpbnB1dFJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfaW5wdXRSZWYkY3VycmVudDMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9pbnB1dFJlZiRjdXJyZW50My5zZWxlY3QoKTtcbiAgICAgIH0sXG4gICAgICBpbnB1dDogaW5wdXRSZWYuY3VycmVudFxuICAgIH07XG4gIH0pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHNldEZvY3VzZWQoZnVuY3Rpb24gKHByZXYpIHtcbiAgICAgIHJldHVybiBwcmV2ICYmIGRpc2FibGVkID8gZmFsc2UgOiBwcmV2O1xuICAgIH0pO1xuICB9LCBbZGlzYWJsZWRdKTtcblxuICB2YXIgaGFuZGxlQ2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlQ2hhbmdlKGUpIHtcbiAgICBpZiAocHJvcHMudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgc2V0VmFsdWUoZS50YXJnZXQudmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChpbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICByZXNvbHZlT25DaGFuZ2UoaW5wdXRSZWYuY3VycmVudCwgZSwgb25DaGFuZ2UpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgaGFuZGxlS2V5RG93biA9IGZ1bmN0aW9uIGhhbmRsZUtleURvd24oZSkge1xuICAgIGlmIChvblByZXNzRW50ZXIgJiYgZS5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgIG9uUHJlc3NFbnRlcihlKTtcbiAgICB9XG5cbiAgICBvbktleURvd24gPT09IG51bGwgfHwgb25LZXlEb3duID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbktleURvd24oZSk7XG4gIH07XG5cbiAgdmFyIGhhbmRsZUZvY3VzID0gZnVuY3Rpb24gaGFuZGxlRm9jdXMoZSkge1xuICAgIHNldEZvY3VzZWQodHJ1ZSk7XG4gICAgb25Gb2N1cyA9PT0gbnVsbCB8fCBvbkZvY3VzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkZvY3VzKGUpO1xuICB9O1xuXG4gIHZhciBoYW5kbGVCbHVyID0gZnVuY3Rpb24gaGFuZGxlQmx1cihlKSB7XG4gICAgc2V0Rm9jdXNlZChmYWxzZSk7XG4gICAgb25CbHVyID09PSBudWxsIHx8IG9uQmx1ciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25CbHVyKGUpO1xuICB9O1xuXG4gIHZhciBoYW5kbGVSZXNldCA9IGZ1bmN0aW9uIGhhbmRsZVJlc2V0KGUpIHtcbiAgICBzZXRWYWx1ZSgnJyk7XG4gICAgZm9jdXMoKTtcblxuICAgIGlmIChpbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICByZXNvbHZlT25DaGFuZ2UoaW5wdXRSZWYuY3VycmVudCwgZSwgb25DaGFuZ2UpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgZ2V0SW5wdXRFbGVtZW50ID0gZnVuY3Rpb24gZ2V0SW5wdXRFbGVtZW50KCkge1xuICAgIC8vIEZpeCBodHRwczovL2ZiLm1lL3JlYWN0LXVua25vd24tcHJvcFxuICAgIHZhciBvdGhlclByb3BzID0gb21pdChwcm9wcywgWydwcmVmaXhDbHMnLCAnb25QcmVzc0VudGVyJywgJ2FkZG9uQmVmb3JlJywgJ2FkZG9uQWZ0ZXInLCAncHJlZml4JywgJ3N1ZmZpeCcsICdhbGxvd0NsZWFyJywgLy8gSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQsXG4gICAgLy8gc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCBib3RoLlxuICAgICdkZWZhdWx0VmFsdWUnLCAnc2hvd0NvdW50JywgJ2FmZml4V3JhcHBlckNsYXNzTmFtZScsICdncm91cENsYXNzTmFtZScsICdpbnB1dENsYXNzTmFtZScsICd3cmFwcGVyQ2xhc3NOYW1lJywgJ2h0bWxTaXplJ10pO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIF9leHRlbmRzKHtcbiAgICAgIGF1dG9Db21wbGV0ZTogYXV0b0NvbXBsZXRlXG4gICAgfSwgb3RoZXJQcm9wcywge1xuICAgICAgb25DaGFuZ2U6IGhhbmRsZUNoYW5nZSxcbiAgICAgIG9uRm9jdXM6IGhhbmRsZUZvY3VzLFxuICAgICAgb25CbHVyOiBoYW5kbGVCbHVyLFxuICAgICAgb25LZXlEb3duOiBoYW5kbGVLZXlEb3duLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKHByZWZpeENscywgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRpc2FibGVkXCIpLCBkaXNhYmxlZCksIGlucHV0Q2xhc3NOYW1lLCAhaGFzQWRkb24ocHJvcHMpICYmICFoYXNQcmVmaXhTdWZmaXgocHJvcHMpICYmIGNsYXNzTmFtZSksXG4gICAgICByZWY6IGlucHV0UmVmLFxuICAgICAgc2l6ZTogaHRtbFNpemUsXG4gICAgICB0eXBlOiB0eXBlXG4gICAgfSkpO1xuICB9O1xuXG4gIHZhciBnZXRTdWZmaXggPSBmdW5jdGlvbiBnZXRTdWZmaXgoKSB7XG4gICAgLy8gTWF4IGxlbmd0aCB2YWx1ZVxuICAgIHZhciBoYXNNYXhMZW5ndGggPSBOdW1iZXIobWF4TGVuZ3RoKSA+IDA7XG5cbiAgICBpZiAoc3VmZml4IHx8IHNob3dDb3VudCkge1xuICAgICAgdmFyIHZhbCA9IGZpeENvbnRyb2xsZWRWYWx1ZSh2YWx1ZSk7XG5cbiAgICAgIHZhciB2YWx1ZUxlbmd0aCA9IF90b0NvbnN1bWFibGVBcnJheSh2YWwpLmxlbmd0aDtcblxuICAgICAgdmFyIGRhdGFDb3VudCA9IF90eXBlb2Yoc2hvd0NvdW50KSA9PT0gJ29iamVjdCcgPyBzaG93Q291bnQuZm9ybWF0dGVyKHtcbiAgICAgICAgdmFsdWU6IHZhbCxcbiAgICAgICAgY291bnQ6IHZhbHVlTGVuZ3RoLFxuICAgICAgICBtYXhMZW5ndGg6IG1heExlbmd0aFxuICAgICAgfSkgOiBcIlwiLmNvbmNhdCh2YWx1ZUxlbmd0aCkuY29uY2F0KGhhc01heExlbmd0aCA/IFwiIC8gXCIuY29uY2F0KG1heExlbmd0aCkgOiAnJyk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsICEhc2hvd0NvdW50ICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNob3ctY291bnQtc3VmZml4XCIpLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2hvdy1jb3VudC1oYXMtc3VmZml4XCIpLCAhIXN1ZmZpeCkpXG4gICAgICB9LCBkYXRhQ291bnQpLCBzdWZmaXgpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChCYXNlSW5wdXQsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgaW5wdXRFbGVtZW50OiBnZXRJbnB1dEVsZW1lbnQoKSxcbiAgICBoYW5kbGVSZXNldDogaGFuZGxlUmVzZXQsXG4gICAgdmFsdWU6IGZpeENvbnRyb2xsZWRWYWx1ZSh2YWx1ZSksXG4gICAgZm9jdXNlZDogZm9jdXNlZCxcbiAgICB0cmlnZ2VyRm9jdXM6IGZvY3VzLFxuICAgIHN1ZmZpeDogZ2V0U3VmZml4KCksXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkXG4gIH0pKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgSW5wdXQ7IiwiaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VSZW1vdmVQYXNzd29yZFRpbWVvdXQoaW5wdXRSZWYsIHRyaWdnZXJPbk1vdW50KSB7XG4gIHZhciByZW1vdmVQYXNzd29yZFRpbWVvdXRSZWYgPSB1c2VSZWYoW10pO1xuICB2YXIgcmVtb3ZlUGFzc3dvcmRUaW1lb3V0ID0gZnVuY3Rpb24gcmVtb3ZlUGFzc3dvcmRUaW1lb3V0KCkge1xuICAgIHJlbW92ZVBhc3N3b3JkVGltZW91dFJlZi5jdXJyZW50LnB1c2goc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICBpZiAoKChfYSA9IGlucHV0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pbnB1dCkgJiYgKChfYiA9IGlucHV0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5pbnB1dC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSkgPT09ICdwYXNzd29yZCcgJiYgKChfYyA9IGlucHV0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5pbnB1dC5oYXNBdHRyaWJ1dGUoJ3ZhbHVlJykpKSB7XG4gICAgICAgIChfZCA9IGlucHV0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5pbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbHVlJyk7XG4gICAgICB9XG4gICAgfSkpO1xuICB9O1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICh0cmlnZ2VyT25Nb3VudCkge1xuICAgICAgcmVtb3ZlUGFzc3dvcmRUaW1lb3V0KCk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcmVtb3ZlUGFzc3dvcmRUaW1lb3V0UmVmLmN1cnJlbnQuZm9yRWFjaChmdW5jdGlvbiAodGltZXIpIHtcbiAgICAgICAgaWYgKHRpbWVyKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgfSwgW10pO1xuICByZXR1cm4gcmVtb3ZlUGFzc3dvcmRUaW1lb3V0O1xufSIsIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvcHJlZmVyLWRlZmF1bHQtZXhwb3J0XG5leHBvcnQgZnVuY3Rpb24gaGFzUHJlZml4U3VmZml4KHByb3BzKSB7XG4gIHJldHVybiAhIShwcm9wcy5wcmVmaXggfHwgcHJvcHMuc3VmZml4IHx8IHByb3BzLmFsbG93Q2xlYXIpO1xufSIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgQ2xvc2VDaXJjbGVGaWxsZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Nsb3NlQ2lyY2xlRmlsbGVkXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBSY0lucHV0IGZyb20gJ3JjLWlucHV0JztcbmltcG9ydCB7IGNvbXBvc2VSZWYgfSBmcm9tIFwicmMtdXRpbC9lcy9yZWZcIjtcbmltcG9ydCBSZWFjdCwgeyBmb3J3YXJkUmVmLCB1c2VDb250ZXh0LCB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IERpc2FibGVkQ29udGV4dCBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvRGlzYWJsZWRDb250ZXh0JztcbmltcG9ydCBTaXplQ29udGV4dCBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvU2l6ZUNvbnRleHQnO1xuaW1wb3J0IHsgRm9ybUl0ZW1JbnB1dENvbnRleHQsIE5vRm9ybVN0eWxlIH0gZnJvbSAnLi4vZm9ybS9jb250ZXh0JztcbmltcG9ydCB7IE5vQ29tcGFjdFN0eWxlLCB1c2VDb21wYWN0SXRlbUNvbnRleHQgfSBmcm9tICcuLi9zcGFjZS9Db21wYWN0JztcbmltcG9ydCB7IGdldE1lcmdlZFN0YXR1cywgZ2V0U3RhdHVzQ2xhc3NOYW1lcyB9IGZyb20gJy4uL191dGlsL3N0YXR1c1V0aWxzJztcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4uL191dGlsL3dhcm5pbmcnO1xuaW1wb3J0IHVzZVJlbW92ZVBhc3N3b3JkVGltZW91dCBmcm9tICcuL2hvb2tzL3VzZVJlbW92ZVBhc3N3b3JkVGltZW91dCc7XG5pbXBvcnQgeyBoYXNQcmVmaXhTdWZmaXggfSBmcm9tICcuL3V0aWxzJztcbmV4cG9ydCBmdW5jdGlvbiBmaXhDb250cm9sbGVkVmFsdWUodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU9uQ2hhbmdlKHRhcmdldCwgZSwgb25DaGFuZ2UsIHRhcmdldFZhbHVlKSB7XG4gIGlmICghb25DaGFuZ2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGV2ZW50ID0gZTtcbiAgaWYgKGUudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgIC8vIENsb25lIGEgbmV3IHRhcmdldCBmb3IgZXZlbnQuXG4gICAgLy8gQXZvaWQgdGhlIGZvbGxvd2luZyB1c2FnZSwgdGhlIHNldFF1ZXJ5IG1ldGhvZCBnZXRzIHRoZSBvcmlnaW5hbCB2YWx1ZS5cbiAgICAvL1xuICAgIC8vIGNvbnN0IFtxdWVyeSwgc2V0UXVlcnldID0gUmVhY3QudXNlU3RhdGUoJycpO1xuICAgIC8vIDxJbnB1dFxuICAgIC8vICAgYWxsb3dDbGVhclxuICAgIC8vICAgdmFsdWU9e3F1ZXJ5fVxuICAgIC8vICAgb25DaGFuZ2U9eyhlKT0+IHtcbiAgICAvLyAgICAgc2V0UXVlcnkoKHByZXZTdGF0dXMpID0+IGUudGFyZ2V0LnZhbHVlKTtcbiAgICAvLyAgIH19XG4gICAgLy8gLz5cbiAgICB2YXIgY3VycmVudFRhcmdldCA9IHRhcmdldC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgLy8gY2xpY2sgY2xlYXIgaWNvblxuICAgIGV2ZW50ID0gT2JqZWN0LmNyZWF0ZShlLCB7XG4gICAgICB0YXJnZXQ6IHtcbiAgICAgICAgdmFsdWU6IGN1cnJlbnRUYXJnZXRcbiAgICAgIH0sXG4gICAgICBjdXJyZW50VGFyZ2V0OiB7XG4gICAgICAgIHZhbHVlOiBjdXJyZW50VGFyZ2V0XG4gICAgICB9XG4gICAgfSk7XG4gICAgY3VycmVudFRhcmdldC52YWx1ZSA9ICcnO1xuICAgIG9uQ2hhbmdlKGV2ZW50KTtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gVHJpZ2dlciBieSBjb21wb3NpdGlvbiBldmVudCwgdGhpcyBtZWFucyB3ZSBuZWVkIGZvcmNlIGNoYW5nZSB0aGUgaW5wdXQgdmFsdWVcbiAgaWYgKHRhcmdldFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICBldmVudCA9IE9iamVjdC5jcmVhdGUoZSwge1xuICAgICAgdGFyZ2V0OiB7XG4gICAgICAgIHZhbHVlOiB0YXJnZXRcbiAgICAgIH0sXG4gICAgICBjdXJyZW50VGFyZ2V0OiB7XG4gICAgICAgIHZhbHVlOiB0YXJnZXRcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0YXJnZXQudmFsdWUgPSB0YXJnZXRWYWx1ZTtcbiAgICBvbkNoYW5nZShldmVudCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIG9uQ2hhbmdlKGV2ZW50KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyRm9jdXMoZWxlbWVudCwgb3B0aW9uKSB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybjtcbiAgfVxuICBlbGVtZW50LmZvY3VzKG9wdGlvbik7XG4gIC8vIFNlbGVjdGlvbiBjb250ZW50XG4gIHZhciBfcmVmID0gb3B0aW9uIHx8IHt9LFxuICAgIGN1cnNvciA9IF9yZWYuY3Vyc29yO1xuICBpZiAoY3Vyc29yKSB7XG4gICAgdmFyIGxlbiA9IGVsZW1lbnQudmFsdWUubGVuZ3RoO1xuICAgIHN3aXRjaCAoY3Vyc29yKSB7XG4gICAgICBjYXNlICdzdGFydCc6XG4gICAgICAgIGVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgMCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgZWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZShsZW4sIGxlbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgZWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZSgwLCBsZW4pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cbnZhciBJbnB1dCA9IC8qI19fUFVSRV9fKi9mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBfY2xhc3NOYW1lcywgX2NsYXNzTmFtZXMyLCBfY2xhc3NOYW1lczQ7XG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgX3Byb3BzJGJvcmRlcmVkID0gcHJvcHMuYm9yZGVyZWQsXG4gICAgYm9yZGVyZWQgPSBfcHJvcHMkYm9yZGVyZWQgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkYm9yZGVyZWQsXG4gICAgY3VzdG9tU3RhdHVzID0gcHJvcHMuc3RhdHVzLFxuICAgIGN1c3RvbVNpemUgPSBwcm9wcy5zaXplLFxuICAgIGN1c3RvbURpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgb25CbHVyID0gcHJvcHMub25CbHVyLFxuICAgIG9uRm9jdXMgPSBwcm9wcy5vbkZvY3VzLFxuICAgIHN1ZmZpeCA9IHByb3BzLnN1ZmZpeCxcbiAgICBhbGxvd0NsZWFyID0gcHJvcHMuYWxsb3dDbGVhcixcbiAgICBhZGRvbkFmdGVyID0gcHJvcHMuYWRkb25BZnRlcixcbiAgICBhZGRvbkJlZm9yZSA9IHByb3BzLmFkZG9uQmVmb3JlLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLFxuICAgIHJlc3QgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcImJvcmRlcmVkXCIsIFwic3RhdHVzXCIsIFwic2l6ZVwiLCBcImRpc2FibGVkXCIsIFwib25CbHVyXCIsIFwib25Gb2N1c1wiLCBcInN1ZmZpeFwiLCBcImFsbG93Q2xlYXJcIiwgXCJhZGRvbkFmdGVyXCIsIFwiYWRkb25CZWZvcmVcIiwgXCJjbGFzc05hbWVcIiwgXCJvbkNoYW5nZVwiXSk7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCksXG4gICAgZ2V0UHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UHJlZml4Q2xzLFxuICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbixcbiAgICBpbnB1dCA9IF9SZWFjdCR1c2VDb250ZXh0LmlucHV0O1xuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdpbnB1dCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIHZhciBpbnB1dFJlZiA9IHVzZVJlZihudWxsKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IENvbXBhY3QgSXRlbSA9PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF91c2VDb21wYWN0SXRlbUNvbnRleCA9IHVzZUNvbXBhY3RJdGVtQ29udGV4dChwcmVmaXhDbHMsIGRpcmVjdGlvbiksXG4gICAgY29tcGFjdFNpemUgPSBfdXNlQ29tcGFjdEl0ZW1Db250ZXguY29tcGFjdFNpemUsXG4gICAgY29tcGFjdEl0ZW1DbGFzc25hbWVzID0gX3VzZUNvbXBhY3RJdGVtQ29udGV4LmNvbXBhY3RJdGVtQ2xhc3NuYW1lcztcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IFNpemUgPT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBzaXplID0gUmVhY3QudXNlQ29udGV4dChTaXplQ29udGV4dCk7XG4gIHZhciBtZXJnZWRTaXplID0gY29tcGFjdFNpemUgfHwgY3VzdG9tU2l6ZSB8fCBzaXplO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gRGlzYWJsZWQgPT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBkaXNhYmxlZCA9IFJlYWN0LnVzZUNvbnRleHQoRGlzYWJsZWRDb250ZXh0KTtcbiAgdmFyIG1lcmdlZERpc2FibGVkID0gY3VzdG9tRGlzYWJsZWQgIT09IG51bGwgJiYgY3VzdG9tRGlzYWJsZWQgIT09IHZvaWQgMCA/IGN1c3RvbURpc2FibGVkIDogZGlzYWJsZWQ7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PSBTdGF0dXMgPT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfdXNlQ29udGV4dCA9IHVzZUNvbnRleHQoRm9ybUl0ZW1JbnB1dENvbnRleHQpLFxuICAgIGNvbnRleHRTdGF0dXMgPSBfdXNlQ29udGV4dC5zdGF0dXMsXG4gICAgaGFzRmVlZGJhY2sgPSBfdXNlQ29udGV4dC5oYXNGZWVkYmFjayxcbiAgICBmZWVkYmFja0ljb24gPSBfdXNlQ29udGV4dC5mZWVkYmFja0ljb247XG4gIHZhciBtZXJnZWRTdGF0dXMgPSBnZXRNZXJnZWRTdGF0dXMoY29udGV4dFN0YXR1cywgY3VzdG9tU3RhdHVzKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IEZvY3VzIHdhcm5pbmcgPT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBpbnB1dEhhc1ByZWZpeFN1ZmZpeCA9IGhhc1ByZWZpeFN1ZmZpeChwcm9wcykgfHwgISFoYXNGZWVkYmFjaztcbiAgdmFyIHByZXZIYXNQcmVmaXhTdWZmaXggPSB1c2VSZWYoaW5wdXRIYXNQcmVmaXhTdWZmaXgpO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBfYTtcbiAgICBpZiAoaW5wdXRIYXNQcmVmaXhTdWZmaXggJiYgIXByZXZIYXNQcmVmaXhTdWZmaXguY3VycmVudCkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSAoKF9hID0gaW5wdXRSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlucHV0KSwgJ0lucHV0JywgXCJXaGVuIElucHV0IGlzIGZvY3VzZWQsIGR5bmFtaWMgYWRkIG9yIHJlbW92ZSBwcmVmaXggLyBzdWZmaXggd2lsbCBtYWtlIGl0IGxvc2UgZm9jdXMgY2F1c2VkIGJ5IGRvbSBzdHJ1Y3R1cmUgY2hhbmdlLiBSZWFkIG1vcmU6IGh0dHBzOi8vYW50LmRlc2lnbi9jb21wb25lbnRzL2lucHV0LyNGQVFcIikgOiB2b2lkIDA7XG4gICAgfVxuICAgIHByZXZIYXNQcmVmaXhTdWZmaXguY3VycmVudCA9IGlucHV0SGFzUHJlZml4U3VmZml4O1xuICB9LCBbaW5wdXRIYXNQcmVmaXhTdWZmaXhdKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IFJlbW92ZSBQYXNzd29yZCB2YWx1ZSA9PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHJlbW92ZVBhc3N3b3JkVGltZW91dCA9IHVzZVJlbW92ZVBhc3N3b3JkVGltZW91dChpbnB1dFJlZiwgdHJ1ZSk7XG4gIHZhciBoYW5kbGVCbHVyID0gZnVuY3Rpb24gaGFuZGxlQmx1cihlKSB7XG4gICAgcmVtb3ZlUGFzc3dvcmRUaW1lb3V0KCk7XG4gICAgb25CbHVyID09PSBudWxsIHx8IG9uQmx1ciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25CbHVyKGUpO1xuICB9O1xuICB2YXIgaGFuZGxlRm9jdXMgPSBmdW5jdGlvbiBoYW5kbGVGb2N1cyhlKSB7XG4gICAgcmVtb3ZlUGFzc3dvcmRUaW1lb3V0KCk7XG4gICAgb25Gb2N1cyA9PT0gbnVsbCB8fCBvbkZvY3VzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkZvY3VzKGUpO1xuICB9O1xuICB2YXIgaGFuZGxlQ2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlQ2hhbmdlKGUpIHtcbiAgICByZW1vdmVQYXNzd29yZFRpbWVvdXQoKTtcbiAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UoZSk7XG4gIH07XG4gIHZhciBzdWZmaXhOb2RlID0gKGhhc0ZlZWRiYWNrIHx8IHN1ZmZpeCkgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIHN1ZmZpeCwgaGFzRmVlZGJhY2sgJiYgZmVlZGJhY2tJY29uKTtcbiAgLy8gQWxsb3cgY2xlYXJcbiAgdmFyIG1lcmdlZEFsbG93Q2xlYXI7XG4gIGlmIChfdHlwZW9mKGFsbG93Q2xlYXIpID09PSAnb2JqZWN0JyAmJiAoYWxsb3dDbGVhciA9PT0gbnVsbCB8fCBhbGxvd0NsZWFyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhbGxvd0NsZWFyLmNsZWFySWNvbikpIHtcbiAgICBtZXJnZWRBbGxvd0NsZWFyID0gYWxsb3dDbGVhcjtcbiAgfSBlbHNlIGlmIChhbGxvd0NsZWFyKSB7XG4gICAgbWVyZ2VkQWxsb3dDbGVhciA9IHtcbiAgICAgIGNsZWFySWNvbjogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2xvc2VDaXJjbGVGaWxsZWQsIG51bGwpXG4gICAgfTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmNJbnB1dCwgX2V4dGVuZHMoe1xuICAgIHJlZjogY29tcG9zZVJlZihyZWYsIGlucHV0UmVmKSxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBhdXRvQ29tcGxldGU6IGlucHV0ID09PSBudWxsIHx8IGlucHV0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpbnB1dC5hdXRvQ29tcGxldGVcbiAgfSwgcmVzdCwge1xuICAgIGRpc2FibGVkOiBtZXJnZWREaXNhYmxlZCB8fCB1bmRlZmluZWQsXG4gICAgb25CbHVyOiBoYW5kbGVCbHVyLFxuICAgIG9uRm9jdXM6IGhhbmRsZUZvY3VzLFxuICAgIHN1ZmZpeDogc3VmZml4Tm9kZSxcbiAgICBhbGxvd0NsZWFyOiBtZXJnZWRBbGxvd0NsZWFyLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGNvbXBhY3RJdGVtQ2xhc3NuYW1lcyksXG4gICAgb25DaGFuZ2U6IGhhbmRsZUNoYW5nZSxcbiAgICBhZGRvbkFmdGVyOiBhZGRvbkFmdGVyICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE5vQ29tcGFjdFN0eWxlLCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChOb0Zvcm1TdHlsZSwge1xuICAgICAgb3ZlcnJpZGU6IHRydWUsXG4gICAgICBzdGF0dXM6IHRydWVcbiAgICB9LCBhZGRvbkFmdGVyKSksXG4gICAgYWRkb25CZWZvcmU6IGFkZG9uQmVmb3JlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE5vQ29tcGFjdFN0eWxlLCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChOb0Zvcm1TdHlsZSwge1xuICAgICAgb3ZlcnJpZGU6IHRydWUsXG4gICAgICBzdGF0dXM6IHRydWVcbiAgICB9LCBhZGRvbkJlZm9yZSkpLFxuICAgIGlucHV0Q2xhc3NOYW1lOiBjbGFzc05hbWVzKChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc21cIiksIG1lcmdlZFNpemUgPT09ICdzbWFsbCcpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbGdcIiksIG1lcmdlZFNpemUgPT09ICdsYXJnZScpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWJvcmRlcmxlc3NcIiksICFib3JkZXJlZCksIF9jbGFzc05hbWVzKSwgIWlucHV0SGFzUHJlZml4U3VmZml4ICYmIGdldFN0YXR1c0NsYXNzTmFtZXMocHJlZml4Q2xzLCBtZXJnZWRTdGF0dXMpKSxcbiAgICBhZmZpeFdyYXBwZXJDbGFzc05hbWU6IGNsYXNzTmFtZXMoKF9jbGFzc05hbWVzMiA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFmZml4LXdyYXBwZXItc21cIiksIG1lcmdlZFNpemUgPT09ICdzbWFsbCcpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFmZml4LXdyYXBwZXItbGdcIiksIG1lcmdlZFNpemUgPT09ICdsYXJnZScpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFmZml4LXdyYXBwZXItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hZmZpeC13cmFwcGVyLWJvcmRlcmxlc3NcIiksICFib3JkZXJlZCksIF9jbGFzc05hbWVzMiksIGdldFN0YXR1c0NsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hZmZpeC13cmFwcGVyXCIpLCBtZXJnZWRTdGF0dXMsIGhhc0ZlZWRiYWNrKSksXG4gICAgd3JhcHBlckNsYXNzTmFtZTogY2xhc3NOYW1lcyhfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZ3JvdXAtcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSksXG4gICAgZ3JvdXBDbGFzc05hbWU6IGNsYXNzTmFtZXMoKF9jbGFzc05hbWVzNCA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXM0LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWdyb3VwLXdyYXBwZXItc21cIiksIG1lcmdlZFNpemUgPT09ICdzbWFsbCcpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXM0LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWdyb3VwLXdyYXBwZXItbGdcIiksIG1lcmdlZFNpemUgPT09ICdsYXJnZScpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXM0LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWdyb3VwLXdyYXBwZXItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX2NsYXNzTmFtZXM0KSwgZ2V0U3RhdHVzQ2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWdyb3VwLXdyYXBwZXJcIiksIG1lcmdlZFN0YXR1cywgaGFzRmVlZGJhY2spKVxuICB9KSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IElucHV0OyIsIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIEV5ZUludmlzaWJsZU91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk05NDIuMiA0ODYuMlE4ODkuNDcgMzc1LjExIDgxNi43IDMwNWwtNTAuODggNTAuODhDODA3LjMxIDM5NS41MyA4NDMuNDUgNDQ3LjQgODc0LjcgNTEyIDc5MS41IDY4NC4yIDY3My40IDc2NiA1MTIgNzY2cS03Mi42NyAwLTEzMy44Ny0yMi4zOEwzMjMgNzk4Ljc1UTQwOCA4MzggNTEyIDgzOHEyODguMyAwIDQzMC4yLTMwMC4zYTYwLjI5IDYwLjI5IDAgMDAwLTUxLjV6bS02My41Ny0zMjAuNjRMODM2IDEyMi44OGE4IDggMCAwMC0xMS4zMiAwTDcxNS4zMSAyMzIuMlE2MjQuODYgMTg2IDUxMiAxODZxLTI4OC4zIDAtNDMwLjIgMzAwLjNhNjAuMyA2MC4zIDAgMDAwIDUxLjVxNTYuNjkgMTE5LjQgMTM2LjUgMTkxLjQxTDExMi40OCA4MzVhOCA4IDAgMDAwIDExLjMxTDE1NS4xNyA4ODlhOCA4IDAgMDAxMS4zMSAwbDcxMi4xNS03MTIuMTJhOCA4IDAgMDAwLTExLjMyek0xNDkuMyA1MTJDMjMyLjYgMzM5LjggMzUwLjcgMjU4IDUxMiAyNThjNTQuNTQgMCAxMDQuMTMgOS4zNiAxNDkuMTIgMjguMzlsLTcwLjMgNzAuM2ExNzYgMTc2IDAgMDAtMjM4LjEzIDIzOC4xM2wtODMuNDIgODMuNDJDMjIzLjEgNjM3LjQ5IDE4My4zIDU4Mi4yOCAxNDkuMyA1MTJ6bTI0Ni43IDBhMTEyLjExIDExMi4xMSAwIDAxMTQ2LjItMTA2LjY5TDQwMS4zMSA1NDYuMkExMTIgMTEyIDAgMDEzOTYgNTEyelwiIH0gfSwgeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk01MDggNjI0Yy0zLjQ2IDAtNi44Ny0uMTYtMTAuMjUtLjQ3bC01Mi44MiA1Mi44MmExNzYuMDkgMTc2LjA5IDAgMDAyMjcuNDItMjI3LjQybC01Mi44MiA1Mi44MmMuMzEgMy4zOC40NyA2Ljc5LjQ3IDEwLjI1YTExMS45NCAxMTEuOTQgMCAwMS0xMTIgMTEyelwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiZXllLWludmlzaWJsZVwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgRXllSW52aXNpYmxlT3V0bGluZWQ7XG4iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBFeWVJbnZpc2libGVPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9FeWVJbnZpc2libGVPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIEV5ZUludmlzaWJsZU91dGxpbmVkID0gZnVuY3Rpb24gRXllSW52aXNpYmxlT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IEV5ZUludmlzaWJsZU91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5FeWVJbnZpc2libGVPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdFeWVJbnZpc2libGVPdXRsaW5lZCc7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihFeWVJbnZpc2libGVPdXRsaW5lZCk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IEV5ZUludmlzaWJsZU91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9FeWVJbnZpc2libGVPdXRsaW5lZFwiO1xuaW1wb3J0IEV5ZU91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9FeWVPdXRsaW5lZFwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgb21pdCBmcm9tIFwicmMtdXRpbC9lcy9vbWl0XCI7XG5pbXBvcnQgeyBjb21wb3NlUmVmIH0gZnJvbSBcInJjLXV0aWwvZXMvcmVmXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29uZmlnQ29uc3VtZXIgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHVzZVJlbW92ZVBhc3N3b3JkVGltZW91dCBmcm9tICcuL2hvb2tzL3VzZVJlbW92ZVBhc3N3b3JkVGltZW91dCc7XG5pbXBvcnQgSW5wdXQgZnJvbSAnLi9JbnB1dCc7XG52YXIgZGVmYXVsdEljb25SZW5kZXIgPSBmdW5jdGlvbiBkZWZhdWx0SWNvblJlbmRlcih2aXNpYmxlKSB7XG4gIHJldHVybiB2aXNpYmxlID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRXllT3V0bGluZWQsIG51bGwpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRXllSW52aXNpYmxlT3V0bGluZWQsIG51bGwpO1xufTtcbnZhciBBY3Rpb25NYXAgPSB7XG4gIGNsaWNrOiAnb25DbGljaycsXG4gIGhvdmVyOiAnb25Nb3VzZU92ZXInXG59O1xudmFyIFBhc3N3b3JkID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIF9wcm9wcyR2aXNpYmlsaXR5VG9nZyA9IHByb3BzLnZpc2liaWxpdHlUb2dnbGUsXG4gICAgdmlzaWJpbGl0eVRvZ2dsZSA9IF9wcm9wcyR2aXNpYmlsaXR5VG9nZyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyR2aXNpYmlsaXR5VG9nZztcbiAgdmFyIHZpc2liaWxpdHlDb250cm9sbGVkID0gX3R5cGVvZih2aXNpYmlsaXR5VG9nZ2xlKSA9PT0gJ29iamVjdCcgJiYgdmlzaWJpbGl0eVRvZ2dsZS52aXNpYmxlICE9PSB1bmRlZmluZWQ7XG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdmlzaWJpbGl0eUNvbnRyb2xsZWQgPyB2aXNpYmlsaXR5VG9nZ2xlLnZpc2libGUgOiBmYWxzZTtcbiAgICB9KSxcbiAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICB2aXNpYmxlID0gX3VzZVN0YXRlMlswXSxcbiAgICBzZXRWaXNpYmxlID0gX3VzZVN0YXRlMlsxXTtcbiAgdmFyIGlucHV0UmVmID0gdXNlUmVmKG51bGwpO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICh2aXNpYmlsaXR5Q29udHJvbGxlZCkge1xuICAgICAgc2V0VmlzaWJsZSh2aXNpYmlsaXR5VG9nZ2xlLnZpc2libGUpO1xuICAgIH1cbiAgfSwgW3Zpc2liaWxpdHlDb250cm9sbGVkLCB2aXNpYmlsaXR5VG9nZ2xlXSk7XG4gIC8vIFJlbW92ZSBQYXNzd29yZCB2YWx1ZVxuICB2YXIgcmVtb3ZlUGFzc3dvcmRUaW1lb3V0ID0gdXNlUmVtb3ZlUGFzc3dvcmRUaW1lb3V0KGlucHV0UmVmKTtcbiAgdmFyIG9uVmlzaWJsZUNoYW5nZSA9IGZ1bmN0aW9uIG9uVmlzaWJsZUNoYW5nZSgpIHtcbiAgICB2YXIgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZDtcbiAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZpc2libGUpIHtcbiAgICAgIHJlbW92ZVBhc3N3b3JkVGltZW91dCgpO1xuICAgIH1cbiAgICBzZXRWaXNpYmxlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgIHZhciBfYTtcbiAgICAgIHZhciBuZXdTdGF0ZSA9ICFwcmV2U3RhdGU7XG4gICAgICBpZiAoX3R5cGVvZih2aXNpYmlsaXR5VG9nZ2xlKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgKF9hID0gdmlzaWJpbGl0eVRvZ2dsZS5vblZpc2libGVDaGFuZ2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKHZpc2liaWxpdHlUb2dnbGUsIG5ld1N0YXRlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXdTdGF0ZTtcbiAgICB9KTtcbiAgfTtcbiAgdmFyIGdldEljb24gPSBmdW5jdGlvbiBnZXRJY29uKHByZWZpeENscykge1xuICAgIHZhciBfaWNvblByb3BzO1xuICAgIHZhciBfcHJvcHMkYWN0aW9uID0gcHJvcHMuYWN0aW9uLFxuICAgICAgYWN0aW9uID0gX3Byb3BzJGFjdGlvbiA9PT0gdm9pZCAwID8gJ2NsaWNrJyA6IF9wcm9wcyRhY3Rpb24sXG4gICAgICBfcHJvcHMkaWNvblJlbmRlciA9IHByb3BzLmljb25SZW5kZXIsXG4gICAgICBpY29uUmVuZGVyID0gX3Byb3BzJGljb25SZW5kZXIgPT09IHZvaWQgMCA/IGRlZmF1bHRJY29uUmVuZGVyIDogX3Byb3BzJGljb25SZW5kZXI7XG4gICAgdmFyIGljb25UcmlnZ2VyID0gQWN0aW9uTWFwW2FjdGlvbl0gfHwgJyc7XG4gICAgdmFyIGljb24gPSBpY29uUmVuZGVyKHZpc2libGUpO1xuICAgIHZhciBpY29uUHJvcHMgPSAoX2ljb25Qcm9wcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2ljb25Qcm9wcywgaWNvblRyaWdnZXIsIG9uVmlzaWJsZUNoYW5nZSksIF9kZWZpbmVQcm9wZXJ0eShfaWNvblByb3BzLCBcImNsYXNzTmFtZVwiLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWljb25cIikpLCBfZGVmaW5lUHJvcGVydHkoX2ljb25Qcm9wcywgXCJrZXlcIiwgJ3Bhc3N3b3JkSWNvbicpLCBfZGVmaW5lUHJvcGVydHkoX2ljb25Qcm9wcywgXCJvbk1vdXNlRG93blwiLCBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7XG4gICAgICAvLyBQcmV2ZW50IGZvY3VzZWQgc3RhdGUgbG9zdFxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMTUxNzNcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9KSwgX2RlZmluZVByb3BlcnR5KF9pY29uUHJvcHMsIFwib25Nb3VzZVVwXCIsIGZ1bmN0aW9uIG9uTW91c2VVcChlKSB7XG4gICAgICAvLyBQcmV2ZW50IGNhcmV0IHBvc2l0aW9uIGNoYW5nZVxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMjM1MjRcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9KSwgX2ljb25Qcm9wcyk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoIC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChpY29uKSA/IGljb24gOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgaWNvbiksIGljb25Qcm9wcyk7XG4gIH07XG4gIHZhciByZW5kZXJQYXNzd29yZCA9IGZ1bmN0aW9uIHJlbmRlclBhc3N3b3JkKF9yZWYpIHtcbiAgICB2YXIgZ2V0UHJlZml4Q2xzID0gX3JlZi5nZXRQcmVmaXhDbHM7XG4gICAgdmFyIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIGN1c3RvbWl6ZUlucHV0UHJlZml4Q2xzID0gcHJvcHMuaW5wdXRQcmVmaXhDbHMsXG4gICAgICBzaXplID0gcHJvcHMuc2l6ZSxcbiAgICAgIHJlc3RQcm9wcyA9IF9fcmVzdChwcm9wcywgW1wiY2xhc3NOYW1lXCIsIFwicHJlZml4Q2xzXCIsIFwiaW5wdXRQcmVmaXhDbHNcIiwgXCJzaXplXCJdKTtcbiAgICB2YXIgaW5wdXRQcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2lucHV0JywgY3VzdG9taXplSW5wdXRQcmVmaXhDbHMpO1xuICAgIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2lucHV0LXBhc3N3b3JkJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgICB2YXIgc3VmZml4SWNvbiA9IHZpc2liaWxpdHlUb2dnbGUgJiYgZ2V0SWNvbihwcmVmaXhDbHMpO1xuICAgIHZhciBpbnB1dENsYXNzTmFtZSA9IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBjbGFzc05hbWUsIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHNpemUpLCAhIXNpemUpKTtcbiAgICB2YXIgb21pdHRlZFByb3BzID0gX2V4dGVuZHMoX2V4dGVuZHMoe30sIG9taXQocmVzdFByb3BzLCBbJ3N1ZmZpeCcsICdpY29uUmVuZGVyJywgJ3Zpc2liaWxpdHlUb2dnbGUnXSkpLCB7XG4gICAgICB0eXBlOiB2aXNpYmxlID8gJ3RleHQnIDogJ3Bhc3N3b3JkJyxcbiAgICAgIGNsYXNzTmFtZTogaW5wdXRDbGFzc05hbWUsXG4gICAgICBwcmVmaXhDbHM6IGlucHV0UHJlZml4Q2xzLFxuICAgICAgc3VmZml4OiBzdWZmaXhJY29uXG4gICAgfSk7XG4gICAgaWYgKHNpemUpIHtcbiAgICAgIG9taXR0ZWRQcm9wcy5zaXplID0gc2l6ZTtcbiAgICB9XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KElucHV0LCBfZXh0ZW5kcyh7XG4gICAgICByZWY6IGNvbXBvc2VSZWYocmVmLCBpbnB1dFJlZilcbiAgICB9LCBvbWl0dGVkUHJvcHMpKTtcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbmZpZ0NvbnN1bWVyLCBudWxsLCByZW5kZXJQYXNzd29yZCk7XG59KTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFBhc3N3b3JkLmRpc3BsYXlOYW1lID0gJ1Bhc3N3b3JkJztcbn1cbmV4cG9ydCBkZWZhdWx0IFBhc3N3b3JkOyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgU2VhcmNoT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1NlYXJjaE91dGxpbmVkXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IGNvbXBvc2VSZWYgfSBmcm9tIFwicmMtdXRpbC9lcy9yZWZcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBCdXR0b24gZnJvbSAnLi4vYnV0dG9uJztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IFNpemVDb250ZXh0IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlci9TaXplQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VDb21wYWN0SXRlbUNvbnRleHQgfSBmcm9tICcuLi9zcGFjZS9Db21wYWN0JztcbmltcG9ydCB7IGNsb25lRWxlbWVudCB9IGZyb20gJy4uL191dGlsL3JlYWN0Tm9kZSc7XG5pbXBvcnQgSW5wdXQgZnJvbSAnLi9JbnB1dCc7XG52YXIgU2VhcmNoID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGN1c3RvbWl6ZUlucHV0UHJlZml4Q2xzID0gcHJvcHMuaW5wdXRQcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIGN1c3RvbWl6ZVNpemUgPSBwcm9wcy5zaXplLFxuICAgIHN1ZmZpeCA9IHByb3BzLnN1ZmZpeCxcbiAgICBfcHJvcHMkZW50ZXJCdXR0b24gPSBwcm9wcy5lbnRlckJ1dHRvbixcbiAgICBlbnRlckJ1dHRvbiA9IF9wcm9wcyRlbnRlckJ1dHRvbiA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZW50ZXJCdXR0b24sXG4gICAgYWRkb25BZnRlciA9IHByb3BzLmFkZG9uQWZ0ZXIsXG4gICAgbG9hZGluZyA9IHByb3BzLmxvYWRpbmcsXG4gICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICBjdXN0b21PblNlYXJjaCA9IHByb3BzLm9uU2VhcmNoLFxuICAgIGN1c3RvbU9uQ2hhbmdlID0gcHJvcHMub25DaGFuZ2UsXG4gICAgb25Db21wb3NpdGlvblN0YXJ0ID0gcHJvcHMub25Db21wb3NpdGlvblN0YXJ0LFxuICAgIG9uQ29tcG9zaXRpb25FbmQgPSBwcm9wcy5vbkNvbXBvc2l0aW9uRW5kLFxuICAgIHJlc3RQcm9wcyA9IF9fcmVzdChwcm9wcywgW1wicHJlZml4Q2xzXCIsIFwiaW5wdXRQcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJzaXplXCIsIFwic3VmZml4XCIsIFwiZW50ZXJCdXR0b25cIiwgXCJhZGRvbkFmdGVyXCIsIFwibG9hZGluZ1wiLCBcImRpc2FibGVkXCIsIFwib25TZWFyY2hcIiwgXCJvbkNoYW5nZVwiLCBcIm9uQ29tcG9zaXRpb25TdGFydFwiLCBcIm9uQ29tcG9zaXRpb25FbmRcIl0pO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICBkaXJlY3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb247XG4gIHZhciBjb250ZXh0U2l6ZSA9IFJlYWN0LnVzZUNvbnRleHQoU2l6ZUNvbnRleHQpO1xuICB2YXIgY29tcG9zZWRSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdpbnB1dC1zZWFyY2gnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgaW5wdXRQcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ2lucHV0JywgY3VzdG9taXplSW5wdXRQcmVmaXhDbHMpO1xuICB2YXIgX3VzZUNvbXBhY3RJdGVtQ29udGV4ID0gdXNlQ29tcGFjdEl0ZW1Db250ZXh0KHByZWZpeENscywgZGlyZWN0aW9uKSxcbiAgICBjb21wYWN0U2l6ZSA9IF91c2VDb21wYWN0SXRlbUNvbnRleC5jb21wYWN0U2l6ZTtcbiAgdmFyIHNpemUgPSBjb21wYWN0U2l6ZSB8fCBjdXN0b21pemVTaXplIHx8IGNvbnRleHRTaXplO1xuICB2YXIgaW5wdXRSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBvbkNoYW5nZSA9IGZ1bmN0aW9uIG9uQ2hhbmdlKGUpIHtcbiAgICBpZiAoZSAmJiBlLnRhcmdldCAmJiBlLnR5cGUgPT09ICdjbGljaycgJiYgY3VzdG9tT25TZWFyY2gpIHtcbiAgICAgIGN1c3RvbU9uU2VhcmNoKGUudGFyZ2V0LnZhbHVlLCBlKTtcbiAgICB9XG4gICAgaWYgKGN1c3RvbU9uQ2hhbmdlKSB7XG4gICAgICBjdXN0b21PbkNoYW5nZShlKTtcbiAgICB9XG4gIH07XG4gIHZhciBvbk1vdXNlRG93biA9IGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09ICgoX2EgPSBpbnB1dFJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaW5wdXQpKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9O1xuICB2YXIgb25TZWFyY2ggPSBmdW5jdGlvbiBvblNlYXJjaChlKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBpZiAoY3VzdG9tT25TZWFyY2gpIHtcbiAgICAgIGN1c3RvbU9uU2VhcmNoKChfYiA9IChfYSA9IGlucHV0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pbnB1dCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnZhbHVlLCBlKTtcbiAgICB9XG4gIH07XG4gIHZhciBvblByZXNzRW50ZXIgPSBmdW5jdGlvbiBvblByZXNzRW50ZXIoZSkge1xuICAgIGlmIChjb21wb3NlZFJlZi5jdXJyZW50IHx8IGxvYWRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgb25TZWFyY2goZSk7XG4gIH07XG4gIHZhciBzZWFyY2hJY29uID0gdHlwZW9mIGVudGVyQnV0dG9uID09PSAnYm9vbGVhbicgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTZWFyY2hPdXRsaW5lZCwgbnVsbCkgOiBudWxsO1xuICB2YXIgYnRuQ2xhc3NOYW1lID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1idXR0b25cIik7XG4gIHZhciBidXR0b247XG4gIHZhciBlbnRlckJ1dHRvbkFzRWxlbWVudCA9IGVudGVyQnV0dG9uIHx8IHt9O1xuICB2YXIgaXNBbnRkQnV0dG9uID0gZW50ZXJCdXR0b25Bc0VsZW1lbnQudHlwZSAmJiBlbnRlckJ1dHRvbkFzRWxlbWVudC50eXBlLl9fQU5UX0JVVFRPTiA9PT0gdHJ1ZTtcbiAgaWYgKGlzQW50ZEJ1dHRvbiB8fCBlbnRlckJ1dHRvbkFzRWxlbWVudC50eXBlID09PSAnYnV0dG9uJykge1xuICAgIGJ1dHRvbiA9IGNsb25lRWxlbWVudChlbnRlckJ1dHRvbkFzRWxlbWVudCwgX2V4dGVuZHMoe1xuICAgICAgb25Nb3VzZURvd246IG9uTW91c2VEb3duLFxuICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljayhlKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIChfYiA9IChfYSA9IGVudGVyQnV0dG9uQXNFbGVtZW50ID09PSBudWxsIHx8IGVudGVyQnV0dG9uQXNFbGVtZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbnRlckJ1dHRvbkFzRWxlbWVudC5wcm9wcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm9uQ2xpY2spID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hLCBlKTtcbiAgICAgICAgb25TZWFyY2goZSk7XG4gICAgICB9LFxuICAgICAga2V5OiAnZW50ZXJCdXR0b24nXG4gICAgfSwgaXNBbnRkQnV0dG9uID8ge1xuICAgICAgY2xhc3NOYW1lOiBidG5DbGFzc05hbWUsXG4gICAgICBzaXplOiBzaXplXG4gICAgfSA6IHt9KSk7XG4gIH0gZWxzZSB7XG4gICAgYnV0dG9uID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQnV0dG9uLCB7XG4gICAgICBjbGFzc05hbWU6IGJ0bkNsYXNzTmFtZSxcbiAgICAgIHR5cGU6IGVudGVyQnV0dG9uID8gJ3ByaW1hcnknIDogdW5kZWZpbmVkLFxuICAgICAgc2l6ZTogc2l6ZSxcbiAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgIGtleTogXCJlbnRlckJ1dHRvblwiLFxuICAgICAgb25Nb3VzZURvd246IG9uTW91c2VEb3duLFxuICAgICAgb25DbGljazogb25TZWFyY2gsXG4gICAgICBsb2FkaW5nOiBsb2FkaW5nLFxuICAgICAgaWNvbjogc2VhcmNoSWNvblxuICAgIH0sIGVudGVyQnV0dG9uKTtcbiAgfVxuICBpZiAoYWRkb25BZnRlcikge1xuICAgIGJ1dHRvbiA9IFtidXR0b24sIGNsb25lRWxlbWVudChhZGRvbkFmdGVyLCB7XG4gICAgICBrZXk6ICdhZGRvbkFmdGVyJ1xuICAgIH0pXTtcbiAgfVxuICB2YXIgY2xzID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoc2l6ZSksICEhc2l6ZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi13aXRoLWJ1dHRvblwiKSwgISFlbnRlckJ1dHRvbiksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lKTtcbiAgdmFyIGhhbmRsZU9uQ29tcG9zaXRpb25TdGFydCA9IGZ1bmN0aW9uIGhhbmRsZU9uQ29tcG9zaXRpb25TdGFydChlKSB7XG4gICAgY29tcG9zZWRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgb25Db21wb3NpdGlvblN0YXJ0ID09PSBudWxsIHx8IG9uQ29tcG9zaXRpb25TdGFydCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25Db21wb3NpdGlvblN0YXJ0KGUpO1xuICB9O1xuICB2YXIgaGFuZGxlT25Db21wb3NpdGlvbkVuZCA9IGZ1bmN0aW9uIGhhbmRsZU9uQ29tcG9zaXRpb25FbmQoZSkge1xuICAgIGNvbXBvc2VkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICBvbkNvbXBvc2l0aW9uRW5kID09PSBudWxsIHx8IG9uQ29tcG9zaXRpb25FbmQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ29tcG9zaXRpb25FbmQoZSk7XG4gIH07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJbnB1dCwgX2V4dGVuZHMoe1xuICAgIHJlZjogY29tcG9zZVJlZihpbnB1dFJlZiwgcmVmKSxcbiAgICBvblByZXNzRW50ZXI6IG9uUHJlc3NFbnRlclxuICB9LCByZXN0UHJvcHMsIHtcbiAgICBzaXplOiBzaXplLFxuICAgIG9uQ29tcG9zaXRpb25TdGFydDogaGFuZGxlT25Db21wb3NpdGlvblN0YXJ0LFxuICAgIG9uQ29tcG9zaXRpb25FbmQ6IGhhbmRsZU9uQ29tcG9zaXRpb25FbmQsXG4gICAgcHJlZml4Q2xzOiBpbnB1dFByZWZpeENscyxcbiAgICBhZGRvbkFmdGVyOiBidXR0b24sXG4gICAgc3VmZml4OiBzdWZmaXgsXG4gICAgb25DaGFuZ2U6IG9uQ2hhbmdlLFxuICAgIGNsYXNzTmFtZTogY2xzLFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZFxuICB9KSk7XG59KTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFNlYXJjaC5kaXNwbGF5TmFtZSA9ICdTZWFyY2gnO1xufVxuZXhwb3J0IGRlZmF1bHQgU2VhcmNoOyIsIi8vIFRoYW5rcyB0byBodHRwczovL2dpdGh1Yi5jb20vYW5kcmV5cG9wcC9yZWFjdC10ZXh0YXJlYS1hdXRvc2l6ZS9cbi8qKlxuICogY2FsY3VsYXRlTm9kZUhlaWdodCh1aVRleHROb2RlLCB1c2VDYWNoZSA9IGZhbHNlKVxuICovXG52YXIgSElEREVOX1RFWFRBUkVBX1NUWUxFID0gXCJcXG4gIG1pbi1oZWlnaHQ6MCAhaW1wb3J0YW50O1xcbiAgbWF4LWhlaWdodDpub25lICFpbXBvcnRhbnQ7XFxuICBoZWlnaHQ6MCAhaW1wb3J0YW50O1xcbiAgdmlzaWJpbGl0eTpoaWRkZW4gIWltcG9ydGFudDtcXG4gIG92ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50O1xcbiAgcG9zaXRpb246YWJzb2x1dGUgIWltcG9ydGFudDtcXG4gIHotaW5kZXg6LTEwMDAgIWltcG9ydGFudDtcXG4gIHRvcDowICFpbXBvcnRhbnQ7XFxuICByaWdodDowICFpbXBvcnRhbnQ7XFxuICBwb2ludGVyLWV2ZW50czogbm9uZSAhaW1wb3J0YW50O1xcblwiO1xudmFyIFNJWklOR19TVFlMRSA9IFsnbGV0dGVyLXNwYWNpbmcnLCAnbGluZS1oZWlnaHQnLCAncGFkZGluZy10b3AnLCAncGFkZGluZy1ib3R0b20nLCAnZm9udC1mYW1pbHknLCAnZm9udC13ZWlnaHQnLCAnZm9udC1zaXplJywgJ2ZvbnQtdmFyaWFudCcsICd0ZXh0LXJlbmRlcmluZycsICd0ZXh0LXRyYW5zZm9ybScsICd3aWR0aCcsICd0ZXh0LWluZGVudCcsICdwYWRkaW5nLWxlZnQnLCAncGFkZGluZy1yaWdodCcsICdib3JkZXItd2lkdGgnLCAnYm94LXNpemluZycsICd3b3JkLWJyZWFrJ107XG52YXIgY29tcHV0ZWRTdHlsZUNhY2hlID0ge307XG52YXIgaGlkZGVuVGV4dGFyZWE7XG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlTm9kZVN0eWxpbmcobm9kZSkge1xuICB2YXIgdXNlQ2FjaGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICB2YXIgbm9kZVJlZiA9IG5vZGUuZ2V0QXR0cmlidXRlKCdpZCcpIHx8IG5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXJlYWN0aWQnKSB8fCBub2RlLmdldEF0dHJpYnV0ZSgnbmFtZScpO1xuICBpZiAodXNlQ2FjaGUgJiYgY29tcHV0ZWRTdHlsZUNhY2hlW25vZGVSZWZdKSB7XG4gICAgcmV0dXJuIGNvbXB1dGVkU3R5bGVDYWNoZVtub2RlUmVmXTtcbiAgfVxuICB2YXIgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbiAgdmFyIGJveFNpemluZyA9IHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2JveC1zaXppbmcnKSB8fCBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctbW96LWJveC1zaXppbmcnKSB8fCBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctd2Via2l0LWJveC1zaXppbmcnKTtcbiAgdmFyIHBhZGRpbmdTaXplID0gcGFyc2VGbG9hdChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLWJvdHRvbScpKSArIHBhcnNlRmxvYXQoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgncGFkZGluZy10b3AnKSk7XG4gIHZhciBib3JkZXJTaXplID0gcGFyc2VGbG9hdChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdib3JkZXItYm90dG9tLXdpZHRoJykpICsgcGFyc2VGbG9hdChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdib3JkZXItdG9wLXdpZHRoJykpO1xuICB2YXIgc2l6aW5nU3R5bGUgPSBTSVpJTkdfU1RZTEUubWFwKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIFwiXCIuY29uY2F0KG5hbWUsIFwiOlwiKS5jb25jYXQoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKSk7XG4gIH0pLmpvaW4oJzsnKTtcbiAgdmFyIG5vZGVJbmZvID0ge1xuICAgIHNpemluZ1N0eWxlOiBzaXppbmdTdHlsZSxcbiAgICBwYWRkaW5nU2l6ZTogcGFkZGluZ1NpemUsXG4gICAgYm9yZGVyU2l6ZTogYm9yZGVyU2l6ZSxcbiAgICBib3hTaXppbmc6IGJveFNpemluZ1xuICB9O1xuICBpZiAodXNlQ2FjaGUgJiYgbm9kZVJlZikge1xuICAgIGNvbXB1dGVkU3R5bGVDYWNoZVtub2RlUmVmXSA9IG5vZGVJbmZvO1xuICB9XG4gIHJldHVybiBub2RlSW5mbztcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNhbGN1bGF0ZUF1dG9TaXplU3R5bGUodWlUZXh0Tm9kZSkge1xuICB2YXIgdXNlQ2FjaGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICB2YXIgbWluUm93cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDtcbiAgdmFyIG1heFJvd3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG4gIGlmICghaGlkZGVuVGV4dGFyZWEpIHtcbiAgICBoaWRkZW5UZXh0YXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7XG4gICAgaGlkZGVuVGV4dGFyZWEuc2V0QXR0cmlidXRlKCd0YWItaW5kZXgnLCAnLTEnKTtcbiAgICBoaWRkZW5UZXh0YXJlYS5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGhpZGRlblRleHRhcmVhKTtcbiAgfVxuICAvLyBGaXggd3JhcD1cIm9mZlwiIGlzc3VlXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzY1NzdcbiAgaWYgKHVpVGV4dE5vZGUuZ2V0QXR0cmlidXRlKCd3cmFwJykpIHtcbiAgICBoaWRkZW5UZXh0YXJlYS5zZXRBdHRyaWJ1dGUoJ3dyYXAnLCB1aVRleHROb2RlLmdldEF0dHJpYnV0ZSgnd3JhcCcpKTtcbiAgfSBlbHNlIHtcbiAgICBoaWRkZW5UZXh0YXJlYS5yZW1vdmVBdHRyaWJ1dGUoJ3dyYXAnKTtcbiAgfVxuICAvLyBDb3B5IGFsbCBDU1MgcHJvcGVydGllcyB0aGF0IGhhdmUgYW4gaW1wYWN0IG9uIHRoZSBoZWlnaHQgb2YgdGhlIGNvbnRlbnQgaW5cbiAgLy8gdGhlIHRleHRib3hcbiAgdmFyIF9jYWxjdWxhdGVOb2RlU3R5bGluZyA9IGNhbGN1bGF0ZU5vZGVTdHlsaW5nKHVpVGV4dE5vZGUsIHVzZUNhY2hlKSxcbiAgICBwYWRkaW5nU2l6ZSA9IF9jYWxjdWxhdGVOb2RlU3R5bGluZy5wYWRkaW5nU2l6ZSxcbiAgICBib3JkZXJTaXplID0gX2NhbGN1bGF0ZU5vZGVTdHlsaW5nLmJvcmRlclNpemUsXG4gICAgYm94U2l6aW5nID0gX2NhbGN1bGF0ZU5vZGVTdHlsaW5nLmJveFNpemluZyxcbiAgICBzaXppbmdTdHlsZSA9IF9jYWxjdWxhdGVOb2RlU3R5bGluZy5zaXppbmdTdHlsZTtcbiAgLy8gTmVlZCB0byBoYXZlIHRoZSBvdmVyZmxvdyBhdHRyaWJ1dGUgdG8gaGlkZSB0aGUgc2Nyb2xsYmFyIG90aGVyd2lzZVxuICAvLyB0ZXh0LWxpbmVzIHdpbGwgbm90IGNhbGN1bGF0ZWQgcHJvcGVybHkgYXMgdGhlIHNoYWRvdyB3aWxsIHRlY2huaWNhbGx5IGJlXG4gIC8vIG5hcnJvd2VyIGZvciBjb250ZW50XG4gIGhpZGRlblRleHRhcmVhLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBcIlwiLmNvbmNhdChzaXppbmdTdHlsZSwgXCI7XCIpLmNvbmNhdChISURERU5fVEVYVEFSRUFfU1RZTEUpKTtcbiAgaGlkZGVuVGV4dGFyZWEudmFsdWUgPSB1aVRleHROb2RlLnZhbHVlIHx8IHVpVGV4dE5vZGUucGxhY2Vob2xkZXIgfHwgJyc7XG4gIHZhciBtaW5IZWlnaHQgPSB1bmRlZmluZWQ7XG4gIHZhciBtYXhIZWlnaHQgPSB1bmRlZmluZWQ7XG4gIHZhciBvdmVyZmxvd1k7XG4gIHZhciBoZWlnaHQgPSBoaWRkZW5UZXh0YXJlYS5zY3JvbGxIZWlnaHQ7XG4gIGlmIChib3hTaXppbmcgPT09ICdib3JkZXItYm94Jykge1xuICAgIC8vIGJvcmRlci1ib3g6IGFkZCBib3JkZXIsIHNpbmNlIGhlaWdodCA9IGNvbnRlbnQgKyBwYWRkaW5nICsgYm9yZGVyXG4gICAgaGVpZ2h0ICs9IGJvcmRlclNpemU7XG4gIH0gZWxzZSBpZiAoYm94U2l6aW5nID09PSAnY29udGVudC1ib3gnKSB7XG4gICAgLy8gcmVtb3ZlIHBhZGRpbmcsIHNpbmNlIGhlaWdodCA9IGNvbnRlbnRcbiAgICBoZWlnaHQgLT0gcGFkZGluZ1NpemU7XG4gIH1cbiAgaWYgKG1pblJvd3MgIT09IG51bGwgfHwgbWF4Um93cyAhPT0gbnVsbCkge1xuICAgIC8vIG1lYXN1cmUgaGVpZ2h0IG9mIGEgdGV4dGFyZWEgd2l0aCBhIHNpbmdsZSByb3dcbiAgICBoaWRkZW5UZXh0YXJlYS52YWx1ZSA9ICcgJztcbiAgICB2YXIgc2luZ2xlUm93SGVpZ2h0ID0gaGlkZGVuVGV4dGFyZWEuc2Nyb2xsSGVpZ2h0IC0gcGFkZGluZ1NpemU7XG4gICAgaWYgKG1pblJvd3MgIT09IG51bGwpIHtcbiAgICAgIG1pbkhlaWdodCA9IHNpbmdsZVJvd0hlaWdodCAqIG1pblJvd3M7XG4gICAgICBpZiAoYm94U2l6aW5nID09PSAnYm9yZGVyLWJveCcpIHtcbiAgICAgICAgbWluSGVpZ2h0ID0gbWluSGVpZ2h0ICsgcGFkZGluZ1NpemUgKyBib3JkZXJTaXplO1xuICAgICAgfVxuICAgICAgaGVpZ2h0ID0gTWF0aC5tYXgobWluSGVpZ2h0LCBoZWlnaHQpO1xuICAgIH1cbiAgICBpZiAobWF4Um93cyAhPT0gbnVsbCkge1xuICAgICAgbWF4SGVpZ2h0ID0gc2luZ2xlUm93SGVpZ2h0ICogbWF4Um93cztcbiAgICAgIGlmIChib3hTaXppbmcgPT09ICdib3JkZXItYm94Jykge1xuICAgICAgICBtYXhIZWlnaHQgPSBtYXhIZWlnaHQgKyBwYWRkaW5nU2l6ZSArIGJvcmRlclNpemU7XG4gICAgICB9XG4gICAgICBvdmVyZmxvd1kgPSBoZWlnaHQgPiBtYXhIZWlnaHQgPyAnJyA6ICdoaWRkZW4nO1xuICAgICAgaGVpZ2h0ID0gTWF0aC5taW4obWF4SGVpZ2h0LCBoZWlnaHQpO1xuICAgIH1cbiAgfVxuICB2YXIgc3R5bGUgPSB7XG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgb3ZlcmZsb3dZOiBvdmVyZmxvd1ksXG4gICAgcmVzaXplOiAnbm9uZSdcbiAgfTtcbiAgaWYgKG1pbkhlaWdodCkge1xuICAgIHN0eWxlLm1pbkhlaWdodCA9IG1pbkhlaWdodDtcbiAgfVxuICBpZiAobWF4SGVpZ2h0KSB7XG4gICAgc3R5bGUubWF4SGVpZ2h0ID0gbWF4SGVpZ2h0O1xuICB9XG4gIHJldHVybiBzdHlsZTtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcInByZWZpeENsc1wiLCBcIm9uUHJlc3NFbnRlclwiLCBcImRlZmF1bHRWYWx1ZVwiLCBcInZhbHVlXCIsIFwiYXV0b1NpemVcIiwgXCJvblJlc2l6ZVwiLCBcImNsYXNzTmFtZVwiLCBcInN0eWxlXCIsIFwiZGlzYWJsZWRcIiwgXCJvbkNoYW5nZVwiLCBcIm9uSW50ZXJuYWxBdXRvU2l6ZVwiXTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZXNpemVPYnNlcnZlciBmcm9tICdyYy1yZXNpemUtb2JzZXJ2ZXInO1xuaW1wb3J0IHVzZUxheW91dEVmZmVjdCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG5pbXBvcnQgdXNlTWVyZ2VkU3RhdGUgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTWVyZ2VkU3RhdGVcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IGNhbGN1bGF0ZUF1dG9TaXplU3R5bGUgZnJvbSAnLi9jYWxjdWxhdGVOb2RlSGVpZ2h0JztcbnZhciBSRVNJWkVfU1RBUlQgPSAwO1xudmFyIFJFU0laRV9NRUFTVVJJTkcgPSAxO1xudmFyIFJFU0laRV9TVEFCTEUgPSAyO1xudmFyIFJlc2l6YWJsZVRleHRBcmVhID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIF9wcm9wcyRwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgcHJlZml4Q2xzID0gX3Byb3BzJHByZWZpeENscyA9PT0gdm9pZCAwID8gJ3JjLXRleHRhcmVhJyA6IF9wcm9wcyRwcmVmaXhDbHMsXG4gICAgb25QcmVzc0VudGVyID0gcHJvcHMub25QcmVzc0VudGVyLFxuICAgIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZSxcbiAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgIGF1dG9TaXplID0gcHJvcHMuYXV0b1NpemUsXG4gICAgb25SZXNpemUgPSBwcm9wcy5vblJlc2l6ZSxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgIG9uQ2hhbmdlID0gcHJvcHMub25DaGFuZ2UsXG4gICAgb25JbnRlcm5hbEF1dG9TaXplID0gcHJvcHMub25JbnRlcm5hbEF1dG9TaXplLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBWYWx1ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZU1lcmdlZFN0YXRlID0gdXNlTWVyZ2VkU3RhdGUoZGVmYXVsdFZhbHVlLCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBwb3N0U3RhdGU6IGZ1bmN0aW9uIHBvc3RTdGF0ZSh2YWwpIHtcbiAgICAgICAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHZvaWQgMCA/IHZhbCA6ICcnO1xuICAgICAgfVxuICAgIH0pLFxuICAgIF91c2VNZXJnZWRTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGUsIDIpLFxuICAgIG1lcmdlZFZhbHVlID0gX3VzZU1lcmdlZFN0YXRlMlswXSxcbiAgICBzZXRNZXJnZWRWYWx1ZSA9IF91c2VNZXJnZWRTdGF0ZTJbMV07XG4gIHZhciBvbkludGVybmFsQ2hhbmdlID0gZnVuY3Rpb24gb25JbnRlcm5hbENoYW5nZShldmVudCkge1xuICAgIHNldE1lcmdlZFZhbHVlKGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKGV2ZW50KTtcbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVmID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgdGV4dGFyZWFSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dEFyZWE6IHRleHRhcmVhUmVmLmN1cnJlbnRcbiAgICB9O1xuICB9KTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEF1dG9TaXplID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX1JlYWN0JHVzZU1lbW8gPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChhdXRvU2l6ZSAmJiBfdHlwZW9mKGF1dG9TaXplKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIFthdXRvU2l6ZS5taW5Sb3dzLCBhdXRvU2l6ZS5tYXhSb3dzXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9LCBbYXV0b1NpemVdKSxcbiAgICBfUmVhY3QkdXNlTWVtbzIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlTWVtbywgMiksXG4gICAgbWluUm93cyA9IF9SZWFjdCR1c2VNZW1vMlswXSxcbiAgICBtYXhSb3dzID0gX1JlYWN0JHVzZU1lbW8yWzFdO1xuICB2YXIgbmVlZEF1dG9TaXplID0gISFhdXRvU2l6ZTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTY3JvbGwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8yMTg3MFxuICB2YXIgZml4RmlyZWZveEF1dG9TY3JvbGwgPSBmdW5jdGlvbiBmaXhGaXJlZm94QXV0b1Njcm9sbCgpIHtcbiAgICB0cnkge1xuICAgICAgLy8gRkYgaGFzIGJ1ZyB3aXRoIGp1bXAgb2Ygc2Nyb2xsIHRvIHRvcC4gV2UgZm9yY2UgYmFjayBoZXJlLlxuICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRleHRhcmVhUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgdmFyIF90ZXh0YXJlYVJlZiRjdXJyZW50ID0gdGV4dGFyZWFSZWYuY3VycmVudCxcbiAgICAgICAgICBzZWxlY3Rpb25TdGFydCA9IF90ZXh0YXJlYVJlZiRjdXJyZW50LnNlbGVjdGlvblN0YXJ0LFxuICAgICAgICAgIHNlbGVjdGlvbkVuZCA9IF90ZXh0YXJlYVJlZiRjdXJyZW50LnNlbGVjdGlvbkVuZCxcbiAgICAgICAgICBzY3JvbGxUb3AgPSBfdGV4dGFyZWFSZWYkY3VycmVudC5zY3JvbGxUb3A7XG4gICAgICAgIC8vIEZpeCBTYWZhcmkgYnVnIHdoaWNoIG5vdCByb2xsYmFjayB3aGVuIGJyZWFrIGxpbmVcbiAgICAgICAgLy8gVGhpcyBtYWtlcyBDaGluZXNlIElNRSBjYW4ndCBpbnB1dC4gRG8gbm90IGZpeCB0aGlzXG4gICAgICAgIC8vIGNvbnN0IHsgdmFsdWU6IHRtcFZhbHVlIH0gPSB0ZXh0YXJlYVJlZi5jdXJyZW50O1xuICAgICAgICAvLyB0ZXh0YXJlYVJlZi5jdXJyZW50LnZhbHVlID0gJyc7XG4gICAgICAgIC8vIHRleHRhcmVhUmVmLmN1cnJlbnQudmFsdWUgPSB0bXBWYWx1ZTtcbiAgICAgICAgdGV4dGFyZWFSZWYuY3VycmVudC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTtcbiAgICAgICAgdGV4dGFyZWFSZWYuY3VycmVudC5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gRml4IGVycm9yIGluIENocm9tZTpcbiAgICAgIC8vIEZhaWxlZCB0byByZWFkIHRoZSAnc2VsZWN0aW9uU3RhcnQnIHByb3BlcnR5IGZyb20gJ0hUTUxJbnB1dEVsZW1lbnQnXG4gICAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcS8yMTE3NzQ4OS8zMDQwNjA1XG4gICAgfVxuICB9O1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlc2l6ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShSRVNJWkVfU1RBQkxFKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICByZXNpemVTdGF0ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0UmVzaXplU3RhdGUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKCksXG4gICAgX1JlYWN0JHVzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTMsIDIpLFxuICAgIGF1dG9TaXplU3R5bGUgPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgIHNldEF1dG9TaXplU3R5bGUgPSBfUmVhY3QkdXNlU3RhdGU0WzFdO1xuICB2YXIgc3RhcnRSZXNpemUgPSBmdW5jdGlvbiBzdGFydFJlc2l6ZSgpIHtcbiAgICBzZXRSZXNpemVTdGF0ZShSRVNJWkVfU1RBUlQpO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Rlc3QnKSB7XG4gICAgICBvbkludGVybmFsQXV0b1NpemUgPT09IG51bGwgfHwgb25JbnRlcm5hbEF1dG9TaXplID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkludGVybmFsQXV0b1NpemUoKTtcbiAgICB9XG4gIH07XG4gIC8vIENoYW5nZSB0byB0cmlnZ2VyIHJlc2l6ZSBtZWFzdXJlXG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG5lZWRBdXRvU2l6ZSkge1xuICAgICAgc3RhcnRSZXNpemUoKTtcbiAgICB9XG4gIH0sIFt2YWx1ZSwgbWluUm93cywgbWF4Um93cywgbmVlZEF1dG9TaXplXSk7XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHJlc2l6ZVN0YXRlID09PSBSRVNJWkVfU1RBUlQpIHtcbiAgICAgIHNldFJlc2l6ZVN0YXRlKFJFU0laRV9NRUFTVVJJTkcpO1xuICAgIH0gZWxzZSBpZiAocmVzaXplU3RhdGUgPT09IFJFU0laRV9NRUFTVVJJTkcpIHtcbiAgICAgIHZhciB0ZXh0YXJlYVN0eWxlcyA9IGNhbGN1bGF0ZUF1dG9TaXplU3R5bGUodGV4dGFyZWFSZWYuY3VycmVudCwgZmFsc2UsIG1pblJvd3MsIG1heFJvd3MpO1xuICAgICAgLy8gU2FmYXJpIGhhcyBidWcgdGhhdCB0ZXh0IHdpbGwga2VlcCBicmVhayBsaW5lIG9uIHRleHQgY3V0IHdoZW4gaXQncyBwcmV2IGlzIGJyZWFrIGxpbmUuXG4gICAgICAvLyBab21iaWVKOiBUaGlzIG5vdCBvZnRlbiBoYXBwZW4uIFNvIHdlIGp1c3Qgc2tpcCBpdC5cbiAgICAgIC8vIGNvbnN0IHsgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCwgc2Nyb2xsVG9wIH0gPSB0ZXh0YXJlYVJlZi5jdXJyZW50O1xuICAgICAgLy8gY29uc3QgeyB2YWx1ZTogdG1wVmFsdWUgfSA9IHRleHRhcmVhUmVmLmN1cnJlbnQ7XG4gICAgICAvLyB0ZXh0YXJlYVJlZi5jdXJyZW50LnZhbHVlID0gJyc7XG4gICAgICAvLyB0ZXh0YXJlYVJlZi5jdXJyZW50LnZhbHVlID0gdG1wVmFsdWU7XG4gICAgICAvLyBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGV4dGFyZWFSZWYuY3VycmVudCkge1xuICAgICAgLy8gICB0ZXh0YXJlYVJlZi5jdXJyZW50LnNjcm9sbFRvcCA9IHNjcm9sbFRvcDtcbiAgICAgIC8vICAgdGV4dGFyZWFSZWYuY3VycmVudC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTtcbiAgICAgIC8vIH1cbiAgICAgIHNldFJlc2l6ZVN0YXRlKFJFU0laRV9TVEFCTEUpO1xuICAgICAgc2V0QXV0b1NpemVTdHlsZSh0ZXh0YXJlYVN0eWxlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpeEZpcmVmb3hBdXRvU2Nyb2xsKCk7XG4gICAgfVxuICB9LCBbcmVzaXplU3RhdGVdKTtcbiAgLy8gV2UgbG9jayByZXNpemUgdHJpZ2dlciBieSByYWYgdG8gYXZvaWQgU2FmYXJpIHdhcm5pbmdcbiAgdmFyIHJlc2l6ZVJhZlJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICB2YXIgY2xlYW5SYWYgPSBmdW5jdGlvbiBjbGVhblJhZigpIHtcbiAgICByYWYuY2FuY2VsKHJlc2l6ZVJhZlJlZi5jdXJyZW50KTtcbiAgfTtcbiAgdmFyIG9uSW50ZXJuYWxSZXNpemUgPSBmdW5jdGlvbiBvbkludGVybmFsUmVzaXplKHNpemUpIHtcbiAgICBpZiAocmVzaXplU3RhdGUgPT09IFJFU0laRV9TVEFCTEUpIHtcbiAgICAgIG9uUmVzaXplID09PSBudWxsIHx8IG9uUmVzaXplID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvblJlc2l6ZShzaXplKTtcbiAgICAgIGlmIChhdXRvU2l6ZSkge1xuICAgICAgICBjbGVhblJhZigpO1xuICAgICAgICByZXNpemVSYWZSZWYuY3VycmVudCA9IHJhZihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc3RhcnRSZXNpemUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjbGVhblJhZjtcbiAgfSwgW10pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtZXJnZWRBdXRvU2l6ZVN0eWxlID0gbmVlZEF1dG9TaXplID8gYXV0b1NpemVTdHlsZSA6IG51bGw7XG4gIHZhciBtZXJnZWRTdHlsZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCBtZXJnZWRBdXRvU2l6ZVN0eWxlKTtcbiAgaWYgKHJlc2l6ZVN0YXRlID09PSBSRVNJWkVfU1RBUlQgfHwgcmVzaXplU3RhdGUgPT09IFJFU0laRV9NRUFTVVJJTkcpIHtcbiAgICBtZXJnZWRTdHlsZS5vdmVyZmxvd1kgPSAnaGlkZGVuJztcbiAgICBtZXJnZWRTdHlsZS5vdmVyZmxvd1ggPSAnaGlkZGVuJztcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVzaXplT2JzZXJ2ZXIsIHtcbiAgICBvblJlc2l6ZTogb25JbnRlcm5hbFJlc2l6ZSxcbiAgICBkaXNhYmxlZDogIShhdXRvU2l6ZSB8fCBvblJlc2l6ZSlcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiLCBfZXh0ZW5kcyh7fSwgcmVzdFByb3BzLCB7XG4gICAgcmVmOiB0ZXh0YXJlYVJlZixcbiAgICBzdHlsZTogbWVyZ2VkU3R5bGUsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKHByZWZpeENscywgY2xhc3NOYW1lLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWRcIiksIGRpc2FibGVkKSksXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgIHZhbHVlOiBtZXJnZWRWYWx1ZSxcbiAgICBvbkNoYW5nZTogb25JbnRlcm5hbENoYW5nZVxuICB9KSkpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBSZXNpemFibGVUZXh0QXJlYTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNcIjtcbmltcG9ydCBfY3JlYXRlU3VwZXIgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZVN1cGVyXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUmVzaXphYmxlVGV4dEFyZWEgZnJvbSAnLi9SZXNpemFibGVUZXh0QXJlYSc7XG52YXIgVGV4dEFyZWEgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFRleHRBcmVhLCBfUmVhY3QkQ29tcG9uZW50KTtcbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihUZXh0QXJlYSk7XG4gIGZ1bmN0aW9uIFRleHRBcmVhKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUZXh0QXJlYSk7XG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcyk7XG4gICAgX3RoaXMucmVzaXphYmxlVGV4dEFyZWEgPSB2b2lkIDA7XG4gICAgX3RoaXMuZm9jdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5yZXNpemFibGVUZXh0QXJlYS50ZXh0QXJlYS5mb2N1cygpO1xuICAgIH07XG4gICAgX3RoaXMuc2F2ZVRleHRBcmVhID0gZnVuY3Rpb24gKHJlc2l6YWJsZVRleHRBcmVhKSB7XG4gICAgICBfdGhpcy5yZXNpemFibGVUZXh0QXJlYSA9IHJlc2l6YWJsZVRleHRBcmVhO1xuICAgIH07XG4gICAgX3RoaXMuaGFuZGxlQ2hhbmdlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBvbkNoYW5nZSA9IF90aGlzLnByb3BzLm9uQ2hhbmdlO1xuICAgICAgX3RoaXMuc2V0VmFsdWUoZS50YXJnZXQudmFsdWUpO1xuICAgICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICAgIG9uQ2hhbmdlKGUpO1xuICAgICAgfVxuICAgIH07XG4gICAgX3RoaXMuaGFuZGxlS2V5RG93biA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgb25QcmVzc0VudGVyID0gX3RoaXMkcHJvcHMub25QcmVzc0VudGVyLFxuICAgICAgICBvbktleURvd24gPSBfdGhpcyRwcm9wcy5vbktleURvd247XG4gICAgICBpZiAoZS5rZXlDb2RlID09PSAxMyAmJiBvblByZXNzRW50ZXIpIHtcbiAgICAgICAgb25QcmVzc0VudGVyKGUpO1xuICAgICAgfVxuICAgICAgaWYgKG9uS2V5RG93bikge1xuICAgICAgICBvbktleURvd24oZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgdmFsdWUgPSB0eXBlb2YgcHJvcHMudmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IHByb3BzLnZhbHVlID09PSBudWxsID8gcHJvcHMuZGVmYXVsdFZhbHVlIDogcHJvcHMudmFsdWU7XG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICB2YWx1ZTogdmFsdWVcbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICBfY3JlYXRlQ2xhc3MoVGV4dEFyZWEsIFt7XG4gICAga2V5OiBcInNldFZhbHVlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFZhbHVlKHZhbHVlLCBjYWxsYmFjaykge1xuICAgICAgaWYgKCEoJ3ZhbHVlJyBpbiB0aGlzLnByb3BzKSkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfSwgY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJibHVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJsdXIoKSB7XG4gICAgICB0aGlzLnJlc2l6YWJsZVRleHRBcmVhLnRleHRBcmVhLmJsdXIoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZXNpemFibGVUZXh0QXJlYSwgX2V4dGVuZHMoe30sIHRoaXMucHJvcHMsIHtcbiAgICAgICAgdmFsdWU6IHRoaXMuc3RhdGUudmFsdWUsXG4gICAgICAgIG9uS2V5RG93bjogdGhpcy5oYW5kbGVLZXlEb3duLFxuICAgICAgICBvbkNoYW5nZTogdGhpcy5oYW5kbGVDaGFuZ2UsXG4gICAgICAgIHJlZjogdGhpcy5zYXZlVGV4dEFyZWFcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKG5leHRQcm9wcykge1xuICAgICAgaWYgKCd2YWx1ZScgaW4gbmV4dFByb3BzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmFsdWU6IG5leHRQcm9wcy52YWx1ZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBUZXh0QXJlYTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcbmV4cG9ydCB7IFJlc2l6YWJsZVRleHRBcmVhIH07XG5leHBvcnQgZGVmYXVsdCBUZXh0QXJlYTsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c1wiO1xuaW1wb3J0IF9jcmVhdGVTdXBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlU3VwZXJcIjtcbmltcG9ydCBDbG9zZUNpcmNsZUZpbGxlZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvQ2xvc2VDaXJjbGVGaWxsZWRcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgRm9ybUl0ZW1JbnB1dENvbnRleHQgfSBmcm9tICcuLi9mb3JtL2NvbnRleHQnO1xuaW1wb3J0IHsgY2xvbmVFbGVtZW50IH0gZnJvbSAnLi4vX3V0aWwvcmVhY3ROb2RlJztcbmltcG9ydCB7IGdldE1lcmdlZFN0YXR1cywgZ2V0U3RhdHVzQ2xhc3NOYW1lcyB9IGZyb20gJy4uL191dGlsL3N0YXR1c1V0aWxzJztcbmltcG9ydCB7IHR1cGxlIH0gZnJvbSAnLi4vX3V0aWwvdHlwZSc7XG52YXIgQ2xlYXJhYmxlSW5wdXRUeXBlID0gdHVwbGUoJ3RleHQnLCAnaW5wdXQnKTtcbmZ1bmN0aW9uIGhhc0FkZG9uKHByb3BzKSB7XG4gIHJldHVybiAhIShwcm9wcy5hZGRvbkJlZm9yZSB8fCBwcm9wcy5hZGRvbkFmdGVyKTtcbn1cbnZhciBDbGVhcmFibGVMYWJlbGVkSW5wdXQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKENsZWFyYWJsZUxhYmVsZWRJbnB1dCwgX1JlYWN0JENvbXBvbmVudCk7XG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoQ2xlYXJhYmxlTGFiZWxlZElucHV0KTtcbiAgZnVuY3Rpb24gQ2xlYXJhYmxlTGFiZWxlZElucHV0KCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDbGVhcmFibGVMYWJlbGVkSW5wdXQpO1xuICAgIHJldHVybiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuICBfY3JlYXRlQ2xhc3MoQ2xlYXJhYmxlTGFiZWxlZElucHV0LCBbe1xuICAgIGtleTogXCJyZW5kZXJDbGVhckljb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyQ2xlYXJJY29uKHByZWZpeENscykge1xuICAgICAgdmFyIF9jbGFzc05hbWVzO1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgdmFsdWUgPSBfdGhpcyRwcm9wcy52YWx1ZSxcbiAgICAgICAgZGlzYWJsZWQgPSBfdGhpcyRwcm9wcy5kaXNhYmxlZCxcbiAgICAgICAgcmVhZE9ubHkgPSBfdGhpcyRwcm9wcy5yZWFkT25seSxcbiAgICAgICAgaGFuZGxlUmVzZXQgPSBfdGhpcyRwcm9wcy5oYW5kbGVSZXNldCxcbiAgICAgICAgc3VmZml4ID0gX3RoaXMkcHJvcHMuc3VmZml4O1xuICAgICAgdmFyIG5lZWRDbGVhciA9ICFkaXNhYmxlZCAmJiAhcmVhZE9ubHkgJiYgdmFsdWU7XG4gICAgICB2YXIgY2xhc3NOYW1lID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jbGVhci1pY29uXCIpO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENsb3NlQ2lyY2xlRmlsbGVkLCB7XG4gICAgICAgIG9uQ2xpY2s6IGhhbmRsZVJlc2V0LFxuICAgICAgICAvLyBEbyBub3QgdHJpZ2dlciBvbkJsdXIgd2hlbiBjbGVhciBpbnB1dFxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8zMTIwMFxuICAgICAgICBvbk1vdXNlRG93bjogZnVuY3Rpb24gb25Nb3VzZURvd24oZSkge1xuICAgICAgICAgIHJldHVybiBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0sXG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcygoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChjbGFzc05hbWUsIFwiLWhpZGRlblwiKSwgIW5lZWRDbGVhciksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQoY2xhc3NOYW1lLCBcIi1oYXMtc3VmZml4XCIpLCAhIXN1ZmZpeCksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lKSxcbiAgICAgICAgcm9sZTogXCJidXR0b25cIlxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclRleHRBcmVhV2l0aENsZWFySWNvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJUZXh0QXJlYVdpdGhDbGVhckljb24ocHJlZml4Q2xzLCBlbGVtZW50LCBzdGF0dXNDb250ZXh0KSB7XG4gICAgICB2YXIgX2NsYXNzTmFtZXMyO1xuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgIHZhbHVlID0gX3RoaXMkcHJvcHMyLnZhbHVlLFxuICAgICAgICBhbGxvd0NsZWFyID0gX3RoaXMkcHJvcHMyLmFsbG93Q2xlYXIsXG4gICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzMi5jbGFzc05hbWUsXG4gICAgICAgIHN0eWxlID0gX3RoaXMkcHJvcHMyLnN0eWxlLFxuICAgICAgICBkaXJlY3Rpb24gPSBfdGhpcyRwcm9wczIuZGlyZWN0aW9uLFxuICAgICAgICBib3JkZXJlZCA9IF90aGlzJHByb3BzMi5ib3JkZXJlZCxcbiAgICAgICAgaGlkZGVuID0gX3RoaXMkcHJvcHMyLmhpZGRlbixcbiAgICAgICAgY3VzdG9tU3RhdHVzID0gX3RoaXMkcHJvcHMyLnN0YXR1cztcbiAgICAgIHZhciBjb250ZXh0U3RhdHVzID0gc3RhdHVzQ29udGV4dC5zdGF0dXMsXG4gICAgICAgIGhhc0ZlZWRiYWNrID0gc3RhdHVzQ29udGV4dC5oYXNGZWVkYmFjaztcbiAgICAgIGlmICghYWxsb3dDbGVhcikge1xuICAgICAgICByZXR1cm4gY2xvbmVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB2YXIgYWZmaXhXcmFwcGVyQ2xzID0gY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFmZml4LXdyYXBwZXJcIiksIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYWZmaXgtd3JhcHBlci10ZXh0YXJlYS13aXRoLWNsZWFyLWJ0blwiKSwgZ2V0U3RhdHVzQ2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFmZml4LXdyYXBwZXJcIiksIGdldE1lcmdlZFN0YXR1cyhjb250ZXh0U3RhdHVzLCBjdXN0b21TdGF0dXMpLCBoYXNGZWVkYmFjayksIChfY2xhc3NOYW1lczIgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hZmZpeC13cmFwcGVyLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYWZmaXgtd3JhcHBlci1ib3JkZXJsZXNzXCIpLCAhYm9yZGVyZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChjbGFzc05hbWUpLCAhaGFzQWRkb24odGhpcy5wcm9wcykgJiYgY2xhc3NOYW1lKSwgX2NsYXNzTmFtZXMyKSk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBhZmZpeFdyYXBwZXJDbHMsXG4gICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgaGlkZGVuOiBoaWRkZW5cbiAgICAgIH0sIGNsb25lRWxlbWVudChlbGVtZW50LCB7XG4gICAgICAgIHN0eWxlOiBudWxsLFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0pLCB0aGlzLnJlbmRlckNsZWFySWNvbihwcmVmaXhDbHMpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRm9ybUl0ZW1JbnB1dENvbnRleHQuQ29uc3VtZXIsIG51bGwsIGZ1bmN0aW9uIChzdGF0dXNDb250ZXh0KSB7XG4gICAgICAgIHZhciBfdGhpcyRwcm9wczMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wczMucHJlZml4Q2xzLFxuICAgICAgICAgIGlucHV0VHlwZSA9IF90aGlzJHByb3BzMy5pbnB1dFR5cGUsXG4gICAgICAgICAgZWxlbWVudCA9IF90aGlzJHByb3BzMy5lbGVtZW50O1xuICAgICAgICBpZiAoaW5wdXRUeXBlID09PSBDbGVhcmFibGVJbnB1dFR5cGVbMF0pIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMucmVuZGVyVGV4dEFyZWFXaXRoQ2xlYXJJY29uKHByZWZpeENscywgZWxlbWVudCwgc3RhdHVzQ29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQ2xlYXJhYmxlTGFiZWxlZElucHV0O1xufShSZWFjdC5Db21wb25lbnQpO1xuZXhwb3J0IGRlZmF1bHQgQ2xlYXJhYmxlTGFiZWxlZElucHV0OyIsImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBSY1RleHRBcmVhIGZyb20gJ3JjLXRleHRhcmVhJztcbmltcG9ydCB1c2VNZXJnZWRTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZXJnZWRTdGF0ZVwiO1xuaW1wb3J0IG9taXQgZnJvbSBcInJjLXV0aWwvZXMvb21pdFwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgRGlzYWJsZWRDb250ZXh0IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlci9EaXNhYmxlZENvbnRleHQnO1xuaW1wb3J0IFNpemVDb250ZXh0IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlci9TaXplQ29udGV4dCc7XG5pbXBvcnQgeyBGb3JtSXRlbUlucHV0Q29udGV4dCB9IGZyb20gJy4uL2Zvcm0vY29udGV4dCc7XG5pbXBvcnQgeyBnZXRNZXJnZWRTdGF0dXMsIGdldFN0YXR1c0NsYXNzTmFtZXMgfSBmcm9tICcuLi9fdXRpbC9zdGF0dXNVdGlscyc7XG5pbXBvcnQgQ2xlYXJhYmxlTGFiZWxlZElucHV0IGZyb20gJy4vQ2xlYXJhYmxlTGFiZWxlZElucHV0JztcbmltcG9ydCB7IGZpeENvbnRyb2xsZWRWYWx1ZSwgcmVzb2x2ZU9uQ2hhbmdlLCB0cmlnZ2VyRm9jdXMgfSBmcm9tICcuL0lucHV0JztcbmZ1bmN0aW9uIGZpeEVtb2ppTGVuZ3RoKHZhbHVlLCBtYXhMZW5ndGgpIHtcbiAgcmV0dXJuIF90b0NvbnN1bWFibGVBcnJheSh2YWx1ZSB8fCAnJykuc2xpY2UoMCwgbWF4TGVuZ3RoKS5qb2luKCcnKTtcbn1cbmZ1bmN0aW9uIHNldFRyaWdnZXJWYWx1ZShpc0N1cnNvckluRW5kLCBwcmVWYWx1ZSwgdHJpZ2dlclZhbHVlLCBtYXhMZW5ndGgpIHtcbiAgdmFyIG5ld1RyaWdnZXJWYWx1ZSA9IHRyaWdnZXJWYWx1ZTtcbiAgaWYgKGlzQ3Vyc29ySW5FbmQpIHtcbiAgICAvLyDlhYnmoIflnKjlsL7pg6jvvIznm7TmjqXmiKrmlq1cbiAgICBuZXdUcmlnZ2VyVmFsdWUgPSBmaXhFbW9qaUxlbmd0aCh0cmlnZ2VyVmFsdWUsIG1heExlbmd0aCk7XG4gIH0gZWxzZSBpZiAoX3RvQ29uc3VtYWJsZUFycmF5KHByZVZhbHVlIHx8ICcnKS5sZW5ndGggPCB0cmlnZ2VyVmFsdWUubGVuZ3RoICYmIF90b0NvbnN1bWFibGVBcnJheSh0cmlnZ2VyVmFsdWUgfHwgJycpLmxlbmd0aCA+IG1heExlbmd0aCkge1xuICAgIC8vIOWFieagh+WcqOS4remXtO+8jOWmguaenOacgOWQjueahOWAvOi2hei/h+acgOWkp+WAvO+8jOWImemHh+eUqOWOn+WFiOeahOWAvFxuICAgIG5ld1RyaWdnZXJWYWx1ZSA9IHByZVZhbHVlO1xuICB9XG4gIHJldHVybiBuZXdUcmlnZ2VyVmFsdWU7XG59XG52YXIgVGV4dEFyZWEgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAoX2EsIHJlZikge1xuICB2YXIgX2NsYXNzTmFtZXM7XG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBfYS5wcmVmaXhDbHMsXG4gICAgX2EkYm9yZGVyZWQgPSBfYS5ib3JkZXJlZCxcbiAgICBib3JkZXJlZCA9IF9hJGJvcmRlcmVkID09PSB2b2lkIDAgPyB0cnVlIDogX2EkYm9yZGVyZWQsXG4gICAgX2Ekc2hvd0NvdW50ID0gX2Euc2hvd0NvdW50LFxuICAgIHNob3dDb3VudCA9IF9hJHNob3dDb3VudCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYSRzaG93Q291bnQsXG4gICAgbWF4TGVuZ3RoID0gX2EubWF4TGVuZ3RoLFxuICAgIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZSxcbiAgICBzdHlsZSA9IF9hLnN0eWxlLFxuICAgIGN1c3RvbWl6ZVNpemUgPSBfYS5zaXplLFxuICAgIGN1c3RvbURpc2FibGVkID0gX2EuZGlzYWJsZWQsXG4gICAgb25Db21wb3NpdGlvblN0YXJ0ID0gX2Eub25Db21wb3NpdGlvblN0YXJ0LFxuICAgIG9uQ29tcG9zaXRpb25FbmQgPSBfYS5vbkNvbXBvc2l0aW9uRW5kLFxuICAgIG9uQ2hhbmdlID0gX2Eub25DaGFuZ2UsXG4gICAgY3VzdG9tU3RhdHVzID0gX2Euc3RhdHVzLFxuICAgIHByb3BzID0gX19yZXN0KF9hLCBbXCJwcmVmaXhDbHNcIiwgXCJib3JkZXJlZFwiLCBcInNob3dDb3VudFwiLCBcIm1heExlbmd0aFwiLCBcImNsYXNzTmFtZVwiLCBcInN0eWxlXCIsIFwic2l6ZVwiLCBcImRpc2FibGVkXCIsIFwib25Db21wb3NpdGlvblN0YXJ0XCIsIFwib25Db21wb3NpdGlvbkVuZFwiLCBcIm9uQ2hhbmdlXCIsIFwic3RhdHVzXCJdKTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuICB2YXIgc2l6ZSA9IFJlYWN0LnVzZUNvbnRleHQoU2l6ZUNvbnRleHQpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gRGlzYWJsZWQgPT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBkaXNhYmxlZCA9IFJlYWN0LnVzZUNvbnRleHQoRGlzYWJsZWRDb250ZXh0KTtcbiAgdmFyIG1lcmdlZERpc2FibGVkID0gY3VzdG9tRGlzYWJsZWQgIT09IG51bGwgJiYgY3VzdG9tRGlzYWJsZWQgIT09IHZvaWQgMCA/IGN1c3RvbURpc2FibGVkIDogZGlzYWJsZWQ7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dDIgPSBSZWFjdC51c2VDb250ZXh0KEZvcm1JdGVtSW5wdXRDb250ZXh0KSxcbiAgICBjb250ZXh0U3RhdHVzID0gX1JlYWN0JHVzZUNvbnRleHQyLnN0YXR1cyxcbiAgICBoYXNGZWVkYmFjayA9IF9SZWFjdCR1c2VDb250ZXh0Mi5oYXNGZWVkYmFjayxcbiAgICBpc0Zvcm1JdGVtSW5wdXQgPSBfUmVhY3QkdXNlQ29udGV4dDIuaXNGb3JtSXRlbUlucHV0LFxuICAgIGZlZWRiYWNrSWNvbiA9IF9SZWFjdCR1c2VDb250ZXh0Mi5mZWVkYmFja0ljb247XG4gIHZhciBtZXJnZWRTdGF0dXMgPSBnZXRNZXJnZWRTdGF0dXMoY29udGV4dFN0YXR1cywgY3VzdG9tU3RhdHVzKTtcbiAgdmFyIGlubmVyUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB2YXIgY2xlYXJhYmxlSW5wdXRSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShmYWxzZSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgY29tcG9zaXRpbmcgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldENvbXBvc2l0aW5nID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIG9sZENvbXBvc2l0aW9uVmFsdWVSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgdmFyIG9sZFNlbGVjdGlvblN0YXJ0UmVmID0gUmVhY3QudXNlUmVmKDApO1xuICB2YXIgX3VzZU1lcmdlZFN0YXRlID0gdXNlTWVyZ2VkU3RhdGUocHJvcHMuZGVmYXVsdFZhbHVlLCB7XG4gICAgICB2YWx1ZTogcHJvcHMudmFsdWVcbiAgICB9KSxcbiAgICBfdXNlTWVyZ2VkU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZU1lcmdlZFN0YXRlLCAyKSxcbiAgICB2YWx1ZSA9IF91c2VNZXJnZWRTdGF0ZTJbMF0sXG4gICAgc2V0VmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzFdO1xuICB2YXIgaGlkZGVuID0gcHJvcHMuaGlkZGVuO1xuICB2YXIgaGFuZGxlU2V0VmFsdWUgPSBmdW5jdGlvbiBoYW5kbGVTZXRWYWx1ZSh2YWwsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHByb3BzLnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHNldFZhbHVlKHZhbCk7XG4gICAgICBjYWxsYmFjayA9PT0gbnVsbCB8fCBjYWxsYmFjayA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2FsbGJhY2soKTtcbiAgICB9XG4gIH07XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBWYWx1ZSBVcGRhdGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE1heCBsZW5ndGggdmFsdWVcbiAgdmFyIGhhc01heExlbmd0aCA9IE51bWJlcihtYXhMZW5ndGgpID4gMDtcbiAgdmFyIG9uSW50ZXJuYWxDb21wb3NpdGlvblN0YXJ0ID0gZnVuY3Rpb24gb25JbnRlcm5hbENvbXBvc2l0aW9uU3RhcnQoZSkge1xuICAgIHNldENvbXBvc2l0aW5nKHRydWUpO1xuICAgIC8vIOaLvOmfs+i+k+WFpeWJjeS/neWtmOS4gOS7veaXp+WAvFxuICAgIG9sZENvbXBvc2l0aW9uVmFsdWVSZWYuY3VycmVudCA9IHZhbHVlO1xuICAgIC8vIOS/neWtmOaXp+eahOWFieagh+S9jee9rlxuICAgIG9sZFNlbGVjdGlvblN0YXJ0UmVmLmN1cnJlbnQgPSBlLmN1cnJlbnRUYXJnZXQuc2VsZWN0aW9uU3RhcnQ7XG4gICAgb25Db21wb3NpdGlvblN0YXJ0ID09PSBudWxsIHx8IG9uQ29tcG9zaXRpb25TdGFydCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25Db21wb3NpdGlvblN0YXJ0KGUpO1xuICB9O1xuICB2YXIgb25JbnRlcm5hbENvbXBvc2l0aW9uRW5kID0gZnVuY3Rpb24gb25JbnRlcm5hbENvbXBvc2l0aW9uRW5kKGUpIHtcbiAgICB2YXIgX2E7XG4gICAgc2V0Q29tcG9zaXRpbmcoZmFsc2UpO1xuICAgIHZhciB0cmlnZ2VyVmFsdWUgPSBlLmN1cnJlbnRUYXJnZXQudmFsdWU7XG4gICAgaWYgKGhhc01heExlbmd0aCkge1xuICAgICAgdmFyIGlzQ3Vyc29ySW5FbmQgPSBvbGRTZWxlY3Rpb25TdGFydFJlZi5jdXJyZW50ID49IG1heExlbmd0aCArIDEgfHwgb2xkU2VsZWN0aW9uU3RhcnRSZWYuY3VycmVudCA9PT0gKChfYSA9IG9sZENvbXBvc2l0aW9uVmFsdWVSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCk7XG4gICAgICB0cmlnZ2VyVmFsdWUgPSBzZXRUcmlnZ2VyVmFsdWUoaXNDdXJzb3JJbkVuZCwgb2xkQ29tcG9zaXRpb25WYWx1ZVJlZi5jdXJyZW50LCB0cmlnZ2VyVmFsdWUsIG1heExlbmd0aCk7XG4gICAgfVxuICAgIC8vIFBhdGNoIGNvbXBvc2l0aW9uIG9uQ2hhbmdlIHdoZW4gdmFsdWUgY2hhbmdlZFxuICAgIGlmICh0cmlnZ2VyVmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICBoYW5kbGVTZXRWYWx1ZSh0cmlnZ2VyVmFsdWUpO1xuICAgICAgcmVzb2x2ZU9uQ2hhbmdlKGUuY3VycmVudFRhcmdldCwgZSwgb25DaGFuZ2UsIHRyaWdnZXJWYWx1ZSk7XG4gICAgfVxuICAgIG9uQ29tcG9zaXRpb25FbmQgPT09IG51bGwgfHwgb25Db21wb3NpdGlvbkVuZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25Db21wb3NpdGlvbkVuZChlKTtcbiAgfTtcbiAgdmFyIGhhbmRsZUNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUNoYW5nZShlKSB7XG4gICAgdmFyIHRyaWdnZXJWYWx1ZSA9IGUudGFyZ2V0LnZhbHVlO1xuICAgIGlmICghY29tcG9zaXRpbmcgJiYgaGFzTWF4TGVuZ3RoKSB7XG4gICAgICAvLyAxLiDlpI3liLbnspjotLTotoXov4dtYXhsZW5ndGjnmoTmg4XlhrUgMi7mnKrotoXov4dtYXhsZW5ndGjnmoTmg4XlhrVcbiAgICAgIHZhciBpc0N1cnNvckluRW5kID0gZS50YXJnZXQuc2VsZWN0aW9uU3RhcnQgPj0gbWF4TGVuZ3RoICsgMSB8fCBlLnRhcmdldC5zZWxlY3Rpb25TdGFydCA9PT0gdHJpZ2dlclZhbHVlLmxlbmd0aCB8fCAhZS50YXJnZXQuc2VsZWN0aW9uU3RhcnQ7XG4gICAgICB0cmlnZ2VyVmFsdWUgPSBzZXRUcmlnZ2VyVmFsdWUoaXNDdXJzb3JJbkVuZCwgdmFsdWUsIHRyaWdnZXJWYWx1ZSwgbWF4TGVuZ3RoKTtcbiAgICB9XG4gICAgaGFuZGxlU2V0VmFsdWUodHJpZ2dlclZhbHVlKTtcbiAgICByZXNvbHZlT25DaGFuZ2UoZS5jdXJyZW50VGFyZ2V0LCBlLCBvbkNoYW5nZSwgdHJpZ2dlclZhbHVlKTtcbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlc2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGhhbmRsZVJlc2V0ID0gZnVuY3Rpb24gaGFuZGxlUmVzZXQoZSkge1xuICAgIHZhciBfYSwgX2IsIF9jO1xuICAgIGhhbmRsZVNldFZhbHVlKCcnKTtcbiAgICAoX2EgPSBpbm5lclJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZm9jdXMoKTtcbiAgICByZXNvbHZlT25DaGFuZ2UoKF9jID0gKF9iID0gaW5uZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnJlc2l6YWJsZVRleHRBcmVhKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MudGV4dEFyZWEsIGUsIG9uQ2hhbmdlKTtcbiAgfTtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygnaW5wdXQnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzaXphYmxlVGV4dEFyZWE6IChfYSA9IGlubmVyUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5yZXNpemFibGVUZXh0QXJlYSxcbiAgICAgIGZvY3VzOiBmdW5jdGlvbiBmb2N1cyhvcHRpb24pIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgdHJpZ2dlckZvY3VzKChfYiA9IChfYSA9IGlubmVyUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5yZXNpemFibGVUZXh0QXJlYSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnRleHRBcmVhLCBvcHRpb24pO1xuICAgICAgfSxcbiAgICAgIGJsdXI6IGZ1bmN0aW9uIGJsdXIoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIChfYSA9IGlubmVyUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ibHVyKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG4gIHZhciB0ZXh0QXJlYSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJjVGV4dEFyZWEsIF9leHRlbmRzKHt9LCBvbWl0KHByb3BzLCBbJ2FsbG93Q2xlYXInXSksIHtcbiAgICBkaXNhYmxlZDogbWVyZ2VkRGlzYWJsZWQsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYm9yZGVybGVzc1wiKSwgIWJvcmRlcmVkKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBjbGFzc05hbWUsIGNsYXNzTmFtZSAmJiAhc2hvd0NvdW50KSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNtXCIpLCBzaXplID09PSAnc21hbGwnIHx8IGN1c3RvbWl6ZVNpemUgPT09ICdzbWFsbCcpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbGdcIiksIHNpemUgPT09ICdsYXJnZScgfHwgY3VzdG9taXplU2l6ZSA9PT0gJ2xhcmdlJyksIF9jbGFzc05hbWVzKSwgZ2V0U3RhdHVzQ2xhc3NOYW1lcyhwcmVmaXhDbHMsIG1lcmdlZFN0YXR1cykpLFxuICAgIHN0eWxlOiBzaG93Q291bnQgPyB7XG4gICAgICByZXNpemU6IHN0eWxlID09PSBudWxsIHx8IHN0eWxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHlsZS5yZXNpemVcbiAgICB9IDogc3R5bGUsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgb25Db21wb3NpdGlvblN0YXJ0OiBvbkludGVybmFsQ29tcG9zaXRpb25TdGFydCxcbiAgICBvbkNoYW5nZTogaGFuZGxlQ2hhbmdlLFxuICAgIG9uQ29tcG9zaXRpb25FbmQ6IG9uSW50ZXJuYWxDb21wb3NpdGlvbkVuZCxcbiAgICByZWY6IGlubmVyUmVmXG4gIH0pKTtcbiAgdmFyIHZhbCA9IGZpeENvbnRyb2xsZWRWYWx1ZSh2YWx1ZSk7XG4gIGlmICghY29tcG9zaXRpbmcgJiYgaGFzTWF4TGVuZ3RoICYmIChwcm9wcy52YWx1ZSA9PT0gbnVsbCB8fCBwcm9wcy52YWx1ZSA9PT0gdW5kZWZpbmVkKSkge1xuICAgIC8vIGZpeCAjMjc2MTIg5bCGdmFsdWXovazkuLrmlbDnu4Tov5vooYzmiKrlj5bvvIzop6PlhrMgJ/CfmIInLmxlbmd0aCA9PT0gMiDnrYllbW9qaeihqOaDheWvvOiHtOeahOaIquWPluS5seeggeeahOmXrumimFxuICAgIHZhbCA9IGZpeEVtb2ppTGVuZ3RoKHZhbCwgbWF4TGVuZ3RoKTtcbiAgfVxuICAvLyBUZXh0QXJlYVxuICB2YXIgdGV4dGFyZWFOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2xlYXJhYmxlTGFiZWxlZElucHV0LCBfZXh0ZW5kcyh7XG4gICAgZGlzYWJsZWQ6IG1lcmdlZERpc2FibGVkXG4gIH0sIHByb3BzLCB7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uOiBkaXJlY3Rpb24sXG4gICAgaW5wdXRUeXBlOiBcInRleHRcIixcbiAgICB2YWx1ZTogdmFsLFxuICAgIGVsZW1lbnQ6IHRleHRBcmVhLFxuICAgIGhhbmRsZVJlc2V0OiBoYW5kbGVSZXNldCxcbiAgICByZWY6IGNsZWFyYWJsZUlucHV0UmVmLFxuICAgIGJvcmRlcmVkOiBib3JkZXJlZCxcbiAgICBzdGF0dXM6IGN1c3RvbVN0YXR1cyxcbiAgICBzdHlsZTogc2hvd0NvdW50ID8gdW5kZWZpbmVkIDogc3R5bGVcbiAgfSkpO1xuICAvLyBPbmx5IHNob3cgdGV4dCBhcmVhIHdyYXBwZXIgd2hlbiBuZWVkZWRcbiAgaWYgKHNob3dDb3VudCB8fCBoYXNGZWVkYmFjaykge1xuICAgIHZhciBfY2xhc3NOYW1lczI7XG4gICAgdmFyIHZhbHVlTGVuZ3RoID0gX3RvQ29uc3VtYWJsZUFycmF5KHZhbCkubGVuZ3RoO1xuICAgIHZhciBkYXRhQ291bnQgPSAnJztcbiAgICBpZiAoX3R5cGVvZihzaG93Q291bnQpID09PSAnb2JqZWN0Jykge1xuICAgICAgZGF0YUNvdW50ID0gc2hvd0NvdW50LmZvcm1hdHRlcih7XG4gICAgICAgIHZhbHVlOiB2YWwsXG4gICAgICAgIGNvdW50OiB2YWx1ZUxlbmd0aCxcbiAgICAgICAgbWF4TGVuZ3RoOiBtYXhMZW5ndGhcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhQ291bnQgPSBcIlwiLmNvbmNhdCh2YWx1ZUxlbmd0aCkuY29uY2F0KGhhc01heExlbmd0aCA/IFwiIC8gXCIuY29uY2F0KG1heExlbmd0aCkgOiAnJyk7XG4gICAgfVxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBoaWRkZW46IGhpZGRlbixcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRleHRhcmVhXCIpLCAoX2NsYXNzTmFtZXMyID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdGV4dGFyZWEtcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10ZXh0YXJlYS1zaG93LWNvdW50XCIpLCBzaG93Q291bnQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRleHRhcmVhLWluLWZvcm0taXRlbVwiKSwgaXNGb3JtSXRlbUlucHV0KSwgX2NsYXNzTmFtZXMyKSwgZ2V0U3RhdHVzQ2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRleHRhcmVhXCIpLCBtZXJnZWRTdGF0dXMsIGhhc0ZlZWRiYWNrKSwgY2xhc3NOYW1lKSxcbiAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgIFwiZGF0YS1jb3VudFwiOiBkYXRhQ291bnRcbiAgICB9LCB0ZXh0YXJlYU5vZGUsIGhhc0ZlZWRiYWNrICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdGV4dGFyZWEtc3VmZml4XCIpXG4gICAgfSwgZmVlZGJhY2tJY29uKSk7XG4gIH1cbiAgcmV0dXJuIHRleHRhcmVhTm9kZTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgVGV4dEFyZWE7IiwiaW1wb3J0IEdyb3VwIGZyb20gJy4vR3JvdXAnO1xuaW1wb3J0IEludGVybmFsSW5wdXQgZnJvbSAnLi9JbnB1dCc7XG5pbXBvcnQgUGFzc3dvcmQgZnJvbSAnLi9QYXNzd29yZCc7XG5pbXBvcnQgU2VhcmNoIGZyb20gJy4vU2VhcmNoJztcbmltcG9ydCBUZXh0QXJlYSBmcm9tICcuL1RleHRBcmVhJztcbnZhciBJbnB1dCA9IEludGVybmFsSW5wdXQ7XG5JbnB1dC5Hcm91cCA9IEdyb3VwO1xuSW5wdXQuU2VhcmNoID0gU2VhcmNoO1xuSW5wdXQuVGV4dEFyZWEgPSBUZXh0QXJlYTtcbklucHV0LlBhc3N3b3JkID0gUGFzc3dvcmQ7XG5leHBvcnQgZGVmYXVsdCBJbnB1dDsiLCIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBVcE91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk04OTAuNSA3NTUuM0w1MzcuOSAyNjkuMmMtMTIuOC0xNy42LTM5LTE3LjYtNTEuNyAwTDEzMy41IDc1NS4zQTggOCAwIDAwMTQwIDc2OGg3NWM1LjEgMCA5LjktMi41IDEyLjktNi42TDUxMiAzNjkuOGwyODQuMSAzOTEuNmMzIDQuMSA3LjggNi42IDEyLjkgNi42aDc1YzYuNSAwIDEwLjMtNy40IDYuNS0xMi43elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwidXBcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IFVwT3V0bGluZWQ7XG4iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBVcE91dGxpbmVkU3ZnIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1VwT3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tICcuLi9jb21wb25lbnRzL0FudGRJY29uJztcbnZhciBVcE91dGxpbmVkID0gZnVuY3Rpb24gVXBPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogVXBPdXRsaW5lZFN2Z1xuICB9KSk7XG59O1xuVXBPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdVcE91dGxpbmVkJztcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKFVwT3V0bGluZWQpOyIsImV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0QmlnSW50KCkge1xuICByZXR1cm4gdHlwZW9mIEJpZ0ludCA9PT0gJ2Z1bmN0aW9uJztcbn0iLCJpbXBvcnQgeyBzdXBwb3J0QmlnSW50IH0gZnJvbSAnLi9zdXBwb3J0VXRpbCc7XG4vKipcbiAqIEZvcm1hdCBzdHJpbmcgbnVtYmVyIHRvIHJlYWRhYmxlIG51bWJlclxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpbU51bWJlcihudW1TdHIpIHtcbiAgdmFyIHN0ciA9IG51bVN0ci50cmltKCk7XG4gIHZhciBuZWdhdGl2ZSA9IHN0ci5zdGFydHNXaXRoKCctJyk7XG4gIGlmIChuZWdhdGl2ZSkge1xuICAgIHN0ciA9IHN0ci5zbGljZSgxKTtcbiAgfVxuICBzdHIgPSBzdHJcbiAgLy8gUmVtb3ZlIGRlY2ltYWwgMC4gYDEuMDAwYCA9PiBgMS5gLCBgMS4xMDBgID0+IGAxLjFgXG4gIC5yZXBsYWNlKC8oXFwuXFxkKlteMF0pMCokLywgJyQxJylcbiAgLy8gUmVtb3ZlIHVzZWxlc3MgZGVjaW1hbC4gYDEuYCA9PiBgMWBcbiAgLnJlcGxhY2UoL1xcLjAqJC8sICcnKVxuICAvLyBSZW1vdmUgaW50ZWdlciAwLiBgMDAwMWAgPT4gYDFgLCAwMDAuMScgPT4gYC4xYFxuICAucmVwbGFjZSgvXjArLywgJycpO1xuICBpZiAoc3RyLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgIHN0ciA9IFwiMFwiLmNvbmNhdChzdHIpO1xuICB9XG4gIHZhciB0cmltU3RyID0gc3RyIHx8ICcwJztcbiAgdmFyIHNwbGl0TnVtYmVyID0gdHJpbVN0ci5zcGxpdCgnLicpO1xuICB2YXIgaW50ZWdlclN0ciA9IHNwbGl0TnVtYmVyWzBdIHx8ICcwJztcbiAgdmFyIGRlY2ltYWxTdHIgPSBzcGxpdE51bWJlclsxXSB8fCAnMCc7XG4gIGlmIChpbnRlZ2VyU3RyID09PSAnMCcgJiYgZGVjaW1hbFN0ciA9PT0gJzAnKSB7XG4gICAgbmVnYXRpdmUgPSBmYWxzZTtcbiAgfVxuICB2YXIgbmVnYXRpdmVTdHIgPSBuZWdhdGl2ZSA/ICctJyA6ICcnO1xuICByZXR1cm4ge1xuICAgIG5lZ2F0aXZlOiBuZWdhdGl2ZSxcbiAgICBuZWdhdGl2ZVN0cjogbmVnYXRpdmVTdHIsXG4gICAgdHJpbVN0cjogdHJpbVN0cixcbiAgICBpbnRlZ2VyU3RyOiBpbnRlZ2VyU3RyLFxuICAgIGRlY2ltYWxTdHI6IGRlY2ltYWxTdHIsXG4gICAgZnVsbFN0cjogXCJcIi5jb25jYXQobmVnYXRpdmVTdHIpLmNvbmNhdCh0cmltU3RyKVxuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRShudW1iZXIpIHtcbiAgdmFyIHN0ciA9IFN0cmluZyhudW1iZXIpO1xuICByZXR1cm4gIU51bWJlci5pc05hTihOdW1iZXIoc3RyKSkgJiYgc3RyLmluY2x1ZGVzKCdlJyk7XG59XG4vKipcbiAqIFtMZWdhY3ldIENvbnZlcnQgMWUtOSB0byAwLjAwMDAwMDAwMS5cbiAqIFRoaXMgbWF5IGxvc2Ugc29tZSBwcmVjaXNpb24gaWYgdXNlciByZWFsbHkgd2FudCAxZS05LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TnVtYmVyUHJlY2lzaW9uKG51bWJlcikge1xuICB2YXIgbnVtU3RyID0gU3RyaW5nKG51bWJlcik7XG4gIGlmIChpc0UobnVtYmVyKSkge1xuICAgIHZhciBwcmVjaXNpb24gPSBOdW1iZXIobnVtU3RyLnNsaWNlKG51bVN0ci5pbmRleE9mKCdlLScpICsgMikpO1xuICAgIHZhciBkZWNpbWFsTWF0Y2ggPSBudW1TdHIubWF0Y2goL1xcLihcXGQrKS8pO1xuICAgIGlmIChkZWNpbWFsTWF0Y2ggPT09IG51bGwgfHwgZGVjaW1hbE1hdGNoID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZWNpbWFsTWF0Y2hbMV0pIHtcbiAgICAgIHByZWNpc2lvbiArPSBkZWNpbWFsTWF0Y2hbMV0ubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gcHJlY2lzaW9uO1xuICB9XG4gIHJldHVybiBudW1TdHIuaW5jbHVkZXMoJy4nKSAmJiB2YWxpZGF0ZU51bWJlcihudW1TdHIpID8gbnVtU3RyLmxlbmd0aCAtIG51bVN0ci5pbmRleE9mKCcuJykgLSAxIDogMDtcbn1cbi8qKlxuICogQ29udmVydCBudW1iZXIgKGluY2x1ZGVzIHNjaWVudGlmaWMgbm90YXRpb24pIHRvIC14eHgueXl5IGZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gbnVtMnN0cihudW1iZXIpIHtcbiAgdmFyIG51bVN0ciA9IFN0cmluZyhudW1iZXIpO1xuICBpZiAoaXNFKG51bWJlcikpIHtcbiAgICBpZiAobnVtYmVyID4gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgIHJldHVybiBTdHJpbmcoc3VwcG9ydEJpZ0ludCgpID8gQmlnSW50KG51bWJlcikudG9TdHJpbmcoKSA6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKTtcbiAgICB9XG4gICAgaWYgKG51bWJlciA8IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKHN1cHBvcnRCaWdJbnQoKSA/IEJpZ0ludChudW1iZXIpLnRvU3RyaW5nKCkgOiBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUik7XG4gICAgfVxuICAgIG51bVN0ciA9IG51bWJlci50b0ZpeGVkKGdldE51bWJlclByZWNpc2lvbihudW1TdHIpKTtcbiAgfVxuICByZXR1cm4gdHJpbU51bWJlcihudW1TdHIpLmZ1bGxTdHI7XG59XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVOdW1iZXIobnVtKSB7XG4gIGlmICh0eXBlb2YgbnVtID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiAhTnVtYmVyLmlzTmFOKG51bSk7XG4gIH1cbiAgLy8gRW1wdHlcbiAgaWYgKCFudW0pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIChcbiAgICAvLyBOb3JtYWwgdHlwZTogMTEuMjhcbiAgICAvXlxccyotP1xcZCsoXFwuXFxkKyk/XFxzKiQvLnRlc3QobnVtKSB8fFxuICAgIC8vIFByZS1udW1iZXI6IDEuXG4gICAgL15cXHMqLT9cXGQrXFwuXFxzKiQvLnRlc3QobnVtKSB8fFxuICAgIC8vIFBvc3QtbnVtYmVyOiAuMVxuICAgIC9eXFxzKi0/XFwuXFxkK1xccyokLy50ZXN0KG51bSlcbiAgKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWN1cGxlU3RlcHMoc3RlcCkge1xuICB2YXIgc3RlcFN0ciA9IHR5cGVvZiBzdGVwID09PSAnbnVtYmVyJyA/IG51bTJzdHIoc3RlcCkgOiB0cmltTnVtYmVyKHN0ZXApLmZ1bGxTdHI7XG4gIHZhciBoYXNQb2ludCA9IHN0ZXBTdHIuaW5jbHVkZXMoJy4nKTtcbiAgaWYgKCFoYXNQb2ludCkge1xuICAgIHJldHVybiBzdGVwICsgJzAnO1xuICB9XG4gIHJldHVybiB0cmltTnVtYmVyKHN0ZXBTdHIucmVwbGFjZSgvKFxcZClcXC4oXFxkKS9nLCAnJDEkMi4nKSkuZnVsbFN0cjtcbn0iLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbi8qIGVzbGludC1kaXNhYmxlIG1heC1jbGFzc2VzLXBlci1maWxlICovXG5pbXBvcnQgeyBnZXROdW1iZXJQcmVjaXNpb24sIGlzRSwgbnVtMnN0ciwgdHJpbU51bWJlciwgdmFsaWRhdGVOdW1iZXIgfSBmcm9tICcuL251bWJlclV0aWwnO1xuaW1wb3J0IHsgc3VwcG9ydEJpZ0ludCB9IGZyb20gJy4vc3VwcG9ydFV0aWwnO1xuLyoqXG4gKiBXZSBjYW4gcmVtb3ZlIHRoaXMgd2hlbiBJRSBub3Qgc3VwcG9ydCBhbnltb3JlXG4gKi9cbmV4cG9ydCB2YXIgTnVtYmVyRGVjaW1hbCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE51bWJlckRlY2ltYWwodmFsdWUpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTnVtYmVyRGVjaW1hbCk7XG4gICAgdGhpcy5vcmlnaW4gPSAnJztcbiAgICB0aGlzLm51bWJlciA9IHZvaWQgMDtcbiAgICB0aGlzLmVtcHR5ID0gdm9pZCAwO1xuICAgIGlmICghdmFsdWUgJiYgdmFsdWUgIT09IDAgfHwgIVN0cmluZyh2YWx1ZSkudHJpbSgpKSB7XG4gICAgICB0aGlzLmVtcHR5ID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vcmlnaW4gPSBTdHJpbmcodmFsdWUpO1xuICAgIHRoaXMubnVtYmVyID0gTnVtYmVyKHZhbHVlKTtcbiAgfVxuICBfY3JlYXRlQ2xhc3MoTnVtYmVyRGVjaW1hbCwgW3tcbiAgICBrZXk6IFwibmVnYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5lZ2F0ZSgpIHtcbiAgICAgIHJldHVybiBuZXcgTnVtYmVyRGVjaW1hbCgtdGhpcy50b051bWJlcigpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZCh2YWx1ZSkge1xuICAgICAgaWYgKHRoaXMuaXNJbnZhbGlkYXRlKCkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXJEZWNpbWFsKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHZhciB0YXJnZXQgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgaWYgKE51bWJlci5pc05hTih0YXJnZXQpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgdmFyIG51bWJlciA9IHRoaXMubnVtYmVyICsgdGFyZ2V0O1xuICAgICAgLy8gW0xlZ2FjeV0gQmFjayB0byBzYWZlIGludGVnZXJcbiAgICAgIGlmIChudW1iZXIgPiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICByZXR1cm4gbmV3IE51bWJlckRlY2ltYWwoTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpO1xuICAgICAgfVxuICAgICAgaWYgKG51bWJlciA8IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgIHJldHVybiBuZXcgTnVtYmVyRGVjaW1hbChOdW1iZXIuTUlOX1NBRkVfSU5URUdFUik7XG4gICAgICB9XG4gICAgICB2YXIgbWF4UHJlY2lzaW9uID0gTWF0aC5tYXgoZ2V0TnVtYmVyUHJlY2lzaW9uKHRoaXMubnVtYmVyKSwgZ2V0TnVtYmVyUHJlY2lzaW9uKHRhcmdldCkpO1xuICAgICAgcmV0dXJuIG5ldyBOdW1iZXJEZWNpbWFsKG51bWJlci50b0ZpeGVkKG1heFByZWNpc2lvbikpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc0VtcHR5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzRW1wdHkoKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbXB0eTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNOYU5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNOYU4oKSB7XG4gICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHRoaXMubnVtYmVyKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNJbnZhbGlkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzSW52YWxpZGF0ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzRW1wdHkoKSB8fCB0aGlzLmlzTmFOKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVxdWFsc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlcXVhbHModGFyZ2V0KSB7XG4gICAgICByZXR1cm4gdGhpcy50b051bWJlcigpID09PSAodGFyZ2V0ID09PSBudWxsIHx8IHRhcmdldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGFyZ2V0LnRvTnVtYmVyKCkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJsZXNzRXF1YWxzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxlc3NFcXVhbHModGFyZ2V0KSB7XG4gICAgICByZXR1cm4gdGhpcy5hZGQodGFyZ2V0Lm5lZ2F0ZSgpLnRvU3RyaW5nKCkpLnRvTnVtYmVyKCkgPD0gMDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9OdW1iZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9OdW1iZXIoKSB7XG4gICAgICByZXR1cm4gdGhpcy5udW1iZXI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvU3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgdmFyIHNhZmUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRydWU7XG4gICAgICBpZiAoIXNhZmUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaXNJbnZhbGlkYXRlKCkpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bTJzdHIodGhpcy5udW1iZXIpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gTnVtYmVyRGVjaW1hbDtcbn0oKTtcbmV4cG9ydCB2YXIgQmlnSW50RGVjaW1hbCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIC8qKiBCaWdJbnQgd2lsbCBjb252ZXJ0IGAwMDA5YCB0byBgOWAuIFdlIG5lZWQgcmVjb3JkIHRoZSBsZW4gb2YgZGVjaW1hbCAqL1xuXG4gIGZ1bmN0aW9uIEJpZ0ludERlY2ltYWwodmFsdWUpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQmlnSW50RGVjaW1hbCk7XG4gICAgdGhpcy5vcmlnaW4gPSAnJztcbiAgICB0aGlzLm5lZ2F0aXZlID0gdm9pZCAwO1xuICAgIHRoaXMuaW50ZWdlciA9IHZvaWQgMDtcbiAgICB0aGlzLmRlY2ltYWwgPSB2b2lkIDA7XG4gICAgdGhpcy5kZWNpbWFsTGVuID0gdm9pZCAwO1xuICAgIHRoaXMuZW1wdHkgPSB2b2lkIDA7XG4gICAgdGhpcy5uYW4gPSB2b2lkIDA7XG4gICAgaWYgKCF2YWx1ZSAmJiB2YWx1ZSAhPT0gMCB8fCAhU3RyaW5nKHZhbHVlKS50cmltKCkpIHtcbiAgICAgIHRoaXMuZW1wdHkgPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9yaWdpbiA9IFN0cmluZyh2YWx1ZSk7XG4gICAgLy8gQWN0IGxpa2UgTnVtYmVyIGNvbnZlcnRcbiAgICBpZiAodmFsdWUgPT09ICctJykge1xuICAgICAgdGhpcy5uYW4gPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbWVyZ2VkVmFsdWUgPSB2YWx1ZTtcbiAgICAvLyBXZSBuZWVkIGNvbnZlcnQgYmFjayB0byBOdW1iZXIgc2luY2UgaXQgcmVxdWlyZSBgdG9GaXhlZGAgdG8gaGFuZGxlIHRoaXNcbiAgICBpZiAoaXNFKG1lcmdlZFZhbHVlKSkge1xuICAgICAgbWVyZ2VkVmFsdWUgPSBOdW1iZXIobWVyZ2VkVmFsdWUpO1xuICAgIH1cbiAgICBtZXJnZWRWYWx1ZSA9IHR5cGVvZiBtZXJnZWRWYWx1ZSA9PT0gJ3N0cmluZycgPyBtZXJnZWRWYWx1ZSA6IG51bTJzdHIobWVyZ2VkVmFsdWUpO1xuICAgIGlmICh2YWxpZGF0ZU51bWJlcihtZXJnZWRWYWx1ZSkpIHtcbiAgICAgIHZhciB0cmltUmV0ID0gdHJpbU51bWJlcihtZXJnZWRWYWx1ZSk7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gdHJpbVJldC5uZWdhdGl2ZTtcbiAgICAgIHZhciBudW1iZXJzID0gdHJpbVJldC50cmltU3RyLnNwbGl0KCcuJyk7XG4gICAgICB0aGlzLmludGVnZXIgPSBCaWdJbnQobnVtYmVyc1swXSk7XG4gICAgICB2YXIgZGVjaW1hbFN0ciA9IG51bWJlcnNbMV0gfHwgJzAnO1xuICAgICAgdGhpcy5kZWNpbWFsID0gQmlnSW50KGRlY2ltYWxTdHIpO1xuICAgICAgdGhpcy5kZWNpbWFsTGVuID0gZGVjaW1hbFN0ci5sZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubmFuID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgX2NyZWF0ZUNsYXNzKEJpZ0ludERlY2ltYWwsIFt7XG4gICAga2V5OiBcImdldE1hcmtcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TWFyaygpIHtcbiAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlID8gJy0nIDogJyc7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEludGVnZXJTdHJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0SW50ZWdlclN0cigpIHtcbiAgICAgIHJldHVybiB0aGlzLmludGVnZXIudG9TdHJpbmcoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0RGVjaW1hbFN0clwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREZWNpbWFsU3RyKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVjaW1hbC50b1N0cmluZygpLnBhZFN0YXJ0KHRoaXMuZGVjaW1hbExlbiwgJzAnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWxpZ24gQmlnSW50RGVjaW1hbCB3aXRoIHNhbWUgZGVjaW1hbCBsZW5ndGguIGUuZy4gMTIuMyArIDUgPSAxMjMwMDAwXG4gICAgICogVGhpcyBpcyB1c2VkIGZvciBhZGQgZnVuY3Rpb24gb25seS5cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogXCJhbGlnbkRlY2ltYWxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWxpZ25EZWNpbWFsKGRlY2ltYWxMZW5ndGgpIHtcbiAgICAgIHZhciBzdHIgPSBcIlwiLmNvbmNhdCh0aGlzLmdldE1hcmsoKSkuY29uY2F0KHRoaXMuZ2V0SW50ZWdlclN0cigpKS5jb25jYXQodGhpcy5nZXREZWNpbWFsU3RyKCkucGFkRW5kKGRlY2ltYWxMZW5ndGgsICcwJykpO1xuICAgICAgcmV0dXJuIEJpZ0ludChzdHIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuZWdhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbmVnYXRlKCkge1xuICAgICAgdmFyIGNsb25lID0gbmV3IEJpZ0ludERlY2ltYWwodGhpcy50b1N0cmluZygpKTtcbiAgICAgIGNsb25lLm5lZ2F0aXZlID0gIWNsb25lLm5lZ2F0aXZlO1xuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgICBpZiAodGhpcy5pc0ludmFsaWRhdGUoKSkge1xuICAgICAgICByZXR1cm4gbmV3IEJpZ0ludERlY2ltYWwodmFsdWUpO1xuICAgICAgfVxuICAgICAgdmFyIG9mZnNldCA9IG5ldyBCaWdJbnREZWNpbWFsKHZhbHVlKTtcbiAgICAgIGlmIChvZmZzZXQuaXNJbnZhbGlkYXRlKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB2YXIgbWF4RGVjaW1hbExlbmd0aCA9IE1hdGgubWF4KHRoaXMuZ2V0RGVjaW1hbFN0cigpLmxlbmd0aCwgb2Zmc2V0LmdldERlY2ltYWxTdHIoKS5sZW5ndGgpO1xuICAgICAgdmFyIG15QWxpZ25lZERlY2ltYWwgPSB0aGlzLmFsaWduRGVjaW1hbChtYXhEZWNpbWFsTGVuZ3RoKTtcbiAgICAgIHZhciBvZmZzZXRBbGlnbmVkRGVjaW1hbCA9IG9mZnNldC5hbGlnbkRlY2ltYWwobWF4RGVjaW1hbExlbmd0aCk7XG4gICAgICB2YXIgdmFsdWVTdHIgPSAobXlBbGlnbmVkRGVjaW1hbCArIG9mZnNldEFsaWduZWREZWNpbWFsKS50b1N0cmluZygpO1xuICAgICAgLy8gV2UgbmVlZCBmaWxsIHN0cmluZyBsZW5ndGggYmFjayB0byBgbWF4RGVjaW1hbExlbmd0aGAgdG8gYXZvaWQgcGFyc2VyIGZhaWxlZFxuICAgICAgdmFyIF90cmltTnVtYmVyID0gdHJpbU51bWJlcih2YWx1ZVN0ciksXG4gICAgICAgIG5lZ2F0aXZlU3RyID0gX3RyaW1OdW1iZXIubmVnYXRpdmVTdHIsXG4gICAgICAgIHRyaW1TdHIgPSBfdHJpbU51bWJlci50cmltU3RyO1xuICAgICAgdmFyIGh5ZHJhdGVWYWx1ZVN0ciA9IFwiXCIuY29uY2F0KG5lZ2F0aXZlU3RyKS5jb25jYXQodHJpbVN0ci5wYWRTdGFydChtYXhEZWNpbWFsTGVuZ3RoICsgMSwgJzAnKSk7XG4gICAgICByZXR1cm4gbmV3IEJpZ0ludERlY2ltYWwoXCJcIi5jb25jYXQoaHlkcmF0ZVZhbHVlU3RyLnNsaWNlKDAsIC1tYXhEZWNpbWFsTGVuZ3RoKSwgXCIuXCIpLmNvbmNhdChoeWRyYXRlVmFsdWVTdHIuc2xpY2UoLW1heERlY2ltYWxMZW5ndGgpKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzRW1wdHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNFbXB0eSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmVtcHR5O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc05hTlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc05hTigpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hbjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNJbnZhbGlkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzSW52YWxpZGF0ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzRW1wdHkoKSB8fCB0aGlzLmlzTmFOKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVxdWFsc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlcXVhbHModGFyZ2V0KSB7XG4gICAgICByZXR1cm4gdGhpcy50b1N0cmluZygpID09PSAodGFyZ2V0ID09PSBudWxsIHx8IHRhcmdldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGFyZ2V0LnRvU3RyaW5nKCkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJsZXNzRXF1YWxzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxlc3NFcXVhbHModGFyZ2V0KSB7XG4gICAgICByZXR1cm4gdGhpcy5hZGQodGFyZ2V0Lm5lZ2F0ZSgpLnRvU3RyaW5nKCkpLnRvTnVtYmVyKCkgPD0gMDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9OdW1iZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9OdW1iZXIoKSB7XG4gICAgICBpZiAodGhpcy5pc05hTigpKSB7XG4gICAgICAgIHJldHVybiBOYU47XG4gICAgICB9XG4gICAgICByZXR1cm4gTnVtYmVyKHRoaXMudG9TdHJpbmcoKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvU3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgdmFyIHNhZmUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRydWU7XG4gICAgICBpZiAoIXNhZmUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaXNJbnZhbGlkYXRlKCkpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRyaW1OdW1iZXIoXCJcIi5jb25jYXQodGhpcy5nZXRNYXJrKCkpLmNvbmNhdCh0aGlzLmdldEludGVnZXJTdHIoKSwgXCIuXCIpLmNvbmNhdCh0aGlzLmdldERlY2ltYWxTdHIoKSkpLmZ1bGxTdHI7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBCaWdJbnREZWNpbWFsO1xufSgpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0TWluaURlY2ltYWwodmFsdWUpIHtcbiAgLy8gV2UgdXNlIEJpZ0ludCBoZXJlLlxuICAvLyBXaWxsIGZhbGxiYWNrIHRvIE51bWJlciBpZiBub3Qgc3VwcG9ydC5cbiAgaWYgKHN1cHBvcnRCaWdJbnQoKSkge1xuICAgIHJldHVybiBuZXcgQmlnSW50RGVjaW1hbCh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBOdW1iZXJEZWNpbWFsKHZhbHVlKTtcbn1cbi8qKlxuICogQWxpZ24gdGhlIGxvZ2ljIG9mIHRvRml4ZWQgdG8gYXJvdW5kIGxpa2UgMS41ID0+IDIuXG4gKiBJZiBzZXQgYGN1dE9ubHlgLCB3aWxsIGp1c3QgcmVtb3ZlIHRoZSBvdmVyIGRlY2ltYWwgcGFydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvRml4ZWQobnVtU3RyLCBzZXBhcmF0b3JTdHIsIHByZWNpc2lvbikge1xuICB2YXIgY3V0T25seSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogZmFsc2U7XG4gIGlmIChudW1TdHIgPT09ICcnKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIHZhciBfdHJpbU51bWJlcjIgPSB0cmltTnVtYmVyKG51bVN0ciksXG4gICAgbmVnYXRpdmVTdHIgPSBfdHJpbU51bWJlcjIubmVnYXRpdmVTdHIsXG4gICAgaW50ZWdlclN0ciA9IF90cmltTnVtYmVyMi5pbnRlZ2VyU3RyLFxuICAgIGRlY2ltYWxTdHIgPSBfdHJpbU51bWJlcjIuZGVjaW1hbFN0cjtcbiAgdmFyIHByZWNpc2lvbkRlY2ltYWxTdHIgPSBcIlwiLmNvbmNhdChzZXBhcmF0b3JTdHIpLmNvbmNhdChkZWNpbWFsU3RyKTtcbiAgdmFyIG51bWJlcldpdGhvdXREZWNpbWFsID0gXCJcIi5jb25jYXQobmVnYXRpdmVTdHIpLmNvbmNhdChpbnRlZ2VyU3RyKTtcbiAgaWYgKHByZWNpc2lvbiA+PSAwKSB7XG4gICAgLy8gV2Ugd2lsbCBnZXQgbGFzdCArIDEgbnVtYmVyIHRvIGNoZWNrIGlmIG5lZWQgYWR2YW5jZWQgbnVtYmVyXG4gICAgdmFyIGFkdmFuY2VkTnVtID0gTnVtYmVyKGRlY2ltYWxTdHJbcHJlY2lzaW9uXSk7XG4gICAgaWYgKGFkdmFuY2VkTnVtID49IDUgJiYgIWN1dE9ubHkpIHtcbiAgICAgIHZhciBhZHZhbmNlZERlY2ltYWwgPSBnZXRNaW5pRGVjaW1hbChudW1TdHIpLmFkZChcIlwiLmNvbmNhdChuZWdhdGl2ZVN0ciwgXCIwLlwiKS5jb25jYXQoJzAnLnJlcGVhdChwcmVjaXNpb24pKS5jb25jYXQoMTAgLSBhZHZhbmNlZE51bSkpO1xuICAgICAgcmV0dXJuIHRvRml4ZWQoYWR2YW5jZWREZWNpbWFsLnRvU3RyaW5nKCksIHNlcGFyYXRvclN0ciwgcHJlY2lzaW9uLCBjdXRPbmx5KTtcbiAgICB9XG4gICAgaWYgKHByZWNpc2lvbiA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bWJlcldpdGhvdXREZWNpbWFsO1xuICAgIH1cbiAgICByZXR1cm4gXCJcIi5jb25jYXQobnVtYmVyV2l0aG91dERlY2ltYWwpLmNvbmNhdChzZXBhcmF0b3JTdHIpLmNvbmNhdChkZWNpbWFsU3RyLnBhZEVuZChwcmVjaXNpb24sICcwJykuc2xpY2UoMCwgcHJlY2lzaW9uKSk7XG4gIH1cbiAgaWYgKHByZWNpc2lvbkRlY2ltYWxTdHIgPT09ICcuMCcpIHtcbiAgICByZXR1cm4gbnVtYmVyV2l0aG91dERlY2ltYWw7XG4gIH1cbiAgcmV0dXJuIFwiXCIuY29uY2F0KG51bWJlcldpdGhvdXREZWNpbWFsKS5jb25jYXQocHJlY2lzaW9uRGVjaW1hbFN0cik7XG59IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuLyogZXNsaW50LWRpc2FibGUgcmVhY3Qvbm8tdW5rbm93bi1wcm9wZXJ0eSAqL1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgaXNNb2JpbGUgZnJvbSBcInJjLXV0aWwvZXMvaXNNb2JpbGVcIjtcbi8qKlxuICogV2hlbiBjbGljayBhbmQgaG9sZCBvbiBhIGJ1dHRvbiAtIHRoZSBzcGVlZCBvZiBhdXRvIGNoYW5naW5nIHRoZSB2YWx1ZS5cbiAqL1xudmFyIFNURVBfSU5URVJWQUwgPSAyMDA7XG4vKipcbiAqIFdoZW4gY2xpY2sgYW5kIGhvbGQgb24gYSBidXR0b24gLSB0aGUgZGVsYXkgYmVmb3JlIGF1dG8gY2hhbmdpbmcgdGhlIHZhbHVlLlxuICovXG52YXIgU1RFUF9ERUxBWSA9IDYwMDtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFN0ZXBIYW5kbGVyKF9yZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgIHVwTm9kZSA9IF9yZWYudXBOb2RlLFxuICAgIGRvd25Ob2RlID0gX3JlZi5kb3duTm9kZSxcbiAgICB1cERpc2FibGVkID0gX3JlZi51cERpc2FibGVkLFxuICAgIGRvd25EaXNhYmxlZCA9IF9yZWYuZG93bkRpc2FibGVkLFxuICAgIG9uU3RlcCA9IF9yZWYub25TdGVwO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gU3RlcCA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHN0ZXBUaW1lb3V0UmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciBvblN0ZXBSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgb25TdGVwUmVmLmN1cnJlbnQgPSBvblN0ZXA7XG4gIC8vIFdlIHdpbGwgaW50ZXJ2YWwgdXBkYXRlIHN0ZXAgd2hlbiBob2xkIG1vdXNlIGRvd25cbiAgdmFyIG9uU3RlcE1vdXNlRG93biA9IGZ1bmN0aW9uIG9uU3RlcE1vdXNlRG93bihlLCB1cCkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBvblN0ZXBSZWYuY3VycmVudCh1cCk7XG4gICAgLy8gTG9vcCBzdGVwIGZvciBpbnRlcnZhbFxuICAgIGZ1bmN0aW9uIGxvb3BTdGVwKCkge1xuICAgICAgb25TdGVwUmVmLmN1cnJlbnQodXApO1xuICAgICAgc3RlcFRpbWVvdXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQobG9vcFN0ZXAsIFNURVBfSU5URVJWQUwpO1xuICAgIH1cbiAgICAvLyBGaXJzdCB0aW1lIHByZXNzIHdpbGwgd2FpdCBzb21lIHRpbWUgdG8gdHJpZ2dlciBsb29wIHN0ZXAgdXBkYXRlXG4gICAgc3RlcFRpbWVvdXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQobG9vcFN0ZXAsIFNURVBfREVMQVkpO1xuICB9O1xuICB2YXIgb25TdG9wU3RlcCA9IGZ1bmN0aW9uIG9uU3RvcFN0ZXAoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHN0ZXBUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICB9O1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBvblN0b3BTdGVwO1xuICB9LCBbXSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PVxuICBpZiAoaXNNb2JpbGUoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBoYW5kbGVyQ2xhc3NOYW1lID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oYW5kbGVyXCIpO1xuICB2YXIgdXBDbGFzc05hbWUgPSBjbGFzc05hbWVzKGhhbmRsZXJDbGFzc05hbWUsIFwiXCIuY29uY2F0KGhhbmRsZXJDbGFzc05hbWUsIFwiLXVwXCIpLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KGhhbmRsZXJDbGFzc05hbWUsIFwiLXVwLWRpc2FibGVkXCIpLCB1cERpc2FibGVkKSk7XG4gIHZhciBkb3duQ2xhc3NOYW1lID0gY2xhc3NOYW1lcyhoYW5kbGVyQ2xhc3NOYW1lLCBcIlwiLmNvbmNhdChoYW5kbGVyQ2xhc3NOYW1lLCBcIi1kb3duXCIpLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KGhhbmRsZXJDbGFzc05hbWUsIFwiLWRvd24tZGlzYWJsZWRcIiksIGRvd25EaXNhYmxlZCkpO1xuICB2YXIgc2hhcmVkSGFuZGxlclByb3BzID0ge1xuICAgIHVuc2VsZWN0YWJsZTogJ29uJyxcbiAgICByb2xlOiAnYnV0dG9uJyxcbiAgICBvbk1vdXNlVXA6IG9uU3RvcFN0ZXAsXG4gICAgb25Nb3VzZUxlYXZlOiBvblN0b3BTdGVwXG4gIH07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChoYW5kbGVyQ2xhc3NOYW1lLCBcIi13cmFwXCIpXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBfZXh0ZW5kcyh7fSwgc2hhcmVkSGFuZGxlclByb3BzLCB7XG4gICAgb25Nb3VzZURvd246IGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgIG9uU3RlcE1vdXNlRG93bihlLCB0cnVlKTtcbiAgICB9LFxuICAgIFwiYXJpYS1sYWJlbFwiOiBcIkluY3JlYXNlIFZhbHVlXCIsXG4gICAgXCJhcmlhLWRpc2FibGVkXCI6IHVwRGlzYWJsZWQsXG4gICAgY2xhc3NOYW1lOiB1cENsYXNzTmFtZVxuICB9KSwgdXBOb2RlIHx8IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgdW5zZWxlY3RhYmxlOiBcIm9uXCIsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhhbmRsZXItdXAtaW5uZXJcIilcbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgX2V4dGVuZHMoe30sIHNoYXJlZEhhbmRsZXJQcm9wcywge1xuICAgIG9uTW91c2VEb3duOiBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7XG4gICAgICBvblN0ZXBNb3VzZURvd24oZSwgZmFsc2UpO1xuICAgIH0sXG4gICAgXCJhcmlhLWxhYmVsXCI6IFwiRGVjcmVhc2UgVmFsdWVcIixcbiAgICBcImFyaWEtZGlzYWJsZWRcIjogZG93bkRpc2FibGVkLFxuICAgIGNsYXNzTmFtZTogZG93bkNsYXNzTmFtZVxuICB9KSwgZG93bk5vZGUgfHwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICB1bnNlbGVjdGFibGU6IFwib25cIixcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGFuZGxlci1kb3duLWlubmVyXCIpXG4gIH0pKSk7XG59IiwiaW1wb3J0IHsgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuLyoqXG4gKiBLZWVwIGlucHV0IGN1cnNvciBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiBpZiBwb3NzaWJsZS5cbiAqIElzIHRoaXMgbmVjZXNzYXJ5IHNpbmNlIHdlIGhhdmUgYGZvcm1hdHRlcmAgd2hpY2ggbWF5IG1hc3MgdGhlIGNvbnRlbnQ/XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUN1cnNvcihpbnB1dCwgZm9jdXNlZCkge1xuICB2YXIgc2VsZWN0aW9uUmVmID0gdXNlUmVmKG51bGwpO1xuICBmdW5jdGlvbiByZWNvcmRDdXJzb3IoKSB7XG4gICAgLy8gUmVjb3JkIHBvc2l0aW9uXG4gICAgdHJ5IHtcbiAgICAgIHZhciBzdGFydCA9IGlucHV0LnNlbGVjdGlvblN0YXJ0LFxuICAgICAgICBlbmQgPSBpbnB1dC5zZWxlY3Rpb25FbmQsXG4gICAgICAgIHZhbHVlID0gaW5wdXQudmFsdWU7XG4gICAgICB2YXIgYmVmb3JlVHh0ID0gdmFsdWUuc3Vic3RyaW5nKDAsIHN0YXJ0KTtcbiAgICAgIHZhciBhZnRlclR4dCA9IHZhbHVlLnN1YnN0cmluZyhlbmQpO1xuICAgICAgc2VsZWN0aW9uUmVmLmN1cnJlbnQgPSB7XG4gICAgICAgIHN0YXJ0OiBzdGFydCxcbiAgICAgICAgZW5kOiBlbmQsXG4gICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgYmVmb3JlVHh0OiBiZWZvcmVUeHQsXG4gICAgICAgIGFmdGVyVHh0OiBhZnRlclR4dFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBGaXggZXJyb3IgaW4gQ2hyb21lOlxuICAgICAgLy8gRmFpbGVkIHRvIHJlYWQgdGhlICdzZWxlY3Rpb25TdGFydCcgcHJvcGVydHkgZnJvbSAnSFRNTElucHV0RWxlbWVudCdcbiAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xLzIxMTc3NDg5LzMwNDA2MDVcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJlc3RvcmUgbG9naWM6XG4gICAqICAxLiBiYWNrIHN0cmluZyBzYW1lXG4gICAqICAyLiBzdGFydCBzdHJpbmcgc2FtZVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzdG9yZUN1cnNvcigpIHtcbiAgICBpZiAoaW5wdXQgJiYgc2VsZWN0aW9uUmVmLmN1cnJlbnQgJiYgZm9jdXNlZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIHZhbHVlID0gaW5wdXQudmFsdWU7XG4gICAgICAgIHZhciBfc2VsZWN0aW9uUmVmJGN1cnJlbnQgPSBzZWxlY3Rpb25SZWYuY3VycmVudCxcbiAgICAgICAgICBiZWZvcmVUeHQgPSBfc2VsZWN0aW9uUmVmJGN1cnJlbnQuYmVmb3JlVHh0LFxuICAgICAgICAgIGFmdGVyVHh0ID0gX3NlbGVjdGlvblJlZiRjdXJyZW50LmFmdGVyVHh0LFxuICAgICAgICAgIHN0YXJ0ID0gX3NlbGVjdGlvblJlZiRjdXJyZW50LnN0YXJ0O1xuICAgICAgICB2YXIgc3RhcnRQb3MgPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgIGlmICh2YWx1ZS5lbmRzV2l0aChhZnRlclR4dCkpIHtcbiAgICAgICAgICBzdGFydFBvcyA9IHZhbHVlLmxlbmd0aCAtIHNlbGVjdGlvblJlZi5jdXJyZW50LmFmdGVyVHh0Lmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5zdGFydHNXaXRoKGJlZm9yZVR4dCkpIHtcbiAgICAgICAgICBzdGFydFBvcyA9IGJlZm9yZVR4dC5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGJlZm9yZUxhc3RDaGFyID0gYmVmb3JlVHh0W3N0YXJ0IC0gMV07XG4gICAgICAgICAgdmFyIG5ld0luZGV4ID0gdmFsdWUuaW5kZXhPZihiZWZvcmVMYXN0Q2hhciwgc3RhcnQgLSAxKTtcbiAgICAgICAgICBpZiAobmV3SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBzdGFydFBvcyA9IG5ld0luZGV4ICsgMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnRQb3MsIHN0YXJ0UG9zKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgd2FybmluZyhmYWxzZSwgXCJTb21ldGhpbmcgd2FybmluZyBvZiBjdXJzb3IgcmVzdG9yZS4gUGxlYXNlIGZpcmUgaXNzdWUgYWJvdXQgdGhpczogXCIuY29uY2F0KGUubWVzc2FnZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gW3JlY29yZEN1cnNvciwgcmVzdG9yZUN1cnNvcl07XG59IiwiaW1wb3J0IHsgdXNlUmVmLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgcmFmIGZyb20gXCJyYy11dGlsL2VzL3JhZlwiO1xuLyoqXG4gKiBBbHdheXMgdHJpZ2dlciBsYXRlc3Qgb25jZSB3aGVuIGNhbGwgbXVsdGlwbGUgdGltZVxuICovXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gKCkge1xuICB2YXIgaWRSZWYgPSB1c2VSZWYoMCk7XG4gIHZhciBjbGVhblVwID0gZnVuY3Rpb24gY2xlYW5VcCgpIHtcbiAgICByYWYuY2FuY2VsKGlkUmVmLmN1cnJlbnQpO1xuICB9O1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjbGVhblVwO1xuICB9LCBbXSk7XG4gIHJldHVybiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICBjbGVhblVwKCk7XG4gICAgaWRSZWYuY3VycmVudCA9IHJhZihmdW5jdGlvbiAoKSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH0pO1xuICB9O1xufSk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcInByZWZpeENsc1wiLCBcImNsYXNzTmFtZVwiLCBcInN0eWxlXCIsIFwibWluXCIsIFwibWF4XCIsIFwic3RlcFwiLCBcImRlZmF1bHRWYWx1ZVwiLCBcInZhbHVlXCIsIFwiZGlzYWJsZWRcIiwgXCJyZWFkT25seVwiLCBcInVwSGFuZGxlclwiLCBcImRvd25IYW5kbGVyXCIsIFwia2V5Ym9hcmRcIiwgXCJjb250cm9sc1wiLCBcInN0cmluZ01vZGVcIiwgXCJwYXJzZXJcIiwgXCJmb3JtYXR0ZXJcIiwgXCJwcmVjaXNpb25cIiwgXCJkZWNpbWFsU2VwYXJhdG9yXCIsIFwib25DaGFuZ2VcIiwgXCJvbklucHV0XCIsIFwib25QcmVzc0VudGVyXCIsIFwib25TdGVwXCJdO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgS2V5Q29kZSBmcm9tIFwicmMtdXRpbC9lcy9LZXlDb2RlXCI7XG5pbXBvcnQgeyB1c2VMYXlvdXRVcGRhdGVFZmZlY3QgfSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCB7IGNvbXBvc2VSZWYgfSBmcm9tIFwicmMtdXRpbC9lcy9yZWZcIjtcbmltcG9ydCBnZXRNaW5pRGVjaW1hbCwgeyB0b0ZpeGVkIH0gZnJvbSAnLi91dGlscy9NaW5pRGVjaW1hbCc7XG5pbXBvcnQgU3RlcEhhbmRsZXIgZnJvbSAnLi9TdGVwSGFuZGxlcic7XG5pbXBvcnQgeyBnZXROdW1iZXJQcmVjaXNpb24sIG51bTJzdHIsIGdldERlY3VwbGVTdGVwcywgdmFsaWRhdGVOdW1iZXIgfSBmcm9tICcuL3V0aWxzL251bWJlclV0aWwnO1xuaW1wb3J0IHVzZUN1cnNvciBmcm9tICcuL2hvb2tzL3VzZUN1cnNvcic7XG5pbXBvcnQgdXNlRnJhbWUgZnJvbSAnLi9ob29rcy91c2VGcmFtZSc7XG4vKipcbiAqIFdlIHN1cHBvcnQgYHN0cmluZ01vZGVgIHdoaWNoIG5lZWQgaGFuZGxlIGNvcnJlY3QgdHlwZSB3aGVuIHVzZXIgY2FsbCBpbiBvbkNoYW5nZVxuICogZm9ybWF0IG1heCBvciBtaW4gdmFsdWVcbiAqIDEuIGlmIGlzSW52YWxpZCByZXR1cm4gbnVsbFxuICogMi4gaWYgcHJlY2lzaW9uIGlzIHVuZGVmaW5lZCwgcmV0dXJuIGRlY2ltYWxcbiAqIDMuIGZvcm1hdCB3aXRoIHByZWNpc2lvblxuICogICAgSS4gaWYgbWF4ID4gMCwgcm91bmQgZG93biB3aXRoIHByZWNpc2lvbi4gRXhhbXBsZTogbWF4PSAzLjUsIHByZWNpc2lvbj0wICBhZnRlckZvcm1hdDogM1xuICogICAgSUkuIGlmIG1heCA8IDAsIHJvdW5kIHVwIHdpdGggcHJlY2lzaW9uLiBFeGFtcGxlOiBtYXg9IC0zLjUsIHByZWNpc2lvbj0wICBhZnRlckZvcm1hdDogLTRcbiAqICAgIElJSS4gaWYgbWluID4gMCwgcm91bmQgdXAgd2l0aCBwcmVjaXNpb24uIEV4YW1wbGU6IG1pbj0gMy41LCBwcmVjaXNpb249MCAgYWZ0ZXJGb3JtYXQ6IDRcbiAqICAgIElWLiBpZiBtaW4gPCAwLCByb3VuZCBkb3duIHdpdGggcHJlY2lzaW9uLiBFeGFtcGxlOiBtYXg9IC0zLjUsIHByZWNpc2lvbj0wICBhZnRlckZvcm1hdDogLTNcbiAqL1xudmFyIGdldERlY2ltYWxWYWx1ZSA9IGZ1bmN0aW9uIGdldERlY2ltYWxWYWx1ZShzdHJpbmdNb2RlLCBkZWNpbWFsVmFsdWUpIHtcbiAgaWYgKHN0cmluZ01vZGUgfHwgZGVjaW1hbFZhbHVlLmlzRW1wdHkoKSkge1xuICAgIHJldHVybiBkZWNpbWFsVmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuICByZXR1cm4gZGVjaW1hbFZhbHVlLnRvTnVtYmVyKCk7XG59O1xudmFyIGdldERlY2ltYWxJZlZhbGlkYXRlID0gZnVuY3Rpb24gZ2V0RGVjaW1hbElmVmFsaWRhdGUodmFsdWUpIHtcbiAgdmFyIGRlY2ltYWwgPSBnZXRNaW5pRGVjaW1hbCh2YWx1ZSk7XG4gIHJldHVybiBkZWNpbWFsLmlzSW52YWxpZGF0ZSgpID8gbnVsbCA6IGRlY2ltYWw7XG59O1xudmFyIElucHV0TnVtYmVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuICB2YXIgX3Byb3BzJHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBwcmVmaXhDbHMgPSBfcHJvcHMkcHJlZml4Q2xzID09PSB2b2lkIDAgPyAncmMtaW5wdXQtbnVtYmVyJyA6IF9wcm9wcyRwcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgbWluID0gcHJvcHMubWluLFxuICAgIG1heCA9IHByb3BzLm1heCxcbiAgICBfcHJvcHMkc3RlcCA9IHByb3BzLnN0ZXAsXG4gICAgc3RlcCA9IF9wcm9wcyRzdGVwID09PSB2b2lkIDAgPyAxIDogX3Byb3BzJHN0ZXAsXG4gICAgZGVmYXVsdFZhbHVlID0gcHJvcHMuZGVmYXVsdFZhbHVlLFxuICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICByZWFkT25seSA9IHByb3BzLnJlYWRPbmx5LFxuICAgIHVwSGFuZGxlciA9IHByb3BzLnVwSGFuZGxlcixcbiAgICBkb3duSGFuZGxlciA9IHByb3BzLmRvd25IYW5kbGVyLFxuICAgIGtleWJvYXJkID0gcHJvcHMua2V5Ym9hcmQsXG4gICAgX3Byb3BzJGNvbnRyb2xzID0gcHJvcHMuY29udHJvbHMsXG4gICAgY29udHJvbHMgPSBfcHJvcHMkY29udHJvbHMgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkY29udHJvbHMsXG4gICAgc3RyaW5nTW9kZSA9IHByb3BzLnN0cmluZ01vZGUsXG4gICAgcGFyc2VyID0gcHJvcHMucGFyc2VyLFxuICAgIGZvcm1hdHRlciA9IHByb3BzLmZvcm1hdHRlcixcbiAgICBwcmVjaXNpb24gPSBwcm9wcy5wcmVjaXNpb24sXG4gICAgZGVjaW1hbFNlcGFyYXRvciA9IHByb3BzLmRlY2ltYWxTZXBhcmF0b3IsXG4gICAgb25DaGFuZ2UgPSBwcm9wcy5vbkNoYW5nZSxcbiAgICBvbklucHV0ID0gcHJvcHMub25JbnB1dCxcbiAgICBvblByZXNzRW50ZXIgPSBwcm9wcy5vblByZXNzRW50ZXIsXG4gICAgb25TdGVwID0gcHJvcHMub25TdGVwLFxuICAgIGlucHV0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG4gIHZhciBpbnB1dENsYXNzTmFtZSA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5wdXRcIik7XG4gIHZhciBpbnB1dFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBmb2N1cyA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0Rm9jdXMgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIgdXNlclR5cGluZ1JlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIHZhciBjb21wb3NpdGlvblJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIHZhciBzaGlmdEtleVJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVmFsdWUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUmVhbCB2YWx1ZSBjb250cm9sXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUzID0gUmVhY3QudXNlU3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdldE1pbmlEZWNpbWFsKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDAgPyB2YWx1ZSA6IGRlZmF1bHRWYWx1ZSk7XG4gICAgfSksXG4gICAgX1JlYWN0JHVzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTMsIDIpLFxuICAgIGRlY2ltYWxWYWx1ZSA9IF9SZWFjdCR1c2VTdGF0ZTRbMF0sXG4gICAgc2V0RGVjaW1hbFZhbHVlID0gX1JlYWN0JHVzZVN0YXRlNFsxXTtcbiAgZnVuY3Rpb24gc2V0VW5jb250cm9sbGVkRGVjaW1hbFZhbHVlKG5ld0RlY2ltYWwpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgc2V0RGVjaW1hbFZhbHVlKG5ld0RlY2ltYWwpO1xuICAgIH1cbiAgfVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IFBhcnNlciAmIEZvcm1hdHRlciA9PT09PT09PT09PT09PT09PT09PT09XG4gIC8qKlxuICAgKiBgcHJlY2lzaW9uYCBpcyB1c2VkIGZvciBmb3JtYXR0ZXIgJiBvbkNoYW5nZS5cbiAgICogSXQgd2lsbCBhdXRvIGdlbmVyYXRlIGJ5IGB2YWx1ZWAgJiBgc3RlcGAuXG4gICAqIEJ1dCBpdCB3aWxsIG5vdCBibG9jayB1c2VyIHR5cGluZy5cbiAgICpcbiAgICogTm90ZTogQXV0byBnZW5lcmF0ZSBgcHJlY2lzaW9uYCBpcyB1c2VkIGZvciBsZWdhY3kgbG9naWMuXG4gICAqIFdlIHNob3VsZCByZW1vdmUgdGhpcyBzaW5jZSB3ZSBhbHJlYWR5IHN1cHBvcnQgaGlnaCBwcmVjaXNpb24gd2l0aCBCaWdJbnQuXG4gICAqXG4gICAqIEBwYXJhbSBudW1iZXIgIFByb3ZpZGUgd2hpY2ggbnVtYmVyIHNob3VsZCBjYWxjdWxhdGUgcHJlY2lzaW9uXG4gICAqIEBwYXJhbSB1c2VyVHlwaW5nICBDaGFuZ2UgYnkgdXNlciB0eXBpbmdcbiAgICovXG4gIHZhciBnZXRQcmVjaXNpb24gPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAobnVtU3RyLCB1c2VyVHlwaW5nKSB7XG4gICAgaWYgKHVzZXJUeXBpbmcpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChwcmVjaXNpb24gPj0gMCkge1xuICAgICAgcmV0dXJuIHByZWNpc2lvbjtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGgubWF4KGdldE51bWJlclByZWNpc2lvbihudW1TdHIpLCBnZXROdW1iZXJQcmVjaXNpb24oc3RlcCkpO1xuICB9LCBbcHJlY2lzaW9uLCBzdGVwXSk7XG4gIC8vID4+PiBQYXJzZXJcbiAgdmFyIG1lcmdlZFBhcnNlciA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChudW0pIHtcbiAgICB2YXIgbnVtU3RyID0gU3RyaW5nKG51bSk7XG4gICAgaWYgKHBhcnNlcikge1xuICAgICAgcmV0dXJuIHBhcnNlcihudW1TdHIpO1xuICAgIH1cbiAgICB2YXIgcGFyc2VkU3RyID0gbnVtU3RyO1xuICAgIGlmIChkZWNpbWFsU2VwYXJhdG9yKSB7XG4gICAgICBwYXJzZWRTdHIgPSBwYXJzZWRTdHIucmVwbGFjZShkZWNpbWFsU2VwYXJhdG9yLCAnLicpO1xuICAgIH1cbiAgICAvLyBbTGVnYWN5XSBXZSBzdGlsbCBzdXBwb3J0IGF1dG8gY29udmVydCBgJCAxMjMsNDU2YCB0byBgMTIzNDU2YFxuICAgIHJldHVybiBwYXJzZWRTdHIucmVwbGFjZSgvW15cXHcuLV0rL2csICcnKTtcbiAgfSwgW3BhcnNlciwgZGVjaW1hbFNlcGFyYXRvcl0pO1xuICAvLyA+Pj4gRm9ybWF0dGVyXG4gIHZhciBpbnB1dFZhbHVlUmVmID0gUmVhY3QudXNlUmVmKCcnKTtcbiAgdmFyIG1lcmdlZEZvcm1hdHRlciA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChudW1iZXIsIHVzZXJUeXBpbmcpIHtcbiAgICBpZiAoZm9ybWF0dGVyKSB7XG4gICAgICByZXR1cm4gZm9ybWF0dGVyKG51bWJlciwge1xuICAgICAgICB1c2VyVHlwaW5nOiB1c2VyVHlwaW5nLFxuICAgICAgICBpbnB1dDogU3RyaW5nKGlucHV0VmFsdWVSZWYuY3VycmVudClcbiAgICAgIH0pO1xuICAgIH1cbiAgICB2YXIgc3RyID0gdHlwZW9mIG51bWJlciA9PT0gJ251bWJlcicgPyBudW0yc3RyKG51bWJlcikgOiBudW1iZXI7XG4gICAgLy8gVXNlciB0eXBpbmcgd2lsbCBub3QgYXV0byBmb3JtYXQgd2l0aCBwcmVjaXNpb24gZGlyZWN0bHlcbiAgICBpZiAoIXVzZXJUeXBpbmcpIHtcbiAgICAgIHZhciBtZXJnZWRQcmVjaXNpb24gPSBnZXRQcmVjaXNpb24oc3RyLCB1c2VyVHlwaW5nKTtcbiAgICAgIGlmICh2YWxpZGF0ZU51bWJlcihzdHIpICYmIChkZWNpbWFsU2VwYXJhdG9yIHx8IG1lcmdlZFByZWNpc2lvbiA+PSAwKSkge1xuICAgICAgICAvLyBTZXBhcmF0b3JcbiAgICAgICAgdmFyIHNlcGFyYXRvclN0ciA9IGRlY2ltYWxTZXBhcmF0b3IgfHwgJy4nO1xuICAgICAgICBzdHIgPSB0b0ZpeGVkKHN0ciwgc2VwYXJhdG9yU3RyLCBtZXJnZWRQcmVjaXNpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RyO1xuICB9LCBbZm9ybWF0dGVyLCBnZXRQcmVjaXNpb24sIGRlY2ltYWxTZXBhcmF0b3JdKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gSW5wdXRWYWx1ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvKipcbiAgICogSW5wdXQgdGV4dCB2YWx1ZSBjb250cm9sXG4gICAqXG4gICAqIFVzZXIgY2FuIG5vdCB1cGRhdGUgaW5wdXQgY29udGVudCBkaXJlY3RseS4gSXQgdXBkYXRlIHdpdGggZm9sbG93IHJ1bGVzIGJ5IHByaW9yaXR5OlxuICAgKiAgMS4gY29udHJvbGxlZCBgdmFsdWVgIGNoYW5nZWRcbiAgICogICAgKiBbU1BFQ0lBTF0gVHlwaW5nIGxpa2UgYDEuYCBzaG91bGQgbm90IGltbWVkaWF0ZWx5IGNvbnZlcnQgdG8gYDFgXG4gICAqICAyLiBVc2VyIHR5cGluZyB3aXRoIGZvcm1hdCAobm90IHByZWNpc2lvbilcbiAgICogIDMuIEJsdXIgb3IgRW50ZXIgdHJpZ2dlciByZXZhbGlkYXRlXG4gICAqL1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlNSA9IFJlYWN0LnVzZVN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBpbml0VmFsdWUgPSBkZWZhdWx0VmFsdWUgIT09IG51bGwgJiYgZGVmYXVsdFZhbHVlICE9PSB2b2lkIDAgPyBkZWZhdWx0VmFsdWUgOiB2YWx1ZTtcbiAgICAgIGlmIChkZWNpbWFsVmFsdWUuaXNJbnZhbGlkYXRlKCkgJiYgWydzdHJpbmcnLCAnbnVtYmVyJ10uaW5jbHVkZXMoX3R5cGVvZihpbml0VmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKGluaXRWYWx1ZSkgPyAnJyA6IGluaXRWYWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtZXJnZWRGb3JtYXR0ZXIoZGVjaW1hbFZhbHVlLnRvU3RyaW5nKCksIGZhbHNlKTtcbiAgICB9KSxcbiAgICBfUmVhY3QkdXNlU3RhdGU2ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlNSwgMiksXG4gICAgaW5wdXRWYWx1ZSA9IF9SZWFjdCR1c2VTdGF0ZTZbMF0sXG4gICAgc2V0SW50ZXJuYWxJbnB1dFZhbHVlID0gX1JlYWN0JHVzZVN0YXRlNlsxXTtcbiAgaW5wdXRWYWx1ZVJlZi5jdXJyZW50ID0gaW5wdXRWYWx1ZTtcbiAgLy8gU2hvdWxkIGFsd2F5cyBiZSBzdHJpbmdcbiAgZnVuY3Rpb24gc2V0SW5wdXRWYWx1ZShuZXdWYWx1ZSwgdXNlclR5cGluZykge1xuICAgIHNldEludGVybmFsSW5wdXRWYWx1ZShtZXJnZWRGb3JtYXR0ZXIoXG4gICAgLy8gSW52YWxpZGF0ZSBudW1iZXIgaXMgc29tZXRpbWUgcGFzc2VkIGJ5IGV4dGVybmFsIGNvbnRyb2wsIHdlIHNob3VsZCBsZXQgaXQgZ29cbiAgICAvLyBPdGhlcndpc2UgaXMgY29udHJvbGxlZCBieSBpbnRlcm5hbCBpbnRlcmFjdGl2ZSBsb2dpYyB3aGljaCBjaGVjayBieSB1c2VyVHlwaW5nXG4gICAgLy8gWW91IGNhbiByZWYgJ3Nob3cgbGltaXRlZCB2YWx1ZSB3aGVuIGlucHV0IGlzIG5vdCBmb2N1c2VkJyB0ZXN0IGZvciBtb3JlIGluZm8uXG4gICAgbmV3VmFsdWUuaXNJbnZhbGlkYXRlKCkgPyBuZXdWYWx1ZS50b1N0cmluZyhmYWxzZSkgOiBuZXdWYWx1ZS50b1N0cmluZyghdXNlclR5cGluZyksIHVzZXJUeXBpbmcpKTtcbiAgfVxuICAvLyA+Pj4gTWF4ICYgTWluIGxpbWl0XG4gIHZhciBtYXhEZWNpbWFsID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdldERlY2ltYWxJZlZhbGlkYXRlKG1heCk7XG4gIH0sIFttYXgsIHByZWNpc2lvbl0pO1xuICB2YXIgbWluRGVjaW1hbCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnZXREZWNpbWFsSWZWYWxpZGF0ZShtaW4pO1xuICB9LCBbbWluLCBwcmVjaXNpb25dKTtcbiAgdmFyIHVwRGlzYWJsZWQgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIW1heERlY2ltYWwgfHwgIWRlY2ltYWxWYWx1ZSB8fCBkZWNpbWFsVmFsdWUuaXNJbnZhbGlkYXRlKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG1heERlY2ltYWwubGVzc0VxdWFscyhkZWNpbWFsVmFsdWUpO1xuICB9LCBbbWF4RGVjaW1hbCwgZGVjaW1hbFZhbHVlXSk7XG4gIHZhciBkb3duRGlzYWJsZWQgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIW1pbkRlY2ltYWwgfHwgIWRlY2ltYWxWYWx1ZSB8fCBkZWNpbWFsVmFsdWUuaXNJbnZhbGlkYXRlKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGRlY2ltYWxWYWx1ZS5sZXNzRXF1YWxzKG1pbkRlY2ltYWwpO1xuICB9LCBbbWluRGVjaW1hbCwgZGVjaW1hbFZhbHVlXSk7XG4gIC8vIEN1cnNvciBjb250cm9sbGVyXG4gIHZhciBfdXNlQ3Vyc29yID0gdXNlQ3Vyc29yKGlucHV0UmVmLmN1cnJlbnQsIGZvY3VzKSxcbiAgICBfdXNlQ3Vyc29yMiA9IF9zbGljZWRUb0FycmF5KF91c2VDdXJzb3IsIDIpLFxuICAgIHJlY29yZEN1cnNvciA9IF91c2VDdXJzb3IyWzBdLFxuICAgIHJlc3RvcmVDdXJzb3IgPSBfdXNlQ3Vyc29yMlsxXTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRGF0YSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvKipcbiAgICogRmluZCB0YXJnZXQgdmFsdWUgY2xvc2V0IHdpdGhpbiByYW5nZS5cbiAgICogZS5nLiBbMTEsIDI4XTpcbiAgICogICAgMyAgPT4gMTFcbiAgICogICAgMjMgPT4gMjNcbiAgICogICAgOTkgPT4gMjhcbiAgICovXG4gIHZhciBnZXRSYW5nZVZhbHVlID0gZnVuY3Rpb24gZ2V0UmFuZ2VWYWx1ZSh0YXJnZXQpIHtcbiAgICAvLyB0YXJnZXQgPiBtYXhcbiAgICBpZiAobWF4RGVjaW1hbCAmJiAhdGFyZ2V0Lmxlc3NFcXVhbHMobWF4RGVjaW1hbCkpIHtcbiAgICAgIHJldHVybiBtYXhEZWNpbWFsO1xuICAgIH1cbiAgICAvLyB0YXJnZXQgPCBtaW5cbiAgICBpZiAobWluRGVjaW1hbCAmJiAhbWluRGVjaW1hbC5sZXNzRXF1YWxzKHRhcmdldCkpIHtcbiAgICAgIHJldHVybiBtaW5EZWNpbWFsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcbiAgLyoqXG4gICAqIENoZWNrIHZhbHVlIGlzIGluIFttaW4sIG1heF0gcmFuZ2VcbiAgICovXG4gIHZhciBpc0luUmFuZ2UgPSBmdW5jdGlvbiBpc0luUmFuZ2UodGFyZ2V0KSB7XG4gICAgcmV0dXJuICFnZXRSYW5nZVZhbHVlKHRhcmdldCk7XG4gIH07XG4gIC8qKlxuICAgKiBUcmlnZ2VyIGBvbkNoYW5nZWAgaWYgdmFsdWUgdmFsaWRhdGVkIGFuZCBub3QgZXF1YWxzIG9mIG9yaWdpbi5cbiAgICogUmV0dXJuIHRoZSB2YWx1ZSB0aGF0IHJlLWFsaWduIGluIHJhbmdlLlxuICAgKi9cbiAgdmFyIHRyaWdnZXJWYWx1ZVVwZGF0ZSA9IGZ1bmN0aW9uIHRyaWdnZXJWYWx1ZVVwZGF0ZShuZXdWYWx1ZSwgdXNlclR5cGluZykge1xuICAgIHZhciB1cGRhdGVWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIHZhciBpc1JhbmdlVmFsaWRhdGUgPSBpc0luUmFuZ2UodXBkYXRlVmFsdWUpIHx8IHVwZGF0ZVZhbHVlLmlzRW1wdHkoKTtcbiAgICAvLyBTa2lwIGFsaWduIHZhbHVlIHdoZW4gdHJpZ2dlciB2YWx1ZSBpcyBlbXB0eS5cbiAgICAvLyBXZSBqdXN0IHRyaWdnZXIgb25DaGFuZ2UobnVsbClcbiAgICAvLyBUaGlzIHNob3VsZCBub3QgYmxvY2sgdXNlciB0eXBpbmdcbiAgICBpZiAoIXVwZGF0ZVZhbHVlLmlzRW1wdHkoKSAmJiAhdXNlclR5cGluZykge1xuICAgICAgLy8gUmV2ZXJ0IHZhbHVlIGluIHJhbmdlIGlmIG5lZWRlZFxuICAgICAgdXBkYXRlVmFsdWUgPSBnZXRSYW5nZVZhbHVlKHVwZGF0ZVZhbHVlKSB8fCB1cGRhdGVWYWx1ZTtcbiAgICAgIGlzUmFuZ2VWYWxpZGF0ZSA9IHRydWU7XG4gICAgfVxuICAgIGlmICghcmVhZE9ubHkgJiYgIWRpc2FibGVkICYmIGlzUmFuZ2VWYWxpZGF0ZSkge1xuICAgICAgdmFyIG51bVN0ciA9IHVwZGF0ZVZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICB2YXIgbWVyZ2VkUHJlY2lzaW9uID0gZ2V0UHJlY2lzaW9uKG51bVN0ciwgdXNlclR5cGluZyk7XG4gICAgICBpZiAobWVyZ2VkUHJlY2lzaW9uID49IDApIHtcbiAgICAgICAgdXBkYXRlVmFsdWUgPSBnZXRNaW5pRGVjaW1hbCh0b0ZpeGVkKG51bVN0ciwgJy4nLCBtZXJnZWRQcmVjaXNpb24pKTtcbiAgICAgICAgLy8gV2hlbiB0byBmaXhlZC4gVGhlIHZhbHVlIG1heSBvdXQgb2YgbWluICYgbWF4IHJhbmdlLlxuICAgICAgICAvLyA0IGluIFswLCAzLjhdID0+IDMuOCA9PiA0ICh0b0ZpeGVkKVxuICAgICAgICBpZiAoIWlzSW5SYW5nZSh1cGRhdGVWYWx1ZSkpIHtcbiAgICAgICAgICB1cGRhdGVWYWx1ZSA9IGdldE1pbmlEZWNpbWFsKHRvRml4ZWQobnVtU3RyLCAnLicsIG1lcmdlZFByZWNpc2lvbiwgdHJ1ZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBUcmlnZ2VyIGV2ZW50XG4gICAgICBpZiAoIXVwZGF0ZVZhbHVlLmVxdWFscyhkZWNpbWFsVmFsdWUpKSB7XG4gICAgICAgIHNldFVuY29udHJvbGxlZERlY2ltYWxWYWx1ZSh1cGRhdGVWYWx1ZSk7XG4gICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZSh1cGRhdGVWYWx1ZS5pc0VtcHR5KCkgPyBudWxsIDogZ2V0RGVjaW1hbFZhbHVlKHN0cmluZ01vZGUsIHVwZGF0ZVZhbHVlKSk7XG4gICAgICAgIC8vIFJlZm9ybWF0IGlucHV0IGlmIHZhbHVlIGlzIG5vdCBjb250cm9sbGVkXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgc2V0SW5wdXRWYWx1ZSh1cGRhdGVWYWx1ZSwgdXNlclR5cGluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB1cGRhdGVWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGRlY2ltYWxWYWx1ZTtcbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gVXNlciBJbnB1dCA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb25OZXh0UHJvbWlzZSA9IHVzZUZyYW1lKCk7XG4gIC8vID4+PiBDb2xsZWN0IGlucHV0IHZhbHVlXG4gIHZhciBjb2xsZWN0SW5wdXRWYWx1ZSA9IGZ1bmN0aW9uIGNvbGxlY3RJbnB1dFZhbHVlKGlucHV0U3RyKSB7XG4gICAgcmVjb3JkQ3Vyc29yKCk7XG4gICAgLy8gVXBkYXRlIGlucHV0VmFsdWUgaW5jYXNlIGlucHV0IGNhbiBub3QgcGFyc2UgYXMgbnVtYmVyXG4gICAgc2V0SW50ZXJuYWxJbnB1dFZhbHVlKGlucHV0U3RyKTtcbiAgICAvLyBQYXJzZSBudW1iZXJcbiAgICBpZiAoIWNvbXBvc2l0aW9uUmVmLmN1cnJlbnQpIHtcbiAgICAgIHZhciBmaW5hbFZhbHVlID0gbWVyZ2VkUGFyc2VyKGlucHV0U3RyKTtcbiAgICAgIHZhciBmaW5hbERlY2ltYWwgPSBnZXRNaW5pRGVjaW1hbChmaW5hbFZhbHVlKTtcbiAgICAgIGlmICghZmluYWxEZWNpbWFsLmlzTmFOKCkpIHtcbiAgICAgICAgdHJpZ2dlclZhbHVlVXBkYXRlKGZpbmFsRGVjaW1hbCwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFRyaWdnZXIgb25JbnB1dCBsYXRlciB0byBsZXQgdXNlciBjdXN0b21pemUgdmFsdWUgaWYgdGhleSB3YW50IGRvIGhhbmRsZSBzb21ldGhpbmcgYWZ0ZXIgb25DaGFuZ2VcbiAgICBvbklucHV0ID09PSBudWxsIHx8IG9uSW5wdXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uSW5wdXQoaW5wdXRTdHIpO1xuICAgIC8vIG9wdGltaXplIGZvciBjaGluZXNlIGlucHV0IGV4cGVyaWVuY2VcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy84MTk2XG4gICAgb25OZXh0UHJvbWlzZShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbmV4dElucHV0U3RyID0gaW5wdXRTdHI7XG4gICAgICBpZiAoIXBhcnNlcikge1xuICAgICAgICBuZXh0SW5wdXRTdHIgPSBpbnB1dFN0ci5yZXBsYWNlKC/jgIIvZywgJy4nKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXh0SW5wdXRTdHIgIT09IGlucHV0U3RyKSB7XG4gICAgICAgIGNvbGxlY3RJbnB1dFZhbHVlKG5leHRJbnB1dFN0cik7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIC8vID4+PiBDb21wb3NpdGlvblxuICB2YXIgb25Db21wb3NpdGlvblN0YXJ0ID0gZnVuY3Rpb24gb25Db21wb3NpdGlvblN0YXJ0KCkge1xuICAgIGNvbXBvc2l0aW9uUmVmLmN1cnJlbnQgPSB0cnVlO1xuICB9O1xuICB2YXIgb25Db21wb3NpdGlvbkVuZCA9IGZ1bmN0aW9uIG9uQ29tcG9zaXRpb25FbmQoKSB7XG4gICAgY29tcG9zaXRpb25SZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIGNvbGxlY3RJbnB1dFZhbHVlKGlucHV0UmVmLmN1cnJlbnQudmFsdWUpO1xuICB9O1xuICAvLyA+Pj4gSW5wdXRcbiAgdmFyIG9uSW50ZXJuYWxJbnB1dCA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxJbnB1dChlKSB7XG4gICAgY29sbGVjdElucHV0VmFsdWUoZS50YXJnZXQudmFsdWUpO1xuICB9O1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTdGVwID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBvbkludGVybmFsU3RlcCA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxTdGVwKHVwKSB7XG4gICAgdmFyIF9pbnB1dFJlZiRjdXJyZW50O1xuICAgIC8vIElnbm9yZSBzdGVwIHNpbmNlIG91dCBvZiByYW5nZVxuICAgIGlmICh1cCAmJiB1cERpc2FibGVkIHx8ICF1cCAmJiBkb3duRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQ2xlYXIgdHlwaW5nIHN0YXR1cyBzaW5jZSBpdCBtYXkgY2F1c2VkIGJ5IHVwICYgZG93biBrZXkuXG4gICAgLy8gV2Ugc2hvdWxkIHN5bmMgd2l0aCBpbnB1dCB2YWx1ZS5cbiAgICB1c2VyVHlwaW5nUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB2YXIgc3RlcERlY2ltYWwgPSBnZXRNaW5pRGVjaW1hbChzaGlmdEtleVJlZi5jdXJyZW50ID8gZ2V0RGVjdXBsZVN0ZXBzKHN0ZXApIDogc3RlcCk7XG4gICAgaWYgKCF1cCkge1xuICAgICAgc3RlcERlY2ltYWwgPSBzdGVwRGVjaW1hbC5uZWdhdGUoKTtcbiAgICB9XG4gICAgdmFyIHRhcmdldCA9IChkZWNpbWFsVmFsdWUgfHwgZ2V0TWluaURlY2ltYWwoMCkpLmFkZChzdGVwRGVjaW1hbC50b1N0cmluZygpKTtcbiAgICB2YXIgdXBkYXRlZFZhbHVlID0gdHJpZ2dlclZhbHVlVXBkYXRlKHRhcmdldCwgZmFsc2UpO1xuICAgIG9uU3RlcCA9PT0gbnVsbCB8fCBvblN0ZXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uU3RlcChnZXREZWNpbWFsVmFsdWUoc3RyaW5nTW9kZSwgdXBkYXRlZFZhbHVlKSwge1xuICAgICAgb2Zmc2V0OiBzaGlmdEtleVJlZi5jdXJyZW50ID8gZ2V0RGVjdXBsZVN0ZXBzKHN0ZXApIDogc3RlcCxcbiAgICAgIHR5cGU6IHVwID8gJ3VwJyA6ICdkb3duJ1xuICAgIH0pO1xuICAgIChfaW5wdXRSZWYkY3VycmVudCA9IGlucHV0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9pbnB1dFJlZiRjdXJyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfaW5wdXRSZWYkY3VycmVudC5mb2N1cygpO1xuICB9O1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IEZsdXNoID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8qKlxuICAgKiBGbHVzaCBjdXJyZW50IGlucHV0IGNvbnRlbnQgdG8gdHJpZ2dlciB2YWx1ZSBjaGFuZ2UgJiByZS1mb3JtYXR0ZXIgaW5wdXQgaWYgbmVlZGVkXG4gICAqL1xuICB2YXIgZmx1c2hJbnB1dFZhbHVlID0gZnVuY3Rpb24gZmx1c2hJbnB1dFZhbHVlKHVzZXJUeXBpbmcpIHtcbiAgICB2YXIgcGFyc2VkVmFsdWUgPSBnZXRNaW5pRGVjaW1hbChtZXJnZWRQYXJzZXIoaW5wdXRWYWx1ZSkpO1xuICAgIHZhciBmb3JtYXRWYWx1ZSA9IHBhcnNlZFZhbHVlO1xuICAgIGlmICghcGFyc2VkVmFsdWUuaXNOYU4oKSkge1xuICAgICAgLy8gT25seSB2YWxpZGF0ZSB2YWx1ZSBvciBlbXB0eSB2YWx1ZSBjYW4gYmUgcmUtZmlsbCB0byBpbnB1dFZhbHVlXG4gICAgICAvLyBSZWFzc2lnbiB0aGUgZm9ybWF0VmFsdWUgd2l0aGluIHJhbmdlZCBvZiB0cmlnZ2VyIGNvbnRyb2xcbiAgICAgIGZvcm1hdFZhbHVlID0gdHJpZ2dlclZhbHVlVXBkYXRlKHBhcnNlZFZhbHVlLCB1c2VyVHlwaW5nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybWF0VmFsdWUgPSBkZWNpbWFsVmFsdWU7XG4gICAgfVxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBSZXNldCBiYWNrIHdpdGggY29udHJvbGxlZCB2YWx1ZSBmaXJzdFxuICAgICAgc2V0SW5wdXRWYWx1ZShkZWNpbWFsVmFsdWUsIGZhbHNlKTtcbiAgICB9IGVsc2UgaWYgKCFmb3JtYXRWYWx1ZS5pc05hTigpKSB7XG4gICAgICAvLyBSZXNldCBpbnB1dCBiYWNrIHNpbmNlIG5vIHZhbGlkYXRlIHZhbHVlXG4gICAgICBzZXRJbnB1dFZhbHVlKGZvcm1hdFZhbHVlLCBmYWxzZSk7XG4gICAgfVxuICB9O1xuICAvLyBTb2x2ZSB0aGUgaXNzdWUgb2YgdGhlIGV2ZW50IHRyaWdnZXJpbmcgc2VxdWVuY2Ugd2hlbiBlbnRlcmluZyBudW1iZXJzIGluIGNoaW5lc2UgaW5wdXQgKFNhZmFyaSlcbiAgdmFyIG9uQmVmb3JlSW5wdXQgPSBmdW5jdGlvbiBvbkJlZm9yZUlucHV0KCkge1xuICAgIHVzZXJUeXBpbmdSZWYuY3VycmVudCA9IHRydWU7XG4gIH07XG4gIHZhciBvbktleURvd24gPSBmdW5jdGlvbiBvbktleURvd24oZXZlbnQpIHtcbiAgICB2YXIgd2hpY2ggPSBldmVudC53aGljaCxcbiAgICAgIHNoaWZ0S2V5ID0gZXZlbnQuc2hpZnRLZXk7XG4gICAgdXNlclR5cGluZ1JlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICBpZiAoc2hpZnRLZXkpIHtcbiAgICAgIHNoaWZ0S2V5UmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaGlmdEtleVJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh3aGljaCA9PT0gS2V5Q29kZS5FTlRFUikge1xuICAgICAgaWYgKCFjb21wb3NpdGlvblJlZi5jdXJyZW50KSB7XG4gICAgICAgIHVzZXJUeXBpbmdSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgZmx1c2hJbnB1dFZhbHVlKGZhbHNlKTtcbiAgICAgIG9uUHJlc3NFbnRlciA9PT0gbnVsbCB8fCBvblByZXNzRW50ZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uUHJlc3NFbnRlcihldmVudCk7XG4gICAgfVxuICAgIGlmIChrZXlib2FyZCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gRG8gc3RlcFxuICAgIGlmICghY29tcG9zaXRpb25SZWYuY3VycmVudCAmJiBbS2V5Q29kZS5VUCwgS2V5Q29kZS5ET1dOXS5pbmNsdWRlcyh3aGljaCkpIHtcbiAgICAgIG9uSW50ZXJuYWxTdGVwKEtleUNvZGUuVVAgPT09IHdoaWNoKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9O1xuICB2YXIgb25LZXlVcCA9IGZ1bmN0aW9uIG9uS2V5VXAoKSB7XG4gICAgdXNlclR5cGluZ1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgc2hpZnRLZXlSZWYuY3VycmVudCA9IGZhbHNlO1xuICB9O1xuICAvLyA+Pj4gRm9jdXMgJiBCbHVyXG4gIHZhciBvbkJsdXIgPSBmdW5jdGlvbiBvbkJsdXIoKSB7XG4gICAgZmx1c2hJbnB1dFZhbHVlKGZhbHNlKTtcbiAgICBzZXRGb2N1cyhmYWxzZSk7XG4gICAgdXNlclR5cGluZ1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gIH07XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IENvbnRyb2xsZWQgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5wdXQgYnkgcHJlY2lzaW9uXG4gIHVzZUxheW91dFVwZGF0ZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFkZWNpbWFsVmFsdWUuaXNJbnZhbGlkYXRlKCkpIHtcbiAgICAgIHNldElucHV0VmFsdWUoZGVjaW1hbFZhbHVlLCBmYWxzZSk7XG4gICAgfVxuICB9LCBbcHJlY2lzaW9uXSk7XG4gIC8vIElucHV0IGJ5IHZhbHVlXG4gIHVzZUxheW91dFVwZGF0ZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG5ld1ZhbHVlID0gZ2V0TWluaURlY2ltYWwodmFsdWUpO1xuICAgIHNldERlY2ltYWxWYWx1ZShuZXdWYWx1ZSk7XG4gICAgdmFyIGN1cnJlbnRQYXJzZWRWYWx1ZSA9IGdldE1pbmlEZWNpbWFsKG1lcmdlZFBhcnNlcihpbnB1dFZhbHVlKSk7XG4gICAgLy8gV2hlbiB1c2VyIHR5cGluZyBmcm9tIGAxLjJgIHRvIGAxLmAsIHdlIHNob3VsZCBub3QgY29udmVydCB0byBgMWAgaW1tZWRpYXRlbHkuXG4gICAgLy8gQnV0IGxldCBpdCBnbyBpZiB1c2VyIHNldCBgZm9ybWF0dGVyYFxuICAgIGlmICghbmV3VmFsdWUuZXF1YWxzKGN1cnJlbnRQYXJzZWRWYWx1ZSkgfHwgIXVzZXJUeXBpbmdSZWYuY3VycmVudCB8fCBmb3JtYXR0ZXIpIHtcbiAgICAgIC8vIFVwZGF0ZSB2YWx1ZSBhcyBlZmZlY3RcbiAgICAgIHNldElucHV0VmFsdWUobmV3VmFsdWUsIHVzZXJUeXBpbmdSZWYuY3VycmVudCk7XG4gICAgfVxuICB9LCBbdmFsdWVdKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDdXJzb3IgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB1c2VMYXlvdXRVcGRhdGVFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChmb3JtYXR0ZXIpIHtcbiAgICAgIHJlc3RvcmVDdXJzb3IoKTtcbiAgICB9XG4gIH0sIFtpbnB1dFZhbHVlXSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBjbGFzc05hbWUsIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZm9jdXNlZFwiKSwgZm9jdXMpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWRcIiksIGRpc2FibGVkKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJlYWRvbmx5XCIpLCByZWFkT25seSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ub3QtYS1udW1iZXJcIiksIGRlY2ltYWxWYWx1ZS5pc05hTigpKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW91dC1vZi1yYW5nZVwiKSwgIWRlY2ltYWxWYWx1ZS5pc0ludmFsaWRhdGUoKSAmJiAhaXNJblJhbmdlKGRlY2ltYWxWYWx1ZSkpLCBfY2xhc3NOYW1lcykpLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBvbkZvY3VzOiBmdW5jdGlvbiBvbkZvY3VzKCkge1xuICAgICAgc2V0Rm9jdXModHJ1ZSk7XG4gICAgfSxcbiAgICBvbkJsdXI6IG9uQmx1cixcbiAgICBvbktleURvd246IG9uS2V5RG93bixcbiAgICBvbktleVVwOiBvbktleVVwLFxuICAgIG9uQ29tcG9zaXRpb25TdGFydDogb25Db21wb3NpdGlvblN0YXJ0LFxuICAgIG9uQ29tcG9zaXRpb25FbmQ6IG9uQ29tcG9zaXRpb25FbmQsXG4gICAgb25CZWZvcmVJbnB1dDogb25CZWZvcmVJbnB1dFxuICB9LCBjb250cm9scyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTdGVwSGFuZGxlciwge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIHVwTm9kZTogdXBIYW5kbGVyLFxuICAgIGRvd25Ob2RlOiBkb3duSGFuZGxlcixcbiAgICB1cERpc2FibGVkOiB1cERpc2FibGVkLFxuICAgIGRvd25EaXNhYmxlZDogZG93bkRpc2FibGVkLFxuICAgIG9uU3RlcDogb25JbnRlcm5hbFN0ZXBcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KGlucHV0Q2xhc3NOYW1lLCBcIi13cmFwXCIpXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgX2V4dGVuZHMoe1xuICAgIGF1dG9Db21wbGV0ZTogXCJvZmZcIixcbiAgICByb2xlOiBcInNwaW5idXR0b25cIixcbiAgICBcImFyaWEtdmFsdWVtaW5cIjogbWluLFxuICAgIFwiYXJpYS12YWx1ZW1heFwiOiBtYXgsXG4gICAgXCJhcmlhLXZhbHVlbm93XCI6IGRlY2ltYWxWYWx1ZS5pc0ludmFsaWRhdGUoKSA/IG51bGwgOiBkZWNpbWFsVmFsdWUudG9TdHJpbmcoKSxcbiAgICBzdGVwOiBzdGVwXG4gIH0sIGlucHV0UHJvcHMsIHtcbiAgICByZWY6IGNvbXBvc2VSZWYoaW5wdXRSZWYsIHJlZiksXG4gICAgY2xhc3NOYW1lOiBpbnB1dENsYXNzTmFtZSxcbiAgICB2YWx1ZTogaW5wdXRWYWx1ZSxcbiAgICBvbkNoYW5nZTogb25JbnRlcm5hbElucHV0LFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICByZWFkT25seTogcmVhZE9ubHlcbiAgfSkpKSk7XG59KTtcbklucHV0TnVtYmVyLmRpc3BsYXlOYW1lID0gJ0lucHV0TnVtYmVyJztcbmV4cG9ydCBkZWZhdWx0IElucHV0TnVtYmVyOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBEb3duT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Rvd25PdXRsaW5lZFwiO1xuaW1wb3J0IFVwT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1VwT3V0bGluZWRcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJjSW5wdXROdW1iZXIgZnJvbSAncmMtaW5wdXQtbnVtYmVyJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCBEaXNhYmxlZENvbnRleHQgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL0Rpc2FibGVkQ29udGV4dCc7XG5pbXBvcnQgU2l6ZUNvbnRleHQgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL1NpemVDb250ZXh0JztcbmltcG9ydCB7IEZvcm1JdGVtSW5wdXRDb250ZXh0LCBOb0Zvcm1TdHlsZSB9IGZyb20gJy4uL2Zvcm0vY29udGV4dCc7XG5pbXBvcnQgeyBOb0NvbXBhY3RTdHlsZSwgdXNlQ29tcGFjdEl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vc3BhY2UvQ29tcGFjdCc7XG5pbXBvcnQgeyBjbG9uZUVsZW1lbnQgfSBmcm9tICcuLi9fdXRpbC9yZWFjdE5vZGUnO1xuaW1wb3J0IHsgZ2V0TWVyZ2VkU3RhdHVzLCBnZXRTdGF0dXNDbGFzc05hbWVzIH0gZnJvbSAnLi4vX3V0aWwvc3RhdHVzVXRpbHMnO1xudmFyIElucHV0TnVtYmVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICBkaXJlY3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb247XG4gIHZhciBzaXplID0gUmVhY3QudXNlQ29udGV4dChTaXplQ29udGV4dCk7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShmYWxzZSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgZm9jdXNlZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0Rm9jdXMgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIgaW5wdXRSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGlucHV0UmVmLmN1cnJlbnQ7XG4gIH0pO1xuICB2YXIgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIGN1c3RvbWl6ZVNpemUgPSBwcm9wcy5zaXplLFxuICAgIGN1c3RvbURpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGFkZG9uQmVmb3JlID0gcHJvcHMuYWRkb25CZWZvcmUsXG4gICAgYWRkb25BZnRlciA9IHByb3BzLmFkZG9uQWZ0ZXIsXG4gICAgcHJlZml4ID0gcHJvcHMucHJlZml4LFxuICAgIF9wcm9wcyRib3JkZXJlZCA9IHByb3BzLmJvcmRlcmVkLFxuICAgIGJvcmRlcmVkID0gX3Byb3BzJGJvcmRlcmVkID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJGJvcmRlcmVkLFxuICAgIHJlYWRPbmx5ID0gcHJvcHMucmVhZE9ubHksXG4gICAgY3VzdG9tU3RhdHVzID0gcHJvcHMuc3RhdHVzLFxuICAgIGNvbnRyb2xzID0gcHJvcHMuY29udHJvbHMsXG4gICAgb3RoZXJzID0gX19yZXN0KHByb3BzLCBbXCJjbGFzc05hbWVcIiwgXCJzaXplXCIsIFwiZGlzYWJsZWRcIiwgXCJwcmVmaXhDbHNcIiwgXCJhZGRvbkJlZm9yZVwiLCBcImFkZG9uQWZ0ZXJcIiwgXCJwcmVmaXhcIiwgXCJib3JkZXJlZFwiLCBcInJlYWRPbmx5XCIsIFwic3RhdHVzXCIsIFwiY29udHJvbHNcIl0pO1xuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdpbnB1dC1udW1iZXInLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgX3VzZUNvbXBhY3RJdGVtQ29udGV4ID0gdXNlQ29tcGFjdEl0ZW1Db250ZXh0KHByZWZpeENscywgZGlyZWN0aW9uKSxcbiAgICBjb21wYWN0U2l6ZSA9IF91c2VDb21wYWN0SXRlbUNvbnRleC5jb21wYWN0U2l6ZSxcbiAgICBjb21wYWN0SXRlbUNsYXNzbmFtZXMgPSBfdXNlQ29tcGFjdEl0ZW1Db250ZXguY29tcGFjdEl0ZW1DbGFzc25hbWVzO1xuICB2YXIgdXBJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVXBPdXRsaW5lZCwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oYW5kbGVyLXVwLWlubmVyXCIpXG4gIH0pO1xuICB2YXIgZG93bkljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEb3duT3V0bGluZWQsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGFuZGxlci1kb3duLWlubmVyXCIpXG4gIH0pO1xuICB2YXIgY29udHJvbHNUZW1wID0gdHlwZW9mIGNvbnRyb2xzID09PSAnYm9vbGVhbicgPyBjb250cm9scyA6IHVuZGVmaW5lZDtcbiAgaWYgKF90eXBlb2YoY29udHJvbHMpID09PSAnb2JqZWN0Jykge1xuICAgIHVwSWNvbiA9IHR5cGVvZiBjb250cm9scy51cEljb24gPT09ICd1bmRlZmluZWQnID8gdXBJY29uIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oYW5kbGVyLXVwLWlubmVyXCIpXG4gICAgfSwgY29udHJvbHMudXBJY29uKTtcbiAgICBkb3duSWNvbiA9IHR5cGVvZiBjb250cm9scy5kb3duSWNvbiA9PT0gJ3VuZGVmaW5lZCcgPyBkb3duSWNvbiA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGFuZGxlci1kb3duLWlubmVyXCIpXG4gICAgfSwgY29udHJvbHMuZG93bkljb24pO1xuICB9XG4gIHZhciBfdXNlQ29udGV4dCA9IHVzZUNvbnRleHQoRm9ybUl0ZW1JbnB1dENvbnRleHQpLFxuICAgIGhhc0ZlZWRiYWNrID0gX3VzZUNvbnRleHQuaGFzRmVlZGJhY2ssXG4gICAgY29udGV4dFN0YXR1cyA9IF91c2VDb250ZXh0LnN0YXR1cyxcbiAgICBpc0Zvcm1JdGVtSW5wdXQgPSBfdXNlQ29udGV4dC5pc0Zvcm1JdGVtSW5wdXQsXG4gICAgZmVlZGJhY2tJY29uID0gX3VzZUNvbnRleHQuZmVlZGJhY2tJY29uO1xuICB2YXIgbWVyZ2VkU3RhdHVzID0gZ2V0TWVyZ2VkU3RhdHVzKGNvbnRleHRTdGF0dXMsIGN1c3RvbVN0YXR1cyk7XG4gIHZhciBtZXJnZVNpemUgPSBjb21wYWN0U2l6ZSB8fCBjdXN0b21pemVTaXplIHx8IHNpemU7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PSBEaXNhYmxlZCA9PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGRpc2FibGVkID0gUmVhY3QudXNlQ29udGV4dChEaXNhYmxlZENvbnRleHQpO1xuICB2YXIgbWVyZ2VkRGlzYWJsZWQgPSBjdXN0b21EaXNhYmxlZCAhPT0gbnVsbCAmJiBjdXN0b21EaXNhYmxlZCAhPT0gdm9pZCAwID8gY3VzdG9tRGlzYWJsZWQgOiBkaXNhYmxlZDtcbiAgdmFyIGlucHV0TnVtYmVyQ2xhc3MgPSBjbGFzc05hbWVzKChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbGdcIiksIG1lcmdlU2l6ZSA9PT0gJ2xhcmdlJyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zbVwiKSwgbWVyZ2VTaXplID09PSAnc21hbGwnKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ib3JkZXJsZXNzXCIpLCAhYm9yZGVyZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW4tZm9ybS1pdGVtXCIpLCBpc0Zvcm1JdGVtSW5wdXQpLCBfY2xhc3NOYW1lcyksIGdldFN0YXR1c0NsYXNzTmFtZXMocHJlZml4Q2xzLCBtZXJnZWRTdGF0dXMpLCBjb21wYWN0SXRlbUNsYXNzbmFtZXMsIGNsYXNzTmFtZSk7XG4gIHZhciBlbGVtZW50ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmNJbnB1dE51bWJlciwgX2V4dGVuZHMoe1xuICAgIHJlZjogaW5wdXRSZWYsXG4gICAgZGlzYWJsZWQ6IG1lcmdlZERpc2FibGVkLFxuICAgIGNsYXNzTmFtZTogaW5wdXROdW1iZXJDbGFzcyxcbiAgICB1cEhhbmRsZXI6IHVwSWNvbixcbiAgICBkb3duSGFuZGxlcjogZG93bkljb24sXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgcmVhZE9ubHk6IHJlYWRPbmx5LFxuICAgIGNvbnRyb2xzOiBjb250cm9sc1RlbXBcbiAgfSwgb3RoZXJzKSk7XG4gIGlmIChwcmVmaXggIT0gbnVsbCB8fCBoYXNGZWVkYmFjaykge1xuICAgIHZhciBfY2xhc3NOYW1lczI7XG4gICAgdmFyIGFmZml4V3JhcHBlckNscyA9IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hZmZpeC13cmFwcGVyXCIpLCBnZXRTdGF0dXNDbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYWZmaXgtd3JhcHBlclwiKSwgbWVyZ2VkU3RhdHVzLCBoYXNGZWVkYmFjayksIChfY2xhc3NOYW1lczIgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hZmZpeC13cmFwcGVyLWZvY3VzZWRcIiksIGZvY3VzZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFmZml4LXdyYXBwZXItZGlzYWJsZWRcIiksIHByb3BzLmRpc2FibGVkKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hZmZpeC13cmFwcGVyLXNtXCIpLCBzaXplID09PSAnc21hbGwnKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hZmZpeC13cmFwcGVyLWxnXCIpLCBzaXplID09PSAnbGFyZ2UnKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hZmZpeC13cmFwcGVyLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYWZmaXgtd3JhcHBlci1yZWFkb25seVwiKSwgcmVhZE9ubHkpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFmZml4LXdyYXBwZXItYm9yZGVybGVzc1wiKSwgIWJvcmRlcmVkKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQoY2xhc3NOYW1lKSwgIShhZGRvbkJlZm9yZSB8fCBhZGRvbkFmdGVyKSAmJiBjbGFzc05hbWUpLCBfY2xhc3NOYW1lczIpKTtcbiAgICBlbGVtZW50ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBhZmZpeFdyYXBwZXJDbHMsXG4gICAgICBzdHlsZTogcHJvcHMuc3R5bGUsXG4gICAgICBvbk1vdXNlVXA6IGZ1bmN0aW9uIG9uTW91c2VVcCgpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0UmVmLmN1cnJlbnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9LCBwcmVmaXggJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wcmVmaXhcIilcbiAgICB9LCBwcmVmaXgpLCBjbG9uZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgc3R5bGU6IG51bGwsXG4gICAgICB2YWx1ZTogcHJvcHMudmFsdWUsXG4gICAgICBvbkZvY3VzOiBmdW5jdGlvbiBvbkZvY3VzKGV2ZW50KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgc2V0Rm9jdXModHJ1ZSk7XG4gICAgICAgIChfYSA9IHByb3BzLm9uRm9jdXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKHByb3BzLCBldmVudCk7XG4gICAgICB9LFxuICAgICAgb25CbHVyOiBmdW5jdGlvbiBvbkJsdXIoZXZlbnQpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBzZXRGb2N1cyhmYWxzZSk7XG4gICAgICAgIChfYSA9IHByb3BzLm9uQmx1cikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwocHJvcHMsIGV2ZW50KTtcbiAgICAgIH1cbiAgICB9KSwgaGFzRmVlZGJhY2sgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zdWZmaXhcIilcbiAgICB9LCBmZWVkYmFja0ljb24pKTtcbiAgfVxuICBpZiAoYWRkb25CZWZvcmUgIT0gbnVsbCB8fCBhZGRvbkFmdGVyICE9IG51bGwpIHtcbiAgICB2YXIgX2NsYXNzTmFtZXM0O1xuICAgIHZhciB3cmFwcGVyQ2xhc3NOYW1lID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ncm91cFwiKTtcbiAgICB2YXIgYWRkb25DbGFzc05hbWUgPSBcIlwiLmNvbmNhdCh3cmFwcGVyQ2xhc3NOYW1lLCBcIi1hZGRvblwiKTtcbiAgICB2YXIgYWRkb25CZWZvcmVOb2RlID0gYWRkb25CZWZvcmUgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IGFkZG9uQ2xhc3NOYW1lXG4gICAgfSwgYWRkb25CZWZvcmUpIDogbnVsbDtcbiAgICB2YXIgYWRkb25BZnRlck5vZGUgPSBhZGRvbkFmdGVyID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBhZGRvbkNsYXNzTmFtZVxuICAgIH0sIGFkZG9uQWZ0ZXIpIDogbnVsbDtcbiAgICB2YXIgbWVyZ2VkV3JhcHBlckNsYXNzTmFtZSA9IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi13cmFwcGVyXCIpLCB3cmFwcGVyQ2xhc3NOYW1lLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHdyYXBwZXJDbGFzc05hbWUsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJykpO1xuICAgIHZhciBtZXJnZWRHcm91cENsYXNzTmFtZSA9IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ncm91cC13cmFwcGVyXCIpLCAoX2NsYXNzTmFtZXM0ID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczQsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZ3JvdXAtd3JhcHBlci1zbVwiKSwgc2l6ZSA9PT0gJ3NtYWxsJyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczQsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZ3JvdXAtd3JhcHBlci1sZ1wiKSwgc2l6ZSA9PT0gJ2xhcmdlJyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczQsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZ3JvdXAtd3JhcHBlci1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBfY2xhc3NOYW1lczQpLCBnZXRTdGF0dXNDbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZ3JvdXAtd3JhcHBlclwiKSwgbWVyZ2VkU3RhdHVzLCBoYXNGZWVkYmFjayksIGNsYXNzTmFtZSk7XG4gICAgZWxlbWVudCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogbWVyZ2VkR3JvdXBDbGFzc05hbWUsXG4gICAgICBzdHlsZTogcHJvcHMuc3R5bGVcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IG1lcmdlZFdyYXBwZXJDbGFzc05hbWVcbiAgICB9LCBhZGRvbkJlZm9yZU5vZGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTm9Db21wYWN0U3R5bGUsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE5vRm9ybVN0eWxlLCB7XG4gICAgICBzdGF0dXM6IHRydWUsXG4gICAgICBvdmVycmlkZTogdHJ1ZVxuICAgIH0sIGFkZG9uQmVmb3JlTm9kZSkpLCBjbG9uZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgc3R5bGU6IG51bGwsXG4gICAgICBkaXNhYmxlZDogbWVyZ2VkRGlzYWJsZWRcbiAgICB9KSwgYWRkb25BZnRlck5vZGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTm9Db21wYWN0U3R5bGUsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE5vRm9ybVN0eWxlLCB7XG4gICAgICBzdGF0dXM6IHRydWUsXG4gICAgICBvdmVycmlkZTogdHJ1ZVxuICAgIH0sIGFkZG9uQWZ0ZXJOb2RlKSkpKTtcbiAgfVxuICByZXR1cm4gZWxlbWVudDtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgSW5wdXROdW1iZXI7IiwiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgRG91YmxlTGVmdE91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk0yNzIuOSA1MTJsMjY1LjQtMzM5LjFjNC4xLTUuMi40LTEyLjktNi4zLTEyLjloLTc3LjNjLTQuOSAwLTkuNiAyLjMtMTIuNiA2LjFMMTg2LjggNDkyLjNhMzEuOTkgMzEuOTkgMCAwMDAgMzkuNWwyNTUuMyAzMjYuMWMzIDMuOSA3LjcgNi4xIDEyLjYgNi4xSDUzMmM2LjcgMCAxMC40LTcuNyA2LjMtMTIuOUwyNzIuOSA1MTJ6bTMwNCAwbDI2NS40LTMzOS4xYzQuMS01LjIuNC0xMi45LTYuMy0xMi45aC03Ny4zYy00LjkgMC05LjYgMi4zLTEyLjYgNi4xTDQ5MC44IDQ5Mi4zYTMxLjk5IDMxLjk5IDAgMDAwIDM5LjVsMjU1LjMgMzI2LjFjMyAzLjkgNy43IDYuMSAxMi42IDYuMUg4MzZjNi43IDAgMTAuNC03LjcgNi4zLTEyLjlMNTc2LjkgNTEyelwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiZG91YmxlLWxlZnRcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IERvdWJsZUxlZnRPdXRsaW5lZDtcbiIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IERvdWJsZUxlZnRPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Eb3VibGVMZWZ0T3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tICcuLi9jb21wb25lbnRzL0FudGRJY29uJztcbnZhciBEb3VibGVMZWZ0T3V0bGluZWQgPSBmdW5jdGlvbiBEb3VibGVMZWZ0T3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IERvdWJsZUxlZnRPdXRsaW5lZFN2Z1xuICB9KSk7XG59O1xuRG91YmxlTGVmdE91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ0RvdWJsZUxlZnRPdXRsaW5lZCc7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihEb3VibGVMZWZ0T3V0bGluZWQpOyIsIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIERvdWJsZVJpZ2h0T3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTUzMy4yIDQ5Mi4zTDI3Ny45IDE2Ni4xYy0zLTMuOS03LjctNi4xLTEyLjYtNi4xSDE4OGMtNi43IDAtMTAuNCA3LjctNi4zIDEyLjlMNDQ3LjEgNTEyIDE4MS43IDg1MS4xQTcuOTggNy45OCAwIDAwMTg4IDg2NGg3Ny4zYzQuOSAwIDkuNi0yLjMgMTIuNi02LjFsMjU1LjMtMzI2LjFjOS4xLTExLjcgOS4xLTI3LjkgMC0zOS41em0zMDQgMEw1ODEuOSAxNjYuMWMtMy0zLjktNy43LTYuMS0xMi42LTYuMUg0OTJjLTYuNyAwLTEwLjQgNy43LTYuMyAxMi45TDc1MS4xIDUxMiA0ODUuNyA4NTEuMUE3Ljk4IDcuOTggMCAwMDQ5MiA4NjRoNzcuM2M0LjkgMCA5LjYtMi4zIDEyLjYtNi4xbDI1NS4zLTMyNi4xYzkuMS0xMS43IDkuMS0yNy45IDAtMzkuNXpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImRvdWJsZS1yaWdodFwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgRG91YmxlUmlnaHRPdXRsaW5lZDtcbiIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IERvdWJsZVJpZ2h0T3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vRG91YmxlUmlnaHRPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIERvdWJsZVJpZ2h0T3V0bGluZWQgPSBmdW5jdGlvbiBEb3VibGVSaWdodE91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBEb3VibGVSaWdodE91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5Eb3VibGVSaWdodE91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ0RvdWJsZVJpZ2h0T3V0bGluZWQnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoRG91YmxlUmlnaHRPdXRsaW5lZCk7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbi8qIGVzbGludCByZWFjdC9wcm9wLXR5cGVzOiAwICovXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG52YXIgUGFnZXIgPSBmdW5jdGlvbiBQYWdlcihwcm9wcykge1xuICB2YXIgX2NsYXNzTmFtZXM7XG4gIHZhciBwcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcm9wcy5yb290UHJlZml4Q2xzLCBcIi1pdGVtXCIpO1xuICB2YXIgY2xzID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChwcm9wcy5wYWdlKSwgKF9jbGFzc05hbWVzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hY3RpdmVcIiksIHByb3BzLmFjdGl2ZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kaXNhYmxlZFwiKSwgIXByb3BzLnBhZ2UpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIHByb3BzLmNsYXNzTmFtZSwgISFwcm9wcy5jbGFzc05hbWUpLCBfY2xhc3NOYW1lcykpO1xuICB2YXIgaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVDbGljaygpIHtcbiAgICBwcm9wcy5vbkNsaWNrKHByb3BzLnBhZ2UpO1xuICB9O1xuICB2YXIgaGFuZGxlS2V5UHJlc3MgPSBmdW5jdGlvbiBoYW5kbGVLZXlQcmVzcyhlKSB7XG4gICAgcHJvcHMub25LZXlQcmVzcyhlLCBwcm9wcy5vbkNsaWNrLCBwcm9wcy5wYWdlKTtcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgIHRpdGxlOiBwcm9wcy5zaG93VGl0bGUgPyBwcm9wcy5wYWdlIDogbnVsbCxcbiAgICBjbGFzc05hbWU6IGNscyxcbiAgICBvbkNsaWNrOiBoYW5kbGVDbGljayxcbiAgICBvbktleVByZXNzOiBoYW5kbGVLZXlQcmVzcyxcbiAgICB0YWJJbmRleDogXCIwXCJcbiAgfSwgcHJvcHMuaXRlbVJlbmRlcihwcm9wcy5wYWdlLCAncGFnZScsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYVwiLCB7XG4gICAgcmVsOiBcIm5vZm9sbG93XCJcbiAgfSwgcHJvcHMucGFnZSkpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBQYWdlcjsiLCJleHBvcnQgZGVmYXVsdCB7XG4gIFpFUk86IDQ4LFxuICBOSU5FOiA1NyxcbiAgTlVNUEFEX1pFUk86IDk2LFxuICBOVU1QQURfTklORTogMTA1LFxuICBCQUNLU1BBQ0U6IDgsXG4gIERFTEVURTogNDYsXG4gIEVOVEVSOiAxMyxcbiAgQVJST1dfVVA6IDM4LFxuICBBUlJPV19ET1dOOiA0MFxufTsiLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX2NyZWF0ZVN1cGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlclwiO1xuLyogZXNsaW50IHJlYWN0L3Byb3AtdHlwZXM6IDAgKi9cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgS0VZQ09ERSBmcm9tICcuL0tleUNvZGUnO1xudmFyIE9wdGlvbnMgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKE9wdGlvbnMsIF9SZWFjdCRDb21wb25lbnQpO1xuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKE9wdGlvbnMpO1xuICBmdW5jdGlvbiBPcHRpb25zKCkge1xuICAgIHZhciBfdGhpcztcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgT3B0aW9ucyk7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsLmFwcGx5KF9zdXBlciwgW3RoaXNdLmNvbmNhdChhcmdzKSk7XG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBnb0lucHV0VGV4dDogJydcbiAgICB9O1xuICAgIF90aGlzLmJ1aWxkT3B0aW9uVGV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KHZhbHVlLCBcIiBcIikuY29uY2F0KF90aGlzLnByb3BzLmxvY2FsZS5pdGVtc19wZXJfcGFnZSk7XG4gICAgfTtcbiAgICBfdGhpcy5jaGFuZ2VTaXplID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBfdGhpcy5wcm9wcy5jaGFuZ2VTaXplKE51bWJlcih2YWx1ZSkpO1xuICAgIH07XG4gICAgX3RoaXMuaGFuZGxlQ2hhbmdlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZ29JbnB1dFRleHQ6IGUudGFyZ2V0LnZhbHVlXG4gICAgICB9KTtcbiAgICB9O1xuICAgIF90aGlzLmhhbmRsZUJsdXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgIGdvQnV0dG9uID0gX3RoaXMkcHJvcHMuZ29CdXR0b24sXG4gICAgICAgIHF1aWNrR28gPSBfdGhpcyRwcm9wcy5xdWlja0dvLFxuICAgICAgICByb290UHJlZml4Q2xzID0gX3RoaXMkcHJvcHMucm9vdFByZWZpeENscztcbiAgICAgIHZhciBnb0lucHV0VGV4dCA9IF90aGlzLnN0YXRlLmdvSW5wdXRUZXh0O1xuICAgICAgaWYgKGdvQnV0dG9uIHx8IGdvSW5wdXRUZXh0ID09PSAnJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGdvSW5wdXRUZXh0OiAnJ1xuICAgICAgfSk7XG4gICAgICBpZiAoZS5yZWxhdGVkVGFyZ2V0ICYmIChlLnJlbGF0ZWRUYXJnZXQuY2xhc3NOYW1lLmluZGV4T2YoXCJcIi5jb25jYXQocm9vdFByZWZpeENscywgXCItaXRlbS1saW5rXCIpKSA+PSAwIHx8IGUucmVsYXRlZFRhcmdldC5jbGFzc05hbWUuaW5kZXhPZihcIlwiLmNvbmNhdChyb290UHJlZml4Q2xzLCBcIi1pdGVtXCIpKSA+PSAwKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBxdWlja0dvKF90aGlzLmdldFZhbGlkVmFsdWUoKSk7XG4gICAgfTtcbiAgICBfdGhpcy5nbyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgZ29JbnB1dFRleHQgPSBfdGhpcy5zdGF0ZS5nb0lucHV0VGV4dDtcbiAgICAgIGlmIChnb0lucHV0VGV4dCA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGUua2V5Q29kZSA9PT0gS0VZQ09ERS5FTlRFUiB8fCBlLnR5cGUgPT09ICdjbGljaycpIHtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGdvSW5wdXRUZXh0OiAnJ1xuICAgICAgICB9KTtcbiAgICAgICAgX3RoaXMucHJvcHMucXVpY2tHbyhfdGhpcy5nZXRWYWxpZFZhbHVlKCkpO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIF9jcmVhdGVDbGFzcyhPcHRpb25zLCBbe1xuICAgIGtleTogXCJnZXRWYWxpZFZhbHVlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFZhbGlkVmFsdWUoKSB7XG4gICAgICB2YXIgZ29JbnB1dFRleHQgPSB0aGlzLnN0YXRlLmdvSW5wdXRUZXh0O1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFsc1xuICAgICAgcmV0dXJuICFnb0lucHV0VGV4dCB8fCBpc05hTihnb0lucHV0VGV4dCkgPyB1bmRlZmluZWQgOiBOdW1iZXIoZ29JbnB1dFRleHQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRQYWdlU2l6ZU9wdGlvbnNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UGFnZVNpemVPcHRpb25zKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgIHBhZ2VTaXplID0gX3RoaXMkcHJvcHMyLnBhZ2VTaXplLFxuICAgICAgICBwYWdlU2l6ZU9wdGlvbnMgPSBfdGhpcyRwcm9wczIucGFnZVNpemVPcHRpb25zO1xuICAgICAgaWYgKHBhZ2VTaXplT3B0aW9ucy5zb21lKGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbi50b1N0cmluZygpID09PSBwYWdlU2l6ZS50b1N0cmluZygpO1xuICAgICAgfSkpIHtcbiAgICAgICAgcmV0dXJuIHBhZ2VTaXplT3B0aW9ucztcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYWdlU2l6ZU9wdGlvbnMuY29uY2F0KFtwYWdlU2l6ZS50b1N0cmluZygpXSkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzXG4gICAgICAgIHZhciBudW1iZXJBID0gaXNOYU4oTnVtYmVyKGEpKSA/IDAgOiBOdW1iZXIoYSk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHNcbiAgICAgICAgdmFyIG51bWJlckIgPSBpc05hTihOdW1iZXIoYikpID8gMCA6IE51bWJlcihiKTtcbiAgICAgICAgcmV0dXJuIG51bWJlckEgLSBudW1iZXJCO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcbiAgICAgIHZhciBfdGhpcyRwcm9wczMgPSB0aGlzLnByb3BzLFxuICAgICAgICBwYWdlU2l6ZSA9IF90aGlzJHByb3BzMy5wYWdlU2l6ZSxcbiAgICAgICAgbG9jYWxlID0gX3RoaXMkcHJvcHMzLmxvY2FsZSxcbiAgICAgICAgcm9vdFByZWZpeENscyA9IF90aGlzJHByb3BzMy5yb290UHJlZml4Q2xzLFxuICAgICAgICBjaGFuZ2VTaXplID0gX3RoaXMkcHJvcHMzLmNoYW5nZVNpemUsXG4gICAgICAgIHF1aWNrR28gPSBfdGhpcyRwcm9wczMucXVpY2tHbyxcbiAgICAgICAgZ29CdXR0b24gPSBfdGhpcyRwcm9wczMuZ29CdXR0b24sXG4gICAgICAgIHNlbGVjdENvbXBvbmVudENsYXNzID0gX3RoaXMkcHJvcHMzLnNlbGVjdENvbXBvbmVudENsYXNzLFxuICAgICAgICBidWlsZE9wdGlvblRleHQgPSBfdGhpcyRwcm9wczMuYnVpbGRPcHRpb25UZXh0LFxuICAgICAgICBzZWxlY3RQcmVmaXhDbHMgPSBfdGhpcyRwcm9wczMuc2VsZWN0UHJlZml4Q2xzLFxuICAgICAgICBkaXNhYmxlZCA9IF90aGlzJHByb3BzMy5kaXNhYmxlZDtcbiAgICAgIHZhciBnb0lucHV0VGV4dCA9IHRoaXMuc3RhdGUuZ29JbnB1dFRleHQ7XG4gICAgICB2YXIgcHJlZml4Q2xzID0gXCJcIi5jb25jYXQocm9vdFByZWZpeENscywgXCItb3B0aW9uc1wiKTtcbiAgICAgIHZhciBTZWxlY3QgPSBzZWxlY3RDb21wb25lbnRDbGFzcztcbiAgICAgIHZhciBjaGFuZ2VTZWxlY3QgPSBudWxsO1xuICAgICAgdmFyIGdvSW5wdXQgPSBudWxsO1xuICAgICAgdmFyIGdvdG9CdXR0b24gPSBudWxsO1xuICAgICAgaWYgKCFjaGFuZ2VTaXplICYmICFxdWlja0dvKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgdmFyIHBhZ2VTaXplT3B0aW9ucyA9IHRoaXMuZ2V0UGFnZVNpemVPcHRpb25zKCk7XG4gICAgICBpZiAoY2hhbmdlU2l6ZSAmJiBTZWxlY3QpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBwYWdlU2l6ZU9wdGlvbnMubWFwKGZ1bmN0aW9uIChvcHQsIGkpIHtcbiAgICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2VsZWN0Lk9wdGlvbiwge1xuICAgICAgICAgICAga2V5OiBpLFxuICAgICAgICAgICAgdmFsdWU6IG9wdC50b1N0cmluZygpXG4gICAgICAgICAgfSwgKGJ1aWxkT3B0aW9uVGV4dCB8fCBfdGhpczIuYnVpbGRPcHRpb25UZXh0KShvcHQpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNoYW5nZVNlbGVjdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNlbGVjdCwge1xuICAgICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgICAgICBwcmVmaXhDbHM6IHNlbGVjdFByZWZpeENscyxcbiAgICAgICAgICBzaG93U2VhcmNoOiBmYWxzZSxcbiAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2l6ZS1jaGFuZ2VyXCIpLFxuICAgICAgICAgIG9wdGlvbkxhYmVsUHJvcDogXCJjaGlsZHJlblwiLFxuICAgICAgICAgIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aDogZmFsc2UsXG4gICAgICAgICAgdmFsdWU6IChwYWdlU2l6ZSB8fCBwYWdlU2l6ZU9wdGlvbnNbMF0pLnRvU3RyaW5nKCksXG4gICAgICAgICAgb25DaGFuZ2U6IHRoaXMuY2hhbmdlU2l6ZSxcbiAgICAgICAgICBnZXRQb3B1cENvbnRhaW5lcjogZnVuY3Rpb24gZ2V0UG9wdXBDb250YWluZXIodHJpZ2dlck5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cmlnZ2VyTm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJhcmlhLWxhYmVsXCI6IGxvY2FsZS5wYWdlX3NpemUsXG4gICAgICAgICAgZGVmYXVsdE9wZW46IGZhbHNlXG4gICAgICAgIH0sIG9wdGlvbnMpO1xuICAgICAgfVxuICAgICAgaWYgKHF1aWNrR28pIHtcbiAgICAgICAgaWYgKGdvQnV0dG9uKSB7XG4gICAgICAgICAgZ290b0J1dHRvbiA9IHR5cGVvZiBnb0J1dHRvbiA9PT0gJ2Jvb2xlYW4nID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgICAgIG9uQ2xpY2s6IHRoaXMuZ28sXG4gICAgICAgICAgICBvbktleVVwOiB0aGlzLmdvLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXF1aWNrLWp1bXBlci1idXR0b25cIilcbiAgICAgICAgICB9LCBsb2NhbGUuanVtcF90b19jb25maXJtKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgICBvbkNsaWNrOiB0aGlzLmdvLFxuICAgICAgICAgICAgb25LZXlVcDogdGhpcy5nb1xuICAgICAgICAgIH0sIGdvQnV0dG9uKTtcbiAgICAgICAgfVxuICAgICAgICBnb0lucHV0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1xdWljay1qdW1wZXJcIilcbiAgICAgICAgfSwgbG9jYWxlLmp1bXBfdG8sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwge1xuICAgICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB2YWx1ZTogZ29JbnB1dFRleHQsXG4gICAgICAgICAgb25DaGFuZ2U6IHRoaXMuaGFuZGxlQ2hhbmdlLFxuICAgICAgICAgIG9uS2V5VXA6IHRoaXMuZ28sXG4gICAgICAgICAgb25CbHVyOiB0aGlzLmhhbmRsZUJsdXIsXG4gICAgICAgICAgXCJhcmlhLWxhYmVsXCI6IGxvY2FsZS5wYWdlXG4gICAgICAgIH0pLCBsb2NhbGUucGFnZSwgZ290b0J1dHRvbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzKVxuICAgICAgfSwgY2hhbmdlU2VsZWN0LCBnb0lucHV0KTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIE9wdGlvbnM7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5PcHRpb25zLmRlZmF1bHRQcm9wcyA9IHtcbiAgcGFnZVNpemVPcHRpb25zOiBbJzEwJywgJzIwJywgJzUwJywgJzEwMCddXG59O1xuZXhwb3J0IGRlZmF1bHQgT3B0aW9uczsiLCJleHBvcnQgZGVmYXVsdCB7XG4gIC8vIE9wdGlvbnMuanN4XG4gIGl0ZW1zX3Blcl9wYWdlOiAn5p2hL+mhtScsXG4gIGp1bXBfdG86ICfot7Poh7MnLFxuICBqdW1wX3RvX2NvbmZpcm06ICfnoa7lrponLFxuICBwYWdlOiAn6aG1JyxcbiAgLy8gUGFnaW5hdGlvbi5qc3hcbiAgcHJldl9wYWdlOiAn5LiK5LiA6aG1JyxcbiAgbmV4dF9wYWdlOiAn5LiL5LiA6aG1JyxcbiAgcHJldl81OiAn5ZCR5YmNIDUg6aG1JyxcbiAgbmV4dF81OiAn5ZCR5ZCOIDUg6aG1JyxcbiAgcHJldl8zOiAn5ZCR5YmNIDMg6aG1JyxcbiAgbmV4dF8zOiAn5ZCR5ZCOIDMg6aG1JyxcbiAgcGFnZV9zaXplOiAn6aG156CBJ1xufTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c1wiO1xuaW1wb3J0IF9jcmVhdGVTdXBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlU3VwZXJcIjtcbi8qIGVzbGludCByZWFjdC9wcm9wLXR5cGVzOiAwICovXG5pbXBvcnQgUmVhY3QsIHsgY2xvbmVFbGVtZW50LCBpc1ZhbGlkRWxlbWVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFBhZ2VyIGZyb20gJy4vUGFnZXInO1xuaW1wb3J0IE9wdGlvbnMgZnJvbSAnLi9PcHRpb25zJztcbmltcG9ydCBLRVlDT0RFIGZyb20gJy4vS2V5Q29kZSc7XG5pbXBvcnQgTE9DQUxFIGZyb20gJy4vbG9jYWxlL3poX0NOJztcbmZ1bmN0aW9uIG5vb3AoKSB7fVxuZnVuY3Rpb24gaXNJbnRlZ2VyKHYpIHtcbiAgdmFyIHZhbHVlID0gTnVtYmVyKHYpO1xuICByZXR1cm4gKFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHNcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmICFpc05hTih2YWx1ZSkgJiYgaXNGaW5pdGUodmFsdWUpICYmIE1hdGguZmxvb3IodmFsdWUpID09PSB2YWx1ZVxuICApO1xufVxuZnVuY3Rpb24gZGVmYXVsdEl0ZW1SZW5kZXIocGFnZSwgdHlwZSwgZWxlbWVudCkge1xuICByZXR1cm4gZWxlbWVudDtcbn1cbmZ1bmN0aW9uIGNhbGN1bGF0ZVBhZ2UocCwgc3RhdGUsIHByb3BzKSB7XG4gIHZhciBwYWdlU2l6ZSA9IHR5cGVvZiBwID09PSAndW5kZWZpbmVkJyA/IHN0YXRlLnBhZ2VTaXplIDogcDtcbiAgcmV0dXJuIE1hdGguZmxvb3IoKHByb3BzLnRvdGFsIC0gMSkgLyBwYWdlU2l6ZSkgKyAxO1xufVxudmFyIFBhZ2luYXRpb24gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFBhZ2luYXRpb24sIF9SZWFjdCRDb21wb25lbnQpO1xuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFBhZ2luYXRpb24pO1xuICBmdW5jdGlvbiBQYWdpbmF0aW9uKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQYWdpbmF0aW9uKTtcbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzKTtcbiAgICBfdGhpcy5nZXRKdW1wUHJldlBhZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgoMSwgX3RoaXMuc3RhdGUuY3VycmVudCAtIChfdGhpcy5wcm9wcy5zaG93TGVzc0l0ZW1zID8gMyA6IDUpKTtcbiAgICB9O1xuICAgIF90aGlzLmdldEp1bXBOZXh0UGFnZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBNYXRoLm1pbihjYWxjdWxhdGVQYWdlKHVuZGVmaW5lZCwgX3RoaXMuc3RhdGUsIF90aGlzLnByb3BzKSwgX3RoaXMuc3RhdGUuY3VycmVudCArIChfdGhpcy5wcm9wcy5zaG93TGVzc0l0ZW1zID8gMyA6IDUpKTtcbiAgICB9O1xuICAgIF90aGlzLmdldEl0ZW1JY29uID0gZnVuY3Rpb24gKGljb24sIGxhYmVsKSB7XG4gICAgICB2YXIgcHJlZml4Q2xzID0gX3RoaXMucHJvcHMucHJlZml4Q2xzO1xuICAgICAgdmFyIGljb25Ob2RlID0gaWNvbiB8fCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiOiBsYWJlbCxcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tbGlua1wiKVxuICAgICAgfSk7XG4gICAgICBpZiAodHlwZW9mIGljb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWNvbk5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChpY29uLCBfb2JqZWN0U3ByZWFkKHt9LCBfdGhpcy5wcm9wcykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGljb25Ob2RlO1xuICAgIH07XG4gICAgX3RoaXMuc2F2ZVBhZ2luYXRpb25Ob2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIF90aGlzLnBhZ2luYXRpb25Ob2RlID0gbm9kZTtcbiAgICB9O1xuICAgIF90aGlzLmlzVmFsaWQgPSBmdW5jdGlvbiAocGFnZSkge1xuICAgICAgdmFyIHRvdGFsID0gX3RoaXMucHJvcHMudG90YWw7XG4gICAgICByZXR1cm4gaXNJbnRlZ2VyKHBhZ2UpICYmIHBhZ2UgIT09IF90aGlzLnN0YXRlLmN1cnJlbnQgJiYgaXNJbnRlZ2VyKHRvdGFsKSAmJiB0b3RhbCA+IDA7XG4gICAgfTtcbiAgICBfdGhpcy5zaG91bGREaXNwbGF5UXVpY2tKdW1wZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgc2hvd1F1aWNrSnVtcGVyID0gX3RoaXMkcHJvcHMuc2hvd1F1aWNrSnVtcGVyLFxuICAgICAgICB0b3RhbCA9IF90aGlzJHByb3BzLnRvdGFsO1xuICAgICAgdmFyIHBhZ2VTaXplID0gX3RoaXMuc3RhdGUucGFnZVNpemU7XG4gICAgICBpZiAodG90YWwgPD0gcGFnZVNpemUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNob3dRdWlja0p1bXBlcjtcbiAgICB9O1xuICAgIF90aGlzLmhhbmRsZUtleURvd24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKGUua2V5Q29kZSA9PT0gS0VZQ09ERS5BUlJPV19VUCB8fCBlLmtleUNvZGUgPT09IEtFWUNPREUuQVJST1dfRE9XTikge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBfdGhpcy5oYW5kbGVLZXlVcCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdmFsdWUgPSBfdGhpcy5nZXRWYWxpZFZhbHVlKGUpO1xuICAgICAgdmFyIGN1cnJlbnRJbnB1dFZhbHVlID0gX3RoaXMuc3RhdGUuY3VycmVudElucHV0VmFsdWU7XG4gICAgICBpZiAodmFsdWUgIT09IGN1cnJlbnRJbnB1dFZhbHVlKSB7XG4gICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBjdXJyZW50SW5wdXRWYWx1ZTogdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZS5rZXlDb2RlID09PSBLRVlDT0RFLkVOVEVSKSB7XG4gICAgICAgIF90aGlzLmhhbmRsZUNoYW5nZSh2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5Q29kZSA9PT0gS0VZQ09ERS5BUlJPV19VUCkge1xuICAgICAgICBfdGhpcy5oYW5kbGVDaGFuZ2UodmFsdWUgLSAxKTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXlDb2RlID09PSBLRVlDT0RFLkFSUk9XX0RPV04pIHtcbiAgICAgICAgX3RoaXMuaGFuZGxlQ2hhbmdlKHZhbHVlICsgMSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBfdGhpcy5oYW5kbGVCbHVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB2YWx1ZSA9IF90aGlzLmdldFZhbGlkVmFsdWUoZSk7XG4gICAgICBfdGhpcy5oYW5kbGVDaGFuZ2UodmFsdWUpO1xuICAgIH07XG4gICAgX3RoaXMuY2hhbmdlUGFnZVNpemUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICAgICAgdmFyIGN1cnJlbnQgPSBfdGhpcy5zdGF0ZS5jdXJyZW50O1xuICAgICAgdmFyIG5ld0N1cnJlbnQgPSBjYWxjdWxhdGVQYWdlKHNpemUsIF90aGlzLnN0YXRlLCBfdGhpcy5wcm9wcyk7XG4gICAgICBjdXJyZW50ID0gY3VycmVudCA+IG5ld0N1cnJlbnQgPyBuZXdDdXJyZW50IDogY3VycmVudDtcbiAgICAgIC8vIGZpeCB0aGUgaXNzdWU6XG4gICAgICAvLyBPbmNlICd0b3RhbCcgaXMgMCwgJ2N1cnJlbnQnIGluICdvblNob3dTaXplQ2hhbmdlJyBpcyAwLCB3aGljaCBpcyBub3QgY29ycmVjdC5cbiAgICAgIGlmIChuZXdDdXJyZW50ID09PSAwKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItZGVzdHJ1Y3R1cmluZ1xuICAgICAgICBjdXJyZW50ID0gX3RoaXMuc3RhdGUuY3VycmVudDtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygc2l6ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaWYgKCEoJ3BhZ2VTaXplJyBpbiBfdGhpcy5wcm9wcykpIHtcbiAgICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBwYWdlU2l6ZTogc2l6ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKCdjdXJyZW50JyBpbiBfdGhpcy5wcm9wcykpIHtcbiAgICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBjdXJyZW50OiBjdXJyZW50LFxuICAgICAgICAgICAgY3VycmVudElucHV0VmFsdWU6IGN1cnJlbnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgX3RoaXMucHJvcHMub25TaG93U2l6ZUNoYW5nZShjdXJyZW50LCBzaXplKTtcbiAgICAgIGlmICgnb25DaGFuZ2UnIGluIF90aGlzLnByb3BzICYmIF90aGlzLnByb3BzLm9uQ2hhbmdlKSB7XG4gICAgICAgIF90aGlzLnByb3BzLm9uQ2hhbmdlKGN1cnJlbnQsIHNpemUpO1xuICAgICAgfVxuICAgIH07XG4gICAgX3RoaXMuaGFuZGxlQ2hhbmdlID0gZnVuY3Rpb24gKHBhZ2UpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgZGlzYWJsZWQgPSBfdGhpcyRwcm9wczIuZGlzYWJsZWQsXG4gICAgICAgIG9uQ2hhbmdlID0gX3RoaXMkcHJvcHMyLm9uQ2hhbmdlO1xuICAgICAgdmFyIF90aGlzJHN0YXRlID0gX3RoaXMuc3RhdGUsXG4gICAgICAgIHBhZ2VTaXplID0gX3RoaXMkc3RhdGUucGFnZVNpemUsXG4gICAgICAgIGN1cnJlbnQgPSBfdGhpcyRzdGF0ZS5jdXJyZW50LFxuICAgICAgICBjdXJyZW50SW5wdXRWYWx1ZSA9IF90aGlzJHN0YXRlLmN1cnJlbnRJbnB1dFZhbHVlO1xuICAgICAgaWYgKF90aGlzLmlzVmFsaWQocGFnZSkgJiYgIWRpc2FibGVkKSB7XG4gICAgICAgIHZhciBjdXJyZW50UGFnZSA9IGNhbGN1bGF0ZVBhZ2UodW5kZWZpbmVkLCBfdGhpcy5zdGF0ZSwgX3RoaXMucHJvcHMpO1xuICAgICAgICB2YXIgbmV3UGFnZSA9IHBhZ2U7XG4gICAgICAgIGlmIChwYWdlID4gY3VycmVudFBhZ2UpIHtcbiAgICAgICAgICBuZXdQYWdlID0gY3VycmVudFBhZ2U7XG4gICAgICAgIH0gZWxzZSBpZiAocGFnZSA8IDEpIHtcbiAgICAgICAgICBuZXdQYWdlID0gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISgnY3VycmVudCcgaW4gX3RoaXMucHJvcHMpKSB7XG4gICAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgY3VycmVudDogbmV3UGFnZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdQYWdlICE9PSBjdXJyZW50SW5wdXRWYWx1ZSkge1xuICAgICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGN1cnJlbnRJbnB1dFZhbHVlOiBuZXdQYWdlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgb25DaGFuZ2UobmV3UGFnZSwgcGFnZVNpemUpO1xuICAgICAgICByZXR1cm4gbmV3UGFnZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH07XG4gICAgX3RoaXMucHJldiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy5oYXNQcmV2KCkpIHtcbiAgICAgICAgX3RoaXMuaGFuZGxlQ2hhbmdlKF90aGlzLnN0YXRlLmN1cnJlbnQgLSAxKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIF90aGlzLm5leHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMuaGFzTmV4dCgpKSB7XG4gICAgICAgIF90aGlzLmhhbmRsZUNoYW5nZShfdGhpcy5zdGF0ZS5jdXJyZW50ICsgMSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBfdGhpcy5qdW1wUHJldiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLmhhbmRsZUNoYW5nZShfdGhpcy5nZXRKdW1wUHJldlBhZ2UoKSk7XG4gICAgfTtcbiAgICBfdGhpcy5qdW1wTmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLmhhbmRsZUNoYW5nZShfdGhpcy5nZXRKdW1wTmV4dFBhZ2UoKSk7XG4gICAgfTtcbiAgICBfdGhpcy5oYXNQcmV2ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnN0YXRlLmN1cnJlbnQgPiAxO1xuICAgIH07XG4gICAgX3RoaXMuaGFzTmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5zdGF0ZS5jdXJyZW50IDwgY2FsY3VsYXRlUGFnZSh1bmRlZmluZWQsIF90aGlzLnN0YXRlLCBfdGhpcy5wcm9wcyk7XG4gICAgfTtcbiAgICBfdGhpcy5ydW5JZkVudGVyID0gZnVuY3Rpb24gKGV2ZW50LCBjYWxsYmFjaykge1xuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJyB8fCBldmVudC5jaGFyQ29kZSA9PT0gMTMpIHtcbiAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHJlc3RQYXJhbXMgPSBuZXcgQXJyYXkoX2xlbiA+IDIgPyBfbGVuIC0gMiA6IDApLCBfa2V5ID0gMjsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICAgIHJlc3RQYXJhbXNbX2tleSAtIDJdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrLmFwcGx5KHZvaWQgMCwgcmVzdFBhcmFtcyk7XG4gICAgICB9XG4gICAgfTtcbiAgICBfdGhpcy5ydW5JZkVudGVyUHJldiA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBfdGhpcy5ydW5JZkVudGVyKGUsIF90aGlzLnByZXYpO1xuICAgIH07XG4gICAgX3RoaXMucnVuSWZFbnRlck5leHQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgX3RoaXMucnVuSWZFbnRlcihlLCBfdGhpcy5uZXh0KTtcbiAgICB9O1xuICAgIF90aGlzLnJ1bklmRW50ZXJKdW1wUHJldiA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBfdGhpcy5ydW5JZkVudGVyKGUsIF90aGlzLmp1bXBQcmV2KTtcbiAgICB9O1xuICAgIF90aGlzLnJ1bklmRW50ZXJKdW1wTmV4dCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBfdGhpcy5ydW5JZkVudGVyKGUsIF90aGlzLmp1bXBOZXh0KTtcbiAgICB9O1xuICAgIF90aGlzLmhhbmRsZUdvVE8gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKGUua2V5Q29kZSA9PT0gS0VZQ09ERS5FTlRFUiB8fCBlLnR5cGUgPT09ICdjbGljaycpIHtcbiAgICAgICAgX3RoaXMuaGFuZGxlQ2hhbmdlKF90aGlzLnN0YXRlLmN1cnJlbnRJbnB1dFZhbHVlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBoYXNPbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlICE9PSBub29wO1xuICAgIHZhciBoYXNDdXJyZW50ID0gKCdjdXJyZW50JyBpbiBwcm9wcyk7XG4gICAgaWYgKGhhc0N1cnJlbnQgJiYgIWhhc09uQ2hhbmdlKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKCdXYXJuaW5nOiBZb3UgcHJvdmlkZWQgYSBgY3VycmVudGAgcHJvcCB0byBhIFBhZ2luYXRpb24gY29tcG9uZW50IHdpdGhvdXQgYW4gYG9uQ2hhbmdlYCBoYW5kbGVyLiBUaGlzIHdpbGwgcmVuZGVyIGEgcmVhZC1vbmx5IGNvbXBvbmVudC4nKTtcbiAgICB9XG4gICAgdmFyIF9jdXJyZW50ID0gcHJvcHMuZGVmYXVsdEN1cnJlbnQ7XG4gICAgaWYgKCdjdXJyZW50JyBpbiBwcm9wcykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1kZXN0cnVjdHVyaW5nXG4gICAgICBfY3VycmVudCA9IHByb3BzLmN1cnJlbnQ7XG4gICAgfVxuICAgIHZhciBfcGFnZVNpemUgPSBwcm9wcy5kZWZhdWx0UGFnZVNpemU7XG4gICAgaWYgKCdwYWdlU2l6ZScgaW4gcHJvcHMpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItZGVzdHJ1Y3R1cmluZ1xuICAgICAgX3BhZ2VTaXplID0gcHJvcHMucGFnZVNpemU7XG4gICAgfVxuICAgIF9jdXJyZW50ID0gTWF0aC5taW4oX2N1cnJlbnQsIGNhbGN1bGF0ZVBhZ2UoX3BhZ2VTaXplLCB1bmRlZmluZWQsIHByb3BzKSk7XG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBjdXJyZW50OiBfY3VycmVudCxcbiAgICAgIGN1cnJlbnRJbnB1dFZhbHVlOiBfY3VycmVudCxcbiAgICAgIHBhZ2VTaXplOiBfcGFnZVNpemVcbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICBfY3JlYXRlQ2xhc3MoUGFnaW5hdGlvbiwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgICAgLy8gV2hlbiBjdXJyZW50IHBhZ2UgY2hhbmdlLCBmaXggZm9jdXNlZCBzdHlsZSBvZiBwcmV2IGl0ZW1cbiAgICAgIC8vIEEgaGFja3kgc29sdXRpb24gb2YgaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvODk0OFxuICAgICAgdmFyIHByZWZpeENscyA9IHRoaXMucHJvcHMucHJlZml4Q2xzO1xuICAgICAgaWYgKHByZXZTdGF0ZS5jdXJyZW50ICE9PSB0aGlzLnN0YXRlLmN1cnJlbnQgJiYgdGhpcy5wYWdpbmF0aW9uTm9kZSkge1xuICAgICAgICB2YXIgbGFzdEN1cnJlbnROb2RlID0gdGhpcy5wYWdpbmF0aW9uTm9kZS5xdWVyeVNlbGVjdG9yKFwiLlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tXCIpLmNvbmNhdChwcmV2U3RhdGUuY3VycmVudCkpO1xuICAgICAgICBpZiAobGFzdEN1cnJlbnROb2RlICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGxhc3RDdXJyZW50Tm9kZSkge1xuICAgICAgICAgIGxhc3RDdXJyZW50Tm9kZS5ibHVyKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0VmFsaWRWYWx1ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRWYWxpZFZhbHVlKGUpIHtcbiAgICAgIHZhciBpbnB1dFZhbHVlID0gZS50YXJnZXQudmFsdWU7XG4gICAgICB2YXIgYWxsUGFnZXMgPSBjYWxjdWxhdGVQYWdlKHVuZGVmaW5lZCwgdGhpcy5zdGF0ZSwgdGhpcy5wcm9wcyk7XG4gICAgICB2YXIgY3VycmVudElucHV0VmFsdWUgPSB0aGlzLnN0YXRlLmN1cnJlbnRJbnB1dFZhbHVlO1xuICAgICAgdmFyIHZhbHVlO1xuICAgICAgaWYgKGlucHV0VmFsdWUgPT09ICcnKSB7XG4gICAgICAgIHZhbHVlID0gaW5wdXRWYWx1ZTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFsc1xuICAgICAgfSBlbHNlIGlmIChpc05hTihOdW1iZXIoaW5wdXRWYWx1ZSkpKSB7XG4gICAgICAgIHZhbHVlID0gY3VycmVudElucHV0VmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKGlucHV0VmFsdWUgPj0gYWxsUGFnZXMpIHtcbiAgICAgICAgdmFsdWUgPSBhbGxQYWdlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gTnVtYmVyKGlucHV0VmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRTaG93U2l6ZUNoYW5nZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U2hvd1NpemVDaGFuZ2VyKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMyA9IHRoaXMucHJvcHMsXG4gICAgICAgIHNob3dTaXplQ2hhbmdlciA9IF90aGlzJHByb3BzMy5zaG93U2l6ZUNoYW5nZXIsXG4gICAgICAgIHRvdGFsID0gX3RoaXMkcHJvcHMzLnRvdGFsLFxuICAgICAgICB0b3RhbEJvdW5kYXJ5U2hvd1NpemVDaGFuZ2VyID0gX3RoaXMkcHJvcHMzLnRvdGFsQm91bmRhcnlTaG93U2l6ZUNoYW5nZXI7XG4gICAgICBpZiAodHlwZW9mIHNob3dTaXplQ2hhbmdlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHNob3dTaXplQ2hhbmdlcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0b3RhbCA+IHRvdGFsQm91bmRhcnlTaG93U2l6ZUNoYW5nZXI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclByZXZcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyUHJldihwcmV2UGFnZSkge1xuICAgICAgdmFyIF90aGlzJHByb3BzNCA9IHRoaXMucHJvcHMsXG4gICAgICAgIHByZXZJY29uID0gX3RoaXMkcHJvcHM0LnByZXZJY29uLFxuICAgICAgICBpdGVtUmVuZGVyID0gX3RoaXMkcHJvcHM0Lml0ZW1SZW5kZXI7XG4gICAgICB2YXIgcHJldkJ1dHRvbiA9IGl0ZW1SZW5kZXIocHJldlBhZ2UsICdwcmV2JywgdGhpcy5nZXRJdGVtSWNvbihwcmV2SWNvbiwgJ3ByZXYgcGFnZScpKTtcbiAgICAgIHZhciBkaXNhYmxlZCA9ICF0aGlzLmhhc1ByZXYoKTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovaXNWYWxpZEVsZW1lbnQocHJldkJ1dHRvbikgPyAvKiNfX1BVUkVfXyovY2xvbmVFbGVtZW50KHByZXZCdXR0b24sIHtcbiAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkXG4gICAgICB9KSA6IHByZXZCdXR0b247XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlck5leHRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyTmV4dChuZXh0UGFnZSkge1xuICAgICAgdmFyIF90aGlzJHByb3BzNSA9IHRoaXMucHJvcHMsXG4gICAgICAgIG5leHRJY29uID0gX3RoaXMkcHJvcHM1Lm5leHRJY29uLFxuICAgICAgICBpdGVtUmVuZGVyID0gX3RoaXMkcHJvcHM1Lml0ZW1SZW5kZXI7XG4gICAgICB2YXIgbmV4dEJ1dHRvbiA9IGl0ZW1SZW5kZXIobmV4dFBhZ2UsICduZXh0JywgdGhpcy5nZXRJdGVtSWNvbihuZXh0SWNvbiwgJ25leHQgcGFnZScpKTtcbiAgICAgIHZhciBkaXNhYmxlZCA9ICF0aGlzLmhhc05leHQoKTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovaXNWYWxpZEVsZW1lbnQobmV4dEJ1dHRvbikgPyAvKiNfX1BVUkVfXyovY2xvbmVFbGVtZW50KG5leHRCdXR0b24sIHtcbiAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkXG4gICAgICB9KSA6IG5leHRCdXR0b247XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcbiAgICAgIHZhciBfdGhpcyRwcm9wczYgPSB0aGlzLnByb3BzLFxuICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wczYucHJlZml4Q2xzLFxuICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wczYuY2xhc3NOYW1lLFxuICAgICAgICBzdHlsZSA9IF90aGlzJHByb3BzNi5zdHlsZSxcbiAgICAgICAgZGlzYWJsZWQgPSBfdGhpcyRwcm9wczYuZGlzYWJsZWQsXG4gICAgICAgIGhpZGVPblNpbmdsZVBhZ2UgPSBfdGhpcyRwcm9wczYuaGlkZU9uU2luZ2xlUGFnZSxcbiAgICAgICAgdG90YWwgPSBfdGhpcyRwcm9wczYudG90YWwsXG4gICAgICAgIGxvY2FsZSA9IF90aGlzJHByb3BzNi5sb2NhbGUsXG4gICAgICAgIHNob3dRdWlja0p1bXBlciA9IF90aGlzJHByb3BzNi5zaG93UXVpY2tKdW1wZXIsXG4gICAgICAgIHNob3dMZXNzSXRlbXMgPSBfdGhpcyRwcm9wczYuc2hvd0xlc3NJdGVtcyxcbiAgICAgICAgc2hvd1RpdGxlID0gX3RoaXMkcHJvcHM2LnNob3dUaXRsZSxcbiAgICAgICAgc2hvd1RvdGFsID0gX3RoaXMkcHJvcHM2LnNob3dUb3RhbCxcbiAgICAgICAgc2ltcGxlID0gX3RoaXMkcHJvcHM2LnNpbXBsZSxcbiAgICAgICAgaXRlbVJlbmRlciA9IF90aGlzJHByb3BzNi5pdGVtUmVuZGVyLFxuICAgICAgICBzaG93UHJldk5leHRKdW1wZXJzID0gX3RoaXMkcHJvcHM2LnNob3dQcmV2TmV4dEp1bXBlcnMsXG4gICAgICAgIGp1bXBQcmV2SWNvbiA9IF90aGlzJHByb3BzNi5qdW1wUHJldkljb24sXG4gICAgICAgIGp1bXBOZXh0SWNvbiA9IF90aGlzJHByb3BzNi5qdW1wTmV4dEljb24sXG4gICAgICAgIHNlbGVjdENvbXBvbmVudENsYXNzID0gX3RoaXMkcHJvcHM2LnNlbGVjdENvbXBvbmVudENsYXNzLFxuICAgICAgICBzZWxlY3RQcmVmaXhDbHMgPSBfdGhpcyRwcm9wczYuc2VsZWN0UHJlZml4Q2xzLFxuICAgICAgICBwYWdlU2l6ZU9wdGlvbnMgPSBfdGhpcyRwcm9wczYucGFnZVNpemVPcHRpb25zO1xuICAgICAgdmFyIF90aGlzJHN0YXRlMiA9IHRoaXMuc3RhdGUsXG4gICAgICAgIGN1cnJlbnQgPSBfdGhpcyRzdGF0ZTIuY3VycmVudCxcbiAgICAgICAgcGFnZVNpemUgPSBfdGhpcyRzdGF0ZTIucGFnZVNpemUsXG4gICAgICAgIGN1cnJlbnRJbnB1dFZhbHVlID0gX3RoaXMkc3RhdGUyLmN1cnJlbnRJbnB1dFZhbHVlO1xuXG4gICAgICAvLyBXaGVuIGhpZGVPblNpbmdsZVBhZ2UgaXMgdHJ1ZSBhbmQgdGhlcmUgaXMgb25seSAxIHBhZ2UsIGhpZGUgdGhlIHBhZ2VyXG4gICAgICBpZiAoaGlkZU9uU2luZ2xlUGFnZSA9PT0gdHJ1ZSAmJiB0b3RhbCA8PSBwYWdlU2l6ZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHZhciBhbGxQYWdlcyA9IGNhbGN1bGF0ZVBhZ2UodW5kZWZpbmVkLCB0aGlzLnN0YXRlLCB0aGlzLnByb3BzKTtcbiAgICAgIHZhciBwYWdlckxpc3QgPSBbXTtcbiAgICAgIHZhciBqdW1wUHJldiA9IG51bGw7XG4gICAgICB2YXIganVtcE5leHQgPSBudWxsO1xuICAgICAgdmFyIGZpcnN0UGFnZXIgPSBudWxsO1xuICAgICAgdmFyIGxhc3RQYWdlciA9IG51bGw7XG4gICAgICB2YXIgZ290b0J1dHRvbiA9IG51bGw7XG4gICAgICB2YXIgZ29CdXR0b24gPSBzaG93UXVpY2tKdW1wZXIgJiYgc2hvd1F1aWNrSnVtcGVyLmdvQnV0dG9uO1xuICAgICAgdmFyIHBhZ2VCdWZmZXJTaXplID0gc2hvd0xlc3NJdGVtcyA/IDEgOiAyO1xuICAgICAgdmFyIHByZXZQYWdlID0gY3VycmVudCAtIDEgPiAwID8gY3VycmVudCAtIDEgOiAwO1xuICAgICAgdmFyIG5leHRQYWdlID0gY3VycmVudCArIDEgPCBhbGxQYWdlcyA/IGN1cnJlbnQgKyAxIDogYWxsUGFnZXM7XG4gICAgICB2YXIgZGF0YU9yQXJpYUF0dHJpYnV0ZVByb3BzID0gT2JqZWN0LmtleXModGhpcy5wcm9wcykucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBrZXkpIHtcbiAgICAgICAgaWYgKGtleS5zdWJzdHIoMCwgNSkgPT09ICdkYXRhLScgfHwga2V5LnN1YnN0cigwLCA1KSA9PT0gJ2FyaWEtJyB8fCBrZXkgPT09ICdyb2xlJykge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgIHByZXZba2V5XSA9IF90aGlzMi5wcm9wc1trZXldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgfSwge30pO1xuICAgICAgdmFyIHRvdGFsVGV4dCA9IHNob3dUb3RhbCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRvdGFsLXRleHRcIilcbiAgICAgIH0sIHNob3dUb3RhbCh0b3RhbCwgW3RvdGFsID09PSAwID8gMCA6IChjdXJyZW50IC0gMSkgKiBwYWdlU2l6ZSArIDEsIGN1cnJlbnQgKiBwYWdlU2l6ZSA+IHRvdGFsID8gdG90YWwgOiBjdXJyZW50ICogcGFnZVNpemVdKSk7XG4gICAgICBpZiAoc2ltcGxlKSB7XG4gICAgICAgIGlmIChnb0J1dHRvbikge1xuICAgICAgICAgIGlmICh0eXBlb2YgZ29CdXR0b24gPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgZ290b0J1dHRvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgICAgICAgb25DbGljazogdGhpcy5oYW5kbGVHb1RPLFxuICAgICAgICAgICAgICBvbktleVVwOiB0aGlzLmhhbmRsZUdvVE9cbiAgICAgICAgICAgIH0sIGxvY2FsZS5qdW1wX3RvX2NvbmZpcm0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnb3RvQnV0dG9uID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICAgICAgb25DbGljazogdGhpcy5oYW5kbGVHb1RPLFxuICAgICAgICAgICAgICBvbktleVVwOiB0aGlzLmhhbmRsZUdvVE9cbiAgICAgICAgICAgIH0sIGdvQnV0dG9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZ290b0J1dHRvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgICAgICAgICAgdGl0bGU6IHNob3dUaXRsZSA/IFwiXCIuY29uY2F0KGxvY2FsZS5qdW1wX3RvKS5jb25jYXQoY3VycmVudCwgXCIvXCIpLmNvbmNhdChhbGxQYWdlcykgOiBudWxsLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNpbXBsZS1wYWdlclwiKVxuICAgICAgICAgIH0sIGdvdG9CdXR0b24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInVsXCIsIF9leHRlbmRzKHtcbiAgICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNpbXBsZVwiKSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRpc2FibGVkXCIpLCBkaXNhYmxlZCksIGNsYXNzTmFtZSksXG4gICAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICAgIHJlZjogdGhpcy5zYXZlUGFnaW5hdGlvbk5vZGVcbiAgICAgICAgfSwgZGF0YU9yQXJpYUF0dHJpYnV0ZVByb3BzKSwgdG90YWxUZXh0LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgICAgICB0aXRsZTogc2hvd1RpdGxlID8gbG9jYWxlLnByZXZfcGFnZSA6IG51bGwsXG4gICAgICAgICAgb25DbGljazogdGhpcy5wcmV2LFxuICAgICAgICAgIHRhYkluZGV4OiB0aGlzLmhhc1ByZXYoKSA/IDAgOiBudWxsLFxuICAgICAgICAgIG9uS2V5UHJlc3M6IHRoaXMucnVuSWZFbnRlclByZXYsXG4gICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcHJldlwiKSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRpc2FibGVkXCIpLCAhdGhpcy5oYXNQcmV2KCkpKSxcbiAgICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjogIXRoaXMuaGFzUHJldigpXG4gICAgICAgIH0sIHRoaXMucmVuZGVyUHJldihwcmV2UGFnZSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgICAgICB0aXRsZTogc2hvd1RpdGxlID8gXCJcIi5jb25jYXQoY3VycmVudCwgXCIvXCIpLmNvbmNhdChhbGxQYWdlcykgOiBudWxsLFxuICAgICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zaW1wbGUtcGFnZXJcIilcbiAgICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdmFsdWU6IGN1cnJlbnRJbnB1dFZhbHVlLFxuICAgICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgICAgICBvbktleURvd246IHRoaXMuaGFuZGxlS2V5RG93bixcbiAgICAgICAgICBvbktleVVwOiB0aGlzLmhhbmRsZUtleVVwLFxuICAgICAgICAgIG9uQ2hhbmdlOiB0aGlzLmhhbmRsZUtleVVwLFxuICAgICAgICAgIG9uQmx1cjogdGhpcy5oYW5kbGVCbHVyLFxuICAgICAgICAgIHNpemU6IFwiM1wiXG4gICAgICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zbGFzaFwiKVxuICAgICAgICB9LCBcIi9cIiksIGFsbFBhZ2VzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICAgICAgdGl0bGU6IHNob3dUaXRsZSA/IGxvY2FsZS5uZXh0X3BhZ2UgOiBudWxsLFxuICAgICAgICAgIG9uQ2xpY2s6IHRoaXMubmV4dCxcbiAgICAgICAgICB0YWJJbmRleDogdGhpcy5oYXNQcmV2KCkgPyAwIDogbnVsbCxcbiAgICAgICAgICBvbktleVByZXNzOiB0aGlzLnJ1bklmRW50ZXJOZXh0LFxuICAgICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW5leHRcIiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kaXNhYmxlZFwiKSwgIXRoaXMuaGFzTmV4dCgpKSksXG4gICAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6ICF0aGlzLmhhc05leHQoKVxuICAgICAgICB9LCB0aGlzLnJlbmRlck5leHQobmV4dFBhZ2UpKSwgZ290b0J1dHRvbik7XG4gICAgICB9XG4gICAgICBpZiAoYWxsUGFnZXMgPD0gMyArIHBhZ2VCdWZmZXJTaXplICogMikge1xuICAgICAgICB2YXIgcGFnZXJQcm9wcyA9IHtcbiAgICAgICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgICAgICByb290UHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgICAgb25DbGljazogdGhpcy5oYW5kbGVDaGFuZ2UsXG4gICAgICAgICAgb25LZXlQcmVzczogdGhpcy5ydW5JZkVudGVyLFxuICAgICAgICAgIHNob3dUaXRsZTogc2hvd1RpdGxlLFxuICAgICAgICAgIGl0ZW1SZW5kZXI6IGl0ZW1SZW5kZXJcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFhbGxQYWdlcykge1xuICAgICAgICAgIHBhZ2VyTGlzdC5wdXNoKCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQYWdlciwgX2V4dGVuZHMoe30sIHBhZ2VyUHJvcHMsIHtcbiAgICAgICAgICAgIGtleTogXCJub1BhZ2VyXCIsXG4gICAgICAgICAgICBwYWdlOiAxLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tZGlzYWJsZWRcIilcbiAgICAgICAgICB9KSkpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IGFsbFBhZ2VzOyBpICs9IDEpIHtcbiAgICAgICAgICB2YXIgYWN0aXZlID0gY3VycmVudCA9PT0gaTtcbiAgICAgICAgICBwYWdlckxpc3QucHVzaCggLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUGFnZXIsIF9leHRlbmRzKHt9LCBwYWdlclByb3BzLCB7XG4gICAgICAgICAgICBrZXk6IGksXG4gICAgICAgICAgICBwYWdlOiBpLFxuICAgICAgICAgICAgYWN0aXZlOiBhY3RpdmVcbiAgICAgICAgICB9KSkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcHJldkl0ZW1UaXRsZSA9IHNob3dMZXNzSXRlbXMgPyBsb2NhbGUucHJldl8zIDogbG9jYWxlLnByZXZfNTtcbiAgICAgICAgdmFyIG5leHRJdGVtVGl0bGUgPSBzaG93TGVzc0l0ZW1zID8gbG9jYWxlLm5leHRfMyA6IGxvY2FsZS5uZXh0XzU7XG4gICAgICAgIGlmIChzaG93UHJldk5leHRKdW1wZXJzKSB7XG4gICAgICAgICAganVtcFByZXYgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgICAgICAgIHRpdGxlOiBzaG93VGl0bGUgPyBwcmV2SXRlbVRpdGxlIDogbnVsbCxcbiAgICAgICAgICAgIGtleTogXCJwcmV2XCIsXG4gICAgICAgICAgICBvbkNsaWNrOiB0aGlzLmp1bXBQcmV2LFxuICAgICAgICAgICAgdGFiSW5kZXg6IFwiMFwiLFxuICAgICAgICAgICAgb25LZXlQcmVzczogdGhpcy5ydW5JZkVudGVySnVtcFByZXYsXG4gICAgICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1qdW1wLXByZXZcIiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1qdW1wLXByZXYtY3VzdG9tLWljb25cIiksICEhanVtcFByZXZJY29uKSlcbiAgICAgICAgICB9LCBpdGVtUmVuZGVyKHRoaXMuZ2V0SnVtcFByZXZQYWdlKCksICdqdW1wLXByZXYnLCB0aGlzLmdldEl0ZW1JY29uKGp1bXBQcmV2SWNvbiwgJ3ByZXYgcGFnZScpKSk7XG4gICAgICAgICAganVtcE5leHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgICAgICAgIHRpdGxlOiBzaG93VGl0bGUgPyBuZXh0SXRlbVRpdGxlIDogbnVsbCxcbiAgICAgICAgICAgIGtleTogXCJuZXh0XCIsXG4gICAgICAgICAgICB0YWJJbmRleDogXCIwXCIsXG4gICAgICAgICAgICBvbkNsaWNrOiB0aGlzLmp1bXBOZXh0LFxuICAgICAgICAgICAgb25LZXlQcmVzczogdGhpcy5ydW5JZkVudGVySnVtcE5leHQsXG4gICAgICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1qdW1wLW5leHRcIiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1qdW1wLW5leHQtY3VzdG9tLWljb25cIiksICEhanVtcE5leHRJY29uKSlcbiAgICAgICAgICB9LCBpdGVtUmVuZGVyKHRoaXMuZ2V0SnVtcE5leHRQYWdlKCksICdqdW1wLW5leHQnLCB0aGlzLmdldEl0ZW1JY29uKGp1bXBOZXh0SWNvbiwgJ25leHQgcGFnZScpKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFBhZ2VyID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUGFnZXIsIHtcbiAgICAgICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgICAgICBsYXN0OiB0cnVlLFxuICAgICAgICAgIHJvb3RQcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNoYW5nZSxcbiAgICAgICAgICBvbktleVByZXNzOiB0aGlzLnJ1bklmRW50ZXIsXG4gICAgICAgICAga2V5OiBhbGxQYWdlcyxcbiAgICAgICAgICBwYWdlOiBhbGxQYWdlcyxcbiAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxuICAgICAgICAgIHNob3dUaXRsZTogc2hvd1RpdGxlLFxuICAgICAgICAgIGl0ZW1SZW5kZXI6IGl0ZW1SZW5kZXJcbiAgICAgICAgfSk7XG4gICAgICAgIGZpcnN0UGFnZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQYWdlciwge1xuICAgICAgICAgIGxvY2FsZTogbG9jYWxlLFxuICAgICAgICAgIHJvb3RQcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNoYW5nZSxcbiAgICAgICAgICBvbktleVByZXNzOiB0aGlzLnJ1bklmRW50ZXIsXG4gICAgICAgICAga2V5OiAxLFxuICAgICAgICAgIHBhZ2U6IDEsXG4gICAgICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgICBzaG93VGl0bGU6IHNob3dUaXRsZSxcbiAgICAgICAgICBpdGVtUmVuZGVyOiBpdGVtUmVuZGVyXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgbGVmdCA9IE1hdGgubWF4KDEsIGN1cnJlbnQgLSBwYWdlQnVmZmVyU2l6ZSk7XG4gICAgICAgIHZhciByaWdodCA9IE1hdGgubWluKGN1cnJlbnQgKyBwYWdlQnVmZmVyU2l6ZSwgYWxsUGFnZXMpO1xuICAgICAgICBpZiAoY3VycmVudCAtIDEgPD0gcGFnZUJ1ZmZlclNpemUpIHtcbiAgICAgICAgICByaWdodCA9IDEgKyBwYWdlQnVmZmVyU2l6ZSAqIDI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFsbFBhZ2VzIC0gY3VycmVudCA8PSBwYWdlQnVmZmVyU2l6ZSkge1xuICAgICAgICAgIGxlZnQgPSBhbGxQYWdlcyAtIHBhZ2VCdWZmZXJTaXplICogMjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBfaSA9IGxlZnQ7IF9pIDw9IHJpZ2h0OyBfaSArPSAxKSB7XG4gICAgICAgICAgdmFyIF9hY3RpdmUgPSBjdXJyZW50ID09PSBfaTtcbiAgICAgICAgICBwYWdlckxpc3QucHVzaCggLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUGFnZXIsIHtcbiAgICAgICAgICAgIGxvY2FsZTogbG9jYWxlLFxuICAgICAgICAgICAgcm9vdFByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgICAgICAgb25DbGljazogdGhpcy5oYW5kbGVDaGFuZ2UsXG4gICAgICAgICAgICBvbktleVByZXNzOiB0aGlzLnJ1bklmRW50ZXIsXG4gICAgICAgICAgICBrZXk6IF9pLFxuICAgICAgICAgICAgcGFnZTogX2ksXG4gICAgICAgICAgICBhY3RpdmU6IF9hY3RpdmUsXG4gICAgICAgICAgICBzaG93VGl0bGU6IHNob3dUaXRsZSxcbiAgICAgICAgICAgIGl0ZW1SZW5kZXI6IGl0ZW1SZW5kZXJcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN1cnJlbnQgLSAxID49IHBhZ2VCdWZmZXJTaXplICogMiAmJiBjdXJyZW50ICE9PSAxICsgMikge1xuICAgICAgICAgIHBhZ2VyTGlzdFswXSA9IC8qI19fUFVSRV9fKi9jbG9uZUVsZW1lbnQocGFnZXJMaXN0WzBdLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1hZnRlci1qdW1wLXByZXZcIilcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwYWdlckxpc3QudW5zaGlmdChqdW1wUHJldik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFsbFBhZ2VzIC0gY3VycmVudCA+PSBwYWdlQnVmZmVyU2l6ZSAqIDIgJiYgY3VycmVudCAhPT0gYWxsUGFnZXMgLSAyKSB7XG4gICAgICAgICAgcGFnZXJMaXN0W3BhZ2VyTGlzdC5sZW5ndGggLSAxXSA9IC8qI19fUFVSRV9fKi9jbG9uZUVsZW1lbnQocGFnZXJMaXN0W3BhZ2VyTGlzdC5sZW5ndGggLSAxXSwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tYmVmb3JlLWp1bXAtbmV4dFwiKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHBhZ2VyTGlzdC5wdXNoKGp1bXBOZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGVmdCAhPT0gMSkge1xuICAgICAgICAgIHBhZ2VyTGlzdC51bnNoaWZ0KGZpcnN0UGFnZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyaWdodCAhPT0gYWxsUGFnZXMpIHtcbiAgICAgICAgICBwYWdlckxpc3QucHVzaChsYXN0UGFnZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgcHJldkRpc2FibGVkID0gIXRoaXMuaGFzUHJldigpIHx8ICFhbGxQYWdlcztcbiAgICAgIHZhciBuZXh0RGlzYWJsZWQgPSAhdGhpcy5oYXNOZXh0KCkgfHwgIWFsbFBhZ2VzO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwidWxcIiwgX2V4dGVuZHMoe1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBjbGFzc05hbWUsIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kaXNhYmxlZFwiKSwgZGlzYWJsZWQpKSxcbiAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICByZWY6IHRoaXMuc2F2ZVBhZ2luYXRpb25Ob2RlXG4gICAgICB9LCBkYXRhT3JBcmlhQXR0cmlidXRlUHJvcHMpLCB0b3RhbFRleHQsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgICAgICB0aXRsZTogc2hvd1RpdGxlID8gbG9jYWxlLnByZXZfcGFnZSA6IG51bGwsXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMucHJldixcbiAgICAgICAgdGFiSW5kZXg6IHByZXZEaXNhYmxlZCA/IG51bGwgOiAwLFxuICAgICAgICBvbktleVByZXNzOiB0aGlzLnJ1bklmRW50ZXJQcmV2LFxuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wcmV2XCIpLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWRcIiksIHByZXZEaXNhYmxlZCkpLFxuICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjogcHJldkRpc2FibGVkXG4gICAgICB9LCB0aGlzLnJlbmRlclByZXYocHJldlBhZ2UpKSwgcGFnZXJMaXN0LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgICAgdGl0bGU6IHNob3dUaXRsZSA/IGxvY2FsZS5uZXh0X3BhZ2UgOiBudWxsLFxuICAgICAgICBvbkNsaWNrOiB0aGlzLm5leHQsXG4gICAgICAgIHRhYkluZGV4OiBuZXh0RGlzYWJsZWQgPyBudWxsIDogMCxcbiAgICAgICAgb25LZXlQcmVzczogdGhpcy5ydW5JZkVudGVyTmV4dCxcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbmV4dFwiKSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRpc2FibGVkXCIpLCBuZXh0RGlzYWJsZWQpKSxcbiAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IG5leHREaXNhYmxlZFxuICAgICAgfSwgdGhpcy5yZW5kZXJOZXh0KG5leHRQYWdlKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE9wdGlvbnMsIHtcbiAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgICAgcm9vdFByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgICBzZWxlY3RDb21wb25lbnRDbGFzczogc2VsZWN0Q29tcG9uZW50Q2xhc3MsXG4gICAgICAgIHNlbGVjdFByZWZpeENsczogc2VsZWN0UHJlZml4Q2xzLFxuICAgICAgICBjaGFuZ2VTaXplOiB0aGlzLmdldFNob3dTaXplQ2hhbmdlcigpID8gdGhpcy5jaGFuZ2VQYWdlU2l6ZSA6IG51bGwsXG4gICAgICAgIGN1cnJlbnQ6IGN1cnJlbnQsXG4gICAgICAgIHBhZ2VTaXplOiBwYWdlU2l6ZSxcbiAgICAgICAgcGFnZVNpemVPcHRpb25zOiBwYWdlU2l6ZU9wdGlvbnMsXG4gICAgICAgIHF1aWNrR286IHRoaXMuc2hvdWxkRGlzcGxheVF1aWNrSnVtcGVyKCkgPyB0aGlzLmhhbmRsZUNoYW5nZSA6IG51bGwsXG4gICAgICAgIGdvQnV0dG9uOiBnb0J1dHRvblxuICAgICAgfSkpO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMocHJvcHMsIHByZXZTdGF0ZSkge1xuICAgICAgdmFyIG5ld1N0YXRlID0ge307XG4gICAgICBpZiAoJ2N1cnJlbnQnIGluIHByb3BzKSB7XG4gICAgICAgIG5ld1N0YXRlLmN1cnJlbnQgPSBwcm9wcy5jdXJyZW50O1xuICAgICAgICBpZiAocHJvcHMuY3VycmVudCAhPT0gcHJldlN0YXRlLmN1cnJlbnQpIHtcbiAgICAgICAgICBuZXdTdGF0ZS5jdXJyZW50SW5wdXRWYWx1ZSA9IG5ld1N0YXRlLmN1cnJlbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICgncGFnZVNpemUnIGluIHByb3BzICYmIHByb3BzLnBhZ2VTaXplICE9PSBwcmV2U3RhdGUucGFnZVNpemUpIHtcbiAgICAgICAgdmFyIGN1cnJlbnQgPSBwcmV2U3RhdGUuY3VycmVudDtcbiAgICAgICAgdmFyIG5ld0N1cnJlbnQgPSBjYWxjdWxhdGVQYWdlKHByb3BzLnBhZ2VTaXplLCBwcmV2U3RhdGUsIHByb3BzKTtcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQgPiBuZXdDdXJyZW50ID8gbmV3Q3VycmVudCA6IGN1cnJlbnQ7XG4gICAgICAgIGlmICghKCdjdXJyZW50JyBpbiBwcm9wcykpIHtcbiAgICAgICAgICBuZXdTdGF0ZS5jdXJyZW50ID0gY3VycmVudDtcbiAgICAgICAgICBuZXdTdGF0ZS5jdXJyZW50SW5wdXRWYWx1ZSA9IGN1cnJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgbmV3U3RhdGUucGFnZVNpemUgPSBwcm9wcy5wYWdlU2l6ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXdTdGF0ZTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIFBhZ2luYXRpb247XG59KFJlYWN0LkNvbXBvbmVudCk7XG5QYWdpbmF0aW9uLmRlZmF1bHRQcm9wcyA9IHtcbiAgZGVmYXVsdEN1cnJlbnQ6IDEsXG4gIHRvdGFsOiAwLFxuICBkZWZhdWx0UGFnZVNpemU6IDEwLFxuICBvbkNoYW5nZTogbm9vcCxcbiAgY2xhc3NOYW1lOiAnJyxcbiAgc2VsZWN0UHJlZml4Q2xzOiAncmMtc2VsZWN0JyxcbiAgcHJlZml4Q2xzOiAncmMtcGFnaW5hdGlvbicsXG4gIHNlbGVjdENvbXBvbmVudENsYXNzOiBudWxsLFxuICBoaWRlT25TaW5nbGVQYWdlOiBmYWxzZSxcbiAgc2hvd1ByZXZOZXh0SnVtcGVyczogdHJ1ZSxcbiAgc2hvd1F1aWNrSnVtcGVyOiBmYWxzZSxcbiAgc2hvd0xlc3NJdGVtczogZmFsc2UsXG4gIHNob3dUaXRsZTogdHJ1ZSxcbiAgb25TaG93U2l6ZUNoYW5nZTogbm9vcCxcbiAgbG9jYWxlOiBMT0NBTEUsXG4gIHN0eWxlOiB7fSxcbiAgaXRlbVJlbmRlcjogZGVmYXVsdEl0ZW1SZW5kZXIsXG4gIHRvdGFsQm91bmRhcnlTaG93U2l6ZUNoYW5nZXI6IDUwXG59O1xuZXhwb3J0IGRlZmF1bHQgUGFnaW5hdGlvbjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBTZWxlY3QgZnJvbSAnLi4vc2VsZWN0JztcbnZhciBNaW5pU2VsZWN0ID0gZnVuY3Rpb24gTWluaVNlbGVjdChwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2VsZWN0LCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICBzaXplOiBcInNtYWxsXCJcbiAgfSkpO1xufTtcbnZhciBNaWRkbGVTZWxlY3QgPSBmdW5jdGlvbiBNaWRkbGVTZWxlY3QocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNlbGVjdCwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgc2l6ZTogXCJtaWRkbGVcIlxuICB9KSk7XG59O1xuTWluaVNlbGVjdC5PcHRpb24gPSBTZWxlY3QuT3B0aW9uO1xuTWlkZGxlU2VsZWN0Lk9wdGlvbiA9IFNlbGVjdC5PcHRpb247XG5leHBvcnQgeyBNaW5pU2VsZWN0LCBNaWRkbGVTZWxlY3QgfTsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IERvdWJsZUxlZnRPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvRG91YmxlTGVmdE91dGxpbmVkXCI7XG5pbXBvcnQgRG91YmxlUmlnaHRPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvRG91YmxlUmlnaHRPdXRsaW5lZFwiO1xuaW1wb3J0IExlZnRPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvTGVmdE91dGxpbmVkXCI7XG5pbXBvcnQgUmlnaHRPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvUmlnaHRPdXRsaW5lZFwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUmNQYWdpbmF0aW9uIGZyb20gJ3JjLXBhZ2luYXRpb24nO1xuaW1wb3J0IGVuVVMgZnJvbSBcInJjLXBhZ2luYXRpb24vZXMvbG9jYWxlL2VuX1VTXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCB1c2VCcmVha3BvaW50IGZyb20gJy4uL2dyaWQvaG9va3MvdXNlQnJlYWtwb2ludCc7XG5pbXBvcnQgTG9jYWxlUmVjZWl2ZXIgZnJvbSAnLi4vbG9jYWxlLXByb3ZpZGVyL0xvY2FsZVJlY2VpdmVyJztcbmltcG9ydCB7IE1pZGRsZVNlbGVjdCwgTWluaVNlbGVjdCB9IGZyb20gJy4vU2VsZWN0JztcbnZhciBQYWdpbmF0aW9uID0gZnVuY3Rpb24gUGFnaW5hdGlvbihfYSkge1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gX2EucHJlZml4Q2xzLFxuICAgIGN1c3RvbWl6ZVNlbGVjdFByZWZpeENscyA9IF9hLnNlbGVjdFByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBfYS5jbGFzc05hbWUsXG4gICAgc2l6ZSA9IF9hLnNpemUsXG4gICAgY3VzdG9tTG9jYWxlID0gX2EubG9jYWxlLFxuICAgIHNlbGVjdENvbXBvbmVudENsYXNzID0gX2Euc2VsZWN0Q29tcG9uZW50Q2xhc3MsXG4gICAgcmVzcG9uc2l2ZSA9IF9hLnJlc3BvbnNpdmUsXG4gICAgc2hvd1NpemVDaGFuZ2VyID0gX2Euc2hvd1NpemVDaGFuZ2VyLFxuICAgIHJlc3RQcm9wcyA9IF9fcmVzdChfYSwgW1wicHJlZml4Q2xzXCIsIFwic2VsZWN0UHJlZml4Q2xzXCIsIFwiY2xhc3NOYW1lXCIsIFwic2l6ZVwiLCBcImxvY2FsZVwiLCBcInNlbGVjdENvbXBvbmVudENsYXNzXCIsIFwicmVzcG9uc2l2ZVwiLCBcInNob3dTaXplQ2hhbmdlclwiXSk7XG4gIHZhciBfdXNlQnJlYWtwb2ludCA9IHVzZUJyZWFrcG9pbnQocmVzcG9uc2l2ZSksXG4gICAgeHMgPSBfdXNlQnJlYWtwb2ludC54cztcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uLFxuICAgIF9SZWFjdCR1c2VDb250ZXh0JHBhZyA9IF9SZWFjdCR1c2VDb250ZXh0LnBhZ2luYXRpb24sXG4gICAgcGFnaW5hdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0JHBhZyA9PT0gdm9pZCAwID8ge30gOiBfUmVhY3QkdXNlQ29udGV4dCRwYWc7XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3BhZ2luYXRpb24nLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgbWVyZ2VkU2hvd1NpemVDaGFuZ2VyID0gc2hvd1NpemVDaGFuZ2VyICE9PSBudWxsICYmIHNob3dTaXplQ2hhbmdlciAhPT0gdm9pZCAwID8gc2hvd1NpemVDaGFuZ2VyIDogcGFnaW5hdGlvbi5zaG93U2l6ZUNoYW5nZXI7XG4gIHZhciBnZXRJY29uc1Byb3BzID0gZnVuY3Rpb24gZ2V0SWNvbnNQcm9wcygpIHtcbiAgICB2YXIgZWxsaXBzaXMgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tZWxsaXBzaXNcIilcbiAgICB9LCBcIlxcdTIwMjJcXHUyMDIyXFx1MjAyMlwiKTtcbiAgICB2YXIgcHJldkljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1saW5rXCIpLFxuICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgIHRhYkluZGV4OiAtMVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExlZnRPdXRsaW5lZCwgbnVsbCkpO1xuICAgIHZhciBuZXh0SWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLWxpbmtcIiksXG4gICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgdGFiSW5kZXg6IC0xXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmlnaHRPdXRsaW5lZCwgbnVsbCkpO1xuICAgIHZhciBqdW1wUHJldkljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImFcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tbGlua1wiKVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pdGVtLWNvbnRhaW5lclwiKVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERvdWJsZUxlZnRPdXRsaW5lZCwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tbGluay1pY29uXCIpXG4gICAgfSksIGVsbGlwc2lzKSk7XG4gICAgdmFyIGp1bXBOZXh0SWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYVwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaXRlbS1saW5rXCIpXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tY29udGFpbmVyXCIpXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRG91YmxlUmlnaHRPdXRsaW5lZCwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWl0ZW0tbGluay1pY29uXCIpXG4gICAgfSksIGVsbGlwc2lzKSk7XG4gICAgLy8gY2hhbmdlIGFycm93cyBkaXJlY3Rpb24gaW4gcmlnaHQtdG8tbGVmdCBkaXJlY3Rpb25cbiAgICBpZiAoZGlyZWN0aW9uID09PSAncnRsJykge1xuICAgICAgdmFyIF9yZWYgPSBbbmV4dEljb24sIHByZXZJY29uXTtcbiAgICAgIHByZXZJY29uID0gX3JlZlswXTtcbiAgICAgIG5leHRJY29uID0gX3JlZlsxXTtcbiAgICAgIHZhciBfcmVmMiA9IFtqdW1wTmV4dEljb24sIGp1bXBQcmV2SWNvbl07XG4gICAgICBqdW1wUHJldkljb24gPSBfcmVmMlswXTtcbiAgICAgIGp1bXBOZXh0SWNvbiA9IF9yZWYyWzFdO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcHJldkljb246IHByZXZJY29uLFxuICAgICAgbmV4dEljb246IG5leHRJY29uLFxuICAgICAganVtcFByZXZJY29uOiBqdW1wUHJldkljb24sXG4gICAgICBqdW1wTmV4dEljb246IGp1bXBOZXh0SWNvblxuICAgIH07XG4gIH07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMb2NhbGVSZWNlaXZlciwge1xuICAgIGNvbXBvbmVudE5hbWU6IFwiUGFnaW5hdGlvblwiLFxuICAgIGRlZmF1bHRMb2NhbGU6IGVuVVNcbiAgfSwgZnVuY3Rpb24gKGNvbnRleHRMb2NhbGUpIHtcbiAgICB2YXIgX2NsYXNzTmFtZXM7XG4gICAgdmFyIGxvY2FsZSA9IF9leHRlbmRzKF9leHRlbmRzKHt9LCBjb250ZXh0TG9jYWxlKSwgY3VzdG9tTG9jYWxlKTtcbiAgICB2YXIgaXNTbWFsbCA9IHNpemUgPT09ICdzbWFsbCcgfHwgISEoeHMgJiYgIXNpemUgJiYgcmVzcG9uc2l2ZSk7XG4gICAgdmFyIHNlbGVjdFByZWZpeENscyA9IGdldFByZWZpeENscygnc2VsZWN0JywgY3VzdG9taXplU2VsZWN0UHJlZml4Q2xzKTtcbiAgICB2YXIgZXh0ZW5kZWRDbGFzc05hbWUgPSBjbGFzc05hbWVzKChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbWluaVwiKSwgaXNTbWFsbCksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBfY2xhc3NOYW1lcyksIGNsYXNzTmFtZSk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJjUGFnaW5hdGlvbiwgX2V4dGVuZHMoe30sIGdldEljb25zUHJvcHMoKSwgcmVzdFByb3BzLCB7XG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIHNlbGVjdFByZWZpeENsczogc2VsZWN0UHJlZml4Q2xzLFxuICAgICAgY2xhc3NOYW1lOiBleHRlbmRlZENsYXNzTmFtZSxcbiAgICAgIHNlbGVjdENvbXBvbmVudENsYXNzOiBzZWxlY3RDb21wb25lbnRDbGFzcyB8fCAoaXNTbWFsbCA/IE1pbmlTZWxlY3QgOiBNaWRkbGVTZWxlY3QpLFxuICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICBzaG93U2l6ZUNoYW5nZXI6IG1lcmdlZFNob3dTaXplQ2hhbmdlclxuICAgIH0pKTtcbiAgfSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgUGFnaW5hdGlvbjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBkZWJvdW5jZSBmcm9tICdsb2Rhc2gvZGVib3VuY2UnO1xuaW1wb3J0IG9taXQgZnJvbSBcInJjLXV0aWwvZXMvb21pdFwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29uZmlnQ29uc3VtZXIsIENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHsgY2xvbmVFbGVtZW50LCBpc1ZhbGlkRWxlbWVudCB9IGZyb20gJy4uL191dGlsL3JlYWN0Tm9kZSc7XG5pbXBvcnQgeyB0dXBsZSB9IGZyb20gJy4uL191dGlsL3R5cGUnO1xudmFyIFNwaW5TaXplcyA9IHR1cGxlKCdzbWFsbCcsICdkZWZhdWx0JywgJ2xhcmdlJyk7XG4vLyBSZW5kZXIgaW5kaWNhdG9yXG52YXIgZGVmYXVsdEluZGljYXRvciA9IG51bGw7XG5mdW5jdGlvbiByZW5kZXJJbmRpY2F0b3IocHJlZml4Q2xzLCBwcm9wcykge1xuICB2YXIgaW5kaWNhdG9yID0gcHJvcHMuaW5kaWNhdG9yO1xuICB2YXIgZG90Q2xhc3NOYW1lID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kb3RcIik7XG4gIC8vIHNob3VsZCBub3QgYmUgcmVuZGVyIGRlZmF1bHQgaW5kaWNhdG9yIHdoZW4gaW5kaWNhdG9yIHZhbHVlIGlzIG51bGxcbiAgaWYgKGluZGljYXRvciA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmIChpc1ZhbGlkRWxlbWVudChpbmRpY2F0b3IpKSB7XG4gICAgcmV0dXJuIGNsb25lRWxlbWVudChpbmRpY2F0b3IsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhpbmRpY2F0b3IucHJvcHMuY2xhc3NOYW1lLCBkb3RDbGFzc05hbWUpXG4gICAgfSk7XG4gIH1cbiAgaWYgKGlzVmFsaWRFbGVtZW50KGRlZmF1bHRJbmRpY2F0b3IpKSB7XG4gICAgcmV0dXJuIGNsb25lRWxlbWVudChkZWZhdWx0SW5kaWNhdG9yLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoZGVmYXVsdEluZGljYXRvci5wcm9wcy5jbGFzc05hbWUsIGRvdENsYXNzTmFtZSlcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoZG90Q2xhc3NOYW1lLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRvdC1zcGluXCIpKVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImlcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kb3QtaXRlbVwiKVxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZG90LWl0ZW1cIilcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiaVwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRvdC1pdGVtXCIpXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImlcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kb3QtaXRlbVwiKVxuICB9KSk7XG59XG5mdW5jdGlvbiBzaG91bGREZWxheShzcGlubmluZywgZGVsYXkpIHtcbiAgcmV0dXJuICEhc3Bpbm5pbmcgJiYgISFkZWxheSAmJiAhaXNOYU4oTnVtYmVyKGRlbGF5KSk7XG59XG52YXIgU3BpbiA9IGZ1bmN0aW9uIFNwaW4ocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnNwaW5QcmVmaXhDbHMsXG4gICAgX3Byb3BzJHNwaW5uaW5nID0gcHJvcHMuc3Bpbm5pbmcsXG4gICAgY3VzdG9tU3Bpbm5pbmcgPSBfcHJvcHMkc3Bpbm5pbmcgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkc3Bpbm5pbmcsXG4gICAgZGVsYXkgPSBwcm9wcy5kZWxheSxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgX3Byb3BzJHNpemUgPSBwcm9wcy5zaXplLFxuICAgIHNpemUgPSBfcHJvcHMkc2l6ZSA9PT0gdm9pZCAwID8gJ2RlZmF1bHQnIDogX3Byb3BzJHNpemUsXG4gICAgdGlwID0gcHJvcHMudGlwLFxuICAgIHdyYXBwZXJDbGFzc05hbWUgPSBwcm9wcy53cmFwcGVyQ2xhc3NOYW1lLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICByZXN0UHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInNwaW5QcmVmaXhDbHNcIiwgXCJzcGlubmluZ1wiLCBcImRlbGF5XCIsIFwiY2xhc3NOYW1lXCIsIFwic2l6ZVwiLCBcInRpcFwiLCBcIndyYXBwZXJDbGFzc05hbWVcIiwgXCJzdHlsZVwiLCBcImNoaWxkcmVuXCJdKTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjdXN0b21TcGlubmluZyAmJiAhc2hvdWxkRGVsYXkoY3VzdG9tU3Bpbm5pbmcsIGRlbGF5KTtcbiAgICB9KSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBzcGlubmluZyA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0U3Bpbm5pbmcgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciB1cGRhdGVTcGlubmluZyA9IGRlYm91bmNlKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNldFNwaW5uaW5nKGN1c3RvbVNwaW5uaW5nKTtcbiAgICB9LCBkZWxheSk7XG4gICAgdXBkYXRlU3Bpbm5pbmcoKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9hO1xuICAgICAgKF9hID0gdXBkYXRlU3Bpbm5pbmcgPT09IG51bGwgfHwgdXBkYXRlU3Bpbm5pbmcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHVwZGF0ZVNwaW5uaW5nLmNhbmNlbCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwodXBkYXRlU3Bpbm5pbmcpO1xuICAgIH07XG4gIH0sIFtkZWxheSwgY3VzdG9tU3Bpbm5pbmddKTtcbiAgdmFyIGlzTmVzdGVkUGF0dGVybiA9IGZ1bmN0aW9uIGlzTmVzdGVkUGF0dGVybigpIHtcbiAgICByZXR1cm4gdHlwZW9mIGNoaWxkcmVuICE9PSAndW5kZWZpbmVkJztcbiAgfTtcbiAgdmFyIHJlbmRlclNwaW4gPSBmdW5jdGlvbiByZW5kZXJTcGluKF9yZWYpIHtcbiAgICB2YXIgX2NsYXNzTmFtZXM7XG4gICAgdmFyIGRpcmVjdGlvbiA9IF9yZWYuZGlyZWN0aW9uO1xuICAgIHZhciBzcGluQ2xhc3NOYW1lID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc21cIiksIHNpemUgPT09ICdzbWFsbCcpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbGdcIiksIHNpemUgPT09ICdsYXJnZScpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3Bpbm5pbmdcIiksIHNwaW5uaW5nKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNob3ctdGV4dFwiKSwgISF0aXApLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuICAgIC8vIGZpeCBodHRwczovL2ZiLm1lL3JlYWN0LXVua25vd24tcHJvcFxuICAgIHZhciBkaXZQcm9wcyA9IG9taXQocmVzdFByb3BzLCBbJ2luZGljYXRvcicsICdwcmVmaXhDbHMnXSk7XG4gICAgdmFyIHNwaW5FbGVtZW50ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe30sIGRpdlByb3BzLCB7XG4gICAgICBzdHlsZTogc3R5bGUsXG4gICAgICBjbGFzc05hbWU6IHNwaW5DbGFzc05hbWUsXG4gICAgICBcImFyaWEtbGl2ZVwiOiBcInBvbGl0ZVwiLFxuICAgICAgXCJhcmlhLWJ1c3lcIjogc3Bpbm5pbmdcbiAgICB9KSwgcmVuZGVySW5kaWNhdG9yKHByZWZpeENscywgcHJvcHMpLCB0aXAgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdGV4dFwiKVxuICAgIH0sIHRpcCkgOiBudWxsKTtcbiAgICBpZiAoaXNOZXN0ZWRQYXR0ZXJuKCkpIHtcbiAgICAgIHZhciBjb250YWluZXJDbGFzc05hbWUgPSBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29udGFpbmVyXCIpLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYmx1clwiKSwgc3Bpbm5pbmcpKTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7fSwgZGl2UHJvcHMsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbmVzdGVkLWxvYWRpbmdcIiksIHdyYXBwZXJDbGFzc05hbWUpXG4gICAgICB9KSwgc3Bpbm5pbmcgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBrZXk6IFwibG9hZGluZ1wiXG4gICAgICB9LCBzcGluRWxlbWVudCksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjb250YWluZXJDbGFzc05hbWUsXG4gICAgICAgIGtleTogXCJjb250YWluZXJcIlxuICAgICAgfSwgY2hpbGRyZW4pKTtcbiAgICB9XG4gICAgcmV0dXJuIHNwaW5FbGVtZW50O1xuICB9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29uZmlnQ29uc3VtZXIsIG51bGwsIHJlbmRlclNwaW4pO1xufTtcbnZhciBTcGluRkMgPSBmdW5jdGlvbiBTcGluRkMocHJvcHMpIHtcbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscztcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHM7XG4gIHZhciBzcGluUHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdzcGluJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIHNwaW5DbGFzc1Byb3BzID0gX2V4dGVuZHMoX2V4dGVuZHMoe30sIHByb3BzKSwge1xuICAgIHNwaW5QcmVmaXhDbHM6IHNwaW5QcmVmaXhDbHNcbiAgfSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTcGluLCBfZXh0ZW5kcyh7fSwgc3BpbkNsYXNzUHJvcHMpKTtcbn07XG5TcGluRkMuc2V0RGVmYXVsdEluZGljYXRvciA9IGZ1bmN0aW9uIChpbmRpY2F0b3IpIHtcbiAgZGVmYXVsdEluZGljYXRvciA9IGluZGljYXRvcjtcbn07XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBTcGluRkMuZGlzcGxheU5hbWUgPSAnU3Bpbic7XG59XG5leHBvcnQgZGVmYXVsdCBTcGluRkM7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCB1c2VTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VTdGF0ZVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICcuLi9idXR0b24nO1xuaW1wb3J0IHsgY29udmVydExlZ2FjeVByb3BzIH0gZnJvbSAnLi4vYnV0dG9uL2J1dHRvbic7XG5mdW5jdGlvbiBpc1RoZW5hYmxlKHRoaW5nKSB7XG4gIHJldHVybiAhISh0aGluZyAmJiAhIXRoaW5nLnRoZW4pO1xufVxudmFyIEFjdGlvbkJ1dHRvbiA9IGZ1bmN0aW9uIEFjdGlvbkJ1dHRvbihwcm9wcykge1xuICB2YXIgY2xpY2tlZFJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIHZhciByZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShmYWxzZSksXG4gICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgbG9hZGluZyA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0TG9hZGluZyA9IF91c2VTdGF0ZTJbMV07XG4gIHZhciBjbG9zZSA9IHByb3BzLmNsb3NlO1xuICB2YXIgb25JbnRlcm5hbENsb3NlID0gZnVuY3Rpb24gb25JbnRlcm5hbENsb3NlKCkge1xuICAgIGNsb3NlID09PSBudWxsIHx8IGNsb3NlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjbG9zZS5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gIH07XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRpbWVvdXRJZCA9IG51bGw7XG4gICAgaWYgKHByb3BzLmF1dG9Gb2N1cykge1xuICAgICAgdGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gcmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5mb2N1cygpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAodGltZW91dElkKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFtdKTtcbiAgdmFyIGhhbmRsZVByb21pc2VPbk9rID0gZnVuY3Rpb24gaGFuZGxlUHJvbWlzZU9uT2socmV0dXJuVmFsdWVPZk9uT2spIHtcbiAgICBpZiAoIWlzVGhlbmFibGUocmV0dXJuVmFsdWVPZk9uT2spKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNldExvYWRpbmcodHJ1ZSk7XG4gICAgcmV0dXJuVmFsdWVPZk9uT2sudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlLCB0cnVlKTtcbiAgICAgIG9uSW50ZXJuYWxDbG9zZS5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gICAgICBjbGlja2VkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9LCBmdW5jdGlvbiAoZSkge1xuICAgICAgLy8gRW1pdCBlcnJvciB3aGVuIGNhdGNoIHByb21pc2UgcmVqZWN0XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNjE4M1xuICAgICAgc2V0TG9hZGluZyhmYWxzZSwgdHJ1ZSk7XG4gICAgICBjbGlja2VkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9KTtcbiAgfTtcbiAgdmFyIG9uQ2xpY2sgPSBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICB2YXIgYWN0aW9uRm4gPSBwcm9wcy5hY3Rpb25GbjtcbiAgICBpZiAoY2xpY2tlZFJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNsaWNrZWRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgaWYgKCFhY3Rpb25Gbikge1xuICAgICAgb25JbnRlcm5hbENsb3NlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciByZXR1cm5WYWx1ZU9mT25PaztcbiAgICBpZiAocHJvcHMuZW1pdEV2ZW50KSB7XG4gICAgICByZXR1cm5WYWx1ZU9mT25PayA9IGFjdGlvbkZuKGUpO1xuICAgICAgaWYgKHByb3BzLnF1aXRPbk51bGxpc2hSZXR1cm5WYWx1ZSAmJiAhaXNUaGVuYWJsZShyZXR1cm5WYWx1ZU9mT25PaykpIHtcbiAgICAgICAgY2xpY2tlZFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgIG9uSW50ZXJuYWxDbG9zZShlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYWN0aW9uRm4ubGVuZ3RoKSB7XG4gICAgICByZXR1cm5WYWx1ZU9mT25PayA9IGFjdGlvbkZuKGNsb3NlKTtcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzIzMzU4XG4gICAgICBjbGlja2VkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuVmFsdWVPZk9uT2sgPSBhY3Rpb25GbigpO1xuICAgICAgaWYgKCFyZXR1cm5WYWx1ZU9mT25Paykge1xuICAgICAgICBvbkludGVybmFsQ2xvc2UoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBoYW5kbGVQcm9taXNlT25PayhyZXR1cm5WYWx1ZU9mT25Payk7XG4gIH07XG4gIHZhciB0eXBlID0gcHJvcHMudHlwZSxcbiAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBidXR0b25Qcm9wcyA9IHByb3BzLmJ1dHRvblByb3BzO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQnV0dG9uLCBfZXh0ZW5kcyh7fSwgY29udmVydExlZ2FjeVByb3BzKHR5cGUpLCB7XG4gICAgb25DbGljazogb25DbGljayxcbiAgICBsb2FkaW5nOiBsb2FkaW5nLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzXG4gIH0sIGJ1dHRvblByb3BzLCB7XG4gICAgcmVmOiByZWZcbiAgfSksIGNoaWxkcmVuKTtcbn07XG5leHBvcnQgZGVmYXVsdCBBY3Rpb25CdXR0b247IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQnV0dG9uIGZyb20gJy4uL2J1dHRvbic7XG5pbXBvcnQgeyBjb252ZXJ0TGVnYWN5UHJvcHMgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uJztcbmltcG9ydCBBY3Rpb25CdXR0b24gZnJvbSAnLi4vX3V0aWwvQWN0aW9uQnV0dG9uJztcbmltcG9ydCBMb2NhbGVSZWNlaXZlciBmcm9tICcuLi9sb2NhbGUtcHJvdmlkZXIvTG9jYWxlUmVjZWl2ZXInO1xuaW1wb3J0IGRlZmF1bHRMb2NhbGUgZnJvbSAnLi4vbG9jYWxlL2RlZmF1bHQnO1xuaW1wb3J0IHsgZ2V0UmVuZGVyUHJvcFZhbHVlIH0gZnJvbSAnLi4vX3V0aWwvZ2V0UmVuZGVyUHJvcFZhbHVlJztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuZXhwb3J0IHZhciBPdmVybGF5ID0gZnVuY3Rpb24gT3ZlcmxheShwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIG9rQnV0dG9uUHJvcHMgPSBwcm9wcy5va0J1dHRvblByb3BzLFxuICAgIGNhbmNlbEJ1dHRvblByb3BzID0gcHJvcHMuY2FuY2VsQnV0dG9uUHJvcHMsXG4gICAgdGl0bGUgPSBwcm9wcy50aXRsZSxcbiAgICBjYW5jZWxUZXh0ID0gcHJvcHMuY2FuY2VsVGV4dCxcbiAgICBva1RleHQgPSBwcm9wcy5va1RleHQsXG4gICAgb2tUeXBlID0gcHJvcHMub2tUeXBlLFxuICAgIGljb24gPSBwcm9wcy5pY29uLFxuICAgIF9wcm9wcyRzaG93Q2FuY2VsID0gcHJvcHMuc2hvd0NhbmNlbCxcbiAgICBzaG93Q2FuY2VsID0gX3Byb3BzJHNob3dDYW5jZWwgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkc2hvd0NhbmNlbCxcbiAgICBjbG9zZSA9IHByb3BzLmNsb3NlLFxuICAgIG9uQ29uZmlybSA9IHByb3BzLm9uQ29uZmlybSxcbiAgICBvbkNhbmNlbCA9IHByb3BzLm9uQ2FuY2VsO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscztcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExvY2FsZVJlY2VpdmVyLCB7XG4gICAgY29tcG9uZW50TmFtZTogXCJQb3Bjb25maXJtXCIsXG4gICAgZGVmYXVsdExvY2FsZTogZGVmYXVsdExvY2FsZS5Qb3Bjb25maXJtXG4gIH0sIGZ1bmN0aW9uIChjb250ZXh0TG9jYWxlKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbm5lci1jb250ZW50XCIpXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1lc3NhZ2VcIilcbiAgICB9LCBpY29uICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbWVzc2FnZS1pY29uXCIpXG4gICAgfSwgaWNvbiksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1tZXNzYWdlLXRpdGxlXCIpXG4gICAgfSwgZ2V0UmVuZGVyUHJvcFZhbHVlKHRpdGxlKSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYnV0dG9uc1wiKVxuICAgIH0sIHNob3dDYW5jZWwgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQnV0dG9uLCBfZXh0ZW5kcyh7XG4gICAgICBvbkNsaWNrOiBvbkNhbmNlbCxcbiAgICAgIHNpemU6IFwic21hbGxcIlxuICAgIH0sIGNhbmNlbEJ1dHRvblByb3BzKSwgY2FuY2VsVGV4dCAhPT0gbnVsbCAmJiBjYW5jZWxUZXh0ICE9PSB2b2lkIDAgPyBjYW5jZWxUZXh0IDogY29udGV4dExvY2FsZS5jYW5jZWxUZXh0KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQWN0aW9uQnV0dG9uLCB7XG4gICAgICBidXR0b25Qcm9wczogX2V4dGVuZHMoX2V4dGVuZHMoe1xuICAgICAgICBzaXplOiAnc21hbGwnXG4gICAgICB9LCBjb252ZXJ0TGVnYWN5UHJvcHMob2tUeXBlKSksIG9rQnV0dG9uUHJvcHMpLFxuICAgICAgYWN0aW9uRm46IG9uQ29uZmlybSxcbiAgICAgIGNsb3NlOiBjbG9zZSxcbiAgICAgIHByZWZpeENsczogZ2V0UHJlZml4Q2xzKCdidG4nKSxcbiAgICAgIHF1aXRPbk51bGxpc2hSZXR1cm5WYWx1ZTogdHJ1ZSxcbiAgICAgIGVtaXRFdmVudDogdHJ1ZVxuICAgIH0sIG9rVGV4dCAhPT0gbnVsbCAmJiBva1RleHQgIT09IHZvaWQgMCA/IG9rVGV4dCA6IGNvbnRleHRMb2NhbGUub2tUZXh0KSkpO1xuICB9KTtcbn07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbnZhciBfdGhpcyA9IHRoaXM7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IEV4Y2xhbWF0aW9uQ2lyY2xlRmlsbGVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9FeGNsYW1hdGlvbkNpcmNsZUZpbGxlZFwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgdXNlTWVyZ2VkU3RhdGUgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTWVyZ2VkU3RhdGVcIjtcbmltcG9ydCBLZXlDb2RlIGZyb20gXCJyYy11dGlsL2VzL0tleUNvZGVcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IFBvcG92ZXIgZnJvbSAnLi4vcG9wb3Zlcic7XG5pbXBvcnQgeyBjbG9uZUVsZW1lbnQgfSBmcm9tICcuLi9fdXRpbC9yZWFjdE5vZGUnO1xuaW1wb3J0IHsgT3ZlcmxheSB9IGZyb20gJy4vUHVyZVBhbmVsJztcbnZhciBQb3Bjb25maXJtID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHM7XG4gIHZhciBfdXNlTWVyZ2VkU3RhdGUgPSB1c2VNZXJnZWRTdGF0ZShmYWxzZSwge1xuICAgICAgdmFsdWU6IHByb3BzLm9wZW4gIT09IHVuZGVmaW5lZCA/IHByb3BzLm9wZW4gOiBwcm9wcy52aXNpYmxlLFxuICAgICAgZGVmYXVsdFZhbHVlOiBwcm9wcy5kZWZhdWx0T3BlbiAhPT0gdW5kZWZpbmVkID8gcHJvcHMuZGVmYXVsdE9wZW4gOiBwcm9wcy5kZWZhdWx0VmlzaWJsZVxuICAgIH0pLFxuICAgIF91c2VNZXJnZWRTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGUsIDIpLFxuICAgIG9wZW4gPSBfdXNlTWVyZ2VkU3RhdGUyWzBdLFxuICAgIHNldE9wZW4gPSBfdXNlTWVyZ2VkU3RhdGUyWzFdO1xuICAvLyBjb25zdCBpc0Rlc3Ryb3llZCA9IHVzZURlc3Ryb3llZCgpO1xuICB2YXIgc2V0dGluZ09wZW4gPSBmdW5jdGlvbiBzZXR0aW5nT3Blbih2YWx1ZSwgZSkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgc2V0T3Blbih2YWx1ZSwgdHJ1ZSk7XG4gICAgKF9hID0gcHJvcHMub25WaXNpYmxlQ2hhbmdlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChwcm9wcywgdmFsdWUsIGUpO1xuICAgIChfYiA9IHByb3BzLm9uT3BlbkNoYW5nZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwocHJvcHMsIHZhbHVlLCBlKTtcbiAgfTtcbiAgdmFyIGNsb3NlID0gZnVuY3Rpb24gY2xvc2UoZSkge1xuICAgIHNldHRpbmdPcGVuKGZhbHNlLCBlKTtcbiAgfTtcbiAgdmFyIG9uQ29uZmlybSA9IGZ1bmN0aW9uIG9uQ29uZmlybShlKSB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiAoX2EgPSBwcm9wcy5vbkNvbmZpcm0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKF90aGlzLCBlKTtcbiAgfTtcbiAgdmFyIG9uQ2FuY2VsID0gZnVuY3Rpb24gb25DYW5jZWwoZSkge1xuICAgIHZhciBfYTtcbiAgICBzZXR0aW5nT3BlbihmYWxzZSwgZSk7XG4gICAgKF9hID0gcHJvcHMub25DYW5jZWwpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKF90aGlzLCBlKTtcbiAgfTtcbiAgdmFyIF9vbktleURvd24gPSBmdW5jdGlvbiBvbktleURvd24oZSkge1xuICAgIGlmIChlLmtleUNvZGUgPT09IEtleUNvZGUuRVNDICYmIG9wZW4pIHtcbiAgICAgIHNldHRpbmdPcGVuKGZhbHNlLCBlKTtcbiAgICB9XG4gIH07XG4gIHZhciBvbk9wZW5DaGFuZ2UgPSBmdW5jdGlvbiBvbk9wZW5DaGFuZ2UodmFsdWUpIHtcbiAgICB2YXIgX3Byb3BzJGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgICBkaXNhYmxlZCA9IF9wcm9wcyRkaXNhYmxlZCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZGlzYWJsZWQ7XG4gICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNldHRpbmdPcGVuKHZhbHVlKTtcbiAgfTtcbiAgdmFyIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBfcHJvcHMkcGxhY2VtZW50ID0gcHJvcHMucGxhY2VtZW50LFxuICAgIHBsYWNlbWVudCA9IF9wcm9wcyRwbGFjZW1lbnQgPT09IHZvaWQgMCA/ICd0b3AnIDogX3Byb3BzJHBsYWNlbWVudCxcbiAgICBfcHJvcHMkdHJpZ2dlciA9IHByb3BzLnRyaWdnZXIsXG4gICAgdHJpZ2dlciA9IF9wcm9wcyR0cmlnZ2VyID09PSB2b2lkIDAgPyAnY2xpY2snIDogX3Byb3BzJHRyaWdnZXIsXG4gICAgX3Byb3BzJG9rVHlwZSA9IHByb3BzLm9rVHlwZSxcbiAgICBva1R5cGUgPSBfcHJvcHMkb2tUeXBlID09PSB2b2lkIDAgPyAncHJpbWFyeScgOiBfcHJvcHMkb2tUeXBlLFxuICAgIF9wcm9wcyRpY29uID0gcHJvcHMuaWNvbixcbiAgICBpY29uID0gX3Byb3BzJGljb24gPT09IHZvaWQgMCA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEV4Y2xhbWF0aW9uQ2lyY2xlRmlsbGVkLCBudWxsKSA6IF9wcm9wcyRpY29uLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgb3ZlcmxheUNsYXNzTmFtZSA9IHByb3BzLm92ZXJsYXlDbGFzc05hbWUsXG4gICAgcmVzdFByb3BzID0gX19yZXN0KHByb3BzLCBbXCJwcmVmaXhDbHNcIiwgXCJwbGFjZW1lbnRcIiwgXCJ0cmlnZ2VyXCIsIFwib2tUeXBlXCIsIFwiaWNvblwiLCBcImNoaWxkcmVuXCIsIFwib3ZlcmxheUNsYXNzTmFtZVwiXSk7XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3BvcG92ZXInLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgcHJlZml4Q2xzQ29uZmlybSA9IGdldFByZWZpeENscygncG9wY29uZmlybScsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIHZhciBvdmVybGF5Q2xhc3NOYW1lcyA9IGNsYXNzTmFtZXMocHJlZml4Q2xzQ29uZmlybSwgb3ZlcmxheUNsYXNzTmFtZSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQb3BvdmVyLCBfZXh0ZW5kcyh7fSwgcmVzdFByb3BzLCB7XG4gICAgdHJpZ2dlcjogdHJpZ2dlcixcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICBvbk9wZW5DaGFuZ2U6IG9uT3BlbkNoYW5nZSxcbiAgICBvcGVuOiBvcGVuLFxuICAgIHJlZjogcmVmLFxuICAgIG92ZXJsYXlDbGFzc05hbWU6IG92ZXJsYXlDbGFzc05hbWVzLFxuICAgIF9vdmVybGF5OiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChPdmVybGF5LCBfZXh0ZW5kcyh7XG4gICAgICBva1R5cGU6IG9rVHlwZSxcbiAgICAgIGljb246IGljb25cbiAgICB9LCBwcm9wcywge1xuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICBjbG9zZTogY2xvc2UsXG4gICAgICBvbkNvbmZpcm06IG9uQ29uZmlybSxcbiAgICAgIG9uQ2FuY2VsOiBvbkNhbmNlbFxuICAgIH0pKVxuICB9KSwgY2xvbmVFbGVtZW50KGNoaWxkcmVuLCB7XG4gICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oZSkge1xuICAgICAgdmFyIF9hLCBfYjtcbiAgICAgIGlmICggLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSkge1xuICAgICAgICAoX2IgPSBjaGlsZHJlbiA9PT0gbnVsbCB8fCBjaGlsZHJlbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9hID0gY2hpbGRyZW4ucHJvcHMpLm9uS2V5RG93bikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoX2EsIGUpO1xuICAgICAgfVxuICAgICAgX29uS2V5RG93bihlKTtcbiAgICB9XG4gIH0pKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgUG9wY29uZmlybTsiLCJpbXBvcnQgeyB1c2VSZWYsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmV4cG9ydCB2YXIgZGVmYXVsdFByb3BzID0ge1xuICBjbGFzc05hbWU6ICcnLFxuICBwZXJjZW50OiAwLFxuICBwcmVmaXhDbHM6ICdyYy1wcm9ncmVzcycsXG4gIHN0cm9rZUNvbG9yOiAnIzJkYjdmNScsXG4gIHN0cm9rZUxpbmVjYXA6ICdyb3VuZCcsXG4gIHN0cm9rZVdpZHRoOiAxLFxuICBzdHlsZToge30sXG4gIHRyYWlsQ29sb3I6ICcjRDlEOUQ5JyxcbiAgdHJhaWxXaWR0aDogMSxcbiAgZ2FwUG9zaXRpb246ICdib3R0b20nXG59O1xuZXhwb3J0IHZhciB1c2VUcmFuc2l0aW9uRHVyYXRpb24gPSBmdW5jdGlvbiB1c2VUcmFuc2l0aW9uRHVyYXRpb24oKSB7XG4gIHZhciBwYXRoc1JlZiA9IHVzZVJlZihbXSk7XG4gIHZhciBwcmV2VGltZVN0YW1wID0gdXNlUmVmKG51bGwpO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICAgIHZhciB1cGRhdGVkID0gZmFsc2U7XG4gICAgcGF0aHNSZWYuY3VycmVudC5mb3JFYWNoKGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdXBkYXRlZCA9IHRydWU7XG4gICAgICB2YXIgcGF0aFN0eWxlID0gcGF0aC5zdHlsZTtcbiAgICAgIHBhdGhTdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSAnLjNzLCAuM3MsIC4zcywgLjA2cyc7XG4gICAgICBpZiAocHJldlRpbWVTdGFtcC5jdXJyZW50ICYmIG5vdyAtIHByZXZUaW1lU3RhbXAuY3VycmVudCA8IDEwMCkge1xuICAgICAgICBwYXRoU3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gJzBzLCAwcyc7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgIHByZXZUaW1lU3RhbXAuY3VycmVudCA9IERhdGUubm93KCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHBhdGhzUmVmLmN1cnJlbnQ7XG59OyIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNhblVzZURvbSBmcm9tIFwicmMtdXRpbC9lcy9Eb20vY2FuVXNlRG9tXCI7XG52YXIgdXVpZCA9IDA7XG4vKiogSXMgY2xpZW50IHNpZGUgYW5kIG5vdCBqc2RvbSAqL1xuZXhwb3J0IHZhciBpc0Jyb3dzZXJDbGllbnQgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Rlc3QnICYmIGNhblVzZURvbSgpO1xuLyoqIEdldCB1bmlxdWUgaWQgZm9yIGFjY2Vzc2liaWxpdHkgdXNhZ2UgKi9cbmZ1bmN0aW9uIGdldFVVSUQoKSB7XG4gIHZhciByZXRJZDtcbiAgLy8gVGVzdCBuZXZlciByZWFjaFxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGlzQnJvd3NlckNsaWVudCkge1xuICAgIHJldElkID0gdXVpZDtcbiAgICB1dWlkICs9IDE7XG4gIH0gZWxzZSB7XG4gICAgcmV0SWQgPSAnVEVTVF9PUl9TU1InO1xuICB9XG4gIHJldHVybiByZXRJZDtcbn1cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoaWQpIHtcbiAgLy8gSW5uZXIgaWQgZm9yIGFjY2Vzc2liaWxpdHkgdXNhZ2UuIE9ubHkgd29yayBpbiBjbGllbnQgc2lkZVxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBpbm5lcklkID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRJbm5lcklkID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzZXRJbm5lcklkKFwicmNfcHJvZ3Jlc3NfXCIuY29uY2F0KGdldFVVSUQoKSkpO1xuICB9LCBbXSk7XG4gIHJldHVybiBpZCB8fCBpbm5lcklkO1xufSk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcImlkXCIsIFwicHJlZml4Q2xzXCIsIFwic3RlcHNcIiwgXCJzdHJva2VXaWR0aFwiLCBcInRyYWlsV2lkdGhcIiwgXCJnYXBEZWdyZWVcIiwgXCJnYXBQb3NpdGlvblwiLCBcInRyYWlsQ29sb3JcIiwgXCJzdHJva2VMaW5lY2FwXCIsIFwic3R5bGVcIiwgXCJjbGFzc05hbWVcIiwgXCJzdHJva2VDb2xvclwiLCBcInBlcmNlbnRcIl07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IGRlZmF1bHRQcm9wcywgdXNlVHJhbnNpdGlvbkR1cmF0aW9uIH0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHVzZUlkIGZyb20gJy4vaG9va3MvdXNlSWQnO1xuZnVuY3Rpb24gc3RyaXBQZXJjZW50VG9OdW1iZXIocGVyY2VudCkge1xuICByZXR1cm4gK3BlcmNlbnQucmVwbGFjZSgnJScsICcnKTtcbn1cbmZ1bmN0aW9uIHRvQXJyYXkodmFsdWUpIHtcbiAgdmFyIG1lcmdlZFZhbHVlID0gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCA/IHZhbHVlIDogW107XG4gIHJldHVybiBBcnJheS5pc0FycmF5KG1lcmdlZFZhbHVlKSA/IG1lcmdlZFZhbHVlIDogW21lcmdlZFZhbHVlXTtcbn1cbnZhciBWSUVXX0JPWF9TSVpFID0gMTAwO1xudmFyIGdldENpcmNsZVN0eWxlID0gZnVuY3Rpb24gZ2V0Q2lyY2xlU3R5bGUocGVyaW1ldGVyLCBwZXJpbWV0ZXJXaXRob3V0R2FwLCBvZmZzZXQsIHBlcmNlbnQsIHJvdGF0ZURlZywgZ2FwRGVncmVlLCBnYXBQb3NpdGlvbiwgc3Ryb2tlQ29sb3IsIHN0cm9rZUxpbmVjYXAsIHN0cm9rZVdpZHRoKSB7XG4gIHZhciBzdGVwU3BhY2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMTAgJiYgYXJndW1lbnRzWzEwXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzEwXSA6IDA7XG4gIHZhciBvZmZzZXREZWcgPSBvZmZzZXQgLyAxMDAgKiAzNjAgKiAoKDM2MCAtIGdhcERlZ3JlZSkgLyAzNjApO1xuICB2YXIgcG9zaXRpb25EZWcgPSBnYXBEZWdyZWUgPT09IDAgPyAwIDoge1xuICAgIGJvdHRvbTogMCxcbiAgICB0b3A6IDE4MCxcbiAgICBsZWZ0OiA5MCxcbiAgICByaWdodDogLTkwXG4gIH1bZ2FwUG9zaXRpb25dO1xuICB2YXIgc3Ryb2tlRGFzaG9mZnNldCA9ICgxMDAgLSBwZXJjZW50KSAvIDEwMCAqIHBlcmltZXRlcldpdGhvdXRHYXA7XG4gIC8vIEZpeCBwZXJjZW50IGFjY3VyYWN5IHdoZW4gc3Ryb2tlTGluZWNhcCBpcyByb3VuZFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8zNTAwOVxuICBpZiAoc3Ryb2tlTGluZWNhcCA9PT0gJ3JvdW5kJyAmJiBwZXJjZW50ICE9PSAxMDApIHtcbiAgICBzdHJva2VEYXNob2Zmc2V0ICs9IHN0cm9rZVdpZHRoIC8gMjtcbiAgICAvLyB3aGVuIHBlcmNlbnQgaXMgc21hbGwgZW5vdWdoICg8PSAxJSksIGtlZXAgc21hbGxlc3QgdmFsdWUgdG8gYXZvaWQgaXQncyBkaXNhcHBlYXJhbmNlXG4gICAgaWYgKHN0cm9rZURhc2hvZmZzZXQgPj0gcGVyaW1ldGVyV2l0aG91dEdhcCkge1xuICAgICAgc3Ryb2tlRGFzaG9mZnNldCA9IHBlcmltZXRlcldpdGhvdXRHYXAgLSAwLjAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIHN0cm9rZTogdHlwZW9mIHN0cm9rZUNvbG9yID09PSAnc3RyaW5nJyA/IHN0cm9rZUNvbG9yIDogdW5kZWZpbmVkLFxuICAgIHN0cm9rZURhc2hhcnJheTogXCJcIi5jb25jYXQocGVyaW1ldGVyV2l0aG91dEdhcCwgXCJweCBcIikuY29uY2F0KHBlcmltZXRlciksXG4gICAgc3Ryb2tlRGFzaG9mZnNldDogc3Ryb2tlRGFzaG9mZnNldCArIHN0ZXBTcGFjZSxcbiAgICB0cmFuc2Zvcm06IFwicm90YXRlKFwiLmNvbmNhdChyb3RhdGVEZWcgKyBvZmZzZXREZWcgKyBwb3NpdGlvbkRlZywgXCJkZWcpXCIpLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAgMCcsXG4gICAgdHJhbnNpdGlvbjogJ3N0cm9rZS1kYXNob2Zmc2V0IC4zcyBlYXNlIDBzLCBzdHJva2UtZGFzaGFycmF5IC4zcyBlYXNlIDBzLCBzdHJva2UgLjNzLCBzdHJva2Utd2lkdGggLjA2cyBlYXNlIC4zcywgb3BhY2l0eSAuM3MgZWFzZSAwcycsXG4gICAgZmlsbE9wYWNpdHk6IDBcbiAgfTtcbn07XG52YXIgQ2lyY2xlID0gZnVuY3Rpb24gQ2lyY2xlKF9yZWYpIHtcbiAgdmFyIGlkID0gX3JlZi5pZCxcbiAgICBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICBzdGVwcyA9IF9yZWYuc3RlcHMsXG4gICAgc3Ryb2tlV2lkdGggPSBfcmVmLnN0cm9rZVdpZHRoLFxuICAgIHRyYWlsV2lkdGggPSBfcmVmLnRyYWlsV2lkdGgsXG4gICAgX3JlZiRnYXBEZWdyZWUgPSBfcmVmLmdhcERlZ3JlZSxcbiAgICBnYXBEZWdyZWUgPSBfcmVmJGdhcERlZ3JlZSA9PT0gdm9pZCAwID8gMCA6IF9yZWYkZ2FwRGVncmVlLFxuICAgIGdhcFBvc2l0aW9uID0gX3JlZi5nYXBQb3NpdGlvbixcbiAgICB0cmFpbENvbG9yID0gX3JlZi50cmFpbENvbG9yLFxuICAgIHN0cm9rZUxpbmVjYXAgPSBfcmVmLnN0cm9rZUxpbmVjYXAsXG4gICAgc3R5bGUgPSBfcmVmLnN0eWxlLFxuICAgIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgIHN0cm9rZUNvbG9yID0gX3JlZi5zdHJva2VDb2xvcixcbiAgICBwZXJjZW50ID0gX3JlZi5wZXJjZW50LFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuICB2YXIgbWVyZ2VkSWQgPSB1c2VJZChpZCk7XG4gIHZhciBncmFkaWVudElkID0gXCJcIi5jb25jYXQobWVyZ2VkSWQsIFwiLWdyYWRpZW50XCIpO1xuICB2YXIgcmFkaXVzID0gVklFV19CT1hfU0laRSAvIDIgLSBzdHJva2VXaWR0aCAvIDI7XG4gIHZhciBwZXJpbWV0ZXIgPSBNYXRoLlBJICogMiAqIHJhZGl1cztcbiAgdmFyIHJvdGF0ZURlZyA9IGdhcERlZ3JlZSA+IDAgPyA5MCArIGdhcERlZ3JlZSAvIDIgOiAtOTA7XG4gIHZhciBwZXJpbWV0ZXJXaXRob3V0R2FwID0gcGVyaW1ldGVyICogKCgzNjAgLSBnYXBEZWdyZWUpIC8gMzYwKTtcbiAgdmFyIF9yZWYyID0gX3R5cGVvZihzdGVwcykgPT09ICdvYmplY3QnID8gc3RlcHMgOiB7XG4gICAgICBjb3VudDogc3RlcHMsXG4gICAgICBzcGFjZTogMlxuICAgIH0sXG4gICAgc3RlcENvdW50ID0gX3JlZjIuY291bnQsXG4gICAgc3RlcFNwYWNlID0gX3JlZjIuc3BhY2U7XG4gIHZhciBjaXJjbGVTdHlsZSA9IGdldENpcmNsZVN0eWxlKHBlcmltZXRlciwgcGVyaW1ldGVyV2l0aG91dEdhcCwgMCwgMTAwLCByb3RhdGVEZWcsIGdhcERlZ3JlZSwgZ2FwUG9zaXRpb24sIHRyYWlsQ29sb3IsIHN0cm9rZUxpbmVjYXAsIHN0cm9rZVdpZHRoKTtcbiAgdmFyIHBlcmNlbnRMaXN0ID0gdG9BcnJheShwZXJjZW50KTtcbiAgdmFyIHN0cm9rZUNvbG9yTGlzdCA9IHRvQXJyYXkoc3Ryb2tlQ29sb3IpO1xuICB2YXIgZ3JhZGllbnQgPSBzdHJva2VDb2xvckxpc3QuZmluZChmdW5jdGlvbiAoY29sb3IpIHtcbiAgICByZXR1cm4gY29sb3IgJiYgX3R5cGVvZihjb2xvcikgPT09ICdvYmplY3QnO1xuICB9KTtcbiAgdmFyIHBhdGhzID0gdXNlVHJhbnNpdGlvbkR1cmF0aW9uKCk7XG4gIHZhciBnZXRTdG9rZUxpc3QgPSBmdW5jdGlvbiBnZXRTdG9rZUxpc3QoKSB7XG4gICAgdmFyIHN0YWNrUHRnID0gMDtcbiAgICByZXR1cm4gcGVyY2VudExpc3QubWFwKGZ1bmN0aW9uIChwdGcsIGluZGV4KSB7XG4gICAgICB2YXIgY29sb3IgPSBzdHJva2VDb2xvckxpc3RbaW5kZXhdIHx8IHN0cm9rZUNvbG9yTGlzdFtzdHJva2VDb2xvckxpc3QubGVuZ3RoIC0gMV07XG4gICAgICB2YXIgc3Ryb2tlID0gY29sb3IgJiYgX3R5cGVvZihjb2xvcikgPT09ICdvYmplY3QnID8gXCJ1cmwoI1wiLmNvbmNhdChncmFkaWVudElkLCBcIilcIikgOiB1bmRlZmluZWQ7XG4gICAgICB2YXIgY2lyY2xlU3R5bGVGb3JTdGFjayA9IGdldENpcmNsZVN0eWxlKHBlcmltZXRlciwgcGVyaW1ldGVyV2l0aG91dEdhcCwgc3RhY2tQdGcsIHB0Zywgcm90YXRlRGVnLCBnYXBEZWdyZWUsIGdhcFBvc2l0aW9uLCBjb2xvciwgc3Ryb2tlTGluZWNhcCwgc3Ryb2tlV2lkdGgpO1xuICAgICAgc3RhY2tQdGcgKz0gcHRnO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiY2lyY2xlXCIsIHtcbiAgICAgICAga2V5OiBpbmRleCxcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNpcmNsZS1wYXRoXCIpLFxuICAgICAgICByOiByYWRpdXMsXG4gICAgICAgIGN4OiAwLFxuICAgICAgICBjeTogMCxcbiAgICAgICAgc3Ryb2tlOiBzdHJva2UsXG4gICAgICAgIHN0cm9rZUxpbmVjYXA6IHN0cm9rZUxpbmVjYXAsXG4gICAgICAgIHN0cm9rZVdpZHRoOiBzdHJva2VXaWR0aCxcbiAgICAgICAgb3BhY2l0eTogcHRnID09PSAwID8gMCA6IDEsXG4gICAgICAgIHN0eWxlOiBjaXJjbGVTdHlsZUZvclN0YWNrLFxuICAgICAgICByZWY6IGZ1bmN0aW9uIHJlZihlbGVtKSB7XG4gICAgICAgICAgLy8gaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlZnMtYW5kLXRoZS1kb20uaHRtbCNjYWxsYmFjay1yZWZzXG4gICAgICAgICAgLy8gUmVhY3Qgd2lsbCBjYWxsIHRoZSByZWYgY2FsbGJhY2sgd2l0aCB0aGUgRE9NIGVsZW1lbnQgd2hlbiB0aGUgY29tcG9uZW50IG1vdW50cyxcbiAgICAgICAgICAvLyBhbmQgY2FsbCBpdCB3aXRoIGBudWxsYCB3aGVuIGl0IHVubW91bnRzLlxuICAgICAgICAgIC8vIFJlZnMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgdXAtdG8tZGF0ZSBiZWZvcmUgY29tcG9uZW50RGlkTW91bnQgb3IgY29tcG9uZW50RGlkVXBkYXRlIGZpcmVzLlxuICAgICAgICAgIHBhdGhzW2luZGV4XSA9IGVsZW07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pLnJldmVyc2UoKTtcbiAgfTtcbiAgdmFyIGdldFN0ZXBTdG9rZUxpc3QgPSBmdW5jdGlvbiBnZXRTdGVwU3Rva2VMaXN0KCkge1xuICAgIC8vIG9ubHkgc2hvdyB0aGUgZmlyc3QgcGVyY2VudCB3aGVuIHBhc3Mgc3RlcHNcbiAgICB2YXIgY3VycmVudCA9IE1hdGgucm91bmQoc3RlcENvdW50ICogKHBlcmNlbnRMaXN0WzBdIC8gMTAwKSk7XG4gICAgdmFyIHN0ZXBQdGcgPSAxMDAgLyBzdGVwQ291bnQ7XG4gICAgdmFyIHN0YWNrUHRnID0gMDtcbiAgICByZXR1cm4gbmV3IEFycmF5KHN0ZXBDb3VudCkuZmlsbChudWxsKS5tYXAoZnVuY3Rpb24gKF8sIGluZGV4KSB7XG4gICAgICB2YXIgY29sb3IgPSBpbmRleCA8PSBjdXJyZW50IC0gMSA/IHN0cm9rZUNvbG9yTGlzdFswXSA6IHRyYWlsQ29sb3I7XG4gICAgICB2YXIgc3Ryb2tlID0gY29sb3IgJiYgX3R5cGVvZihjb2xvcikgPT09ICdvYmplY3QnID8gXCJ1cmwoI1wiLmNvbmNhdChncmFkaWVudElkLCBcIilcIikgOiB1bmRlZmluZWQ7XG4gICAgICB2YXIgY2lyY2xlU3R5bGVGb3JTdGFjayA9IGdldENpcmNsZVN0eWxlKHBlcmltZXRlciwgcGVyaW1ldGVyV2l0aG91dEdhcCwgc3RhY2tQdGcsIHN0ZXBQdGcsIHJvdGF0ZURlZywgZ2FwRGVncmVlLCBnYXBQb3NpdGlvbiwgY29sb3IsICdidXR0Jywgc3Ryb2tlV2lkdGgsIHN0ZXBTcGFjZSk7XG4gICAgICBzdGFja1B0ZyArPSAocGVyaW1ldGVyV2l0aG91dEdhcCAtIGNpcmNsZVN0eWxlRm9yU3RhY2suc3Ryb2tlRGFzaG9mZnNldCArIHN0ZXBTcGFjZSkgKiAxMDAgLyBwZXJpbWV0ZXJXaXRob3V0R2FwO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiY2lyY2xlXCIsIHtcbiAgICAgICAga2V5OiBpbmRleCxcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNpcmNsZS1wYXRoXCIpLFxuICAgICAgICByOiByYWRpdXMsXG4gICAgICAgIGN4OiAwLFxuICAgICAgICBjeTogMCxcbiAgICAgICAgc3Ryb2tlOiBzdHJva2VcbiAgICAgICAgLy8gc3Ryb2tlTGluZWNhcD17c3Ryb2tlTGluZWNhcH1cbiAgICAgICAgLFxuICAgICAgICBzdHJva2VXaWR0aDogc3Ryb2tlV2lkdGgsXG4gICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgIHN0eWxlOiBjaXJjbGVTdHlsZUZvclN0YWNrLFxuICAgICAgICByZWY6IGZ1bmN0aW9uIHJlZihlbGVtKSB7XG4gICAgICAgICAgcGF0aHNbaW5kZXhdID0gZWxlbTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2lyY2xlXCIpLCBjbGFzc05hbWUpLFxuICAgIHZpZXdCb3g6IFwiXCIuY29uY2F0KC1WSUVXX0JPWF9TSVpFIC8gMiwgXCIgXCIpLmNvbmNhdCgtVklFV19CT1hfU0laRSAvIDIsIFwiIFwiKS5jb25jYXQoVklFV19CT1hfU0laRSwgXCIgXCIpLmNvbmNhdChWSUVXX0JPWF9TSVpFKSxcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgaWQ6IGlkLFxuICAgIHJvbGU6IFwicHJlc2VudGF0aW9uXCJcbiAgfSwgcmVzdFByb3BzKSwgZ3JhZGllbnQgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkZWZzXCIsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwibGluZWFyR3JhZGllbnRcIiwge1xuICAgIGlkOiBncmFkaWVudElkLFxuICAgIHgxOiBcIjEwMCVcIixcbiAgICB5MTogXCIwJVwiLFxuICAgIHgyOiBcIjAlXCIsXG4gICAgeTI6IFwiMCVcIlxuICB9LCBPYmplY3Qua2V5cyhncmFkaWVudCkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBzdHJpcFBlcmNlbnRUb051bWJlcihhKSAtIHN0cmlwUGVyY2VudFRvTnVtYmVyKGIpO1xuICB9KS5tYXAoZnVuY3Rpb24gKGtleSwgaW5kZXgpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdG9wXCIsIHtcbiAgICAgIGtleTogaW5kZXgsXG4gICAgICBvZmZzZXQ6IGtleSxcbiAgICAgIHN0b3BDb2xvcjogZ3JhZGllbnRba2V5XVxuICAgIH0pO1xuICB9KSkpLCAhc3RlcENvdW50ICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiY2lyY2xlXCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2lyY2xlLXRyYWlsXCIpLFxuICAgIHI6IHJhZGl1cyxcbiAgICBjeDogMCxcbiAgICBjeTogMCxcbiAgICBzdHJva2U6IHRyYWlsQ29sb3IsXG4gICAgc3Ryb2tlTGluZWNhcDogc3Ryb2tlTGluZWNhcCxcbiAgICBzdHJva2VXaWR0aDogdHJhaWxXaWR0aCB8fCBzdHJva2VXaWR0aCxcbiAgICBzdHlsZTogY2lyY2xlU3R5bGVcbiAgfSksIHN0ZXBDb3VudCA/IGdldFN0ZXBTdG9rZUxpc3QoKSA6IGdldFN0b2tlTGlzdCgpKTtcbn07XG5DaXJjbGUuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuQ2lyY2xlLmRpc3BsYXlOYW1lID0gJ0NpcmNsZSc7XG5leHBvcnQgZGVmYXVsdCBDaXJjbGU7IiwiaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi4vX3V0aWwvd2FybmluZyc7XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRQcm9ncmVzcyhwcm9ncmVzcykge1xuICBpZiAoIXByb2dyZXNzIHx8IHByb2dyZXNzIDwgMCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGlmIChwcm9ncmVzcyA+IDEwMCkge1xuICAgIHJldHVybiAxMDA7XG4gIH1cbiAgcmV0dXJuIHByb2dyZXNzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFN1Y2Nlc3NQZXJjZW50KF9yZWYpIHtcbiAgdmFyIHN1Y2Nlc3MgPSBfcmVmLnN1Y2Nlc3MsXG4gICAgc3VjY2Vzc1BlcmNlbnQgPSBfcmVmLnN1Y2Nlc3NQZXJjZW50O1xuICB2YXIgcGVyY2VudCA9IHN1Y2Nlc3NQZXJjZW50O1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBwZXJjZW50YCBpbnN0ZWFkICovXG4gIGlmIChzdWNjZXNzICYmICdwcm9ncmVzcycgaW4gc3VjY2Vzcykge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoZmFsc2UsICdQcm9ncmVzcycsICdgc3VjY2Vzcy5wcm9ncmVzc2AgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBgc3VjY2Vzcy5wZXJjZW50YCBpbnN0ZWFkLicpIDogdm9pZCAwO1xuICAgIHBlcmNlbnQgPSBzdWNjZXNzLnByb2dyZXNzO1xuICB9XG4gIGlmIChzdWNjZXNzICYmICdwZXJjZW50JyBpbiBzdWNjZXNzKSB7XG4gICAgcGVyY2VudCA9IHN1Y2Nlc3MucGVyY2VudDtcbiAgfVxuICByZXR1cm4gcGVyY2VudDtcbn0iLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IHsgcHJlc2V0UHJpbWFyeUNvbG9ycyB9IGZyb20gJ0BhbnQtZGVzaWduL2NvbG9ycyc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IENpcmNsZSBhcyBSQ0NpcmNsZSB9IGZyb20gJ3JjLXByb2dyZXNzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdldFN1Y2Nlc3NQZXJjZW50LCB2YWxpZFByb2dyZXNzIH0gZnJvbSAnLi91dGlscyc7XG5mdW5jdGlvbiBnZXRQZXJjZW50YWdlKF9yZWYpIHtcbiAgdmFyIHBlcmNlbnQgPSBfcmVmLnBlcmNlbnQsXG4gICAgc3VjY2VzcyA9IF9yZWYuc3VjY2VzcyxcbiAgICBzdWNjZXNzUGVyY2VudCA9IF9yZWYuc3VjY2Vzc1BlcmNlbnQ7XG4gIHZhciByZWFsU3VjY2Vzc1BlcmNlbnQgPSB2YWxpZFByb2dyZXNzKGdldFN1Y2Nlc3NQZXJjZW50KHtcbiAgICBzdWNjZXNzOiBzdWNjZXNzLFxuICAgIHN1Y2Nlc3NQZXJjZW50OiBzdWNjZXNzUGVyY2VudFxuICB9KSk7XG4gIHJldHVybiBbcmVhbFN1Y2Nlc3NQZXJjZW50LCB2YWxpZFByb2dyZXNzKHZhbGlkUHJvZ3Jlc3MocGVyY2VudCkgLSByZWFsU3VjY2Vzc1BlcmNlbnQpXTtcbn1cbmZ1bmN0aW9uIGdldFN0cm9rZUNvbG9yKF9yZWYyKSB7XG4gIHZhciBfcmVmMiRzdWNjZXNzID0gX3JlZjIuc3VjY2VzcyxcbiAgICBzdWNjZXNzID0gX3JlZjIkc3VjY2VzcyA9PT0gdm9pZCAwID8ge30gOiBfcmVmMiRzdWNjZXNzLFxuICAgIHN0cm9rZUNvbG9yID0gX3JlZjIuc3Ryb2tlQ29sb3I7XG4gIHZhciBzdWNjZXNzQ29sb3IgPSBzdWNjZXNzLnN0cm9rZUNvbG9yO1xuICByZXR1cm4gW3N1Y2Nlc3NDb2xvciB8fCBwcmVzZXRQcmltYXJ5Q29sb3JzLmdyZWVuLCBzdHJva2VDb2xvciB8fCBudWxsXTtcbn1cbnZhciBDaXJjbGUgPSBmdW5jdGlvbiBDaXJjbGUocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICB3aWR0aCA9IHByb3BzLndpZHRoLFxuICAgIHN0cm9rZVdpZHRoID0gcHJvcHMuc3Ryb2tlV2lkdGgsXG4gICAgX3Byb3BzJHRyYWlsQ29sb3IgPSBwcm9wcy50cmFpbENvbG9yLFxuICAgIHRyYWlsQ29sb3IgPSBfcHJvcHMkdHJhaWxDb2xvciA9PT0gdm9pZCAwID8gbnVsbCA6IF9wcm9wcyR0cmFpbENvbG9yLFxuICAgIF9wcm9wcyRzdHJva2VMaW5lY2FwID0gcHJvcHMuc3Ryb2tlTGluZWNhcCxcbiAgICBzdHJva2VMaW5lY2FwID0gX3Byb3BzJHN0cm9rZUxpbmVjYXAgPT09IHZvaWQgMCA/ICdyb3VuZCcgOiBfcHJvcHMkc3Ryb2tlTGluZWNhcCxcbiAgICBnYXBQb3NpdGlvbiA9IHByb3BzLmdhcFBvc2l0aW9uLFxuICAgIGdhcERlZ3JlZSA9IHByb3BzLmdhcERlZ3JlZSxcbiAgICB0eXBlID0gcHJvcHMudHlwZSxcbiAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIHN1Y2Nlc3MgPSBwcm9wcy5zdWNjZXNzO1xuICB2YXIgY2lyY2xlU2l6ZSA9IHdpZHRoIHx8IDEyMDtcbiAgdmFyIGNpcmNsZVN0eWxlID0ge1xuICAgIHdpZHRoOiBjaXJjbGVTaXplLFxuICAgIGhlaWdodDogY2lyY2xlU2l6ZSxcbiAgICBmb250U2l6ZTogY2lyY2xlU2l6ZSAqIDAuMTUgKyA2XG4gIH07XG4gIHZhciBjaXJjbGVXaWR0aCA9IHN0cm9rZVdpZHRoIHx8IDY7XG4gIHZhciBnYXBQb3MgPSBnYXBQb3NpdGlvbiB8fCB0eXBlID09PSAnZGFzaGJvYXJkJyAmJiAnYm90dG9tJyB8fCB1bmRlZmluZWQ7XG4gIHZhciBnZXRHYXBEZWdyZWUgPSBmdW5jdGlvbiBnZXRHYXBEZWdyZWUoKSB7XG4gICAgLy8gU3VwcG9ydCBnYXBEZWcgPSAwIHdoZW4gdHlwZSA9ICdkYXNoYm9hcmQnXG4gICAgaWYgKGdhcERlZ3JlZSB8fCBnYXBEZWdyZWUgPT09IDApIHtcbiAgICAgIHJldHVybiBnYXBEZWdyZWU7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnZGFzaGJvYXJkJykge1xuICAgICAgcmV0dXJuIDc1O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9O1xuICAvLyB1c2luZyBjbGFzc05hbWUgdG8gc3R5bGUgc3Ryb2tlIGNvbG9yXG4gIHZhciBpc0dyYWRpZW50ID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHByb3BzLnN0cm9rZUNvbG9yKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG4gIHZhciBzdHJva2VDb2xvciA9IGdldFN0cm9rZUNvbG9yKHtcbiAgICBzdWNjZXNzOiBzdWNjZXNzLFxuICAgIHN0cm9rZUNvbG9yOiBwcm9wcy5zdHJva2VDb2xvclxuICB9KTtcbiAgdmFyIHdyYXBwZXJDbGFzc05hbWUgPSBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5uZXJcIiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jaXJjbGUtZ3JhZGllbnRcIiksIGlzR3JhZGllbnQpKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IHdyYXBwZXJDbGFzc05hbWUsXG4gICAgc3R5bGU6IGNpcmNsZVN0eWxlXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJDQ2lyY2xlLCB7XG4gICAgcGVyY2VudDogZ2V0UGVyY2VudGFnZShwcm9wcyksXG4gICAgc3Ryb2tlV2lkdGg6IGNpcmNsZVdpZHRoLFxuICAgIHRyYWlsV2lkdGg6IGNpcmNsZVdpZHRoLFxuICAgIHN0cm9rZUNvbG9yOiBzdHJva2VDb2xvcixcbiAgICBzdHJva2VMaW5lY2FwOiBzdHJva2VMaW5lY2FwLFxuICAgIHRyYWlsQ29sb3I6IHRyYWlsQ29sb3IsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgZ2FwRGVncmVlOiBnZXRHYXBEZWdyZWUoKSxcbiAgICBnYXBQb3NpdGlvbjogZ2FwUG9zXG4gIH0pLCBjaGlsZHJlbik7XG59O1xuZXhwb3J0IGRlZmF1bHQgQ2lyY2xlOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCB7IHByZXNldFByaW1hcnlDb2xvcnMgfSBmcm9tICdAYW50LWRlc2lnbi9jb2xvcnMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0U3VjY2Vzc1BlcmNlbnQsIHZhbGlkUHJvZ3Jlc3MgfSBmcm9tICcuL3V0aWxzJztcbi8qKlxuICogQGV4YW1wbGVcbiAqICAge1xuICogICAgIFwiMCVcIjogXCIjYWZjMTYzXCIsXG4gKiAgICAgXCI3NSVcIjogXCIjMDA5OTAwXCIsXG4gKiAgICAgXCI1MCVcIjogXCJncmVlblwiLCAvLyA9PT09PiAnI2FmYzE2MyAwJSwgIzY2RkYwMCAyNSUsICMwMENDMDAgNTAlLCAjMDA5OTAwIDc1JSwgI2ZmZmZmZiAxMDAlJ1xuICogICAgIFwiMjUlXCI6IFwiIzY2RkYwMFwiLFxuICogICAgIFwiMTAwJVwiOiBcIiNmZmZmZmZcIlxuICogICB9XG4gKi9cbmV4cG9ydCB2YXIgc29ydEdyYWRpZW50ID0gZnVuY3Rpb24gc29ydEdyYWRpZW50KGdyYWRpZW50cykge1xuICB2YXIgdGVtcEFyciA9IFtdO1xuICBPYmplY3Qua2V5cyhncmFkaWVudHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBmb3JtYXR0ZWRLZXkgPSBwYXJzZUZsb2F0KGtleS5yZXBsYWNlKC8lL2csICcnKSk7XG4gICAgaWYgKCFpc05hTihmb3JtYXR0ZWRLZXkpKSB7XG4gICAgICB0ZW1wQXJyLnB1c2goe1xuICAgICAgICBrZXk6IGZvcm1hdHRlZEtleSxcbiAgICAgICAgdmFsdWU6IGdyYWRpZW50c1trZXldXG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICB0ZW1wQXJyID0gdGVtcEFyci5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGEua2V5IC0gYi5rZXk7XG4gIH0pO1xuICByZXR1cm4gdGVtcEFyci5tYXAoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIga2V5ID0gX3JlZi5rZXksXG4gICAgICB2YWx1ZSA9IF9yZWYudmFsdWU7XG4gICAgcmV0dXJuIFwiXCIuY29uY2F0KHZhbHVlLCBcIiBcIikuY29uY2F0KGtleSwgXCIlXCIpO1xuICB9KS5qb2luKCcsICcpO1xufTtcbi8qKlxuICogVGhlbiB0aGlzIG1hbiBjYW1lIHRvIHJlYWxpemUgdGhlIHRydXRoOiBCZXNpZGVzIHNpeCBwZW5jZSwgdGhlcmUgaXMgdGhlIG1vb24uIEJlc2lkZXMgYnJlYWQgYW5kXG4gKiBidXR0ZXIsIHRoZXJlIGlzIHRoZSBidWcuIEFuZC4uLiBCZXNpZGVzIHdvbWVuLCB0aGVyZSBpcyB0aGUgY29kZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogICB7XG4gKiAgICAgXCIwJVwiOiBcIiNhZmMxNjNcIixcbiAqICAgICBcIjI1JVwiOiBcIiM2NkZGMDBcIixcbiAqICAgICBcIjUwJVwiOiBcIiMwMENDMDBcIiwgLy8gPT09PT4gIGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgI2FmYzE2MyAwJSwgIzY2RkYwMCAyNSUsXG4gKiAgICAgXCI3NSVcIjogXCIjMDA5OTAwXCIsIC8vICAgICAgICAjMDBDQzAwIDUwJSwgIzAwOTkwMCA3NSUsICNmZmZmZmYgMTAwJSlcbiAqICAgICBcIjEwMCVcIjogXCIjZmZmZmZmXCJcbiAqICAgfVxuICovXG5leHBvcnQgdmFyIGhhbmRsZUdyYWRpZW50ID0gZnVuY3Rpb24gaGFuZGxlR3JhZGllbnQoc3Ryb2tlQ29sb3IsIGRpcmVjdGlvbkNvbmZpZykge1xuICB2YXIgX3N0cm9rZUNvbG9yJGZyb20gPSBzdHJva2VDb2xvci5mcm9tLFxuICAgIGZyb20gPSBfc3Ryb2tlQ29sb3IkZnJvbSA9PT0gdm9pZCAwID8gcHJlc2V0UHJpbWFyeUNvbG9ycy5ibHVlIDogX3N0cm9rZUNvbG9yJGZyb20sXG4gICAgX3N0cm9rZUNvbG9yJHRvID0gc3Ryb2tlQ29sb3IudG8sXG4gICAgdG8gPSBfc3Ryb2tlQ29sb3IkdG8gPT09IHZvaWQgMCA/IHByZXNldFByaW1hcnlDb2xvcnMuYmx1ZSA6IF9zdHJva2VDb2xvciR0byxcbiAgICBfc3Ryb2tlQ29sb3IkZGlyZWN0aW8gPSBzdHJva2VDb2xvci5kaXJlY3Rpb24sXG4gICAgZGlyZWN0aW9uID0gX3N0cm9rZUNvbG9yJGRpcmVjdGlvID09PSB2b2lkIDAgPyBkaXJlY3Rpb25Db25maWcgPT09ICdydGwnID8gJ3RvIGxlZnQnIDogJ3RvIHJpZ2h0JyA6IF9zdHJva2VDb2xvciRkaXJlY3RpbyxcbiAgICByZXN0ID0gX19yZXN0KHN0cm9rZUNvbG9yLCBbXCJmcm9tXCIsIFwidG9cIiwgXCJkaXJlY3Rpb25cIl0pO1xuICBpZiAoT2JqZWN0LmtleXMocmVzdCkubGVuZ3RoICE9PSAwKSB7XG4gICAgdmFyIHNvcnRlZEdyYWRpZW50cyA9IHNvcnRHcmFkaWVudChyZXN0KTtcbiAgICByZXR1cm4ge1xuICAgICAgYmFja2dyb3VuZEltYWdlOiBcImxpbmVhci1ncmFkaWVudChcIi5jb25jYXQoZGlyZWN0aW9uLCBcIiwgXCIpLmNvbmNhdChzb3J0ZWRHcmFkaWVudHMsIFwiKVwiKVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBiYWNrZ3JvdW5kSW1hZ2U6IFwibGluZWFyLWdyYWRpZW50KFwiLmNvbmNhdChkaXJlY3Rpb24sIFwiLCBcIikuY29uY2F0KGZyb20sIFwiLCBcIikuY29uY2F0KHRvLCBcIilcIilcbiAgfTtcbn07XG52YXIgTGluZSA9IGZ1bmN0aW9uIExpbmUocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBkaXJlY3Rpb25Db25maWcgPSBwcm9wcy5kaXJlY3Rpb24sXG4gICAgcGVyY2VudCA9IHByb3BzLnBlcmNlbnQsXG4gICAgc3Ryb2tlV2lkdGggPSBwcm9wcy5zdHJva2VXaWR0aCxcbiAgICBzaXplID0gcHJvcHMuc2l6ZSxcbiAgICBzdHJva2VDb2xvciA9IHByb3BzLnN0cm9rZUNvbG9yLFxuICAgIF9wcm9wcyRzdHJva2VMaW5lY2FwID0gcHJvcHMuc3Ryb2tlTGluZWNhcCxcbiAgICBzdHJva2VMaW5lY2FwID0gX3Byb3BzJHN0cm9rZUxpbmVjYXAgPT09IHZvaWQgMCA/ICdyb3VuZCcgOiBfcHJvcHMkc3Ryb2tlTGluZWNhcCxcbiAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIF9wcm9wcyR0cmFpbENvbG9yID0gcHJvcHMudHJhaWxDb2xvcixcbiAgICB0cmFpbENvbG9yID0gX3Byb3BzJHRyYWlsQ29sb3IgPT09IHZvaWQgMCA/IG51bGwgOiBfcHJvcHMkdHJhaWxDb2xvcixcbiAgICBzdWNjZXNzID0gcHJvcHMuc3VjY2VzcztcbiAgdmFyIGJhY2tncm91bmRQcm9wcyA9IHN0cm9rZUNvbG9yICYmIHR5cGVvZiBzdHJva2VDb2xvciAhPT0gJ3N0cmluZycgPyBoYW5kbGVHcmFkaWVudChzdHJva2VDb2xvciwgZGlyZWN0aW9uQ29uZmlnKSA6IHtcbiAgICBiYWNrZ3JvdW5kOiBzdHJva2VDb2xvclxuICB9O1xuICB2YXIgYm9yZGVyUmFkaXVzID0gc3Ryb2tlTGluZWNhcCA9PT0gJ3NxdWFyZScgfHwgc3Ryb2tlTGluZWNhcCA9PT0gJ2J1dHQnID8gMCA6IHVuZGVmaW5lZDtcbiAgdmFyIHRyYWlsU3R5bGUgPSB7XG4gICAgYmFja2dyb3VuZENvbG9yOiB0cmFpbENvbG9yIHx8IHVuZGVmaW5lZCxcbiAgICBib3JkZXJSYWRpdXM6IGJvcmRlclJhZGl1c1xuICB9O1xuICB2YXIgcGVyY2VudFN0eWxlID0gX2V4dGVuZHMoe1xuICAgIHdpZHRoOiBcIlwiLmNvbmNhdCh2YWxpZFByb2dyZXNzKHBlcmNlbnQpLCBcIiVcIiksXG4gICAgaGVpZ2h0OiBzdHJva2VXaWR0aCB8fCAoc2l6ZSA9PT0gJ3NtYWxsJyA/IDYgOiA4KSxcbiAgICBib3JkZXJSYWRpdXM6IGJvcmRlclJhZGl1c1xuICB9LCBiYWNrZ3JvdW5kUHJvcHMpO1xuICB2YXIgc3VjY2Vzc1BlcmNlbnQgPSBnZXRTdWNjZXNzUGVyY2VudChwcm9wcyk7XG4gIHZhciBzdWNjZXNzUGVyY2VudFN0eWxlID0ge1xuICAgIHdpZHRoOiBcIlwiLmNvbmNhdCh2YWxpZFByb2dyZXNzKHN1Y2Nlc3NQZXJjZW50KSwgXCIlXCIpLFxuICAgIGhlaWdodDogc3Ryb2tlV2lkdGggfHwgKHNpemUgPT09ICdzbWFsbCcgPyA2IDogOCksXG4gICAgYm9yZGVyUmFkaXVzOiBib3JkZXJSYWRpdXMsXG4gICAgYmFja2dyb3VuZENvbG9yOiBzdWNjZXNzID09PSBudWxsIHx8IHN1Y2Nlc3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN1Y2Nlc3Muc3Ryb2tlQ29sb3JcbiAgfTtcbiAgdmFyIHN1Y2Nlc3NTZWdtZW50ID0gc3VjY2Vzc1BlcmNlbnQgIT09IHVuZGVmaW5lZCA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3VjY2Vzcy1iZ1wiKSxcbiAgICBzdHlsZTogc3VjY2Vzc1BlcmNlbnRTdHlsZVxuICB9KSA6IG51bGw7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1vdXRlclwiKVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWlubmVyXCIpLFxuICAgIHN0eWxlOiB0cmFpbFN0eWxlXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYmdcIiksXG4gICAgc3R5bGU6IHBlcmNlbnRTdHlsZVxuICB9KSwgc3VjY2Vzc1NlZ21lbnQpKSwgY2hpbGRyZW4pO1xufTtcbmV4cG9ydCBkZWZhdWx0IExpbmU7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIFN0ZXBzID0gZnVuY3Rpb24gU3RlcHMocHJvcHMpIHtcbiAgdmFyIHNpemUgPSBwcm9wcy5zaXplLFxuICAgIHN0ZXBzID0gcHJvcHMuc3RlcHMsXG4gICAgX3Byb3BzJHBlcmNlbnQgPSBwcm9wcy5wZXJjZW50LFxuICAgIHBlcmNlbnQgPSBfcHJvcHMkcGVyY2VudCA9PT0gdm9pZCAwID8gMCA6IF9wcm9wcyRwZXJjZW50LFxuICAgIF9wcm9wcyRzdHJva2VXaWR0aCA9IHByb3BzLnN0cm9rZVdpZHRoLFxuICAgIHN0cm9rZVdpZHRoID0gX3Byb3BzJHN0cm9rZVdpZHRoID09PSB2b2lkIDAgPyA4IDogX3Byb3BzJHN0cm9rZVdpZHRoLFxuICAgIHN0cm9rZUNvbG9yID0gcHJvcHMuc3Ryb2tlQ29sb3IsXG4gICAgX3Byb3BzJHRyYWlsQ29sb3IgPSBwcm9wcy50cmFpbENvbG9yLFxuICAgIHRyYWlsQ29sb3IgPSBfcHJvcHMkdHJhaWxDb2xvciA9PT0gdm9pZCAwID8gbnVsbCA6IF9wcm9wcyR0cmFpbENvbG9yLFxuICAgIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuICB2YXIgY3VycmVudCA9IE1hdGgucm91bmQoc3RlcHMgKiAocGVyY2VudCAvIDEwMCkpO1xuICB2YXIgc3RlcFdpZHRoID0gc2l6ZSA9PT0gJ3NtYWxsJyA/IDIgOiAxNDtcbiAgdmFyIHN0eWxlZFN0ZXBzID0gbmV3IEFycmF5KHN0ZXBzKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwczsgaSsrKSB7XG4gICAgdmFyIGNvbG9yID0gQXJyYXkuaXNBcnJheShzdHJva2VDb2xvcikgPyBzdHJva2VDb2xvcltpXSA6IHN0cm9rZUNvbG9yO1xuICAgIHN0eWxlZFN0ZXBzW2ldID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAga2V5OiBpLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3RlcHMtaXRlbVwiKSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN0ZXBzLWl0ZW0tYWN0aXZlXCIpLCBpIDw9IGN1cnJlbnQgLSAxKSksXG4gICAgICBzdHlsZToge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGkgPD0gY3VycmVudCAtIDEgPyBjb2xvciA6IHRyYWlsQ29sb3IsXG4gICAgICAgIHdpZHRoOiBzdGVwV2lkdGgsXG4gICAgICAgIGhlaWdodDogc3Ryb2tlV2lkdGhcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zdGVwcy1vdXRlclwiKVxuICB9LCBzdHlsZWRTdGVwcywgY2hpbGRyZW4pO1xufTtcbmV4cG9ydCBkZWZhdWx0IFN0ZXBzOyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgQ2hlY2tDaXJjbGVGaWxsZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0NoZWNrQ2lyY2xlRmlsbGVkXCI7XG5pbXBvcnQgQ2hlY2tPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvQ2hlY2tPdXRsaW5lZFwiO1xuaW1wb3J0IENsb3NlQ2lyY2xlRmlsbGVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9DbG9zZUNpcmNsZUZpbGxlZFwiO1xuaW1wb3J0IENsb3NlT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Nsb3NlT3V0bGluZWRcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IG9taXQgZnJvbSBcInJjLXV0aWwvZXMvb21pdFwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgeyB0dXBsZSB9IGZyb20gJy4uL191dGlsL3R5cGUnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi4vX3V0aWwvd2FybmluZyc7XG5pbXBvcnQgQ2lyY2xlIGZyb20gJy4vQ2lyY2xlJztcbmltcG9ydCBMaW5lIGZyb20gJy4vTGluZSc7XG5pbXBvcnQgU3RlcHMgZnJvbSAnLi9TdGVwcyc7XG5pbXBvcnQgeyBnZXRTdWNjZXNzUGVyY2VudCwgdmFsaWRQcm9ncmVzcyB9IGZyb20gJy4vdXRpbHMnO1xudmFyIFByb2dyZXNzVHlwZXMgPSB0dXBsZSgnbGluZScsICdjaXJjbGUnLCAnZGFzaGJvYXJkJyk7XG52YXIgUHJvZ3Jlc3NTdGF0dXNlcyA9IHR1cGxlKCdub3JtYWwnLCAnZXhjZXB0aW9uJywgJ2FjdGl2ZScsICdzdWNjZXNzJyk7XG52YXIgUHJvZ3Jlc3MgPSBmdW5jdGlvbiBQcm9ncmVzcyhwcm9wcykge1xuICB2YXIgX2NsYXNzTmFtZXM7XG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIHN0ZXBzID0gcHJvcHMuc3RlcHMsXG4gICAgc3Ryb2tlQ29sb3IgPSBwcm9wcy5zdHJva2VDb2xvcixcbiAgICBfcHJvcHMkcGVyY2VudCA9IHByb3BzLnBlcmNlbnQsXG4gICAgcGVyY2VudCA9IF9wcm9wcyRwZXJjZW50ID09PSB2b2lkIDAgPyAwIDogX3Byb3BzJHBlcmNlbnQsXG4gICAgX3Byb3BzJHNpemUgPSBwcm9wcy5zaXplLFxuICAgIHNpemUgPSBfcHJvcHMkc2l6ZSA9PT0gdm9pZCAwID8gJ2RlZmF1bHQnIDogX3Byb3BzJHNpemUsXG4gICAgX3Byb3BzJHNob3dJbmZvID0gcHJvcHMuc2hvd0luZm8sXG4gICAgc2hvd0luZm8gPSBfcHJvcHMkc2hvd0luZm8gPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkc2hvd0luZm8sXG4gICAgX3Byb3BzJHR5cGUgPSBwcm9wcy50eXBlLFxuICAgIHR5cGUgPSBfcHJvcHMkdHlwZSA9PT0gdm9pZCAwID8gJ2xpbmUnIDogX3Byb3BzJHR5cGUsXG4gICAgcmVzdFByb3BzID0gX19yZXN0KHByb3BzLCBbXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJzdGVwc1wiLCBcInN0cm9rZUNvbG9yXCIsIFwicGVyY2VudFwiLCBcInNpemVcIiwgXCJzaG93SW5mb1wiLCBcInR5cGVcIl0pO1xuICBmdW5jdGlvbiBnZXRQZXJjZW50TnVtYmVyKCkge1xuICAgIHZhciBzdWNjZXNzUGVyY2VudCA9IGdldFN1Y2Nlc3NQZXJjZW50KHByb3BzKTtcbiAgICByZXR1cm4gcGFyc2VJbnQoc3VjY2Vzc1BlcmNlbnQgIT09IHVuZGVmaW5lZCA/IHN1Y2Nlc3NQZXJjZW50LnRvU3RyaW5nKCkgOiBwZXJjZW50LnRvU3RyaW5nKCksIDEwKTtcbiAgfVxuICBmdW5jdGlvbiBnZXRQcm9ncmVzc1N0YXR1cygpIHtcbiAgICB2YXIgc3RhdHVzID0gcHJvcHMuc3RhdHVzO1xuICAgIGlmICghUHJvZ3Jlc3NTdGF0dXNlcy5pbmNsdWRlcyhzdGF0dXMpICYmIGdldFBlcmNlbnROdW1iZXIoKSA+PSAxMDApIHtcbiAgICAgIHJldHVybiAnc3VjY2Vzcyc7XG4gICAgfVxuICAgIHJldHVybiBzdGF0dXMgfHwgJ25vcm1hbCc7XG4gIH1cbiAgZnVuY3Rpb24gcmVuZGVyUHJvY2Vzc0luZm8ocHJlZml4Q2xzLCBwcm9ncmVzc1N0YXR1cykge1xuICAgIHZhciBmb3JtYXQgPSBwcm9wcy5mb3JtYXQ7XG4gICAgdmFyIHN1Y2Nlc3NQZXJjZW50ID0gZ2V0U3VjY2Vzc1BlcmNlbnQocHJvcHMpO1xuICAgIGlmICghc2hvd0luZm8pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgdGV4dDtcbiAgICB2YXIgdGV4dEZvcm1hdHRlciA9IGZvcm1hdCB8fCBmdW5jdGlvbiAocGVyY2VudE51bWJlcikge1xuICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KHBlcmNlbnROdW1iZXIsIFwiJVwiKTtcbiAgICB9O1xuICAgIHZhciBpc0xpbmVUeXBlID0gdHlwZSA9PT0gJ2xpbmUnO1xuICAgIGlmIChmb3JtYXQgfHwgcHJvZ3Jlc3NTdGF0dXMgIT09ICdleGNlcHRpb24nICYmIHByb2dyZXNzU3RhdHVzICE9PSAnc3VjY2VzcycpIHtcbiAgICAgIHRleHQgPSB0ZXh0Rm9ybWF0dGVyKHZhbGlkUHJvZ3Jlc3MocGVyY2VudCksIHZhbGlkUHJvZ3Jlc3Moc3VjY2Vzc1BlcmNlbnQpKTtcbiAgICB9IGVsc2UgaWYgKHByb2dyZXNzU3RhdHVzID09PSAnZXhjZXB0aW9uJykge1xuICAgICAgdGV4dCA9IGlzTGluZVR5cGUgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDbG9zZUNpcmNsZUZpbGxlZCwgbnVsbCkgOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDbG9zZU91dGxpbmVkLCBudWxsKTtcbiAgICB9IGVsc2UgaWYgKHByb2dyZXNzU3RhdHVzID09PSAnc3VjY2VzcycpIHtcbiAgICAgIHRleHQgPSBpc0xpbmVUeXBlID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hlY2tDaXJjbGVGaWxsZWQsIG51bGwpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hlY2tPdXRsaW5lZCwgbnVsbCk7XG4gICAgfVxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRleHRcIiksXG4gICAgICB0aXRsZTogdHlwZW9mIHRleHQgPT09ICdzdHJpbmcnID8gdGV4dCA6IHVuZGVmaW5lZFxuICAgIH0sIHRleHQpO1xuICB9XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoQ29uZmlnQ29udGV4dCksXG4gICAgZ2V0UHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UHJlZml4Q2xzLFxuICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygncHJvZ3Jlc3MnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgcHJvZ3Jlc3NTdGF0dXMgPSBnZXRQcm9ncmVzc1N0YXR1cygpO1xuICB2YXIgcHJvZ3Jlc3NJbmZvID0gcmVuZGVyUHJvY2Vzc0luZm8ocHJlZml4Q2xzLCBwcm9ncmVzc1N0YXR1cyk7XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoISgnc3VjY2Vzc1BlcmNlbnQnIGluIHByb3BzKSwgJ1Byb2dyZXNzJywgJ2BzdWNjZXNzUGVyY2VudGAgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBgc3VjY2Vzcy5wZXJjZW50YCBpbnN0ZWFkLicpIDogdm9pZCAwO1xuICB2YXIgc3Ryb2tlQ29sb3JOb3RBcnJheSA9IEFycmF5LmlzQXJyYXkoc3Ryb2tlQ29sb3IpID8gc3Ryb2tlQ29sb3JbMF0gOiBzdHJva2VDb2xvcjtcbiAgdmFyIHN0cm9rZUNvbG9yTm90R3JhZGllbnQgPSB0eXBlb2Ygc3Ryb2tlQ29sb3IgPT09ICdzdHJpbmcnIHx8IEFycmF5LmlzQXJyYXkoc3Ryb2tlQ29sb3IpID8gc3Ryb2tlQ29sb3IgOiB1bmRlZmluZWQ7XG4gIHZhciBwcm9ncmVzcztcbiAgLy8gUmVuZGVyIHByb2dyZXNzIHNoYXBlXG4gIGlmICh0eXBlID09PSAnbGluZScpIHtcbiAgICBwcm9ncmVzcyA9IHN0ZXBzID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU3RlcHMsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgICAgc3Ryb2tlQ29sb3I6IHN0cm9rZUNvbG9yTm90R3JhZGllbnQsXG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIHN0ZXBzOiBzdGVwc1xuICAgIH0pLCBwcm9ncmVzc0luZm8pIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGluZSwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgICBzdHJva2VDb2xvcjogc3Ryb2tlQ29sb3JOb3RBcnJheSxcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgZGlyZWN0aW9uOiBkaXJlY3Rpb25cbiAgICB9KSwgcHJvZ3Jlc3NJbmZvKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnY2lyY2xlJyB8fCB0eXBlID09PSAnZGFzaGJvYXJkJykge1xuICAgIHByb2dyZXNzID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2lyY2xlLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgIHN0cm9rZUNvbG9yOiBzdHJva2VDb2xvck5vdEFycmF5LFxuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICBwcm9ncmVzc1N0YXR1czogcHJvZ3Jlc3NTdGF0dXNcbiAgICB9KSwgcHJvZ3Jlc3NJbmZvKTtcbiAgfVxuICB2YXIgY2xhc3NTdHJpbmcgPSBjbGFzc05hbWVzKHByZWZpeENscywgKF9jbGFzc05hbWVzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KHR5cGUgPT09ICdkYXNoYm9hcmQnICYmICdjaXJjbGUnIHx8IHN0ZXBzICYmICdzdGVwcycgfHwgdHlwZSksIHRydWUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3RhdHVzLVwiKS5jb25jYXQocHJvZ3Jlc3NTdGF0dXMpLCB0cnVlKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNob3ctaW5mb1wiKSwgc2hvd0luZm8pLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItXCIpLmNvbmNhdChzaXplKSwgc2l6ZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBfY2xhc3NOYW1lcyksIGNsYXNzTmFtZSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7fSwgb21pdChyZXN0UHJvcHMsIFsnc3RhdHVzJywgJ2Zvcm1hdCcsICd0cmFpbENvbG9yJywgJ3N0cm9rZVdpZHRoJywgJ3dpZHRoJywgJ2dhcERlZ3JlZScsICdnYXBQb3NpdGlvbicsICdzdHJva2VMaW5lY2FwJywgJ3N1Y2Nlc3MnLCAnc3VjY2Vzc1BlcmNlbnQnXSksIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzU3RyaW5nLFxuICAgIHJvbGU6IFwicHJvZ3Jlc3NiYXJcIlxuICB9KSwgcHJvZ3Jlc3MpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFByb2dyZXNzOyIsIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIFN0YXJGaWxsZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTkwOC4xIDM1My4xbC0yNTMuOS0zNi45TDU0MC43IDg2LjFjLTMuMS02LjMtOC4yLTExLjQtMTQuNS0xNC41LTE1LjgtNy44LTM1LTEuMy00Mi45IDE0LjVMMzY5LjggMzE2LjJsLTI1My45IDM2LjljLTcgMS0xMy40IDQuMy0xOC4zIDkuM2EzMi4wNSAzMi4wNSAwIDAwLjYgNDUuM2wxODMuNyAxNzkuMS00My40IDI1Mi45YTMxLjk1IDMxLjk1IDAgMDA0Ni40IDMzLjdMNTEyIDc1NGwyMjcuMSAxMTkuNGM2LjIgMy4zIDEzLjQgNC40IDIwLjMgMy4yIDE3LjQtMyAyOS4xLTE5LjUgMjYuMS0zNi45bC00My40LTI1Mi45IDE4My43LTE3OS4xYzUtNC45IDguMy0xMS4zIDkuMy0xOC4zIDIuNy0xNy41LTkuNS0zMy43LTI3LTM2LjN6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJzdGFyXCIsIFwidGhlbWVcIjogXCJmaWxsZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgU3RhckZpbGxlZDtcbiIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFN0YXJGaWxsZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vU3RhckZpbGxlZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIFN0YXJGaWxsZWQgPSBmdW5jdGlvbiBTdGFyRmlsbGVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBTdGFyRmlsbGVkU3ZnXG4gIH0pKTtcbn07XG5TdGFyRmlsbGVkLmRpc3BsYXlOYW1lID0gJ1N0YXJGaWxsZWQnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoU3RhckZpbGxlZCk7IiwiZnVuY3Rpb24gZ2V0U2Nyb2xsKHcpIHtcbiAgdmFyIHJldCA9IHcucGFnZVhPZmZzZXQ7XG4gIHZhciBtZXRob2QgPSAnc2Nyb2xsTGVmdCc7XG5cbiAgaWYgKHR5cGVvZiByZXQgIT09ICdudW1iZXInKSB7XG4gICAgdmFyIGQgPSB3LmRvY3VtZW50OyAvLyBpZTYsNyw4IHN0YW5kYXJkIG1vZGVcblxuICAgIHJldCA9IGQuZG9jdW1lbnRFbGVtZW50W21ldGhvZF07XG5cbiAgICBpZiAodHlwZW9mIHJldCAhPT0gJ251bWJlcicpIHtcbiAgICAgIC8vIHF1aXJrcyBtb2RlXG4gICAgICByZXQgPSBkLmJvZHlbbWV0aG9kXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBnZXRDbGllbnRQb3NpdGlvbihlbGVtKSB7XG4gIHZhciB4O1xuICB2YXIgeTtcbiAgdmFyIGRvYyA9IGVsZW0ub3duZXJEb2N1bWVudDtcbiAgdmFyIGJvZHkgPSBkb2MuYm9keTtcbiAgdmFyIGRvY0VsZW0gPSBkb2MgJiYgZG9jLmRvY3VtZW50RWxlbWVudDtcbiAgdmFyIGJveCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHggPSBib3gubGVmdDtcbiAgeSA9IGJveC50b3A7XG4gIHggLT0gZG9jRWxlbS5jbGllbnRMZWZ0IHx8IGJvZHkuY2xpZW50TGVmdCB8fCAwO1xuICB5IC09IGRvY0VsZW0uY2xpZW50VG9wIHx8IGJvZHkuY2xpZW50VG9wIHx8IDA7XG4gIHJldHVybiB7XG4gICAgbGVmdDogeCxcbiAgICB0b3A6IHlcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9mZnNldExlZnQoZWwpIHtcbiAgdmFyIHBvcyA9IGdldENsaWVudFBvc2l0aW9uKGVsKTtcbiAgdmFyIGRvYyA9IGVsLm93bmVyRG9jdW1lbnQ7IC8vIE9ubHkgSUUgdXNlIGBwYXJlbnRXaW5kb3dgXG5cbiAgdmFyIHcgPSBkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdztcbiAgcG9zLmxlZnQgKz0gZ2V0U2Nyb2xsKHcpO1xuICByZXR1cm4gcG9zLmxlZnQ7XG59IiwiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c1wiO1xuaW1wb3J0IF9jcmVhdGVTdXBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlU3VwZXJcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbnZhciBTdGFyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhTdGFyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFN0YXIpO1xuXG4gIGZ1bmN0aW9uIFN0YXIoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFN0YXIpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwuYXBwbHkoX3N1cGVyLCBbdGhpc10uY29uY2F0KGFyZ3MpKTtcblxuICAgIF90aGlzLm9uSG92ZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgb25Ib3ZlciA9IF90aGlzJHByb3BzLm9uSG92ZXIsXG4gICAgICAgICAgaW5kZXggPSBfdGhpcyRwcm9wcy5pbmRleDtcbiAgICAgIG9uSG92ZXIoZSwgaW5kZXgpO1xuICAgIH07XG5cbiAgICBfdGhpcy5vbkNsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBvbkNsaWNrID0gX3RoaXMkcHJvcHMyLm9uQ2xpY2ssXG4gICAgICAgICAgaW5kZXggPSBfdGhpcyRwcm9wczIuaW5kZXg7XG4gICAgICBvbkNsaWNrKGUsIGluZGV4KTtcbiAgICB9O1xuXG4gICAgX3RoaXMub25LZXlEb3duID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBvbkNsaWNrID0gX3RoaXMkcHJvcHMzLm9uQ2xpY2ssXG4gICAgICAgICAgaW5kZXggPSBfdGhpcyRwcm9wczMuaW5kZXg7XG5cbiAgICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7XG4gICAgICAgIG9uQ2xpY2soZSwgaW5kZXgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoU3RhciwgW3tcbiAgICBrZXk6IFwiZ2V0Q2xhc3NOYW1lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldENsYXNzTmFtZSgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczQgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIHByZWZpeENscyA9IF90aGlzJHByb3BzNC5wcmVmaXhDbHMsXG4gICAgICAgICAgaW5kZXggPSBfdGhpcyRwcm9wczQuaW5kZXgsXG4gICAgICAgICAgdmFsdWUgPSBfdGhpcyRwcm9wczQudmFsdWUsXG4gICAgICAgICAgYWxsb3dIYWxmID0gX3RoaXMkcHJvcHM0LmFsbG93SGFsZixcbiAgICAgICAgICBmb2N1c2VkID0gX3RoaXMkcHJvcHM0LmZvY3VzZWQ7XG4gICAgICB2YXIgc3RhclZhbHVlID0gaW5kZXggKyAxO1xuICAgICAgdmFyIGNsYXNzTmFtZSA9IHByZWZpeENscztcblxuICAgICAgaWYgKHZhbHVlID09PSAwICYmIGluZGV4ID09PSAwICYmIGZvY3VzZWQpIHtcbiAgICAgICAgY2xhc3NOYW1lICs9IFwiIFwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWZvY3VzZWRcIik7XG4gICAgICB9IGVsc2UgaWYgKGFsbG93SGFsZiAmJiB2YWx1ZSArIDAuNSA+PSBzdGFyVmFsdWUgJiYgdmFsdWUgPCBzdGFyVmFsdWUpIHtcbiAgICAgICAgY2xhc3NOYW1lICs9IFwiIFwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhhbGYgXCIpLmNvbmNhdChwcmVmaXhDbHMsIFwiLWFjdGl2ZVwiKTtcblxuICAgICAgICBpZiAoZm9jdXNlZCkge1xuICAgICAgICAgIGNsYXNzTmFtZSArPSBcIiBcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1mb2N1c2VkXCIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGFzc05hbWUgKz0gc3RhclZhbHVlIDw9IHZhbHVlID8gXCIgXCIuY29uY2F0KHByZWZpeENscywgXCItZnVsbFwiKSA6IFwiIFwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXplcm9cIik7XG5cbiAgICAgICAgaWYgKHN0YXJWYWx1ZSA9PT0gdmFsdWUgJiYgZm9jdXNlZCkge1xuICAgICAgICAgIGNsYXNzTmFtZSArPSBcIiBcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1mb2N1c2VkXCIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjbGFzc05hbWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgb25Ib3ZlciA9IHRoaXMub25Ib3ZlcixcbiAgICAgICAgICBvbkNsaWNrID0gdGhpcy5vbkNsaWNrLFxuICAgICAgICAgIG9uS2V5RG93biA9IHRoaXMub25LZXlEb3duO1xuICAgICAgdmFyIF90aGlzJHByb3BzNSA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgZGlzYWJsZWQgPSBfdGhpcyRwcm9wczUuZGlzYWJsZWQsXG4gICAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkcHJvcHM1LnByZWZpeENscyxcbiAgICAgICAgICBjaGFyYWN0ZXIgPSBfdGhpcyRwcm9wczUuY2hhcmFjdGVyLFxuICAgICAgICAgIGNoYXJhY3RlclJlbmRlciA9IF90aGlzJHByb3BzNS5jaGFyYWN0ZXJSZW5kZXIsXG4gICAgICAgICAgaW5kZXggPSBfdGhpcyRwcm9wczUuaW5kZXgsXG4gICAgICAgICAgY291bnQgPSBfdGhpcyRwcm9wczUuY291bnQsXG4gICAgICAgICAgdmFsdWUgPSBfdGhpcyRwcm9wczUudmFsdWU7XG4gICAgICB2YXIgY2hhcmFjdGVyTm9kZSA9IHR5cGVvZiBjaGFyYWN0ZXIgPT09ICdmdW5jdGlvbicgPyBjaGFyYWN0ZXIodGhpcy5wcm9wcykgOiBjaGFyYWN0ZXI7XG4gICAgICB2YXIgc3RhcnQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiB0aGlzLmdldENsYXNzTmFtZSgpXG4gICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIG9uQ2xpY2s6IGRpc2FibGVkID8gbnVsbCA6IG9uQ2xpY2ssXG4gICAgICAgIG9uS2V5RG93bjogZGlzYWJsZWQgPyBudWxsIDogb25LZXlEb3duLFxuICAgICAgICBvbk1vdXNlTW92ZTogZGlzYWJsZWQgPyBudWxsIDogb25Ib3ZlcixcbiAgICAgICAgcm9sZTogXCJyYWRpb1wiLFxuICAgICAgICBcImFyaWEtY2hlY2tlZFwiOiB2YWx1ZSA+IGluZGV4ID8gJ3RydWUnIDogJ2ZhbHNlJyxcbiAgICAgICAgXCJhcmlhLXBvc2luc2V0XCI6IGluZGV4ICsgMSxcbiAgICAgICAgXCJhcmlhLXNldHNpemVcIjogY291bnQsXG4gICAgICAgIHRhYkluZGV4OiBkaXNhYmxlZCA/IC0xIDogMFxuICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZmlyc3RcIilcbiAgICAgIH0sIGNoYXJhY3Rlck5vZGUpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zZWNvbmRcIilcbiAgICAgIH0sIGNoYXJhY3Rlck5vZGUpKSk7XG5cbiAgICAgIGlmIChjaGFyYWN0ZXJSZW5kZXIpIHtcbiAgICAgICAgc3RhcnQgPSBjaGFyYWN0ZXJSZW5kZXIoc3RhcnQsIHRoaXMucHJvcHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3RhcnQ7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFN0YXI7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbmV4cG9ydCB7IFN0YXIgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c1wiO1xuaW1wb3J0IF9jcmVhdGVTdXBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlU3VwZXJcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgZmluZERPTU5vZGUgZnJvbSBcInJjLXV0aWwvZXMvRG9tL2ZpbmRET01Ob2RlXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBLZXlDb2RlIGZyb20gXCJyYy11dGlsL2VzL0tleUNvZGVcIjtcbmltcG9ydCB7IGdldE9mZnNldExlZnQgfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IFN0YXIgZnJvbSAnLi9TdGFyJztcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnZhciBSYXRlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhSYXRlLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFJhdGUpO1xuXG4gIGZ1bmN0aW9uIFJhdGUocHJvcHMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUmF0ZSk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzKTtcbiAgICBfdGhpcy5zdGFycyA9IHZvaWQgMDtcbiAgICBfdGhpcy5yYXRlID0gdm9pZCAwO1xuXG4gICAgX3RoaXMub25Ib3ZlciA9IGZ1bmN0aW9uIChldmVudCwgaW5kZXgpIHtcbiAgICAgIHZhciBvbkhvdmVyQ2hhbmdlID0gX3RoaXMucHJvcHMub25Ib3ZlckNoYW5nZTtcblxuICAgICAgdmFyIGhvdmVyVmFsdWUgPSBfdGhpcy5nZXRTdGFyVmFsdWUoaW5kZXgsIGV2ZW50LnBhZ2VYKTtcblxuICAgICAgdmFyIGNsZWFuZWRWYWx1ZSA9IF90aGlzLnN0YXRlLmNsZWFuZWRWYWx1ZTtcblxuICAgICAgaWYgKGhvdmVyVmFsdWUgIT09IGNsZWFuZWRWYWx1ZSkge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgaG92ZXJWYWx1ZTogaG92ZXJWYWx1ZSxcbiAgICAgICAgICBjbGVhbmVkVmFsdWU6IG51bGxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIG9uSG92ZXJDaGFuZ2UoaG92ZXJWYWx1ZSk7XG4gICAgfTtcblxuICAgIF90aGlzLm9uTW91c2VMZWF2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBvbkhvdmVyQ2hhbmdlID0gX3RoaXMucHJvcHMub25Ib3ZlckNoYW5nZTtcblxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBob3ZlclZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGNsZWFuZWRWYWx1ZTogbnVsbFxuICAgICAgfSk7XG5cbiAgICAgIG9uSG92ZXJDaGFuZ2UodW5kZWZpbmVkKTtcbiAgICB9O1xuXG4gICAgX3RoaXMub25DbGljayA9IGZ1bmN0aW9uIChldmVudCwgaW5kZXgpIHtcbiAgICAgIHZhciBhbGxvd0NsZWFyID0gX3RoaXMucHJvcHMuYWxsb3dDbGVhcjtcbiAgICAgIHZhciB2YWx1ZSA9IF90aGlzLnN0YXRlLnZhbHVlO1xuXG4gICAgICB2YXIgbmV3VmFsdWUgPSBfdGhpcy5nZXRTdGFyVmFsdWUoaW5kZXgsIGV2ZW50LnBhZ2VYKTtcblxuICAgICAgdmFyIGlzUmVzZXQgPSBmYWxzZTtcblxuICAgICAgaWYgKGFsbG93Q2xlYXIpIHtcbiAgICAgICAgaXNSZXNldCA9IG5ld1ZhbHVlID09PSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMub25Nb3VzZUxlYXZlKCk7XG5cbiAgICAgIF90aGlzLmNoYW5nZVZhbHVlKGlzUmVzZXQgPyAwIDogbmV3VmFsdWUpO1xuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGNsZWFuZWRWYWx1ZTogaXNSZXNldCA/IG5ld1ZhbHVlIDogbnVsbFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzLm9uRm9jdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgb25Gb2N1cyA9IF90aGlzLnByb3BzLm9uRm9jdXM7XG5cbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZm9jdXNlZDogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChvbkZvY3VzKSB7XG4gICAgICAgIG9uRm9jdXMoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMub25CbHVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG9uQmx1ciA9IF90aGlzLnByb3BzLm9uQmx1cjtcblxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBmb2N1c2VkOiBmYWxzZVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChvbkJsdXIpIHtcbiAgICAgICAgb25CbHVyKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLm9uS2V5RG93biA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgdmFyIGtleUNvZGUgPSBldmVudC5rZXlDb2RlO1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgY291bnQgPSBfdGhpcyRwcm9wcy5jb3VudCxcbiAgICAgICAgICBhbGxvd0hhbGYgPSBfdGhpcyRwcm9wcy5hbGxvd0hhbGYsXG4gICAgICAgICAgb25LZXlEb3duID0gX3RoaXMkcHJvcHMub25LZXlEb3duLFxuICAgICAgICAgIGRpcmVjdGlvbiA9IF90aGlzJHByb3BzLmRpcmVjdGlvbjtcbiAgICAgIHZhciByZXZlcnNlID0gZGlyZWN0aW9uID09PSAncnRsJztcbiAgICAgIHZhciB2YWx1ZSA9IF90aGlzLnN0YXRlLnZhbHVlO1xuXG4gICAgICBpZiAoa2V5Q29kZSA9PT0gS2V5Q29kZS5SSUdIVCAmJiB2YWx1ZSA8IGNvdW50ICYmICFyZXZlcnNlKSB7XG4gICAgICAgIGlmIChhbGxvd0hhbGYpIHtcbiAgICAgICAgICB2YWx1ZSArPSAwLjU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgKz0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLmNoYW5nZVZhbHVlKHZhbHVlKTtcblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSBlbHNlIGlmIChrZXlDb2RlID09PSBLZXlDb2RlLkxFRlQgJiYgdmFsdWUgPiAwICYmICFyZXZlcnNlKSB7XG4gICAgICAgIGlmIChhbGxvd0hhbGYpIHtcbiAgICAgICAgICB2YWx1ZSAtPSAwLjU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgLT0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLmNoYW5nZVZhbHVlKHZhbHVlKTtcblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSBlbHNlIGlmIChrZXlDb2RlID09PSBLZXlDb2RlLlJJR0hUICYmIHZhbHVlID4gMCAmJiByZXZlcnNlKSB7XG4gICAgICAgIGlmIChhbGxvd0hhbGYpIHtcbiAgICAgICAgICB2YWx1ZSAtPSAwLjU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgLT0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLmNoYW5nZVZhbHVlKHZhbHVlKTtcblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSBlbHNlIGlmIChrZXlDb2RlID09PSBLZXlDb2RlLkxFRlQgJiYgdmFsdWUgPCBjb3VudCAmJiByZXZlcnNlKSB7XG4gICAgICAgIGlmIChhbGxvd0hhbGYpIHtcbiAgICAgICAgICB2YWx1ZSArPSAwLjU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgKz0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLmNoYW5nZVZhbHVlKHZhbHVlKTtcblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAob25LZXlEb3duKSB7XG4gICAgICAgIG9uS2V5RG93bihldmVudCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLnNhdmVSZWYgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBfdGhpcy5zdGFyc1tpbmRleF0gPSBub2RlO1xuICAgICAgfTtcbiAgICB9O1xuXG4gICAgX3RoaXMuc2F2ZVJhdGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgX3RoaXMucmF0ZSA9IG5vZGU7XG4gICAgfTtcblxuICAgIHZhciBfdmFsdWUgPSBwcm9wcy52YWx1ZTtcblxuICAgIGlmIChfdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgX3ZhbHVlID0gcHJvcHMuZGVmYXVsdFZhbHVlO1xuICAgIH1cblxuICAgIF90aGlzLnN0YXJzID0ge307XG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICB2YWx1ZTogX3ZhbHVlLFxuICAgICAgZm9jdXNlZDogZmFsc2UsXG4gICAgICBjbGVhbmVkVmFsdWU6IG51bGxcbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhSYXRlLCBbe1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIGF1dG9Gb2N1cyA9IF90aGlzJHByb3BzMi5hdXRvRm9jdXMsXG4gICAgICAgICAgZGlzYWJsZWQgPSBfdGhpcyRwcm9wczIuZGlzYWJsZWQ7XG5cbiAgICAgIGlmIChhdXRvRm9jdXMgJiYgIWRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0U3RhckRPTVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTdGFyRE9NKGluZGV4KSB7XG4gICAgICByZXR1cm4gZmluZERPTU5vZGUodGhpcy5zdGFyc1tpbmRleF0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRTdGFyVmFsdWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U3RhclZhbHVlKGluZGV4LCB4KSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBhbGxvd0hhbGYgPSBfdGhpcyRwcm9wczMuYWxsb3dIYWxmLFxuICAgICAgICAgIGRpcmVjdGlvbiA9IF90aGlzJHByb3BzMy5kaXJlY3Rpb247XG4gICAgICB2YXIgcmV2ZXJzZSA9IGRpcmVjdGlvbiA9PT0gJ3J0bCc7XG4gICAgICB2YXIgdmFsdWUgPSBpbmRleCArIDE7XG5cbiAgICAgIGlmIChhbGxvd0hhbGYpIHtcbiAgICAgICAgdmFyIHN0YXJFbGUgPSB0aGlzLmdldFN0YXJET00oaW5kZXgpO1xuICAgICAgICB2YXIgbGVmdERpcyA9IGdldE9mZnNldExlZnQoc3RhckVsZSk7XG4gICAgICAgIHZhciB3aWR0aCA9IHN0YXJFbGUuY2xpZW50V2lkdGg7XG5cbiAgICAgICAgaWYgKHJldmVyc2UgJiYgeCAtIGxlZnREaXMgPiB3aWR0aCAvIDIpIHtcbiAgICAgICAgICB2YWx1ZSAtPSAwLjU7XG4gICAgICAgIH0gZWxzZSBpZiAoIXJldmVyc2UgJiYgeCAtIGxlZnREaXMgPCB3aWR0aCAvIDIpIHtcbiAgICAgICAgICB2YWx1ZSAtPSAwLjU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmb2N1c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb2N1cygpIHtcbiAgICAgIHZhciBkaXNhYmxlZCA9IHRoaXMucHJvcHMuZGlzYWJsZWQ7XG5cbiAgICAgIGlmICghZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5yYXRlLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJsdXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYmx1cigpIHtcbiAgICAgIHZhciBkaXNhYmxlZCA9IHRoaXMucHJvcHMuZGlzYWJsZWQ7XG5cbiAgICAgIGlmICghZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5yYXRlLmJsdXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2hhbmdlVmFsdWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2hhbmdlVmFsdWUodmFsdWUpIHtcbiAgICAgIHZhciBvbkNoYW5nZSA9IHRoaXMucHJvcHMub25DaGFuZ2U7XG5cbiAgICAgIGlmICghKCd2YWx1ZScgaW4gdGhpcy5wcm9wcykpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBvbkNoYW5nZSh2YWx1ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM0ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBjb3VudCA9IF90aGlzJHByb3BzNC5jb3VudCxcbiAgICAgICAgICBhbGxvd0hhbGYgPSBfdGhpcyRwcm9wczQuYWxsb3dIYWxmLFxuICAgICAgICAgIHN0eWxlID0gX3RoaXMkcHJvcHM0LnN0eWxlLFxuICAgICAgICAgIHByZWZpeENscyA9IF90aGlzJHByb3BzNC5wcmVmaXhDbHMsXG4gICAgICAgICAgZGlzYWJsZWQgPSBfdGhpcyRwcm9wczQuZGlzYWJsZWQsXG4gICAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHM0LmNsYXNzTmFtZSxcbiAgICAgICAgICBjaGFyYWN0ZXIgPSBfdGhpcyRwcm9wczQuY2hhcmFjdGVyLFxuICAgICAgICAgIGNoYXJhY3RlclJlbmRlciA9IF90aGlzJHByb3BzNC5jaGFyYWN0ZXJSZW5kZXIsXG4gICAgICAgICAgdGFiSW5kZXggPSBfdGhpcyRwcm9wczQudGFiSW5kZXgsXG4gICAgICAgICAgZGlyZWN0aW9uID0gX3RoaXMkcHJvcHM0LmRpcmVjdGlvbjtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZSA9IHRoaXMuc3RhdGUsXG4gICAgICAgICAgdmFsdWUgPSBfdGhpcyRzdGF0ZS52YWx1ZSxcbiAgICAgICAgICBob3ZlclZhbHVlID0gX3RoaXMkc3RhdGUuaG92ZXJWYWx1ZSxcbiAgICAgICAgICBmb2N1c2VkID0gX3RoaXMkc3RhdGUuZm9jdXNlZDtcbiAgICAgIHZhciBzdGFycyA9IFtdO1xuICAgICAgdmFyIGRpc2FibGVkQ2xhc3MgPSBkaXNhYmxlZCA/IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWRcIikgOiAnJztcblxuICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGNvdW50OyBpbmRleCArPSAxKSB7XG4gICAgICAgIHN0YXJzLnB1c2goIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFN0YXIsIHtcbiAgICAgICAgICByZWY6IHRoaXMuc2F2ZVJlZihpbmRleCksXG4gICAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICAgIGNvdW50OiBjb3VudCxcbiAgICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgICAgcHJlZml4Q2xzOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN0YXJcIiksXG4gICAgICAgICAgYWxsb3dIYWxmOiBhbGxvd0hhbGYsXG4gICAgICAgICAgdmFsdWU6IGhvdmVyVmFsdWUgPT09IHVuZGVmaW5lZCA/IHZhbHVlIDogaG92ZXJWYWx1ZSxcbiAgICAgICAgICBvbkNsaWNrOiB0aGlzLm9uQ2xpY2ssXG4gICAgICAgICAgb25Ib3ZlcjogdGhpcy5vbkhvdmVyLFxuICAgICAgICAgIGtleTogaW5kZXgsXG4gICAgICAgICAgY2hhcmFjdGVyOiBjaGFyYWN0ZXIsXG4gICAgICAgICAgY2hhcmFjdGVyUmVuZGVyOiBjaGFyYWN0ZXJSZW5kZXIsXG4gICAgICAgICAgZm9jdXNlZDogZm9jdXNlZFxuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIHZhciByYXRlQ2xhc3NOYW1lID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIGRpc2FibGVkQ2xhc3MsIGNsYXNzTmFtZSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJykpO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwidWxcIiwge1xuICAgICAgICBjbGFzc05hbWU6IHJhdGVDbGFzc05hbWUsXG4gICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgb25Nb3VzZUxlYXZlOiBkaXNhYmxlZCA/IG51bGwgOiB0aGlzLm9uTW91c2VMZWF2ZSxcbiAgICAgICAgdGFiSW5kZXg6IGRpc2FibGVkID8gLTEgOiB0YWJJbmRleCxcbiAgICAgICAgb25Gb2N1czogZGlzYWJsZWQgPyBudWxsIDogdGhpcy5vbkZvY3VzLFxuICAgICAgICBvbkJsdXI6IGRpc2FibGVkID8gbnVsbCA6IHRoaXMub25CbHVyLFxuICAgICAgICBvbktleURvd246IGRpc2FibGVkID8gbnVsbCA6IHRoaXMub25LZXlEb3duLFxuICAgICAgICByZWY6IHRoaXMuc2F2ZVJhdGUsXG4gICAgICAgIHJvbGU6IFwicmFkaW9ncm91cFwiXG4gICAgICB9LCBzdGFycyk7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHN0YXRlKSB7XG4gICAgICBpZiAoJ3ZhbHVlJyBpbiBuZXh0UHJvcHMgJiYgbmV4dFByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3RhdGUpLCB7fSwge1xuICAgICAgICAgIHZhbHVlOiBuZXh0UHJvcHMudmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUmF0ZTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuUmF0ZS5kZWZhdWx0UHJvcHMgPSB7XG4gIGRlZmF1bHRWYWx1ZTogMCxcbiAgY291bnQ6IDUsXG4gIGFsbG93SGFsZjogZmFsc2UsXG4gIGFsbG93Q2xlYXI6IHRydWUsXG4gIHN0eWxlOiB7fSxcbiAgcHJlZml4Q2xzOiAncmMtcmF0ZScsXG4gIG9uQ2hhbmdlOiBub29wLFxuICBjaGFyYWN0ZXI6ICfimIUnLFxuICBvbkhvdmVyQ2hhbmdlOiBub29wLFxuICB0YWJJbmRleDogMCxcbiAgZGlyZWN0aW9uOiAnbHRyJ1xufTtcbmV4cG9ydCBkZWZhdWx0IFJhdGU7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IFN0YXJGaWxsZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1N0YXJGaWxsZWRcIjtcbmltcG9ydCBSY1JhdGUgZnJvbSAncmMtcmF0ZSc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCBUb29sdGlwIGZyb20gJy4uL3Rvb2x0aXAnO1xudmFyIFJhdGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHRvb2x0aXBzID0gcHJvcHMudG9vbHRpcHMsXG4gICAgX3Byb3BzJGNoYXJhY3RlciA9IHByb3BzLmNoYXJhY3RlcixcbiAgICBjaGFyYWN0ZXIgPSBfcHJvcHMkY2hhcmFjdGVyID09PSB2b2lkIDAgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTdGFyRmlsbGVkLCBudWxsKSA6IF9wcm9wcyRjaGFyYWN0ZXIsXG4gICAgcmVzdCA9IF9fcmVzdChwcm9wcywgW1wicHJlZml4Q2xzXCIsIFwidG9vbHRpcHNcIiwgXCJjaGFyYWN0ZXJcIl0pO1xuICB2YXIgY2hhcmFjdGVyUmVuZGVyID0gZnVuY3Rpb24gY2hhcmFjdGVyUmVuZGVyKG5vZGUsIF9yZWYpIHtcbiAgICB2YXIgaW5kZXggPSBfcmVmLmluZGV4O1xuICAgIGlmICghdG9vbHRpcHMpIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcCwge1xuICAgICAgdGl0bGU6IHRvb2x0aXBzW2luZGV4XVxuICAgIH0sIG5vZGUpO1xuICB9O1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICBkaXJlY3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb247XG4gIHZhciByYXRlUHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdyYXRlJywgcHJlZml4Q2xzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJjUmF0ZSwgX2V4dGVuZHMoe1xuICAgIHJlZjogcmVmLFxuICAgIGNoYXJhY3RlcjogY2hhcmFjdGVyLFxuICAgIGNoYXJhY3RlclJlbmRlcjogY2hhcmFjdGVyUmVuZGVyXG4gIH0sIHJlc3QsIHtcbiAgICBwcmVmaXhDbHM6IHJhdGVQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uOiBkaXJlY3Rpb25cbiAgfSkpO1xufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSYXRlLmRpc3BsYXlOYW1lID0gJ1JhdGUnO1xufVxuZXhwb3J0IGRlZmF1bHQgUmF0ZTsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgU2xpZGVyQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgbWluOiAwLFxuICBtYXg6IDAsXG4gIGRpcmVjdGlvbjogJ2x0cicsXG4gIHN0ZXA6IDEsXG4gIGluY2x1ZGVkU3RhcnQ6IDAsXG4gIGluY2x1ZGVkRW5kOiAwLFxuICB0YWJJbmRleDogMFxufSk7XG5leHBvcnQgZGVmYXVsdCBTbGlkZXJDb250ZXh0OyIsImV4cG9ydCBmdW5jdGlvbiBnZXRPZmZzZXQodmFsdWUsIG1pbiwgbWF4KSB7XG4gIHJldHVybiAodmFsdWUgLSBtaW4pIC8gKG1heCAtIG1pbik7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RGlyZWN0aW9uU3R5bGUoZGlyZWN0aW9uLCB2YWx1ZSwgbWluLCBtYXgpIHtcbiAgdmFyIG9mZnNldCA9IGdldE9mZnNldCh2YWx1ZSwgbWluLCBtYXgpO1xuICB2YXIgcG9zaXRpb25TdHlsZSA9IHt9O1xuXG4gIHN3aXRjaCAoZGlyZWN0aW9uKSB7XG4gICAgY2FzZSAncnRsJzpcbiAgICAgIHBvc2l0aW9uU3R5bGUucmlnaHQgPSBcIlwiLmNvbmNhdChvZmZzZXQgKiAxMDAsIFwiJVwiKTtcbiAgICAgIHBvc2l0aW9uU3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVgoNTAlKSc7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2J0dCc6XG4gICAgICBwb3NpdGlvblN0eWxlLmJvdHRvbSA9IFwiXCIuY29uY2F0KG9mZnNldCAqIDEwMCwgXCIlXCIpO1xuICAgICAgcG9zaXRpb25TdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWSg1MCUpJztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndHRiJzpcbiAgICAgIHBvc2l0aW9uU3R5bGUudG9wID0gXCJcIi5jb25jYXQob2Zmc2V0ICogMTAwLCBcIiVcIik7XG4gICAgICBwb3NpdGlvblN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVZKC01MCUpJztcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHBvc2l0aW9uU3R5bGUubGVmdCA9IFwiXCIuY29uY2F0KG9mZnNldCAqIDEwMCwgXCIlXCIpO1xuICAgICAgcG9zaXRpb25TdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWCgtNTAlKSc7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiBwb3NpdGlvblN0eWxlO1xufVxuLyoqIFJldHVybiBpbmRleCB2YWx1ZSBpZiBpcyBsaXN0IG9yIHJldHVybiB2YWx1ZSBkaXJlY3RseSAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5kZXgodmFsdWUsIGluZGV4KSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlW2luZGV4XSA6IHZhbHVlO1xufSIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcInByZWZpeENsc1wiLCBcInZhbHVlXCIsIFwidmFsdWVJbmRleFwiLCBcIm9uU3RhcnRNb3ZlXCIsIFwic3R5bGVcIiwgXCJyZW5kZXJcIiwgXCJkcmFnZ2luZ1wiLCBcIm9uT2Zmc2V0Q2hhbmdlXCJdO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgS2V5Q29kZSBmcm9tIFwicmMtdXRpbC9lcy9LZXlDb2RlXCI7XG5pbXBvcnQgU2xpZGVyQ29udGV4dCBmcm9tICcuLi9jb250ZXh0JztcbmltcG9ydCB7IGdldERpcmVjdGlvblN0eWxlLCBnZXRJbmRleCB9IGZyb20gJy4uL3V0aWwnO1xudmFyIEhhbmRsZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBfY2xhc3NOYW1lcywgX2dldEluZGV4O1xuXG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgICAgdmFsdWVJbmRleCA9IHByb3BzLnZhbHVlSW5kZXgsXG4gICAgICBvblN0YXJ0TW92ZSA9IHByb3BzLm9uU3RhcnRNb3ZlLFxuICAgICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICAgIHJlbmRlciA9IHByb3BzLnJlbmRlcixcbiAgICAgIGRyYWdnaW5nID0gcHJvcHMuZHJhZ2dpbmcsXG4gICAgICBvbk9mZnNldENoYW5nZSA9IHByb3BzLm9uT2Zmc2V0Q2hhbmdlLFxuICAgICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQpO1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoU2xpZGVyQ29udGV4dCksXG4gICAgICBtaW4gPSBfUmVhY3QkdXNlQ29udGV4dC5taW4sXG4gICAgICBtYXggPSBfUmVhY3QkdXNlQ29udGV4dC5tYXgsXG4gICAgICBkaXJlY3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb24sXG4gICAgICBkaXNhYmxlZCA9IF9SZWFjdCR1c2VDb250ZXh0LmRpc2FibGVkLFxuICAgICAgcmFuZ2UgPSBfUmVhY3QkdXNlQ29udGV4dC5yYW5nZSxcbiAgICAgIHRhYkluZGV4ID0gX1JlYWN0JHVzZUNvbnRleHQudGFiSW5kZXgsXG4gICAgICBhcmlhTGFiZWxGb3JIYW5kbGUgPSBfUmVhY3QkdXNlQ29udGV4dC5hcmlhTGFiZWxGb3JIYW5kbGUsXG4gICAgICBhcmlhTGFiZWxsZWRCeUZvckhhbmRsZSA9IF9SZWFjdCR1c2VDb250ZXh0LmFyaWFMYWJlbGxlZEJ5Rm9ySGFuZGxlLFxuICAgICAgYXJpYVZhbHVlVGV4dEZvcm1hdHRlckZvckhhbmRsZSA9IF9SZWFjdCR1c2VDb250ZXh0LmFyaWFWYWx1ZVRleHRGb3JtYXR0ZXJGb3JIYW5kbGU7XG5cbiAgdmFyIGhhbmRsZVByZWZpeENscyA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGFuZGxlXCIpOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IEV2ZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIG9uSW50ZXJuYWxTdGFydE1vdmUgPSBmdW5jdGlvbiBvbkludGVybmFsU3RhcnRNb3ZlKGUpIHtcbiAgICBpZiAoIWRpc2FibGVkKSB7XG4gICAgICBvblN0YXJ0TW92ZShlLCB2YWx1ZUluZGV4KTtcbiAgICB9XG4gIH07IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBLZXlib2FyZCA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIHZhciBvbktleURvd24gPSBmdW5jdGlvbiBvbktleURvd24oZSkge1xuICAgIGlmICghZGlzYWJsZWQpIHtcbiAgICAgIHZhciBvZmZzZXQgPSBudWxsOyAvLyBDaGFuZ2UgdGhlIHZhbHVlXG5cbiAgICAgIHN3aXRjaCAoZS53aGljaCB8fCBlLmtleUNvZGUpIHtcbiAgICAgICAgY2FzZSBLZXlDb2RlLkxFRlQ6XG4gICAgICAgICAgb2Zmc2V0ID0gZGlyZWN0aW9uID09PSAnbHRyJyB8fCBkaXJlY3Rpb24gPT09ICdidHQnID8gLTEgOiAxO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgS2V5Q29kZS5SSUdIVDpcbiAgICAgICAgICBvZmZzZXQgPSBkaXJlY3Rpb24gPT09ICdsdHInIHx8IGRpcmVjdGlvbiA9PT0gJ2J0dCcgPyAxIDogLTE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIFVwIGlzIHBsdXNcblxuICAgICAgICBjYXNlIEtleUNvZGUuVVA6XG4gICAgICAgICAgb2Zmc2V0ID0gZGlyZWN0aW9uICE9PSAndHRiJyA/IDEgOiAtMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gRG93biBpcyBtaW51c1xuXG4gICAgICAgIGNhc2UgS2V5Q29kZS5ET1dOOlxuICAgICAgICAgIG9mZnNldCA9IGRpcmVjdGlvbiAhPT0gJ3R0YicgPyAtMSA6IDE7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBLZXlDb2RlLkhPTUU6XG4gICAgICAgICAgb2Zmc2V0ID0gJ21pbic7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBLZXlDb2RlLkVORDpcbiAgICAgICAgICBvZmZzZXQgPSAnbWF4JztcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIEtleUNvZGUuUEFHRV9VUDpcbiAgICAgICAgICBvZmZzZXQgPSAyO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgS2V5Q29kZS5QQUdFX0RPV046XG4gICAgICAgICAgb2Zmc2V0ID0gLTI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChvZmZzZXQgIT09IG51bGwpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBvbk9mZnNldENoYW5nZShvZmZzZXQsIHZhbHVlSW5kZXgpO1xuICAgICAgfVxuICAgIH1cbiAgfTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBPZmZzZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIHBvc2l0aW9uU3R5bGUgPSBnZXREaXJlY3Rpb25TdHlsZShkaXJlY3Rpb24sIHZhbHVlLCBtaW4sIG1heCk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgaGFuZGxlTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICByZWY6IHJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoaGFuZGxlUHJlZml4Q2xzLCAoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChoYW5kbGVQcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQodmFsdWVJbmRleCArIDEpLCByYW5nZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQoaGFuZGxlUHJlZml4Q2xzLCBcIi1kcmFnZ2luZ1wiKSwgZHJhZ2dpbmcpLCBfY2xhc3NOYW1lcykpLFxuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHBvc2l0aW9uU3R5bGUpLCBzdHlsZSksXG4gICAgb25Nb3VzZURvd246IG9uSW50ZXJuYWxTdGFydE1vdmUsXG4gICAgb25Ub3VjaFN0YXJ0OiBvbkludGVybmFsU3RhcnRNb3ZlLFxuICAgIG9uS2V5RG93bjogb25LZXlEb3duLFxuICAgIHRhYkluZGV4OiBkaXNhYmxlZCA/IG51bGwgOiBnZXRJbmRleCh0YWJJbmRleCwgdmFsdWVJbmRleCksXG4gICAgcm9sZTogXCJzbGlkZXJcIixcbiAgICBcImFyaWEtdmFsdWVtaW5cIjogbWluLFxuICAgIFwiYXJpYS12YWx1ZW1heFwiOiBtYXgsXG4gICAgXCJhcmlhLXZhbHVlbm93XCI6IHZhbHVlLFxuICAgIFwiYXJpYS1kaXNhYmxlZFwiOiBkaXNhYmxlZCxcbiAgICBcImFyaWEtbGFiZWxcIjogZ2V0SW5kZXgoYXJpYUxhYmVsRm9ySGFuZGxlLCB2YWx1ZUluZGV4KSxcbiAgICBcImFyaWEtbGFiZWxsZWRieVwiOiBnZXRJbmRleChhcmlhTGFiZWxsZWRCeUZvckhhbmRsZSwgdmFsdWVJbmRleCksXG4gICAgXCJhcmlhLXZhbHVldGV4dFwiOiAoX2dldEluZGV4ID0gZ2V0SW5kZXgoYXJpYVZhbHVlVGV4dEZvcm1hdHRlckZvckhhbmRsZSwgdmFsdWVJbmRleCkpID09PSBudWxsIHx8IF9nZXRJbmRleCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2dldEluZGV4KHZhbHVlKVxuICB9LCByZXN0UHJvcHMpKTsgLy8gQ3VzdG9taXplXG5cbiAgaWYgKHJlbmRlcikge1xuICAgIGhhbmRsZU5vZGUgPSByZW5kZXIoaGFuZGxlTm9kZSwge1xuICAgICAgaW5kZXg6IHZhbHVlSW5kZXgsXG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGRyYWdnaW5nOiBkcmFnZ2luZ1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGhhbmRsZU5vZGU7XG59KTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgSGFuZGxlLmRpc3BsYXlOYW1lID0gJ0hhbmRsZSc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEhhbmRsZTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wicHJlZml4Q2xzXCIsIFwic3R5bGVcIiwgXCJvblN0YXJ0TW92ZVwiLCBcIm9uT2Zmc2V0Q2hhbmdlXCIsIFwidmFsdWVzXCIsIFwiaGFuZGxlUmVuZGVyXCIsIFwiZHJhZ2dpbmdJbmRleFwiXTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBIYW5kbGUgZnJvbSAnLi9IYW5kbGUnO1xuaW1wb3J0IHsgZ2V0SW5kZXggfSBmcm9tICcuLi91dGlsJztcbnZhciBIYW5kbGVzID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgICBvblN0YXJ0TW92ZSA9IHByb3BzLm9uU3RhcnRNb3ZlLFxuICAgICAgb25PZmZzZXRDaGFuZ2UgPSBwcm9wcy5vbk9mZnNldENoYW5nZSxcbiAgICAgIHZhbHVlcyA9IHByb3BzLnZhbHVlcyxcbiAgICAgIGhhbmRsZVJlbmRlciA9IHByb3BzLmhhbmRsZVJlbmRlcixcbiAgICAgIGRyYWdnaW5nSW5kZXggPSBwcm9wcy5kcmFnZ2luZ0luZGV4LFxuICAgICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQpO1xuXG4gIHZhciBoYW5kbGVzUmVmID0gUmVhY3QudXNlUmVmKHt9KTtcbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZm9jdXM6IGZ1bmN0aW9uIGZvY3VzKGluZGV4KSB7XG4gICAgICAgIHZhciBfaGFuZGxlc1JlZiRjdXJyZW50JGk7XG5cbiAgICAgICAgKF9oYW5kbGVzUmVmJGN1cnJlbnQkaSA9IGhhbmRsZXNSZWYuY3VycmVudFtpbmRleF0pID09PSBudWxsIHx8IF9oYW5kbGVzUmVmJGN1cnJlbnQkaSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2hhbmRsZXNSZWYkY3VycmVudCRpLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgdmFsdWVzLm1hcChmdW5jdGlvbiAodmFsdWUsIGluZGV4KSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEhhbmRsZSwgX2V4dGVuZHMoe1xuICAgICAgcmVmOiBmdW5jdGlvbiByZWYobm9kZSkge1xuICAgICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgICBkZWxldGUgaGFuZGxlc1JlZi5jdXJyZW50W2luZGV4XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBoYW5kbGVzUmVmLmN1cnJlbnRbaW5kZXhdID0gbm9kZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGRyYWdnaW5nOiBkcmFnZ2luZ0luZGV4ID09PSBpbmRleCxcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgc3R5bGU6IGdldEluZGV4KHN0eWxlLCBpbmRleCksXG4gICAgICBrZXk6IGluZGV4LFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgdmFsdWVJbmRleDogaW5kZXgsXG4gICAgICBvblN0YXJ0TW92ZTogb25TdGFydE1vdmUsXG4gICAgICBvbk9mZnNldENoYW5nZTogb25PZmZzZXRDaGFuZ2UsXG4gICAgICByZW5kZXI6IGhhbmRsZVJlbmRlclxuICAgIH0sIHJlc3RQcm9wcykpO1xuICB9KSk7XG59KTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgSGFuZGxlcy5kaXNwbGF5TmFtZSA9ICdIYW5kbGVzJztcbn1cblxuZXhwb3J0IGRlZmF1bHQgSGFuZGxlczsiLCJpbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmZ1bmN0aW9uIGdldFBvc2l0aW9uKGUpIHtcbiAgdmFyIG9iaiA9ICd0b3VjaGVzJyBpbiBlID8gZS50b3VjaGVzWzBdIDogZTtcbiAgcmV0dXJuIHtcbiAgICBwYWdlWDogb2JqLnBhZ2VYLFxuICAgIHBhZ2VZOiBvYmoucGFnZVlcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlRHJhZyhjb250YWluZXJSZWYsIGRpcmVjdGlvbiwgcmF3VmFsdWVzLCBtaW4sIG1heCwgZm9ybWF0VmFsdWUsIHRyaWdnZXJDaGFuZ2UsIGZpbmlzaENoYW5nZSwgb2Zmc2V0VmFsdWVzKSB7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShudWxsKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgICAgZHJhZ2dpbmdWYWx1ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgICBzZXREcmFnZ2luZ1ZhbHVlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKC0xKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUzLCAyKSxcbiAgICAgIGRyYWdnaW5nSW5kZXggPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgICAgc2V0RHJhZ2dpbmdJbmRleCA9IF9SZWFjdCR1c2VTdGF0ZTRbMV07XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTUgPSBSZWFjdC51c2VTdGF0ZShyYXdWYWx1ZXMpLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlNiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTUsIDIpLFxuICAgICAgY2FjaGVWYWx1ZXMgPSBfUmVhY3QkdXNlU3RhdGU2WzBdLFxuICAgICAgc2V0Q2FjaGVWYWx1ZXMgPSBfUmVhY3QkdXNlU3RhdGU2WzFdO1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGU3ID0gUmVhY3QudXNlU3RhdGUocmF3VmFsdWVzKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTggPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGU3LCAyKSxcbiAgICAgIG9yaWdpblZhbHVlcyA9IF9SZWFjdCR1c2VTdGF0ZThbMF0sXG4gICAgICBzZXRPcmlnaW5WYWx1ZXMgPSBfUmVhY3QkdXNlU3RhdGU4WzFdO1xuXG4gIHZhciBtb3VzZU1vdmVFdmVudFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIG1vdXNlVXBFdmVudFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZHJhZ2dpbmdJbmRleCA9PT0gLTEpIHtcbiAgICAgIHNldENhY2hlVmFsdWVzKHJhd1ZhbHVlcyk7XG4gICAgfVxuICB9LCBbcmF3VmFsdWVzLCBkcmFnZ2luZ0luZGV4XSk7IC8vIENsZWFuIHVwIGV2ZW50XG5cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgbW91c2VNb3ZlRXZlbnRSZWYuY3VycmVudCk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgbW91c2VVcEV2ZW50UmVmLmN1cnJlbnQpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgbW91c2VNb3ZlRXZlbnRSZWYuY3VycmVudCk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG1vdXNlVXBFdmVudFJlZi5jdXJyZW50KTtcbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgdmFyIGZsdXNoVmFsdWVzID0gZnVuY3Rpb24gZmx1c2hWYWx1ZXMobmV4dFZhbHVlcywgbmV4dFZhbHVlKSB7XG4gICAgLy8gUGVyZjogT25seSB1cGRhdGUgc3RhdGUgd2hlbiB2YWx1ZSBjaGFuZ2VkXG4gICAgaWYgKGNhY2hlVmFsdWVzLnNvbWUoZnVuY3Rpb24gKHZhbCwgaSkge1xuICAgICAgcmV0dXJuIHZhbCAhPT0gbmV4dFZhbHVlc1tpXTtcbiAgICB9KSkge1xuICAgICAgaWYgKG5leHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNldERyYWdnaW5nVmFsdWUobmV4dFZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgc2V0Q2FjaGVWYWx1ZXMobmV4dFZhbHVlcyk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlKG5leHRWYWx1ZXMpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgdXBkYXRlQ2FjaGVWYWx1ZSA9IGZ1bmN0aW9uIHVwZGF0ZUNhY2hlVmFsdWUodmFsdWVJbmRleCwgb2Zmc2V0UGVyY2VudCkge1xuICAgIC8vIEJhc2ljIHBvaW50IG9mZnNldFxuICAgIGlmICh2YWx1ZUluZGV4ID09PSAtMSkge1xuICAgICAgLy8gPj4+PiBEcmFnZ2luZyBvbiB0aGUgdHJhY2tcbiAgICAgIHZhciBzdGFydFZhbHVlID0gb3JpZ2luVmFsdWVzWzBdO1xuICAgICAgdmFyIGVuZFZhbHVlID0gb3JpZ2luVmFsdWVzW29yaWdpblZhbHVlcy5sZW5ndGggLSAxXTtcbiAgICAgIHZhciBtYXhTdGFydE9mZnNldCA9IG1pbiAtIHN0YXJ0VmFsdWU7XG4gICAgICB2YXIgbWF4RW5kT2Zmc2V0ID0gbWF4IC0gZW5kVmFsdWU7IC8vIEdldCB2YWxpZCBvZmZzZXRcblxuICAgICAgdmFyIG9mZnNldCA9IG9mZnNldFBlcmNlbnQgKiAobWF4IC0gbWluKTtcbiAgICAgIG9mZnNldCA9IE1hdGgubWF4KG9mZnNldCwgbWF4U3RhcnRPZmZzZXQpO1xuICAgICAgb2Zmc2V0ID0gTWF0aC5taW4ob2Zmc2V0LCBtYXhFbmRPZmZzZXQpOyAvLyBVc2UgZmlyc3QgdmFsdWUgdG8gcmV2ZXJ0IGJhY2sgb2YgdmFsaWQgb2Zmc2V0IChsaWtlIHN0ZXBzIG1hcmtzKVxuXG4gICAgICB2YXIgZm9ybWF0U3RhcnRWYWx1ZSA9IGZvcm1hdFZhbHVlKHN0YXJ0VmFsdWUgKyBvZmZzZXQpO1xuICAgICAgb2Zmc2V0ID0gZm9ybWF0U3RhcnRWYWx1ZSAtIHN0YXJ0VmFsdWU7XG4gICAgICB2YXIgY2xvbmVDYWNoZVZhbHVlcyA9IG9yaWdpblZhbHVlcy5tYXAoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICByZXR1cm4gdmFsICsgb2Zmc2V0O1xuICAgICAgfSk7XG4gICAgICBmbHVzaFZhbHVlcyhjbG9uZUNhY2hlVmFsdWVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gPj4+PiBEcmFnZ2luZyBvbiB0aGUgaGFuZGxlXG4gICAgICB2YXIgb2Zmc2V0RGlzdCA9IChtYXggLSBtaW4pICogb2Zmc2V0UGVyY2VudDsgLy8gQWx3YXlzIHN0YXJ0IHdpdGggdGhlIHZhbHVlSW5kZXggb3JpZ2luIHZhbHVlXG5cbiAgICAgIHZhciBjbG9uZVZhbHVlcyA9IF90b0NvbnN1bWFibGVBcnJheShjYWNoZVZhbHVlcyk7XG5cbiAgICAgIGNsb25lVmFsdWVzW3ZhbHVlSW5kZXhdID0gb3JpZ2luVmFsdWVzW3ZhbHVlSW5kZXhdO1xuICAgICAgdmFyIG5leHQgPSBvZmZzZXRWYWx1ZXMoY2xvbmVWYWx1ZXMsIG9mZnNldERpc3QsIHZhbHVlSW5kZXgsICdkaXN0Jyk7XG4gICAgICBmbHVzaFZhbHVlcyhuZXh0LnZhbHVlcywgbmV4dC52YWx1ZSk7XG4gICAgfVxuICB9OyAvLyBSZXNvbHZlIGNsb3N1cmVcblxuXG4gIHZhciB1cGRhdGVDYWNoZVZhbHVlUmVmID0gUmVhY3QudXNlUmVmKHVwZGF0ZUNhY2hlVmFsdWUpO1xuICB1cGRhdGVDYWNoZVZhbHVlUmVmLmN1cnJlbnQgPSB1cGRhdGVDYWNoZVZhbHVlO1xuXG4gIHZhciBvblN0YXJ0TW92ZSA9IGZ1bmN0aW9uIG9uU3RhcnRNb3ZlKGUsIHZhbHVlSW5kZXgpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHZhciBvcmlnaW5WYWx1ZSA9IHJhd1ZhbHVlc1t2YWx1ZUluZGV4XTtcbiAgICBzZXREcmFnZ2luZ0luZGV4KHZhbHVlSW5kZXgpO1xuICAgIHNldERyYWdnaW5nVmFsdWUob3JpZ2luVmFsdWUpO1xuICAgIHNldE9yaWdpblZhbHVlcyhyYXdWYWx1ZXMpO1xuXG4gICAgdmFyIF9nZXRQb3NpdGlvbiA9IGdldFBvc2l0aW9uKGUpLFxuICAgICAgICBzdGFydFggPSBfZ2V0UG9zaXRpb24ucGFnZVgsXG4gICAgICAgIHN0YXJ0WSA9IF9nZXRQb3NpdGlvbi5wYWdlWTsgLy8gTW92aW5nXG5cblxuICAgIHZhciBvbk1vdXNlTW92ZSA9IGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGV2ZW50KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICB2YXIgX2dldFBvc2l0aW9uMiA9IGdldFBvc2l0aW9uKGV2ZW50KSxcbiAgICAgICAgICBtb3ZlWCA9IF9nZXRQb3NpdGlvbjIucGFnZVgsXG4gICAgICAgICAgbW92ZVkgPSBfZ2V0UG9zaXRpb24yLnBhZ2VZO1xuXG4gICAgICB2YXIgb2Zmc2V0WCA9IG1vdmVYIC0gc3RhcnRYO1xuICAgICAgdmFyIG9mZnNldFkgPSBtb3ZlWSAtIHN0YXJ0WTtcblxuICAgICAgdmFyIF9jb250YWluZXJSZWYkY3VycmVudCA9IGNvbnRhaW5lclJlZi5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgICAgIHdpZHRoID0gX2NvbnRhaW5lclJlZiRjdXJyZW50LndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IF9jb250YWluZXJSZWYkY3VycmVudC5oZWlnaHQ7XG5cbiAgICAgIHZhciBvZmZTZXRQZXJjZW50O1xuXG4gICAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgICBjYXNlICdidHQnOlxuICAgICAgICAgIG9mZlNldFBlcmNlbnQgPSAtb2Zmc2V0WSAvIGhlaWdodDtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICd0dGInOlxuICAgICAgICAgIG9mZlNldFBlcmNlbnQgPSBvZmZzZXRZIC8gaGVpZ2h0O1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3J0bCc6XG4gICAgICAgICAgb2ZmU2V0UGVyY2VudCA9IC1vZmZzZXRYIC8gd2lkdGg7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBvZmZTZXRQZXJjZW50ID0gb2Zmc2V0WCAvIHdpZHRoO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGVDYWNoZVZhbHVlUmVmLmN1cnJlbnQodmFsdWVJbmRleCwgb2ZmU2V0UGVyY2VudCk7XG4gICAgfTsgLy8gRW5kXG5cblxuICAgIHZhciBvbk1vdXNlVXAgPSBmdW5jdGlvbiBvbk1vdXNlVXAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwKTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgb25Nb3VzZVVwKTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICAgIG1vdXNlTW92ZUV2ZW50UmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgbW91c2VVcEV2ZW50UmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgc2V0RHJhZ2dpbmdJbmRleCgtMSk7XG4gICAgICBmaW5pc2hDaGFuZ2UoKTtcbiAgICB9O1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgb25Nb3VzZVVwKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgbW91c2VNb3ZlRXZlbnRSZWYuY3VycmVudCA9IG9uTW91c2VNb3ZlO1xuICAgIG1vdXNlVXBFdmVudFJlZi5jdXJyZW50ID0gb25Nb3VzZVVwO1xuICB9OyAvLyBPbmx5IHJldHVybiBjYWNoZSB2YWx1ZSB3aGVuIGl0IG1hcHBpbmcgd2l0aCByYXdWYWx1ZXNcblxuXG4gIHZhciByZXR1cm5WYWx1ZXMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc291cmNlVmFsdWVzID0gX3RvQ29uc3VtYWJsZUFycmF5KHJhd1ZhbHVlcykuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEgLSBiO1xuICAgIH0pO1xuXG4gICAgdmFyIHRhcmdldFZhbHVlcyA9IF90b0NvbnN1bWFibGVBcnJheShjYWNoZVZhbHVlcykuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEgLSBiO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNvdXJjZVZhbHVlcy5ldmVyeShmdW5jdGlvbiAodmFsLCBpbmRleCkge1xuICAgICAgcmV0dXJuIHZhbCA9PT0gdGFyZ2V0VmFsdWVzW2luZGV4XTtcbiAgICB9KSA/IGNhY2hlVmFsdWVzIDogcmF3VmFsdWVzO1xuICB9LCBbcmF3VmFsdWVzLCBjYWNoZVZhbHVlc10pO1xuICByZXR1cm4gW2RyYWdnaW5nSW5kZXgsIGRyYWdnaW5nVmFsdWUsIHJldHVyblZhbHVlcywgb25TdGFydE1vdmVdO1xufSIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBTbGlkZXJDb250ZXh0IGZyb20gJy4uL2NvbnRleHQnO1xuaW1wb3J0IHsgZ2V0T2Zmc2V0IH0gZnJvbSAnLi4vdXRpbCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBUcmFjayhwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICAgIHN0YXJ0ID0gcHJvcHMuc3RhcnQsXG4gICAgICBlbmQgPSBwcm9wcy5lbmQsXG4gICAgICBpbmRleCA9IHByb3BzLmluZGV4LFxuICAgICAgb25TdGFydE1vdmUgPSBwcm9wcy5vblN0YXJ0TW92ZTtcblxuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFNsaWRlckNvbnRleHQpLFxuICAgICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uLFxuICAgICAgbWluID0gX1JlYWN0JHVzZUNvbnRleHQubWluLFxuICAgICAgbWF4ID0gX1JlYWN0JHVzZUNvbnRleHQubWF4LFxuICAgICAgZGlzYWJsZWQgPSBfUmVhY3QkdXNlQ29udGV4dC5kaXNhYmxlZCxcbiAgICAgIHJhbmdlID0gX1JlYWN0JHVzZUNvbnRleHQucmFuZ2U7XG5cbiAgdmFyIHRyYWNrUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10cmFja1wiKTtcbiAgdmFyIG9mZnNldFN0YXJ0ID0gZ2V0T2Zmc2V0KHN0YXJ0LCBtaW4sIG1heCk7XG4gIHZhciBvZmZzZXRFbmQgPSBnZXRPZmZzZXQoZW5kLCBtaW4sIG1heCk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRXZlbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgb25JbnRlcm5hbFN0YXJ0TW92ZSA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxTdGFydE1vdmUoZSkge1xuICAgIGlmICghZGlzYWJsZWQgJiYgb25TdGFydE1vdmUpIHtcbiAgICAgIG9uU3RhcnRNb3ZlKGUsIC0xKTtcbiAgICB9XG4gIH07IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIHZhciBwb3NpdGlvblN0eWxlID0ge307XG5cbiAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICBjYXNlICdydGwnOlxuICAgICAgcG9zaXRpb25TdHlsZS5yaWdodCA9IFwiXCIuY29uY2F0KG9mZnNldFN0YXJ0ICogMTAwLCBcIiVcIik7XG4gICAgICBwb3NpdGlvblN0eWxlLndpZHRoID0gXCJcIi5jb25jYXQob2Zmc2V0RW5kICogMTAwIC0gb2Zmc2V0U3RhcnQgKiAxMDAsIFwiJVwiKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnYnR0JzpcbiAgICAgIHBvc2l0aW9uU3R5bGUuYm90dG9tID0gXCJcIi5jb25jYXQob2Zmc2V0U3RhcnQgKiAxMDAsIFwiJVwiKTtcbiAgICAgIHBvc2l0aW9uU3R5bGUuaGVpZ2h0ID0gXCJcIi5jb25jYXQob2Zmc2V0RW5kICogMTAwIC0gb2Zmc2V0U3RhcnQgKiAxMDAsIFwiJVwiKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndHRiJzpcbiAgICAgIHBvc2l0aW9uU3R5bGUudG9wID0gXCJcIi5jb25jYXQob2Zmc2V0U3RhcnQgKiAxMDAsIFwiJVwiKTtcbiAgICAgIHBvc2l0aW9uU3R5bGUuaGVpZ2h0ID0gXCJcIi5jb25jYXQob2Zmc2V0RW5kICogMTAwIC0gb2Zmc2V0U3RhcnQgKiAxMDAsIFwiJVwiKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHBvc2l0aW9uU3R5bGUubGVmdCA9IFwiXCIuY29uY2F0KG9mZnNldFN0YXJ0ICogMTAwLCBcIiVcIik7XG4gICAgICBwb3NpdGlvblN0eWxlLndpZHRoID0gXCJcIi5jb25jYXQob2Zmc2V0RW5kICogMTAwIC0gb2Zmc2V0U3RhcnQgKiAxMDAsIFwiJVwiKTtcbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKHRyYWNrUHJlZml4Q2xzLCByYW5nZSAmJiBcIlwiLmNvbmNhdCh0cmFja1ByZWZpeENscywgXCItXCIpLmNvbmNhdChpbmRleCArIDEpKSxcbiAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwb3NpdGlvblN0eWxlKSwgc3R5bGUpLFxuICAgIG9uTW91c2VEb3duOiBvbkludGVybmFsU3RhcnRNb3ZlLFxuICAgIG9uVG91Y2hTdGFydDogb25JbnRlcm5hbFN0YXJ0TW92ZVxuICB9KTtcbn0iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgU2xpZGVyQ29udGV4dCBmcm9tICcuLi9jb250ZXh0JztcbmltcG9ydCBUcmFjayBmcm9tICcuL1RyYWNrJztcbmltcG9ydCB7IGdldEluZGV4IH0gZnJvbSAnLi4vdXRpbCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBUcmFja3MocHJvcHMpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgICB2YWx1ZXMgPSBwcm9wcy52YWx1ZXMsXG4gICAgICBzdGFydFBvaW50ID0gcHJvcHMuc3RhcnRQb2ludCxcbiAgICAgIG9uU3RhcnRNb3ZlID0gcHJvcHMub25TdGFydE1vdmU7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChTbGlkZXJDb250ZXh0KSxcbiAgICAgIGluY2x1ZGVkID0gX1JlYWN0JHVzZUNvbnRleHQuaW5jbHVkZWQsXG4gICAgICByYW5nZSA9IF9SZWFjdCR1c2VDb250ZXh0LnJhbmdlLFxuICAgICAgbWluID0gX1JlYWN0JHVzZUNvbnRleHQubWluO1xuXG4gIHZhciB0cmFja0xpc3QgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXJhbmdlKSB7XG4gICAgICAvLyBudWxsIHZhbHVlIGRvIG5vdCBoYXZlIHRyYWNrXG4gICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIHZhciBzdGFydFZhbHVlID0gc3RhcnRQb2ludCAhPT0gbnVsbCAmJiBzdGFydFBvaW50ICE9PSB2b2lkIDAgPyBzdGFydFBvaW50IDogbWluO1xuICAgICAgdmFyIGVuZFZhbHVlID0gdmFsdWVzWzBdO1xuICAgICAgcmV0dXJuIFt7XG4gICAgICAgIHN0YXJ0OiBNYXRoLm1pbihzdGFydFZhbHVlLCBlbmRWYWx1ZSksXG4gICAgICAgIGVuZDogTWF0aC5tYXgoc3RhcnRWYWx1ZSwgZW5kVmFsdWUpXG4gICAgICB9XTtcbiAgICB9IC8vIE11bHRpcGxlXG5cblxuICAgIHZhciBsaXN0ID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGggLSAxOyBpICs9IDEpIHtcbiAgICAgIGxpc3QucHVzaCh7XG4gICAgICAgIHN0YXJ0OiB2YWx1ZXNbaV0sXG4gICAgICAgIGVuZDogdmFsdWVzW2kgKyAxXVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpc3Q7XG4gIH0sIFt2YWx1ZXMsIHJhbmdlLCBzdGFydFBvaW50LCBtaW5dKTtcbiAgcmV0dXJuIGluY2x1ZGVkID8gdHJhY2tMaXN0Lm1hcChmdW5jdGlvbiAoX3JlZiwgaW5kZXgpIHtcbiAgICB2YXIgc3RhcnQgPSBfcmVmLnN0YXJ0LFxuICAgICAgICBlbmQgPSBfcmVmLmVuZDtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVHJhY2ssIHtcbiAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgc3R5bGU6IGdldEluZGV4KHN0eWxlLCBpbmRleCksXG4gICAgICBzdGFydDogc3RhcnQsXG4gICAgICBlbmQ6IGVuZCxcbiAgICAgIGtleTogaW5kZXgsXG4gICAgICBvblN0YXJ0TW92ZTogb25TdGFydE1vdmVcbiAgICB9KTtcbiAgfSkgOiBudWxsO1xufSIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBnZXREaXJlY3Rpb25TdHlsZSB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IFNsaWRlckNvbnRleHQgZnJvbSAnLi4vY29udGV4dCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNYXJrKHByb3BzKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgICBfb25DbGljayA9IHByb3BzLm9uQ2xpY2s7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChTbGlkZXJDb250ZXh0KSxcbiAgICAgIG1pbiA9IF9SZWFjdCR1c2VDb250ZXh0Lm1pbixcbiAgICAgIG1heCA9IF9SZWFjdCR1c2VDb250ZXh0Lm1heCxcbiAgICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbixcbiAgICAgIGluY2x1ZGVkU3RhcnQgPSBfUmVhY3QkdXNlQ29udGV4dC5pbmNsdWRlZFN0YXJ0LFxuICAgICAgaW5jbHVkZWRFbmQgPSBfUmVhY3QkdXNlQ29udGV4dC5pbmNsdWRlZEVuZCxcbiAgICAgIGluY2x1ZGVkID0gX1JlYWN0JHVzZUNvbnRleHQuaW5jbHVkZWQ7XG5cbiAgdmFyIHRleHRDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRleHRcIik7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gT2Zmc2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgcG9zaXRpb25TdHlsZSA9IGdldERpcmVjdGlvblN0eWxlKGRpcmVjdGlvbiwgdmFsdWUsIG1pbiwgbWF4KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKHRleHRDbHMsIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQodGV4dENscywgXCItYWN0aXZlXCIpLCBpbmNsdWRlZCAmJiBpbmNsdWRlZFN0YXJ0IDw9IHZhbHVlICYmIHZhbHVlIDw9IGluY2x1ZGVkRW5kKSksXG4gICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcG9zaXRpb25TdHlsZSksIHN0eWxlKSxcbiAgICBvbk1vdXNlRG93bjogZnVuY3Rpb24gb25Nb3VzZURvd24oZSkge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9LFxuICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICBfb25DbGljayh2YWx1ZSk7XG4gICAgfVxuICB9LCBjaGlsZHJlbik7XG59IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IE1hcmsgZnJvbSAnLi9NYXJrJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE1hcmtzKHByb3BzKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICBtYXJrcyA9IHByb3BzLm1hcmtzLFxuICAgICAgb25DbGljayA9IHByb3BzLm9uQ2xpY2s7XG4gIHZhciBtYXJrUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1tYXJrXCIpOyAvLyBOb3QgcmVuZGVyIG1hcmsgaWYgZW1wdHlcblxuICBpZiAoIW1hcmtzLmxlbmd0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IG1hcmtQcmVmaXhDbHNcbiAgfSwgbWFya3MubWFwKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIHZhbHVlID0gX3JlZi52YWx1ZSxcbiAgICAgICAgc3R5bGUgPSBfcmVmLnN0eWxlLFxuICAgICAgICBsYWJlbCA9IF9yZWYubGFiZWw7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE1hcmssIHtcbiAgICAgIGtleTogdmFsdWUsXG4gICAgICBwcmVmaXhDbHM6IG1hcmtQcmVmaXhDbHMsXG4gICAgICBzdHlsZTogc3R5bGUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBvbkNsaWNrOiBvbkNsaWNrXG4gICAgfSwgbGFiZWwpO1xuICB9KSk7XG59IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IGdldERpcmVjdGlvblN0eWxlIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgU2xpZGVyQ29udGV4dCBmcm9tICcuLi9jb250ZXh0JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIERvdChwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgICBhY3RpdmVTdHlsZSA9IHByb3BzLmFjdGl2ZVN0eWxlO1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoU2xpZGVyQ29udGV4dCksXG4gICAgICBtaW4gPSBfUmVhY3QkdXNlQ29udGV4dC5taW4sXG4gICAgICBtYXggPSBfUmVhY3QkdXNlQ29udGV4dC5tYXgsXG4gICAgICBkaXJlY3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb24sXG4gICAgICBpbmNsdWRlZCA9IF9SZWFjdCR1c2VDb250ZXh0LmluY2x1ZGVkLFxuICAgICAgaW5jbHVkZWRTdGFydCA9IF9SZWFjdCR1c2VDb250ZXh0LmluY2x1ZGVkU3RhcnQsXG4gICAgICBpbmNsdWRlZEVuZCA9IF9SZWFjdCR1c2VDb250ZXh0LmluY2x1ZGVkRW5kO1xuXG4gIHZhciBkb3RDbGFzc05hbWUgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRvdFwiKTtcbiAgdmFyIGFjdGl2ZSA9IGluY2x1ZGVkICYmIGluY2x1ZGVkU3RhcnQgPD0gdmFsdWUgJiYgdmFsdWUgPD0gaW5jbHVkZWRFbmQ7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gT2Zmc2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgbWVyZ2VkU3R5bGUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGdldERpcmVjdGlvblN0eWxlKGRpcmVjdGlvbiwgdmFsdWUsIG1pbiwgbWF4KSksIHR5cGVvZiBzdHlsZSA9PT0gJ2Z1bmN0aW9uJyA/IHN0eWxlKHZhbHVlKSA6IHN0eWxlKTtcblxuICBpZiAoYWN0aXZlKSB7XG4gICAgbWVyZ2VkU3R5bGUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG1lcmdlZFN0eWxlKSwgdHlwZW9mIGFjdGl2ZVN0eWxlID09PSAnZnVuY3Rpb24nID8gYWN0aXZlU3R5bGUodmFsdWUpIDogYWN0aXZlU3R5bGUpO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGRvdENsYXNzTmFtZSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChkb3RDbGFzc05hbWUsIFwiLWFjdGl2ZVwiKSwgYWN0aXZlKSksXG4gICAgc3R5bGU6IG1lcmdlZFN0eWxlXG4gIH0pO1xufSIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBTbGlkZXJDb250ZXh0IGZyb20gJy4uL2NvbnRleHQnO1xuaW1wb3J0IERvdCBmcm9tICcuL0RvdCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBTdGVwcyhwcm9wcykge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgbWFya3MgPSBwcm9wcy5tYXJrcyxcbiAgICAgIGRvdHMgPSBwcm9wcy5kb3RzLFxuICAgICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICAgIGFjdGl2ZVN0eWxlID0gcHJvcHMuYWN0aXZlU3R5bGU7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChTbGlkZXJDb250ZXh0KSxcbiAgICAgIG1pbiA9IF9SZWFjdCR1c2VDb250ZXh0Lm1pbixcbiAgICAgIG1heCA9IF9SZWFjdCR1c2VDb250ZXh0Lm1heCxcbiAgICAgIHN0ZXAgPSBfUmVhY3QkdXNlQ29udGV4dC5zdGVwO1xuXG4gIHZhciBzdGVwRG90cyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBkb3RTZXQgPSBuZXcgU2V0KCk7IC8vIEFkZCBtYXJrc1xuXG4gICAgbWFya3MuZm9yRWFjaChmdW5jdGlvbiAobWFyaykge1xuICAgICAgZG90U2V0LmFkZChtYXJrLnZhbHVlKTtcbiAgICB9KTsgLy8gRmlsbCBkb3RzXG5cbiAgICBpZiAoZG90cyAmJiBzdGVwICE9PSBudWxsKSB7XG4gICAgICB2YXIgY3VycmVudCA9IG1pbjtcblxuICAgICAgd2hpbGUgKGN1cnJlbnQgPD0gbWF4KSB7XG4gICAgICAgIGRvdFNldC5hZGQoY3VycmVudCk7XG4gICAgICAgIGN1cnJlbnQgKz0gc3RlcDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShkb3RTZXQpO1xuICB9LCBbbWluLCBtYXgsIHN0ZXAsIGRvdHMsIG1hcmtzXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN0ZXBcIilcbiAgfSwgc3RlcERvdHMubWFwKGZ1bmN0aW9uIChkb3RWYWx1ZSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEb3QsIHtcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAga2V5OiBkb3RWYWx1ZSxcbiAgICAgIHZhbHVlOiBkb3RWYWx1ZSxcbiAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgIGFjdGl2ZVN0eWxlOiBhY3RpdmVTdHlsZVxuICAgIH0pO1xuICB9KSk7XG59IiwiaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZU9mZnNldChtaW4sIG1heCwgc3RlcCwgbWFya0xpc3QsIGFsbG93Q3Jvc3MsIHB1c2hhYmxlKSB7XG4gIHZhciBmb3JtYXRSYW5nZVZhbHVlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHZhbCkge1xuICAgIHZhciBmb3JtYXROZXh0VmFsdWUgPSBpc0Zpbml0ZSh2YWwpID8gdmFsIDogbWluO1xuICAgIGZvcm1hdE5leHRWYWx1ZSA9IE1hdGgubWluKG1heCwgdmFsKTtcbiAgICBmb3JtYXROZXh0VmFsdWUgPSBNYXRoLm1heChtaW4sIGZvcm1hdE5leHRWYWx1ZSk7XG4gICAgcmV0dXJuIGZvcm1hdE5leHRWYWx1ZTtcbiAgfSwgW21pbiwgbWF4XSk7XG4gIHZhciBmb3JtYXRTdGVwVmFsdWUgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodmFsKSB7XG4gICAgaWYgKHN0ZXAgIT09IG51bGwpIHtcbiAgICAgIHZhciBzdGVwVmFsdWUgPSBtaW4gKyBNYXRoLnJvdW5kKChmb3JtYXRSYW5nZVZhbHVlKHZhbCkgLSBtaW4pIC8gc3RlcCkgKiBzdGVwOyAvLyBDdXQgbnVtYmVyIGluIGNhc2UgdG8gYmUgbGlrZSAwLjMwMDAwMDAwMDAwMDAwMDA0XG5cbiAgICAgIHZhciBnZXREZWNpbWFsID0gZnVuY3Rpb24gZ2V0RGVjaW1hbChudW0pIHtcbiAgICAgICAgcmV0dXJuIChTdHJpbmcobnVtKS5zcGxpdCgnLicpWzFdIHx8ICcnKS5sZW5ndGg7XG4gICAgICB9O1xuXG4gICAgICB2YXIgbWF4RGVjaW1hbCA9IE1hdGgubWF4KGdldERlY2ltYWwoc3RlcCksIGdldERlY2ltYWwobWF4KSwgZ2V0RGVjaW1hbChtaW4pKTtcbiAgICAgIHZhciBmaXhlZFZhbHVlID0gTnVtYmVyKHN0ZXBWYWx1ZS50b0ZpeGVkKG1heERlY2ltYWwpKTtcbiAgICAgIHJldHVybiBtaW4gPD0gZml4ZWRWYWx1ZSAmJiBmaXhlZFZhbHVlIDw9IG1heCA/IGZpeGVkVmFsdWUgOiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9LCBbc3RlcCwgbWluLCBtYXgsIGZvcm1hdFJhbmdlVmFsdWVdKTtcbiAgdmFyIGZvcm1hdFZhbHVlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHZhbCkge1xuICAgIHZhciBmb3JtYXROZXh0VmFsdWUgPSBmb3JtYXRSYW5nZVZhbHVlKHZhbCk7IC8vIExpc3QgYWxpZ24gdmFsdWVzXG5cbiAgICB2YXIgYWxpZ25WYWx1ZXMgPSBtYXJrTGlzdC5tYXAoZnVuY3Rpb24gKG1hcmspIHtcbiAgICAgIHJldHVybiBtYXJrLnZhbHVlO1xuICAgIH0pO1xuXG4gICAgaWYgKHN0ZXAgIT09IG51bGwpIHtcbiAgICAgIGFsaWduVmFsdWVzLnB1c2goZm9ybWF0U3RlcFZhbHVlKHZhbCkpO1xuICAgIH0gLy8gbWluICYgbWF4XG5cblxuICAgIGFsaWduVmFsdWVzLnB1c2gobWluLCBtYXgpOyAvLyBBbGlnbiB3aXRoIG1hcmtzXG5cbiAgICB2YXIgY2xvc2VWYWx1ZSA9IGFsaWduVmFsdWVzWzBdO1xuICAgIHZhciBjbG9zZURpc3QgPSBtYXggLSBtaW47XG4gICAgYWxpZ25WYWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAoYWxpZ25WYWx1ZSkge1xuICAgICAgdmFyIGRpc3QgPSBNYXRoLmFicyhmb3JtYXROZXh0VmFsdWUgLSBhbGlnblZhbHVlKTtcblxuICAgICAgaWYgKGRpc3QgPD0gY2xvc2VEaXN0KSB7XG4gICAgICAgIGNsb3NlVmFsdWUgPSBhbGlnblZhbHVlO1xuICAgICAgICBjbG9zZURpc3QgPSBkaXN0O1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjbG9zZVZhbHVlO1xuICB9LCBbbWluLCBtYXgsIG1hcmtMaXN0LCBzdGVwLCBmb3JtYXRSYW5nZVZhbHVlLCBmb3JtYXRTdGVwVmFsdWVdKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gT2Zmc2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFNpbmdsZSBWYWx1ZVxuXG4gIHZhciBvZmZzZXRWYWx1ZSA9IGZ1bmN0aW9uIG9mZnNldFZhbHVlKHZhbHVlcywgb2Zmc2V0LCB2YWx1ZUluZGV4KSB7XG4gICAgdmFyIG1vZGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6ICd1bml0JztcblxuICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnbnVtYmVyJykge1xuICAgICAgdmFyIG5leHRWYWx1ZTtcbiAgICAgIHZhciBvcmlnaW5WYWx1ZSA9IHZhbHVlc1t2YWx1ZUluZGV4XTsgLy8gT25seSB1c2VkIGZvciBgZGlzdGAgbW9kZVxuXG4gICAgICB2YXIgdGFyZ2V0RGlzdFZhbHVlID0gb3JpZ2luVmFsdWUgKyBvZmZzZXQ7IC8vIENvbXBhcmUgbmV4dCBzdGVwIHZhbHVlICYgbWFyayB2YWx1ZSB3aGljaCBpcyBiZXN0IG1hdGNoXG5cbiAgICAgIHZhciBwb3RlbnRpYWxWYWx1ZXMgPSBbXTtcbiAgICAgIG1hcmtMaXN0LmZvckVhY2goZnVuY3Rpb24gKG1hcmspIHtcbiAgICAgICAgcG90ZW50aWFsVmFsdWVzLnB1c2gobWFyay52YWx1ZSk7XG4gICAgICB9KTsgLy8gTWluICYgTWF4XG5cbiAgICAgIHBvdGVudGlhbFZhbHVlcy5wdXNoKG1pbiwgbWF4KTsgLy8gSW4gY2FzZSBvcmlnaW4gdmFsdWUgaXMgYWxpZ24gd2l0aCBtYXJrIGJ1dCBub3Qgd2l0aCBzdGVwXG5cbiAgICAgIHBvdGVudGlhbFZhbHVlcy5wdXNoKGZvcm1hdFN0ZXBWYWx1ZShvcmlnaW5WYWx1ZSkpOyAvLyBQdXQgb2Zmc2V0IHN0ZXAgdmFsdWUgYWxzb1xuXG4gICAgICB2YXIgc2lnbiA9IG9mZnNldCA+IDAgPyAxIDogLTE7XG5cbiAgICAgIGlmIChtb2RlID09PSAndW5pdCcpIHtcbiAgICAgICAgcG90ZW50aWFsVmFsdWVzLnB1c2goZm9ybWF0U3RlcFZhbHVlKG9yaWdpblZhbHVlICsgc2lnbiAqIHN0ZXApKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBvdGVudGlhbFZhbHVlcy5wdXNoKGZvcm1hdFN0ZXBWYWx1ZSh0YXJnZXREaXN0VmFsdWUpKTtcbiAgICAgIH0gLy8gRmluZCBjbG9zZSBvbmVcblxuXG4gICAgICBwb3RlbnRpYWxWYWx1ZXMgPSBwb3RlbnRpYWxWYWx1ZXMuZmlsdGVyKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgcmV0dXJuIHZhbCAhPT0gbnVsbDtcbiAgICAgIH0pIC8vIFJlbW92ZSByZXZlcnNlIHZhbHVlXG4gICAgICAuZmlsdGVyKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA8IDAgPyB2YWwgPD0gb3JpZ2luVmFsdWUgOiB2YWwgPj0gb3JpZ2luVmFsdWU7XG4gICAgICB9KTtcblxuICAgICAgaWYgKG1vZGUgPT09ICd1bml0Jykge1xuICAgICAgICAvLyBgdW5pdGAgbW9kZSBjYW4gbm90IGNvbnRhaW4gaXRzZWxmXG4gICAgICAgIHBvdGVudGlhbFZhbHVlcyA9IHBvdGVudGlhbFZhbHVlcy5maWx0ZXIoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgIHJldHVybiB2YWwgIT09IG9yaWdpblZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbXBhcmVWYWx1ZSA9IG1vZGUgPT09ICd1bml0JyA/IG9yaWdpblZhbHVlIDogdGFyZ2V0RGlzdFZhbHVlO1xuICAgICAgbmV4dFZhbHVlID0gcG90ZW50aWFsVmFsdWVzWzBdO1xuICAgICAgdmFyIHZhbHVlRGlzdCA9IE1hdGguYWJzKG5leHRWYWx1ZSAtIGNvbXBhcmVWYWx1ZSk7XG4gICAgICBwb3RlbnRpYWxWYWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAocG90ZW50aWFsVmFsdWUpIHtcbiAgICAgICAgdmFyIGRpc3QgPSBNYXRoLmFicyhwb3RlbnRpYWxWYWx1ZSAtIGNvbXBhcmVWYWx1ZSk7XG5cbiAgICAgICAgaWYgKGRpc3QgPCB2YWx1ZURpc3QpIHtcbiAgICAgICAgICBuZXh0VmFsdWUgPSBwb3RlbnRpYWxWYWx1ZTtcbiAgICAgICAgICB2YWx1ZURpc3QgPSBkaXN0O1xuICAgICAgICB9XG4gICAgICB9KTsgLy8gT3V0IG9mIHJhbmdlIHdpbGwgYmFjayB0byByYW5nZVxuXG4gICAgICBpZiAobmV4dFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA8IDAgPyBtaW4gOiBtYXg7XG4gICAgICB9IC8vIGBkaXN0YCBtb2RlXG5cblxuICAgICAgaWYgKG1vZGUgPT09ICdkaXN0Jykge1xuICAgICAgICByZXR1cm4gbmV4dFZhbHVlO1xuICAgICAgfSAvLyBgdW5pdGAgbW9kZSBtYXkgbmVlZCBhbm90aGVyIHJvdW5kXG5cblxuICAgICAgaWYgKE1hdGguYWJzKG9mZnNldCkgPiAxKSB7XG4gICAgICAgIHZhciBjbG9uZVZhbHVlcyA9IF90b0NvbnN1bWFibGVBcnJheSh2YWx1ZXMpO1xuXG4gICAgICAgIGNsb25lVmFsdWVzW3ZhbHVlSW5kZXhdID0gbmV4dFZhbHVlO1xuICAgICAgICByZXR1cm4gb2Zmc2V0VmFsdWUoY2xvbmVWYWx1ZXMsIG9mZnNldCAtIHNpZ24sIHZhbHVlSW5kZXgsIG1vZGUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV4dFZhbHVlO1xuICAgIH0gZWxzZSBpZiAob2Zmc2V0ID09PSAnbWluJykge1xuICAgICAgcmV0dXJuIG1pbjtcbiAgICB9IGVsc2UgaWYgKG9mZnNldCA9PT0gJ21heCcpIHtcbiAgICAgIHJldHVybiBtYXg7XG4gICAgfVxuICB9O1xuICAvKiogU2FtZSBhcyBgb2Zmc2V0VmFsdWVgIGJ1dCByZXR1cm4gYGNoYW5nZWRgIG1hcmsgdG8gdGVsbCB2YWx1ZSBjaGFuZ2VkICovXG5cblxuICB2YXIgb2Zmc2V0Q2hhbmdlZFZhbHVlID0gZnVuY3Rpb24gb2Zmc2V0Q2hhbmdlZFZhbHVlKHZhbHVlcywgb2Zmc2V0LCB2YWx1ZUluZGV4KSB7XG4gICAgdmFyIG1vZGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6ICd1bml0JztcbiAgICB2YXIgb3JpZ2luVmFsdWUgPSB2YWx1ZXNbdmFsdWVJbmRleF07XG4gICAgdmFyIG5leHRWYWx1ZSA9IG9mZnNldFZhbHVlKHZhbHVlcywgb2Zmc2V0LCB2YWx1ZUluZGV4LCBtb2RlKTtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IG5leHRWYWx1ZSxcbiAgICAgIGNoYW5nZWQ6IG5leHRWYWx1ZSAhPT0gb3JpZ2luVmFsdWVcbiAgICB9O1xuICB9O1xuXG4gIHZhciBuZWVkUHVzaCA9IGZ1bmN0aW9uIG5lZWRQdXNoKGRpc3QpIHtcbiAgICByZXR1cm4gcHVzaGFibGUgPT09IG51bGwgJiYgZGlzdCA9PT0gMCB8fCB0eXBlb2YgcHVzaGFibGUgPT09ICdudW1iZXInICYmIGRpc3QgPCBwdXNoYWJsZTtcbiAgfTsgLy8gVmFsdWVzXG5cblxuICB2YXIgb2Zmc2V0VmFsdWVzID0gZnVuY3Rpb24gb2Zmc2V0VmFsdWVzKHZhbHVlcywgb2Zmc2V0LCB2YWx1ZUluZGV4KSB7XG4gICAgdmFyIG1vZGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6ICd1bml0JztcbiAgICB2YXIgbmV4dFZhbHVlcyA9IHZhbHVlcy5tYXAoZm9ybWF0VmFsdWUpO1xuICAgIHZhciBvcmlnaW5WYWx1ZSA9IG5leHRWYWx1ZXNbdmFsdWVJbmRleF07XG4gICAgdmFyIG5leHRWYWx1ZSA9IG9mZnNldFZhbHVlKG5leHRWYWx1ZXMsIG9mZnNldCwgdmFsdWVJbmRleCwgbW9kZSk7XG4gICAgbmV4dFZhbHVlc1t2YWx1ZUluZGV4XSA9IG5leHRWYWx1ZTtcblxuICAgIGlmIChhbGxvd0Nyb3NzID09PSBmYWxzZSkge1xuICAgICAgLy8gPj4+Pj4gQWxsb3cgQ3Jvc3NcbiAgICAgIHZhciBwdXNoTnVtID0gcHVzaGFibGUgfHwgMDsgLy8gPT09PT09PT09PT09IEFsbG93Q3Jvc3MgPT09PT09PT09PT09PT09XG5cbiAgICAgIGlmICh2YWx1ZUluZGV4ID4gMCAmJiBuZXh0VmFsdWVzW3ZhbHVlSW5kZXggLSAxXSAhPT0gb3JpZ2luVmFsdWUpIHtcbiAgICAgICAgbmV4dFZhbHVlc1t2YWx1ZUluZGV4XSA9IE1hdGgubWF4KG5leHRWYWx1ZXNbdmFsdWVJbmRleF0sIG5leHRWYWx1ZXNbdmFsdWVJbmRleCAtIDFdICsgcHVzaE51bSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZUluZGV4IDwgbmV4dFZhbHVlcy5sZW5ndGggLSAxICYmIG5leHRWYWx1ZXNbdmFsdWVJbmRleCArIDFdICE9PSBvcmlnaW5WYWx1ZSkge1xuICAgICAgICBuZXh0VmFsdWVzW3ZhbHVlSW5kZXhdID0gTWF0aC5taW4obmV4dFZhbHVlc1t2YWx1ZUluZGV4XSwgbmV4dFZhbHVlc1t2YWx1ZUluZGV4ICsgMV0gLSBwdXNoTnVtKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwdXNoYWJsZSA9PT0gJ251bWJlcicgfHwgcHVzaGFibGUgPT09IG51bGwpIHtcbiAgICAgIC8vID4+Pj4+IFB1c2hhYmxlXG4gICAgICAvLyA9PT09PT09PT09PT09PT0gUHVzaCA9PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vID4+Pj4+PiBCYXNpYyBwdXNoXG4gICAgICAvLyBFbmQgdmFsdWVzXG4gICAgICBmb3IgKHZhciBpID0gdmFsdWVJbmRleCArIDE7IGkgPCBuZXh0VmFsdWVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBjaGFuZ2VkID0gdHJ1ZTtcblxuICAgICAgICB3aGlsZSAobmVlZFB1c2gobmV4dFZhbHVlc1tpXSAtIG5leHRWYWx1ZXNbaSAtIDFdKSAmJiBjaGFuZ2VkKSB7XG4gICAgICAgICAgdmFyIF9vZmZzZXRDaGFuZ2VkVmFsdWUgPSBvZmZzZXRDaGFuZ2VkVmFsdWUobmV4dFZhbHVlcywgMSwgaSk7XG5cbiAgICAgICAgICBuZXh0VmFsdWVzW2ldID0gX29mZnNldENoYW5nZWRWYWx1ZS52YWx1ZTtcbiAgICAgICAgICBjaGFuZ2VkID0gX29mZnNldENoYW5nZWRWYWx1ZS5jaGFuZ2VkO1xuICAgICAgICB9XG4gICAgICB9IC8vIFN0YXJ0IHZhbHVlc1xuXG5cbiAgICAgIGZvciAodmFyIF9pID0gdmFsdWVJbmRleDsgX2kgPiAwOyBfaSAtPSAxKSB7XG4gICAgICAgIHZhciBfY2hhbmdlZCA9IHRydWU7XG5cbiAgICAgICAgd2hpbGUgKG5lZWRQdXNoKG5leHRWYWx1ZXNbX2ldIC0gbmV4dFZhbHVlc1tfaSAtIDFdKSAmJiBfY2hhbmdlZCkge1xuICAgICAgICAgIHZhciBfb2Zmc2V0Q2hhbmdlZFZhbHVlMiA9IG9mZnNldENoYW5nZWRWYWx1ZShuZXh0VmFsdWVzLCAtMSwgX2kgLSAxKTtcblxuICAgICAgICAgIG5leHRWYWx1ZXNbX2kgLSAxXSA9IF9vZmZzZXRDaGFuZ2VkVmFsdWUyLnZhbHVlO1xuICAgICAgICAgIF9jaGFuZ2VkID0gX29mZnNldENoYW5nZWRWYWx1ZTIuY2hhbmdlZDtcbiAgICAgICAgfVxuICAgICAgfSAvLyA+Pj4+PiBSZXZlcnQgYmFjayB0byBzYWZlIHB1c2ggcmFuZ2VcbiAgICAgIC8vIEVuZCB0byBTdGFydFxuXG5cbiAgICAgIGZvciAodmFyIF9pMiA9IG5leHRWYWx1ZXMubGVuZ3RoIC0gMTsgX2kyID4gMDsgX2kyIC09IDEpIHtcbiAgICAgICAgdmFyIF9jaGFuZ2VkMiA9IHRydWU7XG5cbiAgICAgICAgd2hpbGUgKG5lZWRQdXNoKG5leHRWYWx1ZXNbX2kyXSAtIG5leHRWYWx1ZXNbX2kyIC0gMV0pICYmIF9jaGFuZ2VkMikge1xuICAgICAgICAgIHZhciBfb2Zmc2V0Q2hhbmdlZFZhbHVlMyA9IG9mZnNldENoYW5nZWRWYWx1ZShuZXh0VmFsdWVzLCAtMSwgX2kyIC0gMSk7XG5cbiAgICAgICAgICBuZXh0VmFsdWVzW19pMiAtIDFdID0gX29mZnNldENoYW5nZWRWYWx1ZTMudmFsdWU7XG4gICAgICAgICAgX2NoYW5nZWQyID0gX29mZnNldENoYW5nZWRWYWx1ZTMuY2hhbmdlZDtcbiAgICAgICAgfVxuICAgICAgfSAvLyBTdGFydCB0byBFbmRcblxuXG4gICAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBuZXh0VmFsdWVzLmxlbmd0aCAtIDE7IF9pMyArPSAxKSB7XG4gICAgICAgIHZhciBfY2hhbmdlZDMgPSB0cnVlO1xuXG4gICAgICAgIHdoaWxlIChuZWVkUHVzaChuZXh0VmFsdWVzW19pMyArIDFdIC0gbmV4dFZhbHVlc1tfaTNdKSAmJiBfY2hhbmdlZDMpIHtcbiAgICAgICAgICB2YXIgX29mZnNldENoYW5nZWRWYWx1ZTQgPSBvZmZzZXRDaGFuZ2VkVmFsdWUobmV4dFZhbHVlcywgMSwgX2kzICsgMSk7XG5cbiAgICAgICAgICBuZXh0VmFsdWVzW19pMyArIDFdID0gX29mZnNldENoYW5nZWRWYWx1ZTQudmFsdWU7XG4gICAgICAgICAgX2NoYW5nZWQzID0gX29mZnNldENoYW5nZWRWYWx1ZTQuY2hhbmdlZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogbmV4dFZhbHVlc1t2YWx1ZUluZGV4XSxcbiAgICAgIHZhbHVlczogbmV4dFZhbHVlc1xuICAgIH07XG4gIH07XG5cbiAgcmV0dXJuIFtmb3JtYXRWYWx1ZSwgb2Zmc2V0VmFsdWVzXTtcbn0iLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgc2hhbGxvd0VxdWFsIGZyb20gJ3NoYWxsb3dlcXVhbCc7XG5pbXBvcnQgdXNlTWVyZ2VkU3RhdGUgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTWVyZ2VkU3RhdGVcIjtcbmltcG9ydCBIYW5kbGVzIGZyb20gJy4vSGFuZGxlcyc7XG5pbXBvcnQgdXNlRHJhZyBmcm9tICcuL2hvb2tzL3VzZURyYWcnO1xuaW1wb3J0IFNsaWRlckNvbnRleHQgZnJvbSAnLi9jb250ZXh0JztcbmltcG9ydCBUcmFja3MgZnJvbSAnLi9UcmFja3MnO1xuaW1wb3J0IE1hcmtzIGZyb20gJy4vTWFya3MnO1xuaW1wb3J0IFN0ZXBzIGZyb20gJy4vU3RlcHMnO1xuaW1wb3J0IHVzZU9mZnNldCBmcm9tICcuL2hvb2tzL3VzZU9mZnNldCc7XG5pbXBvcnQgd2FybmluZyBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG52YXIgU2xpZGVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuXG4gIHZhciBfcHJvcHMkcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgICAgcHJlZml4Q2xzID0gX3Byb3BzJHByZWZpeENscyA9PT0gdm9pZCAwID8gJ3JjLXNsaWRlcicgOiBfcHJvcHMkcHJlZml4Q2xzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICAgIF9wcm9wcyRkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgICAgZGlzYWJsZWQgPSBfcHJvcHMkZGlzYWJsZWQgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGRpc2FibGVkLFxuICAgICAgYXV0b0ZvY3VzID0gcHJvcHMuYXV0b0ZvY3VzLFxuICAgICAgb25Gb2N1cyA9IHByb3BzLm9uRm9jdXMsXG4gICAgICBvbkJsdXIgPSBwcm9wcy5vbkJsdXIsXG4gICAgICBfcHJvcHMkbWluID0gcHJvcHMubWluLFxuICAgICAgbWluID0gX3Byb3BzJG1pbiA9PT0gdm9pZCAwID8gMCA6IF9wcm9wcyRtaW4sXG4gICAgICBfcHJvcHMkbWF4ID0gcHJvcHMubWF4LFxuICAgICAgbWF4ID0gX3Byb3BzJG1heCA9PT0gdm9pZCAwID8gMTAwIDogX3Byb3BzJG1heCxcbiAgICAgIF9wcm9wcyRzdGVwID0gcHJvcHMuc3RlcCxcbiAgICAgIHN0ZXAgPSBfcHJvcHMkc3RlcCA9PT0gdm9pZCAwID8gMSA6IF9wcm9wcyRzdGVwLFxuICAgICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICAgIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZSxcbiAgICAgIHJhbmdlID0gcHJvcHMucmFuZ2UsXG4gICAgICBjb3VudCA9IHByb3BzLmNvdW50LFxuICAgICAgb25DaGFuZ2UgPSBwcm9wcy5vbkNoYW5nZSxcbiAgICAgIG9uQmVmb3JlQ2hhbmdlID0gcHJvcHMub25CZWZvcmVDaGFuZ2UsXG4gICAgICBvbkFmdGVyQ2hhbmdlID0gcHJvcHMub25BZnRlckNoYW5nZSxcbiAgICAgIF9wcm9wcyRhbGxvd0Nyb3NzID0gcHJvcHMuYWxsb3dDcm9zcyxcbiAgICAgIGFsbG93Q3Jvc3MgPSBfcHJvcHMkYWxsb3dDcm9zcyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRhbGxvd0Nyb3NzLFxuICAgICAgX3Byb3BzJHB1c2hhYmxlID0gcHJvcHMucHVzaGFibGUsXG4gICAgICBwdXNoYWJsZSA9IF9wcm9wcyRwdXNoYWJsZSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkcHVzaGFibGUsXG4gICAgICBkcmFnZ2FibGVUcmFjayA9IHByb3BzLmRyYWdnYWJsZVRyYWNrLFxuICAgICAgcmV2ZXJzZSA9IHByb3BzLnJldmVyc2UsXG4gICAgICB2ZXJ0aWNhbCA9IHByb3BzLnZlcnRpY2FsLFxuICAgICAgX3Byb3BzJGluY2x1ZGVkID0gcHJvcHMuaW5jbHVkZWQsXG4gICAgICBpbmNsdWRlZCA9IF9wcm9wcyRpbmNsdWRlZCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRpbmNsdWRlZCxcbiAgICAgIHN0YXJ0UG9pbnQgPSBwcm9wcy5zdGFydFBvaW50LFxuICAgICAgdHJhY2tTdHlsZSA9IHByb3BzLnRyYWNrU3R5bGUsXG4gICAgICBoYW5kbGVTdHlsZSA9IHByb3BzLmhhbmRsZVN0eWxlLFxuICAgICAgcmFpbFN0eWxlID0gcHJvcHMucmFpbFN0eWxlLFxuICAgICAgZG90U3R5bGUgPSBwcm9wcy5kb3RTdHlsZSxcbiAgICAgIGFjdGl2ZURvdFN0eWxlID0gcHJvcHMuYWN0aXZlRG90U3R5bGUsXG4gICAgICBtYXJrcyA9IHByb3BzLm1hcmtzLFxuICAgICAgZG90cyA9IHByb3BzLmRvdHMsXG4gICAgICBoYW5kbGVSZW5kZXIgPSBwcm9wcy5oYW5kbGVSZW5kZXIsXG4gICAgICBfcHJvcHMkdGFiSW5kZXggPSBwcm9wcy50YWJJbmRleCxcbiAgICAgIHRhYkluZGV4ID0gX3Byb3BzJHRhYkluZGV4ID09PSB2b2lkIDAgPyAwIDogX3Byb3BzJHRhYkluZGV4LFxuICAgICAgYXJpYUxhYmVsRm9ySGFuZGxlID0gcHJvcHMuYXJpYUxhYmVsRm9ySGFuZGxlLFxuICAgICAgYXJpYUxhYmVsbGVkQnlGb3JIYW5kbGUgPSBwcm9wcy5hcmlhTGFiZWxsZWRCeUZvckhhbmRsZSxcbiAgICAgIGFyaWFWYWx1ZVRleHRGb3JtYXR0ZXJGb3JIYW5kbGUgPSBwcm9wcy5hcmlhVmFsdWVUZXh0Rm9ybWF0dGVyRm9ySGFuZGxlO1xuICB2YXIgaGFuZGxlc1JlZiA9IFJlYWN0LnVzZVJlZigpO1xuICB2YXIgY29udGFpbmVyUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciBkaXJlY3Rpb24gPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodmVydGljYWwpIHtcbiAgICAgIHJldHVybiByZXZlcnNlID8gJ3R0YicgOiAnYnR0JztcbiAgICB9XG5cbiAgICByZXR1cm4gcmV2ZXJzZSA/ICdydGwnIDogJ2x0cic7XG4gIH0sIFtyZXZlcnNlLCB2ZXJ0aWNhbF0pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJhbmdlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIG1lcmdlZE1pbiA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBpc0Zpbml0ZShtaW4pID8gbWluIDogMDtcbiAgfSwgW21pbl0pO1xuICB2YXIgbWVyZ2VkTWF4ID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGlzRmluaXRlKG1heCkgPyBtYXggOiAxMDA7XG4gIH0sIFttYXhdKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU3RlcCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBtZXJnZWRTdGVwID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHN0ZXAgIT09IG51bGwgJiYgc3RlcCA8PSAwID8gMSA6IHN0ZXA7XG4gIH0sIFtzdGVwXSk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFB1c2ggPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgbWVyZ2VkUHVzaCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmIChwdXNoYWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIG1lcmdlZFN0ZXA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHB1c2hhYmxlID49IDAgPyBwdXNoYWJsZSA6IGZhbHNlO1xuICB9LCBbcHVzaGFibGUsIG1lcmdlZFN0ZXBdKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBNYXJrcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBtYXJrTGlzdCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMobWFya3MgfHwge30pO1xuICAgIHJldHVybiBrZXlzLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgbWFyayA9IG1hcmtzW2tleV07XG4gICAgICB2YXIgbWFya09iaiA9IHtcbiAgICAgICAgdmFsdWU6IE51bWJlcihrZXkpXG4gICAgICB9O1xuXG4gICAgICBpZiAobWFyayAmJiBfdHlwZW9mKG1hcmspID09PSAnb2JqZWN0JyAmJiAhIC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChtYXJrKSAmJiAoJ2xhYmVsJyBpbiBtYXJrIHx8ICdzdHlsZScgaW4gbWFyaykpIHtcbiAgICAgICAgbWFya09iai5zdHlsZSA9IG1hcmsuc3R5bGU7XG4gICAgICAgIG1hcmtPYmoubGFiZWwgPSBtYXJrLmxhYmVsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWFya09iai5sYWJlbCA9IG1hcms7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtYXJrT2JqO1xuICAgIH0pLmZpbHRlcihmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIGxhYmVsID0gX3JlZi5sYWJlbDtcbiAgICAgIHJldHVybiBsYWJlbCB8fCB0eXBlb2YgbGFiZWwgPT09ICdudW1iZXInO1xuICAgIH0pLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhLnZhbHVlIC0gYi52YWx1ZTtcbiAgICB9KTtcbiAgfSwgW21hcmtzXSk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRm9ybWF0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgX3VzZU9mZnNldCA9IHVzZU9mZnNldChtZXJnZWRNaW4sIG1lcmdlZE1heCwgbWVyZ2VkU3RlcCwgbWFya0xpc3QsIGFsbG93Q3Jvc3MsIG1lcmdlZFB1c2gpLFxuICAgICAgX3VzZU9mZnNldDIgPSBfc2xpY2VkVG9BcnJheShfdXNlT2Zmc2V0LCAyKSxcbiAgICAgIGZvcm1hdFZhbHVlID0gX3VzZU9mZnNldDJbMF0sXG4gICAgICBvZmZzZXRWYWx1ZXMgPSBfdXNlT2Zmc2V0MlsxXTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBWYWx1ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZSA9IHVzZU1lcmdlZFN0YXRlKGRlZmF1bHRWYWx1ZSwge1xuICAgIHZhbHVlOiB2YWx1ZVxuICB9KSxcbiAgICAgIF91c2VNZXJnZWRTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGUsIDIpLFxuICAgICAgbWVyZ2VkVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzBdLFxuICAgICAgc2V0VmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGUyWzFdO1xuXG4gIHZhciByYXdWYWx1ZXMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWVMaXN0ID0gbWVyZ2VkVmFsdWUgPT09IG51bGwgfHwgbWVyZ2VkVmFsdWUgPT09IHVuZGVmaW5lZCA/IFtdIDogQXJyYXkuaXNBcnJheShtZXJnZWRWYWx1ZSkgPyBtZXJnZWRWYWx1ZSA6IFttZXJnZWRWYWx1ZV07XG5cbiAgICB2YXIgX3ZhbHVlTGlzdCA9IF9zbGljZWRUb0FycmF5KHZhbHVlTGlzdCwgMSksXG4gICAgICAgIF92YWx1ZUxpc3QkID0gX3ZhbHVlTGlzdFswXSxcbiAgICAgICAgdmFsMCA9IF92YWx1ZUxpc3QkID09PSB2b2lkIDAgPyBtZXJnZWRNaW4gOiBfdmFsdWVMaXN0JDtcblxuICAgIHZhciByZXR1cm5WYWx1ZXMgPSBtZXJnZWRWYWx1ZSA9PT0gbnVsbCA/IFtdIDogW3ZhbDBdOyAvLyBGb3JtYXQgYXMgcmFuZ2VcblxuICAgIGlmIChyYW5nZSkge1xuICAgICAgcmV0dXJuVmFsdWVzID0gX3RvQ29uc3VtYWJsZUFycmF5KHZhbHVlTGlzdCk7IC8vIFdoZW4gY291bnQgcHJvdmlkZWQgb3IgdmFsdWUgaXMgYHVuZGVmaW5lZGAsIHdlIGZpbGwgdmFsdWVzXG5cbiAgICAgIGlmIChjb3VudCB8fCBtZXJnZWRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBwb2ludENvdW50ID0gY291bnQgPj0gMCA/IGNvdW50ICsgMSA6IDI7XG4gICAgICAgIHJldHVyblZhbHVlcyA9IHJldHVyblZhbHVlcy5zbGljZSgwLCBwb2ludENvdW50KTsgLy8gRmlsbCB3aXRoIGNvdW50XG5cbiAgICAgICAgd2hpbGUgKHJldHVyblZhbHVlcy5sZW5ndGggPCBwb2ludENvdW50KSB7XG4gICAgICAgICAgdmFyIF9yZXR1cm5WYWx1ZXM7XG5cbiAgICAgICAgICByZXR1cm5WYWx1ZXMucHVzaCgoX3JldHVyblZhbHVlcyA9IHJldHVyblZhbHVlc1tyZXR1cm5WYWx1ZXMubGVuZ3RoIC0gMV0pICE9PSBudWxsICYmIF9yZXR1cm5WYWx1ZXMgIT09IHZvaWQgMCA/IF9yZXR1cm5WYWx1ZXMgOiBtZXJnZWRNaW4pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVyblZhbHVlcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBhIC0gYjtcbiAgICAgIH0pO1xuICAgIH0gLy8gQWxpZ24gaW4gcmFuZ2VcblxuXG4gICAgcmV0dXJuVmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKHZhbCwgaW5kZXgpIHtcbiAgICAgIHJldHVyblZhbHVlc1tpbmRleF0gPSBmb3JtYXRWYWx1ZSh2YWwpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXR1cm5WYWx1ZXM7XG4gIH0sIFttZXJnZWRWYWx1ZSwgcmFuZ2UsIG1lcmdlZE1pbiwgY291bnQsIGZvcm1hdFZhbHVlXSk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBvbkNoYW5nZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgcmF3VmFsdWVzUmVmID0gUmVhY3QudXNlUmVmKHJhd1ZhbHVlcyk7XG4gIHJhd1ZhbHVlc1JlZi5jdXJyZW50ID0gcmF3VmFsdWVzO1xuXG4gIHZhciBnZXRUcmlnZ2VyVmFsdWUgPSBmdW5jdGlvbiBnZXRUcmlnZ2VyVmFsdWUodHJpZ2dlclZhbHVlcykge1xuICAgIHJldHVybiByYW5nZSA/IHRyaWdnZXJWYWx1ZXMgOiB0cmlnZ2VyVmFsdWVzWzBdO1xuICB9O1xuXG4gIHZhciB0cmlnZ2VyQ2hhbmdlID0gZnVuY3Rpb24gdHJpZ2dlckNoYW5nZShuZXh0VmFsdWVzKSB7XG4gICAgLy8gT3JkZXIgZmlyc3RcbiAgICB2YXIgY2xvbmVOZXh0VmFsdWVzID0gX3RvQ29uc3VtYWJsZUFycmF5KG5leHRWYWx1ZXMpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhIC0gYjtcbiAgICB9KTsgLy8gVHJpZ2dlciBldmVudCBpZiBuZWVkZWRcblxuXG4gICAgaWYgKG9uQ2hhbmdlICYmICFzaGFsbG93RXF1YWwoY2xvbmVOZXh0VmFsdWVzLCByYXdWYWx1ZXNSZWYuY3VycmVudCkpIHtcbiAgICAgIG9uQ2hhbmdlKGdldFRyaWdnZXJWYWx1ZShjbG9uZU5leHRWYWx1ZXMpKTtcbiAgICB9IC8vIFdlIHNldCB0aGlzIGxhdGVyIHNpbmNlIGl0IHdpbGwgcmUtcmVuZGVyIGNvbXBvbmVudCBpbW1lZGlhdGVseVxuXG5cbiAgICBzZXRWYWx1ZShjbG9uZU5leHRWYWx1ZXMpO1xuICB9O1xuXG4gIHZhciBjaGFuZ2VUb0Nsb3NlVmFsdWUgPSBmdW5jdGlvbiBjaGFuZ2VUb0Nsb3NlVmFsdWUobmV3VmFsdWUpIHtcbiAgICBpZiAoIWRpc2FibGVkKSB7XG4gICAgICB2YXIgdmFsdWVJbmRleCA9IDA7XG4gICAgICB2YXIgdmFsdWVEaXN0ID0gbWVyZ2VkTWF4IC0gbWVyZ2VkTWluO1xuICAgICAgcmF3VmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKHZhbCwgaW5kZXgpIHtcbiAgICAgICAgdmFyIGRpc3QgPSBNYXRoLmFicyhuZXdWYWx1ZSAtIHZhbCk7XG5cbiAgICAgICAgaWYgKGRpc3QgPD0gdmFsdWVEaXN0KSB7XG4gICAgICAgICAgdmFsdWVEaXN0ID0gZGlzdDtcbiAgICAgICAgICB2YWx1ZUluZGV4ID0gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH0pOyAvLyBDcmVhdGUgbmV3IHZhbHVlc1xuXG4gICAgICB2YXIgY2xvbmVOZXh0VmFsdWVzID0gX3RvQ29uc3VtYWJsZUFycmF5KHJhd1ZhbHVlcyk7XG5cbiAgICAgIGNsb25lTmV4dFZhbHVlc1t2YWx1ZUluZGV4XSA9IG5ld1ZhbHVlOyAvLyBGaWxsIHZhbHVlIHRvIG1hdGNoIGRlZmF1bHQgMlxuXG4gICAgICBpZiAocmFuZ2UgJiYgIXJhd1ZhbHVlcy5sZW5ndGggJiYgY291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjbG9uZU5leHRWYWx1ZXMucHVzaChuZXdWYWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIG9uQmVmb3JlQ2hhbmdlID09PSBudWxsIHx8IG9uQmVmb3JlQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJlZm9yZUNoYW5nZShnZXRUcmlnZ2VyVmFsdWUoY2xvbmVOZXh0VmFsdWVzKSk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlKGNsb25lTmV4dFZhbHVlcyk7XG4gICAgICBvbkFmdGVyQ2hhbmdlID09PSBudWxsIHx8IG9uQWZ0ZXJDaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQWZ0ZXJDaGFuZ2UoZ2V0VHJpZ2dlclZhbHVlKGNsb25lTmV4dFZhbHVlcykpO1xuICAgIH1cbiAgfTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDbGljayA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIG9uU2xpZGVyTW91c2VEb3duID0gZnVuY3Rpb24gb25TbGlkZXJNb3VzZURvd24oZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgIHZhciBfY29udGFpbmVyUmVmJGN1cnJlbnQgPSBjb250YWluZXJSZWYuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgd2lkdGggPSBfY29udGFpbmVyUmVmJGN1cnJlbnQud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IF9jb250YWluZXJSZWYkY3VycmVudC5oZWlnaHQsXG4gICAgICAgIGxlZnQgPSBfY29udGFpbmVyUmVmJGN1cnJlbnQubGVmdCxcbiAgICAgICAgdG9wID0gX2NvbnRhaW5lclJlZiRjdXJyZW50LnRvcCxcbiAgICAgICAgYm90dG9tID0gX2NvbnRhaW5lclJlZiRjdXJyZW50LmJvdHRvbSxcbiAgICAgICAgcmlnaHQgPSBfY29udGFpbmVyUmVmJGN1cnJlbnQucmlnaHQ7XG5cbiAgICB2YXIgY2xpZW50WCA9IGUuY2xpZW50WCxcbiAgICAgICAgY2xpZW50WSA9IGUuY2xpZW50WTtcbiAgICB2YXIgcGVyY2VudDtcblxuICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7XG4gICAgICBjYXNlICdidHQnOlxuICAgICAgICBwZXJjZW50ID0gKGJvdHRvbSAtIGNsaWVudFkpIC8gaGVpZ2h0O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAndHRiJzpcbiAgICAgICAgcGVyY2VudCA9IChjbGllbnRZIC0gdG9wKSAvIGhlaWdodDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3J0bCc6XG4gICAgICAgIHBlcmNlbnQgPSAocmlnaHQgLSBjbGllbnRYKSAvIHdpZHRoO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcGVyY2VudCA9IChjbGllbnRYIC0gbGVmdCkgLyB3aWR0aDtcbiAgICB9XG5cbiAgICB2YXIgbmV4dFZhbHVlID0gbWVyZ2VkTWluICsgcGVyY2VudCAqIChtZXJnZWRNYXggLSBtZXJnZWRNaW4pO1xuICAgIGNoYW5nZVRvQ2xvc2VWYWx1ZShmb3JtYXRWYWx1ZShuZXh0VmFsdWUpKTtcbiAgfTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IEtleWJvYXJkID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgICBrZXlib2FyZFZhbHVlID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICAgIHNldEtleWJvYXJkVmFsdWUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIHZhciBvbkhhbmRsZU9mZnNldENoYW5nZSA9IGZ1bmN0aW9uIG9uSGFuZGxlT2Zmc2V0Q2hhbmdlKG9mZnNldCwgdmFsdWVJbmRleCkge1xuICAgIGlmICghZGlzYWJsZWQpIHtcbiAgICAgIHZhciBuZXh0ID0gb2Zmc2V0VmFsdWVzKHJhd1ZhbHVlcywgb2Zmc2V0LCB2YWx1ZUluZGV4KTtcbiAgICAgIG9uQmVmb3JlQ2hhbmdlID09PSBudWxsIHx8IG9uQmVmb3JlQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJlZm9yZUNoYW5nZShnZXRUcmlnZ2VyVmFsdWUocmF3VmFsdWVzKSk7XG4gICAgICB0cmlnZ2VyQ2hhbmdlKG5leHQudmFsdWVzKTtcbiAgICAgIG9uQWZ0ZXJDaGFuZ2UgPT09IG51bGwgfHwgb25BZnRlckNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BZnRlckNoYW5nZShnZXRUcmlnZ2VyVmFsdWUobmV4dC52YWx1ZXMpKTtcbiAgICAgIHNldEtleWJvYXJkVmFsdWUobmV4dC52YWx1ZSk7XG4gICAgfVxuICB9O1xuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGtleWJvYXJkVmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHZhciB2YWx1ZUluZGV4ID0gcmF3VmFsdWVzLmluZGV4T2Yoa2V5Ym9hcmRWYWx1ZSk7XG5cbiAgICAgIGlmICh2YWx1ZUluZGV4ID49IDApIHtcbiAgICAgICAgaGFuZGxlc1JlZi5jdXJyZW50LmZvY3VzKHZhbHVlSW5kZXgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNldEtleWJvYXJkVmFsdWUobnVsbCk7XG4gIH0sIFtrZXlib2FyZFZhbHVlXSk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IERyYWcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgbWVyZ2VkRHJhZ2dhYmxlVHJhY2sgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZHJhZ2dhYmxlVHJhY2sgJiYgbWVyZ2VkU3RlcCA9PT0gbnVsbCkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgd2FybmluZyhmYWxzZSwgJ2BkcmFnZ2FibGVUcmFja2AgaXMgbm90IHN1cHBvcnRlZCB3aGVuIGBzdGVwYCBpcyBgbnVsbGAuJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZHJhZ2dhYmxlVHJhY2s7XG4gIH0sIFtkcmFnZ2FibGVUcmFjaywgbWVyZ2VkU3RlcF0pO1xuXG4gIHZhciBmaW5pc2hDaGFuZ2UgPSBmdW5jdGlvbiBmaW5pc2hDaGFuZ2UoKSB7XG4gICAgb25BZnRlckNoYW5nZSA9PT0gbnVsbCB8fCBvbkFmdGVyQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFmdGVyQ2hhbmdlKGdldFRyaWdnZXJWYWx1ZShyYXdWYWx1ZXNSZWYuY3VycmVudCkpO1xuICB9O1xuXG4gIHZhciBfdXNlRHJhZyA9IHVzZURyYWcoY29udGFpbmVyUmVmLCBkaXJlY3Rpb24sIHJhd1ZhbHVlcywgbWVyZ2VkTWluLCBtZXJnZWRNYXgsIGZvcm1hdFZhbHVlLCB0cmlnZ2VyQ2hhbmdlLCBmaW5pc2hDaGFuZ2UsIG9mZnNldFZhbHVlcyksXG4gICAgICBfdXNlRHJhZzIgPSBfc2xpY2VkVG9BcnJheShfdXNlRHJhZywgNCksXG4gICAgICBkcmFnZ2luZ0luZGV4ID0gX3VzZURyYWcyWzBdLFxuICAgICAgZHJhZ2dpbmdWYWx1ZSA9IF91c2VEcmFnMlsxXSxcbiAgICAgIGNhY2hlVmFsdWVzID0gX3VzZURyYWcyWzJdLFxuICAgICAgb25TdGFydERyYWcgPSBfdXNlRHJhZzJbM107XG5cbiAgdmFyIG9uU3RhcnRNb3ZlID0gZnVuY3Rpb24gb25TdGFydE1vdmUoZSwgdmFsdWVJbmRleCkge1xuICAgIG9uU3RhcnREcmFnKGUsIHZhbHVlSW5kZXgpO1xuICAgIG9uQmVmb3JlQ2hhbmdlID09PSBudWxsIHx8IG9uQmVmb3JlQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJlZm9yZUNoYW5nZShnZXRUcmlnZ2VyVmFsdWUocmF3VmFsdWVzUmVmLmN1cnJlbnQpKTtcbiAgfTsgLy8gQXV0byBmb2N1cyBmb3IgdXBkYXRlZCBoYW5kbGVcblxuXG4gIHZhciBkcmFnZ2luZyA9IGRyYWdnaW5nSW5kZXggIT09IC0xO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghZHJhZ2dpbmcpIHtcbiAgICAgIHZhciB2YWx1ZUluZGV4ID0gcmF3VmFsdWVzLmxhc3RJbmRleE9mKGRyYWdnaW5nVmFsdWUpO1xuICAgICAgaGFuZGxlc1JlZi5jdXJyZW50LmZvY3VzKHZhbHVlSW5kZXgpO1xuICAgIH1cbiAgfSwgW2RyYWdnaW5nXSk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBJbmNsdWRlZCA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgc29ydGVkQ2FjaGVWYWx1ZXMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3RvQ29uc3VtYWJsZUFycmF5KGNhY2hlVmFsdWVzKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYSAtIGI7XG4gICAgfSk7XG4gIH0sIFtjYWNoZVZhbHVlc10pOyAvLyBQcm92aWRlIGEgcmFuZ2UgdmFsdWVzIHdpdGggaW5jbHVkZWQgW21pbiwgbWF4XVxuICAvLyBVc2VkIGZvciBUcmFjaywgTWFyayAmIERvdFxuXG4gIHZhciBfUmVhY3QkdXNlTWVtbyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmICghcmFuZ2UpIHtcbiAgICAgIHJldHVybiBbbWVyZ2VkTWluLCBzb3J0ZWRDYWNoZVZhbHVlc1swXV07XG4gICAgfVxuXG4gICAgcmV0dXJuIFtzb3J0ZWRDYWNoZVZhbHVlc1swXSwgc29ydGVkQ2FjaGVWYWx1ZXNbc29ydGVkQ2FjaGVWYWx1ZXMubGVuZ3RoIC0gMV1dO1xuICB9LCBbc29ydGVkQ2FjaGVWYWx1ZXMsIHJhbmdlLCBtZXJnZWRNaW5dKSxcbiAgICAgIF9SZWFjdCR1c2VNZW1vMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VNZW1vLCAyKSxcbiAgICAgIGluY2x1ZGVkU3RhcnQgPSBfUmVhY3QkdXNlTWVtbzJbMF0sXG4gICAgICBpbmNsdWRlZEVuZCA9IF9SZWFjdCR1c2VNZW1vMlsxXTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVmcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZm9jdXM6IGZ1bmN0aW9uIGZvY3VzKCkge1xuICAgICAgICBoYW5kbGVzUmVmLmN1cnJlbnQuZm9jdXMoMCk7XG4gICAgICB9LFxuICAgICAgYmx1cjogZnVuY3Rpb24gYmx1cigpIHtcbiAgICAgICAgdmFyIF9kb2N1bWVudCA9IGRvY3VtZW50LFxuICAgICAgICAgICAgYWN0aXZlRWxlbWVudCA9IF9kb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuXG4gICAgICAgIGlmIChjb250YWluZXJSZWYuY3VycmVudC5jb250YWlucyhhY3RpdmVFbGVtZW50KSkge1xuICAgICAgICAgIGFjdGl2ZUVsZW1lbnQgPT09IG51bGwgfHwgYWN0aXZlRWxlbWVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYWN0aXZlRWxlbWVudC5ibHVyKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9KTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gQXV0byBGb2N1cyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGF1dG9Gb2N1cykge1xuICAgICAgaGFuZGxlc1JlZi5jdXJyZW50LmZvY3VzKDApO1xuICAgIH1cbiAgfSwgW10pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ29udGV4dCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIGNvbnRleHQgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWluOiBtZXJnZWRNaW4sXG4gICAgICBtYXg6IG1lcmdlZE1heCxcbiAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uLFxuICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgc3RlcDogbWVyZ2VkU3RlcCxcbiAgICAgIGluY2x1ZGVkOiBpbmNsdWRlZCxcbiAgICAgIGluY2x1ZGVkU3RhcnQ6IGluY2x1ZGVkU3RhcnQsXG4gICAgICBpbmNsdWRlZEVuZDogaW5jbHVkZWRFbmQsXG4gICAgICByYW5nZTogcmFuZ2UsXG4gICAgICB0YWJJbmRleDogdGFiSW5kZXgsXG4gICAgICBhcmlhTGFiZWxGb3JIYW5kbGU6IGFyaWFMYWJlbEZvckhhbmRsZSxcbiAgICAgIGFyaWFMYWJlbGxlZEJ5Rm9ySGFuZGxlOiBhcmlhTGFiZWxsZWRCeUZvckhhbmRsZSxcbiAgICAgIGFyaWFWYWx1ZVRleHRGb3JtYXR0ZXJGb3JIYW5kbGU6IGFyaWFWYWx1ZVRleHRGb3JtYXR0ZXJGb3JIYW5kbGVcbiAgICB9O1xuICB9LCBbbWVyZ2VkTWluLCBtZXJnZWRNYXgsIGRpcmVjdGlvbiwgZGlzYWJsZWQsIG1lcmdlZFN0ZXAsIGluY2x1ZGVkLCBpbmNsdWRlZFN0YXJ0LCBpbmNsdWRlZEVuZCwgcmFuZ2UsIHRhYkluZGV4LCBhcmlhTGFiZWxGb3JIYW5kbGUsIGFyaWFMYWJlbGxlZEJ5Rm9ySGFuZGxlLCBhcmlhVmFsdWVUZXh0Rm9ybWF0dGVyRm9ySGFuZGxlXSk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2xpZGVyQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBjb250ZXh0XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICByZWY6IGNvbnRhaW5lclJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMocHJlZml4Q2xzLCBjbGFzc05hbWUsIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWRcIiksIGRpc2FibGVkKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXZlcnRpY2FsXCIpLCB2ZXJ0aWNhbCksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ob3Jpem9udGFsXCIpLCAhdmVydGljYWwpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd2l0aC1tYXJrc1wiKSwgbWFya0xpc3QubGVuZ3RoKSwgX2NsYXNzTmFtZXMpKSxcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgb25Nb3VzZURvd246IG9uU2xpZGVyTW91c2VEb3duXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcmFpbFwiKSxcbiAgICBzdHlsZTogcmFpbFN0eWxlXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmFja3MsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBzdHlsZTogdHJhY2tTdHlsZSxcbiAgICB2YWx1ZXM6IHNvcnRlZENhY2hlVmFsdWVzLFxuICAgIHN0YXJ0UG9pbnQ6IHN0YXJ0UG9pbnQsXG4gICAgb25TdGFydE1vdmU6IG1lcmdlZERyYWdnYWJsZVRyYWNrID8gb25TdGFydE1vdmUgOiBudWxsXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTdGVwcywge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIG1hcmtzOiBtYXJrTGlzdCxcbiAgICBkb3RzOiBkb3RzLFxuICAgIHN0eWxlOiBkb3RTdHlsZSxcbiAgICBhY3RpdmVTdHlsZTogYWN0aXZlRG90U3R5bGVcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEhhbmRsZXMsIHtcbiAgICByZWY6IGhhbmRsZXNSZWYsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgc3R5bGU6IGhhbmRsZVN0eWxlLFxuICAgIHZhbHVlczogY2FjaGVWYWx1ZXMsXG4gICAgZHJhZ2dpbmdJbmRleDogZHJhZ2dpbmdJbmRleCxcbiAgICBvblN0YXJ0TW92ZTogb25TdGFydE1vdmUsXG4gICAgb25PZmZzZXRDaGFuZ2U6IG9uSGFuZGxlT2Zmc2V0Q2hhbmdlLFxuICAgIG9uRm9jdXM6IG9uRm9jdXMsXG4gICAgb25CbHVyOiBvbkJsdXIsXG4gICAgaGFuZGxlUmVuZGVyOiBoYW5kbGVSZW5kZXJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE1hcmtzLCB7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgbWFya3M6IG1hcmtMaXN0LFxuICAgIG9uQ2xpY2s6IGNoYW5nZVRvQ2xvc2VWYWx1ZVxuICB9KSkpO1xufSk7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFNsaWRlci5kaXNwbGF5TmFtZSA9ICdTbGlkZXInO1xufVxuXG5leHBvcnQgZGVmYXVsdCBTbGlkZXI7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgcmFmIGZyb20gXCJyYy11dGlsL2VzL3JhZlwiO1xuaW1wb3J0IHsgY29tcG9zZVJlZiB9IGZyb20gXCJyYy11dGlsL2VzL3JlZlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFRvb2x0aXAgZnJvbSAnLi4vdG9vbHRpcCc7XG52YXIgU2xpZGVyVG9vbHRpcCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBvcGVuID0gcHJvcHMub3BlbjtcbiAgdmFyIGlubmVyUmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgcmFmUmVmID0gdXNlUmVmKG51bGwpO1xuICBmdW5jdGlvbiBjYW5jZWxLZWVwQWxpZ24oKSB7XG4gICAgcmFmLmNhbmNlbChyYWZSZWYuY3VycmVudCk7XG4gICAgcmFmUmVmLmN1cnJlbnQgPSBudWxsO1xuICB9XG4gIGZ1bmN0aW9uIGtlZXBBbGlnbigpIHtcbiAgICByYWZSZWYuY3VycmVudCA9IHJhZihmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX2E7XG4gICAgICAoX2EgPSBpbm5lclJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZm9yY2VQb3B1cEFsaWduKCk7XG4gICAgICByYWZSZWYuY3VycmVudCA9IG51bGw7XG4gICAgfSk7XG4gIH1cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAob3Blbikge1xuICAgICAga2VlcEFsaWduKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbmNlbEtlZXBBbGlnbigpO1xuICAgIH1cbiAgICByZXR1cm4gY2FuY2VsS2VlcEFsaWduO1xuICB9LCBbb3BlbiwgcHJvcHMudGl0bGVdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXAsIF9leHRlbmRzKHtcbiAgICByZWY6IGNvbXBvc2VSZWYoaW5uZXJSZWYsIHJlZilcbiAgfSwgcHJvcHMpKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgU2xpZGVyVG9vbHRpcDsiLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBSY1NsaWRlciBmcm9tICdyYy1zbGlkZXInO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgd2FybmluZyBmcm9tICcuLi9fdXRpbC93YXJuaW5nJztcbmltcG9ydCBTbGlkZXJUb29sdGlwIGZyb20gJy4vU2xpZGVyVG9vbHRpcCc7XG52YXIgU2xpZGVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uLFxuICAgIGdldFBvcHVwQ29udGFpbmVyID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0UG9wdXBDb250YWluZXI7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSh7fSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgb3BlbnMgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldE9wZW5zID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIHRvZ2dsZVRvb2x0aXBPcGVuID0gZnVuY3Rpb24gdG9nZ2xlVG9vbHRpcE9wZW4oaW5kZXgsIG9wZW4pIHtcbiAgICBzZXRPcGVucyhmdW5jdGlvbiAocHJldikge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKF9leHRlbmRzKHt9LCBwcmV2KSwgX2RlZmluZVByb3BlcnR5KHt9LCBpbmRleCwgb3BlbikpO1xuICAgIH0pO1xuICB9O1xuICB2YXIgZ2V0VG9vbHRpcFBsYWNlbWVudCA9IGZ1bmN0aW9uIGdldFRvb2x0aXBQbGFjZW1lbnQodG9vbHRpcFBsYWNlbWVudCwgdmVydGljYWwpIHtcbiAgICBpZiAodG9vbHRpcFBsYWNlbWVudCkge1xuICAgICAgcmV0dXJuIHRvb2x0aXBQbGFjZW1lbnQ7XG4gICAgfVxuICAgIGlmICghdmVydGljYWwpIHtcbiAgICAgIHJldHVybiAndG9wJztcbiAgICB9XG4gICAgcmV0dXJuIGRpcmVjdGlvbiA9PT0gJ3J0bCcgPyAnbGVmdCcgOiAncmlnaHQnO1xuICB9O1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHJhbmdlID0gcHJvcHMucmFuZ2UsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIHJlc3RQcm9wcyA9IF9fcmVzdChwcm9wcywgW1wicHJlZml4Q2xzXCIsIFwicmFuZ2VcIiwgXCJjbGFzc05hbWVcIl0pO1xuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdzbGlkZXInLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgY2xzID0gY2xhc3NOYW1lcyhjbGFzc05hbWUsIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpKTtcbiAgLy8gbWFrZSByZXZlcnNlIGRlZmF1bHQgb24gcnRsIGRpcmVjdGlvblxuICBpZiAoZGlyZWN0aW9uID09PSAncnRsJyAmJiAhcmVzdFByb3BzLnZlcnRpY2FsKSB7XG4gICAgcmVzdFByb3BzLnJldmVyc2UgPSAhcmVzdFByb3BzLnJldmVyc2U7XG4gIH1cbiAgLy8gUmFuZ2UgY29uZmlnXG4gIHZhciBfUmVhY3QkdXNlTWVtbyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFyYW5nZSkge1xuICAgICAgICByZXR1cm4gW2ZhbHNlXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfdHlwZW9mKHJhbmdlKSA9PT0gJ29iamVjdCcgPyBbdHJ1ZSwgcmFuZ2UuZHJhZ2dhYmxlVHJhY2tdIDogW3RydWUsIGZhbHNlXTtcbiAgICB9LCBbcmFuZ2VdKSxcbiAgICBfUmVhY3QkdXNlTWVtbzIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlTWVtbywgMiksXG4gICAgbWVyZ2VkUmFuZ2UgPSBfUmVhY3QkdXNlTWVtbzJbMF0sXG4gICAgZHJhZ2dhYmxlVHJhY2sgPSBfUmVhY3QkdXNlTWVtbzJbMV07XG4gIC8vIFdhcm5pbmcgZm9yIGRlcHJlY2F0ZWQgdXNhZ2VcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBbWyd0b29sdGlwUHJlZml4Q2xzJywgJ3ByZWZpeENscyddLCBbJ2dldFRvb2x0aXBQb3B1cENvbnRhaW5lcicsICdnZXRQb3B1cENvbnRhaW5lciddLCBbJ3RpcEZvcm1hdHRlcicsICdmb3JtYXR0ZXInXSwgWyd0b29sdGlwUGxhY2VtZW50JywgJ3BsYWNlbWVudCddLCBbJ3Rvb2x0aXBWaXNpYmxlJywgJ29wZW4nXV0uZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIF9yZWYyID0gX3NsaWNlZFRvQXJyYXkoX3JlZiwgMiksXG4gICAgICAgIGRlcHJlY2F0ZWROYW1lID0gX3JlZjJbMF0sXG4gICAgICAgIG5ld05hbWUgPSBfcmVmMlsxXTtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoIShkZXByZWNhdGVkTmFtZSBpbiBwcm9wcyksICdTbGlkZXInLCBcImBcIi5jb25jYXQoZGVwcmVjYXRlZE5hbWUsIFwiYCBpcyBkZXByZWNhdGVkIHdoaWNoIHdpbGwgYmUgcmVtb3ZlZCBpbiBuZXh0IG1ham9yIHZlcnNpb24sIHBsZWFzZSB1c2UgYHRvb2x0aXAuXCIpLmNvbmNhdChuZXdOYW1lLCBcImAgaW5zdGVhZC5cIikpIDogdm9pZCAwO1xuICAgIH0pO1xuICB9XG4gIHZhciBoYW5kbGVSZW5kZXIgPSBmdW5jdGlvbiBoYW5kbGVSZW5kZXIobm9kZSwgaW5mbykge1xuICAgIHZhciBfYTtcbiAgICB2YXIgaW5kZXggPSBpbmZvLmluZGV4LFxuICAgICAgZHJhZ2dpbmcgPSBpbmZvLmRyYWdnaW5nO1xuICAgIHZhciByb290UHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCk7XG4gICAgdmFyIF9wcm9wcyR0b29sdGlwID0gcHJvcHMudG9vbHRpcCxcbiAgICAgIHRvb2x0aXAgPSBfcHJvcHMkdG9vbHRpcCA9PT0gdm9pZCAwID8ge30gOiBfcHJvcHMkdG9vbHRpcCxcbiAgICAgIHZlcnRpY2FsID0gcHJvcHMudmVydGljYWw7XG4gICAgdmFyIHRvb2x0aXBQcm9wcyA9IF9leHRlbmRzKHtcbiAgICAgIGZvcm1hdHRlcjogKF9hID0gcHJvcHMudGlwRm9ybWF0dGVyKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgICAgIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyA/IHZhbHVlLnRvU3RyaW5nKCkgOiAnJztcbiAgICAgIH0sXG4gICAgICBvcGVuOiBwcm9wcy50b29sdGlwVmlzaWJsZSxcbiAgICAgIHBsYWNlbWVudDogcHJvcHMudG9vbHRpcFBsYWNlbWVudCxcbiAgICAgIGdldFBvcHVwQ29udGFpbmVyOiBwcm9wcy5nZXRUb29sdGlwUG9wdXBDb250YWluZXJcbiAgICB9LCB0b29sdGlwKTtcbiAgICB2YXIgdG9vbHRpcE9wZW4gPSB0b29sdGlwUHJvcHMub3BlbixcbiAgICAgIHRvb2x0aXBQbGFjZW1lbnQgPSB0b29sdGlwUHJvcHMucGxhY2VtZW50LFxuICAgICAgZ2V0VG9vbHRpcFBvcHVwQ29udGFpbmVyID0gdG9vbHRpcFByb3BzLmdldFBvcHVwQ29udGFpbmVyLFxuICAgICAgY3VzdG9taXplVG9vbHRpcFByZWZpeENscyA9IHRvb2x0aXBQcm9wcy5wcmVmaXhDbHMsXG4gICAgICB0aXBGb3JtYXR0ZXIgPSB0b29sdGlwUHJvcHMuZm9ybWF0dGVyO1xuICAgIHZhciBpc1RpcEZvcm1hdHRlciA9IHRpcEZvcm1hdHRlciA/IG9wZW5zW2luZGV4XSB8fCBkcmFnZ2luZyA6IGZhbHNlO1xuICAgIHZhciBvcGVuID0gdG9vbHRpcE9wZW4gfHwgdG9vbHRpcE9wZW4gPT09IHVuZGVmaW5lZCAmJiBpc1RpcEZvcm1hdHRlcjtcbiAgICB2YXIgcGFzc2VkUHJvcHMgPSBfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgbm9kZS5wcm9wcyksIHtcbiAgICAgIG9uTW91c2VFbnRlcjogZnVuY3Rpb24gb25Nb3VzZUVudGVyKCkge1xuICAgICAgICByZXR1cm4gdG9nZ2xlVG9vbHRpcE9wZW4oaW5kZXgsIHRydWUpO1xuICAgICAgfSxcbiAgICAgIG9uTW91c2VMZWF2ZTogZnVuY3Rpb24gb25Nb3VzZUxlYXZlKCkge1xuICAgICAgICByZXR1cm4gdG9nZ2xlVG9vbHRpcE9wZW4oaW5kZXgsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB2YXIgdG9vbHRpcFByZWZpeENscyA9IGdldFByZWZpeENscygndG9vbHRpcCcsIGN1c3RvbWl6ZVRvb2x0aXBQcmVmaXhDbHMpO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTbGlkZXJUb29sdGlwLCB7XG4gICAgICBwcmVmaXhDbHM6IHRvb2x0aXBQcmVmaXhDbHMsXG4gICAgICB0aXRsZTogdGlwRm9ybWF0dGVyID8gdGlwRm9ybWF0dGVyKGluZm8udmFsdWUpIDogJycsXG4gICAgICBvcGVuOiBvcGVuLFxuICAgICAgcGxhY2VtZW50OiBnZXRUb29sdGlwUGxhY2VtZW50KHRvb2x0aXBQbGFjZW1lbnQsIHZlcnRpY2FsKSxcbiAgICAgIHRyYW5zaXRpb25OYW1lOiBcIlwiLmNvbmNhdChyb290UHJlZml4Q2xzLCBcIi16b29tLWRvd25cIiksXG4gICAgICBrZXk6IGluZGV4LFxuICAgICAgb3ZlcmxheUNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10b29sdGlwXCIpLFxuICAgICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFRvb2x0aXBQb3B1cENvbnRhaW5lciB8fCBnZXRQb3B1cENvbnRhaW5lclxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQobm9kZSwgcGFzc2VkUHJvcHMpKTtcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJjU2xpZGVyLCBfZXh0ZW5kcyh7fSwgcmVzdFByb3BzLCB7XG4gICAgc3RlcDogcmVzdFByb3BzLnN0ZXAsXG4gICAgcmFuZ2U6IG1lcmdlZFJhbmdlLFxuICAgIGRyYWdnYWJsZVRyYWNrOiBkcmFnZ2FibGVUcmFjayxcbiAgICBjbGFzc05hbWU6IGNscyxcbiAgICByZWY6IHJlZixcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBoYW5kbGVSZW5kZXI6IGhhbmRsZVJlbmRlclxuICB9KSk7XG59KTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFNsaWRlci5kaXNwbGF5TmFtZSA9ICdTbGlkZXInO1xufVxuZXhwb3J0IGRlZmF1bHQgU2xpZGVyOyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB1c2VNZXJnZWRTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZXJnZWRTdGF0ZVwiO1xuaW1wb3J0IEtleUNvZGUgZnJvbSBcInJjLXV0aWwvZXMvS2V5Q29kZVwiO1xudmFyIFN3aXRjaCA9IFJlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKF9yZWYsIHJlZikge1xuICB2YXIgX2NsYXNzTmFtZXM7XG5cbiAgdmFyIF9yZWYkcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHMsXG4gICAgICBwcmVmaXhDbHMgPSBfcmVmJHByZWZpeENscyA9PT0gdm9pZCAwID8gJ3JjLXN3aXRjaCcgOiBfcmVmJHByZWZpeENscyxcbiAgICAgIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgICAgY2hlY2tlZCA9IF9yZWYuY2hlY2tlZCxcbiAgICAgIGRlZmF1bHRDaGVja2VkID0gX3JlZi5kZWZhdWx0Q2hlY2tlZCxcbiAgICAgIGRpc2FibGVkID0gX3JlZi5kaXNhYmxlZCxcbiAgICAgIGxvYWRpbmdJY29uID0gX3JlZi5sb2FkaW5nSWNvbixcbiAgICAgIGNoZWNrZWRDaGlsZHJlbiA9IF9yZWYuY2hlY2tlZENoaWxkcmVuLFxuICAgICAgdW5DaGVja2VkQ2hpbGRyZW4gPSBfcmVmLnVuQ2hlY2tlZENoaWxkcmVuLFxuICAgICAgb25DbGljayA9IF9yZWYub25DbGljayxcbiAgICAgIG9uQ2hhbmdlID0gX3JlZi5vbkNoYW5nZSxcbiAgICAgIG9uS2V5RG93biA9IF9yZWYub25LZXlEb3duLFxuICAgICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYsIFtcInByZWZpeENsc1wiLCBcImNsYXNzTmFtZVwiLCBcImNoZWNrZWRcIiwgXCJkZWZhdWx0Q2hlY2tlZFwiLCBcImRpc2FibGVkXCIsIFwibG9hZGluZ0ljb25cIiwgXCJjaGVja2VkQ2hpbGRyZW5cIiwgXCJ1bkNoZWNrZWRDaGlsZHJlblwiLCBcIm9uQ2xpY2tcIiwgXCJvbkNoYW5nZVwiLCBcIm9uS2V5RG93blwiXSk7XG5cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZSA9IHVzZU1lcmdlZFN0YXRlKGZhbHNlLCB7XG4gICAgdmFsdWU6IGNoZWNrZWQsXG4gICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0Q2hlY2tlZFxuICB9KSxcbiAgICAgIF91c2VNZXJnZWRTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGUsIDIpLFxuICAgICAgaW5uZXJDaGVja2VkID0gX3VzZU1lcmdlZFN0YXRlMlswXSxcbiAgICAgIHNldElubmVyQ2hlY2tlZCA9IF91c2VNZXJnZWRTdGF0ZTJbMV07XG5cbiAgZnVuY3Rpb24gdHJpZ2dlckNoYW5nZShuZXdDaGVja2VkLCBldmVudCkge1xuICAgIHZhciBtZXJnZWRDaGVja2VkID0gaW5uZXJDaGVja2VkO1xuXG4gICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgbWVyZ2VkQ2hlY2tlZCA9IG5ld0NoZWNrZWQ7XG4gICAgICBzZXRJbm5lckNoZWNrZWQobWVyZ2VkQ2hlY2tlZCk7XG4gICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobWVyZ2VkQ2hlY2tlZCwgZXZlbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBtZXJnZWRDaGVja2VkO1xuICB9XG5cbiAgZnVuY3Rpb24gb25JbnRlcm5hbEtleURvd24oZSkge1xuICAgIGlmIChlLndoaWNoID09PSBLZXlDb2RlLkxFRlQpIHtcbiAgICAgIHRyaWdnZXJDaGFuZ2UoZmFsc2UsIGUpO1xuICAgIH0gZWxzZSBpZiAoZS53aGljaCA9PT0gS2V5Q29kZS5SSUdIVCkge1xuICAgICAgdHJpZ2dlckNoYW5nZSh0cnVlLCBlKTtcbiAgICB9XG5cbiAgICBvbktleURvd24gPT09IG51bGwgfHwgb25LZXlEb3duID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbktleURvd24oZSk7XG4gIH1cblxuICBmdW5jdGlvbiBvbkludGVybmFsQ2xpY2soZSkge1xuICAgIHZhciByZXQgPSB0cmlnZ2VyQ2hhbmdlKCFpbm5lckNoZWNrZWQsIGUpOyAvLyBbTGVnYWN5XSB0cmlnZ2VyIG9uQ2xpY2sgd2l0aCB2YWx1ZVxuXG4gICAgb25DbGljayA9PT0gbnVsbCB8fCBvbkNsaWNrID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNsaWNrKHJldCwgZSk7XG4gIH1cblxuICB2YXIgc3dpdGNoQ2xhc3NOYW1lID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIGNsYXNzTmFtZSwgKF9jbGFzc05hbWVzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jaGVja2VkXCIpLCBpbm5lckNoZWNrZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWRcIiksIGRpc2FibGVkKSwgX2NsYXNzTmFtZXMpKTtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwgT2JqZWN0LmFzc2lnbih7fSwgcmVzdFByb3BzLCB7XG4gICAgdHlwZTogXCJidXR0b25cIixcbiAgICByb2xlOiBcInN3aXRjaFwiLFxuICAgIFwiYXJpYS1jaGVja2VkXCI6IGlubmVyQ2hlY2tlZCxcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgY2xhc3NOYW1lOiBzd2l0Y2hDbGFzc05hbWUsXG4gICAgcmVmOiByZWYsXG4gICAgb25LZXlEb3duOiBvbkludGVybmFsS2V5RG93bixcbiAgICBvbkNsaWNrOiBvbkludGVybmFsQ2xpY2tcbiAgfSksIGxvYWRpbmdJY29uLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWlubmVyXCIpXG4gIH0sIGlubmVyQ2hlY2tlZCA/IGNoZWNrZWRDaGlsZHJlbiA6IHVuQ2hlY2tlZENoaWxkcmVuKSk7XG59KTtcblN3aXRjaC5kaXNwbGF5TmFtZSA9ICdTd2l0Y2gnO1xuZXhwb3J0IGRlZmF1bHQgU3dpdGNoOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgTG9hZGluZ091dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9Mb2FkaW5nT3V0bGluZWRcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJjU3dpdGNoIGZyb20gJ3JjLXN3aXRjaCc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCBEaXNhYmxlZENvbnRleHQgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL0Rpc2FibGVkQ29udGV4dCc7XG5pbXBvcnQgU2l6ZUNvbnRleHQgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL1NpemVDb250ZXh0JztcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4uL191dGlsL3dhcm5pbmcnO1xuaW1wb3J0IFdhdmUgZnJvbSAnLi4vX3V0aWwvd2F2ZSc7XG52YXIgU3dpdGNoID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKF9hLCByZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gX2EucHJlZml4Q2xzLFxuICAgIGN1c3RvbWl6ZVNpemUgPSBfYS5zaXplLFxuICAgIGN1c3RvbURpc2FibGVkID0gX2EuZGlzYWJsZWQsXG4gICAgbG9hZGluZyA9IF9hLmxvYWRpbmcsXG4gICAgX2EkY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lLFxuICAgIGNsYXNzTmFtZSA9IF9hJGNsYXNzTmFtZSA9PT0gdm9pZCAwID8gJycgOiBfYSRjbGFzc05hbWUsXG4gICAgcHJvcHMgPSBfX3Jlc3QoX2EsIFtcInByZWZpeENsc1wiLCBcInNpemVcIiwgXCJkaXNhYmxlZFwiLCBcImxvYWRpbmdcIiwgXCJjbGFzc05hbWVcIl0pO1xuICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCdjaGVja2VkJyBpbiBwcm9wcyB8fCAhKCd2YWx1ZScgaW4gcHJvcHMpLCAnU3dpdGNoJywgJ2B2YWx1ZWAgaXMgbm90IGEgdmFsaWQgcHJvcCwgZG8geW91IG1lYW4gYGNoZWNrZWRgPycpIDogdm9pZCAwO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICBkaXJlY3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb247XG4gIHZhciBzaXplID0gUmVhY3QudXNlQ29udGV4dChTaXplQ29udGV4dCk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PSBEaXNhYmxlZCA9PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGRpc2FibGVkID0gUmVhY3QudXNlQ29udGV4dChEaXNhYmxlZENvbnRleHQpO1xuICB2YXIgbWVyZ2VkRGlzYWJsZWQgPSAoY3VzdG9tRGlzYWJsZWQgIT09IG51bGwgJiYgY3VzdG9tRGlzYWJsZWQgIT09IHZvaWQgMCA/IGN1c3RvbURpc2FibGVkIDogZGlzYWJsZWQpIHx8IGxvYWRpbmc7XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3N3aXRjaCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIHZhciBsb2FkaW5nSWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGFuZGxlXCIpXG4gIH0sIGxvYWRpbmcgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTG9hZGluZ091dGxpbmVkLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxvYWRpbmctaWNvblwiKVxuICB9KSk7XG4gIHZhciBjbGFzc2VzID0gY2xhc3NOYW1lcygoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNtYWxsXCIpLCAoY3VzdG9taXplU2l6ZSB8fCBzaXplKSA9PT0gJ3NtYWxsJyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1sb2FkaW5nXCIpLCBsb2FkaW5nKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFdhdmUsIHtcbiAgICBpbnNlcnRFeHRyYU5vZGU6IHRydWVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmNTd2l0Y2gsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZTogY2xhc3NlcyxcbiAgICBkaXNhYmxlZDogbWVyZ2VkRGlzYWJsZWQsXG4gICAgcmVmOiByZWYsXG4gICAgbG9hZGluZ0ljb246IGxvYWRpbmdJY29uXG4gIH0pKSk7XG59KTtcblN3aXRjaC5fX0FOVF9TV0lUQ0ggPSB0cnVlO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgU3dpdGNoLmRpc3BsYXlOYW1lID0gJ1N3aXRjaCc7XG59XG5leHBvcnQgZGVmYXVsdCBTd2l0Y2g7IiwiLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuLyoqXG4gKiBUaGlzIGlzIGEgc3ludGFjdGljIHN1Z2FyIGZvciBgY29sdW1uc2AgcHJvcC5cbiAqIFNvIEhPQyB3aWxsIG5vdCB3b3JrIG9uIHRoaXMuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbmZ1bmN0aW9uIENvbHVtbkdyb3VwKF8pIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbHVtbkdyb3VwOyIsIi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cbi8qKlxuICogVGhpcyBpcyBhIHN5bnRhY3RpYyBzdWdhciBmb3IgYGNvbHVtbnNgIHByb3AuXG4gKiBTbyBIT0Mgd2lsbCBub3Qgd29yayBvbiB0aGlzLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5mdW5jdGlvbiBDb2x1bW4oXykge1xuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29sdW1uOyIsInZhciBJTlRFUk5BTF9LRVlfUFJFRklYID0gJ1JDX1RBQkxFX0tFWSc7XG5cbmZ1bmN0aW9uIHRvQXJyYXkoYXJyKSB7XG4gIGlmIChhcnIgPT09IHVuZGVmaW5lZCB8fCBhcnIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcnIpID8gYXJyIDogW2Fycl07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXRoVmFsdWUocmVjb3JkLCBwYXRoKSB7XG4gIC8vIFNraXAgaWYgcGF0aCBpcyBlbXB0eVxuICBpZiAoIXBhdGggJiYgdHlwZW9mIHBhdGggIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHJlY29yZDtcbiAgfVxuXG4gIHZhciBwYXRoTGlzdCA9IHRvQXJyYXkocGF0aCk7XG4gIHZhciBjdXJyZW50ID0gcmVjb3JkO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aExpc3QubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBpZiAoIWN1cnJlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBwcm9wID0gcGF0aExpc3RbaV07XG4gICAgY3VycmVudCA9IGN1cnJlbnRbcHJvcF07XG4gIH1cblxuICByZXR1cm4gY3VycmVudDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb2x1bW5zS2V5KGNvbHVtbnMpIHtcbiAgdmFyIGNvbHVtbktleXMgPSBbXTtcbiAgdmFyIGtleXMgPSB7fTtcbiAgY29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICB2YXIgX3JlZiA9IGNvbHVtbiB8fCB7fSxcbiAgICAgICAga2V5ID0gX3JlZi5rZXksXG4gICAgICAgIGRhdGFJbmRleCA9IF9yZWYuZGF0YUluZGV4O1xuXG4gICAgdmFyIG1lcmdlZEtleSA9IGtleSB8fCB0b0FycmF5KGRhdGFJbmRleCkuam9pbignLScpIHx8IElOVEVSTkFMX0tFWV9QUkVGSVg7XG5cbiAgICB3aGlsZSAoa2V5c1ttZXJnZWRLZXldKSB7XG4gICAgICBtZXJnZWRLZXkgPSBcIlwiLmNvbmNhdChtZXJnZWRLZXksIFwiX25leHRcIik7XG4gICAgfVxuXG4gICAga2V5c1ttZXJnZWRLZXldID0gdHJ1ZTtcbiAgICBjb2x1bW5LZXlzLnB1c2gobWVyZ2VkS2V5KTtcbiAgfSk7XG4gIHJldHVybiBjb2x1bW5LZXlzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlVmFsdWUodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB1bmRlZmluZWQ7XG59IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnOyAvLyBUZWxsIGNlbGwgdGhhdCBicm93c2VyIHN1cHBvcnQgc3RpY2t5XG5cbnZhciBTdGlja3lDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoZmFsc2UpO1xuZXhwb3J0IGRlZmF1bHQgU3RpY2t5Q29udGV4dDsiLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VMYXlvdXRFZmZlY3QgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTGF5b3V0RWZmZWN0XCI7XG5pbXBvcnQgdXNlRXZlbnQgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlRXZlbnRcIjtcbmltcG9ydCBzaGFsbG93RXF1YWwgZnJvbSAnc2hhbGxvd2VxdWFsJztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb250ZXh0KCkge1xuICB2YXIgQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuXG4gIHZhciBQcm92aWRlciA9IGZ1bmN0aW9uIFByb3ZpZGVyKF9yZWYpIHtcbiAgICB2YXIgdmFsdWUgPSBfcmVmLnZhbHVlLFxuICAgICAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG4gICAgdmFyIHZhbHVlUmVmID0gUmVhY3QudXNlUmVmKHZhbHVlKTtcbiAgICB2YWx1ZVJlZi5jdXJyZW50ID0gdmFsdWU7XG5cbiAgICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uIGdldFZhbHVlKCkge1xuICAgICAgICAgIHJldHVybiB2YWx1ZVJlZi5jdXJyZW50O1xuICAgICAgICB9LFxuICAgICAgICBsaXN0ZW5lcnM6IG5ldyBTZXQoKVxuICAgICAgfTtcbiAgICB9KSxcbiAgICAgICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMSksXG4gICAgICAgIGNvbnRleHQgPSBfUmVhY3QkdXNlU3RhdGUyWzBdO1xuXG4gICAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnRleHQubGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgIGxpc3RlbmVyKHZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH0sIFt2YWx1ZV0pO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICB2YWx1ZTogY29udGV4dFxuICAgIH0sIGNoaWxkcmVuKTtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIENvbnRleHQ6IENvbnRleHQsXG4gICAgUHJvdmlkZXI6IFByb3ZpZGVyXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gdXNlQ29udGV4dFNlbGVjdG9yKGhvbGRlciwgc2VsZWN0b3IpIHtcbiAgdmFyIGV2ZW50U2VsZWN0b3IgPSB1c2VFdmVudChzZWxlY3Rvcik7XG4gIHZhciBjb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChob2xkZXIgPT09IG51bGwgfHwgaG9sZGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBob2xkZXIuQ29udGV4dCk7XG5cbiAgdmFyIF9yZWYyID0gY29udGV4dCB8fCB7fSxcbiAgICAgIGxpc3RlbmVycyA9IF9yZWYyLmxpc3RlbmVycyxcbiAgICAgIGdldFZhbHVlID0gX3JlZjIuZ2V0VmFsdWU7XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTMgPSBSZWFjdC51c2VTdGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGV2ZW50U2VsZWN0b3IoY29udGV4dCA/IGdldFZhbHVlKCkgOiBudWxsKTtcbiAgfSksXG4gICAgICBfUmVhY3QkdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlMywgMiksXG4gICAgICB2YWx1ZSA9IF9SZWFjdCR1c2VTdGF0ZTRbMF0sXG4gICAgICBzZXRWYWx1ZSA9IF9SZWFjdCR1c2VTdGF0ZTRbMV07XG5cbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0cmlnZ2VyKG5leHRWYWx1ZSkge1xuICAgICAgc2V0VmFsdWUoZnVuY3Rpb24gKHByZXYpIHtcbiAgICAgICAgdmFyIHNlbGVjdGVkVmFsdWUgPSBldmVudFNlbGVjdG9yKG5leHRWYWx1ZSk7XG4gICAgICAgIHJldHVybiBzaGFsbG93RXF1YWwocHJldiwgc2VsZWN0ZWRWYWx1ZSkgPyBwcmV2IDogc2VsZWN0ZWRWYWx1ZTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGxpc3RlbmVycy5hZGQodHJpZ2dlcik7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxpc3RlbmVycy5kZWxldGUodHJpZ2dlcik7XG4gICAgfTtcbiAgfSwgW2NvbnRleHRdKTtcbiAgcmV0dXJuIHZhbHVlO1xufSIsImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICcuLi9Db250ZXh0U2VsZWN0b3InO1xudmFyIEhvdmVyQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQoKTtcbmV4cG9ydCBkZWZhdWx0IEhvdmVyQ29udGV4dDsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgQm9keUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmV4cG9ydCBkZWZhdWx0IEJvZHlDb250ZXh0OyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbnZhciBQZXJmQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgcmVuZGVyV2l0aFByb3BzOiBmYWxzZVxufSk7XG5leHBvcnQgZGVmYXVsdCBQZXJmQ29udGV4dDsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xudmFyIF9leGNsdWRlZCA9IFtcImNvbFNwYW5cIiwgXCJyb3dTcGFuXCIsIFwic3R5bGVcIiwgXCJjbGFzc05hbWVcIl07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBzaGFsbG93RXF1YWwgZnJvbSAnc2hhbGxvd2VxdWFsJztcbmltcG9ydCB7IHN1cHBvcnRSZWYgfSBmcm9tIFwicmMtdXRpbC9lcy9yZWZcIjtcbmltcG9ydCB7IGdldFBhdGhWYWx1ZSwgdmFsaWRhdGVWYWx1ZSB9IGZyb20gJy4uL3V0aWxzL3ZhbHVlVXRpbCc7XG5pbXBvcnQgU3RpY2t5Q29udGV4dCBmcm9tICcuLi9jb250ZXh0L1N0aWNreUNvbnRleHQnO1xuaW1wb3J0IEhvdmVyQ29udGV4dCBmcm9tICcuLi9jb250ZXh0L0hvdmVyQ29udGV4dCc7XG5pbXBvcnQgQm9keUNvbnRleHQgZnJvbSAnLi4vY29udGV4dC9Cb2R5Q29udGV4dCc7XG5pbXBvcnQgd2FybmluZyBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5pbXBvcnQgUGVyZkNvbnRleHQgZnJvbSAnLi4vY29udGV4dC9QZXJmQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VDb250ZXh0U2VsZWN0b3IgfSBmcm9tICcuLi9Db250ZXh0U2VsZWN0b3InO1xuLyoqIENoZWNrIGlmIGNlbGwgaXMgaW4gaG92ZXIgcmFuZ2UgKi9cblxuZnVuY3Rpb24gaW5Ib3ZlclJhbmdlKGNlbGxTdGFydFJvdywgY2VsbFJvd1NwYW4sIHN0YXJ0Um93LCBlbmRSb3cpIHtcbiAgdmFyIGNlbGxFbmRSb3cgPSBjZWxsU3RhcnRSb3cgKyBjZWxsUm93U3BhbiAtIDE7XG4gIHJldHVybiBjZWxsU3RhcnRSb3cgPD0gZW5kUm93ICYmIGNlbGxFbmRSb3cgPj0gc3RhcnRSb3c7XG59XG5cbmZ1bmN0aW9uIGlzUmVuZGVyQ2VsbChkYXRhKSB7XG4gIHJldHVybiBkYXRhICYmIF90eXBlb2YoZGF0YSkgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGRhdGEpICYmICEgLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KGRhdGEpO1xufVxuXG5mdW5jdGlvbiBpc1JlZkNvbXBvbmVudChjb21wb25lbnQpIHtcbiAgLy8gU3RyaW5nIHRhZyBjb21wb25lbnQgYWxzbyBzdXBwb3J0IHJlZlxuICBpZiAodHlwZW9mIGNvbXBvbmVudCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBzdXBwb3J0UmVmKGNvbXBvbmVudCk7XG59XG5cbnZhciBnZXRUaXRsZUZyb21DZWxsUmVuZGVyQ2hpbGRyZW4gPSBmdW5jdGlvbiBnZXRUaXRsZUZyb21DZWxsUmVuZGVyQ2hpbGRyZW4oX3JlZikge1xuICB2YXIgZWxsaXBzaXMgPSBfcmVmLmVsbGlwc2lzLFxuICAgICAgcm93VHlwZSA9IF9yZWYucm93VHlwZSxcbiAgICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgdmFyIHRpdGxlO1xuICB2YXIgZWxsaXBzaXNDb25maWcgPSBlbGxpcHNpcyA9PT0gdHJ1ZSA/IHtcbiAgICBzaG93VGl0bGU6IHRydWVcbiAgfSA6IGVsbGlwc2lzO1xuXG4gIGlmIChlbGxpcHNpc0NvbmZpZyAmJiAoZWxsaXBzaXNDb25maWcuc2hvd1RpdGxlIHx8IHJvd1R5cGUgPT09ICdoZWFkZXInKSkge1xuICAgIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBjaGlsZHJlbiA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRpdGxlID0gY2hpbGRyZW4udG9TdHJpbmcoKTtcbiAgICB9IGVsc2UgaWYgKCAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pICYmIHR5cGVvZiBjaGlsZHJlbi5wcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRpdGxlID0gY2hpbGRyZW4ucHJvcHMuY2hpbGRyZW47XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRpdGxlO1xufTtcblxuZnVuY3Rpb24gQ2VsbChfcmVmMiwgcmVmKSB7XG4gIHZhciBfcmVmNCwgX3JlZjUsIF9jbGFzc05hbWVzO1xuXG4gIHZhciBwcmVmaXhDbHMgPSBfcmVmMi5wcmVmaXhDbHMsXG4gICAgICBjbGFzc05hbWUgPSBfcmVmMi5jbGFzc05hbWUsXG4gICAgICByZWNvcmQgPSBfcmVmMi5yZWNvcmQsXG4gICAgICBpbmRleCA9IF9yZWYyLmluZGV4LFxuICAgICAgcmVuZGVySW5kZXggPSBfcmVmMi5yZW5kZXJJbmRleCxcbiAgICAgIGRhdGFJbmRleCA9IF9yZWYyLmRhdGFJbmRleCxcbiAgICAgIHJlbmRlciA9IF9yZWYyLnJlbmRlcixcbiAgICAgIGNoaWxkcmVuID0gX3JlZjIuY2hpbGRyZW4sXG4gICAgICBfcmVmMiRjb21wb25lbnQgPSBfcmVmMi5jb21wb25lbnQsXG4gICAgICBDb21wb25lbnQgPSBfcmVmMiRjb21wb25lbnQgPT09IHZvaWQgMCA/ICd0ZCcgOiBfcmVmMiRjb21wb25lbnQsXG4gICAgICBjb2xTcGFuID0gX3JlZjIuY29sU3BhbixcbiAgICAgIHJvd1NwYW4gPSBfcmVmMi5yb3dTcGFuLFxuICAgICAgZml4TGVmdCA9IF9yZWYyLmZpeExlZnQsXG4gICAgICBmaXhSaWdodCA9IF9yZWYyLmZpeFJpZ2h0LFxuICAgICAgZmlyc3RGaXhMZWZ0ID0gX3JlZjIuZmlyc3RGaXhMZWZ0LFxuICAgICAgbGFzdEZpeExlZnQgPSBfcmVmMi5sYXN0Rml4TGVmdCxcbiAgICAgIGZpcnN0Rml4UmlnaHQgPSBfcmVmMi5maXJzdEZpeFJpZ2h0LFxuICAgICAgbGFzdEZpeFJpZ2h0ID0gX3JlZjIubGFzdEZpeFJpZ2h0LFxuICAgICAgYXBwZW5kTm9kZSA9IF9yZWYyLmFwcGVuZE5vZGUsXG4gICAgICBfcmVmMiRhZGRpdGlvbmFsUHJvcHMgPSBfcmVmMi5hZGRpdGlvbmFsUHJvcHMsXG4gICAgICBhZGRpdGlvbmFsUHJvcHMgPSBfcmVmMiRhZGRpdGlvbmFsUHJvcHMgPT09IHZvaWQgMCA/IHt9IDogX3JlZjIkYWRkaXRpb25hbFByb3BzLFxuICAgICAgZWxsaXBzaXMgPSBfcmVmMi5lbGxpcHNpcyxcbiAgICAgIGFsaWduID0gX3JlZjIuYWxpZ24sXG4gICAgICByb3dUeXBlID0gX3JlZjIucm93VHlwZSxcbiAgICAgIGlzU3RpY2t5ID0gX3JlZjIuaXNTdGlja3ksXG4gICAgICBob3ZlcmluZyA9IF9yZWYyLmhvdmVyaW5nLFxuICAgICAgb25Ib3ZlciA9IF9yZWYyLm9uSG92ZXI7XG4gIHZhciBjZWxsUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jZWxsXCIpO1xuICB2YXIgcGVyZlJlY29yZCA9IFJlYWN0LnVzZUNvbnRleHQoUGVyZkNvbnRleHQpO1xuICB2YXIgc3VwcG9ydFN0aWNreSA9IFJlYWN0LnVzZUNvbnRleHQoU3RpY2t5Q29udGV4dCk7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChCb2R5Q29udGV4dCksXG4gICAgICBhbGxDb2x1bW5zRml4ZWRMZWZ0ID0gX1JlYWN0JHVzZUNvbnRleHQuYWxsQ29sdW1uc0ZpeGVkTGVmdDsgLy8gPT09PT09PT09PT09PT09PT09PT0gQ2hpbGQgTm9kZSA9PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIF9SZWFjdCR1c2VNZW1vID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHZhbGlkYXRlVmFsdWUoY2hpbGRyZW4pKSB7XG4gICAgICByZXR1cm4gW2NoaWxkcmVuXTtcbiAgICB9XG5cbiAgICB2YXIgdmFsdWUgPSBnZXRQYXRoVmFsdWUocmVjb3JkLCBkYXRhSW5kZXgpOyAvLyBDdXN0b21pemUgcmVuZGVyIG5vZGVcblxuICAgIHZhciByZXR1cm5DaGlsZE5vZGUgPSB2YWx1ZTtcbiAgICB2YXIgcmV0dXJuQ2VsbFByb3BzID0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKHJlbmRlcikge1xuICAgICAgdmFyIHJlbmRlckRhdGEgPSByZW5kZXIodmFsdWUsIHJlY29yZCwgcmVuZGVySW5kZXgpO1xuXG4gICAgICBpZiAoaXNSZW5kZXJDZWxsKHJlbmRlckRhdGEpKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgd2FybmluZyhmYWxzZSwgJ2Bjb2x1bW5zLnJlbmRlcmAgcmV0dXJuIGNlbGwgcHJvcHMgaXMgZGVwcmVjYXRlZCB3aXRoIHBlcmYgaXNzdWUsIHBsZWFzZSB1c2UgYG9uQ2VsbGAgaW5zdGVhZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybkNoaWxkTm9kZSA9IHJlbmRlckRhdGEuY2hpbGRyZW47XG4gICAgICAgIHJldHVybkNlbGxQcm9wcyA9IHJlbmRlckRhdGEucHJvcHM7XG4gICAgICAgIHBlcmZSZWNvcmQucmVuZGVyV2l0aFByb3BzID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybkNoaWxkTm9kZSA9IHJlbmRlckRhdGE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFtyZXR1cm5DaGlsZE5vZGUsIHJldHVybkNlbGxQcm9wc107XG4gIH0sIFtcbiAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzICovXG4gIC8vIEFsd2F5cyByZS1yZW5kZXIgaWYgYHJlbmRlcldpdGhQcm9wc2BcbiAgcGVyZlJlY29yZC5yZW5kZXJXaXRoUHJvcHMgPyBNYXRoLnJhbmRvbSgpIDogMCxcbiAgLyogZXNsaW50LWVuYWJsZSAqL1xuICBjaGlsZHJlbiwgZGF0YUluZGV4LCBwZXJmUmVjb3JkLCByZWNvcmQsIHJlbmRlciwgcmVuZGVySW5kZXhdKSxcbiAgICAgIF9SZWFjdCR1c2VNZW1vMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VNZW1vLCAyKSxcbiAgICAgIGNoaWxkTm9kZSA9IF9SZWFjdCR1c2VNZW1vMlswXSxcbiAgICAgIGxlZ2FjeUNlbGxQcm9wcyA9IF9SZWFjdCR1c2VNZW1vMlsxXTtcblxuICB2YXIgbWVyZ2VkQ2hpbGROb2RlID0gY2hpbGROb2RlOyAvLyBOb3QgY3Jhc2ggaWYgZmluYWwgYGNoaWxkTm9kZWAgaXMgbm90IHZhbGlkYXRlIFJlYWN0Tm9kZVxuXG4gIGlmIChfdHlwZW9mKG1lcmdlZENoaWxkTm9kZSkgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KG1lcmdlZENoaWxkTm9kZSkgJiYgISAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQobWVyZ2VkQ2hpbGROb2RlKSkge1xuICAgIG1lcmdlZENoaWxkTm9kZSA9IG51bGw7XG4gIH1cblxuICBpZiAoZWxsaXBzaXMgJiYgKGxhc3RGaXhMZWZ0IHx8IGZpcnN0Rml4UmlnaHQpKSB7XG4gICAgbWVyZ2VkQ2hpbGROb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItY29udGVudFwiKVxuICAgIH0sIG1lcmdlZENoaWxkTm9kZSk7XG4gIH1cblxuICB2YXIgX3JlZjMgPSBsZWdhY3lDZWxsUHJvcHMgfHwge30sXG4gICAgICBjZWxsQ29sU3BhbiA9IF9yZWYzLmNvbFNwYW4sXG4gICAgICBjZWxsUm93U3BhbiA9IF9yZWYzLnJvd1NwYW4sXG4gICAgICBjZWxsU3R5bGUgPSBfcmVmMy5zdHlsZSxcbiAgICAgIGNlbGxDbGFzc05hbWUgPSBfcmVmMy5jbGFzc05hbWUsXG4gICAgICByZXN0Q2VsbFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYzLCBfZXhjbHVkZWQpO1xuXG4gIHZhciBtZXJnZWRDb2xTcGFuID0gKF9yZWY0ID0gY2VsbENvbFNwYW4gIT09IHVuZGVmaW5lZCA/IGNlbGxDb2xTcGFuIDogY29sU3BhbikgIT09IG51bGwgJiYgX3JlZjQgIT09IHZvaWQgMCA/IF9yZWY0IDogMTtcbiAgdmFyIG1lcmdlZFJvd1NwYW4gPSAoX3JlZjUgPSBjZWxsUm93U3BhbiAhPT0gdW5kZWZpbmVkID8gY2VsbFJvd1NwYW4gOiByb3dTcGFuKSAhPT0gbnVsbCAmJiBfcmVmNSAhPT0gdm9pZCAwID8gX3JlZjUgOiAxO1xuXG4gIGlmIChtZXJnZWRDb2xTcGFuID09PSAwIHx8IG1lcmdlZFJvd1NwYW4gPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyA9PT09PT09PT09PT09PT09PT09PT09IEZpeGVkID09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICB2YXIgZml4ZWRTdHlsZSA9IHt9O1xuICB2YXIgaXNGaXhMZWZ0ID0gdHlwZW9mIGZpeExlZnQgPT09ICdudW1iZXInICYmIHN1cHBvcnRTdGlja3k7XG4gIHZhciBpc0ZpeFJpZ2h0ID0gdHlwZW9mIGZpeFJpZ2h0ID09PSAnbnVtYmVyJyAmJiBzdXBwb3J0U3RpY2t5O1xuXG4gIGlmIChpc0ZpeExlZnQpIHtcbiAgICBmaXhlZFN0eWxlLnBvc2l0aW9uID0gJ3N0aWNreSc7XG4gICAgZml4ZWRTdHlsZS5sZWZ0ID0gZml4TGVmdDtcbiAgfVxuXG4gIGlmIChpc0ZpeFJpZ2h0KSB7XG4gICAgZml4ZWRTdHlsZS5wb3NpdGlvbiA9ICdzdGlja3knO1xuICAgIGZpeGVkU3R5bGUucmlnaHQgPSBmaXhSaWdodDtcbiAgfSAvLyA9PT09PT09PT09PT09PT09PT09PT09IEFsaWduID09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICB2YXIgYWxpZ25TdHlsZSA9IHt9O1xuXG4gIGlmIChhbGlnbikge1xuICAgIGFsaWduU3R5bGUudGV4dEFsaWduID0gYWxpZ247XG4gIH0gLy8gPT09PT09PT09PT09PT09PT09PT09PSBIb3ZlciA9PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIG9uTW91c2VFbnRlciA9IGZ1bmN0aW9uIG9uTW91c2VFbnRlcihldmVudCkge1xuICAgIHZhciBfYWRkaXRpb25hbFByb3BzJG9uTW87XG5cbiAgICBpZiAocmVjb3JkKSB7XG4gICAgICBvbkhvdmVyKGluZGV4LCBpbmRleCArIG1lcmdlZFJvd1NwYW4gLSAxKTtcbiAgICB9XG5cbiAgICBhZGRpdGlvbmFsUHJvcHMgPT09IG51bGwgfHwgYWRkaXRpb25hbFByb3BzID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX2FkZGl0aW9uYWxQcm9wcyRvbk1vID0gYWRkaXRpb25hbFByb3BzLm9uTW91c2VFbnRlcikgPT09IG51bGwgfHwgX2FkZGl0aW9uYWxQcm9wcyRvbk1vID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYWRkaXRpb25hbFByb3BzJG9uTW8uY2FsbChhZGRpdGlvbmFsUHJvcHMsIGV2ZW50KTtcbiAgfTtcblxuICB2YXIgb25Nb3VzZUxlYXZlID0gZnVuY3Rpb24gb25Nb3VzZUxlYXZlKGV2ZW50KSB7XG4gICAgdmFyIF9hZGRpdGlvbmFsUHJvcHMkb25NbzI7XG5cbiAgICBpZiAocmVjb3JkKSB7XG4gICAgICBvbkhvdmVyKC0xLCAtMSk7XG4gICAgfVxuXG4gICAgYWRkaXRpb25hbFByb3BzID09PSBudWxsIHx8IGFkZGl0aW9uYWxQcm9wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9hZGRpdGlvbmFsUHJvcHMkb25NbzIgPSBhZGRpdGlvbmFsUHJvcHMub25Nb3VzZUxlYXZlKSA9PT0gbnVsbCB8fCBfYWRkaXRpb25hbFByb3BzJG9uTW8yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYWRkaXRpb25hbFByb3BzJG9uTW8yLmNhbGwoYWRkaXRpb25hbFByb3BzLCBldmVudCk7XG4gIH07IC8vID09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIHZhciB0aXRsZSA9IGdldFRpdGxlRnJvbUNlbGxSZW5kZXJDaGlsZHJlbih7XG4gICAgcm93VHlwZTogcm93VHlwZSxcbiAgICBlbGxpcHNpczogZWxsaXBzaXMsXG4gICAgY2hpbGRyZW46IGNoaWxkTm9kZVxuICB9KTtcblxuICB2YXIgY29tcG9uZW50UHJvcHMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7XG4gICAgdGl0bGU6IHRpdGxlXG4gIH0sIHJlc3RDZWxsUHJvcHMpLCBhZGRpdGlvbmFsUHJvcHMpLCB7fSwge1xuICAgIGNvbFNwYW46IG1lcmdlZENvbFNwYW4gIT09IDEgPyBtZXJnZWRDb2xTcGFuIDogbnVsbCxcbiAgICByb3dTcGFuOiBtZXJnZWRSb3dTcGFuICE9PSAxID8gbWVyZ2VkUm93U3BhbiA6IG51bGwsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNlbGxQcmVmaXhDbHMsIGNsYXNzTmFtZSwgKF9jbGFzc05hbWVzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItZml4LWxlZnRcIiksIGlzRml4TGVmdCAmJiBzdXBwb3J0U3RpY2t5KSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1maXgtbGVmdC1maXJzdFwiKSwgZmlyc3RGaXhMZWZ0ICYmIHN1cHBvcnRTdGlja3kpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KGNlbGxQcmVmaXhDbHMsIFwiLWZpeC1sZWZ0LWxhc3RcIiksIGxhc3RGaXhMZWZ0ICYmIHN1cHBvcnRTdGlja3kpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KGNlbGxQcmVmaXhDbHMsIFwiLWZpeC1sZWZ0LWFsbFwiKSwgbGFzdEZpeExlZnQgJiYgYWxsQ29sdW1uc0ZpeGVkTGVmdCAmJiBzdXBwb3J0U3RpY2t5KSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1maXgtcmlnaHRcIiksIGlzRml4UmlnaHQgJiYgc3VwcG9ydFN0aWNreSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItZml4LXJpZ2h0LWZpcnN0XCIpLCBmaXJzdEZpeFJpZ2h0ICYmIHN1cHBvcnRTdGlja3kpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KGNlbGxQcmVmaXhDbHMsIFwiLWZpeC1yaWdodC1sYXN0XCIpLCBsYXN0Rml4UmlnaHQgJiYgc3VwcG9ydFN0aWNreSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItZWxsaXBzaXNcIiksIGVsbGlwc2lzKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi13aXRoLWFwcGVuZFwiKSwgYXBwZW5kTm9kZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQoY2VsbFByZWZpeENscywgXCItZml4LXN0aWNreVwiKSwgKGlzRml4TGVmdCB8fCBpc0ZpeFJpZ2h0KSAmJiBpc1N0aWNreSAmJiBzdXBwb3J0U3RpY2t5KSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChjZWxsUHJlZml4Q2xzLCBcIi1yb3ctaG92ZXJcIiksICFsZWdhY3lDZWxsUHJvcHMgJiYgaG92ZXJpbmcpLCBfY2xhc3NOYW1lcyksIGFkZGl0aW9uYWxQcm9wcy5jbGFzc05hbWUsIGNlbGxDbGFzc05hbWUpLFxuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBhZGRpdGlvbmFsUHJvcHMuc3R5bGUpLCBhbGlnblN0eWxlKSwgZml4ZWRTdHlsZSksIGNlbGxTdHlsZSksXG4gICAgb25Nb3VzZUVudGVyOiBvbk1vdXNlRW50ZXIsXG4gICAgb25Nb3VzZUxlYXZlOiBvbk1vdXNlTGVhdmUsXG4gICAgcmVmOiBpc1JlZkNvbXBvbmVudChDb21wb25lbnQpID8gcmVmIDogbnVsbFxuICB9KTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBjb21wb25lbnRQcm9wcywgYXBwZW5kTm9kZSwgbWVyZ2VkQ2hpbGROb2RlKTtcbn1cblxudmFyIFJlZkNlbGwgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihDZWxsKTtcblJlZkNlbGwuZGlzcGxheU5hbWUgPSAnQ2VsbCc7XG52YXIgY29tcGFyZVByb3BMaXN0ID0gWydleHBhbmRlZCcsICdjbGFzc05hbWUnLCAnaG92ZXJpbmcnXTtcbnZhciBNZW1vQ2VsbCA9IC8qI19fUFVSRV9fKi9SZWFjdC5tZW1vKFJlZkNlbGwsIGZ1bmN0aW9uIChwcmV2LCBuZXh0KSB7XG4gIGlmIChuZXh0LnNob3VsZENlbGxVcGRhdGUpIHtcbiAgICByZXR1cm4gKC8vIEFkZGl0aW9uYWwgaGFuZGxlIG9mIGV4cGFuZGVkIGxvZ2ljXG4gICAgICBjb21wYXJlUHJvcExpc3QuZXZlcnkoZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gICAgICAgIHJldHVybiBwcmV2W3Byb3BOYW1lXSA9PT0gbmV4dFtwcm9wTmFtZV07XG4gICAgICB9KSAmJiAvLyBVc2VyIGNvbnRyb2wgdXBkYXRlIGxvZ2ljXG4gICAgICAhbmV4dC5zaG91bGRDZWxsVXBkYXRlKG5leHQucmVjb3JkLCBwcmV2LnJlY29yZClcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHNoYWxsb3dFcXVhbChwcmV2LCBuZXh0KTtcbn0pO1xuLyoqIEluamVjdCBob3ZlciBkYXRhIGhlcmUsIHdlIHN0aWxsIHdpc2ggTWVtb0NlbGwga2VlcCBzaW1wbGUgYHNob3VsZENlbGxVcGRhdGVgIGxvZ2ljICovXG5cbnZhciBXcmFwcGVkQ2VsbCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBpbmRleCA9IHByb3BzLmluZGV4LFxuICAgICAgX3Byb3BzJGFkZGl0aW9uYWxQcm9wID0gcHJvcHMuYWRkaXRpb25hbFByb3BzLFxuICAgICAgYWRkaXRpb25hbFByb3BzID0gX3Byb3BzJGFkZGl0aW9uYWxQcm9wID09PSB2b2lkIDAgPyB7fSA6IF9wcm9wcyRhZGRpdGlvbmFsUHJvcCxcbiAgICAgIGNvbFNwYW4gPSBwcm9wcy5jb2xTcGFuLFxuICAgICAgcm93U3BhbiA9IHByb3BzLnJvd1NwYW47XG4gIHZhciBjZWxsQ29sU3BhbiA9IGFkZGl0aW9uYWxQcm9wcy5jb2xTcGFuLFxuICAgICAgY2VsbFJvd1NwYW4gPSBhZGRpdGlvbmFsUHJvcHMucm93U3BhbjtcbiAgdmFyIG1lcmdlZENvbFNwYW4gPSBjb2xTcGFuICE9PSBudWxsICYmIGNvbFNwYW4gIT09IHZvaWQgMCA/IGNvbFNwYW4gOiBjZWxsQ29sU3BhbjtcbiAgdmFyIG1lcmdlZFJvd1NwYW4gPSByb3dTcGFuICE9PSBudWxsICYmIHJvd1NwYW4gIT09IHZvaWQgMCA/IHJvd1NwYW4gOiBjZWxsUm93U3BhbjtcblxuICB2YXIgX3VzZUNvbnRleHRTZWxlY3RvciA9IHVzZUNvbnRleHRTZWxlY3RvcihIb3ZlckNvbnRleHQsIGZ1bmN0aW9uIChjeHQpIHtcbiAgICB2YXIgaXNIb3ZlcmluZyA9IGluSG92ZXJSYW5nZShpbmRleCwgbWVyZ2VkUm93U3BhbiB8fCAxLCBjeHQgPT09IG51bGwgfHwgY3h0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjeHQuc3RhcnRSb3csIGN4dCA9PT0gbnVsbCB8fCBjeHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGN4dC5lbmRSb3cpO1xuICAgIHJldHVybiB7XG4gICAgICBvbkhvdmVyOiBjeHQgPT09IG51bGwgfHwgY3h0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjeHQub25Ib3ZlcixcbiAgICAgIGhvdmVyaW5nOiBpc0hvdmVyaW5nXG4gICAgfTtcbiAgfSksXG4gICAgICBvbkhvdmVyID0gX3VzZUNvbnRleHRTZWxlY3Rvci5vbkhvdmVyLFxuICAgICAgaG92ZXJpbmcgPSBfdXNlQ29udGV4dFNlbGVjdG9yLmhvdmVyaW5nO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNZW1vQ2VsbCwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgY29sU3BhbjogbWVyZ2VkQ29sU3BhbixcbiAgICByb3dTcGFuOiBtZXJnZWRSb3dTcGFuLFxuICAgIGhvdmVyaW5nOiBob3ZlcmluZyxcbiAgICByZWY6IHJlZixcbiAgICBvbkhvdmVyOiBvbkhvdmVyXG4gIH0pKTtcbn0pO1xuV3JhcHBlZENlbGwuZGlzcGxheU5hbWUgPSAnV3JhcHBlZENlbGwnO1xuZXhwb3J0IGRlZmF1bHQgV3JhcHBlZENlbGw7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIFRhYmxlQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuZXhwb3J0IGRlZmF1bHQgVGFibGVDb250ZXh0OyIsImV4cG9ydCBmdW5jdGlvbiBnZXRDZWxsRml4ZWRJbmZvKGNvbFN0YXJ0LCBjb2xFbmQsIGNvbHVtbnMsIHN0aWNreU9mZnNldHMsIGRpcmVjdGlvbikge1xuICB2YXIgc3RhcnRDb2x1bW4gPSBjb2x1bW5zW2NvbFN0YXJ0XSB8fCB7fTtcbiAgdmFyIGVuZENvbHVtbiA9IGNvbHVtbnNbY29sRW5kXSB8fCB7fTtcbiAgdmFyIGZpeExlZnQ7XG4gIHZhciBmaXhSaWdodDtcblxuICBpZiAoc3RhcnRDb2x1bW4uZml4ZWQgPT09ICdsZWZ0Jykge1xuICAgIGZpeExlZnQgPSBzdGlja3lPZmZzZXRzLmxlZnRbY29sU3RhcnRdO1xuICB9IGVsc2UgaWYgKGVuZENvbHVtbi5maXhlZCA9PT0gJ3JpZ2h0Jykge1xuICAgIGZpeFJpZ2h0ID0gc3RpY2t5T2Zmc2V0cy5yaWdodFtjb2xFbmRdO1xuICB9XG5cbiAgdmFyIGxhc3RGaXhMZWZ0ID0gZmFsc2U7XG4gIHZhciBmaXJzdEZpeFJpZ2h0ID0gZmFsc2U7XG4gIHZhciBsYXN0Rml4UmlnaHQgPSBmYWxzZTtcbiAgdmFyIGZpcnN0Rml4TGVmdCA9IGZhbHNlO1xuICB2YXIgbmV4dENvbHVtbiA9IGNvbHVtbnNbY29sRW5kICsgMV07XG4gIHZhciBwcmV2Q29sdW1uID0gY29sdW1uc1tjb2xTdGFydCAtIDFdO1xuXG4gIGlmIChkaXJlY3Rpb24gPT09ICdydGwnKSB7XG4gICAgaWYgKGZpeExlZnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHByZXZGaXhMZWZ0ID0gcHJldkNvbHVtbiAmJiBwcmV2Q29sdW1uLmZpeGVkID09PSAnbGVmdCc7XG4gICAgICBmaXJzdEZpeExlZnQgPSAhcHJldkZpeExlZnQ7XG4gICAgfSBlbHNlIGlmIChmaXhSaWdodCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgbmV4dEZpeFJpZ2h0ID0gbmV4dENvbHVtbiAmJiBuZXh0Q29sdW1uLmZpeGVkID09PSAncmlnaHQnO1xuICAgICAgbGFzdEZpeFJpZ2h0ID0gIW5leHRGaXhSaWdodDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZml4TGVmdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIG5leHRGaXhMZWZ0ID0gbmV4dENvbHVtbiAmJiBuZXh0Q29sdW1uLmZpeGVkID09PSAnbGVmdCc7XG4gICAgbGFzdEZpeExlZnQgPSAhbmV4dEZpeExlZnQ7XG4gIH0gZWxzZSBpZiAoZml4UmlnaHQgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBwcmV2Rml4UmlnaHQgPSBwcmV2Q29sdW1uICYmIHByZXZDb2x1bW4uZml4ZWQgPT09ICdyaWdodCc7XG4gICAgZmlyc3RGaXhSaWdodCA9ICFwcmV2Rml4UmlnaHQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGZpeExlZnQ6IGZpeExlZnQsXG4gICAgZml4UmlnaHQ6IGZpeFJpZ2h0LFxuICAgIGxhc3RGaXhMZWZ0OiBsYXN0Rml4TGVmdCxcbiAgICBmaXJzdEZpeFJpZ2h0OiBmaXJzdEZpeFJpZ2h0LFxuICAgIGxhc3RGaXhSaWdodDogbGFzdEZpeFJpZ2h0LFxuICAgIGZpcnN0Rml4TGVmdDogZmlyc3RGaXhMZWZ0LFxuICAgIGlzU3RpY2t5OiBzdGlja3lPZmZzZXRzLmlzU3RpY2t5XG4gIH07XG59IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQ2VsbCBmcm9tICcuLi9DZWxsJztcbmltcG9ydCBUYWJsZUNvbnRleHQgZnJvbSAnLi4vY29udGV4dC9UYWJsZUNvbnRleHQnO1xuaW1wb3J0IHsgZ2V0Q2VsbEZpeGVkSW5mbyB9IGZyb20gJy4uL3V0aWxzL2ZpeFV0aWwnO1xuaW1wb3J0IHsgZ2V0Q29sdW1uc0tleSB9IGZyb20gJy4uL3V0aWxzL3ZhbHVlVXRpbCc7XG5cbmZ1bmN0aW9uIEhlYWRlclJvdyhfcmVmKSB7XG4gIHZhciBjZWxscyA9IF9yZWYuY2VsbHMsXG4gICAgICBzdGlja3lPZmZzZXRzID0gX3JlZi5zdGlja3lPZmZzZXRzLFxuICAgICAgZmxhdHRlbkNvbHVtbnMgPSBfcmVmLmZsYXR0ZW5Db2x1bW5zLFxuICAgICAgUm93Q29tcG9uZW50ID0gX3JlZi5yb3dDb21wb25lbnQsXG4gICAgICBDZWxsQ29tcG9uZW50ID0gX3JlZi5jZWxsQ29tcG9uZW50LFxuICAgICAgb25IZWFkZXJSb3cgPSBfcmVmLm9uSGVhZGVyUm93LFxuICAgICAgaW5kZXggPSBfcmVmLmluZGV4O1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoVGFibGVDb250ZXh0KSxcbiAgICAgIHByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LnByZWZpeENscyxcbiAgICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcblxuICB2YXIgcm93UHJvcHM7XG5cbiAgaWYgKG9uSGVhZGVyUm93KSB7XG4gICAgcm93UHJvcHMgPSBvbkhlYWRlclJvdyhjZWxscy5tYXAoZnVuY3Rpb24gKGNlbGwpIHtcbiAgICAgIHJldHVybiBjZWxsLmNvbHVtbjtcbiAgICB9KSwgaW5kZXgpO1xuICB9XG5cbiAgdmFyIGNvbHVtbnNLZXkgPSBnZXRDb2x1bW5zS2V5KGNlbGxzLm1hcChmdW5jdGlvbiAoY2VsbCkge1xuICAgIHJldHVybiBjZWxsLmNvbHVtbjtcbiAgfSkpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUm93Q29tcG9uZW50LCByb3dQcm9wcywgY2VsbHMubWFwKGZ1bmN0aW9uIChjZWxsLCBjZWxsSW5kZXgpIHtcbiAgICB2YXIgY29sdW1uID0gY2VsbC5jb2x1bW47XG4gICAgdmFyIGZpeGVkSW5mbyA9IGdldENlbGxGaXhlZEluZm8oY2VsbC5jb2xTdGFydCwgY2VsbC5jb2xFbmQsIGZsYXR0ZW5Db2x1bW5zLCBzdGlja3lPZmZzZXRzLCBkaXJlY3Rpb24pO1xuICAgIHZhciBhZGRpdGlvbmFsUHJvcHM7XG5cbiAgICBpZiAoY29sdW1uICYmIGNvbHVtbi5vbkhlYWRlckNlbGwpIHtcbiAgICAgIGFkZGl0aW9uYWxQcm9wcyA9IGNlbGwuY29sdW1uLm9uSGVhZGVyQ2VsbChjb2x1bW4pO1xuICAgIH1cblxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDZWxsLCBfZXh0ZW5kcyh7fSwgY2VsbCwge1xuICAgICAgZWxsaXBzaXM6IGNvbHVtbi5lbGxpcHNpcyxcbiAgICAgIGFsaWduOiBjb2x1bW4uYWxpZ24sXG4gICAgICBjb21wb25lbnQ6IENlbGxDb21wb25lbnQsXG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIGtleTogY29sdW1uc0tleVtjZWxsSW5kZXhdXG4gICAgfSwgZml4ZWRJbmZvLCB7XG4gICAgICBhZGRpdGlvbmFsUHJvcHM6IGFkZGl0aW9uYWxQcm9wcyxcbiAgICAgIHJvd1R5cGU6IFwiaGVhZGVyXCJcbiAgICB9KSk7XG4gIH0pKTtcbn1cblxuSGVhZGVyUm93LmRpc3BsYXlOYW1lID0gJ0hlYWRlclJvdyc7XG5leHBvcnQgZGVmYXVsdCBIZWFkZXJSb3c7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEhlYWRlclJvdyBmcm9tICcuL0hlYWRlclJvdyc7XG5pbXBvcnQgVGFibGVDb250ZXh0IGZyb20gJy4uL2NvbnRleHQvVGFibGVDb250ZXh0JztcblxuZnVuY3Rpb24gcGFyc2VIZWFkZXJSb3dzKHJvb3RDb2x1bW5zKSB7XG4gIHZhciByb3dzID0gW107XG5cbiAgZnVuY3Rpb24gZmlsbFJvd0NlbGxzKGNvbHVtbnMsIGNvbEluZGV4KSB7XG4gICAgdmFyIHJvd0luZGV4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAwO1xuICAgIC8vIEluaXQgcm93c1xuICAgIHJvd3Nbcm93SW5kZXhdID0gcm93c1tyb3dJbmRleF0gfHwgW107XG4gICAgdmFyIGN1cnJlbnRDb2xJbmRleCA9IGNvbEluZGV4O1xuICAgIHZhciBjb2xTcGFucyA9IGNvbHVtbnMuZmlsdGVyKEJvb2xlYW4pLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICB2YXIgY2VsbCA9IHtcbiAgICAgICAga2V5OiBjb2x1bW4ua2V5LFxuICAgICAgICBjbGFzc05hbWU6IGNvbHVtbi5jbGFzc05hbWUgfHwgJycsXG4gICAgICAgIGNoaWxkcmVuOiBjb2x1bW4udGl0bGUsXG4gICAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAgICBjb2xTdGFydDogY3VycmVudENvbEluZGV4XG4gICAgICB9O1xuICAgICAgdmFyIGNvbFNwYW4gPSAxO1xuICAgICAgdmFyIHN1YkNvbHVtbnMgPSBjb2x1bW4uY2hpbGRyZW47XG5cbiAgICAgIGlmIChzdWJDb2x1bW5zICYmIHN1YkNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb2xTcGFuID0gZmlsbFJvd0NlbGxzKHN1YkNvbHVtbnMsIGN1cnJlbnRDb2xJbmRleCwgcm93SW5kZXggKyAxKS5yZWR1Y2UoZnVuY3Rpb24gKHRvdGFsLCBjb3VudCkge1xuICAgICAgICAgIHJldHVybiB0b3RhbCArIGNvdW50O1xuICAgICAgICB9LCAwKTtcbiAgICAgICAgY2VsbC5oYXNTdWJDb2x1bW5zID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCdjb2xTcGFuJyBpbiBjb2x1bW4pIHtcbiAgICAgICAgY29sU3BhbiA9IGNvbHVtbi5jb2xTcGFuO1xuICAgICAgfVxuXG4gICAgICBpZiAoJ3Jvd1NwYW4nIGluIGNvbHVtbikge1xuICAgICAgICBjZWxsLnJvd1NwYW4gPSBjb2x1bW4ucm93U3BhbjtcbiAgICAgIH1cblxuICAgICAgY2VsbC5jb2xTcGFuID0gY29sU3BhbjtcbiAgICAgIGNlbGwuY29sRW5kID0gY2VsbC5jb2xTdGFydCArIGNvbFNwYW4gLSAxO1xuICAgICAgcm93c1tyb3dJbmRleF0ucHVzaChjZWxsKTtcbiAgICAgIGN1cnJlbnRDb2xJbmRleCArPSBjb2xTcGFuO1xuICAgICAgcmV0dXJuIGNvbFNwYW47XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbFNwYW5zO1xuICB9IC8vIEdlbmVyYXRlIGByb3dzYCBjZWxsIGRhdGFcblxuXG4gIGZpbGxSb3dDZWxscyhyb290Q29sdW1ucywgMCk7IC8vIEhhbmRsZSBgcm93U3BhbmBcblxuICB2YXIgcm93Q291bnQgPSByb3dzLmxlbmd0aDtcblxuICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChyb3dJbmRleCkge1xuICAgIHJvd3Nbcm93SW5kZXhdLmZvckVhY2goZnVuY3Rpb24gKGNlbGwpIHtcbiAgICAgIGlmICghKCdyb3dTcGFuJyBpbiBjZWxsKSAmJiAhY2VsbC5oYXNTdWJDb2x1bW5zKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBjZWxsLnJvd1NwYW4gPSByb3dDb3VudCAtIHJvd0luZGV4O1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGZvciAodmFyIHJvd0luZGV4ID0gMDsgcm93SW5kZXggPCByb3dDb3VudDsgcm93SW5kZXggKz0gMSkge1xuICAgIF9sb29wKHJvd0luZGV4KTtcbiAgfVxuXG4gIHJldHVybiByb3dzO1xufVxuXG5mdW5jdGlvbiBIZWFkZXIoX3JlZikge1xuICB2YXIgc3RpY2t5T2Zmc2V0cyA9IF9yZWYuc3RpY2t5T2Zmc2V0cyxcbiAgICAgIGNvbHVtbnMgPSBfcmVmLmNvbHVtbnMsXG4gICAgICBmbGF0dGVuQ29sdW1ucyA9IF9yZWYuZmxhdHRlbkNvbHVtbnMsXG4gICAgICBvbkhlYWRlclJvdyA9IF9yZWYub25IZWFkZXJSb3c7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChUYWJsZUNvbnRleHQpLFxuICAgICAgcHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQucHJlZml4Q2xzLFxuICAgICAgZ2V0Q29tcG9uZW50ID0gX1JlYWN0JHVzZUNvbnRleHQuZ2V0Q29tcG9uZW50O1xuXG4gIHZhciByb3dzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHBhcnNlSGVhZGVyUm93cyhjb2x1bW5zKTtcbiAgfSwgW2NvbHVtbnNdKTtcbiAgdmFyIFdyYXBwZXJDb21wb25lbnQgPSBnZXRDb21wb25lbnQoWydoZWFkZXInLCAnd3JhcHBlciddLCAndGhlYWQnKTtcbiAgdmFyIHRyQ29tcG9uZW50ID0gZ2V0Q29tcG9uZW50KFsnaGVhZGVyJywgJ3JvdyddLCAndHInKTtcbiAgdmFyIHRoQ29tcG9uZW50ID0gZ2V0Q29tcG9uZW50KFsnaGVhZGVyJywgJ2NlbGwnXSwgJ3RoJyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChXcmFwcGVyQ29tcG9uZW50LCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRoZWFkXCIpXG4gIH0sIHJvd3MubWFwKGZ1bmN0aW9uIChyb3csIHJvd0luZGV4KSB7XG4gICAgdmFyIHJvd05vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChIZWFkZXJSb3csIHtcbiAgICAgIGtleTogcm93SW5kZXgsXG4gICAgICBmbGF0dGVuQ29sdW1uczogZmxhdHRlbkNvbHVtbnMsXG4gICAgICBjZWxsczogcm93LFxuICAgICAgc3RpY2t5T2Zmc2V0czogc3RpY2t5T2Zmc2V0cyxcbiAgICAgIHJvd0NvbXBvbmVudDogdHJDb21wb25lbnQsXG4gICAgICBjZWxsQ29tcG9uZW50OiB0aENvbXBvbmVudCxcbiAgICAgIG9uSGVhZGVyUm93OiBvbkhlYWRlclJvdyxcbiAgICAgIGluZGV4OiByb3dJbmRleFxuICAgIH0pO1xuICAgIHJldHVybiByb3dOb2RlO1xuICB9KSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEhlYWRlcjsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG52YXIgRXhwYW5kZWRSb3dDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5leHBvcnQgZGVmYXVsdCBFeHBhbmRlZFJvd0NvbnRleHQ7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IENlbGwgZnJvbSAnLi4vQ2VsbCc7XG5pbXBvcnQgVGFibGVDb250ZXh0IGZyb20gJy4uL2NvbnRleHQvVGFibGVDb250ZXh0JztcbmltcG9ydCBFeHBhbmRlZFJvd0NvbnRleHQgZnJvbSAnLi4vY29udGV4dC9FeHBhbmRlZFJvd0NvbnRleHQnO1xuXG5mdW5jdGlvbiBFeHBhbmRlZFJvdyhfcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICAgIENvbXBvbmVudCA9IF9yZWYuY29tcG9uZW50LFxuICAgICAgY2VsbENvbXBvbmVudCA9IF9yZWYuY2VsbENvbXBvbmVudCxcbiAgICAgIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgICAgZXhwYW5kZWQgPSBfcmVmLmV4cGFuZGVkLFxuICAgICAgY29sU3BhbiA9IF9yZWYuY29sU3BhbixcbiAgICAgIGlzRW1wdHkgPSBfcmVmLmlzRW1wdHk7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChUYWJsZUNvbnRleHQpLFxuICAgICAgc2Nyb2xsYmFyU2l6ZSA9IF9SZWFjdCR1c2VDb250ZXh0LnNjcm9sbGJhclNpemU7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0MiA9IFJlYWN0LnVzZUNvbnRleHQoRXhwYW5kZWRSb3dDb250ZXh0KSxcbiAgICAgIGZpeEhlYWRlciA9IF9SZWFjdCR1c2VDb250ZXh0Mi5maXhIZWFkZXIsXG4gICAgICBmaXhDb2x1bW4gPSBfUmVhY3QkdXNlQ29udGV4dDIuZml4Q29sdW1uLFxuICAgICAgY29tcG9uZW50V2lkdGggPSBfUmVhY3QkdXNlQ29udGV4dDIuY29tcG9uZW50V2lkdGgsXG4gICAgICBob3Jpem9uU2Nyb2xsID0gX1JlYWN0JHVzZUNvbnRleHQyLmhvcml6b25TY3JvbGw7IC8vIENhY2hlIHJlbmRlciBub2RlXG5cblxuICByZXR1cm4gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNvbnRlbnROb2RlID0gY2hpbGRyZW47XG5cbiAgICBpZiAoaXNFbXB0eSA/IGhvcml6b25TY3JvbGwgOiBmaXhDb2x1bW4pIHtcbiAgICAgIGNvbnRlbnROb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBzdHlsZToge1xuICAgICAgICAgIHdpZHRoOiBjb21wb25lbnRXaWR0aCAtIChmaXhIZWFkZXIgPyBzY3JvbGxiYXJTaXplIDogMCksXG4gICAgICAgICAgcG9zaXRpb246ICdzdGlja3knLFxuICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nXG4gICAgICAgIH0sXG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1leHBhbmRlZC1yb3ctZml4ZWRcIilcbiAgICAgIH0sIGNvbXBvbmVudFdpZHRoICE9PSAwICYmIGNvbnRlbnROb2RlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGRpc3BsYXk6IGV4cGFuZGVkID8gbnVsbCA6ICdub25lJ1xuICAgICAgfVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENlbGwsIHtcbiAgICAgIGNvbXBvbmVudDogY2VsbENvbXBvbmVudCxcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgY29sU3BhbjogY29sU3BhblxuICAgIH0sIGNvbnRlbnROb2RlKSk7XG4gIH0sIFtjaGlsZHJlbiwgQ29tcG9uZW50LCBjbGFzc05hbWUsIGV4cGFuZGVkLCBjb2xTcGFuLCBpc0VtcHR5LCBzY3JvbGxiYXJTaXplLCBjb21wb25lbnRXaWR0aCwgZml4Q29sdW1uLCBmaXhIZWFkZXIsIGhvcml6b25TY3JvbGxdKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgRXhwYW5kZWRSb3c7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIFJlc2l6ZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmV4cG9ydCBkZWZhdWx0IFJlc2l6ZUNvbnRleHQ7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBDZWxsIGZyb20gJy4uL0NlbGwnO1xuaW1wb3J0IFRhYmxlQ29udGV4dCBmcm9tICcuLi9jb250ZXh0L1RhYmxlQ29udGV4dCc7XG5pbXBvcnQgQm9keUNvbnRleHQgZnJvbSAnLi4vY29udGV4dC9Cb2R5Q29udGV4dCc7XG5pbXBvcnQgeyBnZXRDb2x1bW5zS2V5IH0gZnJvbSAnLi4vdXRpbHMvdmFsdWVVdGlsJztcbmltcG9ydCBFeHBhbmRlZFJvdyBmcm9tICcuL0V4cGFuZGVkUm93JztcblxuZnVuY3Rpb24gQm9keVJvdyhwcm9wcykge1xuICB2YXIgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICAgIHJlY29yZCA9IHByb3BzLnJlY29yZCxcbiAgICAgIGluZGV4ID0gcHJvcHMuaW5kZXgsXG4gICAgICByZW5kZXJJbmRleCA9IHByb3BzLnJlbmRlckluZGV4LFxuICAgICAgcm93S2V5ID0gcHJvcHMucm93S2V5LFxuICAgICAgcm93RXhwYW5kYWJsZSA9IHByb3BzLnJvd0V4cGFuZGFibGUsXG4gICAgICBleHBhbmRlZEtleXMgPSBwcm9wcy5leHBhbmRlZEtleXMsXG4gICAgICBvblJvdyA9IHByb3BzLm9uUm93LFxuICAgICAgX3Byb3BzJGluZGVudCA9IHByb3BzLmluZGVudCxcbiAgICAgIGluZGVudCA9IF9wcm9wcyRpbmRlbnQgPT09IHZvaWQgMCA/IDAgOiBfcHJvcHMkaW5kZW50LFxuICAgICAgUm93Q29tcG9uZW50ID0gcHJvcHMucm93Q29tcG9uZW50LFxuICAgICAgY2VsbENvbXBvbmVudCA9IHByb3BzLmNlbGxDb21wb25lbnQsXG4gICAgICBjaGlsZHJlbkNvbHVtbk5hbWUgPSBwcm9wcy5jaGlsZHJlbkNvbHVtbk5hbWU7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChUYWJsZUNvbnRleHQpLFxuICAgICAgcHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQucHJlZml4Q2xzLFxuICAgICAgZml4ZWRJbmZvTGlzdCA9IF9SZWFjdCR1c2VDb250ZXh0LmZpeGVkSW5mb0xpc3Q7XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0MiA9IFJlYWN0LnVzZUNvbnRleHQoQm9keUNvbnRleHQpLFxuICAgICAgZmxhdHRlbkNvbHVtbnMgPSBfUmVhY3QkdXNlQ29udGV4dDIuZmxhdHRlbkNvbHVtbnMsXG4gICAgICBleHBhbmRhYmxlVHlwZSA9IF9SZWFjdCR1c2VDb250ZXh0Mi5leHBhbmRhYmxlVHlwZSxcbiAgICAgIGV4cGFuZFJvd0J5Q2xpY2sgPSBfUmVhY3QkdXNlQ29udGV4dDIuZXhwYW5kUm93QnlDbGljayxcbiAgICAgIG9uVHJpZ2dlckV4cGFuZCA9IF9SZWFjdCR1c2VDb250ZXh0Mi5vblRyaWdnZXJFeHBhbmQsXG4gICAgICByb3dDbGFzc05hbWUgPSBfUmVhY3QkdXNlQ29udGV4dDIucm93Q2xhc3NOYW1lLFxuICAgICAgZXhwYW5kZWRSb3dDbGFzc05hbWUgPSBfUmVhY3QkdXNlQ29udGV4dDIuZXhwYW5kZWRSb3dDbGFzc05hbWUsXG4gICAgICBpbmRlbnRTaXplID0gX1JlYWN0JHVzZUNvbnRleHQyLmluZGVudFNpemUsXG4gICAgICBleHBhbmRJY29uID0gX1JlYWN0JHVzZUNvbnRleHQyLmV4cGFuZEljb24sXG4gICAgICBleHBhbmRlZFJvd1JlbmRlciA9IF9SZWFjdCR1c2VDb250ZXh0Mi5leHBhbmRlZFJvd1JlbmRlcixcbiAgICAgIGV4cGFuZEljb25Db2x1bW5JbmRleCA9IF9SZWFjdCR1c2VDb250ZXh0Mi5leHBhbmRJY29uQ29sdW1uSW5kZXg7XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgICAgZXhwYW5kUmVuZGVkID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICAgIHNldEV4cGFuZFJlbmRlZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG5cbiAgdmFyIGV4cGFuZGVkID0gZXhwYW5kZWRLZXlzICYmIGV4cGFuZGVkS2V5cy5oYXMocHJvcHMucmVjb3JkS2V5KTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZXhwYW5kZWQpIHtcbiAgICAgIHNldEV4cGFuZFJlbmRlZCh0cnVlKTtcbiAgICB9XG4gIH0sIFtleHBhbmRlZF0pO1xuICB2YXIgcm93U3VwcG9ydEV4cGFuZCA9IGV4cGFuZGFibGVUeXBlID09PSAncm93JyAmJiAoIXJvd0V4cGFuZGFibGUgfHwgcm93RXhwYW5kYWJsZShyZWNvcmQpKTsgLy8gT25seSB3aGVuIHJvdyBpcyBub3QgZXhwYW5kYWJsZSBhbmQgYGNoaWxkcmVuYCBleGlzdCBpbiByZWNvcmRcblxuICB2YXIgbmVzdEV4cGFuZGFibGUgPSBleHBhbmRhYmxlVHlwZSA9PT0gJ25lc3QnO1xuICB2YXIgaGFzTmVzdENoaWxkcmVuID0gY2hpbGRyZW5Db2x1bW5OYW1lICYmIHJlY29yZCAmJiByZWNvcmRbY2hpbGRyZW5Db2x1bW5OYW1lXTtcbiAgdmFyIG1lcmdlZEV4cGFuZGFibGUgPSByb3dTdXBwb3J0RXhwYW5kIHx8IG5lc3RFeHBhbmRhYmxlOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gRXhwYW5kYWJsZSA9PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIG9uRXhwYW5kUmVmID0gUmVhY3QudXNlUmVmKG9uVHJpZ2dlckV4cGFuZCk7XG4gIG9uRXhwYW5kUmVmLmN1cnJlbnQgPSBvblRyaWdnZXJFeHBhbmQ7XG5cbiAgdmFyIG9uSW50ZXJuYWxUcmlnZ2VyRXhwYW5kID0gZnVuY3Rpb24gb25JbnRlcm5hbFRyaWdnZXJFeHBhbmQoKSB7XG4gICAgb25FeHBhbmRSZWYuY3VycmVudC5hcHBseShvbkV4cGFuZFJlZiwgYXJndW1lbnRzKTtcbiAgfTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IG9uUm93ID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIGFkZGl0aW9uYWxQcm9wcyA9IG9uUm93ID09PSBudWxsIHx8IG9uUm93ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvblJvdyhyZWNvcmQsIGluZGV4KTtcblxuICB2YXIgb25DbGljayA9IGZ1bmN0aW9uIG9uQ2xpY2soZXZlbnQpIHtcbiAgICB2YXIgX2FkZGl0aW9uYWxQcm9wcyRvbkNsO1xuXG4gICAgaWYgKGV4cGFuZFJvd0J5Q2xpY2sgJiYgbWVyZ2VkRXhwYW5kYWJsZSkge1xuICAgICAgb25JbnRlcm5hbFRyaWdnZXJFeHBhbmQocmVjb3JkLCBldmVudCk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgYWRkaXRpb25hbFByb3BzID09PSBudWxsIHx8IGFkZGl0aW9uYWxQcm9wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9hZGRpdGlvbmFsUHJvcHMkb25DbCA9IGFkZGl0aW9uYWxQcm9wcy5vbkNsaWNrKSA9PT0gbnVsbCB8fCBfYWRkaXRpb25hbFByb3BzJG9uQ2wgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hZGRpdGlvbmFsUHJvcHMkb25DbC5jYWxsLmFwcGx5KF9hZGRpdGlvbmFsUHJvcHMkb25DbCwgW2FkZGl0aW9uYWxQcm9wcywgZXZlbnRdLmNvbmNhdChhcmdzKSk7XG4gIH07IC8vID09PT09PT09PT09PT09PT09PT09PT09PSBCYXNlIHRyIHJvdyA9PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIHZhciBjb21wdXRlUm93Q2xhc3NOYW1lO1xuXG4gIGlmICh0eXBlb2Ygcm93Q2xhc3NOYW1lID09PSAnc3RyaW5nJykge1xuICAgIGNvbXB1dGVSb3dDbGFzc05hbWUgPSByb3dDbGFzc05hbWU7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHJvd0NsYXNzTmFtZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbXB1dGVSb3dDbGFzc05hbWUgPSByb3dDbGFzc05hbWUocmVjb3JkLCBpbmRleCwgaW5kZW50KTtcbiAgfVxuXG4gIHZhciBjb2x1bW5zS2V5ID0gZ2V0Q29sdW1uc0tleShmbGF0dGVuQ29sdW1ucyk7XG4gIHZhciBiYXNlUm93Tm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJvd0NvbXBvbmVudCwgX2V4dGVuZHMoe30sIGFkZGl0aW9uYWxQcm9wcywge1xuICAgIFwiZGF0YS1yb3cta2V5XCI6IHJvd0tleSxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJvd1wiKSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1yb3ctbGV2ZWwtXCIpLmNvbmNhdChpbmRlbnQpLCBjb21wdXRlUm93Q2xhc3NOYW1lLCBhZGRpdGlvbmFsUHJvcHMgJiYgYWRkaXRpb25hbFByb3BzLmNsYXNzTmFtZSksXG4gICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCBhZGRpdGlvbmFsUHJvcHMgPyBhZGRpdGlvbmFsUHJvcHMuc3R5bGUgOiBudWxsKSxcbiAgICBvbkNsaWNrOiBvbkNsaWNrXG4gIH0pLCBmbGF0dGVuQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbiwgY29sSW5kZXgpIHtcbiAgICB2YXIgcmVuZGVyID0gY29sdW1uLnJlbmRlcixcbiAgICAgICAgZGF0YUluZGV4ID0gY29sdW1uLmRhdGFJbmRleCxcbiAgICAgICAgY29sdW1uQ2xhc3NOYW1lID0gY29sdW1uLmNsYXNzTmFtZTtcbiAgICB2YXIga2V5ID0gY29sdW1uc0tleVtjb2xJbmRleF07XG4gICAgdmFyIGZpeGVkSW5mbyA9IGZpeGVkSW5mb0xpc3RbY29sSW5kZXhdOyAvLyA9PT09PT09PT09PT09IFVzZWQgZm9yIG5lc3QgZXhwYW5kYWJsZSA9PT09PT09PT09PT09XG5cbiAgICB2YXIgYXBwZW5kQ2VsbE5vZGU7XG5cbiAgICBpZiAoY29sSW5kZXggPT09IChleHBhbmRJY29uQ29sdW1uSW5kZXggfHwgMCkgJiYgbmVzdEV4cGFuZGFibGUpIHtcbiAgICAgIGFwcGVuZENlbGxOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgcGFkZGluZ0xlZnQ6IFwiXCIuY29uY2F0KGluZGVudFNpemUgKiBpbmRlbnQsIFwicHhcIilcbiAgICAgICAgfSxcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJvdy1pbmRlbnQgaW5kZW50LWxldmVsLVwiKS5jb25jYXQoaW5kZW50KVxuICAgICAgfSksIGV4cGFuZEljb24oe1xuICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgZXhwYW5kZWQ6IGV4cGFuZGVkLFxuICAgICAgICBleHBhbmRhYmxlOiBoYXNOZXN0Q2hpbGRyZW4sXG4gICAgICAgIHJlY29yZDogcmVjb3JkLFxuICAgICAgICBvbkV4cGFuZDogb25JbnRlcm5hbFRyaWdnZXJFeHBhbmRcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICB2YXIgYWRkaXRpb25hbENlbGxQcm9wcztcblxuICAgIGlmIChjb2x1bW4ub25DZWxsKSB7XG4gICAgICBhZGRpdGlvbmFsQ2VsbFByb3BzID0gY29sdW1uLm9uQ2VsbChyZWNvcmQsIGluZGV4KTtcbiAgICB9XG5cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2VsbCwgX2V4dGVuZHMoe1xuICAgICAgY2xhc3NOYW1lOiBjb2x1bW5DbGFzc05hbWUsXG4gICAgICBlbGxpcHNpczogY29sdW1uLmVsbGlwc2lzLFxuICAgICAgYWxpZ246IGNvbHVtbi5hbGlnbixcbiAgICAgIGNvbXBvbmVudDogY2VsbENvbXBvbmVudCxcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAga2V5OiBrZXksXG4gICAgICByZWNvcmQ6IHJlY29yZCxcbiAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgIHJlbmRlckluZGV4OiByZW5kZXJJbmRleCxcbiAgICAgIGRhdGFJbmRleDogZGF0YUluZGV4LFxuICAgICAgcmVuZGVyOiByZW5kZXIsXG4gICAgICBzaG91bGRDZWxsVXBkYXRlOiBjb2x1bW4uc2hvdWxkQ2VsbFVwZGF0ZSxcbiAgICAgIGV4cGFuZGVkOiBhcHBlbmRDZWxsTm9kZSAmJiBleHBhbmRlZFxuICAgIH0sIGZpeGVkSW5mbywge1xuICAgICAgYXBwZW5kTm9kZTogYXBwZW5kQ2VsbE5vZGUsXG4gICAgICBhZGRpdGlvbmFsUHJvcHM6IGFkZGl0aW9uYWxDZWxsUHJvcHNcbiAgICB9KSk7XG4gIH0pKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IEV4cGFuZCBSb3cgPT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBleHBhbmRSb3dOb2RlO1xuXG4gIGlmIChyb3dTdXBwb3J0RXhwYW5kICYmIChleHBhbmRSZW5kZWQgfHwgZXhwYW5kZWQpKSB7XG4gICAgdmFyIGV4cGFuZENvbnRlbnQgPSBleHBhbmRlZFJvd1JlbmRlcihyZWNvcmQsIGluZGV4LCBpbmRlbnQgKyAxLCBleHBhbmRlZCk7XG4gICAgdmFyIGNvbXB1dGVkRXhwYW5kZWRSb3dDbGFzc05hbWUgPSBleHBhbmRlZFJvd0NsYXNzTmFtZSAmJiBleHBhbmRlZFJvd0NsYXNzTmFtZShyZWNvcmQsIGluZGV4LCBpbmRlbnQpO1xuICAgIGV4cGFuZFJvd05vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFeHBhbmRlZFJvdywge1xuICAgICAgZXhwYW5kZWQ6IGV4cGFuZGVkLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZXhwYW5kZWQtcm93XCIpLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWV4cGFuZGVkLXJvdy1sZXZlbC1cIikuY29uY2F0KGluZGVudCArIDEpLCBjb21wdXRlZEV4cGFuZGVkUm93Q2xhc3NOYW1lKSxcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgY29tcG9uZW50OiBSb3dDb21wb25lbnQsXG4gICAgICBjZWxsQ29tcG9uZW50OiBjZWxsQ29tcG9uZW50LFxuICAgICAgY29sU3BhbjogZmxhdHRlbkNvbHVtbnMubGVuZ3RoLFxuICAgICAgaXNFbXB0eTogZmFsc2VcbiAgICB9LCBleHBhbmRDb250ZW50KTtcbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgYmFzZVJvd05vZGUsIGV4cGFuZFJvd05vZGUpO1xufVxuXG5Cb2R5Um93LmRpc3BsYXlOYW1lID0gJ0JvZHlSb3cnO1xuZXhwb3J0IGRlZmF1bHQgQm9keVJvdzsiLCJpbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnOyAvLyByZWN1cnNpb24gKGZsYXQgdHJlZSBzdHJ1Y3R1cmUpXG5cbmZ1bmN0aW9uIGZsYXRSZWNvcmQocmVjb3JkLCBpbmRlbnQsIGNoaWxkcmVuQ29sdW1uTmFtZSwgZXhwYW5kZWRLZXlzLCBnZXRSb3dLZXksIGluZGV4KSB7XG4gIHZhciBhcnIgPSBbXTtcbiAgYXJyLnB1c2goe1xuICAgIHJlY29yZDogcmVjb3JkLFxuICAgIGluZGVudDogaW5kZW50LFxuICAgIGluZGV4OiBpbmRleFxuICB9KTtcbiAgdmFyIGtleSA9IGdldFJvd0tleShyZWNvcmQpO1xuICB2YXIgZXhwYW5kZWQgPSBleHBhbmRlZEtleXMgPT09IG51bGwgfHwgZXhwYW5kZWRLZXlzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBleHBhbmRlZEtleXMuaGFzKGtleSk7XG5cbiAgaWYgKHJlY29yZCAmJiBBcnJheS5pc0FycmF5KHJlY29yZFtjaGlsZHJlbkNvbHVtbk5hbWVdKSAmJiBleHBhbmRlZCkge1xuICAgIC8vIGV4cGFuZGVkIHN0YXRlLCBmbGF0IHJlY29yZFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVjb3JkW2NoaWxkcmVuQ29sdW1uTmFtZV0ubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIHZhciB0ZW1wQXJyID0gZmxhdFJlY29yZChyZWNvcmRbY2hpbGRyZW5Db2x1bW5OYW1lXVtpXSwgaW5kZW50ICsgMSwgY2hpbGRyZW5Db2x1bW5OYW1lLCBleHBhbmRlZEtleXMsIGdldFJvd0tleSwgaSk7XG4gICAgICBhcnIucHVzaC5hcHBseShhcnIsIF90b0NvbnN1bWFibGVBcnJheSh0ZW1wQXJyKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFycjtcbn1cbi8qKlxuICogZmxhdCB0cmVlIGRhdGEgb24gZXhwYW5kZWQgc3RhdGVcbiAqXG4gKiBAZXhwb3J0XG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsqfSBkYXRhIDogdGFibGUgZGF0YVxuICogQHBhcmFtIHtzdHJpbmd9IGNoaWxkcmVuQ29sdW1uTmFtZSA6IOaMh+WumuagkeW9oue7k+aehOeahOWIl+WQjVxuICogQHBhcmFtIHtTZXQ8S2V5Pn0gZXhwYW5kZWRLZXlzIDog5bGV5byA55qE6KGM5a+55bqU55qEa2V5c1xuICogQHBhcmFtIHtHZXRSb3dLZXk8VD59IGdldFJvd0tleSAgOiDojrflj5blvZPliY1yb3dLZXnnmoTmlrnms5VcbiAqIEByZXR1cm5zIGZsYXR0ZW5lZCBkYXRhXG4gKi9cblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VGbGF0dGVuUmVjb3JkcyhkYXRhLCBjaGlsZHJlbkNvbHVtbk5hbWUsIGV4cGFuZGVkS2V5cywgZ2V0Um93S2V5KSB7XG4gIHZhciBhcnIgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZXhwYW5kZWRLZXlzID09PSBudWxsIHx8IGV4cGFuZGVkS2V5cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXhwYW5kZWRLZXlzLnNpemUpIHtcbiAgICAgIHZhciB0ZW1wID0gW107IC8vIGNvbGxlY3QgZmxhdHRlbmVkIHJlY29yZFxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IChkYXRhID09PSBudWxsIHx8IGRhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRhdGEubGVuZ3RoKTsgaSArPSAxKSB7XG4gICAgICAgIHZhciByZWNvcmQgPSBkYXRhW2ldO1xuICAgICAgICB0ZW1wLnB1c2guYXBwbHkodGVtcCwgX3RvQ29uc3VtYWJsZUFycmF5KGZsYXRSZWNvcmQocmVjb3JkLCAwLCBjaGlsZHJlbkNvbHVtbk5hbWUsIGV4cGFuZGVkS2V5cywgZ2V0Um93S2V5LCBpKSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGVtcDtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YSA9PT0gbnVsbCB8fCBkYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkYXRhLm1hcChmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlY29yZDogaXRlbSxcbiAgICAgICAgaW5kZW50OiAwLFxuICAgICAgICBpbmRleDogaW5kZXhcbiAgICAgIH07XG4gICAgfSk7XG4gIH0sIFtkYXRhLCBjaGlsZHJlbkNvbHVtbk5hbWUsIGV4cGFuZGVkS2V5cywgZ2V0Um93S2V5XSk7XG4gIHJldHVybiBhcnI7XG59IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlc2l6ZU9ic2VydmVyIGZyb20gJ3JjLXJlc2l6ZS1vYnNlcnZlcic7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNZWFzdXJlQ2VsbChfcmVmKSB7XG4gIHZhciBjb2x1bW5LZXkgPSBfcmVmLmNvbHVtbktleSxcbiAgICAgIG9uQ29sdW1uUmVzaXplID0gX3JlZi5vbkNvbHVtblJlc2l6ZTtcbiAgdmFyIGNlbGxSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY2VsbFJlZi5jdXJyZW50KSB7XG4gICAgICBvbkNvbHVtblJlc2l6ZShjb2x1bW5LZXksIGNlbGxSZWYuY3VycmVudC5vZmZzZXRXaWR0aCk7XG4gICAgfVxuICB9LCBbXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZXNpemVPYnNlcnZlciwge1xuICAgIGRhdGE6IGNvbHVtbktleVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInRkXCIsIHtcbiAgICByZWY6IGNlbGxSZWYsXG4gICAgc3R5bGU6IHtcbiAgICAgIHBhZGRpbmc6IDAsXG4gICAgICBib3JkZXI6IDAsXG4gICAgICBoZWlnaHQ6IDBcbiAgICB9XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBzdHlsZToge1xuICAgICAgaGVpZ2h0OiAwLFxuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nXG4gICAgfVxuICB9LCBcIlxceEEwXCIpKSk7XG59IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlc2l6ZU9ic2VydmVyIGZyb20gJ3JjLXJlc2l6ZS1vYnNlcnZlcic7XG5pbXBvcnQgTWVhc3VyZUNlbGwgZnJvbSAnLi9NZWFzdXJlQ2VsbCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNZWFzdXJlUm93KF9yZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgICAgY29sdW1uc0tleSA9IF9yZWYuY29sdW1uc0tleSxcbiAgICAgIG9uQ29sdW1uUmVzaXplID0gX3JlZi5vbkNvbHVtblJlc2l6ZTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwidHJcIiwge1xuICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCIsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1lYXN1cmUtcm93XCIpLFxuICAgIHN0eWxlOiB7XG4gICAgICBoZWlnaHQ6IDAsXG4gICAgICBmb250U2l6ZTogMFxuICAgIH1cbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVzaXplT2JzZXJ2ZXIuQ29sbGVjdGlvbiwge1xuICAgIG9uQmF0Y2hSZXNpemU6IGZ1bmN0aW9uIG9uQmF0Y2hSZXNpemUoaW5mb0xpc3QpIHtcbiAgICAgIGluZm9MaXN0LmZvckVhY2goZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICAgIHZhciBjb2x1bW5LZXkgPSBfcmVmMi5kYXRhLFxuICAgICAgICAgICAgc2l6ZSA9IF9yZWYyLnNpemU7XG4gICAgICAgIG9uQ29sdW1uUmVzaXplKGNvbHVtbktleSwgc2l6ZS5vZmZzZXRXaWR0aCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIGNvbHVtbnNLZXkubWFwKGZ1bmN0aW9uIChjb2x1bW5LZXkpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTWVhc3VyZUNlbGwsIHtcbiAgICAgIGtleTogY29sdW1uS2V5LFxuICAgICAgY29sdW1uS2V5OiBjb2x1bW5LZXksXG4gICAgICBvbkNvbHVtblJlc2l6ZTogb25Db2x1bW5SZXNpemVcbiAgICB9KTtcbiAgfSkpKTtcbn0iLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBUYWJsZUNvbnRleHQgZnJvbSAnLi4vY29udGV4dC9UYWJsZUNvbnRleHQnO1xuaW1wb3J0IEV4cGFuZGVkUm93IGZyb20gJy4vRXhwYW5kZWRSb3cnO1xuaW1wb3J0IEJvZHlDb250ZXh0IGZyb20gJy4uL2NvbnRleHQvQm9keUNvbnRleHQnO1xuaW1wb3J0IHsgZ2V0Q29sdW1uc0tleSB9IGZyb20gJy4uL3V0aWxzL3ZhbHVlVXRpbCc7XG5pbXBvcnQgUmVzaXplQ29udGV4dCBmcm9tICcuLi9jb250ZXh0L1Jlc2l6ZUNvbnRleHQnO1xuaW1wb3J0IEJvZHlSb3cgZnJvbSAnLi9Cb2R5Um93JztcbmltcG9ydCB1c2VGbGF0dGVuUmVjb3JkcyBmcm9tICcuLi9ob29rcy91c2VGbGF0dGVuUmVjb3Jkcyc7XG5pbXBvcnQgSG92ZXJDb250ZXh0IGZyb20gJy4uL2NvbnRleHQvSG92ZXJDb250ZXh0JztcbmltcG9ydCBQZXJmQ29udGV4dCBmcm9tICcuLi9jb250ZXh0L1BlcmZDb250ZXh0JztcbmltcG9ydCBNZWFzdXJlUm93IGZyb20gJy4vTWVhc3VyZVJvdyc7XG5cbmZ1bmN0aW9uIEJvZHkoX3JlZikge1xuICB2YXIgZGF0YSA9IF9yZWYuZGF0YSxcbiAgICAgIGdldFJvd0tleSA9IF9yZWYuZ2V0Um93S2V5LFxuICAgICAgbWVhc3VyZUNvbHVtbldpZHRoID0gX3JlZi5tZWFzdXJlQ29sdW1uV2lkdGgsXG4gICAgICBleHBhbmRlZEtleXMgPSBfcmVmLmV4cGFuZGVkS2V5cyxcbiAgICAgIG9uUm93ID0gX3JlZi5vblJvdyxcbiAgICAgIHJvd0V4cGFuZGFibGUgPSBfcmVmLnJvd0V4cGFuZGFibGUsXG4gICAgICBlbXB0eU5vZGUgPSBfcmVmLmVtcHR5Tm9kZSxcbiAgICAgIGNoaWxkcmVuQ29sdW1uTmFtZSA9IF9yZWYuY2hpbGRyZW5Db2x1bW5OYW1lO1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoUmVzaXplQ29udGV4dCksXG4gICAgICBvbkNvbHVtblJlc2l6ZSA9IF9SZWFjdCR1c2VDb250ZXh0Lm9uQ29sdW1uUmVzaXplO1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dDIgPSBSZWFjdC51c2VDb250ZXh0KFRhYmxlQ29udGV4dCksXG4gICAgICBwcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dDIucHJlZml4Q2xzLFxuICAgICAgZ2V0Q29tcG9uZW50ID0gX1JlYWN0JHVzZUNvbnRleHQyLmdldENvbXBvbmVudDtcblxuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQzID0gUmVhY3QudXNlQ29udGV4dChCb2R5Q29udGV4dCksXG4gICAgICBmbGF0dGVuQ29sdW1ucyA9IF9SZWFjdCR1c2VDb250ZXh0My5mbGF0dGVuQ29sdW1ucztcblxuICB2YXIgZmxhdHRlbkRhdGEgPSB1c2VGbGF0dGVuUmVjb3JkcyhkYXRhLCBjaGlsZHJlbkNvbHVtbk5hbWUsIGV4cGFuZGVkS2V5cywgZ2V0Um93S2V5KTsgLy8gPT09PT09PT09PT09PT09PT09PSBQZXJmb3JtYW5jZSA9PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBwZXJmUmVmID0gUmVhY3QudXNlUmVmKHtcbiAgICByZW5kZXJXaXRoUHJvcHM6IGZhbHNlXG4gIH0pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09IEhvdmVyID09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKC0xKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgICAgc3RhcnRSb3cgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0U3RhcnRSb3cgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUzID0gUmVhY3QudXNlU3RhdGUoLTEpLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTMsIDIpLFxuICAgICAgZW5kUm93ID0gX1JlYWN0JHVzZVN0YXRlNFswXSxcbiAgICAgIHNldEVuZFJvdyA9IF9SZWFjdCR1c2VTdGF0ZTRbMV07XG5cbiAgdmFyIG9uSG92ZXIgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoc3RhcnQsIGVuZCkge1xuICAgIHNldFN0YXJ0Um93KHN0YXJ0KTtcbiAgICBzZXRFbmRSb3coZW5kKTtcbiAgfSwgW10pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIGJvZHlOb2RlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIFdyYXBwZXJDb21wb25lbnQgPSBnZXRDb21wb25lbnQoWydib2R5JywgJ3dyYXBwZXInXSwgJ3Rib2R5Jyk7XG4gICAgdmFyIHRyQ29tcG9uZW50ID0gZ2V0Q29tcG9uZW50KFsnYm9keScsICdyb3cnXSwgJ3RyJyk7XG4gICAgdmFyIHRkQ29tcG9uZW50ID0gZ2V0Q29tcG9uZW50KFsnYm9keScsICdjZWxsJ10sICd0ZCcpO1xuICAgIHZhciByb3dzO1xuXG4gICAgaWYgKGRhdGEubGVuZ3RoKSB7XG4gICAgICByb3dzID0gZmxhdHRlbkRhdGEubWFwKGZ1bmN0aW9uIChpdGVtLCBpZHgpIHtcbiAgICAgICAgdmFyIHJlY29yZCA9IGl0ZW0ucmVjb3JkLFxuICAgICAgICAgICAgaW5kZW50ID0gaXRlbS5pbmRlbnQsXG4gICAgICAgICAgICByZW5kZXJJbmRleCA9IGl0ZW0uaW5kZXg7XG4gICAgICAgIHZhciBrZXkgPSBnZXRSb3dLZXkocmVjb3JkLCBpZHgpO1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQm9keVJvdywge1xuICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgIHJvd0tleToga2V5LFxuICAgICAgICAgIHJlY29yZDogcmVjb3JkLFxuICAgICAgICAgIHJlY29yZEtleToga2V5LFxuICAgICAgICAgIGluZGV4OiBpZHgsXG4gICAgICAgICAgcmVuZGVySW5kZXg6IHJlbmRlckluZGV4LFxuICAgICAgICAgIHJvd0NvbXBvbmVudDogdHJDb21wb25lbnQsXG4gICAgICAgICAgY2VsbENvbXBvbmVudDogdGRDb21wb25lbnQsXG4gICAgICAgICAgZXhwYW5kZWRLZXlzOiBleHBhbmRlZEtleXMsXG4gICAgICAgICAgb25Sb3c6IG9uUm93LFxuICAgICAgICAgIGdldFJvd0tleTogZ2V0Um93S2V5LFxuICAgICAgICAgIHJvd0V4cGFuZGFibGU6IHJvd0V4cGFuZGFibGUsXG4gICAgICAgICAgY2hpbGRyZW5Db2x1bW5OYW1lOiBjaGlsZHJlbkNvbHVtbk5hbWUsXG4gICAgICAgICAgaW5kZW50OiBpbmRlbnRcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcm93cyA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEV4cGFuZGVkUm93LCB7XG4gICAgICAgIGV4cGFuZGVkOiB0cnVlLFxuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGxhY2Vob2xkZXJcIiksXG4gICAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgICBjb21wb25lbnQ6IHRyQ29tcG9uZW50LFxuICAgICAgICBjZWxsQ29tcG9uZW50OiB0ZENvbXBvbmVudCxcbiAgICAgICAgY29sU3BhbjogZmxhdHRlbkNvbHVtbnMubGVuZ3RoLFxuICAgICAgICBpc0VtcHR5OiB0cnVlXG4gICAgICB9LCBlbXB0eU5vZGUpO1xuICAgIH1cblxuICAgIHZhciBjb2x1bW5zS2V5ID0gZ2V0Q29sdW1uc0tleShmbGF0dGVuQ29sdW1ucyk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFdyYXBwZXJDb21wb25lbnQsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10Ym9keVwiKVxuICAgIH0sIG1lYXN1cmVDb2x1bW5XaWR0aCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNZWFzdXJlUm93LCB7XG4gICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgIGNvbHVtbnNLZXk6IGNvbHVtbnNLZXksXG4gICAgICBvbkNvbHVtblJlc2l6ZTogb25Db2x1bW5SZXNpemVcbiAgICB9KSwgcm93cyk7XG4gIH0sIFtkYXRhLCBwcmVmaXhDbHMsIG9uUm93LCBtZWFzdXJlQ29sdW1uV2lkdGgsIGV4cGFuZGVkS2V5cywgZ2V0Um93S2V5LCBnZXRDb21wb25lbnQsIGVtcHR5Tm9kZSwgZmxhdHRlbkNvbHVtbnMsIGNoaWxkcmVuQ29sdW1uTmFtZSwgb25Db2x1bW5SZXNpemUsIHJvd0V4cGFuZGFibGUsIGZsYXR0ZW5EYXRhXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQZXJmQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBwZXJmUmVmLmN1cnJlbnRcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSG92ZXJDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IHtcbiAgICAgIHN0YXJ0Um93OiBzdGFydFJvdyxcbiAgICAgIGVuZFJvdzogZW5kUm93LFxuICAgICAgb25Ib3Zlcjogb25Ib3ZlclxuICAgIH1cbiAgfSwgYm9keU5vZGUpKTtcbn1cblxudmFyIE1lbW9Cb2R5ID0gLyojX19QVVJFX18qL1JlYWN0Lm1lbW8oQm9keSk7XG5NZW1vQm9keS5kaXNwbGF5TmFtZSA9ICdCb2R5JztcbmV4cG9ydCBkZWZhdWx0IE1lbW9Cb2R5OyIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcImV4cGFuZGFibGVcIl07XG5pbXBvcnQgd2FybmluZyBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5leHBvcnQgdmFyIElOVEVSTkFMX0NPTF9ERUZJTkUgPSAnUkNfVEFCTEVfSU5URVJOQUxfQ09MX0RFRklORSc7XG5leHBvcnQgZnVuY3Rpb24gZ2V0RXhwYW5kYWJsZVByb3BzKHByb3BzKSB7XG4gIHZhciBleHBhbmRhYmxlID0gcHJvcHMuZXhwYW5kYWJsZSxcbiAgICAgIGxlZ2FjeUV4cGFuZGFibGVDb25maWcgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG5cbiAgdmFyIGNvbmZpZztcblxuICBpZiAoJ2V4cGFuZGFibGUnIGluIHByb3BzKSB7XG4gICAgY29uZmlnID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBsZWdhY3lFeHBhbmRhYmxlQ29uZmlnKSwgZXhwYW5kYWJsZSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgWydpbmRlbnRTaXplJywgJ2V4cGFuZGVkUm93S2V5cycsICdkZWZhdWx0RXhwYW5kZWRSb3dLZXlzJywgJ2RlZmF1bHRFeHBhbmRBbGxSb3dzJywgJ2V4cGFuZGVkUm93UmVuZGVyJywgJ2V4cGFuZFJvd0J5Q2xpY2snLCAnZXhwYW5kSWNvbicsICdvbkV4cGFuZCcsICdvbkV4cGFuZGVkUm93c0NoYW5nZScsICdleHBhbmRlZFJvd0NsYXNzTmFtZScsICdleHBhbmRJY29uQ29sdW1uSW5kZXgnLCAnc2hvd0V4cGFuZENvbHVtbiddLnNvbWUoZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgIHJldHVybiBwcm9wIGluIHByb3BzO1xuICAgIH0pKSB7XG4gICAgICB3YXJuaW5nKGZhbHNlLCAnZXhwYW5kZWQgcmVsYXRlZCBwcm9wcyBoYXZlIGJlZW4gbW92ZWQgaW50byBgZXhwYW5kYWJsZWAuJyk7XG4gICAgfVxuXG4gICAgY29uZmlnID0gbGVnYWN5RXhwYW5kYWJsZUNvbmZpZztcbiAgfVxuXG4gIGlmIChjb25maWcuc2hvd0V4cGFuZENvbHVtbiA9PT0gZmFsc2UpIHtcbiAgICBjb25maWcuZXhwYW5kSWNvbkNvbHVtbkluZGV4ID0gLTE7XG4gIH1cblxuICByZXR1cm4gY29uZmlnO1xufSIsImV4cG9ydCB2YXIgRVhQQU5EX0NPTFVNTiA9IHt9OyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiY2hpbGRyZW5cIl0sXG4gICAgX2V4Y2x1ZGVkMiA9IFtcImZpeGVkXCJdO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0IHRvQXJyYXkgZnJvbSBcInJjLXV0aWwvZXMvQ2hpbGRyZW4vdG9BcnJheVwiO1xuaW1wb3J0IHsgSU5URVJOQUxfQ09MX0RFRklORSB9IGZyb20gJy4uL3V0aWxzL2xlZ2FjeVV0aWwnO1xuaW1wb3J0IHsgRVhQQU5EX0NPTFVNTiB9IGZyb20gJy4uL2NvbnN0YW50JztcbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0Q2hpbGRyZW5Ub0NvbHVtbnMoY2hpbGRyZW4pIHtcbiAgcmV0dXJuIHRvQXJyYXkoY2hpbGRyZW4pLmZpbHRlcihmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQobm9kZSk7XG4gIH0pLm1hcChmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBrZXkgPSBfcmVmLmtleSxcbiAgICAgICAgcHJvcHMgPSBfcmVmLnByb3BzO1xuXG4gICAgdmFyIG5vZGVDaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG5cbiAgICB2YXIgY29sdW1uID0gX29iamVjdFNwcmVhZCh7XG4gICAgICBrZXk6IGtleVxuICAgIH0sIHJlc3RQcm9wcyk7XG5cbiAgICBpZiAobm9kZUNoaWxkcmVuKSB7XG4gICAgICBjb2x1bW4uY2hpbGRyZW4gPSBjb252ZXJ0Q2hpbGRyZW5Ub0NvbHVtbnMobm9kZUNoaWxkcmVuKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29sdW1uO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZmxhdENvbHVtbnMoY29sdW1ucykge1xuICByZXR1cm4gY29sdW1ucy5yZWR1Y2UoZnVuY3Rpb24gKGxpc3QsIGNvbHVtbikge1xuICAgIHZhciBmaXhlZCA9IGNvbHVtbi5maXhlZDsgLy8gQ29udmVydCBgZml4ZWQ9J3RydWUnYCB0byBgZml4ZWQ9J2xlZnQnYCBpbnN0ZWFkXG5cbiAgICB2YXIgcGFyc2VkRml4ZWQgPSBmaXhlZCA9PT0gdHJ1ZSA/ICdsZWZ0JyA6IGZpeGVkO1xuICAgIHZhciBzdWJDb2x1bW5zID0gY29sdW1uLmNoaWxkcmVuO1xuXG4gICAgaWYgKHN1YkNvbHVtbnMgJiYgc3ViQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShsaXN0KSwgX3RvQ29uc3VtYWJsZUFycmF5KGZsYXRDb2x1bW5zKHN1YkNvbHVtbnMpLm1hcChmdW5jdGlvbiAoc3ViQ29sdW0pIHtcbiAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe1xuICAgICAgICAgIGZpeGVkOiBwYXJzZWRGaXhlZFxuICAgICAgICB9LCBzdWJDb2x1bSk7XG4gICAgICB9KSkpO1xuICAgIH1cblxuICAgIHJldHVybiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGxpc3QpLCBbX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBjb2x1bW4pLCB7fSwge1xuICAgICAgZml4ZWQ6IHBhcnNlZEZpeGVkXG4gICAgfSldKTtcbiAgfSwgW10pO1xufVxuXG5mdW5jdGlvbiB3YXJuaW5nRml4ZWQoZmxhdHRlbkNvbHVtbnMpIHtcbiAgdmFyIGFsbEZpeExlZnQgPSB0cnVlO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZmxhdHRlbkNvbHVtbnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICB2YXIgY29sID0gZmxhdHRlbkNvbHVtbnNbaV07XG5cbiAgICBpZiAoYWxsRml4TGVmdCAmJiBjb2wuZml4ZWQgIT09ICdsZWZ0Jykge1xuICAgICAgYWxsRml4TGVmdCA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoIWFsbEZpeExlZnQgJiYgY29sLmZpeGVkID09PSAnbGVmdCcpIHtcbiAgICAgIHdhcm5pbmcoZmFsc2UsIFwiSW5kZXggXCIuY29uY2F0KGkgLSAxLCBcIiBvZiBgY29sdW1uc2AgbWlzc2luZyBgZml4ZWQ9J2xlZnQnYCBwcm9wLlwiKSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YXIgYWxsRml4UmlnaHQgPSB0cnVlO1xuXG4gIGZvciAodmFyIF9pID0gZmxhdHRlbkNvbHVtbnMubGVuZ3RoIC0gMTsgX2kgPj0gMDsgX2kgLT0gMSkge1xuICAgIHZhciBfY29sID0gZmxhdHRlbkNvbHVtbnNbX2ldO1xuXG4gICAgaWYgKGFsbEZpeFJpZ2h0ICYmIF9jb2wuZml4ZWQgIT09ICdyaWdodCcpIHtcbiAgICAgIGFsbEZpeFJpZ2h0ID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmICghYWxsRml4UmlnaHQgJiYgX2NvbC5maXhlZCA9PT0gJ3JpZ2h0Jykge1xuICAgICAgd2FybmluZyhmYWxzZSwgXCJJbmRleCBcIi5jb25jYXQoX2kgKyAxLCBcIiBvZiBgY29sdW1uc2AgbWlzc2luZyBgZml4ZWQ9J3JpZ2h0J2AgcHJvcC5cIikpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJldmVydEZvclJ0bChjb2x1bW5zKSB7XG4gIHJldHVybiBjb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgdmFyIGZpeGVkID0gY29sdW1uLmZpeGVkLFxuICAgICAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoY29sdW1uLCBfZXhjbHVkZWQyKTsgLy8gQ29udmVydCBgZml4ZWQ9J2xlZnQnYCB0byBgZml4ZWQ9J3JpZ2h0J2AgaW5zdGVhZFxuXG5cbiAgICB2YXIgcGFyc2VkRml4ZWQgPSBmaXhlZDtcblxuICAgIGlmIChmaXhlZCA9PT0gJ2xlZnQnKSB7XG4gICAgICBwYXJzZWRGaXhlZCA9ICdyaWdodCc7XG4gICAgfSBlbHNlIGlmIChmaXhlZCA9PT0gJ3JpZ2h0Jykge1xuICAgICAgcGFyc2VkRml4ZWQgPSAnbGVmdCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe1xuICAgICAgZml4ZWQ6IHBhcnNlZEZpeGVkXG4gICAgfSwgcmVzdFByb3BzKTtcbiAgfSk7XG59XG4vKipcbiAqIFBhcnNlIGBjb2x1bW5zYCAmIGBjaGlsZHJlbmAgaW50byBgY29sdW1uc2AuXG4gKi9cblxuXG5mdW5jdGlvbiB1c2VDb2x1bW5zKF9yZWYyLCB0cmFuc2Zvcm1Db2x1bW5zKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBfcmVmMi5wcmVmaXhDbHMsXG4gICAgICBjb2x1bW5zID0gX3JlZjIuY29sdW1ucyxcbiAgICAgIGNoaWxkcmVuID0gX3JlZjIuY2hpbGRyZW4sXG4gICAgICBleHBhbmRhYmxlID0gX3JlZjIuZXhwYW5kYWJsZSxcbiAgICAgIGV4cGFuZGVkS2V5cyA9IF9yZWYyLmV4cGFuZGVkS2V5cyxcbiAgICAgIGNvbHVtblRpdGxlID0gX3JlZjIuY29sdW1uVGl0bGUsXG4gICAgICBnZXRSb3dLZXkgPSBfcmVmMi5nZXRSb3dLZXksXG4gICAgICBvblRyaWdnZXJFeHBhbmQgPSBfcmVmMi5vblRyaWdnZXJFeHBhbmQsXG4gICAgICBleHBhbmRJY29uID0gX3JlZjIuZXhwYW5kSWNvbixcbiAgICAgIHJvd0V4cGFuZGFibGUgPSBfcmVmMi5yb3dFeHBhbmRhYmxlLFxuICAgICAgZXhwYW5kSWNvbkNvbHVtbkluZGV4ID0gX3JlZjIuZXhwYW5kSWNvbkNvbHVtbkluZGV4LFxuICAgICAgZGlyZWN0aW9uID0gX3JlZjIuZGlyZWN0aW9uLFxuICAgICAgZXhwYW5kUm93QnlDbGljayA9IF9yZWYyLmV4cGFuZFJvd0J5Q2xpY2ssXG4gICAgICBjb2x1bW5XaWR0aCA9IF9yZWYyLmNvbHVtbldpZHRoLFxuICAgICAgZml4ZWQgPSBfcmVmMi5maXhlZDtcbiAgdmFyIGJhc2VDb2x1bW5zID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGNvbHVtbnMgfHwgY29udmVydENoaWxkcmVuVG9Db2x1bW5zKGNoaWxkcmVuKTtcbiAgfSwgW2NvbHVtbnMsIGNoaWxkcmVuXSk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IEV4cGFuZCA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciB3aXRoRXhwYW5kQ29sdW1ucyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmIChleHBhbmRhYmxlKSB7XG4gICAgICB2YXIgX2V4cGFuZENvbHVtbjtcblxuICAgICAgdmFyIGNsb25lQ29sdW1ucyA9IGJhc2VDb2x1bW5zLnNsaWNlKCk7IC8vID4+PiBXYXJuaW5nIGlmIHVzZSBgZXhwYW5kSWNvbkNvbHVtbkluZGV4YFxuXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBleHBhbmRJY29uQ29sdW1uSW5kZXggPj0gMCkge1xuICAgICAgICB3YXJuaW5nKGZhbHNlLCAnYGV4cGFuZEljb25Db2x1bW5JbmRleGAgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBgVGFibGUuRVhQQU5EX0NPTFVNTmAgaW4gYGNvbHVtbnNgIGluc3RlYWQuJyk7XG4gICAgICB9IC8vID4+PiBJbnNlcnQgZXhwYW5kIGNvbHVtbiBpZiBub3QgZXhpc3RcblxuXG4gICAgICBpZiAoIWNsb25lQ29sdW1ucy5pbmNsdWRlcyhFWFBBTkRfQ09MVU1OKSkge1xuICAgICAgICB2YXIgZXhwYW5kQ29sSW5kZXggPSBleHBhbmRJY29uQ29sdW1uSW5kZXggfHwgMDtcblxuICAgICAgICBpZiAoZXhwYW5kQ29sSW5kZXggPj0gMCkge1xuICAgICAgICAgIGNsb25lQ29sdW1ucy5zcGxpY2UoZXhwYW5kQ29sSW5kZXgsIDAsIEVYUEFORF9DT0xVTU4pO1xuICAgICAgICB9XG4gICAgICB9IC8vID4+PiBEZWR1cGxpY2F0ZSBhZGRpdGlvbmFsIGV4cGFuZCBjb2x1bW5cblxuXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBjbG9uZUNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIHJldHVybiBjID09PSBFWFBBTkRfQ09MVU1OO1xuICAgICAgfSkubGVuZ3RoID4gMSkge1xuICAgICAgICB3YXJuaW5nKGZhbHNlLCAnVGhlcmUgZXhpc3QgbW9yZSB0aGFuIG9uZSBgRVhQQU5EX0NPTFVNTmAgaW4gYGNvbHVtbnNgLicpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZXhwYW5kQ29sdW1uSW5kZXggPSBjbG9uZUNvbHVtbnMuaW5kZXhPZihFWFBBTkRfQ09MVU1OKTtcbiAgICAgIGNsb25lQ29sdW1ucyA9IGNsb25lQ29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbiwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGNvbHVtbiAhPT0gRVhQQU5EX0NPTFVNTiB8fCBpbmRleCA9PT0gZXhwYW5kQ29sdW1uSW5kZXg7XG4gICAgICB9KTsgLy8gPj4+IENoZWNrIGlmIGV4cGFuZCBjb2x1bW4gbmVlZCB0byBmaXhlZFxuXG4gICAgICB2YXIgcHJldkNvbHVtbiA9IGJhc2VDb2x1bW5zW2V4cGFuZENvbHVtbkluZGV4XTtcbiAgICAgIHZhciBmaXhlZENvbHVtbjtcblxuICAgICAgaWYgKChmaXhlZCA9PT0gJ2xlZnQnIHx8IGZpeGVkKSAmJiAhZXhwYW5kSWNvbkNvbHVtbkluZGV4KSB7XG4gICAgICAgIGZpeGVkQ29sdW1uID0gJ2xlZnQnO1xuICAgICAgfSBlbHNlIGlmICgoZml4ZWQgPT09ICdyaWdodCcgfHwgZml4ZWQpICYmIGV4cGFuZEljb25Db2x1bW5JbmRleCA9PT0gYmFzZUNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgIGZpeGVkQ29sdW1uID0gJ3JpZ2h0JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpeGVkQ29sdW1uID0gcHJldkNvbHVtbiA/IHByZXZDb2x1bW4uZml4ZWQgOiBudWxsO1xuICAgICAgfSAvLyA+Pj4gQ3JlYXRlIGV4cGFuZGFibGUgY29sdW1uXG5cblxuICAgICAgdmFyIGV4cGFuZENvbHVtbiA9IChfZXhwYW5kQ29sdW1uID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfZXhwYW5kQ29sdW1uLCBJTlRFUk5BTF9DT0xfREVGSU5FLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1leHBhbmQtaWNvbi1jb2xcIiksXG4gICAgICAgIGNvbHVtblR5cGU6ICdFWFBBTkRfQ09MVU1OJ1xuICAgICAgfSksIF9kZWZpbmVQcm9wZXJ0eShfZXhwYW5kQ29sdW1uLCBcInRpdGxlXCIsIGNvbHVtblRpdGxlKSwgX2RlZmluZVByb3BlcnR5KF9leHBhbmRDb2x1bW4sIFwiZml4ZWRcIiwgZml4ZWRDb2x1bW4pLCBfZGVmaW5lUHJvcGVydHkoX2V4cGFuZENvbHVtbiwgXCJjbGFzc05hbWVcIiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1yb3ctZXhwYW5kLWljb24tY2VsbFwiKSksIF9kZWZpbmVQcm9wZXJ0eShfZXhwYW5kQ29sdW1uLCBcIndpZHRoXCIsIGNvbHVtbldpZHRoKSwgX2RlZmluZVByb3BlcnR5KF9leHBhbmRDb2x1bW4sIFwicmVuZGVyXCIsIGZ1bmN0aW9uIHJlbmRlcihfLCByZWNvcmQsIGluZGV4KSB7XG4gICAgICAgIHZhciByb3dLZXkgPSBnZXRSb3dLZXkocmVjb3JkLCBpbmRleCk7XG4gICAgICAgIHZhciBleHBhbmRlZCA9IGV4cGFuZGVkS2V5cy5oYXMocm93S2V5KTtcbiAgICAgICAgdmFyIHJlY29yZEV4cGFuZGFibGUgPSByb3dFeHBhbmRhYmxlID8gcm93RXhwYW5kYWJsZShyZWNvcmQpIDogdHJ1ZTtcbiAgICAgICAgdmFyIGljb24gPSBleHBhbmRJY29uKHtcbiAgICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgICBleHBhbmRlZDogZXhwYW5kZWQsXG4gICAgICAgICAgZXhwYW5kYWJsZTogcmVjb3JkRXhwYW5kYWJsZSxcbiAgICAgICAgICByZWNvcmQ6IHJlY29yZCxcbiAgICAgICAgICBvbkV4cGFuZDogb25UcmlnZ2VyRXhwYW5kXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChleHBhbmRSb3dCeUNsaWNrKSB7XG4gICAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgaWNvbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaWNvbjtcbiAgICAgIH0pLCBfZXhwYW5kQ29sdW1uKTtcbiAgICAgIHJldHVybiBjbG9uZUNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2wpIHtcbiAgICAgICAgcmV0dXJuIGNvbCA9PT0gRVhQQU5EX0NPTFVNTiA/IGV4cGFuZENvbHVtbiA6IGNvbDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGJhc2VDb2x1bW5zLmluY2x1ZGVzKEVYUEFORF9DT0xVTU4pKSB7XG4gICAgICB3YXJuaW5nKGZhbHNlLCAnYGV4cGFuZGFibGVgIGlzIG5vdCBjb25maWcgYnV0IHRoZXJlIGV4aXN0IGBFWFBBTkRfQ09MVU1OYCBpbiBgY29sdW1uc2AuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhc2VDb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sKSB7XG4gICAgICByZXR1cm4gY29sICE9PSBFWFBBTkRfQ09MVU1OO1xuICAgIH0pO1xuICB9LCBbZXhwYW5kYWJsZSwgYmFzZUNvbHVtbnMsIGdldFJvd0tleSwgZXhwYW5kZWRLZXlzLCBleHBhbmRJY29uLCBkaXJlY3Rpb25dKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBUcmFuc2Zvcm0gPT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIG1lcmdlZENvbHVtbnMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZmluYWxDb2x1bW5zID0gd2l0aEV4cGFuZENvbHVtbnM7XG5cbiAgICBpZiAodHJhbnNmb3JtQ29sdW1ucykge1xuICAgICAgZmluYWxDb2x1bW5zID0gdHJhbnNmb3JtQ29sdW1ucyhmaW5hbENvbHVtbnMpO1xuICAgIH0gLy8gQWx3YXlzIHByb3ZpZGVzIGF0IGxlYXN0IG9uZSBjb2x1bW4gZm9yIHRhYmxlIGRpc3BsYXlcblxuXG4gICAgaWYgKCFmaW5hbENvbHVtbnMubGVuZ3RoKSB7XG4gICAgICBmaW5hbENvbHVtbnMgPSBbe1xuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpbmFsQ29sdW1ucztcbiAgfSwgW3RyYW5zZm9ybUNvbHVtbnMsIHdpdGhFeHBhbmRDb2x1bW5zLCBkaXJlY3Rpb25dKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gRmxhdHRlbiA9PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIGZsYXR0ZW5Db2x1bW5zID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3J0bCcpIHtcbiAgICAgIHJldHVybiByZXZlcnRGb3JSdGwoZmxhdENvbHVtbnMobWVyZ2VkQ29sdW1ucykpO1xuICAgIH1cblxuICAgIHJldHVybiBmbGF0Q29sdW1ucyhtZXJnZWRDb2x1bW5zKTtcbiAgfSwgW21lcmdlZENvbHVtbnMsIGRpcmVjdGlvbl0pOyAvLyBPbmx5IGNoZWNrIG91dCBvZiBwcm9kdWN0aW9uIHNpbmNlIGl0J3Mgd2FzdGUgZm9yIGVhY2ggcmVuZGVyXG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB3YXJuaW5nRml4ZWQoZGlyZWN0aW9uID09PSAncnRsJyA/IGZsYXR0ZW5Db2x1bW5zLnNsaWNlKCkucmV2ZXJzZSgpIDogZmxhdHRlbkNvbHVtbnMpO1xuICB9XG5cbiAgcmV0dXJuIFttZXJnZWRDb2x1bW5zLCBmbGF0dGVuQ29sdW1uc107XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVzZUNvbHVtbnM7IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgeyB1c2VSZWYsIHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG4vKipcbiAqIEV4ZWN1dGUgY29kZSBiZWZvcmUgbmV4dCBmcmFtZSBidXQgYXN5bmNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlTGF5b3V0U3RhdGUoZGVmYXVsdFN0YXRlKSB7XG4gIHZhciBzdGF0ZVJlZiA9IHVzZVJlZihkZWZhdWx0U3RhdGUpO1xuXG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZSh7fSksXG4gICAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICAgIGZvcmNlVXBkYXRlID0gX3VzZVN0YXRlMlsxXTtcblxuICB2YXIgbGFzdFByb21pc2VSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciB1cGRhdGVCYXRjaFJlZiA9IHVzZVJlZihbXSk7XG5cbiAgZnVuY3Rpb24gc2V0RnJhbWVTdGF0ZSh1cGRhdGVyKSB7XG4gICAgdXBkYXRlQmF0Y2hSZWYuY3VycmVudC5wdXNoKHVwZGF0ZXIpO1xuICAgIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgbGFzdFByb21pc2VSZWYuY3VycmVudCA9IHByb21pc2U7XG4gICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChsYXN0UHJvbWlzZVJlZi5jdXJyZW50ID09PSBwcm9taXNlKSB7XG4gICAgICAgIHZhciBwcmV2QmF0Y2ggPSB1cGRhdGVCYXRjaFJlZi5jdXJyZW50O1xuICAgICAgICB2YXIgcHJldlN0YXRlID0gc3RhdGVSZWYuY3VycmVudDtcbiAgICAgICAgdXBkYXRlQmF0Y2hSZWYuY3VycmVudCA9IFtdO1xuICAgICAgICBwcmV2QmF0Y2guZm9yRWFjaChmdW5jdGlvbiAoYmF0Y2hVcGRhdGVyKSB7XG4gICAgICAgICAgc3RhdGVSZWYuY3VycmVudCA9IGJhdGNoVXBkYXRlcihzdGF0ZVJlZi5jdXJyZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGxhc3RQcm9taXNlUmVmLmN1cnJlbnQgPSBudWxsO1xuXG4gICAgICAgIGlmIChwcmV2U3RhdGUgIT09IHN0YXRlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBmb3JjZVVwZGF0ZSh7fSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxhc3RQcm9taXNlUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgcmV0dXJuIFtzdGF0ZVJlZi5jdXJyZW50LCBzZXRGcmFtZVN0YXRlXTtcbn1cbi8qKiBMb2NrIGZyYW1lLCB3aGVuIGZyYW1lIHBhc3MgcmVzZXQgdGhlIGxvY2suICovXG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VUaW1lb3V0TG9jayhkZWZhdWx0U3RhdGUpIHtcbiAgdmFyIGZyYW1lUmVmID0gdXNlUmVmKGRlZmF1bHRTdGF0ZSB8fCBudWxsKTtcbiAgdmFyIHRpbWVvdXRSZWYgPSB1c2VSZWYoKTtcblxuICBmdW5jdGlvbiBjbGVhblVwKCkge1xuICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZW91dFJlZi5jdXJyZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFN0YXRlKG5ld1N0YXRlKSB7XG4gICAgZnJhbWVSZWYuY3VycmVudCA9IG5ld1N0YXRlO1xuICAgIGNsZWFuVXAoKTtcbiAgICB0aW1lb3V0UmVmLmN1cnJlbnQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBmcmFtZVJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgIHRpbWVvdXRSZWYuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICB9LCAxMDApO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U3RhdGUoKSB7XG4gICAgcmV0dXJuIGZyYW1lUmVmLmN1cnJlbnQ7XG4gIH1cblxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjbGVhblVwO1xuICB9LCBbXSk7XG4gIHJldHVybiBbc2V0U3RhdGUsIGdldFN0YXRlXTtcbn0iLCJpbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuLyoqXG4gKiBHZXQgc3RpY2t5IGNvbHVtbiBvZmZzZXQgd2lkdGhcbiAqL1xuXG5mdW5jdGlvbiB1c2VTdGlja3lPZmZzZXRzKGNvbFdpZHRocywgY29sdW1uQ291bnQsIGRpcmVjdGlvbikge1xuICB2YXIgc3RpY2t5T2Zmc2V0cyA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBsZWZ0T2Zmc2V0cyA9IFtdO1xuICAgIHZhciByaWdodE9mZnNldHMgPSBbXTtcbiAgICB2YXIgbGVmdCA9IDA7XG4gICAgdmFyIHJpZ2h0ID0gMDtcblxuICAgIGZvciAodmFyIHN0YXJ0ID0gMDsgc3RhcnQgPCBjb2x1bW5Db3VudDsgc3RhcnQgKz0gMSkge1xuICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3J0bCcpIHtcbiAgICAgICAgLy8gTGVmdCBvZmZzZXRcbiAgICAgICAgcmlnaHRPZmZzZXRzW3N0YXJ0XSA9IHJpZ2h0O1xuICAgICAgICByaWdodCArPSBjb2xXaWR0aHNbc3RhcnRdIHx8IDA7IC8vIFJpZ2h0IG9mZnNldFxuXG4gICAgICAgIHZhciBlbmQgPSBjb2x1bW5Db3VudCAtIHN0YXJ0IC0gMTtcbiAgICAgICAgbGVmdE9mZnNldHNbZW5kXSA9IGxlZnQ7XG4gICAgICAgIGxlZnQgKz0gY29sV2lkdGhzW2VuZF0gfHwgMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIExlZnQgb2Zmc2V0XG4gICAgICAgIGxlZnRPZmZzZXRzW3N0YXJ0XSA9IGxlZnQ7XG4gICAgICAgIGxlZnQgKz0gY29sV2lkdGhzW3N0YXJ0XSB8fCAwOyAvLyBSaWdodCBvZmZzZXRcblxuICAgICAgICB2YXIgX2VuZCA9IGNvbHVtbkNvdW50IC0gc3RhcnQgLSAxO1xuXG4gICAgICAgIHJpZ2h0T2Zmc2V0c1tfZW5kXSA9IHJpZ2h0O1xuICAgICAgICByaWdodCArPSBjb2xXaWR0aHNbX2VuZF0gfHwgMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGVmdDogbGVmdE9mZnNldHMsXG4gICAgICByaWdodDogcmlnaHRPZmZzZXRzXG4gICAgfTtcbiAgfSwgW2NvbFdpZHRocywgY29sdW1uQ291bnQsIGRpcmVjdGlvbl0pO1xuICByZXR1cm4gc3RpY2t5T2Zmc2V0cztcbn1cblxuZXhwb3J0IGRlZmF1bHQgdXNlU3RpY2t5T2Zmc2V0czsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiY29sdW1uVHlwZVwiXTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IElOVEVSTkFMX0NPTF9ERUZJTkUgfSBmcm9tICcuL3V0aWxzL2xlZ2FjeVV0aWwnO1xuXG5mdW5jdGlvbiBDb2xHcm91cChfcmVmKSB7XG4gIHZhciBjb2xXaWR0aHMgPSBfcmVmLmNvbFdpZHRocyxcbiAgICAgIGNvbHVtbnMgPSBfcmVmLmNvbHVtbnMsXG4gICAgICBjb2x1bUNvdW50ID0gX3JlZi5jb2x1bUNvdW50O1xuICB2YXIgY29scyA9IFtdO1xuICB2YXIgbGVuID0gY29sdW1Db3VudCB8fCBjb2x1bW5zLmxlbmd0aDsgLy8gT25seSBpbnNlcnQgY29sIHdpdGggd2lkdGggJiBhZGRpdGlvbmFsIHByb3BzXG4gIC8vIFNraXAgaWYgcmVzdCBjb2wgZG8gbm90IGhhdmUgYW55IHVzZWZ1bCBpbmZvXG5cbiAgdmFyIG11c3RJbnNlcnQgPSBmYWxzZTtcblxuICBmb3IgKHZhciBpID0gbGVuIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICB2YXIgd2lkdGggPSBjb2xXaWR0aHNbaV07XG4gICAgdmFyIGNvbHVtbiA9IGNvbHVtbnMgJiYgY29sdW1uc1tpXTtcbiAgICB2YXIgYWRkaXRpb25hbFByb3BzID0gY29sdW1uICYmIGNvbHVtbltJTlRFUk5BTF9DT0xfREVGSU5FXTtcblxuICAgIGlmICh3aWR0aCB8fCBhZGRpdGlvbmFsUHJvcHMgfHwgbXVzdEluc2VydCkge1xuICAgICAgdmFyIF9yZWYyID0gYWRkaXRpb25hbFByb3BzIHx8IHt9LFxuICAgICAgICAgIGNvbHVtblR5cGUgPSBfcmVmMi5jb2x1bW5UeXBlLFxuICAgICAgICAgIHJlc3RBZGRpdGlvbmFsUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjIsIF9leGNsdWRlZCk7XG5cbiAgICAgIGNvbHMudW5zaGlmdCggLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjb2xcIiwgX2V4dGVuZHMoe1xuICAgICAgICBrZXk6IGksXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgd2lkdGg6IHdpZHRoXG4gICAgICAgIH1cbiAgICAgIH0sIHJlc3RBZGRpdGlvbmFsUHJvcHMpKSk7XG4gICAgICBtdXN0SW5zZXJ0ID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjb2xncm91cFwiLCBudWxsLCBjb2xzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29sR3JvdXA7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5mdW5jdGlvbiBQYW5lbChfcmVmKSB7XG4gIHZhciBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVxuICB9LCBjaGlsZHJlbik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBhbmVsOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbnZhciBTdW1tYXJ5Q29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHt9KTtcbmV4cG9ydCBkZWZhdWx0IFN1bW1hcnlDb250ZXh0OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFN1bW1hcnlDb250ZXh0IGZyb20gJy4vU3VtbWFyeUNvbnRleHQnO1xuaW1wb3J0IENlbGwgZnJvbSAnLi4vQ2VsbCc7XG5pbXBvcnQgVGFibGVDb250ZXh0IGZyb20gJy4uL2NvbnRleHQvVGFibGVDb250ZXh0JztcbmltcG9ydCB7IGdldENlbGxGaXhlZEluZm8gfSBmcm9tICcuLi91dGlscy9maXhVdGlsJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFN1bW1hcnlDZWxsKF9yZWYpIHtcbiAgdmFyIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgICAgaW5kZXggPSBfcmVmLmluZGV4LFxuICAgICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuLFxuICAgICAgX3JlZiRjb2xTcGFuID0gX3JlZi5jb2xTcGFuLFxuICAgICAgY29sU3BhbiA9IF9yZWYkY29sU3BhbiA9PT0gdm9pZCAwID8gMSA6IF9yZWYkY29sU3BhbixcbiAgICAgIHJvd1NwYW4gPSBfcmVmLnJvd1NwYW4sXG4gICAgICBhbGlnbiA9IF9yZWYuYWxpZ247XG5cbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChUYWJsZUNvbnRleHQpLFxuICAgICAgcHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQucHJlZml4Q2xzLFxuICAgICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dDIgPSBSZWFjdC51c2VDb250ZXh0KFN1bW1hcnlDb250ZXh0KSxcbiAgICAgIHNjcm9sbENvbHVtbkluZGV4ID0gX1JlYWN0JHVzZUNvbnRleHQyLnNjcm9sbENvbHVtbkluZGV4LFxuICAgICAgc3RpY2t5T2Zmc2V0cyA9IF9SZWFjdCR1c2VDb250ZXh0Mi5zdGlja3lPZmZzZXRzLFxuICAgICAgZmxhdHRlbkNvbHVtbnMgPSBfUmVhY3QkdXNlQ29udGV4dDIuZmxhdHRlbkNvbHVtbnM7XG5cbiAgdmFyIGxhc3RJbmRleCA9IGluZGV4ICsgY29sU3BhbiAtIDE7XG4gIHZhciBtZXJnZWRDb2xTcGFuID0gbGFzdEluZGV4ICsgMSA9PT0gc2Nyb2xsQ29sdW1uSW5kZXggPyBjb2xTcGFuICsgMSA6IGNvbFNwYW47XG4gIHZhciBmaXhlZEluZm8gPSBnZXRDZWxsRml4ZWRJbmZvKGluZGV4LCBpbmRleCArIG1lcmdlZENvbFNwYW4gLSAxLCBmbGF0dGVuQ29sdW1ucywgc3RpY2t5T2Zmc2V0cywgZGlyZWN0aW9uKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENlbGwsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICBpbmRleDogaW5kZXgsXG4gICAgY29tcG9uZW50OiBcInRkXCIsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgcmVjb3JkOiBudWxsLFxuICAgIGRhdGFJbmRleDogbnVsbCxcbiAgICBhbGlnbjogYWxpZ24sXG4gICAgY29sU3BhbjogbWVyZ2VkQ29sU3BhbixcbiAgICByb3dTcGFuOiByb3dTcGFuLFxuICAgIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgIH1cbiAgfSwgZml4ZWRJbmZvKSk7XG59IiwiaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJjaGlsZHJlblwiXTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEZvb3RlclJvdyhfcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInRyXCIsIHByb3BzLCBjaGlsZHJlbik7XG59IiwiaW1wb3J0IENlbGwgZnJvbSAnLi9DZWxsJztcbmltcG9ydCBSb3cgZnJvbSAnLi9Sb3cnO1xuLyoqXG4gKiBTeW50YWN0aWMgc3VnYXIuIERvIG5vdCBzdXBwb3J0IEhPQy5cbiAqL1xuXG5mdW5jdGlvbiBTdW1tYXJ5KF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgcmV0dXJuIGNoaWxkcmVuO1xufVxuXG5TdW1tYXJ5LlJvdyA9IFJvdztcblN1bW1hcnkuQ2VsbCA9IENlbGw7XG5leHBvcnQgZGVmYXVsdCBTdW1tYXJ5OyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBUYWJsZUNvbnRleHQgZnJvbSAnLi4vY29udGV4dC9UYWJsZUNvbnRleHQnO1xuaW1wb3J0IFN1bW1hcnkgZnJvbSAnLi9TdW1tYXJ5JztcbmltcG9ydCBTdW1tYXJ5Q29udGV4dCBmcm9tICcuL1N1bW1hcnlDb250ZXh0JztcblxuZnVuY3Rpb24gRm9vdGVyKF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICAgIHN0aWNreU9mZnNldHMgPSBfcmVmLnN0aWNreU9mZnNldHMsXG4gICAgICBmbGF0dGVuQ29sdW1ucyA9IF9yZWYuZmxhdHRlbkNvbHVtbnM7XG4gIHZhciB0YWJsZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFRhYmxlQ29udGV4dCk7XG4gIHZhciBwcmVmaXhDbHMgPSB0YWJsZUNvbnRleHQucHJlZml4Q2xzO1xuICB2YXIgbGFzdENvbHVtbkluZGV4ID0gZmxhdHRlbkNvbHVtbnMubGVuZ3RoIC0gMTtcbiAgdmFyIHNjcm9sbENvbHVtbiA9IGZsYXR0ZW5Db2x1bW5zW2xhc3RDb2x1bW5JbmRleF07XG4gIHZhciBzdW1tYXJ5Q29udGV4dCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGlja3lPZmZzZXRzOiBzdGlja3lPZmZzZXRzLFxuICAgICAgZmxhdHRlbkNvbHVtbnM6IGZsYXR0ZW5Db2x1bW5zLFxuICAgICAgc2Nyb2xsQ29sdW1uSW5kZXg6IChzY3JvbGxDb2x1bW4gPT09IG51bGwgfHwgc2Nyb2xsQ29sdW1uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzY3JvbGxDb2x1bW4uc2Nyb2xsYmFyKSA/IGxhc3RDb2x1bW5JbmRleCA6IG51bGxcbiAgICB9O1xuICB9LCBbc2Nyb2xsQ29sdW1uLCBmbGF0dGVuQ29sdW1ucywgbGFzdENvbHVtbkluZGV4LCBzdGlja3lPZmZzZXRzXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTdW1tYXJ5Q29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBzdW1tYXJ5Q29udGV4dFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInRmb290XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3VtbWFyeVwiKVxuICB9LCBjaGlsZHJlbikpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBGb290ZXI7XG5leHBvcnQgdmFyIEZvb3RlckNvbXBvbmVudHMgPSBTdW1tYXJ5OyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJFeHBhbmRJY29uKF9yZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuXG4gIHZhciBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICAgIHJlY29yZCA9IF9yZWYucmVjb3JkLFxuICAgICAgb25FeHBhbmQgPSBfcmVmLm9uRXhwYW5kLFxuICAgICAgZXhwYW5kZWQgPSBfcmVmLmV4cGFuZGVkLFxuICAgICAgZXhwYW5kYWJsZSA9IF9yZWYuZXhwYW5kYWJsZTtcbiAgdmFyIGV4cGFuZENsYXNzTmFtZSA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcm93LWV4cGFuZC1pY29uXCIpO1xuXG4gIGlmICghZXhwYW5kYWJsZSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGV4cGFuZENsYXNzTmFtZSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1yb3ctc3BhY2VkXCIpKVxuICAgIH0pO1xuICB9XG5cbiAgdmFyIG9uQ2xpY2sgPSBmdW5jdGlvbiBvbkNsaWNrKGV2ZW50KSB7XG4gICAgb25FeHBhbmQocmVjb3JkLCBldmVudCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH07XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGV4cGFuZENsYXNzTmFtZSwgKF9jbGFzc05hbWVzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1yb3ctZXhwYW5kZWRcIiksIGV4cGFuZGVkKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJvdy1jb2xsYXBzZWRcIiksICFleHBhbmRlZCksIF9jbGFzc05hbWVzKSksXG4gICAgb25DbGljazogb25DbGlja1xuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQWxsQ2hpbGRyZW5LZXlzKGRhdGEsIGdldFJvd0tleSwgY2hpbGRyZW5Db2x1bW5OYW1lKSB7XG4gIHZhciBrZXlzID0gW107XG5cbiAgZnVuY3Rpb24gZGlnKGxpc3QpIHtcbiAgICAobGlzdCB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICAgIGtleXMucHVzaChnZXRSb3dLZXkoaXRlbSwgaW5kZXgpKTtcbiAgICAgIGRpZyhpdGVtW2NoaWxkcmVuQ29sdW1uTmFtZV0pO1xuICAgIH0pO1xuICB9XG5cbiAgZGlnKGRhdGEpO1xuICByZXR1cm4ga2V5cztcbn0iLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGFkZEV2ZW50TGlzdGVuZXIgZnJvbSBcInJjLXV0aWwvZXMvRG9tL2FkZEV2ZW50TGlzdGVuZXJcIjtcbmltcG9ydCBnZXRTY3JvbGxCYXJTaXplIGZyb20gXCJyYy11dGlsL2VzL2dldFNjcm9sbEJhclNpemVcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgZ2V0T2Zmc2V0IH0gZnJvbSBcInJjLXV0aWwvZXMvRG9tL2Nzc1wiO1xuaW1wb3J0IFRhYmxlQ29udGV4dCBmcm9tICcuL2NvbnRleHQvVGFibGVDb250ZXh0JztcbmltcG9ydCB7IHVzZUxheW91dFN0YXRlIH0gZnJvbSAnLi9ob29rcy91c2VGcmFtZSc7XG5cbnZhciBTdGlja3lTY3JvbGxCYXIgPSBmdW5jdGlvbiBTdGlja3lTY3JvbGxCYXIoX3JlZiwgcmVmKSB7XG4gIHZhciBfc2Nyb2xsQm9keVJlZiRjdXJyZW4sIF9zY3JvbGxCb2R5UmVmJGN1cnJlbjI7XG5cbiAgdmFyIHNjcm9sbEJvZHlSZWYgPSBfcmVmLnNjcm9sbEJvZHlSZWYsXG4gICAgICBvblNjcm9sbCA9IF9yZWYub25TY3JvbGwsXG4gICAgICBvZmZzZXRTY3JvbGwgPSBfcmVmLm9mZnNldFNjcm9sbCxcbiAgICAgIGNvbnRhaW5lciA9IF9yZWYuY29udGFpbmVyO1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoVGFibGVDb250ZXh0KSxcbiAgICAgIHByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LnByZWZpeENscztcblxuICB2YXIgYm9keVNjcm9sbFdpZHRoID0gKChfc2Nyb2xsQm9keVJlZiRjdXJyZW4gPSBzY3JvbGxCb2R5UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9zY3JvbGxCb2R5UmVmJGN1cnJlbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3Njcm9sbEJvZHlSZWYkY3VycmVuLnNjcm9sbFdpZHRoKSB8fCAwO1xuICB2YXIgYm9keVdpZHRoID0gKChfc2Nyb2xsQm9keVJlZiRjdXJyZW4yID0gc2Nyb2xsQm9keVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfc2Nyb2xsQm9keVJlZiRjdXJyZW4yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfc2Nyb2xsQm9keVJlZiRjdXJyZW4yLmNsaWVudFdpZHRoKSB8fCAwO1xuICB2YXIgc2Nyb2xsQmFyV2lkdGggPSBib2R5U2Nyb2xsV2lkdGggJiYgYm9keVdpZHRoICogKGJvZHlXaWR0aCAvIGJvZHlTY3JvbGxXaWR0aCk7XG4gIHZhciBzY3JvbGxCYXJSZWYgPSBSZWFjdC51c2VSZWYoKTtcblxuICB2YXIgX3VzZUxheW91dFN0YXRlID0gdXNlTGF5b3V0U3RhdGUoe1xuICAgIHNjcm9sbExlZnQ6IDAsXG4gICAgaXNIaWRkZW5TY3JvbGxCYXI6IGZhbHNlXG4gIH0pLFxuICAgICAgX3VzZUxheW91dFN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VMYXlvdXRTdGF0ZSwgMiksXG4gICAgICBzY3JvbGxTdGF0ZSA9IF91c2VMYXlvdXRTdGF0ZTJbMF0sXG4gICAgICBzZXRTY3JvbGxTdGF0ZSA9IF91c2VMYXlvdXRTdGF0ZTJbMV07XG5cbiAgdmFyIHJlZlN0YXRlID0gUmVhY3QudXNlUmVmKHtcbiAgICBkZWx0YTogMCxcbiAgICB4OiAwXG4gIH0pO1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShmYWxzZSksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICAgIGlzQWN0aXZlID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICAgIHNldEFjdGl2ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG5cbiAgdmFyIG9uTW91c2VVcCA9IGZ1bmN0aW9uIG9uTW91c2VVcCgpIHtcbiAgICBzZXRBY3RpdmUoZmFsc2UpO1xuICB9O1xuXG4gIHZhciBvbk1vdXNlRG93biA9IGZ1bmN0aW9uIG9uTW91c2VEb3duKGV2ZW50KSB7XG4gICAgZXZlbnQucGVyc2lzdCgpO1xuICAgIHJlZlN0YXRlLmN1cnJlbnQuZGVsdGEgPSBldmVudC5wYWdlWCAtIHNjcm9sbFN0YXRlLnNjcm9sbExlZnQ7XG4gICAgcmVmU3RhdGUuY3VycmVudC54ID0gMDtcbiAgICBzZXRBY3RpdmUodHJ1ZSk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfTtcblxuICB2YXIgb25Nb3VzZU1vdmUgPSBmdW5jdGlvbiBvbk1vdXNlTW92ZShldmVudCkge1xuICAgIHZhciBfd2luZG93O1xuXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL01vdXNlRXZlbnQvYnV0dG9uc1xuICAgIHZhciBfcmVmMiA9IGV2ZW50IHx8ICgoX3dpbmRvdyA9IHdpbmRvdykgPT09IG51bGwgfHwgX3dpbmRvdyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3dpbmRvdy5ldmVudCksXG4gICAgICAgIGJ1dHRvbnMgPSBfcmVmMi5idXR0b25zO1xuXG4gICAgaWYgKCFpc0FjdGl2ZSB8fCBidXR0b25zID09PSAwKSB7XG4gICAgICAvLyBJZiBvdXQgYm9keSBtb3VzZSB1cCwgd2UgY2FuIHNldCBpc0FjdGl2ZSBmYWxzZSB3aGVuIG1vdXNlIG1vdmVcbiAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICBzZXRBY3RpdmUoZmFsc2UpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGxlZnQgPSByZWZTdGF0ZS5jdXJyZW50LnggKyBldmVudC5wYWdlWCAtIHJlZlN0YXRlLmN1cnJlbnQueCAtIHJlZlN0YXRlLmN1cnJlbnQuZGVsdGE7XG5cbiAgICBpZiAobGVmdCA8PSAwKSB7XG4gICAgICBsZWZ0ID0gMDtcbiAgICB9XG5cbiAgICBpZiAobGVmdCArIHNjcm9sbEJhcldpZHRoID49IGJvZHlXaWR0aCkge1xuICAgICAgbGVmdCA9IGJvZHlXaWR0aCAtIHNjcm9sbEJhcldpZHRoO1xuICAgIH1cblxuICAgIG9uU2Nyb2xsKHtcbiAgICAgIHNjcm9sbExlZnQ6IGxlZnQgLyBib2R5V2lkdGggKiAoYm9keVNjcm9sbFdpZHRoICsgMilcbiAgICB9KTtcbiAgICByZWZTdGF0ZS5jdXJyZW50LnggPSBldmVudC5wYWdlWDtcbiAgfTtcblxuICB2YXIgb25Db250YWluZXJTY3JvbGwgPSBmdW5jdGlvbiBvbkNvbnRhaW5lclNjcm9sbCgpIHtcbiAgICBpZiAoIXNjcm9sbEJvZHlSZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB0YWJsZU9mZnNldFRvcCA9IGdldE9mZnNldChzY3JvbGxCb2R5UmVmLmN1cnJlbnQpLnRvcDtcbiAgICB2YXIgdGFibGVCb3R0b21PZmZzZXQgPSB0YWJsZU9mZnNldFRvcCArIHNjcm9sbEJvZHlSZWYuY3VycmVudC5vZmZzZXRIZWlnaHQ7XG4gICAgdmFyIGN1cnJlbnRDbGllbnRPZmZzZXQgPSBjb250YWluZXIgPT09IHdpbmRvdyA/IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgKyB3aW5kb3cuaW5uZXJIZWlnaHQgOiBnZXRPZmZzZXQoY29udGFpbmVyKS50b3AgKyBjb250YWluZXIuY2xpZW50SGVpZ2h0O1xuXG4gICAgaWYgKHRhYmxlQm90dG9tT2Zmc2V0IC0gZ2V0U2Nyb2xsQmFyU2l6ZSgpIDw9IGN1cnJlbnRDbGllbnRPZmZzZXQgfHwgdGFibGVPZmZzZXRUb3AgPj0gY3VycmVudENsaWVudE9mZnNldCAtIG9mZnNldFNjcm9sbCkge1xuICAgICAgc2V0U2Nyb2xsU3RhdGUoZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0YXRlKSwge30sIHtcbiAgICAgICAgICBpc0hpZGRlblNjcm9sbEJhcjogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRTY3JvbGxTdGF0ZShmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3RhdGUpLCB7fSwge1xuICAgICAgICAgIGlzSGlkZGVuU2Nyb2xsQmFyOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB2YXIgc2V0U2Nyb2xsTGVmdCA9IGZ1bmN0aW9uIHNldFNjcm9sbExlZnQobGVmdCkge1xuICAgIHNldFNjcm9sbFN0YXRlKGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3RhdGUpLCB7fSwge1xuICAgICAgICBzY3JvbGxMZWZ0OiBsZWZ0IC8gYm9keVNjcm9sbFdpZHRoICogYm9keVdpZHRoIHx8IDBcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldFNjcm9sbExlZnQ6IHNldFNjcm9sbExlZnRcbiAgICB9O1xuICB9KTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgb25Nb3VzZVVwTGlzdGVuZXIgPSBhZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LmJvZHksICdtb3VzZXVwJywgb25Nb3VzZVVwLCBmYWxzZSk7XG4gICAgdmFyIG9uTW91c2VNb3ZlTGlzdGVuZXIgPSBhZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LmJvZHksICdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSwgZmFsc2UpO1xuICAgIG9uQ29udGFpbmVyU2Nyb2xsKCk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIG9uTW91c2VVcExpc3RlbmVyLnJlbW92ZSgpO1xuICAgICAgb25Nb3VzZU1vdmVMaXN0ZW5lci5yZW1vdmUoKTtcbiAgICB9O1xuICB9LCBbc2Nyb2xsQmFyV2lkdGgsIGlzQWN0aXZlXSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG9uU2Nyb2xsTGlzdGVuZXIgPSBhZGRFdmVudExpc3RlbmVyKGNvbnRhaW5lciwgJ3Njcm9sbCcsIG9uQ29udGFpbmVyU2Nyb2xsLCBmYWxzZSk7XG4gICAgdmFyIG9uUmVzaXplTGlzdGVuZXIgPSBhZGRFdmVudExpc3RlbmVyKHdpbmRvdywgJ3Jlc2l6ZScsIG9uQ29udGFpbmVyU2Nyb2xsLCBmYWxzZSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIG9uU2Nyb2xsTGlzdGVuZXIucmVtb3ZlKCk7XG4gICAgICBvblJlc2l6ZUxpc3RlbmVyLnJlbW92ZSgpO1xuICAgIH07XG4gIH0sIFtjb250YWluZXJdKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXNjcm9sbFN0YXRlLmlzSGlkZGVuU2Nyb2xsQmFyKSB7XG4gICAgICBzZXRTY3JvbGxTdGF0ZShmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgdmFyIGJvZHlOb2RlID0gc2Nyb2xsQm9keVJlZi5jdXJyZW50O1xuXG4gICAgICAgIGlmICghYm9keU5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdGF0ZSksIHt9LCB7XG4gICAgICAgICAgc2Nyb2xsTGVmdDogYm9keU5vZGUuc2Nyb2xsTGVmdCAvIGJvZHlOb2RlLnNjcm9sbFdpZHRoICogYm9keU5vZGUuY2xpZW50V2lkdGhcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIFtzY3JvbGxTdGF0ZS5pc0hpZGRlblNjcm9sbEJhcl0pO1xuXG4gIGlmIChib2R5U2Nyb2xsV2lkdGggPD0gYm9keVdpZHRoIHx8ICFzY3JvbGxCYXJXaWR0aCB8fCBzY3JvbGxTdGF0ZS5pc0hpZGRlblNjcm9sbEJhcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBzdHlsZToge1xuICAgICAgaGVpZ2h0OiBnZXRTY3JvbGxCYXJTaXplKCksXG4gICAgICB3aWR0aDogYm9keVdpZHRoLFxuICAgICAgYm90dG9tOiBvZmZzZXRTY3JvbGxcbiAgICB9LFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zdGlja3ktc2Nyb2xsXCIpXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBvbk1vdXNlRG93bjogb25Nb3VzZURvd24sXG4gICAgcmVmOiBzY3JvbGxCYXJSZWYsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3RpY2t5LXNjcm9sbC1iYXJcIiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zdGlja3ktc2Nyb2xsLWJhci1hY3RpdmVcIiksIGlzQWN0aXZlKSksXG4gICAgc3R5bGU6IHtcbiAgICAgIHdpZHRoOiBcIlwiLmNvbmNhdChzY3JvbGxCYXJXaWR0aCwgXCJweFwiKSxcbiAgICAgIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGUzZChcIi5jb25jYXQoc2Nyb2xsU3RhdGUuc2Nyb2xsTGVmdCwgXCJweCwgMCwgMClcIilcbiAgICB9XG4gIH0pKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKFN0aWNreVNjcm9sbEJhcik7IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNhblVzZURvbSBmcm9tIFwicmMtdXRpbC9lcy9Eb20vY2FuVXNlRG9tXCI7IC8vIGZpeCBzc3IgcmVuZGVyXG5cbnZhciBkZWZhdWx0Q29udGFpbmVyID0gY2FuVXNlRG9tKCkgPyB3aW5kb3cgOiBudWxsO1xuLyoqIFN0aWNreSBoZWFkZXIgaG9va3MgKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlU3RpY2t5KHN0aWNreSwgcHJlZml4Q2xzKSB7XG4gIHZhciBfcmVmID0gX3R5cGVvZihzdGlja3kpID09PSAnb2JqZWN0JyA/IHN0aWNreSA6IHt9LFxuICAgICAgX3JlZiRvZmZzZXRIZWFkZXIgPSBfcmVmLm9mZnNldEhlYWRlcixcbiAgICAgIG9mZnNldEhlYWRlciA9IF9yZWYkb2Zmc2V0SGVhZGVyID09PSB2b2lkIDAgPyAwIDogX3JlZiRvZmZzZXRIZWFkZXIsXG4gICAgICBfcmVmJG9mZnNldFN1bW1hcnkgPSBfcmVmLm9mZnNldFN1bW1hcnksXG4gICAgICBvZmZzZXRTdW1tYXJ5ID0gX3JlZiRvZmZzZXRTdW1tYXJ5ID09PSB2b2lkIDAgPyAwIDogX3JlZiRvZmZzZXRTdW1tYXJ5LFxuICAgICAgX3JlZiRvZmZzZXRTY3JvbGwgPSBfcmVmLm9mZnNldFNjcm9sbCxcbiAgICAgIG9mZnNldFNjcm9sbCA9IF9yZWYkb2Zmc2V0U2Nyb2xsID09PSB2b2lkIDAgPyAwIDogX3JlZiRvZmZzZXRTY3JvbGwsXG4gICAgICBfcmVmJGdldENvbnRhaW5lciA9IF9yZWYuZ2V0Q29udGFpbmVyLFxuICAgICAgZ2V0Q29udGFpbmVyID0gX3JlZiRnZXRDb250YWluZXIgPT09IHZvaWQgMCA/IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZGVmYXVsdENvbnRhaW5lcjtcbiAgfSA6IF9yZWYkZ2V0Q29udGFpbmVyO1xuXG4gIHZhciBjb250YWluZXIgPSBnZXRDb250YWluZXIoKSB8fCBkZWZhdWx0Q29udGFpbmVyO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGlzU3RpY2t5ID0gISFzdGlja3k7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzU3RpY2t5OiBpc1N0aWNreSxcbiAgICAgIHN0aWNreUNsYXNzTmFtZTogaXNTdGlja3kgPyBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN0aWNreS1ob2xkZXJcIikgOiAnJyxcbiAgICAgIG9mZnNldEhlYWRlcjogb2Zmc2V0SGVhZGVyLFxuICAgICAgb2Zmc2V0U3VtbWFyeTogb2Zmc2V0U3VtbWFyeSxcbiAgICAgIG9mZnNldFNjcm9sbDogb2Zmc2V0U2Nyb2xsLFxuICAgICAgY29udGFpbmVyOiBjb250YWluZXJcbiAgICB9O1xuICB9LCBbb2Zmc2V0U2Nyb2xsLCBvZmZzZXRIZWFkZXIsIG9mZnNldFN1bW1hcnksIHByZWZpeENscywgY29udGFpbmVyXSk7XG59IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJjbGFzc05hbWVcIiwgXCJub0RhdGFcIiwgXCJjb2x1bW5zXCIsIFwiZmxhdHRlbkNvbHVtbnNcIiwgXCJjb2xXaWR0aHNcIiwgXCJjb2x1bUNvdW50XCIsIFwic3RpY2t5T2Zmc2V0c1wiLCBcImRpcmVjdGlvblwiLCBcImZpeEhlYWRlclwiLCBcInN0aWNreVRvcE9mZnNldFwiLCBcInN0aWNreUJvdHRvbU9mZnNldFwiLCBcInN0aWNreUNsYXNzTmFtZVwiLCBcIm9uU2Nyb2xsXCIsIFwibWF4Q29udGVudFNjcm9sbFwiLCBcImNoaWxkcmVuXCJdO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgZmlsbFJlZiB9IGZyb20gXCJyYy11dGlsL2VzL3JlZlwiO1xuaW1wb3J0IENvbEdyb3VwIGZyb20gJy4uL0NvbEdyb3VwJztcbmltcG9ydCBUYWJsZUNvbnRleHQgZnJvbSAnLi4vY29udGV4dC9UYWJsZUNvbnRleHQnO1xuXG5mdW5jdGlvbiB1c2VDb2x1bW5XaWR0aChjb2xXaWR0aHMsIGNvbHVtQ291bnQpIHtcbiAgcmV0dXJuIHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBjbG9uZUNvbHVtbnMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sdW1Db3VudDsgaSArPSAxKSB7XG4gICAgICB2YXIgdmFsID0gY29sV2lkdGhzW2ldO1xuXG4gICAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY2xvbmVDb2x1bW5zW2ldID0gdmFsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsb25lQ29sdW1ucztcbiAgfSwgW2NvbFdpZHRocy5qb2luKCdfJyksIGNvbHVtQ291bnRdKTtcbn1cblxudmFyIEZpeGVkSG9sZGVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKF9yZWYsIHJlZikge1xuICB2YXIgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgICBub0RhdGEgPSBfcmVmLm5vRGF0YSxcbiAgICAgIGNvbHVtbnMgPSBfcmVmLmNvbHVtbnMsXG4gICAgICBmbGF0dGVuQ29sdW1ucyA9IF9yZWYuZmxhdHRlbkNvbHVtbnMsXG4gICAgICBjb2xXaWR0aHMgPSBfcmVmLmNvbFdpZHRocyxcbiAgICAgIGNvbHVtQ291bnQgPSBfcmVmLmNvbHVtQ291bnQsXG4gICAgICBzdGlja3lPZmZzZXRzID0gX3JlZi5zdGlja3lPZmZzZXRzLFxuICAgICAgZGlyZWN0aW9uID0gX3JlZi5kaXJlY3Rpb24sXG4gICAgICBmaXhIZWFkZXIgPSBfcmVmLmZpeEhlYWRlcixcbiAgICAgIHN0aWNreVRvcE9mZnNldCA9IF9yZWYuc3RpY2t5VG9wT2Zmc2V0LFxuICAgICAgc3RpY2t5Qm90dG9tT2Zmc2V0ID0gX3JlZi5zdGlja3lCb3R0b21PZmZzZXQsXG4gICAgICBzdGlja3lDbGFzc05hbWUgPSBfcmVmLnN0aWNreUNsYXNzTmFtZSxcbiAgICAgIG9uU2Nyb2xsID0gX3JlZi5vblNjcm9sbCxcbiAgICAgIG1heENvbnRlbnRTY3JvbGwgPSBfcmVmLm1heENvbnRlbnRTY3JvbGwsXG4gICAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoVGFibGVDb250ZXh0KSxcbiAgICAgIHByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LnByZWZpeENscyxcbiAgICAgIHNjcm9sbGJhclNpemUgPSBfUmVhY3QkdXNlQ29udGV4dC5zY3JvbGxiYXJTaXplLFxuICAgICAgaXNTdGlja3kgPSBfUmVhY3QkdXNlQ29udGV4dC5pc1N0aWNreTtcblxuICB2YXIgY29tYmluYXRpb25TY3JvbGxCYXJTaXplID0gaXNTdGlja3kgJiYgIWZpeEhlYWRlciA/IDAgOiBzY3JvbGxiYXJTaXplOyAvLyBQYXNzIHdoZWVsIHRvIHNjcm9sbCBldmVudFxuXG4gIHZhciBzY3JvbGxSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBzZXRTY3JvbGxSZWYgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIGZpbGxSZWYocmVmLCBlbGVtZW50KTtcbiAgICBmaWxsUmVmKHNjcm9sbFJlZiwgZWxlbWVudCk7XG4gIH0sIFtdKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3Njcm9sbFJlZiRjdXJyZW50O1xuXG4gICAgZnVuY3Rpb24gb25XaGVlbChlKSB7XG4gICAgICB2YXIgY3VycmVudFRhcmdldCA9IGUuY3VycmVudFRhcmdldCxcbiAgICAgICAgICBkZWx0YVggPSBlLmRlbHRhWDtcblxuICAgICAgaWYgKGRlbHRhWCkge1xuICAgICAgICBvblNjcm9sbCh7XG4gICAgICAgICAgY3VycmVudFRhcmdldDogY3VycmVudFRhcmdldCxcbiAgICAgICAgICBzY3JvbGxMZWZ0OiBjdXJyZW50VGFyZ2V0LnNjcm9sbExlZnQgKyBkZWx0YVhcbiAgICAgICAgfSk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAoX3Njcm9sbFJlZiRjdXJyZW50ID0gc2Nyb2xsUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9zY3JvbGxSZWYkY3VycmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3Njcm9sbFJlZiRjdXJyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgb25XaGVlbCk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfc2Nyb2xsUmVmJGN1cnJlbnQyO1xuXG4gICAgICAoX3Njcm9sbFJlZiRjdXJyZW50MiA9IHNjcm9sbFJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfc2Nyb2xsUmVmJGN1cnJlbnQyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfc2Nyb2xsUmVmJGN1cnJlbnQyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3doZWVsJywgb25XaGVlbCk7XG4gICAgfTtcbiAgfSwgW10pOyAvLyBDaGVjayBpZiBhbGwgZmxhdHRlbkNvbHVtbnMgaGFzIHdpZHRoXG5cbiAgdmFyIGFsbEZsYXR0ZW5Db2x1bW5zV2l0aFdpZHRoID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZsYXR0ZW5Db2x1bW5zLmV2ZXJ5KGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgIHJldHVybiBjb2x1bW4ud2lkdGggPj0gMDtcbiAgICB9KTtcbiAgfSwgW2ZsYXR0ZW5Db2x1bW5zXSk7IC8vIEFkZCBzY3JvbGxiYXIgY29sdW1uXG5cbiAgdmFyIGxhc3RDb2x1bW4gPSBmbGF0dGVuQ29sdW1uc1tmbGF0dGVuQ29sdW1ucy5sZW5ndGggLSAxXTtcbiAgdmFyIFNjcm9sbEJhckNvbHVtbiA9IHtcbiAgICBmaXhlZDogbGFzdENvbHVtbiA/IGxhc3RDb2x1bW4uZml4ZWQgOiBudWxsLFxuICAgIHNjcm9sbGJhcjogdHJ1ZSxcbiAgICBvbkhlYWRlckNlbGw6IGZ1bmN0aW9uIG9uSGVhZGVyQ2VsbCgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jZWxsLXNjcm9sbGJhclwiKVxuICAgICAgfTtcbiAgICB9XG4gIH07XG4gIHZhciBjb2x1bW5zV2l0aFNjcm9sbGJhciA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjb21iaW5hdGlvblNjcm9sbEJhclNpemUgPyBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGNvbHVtbnMpLCBbU2Nyb2xsQmFyQ29sdW1uXSkgOiBjb2x1bW5zO1xuICB9LCBbY29tYmluYXRpb25TY3JvbGxCYXJTaXplLCBjb2x1bW5zXSk7XG4gIHZhciBmbGF0dGVuQ29sdW1uc1dpdGhTY3JvbGxiYXIgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY29tYmluYXRpb25TY3JvbGxCYXJTaXplID8gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShmbGF0dGVuQ29sdW1ucyksIFtTY3JvbGxCYXJDb2x1bW5dKSA6IGZsYXR0ZW5Db2x1bW5zO1xuICB9LCBbY29tYmluYXRpb25TY3JvbGxCYXJTaXplLCBmbGF0dGVuQ29sdW1uc10pOyAvLyBDYWxjdWxhdGUgdGhlIHN0aWNreSBvZmZzZXRzXG5cbiAgdmFyIGhlYWRlclN0aWNreU9mZnNldHMgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmlnaHQgPSBzdGlja3lPZmZzZXRzLnJpZ2h0LFxuICAgICAgICBsZWZ0ID0gc3RpY2t5T2Zmc2V0cy5sZWZ0O1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0aWNreU9mZnNldHMpLCB7fSwge1xuICAgICAgbGVmdDogZGlyZWN0aW9uID09PSAncnRsJyA/IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkobGVmdC5tYXAoZnVuY3Rpb24gKHdpZHRoKSB7XG4gICAgICAgIHJldHVybiB3aWR0aCArIGNvbWJpbmF0aW9uU2Nyb2xsQmFyU2l6ZTtcbiAgICAgIH0pKSwgWzBdKSA6IGxlZnQsXG4gICAgICByaWdodDogZGlyZWN0aW9uID09PSAncnRsJyA/IHJpZ2h0IDogW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShyaWdodC5tYXAoZnVuY3Rpb24gKHdpZHRoKSB7XG4gICAgICAgIHJldHVybiB3aWR0aCArIGNvbWJpbmF0aW9uU2Nyb2xsQmFyU2l6ZTtcbiAgICAgIH0pKSwgWzBdKSxcbiAgICAgIGlzU3RpY2t5OiBpc1N0aWNreVxuICAgIH0pO1xuICB9LCBbY29tYmluYXRpb25TY3JvbGxCYXJTaXplLCBzdGlja3lPZmZzZXRzLCBpc1N0aWNreV0pO1xuICB2YXIgbWVyZ2VkQ29sdW1uV2lkdGggPSB1c2VDb2x1bW5XaWR0aChjb2xXaWR0aHMsIGNvbHVtQ291bnQpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKHtcbiAgICAgIG92ZXJmbG93OiAnaGlkZGVuJ1xuICAgIH0sIGlzU3RpY2t5ID8ge1xuICAgICAgdG9wOiBzdGlja3lUb3BPZmZzZXQsXG4gICAgICBib3R0b206IHN0aWNreUJvdHRvbU9mZnNldFxuICAgIH0gOiB7fSksXG4gICAgcmVmOiBzZXRTY3JvbGxSZWYsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgX2RlZmluZVByb3BlcnR5KHt9LCBzdGlja3lDbGFzc05hbWUsICEhc3RpY2t5Q2xhc3NOYW1lKSlcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0YWJsZVwiLCB7XG4gICAgc3R5bGU6IHtcbiAgICAgIHRhYmxlTGF5b3V0OiAnZml4ZWQnLFxuICAgICAgdmlzaWJpbGl0eTogbm9EYXRhIHx8IG1lcmdlZENvbHVtbldpZHRoID8gbnVsbCA6ICdoaWRkZW4nXG4gICAgfVxuICB9LCAoIW5vRGF0YSB8fCAhbWF4Q29udGVudFNjcm9sbCB8fCBhbGxGbGF0dGVuQ29sdW1uc1dpdGhXaWR0aCkgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29sR3JvdXAsIHtcbiAgICBjb2xXaWR0aHM6IG1lcmdlZENvbHVtbldpZHRoID8gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShtZXJnZWRDb2x1bW5XaWR0aCksIFtjb21iaW5hdGlvblNjcm9sbEJhclNpemVdKSA6IFtdLFxuICAgIGNvbHVtQ291bnQ6IGNvbHVtQ291bnQgKyAxLFxuICAgIGNvbHVtbnM6IGZsYXR0ZW5Db2x1bW5zV2l0aFNjcm9sbGJhclxuICB9KSwgY2hpbGRyZW4oX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgc3RpY2t5T2Zmc2V0czogaGVhZGVyU3RpY2t5T2Zmc2V0cyxcbiAgICBjb2x1bW5zOiBjb2x1bW5zV2l0aFNjcm9sbGJhcixcbiAgICBmbGF0dGVuQ29sdW1uczogZmxhdHRlbkNvbHVtbnNXaXRoU2Nyb2xsYmFyXG4gIH0pKSkpO1xufSk7XG5GaXhlZEhvbGRlci5kaXNwbGF5TmFtZSA9ICdGaXhlZEhvbGRlcic7XG5leHBvcnQgZGVmYXVsdCBGaXhlZEhvbGRlcjsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuXG4vKipcbiAqIEZlYXR1cmU6XG4gKiAgLSBmaXhlZCBub3QgbmVlZCB0byBzZXQgd2lkdGhcbiAqICAtIHN1cHBvcnQgYHJvd0V4cGFuZGFibGVgIHRvIGNvbmZpZyByb3cgZXhwYW5kIGxvZ2ljXG4gKiAgLSBhZGQgYHN1bW1hcnlgIHRvIHN1cHBvcnQgYCgpID0+IFJlYWN0Tm9kZWBcbiAqXG4gKiBVcGRhdGU6XG4gKiAgLSBgZGF0YUluZGV4YCBpcyBgYXJyYXlbXWAgbm93XG4gKiAgLSBgZXhwYW5kYWJsZWAgd3JhcCBhbGwgdGhlIGV4cGFuZCByZWxhdGVkIHByb3BzXG4gKlxuICogUmVtb3ZlZDpcbiAqICAtIGV4cGFuZEljb25Bc0NlbGxcbiAqICAtIHVzZUZpeGVkSGVhZGVyXG4gKiAgLSByb3dSZWZcbiAqICAtIGNvbHVtbnNbbnVtYmVyXS5vbkNlbGxDbGlja1xuICogIC0gb25Sb3dDbGlja1xuICogIC0gb25Sb3dEb3VibGVDbGlja1xuICogIC0gb25Sb3dNb3VzZUVudGVyXG4gKiAgLSBvblJvd01vdXNlTGVhdmVcbiAqICAtIGdldEJvZHlXcmFwcGVyXG4gKiAgLSBib2R5U3R5bGVcbiAqXG4gKiBEZXByZWNhdGVkOlxuICogIC0gQWxsIGV4cGFuZGVkIHByb3BzLCBtb3ZlIGludG8gZXhwYW5kYWJsZVxuICovXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgaXNWaXNpYmxlIGZyb20gXCJyYy11dGlsL2VzL0RvbS9pc1Zpc2libGVcIjtcbmltcG9ydCBwaWNrQXR0cnMgZnJvbSBcInJjLXV0aWwvZXMvcGlja0F0dHJzXCI7XG5pbXBvcnQgeyBpc1N0eWxlU3VwcG9ydCB9IGZyb20gXCJyYy11dGlsL2VzL0RvbS9zdHlsZUNoZWNrZXJcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHNoYWxsb3dFcXVhbCBmcm9tICdzaGFsbG93ZXF1YWwnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0IFJlc2l6ZU9ic2VydmVyIGZyb20gJ3JjLXJlc2l6ZS1vYnNlcnZlcic7XG5pbXBvcnQgeyBnZXRUYXJnZXRTY3JvbGxCYXJTaXplIH0gZnJvbSBcInJjLXV0aWwvZXMvZ2V0U2Nyb2xsQmFyU2l6ZVwiO1xuaW1wb3J0IENvbHVtbkdyb3VwIGZyb20gJy4vc3VnYXIvQ29sdW1uR3JvdXAnO1xuaW1wb3J0IENvbHVtbiBmcm9tICcuL3N1Z2FyL0NvbHVtbic7XG5pbXBvcnQgSGVhZGVyIGZyb20gJy4vSGVhZGVyL0hlYWRlcic7XG5pbXBvcnQgVGFibGVDb250ZXh0IGZyb20gJy4vY29udGV4dC9UYWJsZUNvbnRleHQnO1xuaW1wb3J0IEJvZHlDb250ZXh0IGZyb20gJy4vY29udGV4dC9Cb2R5Q29udGV4dCc7XG5pbXBvcnQgQm9keSBmcm9tICcuL0JvZHknO1xuaW1wb3J0IHVzZUNvbHVtbnMgZnJvbSAnLi9ob29rcy91c2VDb2x1bW5zJztcbmltcG9ydCB7IHVzZUxheW91dFN0YXRlLCB1c2VUaW1lb3V0TG9jayB9IGZyb20gJy4vaG9va3MvdXNlRnJhbWUnO1xuaW1wb3J0IHsgZ2V0UGF0aFZhbHVlLCB2YWxpZGF0ZVZhbHVlLCBnZXRDb2x1bW5zS2V5IH0gZnJvbSAnLi91dGlscy92YWx1ZVV0aWwnO1xuaW1wb3J0IFJlc2l6ZUNvbnRleHQgZnJvbSAnLi9jb250ZXh0L1Jlc2l6ZUNvbnRleHQnO1xuaW1wb3J0IHVzZVN0aWNreU9mZnNldHMgZnJvbSAnLi9ob29rcy91c2VTdGlja3lPZmZzZXRzJztcbmltcG9ydCBDb2xHcm91cCBmcm9tICcuL0NvbEdyb3VwJztcbmltcG9ydCB7IGdldEV4cGFuZGFibGVQcm9wcyB9IGZyb20gJy4vdXRpbHMvbGVnYWN5VXRpbCc7XG5pbXBvcnQgUGFuZWwgZnJvbSAnLi9QYW5lbCc7XG5pbXBvcnQgRm9vdGVyLCB7IEZvb3RlckNvbXBvbmVudHMgfSBmcm9tICcuL0Zvb3Rlcic7XG5pbXBvcnQgeyBmaW5kQWxsQ2hpbGRyZW5LZXlzLCByZW5kZXJFeHBhbmRJY29uIH0gZnJvbSAnLi91dGlscy9leHBhbmRVdGlsJztcbmltcG9ydCB7IGdldENlbGxGaXhlZEluZm8gfSBmcm9tICcuL3V0aWxzL2ZpeFV0aWwnO1xuaW1wb3J0IFN0aWNreVNjcm9sbEJhciBmcm9tICcuL3N0aWNreVNjcm9sbEJhcic7XG5pbXBvcnQgdXNlU3RpY2t5IGZyb20gJy4vaG9va3MvdXNlU3RpY2t5JztcbmltcG9ydCBGaXhlZEhvbGRlciBmcm9tICcuL0ZpeGVkSG9sZGVyJztcbmltcG9ydCBTdW1tYXJ5IGZyb20gJy4vRm9vdGVyL1N1bW1hcnknO1xuaW1wb3J0IFN0aWNreUNvbnRleHQgZnJvbSAnLi9jb250ZXh0L1N0aWNreUNvbnRleHQnO1xuaW1wb3J0IEV4cGFuZGVkUm93Q29udGV4dCBmcm9tICcuL2NvbnRleHQvRXhwYW5kZWRSb3dDb250ZXh0JztcbmltcG9ydCB7IEVYUEFORF9DT0xVTU4gfSBmcm9tICcuL2NvbnN0YW50JzsgLy8gVXNlZCBmb3IgY29uZGl0aW9ucyBjYWNoZVxuXG52YXIgRU1QVFlfREFUQSA9IFtdOyAvLyBVc2VkIGZvciBjdXN0b21pemUgc2Nyb2xsXG5cbnZhciBFTVBUWV9TQ1JPTExfVEFSR0VUID0ge307XG5leHBvcnQgdmFyIElOVEVSTkFMX0hPT0tTID0gJ3JjLXRhYmxlLWludGVybmFsLWhvb2snO1xudmFyIE1lbW9UYWJsZUNvbnRlbnQgPSAvKiNfX1BVUkVfXyovUmVhY3QubWVtbyhmdW5jdGlvbiAoX3JlZikge1xuICB2YXIgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuO1xuICByZXR1cm4gY2hpbGRyZW47XG59LCBmdW5jdGlvbiAocHJldiwgbmV4dCkge1xuICBpZiAoIXNoYWxsb3dFcXVhbChwcmV2LnByb3BzLCBuZXh0LnByb3BzKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBObyBhZGRpdGlvbmFsIHJlbmRlciB3aGVuIHBpbmdlZCBzdGF0dXMgY2hhbmdlLlxuICAvLyBUaGlzIGlzIG5vdCBhIGJ1Zy5cblxuXG4gIHJldHVybiBwcmV2LnBpbmdMZWZ0ICE9PSBuZXh0LnBpbmdMZWZ0IHx8IHByZXYucGluZ1JpZ2h0ICE9PSBuZXh0LnBpbmdSaWdodDtcbn0pO1xuXG5mdW5jdGlvbiBUYWJsZShwcm9wcykge1xuICB2YXIgX2NsYXNzTmFtZXM7XG5cbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIHJvd0NsYXNzTmFtZSA9IHByb3BzLnJvd0NsYXNzTmFtZSxcbiAgICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgICBkYXRhID0gcHJvcHMuZGF0YSxcbiAgICAgIHJvd0tleSA9IHByb3BzLnJvd0tleSxcbiAgICAgIHNjcm9sbCA9IHByb3BzLnNjcm9sbCxcbiAgICAgIHRhYmxlTGF5b3V0ID0gcHJvcHMudGFibGVMYXlvdXQsXG4gICAgICBkaXJlY3Rpb24gPSBwcm9wcy5kaXJlY3Rpb24sXG4gICAgICB0aXRsZSA9IHByb3BzLnRpdGxlLFxuICAgICAgZm9vdGVyID0gcHJvcHMuZm9vdGVyLFxuICAgICAgc3VtbWFyeSA9IHByb3BzLnN1bW1hcnksXG4gICAgICBpZCA9IHByb3BzLmlkLFxuICAgICAgc2hvd0hlYWRlciA9IHByb3BzLnNob3dIZWFkZXIsXG4gICAgICBjb21wb25lbnRzID0gcHJvcHMuY29tcG9uZW50cyxcbiAgICAgIGVtcHR5VGV4dCA9IHByb3BzLmVtcHR5VGV4dCxcbiAgICAgIG9uUm93ID0gcHJvcHMub25Sb3csXG4gICAgICBvbkhlYWRlclJvdyA9IHByb3BzLm9uSGVhZGVyUm93LFxuICAgICAgaW50ZXJuYWxIb29rcyA9IHByb3BzLmludGVybmFsSG9va3MsXG4gICAgICB0cmFuc2Zvcm1Db2x1bW5zID0gcHJvcHMudHJhbnNmb3JtQ29sdW1ucyxcbiAgICAgIGludGVybmFsUmVmcyA9IHByb3BzLmludGVybmFsUmVmcyxcbiAgICAgIHN0aWNreSA9IHByb3BzLnN0aWNreTtcbiAgdmFyIG1lcmdlZERhdGEgPSBkYXRhIHx8IEVNUFRZX0RBVEE7XG4gIHZhciBoYXNEYXRhID0gISFtZXJnZWREYXRhLmxlbmd0aDsgLy8gPT09PT09PT09PT09PT09PT09PT09IFdhcm5pbmcgPT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgWydvblJvd0NsaWNrJywgJ29uUm93RG91YmxlQ2xpY2snLCAnb25Sb3dDb250ZXh0TWVudScsICdvblJvd01vdXNlRW50ZXInLCAnb25Sb3dNb3VzZUxlYXZlJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgd2FybmluZyhwcm9wc1tuYW1lXSA9PT0gdW5kZWZpbmVkLCBcImBcIi5jb25jYXQobmFtZSwgXCJgIGlzIHJlbW92ZWQsIHBsZWFzZSB1c2UgYG9uUm93YCBpbnN0ZWFkLlwiKSk7XG4gICAgfSk7XG4gICAgd2FybmluZyghKCdnZXRCb2R5V3JhcHBlcicgaW4gcHJvcHMpLCAnYGdldEJvZHlXcmFwcGVyYCBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIGN1c3RvbSBgY29tcG9uZW50c2AgaW5zdGVhZC4nKTtcbiAgfSAvLyA9PT09PT09PT09PT09PT09PT09PSBDdXN0b21pemUgPT09PT09PT09PT09PT09PT09PT09XG5cblxuICB2YXIgZ2V0Q29tcG9uZW50ID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHBhdGgsIGRlZmF1bHRDb21wb25lbnQpIHtcbiAgICByZXR1cm4gZ2V0UGF0aFZhbHVlKGNvbXBvbmVudHMgfHwge30sIHBhdGgpIHx8IGRlZmF1bHRDb21wb25lbnQ7XG4gIH0sIFtjb21wb25lbnRzXSk7XG4gIHZhciBnZXRSb3dLZXkgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHlwZW9mIHJvd0tleSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHJvd0tleTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKHJlY29yZCkge1xuICAgICAgdmFyIGtleSA9IHJlY29yZCAmJiByZWNvcmRbcm93S2V5XTtcblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgd2FybmluZyhrZXkgIT09IHVuZGVmaW5lZCwgJ0VhY2ggcmVjb3JkIGluIHRhYmxlIHNob3VsZCBoYXZlIGEgdW5pcXVlIGBrZXlgIHByb3AsIG9yIHNldCBgcm93S2V5YCB0byBhbiB1bmlxdWUgcHJpbWFyeSBrZXkuJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBrZXk7XG4gICAgfTtcbiAgfSwgW3Jvd0tleV0pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09IEV4cGFuZCA9PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIGV4cGFuZGFibGVDb25maWcgPSBnZXRFeHBhbmRhYmxlUHJvcHMocHJvcHMpO1xuICB2YXIgZXhwYW5kSWNvbiA9IGV4cGFuZGFibGVDb25maWcuZXhwYW5kSWNvbixcbiAgICAgIGV4cGFuZGVkUm93S2V5cyA9IGV4cGFuZGFibGVDb25maWcuZXhwYW5kZWRSb3dLZXlzLFxuICAgICAgZGVmYXVsdEV4cGFuZGVkUm93S2V5cyA9IGV4cGFuZGFibGVDb25maWcuZGVmYXVsdEV4cGFuZGVkUm93S2V5cyxcbiAgICAgIGRlZmF1bHRFeHBhbmRBbGxSb3dzID0gZXhwYW5kYWJsZUNvbmZpZy5kZWZhdWx0RXhwYW5kQWxsUm93cyxcbiAgICAgIGV4cGFuZGVkUm93UmVuZGVyID0gZXhwYW5kYWJsZUNvbmZpZy5leHBhbmRlZFJvd1JlbmRlcixcbiAgICAgIGNvbHVtblRpdGxlID0gZXhwYW5kYWJsZUNvbmZpZy5jb2x1bW5UaXRsZSxcbiAgICAgIG9uRXhwYW5kID0gZXhwYW5kYWJsZUNvbmZpZy5vbkV4cGFuZCxcbiAgICAgIG9uRXhwYW5kZWRSb3dzQ2hhbmdlID0gZXhwYW5kYWJsZUNvbmZpZy5vbkV4cGFuZGVkUm93c0NoYW5nZSxcbiAgICAgIGV4cGFuZFJvd0J5Q2xpY2sgPSBleHBhbmRhYmxlQ29uZmlnLmV4cGFuZFJvd0J5Q2xpY2ssXG4gICAgICByb3dFeHBhbmRhYmxlID0gZXhwYW5kYWJsZUNvbmZpZy5yb3dFeHBhbmRhYmxlLFxuICAgICAgZXhwYW5kSWNvbkNvbHVtbkluZGV4ID0gZXhwYW5kYWJsZUNvbmZpZy5leHBhbmRJY29uQ29sdW1uSW5kZXgsXG4gICAgICBleHBhbmRlZFJvd0NsYXNzTmFtZSA9IGV4cGFuZGFibGVDb25maWcuZXhwYW5kZWRSb3dDbGFzc05hbWUsXG4gICAgICBjaGlsZHJlbkNvbHVtbk5hbWUgPSBleHBhbmRhYmxlQ29uZmlnLmNoaWxkcmVuQ29sdW1uTmFtZSxcbiAgICAgIGluZGVudFNpemUgPSBleHBhbmRhYmxlQ29uZmlnLmluZGVudFNpemU7XG4gIHZhciBtZXJnZWRFeHBhbmRJY29uID0gZXhwYW5kSWNvbiB8fCByZW5kZXJFeHBhbmRJY29uO1xuICB2YXIgbWVyZ2VkQ2hpbGRyZW5Db2x1bW5OYW1lID0gY2hpbGRyZW5Db2x1bW5OYW1lIHx8ICdjaGlsZHJlbic7XG4gIHZhciBleHBhbmRhYmxlVHlwZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmIChleHBhbmRlZFJvd1JlbmRlcikge1xuICAgICAgcmV0dXJuICdyb3cnO1xuICAgIH1cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlcnNjb3JlLWRhbmdsZSAqL1xuXG4gICAgLyoqXG4gICAgICogRml4IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzIxMTU0XG4gICAgICogVGhpcyBpcyBhIHdvcmthcm91bmQgdG8gbm90IHRvIGJyZWFrIGN1cnJlbnQgYmVoYXZpb3IuXG4gICAgICogV2UgY2FuIHJlbW92ZSBmb2xsb3cgY29kZSBhZnRlciBmaW5hbCByZWxlYXNlLlxuICAgICAqXG4gICAgICogVG8gb3RoZXIgZGV2ZWxvcGVyOlxuICAgICAqICBEbyBub3QgdXNlIGBfX1BBUkVOVF9SRU5ERVJfSUNPTl9fYCBpbiBwcm9kIHNpbmNlIHdlIHdpbGwgcmVtb3ZlIHRoaXMgd2hlbiByZWZhY3RvclxuICAgICAqL1xuXG5cbiAgICBpZiAocHJvcHMuZXhwYW5kYWJsZSAmJiBpbnRlcm5hbEhvb2tzID09PSBJTlRFUk5BTF9IT09LUyAmJiBwcm9wcy5leHBhbmRhYmxlLl9fUEFSRU5UX1JFTkRFUl9JQ09OX18gfHwgbWVyZ2VkRGF0YS5zb21lKGZ1bmN0aW9uIChyZWNvcmQpIHtcbiAgICAgIHJldHVybiByZWNvcmQgJiYgX3R5cGVvZihyZWNvcmQpID09PSAnb2JqZWN0JyAmJiByZWNvcmRbbWVyZ2VkQ2hpbGRyZW5Db2x1bW5OYW1lXTtcbiAgICB9KSkge1xuICAgICAgcmV0dXJuICduZXN0JztcbiAgICB9XG4gICAgLyogZXNsaW50LWVuYWJsZSAqL1xuXG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sIFshIWV4cGFuZGVkUm93UmVuZGVyLCBtZXJnZWREYXRhXSk7XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZGVmYXVsdEV4cGFuZGVkUm93S2V5cykge1xuICAgICAgcmV0dXJuIGRlZmF1bHRFeHBhbmRlZFJvd0tleXM7XG4gICAgfVxuXG4gICAgaWYgKGRlZmF1bHRFeHBhbmRBbGxSb3dzKSB7XG4gICAgICByZXR1cm4gZmluZEFsbENoaWxkcmVuS2V5cyhtZXJnZWREYXRhLCBnZXRSb3dLZXksIG1lcmdlZENoaWxkcmVuQ29sdW1uTmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtdO1xuICB9KSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgICAgaW5uZXJFeHBhbmRlZEtleXMgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0SW5uZXJFeHBhbmRlZEtleXMgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIHZhciBtZXJnZWRFeHBhbmRlZEtleXMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IFNldChleHBhbmRlZFJvd0tleXMgfHwgaW5uZXJFeHBhbmRlZEtleXMgfHwgW10pO1xuICB9LCBbZXhwYW5kZWRSb3dLZXlzLCBpbm5lckV4cGFuZGVkS2V5c10pO1xuICB2YXIgb25UcmlnZ2VyRXhwYW5kID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHJlY29yZCkge1xuICAgIHZhciBrZXkgPSBnZXRSb3dLZXkocmVjb3JkLCBtZXJnZWREYXRhLmluZGV4T2YocmVjb3JkKSk7XG4gICAgdmFyIG5ld0V4cGFuZGVkS2V5cztcbiAgICB2YXIgaGFzS2V5ID0gbWVyZ2VkRXhwYW5kZWRLZXlzLmhhcyhrZXkpO1xuXG4gICAgaWYgKGhhc0tleSkge1xuICAgICAgbWVyZ2VkRXhwYW5kZWRLZXlzLmRlbGV0ZShrZXkpO1xuICAgICAgbmV3RXhwYW5kZWRLZXlzID0gX3RvQ29uc3VtYWJsZUFycmF5KG1lcmdlZEV4cGFuZGVkS2V5cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0V4cGFuZGVkS2V5cyA9IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkobWVyZ2VkRXhwYW5kZWRLZXlzKSwgW2tleV0pO1xuICAgIH1cblxuICAgIHNldElubmVyRXhwYW5kZWRLZXlzKG5ld0V4cGFuZGVkS2V5cyk7XG5cbiAgICBpZiAob25FeHBhbmQpIHtcbiAgICAgIG9uRXhwYW5kKCFoYXNLZXksIHJlY29yZCk7XG4gICAgfVxuXG4gICAgaWYgKG9uRXhwYW5kZWRSb3dzQ2hhbmdlKSB7XG4gICAgICBvbkV4cGFuZGVkUm93c0NoYW5nZShuZXdFeHBhbmRlZEtleXMpO1xuICAgIH1cbiAgfSwgW2dldFJvd0tleSwgbWVyZ2VkRXhwYW5kZWRLZXlzLCBtZXJnZWREYXRhLCBvbkV4cGFuZCwgb25FeHBhbmRlZFJvd3NDaGFuZ2VdKTsgLy8gV2FybmluZyBpZiB1c2UgYGV4cGFuZGVkUm93UmVuZGVyYCBhbmQgbmVzdCBjaGlsZHJlbiBpbiB0aGUgc2FtZSB0aW1lXG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgZXhwYW5kZWRSb3dSZW5kZXIgJiYgbWVyZ2VkRGF0YS5zb21lKGZ1bmN0aW9uIChyZWNvcmQpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShyZWNvcmQgPT09IG51bGwgfHwgcmVjb3JkID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZWNvcmRbbWVyZ2VkQ2hpbGRyZW5Db2x1bW5OYW1lXSk7XG4gIH0pKSB7XG4gICAgd2FybmluZyhmYWxzZSwgJ2BleHBhbmRlZFJvd1JlbmRlcmAgc2hvdWxkIG5vdCB1c2Ugd2l0aCBuZXN0ZWQgVGFibGUnKTtcbiAgfSAvLyA9PT09PT09PT09PT09PT09PT09PT09IENvbHVtbiA9PT09PT09PT09PT09PT09PT09PT09XG5cblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKDApLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTMsIDIpLFxuICAgICAgY29tcG9uZW50V2lkdGggPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgICAgc2V0Q29tcG9uZW50V2lkdGggPSBfUmVhY3QkdXNlU3RhdGU0WzFdO1xuXG4gIHZhciBfdXNlQ29sdW1ucyA9IHVzZUNvbHVtbnMoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwgZXhwYW5kYWJsZUNvbmZpZyksIHt9LCB7XG4gICAgZXhwYW5kYWJsZTogISFleHBhbmRlZFJvd1JlbmRlcixcbiAgICBjb2x1bW5UaXRsZTogY29sdW1uVGl0bGUsXG4gICAgZXhwYW5kZWRLZXlzOiBtZXJnZWRFeHBhbmRlZEtleXMsXG4gICAgZ2V0Um93S2V5OiBnZXRSb3dLZXksXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMjM4OTRcbiAgICBvblRyaWdnZXJFeHBhbmQ6IG9uVHJpZ2dlckV4cGFuZCxcbiAgICBleHBhbmRJY29uOiBtZXJnZWRFeHBhbmRJY29uLFxuICAgIGV4cGFuZEljb25Db2x1bW5JbmRleDogZXhwYW5kSWNvbkNvbHVtbkluZGV4LFxuICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uXG4gIH0pLCBpbnRlcm5hbEhvb2tzID09PSBJTlRFUk5BTF9IT09LUyA/IHRyYW5zZm9ybUNvbHVtbnMgOiBudWxsKSxcbiAgICAgIF91c2VDb2x1bW5zMiA9IF9zbGljZWRUb0FycmF5KF91c2VDb2x1bW5zLCAyKSxcbiAgICAgIGNvbHVtbnMgPSBfdXNlQ29sdW1uczJbMF0sXG4gICAgICBmbGF0dGVuQ29sdW1ucyA9IF91c2VDb2x1bW5zMlsxXTtcblxuICB2YXIgY29sdW1uQ29udGV4dCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb2x1bW5zOiBjb2x1bW5zLFxuICAgICAgZmxhdHRlbkNvbHVtbnM6IGZsYXR0ZW5Db2x1bW5zXG4gICAgfTtcbiAgfSwgW2NvbHVtbnMsIGZsYXR0ZW5Db2x1bW5zXSk7IC8vID09PT09PT09PT09PT09PT09PT09PT0gU2Nyb2xsID09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgZnVsbFRhYmxlUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciBzY3JvbGxIZWFkZXJSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgdmFyIHNjcm9sbEJvZHlSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgdmFyIHNjcm9sbEJvZHlDb250YWluZXJSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgdmFyIHNjcm9sbFN1bW1hcnlSZWYgPSBSZWFjdC51c2VSZWYoKTtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlNSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTYgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGU1LCAyKSxcbiAgICAgIHBpbmdlZExlZnQgPSBfUmVhY3QkdXNlU3RhdGU2WzBdLFxuICAgICAgc2V0UGluZ2VkTGVmdCA9IF9SZWFjdCR1c2VTdGF0ZTZbMV07XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTcgPSBSZWFjdC51c2VTdGF0ZShmYWxzZSksXG4gICAgICBfUmVhY3QkdXNlU3RhdGU4ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlNywgMiksXG4gICAgICBwaW5nZWRSaWdodCA9IF9SZWFjdCR1c2VTdGF0ZThbMF0sXG4gICAgICBzZXRQaW5nZWRSaWdodCA9IF9SZWFjdCR1c2VTdGF0ZThbMV07XG5cbiAgdmFyIF91c2VMYXlvdXRTdGF0ZSA9IHVzZUxheW91dFN0YXRlKG5ldyBNYXAoKSksXG4gICAgICBfdXNlTGF5b3V0U3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZUxheW91dFN0YXRlLCAyKSxcbiAgICAgIGNvbHNXaWR0aHMgPSBfdXNlTGF5b3V0U3RhdGUyWzBdLFxuICAgICAgdXBkYXRlQ29sc1dpZHRocyA9IF91c2VMYXlvdXRTdGF0ZTJbMV07IC8vIENvbnZlcnQgbWFwIHRvIG51bWJlciB3aWR0aFxuXG5cbiAgdmFyIGNvbHNLZXlzID0gZ2V0Q29sdW1uc0tleShmbGF0dGVuQ29sdW1ucyk7XG4gIHZhciBwdXJlQ29sV2lkdGhzID0gY29sc0tleXMubWFwKGZ1bmN0aW9uIChjb2x1bW5LZXkpIHtcbiAgICByZXR1cm4gY29sc1dpZHRocy5nZXQoY29sdW1uS2V5KTtcbiAgfSk7XG4gIHZhciBjb2xXaWR0aHMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcHVyZUNvbFdpZHRocztcbiAgfSwgW3B1cmVDb2xXaWR0aHMuam9pbignXycpXSk7XG4gIHZhciBzdGlja3lPZmZzZXRzID0gdXNlU3RpY2t5T2Zmc2V0cyhjb2xXaWR0aHMsIGZsYXR0ZW5Db2x1bW5zLmxlbmd0aCwgZGlyZWN0aW9uKTtcbiAgdmFyIGZpeEhlYWRlciA9IHNjcm9sbCAmJiB2YWxpZGF0ZVZhbHVlKHNjcm9sbC55KTtcbiAgdmFyIGhvcml6b25TY3JvbGwgPSBzY3JvbGwgJiYgdmFsaWRhdGVWYWx1ZShzY3JvbGwueCkgfHwgQm9vbGVhbihleHBhbmRhYmxlQ29uZmlnLmZpeGVkKTtcbiAgdmFyIGZpeENvbHVtbiA9IGhvcml6b25TY3JvbGwgJiYgZmxhdHRlbkNvbHVtbnMuc29tZShmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICB2YXIgZml4ZWQgPSBfcmVmMi5maXhlZDtcbiAgICByZXR1cm4gZml4ZWQ7XG4gIH0pOyAvLyBTdGlja3lcblxuICB2YXIgc3RpY2t5UmVmID0gUmVhY3QudXNlUmVmKCk7XG5cbiAgdmFyIF91c2VTdGlja3kgPSB1c2VTdGlja3koc3RpY2t5LCBwcmVmaXhDbHMpLFxuICAgICAgaXNTdGlja3kgPSBfdXNlU3RpY2t5LmlzU3RpY2t5LFxuICAgICAgb2Zmc2V0SGVhZGVyID0gX3VzZVN0aWNreS5vZmZzZXRIZWFkZXIsXG4gICAgICBvZmZzZXRTdW1tYXJ5ID0gX3VzZVN0aWNreS5vZmZzZXRTdW1tYXJ5LFxuICAgICAgb2Zmc2V0U2Nyb2xsID0gX3VzZVN0aWNreS5vZmZzZXRTY3JvbGwsXG4gICAgICBzdGlja3lDbGFzc05hbWUgPSBfdXNlU3RpY2t5LnN0aWNreUNsYXNzTmFtZSxcbiAgICAgIGNvbnRhaW5lciA9IF91c2VTdGlja3kuY29udGFpbmVyOyAvLyBGb290ZXIgKEZpeCBmb290ZXIgbXVzdCBmaXhlZCBoZWFkZXIpXG5cblxuICB2YXIgc3VtbWFyeU5vZGUgPSBzdW1tYXJ5ID09PSBudWxsIHx8IHN1bW1hcnkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN1bW1hcnkobWVyZ2VkRGF0YSk7XG4gIHZhciBmaXhGb290ZXIgPSAoZml4SGVhZGVyIHx8IGlzU3RpY2t5KSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoc3VtbWFyeU5vZGUpICYmIHN1bW1hcnlOb2RlLnR5cGUgPT09IFN1bW1hcnkgJiYgc3VtbWFyeU5vZGUucHJvcHMuZml4ZWQ7IC8vIFNjcm9sbFxuXG4gIHZhciBzY3JvbGxYU3R5bGU7XG4gIHZhciBzY3JvbGxZU3R5bGU7XG4gIHZhciBzY3JvbGxUYWJsZVN0eWxlO1xuXG4gIGlmIChmaXhIZWFkZXIpIHtcbiAgICBzY3JvbGxZU3R5bGUgPSB7XG4gICAgICBvdmVyZmxvd1k6ICdzY3JvbGwnLFxuICAgICAgbWF4SGVpZ2h0OiBzY3JvbGwueVxuICAgIH07XG4gIH1cblxuICBpZiAoaG9yaXpvblNjcm9sbCkge1xuICAgIHNjcm9sbFhTdHlsZSA9IHtcbiAgICAgIG92ZXJmbG93WDogJ2F1dG8nXG4gICAgfTsgLy8gV2hlbiBubyB2ZXJ0aWNhbCBzY3JvbGxiYXIsIHNob3VsZCBoaWRlIGl0XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9wdWxsLzIwNzA1XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMjE4NzlcblxuICAgIGlmICghZml4SGVhZGVyKSB7XG4gICAgICBzY3JvbGxZU3R5bGUgPSB7XG4gICAgICAgIG92ZXJmbG93WTogJ2hpZGRlbidcbiAgICAgIH07XG4gICAgfVxuXG4gICAgc2Nyb2xsVGFibGVTdHlsZSA9IHtcbiAgICAgIHdpZHRoOiAoc2Nyb2xsID09PSBudWxsIHx8IHNjcm9sbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2Nyb2xsLngpID09PSB0cnVlID8gJ2F1dG8nIDogc2Nyb2xsID09PSBudWxsIHx8IHNjcm9sbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2Nyb2xsLngsXG4gICAgICBtaW5XaWR0aDogJzEwMCUnXG4gICAgfTtcbiAgfVxuXG4gIHZhciBvbkNvbHVtblJlc2l6ZSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChjb2x1bW5LZXksIHdpZHRoKSB7XG4gICAgaWYgKGlzVmlzaWJsZShmdWxsVGFibGVSZWYuY3VycmVudCkpIHtcbiAgICAgIHVwZGF0ZUNvbHNXaWR0aHMoZnVuY3Rpb24gKHdpZHRocykge1xuICAgICAgICBpZiAod2lkdGhzLmdldChjb2x1bW5LZXkpICE9PSB3aWR0aCkge1xuICAgICAgICAgIHZhciBuZXdXaWR0aHMgPSBuZXcgTWFwKHdpZHRocyk7XG4gICAgICAgICAgbmV3V2lkdGhzLnNldChjb2x1bW5LZXksIHdpZHRoKTtcbiAgICAgICAgICByZXR1cm4gbmV3V2lkdGhzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHdpZHRocztcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgW10pO1xuXG4gIHZhciBfdXNlVGltZW91dExvY2sgPSB1c2VUaW1lb3V0TG9jayhudWxsKSxcbiAgICAgIF91c2VUaW1lb3V0TG9jazIgPSBfc2xpY2VkVG9BcnJheShfdXNlVGltZW91dExvY2ssIDIpLFxuICAgICAgc2V0U2Nyb2xsVGFyZ2V0ID0gX3VzZVRpbWVvdXRMb2NrMlswXSxcbiAgICAgIGdldFNjcm9sbFRhcmdldCA9IF91c2VUaW1lb3V0TG9jazJbMV07XG5cbiAgZnVuY3Rpb24gZm9yY2VTY3JvbGwoc2Nyb2xsTGVmdCwgdGFyZ2V0KSB7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGFyZ2V0KHNjcm9sbExlZnQpO1xuICAgIH0gZWxzZSBpZiAodGFyZ2V0LnNjcm9sbExlZnQgIT09IHNjcm9sbExlZnQpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgdGFyZ2V0LnNjcm9sbExlZnQgPSBzY3JvbGxMZWZ0O1xuICAgIH1cbiAgfVxuXG4gIHZhciBvblNjcm9sbCA9IGZ1bmN0aW9uIG9uU2Nyb2xsKF9yZWYzKSB7XG4gICAgdmFyIGN1cnJlbnRUYXJnZXQgPSBfcmVmMy5jdXJyZW50VGFyZ2V0LFxuICAgICAgICBzY3JvbGxMZWZ0ID0gX3JlZjMuc2Nyb2xsTGVmdDtcbiAgICB2YXIgaXNSVEwgPSBkaXJlY3Rpb24gPT09ICdydGwnO1xuICAgIHZhciBtZXJnZWRTY3JvbGxMZWZ0ID0gdHlwZW9mIHNjcm9sbExlZnQgPT09ICdudW1iZXInID8gc2Nyb2xsTGVmdCA6IGN1cnJlbnRUYXJnZXQuc2Nyb2xsTGVmdDtcbiAgICB2YXIgY29tcGFyZVRhcmdldCA9IGN1cnJlbnRUYXJnZXQgfHwgRU1QVFlfU0NST0xMX1RBUkdFVDtcblxuICAgIGlmICghZ2V0U2Nyb2xsVGFyZ2V0KCkgfHwgZ2V0U2Nyb2xsVGFyZ2V0KCkgPT09IGNvbXBhcmVUYXJnZXQpIHtcbiAgICAgIHZhciBfc3RpY2t5UmVmJGN1cnJlbnQ7XG5cbiAgICAgIHNldFNjcm9sbFRhcmdldChjb21wYXJlVGFyZ2V0KTtcbiAgICAgIGZvcmNlU2Nyb2xsKG1lcmdlZFNjcm9sbExlZnQsIHNjcm9sbEhlYWRlclJlZi5jdXJyZW50KTtcbiAgICAgIGZvcmNlU2Nyb2xsKG1lcmdlZFNjcm9sbExlZnQsIHNjcm9sbEJvZHlSZWYuY3VycmVudCk7XG4gICAgICBmb3JjZVNjcm9sbChtZXJnZWRTY3JvbGxMZWZ0LCBzY3JvbGxTdW1tYXJ5UmVmLmN1cnJlbnQpO1xuICAgICAgZm9yY2VTY3JvbGwobWVyZ2VkU2Nyb2xsTGVmdCwgKF9zdGlja3lSZWYkY3VycmVudCA9IHN0aWNreVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfc3RpY2t5UmVmJGN1cnJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9zdGlja3lSZWYkY3VycmVudC5zZXRTY3JvbGxMZWZ0KTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFRhcmdldCkge1xuICAgICAgdmFyIHNjcm9sbFdpZHRoID0gY3VycmVudFRhcmdldC5zY3JvbGxXaWR0aCxcbiAgICAgICAgICBjbGllbnRXaWR0aCA9IGN1cnJlbnRUYXJnZXQuY2xpZW50V2lkdGg7IC8vIFRoZXJlIGlzIG5vIHNwYWNlIHRvIHNjcm9sbFxuXG4gICAgICBpZiAoc2Nyb2xsV2lkdGggPT09IGNsaWVudFdpZHRoKSB7XG4gICAgICAgIHNldFBpbmdlZExlZnQoZmFsc2UpO1xuICAgICAgICBzZXRQaW5nZWRSaWdodChmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzUlRMKSB7XG4gICAgICAgIHNldFBpbmdlZExlZnQoLW1lcmdlZFNjcm9sbExlZnQgPCBzY3JvbGxXaWR0aCAtIGNsaWVudFdpZHRoKTtcbiAgICAgICAgc2V0UGluZ2VkUmlnaHQoLW1lcmdlZFNjcm9sbExlZnQgPiAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFBpbmdlZExlZnQobWVyZ2VkU2Nyb2xsTGVmdCA+IDApO1xuICAgICAgICBzZXRQaW5nZWRSaWdodChtZXJnZWRTY3JvbGxMZWZ0IDwgc2Nyb2xsV2lkdGggLSBjbGllbnRXaWR0aCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHZhciB0cmlnZ2VyT25TY3JvbGwgPSBmdW5jdGlvbiB0cmlnZ2VyT25TY3JvbGwoKSB7XG4gICAgaWYgKGhvcml6b25TY3JvbGwgJiYgc2Nyb2xsQm9keVJlZi5jdXJyZW50KSB7XG4gICAgICBvblNjcm9sbCh7XG4gICAgICAgIGN1cnJlbnRUYXJnZXQ6IHNjcm9sbEJvZHlSZWYuY3VycmVudFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFBpbmdlZExlZnQoZmFsc2UpO1xuICAgICAgc2V0UGluZ2VkUmlnaHQoZmFsc2UpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgb25GdWxsVGFibGVSZXNpemUgPSBmdW5jdGlvbiBvbkZ1bGxUYWJsZVJlc2l6ZShfcmVmNCkge1xuICAgIHZhciB3aWR0aCA9IF9yZWY0LndpZHRoO1xuXG4gICAgaWYgKHdpZHRoICE9PSBjb21wb25lbnRXaWR0aCkge1xuICAgICAgdHJpZ2dlck9uU2Nyb2xsKCk7XG4gICAgICBzZXRDb21wb25lbnRXaWR0aChmdWxsVGFibGVSZWYuY3VycmVudCA/IGZ1bGxUYWJsZVJlZi5jdXJyZW50Lm9mZnNldFdpZHRoIDogd2lkdGgpO1xuICAgIH1cbiAgfTsgLy8gU3luYyBzY3JvbGwgYmFyIHdoZW4gaW5pdCBvciBgaG9yaXpvblNjcm9sbGAsIGBkYXRhYCBhbmQgYGNvbHVtbnMubGVuZ3RoYCBjaGFuZ2VkXG5cblxuICB2YXIgbW91bnRlZCA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgLy8gb25GdWxsVGFibGVSZXNpemUgd2lsbCBiZSB0cmlnZ2VyIG9uY2Ugd2hlbiBSZXNpemVPYnNlcnZlciBpcyBtb3VudGVkXG4gICAgLy8gVGhpcyB3aWxsIHJlZHVjZSBvbmUgZHVwbGljYXRlZCB0cmlnZ2VyT25TY3JvbGwgdGltZVxuICAgIGlmIChtb3VudGVkLmN1cnJlbnQpIHtcbiAgICAgIHRyaWdnZXJPblNjcm9sbCgpO1xuICAgIH1cbiAgfSwgW2hvcml6b25TY3JvbGwsIGRhdGEsIGNvbHVtbnMubGVuZ3RoXSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgbW91bnRlZC5jdXJyZW50ID0gdHJ1ZTtcbiAgfSwgW10pOyAvLyA9PT09PT09PT09PT09PT09PT09PT0gRWZmZWN0cyA9PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTkgPSBSZWFjdC51c2VTdGF0ZSgwKSxcbiAgICAgIF9SZWFjdCR1c2VTdGF0ZTEwID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlOSwgMiksXG4gICAgICBzY3JvbGxiYXJTaXplID0gX1JlYWN0JHVzZVN0YXRlMTBbMF0sXG4gICAgICBzZXRTY3JvbGxiYXJTaXplID0gX1JlYWN0JHVzZVN0YXRlMTBbMV07XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTExID0gUmVhY3QudXNlU3RhdGUodHJ1ZSksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUxMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTExLCAyKSxcbiAgICAgIHN1cHBvcnRTdGlja3kgPSBfUmVhY3QkdXNlU3RhdGUxMlswXSxcbiAgICAgIHNldFN1cHBvcnRTdGlja3kgPSBfUmVhY3QkdXNlU3RhdGUxMlsxXTsgLy8gT25seSBJRSBub3Qgc3VwcG9ydCwgd2UgbWFyayBhcyBzdXBwb3J0IGZpcnN0XG5cblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChzY3JvbGxCb2R5UmVmLmN1cnJlbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICBzZXRTY3JvbGxiYXJTaXplKGdldFRhcmdldFNjcm9sbEJhclNpemUoc2Nyb2xsQm9keVJlZi5jdXJyZW50KS53aWR0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFNjcm9sbGJhclNpemUoZ2V0VGFyZ2V0U2Nyb2xsQmFyU2l6ZShzY3JvbGxCb2R5Q29udGFpbmVyUmVmLmN1cnJlbnQpLndpZHRoKTtcbiAgICB9XG5cbiAgICBzZXRTdXBwb3J0U3RpY2t5KGlzU3R5bGVTdXBwb3J0KCdwb3NpdGlvbicsICdzdGlja3knKSk7XG4gIH0sIFtdKTsgLy8gPT09PT09PT09PT09PT09PT09IElOVEVSTkFMIEhPT0tTID09PT09PT09PT09PT09PT09PVxuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGludGVybmFsSG9va3MgPT09IElOVEVSTkFMX0hPT0tTICYmIGludGVybmFsUmVmcykge1xuICAgICAgaW50ZXJuYWxSZWZzLmJvZHkuY3VycmVudCA9IHNjcm9sbEJvZHlSZWYuY3VycmVudDtcbiAgICB9XG4gIH0pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIFRhYmxlQ29tcG9uZW50ID0gZ2V0Q29tcG9uZW50KFsndGFibGUnXSwgJ3RhYmxlJyk7IC8vIFRhYmxlIGxheW91dFxuXG4gIHZhciBtZXJnZWRUYWJsZUxheW91dCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmICh0YWJsZUxheW91dCkge1xuICAgICAgcmV0dXJuIHRhYmxlTGF5b3V0O1xuICAgIH0gLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMjUyMjdcbiAgICAvLyBXaGVuIHNjcm9sbC54IGlzIG1heC1jb250ZW50LCBubyBuZWVkIHRvIGZpeCB0YWJsZSBsYXlvdXRcbiAgICAvLyBpdCdzIHdpZHRoIHNob3VsZCBzdHJldGNoIG91dCB0byBmaXQgY29udGVudFxuXG5cbiAgICBpZiAoZml4Q29sdW1uKSB7XG4gICAgICByZXR1cm4gKHNjcm9sbCA9PT0gbnVsbCB8fCBzY3JvbGwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNjcm9sbC54KSA9PT0gJ21heC1jb250ZW50JyA/ICdhdXRvJyA6ICdmaXhlZCc7XG4gICAgfVxuXG4gICAgaWYgKGZpeEhlYWRlciB8fCBpc1N0aWNreSB8fCBmbGF0dGVuQ29sdW1ucy5zb21lKGZ1bmN0aW9uIChfcmVmNSkge1xuICAgICAgdmFyIGVsbGlwc2lzID0gX3JlZjUuZWxsaXBzaXM7XG4gICAgICByZXR1cm4gZWxsaXBzaXM7XG4gICAgfSkpIHtcbiAgICAgIHJldHVybiAnZml4ZWQnO1xuICAgIH1cblxuICAgIHJldHVybiAnYXV0byc7XG4gIH0sIFtmaXhIZWFkZXIsIGZpeENvbHVtbiwgZmxhdHRlbkNvbHVtbnMsIHRhYmxlTGF5b3V0LCBpc1N0aWNreV0pO1xuICB2YXIgZ3JvdXBUYWJsZU5vZGU7IC8vIEhlYWRlciBwcm9wc1xuXG4gIHZhciBoZWFkZXJQcm9wcyA9IHtcbiAgICBjb2xXaWR0aHM6IGNvbFdpZHRocyxcbiAgICBjb2x1bUNvdW50OiBmbGF0dGVuQ29sdW1ucy5sZW5ndGgsXG4gICAgc3RpY2t5T2Zmc2V0czogc3RpY2t5T2Zmc2V0cyxcbiAgICBvbkhlYWRlclJvdzogb25IZWFkZXJSb3csXG4gICAgZml4SGVhZGVyOiBmaXhIZWFkZXIsXG4gICAgc2Nyb2xsOiBzY3JvbGxcbiAgfTsgLy8gRW1wdHlcblxuICB2YXIgZW1wdHlOb2RlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGhhc0RhdGEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZW1wdHlUZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gZW1wdHlUZXh0KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVtcHR5VGV4dDtcbiAgfSwgW2hhc0RhdGEsIGVtcHR5VGV4dF0pOyAvLyBCb2R5XG5cbiAgdmFyIGJvZHlUYWJsZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEJvZHksIHtcbiAgICBkYXRhOiBtZXJnZWREYXRhLFxuICAgIG1lYXN1cmVDb2x1bW5XaWR0aDogZml4SGVhZGVyIHx8IGhvcml6b25TY3JvbGwgfHwgaXNTdGlja3ksXG4gICAgZXhwYW5kZWRLZXlzOiBtZXJnZWRFeHBhbmRlZEtleXMsXG4gICAgcm93RXhwYW5kYWJsZTogcm93RXhwYW5kYWJsZSxcbiAgICBnZXRSb3dLZXk6IGdldFJvd0tleSxcbiAgICBvblJvdzogb25Sb3csXG4gICAgZW1wdHlOb2RlOiBlbXB0eU5vZGUsXG4gICAgY2hpbGRyZW5Db2x1bW5OYW1lOiBtZXJnZWRDaGlsZHJlbkNvbHVtbk5hbWVcbiAgfSk7XG4gIHZhciBib2R5Q29sR3JvdXAgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb2xHcm91cCwge1xuICAgIGNvbFdpZHRoczogZmxhdHRlbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChfcmVmNikge1xuICAgICAgdmFyIHdpZHRoID0gX3JlZjYud2lkdGg7XG4gICAgICByZXR1cm4gd2lkdGg7XG4gICAgfSksXG4gICAgY29sdW1uczogZmxhdHRlbkNvbHVtbnNcbiAgfSk7XG4gIHZhciBjdXN0b21pemVTY3JvbGxCb2R5ID0gZ2V0Q29tcG9uZW50KFsnYm9keSddKTtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB0eXBlb2YgY3VzdG9taXplU2Nyb2xsQm9keSA9PT0gJ2Z1bmN0aW9uJyAmJiBoYXNEYXRhICYmICFmaXhIZWFkZXIpIHtcbiAgICB3YXJuaW5nKGZhbHNlLCAnYGNvbXBvbmVudHMuYm9keWAgd2l0aCByZW5kZXIgcHJvcHMgaXMgb25seSB3b3JrIG9uIGBzY3JvbGwueWAuJyk7XG4gIH1cblxuICBpZiAoZml4SGVhZGVyIHx8IGlzU3RpY2t5KSB7XG4gICAgLy8gPj4+Pj4+IEZpeGVkIEhlYWRlclxuICAgIHZhciBib2R5Q29udGVudDtcblxuICAgIGlmICh0eXBlb2YgY3VzdG9taXplU2Nyb2xsQm9keSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYm9keUNvbnRlbnQgPSBjdXN0b21pemVTY3JvbGxCb2R5KG1lcmdlZERhdGEsIHtcbiAgICAgICAgc2Nyb2xsYmFyU2l6ZTogc2Nyb2xsYmFyU2l6ZSxcbiAgICAgICAgcmVmOiBzY3JvbGxCb2R5UmVmLFxuICAgICAgICBvblNjcm9sbDogb25TY3JvbGxcbiAgICAgIH0pO1xuICAgICAgaGVhZGVyUHJvcHMuY29sV2lkdGhzID0gZmxhdHRlbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChfcmVmNywgaW5kZXgpIHtcbiAgICAgICAgdmFyIHdpZHRoID0gX3JlZjcud2lkdGg7XG4gICAgICAgIHZhciBjb2xXaWR0aCA9IGluZGV4ID09PSBjb2x1bW5zLmxlbmd0aCAtIDEgPyB3aWR0aCAtIHNjcm9sbGJhclNpemUgOiB3aWR0aDtcblxuICAgICAgICBpZiAodHlwZW9mIGNvbFdpZHRoID09PSAnbnVtYmVyJyAmJiAhTnVtYmVyLmlzTmFOKGNvbFdpZHRoKSkge1xuICAgICAgICAgIHJldHVybiBjb2xXaWR0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIHdhcm5pbmcoZmFsc2UsICdXaGVuIHVzZSBgY29tcG9uZW50cy5ib2R5YCB3aXRoIHJlbmRlciBwcm9wcy4gRWFjaCBjb2x1bW4gc2hvdWxkIGhhdmUgYSBmaXhlZCBgd2lkdGhgIHZhbHVlLicpO1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBib2R5Q29udGVudCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2Nyb2xsWFN0eWxlKSwgc2Nyb2xsWVN0eWxlKSxcbiAgICAgICAgb25TY3JvbGw6IG9uU2Nyb2xsLFxuICAgICAgICByZWY6IHNjcm9sbEJvZHlSZWYsXG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWJvZHlcIikpXG4gICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUYWJsZUNvbXBvbmVudCwge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzY3JvbGxUYWJsZVN0eWxlKSwge30sIHtcbiAgICAgICAgICB0YWJsZUxheW91dDogbWVyZ2VkVGFibGVMYXlvdXRcbiAgICAgICAgfSlcbiAgICAgIH0sIGJvZHlDb2xHcm91cCwgYm9keVRhYmxlLCAhZml4Rm9vdGVyICYmIHN1bW1hcnlOb2RlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZvb3Rlciwge1xuICAgICAgICBzdGlja3lPZmZzZXRzOiBzdGlja3lPZmZzZXRzLFxuICAgICAgICBmbGF0dGVuQ29sdW1uczogZmxhdHRlbkNvbHVtbnNcbiAgICAgIH0sIHN1bW1hcnlOb2RlKSkpO1xuICAgIH0gLy8gRml4ZWQgaG9sZGVyIHNoYXJlIHRoZSBwcm9wc1xuXG5cbiAgICB2YXIgZml4ZWRIb2xkZXJQcm9wcyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHtcbiAgICAgIG5vRGF0YTogIW1lcmdlZERhdGEubGVuZ3RoLFxuICAgICAgbWF4Q29udGVudFNjcm9sbDogaG9yaXpvblNjcm9sbCAmJiBzY3JvbGwueCA9PT0gJ21heC1jb250ZW50J1xuICAgIH0sIGhlYWRlclByb3BzKSwgY29sdW1uQ29udGV4dCksIHt9LCB7XG4gICAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICAgIHN0aWNreUNsYXNzTmFtZTogc3RpY2t5Q2xhc3NOYW1lLFxuICAgICAgb25TY3JvbGw6IG9uU2Nyb2xsXG4gICAgfSk7XG5cbiAgICBncm91cFRhYmxlTm9kZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBzaG93SGVhZGVyICE9PSBmYWxzZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGaXhlZEhvbGRlciwgX2V4dGVuZHMoe30sIGZpeGVkSG9sZGVyUHJvcHMsIHtcbiAgICAgIHN0aWNreVRvcE9mZnNldDogb2Zmc2V0SGVhZGVyLFxuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhlYWRlclwiKSxcbiAgICAgIHJlZjogc2Nyb2xsSGVhZGVyUmVmXG4gICAgfSksIGZ1bmN0aW9uIChmaXhlZEhvbGRlclBhc3NQcm9wcykge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChIZWFkZXIsIGZpeGVkSG9sZGVyUGFzc1Byb3BzKSwgZml4Rm9vdGVyID09PSAndG9wJyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGb290ZXIsIGZpeGVkSG9sZGVyUGFzc1Byb3BzLCBzdW1tYXJ5Tm9kZSkpO1xuICAgIH0pLCBib2R5Q29udGVudCwgZml4Rm9vdGVyICYmIGZpeEZvb3RlciAhPT0gJ3RvcCcgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRml4ZWRIb2xkZXIsIF9leHRlbmRzKHt9LCBmaXhlZEhvbGRlclByb3BzLCB7XG4gICAgICBzdGlja3lCb3R0b21PZmZzZXQ6IG9mZnNldFN1bW1hcnksXG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3VtbWFyeVwiKSxcbiAgICAgIHJlZjogc2Nyb2xsU3VtbWFyeVJlZlxuICAgIH0pLCBmdW5jdGlvbiAoZml4ZWRIb2xkZXJQYXNzUHJvcHMpIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGb290ZXIsIGZpeGVkSG9sZGVyUGFzc1Byb3BzLCBzdW1tYXJ5Tm9kZSk7XG4gICAgfSksIGlzU3RpY2t5ICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFN0aWNreVNjcm9sbEJhciwge1xuICAgICAgcmVmOiBzdGlja3lSZWYsXG4gICAgICBvZmZzZXRTY3JvbGw6IG9mZnNldFNjcm9sbCxcbiAgICAgIHNjcm9sbEJvZHlSZWY6IHNjcm9sbEJvZHlSZWYsXG4gICAgICBvblNjcm9sbDogb25TY3JvbGwsXG4gICAgICBjb250YWluZXI6IGNvbnRhaW5lclxuICAgIH0pKTtcbiAgfSBlbHNlIHtcbiAgICAvLyA+Pj4+Pj4gVW5pcXVlIHRhYmxlXG4gICAgZ3JvdXBUYWJsZU5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzY3JvbGxYU3R5bGUpLCBzY3JvbGxZU3R5bGUpLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29udGVudFwiKSksXG4gICAgICBvblNjcm9sbDogb25TY3JvbGwsXG4gICAgICByZWY6IHNjcm9sbEJvZHlSZWZcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUYWJsZUNvbXBvbmVudCwge1xuICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2Nyb2xsVGFibGVTdHlsZSksIHt9LCB7XG4gICAgICAgIHRhYmxlTGF5b3V0OiBtZXJnZWRUYWJsZUxheW91dFxuICAgICAgfSlcbiAgICB9LCBib2R5Q29sR3JvdXAsIHNob3dIZWFkZXIgIT09IGZhbHNlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEhlYWRlciwgX2V4dGVuZHMoe30sIGhlYWRlclByb3BzLCBjb2x1bW5Db250ZXh0KSksIGJvZHlUYWJsZSwgc3VtbWFyeU5vZGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRm9vdGVyLCB7XG4gICAgICBzdGlja3lPZmZzZXRzOiBzdGlja3lPZmZzZXRzLFxuICAgICAgZmxhdHRlbkNvbHVtbnM6IGZsYXR0ZW5Db2x1bW5zXG4gICAgfSwgc3VtbWFyeU5vZGUpKSk7XG4gIH1cblxuICB2YXIgYXJpYVByb3BzID0gcGlja0F0dHJzKHByb3BzLCB7XG4gICAgYXJpYTogdHJ1ZSxcbiAgICBkYXRhOiB0cnVlXG4gIH0pO1xuICB2YXIgZnVsbFRhYmxlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhwcmVmaXhDbHMsIGNsYXNzTmFtZSwgKF9jbGFzc05hbWVzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGluZy1sZWZ0XCIpLCBwaW5nZWRMZWZ0KSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXBpbmctcmlnaHRcIiksIHBpbmdlZFJpZ2h0KSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxheW91dC1maXhlZFwiKSwgdGFibGVMYXlvdXQgPT09ICdmaXhlZCcpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZml4ZWQtaGVhZGVyXCIpLCBmaXhIZWFkZXIpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZml4ZWQtY29sdW1uXCIpLCBmaXhDb2x1bW4pLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2Nyb2xsLWhvcml6b250YWxcIiksIGhvcml6b25TY3JvbGwpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaGFzLWZpeC1sZWZ0XCIpLCBmbGF0dGVuQ29sdW1uc1swXSAmJiBmbGF0dGVuQ29sdW1uc1swXS5maXhlZCksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1oYXMtZml4LXJpZ2h0XCIpLCBmbGF0dGVuQ29sdW1uc1tmbGF0dGVuQ29sdW1ucy5sZW5ndGggLSAxXSAmJiBmbGF0dGVuQ29sdW1uc1tmbGF0dGVuQ29sdW1ucy5sZW5ndGggLSAxXS5maXhlZCA9PT0gJ3JpZ2h0JyksIF9jbGFzc05hbWVzKSksXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIGlkOiBpZCxcbiAgICByZWY6IGZ1bGxUYWJsZVJlZlxuICB9LCBhcmlhUHJvcHMpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNZW1vVGFibGVDb250ZW50LCB7XG4gICAgcGluZ0xlZnQ6IHBpbmdlZExlZnQsXG4gICAgcGluZ1JpZ2h0OiBwaW5nZWRSaWdodCxcbiAgICBwcm9wczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgICBzdGlja3lPZmZzZXRzOiBzdGlja3lPZmZzZXRzLFxuICAgICAgbWVyZ2VkRXhwYW5kZWRLZXlzOiBtZXJnZWRFeHBhbmRlZEtleXNcbiAgICB9KVxuICB9LCB0aXRsZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQYW5lbCwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10aXRsZVwiKVxuICB9LCB0aXRsZShtZXJnZWREYXRhKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICByZWY6IHNjcm9sbEJvZHlDb250YWluZXJSZWYsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbnRhaW5lclwiKVxuICB9LCBncm91cFRhYmxlTm9kZSksIGZvb3RlciAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQYW5lbCwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1mb290ZXJcIilcbiAgfSwgZm9vdGVyKG1lcmdlZERhdGEpKSkpO1xuXG4gIGlmIChob3Jpem9uU2Nyb2xsKSB7XG4gICAgZnVsbFRhYmxlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVzaXplT2JzZXJ2ZXIsIHtcbiAgICAgIG9uUmVzaXplOiBvbkZ1bGxUYWJsZVJlc2l6ZVxuICAgIH0sIGZ1bGxUYWJsZSk7XG4gIH1cblxuICB2YXIgVGFibGVDb250ZXh0VmFsdWUgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICBnZXRDb21wb25lbnQ6IGdldENvbXBvbmVudCxcbiAgICAgIHNjcm9sbGJhclNpemU6IHNjcm9sbGJhclNpemUsXG4gICAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICAgIGZpeGVkSW5mb0xpc3Q6IGZsYXR0ZW5Db2x1bW5zLm1hcChmdW5jdGlvbiAoXywgY29sSW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGdldENlbGxGaXhlZEluZm8oY29sSW5kZXgsIGNvbEluZGV4LCBmbGF0dGVuQ29sdW1ucywgc3RpY2t5T2Zmc2V0cywgZGlyZWN0aW9uKTtcbiAgICAgIH0pLFxuICAgICAgaXNTdGlja3k6IGlzU3RpY2t5XG4gICAgfTtcbiAgfSwgW3ByZWZpeENscywgZ2V0Q29tcG9uZW50LCBzY3JvbGxiYXJTaXplLCBkaXJlY3Rpb24sIGZsYXR0ZW5Db2x1bW5zLCBzdGlja3lPZmZzZXRzLCBpc1N0aWNreV0pO1xuICB2YXIgQm9keUNvbnRleHRWYWx1ZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGNvbHVtbkNvbnRleHQpLCB7fSwge1xuICAgICAgdGFibGVMYXlvdXQ6IG1lcmdlZFRhYmxlTGF5b3V0LFxuICAgICAgcm93Q2xhc3NOYW1lOiByb3dDbGFzc05hbWUsXG4gICAgICBleHBhbmRlZFJvd0NsYXNzTmFtZTogZXhwYW5kZWRSb3dDbGFzc05hbWUsXG4gICAgICBleHBhbmRJY29uOiBtZXJnZWRFeHBhbmRJY29uLFxuICAgICAgZXhwYW5kYWJsZVR5cGU6IGV4cGFuZGFibGVUeXBlLFxuICAgICAgZXhwYW5kUm93QnlDbGljazogZXhwYW5kUm93QnlDbGljayxcbiAgICAgIGV4cGFuZGVkUm93UmVuZGVyOiBleHBhbmRlZFJvd1JlbmRlcixcbiAgICAgIG9uVHJpZ2dlckV4cGFuZDogb25UcmlnZ2VyRXhwYW5kLFxuICAgICAgZXhwYW5kSWNvbkNvbHVtbkluZGV4OiBleHBhbmRJY29uQ29sdW1uSW5kZXgsXG4gICAgICBpbmRlbnRTaXplOiBpbmRlbnRTaXplLFxuICAgICAgYWxsQ29sdW1uc0ZpeGVkTGVmdDogY29sdW1uQ29udGV4dC5mbGF0dGVuQ29sdW1ucy5ldmVyeShmdW5jdGlvbiAoY29sKSB7XG4gICAgICAgIHJldHVybiBjb2wuZml4ZWQgPT09ICdsZWZ0JztcbiAgICAgIH0pXG4gICAgfSk7XG4gIH0sIFtjb2x1bW5Db250ZXh0LCBtZXJnZWRUYWJsZUxheW91dCwgcm93Q2xhc3NOYW1lLCBleHBhbmRlZFJvd0NsYXNzTmFtZSwgbWVyZ2VkRXhwYW5kSWNvbiwgZXhwYW5kYWJsZVR5cGUsIGV4cGFuZFJvd0J5Q2xpY2ssIGV4cGFuZGVkUm93UmVuZGVyLCBvblRyaWdnZXJFeHBhbmQsIGV4cGFuZEljb25Db2x1bW5JbmRleCwgaW5kZW50U2l6ZV0pO1xuICB2YXIgRXhwYW5kZWRSb3dDb250ZXh0VmFsdWUgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29tcG9uZW50V2lkdGg6IGNvbXBvbmVudFdpZHRoLFxuICAgICAgZml4SGVhZGVyOiBmaXhIZWFkZXIsXG4gICAgICBmaXhDb2x1bW46IGZpeENvbHVtbixcbiAgICAgIGhvcml6b25TY3JvbGw6IGhvcml6b25TY3JvbGxcbiAgICB9O1xuICB9LCBbY29tcG9uZW50V2lkdGgsIGZpeEhlYWRlciwgZml4Q29sdW1uLCBob3Jpem9uU2Nyb2xsXSk7XG4gIHZhciBSZXNpemVDb250ZXh0VmFsdWUgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgb25Db2x1bW5SZXNpemU6IG9uQ29sdW1uUmVzaXplXG4gICAgfTtcbiAgfSwgW29uQ29sdW1uUmVzaXplXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTdGlja3lDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IHN1cHBvcnRTdGlja3lcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVGFibGVDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IFRhYmxlQ29udGV4dFZhbHVlXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEJvZHlDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IEJvZHlDb250ZXh0VmFsdWVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRXhwYW5kZWRSb3dDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IEV4cGFuZGVkUm93Q29udGV4dFZhbHVlXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlc2l6ZUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogUmVzaXplQ29udGV4dFZhbHVlXG4gIH0sIGZ1bGxUYWJsZSkpKSkpO1xufVxuXG5UYWJsZS5FWFBBTkRfQ09MVU1OID0gRVhQQU5EX0NPTFVNTjtcblRhYmxlLkNvbHVtbiA9IENvbHVtbjtcblRhYmxlLkNvbHVtbkdyb3VwID0gQ29sdW1uR3JvdXA7XG5UYWJsZS5TdW1tYXJ5ID0gRm9vdGVyQ29tcG9uZW50cztcblRhYmxlLmRlZmF1bHRQcm9wcyA9IHtcbiAgcm93S2V5OiAna2V5JyxcbiAgcHJlZml4Q2xzOiAncmMtdGFibGUnLFxuICBlbXB0eVRleHQ6IGZ1bmN0aW9uIGVtcHR5VGV4dCgpIHtcbiAgICByZXR1cm4gJ05vIERhdGEnO1xuICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgVGFibGU7IiwiLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbi8qKiBUaGlzIGlzIGEgc3ludGFjdGljIHN1Z2FyIGZvciBgY29sdW1uc2AgcHJvcC4gU28gSE9DIHdpbGwgbm90IHdvcmsgb24gdGhpcy4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuZnVuY3Rpb24gQ29sdW1uKF8pIHtcbiAgcmV0dXJuIG51bGw7XG59XG5leHBvcnQgZGVmYXVsdCBDb2x1bW47IiwiLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbi8qKiBUaGlzIGlzIGEgc3ludGFjdGljIHN1Z2FyIGZvciBgY29sdW1uc2AgcHJvcC4gU28gSE9DIHdpbGwgbm90IHdvcmsgb24gdGhpcy4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuZnVuY3Rpb24gQ29sdW1uR3JvdXAoXykge1xuICByZXR1cm4gbnVsbDtcbn1cbmV4cG9ydCBkZWZhdWx0IENvbHVtbkdyb3VwOyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmZ1bmN0aW9uIHJlbmRlckV4cGFuZEljb24obG9jYWxlKSB7XG4gIHJldHVybiBmdW5jdGlvbiBleHBhbmRJY29uKF9yZWYpIHtcbiAgICB2YXIgX2NsYXNzTmFtZXM7XG4gICAgdmFyIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgICAgb25FeHBhbmQgPSBfcmVmLm9uRXhwYW5kLFxuICAgICAgcmVjb3JkID0gX3JlZi5yZWNvcmQsXG4gICAgICBleHBhbmRlZCA9IF9yZWYuZXhwYW5kZWQsXG4gICAgICBleHBhbmRhYmxlID0gX3JlZi5leHBhbmRhYmxlO1xuICAgIHZhciBpY29uUHJlZml4ID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1yb3ctZXhwYW5kLWljb25cIik7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgICAgb25FeHBhbmQocmVjb3JkLCBlKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH0sXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoaWNvblByZWZpeCwgKF9jbGFzc05hbWVzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQoaWNvblByZWZpeCwgXCItc3BhY2VkXCIpLCAhZXhwYW5kYWJsZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQoaWNvblByZWZpeCwgXCItZXhwYW5kZWRcIiksIGV4cGFuZGFibGUgJiYgZXhwYW5kZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KGljb25QcmVmaXgsIFwiLWNvbGxhcHNlZFwiKSwgZXhwYW5kYWJsZSAmJiAhZXhwYW5kZWQpLCBfY2xhc3NOYW1lcykpLFxuICAgICAgXCJhcmlhLWxhYmVsXCI6IGV4cGFuZGVkID8gbG9jYWxlLmNvbGxhcHNlIDogbG9jYWxlLmV4cGFuZCxcbiAgICAgIFwiYXJpYS1leHBhbmRlZFwiOiBleHBhbmRlZFxuICAgIH0pO1xuICB9O1xufVxuZXhwb3J0IGRlZmF1bHQgcmVuZGVyRXhwYW5kSWNvbjsiLCJleHBvcnQgZnVuY3Rpb24gZ2V0Q29sdW1uS2V5KGNvbHVtbiwgZGVmYXVsdEtleSkge1xuICBpZiAoJ2tleScgaW4gY29sdW1uICYmIGNvbHVtbi5rZXkgIT09IHVuZGVmaW5lZCAmJiBjb2x1bW4ua2V5ICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIGNvbHVtbi5rZXk7XG4gIH1cbiAgaWYgKGNvbHVtbi5kYXRhSW5kZXgpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShjb2x1bW4uZGF0YUluZGV4KSA/IGNvbHVtbi5kYXRhSW5kZXguam9pbignLicpIDogY29sdW1uLmRhdGFJbmRleDtcbiAgfVxuICByZXR1cm4gZGVmYXVsdEtleTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb2x1bW5Qb3MoaW5kZXgsIHBvcykge1xuICByZXR1cm4gcG9zID8gXCJcIi5jb25jYXQocG9zLCBcIi1cIikuY29uY2F0KGluZGV4KSA6IFwiXCIuY29uY2F0KGluZGV4KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJDb2x1bW5UaXRsZSh0aXRsZSwgcHJvcHMpIHtcbiAgaWYgKHR5cGVvZiB0aXRsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0aXRsZShwcm9wcyk7XG4gIH1cbiAgcmV0dXJuIHRpdGxlO1xufVxuLyoqXG4gKiBTYWZlIGdldCBjb2x1bW4gdGl0bGVcbiAqXG4gKiBTaG91bGQgZmlsdGVyIFtvYmplY3QgT2JqZWN0XVxuICpcbiAqIEBwYXJhbSB0aXRsZVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhZmVDb2x1bW5UaXRsZSh0aXRsZSwgcHJvcHMpIHtcbiAgdmFyIHJlcyA9IHJlbmRlckNvbHVtblRpdGxlKHRpdGxlLCBwcm9wcyk7XG4gIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocmVzKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHJldHVybiAnJztcbiAgcmV0dXJuIHJlcztcbn0iLCIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBGaWx0ZXJGaWxsZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTM0OSA4MzhjMCAxNy43IDE0LjIgMzIgMzEuOCAzMmgyNjIuNGMxNy42IDAgMzEuOC0xNC4zIDMxLjgtMzJWNjQySDM0OXYxOTZ6bTUzMS4xLTY4NEgxNDMuOWMtMjQuNSAwLTM5LjggMjYuNy0yNy41IDQ4bDIyMS4zIDM3NmgzNDguOGwyMjEuMy0zNzZjMTIuMS0yMS4zLTMuMi00OC0yNy43LTQ4elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiZmlsdGVyXCIsIFwidGhlbWVcIjogXCJmaWxsZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgRmlsdGVyRmlsbGVkO1xuIiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRmlsdGVyRmlsbGVkU3ZnIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0ZpbHRlckZpbGxlZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIEZpbHRlckZpbGxlZCA9IGZ1bmN0aW9uIEZpbHRlckZpbGxlZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogRmlsdGVyRmlsbGVkU3ZnXG4gIH0pKTtcbn07XG5GaWx0ZXJGaWxsZWQuZGlzcGxheU5hbWUgPSAnRmlsdGVyRmlsbGVkJztcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEZpbHRlckZpbGxlZCk7IiwiLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IFtdO1xuICB0aGlzLnNpemUgPSAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZUNsZWFyO1xuIiwiLyoqXG4gKiBQZXJmb3JtcyBhXG4gKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICpcbiAqIF8uZXEob2JqZWN0LCBvYmplY3QpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uZXEob2JqZWN0LCBvdGhlcik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uZXEoJ2EnLCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uZXEoJ2EnLCBPYmplY3QoJ2EnKSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uZXEoTmFOLCBOYU4pO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBlcSh2YWx1ZSwgb3RoZXIpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBvdGhlciB8fCAodmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXE7XG4iLCJ2YXIgZXEgPSByZXF1aXJlKCcuL2VxJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGBrZXlgIGlzIGZvdW5kIGluIGBhcnJheWAgb2Yga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0ga2V5IFRoZSBrZXkgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGFzc29jSW5kZXhPZihhcnJheSwga2V5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIGlmIChlcShhcnJheVtsZW5ndGhdWzBdLCBrZXkpKSB7XG4gICAgICByZXR1cm4gbGVuZ3RoO1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNzb2NJbmRleE9mO1xuIiwidmFyIGFzc29jSW5kZXhPZiA9IHJlcXVpcmUoJy4vX2Fzc29jSW5kZXhPZicpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3BsaWNlID0gYXJyYXlQcm90by5zcGxpY2U7XG5cbi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBsYXN0SW5kZXggPSBkYXRhLmxlbmd0aCAtIDE7XG4gIGlmIChpbmRleCA9PSBsYXN0SW5kZXgpIHtcbiAgICBkYXRhLnBvcCgpO1xuICB9IGVsc2Uge1xuICAgIHNwbGljZS5jYWxsKGRhdGEsIGluZGV4LCAxKTtcbiAgfVxuICAtLXRoaXMuc2l6ZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlRGVsZXRlO1xuIiwidmFyIGFzc29jSW5kZXhPZiA9IHJlcXVpcmUoJy4vX2Fzc29jSW5kZXhPZicpO1xuXG4vKipcbiAqIEdldHMgdGhlIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVHZXQoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgcmV0dXJuIGluZGV4IDwgMCA/IHVuZGVmaW5lZCA6IGRhdGFbaW5kZXhdWzFdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZUdldDtcbiIsInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZUhhcyhrZXkpIHtcbiAgcmV0dXJuIGFzc29jSW5kZXhPZih0aGlzLl9fZGF0YV9fLCBrZXkpID4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlSGFzO1xuIiwidmFyIGFzc29jSW5kZXhPZiA9IHJlcXVpcmUoJy4vX2Fzc29jSW5kZXhPZicpO1xuXG4vKipcbiAqIFNldHMgdGhlIGxpc3QgY2FjaGUgYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGxpc3QgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZVNldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgaWYgKGluZGV4IDwgMCkge1xuICAgICsrdGhpcy5zaXplO1xuICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICB9IGVsc2Uge1xuICAgIGRhdGFbaW5kZXhdWzFdID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlU2V0O1xuIiwidmFyIGxpc3RDYWNoZUNsZWFyID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlQ2xlYXInKSxcbiAgICBsaXN0Q2FjaGVEZWxldGUgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVEZWxldGUnKSxcbiAgICBsaXN0Q2FjaGVHZXQgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVHZXQnKSxcbiAgICBsaXN0Q2FjaGVIYXMgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVIYXMnKSxcbiAgICBsaXN0Q2FjaGVTZXQgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVTZXQnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGxpc3QgY2FjaGUgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBMaXN0Q2FjaGUoZW50cmllcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgTGlzdENhY2hlYC5cbkxpc3RDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBsaXN0Q2FjaGVDbGVhcjtcbkxpc3RDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbGlzdENhY2hlRGVsZXRlO1xuTGlzdENhY2hlLnByb3RvdHlwZS5nZXQgPSBsaXN0Q2FjaGVHZXQ7XG5MaXN0Q2FjaGUucHJvdG90eXBlLmhhcyA9IGxpc3RDYWNoZUhhcztcbkxpc3RDYWNoZS5wcm90b3R5cGUuc2V0ID0gbGlzdENhY2hlU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IExpc3RDYWNoZTtcbiIsInZhciBMaXN0Q2FjaGUgPSByZXF1aXJlKCcuL19MaXN0Q2FjaGUnKTtcblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBzdGFjay5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBTdGFja1xuICovXG5mdW5jdGlvbiBzdGFja0NsZWFyKCkge1xuICB0aGlzLl9fZGF0YV9fID0gbmV3IExpc3RDYWNoZTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja0NsZWFyO1xuIiwiLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgc3RhY2suXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gc3RhY2tEZWxldGUoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIHJlc3VsdCA9IGRhdGFbJ2RlbGV0ZSddKGtleSk7XG5cbiAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrRGVsZXRlO1xuIiwiLyoqXG4gKiBHZXRzIHRoZSBzdGFjayB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gc3RhY2tHZXQoa2V5KSB7XG4gIHJldHVybiB0aGlzLl9fZGF0YV9fLmdldChrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrR2V0O1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYSBzdGFjayB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrSGFzKGtleSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja0hhcztcbiIsInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXN5bmNUYWcgPSAnW29iamVjdCBBc3luY0Z1bmN0aW9uXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICBwcm94eVRhZyA9ICdbb2JqZWN0IFByb3h5XSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0Z1bmN0aW9uKF8pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNGdW5jdGlvbigvYWJjLyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAvLyBpbiBTYWZhcmkgOSB3aGljaCByZXR1cm5zICdvYmplY3QnIGZvciB0eXBlZCBhcnJheXMgYW5kIG90aGVyIGNvbnN0cnVjdG9ycy5cbiAgdmFyIHRhZyA9IGJhc2VHZXRUYWcodmFsdWUpO1xuICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZyB8fCB0YWcgPT0gYXN5bmNUYWcgfHwgdGFnID09IHByb3h5VGFnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRnVuY3Rpb247XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG92ZXJyZWFjaGluZyBjb3JlLWpzIHNoaW1zLiAqL1xudmFyIGNvcmVKc0RhdGEgPSByb290WydfX2NvcmUtanNfc2hhcmVkX18nXTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb3JlSnNEYXRhO1xuIiwidmFyIGNvcmVKc0RhdGEgPSByZXF1aXJlKCcuL19jb3JlSnNEYXRhJyk7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBtZXRob2RzIG1hc3F1ZXJhZGluZyBhcyBuYXRpdmUuICovXG52YXIgbWFza1NyY0tleSA9IChmdW5jdGlvbigpIHtcbiAgdmFyIHVpZCA9IC9bXi5dKyQvLmV4ZWMoY29yZUpzRGF0YSAmJiBjb3JlSnNEYXRhLmtleXMgJiYgY29yZUpzRGF0YS5rZXlzLklFX1BST1RPIHx8ICcnKTtcbiAgcmV0dXJuIHVpZCA/ICgnU3ltYm9sKHNyYylfMS4nICsgdWlkKSA6ICcnO1xufSgpKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBpdHMgc291cmNlIG1hc2tlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGlzIG1hc2tlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc01hc2tlZChmdW5jKSB7XG4gIHJldHVybiAhIW1hc2tTcmNLZXkgJiYgKG1hc2tTcmNLZXkgaW4gZnVuYyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNNYXNrZWQ7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9Tb3VyY2U7XG4iLCJ2YXIgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4vaXNGdW5jdGlvbicpLFxuICAgIGlzTWFza2VkID0gcmVxdWlyZSgnLi9faXNNYXNrZWQnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICB0b1NvdXJjZSA9IHJlcXVpcmUoJy4vX3RvU291cmNlJyk7XG5cbi8qKlxuICogVXNlZCB0byBtYXRjaCBgUmVnRXhwYFxuICogW3N5bnRheCBjaGFyYWN0ZXJzXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wYXR0ZXJucykuXG4gKi9cbnZhciByZVJlZ0V4cENoYXIgPSAvW1xcXFxeJC4qKz8oKVtcXF17fXxdL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBob3N0IGNvbnN0cnVjdG9ycyAoU2FmYXJpKS4gKi9cbnZhciByZUlzSG9zdEN0b3IgPSAvXlxcW29iamVjdCAuKz9Db25zdHJ1Y3RvclxcXSQvO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGlmIGEgbWV0aG9kIGlzIG5hdGl2ZS4gKi9cbnZhciByZUlzTmF0aXZlID0gUmVnRXhwKCdeJyArXG4gIGZ1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5KS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwgJ1xcXFwkJicpXG4gIC5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcXFxcKCl8IGZvciAuKz8oPz1cXFxcXFxdKS9nLCAnJDEuKj8nKSArICckJ1xuKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hdGl2ZWAgd2l0aG91dCBiYWQgc2hpbSBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkgfHwgaXNNYXNrZWQodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBwYXR0ZXJuID0gaXNGdW5jdGlvbih2YWx1ZSkgPyByZUlzTmF0aXZlIDogcmVJc0hvc3RDdG9yO1xuICByZXR1cm4gcGF0dGVybi50ZXN0KHRvU291cmNlKHZhbHVlKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzTmF0aXZlO1xuIiwiLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZ2V0VmFsdWUob2JqZWN0LCBrZXkpIHtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0VmFsdWU7XG4iLCJ2YXIgYmFzZUlzTmF0aXZlID0gcmVxdWlyZSgnLi9fYmFzZUlzTmF0aXZlJyksXG4gICAgZ2V0VmFsdWUgPSByZXF1aXJlKCcuL19nZXRWYWx1ZScpO1xuXG4vKipcbiAqIEdldHMgdGhlIG5hdGl2ZSBmdW5jdGlvbiBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBnZXROYXRpdmUob2JqZWN0LCBrZXkpIHtcbiAgdmFyIHZhbHVlID0gZ2V0VmFsdWUob2JqZWN0LCBrZXkpO1xuICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE5hdGl2ZTtcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgTWFwID0gZ2V0TmF0aXZlKHJvb3QsICdNYXAnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNYXA7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBuYXRpdmVDcmVhdGUgPSBnZXROYXRpdmUoT2JqZWN0LCAnY3JlYXRlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmF0aXZlQ3JlYXRlO1xuIiwidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgSGFzaFxuICovXG5mdW5jdGlvbiBoYXNoQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBuYXRpdmVDcmVhdGUgPyBuYXRpdmVDcmVhdGUobnVsbCkgOiB7fTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoQ2xlYXI7XG4iLCIvKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBoYXNoLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge09iamVjdH0gaGFzaCBUaGUgaGFzaCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpIHtcbiAgdmFyIHJlc3VsdCA9IHRoaXMuaGFzKGtleSkgJiYgZGVsZXRlIHRoaXMuX19kYXRhX19ba2V5XTtcbiAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hEZWxldGU7XG4iLCJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbnZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBHZXRzIHRoZSBoYXNoIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGhhc2hHZXQoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgaWYgKG5hdGl2ZUNyZWF0ZSkge1xuICAgIHZhciByZXN1bHQgPSBkYXRhW2tleV07XG4gICAgcmV0dXJuIHJlc3VsdCA9PT0gSEFTSF9VTkRFRklORUQgPyB1bmRlZmluZWQgOiByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSA/IGRhdGFba2V5XSA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoR2V0O1xuIiwidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGhhc2ggdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc2hIYXMoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgcmV0dXJuIG5hdGl2ZUNyZWF0ZSA/IChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCkgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaEhhcztcbiIsInZhciBuYXRpdmVDcmVhdGUgPSByZXF1aXJlKCcuL19uYXRpdmVDcmVhdGUnKTtcblxuLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKipcbiAqIFNldHMgdGhlIGhhc2ggYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBoYXNoIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBoYXNoU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICB0aGlzLnNpemUgKz0gdGhpcy5oYXMoa2V5KSA/IDAgOiAxO1xuICBkYXRhW2tleV0gPSAobmF0aXZlQ3JlYXRlICYmIHZhbHVlID09PSB1bmRlZmluZWQpID8gSEFTSF9VTkRFRklORUQgOiB2YWx1ZTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaFNldDtcbiIsInZhciBoYXNoQ2xlYXIgPSByZXF1aXJlKCcuL19oYXNoQ2xlYXInKSxcbiAgICBoYXNoRGVsZXRlID0gcmVxdWlyZSgnLi9faGFzaERlbGV0ZScpLFxuICAgIGhhc2hHZXQgPSByZXF1aXJlKCcuL19oYXNoR2V0JyksXG4gICAgaGFzaEhhcyA9IHJlcXVpcmUoJy4vX2hhc2hIYXMnKSxcbiAgICBoYXNoU2V0ID0gcmVxdWlyZSgnLi9faGFzaFNldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBoYXNoIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gSGFzaChlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBIYXNoYC5cbkhhc2gucHJvdG90eXBlLmNsZWFyID0gaGFzaENsZWFyO1xuSGFzaC5wcm90b3R5cGVbJ2RlbGV0ZSddID0gaGFzaERlbGV0ZTtcbkhhc2gucHJvdG90eXBlLmdldCA9IGhhc2hHZXQ7XG5IYXNoLnByb3RvdHlwZS5oYXMgPSBoYXNoSGFzO1xuSGFzaC5wcm90b3R5cGUuc2V0ID0gaGFzaFNldDtcblxubW9kdWxlLmV4cG9ydHMgPSBIYXNoO1xuIiwidmFyIEhhc2ggPSByZXF1aXJlKCcuL19IYXNoJyksXG4gICAgTGlzdENhY2hlID0gcmVxdWlyZSgnLi9fTGlzdENhY2hlJyksXG4gICAgTWFwID0gcmVxdWlyZSgnLi9fTWFwJyk7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbWFwLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlQ2xlYXIoKSB7XG4gIHRoaXMuc2l6ZSA9IDA7XG4gIHRoaXMuX19kYXRhX18gPSB7XG4gICAgJ2hhc2gnOiBuZXcgSGFzaCxcbiAgICAnbWFwJzogbmV3IChNYXAgfHwgTGlzdENhY2hlKSxcbiAgICAnc3RyaW5nJzogbmV3IEhhc2hcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZUNsZWFyO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIHVuaXF1ZSBvYmplY3Qga2V5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICh0eXBlID09ICdzdHJpbmcnIHx8IHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJylcbiAgICA/ICh2YWx1ZSAhPT0gJ19fcHJvdG9fXycpXG4gICAgOiAodmFsdWUgPT09IG51bGwpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzS2V5YWJsZTtcbiIsInZhciBpc0tleWFibGUgPSByZXF1aXJlKCcuL19pc0tleWFibGUnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBkYXRhIGZvciBgbWFwYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG1hcCBUaGUgbWFwIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgcmVmZXJlbmNlIGtleS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXAgZGF0YS5cbiAqL1xuZnVuY3Rpb24gZ2V0TWFwRGF0YShtYXAsIGtleSkge1xuICB2YXIgZGF0YSA9IG1hcC5fX2RhdGFfXztcbiAgcmV0dXJuIGlzS2V5YWJsZShrZXkpXG4gICAgPyBkYXRhW3R5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyAnc3RyaW5nJyA6ICdoYXNoJ11cbiAgICA6IGRhdGEubWFwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE1hcERhdGE7XG4iLCJ2YXIgZ2V0TWFwRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hcERhdGEnKTtcblxuLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbWFwLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlRGVsZXRlKGtleSkge1xuICB2YXIgcmVzdWx0ID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpWydkZWxldGUnXShrZXkpO1xuICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVEZWxldGU7XG4iLCJ2YXIgZ2V0TWFwRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hcERhdGEnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBtYXAgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlR2V0KGtleSkge1xuICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmdldChrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcENhY2hlR2V0O1xuIiwidmFyIGdldE1hcERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXBEYXRhJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgbWFwIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KSB7XG4gIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuaGFzKGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVIYXM7XG4iLCJ2YXIgZ2V0TWFwRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hcERhdGEnKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBtYXAgYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbWFwIGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZVNldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLFxuICAgICAgc2l6ZSA9IGRhdGEuc2l6ZTtcblxuICBkYXRhLnNldChrZXksIHZhbHVlKTtcbiAgdGhpcy5zaXplICs9IGRhdGEuc2l6ZSA9PSBzaXplID8gMCA6IDE7XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcENhY2hlU2V0O1xuIiwidmFyIG1hcENhY2hlQ2xlYXIgPSByZXF1aXJlKCcuL19tYXBDYWNoZUNsZWFyJyksXG4gICAgbWFwQ2FjaGVEZWxldGUgPSByZXF1aXJlKCcuL19tYXBDYWNoZURlbGV0ZScpLFxuICAgIG1hcENhY2hlR2V0ID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVHZXQnKSxcbiAgICBtYXBDYWNoZUhhcyA9IHJlcXVpcmUoJy4vX21hcENhY2hlSGFzJyksXG4gICAgbWFwQ2FjaGVTZXQgPSByZXF1aXJlKCcuL19tYXBDYWNoZVNldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXAgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gTWFwQ2FjaGUoZW50cmllcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgTWFwQ2FjaGVgLlxuTWFwQ2FjaGUucHJvdG90eXBlLmNsZWFyID0gbWFwQ2FjaGVDbGVhcjtcbk1hcENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBtYXBDYWNoZURlbGV0ZTtcbk1hcENhY2hlLnByb3RvdHlwZS5nZXQgPSBtYXBDYWNoZUdldDtcbk1hcENhY2hlLnByb3RvdHlwZS5oYXMgPSBtYXBDYWNoZUhhcztcbk1hcENhY2hlLnByb3RvdHlwZS5zZXQgPSBtYXBDYWNoZVNldDtcblxubW9kdWxlLmV4cG9ydHMgPSBNYXBDYWNoZTtcbiIsInZhciBMaXN0Q2FjaGUgPSByZXF1aXJlKCcuL19MaXN0Q2FjaGUnKSxcbiAgICBNYXAgPSByZXF1aXJlKCcuL19NYXAnKSxcbiAgICBNYXBDYWNoZSA9IHJlcXVpcmUoJy4vX01hcENhY2hlJyk7XG5cbi8qKiBVc2VkIGFzIHRoZSBzaXplIHRvIGVuYWJsZSBsYXJnZSBhcnJheSBvcHRpbWl6YXRpb25zLiAqL1xudmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbi8qKlxuICogU2V0cyB0aGUgc3RhY2sgYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgc3RhY2sgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICBpZiAoZGF0YSBpbnN0YW5jZW9mIExpc3RDYWNoZSkge1xuICAgIHZhciBwYWlycyA9IGRhdGEuX19kYXRhX187XG4gICAgaWYgKCFNYXAgfHwgKHBhaXJzLmxlbmd0aCA8IExBUkdFX0FSUkFZX1NJWkUgLSAxKSkge1xuICAgICAgcGFpcnMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgdGhpcy5zaXplID0gKytkYXRhLnNpemU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGF0YSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGUocGFpcnMpO1xuICB9XG4gIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrU2V0O1xuIiwidmFyIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpLFxuICAgIHN0YWNrQ2xlYXIgPSByZXF1aXJlKCcuL19zdGFja0NsZWFyJyksXG4gICAgc3RhY2tEZWxldGUgPSByZXF1aXJlKCcuL19zdGFja0RlbGV0ZScpLFxuICAgIHN0YWNrR2V0ID0gcmVxdWlyZSgnLi9fc3RhY2tHZXQnKSxcbiAgICBzdGFja0hhcyA9IHJlcXVpcmUoJy4vX3N0YWNrSGFzJyksXG4gICAgc3RhY2tTZXQgPSByZXF1aXJlKCcuL19zdGFja1NldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzdGFjayBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBTdGFjayhlbnRyaWVzKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoZW50cmllcyk7XG4gIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYFN0YWNrYC5cblN0YWNrLnByb3RvdHlwZS5jbGVhciA9IHN0YWNrQ2xlYXI7XG5TdGFjay5wcm90b3R5cGVbJ2RlbGV0ZSddID0gc3RhY2tEZWxldGU7XG5TdGFjay5wcm90b3R5cGUuZ2V0ID0gc3RhY2tHZXQ7XG5TdGFjay5wcm90b3R5cGUuaGFzID0gc3RhY2tIYXM7XG5TdGFjay5wcm90b3R5cGUuc2V0ID0gc3RhY2tTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gU3RhY2s7XG4iLCIvKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG52YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbi8qKlxuICogQWRkcyBgdmFsdWVgIHRvIHRoZSBhcnJheSBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgYWRkXG4gKiBAbWVtYmVyT2YgU2V0Q2FjaGVcbiAqIEBhbGlhcyBwdXNoXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjYWNoZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBzZXRDYWNoZUFkZCh2YWx1ZSkge1xuICB0aGlzLl9fZGF0YV9fLnNldCh2YWx1ZSwgSEFTSF9VTkRFRklORUQpO1xuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXRDYWNoZUFkZDtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgaW4gdGhlIGFycmF5IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBTZXRDYWNoZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gc2V0Q2FjaGVIYXModmFsdWUpIHtcbiAgcmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXRDYWNoZUhhcztcbiIsInZhciBNYXBDYWNoZSA9IHJlcXVpcmUoJy4vX01hcENhY2hlJyksXG4gICAgc2V0Q2FjaGVBZGQgPSByZXF1aXJlKCcuL19zZXRDYWNoZUFkZCcpLFxuICAgIHNldENhY2hlSGFzID0gcmVxdWlyZSgnLi9fc2V0Q2FjaGVIYXMnKTtcblxuLyoqXG4gKlxuICogQ3JlYXRlcyBhbiBhcnJheSBjYWNoZSBvYmplY3QgdG8gc3RvcmUgdW5pcXVlIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBTZXRDYWNoZSh2YWx1ZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSB2YWx1ZXMgPT0gbnVsbCA/IDAgOiB2YWx1ZXMubGVuZ3RoO1xuXG4gIHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGU7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdGhpcy5hZGQodmFsdWVzW2luZGV4XSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYFNldENhY2hlYC5cblNldENhY2hlLnByb3RvdHlwZS5hZGQgPSBTZXRDYWNoZS5wcm90b3R5cGUucHVzaCA9IHNldENhY2hlQWRkO1xuU2V0Q2FjaGUucHJvdG90eXBlLmhhcyA9IHNldENhY2hlSGFzO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNldENhY2hlO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc29tZWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgZWxlbWVudCBwYXNzZXMgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5U29tZShhcnJheSwgcHJlZGljYXRlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheVNvbWU7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBhIGBjYWNoZWAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIFRoZSBjYWNoZSB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBjYWNoZUhhcyhjYWNoZSwga2V5KSB7XG4gIHJldHVybiBjYWNoZS5oYXMoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjYWNoZUhhcztcbiIsInZhciBTZXRDYWNoZSA9IHJlcXVpcmUoJy4vX1NldENhY2hlJyksXG4gICAgYXJyYXlTb21lID0gcmVxdWlyZSgnLi9fYXJyYXlTb21lJyksXG4gICAgY2FjaGVIYXMgPSByZXF1aXJlKCcuL19jYWNoZUhhcycpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbnZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDEsXG4gICAgQ09NUEFSRV9VTk9SREVSRURfRkxBRyA9IDI7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBhcnJheXMgd2l0aCBzdXBwb3J0IGZvclxuICogcGFydGlhbCBkZWVwIGNvbXBhcmlzb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7QXJyYXl9IG90aGVyIFRoZSBvdGhlciBhcnJheSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgYXJyYXlgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFycmF5cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBlcXVhbEFycmF5cyhhcnJheSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRyxcbiAgICAgIGFyckxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIG90aExlbmd0aCA9IG90aGVyLmxlbmd0aDtcblxuICBpZiAoYXJyTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhKGlzUGFydGlhbCAmJiBvdGhMZW5ndGggPiBhcnJMZW5ndGgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIENoZWNrIHRoYXQgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gIHZhciBhcnJTdGFja2VkID0gc3RhY2suZ2V0KGFycmF5KTtcbiAgdmFyIG90aFN0YWNrZWQgPSBzdGFjay5nZXQob3RoZXIpO1xuICBpZiAoYXJyU3RhY2tlZCAmJiBvdGhTdGFja2VkKSB7XG4gICAgcmV0dXJuIGFyclN0YWNrZWQgPT0gb3RoZXIgJiYgb3RoU3RhY2tlZCA9PSBhcnJheTtcbiAgfVxuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IHRydWUsXG4gICAgICBzZWVuID0gKGJpdG1hc2sgJiBDT01QQVJFX1VOT1JERVJFRF9GTEFHKSA/IG5ldyBTZXRDYWNoZSA6IHVuZGVmaW5lZDtcblxuICBzdGFjay5zZXQoYXJyYXksIG90aGVyKTtcbiAgc3RhY2suc2V0KG90aGVyLCBhcnJheSk7XG5cbiAgLy8gSWdub3JlIG5vbi1pbmRleCBwcm9wZXJ0aWVzLlxuICB3aGlsZSAoKytpbmRleCA8IGFyckxlbmd0aCkge1xuICAgIHZhciBhcnJWYWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltpbmRleF07XG5cbiAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgdmFyIGNvbXBhcmVkID0gaXNQYXJ0aWFsXG4gICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgYXJyVmFsdWUsIGluZGV4LCBvdGhlciwgYXJyYXksIHN0YWNrKVxuICAgICAgICA6IGN1c3RvbWl6ZXIoYXJyVmFsdWUsIG90aFZhbHVlLCBpbmRleCwgYXJyYXksIG90aGVyLCBzdGFjayk7XG4gICAgfVxuICAgIGlmIChjb21wYXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoY29tcGFyZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIGlmIChzZWVuKSB7XG4gICAgICBpZiAoIWFycmF5U29tZShvdGhlciwgZnVuY3Rpb24ob3RoVmFsdWUsIG90aEluZGV4KSB7XG4gICAgICAgICAgICBpZiAoIWNhY2hlSGFzKHNlZW4sIG90aEluZGV4KSAmJlxuICAgICAgICAgICAgICAgIChhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHwgZXF1YWxGdW5jKGFyclZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spKSkge1xuICAgICAgICAgICAgICByZXR1cm4gc2Vlbi5wdXNoKG90aEluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSkge1xuICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghKFxuICAgICAgICAgIGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fFxuICAgICAgICAgICAgZXF1YWxGdW5jKGFyclZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spXG4gICAgICAgICkpIHtcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHN0YWNrWydkZWxldGUnXShhcnJheSk7XG4gIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXF1YWxBcnJheXM7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgVWludDhBcnJheSA9IHJvb3QuVWludDhBcnJheTtcblxubW9kdWxlLmV4cG9ydHMgPSBVaW50OEFycmF5O1xuIiwiLyoqXG4gKiBDb252ZXJ0cyBgbWFwYCB0byBpdHMga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUga2V5LXZhbHVlIHBhaXJzLlxuICovXG5mdW5jdGlvbiBtYXBUb0FycmF5KG1hcCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KG1hcC5zaXplKTtcblxuICBtYXAuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgcmVzdWx0WysraW5kZXhdID0gW2tleSwgdmFsdWVdO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBUb0FycmF5O1xuIiwiLyoqXG4gKiBDb252ZXJ0cyBgc2V0YCB0byBhbiBhcnJheSBvZiBpdHMgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc2V0IFRoZSBzZXQgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBzZXRUb0FycmF5KHNldCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTtcblxuICBzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJlc3VsdFsrK2luZGV4XSA9IHZhbHVlO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXRUb0FycmF5O1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIFVpbnQ4QXJyYXkgPSByZXF1aXJlKCcuL19VaW50OEFycmF5JyksXG4gICAgZXEgPSByZXF1aXJlKCcuL2VxJyksXG4gICAgZXF1YWxBcnJheXMgPSByZXF1aXJlKCcuL19lcXVhbEFycmF5cycpLFxuICAgIG1hcFRvQXJyYXkgPSByZXF1aXJlKCcuL19tYXBUb0FycmF5JyksXG4gICAgc2V0VG9BcnJheSA9IHJlcXVpcmUoJy4vX3NldFRvQXJyYXknKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxLFxuICAgIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcgPSAyO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxudmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XSc7XG5cbi8qKiBVc2VkIHRvIGNvbnZlcnQgc3ltYm9scyB0byBwcmltaXRpdmVzIGFuZCBzdHJpbmdzLiAqL1xudmFyIHN5bWJvbFByb3RvID0gU3ltYm9sID8gU3ltYm9sLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcbiAgICBzeW1ib2xWYWx1ZU9mID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by52YWx1ZU9mIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3IgY29tcGFyaW5nIG9iamVjdHMgb2ZcbiAqIHRoZSBzYW1lIGB0b1N0cmluZ1RhZ2AuXG4gKlxuICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBjb21wYXJpbmcgdmFsdWVzIHdpdGggdGFncyBvZlxuICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBOdW1iZXJgLCBgUmVnRXhwYCwgb3IgYFN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIGB0b1N0cmluZ1RhZ2Agb2YgdGhlIG9iamVjdHMgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBlcXVhbEJ5VGFnKG9iamVjdCwgb3RoZXIsIHRhZywgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICBpZiAoKG9iamVjdC5ieXRlTGVuZ3RoICE9IG90aGVyLmJ5dGVMZW5ndGgpIHx8XG4gICAgICAgICAgKG9iamVjdC5ieXRlT2Zmc2V0ICE9IG90aGVyLmJ5dGVPZmZzZXQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIG9iamVjdCA9IG9iamVjdC5idWZmZXI7XG4gICAgICBvdGhlciA9IG90aGVyLmJ1ZmZlcjtcblxuICAgIGNhc2UgYXJyYXlCdWZmZXJUYWc6XG4gICAgICBpZiAoKG9iamVjdC5ieXRlTGVuZ3RoICE9IG90aGVyLmJ5dGVMZW5ndGgpIHx8XG4gICAgICAgICAgIWVxdWFsRnVuYyhuZXcgVWludDhBcnJheShvYmplY3QpLCBuZXcgVWludDhBcnJheShvdGhlcikpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgY2FzZSBib29sVGFnOlxuICAgIGNhc2UgZGF0ZVRhZzpcbiAgICBjYXNlIG51bWJlclRhZzpcbiAgICAgIC8vIENvZXJjZSBib29sZWFucyB0byBgMWAgb3IgYDBgIGFuZCBkYXRlcyB0byBtaWxsaXNlY29uZHMuXG4gICAgICAvLyBJbnZhbGlkIGRhdGVzIGFyZSBjb2VyY2VkIHRvIGBOYU5gLlxuICAgICAgcmV0dXJuIGVxKCtvYmplY3QsICtvdGhlcik7XG5cbiAgICBjYXNlIGVycm9yVGFnOlxuICAgICAgcmV0dXJuIG9iamVjdC5uYW1lID09IG90aGVyLm5hbWUgJiYgb2JqZWN0Lm1lc3NhZ2UgPT0gb3RoZXIubWVzc2FnZTtcblxuICAgIGNhc2UgcmVnZXhwVGFnOlxuICAgIGNhc2Ugc3RyaW5nVGFnOlxuICAgICAgLy8gQ29lcmNlIHJlZ2V4ZXMgdG8gc3RyaW5ncyBhbmQgdHJlYXQgc3RyaW5ncywgcHJpbWl0aXZlcyBhbmQgb2JqZWN0cyxcbiAgICAgIC8vIGFzIGVxdWFsLiBTZWUgaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXJlZ2V4cC5wcm90b3R5cGUudG9zdHJpbmdcbiAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICByZXR1cm4gb2JqZWN0ID09IChvdGhlciArICcnKTtcblxuICAgIGNhc2UgbWFwVGFnOlxuICAgICAgdmFyIGNvbnZlcnQgPSBtYXBUb0FycmF5O1xuXG4gICAgY2FzZSBzZXRUYWc6XG4gICAgICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHO1xuICAgICAgY29udmVydCB8fCAoY29udmVydCA9IHNldFRvQXJyYXkpO1xuXG4gICAgICBpZiAob2JqZWN0LnNpemUgIT0gb3RoZXIuc2l6ZSAmJiAhaXNQYXJ0aWFsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIEFzc3VtZSBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC5cbiAgICAgIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KG9iamVjdCk7XG4gICAgICBpZiAoc3RhY2tlZCkge1xuICAgICAgICByZXR1cm4gc3RhY2tlZCA9PSBvdGhlcjtcbiAgICAgIH1cbiAgICAgIGJpdG1hc2sgfD0gQ09NUEFSRV9VTk9SREVSRURfRkxBRztcblxuICAgICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICBzdGFjay5zZXQob2JqZWN0LCBvdGhlcik7XG4gICAgICB2YXIgcmVzdWx0ID0gZXF1YWxBcnJheXMoY29udmVydChvYmplY3QpLCBjb252ZXJ0KG90aGVyKSwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjayk7XG4gICAgICBzdGFja1snZGVsZXRlJ10ob2JqZWN0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICBjYXNlIHN5bWJvbFRhZzpcbiAgICAgIGlmIChzeW1ib2xWYWx1ZU9mKSB7XG4gICAgICAgIHJldHVybiBzeW1ib2xWYWx1ZU9mLmNhbGwob2JqZWN0KSA9PSBzeW1ib2xWYWx1ZU9mLmNhbGwob3RoZXIpO1xuICAgICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlcXVhbEJ5VGFnO1xuIiwiLyoqXG4gKiBBcHBlbmRzIHRoZSBlbGVtZW50cyBvZiBgdmFsdWVzYCB0byBgYXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gYXBwZW5kLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5UHVzaChhcnJheSwgdmFsdWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgIG9mZnNldCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGFycmF5W29mZnNldCArIGluZGV4XSA9IHZhbHVlc1tpbmRleF07XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5UHVzaDtcbiIsInZhciBhcnJheVB1c2ggPSByZXF1aXJlKCcuL19hcnJheVB1c2gnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldEFsbEtleXNgIGFuZCBgZ2V0QWxsS2V5c0luYCB3aGljaCB1c2VzXG4gKiBga2V5c0Z1bmNgIGFuZCBgc3ltYm9sc0Z1bmNgIHRvIGdldCB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBhbmRcbiAqIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzeW1ib2xzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzRnVuYywgc3ltYm9sc0Z1bmMpIHtcbiAgdmFyIHJlc3VsdCA9IGtleXNGdW5jKG9iamVjdCk7XG4gIHJldHVybiBpc0FycmF5KG9iamVjdCkgPyByZXN1bHQgOiBhcnJheVB1c2gocmVzdWx0LCBzeW1ib2xzRnVuYyhvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlR2V0QWxsS2V5cztcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZpbHRlcmAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheUZpbHRlcihhcnJheSwgcHJlZGljYXRlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICByZXNJbmRleCA9IDAsXG4gICAgICByZXN1bHQgPSBbXTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheUZpbHRlcjtcbiIsIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBlbXB0eSBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGVtcHR5IGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgYXJyYXlzID0gXy50aW1lcygyLCBfLnN0dWJBcnJheSk7XG4gKlxuICogY29uc29sZS5sb2coYXJyYXlzKTtcbiAqIC8vID0+IFtbXSwgW11dXG4gKlxuICogY29uc29sZS5sb2coYXJyYXlzWzBdID09PSBhcnJheXNbMV0pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gc3R1YkFycmF5KCkge1xuICByZXR1cm4gW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3R1YkFycmF5O1xuIiwidmFyIGFycmF5RmlsdGVyID0gcmVxdWlyZSgnLi9fYXJyYXlGaWx0ZXInKSxcbiAgICBzdHViQXJyYXkgPSByZXF1aXJlKCcuL3N0dWJBcnJheScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlR2V0U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICovXG52YXIgZ2V0U3ltYm9scyA9ICFuYXRpdmVHZXRTeW1ib2xzID8gc3R1YkFycmF5IDogZnVuY3Rpb24ob2JqZWN0KSB7XG4gIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgcmV0dXJuIGFycmF5RmlsdGVyKG5hdGl2ZUdldFN5bWJvbHMob2JqZWN0KSwgZnVuY3Rpb24oc3ltYm9sKSB7XG4gICAgcmV0dXJuIHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqZWN0LCBzeW1ib2wpO1xuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0U3ltYm9scztcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udGltZXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kc1xuICogb3IgbWF4IGFycmF5IGxlbmd0aCBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICovXG5mdW5jdGlvbiBiYXNlVGltZXMobiwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBBcnJheShuKTtcblxuICB3aGlsZSAoKytpbmRleCA8IG4pIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoaW5kZXgpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVRpbWVzO1xuIiwidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0FyZ3VtZW50c2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICovXG5mdW5jdGlvbiBiYXNlSXNBcmd1bWVudHModmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gYXJnc1RhZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNBcmd1bWVudHM7XG4iLCJ2YXIgYmFzZUlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9fYmFzZUlzQXJndW1lbnRzJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJndW1lbnRzID0gYmFzZUlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID8gYmFzZUlzQXJndW1lbnRzIDogZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpICYmXG4gICAgIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsICdjYWxsZWUnKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcmd1bWVudHM7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgYGZhbHNlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udGltZXMoMiwgXy5zdHViRmFsc2UpO1xuICogLy8gPT4gW2ZhbHNlLCBmYWxzZV1cbiAqL1xuZnVuY3Rpb24gc3R1YkZhbHNlKCkge1xuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3R1YkZhbHNlO1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290JyksXG4gICAgc3R1YkZhbHNlID0gcmVxdWlyZSgnLi9zdHViRmFsc2UnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbnZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xudmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbnZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBCdWZmZXIgPSBtb2R1bGVFeHBvcnRzID8gcm9vdC5CdWZmZXIgOiB1bmRlZmluZWQ7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVJc0J1ZmZlciA9IEJ1ZmZlciA/IEJ1ZmZlci5pc0J1ZmZlciA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMy4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlciwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQnVmZmVyKG5ldyBCdWZmZXIoMikpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNCdWZmZXIobmV3IFVpbnQ4QXJyYXkoMikpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQnVmZmVyID0gbmF0aXZlSXNCdWZmZXIgfHwgc3R1YkZhbHNlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQnVmZmVyO1xuIiwiLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy4gKi9cbnZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxcZCopJC87XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGluZGV4LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPU1BWF9TQUZFX0lOVEVHRVJdIFRoZSB1cHBlciBib3VuZHMgb2YgYSB2YWxpZCBpbmRleC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgaW5kZXgsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwgbGVuZ3RoKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XG5cbiAgcmV0dXJuICEhbGVuZ3RoICYmXG4gICAgKHR5cGUgPT0gJ251bWJlcicgfHxcbiAgICAgICh0eXBlICE9ICdzeW1ib2wnICYmIHJlSXNVaW50LnRlc3QodmFsdWUpKSkgJiZcbiAgICAgICAgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzSW5kZXg7XG4iLCIvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgbGVuZ3RoLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgbGVuZ3RoLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNMZW5ndGgoMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aChJbmZpbml0eSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoJzMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiZcbiAgICB2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNMZW5ndGg7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxuICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgICBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXSc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nLFxuICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuXG4vKiogVXNlZCB0byBpZGVudGlmeSBgdG9TdHJpbmdUYWdgIHZhbHVlcyBvZiB0eXBlZCBhcnJheXMuICovXG52YXIgdHlwZWRBcnJheVRhZ3MgPSB7fTtcbnR5cGVkQXJyYXlUYWdzW2Zsb2F0MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbZmxvYXQ2NFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbaW50OFRhZ10gPSB0eXBlZEFycmF5VGFnc1tpbnQxNlRhZ10gPVxudHlwZWRBcnJheVRhZ3NbaW50MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDhUYWddID1cbnR5cGVkQXJyYXlUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50MTZUYWddID1cbnR5cGVkQXJyYXlUYWdzW3VpbnQzMlRhZ10gPSB0cnVlO1xudHlwZWRBcnJheVRhZ3NbYXJnc1RhZ10gPSB0eXBlZEFycmF5VGFnc1thcnJheVRhZ10gPVxudHlwZWRBcnJheVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gdHlwZWRBcnJheVRhZ3NbYm9vbFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbZGF0YVZpZXdUYWddID0gdHlwZWRBcnJheVRhZ3NbZGF0ZVRhZ10gPVxudHlwZWRBcnJheVRhZ3NbZXJyb3JUYWddID0gdHlwZWRBcnJheVRhZ3NbZnVuY1RhZ10gPVxudHlwZWRBcnJheVRhZ3NbbWFwVGFnXSA9IHR5cGVkQXJyYXlUYWdzW251bWJlclRhZ10gPVxudHlwZWRBcnJheVRhZ3Nbb2JqZWN0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3JlZ2V4cFRhZ10gPVxudHlwZWRBcnJheVRhZ3Nbc2V0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3N0cmluZ1RhZ10gPVxudHlwZWRBcnJheVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1R5cGVkQXJyYXlgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzVHlwZWRBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJlxuICAgIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgISF0eXBlZEFycmF5VGFnc1tiYXNlR2V0VGFnKHZhbHVlKV07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzVHlwZWRBcnJheTtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5hcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3Igc3RvcmluZyBtZXRhZGF0YS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXBwZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VVbmFyeShmdW5jKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiBmdW5jKHZhbHVlKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVW5hcnk7XG4iLCJ2YXIgZnJlZUdsb2JhbCA9IHJlcXVpcmUoJy4vX2ZyZWVHbG9iYWwnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbnZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xudmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbnZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHByb2Nlc3NgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlUHJvY2VzcyA9IG1vZHVsZUV4cG9ydHMgJiYgZnJlZUdsb2JhbC5wcm9jZXNzO1xuXG4vKiogVXNlZCB0byBhY2Nlc3MgZmFzdGVyIE5vZGUuanMgaGVscGVycy4gKi9cbnZhciBub2RlVXRpbCA9IChmdW5jdGlvbigpIHtcbiAgdHJ5IHtcbiAgICAvLyBVc2UgYHV0aWwudHlwZXNgIGZvciBOb2RlLmpzIDEwKy5cbiAgICB2YXIgdHlwZXMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUucmVxdWlyZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUoJ3V0aWwnKS50eXBlcztcblxuICAgIGlmICh0eXBlcykge1xuICAgICAgcmV0dXJuIHR5cGVzO1xuICAgIH1cblxuICAgIC8vIExlZ2FjeSBgcHJvY2Vzcy5iaW5kaW5nKCd1dGlsJylgIGZvciBOb2RlLmpzIDwgMTAuXG4gICAgcmV0dXJuIGZyZWVQcm9jZXNzICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcgJiYgZnJlZVByb2Nlc3MuYmluZGluZygndXRpbCcpO1xuICB9IGNhdGNoIChlKSB7fVxufSgpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBub2RlVXRpbDtcbiIsInZhciBiYXNlSXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9fYmFzZUlzVHlwZWRBcnJheScpLFxuICAgIGJhc2VVbmFyeSA9IHJlcXVpcmUoJy4vX2Jhc2VVbmFyeScpLFxuICAgIG5vZGVVdGlsID0gcmVxdWlyZSgnLi9fbm9kZVV0aWwnKTtcblxuLyogTm9kZS5qcyBoZWxwZXIgcmVmZXJlbmNlcy4gKi9cbnZhciBub2RlSXNUeXBlZEFycmF5ID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNUeXBlZEFycmF5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSB0eXBlZCBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNUeXBlZEFycmF5KG5ldyBVaW50OEFycmF5KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzVHlwZWRBcnJheShbXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNUeXBlZEFycmF5ID0gbm9kZUlzVHlwZWRBcnJheSA/IGJhc2VVbmFyeShub2RlSXNUeXBlZEFycmF5KSA6IGJhc2VJc1R5cGVkQXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNUeXBlZEFycmF5O1xuIiwidmFyIGJhc2VUaW1lcyA9IHJlcXVpcmUoJy4vX2Jhc2VUaW1lcycpLFxuICAgIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0J1ZmZlciA9IHJlcXVpcmUoJy4vaXNCdWZmZXInKSxcbiAgICBpc0luZGV4ID0gcmVxdWlyZSgnLi9faXNJbmRleCcpLFxuICAgIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vaXNUeXBlZEFycmF5Jyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiB0aGUgYXJyYXktbGlrZSBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5oZXJpdGVkIFNwZWNpZnkgcmV0dXJuaW5nIGluaGVyaXRlZCBwcm9wZXJ0eSBuYW1lcy5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGFycmF5TGlrZUtleXModmFsdWUsIGluaGVyaXRlZCkge1xuICB2YXIgaXNBcnIgPSBpc0FycmF5KHZhbHVlKSxcbiAgICAgIGlzQXJnID0gIWlzQXJyICYmIGlzQXJndW1lbnRzKHZhbHVlKSxcbiAgICAgIGlzQnVmZiA9ICFpc0FyciAmJiAhaXNBcmcgJiYgaXNCdWZmZXIodmFsdWUpLFxuICAgICAgaXNUeXBlID0gIWlzQXJyICYmICFpc0FyZyAmJiAhaXNCdWZmICYmIGlzVHlwZWRBcnJheSh2YWx1ZSksXG4gICAgICBza2lwSW5kZXhlcyA9IGlzQXJyIHx8IGlzQXJnIHx8IGlzQnVmZiB8fCBpc1R5cGUsXG4gICAgICByZXN1bHQgPSBza2lwSW5kZXhlcyA/IGJhc2VUaW1lcyh2YWx1ZS5sZW5ndGgsIFN0cmluZykgOiBbXSxcbiAgICAgIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7XG5cbiAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgaWYgKChpbmhlcml0ZWQgfHwgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkgJiZcbiAgICAgICAgIShza2lwSW5kZXhlcyAmJiAoXG4gICAgICAgICAgIC8vIFNhZmFyaSA5IGhhcyBlbnVtZXJhYmxlIGBhcmd1bWVudHMubGVuZ3RoYCBpbiBzdHJpY3QgbW9kZS5cbiAgICAgICAgICAga2V5ID09ICdsZW5ndGgnIHx8XG4gICAgICAgICAgIC8vIE5vZGUuanMgMC4xMCBoYXMgZW51bWVyYWJsZSBub24taW5kZXggcHJvcGVydGllcyBvbiBidWZmZXJzLlxuICAgICAgICAgICAoaXNCdWZmICYmIChrZXkgPT0gJ29mZnNldCcgfHwga2V5ID09ICdwYXJlbnQnKSkgfHxcbiAgICAgICAgICAgLy8gUGhhbnRvbUpTIDIgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gdHlwZWQgYXJyYXlzLlxuICAgICAgICAgICAoaXNUeXBlICYmIChrZXkgPT0gJ2J1ZmZlcicgfHwga2V5ID09ICdieXRlTGVuZ3RoJyB8fCBrZXkgPT0gJ2J5dGVPZmZzZXQnKSkgfHxcbiAgICAgICAgICAgLy8gU2tpcCBpbmRleCBwcm9wZXJ0aWVzLlxuICAgICAgICAgICBpc0luZGV4KGtleSwgbGVuZ3RoKVxuICAgICAgICApKSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheUxpa2VLZXlzO1xuIiwiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYSBwcm90b3R5cGUgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvdG90eXBlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzUHJvdG90eXBlKHZhbHVlKSB7XG4gIHZhciBDdG9yID0gdmFsdWUgJiYgdmFsdWUuY29uc3RydWN0b3IsXG4gICAgICBwcm90byA9ICh0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IucHJvdG90eXBlKSB8fCBvYmplY3RQcm90bztcblxuICByZXR1cm4gdmFsdWUgPT09IHByb3RvO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzUHJvdG90eXBlO1xuIiwiLyoqXG4gKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgYXJndW1lbnQgdHJhbnNmb3JtLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG92ZXJBcmcoZnVuYywgdHJhbnNmb3JtKSB7XG4gIHJldHVybiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3ZlckFyZztcbiIsInZhciBvdmVyQXJnID0gcmVxdWlyZSgnLi9fb3ZlckFyZycpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlS2V5cyA9IG92ZXJBcmcoT2JqZWN0LmtleXMsIE9iamVjdCk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmF0aXZlS2V5cztcbiIsInZhciBpc1Byb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2lzUHJvdG90eXBlJyksXG4gICAgbmF0aXZlS2V5cyA9IHJlcXVpcmUoJy4vX25hdGl2ZUtleXMnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VLZXlzKG9iamVjdCkge1xuICBpZiAoIWlzUHJvdG90eXBlKG9iamVjdCkpIHtcbiAgICByZXR1cm4gbmF0aXZlS2V5cyhvYmplY3QpO1xuICB9XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGtleSAhPSAnY29uc3RydWN0b3InKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VLZXlzO1xuIiwidmFyIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2lzRnVuY3Rpb24nKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLiBBIHZhbHVlIGlzIGNvbnNpZGVyZWQgYXJyYXktbGlrZSBpZiBpdCdzXG4gKiBub3QgYSBmdW5jdGlvbiBhbmQgaGFzIGEgYHZhbHVlLmxlbmd0aGAgdGhhdCdzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yXG4gKiBlcXVhbCB0byBgMGAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZSgnYWJjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbih2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcnJheUxpa2U7XG4iLCJ2YXIgYXJyYXlMaWtlS2V5cyA9IHJlcXVpcmUoJy4vX2FycmF5TGlrZUtleXMnKSxcbiAgICBiYXNlS2V5cyA9IHJlcXVpcmUoJy4vX2Jhc2VLZXlzJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuIFNlZSB0aGVcbiAqIFtFUyBzcGVjXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5rZXlzKG5ldyBGb28pO1xuICogLy8gPT4gWydhJywgJ2InXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIF8ua2V5cygnaGknKTtcbiAqIC8vID0+IFsnMCcsICcxJ11cbiAqL1xuZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcbiAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCkgOiBiYXNlS2V5cyhvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGtleXM7XG4iLCJ2YXIgYmFzZUdldEFsbEtleXMgPSByZXF1aXJlKCcuL19iYXNlR2V0QWxsS2V5cycpLFxuICAgIGdldFN5bWJvbHMgPSByZXF1aXJlKCcuL19nZXRTeW1ib2xzJyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gKi9cbmZ1bmN0aW9uIGdldEFsbEtleXMob2JqZWN0KSB7XG4gIHJldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXMsIGdldFN5bWJvbHMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEFsbEtleXM7XG4iLCJ2YXIgZ2V0QWxsS2V5cyA9IHJlcXVpcmUoJy4vX2dldEFsbEtleXMnKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3Igb2JqZWN0cyB3aXRoIHN1cHBvcnQgZm9yXG4gKiBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBlcXVhbE9iamVjdHMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHLFxuICAgICAgb2JqUHJvcHMgPSBnZXRBbGxLZXlzKG9iamVjdCksXG4gICAgICBvYmpMZW5ndGggPSBvYmpQcm9wcy5sZW5ndGgsXG4gICAgICBvdGhQcm9wcyA9IGdldEFsbEtleXMob3RoZXIpLFxuICAgICAgb3RoTGVuZ3RoID0gb3RoUHJvcHMubGVuZ3RoO1xuXG4gIGlmIChvYmpMZW5ndGggIT0gb3RoTGVuZ3RoICYmICFpc1BhcnRpYWwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGluZGV4ID0gb2JqTGVuZ3RoO1xuICB3aGlsZSAoaW5kZXgtLSkge1xuICAgIHZhciBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgaWYgKCEoaXNQYXJ0aWFsID8ga2V5IGluIG90aGVyIDogaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwga2V5KSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgLy8gQ2hlY2sgdGhhdCBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC5cbiAgdmFyIG9ialN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgdmFyIG90aFN0YWNrZWQgPSBzdGFjay5nZXQob3RoZXIpO1xuICBpZiAob2JqU3RhY2tlZCAmJiBvdGhTdGFja2VkKSB7XG4gICAgcmV0dXJuIG9ialN0YWNrZWQgPT0gb3RoZXIgJiYgb3RoU3RhY2tlZCA9PSBvYmplY3Q7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IHRydWU7XG4gIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgc3RhY2suc2V0KG90aGVyLCBvYmplY3QpO1xuXG4gIHZhciBza2lwQ3RvciA9IGlzUGFydGlhbDtcbiAgd2hpbGUgKCsraW5kZXggPCBvYmpMZW5ndGgpIHtcbiAgICBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgIG90aFZhbHVlID0gb3RoZXJba2V5XTtcblxuICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICB2YXIgY29tcGFyZWQgPSBpc1BhcnRpYWxcbiAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBvYmpWYWx1ZSwga2V5LCBvdGhlciwgb2JqZWN0LCBzdGFjaylcbiAgICAgICAgOiBjdXN0b21pemVyKG9ialZhbHVlLCBvdGhWYWx1ZSwga2V5LCBvYmplY3QsIG90aGVyLCBzdGFjayk7XG4gICAgfVxuICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIGlmICghKGNvbXBhcmVkID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IChvYmpWYWx1ZSA9PT0gb3RoVmFsdWUgfHwgZXF1YWxGdW5jKG9ialZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spKVxuICAgICAgICAgIDogY29tcGFyZWRcbiAgICAgICAgKSkge1xuICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgc2tpcEN0b3IgfHwgKHNraXBDdG9yID0ga2V5ID09ICdjb25zdHJ1Y3RvcicpO1xuICB9XG4gIGlmIChyZXN1bHQgJiYgIXNraXBDdG9yKSB7XG4gICAgdmFyIG9iakN0b3IgPSBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgIG90aEN0b3IgPSBvdGhlci5jb25zdHJ1Y3RvcjtcblxuICAgIC8vIE5vbiBgT2JqZWN0YCBvYmplY3QgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGNvbnN0cnVjdG9ycyBhcmUgbm90IGVxdWFsLlxuICAgIGlmIChvYmpDdG9yICE9IG90aEN0b3IgJiZcbiAgICAgICAgKCdjb25zdHJ1Y3RvcicgaW4gb2JqZWN0ICYmICdjb25zdHJ1Y3RvcicgaW4gb3RoZXIpICYmXG4gICAgICAgICEodHlwZW9mIG9iakN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvYmpDdG9yIGluc3RhbmNlb2Ygb2JqQ3RvciAmJlxuICAgICAgICAgIHR5cGVvZiBvdGhDdG9yID09ICdmdW5jdGlvbicgJiYgb3RoQ3RvciBpbnN0YW5jZW9mIG90aEN0b3IpKSB7XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXF1YWxPYmplY3RzO1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBEYXRhVmlldyA9IGdldE5hdGl2ZShyb290LCAnRGF0YVZpZXcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBEYXRhVmlldztcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgUHJvbWlzZSA9IGdldE5hdGl2ZShyb290LCAnUHJvbWlzZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFByb21pc2U7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIFNldCA9IGdldE5hdGl2ZShyb290LCAnU2V0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gU2V0O1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBXZWFrTWFwID0gZ2V0TmF0aXZlKHJvb3QsICdXZWFrTWFwJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gV2Vha01hcDtcbiIsInZhciBEYXRhVmlldyA9IHJlcXVpcmUoJy4vX0RhdGFWaWV3JyksXG4gICAgTWFwID0gcmVxdWlyZSgnLi9fTWFwJyksXG4gICAgUHJvbWlzZSA9IHJlcXVpcmUoJy4vX1Byb21pc2UnKSxcbiAgICBTZXQgPSByZXF1aXJlKCcuL19TZXQnKSxcbiAgICBXZWFrTWFwID0gcmVxdWlyZSgnLi9fV2Vha01hcCcpLFxuICAgIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgdG9Tb3VyY2UgPSByZXF1aXJlKCcuL190b1NvdXJjZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgcHJvbWlzZVRhZyA9ICdbb2JqZWN0IFByb21pc2VdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xuXG52YXIgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgbWFwcywgc2V0cywgYW5kIHdlYWttYXBzLiAqL1xudmFyIGRhdGFWaWV3Q3RvclN0cmluZyA9IHRvU291cmNlKERhdGFWaWV3KSxcbiAgICBtYXBDdG9yU3RyaW5nID0gdG9Tb3VyY2UoTWFwKSxcbiAgICBwcm9taXNlQ3RvclN0cmluZyA9IHRvU291cmNlKFByb21pc2UpLFxuICAgIHNldEN0b3JTdHJpbmcgPSB0b1NvdXJjZShTZXQpLFxuICAgIHdlYWtNYXBDdG9yU3RyaW5nID0gdG9Tb3VyY2UoV2Vha01hcCk7XG5cbi8qKlxuICogR2V0cyB0aGUgYHRvU3RyaW5nVGFnYCBvZiBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gKi9cbnZhciBnZXRUYWcgPSBiYXNlR2V0VGFnO1xuXG4vLyBGYWxsYmFjayBmb3IgZGF0YSB2aWV3cywgbWFwcywgc2V0cywgYW5kIHdlYWsgbWFwcyBpbiBJRSAxMSBhbmQgcHJvbWlzZXMgaW4gTm9kZS5qcyA8IDYuXG5pZiAoKERhdGFWaWV3ICYmIGdldFRhZyhuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDEpKSkgIT0gZGF0YVZpZXdUYWcpIHx8XG4gICAgKE1hcCAmJiBnZXRUYWcobmV3IE1hcCkgIT0gbWFwVGFnKSB8fFxuICAgIChQcm9taXNlICYmIGdldFRhZyhQcm9taXNlLnJlc29sdmUoKSkgIT0gcHJvbWlzZVRhZykgfHxcbiAgICAoU2V0ICYmIGdldFRhZyhuZXcgU2V0KSAhPSBzZXRUYWcpIHx8XG4gICAgKFdlYWtNYXAgJiYgZ2V0VGFnKG5ldyBXZWFrTWFwKSAhPSB3ZWFrTWFwVGFnKSkge1xuICBnZXRUYWcgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciByZXN1bHQgPSBiYXNlR2V0VGFnKHZhbHVlKSxcbiAgICAgICAgQ3RvciA9IHJlc3VsdCA9PSBvYmplY3RUYWcgPyB2YWx1ZS5jb25zdHJ1Y3RvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgY3RvclN0cmluZyA9IEN0b3IgPyB0b1NvdXJjZShDdG9yKSA6ICcnO1xuXG4gICAgaWYgKGN0b3JTdHJpbmcpIHtcbiAgICAgIHN3aXRjaCAoY3RvclN0cmluZykge1xuICAgICAgICBjYXNlIGRhdGFWaWV3Q3RvclN0cmluZzogcmV0dXJuIGRhdGFWaWV3VGFnO1xuICAgICAgICBjYXNlIG1hcEN0b3JTdHJpbmc6IHJldHVybiBtYXBUYWc7XG4gICAgICAgIGNhc2UgcHJvbWlzZUN0b3JTdHJpbmc6IHJldHVybiBwcm9taXNlVGFnO1xuICAgICAgICBjYXNlIHNldEN0b3JTdHJpbmc6IHJldHVybiBzZXRUYWc7XG4gICAgICAgIGNhc2Ugd2Vha01hcEN0b3JTdHJpbmc6IHJldHVybiB3ZWFrTWFwVGFnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFRhZztcbiIsInZhciBTdGFjayA9IHJlcXVpcmUoJy4vX1N0YWNrJyksXG4gICAgZXF1YWxBcnJheXMgPSByZXF1aXJlKCcuL19lcXVhbEFycmF5cycpLFxuICAgIGVxdWFsQnlUYWcgPSByZXF1aXJlKCcuL19lcXVhbEJ5VGFnJyksXG4gICAgZXF1YWxPYmplY3RzID0gcmVxdWlyZSgnLi9fZXF1YWxPYmplY3RzJyksXG4gICAgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vaXNUeXBlZEFycmF5Jyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICogZGVlcCBjb21wYXJpc29ucyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICogcmVmZXJlbmNlcyB0byBiZSBjb21wYXJlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzRXF1YWxEZWVwKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgdmFyIG9iaklzQXJyID0gaXNBcnJheShvYmplY3QpLFxuICAgICAgb3RoSXNBcnIgPSBpc0FycmF5KG90aGVyKSxcbiAgICAgIG9ialRhZyA9IG9iaklzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob2JqZWN0KSxcbiAgICAgIG90aFRhZyA9IG90aElzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob3RoZXIpO1xuXG4gIG9ialRhZyA9IG9ialRhZyA9PSBhcmdzVGFnID8gb2JqZWN0VGFnIDogb2JqVGFnO1xuICBvdGhUYWcgPSBvdGhUYWcgPT0gYXJnc1RhZyA/IG9iamVjdFRhZyA6IG90aFRhZztcblxuICB2YXIgb2JqSXNPYmogPSBvYmpUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgb3RoSXNPYmogPSBvdGhUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgaXNTYW1lVGFnID0gb2JqVGFnID09IG90aFRhZztcblxuICBpZiAoaXNTYW1lVGFnICYmIGlzQnVmZmVyKG9iamVjdCkpIHtcbiAgICBpZiAoIWlzQnVmZmVyKG90aGVyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBvYmpJc0FyciA9IHRydWU7XG4gICAgb2JqSXNPYmogPSBmYWxzZTtcbiAgfVxuICBpZiAoaXNTYW1lVGFnICYmICFvYmpJc09iaikge1xuICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgcmV0dXJuIChvYmpJc0FyciB8fCBpc1R5cGVkQXJyYXkob2JqZWN0KSlcbiAgICAgID8gZXF1YWxBcnJheXMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaylcbiAgICAgIDogZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCBvYmpUYWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICB9XG4gIGlmICghKGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRykpIHtcbiAgICB2YXIgb2JqSXNXcmFwcGVkID0gb2JqSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsICdfX3dyYXBwZWRfXycpLFxuICAgICAgICBvdGhJc1dyYXBwZWQgPSBvdGhJc09iaiAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCAnX193cmFwcGVkX18nKTtcblxuICAgIGlmIChvYmpJc1dyYXBwZWQgfHwgb3RoSXNXcmFwcGVkKSB7XG4gICAgICB2YXIgb2JqVW53cmFwcGVkID0gb2JqSXNXcmFwcGVkID8gb2JqZWN0LnZhbHVlKCkgOiBvYmplY3QsXG4gICAgICAgICAgb3RoVW53cmFwcGVkID0gb3RoSXNXcmFwcGVkID8gb3RoZXIudmFsdWUoKSA6IG90aGVyO1xuXG4gICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgcmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsIG90aFVud3JhcHBlZCwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spO1xuICAgIH1cbiAgfVxuICBpZiAoIWlzU2FtZVRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICByZXR1cm4gZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc0VxdWFsRGVlcDtcbiIsInZhciBiYXNlSXNFcXVhbERlZXAgPSByZXF1aXJlKCcuL19iYXNlSXNFcXVhbERlZXAnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzRXF1YWxgIHdoaWNoIHN1cHBvcnRzIHBhcnRpYWwgY29tcGFyaXNvbnNcbiAqIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtib29sZWFufSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICogIDEgLSBVbm9yZGVyZWQgY29tcGFyaXNvblxuICogIDIgLSBQYXJ0aWFsIGNvbXBhcmlzb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgdmFsdWVgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gIGlmICh2YWx1ZSA9PT0gb3RoZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodmFsdWUgPT0gbnVsbCB8fCBvdGhlciA9PSBudWxsIHx8ICghaXNPYmplY3RMaWtlKHZhbHVlKSAmJiAhaXNPYmplY3RMaWtlKG90aGVyKSkpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcjtcbiAgfVxuICByZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgYmFzZUlzRXF1YWwsIHN0YWNrKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNFcXVhbDtcbiIsInZhciBiYXNlSXNFcXVhbCA9IHJlcXVpcmUoJy4vX2Jhc2VJc0VxdWFsJyk7XG5cbi8qKlxuICogUGVyZm9ybXMgYSBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZVxuICogZXF1aXZhbGVudC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2Qgc3VwcG9ydHMgY29tcGFyaW5nIGFycmF5cywgYXJyYXkgYnVmZmVycywgYm9vbGVhbnMsXG4gKiBkYXRlIG9iamVjdHMsIGVycm9yIG9iamVjdHMsIG1hcHMsIG51bWJlcnMsIGBPYmplY3RgIG9iamVjdHMsIHJlZ2V4ZXMsXG4gKiBzZXRzLCBzdHJpbmdzLCBzeW1ib2xzLCBhbmQgdHlwZWQgYXJyYXlzLiBgT2JqZWN0YCBvYmplY3RzIGFyZSBjb21wYXJlZFxuICogYnkgdGhlaXIgb3duLCBub3QgaW5oZXJpdGVkLCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuIEZ1bmN0aW9ucyBhbmQgRE9NXG4gKiBub2RlcyBhcmUgY29tcGFyZWQgYnkgc3RyaWN0IGVxdWFsaXR5LCBpLmUuIGA9PT1gLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICogdmFyIG90aGVyID0geyAnYSc6IDEgfTtcbiAqXG4gKiBfLmlzRXF1YWwob2JqZWN0LCBvdGhlcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogb2JqZWN0ID09PSBvdGhlcjtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRXF1YWwodmFsdWUsIG90aGVyKSB7XG4gIHJldHVybiBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRXF1YWw7XG4iLCIvKipcbiAqIFdlYnBhY2sgaGFzIGJ1ZyBmb3IgaW1wb3J0IGxvb3AsIHdoaWNoIGlzIG5vdCB0aGUgc2FtZSBiZWhhdmlvciBhcyBFUyBtb2R1bGUuXG4gKiBXaGVuIHV0aWwuanMgaW1wb3J0cyB0aGUgVHJlZU5vZGUgZm9yIHRyZWUgZ2VuZXJhdGUgd2lsbCBjYXVzZSB0cmVlQ29udGV4dFR5cGVzIGJlIGVtcHR5LlxuICovXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgdmFyIFRyZWVDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xudmFyIEluZGVudCA9IGZ1bmN0aW9uIEluZGVudChfcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICBsZXZlbCA9IF9yZWYubGV2ZWwsXG4gICAgaXNTdGFydCA9IF9yZWYuaXNTdGFydCxcbiAgICBpc0VuZCA9IF9yZWYuaXNFbmQ7XG4gIHZhciBiYXNlQ2xhc3NOYW1lID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbmRlbnQtdW5pdFwiKTtcbiAgdmFyIGxpc3QgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZXZlbDsgaSArPSAxKSB7XG4gICAgdmFyIF9jbGFzc05hbWVzO1xuICAgIGxpc3QucHVzaCggLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGtleTogaSxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhiYXNlQ2xhc3NOYW1lLCAoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChiYXNlQ2xhc3NOYW1lLCBcIi1zdGFydFwiKSwgaXNTdGFydFtpXSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQoYmFzZUNsYXNzTmFtZSwgXCItZW5kXCIpLCBpc0VuZFtpXSksIF9jbGFzc05hbWVzKSlcbiAgICB9KSk7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIixcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5kZW50XCIpXG4gIH0sIGxpc3QpO1xufTtcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9SZWFjdC5tZW1vKEluZGVudCk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX2NyZWF0ZVN1cGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlclwiO1xudmFyIF9leGNsdWRlZCA9IFtcImV2ZW50S2V5XCIsIFwiY2xhc3NOYW1lXCIsIFwic3R5bGVcIiwgXCJkcmFnT3ZlclwiLCBcImRyYWdPdmVyR2FwVG9wXCIsIFwiZHJhZ092ZXJHYXBCb3R0b21cIiwgXCJpc0xlYWZcIiwgXCJpc1N0YXJ0XCIsIFwiaXNFbmRcIiwgXCJleHBhbmRlZFwiLCBcInNlbGVjdGVkXCIsIFwiY2hlY2tlZFwiLCBcImhhbGZDaGVja2VkXCIsIFwibG9hZGluZ1wiLCBcImRvbVJlZlwiLCBcImFjdGl2ZVwiLCBcImRhdGFcIiwgXCJvbk1vdXNlTW92ZVwiLCBcInNlbGVjdGFibGVcIl07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBwaWNrQXR0cnMgZnJvbSBcInJjLXV0aWwvZXMvcGlja0F0dHJzXCI7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBUcmVlQ29udGV4dCB9IGZyb20gJy4vY29udGV4dFR5cGVzJztcbmltcG9ydCBJbmRlbnQgZnJvbSAnLi9JbmRlbnQnO1xuaW1wb3J0IHsgY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhIH0gZnJvbSAnLi91dGlscy90cmVlVXRpbCc7XG52YXIgSUNPTl9PUEVOID0gJ29wZW4nO1xudmFyIElDT05fQ0xPU0UgPSAnY2xvc2UnO1xudmFyIGRlZmF1bHRUaXRsZSA9ICctLS0nO1xudmFyIEludGVybmFsVHJlZU5vZGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKEludGVybmFsVHJlZU5vZGUsIF9SZWFjdCRDb21wb25lbnQpO1xuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKEludGVybmFsVHJlZU5vZGUpO1xuICBmdW5jdGlvbiBJbnRlcm5hbFRyZWVOb2RlKCkge1xuICAgIHZhciBfdGhpcztcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSW50ZXJuYWxUcmVlTm9kZSk7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsLmFwcGx5KF9zdXBlciwgW3RoaXNdLmNvbmNhdChhcmdzKSk7XG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBkcmFnTm9kZUhpZ2hsaWdodDogZmFsc2VcbiAgICB9O1xuICAgIF90aGlzLnNlbGVjdEhhbmRsZSA9IHZvaWQgMDtcbiAgICBfdGhpcy5vblNlbGVjdG9yQ2xpY2sgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgLy8gQ2xpY2sgdHJpZ2dlciBiZWZvcmUgc2VsZWN0L2NoZWNrIG9wZXJhdGlvblxuICAgICAgdmFyIG9uTm9kZUNsaWNrID0gX3RoaXMucHJvcHMuY29udGV4dC5vbk5vZGVDbGljaztcbiAgICAgIG9uTm9kZUNsaWNrKGUsIGNvbnZlcnROb2RlUHJvcHNUb0V2ZW50RGF0YShfdGhpcy5wcm9wcykpO1xuICAgICAgaWYgKF90aGlzLmlzU2VsZWN0YWJsZSgpKSB7XG4gICAgICAgIF90aGlzLm9uU2VsZWN0KGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMub25DaGVjayhlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIF90aGlzLm9uU2VsZWN0b3JEb3VibGVDbGljayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgb25Ob2RlRG91YmxlQ2xpY2sgPSBfdGhpcy5wcm9wcy5jb250ZXh0Lm9uTm9kZURvdWJsZUNsaWNrO1xuICAgICAgb25Ob2RlRG91YmxlQ2xpY2soZSwgY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhKF90aGlzLnByb3BzKSk7XG4gICAgfTtcbiAgICBfdGhpcy5vblNlbGVjdCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoX3RoaXMuaXNEaXNhYmxlZCgpKSByZXR1cm47XG4gICAgICB2YXIgb25Ob2RlU2VsZWN0ID0gX3RoaXMucHJvcHMuY29udGV4dC5vbk5vZGVTZWxlY3Q7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBvbk5vZGVTZWxlY3QoZSwgY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhKF90aGlzLnByb3BzKSk7XG4gICAgfTtcbiAgICBfdGhpcy5vbkNoZWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChfdGhpcy5pc0Rpc2FibGVkKCkpIHJldHVybjtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICBkaXNhYmxlQ2hlY2tib3ggPSBfdGhpcyRwcm9wcy5kaXNhYmxlQ2hlY2tib3gsXG4gICAgICAgIGNoZWNrZWQgPSBfdGhpcyRwcm9wcy5jaGVja2VkO1xuICAgICAgdmFyIG9uTm9kZUNoZWNrID0gX3RoaXMucHJvcHMuY29udGV4dC5vbk5vZGVDaGVjaztcbiAgICAgIGlmICghX3RoaXMuaXNDaGVja2FibGUoKSB8fCBkaXNhYmxlQ2hlY2tib3gpIHJldHVybjtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHZhciB0YXJnZXRDaGVja2VkID0gIWNoZWNrZWQ7XG4gICAgICBvbk5vZGVDaGVjayhlLCBjb252ZXJ0Tm9kZVByb3BzVG9FdmVudERhdGEoX3RoaXMucHJvcHMpLCB0YXJnZXRDaGVja2VkKTtcbiAgICB9O1xuICAgIF90aGlzLm9uTW91c2VFbnRlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgb25Ob2RlTW91c2VFbnRlciA9IF90aGlzLnByb3BzLmNvbnRleHQub25Ob2RlTW91c2VFbnRlcjtcbiAgICAgIG9uTm9kZU1vdXNlRW50ZXIoZSwgY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhKF90aGlzLnByb3BzKSk7XG4gICAgfTtcbiAgICBfdGhpcy5vbk1vdXNlTGVhdmUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIG9uTm9kZU1vdXNlTGVhdmUgPSBfdGhpcy5wcm9wcy5jb250ZXh0Lm9uTm9kZU1vdXNlTGVhdmU7XG4gICAgICBvbk5vZGVNb3VzZUxlYXZlKGUsIGNvbnZlcnROb2RlUHJvcHNUb0V2ZW50RGF0YShfdGhpcy5wcm9wcykpO1xuICAgIH07XG4gICAgX3RoaXMub25Db250ZXh0TWVudSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgb25Ob2RlQ29udGV4dE1lbnUgPSBfdGhpcy5wcm9wcy5jb250ZXh0Lm9uTm9kZUNvbnRleHRNZW51O1xuICAgICAgb25Ob2RlQ29udGV4dE1lbnUoZSwgY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhKF90aGlzLnByb3BzKSk7XG4gICAgfTtcbiAgICBfdGhpcy5vbkRyYWdTdGFydCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgb25Ob2RlRHJhZ1N0YXJ0ID0gX3RoaXMucHJvcHMuY29udGV4dC5vbk5vZGVEcmFnU3RhcnQ7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBkcmFnTm9kZUhpZ2hsaWdodDogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBvbk5vZGVEcmFnU3RhcnQoZSwgX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gaWUgdGhyb3cgZXJyb3JcbiAgICAgICAgLy8gZmlyZWZveC1uZWVkLWl0XG4gICAgICAgIGUuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RleHQvcGxhaW4nLCAnJyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBlbXB0eVxuICAgICAgfVxuICAgIH07XG4gICAgX3RoaXMub25EcmFnRW50ZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIG9uTm9kZURyYWdFbnRlciA9IF90aGlzLnByb3BzLmNvbnRleHQub25Ob2RlRHJhZ0VudGVyO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIG9uTm9kZURyYWdFbnRlcihlLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgfTtcbiAgICBfdGhpcy5vbkRyYWdPdmVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBvbk5vZGVEcmFnT3ZlciA9IF90aGlzLnByb3BzLmNvbnRleHQub25Ob2RlRHJhZ092ZXI7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgb25Ob2RlRHJhZ092ZXIoZSwgX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgIH07XG4gICAgX3RoaXMub25EcmFnTGVhdmUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIG9uTm9kZURyYWdMZWF2ZSA9IF90aGlzLnByb3BzLmNvbnRleHQub25Ob2RlRHJhZ0xlYXZlO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIG9uTm9kZURyYWdMZWF2ZShlLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgfTtcbiAgICBfdGhpcy5vbkRyYWdFbmQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIG9uTm9kZURyYWdFbmQgPSBfdGhpcy5wcm9wcy5jb250ZXh0Lm9uTm9kZURyYWdFbmQ7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBkcmFnTm9kZUhpZ2hsaWdodDogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgb25Ob2RlRHJhZ0VuZChlLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgfTtcbiAgICBfdGhpcy5vbkRyb3AgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIG9uTm9kZURyb3AgPSBfdGhpcy5wcm9wcy5jb250ZXh0Lm9uTm9kZURyb3A7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBkcmFnTm9kZUhpZ2hsaWdodDogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgb25Ob2RlRHJvcChlLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgfTtcbiAgICAvLyBEaXNhYmxlZCBpdGVtIHN0aWxsIGNhbiBiZSBzd2l0Y2hcbiAgICBfdGhpcy5vbkV4cGFuZCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gX3RoaXMucHJvcHMsXG4gICAgICAgIGxvYWRpbmcgPSBfdGhpcyRwcm9wczIubG9hZGluZyxcbiAgICAgICAgb25Ob2RlRXhwYW5kID0gX3RoaXMkcHJvcHMyLmNvbnRleHQub25Ob2RlRXhwYW5kO1xuICAgICAgaWYgKGxvYWRpbmcpIHJldHVybjtcbiAgICAgIG9uTm9kZUV4cGFuZChlLCBjb252ZXJ0Tm9kZVByb3BzVG9FdmVudERhdGEoX3RoaXMucHJvcHMpKTtcbiAgICB9O1xuICAgIC8vIERyYWcgdXNhZ2VcbiAgICBfdGhpcy5zZXRTZWxlY3RIYW5kbGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgX3RoaXMuc2VsZWN0SGFuZGxlID0gbm9kZTtcbiAgICB9O1xuICAgIF90aGlzLmdldE5vZGVTdGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBleHBhbmRlZCA9IF90aGlzLnByb3BzLmV4cGFuZGVkO1xuICAgICAgaWYgKF90aGlzLmlzTGVhZigpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGV4cGFuZGVkID8gSUNPTl9PUEVOIDogSUNPTl9DTE9TRTtcbiAgICB9O1xuICAgIF90aGlzLmhhc0NoaWxkcmVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGV2ZW50S2V5ID0gX3RoaXMucHJvcHMuZXZlbnRLZXk7XG4gICAgICB2YXIga2V5RW50aXRpZXMgPSBfdGhpcy5wcm9wcy5jb250ZXh0LmtleUVudGl0aWVzO1xuICAgICAgdmFyIF9yZWYgPSBrZXlFbnRpdGllc1tldmVudEtleV0gfHwge30sXG4gICAgICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgICAgIHJldHVybiAhIShjaGlsZHJlbiB8fCBbXSkubGVuZ3RoO1xuICAgIH07XG4gICAgX3RoaXMuaXNMZWFmID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMyA9IF90aGlzLnByb3BzLFxuICAgICAgICBpc0xlYWYgPSBfdGhpcyRwcm9wczMuaXNMZWFmLFxuICAgICAgICBsb2FkZWQgPSBfdGhpcyRwcm9wczMubG9hZGVkO1xuICAgICAgdmFyIGxvYWREYXRhID0gX3RoaXMucHJvcHMuY29udGV4dC5sb2FkRGF0YTtcbiAgICAgIHZhciBoYXNDaGlsZHJlbiA9IF90aGlzLmhhc0NoaWxkcmVuKCk7XG4gICAgICBpZiAoaXNMZWFmID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNMZWFmIHx8ICFsb2FkRGF0YSAmJiAhaGFzQ2hpbGRyZW4gfHwgbG9hZERhdGEgJiYgbG9hZGVkICYmICFoYXNDaGlsZHJlbjtcbiAgICB9O1xuICAgIF90aGlzLmlzRGlzYWJsZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZGlzYWJsZWQgPSBfdGhpcy5wcm9wcy5kaXNhYmxlZDtcbiAgICAgIHZhciB0cmVlRGlzYWJsZWQgPSBfdGhpcy5wcm9wcy5jb250ZXh0LmRpc2FibGVkO1xuICAgICAgcmV0dXJuICEhKHRyZWVEaXNhYmxlZCB8fCBkaXNhYmxlZCk7XG4gICAgfTtcbiAgICBfdGhpcy5pc0NoZWNrYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBjaGVja2FibGUgPSBfdGhpcy5wcm9wcy5jaGVja2FibGU7XG4gICAgICB2YXIgdHJlZUNoZWNrYWJsZSA9IF90aGlzLnByb3BzLmNvbnRleHQuY2hlY2thYmxlO1xuICAgICAgLy8gUmV0dXJuIGZhbHNlIGlmIHRyZWUgb3IgdHJlZU5vZGUgaXMgbm90IGNoZWNrYWJsZVxuICAgICAgaWYgKCF0cmVlQ2hlY2thYmxlIHx8IGNoZWNrYWJsZSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cmVlQ2hlY2thYmxlO1xuICAgIH07XG4gICAgLy8gTG9hZCBkYXRhIHRvIGF2b2lkIGRlZmF1bHQgZXhwYW5kZWQgdHJlZSB3aXRob3V0IGRhdGFcbiAgICBfdGhpcy5zeW5jTG9hZERhdGEgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICAgIHZhciBleHBhbmRlZCA9IHByb3BzLmV4cGFuZGVkLFxuICAgICAgICBsb2FkaW5nID0gcHJvcHMubG9hZGluZyxcbiAgICAgICAgbG9hZGVkID0gcHJvcHMubG9hZGVkO1xuICAgICAgdmFyIF90aGlzJHByb3BzJGNvbnRleHQgPSBfdGhpcy5wcm9wcy5jb250ZXh0LFxuICAgICAgICBsb2FkRGF0YSA9IF90aGlzJHByb3BzJGNvbnRleHQubG9hZERhdGEsXG4gICAgICAgIG9uTm9kZUxvYWQgPSBfdGhpcyRwcm9wcyRjb250ZXh0Lm9uTm9kZUxvYWQ7XG4gICAgICBpZiAobG9hZGluZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyByZWFkIGZyb20gc3RhdGUgdG8gYXZvaWQgbG9hZERhdGEgYXQgc2FtZSB0aW1lXG4gICAgICBpZiAobG9hZERhdGEgJiYgZXhwYW5kZWQgJiYgIV90aGlzLmlzTGVhZigpKSB7XG4gICAgICAgIC8vIFdlIG5lZWRuJ3QgcmVsb2FkIGRhdGEgd2hlbiBoYXMgY2hpbGRyZW4gaW4gc3luYyBsb2dpY1xuICAgICAgICAvLyBJdCdzIG9ubHkgbmVlZGVkIGluIG5vZGUgZXhwYW5kZWRcbiAgICAgICAgaWYgKCFfdGhpcy5oYXNDaGlsZHJlbigpICYmICFsb2FkZWQpIHtcbiAgICAgICAgICBvbk5vZGVMb2FkKGNvbnZlcnROb2RlUHJvcHNUb0V2ZW50RGF0YShfdGhpcy5wcm9wcykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBfdGhpcy5pc0RyYWdnYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczQgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgZGF0YSA9IF90aGlzJHByb3BzNC5kYXRhLFxuICAgICAgICBkcmFnZ2FibGUgPSBfdGhpcyRwcm9wczQuY29udGV4dC5kcmFnZ2FibGU7XG4gICAgICByZXR1cm4gISEoZHJhZ2dhYmxlICYmICghZHJhZ2dhYmxlLm5vZGVEcmFnZ2FibGUgfHwgZHJhZ2dhYmxlLm5vZGVEcmFnZ2FibGUoZGF0YSkpKTtcbiAgICB9O1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09IFJlbmRlcjogRHJhZyBIYW5kbGVyID09PT09PT09PT09PT09PT09PT09XG4gICAgX3RoaXMucmVuZGVyRHJhZ0hhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMkY29udGV4dDIgPSBfdGhpcy5wcm9wcy5jb250ZXh0LFxuICAgICAgICBkcmFnZ2FibGUgPSBfdGhpcyRwcm9wcyRjb250ZXh0Mi5kcmFnZ2FibGUsXG4gICAgICAgIHByZWZpeENscyA9IF90aGlzJHByb3BzJGNvbnRleHQyLnByZWZpeENscztcbiAgICAgIHJldHVybiAoZHJhZ2dhYmxlID09PSBudWxsIHx8IGRyYWdnYWJsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZHJhZ2dhYmxlLmljb24pID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRyYWdnYWJsZS1pY29uXCIpXG4gICAgICB9LCBkcmFnZ2FibGUuaWNvbikgOiBudWxsO1xuICAgIH07XG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXI6IFN3aXRjaGVyID09PT09PT09PT09PT09PT09PT09PT1cbiAgICBfdGhpcy5yZW5kZXJTd2l0Y2hlckljb25Eb20gPSBmdW5jdGlvbiAoaXNMZWFmKSB7XG4gICAgICB2YXIgc3dpdGNoZXJJY29uRnJvbVByb3BzID0gX3RoaXMucHJvcHMuc3dpdGNoZXJJY29uO1xuICAgICAgdmFyIHN3aXRjaGVySWNvbkZyb21DdHggPSBfdGhpcy5wcm9wcy5jb250ZXh0LnN3aXRjaGVySWNvbjtcbiAgICAgIHZhciBzd2l0Y2hlckljb24gPSBzd2l0Y2hlckljb25Gcm9tUHJvcHMgfHwgc3dpdGNoZXJJY29uRnJvbUN0eDtcbiAgICAgIC8vIGlmIHN3aXRjaGVySWNvbkRvbSBpcyBudWxsLCBubyByZW5kZXIgc3dpdGNoZXIgc3BhblxuICAgICAgaWYgKHR5cGVvZiBzd2l0Y2hlckljb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHN3aXRjaGVySWNvbihfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIF90aGlzLnByb3BzKSwge30sIHtcbiAgICAgICAgICBpc0xlYWY6IGlzTGVhZlxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3dpdGNoZXJJY29uO1xuICAgIH07XG4gICAgLy8gU3dpdGNoZXJcbiAgICBfdGhpcy5yZW5kZXJTd2l0Y2hlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBleHBhbmRlZCA9IF90aGlzLnByb3BzLmV4cGFuZGVkO1xuICAgICAgdmFyIHByZWZpeENscyA9IF90aGlzLnByb3BzLmNvbnRleHQucHJlZml4Q2xzO1xuICAgICAgaWYgKF90aGlzLmlzTGVhZigpKSB7XG4gICAgICAgIC8vIGlmIHN3aXRjaGVySWNvbkRvbSBpcyBudWxsLCBubyByZW5kZXIgc3dpdGNoZXIgc3BhblxuICAgICAgICB2YXIgX3N3aXRjaGVySWNvbkRvbSA9IF90aGlzLnJlbmRlclN3aXRjaGVySWNvbkRvbSh0cnVlKTtcbiAgICAgICAgcmV0dXJuIF9zd2l0Y2hlckljb25Eb20gIT09IGZhbHNlID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zd2l0Y2hlclwiKSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zd2l0Y2hlci1ub29wXCIpKVxuICAgICAgICB9LCBfc3dpdGNoZXJJY29uRG9tKSA6IG51bGw7XG4gICAgICB9XG4gICAgICB2YXIgc3dpdGNoZXJDbHMgPSBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3dpdGNoZXJcIiksIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3dpdGNoZXJfXCIpLmNvbmNhdChleHBhbmRlZCA/IElDT05fT1BFTiA6IElDT05fQ0xPU0UpKTtcbiAgICAgIHZhciBzd2l0Y2hlckljb25Eb20gPSBfdGhpcy5yZW5kZXJTd2l0Y2hlckljb25Eb20oZmFsc2UpO1xuICAgICAgcmV0dXJuIHN3aXRjaGVySWNvbkRvbSAhPT0gZmFsc2UgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBvbkNsaWNrOiBfdGhpcy5vbkV4cGFuZCxcbiAgICAgICAgY2xhc3NOYW1lOiBzd2l0Y2hlckNsc1xuICAgICAgfSwgc3dpdGNoZXJJY29uRG9tKSA6IG51bGw7XG4gICAgfTtcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09IFJlbmRlcjogQ2hlY2tib3ggPT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIENoZWNrYm94XG4gICAgX3RoaXMucmVuZGVyQ2hlY2tib3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM1ID0gX3RoaXMucHJvcHMsXG4gICAgICAgIGNoZWNrZWQgPSBfdGhpcyRwcm9wczUuY2hlY2tlZCxcbiAgICAgICAgaGFsZkNoZWNrZWQgPSBfdGhpcyRwcm9wczUuaGFsZkNoZWNrZWQsXG4gICAgICAgIGRpc2FibGVDaGVja2JveCA9IF90aGlzJHByb3BzNS5kaXNhYmxlQ2hlY2tib3g7XG4gICAgICB2YXIgcHJlZml4Q2xzID0gX3RoaXMucHJvcHMuY29udGV4dC5wcmVmaXhDbHM7XG4gICAgICB2YXIgZGlzYWJsZWQgPSBfdGhpcy5pc0Rpc2FibGVkKCk7XG4gICAgICB2YXIgY2hlY2thYmxlID0gX3RoaXMuaXNDaGVja2FibGUoKTtcbiAgICAgIGlmICghY2hlY2thYmxlKSByZXR1cm4gbnVsbDtcbiAgICAgIC8vIFtMZWdhY3ldIEN1c3RvbSBlbGVtZW50IHNob3VsZCBiZSBzZXBhcmF0ZSB3aXRoIGBjaGVja2FibGVgIGluIGZ1dHVyZVxuICAgICAgdmFyICRjdXN0b20gPSB0eXBlb2YgY2hlY2thYmxlICE9PSAnYm9vbGVhbicgPyBjaGVja2FibGUgOiBudWxsO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNoZWNrYm94XCIpLCBjaGVja2VkICYmIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2hlY2tib3gtY2hlY2tlZFwiKSwgIWNoZWNrZWQgJiYgaGFsZkNoZWNrZWQgJiYgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jaGVja2JveC1pbmRldGVybWluYXRlXCIpLCAoZGlzYWJsZWQgfHwgZGlzYWJsZUNoZWNrYm94KSAmJiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNoZWNrYm94LWRpc2FibGVkXCIpKSxcbiAgICAgICAgb25DbGljazogX3RoaXMub25DaGVja1xuICAgICAgfSwgJGN1c3RvbSk7XG4gICAgfTtcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PSBSZW5kZXI6IFRpdGxlICsgSWNvbiA9PT09PT09PT09PT09PT09PT09PVxuICAgIF90aGlzLnJlbmRlckljb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbG9hZGluZyA9IF90aGlzLnByb3BzLmxvYWRpbmc7XG4gICAgICB2YXIgcHJlZml4Q2xzID0gX3RoaXMucHJvcHMuY29udGV4dC5wcmVmaXhDbHM7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaWNvbkVsZVwiKSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pY29uX19cIikuY29uY2F0KF90aGlzLmdldE5vZGVTdGF0ZSgpIHx8ICdkb2N1JyksIGxvYWRpbmcgJiYgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pY29uX2xvYWRpbmdcIikpXG4gICAgICB9KTtcbiAgICB9O1xuICAgIC8vIEljb24gKyBUaXRsZVxuICAgIF90aGlzLnJlbmRlclNlbGVjdG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGRyYWdOb2RlSGlnaGxpZ2h0ID0gX3RoaXMuc3RhdGUuZHJhZ05vZGVIaWdobGlnaHQ7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM2ID0gX3RoaXMucHJvcHMsXG4gICAgICAgIF90aGlzJHByb3BzNiR0aXRsZSA9IF90aGlzJHByb3BzNi50aXRsZSxcbiAgICAgICAgdGl0bGUgPSBfdGhpcyRwcm9wczYkdGl0bGUgPT09IHZvaWQgMCA/IGRlZmF1bHRUaXRsZSA6IF90aGlzJHByb3BzNiR0aXRsZSxcbiAgICAgICAgc2VsZWN0ZWQgPSBfdGhpcyRwcm9wczYuc2VsZWN0ZWQsXG4gICAgICAgIGljb24gPSBfdGhpcyRwcm9wczYuaWNvbixcbiAgICAgICAgbG9hZGluZyA9IF90aGlzJHByb3BzNi5sb2FkaW5nLFxuICAgICAgICBkYXRhID0gX3RoaXMkcHJvcHM2LmRhdGE7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMkY29udGV4dDMgPSBfdGhpcy5wcm9wcy5jb250ZXh0LFxuICAgICAgICBwcmVmaXhDbHMgPSBfdGhpcyRwcm9wcyRjb250ZXh0My5wcmVmaXhDbHMsXG4gICAgICAgIHNob3dJY29uID0gX3RoaXMkcHJvcHMkY29udGV4dDMuc2hvd0ljb24sXG4gICAgICAgIHRyZWVJY29uID0gX3RoaXMkcHJvcHMkY29udGV4dDMuaWNvbixcbiAgICAgICAgbG9hZERhdGEgPSBfdGhpcyRwcm9wcyRjb250ZXh0My5sb2FkRGF0YSxcbiAgICAgICAgdGl0bGVSZW5kZXIgPSBfdGhpcyRwcm9wcyRjb250ZXh0My50aXRsZVJlbmRlcjtcbiAgICAgIHZhciBkaXNhYmxlZCA9IF90aGlzLmlzRGlzYWJsZWQoKTtcbiAgICAgIHZhciB3cmFwQ2xhc3MgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW5vZGUtY29udGVudC13cmFwcGVyXCIpO1xuICAgICAgLy8gSWNvbiAtIFN0aWxsIHNob3cgbG9hZGluZyBpY29uIHdoZW4gbG9hZGluZyB3aXRob3V0IHNob3dJY29uXG4gICAgICB2YXIgJGljb247XG4gICAgICBpZiAoc2hvd0ljb24pIHtcbiAgICAgICAgdmFyIGN1cnJlbnRJY29uID0gaWNvbiB8fCB0cmVlSWNvbjtcbiAgICAgICAgJGljb24gPSBjdXJyZW50SWNvbiA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaWNvbkVsZVwiKSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pY29uX19jdXN0b21pemVcIikpXG4gICAgICAgIH0sIHR5cGVvZiBjdXJyZW50SWNvbiA9PT0gJ2Z1bmN0aW9uJyA/IGN1cnJlbnRJY29uKF90aGlzLnByb3BzKSA6IGN1cnJlbnRJY29uKSA6IF90aGlzLnJlbmRlckljb24oKTtcbiAgICAgIH0gZWxzZSBpZiAobG9hZERhdGEgJiYgbG9hZGluZykge1xuICAgICAgICAkaWNvbiA9IF90aGlzLnJlbmRlckljb24oKTtcbiAgICAgIH1cbiAgICAgIC8vIFRpdGxlXG4gICAgICB2YXIgdGl0bGVOb2RlO1xuICAgICAgaWYgKHR5cGVvZiB0aXRsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aXRsZU5vZGUgPSB0aXRsZShkYXRhKTtcbiAgICAgIH0gZWxzZSBpZiAodGl0bGVSZW5kZXIpIHtcbiAgICAgICAgdGl0bGVOb2RlID0gdGl0bGVSZW5kZXIoZGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aXRsZU5vZGUgPSB0aXRsZTtcbiAgICAgIH1cbiAgICAgIHZhciAkdGl0bGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdGl0bGVcIilcbiAgICAgIH0sIHRpdGxlTm9kZSk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgcmVmOiBfdGhpcy5zZXRTZWxlY3RIYW5kbGUsXG4gICAgICAgIHRpdGxlOiB0eXBlb2YgdGl0bGUgPT09ICdzdHJpbmcnID8gdGl0bGUgOiAnJyxcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHdyYXBDbGFzcyksIFwiXCIuY29uY2F0KHdyYXBDbGFzcywgXCItXCIpLmNvbmNhdChfdGhpcy5nZXROb2RlU3RhdGUoKSB8fCAnbm9ybWFsJyksICFkaXNhYmxlZCAmJiAoc2VsZWN0ZWQgfHwgZHJhZ05vZGVIaWdobGlnaHQpICYmIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbm9kZS1zZWxlY3RlZFwiKSksXG4gICAgICAgIG9uTW91c2VFbnRlcjogX3RoaXMub25Nb3VzZUVudGVyLFxuICAgICAgICBvbk1vdXNlTGVhdmU6IF90aGlzLm9uTW91c2VMZWF2ZSxcbiAgICAgICAgb25Db250ZXh0TWVudTogX3RoaXMub25Db250ZXh0TWVudSxcbiAgICAgICAgb25DbGljazogX3RoaXMub25TZWxlY3RvckNsaWNrLFxuICAgICAgICBvbkRvdWJsZUNsaWNrOiBfdGhpcy5vblNlbGVjdG9yRG91YmxlQ2xpY2tcbiAgICAgIH0sICRpY29uLCAkdGl0bGUsIF90aGlzLnJlbmRlckRyb3BJbmRpY2F0b3IoKSk7XG4gICAgfTtcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09IFJlbmRlcjogRHJvcCBJbmRpY2F0b3IgPT09PT09PT09PT09PT09PT09PVxuICAgIF90aGlzLnJlbmRlckRyb3BJbmRpY2F0b3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM3ID0gX3RoaXMucHJvcHMsXG4gICAgICAgIGRpc2FibGVkID0gX3RoaXMkcHJvcHM3LmRpc2FibGVkLFxuICAgICAgICBldmVudEtleSA9IF90aGlzJHByb3BzNy5ldmVudEtleTtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyRjb250ZXh0NCA9IF90aGlzLnByb3BzLmNvbnRleHQsXG4gICAgICAgIGRyYWdnYWJsZSA9IF90aGlzJHByb3BzJGNvbnRleHQ0LmRyYWdnYWJsZSxcbiAgICAgICAgZHJvcExldmVsT2Zmc2V0ID0gX3RoaXMkcHJvcHMkY29udGV4dDQuZHJvcExldmVsT2Zmc2V0LFxuICAgICAgICBkcm9wUG9zaXRpb24gPSBfdGhpcyRwcm9wcyRjb250ZXh0NC5kcm9wUG9zaXRpb24sXG4gICAgICAgIHByZWZpeENscyA9IF90aGlzJHByb3BzJGNvbnRleHQ0LnByZWZpeENscyxcbiAgICAgICAgaW5kZW50ID0gX3RoaXMkcHJvcHMkY29udGV4dDQuaW5kZW50LFxuICAgICAgICBkcm9wSW5kaWNhdG9yUmVuZGVyID0gX3RoaXMkcHJvcHMkY29udGV4dDQuZHJvcEluZGljYXRvclJlbmRlcixcbiAgICAgICAgZHJhZ092ZXJOb2RlS2V5ID0gX3RoaXMkcHJvcHMkY29udGV4dDQuZHJhZ092ZXJOb2RlS2V5LFxuICAgICAgICBkaXJlY3Rpb24gPSBfdGhpcyRwcm9wcyRjb250ZXh0NC5kaXJlY3Rpb247XG4gICAgICB2YXIgcm9vdERyYWdnYWJsZSA9ICEhZHJhZ2dhYmxlO1xuICAgICAgLy8gYWxsb3dEcm9wIGlzIGNhbGN1bGF0ZWQgaW4gVHJlZS50c3gsIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGNhbGMgaXQgaGVyZVxuICAgICAgdmFyIHNob3dJbmRpY2F0b3IgPSAhZGlzYWJsZWQgJiYgcm9vdERyYWdnYWJsZSAmJiBkcmFnT3Zlck5vZGVLZXkgPT09IGV2ZW50S2V5O1xuICAgICAgcmV0dXJuIHNob3dJbmRpY2F0b3IgPyBkcm9wSW5kaWNhdG9yUmVuZGVyKHtcbiAgICAgICAgZHJvcFBvc2l0aW9uOiBkcm9wUG9zaXRpb24sXG4gICAgICAgIGRyb3BMZXZlbE9mZnNldDogZHJvcExldmVsT2Zmc2V0LFxuICAgICAgICBpbmRlbnQ6IGluZGVudCxcbiAgICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uXG4gICAgICB9KSA6IG51bGw7XG4gICAgfTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgX2NyZWF0ZUNsYXNzKEludGVybmFsVHJlZU5vZGUsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6XG4gICAgLy8gSXNvbW9ycGhpYyBuZWVkbid0IGxvYWQgZGF0YSBpbiBzZXJ2ZXIgc2lkZVxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5zeW5jTG9hZERhdGEodGhpcy5wcm9wcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudERpZFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgICB0aGlzLnN5bmNMb2FkRGF0YSh0aGlzLnByb3BzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNTZWxlY3RhYmxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzU2VsZWN0YWJsZSgpIHtcbiAgICAgIHZhciBzZWxlY3RhYmxlID0gdGhpcy5wcm9wcy5zZWxlY3RhYmxlO1xuICAgICAgdmFyIHRyZWVTZWxlY3RhYmxlID0gdGhpcy5wcm9wcy5jb250ZXh0LnNlbGVjdGFibGU7XG4gICAgICAvLyBJZ25vcmUgd2hlbiBzZWxlY3RhYmxlIGlzIHVuZGVmaW5lZCBvciBudWxsXG4gICAgICBpZiAodHlwZW9mIHNlbGVjdGFibGUgPT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm4gc2VsZWN0YWJsZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cmVlU2VsZWN0YWJsZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6XG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX2NsYXNzTmFtZXM7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM4ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgZXZlbnRLZXkgPSBfdGhpcyRwcm9wczguZXZlbnRLZXksXG4gICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzOC5jbGFzc05hbWUsXG4gICAgICAgIHN0eWxlID0gX3RoaXMkcHJvcHM4LnN0eWxlLFxuICAgICAgICBkcmFnT3ZlciA9IF90aGlzJHByb3BzOC5kcmFnT3ZlcixcbiAgICAgICAgZHJhZ092ZXJHYXBUb3AgPSBfdGhpcyRwcm9wczguZHJhZ092ZXJHYXBUb3AsXG4gICAgICAgIGRyYWdPdmVyR2FwQm90dG9tID0gX3RoaXMkcHJvcHM4LmRyYWdPdmVyR2FwQm90dG9tLFxuICAgICAgICBpc0xlYWYgPSBfdGhpcyRwcm9wczguaXNMZWFmLFxuICAgICAgICBpc1N0YXJ0ID0gX3RoaXMkcHJvcHM4LmlzU3RhcnQsXG4gICAgICAgIGlzRW5kID0gX3RoaXMkcHJvcHM4LmlzRW5kLFxuICAgICAgICBleHBhbmRlZCA9IF90aGlzJHByb3BzOC5leHBhbmRlZCxcbiAgICAgICAgc2VsZWN0ZWQgPSBfdGhpcyRwcm9wczguc2VsZWN0ZWQsXG4gICAgICAgIGNoZWNrZWQgPSBfdGhpcyRwcm9wczguY2hlY2tlZCxcbiAgICAgICAgaGFsZkNoZWNrZWQgPSBfdGhpcyRwcm9wczguaGFsZkNoZWNrZWQsXG4gICAgICAgIGxvYWRpbmcgPSBfdGhpcyRwcm9wczgubG9hZGluZyxcbiAgICAgICAgZG9tUmVmID0gX3RoaXMkcHJvcHM4LmRvbVJlZixcbiAgICAgICAgYWN0aXZlID0gX3RoaXMkcHJvcHM4LmFjdGl2ZSxcbiAgICAgICAgZGF0YSA9IF90aGlzJHByb3BzOC5kYXRhLFxuICAgICAgICBvbk1vdXNlTW92ZSA9IF90aGlzJHByb3BzOC5vbk1vdXNlTW92ZSxcbiAgICAgICAgc2VsZWN0YWJsZSA9IF90aGlzJHByb3BzOC5zZWxlY3RhYmxlLFxuICAgICAgICBvdGhlclByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF90aGlzJHByb3BzOCwgX2V4Y2x1ZGVkKTtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyRjb250ZXh0NSA9IHRoaXMucHJvcHMuY29udGV4dCxcbiAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkcHJvcHMkY29udGV4dDUucHJlZml4Q2xzLFxuICAgICAgICBmaWx0ZXJUcmVlTm9kZSA9IF90aGlzJHByb3BzJGNvbnRleHQ1LmZpbHRlclRyZWVOb2RlLFxuICAgICAgICBrZXlFbnRpdGllcyA9IF90aGlzJHByb3BzJGNvbnRleHQ1LmtleUVudGl0aWVzLFxuICAgICAgICBkcm9wQ29udGFpbmVyS2V5ID0gX3RoaXMkcHJvcHMkY29udGV4dDUuZHJvcENvbnRhaW5lcktleSxcbiAgICAgICAgZHJvcFRhcmdldEtleSA9IF90aGlzJHByb3BzJGNvbnRleHQ1LmRyb3BUYXJnZXRLZXksXG4gICAgICAgIGRyYWdnaW5nTm9kZUtleSA9IF90aGlzJHByb3BzJGNvbnRleHQ1LmRyYWdnaW5nTm9kZUtleTtcbiAgICAgIHZhciBkaXNhYmxlZCA9IHRoaXMuaXNEaXNhYmxlZCgpO1xuICAgICAgdmFyIGRhdGFPckFyaWFBdHRyaWJ1dGVQcm9wcyA9IHBpY2tBdHRycyhvdGhlclByb3BzLCB7XG4gICAgICAgIGFyaWE6IHRydWUsXG4gICAgICAgIGRhdGE6IHRydWVcbiAgICAgIH0pO1xuICAgICAgdmFyIF9yZWYyID0ga2V5RW50aXRpZXNbZXZlbnRLZXldIHx8IHt9LFxuICAgICAgICBsZXZlbCA9IF9yZWYyLmxldmVsO1xuICAgICAgdmFyIGlzRW5kTm9kZSA9IGlzRW5kW2lzRW5kLmxlbmd0aCAtIDFdO1xuICAgICAgdmFyIG1lcmdlZERyYWdnYWJsZSA9IHRoaXMuaXNEcmFnZ2FibGUoKTtcbiAgICAgIHZhciBkcmFnZ2FibGVXaXRob3V0RGlzYWJsZWQgPSAhZGlzYWJsZWQgJiYgbWVyZ2VkRHJhZ2dhYmxlO1xuICAgICAgdmFyIGRyYWdnaW5nID0gZHJhZ2dpbmdOb2RlS2V5ID09PSBldmVudEtleTtcbiAgICAgIHZhciBhcmlhU2VsZWN0ZWQgPSBzZWxlY3RhYmxlICE9PSB1bmRlZmluZWQgPyB7XG4gICAgICAgICdhcmlhLXNlbGVjdGVkJzogISFzZWxlY3RhYmxlXG4gICAgICB9IDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICAgICAgcmVmOiBkb21SZWYsXG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdHJlZW5vZGVcIiksIChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdHJlZW5vZGUtZGlzYWJsZWRcIiksIGRpc2FibGVkKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRyZWVub2RlLXN3aXRjaGVyLVwiKS5jb25jYXQoZXhwYW5kZWQgPyAnb3BlbicgOiAnY2xvc2UnKSwgIWlzTGVhZiksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10cmVlbm9kZS1jaGVja2JveC1jaGVja2VkXCIpLCBjaGVja2VkKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRyZWVub2RlLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVcIiksIGhhbGZDaGVja2VkKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRyZWVub2RlLXNlbGVjdGVkXCIpLCBzZWxlY3RlZCksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10cmVlbm9kZS1sb2FkaW5nXCIpLCBsb2FkaW5nKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRyZWVub2RlLWFjdGl2ZVwiKSwgYWN0aXZlKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRyZWVub2RlLWxlYWYtbGFzdFwiKSwgaXNFbmROb2RlKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRyZWVub2RlLWRyYWdnYWJsZVwiKSwgbWVyZ2VkRHJhZ2dhYmxlKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcImRyYWdnaW5nXCIsIGRyYWdnaW5nKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCAnZHJvcC10YXJnZXQnLCBkcm9wVGFyZ2V0S2V5ID09PSBldmVudEtleSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgJ2Ryb3AtY29udGFpbmVyJywgZHJvcENvbnRhaW5lcktleSA9PT0gZXZlbnRLZXkpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsICdkcmFnLW92ZXInLCAhZGlzYWJsZWQgJiYgZHJhZ092ZXIpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsICdkcmFnLW92ZXItZ2FwLXRvcCcsICFkaXNhYmxlZCAmJiBkcmFnT3ZlckdhcFRvcCksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgJ2RyYWctb3Zlci1nYXAtYm90dG9tJywgIWRpc2FibGVkICYmIGRyYWdPdmVyR2FwQm90dG9tKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCAnZmlsdGVyLW5vZGUnLCBmaWx0ZXJUcmVlTm9kZSAmJiBmaWx0ZXJUcmVlTm9kZShjb252ZXJ0Tm9kZVByb3BzVG9FdmVudERhdGEodGhpcy5wcm9wcykpKSwgX2NsYXNzTmFtZXMpKSxcbiAgICAgICAgc3R5bGU6IHN0eWxlXG4gICAgICAgIC8vIERyYWdnYWJsZSBjb25maWdcbiAgICAgICAgLFxuICAgICAgICBkcmFnZ2FibGU6IGRyYWdnYWJsZVdpdGhvdXREaXNhYmxlZCxcbiAgICAgICAgXCJhcmlhLWdyYWJiZWRcIjogZHJhZ2dpbmcsXG4gICAgICAgIG9uRHJhZ1N0YXJ0OiBkcmFnZ2FibGVXaXRob3V0RGlzYWJsZWQgPyB0aGlzLm9uRHJhZ1N0YXJ0IDogdW5kZWZpbmVkXG4gICAgICAgIC8vIERyb3AgY29uZmlnXG4gICAgICAgICxcbiAgICAgICAgb25EcmFnRW50ZXI6IG1lcmdlZERyYWdnYWJsZSA/IHRoaXMub25EcmFnRW50ZXIgOiB1bmRlZmluZWQsXG4gICAgICAgIG9uRHJhZ092ZXI6IG1lcmdlZERyYWdnYWJsZSA/IHRoaXMub25EcmFnT3ZlciA6IHVuZGVmaW5lZCxcbiAgICAgICAgb25EcmFnTGVhdmU6IG1lcmdlZERyYWdnYWJsZSA/IHRoaXMub25EcmFnTGVhdmUgOiB1bmRlZmluZWQsXG4gICAgICAgIG9uRHJvcDogbWVyZ2VkRHJhZ2dhYmxlID8gdGhpcy5vbkRyb3AgOiB1bmRlZmluZWQsXG4gICAgICAgIG9uRHJhZ0VuZDogbWVyZ2VkRHJhZ2dhYmxlID8gdGhpcy5vbkRyYWdFbmQgOiB1bmRlZmluZWQsXG4gICAgICAgIG9uTW91c2VNb3ZlOiBvbk1vdXNlTW92ZVxuICAgICAgfSwgYXJpYVNlbGVjdGVkLCBkYXRhT3JBcmlhQXR0cmlidXRlUHJvcHMpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJbmRlbnQsIHtcbiAgICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgIGxldmVsOiBsZXZlbCxcbiAgICAgICAgaXNTdGFydDogaXNTdGFydCxcbiAgICAgICAgaXNFbmQ6IGlzRW5kXG4gICAgICB9KSwgdGhpcy5yZW5kZXJEcmFnSGFuZGxlcigpLCB0aGlzLnJlbmRlclN3aXRjaGVyKCksIHRoaXMucmVuZGVyQ2hlY2tib3goKSwgdGhpcy5yZW5kZXJTZWxlY3RvcigpKTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIEludGVybmFsVHJlZU5vZGU7XG59KFJlYWN0LkNvbXBvbmVudCk7XG52YXIgQ29udGV4dFRyZWVOb2RlID0gZnVuY3Rpb24gQ29udGV4dFRyZWVOb2RlKHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmVlQ29udGV4dC5Db25zdW1lciwgbnVsbCwgZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSW50ZXJuYWxUcmVlTm9kZSwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgICBjb250ZXh0OiBjb250ZXh0XG4gICAgfSkpO1xuICB9KTtcbn07XG5Db250ZXh0VHJlZU5vZGUuZGlzcGxheU5hbWUgPSAnVHJlZU5vZGUnO1xuQ29udGV4dFRyZWVOb2RlLmlzVHJlZU5vZGUgPSAxO1xuZXhwb3J0IHsgSW50ZXJuYWxUcmVlTm9kZSB9O1xuZXhwb3J0IGRlZmF1bHQgQ29udGV4dFRyZWVOb2RlOyIsImltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiY2hpbGRyZW5cIl07XG4vKiBlc2xpbnQtZGlzYWJsZSBuby1sb25lbHktaWYgKi9cbi8qKlxuICogTGVnYWN5IGNvZGUuIFNob3VsZCBhdm9pZCB0byB1c2UgaWYgeW91IGFyZSBuZXcgdG8gaW1wb3J0IHRoZXNlIGNvZGUuXG4gKi9cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgd2FybmluZyBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5pbXBvcnQgVHJlZU5vZGUgZnJvbSAnLi9UcmVlTm9kZSc7XG5leHBvcnQgeyBnZXRQb3NpdGlvbiwgaXNUcmVlTm9kZSB9IGZyb20gJy4vdXRpbHMvdHJlZVV0aWwnO1xuZXhwb3J0IGZ1bmN0aW9uIGFyckRlbChsaXN0LCB2YWx1ZSkge1xuICBpZiAoIWxpc3QpIHJldHVybiBbXTtcbiAgdmFyIGNsb25lID0gbGlzdC5zbGljZSgpO1xuICB2YXIgaW5kZXggPSBjbG9uZS5pbmRleE9mKHZhbHVlKTtcbiAgaWYgKGluZGV4ID49IDApIHtcbiAgICBjbG9uZS5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG4gIHJldHVybiBjbG9uZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhcnJBZGQobGlzdCwgdmFsdWUpIHtcbiAgdmFyIGNsb25lID0gKGxpc3QgfHwgW10pLnNsaWNlKCk7XG4gIGlmIChjbG9uZS5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHtcbiAgICBjbG9uZS5wdXNoKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gY2xvbmU7XG59XG5leHBvcnQgZnVuY3Rpb24gcG9zVG9BcnIocG9zKSB7XG4gIHJldHVybiBwb3Muc3BsaXQoJy0nKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXREcmFnQ2hpbGRyZW5LZXlzKGRyYWdOb2RlS2V5LCBrZXlFbnRpdGllcykge1xuICAvLyBub3QgY29udGFpbnMgc2VsZlxuICAvLyBzZWxmIGZvciBsZWZ0IG9yIHJpZ2h0IGRyYWdcbiAgdmFyIGRyYWdDaGlsZHJlbktleXMgPSBbXTtcbiAgdmFyIGVudGl0eSA9IGtleUVudGl0aWVzW2RyYWdOb2RlS2V5XTtcbiAgZnVuY3Rpb24gZGlnKCkge1xuICAgIHZhciBsaXN0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTtcbiAgICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgIHZhciBrZXkgPSBfcmVmLmtleSxcbiAgICAgICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuO1xuICAgICAgZHJhZ0NoaWxkcmVuS2V5cy5wdXNoKGtleSk7XG4gICAgICBkaWcoY2hpbGRyZW4pO1xuICAgIH0pO1xuICB9XG4gIGRpZyhlbnRpdHkuY2hpbGRyZW4pO1xuICByZXR1cm4gZHJhZ0NoaWxkcmVuS2V5cztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0xhc3RDaGlsZCh0cmVlTm9kZUVudGl0eSkge1xuICBpZiAodHJlZU5vZGVFbnRpdHkucGFyZW50KSB7XG4gICAgdmFyIHBvc0FyciA9IHBvc1RvQXJyKHRyZWVOb2RlRW50aXR5LnBvcyk7XG4gICAgcmV0dXJuIE51bWJlcihwb3NBcnJbcG9zQXJyLmxlbmd0aCAtIDFdKSA9PT0gdHJlZU5vZGVFbnRpdHkucGFyZW50LmNoaWxkcmVuLmxlbmd0aCAtIDE7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRmlyc3RDaGlsZCh0cmVlTm9kZUVudGl0eSkge1xuICB2YXIgcG9zQXJyID0gcG9zVG9BcnIodHJlZU5vZGVFbnRpdHkucG9zKTtcbiAgcmV0dXJuIE51bWJlcihwb3NBcnJbcG9zQXJyLmxlbmd0aCAtIDFdKSA9PT0gMDtcbn1cbi8vIE9ubHkgdXNlZCB3aGVuIGRyYWcsIG5vdCBhZmZlY3QgU1NSLlxuZXhwb3J0IGZ1bmN0aW9uIGNhbGNEcm9wUG9zaXRpb24oZXZlbnQsIGRyYWdOb2RlLCB0YXJnZXROb2RlLCBpbmRlbnQsIHN0YXJ0TW91c2VQb3NpdGlvbiwgYWxsb3dEcm9wLCBmbGF0dGVuZWROb2Rlcywga2V5RW50aXRpZXMsIGV4cGFuZEtleXMsIGRpcmVjdGlvbikge1xuICB2YXIgX2Fic3RyYWN0RHJvcE5vZGVFbnRpO1xuICB2YXIgY2xpZW50WCA9IGV2ZW50LmNsaWVudFgsXG4gICAgY2xpZW50WSA9IGV2ZW50LmNsaWVudFk7XG4gIHZhciBfZXZlbnQkdGFyZ2V0JGdldEJvdW4gPSBldmVudC50YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgdG9wID0gX2V2ZW50JHRhcmdldCRnZXRCb3VuLnRvcCxcbiAgICBoZWlnaHQgPSBfZXZlbnQkdGFyZ2V0JGdldEJvdW4uaGVpZ2h0O1xuICAvLyBvcHRpb25hbCBjaGFpbiBmb3IgdGVzdGluZ1xuICB2YXIgaG9yaXpvbnRhbE1vdXNlT2Zmc2V0ID0gKGRpcmVjdGlvbiA9PT0gJ3J0bCcgPyAtMSA6IDEpICogKCgoc3RhcnRNb3VzZVBvc2l0aW9uID09PSBudWxsIHx8IHN0YXJ0TW91c2VQb3NpdGlvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3RhcnRNb3VzZVBvc2l0aW9uLngpIHx8IDApIC0gY2xpZW50WCk7XG4gIHZhciByYXdEcm9wTGV2ZWxPZmZzZXQgPSAoaG9yaXpvbnRhbE1vdXNlT2Zmc2V0IC0gMTIpIC8gaW5kZW50O1xuICAvLyBmaW5kIGFic3RyYWN0IGRyb3Agbm9kZSBieSBob3Jpem9udGFsIG9mZnNldFxuICB2YXIgYWJzdHJhY3REcm9wTm9kZUVudGl0eSA9IGtleUVudGl0aWVzW3RhcmdldE5vZGUucHJvcHMuZXZlbnRLZXldO1xuICBpZiAoY2xpZW50WSA8IHRvcCArIGhlaWdodCAvIDIpIHtcbiAgICAvLyBmaXJzdCBoYWxmLCBzZXQgYWJzdHJhY3QgZHJvcCBub2RlIHRvIHByZXZpb3VzIG5vZGVcbiAgICB2YXIgbm9kZUluZGV4ID0gZmxhdHRlbmVkTm9kZXMuZmluZEluZGV4KGZ1bmN0aW9uIChmbGF0dGVuZWROb2RlKSB7XG4gICAgICByZXR1cm4gZmxhdHRlbmVkTm9kZS5rZXkgPT09IGFic3RyYWN0RHJvcE5vZGVFbnRpdHkua2V5O1xuICAgIH0pO1xuICAgIHZhciBwcmV2Tm9kZUluZGV4ID0gbm9kZUluZGV4IDw9IDAgPyAwIDogbm9kZUluZGV4IC0gMTtcbiAgICB2YXIgcHJldk5vZGVLZXkgPSBmbGF0dGVuZWROb2Rlc1twcmV2Tm9kZUluZGV4XS5rZXk7XG4gICAgYWJzdHJhY3REcm9wTm9kZUVudGl0eSA9IGtleUVudGl0aWVzW3ByZXZOb2RlS2V5XTtcbiAgfVxuICB2YXIgaW5pdGlhbEFic3RyYWN0RHJvcE5vZGVLZXkgPSBhYnN0cmFjdERyb3BOb2RlRW50aXR5LmtleTtcbiAgdmFyIGFic3RyYWN0RHJhZ092ZXJFbnRpdHkgPSBhYnN0cmFjdERyb3BOb2RlRW50aXR5O1xuICB2YXIgZHJhZ092ZXJOb2RlS2V5ID0gYWJzdHJhY3REcm9wTm9kZUVudGl0eS5rZXk7XG4gIHZhciBkcm9wUG9zaXRpb24gPSAwO1xuICB2YXIgZHJvcExldmVsT2Zmc2V0ID0gMDtcbiAgLy8gT25seSBhbGxvdyBjcm9zcyBsZXZlbCBkcm9wIHdoZW4gZHJhZ2dpbmcgb24gYSBub24tZXhwYW5kZWQgbm9kZVxuICBpZiAoIWV4cGFuZEtleXMuaW5jbHVkZXMoaW5pdGlhbEFic3RyYWN0RHJvcE5vZGVLZXkpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYXdEcm9wTGV2ZWxPZmZzZXQ7IGkgKz0gMSkge1xuICAgICAgaWYgKGlzTGFzdENoaWxkKGFic3RyYWN0RHJvcE5vZGVFbnRpdHkpKSB7XG4gICAgICAgIGFic3RyYWN0RHJvcE5vZGVFbnRpdHkgPSBhYnN0cmFjdERyb3BOb2RlRW50aXR5LnBhcmVudDtcbiAgICAgICAgZHJvcExldmVsT2Zmc2V0ICs9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdmFyIGFic3RyYWN0RHJhZ0RhdGFOb2RlID0gZHJhZ05vZGUucHJvcHMuZGF0YTtcbiAgdmFyIGFic3RyYWN0RHJvcERhdGFOb2RlID0gYWJzdHJhY3REcm9wTm9kZUVudGl0eS5ub2RlO1xuICB2YXIgZHJvcEFsbG93ZWQgPSB0cnVlO1xuICBpZiAoaXNGaXJzdENoaWxkKGFic3RyYWN0RHJvcE5vZGVFbnRpdHkpICYmIGFic3RyYWN0RHJvcE5vZGVFbnRpdHkubGV2ZWwgPT09IDAgJiYgY2xpZW50WSA8IHRvcCArIGhlaWdodCAvIDIgJiYgYWxsb3dEcm9wKHtcbiAgICBkcmFnTm9kZTogYWJzdHJhY3REcmFnRGF0YU5vZGUsXG4gICAgZHJvcE5vZGU6IGFic3RyYWN0RHJvcERhdGFOb2RlLFxuICAgIGRyb3BQb3NpdGlvbjogLTFcbiAgfSkgJiYgYWJzdHJhY3REcm9wTm9kZUVudGl0eS5rZXkgPT09IHRhcmdldE5vZGUucHJvcHMuZXZlbnRLZXkpIHtcbiAgICAvLyBmaXJzdCBoYWxmIG9mIGZpcnN0IG5vZGUgaW4gZmlyc3QgbGV2ZWxcbiAgICBkcm9wUG9zaXRpb24gPSAtMTtcbiAgfSBlbHNlIGlmICgoYWJzdHJhY3REcmFnT3ZlckVudGl0eS5jaGlsZHJlbiB8fCBbXSkubGVuZ3RoICYmIGV4cGFuZEtleXMuaW5jbHVkZXMoZHJhZ092ZXJOb2RlS2V5KSkge1xuICAgIC8vIGRyb3Agb24gZXhwYW5kZWQgbm9kZVxuICAgIC8vIG9ubHkgYWxsb3cgZHJvcCBpbnNpZGVcbiAgICBpZiAoYWxsb3dEcm9wKHtcbiAgICAgIGRyYWdOb2RlOiBhYnN0cmFjdERyYWdEYXRhTm9kZSxcbiAgICAgIGRyb3BOb2RlOiBhYnN0cmFjdERyb3BEYXRhTm9kZSxcbiAgICAgIGRyb3BQb3NpdGlvbjogMFxuICAgIH0pKSB7XG4gICAgICBkcm9wUG9zaXRpb24gPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBkcm9wQWxsb3dlZCA9IGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChkcm9wTGV2ZWxPZmZzZXQgPT09IDApIHtcbiAgICBpZiAocmF3RHJvcExldmVsT2Zmc2V0ID4gLTEuNSkge1xuICAgICAgLy8gfCBOb2RlICAgICB8IDwtIGFic3RyYWN0RHJvcE5vZGVcbiAgICAgIC8vIHwgLV4tPT09PT0gfCA8LSBtb3VzZVBvc2l0aW9uXG4gICAgICAvLyAxLiB0cnkgZHJvcCBhZnRlclxuICAgICAgLy8gMi4gZG8gbm90IGFsbG93IGRyb3BcbiAgICAgIGlmIChhbGxvd0Ryb3Aoe1xuICAgICAgICBkcmFnTm9kZTogYWJzdHJhY3REcmFnRGF0YU5vZGUsXG4gICAgICAgIGRyb3BOb2RlOiBhYnN0cmFjdERyb3BEYXRhTm9kZSxcbiAgICAgICAgZHJvcFBvc2l0aW9uOiAxXG4gICAgICB9KSkge1xuICAgICAgICBkcm9wUG9zaXRpb24gPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHJvcEFsbG93ZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gfCBOb2RlICAgICB8IDwtIGFic3RyYWN0RHJvcE5vZGVcbiAgICAgIC8vIHwgLS0tPT1ePT0gfCA8LSBtb3VzZVBvc2l0aW9uXG4gICAgICAvLyB3aGV0aGVyIGl0IGhhcyBjaGlsZHJlbiBvciBkb2Vzbid0IGhhcyBjaGlsZHJlblxuICAgICAgLy8gYWx3YXlzXG4gICAgICAvLyAxLiB0cnkgZHJvcCBpbnNpZGVcbiAgICAgIC8vIDIuIHRyeSBkcm9wIGFmdGVyXG4gICAgICAvLyAzLiBkbyBub3QgYWxsb3cgZHJvcFxuICAgICAgaWYgKGFsbG93RHJvcCh7XG4gICAgICAgIGRyYWdOb2RlOiBhYnN0cmFjdERyYWdEYXRhTm9kZSxcbiAgICAgICAgZHJvcE5vZGU6IGFic3RyYWN0RHJvcERhdGFOb2RlLFxuICAgICAgICBkcm9wUG9zaXRpb246IDBcbiAgICAgIH0pKSB7XG4gICAgICAgIGRyb3BQb3NpdGlvbiA9IDA7XG4gICAgICB9IGVsc2UgaWYgKGFsbG93RHJvcCh7XG4gICAgICAgIGRyYWdOb2RlOiBhYnN0cmFjdERyYWdEYXRhTm9kZSxcbiAgICAgICAgZHJvcE5vZGU6IGFic3RyYWN0RHJvcERhdGFOb2RlLFxuICAgICAgICBkcm9wUG9zaXRpb246IDFcbiAgICAgIH0pKSB7XG4gICAgICAgIGRyb3BQb3NpdGlvbiA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkcm9wQWxsb3dlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyB8IE5vZGUxIHwgPC0gYWJzdHJhY3REcm9wTm9kZVxuICAgIC8vICAgICAgfCAgTm9kZTIgIHxcbiAgICAvLyAtLV4tLXwtLS0tPT09PT18IDwtIG1vdXNlUG9zaXRpb25cbiAgICAvLyAxLiB0cnkgaW5zZXJ0IGFmdGVyIE5vZGUxXG4gICAgLy8gMi4gZG8gbm90IGFsbG93IGRyb3BcbiAgICBpZiAoYWxsb3dEcm9wKHtcbiAgICAgIGRyYWdOb2RlOiBhYnN0cmFjdERyYWdEYXRhTm9kZSxcbiAgICAgIGRyb3BOb2RlOiBhYnN0cmFjdERyb3BEYXRhTm9kZSxcbiAgICAgIGRyb3BQb3NpdGlvbjogMVxuICAgIH0pKSB7XG4gICAgICBkcm9wUG9zaXRpb24gPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBkcm9wQWxsb3dlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGRyb3BQb3NpdGlvbjogZHJvcFBvc2l0aW9uLFxuICAgIGRyb3BMZXZlbE9mZnNldDogZHJvcExldmVsT2Zmc2V0LFxuICAgIGRyb3BUYXJnZXRLZXk6IGFic3RyYWN0RHJvcE5vZGVFbnRpdHkua2V5LFxuICAgIGRyb3BUYXJnZXRQb3M6IGFic3RyYWN0RHJvcE5vZGVFbnRpdHkucG9zLFxuICAgIGRyYWdPdmVyTm9kZUtleTogZHJhZ092ZXJOb2RlS2V5LFxuICAgIGRyb3BDb250YWluZXJLZXk6IGRyb3BQb3NpdGlvbiA9PT0gMCA/IG51bGwgOiAoKF9hYnN0cmFjdERyb3BOb2RlRW50aSA9IGFic3RyYWN0RHJvcE5vZGVFbnRpdHkucGFyZW50KSA9PT0gbnVsbCB8fCBfYWJzdHJhY3REcm9wTm9kZUVudGkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hYnN0cmFjdERyb3BOb2RlRW50aS5rZXkpIHx8IG51bGwsXG4gICAgZHJvcEFsbG93ZWQ6IGRyb3BBbGxvd2VkXG4gIH07XG59XG4vKipcbiAqIFJldHVybiBzZWxlY3RlZEtleXMgYWNjb3JkaW5nIHdpdGggbXVsdGlwbGUgcHJvcFxuICogQHBhcmFtIHNlbGVjdGVkS2V5c1xuICogQHBhcmFtIHByb3BzXG4gKiBAcmV0dXJucyBbc3RyaW5nXVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY1NlbGVjdGVkS2V5cyhzZWxlY3RlZEtleXMsIHByb3BzKSB7XG4gIGlmICghc2VsZWN0ZWRLZXlzKSByZXR1cm4gdW5kZWZpbmVkO1xuICB2YXIgbXVsdGlwbGUgPSBwcm9wcy5tdWx0aXBsZTtcbiAgaWYgKG11bHRpcGxlKSB7XG4gICAgcmV0dXJuIHNlbGVjdGVkS2V5cy5zbGljZSgpO1xuICB9XG4gIGlmIChzZWxlY3RlZEtleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIFtzZWxlY3RlZEtleXNbMF1dO1xuICB9XG4gIHJldHVybiBzZWxlY3RlZEtleXM7XG59XG52YXIgaW50ZXJuYWxQcm9jZXNzUHJvcHMgPSBmdW5jdGlvbiBpbnRlcm5hbFByb2Nlc3NQcm9wcyhwcm9wcykge1xuICByZXR1cm4gcHJvcHM7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnREYXRhVG9UcmVlKHRyZWVEYXRhLCBwcm9jZXNzb3IpIHtcbiAgaWYgKCF0cmVlRGF0YSkgcmV0dXJuIFtdO1xuICB2YXIgX3JlZjIgPSBwcm9jZXNzb3IgfHwge30sXG4gICAgX3JlZjIkcHJvY2Vzc1Byb3BzID0gX3JlZjIucHJvY2Vzc1Byb3BzLFxuICAgIHByb2Nlc3NQcm9wcyA9IF9yZWYyJHByb2Nlc3NQcm9wcyA9PT0gdm9pZCAwID8gaW50ZXJuYWxQcm9jZXNzUHJvcHMgOiBfcmVmMiRwcm9jZXNzUHJvcHM7XG4gIHZhciBsaXN0ID0gQXJyYXkuaXNBcnJheSh0cmVlRGF0YSkgPyB0cmVlRGF0YSA6IFt0cmVlRGF0YV07XG4gIHJldHVybiBsaXN0Lm1hcChmdW5jdGlvbiAoX3JlZjMpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBfcmVmMy5jaGlsZHJlbixcbiAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYzLCBfZXhjbHVkZWQpO1xuICAgIHZhciBjaGlsZHJlbk5vZGVzID0gY29udmVydERhdGFUb1RyZWUoY2hpbGRyZW4sIHByb2Nlc3Nvcik7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRyZWVOb2RlLCBfZXh0ZW5kcyh7XG4gICAgICBrZXk6IHByb3BzLmtleVxuICAgIH0sIHByb2Nlc3NQcm9wcyhwcm9wcykpLCBjaGlsZHJlbk5vZGVzKTtcbiAgfSk7XG59XG4vKipcbiAqIFBhcnNlIGBjaGVja2VkS2V5c2AgdG8geyBjaGVja2VkS2V5cywgaGFsZkNoZWNrZWRLZXlzIH0gc3R5bGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ2hlY2tlZEtleXMoa2V5cykge1xuICBpZiAoIWtleXMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBDb252ZXJ0IGtleXMgdG8gb2JqZWN0IGZvcm1hdFxuICB2YXIga2V5UHJvcHM7XG4gIGlmIChBcnJheS5pc0FycmF5KGtleXMpKSB7XG4gICAgLy8gW0xlZ2FjeV0gRm9sbG93IHRoZSBhcGkgZG9jXG4gICAga2V5UHJvcHMgPSB7XG4gICAgICBjaGVja2VkS2V5czoga2V5cyxcbiAgICAgIGhhbGZDaGVja2VkS2V5czogdW5kZWZpbmVkXG4gICAgfTtcbiAgfSBlbHNlIGlmIChfdHlwZW9mKGtleXMpID09PSAnb2JqZWN0Jykge1xuICAgIGtleVByb3BzID0ge1xuICAgICAgY2hlY2tlZEtleXM6IGtleXMuY2hlY2tlZCB8fCB1bmRlZmluZWQsXG4gICAgICBoYWxmQ2hlY2tlZEtleXM6IGtleXMuaGFsZkNoZWNrZWQgfHwgdW5kZWZpbmVkXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICB3YXJuaW5nKGZhbHNlLCAnYGNoZWNrZWRLZXlzYCBpcyBub3QgYW4gYXJyYXkgb3IgYW4gb2JqZWN0Jyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGtleVByb3BzO1xufVxuLyoqXG4gKiBJZiB1c2VyIHVzZSBgYXV0b0V4cGFuZFBhcmVudGAgd2Ugc2hvdWxkIGdldCB0aGUgbGlzdCBvZiBwYXJlbnQgbm9kZVxuICogQHBhcmFtIGtleUxpc3RcbiAqIEBwYXJhbSBrZXlFbnRpdGllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29uZHVjdEV4cGFuZFBhcmVudChrZXlMaXN0LCBrZXlFbnRpdGllcykge1xuICB2YXIgZXhwYW5kZWRLZXlzID0gbmV3IFNldCgpO1xuICBmdW5jdGlvbiBjb25kdWN0VXAoa2V5KSB7XG4gICAgaWYgKGV4cGFuZGVkS2V5cy5oYXMoa2V5KSkgcmV0dXJuO1xuICAgIHZhciBlbnRpdHkgPSBrZXlFbnRpdGllc1trZXldO1xuICAgIGlmICghZW50aXR5KSByZXR1cm47XG4gICAgZXhwYW5kZWRLZXlzLmFkZChrZXkpO1xuICAgIHZhciBwYXJlbnQgPSBlbnRpdHkucGFyZW50LFxuICAgICAgbm9kZSA9IGVudGl0eS5ub2RlO1xuICAgIGlmIChub2RlLmRpc2FibGVkKSByZXR1cm47XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgY29uZHVjdFVwKHBhcmVudC5rZXkpO1xuICAgIH1cbiAgfVxuICAoa2V5TGlzdCB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgY29uZHVjdFVwKGtleSk7XG4gIH0pO1xuICByZXR1cm4gX3RvQ29uc3VtYWJsZUFycmF5KGV4cGFuZGVkS2V5cyk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX29iamVjdERlc3RydWN0dXJpbmdFbXB0eShvYmopIHtcbiAgaWYgKG9iaiA9PSBudWxsKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGRlc3RydWN0dXJlIFwiICsgb2JqKTtcbn0iLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0Jztcbi8qKlxuICogVHJpZ2dlciBvbmx5IHdoZW4gY29tcG9uZW50IHVubW91bnRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlVW5tb3VudCh0cmlnZ2VyU3RhcnQsIHRyaWdnZXJFbmQpIHtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBmaXJzdE1vdW50ID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRGaXJzdE1vdW50ID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgUmVhY3QudXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZmlyc3RNb3VudCkge1xuICAgICAgdHJpZ2dlclN0YXJ0KCk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB0cmlnZ2VyRW5kKCk7XG4gICAgICB9O1xuICAgIH1cbiAgfSwgW2ZpcnN0TW91bnRdKTtcbiAgUmVhY3QudXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzZXRGaXJzdE1vdW50KHRydWUpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBzZXRGaXJzdE1vdW50KGZhbHNlKTtcbiAgICB9O1xuICB9LCBbXSk7XG59IiwiaW1wb3J0IF9vYmplY3REZXN0cnVjdHVyaW5nRW1wdHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdERlc3RydWN0dXJpbmdFbXB0eVwiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiY2xhc3NOYW1lXCIsIFwic3R5bGVcIiwgXCJtb3Rpb25cIiwgXCJtb3Rpb25Ob2Rlc1wiLCBcIm1vdGlvblR5cGVcIiwgXCJvbk1vdGlvblN0YXJ0XCIsIFwib25Nb3Rpb25FbmRcIiwgXCJhY3RpdmVcIiwgXCJ0cmVlTm9kZVJlcXVpcmVkUHJvcHNcIl07XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBDU1NNb3Rpb24gZnJvbSAncmMtbW90aW9uJztcbmltcG9ydCB1c2VMYXlvdXRFZmZlY3QgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTGF5b3V0RWZmZWN0XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBUcmVlQ29udGV4dCB9IGZyb20gJy4vY29udGV4dFR5cGVzJztcbmltcG9ydCBUcmVlTm9kZSBmcm9tICcuL1RyZWVOb2RlJztcbmltcG9ydCB1c2VVbm1vdW50IGZyb20gJy4vdXNlVW5tb3VudCc7XG5pbXBvcnQgeyBnZXRUcmVlTm9kZVByb3BzIH0gZnJvbSAnLi91dGlscy90cmVlVXRpbCc7XG52YXIgTW90aW9uVHJlZU5vZGUgPSBmdW5jdGlvbiBNb3Rpb25UcmVlTm9kZShfcmVmLCByZWYpIHtcbiAgdmFyIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgIHN0eWxlID0gX3JlZi5zdHlsZSxcbiAgICBtb3Rpb24gPSBfcmVmLm1vdGlvbixcbiAgICBtb3Rpb25Ob2RlcyA9IF9yZWYubW90aW9uTm9kZXMsXG4gICAgbW90aW9uVHlwZSA9IF9yZWYubW90aW9uVHlwZSxcbiAgICBvbk9yaWdpbk1vdGlvblN0YXJ0ID0gX3JlZi5vbk1vdGlvblN0YXJ0LFxuICAgIG9uT3JpZ2luTW90aW9uRW5kID0gX3JlZi5vbk1vdGlvbkVuZCxcbiAgICBhY3RpdmUgPSBfcmVmLmFjdGl2ZSxcbiAgICB0cmVlTm9kZVJlcXVpcmVkUHJvcHMgPSBfcmVmLnRyZWVOb2RlUmVxdWlyZWRQcm9wcyxcbiAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUodHJ1ZSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgdmlzaWJsZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0VmlzaWJsZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoVHJlZUNvbnRleHQpLFxuICAgIHByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LnByZWZpeENscztcbiAgLy8gQ2FsY3VsYXRlIHRhcmdldCB2aXNpYmxlIGhlcmUuXG4gIC8vIEFuZCBhcHBseSBpbiBlZmZlY3QgdG8gbWFrZSBgbGVhdmVgIG1vdGlvbiB3b3JrLlxuICB2YXIgdGFyZ2V0VmlzaWJsZSA9IG1vdGlvbk5vZGVzICYmIG1vdGlvblR5cGUgIT09ICdoaWRlJztcbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAobW90aW9uTm9kZXMpIHtcbiAgICAgIGlmICh0YXJnZXRWaXNpYmxlICE9PSB2aXNpYmxlKSB7XG4gICAgICAgIHNldFZpc2libGUodGFyZ2V0VmlzaWJsZSk7XG4gICAgICB9XG4gICAgfVxuICB9LCBbbW90aW9uTm9kZXNdKTtcbiAgdmFyIHRyaWdnZXJNb3Rpb25TdGFydCA9IGZ1bmN0aW9uIHRyaWdnZXJNb3Rpb25TdGFydCgpIHtcbiAgICBpZiAobW90aW9uTm9kZXMpIHtcbiAgICAgIG9uT3JpZ2luTW90aW9uU3RhcnQoKTtcbiAgICB9XG4gIH07XG4gIC8vIFNob3VsZCBvbmx5IHRyaWdnZXIgb25jZVxuICB2YXIgdHJpZ2dlck1vdGlvbkVuZFJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIHZhciB0cmlnZ2VyTW90aW9uRW5kID0gZnVuY3Rpb24gdHJpZ2dlck1vdGlvbkVuZCgpIHtcbiAgICBpZiAobW90aW9uTm9kZXMgJiYgIXRyaWdnZXJNb3Rpb25FbmRSZWYuY3VycmVudCkge1xuICAgICAgdHJpZ2dlck1vdGlvbkVuZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIG9uT3JpZ2luTW90aW9uRW5kKCk7XG4gICAgfVxuICB9O1xuICAvLyBFZmZlY3QgaWYgdW5tb3VudFxuICB1c2VVbm1vdW50KHRyaWdnZXJNb3Rpb25TdGFydCwgdHJpZ2dlck1vdGlvbkVuZCk7XG4gIC8vIE1vdGlvbiBlbmQgZXZlbnRcbiAgdmFyIG9uVmlzaWJsZUNoYW5nZWQgPSBmdW5jdGlvbiBvblZpc2libGVDaGFuZ2VkKG5leHRWaXNpYmxlKSB7XG4gICAgaWYgKHRhcmdldFZpc2libGUgPT09IG5leHRWaXNpYmxlKSB7XG4gICAgICB0cmlnZ2VyTW90aW9uRW5kKCk7XG4gICAgfVxuICB9O1xuICBpZiAobW90aW9uTm9kZXMpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ1NTTW90aW9uLCBfZXh0ZW5kcyh7XG4gICAgICByZWY6IHJlZixcbiAgICAgIHZpc2libGU6IHZpc2libGVcbiAgICB9LCBtb3Rpb24sIHtcbiAgICAgIG1vdGlvbkFwcGVhcjogbW90aW9uVHlwZSA9PT0gJ3Nob3cnLFxuICAgICAgb25WaXNpYmxlQ2hhbmdlZDogb25WaXNpYmxlQ2hhbmdlZFxuICAgIH0pLCBmdW5jdGlvbiAoX3JlZjIsIG1vdGlvblJlZikge1xuICAgICAgdmFyIG1vdGlvbkNsYXNzTmFtZSA9IF9yZWYyLmNsYXNzTmFtZSxcbiAgICAgICAgbW90aW9uU3R5bGUgPSBfcmVmMi5zdHlsZTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIHJlZjogbW90aW9uUmVmLFxuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10cmVlbm9kZS1tb3Rpb25cIiksIG1vdGlvbkNsYXNzTmFtZSksXG4gICAgICAgIHN0eWxlOiBtb3Rpb25TdHlsZVxuICAgICAgfSwgbW90aW9uTm9kZXMubWFwKGZ1bmN0aW9uICh0cmVlTm9kZSkge1xuICAgICAgICB2YXIgcmVzdFByb3BzID0gX2V4dGVuZHMoe30sIChfb2JqZWN0RGVzdHJ1Y3R1cmluZ0VtcHR5KHRyZWVOb2RlLmRhdGEpLCB0cmVlTm9kZS5kYXRhKSksXG4gICAgICAgICAgdGl0bGUgPSB0cmVlTm9kZS50aXRsZSxcbiAgICAgICAgICBrZXkgPSB0cmVlTm9kZS5rZXksXG4gICAgICAgICAgaXNTdGFydCA9IHRyZWVOb2RlLmlzU3RhcnQsXG4gICAgICAgICAgaXNFbmQgPSB0cmVlTm9kZS5pc0VuZDtcbiAgICAgICAgZGVsZXRlIHJlc3RQcm9wcy5jaGlsZHJlbjtcbiAgICAgICAgdmFyIHRyZWVOb2RlUHJvcHMgPSBnZXRUcmVlTm9kZVByb3BzKGtleSwgdHJlZU5vZGVSZXF1aXJlZFByb3BzKTtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRyZWVOb2RlLCBfZXh0ZW5kcyh7fSwgcmVzdFByb3BzLCB0cmVlTm9kZVByb3BzLCB7XG4gICAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICAgIGFjdGl2ZTogYWN0aXZlLFxuICAgICAgICAgIGRhdGE6IHRyZWVOb2RlLmRhdGEsXG4gICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgaXNTdGFydDogaXNTdGFydCxcbiAgICAgICAgICBpc0VuZDogaXNFbmRcbiAgICAgICAgfSkpO1xuICAgICAgfSkpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmVlTm9kZSwgX2V4dGVuZHMoe1xuICAgIGRvbVJlZjogcmVmLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCBwcm9wcywge1xuICAgIGFjdGl2ZTogYWN0aXZlXG4gIH0pKTtcbn07XG5Nb3Rpb25UcmVlTm9kZS5kaXNwbGF5TmFtZSA9ICdNb3Rpb25UcmVlTm9kZSc7XG52YXIgUmVmTW90aW9uVHJlZU5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihNb3Rpb25UcmVlTm9kZSk7XG5leHBvcnQgZGVmYXVsdCBSZWZNb3Rpb25UcmVlTm9kZTsiLCJleHBvcnQgZnVuY3Rpb24gZmluZEV4cGFuZGVkS2V5cygpIHtcbiAgdmFyIHByZXYgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdO1xuICB2YXIgbmV4dCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogW107XG4gIHZhciBwcmV2TGVuID0gcHJldi5sZW5ndGg7XG4gIHZhciBuZXh0TGVuID0gbmV4dC5sZW5ndGg7XG4gIGlmIChNYXRoLmFicyhwcmV2TGVuIC0gbmV4dExlbikgIT09IDEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWRkOiBmYWxzZSxcbiAgICAgIGtleTogbnVsbFxuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZmluZChzaG9ydGVyLCBsb25nZXIpIHtcbiAgICB2YXIgY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgc2hvcnRlci5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGNhY2hlLnNldChrZXksIHRydWUpO1xuICAgIH0pO1xuICAgIHZhciBrZXlzID0gbG9uZ2VyLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gICAgICByZXR1cm4gIWNhY2hlLmhhcyhrZXkpO1xuICAgIH0pO1xuICAgIHJldHVybiBrZXlzLmxlbmd0aCA9PT0gMSA/IGtleXNbMF0gOiBudWxsO1xuICB9XG4gIGlmIChwcmV2TGVuIDwgbmV4dExlbikge1xuICAgIHJldHVybiB7XG4gICAgICBhZGQ6IHRydWUsXG4gICAgICBrZXk6IGZpbmQocHJldiwgbmV4dClcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgYWRkOiBmYWxzZSxcbiAgICBrZXk6IGZpbmQobmV4dCwgcHJldilcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHBhbmRSYW5nZShzaG9ydGVyLCBsb25nZXIsIGtleSkge1xuICB2YXIgc2hvcnRlclN0YXJ0SW5kZXggPSBzaG9ydGVyLmZpbmRJbmRleChmdW5jdGlvbiAoZGF0YSkge1xuICAgIHJldHVybiBkYXRhLmtleSA9PT0ga2V5O1xuICB9KTtcbiAgdmFyIHNob3J0ZXJFbmROb2RlID0gc2hvcnRlcltzaG9ydGVyU3RhcnRJbmRleCArIDFdO1xuICB2YXIgbG9uZ2VyU3RhcnRJbmRleCA9IGxvbmdlci5maW5kSW5kZXgoZnVuY3Rpb24gKGRhdGEpIHtcbiAgICByZXR1cm4gZGF0YS5rZXkgPT09IGtleTtcbiAgfSk7XG4gIGlmIChzaG9ydGVyRW5kTm9kZSkge1xuICAgIHZhciBsb25nZXJFbmRJbmRleCA9IGxvbmdlci5maW5kSW5kZXgoZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIHJldHVybiBkYXRhLmtleSA9PT0gc2hvcnRlckVuZE5vZGUua2V5O1xuICAgIH0pO1xuICAgIHJldHVybiBsb25nZXIuc2xpY2UobG9uZ2VyU3RhcnRJbmRleCArIDEsIGxvbmdlckVuZEluZGV4KTtcbiAgfVxuICByZXR1cm4gbG9uZ2VyLnNsaWNlKGxvbmdlclN0YXJ0SW5kZXggKyAxKTtcbn0iLCJpbXBvcnQgX29iamVjdERlc3RydWN0dXJpbmdFbXB0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0RGVzdHJ1Y3R1cmluZ0VtcHR5XCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJwcmVmaXhDbHNcIiwgXCJkYXRhXCIsIFwic2VsZWN0YWJsZVwiLCBcImNoZWNrYWJsZVwiLCBcImV4cGFuZGVkS2V5c1wiLCBcInNlbGVjdGVkS2V5c1wiLCBcImNoZWNrZWRLZXlzXCIsIFwibG9hZGVkS2V5c1wiLCBcImxvYWRpbmdLZXlzXCIsIFwiaGFsZkNoZWNrZWRLZXlzXCIsIFwia2V5RW50aXRpZXNcIiwgXCJkaXNhYmxlZFwiLCBcImRyYWdnaW5nXCIsIFwiZHJhZ092ZXJOb2RlS2V5XCIsIFwiZHJvcFBvc2l0aW9uXCIsIFwibW90aW9uXCIsIFwiaGVpZ2h0XCIsIFwiaXRlbUhlaWdodFwiLCBcInZpcnR1YWxcIiwgXCJmb2N1c2FibGVcIiwgXCJhY3RpdmVJdGVtXCIsIFwiZm9jdXNlZFwiLCBcInRhYkluZGV4XCIsIFwib25LZXlEb3duXCIsIFwib25Gb2N1c1wiLCBcIm9uQmx1clwiLCBcIm9uQWN0aXZlQ2hhbmdlXCIsIFwib25MaXN0Q2hhbmdlU3RhcnRcIiwgXCJvbkxpc3RDaGFuZ2VFbmRcIl07XG4vKipcbiAqIEhhbmRsZSB2aXJ0dWFsIGxpc3Qgb2YgdGhlIFRyZWVOb2Rlcy5cbiAqL1xuaW1wb3J0IHVzZUxheW91dEVmZmVjdCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCBWaXJ0dWFsTGlzdCBmcm9tICdyYy12aXJ0dWFsLWxpc3QnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IE1vdGlvblRyZWVOb2RlIGZyb20gJy4vTW90aW9uVHJlZU5vZGUnO1xuaW1wb3J0IHsgZmluZEV4cGFuZGVkS2V5cywgZ2V0RXhwYW5kUmFuZ2UgfSBmcm9tICcuL3V0aWxzL2RpZmZVdGlsJztcbmltcG9ydCB7IGdldEtleSwgZ2V0VHJlZU5vZGVQcm9wcyB9IGZyb20gJy4vdXRpbHMvdHJlZVV0aWwnO1xudmFyIEhJRERFTl9TVFlMRSA9IHtcbiAgd2lkdGg6IDAsXG4gIGhlaWdodDogMCxcbiAgZGlzcGxheTogJ2ZsZXgnLFxuICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gIG9wYWNpdHk6IDAsXG4gIGJvcmRlcjogMCxcbiAgcGFkZGluZzogMCxcbiAgbWFyZ2luOiAwXG59O1xudmFyIG5vb3AgPSBmdW5jdGlvbiBub29wKCkge307XG5leHBvcnQgdmFyIE1PVElPTl9LRVkgPSBcIlJDX1RSRUVfTU9USU9OX1wiLmNvbmNhdChNYXRoLnJhbmRvbSgpKTtcbnZhciBNb3Rpb25Ob2RlID0ge1xuICBrZXk6IE1PVElPTl9LRVlcbn07XG5leHBvcnQgdmFyIE1vdGlvbkVudGl0eSA9IHtcbiAga2V5OiBNT1RJT05fS0VZLFxuICBsZXZlbDogMCxcbiAgaW5kZXg6IDAsXG4gIHBvczogJzAnLFxuICBub2RlOiBNb3Rpb25Ob2RlLFxuICBub2RlczogW01vdGlvbk5vZGVdXG59O1xudmFyIE1vdGlvbkZsYXR0ZW5EYXRhID0ge1xuICBwYXJlbnQ6IG51bGwsXG4gIGNoaWxkcmVuOiBbXSxcbiAgcG9zOiBNb3Rpb25FbnRpdHkucG9zLFxuICBkYXRhOiBNb3Rpb25Ob2RlLFxuICB0aXRsZTogbnVsbCxcbiAga2V5OiBNT1RJT05fS0VZLFxuICAvKiogSG9sZCBlbXB0eSBsaXN0IGhlcmUgc2luY2Ugd2UgZG8gbm90IHVzZSBpdCAqL1xuICBpc1N0YXJ0OiBbXSxcbiAgaXNFbmQ6IFtdXG59O1xuLyoqXG4gKiBXZSBvbmx5IG5lZWQgZ2V0IHZpc2libGUgY29udGVudCBpdGVtcyB0byBwbGF5IHRoZSBhbmltYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNaW5pbXVtUmFuZ2VUcmFuc2l0aW9uUmFuZ2UobGlzdCwgdmlydHVhbCwgaGVpZ2h0LCBpdGVtSGVpZ2h0KSB7XG4gIGlmICh2aXJ0dWFsID09PSBmYWxzZSB8fCAhaGVpZ2h0KSB7XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH1cbiAgcmV0dXJuIGxpc3Quc2xpY2UoMCwgTWF0aC5jZWlsKGhlaWdodCAvIGl0ZW1IZWlnaHQpICsgMSk7XG59XG5mdW5jdGlvbiBpdGVtS2V5KGl0ZW0pIHtcbiAgdmFyIGtleSA9IGl0ZW0ua2V5LFxuICAgIHBvcyA9IGl0ZW0ucG9zO1xuICByZXR1cm4gZ2V0S2V5KGtleSwgcG9zKTtcbn1cbmZ1bmN0aW9uIGdldEFjY2Vzc2liaWxpdHlQYXRoKGl0ZW0pIHtcbiAgdmFyIHBhdGggPSBTdHJpbmcoaXRlbS5kYXRhLmtleSk7XG4gIHZhciBjdXJyZW50ID0gaXRlbTtcbiAgd2hpbGUgKGN1cnJlbnQucGFyZW50KSB7XG4gICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50O1xuICAgIHBhdGggPSBcIlwiLmNvbmNhdChjdXJyZW50LmRhdGEua2V5LCBcIiA+IFwiKS5jb25jYXQocGF0aCk7XG4gIH1cbiAgcmV0dXJuIHBhdGg7XG59XG52YXIgTm9kZUxpc3QgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGRhdGEgPSBwcm9wcy5kYXRhLFxuICAgIHNlbGVjdGFibGUgPSBwcm9wcy5zZWxlY3RhYmxlLFxuICAgIGNoZWNrYWJsZSA9IHByb3BzLmNoZWNrYWJsZSxcbiAgICBleHBhbmRlZEtleXMgPSBwcm9wcy5leHBhbmRlZEtleXMsXG4gICAgc2VsZWN0ZWRLZXlzID0gcHJvcHMuc2VsZWN0ZWRLZXlzLFxuICAgIGNoZWNrZWRLZXlzID0gcHJvcHMuY2hlY2tlZEtleXMsXG4gICAgbG9hZGVkS2V5cyA9IHByb3BzLmxvYWRlZEtleXMsXG4gICAgbG9hZGluZ0tleXMgPSBwcm9wcy5sb2FkaW5nS2V5cyxcbiAgICBoYWxmQ2hlY2tlZEtleXMgPSBwcm9wcy5oYWxmQ2hlY2tlZEtleXMsXG4gICAga2V5RW50aXRpZXMgPSBwcm9wcy5rZXlFbnRpdGllcyxcbiAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgIGRyYWdnaW5nID0gcHJvcHMuZHJhZ2dpbmcsXG4gICAgZHJhZ092ZXJOb2RlS2V5ID0gcHJvcHMuZHJhZ092ZXJOb2RlS2V5LFxuICAgIGRyb3BQb3NpdGlvbiA9IHByb3BzLmRyb3BQb3NpdGlvbixcbiAgICBtb3Rpb24gPSBwcm9wcy5tb3Rpb24sXG4gICAgaGVpZ2h0ID0gcHJvcHMuaGVpZ2h0LFxuICAgIGl0ZW1IZWlnaHQgPSBwcm9wcy5pdGVtSGVpZ2h0LFxuICAgIHZpcnR1YWwgPSBwcm9wcy52aXJ0dWFsLFxuICAgIGZvY3VzYWJsZSA9IHByb3BzLmZvY3VzYWJsZSxcbiAgICBhY3RpdmVJdGVtID0gcHJvcHMuYWN0aXZlSXRlbSxcbiAgICBmb2N1c2VkID0gcHJvcHMuZm9jdXNlZCxcbiAgICB0YWJJbmRleCA9IHByb3BzLnRhYkluZGV4LFxuICAgIG9uS2V5RG93biA9IHByb3BzLm9uS2V5RG93bixcbiAgICBvbkZvY3VzID0gcHJvcHMub25Gb2N1cyxcbiAgICBvbkJsdXIgPSBwcm9wcy5vbkJsdXIsXG4gICAgb25BY3RpdmVDaGFuZ2UgPSBwcm9wcy5vbkFjdGl2ZUNoYW5nZSxcbiAgICBvbkxpc3RDaGFuZ2VTdGFydCA9IHByb3BzLm9uTGlzdENoYW5nZVN0YXJ0LFxuICAgIG9uTGlzdENoYW5nZUVuZCA9IHByb3BzLm9uTGlzdENoYW5nZUVuZCxcbiAgICBkb21Qcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZWYgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGxpc3RSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBpbmRlbnRNZWFzdXJlclJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2Nyb2xsVG86IGZ1bmN0aW9uIHNjcm9sbFRvKHNjcm9sbCkge1xuICAgICAgICBsaXN0UmVmLmN1cnJlbnQuc2Nyb2xsVG8oc2Nyb2xsKTtcbiAgICAgIH0sXG4gICAgICBnZXRJbmRlbnRXaWR0aDogZnVuY3Rpb24gZ2V0SW5kZW50V2lkdGgoKSB7XG4gICAgICAgIHJldHVybiBpbmRlbnRNZWFzdXJlclJlZi5jdXJyZW50Lm9mZnNldFdpZHRoO1xuICAgICAgfVxuICAgIH07XG4gIH0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gTW90aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZXhwYW5kZWRLZXlzKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBwcmV2RXhwYW5kZWRLZXlzID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRQcmV2RXhwYW5kZWRLZXlzID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTMgPSBSZWFjdC51c2VTdGF0ZShkYXRhKSxcbiAgICBfUmVhY3QkdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlMywgMiksXG4gICAgcHJldkRhdGEgPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgIHNldFByZXZEYXRhID0gX1JlYWN0JHVzZVN0YXRlNFsxXTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTUgPSBSZWFjdC51c2VTdGF0ZShkYXRhKSxcbiAgICBfUmVhY3QkdXNlU3RhdGU2ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlNSwgMiksXG4gICAgdHJhbnNpdGlvbkRhdGEgPSBfUmVhY3QkdXNlU3RhdGU2WzBdLFxuICAgIHNldFRyYW5zaXRpb25EYXRhID0gX1JlYWN0JHVzZVN0YXRlNlsxXTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTcgPSBSZWFjdC51c2VTdGF0ZShbXSksXG4gICAgX1JlYWN0JHVzZVN0YXRlOCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTcsIDIpLFxuICAgIHRyYW5zaXRpb25SYW5nZSA9IF9SZWFjdCR1c2VTdGF0ZThbMF0sXG4gICAgc2V0VHJhbnNpdGlvblJhbmdlID0gX1JlYWN0JHVzZVN0YXRlOFsxXTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTkgPSBSZWFjdC51c2VTdGF0ZShudWxsKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUxMCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTksIDIpLFxuICAgIG1vdGlvblR5cGUgPSBfUmVhY3QkdXNlU3RhdGUxMFswXSxcbiAgICBzZXRNb3Rpb25UeXBlID0gX1JlYWN0JHVzZVN0YXRlMTBbMV07XG4gIC8vIFdoZW4gbW90aW9uIGVuZCBidXQgZGF0YSBjaGFuZ2UsIHRoaXMgd2lsbCBtYWtlcyBkYXRhIGJhY2sgdG8gcHJldmlvdXMgb25lXG4gIHZhciBkYXRhUmVmID0gUmVhY3QudXNlUmVmKGRhdGEpO1xuICBkYXRhUmVmLmN1cnJlbnQgPSBkYXRhO1xuICBmdW5jdGlvbiBvbk1vdGlvbkVuZCgpIHtcbiAgICB2YXIgbGF0ZXN0RGF0YSA9IGRhdGFSZWYuY3VycmVudDtcbiAgICBzZXRQcmV2RGF0YShsYXRlc3REYXRhKTtcbiAgICBzZXRUcmFuc2l0aW9uRGF0YShsYXRlc3REYXRhKTtcbiAgICBzZXRUcmFuc2l0aW9uUmFuZ2UoW10pO1xuICAgIHNldE1vdGlvblR5cGUobnVsbCk7XG4gICAgb25MaXN0Q2hhbmdlRW5kKCk7XG4gIH1cbiAgLy8gRG8gYW5pbWF0aW9uIGlmIGV4cGFuZGVkIGtleXMgY2hhbmdlZFxuICAvLyBsYXlvdXRFZmZlY3QgaGVyZSB0byBhdm9pZCBibGluayBvZiBub2RlIHJlbW92aW5nXG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc2V0UHJldkV4cGFuZGVkS2V5cyhleHBhbmRlZEtleXMpO1xuICAgIHZhciBkaWZmRXhwYW5kZWQgPSBmaW5kRXhwYW5kZWRLZXlzKHByZXZFeHBhbmRlZEtleXMsIGV4cGFuZGVkS2V5cyk7XG4gICAgaWYgKGRpZmZFeHBhbmRlZC5rZXkgIT09IG51bGwpIHtcbiAgICAgIGlmIChkaWZmRXhwYW5kZWQuYWRkKSB7XG4gICAgICAgIHZhciBrZXlJbmRleCA9IHByZXZEYXRhLmZpbmRJbmRleChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICAgIHZhciBrZXkgPSBfcmVmLmtleTtcbiAgICAgICAgICByZXR1cm4ga2V5ID09PSBkaWZmRXhwYW5kZWQua2V5O1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHJhbmdlTm9kZXMgPSBnZXRNaW5pbXVtUmFuZ2VUcmFuc2l0aW9uUmFuZ2UoZ2V0RXhwYW5kUmFuZ2UocHJldkRhdGEsIGRhdGEsIGRpZmZFeHBhbmRlZC5rZXkpLCB2aXJ0dWFsLCBoZWlnaHQsIGl0ZW1IZWlnaHQpO1xuICAgICAgICB2YXIgbmV3VHJhbnNpdGlvbkRhdGEgPSBwcmV2RGF0YS5zbGljZSgpO1xuICAgICAgICBuZXdUcmFuc2l0aW9uRGF0YS5zcGxpY2Uoa2V5SW5kZXggKyAxLCAwLCBNb3Rpb25GbGF0dGVuRGF0YSk7XG4gICAgICAgIHNldFRyYW5zaXRpb25EYXRhKG5ld1RyYW5zaXRpb25EYXRhKTtcbiAgICAgICAgc2V0VHJhbnNpdGlvblJhbmdlKHJhbmdlTm9kZXMpO1xuICAgICAgICBzZXRNb3Rpb25UeXBlKCdzaG93Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgX2tleUluZGV4ID0gZGF0YS5maW5kSW5kZXgoZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICAgICAgdmFyIGtleSA9IF9yZWYyLmtleTtcbiAgICAgICAgICByZXR1cm4ga2V5ID09PSBkaWZmRXhwYW5kZWQua2V5O1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIF9yYW5nZU5vZGVzID0gZ2V0TWluaW11bVJhbmdlVHJhbnNpdGlvblJhbmdlKGdldEV4cGFuZFJhbmdlKGRhdGEsIHByZXZEYXRhLCBkaWZmRXhwYW5kZWQua2V5KSwgdmlydHVhbCwgaGVpZ2h0LCBpdGVtSGVpZ2h0KTtcbiAgICAgICAgdmFyIF9uZXdUcmFuc2l0aW9uRGF0YSA9IGRhdGEuc2xpY2UoKTtcbiAgICAgICAgX25ld1RyYW5zaXRpb25EYXRhLnNwbGljZShfa2V5SW5kZXggKyAxLCAwLCBNb3Rpb25GbGF0dGVuRGF0YSk7XG4gICAgICAgIHNldFRyYW5zaXRpb25EYXRhKF9uZXdUcmFuc2l0aW9uRGF0YSk7XG4gICAgICAgIHNldFRyYW5zaXRpb25SYW5nZShfcmFuZ2VOb2Rlcyk7XG4gICAgICAgIHNldE1vdGlvblR5cGUoJ2hpZGUnKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByZXZEYXRhICE9PSBkYXRhKSB7XG4gICAgICAvLyBJZiB3aG9sZSBkYXRhIGNoYW5nZWQsIHdlIGp1c3QgcmVmcmVzaCB0aGUgbGlzdFxuICAgICAgc2V0UHJldkRhdGEoZGF0YSk7XG4gICAgICBzZXRUcmFuc2l0aW9uRGF0YShkYXRhKTtcbiAgICB9XG4gIH0sIFtleHBhbmRlZEtleXMsIGRhdGFdKTtcbiAgLy8gV2Ugc2hvdWxkIGNsZWFuIHVwIG1vdGlvbiBpZiBpcyBjaGFuZ2VkIGJ5IGRyYWdnaW5nXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFkcmFnZ2luZykge1xuICAgICAgb25Nb3Rpb25FbmQoKTtcbiAgICB9XG4gIH0sIFtkcmFnZ2luZ10pO1xuICB2YXIgbWVyZ2VkRGF0YSA9IG1vdGlvbiA/IHRyYW5zaXRpb25EYXRhIDogZGF0YTtcbiAgdmFyIHRyZWVOb2RlUmVxdWlyZWRQcm9wcyA9IHtcbiAgICBleHBhbmRlZEtleXM6IGV4cGFuZGVkS2V5cyxcbiAgICBzZWxlY3RlZEtleXM6IHNlbGVjdGVkS2V5cyxcbiAgICBsb2FkZWRLZXlzOiBsb2FkZWRLZXlzLFxuICAgIGxvYWRpbmdLZXlzOiBsb2FkaW5nS2V5cyxcbiAgICBjaGVja2VkS2V5czogY2hlY2tlZEtleXMsXG4gICAgaGFsZkNoZWNrZWRLZXlzOiBoYWxmQ2hlY2tlZEtleXMsXG4gICAgZHJhZ092ZXJOb2RlS2V5OiBkcmFnT3Zlck5vZGVLZXksXG4gICAgZHJvcFBvc2l0aW9uOiBkcm9wUG9zaXRpb24sXG4gICAga2V5RW50aXRpZXM6IGtleUVudGl0aWVzXG4gIH07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgZm9jdXNlZCAmJiBhY3RpdmVJdGVtICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgc3R5bGU6IEhJRERFTl9TVFlMRSxcbiAgICBcImFyaWEtbGl2ZVwiOiBcImFzc2VydGl2ZVwiXG4gIH0sIGdldEFjY2Vzc2liaWxpdHlQYXRoKGFjdGl2ZUl0ZW0pKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCB7XG4gICAgc3R5bGU6IEhJRERFTl9TVFlMRSxcbiAgICBkaXNhYmxlZDogZm9jdXNhYmxlID09PSBmYWxzZSB8fCBkaXNhYmxlZCxcbiAgICB0YWJJbmRleDogZm9jdXNhYmxlICE9PSBmYWxzZSA/IHRhYkluZGV4IDogbnVsbCxcbiAgICBvbktleURvd246IG9uS2V5RG93bixcbiAgICBvbkZvY3VzOiBvbkZvY3VzLFxuICAgIG9uQmx1cjogb25CbHVyLFxuICAgIHZhbHVlOiBcIlwiLFxuICAgIG9uQ2hhbmdlOiBub29wLFxuICAgIFwiYXJpYS1sYWJlbFwiOiBcImZvciBzY3JlZW4gcmVhZGVyXCJcbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRyZWVub2RlXCIpLFxuICAgIFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSxcbiAgICBzdHlsZToge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJyxcbiAgICAgIGhlaWdodDogMCxcbiAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgIGJvcmRlcjogMCxcbiAgICAgIHBhZGRpbmc6IDBcbiAgICB9XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5kZW50XCIpXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICByZWY6IGluZGVudE1lYXN1cmVyUmVmLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbmRlbnQtdW5pdFwiKVxuICB9KSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChWaXJ0dWFsTGlzdCwgX2V4dGVuZHMoe30sIGRvbVByb3BzLCB7XG4gICAgZGF0YTogbWVyZ2VkRGF0YSxcbiAgICBpdGVtS2V5OiBpdGVtS2V5LFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIGZ1bGxIZWlnaHQ6IGZhbHNlLFxuICAgIHZpcnR1YWw6IHZpcnR1YWwsXG4gICAgaXRlbUhlaWdodDogaXRlbUhlaWdodCxcbiAgICBwcmVmaXhDbHM6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbGlzdFwiKSxcbiAgICByZWY6IGxpc3RSZWYsXG4gICAgb25WaXNpYmxlQ2hhbmdlOiBmdW5jdGlvbiBvblZpc2libGVDaGFuZ2Uob3JpZ2luTGlzdCwgZnVsbExpc3QpIHtcbiAgICAgIHZhciBvcmlnaW5TZXQgPSBuZXcgU2V0KG9yaWdpbkxpc3QpO1xuICAgICAgdmFyIHJlc3RMaXN0ID0gZnVsbExpc3QuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHJldHVybiAhb3JpZ2luU2V0LmhhcyhpdGVtKTtcbiAgICAgIH0pO1xuICAgICAgLy8gTW90aW9uIG5vZGUgaXMgbm90IHJlbmRlci4gU2tpcCBtb3Rpb25cbiAgICAgIGlmIChyZXN0TGlzdC5zb21lKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHJldHVybiBpdGVtS2V5KGl0ZW0pID09PSBNT1RJT05fS0VZO1xuICAgICAgfSkpIHtcbiAgICAgICAgb25Nb3Rpb25FbmQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pLCBmdW5jdGlvbiAodHJlZU5vZGUpIHtcbiAgICB2YXIgcG9zID0gdHJlZU5vZGUucG9zLFxuICAgICAgcmVzdFByb3BzID0gX2V4dGVuZHMoe30sIChfb2JqZWN0RGVzdHJ1Y3R1cmluZ0VtcHR5KHRyZWVOb2RlLmRhdGEpLCB0cmVlTm9kZS5kYXRhKSksXG4gICAgICB0aXRsZSA9IHRyZWVOb2RlLnRpdGxlLFxuICAgICAga2V5ID0gdHJlZU5vZGUua2V5LFxuICAgICAgaXNTdGFydCA9IHRyZWVOb2RlLmlzU3RhcnQsXG4gICAgICBpc0VuZCA9IHRyZWVOb2RlLmlzRW5kO1xuICAgIHZhciBtZXJnZWRLZXkgPSBnZXRLZXkoa2V5LCBwb3MpO1xuICAgIGRlbGV0ZSByZXN0UHJvcHMua2V5O1xuICAgIGRlbGV0ZSByZXN0UHJvcHMuY2hpbGRyZW47XG4gICAgdmFyIHRyZWVOb2RlUHJvcHMgPSBnZXRUcmVlTm9kZVByb3BzKG1lcmdlZEtleSwgdHJlZU5vZGVSZXF1aXJlZFByb3BzKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTW90aW9uVHJlZU5vZGUsIF9leHRlbmRzKHt9LCByZXN0UHJvcHMsIHRyZWVOb2RlUHJvcHMsIHtcbiAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgIGFjdGl2ZTogISFhY3RpdmVJdGVtICYmIGtleSA9PT0gYWN0aXZlSXRlbS5rZXksXG4gICAgICBwb3M6IHBvcyxcbiAgICAgIGRhdGE6IHRyZWVOb2RlLmRhdGEsXG4gICAgICBpc1N0YXJ0OiBpc1N0YXJ0LFxuICAgICAgaXNFbmQ6IGlzRW5kLFxuICAgICAgbW90aW9uOiBtb3Rpb24sXG4gICAgICBtb3Rpb25Ob2Rlczoga2V5ID09PSBNT1RJT05fS0VZID8gdHJhbnNpdGlvblJhbmdlIDogbnVsbCxcbiAgICAgIG1vdGlvblR5cGU6IG1vdGlvblR5cGUsXG4gICAgICBvbk1vdGlvblN0YXJ0OiBvbkxpc3RDaGFuZ2VTdGFydCxcbiAgICAgIG9uTW90aW9uRW5kOiBvbk1vdGlvbkVuZCxcbiAgICAgIHRyZWVOb2RlUmVxdWlyZWRQcm9wczogdHJlZU5vZGVSZXF1aXJlZFByb3BzLFxuICAgICAgb25Nb3VzZU1vdmU6IGZ1bmN0aW9uIG9uTW91c2VNb3ZlKCkge1xuICAgICAgICBvbkFjdGl2ZUNoYW5nZShudWxsKTtcbiAgICAgIH1cbiAgICB9KSk7XG4gIH0pKTtcbn0pO1xuTm9kZUxpc3QuZGlzcGxheU5hbWUgPSAnTm9kZUxpc3QnO1xuZXhwb3J0IGRlZmF1bHQgTm9kZUxpc3Q7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gRHJvcEluZGljYXRvcihfcmVmKSB7XG4gIHZhciBkcm9wUG9zaXRpb24gPSBfcmVmLmRyb3BQb3NpdGlvbixcbiAgICBkcm9wTGV2ZWxPZmZzZXQgPSBfcmVmLmRyb3BMZXZlbE9mZnNldCxcbiAgICBpbmRlbnQgPSBfcmVmLmluZGVudDtcbiAgdmFyIHN0eWxlID0ge1xuICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICByaWdodDogMCxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZWQnLFxuICAgIGhlaWdodDogMlxuICB9O1xuICBzd2l0Y2ggKGRyb3BQb3NpdGlvbikge1xuICAgIGNhc2UgLTE6XG4gICAgICBzdHlsZS50b3AgPSAwO1xuICAgICAgc3R5bGUubGVmdCA9IC1kcm9wTGV2ZWxPZmZzZXQgKiBpbmRlbnQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE6XG4gICAgICBzdHlsZS5ib3R0b20gPSAwO1xuICAgICAgc3R5bGUubGVmdCA9IC1kcm9wTGV2ZWxPZmZzZXQgKiBpbmRlbnQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDA6XG4gICAgICBzdHlsZS5ib3R0b20gPSAwO1xuICAgICAgc3R5bGUubGVmdCA9IGluZGVudDtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgc3R5bGU6IHN0eWxlXG4gIH0pO1xufSIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2Fzc2VydFRoaXNJbml0aWFsaXplZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXNzZXJ0VGhpc0luaXRpYWxpemVkXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c1wiO1xuaW1wb3J0IF9jcmVhdGVTdXBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlU3VwZXJcIjtcbi8vIFRPRE86IGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE3L05PVEUtd2FpLWFyaWEtcHJhY3RpY2VzLTEuMS0yMDE3MTIxNC9leGFtcGxlcy90cmVldmlldy90cmVldmlldy0yL3RyZWV2aWV3LTJhLmh0bWxcbi8vIEZ1bGx5IGFjY2Vzc2liaWxpdHkgc3VwcG9ydFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEtleUNvZGUgZnJvbSBcInJjLXV0aWwvZXMvS2V5Q29kZVwiO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0IHBpY2tBdHRycyBmcm9tIFwicmMtdXRpbC9lcy9waWNrQXR0cnNcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgVHJlZUNvbnRleHQgfSBmcm9tICcuL2NvbnRleHRUeXBlcyc7XG5pbXBvcnQgeyBnZXREcmFnQ2hpbGRyZW5LZXlzLCBwYXJzZUNoZWNrZWRLZXlzLCBjb25kdWN0RXhwYW5kUGFyZW50LCBjYWxjU2VsZWN0ZWRLZXlzLCBjYWxjRHJvcFBvc2l0aW9uLCBhcnJBZGQsIGFyckRlbCwgcG9zVG9BcnIgfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHsgZmxhdHRlblRyZWVEYXRhLCBjb252ZXJ0VHJlZVRvRGF0YSwgY29udmVydERhdGFUb0VudGl0aWVzLCB3YXJuaW5nV2l0aG91dEtleSwgY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhLCBnZXRUcmVlTm9kZVByb3BzLCBmaWxsRmllbGROYW1lcyB9IGZyb20gJy4vdXRpbHMvdHJlZVV0aWwnO1xuaW1wb3J0IE5vZGVMaXN0LCB7IE1PVElPTl9LRVksIE1vdGlvbkVudGl0eSB9IGZyb20gJy4vTm9kZUxpc3QnO1xuaW1wb3J0IFRyZWVOb2RlIGZyb20gJy4vVHJlZU5vZGUnO1xuaW1wb3J0IHsgY29uZHVjdENoZWNrIH0gZnJvbSAnLi91dGlscy9jb25kdWN0VXRpbCc7XG5pbXBvcnQgRHJvcEluZGljYXRvciBmcm9tICcuL0Ryb3BJbmRpY2F0b3InO1xudmFyIE1BWF9SRVRSWV9USU1FUyA9IDEwO1xudmFyIFRyZWUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFRyZWUsIF9SZWFjdCRDb21wb25lbnQpO1xuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFRyZWUpO1xuICBmdW5jdGlvbiBUcmVlKCkge1xuICAgIHZhciBfdGhpcztcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVHJlZSk7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIF9hcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgX2FyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwuYXBwbHkoX3N1cGVyLCBbdGhpc10uY29uY2F0KF9hcmdzKSk7XG4gICAgX3RoaXMuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgX3RoaXMuZGVsYXllZERyYWdFbnRlckxvZ2ljID0gdm9pZCAwO1xuICAgIF90aGlzLmxvYWRpbmdSZXRyeVRpbWVzID0ge307XG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBrZXlFbnRpdGllczoge30sXG4gICAgICBpbmRlbnQ6IG51bGwsXG4gICAgICBzZWxlY3RlZEtleXM6IFtdLFxuICAgICAgY2hlY2tlZEtleXM6IFtdLFxuICAgICAgaGFsZkNoZWNrZWRLZXlzOiBbXSxcbiAgICAgIGxvYWRlZEtleXM6IFtdLFxuICAgICAgbG9hZGluZ0tleXM6IFtdLFxuICAgICAgZXhwYW5kZWRLZXlzOiBbXSxcbiAgICAgIGRyYWdnaW5nTm9kZUtleTogbnVsbCxcbiAgICAgIGRyYWdDaGlsZHJlbktleXM6IFtdLFxuICAgICAgLy8gZHJvcFRhcmdldEtleSBpcyB0aGUga2V5IG9mIGFic3RyYWN0LWRyb3Atbm9kZVxuICAgICAgLy8gdGhlIGFic3RyYWN0LWRyb3Atbm9kZSBpcyB0aGUgcmVhbCBkcm9wIG5vZGUgd2hlbiBkcmFnIGFuZCBkcm9wXG4gICAgICAvLyBub3QgdGhlIERPTSBkcmFnIG92ZXIgbm9kZVxuICAgICAgZHJvcFRhcmdldEtleTogbnVsbCxcbiAgICAgIGRyb3BQb3NpdGlvbjogbnVsbCxcbiAgICAgIGRyb3BDb250YWluZXJLZXk6IG51bGwsXG4gICAgICBkcm9wTGV2ZWxPZmZzZXQ6IG51bGwsXG4gICAgICBkcm9wVGFyZ2V0UG9zOiBudWxsLFxuICAgICAgZHJvcEFsbG93ZWQ6IHRydWUsXG4gICAgICAvLyB0aGUgYWJzdHJhY3QtZHJhZy1vdmVyLW5vZGVcbiAgICAgIC8vIGlmIG1vdXNlIGlzIG9uIHRoZSBib3R0b20gb2YgdG9wIGRvbSBub2RlIG9yIG5vIHRoZSB0b3Agb2YgdGhlIGJvdHRvbSBkb20gbm9kZVxuICAgICAgLy8gYWJzdHJhY3QtZHJhZy1vdmVyLW5vZGUgaXMgdGhlIHRvcCBub2RlXG4gICAgICBkcmFnT3Zlck5vZGVLZXk6IG51bGwsXG4gICAgICB0cmVlRGF0YTogW10sXG4gICAgICBmbGF0dGVuTm9kZXM6IFtdLFxuICAgICAgZm9jdXNlZDogZmFsc2UsXG4gICAgICBhY3RpdmVLZXk6IG51bGwsXG4gICAgICBsaXN0Q2hhbmdpbmc6IGZhbHNlLFxuICAgICAgcHJldlByb3BzOiBudWxsLFxuICAgICAgZmllbGROYW1lczogZmlsbEZpZWxkTmFtZXMoKVxuICAgIH07XG4gICAgX3RoaXMuZHJhZ1N0YXJ0TW91c2VQb3NpdGlvbiA9IG51bGw7XG4gICAgX3RoaXMuZHJhZ05vZGUgPSB2b2lkIDA7XG4gICAgX3RoaXMuY3VycmVudE1vdXNlT3ZlckRyb3BwYWJsZU5vZGVLZXkgPSBudWxsO1xuICAgIF90aGlzLmxpc3RSZWYgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlUmVmKCk7XG4gICAgX3RoaXMub25Ob2RlRHJhZ1N0YXJ0ID0gZnVuY3Rpb24gKGV2ZW50LCBub2RlKSB7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUgPSBfdGhpcy5zdGF0ZSxcbiAgICAgICAgZXhwYW5kZWRLZXlzID0gX3RoaXMkc3RhdGUuZXhwYW5kZWRLZXlzLFxuICAgICAgICBrZXlFbnRpdGllcyA9IF90aGlzJHN0YXRlLmtleUVudGl0aWVzO1xuICAgICAgdmFyIG9uRHJhZ1N0YXJ0ID0gX3RoaXMucHJvcHMub25EcmFnU3RhcnQ7XG4gICAgICB2YXIgZXZlbnRLZXkgPSBub2RlLnByb3BzLmV2ZW50S2V5O1xuICAgICAgX3RoaXMuZHJhZ05vZGUgPSBub2RlO1xuICAgICAgX3RoaXMuZHJhZ1N0YXJ0TW91c2VQb3NpdGlvbiA9IHtcbiAgICAgICAgeDogZXZlbnQuY2xpZW50WCxcbiAgICAgICAgeTogZXZlbnQuY2xpZW50WVxuICAgICAgfTtcbiAgICAgIHZhciBuZXdFeHBhbmRlZEtleXMgPSBhcnJEZWwoZXhwYW5kZWRLZXlzLCBldmVudEtleSk7XG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGRyYWdnaW5nTm9kZUtleTogZXZlbnRLZXksXG4gICAgICAgIGRyYWdDaGlsZHJlbktleXM6IGdldERyYWdDaGlsZHJlbktleXMoZXZlbnRLZXksIGtleUVudGl0aWVzKSxcbiAgICAgICAgaW5kZW50OiBfdGhpcy5saXN0UmVmLmN1cnJlbnQuZ2V0SW5kZW50V2lkdGgoKVxuICAgICAgfSk7XG4gICAgICBfdGhpcy5zZXRFeHBhbmRlZEtleXMobmV3RXhwYW5kZWRLZXlzKTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW5kJywgX3RoaXMub25XaW5kb3dEcmFnRW5kKTtcbiAgICAgIG9uRHJhZ1N0YXJ0ID09PSBudWxsIHx8IG9uRHJhZ1N0YXJ0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkRyYWdTdGFydCh7XG4gICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgbm9kZTogY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhKG5vZGUucHJvcHMpXG4gICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFtMZWdhY3ldIFNlbGVjdCBoYW5kbGVyIGlzIHNtYWxsZXIgdGhhbiBub2RlLFxuICAgICAqIHNvIHRoYXQgdGhpcyB3aWxsIHRyaWdnZXIgd2hlbiBkcmFnIGVudGVyIG5vZGUgb3Igc2VsZWN0IGhhbmRsZXIuXG4gICAgICogVGhpcyBpcyBhIGxpdHRsZSB0cmlja3kgaWYgY3VzdG9taXplIGNzcyB3aXRob3V0IHBhZGRpbmcuXG4gICAgICogQmV0dGVyIGZvciB1c2UgbW91c2UgbW92ZSBldmVudCB0byByZWZyZXNoIGRyYWcgc3RhdGUuXG4gICAgICogQnV0IGxldCdzIGp1c3Qga2VlcCBpdCB0byBhdm9pZCBldmVudCB0cmlnZ2VyIGxvZ2ljIGNoYW5nZS5cbiAgICAgKi9cbiAgICBfdGhpcy5vbk5vZGVEcmFnRW50ZXIgPSBmdW5jdGlvbiAoZXZlbnQsIG5vZGUpIHtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZTIgPSBfdGhpcy5zdGF0ZSxcbiAgICAgICAgZXhwYW5kZWRLZXlzID0gX3RoaXMkc3RhdGUyLmV4cGFuZGVkS2V5cyxcbiAgICAgICAga2V5RW50aXRpZXMgPSBfdGhpcyRzdGF0ZTIua2V5RW50aXRpZXMsXG4gICAgICAgIGRyYWdDaGlsZHJlbktleXMgPSBfdGhpcyRzdGF0ZTIuZHJhZ0NoaWxkcmVuS2V5cyxcbiAgICAgICAgZmxhdHRlbk5vZGVzID0gX3RoaXMkc3RhdGUyLmZsYXR0ZW5Ob2RlcyxcbiAgICAgICAgaW5kZW50ID0gX3RoaXMkc3RhdGUyLmluZGVudDtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICBvbkRyYWdFbnRlciA9IF90aGlzJHByb3BzLm9uRHJhZ0VudGVyLFxuICAgICAgICBvbkV4cGFuZCA9IF90aGlzJHByb3BzLm9uRXhwYW5kLFxuICAgICAgICBhbGxvd0Ryb3AgPSBfdGhpcyRwcm9wcy5hbGxvd0Ryb3AsXG4gICAgICAgIGRpcmVjdGlvbiA9IF90aGlzJHByb3BzLmRpcmVjdGlvbjtcbiAgICAgIHZhciBfbm9kZSRwcm9wcyA9IG5vZGUucHJvcHMsXG4gICAgICAgIHBvcyA9IF9ub2RlJHByb3BzLnBvcyxcbiAgICAgICAgZXZlbnRLZXkgPSBfbm9kZSRwcm9wcy5ldmVudEtleTtcbiAgICAgIHZhciBfYXNzZXJ0VGhpc0luaXRpYWxpemUgPSBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSxcbiAgICAgICAgZHJhZ05vZGUgPSBfYXNzZXJ0VGhpc0luaXRpYWxpemUuZHJhZ05vZGU7XG4gICAgICAvLyByZWNvcmQgdGhlIGtleSBvZiBub2RlIHdoaWNoIGlzIGxhdGVzdCBlbnRlcmVkLCB1c2VkIGluIGRyYWdsZWF2ZSBldmVudC5cbiAgICAgIGlmIChfdGhpcy5jdXJyZW50TW91c2VPdmVyRHJvcHBhYmxlTm9kZUtleSAhPT0gZXZlbnRLZXkpIHtcbiAgICAgICAgX3RoaXMuY3VycmVudE1vdXNlT3ZlckRyb3BwYWJsZU5vZGVLZXkgPSBldmVudEtleTtcbiAgICAgIH1cbiAgICAgIGlmICghZHJhZ05vZGUpIHtcbiAgICAgICAgX3RoaXMucmVzZXREcmFnU3RhdGUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIF9jYWxjRHJvcFBvc2l0aW9uID0gY2FsY0Ryb3BQb3NpdGlvbihldmVudCwgZHJhZ05vZGUsIG5vZGUsIGluZGVudCwgX3RoaXMuZHJhZ1N0YXJ0TW91c2VQb3NpdGlvbiwgYWxsb3dEcm9wLCBmbGF0dGVuTm9kZXMsIGtleUVudGl0aWVzLCBleHBhbmRlZEtleXMsIGRpcmVjdGlvbiksXG4gICAgICAgIGRyb3BQb3NpdGlvbiA9IF9jYWxjRHJvcFBvc2l0aW9uLmRyb3BQb3NpdGlvbixcbiAgICAgICAgZHJvcExldmVsT2Zmc2V0ID0gX2NhbGNEcm9wUG9zaXRpb24uZHJvcExldmVsT2Zmc2V0LFxuICAgICAgICBkcm9wVGFyZ2V0S2V5ID0gX2NhbGNEcm9wUG9zaXRpb24uZHJvcFRhcmdldEtleSxcbiAgICAgICAgZHJvcENvbnRhaW5lcktleSA9IF9jYWxjRHJvcFBvc2l0aW9uLmRyb3BDb250YWluZXJLZXksXG4gICAgICAgIGRyb3BUYXJnZXRQb3MgPSBfY2FsY0Ryb3BQb3NpdGlvbi5kcm9wVGFyZ2V0UG9zLFxuICAgICAgICBkcm9wQWxsb3dlZCA9IF9jYWxjRHJvcFBvc2l0aW9uLmRyb3BBbGxvd2VkLFxuICAgICAgICBkcmFnT3Zlck5vZGVLZXkgPSBfY2FsY0Ryb3BQb3NpdGlvbi5kcmFnT3Zlck5vZGVLZXk7XG4gICAgICBpZiAoXG4gICAgICAvLyBkb24ndCBhbGxvdyBkcm9wIGluc2lkZSBpdHMgY2hpbGRyZW5cbiAgICAgIGRyYWdDaGlsZHJlbktleXMuaW5kZXhPZihkcm9wVGFyZ2V0S2V5KSAhPT0gLTEgfHxcbiAgICAgIC8vIGRvbid0IGFsbG93IGRyb3Agd2hlbiBkcm9wIGlzIG5vdCBhbGxvd2VkIGNhY3VsYXRlZCBieSBjYWxjRHJvcFBvc2l0aW9uXG4gICAgICAhZHJvcEFsbG93ZWQpIHtcbiAgICAgICAgX3RoaXMucmVzZXREcmFnU3RhdGUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gU2lkZSBlZmZlY3QgZm9yIGRlbGF5IGRyYWdcbiAgICAgIGlmICghX3RoaXMuZGVsYXllZERyYWdFbnRlckxvZ2ljKSB7XG4gICAgICAgIF90aGlzLmRlbGF5ZWREcmFnRW50ZXJMb2dpYyA9IHt9O1xuICAgICAgfVxuICAgICAgT2JqZWN0LmtleXMoX3RoaXMuZGVsYXllZERyYWdFbnRlckxvZ2ljKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KF90aGlzLmRlbGF5ZWREcmFnRW50ZXJMb2dpY1trZXldKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGRyYWdOb2RlLnByb3BzLmV2ZW50S2V5ICE9PSBub2RlLnByb3BzLmV2ZW50S2V5KSB7XG4gICAgICAgIC8vIGhvaXN0IGV4cGFuZCBsb2dpYyBoZXJlXG4gICAgICAgIC8vIHNpbmNlIGlmIGxvZ2ljIGlzIG9uIHRoZSBib3R0b21cbiAgICAgICAgLy8gaXQgd2lsbCBiZSBibG9ja2VkIGJ5IGFic3RyYWN0IGRyYWdvdmVyIG5vZGUgY2hlY2tcbiAgICAgICAgLy8gICA9PiBpZiB5b3UgZHJhZ2VudGVyIGZyb20gdG9wLCB5b3UgbW91c2Ugd2lsbCBzdGlsbCBiZSBjb25zaWRlciBhcyBpbiB0aGUgdG9wIG5vZGVcbiAgICAgICAgZXZlbnQucGVyc2lzdCgpO1xuICAgICAgICBfdGhpcy5kZWxheWVkRHJhZ0VudGVyTG9naWNbcG9zXSA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoX3RoaXMuc3RhdGUuZHJhZ2dpbmdOb2RlS2V5ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgICAgdmFyIG5ld0V4cGFuZGVkS2V5cyA9IF90b0NvbnN1bWFibGVBcnJheShleHBhbmRlZEtleXMpO1xuICAgICAgICAgIHZhciBlbnRpdHkgPSBrZXlFbnRpdGllc1tub2RlLnByb3BzLmV2ZW50S2V5XTtcbiAgICAgICAgICBpZiAoZW50aXR5ICYmIChlbnRpdHkuY2hpbGRyZW4gfHwgW10pLmxlbmd0aCkge1xuICAgICAgICAgICAgbmV3RXhwYW5kZWRLZXlzID0gYXJyQWRkKGV4cGFuZGVkS2V5cywgbm9kZS5wcm9wcy5ldmVudEtleSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghKCdleHBhbmRlZEtleXMnIGluIF90aGlzLnByb3BzKSkge1xuICAgICAgICAgICAgX3RoaXMuc2V0RXhwYW5kZWRLZXlzKG5ld0V4cGFuZGVkS2V5cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9uRXhwYW5kID09PSBudWxsIHx8IG9uRXhwYW5kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkV4cGFuZChuZXdFeHBhbmRlZEtleXMsIHtcbiAgICAgICAgICAgIG5vZGU6IGNvbnZlcnROb2RlUHJvcHNUb0V2ZW50RGF0YShub2RlLnByb3BzKSxcbiAgICAgICAgICAgIGV4cGFuZGVkOiB0cnVlLFxuICAgICAgICAgICAgbmF0aXZlRXZlbnQ6IGV2ZW50Lm5hdGl2ZUV2ZW50XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIDgwMCk7XG4gICAgICB9XG4gICAgICAvLyBTa2lwIGlmIGRyYWcgbm9kZSBpcyBzZWxmXG4gICAgICBpZiAoZHJhZ05vZGUucHJvcHMuZXZlbnRLZXkgPT09IGRyb3BUYXJnZXRLZXkgJiYgZHJvcExldmVsT2Zmc2V0ID09PSAwKSB7XG4gICAgICAgIF90aGlzLnJlc2V0RHJhZ1N0YXRlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFVwZGF0ZSBkcmFnIG92ZXIgbm9kZSBhbmQgZHJhZyBzdGF0ZVxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBkcmFnT3Zlck5vZGVLZXk6IGRyYWdPdmVyTm9kZUtleSxcbiAgICAgICAgZHJvcFBvc2l0aW9uOiBkcm9wUG9zaXRpb24sXG4gICAgICAgIGRyb3BMZXZlbE9mZnNldDogZHJvcExldmVsT2Zmc2V0LFxuICAgICAgICBkcm9wVGFyZ2V0S2V5OiBkcm9wVGFyZ2V0S2V5LFxuICAgICAgICBkcm9wQ29udGFpbmVyS2V5OiBkcm9wQ29udGFpbmVyS2V5LFxuICAgICAgICBkcm9wVGFyZ2V0UG9zOiBkcm9wVGFyZ2V0UG9zLFxuICAgICAgICBkcm9wQWxsb3dlZDogZHJvcEFsbG93ZWRcbiAgICAgIH0pO1xuICAgICAgb25EcmFnRW50ZXIgPT09IG51bGwgfHwgb25EcmFnRW50ZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRHJhZ0VudGVyKHtcbiAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICBub2RlOiBjb252ZXJ0Tm9kZVByb3BzVG9FdmVudERhdGEobm9kZS5wcm9wcyksXG4gICAgICAgIGV4cGFuZGVkS2V5czogZXhwYW5kZWRLZXlzXG4gICAgICB9KTtcbiAgICB9O1xuICAgIF90aGlzLm9uTm9kZURyYWdPdmVyID0gZnVuY3Rpb24gKGV2ZW50LCBub2RlKSB7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUzID0gX3RoaXMuc3RhdGUsXG4gICAgICAgIGRyYWdDaGlsZHJlbktleXMgPSBfdGhpcyRzdGF0ZTMuZHJhZ0NoaWxkcmVuS2V5cyxcbiAgICAgICAgZmxhdHRlbk5vZGVzID0gX3RoaXMkc3RhdGUzLmZsYXR0ZW5Ob2RlcyxcbiAgICAgICAga2V5RW50aXRpZXMgPSBfdGhpcyRzdGF0ZTMua2V5RW50aXRpZXMsXG4gICAgICAgIGV4cGFuZGVkS2V5cyA9IF90aGlzJHN0YXRlMy5leHBhbmRlZEtleXMsXG4gICAgICAgIGluZGVudCA9IF90aGlzJHN0YXRlMy5pbmRlbnQ7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gX3RoaXMucHJvcHMsXG4gICAgICAgIG9uRHJhZ092ZXIgPSBfdGhpcyRwcm9wczIub25EcmFnT3ZlcixcbiAgICAgICAgYWxsb3dEcm9wID0gX3RoaXMkcHJvcHMyLmFsbG93RHJvcCxcbiAgICAgICAgZGlyZWN0aW9uID0gX3RoaXMkcHJvcHMyLmRpcmVjdGlvbjtcbiAgICAgIHZhciBfYXNzZXJ0VGhpc0luaXRpYWxpemUyID0gX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksXG4gICAgICAgIGRyYWdOb2RlID0gX2Fzc2VydFRoaXNJbml0aWFsaXplMi5kcmFnTm9kZTtcbiAgICAgIGlmICghZHJhZ05vZGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIF9jYWxjRHJvcFBvc2l0aW9uMiA9IGNhbGNEcm9wUG9zaXRpb24oZXZlbnQsIGRyYWdOb2RlLCBub2RlLCBpbmRlbnQsIF90aGlzLmRyYWdTdGFydE1vdXNlUG9zaXRpb24sIGFsbG93RHJvcCwgZmxhdHRlbk5vZGVzLCBrZXlFbnRpdGllcywgZXhwYW5kZWRLZXlzLCBkaXJlY3Rpb24pLFxuICAgICAgICBkcm9wUG9zaXRpb24gPSBfY2FsY0Ryb3BQb3NpdGlvbjIuZHJvcFBvc2l0aW9uLFxuICAgICAgICBkcm9wTGV2ZWxPZmZzZXQgPSBfY2FsY0Ryb3BQb3NpdGlvbjIuZHJvcExldmVsT2Zmc2V0LFxuICAgICAgICBkcm9wVGFyZ2V0S2V5ID0gX2NhbGNEcm9wUG9zaXRpb24yLmRyb3BUYXJnZXRLZXksXG4gICAgICAgIGRyb3BDb250YWluZXJLZXkgPSBfY2FsY0Ryb3BQb3NpdGlvbjIuZHJvcENvbnRhaW5lcktleSxcbiAgICAgICAgZHJvcEFsbG93ZWQgPSBfY2FsY0Ryb3BQb3NpdGlvbjIuZHJvcEFsbG93ZWQsXG4gICAgICAgIGRyb3BUYXJnZXRQb3MgPSBfY2FsY0Ryb3BQb3NpdGlvbjIuZHJvcFRhcmdldFBvcyxcbiAgICAgICAgZHJhZ092ZXJOb2RlS2V5ID0gX2NhbGNEcm9wUG9zaXRpb24yLmRyYWdPdmVyTm9kZUtleTtcbiAgICAgIGlmIChkcmFnQ2hpbGRyZW5LZXlzLmluZGV4T2YoZHJvcFRhcmdldEtleSkgIT09IC0xIHx8ICFkcm9wQWxsb3dlZCkge1xuICAgICAgICAvLyBkb24ndCBhbGxvdyBkcm9wIGluc2lkZSBpdHMgY2hpbGRyZW5cbiAgICAgICAgLy8gZG9uJ3QgYWxsb3cgZHJvcCB3aGVuIGRyb3AgaXMgbm90IGFsbG93ZWQgY2FjdWxhdGVkIGJ5IGNhbGNEcm9wUG9zaXRpb25cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gVXBkYXRlIGRyYWcgcG9zaXRpb25cbiAgICAgIGlmIChkcmFnTm9kZS5wcm9wcy5ldmVudEtleSA9PT0gZHJvcFRhcmdldEtleSAmJiBkcm9wTGV2ZWxPZmZzZXQgPT09IDApIHtcbiAgICAgICAgaWYgKCEoX3RoaXMuc3RhdGUuZHJvcFBvc2l0aW9uID09PSBudWxsICYmIF90aGlzLnN0YXRlLmRyb3BMZXZlbE9mZnNldCA9PT0gbnVsbCAmJiBfdGhpcy5zdGF0ZS5kcm9wVGFyZ2V0S2V5ID09PSBudWxsICYmIF90aGlzLnN0YXRlLmRyb3BDb250YWluZXJLZXkgPT09IG51bGwgJiYgX3RoaXMuc3RhdGUuZHJvcFRhcmdldFBvcyA9PT0gbnVsbCAmJiBfdGhpcy5zdGF0ZS5kcm9wQWxsb3dlZCA9PT0gZmFsc2UgJiYgX3RoaXMuc3RhdGUuZHJhZ092ZXJOb2RlS2V5ID09PSBudWxsKSkge1xuICAgICAgICAgIF90aGlzLnJlc2V0RHJhZ1N0YXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIShkcm9wUG9zaXRpb24gPT09IF90aGlzLnN0YXRlLmRyb3BQb3NpdGlvbiAmJiBkcm9wTGV2ZWxPZmZzZXQgPT09IF90aGlzLnN0YXRlLmRyb3BMZXZlbE9mZnNldCAmJiBkcm9wVGFyZ2V0S2V5ID09PSBfdGhpcy5zdGF0ZS5kcm9wVGFyZ2V0S2V5ICYmIGRyb3BDb250YWluZXJLZXkgPT09IF90aGlzLnN0YXRlLmRyb3BDb250YWluZXJLZXkgJiYgZHJvcFRhcmdldFBvcyA9PT0gX3RoaXMuc3RhdGUuZHJvcFRhcmdldFBvcyAmJiBkcm9wQWxsb3dlZCA9PT0gX3RoaXMuc3RhdGUuZHJvcEFsbG93ZWQgJiYgZHJhZ092ZXJOb2RlS2V5ID09PSBfdGhpcy5zdGF0ZS5kcmFnT3Zlck5vZGVLZXkpKSB7XG4gICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBkcm9wUG9zaXRpb246IGRyb3BQb3NpdGlvbixcbiAgICAgICAgICBkcm9wTGV2ZWxPZmZzZXQ6IGRyb3BMZXZlbE9mZnNldCxcbiAgICAgICAgICBkcm9wVGFyZ2V0S2V5OiBkcm9wVGFyZ2V0S2V5LFxuICAgICAgICAgIGRyb3BDb250YWluZXJLZXk6IGRyb3BDb250YWluZXJLZXksXG4gICAgICAgICAgZHJvcFRhcmdldFBvczogZHJvcFRhcmdldFBvcyxcbiAgICAgICAgICBkcm9wQWxsb3dlZDogZHJvcEFsbG93ZWQsXG4gICAgICAgICAgZHJhZ092ZXJOb2RlS2V5OiBkcmFnT3Zlck5vZGVLZXlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBvbkRyYWdPdmVyID09PSBudWxsIHx8IG9uRHJhZ092ZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRHJhZ092ZXIoe1xuICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgIG5vZGU6IGNvbnZlcnROb2RlUHJvcHNUb0V2ZW50RGF0YShub2RlLnByb3BzKVxuICAgICAgfSk7XG4gICAgfTtcbiAgICBfdGhpcy5vbk5vZGVEcmFnTGVhdmUgPSBmdW5jdGlvbiAoZXZlbnQsIG5vZGUpIHtcbiAgICAgIC8vIGlmIGl0IGlzIG91dHNpZGUgdGhlIGRyb3BwYWJsZSBhcmVhXG4gICAgICAvLyBjdXJyZW50TW91c2VPdmVyRHJvcHBhYmxlTm9kZUtleSB3aWxsIGJlIHVwZGF0ZWQgaW4gZHJhZ2VudGVyIGV2ZW50IHdoZW4gaW50byBhbm90aGVyIGRyb3BwYWJsZSByZWNlaXZlci5cbiAgICAgIGlmIChfdGhpcy5jdXJyZW50TW91c2VPdmVyRHJvcHBhYmxlTm9kZUtleSA9PT0gbm9kZS5wcm9wcy5ldmVudEtleSAmJiAhZXZlbnQuY3VycmVudFRhcmdldC5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KSkge1xuICAgICAgICBfdGhpcy5yZXNldERyYWdTdGF0ZSgpO1xuICAgICAgICBfdGhpcy5jdXJyZW50TW91c2VPdmVyRHJvcHBhYmxlTm9kZUtleSA9IG51bGw7XG4gICAgICB9XG4gICAgICB2YXIgb25EcmFnTGVhdmUgPSBfdGhpcy5wcm9wcy5vbkRyYWdMZWF2ZTtcbiAgICAgIG9uRHJhZ0xlYXZlID09PSBudWxsIHx8IG9uRHJhZ0xlYXZlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkRyYWdMZWF2ZSh7XG4gICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgbm9kZTogY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhKG5vZGUucHJvcHMpXG4gICAgICB9KTtcbiAgICB9O1xuICAgIC8vIHNpbmNlIHN0b3BQcm9wYWdhdGlvbigpIGlzIGNhbGxlZCBpbiB0cmVlTm9kZVxuICAgIC8vIGlmIG9uV2luZG93RHJhZyBpcyBjYWxsZWQsIHdoaWNlIG1lYW5zIHN0YXRlIGlzIGtlZXBlZCwgZHJhZyBzdGF0ZSBzaG91bGQgYmUgY2xlYXJlZFxuICAgIF90aGlzLm9uV2luZG93RHJhZ0VuZCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgX3RoaXMub25Ob2RlRHJhZ0VuZChldmVudCwgbnVsbCwgdHJ1ZSk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2VuZCcsIF90aGlzLm9uV2luZG93RHJhZ0VuZCk7XG4gICAgfTtcbiAgICAvLyBpZiBvbk5vZGVEcmFnRW5kIGlzIGNhbGxlZCwgb25XaW5kb3dEcmFnRW5kIHdvbid0IGJlIGNhbGxlZCBzaW5jZSBzdG9wUHJvcGFnYXRpb24oKSBpcyBjYWxsZWRcbiAgICBfdGhpcy5vbk5vZGVEcmFnRW5kID0gZnVuY3Rpb24gKGV2ZW50LCBub2RlKSB7XG4gICAgICB2YXIgb25EcmFnRW5kID0gX3RoaXMucHJvcHMub25EcmFnRW5kO1xuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBkcmFnT3Zlck5vZGVLZXk6IG51bGxcbiAgICAgIH0pO1xuICAgICAgX3RoaXMuY2xlYW5EcmFnU3RhdGUoKTtcbiAgICAgIG9uRHJhZ0VuZCA9PT0gbnVsbCB8fCBvbkRyYWdFbmQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRHJhZ0VuZCh7XG4gICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgbm9kZTogY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhKG5vZGUucHJvcHMpXG4gICAgICB9KTtcbiAgICAgIF90aGlzLmRyYWdOb2RlID0gbnVsbDtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnZW5kJywgX3RoaXMub25XaW5kb3dEcmFnRW5kKTtcbiAgICB9O1xuICAgIF90aGlzLm9uTm9kZURyb3AgPSBmdW5jdGlvbiAoZXZlbnQsIG5vZGUpIHtcbiAgICAgIHZhciBfdGhpcyRnZXRBY3RpdmVJdGVtO1xuICAgICAgdmFyIG91dHNpZGVUcmVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZTQgPSBfdGhpcy5zdGF0ZSxcbiAgICAgICAgZHJhZ0NoaWxkcmVuS2V5cyA9IF90aGlzJHN0YXRlNC5kcmFnQ2hpbGRyZW5LZXlzLFxuICAgICAgICBkcm9wUG9zaXRpb24gPSBfdGhpcyRzdGF0ZTQuZHJvcFBvc2l0aW9uLFxuICAgICAgICBkcm9wVGFyZ2V0S2V5ID0gX3RoaXMkc3RhdGU0LmRyb3BUYXJnZXRLZXksXG4gICAgICAgIGRyb3BUYXJnZXRQb3MgPSBfdGhpcyRzdGF0ZTQuZHJvcFRhcmdldFBvcyxcbiAgICAgICAgZHJvcEFsbG93ZWQgPSBfdGhpcyRzdGF0ZTQuZHJvcEFsbG93ZWQ7XG4gICAgICBpZiAoIWRyb3BBbGxvd2VkKSByZXR1cm47XG4gICAgICB2YXIgb25Ecm9wID0gX3RoaXMucHJvcHMub25Ecm9wO1xuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBkcmFnT3Zlck5vZGVLZXk6IG51bGxcbiAgICAgIH0pO1xuICAgICAgX3RoaXMuY2xlYW5EcmFnU3RhdGUoKTtcbiAgICAgIGlmIChkcm9wVGFyZ2V0S2V5ID09PSBudWxsKSByZXR1cm47XG4gICAgICB2YXIgYWJzdHJhY3REcm9wTm9kZVByb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBnZXRUcmVlTm9kZVByb3BzKGRyb3BUYXJnZXRLZXksIF90aGlzLmdldFRyZWVOb2RlUmVxdWlyZWRQcm9wcygpKSksIHt9LCB7XG4gICAgICAgIGFjdGl2ZTogKChfdGhpcyRnZXRBY3RpdmVJdGVtID0gX3RoaXMuZ2V0QWN0aXZlSXRlbSgpKSA9PT0gbnVsbCB8fCBfdGhpcyRnZXRBY3RpdmVJdGVtID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRnZXRBY3RpdmVJdGVtLmtleSkgPT09IGRyb3BUYXJnZXRLZXksXG4gICAgICAgIGRhdGE6IF90aGlzLnN0YXRlLmtleUVudGl0aWVzW2Ryb3BUYXJnZXRLZXldLm5vZGVcbiAgICAgIH0pO1xuICAgICAgdmFyIGRyb3BUb0NoaWxkID0gZHJhZ0NoaWxkcmVuS2V5cy5pbmRleE9mKGRyb3BUYXJnZXRLZXkpICE9PSAtMTtcbiAgICAgIHdhcm5pbmcoIWRyb3BUb0NoaWxkLCBcIkNhbiBub3QgZHJvcCB0byBkcmFnTm9kZSdzIGNoaWxkcmVuIG5vZGUuIFRoaXMgaXMgYSBidWcgb2YgcmMtdHJlZS4gUGxlYXNlIHJlcG9ydCBhbiBpc3N1ZS5cIik7XG4gICAgICB2YXIgcG9zQXJyID0gcG9zVG9BcnIoZHJvcFRhcmdldFBvcyk7XG4gICAgICB2YXIgZHJvcFJlc3VsdCA9IHtcbiAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICBub2RlOiBjb252ZXJ0Tm9kZVByb3BzVG9FdmVudERhdGEoYWJzdHJhY3REcm9wTm9kZVByb3BzKSxcbiAgICAgICAgZHJhZ05vZGU6IF90aGlzLmRyYWdOb2RlID8gY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhKF90aGlzLmRyYWdOb2RlLnByb3BzKSA6IG51bGwsXG4gICAgICAgIGRyYWdOb2Rlc0tleXM6IFtfdGhpcy5kcmFnTm9kZS5wcm9wcy5ldmVudEtleV0uY29uY2F0KGRyYWdDaGlsZHJlbktleXMpLFxuICAgICAgICBkcm9wVG9HYXA6IGRyb3BQb3NpdGlvbiAhPT0gMCxcbiAgICAgICAgZHJvcFBvc2l0aW9uOiBkcm9wUG9zaXRpb24gKyBOdW1iZXIocG9zQXJyW3Bvc0Fyci5sZW5ndGggLSAxXSlcbiAgICAgIH07XG4gICAgICBpZiAoIW91dHNpZGVUcmVlKSB7XG4gICAgICAgIG9uRHJvcCA9PT0gbnVsbCB8fCBvbkRyb3AgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRHJvcChkcm9wUmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIF90aGlzLmRyYWdOb2RlID0gbnVsbDtcbiAgICB9O1xuICAgIF90aGlzLmNsZWFuRHJhZ1N0YXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGRyYWdnaW5nTm9kZUtleSA9IF90aGlzLnN0YXRlLmRyYWdnaW5nTm9kZUtleTtcbiAgICAgIGlmIChkcmFnZ2luZ05vZGVLZXkgIT09IG51bGwpIHtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGRyYWdnaW5nTm9kZUtleTogbnVsbCxcbiAgICAgICAgICBkcm9wUG9zaXRpb246IG51bGwsXG4gICAgICAgICAgZHJvcENvbnRhaW5lcktleTogbnVsbCxcbiAgICAgICAgICBkcm9wVGFyZ2V0S2V5OiBudWxsLFxuICAgICAgICAgIGRyb3BMZXZlbE9mZnNldDogbnVsbCxcbiAgICAgICAgICBkcm9wQWxsb3dlZDogdHJ1ZSxcbiAgICAgICAgICBkcmFnT3Zlck5vZGVLZXk6IG51bGxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBfdGhpcy5kcmFnU3RhcnRNb3VzZVBvc2l0aW9uID0gbnVsbDtcbiAgICAgIF90aGlzLmN1cnJlbnRNb3VzZU92ZXJEcm9wcGFibGVOb2RlS2V5ID0gbnVsbDtcbiAgICB9O1xuICAgIF90aGlzLnRyaWdnZXJFeHBhbmRBY3Rpb25FeHBhbmQgPSBmdW5jdGlvbiAoZSwgdHJlZU5vZGUpIHtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZTUgPSBfdGhpcy5zdGF0ZSxcbiAgICAgICAgZXhwYW5kZWRLZXlzID0gX3RoaXMkc3RhdGU1LmV4cGFuZGVkS2V5cyxcbiAgICAgICAgZmxhdHRlbk5vZGVzID0gX3RoaXMkc3RhdGU1LmZsYXR0ZW5Ob2RlcztcbiAgICAgIHZhciBleHBhbmRlZCA9IHRyZWVOb2RlLmV4cGFuZGVkLFxuICAgICAgICBrZXkgPSB0cmVlTm9kZS5rZXksXG4gICAgICAgIGlzTGVhZiA9IHRyZWVOb2RlLmlzTGVhZjtcbiAgICAgIGlmIChpc0xlYWYgfHwgZS5zaGlmdEtleSB8fCBlLm1ldGFLZXkgfHwgZS5jdHJsS2V5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBub2RlID0gZmxhdHRlbk5vZGVzLmZpbHRlcihmdW5jdGlvbiAobm9kZUl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIG5vZGVJdGVtLmtleSA9PT0ga2V5O1xuICAgICAgfSlbMF07XG4gICAgICB2YXIgZXZlbnROb2RlID0gY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZ2V0VHJlZU5vZGVQcm9wcyhrZXksIF90aGlzLmdldFRyZWVOb2RlUmVxdWlyZWRQcm9wcygpKSksIHt9LCB7XG4gICAgICAgIGRhdGE6IG5vZGUuZGF0YVxuICAgICAgfSkpO1xuICAgICAgX3RoaXMuc2V0RXhwYW5kZWRLZXlzKGV4cGFuZGVkID8gYXJyRGVsKGV4cGFuZGVkS2V5cywga2V5KSA6IGFyckFkZChleHBhbmRlZEtleXMsIGtleSkpO1xuICAgICAgX3RoaXMub25Ob2RlRXhwYW5kKGUsIGV2ZW50Tm9kZSk7XG4gICAgfTtcbiAgICBfdGhpcy5vbk5vZGVDbGljayA9IGZ1bmN0aW9uIChlLCB0cmVlTm9kZSkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMyA9IF90aGlzLnByb3BzLFxuICAgICAgICBvbkNsaWNrID0gX3RoaXMkcHJvcHMzLm9uQ2xpY2ssXG4gICAgICAgIGV4cGFuZEFjdGlvbiA9IF90aGlzJHByb3BzMy5leHBhbmRBY3Rpb247XG4gICAgICBpZiAoZXhwYW5kQWN0aW9uID09PSAnY2xpY2snKSB7XG4gICAgICAgIF90aGlzLnRyaWdnZXJFeHBhbmRBY3Rpb25FeHBhbmQoZSwgdHJlZU5vZGUpO1xuICAgICAgfVxuICAgICAgb25DbGljayA9PT0gbnVsbCB8fCBvbkNsaWNrID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNsaWNrKGUsIHRyZWVOb2RlKTtcbiAgICB9O1xuICAgIF90aGlzLm9uTm9kZURvdWJsZUNsaWNrID0gZnVuY3Rpb24gKGUsIHRyZWVOb2RlKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM0ID0gX3RoaXMucHJvcHMsXG4gICAgICAgIG9uRG91YmxlQ2xpY2sgPSBfdGhpcyRwcm9wczQub25Eb3VibGVDbGljayxcbiAgICAgICAgZXhwYW5kQWN0aW9uID0gX3RoaXMkcHJvcHM0LmV4cGFuZEFjdGlvbjtcbiAgICAgIGlmIChleHBhbmRBY3Rpb24gPT09ICdkb3VibGVDbGljaycpIHtcbiAgICAgICAgX3RoaXMudHJpZ2dlckV4cGFuZEFjdGlvbkV4cGFuZChlLCB0cmVlTm9kZSk7XG4gICAgICB9XG4gICAgICBvbkRvdWJsZUNsaWNrID09PSBudWxsIHx8IG9uRG91YmxlQ2xpY2sgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRG91YmxlQ2xpY2soZSwgdHJlZU5vZGUpO1xuICAgIH07XG4gICAgX3RoaXMub25Ob2RlU2VsZWN0ID0gZnVuY3Rpb24gKGUsIHRyZWVOb2RlKSB7XG4gICAgICB2YXIgc2VsZWN0ZWRLZXlzID0gX3RoaXMuc3RhdGUuc2VsZWN0ZWRLZXlzO1xuICAgICAgdmFyIF90aGlzJHN0YXRlNiA9IF90aGlzLnN0YXRlLFxuICAgICAgICBrZXlFbnRpdGllcyA9IF90aGlzJHN0YXRlNi5rZXlFbnRpdGllcyxcbiAgICAgICAgZmllbGROYW1lcyA9IF90aGlzJHN0YXRlNi5maWVsZE5hbWVzO1xuICAgICAgdmFyIF90aGlzJHByb3BzNSA9IF90aGlzLnByb3BzLFxuICAgICAgICBvblNlbGVjdCA9IF90aGlzJHByb3BzNS5vblNlbGVjdCxcbiAgICAgICAgbXVsdGlwbGUgPSBfdGhpcyRwcm9wczUubXVsdGlwbGU7XG4gICAgICB2YXIgc2VsZWN0ZWQgPSB0cmVlTm9kZS5zZWxlY3RlZDtcbiAgICAgIHZhciBrZXkgPSB0cmVlTm9kZVtmaWVsZE5hbWVzLmtleV07XG4gICAgICB2YXIgdGFyZ2V0U2VsZWN0ZWQgPSAhc2VsZWN0ZWQ7XG4gICAgICAvLyBVcGRhdGUgc2VsZWN0ZWQga2V5c1xuICAgICAgaWYgKCF0YXJnZXRTZWxlY3RlZCkge1xuICAgICAgICBzZWxlY3RlZEtleXMgPSBhcnJEZWwoc2VsZWN0ZWRLZXlzLCBrZXkpO1xuICAgICAgfSBlbHNlIGlmICghbXVsdGlwbGUpIHtcbiAgICAgICAgc2VsZWN0ZWRLZXlzID0gW2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxlY3RlZEtleXMgPSBhcnJBZGQoc2VsZWN0ZWRLZXlzLCBrZXkpO1xuICAgICAgfVxuICAgICAgLy8gW0xlZ2FjeV0gTm90IGZvdW5kIHJlbGF0ZWQgdXNhZ2UgaW4gZG9jIG9yIHVwcGVyIGxpYnNcbiAgICAgIHZhciBzZWxlY3RlZE5vZGVzID0gc2VsZWN0ZWRLZXlzLm1hcChmdW5jdGlvbiAoc2VsZWN0ZWRLZXkpIHtcbiAgICAgICAgdmFyIGVudGl0eSA9IGtleUVudGl0aWVzW3NlbGVjdGVkS2V5XTtcbiAgICAgICAgaWYgKCFlbnRpdHkpIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gZW50aXR5Lm5vZGU7XG4gICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9KTtcbiAgICAgIF90aGlzLnNldFVuY29udHJvbGxlZFN0YXRlKHtcbiAgICAgICAgc2VsZWN0ZWRLZXlzOiBzZWxlY3RlZEtleXNcbiAgICAgIH0pO1xuICAgICAgb25TZWxlY3QgPT09IG51bGwgfHwgb25TZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uU2VsZWN0KHNlbGVjdGVkS2V5cywge1xuICAgICAgICBldmVudDogJ3NlbGVjdCcsXG4gICAgICAgIHNlbGVjdGVkOiB0YXJnZXRTZWxlY3RlZCxcbiAgICAgICAgbm9kZTogdHJlZU5vZGUsXG4gICAgICAgIHNlbGVjdGVkTm9kZXM6IHNlbGVjdGVkTm9kZXMsXG4gICAgICAgIG5hdGl2ZUV2ZW50OiBlLm5hdGl2ZUV2ZW50XG4gICAgICB9KTtcbiAgICB9O1xuICAgIF90aGlzLm9uTm9kZUNoZWNrID0gZnVuY3Rpb24gKGUsIHRyZWVOb2RlLCBjaGVja2VkKSB7XG4gICAgICB2YXIgX3RoaXMkc3RhdGU3ID0gX3RoaXMuc3RhdGUsXG4gICAgICAgIGtleUVudGl0aWVzID0gX3RoaXMkc3RhdGU3LmtleUVudGl0aWVzLFxuICAgICAgICBvcmlDaGVja2VkS2V5cyA9IF90aGlzJHN0YXRlNy5jaGVja2VkS2V5cyxcbiAgICAgICAgb3JpSGFsZkNoZWNrZWRLZXlzID0gX3RoaXMkc3RhdGU3LmhhbGZDaGVja2VkS2V5cztcbiAgICAgIHZhciBfdGhpcyRwcm9wczYgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgY2hlY2tTdHJpY3RseSA9IF90aGlzJHByb3BzNi5jaGVja1N0cmljdGx5LFxuICAgICAgICBvbkNoZWNrID0gX3RoaXMkcHJvcHM2Lm9uQ2hlY2s7XG4gICAgICB2YXIga2V5ID0gdHJlZU5vZGUua2V5O1xuICAgICAgLy8gUHJlcGFyZSB0cmlnZ2VyIGFyZ3VtZW50c1xuICAgICAgdmFyIGNoZWNrZWRPYmo7XG4gICAgICB2YXIgZXZlbnRPYmogPSB7XG4gICAgICAgIGV2ZW50OiAnY2hlY2snLFxuICAgICAgICBub2RlOiB0cmVlTm9kZSxcbiAgICAgICAgY2hlY2tlZDogY2hlY2tlZCxcbiAgICAgICAgbmF0aXZlRXZlbnQ6IGUubmF0aXZlRXZlbnRcbiAgICAgIH07XG4gICAgICBpZiAoY2hlY2tTdHJpY3RseSkge1xuICAgICAgICB2YXIgY2hlY2tlZEtleXMgPSBjaGVja2VkID8gYXJyQWRkKG9yaUNoZWNrZWRLZXlzLCBrZXkpIDogYXJyRGVsKG9yaUNoZWNrZWRLZXlzLCBrZXkpO1xuICAgICAgICB2YXIgaGFsZkNoZWNrZWRLZXlzID0gYXJyRGVsKG9yaUhhbGZDaGVja2VkS2V5cywga2V5KTtcbiAgICAgICAgY2hlY2tlZE9iaiA9IHtcbiAgICAgICAgICBjaGVja2VkOiBjaGVja2VkS2V5cyxcbiAgICAgICAgICBoYWxmQ2hlY2tlZDogaGFsZkNoZWNrZWRLZXlzXG4gICAgICAgIH07XG4gICAgICAgIGV2ZW50T2JqLmNoZWNrZWROb2RlcyA9IGNoZWNrZWRLZXlzLm1hcChmdW5jdGlvbiAoY2hlY2tlZEtleSkge1xuICAgICAgICAgIHJldHVybiBrZXlFbnRpdGllc1tjaGVja2VkS2V5XTtcbiAgICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgICByZXR1cm4gZW50aXR5O1xuICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgICAgIHJldHVybiBlbnRpdHkubm9kZTtcbiAgICAgICAgfSk7XG4gICAgICAgIF90aGlzLnNldFVuY29udHJvbGxlZFN0YXRlKHtcbiAgICAgICAgICBjaGVja2VkS2V5czogY2hlY2tlZEtleXNcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBbHdheXMgZmlsbCBmaXJzdFxuICAgICAgICB2YXIgX2NvbmR1Y3RDaGVjayA9IGNvbmR1Y3RDaGVjayhbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KG9yaUNoZWNrZWRLZXlzKSwgW2tleV0pLCB0cnVlLCBrZXlFbnRpdGllcyksXG4gICAgICAgICAgX2NoZWNrZWRLZXlzID0gX2NvbmR1Y3RDaGVjay5jaGVja2VkS2V5cyxcbiAgICAgICAgICBfaGFsZkNoZWNrZWRLZXlzID0gX2NvbmR1Y3RDaGVjay5oYWxmQ2hlY2tlZEtleXM7XG4gICAgICAgIC8vIElmIHJlbW92ZSwgd2UgZG8gaXQgYWdhaW4gdG8gY29ycmVjdGlvblxuICAgICAgICBpZiAoIWNoZWNrZWQpIHtcbiAgICAgICAgICB2YXIga2V5U2V0ID0gbmV3IFNldChfY2hlY2tlZEtleXMpO1xuICAgICAgICAgIGtleVNldC5kZWxldGUoa2V5KTtcbiAgICAgICAgICB2YXIgX2NvbmR1Y3RDaGVjazIgPSBjb25kdWN0Q2hlY2soQXJyYXkuZnJvbShrZXlTZXQpLCB7XG4gICAgICAgICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICAgICAgICAgIGhhbGZDaGVja2VkS2V5czogX2hhbGZDaGVja2VkS2V5c1xuICAgICAgICAgIH0sIGtleUVudGl0aWVzKTtcbiAgICAgICAgICBfY2hlY2tlZEtleXMgPSBfY29uZHVjdENoZWNrMi5jaGVja2VkS2V5cztcbiAgICAgICAgICBfaGFsZkNoZWNrZWRLZXlzID0gX2NvbmR1Y3RDaGVjazIuaGFsZkNoZWNrZWRLZXlzO1xuICAgICAgICB9XG4gICAgICAgIGNoZWNrZWRPYmogPSBfY2hlY2tlZEtleXM7XG4gICAgICAgIC8vIFtMZWdhY3ldIFRoaXMgaXMgdXNlZCBmb3IgYHJjLXRyZWUtc2VsZWN0YFxuICAgICAgICBldmVudE9iai5jaGVja2VkTm9kZXMgPSBbXTtcbiAgICAgICAgZXZlbnRPYmouY2hlY2tlZE5vZGVzUG9zaXRpb25zID0gW107XG4gICAgICAgIGV2ZW50T2JqLmhhbGZDaGVja2VkS2V5cyA9IF9oYWxmQ2hlY2tlZEtleXM7XG4gICAgICAgIF9jaGVja2VkS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChjaGVja2VkS2V5KSB7XG4gICAgICAgICAgdmFyIGVudGl0eSA9IGtleUVudGl0aWVzW2NoZWNrZWRLZXldO1xuICAgICAgICAgIGlmICghZW50aXR5KSByZXR1cm47XG4gICAgICAgICAgdmFyIG5vZGUgPSBlbnRpdHkubm9kZSxcbiAgICAgICAgICAgIHBvcyA9IGVudGl0eS5wb3M7XG4gICAgICAgICAgZXZlbnRPYmouY2hlY2tlZE5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgICAgZXZlbnRPYmouY2hlY2tlZE5vZGVzUG9zaXRpb25zLnB1c2goe1xuICAgICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICAgIHBvczogcG9zXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBfdGhpcy5zZXRVbmNvbnRyb2xsZWRTdGF0ZSh7XG4gICAgICAgICAgY2hlY2tlZEtleXM6IF9jaGVja2VkS2V5c1xuICAgICAgICB9LCBmYWxzZSwge1xuICAgICAgICAgIGhhbGZDaGVja2VkS2V5czogX2hhbGZDaGVja2VkS2V5c1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIG9uQ2hlY2sgPT09IG51bGwgfHwgb25DaGVjayA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGVjayhjaGVja2VkT2JqLCBldmVudE9iaik7XG4gICAgfTtcbiAgICBfdGhpcy5vbk5vZGVMb2FkID0gZnVuY3Rpb24gKHRyZWVOb2RlKSB7XG4gICAgICB2YXIga2V5ID0gdHJlZU5vZGUua2V5O1xuICAgICAgdmFyIGxvYWRQcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAvLyBXZSBuZWVkIHRvIGdldCB0aGUgbGF0ZXN0IHN0YXRlIG9mIGxvYWRpbmcvbG9hZGVkIGtleXNcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgICB2YXIgX3JlZiRsb2FkZWRLZXlzID0gX3JlZi5sb2FkZWRLZXlzLFxuICAgICAgICAgICAgbG9hZGVkS2V5cyA9IF9yZWYkbG9hZGVkS2V5cyA9PT0gdm9pZCAwID8gW10gOiBfcmVmJGxvYWRlZEtleXMsXG4gICAgICAgICAgICBfcmVmJGxvYWRpbmdLZXlzID0gX3JlZi5sb2FkaW5nS2V5cyxcbiAgICAgICAgICAgIGxvYWRpbmdLZXlzID0gX3JlZiRsb2FkaW5nS2V5cyA9PT0gdm9pZCAwID8gW10gOiBfcmVmJGxvYWRpbmdLZXlzO1xuICAgICAgICAgIHZhciBfdGhpcyRwcm9wczcgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICAgIGxvYWREYXRhID0gX3RoaXMkcHJvcHM3LmxvYWREYXRhLFxuICAgICAgICAgICAgb25Mb2FkID0gX3RoaXMkcHJvcHM3Lm9uTG9hZDtcbiAgICAgICAgICBpZiAoIWxvYWREYXRhIHx8IGxvYWRlZEtleXMuaW5kZXhPZihrZXkpICE9PSAtMSB8fCBsb2FkaW5nS2V5cy5pbmRleE9mKGtleSkgIT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gUHJvY2VzcyBsb2FkIGRhdGFcbiAgICAgICAgICB2YXIgcHJvbWlzZSA9IGxvYWREYXRhKHRyZWVOb2RlKTtcbiAgICAgICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRMb2FkZWRLZXlzID0gX3RoaXMuc3RhdGUubG9hZGVkS2V5cztcbiAgICAgICAgICAgIHZhciBuZXdMb2FkZWRLZXlzID0gYXJyQWRkKGN1cnJlbnRMb2FkZWRLZXlzLCBrZXkpO1xuICAgICAgICAgICAgLy8gb25Mb2FkIHNob3VsZCB0cmlnZ2VyIGJlZm9yZSBpbnRlcm5hbCBzZXRTdGF0ZSB0byBhdm9pZCBgbG9hZERhdGFgIHRyaWdnZXIgdHdpY2UuXG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8xMjQ2NFxuICAgICAgICAgICAgb25Mb2FkID09PSBudWxsIHx8IG9uTG9hZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25Mb2FkKG5ld0xvYWRlZEtleXMsIHtcbiAgICAgICAgICAgICAgZXZlbnQ6ICdsb2FkJyxcbiAgICAgICAgICAgICAgbm9kZTogdHJlZU5vZGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgX3RoaXMuc2V0VW5jb250cm9sbGVkU3RhdGUoe1xuICAgICAgICAgICAgICBsb2FkZWRLZXlzOiBuZXdMb2FkZWRLZXlzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIF90aGlzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBsb2FkaW5nS2V5czogYXJyRGVsKHByZXZTdGF0ZS5sb2FkaW5nS2V5cywga2V5KVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIF90aGlzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBsb2FkaW5nS2V5czogYXJyRGVsKHByZXZTdGF0ZS5sb2FkaW5nS2V5cywga2V5KVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBJZiBleGNlZWQgbWF4IHJldHJ5IHRpbWVzLCB3ZSBnaXZlIHVwIHJldHJ5XG4gICAgICAgICAgICBfdGhpcy5sb2FkaW5nUmV0cnlUaW1lc1trZXldID0gKF90aGlzLmxvYWRpbmdSZXRyeVRpbWVzW2tleV0gfHwgMCkgKyAxO1xuICAgICAgICAgICAgaWYgKF90aGlzLmxvYWRpbmdSZXRyeVRpbWVzW2tleV0gPj0gTUFYX1JFVFJZX1RJTUVTKSB7XG4gICAgICAgICAgICAgIHZhciBjdXJyZW50TG9hZGVkS2V5cyA9IF90aGlzLnN0YXRlLmxvYWRlZEtleXM7XG4gICAgICAgICAgICAgIHdhcm5pbmcoZmFsc2UsICdSZXRyeSBmb3IgYGxvYWREYXRhYCBtYW55IHRpbWVzIGJ1dCBzdGlsbCBmYWlsZWQuIE5vIG1vcmUgcmV0cnkuJyk7XG4gICAgICAgICAgICAgIF90aGlzLnNldFVuY29udHJvbGxlZFN0YXRlKHtcbiAgICAgICAgICAgICAgICBsb2FkZWRLZXlzOiBhcnJBZGQoY3VycmVudExvYWRlZEtleXMsIGtleSlcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbG9hZGluZ0tleXM6IGFyckFkZChsb2FkaW5nS2V5cywga2V5KVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICAvLyBOb3QgY2FyZSB3YXJuaW5nIGlmIHdlIGlnbm9yZSB0aGlzXG4gICAgICBsb2FkUHJvbWlzZS5jYXRjaChmdW5jdGlvbiAoKSB7fSk7XG4gICAgICByZXR1cm4gbG9hZFByb21pc2U7XG4gICAgfTtcbiAgICBfdGhpcy5vbk5vZGVNb3VzZUVudGVyID0gZnVuY3Rpb24gKGV2ZW50LCBub2RlKSB7XG4gICAgICB2YXIgb25Nb3VzZUVudGVyID0gX3RoaXMucHJvcHMub25Nb3VzZUVudGVyO1xuICAgICAgb25Nb3VzZUVudGVyID09PSBudWxsIHx8IG9uTW91c2VFbnRlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25Nb3VzZUVudGVyKHtcbiAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICBub2RlOiBub2RlXG4gICAgICB9KTtcbiAgICB9O1xuICAgIF90aGlzLm9uTm9kZU1vdXNlTGVhdmUgPSBmdW5jdGlvbiAoZXZlbnQsIG5vZGUpIHtcbiAgICAgIHZhciBvbk1vdXNlTGVhdmUgPSBfdGhpcy5wcm9wcy5vbk1vdXNlTGVhdmU7XG4gICAgICBvbk1vdXNlTGVhdmUgPT09IG51bGwgfHwgb25Nb3VzZUxlYXZlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbk1vdXNlTGVhdmUoe1xuICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgIG5vZGU6IG5vZGVcbiAgICAgIH0pO1xuICAgIH07XG4gICAgX3RoaXMub25Ob2RlQ29udGV4dE1lbnUgPSBmdW5jdGlvbiAoZXZlbnQsIG5vZGUpIHtcbiAgICAgIHZhciBvblJpZ2h0Q2xpY2sgPSBfdGhpcy5wcm9wcy5vblJpZ2h0Q2xpY2s7XG4gICAgICBpZiAob25SaWdodENsaWNrKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIG9uUmlnaHRDbGljayh7XG4gICAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICAgIG5vZGU6IG5vZGVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBfdGhpcy5vbkZvY3VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG9uRm9jdXMgPSBfdGhpcy5wcm9wcy5vbkZvY3VzO1xuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBmb2N1c2VkOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG4gICAgICBvbkZvY3VzID09PSBudWxsIHx8IG9uRm9jdXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRm9jdXMuYXBwbHkodm9pZCAwLCBhcmdzKTtcbiAgICB9O1xuICAgIF90aGlzLm9uQmx1ciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBvbkJsdXIgPSBfdGhpcy5wcm9wcy5vbkJsdXI7XG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGZvY3VzZWQ6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIF90aGlzLm9uQWN0aXZlQ2hhbmdlKG51bGwpO1xuICAgICAgZm9yICh2YXIgX2xlbjMgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4zKSwgX2tleTMgPSAwOyBfa2V5MyA8IF9sZW4zOyBfa2V5MysrKSB7XG4gICAgICAgIGFyZ3NbX2tleTNdID0gYXJndW1lbnRzW19rZXkzXTtcbiAgICAgIH1cbiAgICAgIG9uQmx1ciA9PT0gbnVsbCB8fCBvbkJsdXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQmx1ci5hcHBseSh2b2lkIDAsIGFyZ3MpO1xuICAgIH07XG4gICAgX3RoaXMuZ2V0VHJlZU5vZGVSZXF1aXJlZFByb3BzID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHN0YXRlOCA9IF90aGlzLnN0YXRlLFxuICAgICAgICBleHBhbmRlZEtleXMgPSBfdGhpcyRzdGF0ZTguZXhwYW5kZWRLZXlzLFxuICAgICAgICBzZWxlY3RlZEtleXMgPSBfdGhpcyRzdGF0ZTguc2VsZWN0ZWRLZXlzLFxuICAgICAgICBsb2FkZWRLZXlzID0gX3RoaXMkc3RhdGU4LmxvYWRlZEtleXMsXG4gICAgICAgIGxvYWRpbmdLZXlzID0gX3RoaXMkc3RhdGU4LmxvYWRpbmdLZXlzLFxuICAgICAgICBjaGVja2VkS2V5cyA9IF90aGlzJHN0YXRlOC5jaGVja2VkS2V5cyxcbiAgICAgICAgaGFsZkNoZWNrZWRLZXlzID0gX3RoaXMkc3RhdGU4LmhhbGZDaGVja2VkS2V5cyxcbiAgICAgICAgZHJhZ092ZXJOb2RlS2V5ID0gX3RoaXMkc3RhdGU4LmRyYWdPdmVyTm9kZUtleSxcbiAgICAgICAgZHJvcFBvc2l0aW9uID0gX3RoaXMkc3RhdGU4LmRyb3BQb3NpdGlvbixcbiAgICAgICAga2V5RW50aXRpZXMgPSBfdGhpcyRzdGF0ZTgua2V5RW50aXRpZXM7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBleHBhbmRlZEtleXM6IGV4cGFuZGVkS2V5cyB8fCBbXSxcbiAgICAgICAgc2VsZWN0ZWRLZXlzOiBzZWxlY3RlZEtleXMgfHwgW10sXG4gICAgICAgIGxvYWRlZEtleXM6IGxvYWRlZEtleXMgfHwgW10sXG4gICAgICAgIGxvYWRpbmdLZXlzOiBsb2FkaW5nS2V5cyB8fCBbXSxcbiAgICAgICAgY2hlY2tlZEtleXM6IGNoZWNrZWRLZXlzIHx8IFtdLFxuICAgICAgICBoYWxmQ2hlY2tlZEtleXM6IGhhbGZDaGVja2VkS2V5cyB8fCBbXSxcbiAgICAgICAgZHJhZ092ZXJOb2RlS2V5OiBkcmFnT3Zlck5vZGVLZXksXG4gICAgICAgIGRyb3BQb3NpdGlvbjogZHJvcFBvc2l0aW9uLFxuICAgICAgICBrZXlFbnRpdGllczoga2V5RW50aXRpZXNcbiAgICAgIH07XG4gICAgfTtcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gRXhwYW5kZWQgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLyoqIFNldCB1bmNvbnRyb2xsZWQgYGV4cGFuZGVkS2V5c2AuIFRoaXMgd2lsbCBhbHNvIGF1dG8gdXBkYXRlIGBmbGF0dGVuTm9kZXNgLiAqL1xuICAgIF90aGlzLnNldEV4cGFuZGVkS2V5cyA9IGZ1bmN0aW9uIChleHBhbmRlZEtleXMpIHtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZTkgPSBfdGhpcy5zdGF0ZSxcbiAgICAgICAgdHJlZURhdGEgPSBfdGhpcyRzdGF0ZTkudHJlZURhdGEsXG4gICAgICAgIGZpZWxkTmFtZXMgPSBfdGhpcyRzdGF0ZTkuZmllbGROYW1lcztcbiAgICAgIHZhciBmbGF0dGVuTm9kZXMgPSBmbGF0dGVuVHJlZURhdGEodHJlZURhdGEsIGV4cGFuZGVkS2V5cywgZmllbGROYW1lcyk7XG4gICAgICBfdGhpcy5zZXRVbmNvbnRyb2xsZWRTdGF0ZSh7XG4gICAgICAgIGV4cGFuZGVkS2V5czogZXhwYW5kZWRLZXlzLFxuICAgICAgICBmbGF0dGVuTm9kZXM6IGZsYXR0ZW5Ob2Rlc1xuICAgICAgfSwgdHJ1ZSk7XG4gICAgfTtcbiAgICBfdGhpcy5vbk5vZGVFeHBhbmQgPSBmdW5jdGlvbiAoZSwgdHJlZU5vZGUpIHtcbiAgICAgIHZhciBleHBhbmRlZEtleXMgPSBfdGhpcy5zdGF0ZS5leHBhbmRlZEtleXM7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUxMCA9IF90aGlzLnN0YXRlLFxuICAgICAgICBsaXN0Q2hhbmdpbmcgPSBfdGhpcyRzdGF0ZTEwLmxpc3RDaGFuZ2luZyxcbiAgICAgICAgZmllbGROYW1lcyA9IF90aGlzJHN0YXRlMTAuZmllbGROYW1lcztcbiAgICAgIHZhciBfdGhpcyRwcm9wczggPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgb25FeHBhbmQgPSBfdGhpcyRwcm9wczgub25FeHBhbmQsXG4gICAgICAgIGxvYWREYXRhID0gX3RoaXMkcHJvcHM4LmxvYWREYXRhO1xuICAgICAgdmFyIGV4cGFuZGVkID0gdHJlZU5vZGUuZXhwYW5kZWQ7XG4gICAgICB2YXIga2V5ID0gdHJlZU5vZGVbZmllbGROYW1lcy5rZXldO1xuICAgICAgLy8gRG8gbm90aGluZyB3aGVuIG1vdGlvbiBpcyBpbiBwcm9ncmVzc1xuICAgICAgaWYgKGxpc3RDaGFuZ2luZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBVcGRhdGUgc2VsZWN0ZWQga2V5c1xuICAgICAgdmFyIGluZGV4ID0gZXhwYW5kZWRLZXlzLmluZGV4T2Yoa2V5KTtcbiAgICAgIHZhciB0YXJnZXRFeHBhbmRlZCA9ICFleHBhbmRlZDtcbiAgICAgIHdhcm5pbmcoZXhwYW5kZWQgJiYgaW5kZXggIT09IC0xIHx8ICFleHBhbmRlZCAmJiBpbmRleCA9PT0gLTEsICdFeHBhbmQgc3RhdGUgbm90IHN5bmMgd2l0aCBpbmRleCBjaGVjaycpO1xuICAgICAgaWYgKHRhcmdldEV4cGFuZGVkKSB7XG4gICAgICAgIGV4cGFuZGVkS2V5cyA9IGFyckFkZChleHBhbmRlZEtleXMsIGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleHBhbmRlZEtleXMgPSBhcnJEZWwoZXhwYW5kZWRLZXlzLCBrZXkpO1xuICAgICAgfVxuICAgICAgX3RoaXMuc2V0RXhwYW5kZWRLZXlzKGV4cGFuZGVkS2V5cyk7XG4gICAgICBvbkV4cGFuZCA9PT0gbnVsbCB8fCBvbkV4cGFuZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25FeHBhbmQoZXhwYW5kZWRLZXlzLCB7XG4gICAgICAgIG5vZGU6IHRyZWVOb2RlLFxuICAgICAgICBleHBhbmRlZDogdGFyZ2V0RXhwYW5kZWQsXG4gICAgICAgIG5hdGl2ZUV2ZW50OiBlLm5hdGl2ZUV2ZW50XG4gICAgICB9KTtcbiAgICAgIC8vIEFzeW5jIExvYWQgZGF0YVxuICAgICAgaWYgKHRhcmdldEV4cGFuZGVkICYmIGxvYWREYXRhKSB7XG4gICAgICAgIHZhciBsb2FkUHJvbWlzZSA9IF90aGlzLm9uTm9kZUxvYWQodHJlZU5vZGUpO1xuICAgICAgICBpZiAobG9hZFByb21pc2UpIHtcbiAgICAgICAgICBsb2FkUHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIFtMZWdhY3ldIFJlZnJlc2ggbG9naWNcbiAgICAgICAgICAgIHZhciBuZXdGbGF0dGVuVHJlZURhdGEgPSBmbGF0dGVuVHJlZURhdGEoX3RoaXMuc3RhdGUudHJlZURhdGEsIGV4cGFuZGVkS2V5cywgZmllbGROYW1lcyk7XG4gICAgICAgICAgICBfdGhpcy5zZXRVbmNvbnRyb2xsZWRTdGF0ZSh7XG4gICAgICAgICAgICAgIGZsYXR0ZW5Ob2RlczogbmV3RmxhdHRlblRyZWVEYXRhXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudEV4cGFuZGVkS2V5cyA9IF90aGlzLnN0YXRlLmV4cGFuZGVkS2V5cztcbiAgICAgICAgICAgIHZhciBleHBhbmRlZEtleXNUb1Jlc3RvcmUgPSBhcnJEZWwoY3VycmVudEV4cGFuZGVkS2V5cywga2V5KTtcbiAgICAgICAgICAgIF90aGlzLnNldEV4cGFuZGVkS2V5cyhleHBhbmRlZEtleXNUb1Jlc3RvcmUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBfdGhpcy5vbkxpc3RDaGFuZ2VTdGFydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLnNldFVuY29udHJvbGxlZFN0YXRlKHtcbiAgICAgICAgbGlzdENoYW5naW5nOiB0cnVlXG4gICAgICB9KTtcbiAgICB9O1xuICAgIF90aGlzLm9uTGlzdENoYW5nZUVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpcy5zZXRVbmNvbnRyb2xsZWRTdGF0ZSh7XG4gICAgICAgICAgbGlzdENoYW5naW5nOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IEtleWJvYXJkID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIF90aGlzLm9uQWN0aXZlQ2hhbmdlID0gZnVuY3Rpb24gKG5ld0FjdGl2ZUtleSkge1xuICAgICAgdmFyIGFjdGl2ZUtleSA9IF90aGlzLnN0YXRlLmFjdGl2ZUtleTtcbiAgICAgIHZhciBvbkFjdGl2ZUNoYW5nZSA9IF90aGlzLnByb3BzLm9uQWN0aXZlQ2hhbmdlO1xuICAgICAgaWYgKGFjdGl2ZUtleSA9PT0gbmV3QWN0aXZlS2V5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgYWN0aXZlS2V5OiBuZXdBY3RpdmVLZXlcbiAgICAgIH0pO1xuICAgICAgaWYgKG5ld0FjdGl2ZUtleSAhPT0gbnVsbCkge1xuICAgICAgICBfdGhpcy5zY3JvbGxUbyh7XG4gICAgICAgICAga2V5OiBuZXdBY3RpdmVLZXlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBvbkFjdGl2ZUNoYW5nZSA9PT0gbnVsbCB8fCBvbkFjdGl2ZUNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BY3RpdmVDaGFuZ2UobmV3QWN0aXZlS2V5KTtcbiAgICB9O1xuICAgIF90aGlzLmdldEFjdGl2ZUl0ZW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUxMSA9IF90aGlzLnN0YXRlLFxuICAgICAgICBhY3RpdmVLZXkgPSBfdGhpcyRzdGF0ZTExLmFjdGl2ZUtleSxcbiAgICAgICAgZmxhdHRlbk5vZGVzID0gX3RoaXMkc3RhdGUxMS5mbGF0dGVuTm9kZXM7XG4gICAgICBpZiAoYWN0aXZlS2V5ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZsYXR0ZW5Ob2Rlcy5maW5kKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgICB2YXIga2V5ID0gX3JlZjIua2V5O1xuICAgICAgICByZXR1cm4ga2V5ID09PSBhY3RpdmVLZXk7XG4gICAgICB9KSB8fCBudWxsO1xuICAgIH07XG4gICAgX3RoaXMub2Zmc2V0QWN0aXZlS2V5ID0gZnVuY3Rpb24gKG9mZnNldCkge1xuICAgICAgdmFyIF90aGlzJHN0YXRlMTIgPSBfdGhpcy5zdGF0ZSxcbiAgICAgICAgZmxhdHRlbk5vZGVzID0gX3RoaXMkc3RhdGUxMi5mbGF0dGVuTm9kZXMsXG4gICAgICAgIGFjdGl2ZUtleSA9IF90aGlzJHN0YXRlMTIuYWN0aXZlS2V5O1xuICAgICAgdmFyIGluZGV4ID0gZmxhdHRlbk5vZGVzLmZpbmRJbmRleChmdW5jdGlvbiAoX3JlZjMpIHtcbiAgICAgICAgdmFyIGtleSA9IF9yZWYzLmtleTtcbiAgICAgICAgcmV0dXJuIGtleSA9PT0gYWN0aXZlS2V5O1xuICAgICAgfSk7XG4gICAgICAvLyBBbGlnbiB3aXRoIGluZGV4XG4gICAgICBpZiAoaW5kZXggPT09IC0xICYmIG9mZnNldCA8IDApIHtcbiAgICAgICAgaW5kZXggPSBmbGF0dGVuTm9kZXMubGVuZ3RoO1xuICAgICAgfVxuICAgICAgaW5kZXggPSAoaW5kZXggKyBvZmZzZXQgKyBmbGF0dGVuTm9kZXMubGVuZ3RoKSAlIGZsYXR0ZW5Ob2Rlcy5sZW5ndGg7XG4gICAgICB2YXIgaXRlbSA9IGZsYXR0ZW5Ob2Rlc1tpbmRleF07XG4gICAgICBpZiAoaXRlbSkge1xuICAgICAgICB2YXIga2V5ID0gaXRlbS5rZXk7XG4gICAgICAgIF90aGlzLm9uQWN0aXZlQ2hhbmdlKGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpcy5vbkFjdGl2ZUNoYW5nZShudWxsKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIF90aGlzLm9uS2V5RG93biA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgdmFyIF90aGlzJHN0YXRlMTMgPSBfdGhpcy5zdGF0ZSxcbiAgICAgICAgYWN0aXZlS2V5ID0gX3RoaXMkc3RhdGUxMy5hY3RpdmVLZXksXG4gICAgICAgIGV4cGFuZGVkS2V5cyA9IF90aGlzJHN0YXRlMTMuZXhwYW5kZWRLZXlzLFxuICAgICAgICBjaGVja2VkS2V5cyA9IF90aGlzJHN0YXRlMTMuY2hlY2tlZEtleXMsXG4gICAgICAgIGZpZWxkTmFtZXMgPSBfdGhpcyRzdGF0ZTEzLmZpZWxkTmFtZXM7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM5ID0gX3RoaXMucHJvcHMsXG4gICAgICAgIG9uS2V5RG93biA9IF90aGlzJHByb3BzOS5vbktleURvd24sXG4gICAgICAgIGNoZWNrYWJsZSA9IF90aGlzJHByb3BzOS5jaGVja2FibGUsXG4gICAgICAgIHNlbGVjdGFibGUgPSBfdGhpcyRwcm9wczkuc2VsZWN0YWJsZTtcbiAgICAgIC8vID4+Pj4+Pj4+Pj4gRGlyZWN0aW9uXG4gICAgICBzd2l0Y2ggKGV2ZW50LndoaWNoKSB7XG4gICAgICAgIGNhc2UgS2V5Q29kZS5VUDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBfdGhpcy5vZmZzZXRBY3RpdmVLZXkoLTEpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBLZXlDb2RlLkRPV046XG4gICAgICAgICAge1xuICAgICAgICAgICAgX3RoaXMub2Zmc2V0QWN0aXZlS2V5KDEpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vID4+Pj4+Pj4+Pj4gRXhwYW5kICYgU2VsZWN0aW9uXG4gICAgICB2YXIgYWN0aXZlSXRlbSA9IF90aGlzLmdldEFjdGl2ZUl0ZW0oKTtcbiAgICAgIGlmIChhY3RpdmVJdGVtICYmIGFjdGl2ZUl0ZW0uZGF0YSkge1xuICAgICAgICB2YXIgdHJlZU5vZGVSZXF1aXJlZFByb3BzID0gX3RoaXMuZ2V0VHJlZU5vZGVSZXF1aXJlZFByb3BzKCk7XG4gICAgICAgIHZhciBleHBhbmRhYmxlID0gYWN0aXZlSXRlbS5kYXRhLmlzTGVhZiA9PT0gZmFsc2UgfHwgISEoYWN0aXZlSXRlbS5kYXRhW2ZpZWxkTmFtZXMuY2hpbGRyZW5dIHx8IFtdKS5sZW5ndGg7XG4gICAgICAgIHZhciBldmVudE5vZGUgPSBjb252ZXJ0Tm9kZVByb3BzVG9FdmVudERhdGEoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBnZXRUcmVlTm9kZVByb3BzKGFjdGl2ZUtleSwgdHJlZU5vZGVSZXF1aXJlZFByb3BzKSksIHt9LCB7XG4gICAgICAgICAgZGF0YTogYWN0aXZlSXRlbS5kYXRhLFxuICAgICAgICAgIGFjdGl2ZTogdHJ1ZVxuICAgICAgICB9KSk7XG4gICAgICAgIHN3aXRjaCAoZXZlbnQud2hpY2gpIHtcbiAgICAgICAgICAvLyA+Pj4gRXhwYW5kXG4gICAgICAgICAgY2FzZSBLZXlDb2RlLkxFRlQ6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC8vIENvbGxhcHNlIGlmIHBvc3NpYmxlXG4gICAgICAgICAgICAgIGlmIChleHBhbmRhYmxlICYmIGV4cGFuZGVkS2V5cy5pbmNsdWRlcyhhY3RpdmVLZXkpKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMub25Ob2RlRXhwYW5kKHt9LCBldmVudE5vZGUpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGl2ZUl0ZW0ucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgX3RoaXMub25BY3RpdmVDaGFuZ2UoYWN0aXZlSXRlbS5wYXJlbnQua2V5KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIEtleUNvZGUuUklHSFQ6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC8vIEV4cGFuZCBpZiBwb3NzaWJsZVxuICAgICAgICAgICAgICBpZiAoZXhwYW5kYWJsZSAmJiAhZXhwYW5kZWRLZXlzLmluY2x1ZGVzKGFjdGl2ZUtleSkpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5vbk5vZGVFeHBhbmQoe30sIGV2ZW50Tm9kZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aXZlSXRlbS5jaGlsZHJlbiAmJiBhY3RpdmVJdGVtLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIF90aGlzLm9uQWN0aXZlQ2hhbmdlKGFjdGl2ZUl0ZW0uY2hpbGRyZW5bMF0ua2V5KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAvLyBTZWxlY3Rpb25cbiAgICAgICAgICBjYXNlIEtleUNvZGUuRU5URVI6XG4gICAgICAgICAgY2FzZSBLZXlDb2RlLlNQQUNFOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoY2hlY2thYmxlICYmICFldmVudE5vZGUuZGlzYWJsZWQgJiYgZXZlbnROb2RlLmNoZWNrYWJsZSAhPT0gZmFsc2UgJiYgIWV2ZW50Tm9kZS5kaXNhYmxlQ2hlY2tib3gpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5vbk5vZGVDaGVjayh7fSwgZXZlbnROb2RlLCAhY2hlY2tlZEtleXMuaW5jbHVkZXMoYWN0aXZlS2V5KSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNoZWNrYWJsZSAmJiBzZWxlY3RhYmxlICYmICFldmVudE5vZGUuZGlzYWJsZWQgJiYgZXZlbnROb2RlLnNlbGVjdGFibGUgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMub25Ob2RlU2VsZWN0KHt9LCBldmVudE5vZGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBvbktleURvd24gPT09IG51bGwgfHwgb25LZXlEb3duID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbktleURvd24oZXZlbnQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogT25seSB1cGRhdGUgdGhlIHZhbHVlIHdoaWNoIGlzIG5vdCBpbiBwcm9wc1xuICAgICAqL1xuICAgIF90aGlzLnNldFVuY29udHJvbGxlZFN0YXRlID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICB2YXIgYXRvbWljID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgICAgIHZhciBmb3JjZVN0YXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBudWxsO1xuICAgICAgaWYgKCFfdGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgdmFyIG5lZWRTeW5jID0gZmFsc2U7XG4gICAgICAgIHZhciBhbGxQYXNzZWQgPSB0cnVlO1xuICAgICAgICB2YXIgbmV3U3RhdGUgPSB7fTtcbiAgICAgICAgT2JqZWN0LmtleXMoc3RhdGUpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICBpZiAobmFtZSBpbiBfdGhpcy5wcm9wcykge1xuICAgICAgICAgICAgYWxsUGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIG5lZWRTeW5jID0gdHJ1ZTtcbiAgICAgICAgICBuZXdTdGF0ZVtuYW1lXSA9IHN0YXRlW25hbWVdO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG5lZWRTeW5jICYmICghYXRvbWljIHx8IGFsbFBhc3NlZCkpIHtcbiAgICAgICAgICBfdGhpcy5zZXRTdGF0ZShfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG5ld1N0YXRlKSwgZm9yY2VTdGF0ZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBfdGhpcy5zY3JvbGxUbyA9IGZ1bmN0aW9uIChzY3JvbGwpIHtcbiAgICAgIF90aGlzLmxpc3RSZWYuY3VycmVudC5zY3JvbGxUbyhzY3JvbGwpO1xuICAgIH07XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIF9jcmVhdGVDbGFzcyhUcmVlLCBbe1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgICB0aGlzLm9uVXBkYXRlZCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgdGhpcy5vblVwZGF0ZWQoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib25VcGRhdGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uVXBkYXRlZCgpIHtcbiAgICAgIHZhciBhY3RpdmVLZXkgPSB0aGlzLnByb3BzLmFjdGl2ZUtleTtcbiAgICAgIGlmIChhY3RpdmVLZXkgIT09IHVuZGVmaW5lZCAmJiBhY3RpdmVLZXkgIT09IHRoaXMuc3RhdGUuYWN0aXZlS2V5KSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGFjdGl2ZUtleTogYWN0aXZlS2V5XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoYWN0aXZlS2V5ICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5zY3JvbGxUbyh7XG4gICAgICAgICAgICBrZXk6IGFjdGl2ZUtleVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudFdpbGxVbm1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdlbmQnLCB0aGlzLm9uV2luZG93RHJhZ0VuZCk7XG4gICAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlc2V0RHJhZ1N0YXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2V0RHJhZ1N0YXRlKCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGRyYWdPdmVyTm9kZUtleTogbnVsbCxcbiAgICAgICAgZHJvcFBvc2l0aW9uOiBudWxsLFxuICAgICAgICBkcm9wTGV2ZWxPZmZzZXQ6IG51bGwsXG4gICAgICAgIGRyb3BUYXJnZXRLZXk6IG51bGwsXG4gICAgICAgIGRyb3BDb250YWluZXJLZXk6IG51bGwsXG4gICAgICAgIGRyb3BUYXJnZXRQb3M6IG51bGwsXG4gICAgICAgIGRyb3BBbGxvd2VkOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX2NsYXNzTmFtZXM7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUxNCA9IHRoaXMuc3RhdGUsXG4gICAgICAgIGZvY3VzZWQgPSBfdGhpcyRzdGF0ZTE0LmZvY3VzZWQsXG4gICAgICAgIGZsYXR0ZW5Ob2RlcyA9IF90aGlzJHN0YXRlMTQuZmxhdHRlbk5vZGVzLFxuICAgICAgICBrZXlFbnRpdGllcyA9IF90aGlzJHN0YXRlMTQua2V5RW50aXRpZXMsXG4gICAgICAgIGRyYWdnaW5nTm9kZUtleSA9IF90aGlzJHN0YXRlMTQuZHJhZ2dpbmdOb2RlS2V5LFxuICAgICAgICBhY3RpdmVLZXkgPSBfdGhpcyRzdGF0ZTE0LmFjdGl2ZUtleSxcbiAgICAgICAgZHJvcExldmVsT2Zmc2V0ID0gX3RoaXMkc3RhdGUxNC5kcm9wTGV2ZWxPZmZzZXQsXG4gICAgICAgIGRyb3BDb250YWluZXJLZXkgPSBfdGhpcyRzdGF0ZTE0LmRyb3BDb250YWluZXJLZXksXG4gICAgICAgIGRyb3BUYXJnZXRLZXkgPSBfdGhpcyRzdGF0ZTE0LmRyb3BUYXJnZXRLZXksXG4gICAgICAgIGRyb3BQb3NpdGlvbiA9IF90aGlzJHN0YXRlMTQuZHJvcFBvc2l0aW9uLFxuICAgICAgICBkcmFnT3Zlck5vZGVLZXkgPSBfdGhpcyRzdGF0ZTE0LmRyYWdPdmVyTm9kZUtleSxcbiAgICAgICAgaW5kZW50ID0gX3RoaXMkc3RhdGUxNC5pbmRlbnQ7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMxMCA9IHRoaXMucHJvcHMsXG4gICAgICAgIHByZWZpeENscyA9IF90aGlzJHByb3BzMTAucHJlZml4Q2xzLFxuICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wczEwLmNsYXNzTmFtZSxcbiAgICAgICAgc3R5bGUgPSBfdGhpcyRwcm9wczEwLnN0eWxlLFxuICAgICAgICBzaG93TGluZSA9IF90aGlzJHByb3BzMTAuc2hvd0xpbmUsXG4gICAgICAgIGZvY3VzYWJsZSA9IF90aGlzJHByb3BzMTAuZm9jdXNhYmxlLFxuICAgICAgICBfdGhpcyRwcm9wczEwJHRhYkluZGUgPSBfdGhpcyRwcm9wczEwLnRhYkluZGV4LFxuICAgICAgICB0YWJJbmRleCA9IF90aGlzJHByb3BzMTAkdGFiSW5kZSA9PT0gdm9pZCAwID8gMCA6IF90aGlzJHByb3BzMTAkdGFiSW5kZSxcbiAgICAgICAgc2VsZWN0YWJsZSA9IF90aGlzJHByb3BzMTAuc2VsZWN0YWJsZSxcbiAgICAgICAgc2hvd0ljb24gPSBfdGhpcyRwcm9wczEwLnNob3dJY29uLFxuICAgICAgICBpY29uID0gX3RoaXMkcHJvcHMxMC5pY29uLFxuICAgICAgICBzd2l0Y2hlckljb24gPSBfdGhpcyRwcm9wczEwLnN3aXRjaGVySWNvbixcbiAgICAgICAgZHJhZ2dhYmxlID0gX3RoaXMkcHJvcHMxMC5kcmFnZ2FibGUsXG4gICAgICAgIGNoZWNrYWJsZSA9IF90aGlzJHByb3BzMTAuY2hlY2thYmxlLFxuICAgICAgICBjaGVja1N0cmljdGx5ID0gX3RoaXMkcHJvcHMxMC5jaGVja1N0cmljdGx5LFxuICAgICAgICBkaXNhYmxlZCA9IF90aGlzJHByb3BzMTAuZGlzYWJsZWQsXG4gICAgICAgIG1vdGlvbiA9IF90aGlzJHByb3BzMTAubW90aW9uLFxuICAgICAgICBsb2FkRGF0YSA9IF90aGlzJHByb3BzMTAubG9hZERhdGEsXG4gICAgICAgIGZpbHRlclRyZWVOb2RlID0gX3RoaXMkcHJvcHMxMC5maWx0ZXJUcmVlTm9kZSxcbiAgICAgICAgaGVpZ2h0ID0gX3RoaXMkcHJvcHMxMC5oZWlnaHQsXG4gICAgICAgIGl0ZW1IZWlnaHQgPSBfdGhpcyRwcm9wczEwLml0ZW1IZWlnaHQsXG4gICAgICAgIHZpcnR1YWwgPSBfdGhpcyRwcm9wczEwLnZpcnR1YWwsXG4gICAgICAgIHRpdGxlUmVuZGVyID0gX3RoaXMkcHJvcHMxMC50aXRsZVJlbmRlcixcbiAgICAgICAgZHJvcEluZGljYXRvclJlbmRlciA9IF90aGlzJHByb3BzMTAuZHJvcEluZGljYXRvclJlbmRlcixcbiAgICAgICAgb25Db250ZXh0TWVudSA9IF90aGlzJHByb3BzMTAub25Db250ZXh0TWVudSxcbiAgICAgICAgb25TY3JvbGwgPSBfdGhpcyRwcm9wczEwLm9uU2Nyb2xsLFxuICAgICAgICBkaXJlY3Rpb24gPSBfdGhpcyRwcm9wczEwLmRpcmVjdGlvbixcbiAgICAgICAgcm9vdENsYXNzTmFtZSA9IF90aGlzJHByb3BzMTAucm9vdENsYXNzTmFtZSxcbiAgICAgICAgcm9vdFN0eWxlID0gX3RoaXMkcHJvcHMxMC5yb290U3R5bGU7XG4gICAgICB2YXIgZG9tUHJvcHMgPSBwaWNrQXR0cnModGhpcy5wcm9wcywge1xuICAgICAgICBhcmlhOiB0cnVlLFxuICAgICAgICBkYXRhOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIC8vIEl0J3MgYmV0dGVyIG1vdmUgdG8gaG9va3MgYnV0IHdlIGp1c3Qgc2ltcGx5IGtlZXAgaGVyZVxuICAgICAgdmFyIGRyYWdnYWJsZUNvbmZpZztcbiAgICAgIGlmIChkcmFnZ2FibGUpIHtcbiAgICAgICAgaWYgKF90eXBlb2YoZHJhZ2dhYmxlKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBkcmFnZ2FibGVDb25maWcgPSBkcmFnZ2FibGU7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRyYWdnYWJsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGRyYWdnYWJsZUNvbmZpZyA9IHtcbiAgICAgICAgICAgIG5vZGVEcmFnZ2FibGU6IGRyYWdnYWJsZVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZHJhZ2dhYmxlQ29uZmlnID0ge307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmVlQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgICAgIHNlbGVjdGFibGU6IHNlbGVjdGFibGUsXG4gICAgICAgICAgc2hvd0ljb246IHNob3dJY29uLFxuICAgICAgICAgIGljb246IGljb24sXG4gICAgICAgICAgc3dpdGNoZXJJY29uOiBzd2l0Y2hlckljb24sXG4gICAgICAgICAgZHJhZ2dhYmxlOiBkcmFnZ2FibGVDb25maWcsXG4gICAgICAgICAgZHJhZ2dpbmdOb2RlS2V5OiBkcmFnZ2luZ05vZGVLZXksXG4gICAgICAgICAgY2hlY2thYmxlOiBjaGVja2FibGUsXG4gICAgICAgICAgY2hlY2tTdHJpY3RseTogY2hlY2tTdHJpY3RseSxcbiAgICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgICAga2V5RW50aXRpZXM6IGtleUVudGl0aWVzLFxuICAgICAgICAgIGRyb3BMZXZlbE9mZnNldDogZHJvcExldmVsT2Zmc2V0LFxuICAgICAgICAgIGRyb3BDb250YWluZXJLZXk6IGRyb3BDb250YWluZXJLZXksXG4gICAgICAgICAgZHJvcFRhcmdldEtleTogZHJvcFRhcmdldEtleSxcbiAgICAgICAgICBkcm9wUG9zaXRpb246IGRyb3BQb3NpdGlvbixcbiAgICAgICAgICBkcmFnT3Zlck5vZGVLZXk6IGRyYWdPdmVyTm9kZUtleSxcbiAgICAgICAgICBpbmRlbnQ6IGluZGVudCxcbiAgICAgICAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICAgICAgICBkcm9wSW5kaWNhdG9yUmVuZGVyOiBkcm9wSW5kaWNhdG9yUmVuZGVyLFxuICAgICAgICAgIGxvYWREYXRhOiBsb2FkRGF0YSxcbiAgICAgICAgICBmaWx0ZXJUcmVlTm9kZTogZmlsdGVyVHJlZU5vZGUsXG4gICAgICAgICAgdGl0bGVSZW5kZXI6IHRpdGxlUmVuZGVyLFxuICAgICAgICAgIG9uTm9kZUNsaWNrOiB0aGlzLm9uTm9kZUNsaWNrLFxuICAgICAgICAgIG9uTm9kZURvdWJsZUNsaWNrOiB0aGlzLm9uTm9kZURvdWJsZUNsaWNrLFxuICAgICAgICAgIG9uTm9kZUV4cGFuZDogdGhpcy5vbk5vZGVFeHBhbmQsXG4gICAgICAgICAgb25Ob2RlU2VsZWN0OiB0aGlzLm9uTm9kZVNlbGVjdCxcbiAgICAgICAgICBvbk5vZGVDaGVjazogdGhpcy5vbk5vZGVDaGVjayxcbiAgICAgICAgICBvbk5vZGVMb2FkOiB0aGlzLm9uTm9kZUxvYWQsXG4gICAgICAgICAgb25Ob2RlTW91c2VFbnRlcjogdGhpcy5vbk5vZGVNb3VzZUVudGVyLFxuICAgICAgICAgIG9uTm9kZU1vdXNlTGVhdmU6IHRoaXMub25Ob2RlTW91c2VMZWF2ZSxcbiAgICAgICAgICBvbk5vZGVDb250ZXh0TWVudTogdGhpcy5vbk5vZGVDb250ZXh0TWVudSxcbiAgICAgICAgICBvbk5vZGVEcmFnU3RhcnQ6IHRoaXMub25Ob2RlRHJhZ1N0YXJ0LFxuICAgICAgICAgIG9uTm9kZURyYWdFbnRlcjogdGhpcy5vbk5vZGVEcmFnRW50ZXIsXG4gICAgICAgICAgb25Ob2RlRHJhZ092ZXI6IHRoaXMub25Ob2RlRHJhZ092ZXIsXG4gICAgICAgICAgb25Ob2RlRHJhZ0xlYXZlOiB0aGlzLm9uTm9kZURyYWdMZWF2ZSxcbiAgICAgICAgICBvbk5vZGVEcmFnRW5kOiB0aGlzLm9uTm9kZURyYWdFbmQsXG4gICAgICAgICAgb25Ob2RlRHJvcDogdGhpcy5vbk5vZGVEcm9wXG4gICAgICAgIH1cbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgcm9sZTogXCJ0cmVlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhwcmVmaXhDbHMsIGNsYXNzTmFtZSwgcm9vdENsYXNzTmFtZSwgKF9jbGFzc05hbWVzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zaG93LWxpbmVcIiksIHNob3dMaW5lKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWZvY3VzZWRcIiksIGZvY3VzZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItYWN0aXZlLWZvY3VzZWRcIiksIGFjdGl2ZUtleSAhPT0gbnVsbCksIF9jbGFzc05hbWVzKSksXG4gICAgICAgIHN0eWxlOiByb290U3R5bGVcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE5vZGVMaXN0LCBfZXh0ZW5kcyh7XG4gICAgICAgIHJlZjogdGhpcy5saXN0UmVmLFxuICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICBkYXRhOiBmbGF0dGVuTm9kZXMsXG4gICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgICAgc2VsZWN0YWJsZTogc2VsZWN0YWJsZSxcbiAgICAgICAgY2hlY2thYmxlOiAhIWNoZWNrYWJsZSxcbiAgICAgICAgbW90aW9uOiBtb3Rpb24sXG4gICAgICAgIGRyYWdnaW5nOiBkcmFnZ2luZ05vZGVLZXkgIT09IG51bGwsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICBpdGVtSGVpZ2h0OiBpdGVtSGVpZ2h0LFxuICAgICAgICB2aXJ0dWFsOiB2aXJ0dWFsLFxuICAgICAgICBmb2N1c2FibGU6IGZvY3VzYWJsZSxcbiAgICAgICAgZm9jdXNlZDogZm9jdXNlZCxcbiAgICAgICAgdGFiSW5kZXg6IHRhYkluZGV4LFxuICAgICAgICBhY3RpdmVJdGVtOiB0aGlzLmdldEFjdGl2ZUl0ZW0oKSxcbiAgICAgICAgb25Gb2N1czogdGhpcy5vbkZvY3VzLFxuICAgICAgICBvbkJsdXI6IHRoaXMub25CbHVyLFxuICAgICAgICBvbktleURvd246IHRoaXMub25LZXlEb3duLFxuICAgICAgICBvbkFjdGl2ZUNoYW5nZTogdGhpcy5vbkFjdGl2ZUNoYW5nZSxcbiAgICAgICAgb25MaXN0Q2hhbmdlU3RhcnQ6IHRoaXMub25MaXN0Q2hhbmdlU3RhcnQsXG4gICAgICAgIG9uTGlzdENoYW5nZUVuZDogdGhpcy5vbkxpc3RDaGFuZ2VFbmQsXG4gICAgICAgIG9uQ29udGV4dE1lbnU6IG9uQ29udGV4dE1lbnUsXG4gICAgICAgIG9uU2Nyb2xsOiBvblNjcm9sbFxuICAgICAgfSwgdGhpcy5nZXRUcmVlTm9kZVJlcXVpcmVkUHJvcHMoKSwgZG9tUHJvcHMpKSkpO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMocHJvcHMsIHByZXZTdGF0ZSkge1xuICAgICAgdmFyIHByZXZQcm9wcyA9IHByZXZTdGF0ZS5wcmV2UHJvcHM7XG4gICAgICB2YXIgbmV3U3RhdGUgPSB7XG4gICAgICAgIHByZXZQcm9wczogcHJvcHNcbiAgICAgIH07XG4gICAgICBmdW5jdGlvbiBuZWVkU3luYyhuYW1lKSB7XG4gICAgICAgIHJldHVybiAhcHJldlByb3BzICYmIG5hbWUgaW4gcHJvcHMgfHwgcHJldlByb3BzICYmIHByZXZQcm9wc1tuYW1lXSAhPT0gcHJvcHNbbmFtZV07XG4gICAgICB9XG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT0gVHJlZSBOb2RlID09PT09PT09PT09PT09PT09PVxuICAgICAgdmFyIHRyZWVEYXRhO1xuICAgICAgLy8gZmllbGROYW1lc1xuICAgICAgdmFyIGZpZWxkTmFtZXMgPSBwcmV2U3RhdGUuZmllbGROYW1lcztcbiAgICAgIGlmIChuZWVkU3luYygnZmllbGROYW1lcycpKSB7XG4gICAgICAgIGZpZWxkTmFtZXMgPSBmaWxsRmllbGROYW1lcyhwcm9wcy5maWVsZE5hbWVzKTtcbiAgICAgICAgbmV3U3RhdGUuZmllbGROYW1lcyA9IGZpZWxkTmFtZXM7XG4gICAgICB9XG4gICAgICAvLyBDaGVjayBpZiBgdHJlZURhdGFgIG9yIGBjaGlsZHJlbmAgY2hhbmdlZCBhbmQgc2F2ZSBpbnRvIHRoZSBzdGF0ZS5cbiAgICAgIGlmIChuZWVkU3luYygndHJlZURhdGEnKSkge1xuICAgICAgICB0cmVlRGF0YSA9IHByb3BzLnRyZWVEYXRhO1xuICAgICAgfSBlbHNlIGlmIChuZWVkU3luYygnY2hpbGRyZW4nKSkge1xuICAgICAgICB3YXJuaW5nKGZhbHNlLCAnYGNoaWxkcmVuYCBvZiBUcmVlIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgYHRyZWVEYXRhYCBpbnN0ZWFkLicpO1xuICAgICAgICB0cmVlRGF0YSA9IGNvbnZlcnRUcmVlVG9EYXRhKHByb3BzLmNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICAgIC8vIFNhdmUgZmxhdHRlbiBub2RlcyBpbmZvIGFuZCBjb252ZXJ0IGB0cmVlRGF0YWAgaW50byBrZXlFbnRpdGllc1xuICAgICAgaWYgKHRyZWVEYXRhKSB7XG4gICAgICAgIG5ld1N0YXRlLnRyZWVEYXRhID0gdHJlZURhdGE7XG4gICAgICAgIHZhciBlbnRpdGllc01hcCA9IGNvbnZlcnREYXRhVG9FbnRpdGllcyh0cmVlRGF0YSwge1xuICAgICAgICAgIGZpZWxkTmFtZXM6IGZpZWxkTmFtZXNcbiAgICAgICAgfSk7XG4gICAgICAgIG5ld1N0YXRlLmtleUVudGl0aWVzID0gX29iamVjdFNwcmVhZChfZGVmaW5lUHJvcGVydHkoe30sIE1PVElPTl9LRVksIE1vdGlvbkVudGl0eSksIGVudGl0aWVzTWFwLmtleUVudGl0aWVzKTtcbiAgICAgICAgLy8gV2FybmluZyBpZiB0cmVlTm9kZSBub3QgcHJvdmlkZSBrZXlcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICB3YXJuaW5nV2l0aG91dEtleSh0cmVlRGF0YSwgZmllbGROYW1lcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBrZXlFbnRpdGllcyA9IG5ld1N0YXRlLmtleUVudGl0aWVzIHx8IHByZXZTdGF0ZS5rZXlFbnRpdGllcztcbiAgICAgIC8vID09PT09PT09PT09PT09PT0gZXhwYW5kZWRLZXlzID09PT09PT09PT09PT09PT09XG4gICAgICBpZiAobmVlZFN5bmMoJ2V4cGFuZGVkS2V5cycpIHx8IHByZXZQcm9wcyAmJiBuZWVkU3luYygnYXV0b0V4cGFuZFBhcmVudCcpKSB7XG4gICAgICAgIG5ld1N0YXRlLmV4cGFuZGVkS2V5cyA9IHByb3BzLmF1dG9FeHBhbmRQYXJlbnQgfHwgIXByZXZQcm9wcyAmJiBwcm9wcy5kZWZhdWx0RXhwYW5kUGFyZW50ID8gY29uZHVjdEV4cGFuZFBhcmVudChwcm9wcy5leHBhbmRlZEtleXMsIGtleUVudGl0aWVzKSA6IHByb3BzLmV4cGFuZGVkS2V5cztcbiAgICAgIH0gZWxzZSBpZiAoIXByZXZQcm9wcyAmJiBwcm9wcy5kZWZhdWx0RXhwYW5kQWxsKSB7XG4gICAgICAgIHZhciBjbG9uZUtleUVudGl0aWVzID0gX29iamVjdFNwcmVhZCh7fSwga2V5RW50aXRpZXMpO1xuICAgICAgICBkZWxldGUgY2xvbmVLZXlFbnRpdGllc1tNT1RJT05fS0VZXTtcbiAgICAgICAgbmV3U3RhdGUuZXhwYW5kZWRLZXlzID0gT2JqZWN0LmtleXMoY2xvbmVLZXlFbnRpdGllcykubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICByZXR1cm4gY2xvbmVLZXlFbnRpdGllc1trZXldLmtleTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKCFwcmV2UHJvcHMgJiYgcHJvcHMuZGVmYXVsdEV4cGFuZGVkS2V5cykge1xuICAgICAgICBuZXdTdGF0ZS5leHBhbmRlZEtleXMgPSBwcm9wcy5hdXRvRXhwYW5kUGFyZW50IHx8IHByb3BzLmRlZmF1bHRFeHBhbmRQYXJlbnQgPyBjb25kdWN0RXhwYW5kUGFyZW50KHByb3BzLmRlZmF1bHRFeHBhbmRlZEtleXMsIGtleUVudGl0aWVzKSA6IHByb3BzLmRlZmF1bHRFeHBhbmRlZEtleXM7XG4gICAgICB9XG4gICAgICBpZiAoIW5ld1N0YXRlLmV4cGFuZGVkS2V5cykge1xuICAgICAgICBkZWxldGUgbmV3U3RhdGUuZXhwYW5kZWRLZXlzO1xuICAgICAgfVxuICAgICAgLy8gPT09PT09PT09PT09PT09PSBmbGF0dGVuTm9kZXMgPT09PT09PT09PT09PT09PT1cbiAgICAgIGlmICh0cmVlRGF0YSB8fCBuZXdTdGF0ZS5leHBhbmRlZEtleXMpIHtcbiAgICAgICAgdmFyIGZsYXR0ZW5Ob2RlcyA9IGZsYXR0ZW5UcmVlRGF0YSh0cmVlRGF0YSB8fCBwcmV2U3RhdGUudHJlZURhdGEsIG5ld1N0YXRlLmV4cGFuZGVkS2V5cyB8fCBwcmV2U3RhdGUuZXhwYW5kZWRLZXlzLCBmaWVsZE5hbWVzKTtcbiAgICAgICAgbmV3U3RhdGUuZmxhdHRlbk5vZGVzID0gZmxhdHRlbk5vZGVzO1xuICAgICAgfVxuICAgICAgLy8gPT09PT09PT09PT09PT09PSBzZWxlY3RlZEtleXMgPT09PT09PT09PT09PT09PT1cbiAgICAgIGlmIChwcm9wcy5zZWxlY3RhYmxlKSB7XG4gICAgICAgIGlmIChuZWVkU3luYygnc2VsZWN0ZWRLZXlzJykpIHtcbiAgICAgICAgICBuZXdTdGF0ZS5zZWxlY3RlZEtleXMgPSBjYWxjU2VsZWN0ZWRLZXlzKHByb3BzLnNlbGVjdGVkS2V5cywgcHJvcHMpO1xuICAgICAgICB9IGVsc2UgaWYgKCFwcmV2UHJvcHMgJiYgcHJvcHMuZGVmYXVsdFNlbGVjdGVkS2V5cykge1xuICAgICAgICAgIG5ld1N0YXRlLnNlbGVjdGVkS2V5cyA9IGNhbGNTZWxlY3RlZEtleXMocHJvcHMuZGVmYXVsdFNlbGVjdGVkS2V5cywgcHJvcHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyA9PT09PT09PT09PT09PT09PSBjaGVja2VkS2V5cyA9PT09PT09PT09PT09PT09PVxuICAgICAgaWYgKHByb3BzLmNoZWNrYWJsZSkge1xuICAgICAgICB2YXIgY2hlY2tlZEtleUVudGl0eTtcbiAgICAgICAgaWYgKG5lZWRTeW5jKCdjaGVja2VkS2V5cycpKSB7XG4gICAgICAgICAgY2hlY2tlZEtleUVudGl0eSA9IHBhcnNlQ2hlY2tlZEtleXMocHJvcHMuY2hlY2tlZEtleXMpIHx8IHt9O1xuICAgICAgICB9IGVsc2UgaWYgKCFwcmV2UHJvcHMgJiYgcHJvcHMuZGVmYXVsdENoZWNrZWRLZXlzKSB7XG4gICAgICAgICAgY2hlY2tlZEtleUVudGl0eSA9IHBhcnNlQ2hlY2tlZEtleXMocHJvcHMuZGVmYXVsdENoZWNrZWRLZXlzKSB8fCB7fTtcbiAgICAgICAgfSBlbHNlIGlmICh0cmVlRGF0YSkge1xuICAgICAgICAgIC8vIElmIGB0cmVlRGF0YWAgY2hhbmdlZCwgd2UgYWxzbyBuZWVkIGNoZWNrIGl0XG4gICAgICAgICAgY2hlY2tlZEtleUVudGl0eSA9IHBhcnNlQ2hlY2tlZEtleXMocHJvcHMuY2hlY2tlZEtleXMpIHx8IHtcbiAgICAgICAgICAgIGNoZWNrZWRLZXlzOiBwcmV2U3RhdGUuY2hlY2tlZEtleXMsXG4gICAgICAgICAgICBoYWxmQ2hlY2tlZEtleXM6IHByZXZTdGF0ZS5oYWxmQ2hlY2tlZEtleXNcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGVja2VkS2V5RW50aXR5KSB7XG4gICAgICAgICAgdmFyIF9jaGVja2VkS2V5RW50aXR5ID0gY2hlY2tlZEtleUVudGl0eSxcbiAgICAgICAgICAgIF9jaGVja2VkS2V5RW50aXR5JGNoZSA9IF9jaGVja2VkS2V5RW50aXR5LmNoZWNrZWRLZXlzLFxuICAgICAgICAgICAgY2hlY2tlZEtleXMgPSBfY2hlY2tlZEtleUVudGl0eSRjaGUgPT09IHZvaWQgMCA/IFtdIDogX2NoZWNrZWRLZXlFbnRpdHkkY2hlLFxuICAgICAgICAgICAgX2NoZWNrZWRLZXlFbnRpdHkkaGFsID0gX2NoZWNrZWRLZXlFbnRpdHkuaGFsZkNoZWNrZWRLZXlzLFxuICAgICAgICAgICAgaGFsZkNoZWNrZWRLZXlzID0gX2NoZWNrZWRLZXlFbnRpdHkkaGFsID09PSB2b2lkIDAgPyBbXSA6IF9jaGVja2VkS2V5RW50aXR5JGhhbDtcbiAgICAgICAgICBpZiAoIXByb3BzLmNoZWNrU3RyaWN0bHkpIHtcbiAgICAgICAgICAgIHZhciBjb25kdWN0S2V5cyA9IGNvbmR1Y3RDaGVjayhjaGVja2VkS2V5cywgdHJ1ZSwga2V5RW50aXRpZXMpO1xuICAgICAgICAgICAgY2hlY2tlZEtleXMgPSBjb25kdWN0S2V5cy5jaGVja2VkS2V5cztcbiAgICAgICAgICAgIGhhbGZDaGVja2VkS2V5cyA9IGNvbmR1Y3RLZXlzLmhhbGZDaGVja2VkS2V5cztcbiAgICAgICAgICB9XG4gICAgICAgICAgbmV3U3RhdGUuY2hlY2tlZEtleXMgPSBjaGVja2VkS2V5cztcbiAgICAgICAgICBuZXdTdGF0ZS5oYWxmQ2hlY2tlZEtleXMgPSBoYWxmQ2hlY2tlZEtleXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vID09PT09PT09PT09PT09PT09IGxvYWRlZEtleXMgPT09PT09PT09PT09PT09PT09XG4gICAgICBpZiAobmVlZFN5bmMoJ2xvYWRlZEtleXMnKSkge1xuICAgICAgICBuZXdTdGF0ZS5sb2FkZWRLZXlzID0gcHJvcHMubG9hZGVkS2V5cztcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXdTdGF0ZTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIFRyZWU7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5UcmVlLmRlZmF1bHRQcm9wcyA9IHtcbiAgcHJlZml4Q2xzOiAncmMtdHJlZScsXG4gIHNob3dMaW5lOiBmYWxzZSxcbiAgc2hvd0ljb246IHRydWUsXG4gIHNlbGVjdGFibGU6IHRydWUsXG4gIG11bHRpcGxlOiBmYWxzZSxcbiAgY2hlY2thYmxlOiBmYWxzZSxcbiAgZGlzYWJsZWQ6IGZhbHNlLFxuICBjaGVja1N0cmljdGx5OiBmYWxzZSxcbiAgZHJhZ2dhYmxlOiBmYWxzZSxcbiAgZGVmYXVsdEV4cGFuZFBhcmVudDogdHJ1ZSxcbiAgYXV0b0V4cGFuZFBhcmVudDogZmFsc2UsXG4gIGRlZmF1bHRFeHBhbmRBbGw6IGZhbHNlLFxuICBkZWZhdWx0RXhwYW5kZWRLZXlzOiBbXSxcbiAgZGVmYXVsdENoZWNrZWRLZXlzOiBbXSxcbiAgZGVmYXVsdFNlbGVjdGVkS2V5czogW10sXG4gIGRyb3BJbmRpY2F0b3JSZW5kZXI6IERyb3BJbmRpY2F0b3IsXG4gIGFsbG93RHJvcDogZnVuY3Rpb24gYWxsb3dEcm9wKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBleHBhbmRBY3Rpb246IGZhbHNlXG59O1xuVHJlZS5UcmVlTm9kZSA9IFRyZWVOb2RlO1xuZXhwb3J0IGRlZmF1bHQgVHJlZTsiLCIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBIb2xkZXJPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNMzAwIDI3Ni41YTU2IDU2IDAgMTA1Ni05NyA1NiA1NiAwIDAwLTU2IDk3em0wIDI4NGE1NiA1NiAwIDEwNTYtOTcgNTYgNTYgMCAwMC01NiA5N3pNNjQwIDIyOGE1NiA1NiAwIDEwMTEyIDAgNTYgNTYgMCAwMC0xMTIgMHptMCAyODRhNTYgNTYgMCAxMDExMiAwIDU2IDU2IDAgMDAtMTEyIDB6TTMwMCA4NDQuNWE1NiA1NiAwIDEwNTYtOTcgNTYgNTYgMCAwMC01NiA5N3pNNjQwIDc5NmE1NiA1NiAwIDEwMTEyIDAgNTYgNTYgMCAwMC0xMTIgMHpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImhvbGRlclwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgSG9sZGVyT3V0bGluZWQ7XG4iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBIb2xkZXJPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9Ib2xkZXJPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIEhvbGRlck91dGxpbmVkID0gZnVuY3Rpb24gSG9sZGVyT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IEhvbGRlck91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5Ib2xkZXJPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdIb2xkZXJPdXRsaW5lZCc7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihIb2xkZXJPdXRsaW5lZCk7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgdmFyIG9mZnNldCA9IDQ7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkcm9wSW5kaWNhdG9yUmVuZGVyKHByb3BzKSB7XG4gIHZhciBfc3R5bGU7XG4gIHZhciBkcm9wUG9zaXRpb24gPSBwcm9wcy5kcm9wUG9zaXRpb24sXG4gICAgZHJvcExldmVsT2Zmc2V0ID0gcHJvcHMuZHJvcExldmVsT2Zmc2V0LFxuICAgIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBpbmRlbnQgPSBwcm9wcy5pbmRlbnQsXG4gICAgX3Byb3BzJGRpcmVjdGlvbiA9IHByb3BzLmRpcmVjdGlvbixcbiAgICBkaXJlY3Rpb24gPSBfcHJvcHMkZGlyZWN0aW9uID09PSB2b2lkIDAgPyAnbHRyJyA6IF9wcm9wcyRkaXJlY3Rpb247XG4gIHZhciBzdGFydFBvc2l0aW9uID0gZGlyZWN0aW9uID09PSAnbHRyJyA/ICdsZWZ0JyA6ICdyaWdodCc7XG4gIHZhciBlbmRQb3NpdGlvbiA9IGRpcmVjdGlvbiA9PT0gJ2x0cicgPyAncmlnaHQnIDogJ2xlZnQnO1xuICB2YXIgc3R5bGUgPSAoX3N0eWxlID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfc3R5bGUsIHN0YXJ0UG9zaXRpb24sIC1kcm9wTGV2ZWxPZmZzZXQgKiBpbmRlbnQgKyBvZmZzZXQpLCBfZGVmaW5lUHJvcGVydHkoX3N0eWxlLCBlbmRQb3NpdGlvbiwgMCksIF9zdHlsZSk7XG4gIHN3aXRjaCAoZHJvcFBvc2l0aW9uKSB7XG4gICAgY2FzZSAtMTpcbiAgICAgIHN0eWxlLnRvcCA9IC0zO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxOlxuICAgICAgc3R5bGUuYm90dG9tID0gLTM7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gZHJvcFBvc2l0aW9uID09PSAwXG4gICAgICBzdHlsZS5ib3R0b20gPSAtMztcbiAgICAgIHN0eWxlW3N0YXJ0UG9zaXRpb25dID0gaW5kZW50ICsgb2Zmc2V0O1xuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRyb3AtaW5kaWNhdG9yXCIpXG4gIH0pO1xufSIsIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIENhcmV0RG93bkZpbGxlZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjAgMCAxMDI0IDEwMjRcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNODQwLjQgMzAwSDE4My42Yy0xOS43IDAtMzAuNyAyMC44LTE4LjUgMzVsMzI4LjQgMzgwLjhjOS40IDEwLjkgMjcuNSAxMC45IDM3IDBMODU4LjkgMzM1YzEyLjItMTQuMiAxLjItMzUtMTguNS0zNXpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImNhcmV0LWRvd25cIiwgXCJ0aGVtZVwiOiBcImZpbGxlZFwiIH07XG5leHBvcnQgZGVmYXVsdCBDYXJldERvd25GaWxsZWQ7XG4iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBDYXJldERvd25GaWxsZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vQ2FyZXREb3duRmlsbGVkXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSAnLi4vY29tcG9uZW50cy9BbnRkSWNvbic7XG52YXIgQ2FyZXREb3duRmlsbGVkID0gZnVuY3Rpb24gQ2FyZXREb3duRmlsbGVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBDYXJldERvd25GaWxsZWRTdmdcbiAgfSkpO1xufTtcbkNhcmV0RG93bkZpbGxlZC5kaXNwbGF5TmFtZSA9ICdDYXJldERvd25GaWxsZWQnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoQ2FyZXREb3duRmlsbGVkKTsiLCIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBGaWxlT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTg1NC42IDI4OC42TDYzOS40IDczLjRjLTYtNi0xNC4xLTkuNC0yMi42LTkuNEgxOTJjLTE3LjcgMC0zMiAxNC4zLTMyIDMydjgzMmMwIDE3LjcgMTQuMyAzMiAzMiAzMmg2NDBjMTcuNyAwIDMyLTE0LjMgMzItMzJWMzExLjNjMC04LjUtMy40LTE2LjctOS40LTIyLjd6TTc5MC4yIDMyNkg2MDJWMTM3LjhMNzkwLjIgMzI2em0xLjggNTYySDIzMlYxMzZoMzAydjIxNmE0MiA0MiAwIDAwNDIgNDJoMjE2djQ5NHpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImZpbGVcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IEZpbGVPdXRsaW5lZDtcbiIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEZpbGVPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9GaWxlT3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tICcuLi9jb21wb25lbnRzL0FudGRJY29uJztcbnZhciBGaWxlT3V0bGluZWQgPSBmdW5jdGlvbiBGaWxlT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IEZpbGVPdXRsaW5lZFN2Z1xuICB9KSk7XG59O1xuRmlsZU91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ0ZpbGVPdXRsaW5lZCc7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihGaWxlT3V0bGluZWQpOyIsIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIE1pbnVzU3F1YXJlT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTMyOCA1NDRoMzY4YzQuNCAwIDgtMy42IDgtOHYtNDhjMC00LjQtMy42LTgtOC04SDMyOGMtNC40IDAtOCAzLjYtOCA4djQ4YzAgNC40IDMuNiA4IDggOHpcIiB9IH0sIHsgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNODgwIDExMkgxNDRjLTE3LjcgMC0zMiAxNC4zLTMyIDMydjczNmMwIDE3LjcgMTQuMyAzMiAzMiAzMmg3MzZjMTcuNyAwIDMyLTE0LjMgMzItMzJWMTQ0YzAtMTcuNy0xNC4zLTMyLTMyLTMyem0tNDAgNzI4SDE4NFYxODRoNjU2djY1NnpcIiB9IH1dIH0sIFwibmFtZVwiOiBcIm1pbnVzLXNxdWFyZVwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgTWludXNTcXVhcmVPdXRsaW5lZDtcbiIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IE1pbnVzU3F1YXJlT3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vTWludXNTcXVhcmVPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIE1pbnVzU3F1YXJlT3V0bGluZWQgPSBmdW5jdGlvbiBNaW51c1NxdWFyZU91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBNaW51c1NxdWFyZU91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5NaW51c1NxdWFyZU91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ01pbnVzU3F1YXJlT3V0bGluZWQnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoTWludXNTcXVhcmVPdXRsaW5lZCk7IiwiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgUGx1c1NxdWFyZU91dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk0zMjggNTQ0aDE1MnYxNTJjMCA0LjQgMy42IDggOCA4aDQ4YzQuNCAwIDgtMy42IDgtOFY1NDRoMTUyYzQuNCAwIDgtMy42IDgtOHYtNDhjMC00LjQtMy42LTgtOC04SDU0NFYzMjhjMC00LjQtMy42LTgtOC04aC00OGMtNC40IDAtOCAzLjYtOCA4djE1MkgzMjhjLTQuNCAwLTggMy42LTggOHY0OGMwIDQuNCAzLjYgOCA4IDh6XCIgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTg4MCAxMTJIMTQ0Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnY3MzZjMCAxNy43IDE0LjMgMzIgMzIgMzJoNzM2YzE3LjcgMCAzMi0xNC4zIDMyLTMyVjE0NGMwLTE3LjctMTQuMy0zMi0zMi0zMnptLTQwIDcyOEgxODRWMTg0aDY1NnY2NTZ6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJwbHVzLXNxdWFyZVwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgUGx1c1NxdWFyZU91dGxpbmVkO1xuIiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUGx1c1NxdWFyZU91dGxpbmVkU3ZnIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1BsdXNTcXVhcmVPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIFBsdXNTcXVhcmVPdXRsaW5lZCA9IGZ1bmN0aW9uIFBsdXNTcXVhcmVPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogUGx1c1NxdWFyZU91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5QbHVzU3F1YXJlT3V0bGluZWQuZGlzcGxheU5hbWUgPSAnUGx1c1NxdWFyZU91dGxpbmVkJztcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKFBsdXNTcXVhcmVPdXRsaW5lZCk7IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IENhcmV0RG93bkZpbGxlZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvQ2FyZXREb3duRmlsbGVkXCI7XG5pbXBvcnQgRmlsZU91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9GaWxlT3V0bGluZWRcIjtcbmltcG9ydCBMb2FkaW5nT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0xvYWRpbmdPdXRsaW5lZFwiO1xuaW1wb3J0IE1pbnVzU3F1YXJlT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL01pbnVzU3F1YXJlT3V0bGluZWRcIjtcbmltcG9ydCBQbHVzU3F1YXJlT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1BsdXNTcXVhcmVPdXRsaW5lZFwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjbG9uZUVsZW1lbnQsIGlzVmFsaWRFbGVtZW50IH0gZnJvbSAnLi4vLi4vX3V0aWwvcmVhY3ROb2RlJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlbmRlclN3aXRjaGVySWNvbihwcmVmaXhDbHMsIHN3aXRjaGVySWNvbiwgc2hvd0xpbmUsIHRyZWVOb2RlUHJvcHMpIHtcbiAgdmFyIGlzTGVhZiA9IHRyZWVOb2RlUHJvcHMuaXNMZWFmLFxuICAgIGV4cGFuZGVkID0gdHJlZU5vZGVQcm9wcy5leHBhbmRlZCxcbiAgICBsb2FkaW5nID0gdHJlZU5vZGVQcm9wcy5sb2FkaW5nO1xuICBpZiAobG9hZGluZykge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMb2FkaW5nT3V0bGluZWQsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zd2l0Y2hlci1sb2FkaW5nLWljb25cIilcbiAgICB9KTtcbiAgfVxuICB2YXIgc2hvd0xlYWZJY29uO1xuICBpZiAoc2hvd0xpbmUgJiYgX3R5cGVvZihzaG93TGluZSkgPT09ICdvYmplY3QnKSB7XG4gICAgc2hvd0xlYWZJY29uID0gc2hvd0xpbmUuc2hvd0xlYWZJY29uO1xuICB9XG4gIGlmIChpc0xlYWYpIHtcbiAgICBpZiAoIXNob3dMaW5lKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzaG93TGVhZkljb24gIT09ICdib29sZWFuJyAmJiAhIXNob3dMZWFmSWNvbikge1xuICAgICAgdmFyIGxlYWZJY29uID0gdHlwZW9mIHNob3dMZWFmSWNvbiA9PT0gJ2Z1bmN0aW9uJyA/IHNob3dMZWFmSWNvbih0cmVlTm9kZVByb3BzKSA6IHNob3dMZWFmSWNvbjtcbiAgICAgIHZhciBsZWFmQ2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zd2l0Y2hlci1saW5lLWN1c3RvbS1pY29uXCIpO1xuICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KGxlYWZJY29uKSkge1xuICAgICAgICByZXR1cm4gY2xvbmVFbGVtZW50KGxlYWZJY29uLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGxlYWZJY29uLnByb3BzLmNsYXNzTmFtZSB8fCAnJywgbGVhZkNscylcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGVhZkljb247XG4gICAgfVxuICAgIHJldHVybiBzaG93TGVhZkljb24gPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGaWxlT3V0bGluZWQsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zd2l0Y2hlci1saW5lLWljb25cIilcbiAgICB9KSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3dpdGNoZXItbGVhZi1saW5lXCIpXG4gICAgfSk7XG4gIH1cbiAgdmFyIHN3aXRjaGVyQ2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zd2l0Y2hlci1pY29uXCIpO1xuICB2YXIgc3dpdGNoZXIgPSB0eXBlb2Ygc3dpdGNoZXJJY29uID09PSAnZnVuY3Rpb24nID8gc3dpdGNoZXJJY29uKHRyZWVOb2RlUHJvcHMpIDogc3dpdGNoZXJJY29uO1xuICBpZiAoaXNWYWxpZEVsZW1lbnQoc3dpdGNoZXIpKSB7XG4gICAgcmV0dXJuIGNsb25lRWxlbWVudChzd2l0Y2hlciwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKHN3aXRjaGVyLnByb3BzLmNsYXNzTmFtZSB8fCAnJywgc3dpdGNoZXJDbHMpXG4gICAgfSk7XG4gIH1cbiAgaWYgKHN3aXRjaGVyKSB7XG4gICAgcmV0dXJuIHN3aXRjaGVyO1xuICB9XG4gIGlmIChzaG93TGluZSkge1xuICAgIHJldHVybiBleHBhbmRlZCA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE1pbnVzU3F1YXJlT3V0bGluZWQsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zd2l0Y2hlci1saW5lLWljb25cIilcbiAgICB9KSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBsdXNTcXVhcmVPdXRsaW5lZCwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXN3aXRjaGVyLWxpbmUtaWNvblwiKVxuICAgIH0pO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDYXJldERvd25GaWxsZWQsIHtcbiAgICBjbGFzc05hbWU6IHN3aXRjaGVyQ2xzXG4gIH0pO1xufSIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBIb2xkZXJPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvSG9sZGVyT3V0bGluZWRcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJjVHJlZSBmcm9tICdyYy10cmVlJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IGNvbGxhcHNlTW90aW9uIGZyb20gJy4uL191dGlsL21vdGlvbic7XG5pbXBvcnQgZHJvcEluZGljYXRvclJlbmRlciBmcm9tICcuL3V0aWxzL2Ryb3BJbmRpY2F0b3InO1xuaW1wb3J0IHJlbmRlclN3aXRjaGVySWNvbiBmcm9tICcuL3V0aWxzL2ljb25VdGlsJztcbnZhciBUcmVlID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscyxcbiAgICBkaXJlY3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb24sXG4gICAgdmlydHVhbCA9IF9SZWFjdCR1c2VDb250ZXh0LnZpcnR1YWw7XG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIF9wcm9wcyRzaG93SWNvbiA9IHByb3BzLnNob3dJY29uLFxuICAgIHNob3dJY29uID0gX3Byb3BzJHNob3dJY29uID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRzaG93SWNvbixcbiAgICBzaG93TGluZSA9IHByb3BzLnNob3dMaW5lLFxuICAgIF9zd2l0Y2hlckljb24gPSBwcm9wcy5zd2l0Y2hlckljb24sXG4gICAgX3Byb3BzJGJsb2NrTm9kZSA9IHByb3BzLmJsb2NrTm9kZSxcbiAgICBibG9ja05vZGUgPSBfcHJvcHMkYmxvY2tOb2RlID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRibG9ja05vZGUsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBfcHJvcHMkY2hlY2thYmxlID0gcHJvcHMuY2hlY2thYmxlLFxuICAgIGNoZWNrYWJsZSA9IF9wcm9wcyRjaGVja2FibGUgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGNoZWNrYWJsZSxcbiAgICBfcHJvcHMkc2VsZWN0YWJsZSA9IHByb3BzLnNlbGVjdGFibGUsXG4gICAgc2VsZWN0YWJsZSA9IF9wcm9wcyRzZWxlY3RhYmxlID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJHNlbGVjdGFibGUsXG4gICAgZHJhZ2dhYmxlID0gcHJvcHMuZHJhZ2dhYmxlLFxuICAgIF9wcm9wcyRtb3Rpb24gPSBwcm9wcy5tb3Rpb24sXG4gICAgbW90aW9uID0gX3Byb3BzJG1vdGlvbiA9PT0gdm9pZCAwID8gX2V4dGVuZHMoX2V4dGVuZHMoe30sIGNvbGxhcHNlTW90aW9uKSwge1xuICAgICAgbW90aW9uQXBwZWFyOiBmYWxzZVxuICAgIH0pIDogX3Byb3BzJG1vdGlvbjtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygndHJlZScsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIHZhciBuZXdQcm9wcyA9IF9leHRlbmRzKF9leHRlbmRzKHt9LCBwcm9wcyksIHtcbiAgICBjaGVja2FibGU6IGNoZWNrYWJsZSxcbiAgICBzZWxlY3RhYmxlOiBzZWxlY3RhYmxlLFxuICAgIHNob3dJY29uOiBzaG93SWNvbixcbiAgICBtb3Rpb246IG1vdGlvbixcbiAgICBibG9ja05vZGU6IGJsb2NrTm9kZSxcbiAgICBzaG93TGluZTogQm9vbGVhbihzaG93TGluZSksXG4gICAgZHJvcEluZGljYXRvclJlbmRlcjogZHJvcEluZGljYXRvclJlbmRlclxuICB9KTtcbiAgdmFyIGRyYWdnYWJsZUNvbmZpZyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmICghZHJhZ2dhYmxlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBtZXJnZWREcmFnZ2FibGUgPSB7fTtcbiAgICBzd2l0Y2ggKF90eXBlb2YoZHJhZ2dhYmxlKSkge1xuICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICBtZXJnZWREcmFnZ2FibGUubm9kZURyYWdnYWJsZSA9IGRyYWdnYWJsZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICBtZXJnZWREcmFnZ2FibGUgPSBfZXh0ZW5kcyh7fSwgZHJhZ2dhYmxlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICAgIC8vIERvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBpZiAobWVyZ2VkRHJhZ2dhYmxlLmljb24gIT09IGZhbHNlKSB7XG4gICAgICBtZXJnZWREcmFnZ2FibGUuaWNvbiA9IG1lcmdlZERyYWdnYWJsZS5pY29uIHx8IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEhvbGRlck91dGxpbmVkLCBudWxsKTtcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZERyYWdnYWJsZTtcbiAgfSwgW2RyYWdnYWJsZV0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmNUcmVlLCBfZXh0ZW5kcyh7XG4gICAgaXRlbUhlaWdodDogMjAsXG4gICAgcmVmOiByZWYsXG4gICAgdmlydHVhbDogdmlydHVhbFxuICB9LCBuZXdQcm9wcywge1xuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcygoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWljb24taGlkZVwiKSwgIXNob3dJY29uKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWJsb2NrLW5vZGVcIiksIGJsb2NrTm9kZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi11bnNlbGVjdGFibGVcIiksICFzZWxlY3RhYmxlKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9jbGFzc05hbWVzKSwgY2xhc3NOYW1lKSxcbiAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICBjaGVja2FibGU6IGNoZWNrYWJsZSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY2hlY2tib3gtaW5uZXJcIilcbiAgICB9KSA6IGNoZWNrYWJsZSxcbiAgICBzZWxlY3RhYmxlOiBzZWxlY3RhYmxlLFxuICAgIHN3aXRjaGVySWNvbjogZnVuY3Rpb24gc3dpdGNoZXJJY29uKG5vZGVQcm9wcykge1xuICAgICAgcmV0dXJuIHJlbmRlclN3aXRjaGVySWNvbihwcmVmaXhDbHMsIF9zd2l0Y2hlckljb24sIHNob3dMaW5lLCBub2RlUHJvcHMpO1xuICAgIH0sXG4gICAgZHJhZ2dhYmxlOiBkcmFnZ2FibGVDb25maWdcbiAgfSksIGNoaWxkcmVuKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgVHJlZTsiLCIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBGb2xkZXJPcGVuT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTkyOCA0NDRIODIwVjMzMC40YzAtMTcuNy0xNC4zLTMyLTMyLTMySDQ3M0wzNTUuNyAxODYuMmE4LjE1IDguMTUgMCAwMC01LjUtMi4ySDk2Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnY1OTJjMCAxNy43IDE0LjMgMzIgMzIgMzJoNjk4YzEzIDAgMjQuOC03LjkgMjkuNy0yMGwxMzQtMzMyYzEuNS0zLjggMi4zLTcuOSAyLjMtMTIgMC0xNy43LTE0LjMtMzItMzItMzJ6TTEzNiAyNTZoMTg4LjVsMTE5LjYgMTE0LjRINzQ4VjQ0NEgyMzhjLTEzIDAtMjQuOCA3LjktMjkuNyAyMEwxMzYgNjQzLjJWMjU2em02MzUuMyA1MTJIMTU5bDEwMy4zLTI1Nmg2MTIuNEw3NzEuMyA3Njh6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJmb2xkZXItb3BlblwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgRm9sZGVyT3Blbk91dGxpbmVkO1xuIiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRm9sZGVyT3Blbk91dGxpbmVkU3ZnIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0ZvbGRlck9wZW5PdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIEZvbGRlck9wZW5PdXRsaW5lZCA9IGZ1bmN0aW9uIEZvbGRlck9wZW5PdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogRm9sZGVyT3Blbk91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5Gb2xkZXJPcGVuT3V0bGluZWQuZGlzcGxheU5hbWUgPSAnRm9sZGVyT3Blbk91dGxpbmVkJztcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEZvbGRlck9wZW5PdXRsaW5lZCk7IiwiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgRm9sZGVyT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTg4MCAyOTguNEg1MjFMNDAzLjcgMTg2LjJhOC4xNSA4LjE1IDAgMDAtNS41LTIuMkgxNDRjLTE3LjcgMC0zMiAxNC4zLTMyIDMydjU5MmMwIDE3LjcgMTQuMyAzMiAzMiAzMmg3MzZjMTcuNyAwIDMyLTE0LjMgMzItMzJWMzMwLjRjMC0xNy43LTE0LjMtMzItMzItMzJ6TTg0MCA3NjhIMTg0VjI1NmgxODguNWwxMTkuNiAxMTQuNEg4NDBWNzY4elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiZm9sZGVyXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnQgZGVmYXVsdCBGb2xkZXJPdXRsaW5lZDtcbiIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEZvbGRlck91dGxpbmVkU3ZnIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0ZvbGRlck91dGxpbmVkXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSAnLi4vY29tcG9uZW50cy9BbnRkSWNvbic7XG52YXIgRm9sZGVyT3V0bGluZWQgPSBmdW5jdGlvbiBGb2xkZXJPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogRm9sZGVyT3V0bGluZWRTdmdcbiAgfSkpO1xufTtcbkZvbGRlck91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ0ZvbGRlck91dGxpbmVkJztcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEZvbGRlck91dGxpbmVkKTsiLCJpbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xudmFyIFJlY29yZDtcbihmdW5jdGlvbiAoUmVjb3JkKSB7XG4gIFJlY29yZFtSZWNvcmRbXCJOb25lXCJdID0gMF0gPSBcIk5vbmVcIjtcbiAgUmVjb3JkW1JlY29yZFtcIlN0YXJ0XCJdID0gMV0gPSBcIlN0YXJ0XCI7XG4gIFJlY29yZFtSZWNvcmRbXCJFbmRcIl0gPSAyXSA9IFwiRW5kXCI7XG59KShSZWNvcmQgfHwgKFJlY29yZCA9IHt9KSk7XG5mdW5jdGlvbiB0cmF2ZXJzZU5vZGVzS2V5KHRyZWVEYXRhLCBjYWxsYmFjaykge1xuICBmdW5jdGlvbiBwcm9jZXNzTm9kZShkYXRhTm9kZSkge1xuICAgIHZhciBrZXkgPSBkYXRhTm9kZS5rZXksXG4gICAgICBjaGlsZHJlbiA9IGRhdGFOb2RlLmNoaWxkcmVuO1xuICAgIGlmIChjYWxsYmFjayhrZXksIGRhdGFOb2RlKSAhPT0gZmFsc2UpIHtcbiAgICAgIHRyYXZlcnNlTm9kZXNLZXkoY2hpbGRyZW4gfHwgW10sIGNhbGxiYWNrKTtcbiAgICB9XG4gIH1cbiAgdHJlZURhdGEuZm9yRWFjaChwcm9jZXNzTm9kZSk7XG59XG4vKiog6K6h566X6YCJ5Lit6IyD5Zu077yM5Y+q6ICD6JmRZXhwYW5kZWTmg4XlhrXku6XkvJjljJbmgKfog70gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjUmFuZ2VLZXlzKF9yZWYpIHtcbiAgdmFyIHRyZWVEYXRhID0gX3JlZi50cmVlRGF0YSxcbiAgICBleHBhbmRlZEtleXMgPSBfcmVmLmV4cGFuZGVkS2V5cyxcbiAgICBzdGFydEtleSA9IF9yZWYuc3RhcnRLZXksXG4gICAgZW5kS2V5ID0gX3JlZi5lbmRLZXk7XG4gIHZhciBrZXlzID0gW107XG4gIHZhciByZWNvcmQgPSBSZWNvcmQuTm9uZTtcbiAgaWYgKHN0YXJ0S2V5ICYmIHN0YXJ0S2V5ID09PSBlbmRLZXkpIHtcbiAgICByZXR1cm4gW3N0YXJ0S2V5XTtcbiAgfVxuICBpZiAoIXN0YXJ0S2V5IHx8ICFlbmRLZXkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgZnVuY3Rpb24gbWF0Y2hLZXkoa2V5KSB7XG4gICAgcmV0dXJuIGtleSA9PT0gc3RhcnRLZXkgfHwga2V5ID09PSBlbmRLZXk7XG4gIH1cbiAgdHJhdmVyc2VOb2Rlc0tleSh0cmVlRGF0YSwgZnVuY3Rpb24gKGtleSkge1xuICAgIGlmIChyZWNvcmQgPT09IFJlY29yZC5FbmQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG1hdGNoS2V5KGtleSkpIHtcbiAgICAgIC8vIE1hdGNoIHRlc3RcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgaWYgKHJlY29yZCA9PT0gUmVjb3JkLk5vbmUpIHtcbiAgICAgICAgcmVjb3JkID0gUmVjb3JkLlN0YXJ0O1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQgPT09IFJlY29yZC5TdGFydCkge1xuICAgICAgICByZWNvcmQgPSBSZWNvcmQuRW5kO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyZWNvcmQgPT09IFJlY29yZC5TdGFydCkge1xuICAgICAgLy8gQXBwZW5kIHNlbGVjdGlvblxuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIHJldHVybiBleHBhbmRlZEtleXMuaW5jbHVkZXMoa2V5KTtcbiAgfSk7XG4gIHJldHVybiBrZXlzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnREaXJlY3RvcnlLZXlzVG9Ob2Rlcyh0cmVlRGF0YSwga2V5cykge1xuICB2YXIgcmVzdEtleXMgPSBfdG9Db25zdW1hYmxlQXJyYXkoa2V5cyk7XG4gIHZhciBub2RlcyA9IFtdO1xuICB0cmF2ZXJzZU5vZGVzS2V5KHRyZWVEYXRhLCBmdW5jdGlvbiAoa2V5LCBub2RlKSB7XG4gICAgdmFyIGluZGV4ID0gcmVzdEtleXMuaW5kZXhPZihrZXkpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIG5vZGVzLnB1c2gobm9kZSk7XG4gICAgICByZXN0S2V5cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgICByZXR1cm4gISFyZXN0S2V5cy5sZW5ndGg7XG4gIH0pO1xuICByZXR1cm4gbm9kZXM7XG59IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xudmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmltcG9ydCBGaWxlT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0ZpbGVPdXRsaW5lZFwiO1xuaW1wb3J0IEZvbGRlck9wZW5PdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvRm9sZGVyT3Blbk91dGxpbmVkXCI7XG5pbXBvcnQgRm9sZGVyT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0ZvbGRlck91dGxpbmVkXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IGNvbmR1Y3RFeHBhbmRQYXJlbnQgfSBmcm9tIFwicmMtdHJlZS9lcy91dGlsXCI7XG5pbXBvcnQgeyBjb252ZXJ0RGF0YVRvRW50aXRpZXMsIGNvbnZlcnRUcmVlVG9EYXRhIH0gZnJvbSBcInJjLXRyZWUvZXMvdXRpbHMvdHJlZVV0aWxcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IFRyZWUgZnJvbSAnLi9UcmVlJztcbmltcG9ydCB7IGNhbGNSYW5nZUtleXMsIGNvbnZlcnREaXJlY3RvcnlLZXlzVG9Ob2RlcyB9IGZyb20gJy4vdXRpbHMvZGljdFV0aWwnO1xuZnVuY3Rpb24gZ2V0SWNvbihwcm9wcykge1xuICB2YXIgaXNMZWFmID0gcHJvcHMuaXNMZWFmLFxuICAgIGV4cGFuZGVkID0gcHJvcHMuZXhwYW5kZWQ7XG4gIGlmIChpc0xlYWYpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRmlsZU91dGxpbmVkLCBudWxsKTtcbiAgfVxuICByZXR1cm4gZXhwYW5kZWQgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGb2xkZXJPcGVuT3V0bGluZWQsIG51bGwpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRm9sZGVyT3V0bGluZWQsIG51bGwpO1xufVxuZnVuY3Rpb24gZ2V0VHJlZURhdGEoX3JlZikge1xuICB2YXIgdHJlZURhdGEgPSBfcmVmLnRyZWVEYXRhLFxuICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgcmV0dXJuIHRyZWVEYXRhIHx8IGNvbnZlcnRUcmVlVG9EYXRhKGNoaWxkcmVuKTtcbn1cbnZhciBEaXJlY3RvcnlUcmVlID0gZnVuY3Rpb24gRGlyZWN0b3J5VHJlZShfYSwgcmVmKSB7XG4gIHZhciBkZWZhdWx0RXhwYW5kQWxsID0gX2EuZGVmYXVsdEV4cGFuZEFsbCxcbiAgICBkZWZhdWx0RXhwYW5kUGFyZW50ID0gX2EuZGVmYXVsdEV4cGFuZFBhcmVudCxcbiAgICBkZWZhdWx0RXhwYW5kZWRLZXlzID0gX2EuZGVmYXVsdEV4cGFuZGVkS2V5cyxcbiAgICBwcm9wcyA9IF9fcmVzdChfYSwgW1wiZGVmYXVsdEV4cGFuZEFsbFwiLCBcImRlZmF1bHRFeHBhbmRQYXJlbnRcIiwgXCJkZWZhdWx0RXhwYW5kZWRLZXlzXCJdKTtcbiAgLy8gU2hpZnQgY2xpY2sgdXNhZ2VcbiAgdmFyIGxhc3RTZWxlY3RlZEtleSA9IFJlYWN0LnVzZVJlZigpO1xuICB2YXIgY2FjaGVkU2VsZWN0ZWRLZXlzID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciBnZXRJbml0RXhwYW5kZWRLZXlzID0gZnVuY3Rpb24gZ2V0SW5pdEV4cGFuZGVkS2V5cygpIHtcbiAgICB2YXIgX2NvbnZlcnREYXRhVG9FbnRpdGllID0gY29udmVydERhdGFUb0VudGl0aWVzKGdldFRyZWVEYXRhKHByb3BzKSksXG4gICAgICBrZXlFbnRpdGllcyA9IF9jb252ZXJ0RGF0YVRvRW50aXRpZS5rZXlFbnRpdGllcztcbiAgICB2YXIgaW5pdEV4cGFuZGVkS2V5cztcbiAgICAvLyBFeHBhbmRlZCBrZXlzXG4gICAgaWYgKGRlZmF1bHRFeHBhbmRBbGwpIHtcbiAgICAgIGluaXRFeHBhbmRlZEtleXMgPSBPYmplY3Qua2V5cyhrZXlFbnRpdGllcyk7XG4gICAgfSBlbHNlIGlmIChkZWZhdWx0RXhwYW5kUGFyZW50KSB7XG4gICAgICBpbml0RXhwYW5kZWRLZXlzID0gY29uZHVjdEV4cGFuZFBhcmVudChwcm9wcy5leHBhbmRlZEtleXMgfHwgZGVmYXVsdEV4cGFuZGVkS2V5cyB8fCBbXSwga2V5RW50aXRpZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbml0RXhwYW5kZWRLZXlzID0gcHJvcHMuZXhwYW5kZWRLZXlzIHx8IGRlZmF1bHRFeHBhbmRlZEtleXM7XG4gICAgfVxuICAgIHJldHVybiBpbml0RXhwYW5kZWRLZXlzO1xuICB9O1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUocHJvcHMuc2VsZWN0ZWRLZXlzIHx8IHByb3BzLmRlZmF1bHRTZWxlY3RlZEtleXMgfHwgW10pLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIHNlbGVjdGVkS2V5cyA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0U2VsZWN0ZWRLZXlzID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTMgPSBSZWFjdC51c2VTdGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZ2V0SW5pdEV4cGFuZGVkS2V5cygpO1xuICAgIH0pLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUzLCAyKSxcbiAgICBleHBhbmRlZEtleXMgPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgIHNldEV4cGFuZGVkS2V5cyA9IF9SZWFjdCR1c2VTdGF0ZTRbMV07XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCdzZWxlY3RlZEtleXMnIGluIHByb3BzKSB7XG4gICAgICBzZXRTZWxlY3RlZEtleXMocHJvcHMuc2VsZWN0ZWRLZXlzKTtcbiAgICB9XG4gIH0sIFtwcm9wcy5zZWxlY3RlZEtleXNdKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoJ2V4cGFuZGVkS2V5cycgaW4gcHJvcHMpIHtcbiAgICAgIHNldEV4cGFuZGVkS2V5cyhwcm9wcy5leHBhbmRlZEtleXMpO1xuICAgIH1cbiAgfSwgW3Byb3BzLmV4cGFuZGVkS2V5c10pO1xuICB2YXIgb25FeHBhbmQgPSBmdW5jdGlvbiBvbkV4cGFuZChrZXlzLCBpbmZvKSB7XG4gICAgdmFyIF9hO1xuICAgIGlmICghKCdleHBhbmRlZEtleXMnIGluIHByb3BzKSkge1xuICAgICAgc2V0RXhwYW5kZWRLZXlzKGtleXMpO1xuICAgIH1cbiAgICAvLyBDYWxsIG9yaWdpbiBmdW5jdGlvblxuICAgIHJldHVybiAoX2EgPSBwcm9wcy5vbkV4cGFuZCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwocHJvcHMsIGtleXMsIGluZm8pO1xuICB9O1xuICB2YXIgb25TZWxlY3QgPSBmdW5jdGlvbiBvblNlbGVjdChrZXlzLCBldmVudCkge1xuICAgIHZhciBfYTtcbiAgICB2YXIgbXVsdGlwbGUgPSBwcm9wcy5tdWx0aXBsZTtcbiAgICB2YXIgbm9kZSA9IGV2ZW50Lm5vZGUsXG4gICAgICBuYXRpdmVFdmVudCA9IGV2ZW50Lm5hdGl2ZUV2ZW50O1xuICAgIHZhciBfbm9kZSRrZXkgPSBub2RlLmtleSxcbiAgICAgIGtleSA9IF9ub2RlJGtleSA9PT0gdm9pZCAwID8gJycgOiBfbm9kZSRrZXk7XG4gICAgdmFyIHRyZWVEYXRhID0gZ2V0VHJlZURhdGEocHJvcHMpO1xuICAgIC8vIGNvbnN0IG5ld1N0YXRlOiBEaXJlY3RvcnlUcmVlU3RhdGUgPSB7fTtcbiAgICAvLyBXZSBuZWVkIHdyYXAgdGhpcyBldmVudCBzaW5jZSBzb21lIHZhbHVlIGlzIG5vdCBzYW1lXG4gICAgdmFyIG5ld0V2ZW50ID0gX2V4dGVuZHMoX2V4dGVuZHMoe30sIGV2ZW50KSwge1xuICAgICAgc2VsZWN0ZWQ6IHRydWVcbiAgICB9KTtcbiAgICAvLyBXaW5kb3dzIC8gTWFjIHNpbmdsZSBwaWNrXG4gICAgdmFyIGN0cmxQaWNrID0gKG5hdGl2ZUV2ZW50ID09PSBudWxsIHx8IG5hdGl2ZUV2ZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBuYXRpdmVFdmVudC5jdHJsS2V5KSB8fCAobmF0aXZlRXZlbnQgPT09IG51bGwgfHwgbmF0aXZlRXZlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5hdGl2ZUV2ZW50Lm1ldGFLZXkpO1xuICAgIHZhciBzaGlmdFBpY2sgPSBuYXRpdmVFdmVudCA9PT0gbnVsbCB8fCBuYXRpdmVFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbmF0aXZlRXZlbnQuc2hpZnRLZXk7XG4gICAgLy8gR2VuZXJhdGUgbmV3IHNlbGVjdGVkIGtleXNcbiAgICB2YXIgbmV3U2VsZWN0ZWRLZXlzO1xuICAgIGlmIChtdWx0aXBsZSAmJiBjdHJsUGljaykge1xuICAgICAgLy8gQ29udHJvbCBjbGlja1xuICAgICAgbmV3U2VsZWN0ZWRLZXlzID0ga2V5cztcbiAgICAgIGxhc3RTZWxlY3RlZEtleS5jdXJyZW50ID0ga2V5O1xuICAgICAgY2FjaGVkU2VsZWN0ZWRLZXlzLmN1cnJlbnQgPSBuZXdTZWxlY3RlZEtleXM7XG4gICAgICBuZXdFdmVudC5zZWxlY3RlZE5vZGVzID0gY29udmVydERpcmVjdG9yeUtleXNUb05vZGVzKHRyZWVEYXRhLCBuZXdTZWxlY3RlZEtleXMpO1xuICAgIH0gZWxzZSBpZiAobXVsdGlwbGUgJiYgc2hpZnRQaWNrKSB7XG4gICAgICAvLyBTaGlmdCBjbGlja1xuICAgICAgbmV3U2VsZWN0ZWRLZXlzID0gQXJyYXkuZnJvbShuZXcgU2V0KFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoY2FjaGVkU2VsZWN0ZWRLZXlzLmN1cnJlbnQgfHwgW10pLCBfdG9Db25zdW1hYmxlQXJyYXkoY2FsY1JhbmdlS2V5cyh7XG4gICAgICAgIHRyZWVEYXRhOiB0cmVlRGF0YSxcbiAgICAgICAgZXhwYW5kZWRLZXlzOiBleHBhbmRlZEtleXMsXG4gICAgICAgIHN0YXJ0S2V5OiBrZXksXG4gICAgICAgIGVuZEtleTogbGFzdFNlbGVjdGVkS2V5LmN1cnJlbnRcbiAgICAgIH0pKSkpKTtcbiAgICAgIG5ld0V2ZW50LnNlbGVjdGVkTm9kZXMgPSBjb252ZXJ0RGlyZWN0b3J5S2V5c1RvTm9kZXModHJlZURhdGEsIG5ld1NlbGVjdGVkS2V5cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNpbmdsZSBjbGlja1xuICAgICAgbmV3U2VsZWN0ZWRLZXlzID0gW2tleV07XG4gICAgICBsYXN0U2VsZWN0ZWRLZXkuY3VycmVudCA9IGtleTtcbiAgICAgIGNhY2hlZFNlbGVjdGVkS2V5cy5jdXJyZW50ID0gbmV3U2VsZWN0ZWRLZXlzO1xuICAgICAgbmV3RXZlbnQuc2VsZWN0ZWROb2RlcyA9IGNvbnZlcnREaXJlY3RvcnlLZXlzVG9Ob2Rlcyh0cmVlRGF0YSwgbmV3U2VsZWN0ZWRLZXlzKTtcbiAgICB9XG4gICAgKF9hID0gcHJvcHMub25TZWxlY3QpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKHByb3BzLCBuZXdTZWxlY3RlZEtleXMsIG5ld0V2ZW50KTtcbiAgICBpZiAoISgnc2VsZWN0ZWRLZXlzJyBpbiBwcm9wcykpIHtcbiAgICAgIHNldFNlbGVjdGVkS2V5cyhuZXdTZWxlY3RlZEtleXMpO1xuICAgIH1cbiAgfTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuICB2YXIgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBfcHJvcHMkc2hvd0ljb24gPSBwcm9wcy5zaG93SWNvbixcbiAgICBzaG93SWNvbiA9IF9wcm9wcyRzaG93SWNvbiA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRzaG93SWNvbixcbiAgICBfcHJvcHMkZXhwYW5kQWN0aW9uID0gcHJvcHMuZXhwYW5kQWN0aW9uLFxuICAgIGV4cGFuZEFjdGlvbiA9IF9wcm9wcyRleHBhbmRBY3Rpb24gPT09IHZvaWQgMCA/ICdjbGljaycgOiBfcHJvcHMkZXhwYW5kQWN0aW9uLFxuICAgIG90aGVyUHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInByZWZpeENsc1wiLCBcImNsYXNzTmFtZVwiLCBcInNob3dJY29uXCIsIFwiZXhwYW5kQWN0aW9uXCJdKTtcbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygndHJlZScsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gIHZhciBjb25uZWN0Q2xhc3NOYW1lID0gY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRpcmVjdG9yeVwiKSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRpcmVjdG9yeS1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBjbGFzc05hbWUpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVHJlZSwgX2V4dGVuZHMoe1xuICAgIGljb246IGdldEljb24sXG4gICAgcmVmOiByZWYsXG4gICAgYmxvY2tOb2RlOiB0cnVlXG4gIH0sIG90aGVyUHJvcHMsIHtcbiAgICBzaG93SWNvbjogc2hvd0ljb24sXG4gICAgZXhwYW5kQWN0aW9uOiBleHBhbmRBY3Rpb24sXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lOiBjb25uZWN0Q2xhc3NOYW1lLFxuICAgIGV4cGFuZGVkS2V5czogZXhwYW5kZWRLZXlzLFxuICAgIHNlbGVjdGVkS2V5czogc2VsZWN0ZWRLZXlzLFxuICAgIG9uU2VsZWN0OiBvblNlbGVjdCxcbiAgICBvbkV4cGFuZDogb25FeHBhbmRcbiAgfSkpO1xufTtcbnZhciBGb3J3YXJkRGlyZWN0b3J5VHJlZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKERpcmVjdG9yeVRyZWUpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgRm9yd2FyZERpcmVjdG9yeVRyZWUuZGlzcGxheU5hbWUgPSAnRGlyZWN0b3J5VHJlZSc7XG59XG5leHBvcnQgZGVmYXVsdCBGb3J3YXJkRGlyZWN0b3J5VHJlZTsiLCJpbXBvcnQgeyBUcmVlTm9kZSB9IGZyb20gJ3JjLXRyZWUnO1xuaW1wb3J0IFRyZWVQdXJlIGZyb20gJy4vVHJlZSc7XG5pbXBvcnQgRGlyZWN0b3J5VHJlZSBmcm9tICcuL0RpcmVjdG9yeVRyZWUnO1xudmFyIFRyZWUgPSBUcmVlUHVyZTtcblRyZWUuRGlyZWN0b3J5VHJlZSA9IERpcmVjdG9yeVRyZWU7XG5UcmVlLlRyZWVOb2RlID0gVHJlZU5vZGU7XG5leHBvcnQgZGVmYXVsdCBUcmVlOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VGb3JjZVVwZGF0ZSBmcm9tICcuL3VzZUZvcmNlVXBkYXRlJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVN5bmNTdGF0ZShpbml0aWFsVmFsdWUpIHtcbiAgdmFyIHJlZiA9IFJlYWN0LnVzZVJlZihpbml0aWFsVmFsdWUpO1xuICB2YXIgZm9yY2VVcGRhdGUgPSB1c2VGb3JjZVVwZGF0ZSgpO1xuICByZXR1cm4gW2Z1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcmVmLmN1cnJlbnQ7XG4gIH0sIGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgIHJlZi5jdXJyZW50ID0gbmV3VmFsdWU7XG4gICAgLy8gcmUtcmVuZGVyXG4gICAgZm9yY2VVcGRhdGUoKTtcbiAgfV07XG59IiwiaW1wb3J0IFNlYXJjaE91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9TZWFyY2hPdXRsaW5lZFwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IElucHV0IGZyb20gJy4uLy4uLy4uL2lucHV0JztcbmZ1bmN0aW9uIEZpbHRlclNlYXJjaChfcmVmKSB7XG4gIHZhciB2YWx1ZSA9IF9yZWYudmFsdWUsXG4gICAgb25DaGFuZ2UgPSBfcmVmLm9uQ2hhbmdlLFxuICAgIGZpbHRlclNlYXJjaCA9IF9yZWYuZmlsdGVyU2VhcmNoLFxuICAgIHRhYmxlUHJlZml4Q2xzID0gX3JlZi50YWJsZVByZWZpeENscyxcbiAgICBsb2NhbGUgPSBfcmVmLmxvY2FsZTtcbiAgaWYgKCFmaWx0ZXJTZWFyY2gpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQodGFibGVQcmVmaXhDbHMsIFwiLWZpbHRlci1kcm9wZG93bi1zZWFyY2hcIilcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSW5wdXQsIHtcbiAgICBwcmVmaXg6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNlYXJjaE91dGxpbmVkLCBudWxsKSxcbiAgICBwbGFjZWhvbGRlcjogbG9jYWxlLmZpbHRlclNlYXJjaFBsYWNlaG9sZGVyLFxuICAgIG9uQ2hhbmdlOiBvbkNoYW5nZSxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgLy8gZm9yIHNraXAgbWluLXdpZHRoIG9mIGlucHV0XG4gICAgaHRtbFNpemU6IDEsXG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdCh0YWJsZVByZWZpeENscywgXCItZmlsdGVyLWRyb3Bkb3duLXNlYXJjaC1pbnB1dFwiKVxuICB9KSk7XG59XG5leHBvcnQgZGVmYXVsdCBGaWx0ZXJTZWFyY2g7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEtleUNvZGUgZnJvbSBcInJjLXV0aWwvZXMvS2V5Q29kZVwiO1xudmFyIG9uS2V5RG93biA9IGZ1bmN0aW9uIG9uS2V5RG93bihldmVudCkge1xuICB2YXIga2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7XG4gIGlmIChrZXlDb2RlID09PSBLZXlDb2RlLkVOVEVSKSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cbn07XG52YXIgRmlsdGVyRHJvcGRvd25NZW51V3JhcHBlciA9IGZ1bmN0aW9uIEZpbHRlckRyb3Bkb3duTWVudVdyYXBwZXIocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IHByb3BzLmNsYXNzTmFtZSxcbiAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgIHJldHVybiBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0sXG4gICAgb25LZXlEb3duOiBvbktleURvd25cbiAgfSwgcHJvcHMuY2hpbGRyZW4pO1xufTtcbmV4cG9ydCBkZWZhdWx0IEZpbHRlckRyb3Bkb3duTWVudVdyYXBwZXI7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgRmlsdGVyRmlsbGVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9GaWx0ZXJGaWxsZWRcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSAnbG9kYXNoL2lzRXF1YWwnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZmxhdHRlbktleXMgfSBmcm9tICcuJztcbmltcG9ydCBCdXR0b24gZnJvbSAnLi4vLi4vLi4vYnV0dG9uJztcbmltcG9ydCBDaGVja2JveCBmcm9tICcuLi8uLi8uLi9jaGVja2JveCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vLi4vLi4vY29uZmlnLXByb3ZpZGVyL2NvbnRleHQnO1xuaW1wb3J0IERyb3Bkb3duIGZyb20gJy4uLy4uLy4uL2Ryb3Bkb3duJztcbmltcG9ydCBFbXB0eSBmcm9tICcuLi8uLi8uLi9lbXB0eSc7XG5pbXBvcnQgTWVudSBmcm9tICcuLi8uLi8uLi9tZW51JztcbmltcG9ydCB7IE92ZXJyaWRlUHJvdmlkZXIgfSBmcm9tICcuLi8uLi8uLi9tZW51L092ZXJyaWRlQ29udGV4dCc7XG5pbXBvcnQgUmFkaW8gZnJvbSAnLi4vLi4vLi4vcmFkaW8nO1xuaW1wb3J0IFRyZWUgZnJvbSAnLi4vLi4vLi4vdHJlZSc7XG5pbXBvcnQgdXNlU3luY1N0YXRlIGZyb20gJy4uLy4uLy4uL191dGlsL2hvb2tzL3VzZVN5bmNTdGF0ZSc7XG5pbXBvcnQgRmlsdGVyU2VhcmNoIGZyb20gJy4vRmlsdGVyU2VhcmNoJztcbmltcG9ydCBGaWx0ZXJEcm9wZG93bk1lbnVXcmFwcGVyIGZyb20gJy4vRmlsdGVyV3JhcHBlcic7XG5mdW5jdGlvbiBoYXNTdWJNZW51KGZpbHRlcnMpIHtcbiAgcmV0dXJuIGZpbHRlcnMuc29tZShmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9KTtcbn1cbmZ1bmN0aW9uIHNlYXJjaFZhbHVlTWF0Y2hlZChzZWFyY2hWYWx1ZSwgdGV4dCkge1xuICBpZiAodHlwZW9mIHRleHQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0ZXh0ID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB0ZXh0ID09PSBudWxsIHx8IHRleHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiByZW5kZXJGaWx0ZXJJdGVtcyhfcmVmMikge1xuICB2YXIgZmlsdGVycyA9IF9yZWYyLmZpbHRlcnMsXG4gICAgcHJlZml4Q2xzID0gX3JlZjIucHJlZml4Q2xzLFxuICAgIGZpbHRlcmVkS2V5cyA9IF9yZWYyLmZpbHRlcmVkS2V5cyxcbiAgICBmaWx0ZXJNdWx0aXBsZSA9IF9yZWYyLmZpbHRlck11bHRpcGxlLFxuICAgIHNlYXJjaFZhbHVlID0gX3JlZjIuc2VhcmNoVmFsdWUsXG4gICAgZmlsdGVyU2VhcmNoID0gX3JlZjIuZmlsdGVyU2VhcmNoO1xuICByZXR1cm4gZmlsdGVycy5tYXAoZnVuY3Rpb24gKGZpbHRlciwgaW5kZXgpIHtcbiAgICB2YXIga2V5ID0gU3RyaW5nKGZpbHRlci52YWx1ZSk7XG4gICAgaWYgKGZpbHRlci5jaGlsZHJlbikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiBrZXkgfHwgaW5kZXgsXG4gICAgICAgIGxhYmVsOiBmaWx0ZXIudGV4dCxcbiAgICAgICAgcG9wdXBDbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZHJvcGRvd24tc3VibWVudVwiKSxcbiAgICAgICAgY2hpbGRyZW46IHJlbmRlckZpbHRlckl0ZW1zKHtcbiAgICAgICAgICBmaWx0ZXJzOiBmaWx0ZXIuY2hpbGRyZW4sXG4gICAgICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgICAgZmlsdGVyZWRLZXlzOiBmaWx0ZXJlZEtleXMsXG4gICAgICAgICAgZmlsdGVyTXVsdGlwbGU6IGZpbHRlck11bHRpcGxlLFxuICAgICAgICAgIHNlYXJjaFZhbHVlOiBzZWFyY2hWYWx1ZSxcbiAgICAgICAgICBmaWx0ZXJTZWFyY2g6IGZpbHRlclNlYXJjaFxuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9XG4gICAgdmFyIENvbXBvbmVudCA9IGZpbHRlck11bHRpcGxlID8gQ2hlY2tib3ggOiBSYWRpbztcbiAgICB2YXIgaXRlbSA9IHtcbiAgICAgIGtleTogZmlsdGVyLnZhbHVlICE9PSB1bmRlZmluZWQgPyBrZXkgOiBpbmRleCxcbiAgICAgIGxhYmVsOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCB7XG4gICAgICAgIGNoZWNrZWQ6IGZpbHRlcmVkS2V5cy5pbmNsdWRlcyhrZXkpXG4gICAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIGZpbHRlci50ZXh0KSlcbiAgICB9O1xuICAgIGlmIChzZWFyY2hWYWx1ZS50cmltKCkpIHtcbiAgICAgIGlmICh0eXBlb2YgZmlsdGVyU2VhcmNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJTZWFyY2goc2VhcmNoVmFsdWUsIGZpbHRlcikgPyBpdGVtIDogbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWFyY2hWYWx1ZU1hdGNoZWQoc2VhcmNoVmFsdWUsIGZpbHRlci50ZXh0KSA/IGl0ZW0gOiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbTtcbiAgfSk7XG59XG5mdW5jdGlvbiBGaWx0ZXJEcm9wZG93bihwcm9wcykge1xuICB2YXIgX2E7XG4gIHZhciB0YWJsZVByZWZpeENscyA9IHByb3BzLnRhYmxlUHJlZml4Q2xzLFxuICAgIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBjb2x1bW4gPSBwcm9wcy5jb2x1bW4sXG4gICAgZHJvcGRvd25QcmVmaXhDbHMgPSBwcm9wcy5kcm9wZG93blByZWZpeENscyxcbiAgICBjb2x1bW5LZXkgPSBwcm9wcy5jb2x1bW5LZXksXG4gICAgZmlsdGVyTXVsdGlwbGUgPSBwcm9wcy5maWx0ZXJNdWx0aXBsZSxcbiAgICBfcHJvcHMkZmlsdGVyTW9kZSA9IHByb3BzLmZpbHRlck1vZGUsXG4gICAgZmlsdGVyTW9kZSA9IF9wcm9wcyRmaWx0ZXJNb2RlID09PSB2b2lkIDAgPyAnbWVudScgOiBfcHJvcHMkZmlsdGVyTW9kZSxcbiAgICBfcHJvcHMkZmlsdGVyU2VhcmNoID0gcHJvcHMuZmlsdGVyU2VhcmNoLFxuICAgIGZpbHRlclNlYXJjaCA9IF9wcm9wcyRmaWx0ZXJTZWFyY2ggPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGZpbHRlclNlYXJjaCxcbiAgICBmaWx0ZXJTdGF0ZSA9IHByb3BzLmZpbHRlclN0YXRlLFxuICAgIHRyaWdnZXJGaWx0ZXIgPSBwcm9wcy50cmlnZ2VyRmlsdGVyLFxuICAgIGxvY2FsZSA9IHByb3BzLmxvY2FsZSxcbiAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIGdldFBvcHVwQ29udGFpbmVyID0gcHJvcHMuZ2V0UG9wdXBDb250YWluZXI7XG4gIHZhciBmaWx0ZXJEcm9wZG93bk9wZW4gPSBjb2x1bW4uZmlsdGVyRHJvcGRvd25PcGVuLFxuICAgIG9uRmlsdGVyRHJvcGRvd25PcGVuQ2hhbmdlID0gY29sdW1uLm9uRmlsdGVyRHJvcGRvd25PcGVuQ2hhbmdlLFxuICAgIGZpbHRlckRyb3Bkb3duVmlzaWJsZSA9IGNvbHVtbi5maWx0ZXJEcm9wZG93blZpc2libGUsXG4gICAgb25GaWx0ZXJEcm9wZG93blZpc2libGVDaGFuZ2UgPSBjb2x1bW4ub25GaWx0ZXJEcm9wZG93blZpc2libGVDaGFuZ2UsXG4gICAgZmlsdGVyUmVzZXRUb0RlZmF1bHRGaWx0ZXJlZFZhbHVlID0gY29sdW1uLmZpbHRlclJlc2V0VG9EZWZhdWx0RmlsdGVyZWRWYWx1ZSxcbiAgICBkZWZhdWx0RmlsdGVyZWRWYWx1ZSA9IGNvbHVtbi5kZWZhdWx0RmlsdGVyZWRWYWx1ZTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICB2aXNpYmxlID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRWaXNpYmxlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIGZpbHRlcmVkID0gISEoZmlsdGVyU3RhdGUgJiYgKCgoX2EgPSBmaWx0ZXJTdGF0ZS5maWx0ZXJlZEtleXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpIHx8IGZpbHRlclN0YXRlLmZvcmNlRmlsdGVyZWQpKTtcbiAgdmFyIHRyaWdnZXJWaXNpYmxlID0gZnVuY3Rpb24gdHJpZ2dlclZpc2libGUobmV3VmlzaWJsZSkge1xuICAgIHNldFZpc2libGUobmV3VmlzaWJsZSk7XG4gICAgb25GaWx0ZXJEcm9wZG93bk9wZW5DaGFuZ2UgPT09IG51bGwgfHwgb25GaWx0ZXJEcm9wZG93bk9wZW5DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRmlsdGVyRHJvcGRvd25PcGVuQ2hhbmdlKG5ld1Zpc2libGUpO1xuICAgIG9uRmlsdGVyRHJvcGRvd25WaXNpYmxlQ2hhbmdlID09PSBudWxsIHx8IG9uRmlsdGVyRHJvcGRvd25WaXNpYmxlQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkZpbHRlckRyb3Bkb3duVmlzaWJsZUNoYW5nZShuZXdWaXNpYmxlKTtcbiAgfTtcbiAgdmFyIG1lcmdlZFZpc2libGU7XG4gIGlmICh0eXBlb2YgZmlsdGVyRHJvcGRvd25PcGVuID09PSAnYm9vbGVhbicpIHtcbiAgICBtZXJnZWRWaXNpYmxlID0gZmlsdGVyRHJvcGRvd25PcGVuO1xuICB9IGVsc2Uge1xuICAgIG1lcmdlZFZpc2libGUgPSB0eXBlb2YgZmlsdGVyRHJvcGRvd25WaXNpYmxlID09PSAnYm9vbGVhbicgPyBmaWx0ZXJEcm9wZG93blZpc2libGUgOiB2aXNpYmxlO1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PSBTZWxlY3QgS2V5cyA9PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHByb3BGaWx0ZXJlZEtleXMgPSBmaWx0ZXJTdGF0ZSA9PT0gbnVsbCB8fCBmaWx0ZXJTdGF0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZmlsdGVyU3RhdGUuZmlsdGVyZWRLZXlzO1xuICB2YXIgX3VzZVN5bmNTdGF0ZSA9IHVzZVN5bmNTdGF0ZShwcm9wRmlsdGVyZWRLZXlzIHx8IFtdKSxcbiAgICBfdXNlU3luY1N0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTeW5jU3RhdGUsIDIpLFxuICAgIGdldEZpbHRlcmVkS2V5c1N5bmMgPSBfdXNlU3luY1N0YXRlMlswXSxcbiAgICBzZXRGaWx0ZXJlZEtleXNTeW5jID0gX3VzZVN5bmNTdGF0ZTJbMV07XG4gIHZhciBvblNlbGVjdEtleXMgPSBmdW5jdGlvbiBvblNlbGVjdEtleXMoX3JlZjMpIHtcbiAgICB2YXIgc2VsZWN0ZWRLZXlzID0gX3JlZjMuc2VsZWN0ZWRLZXlzO1xuICAgIHNldEZpbHRlcmVkS2V5c1N5bmMoc2VsZWN0ZWRLZXlzKTtcbiAgfTtcbiAgdmFyIG9uQ2hlY2sgPSBmdW5jdGlvbiBvbkNoZWNrKGtleXMsIF9yZWY0KSB7XG4gICAgdmFyIG5vZGUgPSBfcmVmNC5ub2RlLFxuICAgICAgY2hlY2tlZCA9IF9yZWY0LmNoZWNrZWQ7XG4gICAgaWYgKCFmaWx0ZXJNdWx0aXBsZSkge1xuICAgICAgb25TZWxlY3RLZXlzKHtcbiAgICAgICAgc2VsZWN0ZWRLZXlzOiBjaGVja2VkICYmIG5vZGUua2V5ID8gW25vZGUua2V5XSA6IFtdXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb25TZWxlY3RLZXlzKHtcbiAgICAgICAgc2VsZWN0ZWRLZXlzOiBrZXlzXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF2aXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG9uU2VsZWN0S2V5cyh7XG4gICAgICBzZWxlY3RlZEtleXM6IHByb3BGaWx0ZXJlZEtleXMgfHwgW11cbiAgICB9KTtcbiAgfSwgW3Byb3BGaWx0ZXJlZEtleXNdKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBPcGVuIEtleXMgPT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKFtdKSxcbiAgICBfUmVhY3QkdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlMywgMiksXG4gICAgb3BlbktleXMgPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgIHNldE9wZW5LZXlzID0gX1JlYWN0JHVzZVN0YXRlNFsxXTtcbiAgdmFyIG9uT3BlbkNoYW5nZSA9IGZ1bmN0aW9uIG9uT3BlbkNoYW5nZShrZXlzKSB7XG4gICAgc2V0T3BlbktleXMoa2V5cyk7XG4gIH07XG4gIC8vIHNlYXJjaCBpbiB0cmVlIG1vZGUgY29sdW1uIGZpbHRlclxuICB2YXIgX1JlYWN0JHVzZVN0YXRlNSA9IFJlYWN0LnVzZVN0YXRlKCcnKSxcbiAgICBfUmVhY3QkdXNlU3RhdGU2ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlNSwgMiksXG4gICAgc2VhcmNoVmFsdWUgPSBfUmVhY3QkdXNlU3RhdGU2WzBdLFxuICAgIHNldFNlYXJjaFZhbHVlID0gX1JlYWN0JHVzZVN0YXRlNlsxXTtcbiAgdmFyIG9uU2VhcmNoID0gZnVuY3Rpb24gb25TZWFyY2goZSkge1xuICAgIHZhciB2YWx1ZSA9IGUudGFyZ2V0LnZhbHVlO1xuICAgIHNldFNlYXJjaFZhbHVlKHZhbHVlKTtcbiAgfTtcbiAgLy8gY2xlYXIgc2VhcmNoIHZhbHVlIGFmdGVyIGNsb3NlIGZpbHRlciBkcm9wZG93blxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghdmlzaWJsZSkge1xuICAgICAgc2V0U2VhcmNoVmFsdWUoJycpO1xuICAgIH1cbiAgfSwgW3Zpc2libGVdKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gU3VibWl0ID09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaW50ZXJuYWxUcmlnZ2VyRmlsdGVyID0gZnVuY3Rpb24gaW50ZXJuYWxUcmlnZ2VyRmlsdGVyKGtleXMpIHtcbiAgICB2YXIgbWVyZ2VkS2V5cyA9IGtleXMgJiYga2V5cy5sZW5ndGggPyBrZXlzIDogbnVsbDtcbiAgICBpZiAobWVyZ2VkS2V5cyA9PT0gbnVsbCAmJiAoIWZpbHRlclN0YXRlIHx8ICFmaWx0ZXJTdGF0ZS5maWx0ZXJlZEtleXMpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGlzRXF1YWwobWVyZ2VkS2V5cywgZmlsdGVyU3RhdGUgPT09IG51bGwgfHwgZmlsdGVyU3RhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZpbHRlclN0YXRlLmZpbHRlcmVkS2V5cykpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0cmlnZ2VyRmlsdGVyKHtcbiAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAga2V5OiBjb2x1bW5LZXksXG4gICAgICBmaWx0ZXJlZEtleXM6IG1lcmdlZEtleXNcbiAgICB9KTtcbiAgfTtcbiAgdmFyIG9uQ29uZmlybSA9IGZ1bmN0aW9uIG9uQ29uZmlybSgpIHtcbiAgICB0cmlnZ2VyVmlzaWJsZShmYWxzZSk7XG4gICAgaW50ZXJuYWxUcmlnZ2VyRmlsdGVyKGdldEZpbHRlcmVkS2V5c1N5bmMoKSk7XG4gIH07XG4gIHZhciBvblJlc2V0ID0gZnVuY3Rpb24gb25SZXNldCgpIHtcbiAgICB2YXIgX3JlZjUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHtcbiAgICAgICAgY29uZmlybTogZmFsc2UsXG4gICAgICAgIGNsb3NlRHJvcGRvd246IGZhbHNlXG4gICAgICB9LFxuICAgICAgY29uZmlybSA9IF9yZWY1LmNvbmZpcm0sXG4gICAgICBjbG9zZURyb3Bkb3duID0gX3JlZjUuY2xvc2VEcm9wZG93bjtcbiAgICBpZiAoY29uZmlybSkge1xuICAgICAgaW50ZXJuYWxUcmlnZ2VyRmlsdGVyKFtdKTtcbiAgICB9XG4gICAgaWYgKGNsb3NlRHJvcGRvd24pIHtcbiAgICAgIHRyaWdnZXJWaXNpYmxlKGZhbHNlKTtcbiAgICB9XG4gICAgc2V0U2VhcmNoVmFsdWUoJycpO1xuICAgIGlmIChmaWx0ZXJSZXNldFRvRGVmYXVsdEZpbHRlcmVkVmFsdWUpIHtcbiAgICAgIHNldEZpbHRlcmVkS2V5c1N5bmMoKGRlZmF1bHRGaWx0ZXJlZFZhbHVlIHx8IFtdKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gU3RyaW5nKGtleSk7XG4gICAgICB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldEZpbHRlcmVkS2V5c1N5bmMoW10pO1xuICAgIH1cbiAgfTtcbiAgdmFyIGRvRmlsdGVyID0gZnVuY3Rpb24gZG9GaWx0ZXIoKSB7XG4gICAgdmFyIF9yZWY2ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7XG4gICAgICAgIGNsb3NlRHJvcGRvd246IHRydWVcbiAgICAgIH0sXG4gICAgICBjbG9zZURyb3Bkb3duID0gX3JlZjYuY2xvc2VEcm9wZG93bjtcbiAgICBpZiAoY2xvc2VEcm9wZG93bikge1xuICAgICAgdHJpZ2dlclZpc2libGUoZmFsc2UpO1xuICAgIH1cbiAgICBpbnRlcm5hbFRyaWdnZXJGaWx0ZXIoZ2V0RmlsdGVyZWRLZXlzU3luYygpKTtcbiAgfTtcbiAgdmFyIG9uVmlzaWJsZUNoYW5nZSA9IGZ1bmN0aW9uIG9uVmlzaWJsZUNoYW5nZShuZXdWaXNpYmxlKSB7XG4gICAgaWYgKG5ld1Zpc2libGUgJiYgcHJvcEZpbHRlcmVkS2V5cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBTeW5jIGZpbHRlcmVkS2V5cyBvbiBhcHBlYXIgaW4gY29udHJvbGxlZCBtb2RlIChwcm9wRmlsdGVyZWRLZXlzICE9PSB1bmRlZmllbmQpXG4gICAgICBzZXRGaWx0ZXJlZEtleXNTeW5jKHByb3BGaWx0ZXJlZEtleXMgfHwgW10pO1xuICAgIH1cbiAgICB0cmlnZ2VyVmlzaWJsZShuZXdWaXNpYmxlKTtcbiAgICAvLyBEZWZhdWx0IHdpbGwgZmlsdGVyIHdoZW4gY2xvc2VkXG4gICAgaWYgKCFuZXdWaXNpYmxlICYmICFjb2x1bW4uZmlsdGVyRHJvcGRvd24pIHtcbiAgICAgIG9uQ29uZmlybSgpO1xuICAgIH1cbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFN0eWxlID09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgZHJvcGRvd25NZW51Q2xhc3MgPSBjbGFzc05hbWVzKF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQoZHJvcGRvd25QcmVmaXhDbHMsIFwiLW1lbnUtd2l0aG91dC1zdWJtZW51XCIpLCAhaGFzU3ViTWVudShjb2x1bW4uZmlsdGVycyB8fCBbXSkpKTtcbiAgdmFyIG9uQ2hlY2tBbGwgPSBmdW5jdGlvbiBvbkNoZWNrQWxsKGUpIHtcbiAgICBpZiAoZS50YXJnZXQuY2hlY2tlZCkge1xuICAgICAgdmFyIGFsbEZpbHRlcktleXMgPSBmbGF0dGVuS2V5cyhjb2x1bW4gPT09IG51bGwgfHwgY29sdW1uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb2x1bW4uZmlsdGVycykubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyhrZXkpO1xuICAgICAgfSk7XG4gICAgICBzZXRGaWx0ZXJlZEtleXNTeW5jKGFsbEZpbHRlcktleXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRGaWx0ZXJlZEtleXNTeW5jKFtdKTtcbiAgICB9XG4gIH07XG4gIHZhciBnZXRUcmVlRGF0YSA9IGZ1bmN0aW9uIGdldFRyZWVEYXRhKF9yZWY3KSB7XG4gICAgdmFyIGZpbHRlcnMgPSBfcmVmNy5maWx0ZXJzO1xuICAgIHJldHVybiAoZmlsdGVycyB8fCBbXSkubWFwKGZ1bmN0aW9uIChmaWx0ZXIsIGluZGV4KSB7XG4gICAgICB2YXIga2V5ID0gU3RyaW5nKGZpbHRlci52YWx1ZSk7XG4gICAgICB2YXIgaXRlbSA9IHtcbiAgICAgICAgdGl0bGU6IGZpbHRlci50ZXh0LFxuICAgICAgICBrZXk6IGZpbHRlci52YWx1ZSAhPT0gdW5kZWZpbmVkID8ga2V5IDogaW5kZXhcbiAgICAgIH07XG4gICAgICBpZiAoZmlsdGVyLmNoaWxkcmVuKSB7XG4gICAgICAgIGl0ZW0uY2hpbGRyZW4gPSBnZXRUcmVlRGF0YSh7XG4gICAgICAgICAgZmlsdGVyczogZmlsdGVyLmNoaWxkcmVuXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfSk7XG4gIH07XG4gIHZhciBnZXRGaWx0ZXJEYXRhID0gZnVuY3Rpb24gZ2V0RmlsdGVyRGF0YShub2RlKSB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiBfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgbm9kZSksIHtcbiAgICAgIHRleHQ6IG5vZGUudGl0bGUsXG4gICAgICB2YWx1ZTogbm9kZS5rZXksXG4gICAgICBjaGlsZHJlbjogKChfYSA9IG5vZGUuY2hpbGRyZW4pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGdldEZpbHRlckRhdGEoaXRlbSk7XG4gICAgICB9KSkgfHwgW11cbiAgICB9KTtcbiAgfTtcbiAgdmFyIGRyb3Bkb3duQ29udGVudDtcbiAgaWYgKHR5cGVvZiBjb2x1bW4uZmlsdGVyRHJvcGRvd24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBkcm9wZG93bkNvbnRlbnQgPSBjb2x1bW4uZmlsdGVyRHJvcGRvd24oe1xuICAgICAgcHJlZml4Q2xzOiBcIlwiLmNvbmNhdChkcm9wZG93blByZWZpeENscywgXCItY3VzdG9tXCIpLFxuICAgICAgc2V0U2VsZWN0ZWRLZXlzOiBmdW5jdGlvbiBzZXRTZWxlY3RlZEtleXMoc2VsZWN0ZWRLZXlzKSB7XG4gICAgICAgIHJldHVybiBvblNlbGVjdEtleXMoe1xuICAgICAgICAgIHNlbGVjdGVkS2V5czogc2VsZWN0ZWRLZXlzXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHNlbGVjdGVkS2V5czogZ2V0RmlsdGVyZWRLZXlzU3luYygpLFxuICAgICAgY29uZmlybTogZG9GaWx0ZXIsXG4gICAgICBjbGVhckZpbHRlcnM6IG9uUmVzZXQsXG4gICAgICBmaWx0ZXJzOiBjb2x1bW4uZmlsdGVycyxcbiAgICAgIHZpc2libGU6IG1lcmdlZFZpc2libGUsXG4gICAgICBjbG9zZTogZnVuY3Rpb24gY2xvc2UoKSB7XG4gICAgICAgIHRyaWdnZXJWaXNpYmxlKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIGlmIChjb2x1bW4uZmlsdGVyRHJvcGRvd24pIHtcbiAgICBkcm9wZG93bkNvbnRlbnQgPSBjb2x1bW4uZmlsdGVyRHJvcGRvd247XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNlbGVjdGVkS2V5cyA9IGdldEZpbHRlcmVkS2V5c1N5bmMoKSB8fCBbXTtcbiAgICB2YXIgZ2V0RmlsdGVyQ29tcG9uZW50ID0gZnVuY3Rpb24gZ2V0RmlsdGVyQ29tcG9uZW50KCkge1xuICAgICAgaWYgKChjb2x1bW4uZmlsdGVycyB8fCBbXSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbXB0eSwge1xuICAgICAgICAgIGltYWdlOiBFbXB0eS5QUkVTRU5URURfSU1BR0VfU0lNUExFLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBsb2NhbGUuZmlsdGVyRW1wdHlUZXh0LFxuICAgICAgICAgIGltYWdlU3R5bGU6IHtcbiAgICAgICAgICAgIGhlaWdodDogMjRcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBtYXJnaW46IDAsXG4gICAgICAgICAgICBwYWRkaW5nOiAnMTZweCAwJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZmlsdGVyTW9kZSA9PT0gJ3RyZWUnKSB7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRmlsdGVyU2VhcmNoLCB7XG4gICAgICAgICAgZmlsdGVyU2VhcmNoOiBmaWx0ZXJTZWFyY2gsXG4gICAgICAgICAgdmFsdWU6IHNlYXJjaFZhbHVlLFxuICAgICAgICAgIG9uQ2hhbmdlOiBvblNlYXJjaCxcbiAgICAgICAgICB0YWJsZVByZWZpeENsczogdGFibGVQcmVmaXhDbHMsXG4gICAgICAgICAgbG9jYWxlOiBsb2NhbGVcbiAgICAgICAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHRhYmxlUHJlZml4Q2xzLCBcIi1maWx0ZXItZHJvcGRvd24tdHJlZVwiKVxuICAgICAgICB9LCBmaWx0ZXJNdWx0aXBsZSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENoZWNrYm94LCB7XG4gICAgICAgICAgY2hlY2tlZDogc2VsZWN0ZWRLZXlzLmxlbmd0aCA9PT0gZmxhdHRlbktleXMoY29sdW1uLmZpbHRlcnMpLmxlbmd0aCxcbiAgICAgICAgICBpbmRldGVybWluYXRlOiBzZWxlY3RlZEtleXMubGVuZ3RoID4gMCAmJiBzZWxlY3RlZEtleXMubGVuZ3RoIDwgZmxhdHRlbktleXMoY29sdW1uLmZpbHRlcnMpLmxlbmd0aCxcbiAgICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHRhYmxlUHJlZml4Q2xzLCBcIi1maWx0ZXItZHJvcGRvd24tY2hlY2thbGxcIiksXG4gICAgICAgICAgb25DaGFuZ2U6IG9uQ2hlY2tBbGxcbiAgICAgICAgfSwgbG9jYWxlLmZpbHRlckNoZWNrYWxsKSA6IG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRyZWUsIHtcbiAgICAgICAgICBjaGVja2FibGU6IHRydWUsXG4gICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXG4gICAgICAgICAgYmxvY2tOb2RlOiB0cnVlLFxuICAgICAgICAgIG11bHRpcGxlOiBmaWx0ZXJNdWx0aXBsZSxcbiAgICAgICAgICBjaGVja1N0cmljdGx5OiAhZmlsdGVyTXVsdGlwbGUsXG4gICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChkcm9wZG93blByZWZpeENscywgXCItbWVudVwiKSxcbiAgICAgICAgICBvbkNoZWNrOiBvbkNoZWNrLFxuICAgICAgICAgIGNoZWNrZWRLZXlzOiBzZWxlY3RlZEtleXMsXG4gICAgICAgICAgc2VsZWN0ZWRLZXlzOiBzZWxlY3RlZEtleXMsXG4gICAgICAgICAgc2hvd0ljb246IGZhbHNlLFxuICAgICAgICAgIHRyZWVEYXRhOiBnZXRUcmVlRGF0YSh7XG4gICAgICAgICAgICBmaWx0ZXJzOiBjb2x1bW4uZmlsdGVyc1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIGF1dG9FeHBhbmRQYXJlbnQ6IHRydWUsXG4gICAgICAgICAgZGVmYXVsdEV4cGFuZEFsbDogdHJ1ZSxcbiAgICAgICAgICBmaWx0ZXJUcmVlTm9kZTogc2VhcmNoVmFsdWUudHJpbSgpID8gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZmlsdGVyU2VhcmNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJTZWFyY2goc2VhcmNoVmFsdWUsIGdldEZpbHRlckRhdGEobm9kZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNlYXJjaFZhbHVlTWF0Y2hlZChzZWFyY2hWYWx1ZSwgbm9kZS50aXRsZSk7XG4gICAgICAgICAgfSA6IHVuZGVmaW5lZFxuICAgICAgICB9KSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGaWx0ZXJTZWFyY2gsIHtcbiAgICAgICAgZmlsdGVyU2VhcmNoOiBmaWx0ZXJTZWFyY2gsXG4gICAgICAgIHZhbHVlOiBzZWFyY2hWYWx1ZSxcbiAgICAgICAgb25DaGFuZ2U6IG9uU2VhcmNoLFxuICAgICAgICB0YWJsZVByZWZpeENsczogdGFibGVQcmVmaXhDbHMsXG4gICAgICAgIGxvY2FsZTogbG9jYWxlXG4gICAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTWVudSwge1xuICAgICAgICBzZWxlY3RhYmxlOiB0cnVlLFxuICAgICAgICBtdWx0aXBsZTogZmlsdGVyTXVsdGlwbGUsXG4gICAgICAgIHByZWZpeENsczogXCJcIi5jb25jYXQoZHJvcGRvd25QcmVmaXhDbHMsIFwiLW1lbnVcIiksXG4gICAgICAgIGNsYXNzTmFtZTogZHJvcGRvd25NZW51Q2xhc3MsXG4gICAgICAgIG9uU2VsZWN0OiBvblNlbGVjdEtleXMsXG4gICAgICAgIG9uRGVzZWxlY3Q6IG9uU2VsZWN0S2V5cyxcbiAgICAgICAgc2VsZWN0ZWRLZXlzOiBzZWxlY3RlZEtleXMsXG4gICAgICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lcixcbiAgICAgICAgb3BlbktleXM6IG9wZW5LZXlzLFxuICAgICAgICBvbk9wZW5DaGFuZ2U6IG9uT3BlbkNoYW5nZSxcbiAgICAgICAgaXRlbXM6IHJlbmRlckZpbHRlckl0ZW1zKHtcbiAgICAgICAgICBmaWx0ZXJzOiBjb2x1bW4uZmlsdGVycyB8fCBbXSxcbiAgICAgICAgICBmaWx0ZXJTZWFyY2g6IGZpbHRlclNlYXJjaCxcbiAgICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgICBmaWx0ZXJlZEtleXM6IGdldEZpbHRlcmVkS2V5c1N5bmMoKSxcbiAgICAgICAgICBmaWx0ZXJNdWx0aXBsZTogZmlsdGVyTXVsdGlwbGUsXG4gICAgICAgICAgc2VhcmNoVmFsdWU6IHNlYXJjaFZhbHVlXG4gICAgICAgIH0pXG4gICAgICB9KSk7XG4gICAgfTtcbiAgICB2YXIgZ2V0UmVzZXREaXNhYmxlZCA9IGZ1bmN0aW9uIGdldFJlc2V0RGlzYWJsZWQoKSB7XG4gICAgICBpZiAoZmlsdGVyUmVzZXRUb0RlZmF1bHRGaWx0ZXJlZFZhbHVlKSB7XG4gICAgICAgIHJldHVybiBpc0VxdWFsKChkZWZhdWx0RmlsdGVyZWRWYWx1ZSB8fCBbXSkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKGtleSk7XG4gICAgICAgIH0pLCBzZWxlY3RlZEtleXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNlbGVjdGVkS2V5cy5sZW5ndGggPT09IDA7XG4gICAgfTtcbiAgICBkcm9wZG93bkNvbnRlbnQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgZ2V0RmlsdGVyQ29tcG9uZW50KCksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kcm9wZG93bi1idG5zXCIpXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQnV0dG9uLCB7XG4gICAgICB0eXBlOiBcImxpbmtcIixcbiAgICAgIHNpemU6IFwic21hbGxcIixcbiAgICAgIGRpc2FibGVkOiBnZXRSZXNldERpc2FibGVkKCksXG4gICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICByZXR1cm4gb25SZXNldCgpO1xuICAgICAgfVxuICAgIH0sIGxvY2FsZS5maWx0ZXJSZXNldCksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEJ1dHRvbiwge1xuICAgICAgdHlwZTogXCJwcmltYXJ5XCIsXG4gICAgICBzaXplOiBcInNtYWxsXCIsXG4gICAgICBvbkNsaWNrOiBvbkNvbmZpcm1cbiAgICB9LCBsb2NhbGUuZmlsdGVyQ29uZmlybSkpKTtcbiAgfVxuICAvLyBXZSBzaG91bGQgbm90IGJsb2NrIGN1c3RvbWl6ZSBNZW51IHdpdGggYWRkaXRpb25hbCBwcm9wc1xuICBpZiAoY29sdW1uLmZpbHRlckRyb3Bkb3duKSB7XG4gICAgZHJvcGRvd25Db250ZW50ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoT3ZlcnJpZGVQcm92aWRlciwge1xuICAgICAgc2VsZWN0YWJsZTogdW5kZWZpbmVkXG4gICAgfSwgZHJvcGRvd25Db250ZW50KTtcbiAgfVxuICB2YXIgbWVudSA9IGZ1bmN0aW9uIG1lbnUoKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZpbHRlckRyb3Bkb3duTWVudVdyYXBwZXIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kcm9wZG93blwiKVxuICAgIH0sIGRyb3Bkb3duQ29udGVudCk7XG4gIH07XG4gIHZhciBmaWx0ZXJJY29uO1xuICBpZiAodHlwZW9mIGNvbHVtbi5maWx0ZXJJY29uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZmlsdGVySWNvbiA9IGNvbHVtbi5maWx0ZXJJY29uKGZpbHRlcmVkKTtcbiAgfSBlbHNlIGlmIChjb2x1bW4uZmlsdGVySWNvbikge1xuICAgIGZpbHRlckljb24gPSBjb2x1bW4uZmlsdGVySWNvbjtcbiAgfSBlbHNlIHtcbiAgICBmaWx0ZXJJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRmlsdGVyRmlsbGVkLCBudWxsKTtcbiAgfVxuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29sdW1uXCIpXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdCh0YWJsZVByZWZpeENscywgXCItY29sdW1uLXRpdGxlXCIpXG4gIH0sIGNoaWxkcmVuKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRHJvcGRvd24sIHtcbiAgICBkcm9wZG93blJlbmRlcjogbWVudSxcbiAgICB0cmlnZ2VyOiBbJ2NsaWNrJ10sXG4gICAgb3BlbjogbWVyZ2VkVmlzaWJsZSxcbiAgICBvbk9wZW5DaGFuZ2U6IG9uVmlzaWJsZUNoYW5nZSxcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXIsXG4gICAgcGxhY2VtZW50OiBkaXJlY3Rpb24gPT09ICdydGwnID8gJ2JvdHRvbUxlZnQnIDogJ2JvdHRvbVJpZ2h0J1xuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIHJvbGU6IFwiYnV0dG9uXCIsXG4gICAgdGFiSW5kZXg6IC0xLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXRyaWdnZXJcIiksIHtcbiAgICAgIGFjdGl2ZTogZmlsdGVyZWRcbiAgICB9KSxcbiAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICB9LCBmaWx0ZXJJY29uKSkpO1xufVxuZXhwb3J0IGRlZmF1bHQgRmlsdGVyRHJvcGRvd247IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgd2FybmluZyBmcm9tICcuLi8uLi8uLi9fdXRpbC93YXJuaW5nJztcbmltcG9ydCB7IGdldENvbHVtbktleSwgZ2V0Q29sdW1uUG9zLCByZW5kZXJDb2x1bW5UaXRsZSB9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IEZpbHRlckRyb3Bkb3duIGZyb20gJy4vRmlsdGVyRHJvcGRvd24nO1xuZnVuY3Rpb24gY29sbGVjdEZpbHRlclN0YXRlcyhjb2x1bW5zLCBpbml0LCBwb3MpIHtcbiAgdmFyIGZpbHRlclN0YXRlcyA9IFtdO1xuICAoY29sdW1ucyB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uLCBpbmRleCkge1xuICAgIHZhciBfYTtcbiAgICB2YXIgY29sdW1uUG9zID0gZ2V0Q29sdW1uUG9zKGluZGV4LCBwb3MpO1xuICAgIGlmIChjb2x1bW4uZmlsdGVycyB8fCAnZmlsdGVyRHJvcGRvd24nIGluIGNvbHVtbiB8fCAnb25GaWx0ZXInIGluIGNvbHVtbikge1xuICAgICAgaWYgKCdmaWx0ZXJlZFZhbHVlJyBpbiBjb2x1bW4pIHtcbiAgICAgICAgLy8gQ29udHJvbGxlZFxuICAgICAgICB2YXIgZmlsdGVyZWRWYWx1ZXMgPSBjb2x1bW4uZmlsdGVyZWRWYWx1ZTtcbiAgICAgICAgaWYgKCEoJ2ZpbHRlckRyb3Bkb3duJyBpbiBjb2x1bW4pKSB7XG4gICAgICAgICAgZmlsdGVyZWRWYWx1ZXMgPSAoX2EgPSBmaWx0ZXJlZFZhbHVlcyA9PT0gbnVsbCB8fCBmaWx0ZXJlZFZhbHVlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogZmlsdGVyZWRWYWx1ZXMubWFwKFN0cmluZykpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZpbHRlcmVkVmFsdWVzO1xuICAgICAgICB9XG4gICAgICAgIGZpbHRlclN0YXRlcy5wdXNoKHtcbiAgICAgICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgICAgICBrZXk6IGdldENvbHVtbktleShjb2x1bW4sIGNvbHVtblBvcyksXG4gICAgICAgICAgZmlsdGVyZWRLZXlzOiBmaWx0ZXJlZFZhbHVlcyxcbiAgICAgICAgICBmb3JjZUZpbHRlcmVkOiBjb2x1bW4uZmlsdGVyZWRcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVbmNvbnRyb2xsZWRcbiAgICAgICAgZmlsdGVyU3RhdGVzLnB1c2goe1xuICAgICAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAgICAgIGtleTogZ2V0Q29sdW1uS2V5KGNvbHVtbiwgY29sdW1uUG9zKSxcbiAgICAgICAgICBmaWx0ZXJlZEtleXM6IGluaXQgJiYgY29sdW1uLmRlZmF1bHRGaWx0ZXJlZFZhbHVlID8gY29sdW1uLmRlZmF1bHRGaWx0ZXJlZFZhbHVlIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGZvcmNlRmlsdGVyZWQ6IGNvbHVtbi5maWx0ZXJlZFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCdjaGlsZHJlbicgaW4gY29sdW1uKSB7XG4gICAgICBmaWx0ZXJTdGF0ZXMgPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGZpbHRlclN0YXRlcyksIF90b0NvbnN1bWFibGVBcnJheShjb2xsZWN0RmlsdGVyU3RhdGVzKGNvbHVtbi5jaGlsZHJlbiwgaW5pdCwgY29sdW1uUG9zKSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBmaWx0ZXJTdGF0ZXM7XG59XG5mdW5jdGlvbiBpbmplY3RGaWx0ZXIocHJlZml4Q2xzLCBkcm9wZG93blByZWZpeENscywgY29sdW1ucywgZmlsdGVyU3RhdGVzLCB0cmlnZ2VyRmlsdGVyLCBnZXRQb3B1cENvbnRhaW5lciwgbG9jYWxlLCBwb3MpIHtcbiAgcmV0dXJuIGNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4sIGluZGV4KSB7XG4gICAgdmFyIGNvbHVtblBvcyA9IGdldENvbHVtblBvcyhpbmRleCwgcG9zKTtcbiAgICB2YXIgX2NvbHVtbiRmaWx0ZXJNdWx0aXBsID0gY29sdW1uLmZpbHRlck11bHRpcGxlLFxuICAgICAgZmlsdGVyTXVsdGlwbGUgPSBfY29sdW1uJGZpbHRlck11bHRpcGwgPT09IHZvaWQgMCA/IHRydWUgOiBfY29sdW1uJGZpbHRlck11bHRpcGwsXG4gICAgICBmaWx0ZXJNb2RlID0gY29sdW1uLmZpbHRlck1vZGUsXG4gICAgICBmaWx0ZXJTZWFyY2ggPSBjb2x1bW4uZmlsdGVyU2VhcmNoO1xuICAgIHZhciBuZXdDb2x1bW4gPSBjb2x1bW47XG4gICAgaWYgKG5ld0NvbHVtbi5maWx0ZXJzIHx8IG5ld0NvbHVtbi5maWx0ZXJEcm9wZG93bikge1xuICAgICAgdmFyIGNvbHVtbktleSA9IGdldENvbHVtbktleShuZXdDb2x1bW4sIGNvbHVtblBvcyk7XG4gICAgICB2YXIgZmlsdGVyU3RhdGUgPSBmaWx0ZXJTdGF0ZXMuZmluZChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIga2V5ID0gX3JlZi5rZXk7XG4gICAgICAgIHJldHVybiBjb2x1bW5LZXkgPT09IGtleTtcbiAgICAgIH0pO1xuICAgICAgbmV3Q29sdW1uID0gX2V4dGVuZHMoX2V4dGVuZHMoe30sIG5ld0NvbHVtbiksIHtcbiAgICAgICAgdGl0bGU6IGZ1bmN0aW9uIHRpdGxlKHJlbmRlclByb3BzKSB7XG4gICAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZpbHRlckRyb3Bkb3duLCB7XG4gICAgICAgICAgICB0YWJsZVByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgICAgICAgcHJlZml4Q2xzOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWZpbHRlclwiKSxcbiAgICAgICAgICAgIGRyb3Bkb3duUHJlZml4Q2xzOiBkcm9wZG93blByZWZpeENscyxcbiAgICAgICAgICAgIGNvbHVtbjogbmV3Q29sdW1uLFxuICAgICAgICAgICAgY29sdW1uS2V5OiBjb2x1bW5LZXksXG4gICAgICAgICAgICBmaWx0ZXJTdGF0ZTogZmlsdGVyU3RhdGUsXG4gICAgICAgICAgICBmaWx0ZXJNdWx0aXBsZTogZmlsdGVyTXVsdGlwbGUsXG4gICAgICAgICAgICBmaWx0ZXJNb2RlOiBmaWx0ZXJNb2RlLFxuICAgICAgICAgICAgZmlsdGVyU2VhcmNoOiBmaWx0ZXJTZWFyY2gsXG4gICAgICAgICAgICB0cmlnZ2VyRmlsdGVyOiB0cmlnZ2VyRmlsdGVyLFxuICAgICAgICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICAgICAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXJcbiAgICAgICAgICB9LCByZW5kZXJDb2x1bW5UaXRsZShjb2x1bW4udGl0bGUsIHJlbmRlclByb3BzKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoJ2NoaWxkcmVuJyBpbiBuZXdDb2x1bW4pIHtcbiAgICAgIG5ld0NvbHVtbiA9IF9leHRlbmRzKF9leHRlbmRzKHt9LCBuZXdDb2x1bW4pLCB7XG4gICAgICAgIGNoaWxkcmVuOiBpbmplY3RGaWx0ZXIocHJlZml4Q2xzLCBkcm9wZG93blByZWZpeENscywgbmV3Q29sdW1uLmNoaWxkcmVuLCBmaWx0ZXJTdGF0ZXMsIHRyaWdnZXJGaWx0ZXIsIGdldFBvcHVwQ29udGFpbmVyLCBsb2NhbGUsIGNvbHVtblBvcylcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbmV3Q29sdW1uO1xuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuS2V5cyhmaWx0ZXJzKSB7XG4gIHZhciBrZXlzID0gW107XG4gIChmaWx0ZXJzIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMikge1xuICAgIHZhciB2YWx1ZSA9IF9yZWYyLnZhbHVlLFxuICAgICAgY2hpbGRyZW4gPSBfcmVmMi5jaGlsZHJlbjtcbiAgICBrZXlzLnB1c2godmFsdWUpO1xuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAga2V5cyA9IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoa2V5cyksIF90b0NvbnN1bWFibGVBcnJheShmbGF0dGVuS2V5cyhjaGlsZHJlbikpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4ga2V5cztcbn1cbmZ1bmN0aW9uIGdlbmVyYXRlRmlsdGVySW5mbyhmaWx0ZXJTdGF0ZXMpIHtcbiAgdmFyIGN1cnJlbnRGaWx0ZXJzID0ge307XG4gIGZpbHRlclN0YXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMykge1xuICAgIHZhciBrZXkgPSBfcmVmMy5rZXksXG4gICAgICBmaWx0ZXJlZEtleXMgPSBfcmVmMy5maWx0ZXJlZEtleXMsXG4gICAgICBjb2x1bW4gPSBfcmVmMy5jb2x1bW47XG4gICAgdmFyIGZpbHRlcnMgPSBjb2x1bW4uZmlsdGVycyxcbiAgICAgIGZpbHRlckRyb3Bkb3duID0gY29sdW1uLmZpbHRlckRyb3Bkb3duO1xuICAgIGlmIChmaWx0ZXJEcm9wZG93bikge1xuICAgICAgY3VycmVudEZpbHRlcnNba2V5XSA9IGZpbHRlcmVkS2V5cyB8fCBudWxsO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXJlZEtleXMpKSB7XG4gICAgICB2YXIga2V5cyA9IGZsYXR0ZW5LZXlzKGZpbHRlcnMpO1xuICAgICAgY3VycmVudEZpbHRlcnNba2V5XSA9IGtleXMuZmlsdGVyKGZ1bmN0aW9uIChvcmlnaW5LZXkpIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkS2V5cy5pbmNsdWRlcyhTdHJpbmcob3JpZ2luS2V5KSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudEZpbHRlcnNba2V5XSA9IG51bGw7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGN1cnJlbnRGaWx0ZXJzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbHRlckRhdGEoZGF0YSwgZmlsdGVyU3RhdGVzKSB7XG4gIHJldHVybiBmaWx0ZXJTdGF0ZXMucmVkdWNlKGZ1bmN0aW9uIChjdXJyZW50RGF0YSwgZmlsdGVyU3RhdGUpIHtcbiAgICB2YXIgX2ZpbHRlclN0YXRlJGNvbHVtbiA9IGZpbHRlclN0YXRlLmNvbHVtbixcbiAgICAgIG9uRmlsdGVyID0gX2ZpbHRlclN0YXRlJGNvbHVtbi5vbkZpbHRlcixcbiAgICAgIGZpbHRlcnMgPSBfZmlsdGVyU3RhdGUkY29sdW1uLmZpbHRlcnMsXG4gICAgICBmaWx0ZXJlZEtleXMgPSBmaWx0ZXJTdGF0ZS5maWx0ZXJlZEtleXM7XG4gICAgaWYgKG9uRmlsdGVyICYmIGZpbHRlcmVkS2V5cyAmJiBmaWx0ZXJlZEtleXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gY3VycmVudERhdGEuZmlsdGVyKGZ1bmN0aW9uIChyZWNvcmQpIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkS2V5cy5zb21lKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICB2YXIga2V5cyA9IGZsYXR0ZW5LZXlzKGZpbHRlcnMpO1xuICAgICAgICAgIHZhciBrZXlJbmRleCA9IGtleXMuZmluZEluZGV4KGZ1bmN0aW9uIChrKSB7XG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nKGspID09PSBTdHJpbmcoa2V5KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YXIgcmVhbEtleSA9IGtleUluZGV4ICE9PSAtMSA/IGtleXNba2V5SW5kZXhdIDoga2V5O1xuICAgICAgICAgIHJldHVybiBvbkZpbHRlcihyZWFsS2V5LCByZWNvcmQpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudERhdGE7XG4gIH0sIGRhdGEpO1xufVxuZnVuY3Rpb24gdXNlRmlsdGVyKF9yZWY0KSB7XG4gIHZhciBwcmVmaXhDbHMgPSBfcmVmNC5wcmVmaXhDbHMsXG4gICAgZHJvcGRvd25QcmVmaXhDbHMgPSBfcmVmNC5kcm9wZG93blByZWZpeENscyxcbiAgICBtZXJnZWRDb2x1bW5zID0gX3JlZjQubWVyZ2VkQ29sdW1ucyxcbiAgICBvbkZpbHRlckNoYW5nZSA9IF9yZWY0Lm9uRmlsdGVyQ2hhbmdlLFxuICAgIGdldFBvcHVwQ29udGFpbmVyID0gX3JlZjQuZ2V0UG9wdXBDb250YWluZXIsXG4gICAgdGFibGVMb2NhbGUgPSBfcmVmNC5sb2NhbGU7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gY29sbGVjdEZpbHRlclN0YXRlcyhtZXJnZWRDb2x1bW5zLCB0cnVlKTtcbiAgICB9KSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBmaWx0ZXJTdGF0ZXMgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldEZpbHRlclN0YXRlcyA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBtZXJnZWRGaWx0ZXJTdGF0ZXMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY29sbGVjdGVkU3RhdGVzID0gY29sbGVjdEZpbHRlclN0YXRlcyhtZXJnZWRDb2x1bW5zLCBmYWxzZSk7XG4gICAgdmFyIGZpbHRlcmVkS2V5c0lzQWxsTm90Q29udHJvbGxlZCA9IHRydWU7XG4gICAgdmFyIGZpbHRlcmVkS2V5c0lzQWxsQ29udHJvbGxlZCA9IHRydWU7XG4gICAgY29sbGVjdGVkU3RhdGVzLmZvckVhY2goZnVuY3Rpb24gKF9yZWY1KSB7XG4gICAgICB2YXIgZmlsdGVyZWRLZXlzID0gX3JlZjUuZmlsdGVyZWRLZXlzO1xuICAgICAgaWYgKGZpbHRlcmVkS2V5cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZpbHRlcmVkS2V5c0lzQWxsTm90Q29udHJvbGxlZCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmlsdGVyZWRLZXlzSXNBbGxDb250cm9sbGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gUmV0dXJuIGlmIG5vdCBjb250cm9sbGVkXG4gICAgaWYgKGZpbHRlcmVkS2V5c0lzQWxsTm90Q29udHJvbGxlZCkge1xuICAgICAgcmV0dXJuIGZpbHRlclN0YXRlcztcbiAgICB9XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhmaWx0ZXJlZEtleXNJc0FsbENvbnRyb2xsZWQsICdUYWJsZScsICdDb2x1bW5zIHNob3VsZCBhbGwgY29udGFpbiBgZmlsdGVyZWRWYWx1ZWAgb3Igbm90IGNvbnRhaW4gYGZpbHRlcmVkVmFsdWVgLicpIDogdm9pZCAwO1xuICAgIHJldHVybiBjb2xsZWN0ZWRTdGF0ZXM7XG4gIH0sIFttZXJnZWRDb2x1bW5zLCBmaWx0ZXJTdGF0ZXNdKTtcbiAgdmFyIGZpbHRlcnMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZ2VuZXJhdGVGaWx0ZXJJbmZvKG1lcmdlZEZpbHRlclN0YXRlcyk7XG4gIH0sIFttZXJnZWRGaWx0ZXJTdGF0ZXNdKTtcbiAgdmFyIHRyaWdnZXJGaWx0ZXIgPSBmdW5jdGlvbiB0cmlnZ2VyRmlsdGVyKGZpbHRlclN0YXRlKSB7XG4gICAgdmFyIG5ld0ZpbHRlclN0YXRlcyA9IG1lcmdlZEZpbHRlclN0YXRlcy5maWx0ZXIoZnVuY3Rpb24gKF9yZWY2KSB7XG4gICAgICB2YXIga2V5ID0gX3JlZjYua2V5O1xuICAgICAgcmV0dXJuIGtleSAhPT0gZmlsdGVyU3RhdGUua2V5O1xuICAgIH0pO1xuICAgIG5ld0ZpbHRlclN0YXRlcy5wdXNoKGZpbHRlclN0YXRlKTtcbiAgICBzZXRGaWx0ZXJTdGF0ZXMobmV3RmlsdGVyU3RhdGVzKTtcbiAgICBvbkZpbHRlckNoYW5nZShnZW5lcmF0ZUZpbHRlckluZm8obmV3RmlsdGVyU3RhdGVzKSwgbmV3RmlsdGVyU3RhdGVzKTtcbiAgfTtcbiAgdmFyIHRyYW5zZm9ybUNvbHVtbnMgPSBmdW5jdGlvbiB0cmFuc2Zvcm1Db2x1bW5zKGlubmVyQ29sdW1ucykge1xuICAgIHJldHVybiBpbmplY3RGaWx0ZXIocHJlZml4Q2xzLCBkcm9wZG93blByZWZpeENscywgaW5uZXJDb2x1bW5zLCBtZXJnZWRGaWx0ZXJTdGF0ZXMsIHRyaWdnZXJGaWx0ZXIsIGdldFBvcHVwQ29udGFpbmVyLCB0YWJsZUxvY2FsZSk7XG4gIH07XG4gIHJldHVybiBbdHJhbnNmb3JtQ29sdW1ucywgbWVyZ2VkRmlsdGVyU3RhdGVzLCBmaWx0ZXJzXTtcbn1cbmV4cG9ydCBkZWZhdWx0IHVzZUZpbHRlcjsiLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VMYXp5S1ZNYXAoZGF0YSwgY2hpbGRyZW5Db2x1bW5OYW1lLCBnZXRSb3dLZXkpIHtcbiAgdmFyIG1hcENhY2hlUmVmID0gUmVhY3QudXNlUmVmKHt9KTtcbiAgZnVuY3Rpb24gZ2V0UmVjb3JkQnlLZXkoa2V5KSB7XG4gICAgaWYgKCFtYXBDYWNoZVJlZi5jdXJyZW50IHx8IG1hcENhY2hlUmVmLmN1cnJlbnQuZGF0YSAhPT0gZGF0YSB8fCBtYXBDYWNoZVJlZi5jdXJyZW50LmNoaWxkcmVuQ29sdW1uTmFtZSAhPT0gY2hpbGRyZW5Db2x1bW5OYW1lIHx8IG1hcENhY2hlUmVmLmN1cnJlbnQuZ2V0Um93S2V5ICE9PSBnZXRSb3dLZXkpIHtcbiAgICAgIHZhciBrdk1hcCA9IG5ldyBNYXAoKTtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWlubmVyLWRlY2xhcmF0aW9ucyAqL1xuICAgICAgZnVuY3Rpb24gZGlnKHJlY29yZHMpIHtcbiAgICAgICAgcmVjb3Jkcy5mb3JFYWNoKGZ1bmN0aW9uIChyZWNvcmQsIGluZGV4KSB7XG4gICAgICAgICAgdmFyIHJvd0tleSA9IGdldFJvd0tleShyZWNvcmQsIGluZGV4KTtcbiAgICAgICAgICBrdk1hcC5zZXQocm93S2V5LCByZWNvcmQpO1xuICAgICAgICAgIGlmIChyZWNvcmQgJiYgX3R5cGVvZihyZWNvcmQpID09PSAnb2JqZWN0JyAmJiBjaGlsZHJlbkNvbHVtbk5hbWUgaW4gcmVjb3JkKSB7XG4gICAgICAgICAgICBkaWcocmVjb3JkW2NoaWxkcmVuQ29sdW1uTmFtZV0gfHwgW10pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlICovXG4gICAgICBkaWcoZGF0YSk7XG4gICAgICBtYXBDYWNoZVJlZi5jdXJyZW50ID0ge1xuICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICBjaGlsZHJlbkNvbHVtbk5hbWU6IGNoaWxkcmVuQ29sdW1uTmFtZSxcbiAgICAgICAga3ZNYXA6IGt2TWFwLFxuICAgICAgICBnZXRSb3dLZXk6IGdldFJvd0tleVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcENhY2hlUmVmLmN1cnJlbnQua3ZNYXAuZ2V0KGtleSk7XG4gIH1cbiAgcmV0dXJuIFtnZXRSZWNvcmRCeUtleV07XG59IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmV4cG9ydCB2YXIgREVGQVVMVF9QQUdFX1NJWkUgPSAxMDtcbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWdpbmF0aW9uUGFyYW0ocGFnaW5hdGlvbiwgbWVyZ2VkUGFnaW5hdGlvbikge1xuICB2YXIgcGFyYW0gPSB7XG4gICAgY3VycmVudDogbWVyZ2VkUGFnaW5hdGlvbi5jdXJyZW50LFxuICAgIHBhZ2VTaXplOiBtZXJnZWRQYWdpbmF0aW9uLnBhZ2VTaXplXG4gIH07XG4gIHZhciBwYWdpbmF0aW9uT2JqID0gcGFnaW5hdGlvbiAmJiBfdHlwZW9mKHBhZ2luYXRpb24pID09PSAnb2JqZWN0JyA/IHBhZ2luYXRpb24gOiB7fTtcbiAgT2JqZWN0LmtleXMocGFnaW5hdGlvbk9iaikuZm9yRWFjaChmdW5jdGlvbiAocGFnZVByb3ApIHtcbiAgICB2YXIgdmFsdWUgPSBtZXJnZWRQYWdpbmF0aW9uW3BhZ2VQcm9wXTtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwYXJhbVtwYWdlUHJvcF0gPSB2YWx1ZTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcGFyYW07XG59XG5mdW5jdGlvbiBleHRlbmRzT2JqZWN0KCkge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBsaXN0ID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGxpc3RbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cbiAgbGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChvYmopIHtcbiAgICBpZiAob2JqKSB7XG4gICAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgdmFsID0gb2JqW2tleV07XG4gICAgICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlUGFnaW5hdGlvbih0b3RhbCwgcGFnaW5hdGlvbiwgb25DaGFuZ2UpIHtcbiAgdmFyIF9hID0gcGFnaW5hdGlvbiAmJiBfdHlwZW9mKHBhZ2luYXRpb24pID09PSAnb2JqZWN0JyA/IHBhZ2luYXRpb24gOiB7fSxcbiAgICBfYSR0b3RhbCA9IF9hLnRvdGFsLFxuICAgIHBhZ2luYXRpb25Ub3RhbCA9IF9hJHRvdGFsID09PSB2b2lkIDAgPyAwIDogX2EkdG90YWwsXG4gICAgcGFnaW5hdGlvbk9iaiA9IF9fcmVzdChfYSwgW1widG90YWxcIl0pO1xuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3VycmVudDogJ2RlZmF1bHRDdXJyZW50JyBpbiBwYWdpbmF0aW9uT2JqID8gcGFnaW5hdGlvbk9iai5kZWZhdWx0Q3VycmVudCA6IDEsXG4gICAgICAgIHBhZ2VTaXplOiAnZGVmYXVsdFBhZ2VTaXplJyBpbiBwYWdpbmF0aW9uT2JqID8gcGFnaW5hdGlvbk9iai5kZWZhdWx0UGFnZVNpemUgOiBERUZBVUxUX1BBR0VfU0laRVxuICAgICAgfTtcbiAgICB9KSxcbiAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICBpbm5lclBhZ2luYXRpb24gPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldElubmVyUGFnaW5hdGlvbiA9IF91c2VTdGF0ZTJbMV07XG4gIC8vID09PT09PT09PT09PSBCYXNpYyBQYWdpbmF0aW9uIENvbmZpZyA9PT09PT09PT09PT1cbiAgdmFyIG1lcmdlZFBhZ2luYXRpb24gPSBleHRlbmRzT2JqZWN0KGlubmVyUGFnaW5hdGlvbiwgcGFnaW5hdGlvbk9iaiwge1xuICAgIHRvdGFsOiBwYWdpbmF0aW9uVG90YWwgPiAwID8gcGFnaW5hdGlvblRvdGFsIDogdG90YWxcbiAgfSk7XG4gIC8vIFJlc2V0IGBjdXJyZW50YCBpZiBkYXRhIGxlbmd0aCBvciBwYWdlU2l6ZSBjaGFuZ2VkXG4gIHZhciBtYXhQYWdlID0gTWF0aC5jZWlsKChwYWdpbmF0aW9uVG90YWwgfHwgdG90YWwpIC8gbWVyZ2VkUGFnaW5hdGlvbi5wYWdlU2l6ZSk7XG4gIGlmIChtZXJnZWRQYWdpbmF0aW9uLmN1cnJlbnQgPiBtYXhQYWdlKSB7XG4gICAgLy8gUHJldmVudCBhIG1heGltdW0gcGFnZSBjb3VudCBvZiAwXG4gICAgbWVyZ2VkUGFnaW5hdGlvbi5jdXJyZW50ID0gbWF4UGFnZSB8fCAxO1xuICB9XG4gIHZhciByZWZyZXNoUGFnaW5hdGlvbiA9IGZ1bmN0aW9uIHJlZnJlc2hQYWdpbmF0aW9uKGN1cnJlbnQsIHBhZ2VTaXplKSB7XG4gICAgc2V0SW5uZXJQYWdpbmF0aW9uKHtcbiAgICAgIGN1cnJlbnQ6IGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudCAhPT0gdm9pZCAwID8gY3VycmVudCA6IDEsXG4gICAgICBwYWdlU2l6ZTogcGFnZVNpemUgfHwgbWVyZ2VkUGFnaW5hdGlvbi5wYWdlU2l6ZVxuICAgIH0pO1xuICB9O1xuICB2YXIgb25JbnRlcm5hbENoYW5nZSA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxDaGFuZ2UoY3VycmVudCwgcGFnZVNpemUpIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKHBhZ2luYXRpb24pIHtcbiAgICAgIChfYSA9IHBhZ2luYXRpb24ub25DaGFuZ2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKHBhZ2luYXRpb24sIGN1cnJlbnQsIHBhZ2VTaXplKTtcbiAgICB9XG4gICAgcmVmcmVzaFBhZ2luYXRpb24oY3VycmVudCwgcGFnZVNpemUpO1xuICAgIG9uQ2hhbmdlKGN1cnJlbnQsIHBhZ2VTaXplIHx8IChtZXJnZWRQYWdpbmF0aW9uID09PSBudWxsIHx8IG1lcmdlZFBhZ2luYXRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1lcmdlZFBhZ2luYXRpb24ucGFnZVNpemUpKTtcbiAgfTtcbiAgaWYgKHBhZ2luYXRpb24gPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIFt7fSwgZnVuY3Rpb24gKCkge31dO1xuICB9XG4gIHJldHVybiBbX2V4dGVuZHMoX2V4dGVuZHMoe30sIG1lcmdlZFBhZ2luYXRpb24pLCB7XG4gICAgb25DaGFuZ2U6IG9uSW50ZXJuYWxDaGFuZ2VcbiAgfSksIHJlZnJlc2hQYWdpbmF0aW9uXTtcbn0iLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF90b0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0FycmF5XCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBEb3duT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Rvd25PdXRsaW5lZFwiO1xuaW1wb3J0IHsgSU5URVJOQUxfQ09MX0RFRklORSB9IGZyb20gJ3JjLXRhYmxlJztcbmltcG9ydCB7IGFyckFkZCwgYXJyRGVsIH0gZnJvbSBcInJjLXRyZWUvZXMvdXRpbFwiO1xuaW1wb3J0IHsgY29uZHVjdENoZWNrIH0gZnJvbSBcInJjLXRyZWUvZXMvdXRpbHMvY29uZHVjdFV0aWxcIjtcbmltcG9ydCB7IGNvbnZlcnREYXRhVG9FbnRpdGllcyB9IGZyb20gXCJyYy10cmVlL2VzL3V0aWxzL3RyZWVVdGlsXCI7XG5pbXBvcnQgdXNlTWVyZ2VkU3RhdGUgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTWVyZ2VkU3RhdGVcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VNZW1vLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBDaGVja2JveCBmcm9tICcuLi8uLi9jaGVja2JveCc7XG5pbXBvcnQgRHJvcGRvd24gZnJvbSAnLi4vLi4vZHJvcGRvd24nO1xuaW1wb3J0IFJhZGlvIGZyb20gJy4uLy4uL3JhZGlvJztcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4uLy4uL191dGlsL3dhcm5pbmcnO1xuLy8gVE9ETzogd2FybmluZyBpZiB1c2UgYWpheCEhIVxuZXhwb3J0IHZhciBTRUxFQ1RJT05fQ09MVU1OID0ge307XG5leHBvcnQgdmFyIFNFTEVDVElPTl9BTEwgPSAnU0VMRUNUX0FMTCc7XG5leHBvcnQgdmFyIFNFTEVDVElPTl9JTlZFUlQgPSAnU0VMRUNUX0lOVkVSVCc7XG5leHBvcnQgdmFyIFNFTEVDVElPTl9OT05FID0gJ1NFTEVDVF9OT05FJztcbnZhciBFTVBUWV9MSVNUID0gW107XG5mdW5jdGlvbiBmbGF0dGVuRGF0YShkYXRhLCBjaGlsZHJlbkNvbHVtbk5hbWUpIHtcbiAgdmFyIGxpc3QgPSBbXTtcbiAgKGRhdGEgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKHJlY29yZCkge1xuICAgIGxpc3QucHVzaChyZWNvcmQpO1xuICAgIGlmIChyZWNvcmQgJiYgX3R5cGVvZihyZWNvcmQpID09PSAnb2JqZWN0JyAmJiBjaGlsZHJlbkNvbHVtbk5hbWUgaW4gcmVjb3JkKSB7XG4gICAgICBsaXN0ID0gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShsaXN0KSwgX3RvQ29uc3VtYWJsZUFycmF5KGZsYXR0ZW5EYXRhKHJlY29yZFtjaGlsZHJlbkNvbHVtbk5hbWVdLCBjaGlsZHJlbkNvbHVtbk5hbWUpKSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGxpc3Q7XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VTZWxlY3Rpb24ocm93U2VsZWN0aW9uLCBjb25maWcpIHtcbiAgdmFyIF9yZWYgPSByb3dTZWxlY3Rpb24gfHwge30sXG4gICAgcHJlc2VydmVTZWxlY3RlZFJvd0tleXMgPSBfcmVmLnByZXNlcnZlU2VsZWN0ZWRSb3dLZXlzLFxuICAgIHNlbGVjdGVkUm93S2V5cyA9IF9yZWYuc2VsZWN0ZWRSb3dLZXlzLFxuICAgIGRlZmF1bHRTZWxlY3RlZFJvd0tleXMgPSBfcmVmLmRlZmF1bHRTZWxlY3RlZFJvd0tleXMsXG4gICAgZ2V0Q2hlY2tib3hQcm9wcyA9IF9yZWYuZ2V0Q2hlY2tib3hQcm9wcyxcbiAgICBvblNlbGVjdGlvbkNoYW5nZSA9IF9yZWYub25DaGFuZ2UsXG4gICAgb25TZWxlY3QgPSBfcmVmLm9uU2VsZWN0LFxuICAgIG9uU2VsZWN0QWxsID0gX3JlZi5vblNlbGVjdEFsbCxcbiAgICBvblNlbGVjdEludmVydCA9IF9yZWYub25TZWxlY3RJbnZlcnQsXG4gICAgb25TZWxlY3ROb25lID0gX3JlZi5vblNlbGVjdE5vbmUsXG4gICAgb25TZWxlY3RNdWx0aXBsZSA9IF9yZWYub25TZWxlY3RNdWx0aXBsZSxcbiAgICBzZWxlY3Rpb25Db2xXaWR0aCA9IF9yZWYuY29sdW1uV2lkdGgsXG4gICAgc2VsZWN0aW9uVHlwZSA9IF9yZWYudHlwZSxcbiAgICBzZWxlY3Rpb25zID0gX3JlZi5zZWxlY3Rpb25zLFxuICAgIGZpeGVkID0gX3JlZi5maXhlZCxcbiAgICBjdXN0b21pemVSZW5kZXJDZWxsID0gX3JlZi5yZW5kZXJDZWxsLFxuICAgIGhpZGVTZWxlY3RBbGwgPSBfcmVmLmhpZGVTZWxlY3RBbGwsXG4gICAgX3JlZiRjaGVja1N0cmljdGx5ID0gX3JlZi5jaGVja1N0cmljdGx5LFxuICAgIGNoZWNrU3RyaWN0bHkgPSBfcmVmJGNoZWNrU3RyaWN0bHkgPT09IHZvaWQgMCA/IHRydWUgOiBfcmVmJGNoZWNrU3RyaWN0bHk7XG4gIHZhciBwcmVmaXhDbHMgPSBjb25maWcucHJlZml4Q2xzLFxuICAgIGRhdGEgPSBjb25maWcuZGF0YSxcbiAgICBwYWdlRGF0YSA9IGNvbmZpZy5wYWdlRGF0YSxcbiAgICBnZXRSZWNvcmRCeUtleSA9IGNvbmZpZy5nZXRSZWNvcmRCeUtleSxcbiAgICBnZXRSb3dLZXkgPSBjb25maWcuZ2V0Um93S2V5LFxuICAgIGV4cGFuZFR5cGUgPSBjb25maWcuZXhwYW5kVHlwZSxcbiAgICBjaGlsZHJlbkNvbHVtbk5hbWUgPSBjb25maWcuY2hpbGRyZW5Db2x1bW5OYW1lLFxuICAgIHRhYmxlTG9jYWxlID0gY29uZmlnLmxvY2FsZSxcbiAgICBnZXRQb3B1cENvbnRhaW5lciA9IGNvbmZpZy5nZXRQb3B1cENvbnRhaW5lcjtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBLZXlzID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZSA9IHVzZU1lcmdlZFN0YXRlKHNlbGVjdGVkUm93S2V5cyB8fCBkZWZhdWx0U2VsZWN0ZWRSb3dLZXlzIHx8IEVNUFRZX0xJU1QsIHtcbiAgICAgIHZhbHVlOiBzZWxlY3RlZFJvd0tleXNcbiAgICB9KSxcbiAgICBfdXNlTWVyZ2VkU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZU1lcmdlZFN0YXRlLCAyKSxcbiAgICBtZXJnZWRTZWxlY3RlZEtleXMgPSBfdXNlTWVyZ2VkU3RhdGUyWzBdLFxuICAgIHNldE1lcmdlZFNlbGVjdGVkS2V5cyA9IF91c2VNZXJnZWRTdGF0ZTJbMV07XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBDYWNoZXMgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBwcmVzZXJ2ZVJlY29yZHNSZWYgPSBSZWFjdC51c2VSZWYobmV3IE1hcCgpKTtcbiAgdmFyIHVwZGF0ZVByZXNlcnZlUmVjb3Jkc0NhY2hlID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKGtleXMpIHtcbiAgICBpZiAocHJlc2VydmVTZWxlY3RlZFJvd0tleXMpIHtcbiAgICAgIHZhciBuZXdDYWNoZSA9IG5ldyBNYXAoKTtcbiAgICAgIC8vIEtlZXAga2V5IGlmIG1hcmsgYXMgcHJlc2VydmVTZWxlY3RlZFJvd0tleXNcbiAgICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciByZWNvcmQgPSBnZXRSZWNvcmRCeUtleShrZXkpO1xuICAgICAgICBpZiAoIXJlY29yZCAmJiBwcmVzZXJ2ZVJlY29yZHNSZWYuY3VycmVudC5oYXMoa2V5KSkge1xuICAgICAgICAgIHJlY29yZCA9IHByZXNlcnZlUmVjb3Jkc1JlZi5jdXJyZW50LmdldChrZXkpO1xuICAgICAgICB9XG4gICAgICAgIG5ld0NhY2hlLnNldChrZXksIHJlY29yZCk7XG4gICAgICB9KTtcbiAgICAgIC8vIFJlZnJlc2ggdG8gbmV3IGNhY2hlXG4gICAgICBwcmVzZXJ2ZVJlY29yZHNSZWYuY3VycmVudCA9IG5ld0NhY2hlO1xuICAgIH1cbiAgfSwgW2dldFJlY29yZEJ5S2V5LCBwcmVzZXJ2ZVNlbGVjdGVkUm93S2V5c10pO1xuICAvLyBVcGRhdGUgY2FjaGUgd2l0aCBzZWxlY3RlZEtleXNcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB1cGRhdGVQcmVzZXJ2ZVJlY29yZHNDYWNoZShtZXJnZWRTZWxlY3RlZEtleXMpO1xuICB9LCBbbWVyZ2VkU2VsZWN0ZWRLZXlzXSk7XG4gIHZhciBfdXNlTWVtbyA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGNoZWNrU3RyaWN0bHkgPyB7XG4gICAgICAgIGtleUVudGl0aWVzOiBudWxsXG4gICAgICB9IDogY29udmVydERhdGFUb0VudGl0aWVzKGRhdGEsIHtcbiAgICAgICAgZXh0ZXJuYWxHZXRLZXk6IGdldFJvd0tleSxcbiAgICAgICAgY2hpbGRyZW5Qcm9wTmFtZTogY2hpbGRyZW5Db2x1bW5OYW1lXG4gICAgICB9KTtcbiAgICB9LCBbZGF0YSwgZ2V0Um93S2V5LCBjaGVja1N0cmljdGx5LCBjaGlsZHJlbkNvbHVtbk5hbWVdKSxcbiAgICBrZXlFbnRpdGllcyA9IF91c2VNZW1vLmtleUVudGl0aWVzO1xuICAvLyBHZXQgZmxhdHRlbiBkYXRhXG4gIHZhciBmbGF0dGVkRGF0YSA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmbGF0dGVuRGF0YShwYWdlRGF0YSwgY2hpbGRyZW5Db2x1bW5OYW1lKTtcbiAgfSwgW3BhZ2VEYXRhLCBjaGlsZHJlbkNvbHVtbk5hbWVdKTtcbiAgLy8gR2V0IGFsbCBjaGVja2JveCBwcm9wc1xuICB2YXIgY2hlY2tib3hQcm9wc01hcCA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBtYXAgPSBuZXcgTWFwKCk7XG4gICAgZmxhdHRlZERhdGEuZm9yRWFjaChmdW5jdGlvbiAocmVjb3JkLCBpbmRleCkge1xuICAgICAgdmFyIGtleSA9IGdldFJvd0tleShyZWNvcmQsIGluZGV4KTtcbiAgICAgIHZhciBjaGVja2JveFByb3BzID0gKGdldENoZWNrYm94UHJvcHMgPyBnZXRDaGVja2JveFByb3BzKHJlY29yZCkgOiBudWxsKSB8fCB7fTtcbiAgICAgIG1hcC5zZXQoa2V5LCBjaGVja2JveFByb3BzKTtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoISgnY2hlY2tlZCcgaW4gY2hlY2tib3hQcm9wcyB8fCAnZGVmYXVsdENoZWNrZWQnIGluIGNoZWNrYm94UHJvcHMpLCAnVGFibGUnLCAnRG8gbm90IHNldCBgY2hlY2tlZGAgb3IgYGRlZmF1bHRDaGVja2VkYCBpbiBgZ2V0Q2hlY2tib3hQcm9wc2AuIFBsZWFzZSB1c2UgYHNlbGVjdGVkUm93S2V5c2AgaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgICB9KTtcbiAgICByZXR1cm4gbWFwO1xuICB9LCBbZmxhdHRlZERhdGEsIGdldFJvd0tleSwgZ2V0Q2hlY2tib3hQcm9wc10pO1xuICB2YXIgaXNDaGVja2JveERpc2FibGVkID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKHIpIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuICEhKChfYSA9IGNoZWNrYm94UHJvcHNNYXAuZ2V0KGdldFJvd0tleShyKSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kaXNhYmxlZCk7XG4gIH0sIFtjaGVja2JveFByb3BzTWFwLCBnZXRSb3dLZXldKTtcbiAgdmFyIF91c2VNZW1vMiA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGNoZWNrU3RyaWN0bHkpIHtcbiAgICAgICAgcmV0dXJuIFttZXJnZWRTZWxlY3RlZEtleXMgfHwgW10sIFtdXTtcbiAgICAgIH1cbiAgICAgIHZhciBfY29uZHVjdENoZWNrID0gY29uZHVjdENoZWNrKG1lcmdlZFNlbGVjdGVkS2V5cywgdHJ1ZSwga2V5RW50aXRpZXMsIGlzQ2hlY2tib3hEaXNhYmxlZCksXG4gICAgICAgIGNoZWNrZWRLZXlzID0gX2NvbmR1Y3RDaGVjay5jaGVja2VkS2V5cyxcbiAgICAgICAgaGFsZkNoZWNrZWRLZXlzID0gX2NvbmR1Y3RDaGVjay5oYWxmQ2hlY2tlZEtleXM7XG4gICAgICByZXR1cm4gW2NoZWNrZWRLZXlzIHx8IFtdLCBoYWxmQ2hlY2tlZEtleXNdO1xuICAgIH0sIFttZXJnZWRTZWxlY3RlZEtleXMsIGNoZWNrU3RyaWN0bHksIGtleUVudGl0aWVzLCBpc0NoZWNrYm94RGlzYWJsZWRdKSxcbiAgICBfdXNlTWVtbzMgPSBfc2xpY2VkVG9BcnJheShfdXNlTWVtbzIsIDIpLFxuICAgIGRlcml2ZWRTZWxlY3RlZEtleXMgPSBfdXNlTWVtbzNbMF0sXG4gICAgZGVyaXZlZEhhbGZTZWxlY3RlZEtleXMgPSBfdXNlTWVtbzNbMV07XG4gIHZhciBkZXJpdmVkU2VsZWN0ZWRLZXlTZXQgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIga2V5cyA9IHNlbGVjdGlvblR5cGUgPT09ICdyYWRpbycgPyBkZXJpdmVkU2VsZWN0ZWRLZXlzLnNsaWNlKDAsIDEpIDogZGVyaXZlZFNlbGVjdGVkS2V5cztcbiAgICByZXR1cm4gbmV3IFNldChrZXlzKTtcbiAgfSwgW2Rlcml2ZWRTZWxlY3RlZEtleXMsIHNlbGVjdGlvblR5cGVdKTtcbiAgdmFyIGRlcml2ZWRIYWxmU2VsZWN0ZWRLZXlTZXQgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gc2VsZWN0aW9uVHlwZSA9PT0gJ3JhZGlvJyA/IG5ldyBTZXQoKSA6IG5ldyBTZXQoZGVyaXZlZEhhbGZTZWxlY3RlZEtleXMpO1xuICB9LCBbZGVyaXZlZEhhbGZTZWxlY3RlZEtleXMsIHNlbGVjdGlvblR5cGVdKTtcbiAgLy8gU2F2ZSBsYXN0IHNlbGVjdGVkIGtleSB0byBlbmFibGUgcmFuZ2Ugc2VsZWN0aW9uXG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShudWxsKSxcbiAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICBsYXN0U2VsZWN0ZWRLZXkgPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldExhc3RTZWxlY3RlZEtleSA9IF91c2VTdGF0ZTJbMV07XG4gIC8vIFJlc2V0IGlmIHJvd1NlbGVjdGlvbiByZXNldFxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghcm93U2VsZWN0aW9uKSB7XG4gICAgICBzZXRNZXJnZWRTZWxlY3RlZEtleXMoRU1QVFlfTElTVCk7XG4gICAgfVxuICB9LCBbISFyb3dTZWxlY3Rpb25dKTtcbiAgdmFyIHNldFNlbGVjdGVkS2V5cyA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChrZXlzLCBtZXRob2QpIHtcbiAgICB2YXIgYXZhaWxhYmxlS2V5cztcbiAgICB2YXIgcmVjb3JkcztcbiAgICB1cGRhdGVQcmVzZXJ2ZVJlY29yZHNDYWNoZShrZXlzKTtcbiAgICBpZiAocHJlc2VydmVTZWxlY3RlZFJvd0tleXMpIHtcbiAgICAgIGF2YWlsYWJsZUtleXMgPSBrZXlzO1xuICAgICAgcmVjb3JkcyA9IGtleXMubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIHByZXNlcnZlUmVjb3Jkc1JlZi5jdXJyZW50LmdldChrZXkpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZpbHRlciBrZXkgd2hpY2ggbm90IGV4aXN0IGluIHRoZSBgZGF0YVNvdXJjZWBcbiAgICAgIGF2YWlsYWJsZUtleXMgPSBbXTtcbiAgICAgIHJlY29yZHMgPSBbXTtcbiAgICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciByZWNvcmQgPSBnZXRSZWNvcmRCeUtleShrZXkpO1xuICAgICAgICBpZiAocmVjb3JkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhdmFpbGFibGVLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICByZWNvcmRzLnB1c2gocmVjb3JkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHNldE1lcmdlZFNlbGVjdGVkS2V5cyhhdmFpbGFibGVLZXlzKTtcbiAgICBvblNlbGVjdGlvbkNoYW5nZSA9PT0gbnVsbCB8fCBvblNlbGVjdGlvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25TZWxlY3Rpb25DaGFuZ2UoYXZhaWxhYmxlS2V5cywgcmVjb3Jkcywge1xuICAgICAgdHlwZTogbWV0aG9kXG4gICAgfSk7XG4gIH0sIFtzZXRNZXJnZWRTZWxlY3RlZEtleXMsIGdldFJlY29yZEJ5S2V5LCBvblNlbGVjdGlvbkNoYW5nZSwgcHJlc2VydmVTZWxlY3RlZFJvd0tleXNdKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBTZWxlY3Rpb25zID09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVHJpZ2dlciBzaW5nbGUgYG9uU2VsZWN0YCBldmVudFxuICB2YXIgdHJpZ2dlclNpbmdsZVNlbGVjdGlvbiA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChrZXksIHNlbGVjdGVkLCBrZXlzLCBldmVudCkge1xuICAgIGlmIChvblNlbGVjdCkge1xuICAgICAgdmFyIHJvd3MgPSBrZXlzLm1hcChmdW5jdGlvbiAoaykge1xuICAgICAgICByZXR1cm4gZ2V0UmVjb3JkQnlLZXkoayk7XG4gICAgICB9KTtcbiAgICAgIG9uU2VsZWN0KGdldFJlY29yZEJ5S2V5KGtleSksIHNlbGVjdGVkLCByb3dzLCBldmVudCk7XG4gICAgfVxuICAgIHNldFNlbGVjdGVkS2V5cyhrZXlzLCAnc2luZ2xlJyk7XG4gIH0sIFtvblNlbGVjdCwgZ2V0UmVjb3JkQnlLZXksIHNldFNlbGVjdGVkS2V5c10pO1xuICB2YXIgbWVyZ2VkU2VsZWN0aW9ucyA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmICghc2VsZWN0aW9ucyB8fCBoaWRlU2VsZWN0QWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIHNlbGVjdGlvbkxpc3QgPSBzZWxlY3Rpb25zID09PSB0cnVlID8gW1NFTEVDVElPTl9BTEwsIFNFTEVDVElPTl9JTlZFUlQsIFNFTEVDVElPTl9OT05FXSA6IHNlbGVjdGlvbnM7XG4gICAgcmV0dXJuIHNlbGVjdGlvbkxpc3QubWFwKGZ1bmN0aW9uIChzZWxlY3Rpb24pIHtcbiAgICAgIGlmIChzZWxlY3Rpb24gPT09IFNFTEVDVElPTl9BTEwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBrZXk6ICdhbGwnLFxuICAgICAgICAgIHRleHQ6IHRhYmxlTG9jYWxlLnNlbGVjdGlvbkFsbCxcbiAgICAgICAgICBvblNlbGVjdDogZnVuY3Rpb24gb25TZWxlY3QoKSB7XG4gICAgICAgICAgICBzZXRTZWxlY3RlZEtleXMoZGF0YS5tYXAoZnVuY3Rpb24gKHJlY29yZCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGdldFJvd0tleShyZWNvcmQsIGluZGV4KTtcbiAgICAgICAgICAgIH0pLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgIHZhciBjaGVja1Byb3BzID0gY2hlY2tib3hQcm9wc01hcC5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgcmV0dXJuICEoY2hlY2tQcm9wcyA9PT0gbnVsbCB8fCBjaGVja1Byb3BzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjaGVja1Byb3BzLmRpc2FibGVkKSB8fCBkZXJpdmVkU2VsZWN0ZWRLZXlTZXQuaGFzKGtleSk7XG4gICAgICAgICAgICB9KSwgJ2FsbCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWxlY3Rpb24gPT09IFNFTEVDVElPTl9JTlZFUlQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBrZXk6ICdpbnZlcnQnLFxuICAgICAgICAgIHRleHQ6IHRhYmxlTG9jYWxlLnNlbGVjdEludmVydCxcbiAgICAgICAgICBvblNlbGVjdDogZnVuY3Rpb24gb25TZWxlY3QoKSB7XG4gICAgICAgICAgICB2YXIga2V5U2V0ID0gbmV3IFNldChkZXJpdmVkU2VsZWN0ZWRLZXlTZXQpO1xuICAgICAgICAgICAgcGFnZURhdGEuZm9yRWFjaChmdW5jdGlvbiAocmVjb3JkLCBpbmRleCkge1xuICAgICAgICAgICAgICB2YXIga2V5ID0gZ2V0Um93S2V5KHJlY29yZCwgaW5kZXgpO1xuICAgICAgICAgICAgICB2YXIgY2hlY2tQcm9wcyA9IGNoZWNrYm94UHJvcHNNYXAuZ2V0KGtleSk7XG4gICAgICAgICAgICAgIGlmICghKGNoZWNrUHJvcHMgPT09IG51bGwgfHwgY2hlY2tQcm9wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hlY2tQcm9wcy5kaXNhYmxlZCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5U2V0LmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgICBrZXlTZXRbXCJkZWxldGVcIl0oa2V5KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAga2V5U2V0LmFkZChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2YXIga2V5cyA9IEFycmF5LmZyb20oa2V5U2V0KTtcbiAgICAgICAgICAgIGlmIChvblNlbGVjdEludmVydCkge1xuICAgICAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGZhbHNlLCAnVGFibGUnLCAnYG9uU2VsZWN0SW52ZXJ0YCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlLiBQbGVhc2UgdXNlIGBvbkNoYW5nZWAgaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgb25TZWxlY3RJbnZlcnQoa2V5cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRTZWxlY3RlZEtleXMoa2V5cywgJ2ludmVydCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWxlY3Rpb24gPT09IFNFTEVDVElPTl9OT05FKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAga2V5OiAnbm9uZScsXG4gICAgICAgICAgdGV4dDogdGFibGVMb2NhbGUuc2VsZWN0Tm9uZSxcbiAgICAgICAgICBvblNlbGVjdDogZnVuY3Rpb24gb25TZWxlY3QoKSB7XG4gICAgICAgICAgICBvblNlbGVjdE5vbmUgPT09IG51bGwgfHwgb25TZWxlY3ROb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvblNlbGVjdE5vbmUoKTtcbiAgICAgICAgICAgIHNldFNlbGVjdGVkS2V5cyhBcnJheS5mcm9tKGRlcml2ZWRTZWxlY3RlZEtleVNldCkuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgdmFyIGNoZWNrUHJvcHMgPSBjaGVja2JveFByb3BzTWFwLmdldChrZXkpO1xuICAgICAgICAgICAgICByZXR1cm4gY2hlY2tQcm9wcyA9PT0gbnVsbCB8fCBjaGVja1Byb3BzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjaGVja1Byb3BzLmRpc2FibGVkO1xuICAgICAgICAgICAgfSksICdub25lJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNlbGVjdGlvbjtcbiAgICB9KS5tYXAoZnVuY3Rpb24gKHNlbGVjdGlvbikge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKF9leHRlbmRzKHt9LCBzZWxlY3Rpb24pLCB7XG4gICAgICAgIG9uU2VsZWN0OiBmdW5jdGlvbiBvblNlbGVjdCgpIHtcbiAgICAgICAgICB2YXIgX2EyO1xuICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcmVzdCA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICAgIHJlc3RbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgICAgfVxuICAgICAgICAgIChfYSA9IHNlbGVjdGlvbi5vblNlbGVjdCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfYTIgPSBfYSkuY2FsbC5hcHBseShfYTIsIFtzZWxlY3Rpb25dLmNvbmNhdChyZXN0KSk7XG4gICAgICAgICAgc2V0TGFzdFNlbGVjdGVkS2V5KG51bGwpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSwgW3NlbGVjdGlvbnMsIGRlcml2ZWRTZWxlY3RlZEtleVNldCwgcGFnZURhdGEsIGdldFJvd0tleSwgb25TZWxlY3RJbnZlcnQsIHNldFNlbGVjdGVkS2V5c10pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBDb2x1bW5zID09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgdHJhbnNmb3JtQ29sdW1ucyA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChjb2x1bW5zKSB7XG4gICAgdmFyIF9hO1xuICAgIC8vID4+Pj4+Pj4+Pj4+IFNraXAgaWYgbm90IGV4aXN0cyBgcm93U2VsZWN0aW9uYFxuICAgIGlmICghcm93U2VsZWN0aW9uKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCFjb2x1bW5zLmluY2x1ZGVzKFNFTEVDVElPTl9DT0xVTU4pLCAnVGFibGUnLCAnYHJvd1NlbGVjdGlvbmAgaXMgbm90IGNvbmZpZyBidXQgYFNFTEVDVElPTl9DT0xVTU5gIGV4aXN0cyBpbiB0aGUgYGNvbHVtbnNgLicpIDogdm9pZCAwO1xuICAgICAgcmV0dXJuIGNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjb2wpIHtcbiAgICAgICAgcmV0dXJuIGNvbCAhPT0gU0VMRUNUSU9OX0NPTFVNTjtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyA+Pj4+Pj4+Pj4+PiBTdXBwb3J0IHNlbGVjdGlvblxuICAgIHZhciBjbG9uZUNvbHVtbnMgPSBfdG9Db25zdW1hYmxlQXJyYXkoY29sdW1ucyk7XG4gICAgdmFyIGtleVNldCA9IG5ldyBTZXQoZGVyaXZlZFNlbGVjdGVkS2V5U2V0KTtcbiAgICAvLyBSZWNvcmQga2V5IG9ubHkgbmVlZCBjaGVjayB3aXRoIGVuYWJsZWRcbiAgICB2YXIgcmVjb3JkS2V5cyA9IGZsYXR0ZWREYXRhLm1hcChnZXRSb3dLZXkpLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gICAgICByZXR1cm4gIWNoZWNrYm94UHJvcHNNYXAuZ2V0KGtleSkuZGlzYWJsZWQ7XG4gICAgfSk7XG4gICAgdmFyIGNoZWNrZWRDdXJyZW50QWxsID0gcmVjb3JkS2V5cy5ldmVyeShmdW5jdGlvbiAoa2V5KSB7XG4gICAgICByZXR1cm4ga2V5U2V0LmhhcyhrZXkpO1xuICAgIH0pO1xuICAgIHZhciBjaGVja2VkQ3VycmVudFNvbWUgPSByZWNvcmRLZXlzLnNvbWUoZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmV0dXJuIGtleVNldC5oYXMoa2V5KTtcbiAgICB9KTtcbiAgICB2YXIgb25TZWxlY3RBbGxDaGFuZ2UgPSBmdW5jdGlvbiBvblNlbGVjdEFsbENoYW5nZSgpIHtcbiAgICAgIHZhciBjaGFuZ2VLZXlzID0gW107XG4gICAgICBpZiAoY2hlY2tlZEN1cnJlbnRBbGwpIHtcbiAgICAgICAgcmVjb3JkS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICBrZXlTZXRbXCJkZWxldGVcIl0oa2V5KTtcbiAgICAgICAgICBjaGFuZ2VLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWNvcmRLZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIGlmICgha2V5U2V0LmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBrZXlTZXQuYWRkKGtleSk7XG4gICAgICAgICAgICBjaGFuZ2VLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdmFyIGtleXMgPSBBcnJheS5mcm9tKGtleVNldCk7XG4gICAgICBvblNlbGVjdEFsbCA9PT0gbnVsbCB8fCBvblNlbGVjdEFsbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25TZWxlY3RBbGwoIWNoZWNrZWRDdXJyZW50QWxsLCBrZXlzLm1hcChmdW5jdGlvbiAoaykge1xuICAgICAgICByZXR1cm4gZ2V0UmVjb3JkQnlLZXkoayk7XG4gICAgICB9KSwgY2hhbmdlS2V5cy5tYXAoZnVuY3Rpb24gKGspIHtcbiAgICAgICAgcmV0dXJuIGdldFJlY29yZEJ5S2V5KGspO1xuICAgICAgfSkpO1xuICAgICAgc2V0U2VsZWN0ZWRLZXlzKGtleXMsICdhbGwnKTtcbiAgICAgIHNldExhc3RTZWxlY3RlZEtleShudWxsKTtcbiAgICB9O1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gVGl0bGUgQ2VsbFxuICAgIHZhciB0aXRsZTtcbiAgICBpZiAoc2VsZWN0aW9uVHlwZSAhPT0gJ3JhZGlvJykge1xuICAgICAgdmFyIGN1c3RvbWl6ZVNlbGVjdGlvbnM7XG4gICAgICBpZiAobWVyZ2VkU2VsZWN0aW9ucykge1xuICAgICAgICB2YXIgbWVudSA9IHtcbiAgICAgICAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXIsXG4gICAgICAgICAgaXRlbXM6IG1lcmdlZFNlbGVjdGlvbnMubWFwKGZ1bmN0aW9uIChzZWxlY3Rpb24sIGluZGV4KSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gc2VsZWN0aW9uLmtleSxcbiAgICAgICAgICAgICAgdGV4dCA9IHNlbGVjdGlvbi50ZXh0LFxuICAgICAgICAgICAgICBvblNlbGVjdGlvbkNsaWNrID0gc2VsZWN0aW9uLm9uU2VsZWN0O1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAga2V5OiBrZXkgfHwgaW5kZXgsXG4gICAgICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgICAgICAgICAgb25TZWxlY3Rpb25DbGljayA9PT0gbnVsbCB8fCBvblNlbGVjdGlvbkNsaWNrID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvblNlbGVjdGlvbkNsaWNrKHJlY29yZEtleXMpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBsYWJlbDogdGV4dFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgICAgICBjdXN0b21pemVTZWxlY3Rpb25zID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zZWxlY3Rpb24tZXh0cmFcIilcbiAgICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRHJvcGRvd24sIHtcbiAgICAgICAgICBtZW51OiBtZW51LFxuICAgICAgICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lclxuICAgICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRG93bk91dGxpbmVkLCBudWxsKSkpKTtcbiAgICAgIH1cbiAgICAgIHZhciBhbGxEaXNhYmxlZERhdGEgPSBmbGF0dGVkRGF0YS5tYXAoZnVuY3Rpb24gKHJlY29yZCwgaW5kZXgpIHtcbiAgICAgICAgdmFyIGtleSA9IGdldFJvd0tleShyZWNvcmQsIGluZGV4KTtcbiAgICAgICAgdmFyIGNoZWNrYm94UHJvcHMgPSBjaGVja2JveFByb3BzTWFwLmdldChrZXkpIHx8IHt9O1xuICAgICAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAgICAgIGNoZWNrZWQ6IGtleVNldC5oYXMoa2V5KVxuICAgICAgICB9LCBjaGVja2JveFByb3BzKTtcbiAgICAgIH0pLmZpbHRlcihmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgICAgdmFyIGRpc2FibGVkID0gX3JlZjIuZGlzYWJsZWQ7XG4gICAgICAgIHJldHVybiBkaXNhYmxlZDtcbiAgICAgIH0pO1xuICAgICAgdmFyIGFsbERpc2FibGVkID0gISFhbGxEaXNhYmxlZERhdGEubGVuZ3RoICYmIGFsbERpc2FibGVkRGF0YS5sZW5ndGggPT09IGZsYXR0ZWREYXRhLmxlbmd0aDtcbiAgICAgIHZhciBhbGxEaXNhYmxlZEFuZENoZWNrZWQgPSBhbGxEaXNhYmxlZCAmJiBhbGxEaXNhYmxlZERhdGEuZXZlcnkoZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgICAgIHZhciBjaGVja2VkID0gX3JlZjMuY2hlY2tlZDtcbiAgICAgICAgcmV0dXJuIGNoZWNrZWQ7XG4gICAgICB9KTtcbiAgICAgIHZhciBhbGxEaXNhYmxlZFNvbWVDaGVja2VkID0gYWxsRGlzYWJsZWQgJiYgYWxsRGlzYWJsZWREYXRhLnNvbWUoZnVuY3Rpb24gKF9yZWY0KSB7XG4gICAgICAgIHZhciBjaGVja2VkID0gX3JlZjQuY2hlY2tlZDtcbiAgICAgICAgcmV0dXJuIGNoZWNrZWQ7XG4gICAgICB9KTtcbiAgICAgIHRpdGxlID0gIWhpZGVTZWxlY3RBbGwgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc2VsZWN0aW9uXCIpXG4gICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDaGVja2JveCwge1xuICAgICAgICBjaGVja2VkOiAhYWxsRGlzYWJsZWQgPyAhIWZsYXR0ZWREYXRhLmxlbmd0aCAmJiBjaGVja2VkQ3VycmVudEFsbCA6IGFsbERpc2FibGVkQW5kQ2hlY2tlZCxcbiAgICAgICAgaW5kZXRlcm1pbmF0ZTogIWFsbERpc2FibGVkID8gIWNoZWNrZWRDdXJyZW50QWxsICYmIGNoZWNrZWRDdXJyZW50U29tZSA6ICFhbGxEaXNhYmxlZEFuZENoZWNrZWQgJiYgYWxsRGlzYWJsZWRTb21lQ2hlY2tlZCxcbiAgICAgICAgb25DaGFuZ2U6IG9uU2VsZWN0QWxsQ2hhbmdlLFxuICAgICAgICBkaXNhYmxlZDogZmxhdHRlZERhdGEubGVuZ3RoID09PSAwIHx8IGFsbERpc2FibGVkLFxuICAgICAgICBcImFyaWEtbGFiZWxcIjogY3VzdG9taXplU2VsZWN0aW9ucyA/ICdDdXN0b20gc2VsZWN0aW9uJyA6ICdTZWxlY3QgYWxsJyxcbiAgICAgICAgc2tpcEdyb3VwOiB0cnVlXG4gICAgICB9KSwgY3VzdG9taXplU2VsZWN0aW9ucyk7XG4gICAgfVxuICAgIC8vIEJvZHkgQ2VsbFxuICAgIHZhciByZW5kZXJDZWxsO1xuICAgIGlmIChzZWxlY3Rpb25UeXBlID09PSAncmFkaW8nKSB7XG4gICAgICByZW5kZXJDZWxsID0gZnVuY3Rpb24gcmVuZGVyQ2VsbChfLCByZWNvcmQsIGluZGV4KSB7XG4gICAgICAgIHZhciBrZXkgPSBnZXRSb3dLZXkocmVjb3JkLCBpbmRleCk7XG4gICAgICAgIHZhciBjaGVja2VkID0ga2V5U2V0LmhhcyhrZXkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5vZGU6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJhZGlvLCBfZXh0ZW5kcyh7fSwgY2hlY2tib3hQcm9wc01hcC5nZXQoa2V5KSwge1xuICAgICAgICAgICAgY2hlY2tlZDogY2hlY2tlZCxcbiAgICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZXZlbnQpIHtcbiAgICAgICAgICAgICAgaWYgKCFrZXlTZXQuaGFzKGtleSkpIHtcbiAgICAgICAgICAgICAgICB0cmlnZ2VyU2luZ2xlU2VsZWN0aW9uKGtleSwgdHJ1ZSwgW2tleV0sIGV2ZW50Lm5hdGl2ZUV2ZW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICBjaGVja2VkOiBjaGVja2VkXG4gICAgICAgIH07XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZW5kZXJDZWxsID0gZnVuY3Rpb24gcmVuZGVyQ2VsbChfLCByZWNvcmQsIGluZGV4KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIGtleSA9IGdldFJvd0tleShyZWNvcmQsIGluZGV4KTtcbiAgICAgICAgdmFyIGNoZWNrZWQgPSBrZXlTZXQuaGFzKGtleSk7XG4gICAgICAgIHZhciBpbmRldGVybWluYXRlID0gZGVyaXZlZEhhbGZTZWxlY3RlZEtleVNldC5oYXMoa2V5KTtcbiAgICAgICAgdmFyIGNoZWNrYm94UHJvcHMgPSBjaGVja2JveFByb3BzTWFwLmdldChrZXkpO1xuICAgICAgICB2YXIgbWVyZ2VkSW5kZXRlcm1pbmF0ZTtcbiAgICAgICAgaWYgKGV4cGFuZFR5cGUgPT09ICduZXN0Jykge1xuICAgICAgICAgIG1lcmdlZEluZGV0ZXJtaW5hdGUgPSBpbmRldGVybWluYXRlO1xuICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcodHlwZW9mIChjaGVja2JveFByb3BzID09PSBudWxsIHx8IGNoZWNrYm94UHJvcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNoZWNrYm94UHJvcHMuaW5kZXRlcm1pbmF0ZSkgIT09ICdib29sZWFuJywgJ1RhYmxlJywgJ3NldCBgaW5kZXRlcm1pbmF0ZWAgdXNpbmcgYHJvd1NlbGVjdGlvbi5nZXRDaGVja2JveFByb3BzYCBpcyBub3QgYWxsb3dlZCB3aXRoIHRyZWUgc3RydWN0dXJlZCBkYXRhU291cmNlLicpIDogdm9pZCAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1lcmdlZEluZGV0ZXJtaW5hdGUgPSAoX2EgPSBjaGVja2JveFByb3BzID09PSBudWxsIHx8IGNoZWNrYm94UHJvcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNoZWNrYm94UHJvcHMuaW5kZXRlcm1pbmF0ZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogaW5kZXRlcm1pbmF0ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWNvcmQgY2hlY2tlZFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5vZGU6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENoZWNrYm94LCBfZXh0ZW5kcyh7fSwgY2hlY2tib3hQcm9wcywge1xuICAgICAgICAgICAgaW5kZXRlcm1pbmF0ZTogbWVyZ2VkSW5kZXRlcm1pbmF0ZSxcbiAgICAgICAgICAgIGNoZWNrZWQ6IGNoZWNrZWQsXG4gICAgICAgICAgICBza2lwR3JvdXA6IHRydWUsXG4gICAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uIG9uQ2hhbmdlKF9yZWY1KSB7XG4gICAgICAgICAgICAgIHZhciBuYXRpdmVFdmVudCA9IF9yZWY1Lm5hdGl2ZUV2ZW50O1xuICAgICAgICAgICAgICB2YXIgc2hpZnRLZXkgPSBuYXRpdmVFdmVudC5zaGlmdEtleTtcbiAgICAgICAgICAgICAgdmFyIHN0YXJ0SW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgdmFyIGVuZEluZGV4ID0gLTE7XG4gICAgICAgICAgICAgIC8vIEdldCByYW5nZSBvZiB0aGlzXG4gICAgICAgICAgICAgIGlmIChzaGlmdEtleSAmJiBjaGVja1N0cmljdGx5KSB7XG4gICAgICAgICAgICAgICAgdmFyIHBvaW50S2V5cyA9IG5ldyBTZXQoW2xhc3RTZWxlY3RlZEtleSwga2V5XSk7XG4gICAgICAgICAgICAgICAgcmVjb3JkS2V5cy5zb21lKGZ1bmN0aW9uIChyZWNvcmRLZXksIHJlY29yZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICBpZiAocG9pbnRLZXlzLmhhcyhyZWNvcmRLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSByZWNvcmRJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBlbmRJbmRleCA9IHJlY29yZEluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGVuZEluZGV4ICE9PSAtMSAmJiBzdGFydEluZGV4ICE9PSBlbmRJbmRleCAmJiBjaGVja1N0cmljdGx5KSB7XG4gICAgICAgICAgICAgICAgLy8gQmF0Y2ggdXBkYXRlIHNlbGVjdGlvbnNcbiAgICAgICAgICAgICAgICB2YXIgcmFuZ2VLZXlzID0gcmVjb3JkS2V5cy5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCArIDEpO1xuICAgICAgICAgICAgICAgIHZhciBjaGFuZ2VkS2V5cyA9IFtdO1xuICAgICAgICAgICAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICByYW5nZUtleXMuZm9yRWFjaChmdW5jdGlvbiAocmVjb3JkS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXlTZXQuaGFzKHJlY29yZEtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkS2V5cy5wdXNoKHJlY29yZEtleSk7XG4gICAgICAgICAgICAgICAgICAgICAga2V5U2V0W1wiZGVsZXRlXCJdKHJlY29yZEtleSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICByYW5nZUtleXMuZm9yRWFjaChmdW5jdGlvbiAocmVjb3JkS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgha2V5U2V0LmhhcyhyZWNvcmRLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZEtleXMucHVzaChyZWNvcmRLZXkpO1xuICAgICAgICAgICAgICAgICAgICAgIGtleVNldC5hZGQocmVjb3JkS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBrZXlzID0gQXJyYXkuZnJvbShrZXlTZXQpO1xuICAgICAgICAgICAgICAgIG9uU2VsZWN0TXVsdGlwbGUgPT09IG51bGwgfHwgb25TZWxlY3RNdWx0aXBsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25TZWxlY3RNdWx0aXBsZSghY2hlY2tlZCwga2V5cy5tYXAoZnVuY3Rpb24gKHJlY29yZEtleSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFJlY29yZEJ5S2V5KHJlY29yZEtleSk7XG4gICAgICAgICAgICAgICAgfSksIGNoYW5nZWRLZXlzLm1hcChmdW5jdGlvbiAocmVjb3JkS2V5KSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UmVjb3JkQnlLZXkocmVjb3JkS2V5KTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRLZXlzKGtleXMsICdtdWx0aXBsZScpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFNpbmdsZSByZWNvcmQgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICB2YXIgb3JpZ2luQ2hlY2tlZEtleXMgPSBkZXJpdmVkU2VsZWN0ZWRLZXlzO1xuICAgICAgICAgICAgICAgIGlmIChjaGVja1N0cmljdGx5KSB7XG4gICAgICAgICAgICAgICAgICB2YXIgY2hlY2tlZEtleXMgPSBjaGVja2VkID8gYXJyRGVsKG9yaWdpbkNoZWNrZWRLZXlzLCBrZXkpIDogYXJyQWRkKG9yaWdpbkNoZWNrZWRLZXlzLCBrZXkpO1xuICAgICAgICAgICAgICAgICAgdHJpZ2dlclNpbmdsZVNlbGVjdGlvbihrZXksICFjaGVja2VkLCBjaGVja2VkS2V5cywgbmF0aXZlRXZlbnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyBBbHdheXMgZmlsbCBmaXJzdFxuICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGNvbmR1Y3RDaGVjayhbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KG9yaWdpbkNoZWNrZWRLZXlzKSwgW2tleV0pLCB0cnVlLCBrZXlFbnRpdGllcywgaXNDaGVja2JveERpc2FibGVkKTtcbiAgICAgICAgICAgICAgICAgIHZhciBfY2hlY2tlZEtleXMgPSByZXN1bHQuY2hlY2tlZEtleXMsXG4gICAgICAgICAgICAgICAgICAgIGhhbGZDaGVja2VkS2V5cyA9IHJlc3VsdC5oYWxmQ2hlY2tlZEtleXM7XG4gICAgICAgICAgICAgICAgICB2YXIgbmV4dENoZWNrZWRLZXlzID0gX2NoZWNrZWRLZXlzO1xuICAgICAgICAgICAgICAgICAgLy8gSWYgcmVtb3ZlLCB3ZSBkbyBpdCBhZ2FpbiB0byBjb3JyZWN0aW9uXG4gICAgICAgICAgICAgICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcEtleVNldCA9IG5ldyBTZXQoX2NoZWNrZWRLZXlzKTtcbiAgICAgICAgICAgICAgICAgICAgdGVtcEtleVNldFtcImRlbGV0ZVwiXShrZXkpO1xuICAgICAgICAgICAgICAgICAgICBuZXh0Q2hlY2tlZEtleXMgPSBjb25kdWN0Q2hlY2soQXJyYXkuZnJvbSh0ZW1wS2V5U2V0KSwge1xuICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgIGhhbGZDaGVja2VkS2V5czogaGFsZkNoZWNrZWRLZXlzXG4gICAgICAgICAgICAgICAgICAgIH0sIGtleUVudGl0aWVzLCBpc0NoZWNrYm94RGlzYWJsZWQpLmNoZWNrZWRLZXlzO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgdHJpZ2dlclNpbmdsZVNlbGVjdGlvbihrZXksICFjaGVja2VkLCBuZXh0Q2hlY2tlZEtleXMsIG5hdGl2ZUV2ZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICBzZXRMYXN0U2VsZWN0ZWRLZXkobnVsbCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2V0TGFzdFNlbGVjdGVkS2V5KGtleSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSksXG4gICAgICAgICAgY2hlY2tlZDogY2hlY2tlZFxuICAgICAgICB9O1xuICAgICAgfTtcbiAgICB9XG4gICAgdmFyIHJlbmRlclNlbGVjdGlvbkNlbGwgPSBmdW5jdGlvbiByZW5kZXJTZWxlY3Rpb25DZWxsKF8sIHJlY29yZCwgaW5kZXgpIHtcbiAgICAgIHZhciBfcmVuZGVyQ2VsbCA9IHJlbmRlckNlbGwoXywgcmVjb3JkLCBpbmRleCksXG4gICAgICAgIG5vZGUgPSBfcmVuZGVyQ2VsbC5ub2RlLFxuICAgICAgICBjaGVja2VkID0gX3JlbmRlckNlbGwuY2hlY2tlZDtcbiAgICAgIGlmIChjdXN0b21pemVSZW5kZXJDZWxsKSB7XG4gICAgICAgIHJldHVybiBjdXN0b21pemVSZW5kZXJDZWxsKGNoZWNrZWQsIHJlY29yZCwgaW5kZXgsIG5vZGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfTtcbiAgICAvLyBJbnNlcnQgc2VsZWN0aW9uIGNvbHVtbiBpZiBub3QgZXhpc3RcbiAgICBpZiAoIWNsb25lQ29sdW1ucy5pbmNsdWRlcyhTRUxFQ1RJT05fQ09MVU1OKSkge1xuICAgICAgLy8gQWx3YXlzIGFmdGVyIGV4cGFuZCBpY29uXG4gICAgICBpZiAoY2xvbmVDb2x1bW5zLmZpbmRJbmRleChmdW5jdGlvbiAoY29sKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuICgoX2EgPSBjb2xbSU5URVJOQUxfQ09MX0RFRklORV0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jb2x1bW5UeXBlKSA9PT0gJ0VYUEFORF9DT0xVTU4nO1xuICAgICAgfSkgPT09IDApIHtcbiAgICAgICAgdmFyIF9jbG9uZUNvbHVtbnMgPSBjbG9uZUNvbHVtbnMsXG4gICAgICAgICAgX2Nsb25lQ29sdW1uczIgPSBfdG9BcnJheShfY2xvbmVDb2x1bW5zKSxcbiAgICAgICAgICBleHBhbmRDb2x1bW4gPSBfY2xvbmVDb2x1bW5zMlswXSxcbiAgICAgICAgICByZXN0Q29sdW1ucyA9IF9jbG9uZUNvbHVtbnMyLnNsaWNlKDEpO1xuICAgICAgICBjbG9uZUNvbHVtbnMgPSBbZXhwYW5kQ29sdW1uLCBTRUxFQ1RJT05fQ09MVU1OXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHJlc3RDb2x1bW5zKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBOb3JtYWwgaW5zZXJ0IGF0IGZpcnN0IGNvbHVtblxuICAgICAgICBjbG9uZUNvbHVtbnMgPSBbU0VMRUNUSU9OX0NPTFVNTl0uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShjbG9uZUNvbHVtbnMpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRGVkdXBsaWNhdGUgc2VsZWN0aW9uIGNvbHVtblxuICAgIHZhciBzZWxlY3Rpb25Db2x1bW5JbmRleCA9IGNsb25lQ29sdW1ucy5pbmRleE9mKFNFTEVDVElPTl9DT0xVTU4pO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoY2xvbmVDb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sKSB7XG4gICAgICByZXR1cm4gY29sID09PSBTRUxFQ1RJT05fQ09MVU1OO1xuICAgIH0pLmxlbmd0aCA8PSAxLCAnVGFibGUnLCAnTXVsdGlwbGUgYFNFTEVDVElPTl9DT0xVTU5gIGV4aXN0IGluIGBjb2x1bW5zYC4nKSA6IHZvaWQgMDtcbiAgICBjbG9uZUNvbHVtbnMgPSBjbG9uZUNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4sIGluZGV4KSB7XG4gICAgICByZXR1cm4gY29sdW1uICE9PSBTRUxFQ1RJT05fQ09MVU1OIHx8IGluZGV4ID09PSBzZWxlY3Rpb25Db2x1bW5JbmRleDtcbiAgICB9KTtcbiAgICAvLyBGaXhlZCBjb2x1bW4gbG9naWNcbiAgICB2YXIgcHJldkNvbCA9IGNsb25lQ29sdW1uc1tzZWxlY3Rpb25Db2x1bW5JbmRleCAtIDFdO1xuICAgIHZhciBuZXh0Q29sID0gY2xvbmVDb2x1bW5zW3NlbGVjdGlvbkNvbHVtbkluZGV4ICsgMV07XG4gICAgdmFyIG1lcmdlZEZpeGVkID0gZml4ZWQ7XG4gICAgaWYgKG1lcmdlZEZpeGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICgobmV4dENvbCA9PT0gbnVsbCB8fCBuZXh0Q29sID09PSB2b2lkIDAgPyB2b2lkIDAgOiBuZXh0Q29sLmZpeGVkKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1lcmdlZEZpeGVkID0gbmV4dENvbC5maXhlZDtcbiAgICAgIH0gZWxzZSBpZiAoKHByZXZDb2wgPT09IG51bGwgfHwgcHJldkNvbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHJldkNvbC5maXhlZCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtZXJnZWRGaXhlZCA9IHByZXZDb2wuZml4ZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtZXJnZWRGaXhlZCAmJiBwcmV2Q29sICYmICgoX2EgPSBwcmV2Q29sW0lOVEVSTkFMX0NPTF9ERUZJTkVdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY29sdW1uVHlwZSkgPT09ICdFWFBBTkRfQ09MVU1OJyAmJiBwcmV2Q29sLmZpeGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHByZXZDb2wuZml4ZWQgPSBtZXJnZWRGaXhlZDtcbiAgICB9XG4gICAgLy8gUmVwbGFjZSB3aXRoIHJlYWwgc2VsZWN0aW9uIGNvbHVtblxuICAgIHZhciBzZWxlY3Rpb25Db2x1bW4gPSBfZGVmaW5lUHJvcGVydHkoe1xuICAgICAgZml4ZWQ6IG1lcmdlZEZpeGVkLFxuICAgICAgd2lkdGg6IHNlbGVjdGlvbkNvbFdpZHRoLFxuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNlbGVjdGlvbi1jb2x1bW5cIiksXG4gICAgICB0aXRsZTogcm93U2VsZWN0aW9uLmNvbHVtblRpdGxlIHx8IHRpdGxlLFxuICAgICAgcmVuZGVyOiByZW5kZXJTZWxlY3Rpb25DZWxsXG4gICAgfSwgSU5URVJOQUxfQ09MX0RFRklORSwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNlbGVjdGlvbi1jb2xcIilcbiAgICB9KTtcbiAgICByZXR1cm4gY2xvbmVDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sKSB7XG4gICAgICByZXR1cm4gY29sID09PSBTRUxFQ1RJT05fQ09MVU1OID8gc2VsZWN0aW9uQ29sdW1uIDogY29sO1xuICAgIH0pO1xuICB9LCBbZ2V0Um93S2V5LCBmbGF0dGVkRGF0YSwgcm93U2VsZWN0aW9uLCBkZXJpdmVkU2VsZWN0ZWRLZXlzLCBkZXJpdmVkU2VsZWN0ZWRLZXlTZXQsIGRlcml2ZWRIYWxmU2VsZWN0ZWRLZXlTZXQsIHNlbGVjdGlvbkNvbFdpZHRoLCBtZXJnZWRTZWxlY3Rpb25zLCBleHBhbmRUeXBlLCBsYXN0U2VsZWN0ZWRLZXksIGNoZWNrYm94UHJvcHNNYXAsIG9uU2VsZWN0TXVsdGlwbGUsIHRyaWdnZXJTaW5nbGVTZWxlY3Rpb24sIGlzQ2hlY2tib3hEaXNhYmxlZF0pO1xuICByZXR1cm4gW3RyYW5zZm9ybUNvbHVtbnMsIGRlcml2ZWRTZWxlY3RlZEtleVNldF07XG59IiwiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgQ2FyZXREb3duT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCIwIDAgMTAyNCAxMDI0XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTg0MC40IDMwMEgxODMuNmMtMTkuNyAwLTMwLjcgMjAuOC0xOC41IDM1bDMyOC40IDM4MC44YzkuNCAxMC45IDI3LjUgMTAuOSAzNyAwTDg1OC45IDMzNWMxMi4yLTE0LjIgMS4yLTM1LTE4LjUtMzV6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJjYXJldC1kb3duXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnQgZGVmYXVsdCBDYXJldERvd25PdXRsaW5lZDtcbiIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IENhcmV0RG93bk91dGxpbmVkU3ZnIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0NhcmV0RG93bk91dGxpbmVkXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSAnLi4vY29tcG9uZW50cy9BbnRkSWNvbic7XG52YXIgQ2FyZXREb3duT3V0bGluZWQgPSBmdW5jdGlvbiBDYXJldERvd25PdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogQ2FyZXREb3duT3V0bGluZWRTdmdcbiAgfSkpO1xufTtcbkNhcmV0RG93bk91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ0NhcmV0RG93bk91dGxpbmVkJztcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKENhcmV0RG93bk91dGxpbmVkKTsiLCIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBDYXJldFVwT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCIwIDAgMTAyNCAxMDI0XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTg1OC45IDY4OUw1MzAuNSAzMDguMmMtOS40LTEwLjktMjcuNS0xMC45LTM3IDBMMTY1LjEgNjg5Yy0xMi4yIDE0LjItMS4yIDM1IDE4LjUgMzVoNjU2LjhjMTkuNyAwIDMwLjctMjAuOCAxOC41LTM1elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiY2FyZXQtdXBcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IENhcmV0VXBPdXRsaW5lZDtcbiIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IENhcmV0VXBPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9DYXJldFVwT3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tICcuLi9jb21wb25lbnRzL0FudGRJY29uJztcbnZhciBDYXJldFVwT3V0bGluZWQgPSBmdW5jdGlvbiBDYXJldFVwT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IENhcmV0VXBPdXRsaW5lZFN2Z1xuICB9KSk7XG59O1xuQ2FyZXRVcE91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ0NhcmV0VXBPdXRsaW5lZCc7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihDYXJldFVwT3V0bGluZWQpOyIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBDYXJldERvd25PdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvQ2FyZXREb3duT3V0bGluZWRcIjtcbmltcG9ydCBDYXJldFVwT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0NhcmV0VXBPdXRsaW5lZFwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgS2V5Q29kZSBmcm9tIFwicmMtdXRpbC9lcy9LZXlDb2RlXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgVG9vbHRpcCBmcm9tICcuLi8uLi90b29sdGlwJztcbmltcG9ydCB7IGdldENvbHVtbktleSwgZ2V0Q29sdW1uUG9zLCByZW5kZXJDb2x1bW5UaXRsZSwgc2FmZUNvbHVtblRpdGxlIH0gZnJvbSAnLi4vdXRpbCc7XG52YXIgQVNDRU5EID0gJ2FzY2VuZCc7XG52YXIgREVTQ0VORCA9ICdkZXNjZW5kJztcbmZ1bmN0aW9uIGdldE11bHRpcGxlUHJpb3JpdHkoY29sdW1uKSB7XG4gIGlmIChfdHlwZW9mKGNvbHVtbi5zb3J0ZXIpID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgY29sdW1uLnNvcnRlci5tdWx0aXBsZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gY29sdW1uLnNvcnRlci5tdWx0aXBsZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBnZXRTb3J0RnVuY3Rpb24oc29ydGVyKSB7XG4gIGlmICh0eXBlb2Ygc29ydGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHNvcnRlcjtcbiAgfVxuICBpZiAoc29ydGVyICYmIF90eXBlb2Yoc29ydGVyKSA9PT0gJ29iamVjdCcgJiYgc29ydGVyLmNvbXBhcmUpIHtcbiAgICByZXR1cm4gc29ydGVyLmNvbXBhcmU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gbmV4dFNvcnREaXJlY3Rpb24oc29ydERpcmVjdGlvbnMsIGN1cnJlbnQpIHtcbiAgaWYgKCFjdXJyZW50KSB7XG4gICAgcmV0dXJuIHNvcnREaXJlY3Rpb25zWzBdO1xuICB9XG4gIHJldHVybiBzb3J0RGlyZWN0aW9uc1tzb3J0RGlyZWN0aW9ucy5pbmRleE9mKGN1cnJlbnQpICsgMV07XG59XG5mdW5jdGlvbiBjb2xsZWN0U29ydFN0YXRlcyhjb2x1bW5zLCBpbml0LCBwb3MpIHtcbiAgdmFyIHNvcnRTdGF0ZXMgPSBbXTtcbiAgZnVuY3Rpb24gcHVzaFN0YXRlKGNvbHVtbiwgY29sdW1uUG9zKSB7XG4gICAgc29ydFN0YXRlcy5wdXNoKHtcbiAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAga2V5OiBnZXRDb2x1bW5LZXkoY29sdW1uLCBjb2x1bW5Qb3MpLFxuICAgICAgbXVsdGlwbGVQcmlvcml0eTogZ2V0TXVsdGlwbGVQcmlvcml0eShjb2x1bW4pLFxuICAgICAgc29ydE9yZGVyOiBjb2x1bW4uc29ydE9yZGVyXG4gICAgfSk7XG4gIH1cbiAgKGNvbHVtbnMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbiwgaW5kZXgpIHtcbiAgICB2YXIgY29sdW1uUG9zID0gZ2V0Q29sdW1uUG9zKGluZGV4LCBwb3MpO1xuICAgIGlmIChjb2x1bW4uY2hpbGRyZW4pIHtcbiAgICAgIGlmICgnc29ydE9yZGVyJyBpbiBjb2x1bW4pIHtcbiAgICAgICAgLy8gQ29udHJvbGxlZFxuICAgICAgICBwdXNoU3RhdGUoY29sdW1uLCBjb2x1bW5Qb3MpO1xuICAgICAgfVxuICAgICAgc29ydFN0YXRlcyA9IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoc29ydFN0YXRlcyksIF90b0NvbnN1bWFibGVBcnJheShjb2xsZWN0U29ydFN0YXRlcyhjb2x1bW4uY2hpbGRyZW4sIGluaXQsIGNvbHVtblBvcykpKTtcbiAgICB9IGVsc2UgaWYgKGNvbHVtbi5zb3J0ZXIpIHtcbiAgICAgIGlmICgnc29ydE9yZGVyJyBpbiBjb2x1bW4pIHtcbiAgICAgICAgLy8gQ29udHJvbGxlZFxuICAgICAgICBwdXNoU3RhdGUoY29sdW1uLCBjb2x1bW5Qb3MpO1xuICAgICAgfSBlbHNlIGlmIChpbml0ICYmIGNvbHVtbi5kZWZhdWx0U29ydE9yZGVyKSB7XG4gICAgICAgIC8vIERlZmF1bHQgc29ydGVyXG4gICAgICAgIHNvcnRTdGF0ZXMucHVzaCh7XG4gICAgICAgICAgY29sdW1uOiBjb2x1bW4sXG4gICAgICAgICAga2V5OiBnZXRDb2x1bW5LZXkoY29sdW1uLCBjb2x1bW5Qb3MpLFxuICAgICAgICAgIG11bHRpcGxlUHJpb3JpdHk6IGdldE11bHRpcGxlUHJpb3JpdHkoY29sdW1uKSxcbiAgICAgICAgICBzb3J0T3JkZXI6IGNvbHVtbi5kZWZhdWx0U29ydE9yZGVyXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiBzb3J0U3RhdGVzO1xufVxuZnVuY3Rpb24gaW5qZWN0U29ydGVyKHByZWZpeENscywgY29sdW1ucywgc29ydGVyU3RhdGVzLCB0cmlnZ2VyU29ydGVyLCBkZWZhdWx0U29ydERpcmVjdGlvbnMsIHRhYmxlTG9jYWxlLCB0YWJsZVNob3dTb3J0ZXJUb29sdGlwLCBwb3MpIHtcbiAgcmV0dXJuIChjb2x1bW5zIHx8IFtdKS5tYXAoZnVuY3Rpb24gKGNvbHVtbiwgaW5kZXgpIHtcbiAgICB2YXIgY29sdW1uUG9zID0gZ2V0Q29sdW1uUG9zKGluZGV4LCBwb3MpO1xuICAgIHZhciBuZXdDb2x1bW4gPSBjb2x1bW47XG4gICAgaWYgKG5ld0NvbHVtbi5zb3J0ZXIpIHtcbiAgICAgIHZhciBzb3J0RGlyZWN0aW9ucyA9IG5ld0NvbHVtbi5zb3J0RGlyZWN0aW9ucyB8fCBkZWZhdWx0U29ydERpcmVjdGlvbnM7XG4gICAgICB2YXIgc2hvd1NvcnRlclRvb2x0aXAgPSBuZXdDb2x1bW4uc2hvd1NvcnRlclRvb2x0aXAgPT09IHVuZGVmaW5lZCA/IHRhYmxlU2hvd1NvcnRlclRvb2x0aXAgOiBuZXdDb2x1bW4uc2hvd1NvcnRlclRvb2x0aXA7XG4gICAgICB2YXIgY29sdW1uS2V5ID0gZ2V0Q29sdW1uS2V5KG5ld0NvbHVtbiwgY29sdW1uUG9zKTtcbiAgICAgIHZhciBzb3J0ZXJTdGF0ZSA9IHNvcnRlclN0YXRlcy5maW5kKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgIHZhciBrZXkgPSBfcmVmLmtleTtcbiAgICAgICAgcmV0dXJuIGtleSA9PT0gY29sdW1uS2V5O1xuICAgICAgfSk7XG4gICAgICB2YXIgc29ydGVyT3JkZXIgPSBzb3J0ZXJTdGF0ZSA/IHNvcnRlclN0YXRlLnNvcnRPcmRlciA6IG51bGw7XG4gICAgICB2YXIgbmV4dFNvcnRPcmRlciA9IG5leHRTb3J0RGlyZWN0aW9uKHNvcnREaXJlY3Rpb25zLCBzb3J0ZXJPcmRlcik7XG4gICAgICB2YXIgdXBOb2RlID0gc29ydERpcmVjdGlvbnMuaW5jbHVkZXMoQVNDRU5EKSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDYXJldFVwT3V0bGluZWQsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29sdW1uLXNvcnRlci11cFwiKSwge1xuICAgICAgICAgIGFjdGl2ZTogc29ydGVyT3JkZXIgPT09IEFTQ0VORFxuICAgICAgICB9KSxcbiAgICAgICAgcm9sZTogXCJwcmVzZW50YXRpb25cIlxuICAgICAgfSk7XG4gICAgICB2YXIgZG93bk5vZGUgPSBzb3J0RGlyZWN0aW9ucy5pbmNsdWRlcyhERVNDRU5EKSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDYXJldERvd25PdXRsaW5lZCwge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb2x1bW4tc29ydGVyLWRvd25cIiksIHtcbiAgICAgICAgICBhY3RpdmU6IHNvcnRlck9yZGVyID09PSBERVNDRU5EXG4gICAgICAgIH0pLFxuICAgICAgICByb2xlOiBcInByZXNlbnRhdGlvblwiXG4gICAgICB9KTtcbiAgICAgIHZhciBfcmVmMiA9IHRhYmxlTG9jYWxlIHx8IHt9LFxuICAgICAgICBjYW5jZWxTb3J0ID0gX3JlZjIuY2FuY2VsU29ydCxcbiAgICAgICAgdHJpZ2dlckFzYyA9IF9yZWYyLnRyaWdnZXJBc2MsXG4gICAgICAgIHRyaWdnZXJEZXNjID0gX3JlZjIudHJpZ2dlckRlc2M7XG4gICAgICB2YXIgc29ydFRpcCA9IGNhbmNlbFNvcnQ7XG4gICAgICBpZiAobmV4dFNvcnRPcmRlciA9PT0gREVTQ0VORCkge1xuICAgICAgICBzb3J0VGlwID0gdHJpZ2dlckRlc2M7XG4gICAgICB9IGVsc2UgaWYgKG5leHRTb3J0T3JkZXIgPT09IEFTQ0VORCkge1xuICAgICAgICBzb3J0VGlwID0gdHJpZ2dlckFzYztcbiAgICAgIH1cbiAgICAgIHZhciB0b29sdGlwUHJvcHMgPSBfdHlwZW9mKHNob3dTb3J0ZXJUb29sdGlwKSA9PT0gJ29iamVjdCcgPyBzaG93U29ydGVyVG9vbHRpcCA6IHtcbiAgICAgICAgdGl0bGU6IHNvcnRUaXBcbiAgICAgIH07XG4gICAgICBuZXdDb2x1bW4gPSBfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgbmV3Q29sdW1uKSwge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMobmV3Q29sdW1uLmNsYXNzTmFtZSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbHVtbi1zb3J0XCIpLCBzb3J0ZXJPcmRlcikpLFxuICAgICAgICB0aXRsZTogZnVuY3Rpb24gdGl0bGUocmVuZGVyUHJvcHMpIHtcbiAgICAgICAgICB2YXIgcmVuZGVyU29ydFRpdGxlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbHVtbi1zb3J0ZXJzXCIpXG4gICAgICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb2x1bW4tdGl0bGVcIilcbiAgICAgICAgICB9LCByZW5kZXJDb2x1bW5UaXRsZShjb2x1bW4udGl0bGUsIHJlbmRlclByb3BzKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb2x1bW4tc29ydGVyXCIpLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29sdW1uLXNvcnRlci1mdWxsXCIpLCAhISh1cE5vZGUgJiYgZG93bk5vZGUpKSlcbiAgICAgICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWNvbHVtbi1zb3J0ZXItaW5uZXJcIilcbiAgICAgICAgICB9LCB1cE5vZGUsIGRvd25Ob2RlKSkpO1xuICAgICAgICAgIHJldHVybiBzaG93U29ydGVyVG9vbHRpcCA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXAsIF9leHRlbmRzKHt9LCB0b29sdGlwUHJvcHMpLCByZW5kZXJTb3J0VGl0bGUpIDogcmVuZGVyU29ydFRpdGxlO1xuICAgICAgICB9LFxuICAgICAgICBvbkhlYWRlckNlbGw6IGZ1bmN0aW9uIG9uSGVhZGVyQ2VsbChjb2wpIHtcbiAgICAgICAgICB2YXIgY2VsbCA9IGNvbHVtbi5vbkhlYWRlckNlbGwgJiYgY29sdW1uLm9uSGVhZGVyQ2VsbChjb2wpIHx8IHt9O1xuICAgICAgICAgIHZhciBvcmlnaW5PbkNsaWNrID0gY2VsbC5vbkNsaWNrO1xuICAgICAgICAgIHZhciBvcmlnaW5PS2V5RG93biA9IGNlbGwub25LZXlEb3duO1xuICAgICAgICAgIGNlbGwub25DbGljayA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgdHJpZ2dlclNvcnRlcih7XG4gICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAgICAgICAgICBrZXk6IGNvbHVtbktleSxcbiAgICAgICAgICAgICAgc29ydE9yZGVyOiBuZXh0U29ydE9yZGVyLFxuICAgICAgICAgICAgICBtdWx0aXBsZVByaW9yaXR5OiBnZXRNdWx0aXBsZVByaW9yaXR5KGNvbHVtbilcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb3JpZ2luT25DbGljayA9PT0gbnVsbCB8fCBvcmlnaW5PbkNsaWNrID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnaW5PbkNsaWNrKGV2ZW50KTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNlbGwub25LZXlEb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS2V5Q29kZS5FTlRFUikge1xuICAgICAgICAgICAgICB0cmlnZ2VyU29ydGVyKHtcbiAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgICAgICAgICAgICBrZXk6IGNvbHVtbktleSxcbiAgICAgICAgICAgICAgICBzb3J0T3JkZXI6IG5leHRTb3J0T3JkZXIsXG4gICAgICAgICAgICAgICAgbXVsdGlwbGVQcmlvcml0eTogZ2V0TXVsdGlwbGVQcmlvcml0eShjb2x1bW4pXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBvcmlnaW5PS2V5RG93biA9PT0gbnVsbCB8fCBvcmlnaW5PS2V5RG93biA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3JpZ2luT0tleURvd24oZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgdmFyIHJlbmRlclRpdGxlID0gc2FmZUNvbHVtblRpdGxlKGNvbHVtbi50aXRsZSwge30pO1xuICAgICAgICAgIHZhciBkaXNwbGF5VGl0bGUgPSByZW5kZXJUaXRsZSA9PT0gbnVsbCB8fCByZW5kZXJUaXRsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVuZGVyVGl0bGUudG9TdHJpbmcoKTtcbiAgICAgICAgICAvLyBJbmZvcm0gdGhlIHNjcmVlbi1yZWFkZXIgc28gaXQgY2FuIHRlbGwgdGhlIHZpc3VhbGx5IGltcGFpcmVkIHVzZXIgd2hpY2ggY29sdW1uIGlzIHNvcnRlZFxuICAgICAgICAgIGlmIChzb3J0ZXJPcmRlcikge1xuICAgICAgICAgICAgY2VsbFsnYXJpYS1zb3J0J10gPSBzb3J0ZXJPcmRlciA9PT0gJ2FzY2VuZCcgPyAnYXNjZW5kaW5nJyA6ICdkZXNjZW5kaW5nJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2VsbFsnYXJpYS1sYWJlbCddID0gZGlzcGxheVRpdGxlIHx8ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjZWxsLmNsYXNzTmFtZSA9IGNsYXNzTmFtZXMoY2VsbC5jbGFzc05hbWUsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItY29sdW1uLWhhcy1zb3J0ZXJzXCIpKTtcbiAgICAgICAgICBjZWxsLnRhYkluZGV4ID0gMDtcbiAgICAgICAgICBpZiAoY29sdW1uLmVsbGlwc2lzKSB7XG4gICAgICAgICAgICBjZWxsLnRpdGxlID0gKHJlbmRlclRpdGxlICE9PSBudWxsICYmIHJlbmRlclRpdGxlICE9PSB2b2lkIDAgPyByZW5kZXJUaXRsZSA6ICcnKS50b1N0cmluZygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY2VsbDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICgnY2hpbGRyZW4nIGluIG5ld0NvbHVtbikge1xuICAgICAgbmV3Q29sdW1uID0gX2V4dGVuZHMoX2V4dGVuZHMoe30sIG5ld0NvbHVtbiksIHtcbiAgICAgICAgY2hpbGRyZW46IGluamVjdFNvcnRlcihwcmVmaXhDbHMsIG5ld0NvbHVtbi5jaGlsZHJlbiwgc29ydGVyU3RhdGVzLCB0cmlnZ2VyU29ydGVyLCBkZWZhdWx0U29ydERpcmVjdGlvbnMsIHRhYmxlTG9jYWxlLCB0YWJsZVNob3dTb3J0ZXJUb29sdGlwLCBjb2x1bW5Qb3MpXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld0NvbHVtbjtcbiAgfSk7XG59XG5mdW5jdGlvbiBzdGF0ZVRvSW5mbyhzb3J0ZXJTdGF0ZXMpIHtcbiAgdmFyIGNvbHVtbiA9IHNvcnRlclN0YXRlcy5jb2x1bW4sXG4gICAgc29ydE9yZGVyID0gc29ydGVyU3RhdGVzLnNvcnRPcmRlcjtcbiAgcmV0dXJuIHtcbiAgICBjb2x1bW46IGNvbHVtbixcbiAgICBvcmRlcjogc29ydE9yZGVyLFxuICAgIGZpZWxkOiBjb2x1bW4uZGF0YUluZGV4LFxuICAgIGNvbHVtbktleTogY29sdW1uLmtleVxuICB9O1xufVxuZnVuY3Rpb24gZ2VuZXJhdGVTb3J0ZXJJbmZvKHNvcnRlclN0YXRlcykge1xuICB2YXIgbGlzdCA9IHNvcnRlclN0YXRlcy5maWx0ZXIoZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgdmFyIHNvcnRPcmRlciA9IF9yZWYzLnNvcnRPcmRlcjtcbiAgICByZXR1cm4gc29ydE9yZGVyO1xuICB9KS5tYXAoc3RhdGVUb0luZm8pO1xuICAvLyA9PT09PT09PT09PSBMZWdhY3kgY29tcGF0aWJsZSBzdXBwb3J0ID09PT09PT09PT09XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vcHVsbC8xOTIyNlxuICBpZiAobGlzdC5sZW5ndGggPT09IDAgJiYgc29ydGVyU3RhdGVzLmxlbmd0aCkge1xuICAgIHJldHVybiBfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgc3RhdGVUb0luZm8oc29ydGVyU3RhdGVzW3NvcnRlclN0YXRlcy5sZW5ndGggLSAxXSkpLCB7XG4gICAgICBjb2x1bW46IHVuZGVmaW5lZFxuICAgIH0pO1xuICB9XG4gIGlmIChsaXN0Lmxlbmd0aCA8PSAxKSB7XG4gICAgcmV0dXJuIGxpc3RbMF0gfHwge307XG4gIH1cbiAgcmV0dXJuIGxpc3Q7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0U29ydERhdGEoZGF0YSwgc29ydFN0YXRlcywgY2hpbGRyZW5Db2x1bW5OYW1lKSB7XG4gIHZhciBpbm5lclNvcnRlclN0YXRlcyA9IHNvcnRTdGF0ZXMuc2xpY2UoKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGIubXVsdGlwbGVQcmlvcml0eSAtIGEubXVsdGlwbGVQcmlvcml0eTtcbiAgfSk7XG4gIHZhciBjbG9uZURhdGEgPSBkYXRhLnNsaWNlKCk7XG4gIHZhciBydW5uaW5nU29ydGVycyA9IGlubmVyU29ydGVyU3RhdGVzLmZpbHRlcihmdW5jdGlvbiAoX3JlZjQpIHtcbiAgICB2YXIgc29ydGVyID0gX3JlZjQuY29sdW1uLnNvcnRlcixcbiAgICAgIHNvcnRPcmRlciA9IF9yZWY0LnNvcnRPcmRlcjtcbiAgICByZXR1cm4gZ2V0U29ydEZ1bmN0aW9uKHNvcnRlcikgJiYgc29ydE9yZGVyO1xuICB9KTtcbiAgLy8gU2tpcCBpZiBubyBzb3J0ZXIgbmVlZGVkXG4gIGlmICghcnVubmluZ1NvcnRlcnMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGNsb25lRGF0YTtcbiAgfVxuICByZXR1cm4gY2xvbmVEYXRhLnNvcnQoZnVuY3Rpb24gKHJlY29yZDEsIHJlY29yZDIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJ1bm5pbmdTb3J0ZXJzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB2YXIgc29ydGVyU3RhdGUgPSBydW5uaW5nU29ydGVyc1tpXTtcbiAgICAgIHZhciBzb3J0ZXIgPSBzb3J0ZXJTdGF0ZS5jb2x1bW4uc29ydGVyLFxuICAgICAgICBzb3J0T3JkZXIgPSBzb3J0ZXJTdGF0ZS5zb3J0T3JkZXI7XG4gICAgICB2YXIgY29tcGFyZUZuID0gZ2V0U29ydEZ1bmN0aW9uKHNvcnRlcik7XG4gICAgICBpZiAoY29tcGFyZUZuICYmIHNvcnRPcmRlcikge1xuICAgICAgICB2YXIgY29tcGFyZVJlc3VsdCA9IGNvbXBhcmVGbihyZWNvcmQxLCByZWNvcmQyLCBzb3J0T3JkZXIpO1xuICAgICAgICBpZiAoY29tcGFyZVJlc3VsdCAhPT0gMCkge1xuICAgICAgICAgIHJldHVybiBzb3J0T3JkZXIgPT09IEFTQ0VORCA/IGNvbXBhcmVSZXN1bHQgOiAtY29tcGFyZVJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfSkubWFwKGZ1bmN0aW9uIChyZWNvcmQpIHtcbiAgICB2YXIgc3ViUmVjb3JkcyA9IHJlY29yZFtjaGlsZHJlbkNvbHVtbk5hbWVdO1xuICAgIGlmIChzdWJSZWNvcmRzKSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoX2V4dGVuZHMoe30sIHJlY29yZCksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgY2hpbGRyZW5Db2x1bW5OYW1lLCBnZXRTb3J0RGF0YShzdWJSZWNvcmRzLCBzb3J0U3RhdGVzLCBjaGlsZHJlbkNvbHVtbk5hbWUpKSk7XG4gICAgfVxuICAgIHJldHVybiByZWNvcmQ7XG4gIH0pO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlRmlsdGVyU29ydGVyKF9yZWY1KSB7XG4gIHZhciBwcmVmaXhDbHMgPSBfcmVmNS5wcmVmaXhDbHMsXG4gICAgbWVyZ2VkQ29sdW1ucyA9IF9yZWY1Lm1lcmdlZENvbHVtbnMsXG4gICAgb25Tb3J0ZXJDaGFuZ2UgPSBfcmVmNS5vblNvcnRlckNoYW5nZSxcbiAgICBzb3J0RGlyZWN0aW9ucyA9IF9yZWY1LnNvcnREaXJlY3Rpb25zLFxuICAgIHRhYmxlTG9jYWxlID0gX3JlZjUudGFibGVMb2NhbGUsXG4gICAgc2hvd1NvcnRlclRvb2x0aXAgPSBfcmVmNS5zaG93U29ydGVyVG9vbHRpcDtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGNvbGxlY3RTb3J0U3RhdGVzKG1lcmdlZENvbHVtbnMsIHRydWUpKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBzb3J0U3RhdGVzID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRTb3J0U3RhdGVzID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIG1lcmdlZFNvcnRlclN0YXRlcyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWxpZGF0ZSA9IHRydWU7XG4gICAgdmFyIGNvbGxlY3RlZFN0YXRlcyA9IGNvbGxlY3RTb3J0U3RhdGVzKG1lcmdlZENvbHVtbnMsIGZhbHNlKTtcbiAgICAvLyBSZXR1cm4gaWYgbm90IGNvbnRyb2xsZWRcbiAgICBpZiAoIWNvbGxlY3RlZFN0YXRlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBzb3J0U3RhdGVzO1xuICAgIH1cbiAgICB2YXIgdmFsaWRhdGVTdGF0ZXMgPSBbXTtcbiAgICBmdW5jdGlvbiBwYXRjaFN0YXRlcyhzdGF0ZSkge1xuICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgIHZhbGlkYXRlU3RhdGVzLnB1c2goc3RhdGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsaWRhdGVTdGF0ZXMucHVzaChfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgc3RhdGUpLCB7XG4gICAgICAgICAgc29ydE9yZGVyOiBudWxsXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIG11bHRpcGxlTW9kZSA9IG51bGw7XG4gICAgY29sbGVjdGVkU3RhdGVzLmZvckVhY2goZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICBpZiAobXVsdGlwbGVNb2RlID09PSBudWxsKSB7XG4gICAgICAgIHBhdGNoU3RhdGVzKHN0YXRlKTtcbiAgICAgICAgaWYgKHN0YXRlLnNvcnRPcmRlcikge1xuICAgICAgICAgIGlmIChzdGF0ZS5tdWx0aXBsZVByaW9yaXR5ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdmFsaWRhdGUgPSBmYWxzZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbXVsdGlwbGVNb2RlID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobXVsdGlwbGVNb2RlICYmIHN0YXRlLm11bHRpcGxlUHJpb3JpdHkgIT09IGZhbHNlKSB7XG4gICAgICAgIHBhdGNoU3RhdGVzKHN0YXRlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbGlkYXRlID0gZmFsc2U7XG4gICAgICAgIHBhdGNoU3RhdGVzKHN0YXRlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdmFsaWRhdGVTdGF0ZXM7XG4gIH0sIFttZXJnZWRDb2x1bW5zLCBzb3J0U3RhdGVzXSk7XG4gIC8vIEdldCByZW5kZXIgY29sdW1ucyB0aXRsZSByZXF1aXJlZCBwcm9wc1xuICB2YXIgY29sdW1uVGl0bGVTb3J0ZXJQcm9wcyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBzb3J0Q29sdW1ucyA9IG1lcmdlZFNvcnRlclN0YXRlcy5tYXAoZnVuY3Rpb24gKF9yZWY2KSB7XG4gICAgICB2YXIgY29sdW1uID0gX3JlZjYuY29sdW1uLFxuICAgICAgICBzb3J0T3JkZXIgPSBfcmVmNi5zb3J0T3JkZXI7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgICAgb3JkZXI6IHNvcnRPcmRlclxuICAgICAgfTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgc29ydENvbHVtbnM6IHNvcnRDb2x1bW5zLFxuICAgICAgLy8gTGVnYWN5XG4gICAgICBzb3J0Q29sdW1uOiBzb3J0Q29sdW1uc1swXSAmJiBzb3J0Q29sdW1uc1swXS5jb2x1bW4sXG4gICAgICBzb3J0T3JkZXI6IHNvcnRDb2x1bW5zWzBdICYmIHNvcnRDb2x1bW5zWzBdLm9yZGVyXG4gICAgfTtcbiAgfSwgW21lcmdlZFNvcnRlclN0YXRlc10pO1xuICBmdW5jdGlvbiB0cmlnZ2VyU29ydGVyKHNvcnRTdGF0ZSkge1xuICAgIHZhciBuZXdTb3J0ZXJTdGF0ZXM7XG4gICAgaWYgKHNvcnRTdGF0ZS5tdWx0aXBsZVByaW9yaXR5ID09PSBmYWxzZSB8fCAhbWVyZ2VkU29ydGVyU3RhdGVzLmxlbmd0aCB8fCBtZXJnZWRTb3J0ZXJTdGF0ZXNbMF0ubXVsdGlwbGVQcmlvcml0eSA9PT0gZmFsc2UpIHtcbiAgICAgIG5ld1NvcnRlclN0YXRlcyA9IFtzb3J0U3RhdGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdTb3J0ZXJTdGF0ZXMgPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KG1lcmdlZFNvcnRlclN0YXRlcy5maWx0ZXIoZnVuY3Rpb24gKF9yZWY3KSB7XG4gICAgICAgIHZhciBrZXkgPSBfcmVmNy5rZXk7XG4gICAgICAgIHJldHVybiBrZXkgIT09IHNvcnRTdGF0ZS5rZXk7XG4gICAgICB9KSksIFtzb3J0U3RhdGVdKTtcbiAgICB9XG4gICAgc2V0U29ydFN0YXRlcyhuZXdTb3J0ZXJTdGF0ZXMpO1xuICAgIG9uU29ydGVyQ2hhbmdlKGdlbmVyYXRlU29ydGVySW5mbyhuZXdTb3J0ZXJTdGF0ZXMpLCBuZXdTb3J0ZXJTdGF0ZXMpO1xuICB9XG4gIHZhciB0cmFuc2Zvcm1Db2x1bW5zID0gZnVuY3Rpb24gdHJhbnNmb3JtQ29sdW1ucyhpbm5lckNvbHVtbnMpIHtcbiAgICByZXR1cm4gaW5qZWN0U29ydGVyKHByZWZpeENscywgaW5uZXJDb2x1bW5zLCBtZXJnZWRTb3J0ZXJTdGF0ZXMsIHRyaWdnZXJTb3J0ZXIsIHNvcnREaXJlY3Rpb25zLCB0YWJsZUxvY2FsZSwgc2hvd1NvcnRlclRvb2x0aXApO1xuICB9O1xuICB2YXIgZ2V0U29ydGVycyA9IGZ1bmN0aW9uIGdldFNvcnRlcnMoKSB7XG4gICAgcmV0dXJuIGdlbmVyYXRlU29ydGVySW5mbyhtZXJnZWRTb3J0ZXJTdGF0ZXMpO1xuICB9O1xuICByZXR1cm4gW3RyYW5zZm9ybUNvbHVtbnMsIG1lcmdlZFNvcnRlclN0YXRlcywgY29sdW1uVGl0bGVTb3J0ZXJQcm9wcywgZ2V0U29ydGVyc107XG59IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyByZW5kZXJDb2x1bW5UaXRsZSB9IGZyb20gJy4uL3V0aWwnO1xuZnVuY3Rpb24gZmlsbFRpdGxlKGNvbHVtbnMsIGNvbHVtblRpdGxlUHJvcHMpIHtcbiAgcmV0dXJuIGNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICB2YXIgY2xvbmVDb2x1bW4gPSBfZXh0ZW5kcyh7fSwgY29sdW1uKTtcbiAgICBjbG9uZUNvbHVtbi50aXRsZSA9IHJlbmRlckNvbHVtblRpdGxlKGNvbHVtbi50aXRsZSwgY29sdW1uVGl0bGVQcm9wcyk7XG4gICAgaWYgKCdjaGlsZHJlbicgaW4gY2xvbmVDb2x1bW4pIHtcbiAgICAgIGNsb25lQ29sdW1uLmNoaWxkcmVuID0gZmlsbFRpdGxlKGNsb25lQ29sdW1uLmNoaWxkcmVuLCBjb2x1bW5UaXRsZVByb3BzKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsb25lQ29sdW1uO1xuICB9KTtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVRpdGxlQ29sdW1ucyhjb2x1bW5UaXRsZVByb3BzKSB7XG4gIHZhciBmaWxsZWRDb2x1bW5zID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGNvbHVtbnMpIHtcbiAgICByZXR1cm4gZmlsbFRpdGxlKGNvbHVtbnMsIGNvbHVtblRpdGxlUHJvcHMpO1xuICB9LCBbY29sdW1uVGl0bGVQcm9wc10pO1xuICByZXR1cm4gW2ZpbGxlZENvbHVtbnNdO1xufSIsImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUmNUYWJsZSwgeyBTdW1tYXJ5IH0gZnJvbSAncmMtdGFibGUnO1xuaW1wb3J0IHsgY29udmVydENoaWxkcmVuVG9Db2x1bW5zIH0gZnJvbSBcInJjLXRhYmxlL2VzL2hvb2tzL3VzZUNvbHVtbnNcIjtcbmltcG9ydCB7IElOVEVSTkFMX0hPT0tTIH0gZnJvbSBcInJjLXRhYmxlL2VzL1RhYmxlXCI7XG5pbXBvcnQgb21pdCBmcm9tIFwicmMtdXRpbC9lcy9vbWl0XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL2NvbnRleHQnO1xuaW1wb3J0IGRlZmF1bHRSZW5kZXJFbXB0eSBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvZGVmYXVsdFJlbmRlckVtcHR5JztcbmltcG9ydCBTaXplQ29udGV4dCBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvU2l6ZUNvbnRleHQnO1xuaW1wb3J0IHVzZUJyZWFrcG9pbnQgZnJvbSAnLi4vZ3JpZC9ob29rcy91c2VCcmVha3BvaW50JztcbmltcG9ydCBkZWZhdWx0TG9jYWxlIGZyb20gJy4uL2xvY2FsZS9lbl9VUyc7XG5pbXBvcnQgUGFnaW5hdGlvbiBmcm9tICcuLi9wYWdpbmF0aW9uJztcbmltcG9ydCBTcGluIGZyb20gJy4uL3NwaW4nO1xuaW1wb3J0IHNjcm9sbFRvIGZyb20gJy4uL191dGlsL3Njcm9sbFRvJztcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4uL191dGlsL3dhcm5pbmcnO1xuaW1wb3J0IENvbHVtbiBmcm9tICcuL0NvbHVtbic7XG5pbXBvcnQgQ29sdW1uR3JvdXAgZnJvbSAnLi9Db2x1bW5Hcm91cCc7XG5pbXBvcnQgcmVuZGVyRXhwYW5kSWNvbiBmcm9tICcuL0V4cGFuZEljb24nO1xuaW1wb3J0IHVzZUZpbHRlciwgeyBnZXRGaWx0ZXJEYXRhIH0gZnJvbSAnLi9ob29rcy91c2VGaWx0ZXInO1xuaW1wb3J0IHVzZUxhenlLVk1hcCBmcm9tICcuL2hvb2tzL3VzZUxhenlLVk1hcCc7XG5pbXBvcnQgdXNlUGFnaW5hdGlvbiwgeyBERUZBVUxUX1BBR0VfU0laRSwgZ2V0UGFnaW5hdGlvblBhcmFtIH0gZnJvbSAnLi9ob29rcy91c2VQYWdpbmF0aW9uJztcbmltcG9ydCB1c2VTZWxlY3Rpb24sIHsgU0VMRUNUSU9OX0FMTCwgU0VMRUNUSU9OX0NPTFVNTiwgU0VMRUNUSU9OX0lOVkVSVCwgU0VMRUNUSU9OX05PTkUgfSBmcm9tICcuL2hvb2tzL3VzZVNlbGVjdGlvbic7XG5pbXBvcnQgdXNlU29ydGVyLCB7IGdldFNvcnREYXRhIH0gZnJvbSAnLi9ob29rcy91c2VTb3J0ZXInO1xuaW1wb3J0IHVzZVRpdGxlQ29sdW1ucyBmcm9tICcuL2hvb2tzL3VzZVRpdGxlQ29sdW1ucyc7XG52YXIgRU1QVFlfTElTVCA9IFtdO1xuZnVuY3Rpb24gSW50ZXJuYWxUYWJsZShwcm9wcywgcmVmKSB7XG4gIHZhciBfY2xhc3NOYW1lczM7XG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgY3VzdG9taXplU2l6ZSA9IHByb3BzLnNpemUsXG4gICAgYm9yZGVyZWQgPSBwcm9wcy5ib3JkZXJlZCxcbiAgICBjdXN0b21pemVEcm9wZG93blByZWZpeENscyA9IHByb3BzLmRyb3Bkb3duUHJlZml4Q2xzLFxuICAgIGRhdGFTb3VyY2UgPSBwcm9wcy5kYXRhU291cmNlLFxuICAgIHBhZ2luYXRpb24gPSBwcm9wcy5wYWdpbmF0aW9uLFxuICAgIHJvd1NlbGVjdGlvbiA9IHByb3BzLnJvd1NlbGVjdGlvbixcbiAgICBfcHJvcHMkcm93S2V5ID0gcHJvcHMucm93S2V5LFxuICAgIHJvd0tleSA9IF9wcm9wcyRyb3dLZXkgPT09IHZvaWQgMCA/ICdrZXknIDogX3Byb3BzJHJvd0tleSxcbiAgICByb3dDbGFzc05hbWUgPSBwcm9wcy5yb3dDbGFzc05hbWUsXG4gICAgY29sdW1ucyA9IHByb3BzLmNvbHVtbnMsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBsZWdhY3lDaGlsZHJlbkNvbHVtbk5hbWUgPSBwcm9wcy5jaGlsZHJlbkNvbHVtbk5hbWUsXG4gICAgb25DaGFuZ2UgPSBwcm9wcy5vbkNoYW5nZSxcbiAgICBnZXRQb3B1cENvbnRhaW5lciA9IHByb3BzLmdldFBvcHVwQ29udGFpbmVyLFxuICAgIGxvYWRpbmcgPSBwcm9wcy5sb2FkaW5nLFxuICAgIGV4cGFuZEljb24gPSBwcm9wcy5leHBhbmRJY29uLFxuICAgIGV4cGFuZGFibGUgPSBwcm9wcy5leHBhbmRhYmxlLFxuICAgIGV4cGFuZGVkUm93UmVuZGVyID0gcHJvcHMuZXhwYW5kZWRSb3dSZW5kZXIsXG4gICAgZXhwYW5kSWNvbkNvbHVtbkluZGV4ID0gcHJvcHMuZXhwYW5kSWNvbkNvbHVtbkluZGV4LFxuICAgIGluZGVudFNpemUgPSBwcm9wcy5pbmRlbnRTaXplLFxuICAgIHNjcm9sbCA9IHByb3BzLnNjcm9sbCxcbiAgICBzb3J0RGlyZWN0aW9ucyA9IHByb3BzLnNvcnREaXJlY3Rpb25zLFxuICAgIGxvY2FsZSA9IHByb3BzLmxvY2FsZSxcbiAgICBfcHJvcHMkc2hvd1NvcnRlclRvb2wgPSBwcm9wcy5zaG93U29ydGVyVG9vbHRpcCxcbiAgICBzaG93U29ydGVyVG9vbHRpcCA9IF9wcm9wcyRzaG93U29ydGVyVG9vbCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRzaG93U29ydGVyVG9vbDtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghKHR5cGVvZiByb3dLZXkgPT09ICdmdW5jdGlvbicgJiYgcm93S2V5Lmxlbmd0aCA+IDEpLCAnVGFibGUnLCAnYGluZGV4YCBwYXJhbWV0ZXIgb2YgYHJvd0tleWAgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZC4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgaXQgd2lsbCB3b3JrIGFzIGV4cGVjdGVkLicpIDogdm9pZCAwO1xuICBbWydmaWx0ZXJEcm9wZG93blZpc2libGUnLCAnZmlsdGVyRHJvcGRvd25PcGVuJ10sIFsnb25GaWx0ZXJEcm9wZG93blZpc2libGVDaGFuZ2UnLCAnb25GaWx0ZXJEcm9wZG93bk9wZW5DaGFuZ2UnXV0uZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBfcmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDIpLFxuICAgICAgZGVwcmVjYXRlZE5hbWUgPSBfcmVmMlswXSxcbiAgICAgIG5ld05hbWUgPSBfcmVmMlsxXTtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCEoZGVwcmVjYXRlZE5hbWUgaW4gcHJvcHMpLCAnVGFibGUnLCBcImBcIi5jb25jYXQoZGVwcmVjYXRlZE5hbWUsIFwiYCBpcyBkZXByZWNhdGVkIHdoaWNoIHdpbGwgYmUgcmVtb3ZlZCBpbiBuZXh0IG1ham9yIHZlcnNpb24uUGxlYXNlIHVzZSBgXCIpLmNvbmNhdChuZXdOYW1lLCBcImAgaW5zdGVhZC4gXCIpKSA6IHZvaWQgMDtcbiAgfSk7XG4gIHZhciBiYXNlQ29sdW1ucyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjb2x1bW5zIHx8IGNvbnZlcnRDaGlsZHJlblRvQ29sdW1ucyhjaGlsZHJlbik7XG4gIH0sIFtjb2x1bW5zLCBjaGlsZHJlbl0pO1xuICB2YXIgbmVlZFJlc3BvbnNpdmUgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gYmFzZUNvbHVtbnMuc29tZShmdW5jdGlvbiAoY29sKSB7XG4gICAgICByZXR1cm4gY29sLnJlc3BvbnNpdmU7XG4gICAgfSk7XG4gIH0sIFtiYXNlQ29sdW1uc10pO1xuICB2YXIgc2NyZWVucyA9IHVzZUJyZWFrcG9pbnQobmVlZFJlc3BvbnNpdmUpO1xuICB2YXIgbWVyZ2VkQ29sdW1ucyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBtYXRjaGVkID0gbmV3IFNldChPYmplY3Qua2V5cyhzY3JlZW5zKS5maWx0ZXIoZnVuY3Rpb24gKG0pIHtcbiAgICAgIHJldHVybiBzY3JlZW5zW21dO1xuICAgIH0pKTtcbiAgICByZXR1cm4gYmFzZUNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjKSB7XG4gICAgICByZXR1cm4gIWMucmVzcG9uc2l2ZSB8fCBjLnJlc3BvbnNpdmUuc29tZShmdW5jdGlvbiAocikge1xuICAgICAgICByZXR1cm4gbWF0Y2hlZC5oYXMocik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSwgW2Jhc2VDb2x1bW5zLCBzY3JlZW5zXSk7XG4gIHZhciB0YWJsZVByb3BzID0gb21pdChwcm9wcywgWydjbGFzc05hbWUnLCAnc3R5bGUnLCAnY29sdW1ucyddKTtcbiAgdmFyIHNpemUgPSBSZWFjdC51c2VDb250ZXh0KFNpemVDb250ZXh0KTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBfUmVhY3QkdXNlQ29udGV4dCRsb2MgPSBfUmVhY3QkdXNlQ29udGV4dC5sb2NhbGUsXG4gICAgY29udGV4dExvY2FsZSA9IF9SZWFjdCR1c2VDb250ZXh0JGxvYyA9PT0gdm9pZCAwID8gZGVmYXVsdExvY2FsZSA6IF9SZWFjdCR1c2VDb250ZXh0JGxvYyxcbiAgICByZW5kZXJFbXB0eSA9IF9SZWFjdCR1c2VDb250ZXh0LnJlbmRlckVtcHR5LFxuICAgIGRpcmVjdGlvbiA9IF9SZWFjdCR1c2VDb250ZXh0LmRpcmVjdGlvbjtcbiAgdmFyIG1lcmdlZFNpemUgPSBjdXN0b21pemVTaXplIHx8IHNpemU7XG4gIHZhciB0YWJsZUxvY2FsZSA9IF9leHRlbmRzKF9leHRlbmRzKHt9LCBjb250ZXh0TG9jYWxlLlRhYmxlKSwgbG9jYWxlKTtcbiAgdmFyIHJhd0RhdGEgPSBkYXRhU291cmNlIHx8IEVNUFRZX0xJU1Q7XG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dDIgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0Mi5nZXRQcmVmaXhDbHM7XG4gIHZhciBwcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoJ3RhYmxlJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIGRyb3Bkb3duUHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdkcm9wZG93bicsIGN1c3RvbWl6ZURyb3Bkb3duUHJlZml4Q2xzKTtcbiAgdmFyIG1lcmdlZEV4cGFuZGFibGUgPSBfZXh0ZW5kcyh7XG4gICAgY2hpbGRyZW5Db2x1bW5OYW1lOiBsZWdhY3lDaGlsZHJlbkNvbHVtbk5hbWUsXG4gICAgZXhwYW5kSWNvbkNvbHVtbkluZGV4OiBleHBhbmRJY29uQ29sdW1uSW5kZXhcbiAgfSwgZXhwYW5kYWJsZSk7XG4gIHZhciBfbWVyZ2VkRXhwYW5kYWJsZSRjaGkgPSBtZXJnZWRFeHBhbmRhYmxlLmNoaWxkcmVuQ29sdW1uTmFtZSxcbiAgICBjaGlsZHJlbkNvbHVtbk5hbWUgPSBfbWVyZ2VkRXhwYW5kYWJsZSRjaGkgPT09IHZvaWQgMCA/ICdjaGlsZHJlbicgOiBfbWVyZ2VkRXhwYW5kYWJsZSRjaGk7XG4gIHZhciBleHBhbmRUeXBlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHJhd0RhdGEuc29tZShmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIGl0ZW0gPT09IG51bGwgfHwgaXRlbSA9PT0gdm9pZCAwID8gdm9pZCAwIDogaXRlbVtjaGlsZHJlbkNvbHVtbk5hbWVdO1xuICAgIH0pKSB7XG4gICAgICByZXR1cm4gJ25lc3QnO1xuICAgIH1cbiAgICBpZiAoZXhwYW5kZWRSb3dSZW5kZXIgfHwgZXhwYW5kYWJsZSAmJiBleHBhbmRhYmxlLmV4cGFuZGVkUm93UmVuZGVyKSB7XG4gICAgICByZXR1cm4gJ3Jvdyc7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9LCBbcmF3RGF0YV0pO1xuICB2YXIgaW50ZXJuYWxSZWZzID0ge1xuICAgIGJvZHk6IFJlYWN0LnVzZVJlZigpXG4gIH07XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUm93S2V5ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGdldFJvd0tleSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmICh0eXBlb2Ygcm93S2V5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gcm93S2V5O1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKHJlY29yZCkge1xuICAgICAgcmV0dXJuIHJlY29yZCA9PT0gbnVsbCB8fCByZWNvcmQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlY29yZFtyb3dLZXldO1xuICAgIH07XG4gIH0sIFtyb3dLZXldKTtcbiAgdmFyIF91c2VMYXp5S1ZNYXAgPSB1c2VMYXp5S1ZNYXAocmF3RGF0YSwgY2hpbGRyZW5Db2x1bW5OYW1lLCBnZXRSb3dLZXkpLFxuICAgIF91c2VMYXp5S1ZNYXAyID0gX3NsaWNlZFRvQXJyYXkoX3VzZUxhenlLVk1hcCwgMSksXG4gICAgZ2V0UmVjb3JkQnlLZXkgPSBfdXNlTGF6eUtWTWFwMlswXTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFdmVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGNoYW5nZUV2ZW50SW5mbyA9IHt9O1xuICB2YXIgdHJpZ2dlck9uQ2hhbmdlID0gZnVuY3Rpb24gdHJpZ2dlck9uQ2hhbmdlKGluZm8sIGFjdGlvbikge1xuICAgIHZhciByZXNldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZmFsc2U7XG4gICAgdmFyIGNoYW5nZUluZm8gPSBfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgY2hhbmdlRXZlbnRJbmZvKSwgaW5mbyk7XG4gICAgaWYgKHJlc2V0KSB7XG4gICAgICBjaGFuZ2VFdmVudEluZm8ucmVzZXRQYWdpbmF0aW9uKCk7XG4gICAgICAvLyBSZXNldCBldmVudCBwYXJhbVxuICAgICAgaWYgKGNoYW5nZUluZm8ucGFnaW5hdGlvbi5jdXJyZW50KSB7XG4gICAgICAgIGNoYW5nZUluZm8ucGFnaW5hdGlvbi5jdXJyZW50ID0gMTtcbiAgICAgIH1cbiAgICAgIC8vIFRyaWdnZXIgcGFnaW5hdGlvbiBldmVudHNcbiAgICAgIGlmIChwYWdpbmF0aW9uICYmIHBhZ2luYXRpb24ub25DaGFuZ2UpIHtcbiAgICAgICAgcGFnaW5hdGlvbi5vbkNoYW5nZSgxLCBjaGFuZ2VJbmZvLnBhZ2luYXRpb24ucGFnZVNpemUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2Nyb2xsICYmIHNjcm9sbC5zY3JvbGxUb0ZpcnN0Um93T25DaGFuZ2UgIT09IGZhbHNlICYmIGludGVybmFsUmVmcy5ib2R5LmN1cnJlbnQpIHtcbiAgICAgIHNjcm9sbFRvKDAsIHtcbiAgICAgICAgZ2V0Q29udGFpbmVyOiBmdW5jdGlvbiBnZXRDb250YWluZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIGludGVybmFsUmVmcy5ib2R5LmN1cnJlbnQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UoY2hhbmdlSW5mby5wYWdpbmF0aW9uLCBjaGFuZ2VJbmZvLmZpbHRlcnMsIGNoYW5nZUluZm8uc29ydGVyLCB7XG4gICAgICBjdXJyZW50RGF0YVNvdXJjZTogZ2V0RmlsdGVyRGF0YShnZXRTb3J0RGF0YShyYXdEYXRhLCBjaGFuZ2VJbmZvLnNvcnRlclN0YXRlcywgY2hpbGRyZW5Db2x1bW5OYW1lKSwgY2hhbmdlSW5mby5maWx0ZXJTdGF0ZXMpLFxuICAgICAgYWN0aW9uOiBhY3Rpb25cbiAgICB9KTtcbiAgfTtcbiAgLyoqXG4gICAqIENvbnRyb2xsZWQgc3RhdGUgaW4gYGNvbHVtbnNgIGlzIG5vdCBhIGdvb2QgaWRlYSB0aGF0IG1ha2VzIHRvbyBtYW55IGNvZGUgKDEwMDArIGxpbmU/KSB0byByZWFkXG4gICAqIHN0YXRlIG91dCBhbmQgdGhlbiBwdXQgaXQgYmFjayB0byB0aXRsZSByZW5kZXIuIE1vdmUgdGhlc2UgY29kZSBpbnRvIGBob29rc2AgYnV0IHN0aWxsIHRvb1xuICAgKiBjb21wbGV4LiBXZSBzaG91bGQgcHJvdmlkZXMgVGFibGUgcHJvcHMgbGlrZSBgc29ydGVyYCAmIGBmaWx0ZXJgIHRvIGhhbmRsZSBjb250cm9sIGluIG5leHQgYmlnXG4gICAqIHZlcnNpb24uXG4gICAqL1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNvcnRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb25Tb3J0ZXJDaGFuZ2UgPSBmdW5jdGlvbiBvblNvcnRlckNoYW5nZShzb3J0ZXIsIHNvcnRlclN0YXRlcykge1xuICAgIHRyaWdnZXJPbkNoYW5nZSh7XG4gICAgICBzb3J0ZXI6IHNvcnRlcixcbiAgICAgIHNvcnRlclN0YXRlczogc29ydGVyU3RhdGVzXG4gICAgfSwgJ3NvcnQnLCBmYWxzZSk7XG4gIH07XG4gIHZhciBfdXNlU29ydGVyID0gdXNlU29ydGVyKHtcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgbWVyZ2VkQ29sdW1uczogbWVyZ2VkQ29sdW1ucyxcbiAgICAgIG9uU29ydGVyQ2hhbmdlOiBvblNvcnRlckNoYW5nZSxcbiAgICAgIHNvcnREaXJlY3Rpb25zOiBzb3J0RGlyZWN0aW9ucyB8fCBbJ2FzY2VuZCcsICdkZXNjZW5kJ10sXG4gICAgICB0YWJsZUxvY2FsZTogdGFibGVMb2NhbGUsXG4gICAgICBzaG93U29ydGVyVG9vbHRpcDogc2hvd1NvcnRlclRvb2x0aXBcbiAgICB9KSxcbiAgICBfdXNlU29ydGVyMiA9IF9zbGljZWRUb0FycmF5KF91c2VTb3J0ZXIsIDQpLFxuICAgIHRyYW5zZm9ybVNvcnRlckNvbHVtbnMgPSBfdXNlU29ydGVyMlswXSxcbiAgICBzb3J0U3RhdGVzID0gX3VzZVNvcnRlcjJbMV0sXG4gICAgc29ydGVyVGl0bGVQcm9wcyA9IF91c2VTb3J0ZXIyWzJdLFxuICAgIGdldFNvcnRlcnMgPSBfdXNlU29ydGVyMlszXTtcbiAgdmFyIHNvcnRlZERhdGEgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZ2V0U29ydERhdGEocmF3RGF0YSwgc29ydFN0YXRlcywgY2hpbGRyZW5Db2x1bW5OYW1lKTtcbiAgfSwgW3Jhd0RhdGEsIHNvcnRTdGF0ZXNdKTtcbiAgY2hhbmdlRXZlbnRJbmZvLnNvcnRlciA9IGdldFNvcnRlcnMoKTtcbiAgY2hhbmdlRXZlbnRJbmZvLnNvcnRlclN0YXRlcyA9IHNvcnRTdGF0ZXM7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRmlsdGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG9uRmlsdGVyQ2hhbmdlID0gZnVuY3Rpb24gb25GaWx0ZXJDaGFuZ2UoZmlsdGVycywgZmlsdGVyU3RhdGVzKSB7XG4gICAgdHJpZ2dlck9uQ2hhbmdlKHtcbiAgICAgIGZpbHRlcnM6IGZpbHRlcnMsXG4gICAgICBmaWx0ZXJTdGF0ZXM6IGZpbHRlclN0YXRlc1xuICAgIH0sICdmaWx0ZXInLCB0cnVlKTtcbiAgfTtcbiAgdmFyIF91c2VGaWx0ZXIgPSB1c2VGaWx0ZXIoe1xuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICBsb2NhbGU6IHRhYmxlTG9jYWxlLFxuICAgICAgZHJvcGRvd25QcmVmaXhDbHM6IGRyb3Bkb3duUHJlZml4Q2xzLFxuICAgICAgbWVyZ2VkQ29sdW1uczogbWVyZ2VkQ29sdW1ucyxcbiAgICAgIG9uRmlsdGVyQ2hhbmdlOiBvbkZpbHRlckNoYW5nZSxcbiAgICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lclxuICAgIH0pLFxuICAgIF91c2VGaWx0ZXIyID0gX3NsaWNlZFRvQXJyYXkoX3VzZUZpbHRlciwgMyksXG4gICAgdHJhbnNmb3JtRmlsdGVyQ29sdW1ucyA9IF91c2VGaWx0ZXIyWzBdLFxuICAgIGZpbHRlclN0YXRlcyA9IF91c2VGaWx0ZXIyWzFdLFxuICAgIGZpbHRlcnMgPSBfdXNlRmlsdGVyMlsyXTtcbiAgdmFyIG1lcmdlZERhdGEgPSBnZXRGaWx0ZXJEYXRhKHNvcnRlZERhdGEsIGZpbHRlclN0YXRlcyk7XG4gIGNoYW5nZUV2ZW50SW5mby5maWx0ZXJzID0gZmlsdGVycztcbiAgY2hhbmdlRXZlbnRJbmZvLmZpbHRlclN0YXRlcyA9IGZpbHRlclN0YXRlcztcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDb2x1bW4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgY29sdW1uVGl0bGVQcm9wcyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBtZXJnZWRGaWx0ZXJzID0ge307XG4gICAgT2JqZWN0LmtleXMoZmlsdGVycykuZm9yRWFjaChmdW5jdGlvbiAoZmlsdGVyS2V5KSB7XG4gICAgICBpZiAoZmlsdGVyc1tmaWx0ZXJLZXldICE9PSBudWxsKSB7XG4gICAgICAgIG1lcmdlZEZpbHRlcnNbZmlsdGVyS2V5XSA9IGZpbHRlcnNbZmlsdGVyS2V5XTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gX2V4dGVuZHMoX2V4dGVuZHMoe30sIHNvcnRlclRpdGxlUHJvcHMpLCB7XG4gICAgICBmaWx0ZXJzOiBtZXJnZWRGaWx0ZXJzXG4gICAgfSk7XG4gIH0sIFtzb3J0ZXJUaXRsZVByb3BzLCBmaWx0ZXJzXSk7XG4gIHZhciBfdXNlVGl0bGVDb2x1bW5zID0gdXNlVGl0bGVDb2x1bW5zKGNvbHVtblRpdGxlUHJvcHMpLFxuICAgIF91c2VUaXRsZUNvbHVtbnMyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVRpdGxlQ29sdW1ucywgMSksXG4gICAgdHJhbnNmb3JtVGl0bGVDb2x1bW5zID0gX3VzZVRpdGxlQ29sdW1uczJbMF07XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFBhZ2luYXRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG9uUGFnaW5hdGlvbkNoYW5nZSA9IGZ1bmN0aW9uIG9uUGFnaW5hdGlvbkNoYW5nZShjdXJyZW50LCBwYWdlU2l6ZSkge1xuICAgIHRyaWdnZXJPbkNoYW5nZSh7XG4gICAgICBwYWdpbmF0aW9uOiBfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgY2hhbmdlRXZlbnRJbmZvLnBhZ2luYXRpb24pLCB7XG4gICAgICAgIGN1cnJlbnQ6IGN1cnJlbnQsXG4gICAgICAgIHBhZ2VTaXplOiBwYWdlU2l6ZVxuICAgICAgfSlcbiAgICB9LCAncGFnaW5hdGUnKTtcbiAgfTtcbiAgdmFyIF91c2VQYWdpbmF0aW9uID0gdXNlUGFnaW5hdGlvbihtZXJnZWREYXRhLmxlbmd0aCwgcGFnaW5hdGlvbiwgb25QYWdpbmF0aW9uQ2hhbmdlKSxcbiAgICBfdXNlUGFnaW5hdGlvbjIgPSBfc2xpY2VkVG9BcnJheShfdXNlUGFnaW5hdGlvbiwgMiksXG4gICAgbWVyZ2VkUGFnaW5hdGlvbiA9IF91c2VQYWdpbmF0aW9uMlswXSxcbiAgICByZXNldFBhZ2luYXRpb24gPSBfdXNlUGFnaW5hdGlvbjJbMV07XG4gIGNoYW5nZUV2ZW50SW5mby5wYWdpbmF0aW9uID0gcGFnaW5hdGlvbiA9PT0gZmFsc2UgPyB7fSA6IGdldFBhZ2luYXRpb25QYXJhbShwYWdpbmF0aW9uLCBtZXJnZWRQYWdpbmF0aW9uKTtcbiAgY2hhbmdlRXZlbnRJbmZvLnJlc2V0UGFnaW5hdGlvbiA9IHJlc2V0UGFnaW5hdGlvbjtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRGF0YSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgcGFnZURhdGEgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocGFnaW5hdGlvbiA9PT0gZmFsc2UgfHwgIW1lcmdlZFBhZ2luYXRpb24ucGFnZVNpemUpIHtcbiAgICAgIHJldHVybiBtZXJnZWREYXRhO1xuICAgIH1cbiAgICB2YXIgX21lcmdlZFBhZ2luYXRpb24kY3VyID0gbWVyZ2VkUGFnaW5hdGlvbi5jdXJyZW50LFxuICAgICAgY3VycmVudCA9IF9tZXJnZWRQYWdpbmF0aW9uJGN1ciA9PT0gdm9pZCAwID8gMSA6IF9tZXJnZWRQYWdpbmF0aW9uJGN1cixcbiAgICAgIHRvdGFsID0gbWVyZ2VkUGFnaW5hdGlvbi50b3RhbCxcbiAgICAgIF9tZXJnZWRQYWdpbmF0aW9uJHBhZyA9IG1lcmdlZFBhZ2luYXRpb24ucGFnZVNpemUsXG4gICAgICBwYWdlU2l6ZSA9IF9tZXJnZWRQYWdpbmF0aW9uJHBhZyA9PT0gdm9pZCAwID8gREVGQVVMVF9QQUdFX1NJWkUgOiBfbWVyZ2VkUGFnaW5hdGlvbiRwYWc7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhjdXJyZW50ID4gMCwgJ1RhYmxlJywgJ2BjdXJyZW50YCBzaG91bGQgYmUgcG9zaXRpdmUgbnVtYmVyLicpIDogdm9pZCAwO1xuICAgIC8vIER5bmFtaWMgdGFibGUgZGF0YVxuICAgIGlmIChtZXJnZWREYXRhLmxlbmd0aCA8IHRvdGFsKSB7XG4gICAgICBpZiAobWVyZ2VkRGF0YS5sZW5ndGggPiBwYWdlU2l6ZSkge1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGZhbHNlLCAnVGFibGUnLCAnYGRhdGFTb3VyY2VgIGxlbmd0aCBpcyBsZXNzIHRoYW4gYHBhZ2luYXRpb24udG90YWxgIGJ1dCBsYXJnZSB0aGFuIGBwYWdpbmF0aW9uLnBhZ2VTaXplYC4gUGxlYXNlIG1ha2Ugc3VyZSB5b3VyIGNvbmZpZyBjb3JyZWN0IGRhdGEgd2l0aCBhc3luYyBtb2RlLicpIDogdm9pZCAwO1xuICAgICAgICByZXR1cm4gbWVyZ2VkRGF0YS5zbGljZSgoY3VycmVudCAtIDEpICogcGFnZVNpemUsIGN1cnJlbnQgKiBwYWdlU2l6ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWVyZ2VkRGF0YTtcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZERhdGEuc2xpY2UoKGN1cnJlbnQgLSAxKSAqIHBhZ2VTaXplLCBjdXJyZW50ICogcGFnZVNpemUpO1xuICB9LCBbISFwYWdpbmF0aW9uLCBtZXJnZWREYXRhLCBtZXJnZWRQYWdpbmF0aW9uICYmIG1lcmdlZFBhZ2luYXRpb24uY3VycmVudCwgbWVyZ2VkUGFnaW5hdGlvbiAmJiBtZXJnZWRQYWdpbmF0aW9uLnBhZ2VTaXplLCBtZXJnZWRQYWdpbmF0aW9uICYmIG1lcmdlZFBhZ2luYXRpb24udG90YWxdKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gU2VsZWN0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZVNlbGVjdGlvbiA9IHVzZVNlbGVjdGlvbihyb3dTZWxlY3Rpb24sIHtcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgZGF0YTogbWVyZ2VkRGF0YSxcbiAgICAgIHBhZ2VEYXRhOiBwYWdlRGF0YSxcbiAgICAgIGdldFJvd0tleTogZ2V0Um93S2V5LFxuICAgICAgZ2V0UmVjb3JkQnlLZXk6IGdldFJlY29yZEJ5S2V5LFxuICAgICAgZXhwYW5kVHlwZTogZXhwYW5kVHlwZSxcbiAgICAgIGNoaWxkcmVuQ29sdW1uTmFtZTogY2hpbGRyZW5Db2x1bW5OYW1lLFxuICAgICAgbG9jYWxlOiB0YWJsZUxvY2FsZSxcbiAgICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lclxuICAgIH0pLFxuICAgIF91c2VTZWxlY3Rpb24yID0gX3NsaWNlZFRvQXJyYXkoX3VzZVNlbGVjdGlvbiwgMiksXG4gICAgdHJhbnNmb3JtU2VsZWN0aW9uQ29sdW1ucyA9IF91c2VTZWxlY3Rpb24yWzBdLFxuICAgIHNlbGVjdGVkS2V5U2V0ID0gX3VzZVNlbGVjdGlvbjJbMV07XG4gIHZhciBpbnRlcm5hbFJvd0NsYXNzTmFtZSA9IGZ1bmN0aW9uIGludGVybmFsUm93Q2xhc3NOYW1lKHJlY29yZCwgaW5kZXgsIGluZGVudCkge1xuICAgIHZhciBtZXJnZWRSb3dDbGFzc05hbWU7XG4gICAgaWYgKHR5cGVvZiByb3dDbGFzc05hbWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG1lcmdlZFJvd0NsYXNzTmFtZSA9IGNsYXNzTmFtZXMocm93Q2xhc3NOYW1lKHJlY29yZCwgaW5kZXgsIGluZGVudCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtZXJnZWRSb3dDbGFzc05hbWUgPSBjbGFzc05hbWVzKHJvd0NsYXNzTmFtZSk7XG4gICAgfVxuICAgIHJldHVybiBjbGFzc05hbWVzKF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1yb3ctc2VsZWN0ZWRcIiksIHNlbGVjdGVkS2V5U2V0LmhhcyhnZXRSb3dLZXkocmVjb3JkLCBpbmRleCkpKSwgbWVyZ2VkUm93Q2xhc3NOYW1lKTtcbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gRXhwYW5kYWJsZSA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQYXNzIG9yaWdpbiByZW5kZXIgc3RhdHVzIGludG8gYHJjLXRhYmxlYCwgdGhpcyBjYW4gYmUgcmVtb3ZlZCB3aGVuIHJlZmFjdG9yIHdpdGggYHJjLXRhYmxlYFxuICBtZXJnZWRFeHBhbmRhYmxlLl9fUEFSRU5UX1JFTkRFUl9JQ09OX18gPSBtZXJnZWRFeHBhbmRhYmxlLmV4cGFuZEljb247XG4gIC8vIEN1c3RvbWl6ZSBleHBhbmRhYmxlIGljb25cbiAgbWVyZ2VkRXhwYW5kYWJsZS5leHBhbmRJY29uID0gbWVyZ2VkRXhwYW5kYWJsZS5leHBhbmRJY29uIHx8IGV4cGFuZEljb24gfHwgcmVuZGVyRXhwYW5kSWNvbih0YWJsZUxvY2FsZSk7XG4gIC8vIEFkanVzdCBleHBhbmQgaWNvbiBpbmRleCwgbm8gb3ZlcndyaXRlIGV4cGFuZEljb25Db2x1bW5JbmRleCBpZiBzZXQuXG4gIGlmIChleHBhbmRUeXBlID09PSAnbmVzdCcgJiYgbWVyZ2VkRXhwYW5kYWJsZS5leHBhbmRJY29uQ29sdW1uSW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgIG1lcmdlZEV4cGFuZGFibGUuZXhwYW5kSWNvbkNvbHVtbkluZGV4ID0gcm93U2VsZWN0aW9uID8gMSA6IDA7XG4gIH0gZWxzZSBpZiAobWVyZ2VkRXhwYW5kYWJsZS5leHBhbmRJY29uQ29sdW1uSW5kZXggPiAwICYmIHJvd1NlbGVjdGlvbikge1xuICAgIG1lcmdlZEV4cGFuZGFibGUuZXhwYW5kSWNvbkNvbHVtbkluZGV4IC09IDE7XG4gIH1cbiAgLy8gSW5kZW50IHNpemVcbiAgaWYgKHR5cGVvZiBtZXJnZWRFeHBhbmRhYmxlLmluZGVudFNpemUgIT09ICdudW1iZXInKSB7XG4gICAgbWVyZ2VkRXhwYW5kYWJsZS5pbmRlbnRTaXplID0gdHlwZW9mIGluZGVudFNpemUgPT09ICdudW1iZXInID8gaW5kZW50U2l6ZSA6IDE1O1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHRyYW5zZm9ybUNvbHVtbnMgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoaW5uZXJDb2x1bW5zKSB7XG4gICAgcmV0dXJuIHRyYW5zZm9ybVRpdGxlQ29sdW1ucyh0cmFuc2Zvcm1TZWxlY3Rpb25Db2x1bW5zKHRyYW5zZm9ybUZpbHRlckNvbHVtbnModHJhbnNmb3JtU29ydGVyQ29sdW1ucyhpbm5lckNvbHVtbnMpKSkpO1xuICB9LCBbdHJhbnNmb3JtU29ydGVyQ29sdW1ucywgdHJhbnNmb3JtRmlsdGVyQ29sdW1ucywgdHJhbnNmb3JtU2VsZWN0aW9uQ29sdW1uc10pO1xuICB2YXIgdG9wUGFnaW5hdGlvbk5vZGU7XG4gIHZhciBib3R0b21QYWdpbmF0aW9uTm9kZTtcbiAgaWYgKHBhZ2luYXRpb24gIT09IGZhbHNlICYmIChtZXJnZWRQYWdpbmF0aW9uID09PSBudWxsIHx8IG1lcmdlZFBhZ2luYXRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1lcmdlZFBhZ2luYXRpb24udG90YWwpKSB7XG4gICAgdmFyIHBhZ2luYXRpb25TaXplO1xuICAgIGlmIChtZXJnZWRQYWdpbmF0aW9uLnNpemUpIHtcbiAgICAgIHBhZ2luYXRpb25TaXplID0gbWVyZ2VkUGFnaW5hdGlvbi5zaXplO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYWdpbmF0aW9uU2l6ZSA9IG1lcmdlZFNpemUgPT09ICdzbWFsbCcgfHwgbWVyZ2VkU2l6ZSA9PT0gJ21pZGRsZScgPyAnc21hbGwnIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICB2YXIgcmVuZGVyUGFnaW5hdGlvbiA9IGZ1bmN0aW9uIHJlbmRlclBhZ2luYXRpb24ocG9zaXRpb24pIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQYWdpbmF0aW9uLCBfZXh0ZW5kcyh7fSwgbWVyZ2VkUGFnaW5hdGlvbiwge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1wYWdpbmF0aW9uIFwiKS5jb25jYXQocHJlZml4Q2xzLCBcIi1wYWdpbmF0aW9uLVwiKS5jb25jYXQocG9zaXRpb24pLCBtZXJnZWRQYWdpbmF0aW9uLmNsYXNzTmFtZSksXG4gICAgICAgIHNpemU6IHBhZ2luYXRpb25TaXplXG4gICAgICB9KSk7XG4gICAgfTtcbiAgICB2YXIgZGVmYXVsdFBvc2l0aW9uID0gZGlyZWN0aW9uID09PSAncnRsJyA/ICdsZWZ0JyA6ICdyaWdodCc7XG4gICAgdmFyIHBvc2l0aW9uID0gbWVyZ2VkUGFnaW5hdGlvbi5wb3NpdGlvbjtcbiAgICBpZiAocG9zaXRpb24gIT09IG51bGwgJiYgQXJyYXkuaXNBcnJheShwb3NpdGlvbikpIHtcbiAgICAgIHZhciB0b3BQb3MgPSBwb3NpdGlvbi5maW5kKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIHJldHVybiBwLmluY2x1ZGVzKCd0b3AnKTtcbiAgICAgIH0pO1xuICAgICAgdmFyIGJvdHRvbVBvcyA9IHBvc2l0aW9uLmZpbmQoZnVuY3Rpb24gKHApIHtcbiAgICAgICAgcmV0dXJuIHAuaW5jbHVkZXMoJ2JvdHRvbScpO1xuICAgICAgfSk7XG4gICAgICB2YXIgaXNEaXNhYmxlID0gcG9zaXRpb24uZXZlcnkoZnVuY3Rpb24gKHApIHtcbiAgICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KHApID09PSAnbm9uZSc7XG4gICAgICB9KTtcbiAgICAgIGlmICghdG9wUG9zICYmICFib3R0b21Qb3MgJiYgIWlzRGlzYWJsZSkge1xuICAgICAgICBib3R0b21QYWdpbmF0aW9uTm9kZSA9IHJlbmRlclBhZ2luYXRpb24oZGVmYXVsdFBvc2l0aW9uKTtcbiAgICAgIH1cbiAgICAgIGlmICh0b3BQb3MpIHtcbiAgICAgICAgdG9wUGFnaW5hdGlvbk5vZGUgPSByZW5kZXJQYWdpbmF0aW9uKHRvcFBvcy50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoJ3RvcCcsICcnKSk7XG4gICAgICB9XG4gICAgICBpZiAoYm90dG9tUG9zKSB7XG4gICAgICAgIGJvdHRvbVBhZ2luYXRpb25Ob2RlID0gcmVuZGVyUGFnaW5hdGlvbihib3R0b21Qb3MudG9Mb3dlckNhc2UoKS5yZXBsYWNlKCdib3R0b20nLCAnJykpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBib3R0b21QYWdpbmF0aW9uTm9kZSA9IHJlbmRlclBhZ2luYXRpb24oZGVmYXVsdFBvc2l0aW9uKTtcbiAgICB9XG4gIH1cbiAgLy8gPj4+Pj4+Pj4+IFNwaW5uaW5nXG4gIHZhciBzcGluUHJvcHM7XG4gIGlmICh0eXBlb2YgbG9hZGluZyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgc3BpblByb3BzID0ge1xuICAgICAgc3Bpbm5pbmc6IGxvYWRpbmdcbiAgICB9O1xuICB9IGVsc2UgaWYgKF90eXBlb2YobG9hZGluZykgPT09ICdvYmplY3QnKSB7XG4gICAgc3BpblByb3BzID0gX2V4dGVuZHMoe1xuICAgICAgc3Bpbm5pbmc6IHRydWVcbiAgICB9LCBsb2FkaW5nKTtcbiAgfVxuICB2YXIgd3JhcHBlckNsYXNzTmFtZXMgPSBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItd3JhcHBlclwiKSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXdyYXBwZXItcnRsXCIpLCBkaXJlY3Rpb24gPT09ICdydGwnKSwgY2xhc3NOYW1lKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICByZWY6IHJlZixcbiAgICBjbGFzc05hbWU6IHdyYXBwZXJDbGFzc05hbWVzLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTcGluLCBfZXh0ZW5kcyh7XG4gICAgc3Bpbm5pbmc6IGZhbHNlXG4gIH0sIHNwaW5Qcm9wcyksIHRvcFBhZ2luYXRpb25Ob2RlLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSY1RhYmxlLCBfZXh0ZW5kcyh7fSwgdGFibGVQcm9wcywge1xuICAgIGNvbHVtbnM6IG1lcmdlZENvbHVtbnMsXG4gICAgZGlyZWN0aW9uOiBkaXJlY3Rpb24sXG4gICAgZXhwYW5kYWJsZTogbWVyZ2VkRXhwYW5kYWJsZSxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoKF9jbGFzc05hbWVzMyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW1pZGRsZVwiKSwgbWVyZ2VkU2l6ZSA9PT0gJ21pZGRsZScpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNtYWxsXCIpLCBtZXJnZWRTaXplID09PSAnc21hbGwnKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ib3JkZXJlZFwiKSwgYm9yZGVyZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWVtcHR5XCIpLCByYXdEYXRhLmxlbmd0aCA9PT0gMCksIF9jbGFzc05hbWVzMykpLFxuICAgIGRhdGE6IHBhZ2VEYXRhLFxuICAgIHJvd0tleTogZ2V0Um93S2V5LFxuICAgIHJvd0NsYXNzTmFtZTogaW50ZXJuYWxSb3dDbGFzc05hbWUsXG4gICAgZW1wdHlUZXh0OiBsb2NhbGUgJiYgbG9jYWxlLmVtcHR5VGV4dCB8fCAocmVuZGVyRW1wdHkgfHwgZGVmYXVsdFJlbmRlckVtcHR5KSgnVGFibGUnKSxcbiAgICAvLyBJbnRlcm5hbFxuICAgIGludGVybmFsSG9va3M6IElOVEVSTkFMX0hPT0tTLFxuICAgIGludGVybmFsUmVmczogaW50ZXJuYWxSZWZzLFxuICAgIHRyYW5zZm9ybUNvbHVtbnM6IHRyYW5zZm9ybUNvbHVtbnNcbiAgfSkpLCBib3R0b21QYWdpbmF0aW9uTm9kZSkpO1xufVxudmFyIEZvcndhcmRUYWJsZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKEludGVybmFsVGFibGUpO1xudmFyIFRhYmxlID0gRm9yd2FyZFRhYmxlO1xuVGFibGUuU0VMRUNUSU9OX0NPTFVNTiA9IFNFTEVDVElPTl9DT0xVTU47XG5UYWJsZS5FWFBBTkRfQ09MVU1OID0gUmNUYWJsZS5FWFBBTkRfQ09MVU1OO1xuVGFibGUuU0VMRUNUSU9OX0FMTCA9IFNFTEVDVElPTl9BTEw7XG5UYWJsZS5TRUxFQ1RJT05fSU5WRVJUID0gU0VMRUNUSU9OX0lOVkVSVDtcblRhYmxlLlNFTEVDVElPTl9OT05FID0gU0VMRUNUSU9OX05PTkU7XG5UYWJsZS5Db2x1bW4gPSBDb2x1bW47XG5UYWJsZS5Db2x1bW5Hcm91cCA9IENvbHVtbkdyb3VwO1xuVGFibGUuU3VtbWFyeSA9IFN1bW1hcnk7XG5leHBvcnQgZGVmYXVsdCBUYWJsZTsiLCIvLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbnZhciBEZWxldGVPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNMzYwIDE4NGgtOGM0LjQgMCA4LTMuNiA4LTh2OGgzMDR2LThjMCA0LjQgMy42IDggOCA4aC04djcyaDcydi04MGMwLTM1LjMtMjguNy02NC02NC02NEgzNTJjLTM1LjMgMC02NCAyOC43LTY0IDY0djgwaDcydi03MnptNTA0IDcySDE2MGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ2MzJjMCA0LjQgMy42IDggOCA4aDYwLjRsMjQuNyA1MjNjMS42IDM0LjEgMjkuOCA2MSA2My45IDYxaDQ1NGMzNC4yIDAgNjIuMy0yNi44IDYzLjktNjFsMjQuNy01MjNIODg4YzQuNCAwIDgtMy42IDgtOHYtMzJjMC0xNy43LTE0LjMtMzItMzItMzJ6TTczMS4zIDg0MEgyOTIuN2wtMjQuMi01MTJoNDg3bC0yNC4yIDUxMnpcIiB9IH1dIH0sIFwibmFtZVwiOiBcImRlbGV0ZVwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0IGRlZmF1bHQgRGVsZXRlT3V0bGluZWQ7XG4iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBEZWxldGVPdXRsaW5lZFN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9EZWxldGVPdXRsaW5lZFwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIERlbGV0ZU91dGxpbmVkID0gZnVuY3Rpb24gRGVsZXRlT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IERlbGV0ZU91dGxpbmVkU3ZnXG4gIH0pKTtcbn07XG5EZWxldGVPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdEZWxldGVPdXRsaW5lZCc7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihEZWxldGVPdXRsaW5lZCk7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIExlZ2FjeVNlbGVjdENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmV4cG9ydCBkZWZhdWx0IExlZ2FjeVNlbGVjdENvbnRleHQ7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIFRyZWVTZWxlY3RDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5leHBvcnQgZGVmYXVsdCBUcmVlU2VsZWN0Q29udGV4dDsiLCJleHBvcnQgZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IFt2YWx1ZV0gOiBbXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmaWxsRmllbGROYW1lcyhmaWVsZE5hbWVzKSB7XG4gIHZhciBfcmVmID0gZmllbGROYW1lcyB8fCB7fSxcbiAgICAgIGxhYmVsID0gX3JlZi5sYWJlbCxcbiAgICAgIHZhbHVlID0gX3JlZi52YWx1ZSxcbiAgICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcblxuICB2YXIgbWVyZ2VkVmFsdWUgPSB2YWx1ZSB8fCAndmFsdWUnO1xuICByZXR1cm4ge1xuICAgIF90aXRsZTogbGFiZWwgPyBbbGFiZWxdIDogWyd0aXRsZScsICdsYWJlbCddLFxuICAgIHZhbHVlOiBtZXJnZWRWYWx1ZSxcbiAgICBrZXk6IG1lcmdlZFZhbHVlLFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlbiB8fCAnY2hpbGRyZW4nXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gaXNDaGVja0Rpc2FibGVkKG5vZGUpIHtcbiAgcmV0dXJuICFub2RlIHx8IG5vZGUuZGlzYWJsZWQgfHwgbm9kZS5kaXNhYmxlQ2hlY2tib3ggfHwgbm9kZS5jaGVja2FibGUgPT09IGZhbHNlO1xufVxuLyoqIExvb3AgZmV0Y2ggYWxsIHRoZSBrZXlzIGV4aXN0IGluIHRoZSB0cmVlICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGxLZXlzKHRyZWVEYXRhLCBmaWVsZE5hbWVzKSB7XG4gIHZhciBrZXlzID0gW107XG5cbiAgZnVuY3Rpb24gZGlnKGxpc3QpIHtcbiAgICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBjaGlsZHJlbiA9IGl0ZW1bZmllbGROYW1lcy5jaGlsZHJlbl07XG5cbiAgICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgICBrZXlzLnB1c2goaXRlbVtmaWVsZE5hbWVzLnZhbHVlXSk7XG4gICAgICAgIGRpZyhjaGlsZHJlbik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBkaWcodHJlZURhdGEpO1xuICByZXR1cm4ga2V5cztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc05pbCh2YWwpIHtcbiAgcmV0dXJuIHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZDtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBLZXlDb2RlIGZyb20gXCJyYy11dGlsL2VzL0tleUNvZGVcIjtcbmltcG9ydCB1c2VNZW1vIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lbW9cIjtcbmltcG9ydCB7IHVzZUJhc2VQcm9wcyB9IGZyb20gJ3JjLXNlbGVjdCc7XG5pbXBvcnQgVHJlZSBmcm9tICdyYy10cmVlJztcbmltcG9ydCBMZWdhY3lDb250ZXh0IGZyb20gXCIuL0xlZ2FjeUNvbnRleHRcIjtcbmltcG9ydCBUcmVlU2VsZWN0Q29udGV4dCBmcm9tIFwiLi9UcmVlU2VsZWN0Q29udGV4dFwiO1xuaW1wb3J0IHsgZ2V0QWxsS2V5cywgaXNDaGVja0Rpc2FibGVkIH0gZnJvbSBcIi4vdXRpbHMvdmFsdWVVdGlsXCI7XG52YXIgSElEREVOX1NUWUxFID0ge1xuICB3aWR0aDogMCxcbiAgaGVpZ2h0OiAwLFxuICBkaXNwbGF5OiAnZmxleCcsXG4gIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgb3BhY2l0eTogMCxcbiAgYm9yZGVyOiAwLFxuICBwYWRkaW5nOiAwLFxuICBtYXJnaW46IDBcbn07XG5cbnZhciBPcHRpb25MaXN0ID0gZnVuY3Rpb24gT3B0aW9uTGlzdChfLCByZWYpIHtcbiAgdmFyIF91c2VCYXNlUHJvcHMgPSB1c2VCYXNlUHJvcHMoKSxcbiAgICAgIHByZWZpeENscyA9IF91c2VCYXNlUHJvcHMucHJlZml4Q2xzLFxuICAgICAgbXVsdGlwbGUgPSBfdXNlQmFzZVByb3BzLm11bHRpcGxlLFxuICAgICAgc2VhcmNoVmFsdWUgPSBfdXNlQmFzZVByb3BzLnNlYXJjaFZhbHVlLFxuICAgICAgdG9nZ2xlT3BlbiA9IF91c2VCYXNlUHJvcHMudG9nZ2xlT3BlbixcbiAgICAgIG9wZW4gPSBfdXNlQmFzZVByb3BzLm9wZW4sXG4gICAgICBub3RGb3VuZENvbnRlbnQgPSBfdXNlQmFzZVByb3BzLm5vdEZvdW5kQ29udGVudDtcblxuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFRyZWVTZWxlY3RDb250ZXh0KSxcbiAgICAgIHZpcnR1YWwgPSBfUmVhY3QkdXNlQ29udGV4dC52aXJ0dWFsLFxuICAgICAgbGlzdEhlaWdodCA9IF9SZWFjdCR1c2VDb250ZXh0Lmxpc3RIZWlnaHQsXG4gICAgICBsaXN0SXRlbUhlaWdodCA9IF9SZWFjdCR1c2VDb250ZXh0Lmxpc3RJdGVtSGVpZ2h0LFxuICAgICAgdHJlZURhdGEgPSBfUmVhY3QkdXNlQ29udGV4dC50cmVlRGF0YSxcbiAgICAgIGZpZWxkTmFtZXMgPSBfUmVhY3QkdXNlQ29udGV4dC5maWVsZE5hbWVzLFxuICAgICAgb25TZWxlY3QgPSBfUmVhY3QkdXNlQ29udGV4dC5vblNlbGVjdCxcbiAgICAgIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCA9IF9SZWFjdCR1c2VDb250ZXh0LmRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCxcbiAgICAgIHRyZWVFeHBhbmRBY3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC50cmVlRXhwYW5kQWN0aW9uO1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dDIgPSBSZWFjdC51c2VDb250ZXh0KExlZ2FjeUNvbnRleHQpLFxuICAgICAgY2hlY2thYmxlID0gX1JlYWN0JHVzZUNvbnRleHQyLmNoZWNrYWJsZSxcbiAgICAgIGNoZWNrZWRLZXlzID0gX1JlYWN0JHVzZUNvbnRleHQyLmNoZWNrZWRLZXlzLFxuICAgICAgaGFsZkNoZWNrZWRLZXlzID0gX1JlYWN0JHVzZUNvbnRleHQyLmhhbGZDaGVja2VkS2V5cyxcbiAgICAgIHRyZWVFeHBhbmRlZEtleXMgPSBfUmVhY3QkdXNlQ29udGV4dDIudHJlZUV4cGFuZGVkS2V5cyxcbiAgICAgIHRyZWVEZWZhdWx0RXhwYW5kQWxsID0gX1JlYWN0JHVzZUNvbnRleHQyLnRyZWVEZWZhdWx0RXhwYW5kQWxsLFxuICAgICAgdHJlZURlZmF1bHRFeHBhbmRlZEtleXMgPSBfUmVhY3QkdXNlQ29udGV4dDIudHJlZURlZmF1bHRFeHBhbmRlZEtleXMsXG4gICAgICBvblRyZWVFeHBhbmQgPSBfUmVhY3QkdXNlQ29udGV4dDIub25UcmVlRXhwYW5kLFxuICAgICAgdHJlZUljb24gPSBfUmVhY3QkdXNlQ29udGV4dDIudHJlZUljb24sXG4gICAgICBzaG93VHJlZUljb24gPSBfUmVhY3QkdXNlQ29udGV4dDIuc2hvd1RyZWVJY29uLFxuICAgICAgc3dpdGNoZXJJY29uID0gX1JlYWN0JHVzZUNvbnRleHQyLnN3aXRjaGVySWNvbixcbiAgICAgIHRyZWVMaW5lID0gX1JlYWN0JHVzZUNvbnRleHQyLnRyZWVMaW5lLFxuICAgICAgdHJlZU5vZGVGaWx0ZXJQcm9wID0gX1JlYWN0JHVzZUNvbnRleHQyLnRyZWVOb2RlRmlsdGVyUHJvcCxcbiAgICAgIGxvYWREYXRhID0gX1JlYWN0JHVzZUNvbnRleHQyLmxvYWREYXRhLFxuICAgICAgdHJlZUxvYWRlZEtleXMgPSBfUmVhY3QkdXNlQ29udGV4dDIudHJlZUxvYWRlZEtleXMsXG4gICAgICB0cmVlTW90aW9uID0gX1JlYWN0JHVzZUNvbnRleHQyLnRyZWVNb3Rpb24sXG4gICAgICBvblRyZWVMb2FkID0gX1JlYWN0JHVzZUNvbnRleHQyLm9uVHJlZUxvYWQsXG4gICAgICBrZXlFbnRpdGllcyA9IF9SZWFjdCR1c2VDb250ZXh0Mi5rZXlFbnRpdGllcztcblxuICB2YXIgdHJlZVJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICB2YXIgbWVtb1RyZWVEYXRhID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRyZWVEYXRhO1xuICB9LCBbb3BlbiwgdHJlZURhdGFdLCBmdW5jdGlvbiAocHJldiwgbmV4dCkge1xuICAgIHJldHVybiBuZXh0WzBdICYmIHByZXZbMV0gIT09IG5leHRbMV07XG4gIH0pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBWYWx1ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgbWVyZ2VkQ2hlY2tlZEtleXMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWNoZWNrYWJsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNoZWNrZWQ6IGNoZWNrZWRLZXlzLFxuICAgICAgaGFsZkNoZWNrZWQ6IGhhbGZDaGVja2VkS2V5c1xuICAgIH07XG4gIH0sIFtjaGVja2FibGUsIGNoZWNrZWRLZXlzLCBoYWxmQ2hlY2tlZEtleXNdKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gU2Nyb2xsID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAvLyBTaW5nbGUgbW9kZSBzaG91bGQgc2Nyb2xsIHRvIGN1cnJlbnQga2V5XG4gICAgaWYgKG9wZW4gJiYgIW11bHRpcGxlICYmIGNoZWNrZWRLZXlzLmxlbmd0aCkge1xuICAgICAgdmFyIF90cmVlUmVmJGN1cnJlbnQ7XG5cbiAgICAgIChfdHJlZVJlZiRjdXJyZW50ID0gdHJlZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfdHJlZVJlZiRjdXJyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdHJlZVJlZiRjdXJyZW50LnNjcm9sbFRvKHtcbiAgICAgICAga2V5OiBjaGVja2VkS2V5c1swXVxuICAgICAgfSk7XG4gICAgfVxuICB9LCBbb3Blbl0pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBTZWFyY2ggPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgbG93ZXJTZWFyY2hWYWx1ZSA9IFN0cmluZyhzZWFyY2hWYWx1ZSkudG9Mb3dlckNhc2UoKTtcblxuICB2YXIgZmlsdGVyVHJlZU5vZGUgPSBmdW5jdGlvbiBmaWx0ZXJUcmVlTm9kZSh0cmVlTm9kZSkge1xuICAgIGlmICghbG93ZXJTZWFyY2hWYWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBTdHJpbmcodHJlZU5vZGVbdHJlZU5vZGVGaWx0ZXJQcm9wXSkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlclNlYXJjaFZhbHVlKTtcbiAgfTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IEtleXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUodHJlZURlZmF1bHRFeHBhbmRlZEtleXMpLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgICBleHBhbmRlZEtleXMgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgICAgc2V0RXhwYW5kZWRLZXlzID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKG51bGwpLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTMsIDIpLFxuICAgICAgc2VhcmNoRXhwYW5kZWRLZXlzID0gX1JlYWN0JHVzZVN0YXRlNFswXSxcbiAgICAgIHNldFNlYXJjaEV4cGFuZGVkS2V5cyA9IF9SZWFjdCR1c2VTdGF0ZTRbMV07XG5cbiAgdmFyIG1lcmdlZEV4cGFuZGVkS2V5cyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmICh0cmVlRXhwYW5kZWRLZXlzKSB7XG4gICAgICByZXR1cm4gX3RvQ29uc3VtYWJsZUFycmF5KHRyZWVFeHBhbmRlZEtleXMpO1xuICAgIH1cblxuICAgIHJldHVybiBzZWFyY2hWYWx1ZSA/IHNlYXJjaEV4cGFuZGVkS2V5cyA6IGV4cGFuZGVkS2V5cztcbiAgfSwgW2V4cGFuZGVkS2V5cywgc2VhcmNoRXhwYW5kZWRLZXlzLCB0cmVlRXhwYW5kZWRLZXlzLCBzZWFyY2hWYWx1ZV0pO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChzZWFyY2hWYWx1ZSkge1xuICAgICAgc2V0U2VhcmNoRXhwYW5kZWRLZXlzKGdldEFsbEtleXModHJlZURhdGEsIGZpZWxkTmFtZXMpKTtcbiAgICB9XG4gIH0sIFtzZWFyY2hWYWx1ZV0pO1xuXG4gIHZhciBvbkludGVybmFsRXhwYW5kID0gZnVuY3Rpb24gb25JbnRlcm5hbEV4cGFuZChrZXlzKSB7XG4gICAgc2V0RXhwYW5kZWRLZXlzKGtleXMpO1xuICAgIHNldFNlYXJjaEV4cGFuZGVkS2V5cyhrZXlzKTtcblxuICAgIGlmIChvblRyZWVFeHBhbmQpIHtcbiAgICAgIG9uVHJlZUV4cGFuZChrZXlzKTtcbiAgICB9XG4gIH07IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IEV2ZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIG9uTGlzdE1vdXNlRG93biA9IGZ1bmN0aW9uIG9uTGlzdE1vdXNlRG93bihldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH07XG5cbiAgdmFyIG9uSW50ZXJuYWxTZWxlY3QgPSBmdW5jdGlvbiBvbkludGVybmFsU2VsZWN0KF9fLCBpbmZvKSB7XG4gICAgdmFyIG5vZGUgPSBpbmZvLm5vZGU7XG5cbiAgICBpZiAoY2hlY2thYmxlICYmIGlzQ2hlY2tEaXNhYmxlZChub2RlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG9uU2VsZWN0KG5vZGUua2V5LCB7XG4gICAgICBzZWxlY3RlZDogIWNoZWNrZWRLZXlzLmluY2x1ZGVzKG5vZGUua2V5KVxuICAgIH0pO1xuXG4gICAgaWYgKCFtdWx0aXBsZSkge1xuICAgICAgdG9nZ2xlT3BlbihmYWxzZSk7XG4gICAgfVxuICB9OyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IEtleWJvYXJkID09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGU1ID0gUmVhY3QudXNlU3RhdGUobnVsbCksXG4gICAgICBfUmVhY3QkdXNlU3RhdGU2ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlNSwgMiksXG4gICAgICBhY3RpdmVLZXkgPSBfUmVhY3QkdXNlU3RhdGU2WzBdLFxuICAgICAgc2V0QWN0aXZlS2V5ID0gX1JlYWN0JHVzZVN0YXRlNlsxXTtcblxuICB2YXIgYWN0aXZlRW50aXR5ID0ga2V5RW50aXRpZXNbYWN0aXZlS2V5XTtcbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3RyZWVSZWYkY3VycmVudDI7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2Nyb2xsVG86IChfdHJlZVJlZiRjdXJyZW50MiA9IHRyZWVSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX3RyZWVSZWYkY3VycmVudDIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90cmVlUmVmJGN1cnJlbnQyLnNjcm9sbFRvLFxuICAgICAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oZXZlbnQpIHtcbiAgICAgICAgdmFyIF90cmVlUmVmJGN1cnJlbnQzO1xuXG4gICAgICAgIHZhciB3aGljaCA9IGV2ZW50LndoaWNoO1xuXG4gICAgICAgIHN3aXRjaCAod2hpY2gpIHtcbiAgICAgICAgICAvLyA+Pj4gQXJyb3cga2V5c1xuICAgICAgICAgIGNhc2UgS2V5Q29kZS5VUDpcbiAgICAgICAgICBjYXNlIEtleUNvZGUuRE9XTjpcbiAgICAgICAgICBjYXNlIEtleUNvZGUuTEVGVDpcbiAgICAgICAgICBjYXNlIEtleUNvZGUuUklHSFQ6XG4gICAgICAgICAgICAoX3RyZWVSZWYkY3VycmVudDMgPSB0cmVlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF90cmVlUmVmJGN1cnJlbnQzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdHJlZVJlZiRjdXJyZW50My5vbktleURvd24oZXZlbnQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgLy8gPj4+IFNlbGVjdCBpdGVtXG5cbiAgICAgICAgICBjYXNlIEtleUNvZGUuRU5URVI6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChhY3RpdmVFbnRpdHkpIHtcbiAgICAgICAgICAgICAgICB2YXIgX3JlZiA9IChhY3RpdmVFbnRpdHkgPT09IG51bGwgfHwgYWN0aXZlRW50aXR5ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhY3RpdmVFbnRpdHkubm9kZSkgfHwge30sXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGUgPSBfcmVmLnNlbGVjdGFibGUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gX3JlZi52YWx1ZTtcblxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RhYmxlICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgb25JbnRlcm5hbFNlbGVjdChudWxsLCB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICBrZXk6IGFjdGl2ZUtleVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZDogIWNoZWNrZWRLZXlzLmluY2x1ZGVzKHZhbHVlKVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgLy8gPj4+IENsb3NlXG5cbiAgICAgICAgICBjYXNlIEtleUNvZGUuRVNDOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0b2dnbGVPcGVuKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uS2V5VXA6IGZ1bmN0aW9uIG9uS2V5VXAoKSB7fVxuICAgIH07XG4gIH0pOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBpZiAobWVtb1RyZWVEYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICByb2xlOiBcImxpc3Rib3hcIixcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1lbXB0eVwiKSxcbiAgICAgIG9uTW91c2VEb3duOiBvbkxpc3RNb3VzZURvd25cbiAgICB9LCBub3RGb3VuZENvbnRlbnQpO1xuICB9XG5cbiAgdmFyIHRyZWVQcm9wcyA9IHtcbiAgICBmaWVsZE5hbWVzOiBmaWVsZE5hbWVzXG4gIH07XG5cbiAgaWYgKHRyZWVMb2FkZWRLZXlzKSB7XG4gICAgdHJlZVByb3BzLmxvYWRlZEtleXMgPSB0cmVlTG9hZGVkS2V5cztcbiAgfVxuXG4gIGlmIChtZXJnZWRFeHBhbmRlZEtleXMpIHtcbiAgICB0cmVlUHJvcHMuZXhwYW5kZWRLZXlzID0gbWVyZ2VkRXhwYW5kZWRLZXlzO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBvbk1vdXNlRG93bjogb25MaXN0TW91c2VEb3duXG4gIH0sIGFjdGl2ZUVudGl0eSAmJiBvcGVuICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgc3R5bGU6IEhJRERFTl9TVFlMRSxcbiAgICBcImFyaWEtbGl2ZVwiOiBcImFzc2VydGl2ZVwiXG4gIH0sIGFjdGl2ZUVudGl0eS5ub2RlLnZhbHVlKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVHJlZSwgX2V4dGVuZHMoe1xuICAgIHJlZjogdHJlZVJlZixcbiAgICBmb2N1c2FibGU6IGZhbHNlLFxuICAgIHByZWZpeENsczogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10cmVlXCIpLFxuICAgIHRyZWVEYXRhOiBtZW1vVHJlZURhdGEsXG4gICAgaGVpZ2h0OiBsaXN0SGVpZ2h0LFxuICAgIGl0ZW1IZWlnaHQ6IGxpc3RJdGVtSGVpZ2h0LFxuICAgIHZpcnR1YWw6IHZpcnR1YWwgIT09IGZhbHNlICYmIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCAhPT0gZmFsc2UsXG4gICAgbXVsdGlwbGU6IG11bHRpcGxlLFxuICAgIGljb246IHRyZWVJY29uLFxuICAgIHNob3dJY29uOiBzaG93VHJlZUljb24sXG4gICAgc3dpdGNoZXJJY29uOiBzd2l0Y2hlckljb24sXG4gICAgc2hvd0xpbmU6IHRyZWVMaW5lLFxuICAgIGxvYWREYXRhOiBzZWFyY2hWYWx1ZSA/IG51bGwgOiBsb2FkRGF0YSxcbiAgICBtb3Rpb246IHRyZWVNb3Rpb24sXG4gICAgYWN0aXZlS2V5OiBhY3RpdmVLZXkgLy8gV2UgaGFuZGxlIGtleXMgYnkgb3V0IGluc3RlYWQgdHJlZSBzZWxmXG4gICAgLFxuICAgIGNoZWNrYWJsZTogY2hlY2thYmxlLFxuICAgIGNoZWNrU3RyaWN0bHk6IHRydWUsXG4gICAgY2hlY2tlZEtleXM6IG1lcmdlZENoZWNrZWRLZXlzLFxuICAgIHNlbGVjdGVkS2V5czogIWNoZWNrYWJsZSA/IGNoZWNrZWRLZXlzIDogW10sXG4gICAgZGVmYXVsdEV4cGFuZEFsbDogdHJlZURlZmF1bHRFeHBhbmRBbGxcbiAgfSwgdHJlZVByb3BzLCB7XG4gICAgLy8gUHJveHkgZXZlbnQgb3V0XG4gICAgb25BY3RpdmVDaGFuZ2U6IHNldEFjdGl2ZUtleSxcbiAgICBvblNlbGVjdDogb25JbnRlcm5hbFNlbGVjdCxcbiAgICBvbkNoZWNrOiBvbkludGVybmFsU2VsZWN0LFxuICAgIG9uRXhwYW5kOiBvbkludGVybmFsRXhwYW5kLFxuICAgIG9uTG9hZDogb25UcmVlTG9hZCxcbiAgICBmaWx0ZXJUcmVlTm9kZTogZmlsdGVyVHJlZU5vZGUsXG4gICAgZXhwYW5kQWN0aW9uOiB0cmVlRXhwYW5kQWN0aW9uXG4gIH0pKSk7XG59O1xuXG52YXIgUmVmT3B0aW9uTGlzdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKE9wdGlvbkxpc3QpO1xuUmVmT3B0aW9uTGlzdC5kaXNwbGF5TmFtZSA9ICdPcHRpb25MaXN0JztcbmV4cG9ydCBkZWZhdWx0IFJlZk9wdGlvbkxpc3Q7IiwiLyogaXN0YW5idWwgaWdub3JlIGZpbGUgKi9cblxuLyoqIFRoaXMgaXMgYSBwbGFjZWhvbGRlciwgbm90IHJlYWwgcmVuZGVyIGluIGRvbSAqL1xudmFyIFRyZWVOb2RlID0gZnVuY3Rpb24gVHJlZU5vZGUoKSB7XG4gIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgVHJlZU5vZGU7IiwiaW1wb3J0IHsgaXNDaGVja0Rpc2FibGVkIH0gZnJvbSBcIi4vdmFsdWVVdGlsXCI7XG5leHBvcnQgdmFyIFNIT1dfQUxMID0gJ1NIT1dfQUxMJztcbmV4cG9ydCB2YXIgU0hPV19QQVJFTlQgPSAnU0hPV19QQVJFTlQnO1xuZXhwb3J0IHZhciBTSE9XX0NISUxEID0gJ1NIT1dfQ0hJTEQnO1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFN0cmF0ZWd5VmFsdWVzKHZhbHVlcywgc3RyYXRlZ3ksIGtleUVudGl0aWVzLCBmaWVsZE5hbWVzKSB7XG4gIHZhciB2YWx1ZVNldCA9IG5ldyBTZXQodmFsdWVzKTtcblxuICBpZiAoc3RyYXRlZ3kgPT09IFNIT1dfQ0hJTEQpIHtcbiAgICByZXR1cm4gdmFsdWVzLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgZW50aXR5ID0ga2V5RW50aXRpZXNba2V5XTtcblxuICAgICAgaWYgKGVudGl0eSAmJiBlbnRpdHkuY2hpbGRyZW4gJiYgZW50aXR5LmNoaWxkcmVuLnNvbWUoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBfcmVmLm5vZGU7XG4gICAgICAgIHJldHVybiB2YWx1ZVNldC5oYXMobm9kZVtmaWVsZE5hbWVzLnZhbHVlXSk7XG4gICAgICB9KSAmJiBlbnRpdHkuY2hpbGRyZW4uZXZlcnkoZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICAgIHZhciBub2RlID0gX3JlZjIubm9kZTtcbiAgICAgICAgcmV0dXJuIGlzQ2hlY2tEaXNhYmxlZChub2RlKSB8fCB2YWx1ZVNldC5oYXMobm9kZVtmaWVsZE5hbWVzLnZhbHVlXSk7XG4gICAgICB9KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKHN0cmF0ZWd5ID09PSBTSE9XX1BBUkVOVCkge1xuICAgIHJldHVybiB2YWx1ZXMuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBlbnRpdHkgPSBrZXlFbnRpdGllc1trZXldO1xuICAgICAgdmFyIHBhcmVudCA9IGVudGl0eSA/IGVudGl0eS5wYXJlbnQgOiBudWxsO1xuXG4gICAgICBpZiAocGFyZW50ICYmICFpc0NoZWNrRGlzYWJsZWQocGFyZW50Lm5vZGUpICYmIHZhbHVlU2V0LmhhcyhwYXJlbnQua2V5KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlcztcbn0iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJjaGlsZHJlblwiLCBcInZhbHVlXCJdO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHRvQXJyYXkgZnJvbSBcInJjLXV0aWwvZXMvQ2hpbGRyZW4vdG9BcnJheVwiO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0IFRyZWVOb2RlIGZyb20gXCIuLi9UcmVlTm9kZVwiO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRDaGlsZHJlblRvRGF0YShub2Rlcykge1xuICByZXR1cm4gdG9BcnJheShub2RlcykubWFwKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgaWYgKCEgLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KG5vZGUpIHx8ICFub2RlLnR5cGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBfcmVmID0gbm9kZSxcbiAgICAgICAga2V5ID0gX3JlZi5rZXksXG4gICAgICAgIF9yZWYkcHJvcHMgPSBfcmVmLnByb3BzLFxuICAgICAgICBjaGlsZHJlbiA9IF9yZWYkcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIHZhbHVlID0gX3JlZiRwcm9wcy52YWx1ZSxcbiAgICAgICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYkcHJvcHMsIF9leGNsdWRlZCk7XG5cbiAgICB2YXIgZGF0YSA9IF9vYmplY3RTcHJlYWQoe1xuICAgICAga2V5OiBrZXksXG4gICAgICB2YWx1ZTogdmFsdWVcbiAgICB9LCByZXN0UHJvcHMpO1xuXG4gICAgdmFyIGNoaWxkRGF0YSA9IGNvbnZlcnRDaGlsZHJlblRvRGF0YShjaGlsZHJlbik7XG5cbiAgICBpZiAoY2hpbGREYXRhLmxlbmd0aCkge1xuICAgICAgZGF0YS5jaGlsZHJlbiA9IGNoaWxkRGF0YTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfSkuZmlsdGVyKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZpbGxMZWdhY3lQcm9wcyhkYXRhTm9kZSkge1xuICBpZiAoIWRhdGFOb2RlKSB7XG4gICAgcmV0dXJuIGRhdGFOb2RlO1xuICB9XG5cbiAgdmFyIGNsb25lTm9kZSA9IF9vYmplY3RTcHJlYWQoe30sIGRhdGFOb2RlKTtcblxuICBpZiAoISgncHJvcHMnIGluIGNsb25lTm9kZSkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xvbmVOb2RlLCAncHJvcHMnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgd2FybmluZyhmYWxzZSwgJ05ldyBgcmMtdHJlZS1zZWxlY3RgIG5vdCBzdXBwb3J0IHJldHVybiBub2RlIGluc3RhbmNlIGFzIGFyZ3VtZW50IGFueW1vcmUuIFBsZWFzZSBjb25zaWRlciB0byByZW1vdmUgYHByb3BzYCBhY2Nlc3MuJyk7XG4gICAgICAgIHJldHVybiBjbG9uZU5vZGU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gY2xvbmVOb2RlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZpbGxBZGRpdGlvbmFsSW5mbyhleHRyYSwgdHJpZ2dlclZhbHVlLCBjaGVja2VkVmFsdWVzLCB0cmVlRGF0YSwgc2hvd1Bvc2l0aW9uLCBmaWVsZE5hbWVzKSB7XG4gIHZhciB0cmlnZ2VyTm9kZSA9IG51bGw7XG4gIHZhciBub2RlTGlzdCA9IG51bGw7XG5cbiAgZnVuY3Rpb24gZ2VuZXJhdGVNYXAoKSB7XG4gICAgZnVuY3Rpb24gZGlnKGxpc3QpIHtcbiAgICAgIHZhciBsZXZlbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogJzAnO1xuICAgICAgdmFyIHBhcmVudEluY2x1ZGVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICAgIHJldHVybiBsaXN0Lm1hcChmdW5jdGlvbiAob3B0aW9uLCBpbmRleCkge1xuICAgICAgICB2YXIgcG9zID0gXCJcIi5jb25jYXQobGV2ZWwsIFwiLVwiKS5jb25jYXQoaW5kZXgpO1xuICAgICAgICB2YXIgdmFsdWUgPSBvcHRpb25bZmllbGROYW1lcy52YWx1ZV07XG4gICAgICAgIHZhciBpbmNsdWRlZCA9IGNoZWNrZWRWYWx1ZXMuaW5jbHVkZXModmFsdWUpO1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSBkaWcob3B0aW9uW2ZpZWxkTmFtZXMuY2hpbGRyZW5dIHx8IFtdLCBwb3MsIGluY2x1ZGVkKTtcbiAgICAgICAgdmFyIG5vZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmVlTm9kZSwgb3B0aW9uLCBjaGlsZHJlbi5tYXAoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkLm5vZGU7XG4gICAgICAgIH0pKTsgLy8gTGluayB3aXRoIHRyaWdnZXIgbm9kZVxuXG4gICAgICAgIGlmICh0cmlnZ2VyVmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgICAgdHJpZ2dlck5vZGUgPSBub2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluY2x1ZGVkKSB7XG4gICAgICAgICAgdmFyIGNoZWNrZWROb2RlID0ge1xuICAgICAgICAgICAgcG9zOiBwb3MsXG4gICAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmICghcGFyZW50SW5jbHVkZWQpIHtcbiAgICAgICAgICAgIG5vZGVMaXN0LnB1c2goY2hlY2tlZE5vZGUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjaGVja2VkTm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFub2RlTGlzdCkge1xuICAgICAgbm9kZUxpc3QgPSBbXTtcbiAgICAgIGRpZyh0cmVlRGF0YSk7IC8vIFNvcnQgdG8ga2VlcCB0aGUgY2hlY2tlZCBub2RlIGxlbmd0aFxuXG4gICAgICBub2RlTGlzdC5zb3J0KGZ1bmN0aW9uIChfcmVmMiwgX3JlZjMpIHtcbiAgICAgICAgdmFyIHZhbDEgPSBfcmVmMi5ub2RlLnByb3BzLnZhbHVlO1xuICAgICAgICB2YXIgdmFsMiA9IF9yZWYzLm5vZGUucHJvcHMudmFsdWU7XG4gICAgICAgIHZhciBpbmRleDEgPSBjaGVja2VkVmFsdWVzLmluZGV4T2YodmFsMSk7XG4gICAgICAgIHZhciBpbmRleDIgPSBjaGVja2VkVmFsdWVzLmluZGV4T2YodmFsMik7XG4gICAgICAgIHJldHVybiBpbmRleDEgLSBpbmRleDI7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXh0cmEsICd0cmlnZ2VyTm9kZScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHdhcm5pbmcoZmFsc2UsICdgdHJpZ2dlck5vZGVgIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBjb25zaWRlciBkZWNvdXBsaW5nIGRhdGEgd2l0aCBub2RlLicpO1xuICAgICAgZ2VuZXJhdGVNYXAoKTtcbiAgICAgIHJldHVybiB0cmlnZ2VyTm9kZTtcbiAgICB9XG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXh0cmEsICdhbGxDaGVja2VkTm9kZXMnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB3YXJuaW5nKGZhbHNlLCAnYGFsbENoZWNrZWROb2Rlc2AgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIGNvbnNpZGVyIGRlY291cGxpbmcgZGF0YSB3aXRoIG5vZGUuJyk7XG4gICAgICBnZW5lcmF0ZU1hcCgpO1xuXG4gICAgICBpZiAoc2hvd1Bvc2l0aW9uKSB7XG4gICAgICAgIHJldHVybiBub2RlTGlzdDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5vZGVMaXN0Lm1hcChmdW5jdGlvbiAoX3JlZjQpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBfcmVmNC5ub2RlO1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59IiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNvbnZlcnRDaGlsZHJlblRvRGF0YSB9IGZyb20gXCIuLi91dGlscy9sZWdhY3lVdGlsXCI7XG5cbmZ1bmN0aW9uIHBhcnNlU2ltcGxlVHJlZURhdGEodHJlZURhdGEsIF9yZWYpIHtcbiAgdmFyIGlkID0gX3JlZi5pZCxcbiAgICAgIHBJZCA9IF9yZWYucElkLFxuICAgICAgcm9vdFBJZCA9IF9yZWYucm9vdFBJZDtcbiAgdmFyIGtleU5vZGVzID0ge307XG4gIHZhciByb290Tm9kZUxpc3QgPSBbXTsgLy8gRmlsbCBpbiB0aGUgbWFwXG5cbiAgdmFyIG5vZGVMaXN0ID0gdHJlZURhdGEubWFwKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgdmFyIGNsb25lID0gX29iamVjdFNwcmVhZCh7fSwgbm9kZSk7XG5cbiAgICB2YXIga2V5ID0gY2xvbmVbaWRdO1xuICAgIGtleU5vZGVzW2tleV0gPSBjbG9uZTtcbiAgICBjbG9uZS5rZXkgPSBjbG9uZS5rZXkgfHwga2V5O1xuICAgIHJldHVybiBjbG9uZTtcbiAgfSk7IC8vIENvbm5lY3QgdHJlZVxuXG4gIG5vZGVMaXN0LmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICB2YXIgcGFyZW50S2V5ID0gbm9kZVtwSWRdO1xuICAgIHZhciBwYXJlbnQgPSBrZXlOb2Rlc1twYXJlbnRLZXldOyAvLyBGaWxsIHBhcmVudFxuXG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgcGFyZW50LmNoaWxkcmVuID0gcGFyZW50LmNoaWxkcmVuIHx8IFtdO1xuICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgfSAvLyBGaWxsIHJvb3QgdHJlZSBub2RlXG5cblxuICAgIGlmIChwYXJlbnRLZXkgPT09IHJvb3RQSWQgfHwgIXBhcmVudCAmJiByb290UElkID09PSBudWxsKSB7XG4gICAgICByb290Tm9kZUxpc3QucHVzaChub2RlKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcm9vdE5vZGVMaXN0O1xufVxuLyoqXG4gKiBDb252ZXJ0IGB0cmVlRGF0YWAgb3IgYGNoaWxkcmVuYCBpbnRvIGZvcm1hdHRlZCBgdHJlZURhdGFgLlxuICogV2lsbCBub3QgcmUtY2FsY3VsYXRlIGlmIGB0cmVlRGF0YWAgb3IgYGNoaWxkcmVuYCBub3QgY2hhbmdlLlxuICovXG5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlVHJlZURhdGEodHJlZURhdGEsIGNoaWxkcmVuLCBzaW1wbGVNb2RlKSB7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHJlZURhdGEpIHtcbiAgICAgIHJldHVybiBzaW1wbGVNb2RlID8gcGFyc2VTaW1wbGVUcmVlRGF0YSh0cmVlRGF0YSwgX29iamVjdFNwcmVhZCh7XG4gICAgICAgIGlkOiAnaWQnLFxuICAgICAgICBwSWQ6ICdwSWQnLFxuICAgICAgICByb290UElkOiBudWxsXG4gICAgICB9LCBzaW1wbGVNb2RlICE9PSB0cnVlID8gc2ltcGxlTW9kZSA6IHt9KSkgOiB0cmVlRGF0YTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29udmVydENoaWxkcmVuVG9EYXRhKGNoaWxkcmVuKTtcbiAgfSwgW2NoaWxkcmVuLCBzaW1wbGVNb2RlLCB0cmVlRGF0YV0pO1xufSIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIHRyeSB0byBjYWxsIHJlcXVlc3RJZGxlQ2FsbGJhY2sgaWYgYXZhaWxhYmxlIHRvIHNhdmUgcGVyZm9ybWFuY2UuXG4gKiBObyBuZWVkIGBnZXRMYWJlbGAgaGVyZSBzaW5jZSBhbHJlYWR5IGZldGNoIG9uIGByYXdMYWJlbGVkVmFsdWVgLlxuICovXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gKHZhbHVlcykge1xuICB2YXIgY2FjaGVSZWYgPSBSZWFjdC51c2VSZWYoe1xuICAgIHZhbHVlTGFiZWxzOiBuZXcgTWFwKClcbiAgfSk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWVMYWJlbHMgPSBjYWNoZVJlZi5jdXJyZW50LnZhbHVlTGFiZWxzO1xuICAgIHZhciB2YWx1ZUxhYmVsc0NhY2hlID0gbmV3IE1hcCgpO1xuICAgIHZhciBmaWxsZWRWYWx1ZXMgPSB2YWx1ZXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgX2l0ZW0kbGFiZWw7XG5cbiAgICAgIHZhciB2YWx1ZSA9IGl0ZW0udmFsdWU7XG4gICAgICB2YXIgbWVyZ2VkTGFiZWwgPSAoX2l0ZW0kbGFiZWwgPSBpdGVtLmxhYmVsKSAhPT0gbnVsbCAmJiBfaXRlbSRsYWJlbCAhPT0gdm9pZCAwID8gX2l0ZW0kbGFiZWwgOiB2YWx1ZUxhYmVscy5nZXQodmFsdWUpOyAvLyBTYXZlIGluIGNhY2hlXG5cbiAgICAgIHZhbHVlTGFiZWxzQ2FjaGUuc2V0KHZhbHVlLCBtZXJnZWRMYWJlbCk7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBpdGVtKSwge30sIHtcbiAgICAgICAgbGFiZWw6IG1lcmdlZExhYmVsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBjYWNoZVJlZi5jdXJyZW50LnZhbHVlTGFiZWxzID0gdmFsdWVMYWJlbHNDYWNoZTtcbiAgICByZXR1cm4gW2ZpbGxlZFZhbHVlc107XG4gIH0sIFt2YWx1ZXNdKTtcbn0pOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0Jztcbi8qKlxuICogU2FtZSBhcyBgUmVhY3QudXNlQ2FsbGJhY2tgIGJ1dCBhbHdheXMgcmV0dXJuIGEgbWVtb2l6ZWQgZnVuY3Rpb25cbiAqIGJ1dCByZWRpcmVjdCB0byByZWFsIGZ1bmN0aW9uLlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVJlZkZ1bmMoY2FsbGJhY2spIHtcbiAgdmFyIGZ1bmNSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgZnVuY1JlZi5jdXJyZW50ID0gY2FsbGJhY2s7XG4gIHZhciBjYWNoZUZuID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmdW5jUmVmLmN1cnJlbnQuYXBwbHkoZnVuY1JlZiwgYXJndW1lbnRzKTtcbiAgfSwgW10pO1xuICByZXR1cm4gY2FjaGVGbjtcbn0iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY29udmVydERhdGFUb0VudGl0aWVzIH0gZnJvbSBcInJjLXRyZWUvZXMvdXRpbHMvdHJlZVV0aWxcIjtcbmltcG9ydCB3YXJuaW5nIGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbmltcG9ydCB7IGlzTmlsIH0gZnJvbSBcIi4uL3V0aWxzL3ZhbHVlVXRpbFwiO1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uICh0cmVlRGF0YSwgZmllbGROYW1lcykge1xuICByZXR1cm4gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNvbGxlY3Rpb24gPSBjb252ZXJ0RGF0YVRvRW50aXRpZXModHJlZURhdGEsIHtcbiAgICAgIGZpZWxkTmFtZXM6IGZpZWxkTmFtZXMsXG4gICAgICBpbml0V3JhcHBlcjogZnVuY3Rpb24gaW5pdFdyYXBwZXIod3JhcHBlcikge1xuICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB3cmFwcGVyKSwge30sIHtcbiAgICAgICAgICB2YWx1ZUVudGl0aWVzOiBuZXcgTWFwKClcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgcHJvY2Vzc0VudGl0eTogZnVuY3Rpb24gcHJvY2Vzc0VudGl0eShlbnRpdHksIHdyYXBwZXIpIHtcbiAgICAgICAgdmFyIHZhbCA9IGVudGl0eS5ub2RlW2ZpZWxkTmFtZXMudmFsdWVdOyAvLyBDaGVjayBpZiBleGlzdCBzYW1lIHZhbHVlXG5cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICB2YXIga2V5ID0gZW50aXR5Lm5vZGUua2V5O1xuICAgICAgICAgIHdhcm5pbmcoIWlzTmlsKHZhbCksICdUcmVlTm9kZSBgdmFsdWVgIGlzIGludmFsaWRhdGU6IHVuZGVmaW5lZCcpO1xuICAgICAgICAgIHdhcm5pbmcoIXdyYXBwZXIudmFsdWVFbnRpdGllcy5oYXModmFsKSwgXCJTYW1lIGB2YWx1ZWAgZXhpc3QgaW4gdGhlIHRyZWU6IFwiLmNvbmNhdCh2YWwpKTtcbiAgICAgICAgICB3YXJuaW5nKCFrZXkgfHwgU3RyaW5nKGtleSkgPT09IFN0cmluZyh2YWwpLCBcImBrZXlgIG9yIGB2YWx1ZWAgd2l0aCBUcmVlTm9kZSBtdXN0IGJlIHRoZSBzYW1lIG9yIHlvdSBjYW4gcmVtb3ZlIG9uZSBvZiB0aGVtLiBrZXk6IFwiLmNvbmNhdChrZXksIFwiLCB2YWx1ZTogXCIpLmNvbmNhdCh2YWwsIFwiLlwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICB3cmFwcGVyLnZhbHVlRW50aXRpZXMuc2V0KHZhbCwgZW50aXR5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgfSwgW3RyZWVEYXRhLCBmaWVsZE5hbWVzXSk7XG59KTsiLCJpbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY29uZHVjdENoZWNrIH0gZnJvbSBcInJjLXRyZWUvZXMvdXRpbHMvY29uZHVjdFV0aWxcIjtcbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAocmF3TGFiZWxlZFZhbHVlcywgcmF3SGFsZkNoZWNrZWRWYWx1ZXMsIHRyZWVDb25kdWN0aW9uLCBrZXlFbnRpdGllcykge1xuICByZXR1cm4gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNoZWNrZWRLZXlzID0gcmF3TGFiZWxlZFZhbHVlcy5tYXAoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgIHZhciB2YWx1ZSA9IF9yZWYudmFsdWU7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSk7XG4gICAgdmFyIGhhbGZDaGVja2VkS2V5cyA9IHJhd0hhbGZDaGVja2VkVmFsdWVzLm1hcChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgIHZhciB2YWx1ZSA9IF9yZWYyLnZhbHVlO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pO1xuICAgIHZhciBtaXNzaW5nVmFsdWVzID0gY2hlY2tlZEtleXMuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHJldHVybiAha2V5RW50aXRpZXNba2V5XTtcbiAgICB9KTtcblxuICAgIGlmICh0cmVlQ29uZHVjdGlvbikge1xuICAgICAgdmFyIF9jb25kdWN0Q2hlY2sgPSBjb25kdWN0Q2hlY2soY2hlY2tlZEtleXMsIHRydWUsIGtleUVudGl0aWVzKTtcblxuICAgICAgY2hlY2tlZEtleXMgPSBfY29uZHVjdENoZWNrLmNoZWNrZWRLZXlzO1xuICAgICAgaGFsZkNoZWNrZWRLZXlzID0gX2NvbmR1Y3RDaGVjay5oYWxmQ2hlY2tlZEtleXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIFsvLyBDaGVja2VkIGtleXMgc2hvdWxkIGZpbGwgd2l0aCBtaXNzaW5nIGtleXMgd2hpY2ggc2hvdWxkIGRlLWR1cGxpY2F0ZWRcbiAgICBBcnJheS5mcm9tKG5ldyBTZXQoW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShtaXNzaW5nVmFsdWVzKSwgX3RvQ29uc3VtYWJsZUFycmF5KGNoZWNrZWRLZXlzKSkpKSwgLy8gSGFsZiBjaGVja2VkIGtleXNcbiAgICBoYWxmQ2hlY2tlZEtleXNdO1xuICB9LCBbcmF3TGFiZWxlZFZhbHVlcywgcmF3SGFsZkNoZWNrZWRWYWx1ZXMsIHRyZWVDb25kdWN0aW9uLCBrZXlFbnRpdGllc10pO1xufSk7IiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBmaWxsTGVnYWN5UHJvcHMgfSBmcm9tIFwiLi4vdXRpbHMvbGVnYWN5VXRpbFwiO1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uICh0cmVlRGF0YSwgc2VhcmNoVmFsdWUsIF9yZWYpIHtcbiAgdmFyIHRyZWVOb2RlRmlsdGVyUHJvcCA9IF9yZWYudHJlZU5vZGVGaWx0ZXJQcm9wLFxuICAgICAgZmlsdGVyVHJlZU5vZGUgPSBfcmVmLmZpbHRlclRyZWVOb2RlLFxuICAgICAgZmllbGROYW1lcyA9IF9yZWYuZmllbGROYW1lcztcbiAgdmFyIGZpZWxkQ2hpbGRyZW4gPSBmaWVsZE5hbWVzLmNoaWxkcmVuO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFzZWFyY2hWYWx1ZSB8fCBmaWx0ZXJUcmVlTm9kZSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiB0cmVlRGF0YTtcbiAgICB9XG5cbiAgICB2YXIgZmlsdGVyT3B0aW9uRnVuYztcblxuICAgIGlmICh0eXBlb2YgZmlsdGVyVHJlZU5vZGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGZpbHRlck9wdGlvbkZ1bmMgPSBmaWx0ZXJUcmVlTm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHVwcGVyU3RyID0gc2VhcmNoVmFsdWUudG9VcHBlckNhc2UoKTtcblxuICAgICAgZmlsdGVyT3B0aW9uRnVuYyA9IGZ1bmN0aW9uIGZpbHRlck9wdGlvbkZ1bmMoXywgZGF0YU5vZGUpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gZGF0YU5vZGVbdHJlZU5vZGVGaWx0ZXJQcm9wXTtcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSkudG9VcHBlckNhc2UoKS5pbmNsdWRlcyh1cHBlclN0cik7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRpZyhsaXN0KSB7XG4gICAgICB2YXIga2VlcEFsbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gICAgICByZXR1cm4gbGlzdC5tYXAoZnVuY3Rpb24gKGRhdGFOb2RlKSB7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IGRhdGFOb2RlW2ZpZWxkQ2hpbGRyZW5dO1xuICAgICAgICB2YXIgbWF0Y2ggPSBrZWVwQWxsIHx8IGZpbHRlck9wdGlvbkZ1bmMoc2VhcmNoVmFsdWUsIGZpbGxMZWdhY3lQcm9wcyhkYXRhTm9kZSkpO1xuICAgICAgICB2YXIgY2hpbGRMaXN0ID0gZGlnKGNoaWxkcmVuIHx8IFtdLCBtYXRjaCk7XG5cbiAgICAgICAgaWYgKG1hdGNoIHx8IGNoaWxkTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBkYXRhTm9kZSksIHt9LCBfZGVmaW5lUHJvcGVydHkoe1xuICAgICAgICAgICAgaXNMZWFmOiB1bmRlZmluZWRcbiAgICAgICAgICB9LCBmaWVsZENoaWxkcmVuLCBjaGlsZExpc3QpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpZyh0cmVlRGF0YSk7XG4gIH0sIFt0cmVlRGF0YSwgc2VhcmNoVmFsdWUsIGZpZWxkQ2hpbGRyZW4sIHRyZWVOb2RlRmlsdGVyUHJvcCwgZmlsdGVyVHJlZU5vZGVdKTtcbn0pOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiaWRcIiwgXCJwcmVmaXhDbHNcIiwgXCJ2YWx1ZVwiLCBcImRlZmF1bHRWYWx1ZVwiLCBcIm9uQ2hhbmdlXCIsIFwib25TZWxlY3RcIiwgXCJvbkRlc2VsZWN0XCIsIFwic2VhcmNoVmFsdWVcIiwgXCJpbnB1dFZhbHVlXCIsIFwib25TZWFyY2hcIiwgXCJhdXRvQ2xlYXJTZWFyY2hWYWx1ZVwiLCBcImZpbHRlclRyZWVOb2RlXCIsIFwidHJlZU5vZGVGaWx0ZXJQcm9wXCIsIFwic2hvd0NoZWNrZWRTdHJhdGVneVwiLCBcInRyZWVOb2RlTGFiZWxQcm9wXCIsIFwibXVsdGlwbGVcIiwgXCJ0cmVlQ2hlY2thYmxlXCIsIFwidHJlZUNoZWNrU3RyaWN0bHlcIiwgXCJsYWJlbEluVmFsdWVcIiwgXCJmaWVsZE5hbWVzXCIsIFwidHJlZURhdGFTaW1wbGVNb2RlXCIsIFwidHJlZURhdGFcIiwgXCJjaGlsZHJlblwiLCBcImxvYWREYXRhXCIsIFwidHJlZUxvYWRlZEtleXNcIiwgXCJvblRyZWVMb2FkXCIsIFwidHJlZURlZmF1bHRFeHBhbmRBbGxcIiwgXCJ0cmVlRXhwYW5kZWRLZXlzXCIsIFwidHJlZURlZmF1bHRFeHBhbmRlZEtleXNcIiwgXCJvblRyZWVFeHBhbmRcIiwgXCJ0cmVlRXhwYW5kQWN0aW9uXCIsIFwidmlydHVhbFwiLCBcImxpc3RIZWlnaHRcIiwgXCJsaXN0SXRlbUhlaWdodFwiLCBcIm9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlXCIsIFwiZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoXCIsIFwidHJlZUxpbmVcIiwgXCJ0cmVlSWNvblwiLCBcInNob3dUcmVlSWNvblwiLCBcInN3aXRjaGVySWNvblwiLCBcInRyZWVNb3Rpb25cIl07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBCYXNlU2VsZWN0IH0gZnJvbSAncmMtc2VsZWN0JztcbmltcG9ydCB7IGNvbmR1Y3RDaGVjayB9IGZyb20gXCJyYy10cmVlL2VzL3V0aWxzL2NvbmR1Y3RVdGlsXCI7XG5pbXBvcnQgdXNlSWQgZnJvbSBcInJjLXNlbGVjdC9lcy9ob29rcy91c2VJZFwiO1xuaW1wb3J0IHVzZU1lcmdlZFN0YXRlIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lcmdlZFN0YXRlXCI7XG5pbXBvcnQgT3B0aW9uTGlzdCBmcm9tIFwiLi9PcHRpb25MaXN0XCI7XG5pbXBvcnQgVHJlZU5vZGUgZnJvbSBcIi4vVHJlZU5vZGVcIjtcbmltcG9ydCB7IGZvcm1hdFN0cmF0ZWd5VmFsdWVzLCBTSE9XX0FMTCwgU0hPV19QQVJFTlQsIFNIT1dfQ0hJTEQgfSBmcm9tIFwiLi91dGlscy9zdHJhdGVneVV0aWxcIjtcbmltcG9ydCBUcmVlU2VsZWN0Q29udGV4dCBmcm9tIFwiLi9UcmVlU2VsZWN0Q29udGV4dFwiO1xuaW1wb3J0IExlZ2FjeUNvbnRleHQgZnJvbSBcIi4vTGVnYWN5Q29udGV4dFwiO1xuaW1wb3J0IHVzZVRyZWVEYXRhIGZyb20gXCIuL2hvb2tzL3VzZVRyZWVEYXRhXCI7XG5pbXBvcnQgeyB0b0FycmF5LCBmaWxsRmllbGROYW1lcywgaXNOaWwgfSBmcm9tIFwiLi91dGlscy92YWx1ZVV0aWxcIjtcbmltcG9ydCB1c2VDYWNoZSBmcm9tIFwiLi9ob29rcy91c2VDYWNoZVwiO1xuaW1wb3J0IHVzZVJlZkZ1bmMgZnJvbSBcIi4vaG9va3MvdXNlUmVmRnVuY1wiO1xuaW1wb3J0IHVzZURhdGFFbnRpdGllcyBmcm9tIFwiLi9ob29rcy91c2VEYXRhRW50aXRpZXNcIjtcbmltcG9ydCB7IGZpbGxBZGRpdGlvbmFsSW5mbywgZmlsbExlZ2FjeVByb3BzIH0gZnJvbSBcIi4vdXRpbHMvbGVnYWN5VXRpbFwiO1xuaW1wb3J0IHVzZUNoZWNrZWRLZXlzIGZyb20gXCIuL2hvb2tzL3VzZUNoZWNrZWRLZXlzXCI7XG5pbXBvcnQgdXNlRmlsdGVyVHJlZURhdGEgZnJvbSBcIi4vaG9va3MvdXNlRmlsdGVyVHJlZURhdGFcIjtcbmltcG9ydCB3YXJuaW5nUHJvcHMgZnJvbSBcIi4vdXRpbHMvd2FybmluZ1Byb3BzVXRpbFwiO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuXG5mdW5jdGlvbiBpc1Jhd1ZhbHVlKHZhbHVlKSB7XG4gIHJldHVybiAhdmFsdWUgfHwgX3R5cGVvZih2YWx1ZSkgIT09ICdvYmplY3QnO1xufVxuXG52YXIgVHJlZVNlbGVjdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBpZCA9IHByb3BzLmlkLFxuICAgICAgX3Byb3BzJHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgIHByZWZpeENscyA9IF9wcm9wcyRwcmVmaXhDbHMgPT09IHZvaWQgMCA/ICdyYy10cmVlLXNlbGVjdCcgOiBfcHJvcHMkcHJlZml4Q2xzLFxuICAgICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICAgIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZSxcbiAgICAgIG9uQ2hhbmdlID0gcHJvcHMub25DaGFuZ2UsXG4gICAgICBvblNlbGVjdCA9IHByb3BzLm9uU2VsZWN0LFxuICAgICAgb25EZXNlbGVjdCA9IHByb3BzLm9uRGVzZWxlY3QsXG4gICAgICBzZWFyY2hWYWx1ZSA9IHByb3BzLnNlYXJjaFZhbHVlLFxuICAgICAgaW5wdXRWYWx1ZSA9IHByb3BzLmlucHV0VmFsdWUsXG4gICAgICBvblNlYXJjaCA9IHByb3BzLm9uU2VhcmNoLFxuICAgICAgX3Byb3BzJGF1dG9DbGVhclNlYXJjID0gcHJvcHMuYXV0b0NsZWFyU2VhcmNoVmFsdWUsXG4gICAgICBhdXRvQ2xlYXJTZWFyY2hWYWx1ZSA9IF9wcm9wcyRhdXRvQ2xlYXJTZWFyYyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRhdXRvQ2xlYXJTZWFyYyxcbiAgICAgIGZpbHRlclRyZWVOb2RlID0gcHJvcHMuZmlsdGVyVHJlZU5vZGUsXG4gICAgICBfcHJvcHMkdHJlZU5vZGVGaWx0ZXIgPSBwcm9wcy50cmVlTm9kZUZpbHRlclByb3AsXG4gICAgICB0cmVlTm9kZUZpbHRlclByb3AgPSBfcHJvcHMkdHJlZU5vZGVGaWx0ZXIgPT09IHZvaWQgMCA/ICd2YWx1ZScgOiBfcHJvcHMkdHJlZU5vZGVGaWx0ZXIsXG4gICAgICBfcHJvcHMkc2hvd0NoZWNrZWRTdHIgPSBwcm9wcy5zaG93Q2hlY2tlZFN0cmF0ZWd5LFxuICAgICAgc2hvd0NoZWNrZWRTdHJhdGVneSA9IF9wcm9wcyRzaG93Q2hlY2tlZFN0ciA9PT0gdm9pZCAwID8gU0hPV19DSElMRCA6IF9wcm9wcyRzaG93Q2hlY2tlZFN0cixcbiAgICAgIHRyZWVOb2RlTGFiZWxQcm9wID0gcHJvcHMudHJlZU5vZGVMYWJlbFByb3AsXG4gICAgICBtdWx0aXBsZSA9IHByb3BzLm11bHRpcGxlLFxuICAgICAgdHJlZUNoZWNrYWJsZSA9IHByb3BzLnRyZWVDaGVja2FibGUsXG4gICAgICB0cmVlQ2hlY2tTdHJpY3RseSA9IHByb3BzLnRyZWVDaGVja1N0cmljdGx5LFxuICAgICAgbGFiZWxJblZhbHVlID0gcHJvcHMubGFiZWxJblZhbHVlLFxuICAgICAgZmllbGROYW1lcyA9IHByb3BzLmZpZWxkTmFtZXMsXG4gICAgICB0cmVlRGF0YVNpbXBsZU1vZGUgPSBwcm9wcy50cmVlRGF0YVNpbXBsZU1vZGUsXG4gICAgICB0cmVlRGF0YSA9IHByb3BzLnRyZWVEYXRhLFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGxvYWREYXRhID0gcHJvcHMubG9hZERhdGEsXG4gICAgICB0cmVlTG9hZGVkS2V5cyA9IHByb3BzLnRyZWVMb2FkZWRLZXlzLFxuICAgICAgb25UcmVlTG9hZCA9IHByb3BzLm9uVHJlZUxvYWQsXG4gICAgICB0cmVlRGVmYXVsdEV4cGFuZEFsbCA9IHByb3BzLnRyZWVEZWZhdWx0RXhwYW5kQWxsLFxuICAgICAgdHJlZUV4cGFuZGVkS2V5cyA9IHByb3BzLnRyZWVFeHBhbmRlZEtleXMsXG4gICAgICB0cmVlRGVmYXVsdEV4cGFuZGVkS2V5cyA9IHByb3BzLnRyZWVEZWZhdWx0RXhwYW5kZWRLZXlzLFxuICAgICAgb25UcmVlRXhwYW5kID0gcHJvcHMub25UcmVlRXhwYW5kLFxuICAgICAgdHJlZUV4cGFuZEFjdGlvbiA9IHByb3BzLnRyZWVFeHBhbmRBY3Rpb24sXG4gICAgICB2aXJ0dWFsID0gcHJvcHMudmlydHVhbCxcbiAgICAgIF9wcm9wcyRsaXN0SGVpZ2h0ID0gcHJvcHMubGlzdEhlaWdodCxcbiAgICAgIGxpc3RIZWlnaHQgPSBfcHJvcHMkbGlzdEhlaWdodCA9PT0gdm9pZCAwID8gMjAwIDogX3Byb3BzJGxpc3RIZWlnaHQsXG4gICAgICBfcHJvcHMkbGlzdEl0ZW1IZWlnaHQgPSBwcm9wcy5saXN0SXRlbUhlaWdodCxcbiAgICAgIGxpc3RJdGVtSGVpZ2h0ID0gX3Byb3BzJGxpc3RJdGVtSGVpZ2h0ID09PSB2b2lkIDAgPyAyMCA6IF9wcm9wcyRsaXN0SXRlbUhlaWdodCxcbiAgICAgIG9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlID0gcHJvcHMub25Ecm9wZG93blZpc2libGVDaGFuZ2UsXG4gICAgICBfcHJvcHMkZHJvcGRvd25NYXRjaFMgPSBwcm9wcy5kcm9wZG93bk1hdGNoU2VsZWN0V2lkdGgsXG4gICAgICBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGggPSBfcHJvcHMkZHJvcGRvd25NYXRjaFMgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkZHJvcGRvd25NYXRjaFMsXG4gICAgICB0cmVlTGluZSA9IHByb3BzLnRyZWVMaW5lLFxuICAgICAgdHJlZUljb24gPSBwcm9wcy50cmVlSWNvbixcbiAgICAgIHNob3dUcmVlSWNvbiA9IHByb3BzLnNob3dUcmVlSWNvbixcbiAgICAgIHN3aXRjaGVySWNvbiA9IHByb3BzLnN3aXRjaGVySWNvbixcbiAgICAgIHRyZWVNb3Rpb24gPSBwcm9wcy50cmVlTW90aW9uLFxuICAgICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQpO1xuXG4gIHZhciBtZXJnZWRJZCA9IHVzZUlkKGlkKTtcbiAgdmFyIHRyZWVDb25kdWN0aW9uID0gdHJlZUNoZWNrYWJsZSAmJiAhdHJlZUNoZWNrU3RyaWN0bHk7XG4gIHZhciBtZXJnZWRDaGVja2FibGUgPSB0cmVlQ2hlY2thYmxlIHx8IHRyZWVDaGVja1N0cmljdGx5O1xuICB2YXIgbWVyZ2VkTGFiZWxJblZhbHVlID0gdHJlZUNoZWNrU3RyaWN0bHkgfHwgbGFiZWxJblZhbHVlO1xuICB2YXIgbWVyZ2VkTXVsdGlwbGUgPSBtZXJnZWRDaGVja2FibGUgfHwgbXVsdGlwbGU7XG5cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZSA9IHVzZU1lcmdlZFN0YXRlKGRlZmF1bHRWYWx1ZSwge1xuICAgIHZhbHVlOiB2YWx1ZVxuICB9KSxcbiAgICAgIF91c2VNZXJnZWRTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGUsIDIpLFxuICAgICAgaW50ZXJuYWxWYWx1ZSA9IF91c2VNZXJnZWRTdGF0ZTJbMF0sXG4gICAgICBzZXRJbnRlcm5hbFZhbHVlID0gX3VzZU1lcmdlZFN0YXRlMlsxXTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gV2FybmluZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgd2FybmluZ1Byb3BzKHByb3BzKTtcbiAgfSAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IEZpZWxkTmFtZXMgPT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgdmFyIG1lcmdlZEZpZWxkTmFtZXMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZmlsbEZpZWxkTmFtZXMoZmllbGROYW1lcyk7XG4gIH0sXG4gIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwcyAqL1xuICBbSlNPTi5zdHJpbmdpZnkoZmllbGROYW1lcyldXG4gIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzICovXG4gICk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBTZWFyY2ggPT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIF91c2VNZXJnZWRTdGF0ZTMgPSB1c2VNZXJnZWRTdGF0ZSgnJywge1xuICAgIHZhbHVlOiBzZWFyY2hWYWx1ZSAhPT0gdW5kZWZpbmVkID8gc2VhcmNoVmFsdWUgOiBpbnB1dFZhbHVlLFxuICAgIHBvc3RTdGF0ZTogZnVuY3Rpb24gcG9zdFN0YXRlKHNlYXJjaCkge1xuICAgICAgcmV0dXJuIHNlYXJjaCB8fCAnJztcbiAgICB9XG4gIH0pLFxuICAgICAgX3VzZU1lcmdlZFN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VNZXJnZWRTdGF0ZTMsIDIpLFxuICAgICAgbWVyZ2VkU2VhcmNoVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGU0WzBdLFxuICAgICAgc2V0U2VhcmNoVmFsdWUgPSBfdXNlTWVyZ2VkU3RhdGU0WzFdO1xuXG4gIHZhciBvbkludGVybmFsU2VhcmNoID0gZnVuY3Rpb24gb25JbnRlcm5hbFNlYXJjaChzZWFyY2hUZXh0KSB7XG4gICAgc2V0U2VhcmNoVmFsdWUoc2VhcmNoVGV4dCk7XG4gICAgb25TZWFyY2ggPT09IG51bGwgfHwgb25TZWFyY2ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uU2VhcmNoKHNlYXJjaFRleHQpO1xuICB9OyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IERhdGEgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBgdXNlVHJlZURhdGFgIG9ubHkgZG8gY29udmVydCBvZiBgY2hpbGRyZW5gIG9yIGBzaW1wbGVNb2RlYC5cbiAgLy8gRWxzZSB3aWxsIHJldHVybiBvcmlnaW4gYHRyZWVEYXRhYCBmb3IgcGVyZiBjb25zaWRlcmF0aW9uLlxuICAvLyBEbyBub3QgZG8gYW55dGhpbmcgdG8gbG9vcCB0aGUgZGF0YS5cblxuXG4gIHZhciBtZXJnZWRUcmVlRGF0YSA9IHVzZVRyZWVEYXRhKHRyZWVEYXRhLCBjaGlsZHJlbiwgdHJlZURhdGFTaW1wbGVNb2RlKTtcblxuICB2YXIgX3VzZURhdGFFbnRpdGllcyA9IHVzZURhdGFFbnRpdGllcyhtZXJnZWRUcmVlRGF0YSwgbWVyZ2VkRmllbGROYW1lcyksXG4gICAgICBrZXlFbnRpdGllcyA9IF91c2VEYXRhRW50aXRpZXMua2V5RW50aXRpZXMsXG4gICAgICB2YWx1ZUVudGl0aWVzID0gX3VzZURhdGFFbnRpdGllcy52YWx1ZUVudGl0aWVzO1xuICAvKiogR2V0IGBtaXNzaW5nUmF3VmFsdWVzYCB3aGljaCBub3QgZXhpc3QgaW4gdGhlIHRyZWUgeWV0ICovXG5cblxuICB2YXIgc3BsaXRSYXdWYWx1ZXMgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAobmV3UmF3VmFsdWVzKSB7XG4gICAgdmFyIG1pc3NpbmdSYXdWYWx1ZXMgPSBbXTtcbiAgICB2YXIgZXhpc3RSYXdWYWx1ZXMgPSBbXTsgLy8gS2VlcCBtaXNzaW5nIHZhbHVlIGluIHRoZSBjYWNoZVxuXG4gICAgbmV3UmF3VmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKHZhbCkge1xuICAgICAgaWYgKHZhbHVlRW50aXRpZXMuaGFzKHZhbCkpIHtcbiAgICAgICAgZXhpc3RSYXdWYWx1ZXMucHVzaCh2YWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWlzc2luZ1Jhd1ZhbHVlcy5wdXNoKHZhbCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1pc3NpbmdSYXdWYWx1ZXM6IG1pc3NpbmdSYXdWYWx1ZXMsXG4gICAgICBleGlzdFJhd1ZhbHVlczogZXhpc3RSYXdWYWx1ZXNcbiAgICB9O1xuICB9LCBbdmFsdWVFbnRpdGllc10pOyAvLyBGaWx0ZXJlZCBUcmVlXG5cbiAgdmFyIGZpbHRlcmVkVHJlZURhdGEgPSB1c2VGaWx0ZXJUcmVlRGF0YShtZXJnZWRUcmVlRGF0YSwgbWVyZ2VkU2VhcmNoVmFsdWUsIHtcbiAgICBmaWVsZE5hbWVzOiBtZXJnZWRGaWVsZE5hbWVzLFxuICAgIHRyZWVOb2RlRmlsdGVyUHJvcDogdHJlZU5vZGVGaWx0ZXJQcm9wLFxuICAgIGZpbHRlclRyZWVOb2RlOiBmaWx0ZXJUcmVlTm9kZVxuICB9KTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IExhYmVsID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgZ2V0TGFiZWwgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoaXRlbSkge1xuICAgIGlmIChpdGVtKSB7XG4gICAgICBpZiAodHJlZU5vZGVMYWJlbFByb3ApIHtcbiAgICAgICAgcmV0dXJuIGl0ZW1bdHJlZU5vZGVMYWJlbFByb3BdO1xuICAgICAgfSAvLyBMb29wIGZyb20gZmllbGROYW1lc1xuXG5cbiAgICAgIHZhciB0aXRsZUxpc3QgPSBtZXJnZWRGaWVsZE5hbWVzLl90aXRsZTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aXRsZUxpc3QubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIHRpdGxlID0gaXRlbVt0aXRsZUxpc3RbaV1dO1xuXG4gICAgICAgIGlmICh0aXRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIHRpdGxlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCBbbWVyZ2VkRmllbGROYW1lcywgdHJlZU5vZGVMYWJlbFByb3BdKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBXcmFwIFZhbHVlID09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgdG9MYWJlbGVkVmFsdWVzID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGRyYWZ0VmFsdWVzKSB7XG4gICAgdmFyIHZhbHVlcyA9IHRvQXJyYXkoZHJhZnRWYWx1ZXMpO1xuICAgIHJldHVybiB2YWx1ZXMubWFwKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIGlmIChpc1Jhd1ZhbHVlKHZhbCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2YWx1ZTogdmFsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWw7XG4gICAgfSk7XG4gIH0sIFtdKTtcbiAgdmFyIGNvbnZlcnQyTGFiZWxWYWx1ZXMgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoZHJhZnRWYWx1ZXMpIHtcbiAgICB2YXIgdmFsdWVzID0gdG9MYWJlbGVkVmFsdWVzKGRyYWZ0VmFsdWVzKTtcbiAgICByZXR1cm4gdmFsdWVzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIHJhd0xhYmVsID0gaXRlbS5sYWJlbDtcbiAgICAgIHZhciByYXdWYWx1ZSA9IGl0ZW0udmFsdWUsXG4gICAgICAgICAgcmF3SGFsZkNoZWNrZWQgPSBpdGVtLmhhbGZDaGVja2VkO1xuICAgICAgdmFyIHJhd0Rpc2FibGVkO1xuICAgICAgdmFyIGVudGl0eSA9IHZhbHVlRW50aXRpZXMuZ2V0KHJhd1ZhbHVlKTsgLy8gRmlsbCBtaXNzaW5nIGxhYmVsICYgc3RhdHVzXG5cbiAgICAgIGlmIChlbnRpdHkpIHtcbiAgICAgICAgdmFyIF9yYXdMYWJlbDtcblxuICAgICAgICByYXdMYWJlbCA9IChfcmF3TGFiZWwgPSByYXdMYWJlbCkgIT09IG51bGwgJiYgX3Jhd0xhYmVsICE9PSB2b2lkIDAgPyBfcmF3TGFiZWwgOiBnZXRMYWJlbChlbnRpdHkubm9kZSk7XG4gICAgICAgIHJhd0Rpc2FibGVkID0gZW50aXR5Lm5vZGUuZGlzYWJsZWQ7XG4gICAgICB9IGVsc2UgaWYgKHJhd0xhYmVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gV2UgdHJ5IHRvIGZpbmQgaW4gY3VycmVudCBgbGFiZWxJblZhbHVlYCB2YWx1ZVxuICAgICAgICB2YXIgbGFiZWxJblZhbHVlSXRlbSA9IHRvTGFiZWxlZFZhbHVlcyhpbnRlcm5hbFZhbHVlKS5maW5kKGZ1bmN0aW9uIChsYWJlbGVkSXRlbSkge1xuICAgICAgICAgIHJldHVybiBsYWJlbGVkSXRlbS52YWx1ZSA9PT0gcmF3VmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgICByYXdMYWJlbCA9IGxhYmVsSW5WYWx1ZUl0ZW0ubGFiZWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxhYmVsOiByYXdMYWJlbCxcbiAgICAgICAgdmFsdWU6IHJhd1ZhbHVlLFxuICAgICAgICBoYWxmQ2hlY2tlZDogcmF3SGFsZkNoZWNrZWQsXG4gICAgICAgIGRpc2FibGVkOiByYXdEaXNhYmxlZFxuICAgICAgfTtcbiAgICB9KTtcbiAgfSwgW3ZhbHVlRW50aXRpZXMsIGdldExhYmVsLCB0b0xhYmVsZWRWYWx1ZXMsIGludGVybmFsVmFsdWVdKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IFZhbHVlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgcmF3TWl4ZWRMYWJlbGVkVmFsdWVzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRvTGFiZWxlZFZhbHVlcyhpbnRlcm5hbFZhbHVlKTtcbiAgfSwgW3RvTGFiZWxlZFZhbHVlcywgaW50ZXJuYWxWYWx1ZV0pOyAvLyBTcGxpdCB2YWx1ZSBpbnRvIGZ1bGwgY2hlY2sgYW5kIGhhbGYgY2hlY2tcblxuICB2YXIgX1JlYWN0JHVzZU1lbW8gPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZnVsbENoZWNrVmFsdWVzID0gW107XG4gICAgdmFyIGhhbGZDaGVja1ZhbHVlcyA9IFtdO1xuICAgIHJhd01peGVkTGFiZWxlZFZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICBpZiAoaXRlbS5oYWxmQ2hlY2tlZCkge1xuICAgICAgICBoYWxmQ2hlY2tWYWx1ZXMucHVzaChpdGVtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZ1bGxDaGVja1ZhbHVlcy5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBbZnVsbENoZWNrVmFsdWVzLCBoYWxmQ2hlY2tWYWx1ZXNdO1xuICB9LCBbcmF3TWl4ZWRMYWJlbGVkVmFsdWVzXSksXG4gICAgICBfUmVhY3QkdXNlTWVtbzIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlTWVtbywgMiksXG4gICAgICByYXdMYWJlbGVkVmFsdWVzID0gX1JlYWN0JHVzZU1lbW8yWzBdLFxuICAgICAgcmF3SGFsZkxhYmVsZWRWYWx1ZXMgPSBfUmVhY3QkdXNlTWVtbzJbMV07IC8vIGNvbnN0IFttZXJnZWRWYWx1ZXNdID0gdXNlQ2FjaGUocmF3TGFiZWxlZFZhbHVlcyk7XG5cblxuICB2YXIgcmF3VmFsdWVzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHJhd0xhYmVsZWRWYWx1ZXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9KTtcbiAgfSwgW3Jhd0xhYmVsZWRWYWx1ZXNdKTsgLy8gQ29udmVydCB2YWx1ZSB0byBrZXkuIFdpbGwgZmlsbCBtaXNzZWQga2V5cyBmb3IgY29uZHVjdCBjaGVjay5cblxuICB2YXIgX3VzZUNoZWNrZWRLZXlzID0gdXNlQ2hlY2tlZEtleXMocmF3TGFiZWxlZFZhbHVlcywgcmF3SGFsZkxhYmVsZWRWYWx1ZXMsIHRyZWVDb25kdWN0aW9uLCBrZXlFbnRpdGllcyksXG4gICAgICBfdXNlQ2hlY2tlZEtleXMyID0gX3NsaWNlZFRvQXJyYXkoX3VzZUNoZWNrZWRLZXlzLCAyKSxcbiAgICAgIHJhd0NoZWNrZWRWYWx1ZXMgPSBfdXNlQ2hlY2tlZEtleXMyWzBdLFxuICAgICAgcmF3SGFsZkNoZWNrZWRWYWx1ZXMgPSBfdXNlQ2hlY2tlZEtleXMyWzFdOyAvLyBDb252ZXJ0IHJhd0NoZWNrZWRLZXlzIHRvIGNoZWNrIHN0cmF0ZWd5IHJlbGF0ZWQgdmFsdWVzXG5cblxuICB2YXIgZGlzcGxheVZhbHVlcyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIC8vIENvbGxlY3Qga2V5cyB3aGljaCBuZWVkIHRvIHNob3dcbiAgICB2YXIgZGlzcGxheUtleXMgPSBmb3JtYXRTdHJhdGVneVZhbHVlcyhyYXdDaGVja2VkVmFsdWVzLCBzaG93Q2hlY2tlZFN0cmF0ZWd5LCBrZXlFbnRpdGllcywgbWVyZ2VkRmllbGROYW1lcyk7IC8vIENvbnZlcnQgdG8gdmFsdWUgYW5kIGZpbGxlZCB3aXRoIGxhYmVsXG5cbiAgICB2YXIgdmFsdWVzID0gZGlzcGxheUtleXMubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBfa2V5RW50aXRpZXMka2V5JG5vZGUsIF9rZXlFbnRpdGllcyRrZXksIF9rZXlFbnRpdGllcyRrZXkkbm9kZTI7XG5cbiAgICAgIHJldHVybiAoX2tleUVudGl0aWVzJGtleSRub2RlID0gKF9rZXlFbnRpdGllcyRrZXkgPSBrZXlFbnRpdGllc1trZXldKSA9PT0gbnVsbCB8fCBfa2V5RW50aXRpZXMka2V5ID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX2tleUVudGl0aWVzJGtleSRub2RlMiA9IF9rZXlFbnRpdGllcyRrZXkubm9kZSkgPT09IG51bGwgfHwgX2tleUVudGl0aWVzJGtleSRub2RlMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2tleUVudGl0aWVzJGtleSRub2RlMlttZXJnZWRGaWVsZE5hbWVzLnZhbHVlXSkgIT09IG51bGwgJiYgX2tleUVudGl0aWVzJGtleSRub2RlICE9PSB2b2lkIDAgPyBfa2V5RW50aXRpZXMka2V5JG5vZGUgOiBrZXk7XG4gICAgfSk7IC8vIEJhY2sgZmlsbCB3aXRoIG9yaWdpbiBsYWJlbFxuXG4gICAgdmFyIGxhYmVsZWRWYWx1ZXMgPSB2YWx1ZXMubWFwKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHZhciB0YXJnZXRJdGVtID0gcmF3TGFiZWxlZFZhbHVlcy5maW5kKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHJldHVybiBpdGVtLnZhbHVlID09PSB2YWw7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB2YWwsXG4gICAgICAgIGxhYmVsOiB0YXJnZXRJdGVtID09PSBudWxsIHx8IHRhcmdldEl0ZW0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRhcmdldEl0ZW0ubGFiZWxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgdmFyIHJhd0Rpc3BsYXlWYWx1ZXMgPSBjb252ZXJ0MkxhYmVsVmFsdWVzKGxhYmVsZWRWYWx1ZXMpO1xuICAgIHZhciBmaXJzdFZhbCA9IHJhd0Rpc3BsYXlWYWx1ZXNbMF07XG5cbiAgICBpZiAoIW1lcmdlZE11bHRpcGxlICYmIGZpcnN0VmFsICYmIGlzTmlsKGZpcnN0VmFsLnZhbHVlKSAmJiBpc05pbChmaXJzdFZhbC5sYWJlbCkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmF3RGlzcGxheVZhbHVlcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBfaXRlbSRsYWJlbDtcblxuICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgaXRlbSksIHt9LCB7XG4gICAgICAgIGxhYmVsOiAoX2l0ZW0kbGFiZWwgPSBpdGVtLmxhYmVsKSAhPT0gbnVsbCAmJiBfaXRlbSRsYWJlbCAhPT0gdm9pZCAwID8gX2l0ZW0kbGFiZWwgOiBpdGVtLnZhbHVlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSwgW21lcmdlZEZpZWxkTmFtZXMsIG1lcmdlZE11bHRpcGxlLCByYXdDaGVja2VkVmFsdWVzLCByYXdMYWJlbGVkVmFsdWVzLCBjb252ZXJ0MkxhYmVsVmFsdWVzLCBzaG93Q2hlY2tlZFN0cmF0ZWd5LCBrZXlFbnRpdGllc10pO1xuXG4gIHZhciBfdXNlQ2FjaGUgPSB1c2VDYWNoZShkaXNwbGF5VmFsdWVzKSxcbiAgICAgIF91c2VDYWNoZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlQ2FjaGUsIDEpLFxuICAgICAgY2FjaGVkRGlzcGxheVZhbHVlcyA9IF91c2VDYWNoZTJbMF07IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBDaGFuZ2UgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICB2YXIgdHJpZ2dlckNoYW5nZSA9IHVzZVJlZkZ1bmMoZnVuY3Rpb24gKG5ld1Jhd1ZhbHVlcywgZXh0cmEsIHNvdXJjZSkge1xuICAgIHZhciBsYWJlbGVkVmFsdWVzID0gY29udmVydDJMYWJlbFZhbHVlcyhuZXdSYXdWYWx1ZXMpO1xuICAgIHNldEludGVybmFsVmFsdWUobGFiZWxlZFZhbHVlcyk7IC8vIENsZWFuIHVwIGlmIG5lZWRlZFxuXG4gICAgaWYgKGF1dG9DbGVhclNlYXJjaFZhbHVlKSB7XG4gICAgICBzZXRTZWFyY2hWYWx1ZSgnJyk7XG4gICAgfSAvLyBHZW5lcmF0ZSByZXN0IHBhcmFtZXRlcnMgaXMgY29zdGx5LCBzbyBvbmx5IGRvIGl0IHdoZW4gbmVjZXNzYXJ5XG5cblxuICAgIGlmIChvbkNoYW5nZSkge1xuICAgICAgdmFyIGV2ZW50VmFsdWVzID0gbmV3UmF3VmFsdWVzO1xuXG4gICAgICBpZiAodHJlZUNvbmR1Y3Rpb24pIHtcbiAgICAgICAgdmFyIGZvcm1hdHRlZEtleUxpc3QgPSBmb3JtYXRTdHJhdGVneVZhbHVlcyhuZXdSYXdWYWx1ZXMsIHNob3dDaGVja2VkU3RyYXRlZ3ksIGtleUVudGl0aWVzLCBtZXJnZWRGaWVsZE5hbWVzKTtcbiAgICAgICAgZXZlbnRWYWx1ZXMgPSBmb3JtYXR0ZWRLZXlMaXN0Lm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgdmFyIGVudGl0eSA9IHZhbHVlRW50aXRpZXMuZ2V0KGtleSk7XG4gICAgICAgICAgcmV0dXJuIGVudGl0eSA/IGVudGl0eS5ub2RlW21lcmdlZEZpZWxkTmFtZXMudmFsdWVdIDoga2V5O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIF9yZWYgPSBleHRyYSB8fCB7XG4gICAgICAgIHRyaWdnZXJWYWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBzZWxlY3RlZDogdW5kZWZpbmVkXG4gICAgICB9LFxuICAgICAgICAgIHRyaWdnZXJWYWx1ZSA9IF9yZWYudHJpZ2dlclZhbHVlLFxuICAgICAgICAgIHNlbGVjdGVkID0gX3JlZi5zZWxlY3RlZDtcblxuICAgICAgdmFyIHJldHVyblJhd1ZhbHVlcyA9IGV2ZW50VmFsdWVzOyAvLyBXZSBuZWVkIGZpbGwgaGFsZiBjaGVjayBiYWNrXG5cbiAgICAgIGlmICh0cmVlQ2hlY2tTdHJpY3RseSkge1xuICAgICAgICB2YXIgaGFsZlZhbHVlcyA9IHJhd0hhbGZMYWJlbGVkVmFsdWVzLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgIHJldHVybiAhZXZlbnRWYWx1ZXMuaW5jbHVkZXMoaXRlbS52YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm5SYXdWYWx1ZXMgPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHJldHVyblJhd1ZhbHVlcyksIF90b0NvbnN1bWFibGVBcnJheShoYWxmVmFsdWVzKSk7XG4gICAgICB9XG5cbiAgICAgIHZhciByZXR1cm5MYWJlbGVkVmFsdWVzID0gY29udmVydDJMYWJlbFZhbHVlcyhyZXR1cm5SYXdWYWx1ZXMpO1xuICAgICAgdmFyIGFkZGl0aW9uYWxJbmZvID0ge1xuICAgICAgICAvLyBbTGVnYWN5XSBBbHdheXMgcmV0dXJuIGFzIGFycmF5IGNvbnRhaW5zIGxhYmVsICYgdmFsdWVcbiAgICAgICAgcHJlVmFsdWU6IHJhd0xhYmVsZWRWYWx1ZXMsXG4gICAgICAgIHRyaWdnZXJWYWx1ZTogdHJpZ2dlclZhbHVlXG4gICAgICB9OyAvLyBbTGVnYWN5XSBGaWxsIGxlZ2FjeSBkYXRhIGlmIHVzZXIgcXVlcnkuXG4gICAgICAvLyBUaGlzIGlzIGV4cGFuc2l2ZSB0aGF0IHdlIG9ubHkgZmlsbCB3aGVuIHVzZXIgcXVlcnlcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1jb21wb25lbnQvdHJlZS1zZWxlY3QvYmxvYi9mZTMzZWI3YzI3ODMwYzlhYzcwY2QxZmRiMWViYmU3YmM2NzljMTZhL3NyYy9TZWxlY3QuanN4XG5cbiAgICAgIHZhciBzaG93UG9zaXRpb24gPSB0cnVlO1xuXG4gICAgICBpZiAodHJlZUNoZWNrU3RyaWN0bHkgfHwgc291cmNlID09PSAnc2VsZWN0aW9uJyAmJiAhc2VsZWN0ZWQpIHtcbiAgICAgICAgc2hvd1Bvc2l0aW9uID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGZpbGxBZGRpdGlvbmFsSW5mbyhhZGRpdGlvbmFsSW5mbywgdHJpZ2dlclZhbHVlLCBuZXdSYXdWYWx1ZXMsIG1lcmdlZFRyZWVEYXRhLCBzaG93UG9zaXRpb24sIG1lcmdlZEZpZWxkTmFtZXMpO1xuXG4gICAgICBpZiAobWVyZ2VkQ2hlY2thYmxlKSB7XG4gICAgICAgIGFkZGl0aW9uYWxJbmZvLmNoZWNrZWQgPSBzZWxlY3RlZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFkZGl0aW9uYWxJbmZvLnNlbGVjdGVkID0gc2VsZWN0ZWQ7XG4gICAgICB9XG5cbiAgICAgIHZhciByZXR1cm5WYWx1ZXMgPSBtZXJnZWRMYWJlbEluVmFsdWUgPyByZXR1cm5MYWJlbGVkVmFsdWVzIDogcmV0dXJuTGFiZWxlZFZhbHVlcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgICB9KTtcbiAgICAgIG9uQ2hhbmdlKG1lcmdlZE11bHRpcGxlID8gcmV0dXJuVmFsdWVzIDogcmV0dXJuVmFsdWVzWzBdLCBtZXJnZWRMYWJlbEluVmFsdWUgPyBudWxsIDogcmV0dXJuTGFiZWxlZFZhbHVlcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0ubGFiZWw7XG4gICAgICB9KSwgYWRkaXRpb25hbEluZm8pO1xuICAgIH1cbiAgfSk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IE9wdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFRyaWdnZXIgYnkgb3B0aW9uIGxpc3QgKi9cblxuICB2YXIgb25PcHRpb25TZWxlY3QgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoc2VsZWN0ZWRLZXksIF9yZWYyKSB7XG4gICAgdmFyIF9ub2RlJG1lcmdlZEZpZWxkTmFtZTtcblxuICAgIHZhciBzZWxlY3RlZCA9IF9yZWYyLnNlbGVjdGVkLFxuICAgICAgICBzb3VyY2UgPSBfcmVmMi5zb3VyY2U7XG4gICAgdmFyIGVudGl0eSA9IGtleUVudGl0aWVzW3NlbGVjdGVkS2V5XTtcbiAgICB2YXIgbm9kZSA9IGVudGl0eSA9PT0gbnVsbCB8fCBlbnRpdHkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVudGl0eS5ub2RlO1xuICAgIHZhciBzZWxlY3RlZFZhbHVlID0gKF9ub2RlJG1lcmdlZEZpZWxkTmFtZSA9IG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbm9kZVttZXJnZWRGaWVsZE5hbWVzLnZhbHVlXSkgIT09IG51bGwgJiYgX25vZGUkbWVyZ2VkRmllbGROYW1lICE9PSB2b2lkIDAgPyBfbm9kZSRtZXJnZWRGaWVsZE5hbWUgOiBzZWxlY3RlZEtleTsgLy8gTmV2ZXIgYmUgZmFsc3kgYnV0IGtlZXAgaXQgc2FmZVxuXG4gICAgaWYgKCFtZXJnZWRNdWx0aXBsZSkge1xuICAgICAgLy8gU2luZ2xlIG1vZGUgYWx3YXlzIHNldCB2YWx1ZVxuICAgICAgdHJpZ2dlckNoYW5nZShbc2VsZWN0ZWRWYWx1ZV0sIHtcbiAgICAgICAgc2VsZWN0ZWQ6IHRydWUsXG4gICAgICAgIHRyaWdnZXJWYWx1ZTogc2VsZWN0ZWRWYWx1ZVxuICAgICAgfSwgJ29wdGlvbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbmV3UmF3VmFsdWVzID0gc2VsZWN0ZWQgPyBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHJhd1ZhbHVlcyksIFtzZWxlY3RlZFZhbHVlXSkgOiByYXdDaGVja2VkVmFsdWVzLmZpbHRlcihmdW5jdGlvbiAodikge1xuICAgICAgICByZXR1cm4gdiAhPT0gc2VsZWN0ZWRWYWx1ZTtcbiAgICAgIH0pOyAvLyBBZGQga2V5cyBpZiB0cmVlIGNvbmR1Y3Rpb25cblxuICAgICAgaWYgKHRyZWVDb25kdWN0aW9uKSB7XG4gICAgICAgIC8vIFNob3VsZCBrZWVwIG1pc3NpbmcgdmFsdWVzXG4gICAgICAgIHZhciBfc3BsaXRSYXdWYWx1ZXMgPSBzcGxpdFJhd1ZhbHVlcyhuZXdSYXdWYWx1ZXMpLFxuICAgICAgICAgICAgbWlzc2luZ1Jhd1ZhbHVlcyA9IF9zcGxpdFJhd1ZhbHVlcy5taXNzaW5nUmF3VmFsdWVzLFxuICAgICAgICAgICAgZXhpc3RSYXdWYWx1ZXMgPSBfc3BsaXRSYXdWYWx1ZXMuZXhpc3RSYXdWYWx1ZXM7XG5cbiAgICAgICAgdmFyIGtleUxpc3QgPSBleGlzdFJhd1ZhbHVlcy5tYXAoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgIHJldHVybiB2YWx1ZUVudGl0aWVzLmdldCh2YWwpLmtleTtcbiAgICAgICAgfSk7IC8vIENvbmR1Y3Rpb24gYnkgc2VsZWN0ZWQgb3Igbm90XG5cbiAgICAgICAgdmFyIGNoZWNrZWRLZXlzO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICAgIHZhciBfY29uZHVjdENoZWNrID0gY29uZHVjdENoZWNrKGtleUxpc3QsIHRydWUsIGtleUVudGl0aWVzKTtcblxuICAgICAgICAgIGNoZWNrZWRLZXlzID0gX2NvbmR1Y3RDaGVjay5jaGVja2VkS2V5cztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgX2NvbmR1Y3RDaGVjazIgPSBjb25kdWN0Q2hlY2soa2V5TGlzdCwge1xuICAgICAgICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgICAgICAgICBoYWxmQ2hlY2tlZEtleXM6IHJhd0hhbGZDaGVja2VkVmFsdWVzXG4gICAgICAgICAgfSwga2V5RW50aXRpZXMpO1xuXG4gICAgICAgICAgY2hlY2tlZEtleXMgPSBfY29uZHVjdENoZWNrMi5jaGVja2VkS2V5cztcbiAgICAgICAgfSAvLyBGaWxsIGJhY2sgb2Yga2V5c1xuXG5cbiAgICAgICAgbmV3UmF3VmFsdWVzID0gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShtaXNzaW5nUmF3VmFsdWVzKSwgX3RvQ29uc3VtYWJsZUFycmF5KGNoZWNrZWRLZXlzLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgcmV0dXJuIGtleUVudGl0aWVzW2tleV0ubm9kZVttZXJnZWRGaWVsZE5hbWVzLnZhbHVlXTtcbiAgICAgICAgfSkpKTtcbiAgICAgIH1cblxuICAgICAgdHJpZ2dlckNoYW5nZShuZXdSYXdWYWx1ZXMsIHtcbiAgICAgICAgc2VsZWN0ZWQ6IHNlbGVjdGVkLFxuICAgICAgICB0cmlnZ2VyVmFsdWU6IHNlbGVjdGVkVmFsdWVcbiAgICAgIH0sIHNvdXJjZSB8fCAnb3B0aW9uJyk7XG4gICAgfSAvLyBUcmlnZ2VyIHNlbGVjdCBldmVudFxuXG5cbiAgICBpZiAoc2VsZWN0ZWQgfHwgIW1lcmdlZE11bHRpcGxlKSB7XG4gICAgICBvblNlbGVjdCA9PT0gbnVsbCB8fCBvblNlbGVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25TZWxlY3Qoc2VsZWN0ZWRWYWx1ZSwgZmlsbExlZ2FjeVByb3BzKG5vZGUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb25EZXNlbGVjdCA9PT0gbnVsbCB8fCBvbkRlc2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkRlc2VsZWN0KHNlbGVjdGVkVmFsdWUsIGZpbGxMZWdhY3lQcm9wcyhub2RlKSk7XG4gICAgfVxuICB9LCBbc3BsaXRSYXdWYWx1ZXMsIHZhbHVlRW50aXRpZXMsIGtleUVudGl0aWVzLCBtZXJnZWRGaWVsZE5hbWVzLCBtZXJnZWRNdWx0aXBsZSwgcmF3VmFsdWVzLCB0cmlnZ2VyQ2hhbmdlLCB0cmVlQ29uZHVjdGlvbiwgb25TZWxlY3QsIG9uRGVzZWxlY3QsIHJhd0NoZWNrZWRWYWx1ZXMsIHJhd0hhbGZDaGVja2VkVmFsdWVzXSk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IERyb3Bkb3duID09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIG9uSW50ZXJuYWxEcm9wZG93blZpc2libGVDaGFuZ2UgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAob3Blbikge1xuICAgIGlmIChvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZSkge1xuICAgICAgdmFyIGxlZ2FjeVBhcmFtID0ge307XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGVnYWN5UGFyYW0sICdkb2N1bWVudENsaWNrQ2xvc2UnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgIHdhcm5pbmcoZmFsc2UsICdTZWNvbmQgcGFyYW0gb2YgYG9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlYCBoYXMgYmVlbiByZW1vdmVkLicpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZShvcGVuLCBsZWdhY3lQYXJhbSk7XG4gICAgfVxuICB9LCBbb25Ecm9wZG93blZpc2libGVDaGFuZ2VdKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PSBEaXNwbGF5IENoYW5nZSA9PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgb25EaXNwbGF5VmFsdWVzQ2hhbmdlID0gdXNlUmVmRnVuYyhmdW5jdGlvbiAobmV3VmFsdWVzLCBpbmZvKSB7XG4gICAgdmFyIG5ld1Jhd1ZhbHVlcyA9IG5ld1ZhbHVlcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICAgIH0pO1xuXG4gICAgaWYgKGluZm8udHlwZSA9PT0gJ2NsZWFyJykge1xuICAgICAgdHJpZ2dlckNoYW5nZShuZXdSYXdWYWx1ZXMsIHt9LCAnc2VsZWN0aW9uJyk7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBUcmVlU2VsZWN0IG9ubHkgaGF2ZSBtdWx0aXBsZSBtb2RlIHdoaWNoIG1lYW5zIGRpc3BsYXkgY2hhbmdlIG9ubHkgaGFzIHJlbW92ZVxuXG5cbiAgICBpZiAoaW5mby52YWx1ZXMubGVuZ3RoKSB7XG4gICAgICBvbk9wdGlvblNlbGVjdChpbmZvLnZhbHVlc1swXS52YWx1ZSwge1xuICAgICAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgICAgIHNvdXJjZTogJ3NlbGVjdGlvbidcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IENvbnRleHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIHRyZWVTZWxlY3RDb250ZXh0ID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZpcnR1YWw6IHZpcnR1YWwsXG4gICAgICBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGg6IGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCxcbiAgICAgIGxpc3RIZWlnaHQ6IGxpc3RIZWlnaHQsXG4gICAgICBsaXN0SXRlbUhlaWdodDogbGlzdEl0ZW1IZWlnaHQsXG4gICAgICB0cmVlRGF0YTogZmlsdGVyZWRUcmVlRGF0YSxcbiAgICAgIGZpZWxkTmFtZXM6IG1lcmdlZEZpZWxkTmFtZXMsXG4gICAgICBvblNlbGVjdDogb25PcHRpb25TZWxlY3QsXG4gICAgICB0cmVlRXhwYW5kQWN0aW9uOiB0cmVlRXhwYW5kQWN0aW9uXG4gICAgfTtcbiAgfSwgW3ZpcnR1YWwsIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aCwgbGlzdEhlaWdodCwgbGlzdEl0ZW1IZWlnaHQsIGZpbHRlcmVkVHJlZURhdGEsIG1lcmdlZEZpZWxkTmFtZXMsIG9uT3B0aW9uU2VsZWN0LCB0cmVlRXhwYW5kQWN0aW9uXSk7IC8vID09PT09PT09PT09PT09PT09PT09PT09IExlZ2FjeSBDb250ZXh0ID09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIGxlZ2FjeUNvbnRleHQgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2hlY2thYmxlOiBtZXJnZWRDaGVja2FibGUsXG4gICAgICBsb2FkRGF0YTogbG9hZERhdGEsXG4gICAgICB0cmVlTG9hZGVkS2V5czogdHJlZUxvYWRlZEtleXMsXG4gICAgICBvblRyZWVMb2FkOiBvblRyZWVMb2FkLFxuICAgICAgY2hlY2tlZEtleXM6IHJhd0NoZWNrZWRWYWx1ZXMsXG4gICAgICBoYWxmQ2hlY2tlZEtleXM6IHJhd0hhbGZDaGVja2VkVmFsdWVzLFxuICAgICAgdHJlZURlZmF1bHRFeHBhbmRBbGw6IHRyZWVEZWZhdWx0RXhwYW5kQWxsLFxuICAgICAgdHJlZUV4cGFuZGVkS2V5czogdHJlZUV4cGFuZGVkS2V5cyxcbiAgICAgIHRyZWVEZWZhdWx0RXhwYW5kZWRLZXlzOiB0cmVlRGVmYXVsdEV4cGFuZGVkS2V5cyxcbiAgICAgIG9uVHJlZUV4cGFuZDogb25UcmVlRXhwYW5kLFxuICAgICAgdHJlZUljb246IHRyZWVJY29uLFxuICAgICAgdHJlZU1vdGlvbjogdHJlZU1vdGlvbixcbiAgICAgIHNob3dUcmVlSWNvbjogc2hvd1RyZWVJY29uLFxuICAgICAgc3dpdGNoZXJJY29uOiBzd2l0Y2hlckljb24sXG4gICAgICB0cmVlTGluZTogdHJlZUxpbmUsXG4gICAgICB0cmVlTm9kZUZpbHRlclByb3A6IHRyZWVOb2RlRmlsdGVyUHJvcCxcbiAgICAgIGtleUVudGl0aWVzOiBrZXlFbnRpdGllc1xuICAgIH07XG4gIH0sIFttZXJnZWRDaGVja2FibGUsIGxvYWREYXRhLCB0cmVlTG9hZGVkS2V5cywgb25UcmVlTG9hZCwgcmF3Q2hlY2tlZFZhbHVlcywgcmF3SGFsZkNoZWNrZWRWYWx1ZXMsIHRyZWVEZWZhdWx0RXhwYW5kQWxsLCB0cmVlRXhwYW5kZWRLZXlzLCB0cmVlRGVmYXVsdEV4cGFuZGVkS2V5cywgb25UcmVlRXhwYW5kLCB0cmVlSWNvbiwgdHJlZU1vdGlvbiwgc2hvd1RyZWVJY29uLCBzd2l0Y2hlckljb24sIHRyZWVMaW5lLCB0cmVlTm9kZUZpbHRlclByb3AsIGtleUVudGl0aWVzXSk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRyZWVTZWxlY3RDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IHRyZWVTZWxlY3RDb250ZXh0XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExlZ2FjeUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogbGVnYWN5Q29udGV4dFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChCYXNlU2VsZWN0LCBfZXh0ZW5kcyh7XG4gICAgcmVmOiByZWZcbiAgfSwgcmVzdFByb3BzLCB7XG4gICAgLy8gPj4+IE1JU0NcbiAgICBpZDogbWVyZ2VkSWQsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgbW9kZTogbWVyZ2VkTXVsdGlwbGUgPyAnbXVsdGlwbGUnIDogdW5kZWZpbmVkIC8vID4+PiBEaXNwbGF5IFZhbHVlXG4gICAgLFxuICAgIGRpc3BsYXlWYWx1ZXM6IGNhY2hlZERpc3BsYXlWYWx1ZXMsXG4gICAgb25EaXNwbGF5VmFsdWVzQ2hhbmdlOiBvbkRpc3BsYXlWYWx1ZXNDaGFuZ2UgLy8gPj4+IFNlYXJjaFxuICAgICxcbiAgICBzZWFyY2hWYWx1ZTogbWVyZ2VkU2VhcmNoVmFsdWUsXG4gICAgb25TZWFyY2g6IG9uSW50ZXJuYWxTZWFyY2ggLy8gPj4+IE9wdGlvbnNcbiAgICAsXG4gICAgT3B0aW9uTGlzdDogT3B0aW9uTGlzdCxcbiAgICBlbXB0eU9wdGlvbnM6ICFtZXJnZWRUcmVlRGF0YS5sZW5ndGgsXG4gICAgb25Ecm9wZG93blZpc2libGVDaGFuZ2U6IG9uSW50ZXJuYWxEcm9wZG93blZpc2libGVDaGFuZ2UsXG4gICAgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoOiBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGhcbiAgfSkpKSk7XG59KTsgLy8gQXNzaWduIG5hbWUgZm9yIERlYnVnXG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFRyZWVTZWxlY3QuZGlzcGxheU5hbWUgPSAnVHJlZVNlbGVjdCc7XG59XG5cbnZhciBHZW5lcmljVHJlZVNlbGVjdCA9IFRyZWVTZWxlY3Q7XG5HZW5lcmljVHJlZVNlbGVjdC5UcmVlTm9kZSA9IFRyZWVOb2RlO1xuR2VuZXJpY1RyZWVTZWxlY3QuU0hPV19BTEwgPSBTSE9XX0FMTDtcbkdlbmVyaWNUcmVlU2VsZWN0LlNIT1dfUEFSRU5UID0gU0hPV19QQVJFTlQ7XG5HZW5lcmljVHJlZVNlbGVjdC5TSE9XX0NISUxEID0gU0hPV19DSElMRDtcbmV4cG9ydCBkZWZhdWx0IEdlbmVyaWNUcmVlU2VsZWN0OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbnZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKSB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBSY1RyZWVTZWxlY3QsIHsgU0hPV19BTEwsIFNIT1dfQ0hJTEQsIFNIT1dfUEFSRU5ULCBUcmVlTm9kZSB9IGZyb20gJ3JjLXRyZWUtc2VsZWN0JztcbmltcG9ydCBvbWl0IGZyb20gXCJyYy11dGlsL2VzL29taXRcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCBkZWZhdWx0UmVuZGVyRW1wdHkgZnJvbSAnLi4vY29uZmlnLXByb3ZpZGVyL2RlZmF1bHRSZW5kZXJFbXB0eSc7XG5pbXBvcnQgRGlzYWJsZWRDb250ZXh0IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlci9EaXNhYmxlZENvbnRleHQnO1xuaW1wb3J0IFNpemVDb250ZXh0IGZyb20gJy4uL2NvbmZpZy1wcm92aWRlci9TaXplQ29udGV4dCc7XG5pbXBvcnQgeyBGb3JtSXRlbUlucHV0Q29udGV4dCB9IGZyb20gJy4uL2Zvcm0vY29udGV4dCc7XG5pbXBvcnQgZ2V0SWNvbnMgZnJvbSAnLi4vc2VsZWN0L3V0aWxzL2ljb25VdGlsJztcbmltcG9ydCByZW5kZXJTd2l0Y2hlckljb24gZnJvbSAnLi4vdHJlZS91dGlscy9pY29uVXRpbCc7XG5pbXBvcnQgeyBnZXRUcmFuc2l0aW9uRGlyZWN0aW9uLCBnZXRUcmFuc2l0aW9uTmFtZSB9IGZyb20gJy4uL191dGlsL21vdGlvbic7XG5pbXBvcnQgeyBnZXRNZXJnZWRTdGF0dXMsIGdldFN0YXR1c0NsYXNzTmFtZXMgfSBmcm9tICcuLi9fdXRpbC9zdGF0dXNVdGlscyc7XG5pbXBvcnQgeyB1c2VDb21wYWN0SXRlbUNvbnRleHQgfSBmcm9tICcuLi9zcGFjZS9Db21wYWN0JztcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4uL191dGlsL3dhcm5pbmcnO1xudmFyIEludGVybmFsVHJlZVNlbGVjdCA9IGZ1bmN0aW9uIEludGVybmFsVHJlZVNlbGVjdChfYSwgcmVmKSB7XG4gIHZhciBfY2xhc3NOYW1lczI7XG4gIHZhciBjdXN0b21pemVQcmVmaXhDbHMgPSBfYS5wcmVmaXhDbHMsXG4gICAgY3VzdG9taXplU2l6ZSA9IF9hLnNpemUsXG4gICAgY3VzdG9tRGlzYWJsZWQgPSBfYS5kaXNhYmxlZCxcbiAgICBfYSRib3JkZXJlZCA9IF9hLmJvcmRlcmVkLFxuICAgIGJvcmRlcmVkID0gX2EkYm9yZGVyZWQgPT09IHZvaWQgMCA/IHRydWUgOiBfYSRib3JkZXJlZCxcbiAgICBjbGFzc05hbWUgPSBfYS5jbGFzc05hbWUsXG4gICAgdHJlZUNoZWNrYWJsZSA9IF9hLnRyZWVDaGVja2FibGUsXG4gICAgbXVsdGlwbGUgPSBfYS5tdWx0aXBsZSxcbiAgICBfYSRsaXN0SGVpZ2h0ID0gX2EubGlzdEhlaWdodCxcbiAgICBsaXN0SGVpZ2h0ID0gX2EkbGlzdEhlaWdodCA9PT0gdm9pZCAwID8gMjU2IDogX2EkbGlzdEhlaWdodCxcbiAgICBfYSRsaXN0SXRlbUhlaWdodCA9IF9hLmxpc3RJdGVtSGVpZ2h0LFxuICAgIGxpc3RJdGVtSGVpZ2h0ID0gX2EkbGlzdEl0ZW1IZWlnaHQgPT09IHZvaWQgMCA/IDI2IDogX2EkbGlzdEl0ZW1IZWlnaHQsXG4gICAgcGxhY2VtZW50ID0gX2EucGxhY2VtZW50LFxuICAgIG5vdEZvdW5kQ29udGVudCA9IF9hLm5vdEZvdW5kQ29udGVudCxcbiAgICBfc3dpdGNoZXJJY29uID0gX2Euc3dpdGNoZXJJY29uLFxuICAgIHRyZWVMaW5lID0gX2EudHJlZUxpbmUsXG4gICAgZ2V0UG9wdXBDb250YWluZXIgPSBfYS5nZXRQb3B1cENvbnRhaW5lcixcbiAgICBkcm9wZG93bkNsYXNzTmFtZSA9IF9hLmRyb3Bkb3duQ2xhc3NOYW1lLFxuICAgIHBvcHVwQ2xhc3NOYW1lID0gX2EucG9wdXBDbGFzc05hbWUsXG4gICAgX2EkdHJlZUljb24gPSBfYS50cmVlSWNvbixcbiAgICB0cmVlSWNvbiA9IF9hJHRyZWVJY29uID09PSB2b2lkIDAgPyBmYWxzZSA6IF9hJHRyZWVJY29uLFxuICAgIHRyYW5zaXRpb25OYW1lID0gX2EudHJhbnNpdGlvbk5hbWUsXG4gICAgX2EkY2hvaWNlVHJhbnNpdGlvbk5hID0gX2EuY2hvaWNlVHJhbnNpdGlvbk5hbWUsXG4gICAgY2hvaWNlVHJhbnNpdGlvbk5hbWUgPSBfYSRjaG9pY2VUcmFuc2l0aW9uTmEgPT09IHZvaWQgMCA/ICcnIDogX2EkY2hvaWNlVHJhbnNpdGlvbk5hLFxuICAgIGN1c3RvbVN0YXR1cyA9IF9hLnN0YXR1cyxcbiAgICBzaG93QXJyb3cgPSBfYS5zaG93QXJyb3csXG4gICAgdHJlZUV4cGFuZEFjdGlvbiA9IF9hLnRyZWVFeHBhbmRBY3Rpb24sXG4gICAgcHJvcHMgPSBfX3Jlc3QoX2EsIFtcInByZWZpeENsc1wiLCBcInNpemVcIiwgXCJkaXNhYmxlZFwiLCBcImJvcmRlcmVkXCIsIFwiY2xhc3NOYW1lXCIsIFwidHJlZUNoZWNrYWJsZVwiLCBcIm11bHRpcGxlXCIsIFwibGlzdEhlaWdodFwiLCBcImxpc3RJdGVtSGVpZ2h0XCIsIFwicGxhY2VtZW50XCIsIFwibm90Rm91bmRDb250ZW50XCIsIFwic3dpdGNoZXJJY29uXCIsIFwidHJlZUxpbmVcIiwgXCJnZXRQb3B1cENvbnRhaW5lclwiLCBcImRyb3Bkb3duQ2xhc3NOYW1lXCIsIFwicG9wdXBDbGFzc05hbWVcIiwgXCJ0cmVlSWNvblwiLCBcInRyYW5zaXRpb25OYW1lXCIsIFwiY2hvaWNlVHJhbnNpdGlvbk5hbWVcIiwgXCJzdGF0dXNcIiwgXCJzaG93QXJyb3dcIiwgXCJ0cmVlRXhwYW5kQWN0aW9uXCJdKTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRDb250ZXh0UG9wdXBDb250YWluZXIgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQb3B1cENvbnRhaW5lcixcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgcmVuZGVyRW1wdHkgPSBfUmVhY3QkdXNlQ29udGV4dC5yZW5kZXJFbXB0eSxcbiAgICBkaXJlY3Rpb24gPSBfUmVhY3QkdXNlQ29udGV4dC5kaXJlY3Rpb24sXG4gICAgdmlydHVhbCA9IF9SZWFjdCR1c2VDb250ZXh0LnZpcnR1YWwsXG4gICAgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoID0gX1JlYWN0JHVzZUNvbnRleHQuZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoO1xuICB2YXIgc2l6ZSA9IFJlYWN0LnVzZUNvbnRleHQoU2l6ZUNvbnRleHQpO1xuICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKG11bHRpcGxlICE9PSBmYWxzZSB8fCAhdHJlZUNoZWNrYWJsZSwgJ1RyZWVTZWxlY3QnLCAnYG11bHRpcGxlYCB3aWxsIGFsd2F5cyBiZSBgdHJ1ZWAgd2hlbiBgdHJlZUNoZWNrYWJsZWAgaXMgdHJ1ZScpIDogdm9pZCAwO1xuICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCFkcm9wZG93bkNsYXNzTmFtZSwgJ1RyZWVTZWxlY3QnLCAnYGRyb3Bkb3duQ2xhc3NOYW1lYCBpcyBkZXByZWNhdGVkIHdoaWNoIHdpbGwgYmUgcmVtb3ZlZCBpbiBuZXh0IG1ham9yIHZlcnNpb24uIFBsZWFzZSB1c2UgYHBvcHVwQ2xhc3NOYW1lYCBpbnN0ZWFkLicpIDogdm9pZCAwO1xuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCdzZWxlY3QnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgdHJlZVByZWZpeENscyA9IGdldFByZWZpeENscygnc2VsZWN0LXRyZWUnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgdHJlZVNlbGVjdFByZWZpeENscyA9IGdldFByZWZpeENscygndHJlZS1zZWxlY3QnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgX3VzZUNvbXBhY3RJdGVtQ29udGV4ID0gdXNlQ29tcGFjdEl0ZW1Db250ZXh0KHByZWZpeENscywgZGlyZWN0aW9uKSxcbiAgICBjb21wYWN0U2l6ZSA9IF91c2VDb21wYWN0SXRlbUNvbnRleC5jb21wYWN0U2l6ZSxcbiAgICBjb21wYWN0SXRlbUNsYXNzbmFtZXMgPSBfdXNlQ29tcGFjdEl0ZW1Db250ZXguY29tcGFjdEl0ZW1DbGFzc25hbWVzO1xuICB2YXIgbWVyZ2VkRHJvcGRvd25DbGFzc05hbWUgPSBjbGFzc05hbWVzKHBvcHVwQ2xhc3NOYW1lIHx8IGRyb3Bkb3duQ2xhc3NOYW1lLCBcIlwiLmNvbmNhdCh0cmVlU2VsZWN0UHJlZml4Q2xzLCBcIi1kcm9wZG93blwiKSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdCh0cmVlU2VsZWN0UHJlZml4Q2xzLCBcIi1kcm9wZG93bi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpKTtcbiAgdmFyIGlzTXVsdGlwbGUgPSAhISh0cmVlQ2hlY2thYmxlIHx8IG11bHRpcGxlKTtcbiAgdmFyIG1lcmdlZFNob3dBcnJvdyA9IHNob3dBcnJvdyAhPT0gdW5kZWZpbmVkID8gc2hvd0Fycm93IDogcHJvcHMubG9hZGluZyB8fCAhaXNNdWx0aXBsZTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IEZvcm0gPT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfdXNlQ29udGV4dCA9IHVzZUNvbnRleHQoRm9ybUl0ZW1JbnB1dENvbnRleHQpLFxuICAgIGNvbnRleHRTdGF0dXMgPSBfdXNlQ29udGV4dC5zdGF0dXMsXG4gICAgaGFzRmVlZGJhY2sgPSBfdXNlQ29udGV4dC5oYXNGZWVkYmFjayxcbiAgICBpc0Zvcm1JdGVtSW5wdXQgPSBfdXNlQ29udGV4dC5pc0Zvcm1JdGVtSW5wdXQsXG4gICAgZmVlZGJhY2tJY29uID0gX3VzZUNvbnRleHQuZmVlZGJhY2tJY29uO1xuICB2YXIgbWVyZ2VkU3RhdHVzID0gZ2V0TWVyZ2VkU3RhdHVzKGNvbnRleHRTdGF0dXMsIGN1c3RvbVN0YXR1cyk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PSBJY29ucyA9PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF9nZXRJY29ucyA9IGdldEljb25zKF9leHRlbmRzKF9leHRlbmRzKHt9LCBwcm9wcyksIHtcbiAgICAgIG11bHRpcGxlOiBpc011bHRpcGxlLFxuICAgICAgc2hvd0Fycm93OiBtZXJnZWRTaG93QXJyb3csXG4gICAgICBoYXNGZWVkYmFjazogaGFzRmVlZGJhY2ssXG4gICAgICBmZWVkYmFja0ljb246IGZlZWRiYWNrSWNvbixcbiAgICAgIHByZWZpeENsczogcHJlZml4Q2xzXG4gICAgfSkpLFxuICAgIHN1ZmZpeEljb24gPSBfZ2V0SWNvbnMuc3VmZml4SWNvbixcbiAgICByZW1vdmVJY29uID0gX2dldEljb25zLnJlbW92ZUljb24sXG4gICAgY2xlYXJJY29uID0gX2dldEljb25zLmNsZWFySWNvbjtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IEVtcHR5ID09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbWVyZ2VkTm90Rm91bmQ7XG4gIGlmIChub3RGb3VuZENvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIG1lcmdlZE5vdEZvdW5kID0gbm90Rm91bmRDb250ZW50O1xuICB9IGVsc2Uge1xuICAgIG1lcmdlZE5vdEZvdW5kID0gKHJlbmRlckVtcHR5IHx8IGRlZmF1bHRSZW5kZXJFbXB0eSkoJ1NlbGVjdCcpO1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHNlbGVjdFByb3BzID0gb21pdChwcm9wcywgWydzdWZmaXhJY29uJywgJ2l0ZW1JY29uJywgJ3JlbW92ZUljb24nLCAnY2xlYXJJY29uJywgJ3N3aXRjaGVySWNvbiddKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IFBsYWNlbWVudCA9PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGdldFBsYWNlbWVudCA9IGZ1bmN0aW9uIGdldFBsYWNlbWVudCgpIHtcbiAgICBpZiAocGxhY2VtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBwbGFjZW1lbnQ7XG4gICAgfVxuICAgIHJldHVybiBkaXJlY3Rpb24gPT09ICdydGwnID8gJ2JvdHRvbVJpZ2h0JyA6ICdib3R0b21MZWZ0JztcbiAgfTtcbiAgdmFyIG1lcmdlZFNpemUgPSBjb21wYWN0U2l6ZSB8fCBjdXN0b21pemVTaXplIHx8IHNpemU7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PSBEaXNhYmxlZCA9PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGRpc2FibGVkID0gUmVhY3QudXNlQ29udGV4dChEaXNhYmxlZENvbnRleHQpO1xuICB2YXIgbWVyZ2VkRGlzYWJsZWQgPSBjdXN0b21EaXNhYmxlZCAhPT0gbnVsbCAmJiBjdXN0b21EaXNhYmxlZCAhPT0gdm9pZCAwID8gY3VzdG9tRGlzYWJsZWQgOiBkaXNhYmxlZDtcbiAgdmFyIG1lcmdlZENsYXNzTmFtZSA9IGNsYXNzTmFtZXMoIWN1c3RvbWl6ZVByZWZpeENscyAmJiB0cmVlU2VsZWN0UHJlZml4Q2xzLCAoX2NsYXNzTmFtZXMyID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbGdcIiksIG1lcmdlZFNpemUgPT09ICdsYXJnZScpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNtXCIpLCBtZXJnZWRTaXplID09PSAnc21hbGwnKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWJvcmRlcmxlc3NcIiksICFib3JkZXJlZCksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW4tZm9ybS1pdGVtXCIpLCBpc0Zvcm1JdGVtSW5wdXQpLCBfY2xhc3NOYW1lczIpLCBnZXRTdGF0dXNDbGFzc05hbWVzKHByZWZpeENscywgbWVyZ2VkU3RhdHVzLCBoYXNGZWVkYmFjayksIGNvbXBhY3RJdGVtQ2xhc3NuYW1lcywgY2xhc3NOYW1lKTtcbiAgdmFyIHJvb3RQcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJjVHJlZVNlbGVjdCwgX2V4dGVuZHMoe1xuICAgIHZpcnR1YWw6IHZpcnR1YWwsXG4gICAgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoOiBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGgsXG4gICAgZGlzYWJsZWQ6IG1lcmdlZERpc2FibGVkXG4gIH0sIHNlbGVjdFByb3BzLCB7XG4gICAgcmVmOiByZWYsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lOiBtZXJnZWRDbGFzc05hbWUsXG4gICAgbGlzdEhlaWdodDogbGlzdEhlaWdodCxcbiAgICBsaXN0SXRlbUhlaWdodDogbGlzdEl0ZW1IZWlnaHQsXG4gICAgdHJlZUNoZWNrYWJsZTogdHJlZUNoZWNrYWJsZSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdHJlZS1jaGVja2JveC1pbm5lclwiKVxuICAgIH0pIDogdHJlZUNoZWNrYWJsZSxcbiAgICB0cmVlTGluZTogISF0cmVlTGluZSxcbiAgICBpbnB1dEljb246IHN1ZmZpeEljb24sXG4gICAgbXVsdGlwbGU6IG11bHRpcGxlLFxuICAgIHBsYWNlbWVudDogZ2V0UGxhY2VtZW50KCksXG4gICAgcmVtb3ZlSWNvbjogcmVtb3ZlSWNvbixcbiAgICBjbGVhckljb246IGNsZWFySWNvbixcbiAgICBzd2l0Y2hlckljb246IGZ1bmN0aW9uIHN3aXRjaGVySWNvbihub2RlUHJvcHMpIHtcbiAgICAgIHJldHVybiByZW5kZXJTd2l0Y2hlckljb24odHJlZVByZWZpeENscywgX3N3aXRjaGVySWNvbiwgdHJlZUxpbmUsIG5vZGVQcm9wcyk7XG4gICAgfSxcbiAgICBzaG93VHJlZUljb246IHRyZWVJY29uLFxuICAgIG5vdEZvdW5kQ29udGVudDogbWVyZ2VkTm90Rm91bmQsXG4gICAgZ2V0UG9wdXBDb250YWluZXI6IGdldFBvcHVwQ29udGFpbmVyIHx8IGdldENvbnRleHRQb3B1cENvbnRhaW5lcixcbiAgICB0cmVlTW90aW9uOiBudWxsLFxuICAgIGRyb3Bkb3duQ2xhc3NOYW1lOiBtZXJnZWREcm9wZG93bkNsYXNzTmFtZSxcbiAgICBjaG9pY2VUcmFuc2l0aW9uTmFtZTogZ2V0VHJhbnNpdGlvbk5hbWUocm9vdFByZWZpeENscywgJycsIGNob2ljZVRyYW5zaXRpb25OYW1lKSxcbiAgICB0cmFuc2l0aW9uTmFtZTogZ2V0VHJhbnNpdGlvbk5hbWUocm9vdFByZWZpeENscywgZ2V0VHJhbnNpdGlvbkRpcmVjdGlvbihwbGFjZW1lbnQpLCB0cmFuc2l0aW9uTmFtZSksXG4gICAgc2hvd0Fycm93OiBoYXNGZWVkYmFjayB8fCBzaG93QXJyb3csXG4gICAgdHJlZUV4cGFuZEFjdGlvbjogdHJlZUV4cGFuZEFjdGlvblxuICB9KSk7XG59O1xudmFyIFRyZWVTZWxlY3RSZWYgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihJbnRlcm5hbFRyZWVTZWxlY3QpO1xudmFyIFRyZWVTZWxlY3QgPSBUcmVlU2VsZWN0UmVmO1xuVHJlZVNlbGVjdC5UcmVlTm9kZSA9IFRyZWVOb2RlO1xuVHJlZVNlbGVjdC5TSE9XX0FMTCA9IFNIT1dfQUxMO1xuVHJlZVNlbGVjdC5TSE9XX1BBUkVOVCA9IFNIT1dfUEFSRU5UO1xuVHJlZVNlbGVjdC5TSE9XX0NISUxEID0gU0hPV19DSElMRDtcbmV4cG9ydCB7IFRyZWVOb2RlIH07XG5leHBvcnQgZGVmYXVsdCBUcmVlU2VsZWN0OyIsImZ1bmN0aW9uIGdldEVycm9yKG9wdGlvbiwgeGhyKSB7XG4gIHZhciBtc2cgPSBcImNhbm5vdCBcIi5jb25jYXQob3B0aW9uLm1ldGhvZCwgXCIgXCIpLmNvbmNhdChvcHRpb24uYWN0aW9uLCBcIiBcIikuY29uY2F0KHhoci5zdGF0dXMsIFwiJ1wiKTtcbiAgdmFyIGVyciA9IG5ldyBFcnJvcihtc2cpO1xuICBlcnIuc3RhdHVzID0geGhyLnN0YXR1cztcbiAgZXJyLm1ldGhvZCA9IG9wdGlvbi5tZXRob2Q7XG4gIGVyci51cmwgPSBvcHRpb24uYWN0aW9uO1xuICByZXR1cm4gZXJyO1xufVxuXG5mdW5jdGlvbiBnZXRCb2R5KHhocikge1xuICB2YXIgdGV4dCA9IHhoci5yZXNwb25zZVRleHQgfHwgeGhyLnJlc3BvbnNlO1xuXG4gIGlmICghdGV4dCkge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVwbG9hZChvcHRpb24pIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblxuICBpZiAob3B0aW9uLm9uUHJvZ3Jlc3MgJiYgeGhyLnVwbG9hZCkge1xuICAgIHhoci51cGxvYWQub25wcm9ncmVzcyA9IGZ1bmN0aW9uIHByb2dyZXNzKGUpIHtcbiAgICAgIGlmIChlLnRvdGFsID4gMCkge1xuICAgICAgICBlLnBlcmNlbnQgPSBlLmxvYWRlZCAvIGUudG90YWwgKiAxMDA7XG4gICAgICB9XG5cbiAgICAgIG9wdGlvbi5vblByb2dyZXNzKGUpO1xuICAgIH07XG4gIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG5cblxuICB2YXIgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcblxuICBpZiAob3B0aW9uLmRhdGEpIHtcbiAgICBPYmplY3Qua2V5cyhvcHRpb24uZGF0YSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgdmFsdWUgPSBvcHRpb24uZGF0YVtrZXldOyAvLyBzdXBwb3J0IGtleS12YWx1ZSBhcnJheSBkYXRhXG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgLy8geyBsaXN0OiBbIDExLCAyMiBdIH1cbiAgICAgICAgICAvLyBmb3JtRGF0YS5hcHBlbmQoJ2xpc3RbXScsIDExKTtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoXCJcIi5jb25jYXQoa2V5LCBcIltdXCIpLCBpdGVtKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgdmFsdWUpO1xuICAgIH0pO1xuICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuXG5cbiAgaWYgKG9wdGlvbi5maWxlIGluc3RhbmNlb2YgQmxvYikge1xuICAgIGZvcm1EYXRhLmFwcGVuZChvcHRpb24uZmlsZW5hbWUsIG9wdGlvbi5maWxlLCBvcHRpb24uZmlsZS5uYW1lKTtcbiAgfSBlbHNlIHtcbiAgICBmb3JtRGF0YS5hcHBlbmQob3B0aW9uLmZpbGVuYW1lLCBvcHRpb24uZmlsZSk7XG4gIH1cblxuICB4aHIub25lcnJvciA9IGZ1bmN0aW9uIGVycm9yKGUpIHtcbiAgICBvcHRpb24ub25FcnJvcihlKTtcbiAgfTtcblxuICB4aHIub25sb2FkID0gZnVuY3Rpb24gb25sb2FkKCkge1xuICAgIC8vIGFsbG93IHN1Y2Nlc3Mgd2hlbiAyeHggc3RhdHVzXG4gICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1jb21wb25lbnQvdXBsb2FkL2lzc3Vlcy8zNFxuICAgIGlmICh4aHIuc3RhdHVzIDwgMjAwIHx8IHhoci5zdGF0dXMgPj0gMzAwKSB7XG4gICAgICByZXR1cm4gb3B0aW9uLm9uRXJyb3IoZ2V0RXJyb3Iob3B0aW9uLCB4aHIpLCBnZXRCb2R5KHhocikpO1xuICAgIH1cblxuICAgIHJldHVybiBvcHRpb24ub25TdWNjZXNzKGdldEJvZHkoeGhyKSwgeGhyKTtcbiAgfTtcblxuICB4aHIub3BlbihvcHRpb24ubWV0aG9kLCBvcHRpb24uYWN0aW9uLCB0cnVlKTsgLy8gSGFzIHRvIGJlIGFmdGVyIGAub3BlbigpYC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbnlvL2Ryb3B6b25lL2lzc3Vlcy8xNzlcblxuICBpZiAob3B0aW9uLndpdGhDcmVkZW50aWFscyAmJiAnd2l0aENyZWRlbnRpYWxzJyBpbiB4aHIpIHtcbiAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBoZWFkZXJzID0gb3B0aW9uLmhlYWRlcnMgfHwge307IC8vIHdoZW4gc2V0IGhlYWRlcnNbJ1gtUmVxdWVzdGVkLVdpdGgnXSA9IG51bGwgLCBjYW4gY2xvc2UgZGVmYXVsdCBYSFIgaGVhZGVyXG4gIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtY29tcG9uZW50L3VwbG9hZC9pc3N1ZXMvMzNcblxuICBpZiAoaGVhZGVyc1snWC1SZXF1ZXN0ZWQtV2l0aCddICE9PSBudWxsKSB7XG4gICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ1gtUmVxdWVzdGVkLVdpdGgnLCAnWE1MSHR0cFJlcXVlc3QnKTtcbiAgfVxuXG4gIE9iamVjdC5rZXlzKGhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24gKGgpIHtcbiAgICBpZiAoaGVhZGVyc1toXSAhPT0gbnVsbCkge1xuICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaCwgaGVhZGVyc1toXSk7XG4gICAgfVxuICB9KTtcbiAgeGhyLnNlbmQoZm9ybURhdGEpO1xuICByZXR1cm4ge1xuICAgIGFib3J0OiBmdW5jdGlvbiBhYm9ydCgpIHtcbiAgICAgIHhoci5hYm9ydCgpO1xuICAgIH1cbiAgfTtcbn0iLCJ2YXIgbm93ID0gK25ldyBEYXRlKCk7XG52YXIgaW5kZXggPSAwO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdWlkKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXNcbiAgcmV0dXJuIFwicmMtdXBsb2FkLVwiLmNvbmNhdChub3csIFwiLVwiKS5jb25jYXQoKytpbmRleCk7XG59IiwiaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIChmaWxlLCBhY2NlcHRlZEZpbGVzKSB7XG4gIGlmIChmaWxlICYmIGFjY2VwdGVkRmlsZXMpIHtcbiAgICB2YXIgYWNjZXB0ZWRGaWxlc0FycmF5ID0gQXJyYXkuaXNBcnJheShhY2NlcHRlZEZpbGVzKSA/IGFjY2VwdGVkRmlsZXMgOiBhY2NlcHRlZEZpbGVzLnNwbGl0KCcsJyk7XG4gICAgdmFyIGZpbGVOYW1lID0gZmlsZS5uYW1lIHx8ICcnO1xuICAgIHZhciBtaW1lVHlwZSA9IGZpbGUudHlwZSB8fCAnJztcbiAgICB2YXIgYmFzZU1pbWVUeXBlID0gbWltZVR5cGUucmVwbGFjZSgvXFwvLiokLywgJycpO1xuICAgIHJldHVybiBhY2NlcHRlZEZpbGVzQXJyYXkuc29tZShmdW5jdGlvbiAodHlwZSkge1xuICAgICAgdmFyIHZhbGlkVHlwZSA9IHR5cGUudHJpbSgpOyAvLyBUaGlzIGlzIHNvbWV0aGluZyBsaWtlICovKiwqICBhbGxvdyBhbGwgZmlsZXNcblxuICAgICAgaWYgKC9eXFwqKFxcL1xcKik/JC8udGVzdCh0eXBlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gLy8gbGlrZSAuanBnLCAucG5nXG5cblxuICAgICAgaWYgKHZhbGlkVHlwZS5jaGFyQXQoMCkgPT09ICcuJykge1xuICAgICAgICB2YXIgbG93ZXJGaWxlTmFtZSA9IGZpbGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHZhciBsb3dlclR5cGUgPSB2YWxpZFR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgdmFyIGFmZml4TGlzdCA9IFtsb3dlclR5cGVdO1xuXG4gICAgICAgIGlmIChsb3dlclR5cGUgPT09ICcuanBnJyB8fCBsb3dlclR5cGUgPT09ICcuanBlZycpIHtcbiAgICAgICAgICBhZmZpeExpc3QgPSBbJy5qcGcnLCAnLmpwZWcnXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhZmZpeExpc3Quc29tZShmdW5jdGlvbiAoYWZmaXgpIHtcbiAgICAgICAgICByZXR1cm4gbG93ZXJGaWxlTmFtZS5lbmRzV2l0aChhZmZpeCk7XG4gICAgICAgIH0pO1xuICAgICAgfSAvLyBUaGlzIGlzIHNvbWV0aGluZyBsaWtlIGEgaW1hZ2UvKiBtaW1lIHR5cGVcblxuXG4gICAgICBpZiAoL1xcL1xcKiQvLnRlc3QodmFsaWRUeXBlKSkge1xuICAgICAgICByZXR1cm4gYmFzZU1pbWVUeXBlID09PSB2YWxpZFR5cGUucmVwbGFjZSgvXFwvLiokLywgJycpO1xuICAgICAgfSAvLyBGdWxsIG1hdGNoXG5cblxuICAgICAgaWYgKG1pbWVUeXBlID09PSB2YWxpZFR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IC8vIEludmFsaWRhdGUgdHlwZSBzaG91bGQgc2tpcFxuXG5cbiAgICAgIGlmICgvXlxcdyskLy50ZXN0KHZhbGlkVHlwZSkpIHtcbiAgICAgICAgd2FybmluZyhmYWxzZSwgXCJVcGxvYWQgdGFrZXMgYW4gaW52YWxpZGF0ZSAnYWNjZXB0JyB0eXBlICdcIi5jb25jYXQodmFsaWRUeXBlLCBcIicuU2tpcCBmb3IgY2hlY2suXCIpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufSk7IiwiZnVuY3Rpb24gbG9vcEZpbGVzKGl0ZW0sIGNhbGxiYWNrKSB7XG4gIHZhciBkaXJSZWFkZXIgPSBpdGVtLmNyZWF0ZVJlYWRlcigpO1xuICB2YXIgZmlsZUxpc3QgPSBbXTtcblxuICBmdW5jdGlvbiBzZXF1ZW5jZSgpIHtcbiAgICBkaXJSZWFkZXIucmVhZEVudHJpZXMoZnVuY3Rpb24gKGVudHJpZXMpIHtcbiAgICAgIHZhciBlbnRyeUxpc3QgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoZW50cmllcyk7XG4gICAgICBmaWxlTGlzdCA9IGZpbGVMaXN0LmNvbmNhdChlbnRyeUxpc3QpOyAvLyBDaGVjayBpZiBhbGwgdGhlIGZpbGUgaGFzIGJlZW4gdmlld2VkXG5cbiAgICAgIHZhciBpc0ZpbmlzaGVkID0gIWVudHJ5TGlzdC5sZW5ndGg7XG5cbiAgICAgIGlmIChpc0ZpbmlzaGVkKSB7XG4gICAgICAgIGNhbGxiYWNrKGZpbGVMaXN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlcXVlbmNlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzZXF1ZW5jZSgpO1xufVxuXG52YXIgdHJhdmVyc2VGaWxlVHJlZSA9IGZ1bmN0aW9uIHRyYXZlcnNlRmlsZVRyZWUoZmlsZXMsIGNhbGxiYWNrLCBpc0FjY2VwdGVkKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgdmFyIF90cmF2ZXJzZUZpbGVUcmVlID0gZnVuY3Rpb24gX3RyYXZlcnNlRmlsZVRyZWUoaXRlbSwgcGF0aCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgIGl0ZW0ucGF0aCA9IHBhdGggfHwgJyc7XG5cbiAgICBpZiAoaXRlbS5pc0ZpbGUpIHtcbiAgICAgIGl0ZW0uZmlsZShmdW5jdGlvbiAoZmlsZSkge1xuICAgICAgICBpZiAoaXNBY2NlcHRlZChmaWxlKSkge1xuICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzE2NDI2XG4gICAgICAgICAgaWYgKGl0ZW0uZnVsbFBhdGggJiYgIWZpbGUud2Via2l0UmVsYXRpdmVQYXRoKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhmaWxlLCB7XG4gICAgICAgICAgICAgIHdlYmtpdFJlbGF0aXZlUGF0aDoge1xuICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cblxuICAgICAgICAgICAgZmlsZS53ZWJraXRSZWxhdGl2ZVBhdGggPSBpdGVtLmZ1bGxQYXRoLnJlcGxhY2UoL15cXC8vLCAnJyk7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhmaWxlLCB7XG4gICAgICAgICAgICAgIHdlYmtpdFJlbGF0aXZlUGF0aDoge1xuICAgICAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYWxsYmFjayhbZmlsZV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGl0ZW0uaXNEaXJlY3RvcnkpIHtcbiAgICAgIGxvb3BGaWxlcyhpdGVtLCBmdW5jdGlvbiAoZW50cmllcykge1xuICAgICAgICBlbnRyaWVzLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5SXRlbSkge1xuICAgICAgICAgIF90cmF2ZXJzZUZpbGVUcmVlKGVudHJ5SXRlbSwgXCJcIi5jb25jYXQocGF0aCkuY29uY2F0KGl0ZW0ubmFtZSwgXCIvXCIpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgZmlsZXMuZm9yRWFjaChmdW5jdGlvbiAoZmlsZSkge1xuICAgIF90cmF2ZXJzZUZpbGVUcmVlKGZpbGUud2Via2l0R2V0QXNFbnRyeSgpKTtcbiAgfSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCB0cmF2ZXJzZUZpbGVUcmVlOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgX3JlZ2VuZXJhdG9yUnVudGltZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcmVnZW5lcmF0b3JSdW50aW1lXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX2FzeW5jVG9HZW5lcmF0b3IgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FzeW5jVG9HZW5lcmF0b3JcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzXCI7XG5pbXBvcnQgX2NyZWF0ZVN1cGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVTdXBlclwiO1xudmFyIF9leGNsdWRlZCA9IFtcImNvbXBvbmVudFwiLCBcInByZWZpeENsc1wiLCBcImNsYXNzTmFtZVwiLCBcImRpc2FibGVkXCIsIFwiaWRcIiwgXCJzdHlsZVwiLCBcIm11bHRpcGxlXCIsIFwiYWNjZXB0XCIsIFwiY2FwdHVyZVwiLCBcImNoaWxkcmVuXCIsIFwiZGlyZWN0b3J5XCIsIFwib3BlbkZpbGVEaWFsb2dPbkNsaWNrXCIsIFwib25Nb3VzZUVudGVyXCIsIFwib25Nb3VzZUxlYXZlXCJdO1xuaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHBpY2tBdHRycyBmcm9tIFwicmMtdXRpbC9lcy9waWNrQXR0cnNcIjtcbmltcG9ydCBkZWZhdWx0UmVxdWVzdCBmcm9tICcuL3JlcXVlc3QnO1xuaW1wb3J0IGdldFVpZCBmcm9tICcuL3VpZCc7XG5pbXBvcnQgYXR0ckFjY2VwdCBmcm9tICcuL2F0dHItYWNjZXB0JztcbmltcG9ydCB0cmF2ZXJzZUZpbGVUcmVlIGZyb20gJy4vdHJhdmVyc2VGaWxlVHJlZSc7XG5cbnZhciBBamF4VXBsb2FkZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzKEFqYXhVcGxvYWRlciwgX0NvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihBamF4VXBsb2FkZXIpO1xuXG4gIGZ1bmN0aW9uIEFqYXhVcGxvYWRlcigpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQWpheFVwbG9hZGVyKTtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsLmFwcGx5KF9zdXBlciwgW3RoaXNdLmNvbmNhdChhcmdzKSk7XG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICB1aWQ6IGdldFVpZCgpXG4gICAgfTtcbiAgICBfdGhpcy5yZXFzID0ge307XG4gICAgX3RoaXMuZmlsZUlucHV0ID0gdm9pZCAwO1xuICAgIF90aGlzLl9pc01vdW50ZWQgPSB2b2lkIDA7XG5cbiAgICBfdGhpcy5vbkNoYW5nZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBhY2NlcHQgPSBfdGhpcyRwcm9wcy5hY2NlcHQsXG4gICAgICAgICAgZGlyZWN0b3J5ID0gX3RoaXMkcHJvcHMuZGlyZWN0b3J5O1xuICAgICAgdmFyIGZpbGVzID0gZS50YXJnZXQuZmlsZXM7XG5cbiAgICAgIHZhciBhY2NlcHRlZEZpbGVzID0gX3RvQ29uc3VtYWJsZUFycmF5KGZpbGVzKS5maWx0ZXIoZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuICFkaXJlY3RvcnkgfHwgYXR0ckFjY2VwdChmaWxlLCBhY2NlcHQpO1xuICAgICAgfSk7XG5cbiAgICAgIF90aGlzLnVwbG9hZEZpbGVzKGFjY2VwdGVkRmlsZXMpO1xuXG4gICAgICBfdGhpcy5yZXNldCgpO1xuICAgIH07XG5cbiAgICBfdGhpcy5vbkNsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBlbCA9IF90aGlzLmZpbGVJbnB1dDtcblxuICAgICAgaWYgKCFlbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzMi5jaGlsZHJlbixcbiAgICAgICAgICBvbkNsaWNrID0gX3RoaXMkcHJvcHMyLm9uQ2xpY2s7XG5cbiAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi50eXBlID09PSAnYnV0dG9uJykge1xuICAgICAgICB2YXIgcGFyZW50ID0gZWwucGFyZW50Tm9kZTtcbiAgICAgICAgcGFyZW50LmZvY3VzKCk7XG4gICAgICAgIHBhcmVudC5xdWVyeVNlbGVjdG9yKCdidXR0b24nKS5ibHVyKCk7XG4gICAgICB9XG5cbiAgICAgIGVsLmNsaWNrKCk7XG5cbiAgICAgIGlmIChvbkNsaWNrKSB7XG4gICAgICAgIG9uQ2xpY2soZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLm9uS2V5RG93biA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgICAgX3RoaXMub25DbGljayhlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMub25GaWxlRHJvcCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgbXVsdGlwbGUgPSBfdGhpcy5wcm9wcy5tdWx0aXBsZTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgaWYgKGUudHlwZSA9PT0gJ2RyYWdvdmVyJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpcy5wcm9wcy5kaXJlY3RvcnkpIHtcbiAgICAgICAgdHJhdmVyc2VGaWxlVHJlZShBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLmRhdGFUcmFuc2Zlci5pdGVtcyksIF90aGlzLnVwbG9hZEZpbGVzLCBmdW5jdGlvbiAoX2ZpbGUpIHtcbiAgICAgICAgICByZXR1cm4gYXR0ckFjY2VwdChfZmlsZSwgX3RoaXMucHJvcHMuYWNjZXB0KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZmlsZXMgPSBfdG9Db25zdW1hYmxlQXJyYXkoZS5kYXRhVHJhbnNmZXIuZmlsZXMpLmZpbHRlcihmdW5jdGlvbiAoZmlsZSkge1xuICAgICAgICAgIHJldHVybiBhdHRyQWNjZXB0KGZpbGUsIF90aGlzLnByb3BzLmFjY2VwdCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChtdWx0aXBsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBmaWxlcyA9IGZpbGVzLnNsaWNlKDAsIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMudXBsb2FkRmlsZXMoZmlsZXMpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy51cGxvYWRGaWxlcyA9IGZ1bmN0aW9uIChmaWxlcykge1xuICAgICAgdmFyIG9yaWdpbkZpbGVzID0gX3RvQ29uc3VtYWJsZUFycmF5KGZpbGVzKTtcblxuICAgICAgdmFyIHBvc3RGaWxlcyA9IG9yaWdpbkZpbGVzLm1hcChmdW5jdGlvbiAoZmlsZSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgZmlsZS51aWQgPSBnZXRVaWQoKTtcbiAgICAgICAgcmV0dXJuIF90aGlzLnByb2Nlc3NGaWxlKGZpbGUsIG9yaWdpbkZpbGVzKTtcbiAgICAgIH0pOyAvLyBCYXRjaCB1cGxvYWQgZmlsZXNcblxuICAgICAgUHJvbWlzZS5hbGwocG9zdEZpbGVzKS50aGVuKGZ1bmN0aW9uIChmaWxlTGlzdCkge1xuICAgICAgICB2YXIgb25CYXRjaFN0YXJ0ID0gX3RoaXMucHJvcHMub25CYXRjaFN0YXJ0O1xuICAgICAgICBvbkJhdGNoU3RhcnQgPT09IG51bGwgfHwgb25CYXRjaFN0YXJ0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJhdGNoU3RhcnQoZmlsZUxpc3QubWFwKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgICAgdmFyIG9yaWdpbiA9IF9yZWYub3JpZ2luLFxuICAgICAgICAgICAgICBwYXJzZWRGaWxlID0gX3JlZi5wYXJzZWRGaWxlO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmaWxlOiBvcmlnaW4sXG4gICAgICAgICAgICBwYXJzZWRGaWxlOiBwYXJzZWRGaWxlXG4gICAgICAgICAgfTtcbiAgICAgICAgfSkpO1xuICAgICAgICBmaWxlTGlzdC5maWx0ZXIoZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgICByZXR1cm4gZmlsZS5wYXJzZWRGaWxlICE9PSBudWxsO1xuICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgICAgX3RoaXMucG9zdChmaWxlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3RoaXMucHJvY2Vzc0ZpbGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9yZWYyID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlKGZpbGUsIGZpbGVMaXN0KSB7XG4gICAgICAgIHZhciBiZWZvcmVVcGxvYWQsIHRyYW5zZm9ybWVkRmlsZSwgYWN0aW9uLCBtZXJnZWRBY3Rpb24sIGRhdGEsIG1lcmdlZERhdGEsIHBhcnNlZERhdGEsIHBhcnNlZEZpbGUsIG1lcmdlZFBhcnNlZEZpbGU7XG4gICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBiZWZvcmVVcGxvYWQgPSBfdGhpcy5wcm9wcy5iZWZvcmVVcGxvYWQ7XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtZWRGaWxlID0gZmlsZTtcblxuICAgICAgICAgICAgICAgIGlmICghYmVmb3JlVXBsb2FkKSB7XG4gICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTQ7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMztcbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNjtcbiAgICAgICAgICAgICAgICByZXR1cm4gYmVmb3JlVXBsb2FkKGZpbGUsIGZpbGVMaXN0KTtcblxuICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtZWRGaWxlID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSA5O1xuICAgICAgICAgICAgICAgIF9jb250ZXh0LnQwID0gX2NvbnRleHRbXCJjYXRjaFwiXSgzKTtcbiAgICAgICAgICAgICAgICAvLyBSZWplY3Rpb24gd2lsbCBhbHNvIHRyYWRlIGFzIGZhbHNlXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtZWRGaWxlID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICBpZiAoISh0cmFuc2Zvcm1lZEZpbGUgPT09IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE0O1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiLCB7XG4gICAgICAgICAgICAgICAgICBvcmlnaW46IGZpbGUsXG4gICAgICAgICAgICAgICAgICBwYXJzZWRGaWxlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgYWN0aW9uOiBudWxsLFxuICAgICAgICAgICAgICAgICAgZGF0YTogbnVsbFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAgICAgLy8gR2V0IGxhdGVzdCBhY3Rpb25cbiAgICAgICAgICAgICAgICBhY3Rpb24gPSBfdGhpcy5wcm9wcy5hY3Rpb247XG5cbiAgICAgICAgICAgICAgICBpZiAoISh0eXBlb2YgYWN0aW9uID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDIxO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE4O1xuICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpb24oZmlsZSk7XG5cbiAgICAgICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgICAgICBtZXJnZWRBY3Rpb24gPSBfY29udGV4dC5zZW50O1xuICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyMjtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlIDIxOlxuICAgICAgICAgICAgICAgIG1lcmdlZEFjdGlvbiA9IGFjdGlvbjtcblxuICAgICAgICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgICAgICAgIC8vIEdldCBsYXRlc3QgZGF0YVxuICAgICAgICAgICAgICAgIGRhdGEgPSBfdGhpcy5wcm9wcy5kYXRhO1xuXG4gICAgICAgICAgICAgICAgaWYgKCEodHlwZW9mIGRhdGEgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjY7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEoZmlsZSk7XG5cbiAgICAgICAgICAgICAgY2FzZSAyNjpcbiAgICAgICAgICAgICAgICBtZXJnZWREYXRhID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMzA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSAyOTpcbiAgICAgICAgICAgICAgICBtZXJnZWREYXRhID0gZGF0YTtcblxuICAgICAgICAgICAgICBjYXNlIDMwOlxuICAgICAgICAgICAgICAgIHBhcnNlZERhdGEgPSAvLyBzdHJpbmcgdHlwZSBpcyBmcm9tIGxlZ2FjeSBgdHJhbnNmb3JtRmlsZWAuXG4gICAgICAgICAgICAgICAgLy8gTm90IHN1cmUgaWYgdGhpcyB3aWxsIHdvcmsgc2luY2Ugbm8gcmVsYXRlZCB0ZXN0IGNhc2Ugd29ya3Mgd2l0aCBpdFxuICAgICAgICAgICAgICAgIChfdHlwZW9mKHRyYW5zZm9ybWVkRmlsZSkgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB0cmFuc2Zvcm1lZEZpbGUgPT09ICdzdHJpbmcnKSAmJiB0cmFuc2Zvcm1lZEZpbGUgPyB0cmFuc2Zvcm1lZEZpbGUgOiBmaWxlO1xuXG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlZERhdGEgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgICAgICAgICAgICBwYXJzZWRGaWxlID0gcGFyc2VkRGF0YTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcGFyc2VkRmlsZSA9IG5ldyBGaWxlKFtwYXJzZWREYXRhXSwgZmlsZS5uYW1lLCB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IGZpbGUudHlwZVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbWVyZ2VkUGFyc2VkRmlsZSA9IHBhcnNlZEZpbGU7XG4gICAgICAgICAgICAgICAgbWVyZ2VkUGFyc2VkRmlsZS51aWQgPSBmaWxlLnVpZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIHtcbiAgICAgICAgICAgICAgICAgIG9yaWdpbjogZmlsZSxcbiAgICAgICAgICAgICAgICAgIGRhdGE6IG1lcmdlZERhdGEsXG4gICAgICAgICAgICAgICAgICBwYXJzZWRGaWxlOiBtZXJnZWRQYXJzZWRGaWxlLFxuICAgICAgICAgICAgICAgICAgYWN0aW9uOiBtZXJnZWRBY3Rpb25cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBjYXNlIDM1OlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUsIG51bGwsIFtbMywgOV1dKTtcbiAgICAgIH0pKTtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeCwgX3gyKSB7XG4gICAgICAgIHJldHVybiBfcmVmMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9KCk7XG5cbiAgICBfdGhpcy5zYXZlRmlsZUlucHV0ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIF90aGlzLmZpbGVJbnB1dCA9IG5vZGU7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhBamF4VXBsb2FkZXIsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5faXNNb3VudGVkID0gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLl9pc01vdW50ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuYWJvcnQoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicG9zdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwb3N0KF9yZWYzKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIGRhdGEgPSBfcmVmMy5kYXRhLFxuICAgICAgICAgIG9yaWdpbiA9IF9yZWYzLm9yaWdpbixcbiAgICAgICAgICBhY3Rpb24gPSBfcmVmMy5hY3Rpb24sXG4gICAgICAgICAgcGFyc2VkRmlsZSA9IF9yZWYzLnBhcnNlZEZpbGU7XG5cbiAgICAgIGlmICghdGhpcy5faXNNb3VudGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIF90aGlzJHByb3BzMyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgb25TdGFydCA9IF90aGlzJHByb3BzMy5vblN0YXJ0LFxuICAgICAgICAgIGN1c3RvbVJlcXVlc3QgPSBfdGhpcyRwcm9wczMuY3VzdG9tUmVxdWVzdCxcbiAgICAgICAgICBuYW1lID0gX3RoaXMkcHJvcHMzLm5hbWUsXG4gICAgICAgICAgaGVhZGVycyA9IF90aGlzJHByb3BzMy5oZWFkZXJzLFxuICAgICAgICAgIHdpdGhDcmVkZW50aWFscyA9IF90aGlzJHByb3BzMy53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgbWV0aG9kID0gX3RoaXMkcHJvcHMzLm1ldGhvZDtcbiAgICAgIHZhciB1aWQgPSBvcmlnaW4udWlkO1xuICAgICAgdmFyIHJlcXVlc3QgPSBjdXN0b21SZXF1ZXN0IHx8IGRlZmF1bHRSZXF1ZXN0O1xuICAgICAgdmFyIHJlcXVlc3RPcHRpb24gPSB7XG4gICAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgICBmaWxlbmFtZTogbmFtZSxcbiAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgZmlsZTogcGFyc2VkRmlsZSxcbiAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB3aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgIG1ldGhvZDogbWV0aG9kIHx8ICdwb3N0JyxcbiAgICAgICAgb25Qcm9ncmVzczogZnVuY3Rpb24gb25Qcm9ncmVzcyhlKSB7XG4gICAgICAgICAgdmFyIG9uUHJvZ3Jlc3MgPSBfdGhpczIucHJvcHMub25Qcm9ncmVzcztcbiAgICAgICAgICBvblByb2dyZXNzID09PSBudWxsIHx8IG9uUHJvZ3Jlc3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uUHJvZ3Jlc3MoZSwgcGFyc2VkRmlsZSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uU3VjY2VzczogZnVuY3Rpb24gb25TdWNjZXNzKHJldCwgeGhyKSB7XG4gICAgICAgICAgdmFyIG9uU3VjY2VzcyA9IF90aGlzMi5wcm9wcy5vblN1Y2Nlc3M7XG4gICAgICAgICAgb25TdWNjZXNzID09PSBudWxsIHx8IG9uU3VjY2VzcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25TdWNjZXNzKHJldCwgcGFyc2VkRmlsZSwgeGhyKTtcbiAgICAgICAgICBkZWxldGUgX3RoaXMyLnJlcXNbdWlkXTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcjogZnVuY3Rpb24gb25FcnJvcihlcnIsIHJldCkge1xuICAgICAgICAgIHZhciBvbkVycm9yID0gX3RoaXMyLnByb3BzLm9uRXJyb3I7XG4gICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKGVyciwgcmV0LCBwYXJzZWRGaWxlKTtcbiAgICAgICAgICBkZWxldGUgX3RoaXMyLnJlcXNbdWlkXTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIG9uU3RhcnQob3JpZ2luKTtcbiAgICAgIHRoaXMucmVxc1t1aWRdID0gcmVxdWVzdChyZXF1ZXN0T3B0aW9uKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgdWlkOiBnZXRVaWQoKVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFib3J0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFib3J0KGZpbGUpIHtcbiAgICAgIHZhciByZXFzID0gdGhpcy5yZXFzO1xuXG4gICAgICBpZiAoZmlsZSkge1xuICAgICAgICB2YXIgdWlkID0gZmlsZS51aWQgPyBmaWxlLnVpZCA6IGZpbGU7XG5cbiAgICAgICAgaWYgKHJlcXNbdWlkXSAmJiByZXFzW3VpZF0uYWJvcnQpIHtcbiAgICAgICAgICByZXFzW3VpZF0uYWJvcnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSByZXFzW3VpZF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBPYmplY3Qua2V5cyhyZXFzKS5mb3JFYWNoKGZ1bmN0aW9uICh1aWQpIHtcbiAgICAgICAgICBpZiAocmVxc1t1aWRdICYmIHJlcXNbdWlkXS5hYm9ydCkge1xuICAgICAgICAgICAgcmVxc1t1aWRdLmFib3J0KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGVsZXRlIHJlcXNbdWlkXTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX2NsYXNzTmFtZXM7XG5cbiAgICAgIHZhciBfdGhpcyRwcm9wczQgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIFRhZyA9IF90aGlzJHByb3BzNC5jb21wb25lbnQsXG4gICAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkcHJvcHM0LnByZWZpeENscyxcbiAgICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wczQuY2xhc3NOYW1lLFxuICAgICAgICAgIGRpc2FibGVkID0gX3RoaXMkcHJvcHM0LmRpc2FibGVkLFxuICAgICAgICAgIGlkID0gX3RoaXMkcHJvcHM0LmlkLFxuICAgICAgICAgIHN0eWxlID0gX3RoaXMkcHJvcHM0LnN0eWxlLFxuICAgICAgICAgIG11bHRpcGxlID0gX3RoaXMkcHJvcHM0Lm11bHRpcGxlLFxuICAgICAgICAgIGFjY2VwdCA9IF90aGlzJHByb3BzNC5hY2NlcHQsXG4gICAgICAgICAgY2FwdHVyZSA9IF90aGlzJHByb3BzNC5jYXB0dXJlLFxuICAgICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHM0LmNoaWxkcmVuLFxuICAgICAgICAgIGRpcmVjdG9yeSA9IF90aGlzJHByb3BzNC5kaXJlY3RvcnksXG4gICAgICAgICAgb3BlbkZpbGVEaWFsb2dPbkNsaWNrID0gX3RoaXMkcHJvcHM0Lm9wZW5GaWxlRGlhbG9nT25DbGljayxcbiAgICAgICAgICBvbk1vdXNlRW50ZXIgPSBfdGhpcyRwcm9wczQub25Nb3VzZUVudGVyLFxuICAgICAgICAgIG9uTW91c2VMZWF2ZSA9IF90aGlzJHByb3BzNC5vbk1vdXNlTGVhdmUsXG4gICAgICAgICAgb3RoZXJQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfdGhpcyRwcm9wczQsIF9leGNsdWRlZCk7XG5cbiAgICAgIHZhciBjbHMgPSBjbGFzc05hbWVzKChfY2xhc3NOYW1lcyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIHByZWZpeENscywgdHJ1ZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kaXNhYmxlZFwiKSwgZGlzYWJsZWQpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIGNsYXNzTmFtZSwgY2xhc3NOYW1lKSwgX2NsYXNzTmFtZXMpKTsgLy8gYmVjYXVzZSBpbnB1dCBkb24ndCBoYXZlIGRpcmVjdG9yeS93ZWJraXRkaXJlY3RvcnkgdHlwZSBkZWNsYXJhdGlvblxuXG4gICAgICB2YXIgZGlyUHJvcHMgPSBkaXJlY3RvcnkgPyB7XG4gICAgICAgIGRpcmVjdG9yeTogJ2RpcmVjdG9yeScsXG4gICAgICAgIHdlYmtpdGRpcmVjdG9yeTogJ3dlYmtpdGRpcmVjdG9yeSdcbiAgICAgIH0gOiB7fTtcbiAgICAgIHZhciBldmVudHMgPSBkaXNhYmxlZCA/IHt9IDoge1xuICAgICAgICBvbkNsaWNrOiBvcGVuRmlsZURpYWxvZ09uQ2xpY2sgPyB0aGlzLm9uQ2xpY2sgOiBmdW5jdGlvbiAoKSB7fSxcbiAgICAgICAgb25LZXlEb3duOiBvcGVuRmlsZURpYWxvZ09uQ2xpY2sgPyB0aGlzLm9uS2V5RG93biA6IGZ1bmN0aW9uICgpIHt9LFxuICAgICAgICBvbk1vdXNlRW50ZXI6IG9uTW91c2VFbnRlcixcbiAgICAgICAgb25Nb3VzZUxlYXZlOiBvbk1vdXNlTGVhdmUsXG4gICAgICAgIG9uRHJvcDogdGhpcy5vbkZpbGVEcm9wLFxuICAgICAgICBvbkRyYWdPdmVyOiB0aGlzLm9uRmlsZURyb3AsXG4gICAgICAgIHRhYkluZGV4OiAnMCdcbiAgICAgIH07XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVGFnLCBfZXh0ZW5kcyh7fSwgZXZlbnRzLCB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xzLFxuICAgICAgICByb2xlOiBcImJ1dHRvblwiLFxuICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIF9leHRlbmRzKHt9LCBwaWNrQXR0cnMob3RoZXJQcm9wcywge1xuICAgICAgICBhcmlhOiB0cnVlLFxuICAgICAgICBkYXRhOiB0cnVlXG4gICAgICB9KSwge1xuICAgICAgICBpZDogaWQsXG4gICAgICAgIHR5cGU6IFwiZmlsZVwiLFxuICAgICAgICByZWY6IHRoaXMuc2F2ZUZpbGVJbnB1dCxcbiAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljayhlKSB7XG4gICAgICAgICAgcmV0dXJuIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH0gLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMTk5NDhcbiAgICAgICAgLFxuICAgICAgICBrZXk6IHRoaXMuc3RhdGUudWlkLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgICB9LFxuICAgICAgICBhY2NlcHQ6IGFjY2VwdFxuICAgICAgfSwgZGlyUHJvcHMsIHtcbiAgICAgICAgbXVsdGlwbGU6IG11bHRpcGxlLFxuICAgICAgICBvbkNoYW5nZTogdGhpcy5vbkNoYW5nZVxuICAgICAgfSwgY2FwdHVyZSAhPSBudWxsID8ge1xuICAgICAgICBjYXB0dXJlOiBjYXB0dXJlXG4gICAgICB9IDoge30pKSwgY2hpbGRyZW4pO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBBamF4VXBsb2FkZXI7XG59KENvbXBvbmVudCk7XG5cbmV4cG9ydCBkZWZhdWx0IEFqYXhVcGxvYWRlcjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNcIjtcbmltcG9ydCBfY3JlYXRlU3VwZXIgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZVN1cGVyXCI7XG5cbi8qIGVzbGludCByZWFjdC9wcm9wLXR5cGVzOjAgKi9cbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQWpheFVwbG9hZCBmcm9tICcuL0FqYXhVcGxvYWRlcic7XG5cbmZ1bmN0aW9uIGVtcHR5KCkge31cblxudmFyIFVwbG9hZCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoVXBsb2FkLCBfQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFVwbG9hZCk7XG5cbiAgZnVuY3Rpb24gVXBsb2FkKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBVcGxvYWQpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwuYXBwbHkoX3N1cGVyLCBbdGhpc10uY29uY2F0KGFyZ3MpKTtcbiAgICBfdGhpcy51cGxvYWRlciA9IHZvaWQgMDtcblxuICAgIF90aGlzLnNhdmVVcGxvYWRlciA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICBfdGhpcy51cGxvYWRlciA9IG5vZGU7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhVcGxvYWQsIFt7XG4gICAga2V5OiBcImFib3J0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFib3J0KGZpbGUpIHtcbiAgICAgIHRoaXMudXBsb2FkZXIuYWJvcnQoZmlsZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQWpheFVwbG9hZCwgX2V4dGVuZHMoe30sIHRoaXMucHJvcHMsIHtcbiAgICAgICAgcmVmOiB0aGlzLnNhdmVVcGxvYWRlclxuICAgICAgfSkpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBVcGxvYWQ7XG59KENvbXBvbmVudCk7XG5cblVwbG9hZC5kZWZhdWx0UHJvcHMgPSB7XG4gIGNvbXBvbmVudDogJ3NwYW4nLFxuICBwcmVmaXhDbHM6ICdyYy11cGxvYWQnLFxuICBkYXRhOiB7fSxcbiAgaGVhZGVyczoge30sXG4gIG5hbWU6ICdmaWxlJyxcbiAgbXVsdGlwYXJ0OiBmYWxzZSxcbiAgb25TdGFydDogZW1wdHksXG4gIG9uRXJyb3I6IGVtcHR5LFxuICBvblN1Y2Nlc3M6IGVtcHR5LFxuICBtdWx0aXBsZTogZmFsc2UsXG4gIGJlZm9yZVVwbG9hZDogbnVsbCxcbiAgY3VzdG9tUmVxdWVzdDogbnVsbCxcbiAgd2l0aENyZWRlbnRpYWxzOiBmYWxzZSxcbiAgb3BlbkZpbGVEaWFsb2dPbkNsaWNrOiB0cnVlXG59O1xuZXhwb3J0IGRlZmF1bHQgVXBsb2FkOyIsIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIEZpbGVUd29Ub25lID0geyBcImljb25cIjogZnVuY3Rpb24gcmVuZGVyKHByaW1hcnlDb2xvciwgc2Vjb25kYXJ5Q29sb3IpIHsgcmV0dXJuIHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNTM0IDM1MlYxMzZIMjMydjc1Mmg1NjBWMzk0SDU3NmE0MiA0MiAwIDAxLTQyLTQyelwiLCBcImZpbGxcIjogc2Vjb25kYXJ5Q29sb3IgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTg1NC42IDI4OC42TDYzOS40IDczLjRjLTYtNi0xNC4xLTkuNC0yMi42LTkuNEgxOTJjLTE3LjcgMC0zMiAxNC4zLTMyIDMydjgzMmMwIDE3LjcgMTQuMyAzMiAzMiAzMmg2NDBjMTcuNyAwIDMyLTE0LjMgMzItMzJWMzExLjNjMC04LjUtMy40LTE2LjctOS40LTIyLjd6TTYwMiAxMzcuOEw3OTAuMiAzMjZINjAyVjEzNy44ek03OTIgODg4SDIzMlYxMzZoMzAydjIxNmE0MiA0MiAwIDAwNDIgNDJoMjE2djQ5NHpcIiwgXCJmaWxsXCI6IHByaW1hcnlDb2xvciB9IH1dIH07IH0sIFwibmFtZVwiOiBcImZpbGVcIiwgXCJ0aGVtZVwiOiBcInR3b3RvbmVcIiB9O1xuZXhwb3J0IGRlZmF1bHQgRmlsZVR3b1RvbmU7XG4iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBGaWxlVHdvVG9uZVN2ZyBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2VzL2Fzbi9GaWxlVHdvVG9uZVwiO1xuaW1wb3J0IEFudGRJY29uIGZyb20gJy4uL2NvbXBvbmVudHMvQW50ZEljb24nO1xudmFyIEZpbGVUd29Ub25lID0gZnVuY3Rpb24gRmlsZVR3b1RvbmUocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQW50ZEljb24sIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IEZpbGVUd29Ub25lU3ZnXG4gIH0pKTtcbn07XG5GaWxlVHdvVG9uZS5kaXNwbGF5TmFtZSA9ICdGaWxlVHdvVG9uZSc7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihGaWxlVHdvVG9uZSk7IiwiLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG52YXIgUGFwZXJDbGlwT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTc3OS4zIDE5Ni42Yy05NC4yLTk0LjItMjQ3LjYtOTQuMi0zNDEuNyAwbC0yNjEgMjYwLjhjLTEuNyAxLjctMi42IDQtMi42IDYuNHMuOSA0LjcgMi42IDYuNGwzNi45IDM2LjlhOSA5IDAgMDAxMi43IDBsMjYxLTI2MC44YzMyLjQtMzIuNCA3NS41LTUwLjIgMTIxLjMtNTAuMnM4OC45IDE3LjggMTIxLjIgNTAuMmMzMi40IDMyLjQgNTAuMiA3NS41IDUwLjIgMTIxLjIgMCA0NS44LTE3LjggODguOC01MC4yIDEyMS4ybC0yNjYgMjY1LjktNDMuMSA0My4xYy00MC4zIDQwLjMtMTA1LjggNDAuMy0xNDYuMSAwLTE5LjUtMTkuNS0zMC4yLTQ1LjQtMzAuMi03M3MxMC43LTUzLjUgMzAuMi03M2wyNjMuOS0yNjMuOGM2LjctNi42IDE1LjUtMTAuMyAyNC45LTEwLjNoLjFjOS40IDAgMTguMSAzLjcgMjQuNyAxMC4zIDYuNyA2LjcgMTAuMyAxNS41IDEwLjMgMjQuOSAwIDkuMy0zLjcgMTguMS0xMC4zIDI0LjdMMzcyLjQgNjUzYy0xLjcgMS43LTIuNiA0LTIuNiA2LjRzLjkgNC43IDIuNiA2LjRsMzYuOSAzNi45YTkgOSAwIDAwMTIuNyAwbDIxNS42LTIxNS42YzE5LjktMTkuOSAzMC44LTQ2LjMgMzAuOC03NC40cy0xMS01NC42LTMwLjgtNzQuNGMtNDEuMS00MS4xLTEwNy45LTQxLTE0OSAwTDQ2MyAzNjQgMjI0LjggNjAyLjFBMTcyLjIyIDE3Mi4yMiAwIDAwMTc0IDcyNC44YzAgNDYuMyAxOC4xIDg5LjggNTAuOCAxMjIuNSAzMy45IDMzLjggNzguMyA1MC43IDEyMi43IDUwLjcgNDQuNCAwIDg4LjgtMTYuOSAxMjIuNi01MC43bDMwOS4yLTMwOUM4MjQuOCA0OTIuNyA4NTAgNDMyIDg1MCAzNjcuNWMuMS02NC42LTI1LjEtMTI1LjMtNzAuNy0xNzAuOXpcIiB9IH1dIH0sIFwibmFtZVwiOiBcInBhcGVyLWNsaXBcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IFBhcGVyQ2xpcE91dGxpbmVkO1xuIiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUGFwZXJDbGlwT3V0bGluZWRTdmcgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9lcy9hc24vUGFwZXJDbGlwT3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tICcuLi9jb21wb25lbnRzL0FudGRJY29uJztcbnZhciBQYXBlckNsaXBPdXRsaW5lZCA9IGZ1bmN0aW9uIFBhcGVyQ2xpcE91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFudGRJY29uLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBQYXBlckNsaXBPdXRsaW5lZFN2Z1xuICB9KSk7XG59O1xuUGFwZXJDbGlwT3V0bGluZWQuZGlzcGxheU5hbWUgPSAnUGFwZXJDbGlwT3V0bGluZWQnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoUGFwZXJDbGlwT3V0bGluZWQpOyIsIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIFBpY3R1cmVUd29Ub25lID0geyBcImljb25cIjogZnVuY3Rpb24gcmVuZGVyKHByaW1hcnlDb2xvciwgc2Vjb25kYXJ5Q29sb3IpIHsgcmV0dXJuIHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNOTI4IDE2MEg5NmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ2NjQwYzAgMTcuNyAxNC4zIDMyIDMyIDMyaDgzMmMxNy43IDAgMzItMTQuMyAzMi0zMlYxOTJjMC0xNy43LTE0LjMtMzItMzItMzJ6bS00MCA2MzJIMTM2di0zOS45bDEzOC41LTE2NC4zIDE1MC4xIDE3OEw2NTguMSA0ODkgODg4IDc2MS42Vjc5MnptMC0xMjkuOEw2NjQuMiAzOTYuOGMtMy4yLTMuOC05LTMuOC0xMi4yIDBMNDI0LjYgNjY2LjRsLTE0NC0xNzAuN2MtMy4yLTMuOC05LTMuOC0xMi4yIDBMMTM2IDY1Mi43VjIzMmg3NTJ2NDMwLjJ6XCIsIFwiZmlsbFwiOiBwcmltYXJ5Q29sb3IgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTQyNC42IDc2NS44bC0xNTAuMS0xNzhMMTM2IDc1Mi4xVjc5Mmg3NTJ2LTMwLjRMNjU4LjEgNDg5elwiLCBcImZpbGxcIjogc2Vjb25kYXJ5Q29sb3IgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTEzNiA2NTIuN2wxMzIuNC0xNTdjMy4yLTMuOCA5LTMuOCAxMi4yIDBsMTQ0IDE3MC43TDY1MiAzOTYuOGMzLjItMy44IDktMy44IDEyLjIgMEw4ODggNjYyLjJWMjMySDEzNnY0MjAuN3pNMzA0IDI4MGE4OCA4OCAwIDExMCAxNzYgODggODggMCAwMTAtMTc2elwiLCBcImZpbGxcIjogc2Vjb25kYXJ5Q29sb3IgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTI3NiAzNjhhMjggMjggMCAxMDU2IDAgMjggMjggMCAxMC01NiAwelwiLCBcImZpbGxcIjogc2Vjb25kYXJ5Q29sb3IgfSB9LCB7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTMwNCA0NTZhODggODggMCAxMDAtMTc2IDg4IDg4IDAgMDAwIDE3NnptMC0xMTZjMTUuNSAwIDI4IDEyLjUgMjggMjhzLTEyLjUgMjgtMjggMjgtMjgtMTIuNS0yOC0yOCAxMi41LTI4IDI4LTI4elwiLCBcImZpbGxcIjogcHJpbWFyeUNvbG9yIH0gfV0gfTsgfSwgXCJuYW1lXCI6IFwicGljdHVyZVwiLCBcInRoZW1lXCI6IFwidHdvdG9uZVwiIH07XG5leHBvcnQgZGVmYXVsdCBQaWN0dXJlVHdvVG9uZTtcbiIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFBpY3R1cmVUd29Ub25lU3ZnIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL1BpY3R1cmVUd29Ub25lXCI7XG5pbXBvcnQgQW50ZEljb24gZnJvbSAnLi4vY29tcG9uZW50cy9BbnRkSWNvbic7XG52YXIgUGljdHVyZVR3b1RvbmUgPSBmdW5jdGlvbiBQaWN0dXJlVHdvVG9uZShwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogUGljdHVyZVR3b1RvbmVTdmdcbiAgfSkpO1xufTtcblBpY3R1cmVUd29Ub25lLmRpc3BsYXlOYW1lID0gJ1BpY3R1cmVUd29Ub25lJztcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKFBpY3R1cmVUd29Ub25lKTsiLCJpbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5leHBvcnQgZnVuY3Rpb24gZmlsZTJPYmooZmlsZSkge1xuICByZXR1cm4gX2V4dGVuZHMoX2V4dGVuZHMoe30sIGZpbGUpLCB7XG4gICAgbGFzdE1vZGlmaWVkOiBmaWxlLmxhc3RNb2RpZmllZCxcbiAgICBsYXN0TW9kaWZpZWREYXRlOiBmaWxlLmxhc3RNb2RpZmllZERhdGUsXG4gICAgbmFtZTogZmlsZS5uYW1lLFxuICAgIHNpemU6IGZpbGUuc2l6ZSxcbiAgICB0eXBlOiBmaWxlLnR5cGUsXG4gICAgdWlkOiBmaWxlLnVpZCxcbiAgICBwZXJjZW50OiAwLFxuICAgIG9yaWdpbkZpbGVPYmo6IGZpbGVcbiAgfSk7XG59XG4vKiogVXBsb2FkIGZpbGVMaXN0LiBSZXBsYWNlIGZpbGUgaWYgZXhpc3Qgb3IganVzdCBwdXNoIGludG8gaXQuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlRmlsZUxpc3QoZmlsZSwgZmlsZUxpc3QpIHtcbiAgdmFyIG5leHRGaWxlTGlzdCA9IF90b0NvbnN1bWFibGVBcnJheShmaWxlTGlzdCk7XG4gIHZhciBmaWxlSW5kZXggPSBuZXh0RmlsZUxpc3QuZmluZEluZGV4KGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIHVpZCA9IF9yZWYudWlkO1xuICAgIHJldHVybiB1aWQgPT09IGZpbGUudWlkO1xuICB9KTtcbiAgaWYgKGZpbGVJbmRleCA9PT0gLTEpIHtcbiAgICBuZXh0RmlsZUxpc3QucHVzaChmaWxlKTtcbiAgfSBlbHNlIHtcbiAgICBuZXh0RmlsZUxpc3RbZmlsZUluZGV4XSA9IGZpbGU7XG4gIH1cbiAgcmV0dXJuIG5leHRGaWxlTGlzdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWxlSXRlbShmaWxlLCBmaWxlTGlzdCkge1xuICB2YXIgbWF0Y2hLZXkgPSBmaWxlLnVpZCAhPT0gdW5kZWZpbmVkID8gJ3VpZCcgOiAnbmFtZSc7XG4gIHJldHVybiBmaWxlTGlzdC5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICByZXR1cm4gaXRlbVttYXRjaEtleV0gPT09IGZpbGVbbWF0Y2hLZXldO1xuICB9KVswXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVGaWxlSXRlbShmaWxlLCBmaWxlTGlzdCkge1xuICB2YXIgbWF0Y2hLZXkgPSBmaWxlLnVpZCAhPT0gdW5kZWZpbmVkID8gJ3VpZCcgOiAnbmFtZSc7XG4gIHZhciByZW1vdmVkID0gZmlsZUxpc3QuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW1bbWF0Y2hLZXldICE9PSBmaWxlW21hdGNoS2V5XTtcbiAgfSk7XG4gIGlmIChyZW1vdmVkLmxlbmd0aCA9PT0gZmlsZUxpc3QubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHJlbW92ZWQ7XG59XG4vLyA9PT09PT09PT09PT09PT09PT09PSBEZWZhdWx0IEltYWdlIFByZXZpZXcgPT09PT09PT09PT09PT09PT09PT1cbnZhciBleHRuYW1lID0gZnVuY3Rpb24gZXh0bmFtZSgpIHtcbiAgdmFyIHVybCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJyc7XG4gIHZhciB0ZW1wID0gdXJsLnNwbGl0KCcvJyk7XG4gIHZhciBmaWxlbmFtZSA9IHRlbXBbdGVtcC5sZW5ndGggLSAxXTtcbiAgdmFyIGZpbGVuYW1lV2l0aG91dFN1ZmZpeCA9IGZpbGVuYW1lLnNwbGl0KC8jfFxcPy8pWzBdO1xuICByZXR1cm4gKC9cXC5bXi4vXFxcXF0qJC8uZXhlYyhmaWxlbmFtZVdpdGhvdXRTdWZmaXgpIHx8IFsnJ10pWzBdO1xufTtcbnZhciBpc0ltYWdlRmlsZVR5cGUgPSBmdW5jdGlvbiBpc0ltYWdlRmlsZVR5cGUodHlwZSkge1xuICByZXR1cm4gdHlwZS5pbmRleE9mKCdpbWFnZS8nKSA9PT0gMDtcbn07XG5leHBvcnQgdmFyIGlzSW1hZ2VVcmwgPSBmdW5jdGlvbiBpc0ltYWdlVXJsKGZpbGUpIHtcbiAgaWYgKGZpbGUudHlwZSAmJiAhZmlsZS50aHVtYlVybCkge1xuICAgIHJldHVybiBpc0ltYWdlRmlsZVR5cGUoZmlsZS50eXBlKTtcbiAgfVxuICB2YXIgdXJsID0gZmlsZS50aHVtYlVybCB8fCBmaWxlLnVybCB8fCAnJztcbiAgdmFyIGV4dGVuc2lvbiA9IGV4dG5hbWUodXJsKTtcbiAgaWYgKC9eZGF0YTppbWFnZVxcLy8udGVzdCh1cmwpIHx8IC8od2VicHxzdmd8cG5nfGdpZnxqcGd8anBlZ3xqZmlmfGJtcHxkcGd8aWNvfGhlaWN8aGVpZikkL2kudGVzdChleHRlbnNpb24pKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKC9eZGF0YTovLnRlc3QodXJsKSkge1xuICAgIC8vIG90aGVyIGZpbGUgdHlwZXMgb2YgYmFzZTY0XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChleHRlbnNpb24pIHtcbiAgICAvLyBvdGhlciBmaWxlIHR5cGVzIHdoaWNoIGhhdmUgZXh0ZW5zaW9uXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufTtcbnZhciBNRUFTVVJFX1NJWkUgPSAyMDA7XG5leHBvcnQgZnVuY3Rpb24gcHJldmlld0ltYWdlKGZpbGUpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgaWYgKCFmaWxlLnR5cGUgfHwgIWlzSW1hZ2VGaWxlVHlwZShmaWxlLnR5cGUpKSB7XG4gICAgICByZXNvbHZlKCcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IE1FQVNVUkVfU0laRTtcbiAgICBjYW52YXMuaGVpZ2h0ID0gTUVBU1VSRV9TSVpFO1xuICAgIGNhbnZhcy5zdHlsZS5jc3NUZXh0ID0gXCJwb3NpdGlvbjogZml4ZWQ7IGxlZnQ6IDA7IHRvcDogMDsgd2lkdGg6IFwiLmNvbmNhdChNRUFTVVJFX1NJWkUsIFwicHg7IGhlaWdodDogXCIpLmNvbmNhdChNRUFTVVJFX1NJWkUsIFwicHg7IHotaW5kZXg6IDk5OTk7IGRpc3BsYXk6IG5vbmU7XCIpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2FudmFzKTtcbiAgICB2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgdmFyIGltZyA9IG5ldyBJbWFnZSgpO1xuICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgd2lkdGggPSBpbWcud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IGltZy5oZWlnaHQ7XG4gICAgICB2YXIgZHJhd1dpZHRoID0gTUVBU1VSRV9TSVpFO1xuICAgICAgdmFyIGRyYXdIZWlnaHQgPSBNRUFTVVJFX1NJWkU7XG4gICAgICB2YXIgb2Zmc2V0WCA9IDA7XG4gICAgICB2YXIgb2Zmc2V0WSA9IDA7XG4gICAgICBpZiAod2lkdGggPiBoZWlnaHQpIHtcbiAgICAgICAgZHJhd0hlaWdodCA9IGhlaWdodCAqIChNRUFTVVJFX1NJWkUgLyB3aWR0aCk7XG4gICAgICAgIG9mZnNldFkgPSAtKGRyYXdIZWlnaHQgLSBkcmF3V2lkdGgpIC8gMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRyYXdXaWR0aCA9IHdpZHRoICogKE1FQVNVUkVfU0laRSAvIGhlaWdodCk7XG4gICAgICAgIG9mZnNldFggPSAtKGRyYXdXaWR0aCAtIGRyYXdIZWlnaHQpIC8gMjtcbiAgICAgIH1cbiAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCBvZmZzZXRYLCBvZmZzZXRZLCBkcmF3V2lkdGgsIGRyYXdIZWlnaHQpO1xuICAgICAgdmFyIGRhdGFVUkwgPSBjYW52YXMudG9EYXRhVVJMKCk7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGNhbnZhcyk7XG4gICAgICByZXNvbHZlKGRhdGFVUkwpO1xuICAgIH07XG4gICAgaW1nLmNyb3NzT3JpZ2luID0gJ2Fub255bW91cyc7XG4gICAgaWYgKGZpbGUudHlwZS5zdGFydHNXaXRoKCdpbWFnZS9zdmcreG1sJykpIHtcbiAgICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgcmVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChyZWFkZXIucmVzdWx0KSBpbWcuc3JjID0gcmVhZGVyLnJlc3VsdDtcbiAgICAgIH0pO1xuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGltZy5zcmMgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlKTtcbiAgICB9XG4gIH0pO1xufSIsIi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxudmFyIERvd25sb2FkT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTUwNS43IDY2MWE4IDggMCAwMDEyLjYgMGwxMTItMTQxLjdjNC4xLTUuMi40LTEyLjktNi4zLTEyLjloLTc0LjFWMTY4YzAtNC40LTMuNi04LTgtOGgtNjBjLTQuNCAwLTggMy42LTggOHYzMzguM0g0MDBjLTYuNyAwLTEwLjQgNy43LTYuMyAxMi45bDExMiAxNDEuOHpNODc4IDYyNmgtNjBjLTQuNCAwLTggMy42LTggOHYxNTRIMjE0VjYzNGMwLTQuNC0zLjYtOC04LThoLTYwYy00LjQgMC04IDMuNi04IDh2MTk4YzAgMTcuNyAxNC4zIDMyIDMyIDMyaDY4NGMxNy43IDAgMzItMTQuMyAzMi0zMlY2MzRjMC00LjQtMy42LTgtOC04elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiZG93bmxvYWRcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydCBkZWZhdWx0IERvd25sb2FkT3V0bGluZWQ7XG4iLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBEb3dubG9hZE91dGxpbmVkU3ZnIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvZXMvYXNuL0Rvd25sb2FkT3V0bGluZWRcIjtcbmltcG9ydCBBbnRkSWNvbiBmcm9tICcuLi9jb21wb25lbnRzL0FudGRJY29uJztcbnZhciBEb3dubG9hZE91dGxpbmVkID0gZnVuY3Rpb24gRG93bmxvYWRPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBbnRkSWNvbiwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogRG93bmxvYWRPdXRsaW5lZFN2Z1xuICB9KSk7XG59O1xuRG93bmxvYWRPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdEb3dubG9hZE91dGxpbmVkJztcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKERvd25sb2FkT3V0bGluZWQpOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IERlbGV0ZU91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9EZWxldGVPdXRsaW5lZFwiO1xuaW1wb3J0IERvd25sb2FkT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL0Rvd25sb2FkT3V0bGluZWRcIjtcbmltcG9ydCBFeWVPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvRXllT3V0bGluZWRcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IENTU01vdGlvbiBmcm9tICdyYy1tb3Rpb24nO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uLy4uL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgUHJvZ3Jlc3MgZnJvbSAnLi4vLi4vcHJvZ3Jlc3MnO1xuaW1wb3J0IFRvb2x0aXAgZnJvbSAnLi4vLi4vdG9vbHRpcCc7XG52YXIgTGlzdEl0ZW0gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAoX3JlZiwgcmVmKSB7XG4gIHZhciBfY2xhc3NOYW1lczM7XG4gIHZhciBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICBzdHlsZSA9IF9yZWYuc3R5bGUsXG4gICAgbG9jYWxlID0gX3JlZi5sb2NhbGUsXG4gICAgbGlzdFR5cGUgPSBfcmVmLmxpc3RUeXBlLFxuICAgIGZpbGUgPSBfcmVmLmZpbGUsXG4gICAgaXRlbXMgPSBfcmVmLml0ZW1zLFxuICAgIHByb2dyZXNzUHJvcHMgPSBfcmVmLnByb2dyZXNzLFxuICAgIGljb25SZW5kZXIgPSBfcmVmLmljb25SZW5kZXIsXG4gICAgYWN0aW9uSWNvblJlbmRlciA9IF9yZWYuYWN0aW9uSWNvblJlbmRlcixcbiAgICBpdGVtUmVuZGVyID0gX3JlZi5pdGVtUmVuZGVyLFxuICAgIGlzSW1nVXJsID0gX3JlZi5pc0ltZ1VybCxcbiAgICBzaG93UHJldmlld0ljb24gPSBfcmVmLnNob3dQcmV2aWV3SWNvbixcbiAgICBzaG93UmVtb3ZlSWNvbiA9IF9yZWYuc2hvd1JlbW92ZUljb24sXG4gICAgc2hvd0Rvd25sb2FkSWNvbiA9IF9yZWYuc2hvd0Rvd25sb2FkSWNvbixcbiAgICBjdXN0b21QcmV2aWV3SWNvbiA9IF9yZWYucHJldmlld0ljb24sXG4gICAgY3VzdG9tUmVtb3ZlSWNvbiA9IF9yZWYucmVtb3ZlSWNvbixcbiAgICBjdXN0b21Eb3dubG9hZEljb24gPSBfcmVmLmRvd25sb2FkSWNvbixcbiAgICBvblByZXZpZXcgPSBfcmVmLm9uUHJldmlldyxcbiAgICBvbkRvd25sb2FkID0gX3JlZi5vbkRvd25sb2FkLFxuICAgIG9uQ2xvc2UgPSBfcmVmLm9uQ2xvc2U7XG4gIHZhciBfYSwgX2I7XG4gIC8vIFN0YXR1czogd2hpY2ggd2lsbCBpZ25vcmUgYHJlbW92ZWRgIHN0YXR1c1xuICB2YXIgc3RhdHVzID0gZmlsZS5zdGF0dXM7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShzdGF0dXMpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIG1lcmdlZFN0YXR1cyA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0TWVyZ2VkU3RhdHVzID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc3RhdHVzICE9PSAncmVtb3ZlZCcpIHtcbiAgICAgIHNldE1lcmdlZFN0YXR1cyhzdGF0dXMpO1xuICAgIH1cbiAgfSwgW3N0YXR1c10pO1xuICAvLyBEZWxheSB0byBzaG93IHRoZSBwcm9ncmVzcyBiYXJcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTMgPSBSZWFjdC51c2VTdGF0ZShmYWxzZSksXG4gICAgX1JlYWN0JHVzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTMsIDIpLFxuICAgIHNob3dQcm9ncmVzcyA9IF9SZWFjdCR1c2VTdGF0ZTRbMF0sXG4gICAgc2V0U2hvd1Byb2dyZXNzID0gX1JlYWN0JHVzZVN0YXRlNFsxXTtcbiAgdmFyIHByb2dyZXNzUmFmUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHByb2dyZXNzUmFmUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHNldFNob3dQcm9ncmVzcyh0cnVlKTtcbiAgICB9LCAzMDApO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAocHJvZ3Jlc3NSYWZSZWYuY3VycmVudCkge1xuICAgICAgICBjbGVhclRpbWVvdXQocHJvZ3Jlc3NSYWZSZWYuY3VycmVudCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW10pO1xuICAvLyBUaGlzIGlzIHVzZWQgZm9yIGxlZ2FjeSBzcGFuIG1ha2Ugc2Nyb2xsSGVpZ2h0IHRoZSB3cm9uZyB2YWx1ZS5cbiAgLy8gV2Ugd2lsbCBmb3JjZSB0aGVzZSB0byBiZSBgZGlzcGxheTogYmxvY2tgIHdpdGggbm9uIGBwaWN0dXJlLWNhcmRgXG4gIHZhciBzcGFuQ2xhc3NOYW1lID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zcGFuXCIpO1xuICB2YXIgaWNvbk5vZGUgPSBpY29uUmVuZGVyKGZpbGUpO1xuICB2YXIgaWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdGV4dC1pY29uXCIpXG4gIH0sIGljb25Ob2RlKTtcbiAgaWYgKGxpc3RUeXBlID09PSAncGljdHVyZScgfHwgbGlzdFR5cGUgPT09ICdwaWN0dXJlLWNhcmQnKSB7XG4gICAgaWYgKG1lcmdlZFN0YXR1cyA9PT0gJ3VwbG9hZGluZycgfHwgIWZpbGUudGh1bWJVcmwgJiYgIWZpbGUudXJsKSB7XG4gICAgICB2YXIgX2NsYXNzTmFtZXM7XG4gICAgICB2YXIgdXBsb2FkaW5nQ2xhc3NOYW1lID0gY2xhc3NOYW1lcygoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxpc3QtaXRlbS10aHVtYm5haWxcIiksIHRydWUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbGlzdC1pdGVtLWZpbGVcIiksIG1lcmdlZFN0YXR1cyAhPT0gJ3VwbG9hZGluZycpLCBfY2xhc3NOYW1lcykpO1xuICAgICAgaWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiB1cGxvYWRpbmdDbGFzc05hbWVcbiAgICAgIH0sIGljb25Ob2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9jbGFzc05hbWVzMjtcbiAgICAgIHZhciB0aHVtYm5haWwgPSAoaXNJbWdVcmwgPT09IG51bGwgfHwgaXNJbWdVcmwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGlzSW1nVXJsKGZpbGUpKSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiaW1nXCIsIHtcbiAgICAgICAgc3JjOiBmaWxlLnRodW1iVXJsIHx8IGZpbGUudXJsLFxuICAgICAgICBhbHQ6IGZpbGUubmFtZSxcbiAgICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxpc3QtaXRlbS1pbWFnZVwiKSxcbiAgICAgICAgY3Jvc3NPcmlnaW46IGZpbGUuY3Jvc3NPcmlnaW5cbiAgICAgIH0pIDogaWNvbk5vZGU7XG4gICAgICB2YXIgYUNsYXNzTmFtZSA9IGNsYXNzTmFtZXMoKF9jbGFzc05hbWVzMiA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxpc3QtaXRlbS10aHVtYm5haWxcIiksIHRydWUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxpc3QtaXRlbS1maWxlXCIpLCBpc0ltZ1VybCAmJiAhaXNJbWdVcmwoZmlsZSkpLCBfY2xhc3NOYW1lczIpKTtcbiAgICAgIGljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImFcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGFDbGFzc05hbWUsXG4gICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuICAgICAgICAgIHJldHVybiBvblByZXZpZXcoZmlsZSwgZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGhyZWY6IGZpbGUudXJsIHx8IGZpbGUudGh1bWJVcmwsXG4gICAgICAgIHRhcmdldDogXCJfYmxhbmtcIixcbiAgICAgICAgcmVsOiBcIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxuICAgICAgfSwgdGh1bWJuYWlsKTtcbiAgICB9XG4gIH1cbiAgdmFyIGluZm9VcGxvYWRpbmdDbGFzcyA9IGNsYXNzTmFtZXMoKF9jbGFzc05hbWVzMyA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxpc3QtaXRlbVwiKSwgdHJ1ZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbGlzdC1pdGVtLVwiKS5jb25jYXQobWVyZ2VkU3RhdHVzKSwgdHJ1ZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbGlzdC1pdGVtLWxpc3QtdHlwZS1cIikuY29uY2F0KGxpc3RUeXBlKSwgdHJ1ZSksIF9jbGFzc05hbWVzMykpO1xuICB2YXIgbGlua1Byb3BzID0gdHlwZW9mIGZpbGUubGlua1Byb3BzID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoZmlsZS5saW5rUHJvcHMpIDogZmlsZS5saW5rUHJvcHM7XG4gIHZhciByZW1vdmVJY29uID0gc2hvd1JlbW92ZUljb24gPyBhY3Rpb25JY29uUmVuZGVyKCh0eXBlb2YgY3VzdG9tUmVtb3ZlSWNvbiA9PT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbVJlbW92ZUljb24oZmlsZSkgOiBjdXN0b21SZW1vdmVJY29uKSB8fCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEZWxldGVPdXRsaW5lZCwgbnVsbCksIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gb25DbG9zZShmaWxlKTtcbiAgfSwgcHJlZml4Q2xzLCBsb2NhbGUucmVtb3ZlRmlsZSkgOiBudWxsO1xuICB2YXIgZG93bmxvYWRJY29uID0gc2hvd0Rvd25sb2FkSWNvbiAmJiBtZXJnZWRTdGF0dXMgPT09ICdkb25lJyA/IGFjdGlvbkljb25SZW5kZXIoKHR5cGVvZiBjdXN0b21Eb3dubG9hZEljb24gPT09ICdmdW5jdGlvbicgPyBjdXN0b21Eb3dubG9hZEljb24oZmlsZSkgOiBjdXN0b21Eb3dubG9hZEljb24pIHx8IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERvd25sb2FkT3V0bGluZWQsIG51bGwpLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG9uRG93bmxvYWQoZmlsZSk7XG4gIH0sIHByZWZpeENscywgbG9jYWxlLmRvd25sb2FkRmlsZSkgOiBudWxsO1xuICB2YXIgZG93bmxvYWRPckRlbGV0ZSA9IGxpc3RUeXBlICE9PSAncGljdHVyZS1jYXJkJyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGtleTogXCJkb3dubG9hZC1kZWxldGVcIixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1saXN0LWl0ZW0tY2FyZC1hY3Rpb25zXCIpLCB7XG4gICAgICBwaWN0dXJlOiBsaXN0VHlwZSA9PT0gJ3BpY3R1cmUnXG4gICAgfSlcbiAgfSwgZG93bmxvYWRJY29uLCByZW1vdmVJY29uKTtcbiAgdmFyIGxpc3RJdGVtTmFtZUNsYXNzID0gY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxpc3QtaXRlbS1uYW1lXCIpKTtcbiAgdmFyIHByZXZpZXcgPSBmaWxlLnVybCA/IFsvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImFcIiwgX2V4dGVuZHMoe1xuICAgIGtleTogXCJ2aWV3XCIsXG4gICAgdGFyZ2V0OiBcIl9ibGFua1wiLFxuICAgIHJlbDogXCJub29wZW5lciBub3JlZmVycmVyXCIsXG4gICAgY2xhc3NOYW1lOiBsaXN0SXRlbU5hbWVDbGFzcyxcbiAgICB0aXRsZTogZmlsZS5uYW1lXG4gIH0sIGxpbmtQcm9wcywge1xuICAgIGhyZWY6IGZpbGUudXJsLFxuICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuICAgICAgcmV0dXJuIG9uUHJldmlldyhmaWxlLCBlKTtcbiAgICB9XG4gIH0pLCBmaWxlLm5hbWUpLCBkb3dubG9hZE9yRGVsZXRlXSA6IFsvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGtleTogXCJ2aWV3XCIsXG4gICAgY2xhc3NOYW1lOiBsaXN0SXRlbU5hbWVDbGFzcyxcbiAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgIHJldHVybiBvblByZXZpZXcoZmlsZSwgZSk7XG4gICAgfSxcbiAgICB0aXRsZTogZmlsZS5uYW1lXG4gIH0sIGZpbGUubmFtZSksIGRvd25sb2FkT3JEZWxldGVdO1xuICB2YXIgcHJldmlld1N0eWxlID0ge1xuICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICBvcGFjaXR5OiAwLjVcbiAgfTtcbiAgdmFyIHByZXZpZXdJY29uID0gc2hvd1ByZXZpZXdJY29uID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHtcbiAgICBocmVmOiBmaWxlLnVybCB8fCBmaWxlLnRodW1iVXJsLFxuICAgIHRhcmdldDogXCJfYmxhbmtcIixcbiAgICByZWw6IFwibm9vcGVuZXIgbm9yZWZlcnJlclwiLFxuICAgIHN0eWxlOiBmaWxlLnVybCB8fCBmaWxlLnRodW1iVXJsID8gdW5kZWZpbmVkIDogcHJldmlld1N0eWxlLFxuICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuICAgICAgcmV0dXJuIG9uUHJldmlldyhmaWxlLCBlKTtcbiAgICB9LFxuICAgIHRpdGxlOiBsb2NhbGUucHJldmlld0ZpbGVcbiAgfSwgdHlwZW9mIGN1c3RvbVByZXZpZXdJY29uID09PSAnZnVuY3Rpb24nID8gY3VzdG9tUHJldmlld0ljb24oZmlsZSkgOiBjdXN0b21QcmV2aWV3SWNvbiB8fCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFeWVPdXRsaW5lZCwgbnVsbCkpIDogbnVsbDtcbiAgdmFyIGFjdGlvbnMgPSBsaXN0VHlwZSA9PT0gJ3BpY3R1cmUtY2FyZCcgJiYgbWVyZ2VkU3RhdHVzICE9PSAndXBsb2FkaW5nJyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1saXN0LWl0ZW0tYWN0aW9uc1wiKVxuICB9LCBwcmV2aWV3SWNvbiwgbWVyZ2VkU3RhdHVzID09PSAnZG9uZScgJiYgZG93bmxvYWRJY29uLCByZW1vdmVJY29uKTtcbiAgdmFyIG1lc3NhZ2U7XG4gIGlmIChmaWxlLnJlc3BvbnNlICYmIHR5cGVvZiBmaWxlLnJlc3BvbnNlID09PSAnc3RyaW5nJykge1xuICAgIG1lc3NhZ2UgPSBmaWxlLnJlc3BvbnNlO1xuICB9IGVsc2Uge1xuICAgIG1lc3NhZ2UgPSAoKF9hID0gZmlsZS5lcnJvcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnN0YXR1c1RleHQpIHx8ICgoX2IgPSBmaWxlLmVycm9yKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubWVzc2FnZSkgfHwgbG9jYWxlLnVwbG9hZEVycm9yO1xuICB9XG4gIHZhciBpY29uQW5kUHJldmlldyA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBzcGFuQ2xhc3NOYW1lXG4gIH0sIGljb24sIHByZXZpZXcpO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpLFxuICAgIGdldFByZWZpeENscyA9IF9SZWFjdCR1c2VDb250ZXh0LmdldFByZWZpeENscztcbiAgdmFyIHJvb3RQcmVmaXhDbHMgPSBnZXRQcmVmaXhDbHMoKTtcbiAgdmFyIGRvbSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGluZm9VcGxvYWRpbmdDbGFzc1xuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxpc3QtaXRlbS1pbmZvXCIpXG4gIH0sIGljb25BbmRQcmV2aWV3KSwgYWN0aW9ucywgc2hvd1Byb2dyZXNzICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENTU01vdGlvbiwge1xuICAgIG1vdGlvbk5hbWU6IFwiXCIuY29uY2F0KHJvb3RQcmVmaXhDbHMsIFwiLWZhZGVcIiksXG4gICAgdmlzaWJsZTogbWVyZ2VkU3RhdHVzID09PSAndXBsb2FkaW5nJyxcbiAgICBtb3Rpb25EZWFkbGluZTogMjAwMFxuICB9LCBmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICB2YXIgbW90aW9uQ2xhc3NOYW1lID0gX3JlZjIuY2xhc3NOYW1lO1xuICAgIC8vIHNob3cgbG9hZGluZyBpY29uIGlmIHVwbG9hZCBwcm9ncmVzcyBsaXN0ZW5lciBpcyBkaXNhYmxlZFxuICAgIHZhciBsb2FkaW5nUHJvZ3Jlc3MgPSAncGVyY2VudCcgaW4gZmlsZSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFByb2dyZXNzLCBfZXh0ZW5kcyh7fSwgcHJvZ3Jlc3NQcm9wcywge1xuICAgICAgdHlwZTogXCJsaW5lXCIsXG4gICAgICBwZXJjZW50OiBmaWxlLnBlcmNlbnRcbiAgICB9KSkgOiBudWxsO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1saXN0LWl0ZW0tcHJvZ3Jlc3NcIiksIG1vdGlvbkNsYXNzTmFtZSlcbiAgICB9LCBsb2FkaW5nUHJvZ3Jlc3MpO1xuICB9KSk7XG4gIHZhciBsaXN0Q29udGFpbmVyTmFtZUNsYXNzID0gY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxpc3QtXCIpLmNvbmNhdChsaXN0VHlwZSwgXCItY29udGFpbmVyXCIpLCBjbGFzc05hbWUpO1xuICB2YXIgaXRlbSA9IG1lcmdlZFN0YXR1cyA9PT0gJ2Vycm9yJyA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXAsIHtcbiAgICB0aXRsZTogbWVzc2FnZSxcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogZnVuY3Rpb24gZ2V0UG9wdXBDb250YWluZXIobm9kZSkge1xuICAgICAgcmV0dXJuIG5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gIH0sIGRvbSkgOiBkb207XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBsaXN0Q29udGFpbmVyTmFtZUNsYXNzLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICByZWY6IHJlZlxuICB9LCBpdGVtUmVuZGVyID8gaXRlbVJlbmRlcihpdGVtLCBmaWxlLCBpdGVtcywge1xuICAgIGRvd25sb2FkOiBvbkRvd25sb2FkLmJpbmQobnVsbCwgZmlsZSksXG4gICAgcHJldmlldzogb25QcmV2aWV3LmJpbmQobnVsbCwgZmlsZSksXG4gICAgcmVtb3ZlOiBvbkNsb3NlLmJpbmQobnVsbCwgZmlsZSlcbiAgfSkgOiBpdGVtKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgTGlzdEl0ZW07IiwiaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IEZpbGVUd29Ub25lIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9lcy9pY29ucy9GaWxlVHdvVG9uZVwiO1xuaW1wb3J0IExvYWRpbmdPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvZXMvaWNvbnMvTG9hZGluZ091dGxpbmVkXCI7XG5pbXBvcnQgUGFwZXJDbGlwT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1BhcGVyQ2xpcE91dGxpbmVkXCI7XG5pbXBvcnQgUGljdHVyZVR3b1RvbmUgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2VzL2ljb25zL1BpY3R1cmVUd29Ub25lXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBDU1NNb3Rpb24sIHsgQ1NTTW90aW9uTGlzdCB9IGZyb20gJ3JjLW1vdGlvbic7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQnV0dG9uIGZyb20gJy4uLy4uL2J1dHRvbic7XG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSAnLi4vLi4vY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCB1c2VGb3JjZVVwZGF0ZSBmcm9tICcuLi8uLi9fdXRpbC9ob29rcy91c2VGb3JjZVVwZGF0ZSc7XG5pbXBvcnQgY29sbGFwc2VNb3Rpb24gZnJvbSAnLi4vLi4vX3V0aWwvbW90aW9uJztcbmltcG9ydCB7IGNsb25lRWxlbWVudCwgaXNWYWxpZEVsZW1lbnQgfSBmcm9tICcuLi8uLi9fdXRpbC9yZWFjdE5vZGUnO1xuaW1wb3J0IHsgaXNJbWFnZVVybCwgcHJldmlld0ltYWdlIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IExpc3RJdGVtIGZyb20gJy4vTGlzdEl0ZW0nO1xudmFyIGxpc3RJdGVtTW90aW9uID0gX2V4dGVuZHMoe30sIGNvbGxhcHNlTW90aW9uKTtcbmRlbGV0ZSBsaXN0SXRlbU1vdGlvbi5vbkFwcGVhckVuZDtcbmRlbGV0ZSBsaXN0SXRlbU1vdGlvbi5vbkVudGVyRW5kO1xuZGVsZXRlIGxpc3RJdGVtTW90aW9uLm9uTGVhdmVFbmQ7XG52YXIgSW50ZXJuYWxVcGxvYWRMaXN0ID0gZnVuY3Rpb24gSW50ZXJuYWxVcGxvYWRMaXN0KHByb3BzLCByZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuICB2YXIgX3Byb3BzJGxpc3RUeXBlID0gcHJvcHMubGlzdFR5cGUsXG4gICAgbGlzdFR5cGUgPSBfcHJvcHMkbGlzdFR5cGUgPT09IHZvaWQgMCA/ICd0ZXh0JyA6IF9wcm9wcyRsaXN0VHlwZSxcbiAgICBfcHJvcHMkcHJldmlld0ZpbGUgPSBwcm9wcy5wcmV2aWV3RmlsZSxcbiAgICBwcmV2aWV3RmlsZSA9IF9wcm9wcyRwcmV2aWV3RmlsZSA9PT0gdm9pZCAwID8gcHJldmlld0ltYWdlIDogX3Byb3BzJHByZXZpZXdGaWxlLFxuICAgIG9uUHJldmlldyA9IHByb3BzLm9uUHJldmlldyxcbiAgICBvbkRvd25sb2FkID0gcHJvcHMub25Eb3dubG9hZCxcbiAgICBvblJlbW92ZSA9IHByb3BzLm9uUmVtb3ZlLFxuICAgIGxvY2FsZSA9IHByb3BzLmxvY2FsZSxcbiAgICBpY29uUmVuZGVyID0gcHJvcHMuaWNvblJlbmRlcixcbiAgICBfcHJvcHMkaXNJbWFnZVVybCA9IHByb3BzLmlzSW1hZ2VVcmwsXG4gICAgaXNJbWdVcmwgPSBfcHJvcHMkaXNJbWFnZVVybCA9PT0gdm9pZCAwID8gaXNJbWFnZVVybCA6IF9wcm9wcyRpc0ltYWdlVXJsLFxuICAgIGN1c3RvbWl6ZVByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBfcHJvcHMkaXRlbXMgPSBwcm9wcy5pdGVtcyxcbiAgICBpdGVtcyA9IF9wcm9wcyRpdGVtcyA9PT0gdm9pZCAwID8gW10gOiBfcHJvcHMkaXRlbXMsXG4gICAgX3Byb3BzJHNob3dQcmV2aWV3SWNvID0gcHJvcHMuc2hvd1ByZXZpZXdJY29uLFxuICAgIHNob3dQcmV2aWV3SWNvbiA9IF9wcm9wcyRzaG93UHJldmlld0ljbyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRzaG93UHJldmlld0ljbyxcbiAgICBfcHJvcHMkc2hvd1JlbW92ZUljb24gPSBwcm9wcy5zaG93UmVtb3ZlSWNvbixcbiAgICBzaG93UmVtb3ZlSWNvbiA9IF9wcm9wcyRzaG93UmVtb3ZlSWNvbiA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRzaG93UmVtb3ZlSWNvbixcbiAgICBfcHJvcHMkc2hvd0Rvd25sb2FkSWMgPSBwcm9wcy5zaG93RG93bmxvYWRJY29uLFxuICAgIHNob3dEb3dubG9hZEljb24gPSBfcHJvcHMkc2hvd0Rvd25sb2FkSWMgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJHNob3dEb3dubG9hZEljLFxuICAgIHJlbW92ZUljb24gPSBwcm9wcy5yZW1vdmVJY29uLFxuICAgIHByZXZpZXdJY29uID0gcHJvcHMucHJldmlld0ljb24sXG4gICAgZG93bmxvYWRJY29uID0gcHJvcHMuZG93bmxvYWRJY29uLFxuICAgIF9wcm9wcyRwcm9ncmVzcyA9IHByb3BzLnByb2dyZXNzLFxuICAgIHByb2dyZXNzID0gX3Byb3BzJHByb2dyZXNzID09PSB2b2lkIDAgPyB7XG4gICAgICBzdHJva2VXaWR0aDogMixcbiAgICAgIHNob3dJbmZvOiBmYWxzZVxuICAgIH0gOiBfcHJvcHMkcHJvZ3Jlc3MsXG4gICAgYXBwZW5kQWN0aW9uID0gcHJvcHMuYXBwZW5kQWN0aW9uLFxuICAgIF9wcm9wcyRhcHBlbmRBY3Rpb25WaSA9IHByb3BzLmFwcGVuZEFjdGlvblZpc2libGUsXG4gICAgYXBwZW5kQWN0aW9uVmlzaWJsZSA9IF9wcm9wcyRhcHBlbmRBY3Rpb25WaSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRhcHBlbmRBY3Rpb25WaSxcbiAgICBpdGVtUmVuZGVyID0gcHJvcHMuaXRlbVJlbmRlcjtcbiAgdmFyIGZvcmNlVXBkYXRlID0gdXNlRm9yY2VVcGRhdGUoKTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBtb3Rpb25BcHBlYXIgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldE1vdGlvbkFwcGVhciA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEVmZmVjdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChsaXN0VHlwZSAhPT0gJ3BpY3R1cmUnICYmIGxpc3RUeXBlICE9PSAncGljdHVyZS1jYXJkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAoaXRlbXMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICF3aW5kb3cuRmlsZVJlYWRlciB8fCAhd2luZG93LkZpbGUgfHwgIShmaWxlLm9yaWdpbkZpbGVPYmogaW5zdGFuY2VvZiBGaWxlIHx8IGZpbGUub3JpZ2luRmlsZU9iaiBpbnN0YW5jZW9mIEJsb2IpIHx8IGZpbGUudGh1bWJVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmaWxlLnRodW1iVXJsID0gJyc7XG4gICAgICBpZiAocHJldmlld0ZpbGUpIHtcbiAgICAgICAgcHJldmlld0ZpbGUoZmlsZS5vcmlnaW5GaWxlT2JqKS50aGVuKGZ1bmN0aW9uIChwcmV2aWV3RGF0YVVybCkge1xuICAgICAgICAgIC8vIE5lZWQgYXBwZW5kICcnIHRvIGF2b2lkIGRlYWQgbG9vcFxuICAgICAgICAgIGZpbGUudGh1bWJVcmwgPSBwcmV2aWV3RGF0YVVybCB8fCAnJztcbiAgICAgICAgICBmb3JjZVVwZGF0ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSwgW2xpc3RUeXBlLCBpdGVtcywgcHJldmlld0ZpbGVdKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzZXRNb3Rpb25BcHBlYXIodHJ1ZSk7XG4gIH0sIFtdKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRXZlbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBvbkludGVybmFsUHJldmlldyA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxQcmV2aWV3KGZpbGUsIGUpIHtcbiAgICBpZiAoIW9uUHJldmlldykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlID09PSBudWxsIHx8IGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGUucHJldmVudERlZmF1bHQoKTtcbiAgICByZXR1cm4gb25QcmV2aWV3KGZpbGUpO1xuICB9O1xuICB2YXIgb25JbnRlcm5hbERvd25sb2FkID0gZnVuY3Rpb24gb25JbnRlcm5hbERvd25sb2FkKGZpbGUpIHtcbiAgICBpZiAodHlwZW9mIG9uRG93bmxvYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9uRG93bmxvYWQoZmlsZSk7XG4gICAgfSBlbHNlIGlmIChmaWxlLnVybCkge1xuICAgICAgd2luZG93Lm9wZW4oZmlsZS51cmwpO1xuICAgIH1cbiAgfTtcbiAgdmFyIG9uSW50ZXJuYWxDbG9zZSA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxDbG9zZShmaWxlKSB7XG4gICAgb25SZW1vdmUgPT09IG51bGwgfHwgb25SZW1vdmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uUmVtb3ZlKGZpbGUpO1xuICB9O1xuICB2YXIgaW50ZXJuYWxJY29uUmVuZGVyID0gZnVuY3Rpb24gaW50ZXJuYWxJY29uUmVuZGVyKGZpbGUpIHtcbiAgICBpZiAoaWNvblJlbmRlcikge1xuICAgICAgcmV0dXJuIGljb25SZW5kZXIoZmlsZSwgbGlzdFR5cGUpO1xuICAgIH1cbiAgICB2YXIgaXNMb2FkaW5nID0gZmlsZS5zdGF0dXMgPT09ICd1cGxvYWRpbmcnO1xuICAgIHZhciBmaWxlSWNvbiA9IGlzSW1nVXJsICYmIGlzSW1nVXJsKGZpbGUpID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUGljdHVyZVR3b1RvbmUsIG51bGwpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRmlsZVR3b1RvbmUsIG51bGwpO1xuICAgIHZhciBpY29uID0gaXNMb2FkaW5nID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTG9hZGluZ091dGxpbmVkLCBudWxsKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBhcGVyQ2xpcE91dGxpbmVkLCBudWxsKTtcbiAgICBpZiAobGlzdFR5cGUgPT09ICdwaWN0dXJlJykge1xuICAgICAgaWNvbiA9IGlzTG9hZGluZyA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExvYWRpbmdPdXRsaW5lZCwgbnVsbCkgOiBmaWxlSWNvbjtcbiAgICB9IGVsc2UgaWYgKGxpc3RUeXBlID09PSAncGljdHVyZS1jYXJkJykge1xuICAgICAgaWNvbiA9IGlzTG9hZGluZyA/IGxvY2FsZS51cGxvYWRpbmcgOiBmaWxlSWNvbjtcbiAgICB9XG4gICAgcmV0dXJuIGljb247XG4gIH07XG4gIHZhciBhY3Rpb25JY29uUmVuZGVyID0gZnVuY3Rpb24gYWN0aW9uSWNvblJlbmRlcihjdXN0b21JY29uLCBjYWxsYmFjaywgcHJlZml4Q2xzLCB0aXRsZSkge1xuICAgIHZhciBidG5Qcm9wcyA9IHtcbiAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgIHNpemU6ICdzbWFsbCcsXG4gICAgICB0aXRsZTogdGl0bGUsXG4gICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KGN1c3RvbUljb24pICYmIGN1c3RvbUljb24ucHJvcHMub25DbGljaykge1xuICAgICAgICAgIGN1c3RvbUljb24ucHJvcHMub25DbGljayhlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1saXN0LWl0ZW0tY2FyZC1hY3Rpb25zLWJ0blwiKVxuICAgIH07XG4gICAgaWYgKGlzVmFsaWRFbGVtZW50KGN1c3RvbUljb24pKSB7XG4gICAgICB2YXIgYnRuSWNvbiA9IGNsb25lRWxlbWVudChjdXN0b21JY29uLCBfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgY3VzdG9tSWNvbi5wcm9wcyksIHtcbiAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHt9XG4gICAgICB9KSk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQnV0dG9uLCBfZXh0ZW5kcyh7fSwgYnRuUHJvcHMsIHtcbiAgICAgICAgaWNvbjogYnRuSWNvblxuICAgICAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQnV0dG9uLCBfZXh0ZW5kcyh7fSwgYnRuUHJvcHMpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgY3VzdG9tSWNvbikpO1xuICB9O1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVmID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVGVzdCBuZWVkc1xuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBoYW5kbGVQcmV2aWV3OiBvbkludGVybmFsUHJldmlldyxcbiAgICAgIGhhbmRsZURvd25sb2FkOiBvbkludGVybmFsRG93bmxvYWRcbiAgICB9O1xuICB9KTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHByZWZpeENscyA9IGdldFByZWZpeENscygndXBsb2FkJywgY3VzdG9taXplUHJlZml4Q2xzKTtcbiAgdmFyIGxpc3RDbGFzc05hbWVzID0gY2xhc3NOYW1lcygoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWxpc3RcIiksIHRydWUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItbGlzdC1cIikuY29uY2F0KGxpc3RUeXBlKSwgdHJ1ZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1saXN0LXJ0bFwiKSwgZGlyZWN0aW9uID09PSAncnRsJyksIF9jbGFzc05hbWVzKSk7XG4gIC8vID4+PiBNb3Rpb24gY29uZmlnXG4gIHZhciBtb3Rpb25LZXlMaXN0ID0gX3RvQ29uc3VtYWJsZUFycmF5KGl0ZW1zLm1hcChmdW5jdGlvbiAoZmlsZSkge1xuICAgIHJldHVybiB7XG4gICAgICBrZXk6IGZpbGUudWlkLFxuICAgICAgZmlsZTogZmlsZVxuICAgIH07XG4gIH0pKTtcbiAgdmFyIGFuaW1hdGlvbkRpcmVjdGlvbiA9IGxpc3RUeXBlID09PSAncGljdHVyZS1jYXJkJyA/ICdhbmltYXRlLWlubGluZScgOiAnYW5pbWF0ZSc7XG4gIC8vIGNvbnN0IHRyYW5zaXRpb25OYW1lID0gbGlzdC5sZW5ndGggPT09IDAgPyAnJyA6IGAke3ByZWZpeENsc30tJHthbmltYXRpb25EaXJlY3Rpb259YDtcbiAgdmFyIG1vdGlvbkNvbmZpZyA9IHtcbiAgICBtb3Rpb25EZWFkbGluZTogMjAwMCxcbiAgICBtb3Rpb25OYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLVwiKS5jb25jYXQoYW5pbWF0aW9uRGlyZWN0aW9uKSxcbiAgICBrZXlzOiBtb3Rpb25LZXlMaXN0LFxuICAgIG1vdGlvbkFwcGVhcjogbW90aW9uQXBwZWFyXG4gIH07XG4gIGlmIChsaXN0VHlwZSAhPT0gJ3BpY3R1cmUtY2FyZCcpIHtcbiAgICBtb3Rpb25Db25maWcgPSBfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgbGlzdEl0ZW1Nb3Rpb24pLCBtb3Rpb25Db25maWcpO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBsaXN0Q2xhc3NOYW1lc1xuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDU1NNb3Rpb25MaXN0LCBfZXh0ZW5kcyh7fSwgbW90aW9uQ29uZmlnLCB7XG4gICAgY29tcG9uZW50OiBmYWxzZVxuICB9KSwgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIga2V5ID0gX3JlZi5rZXksXG4gICAgICBmaWxlID0gX3JlZi5maWxlLFxuICAgICAgbW90aW9uQ2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgICBtb3Rpb25TdHlsZSA9IF9yZWYuc3R5bGU7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExpc3RJdGVtLCB7XG4gICAgICBrZXk6IGtleSxcbiAgICAgIGxvY2FsZTogbG9jYWxlLFxuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICBjbGFzc05hbWU6IG1vdGlvbkNsYXNzTmFtZSxcbiAgICAgIHN0eWxlOiBtb3Rpb25TdHlsZSxcbiAgICAgIGZpbGU6IGZpbGUsXG4gICAgICBpdGVtczogaXRlbXMsXG4gICAgICBwcm9ncmVzczogcHJvZ3Jlc3MsXG4gICAgICBsaXN0VHlwZTogbGlzdFR5cGUsXG4gICAgICBpc0ltZ1VybDogaXNJbWdVcmwsXG4gICAgICBzaG93UHJldmlld0ljb246IHNob3dQcmV2aWV3SWNvbixcbiAgICAgIHNob3dSZW1vdmVJY29uOiBzaG93UmVtb3ZlSWNvbixcbiAgICAgIHNob3dEb3dubG9hZEljb246IHNob3dEb3dubG9hZEljb24sXG4gICAgICByZW1vdmVJY29uOiByZW1vdmVJY29uLFxuICAgICAgcHJldmlld0ljb246IHByZXZpZXdJY29uLFxuICAgICAgZG93bmxvYWRJY29uOiBkb3dubG9hZEljb24sXG4gICAgICBpY29uUmVuZGVyOiBpbnRlcm5hbEljb25SZW5kZXIsXG4gICAgICBhY3Rpb25JY29uUmVuZGVyOiBhY3Rpb25JY29uUmVuZGVyLFxuICAgICAgaXRlbVJlbmRlcjogaXRlbVJlbmRlcixcbiAgICAgIG9uUHJldmlldzogb25JbnRlcm5hbFByZXZpZXcsXG4gICAgICBvbkRvd25sb2FkOiBvbkludGVybmFsRG93bmxvYWQsXG4gICAgICBvbkNsb3NlOiBvbkludGVybmFsQ2xvc2VcbiAgICB9KTtcbiAgfSksIGFwcGVuZEFjdGlvbiAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDU1NNb3Rpb24sIF9leHRlbmRzKHt9LCBtb3Rpb25Db25maWcsIHtcbiAgICB2aXNpYmxlOiBhcHBlbmRBY3Rpb25WaXNpYmxlLFxuICAgIGZvcmNlUmVuZGVyOiB0cnVlXG4gIH0pLCBmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICB2YXIgbW90aW9uQ2xhc3NOYW1lID0gX3JlZjIuY2xhc3NOYW1lLFxuICAgICAgbW90aW9uU3R5bGUgPSBfcmVmMi5zdHlsZTtcbiAgICByZXR1cm4gY2xvbmVFbGVtZW50KGFwcGVuZEFjdGlvbiwgZnVuY3Rpb24gKG9yaVByb3BzKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMob3JpUHJvcHMuY2xhc3NOYW1lLCBtb3Rpb25DbGFzc05hbWUpLFxuICAgICAgICBzdHlsZTogX2V4dGVuZHMoX2V4dGVuZHMoX2V4dGVuZHMoe30sIG1vdGlvblN0eWxlKSwge1xuICAgICAgICAgIC8vIHByZXZlbnQgdGhlIGVsZW1lbnQgaGFzIGhvdmVyIGNzcyBwc2V1ZG8tY2xhc3MgdGhhdCBtYXkgY2F1c2UgYW5pbWF0aW9uIHRvIGVuZCBwcmVtYXR1cmVseS5cbiAgICAgICAgICBwb2ludGVyRXZlbnRzOiBtb3Rpb25DbGFzc05hbWUgPyAnbm9uZScgOiB1bmRlZmluZWRcbiAgICAgICAgfSksIG9yaVByb3BzLnN0eWxlKVxuICAgICAgfTtcbiAgICB9KTtcbiAgfSkpO1xufTtcbnZhciBVcGxvYWRMaXN0ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoSW50ZXJuYWxVcGxvYWRMaXN0KTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFVwbG9hZExpc3QuZGlzcGxheU5hbWUgPSAnVXBsb2FkTGlzdCc7XG59XG5leHBvcnQgZGVmYXVsdCBVcGxvYWRMaXN0OyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfcmVnZW5lcmF0b3JSdW50aW1lIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9yZWdlbmVyYXRvclJ1bnRpbWVcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbnZhciBfX2F3YWl0ZXIgPSB0aGlzICYmIHRoaXMuX19hd2FpdGVyIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkge1xuICAgICAgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7XG4gICAgfVxuICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgfSk7XG59O1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUmNVcGxvYWQgZnJvbSAncmMtdXBsb2FkJztcbmltcG9ydCB1c2VNZXJnZWRTdGF0ZSBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VNZXJnZWRTdGF0ZVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZmx1c2hTeW5jIH0gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IERpc2FibGVkQ29udGV4dCBmcm9tICcuLi9jb25maWctcHJvdmlkZXIvRGlzYWJsZWRDb250ZXh0JztcbmltcG9ydCBMb2NhbGVSZWNlaXZlciBmcm9tICcuLi9sb2NhbGUtcHJvdmlkZXIvTG9jYWxlUmVjZWl2ZXInO1xuaW1wb3J0IGRlZmF1bHRMb2NhbGUgZnJvbSAnLi4vbG9jYWxlL2RlZmF1bHQnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi4vX3V0aWwvd2FybmluZyc7XG5pbXBvcnQgVXBsb2FkTGlzdCBmcm9tICcuL1VwbG9hZExpc3QnO1xuaW1wb3J0IHsgZmlsZTJPYmosIGdldEZpbGVJdGVtLCByZW1vdmVGaWxlSXRlbSwgdXBkYXRlRmlsZUxpc3QgfSBmcm9tICcuL3V0aWxzJztcbmV4cG9ydCB2YXIgTElTVF9JR05PUkUgPSBcIl9fTElTVF9JR05PUkVfXCIuY29uY2F0KERhdGUubm93KCksIFwiX19cIik7XG52YXIgSW50ZXJuYWxVcGxvYWQgPSBmdW5jdGlvbiBJbnRlcm5hbFVwbG9hZChwcm9wcywgcmVmKSB7XG4gIHZhciBfY2xhc3NOYW1lczI7XG4gIHZhciBmaWxlTGlzdCA9IHByb3BzLmZpbGVMaXN0LFxuICAgIGRlZmF1bHRGaWxlTGlzdCA9IHByb3BzLmRlZmF1bHRGaWxlTGlzdCxcbiAgICBvblJlbW92ZSA9IHByb3BzLm9uUmVtb3ZlLFxuICAgIF9wcm9wcyRzaG93VXBsb2FkTGlzdCA9IHByb3BzLnNob3dVcGxvYWRMaXN0LFxuICAgIHNob3dVcGxvYWRMaXN0ID0gX3Byb3BzJHNob3dVcGxvYWRMaXN0ID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJHNob3dVcGxvYWRMaXN0LFxuICAgIF9wcm9wcyRsaXN0VHlwZSA9IHByb3BzLmxpc3RUeXBlLFxuICAgIGxpc3RUeXBlID0gX3Byb3BzJGxpc3RUeXBlID09PSB2b2lkIDAgPyAndGV4dCcgOiBfcHJvcHMkbGlzdFR5cGUsXG4gICAgb25QcmV2aWV3ID0gcHJvcHMub25QcmV2aWV3LFxuICAgIG9uRG93bmxvYWQgPSBwcm9wcy5vbkRvd25sb2FkLFxuICAgIG9uQ2hhbmdlID0gcHJvcHMub25DaGFuZ2UsXG4gICAgb25Ecm9wID0gcHJvcHMub25Ecm9wLFxuICAgIHByZXZpZXdGaWxlID0gcHJvcHMucHJldmlld0ZpbGUsXG4gICAgY3VzdG9tRGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICBwcm9wTG9jYWxlID0gcHJvcHMubG9jYWxlLFxuICAgIGljb25SZW5kZXIgPSBwcm9wcy5pY29uUmVuZGVyLFxuICAgIGlzSW1hZ2VVcmwgPSBwcm9wcy5pc0ltYWdlVXJsLFxuICAgIHByb2dyZXNzID0gcHJvcHMucHJvZ3Jlc3MsXG4gICAgY3VzdG9taXplUHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBfcHJvcHMkdHlwZSA9IHByb3BzLnR5cGUsXG4gICAgdHlwZSA9IF9wcm9wcyR0eXBlID09PSB2b2lkIDAgPyAnc2VsZWN0JyA6IF9wcm9wcyR0eXBlLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICBpdGVtUmVuZGVyID0gcHJvcHMuaXRlbVJlbmRlcixcbiAgICBtYXhDb3VudCA9IHByb3BzLm1heENvdW50LFxuICAgIF9wcm9wcyRkYXRhID0gcHJvcHMuZGF0YSxcbiAgICBkYXRhID0gX3Byb3BzJGRhdGEgPT09IHZvaWQgMCA/IHt9IDogX3Byb3BzJGRhdGEsXG4gICAgX3Byb3BzJG11bHRpcGxlID0gcHJvcHMubXVsdGlwbGUsXG4gICAgbXVsdGlwbGUgPSBfcHJvcHMkbXVsdGlwbGUgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJG11bHRpcGxlLFxuICAgIF9wcm9wcyRhY3Rpb24gPSBwcm9wcy5hY3Rpb24sXG4gICAgYWN0aW9uID0gX3Byb3BzJGFjdGlvbiA9PT0gdm9pZCAwID8gJycgOiBfcHJvcHMkYWN0aW9uLFxuICAgIF9wcm9wcyRhY2NlcHQgPSBwcm9wcy5hY2NlcHQsXG4gICAgYWNjZXB0ID0gX3Byb3BzJGFjY2VwdCA9PT0gdm9pZCAwID8gJycgOiBfcHJvcHMkYWNjZXB0LFxuICAgIF9wcm9wcyRzdXBwb3J0U2VydmVyUiA9IHByb3BzLnN1cHBvcnRTZXJ2ZXJSZW5kZXIsXG4gICAgc3VwcG9ydFNlcnZlclJlbmRlciA9IF9wcm9wcyRzdXBwb3J0U2VydmVyUiA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRzdXBwb3J0U2VydmVyUjtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09IERpc2FibGVkID09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgZGlzYWJsZWQgPSBSZWFjdC51c2VDb250ZXh0KERpc2FibGVkQ29udGV4dCk7XG4gIHZhciBtZXJnZWREaXNhYmxlZCA9IGN1c3RvbURpc2FibGVkICE9PSBudWxsICYmIGN1c3RvbURpc2FibGVkICE9PSB2b2lkIDAgPyBjdXN0b21EaXNhYmxlZCA6IGRpc2FibGVkO1xuICB2YXIgX3VzZU1lcmdlZFN0YXRlID0gdXNlTWVyZ2VkU3RhdGUoZGVmYXVsdEZpbGVMaXN0IHx8IFtdLCB7XG4gICAgICB2YWx1ZTogZmlsZUxpc3QsXG4gICAgICBwb3N0U3RhdGU6IGZ1bmN0aW9uIHBvc3RTdGF0ZShsaXN0KSB7XG4gICAgICAgIHJldHVybiBsaXN0ICE9PSBudWxsICYmIGxpc3QgIT09IHZvaWQgMCA/IGxpc3QgOiBbXTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICBfdXNlTWVyZ2VkU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZU1lcmdlZFN0YXRlLCAyKSxcbiAgICBtZXJnZWRGaWxlTGlzdCA9IF91c2VNZXJnZWRTdGF0ZTJbMF0sXG4gICAgc2V0TWVyZ2VkRmlsZUxpc3QgPSBfdXNlTWVyZ2VkU3RhdGUyWzFdO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoJ2Ryb3AnKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBkcmFnU3RhdGUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldERyYWdTdGF0ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciB1cGxvYWQgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoJ2ZpbGVMaXN0JyBpbiBwcm9wcyB8fCAhKCd2YWx1ZScgaW4gcHJvcHMpLCAnVXBsb2FkJywgJ2B2YWx1ZWAgaXMgbm90IGEgdmFsaWQgcHJvcCwgZG8geW91IG1lYW4gYGZpbGVMaXN0YD8nKSA6IHZvaWQgMDtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghKCd0cmFuc2Zvcm1GaWxlJyBpbiBwcm9wcyksICdVcGxvYWQnLCAnYHRyYW5zZm9ybUZpbGVgIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgYGJlZm9yZVVwbG9hZGAgZGlyZWN0bHkuJykgOiB2b2lkIDA7XG4gIC8vIENvbnRyb2wgbW9kZSB3aWxsIGF1dG8gZmlsbCBmaWxlIHVpZCBpZiBub3QgcHJvdmlkZWRcbiAgUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgKGZpbGVMaXN0IHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlLCBpbmRleCkge1xuICAgICAgaWYgKCFmaWxlLnVpZCAmJiAhT2JqZWN0LmlzRnJvemVuKGZpbGUpKSB7XG4gICAgICAgIGZpbGUudWlkID0gXCJfX0FVVE9fX1wiLmNvbmNhdCh0aW1lc3RhbXAsIFwiX1wiKS5jb25jYXQoaW5kZXgsIFwiX19cIik7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sIFtmaWxlTGlzdF0pO1xuICB2YXIgb25JbnRlcm5hbENoYW5nZSA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxDaGFuZ2UoZmlsZSwgY2hhbmdlZEZpbGVMaXN0LCBldmVudCkge1xuICAgIHZhciBjbG9uZUxpc3QgPSBfdG9Db25zdW1hYmxlQXJyYXkoY2hhbmdlZEZpbGVMaXN0KTtcbiAgICAvLyBDdXQgdG8gbWF0Y2ggY291bnRcbiAgICBpZiAobWF4Q291bnQgPT09IDEpIHtcbiAgICAgIGNsb25lTGlzdCA9IGNsb25lTGlzdC5zbGljZSgtMSk7XG4gICAgfSBlbHNlIGlmIChtYXhDb3VudCkge1xuICAgICAgY2xvbmVMaXN0ID0gY2xvbmVMaXN0LnNsaWNlKDAsIG1heENvdW50KTtcbiAgICB9XG4gICAgLy8gUHJldmVudCBSZWFjdDE4IGF1dG8gYmF0Y2ggc2luY2UgaW5wdXRbdXBsb2FkXSB0cmlnZ2VyIHByb2Nlc3MgYXQgc2FtZSB0aW1lXG4gICAgLy8gd2hpY2ggbWFrZXMgZmlsZUxpc3QgY2xvc3VyZSBwcm9ibGVtXG4gICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNldE1lcmdlZEZpbGVMaXN0KGNsb25lTGlzdCk7XG4gICAgfSk7XG4gICAgdmFyIGNoYW5nZUluZm8gPSB7XG4gICAgICBmaWxlOiBmaWxlLFxuICAgICAgZmlsZUxpc3Q6IGNsb25lTGlzdFxuICAgIH07XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBjaGFuZ2VJbmZvLmV2ZW50ID0gZXZlbnQ7XG4gICAgfVxuICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShjaGFuZ2VJbmZvKTtcbiAgfTtcbiAgdmFyIG1lcmdlZEJlZm9yZVVwbG9hZCA9IGZ1bmN0aW9uIG1lcmdlZEJlZm9yZVVwbG9hZChmaWxlLCBmaWxlTGlzdEFyZ3MpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlKCkge1xuICAgICAgdmFyIGJlZm9yZVVwbG9hZCwgdHJhbnNmb3JtRmlsZSwgcGFyc2VkRmlsZSwgcmVzdWx0O1xuICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgYmVmb3JlVXBsb2FkID0gcHJvcHMuYmVmb3JlVXBsb2FkLCB0cmFuc2Zvcm1GaWxlID0gcHJvcHMudHJhbnNmb3JtRmlsZTtcbiAgICAgICAgICAgIHBhcnNlZEZpbGUgPSBmaWxlO1xuICAgICAgICAgICAgaWYgKCFiZWZvcmVVcGxvYWQpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEzO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1O1xuICAgICAgICAgICAgcmV0dXJuIGJlZm9yZVVwbG9hZChmaWxlLCBmaWxlTGlzdEFyZ3MpO1xuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIHJlc3VsdCA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICBpZiAoIShyZXN1bHQgPT09IGZhbHNlKSkge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gODtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGZhbHNlKTtcbiAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAvLyBIYWNrIGZvciBMSVNUX0lHTk9SRSwgd2UgYWRkIGFkZGl0aW9uYWwgaW5mbyB0byByZW1vdmUgZnJvbSB0aGUgbGlzdFxuICAgICAgICAgICAgZGVsZXRlIGZpbGVbTElTVF9JR05PUkVdO1xuICAgICAgICAgICAgaWYgKCEocmVzdWx0ID09PSBMSVNUX0lHTk9SRSkpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEyO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmaWxlLCBMSVNUX0lHTk9SRSwge1xuICAgICAgICAgICAgICB2YWx1ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgZmFsc2UpO1xuICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICBpZiAoX3R5cGVvZihyZXN1bHQpID09PSAnb2JqZWN0JyAmJiByZXN1bHQpIHtcbiAgICAgICAgICAgICAgcGFyc2VkRmlsZSA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgaWYgKCF0cmFuc2Zvcm1GaWxlKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTY7XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtRmlsZShwYXJzZWRGaWxlKTtcbiAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgcGFyc2VkRmlsZSA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgY2FzZSAxNzpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgcGFyc2VkRmlsZSk7XG4gICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9LCBfY2FsbGVlKTtcbiAgICB9KSk7XG4gIH07XG4gIHZhciBvbkJhdGNoU3RhcnQgPSBmdW5jdGlvbiBvbkJhdGNoU3RhcnQoYmF0Y2hGaWxlSW5mb0xpc3QpIHtcbiAgICAvLyBTa2lwIGZpbGUgd2hpY2ggbWFya2VkIGFzIGBMSVNUX0lHTk9SRWAsIHRoZXNlIGZpbGUgd2lsbCBub3QgYWRkIHRvIGZpbGUgbGlzdFxuICAgIHZhciBmaWx0ZXJlZEZpbGVJbmZvTGlzdCA9IGJhdGNoRmlsZUluZm9MaXN0LmZpbHRlcihmdW5jdGlvbiAoaW5mbykge1xuICAgICAgcmV0dXJuICFpbmZvLmZpbGVbTElTVF9JR05PUkVdO1xuICAgIH0pO1xuICAgIC8vIE5vdGhpbmcgdG8gZG8gc2luY2Ugbm8gZmlsZSBuZWVkIHVwbG9hZFxuICAgIGlmICghZmlsdGVyZWRGaWxlSW5mb0xpc3QubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBvYmplY3RGaWxlTGlzdCA9IGZpbHRlcmVkRmlsZUluZm9MaXN0Lm1hcChmdW5jdGlvbiAoaW5mbykge1xuICAgICAgcmV0dXJuIGZpbGUyT2JqKGluZm8uZmlsZSk7XG4gICAgfSk7XG4gICAgLy8gQ29uY2F0IG5ldyBmaWxlcyB3aXRoIHByZXYgZmlsZXNcbiAgICB2YXIgbmV3RmlsZUxpc3QgPSBfdG9Db25zdW1hYmxlQXJyYXkobWVyZ2VkRmlsZUxpc3QpO1xuICAgIG9iamVjdEZpbGVMaXN0LmZvckVhY2goZnVuY3Rpb24gKGZpbGVPYmopIHtcbiAgICAgIC8vIFJlcGxhY2UgZmlsZSBpZiBleGlzdFxuICAgICAgbmV3RmlsZUxpc3QgPSB1cGRhdGVGaWxlTGlzdChmaWxlT2JqLCBuZXdGaWxlTGlzdCk7XG4gICAgfSk7XG4gICAgb2JqZWN0RmlsZUxpc3QuZm9yRWFjaChmdW5jdGlvbiAoZmlsZU9iaiwgaW5kZXgpIHtcbiAgICAgIC8vIFJlcGVhdCB0cmlnZ2VyIGBvbkNoYW5nZWAgZXZlbnQgZm9yIGNvbXBhdGlibGVcbiAgICAgIHZhciB0cmlnZ2VyRmlsZU9iaiA9IGZpbGVPYmo7XG4gICAgICBpZiAoIWZpbHRlcmVkRmlsZUluZm9MaXN0W2luZGV4XS5wYXJzZWRGaWxlKSB7XG4gICAgICAgIC8vIGBiZWZvcmVVcGxvYWRgIHJldHVybiBmYWxzZVxuICAgICAgICB2YXIgb3JpZ2luRmlsZU9iaiA9IGZpbGVPYmoub3JpZ2luRmlsZU9iajtcbiAgICAgICAgdmFyIGNsb25lO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNsb25lID0gbmV3IEZpbGUoW29yaWdpbkZpbGVPYmpdLCBvcmlnaW5GaWxlT2JqLm5hbWUsIHtcbiAgICAgICAgICAgIHR5cGU6IG9yaWdpbkZpbGVPYmoudHlwZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY2xvbmUgPSBuZXcgQmxvYihbb3JpZ2luRmlsZU9ial0sIHtcbiAgICAgICAgICAgIHR5cGU6IG9yaWdpbkZpbGVPYmoudHlwZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNsb25lLm5hbWUgPSBvcmlnaW5GaWxlT2JqLm5hbWU7XG4gICAgICAgICAgY2xvbmUubGFzdE1vZGlmaWVkRGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgY2xvbmUubGFzdE1vZGlmaWVkID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2xvbmUudWlkID0gZmlsZU9iai51aWQ7XG4gICAgICAgIHRyaWdnZXJGaWxlT2JqID0gY2xvbmU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJbmplY3QgYHVwbG9hZGluZ2Agc3RhdHVzXG4gICAgICAgIGZpbGVPYmouc3RhdHVzID0gJ3VwbG9hZGluZyc7XG4gICAgICB9XG4gICAgICBvbkludGVybmFsQ2hhbmdlKHRyaWdnZXJGaWxlT2JqLCBuZXdGaWxlTGlzdCk7XG4gICAgfSk7XG4gIH07XG4gIHZhciBvblN1Y2Nlc3MgPSBmdW5jdGlvbiBvblN1Y2Nlc3MocmVzcG9uc2UsIGZpbGUsIHhocikge1xuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIHJlc3BvbnNlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXNwb25zZSA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8qIGRvIG5vdGhpbmcgKi9cbiAgICB9XG4gICAgLy8gcmVtb3ZlZFxuICAgIGlmICghZ2V0RmlsZUl0ZW0oZmlsZSwgbWVyZ2VkRmlsZUxpc3QpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0YXJnZXRJdGVtID0gZmlsZTJPYmooZmlsZSk7XG4gICAgdGFyZ2V0SXRlbS5zdGF0dXMgPSAnZG9uZSc7XG4gICAgdGFyZ2V0SXRlbS5wZXJjZW50ID0gMTAwO1xuICAgIHRhcmdldEl0ZW0ucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICB0YXJnZXRJdGVtLnhociA9IHhocjtcbiAgICB2YXIgbmV4dEZpbGVMaXN0ID0gdXBkYXRlRmlsZUxpc3QodGFyZ2V0SXRlbSwgbWVyZ2VkRmlsZUxpc3QpO1xuICAgIG9uSW50ZXJuYWxDaGFuZ2UodGFyZ2V0SXRlbSwgbmV4dEZpbGVMaXN0KTtcbiAgfTtcbiAgdmFyIG9uUHJvZ3Jlc3MgPSBmdW5jdGlvbiBvblByb2dyZXNzKGUsIGZpbGUpIHtcbiAgICAvLyByZW1vdmVkXG4gICAgaWYgKCFnZXRGaWxlSXRlbShmaWxlLCBtZXJnZWRGaWxlTGlzdCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRhcmdldEl0ZW0gPSBmaWxlMk9iaihmaWxlKTtcbiAgICB0YXJnZXRJdGVtLnN0YXR1cyA9ICd1cGxvYWRpbmcnO1xuICAgIHRhcmdldEl0ZW0ucGVyY2VudCA9IGUucGVyY2VudDtcbiAgICB2YXIgbmV4dEZpbGVMaXN0ID0gdXBkYXRlRmlsZUxpc3QodGFyZ2V0SXRlbSwgbWVyZ2VkRmlsZUxpc3QpO1xuICAgIG9uSW50ZXJuYWxDaGFuZ2UodGFyZ2V0SXRlbSwgbmV4dEZpbGVMaXN0LCBlKTtcbiAgfTtcbiAgdmFyIG9uRXJyb3IgPSBmdW5jdGlvbiBvbkVycm9yKGVycm9yLCByZXNwb25zZSwgZmlsZSkge1xuICAgIC8vIHJlbW92ZWRcbiAgICBpZiAoIWdldEZpbGVJdGVtKGZpbGUsIG1lcmdlZEZpbGVMaXN0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGFyZ2V0SXRlbSA9IGZpbGUyT2JqKGZpbGUpO1xuICAgIHRhcmdldEl0ZW0uZXJyb3IgPSBlcnJvcjtcbiAgICB0YXJnZXRJdGVtLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgdGFyZ2V0SXRlbS5zdGF0dXMgPSAnZXJyb3InO1xuICAgIHZhciBuZXh0RmlsZUxpc3QgPSB1cGRhdGVGaWxlTGlzdCh0YXJnZXRJdGVtLCBtZXJnZWRGaWxlTGlzdCk7XG4gICAgb25JbnRlcm5hbENoYW5nZSh0YXJnZXRJdGVtLCBuZXh0RmlsZUxpc3QpO1xuICB9O1xuICB2YXIgaGFuZGxlUmVtb3ZlID0gZnVuY3Rpb24gaGFuZGxlUmVtb3ZlKGZpbGUpIHtcbiAgICB2YXIgY3VycmVudEZpbGU7XG4gICAgUHJvbWlzZS5yZXNvbHZlKHR5cGVvZiBvblJlbW92ZSA9PT0gJ2Z1bmN0aW9uJyA/IG9uUmVtb3ZlKGZpbGUpIDogb25SZW1vdmUpLnRoZW4oZnVuY3Rpb24gKHJldCkge1xuICAgICAgdmFyIF9hO1xuICAgICAgLy8gUHJldmVudCByZW1vdmluZyBmaWxlXG4gICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgcmVtb3ZlZEZpbGVMaXN0ID0gcmVtb3ZlRmlsZUl0ZW0oZmlsZSwgbWVyZ2VkRmlsZUxpc3QpO1xuICAgICAgaWYgKHJlbW92ZWRGaWxlTGlzdCkge1xuICAgICAgICBjdXJyZW50RmlsZSA9IF9leHRlbmRzKF9leHRlbmRzKHt9LCBmaWxlKSwge1xuICAgICAgICAgIHN0YXR1czogJ3JlbW92ZWQnXG4gICAgICAgIH0pO1xuICAgICAgICBtZXJnZWRGaWxlTGlzdCA9PT0gbnVsbCB8fCBtZXJnZWRGaWxlTGlzdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbWVyZ2VkRmlsZUxpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgIHZhciBtYXRjaEtleSA9IGN1cnJlbnRGaWxlLnVpZCAhPT0gdW5kZWZpbmVkID8gJ3VpZCcgOiAnbmFtZSc7XG4gICAgICAgICAgaWYgKGl0ZW1bbWF0Y2hLZXldID09PSBjdXJyZW50RmlsZVttYXRjaEtleV0gJiYgIU9iamVjdC5pc0Zyb3plbihpdGVtKSkge1xuICAgICAgICAgICAgaXRlbS5zdGF0dXMgPSAncmVtb3ZlZCc7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgKF9hID0gdXBsb2FkLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hYm9ydChjdXJyZW50RmlsZSk7XG4gICAgICAgIG9uSW50ZXJuYWxDaGFuZ2UoY3VycmVudEZpbGUsIHJlbW92ZWRGaWxlTGlzdCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIHZhciBvbkZpbGVEcm9wID0gZnVuY3Rpb24gb25GaWxlRHJvcChlKSB7XG4gICAgc2V0RHJhZ1N0YXRlKGUudHlwZSk7XG4gICAgaWYgKGUudHlwZSA9PT0gJ2Ryb3AnKSB7XG4gICAgICBvbkRyb3AgPT09IG51bGwgfHwgb25Ecm9wID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkRyb3AoZSk7XG4gICAgfVxuICB9O1xuICAvLyBUZXN0IG5lZWRzXG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9uQmF0Y2hTdGFydDogb25CYXRjaFN0YXJ0LFxuICAgICAgb25TdWNjZXNzOiBvblN1Y2Nlc3MsXG4gICAgICBvblByb2dyZXNzOiBvblByb2dyZXNzLFxuICAgICAgb25FcnJvcjogb25FcnJvcixcbiAgICAgIGZpbGVMaXN0OiBtZXJnZWRGaWxlTGlzdCxcbiAgICAgIHVwbG9hZDogdXBsb2FkLmN1cnJlbnRcbiAgICB9O1xuICB9KTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb25maWdDb250ZXh0KSxcbiAgICBnZXRQcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5nZXRQcmVmaXhDbHMsXG4gICAgZGlyZWN0aW9uID0gX1JlYWN0JHVzZUNvbnRleHQuZGlyZWN0aW9uO1xuICB2YXIgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCd1cGxvYWQnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICB2YXIgcmNVcGxvYWRQcm9wcyA9IF9leHRlbmRzKF9leHRlbmRzKHtcbiAgICBvbkJhdGNoU3RhcnQ6IG9uQmF0Y2hTdGFydCxcbiAgICBvbkVycm9yOiBvbkVycm9yLFxuICAgIG9uUHJvZ3Jlc3M6IG9uUHJvZ3Jlc3MsXG4gICAgb25TdWNjZXNzOiBvblN1Y2Nlc3NcbiAgfSwgcHJvcHMpLCB7XG4gICAgZGF0YTogZGF0YSxcbiAgICBtdWx0aXBsZTogbXVsdGlwbGUsXG4gICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgYWNjZXB0OiBhY2NlcHQsXG4gICAgc3VwcG9ydFNlcnZlclJlbmRlcjogc3VwcG9ydFNlcnZlclJlbmRlcixcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBkaXNhYmxlZDogbWVyZ2VkRGlzYWJsZWQsXG4gICAgYmVmb3JlVXBsb2FkOiBtZXJnZWRCZWZvcmVVcGxvYWQsXG4gICAgb25DaGFuZ2U6IHVuZGVmaW5lZFxuICB9KTtcbiAgZGVsZXRlIHJjVXBsb2FkUHJvcHMuY2xhc3NOYW1lO1xuICBkZWxldGUgcmNVcGxvYWRQcm9wcy5zdHlsZTtcbiAgLy8gUmVtb3ZlIGlkIHRvIGF2b2lkIG9wZW4gYnkgbGFiZWwgd2hlbiB0cmlnZ2VyIGlzIGhpZGRlblxuICAvLyAhY2hpbGRyZW46IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzE0Mjk4XG4gIC8vIGRpc2FibGVkOiBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8xNjQ3OFxuICAvLyAgICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMjQxOTdcbiAgaWYgKCFjaGlsZHJlbiB8fCBtZXJnZWREaXNhYmxlZCkge1xuICAgIGRlbGV0ZSByY1VwbG9hZFByb3BzLmlkO1xuICB9XG4gIHZhciByZW5kZXJVcGxvYWRMaXN0ID0gZnVuY3Rpb24gcmVuZGVyVXBsb2FkTGlzdChidXR0b24sIGJ1dHRvblZpc2libGUpIHtcbiAgICByZXR1cm4gc2hvd1VwbG9hZExpc3QgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMb2NhbGVSZWNlaXZlciwge1xuICAgICAgY29tcG9uZW50TmFtZTogXCJVcGxvYWRcIixcbiAgICAgIGRlZmF1bHRMb2NhbGU6IGRlZmF1bHRMb2NhbGUuVXBsb2FkXG4gICAgfSwgZnVuY3Rpb24gKGNvbnRleHRMb2NhbGUpIHtcbiAgICAgIHZhciBfcmVmID0gdHlwZW9mIHNob3dVcGxvYWRMaXN0ID09PSAnYm9vbGVhbicgPyB7fSA6IHNob3dVcGxvYWRMaXN0LFxuICAgICAgICBzaG93UmVtb3ZlSWNvbiA9IF9yZWYuc2hvd1JlbW92ZUljb24sXG4gICAgICAgIHNob3dQcmV2aWV3SWNvbiA9IF9yZWYuc2hvd1ByZXZpZXdJY29uLFxuICAgICAgICBzaG93RG93bmxvYWRJY29uID0gX3JlZi5zaG93RG93bmxvYWRJY29uLFxuICAgICAgICByZW1vdmVJY29uID0gX3JlZi5yZW1vdmVJY29uLFxuICAgICAgICBwcmV2aWV3SWNvbiA9IF9yZWYucHJldmlld0ljb24sXG4gICAgICAgIGRvd25sb2FkSWNvbiA9IF9yZWYuZG93bmxvYWRJY29uO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFVwbG9hZExpc3QsIHtcbiAgICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgIGxpc3RUeXBlOiBsaXN0VHlwZSxcbiAgICAgICAgaXRlbXM6IG1lcmdlZEZpbGVMaXN0LFxuICAgICAgICBwcmV2aWV3RmlsZTogcHJldmlld0ZpbGUsXG4gICAgICAgIG9uUHJldmlldzogb25QcmV2aWV3LFxuICAgICAgICBvbkRvd25sb2FkOiBvbkRvd25sb2FkLFxuICAgICAgICBvblJlbW92ZTogaGFuZGxlUmVtb3ZlLFxuICAgICAgICBzaG93UmVtb3ZlSWNvbjogIW1lcmdlZERpc2FibGVkICYmIHNob3dSZW1vdmVJY29uLFxuICAgICAgICBzaG93UHJldmlld0ljb246IHNob3dQcmV2aWV3SWNvbixcbiAgICAgICAgc2hvd0Rvd25sb2FkSWNvbjogc2hvd0Rvd25sb2FkSWNvbixcbiAgICAgICAgcmVtb3ZlSWNvbjogcmVtb3ZlSWNvbixcbiAgICAgICAgcHJldmlld0ljb246IHByZXZpZXdJY29uLFxuICAgICAgICBkb3dubG9hZEljb246IGRvd25sb2FkSWNvbixcbiAgICAgICAgaWNvblJlbmRlcjogaWNvblJlbmRlcixcbiAgICAgICAgbG9jYWxlOiBfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgY29udGV4dExvY2FsZSksIHByb3BMb2NhbGUpLFxuICAgICAgICBpc0ltYWdlVXJsOiBpc0ltYWdlVXJsLFxuICAgICAgICBwcm9ncmVzczogcHJvZ3Jlc3MsXG4gICAgICAgIGFwcGVuZEFjdGlvbjogYnV0dG9uLFxuICAgICAgICBhcHBlbmRBY3Rpb25WaXNpYmxlOiBidXR0b25WaXNpYmxlLFxuICAgICAgICBpdGVtUmVuZGVyOiBpdGVtUmVuZGVyXG4gICAgICB9KTtcbiAgICB9KSA6IGJ1dHRvbjtcbiAgfTtcbiAgaWYgKHR5cGUgPT09ICdkcmFnJykge1xuICAgIHZhciBfY2xhc3NOYW1lcztcbiAgICB2YXIgZHJhZ0NscyA9IGNsYXNzTmFtZXMocHJlZml4Q2xzLCAoX2NsYXNzTmFtZXMgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRyYWdcIiksIHRydWUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZHJhZy11cGxvYWRpbmdcIiksIG1lcmdlZEZpbGVMaXN0LnNvbWUoZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgIHJldHVybiBmaWxlLnN0YXR1cyA9PT0gJ3VwbG9hZGluZyc7XG4gICAgfSkpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZHJhZy1ob3ZlclwiKSwgZHJhZ1N0YXRlID09PSAnZHJhZ292ZXInKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWRpc2FibGVkXCIpLCBtZXJnZWREaXNhYmxlZCksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBfY2xhc3NOYW1lcyksIGNsYXNzTmFtZSk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IGRyYWdDbHMsXG4gICAgICBvbkRyb3A6IG9uRmlsZURyb3AsXG4gICAgICBvbkRyYWdPdmVyOiBvbkZpbGVEcm9wLFxuICAgICAgb25EcmFnTGVhdmU6IG9uRmlsZURyb3AsXG4gICAgICBzdHlsZTogc3R5bGVcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSY1VwbG9hZCwgX2V4dGVuZHMoe30sIHJjVXBsb2FkUHJvcHMsIHtcbiAgICAgIHJlZjogdXBsb2FkLFxuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWJ0blwiKVxuICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZHJhZy1jb250YWluZXJcIilcbiAgICB9LCBjaGlsZHJlbikpKSwgcmVuZGVyVXBsb2FkTGlzdCgpKTtcbiAgfVxuICB2YXIgdXBsb2FkQnV0dG9uQ2xzID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIChfY2xhc3NOYW1lczIgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zZWxlY3RcIiksIHRydWUpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMyLCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNlbGVjdC1cIikuY29uY2F0KGxpc3RUeXBlKSwgdHJ1ZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NOYW1lczIsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWRcIiksIG1lcmdlZERpc2FibGVkKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzMiwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGRpcmVjdGlvbiA9PT0gJ3J0bCcpLCBfY2xhc3NOYW1lczIpKTtcbiAgdmFyIHJlbmRlclVwbG9hZEJ1dHRvbiA9IGZ1bmN0aW9uIHJlbmRlclVwbG9hZEJ1dHRvbih1cGxvYWRCdXR0b25TdHlsZSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IHVwbG9hZEJ1dHRvbkNscyxcbiAgICAgIHN0eWxlOiB1cGxvYWRCdXR0b25TdHlsZVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJjVXBsb2FkLCBfZXh0ZW5kcyh7fSwgcmNVcGxvYWRQcm9wcywge1xuICAgICAgcmVmOiB1cGxvYWRcbiAgICB9KSkpO1xuICB9O1xuICB2YXIgdXBsb2FkQnV0dG9uID0gcmVuZGVyVXBsb2FkQnV0dG9uKGNoaWxkcmVuID8gdW5kZWZpbmVkIDoge1xuICAgIGRpc3BsYXk6ICdub25lJ1xuICB9KTtcbiAgaWYgKGxpc3RUeXBlID09PSAncGljdHVyZS1jYXJkJykge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItcGljdHVyZS1jYXJkLXdyYXBwZXJcIiksIGNsYXNzTmFtZSlcbiAgICB9LCByZW5kZXJVcGxvYWRMaXN0KHVwbG9hZEJ1dHRvbiwgISFjaGlsZHJlbikpO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lXG4gIH0sIHVwbG9hZEJ1dHRvbiwgcmVuZGVyVXBsb2FkTGlzdCgpKTtcbn07XG52YXIgVXBsb2FkID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoSW50ZXJuYWxVcGxvYWQpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgVXBsb2FkLmRpc3BsYXlOYW1lID0gJ1VwbG9hZCc7XG59XG5leHBvcnQgZGVmYXVsdCBVcGxvYWQ7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFVwbG9hZCBmcm9tICcuL1VwbG9hZCc7XG52YXIgRHJhZ2dlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChfYSwgcmVmKSB7XG4gIHZhciBzdHlsZSA9IF9hLnN0eWxlLFxuICAgIGhlaWdodCA9IF9hLmhlaWdodCxcbiAgICByZXN0UHJvcHMgPSBfX3Jlc3QoX2EsIFtcInN0eWxlXCIsIFwiaGVpZ2h0XCJdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFVwbG9hZCwgX2V4dGVuZHMoe1xuICAgIHJlZjogcmVmXG4gIH0sIHJlc3RQcm9wcywge1xuICAgIHR5cGU6IFwiZHJhZ1wiLFxuICAgIHN0eWxlOiBfZXh0ZW5kcyhfZXh0ZW5kcyh7fSwgc3R5bGUpLCB7XG4gICAgICBoZWlnaHQ6IGhlaWdodFxuICAgIH0pXG4gIH0pKTtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgRHJhZ2dlci5kaXNwbGF5TmFtZSA9ICdEcmFnZ2VyJztcbn1cbmV4cG9ydCBkZWZhdWx0IERyYWdnZXI7IiwiaW1wb3J0IERyYWdnZXIgZnJvbSAnLi9EcmFnZ2VyJztcbmltcG9ydCBJbnRlcm5hbFVwbG9hZCwgeyBMSVNUX0lHTk9SRSB9IGZyb20gJy4vVXBsb2FkJztcbnZhciBVcGxvYWQgPSBJbnRlcm5hbFVwbG9hZDtcblVwbG9hZC5EcmFnZ2VyID0gRHJhZ2dlcjtcblVwbG9hZC5MSVNUX0lHTk9SRSA9IExJU1RfSUdOT1JFO1xuZXhwb3J0IGRlZmF1bHQgVXBsb2FkOyIsIi8vIHNyYy9jbGllbnQvd2luZG93LnRzXG52YXIgbW9ua2V5V2luZG93ID0gX19NT05LRVlfV0lORE9XX187XG5cbi8vIHNyYy9jbGllbnQvaW5kZXgudHNcbnZhciBHTSA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gbW9ua2V5V2luZG93LkdNKSgpO1xudmFyIHVuc2FmZVdpbmRvdyA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4ge1xuICByZXR1cm4gbW9ua2V5V2luZG93LnVuc2FmZVdpbmRvdztcbn0pKCk7XG52YXIgR01faW5mbyA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gbW9ua2V5V2luZG93LkdNX2luZm8pKCk7XG52YXIgR01fY29va2llID0gLyogQF9fUFVSRV9fICovICgoKSA9PiBtb25rZXlXaW5kb3cuR01fY29va2llKSgpO1xudmFyIEdNX3NldFZhbHVlID0gLyogQF9fUFVSRV9fICovICgoKSA9PiBtb25rZXlXaW5kb3cuR01fc2V0VmFsdWUpKCk7XG52YXIgR01fZGVsZXRlVmFsdWUgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IG1vbmtleVdpbmRvdy5HTV9kZWxldGVWYWx1ZSkoKTtcbnZhciBHTV9saXN0VmFsdWVzID0gLyogQF9fUFVSRV9fICovICgoKSA9PiBtb25rZXlXaW5kb3cuR01fbGlzdFZhbHVlcykoKTtcbnZhciBHTV9hZGRWYWx1ZUNoYW5nZUxpc3RlbmVyID0gLyogQF9fUFVSRV9fICovICgoKSA9PiBtb25rZXlXaW5kb3cuR01fYWRkVmFsdWVDaGFuZ2VMaXN0ZW5lcikoKTtcbnZhciBHTV9yZW1vdmVWYWx1ZUNoYW5nZUxpc3RlbmVyID0gLyogQF9fUFVSRV9fICovICgoKSA9PiBtb25rZXlXaW5kb3cuR01fcmVtb3ZlVmFsdWVDaGFuZ2VMaXN0ZW5lcikoKTtcbnZhciBHTV9nZXRSZXNvdXJjZVRleHQgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IG1vbmtleVdpbmRvdy5HTV9nZXRSZXNvdXJjZVRleHQpKCk7XG52YXIgR01fZ2V0UmVzb3VyY2VVUkwgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IG1vbmtleVdpbmRvdy5HTV9nZXRSZXNvdXJjZVVSTCkoKTtcbnZhciBHTV9hZGRFbGVtZW50ID0gLyogQF9fUFVSRV9fICovICgoKSA9PiBtb25rZXlXaW5kb3cuR01fYWRkRWxlbWVudCkoKTtcbnZhciBHTV9hZGRTdHlsZSA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gbW9ua2V5V2luZG93LkdNX2FkZFN0eWxlKSgpO1xudmFyIEdNX29wZW5JblRhYiA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gbW9ua2V5V2luZG93LkdNX29wZW5JblRhYikoKTtcbnZhciBHTV9yZWdpc3Rlck1lbnVDb21tYW5kID0gLyogQF9fUFVSRV9fICovICgoKSA9PiBtb25rZXlXaW5kb3cuR01fcmVnaXN0ZXJNZW51Q29tbWFuZCkoKTtcbnZhciBHTV91bnJlZ2lzdGVyTWVudUNvbW1hbmQgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IG1vbmtleVdpbmRvdy5HTV91bnJlZ2lzdGVyTWVudUNvbW1hbmQpKCk7XG52YXIgR01fbm90aWZpY2F0aW9uID0gLyogQF9fUFVSRV9fICovICgoKSA9PiBtb25rZXlXaW5kb3cuR01fbm90aWZpY2F0aW9uKSgpO1xudmFyIEdNX3htbGh0dHBSZXF1ZXN0ID0gLyogQF9fUFVSRV9fICovICgoKSA9PiBtb25rZXlXaW5kb3cuR01feG1saHR0cFJlcXVlc3QpKCk7XG52YXIgR01fc2V0Q2xpcGJvYXJkID0gLyogQF9fUFVSRV9fICovICgoKSA9PiBtb25rZXlXaW5kb3cuR01fc2V0Q2xpcGJvYXJkKSgpO1xudmFyIEdNX2Rvd25sb2FkID0gLyogQF9fUFVSRV9fICovICgoKSA9PiBtb25rZXlXaW5kb3cuR01fZG93bmxvYWQpKCk7XG52YXIgR01fbG9nID0gLyogQF9fUFVSRV9fICovICgoKSA9PiBtb25rZXlXaW5kb3cuR01fbG9nKSgpO1xudmFyIEdNX2dldFRhYiA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gbW9ua2V5V2luZG93LkdNX2dldFRhYikoKTtcbnZhciBHTV9zYXZlVGFiID0gLyogQF9fUFVSRV9fICovICgoKSA9PiBtb25rZXlXaW5kb3cuR01fc2F2ZVRhYikoKTtcbnZhciBHTV9nZXRUYWJzID0gLyogQF9fUFVSRV9fICovICgoKSA9PiBtb25rZXlXaW5kb3cuR01fZ2V0VGFicykoKTtcbnZhciBHTV9nZXRWYWx1ZSA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gbW9ua2V5V2luZG93LkdNX2dldFZhbHVlKSgpO1xuZXhwb3J0IHtcbiAgR00sXG4gIEdNX2FkZEVsZW1lbnQsXG4gIEdNX2FkZFN0eWxlLFxuICBHTV9hZGRWYWx1ZUNoYW5nZUxpc3RlbmVyLFxuICBHTV9jb29raWUsXG4gIEdNX2RlbGV0ZVZhbHVlLFxuICBHTV9kb3dubG9hZCxcbiAgR01fZ2V0UmVzb3VyY2VUZXh0LFxuICBHTV9nZXRSZXNvdXJjZVVSTCxcbiAgR01fZ2V0VGFiLFxuICBHTV9nZXRUYWJzLFxuICBHTV9nZXRWYWx1ZSxcbiAgR01faW5mbyxcbiAgR01fbGlzdFZhbHVlcyxcbiAgR01fbG9nLFxuICBHTV9ub3RpZmljYXRpb24sXG4gIEdNX29wZW5JblRhYixcbiAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZCxcbiAgR01fcmVtb3ZlVmFsdWVDaGFuZ2VMaXN0ZW5lcixcbiAgR01fc2F2ZVRhYixcbiAgR01fc2V0Q2xpcGJvYXJkLFxuICBHTV9zZXRWYWx1ZSxcbiAgR01fdW5yZWdpc3Rlck1lbnVDb21tYW5kLFxuICBHTV94bWxodHRwUmVxdWVzdCxcbiAgbW9ua2V5V2luZG93LFxuICB1bnNhZmVXaW5kb3dcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlLCBTdXBwcmVzc2VkRXJyb3IsIFN5bWJvbCAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XHJcbiAgICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cclxuICAgIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XHJcbiAgICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcclxuICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xyXG4gICAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcclxuICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7fTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcclxuICAgICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xyXG4gICAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xyXG4gICAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcclxuICAgICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XHJcbiAgICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XHJcbiAgICBkb25lID0gdHJ1ZTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3J1bkluaXRpYWxpemVycyh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XHJcbiAgICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcclxuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gXCJzeW1ib2xcIiA/IHggOiBcIlwiLmNvbmNhdCh4KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NldEZ1bmN0aW9uTmFtZShmLCBuYW1lLCBwcmVmaXgpIHtcclxuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikgbmFtZSA9IG5hbWUuZGVzY3JpcHRpb24gPyBcIltcIi5jb25jYXQobmFtZS5kZXNjcmlwdGlvbiwgXCJdXCIpIDogXCJcIjtcclxuICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xyXG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcclxuICAgICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xyXG4gICAgfVxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcclxufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcclxuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xyXG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xyXG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogZmFsc2UgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XHJcbn0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4oc3RhdGUsIHJlY2VpdmVyKSB7XHJcbiAgICBpZiAocmVjZWl2ZXIgPT09IG51bGwgfHwgKHR5cGVvZiByZWNlaXZlciAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcmVjZWl2ZXIgIT09IFwiZnVuY3Rpb25cIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgdXNlICdpbicgb3BlcmF0b3Igb24gbm9uLW9iamVjdFwiKTtcclxuICAgIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xyXG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcclxuICAgICAgICB2YXIgZGlzcG9zZTtcclxuICAgICAgICBpZiAoYXN5bmMpIHtcclxuICAgICAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xyXG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XHJcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGFzeW5jKSB7XHJcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZTtcclxufVxyXG5cclxudmFyIF9TdXBwcmVzc2VkRXJyb3IgPSB0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcclxuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xyXG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XHJcbiAgICBmdW5jdGlvbiBmYWlsKGUpIHtcclxuICAgICAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgX1N1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XHJcbiAgICAgICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG5leHQoKSB7XHJcbiAgICAgICAgd2hpbGUgKGVudi5zdGFjay5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdmFyIHJlYyA9IGVudi5zdGFjay5wb3AoKTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByZWMuZGlzcG9zZSAmJiByZWMuZGlzcG9zZS5jYWxsKHJlYy52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVjLmFzeW5jKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBmYWlsKGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXh0KCk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICAgIF9fZXh0ZW5kcyxcclxuICAgIF9fYXNzaWduLFxyXG4gICAgX19yZXN0LFxyXG4gICAgX19kZWNvcmF0ZSxcclxuICAgIF9fcGFyYW0sXHJcbiAgICBfX21ldGFkYXRhLFxyXG4gICAgX19hd2FpdGVyLFxyXG4gICAgX19nZW5lcmF0b3IsXHJcbiAgICBfX2NyZWF0ZUJpbmRpbmcsXHJcbiAgICBfX2V4cG9ydFN0YXIsXHJcbiAgICBfX3ZhbHVlcyxcclxuICAgIF9fcmVhZCxcclxuICAgIF9fc3ByZWFkLFxyXG4gICAgX19zcHJlYWRBcnJheXMsXHJcbiAgICBfX3NwcmVhZEFycmF5LFxyXG4gICAgX19hd2FpdCxcclxuICAgIF9fYXN5bmNHZW5lcmF0b3IsXHJcbiAgICBfX2FzeW5jRGVsZWdhdG9yLFxyXG4gICAgX19hc3luY1ZhbHVlcyxcclxuICAgIF9fbWFrZVRlbXBsYXRlT2JqZWN0LFxyXG4gICAgX19pbXBvcnRTdGFyLFxyXG4gICAgX19pbXBvcnREZWZhdWx0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sXHJcbiAgICBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSxcclxuICAgIF9fZGlzcG9zZVJlc291cmNlcyxcclxufTtcclxuIiwiY29uc3QgY3JlYXRlU3RvcmVJbXBsID0gKGNyZWF0ZVN0YXRlKSA9PiB7XG4gIGxldCBzdGF0ZTtcbiAgY29uc3QgbGlzdGVuZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgY29uc3Qgc2V0U3RhdGUgPSAocGFydGlhbCwgcmVwbGFjZSkgPT4ge1xuICAgIGNvbnN0IG5leHRTdGF0ZSA9IHR5cGVvZiBwYXJ0aWFsID09PSBcImZ1bmN0aW9uXCIgPyBwYXJ0aWFsKHN0YXRlKSA6IHBhcnRpYWw7XG4gICAgaWYgKCFPYmplY3QuaXMobmV4dFN0YXRlLCBzdGF0ZSkpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzU3RhdGUgPSBzdGF0ZTtcbiAgICAgIHN0YXRlID0gKHJlcGxhY2UgIT0gbnVsbCA/IHJlcGxhY2UgOiB0eXBlb2YgbmV4dFN0YXRlICE9PSBcIm9iamVjdFwiKSA/IG5leHRTdGF0ZSA6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCBuZXh0U3RhdGUpO1xuICAgICAgbGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiBsaXN0ZW5lcihzdGF0ZSwgcHJldmlvdXNTdGF0ZSkpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgZ2V0U3RhdGUgPSAoKSA9PiBzdGF0ZTtcbiAgY29uc3Qgc3Vic2NyaWJlID0gKGxpc3RlbmVyKSA9PiB7XG4gICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgcmV0dXJuICgpID0+IGxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICB9O1xuICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xuICAgIGlmICgoaW1wb3J0Lm1ldGEuZW52ICYmIGltcG9ydC5tZXRhLmVudi5NT0RFKSAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJbREVQUkVDQVRFRF0gVGhlIGBkZXN0cm95YCBtZXRob2Qgd2lsbCBiZSB1bnN1cHBvcnRlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLiBJbnN0ZWFkIHVzZSB1bnN1YnNjcmliZSBmdW5jdGlvbiByZXR1cm5lZCBieSBzdWJzY3JpYmUuIEV2ZXJ5dGhpbmcgd2lsbCBiZSBnYXJiYWdlLWNvbGxlY3RlZCBpZiBzdG9yZSBpcyBnYXJiYWdlLWNvbGxlY3RlZC5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgbGlzdGVuZXJzLmNsZWFyKCk7XG4gIH07XG4gIGNvbnN0IGFwaSA9IHsgc2V0U3RhdGUsIGdldFN0YXRlLCBzdWJzY3JpYmUsIGRlc3Ryb3kgfTtcbiAgc3RhdGUgPSBjcmVhdGVTdGF0ZShzZXRTdGF0ZSwgZ2V0U3RhdGUsIGFwaSk7XG4gIHJldHVybiBhcGk7XG59O1xuY29uc3QgY3JlYXRlU3RvcmUgPSAoY3JlYXRlU3RhdGUpID0+IGNyZWF0ZVN0YXRlID8gY3JlYXRlU3RvcmVJbXBsKGNyZWF0ZVN0YXRlKSA6IGNyZWF0ZVN0b3JlSW1wbDtcbnZhciB2YW5pbGxhID0gKGNyZWF0ZVN0YXRlKSA9PiB7XG4gIGlmICgoaW1wb3J0Lm1ldGEuZW52ICYmIGltcG9ydC5tZXRhLmVudi5NT0RFKSAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBcIltERVBSRUNBVEVEXSBEZWZhdWx0IGV4cG9ydCBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkIHVzZSBpbXBvcnQgeyBjcmVhdGVTdG9yZSB9IGZyb20gJ3p1c3RhbmQvdmFuaWxsYScuXCJcbiAgICApO1xuICB9XG4gIHJldHVybiBjcmVhdGVTdG9yZShjcmVhdGVTdGF0ZSk7XG59O1xuXG5leHBvcnQgeyBjcmVhdGVTdG9yZSwgdmFuaWxsYSBhcyBkZWZhdWx0IH07XG4iLCIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiB1c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltLnByb2R1Y3Rpb24ubWluLmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbid1c2Ugc3RyaWN0Jzt2YXIgZT1yZXF1aXJlKFwicmVhY3RcIik7ZnVuY3Rpb24gaChhLGIpe3JldHVybiBhPT09YiYmKDAhPT1hfHwxL2E9PT0xL2IpfHxhIT09YSYmYiE9PWJ9dmFyIGs9XCJmdW5jdGlvblwiPT09dHlwZW9mIE9iamVjdC5pcz9PYmplY3QuaXM6aCxsPWUudXNlU3RhdGUsbT1lLnVzZUVmZmVjdCxuPWUudXNlTGF5b3V0RWZmZWN0LHA9ZS51c2VEZWJ1Z1ZhbHVlO2Z1bmN0aW9uIHEoYSxiKXt2YXIgZD1iKCksZj1sKHtpbnN0Ont2YWx1ZTpkLGdldFNuYXBzaG90OmJ9fSksYz1mWzBdLmluc3QsZz1mWzFdO24oZnVuY3Rpb24oKXtjLnZhbHVlPWQ7Yy5nZXRTbmFwc2hvdD1iO3IoYykmJmcoe2luc3Q6Y30pfSxbYSxkLGJdKTttKGZ1bmN0aW9uKCl7cihjKSYmZyh7aW5zdDpjfSk7cmV0dXJuIGEoZnVuY3Rpb24oKXtyKGMpJiZnKHtpbnN0OmN9KX0pfSxbYV0pO3AoZCk7cmV0dXJuIGR9XG5mdW5jdGlvbiByKGEpe3ZhciBiPWEuZ2V0U25hcHNob3Q7YT1hLnZhbHVlO3RyeXt2YXIgZD1iKCk7cmV0dXJuIWsoYSxkKX1jYXRjaChmKXtyZXR1cm4hMH19ZnVuY3Rpb24gdChhLGIpe3JldHVybiBiKCl9dmFyIHU9XCJ1bmRlZmluZWRcIj09PXR5cGVvZiB3aW5kb3d8fFwidW5kZWZpbmVkXCI9PT10eXBlb2Ygd2luZG93LmRvY3VtZW50fHxcInVuZGVmaW5lZFwiPT09dHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50P3Q6cTtleHBvcnRzLnVzZVN5bmNFeHRlcm5hbFN0b3JlPXZvaWQgMCE9PWUudXNlU3luY0V4dGVybmFsU3RvcmU/ZS51c2VTeW5jRXh0ZXJuYWxTdG9yZTp1O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2Nqcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2Nqcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiB1c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltL3dpdGgtc2VsZWN0b3IucHJvZHVjdGlvbi5taW4uanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO3ZhciBoPXJlcXVpcmUoXCJyZWFjdFwiKSxuPXJlcXVpcmUoXCJ1c2Utc3luYy1leHRlcm5hbC1zdG9yZS9zaGltXCIpO2Z1bmN0aW9uIHAoYSxiKXtyZXR1cm4gYT09PWImJigwIT09YXx8MS9hPT09MS9iKXx8YSE9PWEmJmIhPT1ifXZhciBxPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBPYmplY3QuaXM/T2JqZWN0LmlzOnAscj1uLnVzZVN5bmNFeHRlcm5hbFN0b3JlLHQ9aC51c2VSZWYsdT1oLnVzZUVmZmVjdCx2PWgudXNlTWVtbyx3PWgudXNlRGVidWdWYWx1ZTtcbmV4cG9ydHMudXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3I9ZnVuY3Rpb24oYSxiLGUsbCxnKXt2YXIgYz10KG51bGwpO2lmKG51bGw9PT1jLmN1cnJlbnQpe3ZhciBmPXtoYXNWYWx1ZTohMSx2YWx1ZTpudWxsfTtjLmN1cnJlbnQ9Zn1lbHNlIGY9Yy5jdXJyZW50O2M9dihmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7aWYoIWMpe2M9ITA7ZD1hO2E9bChhKTtpZih2b2lkIDAhPT1nJiZmLmhhc1ZhbHVlKXt2YXIgYj1mLnZhbHVlO2lmKGcoYixhKSlyZXR1cm4gaz1ifXJldHVybiBrPWF9Yj1rO2lmKHEoZCxhKSlyZXR1cm4gYjt2YXIgZT1sKGEpO2lmKHZvaWQgMCE9PWcmJmcoYixlKSlyZXR1cm4gYjtkPWE7cmV0dXJuIGs9ZX12YXIgYz0hMSxkLGssbT12b2lkIDA9PT1lP251bGw6ZTtyZXR1cm5bZnVuY3Rpb24oKXtyZXR1cm4gYShiKCkpfSxudWxsPT09bT92b2lkIDA6ZnVuY3Rpb24oKXtyZXR1cm4gYShtKCkpfV19LFtiLGUsbCxnXSk7dmFyIGQ9cihhLGNbMF0sY1sxXSk7XG51KGZ1bmN0aW9uKCl7Zi5oYXNWYWx1ZT0hMDtmLnZhbHVlPWR9LFtkXSk7dyhkKTtyZXR1cm4gZH07XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vY2pzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0vd2l0aC1zZWxlY3Rvci5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS93aXRoLXNlbGVjdG9yLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVTdG9yZSB9IGZyb20gJ3p1c3RhbmQvdmFuaWxsYSc7XG5leHBvcnQgKiBmcm9tICd6dXN0YW5kL3ZhbmlsbGEnO1xuaW1wb3J0IHsgdXNlRGVidWdWYWx1ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VTeW5jRXh0ZXJuYWxTdG9yZUV4cG9ydHMgZnJvbSAndXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvc2hpbS93aXRoLXNlbGVjdG9yLmpzJztcblxuY29uc3QgeyB1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvciB9ID0gdXNlU3luY0V4dGVybmFsU3RvcmVFeHBvcnRzO1xuZnVuY3Rpb24gdXNlU3RvcmUoYXBpLCBzZWxlY3RvciA9IGFwaS5nZXRTdGF0ZSwgZXF1YWxpdHlGbikge1xuICBjb25zdCBzbGljZSA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yKFxuICAgIGFwaS5zdWJzY3JpYmUsXG4gICAgYXBpLmdldFN0YXRlLFxuICAgIGFwaS5nZXRTZXJ2ZXJTdGF0ZSB8fCBhcGkuZ2V0U3RhdGUsXG4gICAgc2VsZWN0b3IsXG4gICAgZXF1YWxpdHlGblxuICApO1xuICB1c2VEZWJ1Z1ZhbHVlKHNsaWNlKTtcbiAgcmV0dXJuIHNsaWNlO1xufVxuY29uc3QgY3JlYXRlSW1wbCA9IChjcmVhdGVTdGF0ZSkgPT4ge1xuICBpZiAoKGltcG9ydC5tZXRhLmVudiAmJiBpbXBvcnQubWV0YS5lbnYuTU9ERSkgIT09IFwicHJvZHVjdGlvblwiICYmIHR5cGVvZiBjcmVhdGVTdGF0ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJbREVQUkVDQVRFRF0gUGFzc2luZyBhIHZhbmlsbGEgc3RvcmUgd2lsbCBiZSB1bnN1cHBvcnRlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLiBJbnN0ZWFkIHVzZSBgaW1wb3J0IHsgdXNlU3RvcmUgfSBmcm9tICd6dXN0YW5kJ2AuXCJcbiAgICApO1xuICB9XG4gIGNvbnN0IGFwaSA9IHR5cGVvZiBjcmVhdGVTdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gY3JlYXRlU3RvcmUoY3JlYXRlU3RhdGUpIDogY3JlYXRlU3RhdGU7XG4gIGNvbnN0IHVzZUJvdW5kU3RvcmUgPSAoc2VsZWN0b3IsIGVxdWFsaXR5Rm4pID0+IHVzZVN0b3JlKGFwaSwgc2VsZWN0b3IsIGVxdWFsaXR5Rm4pO1xuICBPYmplY3QuYXNzaWduKHVzZUJvdW5kU3RvcmUsIGFwaSk7XG4gIHJldHVybiB1c2VCb3VuZFN0b3JlO1xufTtcbmNvbnN0IGNyZWF0ZSA9IChjcmVhdGVTdGF0ZSkgPT4gY3JlYXRlU3RhdGUgPyBjcmVhdGVJbXBsKGNyZWF0ZVN0YXRlKSA6IGNyZWF0ZUltcGw7XG52YXIgcmVhY3QgPSAoY3JlYXRlU3RhdGUpID0+IHtcbiAgaWYgKChpbXBvcnQubWV0YS5lbnYgJiYgaW1wb3J0Lm1ldGEuZW52Lk1PREUpICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIFwiW0RFUFJFQ0FURURdIERlZmF1bHQgZXhwb3J0IGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQgdXNlIGBpbXBvcnQgeyBjcmVhdGUgfSBmcm9tICd6dXN0YW5kJ2AuXCJcbiAgICApO1xuICB9XG4gIHJldHVybiBjcmVhdGUoY3JlYXRlU3RhdGUpO1xufTtcblxuZXhwb3J0IHsgY3JlYXRlLCByZWFjdCBhcyBkZWZhdWx0LCB1c2VTdG9yZSB9O1xuIiwiLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxuZXhwb3J0IGRlZmF1bHQgZnJlZUdsb2JhbDtcbiIsImltcG9ydCBmcmVlR2xvYmFsIGZyb20gJy4vX2ZyZWVHbG9iYWwuanMnO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xudmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbi8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0LiAqL1xudmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbmV4cG9ydCBkZWZhdWx0IHJvb3Q7XG4iLCJpbXBvcnQgcm9vdCBmcm9tICcuL19yb290LmpzJztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgU3ltYm9sID0gcm9vdC5TeW1ib2w7XG5cbmV4cG9ydCBkZWZhdWx0IFN5bWJvbDtcbiIsImltcG9ydCBTeW1ib2wgZnJvbSAnLi9fU3ltYm9sLmpzJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmF3IGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyksXG4gICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgdHJ5IHtcbiAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQ7XG4gICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIGlmICh1bm1hc2tlZCkge1xuICAgIGlmIChpc093bikge1xuICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBnZXRSYXdUYWc7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIHVzaW5nIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgb2JqZWN0VG9TdHJpbmc7XG4iLCJpbXBvcnQgU3ltYm9sIGZyb20gJy4vX1N5bWJvbC5qcyc7XG5pbXBvcnQgZ2V0UmF3VGFnIGZyb20gJy4vX2dldFJhd1RhZy5qcyc7XG5pbXBvcnQgb2JqZWN0VG9TdHJpbmcgZnJvbSAnLi9fb2JqZWN0VG9TdHJpbmcuanMnO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbnVsbFRhZyA9ICdbb2JqZWN0IE51bGxdJyxcbiAgICB1bmRlZmluZWRUYWcgPSAnW29iamVjdCBVbmRlZmluZWRdJztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldFRhZ2Agd2l0aG91dCBmYWxsYmFja3MgZm9yIGJ1Z2d5IGVudmlyb25tZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWRUYWcgOiBudWxsVGFnO1xuICB9XG4gIHJldHVybiAoc3ltVG9TdHJpbmdUYWcgJiYgc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKSlcbiAgICA/IGdldFJhd1RhZyh2YWx1ZSlcbiAgICA6IG9iamVjdFRvU3RyaW5nKHZhbHVlKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUdldFRhZztcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc09iamVjdExpa2U7XG4iLCJpbXBvcnQgYmFzZUdldFRhZyBmcm9tICcuL19iYXNlR2V0VGFnLmpzJztcbmltcG9ydCBpc09iamVjdExpa2UgZnJvbSAnLi9pc09iamVjdExpa2UuanMnO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN5bWJvbFRhZyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzU3ltYm9sO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWFwYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAqIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5TWFwKGFycmF5LCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXJyYXlNYXA7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxuZXhwb3J0IGRlZmF1bHQgaXNBcnJheTtcbiIsImltcG9ydCBTeW1ib2wgZnJvbSAnLi9fU3ltYm9sLmpzJztcbmltcG9ydCBhcnJheU1hcCBmcm9tICcuL19hcnJheU1hcC5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuaW1wb3J0IGlzU3ltYm9sIGZyb20gJy4vaXNTeW1ib2wuanMnO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSA9IDEgLyAwO1xuXG4vKiogVXNlZCB0byBjb252ZXJ0IHN5bWJvbHMgdG8gcHJpbWl0aXZlcyBhbmQgc3RyaW5ncy4gKi9cbnZhciBzeW1ib2xQcm90byA9IFN5bWJvbCA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG4gICAgc3ltYm9sVG9TdHJpbmcgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnRvU3RyaW5nIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRvU3RyaW5nYCB3aGljaCBkb2Vzbid0IGNvbnZlcnQgbnVsbGlzaFxuICogdmFsdWVzIHRvIGVtcHR5IHN0cmluZ3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUb1N0cmluZyh2YWx1ZSkge1xuICAvLyBFeGl0IGVhcmx5IGZvciBzdHJpbmdzIHRvIGF2b2lkIGEgcGVyZm9ybWFuY2UgaGl0IGluIHNvbWUgZW52aXJvbm1lbnRzLlxuICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbnZlcnQgdmFsdWVzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgcmV0dXJuIGFycmF5TWFwKHZhbHVlLCBiYXNlVG9TdHJpbmcpICsgJyc7XG4gIH1cbiAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiBzeW1ib2xUb1N0cmluZyA/IHN5bWJvbFRvU3RyaW5nLmNhbGwodmFsdWUpIDogJyc7XG4gIH1cbiAgdmFyIHJlc3VsdCA9ICh2YWx1ZSArICcnKTtcbiAgcmV0dXJuIChyZXN1bHQgPT0gJzAnICYmICgxIC8gdmFsdWUpID09IC1JTkZJTklUWSkgPyAnLTAnIDogcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlVG9TdHJpbmc7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChfLm5vb3ApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNPYmplY3Q7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50IGl0IHJlY2VpdmVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0geyp9IHZhbHVlIEFueSB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICpcbiAqIGNvbnNvbGUubG9nKF8uaWRlbnRpdHkob2JqZWN0KSA9PT0gb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpZGVudGl0eTtcbiIsImltcG9ydCBiYXNlR2V0VGFnIGZyb20gJy4vX2Jhc2VHZXRUYWcuanMnO1xuaW1wb3J0IGlzT2JqZWN0IGZyb20gJy4vaXNPYmplY3QuanMnO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXN5bmNUYWcgPSAnW29iamVjdCBBc3luY0Z1bmN0aW9uXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICBwcm94eVRhZyA9ICdbb2JqZWN0IFByb3h5XSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0Z1bmN0aW9uKF8pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNGdW5jdGlvbigvYWJjLyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAvLyBpbiBTYWZhcmkgOSB3aGljaCByZXR1cm5zICdvYmplY3QnIGZvciB0eXBlZCBhcnJheXMgYW5kIG90aGVyIGNvbnN0cnVjdG9ycy5cbiAgdmFyIHRhZyA9IGJhc2VHZXRUYWcodmFsdWUpO1xuICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZyB8fCB0YWcgPT0gYXN5bmNUYWcgfHwgdGFnID09IHByb3h5VGFnO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0Z1bmN0aW9uO1xuIiwiaW1wb3J0IHJvb3QgZnJvbSAnLi9fcm9vdC5qcyc7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvdmVycmVhY2hpbmcgY29yZS1qcyBzaGltcy4gKi9cbnZhciBjb3JlSnNEYXRhID0gcm9vdFsnX19jb3JlLWpzX3NoYXJlZF9fJ107XG5cbmV4cG9ydCBkZWZhdWx0IGNvcmVKc0RhdGE7XG4iLCJpbXBvcnQgY29yZUpzRGF0YSBmcm9tICcuL19jb3JlSnNEYXRhLmpzJztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG1ldGhvZHMgbWFzcXVlcmFkaW5nIGFzIG5hdGl2ZS4gKi9cbnZhciBtYXNrU3JjS2V5ID0gKGZ1bmN0aW9uKCkge1xuICB2YXIgdWlkID0gL1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhICYmIGNvcmVKc0RhdGEua2V5cyAmJiBjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE8gfHwgJycpO1xuICByZXR1cm4gdWlkID8gKCdTeW1ib2woc3JjKV8xLicgKyB1aWQpIDogJyc7XG59KCkpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGl0cyBzb3VyY2UgbWFza2VkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2VkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpIHtcbiAgcmV0dXJuICEhbWFza1NyY0tleSAmJiAobWFza1NyY0tleSBpbiBmdW5jKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNNYXNrZWQ7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRvU291cmNlO1xuIiwiaW1wb3J0IGlzRnVuY3Rpb24gZnJvbSAnLi9pc0Z1bmN0aW9uLmpzJztcbmltcG9ydCBpc01hc2tlZCBmcm9tICcuL19pc01hc2tlZC5qcyc7XG5pbXBvcnQgaXNPYmplY3QgZnJvbSAnLi9pc09iamVjdC5qcyc7XG5pbXBvcnQgdG9Tb3VyY2UgZnJvbSAnLi9fdG9Tb3VyY2UuanMnO1xuXG4vKipcbiAqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGBcbiAqIFtzeW50YXggY2hhcmFjdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcGF0dGVybnMpLlxuICovXG52YXIgcmVSZWdFeHBDaGFyID0gL1tcXFxcXiQuKis/KClbXFxde318XS9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaG9zdCBjb25zdHJ1Y3RvcnMgKFNhZmFyaSkuICovXG52YXIgcmVJc0hvc3RDdG9yID0gL15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBpZiBhIG1ldGhvZCBpcyBuYXRpdmUuICovXG52YXIgcmVJc05hdGl2ZSA9IFJlZ0V4cCgnXicgK1xuICBmdW5jVG9TdHJpbmcuY2FsbChoYXNPd25Qcm9wZXJ0eSkucmVwbGFjZShyZVJlZ0V4cENoYXIsICdcXFxcJCYnKVxuICAucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXFxcXCgpfCBmb3IgLis/KD89XFxcXFxcXSkvZywgJyQxLio/JykgKyAnJCdcbik7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNOYXRpdmVgIHdpdGhvdXQgYmFkIHNoaW0gY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzTmF0aXZlKHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpIHx8IGlzTWFza2VkKHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcGF0dGVybiA9IGlzRnVuY3Rpb24odmFsdWUpID8gcmVJc05hdGl2ZSA6IHJlSXNIb3N0Q3RvcjtcbiAgcmV0dXJuIHBhdHRlcm4udGVzdCh0b1NvdXJjZSh2YWx1ZSkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlSXNOYXRpdmU7XG4iLCIvKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBnZXRWYWx1ZShvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0VmFsdWU7XG4iLCJpbXBvcnQgYmFzZUlzTmF0aXZlIGZyb20gJy4vX2Jhc2VJc05hdGl2ZS5qcyc7XG5pbXBvcnQgZ2V0VmFsdWUgZnJvbSAnLi9fZ2V0VmFsdWUuanMnO1xuXG4vKipcbiAqIEdldHMgdGhlIG5hdGl2ZSBmdW5jdGlvbiBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBnZXROYXRpdmUob2JqZWN0LCBrZXkpIHtcbiAgdmFyIHZhbHVlID0gZ2V0VmFsdWUob2JqZWN0LCBrZXkpO1xuICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBnZXROYXRpdmU7XG4iLCJpbXBvcnQgZ2V0TmF0aXZlIGZyb20gJy4vX2dldE5hdGl2ZS5qcyc7XG5pbXBvcnQgcm9vdCBmcm9tICcuL19yb290LmpzJztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIFdlYWtNYXAgPSBnZXROYXRpdmUocm9vdCwgJ1dlYWtNYXAnKTtcblxuZXhwb3J0IGRlZmF1bHQgV2Vha01hcDtcbiIsImltcG9ydCBpc09iamVjdCBmcm9tICcuL2lzT2JqZWN0LmpzJztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0Q3JlYXRlID0gT2JqZWN0LmNyZWF0ZTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jcmVhdGVgIHdpdGhvdXQgc3VwcG9ydCBmb3IgYXNzaWduaW5nXG4gKiBwcm9wZXJ0aWVzIHRvIHRoZSBjcmVhdGVkIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHByb3RvIFRoZSBvYmplY3QgdG8gaW5oZXJpdCBmcm9tLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xudmFyIGJhc2VDcmVhdGUgPSAoZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIG9iamVjdCgpIHt9XG4gIHJldHVybiBmdW5jdGlvbihwcm90bykge1xuICAgIGlmICghaXNPYmplY3QocHJvdG8pKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGlmIChvYmplY3RDcmVhdGUpIHtcbiAgICAgIHJldHVybiBvYmplY3RDcmVhdGUocHJvdG8pO1xuICAgIH1cbiAgICBvYmplY3QucHJvdG90eXBlID0gcHJvdG87XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBvYmplY3Q7XG4gICAgb2JqZWN0LnByb3RvdHlwZSA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufSgpKTtcblxuZXhwb3J0IGRlZmF1bHQgYmFzZUNyZWF0ZTtcbiIsIi8qKlxuICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgYHNvdXJjZWAgdG8gYGFycmF5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gc291cmNlIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyBmcm9tLlxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5PVtdXSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgdG8uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gY29weUFycmF5KHNvdXJjZSwgYXJyYXkpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBzb3VyY2UubGVuZ3RoO1xuXG4gIGFycmF5IHx8IChhcnJheSA9IEFycmF5KGxlbmd0aCkpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGFycmF5W2luZGV4XSA9IHNvdXJjZVtpbmRleF07XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjb3B5QXJyYXk7XG4iLCJpbXBvcnQgZ2V0TmF0aXZlIGZyb20gJy4vX2dldE5hdGl2ZS5qcyc7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IChmdW5jdGlvbigpIHtcbiAgdHJ5IHtcbiAgICB2YXIgZnVuYyA9IGdldE5hdGl2ZShPYmplY3QsICdkZWZpbmVQcm9wZXJ0eScpO1xuICAgIGZ1bmMoe30sICcnLCB7fSk7XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH0gY2F0Y2ggKGUpIHt9XG59KCkpO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVQcm9wZXJ0eTtcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZvckVhY2hgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBhcnJheUVhY2goYXJyYXksIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpID09PSBmYWxzZSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXJyYXlFYWNoO1xuIiwiLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy4gKi9cbnZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxcZCopJC87XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGluZGV4LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPU1BWF9TQUZFX0lOVEVHRVJdIFRoZSB1cHBlciBib3VuZHMgb2YgYSB2YWxpZCBpbmRleC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgaW5kZXgsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwgbGVuZ3RoKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XG5cbiAgcmV0dXJuICEhbGVuZ3RoICYmXG4gICAgKHR5cGUgPT0gJ251bWJlcicgfHxcbiAgICAgICh0eXBlICE9ICdzeW1ib2wnICYmIHJlSXNVaW50LnRlc3QodmFsdWUpKSkgJiZcbiAgICAgICAgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0luZGV4O1xuIiwiaW1wb3J0IGRlZmluZVByb3BlcnR5IGZyb20gJy4vX2RlZmluZVByb3BlcnR5LmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgYXNzaWduVmFsdWVgIGFuZCBgYXNzaWduTWVyZ2VWYWx1ZWAgd2l0aG91dFxuICogdmFsdWUgY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSA9PSAnX19wcm90b19fJyAmJiBkZWZpbmVQcm9wZXJ0eSkge1xuICAgIGRlZmluZVByb3BlcnR5KG9iamVjdCwga2V5LCB7XG4gICAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAgICdlbnVtZXJhYmxlJzogdHJ1ZSxcbiAgICAgICd2YWx1ZSc6IHZhbHVlLFxuICAgICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUFzc2lnblZhbHVlO1xuIiwiLyoqXG4gKiBQZXJmb3JtcyBhXG4gKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICpcbiAqIF8uZXEob2JqZWN0LCBvYmplY3QpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uZXEob2JqZWN0LCBvdGhlcik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uZXEoJ2EnLCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uZXEoJ2EnLCBPYmplY3QoJ2EnKSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uZXEoTmFOLCBOYU4pO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBlcSh2YWx1ZSwgb3RoZXIpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBvdGhlciB8fCAodmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGVxO1xuIiwiaW1wb3J0IGJhc2VBc3NpZ25WYWx1ZSBmcm9tICcuL19iYXNlQXNzaWduVmFsdWUuanMnO1xuaW1wb3J0IGVxIGZyb20gJy4vZXEuanMnO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEFzc2lnbnMgYHZhbHVlYCB0byBga2V5YCBvZiBgb2JqZWN0YCBpZiB0aGUgZXhpc3RpbmcgdmFsdWUgaXMgbm90IGVxdWl2YWxlbnRcbiAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAqL1xuZnVuY3Rpb24gYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXldO1xuICBpZiAoIShoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJiBlcShvYmpWYWx1ZSwgdmFsdWUpKSB8fFxuICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBhc3NpZ25WYWx1ZTtcbiIsImltcG9ydCBhc3NpZ25WYWx1ZSBmcm9tICcuL19hc3NpZ25WYWx1ZS5qcyc7XG5pbXBvcnQgYmFzZUFzc2lnblZhbHVlIGZyb20gJy4vX2Jhc2VBc3NpZ25WYWx1ZS5qcyc7XG5cbi8qKlxuICogQ29waWVzIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbS5cbiAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycyB0byBjb3B5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIHRvLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29waWVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGNvcHlPYmplY3Qoc291cmNlLCBwcm9wcywgb2JqZWN0LCBjdXN0b21pemVyKSB7XG4gIHZhciBpc05ldyA9ICFvYmplY3Q7XG4gIG9iamVjdCB8fCAob2JqZWN0ID0ge30pO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTtcblxuICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgID8gY3VzdG9taXplcihvYmplY3Rba2V5XSwgc291cmNlW2tleV0sIGtleSwgb2JqZWN0LCBzb3VyY2UpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBuZXdWYWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgICBpZiAoaXNOZXcpIHtcbiAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqZWN0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjb3B5T2JqZWN0O1xuIiwiLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGxlbmd0aCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTGVuZ3RoKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNMZW5ndGgoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoSW5maW5pdHkpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmXG4gICAgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0xlbmd0aDtcbiIsImltcG9ydCBpc0Z1bmN0aW9uIGZyb20gJy4vaXNGdW5jdGlvbi5qcyc7XG5pbXBvcnQgaXNMZW5ndGggZnJvbSAnLi9pc0xlbmd0aC5qcyc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZS4gQSB2YWx1ZSBpcyBjb25zaWRlcmVkIGFycmF5LWxpa2UgaWYgaXQnc1xuICogbm90IGEgZnVuY3Rpb24gYW5kIGhhcyBhIGB2YWx1ZS5sZW5ndGhgIHRoYXQncyBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBvclxuICogZXF1YWwgdG8gYDBgIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoJ2FiYycpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgIWlzRnVuY3Rpb24odmFsdWUpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0FycmF5TGlrZTtcbiIsImltcG9ydCBlcSBmcm9tICcuL2VxLmpzJztcbmltcG9ydCBpc0FycmF5TGlrZSBmcm9tICcuL2lzQXJyYXlMaWtlLmpzJztcbmltcG9ydCBpc0luZGV4IGZyb20gJy4vX2lzSW5kZXguanMnO1xuaW1wb3J0IGlzT2JqZWN0IGZyb20gJy4vaXNPYmplY3QuanMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHBvdGVudGlhbCBpdGVyYXRlZSB2YWx1ZSBhcmd1bWVudC5cbiAqIEBwYXJhbSB7Kn0gaW5kZXggVGhlIHBvdGVudGlhbCBpdGVyYXRlZSBpbmRleCBvciBrZXkgYXJndW1lbnQuXG4gKiBAcGFyYW0geyp9IG9iamVjdCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIG9iamVjdCBhcmd1bWVudC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0l0ZXJhdGVlQ2FsbCh2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHR5cGUgPSB0eXBlb2YgaW5kZXg7XG4gIGlmICh0eXBlID09ICdudW1iZXInXG4gICAgICAgID8gKGlzQXJyYXlMaWtlKG9iamVjdCkgJiYgaXNJbmRleChpbmRleCwgb2JqZWN0Lmxlbmd0aCkpXG4gICAgICAgIDogKHR5cGUgPT0gJ3N0cmluZycgJiYgaW5kZXggaW4gb2JqZWN0KVxuICAgICAgKSB7XG4gICAgcmV0dXJuIGVxKG9iamVjdFtpbmRleF0sIHZhbHVlKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzSXRlcmF0ZWVDYWxsO1xuIiwiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYSBwcm90b3R5cGUgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvdG90eXBlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzUHJvdG90eXBlKHZhbHVlKSB7XG4gIHZhciBDdG9yID0gdmFsdWUgJiYgdmFsdWUuY29uc3RydWN0b3IsXG4gICAgICBwcm90byA9ICh0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IucHJvdG90eXBlKSB8fCBvYmplY3RQcm90bztcblxuICByZXR1cm4gdmFsdWUgPT09IHByb3RvO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc1Byb3RvdHlwZTtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udGltZXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kc1xuICogb3IgbWF4IGFycmF5IGxlbmd0aCBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICovXG5mdW5jdGlvbiBiYXNlVGltZXMobiwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBBcnJheShuKTtcblxuICB3aGlsZSAoKytpbmRleCA8IG4pIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoaW5kZXgpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VUaW1lcztcbiIsImltcG9ydCBiYXNlR2V0VGFnIGZyb20gJy4vX2Jhc2VHZXRUYWcuanMnO1xuaW1wb3J0IGlzT2JqZWN0TGlrZSBmcm9tICcuL2lzT2JqZWN0TGlrZS5qcyc7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNBcmd1bWVudHNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAqL1xuZnVuY3Rpb24gYmFzZUlzQXJndW1lbnRzKHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGFyZ3NUYWc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VJc0FyZ3VtZW50cztcbiIsImltcG9ydCBiYXNlSXNBcmd1bWVudHMgZnJvbSAnLi9fYmFzZUlzQXJndW1lbnRzLmpzJztcbmltcG9ydCBpc09iamVjdExpa2UgZnJvbSAnLi9pc09iamVjdExpa2UuanMnO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhbiBgYXJndW1lbnRzYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICogIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJndW1lbnRzKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNBcmd1bWVudHMgPSBiYXNlSXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPyBiYXNlSXNBcmd1bWVudHMgOiBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnY2FsbGVlJykgJiZcbiAgICAhcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgaXNBcmd1bWVudHM7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgYGZhbHNlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udGltZXMoMiwgXy5zdHViRmFsc2UpO1xuICogLy8gPT4gW2ZhbHNlLCBmYWxzZV1cbiAqL1xuZnVuY3Rpb24gc3R1YkZhbHNlKCkge1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHN0dWJGYWxzZTtcbiIsImltcG9ydCByb290IGZyb20gJy4vX3Jvb3QuanMnO1xuaW1wb3J0IHN0dWJGYWxzZSBmcm9tICcuL3N0dWJGYWxzZS5qcyc7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG52YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbnZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbi8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG52YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgQnVmZmVyID0gbW9kdWxlRXhwb3J0cyA/IHJvb3QuQnVmZmVyIDogdW5kZWZpbmVkO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlSXNCdWZmZXIgPSBCdWZmZXIgPyBCdWZmZXIuaXNCdWZmZXIgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjMuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0J1ZmZlcihuZXcgQnVmZmVyKDIpKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQnVmZmVyKG5ldyBVaW50OEFycmF5KDIpKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0J1ZmZlciA9IG5hdGl2ZUlzQnVmZmVyIHx8IHN0dWJGYWxzZTtcblxuZXhwb3J0IGRlZmF1bHQgaXNCdWZmZXI7XG4iLCJpbXBvcnQgYmFzZUdldFRhZyBmcm9tICcuL19iYXNlR2V0VGFnLmpzJztcbmltcG9ydCBpc0xlbmd0aCBmcm9tICcuL2lzTGVuZ3RoLmpzJztcbmltcG9ydCBpc09iamVjdExpa2UgZnJvbSAnLi9pc09iamVjdExpa2UuanMnO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxuICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgICBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXSc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nLFxuICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuXG4vKiogVXNlZCB0byBpZGVudGlmeSBgdG9TdHJpbmdUYWdgIHZhbHVlcyBvZiB0eXBlZCBhcnJheXMuICovXG52YXIgdHlwZWRBcnJheVRhZ3MgPSB7fTtcbnR5cGVkQXJyYXlUYWdzW2Zsb2F0MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbZmxvYXQ2NFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbaW50OFRhZ10gPSB0eXBlZEFycmF5VGFnc1tpbnQxNlRhZ10gPVxudHlwZWRBcnJheVRhZ3NbaW50MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDhUYWddID1cbnR5cGVkQXJyYXlUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50MTZUYWddID1cbnR5cGVkQXJyYXlUYWdzW3VpbnQzMlRhZ10gPSB0cnVlO1xudHlwZWRBcnJheVRhZ3NbYXJnc1RhZ10gPSB0eXBlZEFycmF5VGFnc1thcnJheVRhZ10gPVxudHlwZWRBcnJheVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gdHlwZWRBcnJheVRhZ3NbYm9vbFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbZGF0YVZpZXdUYWddID0gdHlwZWRBcnJheVRhZ3NbZGF0ZVRhZ10gPVxudHlwZWRBcnJheVRhZ3NbZXJyb3JUYWddID0gdHlwZWRBcnJheVRhZ3NbZnVuY1RhZ10gPVxudHlwZWRBcnJheVRhZ3NbbWFwVGFnXSA9IHR5cGVkQXJyYXlUYWdzW251bWJlclRhZ10gPVxudHlwZWRBcnJheVRhZ3Nbb2JqZWN0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3JlZ2V4cFRhZ10gPVxudHlwZWRBcnJheVRhZ3Nbc2V0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3N0cmluZ1RhZ10gPVxudHlwZWRBcnJheVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1R5cGVkQXJyYXlgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzVHlwZWRBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJlxuICAgIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgISF0eXBlZEFycmF5VGFnc1tiYXNlR2V0VGFnKHZhbHVlKV07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VJc1R5cGVkQXJyYXk7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuYXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIHN0b3JpbmcgbWV0YWRhdGEuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlVW5hcnkoZnVuYykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gZnVuYyh2YWx1ZSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VVbmFyeTtcbiIsImltcG9ydCBmcmVlR2xvYmFsIGZyb20gJy4vX2ZyZWVHbG9iYWwuanMnO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xudmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG52YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4vKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xudmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgcHJvY2Vzc2AgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVQcm9jZXNzID0gbW9kdWxlRXhwb3J0cyAmJiBmcmVlR2xvYmFsLnByb2Nlc3M7XG5cbi8qKiBVc2VkIHRvIGFjY2VzcyBmYXN0ZXIgTm9kZS5qcyBoZWxwZXJzLiAqL1xudmFyIG5vZGVVdGlsID0gKGZ1bmN0aW9uKCkge1xuICB0cnkge1xuICAgIC8vIFVzZSBgdXRpbC50eXBlc2AgZm9yIE5vZGUuanMgMTArLlxuICAgIHZhciB0eXBlcyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlICYmIGZyZWVNb2R1bGUucmVxdWlyZSgndXRpbCcpLnR5cGVzO1xuXG4gICAgaWYgKHR5cGVzKSB7XG4gICAgICByZXR1cm4gdHlwZXM7XG4gICAgfVxuXG4gICAgLy8gTGVnYWN5IGBwcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKWAgZm9yIE5vZGUuanMgPCAxMC5cbiAgICByZXR1cm4gZnJlZVByb2Nlc3MgJiYgZnJlZVByb2Nlc3MuYmluZGluZyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nKCd1dGlsJyk7XG4gIH0gY2F0Y2ggKGUpIHt9XG59KCkpO1xuXG5leHBvcnQgZGVmYXVsdCBub2RlVXRpbDtcbiIsImltcG9ydCBiYXNlSXNUeXBlZEFycmF5IGZyb20gJy4vX2Jhc2VJc1R5cGVkQXJyYXkuanMnO1xuaW1wb3J0IGJhc2VVbmFyeSBmcm9tICcuL19iYXNlVW5hcnkuanMnO1xuaW1wb3J0IG5vZGVVdGlsIGZyb20gJy4vX25vZGVVdGlsLmpzJztcblxuLyogTm9kZS5qcyBoZWxwZXIgcmVmZXJlbmNlcy4gKi9cbnZhciBub2RlSXNUeXBlZEFycmF5ID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNUeXBlZEFycmF5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSB0eXBlZCBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNUeXBlZEFycmF5KG5ldyBVaW50OEFycmF5KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzVHlwZWRBcnJheShbXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNUeXBlZEFycmF5ID0gbm9kZUlzVHlwZWRBcnJheSA/IGJhc2VVbmFyeShub2RlSXNUeXBlZEFycmF5KSA6IGJhc2VJc1R5cGVkQXJyYXk7XG5cbmV4cG9ydCBkZWZhdWx0IGlzVHlwZWRBcnJheTtcbiIsImltcG9ydCBiYXNlVGltZXMgZnJvbSAnLi9fYmFzZVRpbWVzLmpzJztcbmltcG9ydCBpc0FyZ3VtZW50cyBmcm9tICcuL2lzQXJndW1lbnRzLmpzJztcbmltcG9ydCBpc0FycmF5IGZyb20gJy4vaXNBcnJheS5qcyc7XG5pbXBvcnQgaXNCdWZmZXIgZnJvbSAnLi9pc0J1ZmZlci5qcyc7XG5pbXBvcnQgaXNJbmRleCBmcm9tICcuL19pc0luZGV4LmpzJztcbmltcG9ydCBpc1R5cGVkQXJyYXkgZnJvbSAnLi9pc1R5cGVkQXJyYXkuanMnO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgdGhlIGFycmF5LWxpa2UgYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluaGVyaXRlZCBTcGVjaWZ5IHJldHVybmluZyBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLCBpbmhlcml0ZWQpIHtcbiAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSksXG4gICAgICBpc0FyZyA9ICFpc0FyciAmJiBpc0FyZ3VtZW50cyh2YWx1ZSksXG4gICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgIWlzQXJnICYmIGlzQnVmZmVyKHZhbHVlKSxcbiAgICAgIGlzVHlwZSA9ICFpc0FyciAmJiAhaXNBcmcgJiYgIWlzQnVmZiAmJiBpc1R5cGVkQXJyYXkodmFsdWUpLFxuICAgICAgc2tpcEluZGV4ZXMgPSBpc0FyciB8fCBpc0FyZyB8fCBpc0J1ZmYgfHwgaXNUeXBlLFxuICAgICAgcmVzdWx0ID0gc2tpcEluZGV4ZXMgPyBiYXNlVGltZXModmFsdWUubGVuZ3RoLCBTdHJpbmcpIDogW10sXG4gICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoO1xuXG4gIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgIGlmICgoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpICYmXG4gICAgICAgICEoc2tpcEluZGV4ZXMgJiYgKFxuICAgICAgICAgICAvLyBTYWZhcmkgOSBoYXMgZW51bWVyYWJsZSBgYXJndW1lbnRzLmxlbmd0aGAgaW4gc3RyaWN0IG1vZGUuXG4gICAgICAgICAgIGtleSA9PSAnbGVuZ3RoJyB8fFxuICAgICAgICAgICAvLyBOb2RlLmpzIDAuMTAgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gYnVmZmVycy5cbiAgICAgICAgICAgKGlzQnVmZiAmJiAoa2V5ID09ICdvZmZzZXQnIHx8IGtleSA9PSAncGFyZW50JykpIHx8XG4gICAgICAgICAgIC8vIFBoYW50b21KUyAyIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIHR5cGVkIGFycmF5cy5cbiAgICAgICAgICAgKGlzVHlwZSAmJiAoa2V5ID09ICdidWZmZXInIHx8IGtleSA9PSAnYnl0ZUxlbmd0aCcgfHwga2V5ID09ICdieXRlT2Zmc2V0JykpIHx8XG4gICAgICAgICAgIC8vIFNraXAgaW5kZXggcHJvcGVydGllcy5cbiAgICAgICAgICAgaXNJbmRleChrZXksIGxlbmd0aClcbiAgICAgICAgKSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFycmF5TGlrZUtleXM7XG4iLCIvKipcbiAqIENyZWF0ZXMgYSB1bmFyeSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50IHRyYW5zZm9ybWVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgb3ZlckFyZztcbiIsImltcG9ydCBvdmVyQXJnIGZyb20gJy4vX292ZXJBcmcuanMnO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlS2V5cyA9IG92ZXJBcmcoT2JqZWN0LmtleXMsIE9iamVjdCk7XG5cbmV4cG9ydCBkZWZhdWx0IG5hdGl2ZUtleXM7XG4iLCJpbXBvcnQgaXNQcm90b3R5cGUgZnJvbSAnLi9faXNQcm90b3R5cGUuanMnO1xuaW1wb3J0IG5hdGl2ZUtleXMgZnJvbSAnLi9fbmF0aXZlS2V5cy5qcyc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c2Agd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBiYXNlS2V5cyhvYmplY3QpIHtcbiAgaWYgKCFpc1Byb3RvdHlwZShvYmplY3QpKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUtleXMob2JqZWN0KTtcbiAgfVxuICB2YXIgcmVzdWx0ID0gW107XG4gIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJiBrZXkgIT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUtleXM7XG4iLCJpbXBvcnQgYXJyYXlMaWtlS2V5cyBmcm9tICcuL19hcnJheUxpa2VLZXlzLmpzJztcbmltcG9ydCBiYXNlS2V5cyBmcm9tICcuL19iYXNlS2V5cy5qcyc7XG5pbXBvcnQgaXNBcnJheUxpa2UgZnJvbSAnLi9pc0FycmF5TGlrZS5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuIFNlZSB0aGVcbiAqIFtFUyBzcGVjXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5rZXlzKG5ldyBGb28pO1xuICogLy8gPT4gWydhJywgJ2InXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIF8ua2V5cygnaGknKTtcbiAqIC8vID0+IFsnMCcsICcxJ11cbiAqL1xuZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcbiAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCkgOiBiYXNlS2V5cyhvYmplY3QpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBrZXlzO1xuIiwiLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2VcbiAqIFtgT2JqZWN0LmtleXNgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAqIGV4Y2VwdCB0aGF0IGl0IGluY2x1ZGVzIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIG5hdGl2ZUtleXNJbihvYmplY3QpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBpZiAob2JqZWN0ICE9IG51bGwpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5hdGl2ZUtleXNJbjtcbiIsImltcG9ydCBpc09iamVjdCBmcm9tICcuL2lzT2JqZWN0LmpzJztcbmltcG9ydCBpc1Byb3RvdHlwZSBmcm9tICcuL19pc1Byb3RvdHlwZS5qcyc7XG5pbXBvcnQgbmF0aXZlS2V5c0luIGZyb20gJy4vX25hdGl2ZUtleXNJbi5qcyc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c0luYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VLZXlzSW4ob2JqZWN0KSB7XG4gIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgIHJldHVybiBuYXRpdmVLZXlzSW4ob2JqZWN0KTtcbiAgfVxuICB2YXIgaXNQcm90byA9IGlzUHJvdG90eXBlKG9iamVjdCksXG4gICAgICByZXN1bHQgPSBbXTtcblxuICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgaWYgKCEoa2V5ID09ICdjb25zdHJ1Y3RvcicgJiYgKGlzUHJvdG8gfHwgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VLZXlzSW47XG4iLCJpbXBvcnQgYXJyYXlMaWtlS2V5cyBmcm9tICcuL19hcnJheUxpa2VLZXlzLmpzJztcbmltcG9ydCBiYXNlS2V5c0luIGZyb20gJy4vX2Jhc2VLZXlzSW4uanMnO1xuaW1wb3J0IGlzQXJyYXlMaWtlIGZyb20gJy4vaXNBcnJheUxpa2UuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5rZXlzSW4obmV3IEZvbyk7XG4gKiAvLyA9PiBbJ2EnLCAnYicsICdjJ10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqL1xuZnVuY3Rpb24ga2V5c0luKG9iamVjdCkge1xuICByZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KSA/IGFycmF5TGlrZUtleXMob2JqZWN0LCB0cnVlKSA6IGJhc2VLZXlzSW4ob2JqZWN0KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQga2V5c0luO1xuIiwiaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi9pc0FycmF5LmpzJztcbmltcG9ydCBpc1N5bWJvbCBmcm9tICcuL2lzU3ltYm9sLmpzJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggcHJvcGVydHkgbmFtZXMgd2l0aGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlSXNEZWVwUHJvcCA9IC9cXC58XFxbKD86W15bXFxdXSp8KFtcIiddKSg/Oig/IVxcMSlbXlxcXFxdfFxcXFwuKSo/XFwxKVxcXS8sXG4gICAgcmVJc1BsYWluUHJvcCA9IC9eXFx3KiQvO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcHJvcGVydHkgbmFtZSBhbmQgbm90IGEgcHJvcGVydHkgcGF0aC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeSBrZXlzIG9uLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzS2V5KHZhbHVlLCBvYmplY3QpIHtcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICBpZiAodHlwZSA9PSAnbnVtYmVyJyB8fCB0eXBlID09ICdzeW1ib2wnIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nIHx8XG4gICAgICB2YWx1ZSA9PSBudWxsIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiByZUlzUGxhaW5Qcm9wLnRlc3QodmFsdWUpIHx8ICFyZUlzRGVlcFByb3AudGVzdCh2YWx1ZSkgfHxcbiAgICAob2JqZWN0ICE9IG51bGwgJiYgdmFsdWUgaW4gT2JqZWN0KG9iamVjdCkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0tleTtcbiIsImltcG9ydCBnZXROYXRpdmUgZnJvbSAnLi9fZ2V0TmF0aXZlLmpzJztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIG5hdGl2ZUNyZWF0ZSA9IGdldE5hdGl2ZShPYmplY3QsICdjcmVhdGUnKTtcblxuZXhwb3J0IGRlZmF1bHQgbmF0aXZlQ3JlYXRlO1xuIiwiaW1wb3J0IG5hdGl2ZUNyZWF0ZSBmcm9tICcuL19uYXRpdmVDcmVhdGUuanMnO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgSGFzaFxuICovXG5mdW5jdGlvbiBoYXNoQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBuYXRpdmVDcmVhdGUgPyBuYXRpdmVDcmVhdGUobnVsbCkgOiB7fTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaGFzaENsZWFyO1xuIiwiLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgaGFzaC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtPYmplY3R9IGhhc2ggVGhlIGhhc2ggdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc2hEZWxldGUoa2V5KSB7XG4gIHZhciByZXN1bHQgPSB0aGlzLmhhcyhrZXkpICYmIGRlbGV0ZSB0aGlzLl9fZGF0YV9fW2tleV07XG4gIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaGFzaERlbGV0ZTtcbiIsImltcG9ydCBuYXRpdmVDcmVhdGUgZnJvbSAnLi9fbmF0aXZlQ3JlYXRlLmpzJztcblxuLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEdldHMgdGhlIGhhc2ggdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gaGFzaEdldChrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICBpZiAobmF0aXZlQ3JlYXRlKSB7XG4gICAgdmFyIHJlc3VsdCA9IGRhdGFba2V5XTtcbiAgICByZXR1cm4gcmVzdWx0ID09PSBIQVNIX1VOREVGSU5FRCA/IHVuZGVmaW5lZCA6IHJlc3VsdDtcbiAgfVxuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpID8gZGF0YVtrZXldIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBoYXNoR2V0O1xuIiwiaW1wb3J0IG5hdGl2ZUNyZWF0ZSBmcm9tICcuL19uYXRpdmVDcmVhdGUuanMnO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGhhc2ggdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc2hIYXMoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgcmV0dXJuIG5hdGl2ZUNyZWF0ZSA/IChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCkgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGhhc2hIYXM7XG4iLCJpbXBvcnQgbmF0aXZlQ3JlYXRlIGZyb20gJy4vX25hdGl2ZUNyZWF0ZS5qcyc7XG5cbi8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbnZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuLyoqXG4gKiBTZXRzIHRoZSBoYXNoIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaGFzaCBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gaGFzaFNldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgdGhpcy5zaXplICs9IHRoaXMuaGFzKGtleSkgPyAwIDogMTtcbiAgZGF0YVtrZXldID0gKG5hdGl2ZUNyZWF0ZSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSA/IEhBU0hfVU5ERUZJTkVEIDogdmFsdWU7XG4gIHJldHVybiB0aGlzO1xufVxuXG5leHBvcnQgZGVmYXVsdCBoYXNoU2V0O1xuIiwiaW1wb3J0IGhhc2hDbGVhciBmcm9tICcuL19oYXNoQ2xlYXIuanMnO1xuaW1wb3J0IGhhc2hEZWxldGUgZnJvbSAnLi9faGFzaERlbGV0ZS5qcyc7XG5pbXBvcnQgaGFzaEdldCBmcm9tICcuL19oYXNoR2V0LmpzJztcbmltcG9ydCBoYXNoSGFzIGZyb20gJy4vX2hhc2hIYXMuanMnO1xuaW1wb3J0IGhhc2hTZXQgZnJvbSAnLi9faGFzaFNldC5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGhhc2ggb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBIYXNoKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYEhhc2hgLlxuSGFzaC5wcm90b3R5cGUuY2xlYXIgPSBoYXNoQ2xlYXI7XG5IYXNoLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBoYXNoRGVsZXRlO1xuSGFzaC5wcm90b3R5cGUuZ2V0ID0gaGFzaEdldDtcbkhhc2gucHJvdG90eXBlLmhhcyA9IGhhc2hIYXM7XG5IYXNoLnByb3RvdHlwZS5zZXQgPSBoYXNoU2V0O1xuXG5leHBvcnQgZGVmYXVsdCBIYXNoO1xuIiwiLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IFtdO1xuICB0aGlzLnNpemUgPSAwO1xufVxuXG5leHBvcnQgZGVmYXVsdCBsaXN0Q2FjaGVDbGVhcjtcbiIsImltcG9ydCBlcSBmcm9tICcuL2VxLmpzJztcblxuLyoqXG4gKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgYGtleWAgaXMgZm91bmQgaW4gYGFycmF5YCBvZiBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSBrZXkgVGhlIGtleSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYXNzb2NJbmRleE9mKGFycmF5LCBrZXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgaWYgKGVxKGFycmF5W2xlbmd0aF1bMF0sIGtleSkpIHtcbiAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXNzb2NJbmRleE9mO1xuIiwiaW1wb3J0IGFzc29jSW5kZXhPZiBmcm9tICcuL19hc3NvY0luZGV4T2YuanMnO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3BsaWNlID0gYXJyYXlQcm90by5zcGxpY2U7XG5cbi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBsYXN0SW5kZXggPSBkYXRhLmxlbmd0aCAtIDE7XG4gIGlmIChpbmRleCA9PSBsYXN0SW5kZXgpIHtcbiAgICBkYXRhLnBvcCgpO1xuICB9IGVsc2Uge1xuICAgIHNwbGljZS5jYWxsKGRhdGEsIGluZGV4LCAxKTtcbiAgfVxuICAtLXRoaXMuc2l6ZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGxpc3RDYWNoZURlbGV0ZTtcbiIsImltcG9ydCBhc3NvY0luZGV4T2YgZnJvbSAnLi9fYXNzb2NJbmRleE9mLmpzJztcblxuLyoqXG4gKiBHZXRzIHRoZSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiBkYXRhW2luZGV4XVsxXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbGlzdENhY2hlR2V0O1xuIiwiaW1wb3J0IGFzc29jSW5kZXhPZiBmcm9tICcuL19hc3NvY0luZGV4T2YuanMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlSGFzKGtleSkge1xuICByZXR1cm4gYXNzb2NJbmRleE9mKHRoaXMuX19kYXRhX18sIGtleSkgPiAtMTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbGlzdENhY2hlSGFzO1xuIiwiaW1wb3J0IGFzc29jSW5kZXhPZiBmcm9tICcuL19hc3NvY0luZGV4T2YuanMnO1xuXG4vKipcbiAqIFNldHMgdGhlIGxpc3QgY2FjaGUgYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGxpc3QgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZVNldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgaWYgKGluZGV4IDwgMCkge1xuICAgICsrdGhpcy5zaXplO1xuICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICB9IGVsc2Uge1xuICAgIGRhdGFbaW5kZXhdWzFdID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGxpc3RDYWNoZVNldDtcbiIsImltcG9ydCBsaXN0Q2FjaGVDbGVhciBmcm9tICcuL19saXN0Q2FjaGVDbGVhci5qcyc7XG5pbXBvcnQgbGlzdENhY2hlRGVsZXRlIGZyb20gJy4vX2xpc3RDYWNoZURlbGV0ZS5qcyc7XG5pbXBvcnQgbGlzdENhY2hlR2V0IGZyb20gJy4vX2xpc3RDYWNoZUdldC5qcyc7XG5pbXBvcnQgbGlzdENhY2hlSGFzIGZyb20gJy4vX2xpc3RDYWNoZUhhcy5qcyc7XG5pbXBvcnQgbGlzdENhY2hlU2V0IGZyb20gJy4vX2xpc3RDYWNoZVNldC5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBsaXN0IGNhY2hlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYExpc3RDYWNoZWAuXG5MaXN0Q2FjaGUucHJvdG90eXBlLmNsZWFyID0gbGlzdENhY2hlQ2xlYXI7XG5MaXN0Q2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IGxpc3RDYWNoZURlbGV0ZTtcbkxpc3RDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbGlzdENhY2hlR2V0O1xuTGlzdENhY2hlLnByb3RvdHlwZS5oYXMgPSBsaXN0Q2FjaGVIYXM7XG5MaXN0Q2FjaGUucHJvdG90eXBlLnNldCA9IGxpc3RDYWNoZVNldDtcblxuZXhwb3J0IGRlZmF1bHQgTGlzdENhY2hlO1xuIiwiaW1wb3J0IGdldE5hdGl2ZSBmcm9tICcuL19nZXROYXRpdmUuanMnO1xuaW1wb3J0IHJvb3QgZnJvbSAnLi9fcm9vdC5qcyc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBNYXAgPSBnZXROYXRpdmUocm9vdCwgJ01hcCcpO1xuXG5leHBvcnQgZGVmYXVsdCBNYXA7XG4iLCJpbXBvcnQgSGFzaCBmcm9tICcuL19IYXNoLmpzJztcbmltcG9ydCBMaXN0Q2FjaGUgZnJvbSAnLi9fTGlzdENhY2hlLmpzJztcbmltcG9ydCBNYXAgZnJvbSAnLi9fTWFwLmpzJztcblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBtYXAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVDbGVhcigpIHtcbiAgdGhpcy5zaXplID0gMDtcbiAgdGhpcy5fX2RhdGFfXyA9IHtcbiAgICAnaGFzaCc6IG5ldyBIYXNoLFxuICAgICdtYXAnOiBuZXcgKE1hcCB8fCBMaXN0Q2FjaGUpLFxuICAgICdzdHJpbmcnOiBuZXcgSGFzaFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBtYXBDYWNoZUNsZWFyO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIHVuaXF1ZSBvYmplY3Qga2V5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICh0eXBlID09ICdzdHJpbmcnIHx8IHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJylcbiAgICA/ICh2YWx1ZSAhPT0gJ19fcHJvdG9fXycpXG4gICAgOiAodmFsdWUgPT09IG51bGwpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0tleWFibGU7XG4iLCJpbXBvcnQgaXNLZXlhYmxlIGZyb20gJy4vX2lzS2V5YWJsZS5qcyc7XG5cbi8qKlxuICogR2V0cyB0aGUgZGF0YSBmb3IgYG1hcGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIHJlZmVyZW5jZSBrZXkuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWFwIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIGdldE1hcERhdGEobWFwLCBrZXkpIHtcbiAgdmFyIGRhdGEgPSBtYXAuX19kYXRhX187XG4gIHJldHVybiBpc0tleWFibGUoa2V5KVxuICAgID8gZGF0YVt0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8gJ3N0cmluZycgOiAnaGFzaCddXG4gICAgOiBkYXRhLm1hcDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0TWFwRGF0YTtcbiIsImltcG9ydCBnZXRNYXBEYXRhIGZyb20gJy4vX2dldE1hcERhdGEuanMnO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBtYXAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciByZXN1bHQgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSlbJ2RlbGV0ZSddKGtleSk7XG4gIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWFwQ2FjaGVEZWxldGU7XG4iLCJpbXBvcnQgZ2V0TWFwRGF0YSBmcm9tICcuL19nZXRNYXBEYXRhLmpzJztcblxuLyoqXG4gKiBHZXRzIHRoZSBtYXAgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlR2V0KGtleSkge1xuICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmdldChrZXkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtYXBDYWNoZUdldDtcbiIsImltcG9ydCBnZXRNYXBEYXRhIGZyb20gJy4vX2dldE1hcERhdGEuanMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIG1hcCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlSGFzKGtleSkge1xuICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmhhcyhrZXkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtYXBDYWNoZUhhcztcbiIsImltcG9ydCBnZXRNYXBEYXRhIGZyb20gJy4vX2dldE1hcERhdGEuanMnO1xuXG4vKipcbiAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBtYXAgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSksXG4gICAgICBzaXplID0gZGF0YS5zaXplO1xuXG4gIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICB0aGlzLnNpemUgKz0gZGF0YS5zaXplID09IHNpemUgPyAwIDogMTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG1hcENhY2hlU2V0O1xuIiwiaW1wb3J0IG1hcENhY2hlQ2xlYXIgZnJvbSAnLi9fbWFwQ2FjaGVDbGVhci5qcyc7XG5pbXBvcnQgbWFwQ2FjaGVEZWxldGUgZnJvbSAnLi9fbWFwQ2FjaGVEZWxldGUuanMnO1xuaW1wb3J0IG1hcENhY2hlR2V0IGZyb20gJy4vX21hcENhY2hlR2V0LmpzJztcbmltcG9ydCBtYXBDYWNoZUhhcyBmcm9tICcuL19tYXBDYWNoZUhhcy5qcyc7XG5pbXBvcnQgbWFwQ2FjaGVTZXQgZnJvbSAnLi9fbWFwQ2FjaGVTZXQuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXAgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gTWFwQ2FjaGUoZW50cmllcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgTWFwQ2FjaGVgLlxuTWFwQ2FjaGUucHJvdG90eXBlLmNsZWFyID0gbWFwQ2FjaGVDbGVhcjtcbk1hcENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBtYXBDYWNoZURlbGV0ZTtcbk1hcENhY2hlLnByb3RvdHlwZS5nZXQgPSBtYXBDYWNoZUdldDtcbk1hcENhY2hlLnByb3RvdHlwZS5oYXMgPSBtYXBDYWNoZUhhcztcbk1hcENhY2hlLnByb3RvdHlwZS5zZXQgPSBtYXBDYWNoZVNldDtcblxuZXhwb3J0IGRlZmF1bHQgTWFwQ2FjaGU7XG4iLCJpbXBvcnQgTWFwQ2FjaGUgZnJvbSAnLi9fTWFwQ2FjaGUuanMnO1xuXG4vKiogRXJyb3IgbWVzc2FnZSBjb25zdGFudHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IG1lbW9pemVzIHRoZSByZXN1bHQgb2YgYGZ1bmNgLiBJZiBgcmVzb2x2ZXJgIGlzXG4gKiBwcm92aWRlZCwgaXQgZGV0ZXJtaW5lcyB0aGUgY2FjaGUga2V5IGZvciBzdG9yaW5nIHRoZSByZXN1bHQgYmFzZWQgb24gdGhlXG4gKiBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uLiBCeSBkZWZhdWx0LCB0aGUgZmlyc3QgYXJndW1lbnRcbiAqIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbiBpcyB1c2VkIGFzIHRoZSBtYXAgY2FjaGUga2V5LiBUaGUgYGZ1bmNgXG4gKiBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBtZW1vaXplZCBmdW5jdGlvbi5cbiAqXG4gKiAqKk5vdGU6KiogVGhlIGNhY2hlIGlzIGV4cG9zZWQgYXMgdGhlIGBjYWNoZWAgcHJvcGVydHkgb24gdGhlIG1lbW9pemVkXG4gKiBmdW5jdGlvbi4gSXRzIGNyZWF0aW9uIG1heSBiZSBjdXN0b21pemVkIGJ5IHJlcGxhY2luZyB0aGUgYF8ubWVtb2l6ZS5DYWNoZWBcbiAqIGNvbnN0cnVjdG9yIHdpdGggb25lIHdob3NlIGluc3RhbmNlcyBpbXBsZW1lbnQgdGhlXG4gKiBbYE1hcGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXByb3BlcnRpZXMtb2YtdGhlLW1hcC1wcm90b3R5cGUtb2JqZWN0KVxuICogbWV0aG9kIGludGVyZmFjZSBvZiBgY2xlYXJgLCBgZGVsZXRlYCwgYGdldGAsIGBoYXNgLCBhbmQgYHNldGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmVzb2x2ZXJdIFRoZSBmdW5jdGlvbiB0byByZXNvbHZlIHRoZSBjYWNoZSBrZXkuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTtcbiAqIHZhciBvdGhlciA9IHsgJ2MnOiAzLCAnZCc6IDQgfTtcbiAqXG4gKiB2YXIgdmFsdWVzID0gXy5tZW1vaXplKF8udmFsdWVzKTtcbiAqIHZhbHVlcyhvYmplY3QpO1xuICogLy8gPT4gWzEsIDJdXG4gKlxuICogdmFsdWVzKG90aGVyKTtcbiAqIC8vID0+IFszLCA0XVxuICpcbiAqIG9iamVjdC5hID0gMjtcbiAqIHZhbHVlcyhvYmplY3QpO1xuICogLy8gPT4gWzEsIDJdXG4gKlxuICogLy8gTW9kaWZ5IHRoZSByZXN1bHQgY2FjaGUuXG4gKiB2YWx1ZXMuY2FjaGUuc2V0KG9iamVjdCwgWydhJywgJ2InXSk7XG4gKiB2YWx1ZXMob2JqZWN0KTtcbiAqIC8vID0+IFsnYScsICdiJ11cbiAqXG4gKiAvLyBSZXBsYWNlIGBfLm1lbW9pemUuQ2FjaGVgLlxuICogXy5tZW1vaXplLkNhY2hlID0gV2Vha01hcDtcbiAqL1xuZnVuY3Rpb24gbWVtb2l6ZShmdW5jLCByZXNvbHZlcikge1xuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJyB8fCAocmVzb2x2ZXIgIT0gbnVsbCAmJiB0eXBlb2YgcmVzb2x2ZXIgIT0gJ2Z1bmN0aW9uJykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gIH1cbiAgdmFyIG1lbW9pemVkID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgIGtleSA9IHJlc29sdmVyID8gcmVzb2x2ZXIuYXBwbHkodGhpcywgYXJncykgOiBhcmdzWzBdLFxuICAgICAgICBjYWNoZSA9IG1lbW9pemVkLmNhY2hlO1xuXG4gICAgaWYgKGNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSk7XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIG1lbW9pemVkLmNhY2hlID0gY2FjaGUuc2V0KGtleSwgcmVzdWx0KSB8fCBjYWNoZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBtZW1vaXplZC5jYWNoZSA9IG5ldyAobWVtb2l6ZS5DYWNoZSB8fCBNYXBDYWNoZSk7XG4gIHJldHVybiBtZW1vaXplZDtcbn1cblxuLy8gRXhwb3NlIGBNYXBDYWNoZWAuXG5tZW1vaXplLkNhY2hlID0gTWFwQ2FjaGU7XG5cbmV4cG9ydCBkZWZhdWx0IG1lbW9pemU7XG4iLCJpbXBvcnQgbWVtb2l6ZSBmcm9tICcuL21lbW9pemUuanMnO1xuXG4vKiogVXNlZCBhcyB0aGUgbWF4aW11bSBtZW1vaXplIGNhY2hlIHNpemUuICovXG52YXIgTUFYX01FTU9JWkVfU0laRSA9IDUwMDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWVtb2l6ZWAgd2hpY2ggY2xlYXJzIHRoZSBtZW1vaXplZCBmdW5jdGlvbidzXG4gKiBjYWNoZSB3aGVuIGl0IGV4Y2VlZHMgYE1BWF9NRU1PSVpFX1NJWkVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWVtb2l6ZUNhcHBlZChmdW5jKSB7XG4gIHZhciByZXN1bHQgPSBtZW1vaXplKGZ1bmMsIGZ1bmN0aW9uKGtleSkge1xuICAgIGlmIChjYWNoZS5zaXplID09PSBNQVhfTUVNT0laRV9TSVpFKSB7XG4gICAgICBjYWNoZS5jbGVhcigpO1xuICAgIH1cbiAgICByZXR1cm4ga2V5O1xuICB9KTtcblxuICB2YXIgY2FjaGUgPSByZXN1bHQuY2FjaGU7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG1lbW9pemVDYXBwZWQ7XG4iLCJpbXBvcnQgbWVtb2l6ZUNhcHBlZCBmcm9tICcuL19tZW1vaXplQ2FwcGVkLmpzJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggcHJvcGVydHkgbmFtZXMgd2l0aGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlUHJvcE5hbWUgPSAvW14uW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JCkpL2c7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGJhY2tzbGFzaGVzIGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlRXNjYXBlQ2hhciA9IC9cXFxcKFxcXFwpPy9nO1xuXG4vKipcbiAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gKi9cbnZhciBzdHJpbmdUb1BhdGggPSBtZW1vaXplQ2FwcGVkKGZ1bmN0aW9uKHN0cmluZykge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGlmIChzdHJpbmcuY2hhckNvZGVBdCgwKSA9PT0gNDYgLyogLiAqLykge1xuICAgIHJlc3VsdC5wdXNoKCcnKTtcbiAgfVxuICBzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLCBmdW5jdGlvbihtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3ViU3RyaW5nKSB7XG4gICAgcmVzdWx0LnB1c2gocXVvdGUgPyBzdWJTdHJpbmcucmVwbGFjZShyZUVzY2FwZUNoYXIsICckMScpIDogKG51bWJlciB8fCBtYXRjaCkpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBzdHJpbmdUb1BhdGg7XG4iLCJpbXBvcnQgYmFzZVRvU3RyaW5nIGZyb20gJy4vX2Jhc2VUb1N0cmluZy5qcyc7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZy4gQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGZvciBgbnVsbGBcbiAqIGFuZCBgdW5kZWZpbmVkYCB2YWx1ZXMuIFRoZSBzaWduIG9mIGAtMGAgaXMgcHJlc2VydmVkLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b1N0cmluZyhudWxsKTtcbiAqIC8vID0+ICcnXG4gKlxuICogXy50b1N0cmluZygtMCk7XG4gKiAvLyA9PiAnLTAnXG4gKlxuICogXy50b1N0cmluZyhbMSwgMiwgM10pO1xuICogLy8gPT4gJzEsMiwzJ1xuICovXG5mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogYmFzZVRvU3RyaW5nKHZhbHVlKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdG9TdHJpbmc7XG4iLCJpbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuaW1wb3J0IGlzS2V5IGZyb20gJy4vX2lzS2V5LmpzJztcbmltcG9ydCBzdHJpbmdUb1BhdGggZnJvbSAnLi9fc3RyaW5nVG9QYXRoLmpzJztcbmltcG9ydCB0b1N0cmluZyBmcm9tICcuL3RvU3RyaW5nLmpzJztcblxuLyoqXG4gKiBDYXN0cyBgdmFsdWVgIHRvIGEgcGF0aCBhcnJheSBpZiBpdCdzIG5vdCBvbmUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeSBrZXlzIG9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHByb3BlcnR5IHBhdGggYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGNhc3RQYXRoKHZhbHVlLCBvYmplY3QpIHtcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiBpc0tleSh2YWx1ZSwgb2JqZWN0KSA/IFt2YWx1ZV0gOiBzdHJpbmdUb1BhdGgodG9TdHJpbmcodmFsdWUpKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2FzdFBhdGg7XG4iLCJpbXBvcnQgaXNTeW1ib2wgZnJvbSAnLi9pc1N5bWJvbC5qcyc7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDA7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyBrZXkgaWYgaXQncyBub3QgYSBzdHJpbmcgb3Igc3ltYm9sLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICogQHJldHVybnMge3N0cmluZ3xzeW1ib2x9IFJldHVybnMgdGhlIGtleS5cbiAqL1xuZnVuY3Rpb24gdG9LZXkodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCBpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgdmFyIHJlc3VsdCA9ICh2YWx1ZSArICcnKTtcbiAgcmV0dXJuIChyZXN1bHQgPT0gJzAnICYmICgxIC8gdmFsdWUpID09IC1JTkZJTklUWSkgPyAnLTAnIDogcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCB0b0tleTtcbiIsImltcG9ydCBjYXN0UGF0aCBmcm9tICcuL19jYXN0UGF0aC5qcyc7XG5pbXBvcnQgdG9LZXkgZnJvbSAnLi9fdG9LZXkuanMnO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmdldGAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWZhdWx0IHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldChvYmplY3QsIHBhdGgpIHtcbiAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgdmFyIGluZGV4ID0gMCxcbiAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoO1xuXG4gIHdoaWxlIChvYmplY3QgIT0gbnVsbCAmJiBpbmRleCA8IGxlbmd0aCkge1xuICAgIG9iamVjdCA9IG9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07XG4gIH1cbiAgcmV0dXJuIChpbmRleCAmJiBpbmRleCA9PSBsZW5ndGgpID8gb2JqZWN0IDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlR2V0O1xuIiwiaW1wb3J0IGJhc2VHZXQgZnJvbSAnLi9fYmFzZUdldC5qcyc7XG5cbi8qKlxuICogR2V0cyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGBvYmplY3RgLiBJZiB0aGUgcmVzb2x2ZWQgdmFsdWUgaXNcbiAqIGB1bmRlZmluZWRgLCB0aGUgYGRlZmF1bHRWYWx1ZWAgaXMgcmV0dXJuZWQgaW4gaXRzIHBsYWNlLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy43LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdIFRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgYHVuZGVmaW5lZGAgcmVzb2x2ZWQgdmFsdWVzLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9XSB9O1xuICpcbiAqIF8uZ2V0KG9iamVjdCwgJ2FbMF0uYi5jJyk7XG4gKiAvLyA9PiAzXG4gKlxuICogXy5nZXQob2JqZWN0LCBbJ2EnLCAnMCcsICdiJywgJ2MnXSk7XG4gKiAvLyA9PiAzXG4gKlxuICogXy5nZXQob2JqZWN0LCAnYS5iLmMnLCAnZGVmYXVsdCcpO1xuICogLy8gPT4gJ2RlZmF1bHQnXG4gKi9cbmZ1bmN0aW9uIGdldChvYmplY3QsIHBhdGgsIGRlZmF1bHRWYWx1ZSkge1xuICB2YXIgcmVzdWx0ID0gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gIHJldHVybiByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWx1ZSA6IHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0O1xuIiwiLyoqXG4gKiBBcHBlbmRzIHRoZSBlbGVtZW50cyBvZiBgdmFsdWVzYCB0byBgYXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gYXBwZW5kLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5UHVzaChhcnJheSwgdmFsdWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgIG9mZnNldCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGFycmF5W29mZnNldCArIGluZGV4XSA9IHZhbHVlc1tpbmRleF07XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5leHBvcnQgZGVmYXVsdCBhcnJheVB1c2g7XG4iLCJpbXBvcnQgb3ZlckFyZyBmcm9tICcuL19vdmVyQXJnLmpzJztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgZ2V0UHJvdG90eXBlID0gb3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsIE9iamVjdCk7XG5cbmV4cG9ydCBkZWZhdWx0IGdldFByb3RvdHlwZTtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2xpY2VgIHdpdGhvdXQgYW4gaXRlcmF0ZWUgY2FsbCBndWFyZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNsaWNlLlxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgPSAtc3RhcnQgPiBsZW5ndGggPyAwIDogKGxlbmd0aCArIHN0YXJ0KTtcbiAgfVxuICBlbmQgPSBlbmQgPiBsZW5ndGggPyBsZW5ndGggOiBlbmQ7XG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlbmd0aDtcbiAgfVxuICBsZW5ndGggPSBzdGFydCA+IGVuZCA/IDAgOiAoKGVuZCAtIHN0YXJ0KSA+Pj4gMCk7XG4gIHN0YXJ0ID4+Pj0gMDtcblxuICB2YXIgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHRbaW5kZXhdID0gYXJyYXlbaW5kZXggKyBzdGFydF07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZVNsaWNlO1xuIiwiaW1wb3J0IExpc3RDYWNoZSBmcm9tICcuL19MaXN0Q2FjaGUuanMnO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIHN0YWNrLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIFN0YWNrXG4gKi9cbmZ1bmN0aW9uIHN0YWNrQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBuZXcgTGlzdENhY2hlO1xuICB0aGlzLnNpemUgPSAwO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzdGFja0NsZWFyO1xuIiwiLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgc3RhY2suXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gc3RhY2tEZWxldGUoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIHJlc3VsdCA9IGRhdGFbJ2RlbGV0ZSddKGtleSk7XG5cbiAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBzdGFja0RlbGV0ZTtcbiIsIi8qKlxuICogR2V0cyB0aGUgc3RhY2sgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrR2V0KGtleSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQoa2V5KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3RhY2tHZXQ7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBhIHN0YWNrIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gc3RhY2tIYXMoa2V5KSB7XG4gIHJldHVybiB0aGlzLl9fZGF0YV9fLmhhcyhrZXkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzdGFja0hhcztcbiIsImltcG9ydCBMaXN0Q2FjaGUgZnJvbSAnLi9fTGlzdENhY2hlLmpzJztcbmltcG9ydCBNYXAgZnJvbSAnLi9fTWFwLmpzJztcbmltcG9ydCBNYXBDYWNoZSBmcm9tICcuL19NYXBDYWNoZS5qcyc7XG5cbi8qKiBVc2VkIGFzIHRoZSBzaXplIHRvIGVuYWJsZSBsYXJnZSBhcnJheSBvcHRpbWl6YXRpb25zLiAqL1xudmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbi8qKlxuICogU2V0cyB0aGUgc3RhY2sgYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgc3RhY2sgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICBpZiAoZGF0YSBpbnN0YW5jZW9mIExpc3RDYWNoZSkge1xuICAgIHZhciBwYWlycyA9IGRhdGEuX19kYXRhX187XG4gICAgaWYgKCFNYXAgfHwgKHBhaXJzLmxlbmd0aCA8IExBUkdFX0FSUkFZX1NJWkUgLSAxKSkge1xuICAgICAgcGFpcnMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgdGhpcy5zaXplID0gKytkYXRhLnNpemU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGF0YSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGUocGFpcnMpO1xuICB9XG4gIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gIHJldHVybiB0aGlzO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzdGFja1NldDtcbiIsImltcG9ydCBMaXN0Q2FjaGUgZnJvbSAnLi9fTGlzdENhY2hlLmpzJztcbmltcG9ydCBzdGFja0NsZWFyIGZyb20gJy4vX3N0YWNrQ2xlYXIuanMnO1xuaW1wb3J0IHN0YWNrRGVsZXRlIGZyb20gJy4vX3N0YWNrRGVsZXRlLmpzJztcbmltcG9ydCBzdGFja0dldCBmcm9tICcuL19zdGFja0dldC5qcyc7XG5pbXBvcnQgc3RhY2tIYXMgZnJvbSAnLi9fc3RhY2tIYXMuanMnO1xuaW1wb3J0IHN0YWNrU2V0IGZyb20gJy4vX3N0YWNrU2V0LmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RhY2sgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gU3RhY2soZW50cmllcykge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTGlzdENhY2hlKGVudHJpZXMpO1xuICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBTdGFja2AuXG5TdGFjay5wcm90b3R5cGUuY2xlYXIgPSBzdGFja0NsZWFyO1xuU3RhY2sucHJvdG90eXBlWydkZWxldGUnXSA9IHN0YWNrRGVsZXRlO1xuU3RhY2sucHJvdG90eXBlLmdldCA9IHN0YWNrR2V0O1xuU3RhY2sucHJvdG90eXBlLmhhcyA9IHN0YWNrSGFzO1xuU3RhY2sucHJvdG90eXBlLnNldCA9IHN0YWNrU2V0O1xuXG5leHBvcnQgZGVmYXVsdCBTdGFjaztcbiIsImltcG9ydCBjb3B5T2JqZWN0IGZyb20gJy4vX2NvcHlPYmplY3QuanMnO1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzLmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hc3NpZ25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlc1xuICogb3IgYGN1c3RvbWl6ZXJgIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VBc3NpZ24ob2JqZWN0LCBzb3VyY2UpIHtcbiAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5cyhzb3VyY2UpLCBvYmplY3QpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlQXNzaWduO1xuIiwiaW1wb3J0IGNvcHlPYmplY3QgZnJvbSAnLi9fY29weU9iamVjdC5qcyc7XG5pbXBvcnQga2V5c0luIGZyb20gJy4va2V5c0luLmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hc3NpZ25JbmAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzXG4gKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gYmFzZUFzc2lnbkluKG9iamVjdCwgc291cmNlKSB7XG4gIHJldHVybiBvYmplY3QgJiYgY29weU9iamVjdChzb3VyY2UsIGtleXNJbihzb3VyY2UpLCBvYmplY3QpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlQXNzaWduSW47XG4iLCJpbXBvcnQgcm9vdCBmcm9tICcuL19yb290LmpzJztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbnZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xudmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbnZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBCdWZmZXIgPSBtb2R1bGVFeHBvcnRzID8gcm9vdC5CdWZmZXIgOiB1bmRlZmluZWQsXG4gICAgYWxsb2NVbnNhZmUgPSBCdWZmZXIgPyBCdWZmZXIuYWxsb2NVbnNhZmUgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mICBgYnVmZmVyYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtCdWZmZXJ9IGJ1ZmZlciBUaGUgYnVmZmVyIHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBidWZmZXIuXG4gKi9cbmZ1bmN0aW9uIGNsb25lQnVmZmVyKGJ1ZmZlciwgaXNEZWVwKSB7XG4gIGlmIChpc0RlZXApIHtcbiAgICByZXR1cm4gYnVmZmVyLnNsaWNlKCk7XG4gIH1cbiAgdmFyIGxlbmd0aCA9IGJ1ZmZlci5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBhbGxvY1Vuc2FmZSA/IGFsbG9jVW5zYWZlKGxlbmd0aCkgOiBuZXcgYnVmZmVyLmNvbnN0cnVjdG9yKGxlbmd0aCk7XG5cbiAgYnVmZmVyLmNvcHkocmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xvbmVCdWZmZXI7XG4iLCIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5maWx0ZXJgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlGaWx0ZXIoYXJyYXksIHByZWRpY2F0ZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgcmVzdWx0ID0gW107XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFycmF5RmlsdGVyO1xuIiwiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGVtcHR5IGFycmF5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMy4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZW1wdHkgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBhcnJheXMgPSBfLnRpbWVzKDIsIF8uc3R1YkFycmF5KTtcbiAqXG4gKiBjb25zb2xlLmxvZyhhcnJheXMpO1xuICogLy8gPT4gW1tdLCBbXV1cbiAqXG4gKiBjb25zb2xlLmxvZyhhcnJheXNbMF0gPT09IGFycmF5c1sxXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBzdHViQXJyYXkoKSB7XG4gIHJldHVybiBbXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3R1YkFycmF5O1xuIiwiaW1wb3J0IGFycmF5RmlsdGVyIGZyb20gJy4vX2FycmF5RmlsdGVyLmpzJztcbmltcG9ydCBzdHViQXJyYXkgZnJvbSAnLi9zdHViQXJyYXkuanMnO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlR2V0U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICovXG52YXIgZ2V0U3ltYm9scyA9ICFuYXRpdmVHZXRTeW1ib2xzID8gc3R1YkFycmF5IDogZnVuY3Rpb24ob2JqZWN0KSB7XG4gIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgcmV0dXJuIGFycmF5RmlsdGVyKG5hdGl2ZUdldFN5bWJvbHMob2JqZWN0KSwgZnVuY3Rpb24oc3ltYm9sKSB7XG4gICAgcmV0dXJuIHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqZWN0LCBzeW1ib2wpO1xuICB9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGdldFN5bWJvbHM7XG4iLCJpbXBvcnQgY29weU9iamVjdCBmcm9tICcuL19jb3B5T2JqZWN0LmpzJztcbmltcG9ydCBnZXRTeW1ib2xzIGZyb20gJy4vX2dldFN5bWJvbHMuanMnO1xuXG4vKipcbiAqIENvcGllcyBvd24gc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gY29weVN5bWJvbHMoc291cmNlLCBvYmplY3QpIHtcbiAgcmV0dXJuIGNvcHlPYmplY3Qoc291cmNlLCBnZXRTeW1ib2xzKHNvdXJjZSksIG9iamVjdCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNvcHlTeW1ib2xzO1xuIiwiaW1wb3J0IGFycmF5UHVzaCBmcm9tICcuL19hcnJheVB1c2guanMnO1xuaW1wb3J0IGdldFByb3RvdHlwZSBmcm9tICcuL19nZXRQcm90b3R5cGUuanMnO1xuaW1wb3J0IGdldFN5bWJvbHMgZnJvbSAnLi9fZ2V0U3ltYm9scy5qcyc7XG5pbXBvcnQgc3R1YkFycmF5IGZyb20gJy4vc3R1YkFycmF5LmpzJztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUdldFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICovXG52YXIgZ2V0U3ltYm9sc0luID0gIW5hdGl2ZUdldFN5bWJvbHMgPyBzdHViQXJyYXkgOiBmdW5jdGlvbihvYmplY3QpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB3aGlsZSAob2JqZWN0KSB7XG4gICAgYXJyYXlQdXNoKHJlc3VsdCwgZ2V0U3ltYm9scyhvYmplY3QpKTtcbiAgICBvYmplY3QgPSBnZXRQcm90b3R5cGUob2JqZWN0KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZ2V0U3ltYm9sc0luO1xuIiwiaW1wb3J0IGNvcHlPYmplY3QgZnJvbSAnLi9fY29weU9iamVjdC5qcyc7XG5pbXBvcnQgZ2V0U3ltYm9sc0luIGZyb20gJy4vX2dldFN5bWJvbHNJbi5qcyc7XG5cbi8qKlxuICogQ29waWVzIG93biBhbmQgaW5oZXJpdGVkIHN5bWJvbHMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHN5bWJvbHMgZnJvbS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGNvcHlTeW1ib2xzSW4oc291cmNlLCBvYmplY3QpIHtcbiAgcmV0dXJuIGNvcHlPYmplY3Qoc291cmNlLCBnZXRTeW1ib2xzSW4oc291cmNlKSwgb2JqZWN0KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY29weVN5bWJvbHNJbjtcbiIsImltcG9ydCBhcnJheVB1c2ggZnJvbSAnLi9fYXJyYXlQdXNoLmpzJztcbmltcG9ydCBpc0FycmF5IGZyb20gJy4vaXNBcnJheS5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldEFsbEtleXNgIGFuZCBgZ2V0QWxsS2V5c0luYCB3aGljaCB1c2VzXG4gKiBga2V5c0Z1bmNgIGFuZCBgc3ltYm9sc0Z1bmNgIHRvIGdldCB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBhbmRcbiAqIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzeW1ib2xzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzRnVuYywgc3ltYm9sc0Z1bmMpIHtcbiAgdmFyIHJlc3VsdCA9IGtleXNGdW5jKG9iamVjdCk7XG4gIHJldHVybiBpc0FycmF5KG9iamVjdCkgPyByZXN1bHQgOiBhcnJheVB1c2gocmVzdWx0LCBzeW1ib2xzRnVuYyhvYmplY3QpKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUdldEFsbEtleXM7XG4iLCJpbXBvcnQgYmFzZUdldEFsbEtleXMgZnJvbSAnLi9fYmFzZUdldEFsbEtleXMuanMnO1xuaW1wb3J0IGdldFN5bWJvbHMgZnJvbSAnLi9fZ2V0U3ltYm9scy5qcyc7XG5pbXBvcnQga2V5cyBmcm9tICcuL2tleXMuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gKi9cbmZ1bmN0aW9uIGdldEFsbEtleXMob2JqZWN0KSB7XG4gIHJldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXMsIGdldFN5bWJvbHMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBnZXRBbGxLZXlzO1xuIiwiaW1wb3J0IGJhc2VHZXRBbGxLZXlzIGZyb20gJy4vX2Jhc2VHZXRBbGxLZXlzLmpzJztcbmltcG9ydCBnZXRTeW1ib2xzSW4gZnJvbSAnLi9fZ2V0U3ltYm9sc0luLmpzJztcbmltcG9ydCBrZXlzSW4gZnJvbSAnLi9rZXlzSW4uanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBhbmRcbiAqIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gKi9cbmZ1bmN0aW9uIGdldEFsbEtleXNJbihvYmplY3QpIHtcbiAgcmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0luLCBnZXRTeW1ib2xzSW4pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBnZXRBbGxLZXlzSW47XG4iLCJpbXBvcnQgZ2V0TmF0aXZlIGZyb20gJy4vX2dldE5hdGl2ZS5qcyc7XG5pbXBvcnQgcm9vdCBmcm9tICcuL19yb290LmpzJztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIERhdGFWaWV3ID0gZ2V0TmF0aXZlKHJvb3QsICdEYXRhVmlldycpO1xuXG5leHBvcnQgZGVmYXVsdCBEYXRhVmlldztcbiIsImltcG9ydCBnZXROYXRpdmUgZnJvbSAnLi9fZ2V0TmF0aXZlLmpzJztcbmltcG9ydCByb290IGZyb20gJy4vX3Jvb3QuanMnO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgUHJvbWlzZSA9IGdldE5hdGl2ZShyb290LCAnUHJvbWlzZScpO1xuXG5leHBvcnQgZGVmYXVsdCBQcm9taXNlO1xuIiwiaW1wb3J0IGdldE5hdGl2ZSBmcm9tICcuL19nZXROYXRpdmUuanMnO1xuaW1wb3J0IHJvb3QgZnJvbSAnLi9fcm9vdC5qcyc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBTZXQgPSBnZXROYXRpdmUocm9vdCwgJ1NldCcpO1xuXG5leHBvcnQgZGVmYXVsdCBTZXQ7XG4iLCJpbXBvcnQgRGF0YVZpZXcgZnJvbSAnLi9fRGF0YVZpZXcuanMnO1xuaW1wb3J0IE1hcCBmcm9tICcuL19NYXAuanMnO1xuaW1wb3J0IFByb21pc2UgZnJvbSAnLi9fUHJvbWlzZS5qcyc7XG5pbXBvcnQgU2V0IGZyb20gJy4vX1NldC5qcyc7XG5pbXBvcnQgV2Vha01hcCBmcm9tICcuL19XZWFrTWFwLmpzJztcbmltcG9ydCBiYXNlR2V0VGFnIGZyb20gJy4vX2Jhc2VHZXRUYWcuanMnO1xuaW1wb3J0IHRvU291cmNlIGZyb20gJy4vX3RvU291cmNlLmpzJztcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgIHByb21pc2VUYWcgPSAnW29iamVjdCBQcm9taXNlXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJztcblxudmFyIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG1hcHMsIHNldHMsIGFuZCB3ZWFrbWFwcy4gKi9cbnZhciBkYXRhVmlld0N0b3JTdHJpbmcgPSB0b1NvdXJjZShEYXRhVmlldyksXG4gICAgbWFwQ3RvclN0cmluZyA9IHRvU291cmNlKE1hcCksXG4gICAgcHJvbWlzZUN0b3JTdHJpbmcgPSB0b1NvdXJjZShQcm9taXNlKSxcbiAgICBzZXRDdG9yU3RyaW5nID0gdG9Tb3VyY2UoU2V0KSxcbiAgICB3ZWFrTWFwQ3RvclN0cmluZyA9IHRvU291cmNlKFdlYWtNYXApO1xuXG4vKipcbiAqIEdldHMgdGhlIGB0b1N0cmluZ1RhZ2Agb2YgYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICovXG52YXIgZ2V0VGFnID0gYmFzZUdldFRhZztcblxuLy8gRmFsbGJhY2sgZm9yIGRhdGEgdmlld3MsIG1hcHMsIHNldHMsIGFuZCB3ZWFrIG1hcHMgaW4gSUUgMTEgYW5kIHByb21pc2VzIGluIE5vZGUuanMgPCA2LlxuaWYgKChEYXRhVmlldyAmJiBnZXRUYWcobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxKSkpICE9IGRhdGFWaWV3VGFnKSB8fFxuICAgIChNYXAgJiYgZ2V0VGFnKG5ldyBNYXApICE9IG1hcFRhZykgfHxcbiAgICAoUHJvbWlzZSAmJiBnZXRUYWcoUHJvbWlzZS5yZXNvbHZlKCkpICE9IHByb21pc2VUYWcpIHx8XG4gICAgKFNldCAmJiBnZXRUYWcobmV3IFNldCkgIT0gc2V0VGFnKSB8fFxuICAgIChXZWFrTWFwICYmIGdldFRhZyhuZXcgV2Vha01hcCkgIT0gd2Vha01hcFRhZykpIHtcbiAgZ2V0VGFnID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgcmVzdWx0ID0gYmFzZUdldFRhZyh2YWx1ZSksXG4gICAgICAgIEN0b3IgPSByZXN1bHQgPT0gb2JqZWN0VGFnID8gdmFsdWUuY29uc3RydWN0b3IgOiB1bmRlZmluZWQsXG4gICAgICAgIGN0b3JTdHJpbmcgPSBDdG9yID8gdG9Tb3VyY2UoQ3RvcikgOiAnJztcblxuICAgIGlmIChjdG9yU3RyaW5nKSB7XG4gICAgICBzd2l0Y2ggKGN0b3JTdHJpbmcpIHtcbiAgICAgICAgY2FzZSBkYXRhVmlld0N0b3JTdHJpbmc6IHJldHVybiBkYXRhVmlld1RhZztcbiAgICAgICAgY2FzZSBtYXBDdG9yU3RyaW5nOiByZXR1cm4gbWFwVGFnO1xuICAgICAgICBjYXNlIHByb21pc2VDdG9yU3RyaW5nOiByZXR1cm4gcHJvbWlzZVRhZztcbiAgICAgICAgY2FzZSBzZXRDdG9yU3RyaW5nOiByZXR1cm4gc2V0VGFnO1xuICAgICAgICBjYXNlIHdlYWtNYXBDdG9yU3RyaW5nOiByZXR1cm4gd2Vha01hcFRhZztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0VGFnO1xuIiwiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBJbml0aWFsaXplcyBhbiBhcnJheSBjbG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNsb25lLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAqL1xuZnVuY3Rpb24gaW5pdENsb25lQXJyYXkoYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IG5ldyBhcnJheS5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gIC8vIEFkZCBwcm9wZXJ0aWVzIGFzc2lnbmVkIGJ5IGBSZWdFeHAjZXhlY2AuXG4gIGlmIChsZW5ndGggJiYgdHlwZW9mIGFycmF5WzBdID09ICdzdHJpbmcnICYmIGhhc093blByb3BlcnR5LmNhbGwoYXJyYXksICdpbmRleCcpKSB7XG4gICAgcmVzdWx0LmluZGV4ID0gYXJyYXkuaW5kZXg7XG4gICAgcmVzdWx0LmlucHV0ID0gYXJyYXkuaW5wdXQ7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5pdENsb25lQXJyYXk7XG4iLCJpbXBvcnQgcm9vdCBmcm9tICcuL19yb290LmpzJztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgVWludDhBcnJheSA9IHJvb3QuVWludDhBcnJheTtcblxuZXhwb3J0IGRlZmF1bHQgVWludDhBcnJheTtcbiIsImltcG9ydCBVaW50OEFycmF5IGZyb20gJy4vX1VpbnQ4QXJyYXkuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgYXJyYXlCdWZmZXJgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBhcnJheUJ1ZmZlciBUaGUgYXJyYXkgYnVmZmVyIHRvIGNsb25lLlxuICogQHJldHVybnMge0FycmF5QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYXJyYXkgYnVmZmVyLlxuICovXG5mdW5jdGlvbiBjbG9uZUFycmF5QnVmZmVyKGFycmF5QnVmZmVyKSB7XG4gIHZhciByZXN1bHQgPSBuZXcgYXJyYXlCdWZmZXIuY29uc3RydWN0b3IoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7XG4gIG5ldyBVaW50OEFycmF5KHJlc3VsdCkuc2V0KG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsb25lQXJyYXlCdWZmZXI7XG4iLCJpbXBvcnQgY2xvbmVBcnJheUJ1ZmZlciBmcm9tICcuL19jbG9uZUFycmF5QnVmZmVyLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGRhdGFWaWV3YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFWaWV3IFRoZSBkYXRhIHZpZXcgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIGRhdGEgdmlldy5cbiAqL1xuZnVuY3Rpb24gY2xvbmVEYXRhVmlldyhkYXRhVmlldywgaXNEZWVwKSB7XG4gIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKGRhdGFWaWV3LmJ1ZmZlcikgOiBkYXRhVmlldy5idWZmZXI7XG4gIHJldHVybiBuZXcgZGF0YVZpZXcuY29uc3RydWN0b3IoYnVmZmVyLCBkYXRhVmlldy5ieXRlT2Zmc2V0LCBkYXRhVmlldy5ieXRlTGVuZ3RoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xvbmVEYXRhVmlldztcbiIsIi8qKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgIGZsYWdzIGZyb20gdGhlaXIgY29lcmNlZCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlRmxhZ3MgPSAvXFx3KiQvO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgcmVnZXhwYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHJlZ2V4cCBUaGUgcmVnZXhwIHRvIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHJlZ2V4cC5cbiAqL1xuZnVuY3Rpb24gY2xvbmVSZWdFeHAocmVnZXhwKSB7XG4gIHZhciByZXN1bHQgPSBuZXcgcmVnZXhwLmNvbnN0cnVjdG9yKHJlZ2V4cC5zb3VyY2UsIHJlRmxhZ3MuZXhlYyhyZWdleHApKTtcbiAgcmVzdWx0Lmxhc3RJbmRleCA9IHJlZ2V4cC5sYXN0SW5kZXg7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsb25lUmVnRXhwO1xuIiwiaW1wb3J0IFN5bWJvbCBmcm9tICcuL19TeW1ib2wuanMnO1xuXG4vKiogVXNlZCB0byBjb252ZXJ0IHN5bWJvbHMgdG8gcHJpbWl0aXZlcyBhbmQgc3RyaW5ncy4gKi9cbnZhciBzeW1ib2xQcm90byA9IFN5bWJvbCA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG4gICAgc3ltYm9sVmFsdWVPZiA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udmFsdWVPZiA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIGBzeW1ib2xgIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHN5bWJvbCBUaGUgc3ltYm9sIG9iamVjdCB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBzeW1ib2wgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBjbG9uZVN5bWJvbChzeW1ib2wpIHtcbiAgcmV0dXJuIHN5bWJvbFZhbHVlT2YgPyBPYmplY3Qoc3ltYm9sVmFsdWVPZi5jYWxsKHN5bWJvbCkpIDoge307XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsb25lU3ltYm9sO1xuIiwiaW1wb3J0IGNsb25lQXJyYXlCdWZmZXIgZnJvbSAnLi9fY2xvbmVBcnJheUJ1ZmZlci5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGB0eXBlZEFycmF5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHR5cGVkQXJyYXkgVGhlIHR5cGVkIGFycmF5IHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCB0eXBlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY2xvbmVUeXBlZEFycmF5KHR5cGVkQXJyYXksIGlzRGVlcCkge1xuICB2YXIgYnVmZmVyID0gaXNEZWVwID8gY2xvbmVBcnJheUJ1ZmZlcih0eXBlZEFycmF5LmJ1ZmZlcikgOiB0eXBlZEFycmF5LmJ1ZmZlcjtcbiAgcmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlciwgdHlwZWRBcnJheS5ieXRlT2Zmc2V0LCB0eXBlZEFycmF5Lmxlbmd0aCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsb25lVHlwZWRBcnJheTtcbiIsImltcG9ydCBjbG9uZUFycmF5QnVmZmVyIGZyb20gJy4vX2Nsb25lQXJyYXlCdWZmZXIuanMnO1xuaW1wb3J0IGNsb25lRGF0YVZpZXcgZnJvbSAnLi9fY2xvbmVEYXRhVmlldy5qcyc7XG5pbXBvcnQgY2xvbmVSZWdFeHAgZnJvbSAnLi9fY2xvbmVSZWdFeHAuanMnO1xuaW1wb3J0IGNsb25lU3ltYm9sIGZyb20gJy4vX2Nsb25lU3ltYm9sLmpzJztcbmltcG9ydCBjbG9uZVR5cGVkQXJyYXkgZnJvbSAnLi9fY2xvbmVUeXBlZEFycmF5LmpzJztcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxudmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsXG4gICAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyxcbiAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgYW4gb2JqZWN0IGNsb25lIGJhc2VkIG9uIGl0cyBgdG9TdHJpbmdUYWdgLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY2xvbmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE1hcGAsIGBOdW1iZXJgLCBgUmVnRXhwYCwgYFNldGAsIG9yIGBTdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBgdG9TdHJpbmdUYWdgIG9mIHRoZSBvYmplY3QgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDbG9uZUJ5VGFnKG9iamVjdCwgdGFnLCBpc0RlZXApIHtcbiAgdmFyIEN0b3IgPSBvYmplY3QuY29uc3RydWN0b3I7XG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSBhcnJheUJ1ZmZlclRhZzpcbiAgICAgIHJldHVybiBjbG9uZUFycmF5QnVmZmVyKG9iamVjdCk7XG5cbiAgICBjYXNlIGJvb2xUYWc6XG4gICAgY2FzZSBkYXRlVGFnOlxuICAgICAgcmV0dXJuIG5ldyBDdG9yKCtvYmplY3QpO1xuXG4gICAgY2FzZSBkYXRhVmlld1RhZzpcbiAgICAgIHJldHVybiBjbG9uZURhdGFWaWV3KG9iamVjdCwgaXNEZWVwKTtcblxuICAgIGNhc2UgZmxvYXQzMlRhZzogY2FzZSBmbG9hdDY0VGFnOlxuICAgIGNhc2UgaW50OFRhZzogY2FzZSBpbnQxNlRhZzogY2FzZSBpbnQzMlRhZzpcbiAgICBjYXNlIHVpbnQ4VGFnOiBjYXNlIHVpbnQ4Q2xhbXBlZFRhZzogY2FzZSB1aW50MTZUYWc6IGNhc2UgdWludDMyVGFnOlxuICAgICAgcmV0dXJuIGNsb25lVHlwZWRBcnJheShvYmplY3QsIGlzRGVlcCk7XG5cbiAgICBjYXNlIG1hcFRhZzpcbiAgICAgIHJldHVybiBuZXcgQ3RvcjtcblxuICAgIGNhc2UgbnVtYmVyVGFnOlxuICAgIGNhc2Ugc3RyaW5nVGFnOlxuICAgICAgcmV0dXJuIG5ldyBDdG9yKG9iamVjdCk7XG5cbiAgICBjYXNlIHJlZ2V4cFRhZzpcbiAgICAgIHJldHVybiBjbG9uZVJlZ0V4cChvYmplY3QpO1xuXG4gICAgY2FzZSBzZXRUYWc6XG4gICAgICByZXR1cm4gbmV3IEN0b3I7XG5cbiAgICBjYXNlIHN5bWJvbFRhZzpcbiAgICAgIHJldHVybiBjbG9uZVN5bWJvbChvYmplY3QpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGluaXRDbG9uZUJ5VGFnO1xuIiwiaW1wb3J0IGJhc2VDcmVhdGUgZnJvbSAnLi9fYmFzZUNyZWF0ZS5qcyc7XG5pbXBvcnQgZ2V0UHJvdG90eXBlIGZyb20gJy4vX2dldFByb3RvdHlwZS5qcyc7XG5pbXBvcnQgaXNQcm90b3R5cGUgZnJvbSAnLi9faXNQcm90b3R5cGUuanMnO1xuXG4vKipcbiAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDbG9uZU9iamVjdChvYmplY3QpIHtcbiAgcmV0dXJuICh0eXBlb2Ygb2JqZWN0LmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgIWlzUHJvdG90eXBlKG9iamVjdCkpXG4gICAgPyBiYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKVxuICAgIDoge307XG59XG5cbmV4cG9ydCBkZWZhdWx0IGluaXRDbG9uZU9iamVjdDtcbiIsImltcG9ydCBnZXRUYWcgZnJvbSAnLi9fZ2V0VGFnLmpzJztcbmltcG9ydCBpc09iamVjdExpa2UgZnJvbSAnLi9pc09iamVjdExpa2UuanMnO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbWFwVGFnID0gJ1tvYmplY3QgTWFwXSc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNNYXBgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbWFwLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc01hcCh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBnZXRUYWcodmFsdWUpID09IG1hcFRhZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUlzTWFwO1xuIiwiaW1wb3J0IGJhc2VJc01hcCBmcm9tICcuL19iYXNlSXNNYXAuanMnO1xuaW1wb3J0IGJhc2VVbmFyeSBmcm9tICcuL19iYXNlVW5hcnkuanMnO1xuaW1wb3J0IG5vZGVVdGlsIGZyb20gJy4vX25vZGVVdGlsLmpzJztcblxuLyogTm9kZS5qcyBoZWxwZXIgcmVmZXJlbmNlcy4gKi9cbnZhciBub2RlSXNNYXAgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc01hcDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYE1hcGAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4zLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbWFwLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNNYXAobmV3IE1hcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc01hcChuZXcgV2Vha01hcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNNYXAgPSBub2RlSXNNYXAgPyBiYXNlVW5hcnkobm9kZUlzTWFwKSA6IGJhc2VJc01hcDtcblxuZXhwb3J0IGRlZmF1bHQgaXNNYXA7XG4iLCJpbXBvcnQgZ2V0VGFnIGZyb20gJy4vX2dldFRhZy5qcyc7XG5pbXBvcnQgaXNPYmplY3RMaWtlIGZyb20gJy4vaXNPYmplY3RMaWtlLmpzJztcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzU2V0YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNTZXQodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSBzZXRUYWc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VJc1NldDtcbiIsImltcG9ydCBiYXNlSXNTZXQgZnJvbSAnLi9fYmFzZUlzU2V0LmpzJztcbmltcG9ydCBiYXNlVW5hcnkgZnJvbSAnLi9fYmFzZVVuYXJ5LmpzJztcbmltcG9ydCBub2RlVXRpbCBmcm9tICcuL19ub2RlVXRpbC5qcyc7XG5cbi8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovXG52YXIgbm9kZUlzU2V0ID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNTZXQ7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTZXRgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMy4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU2V0KG5ldyBTZXQpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTZXQobmV3IFdlYWtTZXQpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzU2V0ID0gbm9kZUlzU2V0ID8gYmFzZVVuYXJ5KG5vZGVJc1NldCkgOiBiYXNlSXNTZXQ7XG5cbmV4cG9ydCBkZWZhdWx0IGlzU2V0O1xuIiwiaW1wb3J0IFN0YWNrIGZyb20gJy4vX1N0YWNrLmpzJztcbmltcG9ydCBhcnJheUVhY2ggZnJvbSAnLi9fYXJyYXlFYWNoLmpzJztcbmltcG9ydCBhc3NpZ25WYWx1ZSBmcm9tICcuL19hc3NpZ25WYWx1ZS5qcyc7XG5pbXBvcnQgYmFzZUFzc2lnbiBmcm9tICcuL19iYXNlQXNzaWduLmpzJztcbmltcG9ydCBiYXNlQXNzaWduSW4gZnJvbSAnLi9fYmFzZUFzc2lnbkluLmpzJztcbmltcG9ydCBjbG9uZUJ1ZmZlciBmcm9tICcuL19jbG9uZUJ1ZmZlci5qcyc7XG5pbXBvcnQgY29weUFycmF5IGZyb20gJy4vX2NvcHlBcnJheS5qcyc7XG5pbXBvcnQgY29weVN5bWJvbHMgZnJvbSAnLi9fY29weVN5bWJvbHMuanMnO1xuaW1wb3J0IGNvcHlTeW1ib2xzSW4gZnJvbSAnLi9fY29weVN5bWJvbHNJbi5qcyc7XG5pbXBvcnQgZ2V0QWxsS2V5cyBmcm9tICcuL19nZXRBbGxLZXlzLmpzJztcbmltcG9ydCBnZXRBbGxLZXlzSW4gZnJvbSAnLi9fZ2V0QWxsS2V5c0luLmpzJztcbmltcG9ydCBnZXRUYWcgZnJvbSAnLi9fZ2V0VGFnLmpzJztcbmltcG9ydCBpbml0Q2xvbmVBcnJheSBmcm9tICcuL19pbml0Q2xvbmVBcnJheS5qcyc7XG5pbXBvcnQgaW5pdENsb25lQnlUYWcgZnJvbSAnLi9faW5pdENsb25lQnlUYWcuanMnO1xuaW1wb3J0IGluaXRDbG9uZU9iamVjdCBmcm9tICcuL19pbml0Q2xvbmVPYmplY3QuanMnO1xuaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi9pc0FycmF5LmpzJztcbmltcG9ydCBpc0J1ZmZlciBmcm9tICcuL2lzQnVmZmVyLmpzJztcbmltcG9ydCBpc01hcCBmcm9tICcuL2lzTWFwLmpzJztcbmltcG9ydCBpc09iamVjdCBmcm9tICcuL2lzT2JqZWN0LmpzJztcbmltcG9ydCBpc1NldCBmcm9tICcuL2lzU2V0LmpzJztcbmltcG9ydCBrZXlzIGZyb20gJy4va2V5cy5qcyc7XG5pbXBvcnQga2V5c0luIGZyb20gJy4va2V5c0luLmpzJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgY2xvbmluZy4gKi9cbnZhciBDTE9ORV9ERUVQX0ZMQUcgPSAxLFxuICAgIENMT05FX0ZMQVRfRkxBRyA9IDIsXG4gICAgQ0xPTkVfU1lNQk9MU19GTEFHID0gNDtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nLFxuICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXSc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nLFxuICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuXG4vKiogVXNlZCB0byBpZGVudGlmeSBgdG9TdHJpbmdUYWdgIHZhbHVlcyBzdXBwb3J0ZWQgYnkgYF8uY2xvbmVgLiAqL1xudmFyIGNsb25lYWJsZVRhZ3MgPSB7fTtcbmNsb25lYWJsZVRhZ3NbYXJnc1RhZ10gPSBjbG9uZWFibGVUYWdzW2FycmF5VGFnXSA9XG5jbG9uZWFibGVUYWdzW2FycmF5QnVmZmVyVGFnXSA9IGNsb25lYWJsZVRhZ3NbZGF0YVZpZXdUYWddID1cbmNsb25lYWJsZVRhZ3NbYm9vbFRhZ10gPSBjbG9uZWFibGVUYWdzW2RhdGVUYWddID1cbmNsb25lYWJsZVRhZ3NbZmxvYXQzMlRhZ10gPSBjbG9uZWFibGVUYWdzW2Zsb2F0NjRUYWddID1cbmNsb25lYWJsZVRhZ3NbaW50OFRhZ10gPSBjbG9uZWFibGVUYWdzW2ludDE2VGFnXSA9XG5jbG9uZWFibGVUYWdzW2ludDMyVGFnXSA9IGNsb25lYWJsZVRhZ3NbbWFwVGFnXSA9XG5jbG9uZWFibGVUYWdzW251bWJlclRhZ10gPSBjbG9uZWFibGVUYWdzW29iamVjdFRhZ10gPVxuY2xvbmVhYmxlVGFnc1tyZWdleHBUYWddID0gY2xvbmVhYmxlVGFnc1tzZXRUYWddID1cbmNsb25lYWJsZVRhZ3Nbc3RyaW5nVGFnXSA9IGNsb25lYWJsZVRhZ3Nbc3ltYm9sVGFnXSA9XG5jbG9uZWFibGVUYWdzW3VpbnQ4VGFnXSA9IGNsb25lYWJsZVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9XG5jbG9uZWFibGVUYWdzW3VpbnQxNlRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQzMlRhZ10gPSB0cnVlO1xuY2xvbmVhYmxlVGFnc1tlcnJvclRhZ10gPSBjbG9uZWFibGVUYWdzW2Z1bmNUYWddID1cbmNsb25lYWJsZVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jbG9uZWAgYW5kIGBfLmNsb25lRGVlcGAgd2hpY2ggdHJhY2tzXG4gKiB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gKiAgMSAtIERlZXAgY2xvbmVcbiAqICAyIC0gRmxhdHRlbiBpbmhlcml0ZWQgcHJvcGVydGllc1xuICogIDQgLSBDbG9uZSBzeW1ib2xzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IFtrZXldIFRoZSBrZXkgb2YgYHZhbHVlYC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgcGFyZW50IG9iamVjdCBvZiBgdmFsdWVgLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGFuZCB0aGVpciBjbG9uZSBjb3VudGVycGFydHMuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgY2xvbmVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBiYXNlQ2xvbmUodmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgb2JqZWN0LCBzdGFjaykge1xuICB2YXIgcmVzdWx0LFxuICAgICAgaXNEZWVwID0gYml0bWFzayAmIENMT05FX0RFRVBfRkxBRyxcbiAgICAgIGlzRmxhdCA9IGJpdG1hc2sgJiBDTE9ORV9GTEFUX0ZMQUcsXG4gICAgICBpc0Z1bGwgPSBiaXRtYXNrICYgQ0xPTkVfU1lNQk9MU19GTEFHO1xuXG4gIGlmIChjdXN0b21pemVyKSB7XG4gICAgcmVzdWx0ID0gb2JqZWN0ID8gY3VzdG9taXplcih2YWx1ZSwga2V5LCBvYmplY3QsIHN0YWNrKSA6IGN1c3RvbWl6ZXIodmFsdWUpO1xuICB9XG4gIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSk7XG4gIGlmIChpc0Fycikge1xuICAgIHJlc3VsdCA9IGluaXRDbG9uZUFycmF5KHZhbHVlKTtcbiAgICBpZiAoIWlzRGVlcCkge1xuICAgICAgcmV0dXJuIGNvcHlBcnJheSh2YWx1ZSwgcmVzdWx0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSksXG4gICAgICAgIGlzRnVuYyA9IHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWc7XG5cbiAgICBpZiAoaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY2xvbmVCdWZmZXIodmFsdWUsIGlzRGVlcCk7XG4gICAgfVxuICAgIGlmICh0YWcgPT0gb2JqZWN0VGFnIHx8IHRhZyA9PSBhcmdzVGFnIHx8IChpc0Z1bmMgJiYgIW9iamVjdCkpIHtcbiAgICAgIHJlc3VsdCA9IChpc0ZsYXQgfHwgaXNGdW5jKSA/IHt9IDogaW5pdENsb25lT2JqZWN0KHZhbHVlKTtcbiAgICAgIGlmICghaXNEZWVwKSB7XG4gICAgICAgIHJldHVybiBpc0ZsYXRcbiAgICAgICAgICA/IGNvcHlTeW1ib2xzSW4odmFsdWUsIGJhc2VBc3NpZ25JbihyZXN1bHQsIHZhbHVlKSlcbiAgICAgICAgICA6IGNvcHlTeW1ib2xzKHZhbHVlLCBiYXNlQXNzaWduKHJlc3VsdCwgdmFsdWUpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFjbG9uZWFibGVUYWdzW3RhZ10pIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdCA/IHZhbHVlIDoge307XG4gICAgICB9XG4gICAgICByZXN1bHQgPSBpbml0Q2xvbmVCeVRhZyh2YWx1ZSwgdGFnLCBpc0RlZXApO1xuICAgIH1cbiAgfVxuICAvLyBDaGVjayBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcyBhbmQgcmV0dXJuIGl0cyBjb3JyZXNwb25kaW5nIGNsb25lLlxuICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICB2YXIgc3RhY2tlZCA9IHN0YWNrLmdldCh2YWx1ZSk7XG4gIGlmIChzdGFja2VkKSB7XG4gICAgcmV0dXJuIHN0YWNrZWQ7XG4gIH1cbiAgc3RhY2suc2V0KHZhbHVlLCByZXN1bHQpO1xuXG4gIGlmIChpc1NldCh2YWx1ZSkpIHtcbiAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlKSB7XG4gICAgICByZXN1bHQuYWRkKGJhc2VDbG9uZShzdWJWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3ViVmFsdWUsIHZhbHVlLCBzdGFjaykpO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKGlzTWFwKHZhbHVlKSkge1xuICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24oc3ViVmFsdWUsIGtleSkge1xuICAgICAgcmVzdWx0LnNldChrZXksIGJhc2VDbG9uZShzdWJWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCB2YWx1ZSwgc3RhY2spKTtcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBrZXlzRnVuYyA9IGlzRnVsbFxuICAgID8gKGlzRmxhdCA/IGdldEFsbEtleXNJbiA6IGdldEFsbEtleXMpXG4gICAgOiAoaXNGbGF0ID8ga2V5c0luIDoga2V5cyk7XG5cbiAgdmFyIHByb3BzID0gaXNBcnIgPyB1bmRlZmluZWQgOiBrZXlzRnVuYyh2YWx1ZSk7XG4gIGFycmF5RWFjaChwcm9wcyB8fCB2YWx1ZSwgZnVuY3Rpb24oc3ViVmFsdWUsIGtleSkge1xuICAgIGlmIChwcm9wcykge1xuICAgICAga2V5ID0gc3ViVmFsdWU7XG4gICAgICBzdWJWYWx1ZSA9IHZhbHVlW2tleV07XG4gICAgfVxuICAgIC8vIFJlY3Vyc2l2ZWx5IHBvcHVsYXRlIGNsb25lIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgYXNzaWduVmFsdWUocmVzdWx0LCBrZXksIGJhc2VDbG9uZShzdWJWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCB2YWx1ZSwgc3RhY2spKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VDbG9uZTtcbiIsImltcG9ydCBiYXNlQ2xvbmUgZnJvbSAnLi9fYmFzZUNsb25lLmpzJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgY2xvbmluZy4gKi9cbnZhciBDTE9ORV9ERUVQX0ZMQUcgPSAxLFxuICAgIENMT05FX1NZTUJPTFNfRkxBRyA9IDQ7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZWAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgY2xvbmVzIGB2YWx1ZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAxLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJlY3Vyc2l2ZWx5IGNsb25lLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGRlZXAgY2xvbmVkIHZhbHVlLlxuICogQHNlZSBfLmNsb25lXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gW3sgJ2EnOiAxIH0sIHsgJ2InOiAyIH1dO1xuICpcbiAqIHZhciBkZWVwID0gXy5jbG9uZURlZXAob2JqZWN0cyk7XG4gKiBjb25zb2xlLmxvZyhkZWVwWzBdID09PSBvYmplY3RzWzBdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGNsb25lRGVlcCh2YWx1ZSkge1xuICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9ERUVQX0ZMQUcgfCBDTE9ORV9TWU1CT0xTX0ZMQUcpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbG9uZURlZXA7XG4iLCIvKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG52YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbi8qKlxuICogQWRkcyBgdmFsdWVgIHRvIHRoZSBhcnJheSBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgYWRkXG4gKiBAbWVtYmVyT2YgU2V0Q2FjaGVcbiAqIEBhbGlhcyBwdXNoXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjYWNoZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBzZXRDYWNoZUFkZCh2YWx1ZSkge1xuICB0aGlzLl9fZGF0YV9fLnNldCh2YWx1ZSwgSEFTSF9VTkRFRklORUQpO1xuICByZXR1cm4gdGhpcztcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2V0Q2FjaGVBZGQ7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGluIHRoZSBhcnJheSBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgU2V0Q2FjaGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIHNldENhY2hlSGFzKHZhbHVlKSB7XG4gIHJldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh2YWx1ZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNldENhY2hlSGFzO1xuIiwiaW1wb3J0IE1hcENhY2hlIGZyb20gJy4vX01hcENhY2hlLmpzJztcbmltcG9ydCBzZXRDYWNoZUFkZCBmcm9tICcuL19zZXRDYWNoZUFkZC5qcyc7XG5pbXBvcnQgc2V0Q2FjaGVIYXMgZnJvbSAnLi9fc2V0Q2FjaGVIYXMuanMnO1xuXG4vKipcbiAqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGNhY2hlIG9iamVjdCB0byBzdG9yZSB1bmlxdWUgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIFNldENhY2hlKHZhbHVlcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHZhbHVlcyA9PSBudWxsID8gMCA6IHZhbHVlcy5sZW5ndGg7XG5cbiAgdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB0aGlzLmFkZCh2YWx1ZXNbaW5kZXhdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgU2V0Q2FjaGVgLlxuU2V0Q2FjaGUucHJvdG90eXBlLmFkZCA9IFNldENhY2hlLnByb3RvdHlwZS5wdXNoID0gc2V0Q2FjaGVBZGQ7XG5TZXRDYWNoZS5wcm90b3R5cGUuaGFzID0gc2V0Q2FjaGVIYXM7XG5cbmV4cG9ydCBkZWZhdWx0IFNldENhY2hlO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc29tZWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgZWxlbWVudCBwYXNzZXMgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5U29tZShhcnJheSwgcHJlZGljYXRlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXJyYXlTb21lO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYSBgY2FjaGVgIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBUaGUgY2FjaGUgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gY2FjaGVIYXMoY2FjaGUsIGtleSkge1xuICByZXR1cm4gY2FjaGUuaGFzKGtleSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNhY2hlSGFzO1xuIiwiaW1wb3J0IFNldENhY2hlIGZyb20gJy4vX1NldENhY2hlLmpzJztcbmltcG9ydCBhcnJheVNvbWUgZnJvbSAnLi9fYXJyYXlTb21lLmpzJztcbmltcG9ydCBjYWNoZUhhcyBmcm9tICcuL19jYWNoZUhhcy5qcyc7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIGFycmF5cyB3aXRoIHN1cHBvcnQgZm9yXG4gKiBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtBcnJheX0gb3RoZXIgVGhlIG90aGVyIGFycmF5IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBhcnJheWAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXJyYXlzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGVxdWFsQXJyYXlzKGFycmF5LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHLFxuICAgICAgYXJyTGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgb3RoTGVuZ3RoID0gb3RoZXIubGVuZ3RoO1xuXG4gIGlmIChhcnJMZW5ndGggIT0gb3RoTGVuZ3RoICYmICEoaXNQYXJ0aWFsICYmIG90aExlbmd0aCA+IGFyckxlbmd0aCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gQ2hlY2sgdGhhdCBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC5cbiAgdmFyIGFyclN0YWNrZWQgPSBzdGFjay5nZXQoYXJyYXkpO1xuICB2YXIgb3RoU3RhY2tlZCA9IHN0YWNrLmdldChvdGhlcik7XG4gIGlmIChhcnJTdGFja2VkICYmIG90aFN0YWNrZWQpIHtcbiAgICByZXR1cm4gYXJyU3RhY2tlZCA9PSBvdGhlciAmJiBvdGhTdGFja2VkID09IGFycmF5O1xuICB9XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gdHJ1ZSxcbiAgICAgIHNlZW4gPSAoYml0bWFzayAmIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcpID8gbmV3IFNldENhY2hlIDogdW5kZWZpbmVkO1xuXG4gIHN0YWNrLnNldChhcnJheSwgb3RoZXIpO1xuICBzdGFjay5zZXQob3RoZXIsIGFycmF5KTtcblxuICAvLyBJZ25vcmUgbm9uLWluZGV4IHByb3BlcnRpZXMuXG4gIHdoaWxlICgrK2luZGV4IDwgYXJyTGVuZ3RoKSB7XG4gICAgdmFyIGFyclZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICBvdGhWYWx1ZSA9IG90aGVyW2luZGV4XTtcblxuICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICB2YXIgY29tcGFyZWQgPSBpc1BhcnRpYWxcbiAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBhcnJWYWx1ZSwgaW5kZXgsIG90aGVyLCBhcnJheSwgc3RhY2spXG4gICAgICAgIDogY3VzdG9taXplcihhcnJWYWx1ZSwgb3RoVmFsdWUsIGluZGV4LCBhcnJheSwgb3RoZXIsIHN0YWNrKTtcbiAgICB9XG4gICAgaWYgKGNvbXBhcmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChjb21wYXJlZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgaWYgKHNlZW4pIHtcbiAgICAgIGlmICghYXJyYXlTb21lKG90aGVyLCBmdW5jdGlvbihvdGhWYWx1ZSwgb3RoSW5kZXgpIHtcbiAgICAgICAgICAgIGlmICghY2FjaGVIYXMoc2Vlbiwgb3RoSW5kZXgpICYmXG4gICAgICAgICAgICAgICAgKGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBzZWVuLnB1c2gob3RoSW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKSB7XG4gICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCEoXG4gICAgICAgICAgYXJyVmFsdWUgPT09IG90aFZhbHVlIHx8XG4gICAgICAgICAgICBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaylcbiAgICAgICAgKSkge1xuICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgc3RhY2tbJ2RlbGV0ZSddKGFycmF5KTtcbiAgc3RhY2tbJ2RlbGV0ZSddKG90aGVyKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZXF1YWxBcnJheXM7XG4iLCIvKipcbiAqIENvbnZlcnRzIGBtYXBgIHRvIGl0cyBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gKi9cbmZ1bmN0aW9uIG1hcFRvQXJyYXkobWFwKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobWFwLnNpemUpO1xuXG4gIG1hcC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICByZXN1bHRbKytpbmRleF0gPSBba2V5LCB2YWx1ZV07XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBtYXBUb0FycmF5O1xuIiwiLyoqXG4gKiBDb252ZXJ0cyBgc2V0YCB0byBhbiBhcnJheSBvZiBpdHMgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc2V0IFRoZSBzZXQgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBzZXRUb0FycmF5KHNldCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTtcblxuICBzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJlc3VsdFsrK2luZGV4XSA9IHZhbHVlO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2V0VG9BcnJheTtcbiIsImltcG9ydCBTeW1ib2wgZnJvbSAnLi9fU3ltYm9sLmpzJztcbmltcG9ydCBVaW50OEFycmF5IGZyb20gJy4vX1VpbnQ4QXJyYXkuanMnO1xuaW1wb3J0IGVxIGZyb20gJy4vZXEuanMnO1xuaW1wb3J0IGVxdWFsQXJyYXlzIGZyb20gJy4vX2VxdWFsQXJyYXlzLmpzJztcbmltcG9ydCBtYXBUb0FycmF5IGZyb20gJy4vX21hcFRvQXJyYXkuanMnO1xuaW1wb3J0IHNldFRvQXJyYXkgZnJvbSAnLi9fc2V0VG9BcnJheS5qcyc7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nO1xuXG4vKiogVXNlZCB0byBjb252ZXJ0IHN5bWJvbHMgdG8gcHJpbWl0aXZlcyBhbmQgc3RyaW5ncy4gKi9cbnZhciBzeW1ib2xQcm90byA9IFN5bWJvbCA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG4gICAgc3ltYm9sVmFsdWVPZiA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udmFsdWVPZiA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIGNvbXBhcmluZyBvYmplY3RzIG9mXG4gKiB0aGUgc2FtZSBgdG9TdHJpbmdUYWdgLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY29tcGFyaW5nIHZhbHVlcyB3aXRoIHRhZ3Mgb2ZcbiAqIGBCb29sZWFuYCwgYERhdGVgLCBgRXJyb3JgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIG9yIGBTdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBgdG9TdHJpbmdUYWdgIG9mIHRoZSBvYmplY3RzIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCB0YWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlIGRhdGFWaWV3VGFnOlxuICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fFxuICAgICAgICAgIChvYmplY3QuYnl0ZU9mZnNldCAhPSBvdGhlci5ieXRlT2Zmc2V0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBvYmplY3QuYnVmZmVyO1xuICAgICAgb3RoZXIgPSBvdGhlci5idWZmZXI7XG5cbiAgICBjYXNlIGFycmF5QnVmZmVyVGFnOlxuICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fFxuICAgICAgICAgICFlcXVhbEZ1bmMobmV3IFVpbnQ4QXJyYXkob2JqZWN0KSwgbmV3IFVpbnQ4QXJyYXkob3RoZXIpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGNhc2UgYm9vbFRhZzpcbiAgICBjYXNlIGRhdGVUYWc6XG4gICAgY2FzZSBudW1iZXJUYWc6XG4gICAgICAvLyBDb2VyY2UgYm9vbGVhbnMgdG8gYDFgIG9yIGAwYCBhbmQgZGF0ZXMgdG8gbWlsbGlzZWNvbmRzLlxuICAgICAgLy8gSW52YWxpZCBkYXRlcyBhcmUgY29lcmNlZCB0byBgTmFOYC5cbiAgICAgIHJldHVybiBlcSgrb2JqZWN0LCArb3RoZXIpO1xuXG4gICAgY2FzZSBlcnJvclRhZzpcbiAgICAgIHJldHVybiBvYmplY3QubmFtZSA9PSBvdGhlci5uYW1lICYmIG9iamVjdC5tZXNzYWdlID09IG90aGVyLm1lc3NhZ2U7XG5cbiAgICBjYXNlIHJlZ2V4cFRhZzpcbiAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgIC8vIENvZXJjZSByZWdleGVzIHRvIHN0cmluZ3MgYW5kIHRyZWF0IHN0cmluZ3MsIHByaW1pdGl2ZXMgYW5kIG9iamVjdHMsXG4gICAgICAvLyBhcyBlcXVhbC4gU2VlIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1yZWdleHAucHJvdG90eXBlLnRvc3RyaW5nXG4gICAgICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgcmV0dXJuIG9iamVjdCA9PSAob3RoZXIgKyAnJyk7XG5cbiAgICBjYXNlIG1hcFRhZzpcbiAgICAgIHZhciBjb252ZXJ0ID0gbWFwVG9BcnJheTtcblxuICAgIGNhc2Ugc2V0VGFnOlxuICAgICAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRztcbiAgICAgIGNvbnZlcnQgfHwgKGNvbnZlcnQgPSBzZXRUb0FycmF5KTtcblxuICAgICAgaWYgKG9iamVjdC5zaXplICE9IG90aGVyLnNpemUgJiYgIWlzUGFydGlhbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBBc3N1bWUgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICB2YXIgc3RhY2tlZCA9IHN0YWNrLmdldChvYmplY3QpO1xuICAgICAgaWYgKHN0YWNrZWQpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrZWQgPT0gb3RoZXI7XG4gICAgICB9XG4gICAgICBiaXRtYXNrIHw9IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUc7XG5cbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgc3RhY2suc2V0KG9iamVjdCwgb3RoZXIpO1xuICAgICAgdmFyIHJlc3VsdCA9IGVxdWFsQXJyYXlzKGNvbnZlcnQob2JqZWN0KSwgY29udmVydChvdGhlciksIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICAgICAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICBpZiAoc3ltYm9sVmFsdWVPZikge1xuICAgICAgICByZXR1cm4gc3ltYm9sVmFsdWVPZi5jYWxsKG9iamVjdCkgPT0gc3ltYm9sVmFsdWVPZi5jYWxsKG90aGVyKTtcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGVxdWFsQnlUYWc7XG4iLCJpbXBvcnQgZ2V0QWxsS2V5cyBmcm9tICcuL19nZXRBbGxLZXlzLmpzJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3Igb2JqZWN0cyB3aXRoIHN1cHBvcnQgZm9yXG4gKiBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBlcXVhbE9iamVjdHMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHLFxuICAgICAgb2JqUHJvcHMgPSBnZXRBbGxLZXlzKG9iamVjdCksXG4gICAgICBvYmpMZW5ndGggPSBvYmpQcm9wcy5sZW5ndGgsXG4gICAgICBvdGhQcm9wcyA9IGdldEFsbEtleXMob3RoZXIpLFxuICAgICAgb3RoTGVuZ3RoID0gb3RoUHJvcHMubGVuZ3RoO1xuXG4gIGlmIChvYmpMZW5ndGggIT0gb3RoTGVuZ3RoICYmICFpc1BhcnRpYWwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGluZGV4ID0gb2JqTGVuZ3RoO1xuICB3aGlsZSAoaW5kZXgtLSkge1xuICAgIHZhciBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgaWYgKCEoaXNQYXJ0aWFsID8ga2V5IGluIG90aGVyIDogaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwga2V5KSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgLy8gQ2hlY2sgdGhhdCBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC5cbiAgdmFyIG9ialN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgdmFyIG90aFN0YWNrZWQgPSBzdGFjay5nZXQob3RoZXIpO1xuICBpZiAob2JqU3RhY2tlZCAmJiBvdGhTdGFja2VkKSB7XG4gICAgcmV0dXJuIG9ialN0YWNrZWQgPT0gb3RoZXIgJiYgb3RoU3RhY2tlZCA9PSBvYmplY3Q7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IHRydWU7XG4gIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgc3RhY2suc2V0KG90aGVyLCBvYmplY3QpO1xuXG4gIHZhciBza2lwQ3RvciA9IGlzUGFydGlhbDtcbiAgd2hpbGUgKCsraW5kZXggPCBvYmpMZW5ndGgpIHtcbiAgICBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgIG90aFZhbHVlID0gb3RoZXJba2V5XTtcblxuICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICB2YXIgY29tcGFyZWQgPSBpc1BhcnRpYWxcbiAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBvYmpWYWx1ZSwga2V5LCBvdGhlciwgb2JqZWN0LCBzdGFjaylcbiAgICAgICAgOiBjdXN0b21pemVyKG9ialZhbHVlLCBvdGhWYWx1ZSwga2V5LCBvYmplY3QsIG90aGVyLCBzdGFjayk7XG4gICAgfVxuICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIGlmICghKGNvbXBhcmVkID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IChvYmpWYWx1ZSA9PT0gb3RoVmFsdWUgfHwgZXF1YWxGdW5jKG9ialZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spKVxuICAgICAgICAgIDogY29tcGFyZWRcbiAgICAgICAgKSkge1xuICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgc2tpcEN0b3IgfHwgKHNraXBDdG9yID0ga2V5ID09ICdjb25zdHJ1Y3RvcicpO1xuICB9XG4gIGlmIChyZXN1bHQgJiYgIXNraXBDdG9yKSB7XG4gICAgdmFyIG9iakN0b3IgPSBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgIG90aEN0b3IgPSBvdGhlci5jb25zdHJ1Y3RvcjtcblxuICAgIC8vIE5vbiBgT2JqZWN0YCBvYmplY3QgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGNvbnN0cnVjdG9ycyBhcmUgbm90IGVxdWFsLlxuICAgIGlmIChvYmpDdG9yICE9IG90aEN0b3IgJiZcbiAgICAgICAgKCdjb25zdHJ1Y3RvcicgaW4gb2JqZWN0ICYmICdjb25zdHJ1Y3RvcicgaW4gb3RoZXIpICYmXG4gICAgICAgICEodHlwZW9mIG9iakN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvYmpDdG9yIGluc3RhbmNlb2Ygb2JqQ3RvciAmJlxuICAgICAgICAgIHR5cGVvZiBvdGhDdG9yID09ICdmdW5jdGlvbicgJiYgb3RoQ3RvciBpbnN0YW5jZW9mIG90aEN0b3IpKSB7XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGVxdWFsT2JqZWN0cztcbiIsImltcG9ydCBTdGFjayBmcm9tICcuL19TdGFjay5qcyc7XG5pbXBvcnQgZXF1YWxBcnJheXMgZnJvbSAnLi9fZXF1YWxBcnJheXMuanMnO1xuaW1wb3J0IGVxdWFsQnlUYWcgZnJvbSAnLi9fZXF1YWxCeVRhZy5qcyc7XG5pbXBvcnQgZXF1YWxPYmplY3RzIGZyb20gJy4vX2VxdWFsT2JqZWN0cy5qcyc7XG5pbXBvcnQgZ2V0VGFnIGZyb20gJy4vX2dldFRhZy5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuaW1wb3J0IGlzQnVmZmVyIGZyb20gJy4vaXNCdWZmZXIuanMnO1xuaW1wb3J0IGlzVHlwZWRBcnJheSBmcm9tICcuL2lzVHlwZWRBcnJheS5qcyc7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICogZGVlcCBjb21wYXJpc29ucyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICogcmVmZXJlbmNlcyB0byBiZSBjb21wYXJlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzRXF1YWxEZWVwKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgdmFyIG9iaklzQXJyID0gaXNBcnJheShvYmplY3QpLFxuICAgICAgb3RoSXNBcnIgPSBpc0FycmF5KG90aGVyKSxcbiAgICAgIG9ialRhZyA9IG9iaklzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob2JqZWN0KSxcbiAgICAgIG90aFRhZyA9IG90aElzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob3RoZXIpO1xuXG4gIG9ialRhZyA9IG9ialRhZyA9PSBhcmdzVGFnID8gb2JqZWN0VGFnIDogb2JqVGFnO1xuICBvdGhUYWcgPSBvdGhUYWcgPT0gYXJnc1RhZyA/IG9iamVjdFRhZyA6IG90aFRhZztcblxuICB2YXIgb2JqSXNPYmogPSBvYmpUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgb3RoSXNPYmogPSBvdGhUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgaXNTYW1lVGFnID0gb2JqVGFnID09IG90aFRhZztcblxuICBpZiAoaXNTYW1lVGFnICYmIGlzQnVmZmVyKG9iamVjdCkpIHtcbiAgICBpZiAoIWlzQnVmZmVyKG90aGVyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBvYmpJc0FyciA9IHRydWU7XG4gICAgb2JqSXNPYmogPSBmYWxzZTtcbiAgfVxuICBpZiAoaXNTYW1lVGFnICYmICFvYmpJc09iaikge1xuICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgcmV0dXJuIChvYmpJc0FyciB8fCBpc1R5cGVkQXJyYXkob2JqZWN0KSlcbiAgICAgID8gZXF1YWxBcnJheXMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaylcbiAgICAgIDogZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCBvYmpUYWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICB9XG4gIGlmICghKGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRykpIHtcbiAgICB2YXIgb2JqSXNXcmFwcGVkID0gb2JqSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsICdfX3dyYXBwZWRfXycpLFxuICAgICAgICBvdGhJc1dyYXBwZWQgPSBvdGhJc09iaiAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCAnX193cmFwcGVkX18nKTtcblxuICAgIGlmIChvYmpJc1dyYXBwZWQgfHwgb3RoSXNXcmFwcGVkKSB7XG4gICAgICB2YXIgb2JqVW53cmFwcGVkID0gb2JqSXNXcmFwcGVkID8gb2JqZWN0LnZhbHVlKCkgOiBvYmplY3QsXG4gICAgICAgICAgb3RoVW53cmFwcGVkID0gb3RoSXNXcmFwcGVkID8gb3RoZXIudmFsdWUoKSA6IG90aGVyO1xuXG4gICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgcmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsIG90aFVud3JhcHBlZCwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spO1xuICAgIH1cbiAgfVxuICBpZiAoIWlzU2FtZVRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICByZXR1cm4gZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlSXNFcXVhbERlZXA7XG4iLCJpbXBvcnQgYmFzZUlzRXF1YWxEZWVwIGZyb20gJy4vX2Jhc2VJc0VxdWFsRGVlcC5qcyc7XG5pbXBvcnQgaXNPYmplY3RMaWtlIGZyb20gJy4vaXNPYmplY3RMaWtlLmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0VxdWFsYCB3aGljaCBzdXBwb3J0cyBwYXJ0aWFsIGNvbXBhcmlzb25zXG4gKiBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy5cbiAqICAxIC0gVW5vcmRlcmVkIGNvbXBhcmlzb25cbiAqICAyIC0gUGFydGlhbCBjb21wYXJpc29uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgYHZhbHVlYCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzRXF1YWwodmFsdWUsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykge1xuICBpZiAodmFsdWUgPT09IG90aGVyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHZhbHVlID09IG51bGwgfHwgb3RoZXIgPT0gbnVsbCB8fCAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgIWlzT2JqZWN0TGlrZShvdGhlcikpKSB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXI7XG4gIH1cbiAgcmV0dXJuIGJhc2VJc0VxdWFsRGVlcCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGJhc2VJc0VxdWFsLCBzdGFjayk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VJc0VxdWFsO1xuIiwiaW1wb3J0IFN0YWNrIGZyb20gJy4vX1N0YWNrLmpzJztcbmltcG9ydCBiYXNlSXNFcXVhbCBmcm9tICcuL19iYXNlSXNFcXVhbC5qcyc7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc01hdGNoYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAqIEBwYXJhbSB7QXJyYXl9IG1hdGNoRGF0YSBUaGUgcHJvcGVydHkgbmFtZXMsIHZhbHVlcywgYW5kIGNvbXBhcmUgZmxhZ3MgdG8gbWF0Y2guXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBtYXRjaERhdGEsIGN1c3RvbWl6ZXIpIHtcbiAgdmFyIGluZGV4ID0gbWF0Y2hEYXRhLmxlbmd0aCxcbiAgICAgIGxlbmd0aCA9IGluZGV4LFxuICAgICAgbm9DdXN0b21pemVyID0gIWN1c3RvbWl6ZXI7XG5cbiAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgcmV0dXJuICFsZW5ndGg7XG4gIH1cbiAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gIHdoaWxlIChpbmRleC0tKSB7XG4gICAgdmFyIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xuICAgIGlmICgobm9DdXN0b21pemVyICYmIGRhdGFbMl0pXG4gICAgICAgICAgPyBkYXRhWzFdICE9PSBvYmplY3RbZGF0YVswXV1cbiAgICAgICAgICA6ICEoZGF0YVswXSBpbiBvYmplY3QpXG4gICAgICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xuICAgIHZhciBrZXkgPSBkYXRhWzBdLFxuICAgICAgICBvYmpWYWx1ZSA9IG9iamVjdFtrZXldLFxuICAgICAgICBzcmNWYWx1ZSA9IGRhdGFbMV07XG5cbiAgICBpZiAobm9DdXN0b21pemVyICYmIGRhdGFbMl0pIHtcbiAgICAgIGlmIChvYmpWYWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgc3RhY2sgPSBuZXcgU3RhY2s7XG4gICAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgICB2YXIgcmVzdWx0ID0gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKTtcbiAgICAgIH1cbiAgICAgIGlmICghKHJlc3VsdCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IGJhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgfCBDT01QQVJFX1VOT1JERVJFRF9GTEFHLCBjdXN0b21pemVyLCBzdGFjaylcbiAgICAgICAgICAgIDogcmVzdWx0XG4gICAgICAgICAgKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlSXNNYXRjaDtcbiIsImltcG9ydCBpc09iamVjdCBmcm9tICcuL2lzT2JqZWN0LmpzJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3Igc3RyaWN0IGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlmIHN1aXRhYmxlIGZvciBzdHJpY3RcbiAqICBlcXVhbGl0eSBjb21wYXJpc29ucywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1N0cmljdENvbXBhcmFibGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSAmJiAhaXNPYmplY3QodmFsdWUpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc1N0cmljdENvbXBhcmFibGU7XG4iLCJpbXBvcnQgaXNTdHJpY3RDb21wYXJhYmxlIGZyb20gJy4vX2lzU3RyaWN0Q29tcGFyYWJsZS5qcyc7XG5pbXBvcnQga2V5cyBmcm9tICcuL2tleXMuanMnO1xuXG4vKipcbiAqIEdldHMgdGhlIHByb3BlcnR5IG5hbWVzLCB2YWx1ZXMsIGFuZCBjb21wYXJlIGZsYWdzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG1hdGNoIGRhdGEgb2YgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGdldE1hdGNoRGF0YShvYmplY3QpIHtcbiAgdmFyIHJlc3VsdCA9IGtleXMob2JqZWN0KSxcbiAgICAgIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7XG5cbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgdmFyIGtleSA9IHJlc3VsdFtsZW5ndGhdLFxuICAgICAgICB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXG4gICAgcmVzdWx0W2xlbmd0aF0gPSBba2V5LCB2YWx1ZSwgaXNTdHJpY3RDb21wYXJhYmxlKHZhbHVlKV07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0TWF0Y2hEYXRhO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYG1hdGNoZXNQcm9wZXJ0eWAgZm9yIHNvdXJjZSB2YWx1ZXMgc3VpdGFibGVcbiAqIGZvciBzdHJpY3QgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gbWF0Y2guXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZShrZXksIHNyY1ZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdFtrZXldID09PSBzcmNWYWx1ZSAmJlxuICAgICAgKHNyY1ZhbHVlICE9PSB1bmRlZmluZWQgfHwgKGtleSBpbiBPYmplY3Qob2JqZWN0KSkpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZTtcbiIsImltcG9ydCBiYXNlSXNNYXRjaCBmcm9tICcuL19iYXNlSXNNYXRjaC5qcyc7XG5pbXBvcnQgZ2V0TWF0Y2hEYXRhIGZyb20gJy4vX2dldE1hdGNoRGF0YS5qcyc7XG5pbXBvcnQgbWF0Y2hlc1N0cmljdENvbXBhcmFibGUgZnJvbSAnLi9fbWF0Y2hlc1N0cmljdENvbXBhcmFibGUuanMnO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hdGNoZXNgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNvdXJjZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlTWF0Y2hlcyhzb3VyY2UpIHtcbiAgdmFyIG1hdGNoRGF0YSA9IGdldE1hdGNoRGF0YShzb3VyY2UpO1xuICBpZiAobWF0Y2hEYXRhLmxlbmd0aCA9PSAxICYmIG1hdGNoRGF0YVswXVsyXSkge1xuICAgIHJldHVybiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZShtYXRjaERhdGFbMF1bMF0sIG1hdGNoRGF0YVswXVsxXSk7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHJldHVybiBvYmplY3QgPT09IHNvdXJjZSB8fCBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgbWF0Y2hEYXRhKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZU1hdGNoZXM7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmhhc0luYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSGFzSW4ob2JqZWN0LCBrZXkpIHtcbiAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGtleSBpbiBPYmplY3Qob2JqZWN0KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUhhc0luO1xuIiwiaW1wb3J0IGNhc3RQYXRoIGZyb20gJy4vX2Nhc3RQYXRoLmpzJztcbmltcG9ydCBpc0FyZ3VtZW50cyBmcm9tICcuL2lzQXJndW1lbnRzLmpzJztcbmltcG9ydCBpc0FycmF5IGZyb20gJy4vaXNBcnJheS5qcyc7XG5pbXBvcnQgaXNJbmRleCBmcm9tICcuL19pc0luZGV4LmpzJztcbmltcG9ydCBpc0xlbmd0aCBmcm9tICcuL2lzTGVuZ3RoLmpzJztcbmltcG9ydCB0b0tleSBmcm9tICcuL190b0tleS5qcyc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBwYXRoYCBleGlzdHMgb24gYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFzRnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2sgcHJvcGVydGllcy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBoYXNGdW5jKSB7XG4gIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBmYWxzZTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSk7XG4gICAgaWYgKCEocmVzdWx0ID0gb2JqZWN0ICE9IG51bGwgJiYgaGFzRnVuYyhvYmplY3QsIGtleSkpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgb2JqZWN0ID0gb2JqZWN0W2tleV07XG4gIH1cbiAgaWYgKHJlc3VsdCB8fCArK2luZGV4ICE9IGxlbmd0aCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgbGVuZ3RoID0gb2JqZWN0ID09IG51bGwgPyAwIDogb2JqZWN0Lmxlbmd0aDtcbiAgcmV0dXJuICEhbGVuZ3RoICYmIGlzTGVuZ3RoKGxlbmd0aCkgJiYgaXNJbmRleChrZXksIGxlbmd0aCkgJiZcbiAgICAoaXNBcnJheShvYmplY3QpIHx8IGlzQXJndW1lbnRzKG9iamVjdCkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBoYXNQYXRoO1xuIiwiaW1wb3J0IGJhc2VIYXNJbiBmcm9tICcuL19iYXNlSGFzSW4uanMnO1xuaW1wb3J0IGhhc1BhdGggZnJvbSAnLi9faGFzUGF0aC5qcyc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBwYXRoYCBpcyBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYS5iJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXNJbihvYmplY3QsIFsnYScsICdiJ10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYicpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaGFzSW4ob2JqZWN0LCBwYXRoKSB7XG4gIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhc0luKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaGFzSW47XG4iLCJpbXBvcnQgYmFzZUlzRXF1YWwgZnJvbSAnLi9fYmFzZUlzRXF1YWwuanMnO1xuaW1wb3J0IGdldCBmcm9tICcuL2dldC5qcyc7XG5pbXBvcnQgaGFzSW4gZnJvbSAnLi9oYXNJbi5qcyc7XG5pbXBvcnQgaXNLZXkgZnJvbSAnLi9faXNLZXkuanMnO1xuaW1wb3J0IGlzU3RyaWN0Q29tcGFyYWJsZSBmcm9tICcuL19pc1N0cmljdENvbXBhcmFibGUuanMnO1xuaW1wb3J0IG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlIGZyb20gJy4vX21hdGNoZXNTdHJpY3RDb21wYXJhYmxlLmpzJztcbmltcG9ydCB0b0tleSBmcm9tICcuL190b0tleS5qcyc7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzUHJvcGVydHlgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNyY1ZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLCBzcmNWYWx1ZSkge1xuICBpZiAoaXNLZXkocGF0aCkgJiYgaXNTdHJpY3RDb21wYXJhYmxlKHNyY1ZhbHVlKSkge1xuICAgIHJldHVybiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSh0b0tleShwYXRoKSwgc3JjVmFsdWUpO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICB2YXIgb2JqVmFsdWUgPSBnZXQob2JqZWN0LCBwYXRoKTtcbiAgICByZXR1cm4gKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgb2JqVmFsdWUgPT09IHNyY1ZhbHVlKVxuICAgICAgPyBoYXNJbihvYmplY3QsIHBhdGgpXG4gICAgICA6IGJhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgfCBDT01QQVJFX1VOT1JERVJFRF9GTEFHKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZU1hdGNoZXNQcm9wZXJ0eTtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHJvcGVydHlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVByb3BlcnR5KGtleSkge1xuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VQcm9wZXJ0eTtcbiIsImltcG9ydCBiYXNlR2V0IGZyb20gJy4vX2Jhc2VHZXQuanMnO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVByb3BlcnR5YCB3aGljaCBzdXBwb3J0cyBkZWVwIHBhdGhzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VQcm9wZXJ0eURlZXAocGF0aCkge1xuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgcmV0dXJuIGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZVByb3BlcnR5RGVlcDtcbiIsImltcG9ydCBiYXNlUHJvcGVydHkgZnJvbSAnLi9fYmFzZVByb3BlcnR5LmpzJztcbmltcG9ydCBiYXNlUHJvcGVydHlEZWVwIGZyb20gJy4vX2Jhc2VQcm9wZXJ0eURlZXAuanMnO1xuaW1wb3J0IGlzS2V5IGZyb20gJy4vX2lzS2V5LmpzJztcbmltcG9ydCB0b0tleSBmcm9tICcuL190b0tleS5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi40LjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gW1xuICogICB7ICdhJzogeyAnYic6IDIgfSB9LFxuICogICB7ICdhJzogeyAnYic6IDEgfSB9XG4gKiBdO1xuICpcbiAqIF8ubWFwKG9iamVjdHMsIF8ucHJvcGVydHkoJ2EuYicpKTtcbiAqIC8vID0+IFsyLCAxXVxuICpcbiAqIF8ubWFwKF8uc29ydEJ5KG9iamVjdHMsIF8ucHJvcGVydHkoWydhJywgJ2InXSkpLCAnYS5iJyk7XG4gKiAvLyA9PiBbMSwgMl1cbiAqL1xuZnVuY3Rpb24gcHJvcGVydHkocGF0aCkge1xuICByZXR1cm4gaXNLZXkocGF0aCkgPyBiYXNlUHJvcGVydHkodG9LZXkocGF0aCkpIDogYmFzZVByb3BlcnR5RGVlcChwYXRoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgcHJvcGVydHk7XG4iLCJpbXBvcnQgYmFzZU1hdGNoZXMgZnJvbSAnLi9fYmFzZU1hdGNoZXMuanMnO1xuaW1wb3J0IGJhc2VNYXRjaGVzUHJvcGVydHkgZnJvbSAnLi9fYmFzZU1hdGNoZXNQcm9wZXJ0eS5qcyc7XG5pbXBvcnQgaWRlbnRpdHkgZnJvbSAnLi9pZGVudGl0eS5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuaW1wb3J0IHByb3BlcnR5IGZyb20gJy4vcHJvcGVydHkuanMnO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLml0ZXJhdGVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSBbdmFsdWU9Xy5pZGVudGl0eV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYW4gaXRlcmF0ZWUuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGl0ZXJhdGVlLlxuICovXG5mdW5jdGlvbiBiYXNlSXRlcmF0ZWUodmFsdWUpIHtcbiAgLy8gRG9uJ3Qgc3RvcmUgdGhlIGB0eXBlb2ZgIHJlc3VsdCBpbiBhIHZhcmlhYmxlIHRvIGF2b2lkIGEgSklUIGJ1ZyBpbiBTYWZhcmkgOS5cbiAgLy8gU2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTYwMzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGlkZW50aXR5O1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gaXNBcnJheSh2YWx1ZSlcbiAgICAgID8gYmFzZU1hdGNoZXNQcm9wZXJ0eSh2YWx1ZVswXSwgdmFsdWVbMV0pXG4gICAgICA6IGJhc2VNYXRjaGVzKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gcHJvcGVydHkodmFsdWUpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlSXRlcmF0ZWU7XG4iLCIvKipcbiAqIENyZWF0ZXMgYSBiYXNlIGZ1bmN0aW9uIGZvciBtZXRob2RzIGxpa2UgYF8uZm9ySW5gIGFuZCBgXy5mb3JPd25gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJhc2VGb3IoZnJvbVJpZ2h0KSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzRnVuYykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBpdGVyYWJsZSA9IE9iamVjdChvYmplY3QpLFxuICAgICAgICBwcm9wcyA9IGtleXNGdW5jKG9iamVjdCksXG4gICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgdmFyIGtleSA9IHByb3BzW2Zyb21SaWdodCA/IGxlbmd0aCA6ICsraW5kZXhdO1xuICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlQmFzZUZvcjtcbiIsImltcG9ydCBjcmVhdGVCYXNlRm9yIGZyb20gJy4vX2NyZWF0ZUJhc2VGb3IuanMnO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBiYXNlRm9yT3duYCB3aGljaCBpdGVyYXRlcyBvdmVyIGBvYmplY3RgXG4gKiBwcm9wZXJ0aWVzIHJldHVybmVkIGJ5IGBrZXlzRnVuY2AgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xudmFyIGJhc2VGb3IgPSBjcmVhdGVCYXNlRm9yKCk7XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VGb3I7XG4iLCJpbXBvcnQgYmFzZUZvciBmcm9tICcuL19iYXNlRm9yLmpzJztcbmltcG9ydCBrZXlzIGZyb20gJy4va2V5cy5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yT3duYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gYmFzZUZvck93bihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gIHJldHVybiBvYmplY3QgJiYgYmFzZUZvcihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUZvck93bjtcbiIsImltcG9ydCBpc0FycmF5TGlrZSBmcm9tICcuL2lzQXJyYXlMaWtlLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgYGJhc2VFYWNoYCBvciBgYmFzZUVhY2hSaWdodGAgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYSBjb2xsZWN0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBiYXNlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVCYXNlRWFjaChlYWNoRnVuYywgZnJvbVJpZ2h0KSB7XG4gIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgIH1cbiAgICBpZiAoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICByZXR1cm4gZWFjaEZ1bmMoY29sbGVjdGlvbiwgaXRlcmF0ZWUpO1xuICAgIH1cbiAgICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gZnJvbVJpZ2h0ID8gbGVuZ3RoIDogLTEsXG4gICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuXG4gICAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkpIHtcbiAgICAgIGlmIChpdGVyYXRlZShpdGVyYWJsZVtpbmRleF0sIGluZGV4LCBpdGVyYWJsZSkgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlQmFzZUVhY2g7XG4iLCJpbXBvcnQgYmFzZUZvck93biBmcm9tICcuL19iYXNlRm9yT3duLmpzJztcbmltcG9ydCBjcmVhdGVCYXNlRWFjaCBmcm9tICcuL19jcmVhdGVCYXNlRWFjaC5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yRWFjaGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gKi9cbnZhciBiYXNlRWFjaCA9IGNyZWF0ZUJhc2VFYWNoKGJhc2VGb3JPd24pO1xuXG5leHBvcnQgZGVmYXVsdCBiYXNlRWFjaDtcbiIsIi8qKlxuICogR2V0cyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ubGFzdChbMSwgMiwgM10pO1xuICogLy8gPT4gM1xuICovXG5mdW5jdGlvbiBsYXN0KGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgcmV0dXJuIGxlbmd0aCA/IGFycmF5W2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBsYXN0O1xuIiwiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5oYXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VIYXMob2JqZWN0LCBrZXkpIHtcbiAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlSGFzO1xuIiwiaW1wb3J0IGJhc2VIYXMgZnJvbSAnLi9fYmFzZUhhcy5qcyc7XG5pbXBvcnQgaGFzUGF0aCBmcm9tICcuL19oYXNQYXRoLmpzJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHBhdGhgIGlzIGEgZGlyZWN0IHByb3BlcnR5IG9mIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiB7ICdiJzogMiB9IH07XG4gKiB2YXIgb3RoZXIgPSBfLmNyZWF0ZSh7ICdhJzogXy5jcmVhdGUoeyAnYic6IDIgfSkgfSk7XG4gKlxuICogXy5oYXMob2JqZWN0LCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzKG9iamVjdCwgJ2EuYicpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzKG9iamVjdCwgWydhJywgJ2InXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXMob3RoZXIsICdhJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBoYXMob2JqZWN0LCBwYXRoKSB7XG4gIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGhhcztcbiIsImltcG9ydCBiYXNlR2V0IGZyb20gJy4vX2Jhc2VHZXQuanMnO1xuaW1wb3J0IGJhc2VTbGljZSBmcm9tICcuL19iYXNlU2xpY2UuanMnO1xuXG4vKipcbiAqIEdldHMgdGhlIHBhcmVudCB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl9IHBhdGggVGhlIHBhdGggdG8gZ2V0IHRoZSBwYXJlbnQgdmFsdWUgb2YuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcGFyZW50IHZhbHVlLlxuICovXG5mdW5jdGlvbiBwYXJlbnQob2JqZWN0LCBwYXRoKSB7XG4gIHJldHVybiBwYXRoLmxlbmd0aCA8IDIgPyBvYmplY3QgOiBiYXNlR2V0KG9iamVjdCwgYmFzZVNsaWNlKHBhdGgsIDAsIC0xKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHBhcmVudDtcbiIsImltcG9ydCBiYXNlSXNNYXRjaCBmcm9tICcuL19iYXNlSXNNYXRjaC5qcyc7XG5pbXBvcnQgZ2V0TWF0Y2hEYXRhIGZyb20gJy4vX2dldE1hdGNoRGF0YS5qcyc7XG5cbi8qKlxuICogUGVyZm9ybXMgYSBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIGBvYmplY3RgIGFuZCBgc291cmNlYCB0b1xuICogZGV0ZXJtaW5lIGlmIGBvYmplY3RgIGNvbnRhaW5zIGVxdWl2YWxlbnQgcHJvcGVydHkgdmFsdWVzLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIGBfLm1hdGNoZXNgIHdoZW4gYHNvdXJjZWAgaXNcbiAqIHBhcnRpYWxseSBhcHBsaWVkLlxuICpcbiAqIFBhcnRpYWwgY29tcGFyaXNvbnMgd2lsbCBtYXRjaCBlbXB0eSBhcnJheSBhbmQgZW1wdHkgb2JqZWN0IGBzb3VyY2VgXG4gKiB2YWx1ZXMgYWdhaW5zdCBhbnkgYXJyYXkgb3Igb2JqZWN0IHZhbHVlLCByZXNwZWN0aXZlbHkuIFNlZSBgXy5pc0VxdWFsYFxuICogZm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgdmFsdWUgY29tcGFyaXNvbnMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyIH07XG4gKlxuICogXy5pc01hdGNoKG9iamVjdCwgeyAnYic6IDIgfSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc01hdGNoKG9iamVjdCwgeyAnYic6IDEgfSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc01hdGNoKG9iamVjdCwgc291cmNlKSB7XG4gIHJldHVybiBvYmplY3QgPT09IHNvdXJjZSB8fCBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgZ2V0TWF0Y2hEYXRhKHNvdXJjZSkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc01hdGNoO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzVW5kZWZpbmVkKHZvaWQgMCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1VuZGVmaW5lZChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc1VuZGVmaW5lZDtcbiIsIi8qKiBFcnJvciBtZXNzYWdlIGNvbnN0YW50cy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgbmVnYXRlcyB0aGUgcmVzdWx0IG9mIHRoZSBwcmVkaWNhdGUgYGZ1bmNgLiBUaGVcbiAqIGBmdW5jYCBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzIG9mIHRoZVxuICogY3JlYXRlZCBmdW5jdGlvbi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgcHJlZGljYXRlIHRvIG5lZ2F0ZS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG5lZ2F0ZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIGlzRXZlbihuKSB7XG4gKiAgIHJldHVybiBuICUgMiA9PSAwO1xuICogfVxuICpcbiAqIF8uZmlsdGVyKFsxLCAyLCAzLCA0LCA1LCA2XSwgXy5uZWdhdGUoaXNFdmVuKSk7XG4gKiAvLyA9PiBbMSwgMywgNV1cbiAqL1xuZnVuY3Rpb24gbmVnYXRlKHByZWRpY2F0ZSkge1xuICBpZiAodHlwZW9mIHByZWRpY2F0ZSAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6IHJldHVybiAhcHJlZGljYXRlLmNhbGwodGhpcyk7XG4gICAgICBjYXNlIDE6IHJldHVybiAhcHJlZGljYXRlLmNhbGwodGhpcywgYXJnc1swXSk7XG4gICAgICBjYXNlIDI6IHJldHVybiAhcHJlZGljYXRlLmNhbGwodGhpcywgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICBjYXNlIDM6IHJldHVybiAhcHJlZGljYXRlLmNhbGwodGhpcywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgfVxuICAgIHJldHVybiAhcHJlZGljYXRlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBuZWdhdGU7XG4iLCJpbXBvcnQgY2FzdFBhdGggZnJvbSAnLi9fY2FzdFBhdGguanMnO1xuaW1wb3J0IGxhc3QgZnJvbSAnLi9sYXN0LmpzJztcbmltcG9ydCBwYXJlbnQgZnJvbSAnLi9fcGFyZW50LmpzJztcbmltcG9ydCB0b0tleSBmcm9tICcuL190b0tleS5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5zZXRgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHByb3BlcnR5IHBhdGggdG8gdW5zZXQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHByb3BlcnR5IGlzIGRlbGV0ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZVVuc2V0KG9iamVjdCwgcGF0aCkge1xuICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcbiAgb2JqZWN0ID0gcGFyZW50KG9iamVjdCwgcGF0aCk7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCB8fCBkZWxldGUgb2JqZWN0W3RvS2V5KGxhc3QocGF0aCkpXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZVVuc2V0O1xuIiwiaW1wb3J0IGFzc2lnblZhbHVlIGZyb20gJy4vX2Fzc2lnblZhbHVlLmpzJztcbmltcG9ydCBjYXN0UGF0aCBmcm9tICcuL19jYXN0UGF0aC5qcyc7XG5pbXBvcnQgaXNJbmRleCBmcm9tICcuL19pc0luZGV4LmpzJztcbmltcG9ydCBpc09iamVjdCBmcm9tICcuL2lzT2JqZWN0LmpzJztcbmltcG9ydCB0b0tleSBmcm9tICcuL190b0tleS5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2V0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBwYXRoIGNyZWF0aW9uLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gYmFzZVNldChvYmplY3QsIHBhdGgsIHZhbHVlLCBjdXN0b21pemVyKSB7XG4gIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cbiAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCxcbiAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDEsXG4gICAgICBuZXN0ZWQgPSBvYmplY3Q7XG5cbiAgd2hpbGUgKG5lc3RlZCAhPSBudWxsICYmICsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIga2V5ID0gdG9LZXkocGF0aFtpbmRleF0pLFxuICAgICAgICBuZXdWYWx1ZSA9IHZhbHVlO1xuXG4gICAgaWYgKGtleSA9PT0gJ19fcHJvdG9fXycgfHwga2V5ID09PSAnY29uc3RydWN0b3InIHx8IGtleSA9PT0gJ3Byb3RvdHlwZScpIHtcbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfVxuXG4gICAgaWYgKGluZGV4ICE9IGxhc3RJbmRleCkge1xuICAgICAgdmFyIG9ialZhbHVlID0gbmVzdGVkW2tleV07XG4gICAgICBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXIgPyBjdXN0b21pemVyKG9ialZhbHVlLCBrZXksIG5lc3RlZCkgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBuZXdWYWx1ZSA9IGlzT2JqZWN0KG9ialZhbHVlKVxuICAgICAgICAgID8gb2JqVmFsdWVcbiAgICAgICAgICA6IChpc0luZGV4KHBhdGhbaW5kZXggKyAxXSkgPyBbXSA6IHt9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXNzaWduVmFsdWUobmVzdGVkLCBrZXksIG5ld1ZhbHVlKTtcbiAgICBuZXN0ZWQgPSBuZXN0ZWRba2V5XTtcbiAgfVxuICByZXR1cm4gb2JqZWN0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlU2V0O1xuIiwiaW1wb3J0IGJhc2VHZXQgZnJvbSAnLi9fYmFzZUdldC5qcyc7XG5pbXBvcnQgYmFzZVNldCBmcm9tICcuL19iYXNlU2V0LmpzJztcbmltcG9ydCBjYXN0UGF0aCBmcm9tICcuL19jYXN0UGF0aC5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgIGBfLnBpY2tCeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIHByb3BlcnR5LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBwcmVkaWNhdGUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBwYXRocy5sZW5ndGgsXG4gICAgICByZXN1bHQgPSB7fTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBwYXRoID0gcGF0aHNbaW5kZXhdLFxuICAgICAgICB2YWx1ZSA9IGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcblxuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIHBhdGgpKSB7XG4gICAgICBiYXNlU2V0KHJlc3VsdCwgY2FzdFBhdGgocGF0aCwgb2JqZWN0KSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlUGlja0J5O1xuIiwiaW1wb3J0IGFycmF5TWFwIGZyb20gJy4vX2FycmF5TWFwLmpzJztcbmltcG9ydCBiYXNlSXRlcmF0ZWUgZnJvbSAnLi9fYmFzZUl0ZXJhdGVlLmpzJztcbmltcG9ydCBiYXNlUGlja0J5IGZyb20gJy4vX2Jhc2VQaWNrQnkuanMnO1xuaW1wb3J0IGdldEFsbEtleXNJbiBmcm9tICcuL19nZXRBbGxLZXlzSW4uanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBgb2JqZWN0YCBwcm9wZXJ0aWVzIGBwcmVkaWNhdGVgIHJldHVybnNcbiAqIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6ICh2YWx1ZSwga2V5KS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgcHJvcGVydHkuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAqXG4gKiBfLnBpY2tCeShvYmplY3QsIF8uaXNOdW1iZXIpO1xuICogLy8gPT4geyAnYSc6IDEsICdjJzogMyB9XG4gKi9cbmZ1bmN0aW9uIHBpY2tCeShvYmplY3QsIHByZWRpY2F0ZSkge1xuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgdmFyIHByb3BzID0gYXJyYXlNYXAoZ2V0QWxsS2V5c0luKG9iamVjdCksIGZ1bmN0aW9uKHByb3ApIHtcbiAgICByZXR1cm4gW3Byb3BdO1xuICB9KTtcbiAgcHJlZGljYXRlID0gYmFzZUl0ZXJhdGVlKHByZWRpY2F0ZSk7XG4gIHJldHVybiBiYXNlUGlja0J5KG9iamVjdCwgcHJvcHMsIGZ1bmN0aW9uKHZhbHVlLCBwYXRoKSB7XG4gICAgcmV0dXJuIHByZWRpY2F0ZSh2YWx1ZSwgcGF0aFswXSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBwaWNrQnk7XG4iLCJpbXBvcnQgYmFzZUl0ZXJhdGVlIGZyb20gJy4vX2Jhc2VJdGVyYXRlZS5qcyc7XG5pbXBvcnQgbmVnYXRlIGZyb20gJy4vbmVnYXRlLmpzJztcbmltcG9ydCBwaWNrQnkgZnJvbSAnLi9waWNrQnkuanMnO1xuXG4vKipcbiAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5waWNrQnlgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZlxuICogdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2YgYG9iamVjdGAgdGhhdFxuICogYHByZWRpY2F0ZWAgZG9lc24ndCByZXR1cm4gdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdHdvXG4gKiBhcmd1bWVudHM6ICh2YWx1ZSwga2V5KS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgcHJvcGVydHkuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAqXG4gKiBfLm9taXRCeShvYmplY3QsIF8uaXNOdW1iZXIpO1xuICogLy8gPT4geyAnYic6ICcyJyB9XG4gKi9cbmZ1bmN0aW9uIG9taXRCeShvYmplY3QsIHByZWRpY2F0ZSkge1xuICByZXR1cm4gcGlja0J5KG9iamVjdCwgbmVnYXRlKGJhc2VJdGVyYXRlZShwcmVkaWNhdGUpKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG9taXRCeTtcbiIsImltcG9ydCBiYXNlU2V0IGZyb20gJy4vX2Jhc2VTZXQuanMnO1xuXG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC4gSWYgYSBwb3J0aW9uIG9mIGBwYXRoYCBkb2Vzbid0IGV4aXN0LFxuICogaXQncyBjcmVhdGVkLiBBcnJheXMgYXJlIGNyZWF0ZWQgZm9yIG1pc3NpbmcgaW5kZXggcHJvcGVydGllcyB3aGlsZSBvYmplY3RzXG4gKiBhcmUgY3JlYXRlZCBmb3IgYWxsIG90aGVyIG1pc3NpbmcgcHJvcGVydGllcy4gVXNlIGBfLnNldFdpdGhgIHRvIGN1c3RvbWl6ZVxuICogYHBhdGhgIGNyZWF0aW9uLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy43LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAqXG4gKiBfLnNldChvYmplY3QsICdhWzBdLmIuYycsIDQpO1xuICogY29uc29sZS5sb2cob2JqZWN0LmFbMF0uYi5jKTtcbiAqIC8vID0+IDRcbiAqXG4gKiBfLnNldChvYmplY3QsIFsneCcsICcwJywgJ3knLCAneiddLCA1KTtcbiAqIGNvbnNvbGUubG9nKG9iamVjdC54WzBdLnkueik7XG4gKiAvLyA9PiA1XG4gKi9cbmZ1bmN0aW9uIHNldChvYmplY3QsIHBhdGgsIHZhbHVlKSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IGJhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNldDtcbiIsImltcG9ydCBiYXNlRWFjaCBmcm9tICcuL19iYXNlRWFjaC5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29tZWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgZWxlbWVudCBwYXNzZXMgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VTb21lKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICB2YXIgcmVzdWx0O1xuXG4gIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgIHJlc3VsdCA9IHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgIHJldHVybiAhcmVzdWx0O1xuICB9KTtcbiAgcmV0dXJuICEhcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlU29tZTtcbiIsImltcG9ydCBhcnJheVNvbWUgZnJvbSAnLi9fYXJyYXlTb21lLmpzJztcbmltcG9ydCBiYXNlSXRlcmF0ZWUgZnJvbSAnLi9fYmFzZUl0ZXJhdGVlLmpzJztcbmltcG9ydCBiYXNlU29tZSBmcm9tICcuL19iYXNlU29tZS5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuaW1wb3J0IGlzSXRlcmF0ZWVDYWxsIGZyb20gJy4vX2lzSXRlcmF0ZWVDYWxsLmpzJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yICoqYW55KiogZWxlbWVudCBvZiBgY29sbGVjdGlvbmAuXG4gKiBJdGVyYXRpb24gaXMgc3RvcHBlZCBvbmNlIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5LiBUaGUgcHJlZGljYXRlIGlzXG4gKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnNvbWUoW251bGwsIDAsICd5ZXMnLCBmYWxzZV0sIEJvb2xlYW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIHZhciB1c2VycyA9IFtcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogdHJ1ZSB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhY3RpdmUnOiBmYWxzZSB9XG4gKiBdO1xuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLnNvbWUodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLnNvbWUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uc29tZSh1c2VycywgJ2FjdGl2ZScpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBzb21lKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpIHtcbiAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTb21lIDogYmFzZVNvbWU7XG4gIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSkge1xuICAgIHByZWRpY2F0ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBiYXNlSXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNvbWU7XG4iLCJpbXBvcnQgYmFzZVVuc2V0IGZyb20gJy4vX2Jhc2VVbnNldC5qcyc7XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgcHJvcGVydHkgYXQgYHBhdGhgIG9mIGBvYmplY3RgLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gdW5zZXQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHByb3BlcnR5IGlzIGRlbGV0ZWQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiA3IH0gfV0gfTtcbiAqIF8udW5zZXQob2JqZWN0LCAnYVswXS5iLmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBjb25zb2xlLmxvZyhvYmplY3QpO1xuICogLy8gPT4geyAnYSc6IFt7ICdiJzoge30gfV0gfTtcbiAqXG4gKiBfLnVuc2V0KG9iamVjdCwgWydhJywgJzAnLCAnYicsICdjJ10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIGNvbnNvbGUubG9nKG9iamVjdCk7XG4gKiAvLyA9PiB7ICdhJzogW3sgJ2InOiB7fSB9XSB9O1xuICovXG5mdW5jdGlvbiB1bnNldChvYmplY3QsIHBhdGgpIHtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdHJ1ZSA6IGJhc2VVbnNldChvYmplY3QsIHBhdGgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB1bnNldDtcbiIsImltcG9ydCB7IGlzTWF0Y2gsIHNvbWUsIHNldCwgZ2V0LCBjbG9uZURlZXAsIGhhcywgbWVyZ2UsIG1lcmdlV2l0aCwgaXNVbmRlZmluZWQsIG9taXRCeSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5leHBvcnQgdmFyIF9zZXQgPSBzZXQ7XG5leHBvcnQgdmFyIF9nZXQgPSBnZXQ7XG5leHBvcnQgdmFyIF9jbG9uZURlZXAgPSBjbG9uZURlZXA7XG5leHBvcnQgdmFyIF9oYXMgPSBoYXM7XG5leHBvcnQgdmFyIF9tZXJnZSA9IG1lcmdlO1xuZXhwb3J0IHZhciBfbWVyZ2VXaXRoID0gbWVyZ2VXaXRoO1xuZXhwb3J0IHZhciBfaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDtcbmV4cG9ydCB2YXIgX29taXRCeSA9IG9taXRCeTtcbmV4cG9ydCB2YXIgX3NvbWUgPSBzb21lO1xuZXhwb3J0IHZhciBfaXNNYXRjaCA9IGlzTWF0Y2g7XG5leHBvcnQgdmFyIGlzT2JqZWN0ID0gZnVuY3Rpb24gaXNPYmplY3QoZGF0YSkge1xuICB2YXIgc3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRhdGEpO1xuICByZXR1cm4gc3RyLmluZGV4T2YoJ09iamVjdCcpID4gLTE7XG59O1xuZXhwb3J0IHZhciBpc0FycmF5ID0gZnVuY3Rpb24gaXNBcnJheShkYXRhKSB7XG4gIHZhciBzdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZGF0YSk7XG4gIHJldHVybiBzdHIuaW5kZXhPZignQXJyYXknKSA+IC0xO1xufTtcbmV4cG9ydCB2YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24oZGF0YSkge1xuICByZXR1cm4gdHlwZW9mIGRhdGEgPT09ICdmdW5jdGlvbic7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGlzVXJsKHN0cmluZykge1xuICB2YXIgcHJvdG9jb2xSRSA9IC9eKD86XFx3KzopP1xcL1xcLyhcXFMrKSQvO1xuICAvLyBjb25zdCBkb21haW5SRSA9IC9eW15cXHNcXC5dK1xcLlxcU3syLH0kLztcbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBwcm90b2NvbFJFLnRlc3Qoc3RyaW5nKTtcbn1cbmV4cG9ydCB2YXIgaXNOdW1iZXIgPSBmdW5jdGlvbiBpc051bWJlcihzdHIpIHtcbiAgcmV0dXJuICFpc05hTihOdW1iZXIoc3RyKSk7XG59O1xuZXhwb3J0IHZhciBnZXRBcnJheSA9IGZ1bmN0aW9uIGdldEFycmF5KGFycikge1xuICB2YXIgZGVmYXVsdFZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBbXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbiAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbn07XG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0KGZvcm1hdCkge1xuICB2YXIgZGF0ZUZvcm1hdDtcbiAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICBjYXNlICdkYXRlJzpcbiAgICAgIGRhdGVGb3JtYXQgPSAnWVlZWS1NTS1ERCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd0aW1lJzpcbiAgICAgIGRhdGVGb3JtYXQgPSAnSEg6bW06c3MnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZGF0ZVRpbWUnOlxuICAgICAgZGF0ZUZvcm1hdCA9ICdZWVlZLU1NLUREIEhIOm1tOnNzJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgZGF0ZUZvcm1hdCA9ICdZWVlZLXcnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAneWVhcic6XG4gICAgICBkYXRlRm9ybWF0ID0gJ1lZWVknO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncXVhcnRlcic6XG4gICAgICBkYXRlRm9ybWF0ID0gJ1lZWVktUSc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdtb250aCc6XG4gICAgICBkYXRlRm9ybWF0ID0gJ1lZWVktTU0nO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIGRhdGVUaW1lXG4gICAgICBpZiAodHlwZW9mIGZvcm1hdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZGF0ZUZvcm1hdCA9IGZvcm1hdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGVGb3JtYXQgPSAnWVlZWS1NTS1ERCc7XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIGRhdGVGb3JtYXQ7XG59XG4vLyBUT0RPOiB0byBzdXBwb3J0IGNhc2UgdGhhdCBpdGVtIGlzIG5vdCBhbiBvYmplY3RcbmV4cG9ydCBmdW5jdGlvbiBpc09ialR5cGUoc2NoZW1hKSB7XG4gIC8vcmV0dXJuIHNjaGVtYT8udHlwZSA9PT0gJ29iamVjdCcgJiYgc2NoZW1hLnByb3BlcnRpZXMgJiYgIXNjaGVtYS53aWRnZXQ7XG4gIHJldHVybiAoc2NoZW1hID09PSBudWxsIHx8IHNjaGVtYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2NoZW1hLnR5cGUpID09PSAnb2JqZWN0JyAmJiAoc2NoZW1hID09PSBudWxsIHx8IHNjaGVtYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2NoZW1hLnByb3BlcnRpZXMpICYmIChzY2hlbWEgPT09IG51bGwgfHwgc2NoZW1hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzY2hlbWEud2lkZ2V0VHlwZSkgIT09ICdmaWVsZCc7XG59XG47XG5leHBvcnQgZnVuY3Rpb24gaXNMaXN0VHlwZShzY2hlbWEpIHtcbiAgcmV0dXJuIChzY2hlbWEgPT09IG51bGwgfHwgc2NoZW1hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzY2hlbWEudHlwZSkgPT09ICdhcnJheScgJiYgaXNPYmpUeXBlKHNjaGVtYSA9PT0gbnVsbCB8fCBzY2hlbWEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNjaGVtYS5pdGVtcykgJiYgKHNjaGVtYSA9PT0gbnVsbCB8fCBzY2hlbWEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNjaGVtYS5lbnVtKSA9PT0gdW5kZWZpbmVkO1xufVxuO1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2hlY2tCb3hUeXBlKHNjaGVtYSwgcmVhZE9ubHkpIHtcbiAgaWYgKHJlYWRPbmx5KSByZXR1cm4gZmFsc2U7XG4gIGlmIChzY2hlbWEud2lkZ2V0ID09PSAnY2hlY2tib3gnKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHNjaGVtYSAmJiBzY2hlbWEudHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgaWYgKHNjaGVtYS5lbnVtKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHNjaGVtYS53aWRnZXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5leHBvcnQgdmFyIHZhbHVlUmVtb3ZlVW5kZWZpbmVkID0gZnVuY3Rpb24gdmFsdWVSZW1vdmVVbmRlZmluZWQodmFsdWVzLCBub3RGaWx0ZXIpIHtcbiAgdmFyIHJlY3Vyc2lvbkFycmF5ID0gZnVuY3Rpb24gcmVjdXJzaW9uQXJyYXkobGlzdCkge1xuICAgIHZhciByZXN1bHQgPSBsaXN0Lm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgaWYgKGlzT2JqZWN0KGl0ZW0pKSB7XG4gICAgICAgIHJldHVybiByZWN1cnNpb25PYmooaXRlbSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheShpdGVtKSkge1xuICAgICAgICByZXR1cm4gcmVjdXJzaW9uQXJyYXkoaXRlbSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9KTtcbiAgICAvLyDmlbDnu4TkvJrlj5jmiJDlr7nosaHvvIzmhJ/op4kgdW5kZXJmaW5lZCDkuI3og73liZTpmaTvvIzkvJrlvbHlk43pobrluo9cbiAgICAvLyByZXN1bHQgPSBvbWl0QnkocmVzdWx0LCBpc1VuZGVmaW5lZCk7XG4gICAgaWYgKE9iamVjdC5rZXlzKHJlc3VsdCkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICB2YXIgcmVjdXJzaW9uT2JqID0gZnVuY3Rpb24gcmVjdXJzaW9uT2JqKF9kYXRhKSB7XG4gICAgdmFyIGRhdGEgPSBvbWl0QnkoX2RhdGEsIGlzVW5kZWZpbmVkKTtcbiAgICBPYmplY3Qua2V5cyhkYXRhKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBpdGVtID0gZGF0YVtrZXldO1xuICAgICAgaWYgKGlzT2JqZWN0KGl0ZW0pKSB7XG4gICAgICAgIGRhdGFba2V5XSA9IHJlY3Vyc2lvbk9iaihpdGVtKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0FycmF5KGl0ZW0pKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWN1cnNpb25BcnJheShpdGVtKSB8fCBbXTtcbiAgICAgICAgZGF0YVtrZXldID0gbm90RmlsdGVyID8gcmVzdWx0IDogcmVzdWx0LmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgIHJldHVybiBpdGVtICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGRhdGEgPSBvbWl0QnkoZGF0YSwgaXNVbmRlZmluZWQpO1xuICAgIGlmIChPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9O1xuICByZXR1cm4gcmVjdXJzaW9uT2JqKHZhbHVlcykgfHwge307XG59O1xuZXhwb3J0IHZhciB0cmFuc2xhdGlvbiA9IGZ1bmN0aW9uIHRyYW5zbGF0aW9uKGNvbmZpZ0N0eCkge1xuICByZXR1cm4gZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBsb2NhbGUgPSBjb25maWdDdHggPT09IG51bGwgfHwgY29uZmlnQ3R4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWdDdHgubG9jYWxlLkZvcm1SZW5kZXI7XG4gICAgcmV0dXJuIGxvY2FsZVtrZXldO1xuICB9O1xufTtcbmV4cG9ydCB2YXIgaGFzRnVuY1Byb3BlcnR5ID0gZnVuY3Rpb24gaGFzRnVuY1Byb3BlcnR5KG9iaikge1xuICByZXR1cm4gX3NvbWUob2JqLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICByZXR1cm4gaGFzRnVuY1Byb3BlcnR5KHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcbn07IiwiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmV4cG9ydCB2YXIgRlJDb250ZXh0ID0gLyojX19QVVJFX18qL2NyZWF0ZUNvbnRleHQobnVsbCk7XG5leHBvcnQgdmFyIENvbmZpZ0NvbnRleHQgPSAvKiNfX1BVUkVfXyovY3JlYXRlQ29udGV4dChudWxsKTsiLCJpbXBvcnQgeyBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbnZhciBkaXNwbGF5VHlwZUVudW0gPSB7XG4gIGNvbHVtbjogJ3ZlcnRpY2FsJyxcbiAgcm93OiAnaG9yaXpvbnRhbCcsXG4gIGlubGluZTogJ2lubGluZSdcbn07XG52YXIgdHJhbnNmb3JtUHJvcHMgPSBmdW5jdGlvbiB0cmFuc2Zvcm1Qcm9wcyhwcm9wcykge1xuICB2YXIgc2NoZW1hID0gcHJvcHMuc2NoZW1hLFxuICAgIGJlZm9yZUZpbmlzaCA9IHByb3BzLmJlZm9yZUZpbmlzaCxcbiAgICBvbk1vdW50ID0gcHJvcHMub25Nb3VudCxcbiAgICBfcHJvcHMkZGlzcGxheVR5cGUgPSBwcm9wcy5kaXNwbGF5VHlwZSxcbiAgICBkaXNwbGF5VHlwZSA9IF9wcm9wcyRkaXNwbGF5VHlwZSA9PT0gdm9pZCAwID8gJ2NvbHVtbicgOiBfcHJvcHMkZGlzcGxheVR5cGUsXG4gICAgd2F0Y2ggPSBwcm9wcy53YXRjaCxcbiAgICBfcHJvcHMkcmVtb3ZlSGlkZGVuRGEgPSBwcm9wcy5yZW1vdmVIaWRkZW5EYXRhLFxuICAgIHJlbW92ZUhpZGRlbkRhdGEgPSBfcHJvcHMkcmVtb3ZlSGlkZGVuRGEgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkcmVtb3ZlSGlkZGVuRGEsXG4gICAgcmVhZE9ubHkgPSBwcm9wcy5yZWFkT25seSxcbiAgICBfcHJvcHMkY29sdW1uID0gcHJvcHMuY29sdW1uLFxuICAgIGNvbHVtbiA9IF9wcm9wcyRjb2x1bW4gPT09IHZvaWQgMCA/IDEgOiBfcHJvcHMkY29sdW1uLFxuICAgIG1hcHBpbmcgPSBwcm9wcy5tYXBwaW5nLFxuICAgIGRlYnVnQ3NzID0gcHJvcHMuZGVidWdDc3MsXG4gICAgbG9jYWxlID0gcHJvcHMubG9jYWxlLFxuICAgIGNvbmZpZ1Byb3ZpZGVyID0gcHJvcHMuY29uZmlnUHJvdmlkZXIsXG4gICAgdmFsaWRhdGVNZXNzYWdlcyA9IHByb3BzLnZhbGlkYXRlTWVzc2FnZXMsXG4gICAgZGVidWcgPSBwcm9wcy5kZWJ1ZyxcbiAgICBpZCA9IHByb3BzLmlkLFxuICAgIGxhYmVsV2lkdGggPSBwcm9wcy5sYWJlbFdpZHRoLFxuICAgIG1heFdpZHRoID0gcHJvcHMubWF4V2lkdGgsXG4gICAgZm9ybSA9IHByb3BzLmZvcm0sXG4gICAgb25GaW5pc2ggPSBwcm9wcy5vbkZpbmlzaCxcbiAgICBvbkZpbmlzaEZhaWxlZCA9IHByb3BzLm9uRmluaXNoRmFpbGVkLFxuICAgIGZvb3RlciA9IHByb3BzLmZvb3RlcixcbiAgICBvcGVyYXRlRXh0cmEgPSBwcm9wcy5vcGVyYXRlRXh0cmEsXG4gICAgbG9nT25Nb3VudCA9IHByb3BzLmxvZ09uTW91bnQsXG4gICAgbG9nT25TdWJtaXQgPSBwcm9wcy5sb2dPblN1Ym1pdCxcbiAgICBsYWJlbENvbCA9IHByb3BzLmxhYmVsQ29sLFxuICAgIGZpZWxkQ29sID0gcHJvcHMuZmllbGRDb2wsXG4gICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgdmFsaWRhdGVUcmlnZ2VyID0gcHJvcHMudmFsaWRhdGVUcmlnZ2VyLFxuICAgIG90aGVyUHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInNjaGVtYVwiLCBcImJlZm9yZUZpbmlzaFwiLCBcIm9uTW91bnRcIiwgXCJkaXNwbGF5VHlwZVwiLCBcIndhdGNoXCIsIFwicmVtb3ZlSGlkZGVuRGF0YVwiLCBcInJlYWRPbmx5XCIsIFwiY29sdW1uXCIsIFwibWFwcGluZ1wiLCBcImRlYnVnQ3NzXCIsIFwibG9jYWxlXCIsIFwiY29uZmlnUHJvdmlkZXJcIiwgXCJ2YWxpZGF0ZU1lc3NhZ2VzXCIsIFwiZGVidWdcIiwgXCJpZFwiLCBcImxhYmVsV2lkdGhcIiwgXCJtYXhXaWR0aFwiLCBcImZvcm1cIiwgXCJvbkZpbmlzaFwiLCBcIm9uRmluaXNoRmFpbGVkXCIsIFwiZm9vdGVyXCIsIFwib3BlcmF0ZUV4dHJhXCIsIFwibG9nT25Nb3VudFwiLCBcImxvZ09uU3VibWl0XCIsIFwibGFiZWxDb2xcIiwgXCJmaWVsZENvbFwiLCBcImRpc2FibGVkXCIsIFwiY2xhc3NOYW1lXCIsIFwidmFsaWRhdGVUcmlnZ2VyXCJdKTtcbiAgdmFyIGZvcm1Qcm9wcyA9IE9iamVjdC5hc3NpZ24oe30sIG90aGVyUHJvcHMpO1xuICBpZiAoZGlzcGxheVR5cGUpIHtcbiAgICBmb3JtUHJvcHMubGF5b3V0ID0gZGlzcGxheVR5cGVFbnVtW2Rpc3BsYXlUeXBlXSB8fCAnaG9yaXpvbnRhbCc7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBmb3JtUHJvcHM6IGZvcm1Qcm9wcyxcbiAgICBzY2hlbWE6IHNjaGVtYSxcbiAgICBkaXNwbGF5VHlwZTogZGlzcGxheVR5cGUsXG4gICAgb25GaW5pc2g6IG9uRmluaXNoLFxuICAgIGJlZm9yZUZpbmlzaDogYmVmb3JlRmluaXNoLFxuICAgIG9uTW91bnQ6IG9uTW91bnQsXG4gICAgd2F0Y2g6IHdhdGNoLFxuICAgIHJlYWRPbmx5OiByZWFkT25seSxcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgY29sdW1uOiBjb2x1bW4sXG4gICAgbWFwcGluZzogbWFwcGluZyxcbiAgICBkZWJ1Z0NzczogZGVidWdDc3MsXG4gICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgY29uZmlnUHJvdmlkZXI6IGNvbmZpZ1Byb3ZpZGVyLFxuICAgIGZvb3RlcjogZm9vdGVyLFxuICAgIGZvcm06IGZvcm0sXG4gICAgbGFiZWxXaWR0aDogbGFiZWxXaWR0aCxcbiAgICB2YWxpZGF0ZU1lc3NhZ2VzOiB2YWxpZGF0ZU1lc3NhZ2VzLFxuICAgIGRlYnVnOiBkZWJ1ZyxcbiAgICBpZDogaWQsXG4gICAgb25GaW5pc2hGYWlsZWQ6IG9uRmluaXNoRmFpbGVkLFxuICAgIHJlbW92ZUhpZGRlbkRhdGE6IHJlbW92ZUhpZGRlbkRhdGEsXG4gICAgb3BlcmF0ZUV4dHJhOiBvcGVyYXRlRXh0cmEsXG4gICAgbG9nT25Nb3VudDogbG9nT25Nb3VudCxcbiAgICBsb2dPblN1Ym1pdDogbG9nT25TdWJtaXQsXG4gICAgbGFiZWxDb2w6IGxhYmVsQ29sLFxuICAgIGZpZWxkQ29sOiBmaWVsZENvbCxcbiAgICBtYXhXaWR0aDogbWF4V2lkdGgsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgdmFsaWRhdGVUcmlnZ2VyOiB2YWxpZGF0ZVRyaWdnZXJcbiAgfTtcbn07XG5leHBvcnQgZGVmYXVsdCB0cmFuc2Zvcm1Qcm9wczsiLCJmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfSwgX3R5cGVvZihvYmopOyB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkoYXJnKSB7IHZhciBrZXkgPSBfdG9QcmltaXRpdmUoYXJnLCBcInN0cmluZ1wiKTsgcmV0dXJuIF90eXBlb2Yoa2V5KSA9PT0gXCJzeW1ib2xcIiA/IGtleSA6IFN0cmluZyhrZXkpOyB9XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUoaW5wdXQsIGhpbnQpIHsgaWYgKF90eXBlb2YoaW5wdXQpICE9PSBcIm9iamVjdFwiIHx8IGlucHV0ID09PSBudWxsKSByZXR1cm4gaW5wdXQ7IHZhciBwcmltID0gaW5wdXRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHByaW0gIT09IHVuZGVmaW5lZCkgeyB2YXIgcmVzID0gcHJpbS5jYWxsKGlucHV0LCBoaW50IHx8IFwiZGVmYXVsdFwiKTsgaWYgKF90eXBlb2YocmVzKSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHJlczsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoaGludCA9PT0gXCJzdHJpbmdcIiA/IFN0cmluZyA6IE51bWJlcikoaW5wdXQpOyB9XG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7IH1cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KGFycik7IH1cbmZ1bmN0aW9uIF90b0FycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfVxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldOyByZXR1cm4gYXJyMjsgfVxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7IGlmICh0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIGl0ZXJbU3ltYm9sLml0ZXJhdG9yXSAhPSBudWxsIHx8IGl0ZXJbXCJAQGl0ZXJhdG9yXCJdICE9IG51bGwpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpOyB9XG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cbmltcG9ydCB7IGdldCwgc2V0LCB1bnNldCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBfY2xvbmVEZWVwLCBpc0FycmF5LCBpc09iamVjdCB9IGZyb20gJy4uL3V0aWxzL2luZGV4JztcbnZhciBpc011bHRpQmluZCA9IGZ1bmN0aW9uIGlzTXVsdGlCaW5kKGFycmF5KSB7XG4gIHJldHVybiBpc0FycmF5KGFycmF5KSAmJiBhcnJheS5ldmVyeShmdW5jdGlvbiAoaXRlbSkge1xuICAgIHJldHVybiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZyc7XG4gIH0pO1xufTtcbi8vIE5lZWQgdG8gY29uc2lkZXIgbGlzdCBuZXN0ZWQgY29udHJvbHNcbnZhciB0cmFuc2Zvcm1QYXRoID0gZnVuY3Rpb24gdHJhbnNmb3JtUGF0aChwYXRoKSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIHJlY3Vyc2lvbiA9IGZ1bmN0aW9uIHJlY3Vyc2lvbihzdHIpIHtcbiAgICB2YXIgaW5kZXggPSBzdHIuaW5kZXhPZignW10nKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXN1bHQucHVzaChzdHIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXN1bHQucHVzaChzdHIuc3Vic3RyaW5nKDAsIGluZGV4KSk7XG4gICAgcmVjdXJzaW9uKHN0ci5zdWJzdHJpbmcoaW5kZXggKyAzKSk7XG4gIH07XG4gIHJlY3Vyc2lvbihwYXRoKTtcbiAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gcmVzdWx0WzBdO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xudmFyIHRyYW5zZm9ybVZhbHVlVG9CaW5kID0gZnVuY3Rpb24gdHJhbnNmb3JtVmFsdWVUb0JpbmQoZGF0YSwgcGF0aCwgYmluZCkge1xuICBpZiAoYmluZCA9PT0gZmFsc2UpIHtcbiAgICB1bnNldChkYXRhLCBwYXRoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHR5cGVvZiBiaW5kID09PSAnc3RyaW5nJykge1xuICAgIHZhciB2YWx1ZSA9IGdldChkYXRhLCBwYXRoKTtcbiAgICB2YXIgcHJlVmFsdWUgPSBnZXQoZGF0YSwgYmluZCk7XG4gICAgaWYgKGlzT2JqZWN0KHByZVZhbHVlKSkge1xuICAgICAgdmFsdWUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZVZhbHVlKSwgdmFsdWUpO1xuICAgIH1cbiAgICBzZXQoZGF0YSwgYmluZCwgdmFsdWUpO1xuICAgIHVuc2V0KGRhdGEsIHBhdGgpO1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBUaGUgYXJyYXkgaXMgY29udmVydGVkIHRvIG11bHRpcGxlIGZpZWxkcy5cbiAgaWYgKGlzTXVsdGlCaW5kKGJpbmQpKSB7XG4gICAgdmFyIF92YWx1ZSA9IGdldChkYXRhLCBwYXRoKTtcbiAgICB1bnNldChkYXRhLCBwYXRoKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShfdmFsdWUpKSB7XG4gICAgICBfdmFsdWUuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICAgICAgdmFyIGJpbmRQYXRoID0gYmluZFtpbmRleF07XG4gICAgICAgIGJpbmRQYXRoICYmIHNldChkYXRhLCBiaW5kUGF0aCwgaXRlbSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn07XG52YXIgdHJhbnNmb3JtQmluZFRvVmFsdWUgPSBmdW5jdGlvbiB0cmFuc2Zvcm1CaW5kVG9WYWx1ZShkYXRhLCBwYXRoLCBiaW5kKSB7XG4gIGlmICh0eXBlb2YgYmluZCA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgdmFsdWUgPSBnZXQoZGF0YSwgYmluZCk7XG4gICAgdmFyIHByZVZhbHVlID0gZ2V0KGRhdGEsIHBhdGgpO1xuICAgIGlmIChpc09iamVjdChwcmVWYWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmVWYWx1ZSksIHZhbHVlKTtcbiAgICB9XG4gICAgc2V0KGRhdGEsIHBhdGgsIHZhbHVlKTtcbiAgICB1bnNldChkYXRhLCBiaW5kKTtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gVGhlIGFycmF5IGlzIGNvbnZlcnRlZCB0byBtdWx0aXBsZSBmaWVsZHMuXG4gIGlmIChpc011bHRpQmluZChiaW5kKSkge1xuICAgIHZhciBfdmFsdWUyID0gW107XG4gICAgYmluZC5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBiaW5kVmFsdWUgPSBnZXQoZGF0YSwga2V5KTtcbiAgICAgIC8vIGlmIChiaW5kVmFsdWUgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyAgIHZhbHVlLnB1c2goYmluZFZhbHVlKTtcbiAgICAgIC8vIH1cbiAgICAgIF92YWx1ZTIucHVzaChiaW5kVmFsdWUpO1xuICAgICAgdW5zZXQoZGF0YSwga2V5KTtcbiAgICB9KTtcbiAgICBpZiAoX3ZhbHVlMi5sZW5ndGggPiAwKSB7XG4gICAgICBzZXQoZGF0YSwgcGF0aCwgX3ZhbHVlMik7XG4gICAgfVxuICB9XG59O1xuZXhwb3J0IHZhciBwYXJzZVZhbHVlc1RvQmluZCA9IGZ1bmN0aW9uIHBhcnNlVmFsdWVzVG9CaW5kKHZhbHVlcywgZmxhdHRlbikge1xuICAvLyBObyBiaW5kIGZpZWxkIGV4aXN0cywgbm8gcHJvY2Vzc2luZ1xuICBpZiAoIUpTT04uc3RyaW5naWZ5KGZsYXR0ZW4pLmluY2x1ZGVzKCdiaW5kJykpIHtcbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG4gIHZhciBkYXRhID0gX2Nsb25lRGVlcCh2YWx1ZXMpO1xuICB2YXIgZGVhbEZpZWxkTGlzdCA9IGZ1bmN0aW9uIGRlYWxGaWVsZExpc3Qob2JqLCBfcmVmLCBiaW5kKSB7XG4gICAgdmFyIF9yZWYyID0gX3RvQXJyYXkoX3JlZiksXG4gICAgICBwYXRoID0gX3JlZjJbMF0sXG4gICAgICByZXN0ID0gX3JlZjIuc2xpY2UoMSk7XG4gICAgaWYgKHJlc3QubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgbGlzdCA9IGdldChvYmosIHBhdGgsIFtdKTtcbiAgICAgIGxpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gZ2V0KGl0ZW0sIHJlc3RbMF0pO1xuICAgICAgICBpZiAoYmluZCA9PT0gJ3Jvb3QnKSB7XG4gICAgICAgICAgbGlzdFtpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdHJhbnNmb3JtVmFsdWVUb0JpbmQoaXRlbSwgcmVzdFswXSwgYmluZCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgICAgb2JqLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGRlYWxGaWVsZExpc3QoaXRlbSwgW3BhdGhdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocmVzdCkpLCBiaW5kKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3Qob2JqKSkge1xuICAgICAgdmFyIHZhbHVlID0gZ2V0KG9iaiwgcGF0aCk7XG4gICAgICBkZWFsRmllbGRMaXN0KHZhbHVlLCByZXN0LCBiaW5kKTtcbiAgICB9XG4gIH07XG4gIE9iamVjdC5rZXlzKGZsYXR0ZW4pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgdmFyIGJpbmQgPSAoX2IgPSAoX2EgPSBmbGF0dGVuW2tleV0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zY2hlbWEpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5iaW5kO1xuICAgIGlmIChiaW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHBhdGggPSB0cmFuc2Zvcm1QYXRoKGtleSk7XG4gICAgaXNBcnJheShwYXRoKSA/IGRlYWxGaWVsZExpc3QoZGF0YSwgcGF0aCwgYmluZCkgOiB0cmFuc2Zvcm1WYWx1ZVRvQmluZChkYXRhLCBwYXRoLCBiaW5kKTtcbiAgfSk7XG4gIHJldHVybiBkYXRhO1xufTtcbmV4cG9ydCB2YXIgcGFyc2VCaW5kVG9WYWx1ZXMgPSBmdW5jdGlvbiBwYXJzZUJpbmRUb1ZhbHVlcyh2YWx1ZXMsIGZsYXR0ZW4pIHtcbiAgaWYgKCFKU09OLnN0cmluZ2lmeShmbGF0dGVuKS5pbmNsdWRlcygnYmluZCcpKSB7XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuICB2YXIgZGF0YSA9IF9jbG9uZURlZXAodmFsdWVzKTtcbiAgdmFyIGRlYWxGaWVsZExpc3QgPSBmdW5jdGlvbiBkZWFsRmllbGRMaXN0KG9iaiwgX3JlZjMsIGJpbmQpIHtcbiAgICB2YXIgX3JlZjQgPSBfdG9BcnJheShfcmVmMyksXG4gICAgICBwYXRoID0gX3JlZjRbMF0sXG4gICAgICByZXN0ID0gX3JlZjQuc2xpY2UoMSk7XG4gICAgaWYgKHJlc3QubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgbGlzdCA9IGdldChvYmosIHBhdGgsIFtdKTtcbiAgICAgIGxpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICAgICAgaWYgKGJpbmQgPT09ICdyb290Jykge1xuICAgICAgICAgIGxpc3RbaW5kZXhdID0gX2RlZmluZVByb3BlcnR5KHt9LCByZXN0WzBdLCBpdGVtKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdHJhbnNmb3JtQmluZFRvVmFsdWUoaXRlbSwgcmVzdFswXSwgYmluZCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgICAgb2JqLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGRlYWxGaWVsZExpc3QoaXRlbSwgW3BhdGhdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocmVzdCkpLCBiaW5kKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3Qob2JqKSkge1xuICAgICAgdmFyIHZhbHVlID0gZ2V0KG9iaiwgcGF0aCk7XG4gICAgICBkZWFsRmllbGRMaXN0KHZhbHVlLCByZXN0LCBiaW5kKTtcbiAgICB9XG4gIH07XG4gIE9iamVjdC5rZXlzKGZsYXR0ZW4pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgdmFyIGJpbmQgPSAoX2IgPSAoX2EgPSBmbGF0dGVuW2tleV0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zY2hlbWEpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5iaW5kO1xuICAgIGlmIChiaW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHBhdGggPSB0cmFuc2Zvcm1QYXRoKGtleSk7XG4gICAgaXNBcnJheShwYXRoKSA/IGRlYWxGaWVsZExpc3QoZGF0YSwgcGF0aCwgYmluZCkgOiB0cmFuc2Zvcm1CaW5kVG9WYWx1ZShkYXRhLCBwYXRoLCBiaW5kKTtcbiAgfSk7XG4gIHJldHVybiBkYXRhO1xufTsiLCJleHBvcnQgdmFyIGdldEZvcm1JdGVtTGF5b3V0ID0gZnVuY3Rpb24gZ2V0Rm9ybUl0ZW1MYXlvdXQoY29sdW1uLCBzY2hlbWEsIF9yZWYpIHtcbiAgdmFyIGxhYmVsV2lkdGggPSBfcmVmLmxhYmVsV2lkdGgsXG4gICAgZGlzcGxheVR5cGUgPSBfcmVmLmRpc3BsYXlUeXBlLFxuICAgIF9sYWJlbENvbCA9IF9yZWYuX2xhYmVsQ29sLFxuICAgIF9maWVsZENvbCA9IF9yZWYuX2ZpZWxkQ29sO1xuICB2YXIgbGFiZWxDb2wgPSB7XG4gICAgc3BhbjogNVxuICB9O1xuICB2YXIgZmllbGRDb2wgPSB7XG4gICAgc3BhbjogOVxuICB9O1xuICBpZiAoY29sdW1uID09PSAyKSB7XG4gICAgbGFiZWxDb2wgPSB7XG4gICAgICBzcGFuOiA2XG4gICAgfTtcbiAgICBmaWVsZENvbCA9IHtcbiAgICAgIHNwYW46IDE0XG4gICAgfTtcbiAgfVxuICBpZiAoY29sdW1uID4gMikge1xuICAgIGxhYmVsQ29sID0ge1xuICAgICAgc3BhbjogN1xuICAgIH07XG4gICAgZmllbGRDb2wgPSB7XG4gICAgICBzcGFuOiAxNlxuICAgIH07XG4gIH1cbiAgaWYgKGRpc3BsYXlUeXBlID09PSAnY29sdW1uJykge1xuICAgIC8vIGxhYmVsQ29sID0geyB4bDogOSwgeHhsOiA2IH07XG4gICAgLy8gaWYgKGNvbHVtbiA+IDEpIHtcbiAgICAvLyAgIGxhYmVsQ29sID0ge307XG4gICAgLy8gICBmaWVsZENvbCA9IHt9O1xuICAgIC8vIH1cbiAgICBsYWJlbENvbCA9IHt9O1xuICAgIGZpZWxkQ29sID0ge307XG4gIH1cbiAgaWYgKF9sYWJlbENvbCkge1xuICAgIGxhYmVsQ29sID0gX2xhYmVsQ29sO1xuICAgIGlmIChkaXNwbGF5VHlwZSA9PT0gJ2NvbHVtbicpIHtcbiAgICAgIGxhYmVsQ29sID0ge307XG4gICAgfVxuICB9XG4gIGlmIChfZmllbGRDb2wpIHtcbiAgICBmaWVsZENvbCA9IF9maWVsZENvbDtcbiAgICBpZiAodHlwZW9mIF9maWVsZENvbCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGZpZWxkQ29sID0ge1xuICAgICAgICBzcGFuOiBfZmllbGRDb2xcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIGlmIChkaXNwbGF5VHlwZSA9PT0gJ2lubGluZScpIHtcbiAgICBsYWJlbENvbCA9IHt9O1xuICAgIGZpZWxkQ29sID0ge307XG4gIH1cbiAgLy8g5YW85a655LiA5LiLIDEuMCDniYjmnKxcbiAgaWYgKChsYWJlbFdpZHRoIHx8IGxhYmVsV2lkdGggPT09IDApICYmIGRpc3BsYXlUeXBlICE9PSAnY29sdW1uJykge1xuICAgIGxhYmVsQ29sID0ge1xuICAgICAgZmxleDogbGFiZWxXaWR0aCArICdweCdcbiAgICB9O1xuICAgIGZpZWxkQ29sID0ge1xuICAgICAgZmxleDogJ2F1dG8nXG4gICAgfTtcbiAgfVxuICAvLyDoh6rlrprkuYnov5vooYzopobnm5ZcbiAgaWYgKHNjaGVtYS5jZWxsU3Bhbikge1xuICAgIGZpZWxkQ29sID0ge307XG4gIH1cbiAgaWYgKHNjaGVtYS5sYWJlbENvbCB8fCBzY2hlbWEubGFiZWxDb2wgPT09IDApIHtcbiAgICBsYWJlbENvbCA9IHNjaGVtYS5sYWJlbENvbDtcbiAgfVxuICBpZiAoc2NoZW1hLmZpZWxkQ29sIHx8IHNjaGVtYS5maWVsZENvbCA9PT0gMCkge1xuICAgIGZpZWxkQ29sID0gc2NoZW1hLmZpZWxkQ29sO1xuICB9XG4gIGlmICh0eXBlb2YgbGFiZWxDb2wgPT09ICdudW1iZXInKSB7XG4gICAgbGFiZWxDb2wgPSB7XG4gICAgICBzcGFuOiBsYWJlbENvbFxuICAgIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBmaWVsZENvbCA9PT0gJ251bWJlcicpIHtcbiAgICBmaWVsZENvbCA9IHtcbiAgICAgIHNwYW46IGZpZWxkQ29sXG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGxhYmVsQ29sOiBsYWJlbENvbCxcbiAgICBmaWVsZENvbDogZmllbGRDb2xcbiAgfTtcbn07IiwiZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOyB9XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgeyBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBpdGVyW1N5bWJvbC5pdGVyYXRvcl0gIT0gbnVsbCB8fCBpdGVyW1wiQEBpdGVyYXRvclwiXSAhPSBudWxsKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkoYXJyKTsgfVxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTsgcmV0dXJuIGFycjI7IH1cbmltcG9ydCB7IGlzT2JqZWN0LCBpc0FycmF5LCBfZ2V0LCBfaGFzLCBpc0Z1bmN0aW9uLCBpc09ialR5cGUgfSBmcm9tICcuLi91dGlscyc7XG52YXIgZXhlY3V0ZUNhbGxCYWNrID0gZnVuY3Rpb24gZXhlY3V0ZUNhbGxCYWNrKHdhdGNoSXRlbSwgdmFsdWUsIHBhdGgsIGluZGV4KSB7XG4gIGlmIChpc0Z1bmN0aW9uKHdhdGNoSXRlbSkpIHtcbiAgICB0cnkge1xuICAgICAgd2F0Y2hJdGVtKHZhbHVlLCBpbmRleCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiXCIuY29uY2F0KHBhdGgsIFwiXFx1NUJGOVxcdTVFOTRcXHU3Njg0d2F0Y2hcXHU1MUZEXFx1NjU3MFxcdTYyNjdcXHU4ODRDXFx1NjJBNVxcdTk1MTlcXHVGRjFBXCIpLCBlcnJvcik7XG4gICAgfVxuICB9XG4gIGlmIChpc0Z1bmN0aW9uKHdhdGNoSXRlbSA9PT0gbnVsbCB8fCB3YXRjaEl0ZW0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdhdGNoSXRlbS5oYW5kbGVyKSkge1xuICAgIHRyeSB7XG4gICAgICB3YXRjaEl0ZW0uaGFuZGxlcih2YWx1ZSwgaW5kZXgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIlwiLmNvbmNhdChwYXRoLCBcIlxcdTVCRjlcXHU1RTk0XFx1NzY4NHdhdGNoXFx1NTFGRFxcdTY1NzBcXHU2MjY3XFx1ODg0Q1xcdTYyQTVcXHU5NTE5XFx1RkYxQVwiKSwgZXJyb3IpO1xuICAgIH1cbiAgfVxufTtcbnZhciB0cmF2ZXJzZVZhbHVlcyA9IGZ1bmN0aW9uIHRyYXZlcnNlVmFsdWVzKF9yZWYpIHtcbiAgdmFyIGNoYW5nZWRWYWx1ZXMgPSBfcmVmLmNoYW5nZWRWYWx1ZXMsXG4gICAgYWxsVmFsdWVzID0gX3JlZi5hbGxWYWx1ZXMsXG4gICAgZmxhdFZhbHVlcyA9IF9yZWYuZmxhdFZhbHVlcztcbiAgdmFyIHRyYXZlcnNlQXJyYXkgPSBmdW5jdGlvbiB0cmF2ZXJzZUFycmF5KGxpc3QsIGZ1bGxMaXN0LCBwYXRoLCBpbmRleCkge1xuICAgIGlmICghbGlzdC5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIF9wYXRoID0gcGF0aCArPSAnW10nO1xuICAgIHZhciBmaWx0ZXJMZW5ndGggPSBsaXN0LmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIGl0ZW0gfHwgaXRlbSA9PT0gdW5kZWZpbmVkO1xuICAgIH0pLmxlbmd0aDtcbiAgICB2YXIgZmxhZyA9IGZpbHRlckxlbmd0aCAhPT0gZnVsbExpc3QubGVuZ3RoIHx8IGxpc3QubGVuZ3RoID09PSAxO1xuICAgIHZhciBpc1JlbW92ZSA9IGZhbHNlO1xuICAgIGlmIChmaWx0ZXJMZW5ndGggPiAxICYmIGZpbHRlckxlbmd0aCA8IGZ1bGxMaXN0Lmxlbmd0aCkge1xuICAgICAgZmxhZyA9IGZhbHNlO1xuICAgICAgaXNSZW1vdmUgPSB0cnVlO1xuICAgIH1cbiAgICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGlkeCkge1xuICAgICAgaWYgKCFpc1JlbW92ZSkge1xuICAgICAgICBmbGF0VmFsdWVzW19wYXRoXSA9IHtcbiAgICAgICAgICB2YWx1ZTogZnVsbExpc3RbaWR4XSxcbiAgICAgICAgICBpbmRleDogaW5kZXhcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChpc09iamVjdChpdGVtKSkge1xuICAgICAgICB0cmF2ZXJzZU9iaihpdGVtLCBmdWxsTGlzdFtpZHhdLCBfcGF0aCwgW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShpbmRleCksIFtpZHhdKSwgIWZsYWcpO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXkoaXRlbSkpIHtcbiAgICAgICAgdHJhdmVyc2VBcnJheShpdGVtLCBmdWxsTGlzdFtpZHhdLCBfcGF0aCwgW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShpbmRleCksIFtpZHhdKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIHZhciB0cmF2ZXJzZU9iaiA9IGZ1bmN0aW9uIHRyYXZlcnNlT2JqKG9iaiwgZnVsbE9iaiwgcGF0aCwgaW5kZXgsIGZsYWcpIHtcbiAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgdmFyIGl0ZW0gPSBvYmpba2V5XTtcbiAgICAgIHZhciBmdWxsSXRlbSA9IGZ1bGxPYmogPT09IG51bGwgfHwgZnVsbE9iaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogZnVsbE9ialtrZXldO1xuICAgICAgdmFyIHZhbHVlID0gaXRlbTtcbiAgICAgIHZhciBfcGF0aCA9IHBhdGggPyBwYXRoICsgJy4nICsga2V5IDoga2V5O1xuICAgICAgdmFyIGxhc3QgPSB0cnVlO1xuICAgICAgaWYgKGlzQXJyYXkoaXRlbSkpIHtcbiAgICAgICAgdmFsdWUgPSBmdWxsSXRlbSA/IF90b0NvbnN1bWFibGVBcnJheShmdWxsSXRlbSkgOiBmdWxsSXRlbTtcbiAgICAgICAgbGFzdCA9IGZhbHNlO1xuICAgICAgICB0cmF2ZXJzZUFycmF5KGl0ZW0sIGZ1bGxJdGVtLCBfcGF0aCwgaW5kZXgpO1xuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0KGl0ZW0pKSB7XG4gICAgICAgIGxhc3QgPSBmYWxzZTtcbiAgICAgICAgdHJhdmVyc2VPYmooaXRlbSwgZnVsbEl0ZW0sIF9wYXRoLCBpbmRleCwgZmxhZyk7XG4gICAgICB9XG4gICAgICBpZiAoIWxhc3QgfHwgIWZsYWcpIHtcbiAgICAgICAgZmxhdFZhbHVlc1tfcGF0aF0gPSB7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgIGluZGV4OiBpbmRleFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICB0cmF2ZXJzZU9iaihjaGFuZ2VkVmFsdWVzLCBhbGxWYWx1ZXMsIG51bGwsIFtdKTtcbn07XG5leHBvcnQgdmFyIHZhbHVlc1dhdGNoID0gZnVuY3Rpb24gdmFsdWVzV2F0Y2goY2hhbmdlZFZhbHVlcywgYWxsVmFsdWVzLCB3YXRjaCkge1xuICB2YXIgX2E7XG4gIGlmICgoKF9hID0gT2JqZWN0LmtleXMod2F0Y2ggfHwge30pKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubGVuZ3RoKSA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgZmxhdFZhbHVlcyA9IHtcbiAgICAnIyc6IHtcbiAgICAgIHZhbHVlOiBhbGxWYWx1ZXMsXG4gICAgICBpbmRleDogY2hhbmdlZFZhbHVlc1xuICAgIH1cbiAgfTtcbiAgdHJhdmVyc2VWYWx1ZXMoe1xuICAgIGNoYW5nZWRWYWx1ZXM6IGNoYW5nZWRWYWx1ZXMsXG4gICAgYWxsVmFsdWVzOiBhbGxWYWx1ZXMsXG4gICAgZmxhdFZhbHVlczogZmxhdFZhbHVlc1xuICB9KTtcbiAgT2JqZWN0LmtleXMod2F0Y2gpLmZvckVhY2goZnVuY3Rpb24gKHBhdGgpIHtcbiAgICBpZiAoIV9oYXMoZmxhdFZhbHVlcywgcGF0aCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIF9nZXQyID0gX2dldChmbGF0VmFsdWVzLCBwYXRoKSxcbiAgICAgIHZhbHVlID0gX2dldDIudmFsdWUsXG4gICAgICBpbmRleCA9IF9nZXQyLmluZGV4O1xuICAgIHZhciBpdGVtID0gd2F0Y2hbcGF0aF07XG4gICAgZXhlY3V0ZUNhbGxCYWNrKGl0ZW0sIHZhbHVlLCBwYXRoLCBpbmRleCk7XG4gIH0pO1xufTtcbmV4cG9ydCB2YXIgdHJhbnNmb3JtRmllbGRzRGF0YSA9IGZ1bmN0aW9uIHRyYW5zZm9ybUZpZWxkc0RhdGEoX2ZpZWxkc0Vycm9yLCBnZXRGaWVsZE5hbWUpIHtcbiAgdmFyIGZpZWxkc0Vycm9yID0gX2ZpZWxkc0Vycm9yO1xuICBpZiAoaXNPYmplY3QoZmllbGRzRXJyb3IpKSB7XG4gICAgZmllbGRzRXJyb3IgPSBbZmllbGRzRXJyb3JdO1xuICB9XG4gIGlmICghKGlzQXJyYXkoZmllbGRzRXJyb3IpICYmIGZpZWxkc0Vycm9yLmxlbmd0aCA+IDApKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHJldHVybiBmaWVsZHNFcnJvci5tYXAoZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgICBlcnJvcnM6IGZpZWxkLmVycm9yXG4gICAgfSwgZmllbGQpLCB7XG4gICAgICBuYW1lOiBnZXRGaWVsZE5hbWUoZmllbGQubmFtZSlcbiAgICB9KTtcbiAgfSk7XG59O1xuZXhwb3J0IHZhciBpbW1lZGlhdGVXYXRjaCA9IGZ1bmN0aW9uIGltbWVkaWF0ZVdhdGNoKHdhdGNoLCB2YWx1ZXMpIHtcbiAgdmFyIF9hO1xuICBpZiAoKChfYSA9IE9iamVjdC5rZXlzKHdhdGNoIHx8IHt9KSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCkgPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHdhdGNoT2JqID0ge307XG4gIE9iamVjdC5rZXlzKHdhdGNoKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgd2F0Y2hJdGVtID0gd2F0Y2hba2V5XTtcbiAgICBpZiAoKHdhdGNoSXRlbSA9PT0gbnVsbCB8fCB3YXRjaEl0ZW0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdhdGNoSXRlbS5pbW1lZGlhdGUpICYmIGlzRnVuY3Rpb24od2F0Y2hJdGVtID09PSBudWxsIHx8IHdhdGNoSXRlbSA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2F0Y2hJdGVtLmhhbmRsZXIpKSB7XG4gICAgICB3YXRjaE9ialtrZXldID0gd2F0Y2hJdGVtO1xuICAgIH1cbiAgfSk7XG4gIHZhbHVlc1dhdGNoKHZhbHVlcywgdmFsdWVzLCB3YXRjaE9iaik7XG59O1xuZXhwb3J0IHZhciBnZXRTY2hlbWFGdWxsUGF0aCA9IGZ1bmN0aW9uIGdldFNjaGVtYUZ1bGxQYXRoKHBhdGgsIHNjaGVtYSkge1xuICBpZiAoIXBhdGggfHwgIXBhdGguaW5jbHVkZXMoJy4nKSkge1xuICAgIHJldHVybiAncHJvcGVydGllcy4nICsgcGF0aDtcbiAgfVxuICAvLyDooaXlhaggbGlzdCDnsbvlnosgcGF0aCDot6/lvoRcbiAgd2hpbGUgKHBhdGguaW5jbHVkZXMoJ1tdJykpIHtcbiAgICB2YXIgaW5kZXggPSBwYXRoLmluZGV4T2YoJ1tdJyk7XG4gICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIGluZGV4KSArICcuaXRlbXMnICsgcGF0aC5zdWJzdHJpbmcoaW5kZXggKyAyKTtcbiAgfVxuICAvLyDooaXlhaggb2JqZWN0IOexu+WeiyBwYXRoIOi3r+W+hFxuICB2YXIgcmVzdWx0ID0gJ3Byb3BlcnRpZXMnO1xuICBwYXRoLnNwbGl0KCcuJykuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgIHZhciBrZXkgPSByZXN1bHQgKyAnLicgKyBpdGVtO1xuICAgIHZhciBpdGVtU2NoZW1hID0gX2dldChzY2hlbWEsIGtleSwge30pO1xuICAgIGlmIChpc09ialR5cGUoaXRlbVNjaGVtYSkpIHtcbiAgICAgIHJlc3VsdCA9IGtleSArICcucHJvcGVydGllcyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlc3VsdCA9IGtleTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIHl5bW1kZCh0aW1lU3RhbXApIHtcbiAgdmFyIGRhdGVfb2IgPSBuZXcgRGF0ZShOdW1iZXIodGltZVN0YW1wKSk7XG4gIHZhciBhZGp1c3RaZXJvID0gZnVuY3Rpb24gYWRqdXN0WmVybyhudW0pIHtcbiAgICByZXR1cm4gKCcwJyArIG51bSkuc2xpY2UoLTIpO1xuICB9O1xuICB2YXIgZGF5ID0gYWRqdXN0WmVybyhkYXRlX29iLmdldERhdGUoKSk7XG4gIHZhciBtb250aCA9IGFkanVzdFplcm8oZGF0ZV9vYi5nZXRNb250aCgpKTtcbiAgdmFyIHllYXIgPSBkYXRlX29iLmdldEZ1bGxZZWFyKCk7XG4gIHZhciBob3VycyA9IGFkanVzdFplcm8oZGF0ZV9vYi5nZXRIb3VycygpKTtcbiAgdmFyIG1pbnV0ZXMgPSBhZGp1c3RaZXJvKGRhdGVfb2IuZ2V0TWludXRlcygpKTtcbiAgdmFyIHNlY29uZHMgPSBhZGp1c3RaZXJvKGRhdGVfb2IuZ2V0U2Vjb25kcygpKTtcbiAgcmV0dXJuIFwiXCIuY29uY2F0KHllYXIsIFwiLVwiKS5jb25jYXQobW9udGgsIFwiLVwiKS5jb25jYXQoZGF5LCBcIiBcIikuY29uY2F0KGhvdXJzLCBcIjpcIikuY29uY2F0KG1pbnV0ZXMsIFwiOlwiKS5jb25jYXQoc2Vjb25kcyk7XG59XG5leHBvcnQgZnVuY3Rpb24gbXNUb1RpbWUoZHVyYXRpb24pIHtcbiAgdmFyIHNlY29uZHMgPSBNYXRoLmZsb29yKGR1cmF0aW9uIC8gMTAwMCAlIDYwKTtcbiAgdmFyIG1pbnV0ZXMgPSBNYXRoLmZsb29yKGR1cmF0aW9uIC8gKDEwMDAgKiA2MCkgJSA2MCk7XG4gIHZhciBob3VycyA9IE1hdGguZmxvb3IoZHVyYXRpb24gLyAoMTAwMCAqIDYwICogNjApICUgMjQpO1xuICBob3VycyA9IGhvdXJzIDwgMTAgPyAnMCcgKyBob3VycyA6IGhvdXJzO1xuICBtaW51dGVzID0gbWludXRlcyA8IDEwID8gJzAnICsgbWludXRlcyA6IG1pbnV0ZXM7XG4gIHNlY29uZHMgPSBzZWNvbmRzIDwgMTAgPyAnMCcgKyBzZWNvbmRzIDogc2Vjb25kcztcbiAgcmV0dXJuIGhvdXJzICsgJzonICsgbWludXRlcyArICc6JyArIHNlY29uZHM7XG59XG5leHBvcnQgdmFyIGdldFNlc3Npb25JdGVtID0gZnVuY3Rpb24gZ2V0U2Vzc2lvbkl0ZW0oa2V5KSB7XG4gIHJldHVybiBOdW1iZXIoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShrZXkpIHx8IDApO1xufTtcbmV4cG9ydCB2YXIgc2V0U2Vzc2lvbkl0ZW0gPSBmdW5jdGlvbiBzZXRTZXNzaW9uSXRlbShrZXksIGRhdGEpIHtcbiAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShrZXksIGRhdGEgKyAnJyk7XG59OyIsImZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTsgfVxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHsgaWYgKHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgaXRlcltTeW1ib2wuaXRlcmF0b3JdICE9IG51bGwgfHwgaXRlcltcIkBAaXRlcmF0b3JcIl0gIT0gbnVsbCkgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7IH1cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KGFycik7IH1cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07IHJldHVybiBhcnIyOyB9XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgX2dldCwgaXNPYmplY3QsIGdldEFycmF5LCBpc0FycmF5LCBpc051bWJlciB9IGZyb20gJy4uLy4uL3V0aWxzJztcbnZhciBmaWx0ZXJIaWRkZW5EYXRhID0gZnVuY3Rpb24gZmlsdGVySGlkZGVuRGF0YShsaXN0KSB7XG4gIGlmICghaXNBcnJheShsaXN0KSkge1xuICAgIHJldHVybiBsaXN0O1xuICB9XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBsaXN0W2ldO1xuICAgIGlmICghaXRlbS5oaWRkZW4pIHtcbiAgICAgIHZhciBub2RlID0gT2JqZWN0LmFzc2lnbih7fSwgaXRlbSk7XG4gICAgICBpZiAoaXRlbS5jaGlsZHJlbikge1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSBmaWx0ZXJIaWRkZW5EYXRhKGl0ZW0uY2hpbGRyZW4pO1xuICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGl0ZW0uaXRlbXMpIHtcbiAgICAgICAgdmFyIGl0ZW1zID0gZmlsdGVySGlkZGVuRGF0YShpdGVtLml0ZW1zKTtcbiAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBub2RlLml0ZW1zID0gaXRlbXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKG5vZGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbi8vIHJldHVybiBkYXRhSW5kZXjjgIFkYXRhUGF0aOOAgXNjaGVtYVBhdGhcbnZhciBnZXRQYXRoT2JqID0gZnVuY3Rpb24gZ2V0UGF0aE9iaihfcmVmKSB7XG4gIHZhciBfcmVmJHJvb3RQYXRoID0gX3JlZi5yb290UGF0aCxcbiAgICByb290UGF0aCA9IF9yZWYkcm9vdFBhdGggPT09IHZvaWQgMCA/IFtdIDogX3JlZiRyb290UGF0aCxcbiAgICBwYXRoID0gX3JlZi5wYXRoO1xuICB2YXIgcGF0aExpc3QgPSAocGF0aCB8fCAnJykuc3BsaXQoJy4nKTtcbiAgdmFyIGRhdGFJbmRleCA9IFtdO1xuICB2YXIgc2NoZW1hSW5kZXggPSBbXTtcbiAgdmFyIGRhdGFQYXRoTGlzdCA9IFtdO1xuICAvLyBkYXRhSW5kZXhcbiAgcm9vdFBhdGguZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICBpZiAoaXNOdW1iZXIoaXRlbSkpIHtcbiAgICAgIGRhdGFJbmRleC5wdXNoKGl0ZW0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNOdW1iZXIocm9vdFBhdGhbaW5kZXggKyAxXSkpIHtcbiAgICAgIHNjaGVtYUluZGV4LnB1c2goXCJcIi5jb25jYXQoaXRlbSwgXCJbXVwiKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjaGVtYUluZGV4LnB1c2goaXRlbSk7XG4gICAgfVxuICB9KTtcbiAgLy8gZGF0YVBhdGhcbiAgdmFyIGxpc3QgPSBfdG9Db25zdW1hYmxlQXJyYXkocm9vdFBhdGgpO1xuICBsaXN0LnBvcCgpO1xuICBsaXN0ID0gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShsaXN0KSwgX3RvQ29uc3VtYWJsZUFycmF5KHBhdGhMaXN0KSk7XG4gIGxpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICBpZiAoaXNOdW1iZXIoaXRlbSkpIHtcbiAgICAgIGRhdGFQYXRoTGlzdC5wdXNoKFwiW1wiLmNvbmNhdChpdGVtLCBcIl1cIikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhUGF0aExpc3QucHVzaChpdGVtKTtcbiAgICB9XG4gIH0pO1xuICB2YXIgZGF0YVBhdGggPSBkYXRhUGF0aExpc3Quam9pbignLicpO1xuICAvLyBzY2hlbWFQYXRoXG4gIHZhciBfcGF0aCA9IHBhdGhMaXN0O1xuICBpZiAoX3BhdGhbMF0gJiYgaXNOdW1iZXIoX3BhdGhbMF0pKSB7XG4gICAgX3BhdGguc3BsaWNlKDAsIDEpO1xuICB9XG4gIHZhciBzY2hlbWFQYXRoID0gW10uY29uY2F0KHNjaGVtYUluZGV4LCBbX3BhdGhdKS5qb2luKCcuJyk7XG4gIC8vIGNvbnNvbGUubG9nKHBhdGgsIHJvb3RQYXRoLCAnLS0tLS0tLScsIGRhdGFJbmRleCwgZGF0YVBhdGgsIHNjaGVtYVBhdGgpO1xuICByZXR1cm4ge1xuICAgIGRhdGFJbmRleDogZGF0YUluZGV4LFxuICAgIGRhdGFQYXRoOiBkYXRhUGF0aCxcbiAgICBzY2hlbWFQYXRoOiBzY2hlbWFQYXRoXG4gIH07XG59O1xuZXhwb3J0IHZhciBnZXRQYXRoID0gZnVuY3Rpb24gZ2V0UGF0aChwYXRoKSB7XG4gIGlmICghcGF0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmIChpc0FycmF5KHBhdGgpKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbignLicpO1xuICB9XG4gIHJldHVybiBwYXRoO1xufTtcbmV4cG9ydCB2YXIgZ2V0TGFiZWwgPSBmdW5jdGlvbiBnZXRMYWJlbChzY2hlbWEsIGRpc3BsYXlUeXBlLCB3aWRnZXRzKSB7XG4gIHZhciB0aXRsZSA9IHNjaGVtYS50aXRsZSxcbiAgICBkZXNjcmlwdGlvbiA9IHNjaGVtYS5kZXNjcmlwdGlvbixcbiAgICBkZXNjV2lkZ2V0ID0gc2NoZW1hLmRlc2NXaWRnZXQsXG4gICAgbGFiZWxXaWRnZXQgPSBzY2hlbWEubGFiZWxXaWRnZXQ7XG4gIHZhciBMYWJlbE5vZGUgPSB3aWRnZXRzW2xhYmVsV2lkZ2V0XTtcbiAgaWYgKExhYmVsTm9kZSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMYWJlbE5vZGUsIHtcbiAgICAgIHNjaGVtYTogc2NoZW1hXG4gICAgfSk7XG4gIH1cbiAgaWYgKCFkZXNjcmlwdGlvbiAmJiAhZGVzY1dpZGdldCkge1xuICAgIHJldHVybiB0aXRsZTtcbiAgfVxuICB2YXIgUmVuZGVyRGVzYyA9IGZ1bmN0aW9uIFJlbmRlckRlc2MoKSB7XG4gICAgdmFyIFdpZGdldCA9IHdpZGdldHNbZGVzY1dpZGdldF07XG4gICAgaWYgKFdpZGdldCkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFdpZGdldCwge1xuICAgICAgICBzY2hlbWE6IHNjaGVtYVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogJ2ZyLWRlc2MnXG4gICAgICB9LCBcIihcIiwgZGVzY3JpcHRpb24sIFwiKVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG4gIC8vIGlmIChkaXNwbGF5VHlwZSA9PT0gJ2lubGluZScpIHtcbiAgLy8gICByZXR1cm4gdGl0bGU7XG4gIC8vIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCB0aXRsZSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVuZGVyRGVzYywgbnVsbCkpO1xufTtcbmV4cG9ydCB2YXIgZ2V0VG9vbHRpcCA9IGZ1bmN0aW9uIGdldFRvb2x0aXAoc2NoZW1hLCBkaXNwbGF5VHlwZSkge1xuICB2YXIgZGVzY1R5cGUgPSBzY2hlbWEuZGVzY1R5cGUsXG4gICAgZGVzY3JpcHRpb24gPSBzY2hlbWEuZGVzY3JpcHRpb24sXG4gICAgdG9vbHRpcCA9IHNjaGVtYS50b29sdGlwO1xuICBpZiAodG9vbHRpcCkge1xuICAgIGlmICh0eXBlb2YgdG9vbHRpcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRpdGxlOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XG4gICAgICAgICAgICBfX2h0bWw6IHRvb2x0aXBcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0b29sdGlwKSwge1xuICAgICAgdGl0bGU6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XG4gICAgICAgICAgX19odG1sOiB0b29sdGlwLnRpdGxlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSk7XG4gIH1cbiAgaWYgKGRlc2NUeXBlID09PSAnd2lkZ2V0JyB8fCAhZGVzY3JpcHRpb24pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoZGlzcGxheVR5cGUgPT09ICdjb2x1bW4nICYmIGRlc2NUeXBlID09PSAnaWNvbicpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGl0bGU6IGRlc2NyaXB0aW9uXG4gICAgfTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5leHBvcnQgdmFyIGdldEV4dHJhVmlldyA9IGZ1bmN0aW9uIGdldEV4dHJhVmlldyhleHRyYUtleSwgc2NoZW1hLCB3aWRnZXRzKSB7XG4gIHZhciBleHRyYSA9IHNjaGVtYVtleHRyYUtleV07XG4gIGlmICghZXh0cmEpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gZXh0cmEg6Ieq5a6a5LmJXG4gIHZhciB3aWRnZXROYW1lID0gZXh0cmEgPT09IG51bGwgfHwgZXh0cmEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGV4dHJhLndpZGdldDtcbiAgaWYgKHdpZGdldE5hbWUpIHtcbiAgICB2YXIgV2lkZ2V0ID0gd2lkZ2V0c1t3aWRnZXROYW1lXTtcbiAgICBpZiAoIVdpZGdldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoV2lkZ2V0LCB7XG4gICAgICBzY2hlbWE6IHNjaGVtYVxuICAgIH0pO1xuICB9XG4gIHZhciBfX2h0bWwgPSAnJztcbiAgaWYgKHR5cGVvZiBleHRyYSA9PT0gJ3N0cmluZycpIHtcbiAgICBfX2h0bWwgPSBleHRyYTtcbiAgfVxuICAvLyDlhoXpg6hCVeS9v+eUqOeahOWPo+WtkO+8jOi/meS4qmFwaeS4jeWvueWklu+8jOS5n+ayoeacieW/heimgVxuICBpZiAoZXh0cmEgPT09IG51bGwgfHwgZXh0cmEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGV4dHJhLnRleHQpIHtcbiAgICBfX2h0bWwgPSBleHRyYS50ZXh0O1xuICB9XG4gIGlmICghX19odG1sKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiAnZnItZm9ybS1pdGVtLWV4dHJhJyxcbiAgICBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xuICAgICAgX19odG1sOiBfX2h0bWxcbiAgICB9XG4gIH0pO1xufTtcbmV4cG9ydCB2YXIgZ2V0Q29sU3BhbiA9IGZ1bmN0aW9uIGdldENvbFNwYW4oZm9ybUN0eCwgcGFyZW50Q3R4LCBzY2hlbWEpIHtcbiAgdmFyIHNwYW4gPSAyNDtcbiAgdmFyIGNvbHVtbiA9IGdldFBhcmFtVmFsdWUoZm9ybUN0eCwgcGFyZW50Q3R4LCBzY2hlbWEpKCdjb2x1bW4nKTtcbiAgaWYgKGNvbHVtbikge1xuICAgIHNwYW4gPSAyNCAvIGNvbHVtbjtcbiAgfVxuICAvLyDlhbzlrrkgMS4wIOmAu+i+kVxuICBpZiAoc2NoZW1hLndpZHRoKSB7XG4gICAgaWYgKHNjaGVtYS53aWR0aCA9PT0gJzEwMCUnKSB7XG4gICAgICBzcGFuID0gMjQ7XG4gICAgfSBlbHNlIGlmIChzY2hlbWEud2lkdGggPT09ICc1MCUnKSB7XG4gICAgICBzcGFuID0gMTI7XG4gICAgfSBlbHNlIGlmIChzY2hlbWEud2lkdGggPT09ICcyMCUnKSB7XG4gICAgICBzcGFuID0gNTtcbiAgICB9IGVsc2UgaWYgKHNjaGVtYS53aWR0aCA8ICc1MCUnKSB7XG4gICAgICBzcGFuID0gODtcbiAgICB9XG4gIH1cbiAgaWYgKHNjaGVtYS5jZWxsU3Bhbikge1xuICAgIHNwYW4gPSBzY2hlbWEuY2VsbFNwYW4gKiBzcGFuO1xuICB9XG4gIGlmIChzY2hlbWEuc3Bhbikge1xuICAgIHNwYW4gPSBzY2hlbWEuc3BhbjtcbiAgfVxuICByZXR1cm4gc3Bhbjtcbn07XG5leHBvcnQgdmFyIGdldFBhcmFtVmFsdWUgPSBmdW5jdGlvbiBnZXRQYXJhbVZhbHVlKGZvcm1DdHgsIHVwcGVyQ3R4LCBzY2hlbWEpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZUtleSkge1xuICAgIHZhciBpc1RvcCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgICB2YXIgX2EsIF9iLCBfYztcbiAgICBpZiAoaXNUb3ApIHtcbiAgICAgIHJldHVybiAoX2IgPSAoX2EgPSBzY2hlbWFbdmFsdWVLZXldKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB1cHBlckN0eFt2YWx1ZUtleV0pICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGZvcm1DdHhbdmFsdWVLZXldO1xuICAgIH1cbiAgICByZXR1cm4gKF9jID0gc2NoZW1hW3ZhbHVlS2V5XSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogdXBwZXJDdHhbdmFsdWVLZXldO1xuICB9O1xufTtcbmV4cG9ydCB2YXIgZ2V0RmllbGRQcm9wcyA9IGZ1bmN0aW9uIGdldEZpZWxkUHJvcHMod2lkZ2V0TmFtZSwgc2NoZW1hLCBfcmVmMikge1xuICB2YXIgd2lkZ2V0cyA9IF9yZWYyLndpZGdldHMsXG4gICAgbWV0aG9kcyA9IF9yZWYyLm1ldGhvZHMsXG4gICAgZm9ybSA9IF9yZWYyLmZvcm0sXG4gICAgZGVwZW5kVmFsdWVzID0gX3JlZjIuZGVwZW5kVmFsdWVzLFxuICAgIGdsb2JhbFByb3BzID0gX3JlZjIuZ2xvYmFsUHJvcHMsXG4gICAgcGF0aCA9IF9yZWYyLnBhdGgsXG4gICAgcm9vdFBhdGggPSBfcmVmMi5yb290UGF0aCxcbiAgICBmaWVsZFJlZiA9IF9yZWYyLmZpZWxkUmVmO1xuICB2YXIgX2E7XG4gIHZhciBwYXRoT2JqID0gZ2V0UGF0aE9iaih7XG4gICAgcGF0aDogcGF0aCxcbiAgICByb290UGF0aDogcm9vdFBhdGhcbiAgfSk7XG4gIHZhciBmaWVsZFByb3BzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzY2hlbWEucHJvcHMpLCB7XG4gICAgYWRkb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZm9ybSksIHtcbiAgICAgIGdsb2JhbFByb3BzOiBnbG9iYWxQcm9wcyxcbiAgICAgIGRlcGVuZFZhbHVlczogZGVwZW5kVmFsdWVzLFxuICAgICAgZmllbGRSZWY6IGZpZWxkUmVmXG4gICAgfSksIHBhdGhPYmopXG4gIH0pO1xuICBpZiAoKGRlcGVuZFZhbHVlcyA9PT0gbnVsbCB8fCBkZXBlbmRWYWx1ZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlcGVuZFZhbHVlcy5sZW5ndGgpID4gMCkge1xuICAgIGZpZWxkUHJvcHMuZGVwZW5kVmFsdWVzID0gZGVwZW5kVmFsdWVzO1xuICB9XG4gIFsncGxhY2Vob2xkZXInLCAnZGlzYWJsZWQnLCAnZm9ybWF0JywgJ29uU3RhdHVzQ2hhbmdlJ10uZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKHNjaGVtYVtrZXldKSB7XG4gICAgICBmaWVsZFByb3BzW2tleV0gPSBzY2hlbWFba2V5XTtcbiAgICB9XG4gIH0pO1xuICAvLyDlhbzlrrkgMS4wIOeJiOacrOmAu+i+kSBlbnVtID0+IG9wdGlvbnNcbiAgaWYgKHNjaGVtYS5lbnVtICYmICEoKF9hID0gc2NoZW1hLnByb3BzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eub3B0aW9ucykpIHtcbiAgICB2YXIgZW51bXMgPSBzY2hlbWEuZW51bSxcbiAgICAgIGVudW1OYW1lcyA9IHNjaGVtYS5lbnVtTmFtZXM7XG4gICAgZmllbGRQcm9wcy5vcHRpb25zID0gZ2V0QXJyYXkoZW51bXMpLm1hcChmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICAgIHZhciBsYWJlbCA9IGVudW1OYW1lcyAmJiBBcnJheS5pc0FycmF5KGVudW1OYW1lcykgPyBlbnVtTmFtZXNbaW5kZXhdIDogaXRlbTtcbiAgICAgIHZhciBpc0h0bWwgPSB0eXBlb2YgbGFiZWwgPT09ICdzdHJpbmcnICYmIGxhYmVsWzBdID09PSAnPCc7XG4gICAgICBpZiAoaXNIdG1sKSB7XG4gICAgICAgIGxhYmVsID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xuICAgICAgICAgICAgX19odG1sOiBsYWJlbFxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYWJlbDogbGFiZWwsXG4gICAgICAgIHZhbHVlOiBpdGVtXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG4gIGlmIChpc0FycmF5KGZpZWxkUHJvcHMub3B0aW9ucykpIHtcbiAgICBmaWVsZFByb3BzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBmaWVsZFByb3BzKSwge1xuICAgICAgb3B0aW9uczogZmlsdGVySGlkZGVuRGF0YShmaWVsZFByb3BzLm9wdGlvbnMpXG4gICAgfSk7XG4gIH1cbiAgLy8g5LulIHByb3BzIOe7k+WwvueahOWxnuaAp++8jOebtOaOpemAj+S8oFxuICBPYmplY3Qua2V5cyhzY2hlbWEpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiBrZXkudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdwcm9wcycpID4gLTEgJiYga2V5Lmxlbmd0aCA+IDUpIHtcbiAgICAgIGZpZWxkUHJvcHNba2V5XSA9IHNjaGVtYVtrZXldO1xuICAgIH1cbiAgfSk7XG4gIC8vIOaUr+aMgSBhZGRvbkFmdGVyIOS4uuiHquWumuS5iee7hOS7tueahOaDheWGtVxuICBpZiAoaXNPYmplY3QoZmllbGRQcm9wcy5hZGRvbkFmdGVyKSAmJiBmaWVsZFByb3BzLmFkZG9uQWZ0ZXIud2lkZ2V0KSB7XG4gICAgdmFyIEFkZG9uQWZ0ZXJXaWRnZXQgPSB3aWRnZXRzW2ZpZWxkUHJvcHMuYWRkb25BZnRlci53aWRnZXRdO1xuICAgIGZpZWxkUHJvcHMuYWRkb25BZnRlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFkZG9uQWZ0ZXJXaWRnZXQsIE9iamVjdC5hc3NpZ24oe30sIHNjaGVtYSkpO1xuICB9XG4gIGlmIChbJ3RyZWVTZWxlY3QnLCAnaW5wdXROdW1iZXInLCAnbXVsdGlTZWxlY3QnLCAnc2VsZWN0J10uaW5jbHVkZXMod2lkZ2V0TmFtZSkpIHtcbiAgICBmaWVsZFByb3BzLnN0eWxlID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICB3aWR0aDogJzEwMCUnXG4gICAgfSwgZmllbGRQcm9wcy5zdHlsZSk7XG4gIH1cbiAgaWYgKHdpZGdldE5hbWUgPT09ICdtdWx0aVNlbGVjdCcpIHtcbiAgICBmaWVsZFByb3BzLm1vZGUgPSAnbXVsdGlwbGUnO1xuICB9XG4gIC8vIER5bmFtaWMgTWFwcGluZyBvZiBNZXRob2RzXG4gIGlmIChpc09iamVjdChzY2hlbWEubWV0aG9kcykpIHtcbiAgICBPYmplY3Qua2V5cyhzY2hlbWEubWV0aG9kcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgbmFtZSA9IHNjaGVtYS5tZXRob2RzW2tleV07XG4gICAgICBmaWVsZFByb3BzW2tleV0gPSBtZXRob2RzW25hbWVdO1xuICAgIH0pO1xuICB9XG4gIGZpZWxkUHJvcHMuc2NoZW1hID0gc2NoZW1hO1xuICByZXR1cm4gZmllbGRQcm9wcztcbn07XG4vKlxuICAgKiBHZXQgZGVwZW5kIHZhbHVlc1xuICAgKlxuICAgKiAxLiBub3JtYWwgcGF0aFxuICAgKiBKdXN0IGdldCB2YWx1ZSBvZiBwYXRoIGluIGZvcm1EYXRhXG4gICAqXG4gICAqIDIuIGxpc3QgcGF0aFxuICAgKiBMaWtlIGBsaXN0W10uZm9vYC5gW11gIG1lYW5zIHRoZSBzYW1lIGluZGV4IGFzIHRoZSBjdXJyZW50IGl0ZW0uXG4gICAqIFlvdSBjYW4gcGFzcyBgW2luZGV4XWAgdG8gZ2V0IHNwZWNpZmljIGl0ZW0gYXQgdGhlIGluZGV4IG9mIGxpc3QsIHN1Y2ggYXMgYGxpc3RbMV0uZm9vYC5cbiAgICogU3VwcG9ydCBtb3JlIGNvbXBsZXggcGF0aCBsaWtlIGBsaXN0W10uZm9vW10uYmFyYFxuICAgKi9cbmV4cG9ydCB2YXIgZ2V0RGVwZW5kVmFsdWVzID0gZnVuY3Rpb24gZ2V0RGVwZW5kVmFsdWVzKGZvcm1EYXRhLCBkZXBlbmRQYXRoLCBwcm9wcywgZGVwZW5kZW5jaWVJdGVtKSB7XG4gIHZhciBpbmRleFJlZyA9IC9cXFtbMC05XSpcXF0vO1xuICBpZiAoaW5kZXhSZWcudGVzdChkZXBlbmRQYXRoKSkge1xuICAgIHZhciBjdXJyZW50SW5kZXggPSBfZ2V0KHByb3BzLCAncGF0aC4wJyk7XG4gICAgdmFyIGRlcGVuZEluZGV4ID0gZGVwZW5kUGF0aC5tYXRjaChpbmRleFJlZylbMF0ucmVwbGFjZSgnWycsICcnKS5yZXBsYWNlKCddJywgJycpO1xuICAgIHZhciBsaXN0UGF0aCA9IGRlcGVuZFBhdGguc3BsaXQoaW5kZXhSZWcpWzBdO1xuICAgIHZhciBpdGVtSW5kZXggPSBkZXBlbmRJbmRleCB8fCBjdXJyZW50SW5kZXg7XG4gICAgdmFyIGl0ZW1QYXRoID0gZGVwZW5kUGF0aC5yZXBsYWNlKFwiXCIuY29uY2F0KGxpc3RQYXRoLCBcIltcIikuY29uY2F0KGRlcGVuZEluZGV4LCBcIl0uXCIpLCAnJyk7XG4gICAgdmFyIGxpc3REYXRhID0gX2dldChmb3JtRGF0YSwgXCJcIi5jb25jYXQobGlzdFBhdGgsIFwiW1wiKS5jb25jYXQoaXRlbUluZGV4LCBcIl1cIikpO1xuICAgIGRlcGVuZGVuY2llSXRlbS5wdXNoKGxpc3RQYXRoLCBpdGVtSW5kZXgpO1xuICAgIHJldHVybiBnZXREZXBlbmRWYWx1ZXMobGlzdERhdGEsIGl0ZW1QYXRoLCBwcm9wcywgZGVwZW5kZW5jaWVJdGVtKTtcbiAgfVxuICBkZXBlbmRlbmNpZUl0ZW0ucHVzaC5hcHBseShkZXBlbmRlbmNpZUl0ZW0sIF90b0NvbnN1bWFibGVBcnJheShkZXBlbmRQYXRoLnNwbGl0KCcuJykpKTtcbiAgcmV0dXJuIF9nZXQoZm9ybURhdGEsIGRlcGVuZFBhdGgpO1xufTsiLCJmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfSwgX3R5cGVvZihvYmopOyB9XG5pbXBvcnQgeyBfY2xvbmVEZWVwLCBpc09ialR5cGUsIGlzTGlzdFR5cGUgfSBmcm9tICcuLi91dGlscy9pbmRleCc7XG5leHBvcnQgdmFyIGNyZWF0ZURhdGFTa2VsZXRvbiA9IGZ1bmN0aW9uIGNyZWF0ZURhdGFTa2VsZXRvbihzY2hlbWEsIGZvcm1EYXRhKSB7XG4gIHZhciBfZm9ybURhdGEgPSBfY2xvbmVEZWVwKGZvcm1EYXRhKTtcbiAgdmFyIHJlc3VsdCA9IF9mb3JtRGF0YTtcbiAgaWYgKGlzT2JqVHlwZShzY2hlbWEpKSB7XG4gICAgaWYgKF9mb3JtRGF0YSA9PT0gdW5kZWZpbmVkIHx8IF90eXBlb2YoX2Zvcm1EYXRhKSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIF9mb3JtRGF0YSA9IHt9O1xuICAgICAgcmVzdWx0ID0ge307XG4gICAgfVxuICAgIE9iamVjdC5rZXlzKHNjaGVtYS5wcm9wZXJ0aWVzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBjaGlsZFNjaGVtYSA9IHNjaGVtYS5wcm9wZXJ0aWVzW2tleV07XG4gICAgICB2YXIgY2hpbGREYXRhID0gX2Zvcm1EYXRhW2tleV07XG4gICAgICB2YXIgY2hpbGRSZXN1bHQgPSBjcmVhdGVEYXRhU2tlbGV0b24oY2hpbGRTY2hlbWEsIGNoaWxkRGF0YSk7XG4gICAgICByZXN1bHRba2V5XSA9IGNoaWxkUmVzdWx0O1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKF9mb3JtRGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gcmVzdWx0ID0gX2Zvcm1EYXRhO1xuICB9IGVsc2UgaWYgKHNjaGVtYS5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXN1bHQgPSBfY2xvbmVEZWVwKHNjaGVtYS5kZWZhdWx0KTtcbiAgfSBlbHNlIGlmIChpc0xpc3RUeXBlKHNjaGVtYSkpIHtcbiAgICByZXN1bHQgPSBbY3JlYXRlRGF0YVNrZWxldG9uKHNjaGVtYS5pdGVtcyldO1xuICB9IGVsc2UgaWYgKHNjaGVtYS50eXBlID09PSAnYm9vbGVhbicgJiYgIXNjaGVtYS53aWRnZXQpIHtcbiAgICAvLyByZXN1bHQgPSBmYWxzZTtcbiAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59OyIsImltcG9ydCB7IGdldCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBpc09iamVjdCwgX2Nsb25lRGVlcCwgaXNBcnJheSB9IGZyb20gJy4uL3V0aWxzL2luZGV4JztcbmltcG9ydCB7IGNyZWF0ZURhdGFTa2VsZXRvbiB9IGZyb20gJy4vZm9ybURhdGFTa2VsZXRvbic7XG5leHBvcnQgdmFyIGlzRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIGlzRXhwcmVzc2lvbihzdHIpIHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBwYXR0ZXJuID0gL157XFxzKnsoLispfVxccyp9JC87XG4gIHZhciByZWcxID0gL157XFxzKntmdW5jdGlvblxcKC4rfVxccyp9JC87XG4gIHJldHVybiBzdHIubWF0Y2gocGF0dGVybikgJiYgIXN0ci5tYXRjaChyZWcxKTtcbn07XG5leHBvcnQgdmFyIGlzSGFzRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIGlzSGFzRXhwcmVzc2lvbihzY2hlbWEpIHtcbiAgdmFyIHJlc3VsdCA9IE9iamVjdC5rZXlzKHNjaGVtYSkuc29tZShmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGl0ZW0gPSBzY2hlbWFba2V5XTtcbiAgICAvLyDlrZDljY/orq7kuI3lgZrpgJLlvZLnoa7orqRcbiAgICBpZiAoa2V5ID09PSAncHJvcGVydGllcycpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHJlY3Vyc2lvbkFycmF5ID0gZnVuY3Rpb24gcmVjdXJzaW9uQXJyYXkobGlzdCkge1xuICAgICAgdmFyIHJlc3VsdCA9IGxpc3Quc29tZShmdW5jdGlvbiAoaXRlKSB7XG4gICAgICAgIGlmIChpc0FycmF5KGl0ZSkpIHtcbiAgICAgICAgICByZXR1cm4gcmVjdXJzaW9uQXJyYXkoaXRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNPYmplY3QoaXRlKSkge1xuICAgICAgICAgIHJldHVybiBpc0hhc0V4cHJlc3Npb24oaXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNFeHByZXNzaW9uKGl0ZSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBpZiAoaXNBcnJheShpdGVtKSkge1xuICAgICAgcmV0dXJuIHJlY3Vyc2lvbkFycmF5KGl0ZW0pO1xuICAgIH1cbiAgICBpZiAoaXNPYmplY3QoaXRlbSkpIHtcbiAgICAgIHJldHVybiBpc0hhc0V4cHJlc3Npb24oaXRlbSk7XG4gICAgfVxuICAgIHJldHVybiBpc0V4cHJlc3Npb24oaXRlbSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbmV4cG9ydCB2YXIgcGFyc2VFeHByZXNzaW9uID0gZnVuY3Rpb24gcGFyc2VFeHByZXNzaW9uKGZ1bmMpIHtcbiAgdmFyIGZvcm1EYXRhID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgdmFyIHBhcmVudFBhdGggPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZDtcbiAgdmFyIHBhcmVudERhdGEgPSBnZXQoZm9ybURhdGEsIHBhcmVudFBhdGgpIHx8IHt9O1xuICBpZiAodHlwZW9mIGZ1bmMgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIGZ1bmNCb2R5ID0gZnVuYy5yZXBsYWNlKC9ee1xccyp7L2csICcnKS5yZXBsYWNlKC99XFxzKn0kL2csICcnKTtcbiAgICB2YXIgZnVuY1N0ciA9IFwiXFxuICAgICAgcmV0dXJuIFwiLmNvbmNhdChmdW5jQm9keS5yZXBsYWNlKC9mb3JtRGF0YS9nLCBKU09OLnN0cmluZ2lmeShmb3JtRGF0YSkpLnJlcGxhY2UoL3Jvb3RWYWx1ZS9nLCBKU09OLnN0cmluZ2lmeShwYXJlbnREYXRhKSksIFwiXFxuICAgIFwiKTtcbiAgICB0cnkge1xuICAgICAgdmFyIHJlc3VsdCA9IEZ1bmN0aW9uKGZ1bmNTdHIpKCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvciwgcGFyZW50UGF0aCk7XG4gICAgICByZXR1cm4gbnVsbDsgLy8g5aaC5p6c6K6h566X5pyJ6ZSZ6K+v77yMcmV0dXJuIG51bGwg5pyA5ZCI6YCCXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmM7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlYWxEYXRhUGF0aChwYXRoKSB7XG4gIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBFcnJvcihcImlkIFwiLmNvbmNhdChwYXRoLCBcIiBpcyBub3QgYSBzdHJpbmchISEgU29tZXRoaW5nIHdyb25nIGhlcmVcIikpO1xuICB9XG4gIGlmIChwYXRoLm1hdGNoKC9bJF12b2lkX1teLl0rJC8pKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gcGF0aC5yZXBsYWNlKC9bJF12b2lkX1teLl0rLi9nLCAnJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVCeVBhdGgoZm9ybURhdGEsIHBhdGgpIHtcbiAgaWYgKHBhdGggPT09ICcjJyB8fCAhcGF0aCkge1xuICAgIHJldHVybiBmb3JtRGF0YSB8fCB7fTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgcGF0aCA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgcmVhbFBhdGggPSBnZXRSZWFsRGF0YVBhdGgocGF0aCk7XG4gICAgcmV0dXJuIHJlYWxQYXRoICYmIGdldChmb3JtRGF0YSwgcmVhbFBhdGgpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoJ3BhdGggaGFzIHRvIGJlIGEgc3RyaW5nJyk7XG4gIH1cbn1cbmV4cG9ydCB2YXIgcGFyc2VBbGxFeHByZXNzaW9uID0gZnVuY3Rpb24gcGFyc2VBbGxFeHByZXNzaW9uKF9zY2hlbWEsIF9mb3JtRGF0YSwgZGF0YVBhdGgsIGZvcm1TY2hlbWEpIHtcbiAgdmFyIHNjaGVtYSA9IF9jbG9uZURlZXAoX3NjaGVtYSk7XG4gIHZhciBmb3JtRGF0YSA9IF9mb3JtRGF0YTtcbiAgaWYgKGZvcm1TY2hlbWEpIHtcbiAgICBmb3JtRGF0YSA9IGNyZWF0ZURhdGFTa2VsZXRvbihmb3JtU2NoZW1hLCBmb3JtRGF0YSk7XG4gIH1cbiAgdmFyIHJlY3Vyc2lvbkFycmF5ID0gZnVuY3Rpb24gcmVjdXJzaW9uQXJyYXkobGlzdCkge1xuICAgIHZhciByZXN1bHQgPSBsaXN0Lm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgaWYgKGlzQXJyYXkoaXRlbSkpIHtcbiAgICAgICAgcmV0dXJuIHJlY3Vyc2lvbkFycmF5KGl0ZW0pO1xuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0KGl0ZW0pKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUFsbEV4cHJlc3Npb24oaXRlbSwgZm9ybURhdGEsIGRhdGFQYXRoKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0V4cHJlc3Npb24oaXRlbSkpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlRXhwcmVzc2lvbihpdGVtLCBmb3JtRGF0YSwgZGF0YVBhdGgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgT2JqZWN0LmtleXMoc2NoZW1hKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIHZhbHVlID0gc2NoZW1hW2tleV07XG4gICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBzY2hlbWFba2V5XSA9IHJlY3Vyc2lvbkFycmF5KHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKGlzT2JqZWN0KHZhbHVlKSAmJiAoKF9hID0gdmFsdWUubXVzdGFjaGVQYXJzZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdHJ1ZSkpIHtcbiAgICAgIHNjaGVtYVtrZXldID0gcGFyc2VBbGxFeHByZXNzaW9uKHZhbHVlLCBmb3JtRGF0YSwgZGF0YVBhdGgpO1xuICAgIH0gZWxzZSBpZiAoaXNFeHByZXNzaW9uKHZhbHVlKSkge1xuICAgICAgc2NoZW1hW2tleV0gPSBwYXJzZUV4cHJlc3Npb24odmFsdWUsIGZvcm1EYXRhLCBkYXRhUGF0aCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHNjaGVtYTtcbn07IiwiaW1wb3J0IHsgcGFyc2VFeHByZXNzaW9uIH0gZnJvbSAnLi9leHByZXNzaW9uJztcbi8vIOaPkOWPliBmb3JtRGF0YS4g5byA5aS055qE5a2X56ym5LiyXG52YXIgZXh0cmFjdEZvcm1EYXRhU3RyaW5ncyA9IGZ1bmN0aW9uIGV4dHJhY3RGb3JtRGF0YVN0cmluZ3MobGlzdCkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGxpc3QuZm9yRWFjaChmdW5jdGlvbiAoc3RyKSB7XG4gICAgdmFyIHJlZ2V4ID0gL2Zvcm1EYXRhLlxcdysoLlxcdyspKi9nOyAvLyDljLnphY1mb3JtRGF0YS7lkI7pnaLot5/nnYDlrZfmr43jgIHmlbDlrZfjgIHkuIvliJLnur/pl7TpmpTnmoTnu4TlkIhcbiAgICB2YXIgbWF0Y2hlcyA9IHN0ci5tYXRjaChyZWdleCk7XG4gICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQobWF0Y2hlcyk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4vLyDmj5Dlj5Ygcm9vdFZhbHVlLiDlvIDlpLTnmoTlrZfnrKbkuLJcbnZhciBleHRyYWN0Um9vdFZhbHVlU3RyaW5ncyA9IGZ1bmN0aW9uIGV4dHJhY3RSb290VmFsdWVTdHJpbmdzKGxpc3QpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKHN0cikge1xuICAgIHZhciByZWdleCA9IC9yb290VmFsdWUuXFx3KyguXFx3KykqL2c7IC8vIOWMuemFjWZvcm1EYXRhLuWQjumdoui3n+edgOWtl+avjeOAgeaVsOWtl+OAgeS4i+WIkue6v+mXtOmalOeahOe7hOWQiFxuICAgIHZhciBtYXRjaGVzID0gc3RyLm1hdGNoKHJlZ2V4KTtcbiAgICBpZiAobWF0Y2hlcykge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdChtYXRjaGVzKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbi8vIOaPkOWPliB7eyB9fSDph4zpnaLnmoTlhoXlrrlcbnZhciBmaW5kU3RyTGlzdCA9IGZ1bmN0aW9uIGZpbmRTdHJMaXN0KHN0ciwgdHlwZSkge1xuICB2YXIgcmVnZXggPSAve3soLio/KX19L2c7XG4gIHZhciBtYXRjaGVzID0gW107XG4gIHZhciBtYXRjaDtcbiAgd2hpbGUgKChtYXRjaCA9IHJlZ2V4LmV4ZWMoc3RyKSkgIT09IG51bGwpIHtcbiAgICBtYXRjaGVzLnB1c2gobWF0Y2hbMV0pO1xuICB9XG4gIDtcbiAgaWYgKHR5cGUgPT09ICdmb3JtRGF0YScpIHtcbiAgICByZXR1cm4gZXh0cmFjdEZvcm1EYXRhU3RyaW5ncyhtYXRjaGVzKTtcbiAgfVxuICBpZiAodHlwZSA9PT0gJ3Jvb3RWYWx1ZScpIHtcbiAgICByZXR1cm4gZXh0cmFjdFJvb3RWYWx1ZVN0cmluZ3MobWF0Y2hlcyk7XG4gIH1cbiAgcmV0dXJuIFtdO1xufTtcbnZhciBnZXRMaXN0RXZlcnlSZXN1bHQgPSBmdW5jdGlvbiBnZXRMaXN0RXZlcnlSZXN1bHQobGlzdCwgcHJlVmFsdWUsIG5leHRWYWx1ZSwgZGF0YVBhdGgpIHtcbiAgcmV0dXJuIGxpc3QuZXZlcnkoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICB2YXIgcHJlID0gcGFyc2VFeHByZXNzaW9uKGl0ZW0sIHByZVZhbHVlLCBkYXRhUGF0aCk7XG4gICAgdmFyIGN1cnIgPSBwYXJzZUV4cHJlc3Npb24oaXRlbSwgbmV4dFZhbHVlLCBkYXRhUGF0aCk7XG4gICAgcmV0dXJuIHByZSA9PT0gY3VycjtcbiAgfSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIChzdHIsIGRhdGFQYXRoLCBkZXBlbmRlbmNpZXMsIHNob3VsZFVwZGF0ZU9wZW4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChwcmVWYWx1ZSwgbmV4dFZhbHVlKSB7XG4gICAgLy8gZGVwZW5kZW5jaWVzIOWFiOS4jeWkhOeQhlxuICAgIGlmIChkZXBlbmRlbmNpZXMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB2YXIgZm9ybURhdGFMaXN0ID0gZmluZFN0ckxpc3Qoc3RyLCAnZm9ybURhdGEnKTtcbiAgICB2YXIgcm9vdFZhbHVlTGlzdCA9IGZpbmRTdHJMaXN0KHN0ciwgJ3Jvb3RWYWx1ZScpO1xuICAgIHZhciBmb3JtRGF0YVJlcyA9IGdldExpc3RFdmVyeVJlc3VsdChmb3JtRGF0YUxpc3QsIHByZVZhbHVlLCBuZXh0VmFsdWUsIGRhdGFQYXRoKTtcbiAgICB2YXIgcm9vdFZhbHVlUmVzID0gZ2V0TGlzdEV2ZXJ5UmVzdWx0KHJvb3RWYWx1ZUxpc3QsIHByZVZhbHVlLCBuZXh0VmFsdWUsIGRhdGFQYXRoKTtcbiAgICBpZiAoZm9ybURhdGFSZXMgJiYgcm9vdFZhbHVlUmVzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9O1xufSk7IiwiZXhwb3J0IHZhciBtYXBwaW5nID0ge1xuICBkZWZhdWx0OiAnaW5wdXQnLFxuICBzdHJpbmc6ICdpbnB1dCcsXG4gIGFycmF5OiAnbGlzdCcsXG4gIGJvb2xlYW46ICdjaGVja2JveCcsXG4gIGludGVnZXI6ICdudW1iZXInLFxuICBudW1iZXI6ICdpbnB1dE51bWJlcicsXG4gIG9iamVjdDogJ21hcCcsXG4gIGh0bWw6ICdodG1sJyxcbiAgY2FyZDogJ2NhcmQnLFxuICBjb2xsYXBzZTogJ2NvbGxhcHNlJyxcbiAgbGluZVRpdGxlOiAnbGluZVRpdGxlJyxcbiAgbGluZTogJ2xpbmUnLFxuICBzdWJJdGVtOiAnc3ViSXRlbScsXG4gIHBhbmVsOiAncGFuZWwnLFxuICAnc3RyaW5nOnVwbG9hZCc6ICd1cGxvYWQnLFxuICAnc3RyaW5nOnVybCc6ICd1cmxJbnB1dCcsXG4gICdzdHJpbmc6ZGF0ZVRpbWUnOiAnZGF0ZVBpY2tlcicsXG4gICdzdHJpbmc6ZGF0ZSc6ICdkYXRlUGlja2VyJyxcbiAgJ3N0cmluZzp5ZWFyJzogJ2RhdGVQaWNrZXInLFxuICAnc3RyaW5nOm1vbnRoJzogJ2RhdGVQaWNrZXInLFxuICAnc3RyaW5nOndlZWsnOiAnZGF0ZVBpY2tlcicsXG4gICdzdHJpbmc6cXVhcnRlcic6ICdkYXRlUGlja2VyJyxcbiAgJ3N0cmluZzp0aW1lJzogJ3RpbWVQaWNrZXInLFxuICAnc3RyaW5nOnRleHRhcmVhJzogJ3RleHRBcmVhJyxcbiAgJ3N0cmluZzpjb2xvcic6ICdjb2xvcicsXG4gICdzdHJpbmc6aW1hZ2UnOiAnaW1hZ2VJbnB1dCcsXG4gICdyYW5nZTp0aW1lJzogJ3RpbWVSYW5nZScsXG4gICdyYW5nZTpkYXRlVGltZSc6ICdkYXRlUmFuZ2UnLFxuICAncmFuZ2U6ZGF0ZSc6ICdkYXRlUmFuZ2UnLFxuICAncmFuZ2U6eWVhcic6ICdkYXRlUmFuZ2UnLFxuICAncmFuZ2U6bW9udGgnOiAnZGF0ZVJhbmdlJyxcbiAgJ3JhbmdlOndlZWsnOiAnZGF0ZVJhbmdlJyxcbiAgJ3JhbmdlOnF1YXJ0ZXInOiAnZGF0ZVJhbmdlJyxcbiAgJyo/ZW51bSc6ICdyYWRpbycsXG4gICcqP2VudW1fbG9uZyc6ICdzZWxlY3QnLFxuICAnYXJyYXk/ZW51bSc6ICdjaGVja2JveGVzJyxcbiAgJ2FycmF5P2VudW1fbG9uZyc6ICdtdWx0aVNlbGVjdCcsXG4gICcqP3JlYWRPbmx5JzogJ2h0bWwnIC8vIFRPRE86IGh0bWwgd2lkZ2V0cyBmb3IgbGlzdCAvIG9iamVjdFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdpZGdldE5hbWUoc2NoZW1hKSB7XG4gIHZhciBfbWFwcGluZyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbWFwcGluZztcbiAgdmFyIHR5cGUgPSBzY2hlbWEudHlwZSxcbiAgICBmb3JtYXQgPSBzY2hlbWEuZm9ybWF0LFxuICAgIGVudW1zID0gc2NoZW1hLmVudW0sXG4gICAgcmVhZE9ubHkgPSBzY2hlbWEucmVhZE9ubHksXG4gICAgd2lkZ2V0ID0gc2NoZW1hLndpZGdldCxcbiAgICBwcm9wcyA9IHNjaGVtYS5wcm9wcztcbiAgLy/lpoLmnpzlt7Lnu4/ms6jmmI7kuobmuLLmn5N3aWRnZXTvvIzpgqPmnIDlpb1cbiAgaWYgKHNjaGVtYVsndWk6d2lkZ2V0J10gfHwgc2NoZW1hLndpZGdldCkge1xuICAgIHJldHVybiBzY2hlbWFbJ3VpOndpZGdldCddIHx8IHNjaGVtYS53aWRnZXQ7XG4gIH1cbiAgdmFyIGxpc3QgPSBbXTtcbiAgaWYgKHJlYWRPbmx5KSB7XG4gICAgbGlzdC5wdXNoKFwiXCIuY29uY2F0KHR5cGUsIFwiP3JlYWRPbmx5XCIpKTtcbiAgICBsaXN0LnB1c2goJyo/cmVhZE9ubHknKTtcbiAgfVxuICBpZiAoZW51bXMpIHtcbiAgICAvLyDmoLnmja4gZW51bSDplb/luqbmnaXmmbrog73pgInmi6nmjqfku7ZcbiAgICBpZiAoQXJyYXkuaXNBcnJheShlbnVtcykgJiYgKHR5cGUgPT09ICdhcnJheScgJiYgZW51bXMubGVuZ3RoID4gNiB8fCB0eXBlICE9PSAnYXJyYXknICYmIGVudW1zLmxlbmd0aCA+IDIpKSB7XG4gICAgICBsaXN0LnB1c2goXCJcIi5jb25jYXQodHlwZSwgXCI/ZW51bV9sb25nXCIpKTtcbiAgICAgIGxpc3QucHVzaCgnKj9lbnVtX2xvbmcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGlzdC5wdXNoKFwiXCIuY29uY2F0KHR5cGUsIFwiP2VudW1cIikpO1xuICAgICAgLy8gYXJyYXkg6buY6K6k5L2/55SoIGxpc3TvvIxhcnJheT9lbnVtIOm7mOiupOS9v+eUqCBjaGVja2JveGVz77yMKj9lbnVtIOm7mOiupOS9v+eUqHNlbGVjdFxuICAgICAgbGlzdC5wdXNoKCcqP2VudW0nKTtcbiAgICB9XG4gIH1cbiAgaWYgKHByb3BzID09PSBudWxsIHx8IHByb3BzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwcm9wcy5vcHRpb25zKSB7XG4gICAgaWYgKHR5cGUgPT09ICdhcnJheScgJiYgcHJvcHMub3B0aW9ucy5sZW5ndGggPiA2IHx8IHR5cGUgIT09ICdhcnJheScgJiYgcHJvcHMub3B0aW9ucy5sZW5ndGggPiAyKSB7XG4gICAgICBsaXN0LnB1c2goXCJcIi5jb25jYXQodHlwZSwgXCI/ZW51bV9sb25nXCIpKTtcbiAgICAgIGxpc3QucHVzaCgnKj9lbnVtX2xvbmcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGlzdC5wdXNoKFwiXCIuY29uY2F0KHR5cGUsIFwiP2VudW1cIikpO1xuICAgICAgLy8gYXJyYXkg6buY6K6k5L2/55SoIGxpc3TvvIxhcnJheT9lbnVtIOm7mOiupOS9v+eUqCBjaGVja2JveGVz77yMKj9lbnVtIOm7mOiupOS9v+eUqHNlbGVjdFxuICAgICAgbGlzdC5wdXNoKCcqP2VudW0nKTtcbiAgICB9XG4gIH1cbiAgdmFyIF93aWRnZXQgPSBmb3JtYXQ7XG4gIGlmIChfd2lkZ2V0KSB7XG4gICAgbGlzdC5wdXNoKFwiXCIuY29uY2F0KHR5cGUsIFwiOlwiKS5jb25jYXQoX3dpZGdldCkpO1xuICB9XG4gIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIGxpc3QucHVzaCgoc2NoZW1hLnRoZW1lID09PSAndGlsZScgPyAnbGluZVRpdGxlJyA6IHNjaGVtYS50aGVtZSkgfHwgJ2NvbGxhcHNlJyk7XG4gIH0gZWxzZSB7XG4gICAgbGlzdC5wdXNoKHR5cGUpOyAvLyDmlL7lnKjmnIDlkI7lhZzlupXvvIzlhbbku5bpg73kuI1tYXRjaOaXtuS9v+eUqHR5cGXpu5jorqTnmoTnu4Tku7ZcbiAgfVxuXG4gIHZhciB3aWRnZXROYW1lID0gJyc7XG4gIGxpc3Quc29tZShmdW5jdGlvbiAoaXRlbSkge1xuICAgIHdpZGdldE5hbWUgPSBfbWFwcGluZ1tpdGVtXTtcbiAgICByZXR1cm4gISF3aWRnZXROYW1lO1xuICB9KTtcbiAgcmV0dXJuIHdpZGdldE5hbWU7XG59XG5mdW5jdGlvbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIoc3RyKSB7XG4gIGlmICghc3RyKSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpO1xufVxuZXhwb3J0IHZhciBnZXRXaWRnZXQgPSBmdW5jdGlvbiBnZXRXaWRnZXQobmFtZSwgd2lkZ2V0cykge1xuICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tuYW1lXTtcbiAgLy8gbmFtZSDovazmiJDpppblrZfmr43lpKflhplcbiAgaWYgKCF3aWRnZXQpIHtcbiAgICB3aWRnZXQgPSB3aWRnZXRzW2NhcGl0YWxpemVGaXJzdExldHRlcihuYW1lKV07XG4gIH1cbiAgaWYgKCF3aWRnZXQpIHtcbiAgICB3aWRnZXQgPSB3aWRnZXRzWydIdG1sJ10gfHwgbnVsbDtcbiAgfVxuICByZXR1cm4gd2lkZ2V0O1xufTtcbmV4cG9ydCB2YXIgZXh0cmFTY2hlbWFMaXN0ID0ge1xuICBjaGVja2JveDoge1xuICAgIHZhbHVlUHJvcE5hbWU6ICdjaGVja2VkJ1xuICB9LFxuICBzd2l0Y2g6IHtcbiAgICB2YWx1ZVByb3BOYW1lOiAnY2hlY2tlZCdcbiAgfVxufTsiLCIndXNlIHN0cmljdCdcclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cdFwiYWxpY2VibHVlXCI6IFsyNDAsIDI0OCwgMjU1XSxcclxuXHRcImFudGlxdWV3aGl0ZVwiOiBbMjUwLCAyMzUsIDIxNV0sXHJcblx0XCJhcXVhXCI6IFswLCAyNTUsIDI1NV0sXHJcblx0XCJhcXVhbWFyaW5lXCI6IFsxMjcsIDI1NSwgMjEyXSxcclxuXHRcImF6dXJlXCI6IFsyNDAsIDI1NSwgMjU1XSxcclxuXHRcImJlaWdlXCI6IFsyNDUsIDI0NSwgMjIwXSxcclxuXHRcImJpc3F1ZVwiOiBbMjU1LCAyMjgsIDE5Nl0sXHJcblx0XCJibGFja1wiOiBbMCwgMCwgMF0sXHJcblx0XCJibGFuY2hlZGFsbW9uZFwiOiBbMjU1LCAyMzUsIDIwNV0sXHJcblx0XCJibHVlXCI6IFswLCAwLCAyNTVdLFxyXG5cdFwiYmx1ZXZpb2xldFwiOiBbMTM4LCA0MywgMjI2XSxcclxuXHRcImJyb3duXCI6IFsxNjUsIDQyLCA0Ml0sXHJcblx0XCJidXJseXdvb2RcIjogWzIyMiwgMTg0LCAxMzVdLFxyXG5cdFwiY2FkZXRibHVlXCI6IFs5NSwgMTU4LCAxNjBdLFxyXG5cdFwiY2hhcnRyZXVzZVwiOiBbMTI3LCAyNTUsIDBdLFxyXG5cdFwiY2hvY29sYXRlXCI6IFsyMTAsIDEwNSwgMzBdLFxyXG5cdFwiY29yYWxcIjogWzI1NSwgMTI3LCA4MF0sXHJcblx0XCJjb3JuZmxvd2VyYmx1ZVwiOiBbMTAwLCAxNDksIDIzN10sXHJcblx0XCJjb3Juc2lsa1wiOiBbMjU1LCAyNDgsIDIyMF0sXHJcblx0XCJjcmltc29uXCI6IFsyMjAsIDIwLCA2MF0sXHJcblx0XCJjeWFuXCI6IFswLCAyNTUsIDI1NV0sXHJcblx0XCJkYXJrYmx1ZVwiOiBbMCwgMCwgMTM5XSxcclxuXHRcImRhcmtjeWFuXCI6IFswLCAxMzksIDEzOV0sXHJcblx0XCJkYXJrZ29sZGVucm9kXCI6IFsxODQsIDEzNCwgMTFdLFxyXG5cdFwiZGFya2dyYXlcIjogWzE2OSwgMTY5LCAxNjldLFxyXG5cdFwiZGFya2dyZWVuXCI6IFswLCAxMDAsIDBdLFxyXG5cdFwiZGFya2dyZXlcIjogWzE2OSwgMTY5LCAxNjldLFxyXG5cdFwiZGFya2toYWtpXCI6IFsxODksIDE4MywgMTA3XSxcclxuXHRcImRhcmttYWdlbnRhXCI6IFsxMzksIDAsIDEzOV0sXHJcblx0XCJkYXJrb2xpdmVncmVlblwiOiBbODUsIDEwNywgNDddLFxyXG5cdFwiZGFya29yYW5nZVwiOiBbMjU1LCAxNDAsIDBdLFxyXG5cdFwiZGFya29yY2hpZFwiOiBbMTUzLCA1MCwgMjA0XSxcclxuXHRcImRhcmtyZWRcIjogWzEzOSwgMCwgMF0sXHJcblx0XCJkYXJrc2FsbW9uXCI6IFsyMzMsIDE1MCwgMTIyXSxcclxuXHRcImRhcmtzZWFncmVlblwiOiBbMTQzLCAxODgsIDE0M10sXHJcblx0XCJkYXJrc2xhdGVibHVlXCI6IFs3MiwgNjEsIDEzOV0sXHJcblx0XCJkYXJrc2xhdGVncmF5XCI6IFs0NywgNzksIDc5XSxcclxuXHRcImRhcmtzbGF0ZWdyZXlcIjogWzQ3LCA3OSwgNzldLFxyXG5cdFwiZGFya3R1cnF1b2lzZVwiOiBbMCwgMjA2LCAyMDldLFxyXG5cdFwiZGFya3Zpb2xldFwiOiBbMTQ4LCAwLCAyMTFdLFxyXG5cdFwiZGVlcHBpbmtcIjogWzI1NSwgMjAsIDE0N10sXHJcblx0XCJkZWVwc2t5Ymx1ZVwiOiBbMCwgMTkxLCAyNTVdLFxyXG5cdFwiZGltZ3JheVwiOiBbMTA1LCAxMDUsIDEwNV0sXHJcblx0XCJkaW1ncmV5XCI6IFsxMDUsIDEwNSwgMTA1XSxcclxuXHRcImRvZGdlcmJsdWVcIjogWzMwLCAxNDQsIDI1NV0sXHJcblx0XCJmaXJlYnJpY2tcIjogWzE3OCwgMzQsIDM0XSxcclxuXHRcImZsb3JhbHdoaXRlXCI6IFsyNTUsIDI1MCwgMjQwXSxcclxuXHRcImZvcmVzdGdyZWVuXCI6IFszNCwgMTM5LCAzNF0sXHJcblx0XCJmdWNoc2lhXCI6IFsyNTUsIDAsIDI1NV0sXHJcblx0XCJnYWluc2Jvcm9cIjogWzIyMCwgMjIwLCAyMjBdLFxyXG5cdFwiZ2hvc3R3aGl0ZVwiOiBbMjQ4LCAyNDgsIDI1NV0sXHJcblx0XCJnb2xkXCI6IFsyNTUsIDIxNSwgMF0sXHJcblx0XCJnb2xkZW5yb2RcIjogWzIxOCwgMTY1LCAzMl0sXHJcblx0XCJncmF5XCI6IFsxMjgsIDEyOCwgMTI4XSxcclxuXHRcImdyZWVuXCI6IFswLCAxMjgsIDBdLFxyXG5cdFwiZ3JlZW55ZWxsb3dcIjogWzE3MywgMjU1LCA0N10sXHJcblx0XCJncmV5XCI6IFsxMjgsIDEyOCwgMTI4XSxcclxuXHRcImhvbmV5ZGV3XCI6IFsyNDAsIDI1NSwgMjQwXSxcclxuXHRcImhvdHBpbmtcIjogWzI1NSwgMTA1LCAxODBdLFxyXG5cdFwiaW5kaWFucmVkXCI6IFsyMDUsIDkyLCA5Ml0sXHJcblx0XCJpbmRpZ29cIjogWzc1LCAwLCAxMzBdLFxyXG5cdFwiaXZvcnlcIjogWzI1NSwgMjU1LCAyNDBdLFxyXG5cdFwia2hha2lcIjogWzI0MCwgMjMwLCAxNDBdLFxyXG5cdFwibGF2ZW5kZXJcIjogWzIzMCwgMjMwLCAyNTBdLFxyXG5cdFwibGF2ZW5kZXJibHVzaFwiOiBbMjU1LCAyNDAsIDI0NV0sXHJcblx0XCJsYXduZ3JlZW5cIjogWzEyNCwgMjUyLCAwXSxcclxuXHRcImxlbW9uY2hpZmZvblwiOiBbMjU1LCAyNTAsIDIwNV0sXHJcblx0XCJsaWdodGJsdWVcIjogWzE3MywgMjE2LCAyMzBdLFxyXG5cdFwibGlnaHRjb3JhbFwiOiBbMjQwLCAxMjgsIDEyOF0sXHJcblx0XCJsaWdodGN5YW5cIjogWzIyNCwgMjU1LCAyNTVdLFxyXG5cdFwibGlnaHRnb2xkZW5yb2R5ZWxsb3dcIjogWzI1MCwgMjUwLCAyMTBdLFxyXG5cdFwibGlnaHRncmF5XCI6IFsyMTEsIDIxMSwgMjExXSxcclxuXHRcImxpZ2h0Z3JlZW5cIjogWzE0NCwgMjM4LCAxNDRdLFxyXG5cdFwibGlnaHRncmV5XCI6IFsyMTEsIDIxMSwgMjExXSxcclxuXHRcImxpZ2h0cGlua1wiOiBbMjU1LCAxODIsIDE5M10sXHJcblx0XCJsaWdodHNhbG1vblwiOiBbMjU1LCAxNjAsIDEyMl0sXHJcblx0XCJsaWdodHNlYWdyZWVuXCI6IFszMiwgMTc4LCAxNzBdLFxyXG5cdFwibGlnaHRza3libHVlXCI6IFsxMzUsIDIwNiwgMjUwXSxcclxuXHRcImxpZ2h0c2xhdGVncmF5XCI6IFsxMTksIDEzNiwgMTUzXSxcclxuXHRcImxpZ2h0c2xhdGVncmV5XCI6IFsxMTksIDEzNiwgMTUzXSxcclxuXHRcImxpZ2h0c3RlZWxibHVlXCI6IFsxNzYsIDE5NiwgMjIyXSxcclxuXHRcImxpZ2h0eWVsbG93XCI6IFsyNTUsIDI1NSwgMjI0XSxcclxuXHRcImxpbWVcIjogWzAsIDI1NSwgMF0sXHJcblx0XCJsaW1lZ3JlZW5cIjogWzUwLCAyMDUsIDUwXSxcclxuXHRcImxpbmVuXCI6IFsyNTAsIDI0MCwgMjMwXSxcclxuXHRcIm1hZ2VudGFcIjogWzI1NSwgMCwgMjU1XSxcclxuXHRcIm1hcm9vblwiOiBbMTI4LCAwLCAwXSxcclxuXHRcIm1lZGl1bWFxdWFtYXJpbmVcIjogWzEwMiwgMjA1LCAxNzBdLFxyXG5cdFwibWVkaXVtYmx1ZVwiOiBbMCwgMCwgMjA1XSxcclxuXHRcIm1lZGl1bW9yY2hpZFwiOiBbMTg2LCA4NSwgMjExXSxcclxuXHRcIm1lZGl1bXB1cnBsZVwiOiBbMTQ3LCAxMTIsIDIxOV0sXHJcblx0XCJtZWRpdW1zZWFncmVlblwiOiBbNjAsIDE3OSwgMTEzXSxcclxuXHRcIm1lZGl1bXNsYXRlYmx1ZVwiOiBbMTIzLCAxMDQsIDIzOF0sXHJcblx0XCJtZWRpdW1zcHJpbmdncmVlblwiOiBbMCwgMjUwLCAxNTRdLFxyXG5cdFwibWVkaXVtdHVycXVvaXNlXCI6IFs3MiwgMjA5LCAyMDRdLFxyXG5cdFwibWVkaXVtdmlvbGV0cmVkXCI6IFsxOTksIDIxLCAxMzNdLFxyXG5cdFwibWlkbmlnaHRibHVlXCI6IFsyNSwgMjUsIDExMl0sXHJcblx0XCJtaW50Y3JlYW1cIjogWzI0NSwgMjU1LCAyNTBdLFxyXG5cdFwibWlzdHlyb3NlXCI6IFsyNTUsIDIyOCwgMjI1XSxcclxuXHRcIm1vY2Nhc2luXCI6IFsyNTUsIDIyOCwgMTgxXSxcclxuXHRcIm5hdmFqb3doaXRlXCI6IFsyNTUsIDIyMiwgMTczXSxcclxuXHRcIm5hdnlcIjogWzAsIDAsIDEyOF0sXHJcblx0XCJvbGRsYWNlXCI6IFsyNTMsIDI0NSwgMjMwXSxcclxuXHRcIm9saXZlXCI6IFsxMjgsIDEyOCwgMF0sXHJcblx0XCJvbGl2ZWRyYWJcIjogWzEwNywgMTQyLCAzNV0sXHJcblx0XCJvcmFuZ2VcIjogWzI1NSwgMTY1LCAwXSxcclxuXHRcIm9yYW5nZXJlZFwiOiBbMjU1LCA2OSwgMF0sXHJcblx0XCJvcmNoaWRcIjogWzIxOCwgMTEyLCAyMTRdLFxyXG5cdFwicGFsZWdvbGRlbnJvZFwiOiBbMjM4LCAyMzIsIDE3MF0sXHJcblx0XCJwYWxlZ3JlZW5cIjogWzE1MiwgMjUxLCAxNTJdLFxyXG5cdFwicGFsZXR1cnF1b2lzZVwiOiBbMTc1LCAyMzgsIDIzOF0sXHJcblx0XCJwYWxldmlvbGV0cmVkXCI6IFsyMTksIDExMiwgMTQ3XSxcclxuXHRcInBhcGF5YXdoaXBcIjogWzI1NSwgMjM5LCAyMTNdLFxyXG5cdFwicGVhY2hwdWZmXCI6IFsyNTUsIDIxOCwgMTg1XSxcclxuXHRcInBlcnVcIjogWzIwNSwgMTMzLCA2M10sXHJcblx0XCJwaW5rXCI6IFsyNTUsIDE5MiwgMjAzXSxcclxuXHRcInBsdW1cIjogWzIyMSwgMTYwLCAyMjFdLFxyXG5cdFwicG93ZGVyYmx1ZVwiOiBbMTc2LCAyMjQsIDIzMF0sXHJcblx0XCJwdXJwbGVcIjogWzEyOCwgMCwgMTI4XSxcclxuXHRcInJlYmVjY2FwdXJwbGVcIjogWzEwMiwgNTEsIDE1M10sXHJcblx0XCJyZWRcIjogWzI1NSwgMCwgMF0sXHJcblx0XCJyb3N5YnJvd25cIjogWzE4OCwgMTQzLCAxNDNdLFxyXG5cdFwicm95YWxibHVlXCI6IFs2NSwgMTA1LCAyMjVdLFxyXG5cdFwic2FkZGxlYnJvd25cIjogWzEzOSwgNjksIDE5XSxcclxuXHRcInNhbG1vblwiOiBbMjUwLCAxMjgsIDExNF0sXHJcblx0XCJzYW5keWJyb3duXCI6IFsyNDQsIDE2NCwgOTZdLFxyXG5cdFwic2VhZ3JlZW5cIjogWzQ2LCAxMzksIDg3XSxcclxuXHRcInNlYXNoZWxsXCI6IFsyNTUsIDI0NSwgMjM4XSxcclxuXHRcInNpZW5uYVwiOiBbMTYwLCA4MiwgNDVdLFxyXG5cdFwic2lsdmVyXCI6IFsxOTIsIDE5MiwgMTkyXSxcclxuXHRcInNreWJsdWVcIjogWzEzNSwgMjA2LCAyMzVdLFxyXG5cdFwic2xhdGVibHVlXCI6IFsxMDYsIDkwLCAyMDVdLFxyXG5cdFwic2xhdGVncmF5XCI6IFsxMTIsIDEyOCwgMTQ0XSxcclxuXHRcInNsYXRlZ3JleVwiOiBbMTEyLCAxMjgsIDE0NF0sXHJcblx0XCJzbm93XCI6IFsyNTUsIDI1MCwgMjUwXSxcclxuXHRcInNwcmluZ2dyZWVuXCI6IFswLCAyNTUsIDEyN10sXHJcblx0XCJzdGVlbGJsdWVcIjogWzcwLCAxMzAsIDE4MF0sXHJcblx0XCJ0YW5cIjogWzIxMCwgMTgwLCAxNDBdLFxyXG5cdFwidGVhbFwiOiBbMCwgMTI4LCAxMjhdLFxyXG5cdFwidGhpc3RsZVwiOiBbMjE2LCAxOTEsIDIxNl0sXHJcblx0XCJ0b21hdG9cIjogWzI1NSwgOTksIDcxXSxcclxuXHRcInR1cnF1b2lzZVwiOiBbNjQsIDIyNCwgMjA4XSxcclxuXHRcInZpb2xldFwiOiBbMjM4LCAxMzAsIDIzOF0sXHJcblx0XCJ3aGVhdFwiOiBbMjQ1LCAyMjIsIDE3OV0sXHJcblx0XCJ3aGl0ZVwiOiBbMjU1LCAyNTUsIDI1NV0sXHJcblx0XCJ3aGl0ZXNtb2tlXCI6IFsyNDUsIDI0NSwgMjQ1XSxcclxuXHRcInllbGxvd1wiOiBbMjU1LCAyNTUsIDBdLFxyXG5cdFwieWVsbG93Z3JlZW5cIjogWzE1NCwgMjA1LCA1MF1cclxufTtcclxuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0FycmF5aXNoKG9iaikge1xuXHRpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHJldHVybiBvYmogaW5zdGFuY2VvZiBBcnJheSB8fCBBcnJheS5pc0FycmF5KG9iaikgfHxcblx0XHQob2JqLmxlbmd0aCA+PSAwICYmIChvYmouc3BsaWNlIGluc3RhbmNlb2YgRnVuY3Rpb24gfHxcblx0XHRcdChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgKG9iai5sZW5ndGggLSAxKSkgJiYgb2JqLmNvbnN0cnVjdG9yLm5hbWUgIT09ICdTdHJpbmcnKSkpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGlzQXJyYXlpc2ggPSByZXF1aXJlKCdpcy1hcnJheWlzaCcpO1xuXG52YXIgY29uY2F0ID0gQXJyYXkucHJvdG90eXBlLmNvbmNhdDtcbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcblxudmFyIHN3aXp6bGUgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHN3aXp6bGUoYXJncykge1xuXHR2YXIgcmVzdWx0cyA9IFtdO1xuXG5cdGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcmdzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0dmFyIGFyZyA9IGFyZ3NbaV07XG5cblx0XHRpZiAoaXNBcnJheWlzaChhcmcpKSB7XG5cdFx0XHQvLyBodHRwOi8vanNwZXJmLmNvbS9qYXZhc2NyaXB0LWFycmF5LWNvbmNhdC12cy1wdXNoLzk4XG5cdFx0XHRyZXN1bHRzID0gY29uY2F0LmNhbGwocmVzdWx0cywgc2xpY2UuY2FsbChhcmcpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVzdWx0cy5wdXNoKGFyZyk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG5zd2l6emxlLndyYXAgPSBmdW5jdGlvbiAoZm4pIHtcblx0cmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gZm4oc3dpenpsZShhcmd1bWVudHMpKTtcblx0fTtcbn07XG4iLCIvKiBNSVQgbGljZW5zZSAqL1xudmFyIGNvbG9yTmFtZXMgPSByZXF1aXJlKCdjb2xvci1uYW1lJyk7XG52YXIgc3dpenpsZSA9IHJlcXVpcmUoJ3NpbXBsZS1zd2l6emxlJyk7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QuaGFzT3duUHJvcGVydHk7XG5cbnZhciByZXZlcnNlTmFtZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4vLyBjcmVhdGUgYSBsaXN0IG9mIHJldmVyc2UgY29sb3IgbmFtZXNcbmZvciAodmFyIG5hbWUgaW4gY29sb3JOYW1lcykge1xuXHRpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb2xvck5hbWVzLCBuYW1lKSkge1xuXHRcdHJldmVyc2VOYW1lc1tjb2xvck5hbWVzW25hbWVdXSA9IG5hbWU7XG5cdH1cbn1cblxudmFyIGNzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG5cdHRvOiB7fSxcblx0Z2V0OiB7fVxufTtcblxuY3MuZ2V0ID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHR2YXIgcHJlZml4ID0gc3RyaW5nLnN1YnN0cmluZygwLCAzKS50b0xvd2VyQ2FzZSgpO1xuXHR2YXIgdmFsO1xuXHR2YXIgbW9kZWw7XG5cdHN3aXRjaCAocHJlZml4KSB7XG5cdFx0Y2FzZSAnaHNsJzpcblx0XHRcdHZhbCA9IGNzLmdldC5oc2woc3RyaW5nKTtcblx0XHRcdG1vZGVsID0gJ2hzbCc7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdod2InOlxuXHRcdFx0dmFsID0gY3MuZ2V0Lmh3YihzdHJpbmcpO1xuXHRcdFx0bW9kZWwgPSAnaHdiJztcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHR2YWwgPSBjcy5nZXQucmdiKHN0cmluZyk7XG5cdFx0XHRtb2RlbCA9ICdyZ2InO1xuXHRcdFx0YnJlYWs7XG5cdH1cblxuXHRpZiAoIXZhbCkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0cmV0dXJuIHttb2RlbDogbW9kZWwsIHZhbHVlOiB2YWx9O1xufTtcblxuY3MuZ2V0LnJnYiA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0aWYgKCFzdHJpbmcpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdHZhciBhYmJyID0gL14jKFthLWYwLTldezMsNH0pJC9pO1xuXHR2YXIgaGV4ID0gL14jKFthLWYwLTldezZ9KShbYS1mMC05XXsyfSk/JC9pO1xuXHR2YXIgcmdiYSA9IC9ecmdiYT9cXChcXHMqKFsrLV0/XFxkKykoPz1bXFxzLF0pXFxzKig/OixcXHMqKT8oWystXT9cXGQrKSg/PVtcXHMsXSlcXHMqKD86LFxccyopPyhbKy1dP1xcZCspXFxzKig/OlssfFxcL11cXHMqKFsrLV0/W1xcZFxcLl0rKSglPylcXHMqKT9cXCkkLztcblx0dmFyIHBlciA9IC9ecmdiYT9cXChcXHMqKFsrLV0/W1xcZFxcLl0rKVxcJVxccyosP1xccyooWystXT9bXFxkXFwuXSspXFwlXFxzKiw/XFxzKihbKy1dP1tcXGRcXC5dKylcXCVcXHMqKD86Wyx8XFwvXVxccyooWystXT9bXFxkXFwuXSspKCU/KVxccyopP1xcKSQvO1xuXHR2YXIga2V5d29yZCA9IC9eKFxcdyspJC87XG5cblx0dmFyIHJnYiA9IFswLCAwLCAwLCAxXTtcblx0dmFyIG1hdGNoO1xuXHR2YXIgaTtcblx0dmFyIGhleEFscGhhO1xuXG5cdGlmIChtYXRjaCA9IHN0cmluZy5tYXRjaChoZXgpKSB7XG5cdFx0aGV4QWxwaGEgPSBtYXRjaFsyXTtcblx0XHRtYXRjaCA9IG1hdGNoWzFdO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdFx0Ly8gaHR0cHM6Ly9qc3BlcmYuY29tL3NsaWNlLXZzLXN1YnN0ci12cy1zdWJzdHJpbmctbWV0aG9kcy1sb25nLXN0cmluZy8xOVxuXHRcdFx0dmFyIGkyID0gaSAqIDI7XG5cdFx0XHRyZ2JbaV0gPSBwYXJzZUludChtYXRjaC5zbGljZShpMiwgaTIgKyAyKSwgMTYpO1xuXHRcdH1cblxuXHRcdGlmIChoZXhBbHBoYSkge1xuXHRcdFx0cmdiWzNdID0gcGFyc2VJbnQoaGV4QWxwaGEsIDE2KSAvIDI1NTtcblx0XHR9XG5cdH0gZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2goYWJicikpIHtcblx0XHRtYXRjaCA9IG1hdGNoWzFdO1xuXHRcdGhleEFscGhhID0gbWF0Y2hbM107XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0XHRyZ2JbaV0gPSBwYXJzZUludChtYXRjaFtpXSArIG1hdGNoW2ldLCAxNik7XG5cdFx0fVxuXG5cdFx0aWYgKGhleEFscGhhKSB7XG5cdFx0XHRyZ2JbM10gPSBwYXJzZUludChoZXhBbHBoYSArIGhleEFscGhhLCAxNikgLyAyNTU7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG1hdGNoID0gc3RyaW5nLm1hdGNoKHJnYmEpKSB7XG5cdFx0Zm9yIChpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdFx0cmdiW2ldID0gcGFyc2VJbnQobWF0Y2hbaSArIDFdLCAwKTtcblx0XHR9XG5cblx0XHRpZiAobWF0Y2hbNF0pIHtcblx0XHRcdGlmIChtYXRjaFs1XSkge1xuXHRcdFx0XHRyZ2JbM10gPSBwYXJzZUZsb2F0KG1hdGNoWzRdKSAqIDAuMDE7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZ2JbM10gPSBwYXJzZUZsb2F0KG1hdGNoWzRdKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2gocGVyKSkge1xuXHRcdGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRcdHJnYltpXSA9IE1hdGgucm91bmQocGFyc2VGbG9hdChtYXRjaFtpICsgMV0pICogMi41NSk7XG5cdFx0fVxuXG5cdFx0aWYgKG1hdGNoWzRdKSB7XG5cdFx0XHRpZiAobWF0Y2hbNV0pIHtcblx0XHRcdFx0cmdiWzNdID0gcGFyc2VGbG9hdChtYXRjaFs0XSkgKiAwLjAxO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmdiWzNdID0gcGFyc2VGbG9hdChtYXRjaFs0XSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG1hdGNoID0gc3RyaW5nLm1hdGNoKGtleXdvcmQpKSB7XG5cdFx0aWYgKG1hdGNoWzFdID09PSAndHJhbnNwYXJlbnQnKSB7XG5cdFx0XHRyZXR1cm4gWzAsIDAsIDAsIDBdO1xuXHRcdH1cblxuXHRcdGlmICghaGFzT3duUHJvcGVydHkuY2FsbChjb2xvck5hbWVzLCBtYXRjaFsxXSkpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdHJnYiA9IGNvbG9yTmFtZXNbbWF0Y2hbMV1dO1xuXHRcdHJnYlszXSA9IDE7XG5cblx0XHRyZXR1cm4gcmdiO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Zm9yIChpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdHJnYltpXSA9IGNsYW1wKHJnYltpXSwgMCwgMjU1KTtcblx0fVxuXHRyZ2JbM10gPSBjbGFtcChyZ2JbM10sIDAsIDEpO1xuXG5cdHJldHVybiByZ2I7XG59O1xuXG5jcy5nZXQuaHNsID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHRpZiAoIXN0cmluZykge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0dmFyIGhzbCA9IC9eaHNsYT9cXChcXHMqKFsrLV0/KD86XFxkezAsM31cXC4pP1xcZCspKD86ZGVnKT9cXHMqLD9cXHMqKFsrLV0/W1xcZFxcLl0rKSVcXHMqLD9cXHMqKFsrLV0/W1xcZFxcLl0rKSVcXHMqKD86Wyx8XFwvXVxccyooWystXT8oPz1cXC5cXGR8XFxkKSg/OjB8WzEtOV1cXGQqKT8oPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pXFxzKik/XFwpJC87XG5cdHZhciBtYXRjaCA9IHN0cmluZy5tYXRjaChoc2wpO1xuXG5cdGlmIChtYXRjaCkge1xuXHRcdHZhciBhbHBoYSA9IHBhcnNlRmxvYXQobWF0Y2hbNF0pO1xuXHRcdHZhciBoID0gKChwYXJzZUZsb2F0KG1hdGNoWzFdKSAlIDM2MCkgKyAzNjApICUgMzYwO1xuXHRcdHZhciBzID0gY2xhbXAocGFyc2VGbG9hdChtYXRjaFsyXSksIDAsIDEwMCk7XG5cdFx0dmFyIGwgPSBjbGFtcChwYXJzZUZsb2F0KG1hdGNoWzNdKSwgMCwgMTAwKTtcblx0XHR2YXIgYSA9IGNsYW1wKGlzTmFOKGFscGhhKSA/IDEgOiBhbHBoYSwgMCwgMSk7XG5cblx0XHRyZXR1cm4gW2gsIHMsIGwsIGFdO1xuXHR9XG5cblx0cmV0dXJuIG51bGw7XG59O1xuXG5jcy5nZXQuaHdiID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHRpZiAoIXN0cmluZykge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0dmFyIGh3YiA9IC9eaHdiXFwoXFxzKihbKy1dP1xcZHswLDN9KD86XFwuXFxkKyk/KSg/OmRlZyk/XFxzKixcXHMqKFsrLV0/W1xcZFxcLl0rKSVcXHMqLFxccyooWystXT9bXFxkXFwuXSspJVxccyooPzosXFxzKihbKy1dPyg/PVxcLlxcZHxcXGQpKD86MHxbMS05XVxcZCopPyg/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPylcXHMqKT9cXCkkLztcblx0dmFyIG1hdGNoID0gc3RyaW5nLm1hdGNoKGh3Yik7XG5cblx0aWYgKG1hdGNoKSB7XG5cdFx0dmFyIGFscGhhID0gcGFyc2VGbG9hdChtYXRjaFs0XSk7XG5cdFx0dmFyIGggPSAoKHBhcnNlRmxvYXQobWF0Y2hbMV0pICUgMzYwKSArIDM2MCkgJSAzNjA7XG5cdFx0dmFyIHcgPSBjbGFtcChwYXJzZUZsb2F0KG1hdGNoWzJdKSwgMCwgMTAwKTtcblx0XHR2YXIgYiA9IGNsYW1wKHBhcnNlRmxvYXQobWF0Y2hbM10pLCAwLCAxMDApO1xuXHRcdHZhciBhID0gY2xhbXAoaXNOYU4oYWxwaGEpID8gMSA6IGFscGhhLCAwLCAxKTtcblx0XHRyZXR1cm4gW2gsIHcsIGIsIGFdO1xuXHR9XG5cblx0cmV0dXJuIG51bGw7XG59O1xuXG5jcy50by5oZXggPSBmdW5jdGlvbiAoKSB7XG5cdHZhciByZ2JhID0gc3dpenpsZShhcmd1bWVudHMpO1xuXG5cdHJldHVybiAoXG5cdFx0JyMnICtcblx0XHRoZXhEb3VibGUocmdiYVswXSkgK1xuXHRcdGhleERvdWJsZShyZ2JhWzFdKSArXG5cdFx0aGV4RG91YmxlKHJnYmFbMl0pICtcblx0XHQocmdiYVszXSA8IDFcblx0XHRcdD8gKGhleERvdWJsZShNYXRoLnJvdW5kKHJnYmFbM10gKiAyNTUpKSlcblx0XHRcdDogJycpXG5cdCk7XG59O1xuXG5jcy50by5yZ2IgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciByZ2JhID0gc3dpenpsZShhcmd1bWVudHMpO1xuXG5cdHJldHVybiByZ2JhLmxlbmd0aCA8IDQgfHwgcmdiYVszXSA9PT0gMVxuXHRcdD8gJ3JnYignICsgTWF0aC5yb3VuZChyZ2JhWzBdKSArICcsICcgKyBNYXRoLnJvdW5kKHJnYmFbMV0pICsgJywgJyArIE1hdGgucm91bmQocmdiYVsyXSkgKyAnKSdcblx0XHQ6ICdyZ2JhKCcgKyBNYXRoLnJvdW5kKHJnYmFbMF0pICsgJywgJyArIE1hdGgucm91bmQocmdiYVsxXSkgKyAnLCAnICsgTWF0aC5yb3VuZChyZ2JhWzJdKSArICcsICcgKyByZ2JhWzNdICsgJyknO1xufTtcblxuY3MudG8ucmdiLnBlcmNlbnQgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciByZ2JhID0gc3dpenpsZShhcmd1bWVudHMpO1xuXG5cdHZhciByID0gTWF0aC5yb3VuZChyZ2JhWzBdIC8gMjU1ICogMTAwKTtcblx0dmFyIGcgPSBNYXRoLnJvdW5kKHJnYmFbMV0gLyAyNTUgKiAxMDApO1xuXHR2YXIgYiA9IE1hdGgucm91bmQocmdiYVsyXSAvIDI1NSAqIDEwMCk7XG5cblx0cmV0dXJuIHJnYmEubGVuZ3RoIDwgNCB8fCByZ2JhWzNdID09PSAxXG5cdFx0PyAncmdiKCcgKyByICsgJyUsICcgKyBnICsgJyUsICcgKyBiICsgJyUpJ1xuXHRcdDogJ3JnYmEoJyArIHIgKyAnJSwgJyArIGcgKyAnJSwgJyArIGIgKyAnJSwgJyArIHJnYmFbM10gKyAnKSc7XG59O1xuXG5jcy50by5oc2wgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBoc2xhID0gc3dpenpsZShhcmd1bWVudHMpO1xuXHRyZXR1cm4gaHNsYS5sZW5ndGggPCA0IHx8IGhzbGFbM10gPT09IDFcblx0XHQ/ICdoc2woJyArIGhzbGFbMF0gKyAnLCAnICsgaHNsYVsxXSArICclLCAnICsgaHNsYVsyXSArICclKSdcblx0XHQ6ICdoc2xhKCcgKyBoc2xhWzBdICsgJywgJyArIGhzbGFbMV0gKyAnJSwgJyArIGhzbGFbMl0gKyAnJSwgJyArIGhzbGFbM10gKyAnKSc7XG59O1xuXG4vLyBod2IgaXMgYSBiaXQgZGlmZmVyZW50IHRoYW4gcmdiKGEpICYgaHNsKGEpIHNpbmNlIHRoZXJlIGlzIG5vIGFscGhhIHNwZWNpZmljIHN5bnRheFxuLy8gKGh3YiBoYXZlIGFscGhhIG9wdGlvbmFsICYgMSBpcyBkZWZhdWx0IHZhbHVlKVxuY3MudG8uaHdiID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgaHdiYSA9IHN3aXp6bGUoYXJndW1lbnRzKTtcblxuXHR2YXIgYSA9ICcnO1xuXHRpZiAoaHdiYS5sZW5ndGggPj0gNCAmJiBod2JhWzNdICE9PSAxKSB7XG5cdFx0YSA9ICcsICcgKyBod2JhWzNdO1xuXHR9XG5cblx0cmV0dXJuICdod2IoJyArIGh3YmFbMF0gKyAnLCAnICsgaHdiYVsxXSArICclLCAnICsgaHdiYVsyXSArICclJyArIGEgKyAnKSc7XG59O1xuXG5jcy50by5rZXl3b3JkID0gZnVuY3Rpb24gKHJnYikge1xuXHRyZXR1cm4gcmV2ZXJzZU5hbWVzW3JnYi5zbGljZSgwLCAzKV07XG59O1xuXG4vLyBoZWxwZXJzXG5mdW5jdGlvbiBjbGFtcChudW0sIG1pbiwgbWF4KSB7XG5cdHJldHVybiBNYXRoLm1pbihNYXRoLm1heChtaW4sIG51bSksIG1heCk7XG59XG5cbmZ1bmN0aW9uIGhleERvdWJsZShudW0pIHtcblx0dmFyIHN0ciA9IE1hdGgucm91bmQobnVtKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcblx0cmV0dXJuIChzdHIubGVuZ3RoIDwgMikgPyAnMCcgKyBzdHIgOiBzdHI7XG59XG4iLCIvKiBNSVQgbGljZW5zZSAqL1xudmFyIGNzc0tleXdvcmRzID0gcmVxdWlyZSgnY29sb3ItbmFtZScpO1xuXG4vLyBOT1RFOiBjb252ZXJzaW9ucyBzaG91bGQgb25seSByZXR1cm4gcHJpbWl0aXZlIHZhbHVlcyAoaS5lLiBhcnJheXMsIG9yXG4vLyAgICAgICB2YWx1ZXMgdGhhdCBnaXZlIGNvcnJlY3QgYHR5cGVvZmAgcmVzdWx0cykuXG4vLyAgICAgICBkbyBub3QgdXNlIGJveCB2YWx1ZXMgdHlwZXMgKGkuZS4gTnVtYmVyKCksIFN0cmluZygpLCBldGMuKVxuXG52YXIgcmV2ZXJzZUtleXdvcmRzID0ge307XG5mb3IgKHZhciBrZXkgaW4gY3NzS2V5d29yZHMpIHtcblx0aWYgKGNzc0tleXdvcmRzLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0XHRyZXZlcnNlS2V5d29yZHNbY3NzS2V5d29yZHNba2V5XV0gPSBrZXk7XG5cdH1cbn1cblxudmFyIGNvbnZlcnQgPSBtb2R1bGUuZXhwb3J0cyA9IHtcblx0cmdiOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ3JnYid9LFxuXHRoc2w6IHtjaGFubmVsczogMywgbGFiZWxzOiAnaHNsJ30sXG5cdGhzdjoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdoc3YnfSxcblx0aHdiOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2h3Yid9LFxuXHRjbXlrOiB7Y2hhbm5lbHM6IDQsIGxhYmVsczogJ2NteWsnfSxcblx0eHl6OiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ3h5eid9LFxuXHRsYWI6IHtjaGFubmVsczogMywgbGFiZWxzOiAnbGFiJ30sXG5cdGxjaDoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdsY2gnfSxcblx0aGV4OiB7Y2hhbm5lbHM6IDEsIGxhYmVsczogWydoZXgnXX0sXG5cdGtleXdvcmQ6IHtjaGFubmVsczogMSwgbGFiZWxzOiBbJ2tleXdvcmQnXX0sXG5cdGFuc2kxNjoge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsnYW5zaTE2J119LFxuXHRhbnNpMjU2OiB7Y2hhbm5lbHM6IDEsIGxhYmVsczogWydhbnNpMjU2J119LFxuXHRoY2c6IHtjaGFubmVsczogMywgbGFiZWxzOiBbJ2gnLCAnYycsICdnJ119LFxuXHRhcHBsZToge2NoYW5uZWxzOiAzLCBsYWJlbHM6IFsncjE2JywgJ2cxNicsICdiMTYnXX0sXG5cdGdyYXk6IHtjaGFubmVsczogMSwgbGFiZWxzOiBbJ2dyYXknXX1cbn07XG5cbi8vIGhpZGUgLmNoYW5uZWxzIGFuZCAubGFiZWxzIHByb3BlcnRpZXNcbmZvciAodmFyIG1vZGVsIGluIGNvbnZlcnQpIHtcblx0aWYgKGNvbnZlcnQuaGFzT3duUHJvcGVydHkobW9kZWwpKSB7XG5cdFx0aWYgKCEoJ2NoYW5uZWxzJyBpbiBjb252ZXJ0W21vZGVsXSkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignbWlzc2luZyBjaGFubmVscyBwcm9wZXJ0eTogJyArIG1vZGVsKTtcblx0XHR9XG5cblx0XHRpZiAoISgnbGFiZWxzJyBpbiBjb252ZXJ0W21vZGVsXSkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignbWlzc2luZyBjaGFubmVsIGxhYmVscyBwcm9wZXJ0eTogJyArIG1vZGVsKTtcblx0XHR9XG5cblx0XHRpZiAoY29udmVydFttb2RlbF0ubGFiZWxzLmxlbmd0aCAhPT0gY29udmVydFttb2RlbF0uY2hhbm5lbHMpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignY2hhbm5lbCBhbmQgbGFiZWwgY291bnRzIG1pc21hdGNoOiAnICsgbW9kZWwpO1xuXHRcdH1cblxuXHRcdHZhciBjaGFubmVscyA9IGNvbnZlcnRbbW9kZWxdLmNoYW5uZWxzO1xuXHRcdHZhciBsYWJlbHMgPSBjb252ZXJ0W21vZGVsXS5sYWJlbHM7XG5cdFx0ZGVsZXRlIGNvbnZlcnRbbW9kZWxdLmNoYW5uZWxzO1xuXHRcdGRlbGV0ZSBjb252ZXJ0W21vZGVsXS5sYWJlbHM7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnZlcnRbbW9kZWxdLCAnY2hhbm5lbHMnLCB7dmFsdWU6IGNoYW5uZWxzfSk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnZlcnRbbW9kZWxdLCAnbGFiZWxzJywge3ZhbHVlOiBsYWJlbHN9KTtcblx0fVxufVxuXG5jb252ZXJ0LnJnYi5oc2wgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHZhciByID0gcmdiWzBdIC8gMjU1O1xuXHR2YXIgZyA9IHJnYlsxXSAvIDI1NTtcblx0dmFyIGIgPSByZ2JbMl0gLyAyNTU7XG5cdHZhciBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKTtcblx0dmFyIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpO1xuXHR2YXIgZGVsdGEgPSBtYXggLSBtaW47XG5cdHZhciBoO1xuXHR2YXIgcztcblx0dmFyIGw7XG5cblx0aWYgKG1heCA9PT0gbWluKSB7XG5cdFx0aCA9IDA7XG5cdH0gZWxzZSBpZiAociA9PT0gbWF4KSB7XG5cdFx0aCA9IChnIC0gYikgLyBkZWx0YTtcblx0fSBlbHNlIGlmIChnID09PSBtYXgpIHtcblx0XHRoID0gMiArIChiIC0gcikgLyBkZWx0YTtcblx0fSBlbHNlIGlmIChiID09PSBtYXgpIHtcblx0XHRoID0gNCArIChyIC0gZykgLyBkZWx0YTtcblx0fVxuXG5cdGggPSBNYXRoLm1pbihoICogNjAsIDM2MCk7XG5cblx0aWYgKGggPCAwKSB7XG5cdFx0aCArPSAzNjA7XG5cdH1cblxuXHRsID0gKG1pbiArIG1heCkgLyAyO1xuXG5cdGlmIChtYXggPT09IG1pbikge1xuXHRcdHMgPSAwO1xuXHR9IGVsc2UgaWYgKGwgPD0gMC41KSB7XG5cdFx0cyA9IGRlbHRhIC8gKG1heCArIG1pbik7XG5cdH0gZWxzZSB7XG5cdFx0cyA9IGRlbHRhIC8gKDIgLSBtYXggLSBtaW4pO1xuXHR9XG5cblx0cmV0dXJuIFtoLCBzICogMTAwLCBsICogMTAwXTtcbn07XG5cbmNvbnZlcnQucmdiLmhzdiA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHJkaWY7XG5cdHZhciBnZGlmO1xuXHR2YXIgYmRpZjtcblx0dmFyIGg7XG5cdHZhciBzO1xuXG5cdHZhciByID0gcmdiWzBdIC8gMjU1O1xuXHR2YXIgZyA9IHJnYlsxXSAvIDI1NTtcblx0dmFyIGIgPSByZ2JbMl0gLyAyNTU7XG5cdHZhciB2ID0gTWF0aC5tYXgociwgZywgYik7XG5cdHZhciBkaWZmID0gdiAtIE1hdGgubWluKHIsIGcsIGIpO1xuXHR2YXIgZGlmZmMgPSBmdW5jdGlvbiAoYykge1xuXHRcdHJldHVybiAodiAtIGMpIC8gNiAvIGRpZmYgKyAxIC8gMjtcblx0fTtcblxuXHRpZiAoZGlmZiA9PT0gMCkge1xuXHRcdGggPSBzID0gMDtcblx0fSBlbHNlIHtcblx0XHRzID0gZGlmZiAvIHY7XG5cdFx0cmRpZiA9IGRpZmZjKHIpO1xuXHRcdGdkaWYgPSBkaWZmYyhnKTtcblx0XHRiZGlmID0gZGlmZmMoYik7XG5cblx0XHRpZiAociA9PT0gdikge1xuXHRcdFx0aCA9IGJkaWYgLSBnZGlmO1xuXHRcdH0gZWxzZSBpZiAoZyA9PT0gdikge1xuXHRcdFx0aCA9ICgxIC8gMykgKyByZGlmIC0gYmRpZjtcblx0XHR9IGVsc2UgaWYgKGIgPT09IHYpIHtcblx0XHRcdGggPSAoMiAvIDMpICsgZ2RpZiAtIHJkaWY7XG5cdFx0fVxuXHRcdGlmIChoIDwgMCkge1xuXHRcdFx0aCArPSAxO1xuXHRcdH0gZWxzZSBpZiAoaCA+IDEpIHtcblx0XHRcdGggLT0gMTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gW1xuXHRcdGggKiAzNjAsXG5cdFx0cyAqIDEwMCxcblx0XHR2ICogMTAwXG5cdF07XG59O1xuXG5jb252ZXJ0LnJnYi5od2IgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHZhciByID0gcmdiWzBdO1xuXHR2YXIgZyA9IHJnYlsxXTtcblx0dmFyIGIgPSByZ2JbMl07XG5cdHZhciBoID0gY29udmVydC5yZ2IuaHNsKHJnYilbMF07XG5cdHZhciB3ID0gMSAvIDI1NSAqIE1hdGgubWluKHIsIE1hdGgubWluKGcsIGIpKTtcblxuXHRiID0gMSAtIDEgLyAyNTUgKiBNYXRoLm1heChyLCBNYXRoLm1heChnLCBiKSk7XG5cblx0cmV0dXJuIFtoLCB3ICogMTAwLCBiICogMTAwXTtcbn07XG5cbmNvbnZlcnQucmdiLmNteWsgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHZhciByID0gcmdiWzBdIC8gMjU1O1xuXHR2YXIgZyA9IHJnYlsxXSAvIDI1NTtcblx0dmFyIGIgPSByZ2JbMl0gLyAyNTU7XG5cdHZhciBjO1xuXHR2YXIgbTtcblx0dmFyIHk7XG5cdHZhciBrO1xuXG5cdGsgPSBNYXRoLm1pbigxIC0gciwgMSAtIGcsIDEgLSBiKTtcblx0YyA9ICgxIC0gciAtIGspIC8gKDEgLSBrKSB8fCAwO1xuXHRtID0gKDEgLSBnIC0gaykgLyAoMSAtIGspIHx8IDA7XG5cdHkgPSAoMSAtIGIgLSBrKSAvICgxIC0gaykgfHwgMDtcblxuXHRyZXR1cm4gW2MgKiAxMDAsIG0gKiAxMDAsIHkgKiAxMDAsIGsgKiAxMDBdO1xufTtcblxuLyoqXG4gKiBTZWUgaHR0cHM6Ly9lbi5tLndpa2lwZWRpYS5vcmcvd2lraS9FdWNsaWRlYW5fZGlzdGFuY2UjU3F1YXJlZF9FdWNsaWRlYW5fZGlzdGFuY2VcbiAqICovXG5mdW5jdGlvbiBjb21wYXJhdGl2ZURpc3RhbmNlKHgsIHkpIHtcblx0cmV0dXJuIChcblx0XHRNYXRoLnBvdyh4WzBdIC0geVswXSwgMikgK1xuXHRcdE1hdGgucG93KHhbMV0gLSB5WzFdLCAyKSArXG5cdFx0TWF0aC5wb3coeFsyXSAtIHlbMl0sIDIpXG5cdCk7XG59XG5cbmNvbnZlcnQucmdiLmtleXdvcmQgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHZhciByZXZlcnNlZCA9IHJldmVyc2VLZXl3b3Jkc1tyZ2JdO1xuXHRpZiAocmV2ZXJzZWQpIHtcblx0XHRyZXR1cm4gcmV2ZXJzZWQ7XG5cdH1cblxuXHR2YXIgY3VycmVudENsb3Nlc3REaXN0YW5jZSA9IEluZmluaXR5O1xuXHR2YXIgY3VycmVudENsb3Nlc3RLZXl3b3JkO1xuXG5cdGZvciAodmFyIGtleXdvcmQgaW4gY3NzS2V5d29yZHMpIHtcblx0XHRpZiAoY3NzS2V5d29yZHMuaGFzT3duUHJvcGVydHkoa2V5d29yZCkpIHtcblx0XHRcdHZhciB2YWx1ZSA9IGNzc0tleXdvcmRzW2tleXdvcmRdO1xuXG5cdFx0XHQvLyBDb21wdXRlIGNvbXBhcmF0aXZlIGRpc3RhbmNlXG5cdFx0XHR2YXIgZGlzdGFuY2UgPSBjb21wYXJhdGl2ZURpc3RhbmNlKHJnYiwgdmFsdWUpO1xuXG5cdFx0XHQvLyBDaGVjayBpZiBpdHMgbGVzcywgaWYgc28gc2V0IGFzIGNsb3Nlc3Rcblx0XHRcdGlmIChkaXN0YW5jZSA8IGN1cnJlbnRDbG9zZXN0RGlzdGFuY2UpIHtcblx0XHRcdFx0Y3VycmVudENsb3Nlc3REaXN0YW5jZSA9IGRpc3RhbmNlO1xuXHRcdFx0XHRjdXJyZW50Q2xvc2VzdEtleXdvcmQgPSBrZXl3b3JkO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBjdXJyZW50Q2xvc2VzdEtleXdvcmQ7XG59O1xuXG5jb252ZXJ0LmtleXdvcmQucmdiID0gZnVuY3Rpb24gKGtleXdvcmQpIHtcblx0cmV0dXJuIGNzc0tleXdvcmRzW2tleXdvcmRdO1xufTtcblxuY29udmVydC5yZ2IueHl6ID0gZnVuY3Rpb24gKHJnYikge1xuXHR2YXIgciA9IHJnYlswXSAvIDI1NTtcblx0dmFyIGcgPSByZ2JbMV0gLyAyNTU7XG5cdHZhciBiID0gcmdiWzJdIC8gMjU1O1xuXG5cdC8vIGFzc3VtZSBzUkdCXG5cdHIgPSByID4gMC4wNDA0NSA/IE1hdGgucG93KCgociArIDAuMDU1KSAvIDEuMDU1KSwgMi40KSA6IChyIC8gMTIuOTIpO1xuXHRnID0gZyA+IDAuMDQwNDUgPyBNYXRoLnBvdygoKGcgKyAwLjA1NSkgLyAxLjA1NSksIDIuNCkgOiAoZyAvIDEyLjkyKTtcblx0YiA9IGIgPiAwLjA0MDQ1ID8gTWF0aC5wb3coKChiICsgMC4wNTUpIC8gMS4wNTUpLCAyLjQpIDogKGIgLyAxMi45Mik7XG5cblx0dmFyIHggPSAociAqIDAuNDEyNCkgKyAoZyAqIDAuMzU3NikgKyAoYiAqIDAuMTgwNSk7XG5cdHZhciB5ID0gKHIgKiAwLjIxMjYpICsgKGcgKiAwLjcxNTIpICsgKGIgKiAwLjA3MjIpO1xuXHR2YXIgeiA9IChyICogMC4wMTkzKSArIChnICogMC4xMTkyKSArIChiICogMC45NTA1KTtcblxuXHRyZXR1cm4gW3ggKiAxMDAsIHkgKiAxMDAsIHogKiAxMDBdO1xufTtcblxuY29udmVydC5yZ2IubGFiID0gZnVuY3Rpb24gKHJnYikge1xuXHR2YXIgeHl6ID0gY29udmVydC5yZ2IueHl6KHJnYik7XG5cdHZhciB4ID0geHl6WzBdO1xuXHR2YXIgeSA9IHh5elsxXTtcblx0dmFyIHogPSB4eXpbMl07XG5cdHZhciBsO1xuXHR2YXIgYTtcblx0dmFyIGI7XG5cblx0eCAvPSA5NS4wNDc7XG5cdHkgLz0gMTAwO1xuXHR6IC89IDEwOC44ODM7XG5cblx0eCA9IHggPiAwLjAwODg1NiA/IE1hdGgucG93KHgsIDEgLyAzKSA6ICg3Ljc4NyAqIHgpICsgKDE2IC8gMTE2KTtcblx0eSA9IHkgPiAwLjAwODg1NiA/IE1hdGgucG93KHksIDEgLyAzKSA6ICg3Ljc4NyAqIHkpICsgKDE2IC8gMTE2KTtcblx0eiA9IHogPiAwLjAwODg1NiA/IE1hdGgucG93KHosIDEgLyAzKSA6ICg3Ljc4NyAqIHopICsgKDE2IC8gMTE2KTtcblxuXHRsID0gKDExNiAqIHkpIC0gMTY7XG5cdGEgPSA1MDAgKiAoeCAtIHkpO1xuXHRiID0gMjAwICogKHkgLSB6KTtcblxuXHRyZXR1cm4gW2wsIGEsIGJdO1xufTtcblxuY29udmVydC5oc2wucmdiID0gZnVuY3Rpb24gKGhzbCkge1xuXHR2YXIgaCA9IGhzbFswXSAvIDM2MDtcblx0dmFyIHMgPSBoc2xbMV0gLyAxMDA7XG5cdHZhciBsID0gaHNsWzJdIC8gMTAwO1xuXHR2YXIgdDE7XG5cdHZhciB0Mjtcblx0dmFyIHQzO1xuXHR2YXIgcmdiO1xuXHR2YXIgdmFsO1xuXG5cdGlmIChzID09PSAwKSB7XG5cdFx0dmFsID0gbCAqIDI1NTtcblx0XHRyZXR1cm4gW3ZhbCwgdmFsLCB2YWxdO1xuXHR9XG5cblx0aWYgKGwgPCAwLjUpIHtcblx0XHR0MiA9IGwgKiAoMSArIHMpO1xuXHR9IGVsc2Uge1xuXHRcdHQyID0gbCArIHMgLSBsICogcztcblx0fVxuXG5cdHQxID0gMiAqIGwgLSB0MjtcblxuXHRyZ2IgPSBbMCwgMCwgMF07XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0dDMgPSBoICsgMSAvIDMgKiAtKGkgLSAxKTtcblx0XHRpZiAodDMgPCAwKSB7XG5cdFx0XHR0MysrO1xuXHRcdH1cblx0XHRpZiAodDMgPiAxKSB7XG5cdFx0XHR0My0tO1xuXHRcdH1cblxuXHRcdGlmICg2ICogdDMgPCAxKSB7XG5cdFx0XHR2YWwgPSB0MSArICh0MiAtIHQxKSAqIDYgKiB0Mztcblx0XHR9IGVsc2UgaWYgKDIgKiB0MyA8IDEpIHtcblx0XHRcdHZhbCA9IHQyO1xuXHRcdH0gZWxzZSBpZiAoMyAqIHQzIDwgMikge1xuXHRcdFx0dmFsID0gdDEgKyAodDIgLSB0MSkgKiAoMiAvIDMgLSB0MykgKiA2O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YWwgPSB0MTtcblx0XHR9XG5cblx0XHRyZ2JbaV0gPSB2YWwgKiAyNTU7XG5cdH1cblxuXHRyZXR1cm4gcmdiO1xufTtcblxuY29udmVydC5oc2wuaHN2ID0gZnVuY3Rpb24gKGhzbCkge1xuXHR2YXIgaCA9IGhzbFswXTtcblx0dmFyIHMgPSBoc2xbMV0gLyAxMDA7XG5cdHZhciBsID0gaHNsWzJdIC8gMTAwO1xuXHR2YXIgc21pbiA9IHM7XG5cdHZhciBsbWluID0gTWF0aC5tYXgobCwgMC4wMSk7XG5cdHZhciBzdjtcblx0dmFyIHY7XG5cblx0bCAqPSAyO1xuXHRzICo9IChsIDw9IDEpID8gbCA6IDIgLSBsO1xuXHRzbWluICo9IGxtaW4gPD0gMSA/IGxtaW4gOiAyIC0gbG1pbjtcblx0diA9IChsICsgcykgLyAyO1xuXHRzdiA9IGwgPT09IDAgPyAoMiAqIHNtaW4pIC8gKGxtaW4gKyBzbWluKSA6ICgyICogcykgLyAobCArIHMpO1xuXG5cdHJldHVybiBbaCwgc3YgKiAxMDAsIHYgKiAxMDBdO1xufTtcblxuY29udmVydC5oc3YucmdiID0gZnVuY3Rpb24gKGhzdikge1xuXHR2YXIgaCA9IGhzdlswXSAvIDYwO1xuXHR2YXIgcyA9IGhzdlsxXSAvIDEwMDtcblx0dmFyIHYgPSBoc3ZbMl0gLyAxMDA7XG5cdHZhciBoaSA9IE1hdGguZmxvb3IoaCkgJSA2O1xuXG5cdHZhciBmID0gaCAtIE1hdGguZmxvb3IoaCk7XG5cdHZhciBwID0gMjU1ICogdiAqICgxIC0gcyk7XG5cdHZhciBxID0gMjU1ICogdiAqICgxIC0gKHMgKiBmKSk7XG5cdHZhciB0ID0gMjU1ICogdiAqICgxIC0gKHMgKiAoMSAtIGYpKSk7XG5cdHYgKj0gMjU1O1xuXG5cdHN3aXRjaCAoaGkpIHtcblx0XHRjYXNlIDA6XG5cdFx0XHRyZXR1cm4gW3YsIHQsIHBdO1xuXHRcdGNhc2UgMTpcblx0XHRcdHJldHVybiBbcSwgdiwgcF07XG5cdFx0Y2FzZSAyOlxuXHRcdFx0cmV0dXJuIFtwLCB2LCB0XTtcblx0XHRjYXNlIDM6XG5cdFx0XHRyZXR1cm4gW3AsIHEsIHZdO1xuXHRcdGNhc2UgNDpcblx0XHRcdHJldHVybiBbdCwgcCwgdl07XG5cdFx0Y2FzZSA1OlxuXHRcdFx0cmV0dXJuIFt2LCBwLCBxXTtcblx0fVxufTtcblxuY29udmVydC5oc3YuaHNsID0gZnVuY3Rpb24gKGhzdikge1xuXHR2YXIgaCA9IGhzdlswXTtcblx0dmFyIHMgPSBoc3ZbMV0gLyAxMDA7XG5cdHZhciB2ID0gaHN2WzJdIC8gMTAwO1xuXHR2YXIgdm1pbiA9IE1hdGgubWF4KHYsIDAuMDEpO1xuXHR2YXIgbG1pbjtcblx0dmFyIHNsO1xuXHR2YXIgbDtcblxuXHRsID0gKDIgLSBzKSAqIHY7XG5cdGxtaW4gPSAoMiAtIHMpICogdm1pbjtcblx0c2wgPSBzICogdm1pbjtcblx0c2wgLz0gKGxtaW4gPD0gMSkgPyBsbWluIDogMiAtIGxtaW47XG5cdHNsID0gc2wgfHwgMDtcblx0bCAvPSAyO1xuXG5cdHJldHVybiBbaCwgc2wgKiAxMDAsIGwgKiAxMDBdO1xufTtcblxuLy8gaHR0cDovL2Rldi53My5vcmcvY3Nzd2cvY3NzLWNvbG9yLyNod2ItdG8tcmdiXG5jb252ZXJ0Lmh3Yi5yZ2IgPSBmdW5jdGlvbiAoaHdiKSB7XG5cdHZhciBoID0gaHdiWzBdIC8gMzYwO1xuXHR2YXIgd2ggPSBod2JbMV0gLyAxMDA7XG5cdHZhciBibCA9IGh3YlsyXSAvIDEwMDtcblx0dmFyIHJhdGlvID0gd2ggKyBibDtcblx0dmFyIGk7XG5cdHZhciB2O1xuXHR2YXIgZjtcblx0dmFyIG47XG5cblx0Ly8gd2ggKyBibCBjYW50IGJlID4gMVxuXHRpZiAocmF0aW8gPiAxKSB7XG5cdFx0d2ggLz0gcmF0aW87XG5cdFx0YmwgLz0gcmF0aW87XG5cdH1cblxuXHRpID0gTWF0aC5mbG9vcig2ICogaCk7XG5cdHYgPSAxIC0gYmw7XG5cdGYgPSA2ICogaCAtIGk7XG5cblx0aWYgKChpICYgMHgwMSkgIT09IDApIHtcblx0XHRmID0gMSAtIGY7XG5cdH1cblxuXHRuID0gd2ggKyBmICogKHYgLSB3aCk7IC8vIGxpbmVhciBpbnRlcnBvbGF0aW9uXG5cblx0dmFyIHI7XG5cdHZhciBnO1xuXHR2YXIgYjtcblx0c3dpdGNoIChpKSB7XG5cdFx0ZGVmYXVsdDpcblx0XHRjYXNlIDY6XG5cdFx0Y2FzZSAwOiByID0gdjsgZyA9IG47IGIgPSB3aDsgYnJlYWs7XG5cdFx0Y2FzZSAxOiByID0gbjsgZyA9IHY7IGIgPSB3aDsgYnJlYWs7XG5cdFx0Y2FzZSAyOiByID0gd2g7IGcgPSB2OyBiID0gbjsgYnJlYWs7XG5cdFx0Y2FzZSAzOiByID0gd2g7IGcgPSBuOyBiID0gdjsgYnJlYWs7XG5cdFx0Y2FzZSA0OiByID0gbjsgZyA9IHdoOyBiID0gdjsgYnJlYWs7XG5cdFx0Y2FzZSA1OiByID0gdjsgZyA9IHdoOyBiID0gbjsgYnJlYWs7XG5cdH1cblxuXHRyZXR1cm4gW3IgKiAyNTUsIGcgKiAyNTUsIGIgKiAyNTVdO1xufTtcblxuY29udmVydC5jbXlrLnJnYiA9IGZ1bmN0aW9uIChjbXlrKSB7XG5cdHZhciBjID0gY215a1swXSAvIDEwMDtcblx0dmFyIG0gPSBjbXlrWzFdIC8gMTAwO1xuXHR2YXIgeSA9IGNteWtbMl0gLyAxMDA7XG5cdHZhciBrID0gY215a1szXSAvIDEwMDtcblx0dmFyIHI7XG5cdHZhciBnO1xuXHR2YXIgYjtcblxuXHRyID0gMSAtIE1hdGgubWluKDEsIGMgKiAoMSAtIGspICsgayk7XG5cdGcgPSAxIC0gTWF0aC5taW4oMSwgbSAqICgxIC0gaykgKyBrKTtcblx0YiA9IDEgLSBNYXRoLm1pbigxLCB5ICogKDEgLSBrKSArIGspO1xuXG5cdHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG59O1xuXG5jb252ZXJ0Lnh5ei5yZ2IgPSBmdW5jdGlvbiAoeHl6KSB7XG5cdHZhciB4ID0geHl6WzBdIC8gMTAwO1xuXHR2YXIgeSA9IHh5elsxXSAvIDEwMDtcblx0dmFyIHogPSB4eXpbMl0gLyAxMDA7XG5cdHZhciByO1xuXHR2YXIgZztcblx0dmFyIGI7XG5cblx0ciA9ICh4ICogMy4yNDA2KSArICh5ICogLTEuNTM3MikgKyAoeiAqIC0wLjQ5ODYpO1xuXHRnID0gKHggKiAtMC45Njg5KSArICh5ICogMS44NzU4KSArICh6ICogMC4wNDE1KTtcblx0YiA9ICh4ICogMC4wNTU3KSArICh5ICogLTAuMjA0MCkgKyAoeiAqIDEuMDU3MCk7XG5cblx0Ly8gYXNzdW1lIHNSR0Jcblx0ciA9IHIgPiAwLjAwMzEzMDhcblx0XHQ/ICgoMS4wNTUgKiBNYXRoLnBvdyhyLCAxLjAgLyAyLjQpKSAtIDAuMDU1KVxuXHRcdDogciAqIDEyLjkyO1xuXG5cdGcgPSBnID4gMC4wMDMxMzA4XG5cdFx0PyAoKDEuMDU1ICogTWF0aC5wb3coZywgMS4wIC8gMi40KSkgLSAwLjA1NSlcblx0XHQ6IGcgKiAxMi45MjtcblxuXHRiID0gYiA+IDAuMDAzMTMwOFxuXHRcdD8gKCgxLjA1NSAqIE1hdGgucG93KGIsIDEuMCAvIDIuNCkpIC0gMC4wNTUpXG5cdFx0OiBiICogMTIuOTI7XG5cblx0ciA9IE1hdGgubWluKE1hdGgubWF4KDAsIHIpLCAxKTtcblx0ZyA9IE1hdGgubWluKE1hdGgubWF4KDAsIGcpLCAxKTtcblx0YiA9IE1hdGgubWluKE1hdGgubWF4KDAsIGIpLCAxKTtcblxuXHRyZXR1cm4gW3IgKiAyNTUsIGcgKiAyNTUsIGIgKiAyNTVdO1xufTtcblxuY29udmVydC54eXoubGFiID0gZnVuY3Rpb24gKHh5eikge1xuXHR2YXIgeCA9IHh5elswXTtcblx0dmFyIHkgPSB4eXpbMV07XG5cdHZhciB6ID0geHl6WzJdO1xuXHR2YXIgbDtcblx0dmFyIGE7XG5cdHZhciBiO1xuXG5cdHggLz0gOTUuMDQ3O1xuXHR5IC89IDEwMDtcblx0eiAvPSAxMDguODgzO1xuXG5cdHggPSB4ID4gMC4wMDg4NTYgPyBNYXRoLnBvdyh4LCAxIC8gMykgOiAoNy43ODcgKiB4KSArICgxNiAvIDExNik7XG5cdHkgPSB5ID4gMC4wMDg4NTYgPyBNYXRoLnBvdyh5LCAxIC8gMykgOiAoNy43ODcgKiB5KSArICgxNiAvIDExNik7XG5cdHogPSB6ID4gMC4wMDg4NTYgPyBNYXRoLnBvdyh6LCAxIC8gMykgOiAoNy43ODcgKiB6KSArICgxNiAvIDExNik7XG5cblx0bCA9ICgxMTYgKiB5KSAtIDE2O1xuXHRhID0gNTAwICogKHggLSB5KTtcblx0YiA9IDIwMCAqICh5IC0geik7XG5cblx0cmV0dXJuIFtsLCBhLCBiXTtcbn07XG5cbmNvbnZlcnQubGFiLnh5eiA9IGZ1bmN0aW9uIChsYWIpIHtcblx0dmFyIGwgPSBsYWJbMF07XG5cdHZhciBhID0gbGFiWzFdO1xuXHR2YXIgYiA9IGxhYlsyXTtcblx0dmFyIHg7XG5cdHZhciB5O1xuXHR2YXIgejtcblxuXHR5ID0gKGwgKyAxNikgLyAxMTY7XG5cdHggPSBhIC8gNTAwICsgeTtcblx0eiA9IHkgLSBiIC8gMjAwO1xuXG5cdHZhciB5MiA9IE1hdGgucG93KHksIDMpO1xuXHR2YXIgeDIgPSBNYXRoLnBvdyh4LCAzKTtcblx0dmFyIHoyID0gTWF0aC5wb3coeiwgMyk7XG5cdHkgPSB5MiA+IDAuMDA4ODU2ID8geTIgOiAoeSAtIDE2IC8gMTE2KSAvIDcuNzg3O1xuXHR4ID0geDIgPiAwLjAwODg1NiA/IHgyIDogKHggLSAxNiAvIDExNikgLyA3Ljc4Nztcblx0eiA9IHoyID4gMC4wMDg4NTYgPyB6MiA6ICh6IC0gMTYgLyAxMTYpIC8gNy43ODc7XG5cblx0eCAqPSA5NS4wNDc7XG5cdHkgKj0gMTAwO1xuXHR6ICo9IDEwOC44ODM7XG5cblx0cmV0dXJuIFt4LCB5LCB6XTtcbn07XG5cbmNvbnZlcnQubGFiLmxjaCA9IGZ1bmN0aW9uIChsYWIpIHtcblx0dmFyIGwgPSBsYWJbMF07XG5cdHZhciBhID0gbGFiWzFdO1xuXHR2YXIgYiA9IGxhYlsyXTtcblx0dmFyIGhyO1xuXHR2YXIgaDtcblx0dmFyIGM7XG5cblx0aHIgPSBNYXRoLmF0YW4yKGIsIGEpO1xuXHRoID0gaHIgKiAzNjAgLyAyIC8gTWF0aC5QSTtcblxuXHRpZiAoaCA8IDApIHtcblx0XHRoICs9IDM2MDtcblx0fVxuXG5cdGMgPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYik7XG5cblx0cmV0dXJuIFtsLCBjLCBoXTtcbn07XG5cbmNvbnZlcnQubGNoLmxhYiA9IGZ1bmN0aW9uIChsY2gpIHtcblx0dmFyIGwgPSBsY2hbMF07XG5cdHZhciBjID0gbGNoWzFdO1xuXHR2YXIgaCA9IGxjaFsyXTtcblx0dmFyIGE7XG5cdHZhciBiO1xuXHR2YXIgaHI7XG5cblx0aHIgPSBoIC8gMzYwICogMiAqIE1hdGguUEk7XG5cdGEgPSBjICogTWF0aC5jb3MoaHIpO1xuXHRiID0gYyAqIE1hdGguc2luKGhyKTtcblxuXHRyZXR1cm4gW2wsIGEsIGJdO1xufTtcblxuY29udmVydC5yZ2IuYW5zaTE2ID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0dmFyIHIgPSBhcmdzWzBdO1xuXHR2YXIgZyA9IGFyZ3NbMV07XG5cdHZhciBiID0gYXJnc1syXTtcblx0dmFyIHZhbHVlID0gMSBpbiBhcmd1bWVudHMgPyBhcmd1bWVudHNbMV0gOiBjb252ZXJ0LnJnYi5oc3YoYXJncylbMl07IC8vIGhzdiAtPiBhbnNpMTYgb3B0aW1pemF0aW9uXG5cblx0dmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlIC8gNTApO1xuXG5cdGlmICh2YWx1ZSA9PT0gMCkge1xuXHRcdHJldHVybiAzMDtcblx0fVxuXG5cdHZhciBhbnNpID0gMzBcblx0XHQrICgoTWF0aC5yb3VuZChiIC8gMjU1KSA8PCAyKVxuXHRcdHwgKE1hdGgucm91bmQoZyAvIDI1NSkgPDwgMSlcblx0XHR8IE1hdGgucm91bmQociAvIDI1NSkpO1xuXG5cdGlmICh2YWx1ZSA9PT0gMikge1xuXHRcdGFuc2kgKz0gNjA7XG5cdH1cblxuXHRyZXR1cm4gYW5zaTtcbn07XG5cbmNvbnZlcnQuaHN2LmFuc2kxNiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdC8vIG9wdGltaXphdGlvbiBoZXJlOyB3ZSBhbHJlYWR5IGtub3cgdGhlIHZhbHVlIGFuZCBkb24ndCBuZWVkIHRvIGdldFxuXHQvLyBpdCBjb252ZXJ0ZWQgZm9yIHVzLlxuXHRyZXR1cm4gY29udmVydC5yZ2IuYW5zaTE2KGNvbnZlcnQuaHN2LnJnYihhcmdzKSwgYXJnc1syXSk7XG59O1xuXG5jb252ZXJ0LnJnYi5hbnNpMjU2ID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0dmFyIHIgPSBhcmdzWzBdO1xuXHR2YXIgZyA9IGFyZ3NbMV07XG5cdHZhciBiID0gYXJnc1syXTtcblxuXHQvLyB3ZSB1c2UgdGhlIGV4dGVuZGVkIGdyZXlzY2FsZSBwYWxldHRlIGhlcmUsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZlxuXHQvLyBibGFjayBhbmQgd2hpdGUuIG5vcm1hbCBwYWxldHRlIG9ubHkgaGFzIDQgZ3JleXNjYWxlIHNoYWRlcy5cblx0aWYgKHIgPT09IGcgJiYgZyA9PT0gYikge1xuXHRcdGlmIChyIDwgOCkge1xuXHRcdFx0cmV0dXJuIDE2O1xuXHRcdH1cblxuXHRcdGlmIChyID4gMjQ4KSB7XG5cdFx0XHRyZXR1cm4gMjMxO1xuXHRcdH1cblxuXHRcdHJldHVybiBNYXRoLnJvdW5kKCgociAtIDgpIC8gMjQ3KSAqIDI0KSArIDIzMjtcblx0fVxuXG5cdHZhciBhbnNpID0gMTZcblx0XHQrICgzNiAqIE1hdGgucm91bmQociAvIDI1NSAqIDUpKVxuXHRcdCsgKDYgKiBNYXRoLnJvdW5kKGcgLyAyNTUgKiA1KSlcblx0XHQrIE1hdGgucm91bmQoYiAvIDI1NSAqIDUpO1xuXG5cdHJldHVybiBhbnNpO1xufTtcblxuY29udmVydC5hbnNpMTYucmdiID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0dmFyIGNvbG9yID0gYXJncyAlIDEwO1xuXG5cdC8vIGhhbmRsZSBncmV5c2NhbGVcblx0aWYgKGNvbG9yID09PSAwIHx8IGNvbG9yID09PSA3KSB7XG5cdFx0aWYgKGFyZ3MgPiA1MCkge1xuXHRcdFx0Y29sb3IgKz0gMy41O1xuXHRcdH1cblxuXHRcdGNvbG9yID0gY29sb3IgLyAxMC41ICogMjU1O1xuXG5cdFx0cmV0dXJuIFtjb2xvciwgY29sb3IsIGNvbG9yXTtcblx0fVxuXG5cdHZhciBtdWx0ID0gKH5+KGFyZ3MgPiA1MCkgKyAxKSAqIDAuNTtcblx0dmFyIHIgPSAoKGNvbG9yICYgMSkgKiBtdWx0KSAqIDI1NTtcblx0dmFyIGcgPSAoKChjb2xvciA+PiAxKSAmIDEpICogbXVsdCkgKiAyNTU7XG5cdHZhciBiID0gKCgoY29sb3IgPj4gMikgJiAxKSAqIG11bHQpICogMjU1O1xuXG5cdHJldHVybiBbciwgZywgYl07XG59O1xuXG5jb252ZXJ0LmFuc2kyNTYucmdiID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0Ly8gaGFuZGxlIGdyZXlzY2FsZVxuXHRpZiAoYXJncyA+PSAyMzIpIHtcblx0XHR2YXIgYyA9IChhcmdzIC0gMjMyKSAqIDEwICsgODtcblx0XHRyZXR1cm4gW2MsIGMsIGNdO1xuXHR9XG5cblx0YXJncyAtPSAxNjtcblxuXHR2YXIgcmVtO1xuXHR2YXIgciA9IE1hdGguZmxvb3IoYXJncyAvIDM2KSAvIDUgKiAyNTU7XG5cdHZhciBnID0gTWF0aC5mbG9vcigocmVtID0gYXJncyAlIDM2KSAvIDYpIC8gNSAqIDI1NTtcblx0dmFyIGIgPSAocmVtICUgNikgLyA1ICogMjU1O1xuXG5cdHJldHVybiBbciwgZywgYl07XG59O1xuXG5jb252ZXJ0LnJnYi5oZXggPSBmdW5jdGlvbiAoYXJncykge1xuXHR2YXIgaW50ZWdlciA9ICgoTWF0aC5yb3VuZChhcmdzWzBdKSAmIDB4RkYpIDw8IDE2KVxuXHRcdCsgKChNYXRoLnJvdW5kKGFyZ3NbMV0pICYgMHhGRikgPDwgOClcblx0XHQrIChNYXRoLnJvdW5kKGFyZ3NbMl0pICYgMHhGRik7XG5cblx0dmFyIHN0cmluZyA9IGludGVnZXIudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG5cdHJldHVybiAnMDAwMDAwJy5zdWJzdHJpbmcoc3RyaW5nLmxlbmd0aCkgKyBzdHJpbmc7XG59O1xuXG5jb252ZXJ0LmhleC5yZ2IgPSBmdW5jdGlvbiAoYXJncykge1xuXHR2YXIgbWF0Y2ggPSBhcmdzLnRvU3RyaW5nKDE2KS5tYXRjaCgvW2EtZjAtOV17Nn18W2EtZjAtOV17M30vaSk7XG5cdGlmICghbWF0Y2gpIHtcblx0XHRyZXR1cm4gWzAsIDAsIDBdO1xuXHR9XG5cblx0dmFyIGNvbG9yU3RyaW5nID0gbWF0Y2hbMF07XG5cblx0aWYgKG1hdGNoWzBdLmxlbmd0aCA9PT0gMykge1xuXHRcdGNvbG9yU3RyaW5nID0gY29sb3JTdHJpbmcuc3BsaXQoJycpLm1hcChmdW5jdGlvbiAoY2hhcikge1xuXHRcdFx0cmV0dXJuIGNoYXIgKyBjaGFyO1xuXHRcdH0pLmpvaW4oJycpO1xuXHR9XG5cblx0dmFyIGludGVnZXIgPSBwYXJzZUludChjb2xvclN0cmluZywgMTYpO1xuXHR2YXIgciA9IChpbnRlZ2VyID4+IDE2KSAmIDB4RkY7XG5cdHZhciBnID0gKGludGVnZXIgPj4gOCkgJiAweEZGO1xuXHR2YXIgYiA9IGludGVnZXIgJiAweEZGO1xuXG5cdHJldHVybiBbciwgZywgYl07XG59O1xuXG5jb252ZXJ0LnJnYi5oY2cgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHZhciByID0gcmdiWzBdIC8gMjU1O1xuXHR2YXIgZyA9IHJnYlsxXSAvIDI1NTtcblx0dmFyIGIgPSByZ2JbMl0gLyAyNTU7XG5cdHZhciBtYXggPSBNYXRoLm1heChNYXRoLm1heChyLCBnKSwgYik7XG5cdHZhciBtaW4gPSBNYXRoLm1pbihNYXRoLm1pbihyLCBnKSwgYik7XG5cdHZhciBjaHJvbWEgPSAobWF4IC0gbWluKTtcblx0dmFyIGdyYXlzY2FsZTtcblx0dmFyIGh1ZTtcblxuXHRpZiAoY2hyb21hIDwgMSkge1xuXHRcdGdyYXlzY2FsZSA9IG1pbiAvICgxIC0gY2hyb21hKTtcblx0fSBlbHNlIHtcblx0XHRncmF5c2NhbGUgPSAwO1xuXHR9XG5cblx0aWYgKGNocm9tYSA8PSAwKSB7XG5cdFx0aHVlID0gMDtcblx0fSBlbHNlXG5cdGlmIChtYXggPT09IHIpIHtcblx0XHRodWUgPSAoKGcgLSBiKSAvIGNocm9tYSkgJSA2O1xuXHR9IGVsc2Vcblx0aWYgKG1heCA9PT0gZykge1xuXHRcdGh1ZSA9IDIgKyAoYiAtIHIpIC8gY2hyb21hO1xuXHR9IGVsc2Uge1xuXHRcdGh1ZSA9IDQgKyAociAtIGcpIC8gY2hyb21hICsgNDtcblx0fVxuXG5cdGh1ZSAvPSA2O1xuXHRodWUgJT0gMTtcblxuXHRyZXR1cm4gW2h1ZSAqIDM2MCwgY2hyb21hICogMTAwLCBncmF5c2NhbGUgKiAxMDBdO1xufTtcblxuY29udmVydC5oc2wuaGNnID0gZnVuY3Rpb24gKGhzbCkge1xuXHR2YXIgcyA9IGhzbFsxXSAvIDEwMDtcblx0dmFyIGwgPSBoc2xbMl0gLyAxMDA7XG5cdHZhciBjID0gMTtcblx0dmFyIGYgPSAwO1xuXG5cdGlmIChsIDwgMC41KSB7XG5cdFx0YyA9IDIuMCAqIHMgKiBsO1xuXHR9IGVsc2Uge1xuXHRcdGMgPSAyLjAgKiBzICogKDEuMCAtIGwpO1xuXHR9XG5cblx0aWYgKGMgPCAxLjApIHtcblx0XHRmID0gKGwgLSAwLjUgKiBjKSAvICgxLjAgLSBjKTtcblx0fVxuXG5cdHJldHVybiBbaHNsWzBdLCBjICogMTAwLCBmICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaHN2LmhjZyA9IGZ1bmN0aW9uIChoc3YpIHtcblx0dmFyIHMgPSBoc3ZbMV0gLyAxMDA7XG5cdHZhciB2ID0gaHN2WzJdIC8gMTAwO1xuXG5cdHZhciBjID0gcyAqIHY7XG5cdHZhciBmID0gMDtcblxuXHRpZiAoYyA8IDEuMCkge1xuXHRcdGYgPSAodiAtIGMpIC8gKDEgLSBjKTtcblx0fVxuXG5cdHJldHVybiBbaHN2WzBdLCBjICogMTAwLCBmICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaGNnLnJnYiA9IGZ1bmN0aW9uIChoY2cpIHtcblx0dmFyIGggPSBoY2dbMF0gLyAzNjA7XG5cdHZhciBjID0gaGNnWzFdIC8gMTAwO1xuXHR2YXIgZyA9IGhjZ1syXSAvIDEwMDtcblxuXHRpZiAoYyA9PT0gMC4wKSB7XG5cdFx0cmV0dXJuIFtnICogMjU1LCBnICogMjU1LCBnICogMjU1XTtcblx0fVxuXG5cdHZhciBwdXJlID0gWzAsIDAsIDBdO1xuXHR2YXIgaGkgPSAoaCAlIDEpICogNjtcblx0dmFyIHYgPSBoaSAlIDE7XG5cdHZhciB3ID0gMSAtIHY7XG5cdHZhciBtZyA9IDA7XG5cblx0c3dpdGNoIChNYXRoLmZsb29yKGhpKSkge1xuXHRcdGNhc2UgMDpcblx0XHRcdHB1cmVbMF0gPSAxOyBwdXJlWzFdID0gdjsgcHVyZVsyXSA9IDA7IGJyZWFrO1xuXHRcdGNhc2UgMTpcblx0XHRcdHB1cmVbMF0gPSB3OyBwdXJlWzFdID0gMTsgcHVyZVsyXSA9IDA7IGJyZWFrO1xuXHRcdGNhc2UgMjpcblx0XHRcdHB1cmVbMF0gPSAwOyBwdXJlWzFdID0gMTsgcHVyZVsyXSA9IHY7IGJyZWFrO1xuXHRcdGNhc2UgMzpcblx0XHRcdHB1cmVbMF0gPSAwOyBwdXJlWzFdID0gdzsgcHVyZVsyXSA9IDE7IGJyZWFrO1xuXHRcdGNhc2UgNDpcblx0XHRcdHB1cmVbMF0gPSB2OyBwdXJlWzFdID0gMDsgcHVyZVsyXSA9IDE7IGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRwdXJlWzBdID0gMTsgcHVyZVsxXSA9IDA7IHB1cmVbMl0gPSB3O1xuXHR9XG5cblx0bWcgPSAoMS4wIC0gYykgKiBnO1xuXG5cdHJldHVybiBbXG5cdFx0KGMgKiBwdXJlWzBdICsgbWcpICogMjU1LFxuXHRcdChjICogcHVyZVsxXSArIG1nKSAqIDI1NSxcblx0XHQoYyAqIHB1cmVbMl0gKyBtZykgKiAyNTVcblx0XTtcbn07XG5cbmNvbnZlcnQuaGNnLmhzdiA9IGZ1bmN0aW9uIChoY2cpIHtcblx0dmFyIGMgPSBoY2dbMV0gLyAxMDA7XG5cdHZhciBnID0gaGNnWzJdIC8gMTAwO1xuXG5cdHZhciB2ID0gYyArIGcgKiAoMS4wIC0gYyk7XG5cdHZhciBmID0gMDtcblxuXHRpZiAodiA+IDAuMCkge1xuXHRcdGYgPSBjIC8gdjtcblx0fVxuXG5cdHJldHVybiBbaGNnWzBdLCBmICogMTAwLCB2ICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaGNnLmhzbCA9IGZ1bmN0aW9uIChoY2cpIHtcblx0dmFyIGMgPSBoY2dbMV0gLyAxMDA7XG5cdHZhciBnID0gaGNnWzJdIC8gMTAwO1xuXG5cdHZhciBsID0gZyAqICgxLjAgLSBjKSArIDAuNSAqIGM7XG5cdHZhciBzID0gMDtcblxuXHRpZiAobCA+IDAuMCAmJiBsIDwgMC41KSB7XG5cdFx0cyA9IGMgLyAoMiAqIGwpO1xuXHR9IGVsc2Vcblx0aWYgKGwgPj0gMC41ICYmIGwgPCAxLjApIHtcblx0XHRzID0gYyAvICgyICogKDEgLSBsKSk7XG5cdH1cblxuXHRyZXR1cm4gW2hjZ1swXSwgcyAqIDEwMCwgbCAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmhjZy5od2IgPSBmdW5jdGlvbiAoaGNnKSB7XG5cdHZhciBjID0gaGNnWzFdIC8gMTAwO1xuXHR2YXIgZyA9IGhjZ1syXSAvIDEwMDtcblx0dmFyIHYgPSBjICsgZyAqICgxLjAgLSBjKTtcblx0cmV0dXJuIFtoY2dbMF0sICh2IC0gYykgKiAxMDAsICgxIC0gdikgKiAxMDBdO1xufTtcblxuY29udmVydC5od2IuaGNnID0gZnVuY3Rpb24gKGh3Yikge1xuXHR2YXIgdyA9IGh3YlsxXSAvIDEwMDtcblx0dmFyIGIgPSBod2JbMl0gLyAxMDA7XG5cdHZhciB2ID0gMSAtIGI7XG5cdHZhciBjID0gdiAtIHc7XG5cdHZhciBnID0gMDtcblxuXHRpZiAoYyA8IDEpIHtcblx0XHRnID0gKHYgLSBjKSAvICgxIC0gYyk7XG5cdH1cblxuXHRyZXR1cm4gW2h3YlswXSwgYyAqIDEwMCwgZyAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmFwcGxlLnJnYiA9IGZ1bmN0aW9uIChhcHBsZSkge1xuXHRyZXR1cm4gWyhhcHBsZVswXSAvIDY1NTM1KSAqIDI1NSwgKGFwcGxlWzFdIC8gNjU1MzUpICogMjU1LCAoYXBwbGVbMl0gLyA2NTUzNSkgKiAyNTVdO1xufTtcblxuY29udmVydC5yZ2IuYXBwbGUgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHJldHVybiBbKHJnYlswXSAvIDI1NSkgKiA2NTUzNSwgKHJnYlsxXSAvIDI1NSkgKiA2NTUzNSwgKHJnYlsyXSAvIDI1NSkgKiA2NTUzNV07XG59O1xuXG5jb252ZXJ0LmdyYXkucmdiID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0cmV0dXJuIFthcmdzWzBdIC8gMTAwICogMjU1LCBhcmdzWzBdIC8gMTAwICogMjU1LCBhcmdzWzBdIC8gMTAwICogMjU1XTtcbn07XG5cbmNvbnZlcnQuZ3JheS5oc2wgPSBjb252ZXJ0LmdyYXkuaHN2ID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0cmV0dXJuIFswLCAwLCBhcmdzWzBdXTtcbn07XG5cbmNvbnZlcnQuZ3JheS5od2IgPSBmdW5jdGlvbiAoZ3JheSkge1xuXHRyZXR1cm4gWzAsIDEwMCwgZ3JheVswXV07XG59O1xuXG5jb252ZXJ0LmdyYXkuY215ayA9IGZ1bmN0aW9uIChncmF5KSB7XG5cdHJldHVybiBbMCwgMCwgMCwgZ3JheVswXV07XG59O1xuXG5jb252ZXJ0LmdyYXkubGFiID0gZnVuY3Rpb24gKGdyYXkpIHtcblx0cmV0dXJuIFtncmF5WzBdLCAwLCAwXTtcbn07XG5cbmNvbnZlcnQuZ3JheS5oZXggPSBmdW5jdGlvbiAoZ3JheSkge1xuXHR2YXIgdmFsID0gTWF0aC5yb3VuZChncmF5WzBdIC8gMTAwICogMjU1KSAmIDB4RkY7XG5cdHZhciBpbnRlZ2VyID0gKHZhbCA8PCAxNikgKyAodmFsIDw8IDgpICsgdmFsO1xuXG5cdHZhciBzdHJpbmcgPSBpbnRlZ2VyLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuXHRyZXR1cm4gJzAwMDAwMCcuc3Vic3RyaW5nKHN0cmluZy5sZW5ndGgpICsgc3RyaW5nO1xufTtcblxuY29udmVydC5yZ2IuZ3JheSA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHZhbCA9IChyZ2JbMF0gKyByZ2JbMV0gKyByZ2JbMl0pIC8gMztcblx0cmV0dXJuIFt2YWwgLyAyNTUgKiAxMDBdO1xufTtcbiIsInZhciBjb252ZXJzaW9ucyA9IHJlcXVpcmUoJy4vY29udmVyc2lvbnMnKTtcblxuLypcblx0dGhpcyBmdW5jdGlvbiByb3V0ZXMgYSBtb2RlbCB0byBhbGwgb3RoZXIgbW9kZWxzLlxuXG5cdGFsbCBmdW5jdGlvbnMgdGhhdCBhcmUgcm91dGVkIGhhdmUgYSBwcm9wZXJ0eSBgLmNvbnZlcnNpb25gIGF0dGFjaGVkXG5cdHRvIHRoZSByZXR1cm5lZCBzeW50aGV0aWMgZnVuY3Rpb24uIFRoaXMgcHJvcGVydHkgaXMgYW4gYXJyYXlcblx0b2Ygc3RyaW5ncywgZWFjaCB3aXRoIHRoZSBzdGVwcyBpbiBiZXR3ZWVuIHRoZSAnZnJvbScgYW5kICd0bydcblx0Y29sb3IgbW9kZWxzIChpbmNsdXNpdmUpLlxuXG5cdGNvbnZlcnNpb25zIHRoYXQgYXJlIG5vdCBwb3NzaWJsZSBzaW1wbHkgYXJlIG5vdCBpbmNsdWRlZC5cbiovXG5cbmZ1bmN0aW9uIGJ1aWxkR3JhcGgoKSB7XG5cdHZhciBncmFwaCA9IHt9O1xuXHQvLyBodHRwczovL2pzcGVyZi5jb20vb2JqZWN0LWtleXMtdnMtZm9yLWluLXdpdGgtY2xvc3VyZS8zXG5cdHZhciBtb2RlbHMgPSBPYmplY3Qua2V5cyhjb252ZXJzaW9ucyk7XG5cblx0Zm9yICh2YXIgbGVuID0gbW9kZWxzLmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdGdyYXBoW21vZGVsc1tpXV0gPSB7XG5cdFx0XHQvLyBodHRwOi8vanNwZXJmLmNvbS8xLXZzLWluZmluaXR5XG5cdFx0XHQvLyBtaWNyby1vcHQsIGJ1dCB0aGlzIGlzIHNpbXBsZS5cblx0XHRcdGRpc3RhbmNlOiAtMSxcblx0XHRcdHBhcmVudDogbnVsbFxuXHRcdH07XG5cdH1cblxuXHRyZXR1cm4gZ3JhcGg7XG59XG5cbi8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JyZWFkdGgtZmlyc3Rfc2VhcmNoXG5mdW5jdGlvbiBkZXJpdmVCRlMoZnJvbU1vZGVsKSB7XG5cdHZhciBncmFwaCA9IGJ1aWxkR3JhcGgoKTtcblx0dmFyIHF1ZXVlID0gW2Zyb21Nb2RlbF07IC8vIHVuc2hpZnQgLT4gcXVldWUgLT4gcG9wXG5cblx0Z3JhcGhbZnJvbU1vZGVsXS5kaXN0YW5jZSA9IDA7XG5cblx0d2hpbGUgKHF1ZXVlLmxlbmd0aCkge1xuXHRcdHZhciBjdXJyZW50ID0gcXVldWUucG9wKCk7XG5cdFx0dmFyIGFkamFjZW50cyA9IE9iamVjdC5rZXlzKGNvbnZlcnNpb25zW2N1cnJlbnRdKTtcblxuXHRcdGZvciAodmFyIGxlbiA9IGFkamFjZW50cy5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdHZhciBhZGphY2VudCA9IGFkamFjZW50c1tpXTtcblx0XHRcdHZhciBub2RlID0gZ3JhcGhbYWRqYWNlbnRdO1xuXG5cdFx0XHRpZiAobm9kZS5kaXN0YW5jZSA9PT0gLTEpIHtcblx0XHRcdFx0bm9kZS5kaXN0YW5jZSA9IGdyYXBoW2N1cnJlbnRdLmRpc3RhbmNlICsgMTtcblx0XHRcdFx0bm9kZS5wYXJlbnQgPSBjdXJyZW50O1xuXHRcdFx0XHRxdWV1ZS51bnNoaWZ0KGFkamFjZW50KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZ3JhcGg7XG59XG5cbmZ1bmN0aW9uIGxpbmsoZnJvbSwgdG8pIHtcblx0cmV0dXJuIGZ1bmN0aW9uIChhcmdzKSB7XG5cdFx0cmV0dXJuIHRvKGZyb20oYXJncykpO1xuXHR9O1xufVxuXG5mdW5jdGlvbiB3cmFwQ29udmVyc2lvbih0b01vZGVsLCBncmFwaCkge1xuXHR2YXIgcGF0aCA9IFtncmFwaFt0b01vZGVsXS5wYXJlbnQsIHRvTW9kZWxdO1xuXHR2YXIgZm4gPSBjb252ZXJzaW9uc1tncmFwaFt0b01vZGVsXS5wYXJlbnRdW3RvTW9kZWxdO1xuXG5cdHZhciBjdXIgPSBncmFwaFt0b01vZGVsXS5wYXJlbnQ7XG5cdHdoaWxlIChncmFwaFtjdXJdLnBhcmVudCkge1xuXHRcdHBhdGgudW5zaGlmdChncmFwaFtjdXJdLnBhcmVudCk7XG5cdFx0Zm4gPSBsaW5rKGNvbnZlcnNpb25zW2dyYXBoW2N1cl0ucGFyZW50XVtjdXJdLCBmbik7XG5cdFx0Y3VyID0gZ3JhcGhbY3VyXS5wYXJlbnQ7XG5cdH1cblxuXHRmbi5jb252ZXJzaW9uID0gcGF0aDtcblx0cmV0dXJuIGZuO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmcm9tTW9kZWwpIHtcblx0dmFyIGdyYXBoID0gZGVyaXZlQkZTKGZyb21Nb2RlbCk7XG5cdHZhciBjb252ZXJzaW9uID0ge307XG5cblx0dmFyIG1vZGVscyA9IE9iamVjdC5rZXlzKGdyYXBoKTtcblx0Zm9yICh2YXIgbGVuID0gbW9kZWxzLmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdHZhciB0b01vZGVsID0gbW9kZWxzW2ldO1xuXHRcdHZhciBub2RlID0gZ3JhcGhbdG9Nb2RlbF07XG5cblx0XHRpZiAobm9kZS5wYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdC8vIG5vIHBvc3NpYmxlIGNvbnZlcnNpb24sIG9yIHRoaXMgbm9kZSBpcyB0aGUgc291cmNlIG1vZGVsLlxuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y29udmVyc2lvblt0b01vZGVsXSA9IHdyYXBDb252ZXJzaW9uKHRvTW9kZWwsIGdyYXBoKTtcblx0fVxuXG5cdHJldHVybiBjb252ZXJzaW9uO1xufTtcblxuIiwidmFyIGNvbnZlcnNpb25zID0gcmVxdWlyZSgnLi9jb252ZXJzaW9ucycpO1xudmFyIHJvdXRlID0gcmVxdWlyZSgnLi9yb3V0ZScpO1xuXG52YXIgY29udmVydCA9IHt9O1xuXG52YXIgbW9kZWxzID0gT2JqZWN0LmtleXMoY29udmVyc2lvbnMpO1xuXG5mdW5jdGlvbiB3cmFwUmF3KGZuKSB7XG5cdHZhciB3cmFwcGVkRm4gPSBmdW5jdGlvbiAoYXJncykge1xuXHRcdGlmIChhcmdzID09PSB1bmRlZmluZWQgfHwgYXJncyA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIGFyZ3M7XG5cdFx0fVxuXG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG5cdFx0XHRhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZm4oYXJncyk7XG5cdH07XG5cblx0Ly8gcHJlc2VydmUgLmNvbnZlcnNpb24gcHJvcGVydHkgaWYgdGhlcmUgaXMgb25lXG5cdGlmICgnY29udmVyc2lvbicgaW4gZm4pIHtcblx0XHR3cmFwcGVkRm4uY29udmVyc2lvbiA9IGZuLmNvbnZlcnNpb247XG5cdH1cblxuXHRyZXR1cm4gd3JhcHBlZEZuO1xufVxuXG5mdW5jdGlvbiB3cmFwUm91bmRlZChmbikge1xuXHR2YXIgd3JhcHBlZEZuID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0XHRpZiAoYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3MgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBhcmdzO1xuXHRcdH1cblxuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuXHRcdFx0YXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cdFx0fVxuXG5cdFx0dmFyIHJlc3VsdCA9IGZuKGFyZ3MpO1xuXG5cdFx0Ly8gd2UncmUgYXNzdW1pbmcgdGhlIHJlc3VsdCBpcyBhbiBhcnJheSBoZXJlLlxuXHRcdC8vIHNlZSBub3RpY2UgaW4gY29udmVyc2lvbnMuanM7IGRvbid0IHVzZSBib3ggdHlwZXNcblx0XHQvLyBpbiBjb252ZXJzaW9uIGZ1bmN0aW9ucy5cblx0XHRpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcpIHtcblx0XHRcdGZvciAodmFyIGxlbiA9IHJlc3VsdC5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdFx0cmVzdWx0W2ldID0gTWF0aC5yb3VuZChyZXN1bHRbaV0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG5cblx0Ly8gcHJlc2VydmUgLmNvbnZlcnNpb24gcHJvcGVydHkgaWYgdGhlcmUgaXMgb25lXG5cdGlmICgnY29udmVyc2lvbicgaW4gZm4pIHtcblx0XHR3cmFwcGVkRm4uY29udmVyc2lvbiA9IGZuLmNvbnZlcnNpb247XG5cdH1cblxuXHRyZXR1cm4gd3JhcHBlZEZuO1xufVxuXG5tb2RlbHMuZm9yRWFjaChmdW5jdGlvbiAoZnJvbU1vZGVsKSB7XG5cdGNvbnZlcnRbZnJvbU1vZGVsXSA9IHt9O1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb252ZXJ0W2Zyb21Nb2RlbF0sICdjaGFubmVscycsIHt2YWx1ZTogY29udmVyc2lvbnNbZnJvbU1vZGVsXS5jaGFubmVsc30pO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydFtmcm9tTW9kZWxdLCAnbGFiZWxzJywge3ZhbHVlOiBjb252ZXJzaW9uc1tmcm9tTW9kZWxdLmxhYmVsc30pO1xuXG5cdHZhciByb3V0ZXMgPSByb3V0ZShmcm9tTW9kZWwpO1xuXHR2YXIgcm91dGVNb2RlbHMgPSBPYmplY3Qua2V5cyhyb3V0ZXMpO1xuXG5cdHJvdXRlTW9kZWxzLmZvckVhY2goZnVuY3Rpb24gKHRvTW9kZWwpIHtcblx0XHR2YXIgZm4gPSByb3V0ZXNbdG9Nb2RlbF07XG5cblx0XHRjb252ZXJ0W2Zyb21Nb2RlbF1bdG9Nb2RlbF0gPSB3cmFwUm91bmRlZChmbik7XG5cdFx0Y29udmVydFtmcm9tTW9kZWxdW3RvTW9kZWxdLnJhdyA9IHdyYXBSYXcoZm4pO1xuXHR9KTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnZlcnQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjb2xvclN0cmluZyA9IHJlcXVpcmUoJ2NvbG9yLXN0cmluZycpO1xudmFyIGNvbnZlcnQgPSByZXF1aXJlKCdjb2xvci1jb252ZXJ0Jyk7XG5cbnZhciBfc2xpY2UgPSBbXS5zbGljZTtcblxudmFyIHNraXBwZWRNb2RlbHMgPSBbXG5cdC8vIHRvIGJlIGhvbmVzdCwgSSBkb24ndCByZWFsbHkgZmVlbCBsaWtlIGtleXdvcmQgYmVsb25ncyBpbiBjb2xvciBjb252ZXJ0LCBidXQgZWguXG5cdCdrZXl3b3JkJyxcblxuXHQvLyBncmF5IGNvbmZsaWN0cyB3aXRoIHNvbWUgbWV0aG9kIG5hbWVzLCBhbmQgaGFzIGl0cyBvd24gbWV0aG9kIGRlZmluZWQuXG5cdCdncmF5JyxcblxuXHQvLyBzaG91bGRuJ3QgcmVhbGx5IGJlIGluIGNvbG9yLWNvbnZlcnQgZWl0aGVyLi4uXG5cdCdoZXgnXG5dO1xuXG52YXIgaGFzaGVkTW9kZWxLZXlzID0ge307XG5PYmplY3Qua2V5cyhjb252ZXJ0KS5mb3JFYWNoKGZ1bmN0aW9uIChtb2RlbCkge1xuXHRoYXNoZWRNb2RlbEtleXNbX3NsaWNlLmNhbGwoY29udmVydFttb2RlbF0ubGFiZWxzKS5zb3J0KCkuam9pbignJyldID0gbW9kZWw7XG59KTtcblxudmFyIGxpbWl0ZXJzID0ge307XG5cbmZ1bmN0aW9uIENvbG9yKG9iaiwgbW9kZWwpIHtcblx0aWYgKCEodGhpcyBpbnN0YW5jZW9mIENvbG9yKSkge1xuXHRcdHJldHVybiBuZXcgQ29sb3Iob2JqLCBtb2RlbCk7XG5cdH1cblxuXHRpZiAobW9kZWwgJiYgbW9kZWwgaW4gc2tpcHBlZE1vZGVscykge1xuXHRcdG1vZGVsID0gbnVsbDtcblx0fVxuXG5cdGlmIChtb2RlbCAmJiAhKG1vZGVsIGluIGNvbnZlcnQpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdVbmtub3duIG1vZGVsOiAnICsgbW9kZWwpO1xuXHR9XG5cblx0dmFyIGk7XG5cdHZhciBjaGFubmVscztcblxuXHRpZiAob2JqID09IG51bGwpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuXHRcdHRoaXMubW9kZWwgPSAncmdiJztcblx0XHR0aGlzLmNvbG9yID0gWzAsIDAsIDBdO1xuXHRcdHRoaXMudmFscGhhID0gMTtcblx0fSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBDb2xvcikge1xuXHRcdHRoaXMubW9kZWwgPSBvYmoubW9kZWw7XG5cdFx0dGhpcy5jb2xvciA9IG9iai5jb2xvci5zbGljZSgpO1xuXHRcdHRoaXMudmFscGhhID0gb2JqLnZhbHBoYTtcblx0fSBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuXHRcdHZhciByZXN1bHQgPSBjb2xvclN0cmluZy5nZXQob2JqKTtcblx0XHRpZiAocmVzdWx0ID09PSBudWxsKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBwYXJzZSBjb2xvciBmcm9tIHN0cmluZzogJyArIG9iaik7XG5cdFx0fVxuXG5cdFx0dGhpcy5tb2RlbCA9IHJlc3VsdC5tb2RlbDtcblx0XHRjaGFubmVscyA9IGNvbnZlcnRbdGhpcy5tb2RlbF0uY2hhbm5lbHM7XG5cdFx0dGhpcy5jb2xvciA9IHJlc3VsdC52YWx1ZS5zbGljZSgwLCBjaGFubmVscyk7XG5cdFx0dGhpcy52YWxwaGEgPSB0eXBlb2YgcmVzdWx0LnZhbHVlW2NoYW5uZWxzXSA9PT0gJ251bWJlcicgPyByZXN1bHQudmFsdWVbY2hhbm5lbHNdIDogMTtcblx0fSBlbHNlIGlmIChvYmoubGVuZ3RoKSB7XG5cdFx0dGhpcy5tb2RlbCA9IG1vZGVsIHx8ICdyZ2InO1xuXHRcdGNoYW5uZWxzID0gY29udmVydFt0aGlzLm1vZGVsXS5jaGFubmVscztcblx0XHR2YXIgbmV3QXJyID0gX3NsaWNlLmNhbGwob2JqLCAwLCBjaGFubmVscyk7XG5cdFx0dGhpcy5jb2xvciA9IHplcm9BcnJheShuZXdBcnIsIGNoYW5uZWxzKTtcblx0XHR0aGlzLnZhbHBoYSA9IHR5cGVvZiBvYmpbY2hhbm5lbHNdID09PSAnbnVtYmVyJyA/IG9ialtjaGFubmVsc10gOiAxO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBvYmogPT09ICdudW1iZXInKSB7XG5cdFx0Ly8gdGhpcyBpcyBhbHdheXMgUkdCIC0gY2FuIGJlIGNvbnZlcnRlZCBsYXRlciBvbi5cblx0XHRvYmogJj0gMHhGRkZGRkY7XG5cdFx0dGhpcy5tb2RlbCA9ICdyZ2InO1xuXHRcdHRoaXMuY29sb3IgPSBbXG5cdFx0XHQob2JqID4+IDE2KSAmIDB4RkYsXG5cdFx0XHQob2JqID4+IDgpICYgMHhGRixcblx0XHRcdG9iaiAmIDB4RkZcblx0XHRdO1xuXHRcdHRoaXMudmFscGhhID0gMTtcblx0fSBlbHNlIHtcblx0XHR0aGlzLnZhbHBoYSA9IDE7XG5cblx0XHR2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG5cdFx0aWYgKCdhbHBoYScgaW4gb2JqKSB7XG5cdFx0XHRrZXlzLnNwbGljZShrZXlzLmluZGV4T2YoJ2FscGhhJyksIDEpO1xuXHRcdFx0dGhpcy52YWxwaGEgPSB0eXBlb2Ygb2JqLmFscGhhID09PSAnbnVtYmVyJyA/IG9iai5hbHBoYSA6IDA7XG5cdFx0fVxuXG5cdFx0dmFyIGhhc2hlZEtleXMgPSBrZXlzLnNvcnQoKS5qb2luKCcnKTtcblx0XHRpZiAoIShoYXNoZWRLZXlzIGluIGhhc2hlZE1vZGVsS2V5cykpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHBhcnNlIGNvbG9yIGZyb20gb2JqZWN0OiAnICsgSlNPTi5zdHJpbmdpZnkob2JqKSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5tb2RlbCA9IGhhc2hlZE1vZGVsS2V5c1toYXNoZWRLZXlzXTtcblxuXHRcdHZhciBsYWJlbHMgPSBjb252ZXJ0W3RoaXMubW9kZWxdLmxhYmVscztcblx0XHR2YXIgY29sb3IgPSBbXTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgbGFiZWxzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb2xvci5wdXNoKG9ialtsYWJlbHNbaV1dKTtcblx0XHR9XG5cblx0XHR0aGlzLmNvbG9yID0gemVyb0FycmF5KGNvbG9yKTtcblx0fVxuXG5cdC8vIHBlcmZvcm0gbGltaXRhdGlvbnMgKGNsYW1waW5nLCBldGMuKVxuXHRpZiAobGltaXRlcnNbdGhpcy5tb2RlbF0pIHtcblx0XHRjaGFubmVscyA9IGNvbnZlcnRbdGhpcy5tb2RlbF0uY2hhbm5lbHM7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHtcblx0XHRcdHZhciBsaW1pdCA9IGxpbWl0ZXJzW3RoaXMubW9kZWxdW2ldO1xuXHRcdFx0aWYgKGxpbWl0KSB7XG5cdFx0XHRcdHRoaXMuY29sb3JbaV0gPSBsaW1pdCh0aGlzLmNvbG9yW2ldKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHR0aGlzLnZhbHBoYSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHRoaXMudmFscGhhKSk7XG5cblx0aWYgKE9iamVjdC5mcmVlemUpIHtcblx0XHRPYmplY3QuZnJlZXplKHRoaXMpO1xuXHR9XG59XG5cbkNvbG9yLnByb3RvdHlwZSA9IHtcblx0dG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy5zdHJpbmcoKTtcblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpc1t0aGlzLm1vZGVsXSgpO1xuXHR9LFxuXG5cdHN0cmluZzogZnVuY3Rpb24gKHBsYWNlcykge1xuXHRcdHZhciBzZWxmID0gdGhpcy5tb2RlbCBpbiBjb2xvclN0cmluZy50byA/IHRoaXMgOiB0aGlzLnJnYigpO1xuXHRcdHNlbGYgPSBzZWxmLnJvdW5kKHR5cGVvZiBwbGFjZXMgPT09ICdudW1iZXInID8gcGxhY2VzIDogMSk7XG5cdFx0dmFyIGFyZ3MgPSBzZWxmLnZhbHBoYSA9PT0gMSA/IHNlbGYuY29sb3IgOiBzZWxmLmNvbG9yLmNvbmNhdCh0aGlzLnZhbHBoYSk7XG5cdFx0cmV0dXJuIGNvbG9yU3RyaW5nLnRvW3NlbGYubW9kZWxdKGFyZ3MpO1xuXHR9LFxuXG5cdHBlcmNlbnRTdHJpbmc6IGZ1bmN0aW9uIChwbGFjZXMpIHtcblx0XHR2YXIgc2VsZiA9IHRoaXMucmdiKCkucm91bmQodHlwZW9mIHBsYWNlcyA9PT0gJ251bWJlcicgPyBwbGFjZXMgOiAxKTtcblx0XHR2YXIgYXJncyA9IHNlbGYudmFscGhhID09PSAxID8gc2VsZi5jb2xvciA6IHNlbGYuY29sb3IuY29uY2F0KHRoaXMudmFscGhhKTtcblx0XHRyZXR1cm4gY29sb3JTdHJpbmcudG8ucmdiLnBlcmNlbnQoYXJncyk7XG5cdH0sXG5cblx0YXJyYXk6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy52YWxwaGEgPT09IDEgPyB0aGlzLmNvbG9yLnNsaWNlKCkgOiB0aGlzLmNvbG9yLmNvbmNhdCh0aGlzLnZhbHBoYSk7XG5cdH0sXG5cblx0b2JqZWN0OiBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHJlc3VsdCA9IHt9O1xuXHRcdHZhciBjaGFubmVscyA9IGNvbnZlcnRbdGhpcy5tb2RlbF0uY2hhbm5lbHM7XG5cdFx0dmFyIGxhYmVscyA9IGNvbnZlcnRbdGhpcy5tb2RlbF0ubGFiZWxzO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7XG5cdFx0XHRyZXN1bHRbbGFiZWxzW2ldXSA9IHRoaXMuY29sb3JbaV07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMudmFscGhhICE9PSAxKSB7XG5cdFx0XHRyZXN1bHQuYWxwaGEgPSB0aGlzLnZhbHBoYTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9LFxuXG5cdHVuaXRBcnJheTogZnVuY3Rpb24gKCkge1xuXHRcdHZhciByZ2IgPSB0aGlzLnJnYigpLmNvbG9yO1xuXHRcdHJnYlswXSAvPSAyNTU7XG5cdFx0cmdiWzFdIC89IDI1NTtcblx0XHRyZ2JbMl0gLz0gMjU1O1xuXG5cdFx0aWYgKHRoaXMudmFscGhhICE9PSAxKSB7XG5cdFx0XHRyZ2IucHVzaCh0aGlzLnZhbHBoYSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJnYjtcblx0fSxcblxuXHR1bml0T2JqZWN0OiBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHJnYiA9IHRoaXMucmdiKCkub2JqZWN0KCk7XG5cdFx0cmdiLnIgLz0gMjU1O1xuXHRcdHJnYi5nIC89IDI1NTtcblx0XHRyZ2IuYiAvPSAyNTU7XG5cblx0XHRpZiAodGhpcy52YWxwaGEgIT09IDEpIHtcblx0XHRcdHJnYi5hbHBoYSA9IHRoaXMudmFscGhhO1xuXHRcdH1cblxuXHRcdHJldHVybiByZ2I7XG5cdH0sXG5cblx0cm91bmQ6IGZ1bmN0aW9uIChwbGFjZXMpIHtcblx0XHRwbGFjZXMgPSBNYXRoLm1heChwbGFjZXMgfHwgMCwgMCk7XG5cdFx0cmV0dXJuIG5ldyBDb2xvcih0aGlzLmNvbG9yLm1hcChyb3VuZFRvUGxhY2UocGxhY2VzKSkuY29uY2F0KHRoaXMudmFscGhhKSwgdGhpcy5tb2RlbCk7XG5cdH0sXG5cblx0YWxwaGE6IGZ1bmN0aW9uICh2YWwpIHtcblx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIG5ldyBDb2xvcih0aGlzLmNvbG9yLmNvbmNhdChNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB2YWwpKSksIHRoaXMubW9kZWwpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnZhbHBoYTtcblx0fSxcblxuXHQvLyByZ2Jcblx0cmVkOiBnZXRzZXQoJ3JnYicsIDAsIG1heGZuKDI1NSkpLFxuXHRncmVlbjogZ2V0c2V0KCdyZ2InLCAxLCBtYXhmbigyNTUpKSxcblx0Ymx1ZTogZ2V0c2V0KCdyZ2InLCAyLCBtYXhmbigyNTUpKSxcblxuXHRodWU6IGdldHNldChbJ2hzbCcsICdoc3YnLCAnaHNsJywgJ2h3YicsICdoY2cnXSwgMCwgZnVuY3Rpb24gKHZhbCkgeyByZXR1cm4gKCh2YWwgJSAzNjApICsgMzYwKSAlIDM2MDsgfSksIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgYnJhY2Utc3R5bGVcblxuXHRzYXR1cmF0aW9ubDogZ2V0c2V0KCdoc2wnLCAxLCBtYXhmbigxMDApKSxcblx0bGlnaHRuZXNzOiBnZXRzZXQoJ2hzbCcsIDIsIG1heGZuKDEwMCkpLFxuXG5cdHNhdHVyYXRpb252OiBnZXRzZXQoJ2hzdicsIDEsIG1heGZuKDEwMCkpLFxuXHR2YWx1ZTogZ2V0c2V0KCdoc3YnLCAyLCBtYXhmbigxMDApKSxcblxuXHRjaHJvbWE6IGdldHNldCgnaGNnJywgMSwgbWF4Zm4oMTAwKSksXG5cdGdyYXk6IGdldHNldCgnaGNnJywgMiwgbWF4Zm4oMTAwKSksXG5cblx0d2hpdGU6IGdldHNldCgnaHdiJywgMSwgbWF4Zm4oMTAwKSksXG5cdHdibGFjazogZ2V0c2V0KCdod2InLCAyLCBtYXhmbigxMDApKSxcblxuXHRjeWFuOiBnZXRzZXQoJ2NteWsnLCAwLCBtYXhmbigxMDApKSxcblx0bWFnZW50YTogZ2V0c2V0KCdjbXlrJywgMSwgbWF4Zm4oMTAwKSksXG5cdHllbGxvdzogZ2V0c2V0KCdjbXlrJywgMiwgbWF4Zm4oMTAwKSksXG5cdGJsYWNrOiBnZXRzZXQoJ2NteWsnLCAzLCBtYXhmbigxMDApKSxcblxuXHR4OiBnZXRzZXQoJ3h5eicsIDAsIG1heGZuKDEwMCkpLFxuXHR5OiBnZXRzZXQoJ3h5eicsIDEsIG1heGZuKDEwMCkpLFxuXHR6OiBnZXRzZXQoJ3h5eicsIDIsIG1heGZuKDEwMCkpLFxuXG5cdGw6IGdldHNldCgnbGFiJywgMCwgbWF4Zm4oMTAwKSksXG5cdGE6IGdldHNldCgnbGFiJywgMSksXG5cdGI6IGdldHNldCgnbGFiJywgMiksXG5cblx0a2V5d29yZDogZnVuY3Rpb24gKHZhbCkge1xuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gbmV3IENvbG9yKHZhbCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbnZlcnRbdGhpcy5tb2RlbF0ua2V5d29yZCh0aGlzLmNvbG9yKTtcblx0fSxcblxuXHRoZXg6IGZ1bmN0aW9uICh2YWwpIHtcblx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIG5ldyBDb2xvcih2YWwpO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb2xvclN0cmluZy50by5oZXgodGhpcy5yZ2IoKS5yb3VuZCgpLmNvbG9yKTtcblx0fSxcblxuXHRyZ2JOdW1iZXI6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgcmdiID0gdGhpcy5yZ2IoKS5jb2xvcjtcblx0XHRyZXR1cm4gKChyZ2JbMF0gJiAweEZGKSA8PCAxNikgfCAoKHJnYlsxXSAmIDB4RkYpIDw8IDgpIHwgKHJnYlsyXSAmIDB4RkYpO1xuXHR9LFxuXG5cdGx1bWlub3NpdHk6IGZ1bmN0aW9uICgpIHtcblx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9XQ0FHMjAvI3JlbGF0aXZlbHVtaW5hbmNlZGVmXG5cdFx0dmFyIHJnYiA9IHRoaXMucmdiKCkuY29sb3I7XG5cblx0XHR2YXIgbHVtID0gW107XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCByZ2IubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBjaGFuID0gcmdiW2ldIC8gMjU1O1xuXHRcdFx0bHVtW2ldID0gKGNoYW4gPD0gMC4wMzkyOCkgPyBjaGFuIC8gMTIuOTIgOiBNYXRoLnBvdygoKGNoYW4gKyAwLjA1NSkgLyAxLjA1NSksIDIuNCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIDAuMjEyNiAqIGx1bVswXSArIDAuNzE1MiAqIGx1bVsxXSArIDAuMDcyMiAqIGx1bVsyXTtcblx0fSxcblxuXHRjb250cmFzdDogZnVuY3Rpb24gKGNvbG9yMikge1xuXHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jY29udHJhc3QtcmF0aW9kZWZcblx0XHR2YXIgbHVtMSA9IHRoaXMubHVtaW5vc2l0eSgpO1xuXHRcdHZhciBsdW0yID0gY29sb3IyLmx1bWlub3NpdHkoKTtcblxuXHRcdGlmIChsdW0xID4gbHVtMikge1xuXHRcdFx0cmV0dXJuIChsdW0xICsgMC4wNSkgLyAobHVtMiArIDAuMDUpO1xuXHRcdH1cblxuXHRcdHJldHVybiAobHVtMiArIDAuMDUpIC8gKGx1bTEgKyAwLjA1KTtcblx0fSxcblxuXHRsZXZlbDogZnVuY3Rpb24gKGNvbG9yMikge1xuXHRcdHZhciBjb250cmFzdFJhdGlvID0gdGhpcy5jb250cmFzdChjb2xvcjIpO1xuXHRcdGlmIChjb250cmFzdFJhdGlvID49IDcuMSkge1xuXHRcdFx0cmV0dXJuICdBQUEnO1xuXHRcdH1cblxuXHRcdHJldHVybiAoY29udHJhc3RSYXRpbyA+PSA0LjUpID8gJ0FBJyA6ICcnO1xuXHR9LFxuXG5cdGlzRGFyazogZnVuY3Rpb24gKCkge1xuXHRcdC8vIFlJUSBlcXVhdGlvbiBmcm9tIGh0dHA6Ly8yNHdheXMub3JnLzIwMTAvY2FsY3VsYXRpbmctY29sb3ItY29udHJhc3Rcblx0XHR2YXIgcmdiID0gdGhpcy5yZ2IoKS5jb2xvcjtcblx0XHR2YXIgeWlxID0gKHJnYlswXSAqIDI5OSArIHJnYlsxXSAqIDU4NyArIHJnYlsyXSAqIDExNCkgLyAxMDAwO1xuXHRcdHJldHVybiB5aXEgPCAxMjg7XG5cdH0sXG5cblx0aXNMaWdodDogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiAhdGhpcy5pc0RhcmsoKTtcblx0fSxcblxuXHRuZWdhdGU6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgcmdiID0gdGhpcy5yZ2IoKTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdFx0cmdiLmNvbG9yW2ldID0gMjU1IC0gcmdiLmNvbG9yW2ldO1xuXHRcdH1cblx0XHRyZXR1cm4gcmdiO1xuXHR9LFxuXG5cdGxpZ2h0ZW46IGZ1bmN0aW9uIChyYXRpbykge1xuXHRcdHZhciBoc2wgPSB0aGlzLmhzbCgpO1xuXHRcdGhzbC5jb2xvclsyXSArPSBoc2wuY29sb3JbMl0gKiByYXRpbztcblx0XHRyZXR1cm4gaHNsO1xuXHR9LFxuXG5cdGRhcmtlbjogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGhzbCA9IHRoaXMuaHNsKCk7XG5cdFx0aHNsLmNvbG9yWzJdIC09IGhzbC5jb2xvclsyXSAqIHJhdGlvO1xuXHRcdHJldHVybiBoc2w7XG5cdH0sXG5cblx0c2F0dXJhdGU6IGZ1bmN0aW9uIChyYXRpbykge1xuXHRcdHZhciBoc2wgPSB0aGlzLmhzbCgpO1xuXHRcdGhzbC5jb2xvclsxXSArPSBoc2wuY29sb3JbMV0gKiByYXRpbztcblx0XHRyZXR1cm4gaHNsO1xuXHR9LFxuXG5cdGRlc2F0dXJhdGU6IGZ1bmN0aW9uIChyYXRpbykge1xuXHRcdHZhciBoc2wgPSB0aGlzLmhzbCgpO1xuXHRcdGhzbC5jb2xvclsxXSAtPSBoc2wuY29sb3JbMV0gKiByYXRpbztcblx0XHRyZXR1cm4gaHNsO1xuXHR9LFxuXG5cdHdoaXRlbjogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGh3YiA9IHRoaXMuaHdiKCk7XG5cdFx0aHdiLmNvbG9yWzFdICs9IGh3Yi5jb2xvclsxXSAqIHJhdGlvO1xuXHRcdHJldHVybiBod2I7XG5cdH0sXG5cblx0YmxhY2tlbjogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGh3YiA9IHRoaXMuaHdiKCk7XG5cdFx0aHdiLmNvbG9yWzJdICs9IGh3Yi5jb2xvclsyXSAqIHJhdGlvO1xuXHRcdHJldHVybiBod2I7XG5cdH0sXG5cblx0Z3JheXNjYWxlOiBmdW5jdGlvbiAoKSB7XG5cdFx0Ly8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9HcmF5c2NhbGUjQ29udmVydGluZ19jb2xvcl90b19ncmF5c2NhbGVcblx0XHR2YXIgcmdiID0gdGhpcy5yZ2IoKS5jb2xvcjtcblx0XHR2YXIgdmFsID0gcmdiWzBdICogMC4zICsgcmdiWzFdICogMC41OSArIHJnYlsyXSAqIDAuMTE7XG5cdFx0cmV0dXJuIENvbG9yLnJnYih2YWwsIHZhbCwgdmFsKTtcblx0fSxcblxuXHRmYWRlOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHRyZXR1cm4gdGhpcy5hbHBoYSh0aGlzLnZhbHBoYSAtICh0aGlzLnZhbHBoYSAqIHJhdGlvKSk7XG5cdH0sXG5cblx0b3BhcXVlcjogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0cmV0dXJuIHRoaXMuYWxwaGEodGhpcy52YWxwaGEgKyAodGhpcy52YWxwaGEgKiByYXRpbykpO1xuXHR9LFxuXG5cdHJvdGF0ZTogZnVuY3Rpb24gKGRlZ3JlZXMpIHtcblx0XHR2YXIgaHNsID0gdGhpcy5oc2woKTtcblx0XHR2YXIgaHVlID0gaHNsLmNvbG9yWzBdO1xuXHRcdGh1ZSA9IChodWUgKyBkZWdyZWVzKSAlIDM2MDtcblx0XHRodWUgPSBodWUgPCAwID8gMzYwICsgaHVlIDogaHVlO1xuXHRcdGhzbC5jb2xvclswXSA9IGh1ZTtcblx0XHRyZXR1cm4gaHNsO1xuXHR9LFxuXG5cdG1peDogZnVuY3Rpb24gKG1peGluQ29sb3IsIHdlaWdodCkge1xuXHRcdC8vIHBvcnRlZCBmcm9tIHNhc3MgaW1wbGVtZW50YXRpb24gaW4gQ1xuXHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zYXNzL2xpYnNhc3MvYmxvYi8wZTZiNGEyODUwMDkyMzU2YWEzZWNlMDdjNmIyNDlmMDIyMWNhY2VkL2Z1bmN0aW9ucy5jcHAjTDIwOVxuXHRcdGlmICghbWl4aW5Db2xvciB8fCAhbWl4aW5Db2xvci5yZ2IpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignQXJndW1lbnQgdG8gXCJtaXhcIiB3YXMgbm90IGEgQ29sb3IgaW5zdGFuY2UsIGJ1dCByYXRoZXIgYW4gaW5zdGFuY2Ugb2YgJyArIHR5cGVvZiBtaXhpbkNvbG9yKTtcblx0XHR9XG5cdFx0dmFyIGNvbG9yMSA9IG1peGluQ29sb3IucmdiKCk7XG5cdFx0dmFyIGNvbG9yMiA9IHRoaXMucmdiKCk7XG5cdFx0dmFyIHAgPSB3ZWlnaHQgPT09IHVuZGVmaW5lZCA/IDAuNSA6IHdlaWdodDtcblxuXHRcdHZhciB3ID0gMiAqIHAgLSAxO1xuXHRcdHZhciBhID0gY29sb3IxLmFscGhhKCkgLSBjb2xvcjIuYWxwaGEoKTtcblxuXHRcdHZhciB3MSA9ICgoKHcgKiBhID09PSAtMSkgPyB3IDogKHcgKyBhKSAvICgxICsgdyAqIGEpKSArIDEpIC8gMi4wO1xuXHRcdHZhciB3MiA9IDEgLSB3MTtcblxuXHRcdHJldHVybiBDb2xvci5yZ2IoXG5cdFx0XHRcdHcxICogY29sb3IxLnJlZCgpICsgdzIgKiBjb2xvcjIucmVkKCksXG5cdFx0XHRcdHcxICogY29sb3IxLmdyZWVuKCkgKyB3MiAqIGNvbG9yMi5ncmVlbigpLFxuXHRcdFx0XHR3MSAqIGNvbG9yMS5ibHVlKCkgKyB3MiAqIGNvbG9yMi5ibHVlKCksXG5cdFx0XHRcdGNvbG9yMS5hbHBoYSgpICogcCArIGNvbG9yMi5hbHBoYSgpICogKDEgLSBwKSk7XG5cdH1cbn07XG5cbi8vIG1vZGVsIGNvbnZlcnNpb24gbWV0aG9kcyBhbmQgc3RhdGljIGNvbnN0cnVjdG9yc1xuT2JqZWN0LmtleXMoY29udmVydCkuZm9yRWFjaChmdW5jdGlvbiAobW9kZWwpIHtcblx0aWYgKHNraXBwZWRNb2RlbHMuaW5kZXhPZihtb2RlbCkgIT09IC0xKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0dmFyIGNoYW5uZWxzID0gY29udmVydFttb2RlbF0uY2hhbm5lbHM7XG5cblx0Ly8gY29udmVyc2lvbiBtZXRob2RzXG5cdENvbG9yLnByb3RvdHlwZVttb2RlbF0gPSBmdW5jdGlvbiAoKSB7XG5cdFx0aWYgKHRoaXMubW9kZWwgPT09IG1vZGVsKSB7XG5cdFx0XHRyZXR1cm4gbmV3IENvbG9yKHRoaXMpO1xuXHRcdH1cblxuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gbmV3IENvbG9yKGFyZ3VtZW50cywgbW9kZWwpO1xuXHRcdH1cblxuXHRcdHZhciBuZXdBbHBoYSA9IHR5cGVvZiBhcmd1bWVudHNbY2hhbm5lbHNdID09PSAnbnVtYmVyJyA/IGNoYW5uZWxzIDogdGhpcy52YWxwaGE7XG5cdFx0cmV0dXJuIG5ldyBDb2xvcihhc3NlcnRBcnJheShjb252ZXJ0W3RoaXMubW9kZWxdW21vZGVsXS5yYXcodGhpcy5jb2xvcikpLmNvbmNhdChuZXdBbHBoYSksIG1vZGVsKTtcblx0fTtcblxuXHQvLyAnc3RhdGljJyBjb25zdHJ1Y3Rpb24gbWV0aG9kc1xuXHRDb2xvclttb2RlbF0gPSBmdW5jdGlvbiAoY29sb3IpIHtcblx0XHRpZiAodHlwZW9mIGNvbG9yID09PSAnbnVtYmVyJykge1xuXHRcdFx0Y29sb3IgPSB6ZXJvQXJyYXkoX3NsaWNlLmNhbGwoYXJndW1lbnRzKSwgY2hhbm5lbHMpO1xuXHRcdH1cblx0XHRyZXR1cm4gbmV3IENvbG9yKGNvbG9yLCBtb2RlbCk7XG5cdH07XG59KTtcblxuZnVuY3Rpb24gcm91bmRUbyhudW0sIHBsYWNlcykge1xuXHRyZXR1cm4gTnVtYmVyKG51bS50b0ZpeGVkKHBsYWNlcykpO1xufVxuXG5mdW5jdGlvbiByb3VuZFRvUGxhY2UocGxhY2VzKSB7XG5cdHJldHVybiBmdW5jdGlvbiAobnVtKSB7XG5cdFx0cmV0dXJuIHJvdW5kVG8obnVtLCBwbGFjZXMpO1xuXHR9O1xufVxuXG5mdW5jdGlvbiBnZXRzZXQobW9kZWwsIGNoYW5uZWwsIG1vZGlmaWVyKSB7XG5cdG1vZGVsID0gQXJyYXkuaXNBcnJheShtb2RlbCkgPyBtb2RlbCA6IFttb2RlbF07XG5cblx0bW9kZWwuZm9yRWFjaChmdW5jdGlvbiAobSkge1xuXHRcdChsaW1pdGVyc1ttXSB8fCAobGltaXRlcnNbbV0gPSBbXSkpW2NoYW5uZWxdID0gbW9kaWZpZXI7XG5cdH0pO1xuXG5cdG1vZGVsID0gbW9kZWxbMF07XG5cblx0cmV0dXJuIGZ1bmN0aW9uICh2YWwpIHtcblx0XHR2YXIgcmVzdWx0O1xuXG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdGlmIChtb2RpZmllcikge1xuXHRcdFx0XHR2YWwgPSBtb2RpZmllcih2YWwpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXN1bHQgPSB0aGlzW21vZGVsXSgpO1xuXHRcdFx0cmVzdWx0LmNvbG9yW2NoYW5uZWxdID0gdmFsO1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cblx0XHRyZXN1bHQgPSB0aGlzW21vZGVsXSgpLmNvbG9yW2NoYW5uZWxdO1xuXHRcdGlmIChtb2RpZmllcikge1xuXHRcdFx0cmVzdWx0ID0gbW9kaWZpZXIocmVzdWx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9O1xufVxuXG5mdW5jdGlvbiBtYXhmbihtYXgpIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh2KSB7XG5cdFx0cmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKG1heCwgdikpO1xuXHR9O1xufVxuXG5mdW5jdGlvbiBhc3NlcnRBcnJheSh2YWwpIHtcblx0cmV0dXJuIEFycmF5LmlzQXJyYXkodmFsKSA/IHZhbCA6IFt2YWxdO1xufVxuXG5mdW5jdGlvbiB6ZXJvQXJyYXkoYXJyLCBsZW5ndGgpIHtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuXHRcdGlmICh0eXBlb2YgYXJyW2ldICE9PSAnbnVtYmVyJykge1xuXHRcdFx0YXJyW2ldID0gMDtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gYXJyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENvbG9yO1xuIiwiZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH0sIF90eXBlb2Yob2JqKTsgfVxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOyB9XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgeyBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBpdGVyW1N5bWJvbC5pdGVyYXRvcl0gIT0gbnVsbCB8fCBpdGVyW1wiQEBpdGVyYXRvclwiXSAhPSBudWxsKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkoYXJyKTsgfVxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTsgcmV0dXJuIGFycjI7IH1cbmZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7IFwidXNlIHN0cmljdFwiOyAvKiEgcmVnZW5lcmF0b3ItcnVudGltZSAtLSBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4gLS0gbGljZW5zZSAoTUlUKTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2Jsb2IvbWFpbi9MSUNFTlNFICovIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSBmdW5jdGlvbiBfcmVnZW5lcmF0b3JSdW50aW1lKCkgeyByZXR1cm4gZXhwb3J0czsgfTsgdmFyIGV4cG9ydHMgPSB7fSwgT3AgPSBPYmplY3QucHJvdG90eXBlLCBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eSwgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgfHwgZnVuY3Rpb24gKG9iaiwga2V5LCBkZXNjKSB7IG9ialtrZXldID0gZGVzYy52YWx1ZTsgfSwgJFN5bWJvbCA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sID8gU3ltYm9sIDoge30sIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIiwgYXN5bmNJdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCBcIkBAYXN5bmNJdGVyYXRvclwiLCB0b1N0cmluZ1RhZ1N5bWJvbCA9ICRTeW1ib2wudG9TdHJpbmdUYWcgfHwgXCJAQHRvU3RyaW5nVGFnXCI7IGZ1bmN0aW9uIGRlZmluZShvYmosIGtleSwgdmFsdWUpIHsgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6ICEwLCBjb25maWd1cmFibGU6ICEwLCB3cml0YWJsZTogITAgfSksIG9ialtrZXldOyB9IHRyeSB7IGRlZmluZSh7fSwgXCJcIik7IH0gY2F0Y2ggKGVycikgeyBkZWZpbmUgPSBmdW5jdGlvbiBkZWZpbmUob2JqLCBrZXksIHZhbHVlKSB7IHJldHVybiBvYmpba2V5XSA9IHZhbHVlOyB9OyB9IGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHsgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3IsIGdlbmVyYXRvciA9IE9iamVjdC5jcmVhdGUocHJvdG9HZW5lcmF0b3IucHJvdG90eXBlKSwgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTsgcmV0dXJuIGRlZmluZVByb3BlcnR5KGdlbmVyYXRvciwgXCJfaW52b2tlXCIsIHsgdmFsdWU6IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkgfSksIGdlbmVyYXRvcjsgfSBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHsgdHJ5IHsgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9OyB9IGNhdGNoIChlcnIpIHsgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9OyB9IH0gZXhwb3J0cy53cmFwID0gd3JhcDsgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTsgZnVuY3Rpb24gR2VuZXJhdG9yKCkge30gZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fSBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSgpIHt9IHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9OyBkZWZpbmUoSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KTsgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mLCBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTsgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgJiYgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkgJiYgKEl0ZXJhdG9yUHJvdG90eXBlID0gTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUpOyB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPSBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7IGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHsgW1wibmV4dFwiLCBcInRocm93XCIsIFwicmV0dXJuXCJdLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkgeyBkZWZpbmUocHJvdG90eXBlLCBtZXRob2QsIGZ1bmN0aW9uIChhcmcpIHsgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7IH0pOyB9KTsgfSBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvciwgUHJvbWlzZUltcGwpIHsgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHsgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7IGlmIChcInRocm93XCIgIT09IHJlY29yZC50eXBlKSB7IHZhciByZXN1bHQgPSByZWNvcmQuYXJnLCB2YWx1ZSA9IHJlc3VsdC52YWx1ZTsgcmV0dXJuIHZhbHVlICYmIFwib2JqZWN0XCIgPT0gX3R5cGVvZih2YWx1ZSkgJiYgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKSA/IFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbiAodmFsdWUpIHsgaW52b2tlKFwibmV4dFwiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTsgfSwgZnVuY3Rpb24gKGVycikgeyBpbnZva2UoXCJ0aHJvd1wiLCBlcnIsIHJlc29sdmUsIHJlamVjdCk7IH0pIDogUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbiAodW53cmFwcGVkKSB7IHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZCwgcmVzb2x2ZShyZXN1bHQpOyB9LCBmdW5jdGlvbiAoZXJyb3IpIHsgcmV0dXJuIGludm9rZShcInRocm93XCIsIGVycm9yLCByZXNvbHZlLCByZWplY3QpOyB9KTsgfSByZWplY3QocmVjb3JkLmFyZyk7IH0gdmFyIHByZXZpb3VzUHJvbWlzZTsgZGVmaW5lUHJvcGVydHkodGhpcywgXCJfaW52b2tlXCIsIHsgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKG1ldGhvZCwgYXJnKSB7IGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkgeyByZXR1cm4gbmV3IFByb21pc2VJbXBsKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpOyB9KTsgfSByZXR1cm4gcHJldmlvdXNQcm9taXNlID0gcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7IH0gfSk7IH0gZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7IHZhciBzdGF0ZSA9IFwic3VzcGVuZGVkU3RhcnRcIjsgcmV0dXJuIGZ1bmN0aW9uIChtZXRob2QsIGFyZykgeyBpZiAoXCJleGVjdXRpbmdcIiA9PT0gc3RhdGUpIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7IGlmIChcImNvbXBsZXRlZFwiID09PSBzdGF0ZSkgeyBpZiAoXCJ0aHJvd1wiID09PSBtZXRob2QpIHRocm93IGFyZzsgcmV0dXJuIGRvbmVSZXN1bHQoKTsgfSBmb3IgKGNvbnRleHQubWV0aG9kID0gbWV0aG9kLCBjb250ZXh0LmFyZyA9IGFyZzs7KSB7IHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7IGlmIChkZWxlZ2F0ZSkgeyB2YXIgZGVsZWdhdGVSZXN1bHQgPSBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTsgaWYgKGRlbGVnYXRlUmVzdWx0KSB7IGlmIChkZWxlZ2F0ZVJlc3VsdCA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7IHJldHVybiBkZWxlZ2F0ZVJlc3VsdDsgfSB9IGlmIChcIm5leHRcIiA9PT0gY29udGV4dC5tZXRob2QpIGNvbnRleHQuc2VudCA9IGNvbnRleHQuX3NlbnQgPSBjb250ZXh0LmFyZztlbHNlIGlmIChcInRocm93XCIgPT09IGNvbnRleHQubWV0aG9kKSB7IGlmIChcInN1c3BlbmRlZFN0YXJ0XCIgPT09IHN0YXRlKSB0aHJvdyBzdGF0ZSA9IFwiY29tcGxldGVkXCIsIGNvbnRleHQuYXJnOyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTsgfSBlbHNlIFwicmV0dXJuXCIgPT09IGNvbnRleHQubWV0aG9kICYmIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTsgc3RhdGUgPSBcImV4ZWN1dGluZ1wiOyB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7IGlmIChcIm5vcm1hbFwiID09PSByZWNvcmQudHlwZSkgeyBpZiAoc3RhdGUgPSBjb250ZXh0LmRvbmUgPyBcImNvbXBsZXRlZFwiIDogXCJzdXNwZW5kZWRZaWVsZFwiLCByZWNvcmQuYXJnID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTsgcmV0dXJuIHsgdmFsdWU6IHJlY29yZC5hcmcsIGRvbmU6IGNvbnRleHQuZG9uZSB9OyB9IFwidGhyb3dcIiA9PT0gcmVjb3JkLnR5cGUgJiYgKHN0YXRlID0gXCJjb21wbGV0ZWRcIiwgY29udGV4dC5tZXRob2QgPSBcInRocm93XCIsIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZyk7IH0gfTsgfSBmdW5jdGlvbiBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSB7IHZhciBtZXRob2ROYW1lID0gY29udGV4dC5tZXRob2QsIG1ldGhvZCA9IGRlbGVnYXRlLml0ZXJhdG9yW21ldGhvZE5hbWVdOyBpZiAodW5kZWZpbmVkID09PSBtZXRob2QpIHJldHVybiBjb250ZXh0LmRlbGVnYXRlID0gbnVsbCwgXCJ0aHJvd1wiID09PSBtZXRob2ROYW1lICYmIGRlbGVnYXRlLml0ZXJhdG9yLnJldHVybiAmJiAoY29udGV4dC5tZXRob2QgPSBcInJldHVyblwiLCBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCwgbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCksIFwidGhyb3dcIiA9PT0gY29udGV4dC5tZXRob2QpIHx8IFwicmV0dXJuXCIgIT09IG1ldGhvZE5hbWUgJiYgKGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiLCBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICdcIiArIG1ldGhvZE5hbWUgKyBcIicgbWV0aG9kXCIpKSwgQ29udGludWVTZW50aW5lbDsgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTsgaWYgKFwidGhyb3dcIiA9PT0gcmVjb3JkLnR5cGUpIHJldHVybiBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIiwgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnLCBjb250ZXh0LmRlbGVnYXRlID0gbnVsbCwgQ29udGludWVTZW50aW5lbDsgdmFyIGluZm8gPSByZWNvcmQuYXJnOyByZXR1cm4gaW5mbyA/IGluZm8uZG9uZSA/IChjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZSwgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYywgXCJyZXR1cm5cIiAhPT0gY29udGV4dC5tZXRob2QgJiYgKGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCIsIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkKSwgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWwpIDogaW5mbyA6IChjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIiwgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFwiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3RcIiksIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsLCBDb250aW51ZVNlbnRpbmVsKTsgfSBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykgeyB2YXIgZW50cnkgPSB7IHRyeUxvYzogbG9jc1swXSB9OyAxIGluIGxvY3MgJiYgKGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXSksIDIgaW4gbG9jcyAmJiAoZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl0sIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXSksIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTsgfSBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7IHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9OyByZWNvcmQudHlwZSA9IFwibm9ybWFsXCIsIGRlbGV0ZSByZWNvcmQuYXJnLCBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkOyB9IGZ1bmN0aW9uIENvbnRleHQodHJ5TG9jc0xpc3QpIHsgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XSwgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpLCB0aGlzLnJlc2V0KCEwKTsgfSBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHsgaWYgKGl0ZXJhYmxlKSB7IHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTsgaWYgKGl0ZXJhdG9yTWV0aG9kKSByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7IGlmIChcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGl0ZXJhYmxlLm5leHQpIHJldHVybiBpdGVyYWJsZTsgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7IHZhciBpID0gLTEsIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkgeyBmb3IgKDsgKytpIDwgaXRlcmFibGUubGVuZ3RoOykgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkgcmV0dXJuIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXSwgbmV4dC5kb25lID0gITEsIG5leHQ7IHJldHVybiBuZXh0LnZhbHVlID0gdW5kZWZpbmVkLCBuZXh0LmRvbmUgPSAhMCwgbmV4dDsgfTsgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7IH0gfSByZXR1cm4geyBuZXh0OiBkb25lUmVzdWx0IH07IH0gZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHsgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogITAgfTsgfSByZXR1cm4gR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIGRlZmluZVByb3BlcnR5KEdwLCBcImNvbnN0cnVjdG9yXCIsIHsgdmFsdWU6IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCBjb25maWd1cmFibGU6ICEwIH0pLCBkZWZpbmVQcm9wZXJ0eShHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgXCJjb25zdHJ1Y3RvclwiLCB7IHZhbHVlOiBHZW5lcmF0b3JGdW5jdGlvbiwgY29uZmlndXJhYmxlOiAhMCB9KSwgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkZWZpbmUoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvckZ1bmN0aW9uXCIpLCBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbiAoZ2VuRnVuKSB7IHZhciBjdG9yID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBnZW5GdW4gJiYgZ2VuRnVuLmNvbnN0cnVjdG9yOyByZXR1cm4gISFjdG9yICYmIChjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fCBcIkdlbmVyYXRvckZ1bmN0aW9uXCIgPT09IChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkpOyB9LCBleHBvcnRzLm1hcmsgPSBmdW5jdGlvbiAoZ2VuRnVuKSB7IHJldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSkgOiAoZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCBkZWZpbmUoZ2VuRnVuLCB0b1N0cmluZ1RhZ1N5bWJvbCwgXCJHZW5lcmF0b3JGdW5jdGlvblwiKSksIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKSwgZ2VuRnVuOyB9LCBleHBvcnRzLmF3cmFwID0gZnVuY3Rpb24gKGFyZykgeyByZXR1cm4geyBfX2F3YWl0OiBhcmcgfTsgfSwgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKSwgZGVmaW5lKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlLCBhc3luY0l0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KSwgZXhwb3J0cy5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvciwgZXhwb3J0cy5hc3luYyA9IGZ1bmN0aW9uIChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCwgUHJvbWlzZUltcGwpIHsgdm9pZCAwID09PSBQcm9taXNlSW1wbCAmJiAoUHJvbWlzZUltcGwgPSBQcm9taXNlKTsgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcih3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSwgUHJvbWlzZUltcGwpOyByZXR1cm4gZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pID8gaXRlciA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgeyByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTsgfSk7IH0sIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCksIGRlZmluZShHcCwgdG9TdHJpbmdUYWdTeW1ib2wsIFwiR2VuZXJhdG9yXCIpLCBkZWZpbmUoR3AsIGl0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KSwgZGVmaW5lKEdwLCBcInRvU3RyaW5nXCIsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIFwiW29iamVjdCBHZW5lcmF0b3JdXCI7IH0pLCBleHBvcnRzLmtleXMgPSBmdW5jdGlvbiAodmFsKSB7IHZhciBvYmplY3QgPSBPYmplY3QodmFsKSwga2V5cyA9IFtdOyBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSBrZXlzLnB1c2goa2V5KTsgcmV0dXJuIGtleXMucmV2ZXJzZSgpLCBmdW5jdGlvbiBuZXh0KCkgeyBmb3IgKDsga2V5cy5sZW5ndGg7KSB7IHZhciBrZXkgPSBrZXlzLnBvcCgpOyBpZiAoa2V5IGluIG9iamVjdCkgcmV0dXJuIG5leHQudmFsdWUgPSBrZXksIG5leHQuZG9uZSA9ICExLCBuZXh0OyB9IHJldHVybiBuZXh0LmRvbmUgPSAhMCwgbmV4dDsgfTsgfSwgZXhwb3J0cy52YWx1ZXMgPSB2YWx1ZXMsIENvbnRleHQucHJvdG90eXBlID0geyBjb25zdHJ1Y3RvcjogQ29udGV4dCwgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KHNraXBUZW1wUmVzZXQpIHsgaWYgKHRoaXMucHJldiA9IDAsIHRoaXMubmV4dCA9IDAsIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQsIHRoaXMuZG9uZSA9ICExLCB0aGlzLmRlbGVnYXRlID0gbnVsbCwgdGhpcy5tZXRob2QgPSBcIm5leHRcIiwgdGhpcy5hcmcgPSB1bmRlZmluZWQsIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpLCAhc2tpcFRlbXBSZXNldCkgZm9yICh2YXIgbmFtZSBpbiB0aGlzKSBcInRcIiA9PT0gbmFtZS5jaGFyQXQoMCkgJiYgaGFzT3duLmNhbGwodGhpcywgbmFtZSkgJiYgIWlzTmFOKCtuYW1lLnNsaWNlKDEpKSAmJiAodGhpc1tuYW1lXSA9IHVuZGVmaW5lZCk7IH0sIHN0b3A6IGZ1bmN0aW9uIHN0b3AoKSB7IHRoaXMuZG9uZSA9ICEwOyB2YXIgcm9vdFJlY29yZCA9IHRoaXMudHJ5RW50cmllc1swXS5jb21wbGV0aW9uOyBpZiAoXCJ0aHJvd1wiID09PSByb290UmVjb3JkLnR5cGUpIHRocm93IHJvb3RSZWNvcmQuYXJnOyByZXR1cm4gdGhpcy5ydmFsOyB9LCBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24gZGlzcGF0Y2hFeGNlcHRpb24oZXhjZXB0aW9uKSB7IGlmICh0aGlzLmRvbmUpIHRocm93IGV4Y2VwdGlvbjsgdmFyIGNvbnRleHQgPSB0aGlzOyBmdW5jdGlvbiBoYW5kbGUobG9jLCBjYXVnaHQpIHsgcmV0dXJuIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiLCByZWNvcmQuYXJnID0gZXhjZXB0aW9uLCBjb250ZXh0Lm5leHQgPSBsb2MsIGNhdWdodCAmJiAoY29udGV4dC5tZXRob2QgPSBcIm5leHRcIiwgY29udGV4dC5hcmcgPSB1bmRlZmluZWQpLCAhIWNhdWdodDsgfSBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7IHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXSwgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjsgaWYgKFwicm9vdFwiID09PSBlbnRyeS50cnlMb2MpIHJldHVybiBoYW5kbGUoXCJlbmRcIik7IGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2KSB7IHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpLCBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTsgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHsgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCAhMCk7IGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpOyB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7IGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgITApOyB9IGVsc2UgeyBpZiAoIWhhc0ZpbmFsbHkpIHRocm93IG5ldyBFcnJvcihcInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5XCIpOyBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTsgfSB9IH0gfSwgYWJydXB0OiBmdW5jdGlvbiBhYnJ1cHQodHlwZSwgYXJnKSB7IGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldOyBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJiBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpICYmIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHsgdmFyIGZpbmFsbHlFbnRyeSA9IGVudHJ5OyBicmVhazsgfSB9IGZpbmFsbHlFbnRyeSAmJiAoXCJicmVha1wiID09PSB0eXBlIHx8IFwiY29udGludWVcIiA9PT0gdHlwZSkgJiYgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiYgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jICYmIChmaW5hbGx5RW50cnkgPSBudWxsKTsgdmFyIHJlY29yZCA9IGZpbmFsbHlFbnRyeSA/IGZpbmFsbHlFbnRyeS5jb21wbGV0aW9uIDoge307IHJldHVybiByZWNvcmQudHlwZSA9IHR5cGUsIHJlY29yZC5hcmcgPSBhcmcsIGZpbmFsbHlFbnRyeSA/ICh0aGlzLm1ldGhvZCA9IFwibmV4dFwiLCB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYywgQ29udGludWVTZW50aW5lbCkgOiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7IH0sIGNvbXBsZXRlOiBmdW5jdGlvbiBjb21wbGV0ZShyZWNvcmQsIGFmdGVyTG9jKSB7IGlmIChcInRocm93XCIgPT09IHJlY29yZC50eXBlKSB0aHJvdyByZWNvcmQuYXJnOyByZXR1cm4gXCJicmVha1wiID09PSByZWNvcmQudHlwZSB8fCBcImNvbnRpbnVlXCIgPT09IHJlY29yZC50eXBlID8gdGhpcy5uZXh0ID0gcmVjb3JkLmFyZyA6IFwicmV0dXJuXCIgPT09IHJlY29yZC50eXBlID8gKHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZywgdGhpcy5tZXRob2QgPSBcInJldHVyblwiLCB0aGlzLm5leHQgPSBcImVuZFwiKSA6IFwibm9ybWFsXCIgPT09IHJlY29yZC50eXBlICYmIGFmdGVyTG9jICYmICh0aGlzLm5leHQgPSBhZnRlckxvYyksIENvbnRpbnVlU2VudGluZWw7IH0sIGZpbmlzaDogZnVuY3Rpb24gZmluaXNoKGZpbmFsbHlMb2MpIHsgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgeyB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07IGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSByZXR1cm4gdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyksIHJlc2V0VHJ5RW50cnkoZW50cnkpLCBDb250aW51ZVNlbnRpbmVsOyB9IH0sIGNhdGNoOiBmdW5jdGlvbiBfY2F0Y2godHJ5TG9jKSB7IGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldOyBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHsgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247IGlmIChcInRocm93XCIgPT09IHJlY29yZC50eXBlKSB7IHZhciB0aHJvd24gPSByZWNvcmQuYXJnOyByZXNldFRyeUVudHJ5KGVudHJ5KTsgfSByZXR1cm4gdGhyb3duOyB9IH0gdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpOyB9LCBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbiBkZWxlZ2F0ZVlpZWxkKGl0ZXJhYmxlLCByZXN1bHROYW1lLCBuZXh0TG9jKSB7IHJldHVybiB0aGlzLmRlbGVnYXRlID0geyBpdGVyYXRvcjogdmFsdWVzKGl0ZXJhYmxlKSwgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSwgbmV4dExvYzogbmV4dExvYyB9LCBcIm5leHRcIiA9PT0gdGhpcy5tZXRob2QgJiYgKHRoaXMuYXJnID0gdW5kZWZpbmVkKSwgQ29udGludWVTZW50aW5lbDsgfSB9LCBleHBvcnRzOyB9XG5pbXBvcnQgeyBfX2F3YWl0ZXIgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBDb2xvciBmcm9tICdjb2xvcic7XG5pbXBvcnQgeyBpc1VybCwgaXNPYmplY3QsIGlzRnVuY3Rpb24gfSBmcm9tICcuLi91dGlscyc7XG52YXIgaW5zZXJ0TGVuZ3RoUnVsZSA9IGZ1bmN0aW9uIGluc2VydExlbmd0aFJ1bGUoc2NoZW1hLCBydWxlcykge1xuICB2YXIgdHlwZSA9IHNjaGVtYS50eXBlLFxuICAgIG1heCA9IHNjaGVtYS5tYXgsXG4gICAgbWluID0gc2NoZW1hLm1pbixcbiAgICBtZXNzYWdlID0gc2NoZW1hLm1lc3NhZ2U7XG4gIGlmIChtYXggfHwgbWF4ID09PSAwKSB7XG4gICAgcnVsZXMucHVzaCh7XG4gICAgICB0eXBlOiB0eXBlLFxuICAgICAgbWF4OiBtYXgsXG4gICAgICBtZXNzYWdlOiBtZXNzYWdlID09PSBudWxsIHx8IG1lc3NhZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1lc3NhZ2UubWF4XG4gICAgfSk7XG4gIH1cbiAgaWYgKG1pbiB8fCBtaW4gPT09IDApIHtcbiAgICBydWxlcy5wdXNoKHtcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBtaW46IG1pbixcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UgPT09IG51bGwgfHwgbWVzc2FnZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbWVzc2FnZS5taW5cbiAgICB9KTtcbiAgfVxufTtcbnZhciBpbnNlcnRSZXF1aXJlZFJ1bGUgPSBmdW5jdGlvbiBpbnNlcnRSZXF1aXJlZFJ1bGUoc2NoZW1hLCBydWxlcykge1xuICB2YXIgX2E7XG4gIHZhciB0eXBlID0gc2NoZW1hLnR5cGUsXG4gICAgZm9ybWF0ID0gc2NoZW1hLmZvcm1hdCxcbiAgICByZXF1aXJlZCA9IHNjaGVtYS5yZXF1aXJlZCxcbiAgICBtZXNzYWdlID0gc2NoZW1hLm1lc3NhZ2UsXG4gICAgd2lkZ2V0ID0gc2NoZW1hLndpZGdldCxcbiAgICB0aXRsZSA9IHNjaGVtYS50aXRsZTtcbiAgdmFyIHJlcXVpcmVkQWxyZWFkeSA9IChfYSA9IHNjaGVtYSA9PT0gbnVsbCB8fCBzY2hlbWEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNjaGVtYS5ydWxlcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNvbWUoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICByZXR1cm4gaXRlbSA9PT0gbnVsbCB8fCBpdGVtID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpdGVtLnJlcXVpcmVkO1xuICB9KTtcbiAgLy8g5pyq5aOw5piOIHJlcXVpcmVk77yM5oiW5bey57uP5a2Y5ZyoIHJlcXVpcmVkIOagoemqjFxuICBpZiAoIXJlcXVpcmVkIHx8IHJlcXVpcmVkQWxyZWFkeSkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgcnVsZSA9IHtcbiAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICBtZXNzYWdlOiBtZXNzYWdlID09PSBudWxsIHx8IG1lc3NhZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1lc3NhZ2UucmVxdWlyZWRcbiAgfTtcbiAgaWYgKFsneWVhcicsICdxdWFydGVyJywgJ21vbnRoJywgJ3dlZWsnLCAnZGF0ZScsICdkYXRlVGltZScsICd0aW1lJ10uaW5jbHVkZXMoZm9ybWF0KSAmJiB0eXBlID09PSAncmFuZ2UnKSB7XG4gICAgcnVsZSA9IHtcbiAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIGxlbjogMixcbiAgICAgIGZpZWxkczoge1xuICAgICAgICAwOiB7XG4gICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgMToge1xuICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9IGVsc2UgaWYgKHdpZGdldCA9PT0gJ2NoZWNrYm94Jykge1xuICAgIHJ1bGUgPSB7XG4gICAgICB0eXBlOiB0eXBlLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICB3aGl0ZXNwYWNlOiB0cnVlLFxuICAgICAgbWVzc2FnZTogdGl0bGUgKyAn5b+F5aGrJ1xuICAgIH07XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICBydWxlID0ge1xuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHdoaXRlc3BhY2U6IHRydWUsXG4gICAgICBtZXNzYWdlOiAobWVzc2FnZSA9PT0gbnVsbCB8fCBtZXNzYWdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZXNzYWdlLnJlcXVpcmVkKSB8fCAoIXRpdGxlID8gJ+WGheWuueW/heWhqycgOiB1bmRlZmluZWQpXG4gICAgfTtcbiAgfVxuICBydWxlcy5wdXNoKHJ1bGUpO1xufTtcbmV4cG9ydCB2YXIgdHJhbnNmb3JtUnVsZXMgPSBmdW5jdGlvbiB0cmFuc2Zvcm1SdWxlcygpIHtcbiAgdmFyIHJ1bGVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTtcbiAgdmFyIG1ldGhvZHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgdmFyIGZvcm0gPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHJ1bGVzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgIGlmIChpdGVtLnZhbGlkYXRvciAmJiAhaXRlbS50cmFuc2Zvcm1lZCkge1xuICAgICAgdmFyIHZhbGlkYXRvciA9IGlzRnVuY3Rpb24oaXRlbS52YWxpZGF0b3IpID8gaXRlbS52YWxpZGF0b3IgOiBtZXRob2RzW2l0ZW0udmFsaWRhdG9yXTtcbiAgICAgIGl0ZW0udmFsaWRhdG9yID0gZnVuY3Rpb24gKF8sIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7XG4gICAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdG9yKF8sIHZhbHVlLCB7XG4gICAgICAgICAgICAgICAgICBmb3JtOiBmb3JtXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBfY29udGV4dC5zZW50O1xuICAgICAgICAgICAgICAgIGlmICghaXNPYmplY3QocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDU7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiLCAocmVzdWx0ID09PSBudWxsIHx8IHJlc3VsdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVzdWx0LnN0YXR1cykgPyBQcm9taXNlLnJlc29sdmUoKSA6IFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihyZXN1bHQubWVzc2FnZSB8fCBpdGVtLm1lc3NhZ2UpKSk7XG4gICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIHJlc3VsdCA/IFByb21pc2UucmVzb2x2ZSgpIDogUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGl0ZW0ubWVzc2FnZSkpKTtcbiAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCBfY2FsbGVlKTtcbiAgICAgICAgfSkpO1xuICAgICAgfTtcbiAgICAgIDtcbiAgICAgIGl0ZW0udHJhbnNmb3JtZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbTtcbiAgfSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIChzY2hlbWEsIGZvcm0sIG1ldGhvZHMsIGZpZWxkUmVmKSB7XG4gIHZhciBfYSwgX2I7XG4gIHZhciBmb3JtYXQgPSBzY2hlbWEuZm9ybWF0LFxuICAgIF9zY2hlbWEkcnVsZXMgPSBzY2hlbWEucnVsZXMsXG4gICAgcnVsZUxpc3QgPSBfc2NoZW1hJHJ1bGVzID09PSB2b2lkIDAgPyBbXSA6IF9zY2hlbWEkcnVsZXMsXG4gICAgcGF0dGVybiA9IHNjaGVtYS5wYXR0ZXJuLFxuICAgIG1lc3NhZ2UgPSBzY2hlbWEubWVzc2FnZTtcbiAgdmFyIHJ1bGVzID0gX3RvQ29uc3VtYWJsZUFycmF5KHJ1bGVMaXN0KTtcbiAgaW5zZXJ0UmVxdWlyZWRSdWxlKHNjaGVtYSwgcnVsZXMpO1xuICBpbnNlcnRMZW5ndGhSdWxlKHNjaGVtYSwgcnVsZXMpO1xuICBydWxlcy5wdXNoKHtcbiAgICB2YWxpZGF0b3I6IGZ1bmN0aW9uIHZhbGlkYXRvcihfKSB7XG4gICAgICByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlMigpIHtcbiAgICAgICAgdmFyIF9jLCBfZCwgcmVzO1xuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0Mikge1xuICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24oKF9jID0gZmllbGRSZWYgPT09IG51bGwgfHwgZmllbGRSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZpZWxkUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy52YWxpZGF0b3IpKSB7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KFwicmV0dXJuXCIsIHRydWUpO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDQ7XG4gICAgICAgICAgICAgIHJldHVybiAoX2QgPSBmaWVsZFJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QudmFsaWRhdG9yKCk7XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgIHJlcyA9IF9jb250ZXh0Mi5zZW50O1xuICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdChcInJldHVyblwiLCByZXMpO1xuICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUyKTtcbiAgICAgIH0pKTtcbiAgICB9XG4gIH0pO1xuICBpZiAocGF0dGVybikge1xuICAgIHJ1bGVzLnB1c2goe1xuICAgICAgcGF0dGVybjogcGF0dGVybixcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UgPT09IG51bGwgfHwgbWVzc2FnZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbWVzc2FnZS5wYXR0ZXJuXG4gICAgfSk7XG4gIH1cbiAgaWYgKGZvcm1hdCA9PT0gJ3VybCcpIHtcbiAgICBydWxlcy5wdXNoKHtcbiAgICAgIHR5cGU6ICd1cmwnLFxuICAgICAgbWVzc2FnZTogbWVzc2FnZSA9PT0gbnVsbCB8fCBtZXNzYWdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZXNzYWdlLnVybFxuICAgIH0pO1xuICB9XG4gIGlmIChmb3JtYXQgPT09ICdlbWFpbCcpIHtcbiAgICBydWxlcy5wdXNoKHtcbiAgICAgIHR5cGU6ICdlbWFpbCcsXG4gICAgICBtZXNzYWdlOiBtZXNzYWdlID09PSBudWxsIHx8IG1lc3NhZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1lc3NhZ2UuZW1haWxcbiAgICB9KTtcbiAgfVxuICBpZiAoZm9ybWF0ID09PSAnaW1hZ2UnKSB7XG4gICAgcnVsZXMucHVzaCh7XG4gICAgICB2YWxpZGF0b3I6IGZ1bmN0aW9uIHZhbGlkYXRvcihfLCB2YWx1ZSkge1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGltYWdlUGF0dGVybiA9ICcoWy98Lnx3fHN8LV0pKi4oPzpqcGd8Z2lmfHBuZ3xibXB8YXBuZ3x3ZWJwfGpwZWd8anNvbiknO1xuICAgICAgICB2YXIgX2lzVXJsID0gaXNVcmwodmFsdWUpO1xuICAgICAgICB2YXIgX2lzSW1nID0gbmV3IFJlZ0V4cChpbWFnZVBhdHRlcm4pLnRlc3QodmFsdWUpO1xuICAgICAgICByZXR1cm4gX2lzVXJsIHx8IF9pc0ltZztcbiAgICAgIH0sXG4gICAgICBtZXNzYWdlOiAoX2EgPSBtZXNzYWdlID09PSBudWxsIHx8IG1lc3NhZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1lc3NhZ2UuZW1haWwpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICfor7fovpPlhaXmraPnoa7nmoTlm77niYfmoLzlvI8nXG4gICAgfSk7XG4gIH1cbiAgaWYgKGZvcm1hdCA9PT0gJ2NvbG9yJykge1xuICAgIHJ1bGVzLnB1c2goe1xuICAgICAgdmFsaWRhdG9yOiBmdW5jdGlvbiB2YWxpZGF0b3IoXywgdmFsdWUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBDb2xvcih2YWx1ZSB8fCBudWxsKTsgLy8g56m65a2X56ym5Liy5peg5rOV6Kej5p6Q5Lya5oql6ZSZ77yM5Ye6546w56m655qE5oOF5Ya15LygIG51bGxcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG1lc3NhZ2U6IChfYiA9IG1lc3NhZ2UgPT09IG51bGwgfHwgbWVzc2FnZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbWVzc2FnZS5jb2xvcikgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJ+ivt+Whq+WGmeato+ehrueahOminOiJsuagvOW8jydcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gdHJhbnNmb3JtUnVsZXMocnVsZXMsIG1ldGhvZHMsIGZvcm0pO1xufSk7IiwiaW1wb3J0IHsgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVVwZGF0ZUVmZmVjdCA9IGhvb2sgPT4gKGVmZmVjdCwgZGVwcykgPT4ge1xuICBjb25zdCBpc01vdW50ZWQgPSB1c2VSZWYoZmFsc2UpO1xuICAvLyBmb3IgcmVhY3QtcmVmcmVzaFxuICBob29rKCgpID0+IHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaXNNb3VudGVkLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIGhvb2soKCkgPT4ge1xuICAgIGlmICghaXNNb3VudGVkLmN1cnJlbnQpIHtcbiAgICAgIGlzTW91bnRlZC5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVmZmVjdCgpO1xuICAgIH1cbiAgfSwgZGVwcyk7XG59O1xuZXhwb3J0IGRlZmF1bHQgY3JlYXRlVXBkYXRlRWZmZWN0OyIsImV4cG9ydCBjb25zdCBpc09iamVjdCA9IHZhbHVlID0+IHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCc7XG5leHBvcnQgY29uc3QgaXNGdW5jdGlvbiA9IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbmV4cG9ydCBjb25zdCBpc1N0cmluZyA9IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG5leHBvcnQgY29uc3QgaXNCb29sZWFuID0gdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbic7XG5leHBvcnQgY29uc3QgaXNOdW1iZXIgPSB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInO1xuZXhwb3J0IGNvbnN0IGlzVW5kZWYgPSB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnOyIsImNvbnN0IGlzRGV2ID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgfHwgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICd0ZXN0JztcbmV4cG9ydCBkZWZhdWx0IGlzRGV2OyIsImltcG9ydCB7IHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNyZWF0ZVVwZGF0ZUVmZmVjdCB9IGZyb20gJy4uL2NyZWF0ZVVwZGF0ZUVmZmVjdCc7XG5leHBvcnQgZGVmYXVsdCBjcmVhdGVVcGRhdGVFZmZlY3QodXNlRWZmZWN0KTsiLCJpbXBvcnQgeyB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5mdW5jdGlvbiB1c2VMYXRlc3QodmFsdWUpIHtcbiAgY29uc3QgcmVmID0gdXNlUmVmKHZhbHVlKTtcbiAgcmVmLmN1cnJlbnQgPSB2YWx1ZTtcbiAgcmV0dXJuIHJlZjtcbn1cbmV4cG9ydCBkZWZhdWx0IHVzZUxhdGVzdDsiLCJpbXBvcnQgeyB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlTGF0ZXN0IGZyb20gJy4uL3VzZUxhdGVzdCc7XG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IGlzRGV2IGZyb20gJy4uL3V0aWxzL2lzRGV2JztcbmNvbnN0IHVzZVVubW91bnQgPSBmbiA9PiB7XG4gIGlmIChpc0Rldikge1xuICAgIGlmICghaXNGdW5jdGlvbihmbikpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHVzZVVubW91bnQgZXhwZWN0ZWQgcGFyYW1ldGVyIGlzIGEgZnVuY3Rpb24sIGdvdCAke3R5cGVvZiBmbn1gKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgZm5SZWYgPSB1c2VMYXRlc3QoZm4pO1xuICB1c2VFZmZlY3QoKCkgPT4gKCkgPT4ge1xuICAgIGZuUmVmLmN1cnJlbnQoKTtcbiAgfSwgW10pO1xufTtcbmV4cG9ydCBkZWZhdWx0IHVzZVVubW91bnQ7IiwiIWZ1bmN0aW9uKHQsZSl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9ZSgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoZSk6KHQ9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczp0fHxzZWxmKS5kYXlqcz1lKCl9KHRoaXMsKGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIHQ9MWUzLGU9NmU0LG49MzZlNSxyPVwibWlsbGlzZWNvbmRcIixpPVwic2Vjb25kXCIscz1cIm1pbnV0ZVwiLHU9XCJob3VyXCIsYT1cImRheVwiLG89XCJ3ZWVrXCIsZj1cIm1vbnRoXCIsaD1cInF1YXJ0ZXJcIixjPVwieWVhclwiLGQ9XCJkYXRlXCIsbD1cIkludmFsaWQgRGF0ZVwiLCQ9L14oXFxkezR9KVstL10/KFxcZHsxLDJ9KT9bLS9dPyhcXGR7MCwyfSlbVHRcXHNdKihcXGR7MSwyfSk/Oj8oXFxkezEsMn0pPzo/KFxcZHsxLDJ9KT9bLjpdPyhcXGQrKT8kLyx5PS9cXFsoW15cXF1dKyldfFl7MSw0fXxNezEsNH18RHsxLDJ9fGR7MSw0fXxIezEsMn18aHsxLDJ9fGF8QXxtezEsMn18c3sxLDJ9fFp7MSwyfXxTU1MvZyxNPXtuYW1lOlwiZW5cIix3ZWVrZGF5czpcIlN1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5XCIuc3BsaXQoXCJfXCIpLG1vbnRoczpcIkphbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXJcIi5zcGxpdChcIl9cIiksb3JkaW5hbDpmdW5jdGlvbih0KXt2YXIgZT1bXCJ0aFwiLFwic3RcIixcIm5kXCIsXCJyZFwiXSxuPXQlMTAwO3JldHVyblwiW1wiK3QrKGVbKG4tMjApJTEwXXx8ZVtuXXx8ZVswXSkrXCJdXCJ9fSxtPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1TdHJpbmcodCk7cmV0dXJuIXJ8fHIubGVuZ3RoPj1lP3Q6XCJcIitBcnJheShlKzEtci5sZW5ndGgpLmpvaW4obikrdH0sdj17czptLHo6ZnVuY3Rpb24odCl7dmFyIGU9LXQudXRjT2Zmc2V0KCksbj1NYXRoLmFicyhlKSxyPU1hdGguZmxvb3Iobi82MCksaT1uJTYwO3JldHVybihlPD0wP1wiK1wiOlwiLVwiKSttKHIsMixcIjBcIikrXCI6XCIrbShpLDIsXCIwXCIpfSxtOmZ1bmN0aW9uIHQoZSxuKXtpZihlLmRhdGUoKTxuLmRhdGUoKSlyZXR1cm4tdChuLGUpO3ZhciByPTEyKihuLnllYXIoKS1lLnllYXIoKSkrKG4ubW9udGgoKS1lLm1vbnRoKCkpLGk9ZS5jbG9uZSgpLmFkZChyLGYpLHM9bi1pPDAsdT1lLmNsb25lKCkuYWRkKHIrKHM/LTE6MSksZik7cmV0dXJuKygtKHIrKG4taSkvKHM/aS11OnUtaSkpfHwwKX0sYTpmdW5jdGlvbih0KXtyZXR1cm4gdDwwP01hdGguY2VpbCh0KXx8MDpNYXRoLmZsb29yKHQpfSxwOmZ1bmN0aW9uKHQpe3JldHVybntNOmYseTpjLHc6byxkOmEsRDpkLGg6dSxtOnMsczppLG1zOnIsUTpofVt0XXx8U3RyaW5nKHR8fFwiXCIpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvcyQvLFwiXCIpfSx1OmZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10fX0sZz1cImVuXCIsRD17fTtEW2ddPU07dmFyIHA9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBffSxTPWZ1bmN0aW9uIHQoZSxuLHIpe3ZhciBpO2lmKCFlKXJldHVybiBnO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBlKXt2YXIgcz1lLnRvTG93ZXJDYXNlKCk7RFtzXSYmKGk9cyksbiYmKERbc109bixpPXMpO3ZhciB1PWUuc3BsaXQoXCItXCIpO2lmKCFpJiZ1Lmxlbmd0aD4xKXJldHVybiB0KHVbMF0pfWVsc2V7dmFyIGE9ZS5uYW1lO0RbYV09ZSxpPWF9cmV0dXJuIXImJmkmJihnPWkpLGl8fCFyJiZnfSx3PWZ1bmN0aW9uKHQsZSl7aWYocCh0KSlyZXR1cm4gdC5jbG9uZSgpO3ZhciBuPVwib2JqZWN0XCI9PXR5cGVvZiBlP2U6e307cmV0dXJuIG4uZGF0ZT10LG4uYXJncz1hcmd1bWVudHMsbmV3IF8obil9LE89djtPLmw9UyxPLmk9cCxPLnc9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdyh0LHtsb2NhbGU6ZS4kTCx1dGM6ZS4kdSx4OmUuJHgsJG9mZnNldDplLiRvZmZzZXR9KX07dmFyIF89ZnVuY3Rpb24oKXtmdW5jdGlvbiBNKHQpe3RoaXMuJEw9Uyh0LmxvY2FsZSxudWxsLCEwKSx0aGlzLnBhcnNlKHQpfXZhciBtPU0ucHJvdG90eXBlO3JldHVybiBtLnBhcnNlPWZ1bmN0aW9uKHQpe3RoaXMuJGQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5kYXRlLG49dC51dGM7aWYobnVsbD09PWUpcmV0dXJuIG5ldyBEYXRlKE5hTik7aWYoTy51KGUpKXJldHVybiBuZXcgRGF0ZTtpZihlIGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gbmV3IERhdGUoZSk7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGUmJiEvWiQvaS50ZXN0KGUpKXt2YXIgcj1lLm1hdGNoKCQpO2lmKHIpe3ZhciBpPXJbMl0tMXx8MCxzPShyWzddfHxcIjBcIikuc3Vic3RyaW5nKDAsMyk7cmV0dXJuIG4/bmV3IERhdGUoRGF0ZS5VVEMoclsxXSxpLHJbM118fDEscls0XXx8MCxyWzVdfHwwLHJbNl18fDAscykpOm5ldyBEYXRlKHJbMV0saSxyWzNdfHwxLHJbNF18fDAscls1XXx8MCxyWzZdfHwwLHMpfX1yZXR1cm4gbmV3IERhdGUoZSl9KHQpLHRoaXMuJHg9dC54fHx7fSx0aGlzLmluaXQoKX0sbS5pbml0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy4kZDt0aGlzLiR5PXQuZ2V0RnVsbFllYXIoKSx0aGlzLiRNPXQuZ2V0TW9udGgoKSx0aGlzLiREPXQuZ2V0RGF0ZSgpLHRoaXMuJFc9dC5nZXREYXkoKSx0aGlzLiRIPXQuZ2V0SG91cnMoKSx0aGlzLiRtPXQuZ2V0TWludXRlcygpLHRoaXMuJHM9dC5nZXRTZWNvbmRzKCksdGhpcy4kbXM9dC5nZXRNaWxsaXNlY29uZHMoKX0sbS4kdXRpbHM9ZnVuY3Rpb24oKXtyZXR1cm4gT30sbS5pc1ZhbGlkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLiRkLnRvU3RyaW5nKCk9PT1sKX0sbS5pc1NhbWU9ZnVuY3Rpb24odCxlKXt2YXIgbj13KHQpO3JldHVybiB0aGlzLnN0YXJ0T2YoZSk8PW4mJm48PXRoaXMuZW5kT2YoZSl9LG0uaXNBZnRlcj1mdW5jdGlvbih0LGUpe3JldHVybiB3KHQpPHRoaXMuc3RhcnRPZihlKX0sbS5pc0JlZm9yZT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmVuZE9mKGUpPHcodCl9LG0uJGc9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBPLnUodCk/dGhpc1tlXTp0aGlzLnNldChuLHQpfSxtLnVuaXg9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5mbG9vcih0aGlzLnZhbHVlT2YoKS8xZTMpfSxtLnZhbHVlT2Y9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZC5nZXRUaW1lKCl9LG0uc3RhcnRPZj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj0hIU8udShlKXx8ZSxoPU8ucCh0KSxsPWZ1bmN0aW9uKHQsZSl7dmFyIGk9Ty53KG4uJHU/RGF0ZS5VVEMobi4keSxlLHQpOm5ldyBEYXRlKG4uJHksZSx0KSxuKTtyZXR1cm4gcj9pOmkuZW5kT2YoYSl9LCQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gTy53KG4udG9EYXRlKClbdF0uYXBwbHkobi50b0RhdGUoXCJzXCIpLChyP1swLDAsMCwwXTpbMjMsNTksNTksOTk5XSkuc2xpY2UoZSkpLG4pfSx5PXRoaXMuJFcsTT10aGlzLiRNLG09dGhpcy4kRCx2PVwic2V0XCIrKHRoaXMuJHU/XCJVVENcIjpcIlwiKTtzd2l0Y2goaCl7Y2FzZSBjOnJldHVybiByP2woMSwwKTpsKDMxLDExKTtjYXNlIGY6cmV0dXJuIHI/bCgxLE0pOmwoMCxNKzEpO2Nhc2Ugbzp2YXIgZz10aGlzLiRsb2NhbGUoKS53ZWVrU3RhcnR8fDAsRD0oeTxnP3krNzp5KS1nO3JldHVybiBsKHI/bS1EOm0rKDYtRCksTSk7Y2FzZSBhOmNhc2UgZDpyZXR1cm4gJCh2K1wiSG91cnNcIiwwKTtjYXNlIHU6cmV0dXJuICQoditcIk1pbnV0ZXNcIiwxKTtjYXNlIHM6cmV0dXJuICQoditcIlNlY29uZHNcIiwyKTtjYXNlIGk6cmV0dXJuICQoditcIk1pbGxpc2Vjb25kc1wiLDMpO2RlZmF1bHQ6cmV0dXJuIHRoaXMuY2xvbmUoKX19LG0uZW5kT2Y9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc3RhcnRPZih0LCExKX0sbS4kc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIG4sbz1PLnAodCksaD1cInNldFwiKyh0aGlzLiR1P1wiVVRDXCI6XCJcIiksbD0obj17fSxuW2FdPWgrXCJEYXRlXCIsbltkXT1oK1wiRGF0ZVwiLG5bZl09aCtcIk1vbnRoXCIsbltjXT1oK1wiRnVsbFllYXJcIixuW3VdPWgrXCJIb3Vyc1wiLG5bc109aCtcIk1pbnV0ZXNcIixuW2ldPWgrXCJTZWNvbmRzXCIsbltyXT1oK1wiTWlsbGlzZWNvbmRzXCIsbilbb10sJD1vPT09YT90aGlzLiREKyhlLXRoaXMuJFcpOmU7aWYobz09PWZ8fG89PT1jKXt2YXIgeT10aGlzLmNsb25lKCkuc2V0KGQsMSk7eS4kZFtsXSgkKSx5LmluaXQoKSx0aGlzLiRkPXkuc2V0KGQsTWF0aC5taW4odGhpcy4kRCx5LmRheXNJbk1vbnRoKCkpKS4kZH1lbHNlIGwmJnRoaXMuJGRbbF0oJCk7cmV0dXJuIHRoaXMuaW5pdCgpLHRoaXN9LG0uc2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY2xvbmUoKS4kc2V0KHQsZSl9LG0uZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzW08ucCh0KV0oKX0sbS5hZGQ9ZnVuY3Rpb24ocixoKXt2YXIgZCxsPXRoaXM7cj1OdW1iZXIocik7dmFyICQ9Ty5wKGgpLHk9ZnVuY3Rpb24odCl7dmFyIGU9dyhsKTtyZXR1cm4gTy53KGUuZGF0ZShlLmRhdGUoKStNYXRoLnJvdW5kKHQqcikpLGwpfTtpZigkPT09ZilyZXR1cm4gdGhpcy5zZXQoZix0aGlzLiRNK3IpO2lmKCQ9PT1jKXJldHVybiB0aGlzLnNldChjLHRoaXMuJHkrcik7aWYoJD09PWEpcmV0dXJuIHkoMSk7aWYoJD09PW8pcmV0dXJuIHkoNyk7dmFyIE09KGQ9e30sZFtzXT1lLGRbdV09bixkW2ldPXQsZClbJF18fDEsbT10aGlzLiRkLmdldFRpbWUoKStyKk07cmV0dXJuIE8udyhtLHRoaXMpfSxtLnN1YnRyYWN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuYWRkKC0xKnQsZSl9LG0uZm9ybWF0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10aGlzLiRsb2NhbGUoKTtpZighdGhpcy5pc1ZhbGlkKCkpcmV0dXJuIG4uaW52YWxpZERhdGV8fGw7dmFyIHI9dHx8XCJZWVlZLU1NLUREVEhIOm1tOnNzWlwiLGk9Ty56KHRoaXMpLHM9dGhpcy4kSCx1PXRoaXMuJG0sYT10aGlzLiRNLG89bi53ZWVrZGF5cyxmPW4ubW9udGhzLGg9ZnVuY3Rpb24odCxuLGkscyl7cmV0dXJuIHQmJih0W25dfHx0KGUscikpfHxpW25dLnNsaWNlKDAscyl9LGM9ZnVuY3Rpb24odCl7cmV0dXJuIE8ucyhzJTEyfHwxMix0LFwiMFwiKX0sZD1uLm1lcmlkaWVtfHxmdW5jdGlvbih0LGUsbil7dmFyIHI9dDwxMj9cIkFNXCI6XCJQTVwiO3JldHVybiBuP3IudG9Mb3dlckNhc2UoKTpyfSwkPXtZWTpTdHJpbmcodGhpcy4keSkuc2xpY2UoLTIpLFlZWVk6dGhpcy4keSxNOmErMSxNTTpPLnMoYSsxLDIsXCIwXCIpLE1NTTpoKG4ubW9udGhzU2hvcnQsYSxmLDMpLE1NTU06aChmLGEpLEQ6dGhpcy4kRCxERDpPLnModGhpcy4kRCwyLFwiMFwiKSxkOlN0cmluZyh0aGlzLiRXKSxkZDpoKG4ud2Vla2RheXNNaW4sdGhpcy4kVyxvLDIpLGRkZDpoKG4ud2Vla2RheXNTaG9ydCx0aGlzLiRXLG8sMyksZGRkZDpvW3RoaXMuJFddLEg6U3RyaW5nKHMpLEhIOk8ucyhzLDIsXCIwXCIpLGg6YygxKSxoaDpjKDIpLGE6ZChzLHUsITApLEE6ZChzLHUsITEpLG06U3RyaW5nKHUpLG1tOk8ucyh1LDIsXCIwXCIpLHM6U3RyaW5nKHRoaXMuJHMpLHNzOk8ucyh0aGlzLiRzLDIsXCIwXCIpLFNTUzpPLnModGhpcy4kbXMsMyxcIjBcIiksWjppfTtyZXR1cm4gci5yZXBsYWNlKHksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fCRbdF18fGkucmVwbGFjZShcIjpcIixcIlwiKX0pKX0sbS51dGNPZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMTUqLU1hdGgucm91bmQodGhpcy4kZC5nZXRUaW1lem9uZU9mZnNldCgpLzE1KX0sbS5kaWZmPWZ1bmN0aW9uKHIsZCxsKXt2YXIgJCx5PU8ucChkKSxNPXcociksbT0oTS51dGNPZmZzZXQoKS10aGlzLnV0Y09mZnNldCgpKSplLHY9dGhpcy1NLGc9Ty5tKHRoaXMsTSk7cmV0dXJuIGc9KCQ9e30sJFtjXT1nLzEyLCRbZl09ZywkW2hdPWcvMywkW29dPSh2LW0pLzYwNDhlNSwkW2FdPSh2LW0pLzg2NGU1LCRbdV09di9uLCRbc109di9lLCRbaV09di90LCQpW3ldfHx2LGw/ZzpPLmEoZyl9LG0uZGF5c0luTW9udGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbmRPZihmKS4kRH0sbS4kbG9jYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIERbdGhpcy4kTF19LG0ubG9jYWxlPWZ1bmN0aW9uKHQsZSl7aWYoIXQpcmV0dXJuIHRoaXMuJEw7dmFyIG49dGhpcy5jbG9uZSgpLHI9Uyh0LGUsITApO3JldHVybiByJiYobi4kTD1yKSxufSxtLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIE8udyh0aGlzLiRkLHRoaXMpfSxtLnRvRGF0ZT1mdW5jdGlvbigpe3JldHVybiBuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSl9LG0udG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNWYWxpZCgpP3RoaXMudG9JU09TdHJpbmcoKTpudWxsfSxtLnRvSVNPU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGQudG9JU09TdHJpbmcoKX0sbS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRkLnRvVVRDU3RyaW5nKCl9LE19KCksVD1fLnByb3RvdHlwZTtyZXR1cm4gdy5wcm90b3R5cGU9VCxbW1wiJG1zXCIscl0sW1wiJHNcIixpXSxbXCIkbVwiLHNdLFtcIiRIXCIsdV0sW1wiJFdcIixhXSxbXCIkTVwiLGZdLFtcIiR5XCIsY10sW1wiJERcIixkXV0uZm9yRWFjaCgoZnVuY3Rpb24odCl7VFt0WzFdXT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy4kZyhlLHRbMF0sdFsxXSl9fSkpLHcuZXh0ZW5kPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuJGl8fCh0KGUsXyx3KSx0LiRpPSEwKSx3fSx3LmxvY2FsZT1TLHcuaXNEYXlqcz1wLHcudW5peD1mdW5jdGlvbih0KXtyZXR1cm4gdygxZTMqdCl9LHcuZW49RFtnXSx3LkxzPUQsdy5wPXt9LHd9KSk7IiwiaW1wb3J0IFwiYW50ZC9lcy9idXR0b24vc3R5bGVcIjtcbmltcG9ydCBfQnV0dG9uIGZyb20gXCJhbnRkL2VzL2J1dHRvblwiO1xuaW1wb3J0IFwiYW50ZC9lcy9jb25maWctcHJvdmlkZXIvc3R5bGVcIjtcbmltcG9ydCBfQ29uZmlnUHJvdmlkZXIgZnJvbSBcImFudGQvZXMvY29uZmlnLXByb3ZpZGVyXCI7XG5pbXBvcnQgXCJhbnRkL2VzL2Zvcm0vc3R5bGVcIjtcbmltcG9ydCBfRm9ybSBmcm9tIFwiYW50ZC9lcy9mb3JtXCI7XG5pbXBvcnQgeyBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VDb250ZXh0LCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VVcGRhdGVFZmZlY3QgfSBmcm9tICdhaG9va3MnO1xuaW1wb3J0IHsgdHJhbnNsYXRpb24sIGlzRnVuY3Rpb24gfSBmcm9tICcuLi8uLi91dGlscyc7XG5leHBvcnQgdmFyIEZpZWxkV3JhcHBlclN0YXR1cyA9IGZ1bmN0aW9uIEZpZWxkV3JhcHBlclN0YXR1cyhwcm9wcykge1xuICB2YXIgRmllbGQgPSBwcm9wcy5GaWVsZCxcbiAgICBmaWVsZFByb3BzID0gcHJvcHMuZmllbGRQcm9wcyxcbiAgICBtYXhXaWR0aCA9IHByb3BzLm1heFdpZHRoLFxuICAgIGluaXRpYWxWYWx1ZSA9IHByb3BzLmluaXRpYWxWYWx1ZSxcbiAgICBvdGhlclByb3BzID0gX19yZXN0KHByb3BzLCBbXCJGaWVsZFwiLCBcImZpZWxkUHJvcHNcIiwgXCJtYXhXaWR0aFwiLCBcImluaXRpYWxWYWx1ZVwiXSk7XG4gIHZhciBvblN0YXR1c0NoYW5nZSA9IGZpZWxkUHJvcHMub25TdGF0dXNDaGFuZ2UsXG4gICAgYWRkb25zID0gZmllbGRQcm9wcy5hZGRvbnMsXG4gICAgb3RoZXJGaWVsZFByb3BzID0gX19yZXN0KGZpZWxkUHJvcHMsIFtcIm9uU3RhdHVzQ2hhbmdlXCIsIFwiYWRkb25zXCJdKTtcbiAgdmFyIHN0eWxlID0gbWF4V2lkdGggPyBPYmplY3QuYXNzaWduKHtcbiAgICBtYXhXaWR0aDogbWF4V2lkdGhcbiAgfSwgZmllbGRQcm9wcyA9PT0gbnVsbCB8fCBmaWVsZFByb3BzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmaWVsZFByb3BzLnN0eWxlKSA6IE9iamVjdC5hc3NpZ24oe30sIGZpZWxkUHJvcHMgPT09IG51bGwgfHwgZmllbGRQcm9wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogZmllbGRQcm9wcy5zdHlsZSk7XG4gIHZhciBfRm9ybSRJdGVtJHVzZVN0YXR1cyA9IF9Gb3JtLkl0ZW0udXNlU3RhdHVzKCksXG4gICAgc3RhdHVzID0gX0Zvcm0kSXRlbSR1c2VTdGF0dXMuc3RhdHVzO1xuICB2YXIgZXJyb3JzID0gYWRkb25zLmdldEZpZWxkRXJyb3IoYWRkb25zLmRhdGFQYXRoKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBvblN0YXR1c0NoYW5nZSAmJiBvblN0YXR1c0NoYW5nZShzdGF0dXMsIGVycm9ycyk7XG4gIH0sIFtKU09OLnN0cmluZ2lmeShlcnJvcnMpXSk7XG4gIHVzZVVwZGF0ZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgb3RoZXJQcm9wcy5vbkNoYW5nZShpbml0aWFsVmFsdWUpO1xuICB9LCBbSlNPTi5zdHJpbmdpZnkoaW5pdGlhbFZhbHVlKV0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRmllbGQsIE9iamVjdC5hc3NpZ24oe30sIG90aGVyUHJvcHMsIG90aGVyRmllbGRQcm9wcywge1xuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBhZGRvbnM6IGFkZG9uc1xuICB9KSk7XG59O1xuZXhwb3J0IHZhciBGaWVsZFdyYXBwZXIgPSBmdW5jdGlvbiBGaWVsZFdyYXBwZXIocHJvcHMpIHtcbiAgdmFyIEZpZWxkID0gcHJvcHMuRmllbGQsXG4gICAgZmllbGRQcm9wcyA9IHByb3BzLmZpZWxkUHJvcHMsXG4gICAgbWF4V2lkdGggPSBwcm9wcy5tYXhXaWR0aCxcbiAgICBpbml0aWFsVmFsdWUgPSBwcm9wcy5pbml0aWFsVmFsdWUsXG4gICAgb3RoZXJQcm9wcyA9IF9fcmVzdChwcm9wcywgW1wiRmllbGRcIiwgXCJmaWVsZFByb3BzXCIsIFwibWF4V2lkdGhcIiwgXCJpbml0aWFsVmFsdWVcIl0pO1xuICB2YXIgYWRkb25zID0gZmllbGRQcm9wcy5hZGRvbnMsXG4gICAgc2NoZW1hID0gZmllbGRQcm9wcy5zY2hlbWE7XG4gIHZhciBfc3R5bGUgPSBtYXhXaWR0aCA/IE9iamVjdC5hc3NpZ24oe1xuICAgIG1heFdpZHRoOiBtYXhXaWR0aFxuICB9LCBmaWVsZFByb3BzID09PSBudWxsIHx8IGZpZWxkUHJvcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZpZWxkUHJvcHMuc3R5bGUpIDogT2JqZWN0LmFzc2lnbih7fSwgZmllbGRQcm9wcyA9PT0gbnVsbCB8fCBmaWVsZFByb3BzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmaWVsZFByb3BzLnN0eWxlKTtcbiAgdmFyIHJlbW92ZUJ0biA9IHNjaGVtYS5yZW1vdmVCdG47XG4gIHZhciBjb25maWdDdHggPSB1c2VDb250ZXh0KF9Db25maWdQcm92aWRlci5Db25maWdDb250ZXh0KTtcbiAgdmFyIHQgPSB0cmFuc2xhdGlvbihjb25maWdDdHgpO1xuICB1c2VVcGRhdGVFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIG90aGVyUHJvcHMub25DaGFuZ2UoaW5pdGlhbFZhbHVlKTtcbiAgfSwgW0pTT04uc3RyaW5naWZ5KGluaXRpYWxWYWx1ZSldKTtcbiAgdmFyIGhhbmRsZVJlbW92ZSA9IGZ1bmN0aW9uIGhhbmRsZVJlbW92ZSgpIHtcbiAgICBpZiAoaXNGdW5jdGlvbihyZW1vdmVCdG4gPT09IG51bGwgfHwgcmVtb3ZlQnRuID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZW1vdmVCdG4ub25DbGljaykpIHtcbiAgICAgIHJlbW92ZUJ0bi5vbkNsaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYWRkb25zLnNldFNjaGVtYUJ5UGF0aChhZGRvbnMuc2NoZW1hUGF0aCwge1xuICAgICAgICAgIGhpZGRlbjogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhZGRvbnMuc2V0U2NoZW1hQnlQYXRoKGFkZG9ucy5zY2hlbWFQYXRoLCB7XG4gICAgICBoaWRkZW46IHRydWVcbiAgICB9KTtcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGaWVsZCwgT2JqZWN0LmFzc2lnbih7fSwgb3RoZXJQcm9wcywgZmllbGRQcm9wcywge1xuICAgIHN0eWxlOiBfc3R5bGVcbiAgfSkpLCByZW1vdmVCdG4gJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0J1dHRvbiwgT2JqZWN0LmFzc2lnbih7XG4gICAgdHlwZTogJ2xpbmsnLFxuICAgIGRhbmdlcjogdHJ1ZVxuICB9LCByZW1vdmVCdG4sIHtcbiAgICBvbkNsaWNrOiBoYW5kbGVSZW1vdmVcbiAgfSksIChyZW1vdmVCdG4gPT09IG51bGwgfHwgcmVtb3ZlQnRuID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZW1vdmVCdG4udGV4dCkgfHwgdCgnZGVsZXRlJykpKTtcbn07IiwiZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH0sIF90eXBlb2Yob2JqKTsgfVxuaW1wb3J0IFwiYW50ZC9lcy9mb3JtL3N0eWxlXCI7XG5pbXBvcnQgX0Zvcm0gZnJvbSBcImFudGQvZXMvZm9ybVwiO1xuaW1wb3J0IFwiYW50ZC9lcy9yb3cvc3R5bGVcIjtcbmltcG9ydCBfUm93IGZyb20gXCJhbnRkL2VzL3Jvd1wiO1xuaW1wb3J0IFwiYW50ZC9lcy9jb2wvc3R5bGVcIjtcbmltcG9ydCBfQ29sIGZyb20gXCJhbnRkL2VzL2NvbFwiO1xuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KGFyZykgeyB2YXIga2V5ID0gX3RvUHJpbWl0aXZlKGFyZywgXCJzdHJpbmdcIik7IHJldHVybiBfdHlwZW9mKGtleSkgPT09IFwic3ltYm9sXCIgPyBrZXkgOiBTdHJpbmcoa2V5KTsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKGlucHV0LCBoaW50KSB7IGlmIChfdHlwZW9mKGlucHV0KSAhPT0gXCJvYmplY3RcIiB8fCBpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIGlucHV0OyB2YXIgcHJpbSA9IGlucHV0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmIChwcmltICE9PSB1bmRlZmluZWQpIHsgdmFyIHJlcyA9IHByaW0uY2FsbChpbnB1dCwgaGludCB8fCBcImRlZmF1bHRcIik7IGlmIChfdHlwZW9mKHJlcykgIT09IFwib2JqZWN0XCIpIHJldHVybiByZXM7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKGhpbnQgPT09IFwic3RyaW5nXCIgPyBTdHJpbmcgOiBOdW1iZXIpKGlucHV0KTsgfVxuaW1wb3J0IHsgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUmVhY3QsIHsgY3JlYXRlQ29udGV4dCwgdXNlQ29udGV4dCwgdXNlUmVmLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VTdG9yZSB9IGZyb20gJ3p1c3RhbmQnO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyBpc0NoZWNrQm94VHlwZSB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IGdldFdpZGdldE5hbWUsIGdldFdpZGdldCB9IGZyb20gJy4uLy4uL21vZGVscy9tYXBwaW5nJztcbmltcG9ydCB7IGdldEZvcm1JdGVtTGF5b3V0IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2xheW91dCc7XG5pbXBvcnQgZ2V0UnVsZUxpc3QgZnJvbSAnLi4vLi4vbW9kZWxzL3ZhbGlkYXRlcyc7XG52YXIgVXBwZXJDb250ZXh0ID0gLyojX19QVVJFX18qL2NyZWF0ZUNvbnRleHQoZnVuY3Rpb24gKCkge30pO1xudmFyIHZhbHVlUHJvcE5hbWVNYXAgPSB7XG4gIGNoZWNrYm94OiAnY2hlY2tlZCcsXG4gIHN3aXRjaDogJ2NoZWNrZWQnXG59O1xuaW1wb3J0IHsgRmllbGRXcmFwcGVyLCBGaWVsZFdyYXBwZXJTdGF0dXMgfSBmcm9tICcuL2ZpZWxkJztcbmltcG9ydCB7IGdldFBhcmFtVmFsdWUsIGdldEZpZWxkUHJvcHMsIGdldFBhdGgsIGdldExhYmVsLCBnZXRDb2xTcGFuLCBnZXRFeHRyYVZpZXcsIGdldFRvb2x0aXAgfSBmcm9tICcuL21vZHVsZSc7XG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gKHByb3BzKSB7XG4gIHZhciBfYSwgX2I7XG4gIHZhciBjb25maWdDdHggPSBwcm9wcy5jb25maWdDdHgsXG4gICAgc3RvcmUgPSBwcm9wcy5zdG9yZSxcbiAgICBzY2hlbWEgPSBwcm9wcy5zY2hlbWEsXG4gICAgcGF0aCA9IHByb3BzLnBhdGgsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBkZXBlbmRWYWx1ZXMgPSBwcm9wcy5kZXBlbmRWYWx1ZXMsXG4gICAgcm9vdFBhdGggPSBwcm9wcy5yb290UGF0aDtcbiAgdmFyIGZpZWxkUmVmID0gdXNlUmVmKCk7XG4gIHZhciBmb3JtQ3R4ID0gdXNlU3RvcmUoc3RvcmUsIGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgIHJldHVybiBzdGF0ZS5jb250ZXh0O1xuICB9KTtcbiAgdmFyIHVwcGVyQ3R4ID0gdXNlQ29udGV4dChVcHBlckNvbnRleHQpO1xuICB2YXIgZm9ybSA9IGNvbmZpZ0N0eC5mb3JtLFxuICAgIHdpZGdldHMgPSBjb25maWdDdHgud2lkZ2V0cyxcbiAgICBtZXRob2RzID0gY29uZmlnQ3R4Lm1ldGhvZHMsXG4gICAgZ2xvYmFsUHJvcHMgPSBjb25maWdDdHguZ2xvYmFsUHJvcHM7XG4gIHZhciByZXNlcnZlTGFiZWwgPSBzY2hlbWEucmVzZXJ2ZUxhYmVsLFxuICAgIGhpZGRlbiA9IHNjaGVtYS5oaWRkZW4sXG4gICAgcHJvcGVydGllcyA9IHNjaGVtYS5wcm9wZXJ0aWVzLFxuICAgIGRlcGVuZGVuY2llcyA9IHNjaGVtYS5kZXBlbmRlbmNpZXMsXG4gICAgX2lubGluZU1vZGUgPSBzY2hlbWEuaW5saW5lTW9kZSxcbiAgICByZW1vdmUgPSBzY2hlbWEucmVtb3ZlLFxuICAgIHJlbW92ZVRleHQgPSBzY2hlbWEucmVtb3ZlVGV4dCxcbiAgICBfc2NoZW1hJHZpc2libGUgPSBzY2hlbWEudmlzaWJsZSxcbiAgICB2aXNpYmxlID0gX3NjaGVtYSR2aXNpYmxlID09PSB2b2lkIDAgPyB0cnVlIDogX3NjaGVtYSR2aXNpYmxlLFxuICAgIG90aGVyU2NoZW1hID0gX19yZXN0KHNjaGVtYSwgW1wicmVzZXJ2ZUxhYmVsXCIsIFwiaGlkZGVuXCIsIFwicHJvcGVydGllc1wiLCBcImRlcGVuZGVuY2llc1wiLCBcImlubGluZU1vZGVcIiwgXCJyZW1vdmVcIiwgXCJyZW1vdmVUZXh0XCIsIFwidmlzaWJsZVwiXSk7XG4gIHZhciBnZXRWYWx1ZUZyb21LZXkgPSBnZXRQYXJhbVZhbHVlKGZvcm1DdHgsIHVwcGVyQ3R4LCBzY2hlbWEpO1xuICB2YXIgd2lkZ2V0TmFtZSA9IGdldFdpZGdldE5hbWUoc2NoZW1hKTtcbiAgdmFyIFdpZGdldCA9IGdldFdpZGdldCh3aWRnZXROYW1lLCB3aWRnZXRzKTtcbiAgdmFyIGZpZWxkUHJvcHMgPSBnZXRGaWVsZFByb3BzKHdpZGdldE5hbWUsIHNjaGVtYSwge1xuICAgIHdpZGdldHM6IHdpZGdldHMsXG4gICAgbWV0aG9kczogbWV0aG9kcyxcbiAgICBmb3JtOiBmb3JtLFxuICAgIGRlcGVuZFZhbHVlczogZGVwZW5kVmFsdWVzLFxuICAgIGdsb2JhbFByb3BzOiBnbG9iYWxQcm9wcyxcbiAgICBwYXRoOiBnZXRQYXRoKHBhdGgpLFxuICAgIHJvb3RQYXRoOiByb290UGF0aCxcbiAgICBmaWVsZFJlZjogZmllbGRSZWZcbiAgfSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgZm9ybS5zZXRGaWVsZFJlZihmaWVsZFByb3BzLmFkZG9ucy5kYXRhUGF0aCwgZmllbGRSZWYpO1xuICB9LCBbXSk7XG4gIGlmIChzY2hlbWEgPT09IG51bGwgfHwgc2NoZW1hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzY2hlbWEuaGlkZGVuKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLy8gQ29tcG9uZW50IG5vdCBmb3VuZFxuICBpZiAoIXdpZGdldE5hbWUpIHtcbiAgICB2YXIgRXJyb3JTY2hlbWEgPSB3aWRnZXRzWydlcnJvclNjaGVtYSddIHx8IHdpZGdldHNbJ0Vycm9yU2NoZW1hJ107XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVycm9yU2NoZW1hLCB7XG4gICAgICBzY2hlbWE6IHNjaGVtYVxuICAgIH0pO1xuICB9XG4gIGlmIChzY2hlbWEudHlwZSA9PT0gJ3ZvaWQnKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Db2wsIHtcbiAgICAgIHNwYW46IDI0XG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoV2lkZ2V0LCBPYmplY3QuYXNzaWduKHt9LCBmaWVsZFByb3BzKSkpO1xuICB9XG4gIHZhciBkaXNwbGF5VHlwZSA9IGdldFZhbHVlRnJvbUtleSgnZGlzcGxheVR5cGUnKTtcbiAgdmFyIGlubGluZVNlbGYgPSBfaW5saW5lTW9kZSB8fCAodXBwZXJDdHggPT09IG51bGwgfHwgdXBwZXJDdHggPT09IHZvaWQgMCA/IHZvaWQgMCA6IHVwcGVyQ3R4LmRpc3BsYXlUeXBlKSA9PT0gJ2lubGluZSc7XG4gIC8vIGluZXhpc3RlbmNlIGNvbnRhaW5lcnNcbiAgaWYgKCF1cHBlckN0eC5leGlzdCkge1xuICAgIGlubGluZVNlbGYgPSBfaW5saW5lTW9kZSB8fCAoZm9ybUN0eCA9PT0gbnVsbCB8fCBmb3JtQ3R4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmb3JtQ3R4LmRpc3BsYXlUeXBlKSA9PT0gJ2lubGluZSc7XG4gIH1cbiAgdmFyIGlubGluZUNoaWxkID0gZGlzcGxheVR5cGUgPT09ICdpbmxpbmUnO1xuICB2YXIgbGFiZWxXaWR0aCA9IGdldFZhbHVlRnJvbUtleSgnbGFiZWxXaWR0aCcpO1xuICAvLyBSZW5kZXIgQ29udGFpbmVyIENvbXBvbmVudHNcbiAgaWYgKGNoaWxkcmVuKSB7XG4gICAgdmFyIGNoaWxkRWxlbWVudCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogJ2ZyLWlubGluZS1jb250YWluZXInXG4gICAgfSwgY2hpbGRyZW4pO1xuICAgIGlmICghaW5saW5lQ2hpbGQpIHtcbiAgICAgIHZhciBndXR0ZXIgPSB7XG4gICAgICAgIHJvdzogMTYsXG4gICAgICAgIGNvbHVtbjogMjRcbiAgICAgIH1bZGlzcGxheVR5cGVdO1xuICAgICAgY2hpbGRFbGVtZW50ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1Jvdywge1xuICAgICAgICBndXR0ZXI6IGd1dHRlclxuICAgICAgfSwgY2hpbGRyZW4pO1xuICAgIH1cbiAgICBmaWVsZFByb3BzLmNoaWxkcmVuID0gY2hpbGRFbGVtZW50O1xuICAgIHZhciBjb250ZW50ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoV2lkZ2V0LCBPYmplY3QuYXNzaWduKHtcbiAgICAgIGxhYmVsV2lkdGg6IGxhYmVsV2lkdGgsXG4gICAgICBkaXNwbGF5VHlwZTogc2NoZW1hLmRpc3BsYXlUeXBlXG4gICAgfSwgZmllbGRQcm9wcywgb3RoZXJTY2hlbWEpKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVXBwZXJDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICB2YWx1ZToge1xuICAgICAgICBjb2x1bW46IHNjaGVtYS5jb2x1bW4sXG4gICAgICAgIGxhYmVsQ29sOiBzY2hlbWEubGFiZWxDb2wsXG4gICAgICAgIGZpZWxkQ29sOiBzY2hlbWEuZmllbGRDb2wsXG4gICAgICAgIGRpc3BsYXlUeXBlOiBzY2hlbWEuZGlzcGxheVR5cGUsXG4gICAgICAgIGxhYmVsV2lkdGg6IHNjaGVtYS5sYWJlbFdpZHRoLFxuICAgICAgICBub1N0eWxlOiBzY2hlbWEubm9TdHlsZSxcbiAgICAgICAgZXhpc3Q6IHRydWVcbiAgICAgIH1cbiAgICB9LCBpbmxpbmVTZWxmID8gY29udGVudCA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Db2wsIHtcbiAgICAgIHNwYW46IDI0LFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc25hbWVzKCdmci1vYmotY29sJywgX2RlZmluZVByb3BlcnR5KHt9LCBzY2hlbWEuY2xhc3NOYW1lLCAhIXNjaGVtYS5jbGFzc05hbWUpKVxuICAgIH0sIGNvbnRlbnQpKTtcbiAgfVxuICAvLyBSZW5kZXIgZmllbGQgY29tcG9uZW50c1xuICB2YXIgbGFiZWwgPSBnZXRMYWJlbChzY2hlbWEsIGRpc3BsYXlUeXBlLCB3aWRnZXRzKTtcbiAgdmFyIG5vU3R5bGUgPSBnZXRWYWx1ZUZyb21LZXkoJ25vU3R5bGUnKTtcbiAgdmFyIHNwYW4gPSBnZXRDb2xTcGFuKGZvcm1DdHgsIHVwcGVyQ3R4LCBzY2hlbWEpO1xuICB2YXIgZXh0cmEgPSBnZXRFeHRyYVZpZXcoJ2V4dHJhJywgc2NoZW1hLCB3aWRnZXRzKTtcbiAgdmFyIGhlbHAgPSBnZXRFeHRyYVZpZXcoJ2hlbHAnLCBzY2hlbWEsIHdpZGdldHMpO1xuICB2YXIgdG9vbHRpcCA9IGdldFRvb2x0aXAoc2NoZW1hLCBkaXNwbGF5VHlwZSk7XG4gIHZhciBydWxlTGlzdCA9IGdldFJ1bGVMaXN0KHNjaGVtYSwgZm9ybSwgbWV0aG9kcywgZmllbGRSZWYpO1xuICB2YXIgcmVhZE9ubHkgPSBnZXRWYWx1ZUZyb21LZXkoJ3JlYWRPbmx5Jyk7XG4gIHZhciBkaXNhYmxlZCA9IGdldFZhbHVlRnJvbUtleSgnZGlzYWJsZWQnKTtcbiAgdmFyIHZhbGlkYXRlVHJpZ2dlciA9IGdldFZhbHVlRnJvbUtleSgndmFsaWRhdGVUcmlnZ2VyJyk7XG4gIHZhciBfbGFiZWxDb2wgPSBnZXRWYWx1ZUZyb21LZXkoJ2xhYmVsQ29sJyk7XG4gIHZhciBfZmllbGRDb2wgPSBnZXRWYWx1ZUZyb21LZXkoJ2ZpZWxkQ29sJyk7XG4gIHZhciBtYXhXaWR0aCA9IGdldFZhbHVlRnJvbUtleSgnbWF4V2lkdGgnKTtcbiAgdmFyIF9nZXRGb3JtSXRlbUxheW91dCA9IGdldEZvcm1JdGVtTGF5b3V0KE1hdGguZmxvb3IoMjQgLyBzcGFuICogMSksIHNjaGVtYSwge1xuICAgICAgZGlzcGxheVR5cGU6IGRpc3BsYXlUeXBlLFxuICAgICAgbGFiZWxXaWR0aDogbGFiZWxXaWR0aCxcbiAgICAgIF9sYWJlbENvbDogX2xhYmVsQ29sLFxuICAgICAgX2ZpZWxkQ29sOiBfZmllbGRDb2xcbiAgICB9KSxcbiAgICBsYWJlbENvbCA9IF9nZXRGb3JtSXRlbUxheW91dC5sYWJlbENvbCxcbiAgICBmaWVsZENvbCA9IF9nZXRGb3JtSXRlbUxheW91dC5maWVsZENvbDtcbiAgdmFyIHZhbHVlUHJvcE5hbWUgPSBzY2hlbWEudmFsdWVQcm9wTmFtZSB8fCB2YWx1ZVByb3BOYW1lTWFwW3dpZGdldE5hbWVdIHx8IHVuZGVmaW5lZDtcbiAgaWYgKHJlYWRPbmx5KSB7XG4gICAgZmllbGRQcm9wcy5yZWFkT25seSA9IHJlYWRPbmx5O1xuICB9XG4gIGlmIChkaXNhYmxlZCkge1xuICAgIGZpZWxkUHJvcHMuZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgfVxuICBpZiAocmVzZXJ2ZUxhYmVsICYmICFsYWJlbCAmJiBkaXNwbGF5VHlwZSAhPT0gJ2NvbHVtbicpIHtcbiAgICBsYWJlbCA9ICdmci1oaWRlLWxhYmVsJztcbiAgfVxuICBpZiAocmVhZE9ubHkpIHtcbiAgICBXaWRnZXQgPSB3aWRnZXRzW3NjaGVtYS5yZWFkT25seVdpZGdldF0gfHwgd2lkZ2V0c1snSHRtbCddO1xuICB9XG4gIC8vIGNoZWNrYm94IOW4g+WxgOacieeCueeJueauilxuICBpZiAoaXNDaGVja0JveFR5cGUoc2NoZW1hLCByZWFkT25seSkpIHtcbiAgICBmaWVsZFByb3BzLnRpdGxlID0gbGFiZWw7XG4gICAgbGFiZWwgPSBudWxsO1xuICAgIGlmIChkaXNwbGF5VHlwZSA9PT0gJ3JvdycpIHtcbiAgICAgIGxhYmVsID0gJ2ZyLWhpZGUtbGFiZWwnO1xuICAgIH1cbiAgfVxuICB2YXIgaW5pdGlhbFZhbHVlID0gKF9hID0gc2NoZW1hLmRlZmF1bHQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHNjaGVtYS5kZWZhdWx0VmFsdWU7XG4gIHZhciBjbGFzc1Jlc3QgPSBfZGVmaW5lUHJvcGVydHkoe1xuICAgICdmci1oaWRlLWxhYmVsJzogbGFiZWwgPT09ICdmci1oaWRlLWxhYmVsJyxcbiAgICAnZnItaW5saW5lLWZpZWxkJzogaW5saW5lU2VsZixcbiAgICAnZnItZmllbGQtdmlzaWJpbGl0eSc6ICF2aXNpYmxlXG4gIH0sIHNjaGVtYS5jbGFzc05hbWUsICEhc2NoZW1hLmNsYXNzTmFtZSk7XG4gIHZhciBmb3JtSXRlbSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Gb3JtLkl0ZW0sIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoJ2ZyLWZpZWxkJywgY2xhc3NSZXN0KSxcbiAgICBsYWJlbDogbGFiZWwsXG4gICAgbmFtZTogcGF0aCxcbiAgICB2YWx1ZVByb3BOYW1lOiB2YWx1ZVByb3BOYW1lLFxuICAgIHJ1bGVzOiByZWFkT25seSA/IFtdIDogcnVsZUxpc3QsXG4gICAgaGlkZGVuOiBoaWRkZW4sXG4gICAgdG9vbHRpcDogdG9vbHRpcCxcbiAgICBleHRyYTogZXh0cmEsXG4gICAgaGVscDogaGVscCxcbiAgICBpbml0aWFsVmFsdWU6IGluaXRpYWxWYWx1ZSxcbiAgICBsYWJlbENvbDogbGFiZWxDb2wsXG4gICAgd3JhcHBlckNvbDogZmllbGRDb2wsXG4gICAgbm9TdHlsZTogbm9TdHlsZSxcbiAgICBkZXBlbmRlbmNpZXM6IGRlcGVuZGVuY2llcyxcbiAgICB2YWxpZGF0ZVRyaWdnZXI6ICh2YWxpZGF0ZVRyaWdnZXIgIT09IG51bGwgJiYgdmFsaWRhdGVUcmlnZ2VyICE9PSB2b2lkIDAgPyB2YWxpZGF0ZVRyaWdnZXIgOiAoX2IgPSBmaWVsZFJlZiA9PT0gbnVsbCB8fCBmaWVsZFJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogZmllbGRSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnZhbGlkYXRvcikgPyAnb25TdWJtaXQnIDogJ29uQ2hhbmdlJ1xuICB9LCBmaWVsZFByb3BzLm9uU3RhdHVzQ2hhbmdlID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRmllbGRXcmFwcGVyU3RhdHVzLCB7XG4gICAgRmllbGQ6IFdpZGdldCxcbiAgICBmaWVsZFByb3BzOiBmaWVsZFByb3BzLFxuICAgIG1heFdpZHRoOiBtYXhXaWR0aCxcbiAgICBpbml0aWFsVmFsdWU6IGluaXRpYWxWYWx1ZVxuICB9KSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZpZWxkV3JhcHBlciwge1xuICAgIEZpZWxkOiBXaWRnZXQsXG4gICAgZmllbGRQcm9wczogZmllbGRQcm9wcyxcbiAgICBtYXhXaWR0aDogbWF4V2lkdGgsXG4gICAgaW5pdGlhbFZhbHVlOiBpbml0aWFsVmFsdWVcbiAgfSkpO1xuICBpZiAoaW5saW5lU2VsZikge1xuICAgIGlmIChub1N0eWxlKSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoJ2ZyLWlubGluZS1maWVsZCcsIF9kZWZpbmVQcm9wZXJ0eSh7XG4gICAgICAgICAgJ2ZyLWZpZWxkLXZpc2liaWxpdHknOiAhdmlzaWJsZVxuICAgICAgICB9LCBzY2hlbWEuY2xhc3NOYW1lLCAhIXNjaGVtYS5jbGFzc05hbWUpKVxuICAgICAgfSwgZm9ybUl0ZW0pO1xuICAgIH1cbiAgICByZXR1cm4gZm9ybUl0ZW07XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Db2wsIHtcbiAgICBzcGFuOiBzcGFuLFxuICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcyhudWxsLCB7XG4gICAgICAnZnItZmllbGQtdmlzaWJpbGl0eSc6ICF2aXNpYmxlXG4gICAgfSlcbiAgfSwgZm9ybUl0ZW0pO1xufSk7IiwiaW1wb3J0IFwiYW50ZC9lcy9mb3JtL3N0eWxlXCI7XG5pbXBvcnQgX0Zvcm0gZnJvbSBcImFudGQvZXMvZm9ybVwiO1xuaW1wb3J0IHsgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUmVhY3QsIHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdldERlcGVuZFZhbHVlcyB9IGZyb20gJy4vbW9kdWxlJztcbmltcG9ydCB7IEZSQ29udGV4dCwgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4uLy4uL21vZGVscy9jb250ZXh0JztcbmltcG9ydCB7IGlzSGFzRXhwcmVzc2lvbiwgcGFyc2VBbGxFeHByZXNzaW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2V4cHJlc3Npb24nO1xuaW1wb3J0IGZpZWxkU2hvdWxkVXBkYXRlIGZyb20gJy4uLy4uL21vZGVscy9maWVsZFNob3VsZFVwZGF0ZSc7XG5pbXBvcnQgTWFpbiBmcm9tICcuL21haW4nO1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIChwcm9wcykge1xuICB2YXIgX2EsIF9iO1xuICB2YXIgc2NoZW1hID0gcHJvcHMuc2NoZW1hLFxuICAgIHJvb3RQYXRoID0gcHJvcHMucm9vdFBhdGgsXG4gICAgb3RoZXJQcm9wcyA9IF9fcmVzdChwcm9wcywgW1wic2NoZW1hXCIsIFwicm9vdFBhdGhcIl0pO1xuICB2YXIgc3RvcmUgPSB1c2VDb250ZXh0KEZSQ29udGV4dCk7XG4gIHZhciBfc3RvcmUkZ2V0U3RhdGUgPSBzdG9yZS5nZXRTdGF0ZSgpLFxuICAgIGZvcm1TY2hlbWEgPSBfc3RvcmUkZ2V0U3RhdGUuc2NoZW1hO1xuICB2YXIgY29uZmlnQ3R4ID0gdXNlQ29udGV4dChDb25maWdDb250ZXh0KTtcbiAgdmFyIG11c3RhY2hlRGlzYWJsZWQgPSAoX2EgPSBjb25maWdDdHggPT09IG51bGwgfHwgY29uZmlnQ3R4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWdDdHguZ2xvYmFsQ29uZmlnKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubXVzdGFjaGVEaXNhYmxlZDtcbiAgdmFyIHNob3VsZFVwZGF0ZU9wZW4gPSAoX2IgPSBjb25maWdDdHggPT09IG51bGwgfHwgY29uZmlnQ3R4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWdDdHguZ2xvYmFsQ29uZmlnKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Iuc2hvdWxkVXBkYXRlT3BlbjtcbiAgdmFyIGRlcGVuZGVuY2llcyA9IHNjaGVtYSA9PT0gbnVsbCB8fCBzY2hlbWEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNjaGVtYS5kZXBlbmRlbmNpZXM7XG4gIC8vIE5vIGZ1bmN0aW9uIGV4cHJlc3Npb25zIGV4aXN0XG4gIGlmICghaXNIYXNFeHByZXNzaW9uKHNjaGVtYSkgJiYgIW11c3RhY2hlRGlzYWJsZWQgJiYgKCFkZXBlbmRlbmNpZXMgfHwgIShkZXBlbmRlbmNpZXMgPT09IG51bGwgfHwgZGVwZW5kZW5jaWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZXBlbmRlbmNpZXMubGVuZ3RoKSkpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTWFpbiwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgIHN0b3JlOiBzdG9yZSxcbiAgICAgIGNvbmZpZ0N0eDogY29uZmlnQ3R4XG4gICAgfSkpO1xuICB9XG4gIHZhciBzY2hlbWFTdHIgPSBKU09OLnN0cmluZ2lmeShzY2hlbWEpO1xuICAvLyBOZWVkIHRvIGxpc3RlbiB0byBmb3JtIHZhbHVlcyBmb3IgZHluYW1pYyByZW5kZXJpbmdcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Gb3JtLkl0ZW0sIHtcbiAgICBub1N0eWxlOiB0cnVlLFxuICAgIHNob3VsZFVwZGF0ZTogZmllbGRTaG91bGRVcGRhdGUoc2NoZW1hU3RyLCByb290UGF0aCwgZGVwZW5kZW5jaWVzLCBzaG91bGRVcGRhdGVPcGVuKVxuICB9LCBmdW5jdGlvbiAoZm9ybSkge1xuICAgIHZhciBmb3JtRGF0YSA9IGZvcm0uZ2V0RmllbGRzVmFsdWUodHJ1ZSk7XG4gICAgdmFyIGZvcm1EZXBlbmRlbmNpZXMgPSBbXTtcbiAgICB2YXIgZGVwZW5kVmFsdWVzID0gKGRlcGVuZGVuY2llcyB8fCBbXSkubWFwKGZ1bmN0aW9uIChkZXBQYXRoKSB7XG4gICAgICB2YXIgaXRlbSA9IFtdO1xuICAgICAgZm9ybURlcGVuZGVuY2llcy5wdXNoKGl0ZW0pO1xuICAgICAgcmV0dXJuIGdldERlcGVuZFZhbHVlcyhmb3JtRGF0YSwgZGVwUGF0aCwgcHJvcHMsIGl0ZW0pO1xuICAgIH0pO1xuICAgIHZhciBuZXdTY2hlbWEgPSBtdXN0YWNoZURpc2FibGVkID8gc2NoZW1hIDogcGFyc2VBbGxFeHByZXNzaW9uKHNjaGVtYSwgZm9ybURhdGEsIHJvb3RQYXRoLCBmb3JtU2NoZW1hKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTWFpbiwgT2JqZWN0LmFzc2lnbih7XG4gICAgICBzY2hlbWE6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgbmV3U2NoZW1hKSwge1xuICAgICAgICBkZXBlbmRlbmNpZXM6IGZvcm1EZXBlbmRlbmNpZXNcbiAgICAgIH0pLFxuICAgICAgcm9vdFBhdGg6IHJvb3RQYXRoXG4gICAgfSwgb3RoZXJQcm9wcywge1xuICAgICAgZGVwZW5kVmFsdWVzOiBkZXBlbmRWYWx1ZXMsXG4gICAgICBzdG9yZTogc3RvcmUsXG4gICAgICBjb25maWdDdHg6IGNvbmZpZ0N0eFxuICAgIH0pKTtcbiAgfSk7XG59KTsiLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5leHBvcnQgdmFyIGdldFBhcmFtVmFsdWUgPSBmdW5jdGlvbiBnZXRQYXJhbVZhbHVlKGZvcm1DdHgsIHVwcGVyQ3R4LCBzY2hlbWEpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZUtleSkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIChfYiA9IChfYSA9IHNjaGVtYVt2YWx1ZUtleV0pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHVwcGVyQ3R4W3ZhbHVlS2V5XSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogZm9ybUN0eFt2YWx1ZUtleV07XG4gIH07XG59O1xuZXhwb3J0IHZhciBnZXRGb3JtTGlzdExheW91dCA9IGZ1bmN0aW9uIGdldEZvcm1MaXN0TGF5b3V0KGdldFZhbHVlRnJvbUtleSwgZGlzcGxheVR5cGUpIHtcbiAgdmFyIF9sYWJlbENvbCA9IGdldFZhbHVlRnJvbUtleSgnbGFiZWxDb2wnKTtcbiAgdmFyIF9maWVsZENvbCA9IGdldFZhbHVlRnJvbUtleSgnZmllbGRDb2wnKTtcbiAgdmFyIGxhYmVsV2lkdGggPSBnZXRWYWx1ZUZyb21LZXkoJ2xhYmVsV2lkdGgnKTtcbiAgdmFyIGxhYmVsQ29sID0ge1xuICAgIHNwYW46IDVcbiAgfTtcbiAgdmFyIGZpZWxkQ29sID0ge1xuICAgIGZsZXg6IDFcbiAgfTtcbiAgaWYgKGxhYmVsV2lkdGggJiYgZGlzcGxheVR5cGUgIT09ICdjb2x1bW4nKSB7XG4gICAgbGFiZWxDb2wgPSB7XG4gICAgICBmbGV4OiBsYWJlbFdpZHRoICsgJ3B4J1xuICAgIH07XG4gIH1cbiAgaWYgKF9sYWJlbENvbCkge1xuICAgIGxhYmVsQ29sID0gX2xhYmVsQ29sO1xuICB9XG4gIGlmIChfZmllbGRDb2wpIHtcbiAgICBmaWVsZENvbCA9IF9maWVsZENvbDtcbiAgfVxuICBpZiAodHlwZW9mIF9sYWJlbENvbCA9PT0gJ251bWJlcicpIHtcbiAgICBsYWJlbENvbCA9IHtcbiAgICAgIHNwYW46IF9sYWJlbENvbFxuICAgIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBfZmllbGRDb2wgPT09ICdudW1iZXInKSB7XG4gICAgZmllbGRDb2wgPSB7XG4gICAgICBzcGFuOiBfZmllbGRDb2xcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgbGFiZWxDb2w6IGxhYmVsQ29sLFxuICAgIGZpZWxkQ29sOiBmaWVsZENvbFxuICB9O1xufTtcbmV4cG9ydCB2YXIgZ2V0TGFiZWwgPSBmdW5jdGlvbiBnZXRMYWJlbChzY2hlbWEsIGRpc3BsYXlUeXBlLCB3aWRnZXRzKSB7XG4gIHZhciB0aXRsZSA9IHNjaGVtYS50aXRsZSxcbiAgICBkZXNjcmlwdGlvbiA9IHNjaGVtYS5kZXNjcmlwdGlvbixcbiAgICBkZXNjV2lkZ2V0ID0gc2NoZW1hLmRlc2NXaWRnZXQsXG4gICAgbGFiZWxXaWRnZXQgPSBzY2hlbWEubGFiZWxXaWRnZXQ7XG4gIHZhciBMYWJlbE5vZGUgPSB3aWRnZXRzW2xhYmVsV2lkZ2V0XTtcbiAgaWYgKExhYmVsTm9kZSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMYWJlbE5vZGUsIHtcbiAgICAgIHNjaGVtYTogc2NoZW1hXG4gICAgfSk7XG4gIH1cbiAgaWYgKCFkZXNjcmlwdGlvbiAmJiAhZGVzY1dpZGdldCkge1xuICAgIHJldHVybiB0aXRsZTtcbiAgfVxuICB2YXIgUmVuZGVyRGVzYyA9IGZ1bmN0aW9uIFJlbmRlckRlc2MoKSB7XG4gICAgdmFyIFdpZGdldCA9IHdpZGdldHNbZGVzY1dpZGdldF07XG4gICAgaWYgKFdpZGdldCkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFdpZGdldCwge1xuICAgICAgICBzY2hlbWE6IHNjaGVtYVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogJ2ZyLWRlc2MnXG4gICAgICB9LCBcIihcIiwgZGVzY3JpcHRpb24sIFwiKVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG4gIGlmIChkaXNwbGF5VHlwZSA9PT0gJ2lubGluZScpIHtcbiAgICByZXR1cm4gdGl0bGU7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCB0aXRsZSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVuZGVyRGVzYywgbnVsbCkpO1xufTtcbmV4cG9ydCB2YXIgZ2V0VG9vbHRpcCA9IGZ1bmN0aW9uIGdldFRvb2x0aXAoc2NoZW1hLCBkaXNwbGF5VHlwZSkge1xuICB2YXIgZGVzY1R5cGUgPSBzY2hlbWEuZGVzY1R5cGUsXG4gICAgZGVzY3JpcHRpb24gPSBzY2hlbWEuZGVzY3JpcHRpb24sXG4gICAgdG9vbHRpcCA9IHNjaGVtYS50b29sdGlwO1xuICBpZiAodG9vbHRpcCkge1xuICAgIGlmICh0eXBlb2YgdG9vbHRpcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRpdGxlOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XG4gICAgICAgICAgICBfX2h0bWw6IHRvb2x0aXBcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0b29sdGlwKSwge1xuICAgICAgdGl0bGU6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XG4gICAgICAgICAgX19odG1sOiB0b29sdGlwLnRpdGxlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSk7XG4gIH1cbiAgaWYgKGRlc2NUeXBlID09PSAnd2lkZ2V0JyB8fCAhZGVzY3JpcHRpb24pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoZGlzcGxheVR5cGUgPT09ICdjb2x1bW4nICYmIGRlc2NUeXBlID09PSAnaWNvbicpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGl0bGU6IGRlc2NyaXB0aW9uXG4gICAgfTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07IiwiZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH0sIF90eXBlb2Yob2JqKTsgfVxuaW1wb3J0IFwiYW50ZC9lcy9idXR0b24vc3R5bGVcIjtcbmltcG9ydCBfQnV0dG9uIGZyb20gXCJhbnRkL2VzL2J1dHRvblwiO1xuaW1wb3J0IFwiYW50ZC9lcy9mb3JtL3N0eWxlXCI7XG5pbXBvcnQgX0Zvcm0gZnJvbSBcImFudGQvZXMvZm9ybVwiO1xuaW1wb3J0IFwiYW50ZC9lcy9tZXNzYWdlL3N0eWxlXCI7XG5pbXBvcnQgX21lc3NhZ2UgZnJvbSBcImFudGQvZXMvbWVzc2FnZVwiO1xuaW1wb3J0IFwiYW50ZC9lcy9jb25maWctcHJvdmlkZXIvc3R5bGVcIjtcbmltcG9ydCBfQ29uZmlnUHJvdmlkZXIgZnJvbSBcImFudGQvZXMvY29uZmlnLXByb3ZpZGVyXCI7XG5mdW5jdGlvbiBfcmVnZW5lcmF0b3JSdW50aW1lKCkgeyBcInVzZSBzdHJpY3RcIjsgLyohIHJlZ2VuZXJhdG9yLXJ1bnRpbWUgLS0gQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuIC0tIGxpY2Vuc2UgKE1JVCk6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9ibG9iL21haW4vTElDRU5TRSAqLyBfcmVnZW5lcmF0b3JSdW50aW1lID0gZnVuY3Rpb24gX3JlZ2VuZXJhdG9yUnVudGltZSgpIHsgcmV0dXJuIGV4cG9ydHM7IH07IHZhciBleHBvcnRzID0ge30sIE9wID0gT2JqZWN0LnByb3RvdHlwZSwgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHksIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5IHx8IGZ1bmN0aW9uIChvYmosIGtleSwgZGVzYykgeyBvYmpba2V5XSA9IGRlc2MudmFsdWU7IH0sICRTeW1ib2wgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCA/IFN5bWJvbCA6IHt9LCBpdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuaXRlcmF0b3IgfHwgXCJAQGl0ZXJhdG9yXCIsIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIiwgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiOyBmdW5jdGlvbiBkZWZpbmUob2JqLCBrZXksIHZhbHVlKSB7IHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiAhMCwgY29uZmlndXJhYmxlOiAhMCwgd3JpdGFibGU6ICEwIH0pLCBvYmpba2V5XTsgfSB0cnkgeyBkZWZpbmUoe30sIFwiXCIpOyB9IGNhdGNoIChlcnIpIHsgZGVmaW5lID0gZnVuY3Rpb24gZGVmaW5lKG9iaiwga2V5LCB2YWx1ZSkgeyByZXR1cm4gb2JqW2tleV0gPSB2YWx1ZTsgfTsgfSBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7IHZhciBwcm90b0dlbmVyYXRvciA9IG91dGVyRm4gJiYgb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBvdXRlckZuIDogR2VuZXJhdG9yLCBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSksIGNvbnRleHQgPSBuZXcgQ29udGV4dCh0cnlMb2NzTGlzdCB8fCBbXSk7IHJldHVybiBkZWZpbmVQcm9wZXJ0eShnZW5lcmF0b3IsIFwiX2ludm9rZVwiLCB7IHZhbHVlOiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIH0pLCBnZW5lcmF0b3I7IH0gZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7IHRyeSB7IHJldHVybiB7IHR5cGU6IFwibm9ybWFsXCIsIGFyZzogZm4uY2FsbChvYmosIGFyZykgfTsgfSBjYXRjaCAoZXJyKSB7IHJldHVybiB7IHR5cGU6IFwidGhyb3dcIiwgYXJnOiBlcnIgfTsgfSB9IGV4cG9ydHMud3JhcCA9IHdyYXA7IHZhciBDb250aW51ZVNlbnRpbmVsID0ge307IGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9IGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge30gZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fSB2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTsgZGVmaW5lKEl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSk7IHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiwgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90byAmJiBnZXRQcm90byhnZXRQcm90byh2YWx1ZXMoW10pKSk7IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJiBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpICYmIChJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlKTsgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID0gR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpOyBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7IFtcIm5leHRcIiwgXCJ0aHJvd1wiLCBcInJldHVyblwiXS5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHsgZGVmaW5lKHByb3RvdHlwZSwgbWV0aG9kLCBmdW5jdGlvbiAoYXJnKSB7IHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpOyB9KTsgfSk7IH0gZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7IGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7IHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpOyBpZiAoXCJ0aHJvd1wiICE9PSByZWNvcmQudHlwZSkgeyB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZywgdmFsdWUgPSByZXN1bHQudmFsdWU7IHJldHVybiB2YWx1ZSAmJiBcIm9iamVjdFwiID09IF90eXBlb2YodmFsdWUpICYmIGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIikgPyBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7IGludm9rZShcIm5leHRcIiwgdmFsdWUsIHJlc29sdmUsIHJlamVjdCk7IH0sIGZ1bmN0aW9uIChlcnIpIHsgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpOyB9KSA6IFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24gKHVud3JhcHBlZCkgeyByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQsIHJlc29sdmUocmVzdWx0KTsgfSwgZnVuY3Rpb24gKGVycm9yKSB7IHJldHVybiBpbnZva2UoXCJ0aHJvd1wiLCBlcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTsgfSk7IH0gcmVqZWN0KHJlY29yZC5hcmcpOyB9IHZhciBwcmV2aW91c1Byb21pc2U7IGRlZmluZVByb3BlcnR5KHRoaXMsIFwiX2ludm9rZVwiLCB7IHZhbHVlOiBmdW5jdGlvbiB2YWx1ZShtZXRob2QsIGFyZykgeyBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHsgcmV0dXJuIG5ldyBQcm9taXNlSW1wbChmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KTsgfSk7IH0gcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9IHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLCBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZykgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpOyB9IH0pOyB9IGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkgeyB2YXIgc3RhdGUgPSBcInN1c3BlbmRlZFN0YXJ0XCI7IHJldHVybiBmdW5jdGlvbiAobWV0aG9kLCBhcmcpIHsgaWYgKFwiZXhlY3V0aW5nXCIgPT09IHN0YXRlKSB0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nXCIpOyBpZiAoXCJjb21wbGV0ZWRcIiA9PT0gc3RhdGUpIHsgaWYgKFwidGhyb3dcIiA9PT0gbWV0aG9kKSB0aHJvdyBhcmc7IHJldHVybiBkb25lUmVzdWx0KCk7IH0gZm9yIChjb250ZXh0Lm1ldGhvZCA9IG1ldGhvZCwgY29udGV4dC5hcmcgPSBhcmc7OykgeyB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlOyBpZiAoZGVsZWdhdGUpIHsgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7IGlmIChkZWxlZ2F0ZVJlc3VsdCkgeyBpZiAoZGVsZWdhdGVSZXN1bHQgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlOyByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7IH0gfSBpZiAoXCJuZXh0XCIgPT09IGNvbnRleHQubWV0aG9kKSBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7ZWxzZSBpZiAoXCJ0aHJvd1wiID09PSBjb250ZXh0Lm1ldGhvZCkgeyBpZiAoXCJzdXNwZW5kZWRTdGFydFwiID09PSBzdGF0ZSkgdGhyb3cgc3RhdGUgPSBcImNvbXBsZXRlZFwiLCBjb250ZXh0LmFyZzsgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7IH0gZWxzZSBcInJldHVyblwiID09PSBjb250ZXh0Lm1ldGhvZCAmJiBjb250ZXh0LmFicnVwdChcInJldHVyblwiLCBjb250ZXh0LmFyZyk7IHN0YXRlID0gXCJleGVjdXRpbmdcIjsgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpOyBpZiAoXCJub3JtYWxcIiA9PT0gcmVjb3JkLnR5cGUpIHsgaWYgKHN0YXRlID0gY29udGV4dC5kb25lID8gXCJjb21wbGV0ZWRcIiA6IFwic3VzcGVuZGVkWWllbGRcIiwgcmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7IHJldHVybiB7IHZhbHVlOiByZWNvcmQuYXJnLCBkb25lOiBjb250ZXh0LmRvbmUgfTsgfSBcInRocm93XCIgPT09IHJlY29yZC50eXBlICYmIChzdGF0ZSA9IFwiY29tcGxldGVkXCIsIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiLCBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmcpOyB9IH07IH0gZnVuY3Rpb24gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCkgeyB2YXIgbWV0aG9kTmFtZSA9IGNvbnRleHQubWV0aG9kLCBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvclttZXRob2ROYW1lXTsgaWYgKHVuZGVmaW5lZCA9PT0gbWV0aG9kKSByZXR1cm4gY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIFwidGhyb3dcIiA9PT0gbWV0aG9kTmFtZSAmJiBkZWxlZ2F0ZS5pdGVyYXRvci5yZXR1cm4gJiYgKGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIiwgY29udGV4dC5hcmcgPSB1bmRlZmluZWQsIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpLCBcInRocm93XCIgPT09IGNvbnRleHQubWV0aG9kKSB8fCBcInJldHVyblwiICE9PSBtZXRob2ROYW1lICYmIChjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIiwgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAnXCIgKyBtZXRob2ROYW1lICsgXCInIG1ldGhvZFwiKSksIENvbnRpbnVlU2VudGluZWw7IHZhciByZWNvcmQgPSB0cnlDYXRjaChtZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBjb250ZXh0LmFyZyk7IGlmIChcInRocm93XCIgPT09IHJlY29yZC50eXBlKSByZXR1cm4gY29udGV4dC5tZXRob2QgPSBcInRocm93XCIsIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZywgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWw7IHZhciBpbmZvID0gcmVjb3JkLmFyZzsgcmV0dXJuIGluZm8gPyBpbmZvLmRvbmUgPyAoY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWUsIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2MsIFwicmV0dXJuXCIgIT09IGNvbnRleHQubWV0aG9kICYmIChjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiLCBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCksIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsLCBDb250aW51ZVNlbnRpbmVsKSA6IGluZm8gOiAoY29udGV4dC5tZXRob2QgPSBcInRocm93XCIsIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpLCBjb250ZXh0LmRlbGVnYXRlID0gbnVsbCwgQ29udGludWVTZW50aW5lbCk7IH0gZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHsgdmFyIGVudHJ5ID0geyB0cnlMb2M6IGxvY3NbMF0gfTsgMSBpbiBsb2NzICYmIChlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV0pLCAyIGluIGxvY3MgJiYgKGVudHJ5LmZpbmFsbHlMb2MgPSBsb2NzWzJdLCBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM10pLCB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7IH0gZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkgeyB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTsgcmVjb3JkLnR5cGUgPSBcIm5vcm1hbFwiLCBkZWxldGUgcmVjb3JkLmFyZywgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDsgfSBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7IHRoaXMudHJ5RW50cmllcyA9IFt7IHRyeUxvYzogXCJyb290XCIgfV0sIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKSwgdGhpcy5yZXNldCghMCk7IH0gZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7IGlmIChpdGVyYWJsZSkgeyB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07IGlmIChpdGVyYXRvck1ldGhvZCkgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpOyBpZiAoXCJmdW5jdGlvblwiID09IHR5cGVvZiBpdGVyYWJsZS5uZXh0KSByZXR1cm4gaXRlcmFibGU7IGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkgeyB2YXIgaSA9IC0xLCBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHsgZm9yICg7ICsraSA8IGl0ZXJhYmxlLmxlbmd0aDspIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHJldHVybiBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV0sIG5leHQuZG9uZSA9ICExLCBuZXh0OyByZXR1cm4gbmV4dC52YWx1ZSA9IHVuZGVmaW5lZCwgbmV4dC5kb25lID0gITAsIG5leHQ7IH07IHJldHVybiBuZXh0Lm5leHQgPSBuZXh0OyB9IH0gcmV0dXJuIHsgbmV4dDogZG9uZVJlc3VsdCB9OyB9IGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7IHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6ICEwIH07IH0gcmV0dXJuIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCBkZWZpbmVQcm9wZXJ0eShHcCwgXCJjb25zdHJ1Y3RvclwiLCB7IHZhbHVlOiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgY29uZmlndXJhYmxlOiAhMCB9KSwgZGVmaW5lUHJvcGVydHkoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIFwiY29uc3RydWN0b3JcIiwgeyB2YWx1ZTogR2VuZXJhdG9yRnVuY3Rpb24sIGNvbmZpZ3VyYWJsZTogITAgfSksIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gZGVmaW5lKEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCB0b1N0cmluZ1RhZ1N5bWJvbCwgXCJHZW5lcmF0b3JGdW5jdGlvblwiKSwgZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24gKGdlbkZ1bikgeyB2YXIgY3RvciA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgZ2VuRnVuICYmIGdlbkZ1bi5jb25zdHJ1Y3RvcjsgcmV0dXJuICEhY3RvciAmJiAoY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHwgXCJHZW5lcmF0b3JGdW5jdGlvblwiID09PSAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpKTsgfSwgZXhwb3J0cy5tYXJrID0gZnVuY3Rpb24gKGdlbkZ1bikgeyByZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpIDogKGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgZGVmaW5lKGdlbkZ1biwgdG9TdHJpbmdUYWdTeW1ib2wsIFwiR2VuZXJhdG9yRnVuY3Rpb25cIikpLCBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCksIGdlbkZ1bjsgfSwgZXhwb3J0cy5hd3JhcCA9IGZ1bmN0aW9uIChhcmcpIHsgcmV0dXJuIHsgX19hd2FpdDogYXJnIH07IH0sIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSksIGRlZmluZShBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSwgYXN5bmNJdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSksIGV4cG9ydHMuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3IsIGV4cG9ydHMuYXN5bmMgPSBmdW5jdGlvbiAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QsIFByb21pc2VJbXBsKSB7IHZvaWQgMCA9PT0gUHJvbWlzZUltcGwgJiYgKFByb21pc2VJbXBsID0gUHJvbWlzZSk7IHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3Iod3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCksIFByb21pc2VJbXBsKTsgcmV0dXJuIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKSA/IGl0ZXIgOiBpdGVyLm5leHQoKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7IH0pOyB9LCBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApLCBkZWZpbmUoR3AsIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvclwiKSwgZGVmaW5lKEdwLCBpdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSksIGRlZmluZShHcCwgXCJ0b1N0cmluZ1wiLCBmdW5jdGlvbiAoKSB7IHJldHVybiBcIltvYmplY3QgR2VuZXJhdG9yXVwiOyB9KSwgZXhwb3J0cy5rZXlzID0gZnVuY3Rpb24gKHZhbCkgeyB2YXIgb2JqZWN0ID0gT2JqZWN0KHZhbCksIGtleXMgPSBbXTsgZm9yICh2YXIga2V5IGluIG9iamVjdCkga2V5cy5wdXNoKGtleSk7IHJldHVybiBrZXlzLnJldmVyc2UoKSwgZnVuY3Rpb24gbmV4dCgpIHsgZm9yICg7IGtleXMubGVuZ3RoOykgeyB2YXIga2V5ID0ga2V5cy5wb3AoKTsgaWYgKGtleSBpbiBvYmplY3QpIHJldHVybiBuZXh0LnZhbHVlID0ga2V5LCBuZXh0LmRvbmUgPSAhMSwgbmV4dDsgfSByZXR1cm4gbmV4dC5kb25lID0gITAsIG5leHQ7IH07IH0sIGV4cG9ydHMudmFsdWVzID0gdmFsdWVzLCBDb250ZXh0LnByb3RvdHlwZSA9IHsgY29uc3RydWN0b3I6IENvbnRleHQsIHJlc2V0OiBmdW5jdGlvbiByZXNldChza2lwVGVtcFJlc2V0KSB7IGlmICh0aGlzLnByZXYgPSAwLCB0aGlzLm5leHQgPSAwLCB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkLCB0aGlzLmRvbmUgPSAhMSwgdGhpcy5kZWxlZ2F0ZSA9IG51bGwsIHRoaXMubWV0aG9kID0gXCJuZXh0XCIsIHRoaXMuYXJnID0gdW5kZWZpbmVkLCB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KSwgIXNraXBUZW1wUmVzZXQpIGZvciAodmFyIG5hbWUgaW4gdGhpcykgXCJ0XCIgPT09IG5hbWUuY2hhckF0KDApICYmIGhhc093bi5jYWxsKHRoaXMsIG5hbWUpICYmICFpc05hTigrbmFtZS5zbGljZSgxKSkgJiYgKHRoaXNbbmFtZV0gPSB1bmRlZmluZWQpOyB9LCBzdG9wOiBmdW5jdGlvbiBzdG9wKCkgeyB0aGlzLmRvbmUgPSAhMDsgdmFyIHJvb3RSZWNvcmQgPSB0aGlzLnRyeUVudHJpZXNbMF0uY29tcGxldGlvbjsgaWYgKFwidGhyb3dcIiA9PT0gcm9vdFJlY29yZC50eXBlKSB0aHJvdyByb290UmVjb3JkLmFyZzsgcmV0dXJuIHRoaXMucnZhbDsgfSwgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uIGRpc3BhdGNoRXhjZXB0aW9uKGV4Y2VwdGlvbikgeyBpZiAodGhpcy5kb25lKSB0aHJvdyBleGNlcHRpb247IHZhciBjb250ZXh0ID0gdGhpczsgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7IHJldHVybiByZWNvcmQudHlwZSA9IFwidGhyb3dcIiwgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbiwgY29udGV4dC5uZXh0ID0gbG9jLCBjYXVnaHQgJiYgKGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCIsIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkKSwgISFjYXVnaHQ7IH0gZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgeyB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV0sIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247IGlmIChcInJvb3RcIiA9PT0gZW50cnkudHJ5TG9jKSByZXR1cm4gaGFuZGxlKFwiZW5kXCIpOyBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikgeyB2YXIgaGFzQ2F0Y2ggPSBoYXNPd24uY2FsbChlbnRyeSwgXCJjYXRjaExvY1wiKSwgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIik7IGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7IGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgITApOyBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTsgfSBlbHNlIGlmIChoYXNDYXRjaCkgeyBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsICEwKTsgfSBlbHNlIHsgaWYgKCFoYXNGaW5hbGx5KSB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTsgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7IH0gfSB9IH0sIGFicnVwdDogZnVuY3Rpb24gYWJydXB0KHR5cGUsIGFyZykgeyBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7IHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYgJiYgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJiB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7IHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTsgYnJlYWs7IH0gfSBmaW5hbGx5RW50cnkgJiYgKFwiYnJlYWtcIiA9PT0gdHlwZSB8fCBcImNvbnRpbnVlXCIgPT09IHR5cGUpICYmIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYyAmJiAoZmluYWxseUVudHJ5ID0gbnVsbCk7IHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9OyByZXR1cm4gcmVjb3JkLnR5cGUgPSB0eXBlLCByZWNvcmQuYXJnID0gYXJnLCBmaW5hbGx5RW50cnkgPyAodGhpcy5tZXRob2QgPSBcIm5leHRcIiwgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MsIENvbnRpbnVlU2VudGluZWwpIDogdGhpcy5jb21wbGV0ZShyZWNvcmQpOyB9LCBjb21wbGV0ZTogZnVuY3Rpb24gY29tcGxldGUocmVjb3JkLCBhZnRlckxvYykgeyBpZiAoXCJ0aHJvd1wiID09PSByZWNvcmQudHlwZSkgdGhyb3cgcmVjb3JkLmFyZzsgcmV0dXJuIFwiYnJlYWtcIiA9PT0gcmVjb3JkLnR5cGUgfHwgXCJjb250aW51ZVwiID09PSByZWNvcmQudHlwZSA/IHRoaXMubmV4dCA9IHJlY29yZC5hcmcgOiBcInJldHVyblwiID09PSByZWNvcmQudHlwZSA/ICh0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHJlY29yZC5hcmcsIHRoaXMubWV0aG9kID0gXCJyZXR1cm5cIiwgdGhpcy5uZXh0ID0gXCJlbmRcIikgOiBcIm5vcm1hbFwiID09PSByZWNvcmQudHlwZSAmJiBhZnRlckxvYyAmJiAodGhpcy5uZXh0ID0gYWZ0ZXJMb2MpLCBDb250aW51ZVNlbnRpbmVsOyB9LCBmaW5pc2g6IGZ1bmN0aW9uIGZpbmlzaChmaW5hbGx5TG9jKSB7IGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldOyBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykgcmV0dXJuIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpLCByZXNldFRyeUVudHJ5KGVudHJ5KSwgQ29udGludWVTZW50aW5lbDsgfSB9LCBjYXRjaDogZnVuY3Rpb24gX2NhdGNoKHRyeUxvYykgeyBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7IHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsgaWYgKGVudHJ5LnRyeUxvYyA9PT0gdHJ5TG9jKSB7IHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uOyBpZiAoXCJ0aHJvd1wiID09PSByZWNvcmQudHlwZSkgeyB2YXIgdGhyb3duID0gcmVjb3JkLmFyZzsgcmVzZXRUcnlFbnRyeShlbnRyeSk7IH0gcmV0dXJuIHRocm93bjsgfSB9IHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTsgfSwgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24gZGVsZWdhdGVZaWVsZChpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykgeyByZXR1cm4gdGhpcy5kZWxlZ2F0ZSA9IHsgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsIG5leHRMb2M6IG5leHRMb2MgfSwgXCJuZXh0XCIgPT09IHRoaXMubWV0aG9kICYmICh0aGlzLmFyZyA9IHVuZGVmaW5lZCksIENvbnRpbnVlU2VudGluZWw7IH0gfSwgZXhwb3J0czsgfVxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOyB9XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgeyBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBpdGVyW1N5bWJvbC5pdGVyYXRvcl0gIT0gbnVsbCB8fCBpdGVyW1wiQEBpdGVyYXRvclwiXSAhPSBudWxsKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkoYXJyKTsgfVxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTsgcmV0dXJuIGFycjI7IH1cbmltcG9ydCB7IF9fYXdhaXRlciwgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUmVhY3QsIHsgdXNlQ29udGV4dCwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgaXNGdW5jdGlvbiwgdHJhbnNsYXRpb24gfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgeyBnZXRXaWRnZXQgfSBmcm9tICcuLi8uLi9tb2RlbHMvbWFwcGluZyc7XG5pbXBvcnQgeyB0cmFuc2Zvcm1SdWxlcyB9IGZyb20gJy4uLy4uL21vZGVscy92YWxpZGF0ZXMnO1xudmFyIGdldFBhcmFtVmFsdWUgPSBmdW5jdGlvbiBnZXRQYXJhbVZhbHVlKGZvcm1DdHgsIHVwcGVyQ3R4LCBzY2hlbWEpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZUtleSkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIChfYiA9IChfYSA9IHNjaGVtYVt2YWx1ZUtleV0pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHVwcGVyQ3R4W3ZhbHVlS2V5XSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogZm9ybUN0eFt2YWx1ZUtleV07XG4gIH07XG59O1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIChwcm9wcykge1xuICB2YXIgX2EsIF9iLCBfYztcbiAgdmFyIGZvcm0gPSBwcm9wcy5mb3JtLFxuICAgIHNjaGVtYSA9IHByb3BzLnNjaGVtYSxcbiAgICBwYXRoID0gcHJvcHMucGF0aCxcbiAgICBwYXJlbnRMaXRQYXRoID0gcHJvcHMucGFyZW50TGl0UGF0aCxcbiAgICByZW5kZXJDb3JlID0gcHJvcHMucmVuZGVyQ29yZSxcbiAgICByb290UGF0aCA9IHByb3BzLnJvb3RQYXRoLFxuICAgIG1ldGhvZHMgPSBwcm9wcy5tZXRob2RzLFxuICAgIHVwcGVyQ3R4ID0gcHJvcHMudXBwZXJDdHgsXG4gICAgZm9ybUN0eCA9IHByb3BzLmZvcm1DdHgsXG4gICAgY29uZmlnQ29udGV4dCA9IHByb3BzLmNvbmZpZ0NvbnRleHQsXG4gICAgbGlzdERhdGEgPSBwcm9wcy5saXN0RGF0YSxcbiAgICBzZXRMaXN0RGF0YSA9IHByb3BzLnNldExpc3REYXRhO1xuICB2YXIgd2lkZ2V0cyA9IGNvbmZpZ0NvbnRleHQud2lkZ2V0cyxcbiAgICBnbG9iYWxDb25maWcgPSBjb25maWdDb250ZXh0Lmdsb2JhbENvbmZpZztcbiAgdmFyIGNvbmZpZ0N0eCA9IHVzZUNvbnRleHQoX0NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnRleHQpO1xuICB2YXIgdCA9IHRyYW5zbGF0aW9uKGNvbmZpZ0N0eCk7XG4gIHZhciBkZWZhdWx0QWRkQnRuUHJvcHMgPSB7XG4gICAgdHlwZTogJ2Rhc2hlZCcsXG4gICAgYmxvY2s6IHRydWUsXG4gICAgY2hpbGRyZW46IHQoJ2FkZF9pdGVtJylcbiAgfTtcbiAgdmFyIGRlZmF1bHREZWxDb25maXJtUHJvcHMgPSB7XG4gICAgdGl0bGU6IHQoJ2NvbmZpcm1fZGVsZXRlJyksXG4gICAgb2tUZXh0OiB0KCdjb25maXJtJyksXG4gICAgY2FuY2VsVGV4dDogdCgnY2FuY2VsJylcbiAgfTtcbiAgdmFyIGRlZmF1bHRBY3Rpb25Db2x1bW5Qcm9wcyA9IHtcbiAgICBjb2xIZWFkZXJUZXh0OiB0KCdvcGVyYXRlJylcbiAgfTtcbiAgdmFyIHdpZGdldE5hbWUgPSBzY2hlbWEud2lkZ2V0IHx8ICdjYXJkTGlzdCc7XG4gIHZhciBXaWRnZXQgPSBnZXRXaWRnZXQod2lkZ2V0TmFtZSwgd2lkZ2V0cyk7XG4gIHZhciBsaXN0UHJvcHMgPSBzY2hlbWEucHJvcHMsXG4gICAgcmVtb3ZlQnRuID0gc2NoZW1hLnJlbW92ZUJ0bixcbiAgICBfc2NoZW1hJHJ1bGVzID0gc2NoZW1hLnJ1bGVzLFxuICAgIHJ1bGVzID0gX3NjaGVtYSRydWxlcyA9PT0gdm9pZCAwID8gW10gOiBfc2NoZW1hJHJ1bGVzLFxuICAgIG90aGVyU2NoZW1hID0gX19yZXN0KHNjaGVtYSwgW1wicHJvcHNcIiwgXCJyZW1vdmVCdG5cIiwgXCJydWxlc1wiXSk7XG4gIHZhciBkZWZhdWx0VmFsdWUgPSAoX2EgPSBzY2hlbWEuZGVmYXVsdCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogc2NoZW1hLmRlZmF1bHRWYWx1ZTtcbiAgaWYgKGRlZmF1bHRWYWx1ZSA9PT0gdW5kZWZpbmVkICYmICFbJ2RyYXdlckxpc3QnLCAnbGlzdDEnXS5pbmNsdWRlcyh3aWRnZXROYW1lKSkge1xuICAgIGRlZmF1bHRWYWx1ZSA9IFt7fV07XG4gIH1cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzZXRMaXN0RGF0YShkZWZhdWx0VmFsdWUgfHwgW10pO1xuICB9LCBbXSk7XG4gIHZhciBfZCA9IGxpc3RQcm9wcyB8fCB7fSxcbiAgICBhZGRCdG5Qcm9wcyA9IF9kLmFkZEJ0blByb3BzLFxuICAgIGRlbENvbmZpcm1Qcm9wcyA9IF9kLmRlbENvbmZpcm1Qcm9wcyxcbiAgICBhY3Rpb25Db2x1bW5Qcm9wcyA9IF9kLmFjdGlvbkNvbHVtblByb3BzLFxuICAgIGhpZGVBZGQgPSBfZC5oaWRlQWRkLFxuICAgIGhpZGVDb3B5ID0gX2QuaGlkZUNvcHksXG4gICAgaGlkZU1vdmUgPSBfZC5oaWRlTW92ZSxcbiAgICBoaWRlRGVsZXRlID0gX2QuaGlkZURlbGV0ZSxcbiAgICBvbkFkZCA9IF9kLm9uQWRkLFxuICAgIG9uUmVtb3ZlID0gX2Qub25SZW1vdmUsXG4gICAgb25Nb3ZlID0gX2Qub25Nb3ZlLFxuICAgIG9uQ29weSA9IF9kLm9uQ29weSxcbiAgICBvdGhlckxpc3RQcm9wcyA9IF9fcmVzdChfZCwgW1wiYWRkQnRuUHJvcHNcIiwgXCJkZWxDb25maXJtUHJvcHNcIiwgXCJhY3Rpb25Db2x1bW5Qcm9wc1wiLCBcImhpZGVBZGRcIiwgXCJoaWRlQ29weVwiLCBcImhpZGVNb3ZlXCIsIFwiaGlkZURlbGV0ZVwiLCBcIm9uQWRkXCIsIFwib25SZW1vdmVcIiwgXCJvbk1vdmVcIiwgXCJvbkNvcHlcIl0pO1xuICB2YXIgaGFuZGxlQWRkID0gZnVuY3Rpb24gaGFuZGxlQWRkKGFkZCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgdmFyIGFkZEZ1bmMgPSBvbkFkZDtcbiAgICAgIGlmICh0eXBlb2Ygb25BZGQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGFkZEZ1bmMgPSBtZXRob2RzW29uQWRkXTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0Z1bmN0aW9uKGFkZEZ1bmMpKSB7XG4gICAgICAgIGFkZEZ1bmMoZnVuY3Rpb24gKGZ1bkRhdGEpIHtcbiAgICAgICAgICByZXR1cm4gYWRkKGZ1bkRhdGEgfHwgZGF0YSk7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICBzY2hlbWE6IHNjaGVtYSxcbiAgICAgICAgICBkYXRhOiBkYXRhXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhZGQoZGF0YSk7XG4gICAgfTtcbiAgfTtcbiAgdmFyIGhhbmRsZVJlbW92ZSA9IGZ1bmN0aW9uIGhhbmRsZVJlbW92ZShyZW1vdmUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICB2YXIgcmVtb3ZlRnVuYyA9IG9uUmVtb3ZlO1xuICAgICAgaWYgKHR5cGVvZiBvblJlbW92ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmVtb3ZlRnVuYyA9IG1ldGhvZHNbb25SZW1vdmVdO1xuICAgICAgfVxuICAgICAgaWYgKGlzRnVuY3Rpb24ocmVtb3ZlRnVuYykpIHtcbiAgICAgICAgdmFyIGRhdGEgPSBmb3JtLmdldEZpZWxkVmFsdWUoW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShwcmVSb290UGF0aCksIF90b0NvbnN1bWFibGVBcnJheShwYXRoKSwgW2luZGV4XSkpO1xuICAgICAgICByZW1vdmVGdW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gcmVtb3ZlKGluZGV4KTtcbiAgICAgICAgfSwge1xuICAgICAgICAgIHNjaGVtYTogc2NoZW1hLFxuICAgICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgICBkYXRhOiBkYXRhXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZW1vdmUoaW5kZXgpO1xuICAgIH07XG4gIH07XG4gIHZhciBoYW5kbGVNb3ZlID0gZnVuY3Rpb24gaGFuZGxlTW92ZShtb3ZlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChmb3JtLCB0bykge1xuICAgICAgdmFyIG1vdmVGdW5jID0gb25Nb3ZlO1xuICAgICAgaWYgKHR5cGVvZiBtb3ZlRnVuYyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbW92ZUZ1bmMgPSBtZXRob2RzW29uTW92ZV07XG4gICAgICB9XG4gICAgICBpZiAoaXNGdW5jdGlvbihtb3ZlRnVuYykpIHtcbiAgICAgICAgbW92ZUZ1bmMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBtb3ZlKGZvcm0sIHRvKTtcbiAgICAgICAgfSwge1xuICAgICAgICAgIHNjaGVtYTogc2NoZW1hLFxuICAgICAgICAgIGZvcm06IGZvcm0sXG4gICAgICAgICAgdG86IHRvXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBtb3ZlKGZvcm0sIHRvKTtcbiAgICB9O1xuICB9O1xuICB2YXIgaGFuZGxlQ29weSA9IGZ1bmN0aW9uIGhhbmRsZUNvcHkoYWRkLCBmaWVsZHMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIGlmIChzY2hlbWEubWF4ICYmIGZpZWxkcy5sZW5ndGggPT09IHNjaGVtYS5tYXgpIHtcbiAgICAgICAgcmV0dXJuIF9tZXNzYWdlLndhcm5pbmcodCgnY29weV9tYXhfdGlwJykpO1xuICAgICAgfVxuICAgICAgdmFyIGNvcHlGdW5jID0gb25Db3B5O1xuICAgICAgaWYgKHR5cGVvZiBvbkNvcHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvcHlGdW5jID0gbWV0aG9kc1tvbkNvcHldO1xuICAgICAgfVxuICAgICAgaWYgKGlzRnVuY3Rpb24oY29weUZ1bmMpKSB7XG4gICAgICAgIGNvcHlGdW5jKGZ1bmN0aW9uIChmdW5EYXRhKSB7XG4gICAgICAgICAgcmV0dXJuIGFkZChmdW5EYXRhIHx8IGRhdGEpO1xuICAgICAgICB9LCB7XG4gICAgICAgICAgc2NoZW1hOiBzY2hlbWEsXG4gICAgICAgICAgZGF0YTogZGF0YVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYWRkKGRhdGEpO1xuICAgIH07XG4gIH07XG4gIHZhciBoYW5kbGVEZWxldGUgPSBmdW5jdGlvbiBoYW5kbGVEZWxldGUoKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24ocmVtb3ZlQnRuID09PSBudWxsIHx8IHJlbW92ZUJ0biA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVtb3ZlQnRuLm9uQ2xpY2spKSB7XG4gICAgICByZW1vdmVCdG4ub25DbGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvcm0uc2V0U2NoZW1hQnlQYXRoKHBhdGgsIHtcbiAgICAgICAgICBoaWRkZW46IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9ybS5zZXRTY2hlbWFCeVBhdGgocGF0aCwge1xuICAgICAgaGlkZGVuOiB0cnVlXG4gICAgfSk7XG4gIH07XG4gIHZhciBnZXRWYWx1ZUZyb21LZXkgPSBnZXRQYXJhbVZhbHVlKGZvcm1DdHgsIHVwcGVyQ3R4LCBzY2hlbWEpO1xuICB2YXIgcmVhZE9ubHkgPSBnZXRWYWx1ZUZyb21LZXkoJ3JlYWRPbmx5Jyk7XG4gIHZhciBwcmVSb290UGF0aCA9IChyb290UGF0aCB8fCBbXSkuc3BsaWNlKDAsIHJvb3RQYXRoLmxlbmd0aCAtIDEpO1xuICB2YXIgZGlzcGxheVR5cGUgPSBnZXRWYWx1ZUZyb21LZXkoJ2Rpc3BsYXlUeXBlJyk7XG4gIGlmIChoaWRlTW92ZSA9PT0gdW5kZWZpbmVkICYmICgoX2IgPSBnbG9iYWxDb25maWcgPT09IG51bGwgfHwgZ2xvYmFsQ29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBnbG9iYWxDb25maWcubGlzdE9wZXJhdGUpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5oaWRlTW92ZSkpIHtcbiAgICBoaWRlTW92ZSA9IGdsb2JhbENvbmZpZyA9PT0gbnVsbCB8fCBnbG9iYWxDb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGdsb2JhbENvbmZpZy5saXN0T3BlcmF0ZS5oaWRlTW92ZTtcbiAgfVxuICBpZiAoKG90aGVyU2NoZW1hID09PSBudWxsIHx8IG90aGVyU2NoZW1hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvdGhlclNjaGVtYS5taW4pID4gMCAmJiBsaXN0RGF0YS5sZW5ndGggPD0gKG90aGVyU2NoZW1hID09PSBudWxsIHx8IG90aGVyU2NoZW1hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvdGhlclNjaGVtYS5taW4pKSB7XG4gICAgaGlkZURlbGV0ZSA9IHRydWU7XG4gIH1cbiAgaWYgKChvdGhlclNjaGVtYSA9PT0gbnVsbCB8fCBvdGhlclNjaGVtYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3RoZXJTY2hlbWEubWF4KSA+IDAgJiYgKG90aGVyU2NoZW1hID09PSBudWxsIHx8IG90aGVyU2NoZW1hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvdGhlclNjaGVtYS5tYXgpIDw9IGxpc3REYXRhLmxlbmd0aCkge1xuICAgIGhpZGVBZGQgPSB0cnVlO1xuICB9XG4gIGlmIChoaWRlQWRkKSB7XG4gICAgaGlkZUNvcHkgPSB0cnVlO1xuICB9XG4gIGlmIChyZWFkT25seSkge1xuICAgIGhpZGVBZGQgPSB0cnVlO1xuICAgIGhpZGVDb3B5ID0gdHJ1ZTtcbiAgICBoaWRlRGVsZXRlID0gdHJ1ZTtcbiAgICBoaWRlTW92ZSA9IHRydWU7XG4gIH1cbiAgdmFyIG9wZXJhdGVCdG5UeXBlID0gKF9jID0gZ2xvYmFsQ29uZmlnID09PSBudWxsIHx8IGdsb2JhbENvbmZpZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogZ2xvYmFsQ29uZmlnLmxpc3RPcGVyYXRlKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuYnRuVHlwZTtcbiAgdmFyIHJ1bGVMaXN0ID0gW107XG4gIGlmICghcmVhZE9ubHkpIHtcbiAgICBydWxlTGlzdCA9IFt7XG4gICAgICB2YWxpZGF0b3I6IGZ1bmN0aW9uIHZhbGlkYXRvcihfLCBkYXRhKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7XG4gICAgICAgICAgdmFyIF9lO1xuICAgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHNldExpc3REYXRhKGRhdGEpO1xuICAgICAgICAgICAgICAgIGlmIChvdGhlclNjaGVtYSA9PT0gbnVsbCB8fCBvdGhlclNjaGVtYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3RoZXJTY2hlbWEubWluKSB7XG4gICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMztcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIpO1xuICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgaWYgKCEoIWRhdGEgfHwgZGF0YS5sZW5ndGggPCBvdGhlclNjaGVtYS5taW4pKSB7XG4gICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcigoKF9lID0gb3RoZXJTY2hlbWEgPT09IG51bGwgfHwgb3RoZXJTY2hlbWEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG90aGVyU2NoZW1hLm1lc3NhZ2UpID09PSBudWxsIHx8IF9lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZS5taW4pIHx8IFwiXFx1NjU3MFxcdTYzNkVcXHU5NTdGXFx1NUVBNlxcdTVGQzVcXHU5ODdCXFx1NTkyN1xcdTRFOEVcXHU3QjQ5XFx1NEU4RVwiLmNvbmNhdChvdGhlclNjaGVtYS5taW4pKSkpO1xuICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIF9jYWxsZWUpO1xuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfV0uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheSh0cmFuc2Zvcm1SdWxlcyhydWxlcyB8fCBbXSwgbWV0aG9kcywgZm9ybSkpKTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Gb3JtLkxpc3QsIHtcbiAgICBuYW1lOiBwYXRoLFxuICAgIGluaXRpYWxWYWx1ZTogZGVmYXVsdFZhbHVlLFxuICAgIHJ1bGVzOiBydWxlTGlzdFxuICB9LCBmdW5jdGlvbiAoZmllbGRzLCBvcGVyYXRpb24sIF9yZWYpIHtcbiAgICB2YXIgZXJyb3JzID0gX3JlZi5lcnJvcnM7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChXaWRnZXQsIE9iamVjdC5hc3NpZ24oe30sIG90aGVyTGlzdFByb3BzLCB7XG4gICAgICBjb25maWdDb250ZXh0OiBjb25maWdDb250ZXh0LFxuICAgICAgZm9ybTogZm9ybSxcbiAgICAgIHNjaGVtYTogb3RoZXJTY2hlbWEsXG4gICAgICBmaWVsZHM6IGZpZWxkcyxcbiAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uLFxuICAgICAgcGF0aDogcGF0aCxcbiAgICAgIGxpc3ROYW1lOiBwYXRoLFxuICAgICAgcGFyZW50TGl0UGF0aDogcGFyZW50TGl0UGF0aCxcbiAgICAgIHJvb3RQYXRoOiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHByZVJvb3RQYXRoKSwgX3RvQ29uc3VtYWJsZUFycmF5KHBhdGgpKSxcbiAgICAgIHJlYWRPbmx5OiByZWFkT25seSxcbiAgICAgIG1ldGhvZHM6IG1ldGhvZHMsXG4gICAgICByZW5kZXJDb3JlOiByZW5kZXJDb3JlLFxuICAgICAgd2lkZ2V0czogd2lkZ2V0cyxcbiAgICAgIGhpZGVBZGQ6IGhpZGVBZGQsXG4gICAgICBoaWRlQ29weTogaGlkZUNvcHksXG4gICAgICBoaWRlRGVsZXRlOiBoaWRlRGVsZXRlLFxuICAgICAgaGlkZU1vdmU6IGhpZGVNb3ZlLFxuICAgICAgYWRkSXRlbTogaGFuZGxlQWRkKG9wZXJhdGlvbi5hZGQpLFxuICAgICAgcmVtb3ZlSXRlbTogaGFuZGxlUmVtb3ZlKG9wZXJhdGlvbi5yZW1vdmUpLFxuICAgICAgbW92ZUl0ZW06IGhhbmRsZU1vdmUob3BlcmF0aW9uLm1vdmUpLFxuICAgICAgY29weUl0ZW06IGhhbmRsZUNvcHkob3BlcmF0aW9uLmFkZCwgZmllbGRzKSxcbiAgICAgIHRlbXBvcmFyeToge1xuICAgICAgICBkaXNwbGF5VHlwZTogZGlzcGxheVR5cGVcbiAgICAgIH0sXG4gICAgICBhZGRCdG5Qcm9wczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0QWRkQnRuUHJvcHMpLCBhZGRCdG5Qcm9wcyksXG4gICAgICBkZWxDb25maXJtUHJvcHM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdERlbENvbmZpcm1Qcm9wcyksIGRlbENvbmZpcm1Qcm9wcyksXG4gICAgICBhY3Rpb25Db2x1bW5Qcm9wczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0QWN0aW9uQ29sdW1uUHJvcHMpLCBhY3Rpb25Db2x1bW5Qcm9wcyksXG4gICAgICBjb3B5QnRuUHJvcHM6IHtcbiAgICAgICAgY2hpbGRyZW46IHQoJ2NvcHknKSxcbiAgICAgICAgYnRuVHlwZTogb3BlcmF0ZUJ0blR5cGVcbiAgICAgIH0sXG4gICAgICBlZGl0b3JCdG5Qcm9wczoge1xuICAgICAgICBjaGlsZHJlbjogdCgnZWRpdCcpLFxuICAgICAgICBidG5UeXBlOiBvcGVyYXRlQnRuVHlwZVxuICAgICAgfSxcbiAgICAgIGRlbGV0ZUJ0blByb3BzOiB7XG4gICAgICAgIGNoaWxkcmVuOiB0KCdkZWxldGUnKSxcbiAgICAgICAgYnRuVHlwZTogb3BlcmF0ZUJ0blR5cGVcbiAgICAgIH0sXG4gICAgICBtb3ZlVXBCdG5Qcm9wczoge1xuICAgICAgICBjaGlsZHJlbjogdCgnbW92ZVVwJyksXG4gICAgICAgIGJ0blR5cGU6IG9wZXJhdGVCdG5UeXBlXG4gICAgICB9LFxuICAgICAgbW92ZURvd25CdG5Qcm9wczoge1xuICAgICAgICBjaGlsZHJlbjogdCgnbW92ZURvd24nKSxcbiAgICAgICAgYnRuVHlwZTogb3BlcmF0ZUJ0blR5cGVcbiAgICAgIH1cbiAgICB9KSksIChlcnJvcnMgPT09IG51bGwgfHwgZXJyb3JzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJvcnMubGVuZ3RoKSAhPT0gMCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBzdHlsZToge1xuICAgICAgICBtYXJnaW5Cb3R0b206ICcxMnB4J1xuICAgICAgfVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Gb3JtLkVycm9yTGlzdCwge1xuICAgICAgZXJyb3JzOiBlcnJvcnNcbiAgICB9KSkpO1xuICB9KSwgcmVtb3ZlQnRuICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9CdXR0b24sIE9iamVjdC5hc3NpZ24oe1xuICAgIHR5cGU6ICdsaW5rJyxcbiAgICBkYW5nZXI6IHRydWVcbiAgfSwgcmVtb3ZlQnRuLCB7XG4gICAgb25DbGljazogaGFuZGxlRGVsZXRlXG4gIH0pLCAocmVtb3ZlQnRuID09PSBudWxsIHx8IHJlbW92ZUJ0biA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVtb3ZlQnRuLnRleHQpIHx8IHQoJ2RlbGV0ZScpKSk7XG59KTsiLCJpbXBvcnQgXCJhbnRkL2VzL2Zvcm0vc3R5bGVcIjtcbmltcG9ydCBfRm9ybSBmcm9tIFwiYW50ZC9lcy9mb3JtXCI7XG5pbXBvcnQgXCJhbnRkL2VzL2NvbC9zdHlsZVwiO1xuaW1wb3J0IF9Db2wgZnJvbSBcImFudGQvZXMvY29sXCI7XG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfVxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldOyByZXR1cm4gYXJyMjsgfVxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgeyB2YXIgX2kgPSBudWxsID09IGFyciA/IG51bGwgOiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBTeW1ib2wgJiYgYXJyW1N5bWJvbC5pdGVyYXRvcl0gfHwgYXJyW1wiQEBpdGVyYXRvclwiXTsgaWYgKG51bGwgIT0gX2kpIHsgdmFyIF9zLCBfZSwgX3gsIF9yLCBfYXJyID0gW10sIF9uID0gITAsIF9kID0gITE7IHRyeSB7IGlmIChfeCA9IChfaSA9IF9pLmNhbGwoYXJyKSkubmV4dCwgMCA9PT0gaSkgeyBpZiAoT2JqZWN0KF9pKSAhPT0gX2kpIHJldHVybjsgX24gPSAhMTsgfSBlbHNlIGZvciAoOyAhKF9uID0gKF9zID0gX3guY2FsbChfaSkpLmRvbmUpICYmIChfYXJyLnB1c2goX3MudmFsdWUpLCBfYXJyLmxlbmd0aCAhPT0gaSk7IF9uID0gITApOyB9IGNhdGNoIChlcnIpIHsgX2QgPSAhMCwgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgbnVsbCAhPSBfaS5yZXR1cm4gJiYgKF9yID0gX2kucmV0dXJuKCksIE9iamVjdChfcikgIT09IF9yKSkgcmV0dXJuOyB9IGZpbmFsbHkgeyBpZiAoX2QpIHRocm93IF9lOyB9IH0gcmV0dXJuIF9hcnI7IH0gfVxuZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyOyB9XG5pbXBvcnQgeyBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBSZWFjdCwgeyBjcmVhdGVDb250ZXh0LCB1c2VDb250ZXh0LCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVN0b3JlIH0gZnJvbSAnenVzdGFuZCc7XG5pbXBvcnQgeyBGUkNvbnRleHQgfSBmcm9tICcuLi8uLi9tb2RlbHMvY29udGV4dCc7XG5pbXBvcnQgeyBwYXJzZUFsbEV4cHJlc3Npb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBnZXRGb3JtTGlzdExheW91dCwgZ2V0UGFyYW1WYWx1ZSwgZ2V0TGFiZWwsIGdldFRvb2x0aXAgfSBmcm9tICcuL21vZHVsZXMnO1xuaW1wb3J0IE1haW4gZnJvbSAnLi9maWVsZCc7XG52YXIgVXBwZXJDb250ZXh0ID0gLyojX19QVVJFX18qL2NyZWF0ZUNvbnRleHQoZnVuY3Rpb24gKCkge30pO1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIChwcm9wcykge1xuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoW10pLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIGxpc3REYXRhID0gX3VzZVN0YXRlMlswXSxcbiAgICBzZXRMaXN0RGF0YSA9IF91c2VTdGF0ZTJbMV07XG4gIHZhciBjb25maWdDb250ZXh0ID0gcHJvcHMuY29uZmlnQ29udGV4dDtcbiAgdmFyIHN0b3JlID0gdXNlQ29udGV4dChGUkNvbnRleHQpO1xuICB2YXIgZm9ybUN0eCA9IHVzZVN0b3JlKHN0b3JlLCBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGUuY29udGV4dDtcbiAgfSk7XG4gIHZhciB1cHBlckN0eCA9IHVzZUNvbnRleHQoVXBwZXJDb250ZXh0KTtcbiAgdmFyIGZvcm0gPSBjb25maWdDb250ZXh0LmZvcm0sXG4gICAgd2lkZ2V0cyA9IGNvbmZpZ0NvbnRleHQud2lkZ2V0cyxcbiAgICBtZXRob2RzID0gY29uZmlnQ29udGV4dC5tZXRob2RzLFxuICAgIGdsb2JhbENvbmZpZyA9IGNvbmZpZ0NvbnRleHQuZ2xvYmFsQ29uZmlnO1xuICB2YXIgZGlzcGxheVR5cGUgPSBmb3JtQ3R4LmRpc3BsYXlUeXBlO1xuICB2YXIgaXNEaXNwbGF5Q29sdW1uID0gZGlzcGxheVR5cGUgPT09ICdjb2x1bW4nO1xuICB2YXIgX3NjaGVtYSA9IHByb3BzLnNjaGVtYTtcbiAgdmFyIGZvcm1EYXRhID0gZm9ybS5nZXRGaWVsZHNWYWx1ZSh0cnVlKTtcbiAgdmFyIF9zdG9yZSRnZXRTdGF0ZSA9IHN0b3JlLmdldFN0YXRlKCksXG4gICAgZm9ybVNjaGVtYSA9IF9zdG9yZSRnZXRTdGF0ZS5zY2hlbWE7XG4gIHZhciBpdGVtcyA9IF9zY2hlbWEuaXRlbXMsXG4gICAgY2xhc3NOYW1lID0gX3NjaGVtYS5jbGFzc05hbWUsXG4gICAgb3RoZXJTY2hlbWEgPSBfX3Jlc3QoX3NjaGVtYSwgW1wiaXRlbXNcIiwgXCJjbGFzc05hbWVcIl0pO1xuICB2YXIgc2NoZW1hID0gKGdsb2JhbENvbmZpZyA9PT0gbnVsbCB8fCBnbG9iYWxDb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGdsb2JhbENvbmZpZy5tdXN0YWNoZURpc2FibGVkKSA/IF9zY2hlbWEgOiBPYmplY3QuYXNzaWduKHtcbiAgICBpdGVtczogaXRlbXNcbiAgfSwgcGFyc2VBbGxFeHByZXNzaW9uKG90aGVyU2NoZW1hLCBmb3JtRGF0YSwgcHJvcHMucm9vdFBhdGgsIGZvcm1TY2hlbWEpKTtcbiAgdmFyIHdpZGdldCA9IHNjaGVtYS53aWRnZXQ7XG4gIHZhciB3aWRnZXROYW1lID0gd2lkZ2V0IHx8ICdsaXN0MSc7XG4gIHZhciBnZXRWYWx1ZUZyb21LZXkgPSBnZXRQYXJhbVZhbHVlKGZvcm1DdHgsIHVwcGVyQ3R4LCBzY2hlbWEpO1xuICB2YXIgbGFiZWwgPSBnZXRMYWJlbChzY2hlbWEsIGRpc3BsYXlUeXBlLCB3aWRnZXRzKTtcbiAgdmFyIHRvb2x0aXAgPSBnZXRUb29sdGlwKHNjaGVtYSwgZGlzcGxheVR5cGUpO1xuICB2YXIgX2dldEZvcm1MaXN0TGF5b3V0ID0gZ2V0Rm9ybUxpc3RMYXlvdXQoZ2V0VmFsdWVGcm9tS2V5LCBkaXNwbGF5VHlwZSksXG4gICAgbGFiZWxDb2wgPSBfZ2V0Rm9ybUxpc3RMYXlvdXQubGFiZWxDb2wsXG4gICAgZmllbGRDb2wgPSBfZ2V0Rm9ybUxpc3RMYXlvdXQuZmllbGRDb2w7XG4gIHZhciBpc0lubGluZSA9IHNjaGVtYS5kaXNwbGF5ID09PSAnaW5saW5lJztcbiAgaWYgKCEoc2V0TGlzdERhdGEgPT09IG51bGwgfHwgc2V0TGlzdERhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNldExpc3REYXRhLmxlbmd0aCkgJiYgd2lkZ2V0TmFtZSAhPT0gJ2RyYXdlckxpc3QnKSB7XG4gICAgaXNJbmxpbmUgPSB0cnVlO1xuICB9XG4gIGlmIChzY2hlbWEuaGlkZGVuKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Db2wsIHtcbiAgICBzcGFuOiAyNCxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVxuICB9LCAhaXNJbmxpbmUgJiYgIWlzRGlzcGxheUNvbHVtbiAmJiBsYWJlbCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfRm9ybS5JdGVtLCB7XG4gICAgY2xhc3NOYW1lOiAnYW50LWZvcm0taXRlbS1vcHRpb25hbC1oaWRlJyxcbiAgICBsYWJlbDogbGFiZWwsXG4gICAgbGFiZWxBbGlnbjogJ2xlZnQnLFxuICAgIGNvbG9uOiBmYWxzZSxcbiAgICB0b29sdGlwOiB0b29sdGlwLFxuICAgIHN0eWxlOiB7XG4gICAgICBtYXJnaW5Cb3R0b206IDBcbiAgICB9LFxuICAgIGxhYmVsQ29sOiB7XG4gICAgICBzcGFuOiAyNFxuICAgIH1cbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Gb3JtLkl0ZW0sIHtcbiAgICBsYWJlbDogbGFiZWwsXG4gICAgbGFiZWxDb2w6IGlzRGlzcGxheUNvbHVtbiA/IHtcbiAgICAgIHNwYW46IDI0XG4gICAgfSA6IGxhYmVsQ29sLFxuICAgIHdyYXBwZXJDb2w6IGZpZWxkQ29sLFxuICAgIG5vU3R5bGU6ICFpc0lubGluZSAmJiAhaXNEaXNwbGF5Q29sdW1uLFxuICAgIHRvb2x0aXA6IHRvb2x0aXBcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTWFpbiwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICBmb3JtOiBmb3JtLFxuICAgIG1ldGhvZHM6IG1ldGhvZHMsXG4gICAgZm9ybUN0eDogZm9ybUN0eCxcbiAgICB1cHBlckN0eDogdXBwZXJDdHgsXG4gICAgd2lkZ2V0czogd2lkZ2V0cyxcbiAgICBjb25maWdDb250ZXh0OiBjb25maWdDb250ZXh0LFxuICAgIHNldExpc3REYXRhOiBzZXRMaXN0RGF0YSxcbiAgICBsaXN0RGF0YTogbGlzdERhdGFcbiAgfSkpKSk7XG59KTsiLCJpbXBvcnQgXCJhbnRkL2VzL2Zvcm0vc3R5bGVcIjtcbmltcG9ydCBfRm9ybSBmcm9tIFwiYW50ZC9lcy9mb3JtXCI7XG5pbXBvcnQgUmVhY3QsIHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQgfSBmcm9tICcuLi8uLi9tb2RlbHMvY29udGV4dCc7XG5pbXBvcnQgeyBpc0hhc0V4cHJlc3Npb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvZXhwcmVzc2lvbic7XG5pbXBvcnQgZmllbGRTaG91bGRVcGRhdGUgZnJvbSAnLi4vLi4vbW9kZWxzL2ZpZWxkU2hvdWxkVXBkYXRlJztcbmltcG9ydCBNYWluIGZyb20gJy4vbWFpbic7XG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gKHByb3BzKSB7XG4gIHZhciBfYTtcbiAgdmFyIHNjaGVtYSA9IHByb3BzLnNjaGVtYSxcbiAgICByb290UGF0aCA9IHByb3BzLnJvb3RQYXRoO1xuICB2YXIgY29uZmlnQ3R4ID0gdXNlQ29udGV4dChDb25maWdDb250ZXh0KTtcbiAgdmFyIG11c3RhY2hlRGlzYWJsZWQgPSAoX2EgPSBjb25maWdDdHggPT09IG51bGwgfHwgY29uZmlnQ3R4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWdDdHguZ2xvYmFsQ29uZmlnKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubXVzdGFjaGVEaXNhYmxlZDtcbiAgdmFyIGRlcGVuZGVuY2llcyA9IHNjaGVtYSA9PT0gbnVsbCB8fCBzY2hlbWEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNjaGVtYS5kZXBlbmRlbmNpZXM7XG4gIC8vIE5vIGZ1bmN0aW9uIGV4cHJlc3Npb25zIGV4aXN0XG4gIGlmICghaXNIYXNFeHByZXNzaW9uKHNjaGVtYSkgJiYgIW11c3RhY2hlRGlzYWJsZWQgJiYgKCFkZXBlbmRlbmNpZXMgfHwgIShkZXBlbmRlbmNpZXMgPT09IG51bGwgfHwgZGVwZW5kZW5jaWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZXBlbmRlbmNpZXMubGVuZ3RoKSkpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTWFpbiwgT2JqZWN0LmFzc2lnbih7XG4gICAgICBjb25maWdDb250ZXh0OiBjb25maWdDdHhcbiAgICB9LCBwcm9wcykpO1xuICB9XG4gIHZhciBzY2hlbWFTdHIgPSBKU09OLnN0cmluZ2lmeShzY2hlbWEpO1xuICAvLyBOZWVkIHRvIGxpc3RlbiB0byBmb3JtIHZhbHVlcyBmb3IgZHluYW1pYyByZW5kZXJpbmdcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Gb3JtLkl0ZW0sIHtcbiAgICBub1N0eWxlOiB0cnVlLFxuICAgIHNob3VsZFVwZGF0ZTogZmllbGRTaG91bGRVcGRhdGUoc2NoZW1hU3RyLCByb290UGF0aCwgZGVwZW5kZW5jaWVzLCB0cnVlKVxuICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE1haW4sIE9iamVjdC5hc3NpZ24oe1xuICAgICAgY29uZmlnQ29udGV4dDogY29uZmlnQ3R4XG4gICAgfSwgcHJvcHMpKTtcbiAgfSk7XG59KTsiLCJmdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfVxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldOyByZXR1cm4gYXJyMjsgfVxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgeyB2YXIgX2kgPSBudWxsID09IGFyciA/IG51bGwgOiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBTeW1ib2wgJiYgYXJyW1N5bWJvbC5pdGVyYXRvcl0gfHwgYXJyW1wiQEBpdGVyYXRvclwiXTsgaWYgKG51bGwgIT0gX2kpIHsgdmFyIF9zLCBfZSwgX3gsIF9yLCBfYXJyID0gW10sIF9uID0gITAsIF9kID0gITE7IHRyeSB7IGlmIChfeCA9IChfaSA9IF9pLmNhbGwoYXJyKSkubmV4dCwgMCA9PT0gaSkgeyBpZiAoT2JqZWN0KF9pKSAhPT0gX2kpIHJldHVybjsgX24gPSAhMTsgfSBlbHNlIGZvciAoOyAhKF9uID0gKF9zID0gX3guY2FsbChfaSkpLmRvbmUpICYmIChfYXJyLnB1c2goX3MudmFsdWUpLCBfYXJyLmxlbmd0aCAhPT0gaSk7IF9uID0gITApOyB9IGNhdGNoIChlcnIpIHsgX2QgPSAhMCwgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgbnVsbCAhPSBfaS5yZXR1cm4gJiYgKF9yID0gX2kucmV0dXJuKCksIE9iamVjdChfcikgIT09IF9yKSkgcmV0dXJuOyB9IGZpbmFsbHkgeyBpZiAoX2QpIHRocm93IF9lOyB9IH0gcmV0dXJuIF9hcnI7IH0gfVxuZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyOyB9XG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gKHByb3BlcnRpZXMpIHtcbiAgdmFyIG9yZGVyS2V5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAnb3JkZXInO1xuICB2YXIgb3JkZXJIYXNoID0gbmV3IE1hcCgpO1xuICAvLyBvcmRlcuS4jeS4uuaVsOWtl+eahOaVsOaNrlxuICB2YXIgdW5zb3J0ZWRMaXN0ID0gW107XG4gIHZhciBpbnNlcnQgPSBmdW5jdGlvbiBpbnNlcnQoaXRlbSkge1xuICAgIHZhciBfaXRlbSA9IF9zbGljZWRUb0FycmF5KGl0ZW0sIDIpLFxuICAgICAgdmFsdWUgPSBfaXRlbVsxXTtcbiAgICBpZiAodHlwZW9mIHZhbHVlW29yZGVyS2V5XSAhPT0gJ251bWJlcicpIHtcbiAgICAgIHVuc29ydGVkTGlzdC5wdXNoKGl0ZW0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAob3JkZXJIYXNoLmhhcyh2YWx1ZVtvcmRlcktleV0pKSB7XG4gICAgICBvcmRlckhhc2guZ2V0KHZhbHVlW29yZGVyS2V5XSkucHVzaChpdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3JkZXJIYXNoLnNldCh2YWx1ZVtvcmRlcktleV0sIFtpdGVtXSk7XG4gICAgfVxuICB9O1xuICBwcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICByZXR1cm4gaW5zZXJ0KGl0ZW0pO1xuICB9KTtcbiAgdmFyIHNvcnRlZExpc3QgPSBBcnJheS5mcm9tKG9yZGVySGFzaC5lbnRyaWVzKCkpLnNvcnQoZnVuY3Rpb24gKF9yZWYsIF9yZWYyKSB7XG4gICAgdmFyIF9yZWYzID0gX3NsaWNlZFRvQXJyYXkoX3JlZiwgMSksXG4gICAgICBvcmRlcjEgPSBfcmVmM1swXTtcbiAgICB2YXIgX3JlZjQgPSBfc2xpY2VkVG9BcnJheShfcmVmMiwgMSksXG4gICAgICBvcmRlcjIgPSBfcmVmNFswXTtcbiAgICByZXR1cm4gb3JkZXIxIC0gb3JkZXIyO1xuICB9KSAvLyBvcmRlcuWAvOi2iuWwj+i2iumdoOWJjVxuICAuZmxhdE1hcChmdW5jdGlvbiAoX3JlZjUpIHtcbiAgICB2YXIgX3JlZjYgPSBfc2xpY2VkVG9BcnJheShfcmVmNSwgMiksXG4gICAgICBpdGVtcyA9IF9yZWY2WzFdO1xuICAgIHJldHVybiBpdGVtcztcbiAgfSk7XG4gIHJldHVybiBzb3J0ZWRMaXN0LmNvbmNhdCh1bnNvcnRlZExpc3QpO1xufSk7IiwiZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOyB9XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHsgaWYgKHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgaXRlcltTeW1ib2wuaXRlcmF0b3JdICE9IG51bGwgfHwgaXRlcltcIkBAaXRlcmF0b3JcIl0gIT0gbnVsbCkgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7IH1cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KGFycik7IH1cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpOyB9XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07IHJldHVybiBhcnIyOyB9XG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7IHZhciBfaSA9IG51bGwgPT0gYXJyID8gbnVsbCA6IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiBhcnJbU3ltYm9sLml0ZXJhdG9yXSB8fCBhcnJbXCJAQGl0ZXJhdG9yXCJdOyBpZiAobnVsbCAhPSBfaSkgeyB2YXIgX3MsIF9lLCBfeCwgX3IsIF9hcnIgPSBbXSwgX24gPSAhMCwgX2QgPSAhMTsgdHJ5IHsgaWYgKF94ID0gKF9pID0gX2kuY2FsbChhcnIpKS5uZXh0LCAwID09PSBpKSB7IGlmIChPYmplY3QoX2kpICE9PSBfaSkgcmV0dXJuOyBfbiA9ICExOyB9IGVsc2UgZm9yICg7ICEoX24gPSAoX3MgPSBfeC5jYWxsKF9pKSkuZG9uZSkgJiYgKF9hcnIucHVzaChfcy52YWx1ZSksIF9hcnIubGVuZ3RoICE9PSBpKTsgX24gPSAhMCk7IH0gY2F0Y2ggKGVycikgeyBfZCA9ICEwLCBfZSA9IGVycjsgfSBmaW5hbGx5IHsgdHJ5IHsgaWYgKCFfbiAmJiBudWxsICE9IF9pLnJldHVybiAmJiAoX3IgPSBfaS5yZXR1cm4oKSwgT2JqZWN0KF9yKSAhPT0gX3IpKSByZXR1cm47IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfSB9XG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRmllbGRJdGVtIGZyb20gJy4vRmllbGRJdGVtJztcbmltcG9ydCBGaWVsZExpc3QgZnJvbSAnLi9GaWVsZExpc3QnO1xuaW1wb3J0IHNvcnRQcm9wZXJ0aWVzIGZyb20gJy4uL21vZGVscy9zb3J0UHJvcGVydGllcyc7XG5pbXBvcnQgXCIuL2luZGV4LmNzc1wiO1xuO1xuO1xudmFyIHJlbmRlckl0ZW0gPSBmdW5jdGlvbiByZW5kZXJJdGVtKHByb3BzKSB7XG4gIHZhciBfYTtcbiAgdmFyIHNjaGVtYSA9IHByb3BzLnNjaGVtYSxcbiAgICBrZXkgPSBwcm9wcy5rZXksXG4gICAgcGF0aCA9IHByb3BzLnBhdGgsXG4gICAgcm9vdFBhdGggPSBwcm9wcy5yb290UGF0aDtcbiAgLy8gcmVuZGVyIExpc3RcbiAgaWYgKHNjaGVtYS50eXBlID09PSAnYXJyYXknICYmICgoX2EgPSBzY2hlbWEuaXRlbXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50eXBlKSA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRmllbGRMaXN0LCB7XG4gICAgICBrZXk6IGtleSxcbiAgICAgIHNjaGVtYTogc2NoZW1hLFxuICAgICAgcGF0aDogcGF0aCxcbiAgICAgIHJvb3RQYXRoOiByb290UGF0aCxcbiAgICAgIHJlbmRlckNvcmU6IFJlbmRlckNvcmVcbiAgICB9KTtcbiAgfVxuICAvLyByZW5kZXIgT2JqaWVjdCB8IGZpZWxkXG4gIHZhciBjaGlsZCA9IG51bGw7XG4gIC8vIGhhcyBjaGlsZCBzY2hlbWFcbiAgaWYgKChzY2hlbWEgPT09IG51bGwgfHwgc2NoZW1hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzY2hlbWEucHJvcGVydGllcykgJiYgKHNjaGVtYSA9PT0gbnVsbCB8fCBzY2hlbWEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNjaGVtYS53aWRnZXRUeXBlKSAhPT0gJ2ZpZWxkJykge1xuICAgIGNoaWxkID0gUmVuZGVyQ29yZSh7XG4gICAgICBzY2hlbWE6IHNjaGVtYSxcbiAgICAgIHBhcmVudFBhdGg6IHBhdGgsXG4gICAgICByb290UGF0aDogcm9vdFBhdGhcbiAgICB9KTtcbiAgICBwYXRoID0gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGaWVsZEl0ZW0sIHtcbiAgICBrZXk6IGtleSxcbiAgICBzY2hlbWE6IHNjaGVtYSxcbiAgICBwYXRoOiBwYXRoLFxuICAgIHJvb3RQYXRoOiByb290UGF0aCxcbiAgICBjaGlsZHJlbjogY2hpbGQsXG4gICAgcmVuZGVyQ29yZTogUmVuZGVyQ29yZVxuICB9KTtcbn07XG52YXIgUmVuZGVyQ29yZSA9IGZ1bmN0aW9uIFJlbmRlckNvcmUocHJvcHMpIHtcbiAgdmFyIHNjaGVtYSA9IHByb3BzLnNjaGVtYSxcbiAgICBfcHJvcHMkcGFyZW50UGF0aCA9IHByb3BzLnBhcmVudFBhdGgsXG4gICAgcGFyZW50UGF0aCA9IF9wcm9wcyRwYXJlbnRQYXRoID09PSB2b2lkIDAgPyBbXSA6IF9wcm9wcyRwYXJlbnRQYXRoLFxuICAgIF9wcm9wcyRyb290UGF0aCA9IHByb3BzLnJvb3RQYXRoLFxuICAgIHJvb3RQYXRoID0gX3Byb3BzJHJvb3RQYXRoID09PSB2b2lkIDAgPyBbXSA6IF9wcm9wcyRyb290UGF0aDtcbiAgaWYgKCFzY2hlbWEgfHwgT2JqZWN0LmtleXMoc2NoZW1hKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyByZW5kZXIgTGlzdC5pdGVtXG4gIGlmIChzY2hlbWEgPT09IG51bGwgfHwgc2NoZW1hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzY2hlbWEuaXRlbXMpIHtcbiAgICByZXR1cm4gcmVuZGVySXRlbSh7XG4gICAgICBzY2hlbWE6IHNjaGVtYS5pdGVtcyxcbiAgICAgIHBhdGg6IHBhcmVudFBhdGgsXG4gICAgICByb290UGF0aDogcm9vdFBhdGhcbiAgICB9KTtcbiAgfVxuICAvLyByZW5kZXIgT2JqaWVjdCB8IGZpZWxkXG4gIHJldHVybiBzb3J0UHJvcGVydGllcyhPYmplY3QuZW50cmllcyhzY2hlbWEucHJvcGVydGllcyB8fCB7fSkpLm1hcChmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBfcmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDIpLFxuICAgICAga2V5ID0gX3JlZjJbMF0sXG4gICAgICBpdGVtID0gX3JlZjJbMV07XG4gICAgdmFyIHBhdGggPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHBhcmVudFBhdGgpLCBba2V5XSk7XG4gICAgcmV0dXJuIHJlbmRlckl0ZW0oe1xuICAgICAgc2NoZW1hOiBpdGVtLFxuICAgICAgcGF0aDogcGF0aCxcbiAgICAgIGtleToga2V5LFxuICAgICAgcm9vdFBhdGg6IHJvb3RQYXRoXG4gICAgfSk7XG4gIH0pO1xufTtcbmV4cG9ydCBkZWZhdWx0IFJlbmRlckNvcmU7IiwiZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH0sIF90eXBlb2Yob2JqKTsgfVxuaW1wb3J0IFwiYW50ZC9lcy9idXR0b24vc3R5bGVcIjtcbmltcG9ydCBfQnV0dG9uIGZyb20gXCJhbnRkL2VzL2J1dHRvblwiO1xuaW1wb3J0IFwiYW50ZC9lcy9zcGFjZS9zdHlsZVwiO1xuaW1wb3J0IF9TcGFjZSBmcm9tIFwiYW50ZC9lcy9zcGFjZVwiO1xuaW1wb3J0IFwiYW50ZC9lcy9jb2wvc3R5bGVcIjtcbmltcG9ydCBfQ29sIGZyb20gXCJhbnRkL2VzL2NvbFwiO1xuaW1wb3J0IFwiYW50ZC9lcy9yb3cvc3R5bGVcIjtcbmltcG9ydCBfUm93IGZyb20gXCJhbnRkL2VzL3Jvd1wiO1xuaW1wb3J0IFwiYW50ZC9lcy9mb3JtL3N0eWxlXCI7XG5pbXBvcnQgX0Zvcm0gZnJvbSBcImFudGQvZXMvZm9ybVwiO1xuaW1wb3J0IFwiYW50ZC9lcy9jb25maWctcHJvdmlkZXIvc3R5bGVcIjtcbmltcG9ydCBfQ29uZmlnUHJvdmlkZXIgZnJvbSBcImFudGQvZXMvY29uZmlnLXByb3ZpZGVyXCI7XG5mdW5jdGlvbiBfcmVnZW5lcmF0b3JSdW50aW1lKCkgeyBcInVzZSBzdHJpY3RcIjsgLyohIHJlZ2VuZXJhdG9yLXJ1bnRpbWUgLS0gQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuIC0tIGxpY2Vuc2UgKE1JVCk6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9ibG9iL21haW4vTElDRU5TRSAqLyBfcmVnZW5lcmF0b3JSdW50aW1lID0gZnVuY3Rpb24gX3JlZ2VuZXJhdG9yUnVudGltZSgpIHsgcmV0dXJuIGV4cG9ydHM7IH07IHZhciBleHBvcnRzID0ge30sIE9wID0gT2JqZWN0LnByb3RvdHlwZSwgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHksIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5IHx8IGZ1bmN0aW9uIChvYmosIGtleSwgZGVzYykgeyBvYmpba2V5XSA9IGRlc2MudmFsdWU7IH0sICRTeW1ib2wgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCA/IFN5bWJvbCA6IHt9LCBpdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuaXRlcmF0b3IgfHwgXCJAQGl0ZXJhdG9yXCIsIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIiwgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiOyBmdW5jdGlvbiBkZWZpbmUob2JqLCBrZXksIHZhbHVlKSB7IHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiAhMCwgY29uZmlndXJhYmxlOiAhMCwgd3JpdGFibGU6ICEwIH0pLCBvYmpba2V5XTsgfSB0cnkgeyBkZWZpbmUoe30sIFwiXCIpOyB9IGNhdGNoIChlcnIpIHsgZGVmaW5lID0gZnVuY3Rpb24gZGVmaW5lKG9iaiwga2V5LCB2YWx1ZSkgeyByZXR1cm4gb2JqW2tleV0gPSB2YWx1ZTsgfTsgfSBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7IHZhciBwcm90b0dlbmVyYXRvciA9IG91dGVyRm4gJiYgb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBvdXRlckZuIDogR2VuZXJhdG9yLCBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSksIGNvbnRleHQgPSBuZXcgQ29udGV4dCh0cnlMb2NzTGlzdCB8fCBbXSk7IHJldHVybiBkZWZpbmVQcm9wZXJ0eShnZW5lcmF0b3IsIFwiX2ludm9rZVwiLCB7IHZhbHVlOiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIH0pLCBnZW5lcmF0b3I7IH0gZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7IHRyeSB7IHJldHVybiB7IHR5cGU6IFwibm9ybWFsXCIsIGFyZzogZm4uY2FsbChvYmosIGFyZykgfTsgfSBjYXRjaCAoZXJyKSB7IHJldHVybiB7IHR5cGU6IFwidGhyb3dcIiwgYXJnOiBlcnIgfTsgfSB9IGV4cG9ydHMud3JhcCA9IHdyYXA7IHZhciBDb250aW51ZVNlbnRpbmVsID0ge307IGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9IGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge30gZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fSB2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTsgZGVmaW5lKEl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSk7IHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiwgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90byAmJiBnZXRQcm90byhnZXRQcm90byh2YWx1ZXMoW10pKSk7IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJiBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpICYmIChJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlKTsgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID0gR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpOyBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7IFtcIm5leHRcIiwgXCJ0aHJvd1wiLCBcInJldHVyblwiXS5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHsgZGVmaW5lKHByb3RvdHlwZSwgbWV0aG9kLCBmdW5jdGlvbiAoYXJnKSB7IHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpOyB9KTsgfSk7IH0gZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7IGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7IHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpOyBpZiAoXCJ0aHJvd1wiICE9PSByZWNvcmQudHlwZSkgeyB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZywgdmFsdWUgPSByZXN1bHQudmFsdWU7IHJldHVybiB2YWx1ZSAmJiBcIm9iamVjdFwiID09IF90eXBlb2YodmFsdWUpICYmIGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIikgPyBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7IGludm9rZShcIm5leHRcIiwgdmFsdWUsIHJlc29sdmUsIHJlamVjdCk7IH0sIGZ1bmN0aW9uIChlcnIpIHsgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpOyB9KSA6IFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24gKHVud3JhcHBlZCkgeyByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQsIHJlc29sdmUocmVzdWx0KTsgfSwgZnVuY3Rpb24gKGVycm9yKSB7IHJldHVybiBpbnZva2UoXCJ0aHJvd1wiLCBlcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTsgfSk7IH0gcmVqZWN0KHJlY29yZC5hcmcpOyB9IHZhciBwcmV2aW91c1Byb21pc2U7IGRlZmluZVByb3BlcnR5KHRoaXMsIFwiX2ludm9rZVwiLCB7IHZhbHVlOiBmdW5jdGlvbiB2YWx1ZShtZXRob2QsIGFyZykgeyBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHsgcmV0dXJuIG5ldyBQcm9taXNlSW1wbChmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KTsgfSk7IH0gcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9IHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLCBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZykgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpOyB9IH0pOyB9IGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkgeyB2YXIgc3RhdGUgPSBcInN1c3BlbmRlZFN0YXJ0XCI7IHJldHVybiBmdW5jdGlvbiAobWV0aG9kLCBhcmcpIHsgaWYgKFwiZXhlY3V0aW5nXCIgPT09IHN0YXRlKSB0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nXCIpOyBpZiAoXCJjb21wbGV0ZWRcIiA9PT0gc3RhdGUpIHsgaWYgKFwidGhyb3dcIiA9PT0gbWV0aG9kKSB0aHJvdyBhcmc7IHJldHVybiBkb25lUmVzdWx0KCk7IH0gZm9yIChjb250ZXh0Lm1ldGhvZCA9IG1ldGhvZCwgY29udGV4dC5hcmcgPSBhcmc7OykgeyB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlOyBpZiAoZGVsZWdhdGUpIHsgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7IGlmIChkZWxlZ2F0ZVJlc3VsdCkgeyBpZiAoZGVsZWdhdGVSZXN1bHQgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlOyByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7IH0gfSBpZiAoXCJuZXh0XCIgPT09IGNvbnRleHQubWV0aG9kKSBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7ZWxzZSBpZiAoXCJ0aHJvd1wiID09PSBjb250ZXh0Lm1ldGhvZCkgeyBpZiAoXCJzdXNwZW5kZWRTdGFydFwiID09PSBzdGF0ZSkgdGhyb3cgc3RhdGUgPSBcImNvbXBsZXRlZFwiLCBjb250ZXh0LmFyZzsgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7IH0gZWxzZSBcInJldHVyblwiID09PSBjb250ZXh0Lm1ldGhvZCAmJiBjb250ZXh0LmFicnVwdChcInJldHVyblwiLCBjb250ZXh0LmFyZyk7IHN0YXRlID0gXCJleGVjdXRpbmdcIjsgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpOyBpZiAoXCJub3JtYWxcIiA9PT0gcmVjb3JkLnR5cGUpIHsgaWYgKHN0YXRlID0gY29udGV4dC5kb25lID8gXCJjb21wbGV0ZWRcIiA6IFwic3VzcGVuZGVkWWllbGRcIiwgcmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7IHJldHVybiB7IHZhbHVlOiByZWNvcmQuYXJnLCBkb25lOiBjb250ZXh0LmRvbmUgfTsgfSBcInRocm93XCIgPT09IHJlY29yZC50eXBlICYmIChzdGF0ZSA9IFwiY29tcGxldGVkXCIsIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiLCBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmcpOyB9IH07IH0gZnVuY3Rpb24gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCkgeyB2YXIgbWV0aG9kTmFtZSA9IGNvbnRleHQubWV0aG9kLCBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvclttZXRob2ROYW1lXTsgaWYgKHVuZGVmaW5lZCA9PT0gbWV0aG9kKSByZXR1cm4gY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIFwidGhyb3dcIiA9PT0gbWV0aG9kTmFtZSAmJiBkZWxlZ2F0ZS5pdGVyYXRvci5yZXR1cm4gJiYgKGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIiwgY29udGV4dC5hcmcgPSB1bmRlZmluZWQsIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpLCBcInRocm93XCIgPT09IGNvbnRleHQubWV0aG9kKSB8fCBcInJldHVyblwiICE9PSBtZXRob2ROYW1lICYmIChjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIiwgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAnXCIgKyBtZXRob2ROYW1lICsgXCInIG1ldGhvZFwiKSksIENvbnRpbnVlU2VudGluZWw7IHZhciByZWNvcmQgPSB0cnlDYXRjaChtZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBjb250ZXh0LmFyZyk7IGlmIChcInRocm93XCIgPT09IHJlY29yZC50eXBlKSByZXR1cm4gY29udGV4dC5tZXRob2QgPSBcInRocm93XCIsIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZywgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWw7IHZhciBpbmZvID0gcmVjb3JkLmFyZzsgcmV0dXJuIGluZm8gPyBpbmZvLmRvbmUgPyAoY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWUsIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2MsIFwicmV0dXJuXCIgIT09IGNvbnRleHQubWV0aG9kICYmIChjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiLCBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCksIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsLCBDb250aW51ZVNlbnRpbmVsKSA6IGluZm8gOiAoY29udGV4dC5tZXRob2QgPSBcInRocm93XCIsIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpLCBjb250ZXh0LmRlbGVnYXRlID0gbnVsbCwgQ29udGludWVTZW50aW5lbCk7IH0gZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHsgdmFyIGVudHJ5ID0geyB0cnlMb2M6IGxvY3NbMF0gfTsgMSBpbiBsb2NzICYmIChlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV0pLCAyIGluIGxvY3MgJiYgKGVudHJ5LmZpbmFsbHlMb2MgPSBsb2NzWzJdLCBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM10pLCB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7IH0gZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkgeyB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTsgcmVjb3JkLnR5cGUgPSBcIm5vcm1hbFwiLCBkZWxldGUgcmVjb3JkLmFyZywgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDsgfSBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7IHRoaXMudHJ5RW50cmllcyA9IFt7IHRyeUxvYzogXCJyb290XCIgfV0sIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKSwgdGhpcy5yZXNldCghMCk7IH0gZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7IGlmIChpdGVyYWJsZSkgeyB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07IGlmIChpdGVyYXRvck1ldGhvZCkgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpOyBpZiAoXCJmdW5jdGlvblwiID09IHR5cGVvZiBpdGVyYWJsZS5uZXh0KSByZXR1cm4gaXRlcmFibGU7IGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkgeyB2YXIgaSA9IC0xLCBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHsgZm9yICg7ICsraSA8IGl0ZXJhYmxlLmxlbmd0aDspIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHJldHVybiBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV0sIG5leHQuZG9uZSA9ICExLCBuZXh0OyByZXR1cm4gbmV4dC52YWx1ZSA9IHVuZGVmaW5lZCwgbmV4dC5kb25lID0gITAsIG5leHQ7IH07IHJldHVybiBuZXh0Lm5leHQgPSBuZXh0OyB9IH0gcmV0dXJuIHsgbmV4dDogZG9uZVJlc3VsdCB9OyB9IGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7IHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6ICEwIH07IH0gcmV0dXJuIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCBkZWZpbmVQcm9wZXJ0eShHcCwgXCJjb25zdHJ1Y3RvclwiLCB7IHZhbHVlOiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgY29uZmlndXJhYmxlOiAhMCB9KSwgZGVmaW5lUHJvcGVydHkoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIFwiY29uc3RydWN0b3JcIiwgeyB2YWx1ZTogR2VuZXJhdG9yRnVuY3Rpb24sIGNvbmZpZ3VyYWJsZTogITAgfSksIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gZGVmaW5lKEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCB0b1N0cmluZ1RhZ1N5bWJvbCwgXCJHZW5lcmF0b3JGdW5jdGlvblwiKSwgZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24gKGdlbkZ1bikgeyB2YXIgY3RvciA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgZ2VuRnVuICYmIGdlbkZ1bi5jb25zdHJ1Y3RvcjsgcmV0dXJuICEhY3RvciAmJiAoY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHwgXCJHZW5lcmF0b3JGdW5jdGlvblwiID09PSAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpKTsgfSwgZXhwb3J0cy5tYXJrID0gZnVuY3Rpb24gKGdlbkZ1bikgeyByZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpIDogKGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgZGVmaW5lKGdlbkZ1biwgdG9TdHJpbmdUYWdTeW1ib2wsIFwiR2VuZXJhdG9yRnVuY3Rpb25cIikpLCBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCksIGdlbkZ1bjsgfSwgZXhwb3J0cy5hd3JhcCA9IGZ1bmN0aW9uIChhcmcpIHsgcmV0dXJuIHsgX19hd2FpdDogYXJnIH07IH0sIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSksIGRlZmluZShBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSwgYXN5bmNJdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSksIGV4cG9ydHMuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3IsIGV4cG9ydHMuYXN5bmMgPSBmdW5jdGlvbiAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QsIFByb21pc2VJbXBsKSB7IHZvaWQgMCA9PT0gUHJvbWlzZUltcGwgJiYgKFByb21pc2VJbXBsID0gUHJvbWlzZSk7IHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3Iod3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCksIFByb21pc2VJbXBsKTsgcmV0dXJuIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKSA/IGl0ZXIgOiBpdGVyLm5leHQoKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7IH0pOyB9LCBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApLCBkZWZpbmUoR3AsIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvclwiKSwgZGVmaW5lKEdwLCBpdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSksIGRlZmluZShHcCwgXCJ0b1N0cmluZ1wiLCBmdW5jdGlvbiAoKSB7IHJldHVybiBcIltvYmplY3QgR2VuZXJhdG9yXVwiOyB9KSwgZXhwb3J0cy5rZXlzID0gZnVuY3Rpb24gKHZhbCkgeyB2YXIgb2JqZWN0ID0gT2JqZWN0KHZhbCksIGtleXMgPSBbXTsgZm9yICh2YXIga2V5IGluIG9iamVjdCkga2V5cy5wdXNoKGtleSk7IHJldHVybiBrZXlzLnJldmVyc2UoKSwgZnVuY3Rpb24gbmV4dCgpIHsgZm9yICg7IGtleXMubGVuZ3RoOykgeyB2YXIga2V5ID0ga2V5cy5wb3AoKTsgaWYgKGtleSBpbiBvYmplY3QpIHJldHVybiBuZXh0LnZhbHVlID0ga2V5LCBuZXh0LmRvbmUgPSAhMSwgbmV4dDsgfSByZXR1cm4gbmV4dC5kb25lID0gITAsIG5leHQ7IH07IH0sIGV4cG9ydHMudmFsdWVzID0gdmFsdWVzLCBDb250ZXh0LnByb3RvdHlwZSA9IHsgY29uc3RydWN0b3I6IENvbnRleHQsIHJlc2V0OiBmdW5jdGlvbiByZXNldChza2lwVGVtcFJlc2V0KSB7IGlmICh0aGlzLnByZXYgPSAwLCB0aGlzLm5leHQgPSAwLCB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkLCB0aGlzLmRvbmUgPSAhMSwgdGhpcy5kZWxlZ2F0ZSA9IG51bGwsIHRoaXMubWV0aG9kID0gXCJuZXh0XCIsIHRoaXMuYXJnID0gdW5kZWZpbmVkLCB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KSwgIXNraXBUZW1wUmVzZXQpIGZvciAodmFyIG5hbWUgaW4gdGhpcykgXCJ0XCIgPT09IG5hbWUuY2hhckF0KDApICYmIGhhc093bi5jYWxsKHRoaXMsIG5hbWUpICYmICFpc05hTigrbmFtZS5zbGljZSgxKSkgJiYgKHRoaXNbbmFtZV0gPSB1bmRlZmluZWQpOyB9LCBzdG9wOiBmdW5jdGlvbiBzdG9wKCkgeyB0aGlzLmRvbmUgPSAhMDsgdmFyIHJvb3RSZWNvcmQgPSB0aGlzLnRyeUVudHJpZXNbMF0uY29tcGxldGlvbjsgaWYgKFwidGhyb3dcIiA9PT0gcm9vdFJlY29yZC50eXBlKSB0aHJvdyByb290UmVjb3JkLmFyZzsgcmV0dXJuIHRoaXMucnZhbDsgfSwgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uIGRpc3BhdGNoRXhjZXB0aW9uKGV4Y2VwdGlvbikgeyBpZiAodGhpcy5kb25lKSB0aHJvdyBleGNlcHRpb247IHZhciBjb250ZXh0ID0gdGhpczsgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7IHJldHVybiByZWNvcmQudHlwZSA9IFwidGhyb3dcIiwgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbiwgY29udGV4dC5uZXh0ID0gbG9jLCBjYXVnaHQgJiYgKGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCIsIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkKSwgISFjYXVnaHQ7IH0gZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgeyB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV0sIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247IGlmIChcInJvb3RcIiA9PT0gZW50cnkudHJ5TG9jKSByZXR1cm4gaGFuZGxlKFwiZW5kXCIpOyBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikgeyB2YXIgaGFzQ2F0Y2ggPSBoYXNPd24uY2FsbChlbnRyeSwgXCJjYXRjaExvY1wiKSwgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIik7IGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7IGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgITApOyBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTsgfSBlbHNlIGlmIChoYXNDYXRjaCkgeyBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsICEwKTsgfSBlbHNlIHsgaWYgKCFoYXNGaW5hbGx5KSB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTsgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7IH0gfSB9IH0sIGFicnVwdDogZnVuY3Rpb24gYWJydXB0KHR5cGUsIGFyZykgeyBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7IHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYgJiYgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJiB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7IHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTsgYnJlYWs7IH0gfSBmaW5hbGx5RW50cnkgJiYgKFwiYnJlYWtcIiA9PT0gdHlwZSB8fCBcImNvbnRpbnVlXCIgPT09IHR5cGUpICYmIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYyAmJiAoZmluYWxseUVudHJ5ID0gbnVsbCk7IHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9OyByZXR1cm4gcmVjb3JkLnR5cGUgPSB0eXBlLCByZWNvcmQuYXJnID0gYXJnLCBmaW5hbGx5RW50cnkgPyAodGhpcy5tZXRob2QgPSBcIm5leHRcIiwgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MsIENvbnRpbnVlU2VudGluZWwpIDogdGhpcy5jb21wbGV0ZShyZWNvcmQpOyB9LCBjb21wbGV0ZTogZnVuY3Rpb24gY29tcGxldGUocmVjb3JkLCBhZnRlckxvYykgeyBpZiAoXCJ0aHJvd1wiID09PSByZWNvcmQudHlwZSkgdGhyb3cgcmVjb3JkLmFyZzsgcmV0dXJuIFwiYnJlYWtcIiA9PT0gcmVjb3JkLnR5cGUgfHwgXCJjb250aW51ZVwiID09PSByZWNvcmQudHlwZSA/IHRoaXMubmV4dCA9IHJlY29yZC5hcmcgOiBcInJldHVyblwiID09PSByZWNvcmQudHlwZSA/ICh0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHJlY29yZC5hcmcsIHRoaXMubWV0aG9kID0gXCJyZXR1cm5cIiwgdGhpcy5uZXh0ID0gXCJlbmRcIikgOiBcIm5vcm1hbFwiID09PSByZWNvcmQudHlwZSAmJiBhZnRlckxvYyAmJiAodGhpcy5uZXh0ID0gYWZ0ZXJMb2MpLCBDb250aW51ZVNlbnRpbmVsOyB9LCBmaW5pc2g6IGZ1bmN0aW9uIGZpbmlzaChmaW5hbGx5TG9jKSB7IGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldOyBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykgcmV0dXJuIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpLCByZXNldFRyeUVudHJ5KGVudHJ5KSwgQ29udGludWVTZW50aW5lbDsgfSB9LCBjYXRjaDogZnVuY3Rpb24gX2NhdGNoKHRyeUxvYykgeyBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7IHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsgaWYgKGVudHJ5LnRyeUxvYyA9PT0gdHJ5TG9jKSB7IHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uOyBpZiAoXCJ0aHJvd1wiID09PSByZWNvcmQudHlwZSkgeyB2YXIgdGhyb3duID0gcmVjb3JkLmFyZzsgcmVzZXRUcnlFbnRyeShlbnRyeSk7IH0gcmV0dXJuIHRocm93bjsgfSB9IHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTsgfSwgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24gZGVsZWdhdGVZaWVsZChpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykgeyByZXR1cm4gdGhpcy5kZWxlZ2F0ZSA9IHsgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsIG5leHRMb2M6IG5leHRMb2MgfSwgXCJuZXh0XCIgPT09IHRoaXMubWV0aG9kICYmICh0aGlzLmFyZyA9IHVuZGVmaW5lZCksIENvbnRpbnVlU2VudGluZWw7IH0gfSwgZXhwb3J0czsgfVxuaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VTdG9yZSB9IGZyb20gJ3p1c3RhbmQnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgeyB2YWx1ZVJlbW92ZVVuZGVmaW5lZCwgX2Nsb25lRGVlcCwgdHJhbnNsYXRpb24sIGlzRnVuY3Rpb24gfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBGUkNvbnRleHQgfSBmcm9tICcuLi9tb2RlbHMvY29udGV4dCc7XG5pbXBvcnQgdHJhbnNmb3JtUHJvcHMgZnJvbSAnLi4vbW9kZWxzL3RyYW5zZm9ybVByb3BzJztcbmltcG9ydCB7IHBhcnNlVmFsdWVzVG9CaW5kIH0gZnJvbSAnLi4vbW9kZWxzL2JpbmRWYWx1ZXMnO1xuaW1wb3J0IHsgZ2V0Rm9ybUl0ZW1MYXlvdXQgfSBmcm9tICcuLi9tb2RlbHMvbGF5b3V0JztcbmltcG9ydCB7IHZhbHVlc1dhdGNoLCBpbW1lZGlhdGVXYXRjaCwgeXltbWRkLCBtc1RvVGltZSwgZ2V0U2Vzc2lvbkl0ZW0sIHNldFNlc3Npb25JdGVtIH0gZnJvbSAnLi4vbW9kZWxzL2Zvcm1Db3JlVXRpbHMnO1xuaW1wb3J0IFJlbmRlckNvcmUgZnJvbSAnLi4vcmVuZGVyLWNvcmUnO1xuaW1wb3J0IFwiLi9pbmRleC5jc3NcIjtcbnZhciBGb3JtQ29yZSA9IGZ1bmN0aW9uIEZvcm1Db3JlKHByb3BzKSB7XG4gIHZhciBfYSwgX2IsIF9jLCBfZCwgX2U7XG4gIHZhciBzdG9yZSA9IHVzZUNvbnRleHQoRlJDb250ZXh0KTtcbiAgdmFyIHNjaGVtYSA9IHVzZVN0b3JlKHN0b3JlLCBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGUuc2NoZW1hO1xuICB9KTtcbiAgdmFyIGZsYXR0ZW5TY2hlbWEgPSB1c2VTdG9yZShzdG9yZSwgZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlLmZsYXR0ZW5TY2hlbWE7XG4gIH0pO1xuICB2YXIgc2V0Q29udGV4dCA9IHVzZVN0b3JlKHN0b3JlLCBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGUuc2V0Q29udGV4dDtcbiAgfSk7XG4gIHZhciBjb25maWdDdHggPSB1c2VDb250ZXh0KF9Db25maWdQcm92aWRlci5Db25maWdDb250ZXh0KTtcbiAgdmFyIHQgPSB0cmFuc2xhdGlvbihjb25maWdDdHgpO1xuICB2YXIgX2YgPSBzY2hlbWEgfHwge30sXG4gICAgdHlwZSA9IF9mLnR5cGUsXG4gICAgcHJvcGVydGllcyA9IF9mLnByb3BlcnRpZXMsXG4gICAgc2NoZW1Qcm9wcyA9IF9fcmVzdChfZiwgW1widHlwZVwiLCBcInByb3BlcnRpZXNcIl0pO1xuICB2YXIgX3RyYW5zZm9ybVByb3BzID0gdHJhbnNmb3JtUHJvcHMoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcm9wcyksIHNjaGVtUHJvcHMpKSxcbiAgICBmb3JtUHJvcHMgPSBfdHJhbnNmb3JtUHJvcHMuZm9ybVByb3BzLFxuICAgIGRpc3BsYXlUeXBlID0gX3RyYW5zZm9ybVByb3BzLmRpc3BsYXlUeXBlLFxuICAgIGJlZm9yZUZpbmlzaCA9IF90cmFuc2Zvcm1Qcm9wcy5iZWZvcmVGaW5pc2gsXG4gICAgd2F0Y2ggPSBfdHJhbnNmb3JtUHJvcHMud2F0Y2gsXG4gICAgb25Nb3VudCA9IF90cmFuc2Zvcm1Qcm9wcy5vbk1vdW50LFxuICAgIGNvbHVtbiA9IF90cmFuc2Zvcm1Qcm9wcy5jb2x1bW4sXG4gICAgbGFiZWxXaWR0aCA9IF90cmFuc2Zvcm1Qcm9wcy5sYWJlbFdpZHRoLFxuICAgIGxhYmVsQ29sID0gX3RyYW5zZm9ybVByb3BzLmxhYmVsQ29sLFxuICAgIGZpZWxkQ29sID0gX3RyYW5zZm9ybVByb3BzLmZpZWxkQ29sLFxuICAgIG1heFdpZHRoID0gX3RyYW5zZm9ybVByb3BzLm1heFdpZHRoLFxuICAgIGZvcm0gPSBfdHJhbnNmb3JtUHJvcHMuZm9ybSxcbiAgICBvbkZpbmlzaCA9IF90cmFuc2Zvcm1Qcm9wcy5vbkZpbmlzaCxcbiAgICBvbkZpbmlzaEZhaWxlZCA9IF90cmFuc2Zvcm1Qcm9wcy5vbkZpbmlzaEZhaWxlZCxcbiAgICByZWFkT25seSA9IF90cmFuc2Zvcm1Qcm9wcy5yZWFkT25seSxcbiAgICBkaXNhYmxlZCA9IF90cmFuc2Zvcm1Qcm9wcy5kaXNhYmxlZCxcbiAgICBmb290ZXIgPSBfdHJhbnNmb3JtUHJvcHMuZm9vdGVyLFxuICAgIHJlbW92ZUhpZGRlbkRhdGEgPSBfdHJhbnNmb3JtUHJvcHMucmVtb3ZlSGlkZGVuRGF0YSxcbiAgICBvcGVyYXRlRXh0cmEgPSBfdHJhbnNmb3JtUHJvcHMub3BlcmF0ZUV4dHJhLFxuICAgIGxvZ09uTW91bnQgPSBfdHJhbnNmb3JtUHJvcHMubG9nT25Nb3VudCxcbiAgICBsb2dPblN1Ym1pdCA9IF90cmFuc2Zvcm1Qcm9wcy5sb2dPblN1Ym1pdCxcbiAgICBpZCA9IF90cmFuc2Zvcm1Qcm9wcy5pZCxcbiAgICBjbGFzc05hbWUgPSBfdHJhbnNmb3JtUHJvcHMuY2xhc3NOYW1lLFxuICAgIHZhbGlkYXRlVHJpZ2dlciA9IF90cmFuc2Zvcm1Qcm9wcy52YWxpZGF0ZVRyaWdnZXI7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgZm9ybS5fX2luaXRTdG9yZShzdG9yZSk7XG4gICAgc2V0VGltZW91dChpbml0aWFsLCAwKTtcbiAgfSwgW10pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGZvcm0uc2V0U2NoZW1hKHByb3BzLnNjaGVtYSwgdHJ1ZSk7XG4gIH0sIFtKU09OLnN0cmluZ2lmeShwcm9wcy5zY2hlbWEgfHwge30pXSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNvbnRleHQgPSB7XG4gICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgIHJlYWRPbmx5OiByZWFkT25seSxcbiAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgIGxhYmVsV2lkdGg6IGxhYmVsV2lkdGgsXG4gICAgICBkaXNwbGF5VHlwZTogZGlzcGxheVR5cGUsXG4gICAgICBsYWJlbENvbDogbGFiZWxDb2wsXG4gICAgICBmaWVsZENvbDogZmllbGRDb2wsXG4gICAgICBtYXhXaWR0aDogbWF4V2lkdGgsXG4gICAgICB2YWxpZGF0ZVRyaWdnZXI6IHZhbGlkYXRlVHJpZ2dlclxuICAgIH07XG4gICAgc2V0Q29udGV4dChjb250ZXh0KTtcbiAgfSwgW2NvbHVtbiwgbGFiZWxDb2wsIGZpZWxkQ29sLCBkaXNwbGF5VHlwZSwgbGFiZWxXaWR0aCwgbWF4V2lkdGgsIHJlYWRPbmx5LCBkaXNhYmxlZCwgdmFsaWRhdGVUcmlnZ2VyXSk7XG4gIHZhciBpbml0aWFsID0gZnVuY3Rpb24gaW5pdGlhbCgpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlKCkge1xuICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgX2NvbnRleHQudDAgPSBvbk1vdW50O1xuICAgICAgICAgICAgaWYgKCFfY29udGV4dC50MCkge1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNDtcbiAgICAgICAgICAgIHJldHVybiBvbk1vdW50KCk7XG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgb25Nb3VudExvZ2dlcigpO1xuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBmb3JtLmdldFZhbHVlcygpO1xuICAgICAgICAgICAgICBpbW1lZGlhdGVXYXRjaCh3YXRjaCwgdmFsdWVzKTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9LCBfY2FsbGVlKTtcbiAgICB9KSk7XG4gIH07XG4gIHZhciBvbk1vdW50TG9nZ2VyID0gZnVuY3Rpb24gb25Nb3VudExvZ2dlcigpIHtcbiAgICB2YXIgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICBpZiAoaXNGdW5jdGlvbihsb2dPbk1vdW50KSB8fCBpc0Z1bmN0aW9uKGxvZ09uU3VibWl0KSkge1xuICAgICAgc2V0U2Vzc2lvbkl0ZW0oJ0ZPUk1fTU9VTlRfVElNRScsIHN0YXJ0KTtcbiAgICAgIHNldFNlc3Npb25JdGVtKCdGT1JNX1NUQVJUJywgc3RhcnQpO1xuICAgIH1cbiAgICBpZiAoaXNGdW5jdGlvbihsb2dPbk1vdW50KSkge1xuICAgICAgdmFyIGxvZ1BhcmFtcyA9IHtcbiAgICAgICAgc2NoZW1hOiBwcm9wcy5zY2hlbWEsXG4gICAgICAgIHVybDogbG9jYXRpb24uaHJlZixcbiAgICAgICAgZm9ybURhdGE6IEpTT04uc3RyaW5naWZ5KGZvcm0uZ2V0VmFsdWVzKCkpLFxuICAgICAgICBmb3JtTW91bnQ6IHl5bW1kZChzdGFydClcbiAgICAgIH07XG4gICAgICBpZiAoaWQpIHtcbiAgICAgICAgbG9nUGFyYW1zLmlkID0gaWQ7XG4gICAgICB9XG4gICAgICBsb2dPbk1vdW50KGxvZ1BhcmFtcyk7XG4gICAgfVxuICAgIC8vIOWmguaenOaYr+imgeiuoeeul+aXtumXtO+8jOWcqCBvbk1vdW50IOaXtuWtmOS4gOS4quaXtumXtOaIs1xuICAgIGlmIChpc0Z1bmN0aW9uKGxvZ09uU3VibWl0KSkge1xuICAgICAgc2V0U2Vzc2lvbkl0ZW0oJ05VTUJFUl9PRl9TVUJNSVRTJywgMCk7XG4gICAgICBzZXRTZXNzaW9uSXRlbSgnRkFJTEVEX0FUVEVNUFRTJywgMCk7XG4gICAgfVxuICB9O1xuICB2YXIgb25TdWJtaXRMb2dnZXIgPSBmdW5jdGlvbiBvblN1Ym1pdExvZ2dlcihwYXJhbXMpIHtcbiAgICBpZiAoIWlzRnVuY3Rpb24obG9nT25TdWJtaXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBzdGFydCA9IGdldFNlc3Npb25JdGVtKCdGT1JNX1NUQVJUJyk7XG4gICAgdmFyIG1vdW50ID0gZ2V0U2Vzc2lvbkl0ZW0oJ0ZPUk1fTU9VTlRfVElNRScpO1xuICAgIHZhciBudW1iZXJPZlN1Ym1pdHMgPSBnZXRTZXNzaW9uSXRlbSgnTlVNQkVSX09GX1NVQk1JVFMnKSArIDE7XG4gICAgdmFyIGVuZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIHZhciBmYWlsZWRBdHRlbXB0cyA9IGdldFNlc3Npb25JdGVtKCdGQUlMRURfQVRURU1QVFMnKTtcbiAgICBpZiAocGFyYW1zLmVycm9yRmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZhaWxlZEF0dGVtcHRzID0gZmFpbGVkQXR0ZW1wdHMgKyAxO1xuICAgIH1cbiAgICB2YXIgbG9nUGFyYW1zID0ge1xuICAgICAgZm9ybU1vdW50OiB5eW1tZGQobW91bnQpLFxuICAgICAgbXM6IGVuZCAtIHN0YXJ0LFxuICAgICAgZHVyYXRpb246IG1zVG9UaW1lKGVuZCAtIHN0YXJ0KSxcbiAgICAgIG51bWJlck9mU3VibWl0czogbnVtYmVyT2ZTdWJtaXRzLFxuICAgICAgZmFpbGVkQXR0ZW1wdHM6IGZhaWxlZEF0dGVtcHRzLFxuICAgICAgdXJsOiBsb2NhdGlvbi5ocmVmLFxuICAgICAgZm9ybURhdGE6IEpTT04uc3RyaW5naWZ5KHBhcmFtcy52YWx1ZXMpLFxuICAgICAgZXJyb3JzOiBKU09OLnN0cmluZ2lmeShwYXJhbXMuZXJyb3JGaWVsZHMpLFxuICAgICAgc2NoZW1hOiBKU09OLnN0cmluZ2lmeShzY2hlbWEpXG4gICAgfTtcbiAgICBpZiAoaWQpIHtcbiAgICAgIGxvZ1BhcmFtcy5pZCA9IGlkO1xuICAgIH1cbiAgICBsb2dPblN1Ym1pdChsb2dQYXJhbXMpO1xuICAgIHNldFNlc3Npb25JdGVtKCdGT1JNX1NUQVJUJywgZW5kKTtcbiAgICBzZXRTZXNzaW9uSXRlbSgnTlVNQkVSX09GX1NVQk1JVFMnLCBudW1iZXJPZlN1Ym1pdHMpO1xuICAgIHNldFNlc3Npb25JdGVtKCdGQUlMRURfQVRURU1QVFMnLCBmYWlsZWRBdHRlbXB0cyk7XG4gIH07XG4gIHZhciBoYW5kbGVWYWx1ZXNDaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVWYWx1ZXNDaGFuZ2UoY2hhbmdlZFZhbHVlcywgX2FsbFZhbHVlcykge1xuICAgIHZhciBhbGxWYWx1ZXMgPSB2YWx1ZVJlbW92ZVVuZGVmaW5lZChfYWxsVmFsdWVzLCB0cnVlKTtcbiAgICB2YWx1ZXNXYXRjaChjaGFuZ2VkVmFsdWVzLCBhbGxWYWx1ZXMsIHdhdGNoKTtcbiAgfTtcbiAgdmFyIGhhbmRsZUZpbmlzaCA9IGZ1bmN0aW9uIGhhbmRsZUZpbmlzaChfdmFsdWVzKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoKSB7XG4gICAgICB2YXIgdmFsdWVzLCBmaWVsZHNFcnJvcjtcbiAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7XG4gICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBvblN1Ym1pdExvZ2dlcih7XG4gICAgICAgICAgICAgIHZhbHVlczogX3ZhbHVlc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2YWx1ZXMgPSBfY2xvbmVEZWVwKF92YWx1ZXMpO1xuICAgICAgICAgICAgaWYgKCFyZW1vdmVIaWRkZW5EYXRhKSB7XG4gICAgICAgICAgICAgIHZhbHVlcyA9IF9jbG9uZURlZXAoZm9ybS5nZXRGaWVsZHNWYWx1ZSh0cnVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWx1ZXMgPSBwYXJzZVZhbHVlc1RvQmluZCh2YWx1ZXMsIGZsYXR0ZW5TY2hlbWEpO1xuICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVSZW1vdmVVbmRlZmluZWQodmFsdWVzKTtcbiAgICAgICAgICAgIGlmICghYmVmb3JlRmluaXNoKSB7XG4gICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTE7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA4O1xuICAgICAgICAgICAgcmV0dXJuIGJlZm9yZUZpbmlzaCh7XG4gICAgICAgICAgICAgIGRhdGE6IHZhbHVlcyxcbiAgICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWEsXG4gICAgICAgICAgICAgIGVycm9yczogW11cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIF9jb250ZXh0Mi50MCA9IF9jb250ZXh0Mi5zZW50O1xuICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxMjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICBfY29udGV4dDIudDAgPSBudWxsO1xuICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICBmaWVsZHNFcnJvciA9IF9jb250ZXh0Mi50MDtcbiAgICAgICAgICAgIGlmICghZmllbGRzRXJyb3IpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxNjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3JtLnNldEZpZWxkcyhmaWVsZHNFcnJvcik7XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdChcInJldHVyblwiKTtcbiAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgb25GaW5pc2ggJiYgb25GaW5pc2godmFsdWVzLCBbXSk7XG4gICAgICAgICAgY2FzZSAxNzpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfSwgX2NhbGxlZTIpO1xuICAgIH0pKTtcbiAgfTtcbiAgdmFyIGhhbmRsZUZpbmlzaEZhaWxlZCA9IGZ1bmN0aW9uIGhhbmRsZUZpbmlzaEZhaWxlZChwYXJhbXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlMygpIHtcbiAgICAgIHZhciB2YWx1ZXM7XG4gICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTMkKF9jb250ZXh0Mykge1xuICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDMucHJldiA9IF9jb250ZXh0My5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgb25TdWJtaXRMb2dnZXIocGFyYW1zKTtcbiAgICAgICAgICAgIGlmIChvbkZpbmlzaEZhaWxlZCkge1xuICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDM7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoXCJyZXR1cm5cIik7XG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgdmFsdWVzID0gX2Nsb25lRGVlcChwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMudmFsdWVzKTtcbiAgICAgICAgICAgIGlmICghcmVtb3ZlSGlkZGVuRGF0YSkge1xuICAgICAgICAgICAgICB2YWx1ZXMgPSBfY2xvbmVEZWVwKGZvcm0uZ2V0RmllbGRzVmFsdWUodHJ1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFsdWVzID0gcGFyc2VWYWx1ZXNUb0JpbmQodmFsdWVzLCBmbGF0dGVuU2NoZW1hKTtcbiAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlUmVtb3ZlVW5kZWZpbmVkKHZhbHVlcyk7XG4gICAgICAgICAgICBvbkZpbmlzaEZhaWxlZChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHBhcmFtcyksIHtcbiAgICAgICAgICAgICAgdmFsdWVzOiB2YWx1ZXNcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH0sIF9jYWxsZWUzKTtcbiAgICB9KSk7XG4gIH07XG4gIHZhciBvcGVybGFiZWxDb2wgPSAoX2EgPSBnZXRGb3JtSXRlbUxheW91dChjb2x1bW4sIHt9LCB7XG4gICAgbGFiZWxXaWR0aDogbGFiZWxXaWR0aFxuICB9KSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxhYmVsQ29sO1xuICB2YXIgY2xhc3NSZXN0ID0ge307XG4gIGlmIChjbGFzc05hbWUpIHtcbiAgICBjbGFzc1Jlc3RbY2xhc3NOYW1lXSA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Gb3JtLCBPYmplY3QuYXNzaWduKHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoJ2ZyLWZvcm0nLCBjbGFzc1Jlc3QpLFxuICAgIGxhYmVsV3JhcDogdHJ1ZVxuICB9LCBmb3JtUHJvcHMsIHtcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgZm9ybTogZm9ybSxcbiAgICBvbkZpbmlzaDogaGFuZGxlRmluaXNoLFxuICAgIG9uRmluaXNoRmFpbGVkOiBoYW5kbGVGaW5pc2hGYWlsZWQsXG4gICAgb25WYWx1ZXNDaGFuZ2U6IGhhbmRsZVZhbHVlc0NoYW5nZVxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1Jvdywge1xuICAgIGd1dHRlcjogZGlzcGxheVR5cGUgPT09ICdyb3cnID8gMTYgOiAyNFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZW5kZXJDb3JlLCB7XG4gICAgc2NoZW1hOiBzY2hlbWFcbiAgfSksIG9wZXJhdGVFeHRyYSksIHNjaGVtYSAmJiAhIWZvb3RlciAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfUm93LCB7XG4gICAgZ3V0dGVyOiBkaXNwbGF5VHlwZSA9PT0gJ3JvdycgPyAxNiA6IDI0XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Db2wsIHtcbiAgICBzcGFuOiAyNCAvIGNvbHVtblxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfRm9ybS5JdGVtLCB7XG4gICAgbGFiZWw6IGRpc3BsYXlUeXBlICE9PSAnY29sdW1uJyA/ICdoaWRlTGFiZWwnIDogbnVsbCxcbiAgICBsYWJlbENvbDogb3BlcmxhYmVsQ29sLFxuICAgIGNsYXNzTmFtZTogJ2ZyLWhpZGUtbGFiZWwnXG4gIH0sIGlzRnVuY3Rpb24oZm9vdGVyKSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9TcGFjZSwgbnVsbCwgZm9vdGVyKCkpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1NwYWNlLCBudWxsLCAhKChfYiA9IGZvb3RlciA9PT0gbnVsbCB8fCBmb290ZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZvb3Rlci5yZXNldCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmhpZGUpICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9CdXR0b24sIE9iamVjdC5hc3NpZ24oe30sIGZvb3RlciA9PT0gbnVsbCB8fCBmb290ZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZvb3Rlci5yZXNldCwge1xuICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICByZXR1cm4gZm9ybS5yZXNldEZpZWxkcygpO1xuICAgIH1cbiAgfSksICgoX2MgPSBmb290ZXIgPT09IG51bGwgfHwgZm9vdGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmb290ZXIucmVzZXQpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy50ZXh0KSB8fCB0KCdyZXNldCcpKSwgISgoX2QgPSBmb290ZXIgPT09IG51bGwgfHwgZm9vdGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmb290ZXIuc3VibWl0KSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuaGlkZSkgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0J1dHRvbiwgT2JqZWN0LmFzc2lnbih7XG4gICAgdHlwZTogJ3ByaW1hcnknLFxuICAgIG9uQ2xpY2s6IGZvcm0uc3VibWl0XG4gIH0sIGZvb3RlciA9PT0gbnVsbCB8fCBmb290ZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZvb3Rlci5zdWJtaXQpLCAoKF9lID0gZm9vdGVyID09PSBudWxsIHx8IGZvb3RlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZm9vdGVyLnN1Ym1pdCkgPT09IG51bGwgfHwgX2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lLnRleHQpIHx8IHQoJ3N1Ym1pdCcpKSkpKSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IEZvcm1Db3JlOyIsImZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7XG4gIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7XG4gICAgXCJkZWZhdWx0XCI6IG9ialxuICB9O1xufVxubW9kdWxlLmV4cG9ydHMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2RlZmF1bHQgPSB7XG4gIC8vIE9wdGlvbnMuanN4XG4gIGl0ZW1zX3Blcl9wYWdlOiAn5p2hL+mhtScsXG4gIGp1bXBfdG86ICfot7Poh7MnLFxuICBqdW1wX3RvX2NvbmZpcm06ICfnoa7lrponLFxuICBwYWdlOiAn6aG1JyxcbiAgLy8gUGFnaW5hdGlvbi5qc3hcbiAgcHJldl9wYWdlOiAn5LiK5LiA6aG1JyxcbiAgbmV4dF9wYWdlOiAn5LiL5LiA6aG1JyxcbiAgcHJldl81OiAn5ZCR5YmNIDUg6aG1JyxcbiAgbmV4dF81OiAn5ZCR5ZCOIDUg6aG1JyxcbiAgcHJldl8zOiAn5ZCR5YmNIDMg6aG1JyxcbiAgbmV4dF8zOiAn5ZCR5ZCOIDMg6aG1JyxcbiAgcGFnZV9zaXplOiAn6aG156CBJ1xufTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsImZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICBtb2R1bGUuZXhwb3J0cyA9IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzO1xuICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2V4dGVuZHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBsb2NhbGUgPSB7XG4gIGxvY2FsZTogJ3poX0NOJyxcbiAgdG9kYXk6ICfku4rlpKknLFxuICBub3c6ICfmraTliLsnLFxuICBiYWNrVG9Ub2RheTogJ+i/lOWbnuS7iuWkqScsXG4gIG9rOiAn56Gu5a6aJyxcbiAgdGltZVNlbGVjdDogJ+mAieaLqeaXtumXtCcsXG4gIGRhdGVTZWxlY3Q6ICfpgInmi6nml6XmnJ8nLFxuICB3ZWVrU2VsZWN0OiAn6YCJ5oup5ZGoJyxcbiAgY2xlYXI6ICfmuIXpmaQnLFxuICBtb250aDogJ+aciCcsXG4gIHllYXI6ICflubQnLFxuICBwcmV2aW91c01vbnRoOiAn5LiK5Liq5pyIICjnv7vpobXkuIrplK4pJyxcbiAgbmV4dE1vbnRoOiAn5LiL5Liq5pyIICjnv7vpobXkuIvplK4pJyxcbiAgbW9udGhTZWxlY3Q6ICfpgInmi6nmnIjku70nLFxuICB5ZWFyU2VsZWN0OiAn6YCJ5oup5bm05Lu9JyxcbiAgZGVjYWRlU2VsZWN0OiAn6YCJ5oup5bm05LujJyxcbiAgeWVhckZvcm1hdDogJ1lZWVnlubQnLFxuICBkYXlGb3JtYXQ6ICdE5pelJyxcbiAgZGF0ZUZvcm1hdDogJ1lZWVnlubRN5pyIROaXpScsXG4gIGRhdGVUaW1lRm9ybWF0OiAnWVlZWeW5tE3mnIhE5pelIEhI5pe2bW3liIZzc+enkicsXG4gIHByZXZpb3VzWWVhcjogJ+S4iuS4gOW5tCAoQ29udHJvbOmUruWKoOW3puaWueWQkemUriknLFxuICBuZXh0WWVhcjogJ+S4i+S4gOW5tCAoQ29udHJvbOmUruWKoOWPs+aWueWQkemUriknLFxuICBwcmV2aW91c0RlY2FkZTogJ+S4iuS4gOW5tOS7oycsXG4gIG5leHREZWNhZGU6ICfkuIvkuIDlubTku6MnLFxuICBwcmV2aW91c0NlbnR1cnk6ICfkuIrkuIDkuJbnuqonLFxuICBuZXh0Q2VudHVyeTogJ+S4i+S4gOS4lue6qidcbn07XG52YXIgX2RlZmF1bHQgPSBsb2NhbGU7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xudmFyIGxvY2FsZSA9IHtcbiAgcGxhY2Vob2xkZXI6ICfor7fpgInmi6nml7bpl7QnLFxuICByYW5nZVBsYWNlaG9sZGVyOiBbJ+W8gOWni+aXtumXtCcsICfnu5PmnZ/ml7bpl7QnXVxufTtcbnZhciBfZGVmYXVsdCA9IGxvY2FsZTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpW1wiZGVmYXVsdFwiXTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcbnZhciBfZXh0ZW5kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIikpO1xudmFyIF96aF9DTiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXBpY2tlci9saWIvbG9jYWxlL3poX0NOXCIpKTtcbnZhciBfemhfQ04yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vdGltZS1waWNrZXIvbG9jYWxlL3poX0NOXCIpKTtcbi8vIOe7n+S4gOWQiOW5tuS4uuWujOaVtOeahCBMb2NhbGVcbnZhciBsb2NhbGUgPSB7XG4gIGxhbmc6ICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7XG4gICAgcGxhY2Vob2xkZXI6ICfor7fpgInmi6nml6XmnJ8nLFxuICAgIHllYXJQbGFjZWhvbGRlcjogJ+ivt+mAieaLqeW5tOS7vScsXG4gICAgcXVhcnRlclBsYWNlaG9sZGVyOiAn6K+36YCJ5oup5a2j5bqmJyxcbiAgICBtb250aFBsYWNlaG9sZGVyOiAn6K+36YCJ5oup5pyI5Lu9JyxcbiAgICB3ZWVrUGxhY2Vob2xkZXI6ICfor7fpgInmi6nlkagnLFxuICAgIHJhbmdlUGxhY2Vob2xkZXI6IFsn5byA5aeL5pel5pyfJywgJ+e7k+adn+aXpeacnyddLFxuICAgIHJhbmdlWWVhclBsYWNlaG9sZGVyOiBbJ+W8gOWni+W5tOS7vScsICfnu5PmnZ/lubTku70nXSxcbiAgICByYW5nZU1vbnRoUGxhY2Vob2xkZXI6IFsn5byA5aeL5pyI5Lu9JywgJ+e7k+adn+aciOS7vSddLFxuICAgIHJhbmdlUXVhcnRlclBsYWNlaG9sZGVyOiBbJ+W8gOWni+Wto+W6picsICfnu5PmnZ/lraPluqYnXSxcbiAgICByYW5nZVdlZWtQbGFjZWhvbGRlcjogWyflvIDlp4vlkagnLCAn57uT5p2f5ZGoJ11cbiAgfSwgX3poX0NOW1wiZGVmYXVsdFwiXSksXG4gIHRpbWVQaWNrZXJMb2NhbGU6ICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgX3poX0NOMltcImRlZmF1bHRcIl0pXG59O1xuLy8gc2hvdWxkIGFkZCB3aGl0ZXNwYWNlIGJldHdlZW4gY2hhciBpbiBCdXR0b25cbmxvY2FsZS5sYW5nLm9rID0gJ+ehruWumic7XG4vLyBBbGwgc2V0dGluZ3MgYXQ6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2Jsb2IvbWFzdGVyL2NvbXBvbmVudHMvZGF0ZS1waWNrZXIvbG9jYWxlL2V4YW1wbGUuanNvblxudmFyIF9kZWZhdWx0ID0gbG9jYWxlO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIilbXCJkZWZhdWx0XCJdO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xudmFyIF96aF9DTiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uL2RhdGUtcGlja2VyL2xvY2FsZS96aF9DTlwiKSk7XG52YXIgX2RlZmF1bHQgPSBfemhfQ05bXCJkZWZhdWx0XCJdO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIilbXCJkZWZhdWx0XCJdO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xudmFyIF96aF9DTiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXBhZ2luYXRpb24vbGliL2xvY2FsZS96aF9DTlwiKSk7XG52YXIgX3poX0NOMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NhbGVuZGFyL2xvY2FsZS96aF9DTlwiKSk7XG52YXIgX3poX0NOMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2RhdGUtcGlja2VyL2xvY2FsZS96aF9DTlwiKSk7XG52YXIgX3poX0NONCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL3RpbWUtcGlja2VyL2xvY2FsZS96aF9DTlwiKSk7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby10ZW1wbGF0ZS1jdXJseS1pbi1zdHJpbmcgKi9cblxudmFyIHR5cGVUZW1wbGF0ZSA9ICcke2xhYmVsfeS4jeaYr+S4gOS4quacieaViOeahCR7dHlwZX0nO1xudmFyIGxvY2FsZVZhbHVlcyA9IHtcbiAgbG9jYWxlOiAnemgtY24nLFxuICBQYWdpbmF0aW9uOiBfemhfQ05bXCJkZWZhdWx0XCJdLFxuICBEYXRlUGlja2VyOiBfemhfQ04zW1wiZGVmYXVsdFwiXSxcbiAgVGltZVBpY2tlcjogX3poX0NONFtcImRlZmF1bHRcIl0sXG4gIENhbGVuZGFyOiBfemhfQ04yW1wiZGVmYXVsdFwiXSxcbiAgLy8gbG9jYWxlcyBmb3IgYWxsIGNvbXBvbmVudHNcbiAgZ2xvYmFsOiB7XG4gICAgcGxhY2Vob2xkZXI6ICfor7fpgInmi6knXG4gIH0sXG4gIFRhYmxlOiB7XG4gICAgZmlsdGVyVGl0bGU6ICfnrZvpgIknLFxuICAgIGZpbHRlckNvbmZpcm06ICfnoa7lrponLFxuICAgIGZpbHRlclJlc2V0OiAn6YeN572uJyxcbiAgICBmaWx0ZXJFbXB0eVRleHQ6ICfml6DnrZvpgInpobknLFxuICAgIGZpbHRlckNoZWNrYWxsOiAn5YWo6YCJJyxcbiAgICBmaWx0ZXJTZWFyY2hQbGFjZWhvbGRlcjogJ+WcqOetm+mAiemhueS4reaQnOe0oicsXG4gICAgc2VsZWN0QWxsOiAn5YWo6YCJ5b2T6aG1JyxcbiAgICBzZWxlY3RJbnZlcnQ6ICflj43pgInlvZPpobUnLFxuICAgIHNlbGVjdE5vbmU6ICfmuIXnqbrmiYDmnIknLFxuICAgIHNlbGVjdGlvbkFsbDogJ+WFqOmAieaJgOaciScsXG4gICAgc29ydFRpdGxlOiAn5o6S5bqPJyxcbiAgICBleHBhbmQ6ICflsZXlvIDooYwnLFxuICAgIGNvbGxhcHNlOiAn5YWz6Zet6KGMJyxcbiAgICB0cmlnZ2VyRGVzYzogJ+eCueWHu+mZjeW6jycsXG4gICAgdHJpZ2dlckFzYzogJ+eCueWHu+WNh+W6jycsXG4gICAgY2FuY2VsU29ydDogJ+WPlua2iOaOkuW6jydcbiAgfSxcbiAgTW9kYWw6IHtcbiAgICBva1RleHQ6ICfnoa7lrponLFxuICAgIGNhbmNlbFRleHQ6ICflj5bmtognLFxuICAgIGp1c3RPa1RleHQ6ICfnn6XpgZPkuoYnXG4gIH0sXG4gIFBvcGNvbmZpcm06IHtcbiAgICBjYW5jZWxUZXh0OiAn5Y+W5raIJyxcbiAgICBva1RleHQ6ICfnoa7lrponXG4gIH0sXG4gIFRyYW5zZmVyOiB7XG4gICAgdGl0bGVzOiBbJycsICcnXSxcbiAgICBzZWFyY2hQbGFjZWhvbGRlcjogJ+ivt+i+k+WFpeaQnOe0ouWGheWuuScsXG4gICAgaXRlbVVuaXQ6ICfpobknLFxuICAgIGl0ZW1zVW5pdDogJ+mhuScsXG4gICAgcmVtb3ZlOiAn5Yig6ZmkJyxcbiAgICBzZWxlY3RDdXJyZW50OiAn5YWo6YCJ5b2T6aG1JyxcbiAgICByZW1vdmVDdXJyZW50OiAn5Yig6Zmk5b2T6aG1JyxcbiAgICBzZWxlY3RBbGw6ICflhajpgInmiYDmnIknLFxuICAgIHJlbW92ZUFsbDogJ+WIoOmZpOWFqOmDqCcsXG4gICAgc2VsZWN0SW52ZXJ0OiAn5Y+N6YCJ5b2T6aG1J1xuICB9LFxuICBVcGxvYWQ6IHtcbiAgICB1cGxvYWRpbmc6ICfmlofku7bkuIrkvKDkuK0nLFxuICAgIHJlbW92ZUZpbGU6ICfliKDpmaTmlofku7YnLFxuICAgIHVwbG9hZEVycm9yOiAn5LiK5Lyg6ZSZ6K+vJyxcbiAgICBwcmV2aWV3RmlsZTogJ+mihOiniOaWh+S7ticsXG4gICAgZG93bmxvYWRGaWxlOiAn5LiL6L295paH5Lu2J1xuICB9LFxuICBFbXB0eToge1xuICAgIGRlc2NyaXB0aW9uOiAn5pqC5peg5pWw5o2uJ1xuICB9LFxuICBJY29uOiB7XG4gICAgaWNvbjogJ+WbvuaghydcbiAgfSxcbiAgVGV4dDoge1xuICAgIGVkaXQ6ICfnvJbovpEnLFxuICAgIGNvcHk6ICflpI3liLYnLFxuICAgIGNvcGllZDogJ+WkjeWItuaIkOWKnycsXG4gICAgZXhwYW5kOiAn5bGV5byAJ1xuICB9LFxuICBQYWdlSGVhZGVyOiB7XG4gICAgYmFjazogJ+i/lOWbnidcbiAgfSxcbiAgRm9ybToge1xuICAgIG9wdGlvbmFsOiAn77yI5Y+v6YCJ77yJJyxcbiAgICBkZWZhdWx0VmFsaWRhdGVNZXNzYWdlczoge1xuICAgICAgXCJkZWZhdWx0XCI6ICflrZfmrrXpqozor4HplJnor68ke2xhYmVsfScsXG4gICAgICByZXF1aXJlZDogJ+ivt+i+k+WFpSR7bGFiZWx9JyxcbiAgICAgIFwiZW51bVwiOiAnJHtsYWJlbH3lv4XpobvmmK/lhbbkuK3kuIDkuKpbJHtlbnVtfV0nLFxuICAgICAgd2hpdGVzcGFjZTogJyR7bGFiZWx95LiN6IO95Li656m65a2X56ymJyxcbiAgICAgIGRhdGU6IHtcbiAgICAgICAgZm9ybWF0OiAnJHtsYWJlbH3ml6XmnJ/moLzlvI/ml6DmlYgnLFxuICAgICAgICBwYXJzZTogJyR7bGFiZWx95LiN6IO96L2s5o2i5Li65pel5pyfJyxcbiAgICAgICAgaW52YWxpZDogJyR7bGFiZWx95piv5LiA5Liq5peg5pWI5pel5pyfJ1xuICAgICAgfSxcbiAgICAgIHR5cGVzOiB7XG4gICAgICAgIHN0cmluZzogdHlwZVRlbXBsYXRlLFxuICAgICAgICBtZXRob2Q6IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgYXJyYXk6IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgb2JqZWN0OiB0eXBlVGVtcGxhdGUsXG4gICAgICAgIG51bWJlcjogdHlwZVRlbXBsYXRlLFxuICAgICAgICBkYXRlOiB0eXBlVGVtcGxhdGUsXG4gICAgICAgIFwiYm9vbGVhblwiOiB0eXBlVGVtcGxhdGUsXG4gICAgICAgIGludGVnZXI6IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgXCJmbG9hdFwiOiB0eXBlVGVtcGxhdGUsXG4gICAgICAgIHJlZ2V4cDogdHlwZVRlbXBsYXRlLFxuICAgICAgICBlbWFpbDogdHlwZVRlbXBsYXRlLFxuICAgICAgICB1cmw6IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgaGV4OiB0eXBlVGVtcGxhdGVcbiAgICAgIH0sXG4gICAgICBzdHJpbmc6IHtcbiAgICAgICAgbGVuOiAnJHtsYWJlbH3pobvkuLoke2xlbn3kuKrlrZfnrKYnLFxuICAgICAgICBtaW46ICcke2xhYmVsfeacgOWwkSR7bWlufeS4quWtl+espicsXG4gICAgICAgIG1heDogJyR7bGFiZWx95pyA5aSaJHttYXh95Liq5a2X56ymJyxcbiAgICAgICAgcmFuZ2U6ICcke2xhYmVsfemhu+WcqCR7bWlufS0ke21heH3lrZfnrKbkuYvpl7QnXG4gICAgICB9LFxuICAgICAgbnVtYmVyOiB7XG4gICAgICAgIGxlbjogJyR7bGFiZWx95b+F6aG7562J5LqOJHtsZW59JyxcbiAgICAgICAgbWluOiAnJHtsYWJlbH3mnIDlsI/lgLzkuLoke21pbn0nLFxuICAgICAgICBtYXg6ICcke2xhYmVsfeacgOWkp+WAvOS4uiR7bWF4fScsXG4gICAgICAgIHJhbmdlOiAnJHtsYWJlbH3pobvlnKgke21pbn0tJHttYXh95LmL6Ze0J1xuICAgICAgfSxcbiAgICAgIGFycmF5OiB7XG4gICAgICAgIGxlbjogJ+mhu+S4uiR7bGVufeS4qiR7bGFiZWx9JyxcbiAgICAgICAgbWluOiAn5pyA5bCRJHttaW595LiqJHtsYWJlbH0nLFxuICAgICAgICBtYXg6ICfmnIDlpJoke21heH3kuKoke2xhYmVsfScsXG4gICAgICAgIHJhbmdlOiAnJHtsYWJlbH3mlbDph4/pobvlnKgke21pbn0tJHttYXh95LmL6Ze0J1xuICAgICAgfSxcbiAgICAgIHBhdHRlcm46IHtcbiAgICAgICAgbWlzbWF0Y2g6ICcke2xhYmVsfeS4juaooeW8j+S4jeWMuemFjSR7cGF0dGVybn0nXG4gICAgICB9XG4gICAgfVxuICB9LFxuICBJbWFnZToge1xuICAgIHByZXZpZXc6ICfpooTop4gnXG4gIH1cbn07XG52YXIgX2RlZmF1bHQgPSBsb2NhbGVWYWx1ZXM7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9kZWZhdWx0ID0ge1xuICAvLyBPcHRpb25zLmpzeFxuICBpdGVtc19wZXJfcGFnZTogJy8gcGFnZScsXG4gIGp1bXBfdG86ICdHbyB0bycsXG4gIGp1bXBfdG9fY29uZmlybTogJ2NvbmZpcm0nLFxuICBwYWdlOiAnUGFnZScsXG4gIC8vIFBhZ2luYXRpb24uanN4XG4gIHByZXZfcGFnZTogJ1ByZXZpb3VzIFBhZ2UnLFxuICBuZXh0X3BhZ2U6ICdOZXh0IFBhZ2UnLFxuICBwcmV2XzU6ICdQcmV2aW91cyA1IFBhZ2VzJyxcbiAgbmV4dF81OiAnTmV4dCA1IFBhZ2VzJyxcbiAgcHJldl8zOiAnUHJldmlvdXMgMyBQYWdlcycsXG4gIG5leHRfMzogJ05leHQgMyBQYWdlcycsXG4gIHBhZ2Vfc2l6ZTogJ1BhZ2UgU2l6ZSdcbn07XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBsb2NhbGUgPSB7XG4gIGxvY2FsZTogJ2VuX1VTJyxcbiAgdG9kYXk6ICdUb2RheScsXG4gIG5vdzogJ05vdycsXG4gIGJhY2tUb1RvZGF5OiAnQmFjayB0byB0b2RheScsXG4gIG9rOiAnT0snLFxuICBjbGVhcjogJ0NsZWFyJyxcbiAgbW9udGg6ICdNb250aCcsXG4gIHllYXI6ICdZZWFyJyxcbiAgdGltZVNlbGVjdDogJ3NlbGVjdCB0aW1lJyxcbiAgZGF0ZVNlbGVjdDogJ3NlbGVjdCBkYXRlJyxcbiAgd2Vla1NlbGVjdDogJ0Nob29zZSBhIHdlZWsnLFxuICBtb250aFNlbGVjdDogJ0Nob29zZSBhIG1vbnRoJyxcbiAgeWVhclNlbGVjdDogJ0Nob29zZSBhIHllYXInLFxuICBkZWNhZGVTZWxlY3Q6ICdDaG9vc2UgYSBkZWNhZGUnLFxuICB5ZWFyRm9ybWF0OiAnWVlZWScsXG4gIGRhdGVGb3JtYXQ6ICdNL0QvWVlZWScsXG4gIGRheUZvcm1hdDogJ0QnLFxuICBkYXRlVGltZUZvcm1hdDogJ00vRC9ZWVlZIEhIOm1tOnNzJyxcbiAgbW9udGhCZWZvcmVZZWFyOiB0cnVlLFxuICBwcmV2aW91c01vbnRoOiAnUHJldmlvdXMgbW9udGggKFBhZ2VVcCknLFxuICBuZXh0TW9udGg6ICdOZXh0IG1vbnRoIChQYWdlRG93biknLFxuICBwcmV2aW91c1llYXI6ICdMYXN0IHllYXIgKENvbnRyb2wgKyBsZWZ0KScsXG4gIG5leHRZZWFyOiAnTmV4dCB5ZWFyIChDb250cm9sICsgcmlnaHQpJyxcbiAgcHJldmlvdXNEZWNhZGU6ICdMYXN0IGRlY2FkZScsXG4gIG5leHREZWNhZGU6ICdOZXh0IGRlY2FkZScsXG4gIHByZXZpb3VzQ2VudHVyeTogJ0xhc3QgY2VudHVyeScsXG4gIG5leHRDZW50dXJ5OiAnTmV4dCBjZW50dXJ5J1xufTtcbnZhciBfZGVmYXVsdCA9IGxvY2FsZTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG52YXIgbG9jYWxlID0ge1xuICBwbGFjZWhvbGRlcjogJ1NlbGVjdCB0aW1lJyxcbiAgcmFuZ2VQbGFjZWhvbGRlcjogWydTdGFydCB0aW1lJywgJ0VuZCB0aW1lJ11cbn07XG52YXIgX2RlZmF1bHQgPSBsb2NhbGU7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKVtcImRlZmF1bHRcIl07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG52YXIgX2V4dGVuZHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCIpKTtcbnZhciBfZW5fVVMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy1waWNrZXIvbGliL2xvY2FsZS9lbl9VU1wiKSk7XG52YXIgX2VuX1VTMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uL3RpbWUtcGlja2VyL2xvY2FsZS9lbl9VU1wiKSk7XG4vLyBNZXJnZSBpbnRvIGEgbG9jYWxlIG9iamVjdFxudmFyIGxvY2FsZSA9IHtcbiAgbGFuZzogKDAsIF9leHRlbmRzMltcImRlZmF1bHRcIl0pKHtcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBkYXRlJyxcbiAgICB5ZWFyUGxhY2Vob2xkZXI6ICdTZWxlY3QgeWVhcicsXG4gICAgcXVhcnRlclBsYWNlaG9sZGVyOiAnU2VsZWN0IHF1YXJ0ZXInLFxuICAgIG1vbnRoUGxhY2Vob2xkZXI6ICdTZWxlY3QgbW9udGgnLFxuICAgIHdlZWtQbGFjZWhvbGRlcjogJ1NlbGVjdCB3ZWVrJyxcbiAgICByYW5nZVBsYWNlaG9sZGVyOiBbJ1N0YXJ0IGRhdGUnLCAnRW5kIGRhdGUnXSxcbiAgICByYW5nZVllYXJQbGFjZWhvbGRlcjogWydTdGFydCB5ZWFyJywgJ0VuZCB5ZWFyJ10sXG4gICAgcmFuZ2VRdWFydGVyUGxhY2Vob2xkZXI6IFsnU3RhcnQgcXVhcnRlcicsICdFbmQgcXVhcnRlciddLFxuICAgIHJhbmdlTW9udGhQbGFjZWhvbGRlcjogWydTdGFydCBtb250aCcsICdFbmQgbW9udGgnXSxcbiAgICByYW5nZVdlZWtQbGFjZWhvbGRlcjogWydTdGFydCB3ZWVrJywgJ0VuZCB3ZWVrJ11cbiAgfSwgX2VuX1VTW1wiZGVmYXVsdFwiXSksXG4gIHRpbWVQaWNrZXJMb2NhbGU6ICgwLCBfZXh0ZW5kczJbXCJkZWZhdWx0XCJdKSh7fSwgX2VuX1VTMltcImRlZmF1bHRcIl0pXG59O1xuLy8gQWxsIHNldHRpbmdzIGF0OlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9ibG9iL21hc3Rlci9jb21wb25lbnRzL2RhdGUtcGlja2VyL2xvY2FsZS9leGFtcGxlLmpzb25cbnZhciBfZGVmYXVsdCA9IGxvY2FsZTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpW1wiZGVmYXVsdFwiXTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcbnZhciBfZW5fVVMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi9kYXRlLXBpY2tlci9sb2NhbGUvZW5fVVNcIikpO1xudmFyIF9kZWZhdWx0ID0gX2VuX1VTW1wiZGVmYXVsdFwiXTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpW1wiZGVmYXVsdFwiXTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcbnZhciBfZW5fVVMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy1wYWdpbmF0aW9uL2xpYi9sb2NhbGUvZW5fVVNcIikpO1xudmFyIF9lbl9VUzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jYWxlbmRhci9sb2NhbGUvZW5fVVNcIikpO1xudmFyIF9lbl9VUzMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9kYXRlLXBpY2tlci9sb2NhbGUvZW5fVVNcIikpO1xudmFyIF9lbl9VUzQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi90aW1lLXBpY2tlci9sb2NhbGUvZW5fVVNcIikpO1xuLyogZXNsaW50LWRpc2FibGUgbm8tdGVtcGxhdGUtY3VybHktaW4tc3RyaW5nICovXG5cbnZhciB0eXBlVGVtcGxhdGUgPSAnJHtsYWJlbH0gaXMgbm90IGEgdmFsaWQgJHt0eXBlfSc7XG52YXIgbG9jYWxlVmFsdWVzID0ge1xuICBsb2NhbGU6ICdlbicsXG4gIFBhZ2luYXRpb246IF9lbl9VU1tcImRlZmF1bHRcIl0sXG4gIERhdGVQaWNrZXI6IF9lbl9VUzNbXCJkZWZhdWx0XCJdLFxuICBUaW1lUGlja2VyOiBfZW5fVVM0W1wiZGVmYXVsdFwiXSxcbiAgQ2FsZW5kYXI6IF9lbl9VUzJbXCJkZWZhdWx0XCJdLFxuICBnbG9iYWw6IHtcbiAgICBwbGFjZWhvbGRlcjogJ1BsZWFzZSBzZWxlY3QnXG4gIH0sXG4gIFRhYmxlOiB7XG4gICAgZmlsdGVyVGl0bGU6ICdGaWx0ZXIgbWVudScsXG4gICAgZmlsdGVyQ29uZmlybTogJ09LJyxcbiAgICBmaWx0ZXJSZXNldDogJ1Jlc2V0JyxcbiAgICBmaWx0ZXJFbXB0eVRleHQ6ICdObyBmaWx0ZXJzJyxcbiAgICBmaWx0ZXJDaGVja2FsbDogJ1NlbGVjdCBhbGwgaXRlbXMnLFxuICAgIGZpbHRlclNlYXJjaFBsYWNlaG9sZGVyOiAnU2VhcmNoIGluIGZpbHRlcnMnLFxuICAgIGVtcHR5VGV4dDogJ05vIGRhdGEnLFxuICAgIHNlbGVjdEFsbDogJ1NlbGVjdCBjdXJyZW50IHBhZ2UnLFxuICAgIHNlbGVjdEludmVydDogJ0ludmVydCBjdXJyZW50IHBhZ2UnLFxuICAgIHNlbGVjdE5vbmU6ICdDbGVhciBhbGwgZGF0YScsXG4gICAgc2VsZWN0aW9uQWxsOiAnU2VsZWN0IGFsbCBkYXRhJyxcbiAgICBzb3J0VGl0bGU6ICdTb3J0JyxcbiAgICBleHBhbmQ6ICdFeHBhbmQgcm93JyxcbiAgICBjb2xsYXBzZTogJ0NvbGxhcHNlIHJvdycsXG4gICAgdHJpZ2dlckRlc2M6ICdDbGljayB0byBzb3J0IGRlc2NlbmRpbmcnLFxuICAgIHRyaWdnZXJBc2M6ICdDbGljayB0byBzb3J0IGFzY2VuZGluZycsXG4gICAgY2FuY2VsU29ydDogJ0NsaWNrIHRvIGNhbmNlbCBzb3J0aW5nJ1xuICB9LFxuICBNb2RhbDoge1xuICAgIG9rVGV4dDogJ09LJyxcbiAgICBjYW5jZWxUZXh0OiAnQ2FuY2VsJyxcbiAgICBqdXN0T2tUZXh0OiAnT0snXG4gIH0sXG4gIFBvcGNvbmZpcm06IHtcbiAgICBva1RleHQ6ICdPSycsXG4gICAgY2FuY2VsVGV4dDogJ0NhbmNlbCdcbiAgfSxcbiAgVHJhbnNmZXI6IHtcbiAgICB0aXRsZXM6IFsnJywgJyddLFxuICAgIHNlYXJjaFBsYWNlaG9sZGVyOiAnU2VhcmNoIGhlcmUnLFxuICAgIGl0ZW1Vbml0OiAnaXRlbScsXG4gICAgaXRlbXNVbml0OiAnaXRlbXMnLFxuICAgIHJlbW92ZTogJ1JlbW92ZScsXG4gICAgc2VsZWN0Q3VycmVudDogJ1NlbGVjdCBjdXJyZW50IHBhZ2UnLFxuICAgIHJlbW92ZUN1cnJlbnQ6ICdSZW1vdmUgY3VycmVudCBwYWdlJyxcbiAgICBzZWxlY3RBbGw6ICdTZWxlY3QgYWxsIGRhdGEnLFxuICAgIHJlbW92ZUFsbDogJ1JlbW92ZSBhbGwgZGF0YScsXG4gICAgc2VsZWN0SW52ZXJ0OiAnSW52ZXJ0IGN1cnJlbnQgcGFnZSdcbiAgfSxcbiAgVXBsb2FkOiB7XG4gICAgdXBsb2FkaW5nOiAnVXBsb2FkaW5nLi4uJyxcbiAgICByZW1vdmVGaWxlOiAnUmVtb3ZlIGZpbGUnLFxuICAgIHVwbG9hZEVycm9yOiAnVXBsb2FkIGVycm9yJyxcbiAgICBwcmV2aWV3RmlsZTogJ1ByZXZpZXcgZmlsZScsXG4gICAgZG93bmxvYWRGaWxlOiAnRG93bmxvYWQgZmlsZSdcbiAgfSxcbiAgRW1wdHk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ05vIGRhdGEnXG4gIH0sXG4gIEljb246IHtcbiAgICBpY29uOiAnaWNvbidcbiAgfSxcbiAgVGV4dDoge1xuICAgIGVkaXQ6ICdFZGl0JyxcbiAgICBjb3B5OiAnQ29weScsXG4gICAgY29waWVkOiAnQ29waWVkJyxcbiAgICBleHBhbmQ6ICdFeHBhbmQnXG4gIH0sXG4gIFBhZ2VIZWFkZXI6IHtcbiAgICBiYWNrOiAnQmFjaydcbiAgfSxcbiAgRm9ybToge1xuICAgIG9wdGlvbmFsOiAnKG9wdGlvbmFsKScsXG4gICAgZGVmYXVsdFZhbGlkYXRlTWVzc2FnZXM6IHtcbiAgICAgIFwiZGVmYXVsdFwiOiAnRmllbGQgdmFsaWRhdGlvbiBlcnJvciBmb3IgJHtsYWJlbH0nLFxuICAgICAgcmVxdWlyZWQ6ICdQbGVhc2UgZW50ZXIgJHtsYWJlbH0nLFxuICAgICAgXCJlbnVtXCI6ICcke2xhYmVsfSBtdXN0IGJlIG9uZSBvZiBbJHtlbnVtfV0nLFxuICAgICAgd2hpdGVzcGFjZTogJyR7bGFiZWx9IGNhbm5vdCBiZSBhIGJsYW5rIGNoYXJhY3RlcicsXG4gICAgICBkYXRlOiB7XG4gICAgICAgIGZvcm1hdDogJyR7bGFiZWx9IGRhdGUgZm9ybWF0IGlzIGludmFsaWQnLFxuICAgICAgICBwYXJzZTogJyR7bGFiZWx9IGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gYSBkYXRlJyxcbiAgICAgICAgaW52YWxpZDogJyR7bGFiZWx9IGlzIGFuIGludmFsaWQgZGF0ZSdcbiAgICAgIH0sXG4gICAgICB0eXBlczoge1xuICAgICAgICBzdHJpbmc6IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgbWV0aG9kOiB0eXBlVGVtcGxhdGUsXG4gICAgICAgIGFycmF5OiB0eXBlVGVtcGxhdGUsXG4gICAgICAgIG9iamVjdDogdHlwZVRlbXBsYXRlLFxuICAgICAgICBudW1iZXI6IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgZGF0ZTogdHlwZVRlbXBsYXRlLFxuICAgICAgICBcImJvb2xlYW5cIjogdHlwZVRlbXBsYXRlLFxuICAgICAgICBpbnRlZ2VyOiB0eXBlVGVtcGxhdGUsXG4gICAgICAgIFwiZmxvYXRcIjogdHlwZVRlbXBsYXRlLFxuICAgICAgICByZWdleHA6IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgZW1haWw6IHR5cGVUZW1wbGF0ZSxcbiAgICAgICAgdXJsOiB0eXBlVGVtcGxhdGUsXG4gICAgICAgIGhleDogdHlwZVRlbXBsYXRlXG4gICAgICB9LFxuICAgICAgc3RyaW5nOiB7XG4gICAgICAgIGxlbjogJyR7bGFiZWx9IG11c3QgYmUgJHtsZW59IGNoYXJhY3RlcnMnLFxuICAgICAgICBtaW46ICcke2xhYmVsfSBtdXN0IGJlIGF0IGxlYXN0ICR7bWlufSBjaGFyYWN0ZXJzJyxcbiAgICAgICAgbWF4OiAnJHtsYWJlbH0gbXVzdCBiZSB1cCB0byAke21heH0gY2hhcmFjdGVycycsXG4gICAgICAgIHJhbmdlOiAnJHtsYWJlbH0gbXVzdCBiZSBiZXR3ZWVuICR7bWlufS0ke21heH0gY2hhcmFjdGVycydcbiAgICAgIH0sXG4gICAgICBudW1iZXI6IHtcbiAgICAgICAgbGVuOiAnJHtsYWJlbH0gbXVzdCBiZSBlcXVhbCB0byAke2xlbn0nLFxuICAgICAgICBtaW46ICcke2xhYmVsfSBtdXN0IGJlIG1pbmltdW0gJHttaW59JyxcbiAgICAgICAgbWF4OiAnJHtsYWJlbH0gbXVzdCBiZSBtYXhpbXVtICR7bWF4fScsXG4gICAgICAgIHJhbmdlOiAnJHtsYWJlbH0gbXVzdCBiZSBiZXR3ZWVuICR7bWlufS0ke21heH0nXG4gICAgICB9LFxuICAgICAgYXJyYXk6IHtcbiAgICAgICAgbGVuOiAnTXVzdCBiZSAke2xlbn0gJHtsYWJlbH0nLFxuICAgICAgICBtaW46ICdBdCBsZWFzdCAke21pbn0gJHtsYWJlbH0nLFxuICAgICAgICBtYXg6ICdBdCBtb3N0ICR7bWF4fSAke2xhYmVsfScsXG4gICAgICAgIHJhbmdlOiAnVGhlIGFtb3VudCBvZiAke2xhYmVsfSBtdXN0IGJlIGJldHdlZW4gJHttaW59LSR7bWF4fSdcbiAgICAgIH0sXG4gICAgICBwYXR0ZXJuOiB7XG4gICAgICAgIG1pc21hdGNoOiAnJHtsYWJlbH0gZG9lcyBub3QgbWF0Y2ggdGhlIHBhdHRlcm4gJHtwYXR0ZXJufSdcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIEltYWdlOiB7XG4gICAgcHJldmlldzogJ1ByZXZpZXcnXG4gIH1cbn07XG52YXIgX2RlZmF1bHQgPSBsb2NhbGVWYWx1ZXM7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKVtcImRlZmF1bHRcIl07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG52YXIgX2RlZmF1bHQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9kZWZhdWx0XCIpKTtcbnZhciBfZGVmYXVsdCA9IF9kZWZhdWx0MltcImRlZmF1bHRcIl07XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsImV4cG9ydCBkZWZhdWx0IHtcbiAgXCJjb3B5X21heF90aXBcIjogXCJUaGUgbWF4aW11bSBudW1iZXIgb2YgdGFibGUgaXRlbXMgaGFzIGJlZW4gcmVhY2hlZCBhbmQgY2Fubm90IGJlIGNvcGllZFwiLFxuICBcImNvcHlcIjogXCJDb3B5XCIsXG4gIFwiYWRkX2l0ZW1cIjogXCJBZGQgYSBuZXcgbGluZVwiLFxuICBcImNvbmZpcm1fZGVsZXRlXCI6IFwiQXJlIHlvdSBzdXJlIHRvIGRlbGV0ZT9cIixcbiAgXCJjb25maXJtXCI6IFwiWWVzXCIsXG4gIFwiY2FuY2VsXCI6IFwiTm9cIixcbiAgXCJvcGVyYXRlXCI6IFwiT3BlcmF0ZVwiLFxuICBcImRlbGV0ZVwiOiBcIkRlbGV0ZVwiLFxuICBcImVkaXRcIjogXCJFZGl0XCIsXG4gIFwiaW1nX3NyY19lcnJvclwiOiBcIkltYWdlIGFkZHJlc3MgZXJyb3JcIixcbiAgXCJ1cGxvYWRcIjogXCJVcGxvYWRcIixcbiAgXCJ1cGxvYWRfc3VjY2Vzc1wiOiBcInVwbG9hZCBzdWNjZXNzXCIsXG4gIFwidXBsb2FkX2ZhaWxcIjogXCJ1cGxvYWQgZmFpbGVkXCIsXG4gIFwidXBsb2FkZWRfYWRkcmVzc1wiOiBcIlVwbG9hZGVkIGFkZHJlc3NcIixcbiAgXCJ0ZXN0X3NyY1wiOiBcIlRlc3QgYWRkcmVzc1wiLFxuICBcInNjaGVtYV9ub3RfbWF0Y2hcIjogXCJTY2hlbWEgZG9lcyBub3QgbWF0Y2ggdGhlIGRpc3BsYXkgY29tcG9uZW5077yaXCIsXG4gIFwiaXRlbVwiOiBcIkl0ZW1cIixcbiAgXCJzZWFyY2hcIjogXCJTZWFyY2hcIixcbiAgXCJyZXNldFwiOiBcIlJlc2V0XCIsXG4gIFwiZXhwYW5kXCI6IFwiRXhwYW5kXCIsXG4gIFwiZm9sZFwiOiBcIkZvbGRcIixcbiAgXCJzdWJtaXRcIjogXCJTdWJtaXRcIixcbiAgXCJzYXZlXCI6IFwiU2F2ZVwiLFxuICBcIm1vdmVEb3duXCI6IFwiTW92ZSBEb3duXCIsXG4gIFwibW92ZVVwXCI6IFwiTW92ZSBVcFwiXG59OyIsImV4cG9ydCBkZWZhdWx0IHtcbiAgXCJjb3B5X21heF90aXBcIjogXCLlt7Lovr7ooajljZXpobnmlbDph4/kuIrpmZDvvIzml6Dms5XlpI3liLbvvIFcIixcbiAgXCJjb3B5XCI6IFwi5aSN5Yi2XCIsXG4gIFwiYWRkX2l0ZW1cIjogXCLmlrDlop7kuIDmnaFcIixcbiAgXCJjb25maXJtX2RlbGV0ZVwiOiBcIuehruWumuWIoOmZpD9cIixcbiAgXCJjb25maXJtXCI6IFwi56Gu5a6aXCIsXG4gIFwiY2FuY2VsXCI6IFwi5Y+W5raIXCIsXG4gIFwib3BlcmF0ZVwiOiBcIuaTjeS9nFwiLFxuICBcImRlbGV0ZVwiOiBcIuWIoOmZpFwiLFxuICBcImVkaXRcIjogXCLnvJbovpFcIixcbiAgXCJpbWdfc3JjX2Vycm9yXCI6IFwi5Zu+54mH5Zyw5Z2A6ZSZ6K+vXCIsXG4gIFwidXBsb2FkXCI6IFwi5LiK5LygXCIsXG4gIFwidXBsb2FkX3N1Y2Nlc3NcIjogXCLkuIrkvKDmiJDlip9cIixcbiAgXCJ1cGxvYWRfZmFpbFwiOiBcIuS4iuS8oOWksei0pVwiLFxuICBcInVwbG9hZGVkX2FkZHJlc3NcIjogXCLlt7LkuIrkvKDlnLDlnYBcIixcbiAgXCJ0ZXN0X3NyY1wiOiBcIua1i+ivlemTvuaOpVwiLFxuICBcInNjaGVtYV9ub3RfbWF0Y2hcIjogXCJzY2hlbWHmnKrljLnphY3liLDlsZXnpLrnu4Tku7bvvJpcIixcbiAgXCJpdGVtXCI6IFwi6aG555uuXCIsXG4gIFwic2VhcmNoXCI6IFwi5p+l6K+iXCIsXG4gIFwicmVzZXRcIjogXCLph43nva5cIixcbiAgXCJleHBhbmRcIjogXCLlsZXlvIBcIixcbiAgXCJmb2xkXCI6IFwi5pS26LW3XCIsXG4gIFwic3VibWl0XCI6IFwi5o+Q5LqkXCIsXG4gIFwic2F2ZVwiOiBcIuS/neWtmFwiLFxuICBcIm1vdmVEb3duXCI6IFwi5LiL56e7XCIsXG4gIFwibW92ZVVwXCI6IFwi5LiK56e7XCJcbn07IiwiaW1wb3J0IGVuVVMgZnJvbSAnLi9lbl9VUyc7XG5pbXBvcnQgemhDTiBmcm9tICcuL3poX0NOJztcbmV4cG9ydCBkZWZhdWx0IHtcbiAgJ2VuLVVTJzogZW5VUyxcbiAgJ3poLUNOJzogemhDTlxufTsiLCIhZnVuY3Rpb24oZSxfKXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1fKHJlcXVpcmUoXCJkYXlqc1wiKSk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJkYXlqc1wiXSxfKTooZT1cInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOmV8fHNlbGYpLmRheWpzX2xvY2FsZV96aF9jbj1fKGUuZGF5anMpfSh0aGlzLChmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBfKGUpe3JldHVybiBlJiZcIm9iamVjdFwiPT10eXBlb2YgZSYmXCJkZWZhdWx0XCJpbiBlP2U6e2RlZmF1bHQ6ZX19dmFyIHQ9XyhlKSxkPXtuYW1lOlwiemgtY25cIix3ZWVrZGF5czpcIuaYn+acn+aXpV/mmJ/mnJ/kuIBf5pif5pyf5LqMX+aYn+acn+S4iV/mmJ/mnJ/lm5tf5pif5pyf5LqUX+aYn+acn+WFrVwiLnNwbGl0KFwiX1wiKSx3ZWVrZGF5c1Nob3J0Olwi5ZGo5pelX+WRqOS4gF/lkajkuoxf5ZGo5LiJX+WRqOWbm1/lkajkupRf5ZGo5YWtXCIuc3BsaXQoXCJfXCIpLHdlZWtkYXlzTWluOlwi5pelX+S4gF/kuoxf5LiJX+Wbm1/kupRf5YWtXCIuc3BsaXQoXCJfXCIpLG1vbnRoczpcIuS4gOaciF/kuozmnIhf5LiJ5pyIX+Wbm+aciF/kupTmnIhf5YWt5pyIX+S4g+aciF/lhavmnIhf5Lmd5pyIX+WNgeaciF/ljYHkuIDmnIhf5Y2B5LqM5pyIXCIuc3BsaXQoXCJfXCIpLG1vbnRoc1Nob3J0OlwiMeaciF8y5pyIXzPmnIhfNOaciF815pyIXzbmnIhfN+aciF845pyIXznmnIhfMTDmnIhfMTHmnIhfMTLmnIhcIi5zcGxpdChcIl9cIiksb3JkaW5hbDpmdW5jdGlvbihlLF8pe3JldHVyblwiV1wiPT09Xz9lK1wi5ZGoXCI6ZStcIuaXpVwifSx3ZWVrU3RhcnQ6MSx5ZWFyU3RhcnQ6NCxmb3JtYXRzOntMVDpcIkhIOm1tXCIsTFRTOlwiSEg6bW06c3NcIixMOlwiWVlZWS9NTS9ERFwiLExMOlwiWVlZWeW5tE3mnIhE5pelXCIsTExMOlwiWVlZWeW5tE3mnIhE5pelQWjngrltbeWIhlwiLExMTEw6XCJZWVlZ5bm0TeaciETml6VkZGRkQWjngrltbeWIhlwiLGw6XCJZWVlZL00vRFwiLGxsOlwiWVlZWeW5tE3mnIhE5pelXCIsbGxsOlwiWVlZWeW5tE3mnIhE5pelIEhIOm1tXCIsbGxsbDpcIllZWVnlubRN5pyIROaXpWRkZGQgSEg6bW1cIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6XCIlc+WGhVwiLHBhc3Q6XCIlc+WJjVwiLHM6XCLlh6Dnp5JcIixtOlwiMSDliIbpkp9cIixtbTpcIiVkIOWIhumSn1wiLGg6XCIxIOWwj+aXtlwiLGhoOlwiJWQg5bCP5pe2XCIsZDpcIjEg5aSpXCIsZGQ6XCIlZCDlpKlcIixNOlwiMSDkuKrmnIhcIixNTTpcIiVkIOS4quaciFwiLHk6XCIxIOW5tFwiLHl5OlwiJWQg5bm0XCJ9LG1lcmlkaWVtOmZ1bmN0aW9uKGUsXyl7dmFyIHQ9MTAwKmUrXztyZXR1cm4gdDw2MDA/XCLlh4zmmahcIjp0PDkwMD9cIuaXqeS4ilwiOnQ8MTEwMD9cIuS4iuWNiFwiOnQ8MTMwMD9cIuS4reWNiFwiOnQ8MTgwMD9cIuS4i+WNiFwiOlwi5pma5LiKXCJ9fTtyZXR1cm4gdC5kZWZhdWx0LmxvY2FsZShkLG51bGwsITApLGR9KSk7IiwiaW1wb3J0IHsgY3JlYXRlU3RvcmUgYXMgY3JlYXRleCB9IGZyb20gJ3p1c3RhbmQnO1xuLy8g5bCGIHVzZVN0b3JlIOaUueS4uiBjcmVhdGVTdG9yZe+8jCDlubbmiorlroPmlLnkuLogY3JlYXRlIOaWueazlVxuZXhwb3J0IHZhciBjcmVhdGVTdG9yZSA9IGZ1bmN0aW9uIGNyZWF0ZVN0b3JlKCkge1xuICByZXR1cm4gY3JlYXRleChmdW5jdGlvbiAoc2V0U3RhdGUsIGdldCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbml0aWFsaXplZDogZmFsc2UsXG4gICAgICBzY2hlbWE6IHt9LFxuICAgICAgZmxhdHRlblNjaGVtYToge30sXG4gICAgICBjb250ZXh0OiB7fSxcbiAgICAgIGluaXQ6IGZ1bmN0aW9uIGluaXQoZGF0YSkge1xuICAgICAgICByZXR1cm4gc2V0U3RhdGUoT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgaW5pdGlhbGl6ZWQ6IHRydWVcbiAgICAgICAgfSwgZGF0YSkpO1xuICAgICAgfSxcbiAgICAgIHNldENvbnRleHQ6IGZ1bmN0aW9uIHNldENvbnRleHQoY29udGV4dCkge1xuICAgICAgICByZXR1cm4gc2V0U3RhdGUoe1xuICAgICAgICAgIGNvbnRleHQ6IGNvbnRleHRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG59OyIsInZhciB0eXBlVGVtcGxhdGUgPSBcIicke2xhYmVsfScgaXMgbm90IGEgdmFsaWQgJHt0eXBlfVwiO1xudmFyIHR5cGVUZW1wbGF0ZUNOID0gXCLmlbDmja7nsbvlnovlv4XpobvmmK8gJHt0eXBlfVwiO1xuZXhwb3J0IHZhciB2YWxpZGF0ZU1lc3NhZ2VzRU4gPSB7XG4gIGRlZmF1bHQ6IFwiVmFsaWRhdGlvbiBlcnJvciBvbiBmaWVsZCAnJHtsYWJlbH0nXCIsXG4gIHJlcXVpcmVkOiBcIicke2xhYmVsfScgaXMgcmVxdWlyZWRcIixcbiAgZW51bTogXCInJHtsYWJlbH0nIG11c3QgYmUgb25lIG9mIFske2VudW19XVwiLFxuICB3aGl0ZXNwYWNlOiBcIicke2xhYmVsfScgY2Fubm90IGJlIGVtcHR5XCIsXG4gIGRhdGU6IHtcbiAgICBmb3JtYXQ6IFwiJyR7bGFiZWx9JyBpcyBpbnZhbGlkIGZvciBmb3JtYXQgZGF0ZVwiLFxuICAgIHBhcnNlOiBcIicke2xhYmVsfScgY291bGQgbm90IGJlIHBhcnNlZCBhcyBkYXRlXCIsXG4gICAgaW52YWxpZDogXCInJHtsYWJlbH0nIGlzIGludmFsaWQgZGF0ZVwiXG4gIH0sXG4gIHR5cGVzOiB7XG4gICAgc3RyaW5nOiB0eXBlVGVtcGxhdGUsXG4gICAgbWV0aG9kOiB0eXBlVGVtcGxhdGUsXG4gICAgYXJyYXk6IHR5cGVUZW1wbGF0ZSxcbiAgICBvYmplY3Q6IHR5cGVUZW1wbGF0ZSxcbiAgICBudW1iZXI6IHR5cGVUZW1wbGF0ZSxcbiAgICBkYXRlOiB0eXBlVGVtcGxhdGUsXG4gICAgYm9vbGVhbjogdHlwZVRlbXBsYXRlLFxuICAgIGludGVnZXI6IHR5cGVUZW1wbGF0ZSxcbiAgICBmbG9hdDogdHlwZVRlbXBsYXRlLFxuICAgIHJlZ2V4cDogdHlwZVRlbXBsYXRlLFxuICAgIGVtYWlsOiB0eXBlVGVtcGxhdGUsXG4gICAgdXJsOiB0eXBlVGVtcGxhdGUsXG4gICAgaGV4OiB0eXBlVGVtcGxhdGVcbiAgfSxcbiAgc3RyaW5nOiB7XG4gICAgbGVuOiBcIicke2xhYmVsfScgbXVzdCBiZSBleGFjdGx5ICR7bGVufSBjaGFyYWN0ZXJzXCIsXG4gICAgbWluOiBcIicke2xhYmVsfScgbXVzdCBiZSBhdCBsZWFzdCAke21pbn0gY2hhcmFjdGVyc1wiLFxuICAgIG1heDogXCInJHtsYWJlbH0nIGNhbm5vdCBiZSBsb25nZXIgdGhhbiAke21heH0gY2hhcmFjdGVyc1wiLFxuICAgIHJhbmdlOiBcIicke2xhYmVsfScgbXVzdCBiZSBiZXR3ZWVuICR7bWlufSBhbmQgJHttYXh9IGNoYXJhY3RlcnNcIlxuICB9LFxuICBudW1iZXI6IHtcbiAgICBsZW46IFwiJyR7bGFiZWx9JyBtdXN0IGVxdWFsICR7bGVufVwiLFxuICAgIG1pbjogXCInJHtsYWJlbH0nIGNhbm5vdCBiZSBsZXNzIHRoYW4gJHttaW59XCIsXG4gICAgbWF4OiBcIicke2xhYmVsfScgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiAke21heH1cIixcbiAgICByYW5nZTogXCInJHtsYWJlbH0nIG11c3QgYmUgYmV0d2VlbiAke21pbn0gYW5kICR7bWF4fVwiXG4gIH0sXG4gIGFycmF5OiB7XG4gICAgbGVuOiBcIicke2xhYmVsfScgbXVzdCBiZSBleGFjdGx5ICR7bGVufSBpbiBsZW5ndGhcIixcbiAgICBtaW46IFwiJyR7bGFiZWx9JyBjYW5ub3QgYmUgbGVzcyB0aGFuICR7bWlufSBpbiBsZW5ndGhcIixcbiAgICBtYXg6IFwiJyR7bGFiZWx9JyBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuICR7bWF4fSBpbiBsZW5ndGhcIixcbiAgICByYW5nZTogXCInJHtsYWJlbH0nIG11c3QgYmUgYmV0d2VlbiAke21pbn0gYW5kICR7bWF4fSBpbiBsZW5ndGhcIlxuICB9LFxuICBwYXR0ZXJuOiB7XG4gICAgbWlzbWF0Y2g6IFwiJyR7bGFiZWx9JyBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuICR7cGF0dGVybn1cIlxuICB9XG59O1xuZXhwb3J0IHZhciB2YWxpZGF0ZU1lc3NhZ2VzQ04gPSB7XG4gIGRlZmF1bHQ6ICcke2xhYmVsfeacqumAmui/h+agoemqjCcsXG4gIHJlcXVpcmVkOiAnJHtsYWJlbH3lv4XloasnLFxuICB3aGl0ZXNwYWNlOiAnJHtsYWJlbH3kuI3og73kuLrnqbonLFxuICBkYXRlOiB7XG4gICAgZm9ybWF0OiAnJHtsYWJlbH3nmoTmoLzlvI/plJnor68nLFxuICAgIHBhcnNlOiAnJHtsYWJlbH3ml6Dms5Xooqvop6PmnpAnLFxuICAgIGludmFsaWQ6ICcke2xhYmVsfeaVsOaNruS4jeWQiOazlSdcbiAgfSxcbiAgdHlwZXM6IHtcbiAgICBzdHJpbmc6IHR5cGVUZW1wbGF0ZUNOLFxuICAgIG1ldGhvZDogdHlwZVRlbXBsYXRlQ04sXG4gICAgYXJyYXk6IHR5cGVUZW1wbGF0ZUNOLFxuICAgIG9iamVjdDogdHlwZVRlbXBsYXRlQ04sXG4gICAgbnVtYmVyOiB0eXBlVGVtcGxhdGVDTixcbiAgICBkYXRlOiB0eXBlVGVtcGxhdGVDTixcbiAgICBib29sZWFuOiB0eXBlVGVtcGxhdGVDTixcbiAgICBpbnRlZ2VyOiB0eXBlVGVtcGxhdGVDTixcbiAgICBmbG9hdDogdHlwZVRlbXBsYXRlQ04sXG4gICAgcmVnZXhwOiB0eXBlVGVtcGxhdGVDTixcbiAgICBlbWFpbDogdHlwZVRlbXBsYXRlQ04sXG4gICAgdXJsOiB0eXBlVGVtcGxhdGVDTixcbiAgICBoZXg6IHR5cGVUZW1wbGF0ZUNOXG4gIH0sXG4gIHN0cmluZzoge1xuICAgIGxlbjogJyR7bGFiZWx96ZW/5bqm5LiN5pivJHtsZW59JyxcbiAgICBtaW46ICcke2xhYmVsfemVv+W6puS4jeiDveWwj+S6jiR7bWlufScsXG4gICAgbWF4OiAnJHtsYWJlbH3plb/luqbkuI3og73lpKfkuo4ke21heH0nLFxuICAgIHJhbmdlOiAnJHtsYWJlbH3plb/luqbpnIDlnKgke21pbn3kuI4ke21heH3kuYvpl7QnXG4gIH0sXG4gIG51bWJlcjoge1xuICAgIGxlbjogJyR7bGFiZWx95LiN562J5LqOJHtsZW59JyxcbiAgICBtaW46ICcke2xhYmVsfeS4jeiDveWwj+S6jiR7bWlufScsXG4gICAgbWF4OiAnJHtsYWJlbH3kuI3og73lpKfkuo4ke21heH0nLFxuICAgIHJhbmdlOiAnJHtsYWJlbH3pnIDlnKgke21pbn3kuI4ke21heH3kuYvpl7QnXG4gIH0sXG4gIGFycmF5OiB7XG4gICAgbGVuOiAnJHtsYWJlbH3plb/luqbkuI3mmK8ke2xlbn0nLFxuICAgIG1pbjogJyR7bGFiZWx96ZW/5bqm5LiN6IO95bCP5LqOJHttaW59JyxcbiAgICBtYXg6ICcke2xhYmVsfemVv+W6puS4jeiDveWkp+S6jiR7bWF4fScsXG4gICAgcmFuZ2U6ICcke2xhYmVsfemVv+W6pumcgOWcqCR7bWlufeS4jiR7bWF4feS5i+mXtCdcbiAgfSxcbiAgcGF0dGVybjoge1xuICAgIG1pc21hdGNoOiAnJHtsYWJlbH3mnKrpgJrov4fmraPliJnliKTmlq0ke3BhdHRlcm59J1xuICB9XG59OyIsImltcG9ydCBcImFudGQvZXMvY29uZmlnLXByb3ZpZGVyL3N0eWxlXCI7XG5pbXBvcnQgX0NvbmZpZ1Byb3ZpZGVyIGZyb20gXCJhbnRkL2VzL2NvbmZpZy1wcm92aWRlclwiO1xuaW1wb3J0IHsgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnO1xuaW1wb3J0IHsgdXNlVW5tb3VudCB9IGZyb20gJ2Fob29rcyc7XG5pbXBvcnQgemhDTiBmcm9tICdhbnRkL2xpYi9sb2NhbGUvemhfQ04nO1xuaW1wb3J0IGVuVVMgZnJvbSAnYW50ZC9saWIvbG9jYWxlL2VuX1VTJztcbmltcG9ydCBsb2NhbGVzIGZyb20gJy4vbG9jYWxlcyc7XG5pbXBvcnQgJ2RheWpzL2xvY2FsZS96aC1jbic7XG5pbXBvcnQgeyBjcmVhdGVTdG9yZSB9IGZyb20gJy4vbW9kZWxzL3N0b3JlJztcbmltcG9ydCB7IEZSQ29udGV4dCwgQ29uZmlnQ29udGV4dCB9IGZyb20gJy4vbW9kZWxzL2NvbnRleHQnO1xuaW1wb3J0IHsgdmFsaWRhdGVNZXNzYWdlc0VOLCB2YWxpZGF0ZU1lc3NhZ2VzQ04gfSBmcm9tICcuL21vZGVscy92YWxpZGF0ZU1lc3NhZ2UnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gd2l0aFByb3ZpZGVyKEVsZW1lbnQsIGRlZmF1bHRXaWRnZXRzKSB7XG4gIHJldHVybiBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICB2YXIgY29uZmlnUHJvdmlkZXIgPSBwcm9wcy5jb25maWdQcm92aWRlcixcbiAgICAgIF9wcm9wcyRsb2NhbGUgPSBwcm9wcy5sb2NhbGUsXG4gICAgICBsb2NhbGUgPSBfcHJvcHMkbG9jYWxlID09PSB2b2lkIDAgPyAnemgtQ04nIDogX3Byb3BzJGxvY2FsZSxcbiAgICAgIHdpZGdldHMgPSBwcm9wcy53aWRnZXRzLFxuICAgICAgbWV0aG9kcyA9IHByb3BzLm1ldGhvZHMsXG4gICAgICBmb3JtID0gcHJvcHMuZm9ybSxcbiAgICAgIHZhbGlkYXRlTWVzc2FnZXMgPSBwcm9wcy52YWxpZGF0ZU1lc3NhZ2VzLFxuICAgICAgX3Byb3BzJGdsb2JhbFByb3BzID0gcHJvcHMuZ2xvYmFsUHJvcHMsXG4gICAgICBnbG9iYWxQcm9wcyA9IF9wcm9wcyRnbG9iYWxQcm9wcyA9PT0gdm9pZCAwID8ge30gOiBfcHJvcHMkZ2xvYmFsUHJvcHMsXG4gICAgICBfcHJvcHMkZ2xvYmFsQ29uZmlnID0gcHJvcHMuZ2xvYmFsQ29uZmlnLFxuICAgICAgZ2xvYmFsQ29uZmlnID0gX3Byb3BzJGdsb2JhbENvbmZpZyA9PT0gdm9pZCAwID8ge30gOiBfcHJvcHMkZ2xvYmFsQ29uZmlnLFxuICAgICAgb3RoZXJQcm9wcyA9IF9fcmVzdChwcm9wcywgW1wiY29uZmlnUHJvdmlkZXJcIiwgXCJsb2NhbGVcIiwgXCJ3aWRnZXRzXCIsIFwibWV0aG9kc1wiLCBcImZvcm1cIiwgXCJ2YWxpZGF0ZU1lc3NhZ2VzXCIsIFwiZ2xvYmFsUHJvcHNcIiwgXCJnbG9iYWxDb25maWdcIl0pO1xuICAgIHZhciBzdG9yZVJlZiA9IHVzZVJlZihjcmVhdGVTdG9yZSgpKTtcbiAgICB2YXIgc3RvcmUgPSBzdG9yZVJlZi5jdXJyZW50O1xuICAgIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAobG9jYWxlID09PSAnZW4tVVMnKSB7XG4gICAgICAgIGRheWpzLmxvY2FsZSgnZW4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZGF5anMubG9jYWxlKCd6aC1jbicpO1xuICAgIH0sIFtsb2NhbGVdKTtcbiAgICB1c2VVbm1vdW50KGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvcm0ucmVzZXRGaWVsZHMoKTtcbiAgICB9KTtcbiAgICBpZiAoIWZvcm0pIHtcbiAgICAgIGNvbnNvbGUud2FybignUGxlYXNlIHByb3ZpZGUgYSBmb3JtIGluc3RhbmNlIHRvIEZvcm1SZW5kZXInKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgYW50ZExvY2FsZSA9IGxvY2FsZSA9PT0gJ3poLUNOJyA/IHpoQ04gOiBlblVTO1xuICAgIHZhciBmb3JtVmFsaWRhdGVNZXNzYWdlcyA9IGxvY2FsZSA9PT0gJ3poLUNOJyA/IHZhbGlkYXRlTWVzc2FnZXNDTiA6IHZhbGlkYXRlTWVzc2FnZXNFTjtcbiAgICB2YXIgY29uZmlnQ29udGV4dCA9IHtcbiAgICAgIGxvY2FsZTogbG9jYWxlLFxuICAgICAgd2lkZ2V0czogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0V2lkZ2V0cyksIHdpZGdldHMpLFxuICAgICAgbWV0aG9kczogbWV0aG9kcyxcbiAgICAgIGZvcm06IGZvcm0sXG4gICAgICBnbG9iYWxQcm9wczogZ2xvYmFsUHJvcHMsXG4gICAgICBnbG9iYWxDb25maWc6IGdsb2JhbENvbmZpZ1xuICAgIH07XG4gICAgdmFyIGxhbmdQYWNrID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFudGRMb2NhbGUpLCB7XG4gICAgICBcIkZvcm1SZW5kZXJcIjogbG9jYWxlc1tsb2NhbGVdXG4gICAgfSksIGNvbmZpZ1Byb3ZpZGVyID09PSBudWxsIHx8IGNvbmZpZ1Byb3ZpZGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWdQcm92aWRlci5sb2NhbGUpO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfQ29uZmlnUHJvdmlkZXIsIE9iamVjdC5hc3NpZ24oe30sIGNvbmZpZ1Byb3ZpZGVyLCB7XG4gICAgICBsb2NhbGU6IGxhbmdQYWNrLFxuICAgICAgZm9ybToge1xuICAgICAgICB2YWxpZGF0ZU1lc3NhZ2VzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGZvcm1WYWxpZGF0ZU1lc3NhZ2VzKSwgdmFsaWRhdGVNZXNzYWdlcylcbiAgICAgIH1cbiAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29uZmlnQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgdmFsdWU6IGNvbmZpZ0NvbnRleHRcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGUkNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgIHZhbHVlOiBzdG9yZVxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnQsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgZm9ybTogZm9ybVxuICAgIH0sIG90aGVyUHJvcHMpKSkpKTtcbiAgfTtcbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIGdldFByb3BzID0gZnVuY3Rpb24gZ2V0UHJvcHMocHJvcHMsIGZpbHRlcikge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIE9iamVjdC5rZXlzKHByb3BzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoZmlsdGVyLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVzdWx0W2tleV0gPSBwcm9wc1trZXldO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gKEZpZWxkKSB7XG4gIHZhciBmaWx0ZXJQcm9wcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogWydhZGRvbnMnLCAnc2NoZW1hJywgJ2RlcGVuZFZhbHVlcyddO1xuICByZXR1cm4gZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZpZWxkLCBPYmplY3QuYXNzaWduKHt9LCBnZXRQcm9wcyhwcm9wcywgZmlsdGVyUHJvcHMpKSk7XG4gIH07XG59KTsiLCJpbXBvcnQgXCJhbnRkL2VzL2lucHV0L3N0eWxlXCI7XG5pbXBvcnQgX0lucHV0IGZyb20gXCJhbnRkL2VzL2lucHV0XCI7XG5pbXBvcnQgd2l0aEZpZWxkV3JhcCBmcm9tICcuLi8uLi91dGlscy93aXRoRmllbGRXcmFwJztcbmV4cG9ydCBkZWZhdWx0IHdpdGhGaWVsZFdyYXAoX0lucHV0KTsiLCJpbXBvcnQgXCJhbnRkL2VzL2lucHV0LW51bWJlci9zdHlsZVwiO1xuaW1wb3J0IF9JbnB1dE51bWJlciBmcm9tIFwiYW50ZC9lcy9pbnB1dC1udW1iZXJcIjtcbmltcG9ydCB3aXRoRmllbGRXcmFwIGZyb20gJy4uLy4uL3V0aWxzL3dpdGhGaWVsZFdyYXAnO1xuZXhwb3J0IGRlZmF1bHQgd2l0aEZpZWxkV3JhcChfSW5wdXROdW1iZXIpOyIsImltcG9ydCBcImFudGQvZXMvaW5wdXQvc3R5bGVcIjtcbmltcG9ydCBfSW5wdXQgZnJvbSBcImFudGQvZXMvaW5wdXRcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgd2l0aEZpZWxkV3JhcCBmcm9tICcuLi8uLi91dGlscy93aXRoRmllbGRXcmFwJztcbnZhciBUZXh0QXJlYSA9IGZ1bmN0aW9uIFRleHRBcmVhKHByb3BzKSB7XG4gIHZhciBmaW5hbFByb3BzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgYXV0b1NpemU6IHtcbiAgICAgIG1pblJvd3M6IDNcbiAgICB9XG4gIH0sIHByb3BzKTtcbiAgaWYgKGZpbmFsUHJvcHMucm93cykgZGVsZXRlIGZpbmFsUHJvcHMuYXV0b1NpemU7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfSW5wdXQuVGV4dEFyZWEsIE9iamVjdC5hc3NpZ24oe30sIGZpbmFsUHJvcHMpKTtcbn07XG5leHBvcnQgZGVmYXVsdCB3aXRoRmllbGRXcmFwKFRleHRBcmVhKTsiLCJpbXBvcnQgXCJhbnRkL2VzL3NlbGVjdC9zdHlsZVwiO1xuaW1wb3J0IF9TZWxlY3QgZnJvbSBcImFudGQvZXMvc2VsZWN0XCI7XG5pbXBvcnQgd2l0aEZpZWxkV3JhcCBmcm9tICcuLi8uLi91dGlscy93aXRoRmllbGRXcmFwJztcbmV4cG9ydCBkZWZhdWx0IHdpdGhGaWVsZFdyYXAoX1NlbGVjdCk7IiwiaW1wb3J0IFwiYW50ZC9lcy9zd2l0Y2gvc3R5bGVcIjtcbmltcG9ydCBfU3dpdGNoIGZyb20gXCJhbnRkL2VzL3N3aXRjaFwiO1xuaW1wb3J0IHdpdGhGaWVsZFdyYXAgZnJvbSAnLi4vLi4vdXRpbHMvd2l0aEZpZWxkV3JhcCc7XG5leHBvcnQgZGVmYXVsdCB3aXRoRmllbGRXcmFwKF9Td2l0Y2gpOyIsImltcG9ydCBcImFudGQvZXMvc3BhY2Uvc3R5bGVcIjtcbmltcG9ydCBfU3BhY2UgZnJvbSBcImFudGQvZXMvc3BhY2VcIjtcbmltcG9ydCBcImFudGQvZXMvcmFkaW8vc3R5bGVcIjtcbmltcG9ydCBfUmFkaW8gZnJvbSBcImFudGQvZXMvcmFkaW9cIjtcbmltcG9ydCB7IF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB3aXRoRmllbGRXcmFwIGZyb20gJy4uLy4uL3V0aWxzL3dpdGhGaWVsZFdyYXAnO1xudmFyIFJhZGlvQ29tcCA9IGZ1bmN0aW9uIFJhZGlvQ29tcChwcm9wcykge1xuICB2YXIgX3Byb3BzJGRpcmVjdGlvbiA9IHByb3BzLmRpcmVjdGlvbixcbiAgICBkaXJlY3Rpb24gPSBfcHJvcHMkZGlyZWN0aW9uID09PSB2b2lkIDAgPyAncm93JyA6IF9wcm9wcyRkaXJlY3Rpb24sXG4gICAgX3Byb3BzJG9wdGlvbnMgPSBwcm9wcy5vcHRpb25zLFxuICAgIG9wdGlvbnMgPSBfcHJvcHMkb3B0aW9ucyA9PT0gdm9pZCAwID8gW10gOiBfcHJvcHMkb3B0aW9ucyxcbiAgICByZXN0ID0gX19yZXN0KHByb3BzLCBbXCJkaXJlY3Rpb25cIiwgXCJvcHRpb25zXCJdKTtcbiAgaWYgKGRpcmVjdGlvbiA9PT0gJ2NvbHVtbicpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1JhZGlvLkdyb3VwLCBPYmplY3QuYXNzaWduKHt9LCByZXN0KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1NwYWNlLCB7XG4gICAgICBkaXJlY3Rpb246ICd2ZXJ0aWNhbCdcbiAgICB9LCBvcHRpb25zLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIHZhbHVlID0gaXRlbS52YWx1ZSxcbiAgICAgICAgbGFiZWwgPSBpdGVtLmxhYmVsLFxuICAgICAgICByZXN0ID0gX19yZXN0KGl0ZW0sIFtcInZhbHVlXCIsIFwibGFiZWxcIl0pO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9SYWRpbywgT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIGtleTogdmFsdWUsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSwgcmVzdCksIGxhYmVsKTtcbiAgICB9KSkpO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfUmFkaW8uR3JvdXAsIE9iamVjdC5hc3NpZ24oe30sIHJlc3QsIHtcbiAgICBvcHRpb25zOiBvcHRpb25zXG4gIH0pKTtcbn07XG5leHBvcnQgZGVmYXVsdCB3aXRoRmllbGRXcmFwKFJhZGlvQ29tcCk7IiwiaW1wb3J0IFwiYW50ZC9lcy9yYXRlL3N0eWxlXCI7XG5pbXBvcnQgX1JhdGUgZnJvbSBcImFudGQvZXMvcmF0ZVwiO1xuaW1wb3J0IHdpdGhGaWVsZFdyYXAgZnJvbSAnLi4vLi4vdXRpbHMvd2l0aEZpZWxkV3JhcCc7XG5leHBvcnQgZGVmYXVsdCB3aXRoRmllbGRXcmFwKF9SYXRlKTsiLCJpbXBvcnQgXCJhbnRkL2VzL3RyZWUtc2VsZWN0L3N0eWxlXCI7XG5pbXBvcnQgX1RyZWVTZWxlY3QgZnJvbSBcImFudGQvZXMvdHJlZS1zZWxlY3RcIjtcbmltcG9ydCB3aXRoRmllbGRXcmFwIGZyb20gJy4uLy4uL3V0aWxzL3dpdGhGaWVsZFdyYXAnO1xuZXhwb3J0IGRlZmF1bHQgd2l0aEZpZWxkV3JhcChfVHJlZVNlbGVjdCk7IiwiaW1wb3J0IFwiYW50ZC9lcy9jaGVja2JveC9zdHlsZVwiO1xuaW1wb3J0IF9DaGVja2JveCBmcm9tIFwiYW50ZC9lcy9jaGVja2JveFwiO1xuaW1wb3J0IHsgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHdpdGhGaWVsZFdyYXAgZnJvbSAnLi4vLi4vdXRpbHMvd2l0aEZpZWxkV3JhcCc7XG52YXIgQ2hlY2tCb3ggPSBmdW5jdGlvbiBDaGVja0JveChfYSkge1xuICB2YXIgdGl0bGUgPSBfYS50aXRsZSxcbiAgICByZXN0ID0gX19yZXN0KF9hLCBbXCJ0aXRsZVwiXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0NoZWNrYm94LCBPYmplY3QuYXNzaWduKHt9LCByZXN0KSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgc3R5bGU6IHtcbiAgICAgIG1hcmdpbkxlZnQ6ICcxMnB4J1xuICAgIH1cbiAgfSwgdGl0bGUpKTtcbn07XG5leHBvcnQgZGVmYXVsdCB3aXRoRmllbGRXcmFwKENoZWNrQm94KTsiLCJpbXBvcnQgXCJhbnRkL2VzL3NwYWNlL3N0eWxlXCI7XG5pbXBvcnQgX1NwYWNlIGZyb20gXCJhbnRkL2VzL3NwYWNlXCI7XG5pbXBvcnQgXCJhbnRkL2VzL2NoZWNrYm94L3N0eWxlXCI7XG5pbXBvcnQgX0NoZWNrYm94IGZyb20gXCJhbnRkL2VzL2NoZWNrYm94XCI7XG5pbXBvcnQgeyBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgd2l0aEZpZWxkV3JhcCBmcm9tICcuLi8uLi91dGlscy93aXRoRmllbGRXcmFwJztcbnZhciBDaGVja2JveGVzID0gZnVuY3Rpb24gQ2hlY2tib3hlcyhwcm9wcykge1xuICB2YXIgX3Byb3BzJGRpcmVjdGlvbiA9IHByb3BzLmRpcmVjdGlvbixcbiAgICBkaXJlY3Rpb24gPSBfcHJvcHMkZGlyZWN0aW9uID09PSB2b2lkIDAgPyAncm93JyA6IF9wcm9wcyRkaXJlY3Rpb24sXG4gICAgX3Byb3BzJG9wdGlvbnMgPSBwcm9wcy5vcHRpb25zLFxuICAgIG9wdGlvbnMgPSBfcHJvcHMkb3B0aW9ucyA9PT0gdm9pZCAwID8gW10gOiBfcHJvcHMkb3B0aW9ucyxcbiAgICByZXN0ID0gX19yZXN0KHByb3BzLCBbXCJkaXJlY3Rpb25cIiwgXCJvcHRpb25zXCJdKTtcbiAgaWYgKGRpcmVjdGlvbiA9PT0gJ2NvbHVtbicpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0NoZWNrYm94Lkdyb3VwLCBPYmplY3QuYXNzaWduKHt9LCByZXN0KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1NwYWNlLCB7XG4gICAgICBkaXJlY3Rpb246ICd2ZXJ0aWNhbCdcbiAgICB9LCBvcHRpb25zLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIHZhbHVlID0gaXRlbS52YWx1ZSxcbiAgICAgICAgbGFiZWwgPSBpdGVtLmxhYmVsLFxuICAgICAgICByZXN0ID0gX19yZXN0KGl0ZW0sIFtcInZhbHVlXCIsIFwibGFiZWxcIl0pO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9DaGVja2JveCwgT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIGtleTogdmFsdWUsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSwgcmVzdCksIGxhYmVsKTtcbiAgICB9KSkpO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfQ2hlY2tib3guR3JvdXAsIE9iamVjdC5hc3NpZ24oe30sIHJlc3QsIHtcbiAgICBvcHRpb25zOiBvcHRpb25zXG4gIH0pKTtcbn07XG5leHBvcnQgZGVmYXVsdCB3aXRoRmllbGRXcmFwKENoZWNrYm94ZXMpOyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVzU2VjcmV0O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9IHJlcXVpcmUoJy4vbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG5cbmZ1bmN0aW9uIGVtcHR5RnVuY3Rpb24oKSB7fVxuZnVuY3Rpb24gZW1wdHlGdW5jdGlvbldpdGhSZXNldCgpIHt9XG5lbXB0eUZ1bmN0aW9uV2l0aFJlc2V0LnJlc2V0V2FybmluZ0NhY2hlID0gZW1wdHlGdW5jdGlvbjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gc2hpbShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgIGlmIChzZWNyZXQgPT09IFJlYWN0UHJvcFR5cGVzU2VjcmV0KSB7XG4gICAgICAvLyBJdCBpcyBzdGlsbCBzYWZlIHdoZW4gY2FsbGVkIGZyb20gUmVhY3QuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAnQ2FsbGluZyBQcm9wVHlwZXMgdmFsaWRhdG9ycyBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gJyArXG4gICAgICAnVXNlIFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcygpIHRvIGNhbGwgdGhlbS4gJyArXG4gICAgICAnUmVhZCBtb3JlIGF0IGh0dHA6Ly9mYi5tZS91c2UtY2hlY2stcHJvcC10eXBlcydcbiAgICApO1xuICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgIHRocm93IGVycjtcbiAgfTtcbiAgc2hpbS5pc1JlcXVpcmVkID0gc2hpbTtcbiAgZnVuY3Rpb24gZ2V0U2hpbSgpIHtcbiAgICByZXR1cm4gc2hpbTtcbiAgfTtcbiAgLy8gSW1wb3J0YW50IVxuICAvLyBLZWVwIHRoaXMgbGlzdCBpbiBzeW5jIHdpdGggcHJvZHVjdGlvbiB2ZXJzaW9uIGluIGAuL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzYC5cbiAgdmFyIFJlYWN0UHJvcFR5cGVzID0ge1xuICAgIGFycmF5OiBzaGltLFxuICAgIGJpZ2ludDogc2hpbSxcbiAgICBib29sOiBzaGltLFxuICAgIGZ1bmM6IHNoaW0sXG4gICAgbnVtYmVyOiBzaGltLFxuICAgIG9iamVjdDogc2hpbSxcbiAgICBzdHJpbmc6IHNoaW0sXG4gICAgc3ltYm9sOiBzaGltLFxuXG4gICAgYW55OiBzaGltLFxuICAgIGFycmF5T2Y6IGdldFNoaW0sXG4gICAgZWxlbWVudDogc2hpbSxcbiAgICBlbGVtZW50VHlwZTogc2hpbSxcbiAgICBpbnN0YW5jZU9mOiBnZXRTaGltLFxuICAgIG5vZGU6IHNoaW0sXG4gICAgb2JqZWN0T2Y6IGdldFNoaW0sXG4gICAgb25lT2Y6IGdldFNoaW0sXG4gICAgb25lT2ZUeXBlOiBnZXRTaGltLFxuICAgIHNoYXBlOiBnZXRTaGltLFxuICAgIGV4YWN0OiBnZXRTaGltLFxuXG4gICAgY2hlY2tQcm9wVHlwZXM6IGVtcHR5RnVuY3Rpb25XaXRoUmVzZXQsXG4gICAgcmVzZXRXYXJuaW5nQ2FjaGU6IGVtcHR5RnVuY3Rpb25cbiAgfTtcblxuICBSZWFjdFByb3BUeXBlcy5Qcm9wVHlwZXMgPSBSZWFjdFByb3BUeXBlcztcblxuICByZXR1cm4gUmVhY3RQcm9wVHlwZXM7XG59O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgUmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG5cbiAgLy8gQnkgZXhwbGljaXRseSB1c2luZyBgcHJvcC10eXBlc2AgeW91IGFyZSBvcHRpbmcgaW50byBuZXcgZGV2ZWxvcG1lbnQgYmVoYXZpb3IuXG4gIC8vIGh0dHA6Ly9mYi5tZS9wcm9wLXR5cGVzLWluLXByb2RcbiAgdmFyIHRocm93T25EaXJlY3RBY2Nlc3MgPSB0cnVlO1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMnKShSZWFjdElzLmlzRWxlbWVudCwgdGhyb3dPbkRpcmVjdEFjY2Vzcyk7XG59IGVsc2Uge1xuICAvLyBCeSBleHBsaWNpdGx5IHVzaW5nIGBwcm9wLXR5cGVzYCB5b3UgYXJlIG9wdGluZyBpbnRvIG5ldyBwcm9kdWN0aW9uIGJlaGF2aW9yLlxuICAvLyBodHRwOi8vZmIubWUvcHJvcC10eXBlcy1pbi1wcm9kXG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMnKSgpO1xufVxuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbnZhciBnbG9iYWwgPSBtb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lk1hdGggPT0gTWF0aFxuICA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9ICd1bmRlZmluZWQnICYmIHNlbGYuTWF0aCA9PSBNYXRoID8gc2VsZlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgOiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuaWYgKHR5cGVvZiBfX2cgPT0gJ251bWJlcicpIF9fZyA9IGdsb2JhbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuIiwidmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHsgdmVyc2lvbjogJzIuNi4xMicgfTtcbmlmICh0eXBlb2YgX19lID09ICdudW1iZXInKSBfX2UgPSBjb3JlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGEgZnVuY3Rpb24hJyk7XG4gIHJldHVybiBpdDtcbn07XG4iLCIvLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgdGhhdCwgbGVuZ3RoKSB7XG4gIGFGdW5jdGlvbihmbik7XG4gIGlmICh0aGF0ID09PSB1bmRlZmluZWQpIHJldHVybiBmbjtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbiAoYSkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7XG4gICAgfTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nO1xufTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbiIsIi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnYScsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9IH0pLmEgIT0gNztcbn0pO1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgZG9jdW1lbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudDtcbi8vIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnIGluIG9sZCBJRVxudmFyIGlzID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2RpdicpLCAnYScsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9IH0pLmEgIT0gNztcbn0pO1xuIiwiLy8gNy4xLjEgVG9QcmltaXRpdmUoaW5wdXQgWywgUHJlZmVycmVkVHlwZV0pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbi8vIGluc3RlYWQgb2YgdGhlIEVTNiBzcGVjIHZlcnNpb24sIHdlIGRpZG4ndCBpbXBsZW1lbnQgQEB0b1ByaW1pdGl2ZSBjYXNlXG4vLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFMpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHJldHVybiBpdDtcbiAgdmFyIGZuLCB2YWw7XG4gIGlmIChTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICBpZiAodHlwZW9mIChmbiA9IGl0LnZhbHVlT2YpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKCFTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59O1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuL19pZTgtZG9tLWRlZmluZScpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG52YXIgZFAgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbmV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuIGRQKE8sIFAsIEF0dHJpYnV0ZXMpO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKCdnZXQnIGluIEF0dHJpYnV0ZXMgfHwgJ3NldCcgaW4gQXR0cmlidXRlcykgdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCEnKTtcbiAgaWYgKCd2YWx1ZScgaW4gQXR0cmlidXRlcykgT1tQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG4gIHJldHVybiBPO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJpdG1hcCwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZTogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfTtcbn07XG4iLCJ2YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICByZXR1cm4gZFAuZihvYmplY3QsIGtleSwgY3JlYXRlRGVzYygxLCB2YWx1ZSkpO1xufSA6IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iamVjdDtcbn07XG4iLCJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxudmFyICRleHBvcnQgPSBmdW5jdGlvbiAodHlwZSwgbmFtZSwgc291cmNlKSB7XG4gIHZhciBJU19GT1JDRUQgPSB0eXBlICYgJGV4cG9ydC5GO1xuICB2YXIgSVNfR0xPQkFMID0gdHlwZSAmICRleHBvcnQuRztcbiAgdmFyIElTX1NUQVRJQyA9IHR5cGUgJiAkZXhwb3J0LlM7XG4gIHZhciBJU19QUk9UTyA9IHR5cGUgJiAkZXhwb3J0LlA7XG4gIHZhciBJU19CSU5EID0gdHlwZSAmICRleHBvcnQuQjtcbiAgdmFyIElTX1dSQVAgPSB0eXBlICYgJGV4cG9ydC5XO1xuICB2YXIgZXhwb3J0cyA9IElTX0dMT0JBTCA/IGNvcmUgOiBjb3JlW25hbWVdIHx8IChjb3JlW25hbWVdID0ge30pO1xuICB2YXIgZXhwUHJvdG8gPSBleHBvcnRzW1BST1RPVFlQRV07XG4gIHZhciB0YXJnZXQgPSBJU19HTE9CQUwgPyBnbG9iYWwgOiBJU19TVEFUSUMgPyBnbG9iYWxbbmFtZV0gOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdO1xuICB2YXIga2V5LCBvd24sIG91dDtcbiAgaWYgKElTX0dMT0JBTCkgc291cmNlID0gbmFtZTtcbiAgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgLy8gY29udGFpbnMgaW4gbmF0aXZlXG4gICAgb3duID0gIUlTX0ZPUkNFRCAmJiB0YXJnZXQgJiYgdGFyZ2V0W2tleV0gIT09IHVuZGVmaW5lZDtcbiAgICBpZiAob3duICYmIGhhcyhleHBvcnRzLCBrZXkpKSBjb250aW51ZTtcbiAgICAvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZFxuICAgIG91dCA9IG93biA/IHRhcmdldFtrZXldIDogc291cmNlW2tleV07XG4gICAgLy8gcHJldmVudCBnbG9iYWwgcG9sbHV0aW9uIGZvciBuYW1lc3BhY2VzXG4gICAgZXhwb3J0c1trZXldID0gSVNfR0xPQkFMICYmIHR5cGVvZiB0YXJnZXRba2V5XSAhPSAnZnVuY3Rpb24nID8gc291cmNlW2tleV1cbiAgICAvLyBiaW5kIHRpbWVycyB0byBnbG9iYWwgZm9yIGNhbGwgZnJvbSBleHBvcnQgY29udGV4dFxuICAgIDogSVNfQklORCAmJiBvd24gPyBjdHgob3V0LCBnbG9iYWwpXG4gICAgLy8gd3JhcCBnbG9iYWwgY29uc3RydWN0b3JzIGZvciBwcmV2ZW50IGNoYW5nZSB0aGVtIGluIGxpYnJhcnlcbiAgICA6IElTX1dSQVAgJiYgdGFyZ2V0W2tleV0gPT0gb3V0ID8gKGZ1bmN0aW9uIChDKSB7XG4gICAgICB2YXIgRiA9IGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQykge1xuICAgICAgICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IEMoKTtcbiAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIG5ldyBDKGEpO1xuICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IEMoYSwgYik7XG4gICAgICAgICAgfSByZXR1cm4gbmV3IEMoYSwgYiwgYyk7XG4gICAgICAgIH0gcmV0dXJuIEMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgICBGW1BST1RPVFlQRV0gPSBDW1BST1RPVFlQRV07XG4gICAgICByZXR1cm4gRjtcbiAgICAvLyBtYWtlIHN0YXRpYyB2ZXJzaW9ucyBmb3IgcHJvdG90eXBlIG1ldGhvZHNcbiAgICB9KShvdXQpIDogSVNfUFJPVE8gJiYgdHlwZW9mIG91dCA9PSAnZnVuY3Rpb24nID8gY3R4KEZ1bmN0aW9uLmNhbGwsIG91dCkgOiBvdXQ7XG4gICAgLy8gZXhwb3J0IHByb3RvIG1ldGhvZHMgdG8gY29yZS4lQ09OU1RSVUNUT1IlLm1ldGhvZHMuJU5BTUUlXG4gICAgaWYgKElTX1BST1RPKSB7XG4gICAgICAoZXhwb3J0cy52aXJ0dWFsIHx8IChleHBvcnRzLnZpcnR1YWwgPSB7fSkpW2tleV0gPSBvdXQ7XG4gICAgICAvLyBleHBvcnQgcHJvdG8gbWV0aG9kcyB0byBjb3JlLiVDT05TVFJVQ1RPUiUucHJvdG90eXBlLiVOQU1FJVxuICAgICAgaWYgKHR5cGUgJiAkZXhwb3J0LlIgJiYgZXhwUHJvdG8gJiYgIWV4cFByb3RvW2tleV0pIGhpZGUoZXhwUHJvdG8sIGtleSwgb3V0KTtcbiAgICB9XG4gIH1cbn07XG4vLyB0eXBlIGJpdG1hcFxuJGV4cG9ydC5GID0gMTsgICAvLyBmb3JjZWRcbiRleHBvcnQuRyA9IDI7ICAgLy8gZ2xvYmFsXG4kZXhwb3J0LlMgPSA0OyAgIC8vIHN0YXRpY1xuJGV4cG9ydC5QID0gODsgICAvLyBwcm90b1xuJGV4cG9ydC5CID0gMTY7ICAvLyBiaW5kXG4kZXhwb3J0LlcgPSAzMjsgIC8vIHdyYXBcbiRleHBvcnQuVSA9IDY0OyAgLy8gc2FmZVxuJGV4cG9ydC5SID0gMTI4OyAvLyByZWFsIHByb3RvIG1ldGhvZCBmb3IgYGxpYnJhcnlgXG5tb2R1bGUuZXhwb3J0cyA9ICRleHBvcnQ7XG4iLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcbn07XG4iLCIvLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKSA/IE9iamVjdCA6IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gY29mKGl0KSA9PSAnU3RyaW5nJyA/IGl0LnNwbGl0KCcnKSA6IE9iamVjdChpdCk7XG59O1xuIiwiLy8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsIi8vIHRvIGluZGV4ZWQgb2JqZWN0LCB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0Jyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBJT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07XG4iLCIvLyA3LjEuNCBUb0ludGVnZXJcbnZhciBjZWlsID0gTWF0aC5jZWlsO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpc05hTihpdCA9ICtpdCkgPyAwIDogKGl0ID4gMCA/IGZsb29yIDogY2VpbCkoaXQpO1xufTtcbiIsIi8vIDcuMS4xNSBUb0xlbmd0aFxudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCA+IDAgPyBtaW4odG9JbnRlZ2VyKGl0KSwgMHgxZmZmZmZmZmZmZmZmZikgOiAwOyAvLyBwb3coMiwgNTMpIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59O1xuIiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGluZGV4LCBsZW5ndGgpIHtcbiAgaW5kZXggPSB0b0ludGVnZXIoaW5kZXgpO1xuICByZXR1cm4gaW5kZXggPCAwID8gbWF4KGluZGV4ICsgbGVuZ3RoLCAwKSA6IG1pbihpbmRleCwgbGVuZ3RoKTtcbn07XG4iLCIvLyBmYWxzZSAtPiBBcnJheSNpbmRleE9mXG4vLyB0cnVlICAtPiBBcnJheSNpbmNsdWRlc1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4vX3RvLWFic29sdXRlLWluZGV4Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJU19JTkNMVURFUykge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBlbCwgZnJvbUluZGV4KSB7XG4gICAgdmFyIE8gPSB0b0lPYmplY3QoJHRoaXMpO1xuICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGZyb21JbmRleCwgbGVuZ3RoKTtcbiAgICB2YXIgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICBpZiAoSVNfSU5DTFVERVMgJiYgZWwgIT0gZWwpIHdoaWxlIChsZW5ndGggPiBpbmRleCkge1xuICAgICAgdmFsdWUgPSBPW2luZGV4KytdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgaWYgKHZhbHVlICE9IHZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBcnJheSNpbmRleE9mIGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG4gICAgfSBlbHNlIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSBpZiAoSVNfSU5DTFVERVMgfHwgaW5kZXggaW4gTykge1xuICAgICAgaWYgKE9baW5kZXhdID09PSBlbCkgcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7XG4gICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICB9O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gdHJ1ZTtcbiIsInZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHt9KTtcbn0pKCd2ZXJzaW9ucycsIFtdKS5wdXNoKHtcbiAgdmVyc2lvbjogY29yZS52ZXJzaW9uLFxuICBtb2RlOiByZXF1aXJlKCcuL19saWJyYXJ5JykgPyAncHVyZScgOiAnZ2xvYmFsJyxcbiAgY29weXJpZ2h0OiAnwqkgMjAyMCBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KSdcbn0pO1xuIiwidmFyIGlkID0gMDtcbnZhciBweCA9IE1hdGgucmFuZG9tKCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuICdTeW1ib2woJy5jb25jYXQoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSwgJylfJywgKCsraWQgKyBweCkudG9TdHJpbmcoMzYpKTtcbn07XG4iLCJ2YXIgc2hhcmVkID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ2tleXMnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gc2hhcmVkW2tleV0gfHwgKHNoYXJlZFtrZXldID0gdWlkKGtleSkpO1xufTtcbiIsInZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgYXJyYXlJbmRleE9mID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKShmYWxzZSk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZXMpIHtcbiAgdmFyIE8gPSB0b0lPYmplY3Qob2JqZWN0KTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIE8pIGlmIChrZXkgIT0gSUVfUFJPVE8pIGhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiLy8gSUUgOC0gZG9uJ3QgZW51bSBidWcga2V5c1xubW9kdWxlLmV4cG9ydHMgPSAoXG4gICdjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2YnXG4pLnNwbGl0KCcsJyk7XG4iLCIvLyAxOS4xLjIuMTQgLyAxNS4yLjMuMTQgT2JqZWN0LmtleXMoTylcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKSB7XG4gIHJldHVybiAka2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59O1xuIiwiZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbiIsImV4cG9ydHMuZiA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuIiwiLy8gNy4xLjEzIFRvT2JqZWN0KGFyZ3VtZW50KVxudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyAxOS4xLjIuMSBPYmplY3QuYXNzaWduKHRhcmdldCwgc291cmNlLCAuLi4pXG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIGdPUFMgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpO1xudmFyIHBJRSA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0Jyk7XG52YXIgJGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG5cbi8vIHNob3VsZCB3b3JrIHdpdGggc3ltYm9scyBhbmQgc2hvdWxkIGhhdmUgZGV0ZXJtaW5pc3RpYyBwcm9wZXJ0eSBvcmRlciAoVjggYnVnKVxubW9kdWxlLmV4cG9ydHMgPSAhJGFzc2lnbiB8fCByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgdmFyIEEgPSB7fTtcbiAgdmFyIEIgPSB7fTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHZhciBTID0gU3ltYm9sKCk7XG4gIHZhciBLID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0JztcbiAgQVtTXSA9IDc7XG4gIEsuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGspIHsgQltrXSA9IGs7IH0pO1xuICByZXR1cm4gJGFzc2lnbih7fSwgQSlbU10gIT0gNyB8fCBPYmplY3Qua2V5cygkYXNzaWduKHt9LCBCKSkuam9pbignJykgIT0gSztcbn0pID8gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgc291cmNlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgdmFyIFQgPSB0b09iamVjdCh0YXJnZXQpO1xuICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDE7XG4gIHZhciBnZXRTeW1ib2xzID0gZ09QUy5mO1xuICB2YXIgaXNFbnVtID0gcElFLmY7XG4gIHdoaWxlIChhTGVuID4gaW5kZXgpIHtcbiAgICB2YXIgUyA9IElPYmplY3QoYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICB2YXIga2V5cyA9IGdldFN5bWJvbHMgPyBnZXRLZXlzKFMpLmNvbmNhdChnZXRTeW1ib2xzKFMpKSA6IGdldEtleXMoUyk7XG4gICAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIHZhciBqID0gMDtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChsZW5ndGggPiBqKSB7XG4gICAgICBrZXkgPSBrZXlzW2orK107XG4gICAgICBpZiAoIURFU0NSSVBUT1JTIHx8IGlzRW51bS5jYWxsKFMsIGtleSkpIFRba2V5XSA9IFNba2V5XTtcbiAgICB9XG4gIH0gcmV0dXJuIFQ7XG59IDogJGFzc2lnbjtcbiIsIi8vIDE5LjEuMy4xIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBzb3VyY2UpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiwgJ09iamVjdCcsIHsgYXNzaWduOiByZXF1aXJlKCcuL19vYmplY3QtYXNzaWduJykgfSk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QuYXNzaWduJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3QuYXNzaWduO1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9hc3NpZ25cIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKFwiLi4vY29yZS1qcy9vYmplY3QvYXNzaWduXCIpO1xuXG52YXIgX2Fzc2lnbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3NpZ24pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSBfYXNzaWduMi5kZWZhdWx0IHx8IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufTsiLCIvKlxub2JqZWN0LWFzc2lnblxuKGMpIFNpbmRyZSBTb3JodXNcbkBsaWNlbnNlIE1JVFxuKi9cblxuJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBwcm9wSXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuZnVuY3Rpb24gdG9PYmplY3QodmFsKSB7XG5cdGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3QuYXNzaWduIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBudWxsIG9yIHVuZGVmaW5lZCcpO1xuXHR9XG5cblx0cmV0dXJuIE9iamVjdCh2YWwpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVc2VOYXRpdmUoKSB7XG5cdHRyeSB7XG5cdFx0aWYgKCFPYmplY3QuYXNzaWduKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZWN0IGJ1Z2d5IHByb3BlcnR5IGVudW1lcmF0aW9uIG9yZGVyIGluIG9sZGVyIFY4IHZlcnNpb25zLlxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9NDExOFxuXHRcdHZhciB0ZXN0MSA9IG5ldyBTdHJpbmcoJ2FiYycpOyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXctd3JhcHBlcnNcblx0XHR0ZXN0MVs1XSA9ICdkZSc7XG5cdFx0aWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QxKVswXSA9PT0gJzUnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MiA9IHt9O1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykge1xuXHRcdFx0dGVzdDJbJ18nICsgU3RyaW5nLmZyb21DaGFyQ29kZShpKV0gPSBpO1xuXHRcdH1cblx0XHR2YXIgb3JkZXIyID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDIpLm1hcChmdW5jdGlvbiAobikge1xuXHRcdFx0cmV0dXJuIHRlc3QyW25dO1xuXHRcdH0pO1xuXHRcdGlmIChvcmRlcjIuam9pbignJykgIT09ICcwMTIzNDU2Nzg5Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDMgPSB7fTtcblx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChsZXR0ZXIpIHtcblx0XHRcdHRlc3QzW2xldHRlcl0gPSBsZXR0ZXI7XG5cdFx0fSk7XG5cdFx0aWYgKE9iamVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sIHRlc3QzKSkuam9pbignJykgIT09XG5cdFx0XHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Ly8gV2UgZG9uJ3QgZXhwZWN0IGFueSBvZiB0aGUgYWJvdmUgdG8gdGhyb3csIGJ1dCBiZXR0ZXIgdG8gYmUgc2FmZS5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaG91bGRVc2VOYXRpdmUoKSA/IE9iamVjdC5hc3NpZ24gOiBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHtcblx0dmFyIGZyb207XG5cdHZhciB0byA9IHRvT2JqZWN0KHRhcmdldCk7XG5cdHZhciBzeW1ib2xzO1xuXG5cdGZvciAodmFyIHMgPSAxOyBzIDwgYXJndW1lbnRzLmxlbmd0aDsgcysrKSB7XG5cdFx0ZnJvbSA9IE9iamVjdChhcmd1bWVudHNbc10pO1xuXG5cdFx0Zm9yICh2YXIga2V5IGluIGZyb20pIHtcblx0XHRcdGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGZyb20sIGtleSkpIHtcblx0XHRcdFx0dG9ba2V5XSA9IGZyb21ba2V5XTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG5cdFx0XHRzeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGZyb20pO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzeW1ib2xzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmIChwcm9wSXNFbnVtZXJhYmxlLmNhbGwoZnJvbSwgc3ltYm9sc1tpXSkpIHtcblx0XHRcdFx0XHR0b1tzeW1ib2xzW2ldXSA9IGZyb21bc3ltYm9sc1tpXV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdG87XG59O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxuLy8gLS0gSW5saW5lZCBmcm9tIGZianMgLS1cblxudmFyIGVtcHR5T2JqZWN0ID0ge307XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIE9iamVjdC5mcmVlemUoZW1wdHlPYmplY3QpO1xufVxuXG52YXIgdmFsaWRhdGVGb3JtYXQgPSBmdW5jdGlvbiB2YWxpZGF0ZUZvcm1hdChmb3JtYXQpIHt9O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YWxpZGF0ZUZvcm1hdCA9IGZ1bmN0aW9uIHZhbGlkYXRlRm9ybWF0KGZvcm1hdCkge1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhcmlhbnQgcmVxdWlyZXMgYW4gZXJyb3IgbWVzc2FnZSBhcmd1bWVudCcpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gX2ludmFyaWFudChjb25kaXRpb24sIGZvcm1hdCwgYSwgYiwgYywgZCwgZSwgZikge1xuICB2YWxpZGF0ZUZvcm1hdChmb3JtYXQpO1xuXG4gIGlmICghY29uZGl0aW9uKSB7XG4gICAgdmFyIGVycm9yO1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoJ01pbmlmaWVkIGV4Y2VwdGlvbiBvY2N1cnJlZDsgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50ICcgKyAnZm9yIHRoZSBmdWxsIGVycm9yIG1lc3NhZ2UgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGFyZ3MgPSBbYSwgYiwgYywgZCwgZSwgZl07XG4gICAgICB2YXIgYXJnSW5kZXggPSAwO1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107XG4gICAgICB9KSk7XG4gICAgICBlcnJvci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgIH1cblxuICAgIGVycm9yLmZyYW1lc1RvUG9wID0gMTsgLy8gd2UgZG9uJ3QgY2FyZSBhYm91dCBpbnZhcmlhbnQncyBvd24gZnJhbWVcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG52YXIgd2FybmluZyA9IGZ1bmN0aW9uKCl7fTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIHByaW50V2FybmluZyA9IGZ1bmN0aW9uIHByaW50V2FybmluZyhmb3JtYXQpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgdmFyIG1lc3NhZ2UgPSAnV2FybmluZzogJyArIGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTtcbiAgICB9KTtcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8gLS0tIFdlbGNvbWUgdG8gZGVidWdnaW5nIFJlYWN0IC0tLVxuICAgICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCB5b3UgY2FuIHVzZSB0aGlzIHN0YWNrXG4gICAgICAvLyB0byBmaW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS5cbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9IGNhdGNoICh4KSB7fVxuICB9O1xuXG4gIHdhcm5pbmcgPSBmdW5jdGlvbiB3YXJuaW5nKGNvbmRpdGlvbiwgZm9ybWF0KSB7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2B3YXJuaW5nKGNvbmRpdGlvbiwgZm9ybWF0LCAuLi5hcmdzKWAgcmVxdWlyZXMgYSB3YXJuaW5nICcgKyAnbWVzc2FnZSBhcmd1bWVudCcpO1xuICAgIH1cblxuICAgIGlmIChmb3JtYXQuaW5kZXhPZignRmFpbGVkIENvbXBvc2l0ZSBwcm9wVHlwZTogJykgPT09IDApIHtcbiAgICAgIHJldHVybjsgLy8gSWdub3JlIENvbXBvc2l0ZUNvbXBvbmVudCBwcm9wdHlwZSBjaGVjay5cbiAgICB9XG5cbiAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIgPiAyID8gX2xlbjIgLSAyIDogMCksIF9rZXkyID0gMjsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyIC0gMl0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcuYXBwbHkodW5kZWZpbmVkLCBbZm9ybWF0XS5jb25jYXQoYXJncykpO1xuICAgIH1cbiAgfTtcbn1cblxuLy8gLy0tIElubGluZWQgZnJvbSBmYmpzIC0tXG5cbnZhciBNSVhJTlNfS0VZID0gJ21peGlucyc7XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBhbGxvdyB0aGUgY3JlYXRpb24gb2YgYW5vbnltb3VzIGZ1bmN0aW9ucyB3aGljaCBkbyBub3Rcbi8vIGhhdmUgLm5hbWUgc2V0IHRvIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSBiZWluZyBhc3NpZ25lZCB0by5cbmZ1bmN0aW9uIGlkZW50aXR5KGZuKSB7XG4gIHJldHVybiBmbjtcbn1cblxudmFyIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMgPSB7XG4gICAgcHJvcDogJ3Byb3AnLFxuICAgIGNvbnRleHQ6ICdjb250ZXh0JyxcbiAgICBjaGlsZENvbnRleHQ6ICdjaGlsZCBjb250ZXh0J1xuICB9O1xufSBlbHNlIHtcbiAgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMgPSB7fTtcbn1cblxuZnVuY3Rpb24gZmFjdG9yeShSZWFjdENvbXBvbmVudCwgaXNWYWxpZEVsZW1lbnQsIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlKSB7XG4gIC8qKlxuICAgKiBQb2xpY2llcyB0aGF0IGRlc2NyaWJlIG1ldGhvZHMgaW4gYFJlYWN0Q2xhc3NJbnRlcmZhY2VgLlxuICAgKi9cblxuICB2YXIgaW5qZWN0ZWRNaXhpbnMgPSBbXTtcblxuICAvKipcbiAgICogQ29tcG9zaXRlIGNvbXBvbmVudHMgYXJlIGhpZ2hlci1sZXZlbCBjb21wb25lbnRzIHRoYXQgY29tcG9zZSBvdGhlciBjb21wb3NpdGVcbiAgICogb3IgaG9zdCBjb21wb25lbnRzLlxuICAgKlxuICAgKiBUbyBjcmVhdGUgYSBuZXcgdHlwZSBvZiBgUmVhY3RDbGFzc2AsIHBhc3MgYSBzcGVjaWZpY2F0aW9uIG9mXG4gICAqIHlvdXIgbmV3IGNsYXNzIHRvIGBSZWFjdC5jcmVhdGVDbGFzc2AuIFRoZSBvbmx5IHJlcXVpcmVtZW50IG9mIHlvdXIgY2xhc3NcbiAgICogc3BlY2lmaWNhdGlvbiBpcyB0aGF0IHlvdSBpbXBsZW1lbnQgYSBgcmVuZGVyYCBtZXRob2QuXG4gICAqXG4gICAqICAgdmFyIE15Q29tcG9uZW50ID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgKiAgICAgcmVuZGVyOiBmdW5jdGlvbigpIHtcbiAgICogICAgICAgcmV0dXJuIDxkaXY+SGVsbG8gV29ybGQ8L2Rpdj47XG4gICAqICAgICB9XG4gICAqICAgfSk7XG4gICAqXG4gICAqIFRoZSBjbGFzcyBzcGVjaWZpY2F0aW9uIHN1cHBvcnRzIGEgc3BlY2lmaWMgcHJvdG9jb2wgb2YgbWV0aG9kcyB0aGF0IGhhdmVcbiAgICogc3BlY2lhbCBtZWFuaW5nIChlLmcuIGByZW5kZXJgKS4gU2VlIGBSZWFjdENsYXNzSW50ZXJmYWNlYCBmb3JcbiAgICogbW9yZSB0aGUgY29tcHJlaGVuc2l2ZSBwcm90b2NvbC4gQW55IG90aGVyIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgaW4gdGhlXG4gICAqIGNsYXNzIHNwZWNpZmljYXRpb24gd2lsbCBiZSBhdmFpbGFibGUgb24gdGhlIHByb3RvdHlwZS5cbiAgICpcbiAgICogQGludGVyZmFjZSBSZWFjdENsYXNzSW50ZXJmYWNlXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdmFyIFJlYWN0Q2xhc3NJbnRlcmZhY2UgPSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgTWl4aW4gb2JqZWN0cyB0byBpbmNsdWRlIHdoZW4gZGVmaW5pbmcgeW91ciBjb21wb25lbnQuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7YXJyYXl9XG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgbWl4aW5zOiAnREVGSU5FX01BTlknLFxuXG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgcHJvcGVydGllcyBhbmQgbWV0aG9kcyB0aGF0IHNob3VsZCBiZSBkZWZpbmVkIG9uXG4gICAgICogdGhlIGNvbXBvbmVudCdzIGNvbnN0cnVjdG9yIGluc3RlYWQgb2YgaXRzIHByb3RvdHlwZSAoc3RhdGljIG1ldGhvZHMpLlxuICAgICAqXG4gICAgICogQHR5cGUge29iamVjdH1cbiAgICAgKiBAb3B0aW9uYWxcbiAgICAgKi9cbiAgICBzdGF0aWNzOiAnREVGSU5FX01BTlknLFxuXG4gICAgLyoqXG4gICAgICogRGVmaW5pdGlvbiBvZiBwcm9wIHR5cGVzIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgcHJvcFR5cGVzOiAnREVGSU5FX01BTlknLFxuXG4gICAgLyoqXG4gICAgICogRGVmaW5pdGlvbiBvZiBjb250ZXh0IHR5cGVzIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgY29udGV4dFR5cGVzOiAnREVGSU5FX01BTlknLFxuXG4gICAgLyoqXG4gICAgICogRGVmaW5pdGlvbiBvZiBjb250ZXh0IHR5cGVzIHRoaXMgY29tcG9uZW50IHNldHMgZm9yIGl0cyBjaGlsZHJlbi5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgY2hpbGRDb250ZXh0VHlwZXM6ICdERUZJTkVfTUFOWScsXG5cbiAgICAvLyA9PT09IERlZmluaXRpb24gbWV0aG9kcyA9PT09XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBtb3VudGVkLiBWYWx1ZXMgaW4gdGhlIG1hcHBpbmcgd2lsbCBiZSBzZXQgb25cbiAgICAgKiBgdGhpcy5wcm9wc2AgaWYgdGhhdCBwcm9wIGlzIG5vdCBzcGVjaWZpZWQgKGkuZS4gdXNpbmcgYW4gYGluYCBjaGVjaykuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJlZm9yZSBgZ2V0SW5pdGlhbFN0YXRlYCBhbmQgdGhlcmVmb3JlIGNhbm5vdCByZWx5XG4gICAgICogb24gYHRoaXMuc3RhdGVgIG9yIHVzZSBgdGhpcy5zZXRTdGF0ZWAuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgZ2V0RGVmYXVsdFByb3BzOiAnREVGSU5FX01BTllfTUVSR0VEJyxcblxuICAgIC8qKlxuICAgICAqIEludm9rZWQgb25jZSBiZWZvcmUgdGhlIGNvbXBvbmVudCBpcyBtb3VudGVkLiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgdXNlZFxuICAgICAqIGFzIHRoZSBpbml0aWFsIHZhbHVlIG9mIGB0aGlzLnN0YXRlYC5cbiAgICAgKlxuICAgICAqICAgZ2V0SW5pdGlhbFN0YXRlOiBmdW5jdGlvbigpIHtcbiAgICAgKiAgICAgcmV0dXJuIHtcbiAgICAgKiAgICAgICBpc09uOiBmYWxzZSxcbiAgICAgKiAgICAgICBmb29CYXo6IG5ldyBCYXpGb28oKVxuICAgICAqICAgICB9XG4gICAgICogICB9XG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgZ2V0SW5pdGlhbFN0YXRlOiAnREVGSU5FX01BTllfTUVSR0VEJyxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge29iamVjdH1cbiAgICAgKiBAb3B0aW9uYWxcbiAgICAgKi9cbiAgICBnZXRDaGlsZENvbnRleHQ6ICdERUZJTkVfTUFOWV9NRVJHRUQnLFxuXG4gICAgLyoqXG4gICAgICogVXNlcyBwcm9wcyBmcm9tIGB0aGlzLnByb3BzYCBhbmQgc3RhdGUgZnJvbSBgdGhpcy5zdGF0ZWAgdG8gcmVuZGVyIHRoZVxuICAgICAqIHN0cnVjdHVyZSBvZiB0aGUgY29tcG9uZW50LlxuICAgICAqXG4gICAgICogTm8gZ3VhcmFudGVlcyBhcmUgbWFkZSBhYm91dCB3aGVuIG9yIGhvdyBvZnRlbiB0aGlzIG1ldGhvZCBpcyBpbnZva2VkLCBzb1xuICAgICAqIGl0IG11c3Qgbm90IGhhdmUgc2lkZSBlZmZlY3RzLlxuICAgICAqXG4gICAgICogICByZW5kZXI6IGZ1bmN0aW9uKCkge1xuICAgICAqICAgICB2YXIgbmFtZSA9IHRoaXMucHJvcHMubmFtZTtcbiAgICAgKiAgICAgcmV0dXJuIDxkaXY+SGVsbG8sIHtuYW1lfSE8L2Rpdj47XG4gICAgICogICB9XG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtSZWFjdENvbXBvbmVudH1cbiAgICAgKiBAcmVxdWlyZWRcbiAgICAgKi9cbiAgICByZW5kZXI6ICdERUZJTkVfT05DRScsXG5cbiAgICAvLyA9PT09IERlbGVnYXRlIG1ldGhvZHMgPT09PVxuXG4gICAgLyoqXG4gICAgICogSW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgaW5pdGlhbGx5IGNyZWF0ZWQgYW5kIGFib3V0IHRvIGJlIG1vdW50ZWQuXG4gICAgICogVGhpcyBtYXkgaGF2ZSBzaWRlIGVmZmVjdHMsIGJ1dCBhbnkgZXh0ZXJuYWwgc3Vic2NyaXB0aW9ucyBvciBkYXRhIGNyZWF0ZWRcbiAgICAgKiBieSB0aGlzIG1ldGhvZCBtdXN0IGJlIGNsZWFuZWQgdXAgaW4gYGNvbXBvbmVudFdpbGxVbm1vdW50YC5cbiAgICAgKlxuICAgICAqIEBvcHRpb25hbFxuICAgICAqL1xuICAgIGNvbXBvbmVudFdpbGxNb3VudDogJ0RFRklORV9NQU5ZJyxcblxuICAgIC8qKlxuICAgICAqIEludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50IGhhcyBiZWVuIG1vdW50ZWQgYW5kIGhhcyBhIERPTSByZXByZXNlbnRhdGlvbi5cbiAgICAgKiBIb3dldmVyLCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgRE9NIG5vZGUgaXMgaW4gdGhlIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogVXNlIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gb3BlcmF0ZSBvbiB0aGUgRE9NIHdoZW4gdGhlIGNvbXBvbmVudCBoYXNcbiAgICAgKiBiZWVuIG1vdW50ZWQgKGluaXRpYWxpemVkIGFuZCByZW5kZXJlZCkgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtET01FbGVtZW50fSByb290Tm9kZSBET00gZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIGNvbXBvbmVudC5cbiAgICAgKiBAb3B0aW9uYWxcbiAgICAgKi9cbiAgICBjb21wb25lbnREaWRNb3VudDogJ0RFRklORV9NQU5ZJyxcblxuICAgIC8qKlxuICAgICAqIEludm9rZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgcmVjZWl2ZXMgbmV3IHByb3BzLlxuICAgICAqXG4gICAgICogVXNlIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcmVhY3QgdG8gYSBwcm9wIHRyYW5zaXRpb24gYnkgdXBkYXRpbmcgdGhlXG4gICAgICogc3RhdGUgdXNpbmcgYHRoaXMuc2V0U3RhdGVgLiBDdXJyZW50IHByb3BzIGFyZSBhY2Nlc3NlZCB2aWEgYHRoaXMucHJvcHNgLlxuICAgICAqXG4gICAgICogICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzOiBmdW5jdGlvbihuZXh0UHJvcHMsIG5leHRDb250ZXh0KSB7XG4gICAgICogICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAqICAgICAgIGxpa2VzSW5jcmVhc2luZzogbmV4dFByb3BzLmxpa2VDb3VudCA+IHRoaXMucHJvcHMubGlrZUNvdW50XG4gICAgICogICAgIH0pO1xuICAgICAqICAgfVxuICAgICAqXG4gICAgICogTk9URTogVGhlcmUgaXMgbm8gZXF1aXZhbGVudCBgY29tcG9uZW50V2lsbFJlY2VpdmVTdGF0ZWAuIEFuIGluY29taW5nIHByb3BcbiAgICAgKiB0cmFuc2l0aW9uIG1heSBjYXVzZSBhIHN0YXRlIGNoYW5nZSwgYnV0IHRoZSBvcHBvc2l0ZSBpcyBub3QgdHJ1ZS4gSWYgeW91XG4gICAgICogbmVlZCBpdCwgeW91IGFyZSBwcm9iYWJseSBsb29raW5nIGZvciBgY29tcG9uZW50V2lsbFVwZGF0ZWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gbmV4dFByb3BzXG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wczogJ0RFRklORV9NQU5ZJyxcblxuICAgIC8qKlxuICAgICAqIEludm9rZWQgd2hpbGUgZGVjaWRpbmcgaWYgdGhlIGNvbXBvbmVudCBzaG91bGQgYmUgdXBkYXRlZCBhcyBhIHJlc3VsdCBvZlxuICAgICAqIHJlY2VpdmluZyBuZXcgcHJvcHMsIHN0YXRlIGFuZC9vciBjb250ZXh0LlxuICAgICAqXG4gICAgICogVXNlIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gYHJldHVybiBmYWxzZWAgd2hlbiB5b3UncmUgY2VydGFpbiB0aGF0IHRoZVxuICAgICAqIHRyYW5zaXRpb24gdG8gdGhlIG5ldyBwcm9wcy9zdGF0ZS9jb250ZXh0IHdpbGwgbm90IHJlcXVpcmUgYSBjb21wb25lbnRcbiAgICAgKiB1cGRhdGUuXG4gICAgICpcbiAgICAgKiAgIHNob3VsZENvbXBvbmVudFVwZGF0ZTogZnVuY3Rpb24obmV4dFByb3BzLCBuZXh0U3RhdGUsIG5leHRDb250ZXh0KSB7XG4gICAgICogICAgIHJldHVybiAhZXF1YWwobmV4dFByb3BzLCB0aGlzLnByb3BzKSB8fFxuICAgICAqICAgICAgICFlcXVhbChuZXh0U3RhdGUsIHRoaXMuc3RhdGUpIHx8XG4gICAgICogICAgICAgIWVxdWFsKG5leHRDb250ZXh0LCB0aGlzLmNvbnRleHQpO1xuICAgICAqICAgfVxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG5leHRQcm9wc1xuICAgICAqIEBwYXJhbSB7P29iamVjdH0gbmV4dFN0YXRlXG4gICAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXh0Q29udGV4dFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGNvbXBvbmVudCBzaG91bGQgdXBkYXRlLlxuICAgICAqIEBvcHRpb25hbFxuICAgICAqL1xuICAgIHNob3VsZENvbXBvbmVudFVwZGF0ZTogJ0RFRklORV9PTkNFJyxcblxuICAgIC8qKlxuICAgICAqIEludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIGFib3V0IHRvIHVwZGF0ZSBkdWUgdG8gYSB0cmFuc2l0aW9uIGZyb21cbiAgICAgKiBgdGhpcy5wcm9wc2AsIGB0aGlzLnN0YXRlYCBhbmQgYHRoaXMuY29udGV4dGAgdG8gYG5leHRQcm9wc2AsIGBuZXh0U3RhdGVgXG4gICAgICogYW5kIGBuZXh0Q29udGV4dGAuXG4gICAgICpcbiAgICAgKiBVc2UgdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byBwZXJmb3JtIHByZXBhcmF0aW9uIGJlZm9yZSBhbiB1cGRhdGUgb2NjdXJzLlxuICAgICAqXG4gICAgICogTk9URTogWW91ICoqY2Fubm90KiogdXNlIGB0aGlzLnNldFN0YXRlKClgIGluIHRoaXMgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG5leHRQcm9wc1xuICAgICAqIEBwYXJhbSB7P29iamVjdH0gbmV4dFN0YXRlXG4gICAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXh0Q29udGV4dFxuICAgICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICAgKiBAb3B0aW9uYWxcbiAgICAgKi9cbiAgICBjb21wb25lbnRXaWxsVXBkYXRlOiAnREVGSU5FX01BTlknLFxuXG4gICAgLyoqXG4gICAgICogSW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQncyBET00gcmVwcmVzZW50YXRpb24gaGFzIGJlZW4gdXBkYXRlZC5cbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRvIG9wZXJhdGUgb24gdGhlIERPTSB3aGVuIHRoZSBjb21wb25lbnQgaGFzXG4gICAgICogYmVlbiB1cGRhdGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IHByZXZQcm9wc1xuICAgICAqIEBwYXJhbSB7P29iamVjdH0gcHJldlN0YXRlXG4gICAgICogQHBhcmFtIHs/b2JqZWN0fSBwcmV2Q29udGV4dFxuICAgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gcm9vdE5vZGUgRE9NIGVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBjb21wb25lbnQuXG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgY29tcG9uZW50RGlkVXBkYXRlOiAnREVGSU5FX01BTlknLFxuXG4gICAgLyoqXG4gICAgICogSW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgYWJvdXQgdG8gYmUgcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQgYW5kIGhhdmVcbiAgICAgKiBpdHMgRE9NIHJlcHJlc2VudGF0aW9uIGRlc3Ryb3llZC5cbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRvIGRlYWxsb2NhdGUgYW55IGV4dGVybmFsIHJlc291cmNlcy5cbiAgICAgKlxuICAgICAqIE5PVEU6IFRoZXJlIGlzIG5vIGBjb21wb25lbnREaWRVbm1vdW50YCBzaW5jZSB5b3VyIGNvbXBvbmVudCB3aWxsIGhhdmUgYmVlblxuICAgICAqIGRlc3Ryb3llZCBieSB0aGF0IHBvaW50LlxuICAgICAqXG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQ6ICdERUZJTkVfTUFOWScsXG5cbiAgICAvKipcbiAgICAgKiBSZXBsYWNlbWVudCBmb3IgKGRlcHJlY2F0ZWQpIGBjb21wb25lbnRXaWxsTW91bnRgLlxuICAgICAqXG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudDogJ0RFRklORV9NQU5ZJyxcblxuICAgIC8qKlxuICAgICAqIFJlcGxhY2VtZW50IGZvciAoZGVwcmVjYXRlZCkgYGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNgLlxuICAgICAqXG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM6ICdERUZJTkVfTUFOWScsXG5cbiAgICAvKipcbiAgICAgKiBSZXBsYWNlbWVudCBmb3IgKGRlcHJlY2F0ZWQpIGBjb21wb25lbnRXaWxsVXBkYXRlYC5cbiAgICAgKlxuICAgICAqIEBvcHRpb25hbFxuICAgICAqL1xuICAgIFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlOiAnREVGSU5FX01BTlknLFxuXG4gICAgLy8gPT09PSBBZHZhbmNlZCBtZXRob2RzID09PT1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGNvbXBvbmVudCdzIGN1cnJlbnRseSBtb3VudGVkIERPTSByZXByZXNlbnRhdGlvbi5cbiAgICAgKlxuICAgICAqIEJ5IGRlZmF1bHQsIHRoaXMgaW1wbGVtZW50cyBSZWFjdCdzIHJlbmRlcmluZyBhbmQgcmVjb25jaWxpYXRpb24gYWxnb3JpdGhtLlxuICAgICAqIFNvcGhpc3RpY2F0ZWQgY2xpZW50cyBtYXkgd2lzaCB0byBvdmVycmlkZSB0aGlzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqIEBvdmVycmlkYWJsZVxuICAgICAqL1xuICAgIHVwZGF0ZUNvbXBvbmVudDogJ09WRVJSSURFX0JBU0UnXG4gIH07XG5cbiAgLyoqXG4gICAqIFNpbWlsYXIgdG8gUmVhY3RDbGFzc0ludGVyZmFjZSBidXQgZm9yIHN0YXRpYyBtZXRob2RzLlxuICAgKi9cbiAgdmFyIFJlYWN0Q2xhc3NTdGF0aWNJbnRlcmZhY2UgPSB7XG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBhZnRlciBhIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQgYW5kIHdoZW4gaXRcbiAgICAgKiByZWNlaXZlcyBuZXcgcHJvcHMuIFJldHVybiBhbiBvYmplY3QgdG8gdXBkYXRlIHN0YXRlIGluIHJlc3BvbnNlIHRvXG4gICAgICogcHJvcCBjaGFuZ2VzLiBSZXR1cm4gbnVsbCB0byBpbmRpY2F0ZSBubyBjaGFuZ2UgdG8gc3RhdGUuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcmV0dXJuZWQsIGl0cyBrZXlzIHdpbGwgYmUgbWVyZ2VkIGludG8gdGhlIGV4aXN0aW5nIHN0YXRlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7b2JqZWN0IHx8IG51bGx9XG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOiAnREVGSU5FX01BTllfTUVSR0VEJ1xuICB9O1xuXG4gIC8qKlxuICAgKiBNYXBwaW5nIGZyb20gY2xhc3Mgc3BlY2lmaWNhdGlvbiBrZXlzIHRvIHNwZWNpYWwgcHJvY2Vzc2luZyBmdW5jdGlvbnMuXG4gICAqXG4gICAqIEFsdGhvdWdoIHRoZXNlIGFyZSBkZWNsYXJlZCBsaWtlIGluc3RhbmNlIHByb3BlcnRpZXMgaW4gdGhlIHNwZWNpZmljYXRpb25cbiAgICogd2hlbiBkZWZpbmluZyBjbGFzc2VzIHVzaW5nIGBSZWFjdC5jcmVhdGVDbGFzc2AsIHRoZXkgYXJlIGFjdHVhbGx5IHN0YXRpY1xuICAgKiBhbmQgYXJlIGFjY2Vzc2libGUgb24gdGhlIGNvbnN0cnVjdG9yIGluc3RlYWQgb2YgdGhlIHByb3RvdHlwZS4gRGVzcGl0ZVxuICAgKiBiZWluZyBzdGF0aWMsIHRoZXkgbXVzdCBiZSBkZWZpbmVkIG91dHNpZGUgb2YgdGhlIFwic3RhdGljc1wiIGtleSB1bmRlclxuICAgKiB3aGljaCBhbGwgb3RoZXIgc3RhdGljIG1ldGhvZHMgYXJlIGRlZmluZWQuXG4gICAqL1xuICB2YXIgUkVTRVJWRURfU1BFQ19LRVlTID0ge1xuICAgIGRpc3BsYXlOYW1lOiBmdW5jdGlvbihDb25zdHJ1Y3RvciwgZGlzcGxheU5hbWUpIHtcbiAgICAgIENvbnN0cnVjdG9yLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7XG4gICAgfSxcbiAgICBtaXhpbnM6IGZ1bmN0aW9uKENvbnN0cnVjdG9yLCBtaXhpbnMpIHtcbiAgICAgIGlmIChtaXhpbnMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtaXhpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBtaXhTcGVjSW50b0NvbXBvbmVudChDb25zdHJ1Y3RvciwgbWl4aW5zW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgY2hpbGRDb250ZXh0VHlwZXM6IGZ1bmN0aW9uKENvbnN0cnVjdG9yLCBjaGlsZENvbnRleHRUeXBlcykge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgdmFsaWRhdGVUeXBlRGVmKENvbnN0cnVjdG9yLCBjaGlsZENvbnRleHRUeXBlcywgJ2NoaWxkQ29udGV4dCcpO1xuICAgICAgfVxuICAgICAgQ29uc3RydWN0b3IuY2hpbGRDb250ZXh0VHlwZXMgPSBfYXNzaWduKFxuICAgICAgICB7fSxcbiAgICAgICAgQ29uc3RydWN0b3IuY2hpbGRDb250ZXh0VHlwZXMsXG4gICAgICAgIGNoaWxkQ29udGV4dFR5cGVzXG4gICAgICApO1xuICAgIH0sXG4gICAgY29udGV4dFR5cGVzOiBmdW5jdGlvbihDb25zdHJ1Y3RvciwgY29udGV4dFR5cGVzKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB2YWxpZGF0ZVR5cGVEZWYoQ29uc3RydWN0b3IsIGNvbnRleHRUeXBlcywgJ2NvbnRleHQnKTtcbiAgICAgIH1cbiAgICAgIENvbnN0cnVjdG9yLmNvbnRleHRUeXBlcyA9IF9hc3NpZ24oXG4gICAgICAgIHt9LFxuICAgICAgICBDb25zdHJ1Y3Rvci5jb250ZXh0VHlwZXMsXG4gICAgICAgIGNvbnRleHRUeXBlc1xuICAgICAgKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFNwZWNpYWwgY2FzZSBnZXREZWZhdWx0UHJvcHMgd2hpY2ggc2hvdWxkIG1vdmUgaW50byBzdGF0aWNzIGJ1dCByZXF1aXJlc1xuICAgICAqIGF1dG9tYXRpYyBtZXJnaW5nLlxuICAgICAqL1xuICAgIGdldERlZmF1bHRQcm9wczogZnVuY3Rpb24oQ29uc3RydWN0b3IsIGdldERlZmF1bHRQcm9wcykge1xuICAgICAgaWYgKENvbnN0cnVjdG9yLmdldERlZmF1bHRQcm9wcykge1xuICAgICAgICBDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMgPSBjcmVhdGVNZXJnZWRSZXN1bHRGdW5jdGlvbihcbiAgICAgICAgICBDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMsXG4gICAgICAgICAgZ2V0RGVmYXVsdFByb3BzXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMgPSBnZXREZWZhdWx0UHJvcHM7XG4gICAgICB9XG4gICAgfSxcbiAgICBwcm9wVHlwZXM6IGZ1bmN0aW9uKENvbnN0cnVjdG9yLCBwcm9wVHlwZXMpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHZhbGlkYXRlVHlwZURlZihDb25zdHJ1Y3RvciwgcHJvcFR5cGVzLCAncHJvcCcpO1xuICAgICAgfVxuICAgICAgQ29uc3RydWN0b3IucHJvcFR5cGVzID0gX2Fzc2lnbih7fSwgQ29uc3RydWN0b3IucHJvcFR5cGVzLCBwcm9wVHlwZXMpO1xuICAgIH0sXG4gICAgc3RhdGljczogZnVuY3Rpb24oQ29uc3RydWN0b3IsIHN0YXRpY3MpIHtcbiAgICAgIG1peFN0YXRpY1NwZWNJbnRvQ29tcG9uZW50KENvbnN0cnVjdG9yLCBzdGF0aWNzKTtcbiAgICB9LFxuICAgIGF1dG9iaW5kOiBmdW5jdGlvbigpIHt9XG4gIH07XG5cbiAgZnVuY3Rpb24gdmFsaWRhdGVUeXBlRGVmKENvbnN0cnVjdG9yLCB0eXBlRGVmLCBsb2NhdGlvbikge1xuICAgIGZvciAodmFyIHByb3BOYW1lIGluIHR5cGVEZWYpIHtcbiAgICAgIGlmICh0eXBlRGVmLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICAvLyB1c2UgYSB3YXJuaW5nIGluc3RlYWQgb2YgYW4gX2ludmFyaWFudCBzbyBjb21wb25lbnRzXG4gICAgICAgIC8vIGRvbid0IHNob3cgdXAgaW4gcHJvZCBidXQgb25seSBpbiBfX0RFVl9fXG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgd2FybmluZyhcbiAgICAgICAgICAgIHR5cGVvZiB0eXBlRGVmW3Byb3BOYW1lXSA9PT0gJ2Z1bmN0aW9uJyxcbiAgICAgICAgICAgICclczogJXMgdHlwZSBgJXNgIGlzIGludmFsaWQ7IGl0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tICcgK1xuICAgICAgICAgICAgICAnUmVhY3QuUHJvcFR5cGVzLicsXG4gICAgICAgICAgICBDb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCAnUmVhY3RDbGFzcycsXG4gICAgICAgICAgICBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl0sXG4gICAgICAgICAgICBwcm9wTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB2YWxpZGF0ZU1ldGhvZE92ZXJyaWRlKGlzQWxyZWFkeURlZmluZWQsIG5hbWUpIHtcbiAgICB2YXIgc3BlY1BvbGljeSA9IFJlYWN0Q2xhc3NJbnRlcmZhY2UuaGFzT3duUHJvcGVydHkobmFtZSlcbiAgICAgID8gUmVhY3RDbGFzc0ludGVyZmFjZVtuYW1lXVxuICAgICAgOiBudWxsO1xuXG4gICAgLy8gRGlzYWxsb3cgb3ZlcnJpZGluZyBvZiBiYXNlIGNsYXNzIG1ldGhvZHMgdW5sZXNzIGV4cGxpY2l0bHkgYWxsb3dlZC5cbiAgICBpZiAoUmVhY3RDbGFzc01peGluLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICBfaW52YXJpYW50KFxuICAgICAgICBzcGVjUG9saWN5ID09PSAnT1ZFUlJJREVfQkFTRScsXG4gICAgICAgICdSZWFjdENsYXNzSW50ZXJmYWNlOiBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gb3ZlcnJpZGUgJyArXG4gICAgICAgICAgJ2Alc2AgZnJvbSB5b3VyIGNsYXNzIHNwZWNpZmljYXRpb24uIEVuc3VyZSB0aGF0IHlvdXIgbWV0aG9kIG5hbWVzICcgK1xuICAgICAgICAgICdkbyBub3Qgb3ZlcmxhcCB3aXRoIFJlYWN0IG1ldGhvZHMuJyxcbiAgICAgICAgbmFtZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBEaXNhbGxvdyBkZWZpbmluZyBtZXRob2RzIG1vcmUgdGhhbiBvbmNlIHVubGVzcyBleHBsaWNpdGx5IGFsbG93ZWQuXG4gICAgaWYgKGlzQWxyZWFkeURlZmluZWQpIHtcbiAgICAgIF9pbnZhcmlhbnQoXG4gICAgICAgIHNwZWNQb2xpY3kgPT09ICdERUZJTkVfTUFOWScgfHwgc3BlY1BvbGljeSA9PT0gJ0RFRklORV9NQU5ZX01FUkdFRCcsXG4gICAgICAgICdSZWFjdENsYXNzSW50ZXJmYWNlOiBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gZGVmaW5lICcgK1xuICAgICAgICAgICdgJXNgIG9uIHlvdXIgY29tcG9uZW50IG1vcmUgdGhhbiBvbmNlLiBUaGlzIGNvbmZsaWN0IG1heSBiZSBkdWUgJyArXG4gICAgICAgICAgJ3RvIGEgbWl4aW4uJyxcbiAgICAgICAgbmFtZVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWl4aW4gaGVscGVyIHdoaWNoIGhhbmRsZXMgcG9saWN5IHZhbGlkYXRpb24gYW5kIHJlc2VydmVkXG4gICAqIHNwZWNpZmljYXRpb24ga2V5cyB3aGVuIGJ1aWxkaW5nIFJlYWN0IGNsYXNzZXMuXG4gICAqL1xuICBmdW5jdGlvbiBtaXhTcGVjSW50b0NvbXBvbmVudChDb25zdHJ1Y3Rvciwgc3BlYykge1xuICAgIGlmICghc3BlYykge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgdmFyIHR5cGVvZlNwZWMgPSB0eXBlb2Ygc3BlYztcbiAgICAgICAgdmFyIGlzTWl4aW5WYWxpZCA9IHR5cGVvZlNwZWMgPT09ICdvYmplY3QnICYmIHNwZWMgIT09IG51bGw7XG5cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICB3YXJuaW5nKFxuICAgICAgICAgICAgaXNNaXhpblZhbGlkLFxuICAgICAgICAgICAgXCIlczogWW91J3JlIGF0dGVtcHRpbmcgdG8gaW5jbHVkZSBhIG1peGluIHRoYXQgaXMgZWl0aGVyIG51bGwgXCIgK1xuICAgICAgICAgICAgICAnb3Igbm90IGFuIG9iamVjdC4gQ2hlY2sgdGhlIG1peGlucyBpbmNsdWRlZCBieSB0aGUgY29tcG9uZW50LCAnICtcbiAgICAgICAgICAgICAgJ2FzIHdlbGwgYXMgYW55IG1peGlucyB0aGV5IGluY2x1ZGUgdGhlbXNlbHZlcy4gJyArXG4gICAgICAgICAgICAgICdFeHBlY3RlZCBvYmplY3QgYnV0IGdvdCAlcy4nLFxuICAgICAgICAgICAgQ29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgJ1JlYWN0Q2xhc3MnLFxuICAgICAgICAgICAgc3BlYyA9PT0gbnVsbCA/IG51bGwgOiB0eXBlb2ZTcGVjXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX2ludmFyaWFudChcbiAgICAgIHR5cGVvZiBzcGVjICE9PSAnZnVuY3Rpb24nLFxuICAgICAgXCJSZWFjdENsYXNzOiBZb3UncmUgYXR0ZW1wdGluZyB0byBcIiArXG4gICAgICAgICd1c2UgYSBjb21wb25lbnQgY2xhc3Mgb3IgZnVuY3Rpb24gYXMgYSBtaXhpbi4gSW5zdGVhZCwganVzdCB1c2UgYSAnICtcbiAgICAgICAgJ3JlZ3VsYXIgb2JqZWN0LidcbiAgICApO1xuICAgIF9pbnZhcmlhbnQoXG4gICAgICAhaXNWYWxpZEVsZW1lbnQoc3BlYyksXG4gICAgICBcIlJlYWN0Q2xhc3M6IFlvdSdyZSBhdHRlbXB0aW5nIHRvIFwiICtcbiAgICAgICAgJ3VzZSBhIGNvbXBvbmVudCBhcyBhIG1peGluLiBJbnN0ZWFkLCBqdXN0IHVzZSBhIHJlZ3VsYXIgb2JqZWN0LidcbiAgICApO1xuXG4gICAgdmFyIHByb3RvID0gQ29uc3RydWN0b3IucHJvdG90eXBlO1xuICAgIHZhciBhdXRvQmluZFBhaXJzID0gcHJvdG8uX19yZWFjdEF1dG9CaW5kUGFpcnM7XG5cbiAgICAvLyBCeSBoYW5kbGluZyBtaXhpbnMgYmVmb3JlIGFueSBvdGhlciBwcm9wZXJ0aWVzLCB3ZSBlbnN1cmUgdGhlIHNhbWVcbiAgICAvLyBjaGFpbmluZyBvcmRlciBpcyBhcHBsaWVkIHRvIG1ldGhvZHMgd2l0aCBERUZJTkVfTUFOWSBwb2xpY3ksIHdoZXRoZXJcbiAgICAvLyBtaXhpbnMgYXJlIGxpc3RlZCBiZWZvcmUgb3IgYWZ0ZXIgdGhlc2UgbWV0aG9kcyBpbiB0aGUgc3BlYy5cbiAgICBpZiAoc3BlYy5oYXNPd25Qcm9wZXJ0eShNSVhJTlNfS0VZKSkge1xuICAgICAgUkVTRVJWRURfU1BFQ19LRVlTLm1peGlucyhDb25zdHJ1Y3Rvciwgc3BlYy5taXhpbnMpO1xuICAgIH1cblxuICAgIGZvciAodmFyIG5hbWUgaW4gc3BlYykge1xuICAgICAgaWYgKCFzcGVjLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobmFtZSA9PT0gTUlYSU5TX0tFWSkge1xuICAgICAgICAvLyBXZSBoYXZlIGFscmVhZHkgaGFuZGxlZCBtaXhpbnMgaW4gYSBzcGVjaWFsIGNhc2UgYWJvdmUuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgcHJvcGVydHkgPSBzcGVjW25hbWVdO1xuICAgICAgdmFyIGlzQWxyZWFkeURlZmluZWQgPSBwcm90by5oYXNPd25Qcm9wZXJ0eShuYW1lKTtcbiAgICAgIHZhbGlkYXRlTWV0aG9kT3ZlcnJpZGUoaXNBbHJlYWR5RGVmaW5lZCwgbmFtZSk7XG5cbiAgICAgIGlmIChSRVNFUlZFRF9TUEVDX0tFWVMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgUkVTRVJWRURfU1BFQ19LRVlTW25hbWVdKENvbnN0cnVjdG9yLCBwcm9wZXJ0eSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTZXR1cCBtZXRob2RzIG9uIHByb3RvdHlwZTpcbiAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBtZW1iZXIgbWV0aG9kcyBzaG91bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgYm91bmQ6XG4gICAgICAgIC8vIDEuIEV4cGVjdGVkIFJlYWN0Q2xhc3MgbWV0aG9kcyAoaW4gdGhlIFwiaW50ZXJmYWNlXCIpLlxuICAgICAgICAvLyAyLiBPdmVycmlkZGVuIG1ldGhvZHMgKHRoYXQgd2VyZSBtaXhlZCBpbikuXG4gICAgICAgIHZhciBpc1JlYWN0Q2xhc3NNZXRob2QgPSBSZWFjdENsYXNzSW50ZXJmYWNlLmhhc093blByb3BlcnR5KG5hbWUpO1xuICAgICAgICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiBwcm9wZXJ0eSA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgICAgdmFyIHNob3VsZEF1dG9CaW5kID1cbiAgICAgICAgICBpc0Z1bmN0aW9uICYmXG4gICAgICAgICAgIWlzUmVhY3RDbGFzc01ldGhvZCAmJlxuICAgICAgICAgICFpc0FscmVhZHlEZWZpbmVkICYmXG4gICAgICAgICAgc3BlYy5hdXRvYmluZCAhPT0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHNob3VsZEF1dG9CaW5kKSB7XG4gICAgICAgICAgYXV0b0JpbmRQYWlycy5wdXNoKG5hbWUsIHByb3BlcnR5KTtcbiAgICAgICAgICBwcm90b1tuYW1lXSA9IHByb3BlcnR5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChpc0FscmVhZHlEZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgc3BlY1BvbGljeSA9IFJlYWN0Q2xhc3NJbnRlcmZhY2VbbmFtZV07XG5cbiAgICAgICAgICAgIC8vIFRoZXNlIGNhc2VzIHNob3VsZCBhbHJlYWR5IGJlIGNhdWdodCBieSB2YWxpZGF0ZU1ldGhvZE92ZXJyaWRlLlxuICAgICAgICAgICAgX2ludmFyaWFudChcbiAgICAgICAgICAgICAgaXNSZWFjdENsYXNzTWV0aG9kICYmXG4gICAgICAgICAgICAgICAgKHNwZWNQb2xpY3kgPT09ICdERUZJTkVfTUFOWV9NRVJHRUQnIHx8XG4gICAgICAgICAgICAgICAgICBzcGVjUG9saWN5ID09PSAnREVGSU5FX01BTlknKSxcbiAgICAgICAgICAgICAgJ1JlYWN0Q2xhc3M6IFVuZXhwZWN0ZWQgc3BlYyBwb2xpY3kgJXMgZm9yIGtleSAlcyAnICtcbiAgICAgICAgICAgICAgICAnd2hlbiBtaXhpbmcgaW4gY29tcG9uZW50IHNwZWNzLicsXG4gICAgICAgICAgICAgIHNwZWNQb2xpY3ksXG4gICAgICAgICAgICAgIG5hbWVcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIEZvciBtZXRob2RzIHdoaWNoIGFyZSBkZWZpbmVkIG1vcmUgdGhhbiBvbmNlLCBjYWxsIHRoZSBleGlzdGluZ1xuICAgICAgICAgICAgLy8gbWV0aG9kcyBiZWZvcmUgY2FsbGluZyB0aGUgbmV3IHByb3BlcnR5LCBtZXJnaW5nIGlmIGFwcHJvcHJpYXRlLlxuICAgICAgICAgICAgaWYgKHNwZWNQb2xpY3kgPT09ICdERUZJTkVfTUFOWV9NRVJHRUQnKSB7XG4gICAgICAgICAgICAgIHByb3RvW25hbWVdID0gY3JlYXRlTWVyZ2VkUmVzdWx0RnVuY3Rpb24ocHJvdG9bbmFtZV0sIHByb3BlcnR5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3BlY1BvbGljeSA9PT0gJ0RFRklORV9NQU5ZJykge1xuICAgICAgICAgICAgICBwcm90b1tuYW1lXSA9IGNyZWF0ZUNoYWluZWRGdW5jdGlvbihwcm90b1tuYW1lXSwgcHJvcGVydHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcm90b1tuYW1lXSA9IHByb3BlcnR5O1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgLy8gQWRkIHZlcmJvc2UgZGlzcGxheU5hbWUgdG8gdGhlIGZ1bmN0aW9uLCB3aGljaCBoZWxwcyB3aGVuIGxvb2tpbmdcbiAgICAgICAgICAgICAgLy8gYXQgcHJvZmlsaW5nIHRvb2xzLlxuICAgICAgICAgICAgICBpZiAodHlwZW9mIHByb3BlcnR5ID09PSAnZnVuY3Rpb24nICYmIHNwZWMuZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICAgICAgICBwcm90b1tuYW1lXS5kaXNwbGF5TmFtZSA9IHNwZWMuZGlzcGxheU5hbWUgKyAnXycgKyBuYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbWl4U3RhdGljU3BlY0ludG9Db21wb25lbnQoQ29uc3RydWN0b3IsIHN0YXRpY3MpIHtcbiAgICBpZiAoIXN0YXRpY3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBuYW1lIGluIHN0YXRpY3MpIHtcbiAgICAgIHZhciBwcm9wZXJ0eSA9IHN0YXRpY3NbbmFtZV07XG4gICAgICBpZiAoIXN0YXRpY3MuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBpc1Jlc2VydmVkID0gbmFtZSBpbiBSRVNFUlZFRF9TUEVDX0tFWVM7XG4gICAgICBfaW52YXJpYW50KFxuICAgICAgICAhaXNSZXNlcnZlZCxcbiAgICAgICAgJ1JlYWN0Q2xhc3M6IFlvdSBhcmUgYXR0ZW1wdGluZyB0byBkZWZpbmUgYSByZXNlcnZlZCAnICtcbiAgICAgICAgICAncHJvcGVydHksIGAlc2AsIHRoYXQgc2hvdWxkblxcJ3QgYmUgb24gdGhlIFwic3RhdGljc1wiIGtleS4gRGVmaW5lIGl0ICcgK1xuICAgICAgICAgICdhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBpbnN0ZWFkOyBpdCB3aWxsIHN0aWxsIGJlIGFjY2Vzc2libGUgb24gdGhlICcgK1xuICAgICAgICAgICdjb25zdHJ1Y3Rvci4nLFxuICAgICAgICBuYW1lXG4gICAgICApO1xuXG4gICAgICB2YXIgaXNBbHJlYWR5RGVmaW5lZCA9IG5hbWUgaW4gQ29uc3RydWN0b3I7XG4gICAgICBpZiAoaXNBbHJlYWR5RGVmaW5lZCkge1xuICAgICAgICB2YXIgc3BlY1BvbGljeSA9IFJlYWN0Q2xhc3NTdGF0aWNJbnRlcmZhY2UuaGFzT3duUHJvcGVydHkobmFtZSlcbiAgICAgICAgICA/IFJlYWN0Q2xhc3NTdGF0aWNJbnRlcmZhY2VbbmFtZV1cbiAgICAgICAgICA6IG51bGw7XG5cbiAgICAgICAgX2ludmFyaWFudChcbiAgICAgICAgICBzcGVjUG9saWN5ID09PSAnREVGSU5FX01BTllfTUVSR0VEJyxcbiAgICAgICAgICAnUmVhY3RDbGFzczogWW91IGFyZSBhdHRlbXB0aW5nIHRvIGRlZmluZSAnICtcbiAgICAgICAgICAgICdgJXNgIG9uIHlvdXIgY29tcG9uZW50IG1vcmUgdGhhbiBvbmNlLiBUaGlzIGNvbmZsaWN0IG1heSBiZSAnICtcbiAgICAgICAgICAgICdkdWUgdG8gYSBtaXhpbi4nLFxuICAgICAgICAgIG5hbWVcbiAgICAgICAgKTtcblxuICAgICAgICBDb25zdHJ1Y3RvcltuYW1lXSA9IGNyZWF0ZU1lcmdlZFJlc3VsdEZ1bmN0aW9uKENvbnN0cnVjdG9yW25hbWVdLCBwcm9wZXJ0eSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBDb25zdHJ1Y3RvcltuYW1lXSA9IHByb3BlcnR5O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNZXJnZSB0d28gb2JqZWN0cywgYnV0IHRocm93IGlmIGJvdGggY29udGFpbiB0aGUgc2FtZSBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvbmUgVGhlIGZpcnN0IG9iamVjdCwgd2hpY2ggaXMgbXV0YXRlZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IHR3byBUaGUgc2Vjb25kIG9iamVjdFxuICAgKiBAcmV0dXJuIHtvYmplY3R9IG9uZSBhZnRlciBpdCBoYXMgYmVlbiBtdXRhdGVkIHRvIGNvbnRhaW4gZXZlcnl0aGluZyBpbiB0d28uXG4gICAqL1xuICBmdW5jdGlvbiBtZXJnZUludG9XaXRoTm9EdXBsaWNhdGVLZXlzKG9uZSwgdHdvKSB7XG4gICAgX2ludmFyaWFudChcbiAgICAgIG9uZSAmJiB0d28gJiYgdHlwZW9mIG9uZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHR3byA9PT0gJ29iamVjdCcsXG4gICAgICAnbWVyZ2VJbnRvV2l0aE5vRHVwbGljYXRlS2V5cygpOiBDYW5ub3QgbWVyZ2Ugbm9uLW9iamVjdHMuJ1xuICAgICk7XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gdHdvKSB7XG4gICAgICBpZiAodHdvLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgX2ludmFyaWFudChcbiAgICAgICAgICBvbmVba2V5XSA9PT0gdW5kZWZpbmVkLFxuICAgICAgICAgICdtZXJnZUludG9XaXRoTm9EdXBsaWNhdGVLZXlzKCk6ICcgK1xuICAgICAgICAgICAgJ1RyaWVkIHRvIG1lcmdlIHR3byBvYmplY3RzIHdpdGggdGhlIHNhbWUga2V5OiBgJXNgLiBUaGlzIGNvbmZsaWN0ICcgK1xuICAgICAgICAgICAgJ21heSBiZSBkdWUgdG8gYSBtaXhpbjsgaW4gcGFydGljdWxhciwgdGhpcyBtYXkgYmUgY2F1c2VkIGJ5IHR3byAnICtcbiAgICAgICAgICAgICdnZXRJbml0aWFsU3RhdGUoKSBvciBnZXREZWZhdWx0UHJvcHMoKSBtZXRob2RzIHJldHVybmluZyBvYmplY3RzICcgK1xuICAgICAgICAgICAgJ3dpdGggY2xhc2hpbmcga2V5cy4nLFxuICAgICAgICAgIGtleVxuICAgICAgICApO1xuICAgICAgICBvbmVba2V5XSA9IHR3b1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb25lO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdHdvIGZ1bmN0aW9ucyBhbmQgbWVyZ2VzIHRoZWlyIHJldHVybiB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG9uZSBGdW5jdGlvbiB0byBpbnZva2UgZmlyc3QuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IHR3byBGdW5jdGlvbiB0byBpbnZva2Ugc2Vjb25kLlxuICAgKiBAcmV0dXJuIHtmdW5jdGlvbn0gRnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSB0d28gYXJndW1lbnQgZnVuY3Rpb25zLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlTWVyZ2VkUmVzdWx0RnVuY3Rpb24ob25lLCB0d28pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gbWVyZ2VkUmVzdWx0KCkge1xuICAgICAgdmFyIGEgPSBvbmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIHZhciBiID0gdHdvLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICBpZiAoYSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBiO1xuICAgICAgfSBlbHNlIGlmIChiID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgICB9XG4gICAgICB2YXIgYyA9IHt9O1xuICAgICAgbWVyZ2VJbnRvV2l0aE5vRHVwbGljYXRlS2V5cyhjLCBhKTtcbiAgICAgIG1lcmdlSW50b1dpdGhOb0R1cGxpY2F0ZUtleXMoYywgYik7XG4gICAgICByZXR1cm4gYztcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdHdvIGZ1bmN0aW9ucyBhbmQgaWdub3JlcyB0aGVpciByZXR1cm4gdmFsZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG9uZSBGdW5jdGlvbiB0byBpbnZva2UgZmlyc3QuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IHR3byBGdW5jdGlvbiB0byBpbnZva2Ugc2Vjb25kLlxuICAgKiBAcmV0dXJuIHtmdW5jdGlvbn0gRnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSB0d28gYXJndW1lbnQgZnVuY3Rpb25zLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKG9uZSwgdHdvKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGNoYWluZWRGdW5jdGlvbigpIHtcbiAgICAgIG9uZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgdHdvLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kcyBhIG1ldGhvZCB0byB0aGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29tcG9uZW50IENvbXBvbmVudCB3aG9zZSBtZXRob2QgaXMgZ29pbmcgdG8gYmUgYm91bmQuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG1ldGhvZCBNZXRob2QgdG8gYmUgYm91bmQuXG4gICAqIEByZXR1cm4ge2Z1bmN0aW9ufSBUaGUgYm91bmQgbWV0aG9kLlxuICAgKi9cbiAgZnVuY3Rpb24gYmluZEF1dG9CaW5kTWV0aG9kKGNvbXBvbmVudCwgbWV0aG9kKSB7XG4gICAgdmFyIGJvdW5kTWV0aG9kID0gbWV0aG9kLmJpbmQoY29tcG9uZW50KTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgYm91bmRNZXRob2QuX19yZWFjdEJvdW5kQ29udGV4dCA9IGNvbXBvbmVudDtcbiAgICAgIGJvdW5kTWV0aG9kLl9fcmVhY3RCb3VuZE1ldGhvZCA9IG1ldGhvZDtcbiAgICAgIGJvdW5kTWV0aG9kLl9fcmVhY3RCb3VuZEFyZ3VtZW50cyA9IG51bGw7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudC5jb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZTtcbiAgICAgIHZhciBfYmluZCA9IGJvdW5kTWV0aG9kLmJpbmQ7XG4gICAgICBib3VuZE1ldGhvZC5iaW5kID0gZnVuY3Rpb24obmV3VGhpcykge1xuICAgICAgICBmb3IgKFxuICAgICAgICAgIHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksXG4gICAgICAgICAgICBfa2V5ID0gMTtcbiAgICAgICAgICBfa2V5IDwgX2xlbjtcbiAgICAgICAgICBfa2V5KytcbiAgICAgICAgKSB7XG4gICAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2VyIGlzIHRyeWluZyB0byBiaW5kKCkgYW4gYXV0b2JvdW5kIG1ldGhvZDsgd2UgZWZmZWN0aXZlbHkgd2lsbFxuICAgICAgICAvLyBpZ25vcmUgdGhlIHZhbHVlIG9mIFwidGhpc1wiIHRoYXQgdGhlIHVzZXIgaXMgdHJ5aW5nIHRvIHVzZSwgc29cbiAgICAgICAgLy8gbGV0J3Mgd2Fybi5cbiAgICAgICAgaWYgKG5ld1RoaXMgIT09IGNvbXBvbmVudCAmJiBuZXdUaGlzICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIHdhcm5pbmcoXG4gICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAnYmluZCgpOiBSZWFjdCBjb21wb25lbnQgbWV0aG9kcyBtYXkgb25seSBiZSBib3VuZCB0byB0aGUgJyArXG4gICAgICAgICAgICAgICAgJ2NvbXBvbmVudCBpbnN0YW5jZS4gU2VlICVzJyxcbiAgICAgICAgICAgICAgY29tcG9uZW50TmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIWFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIHdhcm5pbmcoXG4gICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAnYmluZCgpOiBZb3UgYXJlIGJpbmRpbmcgYSBjb21wb25lbnQgbWV0aG9kIHRvIHRoZSBjb21wb25lbnQuICcgK1xuICAgICAgICAgICAgICAgICdSZWFjdCBkb2VzIHRoaXMgZm9yIHlvdSBhdXRvbWF0aWNhbGx5IGluIGEgaGlnaC1wZXJmb3JtYW5jZSAnICtcbiAgICAgICAgICAgICAgICAnd2F5LCBzbyB5b3UgY2FuIHNhZmVseSByZW1vdmUgdGhpcyBjYWxsLiBTZWUgJXMnLFxuICAgICAgICAgICAgICBjb21wb25lbnROYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYm91bmRNZXRob2Q7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlYm91bmRNZXRob2QgPSBfYmluZC5hcHBseShib3VuZE1ldGhvZCwgYXJndW1lbnRzKTtcbiAgICAgICAgcmVib3VuZE1ldGhvZC5fX3JlYWN0Qm91bmRDb250ZXh0ID0gY29tcG9uZW50O1xuICAgICAgICByZWJvdW5kTWV0aG9kLl9fcmVhY3RCb3VuZE1ldGhvZCA9IG1ldGhvZDtcbiAgICAgICAgcmVib3VuZE1ldGhvZC5fX3JlYWN0Qm91bmRBcmd1bWVudHMgPSBhcmdzO1xuICAgICAgICByZXR1cm4gcmVib3VuZE1ldGhvZDtcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBib3VuZE1ldGhvZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kcyBhbGwgYXV0by1ib3VuZCBtZXRob2RzIGluIGEgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29tcG9uZW50IENvbXBvbmVudCB3aG9zZSBtZXRob2QgaXMgZ29pbmcgdG8gYmUgYm91bmQuXG4gICAqL1xuICBmdW5jdGlvbiBiaW5kQXV0b0JpbmRNZXRob2RzKGNvbXBvbmVudCkge1xuICAgIHZhciBwYWlycyA9IGNvbXBvbmVudC5fX3JlYWN0QXV0b0JpbmRQYWlycztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhaXJzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICB2YXIgYXV0b0JpbmRLZXkgPSBwYWlyc1tpXTtcbiAgICAgIHZhciBtZXRob2QgPSBwYWlyc1tpICsgMV07XG4gICAgICBjb21wb25lbnRbYXV0b0JpbmRLZXldID0gYmluZEF1dG9CaW5kTWV0aG9kKGNvbXBvbmVudCwgbWV0aG9kKTtcbiAgICB9XG4gIH1cblxuICB2YXIgSXNNb3VudGVkUHJlTWl4aW4gPSB7XG4gICAgY29tcG9uZW50RGlkTW91bnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5fX2lzTW91bnRlZCA9IHRydWU7XG4gICAgfVxuICB9O1xuXG4gIHZhciBJc01vdW50ZWRQb3N0TWl4aW4gPSB7XG4gICAgY29tcG9uZW50V2lsbFVubW91bnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5fX2lzTW91bnRlZCA9IGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQWRkIG1vcmUgdG8gdGhlIFJlYWN0Q2xhc3MgYmFzZSBjbGFzcy4gVGhlc2UgYXJlIGFsbCBsZWdhY3kgZmVhdHVyZXMgYW5kXG4gICAqIHRoZXJlZm9yZSBub3QgYWxyZWFkeSBwYXJ0IG9mIHRoZSBtb2Rlcm4gUmVhY3RDb21wb25lbnQuXG4gICAqL1xuICB2YXIgUmVhY3RDbGFzc01peGluID0ge1xuICAgIC8qKlxuICAgICAqIFRPRE86IFRoaXMgd2lsbCBiZSBkZXByZWNhdGVkIGJlY2F1c2Ugc3RhdGUgc2hvdWxkIGFsd2F5cyBrZWVwIGEgY29uc2lzdGVudFxuICAgICAqIHR5cGUgc2lnbmF0dXJlIGFuZCB0aGUgb25seSB1c2UgY2FzZSBmb3IgdGhpcywgaXMgdG8gYXZvaWQgdGhhdC5cbiAgICAgKi9cbiAgICByZXBsYWNlU3RhdGU6IGZ1bmN0aW9uKG5ld1N0YXRlLCBjYWxsYmFjaykge1xuICAgICAgdGhpcy51cGRhdGVyLmVucXVldWVSZXBsYWNlU3RhdGUodGhpcywgbmV3U3RhdGUsIGNhbGxiYWNrKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tcG9zaXRlIGNvbXBvbmVudCBpcyBtb3VudGVkLlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbW91bnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiBAZmluYWxcbiAgICAgKi9cbiAgICBpc01vdW50ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgd2FybmluZyhcbiAgICAgICAgICB0aGlzLl9fZGlkV2FybklzTW91bnRlZCxcbiAgICAgICAgICAnJXM6IGlzTW91bnRlZCBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkLCBtYWtlIHN1cmUgdG8gY2xlYW4gdXAgJyArXG4gICAgICAgICAgICAnc3Vic2NyaXB0aW9ucyBhbmQgcGVuZGluZyByZXF1ZXN0cyBpbiBjb21wb25lbnRXaWxsVW5tb3VudCB0byAnICtcbiAgICAgICAgICAgICdwcmV2ZW50IG1lbW9yeSBsZWFrcy4nLFxuICAgICAgICAgICh0aGlzLmNvbnN0cnVjdG9yICYmIHRoaXMuY29uc3RydWN0b3IuZGlzcGxheU5hbWUpIHx8XG4gICAgICAgICAgICB0aGlzLm5hbWUgfHxcbiAgICAgICAgICAgICdDb21wb25lbnQnXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX19kaWRXYXJuSXNNb3VudGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhIXRoaXMuX19pc01vdW50ZWQ7XG4gICAgfVxuICB9O1xuXG4gIHZhciBSZWFjdENsYXNzQ29tcG9uZW50ID0gZnVuY3Rpb24oKSB7fTtcbiAgX2Fzc2lnbihcbiAgICBSZWFjdENsYXNzQ29tcG9uZW50LnByb3RvdHlwZSxcbiAgICBSZWFjdENvbXBvbmVudC5wcm90b3R5cGUsXG4gICAgUmVhY3RDbGFzc01peGluXG4gICk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjb21wb3NpdGUgY29tcG9uZW50IGNsYXNzIGdpdmVuIGEgY2xhc3Mgc3BlY2lmaWNhdGlvbi5cbiAgICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNyZWF0ZWNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzcGVjIENsYXNzIHNwZWNpZmljYXRpb24gKHdoaWNoIG11c3QgZGVmaW5lIGByZW5kZXJgKS5cbiAgICogQHJldHVybiB7ZnVuY3Rpb259IENvbXBvbmVudCBjb25zdHJ1Y3RvciBmdW5jdGlvbi5cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlQ2xhc3Moc3BlYykge1xuICAgIC8vIFRvIGtlZXAgb3VyIHdhcm5pbmdzIG1vcmUgdW5kZXJzdGFuZGFibGUsIHdlJ2xsIHVzZSBhIGxpdHRsZSBoYWNrIGhlcmUgdG9cbiAgICAvLyBlbnN1cmUgdGhhdCBDb25zdHJ1Y3Rvci5uYW1lICE9PSAnQ29uc3RydWN0b3InLiBUaGlzIG1ha2VzIHN1cmUgd2UgZG9uJ3RcbiAgICAvLyB1bm5lY2Vzc2FyaWx5IGlkZW50aWZ5IGEgY2xhc3Mgd2l0aG91dCBkaXNwbGF5TmFtZSBhcyAnQ29uc3RydWN0b3InLlxuICAgIHZhciBDb25zdHJ1Y3RvciA9IGlkZW50aXR5KGZ1bmN0aW9uKHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gICAgICAvLyBUaGlzIGNvbnN0cnVjdG9yIGdldHMgb3ZlcnJpZGRlbiBieSBtb2Nrcy4gVGhlIGFyZ3VtZW50IGlzIHVzZWRcbiAgICAgIC8vIGJ5IG1vY2tzIHRvIGFzc2VydCBvbiB3aGF0IGdldHMgbW91bnRlZC5cblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgd2FybmluZyhcbiAgICAgICAgICB0aGlzIGluc3RhbmNlb2YgQ29uc3RydWN0b3IsXG4gICAgICAgICAgJ1NvbWV0aGluZyBpcyBjYWxsaW5nIGEgUmVhY3QgY29tcG9uZW50IGRpcmVjdGx5LiBVc2UgYSBmYWN0b3J5IG9yICcgK1xuICAgICAgICAgICAgJ0pTWCBpbnN0ZWFkLiBTZWU6IGh0dHBzOi8vZmIubWUvcmVhY3QtbGVnYWN5ZmFjdG9yeSdcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gV2lyZSB1cCBhdXRvLWJpbmRpbmdcbiAgICAgIGlmICh0aGlzLl9fcmVhY3RBdXRvQmluZFBhaXJzLmxlbmd0aCkge1xuICAgICAgICBiaW5kQXV0b0JpbmRNZXRob2RzKHRoaXMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7XG4gICAgICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xuXG4gICAgICB0aGlzLnN0YXRlID0gbnVsbDtcblxuICAgICAgLy8gUmVhY3RDbGFzc2VzIGRvZXNuJ3QgaGF2ZSBjb25zdHJ1Y3RvcnMuIEluc3RlYWQsIHRoZXkgdXNlIHRoZVxuICAgICAgLy8gZ2V0SW5pdGlhbFN0YXRlIGFuZCBjb21wb25lbnRXaWxsTW91bnQgbWV0aG9kcyBmb3IgaW5pdGlhbGl6YXRpb24uXG5cbiAgICAgIHZhciBpbml0aWFsU3RhdGUgPSB0aGlzLmdldEluaXRpYWxTdGF0ZSA/IHRoaXMuZ2V0SW5pdGlhbFN0YXRlKCkgOiBudWxsO1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgLy8gV2UgYWxsb3cgYXV0by1tb2NrcyB0byBwcm9jZWVkIGFzIGlmIHRoZXkncmUgcmV0dXJuaW5nIG51bGwuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBpbml0aWFsU3RhdGUgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIHRoaXMuZ2V0SW5pdGlhbFN0YXRlLl9pc01vY2tGdW5jdGlvblxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIHByb2JhYmx5IGJhZCBwcmFjdGljZS4gQ29uc2lkZXIgd2FybmluZyBoZXJlIGFuZFxuICAgICAgICAgIC8vIGRlcHJlY2F0aW5nIHRoaXMgY29udmVuaWVuY2UuXG4gICAgICAgICAgaW5pdGlhbFN0YXRlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgX2ludmFyaWFudChcbiAgICAgICAgdHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoaW5pdGlhbFN0YXRlKSxcbiAgICAgICAgJyVzLmdldEluaXRpYWxTdGF0ZSgpOiBtdXN0IHJldHVybiBhbiBvYmplY3Qgb3IgbnVsbCcsXG4gICAgICAgIENvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8ICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCdcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuc3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gICAgfSk7XG4gICAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gbmV3IFJlYWN0Q2xhc3NDb21wb25lbnQoKTtcbiAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb25zdHJ1Y3RvcjtcbiAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUuX19yZWFjdEF1dG9CaW5kUGFpcnMgPSBbXTtcblxuICAgIGluamVjdGVkTWl4aW5zLmZvckVhY2gobWl4U3BlY0ludG9Db21wb25lbnQuYmluZChudWxsLCBDb25zdHJ1Y3RvcikpO1xuXG4gICAgbWl4U3BlY0ludG9Db21wb25lbnQoQ29uc3RydWN0b3IsIElzTW91bnRlZFByZU1peGluKTtcbiAgICBtaXhTcGVjSW50b0NvbXBvbmVudChDb25zdHJ1Y3Rvciwgc3BlYyk7XG4gICAgbWl4U3BlY0ludG9Db21wb25lbnQoQ29uc3RydWN0b3IsIElzTW91bnRlZFBvc3RNaXhpbik7XG5cbiAgICAvLyBJbml0aWFsaXplIHRoZSBkZWZhdWx0UHJvcHMgcHJvcGVydHkgYWZ0ZXIgYWxsIG1peGlucyBoYXZlIGJlZW4gbWVyZ2VkLlxuICAgIGlmIChDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMpIHtcbiAgICAgIENvbnN0cnVjdG9yLmRlZmF1bHRQcm9wcyA9IENvbnN0cnVjdG9yLmdldERlZmF1bHRQcm9wcygpO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgdGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIHVzZSBvZiB0aGVzZSBtZXRob2QgbmFtZXMgaXMgb2ssXG4gICAgICAvLyBzaW5jZSBpdCdzIHVzZWQgd2l0aCBjcmVhdGVDbGFzcy4gSWYgaXQncyBub3QsIHRoZW4gaXQncyBsaWtlbHkgYVxuICAgICAgLy8gbWlzdGFrZSBzbyB3ZSdsbCB3YXJuIHlvdSB0byB1c2UgdGhlIHN0YXRpYyBwcm9wZXJ0eSwgcHJvcGVydHlcbiAgICAgIC8vIGluaXRpYWxpemVyIG9yIGNvbnN0cnVjdG9yIHJlc3BlY3RpdmVseS5cbiAgICAgIGlmIChDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMpIHtcbiAgICAgICAgQ29uc3RydWN0b3IuZ2V0RGVmYXVsdFByb3BzLmlzUmVhY3RDbGFzc0FwcHJvdmVkID0ge307XG4gICAgICB9XG4gICAgICBpZiAoQ29uc3RydWN0b3IucHJvdG90eXBlLmdldEluaXRpYWxTdGF0ZSkge1xuICAgICAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUuZ2V0SW5pdGlhbFN0YXRlLmlzUmVhY3RDbGFzc0FwcHJvdmVkID0ge307XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2ludmFyaWFudChcbiAgICAgIENvbnN0cnVjdG9yLnByb3RvdHlwZS5yZW5kZXIsXG4gICAgICAnY3JlYXRlQ2xhc3MoLi4uKTogQ2xhc3Mgc3BlY2lmaWNhdGlvbiBtdXN0IGltcGxlbWVudCBhIGByZW5kZXJgIG1ldGhvZC4nXG4gICAgKTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB3YXJuaW5nKFxuICAgICAgICAhQ29uc3RydWN0b3IucHJvdG90eXBlLmNvbXBvbmVudFNob3VsZFVwZGF0ZSxcbiAgICAgICAgJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArXG4gICAgICAgICAgJ2NvbXBvbmVudFNob3VsZFVwZGF0ZSgpLiBEaWQgeW91IG1lYW4gc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk/ICcgK1xuICAgICAgICAgICdUaGUgbmFtZSBpcyBwaHJhc2VkIGFzIGEgcXVlc3Rpb24gYmVjYXVzZSB0aGUgZnVuY3Rpb24gaXMgJyArXG4gICAgICAgICAgJ2V4cGVjdGVkIHRvIHJldHVybiBhIHZhbHVlLicsXG4gICAgICAgIHNwZWMuZGlzcGxheU5hbWUgfHwgJ0EgY29tcG9uZW50J1xuICAgICAgKTtcbiAgICAgIHdhcm5pbmcoXG4gICAgICAgICFDb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcyxcbiAgICAgICAgJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArXG4gICAgICAgICAgJ2NvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMoKS4gRGlkIHlvdSBtZWFuIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKT8nLFxuICAgICAgICBzcGVjLmRpc3BsYXlOYW1lIHx8ICdBIGNvbXBvbmVudCdcbiAgICAgICk7XG4gICAgICB3YXJuaW5nKFxuICAgICAgICAhQ29uc3RydWN0b3IucHJvdG90eXBlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzLFxuICAgICAgICAnJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiAnICtcbiAgICAgICAgICAnRGlkIHlvdSBtZWFuIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk/JyxcbiAgICAgICAgc3BlYy5kaXNwbGF5TmFtZSB8fCAnQSBjb21wb25lbnQnXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFJlZHVjZSB0aW1lIHNwZW50IGRvaW5nIGxvb2t1cHMgYnkgc2V0dGluZyB0aGVzZSBvbiB0aGUgcHJvdG90eXBlLlxuICAgIGZvciAodmFyIG1ldGhvZE5hbWUgaW4gUmVhY3RDbGFzc0ludGVyZmFjZSkge1xuICAgICAgaWYgKCFDb25zdHJ1Y3Rvci5wcm90b3R5cGVbbWV0aG9kTmFtZV0pIHtcbiAgICAgICAgQ29uc3RydWN0b3IucHJvdG90eXBlW21ldGhvZE5hbWVdID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH1cblxuICByZXR1cm4gY3JlYXRlQ2xhc3M7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmFjdG9yeTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcbnZhciBmYWN0b3J5ID0gcmVxdWlyZSgnLi9mYWN0b3J5Jyk7XG5cbmlmICh0eXBlb2YgUmVhY3QgPT09ICd1bmRlZmluZWQnKSB7XG4gIHRocm93IEVycm9yKFxuICAgICdjcmVhdGUtcmVhY3QtY2xhc3MgY291bGQgbm90IGZpbmQgdGhlIFJlYWN0IG9iamVjdC4gSWYgeW91IGFyZSB1c2luZyBzY3JpcHQgdGFncywgJyArXG4gICAgICAnbWFrZSBzdXJlIHRoYXQgUmVhY3QgaXMgYmVpbmcgbG9hZGVkIGJlZm9yZSBjcmVhdGUtcmVhY3QtY2xhc3MuJ1xuICApO1xufVxuXG4vLyBIYWNrIHRvIGdyYWIgTm9vcFVwZGF0ZVF1ZXVlIGZyb20gaXNvbW9ycGhpYyBSZWFjdFxudmFyIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlID0gbmV3IFJlYWN0LkNvbXBvbmVudCgpLnVwZGF0ZXI7XG5cbm1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShcbiAgUmVhY3QuQ29tcG9uZW50LFxuICBSZWFjdC5pc1ZhbGlkRWxlbWVudCxcbiAgUmVhY3ROb29wVXBkYXRlUXVldWVcbik7XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb250YWlucyhyb290LCBuKSB7XG4gIHZhciBub2RlID0gbjtcblxuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlID09PSByb290KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufSIsIi8qKlxuICogQGlnbm9yZVxuICogYmFzZSBldmVudCBvYmplY3QgZm9yIGN1c3RvbSBhbmQgZG9tIGV2ZW50LlxuICogQGF1dGhvciB5aW1pbmdoZUBnbWFpbC5jb21cbiAqL1xuXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmZ1bmN0aW9uIHJldHVybkZhbHNlKCkge1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJldHVyblRydWUoKSB7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBFdmVudEJhc2VPYmplY3QoKSB7XG4gIHRoaXMudGltZVN0YW1wID0gRGF0ZS5ub3coKTtcbiAgdGhpcy50YXJnZXQgPSB1bmRlZmluZWQ7XG4gIHRoaXMuY3VycmVudFRhcmdldCA9IHVuZGVmaW5lZDtcbn1cblxuRXZlbnRCYXNlT2JqZWN0LnByb3RvdHlwZSA9IHtcbiAgaXNFdmVudE9iamVjdDogMSxcblxuICBjb25zdHJ1Y3RvcjogRXZlbnRCYXNlT2JqZWN0LFxuXG4gIGlzRGVmYXVsdFByZXZlbnRlZDogcmV0dXJuRmFsc2UsXG5cbiAgaXNQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLFxuXG4gIGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSxcblxuICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24gcHJldmVudERlZmF1bHQoKSB7XG4gICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSByZXR1cm5UcnVlO1xuICB9LFxuXG4gIHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uKCkge1xuICAgIHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlO1xuICB9LFxuXG4gIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24gc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkge1xuICAgIHRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlO1xuICAgIC8vIGZpeGVkIDEuMlxuICAgIC8vIGNhbGwgc3RvcFByb3BhZ2F0aW9uIGltcGxpY2l0bHlcbiAgICB0aGlzLnN0b3BQcm9wYWdhdGlvbigpO1xuICB9LFxuXG4gIGhhbHQ6IGZ1bmN0aW9uIGhhbHQoaW1tZWRpYXRlKSB7XG4gICAgaWYgKGltbWVkaWF0ZSkge1xuICAgICAgdGhpcy5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG59O1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IEV2ZW50QmFzZU9iamVjdDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07IiwiLyoqXG4gKiBAaWdub3JlXG4gKiBldmVudCBvYmplY3QgZm9yIGRvbVxuICogQGF1dGhvciB5aW1pbmdoZUBnbWFpbC5jb21cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBfRXZlbnRCYXNlT2JqZWN0ID0gcmVxdWlyZSgnLi9FdmVudEJhc2VPYmplY3QnKTtcblxudmFyIF9FdmVudEJhc2VPYmplY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRXZlbnRCYXNlT2JqZWN0KTtcblxudmFyIF9vYmplY3RBc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBfb2JqZWN0QXNzaWduMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdEFzc2lnbik7XG5cbnZhciBUUlVFID0gdHJ1ZTtcbnZhciBGQUxTRSA9IGZhbHNlO1xudmFyIGNvbW1vblByb3BzID0gWydhbHRLZXknLCAnYnViYmxlcycsICdjYW5jZWxhYmxlJywgJ2N0cmxLZXknLCAnY3VycmVudFRhcmdldCcsICdldmVudFBoYXNlJywgJ21ldGFLZXknLCAnc2hpZnRLZXknLCAndGFyZ2V0JywgJ3RpbWVTdGFtcCcsICd2aWV3JywgJ3R5cGUnXTtcblxuZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQodykge1xuICByZXR1cm4gdyA9PT0gbnVsbCB8fCB3ID09PSB1bmRlZmluZWQ7XG59XG5cbnZhciBldmVudE5vcm1hbGl6ZXJzID0gW3tcbiAgcmVnOiAvXmtleS8sXG4gIHByb3BzOiBbJ2NoYXInLCAnY2hhckNvZGUnLCAna2V5JywgJ2tleUNvZGUnLCAnd2hpY2gnXSxcbiAgZml4OiBmdW5jdGlvbiBmaXgoZXZlbnQsIG5hdGl2ZUV2ZW50KSB7XG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKGV2ZW50LndoaWNoKSkge1xuICAgICAgZXZlbnQud2hpY2ggPSAhaXNOdWxsT3JVbmRlZmluZWQobmF0aXZlRXZlbnQuY2hhckNvZGUpID8gbmF0aXZlRXZlbnQuY2hhckNvZGUgOiBuYXRpdmVFdmVudC5rZXlDb2RlO1xuICAgIH1cblxuICAgIC8vIGFkZCBtZXRhS2V5IHRvIG5vbi1NYWMgYnJvd3NlcnMgKHVzZSBjdHJsIGZvciBQQyAncyBhbmQgTWV0YSBmb3IgTWFjcylcbiAgICBpZiAoZXZlbnQubWV0YUtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBldmVudC5tZXRhS2V5ID0gZXZlbnQuY3RybEtleTtcbiAgICB9XG4gIH1cbn0sIHtcbiAgcmVnOiAvXnRvdWNoLyxcbiAgcHJvcHM6IFsndG91Y2hlcycsICdjaGFuZ2VkVG91Y2hlcycsICd0YXJnZXRUb3VjaGVzJ11cbn0sIHtcbiAgcmVnOiAvXmhhc2hjaGFuZ2UkLyxcbiAgcHJvcHM6IFsnbmV3VVJMJywgJ29sZFVSTCddXG59LCB7XG4gIHJlZzogL15nZXN0dXJlY2hhbmdlJC9pLFxuICBwcm9wczogWydyb3RhdGlvbicsICdzY2FsZSddXG59LCB7XG4gIHJlZzogL14obW91c2V3aGVlbHxET01Nb3VzZVNjcm9sbCkkLyxcbiAgcHJvcHM6IFtdLFxuICBmaXg6IGZ1bmN0aW9uIGZpeChldmVudCwgbmF0aXZlRXZlbnQpIHtcbiAgICB2YXIgZGVsdGFYID0gdW5kZWZpbmVkO1xuICAgIHZhciBkZWx0YVkgPSB1bmRlZmluZWQ7XG4gICAgdmFyIGRlbHRhID0gdW5kZWZpbmVkO1xuICAgIHZhciB3aGVlbERlbHRhID0gbmF0aXZlRXZlbnQud2hlZWxEZWx0YTtcbiAgICB2YXIgYXhpcyA9IG5hdGl2ZUV2ZW50LmF4aXM7XG4gICAgdmFyIHdoZWVsRGVsdGFZID0gbmF0aXZlRXZlbnQud2hlZWxEZWx0YVk7XG4gICAgdmFyIHdoZWVsRGVsdGFYID0gbmF0aXZlRXZlbnQud2hlZWxEZWx0YVg7XG4gICAgdmFyIGRldGFpbCA9IG5hdGl2ZUV2ZW50LmRldGFpbDtcblxuICAgIC8vIGllL3dlYmtpdFxuICAgIGlmICh3aGVlbERlbHRhKSB7XG4gICAgICBkZWx0YSA9IHdoZWVsRGVsdGEgLyAxMjA7XG4gICAgfVxuXG4gICAgLy8gZ2Vja29cbiAgICBpZiAoZGV0YWlsKSB7XG4gICAgICAvLyBwcmVzcyBjb250cm9sIGUuZGV0YWlsID09IDEgZWxzZSBlLmRldGFpbCA9PSAzXG4gICAgICBkZWx0YSA9IDAgLSAoZGV0YWlsICUgMyA9PT0gMCA/IGRldGFpbCAvIDMgOiBkZXRhaWwpO1xuICAgIH1cblxuICAgIC8vIEdlY2tvXG4gICAgaWYgKGF4aXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGF4aXMgPT09IGV2ZW50LkhPUklaT05UQUxfQVhJUykge1xuICAgICAgICBkZWx0YVkgPSAwO1xuICAgICAgICBkZWx0YVggPSAwIC0gZGVsdGE7XG4gICAgICB9IGVsc2UgaWYgKGF4aXMgPT09IGV2ZW50LlZFUlRJQ0FMX0FYSVMpIHtcbiAgICAgICAgZGVsdGFYID0gMDtcbiAgICAgICAgZGVsdGFZID0gZGVsdGE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2Via2l0XG4gICAgaWYgKHdoZWVsRGVsdGFZICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlbHRhWSA9IHdoZWVsRGVsdGFZIC8gMTIwO1xuICAgIH1cbiAgICBpZiAod2hlZWxEZWx0YVggIT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVsdGFYID0gLTEgKiB3aGVlbERlbHRhWCAvIDEyMDtcbiAgICB9XG5cbiAgICAvLyDpu5jorqQgZGVsdGFZIChpZSlcbiAgICBpZiAoIWRlbHRhWCAmJiAhZGVsdGFZKSB7XG4gICAgICBkZWx0YVkgPSBkZWx0YTtcbiAgICB9XG5cbiAgICBpZiAoZGVsdGFYICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8qKlxuICAgICAgICogZGVsdGFYIG9mIG1vdXNld2hlZWwgZXZlbnRcbiAgICAgICAqIEBwcm9wZXJ0eSBkZWx0YVhcbiAgICAgICAqIEBtZW1iZXIgRXZlbnQuRG9tRXZlbnQuT2JqZWN0XG4gICAgICAgKi9cbiAgICAgIGV2ZW50LmRlbHRhWCA9IGRlbHRhWDtcbiAgICB9XG5cbiAgICBpZiAoZGVsdGFZICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8qKlxuICAgICAgICogZGVsdGFZIG9mIG1vdXNld2hlZWwgZXZlbnRcbiAgICAgICAqIEBwcm9wZXJ0eSBkZWx0YVlcbiAgICAgICAqIEBtZW1iZXIgRXZlbnQuRG9tRXZlbnQuT2JqZWN0XG4gICAgICAgKi9cbiAgICAgIGV2ZW50LmRlbHRhWSA9IGRlbHRhWTtcbiAgICB9XG5cbiAgICBpZiAoZGVsdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLyoqXG4gICAgICAgKiBkZWx0YSBvZiBtb3VzZXdoZWVsIGV2ZW50XG4gICAgICAgKiBAcHJvcGVydHkgZGVsdGFcbiAgICAgICAqIEBtZW1iZXIgRXZlbnQuRG9tRXZlbnQuT2JqZWN0XG4gICAgICAgKi9cbiAgICAgIGV2ZW50LmRlbHRhID0gZGVsdGE7XG4gICAgfVxuICB9XG59LCB7XG4gIHJlZzogL15tb3VzZXxjb250ZXh0bWVudXxjbGlja3xtc3BvaW50ZXJ8KF5ET01Nb3VzZVNjcm9sbCQpL2ksXG4gIHByb3BzOiBbJ2J1dHRvbnMnLCAnY2xpZW50WCcsICdjbGllbnRZJywgJ2J1dHRvbicsICdvZmZzZXRYJywgJ3JlbGF0ZWRUYXJnZXQnLCAnd2hpY2gnLCAnZnJvbUVsZW1lbnQnLCAndG9FbGVtZW50JywgJ29mZnNldFknLCAncGFnZVgnLCAncGFnZVknLCAnc2NyZWVuWCcsICdzY3JlZW5ZJ10sXG4gIGZpeDogZnVuY3Rpb24gZml4KGV2ZW50LCBuYXRpdmVFdmVudCkge1xuICAgIHZhciBldmVudERvYyA9IHVuZGVmaW5lZDtcbiAgICB2YXIgZG9jID0gdW5kZWZpbmVkO1xuICAgIHZhciBib2R5ID0gdW5kZWZpbmVkO1xuICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgdmFyIGJ1dHRvbiA9IG5hdGl2ZUV2ZW50LmJ1dHRvbjtcblxuICAgIC8vIENhbGN1bGF0ZSBwYWdlWC9ZIGlmIG1pc3NpbmcgYW5kIGNsaWVudFgvWSBhdmFpbGFibGVcbiAgICBpZiAodGFyZ2V0ICYmIGlzTnVsbE9yVW5kZWZpbmVkKGV2ZW50LnBhZ2VYKSAmJiAhaXNOdWxsT3JVbmRlZmluZWQobmF0aXZlRXZlbnQuY2xpZW50WCkpIHtcbiAgICAgIGV2ZW50RG9jID0gdGFyZ2V0Lm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7XG4gICAgICBkb2MgPSBldmVudERvYy5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICBib2R5ID0gZXZlbnREb2MuYm9keTtcbiAgICAgIGV2ZW50LnBhZ2VYID0gbmF0aXZlRXZlbnQuY2xpZW50WCArIChkb2MgJiYgZG9jLnNjcm9sbExlZnQgfHwgYm9keSAmJiBib2R5LnNjcm9sbExlZnQgfHwgMCkgLSAoZG9jICYmIGRvYy5jbGllbnRMZWZ0IHx8IGJvZHkgJiYgYm9keS5jbGllbnRMZWZ0IHx8IDApO1xuICAgICAgZXZlbnQucGFnZVkgPSBuYXRpdmVFdmVudC5jbGllbnRZICsgKGRvYyAmJiBkb2Muc2Nyb2xsVG9wIHx8IGJvZHkgJiYgYm9keS5zY3JvbGxUb3AgfHwgMCkgLSAoZG9jICYmIGRvYy5jbGllbnRUb3AgfHwgYm9keSAmJiBib2R5LmNsaWVudFRvcCB8fCAwKTtcbiAgICB9XG5cbiAgICAvLyB3aGljaCBmb3IgY2xpY2s6IDEgPT09IGxlZnQ7IDIgPT09IG1pZGRsZTsgMyA9PT0gcmlnaHRcbiAgICAvLyBkbyBub3QgdXNlIGJ1dHRvblxuICAgIGlmICghZXZlbnQud2hpY2ggJiYgYnV0dG9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChidXR0b24gJiAxKSB7XG4gICAgICAgIGV2ZW50LndoaWNoID0gMTtcbiAgICAgIH0gZWxzZSBpZiAoYnV0dG9uICYgMikge1xuICAgICAgICBldmVudC53aGljaCA9IDM7XG4gICAgICB9IGVsc2UgaWYgKGJ1dHRvbiAmIDQpIHtcbiAgICAgICAgZXZlbnQud2hpY2ggPSAyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXZlbnQud2hpY2ggPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFkZCByZWxhdGVkVGFyZ2V0LCBpZiBuZWNlc3NhcnlcbiAgICBpZiAoIWV2ZW50LnJlbGF0ZWRUYXJnZXQgJiYgZXZlbnQuZnJvbUVsZW1lbnQpIHtcbiAgICAgIGV2ZW50LnJlbGF0ZWRUYXJnZXQgPSBldmVudC5mcm9tRWxlbWVudCA9PT0gdGFyZ2V0ID8gZXZlbnQudG9FbGVtZW50IDogZXZlbnQuZnJvbUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV2ZW50O1xuICB9XG59XTtcblxuZnVuY3Rpb24gcmV0VHJ1ZSgpIHtcbiAgcmV0dXJuIFRSVUU7XG59XG5cbmZ1bmN0aW9uIHJldEZhbHNlKCkge1xuICByZXR1cm4gRkFMU0U7XG59XG5cbmZ1bmN0aW9uIERvbUV2ZW50T2JqZWN0KG5hdGl2ZUV2ZW50KSB7XG4gIHZhciB0eXBlID0gbmF0aXZlRXZlbnQudHlwZTtcblxuICB2YXIgaXNOYXRpdmUgPSB0eXBlb2YgbmF0aXZlRXZlbnQuc3RvcFByb3BhZ2F0aW9uID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBuYXRpdmVFdmVudC5jYW5jZWxCdWJibGUgPT09ICdib29sZWFuJztcblxuICBfRXZlbnRCYXNlT2JqZWN0MlsnZGVmYXVsdCddLmNhbGwodGhpcyk7XG5cbiAgdGhpcy5uYXRpdmVFdmVudCA9IG5hdGl2ZUV2ZW50O1xuXG4gIC8vIGluIGNhc2UgZG9tIGV2ZW50IGhhcyBiZWVuIG1hcmsgYXMgZGVmYXVsdCBwcmV2ZW50ZWQgYnkgbG93ZXIgZG9tIG5vZGVcbiAgdmFyIGlzRGVmYXVsdFByZXZlbnRlZCA9IHJldEZhbHNlO1xuICBpZiAoJ2RlZmF1bHRQcmV2ZW50ZWQnIGluIG5hdGl2ZUV2ZW50KSB7XG4gICAgaXNEZWZhdWx0UHJldmVudGVkID0gbmF0aXZlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCA/IHJldFRydWUgOiByZXRGYWxzZTtcbiAgfSBlbHNlIGlmICgnZ2V0UHJldmVudERlZmF1bHQnIGluIG5hdGl2ZUV2ZW50KSB7XG4gICAgLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjkxMTUxXG4gICAgaXNEZWZhdWx0UHJldmVudGVkID0gbmF0aXZlRXZlbnQuZ2V0UHJldmVudERlZmF1bHQoKSA/IHJldFRydWUgOiByZXRGYWxzZTtcbiAgfSBlbHNlIGlmICgncmV0dXJuVmFsdWUnIGluIG5hdGl2ZUV2ZW50KSB7XG4gICAgaXNEZWZhdWx0UHJldmVudGVkID0gbmF0aXZlRXZlbnQucmV0dXJuVmFsdWUgPT09IEZBTFNFID8gcmV0VHJ1ZSA6IHJldEZhbHNlO1xuICB9XG5cbiAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBpc0RlZmF1bHRQcmV2ZW50ZWQ7XG5cbiAgdmFyIGZpeEZucyA9IFtdO1xuICB2YXIgZml4Rm4gPSB1bmRlZmluZWQ7XG4gIHZhciBsID0gdW5kZWZpbmVkO1xuICB2YXIgcHJvcCA9IHVuZGVmaW5lZDtcbiAgdmFyIHByb3BzID0gY29tbW9uUHJvcHMuY29uY2F0KCk7XG5cbiAgZXZlbnROb3JtYWxpemVycy5mb3JFYWNoKGZ1bmN0aW9uIChub3JtYWxpemVyKSB7XG4gICAgaWYgKHR5cGUubWF0Y2gobm9ybWFsaXplci5yZWcpKSB7XG4gICAgICBwcm9wcyA9IHByb3BzLmNvbmNhdChub3JtYWxpemVyLnByb3BzKTtcbiAgICAgIGlmIChub3JtYWxpemVyLmZpeCkge1xuICAgICAgICBmaXhGbnMucHVzaChub3JtYWxpemVyLmZpeCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBsID0gcHJvcHMubGVuZ3RoO1xuXG4gIC8vIGNsb25lIHByb3BlcnRpZXMgb2YgdGhlIG9yaWdpbmFsIGV2ZW50IG9iamVjdFxuICB3aGlsZSAobCkge1xuICAgIHByb3AgPSBwcm9wc1stLWxdO1xuICAgIHRoaXNbcHJvcF0gPSBuYXRpdmVFdmVudFtwcm9wXTtcbiAgfVxuXG4gIC8vIGZpeCB0YXJnZXQgcHJvcGVydHksIGlmIG5lY2Vzc2FyeVxuICBpZiAoIXRoaXMudGFyZ2V0ICYmIGlzTmF0aXZlKSB7XG4gICAgdGhpcy50YXJnZXQgPSBuYXRpdmVFdmVudC5zcmNFbGVtZW50IHx8IGRvY3VtZW50OyAvLyBzcmNFbGVtZW50IG1pZ2h0IG5vdCBiZSBkZWZpbmVkIGVpdGhlclxuICB9XG5cbiAgLy8gY2hlY2sgaWYgdGFyZ2V0IGlzIGEgdGV4dCBub2RlIChzYWZhcmkpXG4gIGlmICh0aGlzLnRhcmdldCAmJiB0aGlzLnRhcmdldC5ub2RlVHlwZSA9PT0gMykge1xuICAgIHRoaXMudGFyZ2V0ID0gdGhpcy50YXJnZXQucGFyZW50Tm9kZTtcbiAgfVxuXG4gIGwgPSBmaXhGbnMubGVuZ3RoO1xuXG4gIHdoaWxlIChsKSB7XG4gICAgZml4Rm4gPSBmaXhGbnNbLS1sXTtcbiAgICBmaXhGbih0aGlzLCBuYXRpdmVFdmVudCk7XG4gIH1cblxuICB0aGlzLnRpbWVTdGFtcCA9IG5hdGl2ZUV2ZW50LnRpbWVTdGFtcCB8fCBEYXRlLm5vdygpO1xufVxuXG52YXIgRXZlbnRCYXNlT2JqZWN0UHJvdG8gPSBfRXZlbnRCYXNlT2JqZWN0MlsnZGVmYXVsdCddLnByb3RvdHlwZTtcblxuKDAsIF9vYmplY3RBc3NpZ24yWydkZWZhdWx0J10pKERvbUV2ZW50T2JqZWN0LnByb3RvdHlwZSwgRXZlbnRCYXNlT2JqZWN0UHJvdG8sIHtcbiAgY29uc3RydWN0b3I6IERvbUV2ZW50T2JqZWN0LFxuXG4gIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbiBwcmV2ZW50RGVmYXVsdCgpIHtcbiAgICB2YXIgZSA9IHRoaXMubmF0aXZlRXZlbnQ7XG5cbiAgICAvLyBpZiBwcmV2ZW50RGVmYXVsdCBleGlzdHMgcnVuIGl0IG9uIHRoZSBvcmlnaW5hbCBldmVudFxuICAgIGlmIChlLnByZXZlbnREZWZhdWx0KSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG90aGVyd2lzZSBzZXQgdGhlIHJldHVyblZhbHVlIHByb3BlcnR5IG9mIHRoZSBvcmlnaW5hbCBldmVudCB0byBGQUxTRSAoSUUpXG4gICAgICBlLnJldHVyblZhbHVlID0gRkFMU0U7XG4gICAgfVxuXG4gICAgRXZlbnRCYXNlT2JqZWN0UHJvdG8ucHJldmVudERlZmF1bHQuY2FsbCh0aGlzKTtcbiAgfSxcblxuICBzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uIHN0b3BQcm9wYWdhdGlvbigpIHtcbiAgICB2YXIgZSA9IHRoaXMubmF0aXZlRXZlbnQ7XG5cbiAgICAvLyBpZiBzdG9wUHJvcGFnYXRpb24gZXhpc3RzIHJ1biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnRcbiAgICBpZiAoZS5zdG9wUHJvcGFnYXRpb24pIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG90aGVyd2lzZSBzZXQgdGhlIGNhbmNlbEJ1YmJsZSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gVFJVRSAoSUUpXG4gICAgICBlLmNhbmNlbEJ1YmJsZSA9IFRSVUU7XG4gICAgfVxuXG4gICAgRXZlbnRCYXNlT2JqZWN0UHJvdG8uc3RvcFByb3BhZ2F0aW9uLmNhbGwodGhpcyk7XG4gIH1cbn0pO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBEb21FdmVudE9iamVjdDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzWydkZWZhdWx0J10gPSBhZGRFdmVudExpc3RlbmVyO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBfRXZlbnRPYmplY3QgPSByZXF1aXJlKCcuL0V2ZW50T2JqZWN0Jyk7XG5cbnZhciBfRXZlbnRPYmplY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRXZlbnRPYmplY3QpO1xuXG5mdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKHRhcmdldCwgZXZlbnRUeXBlLCBjYWxsYmFjaywgb3B0aW9uKSB7XG4gIGZ1bmN0aW9uIHdyYXBDYWxsYmFjayhlKSB7XG4gICAgdmFyIG5lID0gbmV3IF9FdmVudE9iamVjdDJbJ2RlZmF1bHQnXShlKTtcbiAgICBjYWxsYmFjay5jYWxsKHRhcmdldCwgbmUpO1xuICB9XG5cbiAgaWYgKHRhcmdldC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgdmFyIF9yZXQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHVzZUNhcHR1cmUgPSBmYWxzZTtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnb2JqZWN0Jykge1xuICAgICAgICB1c2VDYXB0dXJlID0gb3B0aW9uLmNhcHR1cmUgfHwgZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdib29sZWFuJykge1xuICAgICAgICB1c2VDYXB0dXJlID0gb3B0aW9uO1xuICAgICAgfVxuXG4gICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIHdyYXBDYWxsYmFjaywgb3B0aW9uIHx8IGZhbHNlKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdjoge1xuICAgICAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCB3cmFwQ2FsbGJhY2ssIHVzZUNhcHR1cmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KSgpO1xuXG4gICAgaWYgKHR5cGVvZiBfcmV0ID09PSAnb2JqZWN0JykgcmV0dXJuIF9yZXQudjtcbiAgfSBlbHNlIGlmICh0YXJnZXQuYXR0YWNoRXZlbnQpIHtcbiAgICB0YXJnZXQuYXR0YWNoRXZlbnQoJ29uJyArIGV2ZW50VHlwZSwgd3JhcENhbGxiYWNrKTtcbiAgICByZXR1cm4ge1xuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICAgIHRhcmdldC5kZXRhY2hFdmVudCgnb24nICsgZXZlbnRUeXBlLCB3cmFwQ2FsbGJhY2spO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBhZGRFdmVudExpc3RlbmVyV3JhcDtcblxudmFyIF9hZGREb21FdmVudExpc3RlbmVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiYWRkLWRvbS1ldmVudC1saXN0ZW5lclwiKSk7XG5cbnZhciBfcmVhY3REb20gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdC1kb21cIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyV3JhcCh0YXJnZXQsIGV2ZW50VHlwZSwgY2IsIG9wdGlvbikge1xuICAvKiBlc2xpbnQgY2FtZWxjYXNlOiAyICovXG4gIHZhciBjYWxsYmFjayA9IF9yZWFjdERvbS5kZWZhdWx0LnVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzID8gZnVuY3Rpb24gcnVuKGUpIHtcbiAgICBfcmVhY3REb20uZGVmYXVsdC51bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyhjYiwgZSk7XG4gIH0gOiBjYjtcbiAgcmV0dXJuICgwLCBfYWRkRG9tRXZlbnRMaXN0ZW5lci5kZWZhdWx0KSh0YXJnZXQsIGV2ZW50VHlwZSwgY2FsbGJhY2ssIG9wdGlvbik7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59OyIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4vLyAxOS4xLjIuNCAvIDE1LjIuMy42IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSwgJ09iamVjdCcsIHsgZGVmaW5lUHJvcGVydHk6IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmYgfSk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgJE9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Q7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KGl0LCBrZXksIGRlc2MpIHtcbiAgcmV0dXJuICRPYmplY3QuZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgZGVzYyk7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGVmaW5lUHJvcGVydHkpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgICBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICAgIGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfTtcbn0oKTsiLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG4vLyB0cnVlICAtPiBTdHJpbmcjYXRcbi8vIGZhbHNlIC0+IFN0cmluZyNjb2RlUG9pbnRBdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoVE9fU1RSSU5HKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGhhdCwgcG9zKSB7XG4gICAgdmFyIHMgPSBTdHJpbmcoZGVmaW5lZCh0aGF0KSk7XG4gICAgdmFyIGkgPSB0b0ludGVnZXIocG9zKTtcbiAgICB2YXIgbCA9IHMubGVuZ3RoO1xuICAgIHZhciBhLCBiO1xuICAgIGlmIChpIDwgMCB8fCBpID49IGwpIHJldHVybiBUT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICBhID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgIHJldHVybiBhIDwgMHhkODAwIHx8IGEgPiAweGRiZmYgfHwgaSArIDEgPT09IGwgfHwgKGIgPSBzLmNoYXJDb2RlQXQoaSArIDEpKSA8IDB4ZGMwMCB8fCBiID4gMHhkZmZmXG4gICAgICA/IFRPX1NUUklORyA/IHMuY2hhckF0KGkpIDogYVxuICAgICAgOiBUT19TVFJJTkcgPyBzLnNsaWNlKGksIGkgKyAyKSA6IChhIC0gMHhkODAwIDw8IDEwKSArIChiIC0gMHhkYzAwKSArIDB4MTAwMDA7XG4gIH07XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19oaWRlJyk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBrZXlzID0gZ2V0S2V5cyhQcm9wZXJ0aWVzKTtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICB2YXIgaSA9IDA7XG4gIHZhciBQO1xuICB3aGlsZSAobGVuZ3RoID4gaSkgZFAuZihPLCBQID0ga2V5c1tpKytdLCBQcm9wZXJ0aWVzW1BdKTtcbiAgcmV0dXJuIE87XG59O1xuIiwidmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiIsIi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgZFBzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwcycpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xudmFyIEVtcHR5ID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgY3JlYXRlRGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcbiAgdmFyIGlmcmFtZSA9IHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnaWZyYW1lJyk7XG4gIHZhciBpID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB2YXIgbHQgPSAnPCc7XG4gIHZhciBndCA9ICc+JztcbiAgdmFyIGlmcmFtZURvY3VtZW50O1xuICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVxdWlyZSgnLi9faHRtbCcpLmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZS5zcmMgPSAnamF2YXNjcmlwdDonOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNjcmlwdC11cmxcbiAgLy8gY3JlYXRlRGljdCA9IGlmcmFtZS5jb250ZW50V2luZG93Lk9iamVjdDtcbiAgLy8gaHRtbC5yZW1vdmVDaGlsZChpZnJhbWUpO1xuICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG4gIGlmcmFtZURvY3VtZW50LndyaXRlKGx0ICsgJ3NjcmlwdCcgKyBndCArICdkb2N1bWVudC5GPU9iamVjdCcgKyBsdCArICcvc2NyaXB0JyArIGd0KTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XG4gIHdoaWxlIChpLS0pIGRlbGV0ZSBjcmVhdGVEaWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbaV1dO1xuICByZXR1cm4gY3JlYXRlRGljdCgpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChPICE9PSBudWxsKSB7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eSgpO1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IGNyZWF0ZURpY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRQcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcbiIsInZhciBzdG9yZSA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCd3a3MnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbnZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5TeW1ib2w7XG52YXIgVVNFX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcblxudmFyICRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gc3RvcmVbbmFtZV0gfHwgKHN0b3JlW25hbWVdID1cbiAgICBVU0VfU1lNQk9MICYmIFN5bWJvbFtuYW1lXSB8fCAoVVNFX1NZTUJPTCA/IFN5bWJvbCA6IHVpZCkoJ1N5bWJvbC4nICsgbmFtZSkpO1xufTtcblxuJGV4cG9ydHMuc3RvcmUgPSBzdG9yZTtcbiIsInZhciBkZWYgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgdGFnLCBzdGF0KSB7XG4gIGlmIChpdCAmJiAhaGFzKGl0ID0gc3RhdCA/IGl0IDogaXQucHJvdG90eXBlLCBUQUcpKSBkZWYoaXQsIFRBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB0YWcgfSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbnZhciBkZXNjcmlwdG9yID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXG4vLyAyNS4xLjIuMS4xICVJdGVyYXRvclByb3RvdHlwZSVbQEBpdGVyYXRvcl0oKVxucmVxdWlyZSgnLi9faGlkZScpKEl0ZXJhdG9yUHJvdG90eXBlLCByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KSB7XG4gIENvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwgeyBuZXh0OiBkZXNjcmlwdG9yKDEsIG5leHQpIH0pO1xuICBzZXRUb1N0cmluZ1RhZyhDb25zdHJ1Y3RvciwgTkFNRSArICcgSXRlcmF0b3InKTtcbn07XG4iLCIvLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG52YXIgT2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiAoTykge1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmIChoYXMoTywgSUVfUFJPVE8pKSByZXR1cm4gT1tJRV9QUk9UT107XG4gIGlmICh0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG8gOiBudWxsO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciAkaXRlckNyZWF0ZSA9IHJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1kgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSk7IC8vIFNhZmFyaSBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbnZhciBGRl9JVEVSQVRPUiA9ICdAQGl0ZXJhdG9yJztcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCkge1xuICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG4gIHZhciBnZXRNZXRob2QgPSBmdW5jdGlvbiAoa2luZCkge1xuICAgIGlmICghQlVHR1kgJiYga2luZCBpbiBwcm90bykgcmV0dXJuIHByb3RvW2tpbmRdO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gIH07XG4gIHZhciBUQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVM7XG4gIHZhciBWQUxVRVNfQlVHID0gZmFsc2U7XG4gIHZhciBwcm90byA9IEJhc2UucHJvdG90eXBlO1xuICB2YXIgJG5hdGl2ZSA9IHByb3RvW0lURVJBVE9SXSB8fCBwcm90b1tGRl9JVEVSQVRPUl0gfHwgREVGQVVMVCAmJiBwcm90b1tERUZBVUxUXTtcbiAgdmFyICRkZWZhdWx0ID0gJG5hdGl2ZSB8fCBnZXRNZXRob2QoREVGQVVMVCk7XG4gIHZhciAkZW50cmllcyA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWQ7XG4gIHZhciAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZTtcbiAgdmFyIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGU7XG4gIC8vIEZpeCBuYXRpdmVcbiAgaWYgKCRhbnlOYXRpdmUpIHtcbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKCRhbnlOYXRpdmUuY2FsbChuZXcgQmFzZSgpKSk7XG4gICAgaWYgKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yUHJvdG90eXBlLCBUQUcsIHRydWUpO1xuICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG4gICAgICBpZiAoIUxJQlJBUlkgJiYgdHlwZW9mIEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXSAhPSAnZnVuY3Rpb24nKSBoaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKERFRl9WQUxVRVMgJiYgJG5hdGl2ZSAmJiAkbmF0aXZlLm5hbWUgIT09IFZBTFVFUykge1xuICAgIFZBTFVFU19CVUcgPSB0cnVlO1xuICAgICRkZWZhdWx0ID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZiAoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpIHtcbiAgICBoaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpO1xuICB9XG4gIC8vIFBsdWcgZm9yIGxpYnJhcnlcbiAgSXRlcmF0b3JzW05BTUVdID0gJGRlZmF1bHQ7XG4gIEl0ZXJhdG9yc1tUQUddID0gcmV0dXJuVGhpcztcbiAgaWYgKERFRkFVTFQpIHtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiBERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6IElTX1NFVCA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogJGVudHJpZXNcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoa2V5IGluIG1ldGhvZHMpIHtcbiAgICAgIGlmICghKGtleSBpbiBwcm90bykpIHJlZGVmaW5lKHByb3RvLCBrZXksIG1ldGhvZHNba2V5XSk7XG4gICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGF0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLWF0JykodHJ1ZSk7XG5cbi8vIDIxLjEuMy4yNyBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdKClcbnJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24gKGl0ZXJhdGVkKSB7XG4gIHRoaXMuX3QgPSBTdHJpbmcoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbi8vIDIxLjEuNS4yLjEgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uICgpIHtcbiAgdmFyIE8gPSB0aGlzLl90O1xuICB2YXIgaW5kZXggPSB0aGlzLl9pO1xuICB2YXIgcG9pbnQ7XG4gIGlmIChpbmRleCA+PSBPLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICBwb2ludCA9ICRhdChPLCBpbmRleCk7XG4gIHRoaXMuX2kgKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4geyB2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlIH07XG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGRvbmUsIHZhbHVlKSB7XG4gIHJldHVybiB7IHZhbHVlOiB2YWx1ZSwgZG9uZTogISFkb25lIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKTtcbnZhciBzdGVwID0gcmVxdWlyZSgnLi9faXRlci1zdGVwJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xuXG4vLyAyMi4xLjMuNCBBcnJheS5wcm90b3R5cGUuZW50cmllcygpXG4vLyAyMi4xLjMuMTMgQXJyYXkucHJvdG90eXBlLmtleXMoKVxuLy8gMjIuMS4zLjI5IEFycmF5LnByb3RvdHlwZS52YWx1ZXMoKVxuLy8gMjIuMS4zLjMwIEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICB0aGlzLl90ID0gdG9JT2JqZWN0KGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4gIHRoaXMuX2sgPSBraW5kOyAgICAgICAgICAgICAgICAvLyBraW5kXG4vLyAyMi4xLjUuMi4xICVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uICgpIHtcbiAgdmFyIE8gPSB0aGlzLl90O1xuICB2YXIga2luZCA9IHRoaXMuX2s7XG4gIHZhciBpbmRleCA9IHRoaXMuX2krKztcbiAgaWYgKCFPIHx8IGluZGV4ID49IE8ubGVuZ3RoKSB7XG4gICAgdGhpcy5fdCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gc3RlcCgxKTtcbiAgfVxuICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiBzdGVwKDAsIGluZGV4KTtcbiAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiBzdGVwKDAsIE9baW5kZXhdKTtcbiAgcmV0dXJuIHN0ZXAoMCwgW2luZGV4LCBPW2luZGV4XV0pO1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyUgKDkuNC40LjYsIDkuNC40LjcpXG5JdGVyYXRvcnMuQXJndW1lbnRzID0gSXRlcmF0b3JzLkFycmF5O1xuXG5hZGRUb1Vuc2NvcGFibGVzKCdrZXlzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTtcbiIsInJlcXVpcmUoJy4vZXM2LmFycmF5Lml0ZXJhdG9yJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciBUT19TVFJJTkdfVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyk7XG5cbnZhciBET01JdGVyYWJsZXMgPSAoJ0NTU1J1bGVMaXN0LENTU1N0eWxlRGVjbGFyYXRpb24sQ1NTVmFsdWVMaXN0LENsaWVudFJlY3RMaXN0LERPTVJlY3RMaXN0LERPTVN0cmluZ0xpc3QsJyArXG4gICdET01Ub2tlbkxpc3QsRGF0YVRyYW5zZmVySXRlbUxpc3QsRmlsZUxpc3QsSFRNTEFsbENvbGxlY3Rpb24sSFRNTENvbGxlY3Rpb24sSFRNTEZvcm1FbGVtZW50LEhUTUxTZWxlY3RFbGVtZW50LCcgK1xuICAnTWVkaWFMaXN0LE1pbWVUeXBlQXJyYXksTmFtZWROb2RlTWFwLE5vZGVMaXN0LFBhaW50UmVxdWVzdExpc3QsUGx1Z2luLFBsdWdpbkFycmF5LFNWR0xlbmd0aExpc3QsU1ZHTnVtYmVyTGlzdCwnICtcbiAgJ1NWR1BhdGhTZWdMaXN0LFNWR1BvaW50TGlzdCxTVkdTdHJpbmdMaXN0LFNWR1RyYW5zZm9ybUxpc3QsU291cmNlQnVmZmVyTGlzdCxTdHlsZVNoZWV0TGlzdCxUZXh0VHJhY2tDdWVMaXN0LCcgK1xuICAnVGV4dFRyYWNrTGlzdCxUb3VjaExpc3QnKS5zcGxpdCgnLCcpO1xuXG5mb3IgKHZhciBpID0gMDsgaSA8IERPTUl0ZXJhYmxlcy5sZW5ndGg7IGkrKykge1xuICB2YXIgTkFNRSA9IERPTUl0ZXJhYmxlc1tpXTtcbiAgdmFyIENvbGxlY3Rpb24gPSBnbG9iYWxbTkFNRV07XG4gIHZhciBwcm90byA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGU7XG4gIGlmIChwcm90byAmJiAhcHJvdG9bVE9fU1RSSU5HX1RBR10pIGhpZGUocHJvdG8sIFRPX1NUUklOR19UQUcsIE5BTUUpO1xuICBJdGVyYXRvcnNbTkFNRV0gPSBJdGVyYXRvcnMuQXJyYXk7XG59XG4iLCJleHBvcnRzLmYgPSByZXF1aXJlKCcuL193a3MnKTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX3drcy1leHQnKS5mKCdpdGVyYXRvcicpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL3N5bWJvbC9pdGVyYXRvclwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsInZhciBNRVRBID0gcmVxdWlyZSgnLi9fdWlkJykoJ21ldGEnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHNldERlc2MgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGlkID0gMDtcbnZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlIHx8IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIEZSRUVaRSA9ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKTtcbn0pO1xudmFyIHNldE1ldGEgPSBmdW5jdGlvbiAoaXQpIHtcbiAgc2V0RGVzYyhpdCwgTUVUQSwgeyB2YWx1ZToge1xuICAgIGk6ICdPJyArICsraWQsIC8vIG9iamVjdCBJRFxuICAgIHc6IHt9ICAgICAgICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gfSk7XG59O1xudmFyIGZhc3RLZXkgPSBmdW5jdGlvbiAoaXQsIGNyZWF0ZSkge1xuICAvLyByZXR1cm4gcHJpbWl0aXZlIHdpdGggcHJlZml4XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiAodHlwZW9mIGl0ID09ICdzdHJpbmcnID8gJ1MnIDogJ1AnKSArIGl0O1xuICBpZiAoIWhhcyhpdCwgTUVUQSkpIHtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuICdGJztcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gJ0UnO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YShpdCk7XG4gIC8vIHJldHVybiBvYmplY3QgSURcbiAgfSByZXR1cm4gaXRbTUVUQV0uaTtcbn07XG52YXIgZ2V0V2VhayA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIGlmICghaGFzKGl0LCBNRVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhKGl0KTtcbiAgLy8gcmV0dXJuIGhhc2ggd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSByZXR1cm4gaXRbTUVUQV0udztcbn07XG4vLyBhZGQgbWV0YWRhdGEgb24gZnJlZXplLWZhbWlseSBtZXRob2RzIGNhbGxpbmdcbnZhciBvbkZyZWV6ZSA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoRlJFRVpFICYmIG1ldGEuTkVFRCAmJiBpc0V4dGVuc2libGUoaXQpICYmICFoYXMoaXQsIE1FVEEpKSBzZXRNZXRhKGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbnZhciBtZXRhID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gIEtFWTogTUVUQSxcbiAgTkVFRDogZmFsc2UsXG4gIGZhc3RLZXk6IGZhc3RLZXksXG4gIGdldFdlYWs6IGdldFdlYWssXG4gIG9uRnJlZXplOiBvbkZyZWV6ZVxufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIExJQlJBUlkgPSByZXF1aXJlKCcuL19saWJyYXJ5Jyk7XG52YXIgd2tzRXh0ID0gcmVxdWlyZSgnLi9fd2tzLWV4dCcpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgdmFyICRTeW1ib2wgPSBjb3JlLlN5bWJvbCB8fCAoY29yZS5TeW1ib2wgPSBMSUJSQVJZID8ge30gOiBnbG9iYWwuU3ltYm9sIHx8IHt9KTtcbiAgaWYgKG5hbWUuY2hhckF0KDApICE9ICdfJyAmJiAhKG5hbWUgaW4gJFN5bWJvbCkpIGRlZmluZVByb3BlcnR5KCRTeW1ib2wsIG5hbWUsIHsgdmFsdWU6IHdrc0V4dC5mKG5hbWUpIH0pO1xufTtcbiIsIi8vIGFsbCBlbnVtZXJhYmxlIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBzeW1ib2xzXG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG52YXIgZ09QUyA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJyk7XG52YXIgcElFID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHJlc3VsdCA9IGdldEtleXMoaXQpO1xuICB2YXIgZ2V0U3ltYm9scyA9IGdPUFMuZjtcbiAgaWYgKGdldFN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IGdldFN5bWJvbHMoaXQpO1xuICAgIHZhciBpc0VudW0gPSBwSUUuZjtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAoc3ltYm9scy5sZW5ndGggPiBpKSBpZiAoaXNFbnVtLmNhbGwoaXQsIGtleSA9IHN5bWJvbHNbaSsrXSkpIHJlc3VsdC5wdXNoKGtleSk7XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIvLyA3LjIuMiBJc0FycmF5KGFyZ3VtZW50KVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkoYXJnKSB7XG4gIHJldHVybiBjb2YoYXJnKSA9PSAnQXJyYXknO1xufTtcbiIsIi8vIDE5LjEuMi43IC8gMTUuMi4zLjQgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKS5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiAka2V5cyhPLCBoaWRkZW5LZXlzKTtcbn07XG4iLCIvLyBmYWxsYmFjayBmb3IgSUUxMSBidWdneSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB3aXRoIGlmcmFtZSBhbmQgd2luZG93XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIGdPUE4gPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmY7XG52YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxudmFyIHdpbmRvd05hbWVzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNcbiAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpIDogW107XG5cbnZhciBnZXRXaW5kb3dOYW1lcyA9IGZ1bmN0aW9uIChpdCkge1xuICB0cnkge1xuICAgIHJldHVybiBnT1BOKGl0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB3aW5kb3dOYW1lcy5zbGljZSgpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCkge1xuICByZXR1cm4gd2luZG93TmFtZXMgJiYgdG9TdHJpbmcuY2FsbChpdCkgPT0gJ1tvYmplY3QgV2luZG93XScgPyBnZXRXaW5kb3dOYW1lcyhpdCkgOiBnT1BOKHRvSU9iamVjdChpdCkpO1xufTtcbiIsInZhciBwSUUgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4vX2llOC1kb20tZGVmaW5lJyk7XG52YXIgZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbmV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBnT1BEIDogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApIHtcbiAgTyA9IHRvSU9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuIGdPUEQoTywgUCk7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoaGFzKE8sIFApKSByZXR1cm4gY3JlYXRlRGVzYyghcElFLmYuY2FsbChPLCBQKSwgT1tQXSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gRUNNQVNjcmlwdCA2IHN5bWJvbHMgc2hpbVxudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIE1FVEEgPSByZXF1aXJlKCcuL19tZXRhJykuS0VZO1xudmFyICRmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi9fc2hhcmVkJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4vX3VpZCcpO1xudmFyIHdrcyA9IHJlcXVpcmUoJy4vX3drcycpO1xudmFyIHdrc0V4dCA9IHJlcXVpcmUoJy4vX3drcy1leHQnKTtcbnZhciB3a3NEZWZpbmUgPSByZXF1aXJlKCcuL193a3MtZGVmaW5lJyk7XG52YXIgZW51bUtleXMgPSByZXF1aXJlKCcuL19lbnVtLWtleXMnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9faXMtYXJyYXknKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIF9jcmVhdGUgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJyk7XG52YXIgZ09QTkV4dCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuLWV4dCcpO1xudmFyICRHT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKTtcbnZhciAkR09QUyA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJyk7XG52YXIgJERQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgJGtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIGdPUEQgPSAkR09QRC5mO1xudmFyIGRQID0gJERQLmY7XG52YXIgZ09QTiA9IGdPUE5FeHQuZjtcbnZhciAkU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciAkSlNPTiA9IGdsb2JhbC5KU09OO1xudmFyIF9zdHJpbmdpZnkgPSAkSlNPTiAmJiAkSlNPTi5zdHJpbmdpZnk7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG52YXIgSElEREVOID0gd2tzKCdfaGlkZGVuJyk7XG52YXIgVE9fUFJJTUlUSVZFID0gd2tzKCd0b1ByaW1pdGl2ZScpO1xudmFyIGlzRW51bSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIFN5bWJvbFJlZ2lzdHJ5ID0gc2hhcmVkKCdzeW1ib2wtcmVnaXN0cnknKTtcbnZhciBBbGxTeW1ib2xzID0gc2hhcmVkKCdzeW1ib2xzJyk7XG52YXIgT1BTeW1ib2xzID0gc2hhcmVkKCdvcC1zeW1ib2xzJyk7XG52YXIgT2JqZWN0UHJvdG8gPSBPYmplY3RbUFJPVE9UWVBFXTtcbnZhciBVU0VfTkFUSVZFID0gdHlwZW9mICRTeW1ib2wgPT0gJ2Z1bmN0aW9uJyAmJiAhISRHT1BTLmY7XG52YXIgUU9iamVjdCA9IGdsb2JhbC5RT2JqZWN0O1xuLy8gRG9uJ3QgdXNlIHNldHRlcnMgaW4gUXQgU2NyaXB0LCBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMTczXG52YXIgc2V0dGVyID0gIVFPYmplY3QgfHwgIVFPYmplY3RbUFJPVE9UWVBFXSB8fCAhUU9iamVjdFtQUk9UT1RZUEVdLmZpbmRDaGlsZDtcblxuLy8gZmFsbGJhY2sgZm9yIG9sZCBBbmRyb2lkLCBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9Njg3XG52YXIgc2V0U3ltYm9sRGVzYyA9IERFU0NSSVBUT1JTICYmICRmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBfY3JlYXRlKGRQKHt9LCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRQKHRoaXMsICdhJywgeyB2YWx1ZTogNyB9KS5hOyB9XG4gIH0pKS5hICE9IDc7XG59KSA/IGZ1bmN0aW9uIChpdCwga2V5LCBEKSB7XG4gIHZhciBwcm90b0Rlc2MgPSBnT1BEKE9iamVjdFByb3RvLCBrZXkpO1xuICBpZiAocHJvdG9EZXNjKSBkZWxldGUgT2JqZWN0UHJvdG9ba2V5XTtcbiAgZFAoaXQsIGtleSwgRCk7XG4gIGlmIChwcm90b0Rlc2MgJiYgaXQgIT09IE9iamVjdFByb3RvKSBkUChPYmplY3RQcm90bywga2V5LCBwcm90b0Rlc2MpO1xufSA6IGRQO1xuXG52YXIgd3JhcCA9IGZ1bmN0aW9uICh0YWcpIHtcbiAgdmFyIHN5bSA9IEFsbFN5bWJvbHNbdGFnXSA9IF9jcmVhdGUoJFN5bWJvbFtQUk9UT1RZUEVdKTtcbiAgc3ltLl9rID0gdGFnO1xuICByZXR1cm4gc3ltO1xufTtcblxudmFyIGlzU3ltYm9sID0gVVNFX05BVElWRSAmJiB0eXBlb2YgJFN5bWJvbC5pdGVyYXRvciA9PSAnc3ltYm9sJyA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnO1xufSA6IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgaW5zdGFuY2VvZiAkU3ltYm9sO1xufTtcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KGl0LCBrZXksIEQpIHtcbiAgaWYgKGl0ID09PSBPYmplY3RQcm90bykgJGRlZmluZVByb3BlcnR5KE9QU3ltYm9scywga2V5LCBEKTtcbiAgYW5PYmplY3QoaXQpO1xuICBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpO1xuICBhbk9iamVjdChEKTtcbiAgaWYgKGhhcyhBbGxTeW1ib2xzLCBrZXkpKSB7XG4gICAgaWYgKCFELmVudW1lcmFibGUpIHtcbiAgICAgIGlmICghaGFzKGl0LCBISURERU4pKSBkUChpdCwgSElEREVOLCBjcmVhdGVEZXNjKDEsIHt9KSk7XG4gICAgICBpdFtISURERU5dW2tleV0gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSkgaXRbSElEREVOXVtrZXldID0gZmFsc2U7XG4gICAgICBEID0gX2NyZWF0ZShELCB7IGVudW1lcmFibGU6IGNyZWF0ZURlc2MoMCwgZmFsc2UpIH0pO1xuICAgIH0gcmV0dXJuIHNldFN5bWJvbERlc2MoaXQsIGtleSwgRCk7XG4gIH0gcmV0dXJuIGRQKGl0LCBrZXksIEQpO1xufTtcbnZhciAkZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoaXQsIFApIHtcbiAgYW5PYmplY3QoaXQpO1xuICB2YXIga2V5cyA9IGVudW1LZXlzKFAgPSB0b0lPYmplY3QoUCkpO1xuICB2YXIgaSA9IDA7XG4gIHZhciBsID0ga2V5cy5sZW5ndGg7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChsID4gaSkgJGRlZmluZVByb3BlcnR5KGl0LCBrZXkgPSBrZXlzW2krK10sIFBba2V5XSk7XG4gIHJldHVybiBpdDtcbn07XG52YXIgJGNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShpdCwgUCkge1xuICByZXR1cm4gUCA9PT0gdW5kZWZpbmVkID8gX2NyZWF0ZShpdCkgOiAkZGVmaW5lUHJvcGVydGllcyhfY3JlYXRlKGl0KSwgUCk7XG59O1xudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKGtleSkge1xuICB2YXIgRSA9IGlzRW51bS5jYWxsKHRoaXMsIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSkpO1xuICBpZiAodGhpcyA9PT0gT2JqZWN0UHJvdG8gJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhPUFN5bWJvbHMsIGtleSkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIEUgfHwgIWhhcyh0aGlzLCBrZXkpIHx8ICFoYXMoQWxsU3ltYm9scywga2V5KSB8fCBoYXModGhpcywgSElEREVOKSAmJiB0aGlzW0hJRERFTl1ba2V5XSA/IEUgOiB0cnVlO1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpIHtcbiAgaXQgPSB0b0lPYmplY3QoaXQpO1xuICBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpO1xuICBpZiAoaXQgPT09IE9iamVjdFByb3RvICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT1BTeW1ib2xzLCBrZXkpKSByZXR1cm47XG4gIHZhciBEID0gZ09QRChpdCwga2V5KTtcbiAgaWYgKEQgJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIShoYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKSkgRC5lbnVtZXJhYmxlID0gdHJ1ZTtcbiAgcmV0dXJuIEQ7XG59O1xudmFyICRnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCkge1xuICB2YXIgbmFtZXMgPSBnT1BOKHRvSU9iamVjdChpdCkpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBpID0gMDtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIHtcbiAgICBpZiAoIWhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSAmJiBrZXkgIT0gSElEREVOICYmIGtleSAhPSBNRVRBKSByZXN1bHQucHVzaChrZXkpO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xudmFyICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpIHtcbiAgdmFyIElTX09QID0gaXQgPT09IE9iamVjdFByb3RvO1xuICB2YXIgbmFtZXMgPSBnT1BOKElTX09QID8gT1BTeW1ib2xzIDogdG9JT2JqZWN0KGl0KSk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGkgPSAwO1xuICB2YXIga2V5O1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkge1xuICAgIGlmIChoYXMoQWxsU3ltYm9scywga2V5ID0gbmFtZXNbaSsrXSkgJiYgKElTX09QID8gaGFzKE9iamVjdFByb3RvLCBrZXkpIDogdHJ1ZSkpIHJlc3VsdC5wdXNoKEFsbFN5bWJvbHNba2V5XSk7XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIDE5LjQuMS4xIFN5bWJvbChbZGVzY3JpcHRpb25dKVxuaWYgKCFVU0VfTkFUSVZFKSB7XG4gICRTeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2woKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiAkU3ltYm9sKSB0aHJvdyBUeXBlRXJyb3IoJ1N5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciEnKTtcbiAgICB2YXIgdGFnID0gdWlkKGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTtcbiAgICB2YXIgJHNldCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgaWYgKHRoaXMgPT09IE9iamVjdFByb3RvKSAkc2V0LmNhbGwoT1BTeW1ib2xzLCB2YWx1ZSk7XG4gICAgICBpZiAoaGFzKHRoaXMsIEhJRERFTikgJiYgaGFzKHRoaXNbSElEREVOXSwgdGFnKSkgdGhpc1tISURERU5dW3RhZ10gPSBmYWxzZTtcbiAgICAgIHNldFN5bWJvbERlc2ModGhpcywgdGFnLCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG4gICAgfTtcbiAgICBpZiAoREVTQ1JJUFRPUlMgJiYgc2V0dGVyKSBzZXRTeW1ib2xEZXNjKE9iamVjdFByb3RvLCB0YWcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCBzZXQ6ICRzZXQgfSk7XG4gICAgcmV0dXJuIHdyYXAodGFnKTtcbiAgfTtcbiAgcmVkZWZpbmUoJFN5bWJvbFtQUk9UT1RZUEVdLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5faztcbiAgfSk7XG5cbiAgJEdPUEQuZiA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG4gICREUC5mID0gJGRlZmluZVByb3BlcnR5O1xuICByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmYgPSBnT1BORXh0LmYgPSAkZ2V0T3duUHJvcGVydHlOYW1lcztcbiAgcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpLmYgPSAkcHJvcGVydHlJc0VudW1lcmFibGU7XG4gICRHT1BTLmYgPSAkZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4gIGlmIChERVNDUklQVE9SUyAmJiAhcmVxdWlyZSgnLi9fbGlicmFyeScpKSB7XG4gICAgcmVkZWZpbmUoT2JqZWN0UHJvdG8sICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICRwcm9wZXJ0eUlzRW51bWVyYWJsZSwgdHJ1ZSk7XG4gIH1cblxuICB3a3NFeHQuZiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIHdyYXAod2tzKG5hbWUpKTtcbiAgfTtcbn1cblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgeyBTeW1ib2w6ICRTeW1ib2wgfSk7XG5cbmZvciAodmFyIGVzNlN5bWJvbHMgPSAoXG4gIC8vIDE5LjQuMi4yLCAxOS40LjIuMywgMTkuNC4yLjQsIDE5LjQuMi42LCAxOS40LjIuOCwgMTkuNC4yLjksIDE5LjQuMi4xMCwgMTkuNC4yLjExLCAxOS40LjIuMTIsIDE5LjQuMi4xMywgMTkuNC4yLjE0XG4gICdoYXNJbnN0YW5jZSxpc0NvbmNhdFNwcmVhZGFibGUsaXRlcmF0b3IsbWF0Y2gscmVwbGFjZSxzZWFyY2gsc3BlY2llcyxzcGxpdCx0b1ByaW1pdGl2ZSx0b1N0cmluZ1RhZyx1bnNjb3BhYmxlcydcbikuc3BsaXQoJywnKSwgaiA9IDA7IGVzNlN5bWJvbHMubGVuZ3RoID4gajspd2tzKGVzNlN5bWJvbHNbaisrXSk7XG5cbmZvciAodmFyIHdlbGxLbm93blN5bWJvbHMgPSAka2V5cyh3a3Muc3RvcmUpLCBrID0gMDsgd2VsbEtub3duU3ltYm9scy5sZW5ndGggPiBrOykgd2tzRGVmaW5lKHdlbGxLbm93blN5bWJvbHNbaysrXSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICdTeW1ib2wnLCB7XG4gIC8vIDE5LjQuMi4xIFN5bWJvbC5mb3Ioa2V5KVxuICAnZm9yJzogZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBoYXMoU3ltYm9sUmVnaXN0cnksIGtleSArPSAnJylcbiAgICAgID8gU3ltYm9sUmVnaXN0cnlba2V5XVxuICAgICAgOiBTeW1ib2xSZWdpc3RyeVtrZXldID0gJFN5bWJvbChrZXkpO1xuICB9LFxuICAvLyAxOS40LjIuNSBTeW1ib2wua2V5Rm9yKHN5bSlcbiAga2V5Rm9yOiBmdW5jdGlvbiBrZXlGb3Ioc3ltKSB7XG4gICAgaWYgKCFpc1N5bWJvbChzeW0pKSB0aHJvdyBUeXBlRXJyb3Ioc3ltICsgJyBpcyBub3QgYSBzeW1ib2whJyk7XG4gICAgZm9yICh2YXIga2V5IGluIFN5bWJvbFJlZ2lzdHJ5KSBpZiAoU3ltYm9sUmVnaXN0cnlba2V5XSA9PT0gc3ltKSByZXR1cm4ga2V5O1xuICB9LFxuICB1c2VTZXR0ZXI6IGZ1bmN0aW9uICgpIHsgc2V0dGVyID0gdHJ1ZTsgfSxcbiAgdXNlU2ltcGxlOiBmdW5jdGlvbiAoKSB7IHNldHRlciA9IGZhbHNlOyB9XG59KTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgJ09iamVjdCcsIHtcbiAgLy8gMTkuMS4yLjIgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxuICBjcmVhdGU6ICRjcmVhdGUsXG4gIC8vIDE5LjEuMi40IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKVxuICBkZWZpbmVQcm9wZXJ0eTogJGRlZmluZVByb3BlcnR5LFxuICAvLyAxOS4xLjIuMyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKVxuICBkZWZpbmVQcm9wZXJ0aWVzOiAkZGVmaW5lUHJvcGVydGllcyxcbiAgLy8gMTkuMS4yLjYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKVxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gIC8vIDE5LjEuMi43IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG4gIGdldE93blByb3BlcnR5TmFtZXM6ICRnZXRPd25Qcm9wZXJ0eU5hbWVzLFxuICAvLyAxOS4xLjIuOCBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKE8pXG4gIGdldE93blByb3BlcnR5U3ltYm9sczogJGdldE93blByb3BlcnR5U3ltYm9sc1xufSk7XG5cbi8vIENocm9tZSAzOCBhbmQgMzkgYE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHNgIGZhaWxzIG9uIHByaW1pdGl2ZXNcbi8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTM0NDNcbnZhciBGQUlMU19PTl9QUklNSVRJVkVTID0gJGZhaWxzKGZ1bmN0aW9uICgpIHsgJEdPUFMuZigxKTsgfSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogRkFJTFNfT05fUFJJTUlUSVZFUywgJ09iamVjdCcsIHtcbiAgZ2V0T3duUHJvcGVydHlTeW1ib2xzOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpIHtcbiAgICByZXR1cm4gJEdPUFMuZih0b09iamVjdChpdCkpO1xuICB9XG59KTtcblxuLy8gMjQuMy4yIEpTT04uc3RyaW5naWZ5KHZhbHVlIFssIHJlcGxhY2VyIFssIHNwYWNlXV0pXG4kSlNPTiAmJiAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICghVVNFX05BVElWRSB8fCAkZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgUyA9ICRTeW1ib2woKTtcbiAgLy8gTVMgRWRnZSBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMge31cbiAgLy8gV2ViS2l0IGNvbnZlcnRzIHN5bWJvbCB2YWx1ZXMgdG8gSlNPTiBhcyBudWxsXG4gIC8vIFY4IHRocm93cyBvbiBib3hlZCBzeW1ib2xzXG4gIHJldHVybiBfc3RyaW5naWZ5KFtTXSkgIT0gJ1tudWxsXScgfHwgX3N0cmluZ2lmeSh7IGE6IFMgfSkgIT0gJ3t9JyB8fCBfc3RyaW5naWZ5KE9iamVjdChTKSkgIT0gJ3t9Jztcbn0pKSwgJ0pTT04nLCB7XG4gIHN0cmluZ2lmeTogZnVuY3Rpb24gc3RyaW5naWZ5KGl0KSB7XG4gICAgdmFyIGFyZ3MgPSBbaXRdO1xuICAgIHZhciBpID0gMTtcbiAgICB2YXIgcmVwbGFjZXIsICRyZXBsYWNlcjtcbiAgICB3aGlsZSAoYXJndW1lbnRzLmxlbmd0aCA+IGkpIGFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG4gICAgJHJlcGxhY2VyID0gcmVwbGFjZXIgPSBhcmdzWzFdO1xuICAgIGlmICghaXNPYmplY3QocmVwbGFjZXIpICYmIGl0ID09PSB1bmRlZmluZWQgfHwgaXNTeW1ib2woaXQpKSByZXR1cm47IC8vIElFOCByZXR1cm5zIHN0cmluZyBvbiB1bmRlZmluZWRcbiAgICBpZiAoIWlzQXJyYXkocmVwbGFjZXIpKSByZXBsYWNlciA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mICRyZXBsYWNlciA9PSAnZnVuY3Rpb24nKSB2YWx1ZSA9ICRyZXBsYWNlci5jYWxsKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgaWYgKCFpc1N5bWJvbCh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIGFyZ3NbMV0gPSByZXBsYWNlcjtcbiAgICByZXR1cm4gX3N0cmluZ2lmeS5hcHBseSgkSlNPTiwgYXJncyk7XG4gIH1cbn0pO1xuXG4vLyAxOS40LjMuNCBTeW1ib2wucHJvdG90eXBlW0BAdG9QcmltaXRpdmVdKGhpbnQpXG4kU3ltYm9sW1BST1RPVFlQRV1bVE9fUFJJTUlUSVZFXSB8fCByZXF1aXJlKCcuL19oaWRlJykoJFN5bWJvbFtQUk9UT1RZUEVdLCBUT19QUklNSVRJVkUsICRTeW1ib2xbUFJPVE9UWVBFXS52YWx1ZU9mKTtcbi8vIDE5LjQuMy41IFN5bWJvbC5wcm90b3R5cGVbQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKCRTeW1ib2wsICdTeW1ib2wnKTtcbi8vIDIwLjIuMS45IE1hdGhbQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKE1hdGgsICdNYXRoJywgdHJ1ZSk7XG4vLyAyNC4zLjMgSlNPTltAQHRvU3RyaW5nVGFnXVxuc2V0VG9TdHJpbmdUYWcoZ2xvYmFsLkpTT04sICdKU09OJywgdHJ1ZSk7XG4iLCJyZXF1aXJlKCcuL193a3MtZGVmaW5lJykoJ2FzeW5jSXRlcmF0b3InKTtcbiIsInJlcXVpcmUoJy4vX3drcy1kZWZpbmUnKSgnb2JzZXJ2YWJsZScpO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYuc3ltYm9sJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNy5zeW1ib2wuYXN5bmMtaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM3LnN5bWJvbC5vYnNlcnZhYmxlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5TeW1ib2w7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vc3ltYm9sXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfaXRlcmF0b3IgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9zeW1ib2wvaXRlcmF0b3JcIik7XG5cbnZhciBfaXRlcmF0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXRlcmF0b3IpO1xuXG52YXIgX3N5bWJvbCA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL3N5bWJvbFwiKTtcblxudmFyIF9zeW1ib2wyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc3ltYm9sKTtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBfaXRlcmF0b3IyLmRlZmF1bHQgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBfc3ltYm9sMi5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBfc3ltYm9sMi5kZWZhdWx0ICYmIG9iaiAhPT0gX3N5bWJvbDIuZGVmYXVsdC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0gdHlwZW9mIF9zeW1ib2wyLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIiAmJiBfdHlwZW9mKF9pdGVyYXRvcjIuZGVmYXVsdCkgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2Yob2JqKTtcbn0gOiBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBvYmogJiYgdHlwZW9mIF9zeW1ib2wyLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IF9zeW1ib2wyLmRlZmF1bHQgJiYgb2JqICE9PSBfc3ltYm9sMi5kZWZhdWx0LnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2Yob2JqKTtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfdHlwZW9mMiA9IHJlcXVpcmUoXCIuLi9oZWxwZXJzL3R5cGVvZlwiKTtcblxudmFyIF90eXBlb2YzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdHlwZW9mMik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uIChzZWxmLCBjYWxsKSB7XG4gIGlmICghc2VsZikge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBjYWxsICYmICgodHlwZW9mIGNhbGwgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogKDAsIF90eXBlb2YzLmRlZmF1bHQpKGNhbGwpKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmO1xufTsiLCIvLyBXb3JrcyB3aXRoIF9fcHJvdG9fXyBvbmx5LiBPbGQgdjggY2FuJ3Qgd29yayB3aXRoIG51bGwgcHJvdG8gb2JqZWN0cy5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGNoZWNrID0gZnVuY3Rpb24gKE8sIHByb3RvKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBpZiAoIWlzT2JqZWN0KHByb3RvKSAmJiBwcm90byAhPT0gbnVsbCkgdGhyb3cgVHlwZUVycm9yKHByb3RvICsgXCI6IGNhbid0IHNldCBhcyBwcm90b3R5cGUhXCIpO1xufTtcbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgZnVuY3Rpb24gKHRlc3QsIGJ1Z2d5LCBzZXQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNldCA9IHJlcXVpcmUoJy4vX2N0eCcpKEZ1bmN0aW9uLmNhbGwsIHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZihPYmplY3QucHJvdG90eXBlLCAnX19wcm90b19fJykuc2V0LCAyKTtcbiAgICAgICAgc2V0KHRlc3QsIFtdKTtcbiAgICAgICAgYnVnZ3kgPSAhKHRlc3QgaW5zdGFuY2VvZiBBcnJheSk7XG4gICAgICB9IGNhdGNoIChlKSB7IGJ1Z2d5ID0gdHJ1ZTsgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKSB7XG4gICAgICAgIGNoZWNrKE8sIHByb3RvKTtcbiAgICAgICAgaWYgKGJ1Z2d5KSBPLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgICAgICBlbHNlIHNldChPLCBwcm90byk7XG4gICAgICAgIHJldHVybiBPO1xuICAgICAgfTtcbiAgICB9KHt9LCBmYWxzZSkgOiB1bmRlZmluZWQpLFxuICBjaGVjazogY2hlY2tcbn07XG4iLCIvLyAxOS4xLjMuMTkgT2JqZWN0LnNldFByb3RvdHlwZU9mKE8sIHByb3RvKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0JywgeyBzZXRQcm90b3R5cGVPZjogcmVxdWlyZSgnLi9fc2V0LXByb3RvJykuc2V0IH0pO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LnNldC1wcm90b3R5cGUtb2YnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdC5zZXRQcm90b3R5cGVPZjtcbiIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3Qvc2V0LXByb3RvdHlwZS1vZlwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4vLyAxOS4xLjIuMiAvIDE1LjIuMy41IE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0JywgeyBjcmVhdGU6IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKSB9KTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5jcmVhdGUnKTtcbnZhciAkT2JqZWN0ID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdDtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY3JlYXRlKFAsIEQpIHtcbiAgcmV0dXJuICRPYmplY3QuY3JlYXRlKFAsIEQpO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvY3JlYXRlXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9vYmplY3Qvc2V0LXByb3RvdHlwZS1vZlwiKTtcblxudmFyIF9zZXRQcm90b3R5cGVPZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zZXRQcm90b3R5cGVPZik7XG5cbnZhciBfY3JlYXRlID0gcmVxdWlyZShcIi4uL2NvcmUtanMvb2JqZWN0L2NyZWF0ZVwiKTtcblxudmFyIF9jcmVhdGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlKTtcblxudmFyIF90eXBlb2YyID0gcmVxdWlyZShcIi4uL2hlbHBlcnMvdHlwZW9mXCIpO1xuXG52YXIgX3R5cGVvZjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF90eXBlb2YyKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArICh0eXBlb2Ygc3VwZXJDbGFzcyA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiAoMCwgX3R5cGVvZjMuZGVmYXVsdCkoc3VwZXJDbGFzcykpKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9ICgwLCBfY3JlYXRlMi5kZWZhdWx0KShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiBzdWJDbGFzcyxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pO1xuICBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mMi5kZWZhdWx0ID8gKDAsIF9zZXRQcm90b3R5cGVPZjIuZGVmYXVsdCkoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzcztcbn07IiwiaW1wb3J0IGFkZERPTUV2ZW50TGlzdGVuZXIgZnJvbSAnYWRkLWRvbS1ldmVudC1saXN0ZW5lcic7XG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXJXcmFwKHRhcmdldCwgZXZlbnRUeXBlLCBjYiwgb3B0aW9uKSB7XG4gIC8qIGVzbGludCBjYW1lbGNhc2U6IDIgKi9cbiAgdmFyIGNhbGxiYWNrID0gUmVhY3RET00udW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMgPyBmdW5jdGlvbiBydW4oZSkge1xuICAgIFJlYWN0RE9NLnVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzKGNiLCBlKTtcbiAgfSA6IGNiO1xuICByZXR1cm4gYWRkRE9NRXZlbnRMaXN0ZW5lcih0YXJnZXQsIGV2ZW50VHlwZSwgY2FsbGJhY2ssIG9wdGlvbik7XG59IiwiaW1wb3J0IGNvbnRhaW5zIGZyb20gJ3JjLXV0aWwvZXMvRG9tL2NvbnRhaW5zJztcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1ZmZlcihmbiwgbXMpIHtcbiAgdmFyIHRpbWVyID0gdm9pZCAwO1xuXG4gIGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgIGlmICh0aW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIHRpbWVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBidWZmZXJGbigpIHtcbiAgICBjbGVhcigpO1xuICAgIHRpbWVyID0gc2V0VGltZW91dChmbiwgbXMpO1xuICB9XG5cbiAgYnVmZmVyRm4uY2xlYXIgPSBjbGVhcjtcblxuICByZXR1cm4gYnVmZmVyRm47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1NhbWVQb2ludChwcmV2LCBuZXh0KSB7XG4gIGlmIChwcmV2ID09PSBuZXh0KSByZXR1cm4gdHJ1ZTtcbiAgaWYgKCFwcmV2IHx8ICFuZXh0KSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKCdwYWdlWCcgaW4gbmV4dCAmJiAncGFnZVknIGluIG5leHQpIHtcbiAgICByZXR1cm4gcHJldi5wYWdlWCA9PT0gbmV4dC5wYWdlWCAmJiBwcmV2LnBhZ2VZID09PSBuZXh0LnBhZ2VZO1xuICB9XG5cbiAgaWYgKCdjbGllbnRYJyBpbiBuZXh0ICYmICdjbGllbnRZJyBpbiBuZXh0KSB7XG4gICAgcmV0dXJuIHByZXYuY2xpZW50WCA9PT0gbmV4dC5jbGllbnRYICYmIHByZXYuY2xpZW50WSA9PT0gbmV4dC5jbGllbnRZO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNXaW5kb3cob2JqKSB7XG4gIHJldHVybiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqLndpbmRvdyA9PT0gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTaW1pbGFyVmFsdWUodmFsMSwgdmFsMikge1xuICB2YXIgaW50MSA9IE1hdGguZmxvb3IodmFsMSk7XG4gIHZhciBpbnQyID0gTWF0aC5mbG9vcih2YWwyKTtcbiAgcmV0dXJuIE1hdGguYWJzKGludDEgLSBpbnQyKSA8PSAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzdG9yZUZvY3VzKGFjdGl2ZUVsZW1lbnQsIGNvbnRhaW5lcikge1xuICAvLyBGb2N1cyBiYWNrIGlmIGlzIGluIHRoZSBjb250YWluZXJcbiAgaWYgKGFjdGl2ZUVsZW1lbnQgIT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgY29udGFpbnMoY29udGFpbmVyLCBhY3RpdmVFbGVtZW50KSkge1xuICAgIGFjdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxufSIsImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSAnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJztcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSAnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzJztcbmltcG9ydCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiBmcm9tICdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybic7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cyc7XG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IHsgYWxpZ25FbGVtZW50LCBhbGlnblBvaW50IH0gZnJvbSAnZG9tLWFsaWduJztcbmltcG9ydCBhZGRFdmVudExpc3RlbmVyIGZyb20gJ3JjLXV0aWwvZXMvRG9tL2FkZEV2ZW50TGlzdGVuZXInO1xuXG5pbXBvcnQgeyBpc1dpbmRvdywgYnVmZmVyLCBpc1NhbWVQb2ludCwgaXNTaW1pbGFyVmFsdWUsIHJlc3RvcmVGb2N1cyB9IGZyb20gJy4vdXRpbCc7XG5cbmZ1bmN0aW9uIGdldEVsZW1lbnQoZnVuYykge1xuICBpZiAodHlwZW9mIGZ1bmMgIT09ICdmdW5jdGlvbicgfHwgIWZ1bmMpIHJldHVybiBudWxsO1xuICByZXR1cm4gZnVuYygpO1xufVxuXG5mdW5jdGlvbiBnZXRQb2ludChwb2ludCkge1xuICBpZiAodHlwZW9mIHBvaW50ICE9PSAnb2JqZWN0JyB8fCAhcG9pbnQpIHJldHVybiBudWxsO1xuICByZXR1cm4gcG9pbnQ7XG59XG5cbnZhciBBbGlnbiA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhBbGlnbiwgX0NvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQWxpZ24oKSB7XG4gICAgdmFyIF9yZWY7XG5cbiAgICB2YXIgX3RlbXAsIF90aGlzLCBfcmV0O1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEFsaWduKTtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHJldHVybiBfcmV0ID0gKF90ZW1wID0gKF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKF9yZWYgPSBBbGlnbi5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKEFsaWduKSkuY2FsbC5hcHBseShfcmVmLCBbdGhpc10uY29uY2F0KGFyZ3MpKSksIF90aGlzKSwgX3RoaXMuZm9yY2VBbGlnbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGRpc2FibGVkID0gX3RoaXMkcHJvcHMuZGlzYWJsZWQsXG4gICAgICAgICAgdGFyZ2V0ID0gX3RoaXMkcHJvcHMudGFyZ2V0LFxuICAgICAgICAgIGFsaWduID0gX3RoaXMkcHJvcHMuYWxpZ24sXG4gICAgICAgICAgb25BbGlnbiA9IF90aGlzJHByb3BzLm9uQWxpZ247XG5cbiAgICAgIGlmICghZGlzYWJsZWQgJiYgdGFyZ2V0KSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBSZWFjdERPTS5maW5kRE9NTm9kZShfdGhpcyk7XG5cbiAgICAgICAgdmFyIHJlc3VsdCA9IHZvaWQgMDtcbiAgICAgICAgdmFyIGVsZW1lbnQgPSBnZXRFbGVtZW50KHRhcmdldCk7XG4gICAgICAgIHZhciBwb2ludCA9IGdldFBvaW50KHRhcmdldCk7XG5cbiAgICAgICAgLy8gSUUgbG9zZSBmb2N1cyBhZnRlciBlbGVtZW50IHJlYWxpZ25cbiAgICAgICAgLy8gV2Ugc2hvdWxkIHJlY29yZCBhY3RpdmVFbGVtZW50IGFuZCByZXN0b3JlIGxhdGVyXG4gICAgICAgIHZhciBhY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblxuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgIHJlc3VsdCA9IGFsaWduRWxlbWVudChzb3VyY2UsIGVsZW1lbnQsIGFsaWduKTtcbiAgICAgICAgfSBlbHNlIGlmIChwb2ludCkge1xuICAgICAgICAgIHJlc3VsdCA9IGFsaWduUG9pbnQoc291cmNlLCBwb2ludCwgYWxpZ24pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdG9yZUZvY3VzKGFjdGl2ZUVsZW1lbnQsIHNvdXJjZSk7XG5cbiAgICAgICAgaWYgKG9uQWxpZ24pIHtcbiAgICAgICAgICBvbkFsaWduKHNvdXJjZSwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF90ZW1wKSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsIF9yZXQpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEFsaWduLCBbe1xuICAgIGtleTogJ2NvbXBvbmVudERpZE1vdW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgLy8gaWYgcGFyZW50IHJlZiBub3QgYXR0YWNoZWQgLi4uLiB1c2UgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWRcbiAgICAgIHRoaXMuZm9yY2VBbGlnbigpO1xuICAgICAgaWYgKCFwcm9wcy5kaXNhYmxlZCAmJiBwcm9wcy5tb25pdG9yV2luZG93UmVzaXplKSB7XG4gICAgICAgIHRoaXMuc3RhcnRNb25pdG9yV2luZG93UmVzaXplKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnY29tcG9uZW50RGlkVXBkYXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgICAgdmFyIHJlQWxpZ24gPSBmYWxzZTtcbiAgICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG5cbiAgICAgIGlmICghcHJvcHMuZGlzYWJsZWQpIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IFJlYWN0RE9NLmZpbmRET01Ob2RlKHRoaXMpO1xuICAgICAgICB2YXIgc291cmNlUmVjdCA9IHNvdXJjZSA/IHNvdXJjZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6IG51bGw7XG5cbiAgICAgICAgaWYgKHByZXZQcm9wcy5kaXNhYmxlZCkge1xuICAgICAgICAgIHJlQWxpZ24gPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBsYXN0RWxlbWVudCA9IGdldEVsZW1lbnQocHJldlByb3BzLnRhcmdldCk7XG4gICAgICAgICAgdmFyIGN1cnJlbnRFbGVtZW50ID0gZ2V0RWxlbWVudChwcm9wcy50YXJnZXQpO1xuICAgICAgICAgIHZhciBsYXN0UG9pbnQgPSBnZXRQb2ludChwcmV2UHJvcHMudGFyZ2V0KTtcbiAgICAgICAgICB2YXIgY3VycmVudFBvaW50ID0gZ2V0UG9pbnQocHJvcHMudGFyZ2V0KTtcblxuICAgICAgICAgIGlmIChpc1dpbmRvdyhsYXN0RWxlbWVudCkgJiYgaXNXaW5kb3coY3VycmVudEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAvLyBTa2lwIGlmIGlzIHdpbmRvd1xuICAgICAgICAgICAgcmVBbGlnbiA9IGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSBpZiAobGFzdEVsZW1lbnQgIT09IGN1cnJlbnRFbGVtZW50IHx8IC8vIEVsZW1lbnQgY2hhbmdlXG4gICAgICAgICAgbGFzdEVsZW1lbnQgJiYgIWN1cnJlbnRFbGVtZW50ICYmIGN1cnJlbnRQb2ludCB8fCAvLyBDaGFuZ2UgZnJvbSBlbGVtZW50IHRvIHBvaW50XG4gICAgICAgICAgbGFzdFBvaW50ICYmIGN1cnJlbnRQb2ludCAmJiBjdXJyZW50RWxlbWVudCB8fCAvLyBDaGFuZ2UgZnJvbSBwb2ludCB0byBlbGVtZW50XG4gICAgICAgICAgY3VycmVudFBvaW50ICYmICFpc1NhbWVQb2ludChsYXN0UG9pbnQsIGN1cnJlbnRQb2ludCkpIHtcbiAgICAgICAgICAgIHJlQWxpZ24gPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElmIHNvdXJjZSBlbGVtZW50IHNpemUgY2hhbmdlZFxuICAgICAgICAgIHZhciBwcmVSZWN0ID0gdGhpcy5zb3VyY2VSZWN0IHx8IHt9O1xuICAgICAgICAgIGlmICghcmVBbGlnbiAmJiBzb3VyY2UgJiYgKCFpc1NpbWlsYXJWYWx1ZShwcmVSZWN0LndpZHRoLCBzb3VyY2VSZWN0LndpZHRoKSB8fCAhaXNTaW1pbGFyVmFsdWUocHJlUmVjdC5oZWlnaHQsIHNvdXJjZVJlY3QuaGVpZ2h0KSkpIHtcbiAgICAgICAgICAgIHJlQWxpZ24gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc291cmNlUmVjdCA9IHNvdXJjZVJlY3Q7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZUFsaWduKSB7XG4gICAgICAgIHRoaXMuZm9yY2VBbGlnbigpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvcHMubW9uaXRvcldpbmRvd1Jlc2l6ZSAmJiAhcHJvcHMuZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5zdGFydE1vbml0b3JXaW5kb3dSZXNpemUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3RvcE1vbml0b3JXaW5kb3dSZXNpemUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjb21wb25lbnRXaWxsVW5tb3VudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgdGhpcy5zdG9wTW9uaXRvcldpbmRvd1Jlc2l6ZSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3N0YXJ0TW9uaXRvcldpbmRvd1Jlc2l6ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0YXJ0TW9uaXRvcldpbmRvd1Jlc2l6ZSgpIHtcbiAgICAgIGlmICghdGhpcy5yZXNpemVIYW5kbGVyKSB7XG4gICAgICAgIHRoaXMuYnVmZmVyTW9uaXRvciA9IGJ1ZmZlcih0aGlzLmZvcmNlQWxpZ24sIHRoaXMucHJvcHMubW9uaXRvckJ1ZmZlclRpbWUpO1xuICAgICAgICB0aGlzLnJlc2l6ZUhhbmRsZXIgPSBhZGRFdmVudExpc3RlbmVyKHdpbmRvdywgJ3Jlc2l6ZScsIHRoaXMuYnVmZmVyTW9uaXRvcik7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnc3RvcE1vbml0b3JXaW5kb3dSZXNpemUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdG9wTW9uaXRvcldpbmRvd1Jlc2l6ZSgpIHtcbiAgICAgIGlmICh0aGlzLnJlc2l6ZUhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5idWZmZXJNb25pdG9yLmNsZWFyKCk7XG4gICAgICAgIHRoaXMucmVzaXplSGFuZGxlci5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5yZXNpemVIYW5kbGVyID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdyZW5kZXInLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgY2hpbGRyZW5Qcm9wcyA9IF9wcm9wcy5jaGlsZHJlblByb3BzLFxuICAgICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuO1xuXG4gICAgICB2YXIgY2hpbGQgPSBSZWFjdC5DaGlsZHJlbi5vbmx5KGNoaWxkcmVuKTtcbiAgICAgIGlmIChjaGlsZHJlblByb3BzKSB7XG4gICAgICAgIHZhciBuZXdQcm9wcyA9IHt9O1xuICAgICAgICB2YXIgcHJvcExpc3QgPSBPYmplY3Qua2V5cyhjaGlsZHJlblByb3BzKTtcbiAgICAgICAgcHJvcExpc3QuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAgIG5ld1Byb3BzW3Byb3BdID0gX3RoaXMyLnByb3BzW2NoaWxkcmVuUHJvcHNbcHJvcF1dO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkLCBuZXdQcm9wcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEFsaWduO1xufShDb21wb25lbnQpO1xuXG5BbGlnbi5wcm9wVHlwZXMgPSB7XG4gIGNoaWxkcmVuUHJvcHM6IFByb3BUeXBlcy5vYmplY3QsXG4gIGFsaWduOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gIHRhcmdldDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmZ1bmMsIFByb3BUeXBlcy5zaGFwZSh7XG4gICAgY2xpZW50WDogUHJvcFR5cGVzLm51bWJlcixcbiAgICBjbGllbnRZOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIHBhZ2VYOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIHBhZ2VZOiBQcm9wVHlwZXMubnVtYmVyXG4gIH0pXSksXG4gIG9uQWxpZ246IFByb3BUeXBlcy5mdW5jLFxuICBtb25pdG9yQnVmZmVyVGltZTogUHJvcFR5cGVzLm51bWJlcixcbiAgbW9uaXRvcldpbmRvd1Jlc2l6ZTogUHJvcFR5cGVzLmJvb2wsXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5hbnlcbn07XG5BbGlnbi5kZWZhdWx0UHJvcHMgPSB7XG4gIHRhcmdldDogZnVuY3Rpb24gdGFyZ2V0KCkge1xuICAgIHJldHVybiB3aW5kb3c7XG4gIH0sXG4gIG1vbml0b3JCdWZmZXJUaW1lOiA1MCxcbiAgbW9uaXRvcldpbmRvd1Jlc2l6ZTogZmFsc2UsXG4gIGRpc2FibGVkOiBmYWxzZVxufTtcblxuXG5leHBvcnQgZGVmYXVsdCBBbGlnbjsiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGVmaW5lUHJvcGVydHkpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufTsiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG52YXIgdW5zYWZlTGlmZWN5Y2xlc1BvbHlmaWxsID0gZnVuY3Rpb24gdW5zYWZlTGlmZWN5Y2xlc1BvbHlmaWxsKENvbXBvbmVudCkge1xuICB2YXIgcHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcblxuICBpZiAoIXByb3RvdHlwZSB8fCAhcHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBvbmx5IHBvbHlmaWxsIGNsYXNzIGNvbXBvbmVudHMnKTtcbiAgfSAvLyBvbmx5IGhhbmRsZSBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzXG5cblxuICBpZiAodHlwZW9mIHByb3RvdHlwZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIENvbXBvbmVudDtcbiAgfSAvLyBJbiBSZWFjdCAxNi45LCBSZWFjdC5Qcm9maWxlciB3YXMgaW50cm9kdWNlZCB0b2dldGhlciB3aXRoIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzXG4gIC8vIGh0dHBzOi8vcmVhY3Rqcy5vcmcvYmxvZy8yMDE5LzA4LzA4L3JlYWN0LXYxNi45LjAuaHRtbCNwZXJmb3JtYW5jZS1tZWFzdXJlbWVudHMtd2l0aC1yZWFjdHByb2ZpbGVyXG5cblxuICBpZiAoIVJlYWN0LlByb2ZpbGVyKSB7XG4gICAgcmV0dXJuIENvbXBvbmVudDtcbiAgfSAvLyBIZXJlIHBvbHlmaWxsIGdldCBzdGFydGVkXG5cblxuICBwcm90b3R5cGUuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPSBwcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcztcbiAgZGVsZXRlIHByb3RvdHlwZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzO1xuICByZXR1cm4gQ29tcG9uZW50O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgdW5zYWZlTGlmZWN5Y2xlc1BvbHlmaWxsOyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0FycmF5Q2hpbGRyZW4oY2hpbGRyZW4pIHtcbiAgdmFyIHJldCA9IFtdO1xuICBSZWFjdC5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXQucHVzaChjaGlsZCk7XG4gIH0pO1xuICByZXR1cm4gcmV0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZENoaWxkSW5DaGlsZHJlbkJ5S2V5KGNoaWxkcmVuLCBrZXkpIHtcbiAgdmFyIHJldCA9IG51bGw7XG4gIGlmIChjaGlsZHJlbikge1xuICAgIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICBpZiAocmV0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjaGlsZCAmJiBjaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICByZXQgPSBjaGlsZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFNob3duQ2hpbGRJbkNoaWxkcmVuQnlLZXkoY2hpbGRyZW4sIGtleSwgc2hvd1Byb3ApIHtcbiAgdmFyIHJldCA9IG51bGw7XG4gIGlmIChjaGlsZHJlbikge1xuICAgIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICBpZiAoY2hpbGQgJiYgY2hpbGQua2V5ID09PSBrZXkgJiYgY2hpbGQucHJvcHNbc2hvd1Byb3BdKSB7XG4gICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R3byBjaGlsZCB3aXRoIHNhbWUga2V5IGZvciA8cmMtYW5pbWF0ZT4gY2hpbGRyZW4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXQgPSBjaGlsZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZEhpZGRlbkNoaWxkSW5DaGlsZHJlbkJ5S2V5KGNoaWxkcmVuLCBrZXksIHNob3dQcm9wKSB7XG4gIHZhciBmb3VuZCA9IDA7XG4gIGlmIChjaGlsZHJlbikge1xuICAgIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm91bmQgPSBjaGlsZCAmJiBjaGlsZC5rZXkgPT09IGtleSAmJiAhY2hpbGQucHJvcHNbc2hvd1Byb3BdO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBmb3VuZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2FtZUNoaWxkcmVuKGMxLCBjMiwgc2hvd1Byb3ApIHtcbiAgdmFyIHNhbWUgPSBjMS5sZW5ndGggPT09IGMyLmxlbmd0aDtcbiAgaWYgKHNhbWUpIHtcbiAgICBjMS5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCwgaW5kZXgpIHtcbiAgICAgIHZhciBjaGlsZDIgPSBjMltpbmRleF07XG4gICAgICBpZiAoY2hpbGQgJiYgY2hpbGQyKSB7XG4gICAgICAgIGlmIChjaGlsZCAmJiAhY2hpbGQyIHx8ICFjaGlsZCAmJiBjaGlsZDIpIHtcbiAgICAgICAgICBzYW1lID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hpbGQua2V5ICE9PSBjaGlsZDIua2V5KSB7XG4gICAgICAgICAgc2FtZSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKHNob3dQcm9wICYmIGNoaWxkLnByb3BzW3Nob3dQcm9wXSAhPT0gY2hpbGQyLnByb3BzW3Nob3dQcm9wXSkge1xuICAgICAgICAgIHNhbWUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBzYW1lO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VDaGlsZHJlbihwcmV2LCBuZXh0KSB7XG4gIHZhciByZXQgPSBbXTtcblxuICAvLyBGb3IgZWFjaCBrZXkgb2YgYG5leHRgLCB0aGUgbGlzdCBvZiBrZXlzIHRvIGluc2VydCBiZWZvcmUgdGhhdCBrZXkgaW5cbiAgLy8gdGhlIGNvbWJpbmVkIGxpc3RcbiAgdmFyIG5leHRDaGlsZHJlblBlbmRpbmcgPSB7fTtcbiAgdmFyIHBlbmRpbmdDaGlsZHJlbiA9IFtdO1xuICBwcmV2LmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgaWYgKGNoaWxkICYmIGZpbmRDaGlsZEluQ2hpbGRyZW5CeUtleShuZXh0LCBjaGlsZC5rZXkpKSB7XG4gICAgICBpZiAocGVuZGluZ0NoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICBuZXh0Q2hpbGRyZW5QZW5kaW5nW2NoaWxkLmtleV0gPSBwZW5kaW5nQ2hpbGRyZW47XG4gICAgICAgIHBlbmRpbmdDaGlsZHJlbiA9IFtdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZW5kaW5nQ2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgfVxuICB9KTtcblxuICBuZXh0LmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgaWYgKGNoaWxkICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuZXh0Q2hpbGRyZW5QZW5kaW5nLCBjaGlsZC5rZXkpKSB7XG4gICAgICByZXQgPSByZXQuY29uY2F0KG5leHRDaGlsZHJlblBlbmRpbmdbY2hpbGQua2V5XSk7XG4gICAgfVxuICAgIHJldC5wdXNoKGNoaWxkKTtcbiAgfSk7XG5cbiAgcmV0ID0gcmV0LmNvbmNhdChwZW5kaW5nQ2hpbGRyZW4pO1xuXG4gIHJldHVybiByZXQ7XG59IiwidmFyIFNUQVJUX0VWRU5UX05BTUVfTUFQID0ge1xuICB0cmFuc2l0aW9uc3RhcnQ6IHtcbiAgICB0cmFuc2l0aW9uOiAndHJhbnNpdGlvbnN0YXJ0JyxcbiAgICBXZWJraXRUcmFuc2l0aW9uOiAnd2Via2l0VHJhbnNpdGlvblN0YXJ0JyxcbiAgICBNb3pUcmFuc2l0aW9uOiAnbW96VHJhbnNpdGlvblN0YXJ0JyxcbiAgICBPVHJhbnNpdGlvbjogJ29UcmFuc2l0aW9uU3RhcnQnLFxuICAgIG1zVHJhbnNpdGlvbjogJ01TVHJhbnNpdGlvblN0YXJ0J1xuICB9LFxuXG4gIGFuaW1hdGlvbnN0YXJ0OiB7XG4gICAgYW5pbWF0aW9uOiAnYW5pbWF0aW9uc3RhcnQnLFxuICAgIFdlYmtpdEFuaW1hdGlvbjogJ3dlYmtpdEFuaW1hdGlvblN0YXJ0JyxcbiAgICBNb3pBbmltYXRpb246ICdtb3pBbmltYXRpb25TdGFydCcsXG4gICAgT0FuaW1hdGlvbjogJ29BbmltYXRpb25TdGFydCcsXG4gICAgbXNBbmltYXRpb246ICdNU0FuaW1hdGlvblN0YXJ0J1xuICB9XG59O1xuXG52YXIgRU5EX0VWRU5UX05BTUVfTUFQID0ge1xuICB0cmFuc2l0aW9uZW5kOiB7XG4gICAgdHJhbnNpdGlvbjogJ3RyYW5zaXRpb25lbmQnLFxuICAgIFdlYmtpdFRyYW5zaXRpb246ICd3ZWJraXRUcmFuc2l0aW9uRW5kJyxcbiAgICBNb3pUcmFuc2l0aW9uOiAnbW96VHJhbnNpdGlvbkVuZCcsXG4gICAgT1RyYW5zaXRpb246ICdvVHJhbnNpdGlvbkVuZCcsXG4gICAgbXNUcmFuc2l0aW9uOiAnTVNUcmFuc2l0aW9uRW5kJ1xuICB9LFxuXG4gIGFuaW1hdGlvbmVuZDoge1xuICAgIGFuaW1hdGlvbjogJ2FuaW1hdGlvbmVuZCcsXG4gICAgV2Via2l0QW5pbWF0aW9uOiAnd2Via2l0QW5pbWF0aW9uRW5kJyxcbiAgICBNb3pBbmltYXRpb246ICdtb3pBbmltYXRpb25FbmQnLFxuICAgIE9BbmltYXRpb246ICdvQW5pbWF0aW9uRW5kJyxcbiAgICBtc0FuaW1hdGlvbjogJ01TQW5pbWF0aW9uRW5kJ1xuICB9XG59O1xuXG52YXIgc3RhcnRFdmVudHMgPSBbXTtcbnZhciBlbmRFdmVudHMgPSBbXTtcblxuZnVuY3Rpb24gZGV0ZWN0RXZlbnRzKCkge1xuICB2YXIgdGVzdEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHZhciBzdHlsZSA9IHRlc3RFbC5zdHlsZTtcblxuICBpZiAoISgnQW5pbWF0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgU1RBUlRfRVZFTlRfTkFNRV9NQVAuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uO1xuICAgIGRlbGV0ZSBFTkRfRVZFTlRfTkFNRV9NQVAuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbjtcbiAgfVxuXG4gIGlmICghKCdUcmFuc2l0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgU1RBUlRfRVZFTlRfTkFNRV9NQVAudHJhbnNpdGlvbnN0YXJ0LnRyYW5zaXRpb247XG4gICAgZGVsZXRlIEVORF9FVkVOVF9OQU1FX01BUC50cmFuc2l0aW9uZW5kLnRyYW5zaXRpb247XG4gIH1cblxuICBmdW5jdGlvbiBwcm9jZXNzKEVWRU5UX05BTUVfTUFQLCBldmVudHMpIHtcbiAgICBmb3IgKHZhciBiYXNlRXZlbnROYW1lIGluIEVWRU5UX05BTUVfTUFQKSB7XG4gICAgICBpZiAoRVZFTlRfTkFNRV9NQVAuaGFzT3duUHJvcGVydHkoYmFzZUV2ZW50TmFtZSkpIHtcbiAgICAgICAgdmFyIGJhc2VFdmVudHMgPSBFVkVOVF9OQU1FX01BUFtiYXNlRXZlbnROYW1lXTtcbiAgICAgICAgZm9yICh2YXIgc3R5bGVOYW1lIGluIGJhc2VFdmVudHMpIHtcbiAgICAgICAgICBpZiAoc3R5bGVOYW1lIGluIHN0eWxlKSB7XG4gICAgICAgICAgICBldmVudHMucHVzaChiYXNlRXZlbnRzW3N0eWxlTmFtZV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvY2VzcyhTVEFSVF9FVkVOVF9OQU1FX01BUCwgc3RhcnRFdmVudHMpO1xuICBwcm9jZXNzKEVORF9FVkVOVF9OQU1FX01BUCwgZW5kRXZlbnRzKTtcbn1cblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgZGV0ZWN0RXZlbnRzKCk7XG59XG5cbmZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIobm9kZSwgZXZlbnROYW1lLCBldmVudExpc3RlbmVyKSB7XG4gIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGV2ZW50TGlzdGVuZXIsIGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGV2ZW50TGlzdGVuZXIpIHtcbiAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRMaXN0ZW5lciwgZmFsc2UpO1xufVxuXG52YXIgVHJhbnNpdGlvbkV2ZW50cyA9IHtcbiAgLy8gU3RhcnQgZXZlbnRzXG4gIHN0YXJ0RXZlbnRzOiBzdGFydEV2ZW50cyxcblxuICBhZGRTdGFydEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIGFkZFN0YXJ0RXZlbnRMaXN0ZW5lcihub2RlLCBldmVudExpc3RlbmVyKSB7XG4gICAgaWYgKHN0YXJ0RXZlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgd2luZG93LnNldFRpbWVvdXQoZXZlbnRMaXN0ZW5lciwgMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN0YXJ0RXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKHN0YXJ0RXZlbnQpIHtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIobm9kZSwgc3RhcnRFdmVudCwgZXZlbnRMaXN0ZW5lcik7XG4gICAgfSk7XG4gIH0sXG4gIHJlbW92ZVN0YXJ0RXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gcmVtb3ZlU3RhcnRFdmVudExpc3RlbmVyKG5vZGUsIGV2ZW50TGlzdGVuZXIpIHtcbiAgICBpZiAoc3RhcnRFdmVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN0YXJ0RXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKHN0YXJ0RXZlbnQpIHtcbiAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIobm9kZSwgc3RhcnRFdmVudCwgZXZlbnRMaXN0ZW5lcik7XG4gICAgfSk7XG4gIH0sXG5cblxuICAvLyBFbmQgZXZlbnRzXG4gIGVuZEV2ZW50czogZW5kRXZlbnRzLFxuXG4gIGFkZEVuZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIGFkZEVuZEV2ZW50TGlzdGVuZXIobm9kZSwgZXZlbnRMaXN0ZW5lcikge1xuICAgIGlmIChlbmRFdmVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB3aW5kb3cuc2V0VGltZW91dChldmVudExpc3RlbmVyLCAwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZW5kRXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGVuZEV2ZW50KSB7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKG5vZGUsIGVuZEV2ZW50LCBldmVudExpc3RlbmVyKTtcbiAgICB9KTtcbiAgfSxcbiAgcmVtb3ZlRW5kRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gcmVtb3ZlRW5kRXZlbnRMaXN0ZW5lcihub2RlLCBldmVudExpc3RlbmVyKSB7XG4gICAgaWYgKGVuZEV2ZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZW5kRXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGVuZEV2ZW50KSB7XG4gICAgICByZW1vdmVFdmVudExpc3RlbmVyKG5vZGUsIGVuZEV2ZW50LCBldmVudExpc3RlbmVyKTtcbiAgICB9KTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgVHJhbnNpdGlvbkV2ZW50czsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGFyciwgb2JqKXtcbiAgaWYgKGFyci5pbmRleE9mKSByZXR1cm4gYXJyLmluZGV4T2Yob2JqKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoYXJyW2ldID09PSBvYmopIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn07IiwiLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbnRyeSB7XG4gIHZhciBpbmRleCA9IHJlcXVpcmUoJ2luZGV4b2YnKTtcbn0gY2F0Y2ggKGVycikge1xuICB2YXIgaW5kZXggPSByZXF1aXJlKCdjb21wb25lbnQtaW5kZXhvZicpO1xufVxuXG4vKipcbiAqIFdoaXRlc3BhY2UgcmVnZXhwLlxuICovXG5cbnZhciByZSA9IC9cXHMrLztcblxuLyoqXG4gKiB0b1N0cmluZyByZWZlcmVuY2UuXG4gKi9cblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLyoqXG4gKiBXcmFwIGBlbGAgaW4gYSBgQ2xhc3NMaXN0YC5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKiBAcmV0dXJuIHtDbGFzc0xpc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZWwpe1xuICByZXR1cm4gbmV3IENsYXNzTGlzdChlbCk7XG59O1xuXG4vKipcbiAqIEluaXRpYWxpemUgYSBuZXcgQ2xhc3NMaXN0IGZvciBgZWxgLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIENsYXNzTGlzdChlbCkge1xuICBpZiAoIWVsIHx8ICFlbC5ub2RlVHlwZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQSBET00gZWxlbWVudCByZWZlcmVuY2UgaXMgcmVxdWlyZWQnKTtcbiAgfVxuICB0aGlzLmVsID0gZWw7XG4gIHRoaXMubGlzdCA9IGVsLmNsYXNzTGlzdDtcbn1cblxuLyoqXG4gKiBBZGQgY2xhc3MgYG5hbWVgIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEByZXR1cm4ge0NsYXNzTGlzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuQ2xhc3NMaXN0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihuYW1lKXtcbiAgLy8gY2xhc3NMaXN0XG4gIGlmICh0aGlzLmxpc3QpIHtcbiAgICB0aGlzLmxpc3QuYWRkKG5hbWUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gZmFsbGJhY2tcbiAgdmFyIGFyciA9IHRoaXMuYXJyYXkoKTtcbiAgdmFyIGkgPSBpbmRleChhcnIsIG5hbWUpO1xuICBpZiAoIX5pKSBhcnIucHVzaChuYW1lKTtcbiAgdGhpcy5lbC5jbGFzc05hbWUgPSBhcnIuam9pbignICcpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIGNsYXNzIGBuYW1lYCB3aGVuIHByZXNlbnQsIG9yXG4gKiBwYXNzIGEgcmVndWxhciBleHByZXNzaW9uIHRvIHJlbW92ZVxuICogYW55IHdoaWNoIG1hdGNoLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gbmFtZVxuICogQHJldHVybiB7Q2xhc3NMaXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5DbGFzc0xpc3QucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKG5hbWUpe1xuICBpZiAoJ1tvYmplY3QgUmVnRXhwXScgPT0gdG9TdHJpbmcuY2FsbChuYW1lKSkge1xuICAgIHJldHVybiB0aGlzLnJlbW92ZU1hdGNoaW5nKG5hbWUpO1xuICB9XG5cbiAgLy8gY2xhc3NMaXN0XG4gIGlmICh0aGlzLmxpc3QpIHtcbiAgICB0aGlzLmxpc3QucmVtb3ZlKG5hbWUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gZmFsbGJhY2tcbiAgdmFyIGFyciA9IHRoaXMuYXJyYXkoKTtcbiAgdmFyIGkgPSBpbmRleChhcnIsIG5hbWUpO1xuICBpZiAofmkpIGFyci5zcGxpY2UoaSwgMSk7XG4gIHRoaXMuZWwuY2xhc3NOYW1lID0gYXJyLmpvaW4oJyAnKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBhbGwgY2xhc3NlcyBtYXRjaGluZyBgcmVgLlxuICpcbiAqIEBwYXJhbSB7UmVnRXhwfSByZVxuICogQHJldHVybiB7Q2xhc3NMaXN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuQ2xhc3NMaXN0LnByb3RvdHlwZS5yZW1vdmVNYXRjaGluZyA9IGZ1bmN0aW9uKHJlKXtcbiAgdmFyIGFyciA9IHRoaXMuYXJyYXkoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocmUudGVzdChhcnJbaV0pKSB7XG4gICAgICB0aGlzLnJlbW92ZShhcnJbaV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogVG9nZ2xlIGNsYXNzIGBuYW1lYCwgY2FuIGZvcmNlIHN0YXRlIHZpYSBgZm9yY2VgLlxuICpcbiAqIEZvciBicm93c2VycyB0aGF0IHN1cHBvcnQgY2xhc3NMaXN0LCBidXQgZG8gbm90IHN1cHBvcnQgYGZvcmNlYCB5ZXQsXG4gKiB0aGUgbWlzdGFrZSB3aWxsIGJlIGRldGVjdGVkIGFuZCBjb3JyZWN0ZWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZm9yY2VcbiAqIEByZXR1cm4ge0NsYXNzTGlzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuQ2xhc3NMaXN0LnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbihuYW1lLCBmb3JjZSl7XG4gIC8vIGNsYXNzTGlzdFxuICBpZiAodGhpcy5saXN0KSB7XG4gICAgaWYgKFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBmb3JjZSkge1xuICAgICAgaWYgKGZvcmNlICE9PSB0aGlzLmxpc3QudG9nZ2xlKG5hbWUsIGZvcmNlKSkge1xuICAgICAgICB0aGlzLmxpc3QudG9nZ2xlKG5hbWUpOyAvLyB0b2dnbGUgYWdhaW4gdG8gY29ycmVjdFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxpc3QudG9nZ2xlKG5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIGZhbGxiYWNrXG4gIGlmIChcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgZm9yY2UpIHtcbiAgICBpZiAoIWZvcmNlKSB7XG4gICAgICB0aGlzLnJlbW92ZShuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZGQobmFtZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICh0aGlzLmhhcyhuYW1lKSkge1xuICAgICAgdGhpcy5yZW1vdmUobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRkKG5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gYW4gYXJyYXkgb2YgY2xhc3Nlcy5cbiAqXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuQ2xhc3NMaXN0LnByb3RvdHlwZS5hcnJheSA9IGZ1bmN0aW9uKCl7XG4gIHZhciBjbGFzc05hbWUgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSB8fCAnJztcbiAgdmFyIHN0ciA9IGNsYXNzTmFtZS5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJyk7XG4gIHZhciBhcnIgPSBzdHIuc3BsaXQocmUpO1xuICBpZiAoJycgPT09IGFyclswXSkgYXJyLnNoaWZ0KCk7XG4gIHJldHVybiBhcnI7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGNsYXNzIGBuYW1lYCBpcyBwcmVzZW50LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJuIHtDbGFzc0xpc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkNsYXNzTGlzdC5wcm90b3R5cGUuaGFzID1cbkNsYXNzTGlzdC5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbihuYW1lKXtcbiAgcmV0dXJuIHRoaXMubGlzdFxuICAgID8gdGhpcy5saXN0LmNvbnRhaW5zKG5hbWUpXG4gICAgOiAhISB+aW5kZXgodGhpcy5hcnJheSgpLCBuYW1lKTtcbn07XG4iLCJpbXBvcnQgX3R5cGVvZiBmcm9tICdiYWJlbC1ydW50aW1lL2hlbHBlcnMvdHlwZW9mJztcbmltcG9ydCBFdmVudCBmcm9tICcuL0V2ZW50JztcbmltcG9ydCBjbGFzc2VzIGZyb20gJ2NvbXBvbmVudC1jbGFzc2VzJztcblxudmFyIGlzQ3NzQW5pbWF0aW9uU3VwcG9ydGVkID0gRXZlbnQuZW5kRXZlbnRzLmxlbmd0aCAhPT0gMDtcbnZhciBjYXBpdGFsUHJlZml4ZXMgPSBbJ1dlYmtpdCcsICdNb3onLCAnTycsXG4vLyBtcyBpcyBzcGVjaWFsIC4uLi4gIVxuJ21zJ107XG52YXIgcHJlZml4ZXMgPSBbJy13ZWJraXQtJywgJy1tb3otJywgJy1vLScsICdtcy0nLCAnJ107XG5cbmZ1bmN0aW9uIGdldFN0eWxlUHJvcGVydHkobm9kZSwgbmFtZSkge1xuICAvLyBvbGQgZmYgbmVlZCBudWxsLCBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L2dldENvbXB1dGVkU3R5bGVcbiAgdmFyIHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCk7XG4gIHZhciByZXQgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmVmaXhlcy5sZW5ndGg7IGkrKykge1xuICAgIHJldCA9IHN0eWxlLmdldFByb3BlcnR5VmFsdWUocHJlZml4ZXNbaV0gKyBuYW1lKTtcbiAgICBpZiAocmV0KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZml4QnJvd3NlckJ5VGltZW91dChub2RlKSB7XG4gIGlmIChpc0Nzc0FuaW1hdGlvblN1cHBvcnRlZCkge1xuICAgIHZhciB0cmFuc2l0aW9uRGVsYXkgPSBwYXJzZUZsb2F0KGdldFN0eWxlUHJvcGVydHkobm9kZSwgJ3RyYW5zaXRpb24tZGVsYXknKSkgfHwgMDtcbiAgICB2YXIgdHJhbnNpdGlvbkR1cmF0aW9uID0gcGFyc2VGbG9hdChnZXRTdHlsZVByb3BlcnR5KG5vZGUsICd0cmFuc2l0aW9uLWR1cmF0aW9uJykpIHx8IDA7XG4gICAgdmFyIGFuaW1hdGlvbkRlbGF5ID0gcGFyc2VGbG9hdChnZXRTdHlsZVByb3BlcnR5KG5vZGUsICdhbmltYXRpb24tZGVsYXknKSkgfHwgMDtcbiAgICB2YXIgYW5pbWF0aW9uRHVyYXRpb24gPSBwYXJzZUZsb2F0KGdldFN0eWxlUHJvcGVydHkobm9kZSwgJ2FuaW1hdGlvbi1kdXJhdGlvbicpKSB8fCAwO1xuICAgIHZhciB0aW1lID0gTWF0aC5tYXgodHJhbnNpdGlvbkR1cmF0aW9uICsgdHJhbnNpdGlvbkRlbGF5LCBhbmltYXRpb25EdXJhdGlvbiArIGFuaW1hdGlvbkRlbGF5KTtcbiAgICAvLyBzb21ldGltZXMsIGJyb3dzZXIgYnVnXG4gICAgbm9kZS5yY0VuZEFuaW1UaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBub2RlLnJjRW5kQW5pbVRpbWVvdXQgPSBudWxsO1xuICAgICAgaWYgKG5vZGUucmNFbmRMaXN0ZW5lcikge1xuICAgICAgICBub2RlLnJjRW5kTGlzdGVuZXIoKTtcbiAgICAgIH1cbiAgICB9LCB0aW1lICogMTAwMCArIDIwMCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xlYXJCcm93c2VyQnVnVGltZW91dChub2RlKSB7XG4gIGlmIChub2RlLnJjRW5kQW5pbVRpbWVvdXQpIHtcbiAgICBjbGVhclRpbWVvdXQobm9kZS5yY0VuZEFuaW1UaW1lb3V0KTtcbiAgICBub2RlLnJjRW5kQW5pbVRpbWVvdXQgPSBudWxsO1xuICB9XG59XG5cbnZhciBjc3NBbmltYXRpb24gPSBmdW5jdGlvbiBjc3NBbmltYXRpb24obm9kZSwgdHJhbnNpdGlvbk5hbWUsIGVuZENhbGxiYWNrKSB7XG4gIHZhciBuYW1lSXNPYmogPSAodHlwZW9mIHRyYW5zaXRpb25OYW1lID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZih0cmFuc2l0aW9uTmFtZSkpID09PSAnb2JqZWN0JztcbiAgdmFyIGNsYXNzTmFtZSA9IG5hbWVJc09iaiA/IHRyYW5zaXRpb25OYW1lLm5hbWUgOiB0cmFuc2l0aW9uTmFtZTtcbiAgdmFyIGFjdGl2ZUNsYXNzTmFtZSA9IG5hbWVJc09iaiA/IHRyYW5zaXRpb25OYW1lLmFjdGl2ZSA6IHRyYW5zaXRpb25OYW1lICsgJy1hY3RpdmUnO1xuICB2YXIgZW5kID0gZW5kQ2FsbGJhY2s7XG4gIHZhciBzdGFydCA9IHZvaWQgMDtcbiAgdmFyIGFjdGl2ZSA9IHZvaWQgMDtcbiAgdmFyIG5vZGVDbGFzc2VzID0gY2xhc3Nlcyhub2RlKTtcblxuICBpZiAoZW5kQ2FsbGJhY2sgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGVuZENhbGxiYWNrKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICBlbmQgPSBlbmRDYWxsYmFjay5lbmQ7XG4gICAgc3RhcnQgPSBlbmRDYWxsYmFjay5zdGFydDtcbiAgICBhY3RpdmUgPSBlbmRDYWxsYmFjay5hY3RpdmU7XG4gIH1cblxuICBpZiAobm9kZS5yY0VuZExpc3RlbmVyKSB7XG4gICAgbm9kZS5yY0VuZExpc3RlbmVyKCk7XG4gIH1cblxuICBub2RlLnJjRW5kTGlzdGVuZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgIGlmIChlICYmIGUudGFyZ2V0ICE9PSBub2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG5vZGUucmNBbmltVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KG5vZGUucmNBbmltVGltZW91dCk7XG4gICAgICBub2RlLnJjQW5pbVRpbWVvdXQgPSBudWxsO1xuICAgIH1cblxuICAgIGNsZWFyQnJvd3NlckJ1Z1RpbWVvdXQobm9kZSk7XG5cbiAgICBub2RlQ2xhc3Nlcy5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICBub2RlQ2xhc3Nlcy5yZW1vdmUoYWN0aXZlQ2xhc3NOYW1lKTtcblxuICAgIEV2ZW50LnJlbW92ZUVuZEV2ZW50TGlzdGVuZXIobm9kZSwgbm9kZS5yY0VuZExpc3RlbmVyKTtcbiAgICBub2RlLnJjRW5kTGlzdGVuZXIgPSBudWxsO1xuXG4gICAgLy8gVXN1YWxseSB0aGlzIG9wdGlvbmFsIGVuZCBpcyB1c2VkIGZvciBpbmZvcm1pbmcgYW4gb3duZXIgb2ZcbiAgICAvLyBhIGxlYXZlIGFuaW1hdGlvbiBhbmQgdGVsbGluZyBpdCB0byByZW1vdmUgdGhlIGNoaWxkLlxuICAgIGlmIChlbmQpIHtcbiAgICAgIGVuZCgpO1xuICAgIH1cbiAgfTtcblxuICBFdmVudC5hZGRFbmRFdmVudExpc3RlbmVyKG5vZGUsIG5vZGUucmNFbmRMaXN0ZW5lcik7XG5cbiAgaWYgKHN0YXJ0KSB7XG4gICAgc3RhcnQoKTtcbiAgfVxuICBub2RlQ2xhc3Nlcy5hZGQoY2xhc3NOYW1lKTtcblxuICBub2RlLnJjQW5pbVRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICBub2RlLnJjQW5pbVRpbWVvdXQgPSBudWxsO1xuICAgIG5vZGVDbGFzc2VzLmFkZChhY3RpdmVDbGFzc05hbWUpO1xuICAgIGlmIChhY3RpdmUpIHtcbiAgICAgIHNldFRpbWVvdXQoYWN0aXZlLCAwKTtcbiAgICB9XG4gICAgZml4QnJvd3NlckJ5VGltZW91dChub2RlKTtcbiAgICAvLyAzMG1zIGZvciBmaXJlZm94XG4gIH0sIDMwKTtcblxuICByZXR1cm4ge1xuICAgIHN0b3A6IGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgICBpZiAobm9kZS5yY0VuZExpc3RlbmVyKSB7XG4gICAgICAgIG5vZGUucmNFbmRMaXN0ZW5lcigpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG5cbmNzc0FuaW1hdGlvbi5zdHlsZSA9IGZ1bmN0aW9uIChub2RlLCBzdHlsZSwgY2FsbGJhY2spIHtcbiAgaWYgKG5vZGUucmNFbmRMaXN0ZW5lcikge1xuICAgIG5vZGUucmNFbmRMaXN0ZW5lcigpO1xuICB9XG5cbiAgbm9kZS5yY0VuZExpc3RlbmVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoZSAmJiBlLnRhcmdldCAhPT0gbm9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChub2RlLnJjQW5pbVRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChub2RlLnJjQW5pbVRpbWVvdXQpO1xuICAgICAgbm9kZS5yY0FuaW1UaW1lb3V0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBjbGVhckJyb3dzZXJCdWdUaW1lb3V0KG5vZGUpO1xuXG4gICAgRXZlbnQucmVtb3ZlRW5kRXZlbnRMaXN0ZW5lcihub2RlLCBub2RlLnJjRW5kTGlzdGVuZXIpO1xuICAgIG5vZGUucmNFbmRMaXN0ZW5lciA9IG51bGw7XG5cbiAgICAvLyBVc3VhbGx5IHRoaXMgb3B0aW9uYWwgY2FsbGJhY2sgaXMgdXNlZCBmb3IgaW5mb3JtaW5nIGFuIG93bmVyIG9mXG4gICAgLy8gYSBsZWF2ZSBhbmltYXRpb24gYW5kIHRlbGxpbmcgaXQgdG8gcmVtb3ZlIHRoZSBjaGlsZC5cbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuICB9O1xuXG4gIEV2ZW50LmFkZEVuZEV2ZW50TGlzdGVuZXIobm9kZSwgbm9kZS5yY0VuZExpc3RlbmVyKTtcblxuICBub2RlLnJjQW5pbVRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKHZhciBzIGluIHN0eWxlKSB7XG4gICAgICBpZiAoc3R5bGUuaGFzT3duUHJvcGVydHkocykpIHtcbiAgICAgICAgbm9kZS5zdHlsZVtzXSA9IHN0eWxlW3NdO1xuICAgICAgfVxuICAgIH1cbiAgICBub2RlLnJjQW5pbVRpbWVvdXQgPSBudWxsO1xuICAgIGZpeEJyb3dzZXJCeVRpbWVvdXQobm9kZSk7XG4gIH0sIDApO1xufTtcblxuY3NzQW5pbWF0aW9uLnNldFRyYW5zaXRpb24gPSBmdW5jdGlvbiAobm9kZSwgcCwgdmFsdWUpIHtcbiAgdmFyIHByb3BlcnR5ID0gcDtcbiAgdmFyIHYgPSB2YWx1ZTtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICB2ID0gcHJvcGVydHk7XG4gICAgcHJvcGVydHkgPSAnJztcbiAgfVxuICBwcm9wZXJ0eSA9IHByb3BlcnR5IHx8ICcnO1xuICBjYXBpdGFsUHJlZml4ZXMuZm9yRWFjaChmdW5jdGlvbiAocHJlZml4KSB7XG4gICAgbm9kZS5zdHlsZVtwcmVmaXggKyAnVHJhbnNpdGlvbicgKyBwcm9wZXJ0eV0gPSB2O1xuICB9KTtcbn07XG5cbmNzc0FuaW1hdGlvbi5pc0Nzc0FuaW1hdGlvblN1cHBvcnRlZCA9IGlzQ3NzQW5pbWF0aW9uU3VwcG9ydGVkO1xuXG5leHBvcnQgeyBpc0Nzc0FuaW1hdGlvblN1cHBvcnRlZCB9O1xuXG5leHBvcnQgZGVmYXVsdCBjc3NBbmltYXRpb247IiwidmFyIHV0aWwgPSB7XG4gIGlzQXBwZWFyU3VwcG9ydGVkOiBmdW5jdGlvbiBpc0FwcGVhclN1cHBvcnRlZChwcm9wcykge1xuICAgIHJldHVybiBwcm9wcy50cmFuc2l0aW9uTmFtZSAmJiBwcm9wcy50cmFuc2l0aW9uQXBwZWFyIHx8IHByb3BzLmFuaW1hdGlvbi5hcHBlYXI7XG4gIH0sXG4gIGlzRW50ZXJTdXBwb3J0ZWQ6IGZ1bmN0aW9uIGlzRW50ZXJTdXBwb3J0ZWQocHJvcHMpIHtcbiAgICByZXR1cm4gcHJvcHMudHJhbnNpdGlvbk5hbWUgJiYgcHJvcHMudHJhbnNpdGlvbkVudGVyIHx8IHByb3BzLmFuaW1hdGlvbi5lbnRlcjtcbiAgfSxcbiAgaXNMZWF2ZVN1cHBvcnRlZDogZnVuY3Rpb24gaXNMZWF2ZVN1cHBvcnRlZChwcm9wcykge1xuICAgIHJldHVybiBwcm9wcy50cmFuc2l0aW9uTmFtZSAmJiBwcm9wcy50cmFuc2l0aW9uTGVhdmUgfHwgcHJvcHMuYW5pbWF0aW9uLmxlYXZlO1xuICB9LFxuICBhbGxvd0FwcGVhckNhbGxiYWNrOiBmdW5jdGlvbiBhbGxvd0FwcGVhckNhbGxiYWNrKHByb3BzKSB7XG4gICAgcmV0dXJuIHByb3BzLnRyYW5zaXRpb25BcHBlYXIgfHwgcHJvcHMuYW5pbWF0aW9uLmFwcGVhcjtcbiAgfSxcbiAgYWxsb3dFbnRlckNhbGxiYWNrOiBmdW5jdGlvbiBhbGxvd0VudGVyQ2FsbGJhY2socHJvcHMpIHtcbiAgICByZXR1cm4gcHJvcHMudHJhbnNpdGlvbkVudGVyIHx8IHByb3BzLmFuaW1hdGlvbi5lbnRlcjtcbiAgfSxcbiAgYWxsb3dMZWF2ZUNhbGxiYWNrOiBmdW5jdGlvbiBhbGxvd0xlYXZlQ2FsbGJhY2socHJvcHMpIHtcbiAgICByZXR1cm4gcHJvcHMudHJhbnNpdGlvbkxlYXZlIHx8IHByb3BzLmFuaW1hdGlvbi5sZWF2ZTtcbiAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IHV0aWw7IiwiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tICdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tICdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3MnO1xuaW1wb3J0IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIGZyb20gJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJztcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSAnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY3NzQW5pbWF0ZSwgeyBpc0Nzc0FuaW1hdGlvblN1cHBvcnRlZCB9IGZyb20gJ2Nzcy1hbmltYXRpb24nO1xuaW1wb3J0IGFuaW1VdGlsIGZyb20gJy4vdXRpbC9hbmltYXRlJztcblxudmFyIHRyYW5zaXRpb25NYXAgPSB7XG4gIGVudGVyOiAndHJhbnNpdGlvbkVudGVyJyxcbiAgYXBwZWFyOiAndHJhbnNpdGlvbkFwcGVhcicsXG4gIGxlYXZlOiAndHJhbnNpdGlvbkxlYXZlJ1xufTtcblxudmFyIEFuaW1hdGVDaGlsZCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhBbmltYXRlQ2hpbGQsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEFuaW1hdGVDaGlsZCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQW5pbWF0ZUNoaWxkKTtcblxuICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoQW5pbWF0ZUNoaWxkLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoQW5pbWF0ZUNoaWxkKSkuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQW5pbWF0ZUNoaWxkLCBbe1xuICAgIGtleTogJ2NvbXBvbmVudFdpbGxVbm1vdW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLnN0b3AoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjb21wb25lbnRXaWxsRW50ZXInLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsRW50ZXIoZG9uZSkge1xuICAgICAgaWYgKGFuaW1VdGlsLmlzRW50ZXJTdXBwb3J0ZWQodGhpcy5wcm9wcykpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uKCdlbnRlcicsIGRvbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NvbXBvbmVudFdpbGxBcHBlYXInLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsQXBwZWFyKGRvbmUpIHtcbiAgICAgIGlmIChhbmltVXRpbC5pc0FwcGVhclN1cHBvcnRlZCh0aGlzLnByb3BzKSkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb24oJ2FwcGVhcicsIGRvbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NvbXBvbmVudFdpbGxMZWF2ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxMZWF2ZShkb25lKSB7XG4gICAgICBpZiAoYW5pbVV0aWwuaXNMZWF2ZVN1cHBvcnRlZCh0aGlzLnByb3BzKSkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb24oJ2xlYXZlJywgZG9uZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhbHdheXMgc3luYywgZG8gbm90IGludGVydXB0IHdpdGggcmVhY3QgY29tcG9uZW50IGxpZmUgY3ljbGVcbiAgICAgICAgLy8gdXBkYXRlIGhpZGRlbiAtPiBhbmltYXRlIGhpZGRlbiAtPlxuICAgICAgICAvLyBkaWRVcGRhdGUgLT4gYW5pbWF0ZSBsZWF2ZSAtPiB1bm1vdW50IChpZiBhbmltYXRlIGlzIG5vbmUpXG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd0cmFuc2l0aW9uJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdHJhbnNpdGlvbihhbmltYXRpb25UeXBlLCBmaW5pc2hDYWxsYmFjaykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBub2RlID0gUmVhY3RET00uZmluZERPTU5vZGUodGhpcyk7XG4gICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgdmFyIHRyYW5zaXRpb25OYW1lID0gcHJvcHMudHJhbnNpdGlvbk5hbWU7XG4gICAgICB2YXIgbmFtZUlzT2JqID0gdHlwZW9mIHRyYW5zaXRpb25OYW1lID09PSAnb2JqZWN0JztcbiAgICAgIHRoaXMuc3RvcCgpO1xuICAgICAgdmFyIGVuZCA9IGZ1bmN0aW9uIGVuZCgpIHtcbiAgICAgICAgX3RoaXMyLnN0b3BwZXIgPSBudWxsO1xuICAgICAgICBmaW5pc2hDYWxsYmFjaygpO1xuICAgICAgfTtcbiAgICAgIGlmICgoaXNDc3NBbmltYXRpb25TdXBwb3J0ZWQgfHwgIXByb3BzLmFuaW1hdGlvblthbmltYXRpb25UeXBlXSkgJiYgdHJhbnNpdGlvbk5hbWUgJiYgcHJvcHNbdHJhbnNpdGlvbk1hcFthbmltYXRpb25UeXBlXV0pIHtcbiAgICAgICAgdmFyIG5hbWUgPSBuYW1lSXNPYmogPyB0cmFuc2l0aW9uTmFtZVthbmltYXRpb25UeXBlXSA6IHRyYW5zaXRpb25OYW1lICsgJy0nICsgYW5pbWF0aW9uVHlwZTtcbiAgICAgICAgdmFyIGFjdGl2ZU5hbWUgPSBuYW1lICsgJy1hY3RpdmUnO1xuICAgICAgICBpZiAobmFtZUlzT2JqICYmIHRyYW5zaXRpb25OYW1lW2FuaW1hdGlvblR5cGUgKyAnQWN0aXZlJ10pIHtcbiAgICAgICAgICBhY3RpdmVOYW1lID0gdHJhbnNpdGlvbk5hbWVbYW5pbWF0aW9uVHlwZSArICdBY3RpdmUnXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0b3BwZXIgPSBjc3NBbmltYXRlKG5vZGUsIHtcbiAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgIGFjdGl2ZTogYWN0aXZlTmFtZVxuICAgICAgICB9LCBlbmQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdG9wcGVyID0gcHJvcHMuYW5pbWF0aW9uW2FuaW1hdGlvblR5cGVdKG5vZGUsIGVuZCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnc3RvcCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgICB2YXIgc3RvcHBlciA9IHRoaXMuc3RvcHBlcjtcbiAgICAgIGlmIChzdG9wcGVyKSB7XG4gICAgICAgIHRoaXMuc3RvcHBlciA9IG51bGw7XG4gICAgICAgIHN0b3BwZXIuc3RvcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3JlbmRlcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBBbmltYXRlQ2hpbGQ7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbkFuaW1hdGVDaGlsZC5wcm9wVHlwZXMgPSB7XG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMuYW55LFxuICBhbmltYXRpb246IFByb3BUeXBlcy5hbnksXG4gIHRyYW5zaXRpb25OYW1lOiBQcm9wVHlwZXMuYW55XG59O1xuZXhwb3J0IGRlZmF1bHQgQW5pbWF0ZUNoaWxkOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tICdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcyc7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eSc7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjayc7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzcyc7XG5pbXBvcnQgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gZnJvbSAnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tICdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgdW5zYWZlTGlmZWN5Y2xlc1BvbHlmaWxsIGZyb20gJ3JjLXV0aWwvZXMvdW5zYWZlTGlmZWN5Y2xlc1BvbHlmaWxsJztcbmltcG9ydCB7IHRvQXJyYXlDaGlsZHJlbiwgbWVyZ2VDaGlsZHJlbiwgZmluZFNob3duQ2hpbGRJbkNoaWxkcmVuQnlLZXksIGZpbmRDaGlsZEluQ2hpbGRyZW5CeUtleSwgaXNTYW1lQ2hpbGRyZW4gfSBmcm9tICcuL0NoaWxkcmVuVXRpbHMnO1xuaW1wb3J0IEFuaW1hdGVDaGlsZCBmcm9tICcuL0FuaW1hdGVDaGlsZCc7XG5pbXBvcnQgYW5pbVV0aWwgZnJvbSAnLi91dGlsL2FuaW1hdGUnO1xuXG52YXIgZGVmYXVsdEtleSA9ICdyY19hbmltYXRlXycgKyBEYXRlLm5vdygpO1xuXG5mdW5jdGlvbiBnZXRDaGlsZHJlbkZyb21Qcm9wcyhwcm9wcykge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbjtcbiAgaWYgKFJlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSkge1xuICAgIGlmICghY2hpbGRyZW4ua2V5KSB7XG4gICAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkcmVuLCB7XG4gICAgICAgIGtleTogZGVmYXVsdEtleVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjaGlsZHJlbjtcbn1cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnZhciBBbmltYXRlID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKEFuaW1hdGUsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcblxuICBmdW5jdGlvbiBBbmltYXRlKHByb3BzKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEFuaW1hdGUpO1xuXG4gICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKEFuaW1hdGUuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihBbmltYXRlKSkuY2FsbCh0aGlzLCBwcm9wcykpO1xuXG4gICAgX2luaXRpYWxpc2VQcm9wcy5jYWxsKF90aGlzKTtcblxuICAgIF90aGlzLmN1cnJlbnRseUFuaW1hdGluZ0tleXMgPSB7fTtcbiAgICBfdGhpcy5rZXlzVG9FbnRlciA9IFtdO1xuICAgIF90aGlzLmtleXNUb0xlYXZlID0gW107XG5cbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGNoaWxkcmVuOiB0b0FycmF5Q2hpbGRyZW4oZ2V0Q2hpbGRyZW5Gcm9tUHJvcHMocHJvcHMpKVxuICAgIH07XG5cbiAgICBfdGhpcy5jaGlsZHJlblJlZnMgPSB7fTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQW5pbWF0ZSwgW3tcbiAgICBrZXk6ICdjb21wb25lbnREaWRNb3VudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBzaG93UHJvcCA9IHRoaXMucHJvcHMuc2hvd1Byb3A7XG4gICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnN0YXRlLmNoaWxkcmVuO1xuICAgICAgaWYgKHNob3dQcm9wKSB7XG4gICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgIHJldHVybiAhIWNoaWxkLnByb3BzW3Nob3dQcm9wXTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBpZiAoY2hpbGQpIHtcbiAgICAgICAgICBfdGhpczIucGVyZm9ybUFwcGVhcihjaGlsZC5rZXkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB0aGlzLm5leHRQcm9wcyA9IG5leHRQcm9wcztcbiAgICAgIHZhciBuZXh0Q2hpbGRyZW4gPSB0b0FycmF5Q2hpbGRyZW4oZ2V0Q2hpbGRyZW5Gcm9tUHJvcHMobmV4dFByb3BzKSk7XG4gICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgLy8gZXhjbHVzaXZlIG5lZWRzIGltbWVkaWF0ZSByZXNwb25zZVxuICAgICAgaWYgKHByb3BzLmV4Y2x1c2l2ZSkge1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmN1cnJlbnRseUFuaW1hdGluZ0tleXMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIF90aGlzMy5zdG9wKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdmFyIHNob3dQcm9wID0gcHJvcHMuc2hvd1Byb3A7XG4gICAgICB2YXIgY3VycmVudGx5QW5pbWF0aW5nS2V5cyA9IHRoaXMuY3VycmVudGx5QW5pbWF0aW5nS2V5cztcbiAgICAgIC8vIGxhc3QgcHJvcHMgY2hpbGRyZW4gaWYgZXhjbHVzaXZlXG4gICAgICB2YXIgY3VycmVudENoaWxkcmVuID0gcHJvcHMuZXhjbHVzaXZlID8gdG9BcnJheUNoaWxkcmVuKGdldENoaWxkcmVuRnJvbVByb3BzKHByb3BzKSkgOiB0aGlzLnN0YXRlLmNoaWxkcmVuO1xuICAgICAgLy8gaW4gY2FzZSBkZXN0cm95IGluIHNob3dQcm9wIG1vZGVcbiAgICAgIHZhciBuZXdDaGlsZHJlbiA9IFtdO1xuICAgICAgaWYgKHNob3dQcm9wKSB7XG4gICAgICAgIGN1cnJlbnRDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjdXJyZW50Q2hpbGQpIHtcbiAgICAgICAgICB2YXIgbmV4dENoaWxkID0gY3VycmVudENoaWxkICYmIGZpbmRDaGlsZEluQ2hpbGRyZW5CeUtleShuZXh0Q2hpbGRyZW4sIGN1cnJlbnRDaGlsZC5rZXkpO1xuICAgICAgICAgIHZhciBuZXdDaGlsZCA9IHZvaWQgMDtcbiAgICAgICAgICBpZiAoKCFuZXh0Q2hpbGQgfHwgIW5leHRDaGlsZC5wcm9wc1tzaG93UHJvcF0pICYmIGN1cnJlbnRDaGlsZC5wcm9wc1tzaG93UHJvcF0pIHtcbiAgICAgICAgICAgIG5ld0NoaWxkID0gUmVhY3QuY2xvbmVFbGVtZW50KG5leHRDaGlsZCB8fCBjdXJyZW50Q2hpbGQsIF9kZWZpbmVQcm9wZXJ0eSh7fSwgc2hvd1Byb3AsIHRydWUpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3Q2hpbGQgPSBuZXh0Q2hpbGQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChuZXdDaGlsZCkge1xuICAgICAgICAgICAgbmV3Q2hpbGRyZW4ucHVzaChuZXdDaGlsZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgbmV4dENoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKG5leHRDaGlsZCkge1xuICAgICAgICAgIGlmICghbmV4dENoaWxkIHx8ICFmaW5kQ2hpbGRJbkNoaWxkcmVuQnlLZXkoY3VycmVudENoaWxkcmVuLCBuZXh0Q2hpbGQua2V5KSkge1xuICAgICAgICAgICAgbmV3Q2hpbGRyZW4ucHVzaChuZXh0Q2hpbGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdDaGlsZHJlbiA9IG1lcmdlQ2hpbGRyZW4oY3VycmVudENoaWxkcmVuLCBuZXh0Q2hpbGRyZW4pO1xuICAgICAgfVxuXG4gICAgICAvLyBuZWVkIHJlbmRlciB0byBhdm9pZCB1cGRhdGVcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBjaGlsZHJlbjogbmV3Q2hpbGRyZW5cbiAgICAgIH0pO1xuXG4gICAgICBuZXh0Q2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgdmFyIGtleSA9IGNoaWxkICYmIGNoaWxkLmtleTtcbiAgICAgICAgaWYgKGNoaWxkICYmIGN1cnJlbnRseUFuaW1hdGluZ0tleXNba2V5XSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaGFzUHJldiA9IGNoaWxkICYmIGZpbmRDaGlsZEluQ2hpbGRyZW5CeUtleShjdXJyZW50Q2hpbGRyZW4sIGtleSk7XG4gICAgICAgIGlmIChzaG93UHJvcCkge1xuICAgICAgICAgIHZhciBzaG93SW5OZXh0ID0gY2hpbGQucHJvcHNbc2hvd1Byb3BdO1xuICAgICAgICAgIGlmIChoYXNQcmV2KSB7XG4gICAgICAgICAgICB2YXIgc2hvd0luTm93ID0gZmluZFNob3duQ2hpbGRJbkNoaWxkcmVuQnlLZXkoY3VycmVudENoaWxkcmVuLCBrZXksIHNob3dQcm9wKTtcbiAgICAgICAgICAgIGlmICghc2hvd0luTm93ICYmIHNob3dJbk5leHQpIHtcbiAgICAgICAgICAgICAgX3RoaXMzLmtleXNUb0VudGVyLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHNob3dJbk5leHQpIHtcbiAgICAgICAgICAgIF90aGlzMy5rZXlzVG9FbnRlci5wdXNoKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCFoYXNQcmV2KSB7XG4gICAgICAgICAgX3RoaXMzLmtleXNUb0VudGVyLnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGN1cnJlbnRDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICB2YXIga2V5ID0gY2hpbGQgJiYgY2hpbGQua2V5O1xuICAgICAgICBpZiAoY2hpbGQgJiYgY3VycmVudGx5QW5pbWF0aW5nS2V5c1trZXldKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBoYXNOZXh0ID0gY2hpbGQgJiYgZmluZENoaWxkSW5DaGlsZHJlbkJ5S2V5KG5leHRDaGlsZHJlbiwga2V5KTtcbiAgICAgICAgaWYgKHNob3dQcm9wKSB7XG4gICAgICAgICAgdmFyIHNob3dJbk5vdyA9IGNoaWxkLnByb3BzW3Nob3dQcm9wXTtcbiAgICAgICAgICBpZiAoaGFzTmV4dCkge1xuICAgICAgICAgICAgdmFyIHNob3dJbk5leHQgPSBmaW5kU2hvd25DaGlsZEluQ2hpbGRyZW5CeUtleShuZXh0Q2hpbGRyZW4sIGtleSwgc2hvd1Byb3ApO1xuICAgICAgICAgICAgaWYgKCFzaG93SW5OZXh0ICYmIHNob3dJbk5vdykge1xuICAgICAgICAgICAgICBfdGhpczMua2V5c1RvTGVhdmUucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoc2hvd0luTm93KSB7XG4gICAgICAgICAgICBfdGhpczMua2V5c1RvTGVhdmUucHVzaChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghaGFzTmV4dCkge1xuICAgICAgICAgIF90aGlzMy5rZXlzVG9MZWF2ZS5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NvbXBvbmVudERpZFVwZGF0ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAgIHZhciBrZXlzVG9FbnRlciA9IHRoaXMua2V5c1RvRW50ZXI7XG4gICAgICB0aGlzLmtleXNUb0VudGVyID0gW107XG4gICAgICBrZXlzVG9FbnRlci5mb3JFYWNoKHRoaXMucGVyZm9ybUVudGVyKTtcbiAgICAgIHZhciBrZXlzVG9MZWF2ZSA9IHRoaXMua2V5c1RvTGVhdmU7XG4gICAgICB0aGlzLmtleXNUb0xlYXZlID0gW107XG4gICAgICBrZXlzVG9MZWF2ZS5mb3JFYWNoKHRoaXMucGVyZm9ybUxlYXZlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdpc1ZhbGlkQ2hpbGRCeUtleScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzVmFsaWRDaGlsZEJ5S2V5KGN1cnJlbnRDaGlsZHJlbiwga2V5KSB7XG4gICAgICB2YXIgc2hvd1Byb3AgPSB0aGlzLnByb3BzLnNob3dQcm9wO1xuICAgICAgaWYgKHNob3dQcm9wKSB7XG4gICAgICAgIHJldHVybiBmaW5kU2hvd25DaGlsZEluQ2hpbGRyZW5CeUtleShjdXJyZW50Q2hpbGRyZW4sIGtleSwgc2hvd1Byb3ApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZpbmRDaGlsZEluQ2hpbGRyZW5CeUtleShjdXJyZW50Q2hpbGRyZW4sIGtleSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnc3RvcCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0b3Aoa2V5KSB7XG4gICAgICBkZWxldGUgdGhpcy5jdXJyZW50bHlBbmltYXRpbmdLZXlzW2tleV07XG4gICAgICB2YXIgY29tcG9uZW50ID0gdGhpcy5jaGlsZHJlblJlZnNba2V5XTtcbiAgICAgIGlmIChjb21wb25lbnQpIHtcbiAgICAgICAgY29tcG9uZW50LnN0b3AoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdyZW5kZXInLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgIHRoaXMubmV4dFByb3BzID0gcHJvcHM7XG4gICAgICB2YXIgc3RhdGVDaGlsZHJlbiA9IHRoaXMuc3RhdGUuY2hpbGRyZW47XG4gICAgICB2YXIgY2hpbGRyZW4gPSBudWxsO1xuICAgICAgaWYgKHN0YXRlQ2hpbGRyZW4pIHtcbiAgICAgICAgY2hpbGRyZW4gPSBzdGF0ZUNoaWxkcmVuLm1hcChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWNoaWxkLmtleSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHNldCBrZXkgZm9yIDxyYy1hbmltYXRlPiBjaGlsZHJlbicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgIEFuaW1hdGVDaGlsZCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBjaGlsZC5rZXksXG4gICAgICAgICAgICAgIHJlZjogZnVuY3Rpb24gcmVmKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBfdGhpczQuY2hpbGRyZW5SZWZzW2NoaWxkLmtleV0gPSBub2RlO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBhbmltYXRpb246IHByb3BzLmFuaW1hdGlvbixcbiAgICAgICAgICAgICAgdHJhbnNpdGlvbk5hbWU6IHByb3BzLnRyYW5zaXRpb25OYW1lLFxuICAgICAgICAgICAgICB0cmFuc2l0aW9uRW50ZXI6IHByb3BzLnRyYW5zaXRpb25FbnRlcixcbiAgICAgICAgICAgICAgdHJhbnNpdGlvbkFwcGVhcjogcHJvcHMudHJhbnNpdGlvbkFwcGVhcixcbiAgICAgICAgICAgICAgdHJhbnNpdGlvbkxlYXZlOiBwcm9wcy50cmFuc2l0aW9uTGVhdmVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGlsZFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdmFyIENvbXBvbmVudCA9IHByb3BzLmNvbXBvbmVudDtcbiAgICAgIGlmIChDb21wb25lbnQpIHtcbiAgICAgICAgdmFyIHBhc3NlZFByb3BzID0gcHJvcHM7XG4gICAgICAgIGlmICh0eXBlb2YgQ29tcG9uZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHBhc3NlZFByb3BzID0gX2V4dGVuZHMoe1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgICAgICBzdHlsZTogcHJvcHMuc3R5bGVcbiAgICAgICAgICB9LCBwcm9wcy5jb21wb25lbnRQcm9wcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgQ29tcG9uZW50LFxuICAgICAgICAgIHBhc3NlZFByb3BzLFxuICAgICAgICAgIGNoaWxkcmVuXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2hpbGRyZW5bMF0gfHwgbnVsbDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQW5pbWF0ZTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuQW5pbWF0ZS5pc0FuaW1hdGUgPSB0cnVlO1xuQW5pbWF0ZS5wcm9wVHlwZXMgPSB7XG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIGNvbXBvbmVudDogUHJvcFR5cGVzLmFueSxcbiAgY29tcG9uZW50UHJvcHM6IFByb3BUeXBlcy5vYmplY3QsXG4gIGFuaW1hdGlvbjogUHJvcFR5cGVzLm9iamVjdCxcbiAgdHJhbnNpdGlvbk5hbWU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5vYmplY3RdKSxcbiAgdHJhbnNpdGlvbkVudGVyOiBQcm9wVHlwZXMuYm9vbCxcbiAgdHJhbnNpdGlvbkFwcGVhcjogUHJvcFR5cGVzLmJvb2wsXG4gIGV4Y2x1c2l2ZTogUHJvcFR5cGVzLmJvb2wsXG4gIHRyYW5zaXRpb25MZWF2ZTogUHJvcFR5cGVzLmJvb2wsXG4gIG9uRW5kOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25FbnRlcjogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uTGVhdmU6IFByb3BUeXBlcy5mdW5jLFxuICBvbkFwcGVhcjogUHJvcFR5cGVzLmZ1bmMsXG4gIHNob3dQcm9wOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGVcbn07XG5BbmltYXRlLmRlZmF1bHRQcm9wcyA9IHtcbiAgYW5pbWF0aW9uOiB7fSxcbiAgY29tcG9uZW50OiAnc3BhbicsXG4gIGNvbXBvbmVudFByb3BzOiB7fSxcbiAgdHJhbnNpdGlvbkVudGVyOiB0cnVlLFxuICB0cmFuc2l0aW9uTGVhdmU6IHRydWUsXG4gIHRyYW5zaXRpb25BcHBlYXI6IGZhbHNlLFxuICBvbkVuZDogbm9vcCxcbiAgb25FbnRlcjogbm9vcCxcbiAgb25MZWF2ZTogbm9vcCxcbiAgb25BcHBlYXI6IG5vb3Bcbn07XG5cbnZhciBfaW5pdGlhbGlzZVByb3BzID0gZnVuY3Rpb24gX2luaXRpYWxpc2VQcm9wcygpIHtcbiAgdmFyIF90aGlzNSA9IHRoaXM7XG5cbiAgdGhpcy5wZXJmb3JtRW50ZXIgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgLy8gbWF5IGFscmVhZHkgcmVtb3ZlIGJ5IGV4Y2x1c2l2ZVxuICAgIGlmIChfdGhpczUuY2hpbGRyZW5SZWZzW2tleV0pIHtcbiAgICAgIF90aGlzNS5jdXJyZW50bHlBbmltYXRpbmdLZXlzW2tleV0gPSB0cnVlO1xuICAgICAgX3RoaXM1LmNoaWxkcmVuUmVmc1trZXldLmNvbXBvbmVudFdpbGxFbnRlcihfdGhpczUuaGFuZGxlRG9uZUFkZGluZy5iaW5kKF90aGlzNSwga2V5LCAnZW50ZXInKSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMucGVyZm9ybUFwcGVhciA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoX3RoaXM1LmNoaWxkcmVuUmVmc1trZXldKSB7XG4gICAgICBfdGhpczUuY3VycmVudGx5QW5pbWF0aW5nS2V5c1trZXldID0gdHJ1ZTtcbiAgICAgIF90aGlzNS5jaGlsZHJlblJlZnNba2V5XS5jb21wb25lbnRXaWxsQXBwZWFyKF90aGlzNS5oYW5kbGVEb25lQWRkaW5nLmJpbmQoX3RoaXM1LCBrZXksICdhcHBlYXInKSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuaGFuZGxlRG9uZUFkZGluZyA9IGZ1bmN0aW9uIChrZXksIHR5cGUpIHtcbiAgICB2YXIgcHJvcHMgPSBfdGhpczUucHJvcHM7XG4gICAgZGVsZXRlIF90aGlzNS5jdXJyZW50bHlBbmltYXRpbmdLZXlzW2tleV07XG4gICAgLy8gaWYgdXBkYXRlIG9uIGV4Y2x1c2l2ZSBtb2RlLCBza2lwIGNoZWNrXG4gICAgaWYgKHByb3BzLmV4Y2x1c2l2ZSAmJiBwcm9wcyAhPT0gX3RoaXM1Lm5leHRQcm9wcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgY3VycmVudENoaWxkcmVuID0gdG9BcnJheUNoaWxkcmVuKGdldENoaWxkcmVuRnJvbVByb3BzKHByb3BzKSk7XG4gICAgaWYgKCFfdGhpczUuaXNWYWxpZENoaWxkQnlLZXkoY3VycmVudENoaWxkcmVuLCBrZXkpKSB7XG4gICAgICAvLyBleGNsdXNpdmUgd2lsbCBub3QgbmVlZCB0aGlzXG4gICAgICBfdGhpczUucGVyZm9ybUxlYXZlKGtleSk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnYXBwZWFyJykge1xuICAgICAgaWYgKGFuaW1VdGlsLmFsbG93QXBwZWFyQ2FsbGJhY2socHJvcHMpKSB7XG4gICAgICAgIHByb3BzLm9uQXBwZWFyKGtleSk7XG4gICAgICAgIHByb3BzLm9uRW5kKGtleSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhbmltVXRpbC5hbGxvd0VudGVyQ2FsbGJhY2socHJvcHMpKSB7XG4gICAgICBwcm9wcy5vbkVudGVyKGtleSk7XG4gICAgICBwcm9wcy5vbkVuZChrZXksIHRydWUpO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLnBlcmZvcm1MZWF2ZSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAvLyBtYXkgYWxyZWFkeSByZW1vdmUgYnkgZXhjbHVzaXZlXG4gICAgaWYgKF90aGlzNS5jaGlsZHJlblJlZnNba2V5XSkge1xuICAgICAgX3RoaXM1LmN1cnJlbnRseUFuaW1hdGluZ0tleXNba2V5XSA9IHRydWU7XG4gICAgICBfdGhpczUuY2hpbGRyZW5SZWZzW2tleV0uY29tcG9uZW50V2lsbExlYXZlKF90aGlzNS5oYW5kbGVEb25lTGVhdmluZy5iaW5kKF90aGlzNSwga2V5KSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuaGFuZGxlRG9uZUxlYXZpbmcgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIHByb3BzID0gX3RoaXM1LnByb3BzO1xuICAgIGRlbGV0ZSBfdGhpczUuY3VycmVudGx5QW5pbWF0aW5nS2V5c1trZXldO1xuICAgIC8vIGlmIHVwZGF0ZSBvbiBleGNsdXNpdmUgbW9kZSwgc2tpcCBjaGVja1xuICAgIGlmIChwcm9wcy5leGNsdXNpdmUgJiYgcHJvcHMgIT09IF90aGlzNS5uZXh0UHJvcHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGN1cnJlbnRDaGlsZHJlbiA9IHRvQXJyYXlDaGlsZHJlbihnZXRDaGlsZHJlbkZyb21Qcm9wcyhwcm9wcykpO1xuICAgIC8vIGluIGNhc2Ugc3RhdGUgY2hhbmdlIGlzIHRvbyBmYXN0XG4gICAgaWYgKF90aGlzNS5pc1ZhbGlkQ2hpbGRCeUtleShjdXJyZW50Q2hpbGRyZW4sIGtleSkpIHtcbiAgICAgIF90aGlzNS5wZXJmb3JtRW50ZXIoa2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGVuZCA9IGZ1bmN0aW9uIGVuZCgpIHtcbiAgICAgICAgaWYgKGFuaW1VdGlsLmFsbG93TGVhdmVDYWxsYmFjayhwcm9wcykpIHtcbiAgICAgICAgICBwcm9wcy5vbkxlYXZlKGtleSk7XG4gICAgICAgICAgcHJvcHMub25FbmQoa2V5LCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBpZiAoIWlzU2FtZUNoaWxkcmVuKF90aGlzNS5zdGF0ZS5jaGlsZHJlbiwgY3VycmVudENoaWxkcmVuLCBwcm9wcy5zaG93UHJvcCkpIHtcbiAgICAgICAgX3RoaXM1LnNldFN0YXRlKHtcbiAgICAgICAgICBjaGlsZHJlbjogY3VycmVudENoaWxkcmVuXG4gICAgICAgIH0sIGVuZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbmQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCB1bnNhZmVMaWZlY3ljbGVzUG9seWZpbGwoQW5pbWF0ZSk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uIChvYmosIGtleXMpIHtcbiAgdmFyIHRhcmdldCA9IHt9O1xuXG4gIGZvciAodmFyIGkgaW4gb2JqKSB7XG4gICAgaWYgKGtleXMuaW5kZXhPZihpKSA+PSAwKSBjb250aW51ZTtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGkpKSBjb250aW51ZTtcbiAgICB0YXJnZXRbaV0gPSBvYmpbaV07XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufTsiLCJpbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcyc7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjayc7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzcyc7XG5pbXBvcnQgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gZnJvbSAnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tICdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnO1xuaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbnZhciBMYXp5UmVuZGVyQm94ID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzKExhenlSZW5kZXJCb3gsIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIExhenlSZW5kZXJCb3goKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIExhenlSZW5kZXJCb3gpO1xuXG4gICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChMYXp5UmVuZGVyQm94Ll9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTGF6eVJlbmRlckJveCkpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKExhenlSZW5kZXJCb3gsIFt7XG4gICAga2V5OiAnc2hvdWxkQ29tcG9uZW50VXBkYXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcykge1xuICAgICAgcmV0dXJuIG5leHRQcm9wcy5oaWRkZW5DbGFzc05hbWUgfHwgbmV4dFByb3BzLnZpc2libGU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAncmVuZGVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgaGlkZGVuQ2xhc3NOYW1lID0gX3Byb3BzLmhpZGRlbkNsYXNzTmFtZSxcbiAgICAgICAgICB2aXNpYmxlID0gX3Byb3BzLnZpc2libGUsXG4gICAgICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3Byb3BzLCBbJ2hpZGRlbkNsYXNzTmFtZScsICd2aXNpYmxlJ10pO1xuXG4gICAgICBpZiAoaGlkZGVuQ2xhc3NOYW1lIHx8IFJlYWN0LkNoaWxkcmVuLmNvdW50KHByb3BzLmNoaWxkcmVuKSA+IDEpIHtcbiAgICAgICAgaWYgKCF2aXNpYmxlICYmIGhpZGRlbkNsYXNzTmFtZSkge1xuICAgICAgICAgIHByb3BzLmNsYXNzTmFtZSArPSAnICcgKyBoaWRkZW5DbGFzc05hbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoJ2RpdicsIHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFJlYWN0LkNoaWxkcmVuLm9ubHkocHJvcHMuY2hpbGRyZW4pO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBMYXp5UmVuZGVyQm94O1xufShDb21wb25lbnQpO1xuXG5MYXp5UmVuZGVyQm94LnByb3BUeXBlcyA9IHtcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5hbnksXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgdmlzaWJsZTogUHJvcFR5cGVzLmJvb2wsXG4gIGhpZGRlbkNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZ1xufTtcblxuXG5leHBvcnQgZGVmYXVsdCBMYXp5UmVuZGVyQm94OyIsImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSAnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJztcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSAnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzJztcbmltcG9ydCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiBmcm9tICdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybic7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cyc7XG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBMYXp5UmVuZGVyQm94IGZyb20gJy4vTGF6eVJlbmRlckJveCc7XG5cbnZhciBQb3B1cElubmVyID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFBvcHVwSW5uZXIsIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFBvcHVwSW5uZXIoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBvcHVwSW5uZXIpO1xuXG4gICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChQb3B1cElubmVyLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoUG9wdXBJbm5lcikpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFBvcHVwSW5uZXIsIFt7XG4gICAga2V5OiAncmVuZGVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgIHZhciBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWU7XG4gICAgICBpZiAoIXByb3BzLnZpc2libGUpIHtcbiAgICAgICAgY2xhc3NOYW1lICs9ICcgJyArIHByb3BzLmhpZGRlbkNsYXNzTmFtZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnZGl2JyxcbiAgICAgICAge1xuICAgICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgICAgIG9uTW91c2VFbnRlcjogcHJvcHMub25Nb3VzZUVudGVyLFxuICAgICAgICAgIG9uTW91c2VMZWF2ZTogcHJvcHMub25Nb3VzZUxlYXZlLFxuICAgICAgICAgIHN0eWxlOiBwcm9wcy5zdHlsZVxuICAgICAgICB9LFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgIExhenlSZW5kZXJCb3gsXG4gICAgICAgICAgeyBjbGFzc05hbWU6IHByb3BzLnByZWZpeENscyArICctY29udGVudCcsIHZpc2libGU6IHByb3BzLnZpc2libGUgfSxcbiAgICAgICAgICBwcm9wcy5jaGlsZHJlblxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBQb3B1cElubmVyO1xufShDb21wb25lbnQpO1xuXG5Qb3B1cElubmVyLnByb3BUeXBlcyA9IHtcbiAgaGlkZGVuQ2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHByZWZpeENsczogUHJvcFR5cGVzLnN0cmluZyxcbiAgb25Nb3VzZUVudGVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25Nb3VzZUxlYXZlOiBQcm9wVHlwZXMuZnVuYyxcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5hbnlcbn07XG5cblxuZXhwb3J0IGRlZmF1bHQgUG9wdXBJbm5lcjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSAnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnO1xuZnVuY3Rpb24gaXNQb2ludHNFcShhMSwgYTIpIHtcbiAgcmV0dXJuIGExWzBdID09PSBhMlswXSAmJiBhMVsxXSA9PT0gYTJbMV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGlnbkZyb21QbGFjZW1lbnQoYnVpbHRpblBsYWNlbWVudHMsIHBsYWNlbWVudFN0ciwgYWxpZ24pIHtcbiAgdmFyIGJhc2VBbGlnbiA9IGJ1aWx0aW5QbGFjZW1lbnRzW3BsYWNlbWVudFN0cl0gfHwge307XG4gIHJldHVybiBfZXh0ZW5kcyh7fSwgYmFzZUFsaWduLCBhbGlnbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb3B1cENsYXNzTmFtZUZyb21BbGlnbihidWlsdGluUGxhY2VtZW50cywgcHJlZml4Q2xzLCBhbGlnbikge1xuICB2YXIgcG9pbnRzID0gYWxpZ24ucG9pbnRzO1xuICBmb3IgKHZhciBwbGFjZW1lbnQgaW4gYnVpbHRpblBsYWNlbWVudHMpIHtcbiAgICBpZiAoYnVpbHRpblBsYWNlbWVudHMuaGFzT3duUHJvcGVydHkocGxhY2VtZW50KSkge1xuICAgICAgaWYgKGlzUG9pbnRzRXEoYnVpbHRpblBsYWNlbWVudHNbcGxhY2VtZW50XS5wb2ludHMsIHBvaW50cykpIHtcbiAgICAgICAgcmV0dXJuIHByZWZpeENscyArICctcGxhY2VtZW50LScgKyBwbGFjZW1lbnQ7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhdmVSZWYobmFtZSwgY29tcG9uZW50KSB7XG4gIHRoaXNbbmFtZV0gPSBjb21wb25lbnQ7XG59IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJztcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSAnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJztcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSAnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzJztcbmltcG9ydCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiBmcm9tICdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybic7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cyc7XG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IEFsaWduIGZyb20gJ3JjLWFsaWduJztcbmltcG9ydCBBbmltYXRlIGZyb20gJ3JjLWFuaW1hdGUnO1xuaW1wb3J0IFBvcHVwSW5uZXIgZnJvbSAnLi9Qb3B1cElubmVyJztcbmltcG9ydCBMYXp5UmVuZGVyQm94IGZyb20gJy4vTGF6eVJlbmRlckJveCc7XG5pbXBvcnQgeyBzYXZlUmVmIH0gZnJvbSAnLi91dGlscyc7XG5cbnZhciBQb3B1cCA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhQb3B1cCwgX0NvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gUG9wdXAocHJvcHMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9wdXApO1xuXG4gICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKFBvcHVwLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoUG9wdXApKS5jYWxsKHRoaXMsIHByb3BzKSk7XG5cbiAgICBfaW5pdGlhbGlzZVByb3BzLmNhbGwoX3RoaXMpO1xuXG4gICAgX3RoaXMuc2F2ZVBvcHVwUmVmID0gc2F2ZVJlZi5iaW5kKF90aGlzLCAncG9wdXBJbnN0YW5jZScpO1xuICAgIF90aGlzLnNhdmVBbGlnblJlZiA9IHNhdmVSZWYuYmluZChfdGhpcywgJ2FsaWduSW5zdGFuY2UnKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUG9wdXAsIFt7XG4gICAga2V5OiAnY29tcG9uZW50RGlkTW91bnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHRoaXMucm9vdE5vZGUgPSB0aGlzLmdldFBvcHVwRG9tTm9kZSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldFBvcHVwRG9tTm9kZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFBvcHVwRG9tTm9kZSgpIHtcbiAgICAgIHJldHVybiBSZWFjdERPTS5maW5kRE9NTm9kZSh0aGlzLnBvcHVwSW5zdGFuY2UpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldE1hc2tUcmFuc2l0aW9uTmFtZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE1hc2tUcmFuc2l0aW9uTmFtZSgpIHtcbiAgICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICB2YXIgdHJhbnNpdGlvbk5hbWUgPSBwcm9wcy5tYXNrVHJhbnNpdGlvbk5hbWU7XG4gICAgICB2YXIgYW5pbWF0aW9uID0gcHJvcHMubWFza0FuaW1hdGlvbjtcbiAgICAgIGlmICghdHJhbnNpdGlvbk5hbWUgJiYgYW5pbWF0aW9uKSB7XG4gICAgICAgIHRyYW5zaXRpb25OYW1lID0gcHJvcHMucHJlZml4Q2xzICsgJy0nICsgYW5pbWF0aW9uO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRyYW5zaXRpb25OYW1lO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldFRyYW5zaXRpb25OYW1lJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VHJhbnNpdGlvbk5hbWUoKSB7XG4gICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgdmFyIHRyYW5zaXRpb25OYW1lID0gcHJvcHMudHJhbnNpdGlvbk5hbWU7XG4gICAgICBpZiAoIXRyYW5zaXRpb25OYW1lICYmIHByb3BzLmFuaW1hdGlvbikge1xuICAgICAgICB0cmFuc2l0aW9uTmFtZSA9IHByb3BzLnByZWZpeENscyArICctJyArIHByb3BzLmFuaW1hdGlvbjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cmFuc2l0aW9uTmFtZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdnZXRDbGFzc05hbWUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDbGFzc05hbWUoY3VycmVudEFsaWduQ2xhc3NOYW1lKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5wcmVmaXhDbHMgKyAnICcgKyB0aGlzLnByb3BzLmNsYXNzTmFtZSArICcgJyArIGN1cnJlbnRBbGlnbkNsYXNzTmFtZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdnZXRQb3B1cEVsZW1lbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQb3B1cEVsZW1lbnQoKSB7XG4gICAgICB2YXIgc2F2ZVBvcHVwUmVmID0gdGhpcy5zYXZlUG9wdXBSZWYsXG4gICAgICAgICAgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgdmFyIGFsaWduID0gcHJvcHMuYWxpZ24sXG4gICAgICAgICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICAgICAgICB2aXNpYmxlID0gcHJvcHMudmlzaWJsZSxcbiAgICAgICAgICBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICAgICAgZGVzdHJveVBvcHVwT25IaWRlID0gcHJvcHMuZGVzdHJveVBvcHVwT25IaWRlO1xuXG4gICAgICB2YXIgY2xhc3NOYW1lID0gdGhpcy5nZXRDbGFzc05hbWUodGhpcy5jdXJyZW50QWxpZ25DbGFzc05hbWUgfHwgcHJvcHMuZ2V0Q2xhc3NOYW1lRnJvbUFsaWduKGFsaWduKSk7XG4gICAgICB2YXIgaGlkZGVuQ2xhc3NOYW1lID0gcHJlZml4Q2xzICsgJy1oaWRkZW4nO1xuICAgICAgaWYgKCF2aXNpYmxlKSB7XG4gICAgICAgIHRoaXMuY3VycmVudEFsaWduQ2xhc3NOYW1lID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHZhciBuZXdTdHlsZSA9IF9leHRlbmRzKHt9LCBzdHlsZSwgdGhpcy5nZXRaSW5kZXhTdHlsZSgpKTtcbiAgICAgIHZhciBwb3B1cElubmVyUHJvcHMgPSB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgcmVmOiBzYXZlUG9wdXBSZWYsXG4gICAgICAgIG9uTW91c2VFbnRlcjogcHJvcHMub25Nb3VzZUVudGVyLFxuICAgICAgICBvbk1vdXNlTGVhdmU6IHByb3BzLm9uTW91c2VMZWF2ZSxcbiAgICAgICAgc3R5bGU6IG5ld1N0eWxlXG4gICAgICB9O1xuICAgICAgaWYgKGRlc3Ryb3lQb3B1cE9uSGlkZSkge1xuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICBBbmltYXRlLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbXBvbmVudDogJycsXG4gICAgICAgICAgICBleGNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICB0cmFuc2l0aW9uQXBwZWFyOiB0cnVlLFxuICAgICAgICAgICAgdHJhbnNpdGlvbk5hbWU6IHRoaXMuZ2V0VHJhbnNpdGlvbk5hbWUoKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdmlzaWJsZSA/IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICBBbGlnbixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGFyZ2V0OiB0aGlzLmdldFRhcmdldCxcbiAgICAgICAgICAgICAga2V5OiAncG9wdXAnLFxuICAgICAgICAgICAgICByZWY6IHRoaXMuc2F2ZUFsaWduUmVmLFxuICAgICAgICAgICAgICBtb25pdG9yV2luZG93UmVzaXplOiB0cnVlLFxuICAgICAgICAgICAgICBhbGlnbjogYWxpZ24sXG4gICAgICAgICAgICAgIG9uQWxpZ246IHRoaXMub25BbGlnblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgIFBvcHVwSW5uZXIsXG4gICAgICAgICAgICAgIF9leHRlbmRzKHtcbiAgICAgICAgICAgICAgICB2aXNpYmxlOiB0cnVlXG4gICAgICAgICAgICAgIH0sIHBvcHVwSW5uZXJQcm9wcyksXG4gICAgICAgICAgICAgIHByb3BzLmNoaWxkcmVuXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSA6IG51bGxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICBBbmltYXRlLFxuICAgICAgICB7XG4gICAgICAgICAgY29tcG9uZW50OiAnJyxcbiAgICAgICAgICBleGNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgdHJhbnNpdGlvbkFwcGVhcjogdHJ1ZSxcbiAgICAgICAgICB0cmFuc2l0aW9uTmFtZTogdGhpcy5nZXRUcmFuc2l0aW9uTmFtZSgpLFxuICAgICAgICAgIHNob3dQcm9wOiAneFZpc2libGUnXG4gICAgICAgIH0sXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgQWxpZ24sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGFyZ2V0OiB0aGlzLmdldFRhcmdldCxcbiAgICAgICAgICAgIGtleTogJ3BvcHVwJyxcbiAgICAgICAgICAgIHJlZjogdGhpcy5zYXZlQWxpZ25SZWYsXG4gICAgICAgICAgICBtb25pdG9yV2luZG93UmVzaXplOiB0cnVlLFxuICAgICAgICAgICAgeFZpc2libGU6IHZpc2libGUsXG4gICAgICAgICAgICBjaGlsZHJlblByb3BzOiB7IHZpc2libGU6ICd4VmlzaWJsZScgfSxcbiAgICAgICAgICAgIGRpc2FibGVkOiAhdmlzaWJsZSxcbiAgICAgICAgICAgIGFsaWduOiBhbGlnbixcbiAgICAgICAgICAgIG9uQWxpZ246IHRoaXMub25BbGlnblxuICAgICAgICAgIH0sXG4gICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgIFBvcHVwSW5uZXIsXG4gICAgICAgICAgICBfZXh0ZW5kcyh7XG4gICAgICAgICAgICAgIGhpZGRlbkNsYXNzTmFtZTogaGlkZGVuQ2xhc3NOYW1lXG4gICAgICAgICAgICB9LCBwb3B1cElubmVyUHJvcHMpLFxuICAgICAgICAgICAgcHJvcHMuY2hpbGRyZW5cbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0WkluZGV4U3R5bGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRaSW5kZXhTdHlsZSgpIHtcbiAgICAgIHZhciBzdHlsZSA9IHt9O1xuICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgIGlmIChwcm9wcy56SW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzdHlsZS56SW5kZXggPSBwcm9wcy56SW5kZXg7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3R5bGU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0TWFza0VsZW1lbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRNYXNrRWxlbWVudCgpIHtcbiAgICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICB2YXIgbWFza0VsZW1lbnQgPSB2b2lkIDA7XG4gICAgICBpZiAocHJvcHMubWFzaykge1xuICAgICAgICB2YXIgbWFza1RyYW5zaXRpb24gPSB0aGlzLmdldE1hc2tUcmFuc2l0aW9uTmFtZSgpO1xuICAgICAgICBtYXNrRWxlbWVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoTGF6eVJlbmRlckJveCwge1xuICAgICAgICAgIHN0eWxlOiB0aGlzLmdldFpJbmRleFN0eWxlKCksXG4gICAgICAgICAga2V5OiAnbWFzaycsXG4gICAgICAgICAgY2xhc3NOYW1lOiBwcm9wcy5wcmVmaXhDbHMgKyAnLW1hc2snLFxuICAgICAgICAgIGhpZGRlbkNsYXNzTmFtZTogcHJvcHMucHJlZml4Q2xzICsgJy1tYXNrLWhpZGRlbicsXG4gICAgICAgICAgdmlzaWJsZTogcHJvcHMudmlzaWJsZVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG1hc2tUcmFuc2l0aW9uKSB7XG4gICAgICAgICAgbWFza0VsZW1lbnQgPSBSZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgQW5pbWF0ZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiAnbWFzaycsXG4gICAgICAgICAgICAgIHNob3dQcm9wOiAndmlzaWJsZScsXG4gICAgICAgICAgICAgIHRyYW5zaXRpb25BcHBlYXI6IHRydWUsXG4gICAgICAgICAgICAgIGNvbXBvbmVudDogJycsXG4gICAgICAgICAgICAgIHRyYW5zaXRpb25OYW1lOiBtYXNrVHJhbnNpdGlvblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1hc2tFbGVtZW50XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG1hc2tFbGVtZW50O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3JlbmRlcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnZGl2JyxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgdGhpcy5nZXRNYXNrRWxlbWVudCgpLFxuICAgICAgICB0aGlzLmdldFBvcHVwRWxlbWVudCgpXG4gICAgICApO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBQb3B1cDtcbn0oQ29tcG9uZW50KTtcblxuUG9wdXAucHJvcFR5cGVzID0ge1xuICB2aXNpYmxlOiBQcm9wVHlwZXMuYm9vbCxcbiAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIGdldENsYXNzTmFtZUZyb21BbGlnbjogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uQWxpZ246IFByb3BUeXBlcy5mdW5jLFxuICBnZXRSb290RG9tTm9kZTogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uTW91c2VFbnRlcjogUHJvcFR5cGVzLmZ1bmMsXG4gIGFsaWduOiBQcm9wVHlwZXMuYW55LFxuICBkZXN0cm95UG9wdXBPbkhpZGU6IFByb3BUeXBlcy5ib29sLFxuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHByZWZpeENsczogUHJvcFR5cGVzLnN0cmluZyxcbiAgb25Nb3VzZUxlYXZlOiBQcm9wVHlwZXMuZnVuY1xufTtcblxudmFyIF9pbml0aWFsaXNlUHJvcHMgPSBmdW5jdGlvbiBfaW5pdGlhbGlzZVByb3BzKCkge1xuICB2YXIgX3RoaXMyID0gdGhpcztcblxuICB0aGlzLm9uQWxpZ24gPSBmdW5jdGlvbiAocG9wdXBEb21Ob2RlLCBhbGlnbikge1xuICAgIHZhciBwcm9wcyA9IF90aGlzMi5wcm9wcztcbiAgICB2YXIgY3VycmVudEFsaWduQ2xhc3NOYW1lID0gcHJvcHMuZ2V0Q2xhc3NOYW1lRnJvbUFsaWduKGFsaWduKTtcbiAgICAvLyBGSVg6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1jb21wb25lbnQvdHJpZ2dlci9pc3N1ZXMvNTZcbiAgICAvLyBGSVg6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1jb21wb25lbnQvdG9vbHRpcC9pc3N1ZXMvNzlcbiAgICBpZiAoX3RoaXMyLmN1cnJlbnRBbGlnbkNsYXNzTmFtZSAhPT0gY3VycmVudEFsaWduQ2xhc3NOYW1lKSB7XG4gICAgICBfdGhpczIuY3VycmVudEFsaWduQ2xhc3NOYW1lID0gY3VycmVudEFsaWduQ2xhc3NOYW1lO1xuICAgICAgcG9wdXBEb21Ob2RlLmNsYXNzTmFtZSA9IF90aGlzMi5nZXRDbGFzc05hbWUoY3VycmVudEFsaWduQ2xhc3NOYW1lKTtcbiAgICB9XG4gICAgcHJvcHMub25BbGlnbihwb3B1cERvbU5vZGUsIGFsaWduKTtcbiAgfTtcblxuICB0aGlzLmdldFRhcmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3RoaXMyLnByb3BzLmdldFJvb3REb21Ob2RlKCk7XG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBQb3B1cDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGdldENvbnRhaW5lclJlbmRlck1peGluO1xuXG52YXIgX3JlYWN0RG9tID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmVhY3QtZG9tXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pOyBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IGlmIChpICUgMikgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIGRlZmF1bHRHZXRDb250YWluZXIoKSB7XG4gIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjb250YWluZXIpO1xuICByZXR1cm4gY29udGFpbmVyO1xufVxuXG5mdW5jdGlvbiBnZXRDb250YWluZXJSZW5kZXJNaXhpbihjb25maWcpIHtcbiAgdmFyIF9jb25maWckYXV0b01vdW50ID0gY29uZmlnLmF1dG9Nb3VudCxcbiAgICAgIGF1dG9Nb3VudCA9IF9jb25maWckYXV0b01vdW50ID09PSB2b2lkIDAgPyB0cnVlIDogX2NvbmZpZyRhdXRvTW91bnQsXG4gICAgICBfY29uZmlnJGF1dG9EZXN0cm95ID0gY29uZmlnLmF1dG9EZXN0cm95LFxuICAgICAgYXV0b0Rlc3Ryb3kgPSBfY29uZmlnJGF1dG9EZXN0cm95ID09PSB2b2lkIDAgPyB0cnVlIDogX2NvbmZpZyRhdXRvRGVzdHJveSxcbiAgICAgIGlzVmlzaWJsZSA9IGNvbmZpZy5pc1Zpc2libGUsXG4gICAgICBpc0ZvcmNlUmVuZGVyID0gY29uZmlnLmlzRm9yY2VSZW5kZXIsXG4gICAgICBnZXRDb21wb25lbnQgPSBjb25maWcuZ2V0Q29tcG9uZW50LFxuICAgICAgX2NvbmZpZyRnZXRDb250YWluZXIgPSBjb25maWcuZ2V0Q29udGFpbmVyLFxuICAgICAgZ2V0Q29udGFpbmVyID0gX2NvbmZpZyRnZXRDb250YWluZXIgPT09IHZvaWQgMCA/IGRlZmF1bHRHZXRDb250YWluZXIgOiBfY29uZmlnJGdldENvbnRhaW5lcjtcbiAgdmFyIG1peGluO1xuXG4gIGZ1bmN0aW9uIF9yZW5kZXJDb21wb25lbnQoaW5zdGFuY2UsIGNvbXBvbmVudEFyZywgcmVhZHkpIHtcbiAgICBpZiAoIWlzVmlzaWJsZSB8fCBpbnN0YW5jZS5fY29tcG9uZW50IHx8IGlzVmlzaWJsZShpbnN0YW5jZSkgfHwgaXNGb3JjZVJlbmRlciAmJiBpc0ZvcmNlUmVuZGVyKGluc3RhbmNlKSkge1xuICAgICAgaWYgKCFpbnN0YW5jZS5fY29udGFpbmVyKSB7XG4gICAgICAgIGluc3RhbmNlLl9jb250YWluZXIgPSBnZXRDb250YWluZXIoaW5zdGFuY2UpO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29tcG9uZW50O1xuXG4gICAgICBpZiAoaW5zdGFuY2UuZ2V0Q29tcG9uZW50KSB7XG4gICAgICAgIGNvbXBvbmVudCA9IGluc3RhbmNlLmdldENvbXBvbmVudChjb21wb25lbnRBcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcG9uZW50ID0gZ2V0Q29tcG9uZW50KGluc3RhbmNlLCBjb21wb25lbnRBcmcpO1xuICAgICAgfVxuXG4gICAgICBfcmVhY3REb20uZGVmYXVsdC51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihpbnN0YW5jZSwgY29tcG9uZW50LCBpbnN0YW5jZS5fY29udGFpbmVyLCBmdW5jdGlvbiBjYWxsYmFjaygpIHtcbiAgICAgICAgaW5zdGFuY2UuX2NvbXBvbmVudCA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHJlYWR5KSB7XG4gICAgICAgICAgcmVhZHkuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGF1dG9Nb3VudCkge1xuICAgIG1peGluID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtaXhpbiksIHt9LCB7XG4gICAgICBjb21wb25lbnREaWRNb3VudDogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIF9yZW5kZXJDb21wb25lbnQodGhpcyk7XG4gICAgICB9LFxuICAgICAgY29tcG9uZW50RGlkVXBkYXRlOiBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgICAgIF9yZW5kZXJDb21wb25lbnQodGhpcyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpZiAoIWF1dG9Nb3VudCB8fCAhYXV0b0Rlc3Ryb3kpIHtcbiAgICBtaXhpbiA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgbWl4aW4pLCB7fSwge1xuICAgICAgcmVuZGVyQ29tcG9uZW50OiBmdW5jdGlvbiByZW5kZXJDb21wb25lbnQoY29tcG9uZW50QXJnLCByZWFkeSkge1xuICAgICAgICBfcmVuZGVyQ29tcG9uZW50KHRoaXMsIGNvbXBvbmVudEFyZywgcmVhZHkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gX3JlbW92ZUNvbnRhaW5lcihpbnN0YW5jZSkge1xuICAgIGlmIChpbnN0YW5jZS5fY29udGFpbmVyKSB7XG4gICAgICB2YXIgY29udGFpbmVyID0gaW5zdGFuY2UuX2NvbnRhaW5lcjtcblxuICAgICAgX3JlYWN0RG9tLmRlZmF1bHQudW5tb3VudENvbXBvbmVudEF0Tm9kZShjb250YWluZXIpO1xuXG4gICAgICBjb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjb250YWluZXIpO1xuICAgICAgaW5zdGFuY2UuX2NvbnRhaW5lciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgaWYgKGF1dG9EZXN0cm95KSB7XG4gICAgbWl4aW4gPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG1peGluKSwge30sIHtcbiAgICAgIGNvbXBvbmVudFdpbGxVbm1vdW50OiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgX3JlbW92ZUNvbnRhaW5lcih0aGlzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBtaXhpbiA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgbWl4aW4pLCB7fSwge1xuICAgICAgcmVtb3ZlQ29udGFpbmVyOiBmdW5jdGlvbiByZW1vdmVDb250YWluZXIoKSB7XG4gICAgICAgIF9yZW1vdmVDb250YWluZXIodGhpcyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbWl4aW47XG59IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgZmluZERPTU5vZGUgfSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IGNyZWF0ZVJlYWN0Q2xhc3MgZnJvbSAnY3JlYXRlLXJlYWN0LWNsYXNzJztcbmltcG9ydCBjb250YWlucyBmcm9tICdyYy11dGlsL2VzL0RvbS9jb250YWlucyc7XG5pbXBvcnQgYWRkRXZlbnRMaXN0ZW5lciBmcm9tICdyYy11dGlsL2xpYi9Eb20vYWRkRXZlbnRMaXN0ZW5lcic7XG5pbXBvcnQgUG9wdXAgZnJvbSAnLi9Qb3B1cCc7XG5pbXBvcnQgeyBnZXRBbGlnbkZyb21QbGFjZW1lbnQsIGdldFBvcHVwQ2xhc3NOYW1lRnJvbUFsaWduIGFzIF9nZXRQb3B1cENsYXNzTmFtZUZyb21BbGlnbiB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IGdldENvbnRhaW5lclJlbmRlck1peGluIGZyb20gJ3JjLXV0aWwvbGliL2dldENvbnRhaW5lclJlbmRlck1peGluJztcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbmZ1bmN0aW9uIHJldHVybkVtcHR5U3RyaW5nKCkge1xuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIHJldHVybkRvY3VtZW50KCkge1xuICByZXR1cm4gd2luZG93LmRvY3VtZW50O1xufVxuXG52YXIgaXNNb2JpbGUgPSB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiAhIW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goLyhBbmRyb2lkfGlQaG9uZXxpUGFkfGlQb2R8aU9TfFVDV0VCKS9pKTtcblxudmFyIEFMTF9IQU5ETEVSUyA9IFsnb25DbGljaycsICdvbk1vdXNlRG93bicsICdvblRvdWNoU3RhcnQnLCAnb25Nb3VzZUVudGVyJywgJ29uTW91c2VMZWF2ZScsICdvbkZvY3VzJywgJ29uQmx1ciddO1xuXG52YXIgVHJpZ2dlciA9IGNyZWF0ZVJlYWN0Q2xhc3Moe1xuICBkaXNwbGF5TmFtZTogJ1RyaWdnZXInLFxuICBwcm9wVHlwZXM6IHtcbiAgICBjaGlsZHJlbjogUHJvcFR5cGVzLmFueSxcbiAgICBhY3Rpb246IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zdHJpbmcpXSksXG4gICAgc2hvd0FjdGlvbjogUHJvcFR5cGVzLmFueSxcbiAgICBoaWRlQWN0aW9uOiBQcm9wVHlwZXMuYW55LFxuICAgIGdldFBvcHVwQ2xhc3NOYW1lRnJvbUFsaWduOiBQcm9wVHlwZXMuYW55LFxuICAgIG9uUG9wdXBWaXNpYmxlQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBhZnRlclBvcHVwVmlzaWJsZUNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgcG9wdXA6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ub2RlLCBQcm9wVHlwZXMuZnVuY10pLmlzUmVxdWlyZWQsXG4gICAgcG9wdXBTdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBwcmVmaXhDbHM6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgcG9wdXBDbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgcG9wdXBQbGFjZW1lbnQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgYnVpbHRpblBsYWNlbWVudHM6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgcG9wdXBUcmFuc2l0aW9uTmFtZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm9iamVjdF0pLFxuICAgIHBvcHVwQW5pbWF0aW9uOiBQcm9wVHlwZXMuYW55LFxuICAgIG1vdXNlRW50ZXJEZWxheTogUHJvcFR5cGVzLm51bWJlcixcbiAgICBtb3VzZUxlYXZlRGVsYXk6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgekluZGV4OiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIGZvY3VzRGVsYXk6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgYmx1ckRlbGF5OiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIGdldFBvcHVwQ29udGFpbmVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBnZXREb2N1bWVudDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgZGVzdHJveVBvcHVwT25IaWRlOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBtYXNrOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBtYXNrQ2xvc2FibGU6IFByb3BUeXBlcy5ib29sLFxuICAgIG9uUG9wdXBBbGlnbjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgcG9wdXBBbGlnbjogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBwb3B1cFZpc2libGU6IFByb3BUeXBlcy5ib29sLFxuICAgIG1hc2tUcmFuc2l0aW9uTmFtZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm9iamVjdF0pLFxuICAgIG1hc2tBbmltYXRpb246IFByb3BUeXBlcy5zdHJpbmdcbiAgfSxcblxuICBtaXhpbnM6IFtnZXRDb250YWluZXJSZW5kZXJNaXhpbih7XG4gICAgYXV0b01vdW50OiBmYWxzZSxcblxuICAgIGlzVmlzaWJsZTogZnVuY3Rpb24gaXNWaXNpYmxlKGluc3RhbmNlKSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2Uuc3RhdGUucG9wdXBWaXNpYmxlO1xuICAgIH0sXG4gICAgZ2V0Q29udGFpbmVyOiBmdW5jdGlvbiBnZXRDb250YWluZXIoaW5zdGFuY2UpIHtcbiAgICAgIHZhciBwcm9wcyA9IGluc3RhbmNlLnByb3BzO1xuXG4gICAgICB2YXIgcG9wdXBDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICAgIHBvcHVwQ29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgIHBvcHVwQ29udGFpbmVyLnN0eWxlLnRvcCA9ICcwJztcbiAgICAgIHBvcHVwQ29udGFpbmVyLnN0eWxlLmxlZnQgPSAnMCc7XG4gICAgICBwb3B1cENvbnRhaW5lci5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgIHZhciBtb3VudE5vZGUgPSBwcm9wcy5nZXRQb3B1cENvbnRhaW5lciA/IHByb3BzLmdldFBvcHVwQ29udGFpbmVyKGZpbmRET01Ob2RlKGluc3RhbmNlKSkgOiBwcm9wcy5nZXREb2N1bWVudCgpLmJvZHk7XG4gICAgICBtb3VudE5vZGUuYXBwZW5kQ2hpbGQocG9wdXBDb250YWluZXIpO1xuICAgICAgcmV0dXJuIHBvcHVwQ29udGFpbmVyO1xuICAgIH1cbiAgfSldLFxuXG4gIGdldERlZmF1bHRQcm9wczogZnVuY3Rpb24gZ2V0RGVmYXVsdFByb3BzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBwcmVmaXhDbHM6ICdyYy10cmlnZ2VyLXBvcHVwJyxcbiAgICAgIGdldFBvcHVwQ2xhc3NOYW1lRnJvbUFsaWduOiByZXR1cm5FbXB0eVN0cmluZyxcbiAgICAgIGdldERvY3VtZW50OiByZXR1cm5Eb2N1bWVudCxcbiAgICAgIG9uUG9wdXBWaXNpYmxlQ2hhbmdlOiBub29wLFxuICAgICAgYWZ0ZXJQb3B1cFZpc2libGVDaGFuZ2U6IG5vb3AsXG4gICAgICBvblBvcHVwQWxpZ246IG5vb3AsXG4gICAgICBwb3B1cENsYXNzTmFtZTogJycsXG4gICAgICBtb3VzZUVudGVyRGVsYXk6IDAsXG4gICAgICBtb3VzZUxlYXZlRGVsYXk6IDAuMSxcbiAgICAgIGZvY3VzRGVsYXk6IDAsXG4gICAgICBibHVyRGVsYXk6IDAuMTUsXG4gICAgICBwb3B1cFN0eWxlOiB7fSxcbiAgICAgIGRlc3Ryb3lQb3B1cE9uSGlkZTogZmFsc2UsXG4gICAgICBwb3B1cEFsaWduOiB7fSxcbiAgICAgIGRlZmF1bHRQb3B1cFZpc2libGU6IGZhbHNlLFxuICAgICAgbWFzazogZmFsc2UsXG4gICAgICBtYXNrQ2xvc2FibGU6IHRydWUsXG4gICAgICBhY3Rpb246IFtdLFxuICAgICAgc2hvd0FjdGlvbjogW10sXG4gICAgICBoaWRlQWN0aW9uOiBbXVxuICAgIH07XG4gIH0sXG4gIGdldEluaXRpYWxTdGF0ZTogZnVuY3Rpb24gZ2V0SW5pdGlhbFN0YXRlKCkge1xuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgdmFyIHBvcHVwVmlzaWJsZSA9IHZvaWQgMDtcbiAgICBpZiAoJ3BvcHVwVmlzaWJsZScgaW4gcHJvcHMpIHtcbiAgICAgIHBvcHVwVmlzaWJsZSA9ICEhcHJvcHMucG9wdXBWaXNpYmxlO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb3B1cFZpc2libGUgPSAhIXByb3BzLmRlZmF1bHRQb3B1cFZpc2libGU7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBwb3B1cFZpc2libGU6IHBvcHVwVmlzaWJsZVxuICAgIH07XG4gIH0sXG4gIGNvbXBvbmVudFdpbGxNb3VudDogZnVuY3Rpb24gY29tcG9uZW50V2lsbE1vdW50KCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBBTExfSEFORExFUlMuZm9yRWFjaChmdW5jdGlvbiAoaCkge1xuICAgICAgX3RoaXNbJ2ZpcmUnICsgaF0gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBfdGhpcy5maXJlRXZlbnRzKGgsIGUpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfSxcbiAgY29tcG9uZW50RGlkTW91bnQ6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHRoaXMuY29tcG9uZW50RGlkVXBkYXRlKHt9LCB7XG4gICAgICBwb3B1cFZpc2libGU6IHRoaXMuc3RhdGUucG9wdXBWaXNpYmxlXG4gICAgfSk7XG4gIH0sXG4gIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoX3JlZikge1xuICAgIHZhciBwb3B1cFZpc2libGUgPSBfcmVmLnBvcHVwVmlzaWJsZTtcblxuICAgIGlmIChwb3B1cFZpc2libGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHBvcHVwVmlzaWJsZTogcG9wdXBWaXNpYmxlXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIGNvbXBvbmVudERpZFVwZGF0ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKF8sIHByZXZTdGF0ZSkge1xuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgdmFyIHN0YXRlID0gdGhpcy5zdGF0ZTtcbiAgICB0aGlzLnJlbmRlckNvbXBvbmVudChudWxsLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAocHJldlN0YXRlLnBvcHVwVmlzaWJsZSAhPT0gc3RhdGUucG9wdXBWaXNpYmxlKSB7XG4gICAgICAgIHByb3BzLmFmdGVyUG9wdXBWaXNpYmxlQ2hhbmdlKHN0YXRlLnBvcHVwVmlzaWJsZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLnBvcHVwVmlzaWJsZSkge1xuICAgICAgdmFyIGN1cnJlbnREb2N1bWVudCA9IHZvaWQgMDtcbiAgICAgIGlmICghdGhpcy5jbGlja091dHNpZGVIYW5kbGVyICYmIHRoaXMuaXNDbGlja1RvSGlkZSgpKSB7XG4gICAgICAgIGN1cnJlbnREb2N1bWVudCA9IHByb3BzLmdldERvY3VtZW50KCk7XG4gICAgICAgIHRoaXMuY2xpY2tPdXRzaWRlSGFuZGxlciA9IGFkZEV2ZW50TGlzdGVuZXIoY3VycmVudERvY3VtZW50LCAnbW91c2Vkb3duJywgdGhpcy5vbkRvY3VtZW50Q2xpY2spO1xuICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnRvdWNoT3V0c2lkZUhhbmRsZXIgJiYgaXNNb2JpbGUpIHtcbiAgICAgICAgY3VycmVudERvY3VtZW50ID0gY3VycmVudERvY3VtZW50IHx8IHByb3BzLmdldERvY3VtZW50KCk7XG4gICAgICAgIHRoaXMudG91Y2hPdXRzaWRlSGFuZGxlciA9IGFkZEV2ZW50TGlzdGVuZXIoY3VycmVudERvY3VtZW50LCAnY2xpY2snLCB0aGlzLm9uRG9jdW1lbnRDbGljayk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jbGVhck91dHNpZGVIYW5kbGVyKCk7XG4gIH0sXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50OiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLmNsZWFyRGVsYXlUaW1lcigpO1xuICAgIHRoaXMuY2xlYXJPdXRzaWRlSGFuZGxlcigpO1xuICB9LFxuICBvbk1vdXNlRW50ZXI6IGZ1bmN0aW9uIG9uTW91c2VFbnRlcihlKSB7XG4gICAgdGhpcy5maXJlRXZlbnRzKCdvbk1vdXNlRW50ZXInLCBlKTtcbiAgICB0aGlzLmRlbGF5U2V0UG9wdXBWaXNpYmxlKHRydWUsIHRoaXMucHJvcHMubW91c2VFbnRlckRlbGF5KTtcbiAgfSxcbiAgb25Nb3VzZUxlYXZlOiBmdW5jdGlvbiBvbk1vdXNlTGVhdmUoZSkge1xuICAgIHRoaXMuZmlyZUV2ZW50cygnb25Nb3VzZUxlYXZlJywgZSk7XG4gICAgdGhpcy5kZWxheVNldFBvcHVwVmlzaWJsZShmYWxzZSwgdGhpcy5wcm9wcy5tb3VzZUxlYXZlRGVsYXkpO1xuICB9LFxuICBvblBvcHVwTW91c2VFbnRlcjogZnVuY3Rpb24gb25Qb3B1cE1vdXNlRW50ZXIoKSB7XG4gICAgdGhpcy5jbGVhckRlbGF5VGltZXIoKTtcbiAgfSxcbiAgb25Qb3B1cE1vdXNlTGVhdmU6IGZ1bmN0aW9uIG9uUG9wdXBNb3VzZUxlYXZlKGUpIHtcbiAgICAgICAgICAgIGlmIChlLnJlbGF0ZWRUYXJnZXQgJiYgIWUucmVsYXRlZFRhcmdldC5zZXRUaW1lb3V0ICYmIHRoaXMuX2NvbXBvbmVudCAmJiB0aGlzLl9jb21wb25lbnQuZ2V0UG9wdXBEb21Ob2RlICYmIGNvbnRhaW5zKHRoaXMuX2NvbXBvbmVudC5nZXRQb3B1cERvbU5vZGUoKSwgZS5yZWxhdGVkVGFyZ2V0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRlbGF5U2V0UG9wdXBWaXNpYmxlKGZhbHNlLCB0aGlzLnByb3BzLm1vdXNlTGVhdmVEZWxheSk7XG4gIH0sXG4gIG9uRm9jdXM6IGZ1bmN0aW9uIG9uRm9jdXMoZSkge1xuICAgIHRoaXMuZmlyZUV2ZW50cygnb25Gb2N1cycsIGUpO1xuICAgICAgICB0aGlzLmNsZWFyRGVsYXlUaW1lcigpO1xuICAgIGlmICh0aGlzLmlzRm9jdXNUb1Nob3coKSkge1xuICAgICAgdGhpcy5mb2N1c1RpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgdGhpcy5kZWxheVNldFBvcHVwVmlzaWJsZSh0cnVlLCB0aGlzLnByb3BzLmZvY3VzRGVsYXkpO1xuICAgIH1cbiAgfSxcbiAgb25Nb3VzZURvd246IGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICB0aGlzLmZpcmVFdmVudHMoJ29uTW91c2VEb3duJywgZSk7XG4gICAgdGhpcy5wcmVDbGlja1RpbWUgPSBEYXRlLm5vdygpO1xuICB9LFxuICBvblRvdWNoU3RhcnQ6IGZ1bmN0aW9uIG9uVG91Y2hTdGFydChlKSB7XG4gICAgdGhpcy5maXJlRXZlbnRzKCdvblRvdWNoU3RhcnQnLCBlKTtcbiAgICB0aGlzLnByZVRvdWNoVGltZSA9IERhdGUubm93KCk7XG4gIH0sXG4gIG9uQmx1cjogZnVuY3Rpb24gb25CbHVyKGUpIHtcbiAgICB0aGlzLmZpcmVFdmVudHMoJ29uQmx1cicsIGUpO1xuICAgIHRoaXMuY2xlYXJEZWxheVRpbWVyKCk7XG4gICAgaWYgKHRoaXMuaXNCbHVyVG9IaWRlKCkpIHtcbiAgICAgIHRoaXMuZGVsYXlTZXRQb3B1cFZpc2libGUoZmFsc2UsIHRoaXMucHJvcHMuYmx1ckRlbGF5KTtcbiAgICB9XG4gIH0sXG4gIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soZXZlbnQpIHtcbiAgICB0aGlzLmZpcmVFdmVudHMoJ29uQ2xpY2snLCBldmVudCk7XG4gICAgICAgIGlmICh0aGlzLmZvY3VzVGltZSkge1xuICAgICAgdmFyIHByZVRpbWUgPSB2b2lkIDA7XG4gICAgICBpZiAodGhpcy5wcmVDbGlja1RpbWUgJiYgdGhpcy5wcmVUb3VjaFRpbWUpIHtcbiAgICAgICAgcHJlVGltZSA9IE1hdGgubWluKHRoaXMucHJlQ2xpY2tUaW1lLCB0aGlzLnByZVRvdWNoVGltZSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucHJlQ2xpY2tUaW1lKSB7XG4gICAgICAgIHByZVRpbWUgPSB0aGlzLnByZUNsaWNrVGltZTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5wcmVUb3VjaFRpbWUpIHtcbiAgICAgICAgcHJlVGltZSA9IHRoaXMucHJlVG91Y2hUaW1lO1xuICAgICAgfVxuICAgICAgaWYgKE1hdGguYWJzKHByZVRpbWUgLSB0aGlzLmZvY3VzVGltZSkgPCAyMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmZvY3VzVGltZSA9IDA7XG4gICAgfVxuICAgIHRoaXMucHJlQ2xpY2tUaW1lID0gMDtcbiAgICB0aGlzLnByZVRvdWNoVGltZSA9IDA7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB2YXIgbmV4dFZpc2libGUgPSAhdGhpcy5zdGF0ZS5wb3B1cFZpc2libGU7XG4gICAgaWYgKHRoaXMuaXNDbGlja1RvSGlkZSgpICYmICFuZXh0VmlzaWJsZSB8fCBuZXh0VmlzaWJsZSAmJiB0aGlzLmlzQ2xpY2tUb1Nob3coKSkge1xuICAgICAgdGhpcy5zZXRQb3B1cFZpc2libGUoIXRoaXMuc3RhdGUucG9wdXBWaXNpYmxlKTtcbiAgICB9XG4gIH0sXG4gIG9uRG9jdW1lbnRDbGljazogZnVuY3Rpb24gb25Eb2N1bWVudENsaWNrKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMucHJvcHMubWFzayAmJiAhdGhpcy5wcm9wcy5tYXNrQ2xvc2FibGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICB2YXIgcm9vdCA9IGZpbmRET01Ob2RlKHRoaXMpO1xuICAgIHZhciBwb3B1cE5vZGUgPSB0aGlzLmdldFBvcHVwRG9tTm9kZSgpO1xuICAgIGlmICghY29udGFpbnMocm9vdCwgdGFyZ2V0KSAmJiAhY29udGFpbnMocG9wdXBOb2RlLCB0YXJnZXQpKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9LFxuICBnZXRQb3B1cERvbU5vZGU6IGZ1bmN0aW9uIGdldFBvcHVwRG9tTm9kZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudCAmJiB0aGlzLl9jb21wb25lbnQuZ2V0UG9wdXBEb21Ob2RlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY29tcG9uZW50LmdldFBvcHVwRG9tTm9kZSgpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcbiAgZ2V0Um9vdERvbU5vZGU6IGZ1bmN0aW9uIGdldFJvb3REb21Ob2RlKCkge1xuICAgIHJldHVybiBmaW5kRE9NTm9kZSh0aGlzKTtcbiAgfSxcbiAgZ2V0UG9wdXBDbGFzc05hbWVGcm9tQWxpZ246IGZ1bmN0aW9uIGdldFBvcHVwQ2xhc3NOYW1lRnJvbUFsaWduKGFsaWduKSB7XG4gICAgdmFyIGNsYXNzTmFtZSA9IFtdO1xuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgdmFyIHBvcHVwUGxhY2VtZW50ID0gcHJvcHMucG9wdXBQbGFjZW1lbnQsXG4gICAgICAgIGJ1aWx0aW5QbGFjZW1lbnRzID0gcHJvcHMuYnVpbHRpblBsYWNlbWVudHMsXG4gICAgICAgIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscztcblxuICAgIGlmIChwb3B1cFBsYWNlbWVudCAmJiBidWlsdGluUGxhY2VtZW50cykge1xuICAgICAgY2xhc3NOYW1lLnB1c2goX2dldFBvcHVwQ2xhc3NOYW1lRnJvbUFsaWduKGJ1aWx0aW5QbGFjZW1lbnRzLCBwcmVmaXhDbHMsIGFsaWduKSk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5nZXRQb3B1cENsYXNzTmFtZUZyb21BbGlnbikge1xuICAgICAgY2xhc3NOYW1lLnB1c2gocHJvcHMuZ2V0UG9wdXBDbGFzc05hbWVGcm9tQWxpZ24oYWxpZ24pKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzTmFtZS5qb2luKCcgJyk7XG4gIH0sXG4gIGdldFBvcHVwQWxpZ246IGZ1bmN0aW9uIGdldFBvcHVwQWxpZ24oKSB7XG4gICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICB2YXIgcG9wdXBQbGFjZW1lbnQgPSBwcm9wcy5wb3B1cFBsYWNlbWVudCxcbiAgICAgICAgcG9wdXBBbGlnbiA9IHByb3BzLnBvcHVwQWxpZ24sXG4gICAgICAgIGJ1aWx0aW5QbGFjZW1lbnRzID0gcHJvcHMuYnVpbHRpblBsYWNlbWVudHM7XG5cbiAgICBpZiAocG9wdXBQbGFjZW1lbnQgJiYgYnVpbHRpblBsYWNlbWVudHMpIHtcbiAgICAgIHJldHVybiBnZXRBbGlnbkZyb21QbGFjZW1lbnQoYnVpbHRpblBsYWNlbWVudHMsIHBvcHVwUGxhY2VtZW50LCBwb3B1cEFsaWduKTtcbiAgICB9XG4gICAgcmV0dXJuIHBvcHVwQWxpZ247XG4gIH0sXG4gIGdldENvbXBvbmVudDogZnVuY3Rpb24gZ2V0Q29tcG9uZW50KCkge1xuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIHN0YXRlID0gdGhpcy5zdGF0ZTtcblxuICAgIHZhciBtb3VzZVByb3BzID0ge307XG4gICAgaWYgKHRoaXMuaXNNb3VzZUVudGVyVG9TaG93KCkpIHtcbiAgICAgIG1vdXNlUHJvcHMub25Nb3VzZUVudGVyID0gdGhpcy5vblBvcHVwTW91c2VFbnRlcjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNNb3VzZUxlYXZlVG9IaWRlKCkpIHtcbiAgICAgIG1vdXNlUHJvcHMub25Nb3VzZUxlYXZlID0gdGhpcy5vblBvcHVwTW91c2VMZWF2ZTtcbiAgICB9XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICBQb3B1cCxcbiAgICAgIF9leHRlbmRzKHtcbiAgICAgICAgcHJlZml4Q2xzOiBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICAgIGRlc3Ryb3lQb3B1cE9uSGlkZTogcHJvcHMuZGVzdHJveVBvcHVwT25IaWRlLFxuICAgICAgICB2aXNpYmxlOiBzdGF0ZS5wb3B1cFZpc2libGUsXG4gICAgICAgIGNsYXNzTmFtZTogcHJvcHMucG9wdXBDbGFzc05hbWUsXG4gICAgICAgIGFjdGlvbjogcHJvcHMuYWN0aW9uLFxuICAgICAgICBhbGlnbjogdGhpcy5nZXRQb3B1cEFsaWduKCksXG4gICAgICAgIG9uQWxpZ246IHByb3BzLm9uUG9wdXBBbGlnbixcbiAgICAgICAgYW5pbWF0aW9uOiBwcm9wcy5wb3B1cEFuaW1hdGlvbixcbiAgICAgICAgZ2V0Q2xhc3NOYW1lRnJvbUFsaWduOiB0aGlzLmdldFBvcHVwQ2xhc3NOYW1lRnJvbUFsaWduXG4gICAgICB9LCBtb3VzZVByb3BzLCB7XG4gICAgICAgIGdldFJvb3REb21Ob2RlOiB0aGlzLmdldFJvb3REb21Ob2RlLFxuICAgICAgICBzdHlsZTogcHJvcHMucG9wdXBTdHlsZSxcbiAgICAgICAgbWFzazogcHJvcHMubWFzayxcbiAgICAgICAgekluZGV4OiBwcm9wcy56SW5kZXgsXG4gICAgICAgIHRyYW5zaXRpb25OYW1lOiBwcm9wcy5wb3B1cFRyYW5zaXRpb25OYW1lLFxuICAgICAgICBtYXNrQW5pbWF0aW9uOiBwcm9wcy5tYXNrQW5pbWF0aW9uLFxuICAgICAgICBtYXNrVHJhbnNpdGlvbk5hbWU6IHByb3BzLm1hc2tUcmFuc2l0aW9uTmFtZVxuICAgICAgfSksXG4gICAgICB0eXBlb2YgcHJvcHMucG9wdXAgPT09ICdmdW5jdGlvbicgPyBwcm9wcy5wb3B1cCgpIDogcHJvcHMucG9wdXBcbiAgICApO1xuICB9LFxuICBzZXRQb3B1cFZpc2libGU6IGZ1bmN0aW9uIHNldFBvcHVwVmlzaWJsZShwb3B1cFZpc2libGUpIHtcbiAgICB0aGlzLmNsZWFyRGVsYXlUaW1lcigpO1xuICAgIGlmICh0aGlzLnN0YXRlLnBvcHVwVmlzaWJsZSAhPT0gcG9wdXBWaXNpYmxlKSB7XG4gICAgICBpZiAoISgncG9wdXBWaXNpYmxlJyBpbiB0aGlzLnByb3BzKSkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBwb3B1cFZpc2libGU6IHBvcHVwVmlzaWJsZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMucHJvcHMub25Qb3B1cFZpc2libGVDaGFuZ2UocG9wdXBWaXNpYmxlKTtcbiAgICB9XG4gIH0sXG4gIGRlbGF5U2V0UG9wdXBWaXNpYmxlOiBmdW5jdGlvbiBkZWxheVNldFBvcHVwVmlzaWJsZSh2aXNpYmxlLCBkZWxheVMpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIHZhciBkZWxheSA9IGRlbGF5UyAqIDEwMDA7XG4gICAgdGhpcy5jbGVhckRlbGF5VGltZXIoKTtcbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIHRoaXMuZGVsYXlUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczIuc2V0UG9wdXBWaXNpYmxlKHZpc2libGUpO1xuICAgICAgICBfdGhpczIuY2xlYXJEZWxheVRpbWVyKCk7XG4gICAgICB9LCBkZWxheSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0UG9wdXBWaXNpYmxlKHZpc2libGUpO1xuICAgIH1cbiAgfSxcbiAgY2xlYXJEZWxheVRpbWVyOiBmdW5jdGlvbiBjbGVhckRlbGF5VGltZXIoKSB7XG4gICAgaWYgKHRoaXMuZGVsYXlUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZGVsYXlUaW1lcik7XG4gICAgICB0aGlzLmRlbGF5VGltZXIgPSBudWxsO1xuICAgIH1cbiAgfSxcbiAgY2xlYXJPdXRzaWRlSGFuZGxlcjogZnVuY3Rpb24gY2xlYXJPdXRzaWRlSGFuZGxlcigpIHtcbiAgICBpZiAodGhpcy5jbGlja091dHNpZGVIYW5kbGVyKSB7XG4gICAgICB0aGlzLmNsaWNrT3V0c2lkZUhhbmRsZXIucmVtb3ZlKCk7XG4gICAgICB0aGlzLmNsaWNrT3V0c2lkZUhhbmRsZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRvdWNoT3V0c2lkZUhhbmRsZXIpIHtcbiAgICAgIHRoaXMudG91Y2hPdXRzaWRlSGFuZGxlci5yZW1vdmUoKTtcbiAgICAgIHRoaXMudG91Y2hPdXRzaWRlSGFuZGxlciA9IG51bGw7XG4gICAgfVxuICB9LFxuICBjcmVhdGVUd29DaGFpbnM6IGZ1bmN0aW9uIGNyZWF0ZVR3b0NoYWlucyhldmVudCkge1xuICAgIHZhciBjaGlsZFByb3MgPSB0aGlzLnByb3BzLmNoaWxkcmVuLnByb3BzO1xuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgaWYgKGNoaWxkUHJvc1tldmVudF0gJiYgcHJvcHNbZXZlbnRdKSB7XG4gICAgICByZXR1cm4gdGhpc1snZmlyZScgKyBldmVudF07XG4gICAgfVxuICAgIHJldHVybiBjaGlsZFByb3NbZXZlbnRdIHx8IHByb3BzW2V2ZW50XTtcbiAgfSxcbiAgaXNDbGlja1RvU2hvdzogZnVuY3Rpb24gaXNDbGlja1RvU2hvdygpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgYWN0aW9uID0gX3Byb3BzLmFjdGlvbixcbiAgICAgICAgc2hvd0FjdGlvbiA9IF9wcm9wcy5zaG93QWN0aW9uO1xuXG4gICAgcmV0dXJuIGFjdGlvbi5pbmRleE9mKCdjbGljaycpICE9PSAtMSB8fCBzaG93QWN0aW9uLmluZGV4T2YoJ2NsaWNrJykgIT09IC0xO1xuICB9LFxuICBpc0NsaWNrVG9IaWRlOiBmdW5jdGlvbiBpc0NsaWNrVG9IaWRlKCkge1xuICAgIHZhciBfcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgYWN0aW9uID0gX3Byb3BzMi5hY3Rpb24sXG4gICAgICAgIGhpZGVBY3Rpb24gPSBfcHJvcHMyLmhpZGVBY3Rpb247XG5cbiAgICByZXR1cm4gYWN0aW9uLmluZGV4T2YoJ2NsaWNrJykgIT09IC0xIHx8IGhpZGVBY3Rpb24uaW5kZXhPZignY2xpY2snKSAhPT0gLTE7XG4gIH0sXG4gIGlzTW91c2VFbnRlclRvU2hvdzogZnVuY3Rpb24gaXNNb3VzZUVudGVyVG9TaG93KCkge1xuICAgIHZhciBfcHJvcHMzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgYWN0aW9uID0gX3Byb3BzMy5hY3Rpb24sXG4gICAgICAgIHNob3dBY3Rpb24gPSBfcHJvcHMzLnNob3dBY3Rpb247XG5cbiAgICByZXR1cm4gYWN0aW9uLmluZGV4T2YoJ2hvdmVyJykgIT09IC0xIHx8IHNob3dBY3Rpb24uaW5kZXhPZignbW91c2VFbnRlcicpICE9PSAtMTtcbiAgfSxcbiAgaXNNb3VzZUxlYXZlVG9IaWRlOiBmdW5jdGlvbiBpc01vdXNlTGVhdmVUb0hpZGUoKSB7XG4gICAgdmFyIF9wcm9wczQgPSB0aGlzLnByb3BzLFxuICAgICAgICBhY3Rpb24gPSBfcHJvcHM0LmFjdGlvbixcbiAgICAgICAgaGlkZUFjdGlvbiA9IF9wcm9wczQuaGlkZUFjdGlvbjtcblxuICAgIHJldHVybiBhY3Rpb24uaW5kZXhPZignaG92ZXInKSAhPT0gLTEgfHwgaGlkZUFjdGlvbi5pbmRleE9mKCdtb3VzZUxlYXZlJykgIT09IC0xO1xuICB9LFxuICBpc0ZvY3VzVG9TaG93OiBmdW5jdGlvbiBpc0ZvY3VzVG9TaG93KCkge1xuICAgIHZhciBfcHJvcHM1ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgYWN0aW9uID0gX3Byb3BzNS5hY3Rpb24sXG4gICAgICAgIHNob3dBY3Rpb24gPSBfcHJvcHM1LnNob3dBY3Rpb247XG5cbiAgICByZXR1cm4gYWN0aW9uLmluZGV4T2YoJ2ZvY3VzJykgIT09IC0xIHx8IHNob3dBY3Rpb24uaW5kZXhPZignZm9jdXMnKSAhPT0gLTE7XG4gIH0sXG4gIGlzQmx1clRvSGlkZTogZnVuY3Rpb24gaXNCbHVyVG9IaWRlKCkge1xuICAgIHZhciBfcHJvcHM2ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgYWN0aW9uID0gX3Byb3BzNi5hY3Rpb24sXG4gICAgICAgIGhpZGVBY3Rpb24gPSBfcHJvcHM2LmhpZGVBY3Rpb247XG5cbiAgICByZXR1cm4gYWN0aW9uLmluZGV4T2YoJ2ZvY3VzJykgIT09IC0xIHx8IGhpZGVBY3Rpb24uaW5kZXhPZignYmx1cicpICE9PSAtMTtcbiAgfSxcbiAgZm9yY2VQb3B1cEFsaWduOiBmdW5jdGlvbiBmb3JjZVBvcHVwQWxpZ24oKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUucG9wdXBWaXNpYmxlICYmIHRoaXMuX2NvbXBvbmVudCAmJiB0aGlzLl9jb21wb25lbnQuYWxpZ25JbnN0YW5jZSkge1xuICAgICAgdGhpcy5fY29tcG9uZW50LmFsaWduSW5zdGFuY2UuZm9yY2VBbGlnbigpO1xuICAgIH1cbiAgfSxcbiAgZmlyZUV2ZW50czogZnVuY3Rpb24gZmlyZUV2ZW50cyh0eXBlLCBlKSB7XG4gICAgdmFyIGNoaWxkQ2FsbGJhY2sgPSB0aGlzLnByb3BzLmNoaWxkcmVuLnByb3BzW3R5cGVdO1xuICAgIGlmIChjaGlsZENhbGxiYWNrKSB7XG4gICAgICBjaGlsZENhbGxiYWNrKGUpO1xuICAgIH1cbiAgICB2YXIgY2FsbGJhY2sgPSB0aGlzLnByb3BzW3R5cGVdO1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2soZSk7XG4gICAgfVxuICB9LFxuICBjbG9zZTogZnVuY3Rpb24gY2xvc2UoKSB7XG4gICAgdGhpcy5zZXRQb3B1cFZpc2libGUoZmFsc2UpO1xuICB9LFxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuICAgIHZhciBjaGlsZCA9IFJlYWN0LkNoaWxkcmVuLm9ubHkoY2hpbGRyZW4pO1xuICAgIHZhciBuZXdDaGlsZFByb3BzID0ge307XG4gICAgaWYgKHRoaXMuaXNDbGlja1RvSGlkZSgpIHx8IHRoaXMuaXNDbGlja1RvU2hvdygpKSB7XG4gICAgICBuZXdDaGlsZFByb3BzLm9uQ2xpY2sgPSB0aGlzLm9uQ2xpY2s7XG4gICAgICBuZXdDaGlsZFByb3BzLm9uTW91c2VEb3duID0gdGhpcy5vbk1vdXNlRG93bjtcbiAgICAgIG5ld0NoaWxkUHJvcHMub25Ub3VjaFN0YXJ0ID0gdGhpcy5vblRvdWNoU3RhcnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0NoaWxkUHJvcHMub25DbGljayA9IHRoaXMuY3JlYXRlVHdvQ2hhaW5zKCdvbkNsaWNrJyk7XG4gICAgICBuZXdDaGlsZFByb3BzLm9uTW91c2VEb3duID0gdGhpcy5jcmVhdGVUd29DaGFpbnMoJ29uTW91c2VEb3duJyk7XG4gICAgICBuZXdDaGlsZFByb3BzLm9uVG91Y2hTdGFydCA9IHRoaXMuY3JlYXRlVHdvQ2hhaW5zKCdvblRvdWNoU3RhcnQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNNb3VzZUVudGVyVG9TaG93KCkpIHtcbiAgICAgIG5ld0NoaWxkUHJvcHMub25Nb3VzZUVudGVyID0gdGhpcy5vbk1vdXNlRW50ZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0NoaWxkUHJvcHMub25Nb3VzZUVudGVyID0gdGhpcy5jcmVhdGVUd29DaGFpbnMoJ29uTW91c2VFbnRlcicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc01vdXNlTGVhdmVUb0hpZGUoKSkge1xuICAgICAgbmV3Q2hpbGRQcm9wcy5vbk1vdXNlTGVhdmUgPSB0aGlzLm9uTW91c2VMZWF2ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3Q2hpbGRQcm9wcy5vbk1vdXNlTGVhdmUgPSB0aGlzLmNyZWF0ZVR3b0NoYWlucygnb25Nb3VzZUxlYXZlJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzRm9jdXNUb1Nob3coKSB8fCB0aGlzLmlzQmx1clRvSGlkZSgpKSB7XG4gICAgICBuZXdDaGlsZFByb3BzLm9uRm9jdXMgPSB0aGlzLm9uRm9jdXM7XG4gICAgICBuZXdDaGlsZFByb3BzLm9uQmx1ciA9IHRoaXMub25CbHVyO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdDaGlsZFByb3BzLm9uRm9jdXMgPSB0aGlzLmNyZWF0ZVR3b0NoYWlucygnb25Gb2N1cycpO1xuICAgICAgbmV3Q2hpbGRQcm9wcy5vbkJsdXIgPSB0aGlzLmNyZWF0ZVR3b0NoYWlucygnb25CbHVyJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudChjaGlsZCwgbmV3Q2hpbGRQcm9wcyk7XG4gIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBUcmlnZ2VyOyIsIi8vIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkLiBJdCdzIHVzZWQgdG8gcHVibGlzaCBDSlMgdG8gbnBtLlxuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsVGhpcyA6IGdsb2JhbCB8fCBzZWxmLCBnbG9iYWwudGlueWNvbG9yID0gZmFjdG9yeSgpKTtcbn0pKHRoaXMsIChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuICBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICAgIHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gICAgfSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gICAgfSwgX3R5cGVvZihvYmopO1xuICB9XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Jncmlucy9UaW55Q29sb3JcbiAgLy8gQnJpYW4gR3JpbnN0ZWFkLCBNSVQgTGljZW5zZVxuXG4gIHZhciB0cmltTGVmdCA9IC9eXFxzKy87XG4gIHZhciB0cmltUmlnaHQgPSAvXFxzKyQvO1xuICBmdW5jdGlvbiB0aW55Y29sb3IoY29sb3IsIG9wdHMpIHtcbiAgICBjb2xvciA9IGNvbG9yID8gY29sb3IgOiBcIlwiO1xuICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuXG4gICAgLy8gSWYgaW5wdXQgaXMgYWxyZWFkeSBhIHRpbnljb2xvciwgcmV0dXJuIGl0c2VsZlxuICAgIGlmIChjb2xvciBpbnN0YW5jZW9mIHRpbnljb2xvcikge1xuICAgICAgcmV0dXJuIGNvbG9yO1xuICAgIH1cbiAgICAvLyBJZiB3ZSBhcmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24sIGNhbGwgdXNpbmcgbmV3IGluc3RlYWRcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgdGlueWNvbG9yKSkge1xuICAgICAgcmV0dXJuIG5ldyB0aW55Y29sb3IoY29sb3IsIG9wdHMpO1xuICAgIH1cbiAgICB2YXIgcmdiID0gaW5wdXRUb1JHQihjb2xvcik7XG4gICAgdGhpcy5fb3JpZ2luYWxJbnB1dCA9IGNvbG9yLCB0aGlzLl9yID0gcmdiLnIsIHRoaXMuX2cgPSByZ2IuZywgdGhpcy5fYiA9IHJnYi5iLCB0aGlzLl9hID0gcmdiLmEsIHRoaXMuX3JvdW5kQSA9IE1hdGgucm91bmQoMTAwICogdGhpcy5fYSkgLyAxMDAsIHRoaXMuX2Zvcm1hdCA9IG9wdHMuZm9ybWF0IHx8IHJnYi5mb3JtYXQ7XG4gICAgdGhpcy5fZ3JhZGllbnRUeXBlID0gb3B0cy5ncmFkaWVudFR5cGU7XG5cbiAgICAvLyBEb24ndCBsZXQgdGhlIHJhbmdlIG9mIFswLDI1NV0gY29tZSBiYWNrIGluIFswLDFdLlxuICAgIC8vIFBvdGVudGlhbGx5IGxvc2UgYSBsaXR0bGUgYml0IG9mIHByZWNpc2lvbiBoZXJlLCBidXQgd2lsbCBmaXggaXNzdWVzIHdoZXJlXG4gICAgLy8gLjUgZ2V0cyBpbnRlcnByZXRlZCBhcyBoYWxmIG9mIHRoZSB0b3RhbCwgaW5zdGVhZCBvZiBoYWxmIG9mIDFcbiAgICAvLyBJZiBpdCB3YXMgc3VwcG9zZWQgdG8gYmUgMTI4LCB0aGlzIHdhcyBhbHJlYWR5IHRha2VuIGNhcmUgb2YgYnkgYGlucHV0VG9SZ2JgXG4gICAgaWYgKHRoaXMuX3IgPCAxKSB0aGlzLl9yID0gTWF0aC5yb3VuZCh0aGlzLl9yKTtcbiAgICBpZiAodGhpcy5fZyA8IDEpIHRoaXMuX2cgPSBNYXRoLnJvdW5kKHRoaXMuX2cpO1xuICAgIGlmICh0aGlzLl9iIDwgMSkgdGhpcy5fYiA9IE1hdGgucm91bmQodGhpcy5fYik7XG4gICAgdGhpcy5fb2sgPSByZ2Iub2s7XG4gIH1cbiAgdGlueWNvbG9yLnByb3RvdHlwZSA9IHtcbiAgICBpc0Rhcms6IGZ1bmN0aW9uIGlzRGFyaygpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEJyaWdodG5lc3MoKSA8IDEyODtcbiAgICB9LFxuICAgIGlzTGlnaHQ6IGZ1bmN0aW9uIGlzTGlnaHQoKSB7XG4gICAgICByZXR1cm4gIXRoaXMuaXNEYXJrKCk7XG4gICAgfSxcbiAgICBpc1ZhbGlkOiBmdW5jdGlvbiBpc1ZhbGlkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX29rO1xuICAgIH0sXG4gICAgZ2V0T3JpZ2luYWxJbnB1dDogZnVuY3Rpb24gZ2V0T3JpZ2luYWxJbnB1dCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9vcmlnaW5hbElucHV0O1xuICAgIH0sXG4gICAgZ2V0Rm9ybWF0OiBmdW5jdGlvbiBnZXRGb3JtYXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZm9ybWF0O1xuICAgIH0sXG4gICAgZ2V0QWxwaGE6IGZ1bmN0aW9uIGdldEFscGhhKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2E7XG4gICAgfSxcbiAgICBnZXRCcmlnaHRuZXNzOiBmdW5jdGlvbiBnZXRCcmlnaHRuZXNzKCkge1xuICAgICAgLy9odHRwOi8vd3d3LnczLm9yZy9UUi9BRVJUI2NvbG9yLWNvbnRyYXN0XG4gICAgICB2YXIgcmdiID0gdGhpcy50b1JnYigpO1xuICAgICAgcmV0dXJuIChyZ2IuciAqIDI5OSArIHJnYi5nICogNTg3ICsgcmdiLmIgKiAxMTQpIC8gMTAwMDtcbiAgICB9LFxuICAgIGdldEx1bWluYW5jZTogZnVuY3Rpb24gZ2V0THVtaW5hbmNlKCkge1xuICAgICAgLy9odHRwOi8vd3d3LnczLm9yZy9UUi8yMDA4L1JFQy1XQ0FHMjAtMjAwODEyMTEvI3JlbGF0aXZlbHVtaW5hbmNlZGVmXG4gICAgICB2YXIgcmdiID0gdGhpcy50b1JnYigpO1xuICAgICAgdmFyIFJzUkdCLCBHc1JHQiwgQnNSR0IsIFIsIEcsIEI7XG4gICAgICBSc1JHQiA9IHJnYi5yIC8gMjU1O1xuICAgICAgR3NSR0IgPSByZ2IuZyAvIDI1NTtcbiAgICAgIEJzUkdCID0gcmdiLmIgLyAyNTU7XG4gICAgICBpZiAoUnNSR0IgPD0gMC4wMzkyOCkgUiA9IFJzUkdCIC8gMTIuOTI7ZWxzZSBSID0gTWF0aC5wb3coKFJzUkdCICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgICBpZiAoR3NSR0IgPD0gMC4wMzkyOCkgRyA9IEdzUkdCIC8gMTIuOTI7ZWxzZSBHID0gTWF0aC5wb3coKEdzUkdCICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgICBpZiAoQnNSR0IgPD0gMC4wMzkyOCkgQiA9IEJzUkdCIC8gMTIuOTI7ZWxzZSBCID0gTWF0aC5wb3coKEJzUkdCICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgICByZXR1cm4gMC4yMTI2ICogUiArIDAuNzE1MiAqIEcgKyAwLjA3MjIgKiBCO1xuICAgIH0sXG4gICAgc2V0QWxwaGE6IGZ1bmN0aW9uIHNldEFscGhhKHZhbHVlKSB7XG4gICAgICB0aGlzLl9hID0gYm91bmRBbHBoYSh2YWx1ZSk7XG4gICAgICB0aGlzLl9yb3VuZEEgPSBNYXRoLnJvdW5kKDEwMCAqIHRoaXMuX2EpIC8gMTAwO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICB0b0hzdjogZnVuY3Rpb24gdG9Ic3YoKSB7XG4gICAgICB2YXIgaHN2ID0gcmdiVG9Ic3YodGhpcy5fciwgdGhpcy5fZywgdGhpcy5fYik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBoOiBoc3YuaCAqIDM2MCxcbiAgICAgICAgczogaHN2LnMsXG4gICAgICAgIHY6IGhzdi52LFxuICAgICAgICBhOiB0aGlzLl9hXG4gICAgICB9O1xuICAgIH0sXG4gICAgdG9Ic3ZTdHJpbmc6IGZ1bmN0aW9uIHRvSHN2U3RyaW5nKCkge1xuICAgICAgdmFyIGhzdiA9IHJnYlRvSHN2KHRoaXMuX3IsIHRoaXMuX2csIHRoaXMuX2IpO1xuICAgICAgdmFyIGggPSBNYXRoLnJvdW5kKGhzdi5oICogMzYwKSxcbiAgICAgICAgcyA9IE1hdGgucm91bmQoaHN2LnMgKiAxMDApLFxuICAgICAgICB2ID0gTWF0aC5yb3VuZChoc3YudiAqIDEwMCk7XG4gICAgICByZXR1cm4gdGhpcy5fYSA9PSAxID8gXCJoc3YoXCIgKyBoICsgXCIsIFwiICsgcyArIFwiJSwgXCIgKyB2ICsgXCIlKVwiIDogXCJoc3ZhKFwiICsgaCArIFwiLCBcIiArIHMgKyBcIiUsIFwiICsgdiArIFwiJSwgXCIgKyB0aGlzLl9yb3VuZEEgKyBcIilcIjtcbiAgICB9LFxuICAgIHRvSHNsOiBmdW5jdGlvbiB0b0hzbCgpIHtcbiAgICAgIHZhciBoc2wgPSByZ2JUb0hzbCh0aGlzLl9yLCB0aGlzLl9nLCB0aGlzLl9iKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGg6IGhzbC5oICogMzYwLFxuICAgICAgICBzOiBoc2wucyxcbiAgICAgICAgbDogaHNsLmwsXG4gICAgICAgIGE6IHRoaXMuX2FcbiAgICAgIH07XG4gICAgfSxcbiAgICB0b0hzbFN0cmluZzogZnVuY3Rpb24gdG9Ic2xTdHJpbmcoKSB7XG4gICAgICB2YXIgaHNsID0gcmdiVG9Ic2wodGhpcy5fciwgdGhpcy5fZywgdGhpcy5fYik7XG4gICAgICB2YXIgaCA9IE1hdGgucm91bmQoaHNsLmggKiAzNjApLFxuICAgICAgICBzID0gTWF0aC5yb3VuZChoc2wucyAqIDEwMCksXG4gICAgICAgIGwgPSBNYXRoLnJvdW5kKGhzbC5sICogMTAwKTtcbiAgICAgIHJldHVybiB0aGlzLl9hID09IDEgPyBcImhzbChcIiArIGggKyBcIiwgXCIgKyBzICsgXCIlLCBcIiArIGwgKyBcIiUpXCIgOiBcImhzbGEoXCIgKyBoICsgXCIsIFwiICsgcyArIFwiJSwgXCIgKyBsICsgXCIlLCBcIiArIHRoaXMuX3JvdW5kQSArIFwiKVwiO1xuICAgIH0sXG4gICAgdG9IZXg6IGZ1bmN0aW9uIHRvSGV4KGFsbG93M0NoYXIpIHtcbiAgICAgIHJldHVybiByZ2JUb0hleCh0aGlzLl9yLCB0aGlzLl9nLCB0aGlzLl9iLCBhbGxvdzNDaGFyKTtcbiAgICB9LFxuICAgIHRvSGV4U3RyaW5nOiBmdW5jdGlvbiB0b0hleFN0cmluZyhhbGxvdzNDaGFyKSB7XG4gICAgICByZXR1cm4gXCIjXCIgKyB0aGlzLnRvSGV4KGFsbG93M0NoYXIpO1xuICAgIH0sXG4gICAgdG9IZXg4OiBmdW5jdGlvbiB0b0hleDgoYWxsb3c0Q2hhcikge1xuICAgICAgcmV0dXJuIHJnYmFUb0hleCh0aGlzLl9yLCB0aGlzLl9nLCB0aGlzLl9iLCB0aGlzLl9hLCBhbGxvdzRDaGFyKTtcbiAgICB9LFxuICAgIHRvSGV4OFN0cmluZzogZnVuY3Rpb24gdG9IZXg4U3RyaW5nKGFsbG93NENoYXIpIHtcbiAgICAgIHJldHVybiBcIiNcIiArIHRoaXMudG9IZXg4KGFsbG93NENoYXIpO1xuICAgIH0sXG4gICAgdG9SZ2I6IGZ1bmN0aW9uIHRvUmdiKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcjogTWF0aC5yb3VuZCh0aGlzLl9yKSxcbiAgICAgICAgZzogTWF0aC5yb3VuZCh0aGlzLl9nKSxcbiAgICAgICAgYjogTWF0aC5yb3VuZCh0aGlzLl9iKSxcbiAgICAgICAgYTogdGhpcy5fYVxuICAgICAgfTtcbiAgICB9LFxuICAgIHRvUmdiU3RyaW5nOiBmdW5jdGlvbiB0b1JnYlN0cmluZygpIHtcbiAgICAgIHJldHVybiB0aGlzLl9hID09IDEgPyBcInJnYihcIiArIE1hdGgucm91bmQodGhpcy5fcikgKyBcIiwgXCIgKyBNYXRoLnJvdW5kKHRoaXMuX2cpICsgXCIsIFwiICsgTWF0aC5yb3VuZCh0aGlzLl9iKSArIFwiKVwiIDogXCJyZ2JhKFwiICsgTWF0aC5yb3VuZCh0aGlzLl9yKSArIFwiLCBcIiArIE1hdGgucm91bmQodGhpcy5fZykgKyBcIiwgXCIgKyBNYXRoLnJvdW5kKHRoaXMuX2IpICsgXCIsIFwiICsgdGhpcy5fcm91bmRBICsgXCIpXCI7XG4gICAgfSxcbiAgICB0b1BlcmNlbnRhZ2VSZ2I6IGZ1bmN0aW9uIHRvUGVyY2VudGFnZVJnYigpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHI6IE1hdGgucm91bmQoYm91bmQwMSh0aGlzLl9yLCAyNTUpICogMTAwKSArIFwiJVwiLFxuICAgICAgICBnOiBNYXRoLnJvdW5kKGJvdW5kMDEodGhpcy5fZywgMjU1KSAqIDEwMCkgKyBcIiVcIixcbiAgICAgICAgYjogTWF0aC5yb3VuZChib3VuZDAxKHRoaXMuX2IsIDI1NSkgKiAxMDApICsgXCIlXCIsXG4gICAgICAgIGE6IHRoaXMuX2FcbiAgICAgIH07XG4gICAgfSxcbiAgICB0b1BlcmNlbnRhZ2VSZ2JTdHJpbmc6IGZ1bmN0aW9uIHRvUGVyY2VudGFnZVJnYlN0cmluZygpIHtcbiAgICAgIHJldHVybiB0aGlzLl9hID09IDEgPyBcInJnYihcIiArIE1hdGgucm91bmQoYm91bmQwMSh0aGlzLl9yLCAyNTUpICogMTAwKSArIFwiJSwgXCIgKyBNYXRoLnJvdW5kKGJvdW5kMDEodGhpcy5fZywgMjU1KSAqIDEwMCkgKyBcIiUsIFwiICsgTWF0aC5yb3VuZChib3VuZDAxKHRoaXMuX2IsIDI1NSkgKiAxMDApICsgXCIlKVwiIDogXCJyZ2JhKFwiICsgTWF0aC5yb3VuZChib3VuZDAxKHRoaXMuX3IsIDI1NSkgKiAxMDApICsgXCIlLCBcIiArIE1hdGgucm91bmQoYm91bmQwMSh0aGlzLl9nLCAyNTUpICogMTAwKSArIFwiJSwgXCIgKyBNYXRoLnJvdW5kKGJvdW5kMDEodGhpcy5fYiwgMjU1KSAqIDEwMCkgKyBcIiUsIFwiICsgdGhpcy5fcm91bmRBICsgXCIpXCI7XG4gICAgfSxcbiAgICB0b05hbWU6IGZ1bmN0aW9uIHRvTmFtZSgpIHtcbiAgICAgIGlmICh0aGlzLl9hID09PSAwKSB7XG4gICAgICAgIHJldHVybiBcInRyYW5zcGFyZW50XCI7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fYSA8IDEpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhleE5hbWVzW3JnYlRvSGV4KHRoaXMuX3IsIHRoaXMuX2csIHRoaXMuX2IsIHRydWUpXSB8fCBmYWxzZTtcbiAgICB9LFxuICAgIHRvRmlsdGVyOiBmdW5jdGlvbiB0b0ZpbHRlcihzZWNvbmRDb2xvcikge1xuICAgICAgdmFyIGhleDhTdHJpbmcgPSBcIiNcIiArIHJnYmFUb0FyZ2JIZXgodGhpcy5fciwgdGhpcy5fZywgdGhpcy5fYiwgdGhpcy5fYSk7XG4gICAgICB2YXIgc2Vjb25kSGV4OFN0cmluZyA9IGhleDhTdHJpbmc7XG4gICAgICB2YXIgZ3JhZGllbnRUeXBlID0gdGhpcy5fZ3JhZGllbnRUeXBlID8gXCJHcmFkaWVudFR5cGUgPSAxLCBcIiA6IFwiXCI7XG4gICAgICBpZiAoc2Vjb25kQ29sb3IpIHtcbiAgICAgICAgdmFyIHMgPSB0aW55Y29sb3Ioc2Vjb25kQ29sb3IpO1xuICAgICAgICBzZWNvbmRIZXg4U3RyaW5nID0gXCIjXCIgKyByZ2JhVG9BcmdiSGV4KHMuX3IsIHMuX2csIHMuX2IsIHMuX2EpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFwicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KFwiICsgZ3JhZGllbnRUeXBlICsgXCJzdGFydENvbG9yc3RyPVwiICsgaGV4OFN0cmluZyArIFwiLGVuZENvbG9yc3RyPVwiICsgc2Vjb25kSGV4OFN0cmluZyArIFwiKVwiO1xuICAgIH0sXG4gICAgdG9TdHJpbmc6IGZ1bmN0aW9uIHRvU3RyaW5nKGZvcm1hdCkge1xuICAgICAgdmFyIGZvcm1hdFNldCA9ICEhZm9ybWF0O1xuICAgICAgZm9ybWF0ID0gZm9ybWF0IHx8IHRoaXMuX2Zvcm1hdDtcbiAgICAgIHZhciBmb3JtYXR0ZWRTdHJpbmcgPSBmYWxzZTtcbiAgICAgIHZhciBoYXNBbHBoYSA9IHRoaXMuX2EgPCAxICYmIHRoaXMuX2EgPj0gMDtcbiAgICAgIHZhciBuZWVkc0FscGhhRm9ybWF0ID0gIWZvcm1hdFNldCAmJiBoYXNBbHBoYSAmJiAoZm9ybWF0ID09PSBcImhleFwiIHx8IGZvcm1hdCA9PT0gXCJoZXg2XCIgfHwgZm9ybWF0ID09PSBcImhleDNcIiB8fCBmb3JtYXQgPT09IFwiaGV4NFwiIHx8IGZvcm1hdCA9PT0gXCJoZXg4XCIgfHwgZm9ybWF0ID09PSBcIm5hbWVcIik7XG4gICAgICBpZiAobmVlZHNBbHBoYUZvcm1hdCkge1xuICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIFwidHJhbnNwYXJlbnRcIiwgYWxsIG90aGVyIG5vbi1hbHBoYSBmb3JtYXRzXG4gICAgICAgIC8vIHdpbGwgcmV0dXJuIHJnYmEgd2hlbiB0aGVyZSBpcyB0cmFuc3BhcmVuY3kuXG4gICAgICAgIGlmIChmb3JtYXQgPT09IFwibmFtZVwiICYmIHRoaXMuX2EgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy50b05hbWUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy50b1JnYlN0cmluZygpO1xuICAgICAgfVxuICAgICAgaWYgKGZvcm1hdCA9PT0gXCJyZ2JcIikge1xuICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvUmdiU3RyaW5nKCk7XG4gICAgICB9XG4gICAgICBpZiAoZm9ybWF0ID09PSBcInByZ2JcIikge1xuICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvUGVyY2VudGFnZVJnYlN0cmluZygpO1xuICAgICAgfVxuICAgICAgaWYgKGZvcm1hdCA9PT0gXCJoZXhcIiB8fCBmb3JtYXQgPT09IFwiaGV4NlwiKSB7XG4gICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9IZXhTdHJpbmcoKTtcbiAgICAgIH1cbiAgICAgIGlmIChmb3JtYXQgPT09IFwiaGV4M1wiKSB7XG4gICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9IZXhTdHJpbmcodHJ1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoZm9ybWF0ID09PSBcImhleDRcIikge1xuICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvSGV4OFN0cmluZyh0cnVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChmb3JtYXQgPT09IFwiaGV4OFwiKSB7XG4gICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9IZXg4U3RyaW5nKCk7XG4gICAgICB9XG4gICAgICBpZiAoZm9ybWF0ID09PSBcIm5hbWVcIikge1xuICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvTmFtZSgpO1xuICAgICAgfVxuICAgICAgaWYgKGZvcm1hdCA9PT0gXCJoc2xcIikge1xuICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvSHNsU3RyaW5nKCk7XG4gICAgICB9XG4gICAgICBpZiAoZm9ybWF0ID09PSBcImhzdlwiKSB7XG4gICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9Ic3ZTdHJpbmcoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmb3JtYXR0ZWRTdHJpbmcgfHwgdGhpcy50b0hleFN0cmluZygpO1xuICAgIH0sXG4gICAgY2xvbmU6IGZ1bmN0aW9uIGNsb25lKCkge1xuICAgICAgcmV0dXJuIHRpbnljb2xvcih0aGlzLnRvU3RyaW5nKCkpO1xuICAgIH0sXG4gICAgX2FwcGx5TW9kaWZpY2F0aW9uOiBmdW5jdGlvbiBfYXBwbHlNb2RpZmljYXRpb24oZm4sIGFyZ3MpIHtcbiAgICAgIHZhciBjb2xvciA9IGZuLmFwcGx5KG51bGwsIFt0aGlzXS5jb25jYXQoW10uc2xpY2UuY2FsbChhcmdzKSkpO1xuICAgICAgdGhpcy5fciA9IGNvbG9yLl9yO1xuICAgICAgdGhpcy5fZyA9IGNvbG9yLl9nO1xuICAgICAgdGhpcy5fYiA9IGNvbG9yLl9iO1xuICAgICAgdGhpcy5zZXRBbHBoYShjb2xvci5fYSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIGxpZ2h0ZW46IGZ1bmN0aW9uIGxpZ2h0ZW4oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYXBwbHlNb2RpZmljYXRpb24oX2xpZ2h0ZW4sIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBicmlnaHRlbjogZnVuY3Rpb24gYnJpZ2h0ZW4oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYXBwbHlNb2RpZmljYXRpb24oX2JyaWdodGVuLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgZGFya2VuOiBmdW5jdGlvbiBkYXJrZW4oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYXBwbHlNb2RpZmljYXRpb24oX2RhcmtlbiwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIGRlc2F0dXJhdGU6IGZ1bmN0aW9uIGRlc2F0dXJhdGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYXBwbHlNb2RpZmljYXRpb24oX2Rlc2F0dXJhdGUsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBzYXR1cmF0ZTogZnVuY3Rpb24gc2F0dXJhdGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYXBwbHlNb2RpZmljYXRpb24oX3NhdHVyYXRlLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgZ3JleXNjYWxlOiBmdW5jdGlvbiBncmV5c2NhbGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYXBwbHlNb2RpZmljYXRpb24oX2dyZXlzY2FsZSwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIHNwaW46IGZ1bmN0aW9uIHNwaW4oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYXBwbHlNb2RpZmljYXRpb24oX3NwaW4sIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBfYXBwbHlDb21iaW5hdGlvbjogZnVuY3Rpb24gX2FwcGx5Q29tYmluYXRpb24oZm4sIGFyZ3MpIHtcbiAgICAgIHJldHVybiBmbi5hcHBseShudWxsLCBbdGhpc10uY29uY2F0KFtdLnNsaWNlLmNhbGwoYXJncykpKTtcbiAgICB9LFxuICAgIGFuYWxvZ291czogZnVuY3Rpb24gYW5hbG9nb3VzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5Q29tYmluYXRpb24oX2FuYWxvZ291cywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIGNvbXBsZW1lbnQ6IGZ1bmN0aW9uIGNvbXBsZW1lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYXBwbHlDb21iaW5hdGlvbihfY29tcGxlbWVudCwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIG1vbm9jaHJvbWF0aWM6IGZ1bmN0aW9uIG1vbm9jaHJvbWF0aWMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYXBwbHlDb21iaW5hdGlvbihfbW9ub2Nocm9tYXRpYywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIHNwbGl0Y29tcGxlbWVudDogZnVuY3Rpb24gc3BsaXRjb21wbGVtZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5Q29tYmluYXRpb24oX3NwbGl0Y29tcGxlbWVudCwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIC8vIERpc2FibGVkIHVudGlsIGh0dHBzOi8vZ2l0aHViLmNvbS9iZ3JpbnMvVGlueUNvbG9yL2lzc3Vlcy8yNTRcbiAgICAvLyBwb2x5YWQ6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAvLyAgIHJldHVybiB0aGlzLl9hcHBseUNvbWJpbmF0aW9uKHBvbHlhZCwgW251bWJlcl0pO1xuICAgIC8vIH0sXG4gICAgdHJpYWQ6IGZ1bmN0aW9uIHRyaWFkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5Q29tYmluYXRpb24ocG9seWFkLCBbM10pO1xuICAgIH0sXG4gICAgdGV0cmFkOiBmdW5jdGlvbiB0ZXRyYWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYXBwbHlDb21iaW5hdGlvbihwb2x5YWQsIFs0XSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIElmIGlucHV0IGlzIGFuIG9iamVjdCwgZm9yY2UgMSBpbnRvIFwiMS4wXCIgdG8gaGFuZGxlIHJhdGlvcyBwcm9wZXJseVxuICAvLyBTdHJpbmcgaW5wdXQgcmVxdWlyZXMgXCIxLjBcIiBhcyBpbnB1dCwgc28gMSB3aWxsIGJlIHRyZWF0ZWQgYXMgMVxuICB0aW55Y29sb3IuZnJvbVJhdGlvID0gZnVuY3Rpb24gKGNvbG9yLCBvcHRzKSB7XG4gICAgaWYgKF90eXBlb2YoY29sb3IpID09IFwib2JqZWN0XCIpIHtcbiAgICAgIHZhciBuZXdDb2xvciA9IHt9O1xuICAgICAgZm9yICh2YXIgaSBpbiBjb2xvcikge1xuICAgICAgICBpZiAoY29sb3IuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICBpZiAoaSA9PT0gXCJhXCIpIHtcbiAgICAgICAgICAgIG5ld0NvbG9yW2ldID0gY29sb3JbaV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld0NvbG9yW2ldID0gY29udmVydFRvUGVyY2VudGFnZShjb2xvcltpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb2xvciA9IG5ld0NvbG9yO1xuICAgIH1cbiAgICByZXR1cm4gdGlueWNvbG9yKGNvbG9yLCBvcHRzKTtcbiAgfTtcblxuICAvLyBHaXZlbiBhIHN0cmluZyBvciBvYmplY3QsIGNvbnZlcnQgdGhhdCBpbnB1dCB0byBSR0JcbiAgLy8gUG9zc2libGUgc3RyaW5nIGlucHV0czpcbiAgLy9cbiAgLy8gICAgIFwicmVkXCJcbiAgLy8gICAgIFwiI2YwMFwiIG9yIFwiZjAwXCJcbiAgLy8gICAgIFwiI2ZmMDAwMFwiIG9yIFwiZmYwMDAwXCJcbiAgLy8gICAgIFwiI2ZmMDAwMDAwXCIgb3IgXCJmZjAwMDAwMFwiXG4gIC8vICAgICBcInJnYiAyNTUgMCAwXCIgb3IgXCJyZ2IgKDI1NSwgMCwgMClcIlxuICAvLyAgICAgXCJyZ2IgMS4wIDAgMFwiIG9yIFwicmdiICgxLCAwLCAwKVwiXG4gIC8vICAgICBcInJnYmEgKDI1NSwgMCwgMCwgMSlcIiBvciBcInJnYmEgMjU1LCAwLCAwLCAxXCJcbiAgLy8gICAgIFwicmdiYSAoMS4wLCAwLCAwLCAxKVwiIG9yIFwicmdiYSAxLjAsIDAsIDAsIDFcIlxuICAvLyAgICAgXCJoc2woMCwgMTAwJSwgNTAlKVwiIG9yIFwiaHNsIDAgMTAwJSA1MCVcIlxuICAvLyAgICAgXCJoc2xhKDAsIDEwMCUsIDUwJSwgMSlcIiBvciBcImhzbGEgMCAxMDAlIDUwJSwgMVwiXG4gIC8vICAgICBcImhzdigwLCAxMDAlLCAxMDAlKVwiIG9yIFwiaHN2IDAgMTAwJSAxMDAlXCJcbiAgLy9cbiAgZnVuY3Rpb24gaW5wdXRUb1JHQihjb2xvcikge1xuICAgIHZhciByZ2IgPSB7XG4gICAgICByOiAwLFxuICAgICAgZzogMCxcbiAgICAgIGI6IDBcbiAgICB9O1xuICAgIHZhciBhID0gMTtcbiAgICB2YXIgcyA9IG51bGw7XG4gICAgdmFyIHYgPSBudWxsO1xuICAgIHZhciBsID0gbnVsbDtcbiAgICB2YXIgb2sgPSBmYWxzZTtcbiAgICB2YXIgZm9ybWF0ID0gZmFsc2U7XG4gICAgaWYgKHR5cGVvZiBjb2xvciA9PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb2xvciA9IHN0cmluZ0lucHV0VG9PYmplY3QoY29sb3IpO1xuICAgIH1cbiAgICBpZiAoX3R5cGVvZihjb2xvcikgPT0gXCJvYmplY3RcIikge1xuICAgICAgaWYgKGlzVmFsaWRDU1NVbml0KGNvbG9yLnIpICYmIGlzVmFsaWRDU1NVbml0KGNvbG9yLmcpICYmIGlzVmFsaWRDU1NVbml0KGNvbG9yLmIpKSB7XG4gICAgICAgIHJnYiA9IHJnYlRvUmdiKGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIpO1xuICAgICAgICBvayA9IHRydWU7XG4gICAgICAgIGZvcm1hdCA9IFN0cmluZyhjb2xvci5yKS5zdWJzdHIoLTEpID09PSBcIiVcIiA/IFwicHJnYlwiIDogXCJyZ2JcIjtcbiAgICAgIH0gZWxzZSBpZiAoaXNWYWxpZENTU1VuaXQoY29sb3IuaCkgJiYgaXNWYWxpZENTU1VuaXQoY29sb3IucykgJiYgaXNWYWxpZENTU1VuaXQoY29sb3IudikpIHtcbiAgICAgICAgcyA9IGNvbnZlcnRUb1BlcmNlbnRhZ2UoY29sb3Iucyk7XG4gICAgICAgIHYgPSBjb252ZXJ0VG9QZXJjZW50YWdlKGNvbG9yLnYpO1xuICAgICAgICByZ2IgPSBoc3ZUb1JnYihjb2xvci5oLCBzLCB2KTtcbiAgICAgICAgb2sgPSB0cnVlO1xuICAgICAgICBmb3JtYXQgPSBcImhzdlwiO1xuICAgICAgfSBlbHNlIGlmIChpc1ZhbGlkQ1NTVW5pdChjb2xvci5oKSAmJiBpc1ZhbGlkQ1NTVW5pdChjb2xvci5zKSAmJiBpc1ZhbGlkQ1NTVW5pdChjb2xvci5sKSkge1xuICAgICAgICBzID0gY29udmVydFRvUGVyY2VudGFnZShjb2xvci5zKTtcbiAgICAgICAgbCA9IGNvbnZlcnRUb1BlcmNlbnRhZ2UoY29sb3IubCk7XG4gICAgICAgIHJnYiA9IGhzbFRvUmdiKGNvbG9yLmgsIHMsIGwpO1xuICAgICAgICBvayA9IHRydWU7XG4gICAgICAgIGZvcm1hdCA9IFwiaHNsXCI7XG4gICAgICB9XG4gICAgICBpZiAoY29sb3IuaGFzT3duUHJvcGVydHkoXCJhXCIpKSB7XG4gICAgICAgIGEgPSBjb2xvci5hO1xuICAgICAgfVxuICAgIH1cbiAgICBhID0gYm91bmRBbHBoYShhKTtcbiAgICByZXR1cm4ge1xuICAgICAgb2s6IG9rLFxuICAgICAgZm9ybWF0OiBjb2xvci5mb3JtYXQgfHwgZm9ybWF0LFxuICAgICAgcjogTWF0aC5taW4oMjU1LCBNYXRoLm1heChyZ2IuciwgMCkpLFxuICAgICAgZzogTWF0aC5taW4oMjU1LCBNYXRoLm1heChyZ2IuZywgMCkpLFxuICAgICAgYjogTWF0aC5taW4oMjU1LCBNYXRoLm1heChyZ2IuYiwgMCkpLFxuICAgICAgYTogYVxuICAgIH07XG4gIH1cblxuICAvLyBDb252ZXJzaW9uIEZ1bmN0aW9uc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8vIGByZ2JUb0hzbGAsIGByZ2JUb0hzdmAsIGBoc2xUb1JnYmAsIGBoc3ZUb1JnYmAgbW9kaWZpZWQgZnJvbTpcbiAgLy8gPGh0dHA6Ly9tamlqYWNrc29uLmNvbS8yMDA4LzAyL3JnYi10by1oc2wtYW5kLXJnYi10by1oc3YtY29sb3ItbW9kZWwtY29udmVyc2lvbi1hbGdvcml0aG1zLWluLWphdmFzY3JpcHQ+XG5cbiAgLy8gYHJnYlRvUmdiYFxuICAvLyBIYW5kbGUgYm91bmRzIC8gcGVyY2VudGFnZSBjaGVja2luZyB0byBjb25mb3JtIHRvIENTUyBjb2xvciBzcGVjXG4gIC8vIDxodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbG9yLz5cbiAgLy8gKkFzc3VtZXM6KiByLCBnLCBiIGluIFswLCAyNTVdIG9yIFswLCAxXVxuICAvLyAqUmV0dXJuczoqIHsgciwgZywgYiB9IGluIFswLCAyNTVdXG4gIGZ1bmN0aW9uIHJnYlRvUmdiKHIsIGcsIGIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcjogYm91bmQwMShyLCAyNTUpICogMjU1LFxuICAgICAgZzogYm91bmQwMShnLCAyNTUpICogMjU1LFxuICAgICAgYjogYm91bmQwMShiLCAyNTUpICogMjU1XG4gICAgfTtcbiAgfVxuXG4gIC8vIGByZ2JUb0hzbGBcbiAgLy8gQ29udmVydHMgYW4gUkdCIGNvbG9yIHZhbHVlIHRvIEhTTC5cbiAgLy8gKkFzc3VtZXM6KiByLCBnLCBhbmQgYiBhcmUgY29udGFpbmVkIGluIFswLCAyNTVdIG9yIFswLCAxXVxuICAvLyAqUmV0dXJuczoqIHsgaCwgcywgbCB9IGluIFswLDFdXG4gIGZ1bmN0aW9uIHJnYlRvSHNsKHIsIGcsIGIpIHtcbiAgICByID0gYm91bmQwMShyLCAyNTUpO1xuICAgIGcgPSBib3VuZDAxKGcsIDI1NSk7XG4gICAgYiA9IGJvdW5kMDEoYiwgMjU1KTtcbiAgICB2YXIgbWF4ID0gTWF0aC5tYXgociwgZywgYiksXG4gICAgICBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKTtcbiAgICB2YXIgaCxcbiAgICAgIHMsXG4gICAgICBsID0gKG1heCArIG1pbikgLyAyO1xuICAgIGlmIChtYXggPT0gbWluKSB7XG4gICAgICBoID0gcyA9IDA7IC8vIGFjaHJvbWF0aWNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGQgPSBtYXggLSBtaW47XG4gICAgICBzID0gbCA+IDAuNSA/IGQgLyAoMiAtIG1heCAtIG1pbikgOiBkIC8gKG1heCArIG1pbik7XG4gICAgICBzd2l0Y2ggKG1heCkge1xuICAgICAgICBjYXNlIHI6XG4gICAgICAgICAgaCA9IChnIC0gYikgLyBkICsgKGcgPCBiID8gNiA6IDApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIGc6XG4gICAgICAgICAgaCA9IChiIC0gcikgLyBkICsgMjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBiOlxuICAgICAgICAgIGggPSAociAtIGcpIC8gZCArIDQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBoIC89IDY7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBoOiBoLFxuICAgICAgczogcyxcbiAgICAgIGw6IGxcbiAgICB9O1xuICB9XG5cbiAgLy8gYGhzbFRvUmdiYFxuICAvLyBDb252ZXJ0cyBhbiBIU0wgY29sb3IgdmFsdWUgdG8gUkdCLlxuICAvLyAqQXNzdW1lczoqIGggaXMgY29udGFpbmVkIGluIFswLCAxXSBvciBbMCwgMzYwXSBhbmQgcyBhbmQgbCBhcmUgY29udGFpbmVkIFswLCAxXSBvciBbMCwgMTAwXVxuICAvLyAqUmV0dXJuczoqIHsgciwgZywgYiB9IGluIHRoZSBzZXQgWzAsIDI1NV1cbiAgZnVuY3Rpb24gaHNsVG9SZ2IoaCwgcywgbCkge1xuICAgIHZhciByLCBnLCBiO1xuICAgIGggPSBib3VuZDAxKGgsIDM2MCk7XG4gICAgcyA9IGJvdW5kMDEocywgMTAwKTtcbiAgICBsID0gYm91bmQwMShsLCAxMDApO1xuICAgIGZ1bmN0aW9uIGh1ZTJyZ2IocCwgcSwgdCkge1xuICAgICAgaWYgKHQgPCAwKSB0ICs9IDE7XG4gICAgICBpZiAodCA+IDEpIHQgLT0gMTtcbiAgICAgIGlmICh0IDwgMSAvIDYpIHJldHVybiBwICsgKHEgLSBwKSAqIDYgKiB0O1xuICAgICAgaWYgKHQgPCAxIC8gMikgcmV0dXJuIHE7XG4gICAgICBpZiAodCA8IDIgLyAzKSByZXR1cm4gcCArIChxIC0gcCkgKiAoMiAvIDMgLSB0KSAqIDY7XG4gICAgICByZXR1cm4gcDtcbiAgICB9XG4gICAgaWYgKHMgPT09IDApIHtcbiAgICAgIHIgPSBnID0gYiA9IGw7IC8vIGFjaHJvbWF0aWNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHEgPSBsIDwgMC41ID8gbCAqICgxICsgcykgOiBsICsgcyAtIGwgKiBzO1xuICAgICAgdmFyIHAgPSAyICogbCAtIHE7XG4gICAgICByID0gaHVlMnJnYihwLCBxLCBoICsgMSAvIDMpO1xuICAgICAgZyA9IGh1ZTJyZ2IocCwgcSwgaCk7XG4gICAgICBiID0gaHVlMnJnYihwLCBxLCBoIC0gMSAvIDMpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcjogciAqIDI1NSxcbiAgICAgIGc6IGcgKiAyNTUsXG4gICAgICBiOiBiICogMjU1XG4gICAgfTtcbiAgfVxuXG4gIC8vIGByZ2JUb0hzdmBcbiAgLy8gQ29udmVydHMgYW4gUkdCIGNvbG9yIHZhbHVlIHRvIEhTVlxuICAvLyAqQXNzdW1lczoqIHIsIGcsIGFuZCBiIGFyZSBjb250YWluZWQgaW4gdGhlIHNldCBbMCwgMjU1XSBvciBbMCwgMV1cbiAgLy8gKlJldHVybnM6KiB7IGgsIHMsIHYgfSBpbiBbMCwxXVxuICBmdW5jdGlvbiByZ2JUb0hzdihyLCBnLCBiKSB7XG4gICAgciA9IGJvdW5kMDEociwgMjU1KTtcbiAgICBnID0gYm91bmQwMShnLCAyNTUpO1xuICAgIGIgPSBib3VuZDAxKGIsIDI1NSk7XG4gICAgdmFyIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpLFxuICAgICAgbWluID0gTWF0aC5taW4ociwgZywgYik7XG4gICAgdmFyIGgsXG4gICAgICBzLFxuICAgICAgdiA9IG1heDtcbiAgICB2YXIgZCA9IG1heCAtIG1pbjtcbiAgICBzID0gbWF4ID09PSAwID8gMCA6IGQgLyBtYXg7XG4gICAgaWYgKG1heCA9PSBtaW4pIHtcbiAgICAgIGggPSAwOyAvLyBhY2hyb21hdGljXG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAobWF4KSB7XG4gICAgICAgIGNhc2UgcjpcbiAgICAgICAgICBoID0gKGcgLSBiKSAvIGQgKyAoZyA8IGIgPyA2IDogMCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgZzpcbiAgICAgICAgICBoID0gKGIgLSByKSAvIGQgKyAyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIGI6XG4gICAgICAgICAgaCA9IChyIC0gZykgLyBkICsgNDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGggLz0gNjtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGg6IGgsXG4gICAgICBzOiBzLFxuICAgICAgdjogdlxuICAgIH07XG4gIH1cblxuICAvLyBgaHN2VG9SZ2JgXG4gIC8vIENvbnZlcnRzIGFuIEhTViBjb2xvciB2YWx1ZSB0byBSR0IuXG4gIC8vICpBc3N1bWVzOiogaCBpcyBjb250YWluZWQgaW4gWzAsIDFdIG9yIFswLCAzNjBdIGFuZCBzIGFuZCB2IGFyZSBjb250YWluZWQgaW4gWzAsIDFdIG9yIFswLCAxMDBdXG4gIC8vICpSZXR1cm5zOiogeyByLCBnLCBiIH0gaW4gdGhlIHNldCBbMCwgMjU1XVxuICBmdW5jdGlvbiBoc3ZUb1JnYihoLCBzLCB2KSB7XG4gICAgaCA9IGJvdW5kMDEoaCwgMzYwKSAqIDY7XG4gICAgcyA9IGJvdW5kMDEocywgMTAwKTtcbiAgICB2ID0gYm91bmQwMSh2LCAxMDApO1xuICAgIHZhciBpID0gTWF0aC5mbG9vcihoKSxcbiAgICAgIGYgPSBoIC0gaSxcbiAgICAgIHAgPSB2ICogKDEgLSBzKSxcbiAgICAgIHEgPSB2ICogKDEgLSBmICogcyksXG4gICAgICB0ID0gdiAqICgxIC0gKDEgLSBmKSAqIHMpLFxuICAgICAgbW9kID0gaSAlIDYsXG4gICAgICByID0gW3YsIHEsIHAsIHAsIHQsIHZdW21vZF0sXG4gICAgICBnID0gW3QsIHYsIHYsIHEsIHAsIHBdW21vZF0sXG4gICAgICBiID0gW3AsIHAsIHQsIHYsIHYsIHFdW21vZF07XG4gICAgcmV0dXJuIHtcbiAgICAgIHI6IHIgKiAyNTUsXG4gICAgICBnOiBnICogMjU1LFxuICAgICAgYjogYiAqIDI1NVxuICAgIH07XG4gIH1cblxuICAvLyBgcmdiVG9IZXhgXG4gIC8vIENvbnZlcnRzIGFuIFJHQiBjb2xvciB0byBoZXhcbiAgLy8gQXNzdW1lcyByLCBnLCBhbmQgYiBhcmUgY29udGFpbmVkIGluIHRoZSBzZXQgWzAsIDI1NV1cbiAgLy8gUmV0dXJucyBhIDMgb3IgNiBjaGFyYWN0ZXIgaGV4XG4gIGZ1bmN0aW9uIHJnYlRvSGV4KHIsIGcsIGIsIGFsbG93M0NoYXIpIHtcbiAgICB2YXIgaGV4ID0gW3BhZDIoTWF0aC5yb3VuZChyKS50b1N0cmluZygxNikpLCBwYWQyKE1hdGgucm91bmQoZykudG9TdHJpbmcoMTYpKSwgcGFkMihNYXRoLnJvdW5kKGIpLnRvU3RyaW5nKDE2KSldO1xuXG4gICAgLy8gUmV0dXJuIGEgMyBjaGFyYWN0ZXIgaGV4IGlmIHBvc3NpYmxlXG4gICAgaWYgKGFsbG93M0NoYXIgJiYgaGV4WzBdLmNoYXJBdCgwKSA9PSBoZXhbMF0uY2hhckF0KDEpICYmIGhleFsxXS5jaGFyQXQoMCkgPT0gaGV4WzFdLmNoYXJBdCgxKSAmJiBoZXhbMl0uY2hhckF0KDApID09IGhleFsyXS5jaGFyQXQoMSkpIHtcbiAgICAgIHJldHVybiBoZXhbMF0uY2hhckF0KDApICsgaGV4WzFdLmNoYXJBdCgwKSArIGhleFsyXS5jaGFyQXQoMCk7XG4gICAgfVxuICAgIHJldHVybiBoZXguam9pbihcIlwiKTtcbiAgfVxuXG4gIC8vIGByZ2JhVG9IZXhgXG4gIC8vIENvbnZlcnRzIGFuIFJHQkEgY29sb3IgcGx1cyBhbHBoYSB0cmFuc3BhcmVuY3kgdG8gaGV4XG4gIC8vIEFzc3VtZXMgciwgZywgYiBhcmUgY29udGFpbmVkIGluIHRoZSBzZXQgWzAsIDI1NV0gYW5kXG4gIC8vIGEgaW4gWzAsIDFdLiBSZXR1cm5zIGEgNCBvciA4IGNoYXJhY3RlciByZ2JhIGhleFxuICBmdW5jdGlvbiByZ2JhVG9IZXgociwgZywgYiwgYSwgYWxsb3c0Q2hhcikge1xuICAgIHZhciBoZXggPSBbcGFkMihNYXRoLnJvdW5kKHIpLnRvU3RyaW5nKDE2KSksIHBhZDIoTWF0aC5yb3VuZChnKS50b1N0cmluZygxNikpLCBwYWQyKE1hdGgucm91bmQoYikudG9TdHJpbmcoMTYpKSwgcGFkMihjb252ZXJ0RGVjaW1hbFRvSGV4KGEpKV07XG5cbiAgICAvLyBSZXR1cm4gYSA0IGNoYXJhY3RlciBoZXggaWYgcG9zc2libGVcbiAgICBpZiAoYWxsb3c0Q2hhciAmJiBoZXhbMF0uY2hhckF0KDApID09IGhleFswXS5jaGFyQXQoMSkgJiYgaGV4WzFdLmNoYXJBdCgwKSA9PSBoZXhbMV0uY2hhckF0KDEpICYmIGhleFsyXS5jaGFyQXQoMCkgPT0gaGV4WzJdLmNoYXJBdCgxKSAmJiBoZXhbM10uY2hhckF0KDApID09IGhleFszXS5jaGFyQXQoMSkpIHtcbiAgICAgIHJldHVybiBoZXhbMF0uY2hhckF0KDApICsgaGV4WzFdLmNoYXJBdCgwKSArIGhleFsyXS5jaGFyQXQoMCkgKyBoZXhbM10uY2hhckF0KDApO1xuICAgIH1cbiAgICByZXR1cm4gaGV4LmpvaW4oXCJcIik7XG4gIH1cblxuICAvLyBgcmdiYVRvQXJnYkhleGBcbiAgLy8gQ29udmVydHMgYW4gUkdCQSBjb2xvciB0byBhbiBBUkdCIEhleDggc3RyaW5nXG4gIC8vIFJhcmVseSB1c2VkLCBidXQgcmVxdWlyZWQgZm9yIFwidG9GaWx0ZXIoKVwiXG4gIGZ1bmN0aW9uIHJnYmFUb0FyZ2JIZXgociwgZywgYiwgYSkge1xuICAgIHZhciBoZXggPSBbcGFkMihjb252ZXJ0RGVjaW1hbFRvSGV4KGEpKSwgcGFkMihNYXRoLnJvdW5kKHIpLnRvU3RyaW5nKDE2KSksIHBhZDIoTWF0aC5yb3VuZChnKS50b1N0cmluZygxNikpLCBwYWQyKE1hdGgucm91bmQoYikudG9TdHJpbmcoMTYpKV07XG4gICAgcmV0dXJuIGhleC5qb2luKFwiXCIpO1xuICB9XG5cbiAgLy8gYGVxdWFsc2BcbiAgLy8gQ2FuIGJlIGNhbGxlZCB3aXRoIGFueSB0aW55Y29sb3IgaW5wdXRcbiAgdGlueWNvbG9yLmVxdWFscyA9IGZ1bmN0aW9uIChjb2xvcjEsIGNvbG9yMikge1xuICAgIGlmICghY29sb3IxIHx8ICFjb2xvcjIpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGlueWNvbG9yKGNvbG9yMSkudG9SZ2JTdHJpbmcoKSA9PSB0aW55Y29sb3IoY29sb3IyKS50b1JnYlN0cmluZygpO1xuICB9O1xuICB0aW55Y29sb3IucmFuZG9tID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aW55Y29sb3IuZnJvbVJhdGlvKHtcbiAgICAgIHI6IE1hdGgucmFuZG9tKCksXG4gICAgICBnOiBNYXRoLnJhbmRvbSgpLFxuICAgICAgYjogTWF0aC5yYW5kb20oKVxuICAgIH0pO1xuICB9O1xuXG4gIC8vIE1vZGlmaWNhdGlvbiBGdW5jdGlvbnNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBUaGFua3MgdG8gbGVzcy5qcyBmb3Igc29tZSBvZiB0aGUgYmFzaWNzIGhlcmVcbiAgLy8gPGh0dHBzOi8vZ2l0aHViLmNvbS9jbG91ZGhlYWQvbGVzcy5qcy9ibG9iL21hc3Rlci9saWIvbGVzcy9mdW5jdGlvbnMuanM+XG5cbiAgZnVuY3Rpb24gX2Rlc2F0dXJhdGUoY29sb3IsIGFtb3VudCkge1xuICAgIGFtb3VudCA9IGFtb3VudCA9PT0gMCA/IDAgOiBhbW91bnQgfHwgMTA7XG4gICAgdmFyIGhzbCA9IHRpbnljb2xvcihjb2xvcikudG9Ic2woKTtcbiAgICBoc2wucyAtPSBhbW91bnQgLyAxMDA7XG4gICAgaHNsLnMgPSBjbGFtcDAxKGhzbC5zKTtcbiAgICByZXR1cm4gdGlueWNvbG9yKGhzbCk7XG4gIH1cbiAgZnVuY3Rpb24gX3NhdHVyYXRlKGNvbG9yLCBhbW91bnQpIHtcbiAgICBhbW91bnQgPSBhbW91bnQgPT09IDAgPyAwIDogYW1vdW50IHx8IDEwO1xuICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7XG4gICAgaHNsLnMgKz0gYW1vdW50IC8gMTAwO1xuICAgIGhzbC5zID0gY2xhbXAwMShoc2wucyk7XG4gICAgcmV0dXJuIHRpbnljb2xvcihoc2wpO1xuICB9XG4gIGZ1bmN0aW9uIF9ncmV5c2NhbGUoY29sb3IpIHtcbiAgICByZXR1cm4gdGlueWNvbG9yKGNvbG9yKS5kZXNhdHVyYXRlKDEwMCk7XG4gIH1cbiAgZnVuY3Rpb24gX2xpZ2h0ZW4oY29sb3IsIGFtb3VudCkge1xuICAgIGFtb3VudCA9IGFtb3VudCA9PT0gMCA/IDAgOiBhbW91bnQgfHwgMTA7XG4gICAgdmFyIGhzbCA9IHRpbnljb2xvcihjb2xvcikudG9Ic2woKTtcbiAgICBoc2wubCArPSBhbW91bnQgLyAxMDA7XG4gICAgaHNsLmwgPSBjbGFtcDAxKGhzbC5sKTtcbiAgICByZXR1cm4gdGlueWNvbG9yKGhzbCk7XG4gIH1cbiAgZnVuY3Rpb24gX2JyaWdodGVuKGNvbG9yLCBhbW91bnQpIHtcbiAgICBhbW91bnQgPSBhbW91bnQgPT09IDAgPyAwIDogYW1vdW50IHx8IDEwO1xuICAgIHZhciByZ2IgPSB0aW55Y29sb3IoY29sb3IpLnRvUmdiKCk7XG4gICAgcmdiLnIgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIHJnYi5yIC0gTWF0aC5yb3VuZCgyNTUgKiAtKGFtb3VudCAvIDEwMCkpKSk7XG4gICAgcmdiLmcgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIHJnYi5nIC0gTWF0aC5yb3VuZCgyNTUgKiAtKGFtb3VudCAvIDEwMCkpKSk7XG4gICAgcmdiLmIgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIHJnYi5iIC0gTWF0aC5yb3VuZCgyNTUgKiAtKGFtb3VudCAvIDEwMCkpKSk7XG4gICAgcmV0dXJuIHRpbnljb2xvcihyZ2IpO1xuICB9XG4gIGZ1bmN0aW9uIF9kYXJrZW4oY29sb3IsIGFtb3VudCkge1xuICAgIGFtb3VudCA9IGFtb3VudCA9PT0gMCA/IDAgOiBhbW91bnQgfHwgMTA7XG4gICAgdmFyIGhzbCA9IHRpbnljb2xvcihjb2xvcikudG9Ic2woKTtcbiAgICBoc2wubCAtPSBhbW91bnQgLyAxMDA7XG4gICAgaHNsLmwgPSBjbGFtcDAxKGhzbC5sKTtcbiAgICByZXR1cm4gdGlueWNvbG9yKGhzbCk7XG4gIH1cblxuICAvLyBTcGluIHRha2VzIGEgcG9zaXRpdmUgb3IgbmVnYXRpdmUgYW1vdW50IHdpdGhpbiBbLTM2MCwgMzYwXSBpbmRpY2F0aW5nIHRoZSBjaGFuZ2Ugb2YgaHVlLlxuICAvLyBWYWx1ZXMgb3V0c2lkZSBvZiB0aGlzIHJhbmdlIHdpbGwgYmUgd3JhcHBlZCBpbnRvIHRoaXMgcmFuZ2UuXG4gIGZ1bmN0aW9uIF9zcGluKGNvbG9yLCBhbW91bnQpIHtcbiAgICB2YXIgaHNsID0gdGlueWNvbG9yKGNvbG9yKS50b0hzbCgpO1xuICAgIHZhciBodWUgPSAoaHNsLmggKyBhbW91bnQpICUgMzYwO1xuICAgIGhzbC5oID0gaHVlIDwgMCA/IDM2MCArIGh1ZSA6IGh1ZTtcbiAgICByZXR1cm4gdGlueWNvbG9yKGhzbCk7XG4gIH1cblxuICAvLyBDb21iaW5hdGlvbiBGdW5jdGlvbnNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFRoYW5rcyB0byBqUXVlcnkgeENvbG9yIGZvciBzb21lIG9mIHRoZSBpZGVhcyBiZWhpbmQgdGhlc2VcbiAgLy8gPGh0dHBzOi8vZ2l0aHViLmNvbS9pbmZ1c2lvbi9qUXVlcnkteGNvbG9yL2Jsb2IvbWFzdGVyL2pxdWVyeS54Y29sb3IuanM+XG5cbiAgZnVuY3Rpb24gX2NvbXBsZW1lbnQoY29sb3IpIHtcbiAgICB2YXIgaHNsID0gdGlueWNvbG9yKGNvbG9yKS50b0hzbCgpO1xuICAgIGhzbC5oID0gKGhzbC5oICsgMTgwKSAlIDM2MDtcbiAgICByZXR1cm4gdGlueWNvbG9yKGhzbCk7XG4gIH1cbiAgZnVuY3Rpb24gcG9seWFkKGNvbG9yLCBudW1iZXIpIHtcbiAgICBpZiAoaXNOYU4obnVtYmVyKSB8fCBudW1iZXIgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXJndW1lbnQgdG8gcG9seWFkIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXJcIik7XG4gICAgfVxuICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7XG4gICAgdmFyIHJlc3VsdCA9IFt0aW55Y29sb3IoY29sb3IpXTtcbiAgICB2YXIgc3RlcCA9IDM2MCAvIG51bWJlcjtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IG51bWJlcjsgaSsrKSB7XG4gICAgICByZXN1bHQucHVzaCh0aW55Y29sb3Ioe1xuICAgICAgICBoOiAoaHNsLmggKyBpICogc3RlcCkgJSAzNjAsXG4gICAgICAgIHM6IGhzbC5zLFxuICAgICAgICBsOiBoc2wubFxuICAgICAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGZ1bmN0aW9uIF9zcGxpdGNvbXBsZW1lbnQoY29sb3IpIHtcbiAgICB2YXIgaHNsID0gdGlueWNvbG9yKGNvbG9yKS50b0hzbCgpO1xuICAgIHZhciBoID0gaHNsLmg7XG4gICAgcmV0dXJuIFt0aW55Y29sb3IoY29sb3IpLCB0aW55Y29sb3Ioe1xuICAgICAgaDogKGggKyA3MikgJSAzNjAsXG4gICAgICBzOiBoc2wucyxcbiAgICAgIGw6IGhzbC5sXG4gICAgfSksIHRpbnljb2xvcih7XG4gICAgICBoOiAoaCArIDIxNikgJSAzNjAsXG4gICAgICBzOiBoc2wucyxcbiAgICAgIGw6IGhzbC5sXG4gICAgfSldO1xuICB9XG4gIGZ1bmN0aW9uIF9hbmFsb2dvdXMoY29sb3IsIHJlc3VsdHMsIHNsaWNlcykge1xuICAgIHJlc3VsdHMgPSByZXN1bHRzIHx8IDY7XG4gICAgc2xpY2VzID0gc2xpY2VzIHx8IDMwO1xuICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7XG4gICAgdmFyIHBhcnQgPSAzNjAgLyBzbGljZXM7XG4gICAgdmFyIHJldCA9IFt0aW55Y29sb3IoY29sb3IpXTtcbiAgICBmb3IgKGhzbC5oID0gKGhzbC5oIC0gKHBhcnQgKiByZXN1bHRzID4+IDEpICsgNzIwKSAlIDM2MDsgLS1yZXN1bHRzOykge1xuICAgICAgaHNsLmggPSAoaHNsLmggKyBwYXJ0KSAlIDM2MDtcbiAgICAgIHJldC5wdXNoKHRpbnljb2xvcihoc2wpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuICBmdW5jdGlvbiBfbW9ub2Nocm9tYXRpYyhjb2xvciwgcmVzdWx0cykge1xuICAgIHJlc3VsdHMgPSByZXN1bHRzIHx8IDY7XG4gICAgdmFyIGhzdiA9IHRpbnljb2xvcihjb2xvcikudG9Ic3YoKTtcbiAgICB2YXIgaCA9IGhzdi5oLFxuICAgICAgcyA9IGhzdi5zLFxuICAgICAgdiA9IGhzdi52O1xuICAgIHZhciByZXQgPSBbXTtcbiAgICB2YXIgbW9kaWZpY2F0aW9uID0gMSAvIHJlc3VsdHM7XG4gICAgd2hpbGUgKHJlc3VsdHMtLSkge1xuICAgICAgcmV0LnB1c2godGlueWNvbG9yKHtcbiAgICAgICAgaDogaCxcbiAgICAgICAgczogcyxcbiAgICAgICAgdjogdlxuICAgICAgfSkpO1xuICAgICAgdiA9ICh2ICsgbW9kaWZpY2F0aW9uKSAlIDE7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvLyBVdGlsaXR5IEZ1bmN0aW9uc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICB0aW55Y29sb3IubWl4ID0gZnVuY3Rpb24gKGNvbG9yMSwgY29sb3IyLCBhbW91bnQpIHtcbiAgICBhbW91bnQgPSBhbW91bnQgPT09IDAgPyAwIDogYW1vdW50IHx8IDUwO1xuICAgIHZhciByZ2IxID0gdGlueWNvbG9yKGNvbG9yMSkudG9SZ2IoKTtcbiAgICB2YXIgcmdiMiA9IHRpbnljb2xvcihjb2xvcjIpLnRvUmdiKCk7XG4gICAgdmFyIHAgPSBhbW91bnQgLyAxMDA7XG4gICAgdmFyIHJnYmEgPSB7XG4gICAgICByOiAocmdiMi5yIC0gcmdiMS5yKSAqIHAgKyByZ2IxLnIsXG4gICAgICBnOiAocmdiMi5nIC0gcmdiMS5nKSAqIHAgKyByZ2IxLmcsXG4gICAgICBiOiAocmdiMi5iIC0gcmdiMS5iKSAqIHAgKyByZ2IxLmIsXG4gICAgICBhOiAocmdiMi5hIC0gcmdiMS5hKSAqIHAgKyByZ2IxLmFcbiAgICB9O1xuICAgIHJldHVybiB0aW55Y29sb3IocmdiYSk7XG4gIH07XG5cbiAgLy8gUmVhZGFiaWxpdHkgRnVuY3Rpb25zXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyA8aHR0cDovL3d3dy53My5vcmcvVFIvMjAwOC9SRUMtV0NBRzIwLTIwMDgxMjExLyNjb250cmFzdC1yYXRpb2RlZiAoV0NBRyBWZXJzaW9uIDIpXG5cbiAgLy8gYGNvbnRyYXN0YFxuICAvLyBBbmFseXplIHRoZSAyIGNvbG9ycyBhbmQgcmV0dXJucyB0aGUgY29sb3IgY29udHJhc3QgZGVmaW5lZCBieSAoV0NBRyBWZXJzaW9uIDIpXG4gIHRpbnljb2xvci5yZWFkYWJpbGl0eSA9IGZ1bmN0aW9uIChjb2xvcjEsIGNvbG9yMikge1xuICAgIHZhciBjMSA9IHRpbnljb2xvcihjb2xvcjEpO1xuICAgIHZhciBjMiA9IHRpbnljb2xvcihjb2xvcjIpO1xuICAgIHJldHVybiAoTWF0aC5tYXgoYzEuZ2V0THVtaW5hbmNlKCksIGMyLmdldEx1bWluYW5jZSgpKSArIDAuMDUpIC8gKE1hdGgubWluKGMxLmdldEx1bWluYW5jZSgpLCBjMi5nZXRMdW1pbmFuY2UoKSkgKyAwLjA1KTtcbiAgfTtcblxuICAvLyBgaXNSZWFkYWJsZWBcbiAgLy8gRW5zdXJlIHRoYXQgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvciBjb21iaW5hdGlvbnMgbWVldCBXQ0FHMiBndWlkZWxpbmVzLlxuICAvLyBUaGUgdGhpcmQgYXJndW1lbnQgaXMgYW4gb3B0aW9uYWwgT2JqZWN0LlxuICAvLyAgICAgIHRoZSAnbGV2ZWwnIHByb3BlcnR5IHN0YXRlcyAnQUEnIG9yICdBQUEnIC0gaWYgbWlzc2luZyBvciBpbnZhbGlkLCBpdCBkZWZhdWx0cyB0byAnQUEnO1xuICAvLyAgICAgIHRoZSAnc2l6ZScgcHJvcGVydHkgc3RhdGVzICdsYXJnZScgb3IgJ3NtYWxsJyAtIGlmIG1pc3Npbmcgb3IgaW52YWxpZCwgaXQgZGVmYXVsdHMgdG8gJ3NtYWxsJy5cbiAgLy8gSWYgdGhlIGVudGlyZSBvYmplY3QgaXMgYWJzZW50LCBpc1JlYWRhYmxlIGRlZmF1bHRzIHRvIHtsZXZlbDpcIkFBXCIsc2l6ZTpcInNtYWxsXCJ9LlxuXG4gIC8vICpFeGFtcGxlKlxuICAvLyAgICB0aW55Y29sb3IuaXNSZWFkYWJsZShcIiMwMDBcIiwgXCIjMTExXCIpID0+IGZhbHNlXG4gIC8vICAgIHRpbnljb2xvci5pc1JlYWRhYmxlKFwiIzAwMFwiLCBcIiMxMTFcIix7bGV2ZWw6XCJBQVwiLHNpemU6XCJsYXJnZVwifSkgPT4gZmFsc2VcbiAgdGlueWNvbG9yLmlzUmVhZGFibGUgPSBmdW5jdGlvbiAoY29sb3IxLCBjb2xvcjIsIHdjYWcyKSB7XG4gICAgdmFyIHJlYWRhYmlsaXR5ID0gdGlueWNvbG9yLnJlYWRhYmlsaXR5KGNvbG9yMSwgY29sb3IyKTtcbiAgICB2YXIgd2NhZzJQYXJtcywgb3V0O1xuICAgIG91dCA9IGZhbHNlO1xuICAgIHdjYWcyUGFybXMgPSB2YWxpZGF0ZVdDQUcyUGFybXMod2NhZzIpO1xuICAgIHN3aXRjaCAod2NhZzJQYXJtcy5sZXZlbCArIHdjYWcyUGFybXMuc2l6ZSkge1xuICAgICAgY2FzZSBcIkFBc21hbGxcIjpcbiAgICAgIGNhc2UgXCJBQUFsYXJnZVwiOlxuICAgICAgICBvdXQgPSByZWFkYWJpbGl0eSA+PSA0LjU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkFBbGFyZ2VcIjpcbiAgICAgICAgb3V0ID0gcmVhZGFiaWxpdHkgPj0gMztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiQUFBc21hbGxcIjpcbiAgICAgICAgb3V0ID0gcmVhZGFiaWxpdHkgPj0gNztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH07XG5cbiAgLy8gYG1vc3RSZWFkYWJsZWBcbiAgLy8gR2l2ZW4gYSBiYXNlIGNvbG9yIGFuZCBhIGxpc3Qgb2YgcG9zc2libGUgZm9yZWdyb3VuZCBvciBiYWNrZ3JvdW5kXG4gIC8vIGNvbG9ycyBmb3IgdGhhdCBiYXNlLCByZXR1cm5zIHRoZSBtb3N0IHJlYWRhYmxlIGNvbG9yLlxuICAvLyBPcHRpb25hbGx5IHJldHVybnMgQmxhY2sgb3IgV2hpdGUgaWYgdGhlIG1vc3QgcmVhZGFibGUgY29sb3IgaXMgdW5yZWFkYWJsZS5cbiAgLy8gKkV4YW1wbGUqXG4gIC8vICAgIHRpbnljb2xvci5tb3N0UmVhZGFibGUodGlueWNvbG9yLm1vc3RSZWFkYWJsZShcIiMxMjNcIiwgW1wiIzEyNFwiLCBcIiMxMjVcIl0se2luY2x1ZGVGYWxsYmFja0NvbG9yczpmYWxzZX0pLnRvSGV4U3RyaW5nKCk7IC8vIFwiIzExMjI1NVwiXG4gIC8vICAgIHRpbnljb2xvci5tb3N0UmVhZGFibGUodGlueWNvbG9yLm1vc3RSZWFkYWJsZShcIiMxMjNcIiwgW1wiIzEyNFwiLCBcIiMxMjVcIl0se2luY2x1ZGVGYWxsYmFja0NvbG9yczp0cnVlfSkudG9IZXhTdHJpbmcoKTsgIC8vIFwiI2ZmZmZmZlwiXG4gIC8vICAgIHRpbnljb2xvci5tb3N0UmVhZGFibGUoXCIjYTgwMTVhXCIsIFtcIiNmYWYzZjNcIl0se2luY2x1ZGVGYWxsYmFja0NvbG9yczp0cnVlLGxldmVsOlwiQUFBXCIsc2l6ZTpcImxhcmdlXCJ9KS50b0hleFN0cmluZygpOyAvLyBcIiNmYWYzZjNcIlxuICAvLyAgICB0aW55Y29sb3IubW9zdFJlYWRhYmxlKFwiI2E4MDE1YVwiLCBbXCIjZmFmM2YzXCJdLHtpbmNsdWRlRmFsbGJhY2tDb2xvcnM6dHJ1ZSxsZXZlbDpcIkFBQVwiLHNpemU6XCJzbWFsbFwifSkudG9IZXhTdHJpbmcoKTsgLy8gXCIjZmZmZmZmXCJcbiAgdGlueWNvbG9yLm1vc3RSZWFkYWJsZSA9IGZ1bmN0aW9uIChiYXNlQ29sb3IsIGNvbG9yTGlzdCwgYXJncykge1xuICAgIHZhciBiZXN0Q29sb3IgPSBudWxsO1xuICAgIHZhciBiZXN0U2NvcmUgPSAwO1xuICAgIHZhciByZWFkYWJpbGl0eTtcbiAgICB2YXIgaW5jbHVkZUZhbGxiYWNrQ29sb3JzLCBsZXZlbCwgc2l6ZTtcbiAgICBhcmdzID0gYXJncyB8fCB7fTtcbiAgICBpbmNsdWRlRmFsbGJhY2tDb2xvcnMgPSBhcmdzLmluY2x1ZGVGYWxsYmFja0NvbG9ycztcbiAgICBsZXZlbCA9IGFyZ3MubGV2ZWw7XG4gICAgc2l6ZSA9IGFyZ3Muc2l6ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbG9yTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgcmVhZGFiaWxpdHkgPSB0aW55Y29sb3IucmVhZGFiaWxpdHkoYmFzZUNvbG9yLCBjb2xvckxpc3RbaV0pO1xuICAgICAgaWYgKHJlYWRhYmlsaXR5ID4gYmVzdFNjb3JlKSB7XG4gICAgICAgIGJlc3RTY29yZSA9IHJlYWRhYmlsaXR5O1xuICAgICAgICBiZXN0Q29sb3IgPSB0aW55Y29sb3IoY29sb3JMaXN0W2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRpbnljb2xvci5pc1JlYWRhYmxlKGJhc2VDb2xvciwgYmVzdENvbG9yLCB7XG4gICAgICBsZXZlbDogbGV2ZWwsXG4gICAgICBzaXplOiBzaXplXG4gICAgfSkgfHwgIWluY2x1ZGVGYWxsYmFja0NvbG9ycykge1xuICAgICAgcmV0dXJuIGJlc3RDb2xvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgYXJncy5pbmNsdWRlRmFsbGJhY2tDb2xvcnMgPSBmYWxzZTtcbiAgICAgIHJldHVybiB0aW55Y29sb3IubW9zdFJlYWRhYmxlKGJhc2VDb2xvciwgW1wiI2ZmZlwiLCBcIiMwMDBcIl0sIGFyZ3MpO1xuICAgIH1cbiAgfTtcblxuICAvLyBCaWcgTGlzdCBvZiBDb2xvcnNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIDxodHRwczovL3d3dy53My5vcmcvVFIvY3NzLWNvbG9yLTQvI25hbWVkLWNvbG9ycz5cbiAgdmFyIG5hbWVzID0gdGlueWNvbG9yLm5hbWVzID0ge1xuICAgIGFsaWNlYmx1ZTogXCJmMGY4ZmZcIixcbiAgICBhbnRpcXVld2hpdGU6IFwiZmFlYmQ3XCIsXG4gICAgYXF1YTogXCIwZmZcIixcbiAgICBhcXVhbWFyaW5lOiBcIjdmZmZkNFwiLFxuICAgIGF6dXJlOiBcImYwZmZmZlwiLFxuICAgIGJlaWdlOiBcImY1ZjVkY1wiLFxuICAgIGJpc3F1ZTogXCJmZmU0YzRcIixcbiAgICBibGFjazogXCIwMDBcIixcbiAgICBibGFuY2hlZGFsbW9uZDogXCJmZmViY2RcIixcbiAgICBibHVlOiBcIjAwZlwiLFxuICAgIGJsdWV2aW9sZXQ6IFwiOGEyYmUyXCIsXG4gICAgYnJvd246IFwiYTUyYTJhXCIsXG4gICAgYnVybHl3b29kOiBcImRlYjg4N1wiLFxuICAgIGJ1cm50c2llbm5hOiBcImVhN2U1ZFwiLFxuICAgIGNhZGV0Ymx1ZTogXCI1ZjllYTBcIixcbiAgICBjaGFydHJldXNlOiBcIjdmZmYwMFwiLFxuICAgIGNob2NvbGF0ZTogXCJkMjY5MWVcIixcbiAgICBjb3JhbDogXCJmZjdmNTBcIixcbiAgICBjb3JuZmxvd2VyYmx1ZTogXCI2NDk1ZWRcIixcbiAgICBjb3Juc2lsazogXCJmZmY4ZGNcIixcbiAgICBjcmltc29uOiBcImRjMTQzY1wiLFxuICAgIGN5YW46IFwiMGZmXCIsXG4gICAgZGFya2JsdWU6IFwiMDAwMDhiXCIsXG4gICAgZGFya2N5YW46IFwiMDA4YjhiXCIsXG4gICAgZGFya2dvbGRlbnJvZDogXCJiODg2MGJcIixcbiAgICBkYXJrZ3JheTogXCJhOWE5YTlcIixcbiAgICBkYXJrZ3JlZW46IFwiMDA2NDAwXCIsXG4gICAgZGFya2dyZXk6IFwiYTlhOWE5XCIsXG4gICAgZGFya2toYWtpOiBcImJkYjc2YlwiLFxuICAgIGRhcmttYWdlbnRhOiBcIjhiMDA4YlwiLFxuICAgIGRhcmtvbGl2ZWdyZWVuOiBcIjU1NmIyZlwiLFxuICAgIGRhcmtvcmFuZ2U6IFwiZmY4YzAwXCIsXG4gICAgZGFya29yY2hpZDogXCI5OTMyY2NcIixcbiAgICBkYXJrcmVkOiBcIjhiMDAwMFwiLFxuICAgIGRhcmtzYWxtb246IFwiZTk5NjdhXCIsXG4gICAgZGFya3NlYWdyZWVuOiBcIjhmYmM4ZlwiLFxuICAgIGRhcmtzbGF0ZWJsdWU6IFwiNDgzZDhiXCIsXG4gICAgZGFya3NsYXRlZ3JheTogXCIyZjRmNGZcIixcbiAgICBkYXJrc2xhdGVncmV5OiBcIjJmNGY0ZlwiLFxuICAgIGRhcmt0dXJxdW9pc2U6IFwiMDBjZWQxXCIsXG4gICAgZGFya3Zpb2xldDogXCI5NDAwZDNcIixcbiAgICBkZWVwcGluazogXCJmZjE0OTNcIixcbiAgICBkZWVwc2t5Ymx1ZTogXCIwMGJmZmZcIixcbiAgICBkaW1ncmF5OiBcIjY5Njk2OVwiLFxuICAgIGRpbWdyZXk6IFwiNjk2OTY5XCIsXG4gICAgZG9kZ2VyYmx1ZTogXCIxZTkwZmZcIixcbiAgICBmaXJlYnJpY2s6IFwiYjIyMjIyXCIsXG4gICAgZmxvcmFsd2hpdGU6IFwiZmZmYWYwXCIsXG4gICAgZm9yZXN0Z3JlZW46IFwiMjI4YjIyXCIsXG4gICAgZnVjaHNpYTogXCJmMGZcIixcbiAgICBnYWluc2Jvcm86IFwiZGNkY2RjXCIsXG4gICAgZ2hvc3R3aGl0ZTogXCJmOGY4ZmZcIixcbiAgICBnb2xkOiBcImZmZDcwMFwiLFxuICAgIGdvbGRlbnJvZDogXCJkYWE1MjBcIixcbiAgICBncmF5OiBcIjgwODA4MFwiLFxuICAgIGdyZWVuOiBcIjAwODAwMFwiLFxuICAgIGdyZWVueWVsbG93OiBcImFkZmYyZlwiLFxuICAgIGdyZXk6IFwiODA4MDgwXCIsXG4gICAgaG9uZXlkZXc6IFwiZjBmZmYwXCIsXG4gICAgaG90cGluazogXCJmZjY5YjRcIixcbiAgICBpbmRpYW5yZWQ6IFwiY2Q1YzVjXCIsXG4gICAgaW5kaWdvOiBcIjRiMDA4MlwiLFxuICAgIGl2b3J5OiBcImZmZmZmMFwiLFxuICAgIGtoYWtpOiBcImYwZTY4Y1wiLFxuICAgIGxhdmVuZGVyOiBcImU2ZTZmYVwiLFxuICAgIGxhdmVuZGVyYmx1c2g6IFwiZmZmMGY1XCIsXG4gICAgbGF3bmdyZWVuOiBcIjdjZmMwMFwiLFxuICAgIGxlbW9uY2hpZmZvbjogXCJmZmZhY2RcIixcbiAgICBsaWdodGJsdWU6IFwiYWRkOGU2XCIsXG4gICAgbGlnaHRjb3JhbDogXCJmMDgwODBcIixcbiAgICBsaWdodGN5YW46IFwiZTBmZmZmXCIsXG4gICAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IFwiZmFmYWQyXCIsXG4gICAgbGlnaHRncmF5OiBcImQzZDNkM1wiLFxuICAgIGxpZ2h0Z3JlZW46IFwiOTBlZTkwXCIsXG4gICAgbGlnaHRncmV5OiBcImQzZDNkM1wiLFxuICAgIGxpZ2h0cGluazogXCJmZmI2YzFcIixcbiAgICBsaWdodHNhbG1vbjogXCJmZmEwN2FcIixcbiAgICBsaWdodHNlYWdyZWVuOiBcIjIwYjJhYVwiLFxuICAgIGxpZ2h0c2t5Ymx1ZTogXCI4N2NlZmFcIixcbiAgICBsaWdodHNsYXRlZ3JheTogXCI3ODlcIixcbiAgICBsaWdodHNsYXRlZ3JleTogXCI3ODlcIixcbiAgICBsaWdodHN0ZWVsYmx1ZTogXCJiMGM0ZGVcIixcbiAgICBsaWdodHllbGxvdzogXCJmZmZmZTBcIixcbiAgICBsaW1lOiBcIjBmMFwiLFxuICAgIGxpbWVncmVlbjogXCIzMmNkMzJcIixcbiAgICBsaW5lbjogXCJmYWYwZTZcIixcbiAgICBtYWdlbnRhOiBcImYwZlwiLFxuICAgIG1hcm9vbjogXCI4MDAwMDBcIixcbiAgICBtZWRpdW1hcXVhbWFyaW5lOiBcIjY2Y2RhYVwiLFxuICAgIG1lZGl1bWJsdWU6IFwiMDAwMGNkXCIsXG4gICAgbWVkaXVtb3JjaGlkOiBcImJhNTVkM1wiLFxuICAgIG1lZGl1bXB1cnBsZTogXCI5MzcwZGJcIixcbiAgICBtZWRpdW1zZWFncmVlbjogXCIzY2IzNzFcIixcbiAgICBtZWRpdW1zbGF0ZWJsdWU6IFwiN2I2OGVlXCIsXG4gICAgbWVkaXVtc3ByaW5nZ3JlZW46IFwiMDBmYTlhXCIsXG4gICAgbWVkaXVtdHVycXVvaXNlOiBcIjQ4ZDFjY1wiLFxuICAgIG1lZGl1bXZpb2xldHJlZDogXCJjNzE1ODVcIixcbiAgICBtaWRuaWdodGJsdWU6IFwiMTkxOTcwXCIsXG4gICAgbWludGNyZWFtOiBcImY1ZmZmYVwiLFxuICAgIG1pc3R5cm9zZTogXCJmZmU0ZTFcIixcbiAgICBtb2NjYXNpbjogXCJmZmU0YjVcIixcbiAgICBuYXZham93aGl0ZTogXCJmZmRlYWRcIixcbiAgICBuYXZ5OiBcIjAwMDA4MFwiLFxuICAgIG9sZGxhY2U6IFwiZmRmNWU2XCIsXG4gICAgb2xpdmU6IFwiODA4MDAwXCIsXG4gICAgb2xpdmVkcmFiOiBcIjZiOGUyM1wiLFxuICAgIG9yYW5nZTogXCJmZmE1MDBcIixcbiAgICBvcmFuZ2VyZWQ6IFwiZmY0NTAwXCIsXG4gICAgb3JjaGlkOiBcImRhNzBkNlwiLFxuICAgIHBhbGVnb2xkZW5yb2Q6IFwiZWVlOGFhXCIsXG4gICAgcGFsZWdyZWVuOiBcIjk4ZmI5OFwiLFxuICAgIHBhbGV0dXJxdW9pc2U6IFwiYWZlZWVlXCIsXG4gICAgcGFsZXZpb2xldHJlZDogXCJkYjcwOTNcIixcbiAgICBwYXBheWF3aGlwOiBcImZmZWZkNVwiLFxuICAgIHBlYWNocHVmZjogXCJmZmRhYjlcIixcbiAgICBwZXJ1OiBcImNkODUzZlwiLFxuICAgIHBpbms6IFwiZmZjMGNiXCIsXG4gICAgcGx1bTogXCJkZGEwZGRcIixcbiAgICBwb3dkZXJibHVlOiBcImIwZTBlNlwiLFxuICAgIHB1cnBsZTogXCI4MDAwODBcIixcbiAgICByZWJlY2NhcHVycGxlOiBcIjY2MzM5OVwiLFxuICAgIHJlZDogXCJmMDBcIixcbiAgICByb3N5YnJvd246IFwiYmM4ZjhmXCIsXG4gICAgcm95YWxibHVlOiBcIjQxNjllMVwiLFxuICAgIHNhZGRsZWJyb3duOiBcIjhiNDUxM1wiLFxuICAgIHNhbG1vbjogXCJmYTgwNzJcIixcbiAgICBzYW5keWJyb3duOiBcImY0YTQ2MFwiLFxuICAgIHNlYWdyZWVuOiBcIjJlOGI1N1wiLFxuICAgIHNlYXNoZWxsOiBcImZmZjVlZVwiLFxuICAgIHNpZW5uYTogXCJhMDUyMmRcIixcbiAgICBzaWx2ZXI6IFwiYzBjMGMwXCIsXG4gICAgc2t5Ymx1ZTogXCI4N2NlZWJcIixcbiAgICBzbGF0ZWJsdWU6IFwiNmE1YWNkXCIsXG4gICAgc2xhdGVncmF5OiBcIjcwODA5MFwiLFxuICAgIHNsYXRlZ3JleTogXCI3MDgwOTBcIixcbiAgICBzbm93OiBcImZmZmFmYVwiLFxuICAgIHNwcmluZ2dyZWVuOiBcIjAwZmY3ZlwiLFxuICAgIHN0ZWVsYmx1ZTogXCI0NjgyYjRcIixcbiAgICB0YW46IFwiZDJiNDhjXCIsXG4gICAgdGVhbDogXCIwMDgwODBcIixcbiAgICB0aGlzdGxlOiBcImQ4YmZkOFwiLFxuICAgIHRvbWF0bzogXCJmZjYzNDdcIixcbiAgICB0dXJxdW9pc2U6IFwiNDBlMGQwXCIsXG4gICAgdmlvbGV0OiBcImVlODJlZVwiLFxuICAgIHdoZWF0OiBcImY1ZGViM1wiLFxuICAgIHdoaXRlOiBcImZmZlwiLFxuICAgIHdoaXRlc21va2U6IFwiZjVmNWY1XCIsXG4gICAgeWVsbG93OiBcImZmMFwiLFxuICAgIHllbGxvd2dyZWVuOiBcIjlhY2QzMlwiXG4gIH07XG5cbiAgLy8gTWFrZSBpdCBlYXN5IHRvIGFjY2VzcyBjb2xvcnMgdmlhIGBoZXhOYW1lc1toZXhdYFxuICB2YXIgaGV4TmFtZXMgPSB0aW55Y29sb3IuaGV4TmFtZXMgPSBmbGlwKG5hbWVzKTtcblxuICAvLyBVdGlsaXRpZXNcbiAgLy8gLS0tLS0tLS0tXG5cbiAgLy8gYHsgJ25hbWUxJzogJ3ZhbDEnIH1gIGJlY29tZXMgYHsgJ3ZhbDEnOiAnbmFtZTEnIH1gXG4gIGZ1bmN0aW9uIGZsaXAobykge1xuICAgIHZhciBmbGlwcGVkID0ge307XG4gICAgZm9yICh2YXIgaSBpbiBvKSB7XG4gICAgICBpZiAoby5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICBmbGlwcGVkW29baV1dID0gaTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZsaXBwZWQ7XG4gIH1cblxuICAvLyBSZXR1cm4gYSB2YWxpZCBhbHBoYSB2YWx1ZSBbMCwxXSB3aXRoIGFsbCBpbnZhbGlkIHZhbHVlcyBiZWluZyBzZXQgdG8gMVxuICBmdW5jdGlvbiBib3VuZEFscGhhKGEpIHtcbiAgICBhID0gcGFyc2VGbG9hdChhKTtcbiAgICBpZiAoaXNOYU4oYSkgfHwgYSA8IDAgfHwgYSA+IDEpIHtcbiAgICAgIGEgPSAxO1xuICAgIH1cbiAgICByZXR1cm4gYTtcbiAgfVxuXG4gIC8vIFRha2UgaW5wdXQgZnJvbSBbMCwgbl0gYW5kIHJldHVybiBpdCBhcyBbMCwgMV1cbiAgZnVuY3Rpb24gYm91bmQwMShuLCBtYXgpIHtcbiAgICBpZiAoaXNPbmVQb2ludFplcm8obikpIG4gPSBcIjEwMCVcIjtcbiAgICB2YXIgcHJvY2Vzc1BlcmNlbnQgPSBpc1BlcmNlbnRhZ2Uobik7XG4gICAgbiA9IE1hdGgubWluKG1heCwgTWF0aC5tYXgoMCwgcGFyc2VGbG9hdChuKSkpO1xuXG4gICAgLy8gQXV0b21hdGljYWxseSBjb252ZXJ0IHBlcmNlbnRhZ2UgaW50byBudW1iZXJcbiAgICBpZiAocHJvY2Vzc1BlcmNlbnQpIHtcbiAgICAgIG4gPSBwYXJzZUludChuICogbWF4LCAxMCkgLyAxMDA7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGZsb2F0aW5nIHBvaW50IHJvdW5kaW5nIGVycm9yc1xuICAgIGlmIChNYXRoLmFicyhuIC0gbWF4KSA8IDAuMDAwMDAxKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IGludG8gWzAsIDFdIHJhbmdlIGlmIGl0IGlzbid0IGFscmVhZHlcbiAgICByZXR1cm4gbiAlIG1heCAvIHBhcnNlRmxvYXQobWF4KTtcbiAgfVxuXG4gIC8vIEZvcmNlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMVxuICBmdW5jdGlvbiBjbGFtcDAxKHZhbCkge1xuICAgIHJldHVybiBNYXRoLm1pbigxLCBNYXRoLm1heCgwLCB2YWwpKTtcbiAgfVxuXG4gIC8vIFBhcnNlIGEgYmFzZS0xNiBoZXggdmFsdWUgaW50byBhIGJhc2UtMTAgaW50ZWdlclxuICBmdW5jdGlvbiBwYXJzZUludEZyb21IZXgodmFsKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KHZhbCwgMTYpO1xuICB9XG5cbiAgLy8gTmVlZCB0byBoYW5kbGUgMS4wIGFzIDEwMCUsIHNpbmNlIG9uY2UgaXQgaXMgYSBudW1iZXIsIHRoZXJlIGlzIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiBpdCBhbmQgMVxuICAvLyA8aHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy83NDIyMDcyL2phdmFzY3JpcHQtaG93LXRvLWRldGVjdC1udW1iZXItYXMtYS1kZWNpbWFsLWluY2x1ZGluZy0xLTA+XG4gIGZ1bmN0aW9uIGlzT25lUG9pbnRaZXJvKG4pIHtcbiAgICByZXR1cm4gdHlwZW9mIG4gPT0gXCJzdHJpbmdcIiAmJiBuLmluZGV4T2YoXCIuXCIpICE9IC0xICYmIHBhcnNlRmxvYXQobikgPT09IDE7XG4gIH1cblxuICAvLyBDaGVjayB0byBzZWUgaWYgc3RyaW5nIHBhc3NlZCBpbiBpcyBhIHBlcmNlbnRhZ2VcbiAgZnVuY3Rpb24gaXNQZXJjZW50YWdlKG4pIHtcbiAgICByZXR1cm4gdHlwZW9mIG4gPT09IFwic3RyaW5nXCIgJiYgbi5pbmRleE9mKFwiJVwiKSAhPSAtMTtcbiAgfVxuXG4gIC8vIEZvcmNlIGEgaGV4IHZhbHVlIHRvIGhhdmUgMiBjaGFyYWN0ZXJzXG4gIGZ1bmN0aW9uIHBhZDIoYykge1xuICAgIHJldHVybiBjLmxlbmd0aCA9PSAxID8gXCIwXCIgKyBjIDogXCJcIiArIGM7XG4gIH1cblxuICAvLyBSZXBsYWNlIGEgZGVjaW1hbCB3aXRoIGl0J3MgcGVyY2VudGFnZSB2YWx1ZVxuICBmdW5jdGlvbiBjb252ZXJ0VG9QZXJjZW50YWdlKG4pIHtcbiAgICBpZiAobiA8PSAxKSB7XG4gICAgICBuID0gbiAqIDEwMCArIFwiJVwiO1xuICAgIH1cbiAgICByZXR1cm4gbjtcbiAgfVxuXG4gIC8vIENvbnZlcnRzIGEgZGVjaW1hbCB0byBhIGhleCB2YWx1ZVxuICBmdW5jdGlvbiBjb252ZXJ0RGVjaW1hbFRvSGV4KGQpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KGQpICogMjU1KS50b1N0cmluZygxNik7XG4gIH1cbiAgLy8gQ29udmVydHMgYSBoZXggdmFsdWUgdG8gYSBkZWNpbWFsXG4gIGZ1bmN0aW9uIGNvbnZlcnRIZXhUb0RlY2ltYWwoaCkge1xuICAgIHJldHVybiBwYXJzZUludEZyb21IZXgoaCkgLyAyNTU7XG4gIH1cbiAgdmFyIG1hdGNoZXJzID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIDxodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXZhbHVlcy8jaW50ZWdlcnM+XG4gICAgdmFyIENTU19JTlRFR0VSID0gXCJbLVxcXFwrXT9cXFxcZCslP1wiO1xuXG4gICAgLy8gPGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtdmFsdWVzLyNudW1iZXItdmFsdWU+XG4gICAgdmFyIENTU19OVU1CRVIgPSBcIlstXFxcXCtdP1xcXFxkKlxcXFwuXFxcXGQrJT9cIjtcblxuICAgIC8vIEFsbG93IHBvc2l0aXZlL25lZ2F0aXZlIGludGVnZXIvbnVtYmVyLiAgRG9uJ3QgY2FwdHVyZSB0aGUgZWl0aGVyL29yLCBqdXN0IHRoZSBlbnRpcmUgb3V0Y29tZS5cbiAgICB2YXIgQ1NTX1VOSVQgPSBcIig/OlwiICsgQ1NTX05VTUJFUiArIFwiKXwoPzpcIiArIENTU19JTlRFR0VSICsgXCIpXCI7XG5cbiAgICAvLyBBY3R1YWwgbWF0Y2hpbmcuXG4gICAgLy8gUGFyZW50aGVzZXMgYW5kIGNvbW1hcyBhcmUgb3B0aW9uYWwsIGJ1dCBub3QgcmVxdWlyZWQuXG4gICAgLy8gV2hpdGVzcGFjZSBjYW4gdGFrZSB0aGUgcGxhY2Ugb2YgY29tbWFzIG9yIG9wZW5pbmcgcGFyZW5cbiAgICB2YXIgUEVSTUlTU0lWRV9NQVRDSDMgPSBcIltcXFxcc3xcXFxcKF0rKFwiICsgQ1NTX1VOSVQgKyBcIilbLHxcXFxcc10rKFwiICsgQ1NTX1VOSVQgKyBcIilbLHxcXFxcc10rKFwiICsgQ1NTX1VOSVQgKyBcIilcXFxccypcXFxcKT9cIjtcbiAgICB2YXIgUEVSTUlTU0lWRV9NQVRDSDQgPSBcIltcXFxcc3xcXFxcKF0rKFwiICsgQ1NTX1VOSVQgKyBcIilbLHxcXFxcc10rKFwiICsgQ1NTX1VOSVQgKyBcIilbLHxcXFxcc10rKFwiICsgQ1NTX1VOSVQgKyBcIilbLHxcXFxcc10rKFwiICsgQ1NTX1VOSVQgKyBcIilcXFxccypcXFxcKT9cIjtcbiAgICByZXR1cm4ge1xuICAgICAgQ1NTX1VOSVQ6IG5ldyBSZWdFeHAoQ1NTX1VOSVQpLFxuICAgICAgcmdiOiBuZXcgUmVnRXhwKFwicmdiXCIgKyBQRVJNSVNTSVZFX01BVENIMyksXG4gICAgICByZ2JhOiBuZXcgUmVnRXhwKFwicmdiYVwiICsgUEVSTUlTU0lWRV9NQVRDSDQpLFxuICAgICAgaHNsOiBuZXcgUmVnRXhwKFwiaHNsXCIgKyBQRVJNSVNTSVZFX01BVENIMyksXG4gICAgICBoc2xhOiBuZXcgUmVnRXhwKFwiaHNsYVwiICsgUEVSTUlTU0lWRV9NQVRDSDQpLFxuICAgICAgaHN2OiBuZXcgUmVnRXhwKFwiaHN2XCIgKyBQRVJNSVNTSVZFX01BVENIMyksXG4gICAgICBoc3ZhOiBuZXcgUmVnRXhwKFwiaHN2YVwiICsgUEVSTUlTU0lWRV9NQVRDSDQpLFxuICAgICAgaGV4MzogL14jPyhbMC05YS1mQS1GXXsxfSkoWzAtOWEtZkEtRl17MX0pKFswLTlhLWZBLUZdezF9KSQvLFxuICAgICAgaGV4NjogL14jPyhbMC05YS1mQS1GXXsyfSkoWzAtOWEtZkEtRl17Mn0pKFswLTlhLWZBLUZdezJ9KSQvLFxuICAgICAgaGV4NDogL14jPyhbMC05YS1mQS1GXXsxfSkoWzAtOWEtZkEtRl17MX0pKFswLTlhLWZBLUZdezF9KShbMC05YS1mQS1GXXsxfSkkLyxcbiAgICAgIGhleDg6IC9eIz8oWzAtOWEtZkEtRl17Mn0pKFswLTlhLWZBLUZdezJ9KShbMC05YS1mQS1GXXsyfSkoWzAtOWEtZkEtRl17Mn0pJC9cbiAgICB9O1xuICB9KCk7XG5cbiAgLy8gYGlzVmFsaWRDU1NVbml0YFxuICAvLyBUYWtlIGluIGEgc2luZ2xlIHN0cmluZyAvIG51bWJlciBhbmQgY2hlY2sgdG8gc2VlIGlmIGl0IGxvb2tzIGxpa2UgYSBDU1MgdW5pdFxuICAvLyAoc2VlIGBtYXRjaGVyc2AgYWJvdmUgZm9yIGRlZmluaXRpb24pLlxuICBmdW5jdGlvbiBpc1ZhbGlkQ1NTVW5pdChjb2xvcikge1xuICAgIHJldHVybiAhIW1hdGNoZXJzLkNTU19VTklULmV4ZWMoY29sb3IpO1xuICB9XG5cbiAgLy8gYHN0cmluZ0lucHV0VG9PYmplY3RgXG4gIC8vIFBlcm1pc3NpdmUgc3RyaW5nIHBhcnNpbmcuICBUYWtlIGluIGEgbnVtYmVyIG9mIGZvcm1hdHMsIGFuZCBvdXRwdXQgYW4gb2JqZWN0XG4gIC8vIGJhc2VkIG9uIGRldGVjdGVkIGZvcm1hdC4gIFJldHVybnMgYHsgciwgZywgYiB9YCBvciBgeyBoLCBzLCBsIH1gIG9yIGB7IGgsIHMsIHZ9YFxuICBmdW5jdGlvbiBzdHJpbmdJbnB1dFRvT2JqZWN0KGNvbG9yKSB7XG4gICAgY29sb3IgPSBjb2xvci5yZXBsYWNlKHRyaW1MZWZ0LCBcIlwiKS5yZXBsYWNlKHRyaW1SaWdodCwgXCJcIikudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgbmFtZWQgPSBmYWxzZTtcbiAgICBpZiAobmFtZXNbY29sb3JdKSB7XG4gICAgICBjb2xvciA9IG5hbWVzW2NvbG9yXTtcbiAgICAgIG5hbWVkID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGNvbG9yID09IFwidHJhbnNwYXJlbnRcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcjogMCxcbiAgICAgICAgZzogMCxcbiAgICAgICAgYjogMCxcbiAgICAgICAgYTogMCxcbiAgICAgICAgZm9ybWF0OiBcIm5hbWVcIlxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBUcnkgdG8gbWF0Y2ggc3RyaW5nIGlucHV0IHVzaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMuXG4gICAgLy8gS2VlcCBtb3N0IG9mIHRoZSBudW1iZXIgYm91bmRpbmcgb3V0IG9mIHRoaXMgZnVuY3Rpb24gLSBkb24ndCB3b3JyeSBhYm91dCBbMCwxXSBvciBbMCwxMDBdIG9yIFswLDM2MF1cbiAgICAvLyBKdXN0IHJldHVybiBhbiBvYmplY3QgYW5kIGxldCB0aGUgY29udmVyc2lvbiBmdW5jdGlvbnMgaGFuZGxlIHRoYXQuXG4gICAgLy8gVGhpcyB3YXkgdGhlIHJlc3VsdCB3aWxsIGJlIHRoZSBzYW1lIHdoZXRoZXIgdGhlIHRpbnljb2xvciBpcyBpbml0aWFsaXplZCB3aXRoIHN0cmluZyBvciBvYmplY3QuXG4gICAgdmFyIG1hdGNoO1xuICAgIGlmIChtYXRjaCA9IG1hdGNoZXJzLnJnYi5leGVjKGNvbG9yKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcjogbWF0Y2hbMV0sXG4gICAgICAgIGc6IG1hdGNoWzJdLFxuICAgICAgICBiOiBtYXRjaFszXVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG1hdGNoID0gbWF0Y2hlcnMucmdiYS5leGVjKGNvbG9yKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcjogbWF0Y2hbMV0sXG4gICAgICAgIGc6IG1hdGNoWzJdLFxuICAgICAgICBiOiBtYXRjaFszXSxcbiAgICAgICAgYTogbWF0Y2hbNF1cbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChtYXRjaCA9IG1hdGNoZXJzLmhzbC5leGVjKGNvbG9yKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaDogbWF0Y2hbMV0sXG4gICAgICAgIHM6IG1hdGNoWzJdLFxuICAgICAgICBsOiBtYXRjaFszXVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG1hdGNoID0gbWF0Y2hlcnMuaHNsYS5leGVjKGNvbG9yKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaDogbWF0Y2hbMV0sXG4gICAgICAgIHM6IG1hdGNoWzJdLFxuICAgICAgICBsOiBtYXRjaFszXSxcbiAgICAgICAgYTogbWF0Y2hbNF1cbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChtYXRjaCA9IG1hdGNoZXJzLmhzdi5leGVjKGNvbG9yKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaDogbWF0Y2hbMV0sXG4gICAgICAgIHM6IG1hdGNoWzJdLFxuICAgICAgICB2OiBtYXRjaFszXVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG1hdGNoID0gbWF0Y2hlcnMuaHN2YS5leGVjKGNvbG9yKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaDogbWF0Y2hbMV0sXG4gICAgICAgIHM6IG1hdGNoWzJdLFxuICAgICAgICB2OiBtYXRjaFszXSxcbiAgICAgICAgYTogbWF0Y2hbNF1cbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChtYXRjaCA9IG1hdGNoZXJzLmhleDguZXhlYyhjb2xvcikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHI6IHBhcnNlSW50RnJvbUhleChtYXRjaFsxXSksXG4gICAgICAgIGc6IHBhcnNlSW50RnJvbUhleChtYXRjaFsyXSksXG4gICAgICAgIGI6IHBhcnNlSW50RnJvbUhleChtYXRjaFszXSksXG4gICAgICAgIGE6IGNvbnZlcnRIZXhUb0RlY2ltYWwobWF0Y2hbNF0pLFxuICAgICAgICBmb3JtYXQ6IG5hbWVkID8gXCJuYW1lXCIgOiBcImhleDhcIlxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG1hdGNoID0gbWF0Y2hlcnMuaGV4Ni5leGVjKGNvbG9yKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcjogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzFdKSxcbiAgICAgICAgZzogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzJdKSxcbiAgICAgICAgYjogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzNdKSxcbiAgICAgICAgZm9ybWF0OiBuYW1lZCA/IFwibmFtZVwiIDogXCJoZXhcIlxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG1hdGNoID0gbWF0Y2hlcnMuaGV4NC5leGVjKGNvbG9yKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcjogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzFdICsgXCJcIiArIG1hdGNoWzFdKSxcbiAgICAgICAgZzogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzJdICsgXCJcIiArIG1hdGNoWzJdKSxcbiAgICAgICAgYjogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzNdICsgXCJcIiArIG1hdGNoWzNdKSxcbiAgICAgICAgYTogY29udmVydEhleFRvRGVjaW1hbChtYXRjaFs0XSArIFwiXCIgKyBtYXRjaFs0XSksXG4gICAgICAgIGZvcm1hdDogbmFtZWQgPyBcIm5hbWVcIiA6IFwiaGV4OFwiXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAobWF0Y2ggPSBtYXRjaGVycy5oZXgzLmV4ZWMoY29sb3IpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByOiBwYXJzZUludEZyb21IZXgobWF0Y2hbMV0gKyBcIlwiICsgbWF0Y2hbMV0pLFxuICAgICAgICBnOiBwYXJzZUludEZyb21IZXgobWF0Y2hbMl0gKyBcIlwiICsgbWF0Y2hbMl0pLFxuICAgICAgICBiOiBwYXJzZUludEZyb21IZXgobWF0Y2hbM10gKyBcIlwiICsgbWF0Y2hbM10pLFxuICAgICAgICBmb3JtYXQ6IG5hbWVkID8gXCJuYW1lXCIgOiBcImhleFwiXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZnVuY3Rpb24gdmFsaWRhdGVXQ0FHMlBhcm1zKHBhcm1zKSB7XG4gICAgLy8gcmV0dXJuIHZhbGlkIFdDQUcyIHBhcm1zIGZvciBpc1JlYWRhYmxlLlxuICAgIC8vIElmIGlucHV0IHBhcm1zIGFyZSBpbnZhbGlkLCByZXR1cm4ge1wibGV2ZWxcIjpcIkFBXCIsIFwic2l6ZVwiOlwic21hbGxcIn1cbiAgICB2YXIgbGV2ZWwsIHNpemU7XG4gICAgcGFybXMgPSBwYXJtcyB8fCB7XG4gICAgICBsZXZlbDogXCJBQVwiLFxuICAgICAgc2l6ZTogXCJzbWFsbFwiXG4gICAgfTtcbiAgICBsZXZlbCA9IChwYXJtcy5sZXZlbCB8fCBcIkFBXCIpLnRvVXBwZXJDYXNlKCk7XG4gICAgc2l6ZSA9IChwYXJtcy5zaXplIHx8IFwic21hbGxcIikudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobGV2ZWwgIT09IFwiQUFcIiAmJiBsZXZlbCAhPT0gXCJBQUFcIikge1xuICAgICAgbGV2ZWwgPSBcIkFBXCI7XG4gICAgfVxuICAgIGlmIChzaXplICE9PSBcInNtYWxsXCIgJiYgc2l6ZSAhPT0gXCJsYXJnZVwiKSB7XG4gICAgICBzaXplID0gXCJzbWFsbFwiO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbGV2ZWw6IGxldmVsLFxuICAgICAgc2l6ZTogc2l6ZVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gdGlueWNvbG9yO1xuXG59KSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbnZhciBfdGlueWNvbG9yID0gcmVxdWlyZSgndGlueWNvbG9yMicpO1xuXG52YXIgX3Rpbnljb2xvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF90aW55Y29sb3IpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIENvbG9yID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDb2xvcihpbnB1dCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29sb3IpO1xuXG4gICAgdGhpcy5pbml0UmdiID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9jb2xvciR0b1JnYiA9IF90aGlzLmNvbG9yLnRvUmdiKCksXG4gICAgICAgICAgciA9IF9jb2xvciR0b1JnYi5yLFxuICAgICAgICAgIGcgPSBfY29sb3IkdG9SZ2IuZyxcbiAgICAgICAgICBiID0gX2NvbG9yJHRvUmdiLmI7XG5cbiAgICAgIF90aGlzLnJlZFZhbHVlID0gcjtcbiAgICAgIF90aGlzLmdyZWVuVmFsdWUgPSBnO1xuICAgICAgX3RoaXMuYmx1ZVZhbHVlID0gYjtcbiAgICB9O1xuXG4gICAgdGhpcy5pbml0SHNiID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9jb2xvciR0b0hzdiA9IF90aGlzLmNvbG9yLnRvSHN2KCksXG4gICAgICAgICAgaCA9IF9jb2xvciR0b0hzdi5oLFxuICAgICAgICAgIHMgPSBfY29sb3IkdG9Ic3YucyxcbiAgICAgICAgICB2ID0gX2NvbG9yJHRvSHN2LnY7XG5cbiAgICAgIF90aGlzLmh1ZVZhbHVlID0gaDtcbiAgICAgIF90aGlzLnNhdHVyYXRpb25WYWx1ZSA9IHM7XG4gICAgICBfdGhpcy5icmlnaHRuZXNzVmFsdWUgPSB2O1xuICAgIH07XG5cbiAgICB0aGlzLnRvSGV4U3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLmNvbG9yLnRvSGV4U3RyaW5nKCk7XG4gICAgfTtcblxuICAgIHRoaXMudG9SZ2JTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMuY29sb3IudG9SZ2JTdHJpbmcoKTtcbiAgICB9O1xuXG4gICAgdGhpcy5jb2xvciA9ICgwLCBfdGlueWNvbG9yMltcImRlZmF1bHRcIl0pKGlucHV0KTtcblxuICAgIHRoaXMuaW5pdFJnYigpO1xuICAgIHRoaXMuaW5pdEhzYigpO1xuXG4gICAgdmFyIGluaXRBbHBoYSA9IGlucHV0ICYmIGlucHV0LmFscGhhIHx8IHRoaXMuY29sb3IudG9SZ2IoKS5hO1xuICAgIHRoaXMuYWxwaGFWYWx1ZSA9IE1hdGgubWluKDEsIGluaXRBbHBoYSkgKiAxMDA7XG4gIH1cblxuICBDb2xvci5pc1ZhbGlkSGV4ID0gZnVuY3Rpb24gaXNWYWxpZEhleChoZXgpIHtcbiAgICByZXR1cm4gKDAsIF90aW55Y29sb3IyW1wiZGVmYXVsdFwiXSkoaGV4KS5pc1ZhbGlkKCk7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKENvbG9yLCBbe1xuICAgIGtleTogJ2hleCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb2xvci50b0hleCgpO1xuICAgIH1cblxuICAgIC8vIOiJsuiwg1xuXG4gIH0sIHtcbiAgICBrZXk6ICdodWUnLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgICB0aGlzLmNvbG9yID0gKDAsIF90aW55Y29sb3IyW1wiZGVmYXVsdFwiXSkoe1xuICAgICAgICBoOiB2YWx1ZSxcbiAgICAgICAgczogdGhpcy5zYXR1cmF0aW9uLFxuICAgICAgICB2OiB0aGlzLmJyaWdodG5lc3NcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmluaXRSZ2IoKTtcbiAgICAgIHRoaXMuaHVlVmFsdWUgPSB2YWx1ZTtcbiAgICB9LFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaHVlVmFsdWU7XG4gICAgfVxuXG4gICAgLy8g6aWx5ZKM5bqmXG5cbiAgfSwge1xuICAgIGtleTogJ3NhdHVyYXRpb24nLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgICB0aGlzLmNvbG9yID0gKDAsIF90aW55Y29sb3IyW1wiZGVmYXVsdFwiXSkoe1xuICAgICAgICBoOiB0aGlzLmh1ZSxcbiAgICAgICAgczogdmFsdWUsXG4gICAgICAgIHY6IHRoaXMuYnJpZ2h0bmVzc1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuaW5pdFJnYigpO1xuICAgICAgdGhpcy5zYXR1cmF0aW9uVmFsdWUgPSB2YWx1ZTtcbiAgICB9LFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2F0dXJhdGlvblZhbHVlO1xuICAgIH1cblxuICAgIC8vIOS6ruW6plxuXG4gIH0sIHtcbiAgICBrZXk6ICdsaWdodG5lc3MnLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgICB0aGlzLmNvbG9yID0gKDAsIF90aW55Y29sb3IyW1wiZGVmYXVsdFwiXSkoe1xuICAgICAgICBoOiB0aGlzLmh1ZSxcbiAgICAgICAgczogdGhpcy5zYXR1cmF0aW9uLFxuICAgICAgICBsOiB2YWx1ZVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuaW5pdFJnYigpO1xuICAgICAgdGhpcy5saWdodG5lc3NWYWx1ZSA9IHZhbHVlO1xuICAgIH0sXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5saWdodG5lc3NWYWx1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdicmlnaHRuZXNzJyxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgICAgdGhpcy5jb2xvciA9ICgwLCBfdGlueWNvbG9yMltcImRlZmF1bHRcIl0pKHtcbiAgICAgICAgaDogdGhpcy5odWUsXG4gICAgICAgIHM6IHRoaXMuc2F0dXJhdGlvbixcbiAgICAgICAgdjogdmFsdWVcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmluaXRSZ2IoKTtcbiAgICAgIHRoaXMuYnJpZ2h0bmVzc1ZhbHVlID0gdmFsdWU7XG4gICAgfSxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmJyaWdodG5lc3NWYWx1ZTtcbiAgICB9XG5cbiAgICAvLyByZWRcblxuICB9LCB7XG4gICAga2V5OiAncmVkJyxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgICAgdmFyIHJnYiA9IHRoaXMuY29sb3IudG9SZ2IoKTtcbiAgICAgIHRoaXMuY29sb3IgPSAoMCwgX3Rpbnljb2xvcjJbXCJkZWZhdWx0XCJdKShfZXh0ZW5kcyh7fSwgcmdiLCB7XG4gICAgICAgIHI6IHZhbHVlXG4gICAgICB9KSk7XG5cbiAgICAgIHRoaXMuaW5pdEhzYigpO1xuICAgICAgdGhpcy5yZWRWYWx1ZSA9IHZhbHVlO1xuICAgIH0sXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWRWYWx1ZTtcbiAgICB9XG5cbiAgICAvLyBncmVlblxuXG4gIH0sIHtcbiAgICBrZXk6ICdncmVlbicsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgIHZhciByZ2IgPSB0aGlzLmNvbG9yLnRvUmdiKCk7XG4gICAgICB0aGlzLmNvbG9yID0gKDAsIF90aW55Y29sb3IyW1wiZGVmYXVsdFwiXSkoX2V4dGVuZHMoe30sIHJnYiwge1xuICAgICAgICBnOiB2YWx1ZVxuICAgICAgfSkpO1xuXG4gICAgICB0aGlzLmluaXRIc2IoKTtcbiAgICAgIHRoaXMuZ3JlZW5WYWx1ZSA9IHZhbHVlO1xuICAgIH0sXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5ncmVlblZhbHVlO1xuICAgIH1cblxuICAgIC8vIGJsdWVcblxuICB9LCB7XG4gICAga2V5OiAnYmx1ZScsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgIHZhciByZ2IgPSB0aGlzLmNvbG9yLnRvUmdiKCk7XG4gICAgICB0aGlzLmNvbG9yID0gKDAsIF90aW55Y29sb3IyW1wiZGVmYXVsdFwiXSkoX2V4dGVuZHMoe30sIHJnYiwge1xuICAgICAgICBiOiB2YWx1ZVxuICAgICAgfSkpO1xuXG4gICAgICB0aGlzLmluaXRIc2IoKTtcbiAgICAgIHRoaXMuYmx1ZVZhbHVlID0gdmFsdWU7XG4gICAgfSxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmJsdWVWYWx1ZTtcbiAgICB9XG5cbiAgICAvLyBhbHBoYVxuXG4gIH0sIHtcbiAgICBrZXk6ICdhbHBoYScsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgIHRoaXMuY29sb3Iuc2V0QWxwaGEodmFsdWUgLyAxMDApO1xuICAgIH0sXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb2xvci5nZXRBbHBoYSgpICogMTAwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ1JHQicsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gW3RoaXMucmVkLCB0aGlzLmdyZWVuLCB0aGlzLmJsdWVdO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ0hTQicsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gW3RoaXMuaHVlLCB0aGlzLnNhdHVyYXRpb24sIHRoaXMuYnJpZ2h0bmVzc107XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIENvbG9yO1xufSgpO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IENvbG9yO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcmVhY3REb20gPSByZXF1aXJlKCdyZWFjdC1kb20nKTtcblxudmFyIF9yZWFjdERvbTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdERvbSk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX2FkZEV2ZW50TGlzdGVuZXIgPSByZXF1aXJlKCdyYy11dGlsL2xpYi9Eb20vYWRkRXZlbnRMaXN0ZW5lcicpO1xuXG52YXIgX2FkZEV2ZW50TGlzdGVuZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYWRkRXZlbnRMaXN0ZW5lcik7XG5cbnZhciBfY29sb3IgPSByZXF1aXJlKCcuL2hlbHBlcnMvY29sb3InKTtcblxudmFyIF9jb2xvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb2xvcik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfZGVmYXVsdHMob2JqLCBkZWZhdWx0cykgeyB2YXIga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGRlZmF1bHRzKTsgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7IHZhciBrZXkgPSBrZXlzW2ldOyB2YXIgdmFsdWUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGRlZmF1bHRzLCBrZXkpOyBpZiAodmFsdWUgJiYgdmFsdWUuY29uZmlndXJhYmxlICYmIG9ialtrZXldID09PSB1bmRlZmluZWQpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSk7IH0gfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IF9kZWZhdWx0cyhzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxudmFyIFdJRFRIID0gMjAwO1xudmFyIEhFSUdIVCA9IDE1MDtcblxudmFyIEJvYXJkID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKEJvYXJkLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBCb2FyZChwcm9wcykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBCb2FyZCk7XG5cbiAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmNhbGwodGhpcywgcHJvcHMpKTtcblxuICAgIF90aGlzLm9uQm9hcmRNb3VzZURvd24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGJ1dHRvbnMgPSBlLmJ1dHRvbnM7XG5cbiAgICAgIC8vIG9ubHkgd29yayBvbiBsZWZ0IGNsaWNrXG4gICAgICAvLyBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0V2ZW50cy9tb3VzZWRvd25cbiAgICAgIGlmIChidXR0b25zICE9PSAxKSByZXR1cm47XG5cbiAgICAgIHZhciB4ID0gZS5jbGllbnRYO1xuICAgICAgdmFyIHkgPSBlLmNsaWVudFk7XG4gICAgICBfdGhpcy5wb2ludE1vdmVUbyh7XG4gICAgICAgIHg6IHgsXG4gICAgICAgIHk6IHlcbiAgICAgIH0pO1xuICAgICAgX3RoaXMucmVtb3ZlTGlzdGVuZXJzKCk7XG4gICAgICBfdGhpcy5kcmFnTGlzdGVuZXIgPSAoMCwgX2FkZEV2ZW50TGlzdGVuZXIyW1wiZGVmYXVsdFwiXSkod2luZG93LCAnbW91c2Vtb3ZlJywgX3RoaXMub25Cb2FyZERyYWcpO1xuICAgICAgX3RoaXMuZHJhZ1VwTGlzdGVuZXIgPSAoMCwgX2FkZEV2ZW50TGlzdGVuZXIyW1wiZGVmYXVsdFwiXSkod2luZG93LCAnbW91c2V1cCcsIF90aGlzLm9uQm9hcmREcmFnRW5kKTtcbiAgICB9O1xuXG4gICAgX3RoaXMub25Cb2FyZFRvdWNoU3RhcnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKGUudG91Y2hlcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgX3RoaXMucmVtb3ZlVG91Y2hMaXN0ZW5lcnMoKTtcbiAgICAgIHZhciB4ID0gZS50YXJnZXRUb3VjaGVzWzBdLmNsaWVudFg7XG4gICAgICB2YXIgeSA9IGUudGFyZ2V0VG91Y2hlc1swXS5jbGllbnRZO1xuICAgICAgX3RoaXMucG9pbnRNb3ZlVG8oe1xuICAgICAgICB4OiB4LFxuICAgICAgICB5OiB5XG4gICAgICB9KTtcbiAgICAgIF90aGlzLnRvdWNoTW92ZUxpc3RlbmVyID0gKDAsIF9hZGRFdmVudExpc3RlbmVyMltcImRlZmF1bHRcIl0pKHdpbmRvdywgJ3RvdWNobW92ZScsIF90aGlzLm9uQm9hcmRUb3VjaE1vdmUpO1xuICAgICAgX3RoaXMudG91Y2hFbmRMaXN0ZW5lciA9ICgwLCBfYWRkRXZlbnRMaXN0ZW5lcjJbXCJkZWZhdWx0XCJdKSh3aW5kb3csICd0b3VjaGVuZCcsIF90aGlzLm9uQm9hcmRUb3VjaEVuZCk7XG4gICAgfTtcblxuICAgIF90aGlzLm9uQm9hcmRUb3VjaE1vdmUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKGUucHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgeCA9IGUudGFyZ2V0VG91Y2hlc1swXS5jbGllbnRYO1xuICAgICAgdmFyIHkgPSBlLnRhcmdldFRvdWNoZXNbMF0uY2xpZW50WTtcbiAgICAgIF90aGlzLnBvaW50TW92ZVRvKHtcbiAgICAgICAgeDogeCxcbiAgICAgICAgeTogeVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzLm9uQm9hcmRUb3VjaEVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLnJlbW92ZVRvdWNoTGlzdGVuZXJzKCk7XG4gICAgfTtcblxuICAgIF90aGlzLm9uQm9hcmREcmFnID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB4ID0gZS5jbGllbnRYO1xuICAgICAgdmFyIHkgPSBlLmNsaWVudFk7XG4gICAgICBfdGhpcy5wb2ludE1vdmVUbyh7XG4gICAgICAgIHg6IHgsXG4gICAgICAgIHk6IHlcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpcy5vbkJvYXJkRHJhZ0VuZCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgeCA9IGUuY2xpZW50WDtcbiAgICAgIHZhciB5ID0gZS5jbGllbnRZO1xuICAgICAgX3RoaXMucG9pbnRNb3ZlVG8oe1xuICAgICAgICB4OiB4LFxuICAgICAgICB5OiB5XG4gICAgICB9KTtcbiAgICAgIF90aGlzLnJlbW92ZUxpc3RlbmVycygpO1xuICAgIH07XG5cbiAgICBfdGhpcy5nZXRQcmVmaXhDbHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMucHJvcHMucm9vdFByZWZpeENscyArICctYm9hcmQnO1xuICAgIH07XG5cbiAgICBfdGhpcy5yZW1vdmVUb3VjaExpc3RlbmVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy50b3VjaE1vdmVMaXN0ZW5lcikge1xuICAgICAgICBfdGhpcy50b3VjaE1vdmVMaXN0ZW5lci5yZW1vdmUoKTtcbiAgICAgICAgX3RoaXMudG91Y2hNb3ZlTGlzdGVuZXIgPSBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKF90aGlzLnRvdWNoRW5kTGlzdGVuZXIpIHtcbiAgICAgICAgX3RoaXMudG91Y2hFbmRMaXN0ZW5lci5yZW1vdmUoKTtcbiAgICAgICAgX3RoaXMudG91Y2hFbmRMaXN0ZW5lciA9IG51bGw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLnJlbW92ZUxpc3RlbmVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy5kcmFnTGlzdGVuZXIpIHtcbiAgICAgICAgX3RoaXMuZHJhZ0xpc3RlbmVyLnJlbW92ZSgpO1xuICAgICAgICBfdGhpcy5kcmFnTGlzdGVuZXIgPSBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKF90aGlzLmRyYWdVcExpc3RlbmVyKSB7XG4gICAgICAgIF90aGlzLmRyYWdVcExpc3RlbmVyLnJlbW92ZSgpO1xuICAgICAgICBfdGhpcy5kcmFnVXBMaXN0ZW5lciA9IG51bGw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLnBvaW50TW92ZVRvID0gZnVuY3Rpb24gKHBvcykge1xuICAgICAgdmFyIHJlY3QgPSBfcmVhY3REb20yW1wiZGVmYXVsdFwiXS5maW5kRE9NTm9kZShfdGhpcykuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB2YXIgbGVmdCA9IHBvcy54IC0gcmVjdC5sZWZ0O1xuICAgICAgdmFyIHRvcCA9IHBvcy55IC0gcmVjdC50b3A7XG5cbiAgICAgIHZhciByV2lkdGggPSByZWN0LndpZHRoIHx8IFdJRFRIO1xuICAgICAgdmFyIHJIZWlnaHQgPSByZWN0LmhlaWdodCB8fCBIRUlHSFQ7XG5cbiAgICAgIGxlZnQgPSBNYXRoLm1heCgwLCBsZWZ0KTtcbiAgICAgIGxlZnQgPSBNYXRoLm1pbihsZWZ0LCByV2lkdGgpO1xuICAgICAgdG9wID0gTWF0aC5tYXgoMCwgdG9wKTtcbiAgICAgIHRvcCA9IE1hdGgubWluKHRvcCwgckhlaWdodCk7XG5cbiAgICAgIHZhciBjb2xvciA9IF90aGlzLnByb3BzLmNvbG9yO1xuXG5cbiAgICAgIGNvbG9yLnNhdHVyYXRpb24gPSBsZWZ0IC8gcldpZHRoO1xuICAgICAgY29sb3IuYnJpZ2h0bmVzcyA9IDEgLSB0b3AgLyBySGVpZ2h0O1xuXG4gICAgICBfdGhpcy5wcm9wcy5vbkNoYW5nZShjb2xvcik7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIEJvYXJkLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5yZW1vdmVUb3VjaExpc3RlbmVycygpO1xuICB9O1xuXG4gIC8qKlxuICAgKiDnp7vliqjlhYnmoIfkvY3nva7liLBcbiAgICogQHBhcmFtICB7b2JqZWN0fSBwb3MgWCBZIOWFqOWxgOWdkOagh+eCuVxuICAgKi9cblxuXG4gIEJvYXJkLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIHByZWZpeENscyA9IHRoaXMuZ2V0UHJlZml4Q2xzKCk7XG4gICAgdmFyIGNvbG9yID0gdGhpcy5wcm9wcy5jb2xvcjtcblxuICAgIHZhciBodWVIc3YgPSB7XG4gICAgICBoOiBjb2xvci5odWUsXG4gICAgICBzOiAxLFxuICAgICAgdjogMVxuICAgIH07XG5cbiAgICB2YXIgaHVlQ29sb3IgPSBuZXcgX2NvbG9yMltcImRlZmF1bHRcIl0oaHVlSHN2KS50b0hleFN0cmluZygpO1xuXG4gICAgdmFyIHhSZWwgPSBjb2xvci5zYXR1cmF0aW9uICogMTAwO1xuICAgIHZhciB5UmVsID0gKDEgLSBjb2xvci5icmlnaHRuZXNzKSAqIDEwMDtcblxuICAgIHJldHVybiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgJ2RpdicsXG4gICAgICB7IGNsYXNzTmFtZTogcHJlZml4Q2xzIH0sXG4gICAgICBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnZGl2JyxcbiAgICAgICAgeyBjbGFzc05hbWU6IHByZWZpeENscyArICctaHN2Jywgc3R5bGU6IHsgYmFja2dyb3VuZENvbG9yOiBodWVDb2xvciB9IH0sXG4gICAgICAgIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoJ2RpdicsIHsgY2xhc3NOYW1lOiBwcmVmaXhDbHMgKyAnLXZhbHVlJyB9KSxcbiAgICAgICAgX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudCgnZGl2JywgeyBjbGFzc05hbWU6IHByZWZpeENscyArICctc2F0dXJhdGlvbicgfSlcbiAgICAgICksXG4gICAgICBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KCdzcGFuJywgeyBzdHlsZTogeyBsZWZ0OiB4UmVsICsgJyUnLCB0b3A6IHlSZWwgKyAnJScgfSB9KSxcbiAgICAgIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoJ2RpdicsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBwcmVmaXhDbHMgKyAnLWhhbmRsZXInLFxuICAgICAgICBvbk1vdXNlRG93bjogdGhpcy5vbkJvYXJkTW91c2VEb3duLFxuICAgICAgICBvblRvdWNoU3RhcnQ6IHRoaXMub25Cb2FyZFRvdWNoU3RhcnRcbiAgICAgIH0pXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gQm9hcmQ7XG59KF9yZWFjdDJbXCJkZWZhdWx0XCJdLkNvbXBvbmVudCk7XG5cbi8qKlxuICogaHN2XG4gKiBoOiByYW5nZSgwLCAzNTkpXG4gKiBzOiByYW5nZSgwLCAxKVxuICogdjogcmFuZ2UoMCwgMSlcbiAqL1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IEJvYXJkO1xuQm9hcmQucHJvcFR5cGVzID0ge1xuICBjb2xvcjogX3Byb3BUeXBlczJbXCJkZWZhdWx0XCJdLm9iamVjdCxcbiAgb25DaGFuZ2U6IF9wcm9wVHlwZXMyW1wiZGVmYXVsdFwiXS5mdW5jLFxuICByb290UHJlZml4Q2xzOiBfcHJvcFR5cGVzMltcImRlZmF1bHRcIl0uc3RyaW5nXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX2NvbG9yID0gcmVxdWlyZSgnLi9oZWxwZXJzL2NvbG9yJyk7XG5cbnZhciBfY29sb3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29sb3IpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX2RlZmF1bHRzKG9iaiwgZGVmYXVsdHMpIHsgdmFyIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkZWZhdWx0cyk7IGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgeyB2YXIga2V5ID0ga2V5c1tpXTsgdmFyIHZhbHVlID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihkZWZhdWx0cywga2V5KTsgaWYgKHZhbHVlICYmIHZhbHVlLmNvbmZpZ3VyYWJsZSAmJiBvYmpba2V5XSA9PT0gdW5kZWZpbmVkKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpOyB9IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBfZGVmYXVsdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbnZhciBQcmV2aWV3ID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFByZXZpZXcsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFByZXZpZXcoKSB7XG4gICAgdmFyIF90ZW1wLCBfdGhpcywgX3JldDtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQcmV2aWV3KTtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHJldHVybiBfcmV0ID0gKF90ZW1wID0gKF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1JlYWN0JENvbXBvbmVudC5jYWxsLmFwcGx5KF9SZWFjdCRDb21wb25lbnQsIFt0aGlzXS5jb25jYXQoYXJncykpKSwgX3RoaXMpLCBfdGhpcy5vbkNoYW5nZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdmFsdWUgPSBlLnRhcmdldC52YWx1ZTtcbiAgICAgIHZhciBjb2xvciA9IG5ldyBfY29sb3IyW1wiZGVmYXVsdFwiXSh2YWx1ZSk7XG4gICAgICBfdGhpcy5wcm9wcy5vbkNoYW5nZShjb2xvcik7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0sIF90aGlzLmdldFByZWZpeENscyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5wcm9wcy5yb290UHJlZml4Q2xzICsgJy1wcmV2aWV3JztcbiAgICB9LCBfdGVtcCksIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLCBfcmV0KTtcbiAgfVxuXG4gIFByZXZpZXcucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgcHJlZml4Q2xzID0gdGhpcy5nZXRQcmVmaXhDbHMoKTtcbiAgICB2YXIgaGV4ID0gdGhpcy5wcm9wcy5jb2xvci50b0hleFN0cmluZygpO1xuICAgIHJldHVybiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgJ2RpdicsXG4gICAgICB7IGNsYXNzTmFtZTogcHJlZml4Q2xzIH0sXG4gICAgICBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KCdzcGFuJywge1xuICAgICAgICBzdHlsZToge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogaGV4LFxuICAgICAgICAgIG9wYWNpdHk6IHRoaXMucHJvcHMuYWxwaGEgLyAxMDBcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KCdpbnB1dCcsIHtcbiAgICAgICAgdHlwZTogJ2NvbG9yJyxcbiAgICAgICAgdmFsdWU6IGhleCxcbiAgICAgICAgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMucHJvcHMub25JbnB1dENsaWNrXG4gICAgICB9KVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIFByZXZpZXc7XG59KF9yZWFjdDJbXCJkZWZhdWx0XCJdLkNvbXBvbmVudCk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gUHJldmlldztcblxuXG5QcmV2aWV3LnByb3BUeXBlcyA9IHtcbiAgcm9vdFByZWZpeENsczogX3Byb3BUeXBlczJbXCJkZWZhdWx0XCJdLnN0cmluZyxcbiAgY29sb3I6IF9wcm9wVHlwZXMyW1wiZGVmYXVsdFwiXS5vYmplY3QsXG4gIGFscGhhOiBfcHJvcFR5cGVzMltcImRlZmF1bHRcIl0ubnVtYmVyLFxuICBvbkNoYW5nZTogX3Byb3BUeXBlczJbXCJkZWZhdWx0XCJdLmZ1bmMsXG4gIG9uSW5wdXRDbGljazogX3Byb3BUeXBlczJbXCJkZWZhdWx0XCJdLmZ1bmNcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9yZWFjdERvbSA9IHJlcXVpcmUoJ3JlYWN0LWRvbScpO1xuXG52YXIgX3JlYWN0RG9tMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0RG9tKTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfYWRkRXZlbnRMaXN0ZW5lciA9IHJlcXVpcmUoJ3JjLXV0aWwvbGliL0RvbS9hZGRFdmVudExpc3RlbmVyJyk7XG5cbnZhciBfYWRkRXZlbnRMaXN0ZW5lcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hZGRFdmVudExpc3RlbmVyKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9kZWZhdWx0cyhvYmosIGRlZmF1bHRzKSB7IHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGVmYXVsdHMpOyBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsgdmFyIGtleSA9IGtleXNbaV07IHZhciB2YWx1ZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZGVmYXVsdHMsIGtleSk7IGlmICh2YWx1ZSAmJiB2YWx1ZS5jb25maWd1cmFibGUgJiYgb2JqW2tleV0gPT09IHVuZGVmaW5lZCkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKTsgfSB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogX2RlZmF1bHRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuXG52YXIgUmliYm9uID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFJpYmJvbiwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gUmliYm9uKHByb3BzKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJpYmJvbik7XG5cbiAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmNhbGwodGhpcywgcHJvcHMpKTtcblxuICAgIF90aGlzLm9uTW91c2VEb3duID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB4ID0gZS5jbGllbnRYO1xuICAgICAgdmFyIHkgPSBlLmNsaWVudFk7XG5cbiAgICAgIF90aGlzLnBvaW50TW92ZVRvKHtcbiAgICAgICAgeDogeCxcbiAgICAgICAgeTogeVxuICAgICAgfSk7XG5cbiAgICAgIF90aGlzLmRyYWdMaXN0ZW5lciA9ICgwLCBfYWRkRXZlbnRMaXN0ZW5lcjJbXCJkZWZhdWx0XCJdKSh3aW5kb3csICdtb3VzZW1vdmUnLCBfdGhpcy5vbkRyYWcpO1xuICAgICAgX3RoaXMuZHJhZ1VwTGlzdGVuZXIgPSAoMCwgX2FkZEV2ZW50TGlzdGVuZXIyW1wiZGVmYXVsdFwiXSkod2luZG93LCAnbW91c2V1cCcsIF90aGlzLm9uRHJhZ0VuZCk7XG4gICAgfTtcblxuICAgIF90aGlzLm9uRHJhZyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgeCA9IGUuY2xpZW50WDtcbiAgICAgIHZhciB5ID0gZS5jbGllbnRZO1xuICAgICAgX3RoaXMucG9pbnRNb3ZlVG8oe1xuICAgICAgICB4OiB4LFxuICAgICAgICB5OiB5XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3RoaXMub25EcmFnRW5kID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB4ID0gZS5jbGllbnRYO1xuICAgICAgdmFyIHkgPSBlLmNsaWVudFk7XG4gICAgICBfdGhpcy5wb2ludE1vdmVUbyh7XG4gICAgICAgIHg6IHgsXG4gICAgICAgIHk6IHlcbiAgICAgIH0pO1xuICAgICAgX3RoaXMucmVtb3ZlTGlzdGVuZXJzKCk7XG4gICAgfTtcblxuICAgIF90aGlzLmdldFByZWZpeENscyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5wcm9wcy5yb290UHJlZml4Q2xzICsgJy1yaWJib24nO1xuICAgIH07XG5cbiAgICBfdGhpcy5wb2ludE1vdmVUbyA9IGZ1bmN0aW9uIChjb29yZHMpIHtcbiAgICAgIHZhciByZWN0ID0gX3JlYWN0RG9tMltcImRlZmF1bHRcIl0uZmluZERPTU5vZGUoX3RoaXMpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdmFyIHdpZHRoID0gcmVjdC53aWR0aDtcbiAgICAgIHZhciBsZWZ0ID0gY29vcmRzLnggLSByZWN0LmxlZnQ7XG4gICAgICBsZWZ0ID0gTWF0aC5tYXgoMCwgbGVmdCk7XG4gICAgICBsZWZ0ID0gTWF0aC5taW4obGVmdCwgd2lkdGgpO1xuXG4gICAgICB2YXIgaHVlUGVyY2VudCA9IGxlZnQgLyB3aWR0aDtcbiAgICAgIHZhciBodWUgPSBodWVQZXJjZW50ICogMzYwO1xuXG4gICAgICB2YXIgY29sb3IgPSBfdGhpcy5wcm9wcy5jb2xvcjtcblxuXG4gICAgICBjb2xvci5odWUgPSBodWU7XG5cbiAgICAgIF90aGlzLnByb3BzLm9uQ2hhbmdlKGNvbG9yKTtcbiAgICB9O1xuXG4gICAgX3RoaXMucmVtb3ZlTGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLmRyYWdMaXN0ZW5lcikge1xuICAgICAgICBfdGhpcy5kcmFnTGlzdGVuZXIucmVtb3ZlKCk7XG4gICAgICAgIF90aGlzLmRyYWdMaXN0ZW5lciA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoX3RoaXMuZHJhZ1VwTGlzdGVuZXIpIHtcbiAgICAgICAgX3RoaXMuZHJhZ1VwTGlzdGVuZXIucmVtb3ZlKCk7XG4gICAgICAgIF90aGlzLmRyYWdVcExpc3RlbmVyID0gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgUmliYm9uLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXJzKCk7XG4gIH07XG5cbiAgUmliYm9uLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIHByZWZpeENscyA9IHRoaXMuZ2V0UHJlZml4Q2xzKCk7XG4gICAgdmFyIGh1ZSA9IHRoaXMucHJvcHMuY29sb3IuaHVlO1xuICAgIHZhciBwZXIgPSBodWUgLyAzNjAgKiAxMDA7XG5cbiAgICByZXR1cm4gX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcbiAgICAgICdkaXYnLFxuICAgICAgeyBjbGFzc05hbWU6IHByZWZpeENscyB9LFxuICAgICAgX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudCgnc3BhbicsIHsgcmVmOiAncG9pbnQnLCBzdHlsZTogeyBsZWZ0OiBwZXIgKyAnJScgfSB9KSxcbiAgICAgIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoJ2RpdicsIHsgY2xhc3NOYW1lOiBwcmVmaXhDbHMgKyAnLWhhbmRsZXInLCBvbk1vdXNlRG93bjogdGhpcy5vbk1vdXNlRG93biB9KVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIFJpYmJvbjtcbn0oX3JlYWN0MltcImRlZmF1bHRcIl0uQ29tcG9uZW50KTtcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBSaWJib247XG5cblxuUmliYm9uLnByb3BUeXBlcyA9IHtcbiAgcm9vdFByZWZpeENsczogX3Byb3BUeXBlczJbXCJkZWZhdWx0XCJdLnN0cmluZyxcbiAgY29sb3I6IF9wcm9wVHlwZXMyW1wiZGVmYXVsdFwiXS5vYmplY3QsXG4gIG9uQ2hhbmdlOiBfcHJvcFR5cGVzMltcImRlZmF1bHRcIl0uZnVuY1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3JlYWN0RG9tID0gcmVxdWlyZSgncmVhY3QtZG9tJyk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX2FkZEV2ZW50TGlzdGVuZXIgPSByZXF1aXJlKCdyYy11dGlsL2xpYi9Eb20vYWRkRXZlbnRMaXN0ZW5lcicpO1xuXG52YXIgX2FkZEV2ZW50TGlzdGVuZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYWRkRXZlbnRMaXN0ZW5lcik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfZGVmYXVsdHMob2JqLCBkZWZhdWx0cykgeyB2YXIga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGRlZmF1bHRzKTsgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7IHZhciBrZXkgPSBrZXlzW2ldOyB2YXIgdmFsdWUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGRlZmF1bHRzLCBrZXkpOyBpZiAodmFsdWUgJiYgdmFsdWUuY29uZmlndXJhYmxlICYmIG9ialtrZXldID09PSB1bmRlZmluZWQpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSk7IH0gfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IF9kZWZhdWx0cyhzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxuZnVuY3Rpb24gcmdiYUNvbG9yKHIsIGcsIGIsIGEpIHtcbiAgcmV0dXJuICdyZ2JhKCcgKyBbciwgZywgYiwgYSAvIDEwMF0uam9pbignLCcpICsgJyknO1xufVxuXG52YXIgQWxwaGEgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoQWxwaGEsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEFscGhhKHByb3BzKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEFscGhhKTtcblxuICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcykpO1xuXG4gICAgX3RoaXMub25Nb3VzZURvd24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHggPSBlLmNsaWVudFg7XG4gICAgICB2YXIgeSA9IGUuY2xpZW50WTtcblxuICAgICAgX3RoaXMucG9pbnRNb3ZlVG8oe1xuICAgICAgICB4OiB4LFxuICAgICAgICB5OiB5XG4gICAgICB9KTtcblxuICAgICAgX3RoaXMuZHJhZ0xpc3RlbmVyID0gKDAsIF9hZGRFdmVudExpc3RlbmVyMltcImRlZmF1bHRcIl0pKHdpbmRvdywgJ21vdXNlbW92ZScsIF90aGlzLm9uRHJhZyk7XG4gICAgICBfdGhpcy5kcmFnVXBMaXN0ZW5lciA9ICgwLCBfYWRkRXZlbnRMaXN0ZW5lcjJbXCJkZWZhdWx0XCJdKSh3aW5kb3csICdtb3VzZXVwJywgX3RoaXMub25EcmFnRW5kKTtcbiAgICB9O1xuXG4gICAgX3RoaXMub25EcmFnID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB4ID0gZS5jbGllbnRYO1xuICAgICAgdmFyIHkgPSBlLmNsaWVudFk7XG4gICAgICBfdGhpcy5wb2ludE1vdmVUbyh7XG4gICAgICAgIHg6IHgsXG4gICAgICAgIHk6IHlcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpcy5vbkRyYWdFbmQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHggPSBlLmNsaWVudFg7XG4gICAgICB2YXIgeSA9IGUuY2xpZW50WTtcbiAgICAgIF90aGlzLnBvaW50TW92ZVRvKHtcbiAgICAgICAgeDogeCxcbiAgICAgICAgeTogeVxuICAgICAgfSk7XG4gICAgICBfdGhpcy5yZW1vdmVMaXN0ZW5lcnMoKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuZ2V0QmFja2dyb3VuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyRjb2xvciA9IF90aGlzLnByb3BzLmNvbG9yLFxuICAgICAgICAgIHJlZCA9IF90aGlzJHByb3BzJGNvbG9yLnJlZCxcbiAgICAgICAgICBncmVlbiA9IF90aGlzJHByb3BzJGNvbG9yLmdyZWVuLFxuICAgICAgICAgIGJsdWUgPSBfdGhpcyRwcm9wcyRjb2xvci5ibHVlO1xuXG4gICAgICB2YXIgb3BhY2l0eUdyYWRpZW50ID0gJ2xpbmVhci1ncmFkaWVudCh0byByaWdodCwgJyArIHJnYmFDb2xvcihyZWQsIGdyZWVuLCBibHVlLCAwKSArICcgLCAnICsgcmdiYUNvbG9yKHJlZCwgZ3JlZW4sIGJsdWUsIDEwMCkgKyAnKSc7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbWF4LWxlblxuICAgICAgcmV0dXJuIG9wYWNpdHlHcmFkaWVudDtcbiAgICB9O1xuXG4gICAgX3RoaXMuZ2V0UHJlZml4Q2xzID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnByb3BzLnJvb3RQcmVmaXhDbHMgKyAnLWFscGhhJztcbiAgICB9O1xuXG4gICAgX3RoaXMucG9pbnRNb3ZlVG8gPSBmdW5jdGlvbiAoY29vcmRzKSB7XG4gICAgICB2YXIgcmVjdCA9ICgwLCBfcmVhY3REb20uZmluZERPTU5vZGUpKF90aGlzKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHZhciB3aWR0aCA9IHJlY3Qud2lkdGg7XG4gICAgICB2YXIgbGVmdCA9IGNvb3Jkcy54IC0gcmVjdC5sZWZ0O1xuXG4gICAgICBsZWZ0ID0gTWF0aC5tYXgoMCwgbGVmdCk7XG4gICAgICBsZWZ0ID0gTWF0aC5taW4obGVmdCwgd2lkdGgpO1xuXG4gICAgICB2YXIgYWxwaGEgPSBNYXRoLnJvdW5kKGxlZnQgLyB3aWR0aCAqIDEwMCk7XG5cbiAgICAgIF90aGlzLnByb3BzLm9uQ2hhbmdlKGFscGhhKTtcbiAgICB9O1xuXG4gICAgX3RoaXMucmVtb3ZlTGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLmRyYWdMaXN0ZW5lcikge1xuICAgICAgICBfdGhpcy5kcmFnTGlzdGVuZXIucmVtb3ZlKCk7XG4gICAgICAgIF90aGlzLmRyYWdMaXN0ZW5lciA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoX3RoaXMuZHJhZ1VwTGlzdGVuZXIpIHtcbiAgICAgICAgX3RoaXMuZHJhZ1VwTGlzdGVuZXIucmVtb3ZlKCk7XG4gICAgICAgIF90aGlzLmRyYWdVcExpc3RlbmVyID0gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgQWxwaGEucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy5yZW1vdmVMaXN0ZW5lcnMoKTtcbiAgfTtcblxuICBBbHBoYS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBwcmVmaXhDbHMgPSB0aGlzLmdldFByZWZpeENscygpO1xuICAgIHJldHVybiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgJ2RpdicsXG4gICAgICB7IGNsYXNzTmFtZTogcHJlZml4Q2xzIH0sXG4gICAgICBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KCdkaXYnLCB7IHJlZjogJ2JnJywgY2xhc3NOYW1lOiBwcmVmaXhDbHMgKyAnLWJnJywgc3R5bGU6IHsgYmFja2dyb3VuZDogdGhpcy5nZXRCYWNrZ3JvdW5kKCkgfSB9KSxcbiAgICAgIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nLCB7IHN0eWxlOiB7IGxlZnQ6IHRoaXMucHJvcHMuYWxwaGEgKyAnJScgfSB9KSxcbiAgICAgIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoJ2RpdicsIHsgY2xhc3NOYW1lOiBwcmVmaXhDbHMgKyAnLWhhbmRsZXInLCBvbk1vdXNlRG93bjogdGhpcy5vbk1vdXNlRG93biB9KVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIEFscGhhO1xufShfcmVhY3QyW1wiZGVmYXVsdFwiXS5Db21wb25lbnQpO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IEFscGhhO1xuXG5cbkFscGhhLnByb3BUeXBlcyA9IHtcbiAgY29sb3I6IF9wcm9wVHlwZXMyW1wiZGVmYXVsdFwiXS5vYmplY3QsXG4gIG9uQ2hhbmdlOiBfcHJvcFR5cGVzMltcImRlZmF1bHRcIl0uZnVuYyxcbiAgcm9vdFByZWZpeENsczogX3Byb3BUeXBlczJbXCJkZWZhdWx0XCJdLnN0cmluZyxcbiAgYWxwaGE6IF9wcm9wVHlwZXMyW1wiZGVmYXVsdFwiXS5udW1iZXJcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gcGVyY2VudGFnZTtcbmZ1bmN0aW9uIHBlcmNlbnRhZ2UoaW5wdXQpIHtcbiAgcmV0dXJuIE1hdGgucm91bmQoaW5wdXQgKiAxMDApO1xufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9jb2xvciA9IHJlcXVpcmUoJy4vaGVscGVycy9jb2xvcicpO1xuXG52YXIgX2NvbG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbG9yKTtcblxudmFyIF9wZXJjZW50YWdlID0gcmVxdWlyZSgnLi9oZWxwZXJzL3BlcmNlbnRhZ2UnKTtcblxudmFyIF9wZXJjZW50YWdlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3BlcmNlbnRhZ2UpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX2RlZmF1bHRzKG9iaiwgZGVmYXVsdHMpIHsgdmFyIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkZWZhdWx0cyk7IGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgeyB2YXIga2V5ID0ga2V5c1tpXTsgdmFyIHZhbHVlID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihkZWZhdWx0cywga2V5KTsgaWYgKHZhbHVlICYmIHZhbHVlLmNvbmZpZ3VyYWJsZSAmJiBvYmpba2V5XSA9PT0gdW5kZWZpbmVkKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpOyB9IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBfZGVmYXVsdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbnZhciBtb2Rlc01hcCA9IFsnUkdCJywgJ0hTQiddO1xuXG52YXIgUGFyYW1zID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFBhcmFtcywgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gUGFyYW1zKHByb3BzKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBhcmFtcyk7XG5cbiAgICAvLyDnrqHnkIYgaW5wdXQg55qE54q25oCBXG4gICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1JlYWN0JENvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzKSk7XG5cbiAgICBfdGhpcy5nZXRDaGFubmVsSW5SYW5nZSA9IGZ1bmN0aW9uICh2YWx1ZSwgaW5kZXgpIHtcbiAgICAgIHZhciBjaGFubmVsTWFwID0ge1xuICAgICAgICBSR0I6IFtbMCwgMjU1XSwgWzAsIDI1NV0sIFswLCAyNTVdXSxcbiAgICAgICAgSFNCOiBbWzAsIDM1OV0sIFswLCAxMDBdLCBbMCwgMTAwXV1cbiAgICAgIH07XG4gICAgICB2YXIgbW9kZSA9IF90aGlzLnN0YXRlLm1vZGU7XG4gICAgICB2YXIgcmFuZ2UgPSBjaGFubmVsTWFwW21vZGVdW2luZGV4XTtcbiAgICAgIHZhciByZXN1bHQgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICAgICAgaWYgKGlzTmFOKHJlc3VsdCkpIHtcbiAgICAgICAgcmVzdWx0ID0gMDtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCA9IE1hdGgubWF4KHJhbmdlWzBdLCByZXN1bHQpO1xuICAgICAgcmVzdWx0ID0gTWF0aC5taW4ocmVzdWx0LCByYW5nZVsxXSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBfdGhpcy5nZXRQcmVmaXhDbHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMucHJvcHMucm9vdFByZWZpeENscyArICctcGFyYW1zJztcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlSGV4Qmx1ciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBoZXggPSBfdGhpcy5zdGF0ZS5oZXg7XG5cbiAgICAgIHZhciBjb2xvciA9IG51bGw7XG5cbiAgICAgIGlmIChfY29sb3IyW1wiZGVmYXVsdFwiXS5pc1ZhbGlkSGV4KGhleCkpIHtcbiAgICAgICAgY29sb3IgPSBuZXcgX2NvbG9yMltcImRlZmF1bHRcIl0oaGV4KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbG9yICE9PSBudWxsKSB7XG4gICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBjb2xvcjogY29sb3IsXG4gICAgICAgICAgaGV4OiBoZXhcbiAgICAgICAgfSk7XG4gICAgICAgIF90aGlzLnByb3BzLm9uQ2hhbmdlKGNvbG9yLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUhleFByZXNzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICB2YXIgaGV4ID0gX3RoaXMuc3RhdGUuaGV4O1xuICAgICAgaWYgKGV2ZW50Lm5hdGl2ZUV2ZW50LndoaWNoID09PSAxMykge1xuICAgICAgICB2YXIgY29sb3IgPSBudWxsO1xuXG4gICAgICAgIGlmIChfY29sb3IyW1wiZGVmYXVsdFwiXS5pc1ZhbGlkSGV4KGhleCkpIHtcbiAgICAgICAgICBjb2xvciA9IG5ldyBfY29sb3IyW1wiZGVmYXVsdFwiXShoZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgY29sb3I6IGNvbG9yLFxuICAgICAgICAgICAgaGV4OiBoZXhcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfdGhpcy5wcm9wcy5vbkNoYW5nZShjb2xvciwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUhleENoYW5nZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgdmFyIGhleCA9IGV2ZW50LnRhcmdldC52YWx1ZTtcblxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBoZXg6IGhleFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZU1vZGVDaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbW9kZSA9IF90aGlzLnN0YXRlLm1vZGU7XG5cbiAgICAgIHZhciBtb2RlSW5kZXggPSAobW9kZXNNYXAuaW5kZXhPZihtb2RlKSArIDEpICUgbW9kZXNNYXAubGVuZ3RoO1xuXG4gICAgICBtb2RlID0gbW9kZXNNYXBbbW9kZUluZGV4XTtcblxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBtb2RlOiBtb2RlXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlQWxwaGFIYW5kbGVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICB2YXIgYWxwaGEgPSBwYXJzZUludChldmVudC50YXJnZXQudmFsdWUsIDEwKTtcblxuICAgICAgaWYgKGlzTmFOKGFscGhhKSkge1xuICAgICAgICBhbHBoYSA9IDA7XG4gICAgICB9XG4gICAgICBhbHBoYSA9IE1hdGgubWF4KDAsIGFscGhhKTtcbiAgICAgIGFscGhhID0gTWF0aC5taW4oYWxwaGEsIDEwMCk7XG5cbiAgICAgIF90aGlzLnByb3BzLm9uQWxwaGFDaGFuZ2UoYWxwaGEpO1xuICAgIH07XG5cbiAgICBfdGhpcy51cGRhdGVDb2xvckJ5Q2hhbmVsID0gZnVuY3Rpb24gKGNoYW5uZWwsIHZhbHVlKSB7XG4gICAgICB2YXIgY29sb3IgPSBfdGhpcy5wcm9wcy5jb2xvcjtcbiAgICAgIHZhciBtb2RlID0gX3RoaXMuc3RhdGUubW9kZTtcblxuXG4gICAgICBpZiAobW9kZSA9PT0gJ0hTQicpIHtcbiAgICAgICAgaWYgKGNoYW5uZWwgPT09ICdIJykge1xuICAgICAgICAgIGNvbG9yLmh1ZSA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhbm5lbCA9PT0gJ1MnKSB7XG4gICAgICAgICAgY29sb3Iuc2F0dXJhdGlvbiA9IHBhcnNlSW50KHZhbHVlLCAxMCkgLyAxMDA7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhbm5lbCA9PT0gJ0InKSB7XG4gICAgICAgICAgY29sb3IuYnJpZ2h0bmVzcyA9IHBhcnNlSW50KHZhbHVlLCAxMCkgLyAxMDA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjaGFubmVsID09PSAnUicpIHtcbiAgICAgICAgICBjb2xvci5yZWQgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYW5uZWwgPT09ICdHJykge1xuICAgICAgICAgIGNvbG9yLmdyZWVuID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICAgICAgfSBlbHNlIGlmIChjaGFubmVsID09PSAnQicpIHtcbiAgICAgICAgICBjb2xvci5ibHVlID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29sb3I7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUNvbG9yQ2hhbm5lbENoYW5nZSA9IGZ1bmN0aW9uIChpbmRleCwgZXZlbnQpIHtcbiAgICAgIHZhciB2YWx1ZSA9IF90aGlzLmdldENoYW5uZWxJblJhbmdlKGV2ZW50LnRhcmdldC52YWx1ZSwgaW5kZXgpO1xuICAgICAgdmFyIG1vZGUgPSBfdGhpcy5zdGF0ZS5tb2RlO1xuXG4gICAgICB2YXIgY2hhbm5lbCA9IG1vZGVbaW5kZXhdO1xuXG4gICAgICB2YXIgY29sb3IgPSBfdGhpcy51cGRhdGVDb2xvckJ5Q2hhbmVsKGNoYW5uZWwsIHZhbHVlKTtcblxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBoZXg6IGNvbG9yLmhleCxcbiAgICAgICAgY29sb3I6IGNvbG9yXG4gICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzLnByb3BzLm9uQ2hhbmdlKGNvbG9yLCBmYWxzZSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBtb2RlOiBwcm9wcy5tb2RlLFxuICAgICAgaGV4OiBwcm9wcy5jb2xvci5oZXgsXG4gICAgICBjb2xvcjogcHJvcHMuY29sb3IgLy8gaW5zdGFuY2VvZiB0aW55Y29sb3JcbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIFBhcmFtcy5wcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgdmFyIG5leHRDb2xvciA9IG5leHRQcm9wcy5jb2xvcjtcblxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBjb2xvcjogbmV4dENvbG9yLFxuICAgICAgaGV4OiBuZXh0Q29sb3IuaGV4XG4gICAgfSk7XG4gIH07XG5cbiAgUGFyYW1zLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9jeDtcblxuICAgIHZhciBwcmVmaXhDbHMgPSB0aGlzLmdldFByZWZpeENscygpO1xuXG4gICAgdmFyIGVuYWJsZUFscGhhID0gdGhpcy5wcm9wcy5lbmFibGVBbHBoYTtcbiAgICB2YXIgX3N0YXRlID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgbW9kZSA9IF9zdGF0ZS5tb2RlLFxuICAgICAgICBjb2xvciA9IF9zdGF0ZS5jb2xvcjtcblxuICAgIHZhciBjb2xvckNoYW5uZWwgPSBjb2xvclttb2RlXTtcblxuICAgIGlmIChtb2RlID09PSAnSFNCJykge1xuICAgICAgY29sb3JDaGFubmVsWzBdID0gcGFyc2VJbnQoY29sb3JDaGFubmVsWzBdLCAxMCk7XG4gICAgICBjb2xvckNoYW5uZWxbMV0gPSAoMCwgX3BlcmNlbnRhZ2UyW1wiZGVmYXVsdFwiXSkoY29sb3JDaGFubmVsWzFdKTtcbiAgICAgIGNvbG9yQ2hhbm5lbFsyXSA9ICgwLCBfcGVyY2VudGFnZTJbXCJkZWZhdWx0XCJdKShjb2xvckNoYW5uZWxbMl0pO1xuICAgIH1cblxuICAgIHZhciBwYXJhbXNDbGFzc2VzID0gKDAsIF9jbGFzc25hbWVzMltcImRlZmF1bHRcIl0pKChfY3ggPSB7fSwgX2RlZmluZVByb3BlcnR5KF9jeCwgcHJlZml4Q2xzLCB0cnVlKSwgX2RlZmluZVByb3BlcnR5KF9jeCwgcHJlZml4Q2xzICsgJy1oYXMtYWxwaGEnLCBlbmFibGVBbHBoYSksIF9jeCkpO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAnZGl2JyxcbiAgICAgIHsgY2xhc3NOYW1lOiBwYXJhbXNDbGFzc2VzIH0sXG4gICAgICBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnZGl2JyxcbiAgICAgICAgeyBjbGFzc05hbWU6IHByZWZpeENscyArICctaW5wdXQnIH0sXG4gICAgICAgIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jywge1xuICAgICAgICAgIGNsYXNzTmFtZTogcHJlZml4Q2xzICsgJy1oZXgnLFxuICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICBtYXhMZW5ndGg6ICc2JyxcbiAgICAgICAgICBvbktleVByZXNzOiB0aGlzLmhhbmRsZUhleFByZXNzLFxuICAgICAgICAgIG9uQmx1cjogdGhpcy5oYW5kbGVIZXhCbHVyLFxuICAgICAgICAgIG9uQ2hhbmdlOiB0aGlzLmhhbmRsZUhleENoYW5nZSxcbiAgICAgICAgICB2YWx1ZTogdGhpcy5zdGF0ZS5oZXgudG9Mb3dlckNhc2UoKVxuICAgICAgICB9KSxcbiAgICAgICAgX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudCgnaW5wdXQnLCB7XG4gICAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgICAgcmVmOiAnY2hhbm5lbF8wJyxcbiAgICAgICAgICB2YWx1ZTogY29sb3JDaGFubmVsWzBdLFxuICAgICAgICAgIG9uQ2hhbmdlOiB0aGlzLmhhbmRsZUNvbG9yQ2hhbm5lbENoYW5nZS5iaW5kKG51bGwsIDApXG4gICAgICAgIH0pLFxuICAgICAgICBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KCdpbnB1dCcsIHtcbiAgICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgICByZWY6ICdjaGFubmVsXzEnLFxuICAgICAgICAgIHZhbHVlOiBjb2xvckNoYW5uZWxbMV0sXG4gICAgICAgICAgb25DaGFuZ2U6IHRoaXMuaGFuZGxlQ29sb3JDaGFubmVsQ2hhbmdlLmJpbmQobnVsbCwgMSlcbiAgICAgICAgfSksXG4gICAgICAgIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jywge1xuICAgICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICAgIHJlZjogJ2NoYW5uZWxfMicsXG4gICAgICAgICAgdmFsdWU6IGNvbG9yQ2hhbm5lbFsyXSxcbiAgICAgICAgICBvbkNoYW5nZTogdGhpcy5oYW5kbGVDb2xvckNoYW5uZWxDaGFuZ2UuYmluZChudWxsLCAyKVxuICAgICAgICB9KSxcbiAgICAgICAgZW5hYmxlQWxwaGEgJiYgX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudCgnaW5wdXQnLCB7XG4gICAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgICAgdmFsdWU6IE1hdGgucm91bmQodGhpcy5wcm9wcy5hbHBoYSksXG4gICAgICAgICAgb25DaGFuZ2U6IHRoaXMuaGFuZGxlQWxwaGFIYW5kbGVyXG4gICAgICAgIH0pXG4gICAgICApLFxuICAgICAgX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ2RpdicsXG4gICAgICAgIHsgY2xhc3NOYW1lOiBwcmVmaXhDbHMgKyAnLWxhYmxlJyB9LFxuICAgICAgICBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICdsYWJlbCcsXG4gICAgICAgICAgeyBjbGFzc05hbWU6IHByZWZpeENscyArICctbGFibGUtaGV4JyB9LFxuICAgICAgICAgICdIZXgnXG4gICAgICAgICksXG4gICAgICAgIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgJ2xhYmVsJyxcbiAgICAgICAgICB7IGNsYXNzTmFtZTogcHJlZml4Q2xzICsgJy1sYWJsZS1udW1iZXInLCBvbkNsaWNrOiB0aGlzLmhhbmRsZU1vZGVDaGFuZ2UgfSxcbiAgICAgICAgICBtb2RlWzBdXG4gICAgICAgICksXG4gICAgICAgIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgJ2xhYmVsJyxcbiAgICAgICAgICB7IGNsYXNzTmFtZTogcHJlZml4Q2xzICsgJy1sYWJsZS1udW1iZXInLCBvbkNsaWNrOiB0aGlzLmhhbmRsZU1vZGVDaGFuZ2UgfSxcbiAgICAgICAgICBtb2RlWzFdXG4gICAgICAgICksXG4gICAgICAgIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgJ2xhYmVsJyxcbiAgICAgICAgICB7IGNsYXNzTmFtZTogcHJlZml4Q2xzICsgJy1sYWJsZS1udW1iZXInLCBvbkNsaWNrOiB0aGlzLmhhbmRsZU1vZGVDaGFuZ2UgfSxcbiAgICAgICAgICBtb2RlWzJdXG4gICAgICAgICksXG4gICAgICAgIGVuYWJsZUFscGhhICYmIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgJ2xhYmVsJyxcbiAgICAgICAgICB7IGNsYXNzTmFtZTogcHJlZml4Q2xzICsgJy1sYWJsZS1hbHBoYScgfSxcbiAgICAgICAgICAnQSdcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIFBhcmFtcztcbn0oX3JlYWN0MltcImRlZmF1bHRcIl0uQ29tcG9uZW50KTtcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBQYXJhbXM7XG5cblxuUGFyYW1zLnByb3BUeXBlcyA9IHtcbiAgYWxwaGE6IF9wcm9wVHlwZXMyW1wiZGVmYXVsdFwiXS5udW1iZXIsXG4gIGVuYWJsZUFscGhhOiBfcHJvcFR5cGVzMltcImRlZmF1bHRcIl0uYm9vbCxcbiAgY29sb3I6IF9wcm9wVHlwZXMyW1wiZGVmYXVsdFwiXS5vYmplY3QuaXNSZXF1aXJlZCxcbiAgbW9kZTogX3Byb3BUeXBlczJbXCJkZWZhdWx0XCJdLm9uZU9mKG1vZGVzTWFwKSxcbiAgb25BbHBoYUNoYW5nZTogX3Byb3BUeXBlczJbXCJkZWZhdWx0XCJdLmZ1bmMsXG4gIG9uQ2hhbmdlOiBfcHJvcFR5cGVzMltcImRlZmF1bHRcIl0uZnVuYyxcbiAgcm9vdFByZWZpeENsczogX3Byb3BUeXBlczJbXCJkZWZhdWx0XCJdLnN0cmluZ1xufTtcblxuUGFyYW1zLmRlZmF1bHRQcm9wcyA9IHtcbiAgbW9kZTogbW9kZXNNYXBbMF0sXG4gIGVuYWJsZUFscGhhOiB0cnVlXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdmFsaWRhdGlvbkNvbG9yKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkge1xuICBpZiAocHJvcHNbcHJvcE5hbWVdICYmICEvXiNbMC05YS1mQS1GXXszLDZ9JC8udGVzdChwcm9wc1twcm9wTmFtZV0pKSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihjb21wb25lbnROYW1lICsgXCIucHJvcHMuXCIgKyBwcm9wTmFtZSArIFwiIFZhbGlkYXRpb24gZmFpbGVkIVwiKTtcbiAgfVxufTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfY29sb3IgPSByZXF1aXJlKCcuL2hlbHBlcnMvY29sb3InKTtcblxudmFyIF9jb2xvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb2xvcik7XG5cbnZhciBfQm9hcmQgPSByZXF1aXJlKCcuL0JvYXJkJyk7XG5cbnZhciBfQm9hcmQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQm9hcmQpO1xuXG52YXIgX1ByZXZpZXcgPSByZXF1aXJlKCcuL1ByZXZpZXcnKTtcblxudmFyIF9QcmV2aWV3MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1ByZXZpZXcpO1xuXG52YXIgX1JpYmJvbiA9IHJlcXVpcmUoJy4vUmliYm9uJyk7XG5cbnZhciBfUmliYm9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1JpYmJvbik7XG5cbnZhciBfQWxwaGEgPSByZXF1aXJlKCcuL0FscGhhJyk7XG5cbnZhciBfQWxwaGEyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQWxwaGEpO1xuXG52YXIgX1BhcmFtcyA9IHJlcXVpcmUoJy4vUGFyYW1zJyk7XG5cbnZhciBfUGFyYW1zMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1BhcmFtcyk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3ZhbGlkYXRpb25Db2xvciA9IHJlcXVpcmUoJy4vdXRpbHMvdmFsaWRhdGlvbkNvbG9yJyk7XG5cbnZhciBfdmFsaWRhdGlvbkNvbG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3ZhbGlkYXRpb25Db2xvcik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfZGVmYXVsdHMob2JqLCBkZWZhdWx0cykgeyB2YXIga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGRlZmF1bHRzKTsgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7IHZhciBrZXkgPSBrZXlzW2ldOyB2YXIgdmFsdWUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGRlZmF1bHRzLCBrZXkpOyBpZiAodmFsdWUgJiYgdmFsdWUuY29uZmlndXJhYmxlICYmIG9ialtrZXldID09PSB1bmRlZmluZWQpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSk7IH0gfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IF9kZWZhdWx0cyhzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnZhciBQYW5lbCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhQYW5lbCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gUGFuZWwocHJvcHMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUGFuZWwpO1xuXG4gICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1JlYWN0JENvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzKSk7XG5cbiAgICBfaW5pdGlhbGlzZVByb3BzLmNhbGwoX3RoaXMpO1xuXG4gICAgdmFyIGFscGhhID0gdHlwZW9mIHByb3BzLmFscGhhID09PSAndW5kZWZpbmVkJyA/IHByb3BzLmRlZmF1bHRBbHBoYSA6IE1hdGgubWluKHByb3BzLmFscGhhLCBwcm9wcy5kZWZhdWx0QWxwaGEpO1xuXG4gICAgdmFyIGNvbG9yID0gbmV3IF9jb2xvcjJbXCJkZWZhdWx0XCJdKHByb3BzLmNvbG9yIHx8IHByb3BzLmRlZmF1bHRDb2xvcik7XG5cbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGNvbG9yOiBjb2xvcixcbiAgICAgIGFscGhhOiBhbHBoYVxuICAgIH07XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgUGFuZWwucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy5wcm9wcy5vbk1vdW50KHRoaXMucmVmKTtcbiAgfTtcblxuICBQYW5lbC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgaWYgKG5leHRQcm9wcy5jb2xvcikge1xuICAgICAgdmFyIGNvbG9yID0gbmV3IF9jb2xvcjJbXCJkZWZhdWx0XCJdKG5leHRQcm9wcy5jb2xvcik7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgY29sb3I6IGNvbG9yXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKG5leHRQcm9wcy5hbHBoYSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgYWxwaGE6IG5leHRQcm9wcy5hbHBoYVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiDlk43lupQgYWxwaGEg55qE5Y+Y5pu0XG4gICAqIEBwYXJhbSAge051bWJlcn0gYWxwaGEgUmFuZ2UgMH4xMDBcbiAgICovXG5cblxuICAvKipcbiAgICogY29sb3IgY2hhbmdlXG4gICAqIEBwYXJhbSAge09iamVjdH0gIGNvbG9yICAgICAgdGlueWNvbG9yIGluc3RhbmNlXG4gICAqIEBwYXJhbSAge0Jvb2xlYW59IHN5bmNQYXJhbXMgU3luYyB0byA8UGFyYW1zIC8+XG4gICAqL1xuXG5cbiAgUGFuZWwucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX2N4LFxuICAgICAgICBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIHByZWZpeENscyA9IF9wcm9wcy5wcmVmaXhDbHMsXG4gICAgICAgIGVuYWJsZUFscGhhID0gX3Byb3BzLmVuYWJsZUFscGhhO1xuICAgIHZhciBfc3RhdGUgPSB0aGlzLnN0YXRlLFxuICAgICAgICBjb2xvciA9IF9zdGF0ZS5jb2xvcixcbiAgICAgICAgYWxwaGEgPSBfc3RhdGUuYWxwaGE7XG5cblxuICAgIHZhciB3cmFwQ2xhc3NlcyA9ICgwLCBfY2xhc3NuYW1lczJbXCJkZWZhdWx0XCJdKSgoX2N4ID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY3gsIHByZWZpeENscyArICctd3JhcCcsIHRydWUpLCBfZGVmaW5lUHJvcGVydHkoX2N4LCBwcmVmaXhDbHMgKyAnLXdyYXAtaGFzLWFscGhhJywgZW5hYmxlQWxwaGEpLCBfY3gpKTtcblxuICAgIHJldHVybiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgJ2RpdicsXG4gICAgICB7XG4gICAgICAgIHJlZjogZnVuY3Rpb24gcmVmKF9yZWYpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMyLnJlZiA9IF9yZWY7XG4gICAgICAgIH0sXG4gICAgICAgIGNsYXNzTmFtZTogW3ByZWZpeENscywgdGhpcy5wcm9wcy5jbGFzc05hbWVdLmpvaW4oJyAnKSxcbiAgICAgICAgc3R5bGU6IHRoaXMucHJvcHMuc3R5bGUsXG4gICAgICAgIG9uRm9jdXM6IHRoaXMub25Gb2N1cyxcbiAgICAgICAgb25CbHVyOiB0aGlzLm9uQmx1cixcbiAgICAgICAgdGFiSW5kZXg6ICcwJ1xuICAgICAgfSxcbiAgICAgIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICdkaXYnLFxuICAgICAgICB7IGNsYXNzTmFtZTogcHJlZml4Q2xzICsgJy1pbm5lcicgfSxcbiAgICAgICAgX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChfQm9hcmQyW1wiZGVmYXVsdFwiXSwgeyByb290UHJlZml4Q2xzOiBwcmVmaXhDbHMsIGNvbG9yOiBjb2xvciwgb25DaGFuZ2U6IHRoaXMuaGFuZGxlQ2hhbmdlIH0pLFxuICAgICAgICBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICdkaXYnLFxuICAgICAgICAgIHsgY2xhc3NOYW1lOiB3cmFwQ2xhc3NlcyB9LFxuICAgICAgICAgIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAnZGl2JyxcbiAgICAgICAgICAgIHsgY2xhc3NOYW1lOiBwcmVmaXhDbHMgKyAnLXdyYXAtcmliYm9uJyB9LFxuICAgICAgICAgICAgX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChfUmliYm9uMltcImRlZmF1bHRcIl0sIHsgcm9vdFByZWZpeENsczogcHJlZml4Q2xzLCBjb2xvcjogY29sb3IsIG9uQ2hhbmdlOiB0aGlzLmhhbmRsZUNoYW5nZSB9KVxuICAgICAgICAgICksXG4gICAgICAgICAgZW5hYmxlQWxwaGEgJiYgX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICdkaXYnLFxuICAgICAgICAgICAgeyBjbGFzc05hbWU6IHByZWZpeENscyArICctd3JhcC1hbHBoYScgfSxcbiAgICAgICAgICAgIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoX0FscGhhMltcImRlZmF1bHRcIl0sIHtcbiAgICAgICAgICAgICAgcm9vdFByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgICAgICAgICBhbHBoYTogYWxwaGEsXG4gICAgICAgICAgICAgIGNvbG9yOiBjb2xvcixcbiAgICAgICAgICAgICAgb25DaGFuZ2U6IHRoaXMuaGFuZGxlQWxwaGFDaGFuZ2VcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKSxcbiAgICAgICAgICBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgJ2RpdicsXG4gICAgICAgICAgICB7IGNsYXNzTmFtZTogcHJlZml4Q2xzICsgJy13cmFwLXByZXZpZXcnIH0sXG4gICAgICAgICAgICBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KF9QcmV2aWV3MltcImRlZmF1bHRcIl0sIHtcbiAgICAgICAgICAgICAgcm9vdFByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgICAgICAgICBhbHBoYTogYWxwaGEsXG4gICAgICAgICAgICAgIG9uQ2hhbmdlOiB0aGlzLmhhbmRsZUNoYW5nZSxcbiAgICAgICAgICAgICAgb25JbnB1dENsaWNrOiB0aGlzLm9uU3lzdGVtQ29sb3JQaWNrZXJPcGVuLFxuICAgICAgICAgICAgICBjb2xvcjogY29sb3JcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICdkaXYnLFxuICAgICAgICAgIHsgY2xhc3NOYW1lOiBwcmVmaXhDbHMgKyAnLXdyYXAnLCBzdHlsZTogeyBoZWlnaHQ6IDQwLCBtYXJnaW5Ub3A6IDYgfSB9LFxuICAgICAgICAgIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoX1BhcmFtczJbXCJkZWZhdWx0XCJdLCB7XG4gICAgICAgICAgICByb290UHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICAgICAgICBjb2xvcjogY29sb3IsXG4gICAgICAgICAgICBhbHBoYTogYWxwaGEsXG4gICAgICAgICAgICBvbkFscGhhQ2hhbmdlOiB0aGlzLmhhbmRsZUFscGhhQ2hhbmdlLFxuICAgICAgICAgICAgb25DaGFuZ2U6IHRoaXMuaGFuZGxlQ2hhbmdlLFxuICAgICAgICAgICAgbW9kZTogdGhpcy5wcm9wcy5tb2RlLFxuICAgICAgICAgICAgZW5hYmxlQWxwaGE6IHRoaXMucHJvcHMuZW5hYmxlQWxwaGFcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gUGFuZWw7XG59KF9yZWFjdDJbXCJkZWZhdWx0XCJdLkNvbXBvbmVudCk7XG5cbnZhciBfaW5pdGlhbGlzZVByb3BzID0gZnVuY3Rpb24gX2luaXRpYWxpc2VQcm9wcygpIHtcbiAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgdGhpcy5vblN5c3RlbUNvbG9yUGlja2VyT3BlbiA9IGZ1bmN0aW9uIChlKSB7XG4gICAgLy8gb25seSB3b3JrIHdpdGggYnJvc3dlciB3aGljaCBzdXBwb3J0IGNvbG9yIGlucHV0XG4gICAgaWYgKGUudGFyZ2V0LnR5cGUgPT09ICdjb2xvcicpIHtcbiAgICAgIF90aGlzMy5zeXN0ZW1Db2xvclBpY2tlck9wZW4gPSB0cnVlO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLm9uRm9jdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKF90aGlzMy5fYmx1clRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQoX3RoaXMzLl9ibHVyVGltZXIpO1xuICAgICAgX3RoaXMzLl9ibHVyVGltZXIgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBfdGhpczMucHJvcHMub25Gb2N1cygpO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLm9uQmx1ciA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoX3RoaXMzLl9ibHVyVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dChfdGhpczMuX2JsdXJUaW1lcik7XG4gICAgfVxuICAgIF90aGlzMy5fYmx1clRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBpZiBpcyBzeXN0ZW0gY29sb3IgcGlja2VyIG9wZW4sIHRoZW4gc3RvcCBydW4gYmx1clxuICAgICAgaWYgKF90aGlzMy5zeXN0ZW1Db2xvclBpY2tlck9wZW4pIHtcbiAgICAgICAgX3RoaXMzLnN5c3RlbUNvbG9yUGlja2VyT3BlbiA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzMy5wcm9wcy5vbkJsdXIoKTtcbiAgICB9LCAxMDApO1xuICB9O1xuXG4gIHRoaXMuaGFuZGxlQWxwaGFDaGFuZ2UgPSBmdW5jdGlvbiAoYWxwaGEpIHtcbiAgICB2YXIgY29sb3IgPSBfdGhpczMuc3RhdGUuY29sb3I7XG5cbiAgICBjb2xvci5hbHBoYSA9IGFscGhhO1xuXG4gICAgX3RoaXMzLnNldFN0YXRlKHtcbiAgICAgIGFscGhhOiBhbHBoYSxcbiAgICAgIGNvbG9yOiBjb2xvclxuICAgIH0pO1xuICAgIF90aGlzMy5wcm9wcy5vbkNoYW5nZSh7XG4gICAgICBjb2xvcjogY29sb3IudG9IZXhTdHJpbmcoKSxcbiAgICAgIGFscGhhOiBhbHBoYVxuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMuaGFuZGxlQ2hhbmdlID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgdmFyIGFscGhhID0gX3RoaXMzLnN0YXRlLmFscGhhO1xuXG4gICAgY29sb3IuYWxwaGEgPSBhbHBoYTtcblxuICAgIF90aGlzMy5zZXRTdGF0ZSh7IGNvbG9yOiBjb2xvciB9KTtcbiAgICBfdGhpczMucHJvcHMub25DaGFuZ2Uoe1xuICAgICAgY29sb3I6IGNvbG9yLnRvSGV4U3RyaW5nKCksXG4gICAgICBhbHBoYTogY29sb3IuYWxwaGFcbiAgICB9KTtcbiAgfTtcbn07XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gUGFuZWw7XG5cblxuUGFuZWwucHJvcFR5cGVzID0ge1xuICBhbHBoYTogX3Byb3BUeXBlczJbXCJkZWZhdWx0XCJdLm51bWJlcixcbiAgY2xhc3NOYW1lOiBfcHJvcFR5cGVzMltcImRlZmF1bHRcIl0uc3RyaW5nLFxuICBjb2xvcjogX3ZhbGlkYXRpb25Db2xvcjJbXCJkZWZhdWx0XCJdLCAvLyBIZXggc3RyaW5nXG4gIGRlZmF1bHRBbHBoYTogX3Byb3BUeXBlczJbXCJkZWZhdWx0XCJdLm51bWJlcixcbiAgZGVmYXVsdENvbG9yOiBfdmFsaWRhdGlvbkNvbG9yMltcImRlZmF1bHRcIl0sIC8vIEhleCBzdHJpbmdcbiAgZW5hYmxlQWxwaGE6IF9wcm9wVHlwZXMyW1wiZGVmYXVsdFwiXS5ib29sLFxuICBtb2RlOiBfcHJvcFR5cGVzMltcImRlZmF1bHRcIl0ub25lT2YoWydSR0InLCAnSFNMJywgJ0hTQiddKSxcbiAgb25CbHVyOiBfcHJvcFR5cGVzMltcImRlZmF1bHRcIl0uZnVuYyxcbiAgb25DaGFuZ2U6IF9wcm9wVHlwZXMyW1wiZGVmYXVsdFwiXS5mdW5jLFxuICBvbkZvY3VzOiBfcHJvcFR5cGVzMltcImRlZmF1bHRcIl0uZnVuYyxcbiAgb25Nb3VudDogX3Byb3BUeXBlczJbXCJkZWZhdWx0XCJdLmZ1bmMsXG4gIHByZWZpeENsczogX3Byb3BUeXBlczJbXCJkZWZhdWx0XCJdLnN0cmluZyxcbiAgc3R5bGU6IF9wcm9wVHlwZXMyW1wiZGVmYXVsdFwiXS5vYmplY3Rcbn07XG5cblBhbmVsLmRlZmF1bHRQcm9wcyA9IHtcbiAgY2xhc3NOYW1lOiAnJyxcbiAgZGVmYXVsdEFscGhhOiAxMDAsXG4gIGRlZmF1bHRDb2xvcjogJyNmZjAwMDAnLFxuICBlbmFibGVBbHBoYTogdHJ1ZSxcbiAgbW9kZTogJ1JHQicsXG4gIG9uQmx1cjogbm9vcCxcbiAgb25DaGFuZ2U6IG5vb3AsXG4gIG9uRm9jdXM6IG5vb3AsXG4gIG9uTW91bnQ6IG5vb3AsXG4gIHByZWZpeENsczogJ3JjLWNvbG9yLXBpY2tlci1wYW5lbCcsXG4gIHN0eWxlOiB7fVxufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbnZhciBhdXRvQWRqdXN0T3ZlcmZsb3cgPSB7XG4gIGFkanVzdFg6IDEsXG4gIGFkanVzdFk6IDFcbn07XG5cbnZhciB0YXJnZXRPZmZzZXQgPSBbMCwgMF07XG5cbnZhciBwbGFjZW1lbnRzID0ge1xuICB0b3BMZWZ0OiB7XG4gICAgcG9pbnRzOiBbJ2JsJywgJ3RsJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvdyxcbiAgICBvZmZzZXQ6IFswLCAtNV0sXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgfSxcbiAgdG9wUmlnaHQ6IHtcbiAgICBwb2ludHM6IFsnYnInLCAndHInXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIC01XSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICBib3R0b21MZWZ0OiB7XG4gICAgcG9pbnRzOiBbJ3RsJywgJ2JsJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvdyxcbiAgICBvZmZzZXQ6IFswLCA1XSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICBib3R0b21SaWdodDoge1xuICAgIHBvaW50czogWyd0cicsICdiciddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgb2Zmc2V0OiBbMCwgNV0sXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgfVxufTtcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBwbGFjZW1lbnRzO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIHNsaWNlSXRlcmF0b3IoYXJyLCBpKSB7IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX2UgPSB1bmRlZmluZWQ7IHRyeSB7IGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdKSBfaVtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoX2QpIHRocm93IF9lOyB9IH0gcmV0dXJuIF9hcnI7IH0gcmV0dXJuIGZ1bmN0aW9uIChhcnIsIGkpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyByZXR1cm4gYXJyOyB9IGVsc2UgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSkgeyByZXR1cm4gc2xpY2VJdGVyYXRvcihhcnIsIGkpOyB9IGVsc2UgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTsgfSB9OyB9KCk7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9yZWFjdERvbSA9IHJlcXVpcmUoJ3JlYWN0LWRvbScpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9yY1RyaWdnZXIgPSByZXF1aXJlKCdyYy10cmlnZ2VyJyk7XG5cbnZhciBfcmNUcmlnZ2VyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JjVHJpZ2dlcik7XG5cbnZhciBfUGFuZWwgPSByZXF1aXJlKCcuL1BhbmVsJyk7XG5cbnZhciBfUGFuZWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUGFuZWwpO1xuXG52YXIgX3BsYWNlbWVudHMgPSByZXF1aXJlKCcuL3BsYWNlbWVudHMnKTtcblxudmFyIF9wbGFjZW1lbnRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3BsYWNlbWVudHMpO1xuXG52YXIgX2NvbG9yID0gcmVxdWlyZSgnLi9oZWxwZXJzL2NvbG9yJyk7XG5cbnZhciBfY29sb3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29sb3IpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX2RlZmF1bHRzKG9iaiwgZGVmYXVsdHMpIHsgdmFyIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkZWZhdWx0cyk7IGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgeyB2YXIga2V5ID0ga2V5c1tpXTsgdmFyIHZhbHVlID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihkZWZhdWx0cywga2V5KTsgaWYgKHZhbHVlICYmIHZhbHVlLmNvbmZpZ3VyYWJsZSAmJiBvYmpba2V5XSA9PT0gdW5kZWZpbmVkKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpOyB9IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBfZGVmYXVsdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbmZ1bmN0aW9uIHJlZkZuKGZpZWxkLCBjb21wb25lbnQpIHtcbiAgdGhpc1tmaWVsZF0gPSBjb21wb25lbnQ7XG59XG5cbmZ1bmN0aW9uIHByZXZlbnQoZSkge1xuICBlLnByZXZlbnREZWZhdWx0KCk7XG59XG5cbnZhciBDb2xvclBpY2tlciA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhDb2xvclBpY2tlciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQ29sb3JQaWNrZXIocHJvcHMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29sb3JQaWNrZXIpO1xuXG4gICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1JlYWN0JENvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzKSk7XG5cbiAgICB2YXIgYWxwaGEgPSB0eXBlb2YgcHJvcHMuYWxwaGEgPT09ICd1bmRlZmluZWQnID8gcHJvcHMuZGVmYXVsdEFscGhhIDogTWF0aC5taW4ocHJvcHMuYWxwaGEsIHByb3BzLmRlZmF1bHRBbHBoYSk7XG5cbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGNvbG9yOiBwcm9wcy5jb2xvciB8fCBwcm9wcy5kZWZhdWx0Q29sb3IsXG4gICAgICBhbHBoYTogYWxwaGEsXG4gICAgICBvcGVuOiBmYWxzZVxuICAgIH07XG5cbiAgICB2YXIgZXZlbnRzID0gWydvblRyaWdnZXJDbGljaycsICdvbkNoYW5nZScsICdvbkJsdXInLCAnZ2V0UGlja2VyRWxlbWVudCcsICdnZXRSb290RE9NTm9kZScsICdnZXRUcmlnZ2VyRE9NTm9kZScsICdvblZpc2libGVDaGFuZ2UnLCAnb25QYW5lbE1vdW50JywgJ3NldE9wZW4nLCAnb3BlbicsICdjbG9zZScsICdmb2N1cyddO1xuXG4gICAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICAgIF90aGlzW2VdID0gX3RoaXNbZV0uYmluZChfdGhpcyk7XG4gICAgfSk7XG5cbiAgICBfdGhpcy5zYXZlVHJpZ2dlclJlZiA9IHJlZkZuLmJpbmQoX3RoaXMsICd0cmlnZ2VySW5zdGFuY2UnKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBDb2xvclBpY2tlci5wcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgaWYgKG5leHRQcm9wcy5jb2xvcikge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGNvbG9yOiBuZXh0UHJvcHMuY29sb3JcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAobmV4dFByb3BzLmFscGhhICE9PSBudWxsICYmIG5leHRQcm9wcy5hbHBoYSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgYWxwaGE6IG5leHRQcm9wcy5hbHBoYVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIENvbG9yUGlja2VyLnByb3RvdHlwZS5vblRyaWdnZXJDbGljayA9IGZ1bmN0aW9uIG9uVHJpZ2dlckNsaWNrKCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgb3BlbjogIXRoaXMuc3RhdGUub3BlblxuICAgIH0pO1xuICB9O1xuXG4gIENvbG9yUGlja2VyLnByb3RvdHlwZS5vbkNoYW5nZSA9IGZ1bmN0aW9uIG9uQ2hhbmdlKGNvbG9ycykge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdGhpcy5zZXRTdGF0ZShfZXh0ZW5kcyh7fSwgY29sb3JzKSwgZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMyLnByb3BzLm9uQ2hhbmdlKF90aGlzMi5zdGF0ZSk7XG4gICAgfSk7XG4gIH07XG5cbiAgQ29sb3JQaWNrZXIucHJvdG90eXBlLm9uQmx1ciA9IGZ1bmN0aW9uIG9uQmx1cigpIHtcbiAgICB0aGlzLnNldE9wZW4oZmFsc2UpO1xuICB9O1xuXG4gIENvbG9yUGlja2VyLnByb3RvdHlwZS5vblZpc2libGVDaGFuZ2UgPSBmdW5jdGlvbiBvblZpc2libGVDaGFuZ2Uob3Blbikge1xuICAgIHRoaXMuc2V0T3BlbihvcGVuKTtcbiAgfTtcblxuICBDb2xvclBpY2tlci5wcm90b3R5cGUub25QYW5lbE1vdW50ID0gZnVuY3Rpb24gb25QYW5lbE1vdW50KHBhbmVsRE9NUmVmKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUub3Blbikge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHBhbmVsRE9NUmVmLmZvY3VzKCk7XG4gICAgICB9LCAxKTtcbiAgICB9XG4gIH07XG5cbiAgQ29sb3JQaWNrZXIucHJvdG90eXBlLnNldE9wZW4gPSBmdW5jdGlvbiBzZXRPcGVuKG9wZW4sIGNhbGxiYWNrKSB7XG4gICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5vcGVuICE9PSBvcGVuKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgb3Blbjogb3BlblxuICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSBjYWxsYmFjaygpO1xuICAgICAgICB2YXIgX3Byb3BzID0gX3RoaXMzLnByb3BzLFxuICAgICAgICAgICAgb25PcGVuID0gX3Byb3BzLm9uT3BlbixcbiAgICAgICAgICAgIG9uQ2xvc2UgPSBfcHJvcHMub25DbG9zZTtcblxuICAgICAgICBpZiAoX3RoaXMzLnN0YXRlLm9wZW4pIHtcbiAgICAgICAgICBvbk9wZW4oX3RoaXMzLnN0YXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvbkNsb3NlKF90aGlzMy5zdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBDb2xvclBpY2tlci5wcm90b3R5cGUuZ2V0Um9vdERPTU5vZGUgPSBmdW5jdGlvbiBnZXRSb290RE9NTm9kZSgpIHtcbiAgICByZXR1cm4gKDAsIF9yZWFjdERvbS5maW5kRE9NTm9kZSkodGhpcyk7XG4gIH07XG5cbiAgQ29sb3JQaWNrZXIucHJvdG90eXBlLmdldFRyaWdnZXJET01Ob2RlID0gZnVuY3Rpb24gZ2V0VHJpZ2dlckRPTU5vZGUoKSB7XG4gICAgcmV0dXJuICgwLCBfcmVhY3REb20uZmluZERPTU5vZGUpKHRoaXMudHJpZ2dlckluc3RhbmNlKTtcbiAgfTtcblxuICBDb2xvclBpY2tlci5wcm90b3R5cGUuZ2V0UGlja2VyRWxlbWVudCA9IGZ1bmN0aW9uIGdldFBpY2tlckVsZW1lbnQoKSB7XG4gICAgLy8gY29uc3Qgc3RhdGUgPSB0aGlzLnN0YXRlO1xuICAgIHJldHVybiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KF9QYW5lbDJbXCJkZWZhdWx0XCJdLCB7XG4gICAgICBvbk1vdW50OiB0aGlzLm9uUGFuZWxNb3VudCxcbiAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5zdGF0ZS5jb2xvcixcbiAgICAgIGFscGhhOiB0aGlzLnN0YXRlLmFscGhhLFxuICAgICAgZW5hYmxlQWxwaGE6IHRoaXMucHJvcHMuZW5hYmxlQWxwaGEsXG4gICAgICBwcmVmaXhDbHM6IHRoaXMucHJvcHMucHJlZml4Q2xzICsgJy1wYW5lbCcsXG4gICAgICBvbkNoYW5nZTogdGhpcy5vbkNoYW5nZSxcbiAgICAgIG9uQmx1cjogdGhpcy5vbkJsdXIsXG4gICAgICBtb2RlOiB0aGlzLnByb3BzLm1vZGUsXG4gICAgICBjbGFzc05hbWU6IHRoaXMucHJvcHMuY2xhc3NOYW1lXG4gICAgfSk7XG4gIH07XG5cbiAgQ29sb3JQaWNrZXIucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbiBvcGVuKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5zZXRPcGVuKHRydWUsIGNhbGxiYWNrKTtcbiAgfTtcblxuICBDb2xvclBpY2tlci5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiBjbG9zZShjYWxsYmFjaykge1xuICAgIHRoaXMuc2V0T3BlbihmYWxzZSwgY2FsbGJhY2spO1xuICB9O1xuXG4gIENvbG9yUGlja2VyLnByb3RvdHlwZS5mb2N1cyA9IGZ1bmN0aW9uIGZvY3VzKCkge1xuICAgIGlmICghdGhpcy5zdGF0ZS5vcGVuKSB7XG4gICAgICAoMCwgX3JlYWN0RG9tLmZpbmRET01Ob2RlKSh0aGlzKS5mb2N1cygpO1xuICAgIH1cbiAgfTtcblxuICBDb2xvclBpY2tlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgdmFyIHN0YXRlID0gdGhpcy5zdGF0ZTtcbiAgICB2YXIgY2xhc3NlcyA9IFtwcm9wcy5wcmVmaXhDbHMgKyAnLXdyYXAnLCBwcm9wcy5jbGFzc05hbWVdO1xuICAgIGlmIChzdGF0ZS5vcGVuKSB7XG4gICAgICBjbGFzc2VzLnB1c2gocHJvcHMucHJlZml4Q2xzICsgJy1vcGVuJyk7XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW47XG5cbiAgICB2YXIgX1JHQiA9IF9zbGljZWRUb0FycmF5KG5ldyBfY29sb3IyW1wiZGVmYXVsdFwiXSh0aGlzLnN0YXRlLmNvbG9yKS5SR0IsIDMpLFxuICAgICAgICByID0gX1JHQlswXSxcbiAgICAgICAgZyA9IF9SR0JbMV0sXG4gICAgICAgIGIgPSBfUkdCWzJdO1xuXG4gICAgdmFyIFJHQkEgPSBbciwgZywgYl07XG5cbiAgICBSR0JBLnB1c2godGhpcy5zdGF0ZS5hbHBoYSAvIDEwMCk7XG5cbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIGNoaWxkcmVuID0gX3JlYWN0MltcImRlZmF1bHRcIl0uY2xvbmVFbGVtZW50KGNoaWxkcmVuLCB7XG4gICAgICAgIHJlZjogdGhpcy5zYXZlVHJpZ2dlclJlZixcbiAgICAgICAgdW5zZWxlY3RhYmxlOiAndW5zZWxlY3RhYmxlJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKCcgKyBSR0JBLmpvaW4oJywnKSArICcpJ1xuICAgICAgICB9LFxuICAgICAgICBvbkNsaWNrOiB0aGlzLm9uVHJpZ2dlckNsaWNrLFxuICAgICAgICBvbk1vdXNlRG93bjogcHJldmVudFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICAgICAgcGxhY2VtZW50ID0gcHJvcHMucGxhY2VtZW50LFxuICAgICAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgICAgICBnZXRDYWxlbmRhckNvbnRhaW5lciA9IHByb3BzLmdldENhbGVuZGFyQ29udGFpbmVyLFxuICAgICAgICBhbGlnbiA9IHByb3BzLmFsaWduLFxuICAgICAgICBhbmltYXRpb24gPSBwcm9wcy5hbmltYXRpb24sXG4gICAgICAgIGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgICAgIHRyYW5zaXRpb25OYW1lID0gcHJvcHMudHJhbnNpdGlvbk5hbWU7XG5cblxuICAgIHJldHVybiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgJ2RpdicsXG4gICAgICB7IGNsYXNzTmFtZTogY2xhc3Nlcy5qb2luKCcgJykgfSxcbiAgICAgIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIF9yY1RyaWdnZXIyW1wiZGVmYXVsdFwiXSxcbiAgICAgICAge1xuICAgICAgICAgIHBvcHVwOiB0aGlzLmdldFBpY2tlckVsZW1lbnQoKSxcbiAgICAgICAgICBwb3B1cEFsaWduOiBhbGlnbixcbiAgICAgICAgICBidWlsdGluUGxhY2VtZW50czogX3BsYWNlbWVudHMyW1wiZGVmYXVsdFwiXSxcbiAgICAgICAgICBwb3B1cFBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgICAgIGFjdGlvbjogZGlzYWJsZWQgPyBbXSA6IFsnY2xpY2snXSxcbiAgICAgICAgICBkZXN0cm95UG9wdXBPbkhpZGU6IHRydWUsXG4gICAgICAgICAgZ2V0UG9wdXBDb250YWluZXI6IGdldENhbGVuZGFyQ29udGFpbmVyLFxuICAgICAgICAgIHBvcHVwU3R5bGU6IHN0eWxlLFxuICAgICAgICAgIHBvcHVwQW5pbWF0aW9uOiBhbmltYXRpb24sXG4gICAgICAgICAgcG9wdXBUcmFuc2l0aW9uTmFtZTogdHJhbnNpdGlvbk5hbWUsXG4gICAgICAgICAgcG9wdXBWaXNpYmxlOiBzdGF0ZS5vcGVuLFxuICAgICAgICAgIG9uUG9wdXBWaXNpYmxlQ2hhbmdlOiB0aGlzLm9uVmlzaWJsZUNoYW5nZSxcbiAgICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENsc1xuICAgICAgICB9LFxuICAgICAgICBjaGlsZHJlblxuICAgICAgKVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIENvbG9yUGlja2VyO1xufShfcmVhY3QyW1wiZGVmYXVsdFwiXS5Db21wb25lbnQpO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IENvbG9yUGlja2VyO1xuXG5cbkNvbG9yUGlja2VyLnByb3BUeXBlcyA9IHtcbiAgZGVmYXVsdENvbG9yOiBfcHJvcFR5cGVzMltcImRlZmF1bHRcIl0uc3RyaW5nLFxuICBkZWZhdWx0QWxwaGE6IF9wcm9wVHlwZXMyW1wiZGVmYXVsdFwiXS5udW1iZXIsXG4gIC8vIGNhbiBjdXN0b21cbiAgYWxwaGE6IF9wcm9wVHlwZXMyW1wiZGVmYXVsdFwiXS5udW1iZXIsXG4gIGNoaWxkcmVuOiBfcHJvcFR5cGVzMltcImRlZmF1bHRcIl0ubm9kZS5pc1JlcXVpcmVkLFxuICBjbGFzc05hbWU6IF9wcm9wVHlwZXMyW1wiZGVmYXVsdFwiXS5zdHJpbmcsXG4gIGNvbG9yOiBfcHJvcFR5cGVzMltcImRlZmF1bHRcIl0uc3RyaW5nLFxuICBlbmFibGVBbHBoYTogX3Byb3BUeXBlczJbXCJkZWZhdWx0XCJdLmJvb2wsXG4gIG1vZGU6IF9wcm9wVHlwZXMyW1wiZGVmYXVsdFwiXS5vbmVPZihbJ1JHQicsICdIU0wnLCAnSFNCJ10pLFxuICBvbkNoYW5nZTogX3Byb3BUeXBlczJbXCJkZWZhdWx0XCJdLmZ1bmMsXG4gIG9uQ2xvc2U6IF9wcm9wVHlwZXMyW1wiZGVmYXVsdFwiXS5mdW5jLFxuICBvbk9wZW46IF9wcm9wVHlwZXMyW1wiZGVmYXVsdFwiXS5mdW5jLFxuICBwbGFjZW1lbnQ6IF9wcm9wVHlwZXMyW1wiZGVmYXVsdFwiXS5vbmVPZihbJ3RvcExlZnQnLCAndG9wUmlnaHQnLCAnYm90dG9tTGVmdCcsICdib3R0b21SaWdodCddKSxcbiAgcHJlZml4Q2xzOiBfcHJvcFR5cGVzMltcImRlZmF1bHRcIl0uc3RyaW5nLmlzUmVxdWlyZWQsXG4gIHN0eWxlOiBfcHJvcFR5cGVzMltcImRlZmF1bHRcIl0ub2JqZWN0XG59O1xuXG5Db2xvclBpY2tlci5kZWZhdWx0UHJvcHMgPSB7XG4gIGRlZmF1bHRDb2xvcjogJyNGMDAnLFxuICBkZWZhdWx0QWxwaGE6IDEwMCxcbiAgb25DaGFuZ2U6IGZ1bmN0aW9uIG9uQ2hhbmdlKCkge30sXG4gIG9uT3BlbjogZnVuY3Rpb24gb25PcGVuKCkge30sXG4gIG9uQ2xvc2U6IGZ1bmN0aW9uIG9uQ2xvc2UoKSB7fSxcblxuICBjaGlsZHJlbjogX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudCgnc3BhbicsIHsgY2xhc3NOYW1lOiAncmMtY29sb3ItcGlja2VyLXRyaWdnZXInIH0pLFxuICBjbGFzc05hbWU6ICcnLFxuICBlbmFibGVBbHBoYTogdHJ1ZSxcbiAgcGxhY2VtZW50OiAndG9wTGVmdCcsXG4gIHByZWZpeENsczogJ3JjLWNvbG9yLXBpY2tlcicsXG4gIHN0eWxlOiB7fVxufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL0NvbG9yUGlja2VyJyk7XG5tb2R1bGUuZXhwb3J0cy5QYW5lbCA9IHJlcXVpcmUoJy4vUGFuZWwnKTsiLCJleHBvcnQgZGVmYXVsdCB7XG4gICcxLjAwJzogJ0ZGJyxcbiAgMC45OTogJ0ZDJyxcbiAgMC45ODogJ0ZBJyxcbiAgMC45NzogJ0Y3JyxcbiAgMC45NjogJ0Y1JyxcbiAgMC45NTogJ0YyJyxcbiAgMC45NDogJ0YwJyxcbiAgMC45MzogJ0VEJyxcbiAgMC45MjogJ0VCJyxcbiAgMC45MTogJ0U4JyxcbiAgJzAuOTAnOiAnRTYnLFxuICAwLjg5OiAnRTMnLFxuICAwLjg4OiAnRTAnLFxuICAwLjg3OiAnREUnLFxuICAwLjg2OiAnREInLFxuICAwLjg1OiAnRDknLFxuICAwLjg0OiAnRDYnLFxuICAwLjgzOiAnRDQnLFxuICAwLjgyOiAnRDEnLFxuICAwLjgxOiAnQ0YnLFxuICAnMC44MCc6ICdDQycsXG4gIDAuNzk6ICdDOScsXG4gIDAuNzg6ICdDNycsXG4gIDAuNzc6ICdDNCcsXG4gIDAuNzY6ICdDMicsXG4gIDAuNzU6ICdCRicsXG4gIDAuNzQ6ICdCRCcsXG4gIDAuNzM6ICdCQScsXG4gIDAuNzI6ICdCOCcsXG4gIDAuNzE6ICdCNScsXG4gICcwLjcwJzogJ0IzJyxcbiAgMC42OTogJ0IwJyxcbiAgMC42ODogJ0FEJyxcbiAgMC42NzogJ0FCJyxcbiAgMC42NjogJ0E4JyxcbiAgMC42NTogJ0E2JyxcbiAgMC42NDogJ0EzJyxcbiAgMC42MzogJ0ExJyxcbiAgMC42MjogJzlFJyxcbiAgMC42MTogJzlDJyxcbiAgJzAuNjAnOiAnOTknLFxuICAwLjU5OiAnOTYnLFxuICAwLjU4OiAnOTQnLFxuICAwLjU3OiAnOTEnLFxuICAwLjU2OiAnOEYnLFxuICAwLjU1OiAnOEMnLFxuICAwLjU0OiAnOEEnLFxuICAwLjUzOiAnODcnLFxuICAwLjUyOiAnODUnLFxuICAwLjUxOiAnODInLFxuICAnMC41MCc6ICc4MCcsXG4gIDAuNDk6ICc3RCcsXG4gIDAuNDg6ICc3QScsXG4gIDAuNDc6ICc3OCcsXG4gIDAuNDY6ICc3NScsXG4gIDAuNDU6ICc3MycsXG4gIDAuNDQ6ICc3MCcsXG4gIDAuNDM6ICc2RScsXG4gIDAuNDI6ICc2QicsXG4gIDAuNDE6ICc2OScsXG4gICcwLjQwJzogJzY2JyxcbiAgMC4zOTogJzYzJyxcbiAgMC4zODogJzYxJyxcbiAgMC4zNzogJzVFJyxcbiAgMC4zNjogJzVDJyxcbiAgMC4zNTogJzU5JyxcbiAgMC4zNDogJzU3JyxcbiAgMC4zMzogJzU0JyxcbiAgMC4zMjogJzUyJyxcbiAgMC4zMTogJzRGJyxcbiAgJzAuMzAnOiAnNEQnLFxuICAwLjI5OiAnNEEnLFxuICAwLjI4OiAnNDcnLFxuICAwLjI3OiAnNDUnLFxuICAwLjI2OiAnNDInLFxuICAwLjI1OiAnNDAnLFxuICAwLjI0OiAnM0QnLFxuICAwLjIzOiAnM0InLFxuICAwLjIyOiAnMzgnLFxuICAwLjIxOiAnMzYnLFxuICAnMC4yMCc6ICczMycsXG4gIDAuMTk6ICczMCcsXG4gIDAuMTg6ICcyRScsXG4gIDAuMTc6ICcyQicsXG4gIDAuMTY6ICcyOScsXG4gIDAuMTU6ICcyNicsXG4gIDAuMTQ6ICcyNCcsXG4gIDAuMTM6ICcyMScsXG4gIDAuMTI6ICcxRicsXG4gIDAuMTE6ICcxQycsXG4gICcwLjEwJzogJzFBJyxcbiAgMC4wOTogJzE3JyxcbiAgMC4wODogJzE0JyxcbiAgMC4wNzogJzEyJyxcbiAgMC4wNjogJzBGJyxcbiAgMC4wNTogJzBEJyxcbiAgMC4wNDogJzBBJyxcbiAgMC4wMzogJzA4JyxcbiAgMC4wMjogJzA1JyxcbiAgMC4wMTogJzAzJyxcbiAgJzAuMDAnOiAnMDAnXG59OyIsImltcG9ydCBcImFudGQvZXMvaW5wdXQvc3R5bGVcIjtcbmltcG9ydCBfSW5wdXQgZnJvbSBcImFudGQvZXMvaW5wdXRcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQ29sb3JQaWNrZXIgZnJvbSAncmMtY29sb3ItcGlja2VyJztcbmltcG9ydCBhbHBoYUhleE1hcCBmcm9tICcuL2FscGhhaGV4TWFwJztcbmltcG9ydCAncmMtY29sb3ItcGlja2VyL2Fzc2V0cy9pbmRleC5jc3MnO1xuaW1wb3J0IFwiLi9pbmRleC5jc3NcIjtcbi8vIEV4cDogJyNmZmZmZmZBNicgPT4gYWxnaGE6IDY1XG52YXIgZ2V0QWxwaGFGcm9tSGV4ID0gZnVuY3Rpb24gZ2V0QWxwaGFGcm9tSGV4KCkge1xuICB2YXIgaGV4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnI2ZmZmZmZic7XG4gIHZhciBhbHBoYUhleCA9IGhleC5zbGljZSg3KTtcbiAgdmFyIGFscGhhID0gMTAwO1xuICBmb3IgKHZhciBrZXkgaW4gYWxwaGFIZXhNYXApIHtcbiAgICBpZiAoYWxwaGFIZXhNYXBba2V5XSA9PT0gYWxwaGFIZXgudG9VcHBlckNhc2UoKSkge1xuICAgICAgYWxwaGEgPSBOdW1iZXIoa2V5KSAqIDEwMDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFscGhhO1xufTtcbnZhciBDb2xvciA9IGZ1bmN0aW9uIENvbG9yKHByb3BzKSB7XG4gIHZhciBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgc2NoZW1hID0gcHJvcHMuc2NoZW1hLFxuICAgIGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgcmVhZE9ubHkgPSBwcm9wcy5yZWFkT25seSxcbiAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgIG9uQ2hhbmdlID0gcHJvcHMub25DaGFuZ2UsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZTtcbiAgdmFyIG9uUGlja2VyQ2hhbmdlID0gZnVuY3Rpb24gb25QaWNrZXJDaGFuZ2UoZXYpIHtcbiAgICBpZiAoZGlzYWJsZWQgfHwgcmVhZE9ubHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGFscGhhSGV4ID0gYWxwaGFIZXhNYXBbKGV2LmFscGhhIC8gMTAwKS50b0ZpeGVkKDIpXTtcbiAgICB2YXIgaGV4ID0gZXYuY29sb3IgKyAoZXYuYWxwaGEgPT09IDEwMCA/ICcnIDogYWxwaGFIZXgpO1xuICAgIG9uQ2hhbmdlKGhleCk7XG4gIH07XG4gIHZhciBvbklucHV0Q2hhbmdlID0gZnVuY3Rpb24gb25JbnB1dENoYW5nZShldikge1xuICAgIG9uQ2hhbmdlKGV2LnRhcmdldC52YWx1ZSk7XG4gIH07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiAnZnItY29sb3ItcGlja2VyJyxcbiAgICBzdHlsZTogc3R5bGVcbiAgfSwgZGlzYWJsZWQgfHwgcmVhZE9ubHkgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogJ3JjLWNvbG9yLXBpY2tlci10cmlnZ2VyJyxcbiAgICBzdHlsZToge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiB2YWx1ZSB8fCAnI2ZmZmZmZidcbiAgICB9XG4gIH0pIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29sb3JQaWNrZXIsIHtcbiAgICB0eXBlOiBzY2hlbWEgPT09IG51bGwgfHwgc2NoZW1hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzY2hlbWEuZm9ybWF0LFxuICAgIGFuaW1hdGlvbjogJ3NsaWRlLXVwJyxcbiAgICBjb2xvcjogdmFsdWUgJiYgdmFsdWUuc2xpY2UoMCwgNykgfHwgJyNmZmZmZmYnLFxuICAgIGFscGhhOiBnZXRBbHBoYUZyb21IZXgodmFsdWUpLFxuICAgIG9uQ2hhbmdlOiBvblBpY2tlckNoYW5nZSxcbiAgICBkaXNhYmxlZDogdHJ1ZVxuICB9KSwgcmVhZE9ubHkgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgdmFsdWUgfHwgJyNmZmZmZmYnKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9JbnB1dCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgIHBsYWNlaG9sZGVyOiAnI2ZmZmZmZicsXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBvbkNoYW5nZTogb25JbnB1dENoYW5nZVxuICB9KSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgQ29sb3I7IiwiIWZ1bmN0aW9uKHQsbil7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9bigpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUobik6KHQ9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczp0fHxzZWxmKS5kYXlqc19wbHVnaW5fcXVhcnRlck9mWWVhcj1uKCl9KHRoaXMsKGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIHQ9XCJtb250aFwiLG49XCJxdWFydGVyXCI7cmV0dXJuIGZ1bmN0aW9uKGUsaSl7dmFyIHI9aS5wcm90b3R5cGU7ci5xdWFydGVyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLiR1dGlscygpLnUodCk/TWF0aC5jZWlsKCh0aGlzLm1vbnRoKCkrMSkvMyk6dGhpcy5tb250aCh0aGlzLm1vbnRoKCklMyszKih0LTEpKX07dmFyIHM9ci5hZGQ7ci5hZGQ9ZnVuY3Rpb24oZSxpKXtyZXR1cm4gZT1OdW1iZXIoZSksdGhpcy4kdXRpbHMoKS5wKGkpPT09bj90aGlzLmFkZCgzKmUsdCk6cy5iaW5kKHRoaXMpKGUsaSl9O3ZhciB1PXIuc3RhcnRPZjtyLnN0YXJ0T2Y9ZnVuY3Rpb24oZSxpKXt2YXIgcj10aGlzLiR1dGlscygpLHM9ISFyLnUoaSl8fGk7aWYoci5wKGUpPT09bil7dmFyIG89dGhpcy5xdWFydGVyKCktMTtyZXR1cm4gcz90aGlzLm1vbnRoKDMqbykuc3RhcnRPZih0KS5zdGFydE9mKFwiZGF5XCIpOnRoaXMubW9udGgoMypvKzIpLmVuZE9mKHQpLmVuZE9mKFwiZGF5XCIpfXJldHVybiB1LmJpbmQodGhpcykoZSxpKX19fSkpOyIsIiFmdW5jdGlvbihlLHQpe1wib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPXQoKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKHQpOihlPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6ZXx8c2VsZikuZGF5anNfcGx1Z2luX3dlZWtPZlllYXI9dCgpfSh0aGlzLChmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciBlPVwid2Vla1wiLHQ9XCJ5ZWFyXCI7cmV0dXJuIGZ1bmN0aW9uKGksbixyKXt2YXIgZj1uLnByb3RvdHlwZTtmLndlZWs9ZnVuY3Rpb24oaSl7aWYodm9pZCAwPT09aSYmKGk9bnVsbCksbnVsbCE9PWkpcmV0dXJuIHRoaXMuYWRkKDcqKGktdGhpcy53ZWVrKCkpLFwiZGF5XCIpO3ZhciBuPXRoaXMuJGxvY2FsZSgpLnllYXJTdGFydHx8MTtpZigxMT09PXRoaXMubW9udGgoKSYmdGhpcy5kYXRlKCk+MjUpe3ZhciBmPXIodGhpcykuc3RhcnRPZih0KS5hZGQoMSx0KS5kYXRlKG4pLHM9cih0aGlzKS5lbmRPZihlKTtpZihmLmlzQmVmb3JlKHMpKXJldHVybiAxfXZhciBhPXIodGhpcykuc3RhcnRPZih0KS5kYXRlKG4pLnN0YXJ0T2YoZSkuc3VidHJhY3QoMSxcIm1pbGxpc2Vjb25kXCIpLG89dGhpcy5kaWZmKGEsZSwhMCk7cmV0dXJuIG88MD9yKHRoaXMpLnN0YXJ0T2YoXCJ3ZWVrXCIpLndlZWsoKTpNYXRoLmNlaWwobyl9LGYud2Vla3M9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPW51bGwpLHRoaXMud2VlayhlKX19fSkpOyIsImZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpOyB9XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07IHJldHVybiBhcnIyOyB9XG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7IHZhciBfaSA9IG51bGwgPT0gYXJyID8gbnVsbCA6IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiBhcnJbU3ltYm9sLml0ZXJhdG9yXSB8fCBhcnJbXCJAQGl0ZXJhdG9yXCJdOyBpZiAobnVsbCAhPSBfaSkgeyB2YXIgX3MsIF9lLCBfeCwgX3IsIF9hcnIgPSBbXSwgX24gPSAhMCwgX2QgPSAhMTsgdHJ5IHsgaWYgKF94ID0gKF9pID0gX2kuY2FsbChhcnIpKS5uZXh0LCAwID09PSBpKSB7IGlmIChPYmplY3QoX2kpICE9PSBfaSkgcmV0dXJuOyBfbiA9ICExOyB9IGVsc2UgZm9yICg7ICEoX24gPSAoX3MgPSBfeC5jYWxsKF9pKSkuZG9uZSkgJiYgKF9hcnIucHVzaChfcy52YWx1ZSksIF9hcnIubGVuZ3RoICE9PSBpKTsgX24gPSAhMCk7IH0gY2F0Y2ggKGVycikgeyBfZCA9ICEwLCBfZSA9IGVycjsgfSBmaW5hbGx5IHsgdHJ5IHsgaWYgKCFfbiAmJiBudWxsICE9IF9pLnJldHVybiAmJiAoX3IgPSBfaS5yZXR1cm4oKSwgT2JqZWN0KF9yKSAhPT0gX3IpKSByZXR1cm47IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfSB9XG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcyc7XG5pbXBvcnQgd2Vla09mWWVhciBmcm9tICdkYXlqcy9wbHVnaW4vd2Vla09mWWVhcic7XG5kYXlqcy5leHRlbmQod2Vla09mWWVhcik7IC8vIOWQr+eUqCB3ZWVrT2ZZZWFyIOaPkuS7tlxuZXhwb3J0IGZ1bmN0aW9uIGlzVXJsKHN0cikge1xuICB2YXIgcHJvdG9jb2xSRSA9IC9eKD86XFx3KzopP1xcL1xcLyhcXFMrKSQvO1xuICAvLyBjb25zdCBkb21haW5SRSA9IC9eW15cXHNcXC5dK1xcLlxcU3syLH0kLztcbiAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBwcm90b2NvbFJFLnRlc3Qoc3RyKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXQoZm9ybWF0KSB7XG4gIHZhciBkYXRlRm9ybWF0O1xuICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgZGF0ZUZvcm1hdCA9ICdZWVlZLU1NLUREJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RpbWUnOlxuICAgICAgZGF0ZUZvcm1hdCA9ICdISDptbTpzcyc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdkYXRlVGltZSc6XG4gICAgICBkYXRlRm9ybWF0ID0gJ1lZWVktTU0tREQgSEg6bW06c3MnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnd2Vlayc6XG4gICAgICBkYXRlRm9ybWF0ID0gJ1lZWVktdyc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd5ZWFyJzpcbiAgICAgIGRhdGVGb3JtYXQgPSAnWVlZWSc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgIGRhdGVGb3JtYXQgPSAnWVlZWS1RJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgIGRhdGVGb3JtYXQgPSAnWVlZWS1NTSc7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gZGF0ZVRpbWVcbiAgICAgIGlmICh0eXBlb2YgZm9ybWF0ID09PSAnc3RyaW5nJykge1xuICAgICAgICBkYXRlRm9ybWF0ID0gZm9ybWF0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0ZUZvcm1hdCA9ICdZWVlZLU1NLUREJztcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gZGF0ZUZvcm1hdDtcbn1cbmV4cG9ydCB2YXIgdHJhbnNmb3JtRGF0ZVZhbHVlID0gZnVuY3Rpb24gdHJhbnNmb3JtRGF0ZVZhbHVlKHZhbHVlLCBmb3JtYXQsIGRhdGVGb3JtYXQpIHtcbiAgdmFyIF9hO1xuICB2YXIgcmVzdWx0ID0gdmFsdWUgfHwgdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIGlmIChmb3JtYXQgPT09ICd3ZWVrJykge1xuICAgICAgdmFyIF92YWx1ZSRzcGxpdCA9IHZhbHVlLnNwbGl0KCctJyksXG4gICAgICAgIF92YWx1ZSRzcGxpdDIgPSBfc2xpY2VkVG9BcnJheShfdmFsdWUkc3BsaXQsIDIpLFxuICAgICAgICB5ZWFycyA9IF92YWx1ZSRzcGxpdDJbMF0sXG4gICAgICAgIHdlZWsgPSBfdmFsdWUkc3BsaXQyWzFdO1xuICAgICAgcmVzdWx0ID0gKF9hID0gZGF5anMoeWVhcnMpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eud2VlayhOdW1iZXIod2VlaykpO1xuICAgIH1cbiAgICBpZiAoZm9ybWF0ID09PSAncXVhcnRlcicpIHtcbiAgICAgIHZhciBfdmFsdWUkc3BsaXQzID0gdmFsdWUuc3BsaXQoJy0nKSxcbiAgICAgICAgX3ZhbHVlJHNwbGl0NCA9IF9zbGljZWRUb0FycmF5KF92YWx1ZSRzcGxpdDMsIDIpLFxuICAgICAgICB5ZWFyeCA9IF92YWx1ZSRzcGxpdDRbMF0sXG4gICAgICAgIHF1YXJ0ZXIgPSBfdmFsdWUkc3BsaXQ0WzFdO1xuICAgICAgcmVzdWx0ID0gZGF5anMoeWVhcngpLnF1YXJ0ZXIocXVhcnRlcik7XG4gICAgfVxuICB9XG4gIGlmIChyZXN1bHQpIHtcbiAgICByZXN1bHQgPSBkYXlqcyhyZXN1bHQsIGRhdGVGb3JtYXQpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuZXhwb3J0IHZhciB0cmFuc2xhdGlvbiA9IGZ1bmN0aW9uIHRyYW5zbGF0aW9uKGNvbmZpZ0N0eCkge1xuICByZXR1cm4gZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBfYTtcbiAgICB2YXIgbG9jYWxlID0gKF9hID0gY29uZmlnQ3R4ID09PSBudWxsIHx8IGNvbmZpZ0N0eCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uZmlnQ3R4LmxvY2FsZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLkZvcm1SZW5kZXI7XG4gICAgcmV0dXJuIGxvY2FsZVtrZXldO1xuICB9O1xufTsiLCIhZnVuY3Rpb24oZSx0KXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZSh0KTooZT1cInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOmV8fHNlbGYpLmRheWpzX3BsdWdpbl93ZWVrZGF5PXQoKX0odGhpcywoZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gZnVuY3Rpb24oZSx0KXt0LnByb3RvdHlwZS53ZWVrZGF5PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuJGxvY2FsZSgpLndlZWtTdGFydHx8MCxpPXRoaXMuJFcsbj0oaTx0P2krNzppKS10O3JldHVybiB0aGlzLiR1dGlscygpLnUoZSk/bjp0aGlzLnN1YnRyYWN0KG4sXCJkYXlcIikuYWRkKGUsXCJkYXlcIil9fX0pKTsiLCIhZnVuY3Rpb24obixlKXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShlKToobj1cInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOm58fHNlbGYpLmRheWpzX3BsdWdpbl9sb2NhbGVEYXRhPWUoKX0odGhpcywoZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gZnVuY3Rpb24obixlLHQpe3ZhciByPWUucHJvdG90eXBlLG89ZnVuY3Rpb24obil7cmV0dXJuIG4mJihuLmluZGV4T2Y/bjpuLnMpfSx1PWZ1bmN0aW9uKG4sZSx0LHIsdSl7dmFyIGk9bi5uYW1lP246bi4kbG9jYWxlKCksYT1vKGlbZV0pLHM9byhpW3RdKSxmPWF8fHMubWFwKChmdW5jdGlvbihuKXtyZXR1cm4gbi5zbGljZSgwLHIpfSkpO2lmKCF1KXJldHVybiBmO3ZhciBkPWkud2Vla1N0YXJ0O3JldHVybiBmLm1hcCgoZnVuY3Rpb24obixlKXtyZXR1cm4gZlsoZSsoZHx8MCkpJTddfSkpfSxpPWZ1bmN0aW9uKCl7cmV0dXJuIHQuTHNbdC5sb2NhbGUoKV19LGE9ZnVuY3Rpb24obixlKXtyZXR1cm4gbi5mb3JtYXRzW2VdfHxmdW5jdGlvbihuKXtyZXR1cm4gbi5yZXBsYWNlKC8oXFxbW15cXF1dK10pfChNTU1NfE1NfEREfGRkZGQpL2csKGZ1bmN0aW9uKG4sZSx0KXtyZXR1cm4gZXx8dC5zbGljZSgxKX0pKX0obi5mb3JtYXRzW2UudG9VcHBlckNhc2UoKV0pfSxzPWZ1bmN0aW9uKCl7dmFyIG49dGhpcztyZXR1cm57bW9udGhzOmZ1bmN0aW9uKGUpe3JldHVybiBlP2UuZm9ybWF0KFwiTU1NTVwiKTp1KG4sXCJtb250aHNcIil9LG1vbnRoc1Nob3J0OmZ1bmN0aW9uKGUpe3JldHVybiBlP2UuZm9ybWF0KFwiTU1NXCIpOnUobixcIm1vbnRoc1Nob3J0XCIsXCJtb250aHNcIiwzKX0sZmlyc3REYXlPZldlZWs6ZnVuY3Rpb24oKXtyZXR1cm4gbi4kbG9jYWxlKCkud2Vla1N0YXJ0fHwwfSx3ZWVrZGF5czpmdW5jdGlvbihlKXtyZXR1cm4gZT9lLmZvcm1hdChcImRkZGRcIik6dShuLFwid2Vla2RheXNcIil9LHdlZWtkYXlzTWluOmZ1bmN0aW9uKGUpe3JldHVybiBlP2UuZm9ybWF0KFwiZGRcIik6dShuLFwid2Vla2RheXNNaW5cIixcIndlZWtkYXlzXCIsMil9LHdlZWtkYXlzU2hvcnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/ZS5mb3JtYXQoXCJkZGRcIik6dShuLFwid2Vla2RheXNTaG9ydFwiLFwid2Vla2RheXNcIiwzKX0sbG9uZ0RhdGVGb3JtYXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGEobi4kbG9jYWxlKCksZSl9LG1lcmlkaWVtOnRoaXMuJGxvY2FsZSgpLm1lcmlkaWVtLG9yZGluYWw6dGhpcy4kbG9jYWxlKCkub3JkaW5hbH19O3IubG9jYWxlRGF0YT1mdW5jdGlvbigpe3JldHVybiBzLmJpbmQodGhpcykoKX0sdC5sb2NhbGVEYXRhPWZ1bmN0aW9uKCl7dmFyIG49aSgpO3JldHVybntmaXJzdERheU9mV2VlazpmdW5jdGlvbigpe3JldHVybiBuLndlZWtTdGFydHx8MH0sd2Vla2RheXM6ZnVuY3Rpb24oKXtyZXR1cm4gdC53ZWVrZGF5cygpfSx3ZWVrZGF5c1Nob3J0OmZ1bmN0aW9uKCl7cmV0dXJuIHQud2Vla2RheXNTaG9ydCgpfSx3ZWVrZGF5c01pbjpmdW5jdGlvbigpe3JldHVybiB0LndlZWtkYXlzTWluKCl9LG1vbnRoczpmdW5jdGlvbigpe3JldHVybiB0Lm1vbnRocygpfSxtb250aHNTaG9ydDpmdW5jdGlvbigpe3JldHVybiB0Lm1vbnRoc1Nob3J0KCl9LGxvbmdEYXRlRm9ybWF0OmZ1bmN0aW9uKGUpe3JldHVybiBhKG4sZSl9LG1lcmlkaWVtOm4ubWVyaWRpZW0sb3JkaW5hbDpuLm9yZGluYWx9fSx0Lm1vbnRocz1mdW5jdGlvbigpe3JldHVybiB1KGkoKSxcIm1vbnRoc1wiKX0sdC5tb250aHNTaG9ydD1mdW5jdGlvbigpe3JldHVybiB1KGkoKSxcIm1vbnRoc1Nob3J0XCIsXCJtb250aHNcIiwzKX0sdC53ZWVrZGF5cz1mdW5jdGlvbihuKXtyZXR1cm4gdShpKCksXCJ3ZWVrZGF5c1wiLG51bGwsbnVsbCxuKX0sdC53ZWVrZGF5c1Nob3J0PWZ1bmN0aW9uKG4pe3JldHVybiB1KGkoKSxcIndlZWtkYXlzU2hvcnRcIixcIndlZWtkYXlzXCIsMyxuKX0sdC53ZWVrZGF5c01pbj1mdW5jdGlvbihuKXtyZXR1cm4gdShpKCksXCJ3ZWVrZGF5c01pblwiLFwid2Vla2RheXNcIiwyLG4pfX19KSk7IiwiIWZ1bmN0aW9uKGUsdCl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9dCgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUodCk6KGU9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczplfHxzZWxmKS5kYXlqc19wbHVnaW5fd2Vla1llYXI9dCgpfSh0aGlzLChmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3JldHVybiBmdW5jdGlvbihlLHQpe3QucHJvdG90eXBlLndlZWtZZWFyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5tb250aCgpLHQ9dGhpcy53ZWVrKCksbj10aGlzLnllYXIoKTtyZXR1cm4gMT09PXQmJjExPT09ZT9uKzE6MD09PWUmJnQ+PTUyP24tMTpufX19KSk7IiwiIWZ1bmN0aW9uKGUsdCl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9dCgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUodCk6KGU9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczplfHxzZWxmKS5kYXlqc19wbHVnaW5fYWR2YW5jZWRGb3JtYXQ9dCgpfSh0aGlzLChmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3JldHVybiBmdW5jdGlvbihlLHQpe3ZhciByPXQucHJvdG90eXBlLG49ci5mb3JtYXQ7ci5mb3JtYXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxyPXRoaXMuJGxvY2FsZSgpO2lmKCF0aGlzLmlzVmFsaWQoKSlyZXR1cm4gbi5iaW5kKHRoaXMpKGUpO3ZhciBzPXRoaXMuJHV0aWxzKCksYT0oZXx8XCJZWVlZLU1NLUREVEhIOm1tOnNzWlwiKS5yZXBsYWNlKC9cXFsoW15cXF1dKyldfFF8d298d3d8d3xXV3xXfHp6enx6fGdnZ2d8R0dHR3xEb3xYfHh8a3sxLDJ9fFMvZywoZnVuY3Rpb24oZSl7c3dpdGNoKGUpe2Nhc2VcIlFcIjpyZXR1cm4gTWF0aC5jZWlsKCh0LiRNKzEpLzMpO2Nhc2VcIkRvXCI6cmV0dXJuIHIub3JkaW5hbCh0LiREKTtjYXNlXCJnZ2dnXCI6cmV0dXJuIHQud2Vla1llYXIoKTtjYXNlXCJHR0dHXCI6cmV0dXJuIHQuaXNvV2Vla1llYXIoKTtjYXNlXCJ3b1wiOnJldHVybiByLm9yZGluYWwodC53ZWVrKCksXCJXXCIpO2Nhc2VcIndcIjpjYXNlXCJ3d1wiOnJldHVybiBzLnModC53ZWVrKCksXCJ3XCI9PT1lPzE6MixcIjBcIik7Y2FzZVwiV1wiOmNhc2VcIldXXCI6cmV0dXJuIHMucyh0Lmlzb1dlZWsoKSxcIldcIj09PWU/MToyLFwiMFwiKTtjYXNlXCJrXCI6Y2FzZVwia2tcIjpyZXR1cm4gcy5zKFN0cmluZygwPT09dC4kSD8yNDp0LiRIKSxcImtcIj09PWU/MToyLFwiMFwiKTtjYXNlXCJYXCI6cmV0dXJuIE1hdGguZmxvb3IodC4kZC5nZXRUaW1lKCkvMWUzKTtjYXNlXCJ4XCI6cmV0dXJuIHQuJGQuZ2V0VGltZSgpO2Nhc2VcInpcIjpyZXR1cm5cIltcIit0Lm9mZnNldE5hbWUoKStcIl1cIjtjYXNlXCJ6enpcIjpyZXR1cm5cIltcIit0Lm9mZnNldE5hbWUoXCJsb25nXCIpK1wiXVwiO2RlZmF1bHQ6cmV0dXJuIGV9fSkpO3JldHVybiBuLmJpbmQodGhpcykoYSl9fX0pKTsiLCIhZnVuY3Rpb24oZSx0KXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZSh0KTooZT1cInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOmV8fHNlbGYpLmRheWpzX3BsdWdpbl9jdXN0b21QYXJzZUZvcm1hdD10KCl9KHRoaXMsKGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGU9e0xUUzpcImg6bW06c3MgQVwiLExUOlwiaDptbSBBXCIsTDpcIk1NL0REL1lZWVlcIixMTDpcIk1NTU0gRCwgWVlZWVwiLExMTDpcIk1NTU0gRCwgWVlZWSBoOm1tIEFcIixMTExMOlwiZGRkZCwgTU1NTSBELCBZWVlZIGg6bW0gQVwifSx0PS8oXFxbW15bXSpcXF0pfChbLV86Ly4sKClcXHNdKyl8KEF8YXxZWVlZfFlZP3xNTT9NP00/fERvfEREP3xoaD98SEg/fG1tP3xzcz98U3sxLDN9fHp8Wlo/KS9nLG49L1xcZFxcZC8scj0vXFxkXFxkPy8saT0vXFxkKlteLV86LywoKVxcc1xcZF0rLyxvPXt9LHM9ZnVuY3Rpb24oZSl7cmV0dXJuKGU9K2UpKyhlPjY4PzE5MDA6MmUzKX07dmFyIGE9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3RoaXNbZV09K3R9fSxmPVsvWystXVxcZFxcZDo/KFxcZFxcZCk/fFovLGZ1bmN0aW9uKGUpeyh0aGlzLnpvbmV8fCh0aGlzLnpvbmU9e30pKS5vZmZzZXQ9ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuIDA7aWYoXCJaXCI9PT1lKXJldHVybiAwO3ZhciB0PWUubWF0Y2goLyhbKy1dfFxcZFxcZCkvZyksbj02MCp0WzFdKygrdFsyXXx8MCk7cmV0dXJuIDA9PT1uPzA6XCIrXCI9PT10WzBdPy1uOm59KGUpfV0saD1mdW5jdGlvbihlKXt2YXIgdD1vW2VdO3JldHVybiB0JiYodC5pbmRleE9mP3Q6dC5zLmNvbmNhdCh0LmYpKX0sdT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9by5tZXJpZGllbTtpZihyKXtmb3IodmFyIGk9MTtpPD0yNDtpKz0xKWlmKGUuaW5kZXhPZihyKGksMCx0KSk+LTEpe249aT4xMjticmVha319ZWxzZSBuPWU9PT0odD9cInBtXCI6XCJQTVwiKTtyZXR1cm4gbn0sZD17QTpbaSxmdW5jdGlvbihlKXt0aGlzLmFmdGVybm9vbj11KGUsITEpfV0sYTpbaSxmdW5jdGlvbihlKXt0aGlzLmFmdGVybm9vbj11KGUsITApfV0sUzpbL1xcZC8sZnVuY3Rpb24oZSl7dGhpcy5taWxsaXNlY29uZHM9MTAwKitlfV0sU1M6W24sZnVuY3Rpb24oZSl7dGhpcy5taWxsaXNlY29uZHM9MTAqK2V9XSxTU1M6Wy9cXGR7M30vLGZ1bmN0aW9uKGUpe3RoaXMubWlsbGlzZWNvbmRzPStlfV0sczpbcixhKFwic2Vjb25kc1wiKV0sc3M6W3IsYShcInNlY29uZHNcIildLG06W3IsYShcIm1pbnV0ZXNcIildLG1tOltyLGEoXCJtaW51dGVzXCIpXSxIOltyLGEoXCJob3Vyc1wiKV0saDpbcixhKFwiaG91cnNcIildLEhIOltyLGEoXCJob3Vyc1wiKV0saGg6W3IsYShcImhvdXJzXCIpXSxEOltyLGEoXCJkYXlcIildLEREOltuLGEoXCJkYXlcIildLERvOltpLGZ1bmN0aW9uKGUpe3ZhciB0PW8ub3JkaW5hbCxuPWUubWF0Y2goL1xcZCsvKTtpZih0aGlzLmRheT1uWzBdLHQpZm9yKHZhciByPTE7cjw9MzE7cis9MSl0KHIpLnJlcGxhY2UoL1xcW3xcXF0vZyxcIlwiKT09PWUmJih0aGlzLmRheT1yKX1dLE06W3IsYShcIm1vbnRoXCIpXSxNTTpbbixhKFwibW9udGhcIildLE1NTTpbaSxmdW5jdGlvbihlKXt2YXIgdD1oKFwibW9udGhzXCIpLG49KGgoXCJtb250aHNTaG9ydFwiKXx8dC5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnNsaWNlKDAsMyl9KSkpLmluZGV4T2YoZSkrMTtpZihuPDEpdGhyb3cgbmV3IEVycm9yO3RoaXMubW9udGg9biUxMnx8bn1dLE1NTU06W2ksZnVuY3Rpb24oZSl7dmFyIHQ9aChcIm1vbnRoc1wiKS5pbmRleE9mKGUpKzE7aWYodDwxKXRocm93IG5ldyBFcnJvcjt0aGlzLm1vbnRoPXQlMTJ8fHR9XSxZOlsvWystXT9cXGQrLyxhKFwieWVhclwiKV0sWVk6W24sZnVuY3Rpb24oZSl7dGhpcy55ZWFyPXMoZSl9XSxZWVlZOlsvXFxkezR9LyxhKFwieWVhclwiKV0sWjpmLFpaOmZ9O2Z1bmN0aW9uIGMobil7dmFyIHIsaTtyPW4saT1vJiZvLmZvcm1hdHM7Zm9yKHZhciBzPShuPXIucmVwbGFjZSgvKFxcW1teXFxdXStdKXwoTFRTP3xsezEsNH18THsxLDR9KS9nLChmdW5jdGlvbih0LG4scil7dmFyIG89ciYmci50b1VwcGVyQ2FzZSgpO3JldHVybiBufHxpW3JdfHxlW3JdfHxpW29dLnJlcGxhY2UoLyhcXFtbXlxcXV0rXSl8KE1NTU18TU18RER8ZGRkZCkvZywoZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0fHxuLnNsaWNlKDEpfSkpfSkpKS5tYXRjaCh0KSxhPXMubGVuZ3RoLGY9MDtmPGE7Zis9MSl7dmFyIGg9c1tmXSx1PWRbaF0sYz11JiZ1WzBdLGw9dSYmdVsxXTtzW2ZdPWw/e3JlZ2V4OmMscGFyc2VyOmx9OmgucmVwbGFjZSgvXlxcW3xcXF0kL2csXCJcIil9cmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD17fSxuPTAscj0wO248YTtuKz0xKXt2YXIgaT1zW25dO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBpKXIrPWkubGVuZ3RoO2Vsc2V7dmFyIG89aS5yZWdleCxmPWkucGFyc2VyLGg9ZS5zbGljZShyKSx1PW8uZXhlYyhoKVswXTtmLmNhbGwodCx1KSxlPWUucmVwbGFjZSh1LFwiXCIpfX1yZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hZnRlcm5vb247aWYodm9pZCAwIT09dCl7dmFyIG49ZS5ob3Vyczt0P248MTImJihlLmhvdXJzKz0xMik6MTI9PT1uJiYoZS5ob3Vycz0wKSxkZWxldGUgZS5hZnRlcm5vb259fSh0KSx0fX1yZXR1cm4gZnVuY3Rpb24oZSx0LG4pe24ucC5jdXN0b21QYXJzZUZvcm1hdD0hMCxlJiZlLnBhcnNlVHdvRGlnaXRZZWFyJiYocz1lLnBhcnNlVHdvRGlnaXRZZWFyKTt2YXIgcj10LnByb3RvdHlwZSxpPXIucGFyc2U7ci5wYXJzZT1mdW5jdGlvbihlKXt2YXIgdD1lLmRhdGUscj1lLnV0YyxzPWUuYXJnczt0aGlzLiR1PXI7dmFyIGE9c1sxXTtpZihcInN0cmluZ1wiPT10eXBlb2YgYSl7dmFyIGY9ITA9PT1zWzJdLGg9ITA9PT1zWzNdLHU9Znx8aCxkPXNbMl07aCYmKGQ9c1syXSksbz10aGlzLiRsb2NhbGUoKSwhZiYmZCYmKG89bi5Mc1tkXSksdGhpcy4kZD1mdW5jdGlvbihlLHQsbil7dHJ5e2lmKFtcInhcIixcIlhcIl0uaW5kZXhPZih0KT4tMSlyZXR1cm4gbmV3IERhdGUoKFwiWFwiPT09dD8xZTM6MSkqZSk7dmFyIHI9Yyh0KShlKSxpPXIueWVhcixvPXIubW9udGgscz1yLmRheSxhPXIuaG91cnMsZj1yLm1pbnV0ZXMsaD1yLnNlY29uZHMsdT1yLm1pbGxpc2Vjb25kcyxkPXIuem9uZSxsPW5ldyBEYXRlLG09c3x8KGl8fG8/MTpsLmdldERhdGUoKSksTT1pfHxsLmdldEZ1bGxZZWFyKCksWT0wO2kmJiFvfHwoWT1vPjA/by0xOmwuZ2V0TW9udGgoKSk7dmFyIHA9YXx8MCx2PWZ8fDAsRD1ofHwwLGc9dXx8MDtyZXR1cm4gZD9uZXcgRGF0ZShEYXRlLlVUQyhNLFksbSxwLHYsRCxnKzYwKmQub2Zmc2V0KjFlMykpOm4/bmV3IERhdGUoRGF0ZS5VVEMoTSxZLG0scCx2LEQsZykpOm5ldyBEYXRlKE0sWSxtLHAsdixELGcpfWNhdGNoKGUpe3JldHVybiBuZXcgRGF0ZShcIlwiKX19KHQsYSxyKSx0aGlzLmluaXQoKSxkJiYhMCE9PWQmJih0aGlzLiRMPXRoaXMubG9jYWxlKGQpLiRMKSx1JiZ0IT10aGlzLmZvcm1hdChhKSYmKHRoaXMuJGQ9bmV3IERhdGUoXCJcIikpLG89e319ZWxzZSBpZihhIGluc3RhbmNlb2YgQXJyYXkpZm9yKHZhciBsPWEubGVuZ3RoLG09MTttPD1sO20rPTEpe3NbMV09YVttLTFdO3ZhciBNPW4uYXBwbHkodGhpcyxzKTtpZihNLmlzVmFsaWQoKSl7dGhpcy4kZD1NLiRkLHRoaXMuJEw9TS4kTCx0aGlzLmluaXQoKTticmVha31tPT09bCYmKHRoaXMuJGQ9bmV3IERhdGUoXCJcIikpfWVsc2UgaS5jYWxsKHRoaXMsZSl9fX0pKTsiLCJpbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnO1xuaW1wb3J0IHsgbm90ZU9uY2UgfSBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5pbXBvcnQgd2Vla2RheSBmcm9tICdkYXlqcy9wbHVnaW4vd2Vla2RheSc7XG5pbXBvcnQgbG9jYWxlRGF0YSBmcm9tICdkYXlqcy9wbHVnaW4vbG9jYWxlRGF0YSc7XG5pbXBvcnQgd2Vla09mWWVhciBmcm9tICdkYXlqcy9wbHVnaW4vd2Vla09mWWVhcic7XG5pbXBvcnQgd2Vla1llYXIgZnJvbSAnZGF5anMvcGx1Z2luL3dlZWtZZWFyJztcbmltcG9ydCBhZHZhbmNlZEZvcm1hdCBmcm9tICdkYXlqcy9wbHVnaW4vYWR2YW5jZWRGb3JtYXQnO1xuaW1wb3J0IGN1c3RvbVBhcnNlRm9ybWF0IGZyb20gJ2RheWpzL3BsdWdpbi9jdXN0b21QYXJzZUZvcm1hdCc7XG5kYXlqcy5leHRlbmQoY3VzdG9tUGFyc2VGb3JtYXQpO1xuZGF5anMuZXh0ZW5kKGFkdmFuY2VkRm9ybWF0KTtcbmRheWpzLmV4dGVuZCh3ZWVrZGF5KTtcbmRheWpzLmV4dGVuZChsb2NhbGVEYXRhKTtcbmRheWpzLmV4dGVuZCh3ZWVrT2ZZZWFyKTtcbmRheWpzLmV4dGVuZCh3ZWVrWWVhcik7XG5kYXlqcy5leHRlbmQoZnVuY3Rpb24gKG8sIGMpIHtcbiAgLy8gdG9kbyBzdXBwb3J0IFdvIChJU08gd2VlaylcbiAgdmFyIHByb3RvID0gYy5wcm90b3R5cGU7XG4gIHZhciBvbGRGb3JtYXQgPSBwcm90by5mb3JtYXQ7XG4gIHByb3RvLmZvcm1hdCA9IGZ1bmN0aW9uIGYoZm9ybWF0U3RyKSB7XG4gICAgdmFyIHN0ciA9IChmb3JtYXRTdHIgfHwgJycpLnJlcGxhY2UoJ1dvJywgJ3dvJyk7XG4gICAgcmV0dXJuIG9sZEZvcm1hdC5iaW5kKHRoaXMpKHN0cik7XG4gIH07XG59KTtcbnZhciBsb2NhbGVNYXAgPSB7XG4gIC8vIGFyX0VHOlxuICAvLyBhel9BWjpcbiAgLy8gYmdfQkc6XG4gIGJuX0JEOiAnYm4tYmQnLFxuICBieV9CWTogJ2JlJyxcbiAgLy8gY2FfRVM6XG4gIC8vIGNzX0NaOlxuICAvLyBkYV9ESzpcbiAgLy8gZGVfREU6XG4gIC8vIGVsX0dSOlxuICBlbl9HQjogJ2VuLWdiJyxcbiAgZW5fVVM6ICdlbicsXG4gIC8vIGVzX0VTOlxuICAvLyBldF9FRTpcbiAgLy8gZmFfSVI6XG4gIC8vIGZpX0ZJOlxuICBmcl9CRTogJ2ZyJyxcbiAgZnJfQ0E6ICdmci1jYScsXG4gIC8vIGZyX0ZSOlxuICAvLyBnYV9JRTpcbiAgLy8gZ2xfRVM6XG4gIC8vIGhlX0lMOlxuICAvLyBoaV9JTjpcbiAgLy8gaHJfSFI6XG4gIC8vIGh1X0hVOlxuICBoeV9BTTogJ2h5LWFtJyxcbiAgLy8gaWRfSUQ6XG4gIC8vIGlzX0lTOlxuICAvLyBpdF9JVDpcbiAgLy8gamFfSlA6XG4gIC8vIGthX0dFOlxuICAvLyBra19LWjpcbiAgLy8ga21fS0g6XG4gIGttcl9JUTogJ2t1JyxcbiAgLy8ga25fSU46XG4gIC8vIGtvX0tSOlxuICAvLyBrdV9JUTogLy8gcHJldmlvdXMga3UgaW4gYW50ZFxuICAvLyBsdF9MVDpcbiAgLy8gbHZfTFY6XG4gIC8vIG1rX01LOlxuICAvLyBtbF9JTjpcbiAgLy8gbW5fTU46XG4gIC8vIG1zX01ZOlxuICAvLyBuYl9OTzpcbiAgLy8gbmVfTlA6XG4gIG5sX0JFOiAnbmwtYmUnLFxuICAvLyBubF9OTDpcbiAgLy8gcGxfUEw6XG4gIHB0X0JSOiAncHQtYnInLFxuICAvLyBwdF9QVDpcbiAgLy8gcm9fUk86XG4gIC8vIHJ1X1JVOlxuICAvLyBza19TSzpcbiAgLy8gc2xfU0k6XG4gIC8vIHNyX1JTOlxuICAvLyBzdl9TRTpcbiAgLy8gdGFfSU46XG4gIC8vIHRoX1RIOlxuICAvLyB0cl9UUjpcbiAgLy8gdWtfVUE6XG4gIC8vIHVyX1BLOlxuICAvLyB2aV9WTjpcbiAgemhfQ046ICd6aC1jbicsXG4gIHpoX0hLOiAnemgtaGsnLFxuICB6aF9UVzogJ3poLXR3J1xufTtcbnZhciBwYXJzZUxvY2FsZSA9IGZ1bmN0aW9uIHBhcnNlTG9jYWxlKGxvY2FsZSkge1xuICB2YXIgbWFwTG9jYWxlID0gbG9jYWxlTWFwW2xvY2FsZV07XG4gIHJldHVybiBtYXBMb2NhbGUgfHwgbG9jYWxlLnNwbGl0KCdfJylbMF07XG59O1xudmFyIHBhcnNlTm9NYXRjaE5vdGljZSA9IGZ1bmN0aW9uIHBhcnNlTm9NYXRjaE5vdGljZSgpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgbm90ZU9uY2UoZmFsc2UsICdOb3QgbWF0Y2ggYW55IGZvcm1hdC4gUGxlYXNlIGhlbHAgdG8gZmlyZSBhIGlzc3VlIGFib3V0IHRoaXMuJyk7XG59O1xudmFyIGdlbmVyYXRlQ29uZmlnID0ge1xuICAvLyBnZXRcbiAgZ2V0Tm93OiBmdW5jdGlvbiBnZXROb3coKSB7XG4gICAgcmV0dXJuIGRheWpzKCk7XG4gIH0sXG4gIGdldEZpeGVkRGF0ZTogZnVuY3Rpb24gZ2V0Rml4ZWREYXRlKHN0cmluZykge1xuICAgIHJldHVybiBkYXlqcyhzdHJpbmcsIFsnWVlZWS1NLUREJywgJ1lZWVktTU0tREQnXSk7XG4gIH0sXG4gIGdldEVuZERhdGU6IGZ1bmN0aW9uIGdldEVuZERhdGUoZGF0ZSkge1xuICAgIHJldHVybiBkYXRlLmVuZE9mKCdtb250aCcpO1xuICB9LFxuICBnZXRXZWVrRGF5OiBmdW5jdGlvbiBnZXRXZWVrRGF5KGRhdGUpIHtcbiAgICB2YXIgY2xvbmUgPSBkYXRlLmxvY2FsZSgnZW4nKTtcbiAgICByZXR1cm4gY2xvbmUud2Vla2RheSgpICsgY2xvbmUubG9jYWxlRGF0YSgpLmZpcnN0RGF5T2ZXZWVrKCk7XG4gIH0sXG4gIGdldFllYXI6IGZ1bmN0aW9uIGdldFllYXIoZGF0ZSkge1xuICAgIHJldHVybiBkYXRlLnllYXIoKTtcbiAgfSxcbiAgZ2V0TW9udGg6IGZ1bmN0aW9uIGdldE1vbnRoKGRhdGUpIHtcbiAgICByZXR1cm4gZGF0ZS5tb250aCgpO1xuICB9LFxuICBnZXREYXRlOiBmdW5jdGlvbiBnZXREYXRlKGRhdGUpIHtcbiAgICByZXR1cm4gZGF0ZS5kYXRlKCk7XG4gIH0sXG4gIGdldEhvdXI6IGZ1bmN0aW9uIGdldEhvdXIoZGF0ZSkge1xuICAgIHJldHVybiBkYXRlLmhvdXIoKTtcbiAgfSxcbiAgZ2V0TWludXRlOiBmdW5jdGlvbiBnZXRNaW51dGUoZGF0ZSkge1xuICAgIHJldHVybiBkYXRlLm1pbnV0ZSgpO1xuICB9LFxuICBnZXRTZWNvbmQ6IGZ1bmN0aW9uIGdldFNlY29uZChkYXRlKSB7XG4gICAgcmV0dXJuIGRhdGUuc2Vjb25kKCk7XG4gIH0sXG4gIC8vIHNldFxuICBhZGRZZWFyOiBmdW5jdGlvbiBhZGRZZWFyKGRhdGUsIGRpZmYpIHtcbiAgICByZXR1cm4gZGF0ZS5hZGQoZGlmZiwgJ3llYXInKTtcbiAgfSxcbiAgYWRkTW9udGg6IGZ1bmN0aW9uIGFkZE1vbnRoKGRhdGUsIGRpZmYpIHtcbiAgICByZXR1cm4gZGF0ZS5hZGQoZGlmZiwgJ21vbnRoJyk7XG4gIH0sXG4gIGFkZERhdGU6IGZ1bmN0aW9uIGFkZERhdGUoZGF0ZSwgZGlmZikge1xuICAgIHJldHVybiBkYXRlLmFkZChkaWZmLCAnZGF5Jyk7XG4gIH0sXG4gIHNldFllYXI6IGZ1bmN0aW9uIHNldFllYXIoZGF0ZSwgeWVhcikge1xuICAgIHJldHVybiBkYXRlLnllYXIoeWVhcik7XG4gIH0sXG4gIHNldE1vbnRoOiBmdW5jdGlvbiBzZXRNb250aChkYXRlLCBtb250aCkge1xuICAgIHJldHVybiBkYXRlLm1vbnRoKG1vbnRoKTtcbiAgfSxcbiAgc2V0RGF0ZTogZnVuY3Rpb24gc2V0RGF0ZShkYXRlLCBudW0pIHtcbiAgICByZXR1cm4gZGF0ZS5kYXRlKG51bSk7XG4gIH0sXG4gIHNldEhvdXI6IGZ1bmN0aW9uIHNldEhvdXIoZGF0ZSwgaG91cikge1xuICAgIHJldHVybiBkYXRlLmhvdXIoaG91cik7XG4gIH0sXG4gIHNldE1pbnV0ZTogZnVuY3Rpb24gc2V0TWludXRlKGRhdGUsIG1pbnV0ZSkge1xuICAgIHJldHVybiBkYXRlLm1pbnV0ZShtaW51dGUpO1xuICB9LFxuICBzZXRTZWNvbmQ6IGZ1bmN0aW9uIHNldFNlY29uZChkYXRlLCBzZWNvbmQpIHtcbiAgICByZXR1cm4gZGF0ZS5zZWNvbmQoc2Vjb25kKTtcbiAgfSxcbiAgLy8gQ29tcGFyZVxuICBpc0FmdGVyOiBmdW5jdGlvbiBpc0FmdGVyKGRhdGUxLCBkYXRlMikge1xuICAgIHJldHVybiBkYXRlMS5pc0FmdGVyKGRhdGUyKTtcbiAgfSxcbiAgaXNWYWxpZGF0ZTogZnVuY3Rpb24gaXNWYWxpZGF0ZShkYXRlKSB7XG4gICAgcmV0dXJuIGRhdGUuaXNWYWxpZCgpO1xuICB9LFxuICBsb2NhbGU6IHtcbiAgICBnZXRXZWVrRmlyc3REYXk6IGZ1bmN0aW9uIGdldFdlZWtGaXJzdERheShsb2NhbGUpIHtcbiAgICAgIHJldHVybiBkYXlqcygpLmxvY2FsZShwYXJzZUxvY2FsZShsb2NhbGUpKS5sb2NhbGVEYXRhKCkuZmlyc3REYXlPZldlZWsoKTtcbiAgICB9LFxuICAgIGdldFdlZWtGaXJzdERhdGU6IGZ1bmN0aW9uIGdldFdlZWtGaXJzdERhdGUobG9jYWxlLCBkYXRlKSB7XG4gICAgICByZXR1cm4gZGF0ZS5sb2NhbGUocGFyc2VMb2NhbGUobG9jYWxlKSkud2Vla2RheSgwKTtcbiAgICB9LFxuICAgIGdldFdlZWs6IGZ1bmN0aW9uIGdldFdlZWsobG9jYWxlLCBkYXRlKSB7XG4gICAgICByZXR1cm4gZGF0ZS5sb2NhbGUocGFyc2VMb2NhbGUobG9jYWxlKSkud2VlaygpO1xuICAgIH0sXG4gICAgZ2V0U2hvcnRXZWVrRGF5czogZnVuY3Rpb24gZ2V0U2hvcnRXZWVrRGF5cyhsb2NhbGUpIHtcbiAgICAgIHJldHVybiBkYXlqcygpLmxvY2FsZShwYXJzZUxvY2FsZShsb2NhbGUpKS5sb2NhbGVEYXRhKCkud2Vla2RheXNNaW4oKTtcbiAgICB9LFxuICAgIGdldFNob3J0TW9udGhzOiBmdW5jdGlvbiBnZXRTaG9ydE1vbnRocyhsb2NhbGUpIHtcbiAgICAgIHJldHVybiBkYXlqcygpLmxvY2FsZShwYXJzZUxvY2FsZShsb2NhbGUpKS5sb2NhbGVEYXRhKCkubW9udGhzU2hvcnQoKTtcbiAgICB9LFxuICAgIGZvcm1hdDogZnVuY3Rpb24gZm9ybWF0KGxvY2FsZSwgZGF0ZSwgX2Zvcm1hdCkge1xuICAgICAgcmV0dXJuIGRhdGUubG9jYWxlKHBhcnNlTG9jYWxlKGxvY2FsZSkpLmZvcm1hdChfZm9ybWF0KTtcbiAgICB9LFxuICAgIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShsb2NhbGUsIHRleHQsIGZvcm1hdHMpIHtcbiAgICAgIHZhciBsb2NhbGVTdHIgPSBwYXJzZUxvY2FsZShsb2NhbGUpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb3JtYXRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSBmb3JtYXRzW2ldO1xuICAgICAgICB2YXIgZm9ybWF0VGV4dCA9IHRleHQ7XG4gICAgICAgIGlmIChmb3JtYXQuaW5jbHVkZXMoJ3dvJykgfHwgZm9ybWF0LmluY2x1ZGVzKCdXbycpKSB7XG4gICAgICAgICAgLy8gcGFyc2UgV29cbiAgICAgICAgICB2YXIgeWVhciA9IGZvcm1hdFRleHQuc3BsaXQoJy0nKVswXTtcbiAgICAgICAgICB2YXIgd2Vla1N0ciA9IGZvcm1hdFRleHQuc3BsaXQoJy0nKVsxXTtcbiAgICAgICAgICB2YXIgZmlyc3RXZWVrID0gZGF5anMoeWVhciwgJ1lZWVknKS5zdGFydE9mKCd5ZWFyJykubG9jYWxlKGxvY2FsZVN0cik7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPD0gNTI7IGogKz0gMSkge1xuICAgICAgICAgICAgdmFyIG5leHRXZWVrID0gZmlyc3RXZWVrLmFkZChqLCAnd2VlaycpO1xuICAgICAgICAgICAgaWYgKG5leHRXZWVrLmZvcm1hdCgnV28nKSA9PT0gd2Vla1N0cikge1xuICAgICAgICAgICAgICByZXR1cm4gbmV4dFdlZWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhcnNlTm9NYXRjaE5vdGljZSgpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkYXRlID0gZGF5anMoZm9ybWF0VGV4dCwgZm9ybWF0KS5sb2NhbGUobG9jYWxlU3RyKTtcbiAgICAgICAgaWYgKGRhdGUuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgIHBhcnNlTm9NYXRjaE5vdGljZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgZ2VuZXJhdGVDb25maWc7IiwiaW1wb3J0IGRheWpzR2VuZXJhdGVDb25maWcgZnJvbSAncmMtcGlja2VyL2VzL2dlbmVyYXRlL2RheWpzJztcbmltcG9ydCBnZW5lcmF0ZVBpY2tlciBmcm9tICdhbnRkL2VzL2RhdGUtcGlja2VyL2dlbmVyYXRlUGlja2VyJztcbmltcG9ydCAnYW50ZC9lcy9kYXRlLXBpY2tlci9zdHlsZS9pbmRleCc7XG52YXIgRGF0ZVBpY2tlciA9IGdlbmVyYXRlUGlja2VyKGRheWpzR2VuZXJhdGVDb25maWcpO1xuZXhwb3J0IGRlZmF1bHQgRGF0ZVBpY2tlcjsiLCJpbXBvcnQgeyBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJztcbmltcG9ydCBxdWFydGVyT2ZZZWFyIGZyb20gJ2RheWpzL3BsdWdpbi9xdWFydGVyT2ZZZWFyJztcbmltcG9ydCB7IGdldEZvcm1hdCwgdHJhbnNmb3JtRGF0ZVZhbHVlIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IERhdGVQaWNrZXIgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9EYXRlUGlja2VyJztcbmltcG9ydCB3aXRoRmllbGRXcmFwIGZyb20gJy4uLy4uL3V0aWxzL3dpdGhGaWVsZFdyYXAnO1xuZGF5anMuZXh0ZW5kKHF1YXJ0ZXJPZlllYXIpO1xudmFyIERhdGVDbXB0ID0gZnVuY3Rpb24gRGF0ZUNtcHQoX2EpIHtcbiAgdmFyIG9uQ2hhbmdlID0gX2Eub25DaGFuZ2UsXG4gICAgZm9ybWF0ID0gX2EuZm9ybWF0LFxuICAgIHZhbHVlID0gX2EudmFsdWUsXG4gICAgc3R5bGUgPSBfYS5zdHlsZSxcbiAgICByZXN0ID0gX19yZXN0KF9hLCBbXCJvbkNoYW5nZVwiLCBcImZvcm1hdFwiLCBcInZhbHVlXCIsIFwic3R5bGVcIl0pO1xuICB2YXIgZGF0ZUZvcm1hdCA9IGdldEZvcm1hdChmb3JtYXQpO1xuICB2YXIgdmFsdWVPYmogPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdHJhbnNmb3JtRGF0ZVZhbHVlKHZhbHVlLCBmb3JtYXQsIGRhdGVGb3JtYXQpO1xuICB9LCBbdmFsdWVdKTtcbiAgdmFyIGhhbmRsZUNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUNoYW5nZShkYXRlVmFsdWUsIGRhdGVTdHJpbmcpIHtcbiAgICB2YXIgbmV3VmFsdWUgPSBkYXRlU3RyaW5nO1xuICAgIGlmIChmb3JtYXQgPT09ICd3ZWVrJyB8fCBmb3JtYXQgPT09ICdxdWFydGVyJykge1xuICAgICAgbmV3VmFsdWUgPSBkYXlqcyhkYXRlVmFsdWUpLmZvcm1hdChkYXRlRm9ybWF0KTtcbiAgICB9XG4gICAgb25DaGFuZ2UobmV3VmFsdWUpO1xuICB9O1xuICB2YXIgZGF0ZVBhcmFtcyA9IHtcbiAgICB2YWx1ZTogdmFsdWVPYmosXG4gICAgc3R5bGU6IE9iamVjdC5hc3NpZ24oe1xuICAgICAgd2lkdGg6ICcxMDAlJ1xuICAgIH0sIHN0eWxlKSxcbiAgICBvbkNoYW5nZTogaGFuZGxlQ2hhbmdlXG4gIH07XG4gIC8vIFRPRE86IGZvcm1hdCDmmK/lnKggb3B0aW9ucyDph4zoh6rlrprkuYnnmoTmg4XlhrXvvIzmmK/lkKbopoHliKTmlq3kuIDkuIvopoHkuI3opoEgc2hvd1RpbWVcbiAgaWYgKGZvcm1hdCA9PT0gJ2RhdGVUaW1lJykge1xuICAgIGRhdGVQYXJhbXMuc2hvd1RpbWUgPSB0cnVlO1xuICB9XG4gIGlmIChbJ3dlZWsnLCAnbW9udGgnLCAncXVhcnRlcicsICd5ZWFyJ10uaW5kZXhPZihmb3JtYXQpID4gLTEpIHtcbiAgICBkYXRlUGFyYW1zLnBpY2tlciA9IGZvcm1hdDtcbiAgfVxuICBpZiAoZGF0ZUZvcm1hdCA9PT0gZm9ybWF0KSB7XG4gICAgZGF0ZVBhcmFtcy5mb3JtYXQgPSBmb3JtYXQ7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERhdGVQaWNrZXIsIE9iamVjdC5hc3NpZ24oe30sIGRhdGVQYXJhbXMsIHJlc3QpKTtcbn07XG5leHBvcnQgZGVmYXVsdCB3aXRoRmllbGRXcmFwKERhdGVDbXB0KTsiLCJpbXBvcnQgeyBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbi8qKlxuICogVXBkYXRlZCBieSBUdzkzIG9uIDIwMTktMTItMDguXG4gKiDml6XljoblpJrpgInnu4Tku7ZcbiAqL1xuaW1wb3J0IFJlYWN0LCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnO1xuaW1wb3J0IHF1YXJ0ZXJPZlllYXIgZnJvbSAnZGF5anMvcGx1Z2luL3F1YXJ0ZXJPZlllYXInO1xuaW1wb3J0IERhdGVQaWNrZXIgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9EYXRlUGlja2VyJztcbmltcG9ydCB7IGdldEZvcm1hdCwgdHJhbnNmb3JtRGF0ZVZhbHVlIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHdpdGhGaWVsZFdyYXAgZnJvbSAnLi4vLi4vdXRpbHMvd2l0aEZpZWxkV3JhcCc7XG5kYXlqcy5leHRlbmQocXVhcnRlck9mWWVhcik7XG52YXIgUmFuZ2VQaWNrZXIgPSBEYXRlUGlja2VyLlJhbmdlUGlja2VyO1xudmFyIERhdGVSYW5nZSA9IGZ1bmN0aW9uIERhdGVSYW5nZShfYSkge1xuICB2YXIgb25DaGFuZ2UgPSBfYS5vbkNoYW5nZSxcbiAgICBmb3JtYXQgPSBfYS5mb3JtYXQsXG4gICAgdmFsdWUgPSBfYS52YWx1ZSxcbiAgICBzdHlsZSA9IF9hLnN0eWxlLFxuICAgIHJlc3QgPSBfX3Jlc3QoX2EsIFtcIm9uQ2hhbmdlXCIsIFwiZm9ybWF0XCIsIFwidmFsdWVcIiwgXCJzdHlsZVwiXSk7XG4gIHZhciBkYXRlRm9ybWF0ID0gZ2V0Rm9ybWF0KGZvcm1hdCk7XG4gIHZhciB2YWx1ZU9iaiA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIHRyYW5zZm9ybURhdGVWYWx1ZShpdGVtLCBmb3JtYXQsIGRhdGVGb3JtYXQpO1xuICAgIH0pO1xuICB9LCBbdmFsdWVdKTtcbiAgdmFyIGhhbmRsZUNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUNoYW5nZSh2YWwsIF9zdHJpbmdMaXN0KSB7XG4gICAgdmFyIHN0cmluZ0xpc3QgPSBfc3RyaW5nTGlzdDtcbiAgICBpZiAoWyd3ZWVrJywgJ3F1YXJ0ZXInXS5pbmNsdWRlcyhmb3JtYXQpKSB7XG4gICAgICBzdHJpbmdMaXN0ID0gKHZhbCB8fCBbXSkubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHJldHVybiBkYXlqcyhpdGVtKS5mb3JtYXQoZGF0ZUZvcm1hdCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdmFyIGlzUGFzcyA9IHN0cmluZ0xpc3QuZXZlcnkoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiAhIWl0ZW07XG4gICAgfSk7XG4gICAgaWYgKCFpc1Bhc3MpIHtcbiAgICAgIHN0cmluZ0xpc3QgPSBudWxsO1xuICAgIH1cbiAgICBvbkNoYW5nZShzdHJpbmdMaXN0KTtcbiAgfTtcbiAgdmFyIGRhdGVQYXJhbXMgPSB7XG4gICAgdmFsdWU6IHZhbHVlT2JqLFxuICAgIHN0eWxlOiBPYmplY3QuYXNzaWduKHtcbiAgICAgIHdpZHRoOiAnMTAwJSdcbiAgICB9LCBzdHlsZSksXG4gICAgb25DaGFuZ2U6IGhhbmRsZUNoYW5nZVxuICB9O1xuICAvLyBUT0RPOiBmb3JtYXTmmK/lnKhvcHRpb25z6YeM6Ieq5a6a5LmJ55qE5oOF5Ya177yM5piv5ZCm6KaB5Yik5pat5LiA5LiL6KaB5LiN6KaBc2hvd1RpbWVcbiAgaWYgKGZvcm1hdCA9PT0gJ2RhdGVUaW1lJykge1xuICAgIGRhdGVQYXJhbXMuc2hvd1RpbWUgPSB0cnVlO1xuICB9XG4gIGlmIChbJ3dlZWsnLCAnbW9udGgnLCAncXVhcnRlcicsICd5ZWFyJ10uaW5kZXhPZihmb3JtYXQpID4gLTEpIHtcbiAgICBkYXRlUGFyYW1zLnBpY2tlciA9IGZvcm1hdDtcbiAgfVxuICBkYXRlUGFyYW1zID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkYXRlUGFyYW1zKSwgcmVzdCk7XG4gIGlmIChkYXRlRm9ybWF0ID09PSBmb3JtYXQpIHtcbiAgICBkYXRlUGFyYW1zLmZvcm1hdCA9IGZvcm1hdDtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmFuZ2VQaWNrZXIsIE9iamVjdC5hc3NpZ24oe30sIGRhdGVQYXJhbXMpKTtcbn07XG5leHBvcnQgZGVmYXVsdCB3aXRoRmllbGRXcmFwKERhdGVSYW5nZSk7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IERhdGVQaWNrZXIgZnJvbSAnLi4vRGF0ZVBpY2tlcic7XG52YXIgVGltZVBpY2tlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEYXRlUGlja2VyLCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHBpY2tlcjogJ3RpbWUnLFxuICAgIG1vZGU6IHVuZGVmaW5lZCxcbiAgICByZWY6IHJlZlxuICB9KSk7XG59KTtcblRpbWVQaWNrZXIuZGlzcGxheU5hbWUgPSAnVGltZVBpY2tlcic7XG5UaW1lUGlja2VyLlJhbmdlUGlja2VyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERhdGVQaWNrZXIuUmFuZ2VQaWNrZXIsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgcGlja2VyOiAndGltZScsXG4gICAgbW9kZTogdW5kZWZpbmVkLFxuICAgIHJlZjogcmVmXG4gIH0pKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgVGltZVBpY2tlcjsiLCJpbXBvcnQgeyBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFRpbWVQaWNrZXIgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9UaW1lUGlja2VyJztcbmltcG9ydCB7IGdldEZvcm1hdCB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB3aXRoRmllbGRXcmFwIGZyb20gJy4uLy4uL3V0aWxzL3dpdGhGaWVsZFdyYXAnO1xudmFyIFRpbWUgPSBmdW5jdGlvbiBUaW1lKF9hKSB7XG4gIHZhciBvbkNoYW5nZSA9IF9hLm9uQ2hhbmdlLFxuICAgIF9hJGZvcm1hdCA9IF9hLmZvcm1hdCxcbiAgICBmb3JtYXQgPSBfYSRmb3JtYXQgPT09IHZvaWQgMCA/ICd0aW1lJyA6IF9hJGZvcm1hdCxcbiAgICB2YWx1ZSA9IF9hLnZhbHVlLFxuICAgIHN0eWxlID0gX2Euc3R5bGUsXG4gICAgcmVzdCA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJmb3JtYXRcIiwgXCJ2YWx1ZVwiLCBcInN0eWxlXCJdKTtcbiAgdmFyIHRpbWVGb3JtYXQgPSBnZXRGb3JtYXQoZm9ybWF0KTtcbiAgdmFyIF92YWx1ZSA9IHZhbHVlID8gZGF5anModmFsdWUsIHRpbWVGb3JtYXQpIDogdW5kZWZpbmVkO1xuICB2YXIgaGFuZGxlQ2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlQ2hhbmdlKF8sIHZhbHVlU3RyKSB7XG4gICAgb25DaGFuZ2UodmFsdWVTdHIpO1xuICB9O1xuICB2YXIgdGltZVBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHZhbHVlOiBfdmFsdWUsXG4gICAgc3R5bGU6IE9iamVjdC5hc3NpZ24oe1xuICAgICAgd2lkdGg6ICcxMDAlJ1xuICAgIH0sIHN0eWxlKSxcbiAgICBvbkNoYW5nZTogaGFuZGxlQ2hhbmdlLFxuICAgIGZvcm1hdDogdGltZUZvcm1hdFxuICB9LCByZXN0KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRpbWVQaWNrZXIsIE9iamVjdC5hc3NpZ24oe30sIHRpbWVQYXJhbXMpKTtcbn07XG5leHBvcnQgZGVmYXVsdCB3aXRoRmllbGRXcmFwKFRpbWUpOyIsImZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpOyB9XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07IHJldHVybiBhcnIyOyB9XG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7IHZhciBfaSA9IG51bGwgPT0gYXJyID8gbnVsbCA6IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiBhcnJbU3ltYm9sLml0ZXJhdG9yXSB8fCBhcnJbXCJAQGl0ZXJhdG9yXCJdOyBpZiAobnVsbCAhPSBfaSkgeyB2YXIgX3MsIF9lLCBfeCwgX3IsIF9hcnIgPSBbXSwgX24gPSAhMCwgX2QgPSAhMTsgdHJ5IHsgaWYgKF94ID0gKF9pID0gX2kuY2FsbChhcnIpKS5uZXh0LCAwID09PSBpKSB7IGlmIChPYmplY3QoX2kpICE9PSBfaSkgcmV0dXJuOyBfbiA9ICExOyB9IGVsc2UgZm9yICg7ICEoX24gPSAoX3MgPSBfeC5jYWxsKF9pKSkuZG9uZSkgJiYgKF9hcnIucHVzaChfcy52YWx1ZSksIF9hcnIubGVuZ3RoICE9PSBpKTsgX24gPSAhMCk7IH0gY2F0Y2ggKGVycikgeyBfZCA9ICEwLCBfZSA9IGVycjsgfSBmaW5hbGx5IHsgdHJ5IHsgaWYgKCFfbiAmJiBudWxsICE9IF9pLnJldHVybiAmJiAoX3IgPSBfaS5yZXR1cm4oKSwgT2JqZWN0KF9yKSAhPT0gX3IpKSByZXR1cm47IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfSB9XG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cbi8qKlxuICogVXBkYXRlZCBieSBUdzkzIG9uIDIwMTktMTItMDguXG4gKiDml6XljoblpJrpgInnu4Tku7ZcbiAqL1xuaW1wb3J0IFRpbWVQaWNrZXIgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9UaW1lUGlja2VyJztcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0Rm9ybWF0IH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xudmFyIFJhbmdlUGlja2VyID0gVGltZVBpY2tlci5SYW5nZVBpY2tlcjtcbnZhciBUaW1lUmFuZ2UgPSBmdW5jdGlvbiBUaW1lUmFuZ2UoX3JlZikge1xuICB2YXIgb25DaGFuZ2UgPSBfcmVmLm9uQ2hhbmdlLFxuICAgIF9yZWYkZm9ybWF0ID0gX3JlZi5mb3JtYXQsXG4gICAgZm9ybWF0ID0gX3JlZiRmb3JtYXQgPT09IHZvaWQgMCA/ICd0aW1lJyA6IF9yZWYkZm9ybWF0LFxuICAgIHZhbHVlID0gX3JlZi52YWx1ZSxcbiAgICBzdHlsZSA9IF9yZWYuc3R5bGUsXG4gICAgc2NoZW1hID0gX3JlZi5zY2hlbWE7XG4gIHZhciBfYSwgX2I7XG4gIHZhciB0aW1lRm9ybWF0ID0gZ2V0Rm9ybWF0KGZvcm1hdCk7XG4gIHZhciBfcmVmMiA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbXSxcbiAgICBfcmVmMyA9IF9zbGljZWRUb0FycmF5KF9yZWYyLCAyKSxcbiAgICBzdGFydCA9IF9yZWYzWzBdLFxuICAgIGVuZCA9IF9yZWYzWzFdO1xuICB2YXIgX3ZhbHVlID0gc3RhcnQgJiYgZW5kID8gW2RheWpzKHN0YXJ0LCAoKF9hID0gc2NoZW1hID09PSBudWxsIHx8IHNjaGVtYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2NoZW1hLnByb3BzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZm9ybWF0KSB8fCB0aW1lRm9ybWF0KSwgZGF5anMoZW5kLCAoKF9iID0gc2NoZW1hID09PSBudWxsIHx8IHNjaGVtYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2NoZW1hLnByb3BzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZm9ybWF0KSB8fCB0aW1lRm9ybWF0KV0gOiBbXTtcbiAgdmFyIGhhbmRsZUNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUNoYW5nZShfLCBzdHJpbmdMaXN0KSB7XG4gICAgdmFyIGVtcHR5TGlzdDEgPSBzdHJpbmdMaXN0WzBdID09PSAnJyB8fCBzdHJpbmdMaXN0WzFdID09PSAnJztcbiAgICB2YXIgZW1wdHlMaXN0MiA9IHN0cmluZ0xpc3RbMF0gPT09IHVuZGVmaW5lZCB8fCBzdHJpbmdMaXN0WzFdID09PSB1bmRlZmluZWQ7XG4gICAgaWYgKGVtcHR5TGlzdDEgfHwgZW1wdHlMaXN0Mikge1xuICAgICAgb25DaGFuZ2UodW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb25DaGFuZ2Uoc3RyaW5nTGlzdCk7XG4gICAgfVxuICB9O1xuICB2YXIgdGltZVBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHN0eWxlOiBPYmplY3QuYXNzaWduKHtcbiAgICAgIHdpZHRoOiAnMTAwJSdcbiAgICB9LCBzdHlsZSksXG4gICAgdmFsdWU6IF92YWx1ZSxcbiAgICBvbkNoYW5nZTogaGFuZGxlQ2hhbmdlXG4gIH0sIHNjaGVtYS5wcm9wcyB8fCB7fSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSYW5nZVBpY2tlciwgT2JqZWN0LmFzc2lnbih7fSwgdGltZVBhcmFtcykpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFRpbWVSYW5nZTsiLCJmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7XG5cbiAgcmV0dXJuIChtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gIH0gOiBmdW5jdGlvbiAob2JqKSB7XG4gICAgcmV0dXJuIG9iaiAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbiAgfSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzKSwgX3R5cGVvZihvYmopO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIF90eXBlb2YgPSByZXF1aXJlKFwiLi90eXBlb2YuanNcIilbXCJkZWZhdWx0XCJdO1xuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKGlucHV0LCBoaW50KSB7XG4gIGlmIChfdHlwZW9mKGlucHV0KSAhPT0gXCJvYmplY3RcIiB8fCBpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIGlucHV0O1xuICB2YXIgcHJpbSA9IGlucHV0W1N5bWJvbC50b1ByaW1pdGl2ZV07XG4gIGlmIChwcmltICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgcmVzID0gcHJpbS5jYWxsKGlucHV0LCBoaW50IHx8IFwiZGVmYXVsdFwiKTtcbiAgICBpZiAoX3R5cGVvZihyZXMpICE9PSBcIm9iamVjdFwiKSByZXR1cm4gcmVzO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTtcbiAgfVxuICByZXR1cm4gKGhpbnQgPT09IFwic3RyaW5nXCIgPyBTdHJpbmcgOiBOdW1iZXIpKGlucHV0KTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX3RvUHJpbWl0aXZlLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIF90eXBlb2YgPSByZXF1aXJlKFwiLi90eXBlb2YuanNcIilbXCJkZWZhdWx0XCJdO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZShcIi4vdG9QcmltaXRpdmUuanNcIik7XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleShhcmcpIHtcbiAgdmFyIGtleSA9IHRvUHJpbWl0aXZlKGFyZywgXCJzdHJpbmdcIik7XG4gIHJldHVybiBfdHlwZW9mKGtleSkgPT09IFwic3ltYm9sXCIgPyBrZXkgOiBTdHJpbmcoa2V5KTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX3RvUHJvcGVydHlLZXksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgdG9Qcm9wZXJ0eUtleSA9IHJlcXVpcmUoXCIuL3RvUHJvcGVydHlLZXkuanNcIik7XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGtleSA9IHRvUHJvcGVydHlLZXkoa2V5KTtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2RlZmluZVByb3BlcnR5LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIi4vZGVmaW5lUHJvcGVydHkuanNcIik7XG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7XG4gICAgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cbiAgcmV0dXJuIGtleXM7XG59XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkMih0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTtcbiAgICBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiB0YXJnZXQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9vYmplY3RTcHJlYWQyLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBQaWN0dXJlT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTkyOCAxNjBIOTZjLTE3LjcgMC0zMiAxNC4zLTMyIDMydjY0MGMwIDE3LjcgMTQuMyAzMiAzMiAzMmg4MzJjMTcuNyAwIDMyLTE0LjMgMzItMzJWMTkyYzAtMTcuNy0xNC4zLTMyLTMyLTMyem0tNDAgNjMySDEzNnYtMzkuOWwxMzguNS0xNjQuMyAxNTAuMSAxNzhMNjU4LjEgNDg5IDg4OCA3NjEuNlY3OTJ6bTAtMTI5LjhMNjY0LjIgMzk2LjhjLTMuMi0zLjgtOS0zLjgtMTIuMiAwTDQyNC42IDY2Ni40bC0xNDQtMTcwLjdjLTMuMi0zLjgtOS0zLjgtMTIuMiAwTDEzNiA2NTIuN1YyMzJoNzUydjQzMC4yek0zMDQgNDU2YTg4IDg4IDAgMTAwLTE3NiA4OCA4OCAwIDAwMCAxNzZ6bTAtMTE2YzE1LjUgMCAyOCAxMi41IDI4IDI4cy0xMi41IDI4LTI4IDI4LTI4LTEyLjUtMjgtMjggMTIuNS0yOCAyOC0yOHpcIiB9IH1dIH0sIFwibmFtZVwiOiBcInBpY3R1cmVcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydHMuZGVmYXVsdCA9IFBpY3R1cmVPdXRsaW5lZDtcbiIsImZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2FycmF5V2l0aEhvbGVzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkge1xuICB2YXIgX2kgPSBudWxsID09IGFyciA/IG51bGwgOiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBTeW1ib2wgJiYgYXJyW1N5bWJvbC5pdGVyYXRvcl0gfHwgYXJyW1wiQEBpdGVyYXRvclwiXTtcbiAgaWYgKG51bGwgIT0gX2kpIHtcbiAgICB2YXIgX3MsXG4gICAgICBfZSxcbiAgICAgIF94LFxuICAgICAgX3IsXG4gICAgICBfYXJyID0gW10sXG4gICAgICBfbiA9ICEwLFxuICAgICAgX2QgPSAhMTtcbiAgICB0cnkge1xuICAgICAgaWYgKF94ID0gKF9pID0gX2kuY2FsbChhcnIpKS5uZXh0LCAwID09PSBpKSB7XG4gICAgICAgIGlmIChPYmplY3QoX2kpICE9PSBfaSkgcmV0dXJuO1xuICAgICAgICBfbiA9ICExO1xuICAgICAgfSBlbHNlIGZvciAoOyAhKF9uID0gKF9zID0gX3guY2FsbChfaSkpLmRvbmUpICYmIChfYXJyLnB1c2goX3MudmFsdWUpLCBfYXJyLmxlbmd0aCAhPT0gaSk7IF9uID0gITApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgX2QgPSAhMCwgX2UgPSBlcnI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghX24gJiYgbnVsbCAhPSBfaVtcInJldHVyblwiXSAmJiAoX3IgPSBfaVtcInJldHVyblwiXSgpLCBPYmplY3QoX3IpICE9PSBfcikpIHJldHVybjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBfYXJyO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9pdGVyYWJsZVRvQXJyYXlMaW1pdCwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07XG4gIHJldHVybiBhcnIyO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlMaWtlVG9BcnJheSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBhcnJheUxpa2VUb0FycmF5ID0gcmVxdWlyZShcIi4vYXJyYXlMaWtlVG9BcnJheS5qc1wiKTtcbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9ub25JdGVyYWJsZVJlc3QsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgYXJyYXlXaXRoSG9sZXMgPSByZXF1aXJlKFwiLi9hcnJheVdpdGhIb2xlcy5qc1wiKTtcbnZhciBpdGVyYWJsZVRvQXJyYXlMaW1pdCA9IHJlcXVpcmUoXCIuL2l0ZXJhYmxlVG9BcnJheUxpbWl0LmpzXCIpO1xudmFyIHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5ID0gcmVxdWlyZShcIi4vdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanNcIik7XG52YXIgbm9uSXRlcmFibGVSZXN0ID0gcmVxdWlyZShcIi4vbm9uSXRlcmFibGVSZXN0LmpzXCIpO1xuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7XG4gIHJldHVybiBhcnJheVdpdGhIb2xlcyhhcnIpIHx8IGl0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBub25JdGVyYWJsZVJlc3QoKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX3NsaWNlZFRvQXJyYXksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICB2YXIgdGFyZ2V0ID0ge307XG4gIHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgdmFyIGtleSwgaTtcbiAgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBrZXkgPSBzb3VyY2VLZXlzW2ldO1xuICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgfVxuICByZXR1cm4gdGFyZ2V0O1xufVxubW9kdWxlLmV4cG9ydHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBvYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlID0gcmVxdWlyZShcIi4vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZS5qc1wiKTtcbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICB2YXIgdGFyZ2V0ID0gb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKTtcbiAgdmFyIGtleSwgaTtcbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgc291cmNlU3ltYm9sS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTtcbiAgICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlO1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldDtcbn1cbm1vZHVsZS5leHBvcnRzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3JlYWN0ID0gcmVxdWlyZShcInJlYWN0XCIpO1xudmFyIEljb25Db250ZXh0ID0gLyojX19QVVJFX18qLygwLCBfcmVhY3QuY3JlYXRlQ29udGV4dCkoe30pO1xudmFyIF9kZWZhdWx0ID0gSWNvbkNvbnRleHQ7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuY2FsbCA9IGNhbGw7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5leHBvcnRzLm5vdGUgPSBub3RlO1xuZXhwb3J0cy5ub3RlT25jZSA9IG5vdGVPbmNlO1xuZXhwb3J0cy5wcmVNZXNzYWdlID0gdm9pZCAwO1xuZXhwb3J0cy5yZXNldFdhcm5lZCA9IHJlc2V0V2FybmVkO1xuZXhwb3J0cy53YXJuaW5nID0gd2FybmluZztcbmV4cG9ydHMud2FybmluZ09uY2UgPSB3YXJuaW5nT25jZTtcbi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbnZhciB3YXJuZWQgPSB7fTtcbnZhciBwcmVXYXJuaW5nRm5zID0gW107XG5cbi8qKlxuICogUHJlIHdhcm5pbmcgZW5hYmxlIHlvdSB0byBwYXJzZSBjb250ZW50IGJlZm9yZSBjb25zb2xlLmVycm9yLlxuICogTW9kaWZ5IHRvIG51bGwgd2lsbCBwcmV2ZW50IHdhcm5pbmcuXG4gKi9cbnZhciBwcmVNZXNzYWdlID0gZnVuY3Rpb24gcHJlTWVzc2FnZShmbikge1xuICBwcmVXYXJuaW5nRm5zLnB1c2goZm4pO1xufTtcbmV4cG9ydHMucHJlTWVzc2FnZSA9IHByZU1lc3NhZ2U7XG5mdW5jdGlvbiB3YXJuaW5nKHZhbGlkLCBtZXNzYWdlKSB7XG4gIC8vIFN1cHBvcnQgdWdsaWZ5XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICF2YWxpZCAmJiBjb25zb2xlICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZmluYWxNZXNzYWdlID0gcHJlV2FybmluZ0Zucy5yZWR1Y2UoZnVuY3Rpb24gKG1zZywgcHJlTWVzc2FnZUZuKSB7XG4gICAgICByZXR1cm4gcHJlTWVzc2FnZUZuKG1zZyAhPT0gbnVsbCAmJiBtc2cgIT09IHZvaWQgMCA/IG1zZyA6ICcnLCAnd2FybmluZycpO1xuICAgIH0sIG1lc3NhZ2UpO1xuICAgIGlmIChmaW5hbE1lc3NhZ2UpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJXYXJuaW5nOiBcIi5jb25jYXQoZmluYWxNZXNzYWdlKSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBub3RlKHZhbGlkLCBtZXNzYWdlKSB7XG4gIC8vIFN1cHBvcnQgdWdsaWZ5XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICF2YWxpZCAmJiBjb25zb2xlICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZmluYWxNZXNzYWdlID0gcHJlV2FybmluZ0Zucy5yZWR1Y2UoZnVuY3Rpb24gKG1zZywgcHJlTWVzc2FnZUZuKSB7XG4gICAgICByZXR1cm4gcHJlTWVzc2FnZUZuKG1zZyAhPT0gbnVsbCAmJiBtc2cgIT09IHZvaWQgMCA/IG1zZyA6ICcnLCAnbm90ZScpO1xuICAgIH0sIG1lc3NhZ2UpO1xuICAgIGlmIChmaW5hbE1lc3NhZ2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIk5vdGU6IFwiLmNvbmNhdChmaW5hbE1lc3NhZ2UpKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc2V0V2FybmVkKCkge1xuICB3YXJuZWQgPSB7fTtcbn1cbmZ1bmN0aW9uIGNhbGwobWV0aG9kLCB2YWxpZCwgbWVzc2FnZSkge1xuICBpZiAoIXZhbGlkICYmICF3YXJuZWRbbWVzc2FnZV0pIHtcbiAgICBtZXRob2QoZmFsc2UsIG1lc3NhZ2UpO1xuICAgIHdhcm5lZFttZXNzYWdlXSA9IHRydWU7XG4gIH1cbn1cbmZ1bmN0aW9uIHdhcm5pbmdPbmNlKHZhbGlkLCBtZXNzYWdlKSB7XG4gIGNhbGwod2FybmluZywgdmFsaWQsIG1lc3NhZ2UpO1xufVxuZnVuY3Rpb24gbm90ZU9uY2UodmFsaWQsIG1lc3NhZ2UpIHtcbiAgY2FsbChub3RlLCB2YWxpZCwgbWVzc2FnZSk7XG59XG53YXJuaW5nT25jZS5wcmVNZXNzYWdlID0gcHJlTWVzc2FnZTtcbndhcm5pbmdPbmNlLnJlc2V0V2FybmVkID0gcmVzZXRXYXJuZWQ7XG53YXJuaW5nT25jZS5ub3RlT25jZSA9IG5vdGVPbmNlO1xudmFyIF9kZWZhdWx0ID0gd2FybmluZ09uY2U7XG4vKiBlc2xpbnQtZW5hYmxlICovXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGNhblVzZURvbTtcbmZ1bmN0aW9uIGNhblVzZURvbSgpIHtcbiAgcmV0dXJuICEhKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBjb250YWlucztcbmZ1bmN0aW9uIGNvbnRhaW5zKHJvb3QsIG4pIHtcbiAgaWYgKCFyb290KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gVXNlIG5hdGl2ZSBpZiBzdXBwb3J0XG4gIGlmIChyb290LmNvbnRhaW5zKSB7XG4gICAgcmV0dXJuIHJvb3QuY29udGFpbnMobik7XG4gIH1cblxuICAvLyBgZG9jdW1lbnQuY29udGFpbnNgIG5vdCBzdXBwb3J0IHdpdGggSUUxMVxuICB2YXIgbm9kZSA9IG47XG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUgPT09IHJvb3QpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIikuZGVmYXVsdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmNsZWFyQ29udGFpbmVyQ2FjaGUgPSBjbGVhckNvbnRhaW5lckNhY2hlO1xuZXhwb3J0cy5pbmplY3RDU1MgPSBpbmplY3RDU1M7XG5leHBvcnRzLnJlbW92ZUNTUyA9IHJlbW92ZUNTUztcbmV4cG9ydHMudXBkYXRlQ1NTID0gdXBkYXRlQ1NTO1xudmFyIF9jYW5Vc2VEb20gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2NhblVzZURvbVwiKSk7XG52YXIgX2NvbnRhaW5zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9jb250YWluc1wiKSk7XG52YXIgQVBQRU5EX09SREVSID0gJ2RhdGEtcmMtb3JkZXInO1xudmFyIE1BUktfS0VZID0gXCJyYy11dGlsLWtleVwiO1xudmFyIGNvbnRhaW5lckNhY2hlID0gbmV3IE1hcCgpO1xuZnVuY3Rpb24gZ2V0TWFyaygpIHtcbiAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LFxuICAgIG1hcmsgPSBfcmVmLm1hcms7XG4gIGlmIChtYXJrKSB7XG4gICAgcmV0dXJuIG1hcmsuc3RhcnRzV2l0aCgnZGF0YS0nKSA/IG1hcmsgOiBcImRhdGEtXCIuY29uY2F0KG1hcmspO1xuICB9XG4gIHJldHVybiBNQVJLX0tFWTtcbn1cbmZ1bmN0aW9uIGdldENvbnRhaW5lcihvcHRpb24pIHtcbiAgaWYgKG9wdGlvbi5hdHRhY2hUbykge1xuICAgIHJldHVybiBvcHRpb24uYXR0YWNoVG87XG4gIH1cbiAgdmFyIGhlYWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoZWFkJyk7XG4gIHJldHVybiBoZWFkIHx8IGRvY3VtZW50LmJvZHk7XG59XG5mdW5jdGlvbiBnZXRPcmRlcihwcmVwZW5kKSB7XG4gIGlmIChwcmVwZW5kID09PSAncXVldWUnKSB7XG4gICAgcmV0dXJuICdwcmVwZW5kUXVldWUnO1xuICB9XG4gIHJldHVybiBwcmVwZW5kID8gJ3ByZXBlbmQnIDogJ2FwcGVuZCc7XG59XG5cbi8qKlxuICogRmluZCBzdHlsZSB3aGljaCBpbmplY3QgYnkgcmMtdXRpbFxuICovXG5mdW5jdGlvbiBmaW5kU3R5bGVzKGNvbnRhaW5lcikge1xuICByZXR1cm4gQXJyYXkuZnJvbSgoY29udGFpbmVyQ2FjaGUuZ2V0KGNvbnRhaW5lcikgfHwgY29udGFpbmVyKS5jaGlsZHJlbikuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUudGFnTmFtZSA9PT0gJ1NUWUxFJztcbiAgfSk7XG59XG5mdW5jdGlvbiBpbmplY3RDU1MoY3NzKSB7XG4gIHZhciBvcHRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICBpZiAoISgwLCBfY2FuVXNlRG9tLmRlZmF1bHQpKCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgY3NwID0gb3B0aW9uLmNzcCxcbiAgICBwcmVwZW5kID0gb3B0aW9uLnByZXBlbmQ7XG4gIHZhciBzdHlsZU5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICBzdHlsZU5vZGUuc2V0QXR0cmlidXRlKEFQUEVORF9PUkRFUiwgZ2V0T3JkZXIocHJlcGVuZCkpO1xuICBpZiAoY3NwICE9PSBudWxsICYmIGNzcCAhPT0gdm9pZCAwICYmIGNzcC5ub25jZSkge1xuICAgIHN0eWxlTm9kZS5ub25jZSA9IGNzcCA9PT0gbnVsbCB8fCBjc3AgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNzcC5ub25jZTtcbiAgfVxuICBzdHlsZU5vZGUuaW5uZXJIVE1MID0gY3NzO1xuICB2YXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKG9wdGlvbik7XG4gIHZhciBmaXJzdENoaWxkID0gY29udGFpbmVyLmZpcnN0Q2hpbGQ7XG4gIGlmIChwcmVwZW5kKSB7XG4gICAgLy8gSWYgaXMgcXVldWUgYHByZXBlbmRgLCBpdCB3aWxsIHByZXBlbmQgZmlyc3Qgc3R5bGUgYW5kIHRoZW4gYXBwZW5kIHJlc3Qgc3R5bGVcbiAgICBpZiAocHJlcGVuZCA9PT0gJ3F1ZXVlJykge1xuICAgICAgdmFyIGV4aXN0U3R5bGUgPSBmaW5kU3R5bGVzKGNvbnRhaW5lcikuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHJldHVybiBbJ3ByZXBlbmQnLCAncHJlcGVuZFF1ZXVlJ10uaW5jbHVkZXMobm9kZS5nZXRBdHRyaWJ1dGUoQVBQRU5EX09SREVSKSk7XG4gICAgICB9KTtcbiAgICAgIGlmIChleGlzdFN0eWxlLmxlbmd0aCkge1xuICAgICAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKHN0eWxlTm9kZSwgZXhpc3RTdHlsZVtleGlzdFN0eWxlLmxlbmd0aCAtIDFdLm5leHRTaWJsaW5nKTtcbiAgICAgICAgcmV0dXJuIHN0eWxlTm9kZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVc2UgYGluc2VydEJlZm9yZWAgYXMgYHByZXBlbmRgXG4gICAgY29udGFpbmVyLmluc2VydEJlZm9yZShzdHlsZU5vZGUsIGZpcnN0Q2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChzdHlsZU5vZGUpO1xuICB9XG4gIHJldHVybiBzdHlsZU5vZGU7XG59XG5mdW5jdGlvbiBmaW5kRXhpc3ROb2RlKGtleSkge1xuICB2YXIgb3B0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgdmFyIGNvbnRhaW5lciA9IGdldENvbnRhaW5lcihvcHRpb24pO1xuICByZXR1cm4gZmluZFN0eWxlcyhjb250YWluZXIpLmZpbmQoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUoZ2V0TWFyayhvcHRpb24pKSA9PT0ga2V5O1xuICB9KTtcbn1cbmZ1bmN0aW9uIHJlbW92ZUNTUyhrZXkpIHtcbiAgdmFyIG9wdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gIHZhciBleGlzdE5vZGUgPSBmaW5kRXhpc3ROb2RlKGtleSwgb3B0aW9uKTtcbiAgaWYgKGV4aXN0Tm9kZSkge1xuICAgIHZhciBjb250YWluZXIgPSBnZXRDb250YWluZXIob3B0aW9uKTtcbiAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQoZXhpc3ROb2RlKTtcbiAgfVxufVxuXG4vKipcbiAqIHFpYW5rdW4gd2lsbCBpbmplY3QgYGFwcGVuZENoaWxkYCB0byBpbnNlcnQgaW50byBvdGhlclxuICovXG5mdW5jdGlvbiBzeW5jUmVhbENvbnRhaW5lcihjb250YWluZXIsIG9wdGlvbikge1xuICB2YXIgY2FjaGVkUmVhbENvbnRhaW5lciA9IGNvbnRhaW5lckNhY2hlLmdldChjb250YWluZXIpO1xuXG4gIC8vIEZpbmQgcmVhbCBjb250YWluZXIgd2hlbiBub3QgY2FjaGVkIG9yIGNhY2hlZCBjb250YWluZXIgcmVtb3ZlZFxuICBpZiAoIWNhY2hlZFJlYWxDb250YWluZXIgfHwgISgwLCBfY29udGFpbnMuZGVmYXVsdCkoZG9jdW1lbnQsIGNhY2hlZFJlYWxDb250YWluZXIpKSB7XG4gICAgdmFyIHBsYWNlaG9sZGVyU3R5bGUgPSBpbmplY3RDU1MoJycsIG9wdGlvbik7XG4gICAgdmFyIHBhcmVudE5vZGUgPSBwbGFjZWhvbGRlclN0eWxlLnBhcmVudE5vZGU7XG4gICAgY29udGFpbmVyQ2FjaGUuc2V0KGNvbnRhaW5lciwgcGFyZW50Tm9kZSk7XG4gICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKHBsYWNlaG9sZGVyU3R5bGUpO1xuICB9XG59XG5cbi8qKlxuICogbWFudWFsbHkgY2xlYXIgY29udGFpbmVyIGNhY2hlIHRvIGF2b2lkIGdsb2JhbCBjYWNoZSBpbiB1bml0IHRlc3Rlc1xuICovXG5mdW5jdGlvbiBjbGVhckNvbnRhaW5lckNhY2hlKCkge1xuICBjb250YWluZXJDYWNoZS5jbGVhcigpO1xufVxuZnVuY3Rpb24gdXBkYXRlQ1NTKGNzcywga2V5KSB7XG4gIHZhciBvcHRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICB2YXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKG9wdGlvbik7XG5cbiAgLy8gU3luYyByZWFsIHBhcmVudFxuICBzeW5jUmVhbENvbnRhaW5lcihjb250YWluZXIsIG9wdGlvbik7XG4gIHZhciBleGlzdE5vZGUgPSBmaW5kRXhpc3ROb2RlKGtleSwgb3B0aW9uKTtcbiAgaWYgKGV4aXN0Tm9kZSkge1xuICAgIHZhciBfb3B0aW9uJGNzcCwgX29wdGlvbiRjc3AyO1xuICAgIGlmICgoX29wdGlvbiRjc3AgPSBvcHRpb24uY3NwKSAhPT0gbnVsbCAmJiBfb3B0aW9uJGNzcCAhPT0gdm9pZCAwICYmIF9vcHRpb24kY3NwLm5vbmNlICYmIGV4aXN0Tm9kZS5ub25jZSAhPT0gKChfb3B0aW9uJGNzcDIgPSBvcHRpb24uY3NwKSA9PT0gbnVsbCB8fCBfb3B0aW9uJGNzcDIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vcHRpb24kY3NwMi5ub25jZSkpIHtcbiAgICAgIHZhciBfb3B0aW9uJGNzcDM7XG4gICAgICBleGlzdE5vZGUubm9uY2UgPSAoX29wdGlvbiRjc3AzID0gb3B0aW9uLmNzcCkgPT09IG51bGwgfHwgX29wdGlvbiRjc3AzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9uJGNzcDMubm9uY2U7XG4gICAgfVxuICAgIGlmIChleGlzdE5vZGUuaW5uZXJIVE1MICE9PSBjc3MpIHtcbiAgICAgIGV4aXN0Tm9kZS5pbm5lckhUTUwgPSBjc3M7XG4gICAgfVxuICAgIHJldHVybiBleGlzdE5vZGU7XG4gIH1cbiAgdmFyIG5ld05vZGUgPSBpbmplY3RDU1MoY3NzLCBvcHRpb24pO1xuICBuZXdOb2RlLnNldEF0dHJpYnV0ZShnZXRNYXJrKG9wdGlvbiksIGtleSk7XG4gIHJldHVybiBuZXdOb2RlO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbnZhciBfdHlwZW9mMyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmdlbmVyYXRlID0gZ2VuZXJhdGU7XG5leHBvcnRzLmdldFNlY29uZGFyeUNvbG9yID0gZ2V0U2Vjb25kYXJ5Q29sb3I7XG5leHBvcnRzLmljb25TdHlsZXMgPSB2b2lkIDA7XG5leHBvcnRzLmlzSWNvbkRlZmluaXRpb24gPSBpc0ljb25EZWZpbml0aW9uO1xuZXhwb3J0cy5ub3JtYWxpemVBdHRycyA9IG5vcm1hbGl6ZUF0dHJzO1xuZXhwb3J0cy5ub3JtYWxpemVUd29Ub25lQ29sb3JzID0gbm9ybWFsaXplVHdvVG9uZUNvbG9ycztcbmV4cG9ydHMudXNlSW5zZXJ0U3R5bGVzID0gZXhwb3J0cy5zdmdCYXNlUHJvcHMgPSB2b2lkIDA7XG5leHBvcnRzLndhcm5pbmcgPSB3YXJuaW5nO1xudmFyIF9vYmplY3RTcHJlYWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RTcHJlYWQyXCIpKTtcbnZhciBfdHlwZW9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpKTtcbnZhciBfY29sb3JzID0gcmVxdWlyZShcIkBhbnQtZGVzaWduL2NvbG9yc1wiKTtcbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIF93YXJuaW5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvd2FybmluZ1wiKSk7XG52YXIgX2R5bmFtaWNDU1MgPSByZXF1aXJlKFwicmMtdXRpbC9saWIvRG9tL2R5bmFtaWNDU1NcIik7XG52YXIgX0NvbnRleHQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2NvbXBvbmVudHMvQ29udGV4dFwiKSk7XG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGVCYWJlbEludGVyb3AgPSBuZXcgV2Vha01hcCgpOyB2YXIgY2FjaGVOb2RlSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7IHJldHVybiAoX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKSB7IHJldHVybiBub2RlSW50ZXJvcCA/IGNhY2hlTm9kZUludGVyb3AgOiBjYWNoZUJhYmVsSW50ZXJvcDsgfSkobm9kZUludGVyb3ApOyB9XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmosIG5vZGVJbnRlcm9wKSB7IGlmICghbm9kZUludGVyb3AgJiYgb2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCBfdHlwZW9mMyhvYmopICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvYmogIT09IFwiZnVuY3Rpb25cIikgeyByZXR1cm4geyBkZWZhdWx0OiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApOyBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsgcmV0dXJuIGNhY2hlLmdldChvYmopOyB9IHZhciBuZXdPYmogPSB7fTsgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChrZXkgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHsgdmFyIGRlc2MgPSBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IG51bGw7IGlmIChkZXNjICYmIChkZXNjLmdldCB8fCBkZXNjLnNldCkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTsgfSBlbHNlIHsgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IH0gbmV3T2JqLmRlZmF1bHQgPSBvYmo7IGlmIChjYWNoZSkgeyBjYWNoZS5zZXQob2JqLCBuZXdPYmopOyB9IHJldHVybiBuZXdPYmo7IH1cbmZ1bmN0aW9uIHdhcm5pbmcodmFsaWQsIG1lc3NhZ2UpIHtcbiAgKDAsIF93YXJuaW5nLmRlZmF1bHQpKHZhbGlkLCBcIltAYW50LWRlc2lnbi9pY29uc10gXCIuY29uY2F0KG1lc3NhZ2UpKTtcbn1cbmZ1bmN0aW9uIGlzSWNvbkRlZmluaXRpb24odGFyZ2V0KSB7XG4gIHJldHVybiAoMCwgX3R5cGVvZjIuZGVmYXVsdCkodGFyZ2V0KSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHRhcmdldC5uYW1lID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgdGFyZ2V0LnRoZW1lID09PSAnc3RyaW5nJyAmJiAoKDAsIF90eXBlb2YyLmRlZmF1bHQpKHRhcmdldC5pY29uKSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHRhcmdldC5pY29uID09PSAnZnVuY3Rpb24nKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUF0dHJzKCkge1xuICB2YXIgYXR0cnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICByZXR1cm4gT2JqZWN0LmtleXMoYXR0cnMpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICB2YXIgdmFsID0gYXR0cnNba2V5XTtcbiAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgICBhY2MuY2xhc3NOYW1lID0gdmFsO1xuICAgICAgICBkZWxldGUgYWNjLmNsYXNzO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGFjY1trZXldID0gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG59XG5mdW5jdGlvbiBnZW5lcmF0ZShub2RlLCBrZXksIHJvb3RQcm9wcykge1xuICBpZiAoIXJvb3RQcm9wcykge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChub2RlLnRhZywgKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHtcbiAgICAgIGtleToga2V5XG4gICAgfSwgbm9ybWFsaXplQXR0cnMobm9kZS5hdHRycykpLCAobm9kZS5jaGlsZHJlbiB8fCBbXSkubWFwKGZ1bmN0aW9uIChjaGlsZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiBnZW5lcmF0ZShjaGlsZCwgXCJcIi5jb25jYXQoa2V5LCBcIi1cIikuY29uY2F0KG5vZGUudGFnLCBcIi1cIikuY29uY2F0KGluZGV4KSk7XG4gICAgfSkpO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChub2RlLnRhZywgKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7XG4gICAga2V5OiBrZXlcbiAgfSwgbm9ybWFsaXplQXR0cnMobm9kZS5hdHRycykpLCByb290UHJvcHMpLCAobm9kZS5jaGlsZHJlbiB8fCBbXSkubWFwKGZ1bmN0aW9uIChjaGlsZCwgaW5kZXgpIHtcbiAgICByZXR1cm4gZ2VuZXJhdGUoY2hpbGQsIFwiXCIuY29uY2F0KGtleSwgXCItXCIpLmNvbmNhdChub2RlLnRhZywgXCItXCIpLmNvbmNhdChpbmRleCkpO1xuICB9KSk7XG59XG5mdW5jdGlvbiBnZXRTZWNvbmRhcnlDb2xvcihwcmltYXJ5Q29sb3IpIHtcbiAgLy8gY2hvb3NlIHRoZSBzZWNvbmQgY29sb3JcbiAgcmV0dXJuICgwLCBfY29sb3JzLmdlbmVyYXRlKShwcmltYXJ5Q29sb3IpWzBdO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplVHdvVG9uZUNvbG9ycyh0d29Ub25lQ29sb3IpIHtcbiAgaWYgKCF0d29Ub25lQ29sb3IpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodHdvVG9uZUNvbG9yKSA/IHR3b1RvbmVDb2xvciA6IFt0d29Ub25lQ29sb3JdO1xufVxuLy8gVGhlc2UgcHJvcHMgbWFrZSBzdXJlIHRoYXQgdGhlIFNWRyBiZWhhdmlvdXJzIGxpa2UgZ2VuZXJhbCB0ZXh0LlxuLy8gUmVmZXJlbmNlOiBodHRwczovL2Jsb2cucHJvdG90eXByLmlvL2FsaWduLXN2Zy1pY29ucy10by10ZXh0LWFuZC1zYXktZ29vZGJ5ZS10by1mb250LWljb25zLWQ0NGIzZDdiMjZiNFxudmFyIHN2Z0Jhc2VQcm9wcyA9IHtcbiAgd2lkdGg6ICcxZW0nLFxuICBoZWlnaHQ6ICcxZW0nLFxuICBmaWxsOiAnY3VycmVudENvbG9yJyxcbiAgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLFxuICBmb2N1c2FibGU6ICdmYWxzZSdcbn07XG5leHBvcnRzLnN2Z0Jhc2VQcm9wcyA9IHN2Z0Jhc2VQcm9wcztcbnZhciBpY29uU3R5bGVzID0gXCJcXG4uYW50aWNvbiB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICBjb2xvcjogaW5oZXJpdDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxpbmUtaGVpZ2h0OiAwO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuICB2ZXJ0aWNhbC1hbGlnbjogLTAuMTI1ZW07XFxuICB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5O1xcbiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XFxuICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlO1xcbn1cXG5cXG4uYW50aWNvbiA+ICoge1xcbiAgbGluZS1oZWlnaHQ6IDE7XFxufVxcblxcbi5hbnRpY29uIHN2ZyB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxufVxcblxcbi5hbnRpY29uOjpiZWZvcmUge1xcbiAgZGlzcGxheTogbm9uZTtcXG59XFxuXFxuLmFudGljb24gLmFudGljb24taWNvbiB7XFxuICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuLmFudGljb25bdGFiaW5kZXhdIHtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuXFxuLmFudGljb24tc3Bpbjo6YmVmb3JlLFxcbi5hbnRpY29uLXNwaW4ge1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgLXdlYmtpdC1hbmltYXRpb246IGxvYWRpbmdDaXJjbGUgMXMgaW5maW5pdGUgbGluZWFyO1xcbiAgYW5pbWF0aW9uOiBsb2FkaW5nQ2lyY2xlIDFzIGluZmluaXRlIGxpbmVhcjtcXG59XFxuXFxuQC13ZWJraXQta2V5ZnJhbWVzIGxvYWRpbmdDaXJjbGUge1xcbiAgMTAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcXG4gIH1cXG59XFxuXFxuQGtleWZyYW1lcyBsb2FkaW5nQ2lyY2xlIHtcXG4gIDEwMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XFxuICB9XFxufVxcblwiO1xuZXhwb3J0cy5pY29uU3R5bGVzID0gaWNvblN0eWxlcztcbnZhciB1c2VJbnNlcnRTdHlsZXMgPSBmdW5jdGlvbiB1c2VJbnNlcnRTdHlsZXMoKSB7XG4gIHZhciBzdHlsZVN0ciA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogaWNvblN0eWxlcztcbiAgdmFyIF91c2VDb250ZXh0ID0gKDAsIF9yZWFjdC51c2VDb250ZXh0KShfQ29udGV4dC5kZWZhdWx0KSxcbiAgICBjc3AgPSBfdXNlQ29udGV4dC5jc3A7XG4gICgwLCBfcmVhY3QudXNlRWZmZWN0KShmdW5jdGlvbiAoKSB7XG4gICAgKDAsIF9keW5hbWljQ1NTLnVwZGF0ZUNTUykoc3R5bGVTdHIsICdAYW50LWRlc2lnbi1pY29ucycsIHtcbiAgICAgIHByZXBlbmQ6IHRydWUsXG4gICAgICBjc3A6IGNzcFxuICAgIH0pO1xuICB9LCBbXSk7XG59O1xuZXhwb3J0cy51c2VJbnNlcnRTdHlsZXMgPSB1c2VJbnNlcnRTdHlsZXM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiKSk7XG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcbnZhciBfZXhjbHVkZWQgPSBbXCJpY29uXCIsIFwiY2xhc3NOYW1lXCIsIFwib25DbGlja1wiLCBcInN0eWxlXCIsIFwicHJpbWFyeUNvbG9yXCIsIFwic2Vjb25kYXJ5Q29sb3JcIl07XG52YXIgdHdvVG9uZUNvbG9yUGFsZXR0ZSA9IHtcbiAgcHJpbWFyeUNvbG9yOiAnIzMzMycsXG4gIHNlY29uZGFyeUNvbG9yOiAnI0U2RTZFNicsXG4gIGNhbGN1bGF0ZWQ6IGZhbHNlXG59O1xuZnVuY3Rpb24gc2V0VHdvVG9uZUNvbG9ycyhfcmVmKSB7XG4gIHZhciBwcmltYXJ5Q29sb3IgPSBfcmVmLnByaW1hcnlDb2xvcixcbiAgICBzZWNvbmRhcnlDb2xvciA9IF9yZWYuc2Vjb25kYXJ5Q29sb3I7XG4gIHR3b1RvbmVDb2xvclBhbGV0dGUucHJpbWFyeUNvbG9yID0gcHJpbWFyeUNvbG9yO1xuICB0d29Ub25lQ29sb3JQYWxldHRlLnNlY29uZGFyeUNvbG9yID0gc2Vjb25kYXJ5Q29sb3IgfHwgKDAsIF91dGlscy5nZXRTZWNvbmRhcnlDb2xvcikocHJpbWFyeUNvbG9yKTtcbiAgdHdvVG9uZUNvbG9yUGFsZXR0ZS5jYWxjdWxhdGVkID0gISFzZWNvbmRhcnlDb2xvcjtcbn1cbmZ1bmN0aW9uIGdldFR3b1RvbmVDb2xvcnMoKSB7XG4gIHJldHVybiAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIHR3b1RvbmVDb2xvclBhbGV0dGUpO1xufVxudmFyIEljb25CYXNlID0gZnVuY3Rpb24gSWNvbkJhc2UocHJvcHMpIHtcbiAgdmFyIGljb24gPSBwcm9wcy5pY29uLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBvbkNsaWNrID0gcHJvcHMub25DbGljayxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIHByaW1hcnlDb2xvciA9IHByb3BzLnByaW1hcnlDb2xvcixcbiAgICBzZWNvbmRhcnlDb2xvciA9IHByb3BzLnNlY29uZGFyeUNvbG9yLFxuICAgIHJlc3RQcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyLmRlZmF1bHQpKHByb3BzLCBfZXhjbHVkZWQpO1xuICB2YXIgY29sb3JzID0gdHdvVG9uZUNvbG9yUGFsZXR0ZTtcbiAgaWYgKHByaW1hcnlDb2xvcikge1xuICAgIGNvbG9ycyA9IHtcbiAgICAgIHByaW1hcnlDb2xvcjogcHJpbWFyeUNvbG9yLFxuICAgICAgc2Vjb25kYXJ5Q29sb3I6IHNlY29uZGFyeUNvbG9yIHx8ICgwLCBfdXRpbHMuZ2V0U2Vjb25kYXJ5Q29sb3IpKHByaW1hcnlDb2xvcilcbiAgICB9O1xuICB9XG4gICgwLCBfdXRpbHMudXNlSW5zZXJ0U3R5bGVzKSgpO1xuICAoMCwgX3V0aWxzLndhcm5pbmcpKCgwLCBfdXRpbHMuaXNJY29uRGVmaW5pdGlvbikoaWNvbiksIFwiaWNvbiBzaG91bGQgYmUgaWNvbiBkZWZpbml0b24sIGJ1dCBnb3QgXCIuY29uY2F0KGljb24pKTtcbiAgaWYgKCEoMCwgX3V0aWxzLmlzSWNvbkRlZmluaXRpb24pKGljb24pKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIHRhcmdldCA9IGljb247XG4gIGlmICh0YXJnZXQgJiYgdHlwZW9mIHRhcmdldC5pY29uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGFyZ2V0ID0gKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgdGFyZ2V0KSwge30sIHtcbiAgICAgIGljb246IHRhcmdldC5pY29uKGNvbG9ycy5wcmltYXJ5Q29sb3IsIGNvbG9ycy5zZWNvbmRhcnlDb2xvcilcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gKDAsIF91dGlscy5nZW5lcmF0ZSkodGFyZ2V0Lmljb24sIFwic3ZnLVwiLmNvbmNhdCh0YXJnZXQubmFtZSksICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgb25DbGljazogb25DbGljayxcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgJ2RhdGEtaWNvbic6IHRhcmdldC5uYW1lLFxuICAgIHdpZHRoOiAnMWVtJyxcbiAgICBoZWlnaHQ6ICcxZW0nLFxuICAgIGZpbGw6ICdjdXJyZW50Q29sb3InLFxuICAgICdhcmlhLWhpZGRlbic6ICd0cnVlJ1xuICB9LCByZXN0UHJvcHMpKTtcbn07XG5JY29uQmFzZS5kaXNwbGF5TmFtZSA9ICdJY29uUmVhY3QnO1xuSWNvbkJhc2UuZ2V0VHdvVG9uZUNvbG9ycyA9IGdldFR3b1RvbmVDb2xvcnM7XG5JY29uQmFzZS5zZXRUd29Ub25lQ29sb3JzID0gc2V0VHdvVG9uZUNvbG9ycztcbnZhciBfZGVmYXVsdCA9IEljb25CYXNlO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZ2V0VHdvVG9uZUNvbG9yID0gZ2V0VHdvVG9uZUNvbG9yO1xuZXhwb3J0cy5zZXRUd29Ub25lQ29sb3IgPSBzZXRUd29Ub25lQ29sb3I7XG52YXIgX3NsaWNlZFRvQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCIpKTtcbnZhciBfSWNvbkJhc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0ljb25CYXNlXCIpKTtcbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5mdW5jdGlvbiBzZXRUd29Ub25lQ29sb3IodHdvVG9uZUNvbG9yKSB7XG4gIHZhciBfbm9ybWFsaXplVHdvVG9uZUNvbG8gPSAoMCwgX3V0aWxzLm5vcm1hbGl6ZVR3b1RvbmVDb2xvcnMpKHR3b1RvbmVDb2xvciksXG4gICAgX25vcm1hbGl6ZVR3b1RvbmVDb2xvMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX25vcm1hbGl6ZVR3b1RvbmVDb2xvLCAyKSxcbiAgICBwcmltYXJ5Q29sb3IgPSBfbm9ybWFsaXplVHdvVG9uZUNvbG8yWzBdLFxuICAgIHNlY29uZGFyeUNvbG9yID0gX25vcm1hbGl6ZVR3b1RvbmVDb2xvMlsxXTtcbiAgcmV0dXJuIF9JY29uQmFzZS5kZWZhdWx0LnNldFR3b1RvbmVDb2xvcnMoe1xuICAgIHByaW1hcnlDb2xvcjogcHJpbWFyeUNvbG9yLFxuICAgIHNlY29uZGFyeUNvbG9yOiBzZWNvbmRhcnlDb2xvclxuICB9KTtcbn1cbmZ1bmN0aW9uIGdldFR3b1RvbmVDb2xvcigpIHtcbiAgdmFyIGNvbG9ycyA9IF9JY29uQmFzZS5kZWZhdWx0LmdldFR3b1RvbmVDb2xvcnMoKTtcbiAgaWYgKCFjb2xvcnMuY2FsY3VsYXRlZCkge1xuICAgIHJldHVybiBjb2xvcnMucHJpbWFyeUNvbG9yO1xuICB9XG4gIHJldHVybiBbY29sb3JzLnByaW1hcnlDb2xvciwgY29sb3JzLnNlY29uZGFyeUNvbG9yXTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG52YXIgX3R5cGVvZiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xudmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheVwiKSk7XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCIpKTtcbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcbnZhciBfQ29udGV4dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29udGV4dFwiKSk7XG52YXIgX0ljb25CYXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9JY29uQmFzZVwiKSk7XG52YXIgX3R3b1RvbmVQcmltYXJ5Q29sb3IgPSByZXF1aXJlKFwiLi90d29Ub25lUHJpbWFyeUNvbG9yXCIpO1xudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcbnZhciBfZXhjbHVkZWQgPSBbXCJjbGFzc05hbWVcIiwgXCJpY29uXCIsIFwic3BpblwiLCBcInJvdGF0ZVwiLCBcInRhYkluZGV4XCIsIFwib25DbGlja1wiLCBcInR3b1RvbmVDb2xvclwiXTtcbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZUJhYmVsSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7IHZhciBjYWNoZU5vZGVJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTsgcmV0dXJuIChfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApIHsgcmV0dXJuIG5vZGVJbnRlcm9wID8gY2FjaGVOb2RlSW50ZXJvcCA6IGNhY2hlQmFiZWxJbnRlcm9wOyB9KShub2RlSW50ZXJvcCk7IH1cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaiwgbm9kZUludGVyb3ApIHsgaWYgKCFub2RlSW50ZXJvcCAmJiBvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBpZiAob2JqID09PSBudWxsIHx8IF90eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIHsgZGVmYXVsdDogb2JqIH07IH0gdmFyIGNhY2hlID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoa2V5ICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09iai5kZWZhdWx0ID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG4vLyBJbml0aWFsIHNldHRpbmdcbi8vIHNob3VsZCBtb3ZlIGl0IHRvIGFudGQgbWFpbiByZXBvP1xuKDAsIF90d29Ub25lUHJpbWFyeUNvbG9yLnNldFR3b1RvbmVDb2xvcikoJyMxODkwZmYnKTtcbnZhciBJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIF9jbGFzc05hbWVzO1xuICB2YXIgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIGljb24gPSBwcm9wcy5pY29uLFxuICAgIHNwaW4gPSBwcm9wcy5zcGluLFxuICAgIHJvdGF0ZSA9IHByb3BzLnJvdGF0ZSxcbiAgICB0YWJJbmRleCA9IHByb3BzLnRhYkluZGV4LFxuICAgIG9uQ2xpY2sgPSBwcm9wcy5vbkNsaWNrLFxuICAgIHR3b1RvbmVDb2xvciA9IHByb3BzLnR3b1RvbmVDb2xvcixcbiAgICByZXN0UHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMi5kZWZhdWx0KShwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChfQ29udGV4dC5kZWZhdWx0KSxcbiAgICBfUmVhY3QkdXNlQ29udGV4dCRwcmUgPSBfUmVhY3QkdXNlQ29udGV4dC5wcmVmaXhDbHMsXG4gICAgcHJlZml4Q2xzID0gX1JlYWN0JHVzZUNvbnRleHQkcHJlID09PSB2b2lkIDAgPyAnYW50aWNvbicgOiBfUmVhY3QkdXNlQ29udGV4dCRwcmUsXG4gICAgcm9vdENsYXNzTmFtZSA9IF9SZWFjdCR1c2VDb250ZXh0LnJvb3RDbGFzc05hbWU7XG4gIHZhciBjbGFzc1N0cmluZyA9ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShyb290Q2xhc3NOYW1lLCBwcmVmaXhDbHMsIChfY2xhc3NOYW1lcyA9IHt9LCAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KShfY2xhc3NOYW1lcywgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1cIikuY29uY2F0KGljb24ubmFtZSksICEhaWNvbi5uYW1lKSwgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkoX2NsYXNzTmFtZXMsIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItc3BpblwiKSwgISFzcGluIHx8IGljb24ubmFtZSA9PT0gJ2xvYWRpbmcnKSwgX2NsYXNzTmFtZXMpLCBjbGFzc05hbWUpO1xuICB2YXIgaWNvblRhYkluZGV4ID0gdGFiSW5kZXg7XG4gIGlmIChpY29uVGFiSW5kZXggPT09IHVuZGVmaW5lZCAmJiBvbkNsaWNrKSB7XG4gICAgaWNvblRhYkluZGV4ID0gLTE7XG4gIH1cbiAgdmFyIHN2Z1N0eWxlID0gcm90YXRlID8ge1xuICAgIG1zVHJhbnNmb3JtOiBcInJvdGF0ZShcIi5jb25jYXQocm90YXRlLCBcImRlZylcIiksXG4gICAgdHJhbnNmb3JtOiBcInJvdGF0ZShcIi5jb25jYXQocm90YXRlLCBcImRlZylcIilcbiAgfSA6IHVuZGVmaW5lZDtcbiAgdmFyIF9ub3JtYWxpemVUd29Ub25lQ29sbyA9ICgwLCBfdXRpbHMubm9ybWFsaXplVHdvVG9uZUNvbG9ycykodHdvVG9uZUNvbG9yKSxcbiAgICBfbm9ybWFsaXplVHdvVG9uZUNvbG8yID0gKDAsIF9zbGljZWRUb0FycmF5Mi5kZWZhdWx0KShfbm9ybWFsaXplVHdvVG9uZUNvbG8sIDIpLFxuICAgIHByaW1hcnlDb2xvciA9IF9ub3JtYWxpemVUd29Ub25lQ29sbzJbMF0sXG4gICAgc2Vjb25kYXJ5Q29sb3IgPSBfbm9ybWFsaXplVHdvVG9uZUNvbG8yWzFdO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe1xuICAgIHJvbGU6IFwiaW1nXCIsXG4gICAgXCJhcmlhLWxhYmVsXCI6IGljb24ubmFtZVxuICB9LCByZXN0UHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIHRhYkluZGV4OiBpY29uVGFiSW5kZXgsXG4gICAgb25DbGljazogb25DbGljayxcbiAgICBjbGFzc05hbWU6IGNsYXNzU3RyaW5nXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfSWNvbkJhc2UuZGVmYXVsdCwge1xuICAgIGljb246IGljb24sXG4gICAgcHJpbWFyeUNvbG9yOiBwcmltYXJ5Q29sb3IsXG4gICAgc2Vjb25kYXJ5Q29sb3I6IHNlY29uZGFyeUNvbG9yLFxuICAgIHN0eWxlOiBzdmdTdHlsZVxuICB9KSk7XG59KTtcbkljb24uZGlzcGxheU5hbWUgPSAnQW50ZEljb24nO1xuSWNvbi5nZXRUd29Ub25lQ29sb3IgPSBfdHdvVG9uZVByaW1hcnlDb2xvci5nZXRUd29Ub25lQ29sb3I7XG5JY29uLnNldFR3b1RvbmVDb2xvciA9IF90d29Ub25lUHJpbWFyeUNvbG9yLnNldFR3b1RvbmVDb2xvcjtcbnZhciBfZGVmYXVsdCA9IEljb247XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG52YXIgX3R5cGVvZiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBfUGljdHVyZU91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vUGljdHVyZU91dGxpbmVkXCIpKTtcbnZhciBfQW50ZEljb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCIpKTtcbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZUJhYmVsSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7IHZhciBjYWNoZU5vZGVJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTsgcmV0dXJuIChfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApIHsgcmV0dXJuIG5vZGVJbnRlcm9wID8gY2FjaGVOb2RlSW50ZXJvcCA6IGNhY2hlQmFiZWxJbnRlcm9wOyB9KShub2RlSW50ZXJvcCk7IH1cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaiwgbm9kZUludGVyb3ApIHsgaWYgKCFub2RlSW50ZXJvcCAmJiBvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBpZiAob2JqID09PSBudWxsIHx8IF90eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIHsgZGVmYXVsdDogb2JqIH07IH0gdmFyIGNhY2hlID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoa2V5ICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09iai5kZWZhdWx0ID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuXG52YXIgUGljdHVyZU91dGxpbmVkID0gZnVuY3Rpb24gUGljdHVyZU91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9BbnRkSWNvbi5kZWZhdWx0LCAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogX1BpY3R1cmVPdXRsaW5lZC5kZWZhdWx0XG4gIH0pKTtcbn07XG5QaWN0dXJlT3V0bGluZWQuZGlzcGxheU5hbWUgPSAnUGljdHVyZU91dGxpbmVkJztcbnZhciBfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKFBpY3R1cmVPdXRsaW5lZCk7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJpbXBvcnQgXCJhbnRkL2VzL2lucHV0L3N0eWxlXCI7XG5pbXBvcnQgX0lucHV0IGZyb20gXCJhbnRkL2VzL2lucHV0XCI7XG5pbXBvcnQgX1BpY3R1cmVPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL1BpY3R1cmVPdXRsaW5lZFwiO1xuaW1wb3J0IFwiYW50ZC9lcy9wb3BvdmVyL3N0eWxlXCI7XG5pbXBvcnQgX1BvcG92ZXIgZnJvbSBcImFudGQvZXMvcG9wb3ZlclwiO1xuaW1wb3J0IFwiYW50ZC9lcy9jb25maWctcHJvdmlkZXIvc3R5bGVcIjtcbmltcG9ydCBfQ29uZmlnUHJvdmlkZXIgZnJvbSBcImFudGQvZXMvY29uZmlnLXByb3ZpZGVyXCI7XG5pbXBvcnQgeyBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdHJhbnNsYXRpb24gfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgd2l0aEZpZWxkV3JhcCBmcm9tICcuLi8uLi91dGlscy93aXRoRmllbGRXcmFwJztcbmltcG9ydCBcIi4vaW5kZXguY3NzXCI7XG52YXIgREVGQVVMVF9JTUcgPSAnaHR0cHM6Ly9pbWcuYWxpY2RuLmNvbS90ZnMvVEIxNHRTaUtoVHBLMVJqU1pGS1hYYTJ3WFhhLTM1NC0zMzAucG5nJztcbnZhciBQcmV2aWV3Tm9kZSA9IGZ1bmN0aW9uIFByZXZpZXdOb2RlKF9yZWYpIHtcbiAgdmFyIHZhbHVlID0gX3JlZi52YWx1ZTtcbiAgdmFyIGNvbmZpZ0N0eCA9IHVzZUNvbnRleHQoX0NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnRleHQpO1xuICB2YXIgdCA9IHRyYW5zbGF0aW9uKGNvbmZpZ0N0eCk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfUG9wb3Zlciwge1xuICAgIGNvbnRlbnQ6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiaW1nXCIsIHtcbiAgICAgIHNyYzogdmFsdWUgfHwgREVGQVVMVF9JTUcsXG4gICAgICBhbHQ6IHQoJ2ltZ19zcmNfZXJyb3InKSxcbiAgICAgIGNsYXNzTmFtZTogJ2ZyLXByZXZpZXctaW1hZ2UnXG4gICAgfSksXG4gICAgY2xhc3NOYW1lOiAnZnItcHJldmlldycsXG4gICAgcGxhY2VtZW50OiAnYm90dG9tJ1xuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfUGljdHVyZU91dGxpbmVkLCBudWxsKSk7XG59O1xudmFyIEltYWdlSW5wdXQgPSBmdW5jdGlvbiBJbWFnZUlucHV0KF9hKSB7XG4gIHZhciB2YWx1ZSA9IF9hLnZhbHVlLFxuICAgIHJlc3QgPSBfX3Jlc3QoX2EsIFtcInZhbHVlXCJdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9JbnB1dCwgT2JqZWN0LmFzc2lnbih7XG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIGFkZG9uQWZ0ZXI6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFByZXZpZXdOb2RlLCB7XG4gICAgICB2YWx1ZTogdmFsdWVcbiAgICB9KVxuICB9LCByZXN0KSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgd2l0aEZpZWxkV3JhcChJbWFnZUlucHV0KTsiLCJpbXBvcnQgXCJhbnRkL2VzL2lucHV0L3N0eWxlXCI7XG5pbXBvcnQgX0lucHV0IGZyb20gXCJhbnRkL2VzL2lucHV0XCI7XG5pbXBvcnQgXCJhbnRkL2VzL2NvbmZpZy1wcm92aWRlci9zdHlsZVwiO1xuaW1wb3J0IF9Db25maWdQcm92aWRlciBmcm9tIFwiYW50ZC9lcy9jb25maWctcHJvdmlkZXJcIjtcbmltcG9ydCB7IF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFJlYWN0LCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBpc1VybCwgdHJhbnNsYXRpb24gfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgd2l0aEZpZWxkV3JhcCBmcm9tICcuLi8uLi91dGlscy93aXRoRmllbGRXcmFwJztcbnZhciBVcmxOb2RlID0gZnVuY3Rpb24gVXJsTm9kZShwcm9wcykge1xuICB2YXIgY29uZmlnQ3R4ID0gdXNlQ29udGV4dChfQ29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCk7XG4gIHZhciB0ID0gdHJhbnNsYXRpb24oY29uZmlnQ3R4KTtcbiAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgX3Byb3BzJGFkZG9uVGV4dCA9IHByb3BzLmFkZG9uVGV4dCxcbiAgICBhZGRvblRleHQgPSBfcHJvcHMkYWRkb25UZXh0ID09PSB2b2lkIDAgPyB0KCd0ZXN0X3NyYycpIDogX3Byb3BzJGFkZG9uVGV4dDtcbiAgdmFyIHVzZVVybCA9IGlzVXJsKHZhbHVlKTtcbiAgaWYgKHVzZVVybCkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImFcIiwge1xuICAgICAgdGFyZ2V0OiBcIl9ibGFua1wiLFxuICAgICAgaHJlZjogdmFsdWVcbiAgICB9LCBhZGRvblRleHQpO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBudWxsLCBhZGRvblRleHQpO1xufTtcbnZhciBVcmxJbnB1dCA9IGZ1bmN0aW9uIFVybElucHV0KF9hKSB7XG4gIHZhciB2YWx1ZSA9IF9hLnZhbHVlLFxuICAgIHByZWZpeCA9IF9hLnByZWZpeCxcbiAgICBzdWZmaXggPSBfYS5zdWZmaXgsXG4gICAgYWRkb25UZXh0ID0gX2EuYWRkb25UZXh0LFxuICAgIG9uQ2hhbmdlID0gX2Eub25DaGFuZ2UsXG4gICAgcmVzdCA9IF9fcmVzdChfYSwgW1widmFsdWVcIiwgXCJwcmVmaXhcIiwgXCJzdWZmaXhcIiwgXCJhZGRvblRleHRcIiwgXCJvbkNoYW5nZVwiXSk7XG4gIHZhciBfdmFsdWUgPSB2YWx1ZSB8fCAnJztcbiAgaWYgKHByZWZpeCkge1xuICAgIF92YWx1ZSA9IF92YWx1ZS5yZXBsYWNlKHByZWZpeCwgJycpO1xuICB9XG4gIGlmIChzdWZmaXgpIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUucmVwbGFjZShzdWZmaXgsICcnKTtcbiAgfVxuICB2YXIgaGFuZGxlQ2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlQ2hhbmdlKGUpIHtcbiAgICB2YXIgX3ZhbHVlID0gZS50YXJnZXQudmFsdWU7XG4gICAgaWYgKCFfdmFsdWUpIHtcbiAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShfdmFsdWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocHJlZml4KSB7XG4gICAgICBfdmFsdWUgPSBwcmVmaXggKyBfdmFsdWU7XG4gICAgfVxuICAgIGlmIChzdWZmaXgpIHtcbiAgICAgIF92YWx1ZSA9IF92YWx1ZSArIHN1ZmZpeDtcbiAgICB9XG4gICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKF92YWx1ZSk7XG4gIH07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfSW5wdXQsIE9iamVjdC5hc3NpZ24oe1xuICAgIHZhbHVlOiBfdmFsdWUsXG4gICAgcHJlZml4OiBwcmVmaXgsXG4gICAgc3VmZml4OiBzdWZmaXgsXG4gICAgb25DaGFuZ2U6IGhhbmRsZUNoYW5nZSxcbiAgICBhZGRvbkFmdGVyOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChVcmxOb2RlLCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBhZGRvblRleHQ6IGFkZG9uVGV4dFxuICAgIH0pXG4gIH0sIHJlc3QpKTtcbn07XG5leHBvcnQgZGVmYXVsdCB3aXRoRmllbGRXcmFwKFVybElucHV0KTsiLCJpbXBvcnQgXCJhbnRkL2VzL2lucHV0LW51bWJlci9zdHlsZVwiO1xuaW1wb3J0IF9JbnB1dE51bWJlciBmcm9tIFwiYW50ZC9lcy9pbnB1dC1udW1iZXJcIjtcbmltcG9ydCBcImFudGQvZXMvc2xpZGVyL3N0eWxlXCI7XG5pbXBvcnQgX1NsaWRlciBmcm9tIFwiYW50ZC9lcy9zbGlkZXJcIjtcbmltcG9ydCB7IF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuLyoqXG4gKiDmu5HliqjovpPlhaXnu4Tku7ZcbiAqL1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB3aXRoRmllbGRXcmFwIGZyb20gJy4uLy4uL3V0aWxzL3dpdGhGaWVsZFdyYXAnO1xuaW1wb3J0IFwiLi9pbmRleC5jc3NcIjtcbnZhciBTbGlkZXJXaXRoTnVtYmVyID0gZnVuY3Rpb24gU2xpZGVyV2l0aE51bWJlcihfYSkge1xuICB2YXIgc2NoZW1hID0gX2Euc2NoZW1hLFxuICAgIHZhbHVlID0gX2EudmFsdWUsXG4gICAgb25DaGFuZ2UgPSBfYS5vbkNoYW5nZSxcbiAgICBoaWRlSW5wdXQgPSBfYS5oaWRlSW5wdXQsXG4gICAgaW5wdXRQcm9wcyA9IF9hLmlucHV0UHJvcHMsXG4gICAgc3R5bGUgPSBfYS5zdHlsZSxcbiAgICByZXN0ID0gX19yZXN0KF9hLCBbXCJzY2hlbWFcIiwgXCJ2YWx1ZVwiLCBcIm9uQ2hhbmdlXCIsIFwiaGlkZUlucHV0XCIsIFwiaW5wdXRQcm9wc1wiLCBcInN0eWxlXCJdKTtcbiAgdmFyIG1heCA9IHNjaGVtYS5tYXgsXG4gICAgbWluID0gc2NoZW1hLm1pbixcbiAgICBzdGVwID0gc2NoZW1hLnN0ZXA7XG4gIHZhciBzZXR0aW5nID0ge307XG4gIGlmIChtYXggfHwgbWF4ID09PSAwKSB7XG4gICAgc2V0dGluZyA9IHtcbiAgICAgIG1heDogbWF4XG4gICAgfTtcbiAgfVxuICBpZiAobWluIHx8IG1pbiA9PT0gMCkge1xuICAgIHNldHRpbmcgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHNldHRpbmcpLCB7XG4gICAgICBtaW46IG1pblxuICAgIH0pO1xuICB9XG4gIGlmIChzdGVwKSB7XG4gICAgc2V0dGluZyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc2V0dGluZyksIHtcbiAgICAgIHN0ZXA6IHN0ZXBcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogJ2ZyLXNsaWRlcicsXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9TbGlkZXIsIE9iamVjdC5hc3NpZ24oe1xuICAgIHN0eWxlOiB7XG4gICAgICBmbGV4R3JvdzogMSxcbiAgICAgIG1hcmdpblJpZ2h0OiBoaWRlSW5wdXQgPyAwIDogMTJcbiAgICB9XG4gIH0sIHNldHRpbmcsIHtcbiAgICBvbkNoYW5nZTogb25DaGFuZ2UsXG4gICAgdmFsdWU6IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyB2YWx1ZSA6IG1pbiB8fCAwXG4gIH0sIHJlc3QpKSwgaGlkZUlucHV0ID8gbnVsbCA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9JbnB1dE51bWJlciwgT2JqZWN0LmFzc2lnbih7fSwgc2V0dGluZywgaW5wdXRQcm9wcywge1xuICAgIHN0eWxlOiB7XG4gICAgICB3aWR0aDogJzkwcHgnXG4gICAgfSxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgb25DaGFuZ2U6IG9uQ2hhbmdlXG4gIH0pKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgd2l0aEZpZWxkV3JhcChTbGlkZXJXaXRoTnVtYmVyLCBbJ2FkZG9ucycsICdkZXBlbmRWYWx1ZXMnXSk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBVcGxvYWRPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNDAwIDMxNy43aDczLjlWNjU2YzAgNC40IDMuNiA4IDggOGg2MGM0LjQgMCA4LTMuNiA4LThWMzE3LjdINjI0YzYuNyAwIDEwLjQtNy43IDYuMy0xMi45TDUxOC4zIDE2M2E4IDggMCAwMC0xMi42IDBsLTExMiAxNDEuN2MtNC4xIDUuMy0uNCAxMyA2LjMgMTN6TTg3OCA2MjZoLTYwYy00LjQgMC04IDMuNi04IDh2MTU0SDIxNFY2MzRjMC00LjQtMy42LTgtOC04aC02MGMtNC40IDAtOCAzLjYtOCA4djE5OGMwIDE3LjcgMTQuMyAzMiAzMiAzMmg2ODRjMTcuNyAwIDMyLTE0LjMgMzItMzJWNjM0YzAtNC40LTMuNi04LTgtOHpcIiB9IH1dIH0sIFwibmFtZVwiOiBcInVwbG9hZFwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0cy5kZWZhdWx0ID0gVXBsb2FkT3V0bGluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG52YXIgX3R5cGVvZiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBfVXBsb2FkT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9VcGxvYWRPdXRsaW5lZFwiKSk7XG52YXIgX0FudGRJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiKSk7XG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGVCYWJlbEludGVyb3AgPSBuZXcgV2Vha01hcCgpOyB2YXIgY2FjaGVOb2RlSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7IHJldHVybiAoX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKSB7IHJldHVybiBub2RlSW50ZXJvcCA/IGNhY2hlTm9kZUludGVyb3AgOiBjYWNoZUJhYmVsSW50ZXJvcDsgfSkobm9kZUludGVyb3ApOyB9XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmosIG5vZGVJbnRlcm9wKSB7IGlmICghbm9kZUludGVyb3AgJiYgb2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCBfdHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IGRlZmF1bHQ6IG9iaiB9OyB9IHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCk7IGlmIChjYWNoZSAmJiBjYWNoZS5oYXMob2JqKSkgeyByZXR1cm4gY2FjaGUuZ2V0KG9iaik7IH0gdmFyIG5ld09iaiA9IHt9OyB2YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKGtleSAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmouZGVmYXVsdCA9IG9iajsgaWYgKGNhY2hlKSB7IGNhY2hlLnNldChvYmosIG5ld09iaik7IH0gcmV0dXJuIG5ld09iajsgfVxuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcblxudmFyIFVwbG9hZE91dGxpbmVkID0gZnVuY3Rpb24gVXBsb2FkT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0FudGRJY29uLmRlZmF1bHQsICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBfVXBsb2FkT3V0bGluZWQuZGVmYXVsdFxuICB9KSk7XG59O1xuVXBsb2FkT3V0bGluZWQuZGlzcGxheU5hbWUgPSAnVXBsb2FkT3V0bGluZWQnO1xudmFyIF9kZWZhdWx0ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoVXBsb2FkT3V0bGluZWQpO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiaW1wb3J0IFwiYW50ZC9lcy9idXR0b24vc3R5bGVcIjtcbmltcG9ydCBfQnV0dG9uIGZyb20gXCJhbnRkL2VzL2J1dHRvblwiO1xuaW1wb3J0IFwiYW50ZC9lcy91cGxvYWQvc3R5bGVcIjtcbmltcG9ydCBfVXBsb2FkIGZyb20gXCJhbnRkL2VzL3VwbG9hZFwiO1xuaW1wb3J0IF9VcGxvYWRPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL1VwbG9hZE91dGxpbmVkXCI7XG5pbXBvcnQgXCJhbnRkL2VzL21lc3NhZ2Uvc3R5bGVcIjtcbmltcG9ydCBfbWVzc2FnZSBmcm9tIFwiYW50ZC9lcy9tZXNzYWdlXCI7XG5pbXBvcnQgXCJhbnRkL2VzL2NvbmZpZy1wcm92aWRlci9zdHlsZVwiO1xuaW1wb3J0IF9Db25maWdQcm92aWRlciBmcm9tIFwiYW50ZC9lcy9jb25maWctcHJvdmlkZXJcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IHRyYW5zbGF0aW9uIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IFwiLi9pbmRleC5jc3NcIjtcbnZhciBGclVwbG9hZCA9IGZ1bmN0aW9uIEZyVXBsb2FkKF9yZWYpIHtcbiAgdmFyIGFjdGlvbiA9IF9yZWYuYWN0aW9uLFxuICAgIHZhbHVlID0gX3JlZi52YWx1ZSxcbiAgICBfb25DaGFuZ2UgPSBfcmVmLm9uQ2hhbmdlLFxuICAgIHVwbG9hZFByb3BzID0gX3JlZi51cGxvYWRQcm9wcyxcbiAgICBidXR0b25Qcm9wcyA9IF9yZWYuYnV0dG9uUHJvcHMsXG4gICAgc2NoZW1hID0gX3JlZi5zY2hlbWE7XG4gIHZhciBjb25maWdDdHggPSB1c2VDb250ZXh0KF9Db25maWdQcm92aWRlci5Db25maWdDb250ZXh0KTtcbiAgdmFyIHQgPSB0cmFuc2xhdGlvbihjb25maWdDdHgpO1xuICB2YXIgcHJvcHMgPSBPYmplY3QuYXNzaWduKHtcbiAgICBuYW1lOiAnZmlsZScsXG4gICAgdHlwZTogJ2ZpbGUnLFxuICAgIGFjdGlvbjogYWN0aW9uLFxuICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShpbmZvKSB7XG4gICAgICBpZiAoaW5mby5maWxlLnN0YXR1cyA9PT0gJ2RvbmUnKSB7XG4gICAgICAgIF9tZXNzYWdlLnN1Y2Nlc3MoXCJcIi5jb25jYXQoaW5mby5maWxlLm5hbWUsIFwiIFwiKS5jb25jYXQodCgndXBsb2FkX3N1Y2Nlc3MnKSkpO1xuICAgICAgICB2YXIgcGF0aCA9IGdldChzY2hlbWEsICdwcm9wcy5wYXRoJywgJycpO1xuICAgICAgICB2YXIgdXJsID0gcGF0aCA/IGdldChpbmZvLmZpbGUucmVzcG9uc2UsIHBhdGgpIDogaW5mby5maWxlLnJlc3BvbnNlLnVybDtcbiAgICAgICAgX29uQ2hhbmdlKHVybCk7XG4gICAgICB9IGVsc2UgaWYgKGluZm8uZmlsZS5zdGF0dXMgPT09ICdlcnJvcicpIHtcbiAgICAgICAgX21lc3NhZ2UuZXJyb3IoXCJcIi5jb25jYXQoaW5mby5maWxlLm5hbWUsIFwiIFwiKS5jb25jYXQodCgndXBsb2FkX2ZhaWwnKSkpO1xuICAgICAgfVxuICAgIH0sXG4gICAgb25SZW1vdmU6IGZ1bmN0aW9uIG9uUmVtb3ZlKCkge1xuICAgICAgX29uQ2hhbmdlKCcnKTtcbiAgICB9XG4gIH0sIHVwbG9hZFByb3BzKTtcbiAgdmFyIGRlZmF1bHRCdG5Qcm9wcyA9IHtcbiAgICBpY29uOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfVXBsb2FkT3V0bGluZWQsIG51bGwpLFxuICAgIGNoaWxkcmVuOiB0KCd1cGxvYWQnKVxuICB9O1xuICB2YXIgYnRuUHJvcHMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRCdG5Qcm9wcyksIGJ1dHRvblByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6ICdmci11cGxvYWQtbW9kJ1xuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfVXBsb2FkLCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIGNsYXNzTmFtZTogJ2ZyLXVwbG9hZC1maWxlJ1xuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0J1dHRvbiwgT2JqZWN0LmFzc2lnbih7fSwgYnRuUHJvcHMpKSksIHZhbHVlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYVwiLCB7XG4gICAgaHJlZjogdmFsdWUsXG4gICAgdGFyZ2V0OiAnX2JsYW5rJyxcbiAgICByZWw6ICdub29wZW5lciBub3JlZmVycmVyJyxcbiAgICBjbGFzc05hbWU6ICdmci11cGxvYWQtcHJldmlldydcbiAgfSwgdCgndXBsb2FkZWRfYWRkcmVzcycpKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgRnJVcGxvYWQ7IiwiaW1wb3J0IFwiYW50ZC9lcy9pbWFnZS9zdHlsZVwiO1xuaW1wb3J0IF9JbWFnZSBmcm9tIFwiYW50ZC9lcy9pbWFnZVwiO1xuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfSwgX3R5cGVvZihvYmopOyB9XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaHRtbChfcmVmKSB7XG4gIHZhciB2YWx1ZSA9IF9yZWYudmFsdWUsXG4gICAgb3B0aW9ucyA9IF9yZWYub3B0aW9ucyxcbiAgICBfcmVmJHNjaGVtYSA9IF9yZWYuc2NoZW1hLFxuICAgIHNjaGVtYSA9IF9yZWYkc2NoZW1hID09PSB2b2lkIDAgPyB7fSA6IF9yZWYkc2NoZW1hO1xuICB2YXIgX19odG1sID0gJy0nO1xuICBpZiAoc2NoZW1hLnR5cGUgPT09ICdib29sZWFuJykge1xuICAgIF9faHRtbCA9IHZhbHVlID09PSB0cnVlID8gJ+KclCcgOiAn4pyYJztcbiAgfSBlbHNlIGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmxlbmd0aCkgPiAwKSB7XG4gICAgaWYgKFsnc3RyaW5nJywgJ251bWJlciddLmluZGV4T2YoX3R5cGVvZih2YWx1ZSkpID4gLTEpIHtcbiAgICAgIHZhciBpdGVtID0gb3B0aW9ucy5maW5kKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHJldHVybiBpdGVtLnZhbHVlID09PSB2YWx1ZTtcbiAgICAgIH0pO1xuICAgICAgX19odG1sID0gKGl0ZW0gPT09IG51bGwgfHwgaXRlbSA9PT0gdm9pZCAwID8gdm9pZCAwIDogaXRlbS5sYWJlbCkgfHwgJy0nO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHZhciBpZHhTdHIgPSAnLSc7XG4gICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIHZhciBpdGVtID0gb3B0aW9ucy5maW5kKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWUgPT09IHY7XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgbmFtZSA9IGl0ZW0ubGFiZWw7XG4gICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgaWR4U3RyICs9ICcsJyArIG5hbWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgX19odG1sID0gaWR4U3RyLnJlcGxhY2UoJy0sJywgJycpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgX19odG1sID0gU3RyaW5nKHZhbHVlKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgX19odG1sID0gdmFsdWU7XG4gIH0gZWxzZSBpZiAoc2NoZW1hLnR5cGUgPT09ICdyYW5nZScgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWVbMF0gJiYgdmFsdWVbMV0pIHtcbiAgICBfX2h0bWwgPSBcIlwiLmNvbmNhdCh2YWx1ZVswXSwgXCIgLSBcIikuY29uY2F0KHZhbHVlWzFdKTtcbiAgfSBlbHNlIGlmICh2YWx1ZSAmJiBbJ251bWJlcicsICdzdHJpbmcnXS5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHtcbiAgICBfX2h0bWwgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gIH1cbiAgaWYgKHNjaGVtYS5mb3JtYXQgPT09ICdpbWFnZScpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0ltYWdlLCBfZXh0ZW5kcyh7XG4gICAgICBoZWlnaHQ6IDU2LFxuICAgICAgc3JjOiB2YWx1ZVxuICAgIH0sIHNjaGVtYS5pbWFnZVByb3BzKSk7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xuICAgICAgX19odG1sOiBfX2h0bWxcbiAgICB9XG4gIH0pO1xufSIsImltcG9ydCBcImFudGQvZXMvc2xpZGVyL3N0eWxlXCI7XG5pbXBvcnQgX1NsaWRlciBmcm9tIFwiYW50ZC9lcy9zbGlkZXJcIjtcbmltcG9ydCBcImFudGQvZXMvaW5wdXQtbnVtYmVyL3N0eWxlXCI7XG5pbXBvcnQgX0lucHV0TnVtYmVyIGZyb20gXCJhbnRkL2VzL2lucHV0LW51bWJlclwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIFBlcmNlbnRTbGlkZXIgPSBmdW5jdGlvbiBQZXJjZW50U2xpZGVyKHApIHtcbiAgdmFyIF9wJHNjaGVtYSA9IHAuc2NoZW1hLFxuICAgIG1heCA9IF9wJHNjaGVtYS5tYXgsXG4gICAgbWluID0gX3Akc2NoZW1hLm1pbixcbiAgICBzdGVwID0gX3Akc2NoZW1hLnN0ZXA7XG4gIHZhciBzZXR0aW5nID0ge307XG4gIGlmIChtYXggfHwgbWF4ID09PSAwKSB7XG4gICAgc2V0dGluZyA9IHtcbiAgICAgIG1heDogbWF4XG4gICAgfTtcbiAgfVxuICBpZiAobWluIHx8IG1pbiA9PT0gMCkge1xuICAgIHNldHRpbmcgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHNldHRpbmcpLCB7XG4gICAgICBtaW46IG1pblxuICAgIH0pO1xuICB9XG4gIGlmIChzdGVwKSB7XG4gICAgc2V0dGluZyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc2V0dGluZyksIHtcbiAgICAgIHN0ZXA6IHN0ZXBcbiAgICB9KTtcbiAgfVxuICB2YXIgaGlkZU51bWJlciA9IGZhbHNlO1xuICBpZiAocC5vcHRpb25zICYmIHAub3B0aW9ucy5oaWRlTnVtYmVyKSB7XG4gICAgaGlkZU51bWJlciA9IHRydWU7XG4gIH1cbiAgdmFyIGlzUGVyY2VudCA9IGZ1bmN0aW9uIGlzUGVyY2VudChzdHJpbmcpIHtcbiAgICByZXR1cm4gdHlwZW9mIHN0cmluZyA9PT0gJ3N0cmluZycgJiYgc3RyaW5nLmVuZHNXaXRoKCclJyk7XG4gIH07XG4gIHZhciBudW1iZXJWYWx1ZSA9IDEwMDtcbiAgaWYgKGlzUGVyY2VudChwLnZhbHVlKSkge1xuICAgIHRyeSB7XG4gICAgICBudW1iZXJWYWx1ZSA9IE51bWJlcihwLnZhbHVlLnNwbGl0KCclJylbMF0pO1xuICAgICAgaWYgKE51bWJlci5pc05hTihudW1iZXJWYWx1ZSkpIG51bWJlclZhbHVlID0gMTAwO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxuICB9XG4gIHZhciBoYW5kbGVDaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVDaGFuZ2UobmV3TnVtYmVyKSB7XG4gICAgdmFyIGEgPSBuZXdOdW1iZXIgKyAnJSc7XG4gICAgcC5vbkNoYW5nZShhKTtcbiAgfTtcbiAgdmFyIHJlbmRlck51bWJlciA9IHAucmVhZG9ubHkgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIHN0eWxlOiB7XG4gICAgICB3aWR0aDogJzgwcHgnXG4gICAgfVxuICB9LCBwLnZhbHVlID09PSAodW5kZWZpbmVkIHx8ICcnKSA/ICctJyA6IHAudmFsdWUgKyAnJScpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0lucHV0TnVtYmVyLCBPYmplY3QuYXNzaWduKHt9LCBwLm9wdGlvbnMsIHNldHRpbmcsIHtcbiAgICBzdHlsZToge1xuICAgICAgd2lkdGg6ICc4MHB4J1xuICAgIH0sXG4gICAgdmFsdWU6IG51bWJlclZhbHVlLFxuICAgIGRpc2FibGVkOiBwLmRpc2FibGVkLFxuICAgIG9uQ2hhbmdlOiBoYW5kbGVDaGFuZ2UsXG4gICAgZm9ybWF0dGVyOiBmdW5jdGlvbiBmb3JtYXR0ZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiBcIlwiLmNvbmNhdCh2YWx1ZSwgXCIlXCIpO1xuICAgIH0sXG4gICAgcGFyc2VyOiBmdW5jdGlvbiBwYXJzZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiBOdW1iZXIodmFsdWUucmVwbGFjZSgnJScsICcnKSk7XG4gICAgfVxuICB9KSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImZyLXNsaWRlclwiXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9TbGlkZXIsIE9iamVjdC5hc3NpZ24oe1xuICAgIHN0eWxlOiB7XG4gICAgICBmbGV4R3JvdzogMSxcbiAgICAgIG1hcmdpblJpZ2h0OiBoaWRlTnVtYmVyID8gMCA6IDEyXG4gICAgfVxuICB9LCBzZXR0aW5nLCB7XG4gICAgb25DaGFuZ2U6IGhhbmRsZUNoYW5nZSxcbiAgICBtYXg6IDEwMCxcbiAgICB0b29sdGlwOiB7XG4gICAgICBmb3JtYXR0ZXI6IGZ1bmN0aW9uIGZvcm1hdHRlcih2KSB7XG4gICAgICAgIHJldHVybiB2ICsgJyUnO1xuICAgICAgfVxuICAgIH0sXG4gICAgdmFsdWU6IG51bWJlclZhbHVlIHx8IDEwMCxcbiAgICBkaXNhYmxlZDogcC5kaXNhYmxlZCB8fCBwLnJlYWRvbmx5XG4gIH0pKSwgaGlkZU51bWJlciA/IG51bGwgOiByZW5kZXJOdW1iZXIpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFBlcmNlbnRTbGlkZXI7IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFwiLi9pbmRleC5jc3NcIjtcbnZhciBQYW5lbFZpZXcgPSBmdW5jdGlvbiBQYW5lbFZpZXcoX3JlZikge1xuICB2YXIgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuLFxuICAgIGJvcmRlcmVkID0gX3JlZi5ib3JkZXJlZDtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoJ2ZyLXBhbmVsJywge1xuICAgICAgJ2ZyLXBhbmVsLWJvcmRlcmVkJzogYm9yZGVyZWRcbiAgICB9KVxuICB9LCBjaGlsZHJlbik7XG59O1xuZXhwb3J0IGRlZmF1bHQgUGFuZWxWaWV3OyIsImltcG9ydCBcImFudGQvZXMvY2FyZC9zdHlsZVwiO1xuaW1wb3J0IF9DYXJkIGZyb20gXCJhbnRkL2VzL2NhcmRcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQm94UGFuZWwgZnJvbSAnLi4vY29tcG9uZW50cy9QYW5lbFZpZXcnO1xuaW1wb3J0IFwiLi9pbmRleC5jc3NcIjtcbnZhciBCb3hDYXJkID0gZnVuY3Rpb24gQm94Q2FyZChfcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgdGl0bGUgPSBfcmVmLnRpdGxlLFxuICAgIGRlc2NyaXB0aW9uID0gX3JlZi5kZXNjcmlwdGlvbjtcbiAgaWYgKCF0aXRsZSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChCb3hQYW5lbCwgbnVsbCwgY2hpbGRyZW4pO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfQ2FyZCwge1xuICAgIGNsYXNzTmFtZTogJ2ZyLW9iai1jYXJkJyxcbiAgICB0aXRsZTogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIHRpdGxlLCBkZXNjcmlwdGlvbiAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiAnZnItaGVhZGVyLWRlc2MgJ1xuICAgIH0sIGRlc2NyaXB0aW9uKSlcbiAgfSwgY2hpbGRyZW4pO1xufTtcbmV4cG9ydCBkZWZhdWx0IEJveENhcmQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBEb3duT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTg4NCAyNTZoLTc1Yy01LjEgMC05LjkgMi41LTEyLjkgNi42TDUxMiA2NTQuMiAyMjcuOSAyNjIuNmMtMy00LjEtNy44LTYuNi0xMi45LTYuNmgtNzVjLTYuNSAwLTEwLjMgNy40LTYuNSAxMi43bDM1Mi42IDQ4Ni4xYzEyLjggMTcuNiAzOSAxNy42IDUxLjcgMGwzNTIuNi00ODYuMWMzLjktNS4zLjEtMTIuNy02LjQtMTIuN3pcIiB9IH1dIH0sIFwibmFtZVwiOiBcImRvd25cIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydHMuZGVmYXVsdCA9IERvd25PdXRsaW5lZDtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbnZhciBfdHlwZW9mID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIF9Eb3duT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9Eb3duT3V0bGluZWRcIikpO1xudmFyIF9BbnRkSWNvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NvbXBvbmVudHMvQW50ZEljb25cIikpO1xuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKSB7IGlmICh0eXBlb2YgV2Vha01hcCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gbnVsbDsgdmFyIGNhY2hlQmFiZWxJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTsgdmFyIGNhY2hlTm9kZUludGVyb3AgPSBuZXcgV2Vha01hcCgpOyByZXR1cm4gKF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCkgeyByZXR1cm4gbm9kZUludGVyb3AgPyBjYWNoZU5vZGVJbnRlcm9wIDogY2FjaGVCYWJlbEludGVyb3A7IH0pKG5vZGVJbnRlcm9wKTsgfVxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqLCBub2RlSW50ZXJvcCkgeyBpZiAoIW5vZGVJbnRlcm9wICYmIG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGlmIChvYmogPT09IG51bGwgfHwgX3R5cGVvZihvYmopICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvYmogIT09IFwiZnVuY3Rpb25cIikgeyByZXR1cm4geyBkZWZhdWx0OiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApOyBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsgcmV0dXJuIGNhY2hlLmdldChvYmopOyB9IHZhciBuZXdPYmogPSB7fTsgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChrZXkgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHsgdmFyIGRlc2MgPSBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IG51bGw7IGlmIChkZXNjICYmIChkZXNjLmdldCB8fCBkZXNjLnNldCkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTsgfSBlbHNlIHsgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IH0gbmV3T2JqLmRlZmF1bHQgPSBvYmo7IGlmIChjYWNoZSkgeyBjYWNoZS5zZXQob2JqLCBuZXdPYmopOyB9IHJldHVybiBuZXdPYmo7IH1cbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5cbnZhciBEb3duT3V0bGluZWQgPSBmdW5jdGlvbiBEb3duT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0FudGRJY29uLmRlZmF1bHQsICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBfRG93bk91dGxpbmVkLmRlZmF1bHRcbiAgfSkpO1xufTtcbkRvd25PdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdEb3duT3V0bGluZWQnO1xudmFyIF9kZWZhdWx0ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoRG93bk91dGxpbmVkKTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsImltcG9ydCBfRG93bk91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9saWIvaWNvbnMvRG93bk91dGxpbmVkXCI7XG5pbXBvcnQgXCJhbnRkL2VzL2NvbGxhcHNlL3N0eWxlXCI7XG5pbXBvcnQgX0NvbGxhcHNlIGZyb20gXCJhbnRkL2VzL2NvbGxhcHNlXCI7XG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfVxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldOyByZXR1cm4gYXJyMjsgfVxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgeyB2YXIgX2kgPSBudWxsID09IGFyciA/IG51bGwgOiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBTeW1ib2wgJiYgYXJyW1N5bWJvbC5pdGVyYXRvcl0gfHwgYXJyW1wiQEBpdGVyYXRvclwiXTsgaWYgKG51bGwgIT0gX2kpIHsgdmFyIF9zLCBfZSwgX3gsIF9yLCBfYXJyID0gW10sIF9uID0gITAsIF9kID0gITE7IHRyeSB7IGlmIChfeCA9IChfaSA9IF9pLmNhbGwoYXJyKSkubmV4dCwgMCA9PT0gaSkgeyBpZiAoT2JqZWN0KF9pKSAhPT0gX2kpIHJldHVybjsgX24gPSAhMTsgfSBlbHNlIGZvciAoOyAhKF9uID0gKF9zID0gX3guY2FsbChfaSkpLmRvbmUpICYmIChfYXJyLnB1c2goX3MudmFsdWUpLCBfYXJyLmxlbmd0aCAhPT0gaSk7IF9uID0gITApOyB9IGNhdGNoIChlcnIpIHsgX2QgPSAhMCwgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgbnVsbCAhPSBfaS5yZXR1cm4gJiYgKF9yID0gX2kucmV0dXJuKCksIE9iamVjdChfcikgIT09IF9yKSkgcmV0dXJuOyB9IGZpbmFsbHkgeyBpZiAoX2QpIHRocm93IF9lOyB9IH0gcmV0dXJuIF9hcnI7IH0gfVxuZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyOyB9XG5pbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgXCIuL2luZGV4LmNzc1wiO1xuaW1wb3J0IEJveFBhbmVsIGZyb20gJy4uL2NvbXBvbmVudHMvUGFuZWxWaWV3JztcbnZhciBQYW5lbCA9IF9Db2xsYXBzZS5QYW5lbDtcbi8qKlxuICog5oqY5Y+g6Z2i5p2/XG4gKi9cbnZhciBCb3hDb2xsYXBzZSA9IGZ1bmN0aW9uIEJveENvbGxhcHNlKHByb3BzKSB7XG4gIHZhciBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgdGl0bGUgPSBwcm9wcy50aXRsZSxcbiAgICBkZXNjcmlwdGlvbiA9IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgIF9wcm9wcyRjb2xsYXBzZWQgPSBwcm9wcy5jb2xsYXBzZWQsXG4gICAgY29sbGFwc2VkID0gX3Byb3BzJGNvbGxhcHNlZCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRjb2xsYXBzZWQsXG4gICAgZGlzcGxheVR5cGUgPSBwcm9wcy5kaXNwbGF5VHlwZSxcbiAgICBfcHJvcHMkYm9yZGVyZWQgPSBwcm9wcy5ib3JkZXJlZCxcbiAgICBib3JkZXJlZCA9IF9wcm9wcyRib3JkZXJlZCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkYm9yZGVyZWQsXG4gICAgX3Byb3BzJGdob3N0ID0gcHJvcHMuZ2hvc3QsXG4gICAgZ2hvc3QgPSBfcHJvcHMkZ2hvc3QgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkZ2hvc3Q7XG4gIGlmICghdGl0bGUpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQm94UGFuZWwsIHtcbiAgICAgIGJvcmRlcmVkOiBkaXNwbGF5VHlwZSAhPT0gJ2lubGluZSdcbiAgICB9LCBjaGlsZHJlbik7XG4gIH1cbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKGNvbGxhcHNlZCA/ICdzaW5nbGUnIDogJycpLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIGFjdGl2ZUtleSA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0QWN0aXZlS2V5ID0gX3VzZVN0YXRlMlsxXTtcbiAgdmFyIGNvbGxhcHNlSGVhZGVyID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIHRpdGxlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6ICdjb2xsYXBzZS10aXRsZSdcbiAgfSwgdGl0bGUpLCBkZXNjcmlwdGlvbiAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIGNsYXNzTmFtZTogJ2ZyLWhlYWRlci1kZXNjICdcbiAgfSwgZGVzY3JpcHRpb24pKTtcbiAgdmFyIHJlbmRlckV4cGFuZEljb24gPSBmdW5jdGlvbiByZW5kZXJFeHBhbmRJY29uKF9yZWYpIHtcbiAgICB2YXIgaXNBY3RpdmUgPSBfcmVmLmlzQWN0aXZlO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6ICdleHBhbmQtaWNvbi1ib3gnXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0Rvd25PdXRsaW5lZCwge1xuICAgICAgcm90YXRlOiBpc0FjdGl2ZSA/IDAgOiAtOTAsXG4gICAgICBzdHlsZToge1xuICAgICAgICBmb250U2l6ZTogJzE2cHgnXG4gICAgICB9XG4gICAgfSkpO1xuICB9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0NvbGxhcHNlLCB7XG4gICAgY2xhc3NOYW1lOiAnZnItb2JqLWNvbGxhcHNlJyxcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgYm9yZGVyZWQ6IGJvcmRlcmVkLFxuICAgIGdob3N0OiBnaG9zdCxcbiAgICBhY3RpdmVLZXk6IFthY3RpdmVLZXldLFxuICAgIGV4cGFuZEljb246IHJlbmRlckV4cGFuZEljb24sXG4gICAgb25DaGFuZ2U6IGZ1bmN0aW9uIG9uQ2hhbmdlKCkge1xuICAgICAgcmV0dXJuIHNldEFjdGl2ZUtleShhY3RpdmVLZXkgPyAnJyA6ICdzaW5nbGUnKTtcbiAgICB9XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBhbmVsLCB7XG4gICAga2V5OiAnc2luZ2xlJyxcbiAgICBoZWFkZXI6IGNvbGxhcHNlSGVhZGVyLFxuICAgIGZvcmNlUmVuZGVyOiB0cnVlXG4gIH0sIGNoaWxkcmVuKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgQm94Q29sbGFwc2U7IiwiaW1wb3J0IFwiYW50ZC9lcy9mb3JtL3N0eWxlXCI7XG5pbXBvcnQgX0Zvcm0gZnJvbSBcImFudGQvZXMvZm9ybVwiO1xuaW1wb3J0IHsgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgXCIuL2luZGV4LmNzc1wiO1xudmFyIEJveFN1YklubGluZSA9IGZ1bmN0aW9uIEJveFN1YklubGluZShwcm9wcykge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICB0aXRsZSA9IHByb3BzLnRpdGxlLFxuICAgIF9wcm9wcyRoYXNCYWNrZ3JvdW5kID0gcHJvcHMuaGFzQmFja2dyb3VuZCxcbiAgICBoYXNCYWNrZ3JvdW5kID0gX3Byb3BzJGhhc0JhY2tncm91bmQgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkaGFzQmFja2dyb3VuZCxcbiAgICBkZXNjcmlwdGlvbiA9IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgIHRvb2x0aXAgPSBwcm9wcy50b29sdGlwLFxuICAgIGZpZWxkQ29sID0gcHJvcHMuZmllbGRDb2wsXG4gICAgbGFiZWxDb2wgPSBwcm9wcy5sYWJlbENvbCxcbiAgICBsYWJlbFdpZHRoID0gcHJvcHMubGFiZWxXaWR0aCxcbiAgICBkaXNwbGF5VHlwZSA9IHByb3BzLmRpc3BsYXlUeXBlLFxuICAgIHJlc3QgPSBfX3Jlc3QocHJvcHMsIFtcImNoaWxkcmVuXCIsIFwidGl0bGVcIiwgXCJoYXNCYWNrZ3JvdW5kXCIsIFwiZGVzY3JpcHRpb25cIiwgXCJ0b29sdGlwXCIsIFwiZmllbGRDb2xcIiwgXCJsYWJlbENvbFwiLCBcImxhYmVsV2lkdGhcIiwgXCJkaXNwbGF5VHlwZVwiXSk7XG4gIHZhciBfdG9vbHRpcCA9IG51bGw7XG4gIHZhciBfbGFiZWxDb2wgPSB7XG4gICAgc3BhbjogM1xuICB9O1xuICB2YXIgX2ZpZWxkQ29sID0ge1xuICAgIGZsZXg6IDFcbiAgfTtcbiAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgX3Rvb2x0aXAgPSB7XG4gICAgICB0aXRsZTogZGVzY3JpcHRpb25cbiAgICB9O1xuICB9XG4gIGlmICh0b29sdGlwKSB7XG4gICAgX3Rvb2x0aXAgPSB0b29sdGlwO1xuICB9XG4gIGlmIChsYWJlbFdpZHRoKSB7XG4gICAgX2xhYmVsQ29sID0ge1xuICAgICAgZmxleDogbGFiZWxXaWR0aCArICdweCdcbiAgICB9O1xuICB9XG4gIGlmIChsYWJlbENvbCkge1xuICAgIF9sYWJlbENvbCA9IGxhYmVsQ29sO1xuICB9XG4gIGlmIChmaWVsZENvbCkge1xuICAgIF9maWVsZENvbCA9IGZpZWxkQ29sO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfRm9ybS5JdGVtLCBPYmplY3QuYXNzaWduKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc25hbWVzKCdmci1vYmotc3ViaW5saW5lJywge1xuICAgICAgJ2ZyLW9iai1zdWJpbmxpbmUtbGFiZWwtaGlkZGVuJzogIXRpdGxlLFxuICAgICAgJ2ZyLW9iai1zdWJpbmxpbmUtYmFja2dyb3VuZCc6IGhhc0JhY2tncm91bmRcbiAgICB9KSxcbiAgICBsYWJlbDogdGl0bGUgfHwgJ25vdGl0bGUnLFxuICAgIGxhYmVsQ29sOiBfbGFiZWxDb2wsXG4gICAgd3JhcHBlckNvbDogX2ZpZWxkQ29sLFxuICAgIHRvb2x0aXA6IF90b29sdGlwXG4gIH0pLCBjaGlsZHJlbik7XG59O1xuZXhwb3J0IGRlZmF1bHQgQm94U3ViSW5saW5lOyIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUGFuZWxWaWV3IGZyb20gJy4uL2NvbXBvbmVudHMvUGFuZWxWaWV3JztcbmltcG9ydCBcIi4vaW5kZXguY3NzXCI7XG52YXIgRkxpbmVUaXRsZSA9IGZ1bmN0aW9uIEZMaW5lVGl0bGUoX3JlZikge1xuICB2YXIgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuLFxuICAgIHRpdGxlID0gX3JlZi50aXRsZSxcbiAgICBkZXNjcmlwdGlvbiA9IF9yZWYuZGVzY3JpcHRpb247XG4gIGlmICghdGl0bGUpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUGFuZWxWaWV3LCBudWxsLCBjaGlsZHJlbik7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6ICdmci1vYmotbGluZS10aXRsZSdcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogJ2ZyLW9iai1oZWFkZXInXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiAnZnItaGVhZGVyLXRpdGxlJ1xuICB9LCB0aXRsZSksIGRlc2NyaXB0aW9uICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiAnZnItaGVhZGVyLWRlc2MnXG4gIH0sIGRlc2NyaXB0aW9uKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6ICdmci1vYmotY29udGVudCdcbiAgfSwgY2hpbGRyZW4pKTtcbn07XG5leHBvcnQgZGVmYXVsdCBGTGluZVRpdGxlOyIsIlwidXNlIHN0cmljdFwiO1xuLy8gVGhpcyBpY29uIGZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgUGx1c091dGxpbmVkID0geyBcImljb25cIjogeyBcInRhZ1wiOiBcInN2Z1wiLCBcImF0dHJzXCI6IHsgXCJ2aWV3Qm94XCI6IFwiNjQgNjQgODk2IDg5NlwiLCBcImZvY3VzYWJsZVwiOiBcImZhbHNlXCIgfSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcImRlZnNcIiwgXCJhdHRyc1wiOiB7fSwgXCJjaGlsZHJlblwiOiBbeyBcInRhZ1wiOiBcInN0eWxlXCIsIFwiYXR0cnNcIjoge30gfV0gfSwgeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk00ODIgMTUyaDYwcTggMCA4IDh2NzA0cTAgOC04IDhoLTYwcS04IDAtOC04VjE2MHEwLTggOC04elwiIH0gfSwgeyBcInRhZ1wiOiBcInBhdGhcIiwgXCJhdHRyc1wiOiB7IFwiZFwiOiBcIk0xNzYgNDc0aDY3MnE4IDAgOCA4djYwcTAgOC04IDhIMTc2cS04IDAtOC04di02MHEwLTggOC04elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwicGx1c1wiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0cy5kZWZhdWx0ID0gUGx1c091dGxpbmVkO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xudmFyIF90eXBlb2YgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9vYmplY3RTcHJlYWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RTcHJlYWQyXCIpKTtcbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG52YXIgX1BsdXNPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL1BsdXNPdXRsaW5lZFwiKSk7XG52YXIgX0FudGRJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiKSk7XG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGVCYWJlbEludGVyb3AgPSBuZXcgV2Vha01hcCgpOyB2YXIgY2FjaGVOb2RlSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7IHJldHVybiAoX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKSB7IHJldHVybiBub2RlSW50ZXJvcCA/IGNhY2hlTm9kZUludGVyb3AgOiBjYWNoZUJhYmVsSW50ZXJvcDsgfSkobm9kZUludGVyb3ApOyB9XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmosIG5vZGVJbnRlcm9wKSB7IGlmICghbm9kZUludGVyb3AgJiYgb2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCBfdHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IGRlZmF1bHQ6IG9iaiB9OyB9IHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCk7IGlmIChjYWNoZSAmJiBjYWNoZS5oYXMob2JqKSkgeyByZXR1cm4gY2FjaGUuZ2V0KG9iaik7IH0gdmFyIG5ld09iaiA9IHt9OyB2YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKGtleSAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmouZGVmYXVsdCA9IG9iajsgaWYgKGNhY2hlKSB7IGNhY2hlLnNldChvYmosIG5ld09iaik7IH0gcmV0dXJuIG5ld09iajsgfVxuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcblxudmFyIFBsdXNPdXRsaW5lZCA9IGZ1bmN0aW9uIFBsdXNPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfQW50ZEljb24uZGVmYXVsdCwgKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgcHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IF9QbHVzT3V0bGluZWQuZGVmYXVsdFxuICB9KSk7XG59O1xuUGx1c091dGxpbmVkLmRpc3BsYXlOYW1lID0gJ1BsdXNPdXRsaW5lZCc7XG52YXIgX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihQbHVzT3V0bGluZWQpO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBDb3B5T3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTgzMiA2NEgyOTZjLTQuNCAwLTggMy42LTggOHY1NmMwIDQuNCAzLjYgOCA4IDhoNDk2djY4OGMwIDQuNCAzLjYgOCA4IDhoNTZjNC40IDAgOC0zLjYgOC04Vjk2YzAtMTcuNy0xNC4zLTMyLTMyLTMyek03MDQgMTkySDE5MmMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ2NTMwLjdjMCA4LjUgMy40IDE2LjYgOS40IDIyLjZsMTczLjMgMTczLjNjMi4yIDIuMiA0LjcgNCA3LjQgNS41djEuOWg0LjJjMy41IDEuMyA3LjIgMiAxMSAySDcwNGMxNy43IDAgMzItMTQuMyAzMi0zMlYyMjRjMC0xNy43LTE0LjMtMzItMzItMzJ6TTM1MCA4NTYuMkwyNjMuOSA3NzBIMzUwdjg2LjJ6TTY2NCA4ODhINDE0Vjc0NmMwLTIyLjEtMTcuOS00MC00MC00MEgyMzJWMjY0aDQzMnY2MjR6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJjb3B5XCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnRzLmRlZmF1bHQgPSBDb3B5T3V0bGluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG52YXIgX3R5cGVvZiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX29iamVjdFNwcmVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZDJcIikpO1xudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBfQ29weU91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vQ29weU91dGxpbmVkXCIpKTtcbnZhciBfQW50ZEljb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCIpKTtcbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZUJhYmVsSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7IHZhciBjYWNoZU5vZGVJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTsgcmV0dXJuIChfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApIHsgcmV0dXJuIG5vZGVJbnRlcm9wID8gY2FjaGVOb2RlSW50ZXJvcCA6IGNhY2hlQmFiZWxJbnRlcm9wOyB9KShub2RlSW50ZXJvcCk7IH1cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaiwgbm9kZUludGVyb3ApIHsgaWYgKCFub2RlSW50ZXJvcCAmJiBvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBpZiAob2JqID09PSBudWxsIHx8IF90eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIHsgZGVmYXVsdDogb2JqIH07IH0gdmFyIGNhY2hlID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoa2V5ICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09iai5kZWZhdWx0ID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuXG52YXIgQ29weU91dGxpbmVkID0gZnVuY3Rpb24gQ29weU91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9BbnRkSWNvbi5kZWZhdWx0LCAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogX0NvcHlPdXRsaW5lZC5kZWZhdWx0XG4gIH0pKTtcbn07XG5Db3B5T3V0bGluZWQuZGlzcGxheU5hbWUgPSAnQ29weU91dGxpbmVkJztcbnZhciBfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKENvcHlPdXRsaW5lZCk7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcbi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIENsb3NlT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTU2My44IDUxMmwyNjIuNS0zMTIuOWM0LjQtNS4yLjctMTMuMS02LjEtMTMuMWgtNzkuOGMtNC43IDAtOS4yIDIuMS0xMi4zIDUuN0w1MTEuNiA0NDkuOCAyOTUuMSAxOTEuN2MtMy0zLjYtNy41LTUuNy0xMi4zLTUuN0gyMDNjLTYuOCAwLTEwLjUgNy45LTYuMSAxMy4xTDQ1OS40IDUxMiAxOTYuOSA4MjQuOUE3Ljk1IDcuOTUgMCAwMDIwMyA4MzhoNzkuOGM0LjcgMCA5LjItMi4xIDEyLjMtNS43bDIxNi41LTI1OC4xIDIxNi41IDI1OC4xYzMgMy42IDcuNSA1LjcgMTIuMyA1LjdoNzkuOGM2LjggMCAxMC41LTcuOSA2LjEtMTMuMUw1NjMuOCA1MTJ6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJjbG9zZVwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0cy5kZWZhdWx0ID0gQ2xvc2VPdXRsaW5lZDtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbnZhciBfdHlwZW9mID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIF9DbG9zZU91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMtc3ZnL2xpYi9hc24vQ2xvc2VPdXRsaW5lZFwiKSk7XG52YXIgX0FudGRJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiKSk7XG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGVCYWJlbEludGVyb3AgPSBuZXcgV2Vha01hcCgpOyB2YXIgY2FjaGVOb2RlSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7IHJldHVybiAoX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKSB7IHJldHVybiBub2RlSW50ZXJvcCA/IGNhY2hlTm9kZUludGVyb3AgOiBjYWNoZUJhYmVsSW50ZXJvcDsgfSkobm9kZUludGVyb3ApOyB9XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmosIG5vZGVJbnRlcm9wKSB7IGlmICghbm9kZUludGVyb3AgJiYgb2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCBfdHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IGRlZmF1bHQ6IG9iaiB9OyB9IHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCk7IGlmIChjYWNoZSAmJiBjYWNoZS5oYXMob2JqKSkgeyByZXR1cm4gY2FjaGUuZ2V0KG9iaik7IH0gdmFyIG5ld09iaiA9IHt9OyB2YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKGtleSAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmouZGVmYXVsdCA9IG9iajsgaWYgKGNhY2hlKSB7IGNhY2hlLnNldChvYmosIG5ld09iaik7IH0gcmV0dXJuIG5ld09iajsgfVxuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcblxudmFyIENsb3NlT3V0bGluZWQgPSBmdW5jdGlvbiBDbG9zZU91dGxpbmVkKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9BbnRkSWNvbi5kZWZhdWx0LCAoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgcmVmOiByZWYsXG4gICAgaWNvbjogX0Nsb3NlT3V0bGluZWQuZGVmYXVsdFxuICB9KSk7XG59O1xuQ2xvc2VPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdDbG9zZU91dGxpbmVkJztcbnZhciBfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKENsb3NlT3V0bGluZWQpO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBBcnJvd0Rvd25PdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNODYyIDQ2NS4zaC04MWMtNC42IDAtOSAyLTEyLjEgNS41TDU1MCA3MjMuMVYxNjBjMC00LjQtMy42LTgtOC04aC02MGMtNC40IDAtOCAzLjYtOCA4djU2My4xTDI1NS4xIDQ3MC44Yy0zLTMuNS03LjQtNS41LTEyLjEtNS41aC04MWMtNi44IDAtMTAuNSA4LjEtNiAxMy4yTDQ4Ny45IDg2MWEzMS45NiAzMS45NiAwIDAwNDguMyAwTDg2OCA0NzguNWM0LjUtNS4yLjgtMTMuMi02LTEzLjJ6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJhcnJvdy1kb3duXCIsIFwidGhlbWVcIjogXCJvdXRsaW5lZFwiIH07XG5leHBvcnRzLmRlZmF1bHQgPSBBcnJvd0Rvd25PdXRsaW5lZDtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbnZhciBfdHlwZW9mID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIF9BcnJvd0Rvd25PdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0Fycm93RG93bk91dGxpbmVkXCIpKTtcbnZhciBfQW50ZEljb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jb21wb25lbnRzL0FudGRJY29uXCIpKTtcbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZUJhYmVsSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7IHZhciBjYWNoZU5vZGVJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTsgcmV0dXJuIChfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApIHsgcmV0dXJuIG5vZGVJbnRlcm9wID8gY2FjaGVOb2RlSW50ZXJvcCA6IGNhY2hlQmFiZWxJbnRlcm9wOyB9KShub2RlSW50ZXJvcCk7IH1cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaiwgbm9kZUludGVyb3ApIHsgaWYgKCFub2RlSW50ZXJvcCAmJiBvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBpZiAob2JqID09PSBudWxsIHx8IF90eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIHsgZGVmYXVsdDogb2JqIH07IH0gdmFyIGNhY2hlID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoa2V5ICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09iai5kZWZhdWx0ID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG4vLyBHRU5FUkFURSBCWSAuL3NjcmlwdHMvZ2VuZXJhdGUudHNcbi8vIERPTiBOT1QgRURJVCBJVCBNQU5VQUxMWVxuXG52YXIgQXJyb3dEb3duT3V0bGluZWQgPSBmdW5jdGlvbiBBcnJvd0Rvd25PdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfQW50ZEljb24uZGVmYXVsdCwgKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgcHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IF9BcnJvd0Rvd25PdXRsaW5lZC5kZWZhdWx0XG4gIH0pKTtcbn07XG5BcnJvd0Rvd25PdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdBcnJvd0Rvd25PdXRsaW5lZCc7XG52YXIgX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihBcnJvd0Rvd25PdXRsaW5lZCk7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcbi8vIFRoaXMgaWNvbiBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIEFycm93VXBPdXRsaW5lZCA9IHsgXCJpY29uXCI6IHsgXCJ0YWdcIjogXCJzdmdcIiwgXCJhdHRyc1wiOiB7IFwidmlld0JveFwiOiBcIjY0IDY0IDg5NiA4OTZcIiwgXCJmb2N1c2FibGVcIjogXCJmYWxzZVwiIH0sIFwiY2hpbGRyZW5cIjogW3sgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNODY4IDU0NS41TDUzNi4xIDE2M2EzMS45NiAzMS45NiAwIDAwLTQ4LjMgMEwxNTYgNTQ1LjVhNy45NyA3Ljk3IDAgMDA2IDEzLjJoODFjNC42IDAgOS0yIDEyLjEtNS41TDQ3NCAzMDAuOVY4NjRjMCA0LjQgMy42IDggOCA4aDYwYzQuNCAwIDgtMy42IDgtOFYzMDAuOWwyMTguOSAyNTIuM2MzIDMuNSA3LjQgNS41IDEyLjEgNS41aDgxYzYuOCAwIDEwLjUtOCA2LTEzLjJ6XCIgfSB9XSB9LCBcIm5hbWVcIjogXCJhcnJvdy11cFwiLCBcInRoZW1lXCI6IFwib3V0bGluZWRcIiB9O1xuZXhwb3J0cy5kZWZhdWx0ID0gQXJyb3dVcE91dGxpbmVkO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xudmFyIF90eXBlb2YgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9vYmplY3RTcHJlYWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RTcHJlYWQyXCIpKTtcbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG52YXIgX0Fycm93VXBPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zLXN2Zy9saWIvYXNuL0Fycm93VXBPdXRsaW5lZFwiKSk7XG52YXIgX0FudGRJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29tcG9uZW50cy9BbnRkSWNvblwiKSk7XG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGVCYWJlbEludGVyb3AgPSBuZXcgV2Vha01hcCgpOyB2YXIgY2FjaGVOb2RlSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7IHJldHVybiAoX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKSB7IHJldHVybiBub2RlSW50ZXJvcCA/IGNhY2hlTm9kZUludGVyb3AgOiBjYWNoZUJhYmVsSW50ZXJvcDsgfSkobm9kZUludGVyb3ApOyB9XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmosIG5vZGVJbnRlcm9wKSB7IGlmICghbm9kZUludGVyb3AgJiYgb2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCBfdHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IGRlZmF1bHQ6IG9iaiB9OyB9IHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCk7IGlmIChjYWNoZSAmJiBjYWNoZS5oYXMob2JqKSkgeyByZXR1cm4gY2FjaGUuZ2V0KG9iaik7IH0gdmFyIG5ld09iaiA9IHt9OyB2YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKGtleSAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmouZGVmYXVsdCA9IG9iajsgaWYgKGNhY2hlKSB7IGNhY2hlLnNldChvYmosIG5ld09iaik7IH0gcmV0dXJuIG5ld09iajsgfVxuLy8gR0VORVJBVEUgQlkgLi9zY3JpcHRzL2dlbmVyYXRlLnRzXG4vLyBET04gTk9UIEVESVQgSVQgTUFOVUFMTFlcblxudmFyIEFycm93VXBPdXRsaW5lZCA9IGZ1bmN0aW9uIEFycm93VXBPdXRsaW5lZChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfQW50ZEljb24uZGVmYXVsdCwgKDAsIF9vYmplY3RTcHJlYWQyLmRlZmF1bHQpKCgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSh7fSwgcHJvcHMpLCB7fSwge1xuICAgIHJlZjogcmVmLFxuICAgIGljb246IF9BcnJvd1VwT3V0bGluZWQuZGVmYXVsdFxuICB9KSk7XG59O1xuQXJyb3dVcE91dGxpbmVkLmRpc3BsYXlOYW1lID0gJ0Fycm93VXBPdXRsaW5lZCc7XG52YXIgX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihBcnJvd1VwT3V0bGluZWQpO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7IiwiaW1wb3J0IFwiYW50ZC9lcy9idXR0b24vc3R5bGVcIjtcbmltcG9ydCBfQnV0dG9uIGZyb20gXCJhbnRkL2VzL2J1dHRvblwiO1xuaW1wb3J0IHsgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIEhlYWRlclRpdGxlID0gZnVuY3Rpb24gSGVhZGVyVGl0bGUocHJvcHMpIHtcbiAgdmFyIGljb24gPSBwcm9wcy5pY29uLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgYnRuVHlwZSA9IHByb3BzLmJ0blR5cGUsXG4gICAgb3RoZXJQcm9wcyA9IF9fcmVzdChwcm9wcywgW1wiaWNvblwiLCBcImNoaWxkcmVuXCIsIFwiYnRuVHlwZVwiXSk7XG4gIHZhciBidG5Qcm9wcyA9IE9iamVjdC5hc3NpZ24oe30sIG90aGVyUHJvcHMpO1xuICBpZiAoYnRuVHlwZSA9PT0gJ2ljb24nKSB7XG4gICAgYnRuUHJvcHMuaWNvbiA9IGljb247XG4gICAgYnRuUHJvcHMuc2l6ZSA9ICdzbWFsbCc7XG4gIH0gZWxzZSB7XG4gICAgYnRuUHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0J1dHRvbiwgT2JqZWN0LmFzc2lnbih7XG4gICAgdHlwZTogJ2xpbmsnLFxuICAgIHN0eWxlOiB7XG4gICAgICBwYWRkaW5nOiAwXG4gICAgfVxuICB9LCBidG5Qcm9wcykpO1xufTtcbmV4cG9ydCBkZWZhdWx0IEhlYWRlclRpdGxlOyIsImltcG9ydCBfUGx1c091dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9saWIvaWNvbnMvUGx1c091dGxpbmVkXCI7XG5pbXBvcnQgXCJhbnRkL2VzL2J1dHRvbi9zdHlsZVwiO1xuaW1wb3J0IF9CdXR0b24gZnJvbSBcImFudGQvZXMvYnV0dG9uXCI7XG5pbXBvcnQgX0NvcHlPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0NvcHlPdXRsaW5lZFwiO1xuaW1wb3J0IF9DbG9zZU91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9saWIvaWNvbnMvQ2xvc2VPdXRsaW5lZFwiO1xuaW1wb3J0IFwiYW50ZC9lcy9wb3Bjb25maXJtL3N0eWxlXCI7XG5pbXBvcnQgX1BvcGNvbmZpcm0gZnJvbSBcImFudGQvZXMvcG9wY29uZmlybVwiO1xuaW1wb3J0IF9BcnJvd0Rvd25PdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0Fycm93RG93bk91dGxpbmVkXCI7XG5pbXBvcnQgX0Fycm93VXBPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0Fycm93VXBPdXRsaW5lZFwiO1xuaW1wb3J0IFwiYW50ZC9lcy9kaXZpZGVyL3N0eWxlXCI7XG5pbXBvcnQgX0RpdmlkZXIgZnJvbSBcImFudGQvZXMvZGl2aWRlclwiO1xuaW1wb3J0IFwiYW50ZC9lcy9zcGFjZS9zdHlsZVwiO1xuaW1wb3J0IF9TcGFjZSBmcm9tIFwiYW50ZC9lcy9zcGFjZVwiO1xuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOyB9XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgeyBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBpdGVyW1N5bWJvbC5pdGVyYXRvcl0gIT0gbnVsbCB8fCBpdGVyW1wiQEBpdGVyYXRvclwiXSAhPSBudWxsKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkoYXJyKTsgfVxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTsgcmV0dXJuIGFycjI7IH1cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBGQnV0dG9uIGZyb20gJy4uL2NvbXBvbmVudHMvRkJ1dHRvbic7XG5pbXBvcnQgXCIuL2luZGV4LmNzc1wiO1xudmFyIGdldEhhc0JhY2tncm91bmQgPSBmdW5jdGlvbiBnZXRIYXNCYWNrZ3JvdW5kKGZpZWxkcywgaGFzQmFja2dyb3VuZCkge1xuICB2YXIgcmVzdWx0ID0gaGFzQmFja2dyb3VuZDtcbiAgaWYgKGZpZWxkcy5sZW5ndGggPT09IDApIHtcbiAgICByZXN1bHQgPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBTaW1wbGVMaXN0ID0gZnVuY3Rpb24gU2ltcGxlTGlzdChwcm9wcykge1xuICB2YXIgZm9ybSA9IHByb3BzLmZvcm0sXG4gICAgc2NoZW1hID0gcHJvcHMuc2NoZW1hLFxuICAgIGZpZWxkcyA9IHByb3BzLmZpZWxkcyxcbiAgICByb290UGF0aCA9IHByb3BzLnJvb3RQYXRoLFxuICAgIHJlbmRlckNvcmUgPSBwcm9wcy5yZW5kZXJDb3JlLFxuICAgIGhhc0JhY2tncm91bmQgPSBwcm9wcy5oYXNCYWNrZ3JvdW5kLFxuICAgIG9wZXJhdGVCdG5UeXBlID0gcHJvcHMub3BlcmF0ZUJ0blR5cGUsXG4gICAgYWRkQnRuUHJvcHMgPSBwcm9wcy5hZGRCdG5Qcm9wcyxcbiAgICBkZWxDb25maXJtUHJvcHMgPSBwcm9wcy5kZWxDb25maXJtUHJvcHMsXG4gICAgY29weUJ0blByb3BzID0gcHJvcHMuY29weUJ0blByb3BzLFxuICAgIGRlbGV0ZUJ0blByb3BzID0gcHJvcHMuZGVsZXRlQnRuUHJvcHMsXG4gICAgbW92ZVVwQnRuUHJvcHMgPSBwcm9wcy5tb3ZlVXBCdG5Qcm9wcyxcbiAgICBtb3ZlRG93bkJ0blByb3BzID0gcHJvcHMubW92ZURvd25CdG5Qcm9wcyxcbiAgICBoaWRlRGVsZXRlID0gcHJvcHMuaGlkZURlbGV0ZSxcbiAgICBoaWRlQ29weSA9IHByb3BzLmhpZGVDb3B5LFxuICAgIGhpZGVNb3ZlID0gcHJvcHMuaGlkZU1vdmUsXG4gICAgaGlkZUFkZCA9IHByb3BzLmhpZGVBZGQsXG4gICAgYWRkSXRlbSA9IHByb3BzLmFkZEl0ZW0sXG4gICAgY29weUl0ZW0gPSBwcm9wcy5jb3B5SXRlbSxcbiAgICBtb3ZlSXRlbSA9IHByb3BzLm1vdmVJdGVtLFxuICAgIHJlbW92ZUl0ZW0gPSBwcm9wcy5yZW1vdmVJdGVtLFxuICAgIHRlbXBvcmFyeSA9IHByb3BzLnRlbXBvcmFyeTtcbiAgaWYgKCFzY2hlbWEuaXRlbXMuZGlzcGxheVR5cGUpIHtcbiAgICBzY2hlbWEuaXRlbXMuZGlzcGxheVR5cGUgPSAnaW5saW5lJztcbiAgICBzY2hlbWEuaXRlbXMuaW5saW5lTW9kZSA9IHRydWU7XG4gIH1cbiAgdmFyIGhhbmRsZUNvcHkgPSBmdW5jdGlvbiBoYW5kbGVDb3B5KG5hbWUpIHtcbiAgICB2YXIgdmFsdWUgPSBmb3JtLmdldEZpZWxkVmFsdWUocm9vdFBhdGguY29uY2F0KG5hbWUpKTtcbiAgICBjb3B5SXRlbSh2YWx1ZSk7XG4gIH07XG4gIHZhciBpc0NvbHVtbSA9IHRlbXBvcmFyeS5kaXNwbGF5VHlwZSA9PT0gJ2NvbHVtbic7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc25hbWVzKCdmci1saXN0LXNpbXBsZScsIHtcbiAgICAgICdmci1saXN0LXNpbXBsZS1iYWNrZ3JvdW5kJzogZ2V0SGFzQmFja2dyb3VuZChmaWVsZHMsIGhhc0JhY2tncm91bmQpLFxuICAgICAgJ2ZyLWxpc3Qtc2ltcGxlLWNvbHVtbic6IGlzQ29sdW1tXG4gICAgfSlcbiAgfSwgZmllbGRzLm1hcChmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBrZXkgPSBfcmVmLmtleSxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG4gICAgdmFyIGxlbmd0aCA9IGZpZWxkcy5sZW5ndGg7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGtleToga2V5LFxuICAgICAgY2xhc3NOYW1lOiAnZnItbGlzdC1pdGVtJ1xuICAgIH0sIHJlbmRlckNvcmUoe1xuICAgICAgc2NoZW1hOiBzY2hlbWEsXG4gICAgICBwYXJlbnRQYXRoOiBbbmFtZV0sXG4gICAgICByb290UGF0aDogW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShyb290UGF0aCksIFtuYW1lXSlcbiAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1NwYWNlLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoJ2ZyLWxpc3QtaXRlbS1vcGVyYXRlJyksXG4gICAgICBzcGxpdDogb3BlcmF0ZUJ0blR5cGUgIT09ICdpY29uJyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfRGl2aWRlciwge1xuICAgICAgICB0eXBlOiAndmVydGljYWwnXG4gICAgICB9KVxuICAgIH0sICFoaWRlTW92ZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7XG4gICAgICBkaXNhYmxlZDogbmFtZSA9PT0gMCxcbiAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgIHJldHVybiBtb3ZlSXRlbShuYW1lLCBuYW1lIC0gMSk7XG4gICAgICB9LFxuICAgICAgaWNvbjogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0Fycm93VXBPdXRsaW5lZCwgbnVsbClcbiAgICB9LCBtb3ZlVXBCdG5Qcm9wcykpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGQnV0dG9uLCBPYmplY3QuYXNzaWduKHtcbiAgICAgIGRpc2FibGVkOiBuYW1lID09PSBsZW5ndGggLSAxLFxuICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgcmV0dXJuIG1vdmVJdGVtKG5hbWUsIG5hbWUgKyAxKTtcbiAgICAgIH0sXG4gICAgICBpY29uOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfQXJyb3dEb3duT3V0bGluZWQsIG51bGwpLFxuICAgICAgY2hpbGRyZW46IFwiXFx1NEUwQlxcdTc5RkJcIlxuICAgIH0sIG1vdmVEb3duQnRuUHJvcHMpKSksICFoaWRlRGVsZXRlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Qb3Bjb25maXJtLCBPYmplY3QuYXNzaWduKHtcbiAgICAgIG9uQ29uZmlybTogZnVuY3Rpb24gb25Db25maXJtKCkge1xuICAgICAgICByZXR1cm4gcmVtb3ZlSXRlbShuYW1lKTtcbiAgICAgIH1cbiAgICB9LCBkZWxDb25maXJtUHJvcHMpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGQnV0dG9uLCBPYmplY3QuYXNzaWduKHtcbiAgICAgIGljb246IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9DbG9zZU91dGxpbmVkLCBudWxsKSxcbiAgICAgIGNoaWxkcmVuOiBcIlxcdTUyMjBcXHU5NjY0XCIsXG4gICAgICBidG5UeXBlOiBvcGVyYXRlQnRuVHlwZVxuICAgIH0sIGRlbGV0ZUJ0blByb3BzKSkpLCAhaGlkZUNvcHkgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7XG4gICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICByZXR1cm4gaGFuZGxlQ29weShuYW1lKTtcbiAgICAgIH0sXG4gICAgICBpY29uOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfQ29weU91dGxpbmVkLCBudWxsKSxcbiAgICAgIGNoaWxkcmVuOiBcIlxcdTU5MERcXHU1MjM2XCJcbiAgICB9LCBjb3B5QnRuUHJvcHMpKSkpO1xuICB9KSwgKCFzY2hlbWEubWF4IHx8IGZpZWxkcy5sZW5ndGggPCBzY2hlbWEubWF4KSAmJiAhaGlkZUFkZCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfQnV0dG9uLCBPYmplY3QuYXNzaWduKHtcbiAgICBjbGFzc05hbWU6ICdhZGQtYnRuJyxcbiAgICBpY29uOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfUGx1c091dGxpbmVkLCBudWxsKSxcbiAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgcmV0dXJuIGFkZEl0ZW0oKTtcbiAgICB9LFxuICAgIGJsb2NrOiBmaWVsZHMubGVuZ3RoID4gMCA/IHRydWUgOiBmYWxzZVxuICB9LCBhZGRCdG5Qcm9wcykpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTaW1wbGVMaXN0OyIsImltcG9ydCBfUGx1c091dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9saWIvaWNvbnMvUGx1c091dGxpbmVkXCI7XG5pbXBvcnQgXCJhbnRkL2VzL2J1dHRvbi9zdHlsZVwiO1xuaW1wb3J0IF9CdXR0b24gZnJvbSBcImFudGQvZXMvYnV0dG9uXCI7XG5pbXBvcnQgX0NvcHlPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0NvcHlPdXRsaW5lZFwiO1xuaW1wb3J0IF9DbG9zZU91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9saWIvaWNvbnMvQ2xvc2VPdXRsaW5lZFwiO1xuaW1wb3J0IFwiYW50ZC9lcy9wb3Bjb25maXJtL3N0eWxlXCI7XG5pbXBvcnQgX1BvcGNvbmZpcm0gZnJvbSBcImFudGQvZXMvcG9wY29uZmlybVwiO1xuaW1wb3J0IF9BcnJvd0Rvd25PdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0Fycm93RG93bk91dGxpbmVkXCI7XG5pbXBvcnQgX0Fycm93VXBPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0Fycm93VXBPdXRsaW5lZFwiO1xuaW1wb3J0IFwiYW50ZC9lcy9kaXZpZGVyL3N0eWxlXCI7XG5pbXBvcnQgX0RpdmlkZXIgZnJvbSBcImFudGQvZXMvZGl2aWRlclwiO1xuaW1wb3J0IFwiYW50ZC9lcy9zcGFjZS9zdHlsZVwiO1xuaW1wb3J0IF9TcGFjZSBmcm9tIFwiYW50ZC9lcy9zcGFjZVwiO1xuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOyB9XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgeyBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBpdGVyW1N5bWJvbC5pdGVyYXRvcl0gIT0gbnVsbCB8fCBpdGVyW1wiQEBpdGVyYXRvclwiXSAhPSBudWxsKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkoYXJyKTsgfVxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTsgcmV0dXJuIGFycjI7IH1cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBGQnV0dG9uIGZyb20gJy4uL2NvbXBvbmVudHMvRkJ1dHRvbic7XG5pbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IFwiLi9pbmRleC5jc3NcIjtcbnZhciBnZXRPcGVyYXRlRml4ZWQgPSBmdW5jdGlvbiBnZXRPcGVyYXRlRml4ZWQoc2NoZW1hKSB7XG4gIHZhciBfYSwgX2I7XG4gIHZhciBmaXhlZCA9IHRydWU7XG4gIGlmICgoX2IgPSAoX2EgPSBzY2hlbWEgPT09IG51bGwgfHwgc2NoZW1hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzY2hlbWEuaXRlbXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wcm9wcykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmV4dHJhKSB7XG4gICAgZml4ZWQgPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gZml4ZWQ7XG59O1xudmFyIGdldE9wZXJhdGVTdHlsZSA9IGZ1bmN0aW9uIGdldE9wZXJhdGVTdHlsZShzY2hlbWEpIHtcbiAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgdmFyIHN0eWxlID0ge307XG4gIHZhciB3aWRnZXROYW1lID0gKChfYSA9IHNjaGVtYSA9PT0gbnVsbCB8fCBzY2hlbWEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNjaGVtYS5pdGVtcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRoZW1lKSB8fCAoKF9iID0gc2NoZW1hID09PSBudWxsIHx8IHNjaGVtYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2NoZW1hLml0ZW1zKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Iud2lkZ2V0KSB8fCAnY29sbGFwc2UnO1xuICBpZiAoWydjYXJkJywgJ2NvbGxhcHNlJywgJ2xpbmVUaXRsZSddLmluY2x1ZGVzKHdpZGdldE5hbWUpICYmICEoKF9kID0gKF9jID0gc2NoZW1hID09PSBudWxsIHx8IHNjaGVtYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2NoZW1hLml0ZW1zKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MucHJvcHMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5leHRyYSkpIHtcbiAgICBzdHlsZS50b3AgPSAnMTRweCc7XG4gICAgaWYgKFsnbGluZVRpdGxlJ10uaW5jbHVkZXMod2lkZ2V0TmFtZSkpIHtcbiAgICAgIHN0eWxlLnRvcCA9ICczcHgnO1xuICAgICAgc3R5bGUucGFkZGluZyA9IDA7XG4gICAgfVxuICAgIGlmICghKChfZSA9IHNjaGVtYSA9PT0gbnVsbCB8fCBzY2hlbWEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNjaGVtYS5pdGVtcykgPT09IG51bGwgfHwgX2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lLnRpdGxlKSkge1xuICAgICAgc3R5bGUucmlnaHQgPSAnMCc7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdHlsZTtcbn07XG52YXIgQ2FyZExpc3QgPSBmdW5jdGlvbiBDYXJkTGlzdChwcm9wcykge1xuICB2YXIgZm9ybSA9IHByb3BzLmZvcm0sXG4gICAgc2NoZW1hID0gcHJvcHMuc2NoZW1hLFxuICAgIGZpZWxkcyA9IHByb3BzLmZpZWxkcyxcbiAgICByb290UGF0aCA9IHByb3BzLnJvb3RQYXRoLFxuICAgIHJlbmRlckNvcmUgPSBwcm9wcy5yZW5kZXJDb3JlLFxuICAgIGhhc0JhY2tncm91bmQgPSBwcm9wcy5oYXNCYWNrZ3JvdW5kLFxuICAgIG9wZXJhdGVCdG5UeXBlID0gcHJvcHMub3BlcmF0ZUJ0blR5cGUsXG4gICAgYWRkQnRuUHJvcHMgPSBwcm9wcy5hZGRCdG5Qcm9wcyxcbiAgICBkZWxDb25maXJtUHJvcHMgPSBwcm9wcy5kZWxDb25maXJtUHJvcHMsXG4gICAgY29weUJ0blByb3BzID0gcHJvcHMuY29weUJ0blByb3BzLFxuICAgIGRlbGV0ZUJ0blByb3BzID0gcHJvcHMuZGVsZXRlQnRuUHJvcHMsXG4gICAgbW92ZVVwQnRuUHJvcHMgPSBwcm9wcy5tb3ZlVXBCdG5Qcm9wcyxcbiAgICBtb3ZlRG93bkJ0blByb3BzID0gcHJvcHMubW92ZURvd25CdG5Qcm9wcyxcbiAgICBoaWRlRGVsZXRlID0gcHJvcHMuaGlkZURlbGV0ZSxcbiAgICBoaWRlQ29weSA9IHByb3BzLmhpZGVDb3B5LFxuICAgIGhpZGVNb3ZlID0gcHJvcHMuaGlkZU1vdmUsXG4gICAgaGlkZUFkZCA9IHByb3BzLmhpZGVBZGQsXG4gICAgYWRkSXRlbSA9IHByb3BzLmFkZEl0ZW0sXG4gICAgY29weUl0ZW0gPSBwcm9wcy5jb3B5SXRlbSxcbiAgICBtb3ZlSXRlbSA9IHByb3BzLm1vdmVJdGVtLFxuICAgIHJlbW92ZUl0ZW0gPSBwcm9wcy5yZW1vdmVJdGVtO1xuICB2YXIgaGFuZGxlQ29weSA9IGZ1bmN0aW9uIGhhbmRsZUNvcHkobmFtZSkge1xuICAgIHZhciB2YWx1ZSA9IGZvcm0uZ2V0RmllbGRWYWx1ZShyb290UGF0aC5jb25jYXQobmFtZSkpO1xuICAgIGNvcHlJdGVtKHZhbHVlKTtcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc25hbWVzKCdmci1saXN0LWNhcmQnLCB7XG4gICAgICAnZnItbGlzdC1jYXJkLWJhY2tncm91bmQnOiBoYXNCYWNrZ3JvdW5kXG4gICAgfSlcbiAgfSwgZmllbGRzLm1hcChmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBrZXkgPSBfcmVmLmtleSxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG4gICAgdmFyIGxlbmd0aCA9IGZpZWxkcy5sZW5ndGg7XG4gICAgdmFyIG5ld1NjaGVtYSA9IGNsb25lRGVlcChzY2hlbWEpO1xuICAgIGlmIChuZXdTY2hlbWEuaXRlbXMudGl0bGUgJiYgdHlwZW9mIG5ld1NjaGVtYS5pdGVtcy50aXRsZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG5ld1NjaGVtYS5pdGVtcy50aXRsZSArPSBcIiBcIi5jb25jYXQobmFtZSArIDEpO1xuICAgIH1cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAga2V5OiBrZXksXG4gICAgICBjbGFzc05hbWU6ICdmci1saXN0LWl0ZW0nXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgIGZsZXg6IDFcbiAgICAgIH1cbiAgICB9LCByZW5kZXJDb3JlKHtcbiAgICAgIHNjaGVtYTogbmV3U2NoZW1hLFxuICAgICAgcGFyZW50UGF0aDogW25hbWVdLFxuICAgICAgcm9vdFBhdGg6IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocm9vdFBhdGgpLCBbbmFtZV0pXG4gICAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfU3BhY2UsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcygnZnItbGlzdC1pdGVtLW9wZXJhdGUnLCB7XG4gICAgICAgICdmci1saXN0LWl0ZW0tb3BlcmF0ZS1maXhlZCc6IGdldE9wZXJhdGVGaXhlZChzY2hlbWEpXG4gICAgICB9KSxcbiAgICAgIHN0eWxlOiBnZXRPcGVyYXRlU3R5bGUoc2NoZW1hKSxcbiAgICAgIHNwbGl0OiBvcGVyYXRlQnRuVHlwZSAhPT0gJ2ljb24nICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9EaXZpZGVyLCB7XG4gICAgICAgIHR5cGU6ICd2ZXJ0aWNhbCdcbiAgICAgIH0pXG4gICAgfSwgIWhpZGVNb3ZlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGQnV0dG9uLCBPYmplY3QuYXNzaWduKHtcbiAgICAgIGRpc2FibGVkOiBuYW1lID09PSAwLFxuICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgcmV0dXJuIG1vdmVJdGVtKG5hbWUsIG5hbWUgLSAxKTtcbiAgICAgIH0sXG4gICAgICBpY29uOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfQXJyb3dVcE91dGxpbmVkLCBudWxsKVxuICAgIH0sIG1vdmVVcEJ0blByb3BzKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZCdXR0b24sIE9iamVjdC5hc3NpZ24oe1xuICAgICAgZGlzYWJsZWQ6IG5hbWUgPT09IGxlbmd0aCAtIDEsXG4gICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICByZXR1cm4gbW92ZUl0ZW0obmFtZSwgbmFtZSArIDEpO1xuICAgICAgfSxcbiAgICAgIGljb246IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9BcnJvd0Rvd25PdXRsaW5lZCwgbnVsbClcbiAgICB9LCBtb3ZlRG93bkJ0blByb3BzKSkpLCAhaGlkZURlbGV0ZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfUG9wY29uZmlybSwgT2JqZWN0LmFzc2lnbih7XG4gICAgICBvbkNvbmZpcm06IGZ1bmN0aW9uIG9uQ29uZmlybSgpIHtcbiAgICAgICAgcmV0dXJuIHJlbW92ZUl0ZW0obmFtZSk7XG4gICAgICB9XG4gICAgfSwgZGVsQ29uZmlybVByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7XG4gICAgICBpY29uOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfQ2xvc2VPdXRsaW5lZCwgbnVsbClcbiAgICB9LCBkZWxldGVCdG5Qcm9wcykpKSwgIWhpZGVDb3B5ICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZCdXR0b24sIE9iamVjdC5hc3NpZ24oe1xuICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZUNvcHkobmFtZSk7XG4gICAgICB9LFxuICAgICAgaWNvbjogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0NvcHlPdXRsaW5lZCwgbnVsbClcbiAgICB9LCBjb3B5QnRuUHJvcHMpKSkpO1xuICB9KSwgIWhpZGVBZGQgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogJ2ZyLWxpc3QtYWRkLWJ0bidcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0J1dHRvbiwgT2JqZWN0LmFzc2lnbih7fSwgYWRkQnRuUHJvcHMsIHtcbiAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgcmV0dXJuIGFkZEl0ZW0oKTtcbiAgICB9LFxuICAgIGljb246IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9QbHVzT3V0bGluZWQsIG51bGwpLFxuICAgIGJsb2NrOiBmaWVsZHMubGVuZ3RoID4gMCA/IHRydWUgOiBmYWxzZVxuICB9KSkpKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgQ2FyZExpc3Q7IiwiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBUaGlzIGljb24gZmlsZSBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBJbmZvQ2lyY2xlT3V0bGluZWQgPSB7IFwiaWNvblwiOiB7IFwidGFnXCI6IFwic3ZnXCIsIFwiYXR0cnNcIjogeyBcInZpZXdCb3hcIjogXCI2NCA2NCA4OTYgODk2XCIsIFwiZm9jdXNhYmxlXCI6IFwiZmFsc2VcIiB9LCBcImNoaWxkcmVuXCI6IFt7IFwidGFnXCI6IFwicGF0aFwiLCBcImF0dHJzXCI6IHsgXCJkXCI6IFwiTTUxMiA2NEMyNjQuNiA2NCA2NCAyNjQuNiA2NCA1MTJzMjAwLjYgNDQ4IDQ0OCA0NDggNDQ4LTIwMC42IDQ0OC00NDhTNzU5LjQgNjQgNTEyIDY0em0wIDgyMGMtMjA1LjQgMC0zNzItMTY2LjYtMzcyLTM3MnMxNjYuNi0zNzIgMzcyLTM3MiAzNzIgMTY2LjYgMzcyIDM3Mi0xNjYuNiAzNzItMzcyIDM3MnpcIiB9IH0sIHsgXCJ0YWdcIjogXCJwYXRoXCIsIFwiYXR0cnNcIjogeyBcImRcIjogXCJNNDY0IDMzNmE0OCA0OCAwIDEwOTYgMCA0OCA0OCAwIDEwLTk2IDB6bTcyIDExMmgtNDhjLTQuNCAwLTggMy42LTggOHYyNzJjMCA0LjQgMy42IDggOCA4aDQ4YzQuNCAwIDgtMy42IDgtOFY0NTZjMC00LjQtMy42LTgtOC04elwiIH0gfV0gfSwgXCJuYW1lXCI6IFwiaW5mby1jaXJjbGVcIiwgXCJ0aGVtZVwiOiBcIm91dGxpbmVkXCIgfTtcbmV4cG9ydHMuZGVmYXVsdCA9IEluZm9DaXJjbGVPdXRsaW5lZDtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbnZhciBfdHlwZW9mID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfb2JqZWN0U3ByZWFkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0U3ByZWFkMlwiKSk7XG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIF9JbmZvQ2lyY2xlT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy1zdmcvbGliL2Fzbi9JbmZvQ2lyY2xlT3V0bGluZWRcIikpO1xudmFyIF9BbnRkSWNvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NvbXBvbmVudHMvQW50ZEljb25cIikpO1xuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKSB7IGlmICh0eXBlb2YgV2Vha01hcCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gbnVsbDsgdmFyIGNhY2hlQmFiZWxJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTsgdmFyIGNhY2hlTm9kZUludGVyb3AgPSBuZXcgV2Vha01hcCgpOyByZXR1cm4gKF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCkgeyByZXR1cm4gbm9kZUludGVyb3AgPyBjYWNoZU5vZGVJbnRlcm9wIDogY2FjaGVCYWJlbEludGVyb3A7IH0pKG5vZGVJbnRlcm9wKTsgfVxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqLCBub2RlSW50ZXJvcCkgeyBpZiAoIW5vZGVJbnRlcm9wICYmIG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGlmIChvYmogPT09IG51bGwgfHwgX3R5cGVvZihvYmopICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvYmogIT09IFwiZnVuY3Rpb25cIikgeyByZXR1cm4geyBkZWZhdWx0OiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApOyBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsgcmV0dXJuIGNhY2hlLmdldChvYmopOyB9IHZhciBuZXdPYmogPSB7fTsgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChrZXkgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHsgdmFyIGRlc2MgPSBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IG51bGw7IGlmIChkZXNjICYmIChkZXNjLmdldCB8fCBkZXNjLnNldCkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTsgfSBlbHNlIHsgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IH0gbmV3T2JqLmRlZmF1bHQgPSBvYmo7IGlmIChjYWNoZSkgeyBjYWNoZS5zZXQob2JqLCBuZXdPYmopOyB9IHJldHVybiBuZXdPYmo7IH1cbi8vIEdFTkVSQVRFIEJZIC4vc2NyaXB0cy9nZW5lcmF0ZS50c1xuLy8gRE9OIE5PVCBFRElUIElUIE1BTlVBTExZXG5cbnZhciBJbmZvQ2lyY2xlT3V0bGluZWQgPSBmdW5jdGlvbiBJbmZvQ2lyY2xlT3V0bGluZWQocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0FudGRJY29uLmRlZmF1bHQsICgwLCBfb2JqZWN0U3ByZWFkMi5kZWZhdWx0KSgoMCwgX29iamVjdFNwcmVhZDIuZGVmYXVsdCkoe30sIHByb3BzKSwge30sIHtcbiAgICByZWY6IHJlZixcbiAgICBpY29uOiBfSW5mb0NpcmNsZU91dGxpbmVkLmRlZmF1bHRcbiAgfSkpO1xufTtcbkluZm9DaXJjbGVPdXRsaW5lZC5kaXNwbGF5TmFtZSA9ICdJbmZvQ2lyY2xlT3V0bGluZWQnO1xudmFyIF9kZWZhdWx0ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoSW5mb0NpcmNsZU91dGxpbmVkKTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyIsImltcG9ydCBcImFudGQvZXMvcG9wb3Zlci9zdHlsZVwiO1xuaW1wb3J0IF9Qb3BvdmVyIGZyb20gXCJhbnRkL2VzL3BvcG92ZXJcIjtcbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpOyB9XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07IHJldHVybiBhcnIyOyB9XG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7IHZhciBfaSA9IG51bGwgPT0gYXJyID8gbnVsbCA6IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiBhcnJbU3ltYm9sLml0ZXJhdG9yXSB8fCBhcnJbXCJAQGl0ZXJhdG9yXCJdOyBpZiAobnVsbCAhPSBfaSkgeyB2YXIgX3MsIF9lLCBfeCwgX3IsIF9hcnIgPSBbXSwgX24gPSAhMCwgX2QgPSAhMTsgdHJ5IHsgaWYgKF94ID0gKF9pID0gX2kuY2FsbChhcnIpKS5uZXh0LCAwID09PSBpKSB7IGlmIChPYmplY3QoX2kpICE9PSBfaSkgcmV0dXJuOyBfbiA9ICExOyB9IGVsc2UgZm9yICg7ICEoX24gPSAoX3MgPSBfeC5jYWxsKF9pKSkuZG9uZSkgJiYgKF9hcnIucHVzaChfcy52YWx1ZSksIF9hcnIubGVuZ3RoICE9PSBpKTsgX24gPSAhMCk7IH0gY2F0Y2ggKGVycikgeyBfZCA9ICEwLCBfZSA9IGVycjsgfSBmaW5hbGx5IHsgdHJ5IHsgaWYgKCFfbiAmJiBudWxsICE9IF9pLnJldHVybiAmJiAoX3IgPSBfaS5yZXR1cm4oKSwgT2JqZWN0KF9yKSAhPT0gX3IpKSByZXR1cm47IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfSB9XG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cbmltcG9ydCB7IF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG52YXIgVGFibGVDZWxsID0gZnVuY3Rpb24gVGFibGVDZWxsKHByb3BzKSB7XG4gIHZhciByZW5kZXJDb3JlID0gcHJvcHMucmVuZGVyQ29yZSxcbiAgICBzY2hlbWEgPSBwcm9wcy5zY2hlbWEsXG4gICAgZGF0YUluZGV4ID0gcHJvcHMuZGF0YUluZGV4LFxuICAgIG90aGVyUHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcInJlbmRlckNvcmVcIiwgXCJzY2hlbWFcIiwgXCJkYXRhSW5kZXhcIl0pO1xuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUobnVsbCksXG4gICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgZXJyb3JNc2cgPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldEVycm9yTXNnID0gX3VzZVN0YXRlMlsxXTtcbiAgdmFyIF91c2VTdGF0ZTMgPSB1c2VTdGF0ZSgpLFxuICAgIF91c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUzLCAyKSxcbiAgICB2aXNpYmxlID0gX3VzZVN0YXRlNFswXSxcbiAgICBzZXRWaXNpYmxlID0gX3VzZVN0YXRlNFsxXTtcbiAgdmFyIG1vdXNlUmVmID0gdXNlUmVmKCk7XG4gIHZhciBvblN0YXR1c0NoYW5nZSA9IGZ1bmN0aW9uIG9uU3RhdHVzQ2hhbmdlKF8sIGVycm9ycykge1xuICAgIHZhciBtZXNzYWdlID0gZXJyb3JzWzBdIHx8IG51bGw7XG4gICAgc2V0RXJyb3JNc2cobWVzc2FnZSk7XG4gICAgaWYgKG1vdXNlUmVmLmN1cnJlbnQgJiYgbWVzc2FnZSkge1xuICAgICAgc2V0VmlzaWJsZSh0cnVlKTtcbiAgICB9XG4gIH07XG4gIGlmICghc2NoZW1hLnByb3BlcnRpZXNbZGF0YUluZGV4XS5vblN0YXR1c0NoYW5nZSkge1xuICAgIHNjaGVtYS5wcm9wZXJ0aWVzW2RhdGFJbmRleF0ub25TdGF0dXNDaGFuZ2UgPSBvblN0YXR1c0NoYW5nZTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogJ2ZyLXRhYmxlLWNlbGwtY29udGVudCcsXG4gICAgb25Nb3VzZUVudGVyOiBmdW5jdGlvbiBvbk1vdXNlRW50ZXIoKSB7XG4gICAgICBtb3VzZVJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIHNldFZpc2libGUodHJ1ZSk7XG4gICAgfSxcbiAgICBvbk1vdXNlTGVhdmU6IGZ1bmN0aW9uIG9uTW91c2VMZWF2ZSgpIHtcbiAgICAgIG1vdXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIHNldFZpc2libGUoZmFsc2UpO1xuICAgIH1cbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1BvcG92ZXIsIHtcbiAgICBvdmVybGF5Q2xhc3NOYW1lOiAnZnItcG9wb3Zlci1lcnJvcicsXG4gICAgY29udGVudDogZXJyb3JNc2csXG4gICAgcGxhY2VtZW50OiAndG9wUmlnaHQnLFxuICAgIG9wZW46IHZpc2libGUgJiYgZXJyb3JNc2dcbiAgfSwgcmVuZGVyQ29yZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG90aGVyUHJvcHMpLCB7XG4gICAgc2NoZW1hOiBzY2hlbWFcbiAgfSkpKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgVGFibGVDZWxsOyIsImZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9LCBfdHlwZW9mKG9iaik7IH1cbmltcG9ydCBfUGx1c091dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9saWIvaWNvbnMvUGx1c091dGxpbmVkXCI7XG5pbXBvcnQgXCJhbnRkL2VzL2J1dHRvbi9zdHlsZVwiO1xuaW1wb3J0IF9CdXR0b24gZnJvbSBcImFudGQvZXMvYnV0dG9uXCI7XG5pbXBvcnQgXCJhbnRkL2VzL3RhYmxlL3N0eWxlXCI7XG5pbXBvcnQgX1RhYmxlIGZyb20gXCJhbnRkL2VzL3RhYmxlXCI7XG5pbXBvcnQgX0NvcHlPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0NvcHlPdXRsaW5lZFwiO1xuaW1wb3J0IF9DbG9zZU91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9saWIvaWNvbnMvQ2xvc2VPdXRsaW5lZFwiO1xuaW1wb3J0IFwiYW50ZC9lcy9wb3Bjb25maXJtL3N0eWxlXCI7XG5pbXBvcnQgX1BvcGNvbmZpcm0gZnJvbSBcImFudGQvZXMvcG9wY29uZmlybVwiO1xuaW1wb3J0IF9BcnJvd0Rvd25PdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0Fycm93RG93bk91dGxpbmVkXCI7XG5pbXBvcnQgX0Fycm93VXBPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0Fycm93VXBPdXRsaW5lZFwiO1xuaW1wb3J0IFwiYW50ZC9lcy9kaXZpZGVyL3N0eWxlXCI7XG5pbXBvcnQgX0RpdmlkZXIgZnJvbSBcImFudGQvZXMvZGl2aWRlclwiO1xuaW1wb3J0IFwiYW50ZC9lcy9zcGFjZS9zdHlsZVwiO1xuaW1wb3J0IF9TcGFjZSBmcm9tIFwiYW50ZC9lcy9zcGFjZVwiO1xuaW1wb3J0IFwiYW50ZC9lcy9mb3JtL3N0eWxlXCI7XG5pbXBvcnQgX0Zvcm0gZnJvbSBcImFudGQvZXMvZm9ybVwiO1xuaW1wb3J0IF9JbmZvQ2lyY2xlT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2xpYi9pY29ucy9JbmZvQ2lyY2xlT3V0bGluZWRcIjtcbmltcG9ydCBcImFudGQvZXMvdG9vbHRpcC9zdHlsZVwiO1xuaW1wb3J0IF9Ub29sdGlwIGZyb20gXCJhbnRkL2VzL3Rvb2x0aXBcIjtcbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTsgfVxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7IGlmICh0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIGl0ZXJbU3ltYm9sLml0ZXJhdG9yXSAhPSBudWxsIHx8IGl0ZXJbXCJAQGl0ZXJhdG9yXCJdICE9IG51bGwpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpOyB9XG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShhcnIpOyB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkoYXJnKSB7IHZhciBrZXkgPSBfdG9QcmltaXRpdmUoYXJnLCBcInN0cmluZ1wiKTsgcmV0dXJuIF90eXBlb2Yoa2V5KSA9PT0gXCJzeW1ib2xcIiA/IGtleSA6IFN0cmluZyhrZXkpOyB9XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUoaW5wdXQsIGhpbnQpIHsgaWYgKF90eXBlb2YoaW5wdXQpICE9PSBcIm9iamVjdFwiIHx8IGlucHV0ID09PSBudWxsKSByZXR1cm4gaW5wdXQ7IHZhciBwcmltID0gaW5wdXRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHByaW0gIT09IHVuZGVmaW5lZCkgeyB2YXIgcmVzID0gcHJpbS5jYWxsKGlucHV0LCBoaW50IHx8IFwiZGVmYXVsdFwiKTsgaWYgKF90eXBlb2YocmVzKSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHJlczsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoaGludCA9PT0gXCJzdHJpbmdcIiA/IFN0cmluZyA6IE51bWJlcikoaW5wdXQpOyB9XG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfVxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldOyByZXR1cm4gYXJyMjsgfVxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgeyB2YXIgX2kgPSBudWxsID09IGFyciA/IG51bGwgOiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBTeW1ib2wgJiYgYXJyW1N5bWJvbC5pdGVyYXRvcl0gfHwgYXJyW1wiQEBpdGVyYXRvclwiXTsgaWYgKG51bGwgIT0gX2kpIHsgdmFyIF9zLCBfZSwgX3gsIF9yLCBfYXJyID0gW10sIF9uID0gITAsIF9kID0gITE7IHRyeSB7IGlmIChfeCA9IChfaSA9IF9pLmNhbGwoYXJyKSkubmV4dCwgMCA9PT0gaSkgeyBpZiAoT2JqZWN0KF9pKSAhPT0gX2kpIHJldHVybjsgX24gPSAhMTsgfSBlbHNlIGZvciAoOyAhKF9uID0gKF9zID0gX3guY2FsbChfaSkpLmRvbmUpICYmIChfYXJyLnB1c2goX3MudmFsdWUpLCBfYXJyLmxlbmd0aCAhPT0gaSk7IF9uID0gITApOyB9IGNhdGNoIChlcnIpIHsgX2QgPSAhMCwgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgbnVsbCAhPSBfaS5yZXR1cm4gJiYgKF9yID0gX2kucmV0dXJuKCksIE9iamVjdChfcikgIT09IF9yKSkgcmV0dXJuOyB9IGZpbmFsbHkgeyBpZiAoX2QpIHRocm93IF9lOyB9IH0gcmV0dXJuIF9hcnI7IH0gfVxuZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyOyB9XG5pbXBvcnQgeyBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBUYWJsZUNlbGwgZnJvbSAnLi90YWJsZUNlbGwnO1xuaW1wb3J0IEZCdXR0b24gZnJvbSAnLi4vY29tcG9uZW50cy9GQnV0dG9uJztcbmltcG9ydCBzb3J0UHJvcGVydGllcyBmcm9tICcuLi8uLi9tb2RlbHMvc29ydFByb3BlcnRpZXMnO1xuaW1wb3J0IFwiLi9pbmRleC5jc3NcIjtcbjtcbnZhciBnZXRUb29sdGlwID0gZnVuY3Rpb24gZ2V0VG9vbHRpcCh0b29sdGlwKSB7XG4gIGlmICghdG9vbHRpcCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodHlwZW9mIHRvb2x0aXAgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRpdGxlOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xuICAgICAgICAgIF9faHRtbDogdG9vbHRpcFxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdG9vbHRpcCksIHtcbiAgICB0aXRsZTogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XG4gICAgICAgIF9faHRtbDogdG9vbHRpcC50aXRsZVxuICAgICAgfVxuICAgIH0pXG4gIH0pO1xufTtcbnZhciBUYWJsZUxpc3QgPSBmdW5jdGlvbiBUYWJsZUxpc3QocHJvcHMpIHtcbiAgdmFyIF9hLCBfYjtcbiAgdmFyIGZvcm0gPSBwcm9wcy5mb3JtLFxuICAgIHNjaGVtYSA9IHByb3BzLnNjaGVtYSxcbiAgICBmaWVsZHMgPSBwcm9wcy5maWVsZHMsXG4gICAgcm9vdFBhdGggPSBwcm9wcy5yb290UGF0aCxcbiAgICByZW5kZXJDb3JlID0gcHJvcHMucmVuZGVyQ29yZSxcbiAgICByZWFkT25seSA9IHByb3BzLnJlYWRPbmx5LFxuICAgIG9wZXJhdGVCdG5UeXBlID0gcHJvcHMub3BlcmF0ZUJ0blR5cGUsXG4gICAgYWRkQnRuUHJvcHMgPSBwcm9wcy5hZGRCdG5Qcm9wcyxcbiAgICBkZWxDb25maXJtUHJvcHMgPSBwcm9wcy5kZWxDb25maXJtUHJvcHMsXG4gICAgY29weUJ0blByb3BzID0gcHJvcHMuY29weUJ0blByb3BzLFxuICAgIGRlbGV0ZUJ0blByb3BzID0gcHJvcHMuZGVsZXRlQnRuUHJvcHMsXG4gICAgbW92ZVVwQnRuUHJvcHMgPSBwcm9wcy5tb3ZlVXBCdG5Qcm9wcyxcbiAgICBtb3ZlRG93bkJ0blByb3BzID0gcHJvcHMubW92ZURvd25CdG5Qcm9wcyxcbiAgICBhY3Rpb25Db2x1bW5Qcm9wcyA9IHByb3BzLmFjdGlvbkNvbHVtblByb3BzLFxuICAgIHBhZ2luYXRpb24gPSBwcm9wcy5wYWdpbmF0aW9uLFxuICAgIGhpZGVEZWxldGUgPSBwcm9wcy5oaWRlRGVsZXRlLFxuICAgIGhpZGVDb3B5ID0gcHJvcHMuaGlkZUNvcHksXG4gICAgaGlkZU1vdmUgPSBwcm9wcy5oaWRlTW92ZSxcbiAgICBoaWRlQWRkID0gcHJvcHMuaGlkZUFkZCxcbiAgICBhZGRJdGVtID0gcHJvcHMuYWRkSXRlbSxcbiAgICBjb3B5SXRlbSA9IHByb3BzLmNvcHlJdGVtLFxuICAgIG1vdmVJdGVtID0gcHJvcHMubW92ZUl0ZW0sXG4gICAgcmVtb3ZlSXRlbSA9IHByb3BzLnJlbW92ZUl0ZW0sXG4gICAgY29uZmlnQ29udGV4dCA9IHByb3BzLmNvbmZpZ0NvbnRleHQsXG4gICAgdmFsaWRhdGVQb3BvdmVyID0gcHJvcHMudmFsaWRhdGVQb3BvdmVyO1xuICB2YXIgZ2xvYmFsQ29uZmlnID0gY29uZmlnQ29udGV4dC5nbG9iYWxDb25maWc7XG4gIHZhciBpc2xpZGF0ZVBvcG92ZXIgPSAoX2EgPSB2YWxpZGF0ZVBvcG92ZXIgIT09IG51bGwgJiYgdmFsaWRhdGVQb3BvdmVyICE9PSB2b2lkIDAgPyB2YWxpZGF0ZVBvcG92ZXIgOiBnbG9iYWxDb25maWcgPT09IG51bGwgfHwgZ2xvYmFsQ29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBnbG9iYWxDb25maWcubGlzdFZhbGlkYXRlUG9wb3ZlcikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdHJ1ZTtcbiAgdmFyIGNvbEhlYWRlclRleHQgPSBhY3Rpb25Db2x1bW5Qcm9wcy5jb2xIZWFkZXJUZXh0LFxuICAgIG90aGVyQWN0aW9uQ29sdW1uUHJvcHMgPSBfX3Jlc3QoYWN0aW9uQ29sdW1uUHJvcHMsIFtcImNvbEhlYWRlclRleHRcIl0pO1xuICB2YXIgaXRlbVNjaGVtYSA9ICgoX2IgPSBzY2hlbWEgPT09IG51bGwgfHwgc2NoZW1hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzY2hlbWEuaXRlbXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5wcm9wZXJ0aWVzKSB8fCB7fTtcbiAgdmFyIHBhZ2luYXRpb25Db25maWcgPSBPYmplY3QuYXNzaWduKHtcbiAgICBzaXplOiAnc21hbGwnLFxuICAgIGhpZGVPblNpbmdsZVBhZ2U6IHRydWVcbiAgfSwgcGFnaW5hdGlvbik7XG4gIHZhciBoYW5kbGVDb3B5ID0gZnVuY3Rpb24gaGFuZGxlQ29weShuYW1lKSB7XG4gICAgdmFyIHZhbHVlID0gZm9ybS5nZXRGaWVsZFZhbHVlKHJvb3RQYXRoLmNvbmNhdChuYW1lKSk7XG4gICAgY29weUl0ZW0odmFsdWUpO1xuICB9O1xuICB2YXIgY29sdW1ucyA9IHNvcnRQcm9wZXJ0aWVzKE9iamVjdC5lbnRyaWVzKGl0ZW1TY2hlbWEpKS5tYXAoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgX3JlZjIgPSBfc2xpY2VkVG9BcnJheShfcmVmLCAyKSxcbiAgICAgIGRhdGFJbmRleCA9IF9yZWYyWzBdLFxuICAgICAgaXRlbSA9IF9yZWYyWzFdO1xuICAgIHZhciByZXF1aXJlZCA9IGl0ZW0ucmVxdWlyZWQsXG4gICAgICB0aXRsZSA9IGl0ZW0udGl0bGUsXG4gICAgICB3aWR0aCA9IGl0ZW0ud2lkdGgsXG4gICAgICB0b29sdGlwID0gaXRlbS50b29sdGlwO1xuICAgIHZhciB0b29sdGlwUHJvcHMgPSBnZXRUb29sdGlwKHRvb2x0aXApO1xuICAgIHJldHVybiB7XG4gICAgICBkYXRhSW5kZXg6IGRhdGFJbmRleCxcbiAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgIHRpdGxlOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgcmVxdWlyZWQgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICBjb2xvcjogJ3JlZCcsXG4gICAgICAgICAgbWFyZ2luUmlnaHQ6ICczcHgnXG4gICAgICAgIH1cbiAgICAgIH0sIFwiKlwiKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIHRpdGxlKSwgdG9vbHRpcFByb3BzICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Ub29sdGlwLCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgcGxhY2VtZW50OiAndG9wJ1xuICAgICAgfSwgdG9vbHRpcFByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0luZm9DaXJjbGVPdXRsaW5lZCwge1xuICAgICAgICBzdHlsZToge1xuICAgICAgICAgIG1hcmdpbkxlZnQ6IDZcbiAgICAgICAgfVxuICAgICAgfSkpKSxcbiAgICAgIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKF8sIGZpZWxkKSB7XG4gICAgICAgIHZhciBmaWVsZFNjaGVtYSA9IHtcbiAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiBfZGVmaW5lUHJvcGVydHkoe30sIGRhdGFJbmRleCwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBpdGVtU2NoZW1hW2RhdGFJbmRleF0pLCB7XG4gICAgICAgICAgICBmaWVsZENvbDogMjRcbiAgICAgICAgICB9KSlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFpc2xpZGF0ZVBvcG92ZXIpIHtcbiAgICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiAnZnItdGFibGUtY2VsbC1jb250ZW50J1xuICAgICAgICAgIH0sIHJlbmRlckNvcmUoe1xuICAgICAgICAgICAgcGFyZW50UGF0aDogW2ZpZWxkLm5hbWVdLFxuICAgICAgICAgICAgcm9vdFBhdGg6IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocm9vdFBhdGgpLCBbZmllbGQubmFtZV0pLFxuICAgICAgICAgICAgc2NoZW1hOiBmaWVsZFNjaGVtYVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVGFibGVDZWxsLCB7XG4gICAgICAgICAgcmVuZGVyQ29yZTogcmVuZGVyQ29yZSxcbiAgICAgICAgICBzY2hlbWE6IGZpZWxkU2NoZW1hLFxuICAgICAgICAgIHBhcmVudFBhdGg6IFtmaWVsZC5uYW1lXSxcbiAgICAgICAgICByb290UGF0aDogW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShyb290UGF0aCksIFtmaWVsZC5uYW1lXSksXG4gICAgICAgICAgZGF0YUluZGV4OiBkYXRhSW5kZXhcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG4gIGlmICghcmVhZE9ubHkpIHtcbiAgICBjb2x1bW5zLnB1c2goT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgIHRpdGxlOiBjb2xIZWFkZXJUZXh0LFxuICAgICAgd2lkdGg6ICcxOTBweCcsXG4gICAgICBmaXhlZDogJ3JpZ2h0J1xuICAgIH0sIG90aGVyQWN0aW9uQ29sdW1uUHJvcHMpLCB7XG4gICAgICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihfLCBmaWVsZCkge1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0Zvcm0uSXRlbSwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1NwYWNlLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiAnZnItbGlzdC1pdGVtLW9wZXJhdGUnLFxuICAgICAgICAgIHNwbGl0OiBvcGVyYXRlQnRuVHlwZSAhPT0gJ2ljb24nICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9EaXZpZGVyLCB7XG4gICAgICAgICAgICB0eXBlOiAndmVydGljYWwnXG4gICAgICAgICAgfSlcbiAgICAgICAgfSwgIWhpZGVNb3ZlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGQnV0dG9uLCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICBkaXNhYmxlZDogZmllbGQubmFtZSA9PT0gMCxcbiAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICAgICAgcmV0dXJuIG1vdmVJdGVtKGZpZWxkLm5hbWUsIGZpZWxkLm5hbWUgLSAxKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGljb246IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9BcnJvd1VwT3V0bGluZWQsIG51bGwpXG4gICAgICAgIH0sIG1vdmVVcEJ0blByb3BzKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZCdXR0b24sIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgIGRpc2FibGVkOiBmaWVsZC5uYW1lID09PSBmaWVsZHMubGVuZ3RoIC0gMSxcbiAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICAgICAgcmV0dXJuIG1vdmVJdGVtKGZpZWxkLm5hbWUsIGZpZWxkLm5hbWUgKyAxKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGljb246IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9BcnJvd0Rvd25PdXRsaW5lZCwgbnVsbClcbiAgICAgICAgfSwgbW92ZURvd25CdG5Qcm9wcykpKSwgIWhpZGVEZWxldGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1BvcGNvbmZpcm0sIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgIG9uQ29uZmlybTogZnVuY3Rpb24gb25Db25maXJtKCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlbW92ZUl0ZW0oZmllbGQubmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBkZWxDb25maXJtUHJvcHMpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGQnV0dG9uLCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICBpY29uOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfQ2xvc2VPdXRsaW5lZCwgbnVsbCksXG4gICAgICAgICAgYnRuVHlwZTogb3BlcmF0ZUJ0blR5cGVcbiAgICAgICAgfSwgZGVsZXRlQnRuUHJvcHMpKSksICFoaWRlQ29weSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGQnV0dG9uLCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUNvcHkoZmllbGQubmFtZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBpY29uOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfQ29weU91dGxpbmVkLCBudWxsKVxuICAgICAgICB9LCBjb3B5QnRuUHJvcHMpKSkpO1xuICAgICAgfVxuICAgIH0pKTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcygnZnItdGFibGUtbGlzdCcsIHtcbiAgICAgICdmci10YWJsZS1saXN0LW5vLXBvcG92ZXInOiAhaXNsaWRhdGVQb3BvdmVyXG4gICAgfSlcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1RhYmxlLCB7XG4gICAgc2l6ZTogJ21pZGRsZScsXG4gICAgY29sdW1uczogY29sdW1ucyxcbiAgICBkYXRhU291cmNlOiBmaWVsZHMsXG4gICAgcGFnaW5hdGlvbjogcGFnaW5hdGlvbkNvbmZpZyxcbiAgICBzY3JvbGw6IHtcbiAgICAgIHg6ICdtYXgtY29udGVudCdcbiAgICB9LFxuICAgIHN0eWxlOiB7XG4gICAgICBtYXJnaW5Cb3R0b206ICcxMnB4J1xuICAgIH1cbiAgfSksICghc2NoZW1hLm1heCB8fCBmaWVsZHMubGVuZ3RoIDwgc2NoZW1hLm1heCkgJiYgIWhpZGVBZGQgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0J1dHRvbiwgT2JqZWN0LmFzc2lnbih7XG4gICAgaWNvbjogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1BsdXNPdXRsaW5lZCwgbnVsbCksXG4gICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgIHJldHVybiBhZGRJdGVtKCk7XG4gICAgfVxuICB9LCBhZGRCdG5Qcm9wcykpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBUYWJsZUxpc3Q7IiwiaW1wb3J0IFwiYW50ZC9lcy9idXR0b24vc3R5bGVcIjtcbmltcG9ydCBfQnV0dG9uIGZyb20gXCJhbnRkL2VzL2J1dHRvblwiO1xuaW1wb3J0IFwiYW50ZC9lcy9zcGFjZS9zdHlsZVwiO1xuaW1wb3J0IF9TcGFjZSBmcm9tIFwiYW50ZC9lcy9zcGFjZVwiO1xuaW1wb3J0IFwiYW50ZC9lcy9kcmF3ZXIvc3R5bGVcIjtcbmltcG9ydCBfRHJhd2VyIGZyb20gXCJhbnRkL2VzL2RyYXdlclwiO1xuaW1wb3J0IFwiYW50ZC9lcy9jb25maWctcHJvdmlkZXIvc3R5bGVcIjtcbmltcG9ydCBfQ29uZmlnUHJvdmlkZXIgZnJvbSBcImFudGQvZXMvY29uZmlnLXByb3ZpZGVyXCI7XG5pbXBvcnQgUmVhY3QsIHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBGUmVuZGVyLCB7IHVzZUZvcm0gfSBmcm9tICcuLi8uLi9pbmRleCc7XG5pbXBvcnQgeyB0cmFuc2xhdGlvbiB9IGZyb20gJy4uL3V0aWxzJztcbnZhciBEcmF3ZXJGb3JtID0gZnVuY3Rpb24gRHJhd2VyRm9ybShwcm9wcykge1xuICB2YXIgc2NoZW1hID0gcHJvcHMuc2NoZW1hLFxuICAgIHdpZGdldHMgPSBwcm9wcy53aWRnZXRzLFxuICAgIG9uQ2xvc2UgPSBwcm9wcy5vbkNsb3NlLFxuICAgIGRhdGEgPSBwcm9wcy5kYXRhLFxuICAgIGNvbmZpZ0NvbnRleHQgPSBwcm9wcy5jb25maWdDb250ZXh0O1xuICB2YXIgZm9ybSA9IHVzZUZvcm0oKTtcbiAgdmFyIGNvbmZpZ0N0eCA9IHVzZUNvbnRleHQoX0NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnRleHQpO1xuICB2YXIgdCA9IHRyYW5zbGF0aW9uKGNvbmZpZ0N0eCk7XG4gIHZhciBoYW5kbGVGaW5pc2ggPSBmdW5jdGlvbiBoYW5kbGVGaW5pc2goZGF0YSkge1xuICAgIG9uQ2xvc2UoZGF0YSk7XG4gIH07XG4gIHZhciBoYW5kbGVDbG9zZSA9IGZ1bmN0aW9uIGhhbmRsZUNsb3NlKCkge1xuICAgIG9uQ2xvc2UoKTtcbiAgfTtcbiAgdmFyIGRyYXdlclByb3BzID0ge1xuICAgIHZpc2libGU6IHRydWVcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9EcmF3ZXIsIE9iamVjdC5hc3NpZ24oe30sIGRyYXdlclByb3BzLCB7XG4gICAgd2lkdGg6IDYwMCxcbiAgICB0aXRsZTogdCgnb3BlcmF0ZScpLFxuICAgIG9wZW46IHRydWUsXG4gICAgb25DbG9zZTogaGFuZGxlQ2xvc2UsXG4gICAgZXh0cmE6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9TcGFjZSwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0J1dHRvbiwge1xuICAgICAgb25DbGljazogaGFuZGxlQ2xvc2VcbiAgICB9LCB0KCdjYW5jZWwnKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9CdXR0b24sIHtcbiAgICAgIHR5cGU6IFwicHJpbWFyeVwiLFxuICAgICAgb25DbGljazogZm9ybS5zdWJtaXRcbiAgICB9LCB0KCdjb25maXJtJykpKVxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRlJlbmRlciwge1xuICAgIHNjaGVtYTogc2NoZW1hLml0ZW1zLFxuICAgIGluaXRpYWxWYWx1ZXM6IGRhdGEsXG4gICAgZm9ybTogZm9ybSxcbiAgICBsYWJlbENvbDoge1xuICAgICAgc3BhbjogOFxuICAgIH0sXG4gICAgd2lkZ2V0czogd2lkZ2V0cyxcbiAgICBvbkZpbmlzaDogaGFuZGxlRmluaXNoLFxuICAgIGxvY2FsZTogY29uZmlnQ29udGV4dCA9PT0gbnVsbCB8fCBjb25maWdDb250ZXh0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWdDb250ZXh0LmxvY2FsZSxcbiAgICBtYXhXaWR0aDogJ2F1dG8nXG4gIH0pKTtcbn07XG5leHBvcnQgZGVmYXVsdCBEcmF3ZXJGb3JtOyIsImZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9LCBfdHlwZW9mKG9iaik7IH1cbmltcG9ydCBfUGx1c091dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9saWIvaWNvbnMvUGx1c091dGxpbmVkXCI7XG5pbXBvcnQgXCJhbnRkL2VzL2J1dHRvbi9zdHlsZVwiO1xuaW1wb3J0IF9CdXR0b24gZnJvbSBcImFudGQvZXMvYnV0dG9uXCI7XG5pbXBvcnQgXCJhbnRkL2VzL3RhYmxlL3N0eWxlXCI7XG5pbXBvcnQgX1RhYmxlIGZyb20gXCJhbnRkL2VzL3RhYmxlXCI7XG5pbXBvcnQgX0NvcHlPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0NvcHlPdXRsaW5lZFwiO1xuaW1wb3J0IF9DbG9zZU91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9saWIvaWNvbnMvQ2xvc2VPdXRsaW5lZFwiO1xuaW1wb3J0IFwiYW50ZC9lcy9wb3Bjb25maXJtL3N0eWxlXCI7XG5pbXBvcnQgX1BvcGNvbmZpcm0gZnJvbSBcImFudGQvZXMvcG9wY29uZmlybVwiO1xuaW1wb3J0IF9BcnJvd0Rvd25PdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0Fycm93RG93bk91dGxpbmVkXCI7XG5pbXBvcnQgX0Fycm93VXBPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0Fycm93VXBPdXRsaW5lZFwiO1xuaW1wb3J0IFwiYW50ZC9lcy9kaXZpZGVyL3N0eWxlXCI7XG5pbXBvcnQgX0RpdmlkZXIgZnJvbSBcImFudGQvZXMvZGl2aWRlclwiO1xuaW1wb3J0IFwiYW50ZC9lcy9zcGFjZS9zdHlsZVwiO1xuaW1wb3J0IF9TcGFjZSBmcm9tIFwiYW50ZC9lcy9zcGFjZVwiO1xuaW1wb3J0IFwiYW50ZC9lcy9mb3JtL3N0eWxlXCI7XG5pbXBvcnQgX0Zvcm0gZnJvbSBcImFudGQvZXMvZm9ybVwiO1xuaW1wb3J0IF9JbmZvQ2lyY2xlT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2xpYi9pY29ucy9JbmZvQ2lyY2xlT3V0bGluZWRcIjtcbmltcG9ydCBcImFudGQvZXMvdG9vbHRpcC9zdHlsZVwiO1xuaW1wb3J0IF9Ub29sdGlwIGZyb20gXCJhbnRkL2VzL3Rvb2x0aXBcIjtcbmltcG9ydCBcImFudGQvZXMvY29uZmlnLXByb3ZpZGVyL3N0eWxlXCI7XG5pbXBvcnQgX0NvbmZpZ1Byb3ZpZGVyIGZyb20gXCJhbnRkL2VzL2NvbmZpZy1wcm92aWRlclwiO1xuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KGFyZykgeyB2YXIga2V5ID0gX3RvUHJpbWl0aXZlKGFyZywgXCJzdHJpbmdcIik7IHJldHVybiBfdHlwZW9mKGtleSkgPT09IFwic3ltYm9sXCIgPyBrZXkgOiBTdHJpbmcoa2V5KTsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKGlucHV0LCBoaW50KSB7IGlmIChfdHlwZW9mKGlucHV0KSAhPT0gXCJvYmplY3RcIiB8fCBpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIGlucHV0OyB2YXIgcHJpbSA9IGlucHV0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmIChwcmltICE9PSB1bmRlZmluZWQpIHsgdmFyIHJlcyA9IHByaW0uY2FsbChpbnB1dCwgaGludCB8fCBcImRlZmF1bHRcIik7IGlmIChfdHlwZW9mKHJlcykgIT09IFwib2JqZWN0XCIpIHJldHVybiByZXM7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKGhpbnQgPT09IFwic3RyaW5nXCIgPyBTdHJpbmcgOiBOdW1iZXIpKGlucHV0KTsgfVxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOyB9XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHsgaWYgKHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgaXRlcltTeW1ib2wuaXRlcmF0b3JdICE9IG51bGwgfHwgaXRlcltcIkBAaXRlcmF0b3JcIl0gIT0gbnVsbCkgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7IH1cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KGFycik7IH1cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpOyB9XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07IHJldHVybiBhcnIyOyB9XG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7IHZhciBfaSA9IG51bGwgPT0gYXJyID8gbnVsbCA6IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiBhcnJbU3ltYm9sLml0ZXJhdG9yXSB8fCBhcnJbXCJAQGl0ZXJhdG9yXCJdOyBpZiAobnVsbCAhPSBfaSkgeyB2YXIgX3MsIF9lLCBfeCwgX3IsIF9hcnIgPSBbXSwgX24gPSAhMCwgX2QgPSAhMTsgdHJ5IHsgaWYgKF94ID0gKF9pID0gX2kuY2FsbChhcnIpKS5uZXh0LCAwID09PSBpKSB7IGlmIChPYmplY3QoX2kpICE9PSBfaSkgcmV0dXJuOyBfbiA9ICExOyB9IGVsc2UgZm9yICg7ICEoX24gPSAoX3MgPSBfeC5jYWxsKF9pKSkuZG9uZSkgJiYgKF9hcnIucHVzaChfcy52YWx1ZSksIF9hcnIubGVuZ3RoICE9PSBpKTsgX24gPSAhMCk7IH0gY2F0Y2ggKGVycikgeyBfZCA9ICEwLCBfZSA9IGVycjsgfSBmaW5hbGx5IHsgdHJ5IHsgaWYgKCFfbiAmJiBudWxsICE9IF9pLnJldHVybiAmJiAoX3IgPSBfaS5yZXR1cm4oKSwgT2JqZWN0KF9yKSAhPT0gX3IpKSByZXR1cm47IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfSB9XG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cbmltcG9ydCB7IF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VSZWYsIHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRm9ybURyYXdlciBmcm9tICcuL2RyYXdlckZvcm0nO1xuaW1wb3J0IEZCdXR0b24gZnJvbSAnLi4vY29tcG9uZW50cy9GQnV0dG9uJztcbmltcG9ydCB7IHRyYW5zbGF0aW9uIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IFwiLi9pbmRleC5jc3NcIjtcbjtcbnZhciBnZXRUb29sdGlwID0gZnVuY3Rpb24gZ2V0VG9vbHRpcCh0b29sdGlwKSB7XG4gIGlmICghdG9vbHRpcCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodHlwZW9mIHRvb2x0aXAgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRpdGxlOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xuICAgICAgICAgIF9faHRtbDogdG9vbHRpcFxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdG9vbHRpcCksIHtcbiAgICB0aXRsZTogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XG4gICAgICAgIF9faHRtbDogdG9vbHRpcC50aXRsZVxuICAgICAgfVxuICAgIH0pXG4gIH0pO1xufTtcbnZhciBUYWJsZUxpc3QgPSBmdW5jdGlvbiBUYWJsZUxpc3QocHJvcHMpIHtcbiAgdmFyIF9hO1xuICB2YXIgZm9ybSA9IHByb3BzLmZvcm0sXG4gICAgc2NoZW1hID0gcHJvcHMuc2NoZW1hLFxuICAgIGZpZWxkcyA9IHByb3BzLmZpZWxkcyxcbiAgICByb290UGF0aCA9IHByb3BzLnJvb3RQYXRoLFxuICAgIHJlbmRlckNvcmUgPSBwcm9wcy5yZW5kZXJDb3JlLFxuICAgIHJlYWRPbmx5ID0gcHJvcHMucmVhZE9ubHksXG4gICAgd2lkZ2V0cyA9IHByb3BzLndpZGdldHMsXG4gICAgcGFnaW5hdGlvbiA9IHByb3BzLnBhZ2luYXRpb24sXG4gICAgb3BlcmF0ZUJ0blR5cGUgPSBwcm9wcy5vcGVyYXRlQnRuVHlwZSxcbiAgICBhZGRCdG5Qcm9wcyA9IHByb3BzLmFkZEJ0blByb3BzLFxuICAgIGRlbENvbmZpcm1Qcm9wcyA9IHByb3BzLmRlbENvbmZpcm1Qcm9wcyxcbiAgICBjb3B5QnRuUHJvcHMgPSBwcm9wcy5jb3B5QnRuUHJvcHMsXG4gICAgZGVsZXRlQnRuUHJvcHMgPSBwcm9wcy5kZWxldGVCdG5Qcm9wcyxcbiAgICBtb3ZlVXBCdG5Qcm9wcyA9IHByb3BzLm1vdmVVcEJ0blByb3BzLFxuICAgIG1vdmVEb3duQnRuUHJvcHMgPSBwcm9wcy5tb3ZlRG93bkJ0blByb3BzLFxuICAgIGFjdGlvbkNvbHVtblByb3BzID0gcHJvcHMuYWN0aW9uQ29sdW1uUHJvcHMsXG4gICAgZWRpdG9yQnRuUHJvcHMgPSBwcm9wcy5lZGl0b3JCdG5Qcm9wcyxcbiAgICBoaWRlRGVsZXRlID0gcHJvcHMuaGlkZURlbGV0ZSxcbiAgICBoaWRlQ29weSA9IHByb3BzLmhpZGVDb3B5LFxuICAgIGhpZGVNb3ZlID0gcHJvcHMuaGlkZU1vdmUsXG4gICAgaGlkZUFkZCA9IHByb3BzLmhpZGVBZGQsXG4gICAgaGlkZUVkaXQgPSBwcm9wcy5oaWRlRWRpdCxcbiAgICBhZGRJdGVtID0gcHJvcHMuYWRkSXRlbSxcbiAgICBjb3B5SXRlbSA9IHByb3BzLmNvcHlJdGVtLFxuICAgIG1vdmVJdGVtID0gcHJvcHMubW92ZUl0ZW0sXG4gICAgcmVtb3ZlSXRlbSA9IHByb3BzLnJlbW92ZUl0ZW0sXG4gICAgY29uZmlnQ29udGV4dCA9IHByb3BzLmNvbmZpZ0NvbnRleHQ7XG4gIHZhciBjb2xIZWFkZXJUZXh0ID0gYWN0aW9uQ29sdW1uUHJvcHMuY29sSGVhZGVyVGV4dCxcbiAgICBvdGhlckFjdGlvbkNvbHVtblByb3BzID0gX19yZXN0KGFjdGlvbkNvbHVtblByb3BzLCBbXCJjb2xIZWFkZXJUZXh0XCJdKTtcbiAgdmFyIGNvbmZpZ0N0eCA9IHVzZUNvbnRleHQoX0NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnRleHQpO1xuICB2YXIgdCA9IHRyYW5zbGF0aW9uKGNvbmZpZ0N0eCk7XG4gIHZhciBwYWdpbmF0aW9uQ29uZmlnID0gT2JqZWN0LmFzc2lnbih7XG4gICAgc2l6ZTogJ3NtYWxsJyxcbiAgICBoaWRlT25TaW5nbGVQYWdlOiB0cnVlXG4gIH0sIHBhZ2luYXRpb24pO1xuICB2YXIgY29sdW1uU2NoZW1hID0gKChfYSA9IHNjaGVtYSA9PT0gbnVsbCB8fCBzY2hlbWEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNjaGVtYS5pdGVtcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnByb3BlcnRpZXMpIHx8IHt9O1xuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoZmFsc2UpLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIHZpc2libGUgPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldFZpc2libGUgPSBfdXNlU3RhdGUyWzFdO1xuICB2YXIgX3VzZVN0YXRlMyA9IHVzZVN0YXRlKG51bGwpLFxuICAgIF91c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUzLCAyKSxcbiAgICBpdGVtRGF0YSA9IF91c2VTdGF0ZTRbMF0sXG4gICAgc2V0SXRlbURhdGEgPSBfdXNlU3RhdGU0WzFdO1xuICB2YXIgaW5kZXhSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciBoYW5kbGVDb3B5ID0gZnVuY3Rpb24gaGFuZGxlQ29weShuYW1lKSB7XG4gICAgdmFyIHZhbHVlID0gZm9ybS5nZXRGaWVsZFZhbHVlKHJvb3RQYXRoLmNvbmNhdChuYW1lKSk7XG4gICAgY29weUl0ZW0odmFsdWUpO1xuICB9O1xuICB2YXIgaGFuZGxlQWRkID0gZnVuY3Rpb24gaGFuZGxlQWRkKCkge1xuICAgIGluZGV4UmVmLmN1cnJlbnQgPSAtMTtcbiAgICBzZXRWaXNpYmxlKHRydWUpO1xuICB9O1xuICB2YXIgaGFuZGxlRHJhd2VyQ2xvc2UgPSBmdW5jdGlvbiBoYW5kbGVEcmF3ZXJDbG9zZShkYXRhKSB7XG4gICAgc2V0VmlzaWJsZShmYWxzZSk7XG4gICAgc2V0SXRlbURhdGEobnVsbCk7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpbmRleFJlZi5jdXJyZW50ID09PSAtMSkge1xuICAgICAgYWRkSXRlbShkYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybS5zZXRGaWVsZFZhbHVlKFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocm9vdFBhdGgpLCBbaW5kZXhSZWYuY3VycmVudF0pLCBkYXRhKTtcbiAgICB9XG4gICAgaW5kZXhSZWYuY3VycmVudCA9PT0gbnVsbDtcbiAgfTtcbiAgdmFyIGNvbHVtbnMgPSBPYmplY3Qua2V5cyhjb2x1bW5TY2hlbWEpLm1hcChmdW5jdGlvbiAoZGF0YUluZGV4KSB7XG4gICAgdmFyIF9jb2x1bW5TY2hlbWEkZGF0YUluZCA9IGNvbHVtblNjaGVtYVtkYXRhSW5kZXhdLFxuICAgICAgdGl0bGUgPSBfY29sdW1uU2NoZW1hJGRhdGFJbmQudGl0bGUsXG4gICAgICB0b29sdGlwID0gX2NvbHVtblNjaGVtYSRkYXRhSW5kLnRvb2x0aXAsXG4gICAgICB3aWR0aCA9IF9jb2x1bW5TY2hlbWEkZGF0YUluZC53aWR0aDtcbiAgICB2YXIgdG9vbHRpcFByb3BzID0gZ2V0VG9vbHRpcCh0b29sdGlwKTtcbiAgICByZXR1cm4ge1xuICAgICAgZGF0YUluZGV4OiBkYXRhSW5kZXgsXG4gICAgICB3aWR0aDogd2lkdGgsXG4gICAgICB0aXRsZTogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCB0aXRsZSksIHRvb2x0aXBQcm9wcyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIHBsYWNlbWVudDogJ3RvcCdcbiAgICAgIH0sIHRvb2x0aXBQcm9wcyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9JbmZvQ2lyY2xlT3V0bGluZWQsIHtcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICBtYXJnaW5MZWZ0OiA2XG4gICAgICAgIH1cbiAgICAgIH0pKSksXG4gICAgICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihfLCBmaWVsZCkge1xuICAgICAgICB2YXIgZmllbGRTY2hlbWEgPSB7XG4gICAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgICAgcHJvcGVydGllczogX2RlZmluZVByb3BlcnR5KHt9LCBkYXRhSW5kZXgsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY29sdW1uU2NoZW1hW2RhdGFJbmRleF0pLCB7XG4gICAgICAgICAgICBub1N0eWxlOiB0cnVlLFxuICAgICAgICAgICAgcmVhZE9ubHk6IHRydWVcbiAgICAgICAgICB9KSlcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHJlbmRlckNvcmUoe1xuICAgICAgICAgIHNjaGVtYTogZmllbGRTY2hlbWEsXG4gICAgICAgICAgcGFyZW50UGF0aDogW2ZpZWxkLm5hbWVdLFxuICAgICAgICAgIHJvb3RQYXRoOiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHJvb3RQYXRoKSwgW2ZpZWxkLm5hbWVdKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcbiAgaWYgKCFyZWFkT25seSkge1xuICAgIGNvbHVtbnMucHVzaChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAgICAgdGl0bGU6IGNvbEhlYWRlclRleHQsXG4gICAgICB3aWR0aDogJzE5MHB4JyxcbiAgICAgIGZpeGVkOiAncmlnaHQnXG4gICAgfSwgb3RoZXJBY3Rpb25Db2x1bW5Qcm9wcyksIHtcbiAgICAgIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKF8sIGZpZWxkKSB7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfRm9ybS5JdGVtLCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfU3BhY2UsIHtcbiAgICAgICAgICBjbGFzc05hbWU6ICdmci1saXN0LWl0ZW0tb3BlcmF0ZScsXG4gICAgICAgICAgc3BsaXQ6IG9wZXJhdGVCdG5UeXBlICE9PSAnaWNvbicgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0RpdmlkZXIsIHtcbiAgICAgICAgICAgIHR5cGU6ICd2ZXJ0aWNhbCdcbiAgICAgICAgICB9KVxuICAgICAgICB9LCAhaGlkZU1vdmUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZCdXR0b24sIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgIGRpc2FibGVkOiBmaWVsZC5uYW1lID09PSAwLFxuICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgICAgICByZXR1cm4gbW92ZUl0ZW0oZmllbGQubmFtZSwgZmllbGQubmFtZSAtIDEpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgaWNvbjogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0Fycm93VXBPdXRsaW5lZCwgbnVsbClcbiAgICAgICAgfSwgbW92ZVVwQnRuUHJvcHMpKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgZGlzYWJsZWQ6IGZpZWxkLm5hbWUgPT09IGZpZWxkcy5sZW5ndGggLSAxLFxuICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgICAgICByZXR1cm4gbW92ZUl0ZW0oZmllbGQubmFtZSwgZmllbGQubmFtZSArIDEpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgaWNvbjogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0Fycm93RG93bk91dGxpbmVkLCBudWxsKVxuICAgICAgICB9LCBtb3ZlRG93bkJ0blByb3BzKSkpLCAhaGlkZURlbGV0ZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfUG9wY29uZmlybSwgT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgb25Db25maXJtOiBmdW5jdGlvbiBvbkNvbmZpcm0oKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVtb3ZlSXRlbShmaWVsZC5uYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIGRlbENvbmZpcm1Qcm9wcyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZCdXR0b24sIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgIGljb246IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9DbG9zZU91dGxpbmVkLCBudWxsKSxcbiAgICAgICAgICBidG5UeXBlOiBvcGVyYXRlQnRuVHlwZVxuICAgICAgICB9LCBkZWxldGVCdG5Qcm9wcykpKSwgIWhpZGVDb3B5ICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZCdXR0b24sIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlQ29weShmaWVsZC5uYW1lKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGljb246IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Db3B5T3V0bGluZWQsIG51bGwpXG4gICAgICAgIH0sIGNvcHlCdG5Qcm9wcykpLCAhaGlkZUVkaXQgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgICAgIHNldFZpc2libGUodHJ1ZSk7XG4gICAgICAgICAgICBpbmRleFJlZi5jdXJyZW50ID0gZmllbGQubmFtZTtcbiAgICAgICAgICAgIHNldEl0ZW1EYXRhKGZvcm0uZ2V0RmllbGRWYWx1ZShyb290UGF0aC5jb25jYXQoZmllbGQubmFtZSkpKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGljb246IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Db3B5T3V0bGluZWQsIG51bGwpXG4gICAgICAgIH0sIGVkaXRvckJ0blByb3BzKSkpKTtcbiAgICAgIH1cbiAgICB9KSk7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6ICdmci1saXN0LWRyYXdlcidcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1RhYmxlLCB7XG4gICAgc2l6ZTogJ21pZGRsZScsXG4gICAgZGF0YVNvdXJjZTogZmllbGRzLFxuICAgIGNvbHVtbnM6IGNvbHVtbnMsXG4gICAgc3R5bGU6IHtcbiAgICAgIG1hcmdpbkJvdHRvbTogJzEycHgnXG4gICAgfSxcbiAgICBzY3JvbGw6IHtcbiAgICAgIHg6ICdtYXgtY29udGVudCdcbiAgICB9LFxuICAgIHBhZ2luYXRpb246IHBhZ2luYXRpb25Db25maWdcbiAgfSksICghc2NoZW1hLm1heCB8fCBmaWVsZHMubGVuZ3RoIDwgc2NoZW1hLm1heCkgJiYgIWhpZGVBZGQgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0J1dHRvbiwgT2JqZWN0LmFzc2lnbih7XG4gICAgaWNvbjogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1BsdXNPdXRsaW5lZCwgbnVsbCksXG4gICAgb25DbGljazogaGFuZGxlQWRkXG4gIH0sIGFkZEJ0blByb3BzKSksIHZpc2libGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRm9ybURyYXdlciwge1xuICAgIHNjaGVtYTogc2NoZW1hLFxuICAgIGRhdGE6IGl0ZW1EYXRhLFxuICAgIHdpZGdldHM6IHdpZGdldHMsXG4gICAgY29uZmlnQ29udGV4dDogY29uZmlnQ29udGV4dCxcbiAgICBvbkNsb3NlOiBoYW5kbGVEcmF3ZXJDbG9zZVxuICB9KSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgVGFibGVMaXN0OyIsImltcG9ydCBcImFudGQvZXMvcG9wb3Zlci9zdHlsZVwiO1xuaW1wb3J0IF9Qb3BvdmVyIGZyb20gXCJhbnRkL2VzL3BvcG92ZXJcIjtcbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpOyB9XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07IHJldHVybiBhcnIyOyB9XG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7IHZhciBfaSA9IG51bGwgPT0gYXJyID8gbnVsbCA6IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiBhcnJbU3ltYm9sLml0ZXJhdG9yXSB8fCBhcnJbXCJAQGl0ZXJhdG9yXCJdOyBpZiAobnVsbCAhPSBfaSkgeyB2YXIgX3MsIF9lLCBfeCwgX3IsIF9hcnIgPSBbXSwgX24gPSAhMCwgX2QgPSAhMTsgdHJ5IHsgaWYgKF94ID0gKF9pID0gX2kuY2FsbChhcnIpKS5uZXh0LCAwID09PSBpKSB7IGlmIChPYmplY3QoX2kpICE9PSBfaSkgcmV0dXJuOyBfbiA9ICExOyB9IGVsc2UgZm9yICg7ICEoX24gPSAoX3MgPSBfeC5jYWxsKF9pKSkuZG9uZSkgJiYgKF9hcnIucHVzaChfcy52YWx1ZSksIF9hcnIubGVuZ3RoICE9PSBpKTsgX24gPSAhMCk7IH0gY2F0Y2ggKGVycikgeyBfZCA9ICEwLCBfZSA9IGVycjsgfSBmaW5hbGx5IHsgdHJ5IHsgaWYgKCFfbiAmJiBudWxsICE9IF9pLnJldHVybiAmJiAoX3IgPSBfaS5yZXR1cm4oKSwgT2JqZWN0KF9yKSAhPT0gX3IpKSByZXR1cm47IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfSB9XG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cbmltcG9ydCB7IF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG52YXIgVmlydHVhbENlbGwgPSBmdW5jdGlvbiBWaXJ0dWFsQ2VsbChwcm9wcykge1xuICB2YXIgcmVuZGVyQ29yZSA9IHByb3BzLnJlbmRlckNvcmUsXG4gICAgc2NoZW1hID0gcHJvcHMuc2NoZW1hLFxuICAgIGRhdGFJbmRleCA9IHByb3BzLmRhdGFJbmRleCxcbiAgICBvdGhlclByb3BzID0gX19yZXN0KHByb3BzLCBbXCJyZW5kZXJDb3JlXCIsIFwic2NoZW1hXCIsIFwiZGF0YUluZGV4XCJdKTtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKG51bGwpLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIGVycm9yTXNnID0gX3VzZVN0YXRlMlswXSxcbiAgICBzZXRFcnJvck1zZyA9IF91c2VTdGF0ZTJbMV07XG4gIHZhciBfdXNlU3RhdGUzID0gdXNlU3RhdGUoKSxcbiAgICBfdXNlU3RhdGU0ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlMywgMiksXG4gICAgdmlzaWJsZSA9IF91c2VTdGF0ZTRbMF0sXG4gICAgc2V0VmlzaWJsZSA9IF91c2VTdGF0ZTRbMV07XG4gIHZhciBtb3VzZVJlZiA9IHVzZVJlZigpO1xuICB2YXIgb25TdGF0dXNDaGFuZ2UgPSBmdW5jdGlvbiBvblN0YXR1c0NoYW5nZShfLCBlcnJvcnMpIHtcbiAgICB2YXIgbWVzc2FnZSA9IGVycm9yc1swXSB8fCBudWxsO1xuICAgIHNldEVycm9yTXNnKG1lc3NhZ2UpO1xuICAgIGlmIChtb3VzZVJlZi5jdXJyZW50ICYmIG1lc3NhZ2UpIHtcbiAgICAgIHNldFZpc2libGUodHJ1ZSk7XG4gICAgfVxuICB9O1xuICBpZiAoIXNjaGVtYS5wcm9wZXJ0aWVzW2RhdGFJbmRleF0ub25TdGF0dXNDaGFuZ2UpIHtcbiAgICBzY2hlbWEucHJvcGVydGllc1tkYXRhSW5kZXhdLm9uU3RhdHVzQ2hhbmdlID0gb25TdGF0dXNDaGFuZ2U7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBvbk1vdXNlRW50ZXI6IGZ1bmN0aW9uIG9uTW91c2VFbnRlcigpIHtcbiAgICAgIG1vdXNlUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgc2V0VmlzaWJsZSh0cnVlKTtcbiAgICB9LFxuICAgIG9uTW91c2VMZWF2ZTogZnVuY3Rpb24gb25Nb3VzZUxlYXZlKCkge1xuICAgICAgbW91c2VSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgc2V0VmlzaWJsZShmYWxzZSk7XG4gICAgfVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfUG9wb3Zlciwge1xuICAgIG92ZXJsYXlDbGFzc05hbWU6ICdmci1wb3BvdmVyLWVycm9yJyxcbiAgICBjb250ZW50OiBlcnJvck1zZyxcbiAgICBwbGFjZW1lbnQ6ICd0b3BSaWdodCcsXG4gICAgb3BlbjogdmlzaWJsZSAmJiBlcnJvck1zZ1xuICB9LCByZW5kZXJDb3JlKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3RoZXJQcm9wcyksIHtcbiAgICBzY2hlbWE6IHNjaGVtYVxuICB9KSkpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBWaXJ0dWFsQ2VsbDsiLCJmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfSwgX3R5cGVvZihvYmopOyB9XG52YXIgX2V4Y2x1ZGVkID0gW1wic3R5bGVcIiwgXCJjb250ZXh0XCJdLFxuICBfZXhjbHVkZWQyID0gW1wiY3R4XCJdO1xuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkoYXJnKSB7IHZhciBrZXkgPSBfdG9QcmltaXRpdmUoYXJnLCBcInN0cmluZ1wiKTsgcmV0dXJuIF90eXBlb2Yoa2V5KSA9PT0gXCJzeW1ib2xcIiA/IGtleSA6IFN0cmluZyhrZXkpOyB9XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUoaW5wdXQsIGhpbnQpIHsgaWYgKF90eXBlb2YoaW5wdXQpICE9PSBcIm9iamVjdFwiIHx8IGlucHV0ID09PSBudWxsKSByZXR1cm4gaW5wdXQ7IHZhciBwcmltID0gaW5wdXRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHByaW0gIT09IHVuZGVmaW5lZCkgeyB2YXIgcmVzID0gcHJpbS5jYWxsKGlucHV0LCBoaW50IHx8IFwiZGVmYXVsdFwiKTsgaWYgKF90eXBlb2YocmVzKSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHJlczsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoaGludCA9PT0gXCJzdHJpbmdcIiA/IFN0cmluZyA6IE51bWJlcikoaW5wdXQpOyB9XG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpOyB2YXIga2V5LCBpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyB2YXIga2V5LCBpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IHJldHVybiB0YXJnZXQ7IH1cbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuXG4vKlxyXG5UaGUgTUlUIExpY2Vuc2UgKE1JVClcclxuXHJcbkNvcHlyaWdodCAoYykgMjAxOSBodHRwczovL2dpdGh1Yi5jb20vd3Vib3N0Yy9cclxuXHJcblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XHJcblxyXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cclxuKi9cblxuaW1wb3J0IHsgdXNlUmVmLCB1c2VTdGF0ZSwgdXNlQ2FsbGJhY2ssIHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlSW1wZXJhdGl2ZUhhbmRsZSwgdXNlTGF5b3V0RWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuLyoqXHJcbiAqIFRIRSBFVkVOVFMgT0YgU0NST0xMSU5HLlxyXG4gKi9cbnZhciBTQ1JPTExFVlRfTlVMTCA9IDAgPDwgMDtcbnZhciBTQ1JPTExFVlRfSU5JVCA9IDEgPDwgMDtcbnZhciBTQ1JPTExFVlRfUkVDT01QVVRFID0gMSA8PCAxO1xudmFyIFNDUk9MTEVWVF9OQVRJVkUgPSAxIDw8IDM7XG52YXIgU0NST0xMRVZUX0JZX0hPT0sgPSAxIDw8IDY7XG5cbi8vIGFueSBldmVudHMgd2lsbCBiZSBgU0NST0xMRVZUX0JZX0hPT0tgIGlmIHRoZSBgY3R4LmZfdG9wID09PSAgVE9QX0NPTlRJTlVFYC5cbnZhciBUT1BfQ09OVElOVUUgPSAwO1xudmFyIFRPUF9ET05FID0gMTtcbi8qKlxyXG4gKiBgSU5JVGAgLT4gYExPQURFRGAgLT4gYFJVTk5JTkdgXHJcbiAqL1xudmFyIGVfVlRfU1RBVEU7XG4oZnVuY3Rpb24gKGVfVlRfU1RBVEUpIHtcbiAgZV9WVF9TVEFURVtlX1ZUX1NUQVRFW1wiSU5JVFwiXSA9IDFdID0gXCJJTklUXCI7XG4gIGVfVlRfU1RBVEVbZV9WVF9TVEFURVtcIkxPQURFRFwiXSA9IDJdID0gXCJMT0FERURcIjtcbiAgZV9WVF9TVEFURVtlX1ZUX1NUQVRFW1wiUlVOTklOR1wiXSA9IDRdID0gXCJSVU5OSU5HXCI7XG59KShlX1ZUX1NUQVRFIHx8IChlX1ZUX1NUQVRFID0ge30pKTtcbmZ1bmN0aW9uIGRlZmF1bHRfY29udGV4dCgpIHtcbiAgcmV0dXJuIHtcbiAgICB2dF9zdGF0ZTogZV9WVF9TVEFURS5JTklULFxuICAgIHBvc3NpYmxlX2hpZ2h0X3Blcl90cjogLTEsXG4gICAgY29tcHV0ZWRfaDogMCxcbiAgICByZV9jb21wdXRlZDogMCxcbiAgICByb3dfaGVpZ2h0OiBbXSxcbiAgICByb3dfY291bnQ6IDAsXG4gICAgcHJldl9yb3dfY291bnQ6IDAsXG4gICAgX29mZnNldF90b3A6IDAgfCAwLFxuICAgIF9vZmZzZXRfaGVhZDogMCB8IDAsXG4gICAgX29mZnNldF90YWlsOiAwIHwgMSxcbiAgICBXSDogMCxcbiAgICAvLyB0aGUgd3JhcHBlcidzIGhlaWdodFxuICAgIHRvcDogMCxcbiAgICBsZWZ0OiAwLFxuICAgIGV2dDogU0NST0xMRVZUX05VTEwsXG4gICAgZW5kOiBmYWxzZSxcbiAgICBmaW5hbF90b3A6IDAsXG4gICAgZl9maW5hbF90b3A6IFRPUF9ET05FLFxuICAgIHVwZGF0ZV9jb3VudDogMCxcbiAgICBpbmRleE1hcDogbmV3IFdlYWtNYXAoKSxcbiAgICBITkRfUEFJTlQ6IDAsXG4gICAgcmV0cnlfY291bnQ6IDVcbiAgfTtcbn1cblxuLyogb3ZlcmxvYWQgX19ESUFHTk9TSVNfXy4gKi9cbmZ1bmN0aW9uIGhlbHBlcl9kaWFnbm9zaXMoY3R4KSB7XG4gIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3R4LCAnQ0xJQ0t+X19ESUFHTk9TSVNfXycpKSByZXR1cm47XG4gIGZ1bmN0aW9uIGRpYWdub3NpcyhmbGFnKSB7XG4gICAgdmFyIGV4cGVjdF9oZWlnaHQgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3R4LnJvd19jb3VudDsgKytpKSB7XG4gICAgICBleHBlY3RfaGVpZ2h0ICs9IGN0eC5yb3dfaGVpZ2h0W2ldO1xuICAgIH1cbiAgICB2YXIgY29sb3IsIGV4cGxhaW47XG4gICAgaWYgKGV4cGVjdF9oZWlnaHQgPiBjdHguY29tcHV0ZWRfaCkge1xuICAgICAgY29sb3IgPSAnY29sb3I6cmdiKDE1LCAxNzksIDkpJzsgLy8gZ3JlZW5cbiAgICAgIGV4cGxhaW4gPSAnbG93ZXIgdGhhbiBleHBlY3RlZCc7XG4gICAgfSBlbHNlIGlmIChleHBlY3RfaGVpZ2h0IDwgY3R4LmNvbXB1dGVkX2gpIHtcbiAgICAgIGNvbG9yID0gJ2NvbG9yOnJnYigyMDIsIDYxLCA4MSknOyAvLyByZWRcbiAgICAgIGV4cGxhaW4gPSAnaGlnaGVyIHRoYW4gZXhwZWN0ZWQnO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb2xvciA9ICdjb2xvcjpyZ2JhKDAsIDAsIDAsIDAuODUpJztcbiAgICAgIGV4cGxhaW4gPSAnbm9ybWFsJztcbiAgICB9XG4gICAgdmFyIHJldCA9IGN0eC5jb21wdXRlZF9oIC0gZXhwZWN0X2hlaWdodDtcbiAgICBpZiAoZmxhZykge1xuICAgICAgY29uc29sZS5kZWJ1ZygnT29Pb09vTyBESUFHTk9TSVMgT29Pb09vTycpO1xuICAgICAgY29uc29sZS5kZWJ1ZyhcIiVjJWQoJWQpKFwiLmNvbmNhdChleHBsYWluLCBcIilcIiksIGNvbG9yLCBleHBlY3RfaGVpZ2h0LCBjdHguY29tcHV0ZWRfaCAtIGV4cGVjdF9oZWlnaHQpO1xuICAgICAgY29uc29sZS5kZWJ1ZygnT29Pb09vT29Pb09vT09vT29Pb09vT29PbycpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsICdDTElDS35fX0RJQUdOT1NJU19fJywge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgZGlhZ25vc2lzKHRydWUpO1xuICAgIH0sXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICB9KTtcbiAgZnVuY3Rpb24gY2IoKSB7XG4gICAgaWYgKGRpYWdub3NpcyhmYWxzZSkgIT09IDApIHtcbiAgICAgIHdpbmRvdy5hbGVydCgndnQ6IGFuIGVycm9yIG9jY3VycmVkIScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB3aW5kb3cucmVxdWVzdElkbGVDYWxsYmFjayA/IHdpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrKGNiKSA6IHdpbmRvdy5zZXRUaW1lb3V0KGNiKTtcbiAgfVxuICBjdHguZGVidWcgJiYgY2IoKTtcbn1cbmZ1bmN0aW9uIGxvZ19kZWJ1ZyhjdHgsIG1zZykge1xuICBpZiAoY3R4LmRlYnVnKSB7XG4gICAgaWYgKG1zZ1swXSA9PT0gJysnKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5kZWJ1Zyhtc2cuc2xpY2UoMSkpO1xuICAgIH1cbiAgICB2YXIgZCA9IG5ldyBEYXRlKCk7XG4gICAgdmFyIHRpZCA9IFwiXCIuY29uY2F0KGQudG9Mb2NhbGVUaW1lU3RyaW5nKCksIFwiLlwiKS5jb25jYXQoZC5nZXRNaWxsaXNlY29uZHMoKSk7XG4gICAgY29uc29sZS5kZWJ1ZyhcIiVjW1wiLmNvbmNhdChjdHguaWQsIFwiXVtcIikuY29uY2F0KHRpZCwgXCJdW1wiKS5jb25jYXQobXNnLCBcIl1cIiksICdjb2xvcjojYTAwJywgY3R4KTtcbiAgfVxufVxuXG4vKipcclxuICogRGVmYXVsdCBJbXBsZW1lbnRhdGlvbiBMYXllci5cclxuICovXG4vKiogQW50RC5UYWJsZUNvbXBvbmVudC50YWJsZSAqL1xudmFyIFRhYmxlSW1wbCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIFRhYmxlSW1wbChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInRhYmxlXCIsIF9leHRlbmRzKHtcbiAgICByZWY6IHJlZlxuICB9LCBwcm9wcykpO1xufSk7XG4vKiogQW50RC5UYWJsZUNvbXBvbmVudC5ib2R5LndyYXBwZXIgKi9cbmZ1bmN0aW9uIFdyYXBwZXJJbXBsKHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInRib2R5XCIsIHByb3BzKTtcbn1cbi8qKiBBbnRELlRhYmxlQ29tcG9uZW50LmJvZHkucm93ICovXG52YXIgUm93SW1wbCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIFJvd0ltcGwocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0clwiLCBfZXh0ZW5kcyh7XG4gICAgcmVmOiByZWZcbiAgfSwgcHJvcHMpKTtcbn0pO1xuXG4vKipcclxuICogTyhuKVxyXG4gKiByZXR1cm5zIG9mZnNldDogW2hlYWQsIHRhaWwsIHRvcF1cclxuICovXG5mdW5jdGlvbiBzY3JvbGxfd2l0aF9vZmZzZXQoY3R4LCB0b3ApIHtcbiAgdmFyIHJvd19oZWlnaHQgPSBjdHgucm93X2hlaWdodCxcbiAgICByb3dfY291bnQgPSBjdHgucm93X2NvdW50LFxuICAgIG92ZXJzY2FuUm93Q291bnQgPSBjdHgub3ZlcnNjYW5Sb3dDb3VudDtcbiAgY3R4Ll9zY3JvbGxfeSA9IGN0eC5zY3JvbGwueTtcbiAgaWYgKHR5cGVvZiBjdHguX3Njcm9sbF95ID09PSAnbnVtYmVyJykge1xuICAgIGN0eC5feSA9IGN0eC5fc2Nyb2xsX3k7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGN0eC5fc2Nyb2xsX3kgPT09ICdzdHJpbmcnKSB7XG4gICAgLyogYSBzdHJpbmcsIGxpa2UgXCJjYWxjKDEwMHZoIC0gMzAwcHgpXCIgKi9cbiAgICAvLyB0aGlzIG9mZnNldEhlaWdodCBtYXkgYmUgMCFcbiAgICBjdHguX3kgPSBjdHgud3JhcF9pbnN0LmN1cnJlbnQucGFyZW50RWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5hc3NlcnQoZmFsc2UsICdWVDogZGlkIHlvdSBmb3JnZXQgdG8gc2V0IGBzY3JvbGwueWA/Jyk7XG4gICAgY3R4Ll95ID0gY3R4LndyYXBfaW5zdC5jdXJyZW50LnBhcmVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICB9XG4gIGNvbnNvbGUuYXNzZXJ0KGN0eC5feSA+PSAwKTtcbiAgLy8gdG8gY2FsYyBgX3RvcGAgd2l0aCBgcm93X2hlaWdodGAgYW5kIGBvdmVyc2NhbmAuXG4gIHZhciBfdG9wID0gMCxcbiAgICBpID0gMCxcbiAgICBqID0gMDtcbiAgLy8gdGhlIGhlaWdodCB0byByZW5kZXIuXG4gIHZhciB0b3JlbmRlcl9oID0gMDtcblxuICAvLyBzY3JvbGwgdG8gdGhlIGJvdHRvbSBvZiB0aGUgdGFibGUuXG4gIGlmICh0b3AgPT09IC0xICYmIHJvd19jb3VudCA+IDApIHtcbiAgICBpID0gcm93X2NvdW50O1xuICAgIHdoaWxlIChpID4gMCAmJiB0b3JlbmRlcl9oIDwgY3R4Ll95KSB7XG4gICAgICB0b3JlbmRlcl9oICs9IHJvd19oZWlnaHRbLS1pXTtcbiAgICB9XG4gICAgcmV0dXJuIFswIHwgaSwgMCB8IHJvd19jb3VudCwgMCB8IGN0eC5jb21wdXRlZF9oIC0gdG9yZW5kZXJfaF07XG4gIH1cbiAgZm9yICg7IGkgPCByb3dfY291bnQgJiYgX3RvcCA8IHRvcDsgKytpKSB7XG4gICAgX3RvcCArPSByb3dfaGVpZ2h0W2ldO1xuICB9XG5cbiAgLy8gc3RhcnQgaiBmcm9tIHRoZSB2aXNpYmxlIGFyZWFcbiAgaiA9IGk7XG4gIGZvciAoOyBqIDwgcm93X2NvdW50ICYmIHRvcmVuZGVyX2ggPCBjdHguX3k7ICsraikge1xuICAgIHRvcmVuZGVyX2ggKz0gcm93X2hlaWdodFtqXTtcbiAgfVxuXG4gIC8vIGtlZXAgb2Zmc2V0IHJvdyBvbiB0b3AgYW5kIGJvdHRvbVxuICB2YXIgb3ZlcnNjYW4gPSBvdmVyc2NhblJvd0NvdW50IDwgMCA/IDAgOiBvdmVyc2NhblJvd0NvdW50O1xuICB3aGlsZSAoaSA+IDAgJiYgb3ZlcnNjYW4tLSkge1xuICAgIF90b3AgLT0gcm93X2hlaWdodFstLWldO1xuICB9XG4gIGogKz0gb3ZlcnNjYW5Sb3dDb3VudDtcbiAgaWYgKGogPiByb3dfY291bnQpIGogPSByb3dfY291bnQ7XG4gIC8vIHJldHVybnMgW2hlYWQsIHRhaWwsIHRvcF0uXG4gIHJldHVybiBbMCB8IGksIDAgfCBqLCAwIHwgX3RvcF07XG59XG5cbi8vIHNldCB0aGUgdmFyaWFibGVzIGZvciBvZmZzZXQgdG9wL2hlYWQvdGFpbC5cbmZ1bmN0aW9uIHNldF9vZmZzZXQoY3R4LCB0b3AsIGhlYWQsIHRhaWwpIHtcbiAgY3R4Ll9vZmZzZXRfdG9wID0gMCB8IHRvcDtcbiAgY3R4Ll9vZmZzZXRfaGVhZCA9IDAgfCBoZWFkO1xuICBjdHguX29mZnNldF90YWlsID0gMCB8IHRhaWw7XG59XG5mdW5jdGlvbiBzZXRfc2Nyb2xsKGN0eCwgdG9wLCBsZWZ0LCBldnQsIGVuZCkge1xuICBjdHgudG9wID0gdG9wO1xuICBjdHgubGVmdCA9IGxlZnQ7XG4gIGN0eC5ldnQgPSBldnQ7XG4gIGN0eC5lbmQgPSBlbmQ7XG59XG5cbi8vIHNjcm9sbHMgdGhlIHBhcmVudCBlbGVtZW50IHRvIHNwZWNpZmllZCBsb2NhdGlvbi5cbmZ1bmN0aW9uIHNjcm9sbF90byhjdHgsIHRvcCwgbGVmdCkge1xuICBpZiAoIWN0eC53cmFwX2luc3QuY3VycmVudCkgcmV0dXJuO1xuICB2YXIgZWxlID0gY3R4LndyYXBfaW5zdC5jdXJyZW50LnBhcmVudEVsZW1lbnQ7XG4gIC8qKiBpZSAqL1xuICBlbGUuc2Nyb2xsVG9wID0gdG9wO1xuICBlbGUuc2Nyb2xsTGVmdCA9IE1hdGgubWF4KGxlZnQsIGVsZS5zY3JvbGxMZWZ0KTtcbn1cbmZ1bmN0aW9uIHJlcGFpbnRpbmcoY3R4KSB7XG4gIGlmIChjdHguSE5EX1BBSU5UKSByZXR1cm47XG4gIHZhciBjcSA9IGN0eC5jcSxcbiAgICB3cmFwX2luc3QgPSBjdHgud3JhcF9pbnN0O1xuICB2YXIgZm4gPSBmdW5jdGlvbiBmbigpIHtcbiAgICBjdHguSE5EX1BBSU5UID0gMDtcblxuICAgIC8vIEJBVENIIFBST0NFU1MgaW4gb25jZSB0aW1lLi4uXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjcS5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKGNxW2ldLmluZGV4ID49IGN0eC5fb2Zmc2V0X2hlYWQgJiYgY3FbaV0uaW5kZXggPCBjdHguX29mZnNldF90YWlsKSB7XG4gICAgICAgIGNxW2ldLmZ1bmMoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGN0eC52dF9zdGF0ZSAhPT0gZV9WVF9TVEFURS5SVU5OSU5HIHx8ICF3cmFwX2luc3QuY3VycmVudCkgcmV0dXJuO1xuICAgIHZhciBoID0gY3R4LmNvbXB1dGVkX2g7XG4gICAgaWYgKGN0eC5XSCA9PT0gaCkgcmV0dXJuO1xuICAgIGN0eC5XSCA9IGg7XG4gICAgdmFyIHMgPSB3cmFwX2luc3QuY3VycmVudC5zdHlsZTtcbiAgICBzLmhlaWdodCA9IGggPyAocy5tYXhIZWlnaHQgPSBoICsgJ3B4Jywgcy5tYXhIZWlnaHQpIDogKHMubWF4SGVpZ2h0ID0gJ3Vuc2V0Jywgcy5tYXhIZWlnaHQpO1xuICAgIGN0eC5vbl91cGRhdGVfd3JhcF9zdHlsZSgpO1xuICB9O1xuICBjdHguSE5EX1BBSU5UID0gY3R4LmV2dCA9PT0gU0NST0xMRVZUX05BVElWRSA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pIDogd2luZG93LnNldFRpbWVvdXQoZm4pO1xufVxuZnVuY3Rpb24gc3JzX2V4cGFuZChjdHgsIGxlbiwgcHJldl9sZW4sIGZpbGxfdmFsdWUpIHtcbiAgdmFyIHNsZW4gPSBsZW4gLSBwcmV2X2xlbjtcbiAgdmFyIHNoYWRvd19yb3dzID0gbmV3IEFycmF5KHNsZW4pLmZpbGwoZmlsbF92YWx1ZSk7XG4gIGN0eC5yb3dfaGVpZ2h0ID0gY3R4LnJvd19oZWlnaHQuY29uY2F0KHNoYWRvd19yb3dzKTtcbiAgY3R4LmNvbXB1dGVkX2ggKz0gc2xlbiAqIGZpbGxfdmFsdWU7XG59XG5mdW5jdGlvbiBzcnNfc2hyaW5rKGN0eCwgbGVuLCBwcmV2X2xlbikge1xuICBpZiAobGVuID09PSAwKSB7XG4gICAgY3R4LmNvbXB1dGVkX2ggPSAwO1xuICAgIGN0eC5yb3dfaGVpZ2h0Lmxlbmd0aCA9IDA7XG4gICAgY3R4LnRvcCA9IDA7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciByb3dzID0gY3R4LnJvd19oZWlnaHQ7XG4gIHZhciBoMnNocmluayA9IDA7XG4gIGZvciAodmFyIGkgPSBsZW47IGkgPCBwcmV2X2xlbjsgKytpKSB7XG4gICAgaDJzaHJpbmsgKz0gcm93c1tpXTtcbiAgfVxuICBjdHguY29tcHV0ZWRfaCAtPSBoMnNocmluaztcbn1cbmZ1bmN0aW9uIHNldF90cl9jbnQoY3R4LCBuKSB7XG4gIGN0eC5yZV9jb21wdXRlZCA9IG4gLSBjdHgucm93X2NvdW50O1xuICBjdHgucHJldl9yb3dfY291bnQgPSBjdHgucm93X2NvdW50O1xuICBjdHgucm93X2NvdW50ID0gbjtcbn1cbnZhciBWVGFibGUgPSBmdW5jdGlvbiBWVGFibGUocHJvcHMsIHJlZikge1xuICB2YXIgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICBjb250ZXh0ID0gcHJvcHMuY29udGV4dCxcbiAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQpO1xuXG4gIC8vIGZvcmNlIHVwZGF0ZSB0aGlzIHZ0LlxuICB2YXIgZm9yY2UgPSB1c2VTdGF0ZSgwKTtcbiAgdmFyIHJlZl9mdW5jID0gdXNlUmVmKGZ1bmN0aW9uICgpIHt9KTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gIHZhciBzY3JvbGxfaG9vaztcblxuICAvKioqKioqKioqKiogRE9NICoqKioqKioqKioqKi9cbiAgdmFyIHdyYXBfaW5zdCA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlUmVmKCk7XG4gIH0sIFtdKTtcblxuICAvKioqKioqKioqKiogY29udGV4dCAqKioqKioqKioqKiovXG4gIHZhciBjdHggPSB1c2VDb250ZXh0KGNvbnRleHQpO1xuICB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBPYmplY3QuYXNzaWduKGN0eCwgZGVmYXVsdF9jb250ZXh0KCkpO1xuICAgIGlmIChjdHgud3JhcF9pbnN0ICYmIGN0eC53cmFwX2luc3QuY3VycmVudCkge1xuICAgICAgY3R4LndyYXBfaW5zdC5jdXJyZW50LnBhcmVudEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2Nyb2xsX2hvb2spO1xuICAgIH1cbiAgICBjdHgud3JhcF9pbnN0ID0gd3JhcF9pbnN0O1xuICAgIGN0eC50b3AgPSBjdHguaW5pdFRvcDtcbiAgICBjdHgub25fdXBkYXRlX3dyYXBfc3R5bGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoY3R4Ll95ID09PSAwICYmIFwiXCIuY29uY2F0KGN0eC5fc2Nyb2xsX3kpLmxlbmd0aCkge1xuICAgICAgICBzY3JvbGxfaG9vayh7XG4gICAgICAgICAgZmxhZzogU0NST0xMRVZUX0JZX0hPT0ssXG4gICAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgICBzY3JvbGxUb3A6IGN0eC50b3AsXG4gICAgICAgICAgICBzY3JvbGxMZWZ0OiBjdHgubGVmdFxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgaGVscGVyX2RpYWdub3NpcyhjdHgpO1xuICAgIGN0eC5jcSA9IFtdO1xuICAgIHZhciBwZmlyc3QgPSAwO1xuICAgIC8vIGxldCBwbGFzdCA9IDBcbiAgICB2YXIgY2lyY2xlQnVmZmVyU2l6ZSA9IDA7XG4gICAgY3R4LmNxLnB1c2ggPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgaWYgKGN0eC52dF9zdGF0ZSAhPT0gZV9WVF9TVEFURS5SVU5OSU5HKSByZXR1cm47XG4gICAgICB2YXIgc2l6ZSA9IGN0eC5fb2Zmc2V0X3RhaWwgLSBjdHguX29mZnNldF9oZWFkICsgY3R4Lm92ZXJzY2FuUm93Q291bnQgKiAyICsgMTA7XG4gICAgICBjaXJjbGVCdWZmZXJTaXplID0gTWF0aC5tYXgoY2lyY2xlQnVmZmVyU2l6ZSwgc2l6ZSk7XG4gICAgICBpZiAocGZpcnN0ID4gY2lyY2xlQnVmZmVyU2l6ZSkge1xuICAgICAgICBwZmlyc3QgPSAwO1xuICAgICAgfVxuICAgICAgY3R4LmNxW3BmaXJzdCsrXSA9IGl0ZW07XG4gICAgICByZXR1cm4gMDtcbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgLyoqKioqKioqKioqIHNjcm9sbCBldmVudCAqKioqKioqKioqKiovXG4gIHZhciBldmVudF9xdWV1ZSA9IHVzZVJlZihbXSkuY3VycmVudDtcblxuICAvKiBlc2xpbnQtZGlzYWJsZSBwcmVmZXItY29uc3QgKi9cbiAgdmFyIFJBRl91cGRhdGVfc2VsZjtcblxuICAvKioqKioqKioqKiogc2Nyb2xsIGhvb2sgKioqKioqKioqKioqL1xuICBzY3JvbGxfaG9vayA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChldikge1xuICAgIGlmIChjdHgudnRfc3RhdGUgIT09IGVfVlRfU1RBVEUuUlVOTklORykgcmV0dXJuO1xuICAgIHZhciB0MCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGlmIChldikge1xuICAgICAgaWYgKCdmbGFnJyBpbiBldikge1xuICAgICAgICBldmVudF9xdWV1ZS5wdXNoKGV2KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSBldi50YXJnZXQ7XG4gICAgICAgIHZhciB0b3AgPSBNYXRoLm1heCh0YXJnZXQuc2Nyb2xsVG9wLCAwKTtcbiAgICAgICAgZXZlbnRfcXVldWUucHVzaCh7XG4gICAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgICBzY3JvbGxUb3A6IHRvcCxcbiAgICAgICAgICAgIHNjcm9sbExlZnQ6IHRhcmdldC5zY3JvbGxMZWZ0XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlbmQ6IE1hdGguYWJzKHRhcmdldC5zY3JvbGxIZWlnaHQgLSB0YXJnZXQuY2xpZW50SGVpZ2h0IC0gTWF0aC5yb3VuZCh0b3ApKSA8PSAoY3R4Lm9mZnNldCB8fCAwKSxcbiAgICAgICAgICBmbGFnOiBTQ1JPTExFVlRfTkFUSVZFXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGN0eC5mX2ZpbmFsX3RvcCA9PT0gVE9QX0NPTlRJTlVFKSB7XG4gICAgICAgIHJldHVybiBSQUZfdXBkYXRlX3NlbGYodDApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY3R4LkhORF9SQUYpIHJldHVybjtcbiAgICBjdHguSE5EX1JBRiA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFJBRl91cGRhdGVfc2VsZih0MCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSwgW10pO1xuXG4gIC8qIHJlcXVlc3RBbmltYXRpb25GcmFtZSBjYWxsYmFjayAqL1xuICBSQUZfdXBkYXRlX3NlbGYgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAodGltZSkge1xuICAgIGN0eC5ITkRfUkFGID0gMDtcbiAgICB2YXIgdDEgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICBpZiAodDEgLSB0aW1lID4gMTAgJiYgY3R4LnJldHJ5X2NvdW50LS0gPiAwKSB7XG4gICAgICBzY3JvbGxfaG9vaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjdHgucmV0cnlfY291bnQgPSA1O1xuICAgIGlmIChjdHgudnRfc3RhdGUgIT09IGVfVlRfU1RBVEUuUlVOTklORykgcmV0dXJuO1xuICAgIHZhciBldnEgPSBldmVudF9xdWV1ZTtcbiAgICB2YXIgZTtcbiAgICBpZiAoIWV2cS5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyB0aGlzIGFsd2F5cyBjb25zdW1lcyB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBldmVudCBxdWV1ZS5cbiAgICBlID0gZXZxLnBvcCgpO1xuICAgIGV2cS5sZW5ndGggPSAwO1xuICAgIHZhciBldG9wID0gZS50YXJnZXQuc2Nyb2xsVG9wO1xuICAgIHZhciBlbGVmdCA9IGUudGFyZ2V0LnNjcm9sbExlZnQ7XG4gICAgdmFyIGZsYWcgPSBlLmZsYWc7XG4gICAgbG9nX2RlYnVnKGN0eCwgXCJ0b3A6IFwiLmNvbmNhdChldG9wLCBcIiwgbGVmdDogXCIpLmNvbmNhdChlbGVmdCkpO1xuXG4gICAgLy8gY2hlY2tzIGV2ZXJ5IHRyJ3MgaGVpZ2h0LCB3aGljaCB3aWxsIHRha2Ugc29tZSB0aW1lLi4uXG4gICAgdmFyIG9mZnNldCA9IHNjcm9sbF93aXRoX29mZnNldChjdHgsIGN0eC5mX2ZpbmFsX3RvcCA9PT0gVE9QX0NPTlRJTlVFID8gY3R4LmZpbmFsX3RvcCA6IGV0b3ApO1xuICAgIHZhciBoZWFkID0gb2Zmc2V0WzBdO1xuICAgIHZhciB0YWlsID0gb2Zmc2V0WzFdO1xuICAgIHZhciB0b3AgPSBvZmZzZXRbMl07XG4gICAgdmFyIHByZXZfaGVhZCA9IGN0eC5fb2Zmc2V0X2hlYWQ7XG4gICAgdmFyIHByZXZfdGFpbCA9IGN0eC5fb2Zmc2V0X3RhaWw7XG4gICAgdmFyIHByZXZfdG9wID0gY3R4Ll9vZmZzZXRfdG9wO1xuICAgIHZhciBlbmQgPSBmYWxzZTtcbiAgICBzd2l0Y2ggKGZsYWcpIHtcbiAgICAgIGNhc2UgU0NST0xMRVZUX0lOSVQ6XG4gICAgICAgIGxvZ19kZWJ1ZyhjdHgsICdTQ1JPTExFVlRfSU5JVCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU0NST0xMRVZUX0JZX0hPT0s6XG4gICAgICAgIGxvZ19kZWJ1ZyhjdHgsICdTQ1JPTExFVlRfQllfSE9PSycpO1xuICAgICAgICBpZiAoaGVhZCA9PT0gcHJldl9oZWFkICYmIHRhaWwgPT09IHByZXZfdGFpbCAmJiB0b3AgPT09IHByZXZfdG9wKSB7XG4gICAgICAgICAgY3R4LmZfZmluYWxfdG9wID0gVE9QX0RPTkU7XG4gICAgICAgICAgaWYgKGN0eC5maW5hbF90b3AgPT09IC0xKSBldG9wID0gY3R4LmNvbXB1dGVkX2ggLSBjdHguX3k7XG4gICAgICAgICAgZW5kID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoY3R4LmZpbmFsX3RvcCA9PT0gLTEpIGV0b3AgPSB0b3A7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFNDUk9MTEVWVF9SRUNPTVBVVEU6XG4gICAgICAgIGlmIChoZWFkID09PSBwcmV2X2hlYWQgJiYgdGFpbCA9PT0gcHJldl90YWlsICYmIHRvcCA9PT0gcHJldl90b3ApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbG9nX2RlYnVnKGN0eCwgJ1NDUk9MTEVWVF9SRUNPTVBVVEUnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFNDUk9MTEVWVF9OQVRJVkU6XG4gICAgICAgIGlmIChoZWFkID09PSBwcmV2X2hlYWQgJiYgdGFpbCA9PT0gcHJldl90YWlsICYmIHRvcCA9PT0gcHJldl90b3ApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbG9nX2RlYnVnKGN0eCwgJ1NDUk9MTEVWVF9OQVRJVkUnKTtcbiAgICAgICAgaWYgKGN0eC5vblNjcm9sbCkge1xuICAgICAgICAgIGN0eC5vblNjcm9sbCh7XG4gICAgICAgICAgICB0b3A6IGV0b3AsXG4gICAgICAgICAgICBsZWZ0OiBlbGVmdCxcbiAgICAgICAgICAgIGlzRW5kOiBlLmVuZFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVuZCA9IGUuZW5kO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgc2V0X29mZnNldChjdHgsIHRvcCwgaGVhZCwgdGFpbCk7XG4gICAgc2V0X3Njcm9sbChjdHgsIGV0b3AsIGVsZWZ0LCBmbGFnLCBlbmQpO1xuICAgIGZvcmNlWzFdKCsrY3R4LnVwZGF0ZV9jb3VudCk7XG4gIH0sIFtdKTtcblxuICAvLyBleHBvc2UgdG8gdGhlIHBhcmVudCBjb21wb25lbnRzIHlvdSBhcmUgdXNpbmcuXG4gIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgLy8gYHkgPT09IC0xYCBpbmRpY2F0ZXMgeW91IG5lZWQgdG8gc2Nyb2xsIHRvIHRoZSBib3R0b20gb2YgdGhlIHRhYmxlLlxuICAgIHZhciBfc2Nyb2xsVG8gPSBmdW5jdGlvbiBzY3JvbGxUbyh5KSB7XG4gICAgICBjdHguZl9maW5hbF90b3AgPSBUT1BfQ09OVElOVUU7XG4gICAgICBjdHguZmluYWxfdG9wID0geTtcbiAgICAgIHNjcm9sbF9ob29rKHtcbiAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgc2Nyb2xsVG9wOiB5LFxuICAgICAgICAgIHNjcm9sbExlZnQ6IC0xXG4gICAgICAgIH0sXG4gICAgICAgIGZsYWc6IFNDUk9MTEVWVF9CWV9IT09LXG4gICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICBzY3JvbGxUbzogZnVuY3Rpb24gc2Nyb2xsVG8oeSkge1xuICAgICAgICByZWZfZnVuYy5jdXJyZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfc2Nyb2xsVG8oeSk7XG4gICAgICAgIH07XG4gICAgICAgIHJlZl9mdW5jLmN1cnJlbnQoKTtcbiAgICAgIH0sXG4gICAgICBzY3JvbGxUb0luZGV4OiBmdW5jdGlvbiBzY3JvbGxUb0luZGV4KGlkeCkge1xuICAgICAgICByZWZfZnVuYy5jdXJyZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChpZHggPiBjdHgucm93X2NvdW50IC0gMSkgaWR4ID0gY3R4LnJvd19jb3VudCAtIDE7XG4gICAgICAgICAgaWYgKGlkeCA8IDApIGlkeCA9IDA7XG4gICAgICAgICAgdmFyIHkgPSAwO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWR4OyArK2kpIHtcbiAgICAgICAgICAgIHkgKz0gY3R4LnJvd19oZWlnaHRbaV07XG4gICAgICAgICAgfVxuICAgICAgICAgIF9zY3JvbGxUbyh5KTtcbiAgICAgICAgfTtcbiAgICAgICAgcmVmX2Z1bmMuY3VycmVudCgpO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFtdKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZWwgPSB3cmFwX2luc3QuY3VycmVudC5wYXJlbnRFbGVtZW50O1xuICAgIHRyeSB7XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxfaG9vaywge1xuICAgICAgICBwYXNzaXZlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChfdW51c2VkKSB7XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxfaG9vaywgZmFsc2UpO1xuICAgIH1cbiAgfSwgW3dyYXBfaW5zdC5jdXJyZW50XSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc2Nyb2xsX2hvb2soe1xuICAgICAgZmxhZzogU0NST0xMRVZUX0JZX0hPT0ssXG4gICAgICB0YXJnZXQ6IHtcbiAgICAgICAgc2Nyb2xsTGVmdDogY3R4LmxlZnQsXG4gICAgICAgIHNjcm9sbFRvcDogY3R4LnRvcFxuICAgICAgfVxuICAgIH0pO1xuICB9LCBbY3R4LnNjcm9sbC55XSk7XG5cbiAgLy8gdXBkYXRlIERPTSBzdHlsZS5cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzd2l0Y2ggKGN0eC5ldnQpIHtcbiAgICAgIGNhc2UgU0NST0xMRVZUX0JZX0hPT0s6XG4gICAgICAgIGlmIChjdHguZl9maW5hbF90b3AgPT09IFRPUF9DT05USU5VRSkge1xuICAgICAgICAgIHJlZl9mdW5jLmN1cnJlbnQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzY3JvbGxfdG8oY3R4LCBjdHgudG9wLCBjdHgubGVmdCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFNDUk9MTEVWVF9JTklUOlxuICAgICAgY2FzZSBTQ1JPTExFVlRfUkVDT01QVVRFOlxuICAgICAgICBzY3JvbGxfdG8oY3R4LCBjdHgudG9wLCBjdHgubGVmdCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSwgW2ZvcmNlWzBdIC8qIGZvciBwZXJmb3JtYW5jZS4gKi9dKTtcblxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHN3aXRjaCAoY3R4LnZ0X3N0YXRlKSB7XG4gICAgICBjYXNlIGVfVlRfU1RBVEUuTE9BREVEOlxuICAgICAgICAvLyBjaGFuZ2VkIGJ5IFZUUm93IG9ubHkuXG4gICAgICAgIGN0eC52dF9zdGF0ZSA9IGVfVlRfU1RBVEUuUlVOTklORztcblxuICAgICAgICAvLyBmb3JjZSB1cGRhdGUuXG4gICAgICAgIHNjcm9sbF9ob29rKHtcbiAgICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICAgIHNjcm9sbFRvcDogY3R4LnRvcCxcbiAgICAgICAgICAgIHNjcm9sbExlZnQ6IDBcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZsYWc6IFNDUk9MTEVWVF9CWV9IT09LXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgZV9WVF9TVEFURS5SVU5OSU5HOlxuICAgICAgICBpZiAoY3R4LnJlX2NvbXB1dGVkICE9PSAwKSB7XG4gICAgICAgICAgLy8gcmVyZW5kZXJcbiAgICAgICAgICBjdHgucmVfY29tcHV0ZWQgPSAwO1xuICAgICAgICAgIHNjcm9sbF9ob29rKHtcbiAgICAgICAgICAgIHRhcmdldDoge1xuICAgICAgICAgICAgICBzY3JvbGxUb3A6IGN0eC50b3AsXG4gICAgICAgICAgICAgIHNjcm9sbExlZnQ6IGN0eC5sZWZ0XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmxhZzogU0NST0xMRVZUX1JFQ09NUFVURVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSk7XG4gIHZhciB3cmFwU3R5bGUgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IHN0eWxlLndpZHRoLFxuICAgICAgbWluV2lkdGg6ICcxMDAlJyxcbiAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlKDApJ1xuICAgIH07XG4gIH0sIFtzdHlsZS53aWR0aF0pO1xuICB2YXIgdGFibGVTdHlsZSA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0eWxlKSwge30sIHtcbiAgICAgIHdpZHRoOiB2b2lkIDAsXG4gICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgIHRvcDogY3R4Ll9vZmZzZXRfdG9wLFxuICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlKDApJ1xuICAgIH0pO1xuICB9LCBbY3R4Ll9vZmZzZXRfdG9wXSk7XG4gIHZhciBpbnRlcm5hbEN0eCA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHt9LCBjdHgpO1xuICB9LCBbY3R4LnVwZGF0ZV9jb3VudF0pO1xuICB2YXIgVGFibGUgPSBjdHguY29tcG9uZW50cy50YWJsZTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICByZWY6IHdyYXBfaW5zdCxcbiAgICBzdHlsZTogd3JhcFN0eWxlXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KGNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogaW50ZXJuYWxDdHhcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVGFibGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgc3R5bGU6IHRhYmxlU3R5bGVcbiAgfSkpKSk7XG59O1xudmFyIFZXcmFwcGVyID0gZnVuY3Rpb24gVldyYXBwZXIocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIGN0eCA9IHByb3BzLmN0eDtcbiAgdmFyIG1lYXN1cmVSb3cgPSBjaGlsZHJlblswXTtcbiAgdmFyIHJvd3MgPSBjaGlsZHJlblsxXTtcblxuICAvLyByZWZlcmVuY2UgaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWNvbXBvbmVudC90YWJsZS9ibG9iL21hc3Rlci9zcmMvQm9keS9pbmRleC50c3gjTDZcbiAgdmFyIGxlbiA9IEFycmF5LmlzQXJyYXkocm93cykgPyByb3dzLmxlbmd0aCA6IDA7XG4gIHZhciBoZWFkID0gY3R4Ll9vZmZzZXRfaGVhZCxcbiAgICB0YWlsID0gY3R4Ll9vZmZzZXRfdGFpbDtcbiAgdmFyIHRycyA9IFtdO1xuICBzd2l0Y2ggKGN0eC52dF9zdGF0ZSkge1xuICAgIGNhc2UgZV9WVF9TVEFURS5JTklUOlxuICAgICAgaWYgKGxlbiA+PSAwKSB7XG4gICAgICAgIGNvbnNvbGUuYXNzZXJ0KGhlYWQgPT09IDApO1xuICAgICAgICBjb25zb2xlLmFzc2VydCh0YWlsID09PSAxKTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocm93cykpIHtcbiAgICAgICAgICB0cnMgPSByb3dzLnNsaWNlKGhlYWQsIHRhaWwpO1xuICAgICAgICAgIGN0eC5pbmRleE1hcC5zZXQodHJzWzBdLnByb3BzLnJlY29yZCwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJzID0gcm93cztcbiAgICAgICAgfVxuICAgICAgICBjdHgucmVfY29tcHV0ZWQgPSBsZW47XG4gICAgICAgIGN0eC5wcmV2X3Jvd19jb3VudCA9IGxlbjtcbiAgICAgICAgY3R4LnJvd19jb3VudCA9IGxlbjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgZV9WVF9TVEFURS5SVU5OSU5HOlxuICAgICAge1xuICAgICAgICBpZiAodGFpbCA+IGxlbikge1xuICAgICAgICAgIHZhciBvZmZzZXQgPSB0YWlsIC0gbGVuO1xuICAgICAgICAgIHRhaWwgLT0gb2Zmc2V0O1xuICAgICAgICAgIGhlYWQgLT0gb2Zmc2V0O1xuICAgICAgICAgIGlmIChoZWFkIDwgMCkgaGVhZCA9IDA7XG4gICAgICAgICAgaWYgKHRhaWwgPCAwKSB0YWlsID0gMDtcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIGBoZWFkYCBhbmQgYHRhaWxgLlxuICAgICAgICAgIHNldF9vZmZzZXQoY3R4LCBjdHguX29mZnNldF90b3AgLyogTk9URTogaW52YWxpZGVkIHBhcmFtLCBqdXN0IHRvIGZpbGwgZm9yIHRoaXMgcGFyYW0gKi8sIGhlYWQsIHRhaWwpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdHgucm93X2NvdW50ICE9PSBsZW4pIHtcbiAgICAgICAgICBzZXRfdHJfY250KGN0eCwgbGVuKTtcbiAgICAgICAgfVxuICAgICAgICBsZW4gPSBjdHgucm93X2NvdW50O1xuICAgICAgICB2YXIgcHJldl9sZW4gPSBjdHgucHJldl9yb3dfY291bnQ7XG5cbiAgICAgICAgLyogc2hhZG93LXJvd3MgcmVuZGVyaW5nIHBoYXNlLiAqL1xuICAgICAgICBpZiAobGVuIDwgcHJldl9sZW4pIHtcbiAgICAgICAgICBzcnNfc2hyaW5rKGN0eCwgbGVuLCBwcmV2X2xlbik7XG4gICAgICAgIH0gZWxzZSBpZiAobGVuID4gcHJldl9sZW4pIHtcbiAgICAgICAgICB2YXIgcm93X2ggPSBjdHgucm93X2hlaWdodDtcbiAgICAgICAgICBpZiAobGVuIC0gcm93X2gubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc3JzX2V4cGFuZChjdHgsIGxlbiwgcHJldl9sZW4sIGN0eC5wb3NzaWJsZV9oaWdodF9wZXJfdHIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB1c2luZyBhbiBleGlzdGluZyBhcnJheS5cbiAgICAgICAgICAgIHJvd19oLmZpbGwoY3R4LnBvc3NpYmxlX2hpZ2h0X3Blcl90ciwgcHJldl9sZW4sIGxlbik7XG4gICAgICAgICAgICBjdHguY29tcHV0ZWRfaCArPSBjdHgucG9zc2libGVfaGlnaHRfcGVyX3RyICogKGxlbiAtIHByZXZfbGVuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKipcclxuICAgICAgICAgKiB0cmVlLXN0cnVjdHVyZSBpZiBpbmRlbnQgaXMgbm90IDBcclxuICAgICAgICAgKiAgICAgICAgfCAgaWR4XHJcbiAgICAgICAgICogICAgICAgIHwgICAwICAgfHwgMGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICB8fCAwYVxyXG4gICAgICAgICAqICAgICAgICB8ICAgMSAgIHx8IDBiICAgICAtLWNvbGxhcHNlIG9jY3VycmVkLS0gICAgICAgMSAgfHwgMGJcclxuICAgICAgICAgKiAgICAgICAgfCAgIDIgICB8fCAtIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUtPjIgIHx8IDBjXHJcbiAgICAgICAgICogIGhlYWQgIHwgICAzICAgfHwgLSAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LT4zICB8fCAwZFxyXG4gICAgICAgICAqICAgICAgICB8ICAgNCAgIHx8ICAgLSAyICAgICAgICAgICAgICAgICAgICAgICAgICAgNy0+NCAgfHwgMGVcclxuICAgICAgICAgKiAgICAgICAgfCAgIDUgICB8fCAwYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgtPjUgIHx8IC0gMVxyXG4gICAgICAgICAqICAgICAgICB8ICAgNiAgIHx8IDBkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOS0+NiAgfHwgICAtIDJcclxuICAgICAgICAgKiAgICAgICAgfCAgIDcgICB8fCAwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAtPjcgIHx8ICAgICAtIDNcclxuICAgICAgICAgKiAgdGFpbCAgfCAgIDggICB8fCAtIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEtPjggIHx8IDBmXHJcbiAgICAgICAgICogICAgICAgIHwgICA5ICAgfHwgIC0gMlxyXG4gICAgICAgICAqICAgICAgICB8ICAxMCAgIHx8ICAgIC0gM1xyXG4gICAgICAgICAqICAgICAgICB8ICAxMSAgIHx8IDBmXHJcbiAgICAgICAgICogICAgICAgIHwgIDEyICAgfHxcclxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKGxlbikge1xuICAgICAgICAgIHZhciBfaWR4ID0gaGVhZDtcbiAgICAgICAgICB0cnMgPSByb3dzLnNsaWNlKF9pZHgsIHRhaWwpO1xuICAgICAgICAgIHRycy5mb3JFYWNoKGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgICAgcmV0dXJuIGN0eC5pbmRleE1hcC5zZXQoZWwucHJvcHMucmVjb3JkLCBfaWR4KyspO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRycyA9IHJvd3M7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LnByZXZfcm93X2NvdW50ID0gY3R4LnJvd19jb3VudDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgZV9WVF9TVEFURS5MT0FERUQ6XG4gICAgICBjb25zb2xlLmFzc2VydChmYWxzZSk7XG4gICAgICBicmVhaztcbiAgfVxuICB2YXIgV3JhcHBlciA9IGN0eC5jb21wb25lbnRzLmJvZHkud3JhcHBlcjtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFdyYXBwZXIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVxuICB9LCBtZWFzdXJlUm93LCB0cnMpO1xufTtcbnZhciBWVFJvdyA9IGZ1bmN0aW9uIFZUUm93KHByb3BzKSB7XG4gIHZhciByZWYgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlUmVmKCk7XG4gIHZhciBjdHggPSBwcm9wcy5jdHgsXG4gICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkMik7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuICB2YXIgUm93ID0gY3R4LmNvbXBvbmVudHMuYm9keS5yb3c7XG4gIGlmICghQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtY29tcG9uZW50L3RhYmxlL2Jsb2IvbWFzdGVyL3NyYy9Cb2R5L0JvZHlSb3cudHN4I0wyMTFcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtY29tcG9uZW50L3RhYmxlL2Jsb2IvbWFzdGVyL3NyYy9Cb2R5L2luZGV4LnRzeCNMMTA1XG4gICAgLy8gb25seSBlbXB0eSBvciBleHBhbmRlZCByb3cuLi5cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUm93LCByZXN0LCBjaGlsZHJlbik7XG4gIH1cbiAgdmFyIHJvd19wcm9wcyA9IGNoaWxkcmVuWzBdLnByb3BzO1xuICB2YXIgaW5kZXggPSBjdHguaW5kZXhNYXAuZ2V0KHJvd19wcm9wcy5yZWNvcmQpO1xuICB2YXIgbGFzdF9pbmRleCA9IHVzZVJlZihpbmRleCk7XG4gIHZhciBleHBhbmRlZF9jbHMgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gXCIuXCIuY29uY2F0KHJvd19wcm9wcy5wcmVmaXhDbHMsIFwiLWV4cGFuZGVkLXJvd1wiKTtcbiAgfSwgW3Jvd19wcm9wcy5wcmVmaXhDbHNdKTtcbiAgdmFyIHQwID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHQxID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgbG9nX2RlYnVnKGN0eCwgXCIraWR4IFwiLmNvbmNhdChpbmRleCwgXCIgdG9va3MgXCIpLmNvbmNhdCh0MSAtIHQwLCBcIiBtc1wiKSk7XG4gICAgaWYgKGN0eC52dF9zdGF0ZSA9PT0gZV9WVF9TVEFURS5SVU5OSU5HKSB7XG4gICAgICByZXBhaW50aW5nKGN0eCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN0eC5wb3NzaWJsZV9oaWdodF9wZXJfdHIgPSByZWYuY3VycmVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICBzcnNfZXhwYW5kKGN0eCwgY3R4LnJvd19jb3VudCwgMCwgY3R4LnBvc3NpYmxlX2hpZ2h0X3Blcl90cik7XG4gICAgICByZXBhaW50aW5nKGN0eCk7XG4gICAgICBjdHgudnRfc3RhdGUgPSBlX1ZUX1NUQVRFLkxPQURFRDtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlcGFpbnRpbmcoY3R4KTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgY3R4LmNxLnB1c2goe1xuICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgZnVuYzogZnVuY3Rpb24gZnVuYygpIHtcbiAgICAgICAgdmFyIHJvd0VsbSA9IHJlZi5jdXJyZW50O1xuICAgICAgICBpZiAoIXJvd0VsbSkgcmV0dXJuO1xuICAgICAgICB2YXIgaCA9IHJvd0VsbS5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIHZhciBzaWJsaW5nID0gcm93RWxtLm5leHRTaWJsaW5nO1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtY29tcG9uZW50L3RhYmxlL2Jsb2IvbWFzdGVyL3NyYy9Cb2R5L0JvZHlSb3cudHN4I0wyMTJcbiAgICAgICAgLy8gaW5jbHVkZSBoZWlnaHRzIG9mIGFsbCBleHBhbmRlZCByb3dzLCBpbiBwYXJlbnQgcm93c1xuICAgICAgICB3aGlsZSAoc2libGluZyAmJiBzaWJsaW5nLm1hdGNoZXMoZXhwYW5kZWRfY2xzKSkge1xuICAgICAgICAgIGggKz0gc2libGluZy5vZmZzZXRIZWlnaHQ7XG4gICAgICAgICAgc2libGluZyA9IHNpYmxpbmcubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGN1cnJfaCA9IGN0eC5yb3dfaGVpZ2h0W2luZGV4XTtcbiAgICAgICAgdmFyIGxhc3RfaCA9IGN0eC5yb3dfaGVpZ2h0W2xhc3RfaW5kZXguY3VycmVudF07XG4gICAgICAgIGN0eC5jb21wdXRlZF9oIC09IGN1cnJfaDtcbiAgICAgICAgY3R4LmNvbXB1dGVkX2ggKz0gbGFzdF9oO1xuICAgICAgICBjdHguY29tcHV0ZWRfaCArPSBoIC0gbGFzdF9oO1xuICAgICAgICBjdHgucm93X2hlaWdodFtpbmRleF0gPSBoO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJlcGFpbnRpbmcoY3R4KTtcbiAgfSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSb3csIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgcmVmOiByZWZcbiAgfSkpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBfc2V0X2NvbXBvbmVudHMoY3R4LCBjb21wb25lbnRzKSB7XG4gIHZhciB0YWJsZSA9IGNvbXBvbmVudHMudGFibGUsXG4gICAgYm9keSA9IGNvbXBvbmVudHMuYm9keSxcbiAgICBoZWFkZXIgPSBjb21wb25lbnRzLmhlYWRlcjtcbiAgY3R4LmNvbXBvbmVudHMuYm9keSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgY3R4LmNvbXBvbmVudHMuYm9keSksIGJvZHkpO1xuICBpZiAoYm9keSAmJiBib2R5LmNlbGwpIHtcbiAgICBjdHguX3Z0Y29tcG9uZW50cy5ib2R5LmNlbGwgPSBib2R5LmNlbGw7XG4gIH1cbiAgaWYgKGhlYWRlcikge1xuICAgIGN0eC5jb21wb25lbnRzLmhlYWRlciA9IGhlYWRlcjtcbiAgICBjdHguX3Z0Y29tcG9uZW50cy5oZWFkZXIgPSBoZWFkZXI7XG4gIH1cbiAgaWYgKHRhYmxlKSB7XG4gICAgY3R4LmNvbXBvbmVudHMudGFibGUgPSB0YWJsZTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGluaXQoZm5PcHRzLCBkZXBzKSB7XG4gIHZhciBjdHggPSB1c2VSZWYoIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHt9KSkuY3VycmVudDtcbiAgdmFyIGN0eF92YWx1ZSA9IHVzZUNvbnRleHQoY3R4KTtcbiAgdmFyIGRlZmF1bHRfcmVmID0gdXNlUmVmKHtcbiAgICBzY3JvbGxUbzogZnVuY3Rpb24gc2Nyb2xsVG8oeSkge30sXG4gICAgc2Nyb2xsVG9JbmRleDogZnVuY3Rpb24gc2Nyb2xsVG9JbmRleChpZHgpIHt9XG4gIH0pO1xuICB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihjdHhfdmFsdWUsIHtcbiAgICAgIGlkOiAoK25ldyBEYXRlKCkpLnRvU3RyaW5nKDM2KS5zbGljZSg0KSxcbiAgICAgIGluaXRUb3A6IDAsXG4gICAgICBvdmVyc2NhblJvd0NvdW50OiA1LFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgICAgcmVmOiBkZWZhdWx0X3JlZlxuICAgIH0sIGZuT3B0cygpKTtcbiAgfSwgZGVwcyk7XG4gIHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBWVCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKFZUYWJsZSk7XG5cbiAgICAvLyBzZXQgdGhlIHZpcnR1YWwgbGF5ZXIuXG4gICAgY3R4X3ZhbHVlLl92dGNvbXBvbmVudHMgPSB7XG4gICAgICB0YWJsZTogZnVuY3Rpb24gdGFibGUocHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFZULCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgICAgICBjb250ZXh0OiBjdHgsXG4gICAgICAgICAgcmVmOiBjdHhfdmFsdWUucmVmXG4gICAgICAgIH0pKTtcbiAgICAgIH0sXG4gICAgICBib2R5OiB7XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1jb21wb25lbnQvdGFibGUvYmxvYi9tYXN0ZXIvc3JjL0JvZHkvaW5kZXgudHN4I0wxMTRcbiAgICAgICAgd3JhcHBlcjogZnVuY3Rpb24gd3JhcHBlcihwcm9wcykge1xuICAgICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChjdHguQ29uc3VtZXIsIG51bGwsIGZ1bmN0aW9uIC8qIHZhbHVlICovXG4gICAgICAgICAgKCkge1xuICAgICAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFZXcmFwcGVyLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgICAgICAgICAgY3R4OiBjdHhfdmFsdWVcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcm93OiBmdW5jdGlvbiByb3cocHJvcHMpIHtcbiAgICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVlRSb3csIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgICAgICAgICAgY3R4OiBjdHhfdmFsdWVcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIC8vIHNldCB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBsYXllci5cbiAgICBjdHhfdmFsdWUuY29tcG9uZW50cyA9IHt9O1xuICAgIF9zZXRfY29tcG9uZW50cyhjdHhfdmFsdWUsIHtcbiAgICAgIHRhYmxlOiBUYWJsZUltcGwsXG4gICAgICBib2R5OiB7XG4gICAgICAgIHdyYXBwZXI6IFdyYXBwZXJJbXBsLFxuICAgICAgICByb3c6IFJvd0ltcGxcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBzdGFydCAtPiBgSU5JVGBcbiAgICBjdHhfdmFsdWUudnRfc3RhdGUgPSBlX1ZUX1NUQVRFLklOSVQ7XG4gIH0sIFtdKTtcbiAgcmV0dXJuIGN0eF92YWx1ZTtcbn0iLCJmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfSwgX3R5cGVvZihvYmopOyB9XG4vKlxyXG5UaGUgTUlUIExpY2Vuc2UgKE1JVClcclxuXHJcbkNvcHlyaWdodCAoYykgMjAxOSBodHRwczovL2dpdGh1Yi5jb20vd3Vib3N0Yy9cclxuXHJcblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XHJcblxyXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cclxuKi9cblxuLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuXG5pbXBvcnQgeyBfc2V0X2NvbXBvbmVudHMsIGluaXQgfSBmcm9tIFwiLi92dFwiO1xudmFyIF9icm93ZXIgPSAxO1xudmFyIF9ub2RlID0gMjtcbihmdW5jdGlvbiAoKSB7XG4gIHZhciBlbnYgPSAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKHdpbmRvdykpID09PSAnb2JqZWN0JyAmJiB3aW5kb3cgaW5zdGFuY2VvZiBXaW5kb3cgPyBfYnJvd2VyIDogX25vZGU7XG4gIGlmIChlbnYgJiBfYnJvd2VyKSB7XG4gICAgaWYgKCFPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh3aW5kb3csICdyZXF1ZXN0QW5pbWF0aW9uRnJhbWUnKSAmJiAhd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSkgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgdXNpbmcgdGhlIG1vZGVybiBicm93ZXJzIG9yIGFwcHJvcHJpYXRlIHBvbHlmaWxsIScpO1xuICB9XG59KSgpO1xuXG4vKipcclxuICogQGV4YW1wbGVcclxuICpcclxuICogZnVuY3Rpb24gTXlUYWJsZUNvbXBvbmVudCgpIHtcclxuICpcclxuICogLy8gLi4uIHlvdXIgY29kZVxyXG4gKlxyXG4gKlxyXG4gKiBjb25zdCB5ID0gNjAwO1xyXG4gKiBjb25zdCBbIHZ0LCBzZXRDb21wb25lbnRzLCB2dFJlZiBdID0gdXNlVlQoKCkgPT4gKHtcclxuICogIHNjcm9sbDoge1xyXG4gKiAgICB5XHJcbiAqICB9XHJcbiAqIH0pLFxyXG4gKiBbeV0pO1xyXG4gKlxyXG4gKiAvLyB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gKiAvLyAgc2V0Q29tcG9uZW50cyh7XHJcbiAqIC8vICAgIGJvZHk6IHtcclxuICogLy8gICAgICBjZWxsOiBNeUNlbGwsXHJcbiAqIC8vICAgIH1cclxuICogLy8gIH0pXHJcbiAqIC8vIH0pO1xyXG4gKlxyXG4gKiAvLyB1c2VFZmZlY3QoKCkgPT4gdnRSZWYuY3VycmVudC50b1Njcm9sbCgxMDApLCBbXSk7XHJcbiAqXHJcbiAqIHJldHVybiAoXHJcbiAqICA8VGFibGVcclxuICogICBjb2x1bW5zPXtjb2x1bW5zfVxyXG4gKiAgIGRhdGFTb3VyY2U9e2RhdGFTb3VyY2V9XHJcbiAqICAgc2Nyb2xsPXt7IHg6IDEwMDAsIHkgfX1cclxuICogICBjb21wb25lbnRzPXt2dH1cclxuICogIC8+XHJcbiAqICk7XHJcbiAqIH1cclxuICovXG5mdW5jdGlvbiB1c2VWVChmbk9wdHMsIGRlcHMpIHtcbiAgdmFyIGN0eCA9IGluaXQoZm5PcHRzLCBkZXBzIHx8IFtdKTtcbiAgcmV0dXJuIFtjdHguX3Z0Y29tcG9uZW50cywgZnVuY3Rpb24gKGNvbXBvbmVudHMpIHtcbiAgICByZXR1cm4gX3NldF9jb21wb25lbnRzKGN0eCwgY29tcG9uZW50cyk7XG4gIH0sIGN0eC5yZWZdO1xufVxuZXhwb3J0IHsgdXNlVlQgfTsiLCJmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfSwgX3R5cGVvZihvYmopOyB9XG5pbXBvcnQgX1BsdXNPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL1BsdXNPdXRsaW5lZFwiO1xuaW1wb3J0IFwiYW50ZC9lcy9idXR0b24vc3R5bGVcIjtcbmltcG9ydCBfQnV0dG9uIGZyb20gXCJhbnRkL2VzL2J1dHRvblwiO1xuaW1wb3J0IFwiYW50ZC9lcy90YWJsZS9zdHlsZVwiO1xuaW1wb3J0IF9UYWJsZSBmcm9tIFwiYW50ZC9lcy90YWJsZVwiO1xuaW1wb3J0IF9Db3B5T3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2xpYi9pY29ucy9Db3B5T3V0bGluZWRcIjtcbmltcG9ydCBfQ2xvc2VPdXRsaW5lZCBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnMvbGliL2ljb25zL0Nsb3NlT3V0bGluZWRcIjtcbmltcG9ydCBcImFudGQvZXMvcG9wY29uZmlybS9zdHlsZVwiO1xuaW1wb3J0IF9Qb3Bjb25maXJtIGZyb20gXCJhbnRkL2VzL3BvcGNvbmZpcm1cIjtcbmltcG9ydCBfQXJyb3dEb3duT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2xpYi9pY29ucy9BcnJvd0Rvd25PdXRsaW5lZFwiO1xuaW1wb3J0IF9BcnJvd1VwT3V0bGluZWQgZnJvbSBcIkBhbnQtZGVzaWduL2ljb25zL2xpYi9pY29ucy9BcnJvd1VwT3V0bGluZWRcIjtcbmltcG9ydCBcImFudGQvZXMvZGl2aWRlci9zdHlsZVwiO1xuaW1wb3J0IF9EaXZpZGVyIGZyb20gXCJhbnRkL2VzL2RpdmlkZXJcIjtcbmltcG9ydCBcImFudGQvZXMvc3BhY2Uvc3R5bGVcIjtcbmltcG9ydCBfU3BhY2UgZnJvbSBcImFudGQvZXMvc3BhY2VcIjtcbmltcG9ydCBcImFudGQvZXMvZm9ybS9zdHlsZVwiO1xuaW1wb3J0IF9Gb3JtIGZyb20gXCJhbnRkL2VzL2Zvcm1cIjtcbmltcG9ydCBfSW5mb0NpcmNsZU91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9saWIvaWNvbnMvSW5mb0NpcmNsZU91dGxpbmVkXCI7XG5pbXBvcnQgXCJhbnRkL2VzL3Rvb2x0aXAvc3R5bGVcIjtcbmltcG9ydCBfVG9vbHRpcCBmcm9tIFwiYW50ZC9lcy90b29sdGlwXCI7XG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7IH1cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgeyBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBpdGVyW1N5bWJvbC5pdGVyYXRvcl0gIT0gbnVsbCB8fCBpdGVyW1wiQEBpdGVyYXRvclwiXSAhPSBudWxsKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkoYXJyKTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KGFyZykgeyB2YXIga2V5ID0gX3RvUHJpbWl0aXZlKGFyZywgXCJzdHJpbmdcIik7IHJldHVybiBfdHlwZW9mKGtleSkgPT09IFwic3ltYm9sXCIgPyBrZXkgOiBTdHJpbmcoa2V5KTsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKGlucHV0LCBoaW50KSB7IGlmIChfdHlwZW9mKGlucHV0KSAhPT0gXCJvYmplY3RcIiB8fCBpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIGlucHV0OyB2YXIgcHJpbSA9IGlucHV0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmIChwcmltICE9PSB1bmRlZmluZWQpIHsgdmFyIHJlcyA9IHByaW0uY2FsbChpbnB1dCwgaGludCB8fCBcImRlZmF1bHRcIik7IGlmIChfdHlwZW9mKHJlcykgIT09IFwib2JqZWN0XCIpIHJldHVybiByZXM7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKGhpbnQgPT09IFwic3RyaW5nXCIgPyBTdHJpbmcgOiBOdW1iZXIpKGlucHV0KTsgfVxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7IHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH1cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTsgcmV0dXJuIGFycjI7IH1cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHsgdmFyIF9pID0gbnVsbCA9PSBhcnIgPyBudWxsIDogXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgU3ltYm9sICYmIGFycltTeW1ib2wuaXRlcmF0b3JdIHx8IGFycltcIkBAaXRlcmF0b3JcIl07IGlmIChudWxsICE9IF9pKSB7IHZhciBfcywgX2UsIF94LCBfciwgX2FyciA9IFtdLCBfbiA9ICEwLCBfZCA9ICExOyB0cnkgeyBpZiAoX3ggPSAoX2kgPSBfaS5jYWxsKGFycikpLm5leHQsIDAgPT09IGkpIHsgaWYgKE9iamVjdChfaSkgIT09IF9pKSByZXR1cm47IF9uID0gITE7IH0gZWxzZSBmb3IgKDsgIShfbiA9IChfcyA9IF94LmNhbGwoX2kpKS5kb25lKSAmJiAoX2Fyci5wdXNoKF9zLnZhbHVlKSwgX2Fyci5sZW5ndGggIT09IGkpOyBfbiA9ICEwKTsgfSBjYXRjaCAoZXJyKSB7IF9kID0gITAsIF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIG51bGwgIT0gX2kucmV0dXJuICYmIChfciA9IF9pLnJldHVybigpLCBPYmplY3QoX3IpICE9PSBfcikpIHJldHVybjsgfSBmaW5hbGx5IHsgaWYgKF9kKSB0aHJvdyBfZTsgfSB9IHJldHVybiBfYXJyOyB9IH1cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfVxuaW1wb3J0IHsgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgVmlydHVhbENlbGwgZnJvbSAnLi92aXJ0dWFsQ2VsbCc7XG5pbXBvcnQgeyB1c2VWVCB9IGZyb20gJ3ZpcnR1YWxpemVkdGFibGVmb3JhbnRkNCc7XG5pbXBvcnQgRkJ1dHRvbiBmcm9tICcuLi9jb21wb25lbnRzL0ZCdXR0b24nO1xuaW1wb3J0IHNvcnRQcm9wZXJ0aWVzIGZyb20gJy4uLy4uL21vZGVscy9zb3J0UHJvcGVydGllcyc7XG5pbXBvcnQgXCIuL2luZGV4LmNzc1wiO1xuO1xudmFyIGdldFRvb2x0aXAgPSBmdW5jdGlvbiBnZXRUb29sdGlwKHRvb2x0aXApIHtcbiAgaWYgKCF0b29sdGlwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICh0eXBlb2YgdG9vbHRpcCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGl0bGU6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XG4gICAgICAgICAgX19odG1sOiB0b29sdGlwXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfTtcbiAgfVxuICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0b29sdGlwKSwge1xuICAgIHRpdGxlOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IHtcbiAgICAgICAgX19odG1sOiB0b29sdGlwLnRpdGxlXG4gICAgICB9XG4gICAgfSlcbiAgfSk7XG59O1xudmFyIFZpcnR1YWxMaXN0ID0gZnVuY3Rpb24gVmlydHVhbExpc3QocHJvcHMpIHtcbiAgdmFyIF9hLCBfYjtcbiAgdmFyIGZvcm0gPSBwcm9wcy5mb3JtLFxuICAgIHNjaGVtYSA9IHByb3BzLnNjaGVtYSxcbiAgICBmaWVsZHMgPSBwcm9wcy5maWVsZHMsXG4gICAgcm9vdFBhdGggPSBwcm9wcy5yb290UGF0aCxcbiAgICByZW5kZXJDb3JlID0gcHJvcHMucmVuZGVyQ29yZSxcbiAgICByZWFkT25seSA9IHByb3BzLnJlYWRPbmx5LFxuICAgIG9wZXJhdGVCdG5UeXBlID0gcHJvcHMub3BlcmF0ZUJ0blR5cGUsXG4gICAgYWRkQnRuUHJvcHMgPSBwcm9wcy5hZGRCdG5Qcm9wcyxcbiAgICBkZWxDb25maXJtUHJvcHMgPSBwcm9wcy5kZWxDb25maXJtUHJvcHMsXG4gICAgY29weUJ0blByb3BzID0gcHJvcHMuY29weUJ0blByb3BzLFxuICAgIGRlbGV0ZUJ0blByb3BzID0gcHJvcHMuZGVsZXRlQnRuUHJvcHMsXG4gICAgbW92ZVVwQnRuUHJvcHMgPSBwcm9wcy5tb3ZlVXBCdG5Qcm9wcyxcbiAgICBtb3ZlRG93bkJ0blByb3BzID0gcHJvcHMubW92ZURvd25CdG5Qcm9wcyxcbiAgICBhY3Rpb25Db2x1bW5Qcm9wcyA9IHByb3BzLmFjdGlvbkNvbHVtblByb3BzLFxuICAgIF9wcm9wcyRzY3JvbGxZID0gcHJvcHMuc2Nyb2xsWSxcbiAgICBzY3JvbGxZID0gX3Byb3BzJHNjcm9sbFkgPT09IHZvaWQgMCA/IDYwMCA6IF9wcm9wcyRzY3JvbGxZLFxuICAgIGhpZGVEZWxldGUgPSBwcm9wcy5oaWRlRGVsZXRlLFxuICAgIGhpZGVDb3B5ID0gcHJvcHMuaGlkZUNvcHksXG4gICAgaGlkZU1vdmUgPSBwcm9wcy5oaWRlTW92ZSxcbiAgICBoaWRlQWRkID0gcHJvcHMuaGlkZUFkZCxcbiAgICBhZGRJdGVtID0gcHJvcHMuYWRkSXRlbSxcbiAgICBjb3B5SXRlbSA9IHByb3BzLmNvcHlJdGVtLFxuICAgIG1vdmVJdGVtID0gcHJvcHMubW92ZUl0ZW0sXG4gICAgcmVtb3ZlSXRlbSA9IHByb3BzLnJlbW92ZUl0ZW0sXG4gICAgY29uZmlnQ29udGV4dCA9IHByb3BzLmNvbmZpZ0NvbnRleHQsXG4gICAgdmFsaWRhdGVQb3BvdmVyID0gcHJvcHMudmFsaWRhdGVQb3BvdmVyO1xuICB2YXIgZ2xvYmFsQ29uZmlnID0gY29uZmlnQ29udGV4dC5nbG9iYWxDb25maWc7XG4gIHZhciBpc2xpZGF0ZVBvcG92ZXIgPSAoX2EgPSB2YWxpZGF0ZVBvcG92ZXIgIT09IG51bGwgJiYgdmFsaWRhdGVQb3BvdmVyICE9PSB2b2lkIDAgPyB2YWxpZGF0ZVBvcG92ZXIgOiBnbG9iYWxDb25maWcgPT09IG51bGwgfHwgZ2xvYmFsQ29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBnbG9iYWxDb25maWcubGlzdFZhbGlkYXRlUG9wb3ZlcikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdHJ1ZTtcbiAgdmFyIGNvbEhlYWRlclRleHQgPSBhY3Rpb25Db2x1bW5Qcm9wcy5jb2xIZWFkZXJUZXh0LFxuICAgIG90aGVyQWN0aW9uQ29sdW1uUHJvcHMgPSBfX3Jlc3QoYWN0aW9uQ29sdW1uUHJvcHMsIFtcImNvbEhlYWRlclRleHRcIl0pO1xuICB2YXIgaXRlbVNjaGVtYSA9ICgoX2IgPSBzY2hlbWEgPT09IG51bGwgfHwgc2NoZW1hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzY2hlbWEuaXRlbXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5wcm9wZXJ0aWVzKSB8fCB7fTtcbiAgdmFyIF91c2VWVCA9IHVzZVZUKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNjcm9sbDoge1xuICAgICAgICAgIHk6IHNjcm9sbFlcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LCBbXSksXG4gICAgX3VzZVZUMiA9IF9zbGljZWRUb0FycmF5KF91c2VWVCwgMiksXG4gICAgdnQgPSBfdXNlVlQyWzBdLFxuICAgIHNldF9jb21wb25lbnRzID0gX3VzZVZUMlsxXTtcbiAgdmFyIGhhbmRsZUNvcHkgPSBmdW5jdGlvbiBoYW5kbGVDb3B5KG5hbWUpIHtcbiAgICB2YXIgdmFsdWUgPSBmb3JtLmdldEZpZWxkVmFsdWUocm9vdFBhdGguY29uY2F0KG5hbWUpKTtcbiAgICBjb3B5SXRlbSh2YWx1ZSk7XG4gIH07XG4gIHZhciBjb2x1bW5zID0gc29ydFByb3BlcnRpZXMoT2JqZWN0LmVudHJpZXMoaXRlbVNjaGVtYSkpLm1hcChmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBfcmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDIpLFxuICAgICAgZGF0YUluZGV4ID0gX3JlZjJbMF0sXG4gICAgICBpdGVtID0gX3JlZjJbMV07XG4gICAgdmFyIHJlcXVpcmVkID0gaXRlbS5yZXF1aXJlZCxcbiAgICAgIHRpdGxlID0gaXRlbS50aXRsZSxcbiAgICAgIHdpZHRoID0gaXRlbS53aWR0aCxcbiAgICAgIHRvb2x0aXAgPSBpdGVtLnRvb2x0aXA7XG4gICAgdmFyIHRvb2x0aXBQcm9wcyA9IGdldFRvb2x0aXAodG9vbHRpcCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGFJbmRleDogZGF0YUluZGV4LFxuICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgdGl0bGU6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCByZXF1aXJlZCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBzdHlsZToge1xuICAgICAgICAgIGNvbG9yOiAncmVkJyxcbiAgICAgICAgICBtYXJnaW5SaWdodDogJzNweCdcbiAgICAgICAgfVxuICAgICAgfSwgXCIqXCIpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgdGl0bGUpLCB0b29sdGlwUHJvcHMgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1Rvb2x0aXAsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICBwbGFjZW1lbnQ6ICd0b3AnXG4gICAgICB9LCB0b29sdGlwUHJvcHMpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfSW5mb0NpcmNsZU91dGxpbmVkLCB7XG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgbWFyZ2luTGVmdDogNlxuICAgICAgICB9XG4gICAgICB9KSkpLFxuICAgICAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoXywgZmllbGQpIHtcbiAgICAgICAgdmFyIGZpZWxkU2NoZW1hID0ge1xuICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICAgIHByb3BlcnRpZXM6IF9kZWZpbmVQcm9wZXJ0eSh7fSwgZGF0YUluZGV4LCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGl0ZW1TY2hlbWFbZGF0YUluZGV4XSksIHtcbiAgICAgICAgICAgIGZpZWxkQ29sOiAyNFxuICAgICAgICAgIH0pKVxuICAgICAgICB9O1xuICAgICAgICBpZiAoIWlzbGlkYXRlUG9wb3Zlcikge1xuICAgICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6ICdmci10YWJsZS1jZWxsLWNvbnRlbnQnXG4gICAgICAgICAgfSwgcmVuZGVyQ29yZSh7XG4gICAgICAgICAgICBwYXJlbnRQYXRoOiBbZmllbGQubmFtZV0sXG4gICAgICAgICAgICByb290UGF0aDogW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShyb290UGF0aCksIFtmaWVsZC5uYW1lXSksXG4gICAgICAgICAgICBzY2hlbWE6IGZpZWxkU2NoZW1hXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChWaXJ0dWFsQ2VsbCwge1xuICAgICAgICAgIHJlbmRlckNvcmU6IHJlbmRlckNvcmUsXG4gICAgICAgICAgc2NoZW1hOiBmaWVsZFNjaGVtYSxcbiAgICAgICAgICBwYXJlbnRQYXRoOiBbZmllbGQubmFtZV0sXG4gICAgICAgICAgcm9vdFBhdGg6IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocm9vdFBhdGgpLCBbZmllbGQubmFtZV0pLFxuICAgICAgICAgIGRhdGFJbmRleDogZGF0YUluZGV4XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gIH0pO1xuICBpZiAoIXJlYWRPbmx5KSB7XG4gICAgY29sdW1ucy5wdXNoKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgICB0aXRsZTogY29sSGVhZGVyVGV4dCxcbiAgICAgIHdpZHRoOiAnMTkwcHgnLFxuICAgICAgZml4ZWQ6ICdyaWdodCdcbiAgICB9LCBvdGhlckFjdGlvbkNvbHVtblByb3BzKSwge1xuICAgICAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoXywgZmllbGQpIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Gb3JtLkl0ZW0sIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9TcGFjZSwge1xuICAgICAgICAgIGNsYXNzTmFtZTogJ2ZyLWxpc3QtaXRlbS1vcGVyYXRlJyxcbiAgICAgICAgICBzcGxpdDogb3BlcmF0ZUJ0blR5cGUgIT09ICdpY29uJyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfRGl2aWRlciwge1xuICAgICAgICAgICAgdHlwZTogJ3ZlcnRpY2FsJ1xuICAgICAgICAgIH0pXG4gICAgICAgIH0sICFoaWRlTW92ZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgZGlzYWJsZWQ6IGZpZWxkLm5hbWUgPT09IDAsXG4gICAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgICAgIHJldHVybiBtb3ZlSXRlbShmaWVsZC5uYW1lLCBmaWVsZC5uYW1lIC0gMSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBpY29uOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfQXJyb3dVcE91dGxpbmVkLCBudWxsKVxuICAgICAgICB9LCBtb3ZlVXBCdG5Qcm9wcykpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGQnV0dG9uLCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICBkaXNhYmxlZDogZmllbGQubmFtZSA9PT0gZmllbGRzLmxlbmd0aCAtIDEsXG4gICAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgICAgIHJldHVybiBtb3ZlSXRlbShmaWVsZC5uYW1lLCBmaWVsZC5uYW1lICsgMSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBpY29uOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfQXJyb3dEb3duT3V0bGluZWQsIG51bGwpXG4gICAgICAgIH0sIG1vdmVEb3duQnRuUHJvcHMpKSksICFoaWRlRGVsZXRlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9Qb3Bjb25maXJtLCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICBvbkNvbmZpcm06IGZ1bmN0aW9uIG9uQ29uZmlybSgpIHtcbiAgICAgICAgICAgIHJldHVybiByZW1vdmVJdGVtKGZpZWxkLm5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgZGVsQ29uZmlybVByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgaWNvbjogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0Nsb3NlT3V0bGluZWQsIG51bGwpLFxuICAgICAgICAgIGJ0blR5cGU6IG9wZXJhdGVCdG5UeXBlXG4gICAgICAgIH0sIGRlbGV0ZUJ0blByb3BzKSkpLCAhaGlkZUNvcHkgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVDb3B5KGZpZWxkLm5hbWUpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgaWNvbjogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0NvcHlPdXRsaW5lZCwgbnVsbClcbiAgICAgICAgfSwgY29weUJ0blByb3BzKSkpKTtcbiAgICAgIH1cbiAgICB9KSk7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfVGFibGUsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoJ2ZyLXZpcnR1YWwtbGlzdCcsIHtcbiAgICAgICdmci12aXJ0dWFsLWxpc3Qtbm8tcG9wb3Zlcic6ICFpc2xpZGF0ZVBvcG92ZXJcbiAgICB9KSxcbiAgICBzaXplOiAnbWlkZGxlJyxcbiAgICBjb2x1bW5zOiBjb2x1bW5zLFxuICAgIGRhdGFTb3VyY2U6IGZpZWxkcyxcbiAgICBwYWdpbmF0aW9uOiBmYWxzZSxcbiAgICBzY3JvbGw6IHtcbiAgICAgIHk6IHNjcm9sbFlcbiAgICB9LFxuICAgIGNvbXBvbmVudHM6IHZ0XG4gIH0pLCAoIXNjaGVtYS5tYXggfHwgZmllbGRzLmxlbmd0aCA8IHNjaGVtYS5tYXgpICYmICFoaWRlQWRkICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9CdXR0b24sIE9iamVjdC5hc3NpZ24oe1xuICAgIGljb246IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9QbHVzT3V0bGluZWQsIG51bGwpLFxuICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICByZXR1cm4gYWRkSXRlbSgpO1xuICAgIH1cbiAgfSwgYWRkQnRuUHJvcHMpKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgVmlydHVhbExpc3Q7IiwiaW1wb3J0IF9DbG9zZU91dGxpbmVkIGZyb20gXCJAYW50LWRlc2lnbi9pY29ucy9saWIvaWNvbnMvQ2xvc2VPdXRsaW5lZFwiO1xuaW1wb3J0IFwiYW50ZC9lcy9wb3Bjb25maXJtL3N0eWxlXCI7XG5pbXBvcnQgX1BvcGNvbmZpcm0gZnJvbSBcImFudGQvZXMvcG9wY29uZmlybVwiO1xuaW1wb3J0IFwiYW50ZC9lcy9jb25maWctcHJvdmlkZXIvc3R5bGVcIjtcbmltcG9ydCBfQ29uZmlnUHJvdmlkZXIgZnJvbSBcImFudGQvZXMvY29uZmlnLXByb3ZpZGVyXCI7XG5pbXBvcnQgXCJhbnRkL2VzL3RhYnMvc3R5bGVcIjtcbmltcG9ydCBfVGFicyBmcm9tIFwiYW50ZC9lcy90YWJzXCI7XG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7IH1cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgeyBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBpdGVyW1N5bWJvbC5pdGVyYXRvcl0gIT0gbnVsbCB8fCBpdGVyW1wiQEBpdGVyYXRvclwiXSAhPSBudWxsKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkoYXJyKTsgfVxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7IHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH1cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTsgcmV0dXJuIGFycjI7IH1cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHsgdmFyIF9pID0gbnVsbCA9PSBhcnIgPyBudWxsIDogXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgU3ltYm9sICYmIGFycltTeW1ib2wuaXRlcmF0b3JdIHx8IGFycltcIkBAaXRlcmF0b3JcIl07IGlmIChudWxsICE9IF9pKSB7IHZhciBfcywgX2UsIF94LCBfciwgX2FyciA9IFtdLCBfbiA9ICEwLCBfZCA9ICExOyB0cnkgeyBpZiAoX3ggPSAoX2kgPSBfaS5jYWxsKGFycikpLm5leHQsIDAgPT09IGkpIHsgaWYgKE9iamVjdChfaSkgIT09IF9pKSByZXR1cm47IF9uID0gITE7IH0gZWxzZSBmb3IgKDsgIShfbiA9IChfcyA9IF94LmNhbGwoX2kpKS5kb25lKSAmJiAoX2Fyci5wdXNoKF9zLnZhbHVlKSwgX2Fyci5sZW5ndGggIT09IGkpOyBfbiA9ICEwKTsgfSBjYXRjaCAoZXJyKSB7IF9kID0gITAsIF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIG51bGwgIT0gX2kucmV0dXJuICYmIChfciA9IF9pLnJldHVybigpLCBPYmplY3QoX3IpICE9PSBfcikpIHJldHVybjsgfSBmaW5hbGx5IHsgaWYgKF9kKSB0aHJvdyBfZTsgfSB9IHJldHVybiBfYXJyOyB9IH1cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfVxuaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdHJhbnNsYXRpb24gfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgXCIuL2luZGV4LmNzc1wiO1xudmFyIFRhYlBhbmUgPSBfVGFicy5UYWJQYW5lO1xuO1xudmFyIFRhYkxpc3QgPSBmdW5jdGlvbiBUYWJMaXN0KHByb3BzKSB7XG4gIHZhciBzY2hlbWEgPSBwcm9wcy5zY2hlbWEsXG4gICAgZmllbGRzID0gcHJvcHMuZmllbGRzLFxuICAgIHJvb3RQYXRoID0gcHJvcHMucm9vdFBhdGgsXG4gICAgcmVuZGVyQ29yZSA9IHByb3BzLnJlbmRlckNvcmUsXG4gICAgcmVhZE9ubHkgPSBwcm9wcy5yZWFkT25seSxcbiAgICBkZWxDb25maXJtUHJvcHMgPSBwcm9wcy5kZWxDb25maXJtUHJvcHMsXG4gICAgdGFiTmFtZSA9IHByb3BzLnRhYk5hbWUsXG4gICAgaGlkZURlbGV0ZSA9IHByb3BzLmhpZGVEZWxldGUsXG4gICAgaGlkZUFkZCA9IHByb3BzLmhpZGVBZGQsXG4gICAgYWRkSXRlbSA9IHByb3BzLmFkZEl0ZW0sXG4gICAgcmVtb3ZlSXRlbSA9IHByb3BzLnJlbW92ZUl0ZW0sXG4gICAgX3Byb3BzJHRhYkl0ZW1Qcm9wcyA9IHByb3BzLnRhYkl0ZW1Qcm9wcyxcbiAgICB0YWJJdGVtUHJvcHMgPSBfcHJvcHMkdGFiSXRlbVByb3BzID09PSB2b2lkIDAgPyB7fSA6IF9wcm9wcyR0YWJJdGVtUHJvcHM7XG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZSgnMCcpLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIGFjdGl2ZUtleSA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0QWN0aXZlS2V5ID0gX3VzZVN0YXRlMlsxXTtcbiAgdmFyIGNvbmZpZ0N0eCA9IHVzZUNvbnRleHQoX0NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnRleHQpO1xuICB2YXIgdCA9IHRyYW5zbGF0aW9uKGNvbmZpZ0N0eCk7XG4gIHZhciBnZXRDdXJyZW50VGFiUGFuZU5hbWUgPSBmdW5jdGlvbiBnZXRDdXJyZW50VGFiUGFuZU5hbWUoaWR4KSB7XG4gICAgcmV0dXJuIHRhYk5hbWUgaW5zdGFuY2VvZiBBcnJheSA/IHRhYk5hbWVbaWR4XSB8fCBpZHggKyAxIDogXCJcIi5jb25jYXQodGFiTmFtZSB8fCB0KCdpdGVtJyksIFwiIFwiKS5jb25jYXQoaWR4ICsgMSk7XG4gIH07XG4gIHZhciBoYW5kbGVEZWxldGUgPSBmdW5jdGlvbiBoYW5kbGVEZWxldGUodGFyZ2V0S2V5KSB7XG4gICAgcmVtb3ZlSXRlbSh0YXJnZXRLZXkpO1xuICAgIHNldEFjdGl2ZUtleShcIlwiLmNvbmNhdCh0YXJnZXRLZXkgPiAxID8gdGFyZ2V0S2V5IC0gMSA6IDApKTtcbiAgfTtcbiAgdmFyIGhhbmRsZUVkaXQgPSBmdW5jdGlvbiBoYW5kbGVFZGl0KHRhcmdldEtleSwgYWN0aW9uKSB7XG4gICAgaWYgKGFjdGlvbiA9PT0gJ2FkZCcpIHtcbiAgICAgIGlmICgoIXNjaGVtYS5tYXggfHwgZmllbGRzLmxlbmd0aCA8IHNjaGVtYS5tYXgpICYmICFyZWFkT25seSAmJiAhaGlkZUFkZCkge1xuICAgICAgICBhZGRJdGVtKCk7XG4gICAgICAgIHZhciBjdXJyZW50S2V5ID0gZmllbGRzLmxlbmd0aDtcbiAgICAgICAgc2V0QWN0aXZlS2V5KFwiXCIuY29uY2F0KGN1cnJlbnRLZXkpKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3JlbW92ZScpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH07XG4gIHZhciByZW5kZXJDbG9zZSA9IGZ1bmN0aW9uIHJlbmRlckNsb3NlKG5hbWUpIHtcbiAgICByZXR1cm4gIXJlYWRPbmx5ICYmICFoaWRlRGVsZXRlID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX1BvcGNvbmZpcm0sIE9iamVjdC5hc3NpZ24oe1xuICAgICAgb25Db25maXJtOiBmdW5jdGlvbiBvbkNvbmZpcm0oKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVEZWxldGUobmFtZSk7XG4gICAgICB9XG4gICAgfSwgZGVsQ29uZmlybVByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0Nsb3NlT3V0bGluZWQsIG51bGwpKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsKTtcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfVGFicywge1xuICAgIGNsYXNzTmFtZTogJ2ZyLXRhYi1saXN0JyxcbiAgICB0eXBlOiAnZWRpdGFibGUtY2FyZCcsXG4gICAgb25DaGFuZ2U6IHNldEFjdGl2ZUtleSxcbiAgICBhY3RpdmVLZXk6IGFjdGl2ZUtleSArICcnLFxuICAgIG9uRWRpdDogaGFuZGxlRWRpdCxcbiAgICBoaWRlQWRkOiByZWFkT25seSB8fCBoaWRlQWRkXG4gIH0sIGZpZWxkcy5tYXAoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIga2V5ID0gX3JlZi5rZXksXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUYWJQYW5lLCBPYmplY3QuYXNzaWduKHt9LCB0YWJJdGVtUHJvcHMsIHtcbiAgICAgIHRhYjogZ2V0Q3VycmVudFRhYlBhbmVOYW1lKG5hbWUpLFxuICAgICAga2V5OiBuYW1lLFxuICAgICAgY2xhc3NOYW1lOiAnZnItbGlzdC1pdGVtJyxcbiAgICAgIGNsb3NlSWNvbjogcmVuZGVyQ2xvc2UobmFtZSlcbiAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgZmxleDogMVxuICAgICAgfVxuICAgIH0sIHJlbmRlckNvcmUoe1xuICAgICAgc2NoZW1hOiBzY2hlbWEsXG4gICAgICBwYXJlbnRQYXRoOiBbbmFtZV0sXG4gICAgICByb290UGF0aDogW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShyb290UGF0aCksIFtuYW1lXSlcbiAgICB9KSkpO1xuICB9KSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFRhYkxpc3Q7IiwiZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH0sIF90eXBlb2Yob2JqKTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KGFyZykgeyB2YXIga2V5ID0gX3RvUHJpbWl0aXZlKGFyZywgXCJzdHJpbmdcIik7IHJldHVybiBfdHlwZW9mKGtleSkgPT09IFwic3ltYm9sXCIgPyBrZXkgOiBTdHJpbmcoa2V5KTsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKGlucHV0LCBoaW50KSB7IGlmIChfdHlwZW9mKGlucHV0KSAhPT0gXCJvYmplY3RcIiB8fCBpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIGlucHV0OyB2YXIgcHJpbSA9IGlucHV0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmIChwcmltICE9PSB1bmRlZmluZWQpIHsgdmFyIHJlcyA9IHByaW0uY2FsbChpbnB1dCwgaGludCB8fCBcImRlZmF1bHRcIik7IGlmIChfdHlwZW9mKHJlcykgIT09IFwib2JqZWN0XCIpIHJldHVybiByZXM7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKGhpbnQgPT09IFwic3RyaW5nXCIgPyBTdHJpbmcgOiBOdW1iZXIpKGlucHV0KTsgfVxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFwiLi9pbmRleC5jc3NcIjtcbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoX3JlZikge1xuICB2YXIgc2NoZW1hID0gX3JlZi5zY2hlbWE7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc25hbWVzKCdmci12b2lkLXRpdGxlJywgX2RlZmluZVByb3BlcnR5KHt9LCBzY2hlbWEgPT09IG51bGwgfHwgc2NoZW1hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzY2hlbWEuY2xhc3NOYW1lLCAhIShzY2hlbWEgPT09IG51bGwgfHwgc2NoZW1hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzY2hlbWEuY2xhc3NOYW1lKSkpXG4gIH0sIHNjaGVtYS50aXRsZSk7XG59KTsiLCJpbXBvcnQgXCJhbnRkL2VzL2NvbmZpZy1wcm92aWRlci9zdHlsZVwiO1xuaW1wb3J0IF9Db25maWdQcm92aWRlciBmcm9tIFwiYW50ZC9lcy9jb25maWctcHJvdmlkZXJcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VDb250ZXh0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB0cmFuc2xhdGlvbiB9IGZyb20gJy4uL3V0aWxzJztcbnZhciBFcnJvclNjaGVtYSA9IGZ1bmN0aW9uIEVycm9yU2NoZW1hKHNjaGVtYSkge1xuICB2YXIgY29uZmlnQ3R4ID0gdXNlQ29udGV4dChfQ29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCk7XG4gIHZhciB0ID0gdHJhbnNsYXRpb24oY29uZmlnQ3R4KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBzdHlsZToge1xuICAgICAgY29sb3I6ICdyZWQnXG4gICAgfVxuICB9LCB0KCdzY2hlbWFfbm90X21hdGNoJykpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBudWxsLCBKU09OLnN0cmluZ2lmeShzY2hlbWEpKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgRXJyb3JTY2hlbWE7IiwiZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7IHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH1cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTsgcmV0dXJuIGFycjI7IH1cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHsgdmFyIF9pID0gbnVsbCA9PSBhcnIgPyBudWxsIDogXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgU3ltYm9sICYmIGFycltTeW1ib2wuaXRlcmF0b3JdIHx8IGFycltcIkBAaXRlcmF0b3JcIl07IGlmIChudWxsICE9IF9pKSB7IHZhciBfcywgX2UsIF94LCBfciwgX2FyciA9IFtdLCBfbiA9ICEwLCBfZCA9ICExOyB0cnkgeyBpZiAoX3ggPSAoX2kgPSBfaS5jYWxsKGFycikpLm5leHQsIDAgPT09IGkpIHsgaWYgKE9iamVjdChfaSkgIT09IF9pKSByZXR1cm47IF9uID0gITE7IH0gZWxzZSBmb3IgKDsgIShfbiA9IChfcyA9IF94LmNhbGwoX2kpKS5kb25lKSAmJiAoX2Fyci5wdXNoKF9zLnZhbHVlKSwgX2Fyci5sZW5ndGggIT09IGkpOyBfbiA9ICEwKTsgfSBjYXRjaCAoZXJyKSB7IF9kID0gITAsIF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIG51bGwgIT0gX2kucmV0dXJuICYmIChfciA9IF9pLnJldHVybigpLCBPYmplY3QoX3IpICE9PSBfcikpIHJldHVybjsgfSBmaW5hbGx5IHsgaWYgKF9kKSB0aHJvdyBfZTsgfSB9IHJldHVybiBfYXJyOyB9IH1cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfVxuaW1wb3J0IHsgX2Nsb25lRGVlcCwgaXNPYmpUeXBlLCBpc0xpc3RUeXBlIH0gZnJvbSAnLi4vdXRpbHMvaW5kZXgnO1xuaW1wb3J0IHNvcnRQcm9wZXJ0aWVzIGZyb20gJy4vc29ydFByb3BlcnRpZXMnO1xuZXhwb3J0IHZhciBnZXRLZXlGcm9tUGF0aCA9IGZ1bmN0aW9uIGdldEtleUZyb21QYXRoKCkge1xuICB2YXIgcGF0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJyMnO1xuICB0cnkge1xuICAgIHZhciBhcnIgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgdmFyIGxhc3QgPSBhcnIuc2xpY2UoLTEpWzBdO1xuICAgIHZhciByZXN1bHQgPSBsYXN0LnJlcGxhY2UoJ1tdJywgJycpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihlcnJvciwgJ2dldEtleUZyb21QYXRoJyk7XG4gICAgcmV0dXJuICcnO1xuICB9XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNjaGVtYUZyb21GbGF0dGVuKGZsYXR0ZW4pIHtcbiAgdmFyIHBhdGggPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICcjJztcbiAgdmFyIHNjaGVtYSA9IHt9O1xuICB2YXIgaXRlbSA9IF9jbG9uZURlZXAoZmxhdHRlbltwYXRoXSk7XG4gIGlmICghaXRlbSkge1xuICAgIHJldHVybiBzY2hlbWE7XG4gIH1cbiAgc2NoZW1hID0gaXRlbS5zY2hlbWE7XG4gIC8vIHNjaGVtYS4kaWQgJiYgZGVsZXRlIHNjaGVtYS4kaWQ7XG4gIGlmIChpdGVtLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICBpdGVtLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICBpZiAoIWZsYXR0ZW5bY2hpbGRdKSByZXR1cm47XG4gICAgICB2YXIga2V5ID0gZ2V0S2V5RnJvbVBhdGgoY2hpbGQpO1xuICAgICAgaWYgKGlzT2JqVHlwZShzY2hlbWEpKSB7XG4gICAgICAgIHNjaGVtYS5wcm9wZXJ0aWVzW2tleV0gPSBnZXRTY2hlbWFGcm9tRmxhdHRlbihmbGF0dGVuLCBjaGlsZCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNMaXN0VHlwZShzY2hlbWEpKSB7XG4gICAgICAgIHNjaGVtYS5pdGVtcy5wcm9wZXJ0aWVzW2tleV0gPSBnZXRTY2hlbWFGcm9tRmxhdHRlbihmbGF0dGVuLCBjaGlsZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHNjaGVtYTtcbn1cbi8vIFRPRE86IG1vcmUgdGVzdHMgdG8gbWFrZSBzdXJlIHdlaXJkICYgd3Jvbmcgc2NoZW1hIHdvbid0IGNydXNoXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlblNjaGVtYSgpIHtcbiAgdmFyIF9zY2hlbWEgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICB2YXIgbmFtZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICB2YXIgcGFyZW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQ7XG4gIHZhciBfcmVzdWx0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgPyBhcmd1bWVudHNbM10gOiB1bmRlZmluZWQ7XG4gIC8vIOaOkuW6j1xuICAvLyBfc2NoZW1hID0gb3JkZXJCeShfc2NoZW1hLCBpdGVtID0+IGl0ZW0ub3JkZXIsIFsnYXNjJ10pO1xuICB2YXIgcmVzdWx0ID0gX3Jlc3VsdCB8fCB7fTtcbiAgdmFyIHNjaGVtYSA9IF9jbG9uZURlZXAoX3NjaGVtYSkgfHwge307XG4gIHZhciBfbmFtZSA9IG5hbWUgfHwgJyMnO1xuICBpZiAoIXNjaGVtYS4kaWQpIHtcbiAgICBzY2hlbWEuJGlkID0gX25hbWU7IC8vIHBhdGggYXMgJGlkLCBmb3IgZWFzeSBhY2Nlc3MgdG8gcGF0aCBpbiBzY2hlbWFcbiAgfVxuXG4gIHZhciBjaGlsZHJlbiA9IFtdO1xuICBpZiAoaXNPYmpUeXBlKHNjaGVtYSkpIHtcbiAgICBzb3J0UHJvcGVydGllcyhPYmplY3QuZW50cmllcyhzY2hlbWEucHJvcGVydGllcykpLmZvckVhY2goZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgIHZhciBfcmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDIpLFxuICAgICAgICBrZXkgPSBfcmVmMlswXSxcbiAgICAgICAgdmFsdWUgPSBfcmVmMlsxXTtcbiAgICAgIHZhciBfa2V5ID0gaXNMaXN0VHlwZSh2YWx1ZSkgPyBrZXkgKyAnW10nIDoga2V5O1xuICAgICAgdmFyIHVuaXF1ZU5hbWUgPSBfbmFtZSA9PT0gJyMnID8gX2tleSA6IF9uYW1lICsgJy4nICsgX2tleTtcbiAgICAgIGNoaWxkcmVuLnB1c2godW5pcXVlTmFtZSk7XG4gICAgICBmbGF0dGVuU2NoZW1hKHZhbHVlLCB1bmlxdWVOYW1lLCBfbmFtZSwgcmVzdWx0KTtcbiAgICB9KTtcbiAgICBzY2hlbWEucHJvcGVydGllcyA9IHt9O1xuICB9XG4gIGlmIChpc0xpc3RUeXBlKHNjaGVtYSkpIHtcbiAgICBzb3J0UHJvcGVydGllcyhPYmplY3QuZW50cmllcyhzY2hlbWEuaXRlbXMucHJvcGVydGllcykpLmZvckVhY2goZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgICB2YXIgX3JlZjQgPSBfc2xpY2VkVG9BcnJheShfcmVmMywgMiksXG4gICAgICAgIGtleSA9IF9yZWY0WzBdLFxuICAgICAgICB2YWx1ZSA9IF9yZWY0WzFdO1xuICAgICAgdmFyIF9rZXkgPSBpc0xpc3RUeXBlKHZhbHVlKSA/IGtleSArICdbXScgOiBrZXk7XG4gICAgICB2YXIgdW5pcXVlTmFtZSA9IF9uYW1lID09PSAnIycgPyBfa2V5IDogX25hbWUgKyAnLicgKyBfa2V5O1xuICAgICAgY2hpbGRyZW4ucHVzaCh1bmlxdWVOYW1lKTtcbiAgICAgIGZsYXR0ZW5TY2hlbWEodmFsdWUsIHVuaXF1ZU5hbWUsIF9uYW1lLCByZXN1bHQpO1xuICAgIH0pO1xuICAgIHNjaGVtYS5pdGVtcy5wcm9wZXJ0aWVzID0ge307XG4gIH1cbiAgaWYgKHNjaGVtYS50eXBlKSB7XG4gICAgcmVzdWx0W19uYW1lXSA9IHtcbiAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgc2NoZW1hOiBzY2hlbWEsXG4gICAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgICB9O1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59IiwiaW1wb3J0IFwiYW50ZC9lcy9mb3JtL3N0eWxlXCI7XG5pbXBvcnQgX0Zvcm0gZnJvbSBcImFudGQvZXMvZm9ybVwiO1xuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7IHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH1cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTsgcmV0dXJuIGFycjI7IH1cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHsgdmFyIF9pID0gbnVsbCA9PSBhcnIgPyBudWxsIDogXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgU3ltYm9sICYmIGFycltTeW1ib2wuaXRlcmF0b3JdIHx8IGFycltcIkBAaXRlcmF0b3JcIl07IGlmIChudWxsICE9IF9pKSB7IHZhciBfcywgX2UsIF94LCBfciwgX2FyciA9IFtdLCBfbiA9ICEwLCBfZCA9ICExOyB0cnkgeyBpZiAoX3ggPSAoX2kgPSBfaS5jYWxsKGFycikpLm5leHQsIDAgPT09IGkpIHsgaWYgKE9iamVjdChfaSkgIT09IF9pKSByZXR1cm47IF9uID0gITE7IH0gZWxzZSBmb3IgKDsgIShfbiA9IChfcyA9IF94LmNhbGwoX2kpKS5kb25lKSAmJiAoX2Fyci5wdXNoKF9zLnZhbHVlKSwgX2Fyci5sZW5ndGggIT09IGkpOyBfbiA9ICEwKTsgfSBjYXRjaCAoZXJyKSB7IF9kID0gITAsIF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIG51bGwgIT0gX2kucmV0dXJuICYmIChfciA9IF9pLnJldHVybigpLCBPYmplY3QoX3IpICE9PSBfcikpIHJldHVybjsgfSBmaW5hbGx5IHsgaWYgKF9kKSB0aHJvdyBfZTsgfSB9IHJldHVybiBfYXJyOyB9IH1cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfVxuaW1wb3J0IHsgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB0cmFuc2Zvcm1GaWVsZHNEYXRhLCBnZXRTY2hlbWFGdWxsUGF0aCB9IGZyb20gJy4vZm9ybUNvcmVVdGlscyc7XG5pbXBvcnQgeyBwYXJzZUJpbmRUb1ZhbHVlcywgcGFyc2VWYWx1ZXNUb0JpbmQgfSBmcm9tICcuL2JpbmRWYWx1ZXMnO1xuaW1wb3J0IHsgX2lzTWF0Y2gsIF9zZXQsIF9nZXQsIF9jbG9uZURlZXAsIGlzRnVuY3Rpb24sIGlzT2JqZWN0LCBpc0FycmF5LCB2YWx1ZVJlbW92ZVVuZGVmaW5lZCwgaGFzRnVuY1Byb3BlcnR5IH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgZmxhdHRlblNjaGVtYSBhcyBmbGF0dGVuIH0gZnJvbSAnLi9mbGF0dGVuU2NoZW1hJztcbnZhciB1cGRhdGVTY2hlbWFCeVBhdGggPSBmdW5jdGlvbiB1cGRhdGVTY2hlbWFCeVBhdGgoX3BhdGgsIF9uZXdTY2hlbWEsIGZvcm1TY2hlbWEpIHtcbiAgdmFyIHBhdGggPSBnZXRTY2hlbWFGdWxsUGF0aChfcGF0aCwgZm9ybVNjaGVtYSk7XG4gIHZhciBjdXJyU2NoZW1hID0gX2dldChmb3JtU2NoZW1hLCBwYXRoLCB7fSk7XG4gIHZhciBuZXdTY2hlbWEgPSBpc0Z1bmN0aW9uKF9uZXdTY2hlbWEpID8gX25ld1NjaGVtYShjdXJyU2NoZW1hKSA6IF9uZXdTY2hlbWE7XG4gIHZhciByZXN1bHQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGN1cnJTY2hlbWEpLCBuZXdTY2hlbWEpO1xuICBpZiAobmV3U2NoZW1hLnByb3BzKSB7XG4gICAgcmVzdWx0LnByb3BzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjdXJyU2NoZW1hID09PSBudWxsIHx8IGN1cnJTY2hlbWEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGN1cnJTY2hlbWEucHJvcHMpLCBuZXdTY2hlbWEucHJvcHMpO1xuICB9XG4gIF9zZXQoZm9ybVNjaGVtYSwgcGF0aCwgcmVzdWx0KTtcbn07XG52YXIgZ2V0RmllbGROYW1lID0gZnVuY3Rpb24gZ2V0RmllbGROYW1lKF9wYXRoKSB7XG4gIGlmICghX3BhdGgpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlmICh0eXBlb2YgX3BhdGggPT09ICdib29sZWFuJykge1xuICAgIHJldHVybiBfcGF0aDtcbiAgfVxuICB2YXIgcmVzdWx0ID0gW107XG4gIGlmIChpc0FycmF5KF9wYXRoKSkge1xuICAgIHJlc3VsdCA9IF9wYXRoLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIGl0ZW0uc3BsaXQoJy4nKS5tYXAoZnVuY3Rpb24gKGl0ZSkge1xuICAgICAgICBpZiAoIWlzTmFOKE51bWJlcihpdGUpKSkge1xuICAgICAgICAgIHJldHVybiBpdGUgKiAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGU7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICByZXN1bHQgPSBfcGF0aC5zcGxpdCgnLicpLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgIGlmICghaXNOYU4oTnVtYmVyKGl0ZW0pKSkge1xuICAgICAgcmV0dXJuIGl0ZW0gKiAxO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbTtcbiAgfSk7XG4gIHJlc3VsdCA9IHJlc3VsdC5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnICYmIChpdGVtID09PSBudWxsIHx8IGl0ZW0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGl0ZW0uaW5kZXhPZignWycpKSA9PT0gMCAmJiAoaXRlbSA9PT0gbnVsbCB8fCBpdGVtID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpdGVtLmluZGV4T2YoJ10nKSkgPT09IChpdGVtID09PSBudWxsIHx8IGl0ZW0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGl0ZW0ubGVuZ3RoKSAtIDEpIHtcbiAgICAgIHJldHVybiBOdW1iZXIoaXRlbS5zdWJzdHJpbmcoMSwgaXRlbS5sZW5ndGggLSAxKSk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgdXNlRm9ybSA9IGZ1bmN0aW9uIHVzZUZvcm0oKSB7XG4gIHZhciBfRm9ybSR1c2VGb3JtID0gX0Zvcm0udXNlRm9ybSgpLFxuICAgIF9Gb3JtJHVzZUZvcm0yID0gX3NsaWNlZFRvQXJyYXkoX0Zvcm0kdXNlRm9ybSwgMSksXG4gICAgZm9ybSA9IF9Gb3JtJHVzZUZvcm0yWzBdO1xuICB2YXIgZmxhdHRlblNjaGVtYVJlZiA9IHVzZVJlZih7fSk7XG4gIHZhciBzdG9yZVJlZiA9IHVzZVJlZigpO1xuICB2YXIgc2NoZW1hUmVmID0gdXNlUmVmKHt9KTtcbiAgdmFyIGZpZWxkUmVmcyA9IHVzZVJlZih7fSk7XG4gIHZhciBnZXRGaWVsZEVycm9yID0gZm9ybS5nZXRGaWVsZEVycm9yLFxuICAgIGdldEZpZWxkc0Vycm9yID0gZm9ybS5nZXRGaWVsZHNFcnJvcixcbiAgICBnZXRGaWVsZEluc3RhbmNlID0gZm9ybS5nZXRGaWVsZEluc3RhbmNlLFxuICAgIHNldEZpZWxkc1ZhbHVlID0gZm9ybS5zZXRGaWVsZHNWYWx1ZSxcbiAgICBzZXRGaWVsZHMgPSBmb3JtLnNldEZpZWxkcyxcbiAgICBzY3JvbGxUb0ZpZWxkID0gZm9ybS5zY3JvbGxUb0ZpZWxkLFxuICAgIGlzRmllbGRzVG91Y2hlZCA9IGZvcm0uaXNGaWVsZHNUb3VjaGVkLFxuICAgIGlzRmllbGRUb3VjaGVkID0gZm9ybS5pc0ZpZWxkVG91Y2hlZCxcbiAgICBpc0ZpZWxkVmFsaWRhdGluZyA9IGZvcm0uaXNGaWVsZFZhbGlkYXRpbmcsXG4gICAgcmVzZXRGaWVsZHMgPSBmb3JtLnJlc2V0RmllbGRzLFxuICAgIHZhbGlkYXRlRmllbGRzID0gZm9ybS52YWxpZGF0ZUZpZWxkcyxcbiAgICBvdGhlckZvcm0gPSBfX3Jlc3QoZm9ybSwgW1wiZ2V0RmllbGRFcnJvclwiLCBcImdldEZpZWxkc0Vycm9yXCIsIFwiZ2V0RmllbGRJbnN0YW5jZVwiLCBcInNldEZpZWxkc1ZhbHVlXCIsIFwic2V0RmllbGRzXCIsIFwic2Nyb2xsVG9GaWVsZFwiLCBcImlzRmllbGRzVG91Y2hlZFwiLCBcImlzRmllbGRUb3VjaGVkXCIsIFwiaXNGaWVsZFZhbGlkYXRpbmdcIiwgXCJyZXNldEZpZWxkc1wiLCBcInZhbGlkYXRlRmllbGRzXCJdKTtcbiAgdmFyIHhmb3JtID0gb3RoZXJGb3JtO1xuICB2YXIgc2V0U3RvcmVEYXRhID0gZnVuY3Rpb24gc2V0U3RvcmVEYXRhKGRhdGEpIHtcbiAgICB2YXIgc2V0U3RhdGUgPSBzdG9yZVJlZi5jdXJyZW50LnNldFN0YXRlO1xuICAgIGlmICghc2V0U3RhdGUpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgc2NoZW1hOiBzY2hlbWFSZWYuY3VycmVudCxcbiAgICAgICAgICBmbGF0dGVuU2NoZW1hOiBmbGF0dGVuU2NoZW1hUmVmLmN1cnJlbnRcbiAgICAgICAgfSk7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gICAgc2V0U3RhdGUoZGF0YSk7XG4gIH07XG4gIC8vIOabtOaWsOWNj+iurlxuICB2YXIgaGFuZGxlU2NoZW1hVXBkYXRlID0gZnVuY3Rpb24gaGFuZGxlU2NoZW1hVXBkYXRlKG5ld1NjaGVtYSkge1xuICAgIC8vIGZvcm0uX19zY2hlbWEgPSBPYmplY3QuZnJlZXplKG5ld1NjaGVtYSk7XG4gICAgZmxhdHRlblNjaGVtYVJlZi5jdXJyZW50ID0gZmxhdHRlbihuZXdTY2hlbWEpIHx8IHt9O1xuICAgIHNjaGVtYVJlZi5jdXJyZW50ID0gbmV3U2NoZW1hO1xuICAgIHNldFN0b3JlRGF0YSh7XG4gICAgICBzY2hlbWE6IG5ld1NjaGVtYSxcbiAgICAgIGZsYXR0ZW5TY2hlbWE6IGZsYXR0ZW5TY2hlbWFSZWYuY3VycmVudFxuICAgIH0pO1xuICB9O1xuICAvLyDorr7nva7ljY/orq5cbiAgeGZvcm0uc2V0U2NoZW1hID0gZnVuY3Rpb24gKG9iaikge1xuICAgIHZhciBjb3ZlciA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gICAgaWYgKCFpc09iamVjdChvYmopKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjb3Zlcikge1xuICAgICAgaGFuZGxlU2NoZW1hVXBkYXRlKG9iaik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBzY2hlbWEgPSBfY2xvbmVEZWVwKHNjaGVtYVJlZi5jdXJyZW50KTtcbiAgICBPYmplY3Qua2V5cyhvYmogfHwge30pLmZvckVhY2goZnVuY3Rpb24gKHBhdGgpIHtcbiAgICAgIHVwZGF0ZVNjaGVtYUJ5UGF0aChwYXRoLCBvYmpbcGF0aF0sIHNjaGVtYSk7XG4gICAgfSk7XG4gICAgaGFuZGxlU2NoZW1hVXBkYXRlKHNjaGVtYSk7XG4gIH07XG4gIC8vIOiuvue9ruafkOS4quWtl+auteeahOWNj+iurlxuICB4Zm9ybS5zZXRTY2hlbWFCeVBhdGggPSBmdW5jdGlvbiAoX3BhdGgsIF9uZXdTY2hlbWEpIHtcbiAgICAvLyBkaWZmIOWIpOaWreaYr+WQpumcgOimgeabtOaWsO+8jOWtmOWcqOWHveaVsOi3s+i/h1xuICAgIGlmICghaGFzRnVuY1Byb3BlcnR5KF9uZXdTY2hlbWEpICYmIF9pc01hdGNoKF9uZXdTY2hlbWEsIHhmb3JtLmdldFNjaGVtYUJ5UGF0aChfcGF0aCkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBzY2hlbWEgPSBfY2xvbmVEZWVwKHNjaGVtYVJlZi5jdXJyZW50KTtcbiAgICB1cGRhdGVTY2hlbWFCeVBhdGgoX3BhdGgsIF9uZXdTY2hlbWEsIHNjaGVtYSk7XG4gICAgaGFuZGxlU2NoZW1hVXBkYXRlKHNjaGVtYSk7XG4gIH07XG4gIC8vIGZvcm0uc2V0U2NoZW1hQnlGdWxsUGF0aCA9IChwYXRoOiBzdHJpbmcsIG5ld1NjaGVtYTogYW55KSA9PiB7XG4gIC8vICAgY29uc3Qgc2NoZW1hID0gX2Nsb25lRGVlcChzY2hlbWFSZWYuY3VycmVudCk7XG4gIC8vICAgY29uc3QgY3VyclNjaGVtYSA9IF9nZXQoc2NoZW1hLCBwYXRoLCB7fSk7XG4gIC8vICAgY29uc3QgcmVzdWx0ID0gX21lcmdlV2l0aChjdXJyU2NoZW1hLCBuZXdTY2hlbWEsIChvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSkgPT4ge1xuICAvLyAgICAgcmV0dXJuIHNyY1ZhbHVlO1xuICAvLyAgIH0pO1xuICAvLyAgIF9zZXQoc2NoZW1hLCBwYXRoLCByZXN1bHQpO1xuICAvLyAgIGhhbmRsZVNjaGVtYVVwZGF0ZShzY2hlbWEpO1xuICAvLyB9XG4gIC8vIOiuvue9ruihqOWNleaVsOaNrlxuICB4Zm9ybS5zZXRWYWx1ZXMgPSBmdW5jdGlvbiAoX3ZhbHVlcykge1xuICAgIHZhciB2YWx1ZXMgPSBwYXJzZUJpbmRUb1ZhbHVlcyhfdmFsdWVzLCBmbGF0dGVuU2NoZW1hUmVmLmN1cnJlbnQpO1xuICAgIHNldEZpZWxkc1ZhbHVlKHZhbHVlcyk7XG4gIH07XG4gIC8vIOiOt+WPluihqOWNleaVsOaNrlxuICB4Zm9ybS5nZXRWYWx1ZXMgPSBmdW5jdGlvbiAobmFtZUxpc3QsIGZpbHRlckZ1bmMpIHtcbiAgICB2YXIgdmFsdWVzID0gZm9ybS5nZXRGaWVsZHNWYWx1ZShnZXRGaWVsZE5hbWUobmFtZUxpc3QpLCBmaWx0ZXJGdW5jKTtcbiAgICB2YWx1ZXMgPSB2YWx1ZVJlbW92ZVVuZGVmaW5lZCh2YWx1ZXMpO1xuICAgIHJldHVybiBwYXJzZVZhbHVlc1RvQmluZCh2YWx1ZXMsIGZsYXR0ZW5TY2hlbWFSZWYuY3VycmVudCk7XG4gIH07XG4gIHhmb3JtLmdldFZhbHVlQnlQYXRoID0gZnVuY3Rpb24gKHBhdGgpIHtcbiAgICB2YXIgbmFtZSA9IGdldEZpZWxkTmFtZShwYXRoKTtcbiAgICByZXR1cm4gZm9ybS5nZXRGaWVsZFZhbHVlKG5hbWUpO1xuICB9O1xuICAvLyDorr7nva7mn5DkuKrlrZfmrrXnmoTlgLxcbiAgeGZvcm0uc2V0VmFsdWVCeVBhdGggPSBmdW5jdGlvbiAocGF0aCwgdmFsdWUpIHtcbiAgICBpZiAoIWZvcm0uc2V0RmllbGRWYWx1ZSkge1xuICAgICAgdmFyIHZhbHVlcyA9IGZvcm0uZ2V0RmllbGRzVmFsdWUoKTtcbiAgICAgIF9zZXQodmFsdWVzLCBwYXRoLCB2YWx1ZSk7XG4gICAgICB4Zm9ybS5zZXRWYWx1ZXModmFsdWVzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG5hbWUgPSBnZXRGaWVsZE5hbWUocGF0aCk7XG4gICAgZm9ybS5zZXRGaWVsZFZhbHVlKG5hbWUsIHZhbHVlKTtcbiAgICB0cnkge1xuICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGZvcm0uZ2V0RmllbGRWYWx1ZShuYW1lKSkgIT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSkge1xuICAgICAgICBmb3JtLnNldEZpZWxkVmFsdWUobmFtZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxuICB9O1xuICAvLyDpgJrov4fmn5DkuKrlrZfmrrXnmoQgc2NoZW1hXG4gIHhmb3JtLmdldFNjaGVtYUJ5UGF0aCA9IGZ1bmN0aW9uIChfcGF0aCkge1xuICAgIGlmICh0eXBlb2YgX3BhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ+ivt+i+k+WFpeato+ehrueahOi3r+W+hCcpO1xuICAgIH1cbiAgICB2YXIgcGF0aCA9IGdldFNjaGVtYUZ1bGxQYXRoKF9wYXRoLCBzY2hlbWFSZWYuY3VycmVudCk7XG4gICAgcmV0dXJuIF9nZXQoc2NoZW1hUmVmLmN1cnJlbnQsIHBhdGgpO1xuICB9O1xuICAvLyDojrflj5bljY/orq5cbiAgeGZvcm0uZ2V0U2NoZW1hID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBzY2hlbWFSZWYuY3VycmVudDtcbiAgfTtcbiAgLy8g6K6+572u5LiA57uE5a2X5q616ZSZ6K+vXG4gIHhmb3JtLnNldEVycm9yRmllbGRzID0gZnVuY3Rpb24gKGZpZWxkc0Vycm9yKSB7XG4gICAgdmFyIGZpZWxkc0RhdGEgPSB0cmFuc2Zvcm1GaWVsZHNEYXRhKGZpZWxkc0Vycm9yLCBnZXRGaWVsZE5hbWUpO1xuICAgIGlmICghZmllbGRzRGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZXRGaWVsZHMoZmllbGRzRGF0YSk7XG4gIH07XG4gIC8vIOa4heepuuafkOS4quWtl+auteeahOmUmeivr1xuICB4Zm9ybS5yZW1vdmVFcnJvckZpZWxkID0gZnVuY3Rpb24gKHBhdGgpIHtcbiAgICBzZXRGaWVsZHMoW3tcbiAgICAgIG5hbWU6IGdldEZpZWxkTmFtZShwYXRoKSxcbiAgICAgIGVycm9yczogW11cbiAgICB9XSk7XG4gIH07XG4gIC8vIOiOt+WPluWvueW6lOWtl+auteWQjeeahOmUmeivr+S/oeaBr1xuICB4Zm9ybS5nZXRGaWVsZEVycm9yID0gZnVuY3Rpb24gKHBhdGgpIHtcbiAgICB2YXIgbmFtZSA9IGdldEZpZWxkTmFtZShwYXRoKTtcbiAgICByZXR1cm4gZm9ybS5nZXRGaWVsZEVycm9yKG5hbWUpO1xuICB9O1xuICAvLyDojrflj5bkuIDnu4TlrZfmrrXlkI3lr7nlupTnmoTplJnor6/kv6Hmga/vvIzov5Tlm57kuLrmlbDnu4TlvaLlvI9cbiAgeGZvcm0uZ2V0RmllbGRzRXJyb3IgPSBmdW5jdGlvbiAocGF0aCkge1xuICAgIHZhciBuYW1lID0gZ2V0RmllbGROYW1lKHBhdGgpO1xuICAgIHJldHVybiBnZXRGaWVsZHNFcnJvcihuYW1lKTtcbiAgfTtcbiAgLy8g6I635Y+W5a+55bqU5a2X5q615a6e5L6LXG4gIHhmb3JtLmdldEZpZWxkSW5zdGFuY2UgPSBmdW5jdGlvbiAocGF0aCkge1xuICAgIHZhciBuYW1lID0gZ2V0RmllbGROYW1lKHBhdGgpO1xuICAgIHJldHVybiBnZXRGaWVsZEluc3RhbmNlKG5hbWUpO1xuICB9O1xuICAvLyDojrflj5bpmpDol4/lrZfmrrXmlbDmja5cbiAgeGZvcm0uZ2V0SGlkZGVuVmFsdWVzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWx1ZXMgPSB4Zm9ybS5nZXRWYWx1ZXMoKTtcbiAgICB2YXIgYWxsVmFsdWVzID0geGZvcm0uZ2V0VmFsdWVzKHRydWUpO1xuICAgIHZhciBoaWRkZW5WYWx1ZXMgPSB7fTtcbiAgICB2YXIgcmVjdXJzaW9uID0gZnVuY3Rpb24gcmVjdXJzaW9uKG9iajEsIG9iajIsIHBhdGgpIHtcbiAgICAgIE9iamVjdC5rZXlzKG9iajEpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBvYmoxW2tleV07XG4gICAgICAgIHZhciBfcGF0aCA9IHBhdGggPyBcIlwiLmNvbmNhdChwYXRoLCBcIi5cIikuY29uY2F0KGtleSkgOiBrZXk7XG4gICAgICAgIGlmICghb2JqMi5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgX3NldChoaWRkZW5WYWx1ZXMsIF9wYXRoLCB2YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgICByZWN1cnNpb24odmFsdWUsIG9iajJba2V5XSwgX3BhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHZhbHVlLm1hcChmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICAgICAgICAgIHJlY3Vyc2lvbihpdGVtLCBfZ2V0KG9iajIsIFwiXCIuY29uY2F0KGtleSwgXCJbXCIpLmNvbmNhdChpbmRleCwgXCJdXCIpLCBbXSksIFwiXCIuY29uY2F0KF9wYXRoLCBcIltcIikuY29uY2F0KGluZGV4LCBcIl1cIikpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHJlY3Vyc2lvbihhbGxWYWx1ZXMsIHZhbHVlcywgbnVsbCk7XG4gICAgcmV0dXJuIGhpZGRlblZhbHVlcztcbiAgfTtcbiAgLy8g6K6+572u5LiA57uE5a2X5q6154q25oCBXG4gIHhmb3JtLnNldEZpZWxkcyA9IGZ1bmN0aW9uIChuYW1lTGlzdCkge1xuICAgIHZhciBmaWVsZHNEYXRhID0gdHJhbnNmb3JtRmllbGRzRGF0YShuYW1lTGlzdCwgZ2V0RmllbGROYW1lKTtcbiAgICBpZiAoIWZpZWxkc0RhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0RmllbGRzKGZpZWxkc0RhdGEpO1xuICB9O1xuICB4Zm9ybS5fX2luaXRTdG9yZSA9IGZ1bmN0aW9uIChzdG9yZSkge1xuICAgIHN0b3JlUmVmLmN1cnJlbnQgPSBzdG9yZTtcbiAgfTtcbiAgLy8g5rua5Yqo5Yiw5a+55bqU5a2X5q615L2N572uXG4gIHhmb3JtLnNjcm9sbFRvUGF0aCA9IGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgdmFyIG5hbWUgPSBnZXRGaWVsZE5hbWUocGF0aCk7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHJlc3QgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgcmVzdFtfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuICAgIHNjcm9sbFRvRmllbGQuYXBwbHkodm9pZCAwLCBbbmFtZV0uY29uY2F0KHJlc3QpKTtcbiAgfTtcbiAgLy8g5qOA5p+l5LiA57uE5a2X5q615piv5ZCm6KKr55So5oi35pON5L2c6L+H77yMYWxsVG91Y2hlZCDkuLogdHJ1ZSDml7bmo4Dmn6XmmK/lkKbmiYDmnInlrZfmrrXpg73ooqvmk43kvZzov4dcbiAgeGZvcm0uaXNGaWVsZHNUb3VjaGVkID0gZnVuY3Rpb24gKHBhdGhMaXN0LCBhbGxUb3VjaGVkKSB7XG4gICAgdmFyIG5hbWVMaXN0ID0gKHBhdGhMaXN0IHx8IFtdKS5tYXAoZnVuY3Rpb24gKHBhdGgpIHtcbiAgICAgIHJldHVybiBnZXRGaWVsZE5hbWUocGF0aCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGlzRmllbGRzVG91Y2hlZChuYW1lTGlzdCwgYWxsVG91Y2hlZCk7XG4gIH07XG4gIC8vIOajgOafpeWvueW6lOWtl+auteaYr+WQpuiiq+eUqOaIt+aTjeS9nOi/h1xuICB4Zm9ybS5pc0ZpZWxkVG91Y2hlZCA9IGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgdmFyIG5hbWUgPSBnZXRGaWVsZE5hbWUocGF0aCk7XG4gICAgcmV0dXJuIGlzRmllbGRUb3VjaGVkKG5hbWUpO1xuICB9O1xuICAvLyDmo4Dmn6Xlr7nlupTlrZfmrrXmmK/lkKbooqvnlKjmiLfmk43kvZzov4dcbiAgeGZvcm0uaXNGaWVsZFZhbGlkYXRpbmcgPSBmdW5jdGlvbiAocGF0aCkge1xuICAgIHZhciBuYW1lID0gZ2V0RmllbGROYW1lKHBhdGgpO1xuICAgIHJldHVybiBpc0ZpZWxkVmFsaWRhdGluZyhuYW1lKTtcbiAgfTtcbiAgeGZvcm0ucmVzZXRGaWVsZHMgPSBmdW5jdGlvbiAocGF0aExpc3QpIHtcbiAgICB2YXIgbmFtZUxpc3QgPSAocGF0aExpc3QgfHwgW10pLm1hcChmdW5jdGlvbiAocGF0aCkge1xuICAgICAgcmV0dXJuIGdldEZpZWxkTmFtZShwYXRoKTtcbiAgICB9KTtcbiAgICBpZiAobmFtZUxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgcmVzZXRGaWVsZHMobmFtZUxpc3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNldEZpZWxkcygpO1xuICAgIH1cbiAgfTtcbiAgLy8g6Kem5Y+R6KGo5Y2V6aqM6K+BXG4gIHhmb3JtLnZhbGlkYXRlRmllbGRzID0gZnVuY3Rpb24gKHBhdGhMaXN0KSB7XG4gICAgdmFyIG5hbWVMaXN0ID0gKHBhdGhMaXN0IHx8IFtdKS5tYXAoZnVuY3Rpb24gKHBhdGgpIHtcbiAgICAgIHJldHVybiBnZXRGaWVsZE5hbWUocGF0aCk7XG4gICAgfSk7XG4gICAgaWYgKG5hbWVMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB2YWxpZGF0ZUZpZWxkcyhuYW1lTGlzdCk7XG4gICAgfVxuICAgIHJldHVybiB2YWxpZGF0ZUZpZWxkcygpO1xuICB9O1xuICB4Zm9ybS5nZXRGbGF0dGVuU2NoZW1hID0gZnVuY3Rpb24gKHBhdGgpIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKCFwYXRoKSB7XG4gICAgICByZXR1cm4gZmxhdHRlblNjaGVtYVJlZi5jdXJyZW50O1xuICAgIH1cbiAgICByZXR1cm4gKF9hID0gZmxhdHRlblNjaGVtYVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FbcGF0aF07XG4gIH07XG4gIC8vIOiAgSBBUEkg5YW85a65XG4gIHhmb3JtLm9uSXRlbUNoYW5nZSA9IHhmb3JtLnNldFZhbHVlQnlQYXRoO1xuICB4Zm9ybS5zZXRGaWVsZFJlZiA9IGZ1bmN0aW9uIChwYXRoLCByZWYpIHtcbiAgICBpZiAoIXBhdGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZmllbGRSZWZzLmN1cnJlbnRbcGF0aF0gPSByZWY7XG4gIH07XG4gIHhmb3JtLmdldEZpZWxkUmVmID0gZnVuY3Rpb24gKHBhdGgpIHtcbiAgICByZXR1cm4gZmllbGRSZWZzLmN1cnJlbnRbcGF0aF07XG4gIH07XG4gIHJldHVybiB4Zm9ybTtcbn07XG5leHBvcnQgZGVmYXVsdCB1c2VGb3JtOyIsImltcG9ydCBGb3JtQ29yZSBmcm9tICcuL2Zvcm0tY29yZSc7XG5pbXBvcnQgd2l0aFByb3ZpZGVyIGZyb20gJy4vd2l0aFByb3ZpZGVyJztcbmltcG9ydCAqIGFzIGRlZmF1bHRXaWRnZXRzIGZyb20gJy4vd2lkZ2V0cyc7XG5leHBvcnQgKiBmcm9tICcuL3dpZGdldHMnO1xuZXhwb3J0IHsgbWFwcGluZyB9IGZyb20gJy4vbW9kZWxzL21hcHBpbmcnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB1c2VGb3JtIH0gZnJvbSAnLi9tb2RlbHMvdXNlRm9ybSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGNvbm5lY3RGb3JtIH0gZnJvbSAnLi9mb3JtLWNvcmUvY29ubmVjdEZvcm0nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBTZWFyY2hGb3JtIH0gZnJvbSAnLi9kZXJpdmF0aXZlL1NlYXJjaEZvcm0nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBGb3JtU2xpbVJlbmRlciB9IGZyb20gJy4vZGVyaXZhdGl2ZS9TbGltUmVuZGVyJztcbmV4cG9ydCBkZWZhdWx0IHdpdGhQcm92aWRlcihGb3JtQ29yZSwgZGVmYXVsdFdpZGdldHMpOyIsImV4cG9ydCBkZWZhdWx0IHtcclxuICB0eXBlOiAnb2JqZWN0JyxcclxuICBwcm9wZXJ0aWVzOiB7XHJcbiAgICBsaXN0OiB7XHJcbiAgICAgIHRpdGxlOiAn5pS26JeP572R5Z2A5YiX6KGoJyxcclxuICAgICAgdHlwZTogJ2FycmF5JyxcclxuICAgICAgd2lkZ2V0OiAnQ2FyZExpc3QnLFxyXG4gICAgICBkZWZhdWx0VmFsdWU6IFt7fV0sXHJcbiAgICAgIGl0ZW1zOiB7XHJcbiAgICAgICAgdHlwZTogJ29iamVjdCcsXHJcbiAgICAgICAgd2lkZ2V0OiAnY2FyZCcsXHJcbiAgICAgICAgdGl0bGU6ICdMaXN0Lkl0ZW0nLFxyXG4gICAgICAgIHByb3BlcnRpZXM6IHtcclxuICAgICAgICAgIGlucHV0MToge1xyXG4gICAgICAgICAgICB0aXRsZTogJ+e9keWdgOWQjeWtlycsXHJcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGlucHV0Mjoge1xyXG4gICAgICAgICAgICB0aXRsZTogJ+e9keWdgOmTvuaOpScsXHJcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGp1bXA6IHtcclxuICAgICAgICAgICAgLy8g5oyH5a6a5Li65Yia5Yia5rOo5YaM55qEIHdpZGdldFxyXG4gICAgICAgICAgICB3aWRnZXQ6ICdKdW1wQnV0dG9uJyxcclxuICAgICAgICAgICAgcHJvcHM6IHtcclxuICAgICAgICAgICAgICAvLyDlvZMgYWdlIOWtl+auteabtOaWsOaXtu+8jOiHquWumuS5iee7hOS7tiBNeUlucHV0IOS8muaOpeaUtuWIsOacgOaWsOeahCBhZ2Ug5bGe5oCnXHJcbiAgICAgICAgICAgICAgaHJlZlVybDogJ3t7IGZvcm1EYXRhLmxpc3QgfX0nIFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNBcmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3VtZW50cyk7XG4gIH07XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBiaW5kIGZyb20gJy4vaGVscGVycy9iaW5kLmpzJztcblxuLy8gdXRpbHMgaXMgYSBsaWJyYXJ5IG9mIGdlbmVyaWMgaGVscGVyIGZ1bmN0aW9ucyBub24tc3BlY2lmaWMgdG8gYXhpb3NcblxuY29uc3Qge3RvU3RyaW5nfSA9IE9iamVjdC5wcm90b3R5cGU7XG5jb25zdCB7Z2V0UHJvdG90eXBlT2Z9ID0gT2JqZWN0O1xuXG5jb25zdCBraW5kT2YgPSAoY2FjaGUgPT4gdGhpbmcgPT4ge1xuICAgIGNvbnN0IHN0ciA9IHRvU3RyaW5nLmNhbGwodGhpbmcpO1xuICAgIHJldHVybiBjYWNoZVtzdHJdIHx8IChjYWNoZVtzdHJdID0gc3RyLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpKTtcbn0pKE9iamVjdC5jcmVhdGUobnVsbCkpO1xuXG5jb25zdCBraW5kT2ZUZXN0ID0gKHR5cGUpID0+IHtcbiAgdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuICh0aGluZykgPT4ga2luZE9mKHRoaW5nKSA9PT0gdHlwZVxufVxuXG5jb25zdCB0eXBlT2ZUZXN0ID0gdHlwZSA9PiB0aGluZyA9PiB0eXBlb2YgdGhpbmcgPT09IHR5cGU7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gQXJyYXlcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gQXJyYXksIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCB7aXNBcnJheX0gPSBBcnJheTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyB1bmRlZmluZWRcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSB2YWx1ZSBpcyB1bmRlZmluZWQsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1VuZGVmaW5lZCA9IHR5cGVPZlRlc3QoJ3VuZGVmaW5lZCcpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQnVmZmVyXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQnVmZmVyKHZhbCkge1xuICByZXR1cm4gdmFsICE9PSBudWxsICYmICFpc1VuZGVmaW5lZCh2YWwpICYmIHZhbC5jb25zdHJ1Y3RvciAhPT0gbnVsbCAmJiAhaXNVbmRlZmluZWQodmFsLmNvbnN0cnVjdG9yKVxuICAgICYmIGlzRnVuY3Rpb24odmFsLmNvbnN0cnVjdG9yLmlzQnVmZmVyKSAmJiB2YWwuY29uc3RydWN0b3IuaXNCdWZmZXIodmFsKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gQXJyYXlCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0FycmF5QnVmZmVyID0ga2luZE9mVGVzdCgnQXJyYXlCdWZmZXInKTtcblxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlclZpZXcodmFsKSB7XG4gIGxldCByZXN1bHQ7XG4gIGlmICgodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJykgJiYgKEFycmF5QnVmZmVyLmlzVmlldykpIHtcbiAgICByZXN1bHQgPSBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsKTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSAodmFsKSAmJiAodmFsLmJ1ZmZlcikgJiYgKGlzQXJyYXlCdWZmZXIodmFsLmJ1ZmZlcikpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBTdHJpbmdcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgU3RyaW5nLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNTdHJpbmcgPSB0eXBlT2ZUZXN0KCdzdHJpbmcnKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRnVuY3Rpb24sIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0Z1bmN0aW9uID0gdHlwZU9mVGVzdCgnZnVuY3Rpb24nKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIE51bWJlclxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBOdW1iZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc051bWJlciA9IHR5cGVPZlRlc3QoJ251bWJlcicpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIE9iamVjdFxuICpcbiAqIEBwYXJhbSB7Kn0gdGhpbmcgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBPYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc09iamVjdCA9ICh0aGluZykgPT4gdGhpbmcgIT09IG51bGwgJiYgdHlwZW9mIHRoaW5nID09PSAnb2JqZWN0JztcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEJvb2xlYW5cbiAqXG4gKiBAcGFyYW0geyp9IHRoaW5nIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJvb2xlYW4sIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0Jvb2xlYW4gPSB0aGluZyA9PiB0aGluZyA9PT0gdHJ1ZSB8fCB0aGluZyA9PT0gZmFsc2U7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBwbGFpbiBPYmplY3RcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgcGxhaW4gT2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNQbGFpbk9iamVjdCA9ICh2YWwpID0+IHtcbiAgaWYgKGtpbmRPZih2YWwpICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKHZhbCk7XG4gIHJldHVybiAocHJvdG90eXBlID09PSBudWxsIHx8IHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKSA9PT0gbnVsbCkgJiYgIShTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsKSAmJiAhKFN5bWJvbC5pdGVyYXRvciBpbiB2YWwpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRGF0ZVxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBEYXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNEYXRlID0ga2luZE9mVGVzdCgnRGF0ZScpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZVxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGaWxlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGaWxlID0ga2luZE9mVGVzdCgnRmlsZScpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQmxvYlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCbG9iLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNCbG9iID0ga2luZE9mVGVzdCgnQmxvYicpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZUxpc3RcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRmlsZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzRmlsZUxpc3QgPSBraW5kT2ZUZXN0KCdGaWxlTGlzdCcpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgU3RyZWFtXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmVhbSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzU3RyZWFtID0gKHZhbCkgPT4gaXNPYmplY3QodmFsKSAmJiBpc0Z1bmN0aW9uKHZhbC5waXBlKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZvcm1EYXRhXG4gKlxuICogQHBhcmFtIHsqfSB0aGluZyBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEZvcm1EYXRhLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGb3JtRGF0YSA9ICh0aGluZykgPT4ge1xuICBjb25zdCBwYXR0ZXJuID0gJ1tvYmplY3QgRm9ybURhdGFdJztcbiAgcmV0dXJuIHRoaW5nICYmIChcbiAgICAodHlwZW9mIEZvcm1EYXRhID09PSAnZnVuY3Rpb24nICYmIHRoaW5nIGluc3RhbmNlb2YgRm9ybURhdGEpIHx8XG4gICAgdG9TdHJpbmcuY2FsbCh0aGluZykgPT09IHBhdHRlcm4gfHxcbiAgICAoaXNGdW5jdGlvbih0aGluZy50b1N0cmluZykgJiYgdGhpbmcudG9TdHJpbmcoKSA9PT0gcGF0dGVybilcbiAgKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFVSTFNlYXJjaFBhcmFtcyBvYmplY3RcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgVVJMU2VhcmNoUGFyYW1zIG9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzVVJMU2VhcmNoUGFyYW1zID0ga2luZE9mVGVzdCgnVVJMU2VhcmNoUGFyYW1zJyk7XG5cbi8qKlxuICogVHJpbSBleGNlc3Mgd2hpdGVzcGFjZSBvZmYgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGEgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgU3RyaW5nIHRvIHRyaW1cbiAqXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgU3RyaW5nIGZyZWVkIG9mIGV4Y2VzcyB3aGl0ZXNwYWNlXG4gKi9cbmNvbnN0IHRyaW0gPSAoc3RyKSA9PiBzdHIudHJpbSA/XG4gIHN0ci50cmltKCkgOiBzdHIucmVwbGFjZSgvXltcXHNcXHVGRUZGXFx4QTBdK3xbXFxzXFx1RkVGRlxceEEwXSskL2csICcnKTtcblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgYW4gQXJyYXkgb3IgYW4gT2JqZWN0IGludm9raW5nIGEgZnVuY3Rpb24gZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiBgb2JqYCBpcyBhbiBBcnJheSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGluZGV4LCBhbmQgY29tcGxldGUgYXJyYXkgZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiAnb2JqJyBpcyBhbiBPYmplY3QgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgcGFzc2luZ1xuICogdGhlIHZhbHVlLCBrZXksIGFuZCBjb21wbGV0ZSBvYmplY3QgZm9yIGVhY2ggcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9iaiBUaGUgb2JqZWN0IHRvIGl0ZXJhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBjYWxsYmFjayB0byBpbnZva2UgZm9yIGVhY2ggaXRlbVxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW2FsbE93bktleXMgPSBmYWxzZV1cbiAqIEByZXR1cm5zIHthbnl9XG4gKi9cbmZ1bmN0aW9uIGZvckVhY2gob2JqLCBmbiwge2FsbE93bktleXMgPSBmYWxzZX0gPSB7fSkge1xuICAvLyBEb24ndCBib3RoZXIgaWYgbm8gdmFsdWUgcHJvdmlkZWRcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBpO1xuICBsZXQgbDtcblxuICAvLyBGb3JjZSBhbiBhcnJheSBpZiBub3QgYWxyZWFkeSBzb21ldGhpbmcgaXRlcmFibGVcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gICAgb2JqID0gW29ial07XG4gIH1cblxuICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFycmF5IHZhbHVlc1xuICAgIGZvciAoaSA9IDAsIGwgPSBvYmoubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIG9ialtpXSwgaSwgb2JqKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIG9iamVjdCBrZXlzXG4gICAgY29uc3Qga2V5cyA9IGFsbE93bktleXMgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopIDogT2JqZWN0LmtleXMob2JqKTtcbiAgICBjb25zdCBsZW4gPSBrZXlzLmxlbmd0aDtcbiAgICBsZXQga2V5O1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgZm4uY2FsbChudWxsLCBvYmpba2V5XSwga2V5LCBvYmopO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kS2V5KG9iaiwga2V5KSB7XG4gIGtleSA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgbGV0IGkgPSBrZXlzLmxlbmd0aDtcbiAgbGV0IF9rZXk7XG4gIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgX2tleSA9IGtleXNbaV07XG4gICAgaWYgKGtleSA9PT0gX2tleS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICByZXR1cm4gX2tleTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmNvbnN0IF9nbG9iYWwgPSAoKCkgPT4ge1xuICAvKmVzbGludCBuby11bmRlZjowKi9cbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZ2xvYmFsVGhpcztcbiAgcmV0dXJuIHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IGdsb2JhbClcbn0pKCk7XG5cbmNvbnN0IGlzQ29udGV4dERlZmluZWQgPSAoY29udGV4dCkgPT4gIWlzVW5kZWZpbmVkKGNvbnRleHQpICYmIGNvbnRleHQgIT09IF9nbG9iYWw7XG5cbi8qKlxuICogQWNjZXB0cyB2YXJhcmdzIGV4cGVjdGluZyBlYWNoIGFyZ3VtZW50IHRvIGJlIGFuIG9iamVjdCwgdGhlblxuICogaW1tdXRhYmx5IG1lcmdlcyB0aGUgcHJvcGVydGllcyBvZiBlYWNoIG9iamVjdCBhbmQgcmV0dXJucyByZXN1bHQuXG4gKlxuICogV2hlbiBtdWx0aXBsZSBvYmplY3RzIGNvbnRhaW4gdGhlIHNhbWUga2V5IHRoZSBsYXRlciBvYmplY3QgaW5cbiAqIHRoZSBhcmd1bWVudHMgbGlzdCB3aWxsIHRha2UgcHJlY2VkZW5jZS5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgcmVzdWx0ID0gbWVyZ2Uoe2ZvbzogMTIzfSwge2ZvbzogNDU2fSk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQuZm9vKTsgLy8gb3V0cHV0cyA0NTZcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIE9iamVjdCB0byBtZXJnZVxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJlc3VsdCBvZiBhbGwgbWVyZ2UgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBtZXJnZSgvKiBvYmoxLCBvYmoyLCBvYmozLCAuLi4gKi8pIHtcbiAgY29uc3Qge2Nhc2VsZXNzfSA9IGlzQ29udGV4dERlZmluZWQodGhpcykgJiYgdGhpcyB8fCB7fTtcbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIGNvbnN0IGFzc2lnblZhbHVlID0gKHZhbCwga2V5KSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0S2V5ID0gY2FzZWxlc3MgJiYgZmluZEtleShyZXN1bHQsIGtleSkgfHwga2V5O1xuICAgIGlmIChpc1BsYWluT2JqZWN0KHJlc3VsdFt0YXJnZXRLZXldKSAmJiBpc1BsYWluT2JqZWN0KHZhbCkpIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gbWVyZ2UocmVzdWx0W3RhcmdldEtleV0sIHZhbCk7XG4gICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHZhbCkpIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gbWVyZ2Uoe30sIHZhbCk7XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHZhbCkpIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gdmFsLnNsaWNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gdmFsO1xuICAgIH1cbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwLCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGFyZ3VtZW50c1tpXSAmJiBmb3JFYWNoKGFyZ3VtZW50c1tpXSwgYXNzaWduVmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRXh0ZW5kcyBvYmplY3QgYSBieSBtdXRhYmx5IGFkZGluZyB0byBpdCB0aGUgcHJvcGVydGllcyBvZiBvYmplY3QgYi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYSBUaGUgb2JqZWN0IHRvIGJlIGV4dGVuZGVkXG4gKiBAcGFyYW0ge09iamVjdH0gYiBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBUaGUgb2JqZWN0IHRvIGJpbmQgZnVuY3Rpb24gdG9cbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFthbGxPd25LZXlzXVxuICogQHJldHVybnMge09iamVjdH0gVGhlIHJlc3VsdGluZyB2YWx1ZSBvZiBvYmplY3QgYVxuICovXG5jb25zdCBleHRlbmQgPSAoYSwgYiwgdGhpc0FyZywge2FsbE93bktleXN9PSB7fSkgPT4ge1xuICBmb3JFYWNoKGIsICh2YWwsIGtleSkgPT4ge1xuICAgIGlmICh0aGlzQXJnICYmIGlzRnVuY3Rpb24odmFsKSkge1xuICAgICAgYVtrZXldID0gYmluZCh2YWwsIHRoaXNBcmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhW2tleV0gPSB2YWw7XG4gICAgfVxuICB9LCB7YWxsT3duS2V5c30pO1xuICByZXR1cm4gYTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgYnl0ZSBvcmRlciBtYXJrZXIuIFRoaXMgY2F0Y2hlcyBFRiBCQiBCRiAodGhlIFVURi04IEJPTSlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCB3aXRoIEJPTVxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IGNvbnRlbnQgdmFsdWUgd2l0aG91dCBCT01cbiAqL1xuY29uc3Qgc3RyaXBCT00gPSAoY29udGVudCkgPT4ge1xuICBpZiAoY29udGVudC5jaGFyQ29kZUF0KDApID09PSAweEZFRkYpIHtcbiAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgxKTtcbiAgfVxuICByZXR1cm4gY29udGVudDtcbn1cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdXBlckNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge29iamVjdH0gW3Byb3BzXVxuICogQHBhcmFtIHtvYmplY3R9IFtkZXNjcmlwdG9yc11cbiAqXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgaW5oZXJpdHMgPSAoY29uc3RydWN0b3IsIHN1cGVyQ29uc3RydWN0b3IsIHByb3BzLCBkZXNjcmlwdG9ycykgPT4ge1xuICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ29uc3RydWN0b3IucHJvdG90eXBlLCBkZXNjcmlwdG9ycyk7XG4gIGNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29uc3RydWN0b3IsICdzdXBlcicsIHtcbiAgICB2YWx1ZTogc3VwZXJDb25zdHJ1Y3Rvci5wcm90b3R5cGVcbiAgfSk7XG4gIHByb3BzICYmIE9iamVjdC5hc3NpZ24oY29uc3RydWN0b3IucHJvdG90eXBlLCBwcm9wcyk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBvYmplY3Qgd2l0aCBkZWVwIHByb3RvdHlwZSBjaGFpbiB0byBhIGZsYXQgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlT2JqIHNvdXJjZSBvYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBbZGVzdE9ial1cbiAqIEBwYXJhbSB7RnVuY3Rpb258Qm9vbGVhbn0gW2ZpbHRlcl1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcm9wRmlsdGVyXVxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbmNvbnN0IHRvRmxhdE9iamVjdCA9IChzb3VyY2VPYmosIGRlc3RPYmosIGZpbHRlciwgcHJvcEZpbHRlcikgPT4ge1xuICBsZXQgcHJvcHM7XG4gIGxldCBpO1xuICBsZXQgcHJvcDtcbiAgY29uc3QgbWVyZ2VkID0ge307XG5cbiAgZGVzdE9iaiA9IGRlc3RPYmogfHwge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuICBpZiAoc291cmNlT2JqID09IG51bGwpIHJldHVybiBkZXN0T2JqO1xuXG4gIGRvIHtcbiAgICBwcm9wcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHNvdXJjZU9iaik7XG4gICAgaSA9IHByb3BzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tID4gMCkge1xuICAgICAgcHJvcCA9IHByb3BzW2ldO1xuICAgICAgaWYgKCghcHJvcEZpbHRlciB8fCBwcm9wRmlsdGVyKHByb3AsIHNvdXJjZU9iaiwgZGVzdE9iaikpICYmICFtZXJnZWRbcHJvcF0pIHtcbiAgICAgICAgZGVzdE9ialtwcm9wXSA9IHNvdXJjZU9ialtwcm9wXTtcbiAgICAgICAgbWVyZ2VkW3Byb3BdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgc291cmNlT2JqID0gZmlsdGVyICE9PSBmYWxzZSAmJiBnZXRQcm90b3R5cGVPZihzb3VyY2VPYmopO1xuICB9IHdoaWxlIChzb3VyY2VPYmogJiYgKCFmaWx0ZXIgfHwgZmlsdGVyKHNvdXJjZU9iaiwgZGVzdE9iaikpICYmIHNvdXJjZU9iaiAhPT0gT2JqZWN0LnByb3RvdHlwZSk7XG5cbiAgcmV0dXJuIGRlc3RPYmo7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgc3RyaW5nIGVuZHMgd2l0aCB0aGUgY2hhcmFjdGVycyBvZiBhIHNwZWNpZmllZCBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VhcmNoU3RyaW5nXG4gKiBAcGFyYW0ge051bWJlcn0gW3Bvc2l0aW9uPSAwXVxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBlbmRzV2l0aCA9IChzdHIsIHNlYXJjaFN0cmluZywgcG9zaXRpb24pID0+IHtcbiAgc3RyID0gU3RyaW5nKHN0cik7XG4gIGlmIChwb3NpdGlvbiA9PT0gdW5kZWZpbmVkIHx8IHBvc2l0aW9uID4gc3RyLmxlbmd0aCkge1xuICAgIHBvc2l0aW9uID0gc3RyLmxlbmd0aDtcbiAgfVxuICBwb3NpdGlvbiAtPSBzZWFyY2hTdHJpbmcubGVuZ3RoO1xuICBjb25zdCBsYXN0SW5kZXggPSBzdHIuaW5kZXhPZihzZWFyY2hTdHJpbmcsIHBvc2l0aW9uKTtcbiAgcmV0dXJuIGxhc3RJbmRleCAhPT0gLTEgJiYgbGFzdEluZGV4ID09PSBwb3NpdGlvbjtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgbmV3IGFycmF5IGZyb20gYXJyYXkgbGlrZSBvYmplY3Qgb3IgbnVsbCBpZiBmYWlsZWRcbiAqXG4gKiBAcGFyYW0geyp9IFt0aGluZ11cbiAqXG4gKiBAcmV0dXJucyB7P0FycmF5fVxuICovXG5jb25zdCB0b0FycmF5ID0gKHRoaW5nKSA9PiB7XG4gIGlmICghdGhpbmcpIHJldHVybiBudWxsO1xuICBpZiAoaXNBcnJheSh0aGluZykpIHJldHVybiB0aGluZztcbiAgbGV0IGkgPSB0aGluZy5sZW5ndGg7XG4gIGlmICghaXNOdW1iZXIoaSkpIHJldHVybiBudWxsO1xuICBjb25zdCBhcnIgPSBuZXcgQXJyYXkoaSk7XG4gIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgYXJyW2ldID0gdGhpbmdbaV07XG4gIH1cbiAgcmV0dXJuIGFycjtcbn1cblxuLyoqXG4gKiBDaGVja2luZyBpZiB0aGUgVWludDhBcnJheSBleGlzdHMgYW5kIGlmIGl0IGRvZXMsIGl0IHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiB0aGVcbiAqIHRoaW5nIHBhc3NlZCBpbiBpcyBhbiBpbnN0YW5jZSBvZiBVaW50OEFycmF5XG4gKlxuICogQHBhcmFtIHtUeXBlZEFycmF5fVxuICpcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbmNvbnN0IGlzVHlwZWRBcnJheSA9IChUeXBlZEFycmF5ID0+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgcmV0dXJuIHRoaW5nID0+IHtcbiAgICByZXR1cm4gVHlwZWRBcnJheSAmJiB0aGluZyBpbnN0YW5jZW9mIFR5cGVkQXJyYXk7XG4gIH07XG59KSh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2V0UHJvdG90eXBlT2YoVWludDhBcnJheSkpO1xuXG4vKipcbiAqIEZvciBlYWNoIGVudHJ5IGluIHRoZSBvYmplY3QsIGNhbGwgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGtleSBhbmQgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtPYmplY3Q8YW55LCBhbnk+fSBvYmogLSBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggZW50cnkuXG4gKlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGZvckVhY2hFbnRyeSA9IChvYmosIGZuKSA9PiB7XG4gIGNvbnN0IGdlbmVyYXRvciA9IG9iaiAmJiBvYmpbU3ltYm9sLml0ZXJhdG9yXTtcblxuICBjb25zdCBpdGVyYXRvciA9IGdlbmVyYXRvci5jYWxsKG9iaik7XG5cbiAgbGV0IHJlc3VsdDtcblxuICB3aGlsZSAoKHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKSkgJiYgIXJlc3VsdC5kb25lKSB7XG4gICAgY29uc3QgcGFpciA9IHJlc3VsdC52YWx1ZTtcbiAgICBmbi5jYWxsKG9iaiwgcGFpclswXSwgcGFpclsxXSk7XG4gIH1cbn1cblxuLyoqXG4gKiBJdCB0YWtlcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgYSBzdHJpbmcsIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIGFsbCB0aGUgbWF0Y2hlc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWdFeHAgLSBUaGUgcmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIGFnYWluc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIC0gVGhlIHN0cmluZyB0byBzZWFyY2guXG4gKlxuICogQHJldHVybnMge0FycmF5PGJvb2xlYW4+fVxuICovXG5jb25zdCBtYXRjaEFsbCA9IChyZWdFeHAsIHN0cikgPT4ge1xuICBsZXQgbWF0Y2hlcztcbiAgY29uc3QgYXJyID0gW107XG5cbiAgd2hpbGUgKChtYXRjaGVzID0gcmVnRXhwLmV4ZWMoc3RyKSkgIT09IG51bGwpIHtcbiAgICBhcnIucHVzaChtYXRjaGVzKTtcbiAgfVxuXG4gIHJldHVybiBhcnI7XG59XG5cbi8qIENoZWNraW5nIGlmIHRoZSBraW5kT2ZUZXN0IGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIHBhc3NlZCBhbiBIVE1MRm9ybUVsZW1lbnQuICovXG5jb25zdCBpc0hUTUxGb3JtID0ga2luZE9mVGVzdCgnSFRNTEZvcm1FbGVtZW50Jyk7XG5cbmNvbnN0IHRvQ2FtZWxDYXNlID0gc3RyID0+IHtcbiAgcmV0dXJuIHN0ci50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1stX1xcc10oW2EtelxcZF0pKFxcdyopL2csXG4gICAgZnVuY3Rpb24gcmVwbGFjZXIobSwgcDEsIHAyKSB7XG4gICAgICByZXR1cm4gcDEudG9VcHBlckNhc2UoKSArIHAyO1xuICAgIH1cbiAgKTtcbn07XG5cbi8qIENyZWF0aW5nIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGNoZWNrIGlmIGFuIG9iamVjdCBoYXMgYSBwcm9wZXJ0eS4gKi9cbmNvbnN0IGhhc093blByb3BlcnR5ID0gKCh7aGFzT3duUHJvcGVydHl9KSA9PiAob2JqLCBwcm9wKSA9PiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpKE9iamVjdC5wcm90b3R5cGUpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgUmVnRXhwIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBSZWdFeHAgb2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNSZWdFeHAgPSBraW5kT2ZUZXN0KCdSZWdFeHAnKTtcblxuY29uc3QgcmVkdWNlRGVzY3JpcHRvcnMgPSAob2JqLCByZWR1Y2VyKSA9PiB7XG4gIGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqKTtcbiAgY29uc3QgcmVkdWNlZERlc2NyaXB0b3JzID0ge307XG5cbiAgZm9yRWFjaChkZXNjcmlwdG9ycywgKGRlc2NyaXB0b3IsIG5hbWUpID0+IHtcbiAgICBpZiAocmVkdWNlcihkZXNjcmlwdG9yLCBuYW1lLCBvYmopICE9PSBmYWxzZSkge1xuICAgICAgcmVkdWNlZERlc2NyaXB0b3JzW25hbWVdID0gZGVzY3JpcHRvcjtcbiAgICB9XG4gIH0pO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG9iaiwgcmVkdWNlZERlc2NyaXB0b3JzKTtcbn1cblxuLyoqXG4gKiBNYWtlcyBhbGwgbWV0aG9kcyByZWFkLW9ubHlcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqL1xuXG5jb25zdCBmcmVlemVNZXRob2RzID0gKG9iaikgPT4ge1xuICByZWR1Y2VEZXNjcmlwdG9ycyhvYmosIChkZXNjcmlwdG9yLCBuYW1lKSA9PiB7XG4gICAgLy8gc2tpcCByZXN0cmljdGVkIHByb3BzIGluIHN0cmljdCBtb2RlXG4gICAgaWYgKGlzRnVuY3Rpb24ob2JqKSAmJiBbJ2FyZ3VtZW50cycsICdjYWxsZXInLCAnY2FsbGVlJ10uaW5kZXhPZihuYW1lKSAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IG9ialtuYW1lXTtcblxuICAgIGlmICghaXNGdW5jdGlvbih2YWx1ZSkpIHJldHVybjtcblxuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGZhbHNlO1xuXG4gICAgaWYgKCd3cml0YWJsZScgaW4gZGVzY3JpcHRvcikge1xuICAgICAgZGVzY3JpcHRvci53cml0YWJsZSA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZGVzY3JpcHRvci5zZXQpIHtcbiAgICAgIGRlc2NyaXB0b3Iuc2V0ID0gKCkgPT4ge1xuICAgICAgICB0aHJvdyBFcnJvcignQ2FuIG5vdCByZXdyaXRlIHJlYWQtb25seSBtZXRob2QgXFwnJyArIG5hbWUgKyAnXFwnJyk7XG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG59XG5cbmNvbnN0IHRvT2JqZWN0U2V0ID0gKGFycmF5T3JTdHJpbmcsIGRlbGltaXRlcikgPT4ge1xuICBjb25zdCBvYmogPSB7fTtcblxuICBjb25zdCBkZWZpbmUgPSAoYXJyKSA9PiB7XG4gICAgYXJyLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgb2JqW3ZhbHVlXSA9IHRydWU7XG4gICAgfSk7XG4gIH1cblxuICBpc0FycmF5KGFycmF5T3JTdHJpbmcpID8gZGVmaW5lKGFycmF5T3JTdHJpbmcpIDogZGVmaW5lKFN0cmluZyhhcnJheU9yU3RyaW5nKS5zcGxpdChkZWxpbWl0ZXIpKTtcblxuICByZXR1cm4gb2JqO1xufVxuXG5jb25zdCBub29wID0gKCkgPT4ge31cblxuY29uc3QgdG9GaW5pdGVOdW1iZXIgPSAodmFsdWUsIGRlZmF1bHRWYWx1ZSkgPT4ge1xuICB2YWx1ZSA9ICt2YWx1ZTtcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgPyB2YWx1ZSA6IGRlZmF1bHRWYWx1ZTtcbn1cblxuY29uc3QgQUxQSEEgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonXG5cbmNvbnN0IERJR0lUID0gJzAxMjM0NTY3ODknO1xuXG5jb25zdCBBTFBIQUJFVCA9IHtcbiAgRElHSVQsXG4gIEFMUEhBLFxuICBBTFBIQV9ESUdJVDogQUxQSEEgKyBBTFBIQS50b1VwcGVyQ2FzZSgpICsgRElHSVRcbn1cblxuY29uc3QgZ2VuZXJhdGVTdHJpbmcgPSAoc2l6ZSA9IDE2LCBhbHBoYWJldCA9IEFMUEhBQkVULkFMUEhBX0RJR0lUKSA9PiB7XG4gIGxldCBzdHIgPSAnJztcbiAgY29uc3Qge2xlbmd0aH0gPSBhbHBoYWJldDtcbiAgd2hpbGUgKHNpemUtLSkge1xuICAgIHN0ciArPSBhbHBoYWJldFtNYXRoLnJhbmRvbSgpICogbGVuZ3RofDBdXG4gIH1cblxuICByZXR1cm4gc3RyO1xufVxuXG4vKipcbiAqIElmIHRoZSB0aGluZyBpcyBhIEZvcm1EYXRhIG9iamVjdCwgcmV0dXJuIHRydWUsIG90aGVyd2lzZSByZXR1cm4gZmFsc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSB0aGluZyAtIFRoZSB0aGluZyB0byBjaGVjay5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNTcGVjQ29tcGxpYW50Rm9ybSh0aGluZykge1xuICByZXR1cm4gISEodGhpbmcgJiYgaXNGdW5jdGlvbih0aGluZy5hcHBlbmQpICYmIHRoaW5nW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdGb3JtRGF0YScgJiYgdGhpbmdbU3ltYm9sLml0ZXJhdG9yXSk7XG59XG5cbmNvbnN0IHRvSlNPTk9iamVjdCA9IChvYmopID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgQXJyYXkoMTApO1xuXG4gIGNvbnN0IHZpc2l0ID0gKHNvdXJjZSwgaSkgPT4ge1xuXG4gICAgaWYgKGlzT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgIGlmIChzdGFjay5pbmRleE9mKHNvdXJjZSkgPj0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmKCEoJ3RvSlNPTicgaW4gc291cmNlKSkge1xuICAgICAgICBzdGFja1tpXSA9IHNvdXJjZTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gaXNBcnJheShzb3VyY2UpID8gW10gOiB7fTtcblxuICAgICAgICBmb3JFYWNoKHNvdXJjZSwgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICBjb25zdCByZWR1Y2VkVmFsdWUgPSB2aXNpdCh2YWx1ZSwgaSArIDEpO1xuICAgICAgICAgICFpc1VuZGVmaW5lZChyZWR1Y2VkVmFsdWUpICYmICh0YXJnZXRba2V5XSA9IHJlZHVjZWRWYWx1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHN0YWNrW2ldID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIHJldHVybiB2aXNpdChvYmosIDApO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGlzQXJyYXksXG4gIGlzQXJyYXlCdWZmZXIsXG4gIGlzQnVmZmVyLFxuICBpc0Zvcm1EYXRhLFxuICBpc0FycmF5QnVmZmVyVmlldyxcbiAgaXNTdHJpbmcsXG4gIGlzTnVtYmVyLFxuICBpc0Jvb2xlYW4sXG4gIGlzT2JqZWN0LFxuICBpc1BsYWluT2JqZWN0LFxuICBpc1VuZGVmaW5lZCxcbiAgaXNEYXRlLFxuICBpc0ZpbGUsXG4gIGlzQmxvYixcbiAgaXNSZWdFeHAsXG4gIGlzRnVuY3Rpb24sXG4gIGlzU3RyZWFtLFxuICBpc1VSTFNlYXJjaFBhcmFtcyxcbiAgaXNUeXBlZEFycmF5LFxuICBpc0ZpbGVMaXN0LFxuICBmb3JFYWNoLFxuICBtZXJnZSxcbiAgZXh0ZW5kLFxuICB0cmltLFxuICBzdHJpcEJPTSxcbiAgaW5oZXJpdHMsXG4gIHRvRmxhdE9iamVjdCxcbiAga2luZE9mLFxuICBraW5kT2ZUZXN0LFxuICBlbmRzV2l0aCxcbiAgdG9BcnJheSxcbiAgZm9yRWFjaEVudHJ5LFxuICBtYXRjaEFsbCxcbiAgaXNIVE1MRm9ybSxcbiAgaGFzT3duUHJvcGVydHksXG4gIGhhc093blByb3A6IGhhc093blByb3BlcnR5LCAvLyBhbiBhbGlhcyB0byBhdm9pZCBFU0xpbnQgbm8tcHJvdG90eXBlLWJ1aWx0aW5zIGRldGVjdGlvblxuICByZWR1Y2VEZXNjcmlwdG9ycyxcbiAgZnJlZXplTWV0aG9kcyxcbiAgdG9PYmplY3RTZXQsXG4gIHRvQ2FtZWxDYXNlLFxuICBub29wLFxuICB0b0Zpbml0ZU51bWJlcixcbiAgZmluZEtleSxcbiAgZ2xvYmFsOiBfZ2xvYmFsLFxuICBpc0NvbnRleHREZWZpbmVkLFxuICBBTFBIQUJFVCxcbiAgZ2VuZXJhdGVTdHJpbmcsXG4gIGlzU3BlY0NvbXBsaWFudEZvcm0sXG4gIHRvSlNPTk9iamVjdFxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcblxuLyoqXG4gKiBDcmVhdGUgYW4gRXJyb3Igd2l0aCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UsIGNvbmZpZywgZXJyb3IgY29kZSwgcmVxdWVzdCBhbmQgcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvZGVdIFRoZSBlcnJvciBjb2RlIChmb3IgZXhhbXBsZSwgJ0VDT05OQUJPUlRFRCcpLlxuICogQHBhcmFtIHtPYmplY3R9IFtjb25maWddIFRoZSBjb25maWcuXG4gKiBAcGFyYW0ge09iamVjdH0gW3JlcXVlc3RdIFRoZSByZXF1ZXN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtyZXNwb25zZV0gVGhlIHJlc3BvbnNlLlxuICpcbiAqIEByZXR1cm5zIHtFcnJvcn0gVGhlIGNyZWF0ZWQgZXJyb3IuXG4gKi9cbmZ1bmN0aW9uIEF4aW9zRXJyb3IobWVzc2FnZSwgY29kZSwgY29uZmlnLCByZXF1ZXN0LCByZXNwb25zZSkge1xuICBFcnJvci5jYWxsKHRoaXMpO1xuXG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuc3RhY2sgPSAobmV3IEVycm9yKCkpLnN0YWNrO1xuICB9XG5cbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgdGhpcy5uYW1lID0gJ0F4aW9zRXJyb3InO1xuICBjb2RlICYmICh0aGlzLmNvZGUgPSBjb2RlKTtcbiAgY29uZmlnICYmICh0aGlzLmNvbmZpZyA9IGNvbmZpZyk7XG4gIHJlcXVlc3QgJiYgKHRoaXMucmVxdWVzdCA9IHJlcXVlc3QpO1xuICByZXNwb25zZSAmJiAodGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlKTtcbn1cblxudXRpbHMuaW5oZXJpdHMoQXhpb3NFcnJvciwgRXJyb3IsIHtcbiAgdG9KU09OOiBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIFN0YW5kYXJkXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAvLyBNaWNyb3NvZnRcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgbnVtYmVyOiB0aGlzLm51bWJlcixcbiAgICAgIC8vIE1vemlsbGFcbiAgICAgIGZpbGVOYW1lOiB0aGlzLmZpbGVOYW1lLFxuICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuICAgICAgY29sdW1uTnVtYmVyOiB0aGlzLmNvbHVtbk51bWJlcixcbiAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLFxuICAgICAgLy8gQXhpb3NcbiAgICAgIGNvbmZpZzogdXRpbHMudG9KU09OT2JqZWN0KHRoaXMuY29uZmlnKSxcbiAgICAgIGNvZGU6IHRoaXMuY29kZSxcbiAgICAgIHN0YXR1czogdGhpcy5yZXNwb25zZSAmJiB0aGlzLnJlc3BvbnNlLnN0YXR1cyA/IHRoaXMucmVzcG9uc2Uuc3RhdHVzIDogbnVsbFxuICAgIH07XG4gIH1cbn0pO1xuXG5jb25zdCBwcm90b3R5cGUgPSBBeGlvc0Vycm9yLnByb3RvdHlwZTtcbmNvbnN0IGRlc2NyaXB0b3JzID0ge307XG5cbltcbiAgJ0VSUl9CQURfT1BUSU9OX1ZBTFVFJyxcbiAgJ0VSUl9CQURfT1BUSU9OJyxcbiAgJ0VDT05OQUJPUlRFRCcsXG4gICdFVElNRURPVVQnLFxuICAnRVJSX05FVFdPUksnLFxuICAnRVJSX0ZSX1RPT19NQU5ZX1JFRElSRUNUUycsXG4gICdFUlJfREVQUkVDQVRFRCcsXG4gICdFUlJfQkFEX1JFU1BPTlNFJyxcbiAgJ0VSUl9CQURfUkVRVUVTVCcsXG4gICdFUlJfQ0FOQ0VMRUQnLFxuICAnRVJSX05PVF9TVVBQT1JUJyxcbiAgJ0VSUl9JTlZBTElEX1VSTCdcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5dLmZvckVhY2goY29kZSA9PiB7XG4gIGRlc2NyaXB0b3JzW2NvZGVdID0ge3ZhbHVlOiBjb2RlfTtcbn0pO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhBeGlvc0Vycm9yLCBkZXNjcmlwdG9ycyk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG90eXBlLCAnaXNBeGlvc0Vycm9yJywge3ZhbHVlOiB0cnVlfSk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5BeGlvc0Vycm9yLmZyb20gPSAoZXJyb3IsIGNvZGUsIGNvbmZpZywgcmVxdWVzdCwgcmVzcG9uc2UsIGN1c3RvbVByb3BzKSA9PiB7XG4gIGNvbnN0IGF4aW9zRXJyb3IgPSBPYmplY3QuY3JlYXRlKHByb3RvdHlwZSk7XG5cbiAgdXRpbHMudG9GbGF0T2JqZWN0KGVycm9yLCBheGlvc0Vycm9yLCBmdW5jdGlvbiBmaWx0ZXIob2JqKSB7XG4gICAgcmV0dXJuIG9iaiAhPT0gRXJyb3IucHJvdG90eXBlO1xuICB9LCBwcm9wID0+IHtcbiAgICByZXR1cm4gcHJvcCAhPT0gJ2lzQXhpb3NFcnJvcic7XG4gIH0pO1xuXG4gIEF4aW9zRXJyb3IuY2FsbChheGlvc0Vycm9yLCBlcnJvci5tZXNzYWdlLCBjb2RlLCBjb25maWcsIHJlcXVlc3QsIHJlc3BvbnNlKTtcblxuICBheGlvc0Vycm9yLmNhdXNlID0gZXJyb3I7XG5cbiAgYXhpb3NFcnJvci5uYW1lID0gZXJyb3IubmFtZTtcblxuICBjdXN0b21Qcm9wcyAmJiBPYmplY3QuYXNzaWduKGF4aW9zRXJyb3IsIGN1c3RvbVByb3BzKTtcblxuICByZXR1cm4gYXhpb3NFcnJvcjtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEF4aW9zRXJyb3I7XG4iLCIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc3RyaWN0XG5leHBvcnQgZGVmYXVsdCBudWxsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSAnLi4vY29yZS9BeGlvc0Vycm9yLmpzJztcbi8vIHRlbXBvcmFyeSBob3RmaXggdG8gYXZvaWQgY2lyY3VsYXIgcmVmZXJlbmNlcyB1bnRpbCBBeGlvc1VSTFNlYXJjaFBhcmFtcyBpcyByZWZhY3RvcmVkXG5pbXBvcnQgUGxhdGZvcm1Gb3JtRGF0YSBmcm9tICcuLi9wbGF0Zm9ybS9ub2RlL2NsYXNzZXMvRm9ybURhdGEuanMnO1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGdpdmVuIHRoaW5nIGlzIGEgYXJyYXkgb3IganMgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0aGluZyAtIFRoZSBvYmplY3Qgb3IgYXJyYXkgdG8gYmUgdmlzaXRlZC5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNWaXNpdGFibGUodGhpbmcpIHtcbiAgcmV0dXJuIHV0aWxzLmlzUGxhaW5PYmplY3QodGhpbmcpIHx8IHV0aWxzLmlzQXJyYXkodGhpbmcpO1xufVxuXG4vKipcbiAqIEl0IHJlbW92ZXMgdGhlIGJyYWNrZXRzIGZyb20gdGhlIGVuZCBvZiBhIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBwYXJhbWV0ZXIuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gdGhlIGtleSB3aXRob3V0IHRoZSBicmFja2V0cy5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQnJhY2tldHMoa2V5KSB7XG4gIHJldHVybiB1dGlscy5lbmRzV2l0aChrZXksICdbXScpID8ga2V5LnNsaWNlKDAsIC0yKSA6IGtleTtcbn1cblxuLyoqXG4gKiBJdCB0YWtlcyBhIHBhdGgsIGEga2V5LCBhbmQgYSBib29sZWFuLCBhbmQgcmV0dXJucyBhIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVGhlIHBhdGggdG8gdGhlIGN1cnJlbnQga2V5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIGN1cnJlbnQgb2JqZWN0IGJlaW5nIGl0ZXJhdGVkIG92ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gZG90cyAtIElmIHRydWUsIHRoZSBrZXkgd2lsbCBiZSByZW5kZXJlZCB3aXRoIGRvdHMgaW5zdGVhZCBvZiBicmFja2V0cy5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgcGF0aCB0byB0aGUgY3VycmVudCBrZXkuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlcktleShwYXRoLCBrZXksIGRvdHMpIHtcbiAgaWYgKCFwYXRoKSByZXR1cm4ga2V5O1xuICByZXR1cm4gcGF0aC5jb25jYXQoa2V5KS5tYXAoZnVuY3Rpb24gZWFjaCh0b2tlbiwgaSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgIHRva2VuID0gcmVtb3ZlQnJhY2tldHModG9rZW4pO1xuICAgIHJldHVybiAhZG90cyAmJiBpID8gJ1snICsgdG9rZW4gKyAnXScgOiB0b2tlbjtcbiAgfSkuam9pbihkb3RzID8gJy4nIDogJycpO1xufVxuXG4vKipcbiAqIElmIHRoZSBhcnJheSBpcyBhbiBhcnJheSBhbmQgbm9uZSBvZiBpdHMgZWxlbWVudHMgYXJlIHZpc2l0YWJsZSwgdGhlbiBpdCdzIGEgZmxhdCBhcnJheS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PGFueT59IGFyciAtIFRoZSBhcnJheSB0byBjaGVja1xuICpcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0ZsYXRBcnJheShhcnIpIHtcbiAgcmV0dXJuIHV0aWxzLmlzQXJyYXkoYXJyKSAmJiAhYXJyLnNvbWUoaXNWaXNpdGFibGUpO1xufVxuXG5jb25zdCBwcmVkaWNhdGVzID0gdXRpbHMudG9GbGF0T2JqZWN0KHV0aWxzLCB7fSwgbnVsbCwgZnVuY3Rpb24gZmlsdGVyKHByb3ApIHtcbiAgcmV0dXJuIC9eaXNbQS1aXS8udGVzdChwcm9wKTtcbn0pO1xuXG4vKipcbiAqIENvbnZlcnQgYSBkYXRhIG9iamVjdCB0byBGb3JtRGF0YVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7P09iamVjdH0gW2Zvcm1EYXRhXVxuICogQHBhcmFtIHs/T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLnZpc2l0b3JdXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm1ldGFUb2tlbnMgPSB0cnVlXVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5kb3RzID0gZmFsc2VdXG4gKiBAcGFyYW0gez9Cb29sZWFufSBbb3B0aW9ucy5pbmRleGVzID0gZmFsc2VdXG4gKlxuICogQHJldHVybnMge09iamVjdH1cbiAqKi9cblxuLyoqXG4gKiBJdCBjb252ZXJ0cyBhbiBvYmplY3QgaW50byBhIEZvcm1EYXRhIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0PGFueSwgYW55Pn0gb2JqIC0gVGhlIG9iamVjdCB0byBjb252ZXJ0IHRvIGZvcm0gZGF0YS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtRGF0YSAtIFRoZSBGb3JtRGF0YSBvYmplY3QgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBhbnk+fSBvcHRpb25zXG4gKlxuICogQHJldHVybnNcbiAqL1xuZnVuY3Rpb24gdG9Gb3JtRGF0YShvYmosIGZvcm1EYXRhLCBvcHRpb25zKSB7XG4gIGlmICghdXRpbHMuaXNPYmplY3Qob2JqKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RhcmdldCBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gIGZvcm1EYXRhID0gZm9ybURhdGEgfHwgbmV3IChQbGF0Zm9ybUZvcm1EYXRhIHx8IEZvcm1EYXRhKSgpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBvcHRpb25zID0gdXRpbHMudG9GbGF0T2JqZWN0KG9wdGlvbnMsIHtcbiAgICBtZXRhVG9rZW5zOiB0cnVlLFxuICAgIGRvdHM6IGZhbHNlLFxuICAgIGluZGV4ZXM6IGZhbHNlXG4gIH0sIGZhbHNlLCBmdW5jdGlvbiBkZWZpbmVkKG9wdGlvbiwgc291cmNlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVxLW51bGwsZXFlcWVxXG4gICAgcmV0dXJuICF1dGlscy5pc1VuZGVmaW5lZChzb3VyY2Vbb3B0aW9uXSk7XG4gIH0pO1xuXG4gIGNvbnN0IG1ldGFUb2tlbnMgPSBvcHRpb25zLm1ldGFUb2tlbnM7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICBjb25zdCB2aXNpdG9yID0gb3B0aW9ucy52aXNpdG9yIHx8IGRlZmF1bHRWaXNpdG9yO1xuICBjb25zdCBkb3RzID0gb3B0aW9ucy5kb3RzO1xuICBjb25zdCBpbmRleGVzID0gb3B0aW9ucy5pbmRleGVzO1xuICBjb25zdCBfQmxvYiA9IG9wdGlvbnMuQmxvYiB8fCB0eXBlb2YgQmxvYiAhPT0gJ3VuZGVmaW5lZCcgJiYgQmxvYjtcbiAgY29uc3QgdXNlQmxvYiA9IF9CbG9iICYmIHV0aWxzLmlzU3BlY0NvbXBsaWFudEZvcm0oZm9ybURhdGEpO1xuXG4gIGlmICghdXRpbHMuaXNGdW5jdGlvbih2aXNpdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3Zpc2l0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIH1cblxuICBmdW5jdGlvbiBjb252ZXJ0VmFsdWUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiAnJztcblxuICAgIGlmICh1dGlscy5pc0RhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUudG9JU09TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBpZiAoIXVzZUJsb2IgJiYgdXRpbHMuaXNCbG9iKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ0Jsb2IgaXMgbm90IHN1cHBvcnRlZC4gVXNlIGEgQnVmZmVyIGluc3RlYWQuJyk7XG4gICAgfVxuXG4gICAgaWYgKHV0aWxzLmlzQXJyYXlCdWZmZXIodmFsdWUpIHx8IHV0aWxzLmlzVHlwZWRBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB1c2VCbG9iICYmIHR5cGVvZiBCbG9iID09PSAnZnVuY3Rpb24nID8gbmV3IEJsb2IoW3ZhbHVlXSkgOiBCdWZmZXIuZnJvbSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgdmlzaXRvci5cbiAgICpcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IGtleVxuICAgKiBAcGFyYW0ge0FycmF5PFN0cmluZ3xOdW1iZXI+fSBwYXRoXG4gICAqIEB0aGlzIHtGb3JtRGF0YX1cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHJldHVybiB0cnVlIHRvIHZpc2l0IHRoZSBlYWNoIHByb3Agb2YgdGhlIHZhbHVlIHJlY3Vyc2l2ZWx5XG4gICAqL1xuICBmdW5jdGlvbiBkZWZhdWx0VmlzaXRvcih2YWx1ZSwga2V5LCBwYXRoKSB7XG4gICAgbGV0IGFyciA9IHZhbHVlO1xuXG4gICAgaWYgKHZhbHVlICYmICFwYXRoICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICh1dGlscy5lbmRzV2l0aChrZXksICd7fScpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBrZXkgPSBtZXRhVG9rZW5zID8ga2V5IDoga2V5LnNsaWNlKDAsIC0yKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKHV0aWxzLmlzQXJyYXkodmFsdWUpICYmIGlzRmxhdEFycmF5KHZhbHVlKSkgfHxcbiAgICAgICAgKCh1dGlscy5pc0ZpbGVMaXN0KHZhbHVlKSB8fCB1dGlscy5lbmRzV2l0aChrZXksICdbXScpKSAmJiAoYXJyID0gdXRpbHMudG9BcnJheSh2YWx1ZSkpXG4gICAgICAgICkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGtleSA9IHJlbW92ZUJyYWNrZXRzKGtleSk7XG5cbiAgICAgICAgYXJyLmZvckVhY2goZnVuY3Rpb24gZWFjaChlbCwgaW5kZXgpIHtcbiAgICAgICAgICAhKHV0aWxzLmlzVW5kZWZpbmVkKGVsKSB8fCBlbCA9PT0gbnVsbCkgJiYgZm9ybURhdGEuYXBwZW5kKFxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5XG4gICAgICAgICAgICBpbmRleGVzID09PSB0cnVlID8gcmVuZGVyS2V5KFtrZXldLCBpbmRleCwgZG90cykgOiAoaW5kZXhlcyA9PT0gbnVsbCA/IGtleSA6IGtleSArICdbXScpLFxuICAgICAgICAgICAgY29udmVydFZhbHVlKGVsKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzVmlzaXRhYmxlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZm9ybURhdGEuYXBwZW5kKHJlbmRlcktleShwYXRoLCBrZXksIGRvdHMpLCBjb252ZXJ0VmFsdWUodmFsdWUpKTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHN0YWNrID0gW107XG5cbiAgY29uc3QgZXhwb3NlZEhlbHBlcnMgPSBPYmplY3QuYXNzaWduKHByZWRpY2F0ZXMsIHtcbiAgICBkZWZhdWx0VmlzaXRvcixcbiAgICBjb252ZXJ0VmFsdWUsXG4gICAgaXNWaXNpdGFibGVcbiAgfSk7XG5cbiAgZnVuY3Rpb24gYnVpbGQodmFsdWUsIHBhdGgpIHtcbiAgICBpZiAodXRpbHMuaXNVbmRlZmluZWQodmFsdWUpKSByZXR1cm47XG5cbiAgICBpZiAoc3RhY2suaW5kZXhPZih2YWx1ZSkgIT09IC0xKSB7XG4gICAgICB0aHJvdyBFcnJvcignQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGluICcgKyBwYXRoLmpvaW4oJy4nKSk7XG4gICAgfVxuXG4gICAgc3RhY2sucHVzaCh2YWx1ZSk7XG5cbiAgICB1dGlscy5mb3JFYWNoKHZhbHVlLCBmdW5jdGlvbiBlYWNoKGVsLCBrZXkpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9ICEodXRpbHMuaXNVbmRlZmluZWQoZWwpIHx8IGVsID09PSBudWxsKSAmJiB2aXNpdG9yLmNhbGwoXG4gICAgICAgIGZvcm1EYXRhLCBlbCwgdXRpbHMuaXNTdHJpbmcoa2V5KSA/IGtleS50cmltKCkgOiBrZXksIHBhdGgsIGV4cG9zZWRIZWxwZXJzXG4gICAgICApO1xuXG4gICAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgIGJ1aWxkKGVsLCBwYXRoID8gcGF0aC5jb25jYXQoa2V5KSA6IFtrZXldKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHN0YWNrLnBvcCgpO1xuICB9XG5cbiAgaWYgKCF1dGlscy5pc09iamVjdChvYmopKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZGF0YSBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICB9XG5cbiAgYnVpbGQob2JqKTtcblxuICByZXR1cm4gZm9ybURhdGE7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRvRm9ybURhdGE7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB0b0Zvcm1EYXRhIGZyb20gJy4vdG9Gb3JtRGF0YS5qcyc7XG5cbi8qKlxuICogSXQgZW5jb2RlcyBhIHN0cmluZyBieSByZXBsYWNpbmcgYWxsIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IGluIHRoZSB1bnJlc2VydmVkIHNldCB3aXRoXG4gKiB0aGVpciBwZXJjZW50LWVuY29kZWQgZXF1aXZhbGVudHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIC0gVGhlIHN0cmluZyB0byBlbmNvZGUuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGVuY29kZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBlbmNvZGUoc3RyKSB7XG4gIGNvbnN0IGNoYXJNYXAgPSB7XG4gICAgJyEnOiAnJTIxJyxcbiAgICBcIidcIjogJyUyNycsXG4gICAgJygnOiAnJTI4JyxcbiAgICAnKSc6ICclMjknLFxuICAgICd+JzogJyU3RScsXG4gICAgJyUyMCc6ICcrJyxcbiAgICAnJTAwJzogJ1xceDAwJ1xuICB9O1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHN0cikucmVwbGFjZSgvWyEnKCl+XXwlMjB8JTAwL2csIGZ1bmN0aW9uIHJlcGxhY2VyKG1hdGNoKSB7XG4gICAgcmV0dXJuIGNoYXJNYXBbbWF0Y2hdO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJdCB0YWtlcyBhIHBhcmFtcyBvYmplY3QgYW5kIGNvbnZlcnRzIGl0IHRvIGEgRm9ybURhdGEgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBhbnk+fSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyB0byBiZSBjb252ZXJ0ZWQgdG8gYSBGb3JtRGF0YSBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIGFueT59IG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBvYmplY3QgcGFzc2VkIHRvIHRoZSBBeGlvcyBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gQXhpb3NVUkxTZWFyY2hQYXJhbXMocGFyYW1zLCBvcHRpb25zKSB7XG4gIHRoaXMuX3BhaXJzID0gW107XG5cbiAgcGFyYW1zICYmIHRvRm9ybURhdGEocGFyYW1zLCB0aGlzLCBvcHRpb25zKTtcbn1cblxuY29uc3QgcHJvdG90eXBlID0gQXhpb3NVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlO1xuXG5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gYXBwZW5kKG5hbWUsIHZhbHVlKSB7XG4gIHRoaXMuX3BhaXJzLnB1c2goW25hbWUsIHZhbHVlXSk7XG59O1xuXG5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhlbmNvZGVyKSB7XG4gIGNvbnN0IF9lbmNvZGUgPSBlbmNvZGVyID8gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gZW5jb2Rlci5jYWxsKHRoaXMsIHZhbHVlLCBlbmNvZGUpO1xuICB9IDogZW5jb2RlO1xuXG4gIHJldHVybiB0aGlzLl9wYWlycy5tYXAoZnVuY3Rpb24gZWFjaChwYWlyKSB7XG4gICAgcmV0dXJuIF9lbmNvZGUocGFpclswXSkgKyAnPScgKyBfZW5jb2RlKHBhaXJbMV0pO1xuICB9LCAnJykuam9pbignJicpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQXhpb3NVUkxTZWFyY2hQYXJhbXM7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5pbXBvcnQgQXhpb3NVUkxTZWFyY2hQYXJhbXMgZnJvbSAnLi4vaGVscGVycy9BeGlvc1VSTFNlYXJjaFBhcmFtcy5qcyc7XG5cbi8qKlxuICogSXQgcmVwbGFjZXMgYWxsIGluc3RhbmNlcyBvZiB0aGUgY2hhcmFjdGVycyBgOmAsIGAkYCwgYCxgLCBgK2AsIGBbYCwgYW5kIGBdYCB3aXRoIHRoZWlyXG4gKiBVUkkgZW5jb2RlZCBjb3VudGVycGFydHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsIFRoZSB2YWx1ZSB0byBiZSBlbmNvZGVkLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBlbmNvZGVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBlbmNvZGUodmFsKSB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsKS5cbiAgICByZXBsYWNlKC8lM0EvZ2ksICc6JykuXG4gICAgcmVwbGFjZSgvJTI0L2csICckJykuXG4gICAgcmVwbGFjZSgvJTJDL2dpLCAnLCcpLlxuICAgIHJlcGxhY2UoLyUyMC9nLCAnKycpLlxuICAgIHJlcGxhY2UoLyU1Qi9naSwgJ1snKS5cbiAgICByZXBsYWNlKC8lNUQvZ2ksICddJyk7XG59XG5cbi8qKlxuICogQnVpbGQgYSBVUkwgYnkgYXBwZW5kaW5nIHBhcmFtcyB0byB0aGUgZW5kXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgYmFzZSBvZiB0aGUgdXJsIChlLmcuLCBodHRwOi8vd3d3Lmdvb2dsZS5jb20pXG4gKiBAcGFyYW0ge29iamVjdH0gW3BhcmFtc10gVGhlIHBhcmFtcyB0byBiZSBhcHBlbmRlZFxuICogQHBhcmFtIHs/b2JqZWN0fSBvcHRpb25zXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGZvcm1hdHRlZCB1cmxcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYnVpbGRVUkwodXJsLCBwYXJhbXMsIG9wdGlvbnMpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIGlmICghcGFyYW1zKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICBcbiAgY29uc3QgX2VuY29kZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5lbmNvZGUgfHwgZW5jb2RlO1xuXG4gIGNvbnN0IHNlcmlhbGl6ZUZuID0gb3B0aW9ucyAmJiBvcHRpb25zLnNlcmlhbGl6ZTtcblxuICBsZXQgc2VyaWFsaXplZFBhcmFtcztcblxuICBpZiAoc2VyaWFsaXplRm4pIHtcbiAgICBzZXJpYWxpemVkUGFyYW1zID0gc2VyaWFsaXplRm4ocGFyYW1zLCBvcHRpb25zKTtcbiAgfSBlbHNlIHtcbiAgICBzZXJpYWxpemVkUGFyYW1zID0gdXRpbHMuaXNVUkxTZWFyY2hQYXJhbXMocGFyYW1zKSA/XG4gICAgICBwYXJhbXMudG9TdHJpbmcoKSA6XG4gICAgICBuZXcgQXhpb3NVUkxTZWFyY2hQYXJhbXMocGFyYW1zLCBvcHRpb25zKS50b1N0cmluZyhfZW5jb2RlKTtcbiAgfVxuXG4gIGlmIChzZXJpYWxpemVkUGFyYW1zKSB7XG4gICAgY29uc3QgaGFzaG1hcmtJbmRleCA9IHVybC5pbmRleE9mKFwiI1wiKTtcblxuICAgIGlmIChoYXNobWFya0luZGV4ICE9PSAtMSkge1xuICAgICAgdXJsID0gdXJsLnNsaWNlKDAsIGhhc2htYXJrSW5kZXgpO1xuICAgIH1cbiAgICB1cmwgKz0gKHVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnKSArIHNlcmlhbGl6ZWRQYXJhbXM7XG4gIH1cblxuICByZXR1cm4gdXJsO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5cbmNsYXNzIEludGVyY2VwdG9yTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaGFuZGxlcnMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgaW50ZXJjZXB0b3IgdG8gdGhlIHN0YWNrXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bGZpbGxlZCBUaGUgZnVuY3Rpb24gdG8gaGFuZGxlIGB0aGVuYCBmb3IgYSBgUHJvbWlzZWBcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0ZWQgVGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSBgcmVqZWN0YCBmb3IgYSBgUHJvbWlzZWBcbiAgICpcbiAgICogQHJldHVybiB7TnVtYmVyfSBBbiBJRCB1c2VkIHRvIHJlbW92ZSBpbnRlcmNlcHRvciBsYXRlclxuICAgKi9cbiAgdXNlKGZ1bGZpbGxlZCwgcmVqZWN0ZWQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLmhhbmRsZXJzLnB1c2goe1xuICAgICAgZnVsZmlsbGVkLFxuICAgICAgcmVqZWN0ZWQsXG4gICAgICBzeW5jaHJvbm91czogb3B0aW9ucyA/IG9wdGlvbnMuc3luY2hyb25vdXMgOiBmYWxzZSxcbiAgICAgIHJ1bldoZW46IG9wdGlvbnMgPyBvcHRpb25zLnJ1bldoZW4gOiBudWxsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlcnMubGVuZ3RoIC0gMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gaW50ZXJjZXB0b3IgZnJvbSB0aGUgc3RhY2tcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGlkIFRoZSBJRCB0aGF0IHdhcyByZXR1cm5lZCBieSBgdXNlYFxuICAgKlxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBpbnRlcmNlcHRvciB3YXMgcmVtb3ZlZCwgYGZhbHNlYCBvdGhlcndpc2VcbiAgICovXG4gIGVqZWN0KGlkKSB7XG4gICAgaWYgKHRoaXMuaGFuZGxlcnNbaWRdKSB7XG4gICAgICB0aGlzLmhhbmRsZXJzW2lkXSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBpbnRlcmNlcHRvcnMgZnJvbSB0aGUgc3RhY2tcbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBjbGVhcigpIHtcbiAgICBpZiAodGhpcy5oYW5kbGVycykge1xuICAgICAgdGhpcy5oYW5kbGVycyA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZWdpc3RlcmVkIGludGVyY2VwdG9yc1xuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBza2lwcGluZyBvdmVyIGFueVxuICAgKiBpbnRlcmNlcHRvcnMgdGhhdCBtYXkgaGF2ZSBiZWNvbWUgYG51bGxgIGNhbGxpbmcgYGVqZWN0YC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggaW50ZXJjZXB0b3JcbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBmb3JFYWNoKGZuKSB7XG4gICAgdXRpbHMuZm9yRWFjaCh0aGlzLmhhbmRsZXJzLCBmdW5jdGlvbiBmb3JFYWNoSGFuZGxlcihoKSB7XG4gICAgICBpZiAoaCAhPT0gbnVsbCkge1xuICAgICAgICBmbihoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbnRlcmNlcHRvck1hbmFnZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgc2lsZW50SlNPTlBhcnNpbmc6IHRydWUsXG4gIGZvcmNlZEpTT05QYXJzaW5nOiB0cnVlLFxuICBjbGFyaWZ5VGltZW91dEVycm9yOiBmYWxzZVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IEF4aW9zVVJMU2VhcmNoUGFyYW1zIGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvQXhpb3NVUkxTZWFyY2hQYXJhbXMuanMnO1xuZXhwb3J0IGRlZmF1bHQgdHlwZW9mIFVSTFNlYXJjaFBhcmFtcyAhPT0gJ3VuZGVmaW5lZCcgPyBVUkxTZWFyY2hQYXJhbXMgOiBBeGlvc1VSTFNlYXJjaFBhcmFtcztcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0IGRlZmF1bHQgRm9ybURhdGE7XG4iLCJpbXBvcnQgVVJMU2VhcmNoUGFyYW1zIGZyb20gJy4vY2xhc3Nlcy9VUkxTZWFyY2hQYXJhbXMuanMnXG5pbXBvcnQgRm9ybURhdGEgZnJvbSAnLi9jbGFzc2VzL0Zvcm1EYXRhLmpzJ1xuXG4vKipcbiAqIERldGVybWluZSBpZiB3ZSdyZSBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudFxuICpcbiAqIFRoaXMgYWxsb3dzIGF4aW9zIHRvIHJ1biBpbiBhIHdlYiB3b3JrZXIsIGFuZCByZWFjdC1uYXRpdmUuXG4gKiBCb3RoIGVudmlyb25tZW50cyBzdXBwb3J0IFhNTEh0dHBSZXF1ZXN0LCBidXQgbm90IGZ1bGx5IHN0YW5kYXJkIGdsb2JhbHMuXG4gKlxuICogd2ViIHdvcmtlcnM6XG4gKiAgdHlwZW9mIHdpbmRvdyAtPiB1bmRlZmluZWRcbiAqICB0eXBlb2YgZG9jdW1lbnQgLT4gdW5kZWZpbmVkXG4gKlxuICogcmVhY3QtbmF0aXZlOlxuICogIG5hdmlnYXRvci5wcm9kdWN0IC0+ICdSZWFjdE5hdGl2ZSdcbiAqIG5hdGl2ZXNjcmlwdFxuICogIG5hdmlnYXRvci5wcm9kdWN0IC0+ICdOYXRpdmVTY3JpcHQnIG9yICdOUydcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNTdGFuZGFyZEJyb3dzZXJFbnYgPSAoKCkgPT4ge1xuICBsZXQgcHJvZHVjdDtcbiAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIChcbiAgICAocHJvZHVjdCA9IG5hdmlnYXRvci5wcm9kdWN0KSA9PT0gJ1JlYWN0TmF0aXZlJyB8fFxuICAgIHByb2R1Y3QgPT09ICdOYXRpdmVTY3JpcHQnIHx8XG4gICAgcHJvZHVjdCA9PT0gJ05TJylcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCc7XG59KSgpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiB3ZSdyZSBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciB3ZWJXb3JrZXIgZW52aXJvbm1lbnRcbiAqXG4gKiBBbHRob3VnaCB0aGUgYGlzU3RhbmRhcmRCcm93c2VyRW52YCBtZXRob2QgaW5kaWNhdGVzIHRoYXRcbiAqIGBhbGxvd3MgYXhpb3MgdG8gcnVuIGluIGEgd2ViIHdvcmtlcmAsIHRoZSBXZWJXb3JrZXIgd2lsbCBzdGlsbCBiZVxuICogZmlsdGVyZWQgb3V0IGR1ZSB0byBpdHMganVkZ21lbnQgc3RhbmRhcmRcbiAqIGB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnYC5cbiAqIFRoaXMgbGVhZHMgdG8gYSBwcm9ibGVtIHdoZW4gYXhpb3MgcG9zdCBgRm9ybURhdGFgIGluIHdlYldvcmtlclxuICovXG4gY29uc3QgaXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnYgPSAoKCkgPT4ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICBzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGUgJiZcbiAgICB0eXBlb2Ygc2VsZi5pbXBvcnRTY3JpcHRzID09PSAnZnVuY3Rpb24nXG4gICk7XG59KSgpO1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaXNCcm93c2VyOiB0cnVlLFxuICBjbGFzc2VzOiB7XG4gICAgVVJMU2VhcmNoUGFyYW1zLFxuICAgIEZvcm1EYXRhLFxuICAgIEJsb2JcbiAgfSxcbiAgaXNTdGFuZGFyZEJyb3dzZXJFbnYsXG4gIGlzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52LFxuICBwcm90b2NvbHM6IFsnaHR0cCcsICdodHRwcycsICdmaWxlJywgJ2Jsb2InLCAndXJsJywgJ2RhdGEnXVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcbmltcG9ydCB0b0Zvcm1EYXRhIGZyb20gJy4vdG9Gb3JtRGF0YS5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vcGxhdGZvcm0vaW5kZXguanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0b1VSTEVuY29kZWRGb3JtKGRhdGEsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRvRm9ybURhdGEoZGF0YSwgbmV3IHBsYXRmb3JtLmNsYXNzZXMuVVJMU2VhcmNoUGFyYW1zKCksIE9iamVjdC5hc3NpZ24oe1xuICAgIHZpc2l0b3I6IGZ1bmN0aW9uKHZhbHVlLCBrZXksIHBhdGgsIGhlbHBlcnMpIHtcbiAgICAgIGlmIChwbGF0Zm9ybS5pc05vZGUgJiYgdXRpbHMuaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKGtleSwgdmFsdWUudG9TdHJpbmcoJ2Jhc2U2NCcpKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaGVscGVycy5kZWZhdWx0VmlzaXRvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfSwgb3B0aW9ucykpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuXG4vKipcbiAqIEl0IHRha2VzIGEgc3RyaW5nIGxpa2UgYGZvb1t4XVt5XVt6XWAgYW5kIHJldHVybnMgYW4gYXJyYXkgbGlrZSBgWydmb28nLCAneCcsICd5JywgJ3onXVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBzdHJpbmdzLlxuICovXG5mdW5jdGlvbiBwYXJzZVByb3BQYXRoKG5hbWUpIHtcbiAgLy8gZm9vW3hdW3ldW3pdXG4gIC8vIGZvby54LnkuelxuICAvLyBmb28teC15LXpcbiAgLy8gZm9vIHggeSB6XG4gIHJldHVybiB1dGlscy5tYXRjaEFsbCgvXFx3K3xcXFsoXFx3KildL2csIG5hbWUpLm1hcChtYXRjaCA9PiB7XG4gICAgcmV0dXJuIG1hdGNoWzBdID09PSAnW10nID8gJycgOiBtYXRjaFsxXSB8fCBtYXRjaFswXTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ29udmVydCBhbiBhcnJheSB0byBhbiBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtBcnJheTxhbnk+fSBhcnIgLSBUaGUgYXJyYXkgdG8gY29udmVydCB0byBhbiBvYmplY3QuXG4gKlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggdGhlIHNhbWUga2V5cyBhbmQgdmFsdWVzIGFzIHRoZSBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlUb09iamVjdChhcnIpIHtcbiAgY29uc3Qgb2JqID0ge307XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhhcnIpO1xuICBsZXQgaTtcbiAgY29uc3QgbGVuID0ga2V5cy5sZW5ndGg7XG4gIGxldCBrZXk7XG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGtleSA9IGtleXNbaV07XG4gICAgb2JqW2tleV0gPSBhcnJba2V5XTtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgRm9ybURhdGEgb2JqZWN0IGFuZCByZXR1cm5zIGEgSmF2YVNjcmlwdCBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybURhdGEgVGhlIEZvcm1EYXRhIG9iamVjdCB0byBjb252ZXJ0IHRvIEpTT04uXG4gKlxuICogQHJldHVybnMge09iamVjdDxzdHJpbmcsIGFueT4gfCBudWxsfSBUaGUgY29udmVydGVkIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZm9ybURhdGFUb0pTT04oZm9ybURhdGEpIHtcbiAgZnVuY3Rpb24gYnVpbGRQYXRoKHBhdGgsIHZhbHVlLCB0YXJnZXQsIGluZGV4KSB7XG4gICAgbGV0IG5hbWUgPSBwYXRoW2luZGV4KytdO1xuICAgIGNvbnN0IGlzTnVtZXJpY0tleSA9IE51bWJlci5pc0Zpbml0ZSgrbmFtZSk7XG4gICAgY29uc3QgaXNMYXN0ID0gaW5kZXggPj0gcGF0aC5sZW5ndGg7XG4gICAgbmFtZSA9ICFuYW1lICYmIHV0aWxzLmlzQXJyYXkodGFyZ2V0KSA/IHRhcmdldC5sZW5ndGggOiBuYW1lO1xuXG4gICAgaWYgKGlzTGFzdCkge1xuICAgICAgaWYgKHV0aWxzLmhhc093blByb3AodGFyZ2V0LCBuYW1lKSkge1xuICAgICAgICB0YXJnZXRbbmFtZV0gPSBbdGFyZ2V0W25hbWVdLCB2YWx1ZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRbbmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICFpc051bWVyaWNLZXk7XG4gICAgfVxuXG4gICAgaWYgKCF0YXJnZXRbbmFtZV0gfHwgIXV0aWxzLmlzT2JqZWN0KHRhcmdldFtuYW1lXSkpIHtcbiAgICAgIHRhcmdldFtuYW1lXSA9IFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkUGF0aChwYXRoLCB2YWx1ZSwgdGFyZ2V0W25hbWVdLCBpbmRleCk7XG5cbiAgICBpZiAocmVzdWx0ICYmIHV0aWxzLmlzQXJyYXkodGFyZ2V0W25hbWVdKSkge1xuICAgICAgdGFyZ2V0W25hbWVdID0gYXJyYXlUb09iamVjdCh0YXJnZXRbbmFtZV0pO1xuICAgIH1cblxuICAgIHJldHVybiAhaXNOdW1lcmljS2V5O1xuICB9XG5cbiAgaWYgKHV0aWxzLmlzRm9ybURhdGEoZm9ybURhdGEpICYmIHV0aWxzLmlzRnVuY3Rpb24oZm9ybURhdGEuZW50cmllcykpIHtcbiAgICBjb25zdCBvYmogPSB7fTtcblxuICAgIHV0aWxzLmZvckVhY2hFbnRyeShmb3JtRGF0YSwgKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgICBidWlsZFBhdGgocGFyc2VQcm9wUGF0aChuYW1lKSwgdmFsdWUsIG9iaiwgMCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZvcm1EYXRhVG9KU09OO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSAnLi4vY29yZS9BeGlvc0Vycm9yLmpzJztcbmltcG9ydCB0cmFuc2l0aW9uYWxEZWZhdWx0cyBmcm9tICcuL3RyYW5zaXRpb25hbC5qcyc7XG5pbXBvcnQgdG9Gb3JtRGF0YSBmcm9tICcuLi9oZWxwZXJzL3RvRm9ybURhdGEuanMnO1xuaW1wb3J0IHRvVVJMRW5jb2RlZEZvcm0gZnJvbSAnLi4vaGVscGVycy90b1VSTEVuY29kZWRGb3JtLmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9wbGF0Zm9ybS9pbmRleC5qcyc7XG5pbXBvcnQgZm9ybURhdGFUb0pTT04gZnJvbSAnLi4vaGVscGVycy9mb3JtRGF0YVRvSlNPTi5qcyc7XG5cbmNvbnN0IERFRkFVTFRfQ09OVEVOVF9UWVBFID0ge1xuICAnQ29udGVudC1UeXBlJzogdW5kZWZpbmVkXG59O1xuXG4vKipcbiAqIEl0IHRha2VzIGEgc3RyaW5nLCB0cmllcyB0byBwYXJzZSBpdCwgYW5kIGlmIGl0IGZhaWxzLCBpdCByZXR1cm5zIHRoZSBzdHJpbmdpZmllZCB2ZXJzaW9uXG4gKiBvZiB0aGUgaW5wdXRcbiAqXG4gKiBAcGFyYW0ge2FueX0gcmF3VmFsdWUgLSBUaGUgdmFsdWUgdG8gYmUgc3RyaW5naWZpZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwYXJzZXIgLSBBIGZ1bmN0aW9uIHRoYXQgcGFyc2VzIGEgc3RyaW5nIGludG8gYSBKYXZhU2NyaXB0IG9iamVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVuY29kZXIgLSBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSB2YWx1ZSBhbmQgcmV0dXJucyBhIHN0cmluZy5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBBIHN0cmluZ2lmaWVkIHZlcnNpb24gb2YgdGhlIHJhd1ZhbHVlLlxuICovXG5mdW5jdGlvbiBzdHJpbmdpZnlTYWZlbHkocmF3VmFsdWUsIHBhcnNlciwgZW5jb2Rlcikge1xuICBpZiAodXRpbHMuaXNTdHJpbmcocmF3VmFsdWUpKSB7XG4gICAgdHJ5IHtcbiAgICAgIChwYXJzZXIgfHwgSlNPTi5wYXJzZSkocmF3VmFsdWUpO1xuICAgICAgcmV0dXJuIHV0aWxzLnRyaW0ocmF3VmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlLm5hbWUgIT09ICdTeW50YXhFcnJvcicpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gKGVuY29kZXIgfHwgSlNPTi5zdHJpbmdpZnkpKHJhd1ZhbHVlKTtcbn1cblxuY29uc3QgZGVmYXVsdHMgPSB7XG5cbiAgdHJhbnNpdGlvbmFsOiB0cmFuc2l0aW9uYWxEZWZhdWx0cyxcblxuICBhZGFwdGVyOiBbJ3hocicsICdodHRwJ10sXG5cbiAgdHJhbnNmb3JtUmVxdWVzdDogW2Z1bmN0aW9uIHRyYW5zZm9ybVJlcXVlc3QoZGF0YSwgaGVhZGVycykge1xuICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gaGVhZGVycy5nZXRDb250ZW50VHlwZSgpIHx8ICcnO1xuICAgIGNvbnN0IGhhc0pTT05Db250ZW50VHlwZSA9IGNvbnRlbnRUeXBlLmluZGV4T2YoJ2FwcGxpY2F0aW9uL2pzb24nKSA+IC0xO1xuICAgIGNvbnN0IGlzT2JqZWN0UGF5bG9hZCA9IHV0aWxzLmlzT2JqZWN0KGRhdGEpO1xuXG4gICAgaWYgKGlzT2JqZWN0UGF5bG9hZCAmJiB1dGlscy5pc0hUTUxGb3JtKGRhdGEpKSB7XG4gICAgICBkYXRhID0gbmV3IEZvcm1EYXRhKGRhdGEpO1xuICAgIH1cblxuICAgIGNvbnN0IGlzRm9ybURhdGEgPSB1dGlscy5pc0Zvcm1EYXRhKGRhdGEpO1xuXG4gICAgaWYgKGlzRm9ybURhdGEpIHtcbiAgICAgIGlmICghaGFzSlNPTkNvbnRlbnRUeXBlKSB7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhhc0pTT05Db250ZW50VHlwZSA/IEpTT04uc3RyaW5naWZ5KGZvcm1EYXRhVG9KU09OKGRhdGEpKSA6IGRhdGE7XG4gICAgfVxuXG4gICAgaWYgKHV0aWxzLmlzQXJyYXlCdWZmZXIoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzQnVmZmVyKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc1N0cmVhbShkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNGaWxlKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0Jsb2IoZGF0YSlcbiAgICApIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBpZiAodXRpbHMuaXNBcnJheUJ1ZmZlclZpZXcoZGF0YSkpIHtcbiAgICAgIHJldHVybiBkYXRhLmJ1ZmZlcjtcbiAgICB9XG4gICAgaWYgKHV0aWxzLmlzVVJMU2VhcmNoUGFyYW1zKGRhdGEpKSB7XG4gICAgICBoZWFkZXJzLnNldENvbnRlbnRUeXBlKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCcsIGZhbHNlKTtcbiAgICAgIHJldHVybiBkYXRhLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgbGV0IGlzRmlsZUxpc3Q7XG5cbiAgICBpZiAoaXNPYmplY3RQYXlsb2FkKSB7XG4gICAgICBpZiAoY29udGVudFR5cGUuaW5kZXhPZignYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJykgPiAtMSkge1xuICAgICAgICByZXR1cm4gdG9VUkxFbmNvZGVkRm9ybShkYXRhLCB0aGlzLmZvcm1TZXJpYWxpemVyKS50b1N0cmluZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAoKGlzRmlsZUxpc3QgPSB1dGlscy5pc0ZpbGVMaXN0KGRhdGEpKSB8fCBjb250ZW50VHlwZS5pbmRleE9mKCdtdWx0aXBhcnQvZm9ybS1kYXRhJykgPiAtMSkge1xuICAgICAgICBjb25zdCBfRm9ybURhdGEgPSB0aGlzLmVudiAmJiB0aGlzLmVudi5Gb3JtRGF0YTtcblxuICAgICAgICByZXR1cm4gdG9Gb3JtRGF0YShcbiAgICAgICAgICBpc0ZpbGVMaXN0ID8geydmaWxlc1tdJzogZGF0YX0gOiBkYXRhLFxuICAgICAgICAgIF9Gb3JtRGF0YSAmJiBuZXcgX0Zvcm1EYXRhKCksXG4gICAgICAgICAgdGhpcy5mb3JtU2VyaWFsaXplclxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc09iamVjdFBheWxvYWQgfHwgaGFzSlNPTkNvbnRlbnRUeXBlICkge1xuICAgICAgaGVhZGVycy5zZXRDb250ZW50VHlwZSgnYXBwbGljYXRpb24vanNvbicsIGZhbHNlKTtcbiAgICAgIHJldHVybiBzdHJpbmdpZnlTYWZlbHkoZGF0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1dLFxuXG4gIHRyYW5zZm9ybVJlc3BvbnNlOiBbZnVuY3Rpb24gdHJhbnNmb3JtUmVzcG9uc2UoZGF0YSkge1xuICAgIGNvbnN0IHRyYW5zaXRpb25hbCA9IHRoaXMudHJhbnNpdGlvbmFsIHx8IGRlZmF1bHRzLnRyYW5zaXRpb25hbDtcbiAgICBjb25zdCBmb3JjZWRKU09OUGFyc2luZyA9IHRyYW5zaXRpb25hbCAmJiB0cmFuc2l0aW9uYWwuZm9yY2VkSlNPTlBhcnNpbmc7XG4gICAgY29uc3QgSlNPTlJlcXVlc3RlZCA9IHRoaXMucmVzcG9uc2VUeXBlID09PSAnanNvbic7XG5cbiAgICBpZiAoZGF0YSAmJiB1dGlscy5pc1N0cmluZyhkYXRhKSAmJiAoKGZvcmNlZEpTT05QYXJzaW5nICYmICF0aGlzLnJlc3BvbnNlVHlwZSkgfHwgSlNPTlJlcXVlc3RlZCkpIHtcbiAgICAgIGNvbnN0IHNpbGVudEpTT05QYXJzaW5nID0gdHJhbnNpdGlvbmFsICYmIHRyYW5zaXRpb25hbC5zaWxlbnRKU09OUGFyc2luZztcbiAgICAgIGNvbnN0IHN0cmljdEpTT05QYXJzaW5nID0gIXNpbGVudEpTT05QYXJzaW5nICYmIEpTT05SZXF1ZXN0ZWQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoc3RyaWN0SlNPTlBhcnNpbmcpIHtcbiAgICAgICAgICBpZiAoZS5uYW1lID09PSAnU3ludGF4RXJyb3InKSB7XG4gICAgICAgICAgICB0aHJvdyBBeGlvc0Vycm9yLmZyb20oZSwgQXhpb3NFcnJvci5FUlJfQkFEX1JFU1BPTlNFLCB0aGlzLCBudWxsLCB0aGlzLnJlc3BvbnNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9XSxcblxuICAvKipcbiAgICogQSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byBhYm9ydCBhIHJlcXVlc3QuIElmIHNldCB0byAwIChkZWZhdWx0KSBhXG4gICAqIHRpbWVvdXQgaXMgbm90IGNyZWF0ZWQuXG4gICAqL1xuICB0aW1lb3V0OiAwLFxuXG4gIHhzcmZDb29raWVOYW1lOiAnWFNSRi1UT0tFTicsXG4gIHhzcmZIZWFkZXJOYW1lOiAnWC1YU1JGLVRPS0VOJyxcblxuICBtYXhDb250ZW50TGVuZ3RoOiAtMSxcbiAgbWF4Qm9keUxlbmd0aDogLTEsXG5cbiAgZW52OiB7XG4gICAgRm9ybURhdGE6IHBsYXRmb3JtLmNsYXNzZXMuRm9ybURhdGEsXG4gICAgQmxvYjogcGxhdGZvcm0uY2xhc3Nlcy5CbG9iXG4gIH0sXG5cbiAgdmFsaWRhdGVTdGF0dXM6IGZ1bmN0aW9uIHZhbGlkYXRlU3RhdHVzKHN0YXR1cykge1xuICAgIHJldHVybiBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMDtcbiAgfSxcblxuICBoZWFkZXJzOiB7XG4gICAgY29tbW9uOiB7XG4gICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKidcbiAgICB9XG4gIH1cbn07XG5cbnV0aWxzLmZvckVhY2goWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZE5vRGF0YShtZXRob2QpIHtcbiAgZGVmYXVsdHMuaGVhZGVyc1ttZXRob2RdID0ge307XG59KTtcblxudXRpbHMuZm9yRWFjaChbJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2RXaXRoRGF0YShtZXRob2QpIHtcbiAgZGVmYXVsdHMuaGVhZGVyc1ttZXRob2RdID0gdXRpbHMubWVyZ2UoREVGQVVMVF9DT05URU5UX1RZUEUpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmF1bHRzO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5cbi8vIFJhd0F4aW9zSGVhZGVycyB3aG9zZSBkdXBsaWNhdGVzIGFyZSBpZ25vcmVkIGJ5IG5vZGVcbi8vIGMuZi4gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9odHRwLmh0bWwjaHR0cF9tZXNzYWdlX2hlYWRlcnNcbmNvbnN0IGlnbm9yZUR1cGxpY2F0ZU9mID0gdXRpbHMudG9PYmplY3RTZXQoW1xuICAnYWdlJywgJ2F1dGhvcml6YXRpb24nLCAnY29udGVudC1sZW5ndGgnLCAnY29udGVudC10eXBlJywgJ2V0YWcnLFxuICAnZXhwaXJlcycsICdmcm9tJywgJ2hvc3QnLCAnaWYtbW9kaWZpZWQtc2luY2UnLCAnaWYtdW5tb2RpZmllZC1zaW5jZScsXG4gICdsYXN0LW1vZGlmaWVkJywgJ2xvY2F0aW9uJywgJ21heC1mb3J3YXJkcycsICdwcm94eS1hdXRob3JpemF0aW9uJyxcbiAgJ3JlZmVyZXInLCAncmV0cnktYWZ0ZXInLCAndXNlci1hZ2VudCdcbl0pO1xuXG4vKipcbiAqIFBhcnNlIGhlYWRlcnMgaW50byBhbiBvYmplY3RcbiAqXG4gKiBgYGBcbiAqIERhdGU6IFdlZCwgMjcgQXVnIDIwMTQgMDg6NTg6NDkgR01UXG4gKiBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbiAqIENvbm5lY3Rpb246IGtlZXAtYWxpdmVcbiAqIFRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcmF3SGVhZGVycyBIZWFkZXJzIG5lZWRpbmcgdG8gYmUgcGFyc2VkXG4gKlxuICogQHJldHVybnMge09iamVjdH0gSGVhZGVycyBwYXJzZWQgaW50byBhbiBvYmplY3RcbiAqL1xuZXhwb3J0IGRlZmF1bHQgcmF3SGVhZGVycyA9PiB7XG4gIGNvbnN0IHBhcnNlZCA9IHt9O1xuICBsZXQga2V5O1xuICBsZXQgdmFsO1xuICBsZXQgaTtcblxuICByYXdIZWFkZXJzICYmIHJhd0hlYWRlcnMuc3BsaXQoJ1xcbicpLmZvckVhY2goZnVuY3Rpb24gcGFyc2VyKGxpbmUpIHtcbiAgICBpID0gbGluZS5pbmRleE9mKCc6Jyk7XG4gICAga2V5ID0gbGluZS5zdWJzdHJpbmcoMCwgaSkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFsID0gbGluZS5zdWJzdHJpbmcoaSArIDEpLnRyaW0oKTtcblxuICAgIGlmICgha2V5IHx8IChwYXJzZWRba2V5XSAmJiBpZ25vcmVEdXBsaWNhdGVPZltrZXldKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09ICdzZXQtY29va2llJykge1xuICAgICAgaWYgKHBhcnNlZFtrZXldKSB7XG4gICAgICAgIHBhcnNlZFtrZXldLnB1c2godmFsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlZFtrZXldID0gW3ZhbF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnNlZFtrZXldID0gcGFyc2VkW2tleV0gPyBwYXJzZWRba2V5XSArICcsICcgKyB2YWwgOiB2YWw7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcGFyc2VkO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcbmltcG9ydCBwYXJzZUhlYWRlcnMgZnJvbSAnLi4vaGVscGVycy9wYXJzZUhlYWRlcnMuanMnO1xuXG5jb25zdCAkaW50ZXJuYWxzID0gU3ltYm9sKCdpbnRlcm5hbHMnKTtcblxuZnVuY3Rpb24gbm9ybWFsaXplSGVhZGVyKGhlYWRlcikge1xuICByZXR1cm4gaGVhZGVyICYmIFN0cmluZyhoZWFkZXIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVWYWx1ZSh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT09IGZhbHNlIHx8IHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gdXRpbHMuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5tYXAobm9ybWFsaXplVmFsdWUpIDogU3RyaW5nKHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VUb2tlbnMoc3RyKSB7XG4gIGNvbnN0IHRva2VucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGNvbnN0IHRva2Vuc1JFID0gLyhbXlxccyw7PV0rKVxccyooPzo9XFxzKihbXiw7XSspKT8vZztcbiAgbGV0IG1hdGNoO1xuXG4gIHdoaWxlICgobWF0Y2ggPSB0b2tlbnNSRS5leGVjKHN0cikpKSB7XG4gICAgdG9rZW5zW21hdGNoWzFdXSA9IG1hdGNoWzJdO1xuICB9XG5cbiAgcmV0dXJuIHRva2Vucztcbn1cblxuZnVuY3Rpb24gaXNWYWxpZEhlYWRlck5hbWUoc3RyKSB7XG4gIHJldHVybiAvXlstX2EtekEtWl0rJC8udGVzdChzdHIudHJpbSgpKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hIZWFkZXJWYWx1ZShjb250ZXh0LCB2YWx1ZSwgaGVhZGVyLCBmaWx0ZXIpIHtcbiAgaWYgKHV0aWxzLmlzRnVuY3Rpb24oZmlsdGVyKSkge1xuICAgIHJldHVybiBmaWx0ZXIuY2FsbCh0aGlzLCB2YWx1ZSwgaGVhZGVyKTtcbiAgfVxuXG4gIGlmICghdXRpbHMuaXNTdHJpbmcodmFsdWUpKSByZXR1cm47XG5cbiAgaWYgKHV0aWxzLmlzU3RyaW5nKGZpbHRlcikpIHtcbiAgICByZXR1cm4gdmFsdWUuaW5kZXhPZihmaWx0ZXIpICE9PSAtMTtcbiAgfVxuXG4gIGlmICh1dGlscy5pc1JlZ0V4cChmaWx0ZXIpKSB7XG4gICAgcmV0dXJuIGZpbHRlci50ZXN0KHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXRIZWFkZXIoaGVhZGVyKSB7XG4gIHJldHVybiBoZWFkZXIudHJpbSgpXG4gICAgLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvKFthLXpcXGRdKShcXHcqKS9nLCAodywgY2hhciwgc3RyKSA9PiB7XG4gICAgICByZXR1cm4gY2hhci50b1VwcGVyQ2FzZSgpICsgc3RyO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZEFjY2Vzc29ycyhvYmosIGhlYWRlcikge1xuICBjb25zdCBhY2Nlc3Nvck5hbWUgPSB1dGlscy50b0NhbWVsQ2FzZSgnICcgKyBoZWFkZXIpO1xuXG4gIFsnZ2V0JywgJ3NldCcsICdoYXMnXS5mb3JFYWNoKG1ldGhvZE5hbWUgPT4ge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIG1ldGhvZE5hbWUgKyBhY2Nlc3Nvck5hbWUsIHtcbiAgICAgIHZhbHVlOiBmdW5jdGlvbihhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgICAgIHJldHVybiB0aGlzW21ldGhvZE5hbWVdLmNhbGwodGhpcywgaGVhZGVyLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICAgIH0sXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgfSk7XG59XG5cbmNsYXNzIEF4aW9zSGVhZGVycyB7XG4gIGNvbnN0cnVjdG9yKGhlYWRlcnMpIHtcbiAgICBoZWFkZXJzICYmIHRoaXMuc2V0KGhlYWRlcnMpO1xuICB9XG5cbiAgc2V0KGhlYWRlciwgdmFsdWVPclJld3JpdGUsIHJld3JpdGUpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGZ1bmN0aW9uIHNldEhlYWRlcihfdmFsdWUsIF9oZWFkZXIsIF9yZXdyaXRlKSB7XG4gICAgICBjb25zdCBsSGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKF9oZWFkZXIpO1xuXG4gICAgICBpZiAoIWxIZWFkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdoZWFkZXIgbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBrZXkgPSB1dGlscy5maW5kS2V5KHNlbGYsIGxIZWFkZXIpO1xuXG4gICAgICBpZigha2V5IHx8IHNlbGZba2V5XSA9PT0gdW5kZWZpbmVkIHx8IF9yZXdyaXRlID09PSB0cnVlIHx8IChfcmV3cml0ZSA9PT0gdW5kZWZpbmVkICYmIHNlbGZba2V5XSAhPT0gZmFsc2UpKSB7XG4gICAgICAgIHNlbGZba2V5IHx8IF9oZWFkZXJdID0gbm9ybWFsaXplVmFsdWUoX3ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzZXRIZWFkZXJzID0gKGhlYWRlcnMsIF9yZXdyaXRlKSA9PlxuICAgICAgdXRpbHMuZm9yRWFjaChoZWFkZXJzLCAoX3ZhbHVlLCBfaGVhZGVyKSA9PiBzZXRIZWFkZXIoX3ZhbHVlLCBfaGVhZGVyLCBfcmV3cml0ZSkpO1xuXG4gICAgaWYgKHV0aWxzLmlzUGxhaW5PYmplY3QoaGVhZGVyKSB8fCBoZWFkZXIgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yKSB7XG4gICAgICBzZXRIZWFkZXJzKGhlYWRlciwgdmFsdWVPclJld3JpdGUpXG4gICAgfSBlbHNlIGlmKHV0aWxzLmlzU3RyaW5nKGhlYWRlcikgJiYgKGhlYWRlciA9IGhlYWRlci50cmltKCkpICYmICFpc1ZhbGlkSGVhZGVyTmFtZShoZWFkZXIpKSB7XG4gICAgICBzZXRIZWFkZXJzKHBhcnNlSGVhZGVycyhoZWFkZXIpLCB2YWx1ZU9yUmV3cml0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhlYWRlciAhPSBudWxsICYmIHNldEhlYWRlcih2YWx1ZU9yUmV3cml0ZSwgaGVhZGVyLCByZXdyaXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGdldChoZWFkZXIsIHBhcnNlcikge1xuICAgIGhlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihoZWFkZXIpO1xuXG4gICAgaWYgKGhlYWRlcikge1xuICAgICAgY29uc3Qga2V5ID0gdXRpbHMuZmluZEtleSh0aGlzLCBoZWFkZXIpO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1trZXldO1xuXG4gICAgICAgIGlmICghcGFyc2VyKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnNlciA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHJldHVybiBwYXJzZVRva2Vucyh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXRpbHMuaXNGdW5jdGlvbihwYXJzZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlci5jYWxsKHRoaXMsIHZhbHVlLCBrZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHV0aWxzLmlzUmVnRXhwKHBhcnNlcikpIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VyLmV4ZWModmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncGFyc2VyIG11c3QgYmUgYm9vbGVhbnxyZWdleHB8ZnVuY3Rpb24nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYXMoaGVhZGVyLCBtYXRjaGVyKSB7XG4gICAgaGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKGhlYWRlcik7XG5cbiAgICBpZiAoaGVhZGVyKSB7XG4gICAgICBjb25zdCBrZXkgPSB1dGlscy5maW5kS2V5KHRoaXMsIGhlYWRlcik7XG5cbiAgICAgIHJldHVybiAhIShrZXkgJiYgdGhpc1trZXldICE9PSB1bmRlZmluZWQgJiYgKCFtYXRjaGVyIHx8IG1hdGNoSGVhZGVyVmFsdWUodGhpcywgdGhpc1trZXldLCBrZXksIG1hdGNoZXIpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZGVsZXRlKGhlYWRlciwgbWF0Y2hlcikge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGxldCBkZWxldGVkID0gZmFsc2U7XG5cbiAgICBmdW5jdGlvbiBkZWxldGVIZWFkZXIoX2hlYWRlcikge1xuICAgICAgX2hlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihfaGVhZGVyKTtcblxuICAgICAgaWYgKF9oZWFkZXIpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdXRpbHMuZmluZEtleShzZWxmLCBfaGVhZGVyKTtcblxuICAgICAgICBpZiAoa2V5ICYmICghbWF0Y2hlciB8fCBtYXRjaEhlYWRlclZhbHVlKHNlbGYsIHNlbGZba2V5XSwga2V5LCBtYXRjaGVyKSkpIHtcbiAgICAgICAgICBkZWxldGUgc2VsZltrZXldO1xuXG4gICAgICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodXRpbHMuaXNBcnJheShoZWFkZXIpKSB7XG4gICAgICBoZWFkZXIuZm9yRWFjaChkZWxldGVIZWFkZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGVIZWFkZXIoaGVhZGVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIGNsZWFyKG1hdGNoZXIpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcyk7XG4gICAgbGV0IGkgPSBrZXlzLmxlbmd0aDtcbiAgICBsZXQgZGVsZXRlZCA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgIGlmKCFtYXRjaGVyIHx8IG1hdGNoSGVhZGVyVmFsdWUodGhpcywgdGhpc1trZXldLCBrZXksIG1hdGNoZXIpKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzW2tleV07XG4gICAgICAgIGRlbGV0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgbm9ybWFsaXplKGZvcm1hdCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcblxuICAgIHV0aWxzLmZvckVhY2godGhpcywgKHZhbHVlLCBoZWFkZXIpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IHV0aWxzLmZpbmRLZXkoaGVhZGVycywgaGVhZGVyKTtcblxuICAgICAgaWYgKGtleSkge1xuICAgICAgICBzZWxmW2tleV0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIGRlbGV0ZSBzZWxmW2hlYWRlcl07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IGZvcm1hdCA/IGZvcm1hdEhlYWRlcihoZWFkZXIpIDogU3RyaW5nKGhlYWRlcikudHJpbSgpO1xuXG4gICAgICBpZiAobm9ybWFsaXplZCAhPT0gaGVhZGVyKSB7XG4gICAgICAgIGRlbGV0ZSBzZWxmW2hlYWRlcl07XG4gICAgICB9XG5cbiAgICAgIHNlbGZbbm9ybWFsaXplZF0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG5cbiAgICAgIGhlYWRlcnNbbm9ybWFsaXplZF0gPSB0cnVlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjb25jYXQoLi4udGFyZ2V0cykge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLmNvbmNhdCh0aGlzLCAuLi50YXJnZXRzKTtcbiAgfVxuXG4gIHRvSlNPTihhc1N0cmluZ3MpIHtcbiAgICBjb25zdCBvYmogPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgdXRpbHMuZm9yRWFjaCh0aGlzLCAodmFsdWUsIGhlYWRlcikgPT4ge1xuICAgICAgdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPT0gZmFsc2UgJiYgKG9ialtoZWFkZXJdID0gYXNTdHJpbmdzICYmIHV0aWxzLmlzQXJyYXkodmFsdWUpID8gdmFsdWUuam9pbignLCAnKSA6IHZhbHVlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy50b0pTT04oKSlbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICB9XG5cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMudG9KU09OKCkpLm1hcCgoW2hlYWRlciwgdmFsdWVdKSA9PiBoZWFkZXIgKyAnOiAnICsgdmFsdWUpLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgIHJldHVybiAnQXhpb3NIZWFkZXJzJztcbiAgfVxuXG4gIHN0YXRpYyBmcm9tKHRoaW5nKSB7XG4gICAgcmV0dXJuIHRoaW5nIGluc3RhbmNlb2YgdGhpcyA/IHRoaW5nIDogbmV3IHRoaXModGhpbmcpO1xuICB9XG5cbiAgc3RhdGljIGNvbmNhdChmaXJzdCwgLi4udGFyZ2V0cykge1xuICAgIGNvbnN0IGNvbXB1dGVkID0gbmV3IHRoaXMoZmlyc3QpO1xuXG4gICAgdGFyZ2V0cy5mb3JFYWNoKCh0YXJnZXQpID0+IGNvbXB1dGVkLnNldCh0YXJnZXQpKTtcblxuICAgIHJldHVybiBjb21wdXRlZDtcbiAgfVxuXG4gIHN0YXRpYyBhY2Nlc3NvcihoZWFkZXIpIHtcbiAgICBjb25zdCBpbnRlcm5hbHMgPSB0aGlzWyRpbnRlcm5hbHNdID0gKHRoaXNbJGludGVybmFsc10gPSB7XG4gICAgICBhY2Nlc3NvcnM6IHt9XG4gICAgfSk7XG5cbiAgICBjb25zdCBhY2Nlc3NvcnMgPSBpbnRlcm5hbHMuYWNjZXNzb3JzO1xuICAgIGNvbnN0IHByb3RvdHlwZSA9IHRoaXMucHJvdG90eXBlO1xuXG4gICAgZnVuY3Rpb24gZGVmaW5lQWNjZXNzb3IoX2hlYWRlcikge1xuICAgICAgY29uc3QgbEhlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihfaGVhZGVyKTtcblxuICAgICAgaWYgKCFhY2Nlc3NvcnNbbEhlYWRlcl0pIHtcbiAgICAgICAgYnVpbGRBY2Nlc3NvcnMocHJvdG90eXBlLCBfaGVhZGVyKTtcbiAgICAgICAgYWNjZXNzb3JzW2xIZWFkZXJdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB1dGlscy5pc0FycmF5KGhlYWRlcikgPyBoZWFkZXIuZm9yRWFjaChkZWZpbmVBY2Nlc3NvcikgOiBkZWZpbmVBY2Nlc3NvcihoZWFkZXIpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuQXhpb3NIZWFkZXJzLmFjY2Vzc29yKFsnQ29udGVudC1UeXBlJywgJ0NvbnRlbnQtTGVuZ3RoJywgJ0FjY2VwdCcsICdBY2NlcHQtRW5jb2RpbmcnLCAnVXNlci1BZ2VudCcsICdBdXRob3JpemF0aW9uJ10pO1xuXG51dGlscy5mcmVlemVNZXRob2RzKEF4aW9zSGVhZGVycy5wcm90b3R5cGUpO1xudXRpbHMuZnJlZXplTWV0aG9kcyhBeGlvc0hlYWRlcnMpO1xuXG5leHBvcnQgZGVmYXVsdCBBeGlvc0hlYWRlcnM7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcbmltcG9ydCBkZWZhdWx0cyBmcm9tICcuLi9kZWZhdWx0cy9pbmRleC5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gJy4uL2NvcmUvQXhpb3NIZWFkZXJzLmpzJztcblxuLyoqXG4gKiBUcmFuc2Zvcm0gdGhlIGRhdGEgZm9yIGEgcmVxdWVzdCBvciBhIHJlc3BvbnNlXG4gKlxuICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbn0gZm5zIEEgc2luZ2xlIGZ1bmN0aW9uIG9yIEFycmF5IG9mIGZ1bmN0aW9uc1xuICogQHBhcmFtIHs/T2JqZWN0fSByZXNwb25zZSBUaGUgcmVzcG9uc2Ugb2JqZWN0XG4gKlxuICogQHJldHVybnMgeyp9IFRoZSByZXN1bHRpbmcgdHJhbnNmb3JtZWQgZGF0YVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmFuc2Zvcm1EYXRhKGZucywgcmVzcG9uc2UpIHtcbiAgY29uc3QgY29uZmlnID0gdGhpcyB8fCBkZWZhdWx0cztcbiAgY29uc3QgY29udGV4dCA9IHJlc3BvbnNlIHx8IGNvbmZpZztcbiAgY29uc3QgaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKGNvbnRleHQuaGVhZGVycyk7XG4gIGxldCBkYXRhID0gY29udGV4dC5kYXRhO1xuXG4gIHV0aWxzLmZvckVhY2goZm5zLCBmdW5jdGlvbiB0cmFuc2Zvcm0oZm4pIHtcbiAgICBkYXRhID0gZm4uY2FsbChjb25maWcsIGRhdGEsIGhlYWRlcnMubm9ybWFsaXplKCksIHJlc3BvbnNlID8gcmVzcG9uc2Uuc3RhdHVzIDogdW5kZWZpbmVkKTtcbiAgfSk7XG5cbiAgaGVhZGVycy5ub3JtYWxpemUoKTtcblxuICByZXR1cm4gZGF0YTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNDYW5jZWwodmFsdWUpIHtcbiAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlLl9fQ0FOQ0VMX18pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tICcuLi9jb3JlL0F4aW9zRXJyb3IuanMnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcblxuLyoqXG4gKiBBIGBDYW5jZWxlZEVycm9yYCBpcyBhbiBvYmplY3QgdGhhdCBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gaXMgY2FuY2VsZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmc9fSBtZXNzYWdlIFRoZSBtZXNzYWdlLlxuICogQHBhcmFtIHtPYmplY3Q9fSBjb25maWcgVGhlIGNvbmZpZy5cbiAqIEBwYXJhbSB7T2JqZWN0PX0gcmVxdWVzdCBUaGUgcmVxdWVzdC5cbiAqXG4gKiBAcmV0dXJucyB7Q2FuY2VsZWRFcnJvcn0gVGhlIGNyZWF0ZWQgZXJyb3IuXG4gKi9cbmZ1bmN0aW9uIENhbmNlbGVkRXJyb3IobWVzc2FnZSwgY29uZmlnLCByZXF1ZXN0KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuICBBeGlvc0Vycm9yLmNhbGwodGhpcywgbWVzc2FnZSA9PSBudWxsID8gJ2NhbmNlbGVkJyA6IG1lc3NhZ2UsIEF4aW9zRXJyb3IuRVJSX0NBTkNFTEVELCBjb25maWcsIHJlcXVlc3QpO1xuICB0aGlzLm5hbWUgPSAnQ2FuY2VsZWRFcnJvcic7XG59XG5cbnV0aWxzLmluaGVyaXRzKENhbmNlbGVkRXJyb3IsIEF4aW9zRXJyb3IsIHtcbiAgX19DQU5DRUxfXzogdHJ1ZVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IENhbmNlbGVkRXJyb3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBBeGlvc0Vycm9yIGZyb20gJy4vQXhpb3NFcnJvci5qcyc7XG5cbi8qKlxuICogUmVzb2x2ZSBvciByZWplY3QgYSBQcm9taXNlIGJhc2VkIG9uIHJlc3BvbnNlIHN0YXR1cy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZXNvbHZlIEEgZnVuY3Rpb24gdGhhdCByZXNvbHZlcyB0aGUgcHJvbWlzZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlamVjdCBBIGZ1bmN0aW9uIHRoYXQgcmVqZWN0cyB0aGUgcHJvbWlzZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSByZXNwb25zZSBUaGUgcmVzcG9uc2UuXG4gKlxuICogQHJldHVybnMge29iamVjdH0gVGhlIHJlc3BvbnNlLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCByZXNwb25zZSkge1xuICBjb25zdCB2YWxpZGF0ZVN0YXR1cyA9IHJlc3BvbnNlLmNvbmZpZy52YWxpZGF0ZVN0YXR1cztcbiAgaWYgKCFyZXNwb25zZS5zdGF0dXMgfHwgIXZhbGlkYXRlU3RhdHVzIHx8IHZhbGlkYXRlU3RhdHVzKHJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgfSBlbHNlIHtcbiAgICByZWplY3QobmV3IEF4aW9zRXJyb3IoXG4gICAgICAnUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAnICsgcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgW0F4aW9zRXJyb3IuRVJSX0JBRF9SRVFVRVNULCBBeGlvc0Vycm9yLkVSUl9CQURfUkVTUE9OU0VdW01hdGguZmxvb3IocmVzcG9uc2Uuc3RhdHVzIC8gMTAwKSAtIDRdLFxuICAgICAgcmVzcG9uc2UuY29uZmlnLFxuICAgICAgcmVzcG9uc2UucmVxdWVzdCxcbiAgICAgIHJlc3BvbnNlXG4gICAgKSk7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4vLi4vdXRpbHMuanMnO1xuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uL3BsYXRmb3JtL2luZGV4LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgcGxhdGZvcm0uaXNTdGFuZGFyZEJyb3dzZXJFbnYgP1xuXG4vLyBTdGFuZGFyZCBicm93c2VyIGVudnMgc3VwcG9ydCBkb2N1bWVudC5jb29raWVcbiAgKGZ1bmN0aW9uIHN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd3JpdGU6IGZ1bmN0aW9uIHdyaXRlKG5hbWUsIHZhbHVlLCBleHBpcmVzLCBwYXRoLCBkb21haW4sIHNlY3VyZSkge1xuICAgICAgICBjb25zdCBjb29raWUgPSBbXTtcbiAgICAgICAgY29va2llLnB1c2gobmFtZSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkpO1xuXG4gICAgICAgIGlmICh1dGlscy5pc051bWJlcihleHBpcmVzKSkge1xuICAgICAgICAgIGNvb2tpZS5wdXNoKCdleHBpcmVzPScgKyBuZXcgRGF0ZShleHBpcmVzKS50b0dNVFN0cmluZygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1dGlscy5pc1N0cmluZyhwYXRoKSkge1xuICAgICAgICAgIGNvb2tpZS5wdXNoKCdwYXRoPScgKyBwYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1dGlscy5pc1N0cmluZyhkb21haW4pKSB7XG4gICAgICAgICAgY29va2llLnB1c2goJ2RvbWFpbj0nICsgZG9tYWluKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWN1cmUgPT09IHRydWUpIHtcbiAgICAgICAgICBjb29raWUucHVzaCgnc2VjdXJlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBkb2N1bWVudC5jb29raWUgPSBjb29raWUuam9pbignOyAnKTtcbiAgICAgIH0sXG5cbiAgICAgIHJlYWQ6IGZ1bmN0aW9uIHJlYWQobmFtZSkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCcoXnw7XFxcXHMqKSgnICsgbmFtZSArICcpPShbXjtdKiknKSk7XG4gICAgICAgIHJldHVybiAobWF0Y2ggPyBkZWNvZGVVUklDb21wb25lbnQobWF0Y2hbM10pIDogbnVsbCk7XG4gICAgICB9LFxuXG4gICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZShuYW1lKSB7XG4gICAgICAgIHRoaXMud3JpdGUobmFtZSwgJycsIERhdGUubm93KCkgLSA4NjQwMDAwMCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSkoKSA6XG5cbi8vIE5vbiBzdGFuZGFyZCBicm93c2VyIGVudiAod2ViIHdvcmtlcnMsIHJlYWN0LW5hdGl2ZSkgbGFjayBuZWVkZWQgc3VwcG9ydC5cbiAgKGZ1bmN0aW9uIG5vblN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd3JpdGU6IGZ1bmN0aW9uIHdyaXRlKCkge30sXG4gICAgICByZWFkOiBmdW5jdGlvbiByZWFkKCkgeyByZXR1cm4gbnVsbDsgfSxcbiAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge31cbiAgICB9O1xuICB9KSgpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIFVSTCBpcyBhYnNvbHV0ZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIFVSTCB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHNwZWNpZmllZCBVUkwgaXMgYWJzb2x1dGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0Fic29sdXRlVVJMKHVybCkge1xuICAvLyBBIFVSTCBpcyBjb25zaWRlcmVkIGFic29sdXRlIGlmIGl0IGJlZ2lucyB3aXRoIFwiPHNjaGVtZT46Ly9cIiBvciBcIi8vXCIgKHByb3RvY29sLXJlbGF0aXZlIFVSTCkuXG4gIC8vIFJGQyAzOTg2IGRlZmluZXMgc2NoZW1lIG5hbWUgYXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGJlZ2lubmluZyB3aXRoIGEgbGV0dGVyIGFuZCBmb2xsb3dlZFxuICAvLyBieSBhbnkgY29tYmluYXRpb24gb2YgbGV0dGVycywgZGlnaXRzLCBwbHVzLCBwZXJpb2QsIG9yIGh5cGhlbi5cbiAgcmV0dXJuIC9eKFthLXpdW2EtelxcZCtcXC0uXSo6KT9cXC9cXC8vaS50ZXN0KHVybCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBVUkwgYnkgY29tYmluaW5nIHRoZSBzcGVjaWZpZWQgVVJMc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJMIFRoZSBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aXZlVVJMIFRoZSByZWxhdGl2ZSBVUkxcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tYmluZWQgVVJMXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbWJpbmVVUkxzKGJhc2VVUkwsIHJlbGF0aXZlVVJMKSB7XG4gIHJldHVybiByZWxhdGl2ZVVSTFxuICAgID8gYmFzZVVSTC5yZXBsYWNlKC9cXC8rJC8sICcnKSArICcvJyArIHJlbGF0aXZlVVJMLnJlcGxhY2UoL15cXC8rLywgJycpXG4gICAgOiBiYXNlVVJMO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgaXNBYnNvbHV0ZVVSTCBmcm9tICcuLi9oZWxwZXJzL2lzQWJzb2x1dGVVUkwuanMnO1xuaW1wb3J0IGNvbWJpbmVVUkxzIGZyb20gJy4uL2hlbHBlcnMvY29tYmluZVVSTHMuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVVJMIGJ5IGNvbWJpbmluZyB0aGUgYmFzZVVSTCB3aXRoIHRoZSByZXF1ZXN0ZWRVUkwsXG4gKiBvbmx5IHdoZW4gdGhlIHJlcXVlc3RlZFVSTCBpcyBub3QgYWxyZWFkeSBhbiBhYnNvbHV0ZSBVUkwuXG4gKiBJZiB0aGUgcmVxdWVzdFVSTCBpcyBhYnNvbHV0ZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXF1ZXN0ZWRVUkwgdW50b3VjaGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJMIFRoZSBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IHJlcXVlc3RlZFVSTCBBYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gY29tYmluZVxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21iaW5lZCBmdWxsIHBhdGhcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYnVpbGRGdWxsUGF0aChiYXNlVVJMLCByZXF1ZXN0ZWRVUkwpIHtcbiAgaWYgKGJhc2VVUkwgJiYgIWlzQWJzb2x1dGVVUkwocmVxdWVzdGVkVVJMKSkge1xuICAgIHJldHVybiBjb21iaW5lVVJMcyhiYXNlVVJMLCByZXF1ZXN0ZWRVUkwpO1xuICB9XG4gIHJldHVybiByZXF1ZXN0ZWRVUkw7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9wbGF0Zm9ybS9pbmRleC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IHBsYXRmb3JtLmlzU3RhbmRhcmRCcm93c2VyRW52ID9cblxuLy8gU3RhbmRhcmQgYnJvd3NlciBlbnZzIGhhdmUgZnVsbCBzdXBwb3J0IG9mIHRoZSBBUElzIG5lZWRlZCB0byB0ZXN0XG4vLyB3aGV0aGVyIHRoZSByZXF1ZXN0IFVSTCBpcyBvZiB0aGUgc2FtZSBvcmlnaW4gYXMgY3VycmVudCBsb2NhdGlvbi5cbiAgKGZ1bmN0aW9uIHN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICBjb25zdCBtc2llID0gLyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICBjb25zdCB1cmxQYXJzaW5nTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBsZXQgb3JpZ2luVVJMO1xuXG4gICAgLyoqXG4gICAgKiBQYXJzZSBhIFVSTCB0byBkaXNjb3ZlciBpdCdzIGNvbXBvbmVudHNcbiAgICAqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIFRoZSBVUkwgdG8gYmUgcGFyc2VkXG4gICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICovXG4gICAgZnVuY3Rpb24gcmVzb2x2ZVVSTCh1cmwpIHtcbiAgICAgIGxldCBocmVmID0gdXJsO1xuXG4gICAgICBpZiAobXNpZSkge1xuICAgICAgICAvLyBJRSBuZWVkcyBhdHRyaWJ1dGUgc2V0IHR3aWNlIHRvIG5vcm1hbGl6ZSBwcm9wZXJ0aWVzXG4gICAgICAgIHVybFBhcnNpbmdOb2RlLnNldEF0dHJpYnV0ZSgnaHJlZicsIGhyZWYpO1xuICAgICAgICBocmVmID0gdXJsUGFyc2luZ05vZGUuaHJlZjtcbiAgICAgIH1cblxuICAgICAgdXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCdocmVmJywgaHJlZik7XG5cbiAgICAgIC8vIHVybFBhcnNpbmdOb2RlIHByb3ZpZGVzIHRoZSBVcmxVdGlscyBpbnRlcmZhY2UgLSBodHRwOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsdXRpbHNcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhyZWY6IHVybFBhcnNpbmdOb2RlLmhyZWYsXG4gICAgICAgIHByb3RvY29sOiB1cmxQYXJzaW5nTm9kZS5wcm90b2NvbCA/IHVybFBhcnNpbmdOb2RlLnByb3RvY29sLnJlcGxhY2UoLzokLywgJycpIDogJycsXG4gICAgICAgIGhvc3Q6IHVybFBhcnNpbmdOb2RlLmhvc3QsXG4gICAgICAgIHNlYXJjaDogdXJsUGFyc2luZ05vZGUuc2VhcmNoID8gdXJsUGFyc2luZ05vZGUuc2VhcmNoLnJlcGxhY2UoL15cXD8vLCAnJykgOiAnJyxcbiAgICAgICAgaGFzaDogdXJsUGFyc2luZ05vZGUuaGFzaCA/IHVybFBhcnNpbmdOb2RlLmhhc2gucmVwbGFjZSgvXiMvLCAnJykgOiAnJyxcbiAgICAgICAgaG9zdG5hbWU6IHVybFBhcnNpbmdOb2RlLmhvc3RuYW1lLFxuICAgICAgICBwb3J0OiB1cmxQYXJzaW5nTm9kZS5wb3J0LFxuICAgICAgICBwYXRobmFtZTogKHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nKSA/XG4gICAgICAgICAgdXJsUGFyc2luZ05vZGUucGF0aG5hbWUgOlxuICAgICAgICAgICcvJyArIHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lXG4gICAgICB9O1xuICAgIH1cblxuICAgIG9yaWdpblVSTCA9IHJlc29sdmVVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuXG4gICAgLyoqXG4gICAgKiBEZXRlcm1pbmUgaWYgYSBVUkwgc2hhcmVzIHRoZSBzYW1lIG9yaWdpbiBhcyB0aGUgY3VycmVudCBsb2NhdGlvblxuICAgICpcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSByZXF1ZXN0VVJMIFRoZSBVUkwgdG8gdGVzdFxuICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgVVJMIHNoYXJlcyB0aGUgc2FtZSBvcmlnaW4sIG90aGVyd2lzZSBmYWxzZVxuICAgICovXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGlzVVJMU2FtZU9yaWdpbihyZXF1ZXN0VVJMKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSAodXRpbHMuaXNTdHJpbmcocmVxdWVzdFVSTCkpID8gcmVzb2x2ZVVSTChyZXF1ZXN0VVJMKSA6IHJlcXVlc3RVUkw7XG4gICAgICByZXR1cm4gKHBhcnNlZC5wcm90b2NvbCA9PT0gb3JpZ2luVVJMLnByb3RvY29sICYmXG4gICAgICAgICAgcGFyc2VkLmhvc3QgPT09IG9yaWdpblVSTC5ob3N0KTtcbiAgICB9O1xuICB9KSgpIDpcblxuICAvLyBOb24gc3RhbmRhcmQgYnJvd3NlciBlbnZzICh3ZWIgd29ya2VycywgcmVhY3QtbmF0aXZlKSBsYWNrIG5lZWRlZCBzdXBwb3J0LlxuICAoZnVuY3Rpb24gbm9uU3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBpc1VSTFNhbWVPcmlnaW4oKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICB9KSgpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwYXJzZVByb3RvY29sKHVybCkge1xuICBjb25zdCBtYXRjaCA9IC9eKFstK1xcd117MSwyNX0pKDo/XFwvXFwvfDopLy5leGVjKHVybCk7XG4gIHJldHVybiBtYXRjaCAmJiBtYXRjaFsxXSB8fCAnJztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDYWxjdWxhdGUgZGF0YSBtYXhSYXRlXG4gKiBAcGFyYW0ge051bWJlcn0gW3NhbXBsZXNDb3VudD0gMTBdXG4gKiBAcGFyYW0ge051bWJlcn0gW21pbj0gMTAwMF1cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gc3BlZWRvbWV0ZXIoc2FtcGxlc0NvdW50LCBtaW4pIHtcbiAgc2FtcGxlc0NvdW50ID0gc2FtcGxlc0NvdW50IHx8IDEwO1xuICBjb25zdCBieXRlcyA9IG5ldyBBcnJheShzYW1wbGVzQ291bnQpO1xuICBjb25zdCB0aW1lc3RhbXBzID0gbmV3IEFycmF5KHNhbXBsZXNDb3VudCk7XG4gIGxldCBoZWFkID0gMDtcbiAgbGV0IHRhaWwgPSAwO1xuICBsZXQgZmlyc3RTYW1wbGVUUztcblxuICBtaW4gPSBtaW4gIT09IHVuZGVmaW5lZCA/IG1pbiA6IDEwMDA7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHB1c2goY2h1bmtMZW5ndGgpIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gdGltZXN0YW1wc1t0YWlsXTtcblxuICAgIGlmICghZmlyc3RTYW1wbGVUUykge1xuICAgICAgZmlyc3RTYW1wbGVUUyA9IG5vdztcbiAgICB9XG5cbiAgICBieXRlc1toZWFkXSA9IGNodW5rTGVuZ3RoO1xuICAgIHRpbWVzdGFtcHNbaGVhZF0gPSBub3c7XG5cbiAgICBsZXQgaSA9IHRhaWw7XG4gICAgbGV0IGJ5dGVzQ291bnQgPSAwO1xuXG4gICAgd2hpbGUgKGkgIT09IGhlYWQpIHtcbiAgICAgIGJ5dGVzQ291bnQgKz0gYnl0ZXNbaSsrXTtcbiAgICAgIGkgPSBpICUgc2FtcGxlc0NvdW50O1xuICAgIH1cblxuICAgIGhlYWQgPSAoaGVhZCArIDEpICUgc2FtcGxlc0NvdW50O1xuXG4gICAgaWYgKGhlYWQgPT09IHRhaWwpIHtcbiAgICAgIHRhaWwgPSAodGFpbCArIDEpICUgc2FtcGxlc0NvdW50O1xuICAgIH1cblxuICAgIGlmIChub3cgLSBmaXJzdFNhbXBsZVRTIDwgbWluKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFzc2VkID0gc3RhcnRlZEF0ICYmIG5vdyAtIHN0YXJ0ZWRBdDtcblxuICAgIHJldHVybiBwYXNzZWQgPyBNYXRoLnJvdW5kKGJ5dGVzQ291bnQgKiAxMDAwIC8gcGFzc2VkKSA6IHVuZGVmaW5lZDtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3BlZWRvbWV0ZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcbmltcG9ydCBzZXR0bGUgZnJvbSAnLi8uLi9jb3JlL3NldHRsZS5qcyc7XG5pbXBvcnQgY29va2llcyBmcm9tICcuLy4uL2hlbHBlcnMvY29va2llcy5qcyc7XG5pbXBvcnQgYnVpbGRVUkwgZnJvbSAnLi8uLi9oZWxwZXJzL2J1aWxkVVJMLmpzJztcbmltcG9ydCBidWlsZEZ1bGxQYXRoIGZyb20gJy4uL2NvcmUvYnVpbGRGdWxsUGF0aC5qcyc7XG5pbXBvcnQgaXNVUkxTYW1lT3JpZ2luIGZyb20gJy4vLi4vaGVscGVycy9pc1VSTFNhbWVPcmlnaW4uanMnO1xuaW1wb3J0IHRyYW5zaXRpb25hbERlZmF1bHRzIGZyb20gJy4uL2RlZmF1bHRzL3RyYW5zaXRpb25hbC5qcyc7XG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tICcuLi9jb3JlL0F4aW9zRXJyb3IuanMnO1xuaW1wb3J0IENhbmNlbGVkRXJyb3IgZnJvbSAnLi4vY2FuY2VsL0NhbmNlbGVkRXJyb3IuanMnO1xuaW1wb3J0IHBhcnNlUHJvdG9jb2wgZnJvbSAnLi4vaGVscGVycy9wYXJzZVByb3RvY29sLmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9wbGF0Zm9ybS9pbmRleC5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gJy4uL2NvcmUvQXhpb3NIZWFkZXJzLmpzJztcbmltcG9ydCBzcGVlZG9tZXRlciBmcm9tICcuLi9oZWxwZXJzL3NwZWVkb21ldGVyLmpzJztcblxuZnVuY3Rpb24gcHJvZ3Jlc3NFdmVudFJlZHVjZXIobGlzdGVuZXIsIGlzRG93bmxvYWRTdHJlYW0pIHtcbiAgbGV0IGJ5dGVzTm90aWZpZWQgPSAwO1xuICBjb25zdCBfc3BlZWRvbWV0ZXIgPSBzcGVlZG9tZXRlcig1MCwgMjUwKTtcblxuICByZXR1cm4gZSA9PiB7XG4gICAgY29uc3QgbG9hZGVkID0gZS5sb2FkZWQ7XG4gICAgY29uc3QgdG90YWwgPSBlLmxlbmd0aENvbXB1dGFibGUgPyBlLnRvdGFsIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHByb2dyZXNzQnl0ZXMgPSBsb2FkZWQgLSBieXRlc05vdGlmaWVkO1xuICAgIGNvbnN0IHJhdGUgPSBfc3BlZWRvbWV0ZXIocHJvZ3Jlc3NCeXRlcyk7XG4gICAgY29uc3QgaW5SYW5nZSA9IGxvYWRlZCA8PSB0b3RhbDtcblxuICAgIGJ5dGVzTm90aWZpZWQgPSBsb2FkZWQ7XG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgbG9hZGVkLFxuICAgICAgdG90YWwsXG4gICAgICBwcm9ncmVzczogdG90YWwgPyAobG9hZGVkIC8gdG90YWwpIDogdW5kZWZpbmVkLFxuICAgICAgYnl0ZXM6IHByb2dyZXNzQnl0ZXMsXG4gICAgICByYXRlOiByYXRlID8gcmF0ZSA6IHVuZGVmaW5lZCxcbiAgICAgIGVzdGltYXRlZDogcmF0ZSAmJiB0b3RhbCAmJiBpblJhbmdlID8gKHRvdGFsIC0gbG9hZGVkKSAvIHJhdGUgOiB1bmRlZmluZWQsXG4gICAgICBldmVudDogZVxuICAgIH07XG5cbiAgICBkYXRhW2lzRG93bmxvYWRTdHJlYW0gPyAnZG93bmxvYWQnIDogJ3VwbG9hZCddID0gdHJ1ZTtcblxuICAgIGxpc3RlbmVyKGRhdGEpO1xuICB9O1xufVxuXG5jb25zdCBpc1hIUkFkYXB0ZXJTdXBwb3J0ZWQgPSB0eXBlb2YgWE1MSHR0cFJlcXVlc3QgIT09ICd1bmRlZmluZWQnO1xuXG5leHBvcnQgZGVmYXVsdCBpc1hIUkFkYXB0ZXJTdXBwb3J0ZWQgJiYgZnVuY3Rpb24gKGNvbmZpZykge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gZGlzcGF0Y2hYaHJSZXF1ZXN0KHJlc29sdmUsIHJlamVjdCkge1xuICAgIGxldCByZXF1ZXN0RGF0YSA9IGNvbmZpZy5kYXRhO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20oY29uZmlnLmhlYWRlcnMpLm5vcm1hbGl6ZSgpO1xuICAgIGNvbnN0IHJlc3BvbnNlVHlwZSA9IGNvbmZpZy5yZXNwb25zZVR5cGU7XG4gICAgbGV0IG9uQ2FuY2VsZWQ7XG4gICAgZnVuY3Rpb24gZG9uZSgpIHtcbiAgICAgIGlmIChjb25maWcuY2FuY2VsVG9rZW4pIHtcbiAgICAgICAgY29uZmlnLmNhbmNlbFRva2VuLnVuc3Vic2NyaWJlKG9uQ2FuY2VsZWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLnNpZ25hbCkge1xuICAgICAgICBjb25maWcuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25DYW5jZWxlZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHV0aWxzLmlzRm9ybURhdGEocmVxdWVzdERhdGEpICYmIChwbGF0Zm9ybS5pc1N0YW5kYXJkQnJvd3NlckVudiB8fCBwbGF0Zm9ybS5pc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudikpIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJzLnNldENvbnRlbnRUeXBlKGZhbHNlKTsgLy8gTGV0IHRoZSBicm93c2VyIHNldCBpdFxuICAgIH1cblxuICAgIGxldCByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICAvLyBIVFRQIGJhc2ljIGF1dGhlbnRpY2F0aW9uXG4gICAgaWYgKGNvbmZpZy5hdXRoKSB7XG4gICAgICBjb25zdCB1c2VybmFtZSA9IGNvbmZpZy5hdXRoLnVzZXJuYW1lIHx8ICcnO1xuICAgICAgY29uc3QgcGFzc3dvcmQgPSBjb25maWcuYXV0aC5wYXNzd29yZCA/IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChjb25maWcuYXV0aC5wYXNzd29yZCkpIDogJyc7XG4gICAgICByZXF1ZXN0SGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmFzaWMgJyArIGJ0b2EodXNlcm5hbWUgKyAnOicgKyBwYXNzd29yZCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGZ1bGxQYXRoID0gYnVpbGRGdWxsUGF0aChjb25maWcuYmFzZVVSTCwgY29uZmlnLnVybCk7XG5cbiAgICByZXF1ZXN0Lm9wZW4oY29uZmlnLm1ldGhvZC50b1VwcGVyQ2FzZSgpLCBidWlsZFVSTChmdWxsUGF0aCwgY29uZmlnLnBhcmFtcywgY29uZmlnLnBhcmFtc1NlcmlhbGl6ZXIpLCB0cnVlKTtcblxuICAgIC8vIFNldCB0aGUgcmVxdWVzdCB0aW1lb3V0IGluIE1TXG4gICAgcmVxdWVzdC50aW1lb3V0ID0gY29uZmlnLnRpbWVvdXQ7XG5cbiAgICBmdW5jdGlvbiBvbmxvYWRlbmQoKSB7XG4gICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2VcbiAgICAgIGNvbnN0IHJlc3BvbnNlSGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKFxuICAgICAgICAnZ2V0QWxsUmVzcG9uc2VIZWFkZXJzJyBpbiByZXF1ZXN0ICYmIHJlcXVlc3QuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKClcbiAgICAgICk7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSAhcmVzcG9uc2VUeXBlIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ3RleHQnIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ2pzb24nID9cbiAgICAgICAgcmVxdWVzdC5yZXNwb25zZVRleHQgOiByZXF1ZXN0LnJlc3BvbnNlO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YSxcbiAgICAgICAgc3RhdHVzOiByZXF1ZXN0LnN0YXR1cyxcbiAgICAgICAgc3RhdHVzVGV4dDogcmVxdWVzdC5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiByZXNwb25zZUhlYWRlcnMsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgcmVxdWVzdFxuICAgICAgfTtcblxuICAgICAgc2V0dGxlKGZ1bmN0aW9uIF9yZXNvbHZlKHZhbHVlKSB7XG4gICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9LCBmdW5jdGlvbiBfcmVqZWN0KGVycikge1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSwgcmVzcG9uc2UpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoJ29ubG9hZGVuZCcgaW4gcmVxdWVzdCkge1xuICAgICAgLy8gVXNlIG9ubG9hZGVuZCBpZiBhdmFpbGFibGVcbiAgICAgIHJlcXVlc3Qub25sb2FkZW5kID0gb25sb2FkZW5kO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBMaXN0ZW4gZm9yIHJlYWR5IHN0YXRlIHRvIGVtdWxhdGUgb25sb2FkZW5kXG4gICAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUxvYWQoKSB7XG4gICAgICAgIGlmICghcmVxdWVzdCB8fCByZXF1ZXN0LnJlYWR5U3RhdGUgIT09IDQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgcmVxdWVzdCBlcnJvcmVkIG91dCBhbmQgd2UgZGlkbid0IGdldCBhIHJlc3BvbnNlLCB0aGlzIHdpbGwgYmVcbiAgICAgICAgLy8gaGFuZGxlZCBieSBvbmVycm9yIGluc3RlYWRcbiAgICAgICAgLy8gV2l0aCBvbmUgZXhjZXB0aW9uOiByZXF1ZXN0IHRoYXQgdXNpbmcgZmlsZTogcHJvdG9jb2wsIG1vc3QgYnJvd3NlcnNcbiAgICAgICAgLy8gd2lsbCByZXR1cm4gc3RhdHVzIGFzIDAgZXZlbiB0aG91Z2ggaXQncyBhIHN1Y2Nlc3NmdWwgcmVxdWVzdFxuICAgICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPT09IDAgJiYgIShyZXF1ZXN0LnJlc3BvbnNlVVJMICYmIHJlcXVlc3QucmVzcG9uc2VVUkwuaW5kZXhPZignZmlsZTonKSA9PT0gMCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVhZHlzdGF0ZSBoYW5kbGVyIGlzIGNhbGxpbmcgYmVmb3JlIG9uZXJyb3Igb3Igb250aW1lb3V0IGhhbmRsZXJzLFxuICAgICAgICAvLyBzbyB3ZSBzaG91bGQgY2FsbCBvbmxvYWRlbmQgb24gdGhlIG5leHQgJ3RpY2snXG4gICAgICAgIHNldFRpbWVvdXQob25sb2FkZW5kKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGJyb3dzZXIgcmVxdWVzdCBjYW5jZWxsYXRpb24gKGFzIG9wcG9zZWQgdG8gYSBtYW51YWwgY2FuY2VsbGF0aW9uKVxuICAgIHJlcXVlc3Qub25hYm9ydCA9IGZ1bmN0aW9uIGhhbmRsZUFib3J0KCkge1xuICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKCdSZXF1ZXN0IGFib3J0ZWQnLCBBeGlvc0Vycm9yLkVDT05OQUJPUlRFRCwgY29uZmlnLCByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgbG93IGxldmVsIG5ldHdvcmsgZXJyb3JzXG4gICAgcmVxdWVzdC5vbmVycm9yID0gZnVuY3Rpb24gaGFuZGxlRXJyb3IoKSB7XG4gICAgICAvLyBSZWFsIGVycm9ycyBhcmUgaGlkZGVuIGZyb20gdXMgYnkgdGhlIGJyb3dzZXJcbiAgICAgIC8vIG9uZXJyb3Igc2hvdWxkIG9ubHkgZmlyZSBpZiBpdCdzIGEgbmV0d29yayBlcnJvclxuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKCdOZXR3b3JrIEVycm9yJywgQXhpb3NFcnJvci5FUlJfTkVUV09SSywgY29uZmlnLCByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgdGltZW91dFxuICAgIHJlcXVlc3Qub250aW1lb3V0ID0gZnVuY3Rpb24gaGFuZGxlVGltZW91dCgpIHtcbiAgICAgIGxldCB0aW1lb3V0RXJyb3JNZXNzYWdlID0gY29uZmlnLnRpbWVvdXQgPyAndGltZW91dCBvZiAnICsgY29uZmlnLnRpbWVvdXQgKyAnbXMgZXhjZWVkZWQnIDogJ3RpbWVvdXQgZXhjZWVkZWQnO1xuICAgICAgY29uc3QgdHJhbnNpdGlvbmFsID0gY29uZmlnLnRyYW5zaXRpb25hbCB8fCB0cmFuc2l0aW9uYWxEZWZhdWx0cztcbiAgICAgIGlmIChjb25maWcudGltZW91dEVycm9yTWVzc2FnZSkge1xuICAgICAgICB0aW1lb3V0RXJyb3JNZXNzYWdlID0gY29uZmlnLnRpbWVvdXRFcnJvck1lc3NhZ2U7XG4gICAgICB9XG4gICAgICByZWplY3QobmV3IEF4aW9zRXJyb3IoXG4gICAgICAgIHRpbWVvdXRFcnJvck1lc3NhZ2UsXG4gICAgICAgIHRyYW5zaXRpb25hbC5jbGFyaWZ5VGltZW91dEVycm9yID8gQXhpb3NFcnJvci5FVElNRURPVVQgOiBBeGlvc0Vycm9yLkVDT05OQUJPUlRFRCxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBBZGQgeHNyZiBoZWFkZXJcbiAgICAvLyBUaGlzIGlzIG9ubHkgZG9uZSBpZiBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudC5cbiAgICAvLyBTcGVjaWZpY2FsbHkgbm90IGlmIHdlJ3JlIGluIGEgd2ViIHdvcmtlciwgb3IgcmVhY3QtbmF0aXZlLlxuICAgIGlmIChwbGF0Zm9ybS5pc1N0YW5kYXJkQnJvd3NlckVudikge1xuICAgICAgLy8gQWRkIHhzcmYgaGVhZGVyXG4gICAgICBjb25zdCB4c3JmVmFsdWUgPSAoY29uZmlnLndpdGhDcmVkZW50aWFscyB8fCBpc1VSTFNhbWVPcmlnaW4oZnVsbFBhdGgpKVxuICAgICAgICAmJiBjb25maWcueHNyZkNvb2tpZU5hbWUgJiYgY29va2llcy5yZWFkKGNvbmZpZy54c3JmQ29va2llTmFtZSk7XG5cbiAgICAgIGlmICh4c3JmVmFsdWUpIHtcbiAgICAgICAgcmVxdWVzdEhlYWRlcnMuc2V0KGNvbmZpZy54c3JmSGVhZGVyTmFtZSwgeHNyZlZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgQ29udGVudC1UeXBlIGlmIGRhdGEgaXMgdW5kZWZpbmVkXG4gICAgcmVxdWVzdERhdGEgPT09IHVuZGVmaW5lZCAmJiByZXF1ZXN0SGVhZGVycy5zZXRDb250ZW50VHlwZShudWxsKTtcblxuICAgIC8vIEFkZCBoZWFkZXJzIHRvIHRoZSByZXF1ZXN0XG4gICAgaWYgKCdzZXRSZXF1ZXN0SGVhZGVyJyBpbiByZXF1ZXN0KSB7XG4gICAgICB1dGlscy5mb3JFYWNoKHJlcXVlc3RIZWFkZXJzLnRvSlNPTigpLCBmdW5jdGlvbiBzZXRSZXF1ZXN0SGVhZGVyKHZhbCwga2V5KSB7XG4gICAgICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcihrZXksIHZhbCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgd2l0aENyZWRlbnRpYWxzIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChjb25maWcud2l0aENyZWRlbnRpYWxzKSkge1xuICAgICAgcmVxdWVzdC53aXRoQ3JlZGVudGlhbHMgPSAhIWNvbmZpZy53aXRoQ3JlZGVudGlhbHM7XG4gICAgfVxuXG4gICAgLy8gQWRkIHJlc3BvbnNlVHlwZSB0byByZXF1ZXN0IGlmIG5lZWRlZFxuICAgIGlmIChyZXNwb25zZVR5cGUgJiYgcmVzcG9uc2VUeXBlICE9PSAnanNvbicpIHtcbiAgICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gY29uZmlnLnJlc3BvbnNlVHlwZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcHJvZ3Jlc3MgaWYgbmVlZGVkXG4gICAgaWYgKHR5cGVvZiBjb25maWcub25Eb3dubG9hZFByb2dyZXNzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgcHJvZ3Jlc3NFdmVudFJlZHVjZXIoY29uZmlnLm9uRG93bmxvYWRQcm9ncmVzcywgdHJ1ZSkpO1xuICAgIH1cblxuICAgIC8vIE5vdCBhbGwgYnJvd3NlcnMgc3VwcG9ydCB1cGxvYWQgZXZlbnRzXG4gICAgaWYgKHR5cGVvZiBjb25maWcub25VcGxvYWRQcm9ncmVzcyA9PT0gJ2Z1bmN0aW9uJyAmJiByZXF1ZXN0LnVwbG9hZCkge1xuICAgICAgcmVxdWVzdC51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBwcm9ncmVzc0V2ZW50UmVkdWNlcihjb25maWcub25VcGxvYWRQcm9ncmVzcykpO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuY2FuY2VsVG9rZW4gfHwgY29uZmlnLnNpZ25hbCkge1xuICAgICAgLy8gSGFuZGxlIGNhbmNlbGxhdGlvblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgICAgIG9uQ2FuY2VsZWQgPSBjYW5jZWwgPT4ge1xuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KCFjYW5jZWwgfHwgY2FuY2VsLnR5cGUgPyBuZXcgQ2FuY2VsZWRFcnJvcihudWxsLCBjb25maWcsIHJlcXVlc3QpIDogY2FuY2VsKTtcbiAgICAgICAgcmVxdWVzdC5hYm9ydCgpO1xuICAgICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICAgIH07XG5cbiAgICAgIGNvbmZpZy5jYW5jZWxUb2tlbiAmJiBjb25maWcuY2FuY2VsVG9rZW4uc3Vic2NyaWJlKG9uQ2FuY2VsZWQpO1xuICAgICAgaWYgKGNvbmZpZy5zaWduYWwpIHtcbiAgICAgICAgY29uZmlnLnNpZ25hbC5hYm9ydGVkID8gb25DYW5jZWxlZCgpIDogY29uZmlnLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQ2FuY2VsZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHByb3RvY29sID0gcGFyc2VQcm90b2NvbChmdWxsUGF0aCk7XG5cbiAgICBpZiAocHJvdG9jb2wgJiYgcGxhdGZvcm0ucHJvdG9jb2xzLmluZGV4T2YocHJvdG9jb2wpID09PSAtMSkge1xuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKCdVbnN1cHBvcnRlZCBwcm90b2NvbCAnICsgcHJvdG9jb2wgKyAnOicsIEF4aW9zRXJyb3IuRVJSX0JBRF9SRVFVRVNULCBjb25maWcpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cblxuICAgIC8vIFNlbmQgdGhlIHJlcXVlc3RcbiAgICByZXF1ZXN0LnNlbmQocmVxdWVzdERhdGEgfHwgbnVsbCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcbmltcG9ydCBodHRwQWRhcHRlciBmcm9tICcuL2h0dHAuanMnO1xuaW1wb3J0IHhockFkYXB0ZXIgZnJvbSAnLi94aHIuanMnO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSBcIi4uL2NvcmUvQXhpb3NFcnJvci5qc1wiO1xuXG5jb25zdCBrbm93bkFkYXB0ZXJzID0ge1xuICBodHRwOiBodHRwQWRhcHRlcixcbiAgeGhyOiB4aHJBZGFwdGVyXG59XG5cbnV0aWxzLmZvckVhY2goa25vd25BZGFwdGVycywgKGZuLCB2YWx1ZSkgPT4ge1xuICBpZihmbikge1xuICAgIHRyeSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sICduYW1lJywge3ZhbHVlfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgJ2FkYXB0ZXJOYW1lJywge3ZhbHVlfSk7XG4gIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGdldEFkYXB0ZXI6IChhZGFwdGVycykgPT4ge1xuICAgIGFkYXB0ZXJzID0gdXRpbHMuaXNBcnJheShhZGFwdGVycykgPyBhZGFwdGVycyA6IFthZGFwdGVyc107XG5cbiAgICBjb25zdCB7bGVuZ3RofSA9IGFkYXB0ZXJzO1xuICAgIGxldCBuYW1lT3JBZGFwdGVyO1xuICAgIGxldCBhZGFwdGVyO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgbmFtZU9yQWRhcHRlciA9IGFkYXB0ZXJzW2ldO1xuICAgICAgaWYoKGFkYXB0ZXIgPSB1dGlscy5pc1N0cmluZyhuYW1lT3JBZGFwdGVyKSA/IGtub3duQWRhcHRlcnNbbmFtZU9yQWRhcHRlci50b0xvd2VyQ2FzZSgpXSA6IG5hbWVPckFkYXB0ZXIpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghYWRhcHRlcikge1xuICAgICAgaWYgKGFkYXB0ZXIgPT09IGZhbHNlKSB7XG4gICAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICAgIGBBZGFwdGVyICR7bmFtZU9yQWRhcHRlcn0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgZW52aXJvbm1lbnRgLFxuICAgICAgICAgICdFUlJfTk9UX1NVUFBPUlQnXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgdXRpbHMuaGFzT3duUHJvcChrbm93bkFkYXB0ZXJzLCBuYW1lT3JBZGFwdGVyKSA/XG4gICAgICAgICAgYEFkYXB0ZXIgJyR7bmFtZU9yQWRhcHRlcn0nIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJ1aWxkYCA6XG4gICAgICAgICAgYFVua25vd24gYWRhcHRlciAnJHtuYW1lT3JBZGFwdGVyfSdgXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghdXRpbHMuaXNGdW5jdGlvbihhZGFwdGVyKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYWRhcHRlciBpcyBub3QgYSBmdW5jdGlvbicpO1xuICAgIH1cblxuICAgIHJldHVybiBhZGFwdGVyO1xuICB9LFxuICBhZGFwdGVyczoga25vd25BZGFwdGVyc1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdHJhbnNmb3JtRGF0YSBmcm9tICcuL3RyYW5zZm9ybURhdGEuanMnO1xuaW1wb3J0IGlzQ2FuY2VsIGZyb20gJy4uL2NhbmNlbC9pc0NhbmNlbC5qcyc7XG5pbXBvcnQgZGVmYXVsdHMgZnJvbSAnLi4vZGVmYXVsdHMvaW5kZXguanMnO1xuaW1wb3J0IENhbmNlbGVkRXJyb3IgZnJvbSAnLi4vY2FuY2VsL0NhbmNlbGVkRXJyb3IuanMnO1xuaW1wb3J0IEF4aW9zSGVhZGVycyBmcm9tICcuLi9jb3JlL0F4aW9zSGVhZGVycy5qcyc7XG5pbXBvcnQgYWRhcHRlcnMgZnJvbSBcIi4uL2FkYXB0ZXJzL2FkYXB0ZXJzLmpzXCI7XG5cbi8qKlxuICogVGhyb3dzIGEgYENhbmNlbGVkRXJyb3JgIGlmIGNhbmNlbGxhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnIHRoYXQgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3RcbiAqXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpIHtcbiAgaWYgKGNvbmZpZy5jYW5jZWxUb2tlbikge1xuICAgIGNvbmZpZy5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCk7XG4gIH1cblxuICBpZiAoY29uZmlnLnNpZ25hbCAmJiBjb25maWcuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICB0aHJvdyBuZXcgQ2FuY2VsZWRFcnJvcihudWxsLCBjb25maWcpO1xuICB9XG59XG5cbi8qKlxuICogRGlzcGF0Y2ggYSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgYWRhcHRlci5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIFRoZSBjb25maWcgdGhhdCBpcyB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBUaGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGlzcGF0Y2hSZXF1ZXN0KGNvbmZpZykge1xuICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgY29uZmlnLmhlYWRlcnMgPSBBeGlvc0hlYWRlcnMuZnJvbShjb25maWcuaGVhZGVycyk7XG5cbiAgLy8gVHJhbnNmb3JtIHJlcXVlc3QgZGF0YVxuICBjb25maWcuZGF0YSA9IHRyYW5zZm9ybURhdGEuY2FsbChcbiAgICBjb25maWcsXG4gICAgY29uZmlnLnRyYW5zZm9ybVJlcXVlc3RcbiAgKTtcblxuICBpZiAoWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLmluZGV4T2YoY29uZmlnLm1ldGhvZCkgIT09IC0xKSB7XG4gICAgY29uZmlnLmhlYWRlcnMuc2V0Q29udGVudFR5cGUoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsIGZhbHNlKTtcbiAgfVxuXG4gIGNvbnN0IGFkYXB0ZXIgPSBhZGFwdGVycy5nZXRBZGFwdGVyKGNvbmZpZy5hZGFwdGVyIHx8IGRlZmF1bHRzLmFkYXB0ZXIpO1xuXG4gIHJldHVybiBhZGFwdGVyKGNvbmZpZykudGhlbihmdW5jdGlvbiBvbkFkYXB0ZXJSZXNvbHV0aW9uKHJlc3BvbnNlKSB7XG4gICAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gICAgLy8gVHJhbnNmb3JtIHJlc3BvbnNlIGRhdGFcbiAgICByZXNwb25zZS5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKFxuICAgICAgY29uZmlnLFxuICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlLFxuICAgICAgcmVzcG9uc2VcbiAgICApO1xuXG4gICAgcmVzcG9uc2UuaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKHJlc3BvbnNlLmhlYWRlcnMpO1xuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9LCBmdW5jdGlvbiBvbkFkYXB0ZXJSZWplY3Rpb24ocmVhc29uKSB7XG4gICAgaWYgKCFpc0NhbmNlbChyZWFzb24pKSB7XG4gICAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAgIC8vIFRyYW5zZm9ybSByZXNwb25zZSBkYXRhXG4gICAgICBpZiAocmVhc29uICYmIHJlYXNvbi5yZXNwb25zZSkge1xuICAgICAgICByZWFzb24ucmVzcG9uc2UuZGF0YSA9IHRyYW5zZm9ybURhdGEuY2FsbChcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlLFxuICAgICAgICAgIHJlYXNvbi5yZXNwb25zZVxuICAgICAgICApO1xuICAgICAgICByZWFzb24ucmVzcG9uc2UuaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKHJlYXNvbi5yZXNwb25zZS5oZWFkZXJzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVhc29uKTtcbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gXCIuL0F4aW9zSGVhZGVycy5qc1wiO1xuXG5jb25zdCBoZWFkZXJzVG9PYmplY3QgPSAodGhpbmcpID0+IHRoaW5nIGluc3RhbmNlb2YgQXhpb3NIZWFkZXJzID8gdGhpbmcudG9KU09OKCkgOiB0aGluZztcblxuLyoqXG4gKiBDb25maWctc3BlY2lmaWMgbWVyZ2UtZnVuY3Rpb24gd2hpY2ggY3JlYXRlcyBhIG5ldyBjb25maWctb2JqZWN0XG4gKiBieSBtZXJnaW5nIHR3byBjb25maWd1cmF0aW9uIG9iamVjdHMgdG9nZXRoZXIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZzFcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcyXG4gKlxuICogQHJldHVybnMge09iamVjdH0gTmV3IG9iamVjdCByZXN1bHRpbmcgZnJvbSBtZXJnaW5nIGNvbmZpZzIgdG8gY29uZmlnMVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXJnZUNvbmZpZyhjb25maWcxLCBjb25maWcyKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBjb25maWcyID0gY29uZmlnMiB8fCB7fTtcbiAgY29uc3QgY29uZmlnID0ge307XG5cbiAgZnVuY3Rpb24gZ2V0TWVyZ2VkVmFsdWUodGFyZ2V0LCBzb3VyY2UsIGNhc2VsZXNzKSB7XG4gICAgaWYgKHV0aWxzLmlzUGxhaW5PYmplY3QodGFyZ2V0KSAmJiB1dGlscy5pc1BsYWluT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiB1dGlscy5tZXJnZS5jYWxsKHtjYXNlbGVzc30sIHRhcmdldCwgc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKHV0aWxzLmlzUGxhaW5PYmplY3Qoc291cmNlKSkge1xuICAgICAgcmV0dXJuIHV0aWxzLm1lcmdlKHt9LCBzb3VyY2UpO1xuICAgIH0gZWxzZSBpZiAodXRpbHMuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gc291cmNlLnNsaWNlKCk7XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2U7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgZnVuY3Rpb24gbWVyZ2VEZWVwUHJvcGVydGllcyhhLCBiLCBjYXNlbGVzcykge1xuICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQoYikpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZShhLCBiLCBjYXNlbGVzcyk7XG4gICAgfSBlbHNlIGlmICghdXRpbHMuaXNVbmRlZmluZWQoYSkpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGEsIGNhc2VsZXNzKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgZnVuY3Rpb24gdmFsdWVGcm9tQ29uZmlnMihhLCBiKSB7XG4gICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChiKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYik7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIGZ1bmN0aW9uIGRlZmF1bHRUb0NvbmZpZzIoYSwgYikge1xuICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQoYikpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGIpO1xuICAgIH0gZWxzZSBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGEpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBhKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgZnVuY3Rpb24gbWVyZ2VEaXJlY3RLZXlzKGEsIGIsIHByb3ApIHtcbiAgICBpZiAocHJvcCBpbiBjb25maWcyKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUoYSwgYik7XG4gICAgfSBlbHNlIGlmIChwcm9wIGluIGNvbmZpZzEpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGEpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1lcmdlTWFwID0ge1xuICAgIHVybDogdmFsdWVGcm9tQ29uZmlnMixcbiAgICBtZXRob2Q6IHZhbHVlRnJvbUNvbmZpZzIsXG4gICAgZGF0YTogdmFsdWVGcm9tQ29uZmlnMixcbiAgICBiYXNlVVJMOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRyYW5zZm9ybVJlcXVlc3Q6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdHJhbnNmb3JtUmVzcG9uc2U6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgcGFyYW1zU2VyaWFsaXplcjogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0aW1lb3V0OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRpbWVvdXRNZXNzYWdlOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHdpdGhDcmVkZW50aWFsczogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBhZGFwdGVyOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHJlc3BvbnNlVHlwZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB4c3JmQ29va2llTmFtZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB4c3JmSGVhZGVyTmFtZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBvblVwbG9hZFByb2dyZXNzOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIG9uRG93bmxvYWRQcm9ncmVzczogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBkZWNvbXByZXNzOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIG1heENvbnRlbnRMZW5ndGg6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgbWF4Qm9keUxlbmd0aDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBiZWZvcmVSZWRpcmVjdDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0cmFuc3BvcnQ6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgaHR0cEFnZW50OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGh0dHBzQWdlbnQ6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgY2FuY2VsVG9rZW46IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgc29ja2V0UGF0aDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICByZXNwb25zZUVuY29kaW5nOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHZhbGlkYXRlU3RhdHVzOiBtZXJnZURpcmVjdEtleXMsXG4gICAgaGVhZGVyczogKGEsIGIpID0+IG1lcmdlRGVlcFByb3BlcnRpZXMoaGVhZGVyc1RvT2JqZWN0KGEpLCBoZWFkZXJzVG9PYmplY3QoYiksIHRydWUpXG4gIH07XG5cbiAgdXRpbHMuZm9yRWFjaChPYmplY3Qua2V5cyhjb25maWcxKS5jb25jYXQoT2JqZWN0LmtleXMoY29uZmlnMikpLCBmdW5jdGlvbiBjb21wdXRlQ29uZmlnVmFsdWUocHJvcCkge1xuICAgIGNvbnN0IG1lcmdlID0gbWVyZ2VNYXBbcHJvcF0gfHwgbWVyZ2VEZWVwUHJvcGVydGllcztcbiAgICBjb25zdCBjb25maWdWYWx1ZSA9IG1lcmdlKGNvbmZpZzFbcHJvcF0sIGNvbmZpZzJbcHJvcF0sIHByb3ApO1xuICAgICh1dGlscy5pc1VuZGVmaW5lZChjb25maWdWYWx1ZSkgJiYgbWVyZ2UgIT09IG1lcmdlRGlyZWN0S2V5cykgfHwgKGNvbmZpZ1twcm9wXSA9IGNvbmZpZ1ZhbHVlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGNvbmZpZztcbn1cbiIsImV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIxLjMuMlwiOyIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHtWRVJTSU9OfSBmcm9tICcuLi9lbnYvZGF0YS5qcyc7XG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tICcuLi9jb3JlL0F4aW9zRXJyb3IuanMnO1xuXG5jb25zdCB2YWxpZGF0b3JzID0ge307XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5bJ29iamVjdCcsICdib29sZWFuJywgJ251bWJlcicsICdmdW5jdGlvbicsICdzdHJpbmcnLCAnc3ltYm9sJ10uZm9yRWFjaCgodHlwZSwgaSkgPT4ge1xuICB2YWxpZGF0b3JzW3R5cGVdID0gZnVuY3Rpb24gdmFsaWRhdG9yKHRoaW5nKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGluZyA9PT0gdHlwZSB8fCAnYScgKyAoaSA8IDEgPyAnbiAnIDogJyAnKSArIHR5cGU7XG4gIH07XG59KTtcblxuY29uc3QgZGVwcmVjYXRlZFdhcm5pbmdzID0ge307XG5cbi8qKlxuICogVHJhbnNpdGlvbmFsIG9wdGlvbiB2YWxpZGF0b3JcbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufGJvb2xlYW4/fSB2YWxpZGF0b3IgLSBzZXQgdG8gZmFsc2UgaWYgdGhlIHRyYW5zaXRpb25hbCBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZFxuICogQHBhcmFtIHtzdHJpbmc/fSB2ZXJzaW9uIC0gZGVwcmVjYXRlZCB2ZXJzaW9uIC8gcmVtb3ZlZCBzaW5jZSB2ZXJzaW9uXG4gKiBAcGFyYW0ge3N0cmluZz99IG1lc3NhZ2UgLSBzb21lIG1lc3NhZ2Ugd2l0aCBhZGRpdGlvbmFsIGluZm9cbiAqXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259XG4gKi9cbnZhbGlkYXRvcnMudHJhbnNpdGlvbmFsID0gZnVuY3Rpb24gdHJhbnNpdGlvbmFsKHZhbGlkYXRvciwgdmVyc2lvbiwgbWVzc2FnZSkge1xuICBmdW5jdGlvbiBmb3JtYXRNZXNzYWdlKG9wdCwgZGVzYykge1xuICAgIHJldHVybiAnW0F4aW9zIHYnICsgVkVSU0lPTiArICddIFRyYW5zaXRpb25hbCBvcHRpb24gXFwnJyArIG9wdCArICdcXCcnICsgZGVzYyArIChtZXNzYWdlID8gJy4gJyArIG1lc3NhZ2UgOiAnJyk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICByZXR1cm4gKHZhbHVlLCBvcHQsIG9wdHMpID0+IHtcbiAgICBpZiAodmFsaWRhdG9yID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoXG4gICAgICAgIGZvcm1hdE1lc3NhZ2Uob3B0LCAnIGhhcyBiZWVuIHJlbW92ZWQnICsgKHZlcnNpb24gPyAnIGluICcgKyB2ZXJzaW9uIDogJycpKSxcbiAgICAgICAgQXhpb3NFcnJvci5FUlJfREVQUkVDQVRFRFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodmVyc2lvbiAmJiAhZGVwcmVjYXRlZFdhcm5pbmdzW29wdF0pIHtcbiAgICAgIGRlcHJlY2F0ZWRXYXJuaW5nc1tvcHRdID0gdHJ1ZTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGZvcm1hdE1lc3NhZ2UoXG4gICAgICAgICAgb3B0LFxuICAgICAgICAgICcgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSB2JyArIHZlcnNpb24gKyAnIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0b3IgPyB2YWxpZGF0b3IodmFsdWUsIG9wdCwgb3B0cykgOiB0cnVlO1xuICB9O1xufTtcblxuLyoqXG4gKiBBc3NlcnQgb2JqZWN0J3MgcHJvcGVydGllcyB0eXBlXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7b2JqZWN0fSBzY2hlbWFcbiAqIEBwYXJhbSB7Ym9vbGVhbj99IGFsbG93VW5rbm93blxuICpcbiAqIEByZXR1cm5zIHtvYmplY3R9XG4gKi9cblxuZnVuY3Rpb24gYXNzZXJ0T3B0aW9ucyhvcHRpb25zLCBzY2hlbWEsIGFsbG93VW5rbm93bikge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ29wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QnLCBBeGlvc0Vycm9yLkVSUl9CQURfT1BUSU9OX1ZBTFVFKTtcbiAgfVxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob3B0aW9ucyk7XG4gIGxldCBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgY29uc3Qgb3B0ID0ga2V5c1tpXTtcbiAgICBjb25zdCB2YWxpZGF0b3IgPSBzY2hlbWFbb3B0XTtcbiAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnNbb3B0XTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsaWRhdG9yKHZhbHVlLCBvcHQsIG9wdGlvbnMpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gdHJ1ZSkge1xuICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcignb3B0aW9uICcgKyBvcHQgKyAnIG11c3QgYmUgJyArIHJlc3VsdCwgQXhpb3NFcnJvci5FUlJfQkFEX09QVElPTl9WQUxVRSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGFsbG93VW5rbm93biAhPT0gdHJ1ZSkge1xuICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ1Vua25vd24gb3B0aW9uICcgKyBvcHQsIEF4aW9zRXJyb3IuRVJSX0JBRF9PUFRJT04pO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGFzc2VydE9wdGlvbnMsXG4gIHZhbGlkYXRvcnNcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcbmltcG9ydCBidWlsZFVSTCBmcm9tICcuLi9oZWxwZXJzL2J1aWxkVVJMLmpzJztcbmltcG9ydCBJbnRlcmNlcHRvck1hbmFnZXIgZnJvbSAnLi9JbnRlcmNlcHRvck1hbmFnZXIuanMnO1xuaW1wb3J0IGRpc3BhdGNoUmVxdWVzdCBmcm9tICcuL2Rpc3BhdGNoUmVxdWVzdC5qcyc7XG5pbXBvcnQgbWVyZ2VDb25maWcgZnJvbSAnLi9tZXJnZUNvbmZpZy5qcyc7XG5pbXBvcnQgYnVpbGRGdWxsUGF0aCBmcm9tICcuL2J1aWxkRnVsbFBhdGguanMnO1xuaW1wb3J0IHZhbGlkYXRvciBmcm9tICcuLi9oZWxwZXJzL3ZhbGlkYXRvci5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gJy4vQXhpb3NIZWFkZXJzLmpzJztcblxuY29uc3QgdmFsaWRhdG9ycyA9IHZhbGlkYXRvci52YWxpZGF0b3JzO1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZUNvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICpcbiAqIEByZXR1cm4ge0F4aW9zfSBBIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICovXG5jbGFzcyBBeGlvcyB7XG4gIGNvbnN0cnVjdG9yKGluc3RhbmNlQ29uZmlnKSB7XG4gICAgdGhpcy5kZWZhdWx0cyA9IGluc3RhbmNlQ29uZmlnO1xuICAgIHRoaXMuaW50ZXJjZXB0b3JzID0ge1xuICAgICAgcmVxdWVzdDogbmV3IEludGVyY2VwdG9yTWFuYWdlcigpLFxuICAgICAgcmVzcG9uc2U6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIoKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggYSByZXF1ZXN0XG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gY29uZmlnT3JVcmwgVGhlIGNvbmZpZyBzcGVjaWZpYyBmb3IgdGhpcyByZXF1ZXN0IChtZXJnZWQgd2l0aCB0aGlzLmRlZmF1bHRzKVxuICAgKiBAcGFyYW0gez9PYmplY3R9IGNvbmZpZ1xuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gVGhlIFByb21pc2UgdG8gYmUgZnVsZmlsbGVkXG4gICAqL1xuICByZXF1ZXN0KGNvbmZpZ09yVXJsLCBjb25maWcpIHtcbiAgICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgICAvLyBBbGxvdyBmb3IgYXhpb3MoJ2V4YW1wbGUvdXJsJ1ssIGNvbmZpZ10pIGEgbGEgZmV0Y2ggQVBJXG4gICAgaWYgKHR5cGVvZiBjb25maWdPclVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcbiAgICAgIGNvbmZpZy51cmwgPSBjb25maWdPclVybDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZmlnID0gY29uZmlnT3JVcmwgfHwge307XG4gICAgfVxuXG4gICAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcblxuICAgIGNvbnN0IHt0cmFuc2l0aW9uYWwsIHBhcmFtc1NlcmlhbGl6ZXIsIGhlYWRlcnN9ID0gY29uZmlnO1xuXG4gICAgaWYgKHRyYW5zaXRpb25hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YWxpZGF0b3IuYXNzZXJ0T3B0aW9ucyh0cmFuc2l0aW9uYWwsIHtcbiAgICAgICAgc2lsZW50SlNPTlBhcnNpbmc6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbiksXG4gICAgICAgIGZvcmNlZEpTT05QYXJzaW5nOiB2YWxpZGF0b3JzLnRyYW5zaXRpb25hbCh2YWxpZGF0b3JzLmJvb2xlYW4pLFxuICAgICAgICBjbGFyaWZ5VGltZW91dEVycm9yOiB2YWxpZGF0b3JzLnRyYW5zaXRpb25hbCh2YWxpZGF0b3JzLmJvb2xlYW4pXG4gICAgICB9LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtc1NlcmlhbGl6ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsaWRhdG9yLmFzc2VydE9wdGlvbnMocGFyYW1zU2VyaWFsaXplciwge1xuICAgICAgICBlbmNvZGU6IHZhbGlkYXRvcnMuZnVuY3Rpb24sXG4gICAgICAgIHNlcmlhbGl6ZTogdmFsaWRhdG9ycy5mdW5jdGlvblxuICAgICAgfSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGNvbmZpZy5tZXRob2RcbiAgICBjb25maWcubWV0aG9kID0gKGNvbmZpZy5tZXRob2QgfHwgdGhpcy5kZWZhdWx0cy5tZXRob2QgfHwgJ2dldCcpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBsZXQgY29udGV4dEhlYWRlcnM7XG5cbiAgICAvLyBGbGF0dGVuIGhlYWRlcnNcbiAgICBjb250ZXh0SGVhZGVycyA9IGhlYWRlcnMgJiYgdXRpbHMubWVyZ2UoXG4gICAgICBoZWFkZXJzLmNvbW1vbixcbiAgICAgIGhlYWRlcnNbY29uZmlnLm1ldGhvZF1cbiAgICApO1xuXG4gICAgY29udGV4dEhlYWRlcnMgJiYgdXRpbHMuZm9yRWFjaChcbiAgICAgIFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJywgJ2NvbW1vbiddLFxuICAgICAgKG1ldGhvZCkgPT4ge1xuICAgICAgICBkZWxldGUgaGVhZGVyc1ttZXRob2RdO1xuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25maWcuaGVhZGVycyA9IEF4aW9zSGVhZGVycy5jb25jYXQoY29udGV4dEhlYWRlcnMsIGhlYWRlcnMpO1xuXG4gICAgLy8gZmlsdGVyIG91dCBza2lwcGVkIGludGVyY2VwdG9yc1xuICAgIGNvbnN0IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluID0gW107XG4gICAgbGV0IHN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycyA9IHRydWU7XG4gICAgdGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uIHVuc2hpZnRSZXF1ZXN0SW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgICBpZiAodHlwZW9mIGludGVyY2VwdG9yLnJ1bldoZW4gPT09ICdmdW5jdGlvbicgJiYgaW50ZXJjZXB0b3IucnVuV2hlbihjb25maWcpID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycyA9IHN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycyAmJiBpbnRlcmNlcHRvci5zeW5jaHJvbm91cztcblxuICAgICAgcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4udW5zaGlmdChpbnRlcmNlcHRvci5mdWxmaWxsZWQsIGludGVyY2VwdG9yLnJlamVjdGVkKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbiA9IFtdO1xuICAgIHRoaXMuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLmZvckVhY2goZnVuY3Rpb24gcHVzaFJlc3BvbnNlSW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgICByZXNwb25zZUludGVyY2VwdG9yQ2hhaW4ucHVzaChpbnRlcmNlcHRvci5mdWxmaWxsZWQsIGludGVyY2VwdG9yLnJlamVjdGVkKTtcbiAgICB9KTtcblxuICAgIGxldCBwcm9taXNlO1xuICAgIGxldCBpID0gMDtcbiAgICBsZXQgbGVuO1xuXG4gICAgaWYgKCFzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMpIHtcbiAgICAgIGNvbnN0IGNoYWluID0gW2Rpc3BhdGNoUmVxdWVzdC5iaW5kKHRoaXMpLCB1bmRlZmluZWRdO1xuICAgICAgY2hhaW4udW5zaGlmdC5hcHBseShjaGFpbiwgcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4pO1xuICAgICAgY2hhaW4ucHVzaC5hcHBseShjaGFpbiwgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluKTtcbiAgICAgIGxlbiA9IGNoYWluLmxlbmd0aDtcblxuICAgICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShjb25maWcpO1xuXG4gICAgICB3aGlsZSAoaSA8IGxlbikge1xuICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKGNoYWluW2krK10sIGNoYWluW2krK10pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG5cbiAgICBsZW4gPSByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbi5sZW5ndGg7XG5cbiAgICBsZXQgbmV3Q29uZmlnID0gY29uZmlnO1xuXG4gICAgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IGxlbikge1xuICAgICAgY29uc3Qgb25GdWxmaWxsZWQgPSByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbltpKytdO1xuICAgICAgY29uc3Qgb25SZWplY3RlZCA9IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluW2krK107XG4gICAgICB0cnkge1xuICAgICAgICBuZXdDb25maWcgPSBvbkZ1bGZpbGxlZChuZXdDb25maWcpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgb25SZWplY3RlZC5jYWxsKHRoaXMsIGVycm9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHByb21pc2UgPSBkaXNwYXRjaFJlcXVlc3QuY2FsbCh0aGlzLCBuZXdDb25maWcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgIH1cblxuICAgIGkgPSAwO1xuICAgIGxlbiA9IHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbi5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaSA8IGxlbikge1xuICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihyZXNwb25zZUludGVyY2VwdG9yQ2hhaW5baSsrXSwgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluW2krK10pO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgZ2V0VXJpKGNvbmZpZykge1xuICAgIGNvbmZpZyA9IG1lcmdlQ29uZmlnKHRoaXMuZGVmYXVsdHMsIGNvbmZpZyk7XG4gICAgY29uc3QgZnVsbFBhdGggPSBidWlsZEZ1bGxQYXRoKGNvbmZpZy5iYXNlVVJMLCBjb25maWcudXJsKTtcbiAgICByZXR1cm4gYnVpbGRVUkwoZnVsbFBhdGgsIGNvbmZpZy5wYXJhbXMsIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyKTtcbiAgfVxufVxuXG4vLyBQcm92aWRlIGFsaWFzZXMgZm9yIHN1cHBvcnRlZCByZXF1ZXN0IG1ldGhvZHNcbnV0aWxzLmZvckVhY2goWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAnb3B0aW9ucyddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kTm9EYXRhKG1ldGhvZCkge1xuICAvKmVzbGludCBmdW5jLW5hbWVzOjAqL1xuICBBeGlvcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKHVybCwgY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChtZXJnZUNvbmZpZyhjb25maWcgfHwge30sIHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIGRhdGE6IChjb25maWcgfHwge30pLmRhdGFcbiAgICB9KSk7XG4gIH07XG59KTtcblxudXRpbHMuZm9yRWFjaChbJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2RXaXRoRGF0YShtZXRob2QpIHtcbiAgLyplc2xpbnQgZnVuYy1uYW1lczowKi9cblxuICBmdW5jdGlvbiBnZW5lcmF0ZUhUVFBNZXRob2QoaXNGb3JtKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGh0dHBNZXRob2QodXJsLCBkYXRhLCBjb25maWcpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QobWVyZ2VDb25maWcoY29uZmlnIHx8IHt9LCB7XG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgaGVhZGVyczogaXNGb3JtID8ge1xuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnbXVsdGlwYXJ0L2Zvcm0tZGF0YSdcbiAgICAgICAgfSA6IHt9LFxuICAgICAgICB1cmwsXG4gICAgICAgIGRhdGFcbiAgICAgIH0pKTtcbiAgICB9O1xuICB9XG5cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBnZW5lcmF0ZUhUVFBNZXRob2QoKTtcblxuICBBeGlvcy5wcm90b3R5cGVbbWV0aG9kICsgJ0Zvcm0nXSA9IGdlbmVyYXRlSFRUUE1ldGhvZCh0cnVlKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBBeGlvcztcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IENhbmNlbGVkRXJyb3IgZnJvbSAnLi9DYW5jZWxlZEVycm9yLmpzJztcblxuLyoqXG4gKiBBIGBDYW5jZWxUb2tlbmAgaXMgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVxdWVzdCBjYW5jZWxsYXRpb24gb2YgYW4gb3BlcmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGV4ZWN1dG9yIFRoZSBleGVjdXRvciBmdW5jdGlvbi5cbiAqXG4gKiBAcmV0dXJucyB7Q2FuY2VsVG9rZW59XG4gKi9cbmNsYXNzIENhbmNlbFRva2VuIHtcbiAgY29uc3RydWN0b3IoZXhlY3V0b3IpIHtcbiAgICBpZiAodHlwZW9mIGV4ZWN1dG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdleGVjdXRvciBtdXN0IGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgbGV0IHJlc29sdmVQcm9taXNlO1xuXG4gICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gcHJvbWlzZUV4ZWN1dG9yKHJlc29sdmUpIHtcbiAgICAgIHJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHRva2VuID0gdGhpcztcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gICAgdGhpcy5wcm9taXNlLnRoZW4oY2FuY2VsID0+IHtcbiAgICAgIGlmICghdG9rZW4uX2xpc3RlbmVycykgcmV0dXJuO1xuXG4gICAgICBsZXQgaSA9IHRva2VuLl9saXN0ZW5lcnMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoaS0tID4gMCkge1xuICAgICAgICB0b2tlbi5fbGlzdGVuZXJzW2ldKGNhbmNlbCk7XG4gICAgICB9XG4gICAgICB0b2tlbi5fbGlzdGVuZXJzID0gbnVsbDtcbiAgICB9KTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gICAgdGhpcy5wcm9taXNlLnRoZW4gPSBvbmZ1bGZpbGxlZCA9PiB7XG4gICAgICBsZXQgX3Jlc29sdmU7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICB0b2tlbi5zdWJzY3JpYmUocmVzb2x2ZSk7XG4gICAgICAgIF9yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgIH0pLnRoZW4ob25mdWxmaWxsZWQpO1xuXG4gICAgICBwcm9taXNlLmNhbmNlbCA9IGZ1bmN0aW9uIHJlamVjdCgpIHtcbiAgICAgICAgdG9rZW4udW5zdWJzY3JpYmUoX3Jlc29sdmUpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfTtcblxuICAgIGV4ZWN1dG9yKGZ1bmN0aW9uIGNhbmNlbChtZXNzYWdlLCBjb25maWcsIHJlcXVlc3QpIHtcbiAgICAgIGlmICh0b2tlbi5yZWFzb24pIHtcbiAgICAgICAgLy8gQ2FuY2VsbGF0aW9uIGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdG9rZW4ucmVhc29uID0gbmV3IENhbmNlbGVkRXJyb3IobWVzc2FnZSwgY29uZmlnLCByZXF1ZXN0KTtcbiAgICAgIHJlc29sdmVQcm9taXNlKHRva2VuLnJlYXNvbik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGEgYENhbmNlbGVkRXJyb3JgIGlmIGNhbmNlbGxhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuXG4gICAqL1xuICB0aHJvd0lmUmVxdWVzdGVkKCkge1xuICAgIGlmICh0aGlzLnJlYXNvbikge1xuICAgICAgdGhyb3cgdGhpcy5yZWFzb247XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byB0aGUgY2FuY2VsIHNpZ25hbFxuICAgKi9cblxuICBzdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICBpZiAodGhpcy5yZWFzb24pIHtcbiAgICAgIGxpc3RlbmVyKHRoaXMucmVhc29uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVycyA9IFtsaXN0ZW5lcl07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVuc3Vic2NyaWJlIGZyb20gdGhlIGNhbmNlbCBzaWduYWxcbiAgICovXG5cbiAgdW5zdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICBpZiAoIXRoaXMuX2xpc3RlbmVycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX2xpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBjb250YWlucyBhIG5ldyBgQ2FuY2VsVG9rZW5gIGFuZCBhIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLFxuICAgKiBjYW5jZWxzIHRoZSBgQ2FuY2VsVG9rZW5gLlxuICAgKi9cbiAgc3RhdGljIHNvdXJjZSgpIHtcbiAgICBsZXQgY2FuY2VsO1xuICAgIGNvbnN0IHRva2VuID0gbmV3IENhbmNlbFRva2VuKGZ1bmN0aW9uIGV4ZWN1dG9yKGMpIHtcbiAgICAgIGNhbmNlbCA9IGM7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRva2VuLFxuICAgICAgY2FuY2VsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDYW5jZWxUb2tlbjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTeW50YWN0aWMgc3VnYXIgZm9yIGludm9raW5nIGEgZnVuY3Rpb24gYW5kIGV4cGFuZGluZyBhbiBhcnJheSBmb3IgYXJndW1lbnRzLlxuICpcbiAqIENvbW1vbiB1c2UgY2FzZSB3b3VsZCBiZSB0byB1c2UgYEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseWAuXG4gKlxuICogIGBgYGpzXG4gKiAgZnVuY3Rpb24gZih4LCB5LCB6KSB7fVxuICogIHZhciBhcmdzID0gWzEsIDIsIDNdO1xuICogIGYuYXBwbHkobnVsbCwgYXJncyk7XG4gKiAgYGBgXG4gKlxuICogV2l0aCBgc3ByZWFkYCB0aGlzIGV4YW1wbGUgY2FuIGJlIHJlLXdyaXR0ZW4uXG4gKlxuICogIGBgYGpzXG4gKiAgc3ByZWFkKGZ1bmN0aW9uKHgsIHksIHopIHt9KShbMSwgMiwgM10pO1xuICogIGBgYFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKlxuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzcHJlYWQoY2FsbGJhY2spIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoYXJyKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFycik7XG4gIH07XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBheWxvYWQgaXMgYW4gZXJyb3IgdGhyb3duIGJ5IEF4aW9zXG4gKlxuICogQHBhcmFtIHsqfSBwYXlsb2FkIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHBheWxvYWQgaXMgYW4gZXJyb3IgdGhyb3duIGJ5IEF4aW9zLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNBeGlvc0Vycm9yKHBheWxvYWQpIHtcbiAgcmV0dXJuIHV0aWxzLmlzT2JqZWN0KHBheWxvYWQpICYmIChwYXlsb2FkLmlzQXhpb3NFcnJvciA9PT0gdHJ1ZSk7XG59XG4iLCJjb25zdCBIdHRwU3RhdHVzQ29kZSA9IHtcbiAgQ29udGludWU6IDEwMCxcbiAgU3dpdGNoaW5nUHJvdG9jb2xzOiAxMDEsXG4gIFByb2Nlc3Npbmc6IDEwMixcbiAgRWFybHlIaW50czogMTAzLFxuICBPazogMjAwLFxuICBDcmVhdGVkOiAyMDEsXG4gIEFjY2VwdGVkOiAyMDIsXG4gIE5vbkF1dGhvcml0YXRpdmVJbmZvcm1hdGlvbjogMjAzLFxuICBOb0NvbnRlbnQ6IDIwNCxcbiAgUmVzZXRDb250ZW50OiAyMDUsXG4gIFBhcnRpYWxDb250ZW50OiAyMDYsXG4gIE11bHRpU3RhdHVzOiAyMDcsXG4gIEFscmVhZHlSZXBvcnRlZDogMjA4LFxuICBJbVVzZWQ6IDIyNixcbiAgTXVsdGlwbGVDaG9pY2VzOiAzMDAsXG4gIE1vdmVkUGVybWFuZW50bHk6IDMwMSxcbiAgRm91bmQ6IDMwMixcbiAgU2VlT3RoZXI6IDMwMyxcbiAgTm90TW9kaWZpZWQ6IDMwNCxcbiAgVXNlUHJveHk6IDMwNSxcbiAgVW51c2VkOiAzMDYsXG4gIFRlbXBvcmFyeVJlZGlyZWN0OiAzMDcsXG4gIFBlcm1hbmVudFJlZGlyZWN0OiAzMDgsXG4gIEJhZFJlcXVlc3Q6IDQwMCxcbiAgVW5hdXRob3JpemVkOiA0MDEsXG4gIFBheW1lbnRSZXF1aXJlZDogNDAyLFxuICBGb3JiaWRkZW46IDQwMyxcbiAgTm90Rm91bmQ6IDQwNCxcbiAgTWV0aG9kTm90QWxsb3dlZDogNDA1LFxuICBOb3RBY2NlcHRhYmxlOiA0MDYsXG4gIFByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZDogNDA3LFxuICBSZXF1ZXN0VGltZW91dDogNDA4LFxuICBDb25mbGljdDogNDA5LFxuICBHb25lOiA0MTAsXG4gIExlbmd0aFJlcXVpcmVkOiA0MTEsXG4gIFByZWNvbmRpdGlvbkZhaWxlZDogNDEyLFxuICBQYXlsb2FkVG9vTGFyZ2U6IDQxMyxcbiAgVXJpVG9vTG9uZzogNDE0LFxuICBVbnN1cHBvcnRlZE1lZGlhVHlwZTogNDE1LFxuICBSYW5nZU5vdFNhdGlzZmlhYmxlOiA0MTYsXG4gIEV4cGVjdGF0aW9uRmFpbGVkOiA0MTcsXG4gIEltQVRlYXBvdDogNDE4LFxuICBNaXNkaXJlY3RlZFJlcXVlc3Q6IDQyMSxcbiAgVW5wcm9jZXNzYWJsZUVudGl0eTogNDIyLFxuICBMb2NrZWQ6IDQyMyxcbiAgRmFpbGVkRGVwZW5kZW5jeTogNDI0LFxuICBUb29FYXJseTogNDI1LFxuICBVcGdyYWRlUmVxdWlyZWQ6IDQyNixcbiAgUHJlY29uZGl0aW9uUmVxdWlyZWQ6IDQyOCxcbiAgVG9vTWFueVJlcXVlc3RzOiA0MjksXG4gIFJlcXVlc3RIZWFkZXJGaWVsZHNUb29MYXJnZTogNDMxLFxuICBVbmF2YWlsYWJsZUZvckxlZ2FsUmVhc29uczogNDUxLFxuICBJbnRlcm5hbFNlcnZlckVycm9yOiA1MDAsXG4gIE5vdEltcGxlbWVudGVkOiA1MDEsXG4gIEJhZEdhdGV3YXk6IDUwMixcbiAgU2VydmljZVVuYXZhaWxhYmxlOiA1MDMsXG4gIEdhdGV3YXlUaW1lb3V0OiA1MDQsXG4gIEh0dHBWZXJzaW9uTm90U3VwcG9ydGVkOiA1MDUsXG4gIFZhcmlhbnRBbHNvTmVnb3RpYXRlczogNTA2LFxuICBJbnN1ZmZpY2llbnRTdG9yYWdlOiA1MDcsXG4gIExvb3BEZXRlY3RlZDogNTA4LFxuICBOb3RFeHRlbmRlZDogNTEwLFxuICBOZXR3b3JrQXV0aGVudGljYXRpb25SZXF1aXJlZDogNTExLFxufTtcblxuT2JqZWN0LmVudHJpZXMoSHR0cFN0YXR1c0NvZGUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICBIdHRwU3RhdHVzQ29kZVt2YWx1ZV0gPSBrZXk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgSHR0cFN0YXR1c0NvZGU7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCBiaW5kIGZyb20gJy4vaGVscGVycy9iaW5kLmpzJztcbmltcG9ydCBBeGlvcyBmcm9tICcuL2NvcmUvQXhpb3MuanMnO1xuaW1wb3J0IG1lcmdlQ29uZmlnIGZyb20gJy4vY29yZS9tZXJnZUNvbmZpZy5qcyc7XG5pbXBvcnQgZGVmYXVsdHMgZnJvbSAnLi9kZWZhdWx0cy9pbmRleC5qcyc7XG5pbXBvcnQgZm9ybURhdGFUb0pTT04gZnJvbSAnLi9oZWxwZXJzL2Zvcm1EYXRhVG9KU09OLmpzJztcbmltcG9ydCBDYW5jZWxlZEVycm9yIGZyb20gJy4vY2FuY2VsL0NhbmNlbGVkRXJyb3IuanMnO1xuaW1wb3J0IENhbmNlbFRva2VuIGZyb20gJy4vY2FuY2VsL0NhbmNlbFRva2VuLmpzJztcbmltcG9ydCBpc0NhbmNlbCBmcm9tICcuL2NhbmNlbC9pc0NhbmNlbC5qcyc7XG5pbXBvcnQge1ZFUlNJT059IGZyb20gJy4vZW52L2RhdGEuanMnO1xuaW1wb3J0IHRvRm9ybURhdGEgZnJvbSAnLi9oZWxwZXJzL3RvRm9ybURhdGEuanMnO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSAnLi9jb3JlL0F4aW9zRXJyb3IuanMnO1xuaW1wb3J0IHNwcmVhZCBmcm9tICcuL2hlbHBlcnMvc3ByZWFkLmpzJztcbmltcG9ydCBpc0F4aW9zRXJyb3IgZnJvbSAnLi9oZWxwZXJzL2lzQXhpb3NFcnJvci5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gXCIuL2NvcmUvQXhpb3NIZWFkZXJzLmpzXCI7XG5pbXBvcnQgSHR0cFN0YXR1c0NvZGUgZnJvbSAnLi9oZWxwZXJzL0h0dHBTdGF0dXNDb2RlLmpzJztcblxuLyoqXG4gKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgQXhpb3NcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdENvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICpcbiAqIEByZXR1cm5zIHtBeGlvc30gQSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UoZGVmYXVsdENvbmZpZykge1xuICBjb25zdCBjb250ZXh0ID0gbmV3IEF4aW9zKGRlZmF1bHRDb25maWcpO1xuICBjb25zdCBpbnN0YW5jZSA9IGJpbmQoQXhpb3MucHJvdG90eXBlLnJlcXVlc3QsIGNvbnRleHQpO1xuXG4gIC8vIENvcHkgYXhpb3MucHJvdG90eXBlIHRvIGluc3RhbmNlXG4gIHV0aWxzLmV4dGVuZChpbnN0YW5jZSwgQXhpb3MucHJvdG90eXBlLCBjb250ZXh0LCB7YWxsT3duS2V5czogdHJ1ZX0pO1xuXG4gIC8vIENvcHkgY29udGV4dCB0byBpbnN0YW5jZVxuICB1dGlscy5leHRlbmQoaW5zdGFuY2UsIGNvbnRleHQsIG51bGwsIHthbGxPd25LZXlzOiB0cnVlfSk7XG5cbiAgLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgbmV3IGluc3RhbmNlc1xuICBpbnN0YW5jZS5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaW5zdGFuY2VDb25maWcpIHtcbiAgICByZXR1cm4gY3JlYXRlSW5zdGFuY2UobWVyZ2VDb25maWcoZGVmYXVsdENvbmZpZywgaW5zdGFuY2VDb25maWcpKTtcbiAgfTtcblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbi8vIENyZWF0ZSB0aGUgZGVmYXVsdCBpbnN0YW5jZSB0byBiZSBleHBvcnRlZFxuY29uc3QgYXhpb3MgPSBjcmVhdGVJbnN0YW5jZShkZWZhdWx0cyk7XG5cbi8vIEV4cG9zZSBBeGlvcyBjbGFzcyB0byBhbGxvdyBjbGFzcyBpbmhlcml0YW5jZVxuYXhpb3MuQXhpb3MgPSBBeGlvcztcblxuLy8gRXhwb3NlIENhbmNlbCAmIENhbmNlbFRva2VuXG5heGlvcy5DYW5jZWxlZEVycm9yID0gQ2FuY2VsZWRFcnJvcjtcbmF4aW9zLkNhbmNlbFRva2VuID0gQ2FuY2VsVG9rZW47XG5heGlvcy5pc0NhbmNlbCA9IGlzQ2FuY2VsO1xuYXhpb3MuVkVSU0lPTiA9IFZFUlNJT047XG5heGlvcy50b0Zvcm1EYXRhID0gdG9Gb3JtRGF0YTtcblxuLy8gRXhwb3NlIEF4aW9zRXJyb3IgY2xhc3NcbmF4aW9zLkF4aW9zRXJyb3IgPSBBeGlvc0Vycm9yO1xuXG4vLyBhbGlhcyBmb3IgQ2FuY2VsZWRFcnJvciBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuYXhpb3MuQ2FuY2VsID0gYXhpb3MuQ2FuY2VsZWRFcnJvcjtcblxuLy8gRXhwb3NlIGFsbC9zcHJlYWRcbmF4aW9zLmFsbCA9IGZ1bmN0aW9uIGFsbChwcm9taXNlcykge1xuICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xufTtcblxuYXhpb3Muc3ByZWFkID0gc3ByZWFkO1xuXG4vLyBFeHBvc2UgaXNBeGlvc0Vycm9yXG5heGlvcy5pc0F4aW9zRXJyb3IgPSBpc0F4aW9zRXJyb3I7XG5cbi8vIEV4cG9zZSBtZXJnZUNvbmZpZ1xuYXhpb3MubWVyZ2VDb25maWcgPSBtZXJnZUNvbmZpZztcblxuYXhpb3MuQXhpb3NIZWFkZXJzID0gQXhpb3NIZWFkZXJzO1xuXG5heGlvcy5mb3JtVG9KU09OID0gdGhpbmcgPT4gZm9ybURhdGFUb0pTT04odXRpbHMuaXNIVE1MRm9ybSh0aGluZykgPyBuZXcgRm9ybURhdGEodGhpbmcpIDogdGhpbmcpO1xuXG5heGlvcy5IdHRwU3RhdHVzQ29kZSA9IEh0dHBTdGF0dXNDb2RlO1xuXG5heGlvcy5kZWZhdWx0ID0gYXhpb3M7XG5cbi8vIHRoaXMgbW9kdWxlIHNob3VsZCBvbmx5IGhhdmUgYSBkZWZhdWx0IGV4cG9ydFxuZXhwb3J0IGRlZmF1bHQgYXhpb3NcbiIsImltcG9ydCBheGlvcyBmcm9tIFwiYXhpb3NcIlxyXG5heGlvcy5kZWZhdWx0cy53aXRoQ3JlZGVudGlhbHMgPSB0cnVlO1xyXG5sZXQgY29uZmlnID0ge1xyXG5cclxufVxyXG5jb25zdCByZXF1ZXN0ID0gKHR5cGUsIHVybCwgcGFyYW1zKSA9PiB7XHJcbiAgY29uZmlnID0ge1xyXG4gICAgdHlwZSxcclxuICAgIHVybFxyXG4gIH1cclxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgcmV0dXJuIGF4aW9zKGNvbmZpZykudGhlbihyZXMgPT4ge1xyXG4gICAgICByZXNvbHZlKHJlcy5kYXRhKVxyXG4gICAgICByZXR1cm5cclxuICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgIHJlamVjdChlcnIuZGF0YSlcclxuICAgICAgcmV0dXJuXHJcbiAgICB9KVxyXG4gIH0pXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHJlcXVlc3QgXHJcblxyXG4iLCJpbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBCdXR0b24sIExpc3QsIERyYXdlciwgQXZhdGFyLCBQYWdpbmF0aW9uLCBJbnB1dCwgVGFicyAgfSBmcm9tICdhbnRkJztcclxuaW1wb3J0IHsgR01fY29va2llLCB1bnNhZmVXaW5kb3csIG1vbmtleVdpbmRvdywgR01fYWRkRWxlbWVudCwgR01fZ2V0VmFsdWUsIEdNX3NldFZhbHVlLCBHTV9zZXRDbGlwYm9hcmQgfSBmcm9tICckJztcclxuaW1wb3J0IEZvcm1SZW5kZXIsIHsgdXNlRm9ybSB9IGZyb20gJ2Zvcm0tcmVuZGVyJztcclxuaW1wb3J0IHNjaGVtYSBmcm9tICcuL3NjaGVtYS9zdGFyUGFnZUhyZWYnO1xyXG5pbXBvcnQgJ2FudGQvZGlzdC9hbnRkLmNzcyc7XHJcbmltcG9ydCAnLi9BcHAuY3NzJ1xyXG5pbXBvcnQgcmVxdWVzdCBmcm9tICcuL2FwaS9yZXF1ZXN0JztcclxuXHJcbmNvbnN0IHsgVGV4dEFyZWEgfSA9IElucHV0O1xyXG5cclxuY29uc3QgSnVtcEJ1dHRvbiA9IChwcm9wcykgPT4ge1xyXG4gIGNvbnN0IHsgaHJlZlVybCwgYWRkb25zIH0gPSBwcm9wc1xyXG4gIHJldHVybiAoXHJcbiAgICA8QnV0dG9uIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coYWRkb25zWydkYXRhSW5kZXgnXVswXSlcclxuICAgICAgY29uc29sZS5sb2coaHJlZlVybFthZGRvbnNbJ2RhdGFJbmRleCddWzBdXS5pbnB1dDIpXHJcbiAgICAgIHdpbmRvdy5vcGVuKGhyZWZVcmxbYWRkb25zWydkYXRhSW5kZXgnXVswXV0uaW5wdXQyKVxyXG4gICAgfX0+6Lez6L2sPC9CdXR0b24+XHJcbiAgKVxyXG59XHJcblxyXG5mdW5jdGlvbiBBcHAoKSB7XHJcbiAgY29uc3QgW29wZW4sIHNldE9wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtqdW1wUGFnZUhyZWYsIHNldEp1bXBQYWdlSHJlZl0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgLy8g5Ymq5YiH5p2/5YaF5a65XHJcbiAgY29uc3QgW2NsaXBib2FyZENvbnRlbnQsIHNldENsaXBib2FyZENvbnRlbnRdID0gdXNlU3RhdGUoW10pO1xyXG4gIGNvbnN0IGZvcm0gPSB1c2VGb3JtKCk7XHJcbiAgY29uc3Qgc2hvd0RyYXdlciA9ICgpID0+IHtcclxuICAgIHNldE9wZW4odHJ1ZSk7XHJcbiAgfTtcclxuICBjb25zdCBvbkNsb3NlID0gKCkgPT4ge1xyXG4gICAgc2V0T3BlbihmYWxzZSk7XHJcbiAgfTtcclxuICBjb25zdCBvbkZpbmlzaCA9IChmb3JtRGF0YSkgPT4ge1xyXG4gICAgY29uc29sZS5sb2coJ2Zvcm1EYXRhOicsIGZvcm1EYXRhKTtcclxuICAgIEdNX3NldFZhbHVlKCdzdGFyUGFnZUhyZWYnLCBmb3JtRGF0YSlcclxuICB9O1xyXG5cclxuICBjb25zdCBqdW1wUGFnZSA9IChldmVudCkgPT4ge1xyXG4gICAgc2V0SnVtcFBhZ2VIcmVmKGV2ZW50LnRhcmdldC52YWx1ZSlcclxuICAgIEdNX3NldFZhbHVlKCdqdW1wUGFnZUhyZWYnLCBldmVudC50YXJnZXQudmFsdWUpXHJcbiAgfVxyXG5cclxuICBjb25zdCBvcGVuSnVtcEhyZWYgPSAoKSA9PiB7XHJcbiAgICBsZXQgY2xpcGJvYXJkQ29udGVudCA9IFtdXHJcbiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZignYmlsaWJpbGknKSAhPT0gLTEpIHtcclxuICAgICAgY2xpcGJvYXJkQ29udGVudCA9IGdldEJpbGliaWxpQ29udGVudCgpXHJcbiAgICAgIHNldENsaXBib2FyZENvbnRlbnQoY2xpcGJvYXJkQ29udGVudClcclxuICAgICAgY29uc29sZS5sb2coY2xpcGJvYXJkQ29udGVudClcclxuICAgICAgR01fc2V0Q2xpcGJvYXJkKGNsaXBib2FyZENvbnRlbnQuam9pbignXFxuJykpXHJcbiAgICB9XHJcbiAgICB3aW5kb3cub3BlbihHTV9nZXRWYWx1ZSgnanVtcFBhZ2VIcmVmJykpXHJcbiAgfVxyXG5cclxuICAvLyDojrflj5Zi56uZ55qE5YaF5a65XHJcbiAgY29uc3QgZ2V0QmlsaWJpbGlDb250ZW50ID0gKCkgPT4ge1xyXG4gICAgY29uc3QgYmlsaWJpbGlMaXN0ID0gW11cclxuICAgIGNvbnN0IGJpbGliaWxpVGl0bGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI3ZpZXdib3hfcmVwb3J0ID4gaDFcIikuaW5uZXJUZXh0O1xyXG4gICAgY29uc3QgYmlsaWJpbGlVcE5hbWUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudXAtZGV0YWlsLXRvcCBhJykuaW5uZXJUZXh0O1xyXG4gICAgYmlsaWJpbGlMaXN0LnB1c2god2luZG93LmxvY2F0aW9uLmhyZWYsIGJpbGliaWxpVGl0bGUsIGJpbGliaWxpVXBOYW1lKTtcclxuICAgIC8vIOWwhuWJquWIh+adv+WGheWuuei/m+ihjOWtmOWCqFxyXG4gICAgR01fc2V0VmFsdWUoJ2NsaXBib2FyZENvbnRlbnQnLCBiaWxpYmlsaUxpc3QpXHJcbiAgICByZXR1cm4gYmlsaWJpbGlMaXN0O1xyXG4gIH1cclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGlmKEdNX2dldFZhbHVlKCdzdGFyUGFnZUhyZWYnKSkge1xyXG4gICAgICBmb3JtLnNldFZhbHVlcyhHTV9nZXRWYWx1ZSgnc3RhclBhZ2VIcmVmJykpXHJcbiAgICB9XHJcbiAgICBpZihHTV9nZXRWYWx1ZSgnanVtcFBhZ2VIcmVmJykpIHtcclxuICAgICAgc2V0SnVtcFBhZ2VIcmVmKEdNX2dldFZhbHVlKCdqdW1wUGFnZUhyZWYnKSlcclxuICAgIH1cclxuICB9LCBbXSlcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXY+XHJcbiAgICAgIDxCdXR0b24gdHlwZT1cInByaW1hcnlcIiBvbkNsaWNrPXtzaG93RHJhd2VyfT5cclxuICAgICAgICDmiZPlvIDmlLbol4/pk77mjqVcclxuICAgICAgPC9CdXR0b24+XHJcbiAgICAgIDxkaXYgc3R5bGU9e3sgbWFyZ2luVG9wOiAnMTBweCcgfX0+XHJcbiAgICAgICAgPEJ1dHRvbiB0eXBlPVwicHJpbWFyeVwiIG9uQ2xpY2s9e29wZW5KdW1wSHJlZn0+XHJcbiAgICAgICAgICDmlLbol49cclxuICAgICAgICA8L0J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxEcmF3ZXJcclxuICAgICAgICB0aXRsZT1cIuS9oOaUtuiXj+eahOmTvuaOpVwiXHJcbiAgICAgICAgcGxhY2VtZW50PVwicmlnaHRcIlxyXG4gICAgICAgIG9uQ2xvc2U9e29uQ2xvc2V9XHJcbiAgICAgICAgb3Blbj17b3Blbn1cclxuICAgICAgPlxyXG4gICAgICAgIDxUYWJzIGRlZmF1bHRBY3RpdmVLZXk9XCIxXCIgb25UYWJDbGljaz17KGtleSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChrZXkgPT0gMikge1xyXG4gICAgICAgICAgICAgICAgLy8g6I635Y+W5Ymq5YiH5p2/5YaF5a65XHJcbiAgICAgICAgICAgICAgY29uc3QgY2xpcGJvYXJkQ29udGVudCA9IEdNX2dldFZhbHVlKCdjbGlwYm9hcmRDb250ZW50JylcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjbGlwYm9hcmRDb250ZW50KVxyXG4gICAgICAgICAgICAgIHNldENsaXBib2FyZENvbnRlbnQoY2xpcGJvYXJkQ29udGVudClcclxuICAgICAgICAgICAgLy8gIGNvbnN0IGNsaXBib2FyZENvbnRlbnQgPSBHTV9nZXRDbGlwYm9hcmQoKVxyXG4gICAgICAgICAgICAvLyAgY29uc29sZS5sb2coY2xpcGJvYXJkQ29udGVudClcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICB9fT5cclxuICAgICAgICAgIDxUYWJzLlRhYlBhbmUgdGFiPVwi5pS26JeP572R5Z2AXCIga2V5PVwiMVwiPlxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgIDxzcGFuPui3s+i9rOWcsOWdgDo8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPElucHV0XHJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIuivt+i+k+WFpeS9oOimgei3s+i9rOWIsOeahOe9keWdgFwiXHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17anVtcFBhZ2V9XHJcbiAgICAgICAgICAgICAgICB2YWx1ZT17anVtcFBhZ2VIcmVmfVxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8Rm9ybVJlbmRlclxyXG4gICAgICAgICAgICAgIHNjaGVtYT17c2NoZW1hfVxyXG4gICAgICAgICAgICAgIGZvcm09e2Zvcm19XHJcbiAgICAgICAgICAgICAgbWF4V2lkdGg9ezQwMH1cclxuICAgICAgICAgICAgICBvbkZpbmlzaD17b25GaW5pc2h9XHJcbiAgICAgICAgICAgICAgZm9vdGVyPXt0cnVlfVxyXG4gICAgICAgICAgICAgIHdpZGdldHM9e3sgSnVtcEJ1dHRvbiB9fVxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC9UYWJzLlRhYlBhbmU+XHJcbiAgICAgICAgICA8VGFicy5UYWJQYW5lIHRhYj1cIuWGheWuueWJquWIh+adv1wiIGtleT1cIjJcIiA+XHJcbiAgICAgICAgICAgIHtjbGlwYm9hcmRDb250ZW50ICYmIGNsaXBib2FyZENvbnRlbnQubGVuZ3RoPiAwID8gKGNsaXBib2FyZENvbnRlbnQucmV2ZXJzZSgpKS5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIDxkaXYga2V5PXtpbmRleH0+e2l0ZW19PC9kaXY+XHJcbiAgICAgICAgICAgIH0pOiBudWxsfVxyXG4gICAgICAgICAgPC9UYWJzLlRhYlBhbmU+XHJcbiAgICAgICAgPC9UYWJzPlxyXG4gICAgICA8L0RyYXdlcj5cclxuICAgIDwvZGl2PlxyXG4gICk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEFwcDtcclxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbS9jbGllbnQnO1xyXG5pbXBvcnQgQXBwIGZyb20gJy4vQXBwJztcclxuaW1wb3J0ICcuL2luZGV4LmNzcydcclxuUmVhY3RET00uY3JlYXRlUm9vdChcclxuICAoKCkgPT4ge1xyXG4gICAgY29uc3QgYXBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICBhcHAuc2V0QXR0cmlidXRlKCdjbGFzcycsICd1cExpc3QnKVxyXG5cclxuICAgIC8vIGNvbnN0IGFwcCA9IEdNX2FkZEVsZW1lbnQoJ2RpdicsIHtjbGFzczogJ3VwTGlzdCd9KTtcclxuICAgIC8vIOiOt+WPlumhtemdomNvbnRhaW5lclxyXG4gICAgLy8gY29uc3QgcGFnZUNvbnRlbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYXBwJylcclxuICAgIC8vIHBhZ2VDb250ZW50LmFwcGVuZChhcHApO1xyXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmQoYXBwKVxyXG4gICAgLy8gR01fYWRkRWxlbWVudChkb2N1bWVudC5ib2R5LCAnZGl2Jywge2NsYXNzOiAndXBMaXN0JywgdGV4dENvbnRlbnQ6IGFwcH0pO1xyXG4gICAgcmV0dXJuIGFwcDtcclxuICB9KSgpLFxyXG4pLnJlbmRlcihcclxuICA8UmVhY3QuRnJhZ21lbnQ+XHJcbiAgICA8QXBwIC8+XHJcbiAgPC9SZWFjdC5GcmFnbWVudD4sXHJcbik7XHJcbiJdLCJuYW1lcyI6WyJtIiwicmVxdWlyZSQkMCIsIl9leHRlbmRzIiwiaSIsImtleSIsIl90eXBlb2YiLCJvYmoiLCJfdG9QcmltaXRpdmUiLCJfdG9Qcm9wZXJ0eUtleSIsInRvUHJpbWl0aXZlIiwiX2RlZmluZVByb3BlcnR5IiwidG9Qcm9wZXJ0eUtleSIsImRlc2NyaXB0b3IiLCJfc2V0UHJvdG90eXBlT2YiLCJwIiwibyIsInNldFByb3RvdHlwZU9mIiwiX2dldFByb3RvdHlwZU9mIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsImUiLCJzZWxmIiwiY2FsbCIsImFzc2VydFRoaXNJbml0aWFsaXplZCIsImlzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsImdldFByb3RvdHlwZU9mIiwicG9zc2libGVDb25zdHJ1Y3RvclJldHVybiIsIm1vZHVsZSIsImYiLCJoIiwiayIsImwiLCJuIiwicSIsInIiLCJ0IiwidiIsInciLCJ1IiwidG9BcnJheSIsIlJlYWN0IiwiaXNGcmFnbWVudCIsInByZU1lc3NhZ2UiLCJ3YXJuaW5nIiwibWV0aG9kIiwib3duS2V5cyIsIm9iamVjdCIsImtleXMiLCJfb2JqZWN0U3ByZWFkMiIsImRlZmluZVByb3BlcnR5IiwiZ2V0VmFsdWUiLCJ0eXBlIiwiaXNNZW1vIiwiUmVhY3RET00iLCJnZXRJbmRleCIsImluZGV4IiwiY3R4IiwiZ2xvYmFsJDEiLCJSZXNpemVPYnNlcnZlckNvbnRyb2xsZXIiLCJvYnNlcnZlcnMiLCJ4IiwieSIsIlJlc2l6ZU9ic2VydmF0aW9uIiwiUmVzaXplT2JzZXJ2ZXJFbnRyeSIsIlJlc2l6ZU9ic2VydmVyU1BJIiwiX3RoaXMiLCJSZXNpemVPYnNlcnZlciIsIkRvbVdyYXBwZXIiLCJyZW5kZXIiLCJjIiwiZyIsImIiLCJkIiwiQ29sbGVjdGlvbkNvbnRleHQiLCJjcmVhdGVDb250ZXh0IiwiQ29sbGVjdGlvbiIsIl9yZWYiLCJjaGlsZHJlbiIsIm9uQmF0Y2hSZXNpemUiLCJyZXNpemVJZFJlZiIsInVzZVJlZiIsInJlc2l6ZUluZm9zUmVmIiwib25Db2xsZWN0aW9uUmVzaXplIiwidXNlQ29udGV4dCIsIm9uUmVzaXplIiwidXNlQ2FsbGJhY2siLCJzaXplIiwiZWxlbWVudCIsImRhdGEiLCJjdXJyZW50IiwiY3VycmVudElkIiwicHVzaCIsIlByb21pc2UiLCJyZXNvbHZlIiwidGhlbiIsIl9qc3giLCJTaW5nbGVPYnNlcnZlciIsInByb3BzIiwicmVmIiwiZGlzYWJsZWQiLCJlbGVtZW50UmVmIiwid3JhcHBlclJlZiIsImlzUmVuZGVyUHJvcHMiLCJtZXJnZWRDaGlsZHJlbiIsInNpemVSZWYiLCJ3aWR0aCIsImhlaWdodCIsIm9mZnNldFdpZHRoIiwib2Zmc2V0SGVpZ2h0IiwiY2FuUmVmIiwiaXNWYWxpZEVsZW1lbnQiLCJzdXBwb3J0UmVmIiwib3JpZ2luUmVmIiwibWVyZ2VkUmVmIiwidXNlTWVtbyIsImNvbXBvc2VSZWYiLCJnZXREb20iLCJmaW5kRE9NTm9kZSIsInVzZUltcGVyYXRpdmVIYW5kbGUiLCJwcm9wc1JlZiIsIm9uSW50ZXJuYWxSZXNpemUiLCJ0YXJnZXQiLCJfcHJvcHNSZWYkY3VycmVudCIsIl90YXJnZXQkZ2V0Qm91bmRpbmdDbCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImZpeGVkV2lkdGgiLCJNYXRoIiwiZmxvb3IiLCJmaXhlZEhlaWdodCIsIm1lcmdlZE9mZnNldFdpZHRoIiwicm91bmQiLCJtZXJnZWRPZmZzZXRIZWlnaHQiLCJzaXplSW5mbyIsIl9vYmplY3RTcHJlYWQiLCJ1c2VFZmZlY3QiLCJjdXJyZW50RWxlbWVudCIsIm9ic2VydmUiLCJ1bm9ic2VydmUiLCJjbG9uZUVsZW1lbnQiLCJSZWZTaW5nbGVPYnNlcnZlciIsImZvcndhcmRSZWYiLCJJTlRFUk5BTF9QUkVGSVhfS0VZIiwiY2hpbGROb2RlcyIsIm1hcCIsImNoaWxkIiwiY29uY2F0IiwiX2NyZWF0ZUVsZW1lbnQiLCJ1bmRlZmluZWQiLCJSZWZSZXNpemVPYnNlcnZlciIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwib2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSIsIl9hcnJheUxpa2VUb0FycmF5IiwiX2FycmF5V2l0aG91dEhvbGVzIiwiYXJyYXlMaWtlVG9BcnJheSIsIl9pdGVyYWJsZVRvQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJfbm9uSXRlcmFibGVTcHJlYWQiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJhcnJheVdpdGhvdXRIb2xlcyIsIml0ZXJhYmxlVG9BcnJheSIsInVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5Iiwibm9uSXRlcmFibGVTcHJlYWQiLCJ3YXJuaW5nRnVuYyIsIkNvbnRleHQiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwiZXhwb3J0cyIsIiRTeW1ib2wiLCJkZWZpbmUiLCJ3cmFwIiwiY29udGV4dCIsIkl0ZXJhdG9yUHJvdG90eXBlIiwicHJvdG90eXBlIiwidmFsdWUiLCJuZXh0IiwibmFtZSIsIl9jb25zdHJ1Y3QiLCJQYXJlbnQiLCJhcmdzIiwiQ2xhc3MiLCJfd3JhcE5hdGl2ZVN1cGVyIiwiQXN5bmNWYWxpZGF0aW9uRXJyb3IiLCJwYXRoIiwicmVxdWlyZWQiLCJ3aGl0ZXNwYWNlIiwiaXAiLCJpbnRlZ2VyIiwiYXJyYXkiLCJyZWdleHAiLCJkYXRlIiwibnVtYmVyIiwicmFuZ2UiLCJlbnVtZXJhYmxlIiwicGF0dGVybiIsInN0cmluZyIsIl9ib29sZWFuIiwiZmxvYXRGbiIsImFueSIsInZhbGlkYXRvcnMiLCJTY2hlbWEiLCJydWxlcyIsIm1lc3NhZ2VzIiwib2MiLCJ6Iiwic2NoZW1hIiwidmFsaWRhdG9yIiwidHlwZVRlbXBsYXRlIiwiZ2V0IiwiX2FycmF5V2l0aEhvbGVzIiwiX25vbkl0ZXJhYmxlUmVzdCIsIl90b0FycmF5IiwiYXJyYXlXaXRoSG9sZXMiLCJub25JdGVyYWJsZVJlc3QiLCJzZXQiLCJjbG9uZURlZXAiLCJzdG9yZSIsImlzT2JqZWN0IiwiUmF3QXN5bmNWYWxpZGF0b3IiLCJ3cmFwcGVkQ2FsbGJhY2siLCJfZXhjbHVkZWQiLCJFTVBUWV9FUlJPUlMiLCJyZXF1aXJlVXBkYXRlIiwic2hvdWxkVXBkYXRlIiwicHJldiIsInByZXZWYWx1ZSIsIm5leHRWYWx1ZSIsImluZm8iLCJzb3VyY2UiLCJGaWVsZCIsIl9SZWFjdCRDb21wb25lbnQiLCJfaW5oZXJpdHMiLCJfc3VwZXIiLCJfY3JlYXRlU3VwZXIiLCJfY2xhc3NDYWxsQ2hlY2siLCJzdGF0ZSIsInJlc2V0Q291bnQiLCJjYW5jZWxSZWdpc3RlckZ1bmMiLCJtb3VudGVkIiwidG91Y2hlZCIsImRpcnR5IiwidmFsaWRhdGVQcm9taXNlIiwicHJldlZhbGlkYXRpbmciLCJlcnJvcnMiLCJ3YXJuaW5ncyIsImNhbmNlbFJlZ2lzdGVyIiwiX3RoaXMkcHJvcHMiLCJwcmVzZXJ2ZSIsImlzTGlzdEZpZWxkIiwiZ2V0TmFtZVBhdGgiLCJfdGhpcyRwcm9wczIiLCJmaWVsZENvbnRleHQiLCJfZmllbGRDb250ZXh0JHByZWZpeE4iLCJwcmVmaXhOYW1lIiwiZ2V0UnVsZXMiLCJfdGhpcyRwcm9wczMiLCJfdGhpcyRwcm9wczMkcnVsZXMiLCJydWxlIiwicmVmcmVzaCIsInNldFN0YXRlIiwidHJpZ2dlck1ldGFFdmVudCIsImRlc3Ryb3kiLCJvbk1ldGFDaGFuZ2UiLCJnZXRNZXRhIiwib25TdG9yZUNoYW5nZSIsInByZXZTdG9yZSIsIm5hbWVQYXRoTGlzdCIsIl90aGlzJHByb3BzNCIsIl90aGlzJHByb3BzNCRkZXBlbmRlbiIsImRlcGVuZGVuY2llcyIsIm9uUmVzZXQiLCJuYW1lUGF0aCIsImN1clZhbHVlIiwibmFtZVBhdGhNYXRjaCIsImNvbnRhaW5zTmFtZVBhdGgiLCJyZVJlbmRlciIsInZhbGlkYXRpbmciLCJsZW5ndGgiLCJkZXBlbmRlbmN5TGlzdCIsInNvbWUiLCJkZXBlbmRlbmN5IiwicmVsYXRlZEZpZWxkcyIsInZhbGlkYXRlUnVsZXMiLCJvcHRpb25zIiwiY3VycmVudFZhbHVlIiwicm9vdFByb21pc2UiLCJfdGhpcyRwcm9wczUiLCJfdGhpcyRwcm9wczUkdmFsaWRhdGUiLCJ2YWxpZGF0ZUZpcnN0IiwibWVzc2FnZVZhcmlhYmxlcyIsIl9yZWYyIiwidHJpZ2dlck5hbWUiLCJmaWx0ZXJlZFJ1bGVzIiwiZmlsdGVyIiwidmFsaWRhdGVUcmlnZ2VyIiwidHJpZ2dlckxpc3QiLCJpbmNsdWRlcyIsInByb21pc2UiLCJjYXRjaCIsInJ1bGVFcnJvcnMiLCJhcmd1bWVudHMiLCJfcnVsZUVycm9ycyRmb3JFYWNoIiwibmV4dEVycm9ycyIsIm5leHRXYXJuaW5ncyIsImZvckVhY2giLCJfcmVmMyIsIndhcm5pbmdPbmx5IiwiX3JlZjMkZXJyb3JzIiwiYXBwbHkiLCJpc0ZpZWxkVmFsaWRhdGluZyIsImlzRmllbGRUb3VjaGVkIiwiaXNGaWVsZERpcnR5IiwiaW5pdGlhbFZhbHVlIiwiX2ZpZWxkQ29udGV4dCRnZXRJbnRlIiwiZ2V0SW50ZXJuYWxIb29rcyIsIkhPT0tfTUFSSyIsImdldEluaXRpYWxWYWx1ZSIsImdldEVycm9ycyIsImdldFdhcm5pbmdzIiwiaXNMaXN0IiwiaXNQcmVzZXJ2ZSIsIm1ldGEiLCJnZXRPbmx5Q2hpbGQiLCJnZXRDb250cm9sbGVkIiwiaXNGdW5jdGlvbiIsImNoaWxkTGlzdCIsInRvQ2hpbGRyZW5BcnJheSIsImdldEZpZWxkc1ZhbHVlIiwiY2hpbGRQcm9wcyIsIl90aGlzJHByb3BzNiIsInRyaWdnZXIiLCJnZXRWYWx1ZUZyb21FdmVudCIsIm5vcm1hbGl6ZSIsInZhbHVlUHJvcE5hbWUiLCJnZXRWYWx1ZVByb3BzIiwibWVyZ2VkVmFsaWRhdGVUcmlnZ2VyIiwiX2dldEludGVybmFsSG9va3MiLCJkaXNwYXRjaCIsIm1lcmdlZEdldFZhbHVlUHJvcHMiLCJ2YWwiLCJvcmlnaW5UcmlnZ2VyRnVuYyIsImNvbnRyb2wiLCJuZXdWYWx1ZSIsIl9sZW4iLCJBcnJheSIsIl9rZXkiLCJkZWZhdWx0R2V0VmFsdWVGcm9tRXZlbnQiLCJ2YWxpZGF0ZVRyaWdnZXJMaXN0Iiwib3JpZ2luVHJpZ2dlciIsIl9nZXRJbnRlcm5hbEhvb2tzMiIsImluaXRFbnRpdHlWYWx1ZSIsIl9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQiLCJfY3JlYXRlQ2xhc3MiLCJjb21wb25lbnREaWRNb3VudCIsIl90aGlzJHByb3BzNyIsIl9nZXRJbnRlcm5hbEhvb2tzMyIsInJlZ2lzdGVyRmllbGQiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsImZvcmNlVXBkYXRlIiwiX3RoaXMkZ2V0T25seUNoaWxkIiwicmV0dXJuQ2hpbGROb2RlIiwiX0ZyYWdtZW50IiwiQ29tcG9uZW50IiwiY29udGV4dFR5cGUiLCJGaWVsZENvbnRleHQiLCJkZWZhdWx0UHJvcHMiLCJXcmFwcGVyRmllbGQiLCJfcmVmNSIsInJlc3RQcm9wcyIsImpvaW4iLCJMaXN0Iiwia2V5UmVmIiwiaWQiLCJrZXlNYW5hZ2VyIiwicGFyZW50UHJlZml4TmFtZSIsImxpc3RDb250ZXh0IiwiZ2V0S2V5IiwibGVuIiwicGF0aE5hbWUiLCJzbGljZSIsIl9yZWYzJHZhbHVlIiwib25DaGFuZ2UiLCJnZXRGaWVsZFZhbHVlIiwiZ2V0TmV3VmFsdWUiLCJ2YWx1ZXMiLCJvcGVyYXRpb25zIiwiYWRkIiwiZGVmYXVsdFZhbHVlIiwicmVtb3ZlIiwiaW5kZXhTZXQiLCJTZXQiLCJpc0FycmF5IiwiXyIsImtleXNJbmRleCIsImhhcyIsInZhbHVlSW5kZXgiLCJtb3ZlIiwiZnJvbSIsInRvIiwiX21vdmUiLCJsaXN0VmFsdWUiLCJfXyIsIl9pdGVyYWJsZVRvQXJyYXlMaW1pdCIsIl9zbGljZWRUb0FycmF5IiwiaXRlcmFibGVUb0FycmF5TGltaXQiLCJOYW1lTWFwIiwiRm9ybVN0b3JlIiwiaW5pdCIsImlzTmFtZVBhdGhMaXN0VG91Y2hlZCIsInJlc2V0V2l0aEZpZWxkcyIsImZpbGxDaGlsZHJlbiIsInVzZUZvcm0iLCJmb3JjZVJlUmVuZGVyIiwiRm9ybUNvbnRleHQiLCJ0cmlnZ2VyRm9ybUNoYW5nZSIsInRyaWdnZXJGb3JtRmluaXNoIiwicmVnaXN0ZXJGb3JtIiwidW5yZWdpc3RlckZvcm0iLCJGb3JtUHJvdmlkZXIiLCJ2YWxpZGF0ZU1lc3NhZ2VzIiwib25Gb3JtQ2hhbmdlIiwib25Gb3JtRmluaXNoIiwiZm9ybUNvbnRleHQiLCJmb3Jtc1JlZiIsImNoYW5nZWRGaWVsZHMiLCJmb3JtcyIsImZvcm0iLCJuZXdGb3JtcyIsIkZvcm0iLCJpbml0aWFsVmFsdWVzIiwiZmllbGRzIiwiX3JlZiRjb21wb25lbnQiLCJjb21wb25lbnQiLCJfcmVmJHZhbGlkYXRlVHJpZ2dlciIsIm9uVmFsdWVzQ2hhbmdlIiwiX29uRmllbGRzQ2hhbmdlIiwib25GaWVsZHNDaGFuZ2UiLCJfb25GaW5pc2giLCJvbkZpbmlzaCIsIm9uRmluaXNoRmFpbGVkIiwiX3VzZUZvcm0iLCJfdXNlRm9ybTIiLCJmb3JtSW5zdGFuY2UiLCJfZm9ybUluc3RhbmNlJGdldEludGUiLCJ1c2VTdWJzY3JpYmUiLCJzZXRJbml0aWFsVmFsdWVzIiwic2V0Q2FsbGJhY2tzIiwic2V0VmFsaWRhdGVNZXNzYWdlcyIsInNldFByZXNlcnZlIiwiZGVzdHJveUZvcm0iLCJyZXN0IiwibW91bnRSZWYiLCJjaGlsZHJlbk5vZGUiLCJjaGlsZHJlblJlbmRlclByb3BzIiwicHJldkZpZWxkc1JlZiIsImlzU2ltaWxhciIsInNldEZpZWxkcyIsImZvcm1Db250ZXh0VmFsdWUiLCJ3cmFwcGVyTm9kZSIsIm9uU3VibWl0IiwiZXZlbnQiLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wYWdhdGlvbiIsInN1Ym1pdCIsIl9yZXN0UHJvcHMkb25SZXNldCIsInJlc2V0RmllbGRzIiwic3RyaW5naWZ5IiwidXNlU3RhdGUiLCJzZXRWYWx1ZSIsIkludGVybmFsRm9ybSIsIkZpZWxkRm9ybSIsImxvY2FsZSIsIkNhbGVuZGFyTG9jYWxlIiwiVGltZVBpY2tlckxvY2FsZSIsIlBhZ2luYXRpb24iLCJEYXRlUGlja2VyIiwiVGltZVBpY2tlciIsIkNhbGVuZGFyIiwiQU5UX01BUksiLCJMb2NhbGVQcm92aWRlciIsIl9wcm9wcyRsb2NhbGUiLCJfQU5UX01BUktfXyIsImNoYW5nZUNvbmZpcm1Mb2NhbGUiLCJNb2RhbCIsImdldE1lbW9pemVkQ29udGV4dFZhbHVlIiwiZXhpc3QiLCJMb2NhbGVDb250ZXh0IiwiTG9jYWxlUmVjZWl2ZXIiLCJkZWZhdWx0TG9jYWxlIiwiZGVmYXVsdExvY2FsZURhdGEiLCJ1c2VMb2NhbGVSZWNlaXZlciIsIkNoZWNrQ2lyY2xlRmlsbGVkIiwiY29sb3IiLCJmb3JtYXQiLCJtYXRjaCIsIlRpbnlDb2xvciIsIm1peCIsImdlbmVyYXRlIiwiY29sb3JTdHJpbmciLCJjYW5Vc2VEb20iLCJjb250YWlucyIsInJvb3QiLCJnZXRDb250YWluZXIiLCJjc3MiLCJ2YWxpZCIsIm1lc3NhZ2UiLCJ3YXJuIiwiaXNJY29uRGVmaW5pdGlvbiIsInRoZW1lIiwiaWNvbiIsIm5vcm1hbGl6ZUF0dHJzIiwiYXR0cnMiLCJPYmplY3QiLCJyZWR1Y2UiLCJhY2MiLCJjbGFzc05hbWUiLCJjbGFzcyIsIm5vZGUiLCJyb290UHJvcHMiLCJjcmVhdGVFbGVtZW50IiwidGFnIiwiZ2V0U2Vjb25kYXJ5Q29sb3IiLCJwcmltYXJ5Q29sb3IiLCJnZW5lcmF0ZUNvbG9yIiwibm9ybWFsaXplVHdvVG9uZUNvbG9ycyIsInR3b1RvbmVDb2xvciIsImljb25TdHlsZXMiLCJ1c2VJbnNlcnRTdHlsZXMiLCJzdHlsZVN0ciIsIl91c2VDb250ZXh0IiwiSWNvbkNvbnRleHQiLCJjc3AiLCJ1cGRhdGVDU1MiLCJwcmVwZW5kIiwiSWNvbkJhc2UiLCJzdHlsZSIsInNldFR3b1RvbmVDb2xvciIsIkljb24iLCJfY2xhc3NOYW1lcyIsInNwaW4iLCJyb3RhdGUiLCJ0YWJJbmRleCIsIm9uQ2xpY2siLCJfUmVhY3QkdXNlQ29udGV4dCIsIl9SZWFjdCR1c2VDb250ZXh0JHByZSIsInByZWZpeENscyIsInJvb3RDbGFzc05hbWUiLCJjbGFzc1N0cmluZyIsImNsYXNzTmFtZXMiLCJpY29uVGFiSW5kZXgiLCJzdmdTdHlsZSIsIm1zVHJhbnNmb3JtIiwidHJhbnNmb3JtIiwiX25vcm1hbGl6ZVR3b1RvbmVDb2xvIiwiX25vcm1hbGl6ZVR3b1RvbmVDb2xvMiIsInNlY29uZGFyeUNvbG9yIiwicm9sZSIsImRpc3BsYXlOYW1lIiwiZ2V0VHdvVG9uZUNvbG9yIiwiQW50ZEljb24iLCJDaGVja0NpcmNsZUZpbGxlZFN2ZyIsIkNsb3NlQ2lyY2xlRmlsbGVkIiwiQ2xvc2VDaXJjbGVGaWxsZWRTdmciLCJFeGNsYW1hdGlvbkNpcmNsZUZpbGxlZCIsIkV4Y2xhbWF0aW9uQ2lyY2xlRmlsbGVkU3ZnIiwiSW5mb0NpcmNsZUZpbGxlZCIsIkluZm9DaXJjbGVGaWxsZWRTdmciLCJMb2FkaW5nT3V0bGluZWQiLCJMb2FkaW5nT3V0bGluZWRTdmciLCJwcmVmaXhlcyIsImNhblVzZURPTSIsImdldFRyYW5zaXRpb25OYW1lIiwidHJhbnNpdGlvbk5hbWUiLCJ1c2VMYXlvdXRFZmZlY3QiLCJyYWYiLCJjYWYiLCJ3cmFwcGVyUmFmIiwic3RlcCIsImdldEVsZW1lbnQiLCJnZXRFdmVudEhhbmRsZXJzIiwiZ2VuQ1NTTW90aW9uIiwiY29uZmlnIiwidHJhbnNpdGlvblN1cHBvcnQiLCJpc1N1cHBvcnRUcmFuc2l0aW9uIiwiY29udGV4dE1vdGlvbiIsIm1vdGlvbk5hbWUiLCJDU1NNb3Rpb24iLCJfcHJvcHMkdmlzaWJsZSIsInZpc2libGUiLCJfcHJvcHMkcmVtb3ZlT25MZWF2ZSIsInJlbW92ZU9uTGVhdmUiLCJmb3JjZVJlbmRlciIsImxlYXZlZENsYXNzTmFtZSIsImV2ZW50UHJvcHMiLCJtb3Rpb24iLCJzdXBwb3J0TW90aW9uIiwibm9kZVJlZiIsIndyYXBwZXJOb2RlUmVmIiwiZ2V0RG9tRWxlbWVudCIsIkhUTUxFbGVtZW50IiwiX3VzZVN0YXR1cyIsInVzZVN0YXR1cyIsIl91c2VTdGF0dXMyIiwic3RhdHVzIiwic3RhdHVzU3RlcCIsInN0YXR1c1N0eWxlIiwibWVyZ2VkVmlzaWJsZSIsInJlbmRlcmVkUmVmIiwic2V0Tm9kZVJlZiIsImZpbGxSZWYiLCJtb3Rpb25DaGlsZHJlbiIsIm1lcmdlZFByb3BzIiwiU1RBVFVTX05PTkUiLCJkaXNwbGF5Iiwic3RhdHVzU3VmZml4IiwiU1RFUF9QUkVQQVJFIiwiaXNBY3RpdmUiLCJTVEVQX1NUQVJUIiwibW90aW9uQ2xzIiwib3JpZ2luTm9kZVJlZiIsInN1cHBvcnRUcmFuc2l0aW9uIiwiX2V4Y2x1ZGVkMiIsIk1PVElPTl9QUk9QX05BTUVTIiwiZ2VuQ1NTTW90aW9uTGlzdCIsIk9yaWdpbkNTU01vdGlvbiIsIkNTU01vdGlvbkxpc3QiLCJrZXlFbnRpdGllcyIsInJlbW92ZUtleSIsIm5leHRLZXlFbnRpdGllcyIsImVudGl0eSIsIlNUQVRVU19SRU1PVkVEIiwiX3RoaXMyIiwiX29uVmlzaWJsZUNoYW5nZWQiLCJvblZpc2libGVDaGFuZ2VkIiwib25BbGxSZW1vdmVkIiwiRnJhZ21lbnQiLCJtb3Rpb25Qcm9wcyIsInByb3AiLCJTVEFUVVNfQUREIiwiU1RBVFVTX0tFRVAiLCJjaGFuZ2VkVmlzaWJsZSIsInJlc3RLZXlzQ291bnQiLCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMiLCJfcmVmNCIsInBhcnNlZEtleU9iamVjdHMiLCJwYXJzZUtleXMiLCJtaXhlZEtleUVudGl0aWVzIiwiZGlmZktleXMiLCJwcmV2RW50aXR5IiwiZmluZCIsIlNUQVRVU19SRU1PVkUiLCJOb3RpY2UiLCJfQ29tcG9uZW50IiwiY2xvc2VUaW1lciIsImNsb3NlIiwiY2xlYXJDbG9zZVRpbWVyIiwib25DbG9zZSIsIm5vdGljZUtleSIsInN0YXJ0Q2xvc2VUaW1lciIsImR1cmF0aW9uIiwid2luZG93Iiwic2V0VGltZW91dCIsImNsZWFyVGltZW91dCIsImNvbXBvbmVudERpZFVwZGF0ZSIsInByZXZQcm9wcyIsInVwZGF0ZU1hcmsiLCJyZXN0YXJ0Q2xvc2VUaW1lciIsImNsb3NhYmxlIiwiY2xvc2VJY29uIiwiaG9sZGVyIiwiY29tcG9uZW50Q2xhc3MiLCJkYXRhT3JBcmlhQXR0cmlidXRlUHJvcHMiLCJzdWJzdHIiLCJfanN4cyIsImNyZWF0ZVBvcnRhbCIsInVzZU5vdGlmaWNhdGlvbiIsIm5vdGlmaWNhdGlvbkluc3RhbmNlIiwiY3JlYXRlZFJlZiIsIl9SZWFjdCR1c2VTdGF0ZSIsIl9SZWFjdCR1c2VTdGF0ZTIiLCJlbGVtZW50cyIsInNldEVsZW1lbnRzIiwibm90aWZ5Iiwibm90aWNlUHJvcHMiLCJmaXJzdE1vdW50IiwiZGl2Iiwibm90aWNlRWxlIiwib3JpZ2luRWxlbWVudHMiLCJmaW5kSW5kZXgiLCJlbGUiLCJjbG9uZUxpc3QiLCJzZWVkIiwibm93IiwiRGF0ZSIsImdldFV1aWQiLCJOb3RpZmljYXRpb24iLCJub3RpY2VzIiwiaG9va1JlZnMiLCJNYXAiLCJvcmlnaW5Ob3RpY2UiLCJob2xkZXJDYWxsYmFjayIsIl9vcmlnaW5Ob3RpY2Uka2V5Iiwibm90aWNlIiwibWF4Q291bnQiLCJwcmV2aW91c1N0YXRlIiwibm90aWNlSW5kZXgiLCJpbmRleE9mIiwidXBkYXRlZE5vdGljZXMiLCJzcGxpY2UiLCJ1c2VyUGFzc0tleSIsInNoaWZ0IiwiX3JlZjIkbm90aWNlIiwibWVyZ2VkS2V5Iiwibm90aWNlUHJvcHNNYXAiLCJhbmltYXRpb24iLCJub3RpY2VLZXlzIiwiX25vdGljZSRvbkNsb3NlIiwiY29udGVudCIsIm1vdGlvbkNsYXNzTmFtZSIsIm1vdGlvblN0eWxlIiwiX3RoaXMyJG5vdGljZVByb3BzTWFwIiwiZGVsZXRlIiwibmV3SW5zdGFuY2UiLCJ0b3AiLCJsZWZ0IiwibmV3Tm90aWZpY2F0aW9uSW5zdGFuY2UiLCJwcm9wZXJ0aWVzIiwiY2FsbGJhY2siLCJfcmVmNiIsImRvY3VtZW50IiwiYXBwZW5kQ2hpbGQiLCJib2R5IiwiY2FsbGVkIiwibm90aWZpY2F0aW9uIiwicmVtb3ZlTm90aWNlIiwidW5tb3VudCIsInBhcmVudE5vZGUiLCJyZW1vdmVDaGlsZCIsIl91c2VOb3RpZmljYXRpb24iLCJjcmVhdGVVc2VNZXNzYWdlIiwiZ2V0UmNOb3RpZmljYXRpb25JbnN0YW5jZSIsImdldFJDTm90aWNlUHJvcHMiLCJ1c2VNZXNzYWdlIiwiZ2V0UHJlZml4Q2xzIiwiZ2V0UG9wdXBDb250YWluZXIiLCJpbm5lckluc3RhbmNlIiwicHJveHkiLCJfdXNlUkNOb3RpZmljYXRpb24iLCJ1c2VSQ05vdGlmaWNhdGlvbiIsIl91c2VSQ05vdGlmaWNhdGlvbjIiLCJob29rTm90aWZ5IiwiY3VzdG9taXplUHJlZml4Q2xzIiwibWVyZ2VkUHJlZml4Q2xzIiwicm9vdFByZWZpeENscyIsImdldEtleVRoZW5JbmNyZWFzZUtleSIsImNsb3NlUHJvbWlzZSIsImluc3RhbmNlIiwicmVzdWx0IiwiZmlsbGVkIiwicmVqZWN0ZWQiLCJob29rQXBpUmVmIiwib3BlbiIsInR5cGVMaXN0IiwiYXR0YWNoVHlwZUFwaSIsIm1lc3NhZ2VJbnN0YW5jZSIsImRlZmF1bHREdXJhdGlvbiIsImRlZmF1bHRUb3AiLCJsb2NhbFByZWZpeENscyIsImhhc1RyYW5zaXRpb25OYW1lIiwicnRsIiwic2V0TWVzc2FnZUNvbmZpZyIsImdldFJDTm90aWZpY2F0aW9uSW5zdGFuY2UiLCJnZXRDb250ZXh0UG9wdXBDb250YWluZXIiLCJfZ2xvYmFsQ29uZmlnIiwiZ2xvYmFsQ29uZmlnIiwiZ2V0Um9vdFByZWZpeENscyIsImdldEljb25QcmVmaXhDbHMiLCJpY29uUHJlZml4Q2xzIiwiaW5zdGFuY2VDb25maWciLCJSQ05vdGlmaWNhdGlvbiIsInR5cGVUb0ljb24iLCJzdWNjZXNzIiwiZXJyb3IiLCJsb2FkaW5nIiwiSWNvbkNvbXBvbmVudCIsIm1lc3NhZ2VDbGFzcyIsIkNvbmZpZ1Byb3ZpZGVyIiwiX2EiLCJpc0FyZ3NQcm9wcyIsInRvU3RyaW5nIiwiYXBpIiwibWVzc2FnZUtleSIsIl9tZXNzYWdlSW5zdGFuY2UiLCJfbWVzc2FnZUluc3RhbmNlMiIsIm9yaWdpbmFsQXBpIiwiQ2hlY2tDaXJjbGVPdXRsaW5lZCIsIkNoZWNrQ2lyY2xlT3V0bGluZWRTdmciLCJDbG9zZUNpcmNsZU91dGxpbmVkIiwiQ2xvc2VDaXJjbGVPdXRsaW5lZFN2ZyIsIkNsb3NlT3V0bGluZWQiLCJDbG9zZU91dGxpbmVkU3ZnIiwiRXhjbGFtYXRpb25DaXJjbGVPdXRsaW5lZCIsIkV4Y2xhbWF0aW9uQ2lyY2xlT3V0bGluZWRTdmciLCJJbmZvQ2lyY2xlT3V0bGluZWQiLCJJbmZvQ2lyY2xlT3V0bGluZWRTdmciLCJjcmVhdGVVc2VOb3RpZmljYXRpb24iLCJnZXROb3RpZmljYXRpb25JbnN0YW5jZSIsInRoaXMiLCJfX2F3YWl0ZXIiLCJ0aGlzQXJnIiwiX2FyZ3VtZW50cyIsIlAiLCJnZW5lcmF0b3IiLCJhZG9wdCIsInJlamVjdCIsImZ1bGZpbGxlZCIsImRvbmUiLCJkZWZhdWx0Qm90dG9tIiwiZGVmYXVsdFByZWZpeENscyIsImRlZmF1bHRQbGFjZW1lbnQiLCJkZWZhdWx0R2V0Q29udGFpbmVyIiwiZGVmYXVsdENsb3NlSWNvbiIsInNldE5vdGlmaWNhdGlvbkNvbmZpZyIsInBsYWNlbWVudCIsImJvdHRvbSIsImdldFBsYWNlbWVudFN0eWxlIiwicmlnaHQiLCJfYXJncyRwbGFjZW1lbnQiLCJfYXJncyRnZXRDb250YWluZXIiLCJjYWNoZUtleSIsImNhY2hlSW5zdGFuY2UiLCJub3RpZmljYXRpb25DbGFzcyIsImR1cmF0aW9uQXJnIiwiZGVzY3JpcHRpb24iLCJidG4iLCJfYXJncyRjbG9zZUljb24iLCJpY29uTm9kZSIsImNsb3NlSWNvblRvUmVuZGVyIiwiYXV0b01hcmdpblRhZyIsImRlZmF1bHRHZXRQcmVmaXhDbHMiLCJzdWZmaXhDbHMiLCJDb25maWdDb250ZXh0IiwiQ29uZmlnQ29uc3VtZXIiLCJDb25zdW1lciIsImdsb2JhbFByZWZpeENscyIsImZvcm1hdENvbG9yIiwiZmlsbENvbG9yIiwiRGlzYWJsZWRDb250ZXh0IiwiRGlzYWJsZWRDb250ZXh0UHJvdmlkZXIiLCJvcmlnaW5EaXNhYmxlZCIsIlNpemVDb250ZXh0IiwiU2l6ZUNvbnRleHRQcm92aWRlciIsIm9yaWdpblNpemUiLCJQQVNTRURfUFJPUFMiLCJkZWZhdWx0SWNvblByZWZpeENscyIsImdsb2JhbEljb25QcmVmaXhDbHMiLCJnZXRHbG9iYWxQcmVmaXhDbHMiLCJnZXRHbG9iYWxJY29uUHJlZml4Q2xzIiwic2V0R2xvYmFsQ29uZmlnIiwicmVnaXN0ZXJUaGVtZSIsInJlcGxhY2UiLCJQcm92aWRlckNoaWxkcmVuIiwiX2IiLCJhdXRvSW5zZXJ0U3BhY2VJbkJ1dHRvbiIsImNvbXBvbmVudFNpemUiLCJkaXJlY3Rpb24iLCJzcGFjZSIsInZpcnR1YWwiLCJkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGgiLCJsZWdhY3lMb2NhbGUiLCJwYXJlbnRDb250ZXh0IiwiY29tcG9uZW50RGlzYWJsZWQiLCJwcm9wTmFtZSIsInByb3BWYWx1ZSIsIm1lbW9lZENvbmZpZyIsInByZXZDb25maWciLCJjdXJyZW50Q29uZmlnIiwicHJldktleXMiLCJjdXJyZW50S2V5cyIsIm1lbW9JY29uQ29udGV4dFZhbHVlIiwiY2hpbGROb2RlIiwiZGVmYXVsdFZhbGlkYXRlTWVzc2FnZXMiLCJSY0Zvcm1Qcm92aWRlciIsImFkZEV2ZW50TGlzdGVuZXJXcmFwIiwiZ2V0RGF0YU9yQXJpYVByb3BzIiwicmVwbGFjZUVsZW1lbnQiLCJyZXBsYWNlbWVudCIsImlzV2luZG93IiwiZ2V0U2Nyb2xsIiwic2Nyb2xsVG8iLCJmcmFtZUZ1bmMiLCJ1c2VMYXlvdXRVcGRhdGVFZmZlY3QiLCJoYXNWYWx1ZSIsImNhbmNlbExhdGVzdCIsImRlbGF5U2V0Qm9vbCIsIlVOREVGSU5FRCIsIkludGVybmFsSXRlbSIsImludmFsaWRhdGUiLCJpdGVtIiwicmVuZGVySXRlbSIsInJlc3BvbnNpdmUiLCJyZXNwb25zaXZlRGlzYWJsZWQiLCJyZWdpc3RlclNpemUiLCJpdGVtS2V5Iiwib3JkZXIiLCJfcHJvcHMkY29tcG9uZW50IiwibWVyZ2VkSGlkZGVuIiwiaW50ZXJuYWxSZWdpc3RlclNpemUiLCJvdmVyZmxvd1N0eWxlIiwib3BhY2l0eSIsIm92ZXJmbG93WSIsInBvaW50ZXJFdmVudHMiLCJwb3NpdGlvbiIsIm92ZXJmbG93UHJvcHMiLCJpdGVtTm9kZSIsIkl0ZW0iLCJub3RpZnlFZmZlY3RVcGRhdGUiLCJ1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyIsIl9leGNsdWRlZDMiLCJJbnRlcm5hbFJhd0l0ZW0iLCJPdmVyZmxvd0NvbnRleHQiLCJfcmVzdFByb3BzIiwiY29udGV4dENsYXNzTmFtZSIsInJlc3RDb250ZXh0IiwiUmF3SXRlbSIsIlJFU1BPTlNJVkUiLCJJTlZBTElEQVRFIiwiZGVmYXVsdFJlbmRlclJlc3QiLCJvbWl0dGVkSXRlbXMiLCJPdmVyZmxvdyIsIl9wcm9wcyRwcmVmaXhDbHMiLCJfcHJvcHMkZGF0YSIsInJlbmRlclJhd0l0ZW0iLCJfcHJvcHMkaXRlbVdpZHRoIiwiaXRlbVdpZHRoIiwic3NyIiwicmVuZGVyUmVzdCIsInJlbmRlclJhd1Jlc3QiLCJzdWZmaXgiLCJpdGVtQ29tcG9uZW50Iiwib25WaXNpYmxlQ2hhbmdlIiwiZnVsbHlTU1IiLCJ1c2VCYXRjaGVyIiwiX3VzZUVmZmVjdFN0YXRlIiwidXNlRWZmZWN0U3RhdGUiLCJfdXNlRWZmZWN0U3RhdGUyIiwiY29udGFpbmVyV2lkdGgiLCJzZXRDb250YWluZXJXaWR0aCIsIm1lcmdlZENvbnRhaW5lcldpZHRoIiwiX3VzZUVmZmVjdFN0YXRlMyIsIl91c2VFZmZlY3RTdGF0ZTQiLCJpdGVtV2lkdGhzIiwic2V0SXRlbVdpZHRocyIsIl91c2VFZmZlY3RTdGF0ZTUiLCJfdXNlRWZmZWN0U3RhdGU2IiwicHJldlJlc3RXaWR0aCIsInNldFByZXZSZXN0V2lkdGgiLCJfdXNlRWZmZWN0U3RhdGU3IiwiX3VzZUVmZmVjdFN0YXRlOCIsInJlc3RXaWR0aCIsInNldFJlc3RXaWR0aCIsIl91c2VFZmZlY3RTdGF0ZTkiLCJfdXNlRWZmZWN0U3RhdGUxMCIsInN1ZmZpeFdpZHRoIiwic2V0U3VmZml4V2lkdGgiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwic3VmZml4Rml4ZWRTdGFydCIsInNldFN1ZmZpeEZpeGVkU3RhcnQiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsImRpc3BsYXlDb3VudCIsInNldERpc3BsYXlDb3VudCIsIm1lcmdlZERpc3BsYXlDb3VudCIsIk51bWJlciIsIk1BWF9TQUZFX0lOVEVHRVIiLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsInJlc3RSZWFkeSIsInNldFJlc3RSZWFkeSIsIml0ZW1QcmVmaXhDbHMiLCJtZXJnZWRSZXN0V2lkdGgiLCJtYXgiLCJpc1Jlc3BvbnNpdmUiLCJzaG91bGRSZXNwb25zaXZlIiwic2hvd1Jlc3QiLCJtZXJnZWREYXRhIiwiaXRlbXMiLCJtaW4iLCJtZXJnZWRSZW5kZXJJdGVtIiwidXBkYXRlRGlzcGxheUNvdW50IiwiY291bnQiLCJzdWZmaXhGaXhlZFN0YXJ0VmFsIiwibm90UmVhZHkiLCJvbk92ZXJmbG93UmVzaXplIiwiY2xpZW50V2lkdGgiLCJvcmlnaW4iLCJjbG9uZSIsInJlZ2lzdGVyT3ZlcmZsb3dTaXplIiwicmVnaXN0ZXJTdWZmaXhTaXplIiwiZ2V0SXRlbVdpZHRoIiwidG90YWxXaWR0aCIsImxhc3RJbmRleCIsImN1cnJlbnRJdGVtV2lkdGgiLCJkaXNwbGF5UmVzdCIsInN1ZmZpeFN0eWxlIiwiaXRlbVNoYXJlZFByb3BzIiwiaW50ZXJuYWxSZW5kZXJJdGVtTm9kZSIsInJlc3ROb2RlIiwicmVzdENvbnRleHRQcm9wcyIsIm1lcmdlZFJlbmRlclJlc3QiLCJvdmVyZmxvd05vZGUiLCJGb3J3YXJkT3ZlcmZsb3ciLCJUcmFuc0J0biIsImN1c3RvbWl6ZUljb24iLCJjdXN0b21pemVJY29uUHJvcHMiLCJfb25Nb3VzZURvd24iLCJvbk1vdXNlRG93biIsInVzZXJTZWxlY3QiLCJXZWJraXRVc2VyU2VsZWN0Iiwic3BsaXQiLCJjbHMiLCJJbnB1dCIsIl9pbnB1dE5vZGUyIiwiX2lucHV0Tm9kZTIkcHJvcHMiLCJpbnB1dEVsZW1lbnQiLCJhdXRvRm9jdXMiLCJhdXRvQ29tcGxldGUiLCJlZGl0YWJsZSIsImFjdGl2ZURlc2NlbmRhbnRJZCIsIm1heExlbmd0aCIsIl9vbktleURvd24iLCJvbktleURvd24iLCJfb25DaGFuZ2UiLCJvblBhc3RlIiwiX29uQ29tcG9zaXRpb25TdGFydCIsIm9uQ29tcG9zaXRpb25TdGFydCIsIl9vbkNvbXBvc2l0aW9uRW5kIiwib25Db21wb3NpdGlvbkVuZCIsImlucHV0Tm9kZSIsIl9pbnB1dE5vZGUiLCJvcmlnaW5Qcm9wcyIsIm9uT3JpZ2luS2V5RG93biIsIm9uT3JpZ2luQ2hhbmdlIiwib25PcmlnaW5Nb3VzZURvd24iLCJvbk9yaWdpbkNvbXBvc2l0aW9uU3RhcnQiLCJvbk9yaWdpbkNvbXBvc2l0aW9uRW5kIiwicmVhZE9ubHkiLCJ1bnNlbGVjdGFibGUiLCJSZWZJbnB1dCIsImlzQnJvd3NlckNsaWVudCIsImlzVGl0bGVUeXBlIiwiX3ZhbHVlJGtleSIsIm9uUHJldmVudE1vdXNlRG93biIsIlNlbGVjdFNlbGVjdG9yIiwic2VhcmNoVmFsdWUiLCJhdXRvQ2xlYXJTZWFyY2hWYWx1ZSIsImlucHV0UmVmIiwicGxhY2Vob2xkZXIiLCJtb2RlIiwic2hvd1NlYXJjaCIsInJlbW92ZUljb24iLCJtYXhUYWdDb3VudCIsIm1heFRhZ1RleHRMZW5ndGgiLCJfcHJvcHMkbWF4VGFnUGxhY2Vob2wiLCJtYXhUYWdQbGFjZWhvbGRlciIsIm9taXR0ZWRWYWx1ZXMiLCJ0YWdSZW5kZXIiLCJvblRvZ2dsZU9wZW4iLCJvblJlbW92ZSIsIm9uSW5wdXRDaGFuZ2UiLCJvbklucHV0UGFzdGUiLCJvbklucHV0S2V5RG93biIsIm9uSW5wdXRNb3VzZURvd24iLCJvbklucHV0Q29tcG9zaXRpb25TdGFydCIsIm9uSW5wdXRDb21wb3NpdGlvbkVuZCIsIm1lYXN1cmVSZWYiLCJpbnB1dFdpZHRoIiwic2V0SW5wdXRXaWR0aCIsImZvY3VzZWQiLCJzZXRGb2N1c2VkIiwic2VsZWN0aW9uUHJlZml4Q2xzIiwiaW5wdXRWYWx1ZSIsImlucHV0RWRpdGFibGUiLCJzY3JvbGxXaWR0aCIsImRlZmF1bHRSZW5kZXJTZWxlY3RvciIsIml0ZW1EaXNhYmxlZCIsImdldFRpdGxlIiwiY3VzdG9taXplUmVuZGVyU2VsZWN0b3IiLCJsYWJlbCIsInZhbHVlSXRlbSIsImRpc3BsYXlMYWJlbCIsInN0ckxhYmVsIiwiU3RyaW5nIiwidGl0bGUiLCJvbkZvY3VzIiwib25CbHVyIiwicGlja0F0dHJzIiwic2VsZWN0aW9uTm9kZSIsIlNpbmdsZVNlbGVjdG9yIiwiYWN0aXZlVmFsdWUiLCJpbnB1dENoYW5nZWQiLCJzZXRJbnB1dENoYW5nZWQiLCJjb21ib2JveCIsImhhc1RleHRJbnB1dCIsInJlbmRlclBsYWNlaG9sZGVyIiwiaGlkZGVuU3R5bGUiLCJ2aXNpYmlsaXR5IiwiU2VsZWN0b3IiLCJjb21wb3NpdGlvblN0YXR1c1JlZiIsInRva2VuV2l0aEVudGVyIiwib25TZWFyY2giLCJvblNlYXJjaFN1Ym1pdCIsImRvbVJlZiIsImZvY3VzIiwiYmx1ciIsIl91c2VMb2NrIiwidXNlTG9jayIsIl91c2VMb2NrMiIsImdldElucHV0TW91c2VEb3duIiwic2V0SW5wdXRNb3VzZURvd24iLCJvbkludGVybmFsSW5wdXRLZXlEb3duIiwid2hpY2giLCJLZXlDb2RlIiwiVVAiLCJET1dOIiwiRU5URVIiLCJpc1ZhbGlkYXRlT3BlbktleSIsIm9uSW50ZXJuYWxJbnB1dE1vdXNlRG93biIsInBhc3RlZFRleHRSZWYiLCJ0cmlnZ2VyT25TZWFyY2giLCJ0ZXN0IiwicmVwbGFjZWRUZXh0IiwiY2xpcGJvYXJkRGF0YSIsImdldERhdGEiLCJpc0lFIiwibXNUb3VjaEFjdGlvbiIsImlucHV0TW91c2VEb3duIiwic2hhcmVkUHJvcHMiLCJzZWxlY3ROb2RlIiwiTXVsdGlwbGVTZWxlY3RvciIsIkZvcndhcmRTZWxlY3RvciIsIlBvcnRhbCIsImlzUG9pbnRzRXEiLCJnZXRBbGlnbkZyb21QbGFjZW1lbnQiLCJwbGFjZW1lbnRzIiwiZ2V0TW90aW9uIiwiTWFzayIsInpJbmRleCIsIm1hc2siLCJtYXNrTW90aW9uIiwibWFza0FuaW1hdGlvbiIsIm1hc2tUcmFuc2l0aW9uTmFtZSIsIm1vdGlvbkFwcGVhciIsImdldENsaWVudFBvc2l0aW9uIiwiZ2V0T2Zmc2V0IiwiY3MiLCJMRUZUIiwib2Zmc2V0IiwiaiIsImdldFBhcmVudCIsInBhcmVudCIsInV0aWxzIiwibWVyZ2UiLCJ0YXJnZXRPZmZzZXQiLCJpc0VxdWFsIiwiYnVmZmVyIiwiaXNTYW1lUG9pbnQiLCJyZXN0b3JlRm9jdXMiLCJyZXNpemVPYnNlcnZlciIsImdldFBvaW50IiwiQWxpZ24iLCJhZGRFdmVudExpc3RlbmVyIiwiUG9wdXBJbm5lciIsInN0cmV0Y2giLCJkZXN0cm95UG9wdXBPbkhpZGUiLCJhbGlnbiIsInBvaW50IiwiZ2V0Um9vdERvbU5vZGUiLCJnZXRDbGFzc05hbWVGcm9tQWxpZ24iLCJvbkFsaWduIiwib25Nb3VzZUVudGVyIiwib25Nb3VzZUxlYXZlIiwib25Ub3VjaFN0YXJ0IiwiYWxpZ25SZWYiLCJhbGlnbmVkQ2xhc3NOYW1lIiwic2V0QWxpZ25lZENsYXNzTmFtZSIsIl91c2VTdHJldGNoU3R5bGUiLCJ1c2VTdHJldGNoU3R5bGUiLCJfdXNlU3RyZXRjaFN0eWxlMiIsInN0cmV0Y2hTdHlsZSIsIm1lYXN1cmVTdHJldGNoU3R5bGUiLCJkb01lYXN1cmUiLCJfdXNlVmlzaWJsZVN0YXR1cyIsInVzZVZpc2libGVTdGF0dXMiLCJfdXNlVmlzaWJsZVN0YXR1czIiLCJnb05leHRTdGF0dXMiLCJhbGlnblRpbWVzIiwic2V0QWxpZ25UaW1lcyIsInByZXBhcmVSZXNvbHZlUmVmIiwiZ2V0QWxpZ25UYXJnZXQiLCJmb3JjZUFsaWduIiwiX2FsaWduUmVmJGN1cnJlbnQiLCJvbkludGVybmFsQWxpZ24iLCJwb3B1cERvbU5vZGUiLCJtYXRjaEFsaWduIiwibmV4dEFsaWduZWRDbGFzc05hbWUiLCJfcHJlcGFyZVJlc29sdmVSZWYkY3UiLCJldmVudE5hbWUiLCJvcmlnaW5IYW5kbGVyIiwib25TaG93UHJlcGFyZSIsIm1lcmdlZFN0eWxlIiwiYWxpZ25EaXNhYmxlZCIsInBvaW50cyIsIkNoaWxkcmVuIiwibW90aW9uUmVmIiwibWVyZ2VkQ2xhc3NOYW1lIiwiTW9iaWxlUG9wdXBJbm5lciIsIl9wcm9wcyRtb2JpbGUiLCJtb2JpbGUiLCJwb3B1cENsYXNzTmFtZSIsInBvcHVwU3R5bGUiLCJfcHJvcHMkbW9iaWxlJHBvcHVwTW8iLCJwb3B1cE1vdGlvbiIsInBvcHVwUmVuZGVyIiwiUG9wdXAiLCJpbm5lclZpc2libGUiLCJzZXJJbm5lclZpc2libGUiLCJpbk1vYmlsZSIsInNldEluTW9iaWxlIiwiY2xvbmVQcm9wcyIsImlzTW9iaWxlIiwicG9wdXBOb2RlIiwibm9vcCIsInJldHVybkVtcHR5U3RyaW5nIiwicmV0dXJuRG9jdW1lbnQiLCJvd25lckRvY3VtZW50IiwiQUxMX0hBTkRMRVJTIiwiZ2VuZXJhdGVUcmlnZ2VyIiwiUG9ydGFsQ29tcG9uZW50IiwiVHJpZ2dlciIsImNyZWF0ZVJlZiIsIm1vdXNlRW50ZXJEZWxheSIsImZpcmVFdmVudHMiLCJkZWxheVNldFBvcHVwVmlzaWJsZSIsInNldFBvaW50IiwibW91c2VMZWF2ZURlbGF5IiwiY2xlYXJEZWxheVRpbWVyIiwiX3RoaXMkcG9wdXBSZWYkY3VycmVuIiwicmVsYXRlZFRhcmdldCIsInBvcHVwUmVmIiwiaXNGb2N1c1RvU2hvdyIsImZvY3VzVGltZSIsImZvY3VzRGVsYXkiLCJwcmVDbGlja1RpbWUiLCJwcmVUb3VjaFRpbWUiLCJpc0JsdXJUb0hpZGUiLCJibHVyRGVsYXkiLCJzZXRQb3B1cFZpc2libGUiLCJpc0NvbnRleHRNZW51VG9TaG93IiwicHJlVGltZSIsImFicyIsImlzQ2xpY2tUb1Nob3ciLCJpc0NsaWNrVG9IaWRlIiwibmV4dFZpc2libGUiLCJwb3B1cFZpc2libGUiLCJoYXNQb3B1cE1vdXNlRG93biIsIm1vdXNlRG93blRpbWVvdXQiLCJfdGhpcyRjb250ZXh0Iiwib25Qb3B1cE1vdXNlRG93biIsIm1hc2tDbG9zYWJsZSIsImdldFBvcHVwRG9tTm9kZSIsImlzQ29udGV4dE1lbnVPbmx5IiwiZ2V0VHJpZ2dlckRPTU5vZGUiLCJ0cmlnZ2VyUmVmIiwiZG9tTm9kZSIsImVyciIsInBvcHVwUGxhY2VtZW50IiwiYnVpbHRpblBsYWNlbWVudHMiLCJhbGlnblBvaW50IiwiZ2V0UG9wdXBDbGFzc05hbWVGcm9tQWxpZ24iLCJnZXRBbGlnblBvcHVwQ2xhc3NOYW1lIiwib25Qb3B1cEFsaWduIiwicG9wdXBBbmltYXRpb24iLCJwb3B1cFRyYW5zaXRpb25OYW1lIiwicG9wdXAiLCJvblBvcHVwQ2xpY2siLCJfdGhpcyRzdGF0ZSIsImdldFBvcHVwQWxpZ24iLCJtb3VzZVByb3BzIiwiaXNNb3VzZUVudGVyVG9TaG93Iiwib25Qb3B1cE1vdXNlRW50ZXIiLCJpc01vdXNlTGVhdmVUb0hpZGUiLCJvblBvcHVwTW91c2VMZWF2ZSIsInBvcHVwQ29udGFpbmVyIiwiY2FuY2VsIiwiYXR0YWNoSWQiLCJnZXREb2N1bWVudCIsIm1vdW50Tm9kZSIsImF0dGFjaFBhcmVudCIsInBvcnRhbENvbnRhaW5lciIsInBhZ2VYIiwicGFnZVkiLCJwcmV2UG9wdXBWaXNpYmxlIiwiYWZ0ZXJQb3B1cFZpc2libGVDaGFuZ2UiLCJfcG9wdXBWaXNpYmxlIiwiZGVmYXVsdFBvcHVwVmlzaWJsZSIsImN1cnJlbnREb2N1bWVudCIsImNsaWNrT3V0c2lkZUhhbmRsZXIiLCJvbkRvY3VtZW50Q2xpY2siLCJ0b3VjaE91dHNpZGVIYW5kbGVyIiwiY29udGV4dE1lbnVPdXRzaWRlSGFuZGxlcjEiLCJvbkNvbnRleHRNZW51Q2xvc2UiLCJjb250ZXh0TWVudU91dHNpZGVIYW5kbGVyMiIsImNsZWFyT3V0c2lkZUhhbmRsZXIiLCJfdGhpcyRwb3B1cFJlZiRjdXJyZW4yIiwicG9wdXBBbGlnbiIsIm9uUG9wdXBWaXNpYmxlQ2hhbmdlIiwiZGVsYXlTIiwiZGVsYXkiLCJkZWxheVRpbWVyIiwiY3JlYXRlVHdvQ2hhaW5zIiwiY2hpbGRQcm9zIiwiYWN0aW9uIiwic2hvd0FjdGlvbiIsImhpZGVBY3Rpb24iLCJfdGhpcyRwcm9wczgiLCJfdGhpcyRwcm9wczkiLCJfdGhpcyRwcm9wczEwIiwiZm9yY2VQb3B1cEFsaWduIiwiX3RoaXMkcG9wdXBSZWYkY3VycmVuMyIsImNoaWxkQ2FsbGJhY2siLCJfdGhpcyRwcm9wczExIiwiYXV0b0Rlc3Ryb3kiLCJvbmx5IiwibmV3Q2hpbGRQcm9wcyIsIm9uQ29udGV4dE1lbnUiLCJvbk1vdXNlTW92ZSIsImNoaWxkcmVuQ2xhc3NOYW1lIiwicG9ydGFsIiwiaGFuZGxlUG9ydGFsVXBkYXRlIiwiZ2V0Q29tcG9uZW50IiwidHJpZ2dlckNvbnRleHRWYWx1ZSIsInByZXZTdGF0ZSIsIm5ld1N0YXRlIiwiVHJpZ2dlckNvbnRleHQiLCJnZXRCdWlsdEluUGxhY2VtZW50cyIsImFkanVzdFgiLCJib3R0b21MZWZ0Iiwib3ZlcmZsb3ciLCJhZGp1c3RZIiwiYm90dG9tUmlnaHQiLCJ0b3BMZWZ0IiwidG9wUmlnaHQiLCJTZWxlY3RUcmlnZ2VyIiwicG9wdXBFbGVtZW50IiwiZHJvcGRvd25TdHlsZSIsImRyb3Bkb3duQ2xhc3NOYW1lIiwiX3Byb3BzJGRpcmVjdGlvbiIsImRyb3Bkb3duUmVuZGVyIiwiZHJvcGRvd25BbGlnbiIsImVtcHR5IiwiZHJvcGRvd25QcmVmaXhDbHMiLCJidWlsdEluUGxhY2VtZW50cyIsIm1lcmdlZFRyYW5zaXRpb25OYW1lIiwiZ2V0UG9wdXBFbGVtZW50IiwibWluV2lkdGgiLCJSZWZTZWxlY3RUcmlnZ2VyIiwiZmlsbEZpZWxkTmFtZXMiLCJsaXN0IiwiREVGQVVMVF9PTUlUX1BST1BTIiwiaXNNdWx0aXBsZSIsIkJhc2VTZWxlY3QiLCJfY3VzdG9taXplUmF3SW5wdXRFbGUiLCJfY2xhc3NOYW1lczIiLCJvbWl0RG9tUHJvcHMiLCJkaXNwbGF5VmFsdWVzIiwib25EaXNwbGF5VmFsdWVzQ2hhbmdlIiwiZW1wdHlPcHRpb25zIiwiX3Byb3BzJG5vdEZvdW5kQ29udGVuIiwibm90Rm91bmRDb250ZW50Iiwib25DbGVhciIsImdldElucHV0RWxlbWVudCIsImdldFJhd0lucHV0RWxlbWVudCIsImRlZmF1bHRPcGVuIiwib25Ecm9wZG93blZpc2libGVDaGFuZ2UiLCJvbkFjdGl2ZVZhbHVlQ2hhbmdlIiwib25TZWFyY2hTcGxpdCIsInRva2VuU2VwYXJhdG9ycyIsImFsbG93Q2xlYXIiLCJzaG93QXJyb3ciLCJpbnB1dEljb24iLCJjbGVhckljb24iLCJPcHRpb25MaXN0IiwiX3Byb3BzJHNob3dBY3Rpb24iLCJvbktleVVwIiwibXVsdGlwbGUiLCJtZXJnZWRTaG93U2VhcmNoIiwiZG9tUHJvcHMiLCJzZXRNb2JpbGUiLCJjb250YWluZXJSZWYiLCJzZWxlY3RvckRvbVJlZiIsInNlbGVjdG9yUmVmIiwibGlzdFJlZiIsIl91c2VEZWxheVJlc2V0IiwidXNlRGVsYXlSZXNldCIsIl91c2VEZWxheVJlc2V0MiIsIm1vY2tGb2N1c2VkIiwic2V0TW9ja0ZvY3VzZWQiLCJjYW5jZWxTZXRNb2NrRm9jdXNlZCIsIl9zZWxlY3RvclJlZiRjdXJyZW50IiwiX3NlbGVjdG9yUmVmJGN1cnJlbnQyIiwiYXJnIiwiX2xpc3RSZWYkY3VycmVudCIsIm1lcmdlZFNlYXJjaFZhbHVlIiwiX2Rpc3BsYXlWYWx1ZXMkIiwiY3VzdG9taXplSW5wdXRFbGVtZW50IiwiY3VzdG9taXplUmF3SW5wdXRFbGVtZW50IiwiY3VzdG9taXplUmF3SW5wdXRSZWYiLCJ1c2VDb21wb3NlUmVmIiwiX3VzZU1lcmdlZFN0YXRlIiwidXNlTWVyZ2VkU3RhdGUiLCJfdXNlTWVyZ2VkU3RhdGUyIiwiaW5uZXJPcGVuIiwic2V0SW5uZXJPcGVuIiwibWVyZ2VkT3BlbiIsImVtcHR5TGlzdENvbnRlbnQiLCJ0cmlnZ2VyT3BlbiIsIm5ld09wZW4iLCJuZXh0T3BlbiIsInRva2VuU2VwYXJhdG9yIiwib25JbnRlcm5hbFNlYXJjaCIsInNlYXJjaFRleHQiLCJmcm9tVHlwaW5nIiwiaXNDb21wb3NpdGluZyIsInJldCIsIm5ld1NlYXJjaFRleHQiLCJwYXRjaExhYmVscyIsImdldFNlcGFyYXRlZENvbnRlbnQiLCJvbkludGVybmFsU2VhcmNoU3VibWl0IiwidHJpbSIsImdldENsZWFyTG9jayIsInNldENsZWFyTG9jayIsIm9uSW50ZXJuYWxLZXlEb3duIiwiY2xlYXJMb2NrIiwiQkFDS1NQQUNFIiwiY2xvbmVEaXNwbGF5VmFsdWVzIiwicmVtb3ZlZERpc3BsYXlWYWx1ZSIsIl9saXN0UmVmJGN1cnJlbnQyIiwib25JbnRlcm5hbEtleVVwIiwiX2xlbjIiLCJfa2V5MiIsIl9saXN0UmVmJGN1cnJlbnQzIiwib25TZWxlY3RvclJlbW92ZSIsIm5ld1ZhbHVlcyIsImZvY3VzUmVmIiwib25Db250YWluZXJGb2N1cyIsIm9uQ29udGFpbmVyQmx1ciIsImFjdGl2ZVRpbWVvdXRJZHMiLCJ0aW1lb3V0SWQiLCJvbkludGVybmFsTW91c2VEb3duIiwiX3RyaWdnZXJSZWYkY3VycmVudCIsImFjdGl2ZUVsZW1lbnQiLCJfc2VsZWN0b3JSZWYkY3VycmVudDMiLCJfbGVuMyIsInJlc3RBcmdzIiwiX2tleTMiLCJfUmVhY3QkdXNlU3RhdGUzIiwiX1JlYWN0JHVzZVN0YXRlNCIsIl9SZWFjdCR1c2VTdGF0ZTUiLCJfUmVhY3QkdXNlU3RhdGU2IiwiX2NvbnRhaW5lclJlZiRjdXJyZW50IiwibmV3V2lkdGgiLCJjZWlsIiwiaXNOYU4iLCJvblRyaWdnZXJWaXNpYmxlQ2hhbmdlIiwidXNlU2VsZWN0VHJpZ2dlckNvbnRyb2wiLCJfdHJpZ2dlclJlZiRjdXJyZW50MiIsImJhc2VTZWxlY3RDb250ZXh0IiwidG9nZ2xlT3BlbiIsIm1lcmdlZFNob3dBcnJvdyIsImFycm93Tm9kZSIsImNsZWFyTm9kZSIsIm9uQ2xlYXJNb3VzZURvd24iLCJfc2VsZWN0b3JSZWYkY3VycmVudDQiLCJvcHRpb25MaXN0Iiwic2VsZWN0b3JOb2RlIiwicmVuZGVyTm9kZSIsInV1aWQiLCJnZXRVVUlEIiwidXNlSWQiLCJjb252ZXJ0Q2hpbGRyZW5Ub0RhdGEiLCJzZXRMYWJlbE9wdGlvbnMiLCJ1c2VSZWZGdW5jIiwiT3B0R3JvdXAiLCJPcHRpb24iLCJGaWxsZXIiLCJvbklubmVyUmVzaXplIiwiaW5uZXJQcm9wcyIsIm91dGVyU3R5bGUiLCJpbm5lclN0eWxlIiwiZmxleERpcmVjdGlvbiIsIk1JTl9TSVpFIiwiZ2V0UGFnZVkiLCJ0b3VjaGVzIiwiU2Nyb2xsQmFyIiwibW92ZVJhZiIsInNjcm9sbGJhclJlZiIsInRodW1iUmVmIiwidmlzaWJsZVRpbWVvdXQiLCJkcmFnZ2luZyIsInN0YXJ0VG9wIiwiZGVsYXlIaWRkZW4iLCJvblNjcm9sbGJhclRvdWNoU3RhcnQiLCJvbkNvbnRhaW5lck1vdXNlRG93biIsInBhdGNoRXZlbnRzIiwib25Nb3VzZVVwIiwicmVtb3ZlRXZlbnRzIiwiX3RoaXMkc2Nyb2xsYmFyUmVmJGN1IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIm9uU3RhcnRNb3ZlIiwiZ2V0VG9wIiwib25TY3JvbGwiLCJvZmZzZXRZIiwibmV3VG9wIiwiZW5hYmxlU2Nyb2xsUmFuZ2UiLCJnZXRFbmFibGVTY3JvbGxSYW5nZSIsImVuYWJsZUhlaWdodFJhbmdlIiwiZ2V0RW5hYmxlSGVpZ2h0UmFuZ2UiLCJwdGciLCJuZXdTY3JvbGxUb3AiLCJvblN0b3BNb3ZlIiwiZ2V0U3BpbkhlaWdodCIsImJhc2VIZWlnaHQiLCJzY3JvbGxIZWlnaHQiLCJzcGluSGVpZ2h0Iiwic2Nyb2xsVG9wIiwic2hvd1Njcm9sbCIsIl90aGlzJHN0YXRlMiIsImNhblNjcm9sbCIsInNjcm9sbEJhckRpcmVjdGlvbiIsImJhY2tncm91bmQiLCJib3JkZXJSYWRpdXMiLCJjdXJzb3IiLCJ1c2VDaGlsZHJlbiIsInN0YXJ0SW5kZXgiLCJlbmRJbmRleCIsInJlbmRlckZ1bmMiLCJlbGVJbmRleCIsInNldFJlZiIsIkNhY2hlTWFwIiwic3luY1Njcm9sbCIsIm9uVG91Y2hNb3ZlIiwib25Ub3VjaEVuZCIsImNsZWFuVXBFdmVudHMiLCJFTVBUWV9EQVRBIiwiU2Nyb2xsU3R5bGUiLCJvdmVyZmxvd0FuY2hvciIsIlJhd0xpc3QiLCJpdGVtSGVpZ2h0IiwiX3Byb3BzJGZ1bGxIZWlnaHQiLCJmdWxsSGVpZ2h0IiwidXNlVmlydHVhbCIsImluVmlydHVhbCIsInNldFNjcm9sbFRvcCIsInNjcm9sbE1vdmluZyIsInNldFNjcm9sbE1vdmluZyIsImNvbXBvbmVudFJlZiIsImZpbGxlcklubmVyUmVmIiwic2Nyb2xsQmFyUmVmIiwic2hhcmVkQ29uZmlnIiwic3luY1Njcm9sbFRvcCIsImFsaWduZWRUb3AiLCJrZWVwSW5SYW5nZSIsInJhbmdlUmVmIiwic3RhcnQiLCJlbmQiLCJkaWZmSXRlbVJlZiIsIl91c2VEaWZmSXRlbSIsInVzZURpZmZJdGVtIiwiX3VzZURpZmZJdGVtMiIsImRpZmZJdGVtIiwiX3VzZUhlaWdodHMiLCJ1c2VIZWlnaHRzIiwiX3VzZUhlaWdodHMyIiwic2V0SW5zdGFuY2VSZWYiLCJjb2xsZWN0SGVpZ2h0IiwiaGVpZ2h0cyIsImhlaWdodFVwZGF0ZWRNYXJrIiwiX1JlYWN0JHVzZU1lbW8iLCJfZmlsbGVySW5uZXJSZWYkY3VycmUiLCJpdGVtVG9wIiwic3RhcnRPZmZzZXQiLCJkYXRhTGVuIiwiY2FjaGVIZWlnaHQiLCJjdXJyZW50SXRlbUJvdHRvbSIsIm1heFNjcm9sbEhlaWdodCIsIm1heFNjcm9sbEhlaWdodFJlZiIsImlzU2Nyb2xsQXRUb3AiLCJpc1Njcm9sbEF0Qm90dG9tIiwib3JpZ2luU2Nyb2xsIiwidXNlT3JpZ2luU2Nyb2xsIiwib25TY3JvbGxCYXIiLCJvbkZhbGxiYWNrU2Nyb2xsIiwiY3VycmVudFRhcmdldCIsIl91c2VGcmFtZVdoZWVsIiwidXNlRnJhbWVXaGVlbCIsIl91c2VGcmFtZVdoZWVsMiIsIm9uUmF3V2hlZWwiLCJvbkZpcmVGb3hTY3JvbGwiLCJ1c2VNb2JpbGVUb3VjaE1vdmUiLCJkZWx0YVkiLCJzbW9vdGhPZmZzZXQiLCJvbk1vek1vdXNlUGl4ZWxTY3JvbGwiLCJ1c2VTY3JvbGxUbyIsIl9zY3JvbGxCYXJSZWYkY3VycmVudCIsInJlbmRlckxpc3QiLCJsaXN0Q2hpbGRyZW4iLCJjb21wb25lbnRTdHlsZSIsIl91c2VCYXNlUHJvcHMiLCJ1c2VCYXNlUHJvcHMiLCJvblBvcHVwU2Nyb2xsIiwiU2VsZWN0Q29udGV4dCIsImZsYXR0ZW5PcHRpb25zIiwib25BY3RpdmVWYWx1ZSIsImRlZmF1bHRBY3RpdmVGaXJzdE9wdGlvbiIsIm9uU2VsZWN0IiwibWVudUl0ZW1TZWxlY3RlZEljb24iLCJyYXdWYWx1ZXMiLCJmaWVsZE5hbWVzIiwibGlzdEhlaWdodCIsImxpc3RJdGVtSGVpZ2h0IiwibWVtb0ZsYXR0ZW5PcHRpb25zIiwib25MaXN0TW91c2VEb3duIiwic2Nyb2xsSW50b1ZpZXciLCJnZXRFbmFibGVkQWN0aXZlSW5kZXgiLCJfbWVtb0ZsYXR0ZW5PcHRpb25zJGMiLCJncm91cCIsImFjdGl2ZUluZGV4Iiwic2V0QWN0aXZlSW5kZXgiLCJzZXRBY3RpdmUiLCJmcm9tS2V5Ym9hcmQiLCJmbGF0dGVuSXRlbSIsImlzU2VsZWN0ZWQiLCJvblNlbGVjdFZhbHVlIiwic2VsZWN0ZWQiLCJjdHJsS2V5IiwiTiIsImlzUGxhdGZvcm1NYWMiLCJuZXh0QWN0aXZlSW5kZXgiLCJFU0MiLCJvbWl0RmllbGROYW1lTGlzdCIsImdldExhYmVsIiwiaXRlbURhdGEiLCJtZXJnZWRMYWJlbCIsIml0ZW1JbmRleCIsImdyb3VwT3B0aW9uIiwiX2RhdGEkdGl0bGUiLCJncm91cFRpdGxlIiwib3RoZXJQcm9wcyIsInBhc3NlZFByb3BzIiwib21pdCIsIm9wdGlvblByZWZpeENscyIsIm9wdGlvbkNsYXNzTmFtZSIsImljb25WaXNpYmxlIiwib3B0aW9uVGl0bGUiLCJSZWZPcHRpb25MaXN0IiwiT01JVF9ET01fUFJPUFMiLCJpc1Jhd1ZhbHVlIiwiU2VsZWN0IiwiYmFja2ZpbGwiLCJfcHJvcHMkYXV0b0NsZWFyU2VhcmMiLCJvbkRlc2VsZWN0IiwiX3Byb3BzJGRyb3Bkb3duTWF0Y2hTIiwiZmlsdGVyT3B0aW9uIiwiZmlsdGVyU29ydCIsIm9wdGlvbkZpbHRlclByb3AiLCJvcHRpb25MYWJlbFByb3AiLCJfcHJvcHMkbGlzdEhlaWdodCIsIl9wcm9wcyRsaXN0SXRlbUhlaWdodCIsImxhYmVsSW5WYWx1ZSIsIm1lcmdlZElkIiwiY2hpbGRyZW5Bc0RhdGEiLCJtZXJnZWRGaWx0ZXJPcHRpb24iLCJtZXJnZWRGaWVsZE5hbWVzIiwiSlNPTiIsInBvc3RTdGF0ZSIsInNlYXJjaCIsInNldFNlYXJjaFZhbHVlIiwicGFyc2VkT3B0aW9ucyIsInVzZU9wdGlvbnMiLCJ2YWx1ZU9wdGlvbnMiLCJsYWJlbE9wdGlvbnMiLCJtZXJnZWRPcHRpb25zIiwiY29udmVydDJMYWJlbFZhbHVlcyIsImRyYWZ0VmFsdWVzIiwidmFsdWVMaXN0IiwicmF3VmFsdWUiLCJyYXdMYWJlbCIsInJhd0tleSIsInJhd0Rpc2FibGVkIiwicmF3VGl0bGUiLCJfdmFsJHZhbHVlIiwib3B0aW9uIiwiX29wdGlvbiRrZXkiLCJfdXNlTWVyZ2VkU3RhdGUzIiwiX3VzZU1lcmdlZFN0YXRlNCIsImludGVybmFsVmFsdWUiLCJzZXRJbnRlcm5hbFZhbHVlIiwicmF3TGFiZWxlZFZhbHVlcyIsIl92YWx1ZXMkIiwiX3VzZUNhY2hlIiwidXNlQ2FjaGUiLCJfdXNlQ2FjaGUyIiwibWVyZ2VkVmFsdWVzIiwiZ2V0TWl4ZWRPcHRpb24iLCJmaXJzdFZhbHVlIiwiX2l0ZW0kbGFiZWwiLCJfbWVyZ2VkVmFsdWVzJCIsInN0clZhbHVlIiwiY3JlYXRlVGFnT3B0aW9uIiwiZmlsbGVkVGFnT3B0aW9ucyIsImNsb25lT3B0aW9ucyIsImV4aXN0T3B0aW9ucyIsInNvcnQiLCJhIiwiZmlsdGVyZWRPcHRpb25zIiwidXNlRmlsdGVyT3B0aW9ucyIsImZpbGxlZFNlYXJjaE9wdGlvbnMiLCJvcmRlcmVkRmlsdGVyZWRPcHRpb25zIiwiZGlzcGxheU9wdGlvbnMiLCJ0cmlnZ2VyQ2hhbmdlIiwibGFiZWxlZFZhbHVlcyIsIm5ld1ZhbCIsIl9tZXJnZWRWYWx1ZXMkaW5kZXgiLCJyZXR1cm5WYWx1ZXMiLCJyZXR1cm5PcHRpb25zIiwiaW5qZWN0UHJvcHNXaXRoT3B0aW9uIiwic2V0QWN0aXZlVmFsdWUiLCJhY2Nlc3NpYmlsaXR5SW5kZXgiLCJzZXRBY2Nlc3NpYmlsaXR5SW5kZXgiLCJtZXJnZWREZWZhdWx0QWN0aXZlRmlyc3RPcHRpb24iLCJhY3RpdmUiLCJfcmVmMiRzb3VyY2UiLCJ0cmlnZ2VyU2VsZWN0IiwiZ2V0U2VsZWN0RW50IiwiX29wdGlvbiRrZXkyIiwiX2dldFNlbGVjdEVudCIsIl9nZXRTZWxlY3RFbnQyIiwid3JhcHBlZFZhbHVlIiwiX29wdGlvbiIsIl9nZXRTZWxlY3RFbnQzIiwiX2dldFNlbGVjdEVudDQiLCJfd3JhcHBlZFZhbHVlIiwiX29wdGlvbjIiLCJvbkludGVybmFsU2VsZWN0IiwiY2xvbmVWYWx1ZXMiLCJtZXJnZWRTZWxlY3QiLCJuZXh0VmFsdWVzIiwiZm9ybWF0dGVkIiwibmV3UmF3VmFsdWVzIiwib25JbnRlcm5hbFNlYXJjaFNwbGl0Iiwid29yZHMiLCJwYXRjaFZhbHVlcyIsIndvcmQiLCJvcHQiLCJuZXdSYXdWYWx1ZSIsInNlbGVjdENvbnRleHQiLCJyZWFsVmlydHVhbCIsIlR5cGVkU2VsZWN0IiwiRW1wdHkiLCJTaW1wbGUiLCJfX3Jlc3QiLCJzIiwiaGFzT3duUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsImRlZmF1bHRFbXB0eUltZyIsInNpbXBsZUVtcHR5SW1nIiwiX2EkaW1hZ2UiLCJpbWFnZSIsImltYWdlU3R5bGUiLCJjb250ZXh0TG9jYWxlIiwiZGVzIiwiYWx0IiwiaW1hZ2VOb2RlIiwiUFJFU0VOVEVEX0lNQUdFX0RFRkFVTFQiLCJQUkVTRU5URURfSU1BR0VfU0lNUExFIiwiZGVmYXVsdFJlbmRlckVtcHR5IiwiY29tcG9uZW50TmFtZSIsInByZWZpeCIsImxhYmVsQWxpZ24iLCJ2ZXJ0aWNhbCIsIml0ZW1SZWYiLCJOb1N0eWxlSXRlbUNvbnRleHQiLCJwcm92aWRlclByb3BzIiwiRm9ybUl0ZW1QcmVmaXhDb250ZXh0IiwiRm9ybUl0ZW1JbnB1dENvbnRleHQiLCJOb0Zvcm1TdHlsZSIsIm92ZXJyaWRlIiwiZm9ybUl0ZW1JbnB1dENvbnRleHQiLCJuZXdGb3JtSXRlbUlucHV0Q29udGV4dCIsIm5ld0NvbnRleHQiLCJpc0Zvcm1JdGVtSW5wdXQiLCJoYXNGZWVkYmFjayIsImZlZWRiYWNrSWNvbiIsInR1cGxlIiwiZ2V0Q29sbGFwc2VkSGVpZ2h0IiwiZ2V0UmVhbEhlaWdodCIsImdldEN1cnJlbnRIZWlnaHQiLCJza2lwT3BhY2l0eVRyYW5zaXRpb24iLCJnZXRUcmFuc2l0aW9uRGlyZWN0aW9uIiwiZ2V0TWVyZ2VkU3RhdHVzIiwiQ2hlY2tPdXRsaW5lZCIsIkNoZWNrT3V0bGluZWRTdmciLCJEb3duT3V0bGluZWQiLCJEb3duT3V0bGluZWRTdmciLCJTZWFyY2hPdXRsaW5lZCIsIlNlYXJjaE91dGxpbmVkU3ZnIiwiZ2V0SWNvbnMiLCJzdWZmaXhJY29uIiwibWVyZ2VkQ2xlYXJJY29uIiwiZ2V0U3VmZml4SWNvbk5vZGUiLCJhcnJvd0ljb24iLCJtZXJnZWRTdWZmaXhJY29uIiwiaWNvbkNscyIsIm1lcmdlZEl0ZW1JY29uIiwibWVyZ2VkUmVtb3ZlSWNvbiIsIml0ZW1JY29uIiwiU3BhY2VDb21wYWN0SXRlbUNvbnRleHQiLCJ1c2VDb21wYWN0SXRlbUNvbnRleHQiLCJjb21wYWN0SXRlbUNvbnRleHQiLCJjb21wYWN0SXRlbUNsYXNzbmFtZXMiLCJjb21wYWN0RGlyZWN0aW9uIiwiaXNGaXJzdEl0ZW0iLCJpc0xhc3RJdGVtIiwic2VwYXJhdG9yIiwiY29tcGFjdFNpemUiLCJOb0NvbXBhY3RTdHlsZSIsIkNvbXBhY3RJdGVtIiwiQ29tcGFjdCIsImRpcmVjdGlvbkNvbmZpZyIsIl9wcm9wcyRzaXplIiwiYmxvY2siLCJjbHgiLCJub2RlcyIsIlNFQ1JFVF9DT01CT0JPWF9NT0RFX0RPX05PVF9VU0UiLCJJbnRlcm5hbFNlbGVjdCIsIl9hJGJvcmRlcmVkIiwiYm9yZGVyZWQiLCJfYSRsaXN0SGVpZ2h0IiwiX2EkbGlzdEl0ZW1IZWlnaHQiLCJjdXN0b21pemVTaXplIiwiY3VzdG9tRGlzYWJsZWQiLCJjdXN0b21TdGF0dXMiLCJyZW5kZXJFbXB0eSIsIl91c2VDb21wYWN0SXRlbUNvbnRleCIsImNvbnRleHRTdGF0dXMiLCJtZXJnZWRTdGF0dXMiLCJtZXJnZWROb3RGb3VuZCIsIl9nZXRJY29ucyIsInNlbGVjdFByb3BzIiwicmNTZWxlY3RSdGxEcm9wZG93bkNsYXNzTmFtZSIsIm1lcmdlZFNpemUiLCJtZXJnZWREaXNhYmxlZCIsImdldFN0YXR1c0NsYXNzTmFtZXMiLCJnZXRQbGFjZW1lbnQiLCJSY1NlbGVjdCIsImxpc3RlbmVyIiwiYXV0b0FkanVzdE92ZXJmbG93IiwiYXJyb3dDb250ZW50Iiwib3ZlcmxheUlubmVyU3R5bGUiLCJUb29sdGlwIiwib3ZlcmxheUNsYXNzTmFtZSIsIl9wcm9wcyR0cmlnZ2VyIiwiX3Byb3BzJG1vdXNlRW50ZXJEZWxhIiwiX3Byb3BzJG1vdXNlTGVhdmVEZWxhIiwib3ZlcmxheVN0eWxlIiwiYWZ0ZXJWaXNpYmxlQ2hhbmdlIiwiX3Byb3BzJHBsYWNlbWVudCIsIl9wcm9wcyRhbGlnbiIsIl9wcm9wcyRkZXN0cm95VG9vbHRpcCIsImRlc3Ryb3lUb29sdGlwT25IaWRlIiwiZGVmYXVsdFZpc2libGUiLCJnZXRUb29sdGlwQ29udGFpbmVyIiwib3ZlcmxheSIsImV4dHJhUHJvcHMiLCJkZXN0cm95VG9vbHRpcCIsImtlZXBQYXJlbnQiLCJzcGxpdE9iamVjdCIsInBpY2tlZCIsIm9taXR0ZWQiLCJQcmVzZXRDb2xvclJlZ2V4IiwiUmVnRXhwIiwiUHJlc2V0Q29sb3JUeXBlcyIsImdldERpc2FibGVkQ29tcGF0aWJsZUNoaWxkcmVuIiwiZWxlbWVudFR5cGUiLCJfX0FOVF9CVVRUT04iLCJfX0FOVF9TV0lUQ0giLCJfX0FOVF9SQURJTyIsIl9zcGxpdE9iamVjdCIsInNwYW5TdHlsZSIsImJ1dHRvblN0eWxlIiwic2V0T3BlbiIsImlzTm9UaXRsZSIsIm9uT3BlbkNoYW5nZSIsInZpcyIsImdldFRvb2x0aXBQbGFjZW1lbnRzIiwiX3Byb3BzJGFycm93UG9pbnRBdENlIiwiYXJyb3dQb2ludEF0Q2VudGVyIiwiX3Byb3BzJGF1dG9BZGp1c3RPdmVyIiwiZ2V0UGxhY2VtZW50cyIsInJlY3QiLCJ0cmFuc2Zvcm1PcmlnaW4iLCJnZXRPdmVybGF5Iiwib3BlbkNsYXNzTmFtZSIsInRlbXBPcGVuIiwiY2hpbGRDbHMiLCJjdXN0b21PdmVybGF5Q2xhc3NOYW1lIiwiZm9ybWF0dGVkT3ZlcmxheUlubmVyU3R5bGUiLCJhcnJvd0NvbnRlbnRTdHlsZSIsIlJjVG9vbHRpcCIsIm1vdGlvbkRlYWRsaW5lIiwiZ2V0UmVuZGVyUHJvcFZhbHVlIiwiT3ZlcmxheSIsIlBvcG92ZXIiLCJfb3ZlcmxheSIsIl9wcm9wcyRvdmVybGF5U3R5bGUiLCJFbGxpcHNpc091dGxpbmVkIiwiRWxsaXBzaXNPdXRsaW5lZFN2ZyIsIk1lbnVDb250ZXh0IiwibWVyZ2VQcm9wcyIsIkluaGVyaXRhYmxlQ29udGV4dFByb3ZpZGVyIiwibG9ja2VkIiwiaW5oZXJpdGFibGVDb250ZXh0IiwiaW5saW5lIiwidXNlQWNjZXNzaWJpbGl0eSIsImdldEtleXMiLCJjbGVhblJhZiIsInJlZnJlc2hFbGVtZW50cyIsInRyeUZvY3VzIiwibGluayIsInRhcmdldEVsZW1lbnQiLCJnZXRQYXRoU3RyIiwiZ2V0UGF0aEtleXMiLCJMZWdhY3lNZW51SXRlbSIsImF0dHJpYnV0ZSIsIkludGVybmFsTWVudUl0ZW0iLCJldmVudEtleSIsIndhcm5LZXkiLCJkb21EYXRhSWQiLCJ1c2VNZW51SWQiLCJvbkl0ZW1DbGljayIsImNvbnRleHREaXNhYmxlZCIsIm92ZXJmbG93RGlzYWJsZWQiLCJjb250ZXh0SXRlbUljb24iLCJzZWxlY3RlZEtleXMiLCJvbkFjdGl2ZSIsIl9SZWFjdCR1c2VDb250ZXh0MiIsIlByaXZhdGVDb250ZXh0IiwiX2ludGVybmFsUmVuZGVyTWVudUl0ZW0iLCJpdGVtQ2xzIiwibGVnYWN5TWVudUl0ZW1SZWYiLCJtZXJnZWRFbGVSZWYiLCJjb25uZWN0ZWRLZXlzIiwidXNlRnVsbFBhdGgiLCJnZXRFdmVudEluZm8iLCJrZXlQYXRoIiwicmV2ZXJzZSIsImRvbUV2ZW50IiwiX3VzZUFjdGl2ZSIsInVzZUFjdGl2ZSIsImFjdGl2ZVByb3BzIiwiZGlyZWN0aW9uU3R5bGUiLCJ1c2VEaXJlY3Rpb25TdHlsZSIsIm9uSW50ZXJuYWxDbGljayIsIndhcm5JdGVtUHJvcCIsIm9uSW50ZXJuYWxGb2N1cyIsIm9wdGlvblJvbGVQcm9wcyIsIk1lbnVJdGVtIiwibWVhc3VyZSIsInVzZU1lYXN1cmUiLCJjb25uZWN0ZWRLZXlQYXRoIiwicmVnaXN0ZXJQYXRoIiwidW5yZWdpc3RlclBhdGgiLCJJbnRlcm5hbFN1Yk1lbnVMaXN0IiwiU3ViTWVudUxpc3QiLCJwYXJzZUNoaWxkcmVuIiwiX2V2ZW50S2V5IiwiX2NoaWxkJHByb3BzIiwiZW1wdHlLZXkiLCJjb252ZXJ0SXRlbXNUb05vZGVzIiwiU3ViTWVudSIsIkRpdmlkZXIiLCJwYXJzZUl0ZW1zIiwicG9wdXBQbGFjZW1lbnRNYXAiLCJob3Jpem9udGFsIiwiUG9wdXBUcmlnZ2VyIiwicG9wdXBPZmZzZXQiLCJzdWJNZW51T3BlbkRlbGF5Iiwic3ViTWVudUNsb3NlRGVsYXkiLCJ0cmlnZ2VyU3ViTWVudUFjdGlvbiIsImZvcmNlU3ViTWVudVJlbmRlciIsImRlZmF1bHRNb3Rpb25zIiwic2V0SW5uZXJWaXNpYmxlIiwicGxhY2VtZW50c1J0bCIsInRhcmdldE1vdGlvbiIsInRhcmdldE1vdGlvblJlZiIsIm1lcmdlZE1vdGlvbiIsInZpc2libGVSZWYiLCJJbmxpbmVTdWJNZW51TGlzdCIsImZpeGVkTW9kZSIsInNhbWVNb2RlUmVmIiwic2V0RGVzdHJveSIsIm9yaWdpbk9uVmlzaWJsZUNoYW5nZWQiLCJuZXdWaXNpYmxlIiwiTWVudUNvbnRleHRQcm92aWRlciIsIkludGVybmFsU3ViTWVudSIsImludGVybmFsUG9wdXBDbG9zZSIsImV4cGFuZEljb24iLCJvblRpdGxlQ2xpY2siLCJvblRpdGxlTW91c2VFbnRlciIsIm9uVGl0bGVNb3VzZUxlYXZlIiwib3BlbktleXMiLCJhY3RpdmVLZXkiLCJjb250ZXh0RXhwYW5kSWNvbiIsIl9pbnRlcm5hbFJlbmRlclN1Yk1lbnVJdGVtIiwiX1JlYWN0JHVzZUNvbnRleHQzIiwiUGF0aFVzZXJDb250ZXh0IiwiaXNTdWJQYXRoS2V5IiwiY29ubmVjdGVkUGF0aCIsInN1Yk1lbnVQcmVmaXhDbHMiLCJtZXJnZWRFeHBhbmRJY29uIiwib3JpZ2luT3BlbiIsImNoaWxkcmVuU2VsZWN0ZWQiLCJjaGlsZHJlbkFjdGl2ZSIsInNldENoaWxkcmVuQWN0aXZlIiwidHJpZ2dlckNoaWxkcmVuQWN0aXZlIiwibmV3QWN0aXZlIiwib25JbnRlcm5hbE1vdXNlRW50ZXIiLCJvbkludGVybmFsTW91c2VMZWF2ZSIsIm1lcmdlZEFjdGl2ZSIsIm9uSW50ZXJuYWxUaXRsZUNsaWNrIiwib25NZXJnZWRJdGVtQ2xpY2siLCJ1c2VNZW1vQ2FsbGJhY2siLCJwb3B1cElkIiwidGl0bGVOb2RlIiwiaXNPcGVuIiwiaXNTdWJNZW51IiwidHJpZ2dlck1vZGVSZWYiLCJ0cmlnZ2VyTW9kZSIsImxpc3ROb2RlIiwiRU1QVFlfTElTVCIsIk1lbnUiLCJfY2hpbGRMaXN0JCIsIl9yZWYkcHJlZml4Q2xzIiwiX3JlZiR0YWJJbmRleCIsIl9yZWYkbW9kZSIsImlubGluZUNvbGxhcHNlZCIsImRpc2FibGVkT3ZlcmZsb3ciLCJfcmVmJHN1Yk1lbnVPcGVuRGVsYXkiLCJfcmVmJHN1Yk1lbnVDbG9zZURlbGEiLCJkZWZhdWx0T3BlbktleXMiLCJkZWZhdWx0QWN0aXZlRmlyc3QiLCJfcmVmJHNlbGVjdGFibGUiLCJzZWxlY3RhYmxlIiwiX3JlZiRtdWx0aXBsZSIsImRlZmF1bHRTZWxlY3RlZEtleXMiLCJfcmVmJGlubGluZUluZGVudCIsImlubGluZUluZGVudCIsIl9yZWYkdHJpZ2dlclN1Yk1lbnVBYyIsIl9yZWYkb3ZlcmZsb3dlZEluZGljYSIsIm92ZXJmbG93ZWRJbmRpY2F0b3IiLCJvdmVyZmxvd2VkSW5kaWNhdG9yUG9wdXBDbGFzc05hbWUiLCJvcGVuQW5pbWF0aW9uIiwib3BlblRyYW5zaXRpb25OYW1lIiwic2V0TW91bnRlZCIsInVzZVVVSUQiLCJpc1J0bCIsIm1lcmdlZE9wZW5LZXlzIiwic2V0TWVyZ2VkT3BlbktleXMiLCJ0cmlnZ2VyT3BlbktleXMiLCJmb3JjZUZsdXNoIiwiZG9VcGRhdGUiLCJmbHVzaFN5bmMiLCJpbmxpbmVDYWNoZU9wZW5LZXlzIiwic2V0SW5saW5lQ2FjaGVPcGVuS2V5cyIsIl9SZWFjdCR1c2VNZW1vMiIsIm1lcmdlZE1vZGUiLCJtZXJnZWRJbmxpbmVDb2xsYXBzZWQiLCJpc0lubGluZU1vZGUiLCJpbnRlcm5hbE1vZGUiLCJzZXRJbnRlcm5hbE1vZGUiLCJfUmVhY3QkdXNlU3RhdGU3IiwiX1JlYWN0JHVzZVN0YXRlOCIsImludGVybmFsSW5saW5lQ29sbGFwc2VkIiwic2V0SW50ZXJuYWxJbmxpbmVDb2xsYXBzZWQiLCJfUmVhY3QkdXNlU3RhdGU5IiwiX1JlYWN0JHVzZVN0YXRlMTAiLCJsYXN0VmlzaWJsZUluZGV4Iiwic2V0TGFzdFZpc2libGVJbmRleCIsImFsbFZpc2libGUiLCJfdXNlS2V5UmVjb3JkcyIsInVzZUtleVJlY29yZHMiLCJyZWZyZXNoT3ZlcmZsb3dLZXlzIiwiZ2V0S2V5UGF0aCIsImdldFN1YlBhdGhLZXlzIiwicmVnaXN0ZXJQYXRoQ29udGV4dCIsInBhdGhVc2VyQ29udGV4dCIsIm1lcmdlZEFjdGl2ZUtleSIsInNldE1lcmdlZEFjdGl2ZUtleSIsIm9uSW5hY3RpdmUiLCJfY2hpbGRMaXN0JGZpbmQiLCJzaG91bGRGb2N1c0tleSIsIl9jb250YWluZXJSZWYkY3VycmVudDIiLCJfY29udGFpbmVyUmVmJGN1cnJlbnQzIiwicXVlcnlTZWxlY3RvciIsImdldE1lbnVJZCIsIl91c2VNZXJnZWRTdGF0ZTUiLCJfdXNlTWVyZ2VkU3RhdGU2IiwibWVyZ2VkU2VsZWN0S2V5cyIsInNldE1lcmdlZFNlbGVjdEtleXMiLCJ0cmlnZ2VyU2VsZWN0aW9uIiwidGFyZ2V0S2V5IiwibmV3U2VsZWN0S2V5cyIsInNlbGVjdEluZm8iLCJvbkludGVybmFsT3BlbkNoYW5nZSIsIm5ld09wZW5LZXlzIiwic3ViUGF0aEtleXMiLCJnZXRJbnRlcm5hbFBvcHVwQ29udGFpbmVyIiwidHJpZ2dlckFjY2Vzc2liaWxpdHlPcGVuIiwicHJpdmF0ZUNvbnRleHQiLCJ3cmFwcGVkQ2hpbGRMaXN0IiwiY29udGFpbmVyIiwib21pdEl0ZW1zIiwib3JpZ2luT21pdEl0ZW1zIiwiT1ZFUkZMT1dfS0VZIiwibmV3TGFzdEluZGV4IiwiSW50ZXJuYWxNZW51SXRlbUdyb3VwIiwiZ3JvdXBQcmVmaXhDbHMiLCJNZW51SXRlbUdyb3VwIiwiTGVmdE91dGxpbmVkIiwiTGVmdE91dGxpbmVkU3ZnIiwiUmlnaHRPdXRsaW5lZCIsIlJpZ2h0T3V0bGluZWRTdmciLCJTaWRlckNvbnRleHQiLCJNZW51RGl2aWRlciIsImRhc2hlZCIsInNpZGVyQ29sbGFwc2VkIiwiZmlyc3RMZXZlbCIsImRpc2FibGVNZW51SXRlbVRpdGxlVG9vbHRpcCIsImRhbmdlciIsInRvb2x0aXBUaXRsZSIsInRvb2x0aXBQcm9wcyIsImNoaWxkcmVuTGVuZ3RoIiwicmV0dXJuTm9kZSIsInJlbmRlckl0ZW1DaGlsZHJlbiIsIl90aGlzJGNvbnRleHQyIiwid3JhcE5vZGUiLCJjaGFyQXQiLCJhbnRkTWVudVRoZW1lIiwicGFyZW50UGF0aCIsInRpdGxlSXNTcGFuIiwiY29udGV4dFZhbHVlIiwiUmNTdWJNZW51IiwiSXRlbUdyb3VwIiwidXNlSXRlbXMiLCJPdmVycmlkZUNvbnRleHQiLCJPdmVycmlkZVByb3ZpZGVyIiwiSW50ZXJuYWxNZW51IiwiX3Byb3BzJHRoZW1lIiwiX2ludGVybmFsRGlzYWJsZU1lbnVJdGVtVGl0bGVUb29sdGlwIiwidXNlRXZlbnQiLCJtZXJnZWRTZWxlY3RhYmxlIiwiY29sbGFwc2VNb3Rpb24iLCJvdGhlciIsIm1lbnVDbGFzc05hbWUiLCJSY01lbnUiLCJtZW51IiwiaGFuZGxlQ2xvc2VNZW51QW5kUmV0dXJuRm9jdXMiLCJmb2N1c01lbnUiLCJoYW5kbGVLZXlEb3duIiwiRHJvcGRvd24iLCJfcHJvcHMkYXJyb3ciLCJhcnJvdyIsIl9wcm9wcyRwbGFjZW1lbnRzIiwiUGxhY2VtZW50cyIsInRyaWdnZXJWaXNpYmxlIiwic2V0VHJpZ2dlclZpc2libGUiLCJnZXRPdmVybGF5RWxlbWVudCIsIm92ZXJsYXlFbGVtZW50Iiwib25PdmVybGF5Q2xpY2siLCJvblZpc2libGVDaGFuZ2VQcm9wIiwiZ2V0TWVudUVsZW1lbnQiLCJnZXRNZW51RWxlbWVudE9yTGFtYmRhIiwiZ2V0TWluT3ZlcmxheVdpZHRoTWF0Y2hUcmlnZ2VyIiwibWluT3ZlcmxheVdpZHRoTWF0Y2hUcmlnZ2VyIiwiZ2V0T3BlbkNsYXNzTmFtZSIsInJlbmRlckNoaWxkcmVuIiwiY2hpbGRyZW5Qcm9wcyIsImNoaWxkQ2xhc3NOYW1lIiwidHJpZ2dlckhpZGVBY3Rpb24iLCJzdHlsZUZvclBzZXVkbyIsImlzSGlkZGVuIiwib2Zmc2V0UGFyZW50IiwiaGlkZGVuIiwiZ2V0VmFsaWRhdGVDb250YWluZXIiLCJub2RlUm9vdCIsIkRvY3VtZW50Iiwibm9kZVR5cGUiLCJOb2RlIiwiRUxFTUVOVF9OT0RFIiwiaXNOb3RHcmV5IiwiV2F2ZSIsImFuaW1hdGlvblN0YXJ0IiwiZGVzdHJveWVkIiwid2F2ZUNvbG9yIiwiaW5zZXJ0RXh0cmFOb2RlIiwiZXh0cmFOb2RlIiwiX2Fzc2VydFRoaXNJbml0aWFsaXplIiwiYXR0cmlidXRlTmFtZSIsImdldEF0dHJpYnV0ZU5hbWUiLCJzZXRBdHRyaWJ1dGUiLCJib3JkZXJDb2xvciIsImdldFJvb3ROb2RlIiwibm9kZUJvZHkiLCJhdHRhY2hUbyIsIm9uVHJhbnNpdGlvblN0YXJ0Iiwib25UcmFuc2l0aW9uRW5kIiwicmVzZXRFZmZlY3QiLCJhbmltYXRpb25OYW1lIiwiYmluZEFuaW1hdGlvbkV2ZW50IiwiZ2V0QXR0cmlidXRlIiwidGFnTmFtZSIsImdldENvbXB1dGVkU3R5bGUiLCJnZXRQcm9wZXJ0eVZhbHVlIiwiY2xpY2tXYXZlVGltZW91dElkIiwiYW5pbWF0aW9uU3RhcnRJZCIsInJlbmRlcldhdmUiLCJFbGVtZW50IiwiaW5uZXJIVE1MIiwiR3JvdXBTaXplQ29udGV4dCIsIkJ1dHRvbkdyb3VwIiwib3RoZXJzIiwic2l6ZUNscyIsImNsYXNzZXMiLCJnZXRDb2xsYXBzZWRXaWR0aCIsImdldFJlYWxXaWR0aCIsIkxvYWRpbmdJY29uIiwiZXhpc3RJY29uIiwicnhUd29DTkNoYXIiLCJpc1R3b0NOQ2hhciIsImJpbmQiLCJpc1N0cmluZyIsInN0ciIsImlzVW5Cb3JkZXJlZEJ1dHRvblR5cGUiLCJpbnNlcnRTcGFjZSIsIm5lZWRJbnNlcnRlZCIsIlNQQUNFIiwic3BhY2VDaGlsZHJlbiIsImlzUHJldkNoaWxkUHVyZSIsImlzQ3VycmVudENoaWxkUHVyZSIsImxhc3RDaGlsZCIsImNvbnZlcnRMZWdhY3lQcm9wcyIsIkludGVybmFsQnV0dG9uIiwiX3Byb3BzJGxvYWRpbmciLCJfcHJvcHMkdHlwZSIsIl9wcm9wcyRzaGFwZSIsInNoYXBlIiwiX3Byb3BzJGdob3N0IiwiZ2hvc3QiLCJfcHJvcHMkYmxvY2siLCJfcHJvcHMkaHRtbFR5cGUiLCJodG1sVHlwZSIsImdyb3VwU2l6ZSIsImlubmVyTG9hZGluZyIsInNldExvYWRpbmciLCJoYXNUd29DTkNoYXIiLCJzZXRIYXNUd29DTkNoYXIiLCJidXR0b25SZWYiLCJpc05lZWRJbnNlcnRlZCIsImZpeFR3b0NOQ2hhciIsImJ1dHRvblRleHQiLCJ0ZXh0Q29udGVudCIsImxvYWRpbmdPckRlbGF5IiwiaGFuZGxlQ2xpY2siLCJhdXRvSW5zZXJ0U3BhY2UiLCJzaXplQ2xhc3NOYW1lTWFwIiwibGFyZ2UiLCJzbWFsbCIsIm1pZGRsZSIsInNpemVGdWxsbmFtZSIsImljb25UeXBlIiwibGlua0J1dHRvblJlc3RQcm9wcyIsImhyZWYiLCJraWRzIiwiYnV0dG9uTm9kZSIsIkJ1dHRvbiIsIkdyb3VwIiwiaXNTdHlsZU5hbWVTdXBwb3J0IiwiaXNTdHlsZVZhbHVlU3VwcG9ydCIsImNhblVzZURvY0VsZW1lbnQiLCJkZXRlY3RGbGV4R2FwU3VwcG9ydGVkIiwibWFyZ2luRGlyZWN0aW9uIiwiU3BhY2VDb250ZXh0IiwiaG9yaXpvbnRhbFNpemUiLCJ2ZXJ0aWNhbFNpemUiLCJsYXRlc3RJbmRleCIsInN1cHBvcnRGbGV4R2FwIiwibWFyZ2luQm90dG9tIiwicGFkZGluZ0JvdHRvbSIsInNwYWNlU2l6ZSIsImdldE51bWJlclNpemUiLCJTcGFjZSIsIl9wcm9wcyR3cmFwIiwidXNlRmxleEdhcFN1cHBvcnQiLCJrZWVwRW1wdHkiLCJtZXJnZWRBbGlnbiIsImNuIiwiaXRlbUNsYXNzTmFtZSIsInNwYWNlQ29udGV4dCIsImdhcFN0eWxlIiwiZmxleFdyYXAiLCJjb2x1bW5HYXAiLCJyb3dHYXAiLCJDb21wb3VuZGVkU3BhY2UiLCJEcm9wZG93bkJ1dHRvbiIsIl9wcm9wcyRpY29uIiwiX3Byb3BzJGJ1dHRvbnNSZW5kZXIiLCJidXR0b25zUmVuZGVyIiwiYnV0dG9ucyIsImRyb3Bkb3duUHJvcHMiLCJsZWZ0QnV0dG9uIiwicmlnaHRCdXR0b24iLCJfYnV0dG9uc1JlbmRlciIsIl9idXR0b25zUmVuZGVyMiIsImxlZnRCdXR0b25Ub1JlbmRlciIsInJpZ2h0QnV0dG9uVG9SZW5kZXIiLCJuZXdQbGFjZW1lbnQiLCJkcm9wZG93blRyaWdnZXIiLCJ0cmlnZ2VyQWN0aW9ucyIsIm9uSW5uZXJPcGVuQ2hhbmdlIiwib3ZlcmxheUNsYXNzTmFtZUN1c3RvbWl6ZWQiLCJwb2ludEF0Q2VudGVyIiwib25NZW51Q2xpY2siLCJyZW5kZXJPdmVybGF5Iiwib3ZlcmxheU5vZGUiLCJSY0Ryb3Bkb3duIiwiZnJlZUdsb2JhbCIsImdsb2JhbCIsImZyZWVTZWxmIiwiU3ltYm9sIiwib2JqZWN0UHJvdG8iLCJuYXRpdmVPYmplY3RUb1N0cmluZyIsInN5bVRvU3RyaW5nVGFnIiwiZ2V0UmF3VGFnIiwib2JqZWN0VG9TdHJpbmciLCJyZXF1aXJlJCQxIiwicmVxdWlyZSQkMiIsIm51bGxUYWciLCJ1bmRlZmluZWRUYWciLCJiYXNlR2V0VGFnIiwiaXNPYmplY3RMaWtlIiwic3ltYm9sVGFnIiwiaXNTeW1ib2wiLCJ0cmltbWVkRW5kSW5kZXgiLCJiYXNlVHJpbSIsInRvTnVtYmVyIiwiSElEREVOX1NUWUxFIiwiSGVhZGVyIiwiX3JlZiRwcmV2SWNvbiIsInByZXZJY29uIiwiX3JlZiRuZXh0SWNvbiIsIm5leHRJY29uIiwiX3JlZiRzdXBlclByZXZJY29uIiwic3VwZXJQcmV2SWNvbiIsIl9yZWYkc3VwZXJOZXh0SWNvbiIsInN1cGVyTmV4dEljb24iLCJvblN1cGVyUHJldiIsIm9uU3VwZXJOZXh0Iiwib25QcmV2Iiwib25OZXh0IiwiUGFuZWxDb250ZXh0IiwiaGlkZU5leHRCdG4iLCJoaWRlUHJldkJ0biIsIkRlY2FkZUhlYWRlciIsImdlbmVyYXRlQ29uZmlnIiwidmlld0RhdGUiLCJvblByZXZEZWNhZGVzIiwib25OZXh0RGVjYWRlcyIsImhpZGVIZWFkZXIiLCJoZWFkZXJQcmVmaXhDbHMiLCJ5ZWFyTnVtYmVyIiwiZ2V0WWVhciIsInN0YXJ0WWVhciIsIkRFQ0FERV9ESVNUQU5DRV9DT1VOVCIsImVuZFllYXIiLCJQYW5lbEJvZHkiLCJkaXNhYmxlZERhdGUiLCJwaWNrZXIiLCJyb3dOdW0iLCJjb2xOdW0iLCJwcmVmaXhDb2x1bW4iLCJyb3dDbGFzc05hbWUiLCJiYXNlRGF0ZSIsImdldENlbGxDbGFzc05hbWUiLCJnZXRDZWxsVGV4dCIsImdldENlbGxOb2RlIiwiZ2V0Q2VsbERhdGUiLCJ0aXRsZUNlbGwiLCJoZWFkZXJDZWxscyIsIm9uRGF0ZU1vdXNlRW50ZXIiLCJvbkRhdGVNb3VzZUxlYXZlIiwiY2VsbFByZWZpeENscyIsInJvd3MiLCJyb3ciLCJyb3dTdGFydERhdGUiLCJfbG9vcCIsImN1cnJlbnREYXRlIiwiZ2V0Q2VsbERhdGVEaXNhYmxlZCIsImNlbGxEYXRlIiwiZ2V0TGFzdERheSIsIkRFQ0FERV9DT0xfQ09VTlQiLCJERUNBREVfUk9XX0NPVU5UIiwiRGVjYWRlQm9keSIsIkRFQ0FERV9VTklUX0RJRkZfREVTIiwiREVDQURFX1VOSVRfRElGRiIsImRlY2FkZVllYXJOdW1iZXIiLCJzdGFydERlY2FkZVllYXIiLCJlbmREZWNhZGVZZWFyIiwiYmFzZURlY2FkZVllYXIiLCJzZXRZZWFyIiwic3RhcnREZWNhZGVOdW1iZXIiLCJlbmREZWNhZGVOdW1iZXIiLCJhZGRZZWFyIiwiZ2xvYmFsQ2xpY2tGdW5jIiwiZ2V0WWVhck5leHRNb2RlIiwiZ2V0TW9udGhOZXh0TW9kZSIsImdldFF1YXJ0ZXJOZXh0TW9kZSIsImdldFdlZWtOZXh0TW9kZSIsIkRlY2FkZVBhbmVsIiwib25WaWV3RGF0ZUNoYW5nZSIsIm9wZXJhdGlvblJlZiIsIm9uUGFuZWxDaGFuZ2UiLCJwYW5lbFByZWZpeENscyIsImNyZWF0ZUtleURvd25IYW5kbGVyIiwib25MZWZ0UmlnaHQiLCJkaWZmIiwib25DdHJsTGVmdFJpZ2h0Iiwib25VcERvd24iLCJvbkVudGVyIiwib25EZWNhZGVzQ2hhbmdlIiwibmV3RGF0ZSIsImdldERpc2FibGVkRnJvbVJhbmdlIiwiVGltZUhlYWRlciIsImZvcm1hdFZhbHVlIiwiVGltZVVuaXRDb2x1bW4iLCJ1bml0cyIsImhpZGVEaXNhYmxlZE9wdGlvbnMiLCJ1bFJlZiIsImxpUmVmcyIsInNjcm9sbFJlZiIsImxpIiwib2Zmc2V0VG9wIiwid2FpdEVsZW1lbnRSZWFkeSIsIl9zY3JvbGxSZWYkY3VycmVudCIsInVuaXQiLCJzaG91bGRVbml0c1VwZGF0ZSIsInByZXZVbml0cyIsIm5leHRVbml0cyIsImdlbmVyYXRlVW5pdHMiLCJkaXNhYmxlZFVuaXRzIiwiaW50ZWdlclN0ZXAiLCJsZWZ0UGFkIiwiVGltZUJvZHkiLCJhY3RpdmVDb2x1bW5JbmRleCIsInNob3dIb3VyIiwic2hvd01pbnV0ZSIsInNob3dTZWNvbmQiLCJ1c2UxMkhvdXJzIiwiX3Byb3BzJGhvdXJTdGVwIiwiaG91clN0ZXAiLCJfcHJvcHMkbWludXRlU3RlcCIsIm1pbnV0ZVN0ZXAiLCJfcHJvcHMkc2Vjb25kU3RlcCIsInNlY29uZFN0ZXAiLCJkaXNhYmxlZEhvdXJzIiwiZGlzYWJsZWRNaW51dGVzIiwiZGlzYWJsZWRTZWNvbmRzIiwiZGlzYWJsZWRUaW1lIiwiY29sdW1ucyIsImNvbnRlbnRQcmVmaXhDbHMiLCJjb2x1bW5QcmVmaXhDbHMiLCJpc1BNIiwib3JpZ2luSG91ciIsImdldEhvdXIiLCJob3VyIiwibWludXRlIiwiZ2V0TWludXRlIiwic2Vjb25kIiwiZ2V0U2Vjb25kIiwiZ2V0Tm93IiwiZGlzYWJsZWRDb25maWciLCJtZXJnZWREaXNhYmxlZEhvdXJzIiwibWVyZ2VkRGlzYWJsZWRNaW51dGVzIiwibWVyZ2VkRGlzYWJsZWRTZWNvbmRzIiwic2V0VGltZSIsImlzTmV3UE0iLCJuZXdIb3VyIiwibmV3TWludXRlIiwibmV3U2Vjb25kIiwibWVyZ2VkSG91ciIsIm1lcmdlZE1pbnV0ZSIsIm1lcmdlZFNlY29uZCIsInV0aWxTZXRUaW1lIiwicmF3SG91cnMiLCJtZW1vcml6ZWRSYXdIb3VycyIsIl9SZWFjdCR1c2VNZW1vMyIsIkFNUE1EaXNhYmxlZCIsImhvdXJWYWx1ZSIsIl9SZWFjdCR1c2VNZW1vNCIsIkFNRGlzYWJsZWQiLCJQTURpc2FibGVkIiwiaG91cnMiLCJob3VyTWV0YSIsImhvdXJMYWJlbCIsIm1pbnV0ZXMiLCJzZWNvbmRzIiwiY29sdW1uIiwidW5pdExlbiIsIm5leHRVbml0IiwiYWRkQ29sdW1uTm9kZSIsImNvbmRpdGlvbiIsImNvbHVtblZhbHVlIiwib25Db2x1bW5TZWxlY3QiLCJudW0iLCJQTUluZGV4IiwiY291bnRCb29sZWFuIiwiYm9vbExpc3QiLCJib29sIiwiVGltZVBhbmVsIiwiX3Byb3BzJGZvcm1hdCIsIl9wcm9wcyR1c2UxMkhvdXJzIiwiYm9keU9wZXJhdGlvblJlZiIsInNldEFjdGl2ZUNvbHVtbkluZGV4IiwiY29sdW1uc0NvdW50IiwiRGF0ZUJvZHkiLCJyb3dDb3VudCIsImRhdGVSZW5kZXIiLCJSYW5nZUNvbnRleHQiLCJyYW5nZWRWYWx1ZSIsImhvdmVyUmFuZ2VkVmFsdWUiLCJnZXRXZWVrU3RhcnREYXRlIiwid2Vla0ZpcnN0RGF5IiwiZ2V0V2Vla0ZpcnN0RGF5IiwidG9kYXkiLCJ3ZWVrRGF5c0xvY2FsZSIsInNob3J0V2Vla0RheXMiLCJnZXRTaG9ydFdlZWtEYXlzIiwiV0VFS19EQVlfQ09VTlQiLCJ1c2VDZWxsQ2xhc3NOYW1lIiwiaXNTYW1lQ2VsbCIsImlzU2FtZURhdGUiLCJpc0luVmlldyIsImlzU2FtZU1vbnRoIiwib2Zmc2V0Q2VsbCIsImFkZERhdGUiLCJnZXREYXRlIiwiRGF0ZUhlYWRlciIsIm9uTmV4dE1vbnRoIiwib25QcmV2TW9udGgiLCJvbk5leHRZZWFyIiwib25QcmV2WWVhciIsIm9uWWVhckNsaWNrIiwib25Nb250aENsaWNrIiwibW9udGhzTG9jYWxlIiwic2hvcnRNb250aHMiLCJnZXRTaG9ydE1vbnRocyIsIm1vbnRoIiwiZ2V0TW9udGgiLCJ5ZWFyTm9kZSIsInllYXJGb3JtYXQiLCJtb250aE5vZGUiLCJtb250aEZvcm1hdCIsIm1vbnRoWWVhck5vZGVzIiwibW9udGhCZWZvcmVZZWFyIiwiREFURV9ST1dfQ09VTlQiLCJEYXRlUGFuZWwiLCJfcHJvcHMkcGFuZWxOYW1lIiwicGFuZWxOYW1lIiwia2V5Ym9hcmRDb25maWciLCJfb25TZWxlY3QiLCJvblBhZ2VVcERvd24iLCJhZGRNb250aCIsIm9uWWVhckNoYW5nZSIsIm9uTW9udGhDaGFuZ2UiLCJBQ1RJVkVfUEFORUwiLCJEYXRldGltZVBhbmVsIiwic2hvd1RpbWUiLCJhY3RpdmVQYW5lbCIsInNldEFjdGl2ZVBhbmVsIiwiZGF0ZU9wZXJhdGlvblJlZiIsInRpbWVPcGVyYXRpb25SZWYiLCJ0aW1lUHJvcHMiLCJnZXROZXh0QWN0aXZlIiwibmV4dEFjdGl2ZVBhbmVsIiwiVEFCIiwic2hpZnRLZXkiLCJSSUdIVCIsInNlbGVjdGVkRGF0ZSIsInNldEhvdXIiLCJzZXRNaW51dGUiLCJzZXRTZWNvbmQiLCJzZXRNb250aCIsInNldERhdGUiLCJkaXNhYmxlZFRpbWVzIiwiV2Vla1BhbmVsIiwiZ2V0V2VlayIsInJvd1ByZWZpeENscyIsImlzU2FtZVdlZWsiLCJNb250aEhlYWRlciIsIk1PTlRIX0NPTF9DT1VOVCIsIk1PTlRIX1JPV19DT1VOVCIsIk1vbnRoQm9keSIsIm1vbnRoQ2VsbFJlbmRlciIsImJhc2VNb250aCIsIk1vbnRoUGFuZWwiLCJRdWFydGVySGVhZGVyIiwiUVVBUlRFUl9DT0xfQ09VTlQiLCJRVUFSVEVSX1JPV19DT1VOVCIsIlF1YXJ0ZXJCb2R5IiwiaXNTYW1lUXVhcnRlciIsImJhc2VRdWFydGVyIiwicXVhcnRlckZvcm1hdCIsIlF1YXJ0ZXJQYW5lbCIsIlllYXJIZWFkZXIiLCJvblByZXZEZWNhZGUiLCJvbk5leHREZWNhZGUiLCJvbkRlY2FkZUNsaWNrIiwiWUVBUl9ERUNBREVfQ09VTlQiLCJZRUFSX0NPTF9DT1VOVCIsIllFQVJfUk9XX0NPVU5UIiwiWWVhckJvZHkiLCJ5ZWFyUHJlZml4Q2xzIiwiYmFzZVllYXIiLCJjdXJyZW50WWVhck51bWJlciIsImlzU2FtZVllYXIiLCJZZWFyUGFuZWwiLCJzb3VyY2VNb2RlIiwib25EZWNhZGVDaGFuZ2UiLCJnZXRFeHRyYUZvb3RlciIsInJlbmRlckV4dHJhRm9vdGVyIiwiZ2V0UmFuZ2VzIiwiX3JlZiRyYW5nZUxpc3QiLCJyYW5nZUxpc3QiLCJfcmVmJGNvbXBvbmVudHMiLCJjb21wb25lbnRzIiwibmVlZENvbmZpcm1CdXR0b24iLCJvbk5vdyIsIm9uT2siLCJva0Rpc2FibGVkIiwic2hvd05vdyIsInByZXNldE5vZGUiLCJva05vZGUiLCJyYW5nZUl0ZW0iLCJidXR0b24iLCJvayIsIkNBTEVOREFSX1BBTkVMX01PREUiLCJQaWNrZXJQYW5lbCIsInBpY2tlclZhbHVlIiwiZGVmYXVsdFBpY2tlclZhbHVlIiwiX3Byb3BzJHBpY2tlciIsIl9wcm9wcyR0YWJJbmRleCIsInNob3dUb2RheSIsIm9uUGlja2VyVmFsdWVDaGFuZ2UiLCJfb25PayIsImlzSG91clN0ZXBWYWxpZCIsImlzTWludXRlU3RlcFZhbGlkIiwiaXNTZWNvbmRTdGVwVmFsaWQiLCJwYW5lbENvbnRleHQiLCJwYW5lbERpdlJlZiIsInBhbmVsUmVmIiwib25Db250ZXh0U2VsZWN0IiwiaGlkZVJhbmdlcyIsImRlZmF1bHRPcGVuVmFsdWUiLCJpblJhbmdlIiwicGFuZWxQb3NpdGlvbiIsImluaXRSZWYiLCJtZXJnZWRWYWx1ZSIsInNldElubmVyVmFsdWUiLCJkZWZhdWx0RGF0ZU9iamVjdCIsInNldERhdGVUaW1lIiwic2V0SW5uZXJWaWV3RGF0ZSIsInNldFZpZXdEYXRlIiwiZ2V0SW50ZXJuYWxOZXh0TW9kZSIsIm5leHRNb2RlIiwiZ2V0TmV4dE1vZGUiLCJQaWNrZXJNb2RlTWFwIiwic2V0SW5uZXJNb2RlIiwic2V0U291cmNlTW9kZSIsIm9uSW50ZXJuYWxQYW5lbENoYW5nZSIsIm5ld01vZGUiLCJ2aWV3VmFsdWUiLCJmb3JjZVRyaWdnZXJTZWxlY3QiLCJpc1NlbGVjdGFibGUiLCJvcGVyYXRpb25GbmMiLCJpc0RhdGVNb2RlIiwiUEFHRV9VUCIsIlBBR0VfRE9XTiIsIm9uSW50ZXJuYWxCbHVyIiwicGFuZWxOb2RlIiwicGlja2VyUHJvcHMiLCJleHRyYUZvb3RlciIsInJhbmdlc05vZGUiLCJsb3dlckJvdW5kVGltZSIsImdldExvd2VyQm91bmRUaW1lIiwiYWRqdXN0ZWROb3ciLCJ0b2RheU5vZGUiLCJ0b2RheUNscyIsIkJVSUxUX0lOX1BMQUNFTUVOVFMiLCJQaWNrZXJUcmlnZ2VyIiwiZ2V0UG9wdXBQbGFjZW1lbnQiLCJzaGFsbG93RXF1YWwiLCJJbm5lclBpY2tlciIsImlucHV0UmVhZE9ubHkiLCJwaWNrZXJSZWYiLCJwYW5lbFJlbmRlciIsIl9wcm9wcyRhdXRvQ29tcGxldGUiLCJpbnB1dFJlbmRlciIsImZvcm1hdExpc3QiLCJnZXREZWZhdWx0Rm9ybWF0IiwiaW5wdXREaXZSZWYiLCJzZWxlY3RlZFZhbHVlIiwic2V0U2VsZWN0ZWRWYWx1ZSIsInBvc3RPcGVuIiwidHJpZ2dlcklubmVyT3BlbiIsIl91c2VWYWx1ZVRleHRzIiwidXNlVmFsdWVUZXh0cyIsIl91c2VWYWx1ZVRleHRzMiIsInZhbHVlVGV4dHMiLCJmaXJzdFZhbHVlVGV4dCIsIl91c2VUZXh0VmFsdWVNYXBwaW5nIiwidXNlVGV4dFZhbHVlTWFwcGluZyIsIm9uVGV4dENoYW5nZSIsIm5ld1RleHQiLCJpbnB1dERhdGUiLCJwYXJzZVZhbHVlIiwiX3VzZVRleHRWYWx1ZU1hcHBpbmcyIiwidGV4dCIsInRyaWdnZXJUZXh0Q2hhbmdlIiwicmVzZXRUZXh0IiwiZm9yd2FyZEtleURvd24iLCJfdXNlUGlja2VySW5wdXQiLCJ1c2VQaWNrZXJJbnB1dCIsImJsdXJUb0NhbmNlbCIsImlzQ2xpY2tPdXRzaWRlIiwiZWxlbWVudHNDb250YWlucyIsIm9uQ2FuY2VsIiwiX3VzZVBpY2tlcklucHV0MiIsImlucHV0UHJvcHMiLCJfdXNlUGlja2VySW5wdXQyJCIsInR5cGluZyIsIl91c2VIb3ZlclZhbHVlIiwidXNlSG92ZXJWYWx1ZSIsIl91c2VIb3ZlclZhbHVlMiIsImhvdmVyVmFsdWUiLCJvbkxlYXZlIiwicGFuZWxQcm9wcyIsInBhbmVsIiwic3VmZml4Tm9kZSIsIm1lcmdlZElucHV0UHJvcHMiLCJnZXRJbnB1dFNpemUiLCJQaWNrZXIiLCJyZW9yZGVyVmFsdWVzIiwiaXNBZnRlciIsImNhblZhbHVlVHJpZ2dlciIsImFsbG93RW1wdHkiLCJJbm5lclJhbmdlUGlja2VyIiwiX2NsYXNzTmFtZXMzIiwiX2NsYXNzTmFtZXM0IiwiX3Byb3BzJHNlcGFyYXRvciIsIl9kaXNhYmxlZFRpbWUiLCJyYW5nZXMiLCJvbkNhbGVuZGFyQ2hhbmdlIiwiX29uRm9jdXMiLCJhY3RpdmVQaWNrZXJJbmRleCIsIm9wZW5SZWNvcmRzUmVmIiwic3RhcnRJbnB1dERpdlJlZiIsImVuZElucHV0RGl2UmVmIiwic2VwYXJhdG9yUmVmIiwic3RhcnRJbnB1dFJlZiIsImVuZElucHV0UmVmIiwiYXJyb3dSZWYiLCJtZXJnZWRBY3RpdmVQaWNrZXJJbmRleCIsInNldE1lcmdlZEFjdGl2ZVBpY2tlckluZGV4IiwiX3VzZVJhbmdlVmlld0RhdGVzIiwidXNlUmFuZ2VWaWV3RGF0ZXMiLCJkZWZhdWx0RGF0ZXMiLCJfdXNlUmFuZ2VWaWV3RGF0ZXMyIiwiZ2V0Vmlld0RhdGUiLCJwb3N0VmFsdWVzIiwidXBkYXRlVmFsdWVzIiwiX3VzZU1lcmdlZFN0YXRlNyIsIl91c2VNZXJnZWRTdGF0ZTgiLCJtZXJnZWRNb2RlcyIsInNldElubmVyTW9kZXMiLCJ0cmlnZ2VyTW9kZXNDaGFuZ2UiLCJtb2RlcyIsIl91c2VSYW5nZURpc2FibGVkIiwidXNlUmFuZ2VEaXNhYmxlZCIsIl91c2VSYW5nZURpc2FibGVkMiIsImRpc2FibGVkU3RhcnREYXRlIiwiZGlzYWJsZWRFbmREYXRlIiwiX3VzZU1lcmdlZFN0YXRlOSIsIl91c2VNZXJnZWRTdGF0ZTEwIiwic3RhcnRPcGVuIiwiZW5kT3BlbiIsInBvcHVwTWluV2lkdGgiLCJzZXRQb3B1cE1pbldpZHRoIiwiX3RyaWdnZXJPcGVuIiwib3BlblJlY29yZHMiLCJ0cmlnZ2VyT3BlbkFuZEZvY3VzIiwic291cmNlSW5kZXgiLCJzdGFydFZhbHVlIiwiZW5kVmFsdWUiLCJzdGFydFN0ciIsImVuZFN0ciIsImNhblN0YXJ0VmFsdWVUcmlnZ2VyIiwiY2FuRW5kVmFsdWVUcmlnZ2VyIiwiY2FuVHJpZ2dlciIsIm5leHRPcGVuSW5kZXgiLCJzaGFyZWRUZXh0SG9va3NQcm9wcyIsInN0YXJ0VmFsdWVUZXh0cyIsImZpcnN0U3RhcnRWYWx1ZVRleHQiLCJfdXNlVmFsdWVUZXh0czMiLCJfdXNlVmFsdWVUZXh0czQiLCJlbmRWYWx1ZVRleHRzIiwiZmlyc3RFbmRWYWx1ZVRleHQiLCJfb25UZXh0Q2hhbmdlIiwiZGlzYWJsZWRGdW5jIiwic3RhcnRUZXh0IiwidHJpZ2dlclN0YXJ0VGV4dENoYW5nZSIsInJlc2V0U3RhcnRUZXh0IiwiX3VzZVRleHRWYWx1ZU1hcHBpbmczIiwiX3VzZVRleHRWYWx1ZU1hcHBpbmc0IiwiZW5kVGV4dCIsInRyaWdnZXJFbmRUZXh0Q2hhbmdlIiwicmVzZXRFbmRUZXh0IiwicmFuZ2VIb3ZlclZhbHVlIiwic2V0UmFuZ2VIb3ZlclZhbHVlIiwic2V0SG92ZXJSYW5nZWRWYWx1ZSIsInN0YXJ0SG92ZXJWYWx1ZSIsIm9uU3RhcnRFbnRlciIsIm9uU3RhcnRMZWF2ZSIsIl91c2VIb3ZlclZhbHVlMyIsIl91c2VIb3ZlclZhbHVlNCIsImVuZEhvdmVyVmFsdWUiLCJvbkVuZEVudGVyIiwib25FbmRMZWF2ZSIsImdldFNoYXJlZElucHV0SG9va1Byb3BzIiwiY3VycmVudEZvY3VzZWRLZXkiLCJzdGFydElucHV0UHJvcHMiLCJzdGFydEZvY3VzZWQiLCJzdGFydFR5cGluZyIsIl91c2VQaWNrZXJJbnB1dDMiLCJfdXNlUGlja2VySW5wdXQ0IiwiZW5kSW5wdXRQcm9wcyIsIl91c2VQaWNrZXJJbnB1dDQkIiwiZW5kRm9jdXNlZCIsImVuZFR5cGluZyIsIm9uUGlja2VyQ2xpY2siLCJvblBpY2tlck1vdXNlRG93biIsInJhbmdlTGFiZWxzIiwicmVuZGVyUGFuZWwiLCJwYW5lbEhvdmVyUmFuZ2VkVmFsdWUiLCJwYW5lbFNob3dUaW1lIiwidGltZURlZmF1bHRWYWx1ZXMiLCJwYW5lbERhdGVSZW5kZXIiLCJnZXRDbG9zaW5nVmlld0RhdGUiLCJhcnJvd0xlZnQiLCJwYW5lbExlZnQiLCJhcnJvd01hcmdpbkxlZnQiLCJvZmZzZXRMZWZ0IiwiYXJyb3dQb3NpdGlvblN0eWxlIiwicmVuZGVyUGFuZWxzIiwicGFuZWxzIiwibmV4dFZpZXdEYXRlIiwiY3VycmVudE1vZGUiLCJzaG93RG91YmxlUGFuZWwiLCJsZWZ0UGFuZWwiLCJuZXdWaWV3RGF0ZSIsInJpZ2h0UGFuZWwiLCJtZXJnZWROb2RlcyIsIm1hcmdpbkxlZnQiLCJyYW5nZVBhbmVsIiwiaW5wdXRTaGFyZWRQcm9wcyIsImFjdGl2ZUJhckxlZnQiLCJhY3RpdmVCYXJXaWR0aCIsImFjdGl2ZUJhclBvc2l0aW9uU3R5bGUiLCJSYW5nZVBpY2tlciIsIkNoZWNrYm94IiwiaGFuZGxlQ2hhbmdlIiwiY2hlY2tlZCIsIm5hdGl2ZUV2ZW50Iiwic2F2ZUlucHV0IiwiaW5wdXQiLCJkZWZhdWx0Q2hlY2tlZCIsIm9uS2V5UHJlc3MiLCJnbG9iYWxQcm9wcyIsIkludGVybmFsUmFkaW8iLCJncm91cENvbnRleHQiLCJSYWRpb0dyb3VwQ29udGV4dCIsInJhZGlvT3B0aW9uVHlwZUNvbnRleHQiLCJSYWRpb09wdGlvblR5cGVDb250ZXh0IiwiaW5uZXJSZWYiLCJyYWRpb1ByZWZpeENscyIsIm9wdGlvblR5cGUiLCJyYWRpb1Byb3BzIiwid3JhcHBlckNsYXNzU3RyaW5nIiwiUmNDaGVja2JveCIsIlJhZGlvIiwiUmFkaW9Hcm91cCIsIm9uUmFkaW9DaGFuZ2UiLCJldiIsImxhc3RWYWx1ZSIsIl9wcm9wcyRjbGFzc05hbWUiLCJfcHJvcHMkYnV0dG9uU3R5bGUiLCJjaGlsZHJlblRvUmVuZGVyIiwibWVtbyIsIlJhZGlvQnV0dG9uIiwic2hhcGVDbHMiLCJzaXplU3R5bGUiLCJsaW5lSGVpZ2h0IiwiU2tlbGV0b25BdmF0YXIiLCJTa2VsZXRvbkJ1dHRvbiIsIkRvdENoYXJ0T3V0bGluZWQiLCJEb3RDaGFydE91dGxpbmVkU3ZnIiwiU2tlbGV0b25Ob2RlIiwiU2tlbGV0b25JbWFnZSIsIlNrZWxldG9uSW5wdXQiLCJQYXJhZ3JhcGgiLCJnZXRXaWR0aCIsIl9wcm9wcyRyb3dzIiwicm93TGlzdCIsIlRpdGxlIiwiZ2V0Q29tcG9uZW50UHJvcHMiLCJnZXRBdmF0YXJCYXNpY1Byb3BzIiwiaGFzVGl0bGUiLCJoYXNQYXJhZ3JhcGgiLCJnZXRUaXRsZUJhc2ljUHJvcHMiLCJoYXNBdmF0YXIiLCJnZXRQYXJhZ3JhcGhCYXNpY1Byb3BzIiwiYmFzaWNQcm9wcyIsIlNrZWxldG9uIiwiX3Byb3BzJGF2YXRhciIsImF2YXRhciIsIl9wcm9wcyR0aXRsZSIsIl9wcm9wcyRwYXJhZ3JhcGgiLCJwYXJhZ3JhcGgiLCJhdmF0YXJOb2RlIiwiYXZhdGFyUHJvcHMiLCJjb250ZW50Tm9kZSIsIiR0aXRsZSIsInRpdGxlUHJvcHMiLCJwYXJhZ3JhcGhOb2RlIiwicGFyYWdyYXBoUHJvcHMiLCJBdmF0YXIiLCJJbWFnZSIsIlBsdXNPdXRsaW5lZCIsIlBsdXNPdXRsaW5lZFN2ZyIsIlRhYlBhbmUiLCJ0YWJLZXkiLCJUYWJQYW5lbExpc3QiLCJhbmltYXRlZCIsInRhYlBvc2l0aW9uIiwiZGVzdHJveUluYWN0aXZlVGFiUGFuZSIsIlRhYkNvbnRleHQiLCJ0YWJzIiwidGFiUGFuZUFuaW1hdGVkIiwidGFiUGFuZSIsInRhYlBhbmVQcmVmaXhDbHMiLCJwYW5lU3R5bGUiLCJwYW5lQ2xhc3NOYW1lIiwicmVzdFRhYlByb3BzIiwidGFiUGFuZU1vdGlvbiIsIkRFRkFVTFRfU0laRSIsInVzZVN5bmNTdGF0ZSIsIkFkZEJ1dHRvbiIsInNob3dBZGQiLCJhZGRBcmlhTGFiZWwiLCJvbkVkaXQiLCJhZGRJY29uIiwiRXh0cmFDb250ZW50IiwiZXh0cmEiLCJhc3NlcnRFeHRyYSIsIk9wZXJhdGlvbk5vZGUiLCJfcmVmJG1vcmVJY29uIiwibW9yZUljb24iLCJtb3JlVHJhbnNpdGlvbk5hbWUiLCJ0YWJCYXJHdXR0ZXIiLCJyZW1vdmVBcmlhTGFiZWwiLCJvblRhYkNsaWNrIiwic2VsZWN0ZWRLZXkiLCJzZXRTZWxlY3RlZEtleSIsImRyb3Bkb3duUHJlZml4Iiwic2VsZWN0ZWRJdGVtSWQiLCJkcm9wZG93bkFyaWFMYWJlbCIsIm9uUmVtb3ZlVGFiIiwidGFiIiwicmVtb3ZhYmxlIiwic2VsZWN0T2Zmc2V0IiwiZW5hYmxlZFRhYnMiLCJzZWxlY3RlZEluZGV4IiwiZ2V0RWxlbWVudEJ5SWQiLCJtb3JlU3R5bGUiLCJtb3JlTm9kZSIsInRhYk1vdmluZyIsIlRhYk5vZGUiLCJfcmVmJHRhYiIsInJlbmRlcldyYXBwZXIiLCJ0YWJQcmVmaXgiLCJnZW5EYXRhTm9kZUtleSIsImdldFNpemUiLCJyZWZPYmoiLCJfcmVmJG9mZnNldFdpZHRoIiwiX3JlZiRvZmZzZXRIZWlnaHQiLCJnZXRVbml0VmFsdWUiLCJ0YWJQb3NpdGlvblRvcE9yQm90dG9tIiwiVGFiTmF2TGlzdCIsIm9uVGFiU2Nyb2xsIiwiZXh0cmFMZWZ0UmVmIiwiZXh0cmFSaWdodFJlZiIsInRhYnNXcmFwcGVyUmVmIiwidGFiTGlzdFJlZiIsIm9wZXJhdGlvbnNSZWYiLCJpbm5lckFkZEJ1dHRvblJlZiIsIl91c2VTeW5jU3RhdGUiLCJfdXNlU3luY1N0YXRlMiIsInRyYW5zZm9ybUxlZnQiLCJzZXRUcmFuc2Zvcm1MZWZ0IiwiX3VzZVN5bmNTdGF0ZTMiLCJfdXNlU3luY1N0YXRlNCIsInRyYW5zZm9ybVRvcCIsInNldFRyYW5zZm9ybVRvcCIsImNvbnRhaW5lckV4Y2x1ZGVFeHRyYVNpemUiLCJzZXRDb250YWluZXJFeGNsdWRlRXh0cmFTaXplIiwidGFiQ29udGVudFNpemUiLCJzZXRUYWJDb250ZW50U2l6ZSIsImFkZFNpemUiLCJzZXRBZGRTaXplIiwiX3VzZVN0YXRlNyIsIl91c2VTdGF0ZTgiLCJvcGVyYXRpb25TaXplIiwic2V0T3BlcmF0aW9uU2l6ZSIsIl91c2VVcGRhdGVTdGF0ZSIsInVzZVVwZGF0ZVN0YXRlIiwiX3VzZVVwZGF0ZVN0YXRlMiIsInRhYlNpemVzIiwic2V0VGFiU2l6ZXMiLCJ0YWJPZmZzZXRzIiwidXNlT2Zmc2V0cyIsImNvbnRhaW5lckV4Y2x1ZGVFeHRyYVNpemVWYWx1ZSIsInRhYkNvbnRlbnRTaXplVmFsdWUiLCJhZGRTaXplVmFsdWUiLCJvcGVyYXRpb25TaXplVmFsdWUiLCJuZWVkU2Nyb2xsIiwidmlzaWJsZVRhYkNvbnRlbnRWYWx1ZSIsIm9wZXJhdGlvbnNIaWRkZW5DbGFzc05hbWUiLCJ0cmFuc2Zvcm1NaW4iLCJ0cmFuc2Zvcm1NYXgiLCJhbGlnbkluUmFuZ2UiLCJ0b3VjaE1vdmluZ1JlZiIsIl91c2VTdGF0ZTkiLCJfdXNlU3RhdGUxMCIsImxvY2tBbmltYXRpb24iLCJzZXRMb2NrQW5pbWF0aW9uIiwiZG9Mb2NrQW5pbWF0aW9uIiwiY2xlYXJUb3VjaE1vdmluZyIsInVzZVRvdWNoTW92ZSIsIm9mZnNldFgiLCJkb01vdmUiLCJfdXNlVmlzaWJsZVJhbmdlIiwidXNlVmlzaWJsZVJhbmdlIiwiX3VzZVZpc2libGVSYW5nZTIiLCJ2aXNpYmxlU3RhcnQiLCJ2aXNpYmxlRW5kIiwic2Nyb2xsVG9UYWIiLCJ0YWJPZmZzZXQiLCJuZXdUcmFuc2Zvcm0iLCJfbmV3VHJhbnNmb3JtIiwidGFiTm9kZVN0eWxlIiwibWFyZ2luVG9wIiwidGFiTm9kZXMiLCJzY3JvbGxMZWZ0IiwidXBkYXRlVGFiU2l6ZXMiLCJuZXdTaXplcyIsIl90YWJMaXN0UmVmJGN1cnJlbnQiLCJidG5Ob2RlIiwib25MaXN0SG9sZGVyUmVzaXplIiwidXNlVXBkYXRlIiwiY29udGFpbmVyU2l6ZSIsImV4dHJhTGVmdFNpemUiLCJleHRyYVJpZ2h0U2l6ZSIsIm5ld0FkZFNpemUiLCJuZXdPcGVyYXRpb25TaXplIiwidGFiQ29udGVudEZ1bGxTaXplIiwic3RhcnRIaWRkZW5UYWJzIiwiZW5kSGlkZGVuVGFicyIsImhpZGRlblRhYnMiLCJfdXNlU3RhdGUxMSIsIl91c2VTdGF0ZTEyIiwiaW5rU3R5bGUiLCJzZXRJbmtTdHlsZSIsImFjdGl2ZVRhYk9mZnNldCIsImlua0JhclJhZlJlZiIsImNsZWFuSW5rQmFyUmFmIiwibmV3SW5rU3R5bGUiLCJoYXNEcm9wZG93biIsIndyYXBQcmVmaXgiLCJwaW5nTGVmdCIsInBpbmdSaWdodCIsInBpbmdUb3AiLCJwaW5nQm90dG9tIiwidHJhbnNpdGlvbiIsImlua0JhciIsIlRhYk5hdkxpc3RXcmFwcGVyIiwicmVuZGVyVGFiQmFyIiwidGFiTmF2QmFyUHJvcHMiLCJwYW5lcyIsInVzZUFuaW1hdGVDb25maWciLCJUYWJzIiwiZGVmYXVsdEFjdGl2ZUtleSIsIl9yZWYkdGFiUG9zaXRpb24iLCJ0YWJCYXJTdHlsZSIsInRhYkJhckV4dHJhQ29udGVudCIsIm1lcmdlZEFuaW1hdGVkIiwiX3RhYnMkIiwibmV3QWN0aXZlSW5kZXgiLCJfdGFicyRuZXdBY3RpdmVJbmRleCIsInNldE1lcmdlZElkIiwib25JbnRlcm5hbFRhYkNsaWNrIiwiaXNBY3RpdmVDaGFuZ2VkIiwidGFiTmF2QmFyIiwiRm9yd2FyZFRhYnMiLCJwcm9wU2l6ZSIsIl9vbkVkaXQiLCJoaWRlQWRkIiwiY2VudGVyZWQiLCJfcHJvcHMkbW9yZUljb24iLCJlZGl0VHlwZSIsIm1lcmdlZEl0ZW1zIiwidXNlTGVnYWN5SXRlbXMiLCJjb250ZXh0U2l6ZSIsIlJjVGFicyIsIkdyaWQiLCJfYSRob3ZlcmFibGUiLCJob3ZlcmFibGUiLCJnZXRBY3Rpb24iLCJhY3Rpb25zIiwiYWN0aW9uTGlzdCIsIkNhcmQiLCJfZXh0ZW5kczIiLCJvblRhYkNoYW5nZSIsImlzQ29udGFpbkdyaWQiLCJjb250YWluR3JpZCIsIl9wcm9wcyRoZWFkU3R5bGUiLCJoZWFkU3R5bGUiLCJfcHJvcHMkYm9keVN0eWxlIiwiYm9keVN0eWxlIiwiX3Byb3BzJGJvcmRlcmVkIiwiY292ZXIiLCJ0YWJMaXN0IiwiYWN0aXZlVGFiS2V5IiwiZGVmYXVsdEFjdGl2ZVRhYktleSIsIl9wcm9wcyR0YWJQcm9wcyIsInRhYlByb3BzIiwibG9hZGluZ0Jsb2NrIiwiaGFzQWN0aXZlVGFiS2V5IiwiaGVhZCIsImNvdmVyRG9tIiwiYWN0aW9uRG9tIiwiZGl2UHJvcHMiLCJNZXRhIiwiYXZhdGFyRG9tIiwidGl0bGVEb20iLCJkZXNjcmlwdGlvbkRvbSIsIk1ldGFEZXRhaWwiLCJGVU5DX0VSUk9SX1RFWFQiLCJpc0NoZWNrRGlzYWJsZWQiLCJnZXRQb3NpdGlvbiIsInN5bnRoZXRpY0dldEtleSIsIkdyb3VwQ29udGV4dCIsIkludGVybmFsQ2hlY2tib3hHcm91cCIsIl9hJG9wdGlvbnMiLCJyZWdpc3RlcmVkVmFsdWVzIiwic2V0UmVnaXN0ZXJlZFZhbHVlcyIsImdldE9wdGlvbnMiLCJjYW5jZWxWYWx1ZSIsInByZXZWYWx1ZXMiLCJyZWdpc3RlclZhbHVlIiwidG9nZ2xlT3B0aW9uIiwib3B0aW9uSW5kZXgiLCJvcHRzIiwiaW5kZXhBIiwiaW5kZXhCIiwiQ2hlY2tib3hHcm91cCIsIkludGVybmFsQ2hlY2tib3giLCJfYSRpbmRldGVybWluYXRlIiwiaW5kZXRlcm1pbmF0ZSIsIl9hJHNraXBHcm91cCIsInNraXBHcm91cCIsImNoZWNrYm94R3JvdXAiLCJjaGVja2JveFByb3BzIiwiY2hlY2tib3hDbGFzcyIsImFyaWFDaGVja2VkIiwicGFyc2VGbGV4IiwiZmxleCIsInNpemVzIiwiQ29sIiwiUm93Q29udGV4dCIsImd1dHRlciIsInNwYW4iLCJwdWxsIiwic2l6ZUNsYXNzT2JqIiwic2l6ZVByb3BzIiwiaG9yaXpvbnRhbEd1dHRlciIsInBhZGRpbmdMZWZ0IiwicGFkZGluZ1JpZ2h0IiwidmVydGljYWxHdXR0ZXIiLCJwYWRkaW5nVG9wIiwidXNlTWVyZ2VQcm9wQnlTY3JlZW4iLCJvcmlQcm9wIiwic2NyZWVuIiwic2V0UHJvcCIsImNsYWNNZXJnZUFsaWduT3JKdXN0aWZ5IiwicmVzcG9uc2l2ZUFycmF5IiwiYnJlYWtwb2ludCIsImN1clZhbCIsIlJvdyIsImp1c3RpZnkiLCJfcHJvcHMkZ3V0dGVyIiwieHMiLCJzbSIsIm1kIiwibGciLCJ4bCIsInh4bCIsInNjcmVlbnMiLCJzZXRTY3JlZW5zIiwiY3VyU2NyZWVucyIsInNldEN1clNjcmVlbnMiLCJtZXJnZUFsaWduIiwibWVyZ2VKdXN0aWZ5IiwiZ3V0dGVyUmVmIiwidG9rZW4iLCJSZXNwb25zaXZlT2JzZXJ2ZSIsInN1YnNjcmliZSIsImN1cnJlbnRHdXR0ZXIiLCJ1bnN1YnNjcmliZSIsImdldEd1dHRlciIsInJlc3VsdHMiLCJub3JtYWxpemVkR3V0dGVyIiwiZ3V0dGVycyIsInJvd1N0eWxlIiwibWFyZ2luUmlnaHQiLCJfZ3V0dGVycyIsIl9ndXR0ZXJzMiIsImd1dHRlckgiLCJndXR0ZXJWIiwicm93Q29udGV4dCIsIlBhbmVsQ29udGVudCIsIl9jbGFzc25hbWVzIiwicmVuZGVyZWQiLCJzZXRSZW5kZXJlZCIsImNsYXNzbmFtZXMiLCJDb2xsYXBzZVBhbmVsIiwicGFuZWxLZXkiLCJoYW5kbGVLZXlQcmVzcyIsImtleUNvZGUiLCJyZW5kZXJJY29uIiwiY29sbGFwc2libGUiLCJyZW5kZXJUaXRsZSIsImhlYWRlciIsInNob3VsZENvbXBvbmVudFVwZGF0ZSIsIm5leHRQcm9wcyIsImhlYWRlckNsYXNzIiwiZGVzdHJveUluYWN0aXZlUGFuZWwiLCJhY2NvcmRpb24iLCJvcGVuTW90aW9uIiwiY29sbGFwc2libGVIZWFkZXIiLCJjb2xsYXBzaWJsZUljb24iLCJoZWFkZXJDbHMiLCJoZWFkZXJQcm9wcyIsImlmRXh0cmFFeGlzdCIsImdldEFjdGl2ZUtleXNBcnJheSIsImN1cnJlbnRBY3RpdmVLZXkiLCJhY3RpdmVLZXlUeXBlIiwiQ29sbGFwc2UiLCJfcHJvcHMiLCJvbkNsaWNrSXRlbSIsInNldEFjdGl2ZUtleSIsImdldE5ld0NoaWxkIiwicm9vdERlc3Ryb3lJbmFjdGl2ZVBhbmVsIiwiY2hpbGRDb2xsYXBzaWJsZSIsIm1lcmdlQ29sbGFwc2libGUiLCJnZXRJdGVtcyIsIl9hY3RpdmVLZXkiLCJuZXh0U3RhdGUiLCJjb2xsYXBzZUNsYXNzTmFtZSIsIlBhbmVsIiwiX3Byb3BzJHNob3dBcnJvdyIsImNvbGxhcHNlUGFuZWxDbGFzc05hbWUiLCJSY0NvbGxhcHNlIiwiX3Byb3BzJGV4cGFuZEljb25Qb3NpIiwiZXhwYW5kSWNvblBvc2l0aW9uIiwibWVyZ2VkRXhwYW5kSWNvblBvc2l0aW9uIiwicmVuZGVyRXhwYW5kSWNvbiIsIlBpY2tlckJ1dHRvbiIsIkNoZWNrYWJsZVRhZyIsIlByZXNldFN0YXR1c0NvbG9yUmVnZXgiLCJQcmVzZXRTdGF0dXNDb2xvclR5cGVzIiwiSW50ZXJuYWxUYWciLCJfYSRjbG9zYWJsZSIsInNldFZpc2libGUiLCJpc1ByZXNldENvbG9yIiwidGFnU3R5bGUiLCJiYWNrZ3JvdW5kQ29sb3IiLCJwcmVzZXRDb2xvciIsInRhZ0NsYXNzTmFtZSIsImhhbmRsZUNsb3NlQ2xpY2siLCJkZWZhdWx0UHJldmVudGVkIiwicmVuZGVyQ2xvc2VJY29uIiwiaXNOZWVkV2F2ZSIsInRhZ1Byb3BzIiwidGFnTm9kZSIsIlRhZyIsIlBpY2tlclRhZyIsIkNhbGVuZGFyT3V0bGluZWQiLCJDYWxlbmRhck91dGxpbmVkU3ZnIiwiQ2xvY2tDaXJjbGVPdXRsaW5lZCIsIkNsb2NrQ2lyY2xlT3V0bGluZWRTdmciLCJTd2FwUmlnaHRPdXRsaW5lZCIsIlN3YXBSaWdodE91dGxpbmVkU3ZnIiwiZ2VuZXJhdGVSYW5nZVBpY2tlciIsImN1c3RvbUdldFBvcHVwQ29udGFpbmVyIiwiYWRkaXRpb25hbE92ZXJyaWRlUHJvcHMiLCJnZXRUaW1lUHJvcHMiLCJmb3JtSXRlbUNvbnRleHQiLCJlblVTIiwiUkNSYW5nZVBpY2tlciIsInRyYW5zUGxhY2VtZW50MkRyb3Bkb3duQWxpZ24iLCJnZXRSYW5nZVBsYWNlaG9sZGVyIiwibGFuZyIsIkNvbXBvbmVudHMiLCJnZW5lcmF0ZVBpY2tlciIsImdldFBpY2tlciIsImN1c3RvbWl6ZUdldFBvcHVwQ29udGFpbmVyIiwiYWRkaXRpb25hbFByb3BzIiwibWVyZ2VkUGlja2VyIiwiUkNQaWNrZXIiLCJnZXRQbGFjZWhvbGRlciIsIldlZWtQaWNrZXIiLCJNb250aFBpY2tlciIsIlllYXJQaWNrZXIiLCJRdWFydGVyUGlja2VyIiwiZ2VuZXJhdGVTaW5nbGVQaWNrZXIiLCJfcHJvcHMkb3JpZW50YXRpb24iLCJvcmllbnRhdGlvbiIsIm9yaWVudGF0aW9uTWFyZ2luIiwicGxhaW4iLCJvcmllbnRhdGlvblByZWZpeCIsImhhc0NoaWxkcmVuIiwiaGFzQ3VzdG9tTWFyZ2luTGVmdCIsImhhc0N1c3RvbU1hcmdpblJpZ2h0IiwiY2xlYW51cCIsIl9nZXRDb21wdXRlZFN0eWxlIiwiZ2V0UG9ydGFsQ29udGFpbmVyIiwiYXV0b0xvY2siLCJkZWJ1ZyIsIl9wcm9wcyRhdXRvRGVzdHJveSIsInNob3VsZFJlbmRlciIsInNldFNob3VsZFJlbmRlciIsIm1lcmdlZFJlbmRlciIsImlubmVyQ29udGFpbmVyIiwic2V0SW5uZXJDb250YWluZXIiLCJjdXN0b21pemVDb250YWluZXIiLCJfdXNlRG9tIiwidXNlRG9tIiwiX3VzZURvbTIiLCJkZWZhdWx0Q29udGFpbmVyIiwicXVldWVDcmVhdGUiLCJtZXJnZWRDb250YWluZXIiLCJ1c2VTY3JvbGxMb2NrZXIiLCJjaGlsZFJlZiIsInJlbmRlcklubGluZSIsImlubGluZU1vY2siLCJyZWZmZWRDaGlsZHJlbiIsIkRyYXdlclBhbmVsIiwic2VudGluZWxTdHlsZSIsIm91dGxpbmUiLCJEcmF3ZXJQb3B1cCIsIl9wdXNoQ29uZmlnJGRpc3RhbmNlIiwiX3B1c2hDb25maWciLCJrZXlib2FyZCIsInJvb3RTdHlsZSIsImNvbnRlbnRXcmFwcGVyU3R5bGUiLCJtYXNrQ2xhc3NOYW1lIiwibWFza1N0eWxlIiwiYWZ0ZXJPcGVuQ2hhbmdlIiwic2VudGluZWxTdGFydFJlZiIsInNlbnRpbmVsRW5kUmVmIiwib25QYW5lbEtleURvd24iLCJfc2VudGluZWxTdGFydFJlZiRjdXIiLCJwcmV2ZW50U2Nyb2xsIiwiX3NlbnRpbmVsRW5kUmVmJGN1cnJlIiwiX3BhbmVsUmVmJGN1cnJlbnQiLCJwdXNoZWQiLCJzZXRQdXNoZWQiLCJEcmF3ZXJDb250ZXh0IiwicHVzaENvbmZpZyIsImRpc3RhbmNlIiwicHVzaERpc3RhbmNlIiwibWVyZ2VkQ29udGV4dCIsIl9wYXJlbnRDb250ZXh0JHB1c2giLCJfcGFyZW50Q29udGV4dCRwdWxsIiwiX3BhcmVudENvbnRleHQkcHVsbDIiLCJtYXNrTm9kZSIsIm1hc2tSZWYiLCJtb3Rpb25NYXNrQ2xhc3NOYW1lIiwibW90aW9uTWFza1N0eWxlIiwid3JhcHBlclN0eWxlIiwicGFyc2VXaWR0aEhlaWdodCIsImNvbnRhaW5lclN0eWxlIiwiUmVmRHJhd2VyUG9wdXAiLCJEcmF3ZXIiLCJfcHJvcHMkb3BlbiIsIl9wcm9wcyRhdXRvRm9jdXMiLCJfcHJvcHMka2V5Ym9hcmQiLCJfcHJvcHMkd2lkdGgiLCJfcHJvcHMkbWFzayIsIl9wcm9wcyRtYXNrQ2xvc2FibGUiLCJkZXN0cm95T25DbG9zZSIsImFuaW1hdGVkVmlzaWJsZSIsInNldEFuaW1hdGVkVmlzaWJsZSIsImxhc3RBY3RpdmVSZWYiLCJpbnRlcm5hbEFmdGVyT3BlbkNoYW5nZSIsIl9sYXN0QWN0aXZlUmVmJGN1cnJlbiIsImRyYXdlclBvcHVwUHJvcHMiLCJkZWZhdWx0UHVzaFN0YXRlIiwiX3Byb3BzJGNsb3NhYmxlIiwiX3Byb3BzJHB1c2giLCJfcHJvcHMkY2xvc2VJY29uIiwiZHJhd2VyU3R5bGUiLCJoZWFkZXJTdHlsZSIsImZvb3RlciIsImZvb3RlclN0eWxlIiwiY3VzdG9taXplR2V0Q29udGFpbmVyIiwiX2FmdGVyT3BlbkNoYW5nZSIsImNsb3NlSWNvbk5vZGUiLCJyZW5kZXJIZWFkZXIiLCJyZW5kZXJGb290ZXIiLCJmb290ZXJDbGFzc05hbWUiLCJkcmF3ZXJDbGFzc05hbWUiLCJtZXJnZWRXaWR0aCIsIm1lcmdlZEhlaWdodCIsIm1vdGlvbkVudGVyIiwibW90aW9uTGVhdmUiLCJwYW5lbE1vdGlvbiIsIm1vdGlvblBsYWNlbWVudCIsIlJjRHJhd2VyIiwidG9FcnJvckVudGl0eSIsImVycm9yU3RhdHVzIiwiRXJyb3JMaXN0IiwiaGVscCIsImhlbHBTdGF0dXMiLCJfcmVmJGVycm9ycyIsIl9yZWYkd2FybmluZ3MiLCJmaWVsZElkIiwiYmFzZUNsYXNzTmFtZSIsImRlYm91bmNlRXJyb3JzIiwidXNlRGVib3VuY2UiLCJkZWJvdW5jZVdhcm5pbmdzIiwiZnVsbEtleUxpc3QiLCJoZWxwUHJvcHMiLCJob2xkZXJQcm9wcyIsImhvbGRlckNsYXNzTmFtZSIsImhvbGRlclN0eWxlIiwiaXRlbVByb3BzIiwiaXRlbVN0eWxlIiwiQSIsImNvbXB1dGUiLCJ1c2VSY0Zvcm0iLCJjb250ZXh0Rm9ybSIsIl9wcm9wcyRkaXNhYmxlZCIsImNvbG9uIiwibGFiZWxXcmFwIiwibGFiZWxDb2wiLCJ3cmFwcGVyQ29sIiwiaGlkZVJlcXVpcmVkTWFyayIsIl9wcm9wcyRsYXlvdXQiLCJsYXlvdXQiLCJzY3JvbGxUb0ZpcnN0RXJyb3IiLCJyZXF1aXJlZE1hcmsiLCJyZXN0Rm9ybVByb3BzIiwibWVyZ2VkUmVxdWlyZWRNYXJrIiwibWVyZ2VkQ29sb24iLCJmb3JtQ2xhc3NOYW1lIiwid3JhcEZvcm0iLCJfX0lOVEVSTkFMX18iLCJvbkludGVybmFsRmluaXNoRmFpbGVkIiwiZXJyb3JJbmZvIiwiZGVmYXVsdFNjcm9sbFRvRmlyc3RFcnJvciIsImVycm9yRmllbGRzIiwic2Nyb2xsVG9GaWVsZCIsInVzZUZvcm1JdGVtU3RhdHVzIiwiUXVlc3Rpb25DaXJjbGVPdXRsaW5lZCIsIlF1ZXN0aW9uQ2lyY2xlT3V0bGluZWRTdmciLCJ0b1Rvb2x0aXBQcm9wcyIsInRvb2x0aXAiLCJGb3JtSXRlbUxhYmVsIiwiaHRtbEZvciIsIl91c2VMb2NhbGVSZWNlaXZlciIsIl91c2VMb2NhbGVSZWNlaXZlcjIiLCJmb3JtTG9jYWxlIiwiY29udGV4dExhYmVsQWxpZ24iLCJjb250ZXh0TGFiZWxDb2wiLCJjb250ZXh0Q29sb24iLCJtZXJnZWRMYWJlbENvbCIsIm1lcmdlZExhYmVsQWxpZ24iLCJsYWJlbENsc0Jhc2ljIiwibGFiZWxDb2xDbGFzc05hbWUiLCJsYWJlbENoaWxkcmVuIiwiY29tcHV0ZWRDb2xvbiIsImhhdmVDb2xvbiIsIl90b29sdGlwUHJvcHMkaWNvbiIsInJlc3RUb29sdGlwUHJvcHMiLCJ0b29sdGlwTm9kZSIsIm9wdGlvbmFsIiwibGFiZWxDbGFzc05hbWUiLCJGb3JtSXRlbUlucHV0IiwiZm9ybUl0ZW1SZW5kZXIiLCJfaW50ZXJuYWxJdGVtUmVuZGVyIiwib25FcnJvclZpc2libGVDaGFuZ2VkIiwibWVyZ2VkV3JhcHBlckNvbCIsInN1YkZvcm1Db250ZXh0IiwiaW5wdXREb20iLCJlcnJvckxpc3REb20iLCJleHRyYURvbSIsImRvbSIsIm1hcmsiLCJlcnJvckxpc3QiLCJpY29uTWFwIiwiSXRlbUhvbGRlciIsIl9pdGVtQ2xhc3NOYW1lIiwidmFsaWRhdGVTdGF0dXMiLCJpc1JlcXVpcmVkIiwib25TdWJJdGVtTWV0YUNoYW5nZSIsImhhc0hlbHAiLCJoYXNFcnJvciIsInNldE1hcmdpbkJvdHRvbSIsInBhcnNlSW50IiwibWVyZ2VkVmFsaWRhdGVTdGF0dXMiLCJmb3JtSXRlbVN0YXR1c0NvbnRleHQiLCJJY29uTm9kZSIsIk5BTUVfU1BMSVQiLCJNZW1vSW5wdXQiLCJ1cGRhdGUiLCJldmVyeSIsImhhc1ZhbGlkTmFtZSIsImdlbkVtcHR5TWV0YSIsIkludGVybmFsRm9ybUl0ZW0iLCJub1N0eWxlIiwiX3VzZUNvbnRleHQyIiwiZm9ybU5hbWUiLCJub3RpZnlQYXJlbnRNZXRhQ2hhbmdlIiwiX3VzZUNvbnRleHQzIiwiY29udGV4dFZhbGlkYXRlVHJpZ2dlciIsImhhc05hbWUiLCJMaXN0Q29udGV4dCIsImZpZWxkS2V5UGF0aFJlZiIsIl91c2VGcmFtZVN0YXRlIiwidXNlRnJhbWVTdGF0ZSIsIl91c2VGcmFtZVN0YXRlMiIsInN1YkZpZWxkRXJyb3JzIiwic2V0U3ViRmllbGRFcnJvcnMiLCJzZXRNZXRhIiwibmV4dE1ldGEiLCJrZXlJbmZvIiwiX2tleUluZm8iLCJmaWVsZEtleSIsInJlc3RQYXRoIiwic3ViTWV0YSIsInVuaXF1ZUtleXMiLCJwcmV2U3ViRmllbGRFcnJvcnMiLCJtZXJnZWROYW1lUGF0aCIsIm1lcmdlZE5hbWVLZXkiLCJ3YXJuaW5nTGlzdCIsInN1YkZpZWxkRXJyb3IiLCJtZXJnZWRFcnJvcnMiLCJtZXJnZWRXYXJuaW5ncyIsImdldEl0ZW1SZWYiLCJ1c2VJdGVtUmVmIiwicmVuZGVyTGF5b3V0IiwiYmFzZUNoaWxkcmVuIiwidmFyaWFibGVzIiwicmVuZGVyTWV0YSIsIm1lcmdlZE5hbWUiLCJnZXRGaWVsZElkIiwicnVsZUVudGl0eSIsIm1lcmdlZENvbnRyb2wiLCJkZXNjcmliZWRieUFyciIsInRyaWdnZXJzIiwiX2EyIiwiX2MyIiwiX2MiLCJ3YXRjaGluZ0NoaWxkUHJvcHMiLCJGb3JtSXRlbSIsIkZvcm1MaXN0Iiwib3BlcmF0aW9uIiwiZmllbGQiLCJFeWVPdXRsaW5lZCIsIkV5ZU91dGxpbmVkU3ZnIiwiZnVsbENsb25lIiwibWFza1Byb3BzIiwiYXJpYUlkIiwiYm9keVByb3BzIiwibW9kYWxSZW5kZXIiLCJob2xkZXJSZWYiLCJjaGFuZ2VBY3RpdmUiLCJfZG9jdW1lbnQiLCJjb250ZW50U3R5bGUiLCJmb290ZXJOb2RlIiwiaGVhZGVyTm9kZSIsImNsb3NlciIsIkNvbnRlbnQiLCJtb3VzZVBvc2l0aW9uIiwiZGlhbG9nUmVmIiwic2V0VHJhbnNmb3JtT3JpZ2luIiwib25QcmVwYXJlIiwiZWxlbWVudE9mZnNldCIsIkRpYWxvZyIsIl9wcm9wcyRmb2N1c1RyaWdnZXJBZiIsImZvY3VzVHJpZ2dlckFmdGVyQ2xvc2UiLCJ3cmFwU3R5bGUiLCJ3cmFwQ2xhc3NOYW1lIiwid3JhcFByb3BzIiwiYWZ0ZXJDbG9zZSIsImxhc3RPdXRTaWRlQWN0aXZlRWxlbWVudFJlZiIsImNvbnRlbnRSZWYiLCJzYXZlTGFzdE91dFNpZGVBY3RpdmVFbGVtZW50UmVmIiwiZm9jdXNEaWFsb2dDb250ZW50IiwiX2NvbnRlbnRSZWYkY3VycmVudCIsIm9uRGlhbG9nVmlzaWJsZUNoYW5nZWQiLCJvbkludGVybmFsQ2xvc2UiLCJjb250ZW50Q2xpY2tSZWYiLCJjb250ZW50VGltZW91dFJlZiIsIm9uQ29udGVudE1vdXNlRG93biIsIm9uQ29udGVudE1vdXNlVXAiLCJvbldyYXBwZXJDbGljayIsIm9uV3JhcHBlcktleURvd24iLCJnZXRNb3Rpb25OYW1lIiwiRGlhbG9nV3JhcCIsIl9wcm9wcyRkZXN0cm95T25DbG9zZSIsIl9hZnRlckNsb3NlIiwicHJldmlld1VybHMiLCJzZXRQcmV2aWV3VXJscyIsInNldEN1cnJlbnQiLCJzZXRTaG93UHJldmlldyIsInNldE1vdXNlUG9zaXRpb24iLCJyZWdpc3RlckltYWdlIiwiUHJvdmlkZXIiLCJfcmVmJHByZXZpZXdQcmVmaXhDbHMiLCJwcmV2aWV3UHJlZml4Q2xzIiwiX3JlZiRpY29ucyIsImljb25zIiwicHJldmlldyIsIl9yZWYyJHZpc2libGUiLCJwcmV2aWV3VmlzaWJsZSIsIl9yZWYyJG9uVmlzaWJsZUNoYW5nZSIsIm9uUHJldmlld1Zpc2libGVDaGFuZ2UiLCJfcmVmMiRnZXRDb250YWluZXIiLCJfcmVmMiRjdXJyZW50IiwiY3VycmVudEluZGV4IiwiX3JlZjIkY291bnRSZW5kZXIiLCJjb3VudFJlbmRlciIsImRpYWxvZ1Byb3BzIiwiaXNTaG93UHJldmlldyIsImlzQ29udHJvbGxlZCIsInByZXZpZXdVcmxzS2V5cyIsImN1cnJlbnRDb250cm9sbGVkS2V5IiwiY2FuUHJldmlld1VybHMiLCJjYW5QcmV2aWV3IiwidXJsIiwidW5SZWdpc3RlciIsIm9sZFByZXZpZXdVcmxzIiwiY2xvbmVQcmV2aWV3VXJscyIsImRlbGV0ZVJlc3VsdCIsIm9uUHJldmlld0Nsb3NlIiwiaXNQcmV2aWV3R3JvdXAiLCJQcmV2aWV3IiwiT3BlcmF0aW9ucyIsIl9jb3VudFJlbmRlciIsInNob3dTd2l0Y2giLCJzaG93UHJvZ3Jlc3MiLCJzY2FsZSIsIm9uU3dpdGNoTGVmdCIsIm9uU3dpdGNoUmlnaHQiLCJvblpvb21JbiIsIm9uWm9vbU91dCIsIm9uUm90YXRlUmlnaHQiLCJvblJvdGF0ZUxlZnQiLCJyb3RhdGVMZWZ0Iiwicm90YXRlUmlnaHQiLCJ6b29tSW4iLCJ6b29tT3V0IiwidG9vbENsYXNzTmFtZSIsImljb25DbGFzc05hbWUiLCJ0b29scyIsIk1BWF9TQ0FMRSIsIk1JTl9TQ0FMRSIsIl9jbGFzc25hbWVzMyIsInNldFRyYW5zZm9ybSIsInJlc2V0VHJhbnNmb3JtIiwidXBkYXRlVHJhbnNmb3JtIiwiZGlzcGF0Y2hab29uQ2hhbmdlIiwic3JjIiwiX3Byb3BzJGljb25zIiwiX3Byb3BzJHNjYWxlU3RlcCIsInNjYWxlU3RlcCIsIl9wcm9wcyR0cmFuc2l0aW9uTmFtZSIsIl9wcm9wcyRtYXNrVHJhbnNpdGlvbiIsImltZ1JlZiIsImRvd25Qb3NpdGlvblJlZiIsImRlbHRhWCIsInRyYW5zZm9ybVgiLCJ0cmFuc2Zvcm1ZIiwiaXNNb3ZpbmciLCJzZXRNb3ZpbmciLCJwcmV2aWV3R3JvdXBDb3VudCIsImN1cnJlbnRQcmV2aWV3SW5kZXgiLCJjb21iaW5hdGlvblNyYyIsInNob3dMZWZ0T3JSaWdodFN3aXRjaGVzIiwic2hvd09wZXJhdGlvbnNQcm9ncmVzcyIsIl91c2VJbWFnZVRyYW5zZm9ybSIsInVzZUltYWdlVHJhbnNmb3JtIiwib25BZnRlckNsb3NlIiwiQkFTRV9TQ0FMRV9SQVRJTyIsIl9kb3duUG9zaXRpb25SZWYkY3VyciIsImhhc0NoYW5nZWRQb3NpdGlvbiIsIl9pbWdSZWYkY3VycmVudCRnZXRCbyIsImlzUm90YXRlIiwiZml4U3RhdGUiLCJnZXRGaXhTY2FsZUVsZVRyYW5zUG9zaXRpb24iLCJvbldoZWVsIiwic2NhbGVSYXRpbyIsIm1lcmdlZFNjYWxlUmF0aW8iLCJXSEVFTF9NQVhfU0NBTEVfUkFUSU8iLCJyYXRpbyIsImNsaWVudFgiLCJjbGllbnRZIiwib25Eb3VibGVDbGljayIsIm9uVG9wTW91c2VVcExpc3RlbmVyIiwib25Ub3BNb3VzZU1vdmVMaXN0ZW5lciIsIm9uTW91c2VVcExpc3RlbmVyIiwib25Nb3VzZU1vdmVMaXN0ZW5lciIsIm9uS2V5RG93bkxpc3RlbmVyIiwiX29uVG9wTW91c2VVcExpc3RlbmVyIiwiX29uVG9wTW91c2VNb3ZlTGlzdGVuIiwiSW1hZ2VJbnRlcm5hbCIsIl9pbWdDb21tb25Qcm9wcyRzdHlsZSIsImltZ1NyYyIsIm9uSW5pdGlhbFByZXZpZXdDbG9zZSIsImZhbGxiYWNrIiwiX3JlZiRwcmV2aWV3Iiwib25JbWFnZUVycm9yIiwib25FcnJvciIsIndyYXBwZXJDbGFzc05hbWUiLCJjcm9zc09yaWdpbiIsImRlY29kaW5nIiwicmVmZXJyZXJQb2xpY3kiLCJzcmNTZXQiLCJ1c2VNYXAiLCJkcmFnZ2FibGUiLCJpc0N1c3RvbVBsYWNlaG9sZGVyIiwicHJldmlld1NyYyIsImdldFByZXZpZXdDb250YWluZXIiLCJwcmV2aWV3TWFzayIsInNldFN0YXR1cyIsImlzRXJyb3IiLCJzZXRHcm91cFNob3dQcmV2aWV3Iiwic2V0R3JvdXBNb3VzZVBvc2l0aW9uIiwiaXNMb2FkZWQiLCJvbkxvYWQiLCJvblByZXZpZXciLCJfZ2V0T2Zmc2V0IiwiZ2V0SW1nUmVmIiwiaW1nIiwiY29tcGxldGUiLCJuYXR1cmFsV2lkdGgiLCJuYXR1cmFsSGVpZ2h0Iiwid3JhcHBlckNsYXNzIiwibWVyZ2VkU3JjIiwiaW1nQ29tbW9uUHJvcHMiLCJQcmV2aWV3R3JvdXAiLCJSb3RhdGVMZWZ0T3V0bGluZWQiLCJSb3RhdGVMZWZ0T3V0bGluZWRTdmciLCJSb3RhdGVSaWdodE91dGxpbmVkIiwiUm90YXRlUmlnaHRPdXRsaW5lZFN2ZyIsIlpvb21Jbk91dGxpbmVkIiwiWm9vbUluT3V0bGluZWRTdmciLCJab29tT3V0T3V0bGluZWQiLCJab29tT3V0T3V0bGluZWRTdmciLCJJbnRlcm5hbFByZXZpZXdHcm91cCIsIm1lcmdlZFByZXZpZXciLCJfcHJldmlldyIsIlJjSW1hZ2UiLCJfdXNlQ29udGV4dCRsb2NhbGUiLCJpbWFnZUxvY2FsZSIsInJlc3RQcmV2aWV3UHJvcHMiLCJjb21wYWN0IiwiZ3JvdXBGb3JtSXRlbUNvbnRleHQiLCJoYXNBZGRvbiIsImhhc1ByZWZpeFN1ZmZpeCIsInJlc29sdmVPbkNoYW5nZSIsInRyaWdnZXJGb2N1cyIsImZpeENvbnRyb2xsZWRWYWx1ZSIsIkJhc2VJbnB1dCIsImFkZG9uQmVmb3JlIiwiYWRkb25BZnRlciIsImFmZml4V3JhcHBlckNsYXNzTmFtZSIsImdyb3VwQ2xhc3NOYW1lIiwiaGFuZGxlUmVzZXQiLCJvbklucHV0Q2xpY2siLCJnZXRDbGVhckljb24iLCJuZWVkQ2xlYXIiLCJjbGVhckljb25DbHMiLCJhZmZpeFdyYXBwZXJQcmVmaXhDbHMiLCJhZmZpeFdyYXBwZXJDbHMiLCJ3cmFwcGVyQ2xzIiwiYWRkb25DbHMiLCJtZXJnZWRXcmFwcGVyQ2xhc3NOYW1lIiwibWVyZ2VkR3JvdXBDbGFzc05hbWUiLCJvblByZXNzRW50ZXIiLCJodG1sU2l6ZSIsInNob3dDb3VudCIsImlucHV0Q2xhc3NOYW1lIiwiX2lucHV0UmVmJGN1cnJlbnQiLCJzZXRTZWxlY3Rpb25SYW5nZSIsIl9pbnB1dFJlZiRjdXJyZW50MiIsInNlbGVjdCIsIl9pbnB1dFJlZiRjdXJyZW50MyIsImhhbmRsZUZvY3VzIiwiaGFuZGxlQmx1ciIsImdldFN1ZmZpeCIsImhhc01heExlbmd0aCIsInZhbHVlTGVuZ3RoIiwiZGF0YUNvdW50IiwiZm9ybWF0dGVyIiwicmVtb3ZlUGFzc3dvcmRUaW1lb3V0IiwidGFyZ2V0VmFsdWUiLCJjbG9uZU5vZGUiLCJjcmVhdGUiLCJjdXN0b21TaXplIiwiaW5wdXRIYXNQcmVmaXhTdWZmaXgiLCJwcmV2SGFzUHJlZml4U3VmZml4IiwidXNlUmVtb3ZlUGFzc3dvcmRUaW1lb3V0IiwibWVyZ2VkQWxsb3dDbGVhciIsIlJjSW5wdXQiLCJFeWVJbnZpc2libGVPdXRsaW5lZCIsIkV5ZUludmlzaWJsZU91dGxpbmVkU3ZnIiwiZGVmYXVsdEljb25SZW5kZXIiLCJBY3Rpb25NYXAiLCJjbGljayIsImhvdmVyIiwiUGFzc3dvcmQiLCJfcHJvcHMkdmlzaWJpbGl0eVRvZ2ciLCJ2aXNpYmlsaXR5VG9nZ2xlIiwidmlzaWJpbGl0eUNvbnRyb2xsZWQiLCJnZXRJY29uIiwiX2ljb25Qcm9wcyIsIl9wcm9wcyRhY3Rpb24iLCJfcHJvcHMkaWNvblJlbmRlciIsImljb25SZW5kZXIiLCJpY29uVHJpZ2dlciIsImljb25Qcm9wcyIsInJlbmRlclBhc3N3b3JkIiwiY3VzdG9taXplSW5wdXRQcmVmaXhDbHMiLCJpbnB1dFByZWZpeENscyIsIm9taXR0ZWRQcm9wcyIsIlNlYXJjaCIsIl9wcm9wcyRlbnRlckJ1dHRvbiIsImVudGVyQnV0dG9uIiwiY3VzdG9tT25TZWFyY2giLCJjdXN0b21PbkNoYW5nZSIsImNvbXBvc2VkUmVmIiwic2VhcmNoSWNvbiIsImJ0bkNsYXNzTmFtZSIsImVudGVyQnV0dG9uQXNFbGVtZW50IiwiaXNBbnRkQnV0dG9uIiwiaGFuZGxlT25Db21wb3NpdGlvblN0YXJ0IiwiaGFuZGxlT25Db21wb3NpdGlvbkVuZCIsIlJFU0laRV9TVEFSVCIsIlJFU0laRV9NRUFTVVJJTkciLCJSRVNJWkVfU1RBQkxFIiwiUmVzaXphYmxlVGV4dEFyZWEiLCJhdXRvU2l6ZSIsIm9uSW50ZXJuYWxBdXRvU2l6ZSIsInNldE1lcmdlZFZhbHVlIiwib25JbnRlcm5hbENoYW5nZSIsInRleHRhcmVhUmVmIiwidGV4dEFyZWEiLCJtaW5Sb3dzIiwibWF4Um93cyIsIm5lZWRBdXRvU2l6ZSIsImZpeEZpcmVmb3hBdXRvU2Nyb2xsIiwiX3RleHRhcmVhUmVmJGN1cnJlbnQiLCJzZWxlY3Rpb25TdGFydCIsInNlbGVjdGlvbkVuZCIsInJlc2l6ZVN0YXRlIiwic2V0UmVzaXplU3RhdGUiLCJhdXRvU2l6ZVN0eWxlIiwic2V0QXV0b1NpemVTdHlsZSIsInN0YXJ0UmVzaXplIiwidGV4dGFyZWFTdHlsZXMiLCJjYWxjdWxhdGVBdXRvU2l6ZVN0eWxlIiwicmVzaXplUmFmUmVmIiwibWVyZ2VkQXV0b1NpemVTdHlsZSIsIm92ZXJmbG93WCIsIlRleHRBcmVhIiwicmVzaXphYmxlVGV4dEFyZWEiLCJzYXZlVGV4dEFyZWEiLCJDbGVhcmFibGVJbnB1dFR5cGUiLCJDbGVhcmFibGVMYWJlbGVkSW5wdXQiLCJyZW5kZXJDbGVhckljb24iLCJyZW5kZXJUZXh0QXJlYVdpdGhDbGVhckljb24iLCJzdGF0dXNDb250ZXh0IiwiaW5wdXRUeXBlIiwiZml4RW1vamlMZW5ndGgiLCJzZXRUcmlnZ2VyVmFsdWUiLCJpc0N1cnNvckluRW5kIiwicHJlVmFsdWUiLCJ0cmlnZ2VyVmFsdWUiLCJuZXdUcmlnZ2VyVmFsdWUiLCJfYSRzaG93Q291bnQiLCJjbGVhcmFibGVJbnB1dFJlZiIsImNvbXBvc2l0aW5nIiwic2V0Q29tcG9zaXRpbmciLCJvbGRDb21wb3NpdGlvblZhbHVlUmVmIiwib2xkU2VsZWN0aW9uU3RhcnRSZWYiLCJoYW5kbGVTZXRWYWx1ZSIsIm9uSW50ZXJuYWxDb21wb3NpdGlvblN0YXJ0Iiwib25JbnRlcm5hbENvbXBvc2l0aW9uRW5kIiwiUmNUZXh0QXJlYSIsInJlc2l6ZSIsInRleHRhcmVhTm9kZSIsIlVwT3V0bGluZWQiLCJVcE91dGxpbmVkU3ZnIiwiTnVtYmVyRGVjaW1hbCIsIm5lZ2F0ZSIsIkJpZ0ludERlY2ltYWwiLCJnZXRNYXJrIiwiU1RFUF9JTlRFUlZBTCIsIlNURVBfREVMQVkiLCJTdGVwSGFuZGxlciIsInVwTm9kZSIsImRvd25Ob2RlIiwidXBEaXNhYmxlZCIsImRvd25EaXNhYmxlZCIsIm9uU3RlcCIsInN0ZXBUaW1lb3V0UmVmIiwib25TdGVwUmVmIiwib25TdGVwTW91c2VEb3duIiwidXAiLCJsb29wU3RlcCIsIm9uU3RvcFN0ZXAiLCJoYW5kbGVyQ2xhc3NOYW1lIiwidXBDbGFzc05hbWUiLCJkb3duQ2xhc3NOYW1lIiwic2hhcmVkSGFuZGxlclByb3BzIiwiY2xlYW5VcCIsImdldERlY2ltYWxWYWx1ZSIsInN0cmluZ01vZGUiLCJkZWNpbWFsVmFsdWUiLCJpc0VtcHR5IiwiZ2V0RGVjaW1hbElmVmFsaWRhdGUiLCJkZWNpbWFsIiwiZ2V0TWluaURlY2ltYWwiLCJpc0ludmFsaWRhdGUiLCJJbnB1dE51bWJlciIsIl9wcm9wcyRzdGVwIiwidXBIYW5kbGVyIiwiZG93bkhhbmRsZXIiLCJfcHJvcHMkY29udHJvbHMiLCJjb250cm9scyIsInBhcnNlciIsInByZWNpc2lvbiIsImRlY2ltYWxTZXBhcmF0b3IiLCJvbklucHV0Iiwic2V0Rm9jdXMiLCJ1c2VyVHlwaW5nUmVmIiwiY29tcG9zaXRpb25SZWYiLCJzaGlmdEtleVJlZiIsInNldERlY2ltYWxWYWx1ZSIsInNldFVuY29udHJvbGxlZERlY2ltYWxWYWx1ZSIsIm5ld0RlY2ltYWwiLCJnZXRQcmVjaXNpb24iLCJudW1TdHIiLCJ1c2VyVHlwaW5nIiwiZ2V0TnVtYmVyUHJlY2lzaW9uIiwibWVyZ2VkUGFyc2VyIiwicGFyc2VkU3RyIiwiaW5wdXRWYWx1ZVJlZiIsIm1lcmdlZEZvcm1hdHRlciIsIm51bTJzdHIiLCJtZXJnZWRQcmVjaXNpb24iLCJ2YWxpZGF0ZU51bWJlciIsInNlcGFyYXRvclN0ciIsInRvRml4ZWQiLCJpbml0VmFsdWUiLCJzZXRJbnRlcm5hbElucHV0VmFsdWUiLCJzZXRJbnB1dFZhbHVlIiwibWF4RGVjaW1hbCIsIm1pbkRlY2ltYWwiLCJsZXNzRXF1YWxzIiwiX3VzZUN1cnNvciIsInVzZUN1cnNvciIsIl91c2VDdXJzb3IyIiwicmVjb3JkQ3Vyc29yIiwicmVzdG9yZUN1cnNvciIsImdldFJhbmdlVmFsdWUiLCJpc0luUmFuZ2UiLCJ0cmlnZ2VyVmFsdWVVcGRhdGUiLCJ1cGRhdGVWYWx1ZSIsImlzUmFuZ2VWYWxpZGF0ZSIsImVxdWFscyIsIm9uTmV4dFByb21pc2UiLCJ1c2VGcmFtZSIsImNvbGxlY3RJbnB1dFZhbHVlIiwiaW5wdXRTdHIiLCJmaW5hbFZhbHVlIiwiZmluYWxEZWNpbWFsIiwibmV4dElucHV0U3RyIiwib25JbnRlcm5hbElucHV0Iiwib25JbnRlcm5hbFN0ZXAiLCJzdGVwRGVjaW1hbCIsImdldERlY3VwbGVTdGVwcyIsInVwZGF0ZWRWYWx1ZSIsImZsdXNoSW5wdXRWYWx1ZSIsInBhcnNlZFZhbHVlIiwib25CZWZvcmVJbnB1dCIsImN1cnJlbnRQYXJzZWRWYWx1ZSIsInVwSWNvbiIsImRvd25JY29uIiwiY29udHJvbHNUZW1wIiwibWVyZ2VTaXplIiwiaW5wdXROdW1iZXJDbGFzcyIsIlJjSW5wdXROdW1iZXIiLCJhZGRvbkNsYXNzTmFtZSIsImFkZG9uQmVmb3JlTm9kZSIsImFkZG9uQWZ0ZXJOb2RlIiwiRG91YmxlTGVmdE91dGxpbmVkIiwiRG91YmxlTGVmdE91dGxpbmVkU3ZnIiwiRG91YmxlUmlnaHRPdXRsaW5lZCIsIkRvdWJsZVJpZ2h0T3V0bGluZWRTdmciLCJQYWdlciIsInBhZ2UiLCJzaG93VGl0bGUiLCJpdGVtUmVuZGVyIiwiT3B0aW9ucyIsImdvSW5wdXRUZXh0IiwiYnVpbGRPcHRpb25UZXh0IiwiaXRlbXNfcGVyX3BhZ2UiLCJjaGFuZ2VTaXplIiwiZ29CdXR0b24iLCJxdWlja0dvIiwiZ2V0VmFsaWRWYWx1ZSIsImdvIiwiS0VZQ09ERSIsImdldFBhZ2VTaXplT3B0aW9ucyIsInBhZ2VTaXplIiwicGFnZVNpemVPcHRpb25zIiwibnVtYmVyQSIsIm51bWJlckIiLCJzZWxlY3RDb21wb25lbnRDbGFzcyIsInNlbGVjdFByZWZpeENscyIsImNoYW5nZVNlbGVjdCIsImdvSW5wdXQiLCJnb3RvQnV0dG9uIiwidHJpZ2dlck5vZGUiLCJwYWdlX3NpemUiLCJqdW1wX3RvX2NvbmZpcm0iLCJqdW1wX3RvIiwiaXNJbnRlZ2VyIiwiaXNGaW5pdGUiLCJkZWZhdWx0SXRlbVJlbmRlciIsImNhbGN1bGF0ZVBhZ2UiLCJ0b3RhbCIsImdldEp1bXBQcmV2UGFnZSIsInNob3dMZXNzSXRlbXMiLCJnZXRKdW1wTmV4dFBhZ2UiLCJnZXRJdGVtSWNvbiIsInNhdmVQYWdpbmF0aW9uTm9kZSIsInBhZ2luYXRpb25Ob2RlIiwiaXNWYWxpZCIsInNob3VsZERpc3BsYXlRdWlja0p1bXBlciIsInNob3dRdWlja0p1bXBlciIsIkFSUk9XX1VQIiwiQVJST1dfRE9XTiIsImhhbmRsZUtleVVwIiwiY3VycmVudElucHV0VmFsdWUiLCJjaGFuZ2VQYWdlU2l6ZSIsIm5ld0N1cnJlbnQiLCJvblNob3dTaXplQ2hhbmdlIiwiY3VycmVudFBhZ2UiLCJuZXdQYWdlIiwiaGFzUHJldiIsImhhc05leHQiLCJqdW1wUHJldiIsImp1bXBOZXh0IiwicnVuSWZFbnRlciIsImNoYXJDb2RlIiwicmVzdFBhcmFtcyIsInJ1bklmRW50ZXJQcmV2IiwicnVuSWZFbnRlck5leHQiLCJydW5JZkVudGVySnVtcFByZXYiLCJydW5JZkVudGVySnVtcE5leHQiLCJoYW5kbGVHb1RPIiwiaGFzT25DaGFuZ2UiLCJoYXNDdXJyZW50IiwiY29uc29sZSIsIl9jdXJyZW50IiwiZGVmYXVsdEN1cnJlbnQiLCJfcGFnZVNpemUiLCJkZWZhdWx0UGFnZVNpemUiLCJsYXN0Q3VycmVudE5vZGUiLCJhbGxQYWdlcyIsImdldFNob3dTaXplQ2hhbmdlciIsInNob3dTaXplQ2hhbmdlciIsInRvdGFsQm91bmRhcnlTaG93U2l6ZUNoYW5nZXIiLCJyZW5kZXJQcmV2IiwicHJldlBhZ2UiLCJwcmV2QnV0dG9uIiwicmVuZGVyTmV4dCIsIm5leHRQYWdlIiwibmV4dEJ1dHRvbiIsImhpZGVPblNpbmdsZVBhZ2UiLCJzaG93VG90YWwiLCJzaW1wbGUiLCJzaG93UHJldk5leHRKdW1wZXJzIiwianVtcFByZXZJY29uIiwianVtcE5leHRJY29uIiwicGFnZXJMaXN0IiwiZmlyc3RQYWdlciIsImxhc3RQYWdlciIsInBhZ2VCdWZmZXJTaXplIiwidG90YWxUZXh0IiwicHJldl9wYWdlIiwibmV4dF9wYWdlIiwicGFnZXJQcm9wcyIsInByZXZJdGVtVGl0bGUiLCJwcmV2XzMiLCJwcmV2XzUiLCJuZXh0SXRlbVRpdGxlIiwibmV4dF8zIiwibmV4dF81IiwiX2kiLCJfYWN0aXZlIiwidW5zaGlmdCIsInByZXZEaXNhYmxlZCIsIm5leHREaXNhYmxlZCIsIkxPQ0FMRSIsIk1pbmlTZWxlY3QiLCJNaWRkbGVTZWxlY3QiLCJjdXN0b21pemVTZWxlY3RQcmVmaXhDbHMiLCJjdXN0b21Mb2NhbGUiLCJfdXNlQnJlYWtwb2ludCIsInVzZUJyZWFrcG9pbnQiLCJfUmVhY3QkdXNlQ29udGV4dCRwYWciLCJwYWdpbmF0aW9uIiwibWVyZ2VkU2hvd1NpemVDaGFuZ2VyIiwiZ2V0SWNvbnNQcm9wcyIsImVsbGlwc2lzIiwiaXNTbWFsbCIsImV4dGVuZGVkQ2xhc3NOYW1lIiwiUmNQYWdpbmF0aW9uIiwiZGVmYXVsdEluZGljYXRvciIsInJlbmRlckluZGljYXRvciIsImluZGljYXRvciIsImRvdENsYXNzTmFtZSIsInNob3VsZERlbGF5Iiwic3Bpbm5pbmciLCJTcGluIiwic3BpblByZWZpeENscyIsIl9wcm9wcyRzcGlubmluZyIsImN1c3RvbVNwaW5uaW5nIiwidGlwIiwic2V0U3Bpbm5pbmciLCJ1cGRhdGVTcGlubmluZyIsImRlYm91bmNlIiwiaXNOZXN0ZWRQYXR0ZXJuIiwicmVuZGVyU3BpbiIsInNwaW5DbGFzc05hbWUiLCJzcGluRWxlbWVudCIsImNvbnRhaW5lckNsYXNzTmFtZSIsIlNwaW5GQyIsInNwaW5DbGFzc1Byb3BzIiwic2V0RGVmYXVsdEluZGljYXRvciIsImlzVGhlbmFibGUiLCJ0aGluZyIsIkFjdGlvbkJ1dHRvbiIsImNsaWNrZWRSZWYiLCJoYW5kbGVQcm9taXNlT25PayIsInJldHVyblZhbHVlT2ZPbk9rIiwiYWN0aW9uRm4iLCJlbWl0RXZlbnQiLCJxdWl0T25OdWxsaXNoUmV0dXJuVmFsdWUiLCJidXR0b25Qcm9wcyIsIm9rQnV0dG9uUHJvcHMiLCJjYW5jZWxCdXR0b25Qcm9wcyIsImNhbmNlbFRleHQiLCJva1RleHQiLCJva1R5cGUiLCJfcHJvcHMkc2hvd0NhbmNlbCIsInNob3dDYW5jZWwiLCJvbkNvbmZpcm0iLCJQb3Bjb25maXJtIiwic2V0dGluZ09wZW4iLCJfcHJvcHMkb2tUeXBlIiwicHJlZml4Q2xzQ29uZmlybSIsIm92ZXJsYXlDbGFzc05hbWVzIiwidXNlVHJhbnNpdGlvbkR1cmF0aW9uIiwic3RyaXBQZXJjZW50VG9OdW1iZXIiLCJwZXJjZW50IiwiVklFV19CT1hfU0laRSIsImdldENpcmNsZVN0eWxlIiwicGVyaW1ldGVyIiwicGVyaW1ldGVyV2l0aG91dEdhcCIsInJvdGF0ZURlZyIsImdhcERlZ3JlZSIsImdhcFBvc2l0aW9uIiwic3Ryb2tlQ29sb3IiLCJzdHJva2VMaW5lY2FwIiwic3Ryb2tlV2lkdGgiLCJzdGVwU3BhY2UiLCJvZmZzZXREZWciLCJwb3NpdGlvbkRlZyIsInN0cm9rZURhc2hvZmZzZXQiLCJzdHJva2UiLCJzdHJva2VEYXNoYXJyYXkiLCJmaWxsT3BhY2l0eSIsIkNpcmNsZSIsInN0ZXBzIiwidHJhaWxXaWR0aCIsIl9yZWYkZ2FwRGVncmVlIiwidHJhaWxDb2xvciIsImdyYWRpZW50SWQiLCJyYWRpdXMiLCJQSSIsInN0ZXBDb3VudCIsImNpcmNsZVN0eWxlIiwicGVyY2VudExpc3QiLCJzdHJva2VDb2xvckxpc3QiLCJncmFkaWVudCIsInBhdGhzIiwiZ2V0U3Rva2VMaXN0Iiwic3RhY2tQdGciLCJjaXJjbGVTdHlsZUZvclN0YWNrIiwiZWxlbSIsImdldFN0ZXBTdG9rZUxpc3QiLCJzdGVwUHRnIiwiZmlsbCIsImdldFBlcmNlbnRhZ2UiLCJzdWNjZXNzUGVyY2VudCIsInJlYWxTdWNjZXNzUGVyY2VudCIsInZhbGlkUHJvZ3Jlc3MiLCJnZXRTdWNjZXNzUGVyY2VudCIsImdldFN0cm9rZUNvbG9yIiwiX3JlZjIkc3VjY2VzcyIsInN1Y2Nlc3NDb2xvciIsInByZXNldFByaW1hcnlDb2xvcnMiLCJncmVlbiIsIl9wcm9wcyR0cmFpbENvbG9yIiwiX3Byb3BzJHN0cm9rZUxpbmVjYXAiLCJjaXJjbGVTaXplIiwiZm9udFNpemUiLCJjaXJjbGVXaWR0aCIsImdhcFBvcyIsImdldEdhcERlZ3JlZSIsImlzR3JhZGllbnQiLCJSQ0NpcmNsZSIsInNvcnRHcmFkaWVudCIsImdyYWRpZW50cyIsInRlbXBBcnIiLCJmb3JtYXR0ZWRLZXkiLCJwYXJzZUZsb2F0IiwiaGFuZGxlR3JhZGllbnQiLCJfc3Ryb2tlQ29sb3IkZnJvbSIsImJsdWUiLCJfc3Ryb2tlQ29sb3IkdG8iLCJfc3Ryb2tlQ29sb3IkZGlyZWN0aW8iLCJzb3J0ZWRHcmFkaWVudHMiLCJiYWNrZ3JvdW5kSW1hZ2UiLCJMaW5lIiwiYmFja2dyb3VuZFByb3BzIiwidHJhaWxTdHlsZSIsInBlcmNlbnRTdHlsZSIsInN1Y2Nlc3NQZXJjZW50U3R5bGUiLCJzdWNjZXNzU2VnbWVudCIsIlN0ZXBzIiwiX3Byb3BzJHBlcmNlbnQiLCJfcHJvcHMkc3Ryb2tlV2lkdGgiLCJzdGVwV2lkdGgiLCJzdHlsZWRTdGVwcyIsIlByb2dyZXNzU3RhdHVzZXMiLCJQcm9ncmVzcyIsIl9wcm9wcyRzaG93SW5mbyIsInNob3dJbmZvIiwiZ2V0UGVyY2VudE51bWJlciIsImdldFByb2dyZXNzU3RhdHVzIiwicmVuZGVyUHJvY2Vzc0luZm8iLCJwcm9ncmVzc1N0YXR1cyIsInRleHRGb3JtYXR0ZXIiLCJwZXJjZW50TnVtYmVyIiwiaXNMaW5lVHlwZSIsInByb2dyZXNzSW5mbyIsInN0cm9rZUNvbG9yTm90QXJyYXkiLCJzdHJva2VDb2xvck5vdEdyYWRpZW50IiwicHJvZ3Jlc3MiLCJTdGFyRmlsbGVkIiwiU3RhckZpbGxlZFN2ZyIsIlN0YXIiLCJvbkhvdmVyIiwiZ2V0Q2xhc3NOYW1lIiwiYWxsb3dIYWxmIiwic3RhclZhbHVlIiwiY2hhcmFjdGVyIiwiY2hhcmFjdGVyUmVuZGVyIiwiY2hhcmFjdGVyTm9kZSIsIlJhdGUiLCJzdGFycyIsInJhdGUiLCJvbkhvdmVyQ2hhbmdlIiwiZ2V0U3RhclZhbHVlIiwiY2xlYW5lZFZhbHVlIiwiaXNSZXNldCIsImNoYW5nZVZhbHVlIiwic2F2ZVJlZiIsInNhdmVSYXRlIiwiX3ZhbHVlIiwiZ2V0U3RhckRPTSIsInN0YXJFbGUiLCJsZWZ0RGlzIiwiZ2V0T2Zmc2V0TGVmdCIsImRpc2FibGVkQ2xhc3MiLCJyYXRlQ2xhc3NOYW1lIiwidG9vbHRpcHMiLCJfcHJvcHMkY2hhcmFjdGVyIiwicmF0ZVByZWZpeENscyIsIlJjUmF0ZSIsIkhhbmRsZSIsIl9nZXRJbmRleCIsIm9uT2Zmc2V0Q2hhbmdlIiwiU2xpZGVyQ29udGV4dCIsImFyaWFMYWJlbEZvckhhbmRsZSIsImFyaWFMYWJlbGxlZEJ5Rm9ySGFuZGxlIiwiYXJpYVZhbHVlVGV4dEZvcm1hdHRlckZvckhhbmRsZSIsImhhbmRsZVByZWZpeENscyIsIm9uSW50ZXJuYWxTdGFydE1vdmUiLCJIT01FIiwiRU5EIiwicG9zaXRpb25TdHlsZSIsImdldERpcmVjdGlvblN0eWxlIiwiaGFuZGxlTm9kZSIsIkhhbmRsZXMiLCJoYW5kbGVSZW5kZXIiLCJkcmFnZ2luZ0luZGV4IiwiaGFuZGxlc1JlZiIsIl9oYW5kbGVzUmVmJGN1cnJlbnQkaSIsImZsdXNoVmFsdWVzIiwidXBkYXRlQ2FjaGVWYWx1ZSIsIlRyYWNrIiwidHJhY2tQcmVmaXhDbHMiLCJvZmZzZXRTdGFydCIsIm9mZnNldEVuZCIsIlRyYWNrcyIsInN0YXJ0UG9pbnQiLCJpbmNsdWRlZCIsInRyYWNrTGlzdCIsIk1hcmsiLCJfb25DbGljayIsImluY2x1ZGVkU3RhcnQiLCJpbmNsdWRlZEVuZCIsInRleHRDbHMiLCJNYXJrcyIsIm1hcmtzIiwibWFya1ByZWZpeENscyIsIkRvdCIsImFjdGl2ZVN0eWxlIiwiZG90cyIsInN0ZXBEb3RzIiwiZG90U2V0IiwiZG90VmFsdWUiLCJnZXREZWNpbWFsIiwib2Zmc2V0VmFsdWUiLCJvZmZzZXRDaGFuZ2VkVmFsdWUiLCJuZWVkUHVzaCIsIm9mZnNldFZhbHVlcyIsIlNsaWRlciIsIl9wcm9wcyRtaW4iLCJfcHJvcHMkbWF4Iiwib25CZWZvcmVDaGFuZ2UiLCJvbkFmdGVyQ2hhbmdlIiwiX3Byb3BzJGFsbG93Q3Jvc3MiLCJhbGxvd0Nyb3NzIiwiX3Byb3BzJHB1c2hhYmxlIiwicHVzaGFibGUiLCJkcmFnZ2FibGVUcmFjayIsIl9wcm9wcyRpbmNsdWRlZCIsInRyYWNrU3R5bGUiLCJoYW5kbGVTdHlsZSIsInJhaWxTdHlsZSIsImRvdFN0eWxlIiwiYWN0aXZlRG90U3R5bGUiLCJtZXJnZWRNaW4iLCJtZXJnZWRNYXgiLCJtZXJnZWRTdGVwIiwibWVyZ2VkUHVzaCIsIm1hcmtMaXN0IiwibWFya09iaiIsIl91c2VPZmZzZXQiLCJ1c2VPZmZzZXQiLCJfdXNlT2Zmc2V0MiIsIl92YWx1ZUxpc3QiLCJfdmFsdWVMaXN0JCIsInZhbDAiLCJwb2ludENvdW50IiwiX3JldHVyblZhbHVlcyIsInJhd1ZhbHVlc1JlZiIsImdldFRyaWdnZXJWYWx1ZSIsInRyaWdnZXJWYWx1ZXMiLCJjbG9uZU5leHRWYWx1ZXMiLCJjaGFuZ2VUb0Nsb3NlVmFsdWUiLCJ2YWx1ZURpc3QiLCJkaXN0Iiwib25TbGlkZXJNb3VzZURvd24iLCJrZXlib2FyZFZhbHVlIiwic2V0S2V5Ym9hcmRWYWx1ZSIsIm9uSGFuZGxlT2Zmc2V0Q2hhbmdlIiwibWVyZ2VkRHJhZ2dhYmxlVHJhY2siLCJmaW5pc2hDaGFuZ2UiLCJfdXNlRHJhZyIsInVzZURyYWciLCJfdXNlRHJhZzIiLCJkcmFnZ2luZ1ZhbHVlIiwiY2FjaGVWYWx1ZXMiLCJvblN0YXJ0RHJhZyIsImxhc3RJbmRleE9mIiwic29ydGVkQ2FjaGVWYWx1ZXMiLCJTbGlkZXJUb29sdGlwIiwicmFmUmVmIiwiY2FuY2VsS2VlcEFsaWduIiwia2VlcEFsaWduIiwib3BlbnMiLCJzZXRPcGVucyIsInRvZ2dsZVRvb2x0aXBPcGVuIiwiZ2V0VG9vbHRpcFBsYWNlbWVudCIsInRvb2x0aXBQbGFjZW1lbnQiLCJtZXJnZWRSYW5nZSIsIl9wcm9wcyR0b29sdGlwIiwidGlwRm9ybWF0dGVyIiwidG9vbHRpcFZpc2libGUiLCJnZXRUb29sdGlwUG9wdXBDb250YWluZXIiLCJ0b29sdGlwT3BlbiIsImN1c3RvbWl6ZVRvb2x0aXBQcmVmaXhDbHMiLCJpc1RpcEZvcm1hdHRlciIsInRvb2x0aXBQcmVmaXhDbHMiLCJSY1NsaWRlciIsIlN3aXRjaCIsImxvYWRpbmdJY29uIiwiY2hlY2tlZENoaWxkcmVuIiwidW5DaGVja2VkQ2hpbGRyZW4iLCJpbm5lckNoZWNrZWQiLCJzZXRJbm5lckNoZWNrZWQiLCJuZXdDaGVja2VkIiwibWVyZ2VkQ2hlY2tlZCIsInN3aXRjaENsYXNzTmFtZSIsImFzc2lnbiIsIl9hJGNsYXNzTmFtZSIsIlJjU3dpdGNoIiwiQ29sdW1uR3JvdXAiLCJDb2x1bW4iLCJ2YWx1ZVJlZiIsImxpc3RlbmVycyIsInVzZUNvbnRleHRTZWxlY3RvciIsInNlbGVjdG9yIiwiZXZlbnRTZWxlY3RvciIsImluSG92ZXJSYW5nZSIsImNlbGxTdGFydFJvdyIsImNlbGxSb3dTcGFuIiwic3RhcnRSb3ciLCJlbmRSb3ciLCJjZWxsRW5kUm93IiwiaXNSZW5kZXJDZWxsIiwiaXNSZWZDb21wb25lbnQiLCJnZXRUaXRsZUZyb21DZWxsUmVuZGVyQ2hpbGRyZW4iLCJyb3dUeXBlIiwiZWxsaXBzaXNDb25maWciLCJDZWxsIiwicmVjb3JkIiwicmVuZGVySW5kZXgiLCJkYXRhSW5kZXgiLCJfcmVmMiRjb21wb25lbnQiLCJjb2xTcGFuIiwicm93U3BhbiIsImZpeExlZnQiLCJmaXhSaWdodCIsImZpcnN0Rml4TGVmdCIsImxhc3RGaXhMZWZ0IiwiZmlyc3RGaXhSaWdodCIsImxhc3RGaXhSaWdodCIsImFwcGVuZE5vZGUiLCJfcmVmMiRhZGRpdGlvbmFsUHJvcHMiLCJpc1N0aWNreSIsImhvdmVyaW5nIiwicGVyZlJlY29yZCIsIlBlcmZDb250ZXh0Iiwic3VwcG9ydFN0aWNreSIsIlN0aWNreUNvbnRleHQiLCJCb2R5Q29udGV4dCIsImFsbENvbHVtbnNGaXhlZExlZnQiLCJ2YWxpZGF0ZVZhbHVlIiwiZ2V0UGF0aFZhbHVlIiwicmV0dXJuQ2VsbFByb3BzIiwicmVuZGVyRGF0YSIsInJlbmRlcldpdGhQcm9wcyIsInJhbmRvbSIsImxlZ2FjeUNlbGxQcm9wcyIsIm1lcmdlZENoaWxkTm9kZSIsImNlbGxDb2xTcGFuIiwiY2VsbFN0eWxlIiwiY2VsbENsYXNzTmFtZSIsInJlc3RDZWxsUHJvcHMiLCJtZXJnZWRDb2xTcGFuIiwibWVyZ2VkUm93U3BhbiIsImZpeGVkU3R5bGUiLCJpc0ZpeExlZnQiLCJpc0ZpeFJpZ2h0IiwiYWxpZ25TdHlsZSIsInRleHRBbGlnbiIsIl9hZGRpdGlvbmFsUHJvcHMkb25NbyIsIl9hZGRpdGlvbmFsUHJvcHMkb25NbzIiLCJjb21wb25lbnRQcm9wcyIsIlJlZkNlbGwiLCJjb21wYXJlUHJvcExpc3QiLCJNZW1vQ2VsbCIsInNob3VsZENlbGxVcGRhdGUiLCJXcmFwcGVkQ2VsbCIsIl9wcm9wcyRhZGRpdGlvbmFsUHJvcCIsIl91c2VDb250ZXh0U2VsZWN0b3IiLCJIb3ZlckNvbnRleHQiLCJjeHQiLCJpc0hvdmVyaW5nIiwiSGVhZGVyUm93IiwiY2VsbHMiLCJzdGlja3lPZmZzZXRzIiwiZmxhdHRlbkNvbHVtbnMiLCJSb3dDb21wb25lbnQiLCJyb3dDb21wb25lbnQiLCJDZWxsQ29tcG9uZW50IiwiY2VsbENvbXBvbmVudCIsIm9uSGVhZGVyUm93IiwiVGFibGVDb250ZXh0Iiwicm93UHJvcHMiLCJjZWxsIiwiY29sdW1uc0tleSIsImdldENvbHVtbnNLZXkiLCJjZWxsSW5kZXgiLCJmaXhlZEluZm8iLCJnZXRDZWxsRml4ZWRJbmZvIiwiY29sU3RhcnQiLCJjb2xFbmQiLCJvbkhlYWRlckNlbGwiLCJwYXJzZUhlYWRlclJvd3MiLCJyb290Q29sdW1ucyIsImZpbGxSb3dDZWxscyIsImNvbEluZGV4Iiwicm93SW5kZXgiLCJjdXJyZW50Q29sSW5kZXgiLCJjb2xTcGFucyIsIkJvb2xlYW4iLCJzdWJDb2x1bW5zIiwiaGFzU3ViQ29sdW1ucyIsIldyYXBwZXJDb21wb25lbnQiLCJ0ckNvbXBvbmVudCIsInRoQ29tcG9uZW50Iiwicm93Tm9kZSIsIkV4cGFuZGVkUm93IiwiZXhwYW5kZWQiLCJzY3JvbGxiYXJTaXplIiwiRXhwYW5kZWRSb3dDb250ZXh0IiwiZml4SGVhZGVyIiwiZml4Q29sdW1uIiwiY29tcG9uZW50V2lkdGgiLCJob3Jpem9uU2Nyb2xsIiwiQm9keVJvdyIsInJvd0tleSIsInJvd0V4cGFuZGFibGUiLCJleHBhbmRlZEtleXMiLCJvblJvdyIsIl9wcm9wcyRpbmRlbnQiLCJpbmRlbnQiLCJjaGlsZHJlbkNvbHVtbk5hbWUiLCJmaXhlZEluZm9MaXN0IiwiZXhwYW5kYWJsZVR5cGUiLCJleHBhbmRSb3dCeUNsaWNrIiwib25UcmlnZ2VyRXhwYW5kIiwiZXhwYW5kZWRSb3dDbGFzc05hbWUiLCJpbmRlbnRTaXplIiwiZXhwYW5kZWRSb3dSZW5kZXIiLCJleHBhbmRJY29uQ29sdW1uSW5kZXgiLCJleHBhbmRSZW5kZWQiLCJzZXRFeHBhbmRSZW5kZWQiLCJyZWNvcmRLZXkiLCJyb3dTdXBwb3J0RXhwYW5kIiwibmVzdEV4cGFuZGFibGUiLCJoYXNOZXN0Q2hpbGRyZW4iLCJtZXJnZWRFeHBhbmRhYmxlIiwib25FeHBhbmRSZWYiLCJvbkludGVybmFsVHJpZ2dlckV4cGFuZCIsIl9hZGRpdGlvbmFsUHJvcHMkb25DbCIsImNvbXB1dGVSb3dDbGFzc05hbWUiLCJiYXNlUm93Tm9kZSIsImNvbHVtbkNsYXNzTmFtZSIsImFwcGVuZENlbGxOb2RlIiwiZXhwYW5kYWJsZSIsIm9uRXhwYW5kIiwiYWRkaXRpb25hbENlbGxQcm9wcyIsIm9uQ2VsbCIsImV4cGFuZFJvd05vZGUiLCJleHBhbmRDb250ZW50IiwiY29tcHV0ZWRFeHBhbmRlZFJvd0NsYXNzTmFtZSIsIk1lYXN1cmVDZWxsIiwiY29sdW1uS2V5Iiwib25Db2x1bW5SZXNpemUiLCJjZWxsUmVmIiwicGFkZGluZyIsImJvcmRlciIsIk1lYXN1cmVSb3ciLCJpbmZvTGlzdCIsIkJvZHkiLCJnZXRSb3dLZXkiLCJtZWFzdXJlQ29sdW1uV2lkdGgiLCJlbXB0eU5vZGUiLCJSZXNpemVDb250ZXh0IiwiZmxhdHRlbkRhdGEiLCJ1c2VGbGF0dGVuUmVjb3JkcyIsInBlcmZSZWYiLCJzZXRTdGFydFJvdyIsInNldEVuZFJvdyIsImJvZHlOb2RlIiwidGRDb21wb25lbnQiLCJpZHgiLCJNZW1vQm9keSIsImNvbnZlcnRDaGlsZHJlblRvQ29sdW1ucyIsIm5vZGVDaGlsZHJlbiIsImZsYXRDb2x1bW5zIiwiZml4ZWQiLCJwYXJzZWRGaXhlZCIsInN1YkNvbHVtIiwicmV2ZXJ0Rm9yUnRsIiwidXNlQ29sdW1ucyIsInRyYW5zZm9ybUNvbHVtbnMiLCJjb2x1bW5UaXRsZSIsImNvbHVtbldpZHRoIiwiYmFzZUNvbHVtbnMiLCJ3aXRoRXhwYW5kQ29sdW1ucyIsIl9leHBhbmRDb2x1bW4iLCJjbG9uZUNvbHVtbnMiLCJFWFBBTkRfQ09MVU1OIiwiZXhwYW5kQ29sSW5kZXgiLCJleHBhbmRDb2x1bW5JbmRleCIsInByZXZDb2x1bW4iLCJmaXhlZENvbHVtbiIsImV4cGFuZENvbHVtbiIsIklOVEVSTkFMX0NPTF9ERUZJTkUiLCJjb2x1bW5UeXBlIiwicmVjb3JkRXhwYW5kYWJsZSIsImNvbCIsIm1lcmdlZENvbHVtbnMiLCJmaW5hbENvbHVtbnMiLCJDb2xHcm91cCIsImNvbFdpZHRocyIsImNvbHVtQ291bnQiLCJjb2xzIiwibXVzdEluc2VydCIsInJlc3RBZGRpdGlvbmFsUHJvcHMiLCJTdW1tYXJ5Q2VsbCIsIl9yZWYkY29sU3BhbiIsIlN1bW1hcnlDb250ZXh0Iiwic2Nyb2xsQ29sdW1uSW5kZXgiLCJGb290ZXJSb3ciLCJGb290ZXIiLCJ0YWJsZUNvbnRleHQiLCJsYXN0Q29sdW1uSW5kZXgiLCJzY3JvbGxDb2x1bW4iLCJzdW1tYXJ5Q29udGV4dCIsInNjcm9sbGJhciIsIkZvb3RlckNvbXBvbmVudHMiLCJTdW1tYXJ5IiwiZXhwYW5kQ2xhc3NOYW1lIiwiZmluZEFsbENoaWxkcmVuS2V5cyIsImRpZyIsIlN0aWNreVNjcm9sbEJhciIsIl9zY3JvbGxCb2R5UmVmJGN1cnJlbiIsIl9zY3JvbGxCb2R5UmVmJGN1cnJlbjIiLCJzY3JvbGxCb2R5UmVmIiwib2Zmc2V0U2Nyb2xsIiwiYm9keVNjcm9sbFdpZHRoIiwiYm9keVdpZHRoIiwic2Nyb2xsQmFyV2lkdGgiLCJfdXNlTGF5b3V0U3RhdGUiLCJ1c2VMYXlvdXRTdGF0ZSIsImlzSGlkZGVuU2Nyb2xsQmFyIiwiX3VzZUxheW91dFN0YXRlMiIsInNjcm9sbFN0YXRlIiwic2V0U2Nyb2xsU3RhdGUiLCJyZWZTdGF0ZSIsImRlbHRhIiwicGVyc2lzdCIsIl93aW5kb3ciLCJvbkNvbnRhaW5lclNjcm9sbCIsInRhYmxlT2Zmc2V0VG9wIiwidGFibGVCb3R0b21PZmZzZXQiLCJjdXJyZW50Q2xpZW50T2Zmc2V0IiwiZG9jdW1lbnRFbGVtZW50IiwiaW5uZXJIZWlnaHQiLCJjbGllbnRIZWlnaHQiLCJnZXRTY3JvbGxCYXJTaXplIiwic2V0U2Nyb2xsTGVmdCIsIm9uU2Nyb2xsTGlzdGVuZXIiLCJvblJlc2l6ZUxpc3RlbmVyIiwidXNlQ29sdW1uV2lkdGgiLCJGaXhlZEhvbGRlciIsIm5vRGF0YSIsInN0aWNreVRvcE9mZnNldCIsInN0aWNreUJvdHRvbU9mZnNldCIsInN0aWNreUNsYXNzTmFtZSIsIm1heENvbnRlbnRTY3JvbGwiLCJjb21iaW5hdGlvblNjcm9sbEJhclNpemUiLCJzZXRTY3JvbGxSZWYiLCJfc2Nyb2xsUmVmJGN1cnJlbnQyIiwiYWxsRmxhdHRlbkNvbHVtbnNXaXRoV2lkdGgiLCJsYXN0Q29sdW1uIiwiU2Nyb2xsQmFyQ29sdW1uIiwiY29sdW1uc1dpdGhTY3JvbGxiYXIiLCJmbGF0dGVuQ29sdW1uc1dpdGhTY3JvbGxiYXIiLCJoZWFkZXJTdGlja3lPZmZzZXRzIiwibWVyZ2VkQ29sdW1uV2lkdGgiLCJ0YWJsZUxheW91dCIsIkVNUFRZX1NDUk9MTF9UQVJHRVQiLCJJTlRFUk5BTF9IT09LUyIsIk1lbW9UYWJsZUNvbnRlbnQiLCJUYWJsZSIsInNjcm9sbCIsInN1bW1hcnkiLCJzaG93SGVhZGVyIiwiZW1wdHlUZXh0IiwiaW50ZXJuYWxIb29rcyIsImludGVybmFsUmVmcyIsInN0aWNreSIsImhhc0RhdGEiLCJkZWZhdWx0Q29tcG9uZW50IiwiZXhwYW5kYWJsZUNvbmZpZyIsImdldEV4cGFuZGFibGVQcm9wcyIsImV4cGFuZGVkUm93S2V5cyIsImRlZmF1bHRFeHBhbmRlZFJvd0tleXMiLCJkZWZhdWx0RXhwYW5kQWxsUm93cyIsIm9uRXhwYW5kZWRSb3dzQ2hhbmdlIiwibWVyZ2VkQ2hpbGRyZW5Db2x1bW5OYW1lIiwiX19QQVJFTlRfUkVOREVSX0lDT05fXyIsImlubmVyRXhwYW5kZWRLZXlzIiwic2V0SW5uZXJFeHBhbmRlZEtleXMiLCJtZXJnZWRFeHBhbmRlZEtleXMiLCJuZXdFeHBhbmRlZEtleXMiLCJoYXNLZXkiLCJzZXRDb21wb25lbnRXaWR0aCIsIl91c2VDb2x1bW5zIiwiX3VzZUNvbHVtbnMyIiwiY29sdW1uQ29udGV4dCIsImZ1bGxUYWJsZVJlZiIsInNjcm9sbEhlYWRlclJlZiIsInNjcm9sbEJvZHlDb250YWluZXJSZWYiLCJzY3JvbGxTdW1tYXJ5UmVmIiwicGluZ2VkTGVmdCIsInNldFBpbmdlZExlZnQiLCJwaW5nZWRSaWdodCIsInNldFBpbmdlZFJpZ2h0IiwiY29sc1dpZHRocyIsInVwZGF0ZUNvbHNXaWR0aHMiLCJjb2xzS2V5cyIsInB1cmVDb2xXaWR0aHMiLCJ1c2VTdGlja3lPZmZzZXRzIiwic3RpY2t5UmVmIiwiX3VzZVN0aWNreSIsInVzZVN0aWNreSIsIm9mZnNldEhlYWRlciIsIm9mZnNldFN1bW1hcnkiLCJzdW1tYXJ5Tm9kZSIsImZpeEZvb3RlciIsInNjcm9sbFhTdHlsZSIsInNjcm9sbFlTdHlsZSIsInNjcm9sbFRhYmxlU3R5bGUiLCJtYXhIZWlnaHQiLCJpc1Zpc2libGUiLCJ3aWR0aHMiLCJuZXdXaWR0aHMiLCJfdXNlVGltZW91dExvY2siLCJ1c2VUaW1lb3V0TG9jayIsIl91c2VUaW1lb3V0TG9jazIiLCJzZXRTY3JvbGxUYXJnZXQiLCJnZXRTY3JvbGxUYXJnZXQiLCJmb3JjZVNjcm9sbCIsImlzUlRMIiwibWVyZ2VkU2Nyb2xsTGVmdCIsImNvbXBhcmVUYXJnZXQiLCJfc3RpY2t5UmVmJGN1cnJlbnQiLCJ0cmlnZ2VyT25TY3JvbGwiLCJvbkZ1bGxUYWJsZVJlc2l6ZSIsInNldFNjcm9sbGJhclNpemUiLCJfUmVhY3QkdXNlU3RhdGUxMSIsIl9SZWFjdCR1c2VTdGF0ZTEyIiwic2V0U3VwcG9ydFN0aWNreSIsImdldFRhcmdldFNjcm9sbEJhclNpemUiLCJpc1N0eWxlU3VwcG9ydCIsIlRhYmxlQ29tcG9uZW50IiwibWVyZ2VkVGFibGVMYXlvdXQiLCJncm91cFRhYmxlTm9kZSIsImJvZHlUYWJsZSIsImJvZHlDb2xHcm91cCIsImN1c3RvbWl6ZVNjcm9sbEJvZHkiLCJib2R5Q29udGVudCIsIl9yZWY3IiwiY29sV2lkdGgiLCJmaXhlZEhvbGRlclByb3BzIiwiZml4ZWRIb2xkZXJQYXNzUHJvcHMiLCJhcmlhUHJvcHMiLCJhcmlhIiwiZnVsbFRhYmxlIiwiVGFibGVDb250ZXh0VmFsdWUiLCJCb2R5Q29udGV4dFZhbHVlIiwiRXhwYW5kZWRSb3dDb250ZXh0VmFsdWUiLCJSZXNpemVDb250ZXh0VmFsdWUiLCJpY29uUHJlZml4IiwiY29sbGFwc2UiLCJleHBhbmQiLCJkZWZhdWx0S2V5IiwiRmlsdGVyRmlsbGVkIiwiRmlsdGVyRmlsbGVkU3ZnIiwibGlzdENhY2hlQ2xlYXIiLCJlcSIsImFzc29jSW5kZXhPZiIsImFycmF5UHJvdG8iLCJsaXN0Q2FjaGVEZWxldGUiLCJsaXN0Q2FjaGVHZXQiLCJsaXN0Q2FjaGVIYXMiLCJsaXN0Q2FjaGVTZXQiLCJyZXF1aXJlJCQzIiwicmVxdWlyZSQkNCIsIkxpc3RDYWNoZSIsInN0YWNrQ2xlYXIiLCJzdGFja0RlbGV0ZSIsInN0YWNrR2V0Iiwic3RhY2tIYXMiLCJhc3luY1RhZyIsImZ1bmNUYWciLCJnZW5UYWciLCJwcm94eVRhZyIsImNvcmVKc0RhdGEiLCJtYXNrU3JjS2V5IiwidWlkIiwiaXNNYXNrZWQiLCJmdW5jUHJvdG8iLCJmdW5jVG9TdHJpbmciLCJ0b1NvdXJjZSIsInJlUmVnRXhwQ2hhciIsInJlSXNIb3N0Q3RvciIsInJlSXNOYXRpdmUiLCJiYXNlSXNOYXRpdmUiLCJnZXROYXRpdmUiLCJuYXRpdmVDcmVhdGUiLCJoYXNoQ2xlYXIiLCJoYXNoRGVsZXRlIiwiSEFTSF9VTkRFRklORUQiLCJoYXNoR2V0IiwiaGFzaEhhcyIsImhhc2hTZXQiLCJIYXNoIiwibWFwQ2FjaGVDbGVhciIsImlzS2V5YWJsZSIsImdldE1hcERhdGEiLCJtYXBDYWNoZURlbGV0ZSIsIm1hcENhY2hlR2V0IiwibWFwQ2FjaGVIYXMiLCJtYXBDYWNoZVNldCIsIk1hcENhY2hlIiwiTEFSR0VfQVJSQVlfU0laRSIsInN0YWNrU2V0IiwicmVxdWlyZSQkNSIsIlN0YWNrIiwic2V0Q2FjaGVBZGQiLCJzZXRDYWNoZUhhcyIsIlNldENhY2hlIiwiYXJyYXlTb21lIiwiY2FjaGVIYXMiLCJDT01QQVJFX1BBUlRJQUxfRkxBRyIsIkNPTVBBUkVfVU5PUkRFUkVEX0ZMQUciLCJlcXVhbEFycmF5cyIsIm90aFZhbHVlIiwiVWludDhBcnJheSIsIm1hcFRvQXJyYXkiLCJzZXRUb0FycmF5IiwiYm9vbFRhZyIsImRhdGVUYWciLCJlcnJvclRhZyIsIm1hcFRhZyIsIm51bWJlclRhZyIsInJlZ2V4cFRhZyIsInNldFRhZyIsInN0cmluZ1RhZyIsImFycmF5QnVmZmVyVGFnIiwiZGF0YVZpZXdUYWciLCJzeW1ib2xQcm90byIsInN5bWJvbFZhbHVlT2YiLCJlcXVhbEJ5VGFnIiwiY29udmVydCIsImFycmF5UHVzaCIsImJhc2VHZXRBbGxLZXlzIiwiYXJyYXlGaWx0ZXIiLCJzdHViQXJyYXkiLCJuYXRpdmVHZXRTeW1ib2xzIiwiZ2V0U3ltYm9scyIsInN5bWJvbCIsImJhc2VUaW1lcyIsImFyZ3NUYWciLCJiYXNlSXNBcmd1bWVudHMiLCJpc0FyZ3VtZW50cyIsInN0dWJGYWxzZSIsImZyZWVFeHBvcnRzIiwiZnJlZU1vZHVsZSIsIm1vZHVsZUV4cG9ydHMiLCJCdWZmZXIiLCJuYXRpdmVJc0J1ZmZlciIsImlzQnVmZmVyIiwicmVJc1VpbnQiLCJpc0luZGV4IiwiaXNMZW5ndGgiLCJhcnJheVRhZyIsIm9iamVjdFRhZyIsIndlYWtNYXBUYWciLCJmbG9hdDMyVGFnIiwiZmxvYXQ2NFRhZyIsImludDhUYWciLCJpbnQxNlRhZyIsImludDMyVGFnIiwidWludDhUYWciLCJ1aW50OENsYW1wZWRUYWciLCJ1aW50MTZUYWciLCJ1aW50MzJUYWciLCJ0eXBlZEFycmF5VGFncyIsImJhc2VJc1R5cGVkQXJyYXkiLCJiYXNlVW5hcnkiLCJmcmVlUHJvY2VzcyIsIm5vZGVVdGlsIiwidHlwZXMiLCJub2RlSXNUeXBlZEFycmF5IiwiaXNUeXBlZEFycmF5IiwiYXJyYXlMaWtlS2V5cyIsImlzUHJvdG90eXBlIiwicHJvdG8iLCJvdmVyQXJnIiwibmF0aXZlS2V5cyIsImJhc2VLZXlzIiwiaXNBcnJheUxpa2UiLCJnZXRBbGxLZXlzIiwiZXF1YWxPYmplY3RzIiwiRGF0YVZpZXciLCJXZWFrTWFwIiwicmVxdWlyZSQkNiIsInByb21pc2VUYWciLCJkYXRhVmlld0N0b3JTdHJpbmciLCJtYXBDdG9yU3RyaW5nIiwicHJvbWlzZUN0b3JTdHJpbmciLCJzZXRDdG9yU3RyaW5nIiwid2Vha01hcEN0b3JTdHJpbmciLCJnZXRUYWciLCJyZXF1aXJlJCQ3IiwiYmFzZUlzRXF1YWxEZWVwIiwiYmFzZUlzRXF1YWwiLCJJbmRlbnQiLCJsZXZlbCIsImlzU3RhcnQiLCJpc0VuZCIsIklDT05fT1BFTiIsIklDT05fQ0xPU0UiLCJkZWZhdWx0VGl0bGUiLCJJbnRlcm5hbFRyZWVOb2RlIiwiZHJhZ05vZGVIaWdobGlnaHQiLCJzZWxlY3RIYW5kbGUiLCJvblNlbGVjdG9yQ2xpY2siLCJvbk5vZGVDbGljayIsImNvbnZlcnROb2RlUHJvcHNUb0V2ZW50RGF0YSIsIm9uQ2hlY2siLCJvblNlbGVjdG9yRG91YmxlQ2xpY2siLCJvbk5vZGVEb3VibGVDbGljayIsImlzRGlzYWJsZWQiLCJvbk5vZGVTZWxlY3QiLCJkaXNhYmxlQ2hlY2tib3giLCJvbk5vZGVDaGVjayIsImlzQ2hlY2thYmxlIiwidGFyZ2V0Q2hlY2tlZCIsIm9uTm9kZU1vdXNlRW50ZXIiLCJvbk5vZGVNb3VzZUxlYXZlIiwib25Ob2RlQ29udGV4dE1lbnUiLCJvbkRyYWdTdGFydCIsIm9uTm9kZURyYWdTdGFydCIsImRhdGFUcmFuc2ZlciIsInNldERhdGEiLCJvbkRyYWdFbnRlciIsIm9uTm9kZURyYWdFbnRlciIsIm9uRHJhZ092ZXIiLCJvbk5vZGVEcmFnT3ZlciIsIm9uRHJhZ0xlYXZlIiwib25Ob2RlRHJhZ0xlYXZlIiwib25EcmFnRW5kIiwib25Ob2RlRHJhZ0VuZCIsIm9uRHJvcCIsIm9uTm9kZURyb3AiLCJvbk5vZGVFeHBhbmQiLCJzZXRTZWxlY3RIYW5kbGUiLCJnZXROb2RlU3RhdGUiLCJpc0xlYWYiLCJsb2FkZWQiLCJsb2FkRGF0YSIsInRyZWVEaXNhYmxlZCIsImNoZWNrYWJsZSIsInRyZWVDaGVja2FibGUiLCJzeW5jTG9hZERhdGEiLCJfdGhpcyRwcm9wcyRjb250ZXh0Iiwib25Ob2RlTG9hZCIsImlzRHJhZ2dhYmxlIiwibm9kZURyYWdnYWJsZSIsInJlbmRlckRyYWdIYW5kbGVyIiwiX3RoaXMkcHJvcHMkY29udGV4dDIiLCJyZW5kZXJTd2l0Y2hlckljb25Eb20iLCJzd2l0Y2hlckljb25Gcm9tUHJvcHMiLCJzd2l0Y2hlckljb24iLCJzd2l0Y2hlckljb25Gcm9tQ3R4IiwicmVuZGVyU3dpdGNoZXIiLCJfc3dpdGNoZXJJY29uRG9tIiwic3dpdGNoZXJDbHMiLCJzd2l0Y2hlckljb25Eb20iLCJyZW5kZXJDaGVja2JveCIsImhhbGZDaGVja2VkIiwiJGN1c3RvbSIsInJlbmRlclNlbGVjdG9yIiwiX3RoaXMkcHJvcHM2JHRpdGxlIiwiX3RoaXMkcHJvcHMkY29udGV4dDMiLCJzaG93SWNvbiIsInRyZWVJY29uIiwidGl0bGVSZW5kZXIiLCJ3cmFwQ2xhc3MiLCIkaWNvbiIsImN1cnJlbnRJY29uIiwicmVuZGVyRHJvcEluZGljYXRvciIsIl90aGlzJHByb3BzJGNvbnRleHQ0IiwiZHJvcExldmVsT2Zmc2V0IiwiZHJvcFBvc2l0aW9uIiwiZHJvcEluZGljYXRvclJlbmRlciIsImRyYWdPdmVyTm9kZUtleSIsInJvb3REcmFnZ2FibGUiLCJzaG93SW5kaWNhdG9yIiwidHJlZVNlbGVjdGFibGUiLCJkcmFnT3ZlciIsImRyYWdPdmVyR2FwVG9wIiwiZHJhZ092ZXJHYXBCb3R0b20iLCJfdGhpcyRwcm9wcyRjb250ZXh0NSIsImZpbHRlclRyZWVOb2RlIiwiZHJvcENvbnRhaW5lcktleSIsImRyb3BUYXJnZXRLZXkiLCJkcmFnZ2luZ05vZGVLZXkiLCJpc0VuZE5vZGUiLCJtZXJnZWREcmFnZ2FibGUiLCJkcmFnZ2FibGVXaXRob3V0RGlzYWJsZWQiLCJhcmlhU2VsZWN0ZWQiLCJDb250ZXh0VHJlZU5vZGUiLCJpc1RyZWVOb2RlIiwiYXJyRGVsIiwiYXJyQWRkIiwicG9zVG9BcnIiLCJwb3MiLCJnZXREcmFnQ2hpbGRyZW5LZXlzIiwiZHJhZ05vZGVLZXkiLCJkcmFnQ2hpbGRyZW5LZXlzIiwiaXNMYXN0Q2hpbGQiLCJ0cmVlTm9kZUVudGl0eSIsInBvc0FyciIsImlzRmlyc3RDaGlsZCIsImNhbGNEcm9wUG9zaXRpb24iLCJkcmFnTm9kZSIsInRhcmdldE5vZGUiLCJzdGFydE1vdXNlUG9zaXRpb24iLCJhbGxvd0Ryb3AiLCJmbGF0dGVuZWROb2RlcyIsImV4cGFuZEtleXMiLCJfYWJzdHJhY3REcm9wTm9kZUVudGkiLCJfZXZlbnQkdGFyZ2V0JGdldEJvdW4iLCJob3Jpem9udGFsTW91c2VPZmZzZXQiLCJyYXdEcm9wTGV2ZWxPZmZzZXQiLCJhYnN0cmFjdERyb3BOb2RlRW50aXR5Iiwibm9kZUluZGV4IiwiZmxhdHRlbmVkTm9kZSIsInByZXZOb2RlSW5kZXgiLCJwcmV2Tm9kZUtleSIsImluaXRpYWxBYnN0cmFjdERyb3BOb2RlS2V5IiwiYWJzdHJhY3REcmFnT3ZlckVudGl0eSIsImFic3RyYWN0RHJhZ0RhdGFOb2RlIiwiYWJzdHJhY3REcm9wRGF0YU5vZGUiLCJkcm9wQWxsb3dlZCIsImRyb3BOb2RlIiwiZHJvcFRhcmdldFBvcyIsImNhbGNTZWxlY3RlZEtleXMiLCJwYXJzZUNoZWNrZWRLZXlzIiwia2V5UHJvcHMiLCJjaGVja2VkS2V5cyIsImhhbGZDaGVja2VkS2V5cyIsImNvbmR1Y3RFeHBhbmRQYXJlbnQiLCJrZXlMaXN0IiwiY29uZHVjdFVwIiwidXNlVW5tb3VudCIsIk1vdGlvblRyZWVOb2RlIiwibW90aW9uTm9kZXMiLCJtb3Rpb25UeXBlIiwib25PcmlnaW5Nb3Rpb25TdGFydCIsIm9uTW90aW9uU3RhcnQiLCJvbk9yaWdpbk1vdGlvbkVuZCIsIm9uTW90aW9uRW5kIiwidHJlZU5vZGVSZXF1aXJlZFByb3BzIiwiVHJlZUNvbnRleHQiLCJ0YXJnZXRWaXNpYmxlIiwidHJpZ2dlck1vdGlvblN0YXJ0IiwidHJpZ2dlck1vdGlvbkVuZFJlZiIsInRyaWdnZXJNb3Rpb25FbmQiLCJ0cmVlTm9kZSIsIl9vYmplY3REZXN0cnVjdHVyaW5nRW1wdHkiLCJ0cmVlTm9kZVByb3BzIiwiZ2V0VHJlZU5vZGVQcm9wcyIsIlRyZWVOb2RlIiwiUmVmTW90aW9uVHJlZU5vZGUiLCJtYXJnaW4iLCJNT1RJT05fS0VZIiwiTW90aW9uTm9kZSIsIk1vdGlvbkVudGl0eSIsIk1vdGlvbkZsYXR0ZW5EYXRhIiwiZ2V0TWluaW11bVJhbmdlVHJhbnNpdGlvblJhbmdlIiwiZ2V0QWNjZXNzaWJpbGl0eVBhdGgiLCJOb2RlTGlzdCIsImxvYWRlZEtleXMiLCJsb2FkaW5nS2V5cyIsImZvY3VzYWJsZSIsImFjdGl2ZUl0ZW0iLCJvbkFjdGl2ZUNoYW5nZSIsIm9uTGlzdENoYW5nZVN0YXJ0Iiwib25MaXN0Q2hhbmdlRW5kIiwiaW5kZW50TWVhc3VyZXJSZWYiLCJnZXRJbmRlbnRXaWR0aCIsInByZXZFeHBhbmRlZEtleXMiLCJzZXRQcmV2RXhwYW5kZWRLZXlzIiwicHJldkRhdGEiLCJzZXRQcmV2RGF0YSIsInRyYW5zaXRpb25EYXRhIiwic2V0VHJhbnNpdGlvbkRhdGEiLCJ0cmFuc2l0aW9uUmFuZ2UiLCJzZXRUcmFuc2l0aW9uUmFuZ2UiLCJzZXRNb3Rpb25UeXBlIiwiZGF0YVJlZiIsImxhdGVzdERhdGEiLCJkaWZmRXhwYW5kZWQiLCJmaW5kRXhwYW5kZWRLZXlzIiwia2V5SW5kZXgiLCJyYW5nZU5vZGVzIiwiZ2V0RXhwYW5kUmFuZ2UiLCJuZXdUcmFuc2l0aW9uRGF0YSIsIl9rZXlJbmRleCIsIl9yYW5nZU5vZGVzIiwiX25ld1RyYW5zaXRpb25EYXRhIiwiVmlydHVhbExpc3QiLCJvcmlnaW5MaXN0IiwiZnVsbExpc3QiLCJvcmlnaW5TZXQiLCJyZXN0TGlzdCIsIkRyb3BJbmRpY2F0b3IiLCJNQVhfUkVUUllfVElNRVMiLCJUcmVlIiwiX2FyZ3MiLCJkZWxheWVkRHJhZ0VudGVyTG9naWMiLCJsb2FkaW5nUmV0cnlUaW1lcyIsInRyZWVEYXRhIiwiZmxhdHRlbk5vZGVzIiwibGlzdENoYW5naW5nIiwiZHJhZ1N0YXJ0TW91c2VQb3NpdGlvbiIsImN1cnJlbnRNb3VzZU92ZXJEcm9wcGFibGVOb2RlS2V5Iiwic2V0RXhwYW5kZWRLZXlzIiwib25XaW5kb3dEcmFnRW5kIiwiX25vZGUkcHJvcHMiLCJyZXNldERyYWdTdGF0ZSIsIl9jYWxjRHJvcFBvc2l0aW9uIiwiX3RoaXMkc3RhdGUzIiwiX2Fzc2VydFRoaXNJbml0aWFsaXplMiIsIl9jYWxjRHJvcFBvc2l0aW9uMiIsImNsZWFuRHJhZ1N0YXRlIiwiX3RoaXMkZ2V0QWN0aXZlSXRlbSIsIm91dHNpZGVUcmVlIiwiX3RoaXMkc3RhdGU0IiwiYWJzdHJhY3REcm9wTm9kZVByb3BzIiwiZ2V0VHJlZU5vZGVSZXF1aXJlZFByb3BzIiwiZ2V0QWN0aXZlSXRlbSIsImRyb3BUb0NoaWxkIiwiZHJvcFJlc3VsdCIsImRyYWdOb2Rlc0tleXMiLCJkcm9wVG9HYXAiLCJ0cmlnZ2VyRXhwYW5kQWN0aW9uRXhwYW5kIiwiX3RoaXMkc3RhdGU1IiwibWV0YUtleSIsIm5vZGVJdGVtIiwiZXZlbnROb2RlIiwiZXhwYW5kQWN0aW9uIiwiX3RoaXMkc3RhdGU2IiwidGFyZ2V0U2VsZWN0ZWQiLCJzZWxlY3RlZE5vZGVzIiwic2V0VW5jb250cm9sbGVkU3RhdGUiLCJfdGhpcyRzdGF0ZTciLCJvcmlDaGVja2VkS2V5cyIsIm9yaUhhbGZDaGVja2VkS2V5cyIsImNoZWNrU3RyaWN0bHkiLCJjaGVja2VkT2JqIiwiZXZlbnRPYmoiLCJjaGVja2VkTm9kZXMiLCJjaGVja2VkS2V5IiwiX2NvbmR1Y3RDaGVjayIsImNvbmR1Y3RDaGVjayIsIl9jaGVja2VkS2V5cyIsIl9oYWxmQ2hlY2tlZEtleXMiLCJrZXlTZXQiLCJfY29uZHVjdENoZWNrMiIsImNoZWNrZWROb2Rlc1Bvc2l0aW9ucyIsImxvYWRQcm9taXNlIiwiX3JlZiRsb2FkZWRLZXlzIiwiX3JlZiRsb2FkaW5nS2V5cyIsImN1cnJlbnRMb2FkZWRLZXlzIiwibmV3TG9hZGVkS2V5cyIsIm9uUmlnaHRDbGljayIsIl90aGlzJHN0YXRlOCIsIl90aGlzJHN0YXRlOSIsImZsYXR0ZW5UcmVlRGF0YSIsIl90aGlzJHN0YXRlMTAiLCJ0YXJnZXRFeHBhbmRlZCIsIm5ld0ZsYXR0ZW5UcmVlRGF0YSIsImN1cnJlbnRFeHBhbmRlZEtleXMiLCJleHBhbmRlZEtleXNUb1Jlc3RvcmUiLCJuZXdBY3RpdmVLZXkiLCJfdGhpcyRzdGF0ZTExIiwib2Zmc2V0QWN0aXZlS2V5IiwiX3RoaXMkc3RhdGUxMiIsIl90aGlzJHN0YXRlMTMiLCJhdG9taWMiLCJmb3JjZVN0YXRlIiwibmVlZFN5bmMiLCJhbGxQYXNzZWQiLCJvblVwZGF0ZWQiLCJfdGhpcyRzdGF0ZTE0Iiwic2hvd0xpbmUiLCJfdGhpcyRwcm9wczEwJHRhYkluZGUiLCJkcmFnZ2FibGVDb25maWciLCJjb252ZXJ0VHJlZVRvRGF0YSIsImVudGl0aWVzTWFwIiwiY29udmVydERhdGFUb0VudGl0aWVzIiwiYXV0b0V4cGFuZFBhcmVudCIsImRlZmF1bHRFeHBhbmRQYXJlbnQiLCJkZWZhdWx0RXhwYW5kQWxsIiwiY2xvbmVLZXlFbnRpdGllcyIsImRlZmF1bHRFeHBhbmRlZEtleXMiLCJjaGVja2VkS2V5RW50aXR5IiwiZGVmYXVsdENoZWNrZWRLZXlzIiwiX2NoZWNrZWRLZXlFbnRpdHkiLCJfY2hlY2tlZEtleUVudGl0eSRjaGUiLCJfY2hlY2tlZEtleUVudGl0eSRoYWwiLCJjb25kdWN0S2V5cyIsIkhvbGRlck91dGxpbmVkIiwiSG9sZGVyT3V0bGluZWRTdmciLCJfc3R5bGUiLCJzdGFydFBvc2l0aW9uIiwiZW5kUG9zaXRpb24iLCJDYXJldERvd25GaWxsZWQiLCJDYXJldERvd25GaWxsZWRTdmciLCJGaWxlT3V0bGluZWQiLCJGaWxlT3V0bGluZWRTdmciLCJNaW51c1NxdWFyZU91dGxpbmVkIiwiTWludXNTcXVhcmVPdXRsaW5lZFN2ZyIsIlBsdXNTcXVhcmVPdXRsaW5lZCIsIlBsdXNTcXVhcmVPdXRsaW5lZFN2ZyIsInJlbmRlclN3aXRjaGVySWNvbiIsInNob3dMZWFmSWNvbiIsImxlYWZJY29uIiwibGVhZkNscyIsInN3aXRjaGVyIiwiX3Byb3BzJHNob3dJY29uIiwiX3N3aXRjaGVySWNvbiIsIl9wcm9wcyRibG9ja05vZGUiLCJibG9ja05vZGUiLCJfcHJvcHMkY2hlY2thYmxlIiwiX3Byb3BzJHNlbGVjdGFibGUiLCJfcHJvcHMkbW90aW9uIiwibmV3UHJvcHMiLCJSY1RyZWUiLCJub2RlUHJvcHMiLCJGb2xkZXJPcGVuT3V0bGluZWQiLCJGb2xkZXJPcGVuT3V0bGluZWRTdmciLCJGb2xkZXJPdXRsaW5lZCIsIkZvbGRlck91dGxpbmVkU3ZnIiwiUmVjb3JkIiwiZ2V0VHJlZURhdGEiLCJEaXJlY3RvcnlUcmVlIiwibGFzdFNlbGVjdGVkS2V5IiwiY2FjaGVkU2VsZWN0ZWRLZXlzIiwiZ2V0SW5pdEV4cGFuZGVkS2V5cyIsIl9jb252ZXJ0RGF0YVRvRW50aXRpZSIsImluaXRFeHBhbmRlZEtleXMiLCJzZXRTZWxlY3RlZEtleXMiLCJfbm9kZSRrZXkiLCJuZXdFdmVudCIsImN0cmxQaWNrIiwic2hpZnRQaWNrIiwibmV3U2VsZWN0ZWRLZXlzIiwiY29udmVydERpcmVjdG9yeUtleXNUb05vZGVzIiwiY2FsY1JhbmdlS2V5cyIsInN0YXJ0S2V5IiwiZW5kS2V5IiwiX3Byb3BzJGV4cGFuZEFjdGlvbiIsImNvbm5lY3RDbGFzc05hbWUiLCJGb3J3YXJkRGlyZWN0b3J5VHJlZSIsIkZpbHRlclNlYXJjaCIsImZpbHRlclNlYXJjaCIsInRhYmxlUHJlZml4Q2xzIiwiZmlsdGVyU2VhcmNoUGxhY2Vob2xkZXIiLCJGaWx0ZXJEcm9wZG93bk1lbnVXcmFwcGVyIiwiaGFzU3ViTWVudSIsImZpbHRlcnMiLCJzZWFyY2hWYWx1ZU1hdGNoZWQiLCJ0b0xvd2VyQ2FzZSIsInJlbmRlckZpbHRlckl0ZW1zIiwiZmlsdGVyZWRLZXlzIiwiZmlsdGVyTXVsdGlwbGUiLCJGaWx0ZXJEcm9wZG93biIsIl9wcm9wcyRmaWx0ZXJNb2RlIiwiZmlsdGVyTW9kZSIsIl9wcm9wcyRmaWx0ZXJTZWFyY2giLCJmaWx0ZXJTdGF0ZSIsInRyaWdnZXJGaWx0ZXIiLCJmaWx0ZXJEcm9wZG93bk9wZW4iLCJvbkZpbHRlckRyb3Bkb3duT3BlbkNoYW5nZSIsImZpbHRlckRyb3Bkb3duVmlzaWJsZSIsIm9uRmlsdGVyRHJvcGRvd25WaXNpYmxlQ2hhbmdlIiwiZmlsdGVyUmVzZXRUb0RlZmF1bHRGaWx0ZXJlZFZhbHVlIiwiZGVmYXVsdEZpbHRlcmVkVmFsdWUiLCJmaWx0ZXJlZCIsImZvcmNlRmlsdGVyZWQiLCJwcm9wRmlsdGVyZWRLZXlzIiwiZ2V0RmlsdGVyZWRLZXlzU3luYyIsInNldEZpbHRlcmVkS2V5c1N5bmMiLCJvblNlbGVjdEtleXMiLCJzZXRPcGVuS2V5cyIsImludGVybmFsVHJpZ2dlckZpbHRlciIsIm1lcmdlZEtleXMiLCJjb25maXJtIiwiY2xvc2VEcm9wZG93biIsImRvRmlsdGVyIiwiZmlsdGVyRHJvcGRvd24iLCJkcm9wZG93bk1lbnVDbGFzcyIsIm9uQ2hlY2tBbGwiLCJhbGxGaWx0ZXJLZXlzIiwiZmxhdHRlbktleXMiLCJnZXRGaWx0ZXJEYXRhIiwiZHJvcGRvd25Db250ZW50IiwiY2xlYXJGaWx0ZXJzIiwiZ2V0RmlsdGVyQ29tcG9uZW50IiwiZmlsdGVyRW1wdHlUZXh0IiwiZmlsdGVyQ2hlY2thbGwiLCJnZXRSZXNldERpc2FibGVkIiwiZmlsdGVyUmVzZXQiLCJmaWx0ZXJDb25maXJtIiwiZmlsdGVySWNvbiIsImNvbGxlY3RGaWx0ZXJTdGF0ZXMiLCJmaWx0ZXJTdGF0ZXMiLCJjb2x1bW5Qb3MiLCJnZXRDb2x1bW5Qb3MiLCJmaWx0ZXJlZFZhbHVlcyIsImZpbHRlcmVkVmFsdWUiLCJnZXRDb2x1bW5LZXkiLCJpbmplY3RGaWx0ZXIiLCJfY29sdW1uJGZpbHRlck11bHRpcGwiLCJuZXdDb2x1bW4iLCJyZW5kZXJQcm9wcyIsInJlbmRlckNvbHVtblRpdGxlIiwiZ2VuZXJhdGVGaWx0ZXJJbmZvIiwiY3VycmVudEZpbHRlcnMiLCJvcmlnaW5LZXkiLCJjdXJyZW50RGF0YSIsIl9maWx0ZXJTdGF0ZSRjb2x1bW4iLCJvbkZpbHRlciIsInJlYWxLZXkiLCJ1c2VGaWx0ZXIiLCJvbkZpbHRlckNoYW5nZSIsInRhYmxlTG9jYWxlIiwic2V0RmlsdGVyU3RhdGVzIiwibWVyZ2VkRmlsdGVyU3RhdGVzIiwiY29sbGVjdGVkU3RhdGVzIiwiZmlsdGVyZWRLZXlzSXNBbGxOb3RDb250cm9sbGVkIiwibmV3RmlsdGVyU3RhdGVzIiwiaW5uZXJDb2x1bW5zIiwicmVmcmVzaFBhZ2luYXRpb24iLCJTRUxFQ1RJT05fQ09MVU1OIiwiU0VMRUNUSU9OX0FMTCIsIlNFTEVDVElPTl9JTlZFUlQiLCJTRUxFQ1RJT05fTk9ORSIsInVzZVNlbGVjdGlvbiIsInJvd1NlbGVjdGlvbiIsInByZXNlcnZlU2VsZWN0ZWRSb3dLZXlzIiwic2VsZWN0ZWRSb3dLZXlzIiwiZGVmYXVsdFNlbGVjdGVkUm93S2V5cyIsImdldENoZWNrYm94UHJvcHMiLCJvblNlbGVjdGlvbkNoYW5nZSIsIm9uU2VsZWN0QWxsIiwib25TZWxlY3RJbnZlcnQiLCJvblNlbGVjdE5vbmUiLCJvblNlbGVjdE11bHRpcGxlIiwic2VsZWN0aW9uQ29sV2lkdGgiLCJzZWxlY3Rpb25UeXBlIiwic2VsZWN0aW9ucyIsImN1c3RvbWl6ZVJlbmRlckNlbGwiLCJyZW5kZXJDZWxsIiwiaGlkZVNlbGVjdEFsbCIsIl9yZWYkY2hlY2tTdHJpY3RseSIsInBhZ2VEYXRhIiwiZ2V0UmVjb3JkQnlLZXkiLCJleHBhbmRUeXBlIiwibWVyZ2VkU2VsZWN0ZWRLZXlzIiwic2V0TWVyZ2VkU2VsZWN0ZWRLZXlzIiwicHJlc2VydmVSZWNvcmRzUmVmIiwidXBkYXRlUHJlc2VydmVSZWNvcmRzQ2FjaGUiLCJuZXdDYWNoZSIsIl91c2VNZW1vIiwiZXh0ZXJuYWxHZXRLZXkiLCJjaGlsZHJlblByb3BOYW1lIiwiZmxhdHRlZERhdGEiLCJjaGVja2JveFByb3BzTWFwIiwiaXNDaGVja2JveERpc2FibGVkIiwiX3VzZU1lbW8yIiwiX3VzZU1lbW8zIiwiZGVyaXZlZFNlbGVjdGVkS2V5cyIsImRlcml2ZWRIYWxmU2VsZWN0ZWRLZXlzIiwiZGVyaXZlZFNlbGVjdGVkS2V5U2V0IiwiZGVyaXZlZEhhbGZTZWxlY3RlZEtleVNldCIsInNldExhc3RTZWxlY3RlZEtleSIsImF2YWlsYWJsZUtleXMiLCJyZWNvcmRzIiwidHJpZ2dlclNpbmdsZVNlbGVjdGlvbiIsIm1lcmdlZFNlbGVjdGlvbnMiLCJzZWxlY3Rpb25MaXN0Iiwic2VsZWN0aW9uIiwic2VsZWN0aW9uQWxsIiwiY2hlY2tQcm9wcyIsInNlbGVjdEludmVydCIsInNlbGVjdE5vbmUiLCJyZWNvcmRLZXlzIiwiY2hlY2tlZEN1cnJlbnRBbGwiLCJjaGVja2VkQ3VycmVudFNvbWUiLCJvblNlbGVjdEFsbENoYW5nZSIsImNoYW5nZUtleXMiLCJjdXN0b21pemVTZWxlY3Rpb25zIiwib25TZWxlY3Rpb25DbGljayIsImFsbERpc2FibGVkRGF0YSIsImFsbERpc2FibGVkIiwiYWxsRGlzYWJsZWRBbmRDaGVja2VkIiwiYWxsRGlzYWJsZWRTb21lQ2hlY2tlZCIsIm1lcmdlZEluZGV0ZXJtaW5hdGUiLCJwb2ludEtleXMiLCJyZWNvcmRJbmRleCIsInJhbmdlS2V5cyIsImNoYW5nZWRLZXlzIiwib3JpZ2luQ2hlY2tlZEtleXMiLCJuZXh0Q2hlY2tlZEtleXMiLCJ0ZW1wS2V5U2V0IiwicmVuZGVyU2VsZWN0aW9uQ2VsbCIsIl9yZW5kZXJDZWxsIiwiX2Nsb25lQ29sdW1ucyIsIl9jbG9uZUNvbHVtbnMyIiwicmVzdENvbHVtbnMiLCJzZWxlY3Rpb25Db2x1bW5JbmRleCIsInByZXZDb2wiLCJuZXh0Q29sIiwibWVyZ2VkRml4ZWQiLCJzZWxlY3Rpb25Db2x1bW4iLCJDYXJldERvd25PdXRsaW5lZCIsIkNhcmV0RG93bk91dGxpbmVkU3ZnIiwiQ2FyZXRVcE91dGxpbmVkIiwiQ2FyZXRVcE91dGxpbmVkU3ZnIiwiQVNDRU5EIiwiREVTQ0VORCIsImdldE11bHRpcGxlUHJpb3JpdHkiLCJzb3J0ZXIiLCJnZXRTb3J0RnVuY3Rpb24iLCJjb21wYXJlIiwibmV4dFNvcnREaXJlY3Rpb24iLCJzb3J0RGlyZWN0aW9ucyIsImNvbGxlY3RTb3J0U3RhdGVzIiwic29ydFN0YXRlcyIsInB1c2hTdGF0ZSIsIm11bHRpcGxlUHJpb3JpdHkiLCJzb3J0T3JkZXIiLCJkZWZhdWx0U29ydE9yZGVyIiwiaW5qZWN0U29ydGVyIiwic29ydGVyU3RhdGVzIiwidHJpZ2dlclNvcnRlciIsImRlZmF1bHRTb3J0RGlyZWN0aW9ucyIsInRhYmxlU2hvd1NvcnRlclRvb2x0aXAiLCJzaG93U29ydGVyVG9vbHRpcCIsInNvcnRlclN0YXRlIiwic29ydGVyT3JkZXIiLCJuZXh0U29ydE9yZGVyIiwiY2FuY2VsU29ydCIsInRyaWdnZXJBc2MiLCJ0cmlnZ2VyRGVzYyIsInNvcnRUaXAiLCJyZW5kZXJTb3J0VGl0bGUiLCJvcmlnaW5PbkNsaWNrIiwib3JpZ2luT0tleURvd24iLCJzYWZlQ29sdW1uVGl0bGUiLCJkaXNwbGF5VGl0bGUiLCJzdGF0ZVRvSW5mbyIsImdlbmVyYXRlU29ydGVySW5mbyIsImdldFNvcnREYXRhIiwiaW5uZXJTb3J0ZXJTdGF0ZXMiLCJjbG9uZURhdGEiLCJydW5uaW5nU29ydGVycyIsInJlY29yZDEiLCJyZWNvcmQyIiwiY29tcGFyZUZuIiwiY29tcGFyZVJlc3VsdCIsInN1YlJlY29yZHMiLCJ1c2VGaWx0ZXJTb3J0ZXIiLCJvblNvcnRlckNoYW5nZSIsInNldFNvcnRTdGF0ZXMiLCJtZXJnZWRTb3J0ZXJTdGF0ZXMiLCJ2YWxpZGF0ZSIsInZhbGlkYXRlU3RhdGVzIiwicGF0Y2hTdGF0ZXMiLCJtdWx0aXBsZU1vZGUiLCJjb2x1bW5UaXRsZVNvcnRlclByb3BzIiwic29ydENvbHVtbnMiLCJzb3J0Q29sdW1uIiwic29ydFN0YXRlIiwibmV3U29ydGVyU3RhdGVzIiwiZ2V0U29ydGVycyIsIkludGVybmFsVGFibGUiLCJjdXN0b21pemVEcm9wZG93blByZWZpeENscyIsImRhdGFTb3VyY2UiLCJfcHJvcHMkcm93S2V5IiwibGVnYWN5Q2hpbGRyZW5Db2x1bW5OYW1lIiwiX3Byb3BzJHNob3dTb3J0ZXJUb29sIiwibmVlZFJlc3BvbnNpdmUiLCJtYXRjaGVkIiwidGFibGVQcm9wcyIsIl9SZWFjdCR1c2VDb250ZXh0JGxvYyIsInJhd0RhdGEiLCJfbWVyZ2VkRXhwYW5kYWJsZSRjaGkiLCJfdXNlTGF6eUtWTWFwIiwidXNlTGF6eUtWTWFwIiwiX3VzZUxhenlLVk1hcDIiLCJjaGFuZ2VFdmVudEluZm8iLCJ0cmlnZ2VyT25DaGFuZ2UiLCJyZXNldCIsImNoYW5nZUluZm8iLCJyZXNldFBhZ2luYXRpb24iLCJzY3JvbGxUb0ZpcnN0Um93T25DaGFuZ2UiLCJjdXJyZW50RGF0YVNvdXJjZSIsIl91c2VTb3J0ZXIiLCJ1c2VTb3J0ZXIiLCJfdXNlU29ydGVyMiIsInRyYW5zZm9ybVNvcnRlckNvbHVtbnMiLCJzb3J0ZXJUaXRsZVByb3BzIiwic29ydGVkRGF0YSIsIl91c2VGaWx0ZXIiLCJfdXNlRmlsdGVyMiIsInRyYW5zZm9ybUZpbHRlckNvbHVtbnMiLCJjb2x1bW5UaXRsZVByb3BzIiwibWVyZ2VkRmlsdGVycyIsImZpbHRlcktleSIsIl91c2VUaXRsZUNvbHVtbnMiLCJ1c2VUaXRsZUNvbHVtbnMiLCJfdXNlVGl0bGVDb2x1bW5zMiIsInRyYW5zZm9ybVRpdGxlQ29sdW1ucyIsIm9uUGFnaW5hdGlvbkNoYW5nZSIsIl91c2VQYWdpbmF0aW9uIiwidXNlUGFnaW5hdGlvbiIsIl91c2VQYWdpbmF0aW9uMiIsIm1lcmdlZFBhZ2luYXRpb24iLCJnZXRQYWdpbmF0aW9uUGFyYW0iLCJfbWVyZ2VkUGFnaW5hdGlvbiRjdXIiLCJfbWVyZ2VkUGFnaW5hdGlvbiRwYWciLCJERUZBVUxUX1BBR0VfU0laRSIsIl91c2VTZWxlY3Rpb24iLCJfdXNlU2VsZWN0aW9uMiIsInRyYW5zZm9ybVNlbGVjdGlvbkNvbHVtbnMiLCJzZWxlY3RlZEtleVNldCIsImludGVybmFsUm93Q2xhc3NOYW1lIiwibWVyZ2VkUm93Q2xhc3NOYW1lIiwidG9wUGFnaW5hdGlvbk5vZGUiLCJib3R0b21QYWdpbmF0aW9uTm9kZSIsInBhZ2luYXRpb25TaXplIiwicmVuZGVyUGFnaW5hdGlvbiIsImRlZmF1bHRQb3NpdGlvbiIsInRvcFBvcyIsImJvdHRvbVBvcyIsImlzRGlzYWJsZSIsInNwaW5Qcm9wcyIsIndyYXBwZXJDbGFzc05hbWVzIiwiUmNUYWJsZSIsIkZvcndhcmRUYWJsZSIsIkRlbGV0ZU91dGxpbmVkIiwiRGVsZXRlT3V0bGluZWRTdmciLCJUcmVlU2VsZWN0Q29udGV4dCIsInRyZWVFeHBhbmRBY3Rpb24iLCJMZWdhY3lDb250ZXh0IiwidHJlZUV4cGFuZGVkS2V5cyIsInRyZWVEZWZhdWx0RXhwYW5kQWxsIiwidHJlZURlZmF1bHRFeHBhbmRlZEtleXMiLCJvblRyZWVFeHBhbmQiLCJzaG93VHJlZUljb24iLCJ0cmVlTGluZSIsInRyZWVOb2RlRmlsdGVyUHJvcCIsInRyZWVMb2FkZWRLZXlzIiwidHJlZU1vdGlvbiIsIm9uVHJlZUxvYWQiLCJ0cmVlUmVmIiwibWVtb1RyZWVEYXRhIiwibWVyZ2VkQ2hlY2tlZEtleXMiLCJfdHJlZVJlZiRjdXJyZW50IiwibG93ZXJTZWFyY2hWYWx1ZSIsInNlYXJjaEV4cGFuZGVkS2V5cyIsInNldFNlYXJjaEV4cGFuZGVkS2V5cyIsIm9uSW50ZXJuYWxFeHBhbmQiLCJhY3RpdmVFbnRpdHkiLCJfdHJlZVJlZiRjdXJyZW50MiIsIl90cmVlUmVmJGN1cnJlbnQzIiwidHJlZVByb3BzIiwiX3JlZiRwcm9wcyIsImNoaWxkRGF0YSIsImZpbGxMZWdhY3lQcm9wcyIsImRhdGFOb2RlIiwiZmlsbEFkZGl0aW9uYWxJbmZvIiwiY2hlY2tlZFZhbHVlcyIsInNob3dQb3NpdGlvbiIsIm5vZGVMaXN0IiwiZ2VuZXJhdGVNYXAiLCJwYXJlbnRJbmNsdWRlZCIsImNoZWNrZWROb2RlIiwidmFsMSIsInZhbDIiLCJpbmRleDEiLCJpbmRleDIiLCJmaWx0ZXJPcHRpb25GdW5jIiwiVHJlZVNlbGVjdCIsIl9wcm9wcyR0cmVlTm9kZUZpbHRlciIsIl9wcm9wcyRzaG93Q2hlY2tlZFN0ciIsInNob3dDaGVja2VkU3RyYXRlZ3kiLCJTSE9XX0NISUxEIiwidHJlZU5vZGVMYWJlbFByb3AiLCJ0cmVlQ2hlY2tTdHJpY3RseSIsInRyZWVEYXRhU2ltcGxlTW9kZSIsInRyZWVDb25kdWN0aW9uIiwibWVyZ2VkQ2hlY2thYmxlIiwibWVyZ2VkTGFiZWxJblZhbHVlIiwibWVyZ2VkTXVsdGlwbGUiLCJtZXJnZWRUcmVlRGF0YSIsInVzZVRyZWVEYXRhIiwiX3VzZURhdGFFbnRpdGllcyIsInVzZURhdGFFbnRpdGllcyIsInZhbHVlRW50aXRpZXMiLCJzcGxpdFJhd1ZhbHVlcyIsIm1pc3NpbmdSYXdWYWx1ZXMiLCJleGlzdFJhd1ZhbHVlcyIsImZpbHRlcmVkVHJlZURhdGEiLCJ1c2VGaWx0ZXJUcmVlRGF0YSIsInRpdGxlTGlzdCIsIl90aXRsZSIsInRvTGFiZWxlZFZhbHVlcyIsInJhd0hhbGZDaGVja2VkIiwiX3Jhd0xhYmVsIiwibGFiZWxJblZhbHVlSXRlbSIsImxhYmVsZWRJdGVtIiwicmF3TWl4ZWRMYWJlbGVkVmFsdWVzIiwiZnVsbENoZWNrVmFsdWVzIiwiaGFsZkNoZWNrVmFsdWVzIiwicmF3SGFsZkxhYmVsZWRWYWx1ZXMiLCJfdXNlQ2hlY2tlZEtleXMiLCJ1c2VDaGVja2VkS2V5cyIsIl91c2VDaGVja2VkS2V5czIiLCJyYXdDaGVja2VkVmFsdWVzIiwicmF3SGFsZkNoZWNrZWRWYWx1ZXMiLCJkaXNwbGF5S2V5cyIsImZvcm1hdFN0cmF0ZWd5VmFsdWVzIiwiX2tleUVudGl0aWVzJGtleSRub2RlIiwiX2tleUVudGl0aWVzJGtleSIsIl9rZXlFbnRpdGllcyRrZXkkbm9kZTIiLCJ0YXJnZXRJdGVtIiwicmF3RGlzcGxheVZhbHVlcyIsImZpcnN0VmFsIiwiaXNOaWwiLCJjYWNoZWREaXNwbGF5VmFsdWVzIiwiZXZlbnRWYWx1ZXMiLCJmb3JtYXR0ZWRLZXlMaXN0IiwicmV0dXJuUmF3VmFsdWVzIiwiaGFsZlZhbHVlcyIsInJldHVybkxhYmVsZWRWYWx1ZXMiLCJhZGRpdGlvbmFsSW5mbyIsIm9uT3B0aW9uU2VsZWN0IiwiX25vZGUkbWVyZ2VkRmllbGROYW1lIiwiX3NwbGl0UmF3VmFsdWVzIiwib25JbnRlcm5hbERyb3Bkb3duVmlzaWJsZUNoYW5nZSIsImxlZ2FjeVBhcmFtIiwidHJlZVNlbGVjdENvbnRleHQiLCJsZWdhY3lDb250ZXh0IiwiR2VuZXJpY1RyZWVTZWxlY3QiLCJTSE9XX0FMTCIsIlNIT1dfUEFSRU5UIiwiSW50ZXJuYWxUcmVlU2VsZWN0IiwiX2EkdHJlZUljb24iLCJfYSRjaG9pY2VUcmFuc2l0aW9uTmEiLCJjaG9pY2VUcmFuc2l0aW9uTmFtZSIsInRyZWVQcmVmaXhDbHMiLCJ0cmVlU2VsZWN0UHJlZml4Q2xzIiwibWVyZ2VkRHJvcGRvd25DbGFzc05hbWUiLCJSY1RyZWVTZWxlY3QiLCJUcmVlU2VsZWN0UmVmIiwidHJhdmVyc2VGaWxlVHJlZSIsIl90cmF2ZXJzZUZpbGVUcmVlIiwiQWpheFVwbG9hZGVyIiwiZ2V0VWlkIiwicmVxcyIsImZpbGVJbnB1dCIsIl9pc01vdW50ZWQiLCJhY2NlcHQiLCJkaXJlY3RvcnkiLCJmaWxlcyIsImFjY2VwdGVkRmlsZXMiLCJmaWxlIiwiYXR0ckFjY2VwdCIsInVwbG9hZEZpbGVzIiwiZWwiLCJvbkZpbGVEcm9wIiwiX2ZpbGUiLCJvcmlnaW5GaWxlcyIsInBvc3RGaWxlcyIsInByb2Nlc3NGaWxlIiwiYWxsIiwiZmlsZUxpc3QiLCJvbkJhdGNoU3RhcnQiLCJwYXJzZWRGaWxlIiwicG9zdCIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX2NhbGxlZSIsImJlZm9yZVVwbG9hZCIsInRyYW5zZm9ybWVkRmlsZSIsIm1lcmdlZEFjdGlvbiIsInBhcnNlZERhdGEiLCJtZXJnZWRQYXJzZWRGaWxlIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInNlbnQiLCJ0MCIsImFicnVwdCIsIkZpbGUiLCJzdG9wIiwiX3giLCJfeDIiLCJzYXZlRmlsZUlucHV0IiwiYWJvcnQiLCJvblN0YXJ0IiwiY3VzdG9tUmVxdWVzdCIsImhlYWRlcnMiLCJ3aXRoQ3JlZGVudGlhbHMiLCJyZXF1ZXN0IiwiZGVmYXVsdFJlcXVlc3QiLCJyZXF1ZXN0T3B0aW9uIiwiZmlsZW5hbWUiLCJvblByb2dyZXNzIiwib25TdWNjZXNzIiwieGhyIiwiY2FwdHVyZSIsIm9wZW5GaWxlRGlhbG9nT25DbGljayIsImRpclByb3BzIiwid2Via2l0ZGlyZWN0b3J5IiwiZXZlbnRzIiwiVXBsb2FkIiwidXBsb2FkZXIiLCJzYXZlVXBsb2FkZXIiLCJBamF4VXBsb2FkIiwibXVsdGlwYXJ0IiwiRmlsZVR3b1RvbmUiLCJGaWxlVHdvVG9uZVN2ZyIsIlBhcGVyQ2xpcE91dGxpbmVkIiwiUGFwZXJDbGlwT3V0bGluZWRTdmciLCJQaWN0dXJlVHdvVG9uZSIsIlBpY3R1cmVUd29Ub25lU3ZnIiwiZXh0bmFtZSIsImlzSW1hZ2VGaWxlVHlwZSIsImlzSW1hZ2VVcmwiLCJEb3dubG9hZE91dGxpbmVkIiwiRG93bmxvYWRPdXRsaW5lZFN2ZyIsIkxpc3RJdGVtIiwibGlzdFR5cGUiLCJwcm9ncmVzc1Byb3BzIiwiYWN0aW9uSWNvblJlbmRlciIsImlzSW1nVXJsIiwic2hvd1ByZXZpZXdJY29uIiwic2hvd1JlbW92ZUljb24iLCJzaG93RG93bmxvYWRJY29uIiwiY3VzdG9tUHJldmlld0ljb24iLCJwcmV2aWV3SWNvbiIsImN1c3RvbVJlbW92ZUljb24iLCJjdXN0b21Eb3dubG9hZEljb24iLCJkb3dubG9hZEljb24iLCJvbkRvd25sb2FkIiwic2V0TWVyZ2VkU3RhdHVzIiwic2V0U2hvd1Byb2dyZXNzIiwicHJvZ3Jlc3NSYWZSZWYiLCJzcGFuQ2xhc3NOYW1lIiwidGh1bWJVcmwiLCJ1cGxvYWRpbmdDbGFzc05hbWUiLCJ0aHVtYm5haWwiLCJhQ2xhc3NOYW1lIiwiaW5mb1VwbG9hZGluZ0NsYXNzIiwibGlua1Byb3BzIiwicGFyc2UiLCJyZW1vdmVGaWxlIiwiZG93bmxvYWRGaWxlIiwiZG93bmxvYWRPckRlbGV0ZSIsInBpY3R1cmUiLCJsaXN0SXRlbU5hbWVDbGFzcyIsInByZXZpZXdTdHlsZSIsInByZXZpZXdGaWxlIiwicmVzcG9uc2UiLCJzdGF0dXNUZXh0IiwidXBsb2FkRXJyb3IiLCJpY29uQW5kUHJldmlldyIsImxvYWRpbmdQcm9ncmVzcyIsImxpc3RDb250YWluZXJOYW1lQ2xhc3MiLCJkb3dubG9hZCIsImxpc3RJdGVtTW90aW9uIiwib25BcHBlYXJFbmQiLCJvbkVudGVyRW5kIiwib25MZWF2ZUVuZCIsIkludGVybmFsVXBsb2FkTGlzdCIsIl9wcm9wcyRsaXN0VHlwZSIsIl9wcm9wcyRwcmV2aWV3RmlsZSIsInByZXZpZXdJbWFnZSIsIl9wcm9wcyRpc0ltYWdlVXJsIiwiX3Byb3BzJGl0ZW1zIiwiX3Byb3BzJHNob3dQcmV2aWV3SWNvIiwiX3Byb3BzJHNob3dSZW1vdmVJY29uIiwiX3Byb3BzJHNob3dEb3dubG9hZEljIiwiX3Byb3BzJHByb2dyZXNzIiwiYXBwZW5kQWN0aW9uIiwiX3Byb3BzJGFwcGVuZEFjdGlvblZpIiwiYXBwZW5kQWN0aW9uVmlzaWJsZSIsInVzZUZvcmNlVXBkYXRlIiwic2V0TW90aW9uQXBwZWFyIiwiRmlsZVJlYWRlciIsIm9yaWdpbkZpbGVPYmoiLCJCbG9iIiwicHJldmlld0RhdGFVcmwiLCJvbkludGVybmFsUHJldmlldyIsIm9uSW50ZXJuYWxEb3dubG9hZCIsImludGVybmFsSWNvblJlbmRlciIsImlzTG9hZGluZyIsImZpbGVJY29uIiwidXBsb2FkaW5nIiwiY3VzdG9tSWNvbiIsImJ0blByb3BzIiwiYnRuSWNvbiIsImhhbmRsZVByZXZpZXciLCJoYW5kbGVEb3dubG9hZCIsImxpc3RDbGFzc05hbWVzIiwibW90aW9uS2V5TGlzdCIsImFuaW1hdGlvbkRpcmVjdGlvbiIsIm1vdGlvbkNvbmZpZyIsIm9yaVByb3BzIiwiVXBsb2FkTGlzdCIsIkxJU1RfSUdOT1JFIiwiSW50ZXJuYWxVcGxvYWQiLCJkZWZhdWx0RmlsZUxpc3QiLCJfcHJvcHMkc2hvd1VwbG9hZExpc3QiLCJzaG93VXBsb2FkTGlzdCIsInByb3BMb2NhbGUiLCJfcHJvcHMkbXVsdGlwbGUiLCJfcHJvcHMkYWNjZXB0IiwiX3Byb3BzJHN1cHBvcnRTZXJ2ZXJSIiwic3VwcG9ydFNlcnZlclJlbmRlciIsIm1lcmdlZEZpbGVMaXN0Iiwic2V0TWVyZ2VkRmlsZUxpc3QiLCJkcmFnU3RhdGUiLCJzZXREcmFnU3RhdGUiLCJ1cGxvYWQiLCJ0aW1lc3RhbXAiLCJpc0Zyb3plbiIsImNoYW5nZWRGaWxlTGlzdCIsIm1lcmdlZEJlZm9yZVVwbG9hZCIsImZpbGVMaXN0QXJncyIsInRyYW5zZm9ybUZpbGUiLCJjb25maWd1cmFibGUiLCJiYXRjaEZpbGVJbmZvTGlzdCIsImZpbHRlcmVkRmlsZUluZm9MaXN0Iiwib2JqZWN0RmlsZUxpc3QiLCJmaWxlMk9iaiIsIm5ld0ZpbGVMaXN0IiwiZmlsZU9iaiIsInVwZGF0ZUZpbGVMaXN0IiwidHJpZ2dlckZpbGVPYmoiLCJsYXN0TW9kaWZpZWREYXRlIiwibGFzdE1vZGlmaWVkIiwiZ2V0VGltZSIsImdldEZpbGVJdGVtIiwibmV4dEZpbGVMaXN0IiwiaGFuZGxlUmVtb3ZlIiwiY3VycmVudEZpbGUiLCJyZW1vdmVkRmlsZUxpc3QiLCJyZW1vdmVGaWxlSXRlbSIsIm1hdGNoS2V5IiwicmNVcGxvYWRQcm9wcyIsInJlbmRlclVwbG9hZExpc3QiLCJidXR0b25WaXNpYmxlIiwiZHJhZ0NscyIsIlJjVXBsb2FkIiwidXBsb2FkQnV0dG9uQ2xzIiwicmVuZGVyVXBsb2FkQnV0dG9uIiwidXBsb2FkQnV0dG9uU3R5bGUiLCJ1cGxvYWRCdXR0b24iLCJEcmFnZ2VyIiwiY3JlYXRlU3RvcmUiLCJ1c2VEZWJ1Z1ZhbHVlIiwiSU5GSU5JVFkiLCJpZGVudGl0eSIsInN0cmluZ1RvUGF0aCIsImdldFByb3RvdHlwZSIsImdldFN5bWJvbHNJbiIsImJhc2VDcmVhdGUiLCJDTE9ORV9ERUVQX0ZMQUciLCJDTE9ORV9TWU1CT0xTX0ZMQUciLCJpc1NldCIsImlzTWFwIiwiYmFzZUZvciIsImlzVW5kZWZpbmVkIiwiYmFzZUVhY2giLCJjb2xsZWN0aW9uIiwiX2hhcyIsImlzVXJsIiwiaXNOdW1iZXIiLCJnZXRBcnJheSIsInZhbHVlUmVtb3ZlVW5kZWZpbmVkIiwicmVjdXJzaW9uQXJyYXkiLCJyZWN1cnNpb25PYmoiLCJ0cmFuc2xhdGlvbiIsImhhc0Z1bmNQcm9wZXJ0eSIsInRyYW5zZm9ybVByb3BzIiwibWFwcGluZyIsImlzTXVsdGlCaW5kIiwidHJhbnNmb3JtUGF0aCIsInJlY3Vyc2lvbiIsInRyYW5zZm9ybVZhbHVlVG9CaW5kIiwidHJhbnNmb3JtQmluZFRvVmFsdWUiLCJwYXJzZVZhbHVlc1RvQmluZCIsImRlYWxGaWVsZExpc3QiLCJwYXJzZUJpbmRUb1ZhbHVlcyIsImdldEZvcm1JdGVtTGF5b3V0IiwiZXhlY3V0ZUNhbGxCYWNrIiwidHJhdmVyc2VWYWx1ZXMiLCJ0cmF2ZXJzZUFycmF5IiwidHJhdmVyc2VPYmoiLCJsYXN0IiwidmFsdWVzV2F0Y2giLCJ0cmFuc2Zvcm1GaWVsZHNEYXRhIiwiZ2V0RmllbGROYW1lIiwiaW1tZWRpYXRlV2F0Y2giLCJnZXRTY2hlbWFGdWxsUGF0aCIsImFkanVzdFplcm8iLCJnZXRTZXNzaW9uSXRlbSIsInNldFNlc3Npb25JdGVtIiwiYXJyIiwiVHlwZUVycm9yIiwibWluTGVuIiwiY29uc3RydWN0b3IiLCJpdGVyIiwiaXRlcmF0b3IiLCJhcnIyIiwiZmlsdGVySGlkZGVuRGF0YSIsImdldFBhdGhPYmoiLCJfcmVmJHJvb3RQYXRoIiwicm9vdFBhdGgiLCJwYXRoTGlzdCIsInNjaGVtYUluZGV4IiwiZGF0YVBhdGhMaXN0IiwicG9wIiwiZGF0YVBhdGgiLCJfcGF0aCIsInNjaGVtYVBhdGgiLCJnZXRQYXRoIiwiZGlzcGxheVR5cGUiLCJ3aWRnZXRzIiwiZGVzY1dpZGdldCIsImxhYmVsV2lkZ2V0IiwiTGFiZWxOb2RlIiwiUmVuZGVyRGVzYyIsIldpZGdldCIsImdldFRvb2x0aXAiLCJkZXNjVHlwZSIsIl9faHRtbCIsImdldEV4dHJhVmlldyIsImV4dHJhS2V5Iiwid2lkZ2V0TmFtZSIsIndpZGdldCIsImdldENvbFNwYW4iLCJmb3JtQ3R4IiwicGFyZW50Q3R4IiwiZ2V0UGFyYW1WYWx1ZSIsImNlbGxTcGFuIiwidXBwZXJDdHgiLCJ2YWx1ZUtleSIsImlzVG9wIiwiZ2V0RmllbGRQcm9wcyIsIm1ldGhvZHMiLCJkZXBlbmRWYWx1ZXMiLCJmaWVsZFJlZiIsInBhdGhPYmoiLCJmaWVsZFByb3BzIiwiYWRkb25zIiwiZW51bSIsImVudW1zIiwiZW51bU5hbWVzIiwiaXNIdG1sIiwiQWRkb25BZnRlcldpZGdldCIsImdldERlcGVuZFZhbHVlcyIsImZvcm1EYXRhIiwiZGVwZW5kUGF0aCIsImRlcGVuZGVuY2llSXRlbSIsImluZGV4UmVnIiwiX2dldCIsImRlcGVuZEluZGV4IiwibGlzdFBhdGgiLCJpdGVtUGF0aCIsImxpc3REYXRhIiwiY3JlYXRlRGF0YVNrZWxldG9uIiwiaXNFeHByZXNzaW9uIiwiaXNIYXNFeHByZXNzaW9uIiwicGFyc2VFeHByZXNzaW9uIiwicGFyc2VBbGxFeHByZXNzaW9uIiwiZXh0cmFjdEZvcm1EYXRhU3RyaW5ncyIsImV4dHJhY3RSb290VmFsdWVTdHJpbmdzIiwiZmluZFN0ckxpc3QiLCJnZXRMaXN0RXZlcnlSZXN1bHQiLCJnZXRXaWRnZXQiLCJpc0FycmF5aXNoIiwic3dpenpsZSIsInNpbXBsZVN3aXp6bGVNb2R1bGUiLCJjb2xvclN0cmluZ01vZHVsZSIsIm1vZGVsIiwiaTIiLCJjb252ZXJzaW9uc01vZHVsZSIsInkyIiwieDIiLCJ6MiIsImNvbnZlcnNpb25zIiwibW9kZWxzIiwicm91dGUiLCJDb2xvciIsImNoYW5uZWxzIiwibGFiZWxzIiwidzIiLCJpbnNlcnRMZW5ndGhSdWxlIiwiaW5zZXJ0UmVxdWlyZWRSdWxlIiwidHJhbnNmb3JtUnVsZXMiLCJpc0RldiIsIk0iLCIkIiwiRCIsIkZpZWxkV3JhcHBlclN0YXR1cyIsIm1heFdpZHRoIiwib25TdGF0dXNDaGFuZ2UiLCJvdGhlckZpZWxkUHJvcHMiLCJfRm9ybSRJdGVtJHVzZVN0YXR1cyIsIl9Gb3JtIiwiZ2V0RmllbGRFcnJvciIsInVzZVVwZGF0ZUVmZmVjdCIsIkZpZWxkV3JhcHBlciIsInJlbW92ZUJ0biIsImNvbmZpZ0N0eCIsIl9Db25maWdQcm92aWRlciIsInNldFNjaGVtYUJ5UGF0aCIsIl9CdXR0b24iLCJ3cml0YWJsZSIsImhpbnQiLCJwcmltIiwicmVzIiwiVXBwZXJDb250ZXh0IiwidmFsdWVQcm9wTmFtZU1hcCIsImNoZWNrYm94Iiwic3dpdGNoIiwidXNlU3RvcmUiLCJyZXNlcnZlTGFiZWwiLCJfaW5saW5lTW9kZSIsImlubGluZU1vZGUiLCJyZW1vdmVUZXh0IiwiX3NjaGVtYSR2aXNpYmxlIiwib3RoZXJTY2hlbWEiLCJnZXRWYWx1ZUZyb21LZXkiLCJnZXRXaWRnZXROYW1lIiwic2V0RmllbGRSZWYiLCJFcnJvclNjaGVtYSIsIl9Db2wiLCJpbmxpbmVTZWxmIiwiaW5saW5lQ2hpbGQiLCJsYWJlbFdpZHRoIiwiY2hpbGRFbGVtZW50IiwiX1JvdyIsImZpZWxkQ29sIiwicnVsZUxpc3QiLCJnZXRSdWxlTGlzdCIsIl9sYWJlbENvbCIsIl9maWVsZENvbCIsIl9nZXRGb3JtSXRlbUxheW91dCIsInJlYWRPbmx5V2lkZ2V0IiwiaXNDaGVja0JveFR5cGUiLCJkZWZhdWx0IiwiY2xhc3NSZXN0IiwiZm9ybUl0ZW0iLCJGUkNvbnRleHQiLCJfc3RvcmUkZ2V0U3RhdGUiLCJnZXRTdGF0ZSIsImZvcm1TY2hlbWEiLCJtdXN0YWNoZURpc2FibGVkIiwic2hvdWxkVXBkYXRlT3BlbiIsIk1haW4iLCJzY2hlbWFTdHIiLCJmaWVsZFNob3VsZFVwZGF0ZSIsImZvcm1EZXBlbmRlbmNpZXMiLCJkZXBQYXRoIiwibmV3U2NoZW1hIiwiZ2V0Rm9ybUxpc3RMYXlvdXQiLCJPcCIsImhhc093biIsImRlc2MiLCJpdGVyYXRvclN5bWJvbCIsImFzeW5jSXRlcmF0b3JTeW1ib2wiLCJhc3luY0l0ZXJhdG9yIiwidG9TdHJpbmdUYWdTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsImlubmVyRm4iLCJvdXRlckZuIiwidHJ5TG9jc0xpc3QiLCJwcm90b0dlbmVyYXRvciIsIkdlbmVyYXRvciIsIm1ha2VJbnZva2VNZXRob2QiLCJ0cnlDYXRjaCIsImZuIiwiQ29udGludWVTZW50aW5lbCIsIkdlbmVyYXRvckZ1bmN0aW9uIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJnZXRQcm90byIsIk5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlIiwiR3AiLCJkZWZpbmVJdGVyYXRvck1ldGhvZHMiLCJfaW52b2tlIiwiQXN5bmNJdGVyYXRvciIsIlByb21pc2VJbXBsIiwiaW52b2tlIiwiX19hd2FpdCIsInVud3JhcHBlZCIsInByZXZpb3VzUHJvbWlzZSIsImNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnIiwiRXJyb3IiLCJkb25lUmVzdWx0IiwiZGVsZWdhdGUiLCJkZWxlZ2F0ZVJlc3VsdCIsIm1heWJlSW52b2tlRGVsZWdhdGUiLCJfc2VudCIsImRpc3BhdGNoRXhjZXB0aW9uIiwibWV0aG9kTmFtZSIsInJldHVybiIsInJlc3VsdE5hbWUiLCJuZXh0TG9jIiwicHVzaFRyeUVudHJ5IiwibG9jcyIsImVudHJ5IiwidHJ5TG9jIiwiY2F0Y2hMb2MiLCJmaW5hbGx5TG9jIiwiYWZ0ZXJMb2MiLCJ0cnlFbnRyaWVzIiwicmVzZXRUcnlFbnRyeSIsImNvbXBsZXRpb24iLCJpdGVyYWJsZSIsIml0ZXJhdG9yTWV0aG9kIiwiaXNHZW5lcmF0b3JGdW5jdGlvbiIsImdlbkZ1biIsImN0b3IiLCJfX3Byb3RvX18iLCJhd3JhcCIsImFzeW5jIiwic2tpcFRlbXBSZXNldCIsInJvb3RSZWNvcmQiLCJydmFsIiwiZXhjZXB0aW9uIiwiaGFuZGxlIiwibG9jIiwiY2F1Z2h0IiwiaGFzQ2F0Y2giLCJoYXNGaW5hbGx5IiwiZmluYWxseUVudHJ5IiwiZmluaXNoIiwiX2NhdGNoIiwidGhyb3duIiwiZGVsZWdhdGVZaWVsZCIsInBhcmVudExpdFBhdGgiLCJyZW5kZXJDb3JlIiwiY29uZmlnQ29udGV4dCIsInNldExpc3REYXRhIiwiZGVmYXVsdEFkZEJ0blByb3BzIiwiZGVmYXVsdERlbENvbmZpcm1Qcm9wcyIsImRlZmF1bHRBY3Rpb25Db2x1bW5Qcm9wcyIsImNvbEhlYWRlclRleHQiLCJsaXN0UHJvcHMiLCJfc2NoZW1hJHJ1bGVzIiwiX2QiLCJhZGRCdG5Qcm9wcyIsImRlbENvbmZpcm1Qcm9wcyIsImFjdGlvbkNvbHVtblByb3BzIiwiaGlkZUNvcHkiLCJoaWRlTW92ZSIsImhpZGVEZWxldGUiLCJvbkFkZCIsIm9uTW92ZSIsIm9uQ29weSIsIm90aGVyTGlzdFByb3BzIiwiaGFuZGxlQWRkIiwiYWRkRnVuYyIsImZ1bkRhdGEiLCJyZW1vdmVGdW5jIiwicHJlUm9vdFBhdGgiLCJoYW5kbGVNb3ZlIiwibW92ZUZ1bmMiLCJoYW5kbGVDb3B5IiwiX21lc3NhZ2UiLCJjb3B5RnVuYyIsImhhbmRsZURlbGV0ZSIsImxpc3RPcGVyYXRlIiwib3BlcmF0ZUJ0blR5cGUiLCJidG5UeXBlIiwiX2UiLCJsaXN0TmFtZSIsImFkZEl0ZW0iLCJyZW1vdmVJdGVtIiwibW92ZUl0ZW0iLCJjb3B5SXRlbSIsInRlbXBvcmFyeSIsImNvcHlCdG5Qcm9wcyIsImVkaXRvckJ0blByb3BzIiwiZGVsZXRlQnRuUHJvcHMiLCJtb3ZlVXBCdG5Qcm9wcyIsIm1vdmVEb3duQnRuUHJvcHMiLCJfcyIsIl9yIiwiX2FyciIsIl9uIiwiaXNEaXNwbGF5Q29sdW1uIiwiX3NjaGVtYSIsIl9nZXRGb3JtTGlzdExheW91dCIsImlzSW5saW5lIiwiaW5zZXJ0IiwiUmVuZGVyQ29yZSIsIndpZGdldFR5cGUiLCJfcHJvcHMkcGFyZW50UGF0aCIsIl9wcm9wcyRyb290UGF0aCIsInNvcnRQcm9wZXJ0aWVzIiwiZW50cmllcyIsIkZvcm1Db3JlIiwiZmxhdHRlblNjaGVtYSIsInNldENvbnRleHQiLCJfZiIsInNjaGVtUHJvcHMiLCJfdHJhbnNmb3JtUHJvcHMiLCJmb3JtUHJvcHMiLCJiZWZvcmVGaW5pc2giLCJ3YXRjaCIsIm9uTW91bnQiLCJyZW1vdmVIaWRkZW5EYXRhIiwib3BlcmF0ZUV4dHJhIiwibG9nT25Nb3VudCIsImxvZ09uU3VibWl0IiwiX19pbml0U3RvcmUiLCJpbml0aWFsIiwic2V0U2NoZW1hIiwib25Nb3VudExvZ2dlciIsImdldFZhbHVlcyIsImxvZ1BhcmFtcyIsImxvY2F0aW9uIiwiZm9ybU1vdW50IiwieXltbWRkIiwib25TdWJtaXRMb2dnZXIiLCJwYXJhbXMiLCJtb3VudCIsIm51bWJlck9mU3VibWl0cyIsImZhaWxlZEF0dGVtcHRzIiwibXMiLCJtc1RvVGltZSIsImhhbmRsZVZhbHVlc0NoYW5nZSIsImNoYW5nZWRWYWx1ZXMiLCJfYWxsVmFsdWVzIiwiYWxsVmFsdWVzIiwiaGFuZGxlRmluaXNoIiwiX3ZhbHVlcyIsIl9jYWxsZWUyIiwiZmllbGRzRXJyb3IiLCJfY2FsbGVlMiQiLCJfY29udGV4dDIiLCJfY2xvbmVEZWVwIiwiaGFuZGxlRmluaXNoRmFpbGVkIiwiX2NhbGxlZTMiLCJfY2FsbGVlMyQiLCJfY29udGV4dDMiLCJvcGVybGFiZWxDb2wiLCJfU3BhY2UiLCJoaWRlIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInpoX0NOIiwiX2RlZmF1bHQiLCJsb2NhbGVWYWx1ZXMiLCJlbl9VUyIsImNyZWF0ZXgiLCJ3aXRoUHJvdmlkZXIiLCJkZWZhdWx0V2lkZ2V0cyIsImNvbmZpZ1Byb3ZpZGVyIiwiX3Byb3BzJGdsb2JhbFByb3BzIiwiX3Byb3BzJGdsb2JhbENvbmZpZyIsInN0b3JlUmVmIiwiZGF5anMiLCJhbnRkTG9jYWxlIiwiemhDTiIsImZvcm1WYWxpZGF0ZU1lc3NhZ2VzIiwidmFsaWRhdGVNZXNzYWdlc0NOIiwidmFsaWRhdGVNZXNzYWdlc0VOIiwibGFuZ1BhY2siLCJsb2NhbGVzIiwiZ2V0UHJvcHMiLCJmaWx0ZXJQcm9wcyIsIl9JbnB1dCIsImZpbmFsUHJvcHMiLCJ3aXRoRmllbGRXcmFwIiwiUmFkaW9Db21wIiwiX3Byb3BzJG9wdGlvbnMiLCJfUmFkaW8iLCJDaGVja0JveCIsIl9DaGVja2JveCIsIkNoZWNrYm94ZXMiLCJSZWFjdFByb3BUeXBlc1NlY3JldCIsInNoaW0iLCJwcm9wVHlwZXNNb2R1bGUiLCJfZ2xvYmFsTW9kdWxlIiwiY29yZSIsIl9jb3JlTW9kdWxlIiwiYW5PYmplY3QiLCJJRThfRE9NX0RFRklORSIsImRQIiwiY3JlYXRlRGVzYyIsIlBST1RPVFlQRSIsIiRleHBvcnQiLCJjb2YiLCJkZWZpbmVkIiwidG9JbnRlZ2VyIiwidG9JT2JqZWN0IiwiX3NoYXJlZE1vZHVsZSIsInNoYXJlZCIsIklFX1BST1RPIiwibmFtZXMiLCIka2V5cyIsImVudW1CdWdLZXlzIiwiREVTQ1JJUFRPUlMiLCJnT1BTIiwicElFIiwidG9PYmplY3QiLCJJT2JqZWN0IiwiaXNFbnVtIiwiX2Fzc2lnbiIsImZhY3RvcnkiLCJSZWFjdE5vb3BVcGRhdGVRdWV1ZSIsInByb3BUeXBlcyIsInByb3BlcnR5IiwiRXZlbnRCYXNlT2JqZWN0IiwiX29iamVjdEFzc2lnbiIsIl9vYmplY3RBc3NpZ24yIiwiX3JlYWN0RG9tIiwiJE9iamVjdCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJfd2tzTW9kdWxlIiwic2V0VG9TdHJpbmdUYWciLCJOQU1FIiwiT2JqZWN0UHJvdG8iLCJyZWRlZmluZSIsIkl0ZXJhdG9ycyIsInJlcXVpcmUkJDgiLCJUQUciLCJNRVRBIiwiX21ldGFNb2R1bGUiLCJ3a3NFeHQiLCJnT1BOIiwiZ09QRCIsInJlcXVpcmUkJDkiLCJyZXF1aXJlJCQxMCIsInJlcXVpcmUkJDExIiwicmVxdWlyZSQkMTIiLCJyZXF1aXJlJCQxMyIsInJlcXVpcmUkJDE0IiwicmVxdWlyZSQkMTUiLCJyZXF1aXJlJCQxNiIsInJlcXVpcmUkJDE3IiwicmVxdWlyZSQkMTgiLCJyZXF1aXJlJCQxOSIsInJlcXVpcmUkJDIwIiwiX2NyZWF0ZSIsInJlcXVpcmUkJDIxIiwicmVxdWlyZSQkMjIiLCJyZXF1aXJlJCQyMyIsInJlcXVpcmUkJDI0IiwicmVxdWlyZSQkMjUiLCJyZXF1aXJlJCQyNiIsInJlcXVpcmUkJDI3IiwicmVxdWlyZSQkMjgiLCJyZXF1aXJlJCQyOSIsInJlcXVpcmUkJDMwIiwiX3R5cGVvZl8xIiwiX3R5cGVvZjIiLCJfdHlwZW9mMyIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIiwicHJvcExpc3QiLCJQcm9wVHlwZXMiLCJ1bnNhZmVMaWZlY3ljbGVzUG9seWZpbGwiLCJwcm9jZXNzIiwicmUiLCJFdmVudCIsImNzc0FuaW1hdGlvbiIsIkFuaW1hdGVDaGlsZCIsImFuaW1VdGlsIiwiY3NzQW5pbWF0ZSIsImdldENoaWxkcmVuRnJvbVByb3BzIiwiQW5pbWF0ZSIsIl9pbml0aWFsaXNlUHJvcHMiLCJjdXJyZW50bHlBbmltYXRpbmdLZXlzIiwia2V5c1RvRW50ZXIiLCJrZXlzVG9MZWF2ZSIsInRvQXJyYXlDaGlsZHJlbiIsImNoaWxkcmVuUmVmcyIsInNob3dQcm9wIiwicGVyZm9ybUFwcGVhciIsImNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMiLCJfdGhpczMiLCJuZXh0Q2hpbGRyZW4iLCJleGNsdXNpdmUiLCJjdXJyZW50Q2hpbGRyZW4iLCJuZXdDaGlsZHJlbiIsImN1cnJlbnRDaGlsZCIsIm5leHRDaGlsZCIsImZpbmRDaGlsZEluQ2hpbGRyZW5CeUtleSIsIm5ld0NoaWxkIiwibWVyZ2VDaGlsZHJlbiIsInNob3dJbk5leHQiLCJzaG93SW5Ob3ciLCJmaW5kU2hvd25DaGlsZEluQ2hpbGRyZW5CeUtleSIsInBlcmZvcm1FbnRlciIsInBlcmZvcm1MZWF2ZSIsImlzVmFsaWRDaGlsZEJ5S2V5IiwiX3RoaXM0Iiwic3RhdGVDaGlsZHJlbiIsInRyYW5zaXRpb25FbnRlciIsInRyYW5zaXRpb25BcHBlYXIiLCJ0cmFuc2l0aW9uTGVhdmUiLCJpc0FuaW1hdGUiLCJvbmVPZlR5cGUiLCJvbkVuZCIsImZ1bmMiLCJvbkFwcGVhciIsIl90aGlzNSIsImNvbXBvbmVudFdpbGxFbnRlciIsImhhbmRsZURvbmVBZGRpbmciLCJjb21wb25lbnRXaWxsQXBwZWFyIiwiYWxsb3dBcHBlYXJDYWxsYmFjayIsImFsbG93RW50ZXJDYWxsYmFjayIsImNvbXBvbmVudFdpbGxMZWF2ZSIsImhhbmRsZURvbmVMZWF2aW5nIiwiYWxsb3dMZWF2ZUNhbGxiYWNrIiwiaXNTYW1lQ2hpbGRyZW4iLCJMYXp5UmVuZGVyQm94IiwiaGlkZGVuQ2xhc3NOYW1lIiwic2F2ZVBvcHVwUmVmIiwic2F2ZUFsaWduUmVmIiwicm9vdE5vZGUiLCJwb3B1cEluc3RhbmNlIiwiZ2V0TWFza1RyYW5zaXRpb25OYW1lIiwiY3VycmVudEFsaWduQ2xhc3NOYW1lIiwibmV3U3R5bGUiLCJnZXRaSW5kZXhTdHlsZSIsInBvcHVwSW5uZXJQcm9wcyIsImdldFRhcmdldCIsImdldE1hc2tFbGVtZW50IiwibWFza0VsZW1lbnQiLCJtYXNrVHJhbnNpdGlvbiIsImdldENvbnRhaW5lclJlbmRlck1peGluXzEiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJjcmVhdGVSZWFjdENsYXNzIiwiYXJyYXlPZiIsIm1peGlucyIsImdldENvbnRhaW5lclJlbmRlck1peGluIiwiYXV0b01vdW50IiwiZ2V0RGVmYXVsdFByb3BzIiwiZ2V0SW5pdGlhbFN0YXRlIiwiY29tcG9uZW50V2lsbE1vdW50IiwicmVuZGVyQ29tcG9uZW50IiwiX2NvbXBvbmVudCIsIl9nZXRQb3B1cENsYXNzTmFtZUZyb21BbGlnbiIsIl9wcm9wczIiLCJfcHJvcHMzIiwiX3Byb3BzNCIsIl9wcm9wczUiLCJfcHJvcHM2IiwiYWxpZ25JbnN0YW5jZSIsInRpbnljb2xvciIsImlucHV0VG9SR0IiLCJnZXRGb3JtYXQiLCJib3VuZEFscGhhIiwidG9Ic3YiLCJyZ2JUb0hzdiIsInJnYlRvSHNsIiwidG9IZXgiLCJyZ2JUb0hleCIsInJnYmFUb0hleCIsImJvdW5kMDEiLCJjb252ZXJ0VG9QZXJjZW50YWdlIiwic3RyaW5nSW5wdXRUb09iamVjdCIsImlzVmFsaWRDU1NVbml0IiwicmdiVG9SZ2IiLCJoc3ZUb1JnYiIsImhzbFRvUmdiIiwiaHVlMnJnYiIsInBhZDIiLCJjb252ZXJ0RGVjaW1hbFRvSGV4IiwiY2xhbXAwMSIsImZsaXAiLCJpc09uZVBvaW50WmVybyIsImlzUGVyY2VudGFnZSIsInBhcnNlSW50RnJvbUhleCIsImNvbnZlcnRIZXhUb0RlY2ltYWwiLCJtYXRjaGVycyIsIkNTU19JTlRFR0VSIiwiQ1NTX05VTUJFUiIsIkNTU19VTklUIiwiUEVSTUlTU0lWRV9NQVRDSDMiLCJQRVJNSVNTSVZFX01BVENINCIsIl9yZWFjdERvbTIiLCJkZWZhdWx0cyIsIkJvYXJkIiwiUmliYm9uIiwiQWxwaGEiLCJyZWQiLCJwZXJjZW50YWdlIiwiUGFyYW1zIiwidmFsaWRhdGlvbkNvbG9yIiwiQ29sb3JQaWNrZXIiLCJnZXRBbHBoYUZyb21IZXgiLCJoZXgiLCJhbHBoYUhleCIsImFscGhhIiwiYWxwaGFIZXhNYXAiLCJ0b1VwcGVyQ2FzZSIsIm9uUGlja2VyQ2hhbmdlIiwidHJhbnNmb3JtRGF0ZVZhbHVlIiwicGFyc2VMb2NhbGUiLCJwYXJzZU5vTWF0Y2hOb3RpY2UiLCJkYXlqc0dlbmVyYXRlQ29uZmlnIiwiZXh0ZW5kIiwicXVhcnRlck9mWWVhciIsIkRhdGVDbXB0IiwiZGF0ZUZvcm1hdCIsInZhbHVlT2JqIiwiZGF0ZVZhbHVlIiwiZGF0ZVN0cmluZyIsImRhdGVQYXJhbXMiLCJEYXRlUmFuZ2UiLCJfc3RyaW5nTGlzdCIsInN0cmluZ0xpc3QiLCJpc1Bhc3MiLCJUaW1lIiwiX2EkZm9ybWF0IiwidGltZUZvcm1hdCIsInZhbHVlU3RyIiwidGltZVBhcmFtcyIsIlRpbWVSYW5nZSIsIl9yZWYkZm9ybWF0IiwiZW1wdHlMaXN0MSIsImVtcHR5TGlzdDIiLCJQaWN0dXJlT3V0bGluZWRfMSIsIlBpY3R1cmVPdXRsaW5lZCIsIndhcm5pbmdfMSIsIm5vdGUiLCJub3RlT25jZSIsInJlc2V0V2FybmVkIiwid2FybmluZ09uY2UiLCJ3YXJuZWQiLCJjYW5Vc2VEb21fMSIsImNvbnRhaW5zXzEiLCJpbmplY3RDU1MiLCJyZW1vdmVDU1MiLCJBUFBFTkRfT1JERVIiLCJNQVJLX0tFWSIsImNvbnRhaW5lckNhY2hlIiwiZ2V0T3JkZXIiLCJmaW5kU3R5bGVzIiwiZmluZEV4aXN0Tm9kZSIsInN5bmNSZWFsQ29udGFpbmVyIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJub2RlSW50ZXJvcCIsIkljb25CYXNlXzEiLCJ0d29Ub25lQ29sb3JQYWxldHRlIiwic2V0VHdvVG9uZUNvbG9ycyIsImdldFR3b1RvbmVDb2xvcnMiLCJkZWZhdWx0XzEiLCJfQW50ZEljb24iLCJERUZBVUxUX0lNRyIsIlByZXZpZXdOb2RlIiwiX1BvcG92ZXIiLCJfUGljdHVyZU91dGxpbmVkIiwiSW1hZ2VJbnB1dCIsIlVybE5vZGUiLCJfcHJvcHMkYWRkb25UZXh0IiwiYWRkb25UZXh0IiwidXNlVXJsIiwiVXJsSW5wdXQiLCJTbGlkZXJXaXRoTnVtYmVyIiwiaGlkZUlucHV0Iiwic2V0dGluZyIsIl9TbGlkZXIiLCJmbGV4R3JvdyIsIl9JbnB1dE51bWJlciIsIlVwbG9hZE91dGxpbmVkXzEiLCJVcGxvYWRPdXRsaW5lZCIsIkZyVXBsb2FkIiwidXBsb2FkUHJvcHMiLCJkZWZhdWx0QnRuUHJvcHMiLCJfVXBsb2FkT3V0bGluZWQiLCJfVXBsb2FkIiwiaHRtbCIsIl9yZWYkc2NoZW1hIiwiaWR4U3RyIiwiX0ltYWdlIiwiaW1hZ2VQcm9wcyIsIlBlcmNlbnRTbGlkZXIiLCJfcCRzY2hlbWEiLCJoaWRlTnVtYmVyIiwiaXNQZXJjZW50IiwiZW5kc1dpdGgiLCJudW1iZXJWYWx1ZSIsIm5ld051bWJlciIsInJlbmRlck51bWJlciIsInJlYWRvbmx5IiwiUGFuZWxWaWV3IiwiQm94Q2FyZCIsIkJveFBhbmVsIiwiX0NhcmQiLCJEb3duT3V0bGluZWRfMSIsIl9Db2xsYXBzZSIsIkJveENvbGxhcHNlIiwiX3Byb3BzJGNvbGxhcHNlZCIsImNvbGxhcHNlZCIsImNvbGxhcHNlSGVhZGVyIiwiX0Rvd25PdXRsaW5lZCIsIkJveFN1YklubGluZSIsIl9wcm9wcyRoYXNCYWNrZ3JvdW5kIiwiaGFzQmFja2dyb3VuZCIsIl90b29sdGlwIiwiRkxpbmVUaXRsZSIsIlBsdXNPdXRsaW5lZF8xIiwiQ29weU91dGxpbmVkXzEiLCJDb3B5T3V0bGluZWQiLCJDbG9zZU91dGxpbmVkXzEiLCJBcnJvd0Rvd25PdXRsaW5lZF8xIiwiQXJyb3dEb3duT3V0bGluZWQiLCJBcnJvd1VwT3V0bGluZWRfMSIsIkFycm93VXBPdXRsaW5lZCIsIkhlYWRlclRpdGxlIiwiZ2V0SGFzQmFja2dyb3VuZCIsIlNpbXBsZUxpc3QiLCJpc0NvbHVtbSIsIl9EaXZpZGVyIiwiRkJ1dHRvbiIsIl9BcnJvd1VwT3V0bGluZWQiLCJfQXJyb3dEb3duT3V0bGluZWQiLCJfUG9wY29uZmlybSIsIl9DbG9zZU91dGxpbmVkIiwiX0NvcHlPdXRsaW5lZCIsIl9QbHVzT3V0bGluZWQiLCJnZXRPcGVyYXRlRml4ZWQiLCJnZXRPcGVyYXRlU3R5bGUiLCJDYXJkTGlzdCIsIkluZm9DaXJjbGVPdXRsaW5lZF8xIiwiVGFibGVDZWxsIiwiZXJyb3JNc2ciLCJzZXRFcnJvck1zZyIsIm1vdXNlUmVmIiwiVGFibGVMaXN0IiwidmFsaWRhdGVQb3BvdmVyIiwiaXNsaWRhdGVQb3BvdmVyIiwibGlzdFZhbGlkYXRlUG9wb3ZlciIsIm90aGVyQWN0aW9uQ29sdW1uUHJvcHMiLCJpdGVtU2NoZW1hIiwicGFnaW5hdGlvbkNvbmZpZyIsIl9Ub29sdGlwIiwiX0luZm9DaXJjbGVPdXRsaW5lZCIsImZpZWxkU2NoZW1hIiwiX1RhYmxlIiwiRHJhd2VyRm9ybSIsImhhbmRsZUNsb3NlIiwiZHJhd2VyUHJvcHMiLCJfRHJhd2VyIiwiRlJlbmRlciIsImhpZGVFZGl0IiwiY29sdW1uU2NoZW1hIiwic2V0SXRlbURhdGEiLCJpbmRleFJlZiIsImhhbmRsZURyYXdlckNsb3NlIiwic2V0RmllbGRWYWx1ZSIsIl9jb2x1bW5TY2hlbWEkZGF0YUluZCIsIkZvcm1EcmF3ZXIiLCJWaXJ0dWFsQ2VsbCIsImVudW1lcmFibGVPbmx5Iiwic3ltYm9scyIsInN5bSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZXhjbHVkZWQiLCJzb3VyY2VTeW1ib2xLZXlzIiwic291cmNlS2V5cyIsIlNDUk9MTEVWVF9OVUxMIiwiU0NST0xMRVZUX0lOSVQiLCJTQ1JPTExFVlRfUkVDT01QVVRFIiwiU0NST0xMRVZUX05BVElWRSIsIlNDUk9MTEVWVF9CWV9IT09LIiwiVE9QX0NPTlRJTlVFIiwiVE9QX0RPTkUiLCJlX1ZUX1NUQVRFIiwiZGVmYXVsdF9jb250ZXh0IiwidnRfc3RhdGUiLCJJTklUIiwicG9zc2libGVfaGlnaHRfcGVyX3RyIiwiY29tcHV0ZWRfaCIsInJlX2NvbXB1dGVkIiwicm93X2hlaWdodCIsInJvd19jb3VudCIsInByZXZfcm93X2NvdW50IiwiX29mZnNldF90b3AiLCJfb2Zmc2V0X2hlYWQiLCJfb2Zmc2V0X3RhaWwiLCJXSCIsImV2dCIsImZpbmFsX3RvcCIsImZfZmluYWxfdG9wIiwidXBkYXRlX2NvdW50IiwiaW5kZXhNYXAiLCJITkRfUEFJTlQiLCJyZXRyeV9jb3VudCIsImxvZ19kZWJ1ZyIsIm1zZyIsInRpZCIsInRvTG9jYWxlVGltZVN0cmluZyIsImdldE1pbGxpc2Vjb25kcyIsIlRhYmxlSW1wbCIsIldyYXBwZXJJbXBsIiwiUm93SW1wbCIsInNjcm9sbF93aXRoX29mZnNldCIsIm92ZXJzY2FuUm93Q291bnQiLCJfc2Nyb2xsX3kiLCJfeSIsIndyYXBfaW5zdCIsInBhcmVudEVsZW1lbnQiLCJhc3NlcnQiLCJfdG9wIiwidG9yZW5kZXJfaCIsIm92ZXJzY2FuIiwic2V0X29mZnNldCIsInRhaWwiLCJzZXRfc2Nyb2xsIiwic2Nyb2xsX3RvIiwicmVwYWludGluZyIsImNxIiwiUlVOTklORyIsIm9uX3VwZGF0ZV93cmFwX3N0eWxlIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwic3JzX2V4cGFuZCIsInByZXZfbGVuIiwiZmlsbF92YWx1ZSIsInNsZW4iLCJzaGFkb3dfcm93cyIsInNyc19zaHJpbmsiLCJoMnNocmluayIsInNldF90cl9jbnQiLCJWVGFibGUiLCJmb3JjZSIsInJlZl9mdW5jIiwic2Nyb2xsX2hvb2siLCJpbml0VG9wIiwiZmxhZyIsInBmaXJzdCIsImNpcmNsZUJ1ZmZlclNpemUiLCJldmVudF9xdWV1ZSIsIlJBRl91cGRhdGVfc2VsZiIsInBlcmZvcm1hbmNlIiwiSE5EX1JBRiIsInRpbWUiLCJ0MSIsImV2cSIsImV0b3AiLCJlbGVmdCIsInByZXZfaGVhZCIsInByZXZfdGFpbCIsInByZXZfdG9wIiwiX3Njcm9sbFRvIiwic2Nyb2xsVG9JbmRleCIsInBhc3NpdmUiLCJfdW51c2VkIiwiTE9BREVEIiwidGFibGVTdHlsZSIsImludGVybmFsQ3R4IiwidGFibGUiLCJWV3JhcHBlciIsIm1lYXN1cmVSb3ciLCJ0cnMiLCJyb3dfaCIsIl9pZHgiLCJXcmFwcGVyIiwid3JhcHBlciIsIlZUUm93Iiwicm93X3Byb3BzIiwibGFzdF9pbmRleCIsImV4cGFuZGVkX2NscyIsInJvd0VsbSIsInNpYmxpbmciLCJuZXh0U2libGluZyIsIm1hdGNoZXMiLCJjdXJyX2giLCJsYXN0X2giLCJfc2V0X2NvbXBvbmVudHMiLCJfdnRjb21wb25lbnRzIiwiZm5PcHRzIiwiZGVwcyIsImN0eF92YWx1ZSIsImRlZmF1bHRfcmVmIiwiVlQiLCJfcHJvcHMkc2Nyb2xsWSIsInNjcm9sbFkiLCJfdXNlVlQiLCJ1c2VWVCIsIl91c2VWVDIiLCJ2dCIsIl9UYWJzIiwiVGFiTGlzdCIsInRhYk5hbWUiLCJfcHJvcHMkdGFiSXRlbVByb3BzIiwidGFiSXRlbVByb3BzIiwiZ2V0Q3VycmVudFRhYlBhbmVOYW1lIiwiaGFuZGxlRWRpdCIsImN1cnJlbnRLZXkiLCJyZW5kZXJDbG9zZSIsInVwZGF0ZVNjaGVtYUJ5UGF0aCIsInNldFN0b3JlRGF0YSIsImhhbmRsZVNjaGVtYVVwZGF0ZSIsImZsYXR0ZW4iLCJhc3NpZ25WYWx1ZSIsImRlc2NyaXB0b3JzIiwiZWFjaCIsImVuY29kZSIsIlVSTFNlYXJjaFBhcmFtcyIsIkZvcm1EYXRhIiwiaXNGb3JtRGF0YSIsImlzRmlsZUxpc3QiLCJBeGlvc0hlYWRlcnMiLCJpc1VSTFNhbWVPcmlnaW4iLCJhZGFwdGVycyIsInZlcnNpb24iLCJJbnRlcmNlcHRvck1hbmFnZXIiLCJBeGlvcyIsIkNhbmNlbFRva2VuIiwiSHR0cFN0YXR1c0NvZGUiLCJheGlvcyIsIkp1bXBCdXR0b24iLCJocmVmVXJsIiwibG9nIiwiaW5wdXQyIiwiQXBwIiwianVtcFBhZ2VIcmVmIiwic2V0SnVtcFBhZ2VIcmVmIiwiY2xpcGJvYXJkQ29udGVudCIsInNldENsaXBib2FyZENvbnRlbnQiLCJzaG93RHJhd2VyIiwiR01fc2V0VmFsdWUiLCJqdW1wUGFnZSIsIm9wZW5KdW1wSHJlZiIsImdldEJpbGliaWxpQ29udGVudCIsIkdNX2dldFZhbHVlIiwiYmlsaWJpbGlMaXN0IiwiYmlsaWJpbGlUaXRsZSIsImlubmVyVGV4dCIsImJpbGliaWxpVXBOYW1lIiwic2V0VmFsdWVzIiwiY3JlYXRlUm9vdCIsImFwcCIsImFwcGVuZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQSxNQUFJQSxNQUFJQyxrQkFBQUE7QUFDbUM7QUFDdkIsV0FBQSxhQUFHRCxJQUFFO0FBQ0osV0FBQSxjQUFHQSxJQUFFO0FBQUEsRUFDMUI7QUNOZSxXQUFTRSxhQUFXO0FBQ2pDQSxpQkFBVyxPQUFPLFNBQVMsT0FBTyxPQUFPLEtBQUksSUFBSyxTQUFVLFFBQVE7QUFDbEUsZUFBU0MsS0FBSSxHQUFHQSxLQUFJLFVBQVUsUUFBUUEsTUFBSztBQUN6QyxZQUFJLFNBQVMsVUFBVUE7QUFDdkIsaUJBQVNDLFFBQU8sUUFBUTtBQUN0QixjQUFJLE9BQU8sVUFBVSxl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YUFBYTtBQUFBLElBQ2IsZ0JBQWdCO0FBQUEsSUFDaEIsWUFBWTtBQUFBLElBQ1osWUFBWTtBQUFBLElBQ1osU0FBUztBQUFBLElBQ1QsWUFBWTtBQUFBLElBQ1osY0FBYztBQUFBLElBQ2QsZUFBZTtBQUFBLElBQ2YsZUFBZTtBQUFBLElBQ2YsZUFBZTtBQUFBLElBQ2YsZUFBZTtBQUFBLElBQ2YsWUFBWTtBQUFBLElBQ1osVUFBVTtBQUFBLElBQ1YsYUFBYTtBQUFBLElBQ2IsU0FBUztBQUFBLElBQ1QsU0FBUztBQUFBLElBQ1QsWUFBWTtBQUFBLElBQ1osV0FBVztBQUFBLElBQ1gsYUFBYTtBQUFBLElBQ2IsYUFBYTtBQUFBLElBQ2IsU0FBUztBQUFBLElBQ1QsV0FBVztBQUFBLElBQ1gsWUFBWTtBQUFBLElBQ1osV0FBVztBQUFBLElBQ1gsTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLElBQ04sT0FBTztBQUFBLElBQ1AsYUFBYTtBQUFBLElBQ2IsTUFBTTtBQUFBLElBQ04sVUFBVTtBQUFBLElBQ1YsU0FBUztBQUFBLElBQ1QsV0FBVztBQUFBLElBQ1gsUUFBUTtBQUFBLElBQ1IsT0FBTztBQUFBLElBQ1AsT0FBTztBQUFBLElBQ1AsZUFBZTtBQUFBLElBQ2YsVUFBVTtBQUFBLElBQ1YsV0FBVztBQUFBLElBQ1gsY0FBYztBQUFBLElBQ2QsV0FBVztBQUFBLElBQ1gsWUFBWTtBQUFBLElBQ1osV0FBVztBQUFBLElBQ1gsc0JBQXNCO0FBQUEsSUFDdEIsV0FBVztBQUFBLElBQ1gsWUFBWTtBQUFBLElBQ1osV0FBVztBQUFBLElBQ1gsV0FBVztBQUFBLElBQ1gsYUFBYTtBQUFBLElBQ2IsZUFBZTtBQUFBLElBQ2YsY0FBYztBQUFBLElBQ2QsZ0JBQWdCO0FBQUEsSUFDaEIsZ0JBQWdCO0FBQUEsSUFDaEIsZ0JBQWdCO0FBQUEsSUFDaEIsYUFBYTtBQUFBLElBQ2IsTUFBTTtBQUFBLElBQ04sV0FBVztBQUFBLElBQ1gsT0FBTztBQUFBLElBQ1AsU0FBUztBQUFBLElBQ1QsUUFBUTtBQUFBLElBQ1Isa0JBQWtCO0FBQUEsSUFDbEIsWUFBWTtBQUFBLElBQ1osY0FBYztBQUFBLElBQ2QsY0FBYztBQUFBLElBQ2QsZ0JBQWdCO0FBQUEsSUFDaEIsaUJBQWlCO0FBQUEsSUFDakIsbUJBQW1CO0FBQUEsSUFDbkIsaUJBQWlCO0FBQUEsSUFDakIsaUJBQWlCO0FBQUEsSUFDakIsY0FBYztBQUFBLElBQ2QsV0FBVztBQUFBLElBQ1gsV0FBVztBQUFBLElBQ1gsVUFBVTtBQUFBLElBQ1YsYUFBYTtBQUFBLElBQ2IsTUFBTTtBQUFBLElBQ04sU0FBUztBQUFBLElBQ1QsT0FBTztBQUFBLElBQ1AsV0FBVztBQUFBLElBQ1gsUUFBUTtBQUFBLElBQ1IsV0FBVztBQUFBLElBQ1gsUUFBUTtBQUFBLElBQ1IsZUFBZTtBQUFBLElBQ2YsV0FBVztBQUFBLElBQ1gsZUFBZTtBQUFBLElBQ2YsZUFBZTtBQUFBLElBQ2YsWUFBWTtBQUFBLElBQ1osV0FBVztBQUFBLElBQ1gsTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLElBQ04sWUFBWTtBQUFBLElBQ1osUUFBUTtBQUFBLElBQ1IsZUFBZTtBQUFBLElBQ2YsS0FBSztBQUFBLElBQ0wsV0FBVztBQUFBLElBQ1gsV0FBVztBQUFBLElBQ1gsYUFBYTtBQUFBLElBQ2IsUUFBUTtBQUFBLElBQ1IsWUFBWTtBQUFBLElBQ1osVUFBVTtBQUFBLElBQ1YsVUFBVTtBQUFBLElBQ1YsUUFBUTtBQUFBLElBQ1IsUUFBUTtBQUFBLElBQ1IsU0FBUztBQUFBLElBQ1QsV0FBVztBQUFBLElBQ1gsV0FBVztBQUFBLElBQ1gsV0FBVztBQUFBLElBQ1gsTUFBTTtBQUFBLElBQ04sYUFBYTtBQUFBLElBQ2IsV0FBVztBQUFBLElBQ1gsS0FBSztBQUFBLElBQ0wsTUFBTTtBQUFBLElBQ04sU0FBUztBQUFBLElBQ1QsUUFBUTtBQUFBLElBQ1IsV0FBVztBQUFBLElBQ1gsUUFBUTtBQUFBLElBQ1IsT0FBTztBQUFBLElBQ1AsT0FBTztBQUFBLElBQ1AsWUFBWTtBQUFBLElB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RztBQUFBLElBSUgsR0FBRztBQUFBLElBSUgsR0FBRztBQUFBLElBSUgsR0FBRztBQUFBLElBSUgsR0FBRztBQUFBLElBSUgsR0FBRztBQUFBLElBSUgsR0FBRztBQUFBLElBSUgsR0FBRztBQUFBLElBSUgsR0FBRztBQUFBLElBSUgsR0FBRztBQUFBLElBSUgsR0FBRztBQUFBLElBSUgsR0FBRztBQUFBLElBSUgsR0FBRztBQUFBLElBSUgsR0FBRztBQUFBLElBSUgsR0FBRztBQUFBLElBSUgsR0FBRztBQUFBLElBSUgsR0FBRztBQUFBLElBSUgsR0FBRztBQUFBLElBSUgsR0FBRztBQUFBLElBSUgsR0FBRztBQUFBLElBSUgsTUFBTTtBQUFBLElBS04sZUFBZTtBQUFBLElBSWYsY0FBYztBQUFBLElBSWQsVUFBVTtBQUFBLElBSVYsU0FBUztBQUFBLElBSVQsU0FBUztBQUFBLElBSVQsV0FBVztBQUFBLElBSVgsVUFBVTtBQUFBLElBSVYsVUFBVTtBQUFBLElBSVYsU0FBUztBQUFBLElBSVQsV0FBVztBQUFBLElBSVgsV0FBVztBQUFBLElBSVgsVUFBVTtBQUFBLElBSVYsY0FBYztBQUFBLElBSWQsVUFBVTtBQUFBLElBSVYsV0FBVztBQUFBLElBSVgsWUFBWTtBQUFBLElBSVosY0FBYztBQUFBLElBSWQsSUFBSTtBQUFBLElBSUosSUFBSTtBQUFBLElBSUosSUFBSTtBQUFBLElBSUosSUFBSTtBQUFBLElBSUosSUFBSTtBQUFBLElBSUosSUFBSTtBQUFBLElBSUosSUFBSTtBQUFBLElBSUosSUFBSTtBQUFBLElBSUosSUFBSTtBQUFBLElBSUosS0FBSztBQUFBLElBSUwsS0FBSztBQUFBLElBSUwsS0FBSztBQUFBLElBSUwsU0FBUztBQUFBLElBSVQsV0FBVztBQUFBLElBS1gsTUFBTTtBQUFBLElBS04sUUFBUTtBQUFBLElBS1IsT0FBTztBQUFBLElBS1AsUUFBUTtBQUFBLElBS1IsT0FBTztBQUFBLElBS1AsWUFBWTtBQUFBLElBS1osY0FBYztBQUFBLElBS2QscUJBQXFCO0FBQUEsSUFLckIs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YUFBYSxDQUFDLElBQUksS0FBSyxHQUFHO0FBQUEsSUFDMUIsZUFBZSxDQUFDLEtBQUssSUFBSSxFQUFFO0FBQUEsSUFDM0IsVUFBVSxDQUFDLEtBQUssS0FBSyxHQUFHO0FBQUEsSUFDeEIsY0FBYyxDQUFDLEtBQUssS0FBSyxFQUFFO0FBQUEsSUFDM0IsWUFBWSxDQUFDLElBQUksS0FBSyxFQUFFO0FBQUEsSUFDeEIsWUFBWSxDQUFDLEtBQUssS0FBSyxHQUFHO0FBQUEsSUFDMUIsVUFBVSxDQUFDLEtBQUssSUFBSSxFQUFFO0FBQUEsSUFDdEIsVUFBVSxDQUFDLEtBQUssS0FBSyxHQUFHO0FBQUEsSUFDeEIsV0FBVyxDQUFDLEtBQUssS0FBSyxHQUFHO0FBQUEsSUFDekIsYUFBYSxDQUFDLEtBQUssSUFBSSxHQUFHO0FBQUEsSUFDMUIsYUFBYSxDQUFDLEtBQUssS0FBSyxHQUFHO0FBQUEsSUFDM0IsYUFBYSxDQUFDLEtBQUssS0FBSyxHQUFHO0FBQUEsSUFDM0IsUUFBUSxDQUFDLEtBQUssS0FBSyxHQUFHO0FBQUEsSUFDdEIsZUFBZSxDQUFDLEdBQUcsS0FBSyxHQUFHO0FBQUEsSUFDM0IsYUFBYSxDQUFDLElBQUksS0FBSyxHQUFHO0FBQUEsSUFDMUIsT0FBTyxDQUFDLEtBQUssS0FBSyxHQUFHO0FBQUEsSUFDckIsUUFBUSxDQUFDLEdBQUcsS0FBSyxHQUFHO0FBQUEsSUFDcEIsV0FBVyxDQUFDLEtBQUssS0FBSyxHQUFHO0FBQUEsSUFDekIsVUFBVSxDQUFDLEtBQUssSUFBSSxFQUFFO0FBQUEsSUFDdEIsYUFBYSxDQUFDLElBQUksS0FBSyxHQUFHO0FBQUEsSUFDMUIsVUFBVSxDQUFDLEtBQUssS0FBSyxHQUFHO0FBQUEsSUFDeEIsU0FBUyxDQUFDLEtBQUssS0FBSyxHQUFHO0FBQUEsSUFDdkIsU0FBUyxDQUFDLEtBQUssS0FBSyxHQUFHO0FBQUEsSUFDdkIsY0FBYyxDQUFDLEtBQUssS0FBSyxHQUFHO0FBQUEsSUFDNUIsVUFBVSxDQUFDLEtBQUssS0FBSyxDQUFDO0FBQUEsSUFDdEIs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O0FBS0UsVUFBSXhKLFNBQVF3SixXQUFVLFFBQVE7QUFBQSxRQUM1QixXQUFXO0FBQUEsUUFDWCxjQUFjO0FBQUEsUUFDZCxNQUFNO0FBQUEsUUFDTixZQUFZO0FBQUEsUUFDWixPQUFPO0FBQUEsUUFDUCxPQUFPO0FBQUEsUUFDUCxRQUFRO0FBQUEsUUFDUixPQUFPO0FBQUEsUUFDUCxnQkFBZ0I7QUFBQSxRQUNoQixNQUFNO0FBQUEsUUFDTixZQUFZO0FBQUEsUUFDWixPQUFPO0FBQUEsUUFDUCxXQUFXO0FBQUEsUUFDWCxhQUFhO0FBQUEsUUFDYixXQUFXO0FBQUEsUUFDWCxZQUFZO0FBQUEsUUFDWixXQUFXO0FBQUEsUUFDWCxPQUFPO0FBQUEsUUFDUCxnQkFBZ0I7QUFBQSxRQUNoQixVQUFVO0FBQUEsUUFDVixTQUFTO0FBQUEsUUFDVCxNQUFNO0FBQUEsUUFDTixVQUFVO0FBQUEsUUFDVixVQUFVO0FBQUEsUUFDVixlQUFlO0FBQUEsUUFDZixVQUFVO0FBQUEsUUFDVixXQUFXO0FBQUEsUUFDWCxVQUFVO0FBQUEsUUFDVixXQUFXO0FBQUEsUUFDWCxhQUFhO0FBQUEsUUFDYixnQkFBZ0I7QUFBQSxRQUNoQixZQUFZO0FBQUEsUUFDWixZQUFZO0FBQUEsUUFDWixTQUFTO0FBQUEsUUFDVCxZQUFZO0FBQUEsUUFDWixjQUFjO0FBQUEsUUFDZCxlQUFlO0FBQUEsUUFDZixlQUFlO0FBQUEsUUFDZixlQUFlO0FBQUEsUUFDZixlQUFlO0FBQUEsUUFDZixZQUFZO0FBQUEsUUFDWixVQUFVO0FBQUEsUUFDVixhQUFhO0FBQUEsUUFDYixTQUFTO0FBQUEsUUFDVCxTQUFTO0FBQUEsUUFDVCxZQUFZO0FBQUEsUUFDWixXQUFXO0FBQUEsUUFDWCxhQUFhO0FBQUEsUUFDYixhQUFhO0FBQUEsUUFDYixTQUFTO0FBQUEsUUFDVCxXQUFXO0FBQUEsUUFDWCxZQUFZO0FBQUEsUUFDWixNQUFNO0FBQUEsUUFDTixXQUFXO0FBQUEsUUFDWCxNQUFNO0FBQUEsUUFDTixPQUFPO0FBQUEsUUFDUCxhQUFhO0FBQUEsUUFDYixNQUFNO0FBQUEsUUFDTixVQUFVO0FBQUEsUUFDVixTQUFTO0FBQUEsUUFDVCxXQUFXO0FBQUEsUUFDWCxRQUFRO0FBQUEsUUFDUixPQUFPO0FBQUEsUUFDUCxPQUFPO0FBQUEsUUFDUCxVQUFVO0FBQUEsUUFDVixlQUFlO0FBQUEsUUFDZixXQUFXO0FBQUEsUUFDWCxjQUFjO0FBQUEsUUFDZCxXQUFXO0FBQUEsUUFDWCxZQUFZO0FBQUEsUUFDWixXQUFXO0FBQUEsUUFDWCxzQkFBc0I7QUFBQSxRQUN0QixXQUFXO0FBQUEsUUFDWCxZQUFZO0FBQUEsUUFDWixXQUFXO0FBQUEsUUFDWCxXQUFXO0FBQUEsUUFDWCxhQUFhO0FBQUEsUUFDYixlQUFlO0FBQUEsUUFDZixjQUFjO0FBQUEsUUFDZCxnQkFBZ0I7QUFBQSxRQUNoQixnQkFBZ0I7QUFBQSxRQUNoQixnQkFBZ0I7QUFBQSxRQUNoQixhQUFhO0FBQUEsUUFDYixNQUFNO0FBQUEsUUFDTixXQUFXO0FBQUEsUUFDWCxPQUFPO0FBQUEsUUFDUCxTQUFTO0FBQUEsUUFDVCxRQUFRO0FBQUEsUUFDUixrQkFBa0I7QUFBQSxRQUNsQixZQUFZO0FBQUEsUUFDWixjQUFjO0FBQUEsUUFDZCxjQUFjO0FBQUEsUUFDZCxnQkFBZ0I7QUFBQSxRQUNoQixpQkFBaUI7QUFBQSxRQUNqQixtQkFBbUI7QUFBQSxRQUNuQixpQkFBaUI7QUFBQSxRQUNqQixpQkFBaUI7QUFBQSxRQUNqQixjQUFjO0FBQUEsUUFDZCxXQUFXO0FBQUEsUUFDWCxXQUFXO0FBQUEsUUFDWCxVQUFVO0FBQUEsUUFDVixhQUFhO0FBQUEsUUFDYixNQUFNO0FBQUEsUUFDTixTQUFTO0FBQUEsUUFDVCxPQUFPO0FBQUEsUUFDUCxXQUFXO0FBQUEsUUFDWCxRQUFRO0FBQUEsUUFDUixXQUFXO0FBQUEsUUFDWCxRQUFRO0FBQUEsUUFDUixlQUFlO0FBQUEsUUFDZixXQUFXO0FBQUEsUUFDWCxlQUFlO0FBQUEsUUFDZixlQUFlO0FBQUEsUUFDZixZQUFZO0FBQUEsUUFDWixXQUFXO0FBQUEs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QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxFQUNWOzs7QUM5RkEsTUFBSThvSSxrQkFBa0IsU0FBU0EsbUJBQWtC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