| 1
2 | 20x
| module.exports=function(e){function t(n){Iif(r[n])return r[n].exports;var o=r[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var r={};return t.m=e,t.c=r,t.i=function(e){return e},t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=7)}([function(e,t){e.exports=require("boundless-dialog")},function(e,t){e.exports=require("boundless-portal")},function(e,t){e.exports=require("boundless-utils-omit-keys")},function(e,t){e.exports=require("boundless-utils-transform-property")},function(e,t){e.exports=require("classnames")},function(e,t){e.exports=require("react")},function(e,t){e.exports=require("react-dom")},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){Iif("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function i(e){switch(e[0]){case"N":return"S";case"S":return"N";case"E":return"W"}return"E"}function c(e,t){return e.filter(function(e){return t.indexOf(e)===-1})}Object.defineProperty(t,"__esModule",{value:!0});var s=r(5),p=r.n(s),h=r(6),l=(r.n(h),r(4)),u=r.n(l),d=r(0),f=r.n(d),y=r(1),g=r.n(y),m=r(2),x=r.n(m),v=r(3),w=r.n(v),b=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},R=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),P=/\s?b-popover-(anchor|self)-(start|middle|end)/g,N=p.a.createElement("svg",{viewBox:"0 0 14 9.5",xmlns:"http://www.w3.org/2000/svg"},p.a.createElement("g",null,p.a.createElement("polygon",{className:"b-popover-caret-border",fill:"#000",points:"7 0 14 10 0 10"}),p.a.createElement("polygon",{className:"b-popover-caret-fill",fill:"#FFF",points:"6.98230444 1.75 12.75 10 1.25 10"}))),E=0,O=1,W=2,T=[{name:"NNW",ax:E,ay:E,dx:E,dy:W},{name:"N",ax:O,ay:E,dx:O,dy:W},{name:"NNE",ax:W,ay:E,dx:W,dy:W},{name:"ENE",ax:W,ay:E,dx:E,dy:E},{name:"E",ax:W,ay:O,dx:E,dy:O},{name:"ESE",ax:W,ay:W,dx:E,dy:W},{name:"SSE",ax:W,ay:W,dx:W,dy:E},{name:"S",ax:O,ay:W,dx:O,dy:E},{name:"SSW",ax:E,ay:W,dx:E,dy:E},{name:"WSW",ax:E,ay:W,dx:W,dy:W},{name:"W",ax:E,ay:O,dx:W,dy:O},{name:"WNW",ax:E,ay:E,dx:W,dy:E}],S=function(e){function t(){var e,a,i,c;n(this,t);for(var s=arguments.length,p=Array(s),l=0;l<s;l++)p[l]=arguments[l];return a=i=o(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(p))),i.align=function(){var e=i.props.anchor instanceof HTMLElement?i.props.anchor:r.i(h.findDOMNode)(i.props.anchor),n=i.props.caretAnchor?i.props.caretAnchor instanceof HTMLElement?i.props.caretAnchor:r.i(h.findDOMNode)(i.props.caretAnchor):e;i.cacheViewportCartography(e,n);var o=i.getValidAlignmentPreset(),a=t.getAlignmentClassFragment;i.dialog.$wrapper.className=i.dialog.$wrapper.className.replace(P,"")+(" b-popover-anchor-x-"+a(o.ax))+(" b-popover-anchor-y-"+a(o.ay))+(" b-popover-self-x-"+a(o.dx))+(" b-popover-self-y-"+a(o.dy));var c=Math.round(i.getNextDialogXPosition(o)),s=Math.round(i.getNextDialogYPosition(o));i.dialog.$wrapper.style[w.a]="translate("+c+"px, "+s+"px)";var p=o.name[0],l="N"===p||"S"===p;i.$caret.style[l?"left":"top"]=Math.round(i.getNextCaretXPosition(o))+"px",i.$caret.style[l?"top":"left"]="0px"},c=a,o(i,c)}return a(t,e),R(t,[{key:"cacheViewportCartography",value:function(e,t){var r=document.body.getBoundingClientRect();this.anchorRect=e.getBoundingClientRect(),this.caretAnchorRect=t.getBoundingClientRect(),this.bodyLeft=r.left*-1,this.bodyTop=r.top*-1}},{key:"getNextCaretXPosition",value:function(e){var t=e.name,r=(e.ax,e.dx),n=(e.ay,e.dy),o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.$caret,a=0;return"N"===t[0]||"S"===t[0]?(a=this.caretAnchorRect.left-this.anchorRect.left+this.caretAnchorRect.width/2,r===O?a+=(this.dialog.$wrapper.clientWidth-this.anchorRect.width)/2:r===W&&(a+=this.dialog.$wrapper.clientWidth-this.anchorRect.width)):(a=this.caretAnchorRect.top-this.anchorRect.top+this.caretAnchorRect.height/2,n===O?a+=(this.dialog.$wrapper.clientHeight-this.anchorRect.height)/2:n===W&&(a+=this.dialog.$wrapper.clientHeight-this.anchorRect.height)),a-=o.clientWidth/2}},{key:"getNextDialogXPosition",value:function(e){var t=e.ax,r=e.dx,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.dialog.$wrapper,o=this.anchorRect.left+this.bodyLeft;switch(t){case O:o+=this.anchorRect.width/2;break;case W:o+=this.anchorRect.width}switch(r){case O:o-=n.clientWidth/2;break;case W:o-=n.clientWidth}return o}},{key:"getNextDialogYPosition",value:function(e){var t=e.ay,r=e.dy,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.dialog.$wrapper,o=this.anchorRect.top+this.bodyTop;switch(t){case O:o+=this.anchorRect.height/2;break;case W:o+=this.anchorRect.height}switch(r){case O:o-=n.clientHeight/2;break;case W:o-=n.clientHeight}return o}},{key:"isPositionValid",value:function(e,t,r){var n=e.name,o=e.ax,a=e.ay,i=(e.dx,e.dy,n[0]);return"N"===i||"S"===i?!("N"===i&&this.anchorRect.top-t<0)&&(!("S"===i&&this.anchorRect.bottom+t>window.innerHeight)&&(o===E?!(this.anchorRect.left+r>window.innerWidth||this.anchorRect.left<0):o===O?!(this.anchorRect.left-r/2<0||this.anchorRect.left+r/2>window.innerWidth):!(this.anchorRect.left-r<0||this.anchorRect.right>window.innerWidth))):"W"!==i&&"E"!==i||!("W"===i&&this.anchorRect.left-r<0)&&(!("E"===i&&this.anchorRect.right+r>window.innerWidth)&&(a===E?!(this.anchorRect.top+t>window.innerHeight||this.anchorRect.top<0):a===O?!(this.anchorRect.top+this.anchorRect.height/2-t/2<0||this.anchorRect.top+this.anchorRect.height/2+t/2>window.innerHeight):!(this.anchorRect.top-t<0||this.anchorRect.bottom>window.innerHeight)))}},{key:"getValidAlignmentPreset",value:function(){var e=this,t=this.dialog.$wrapper.clientWidth,r=this.dialog.$wrapper.clientHeight,n=T.filter(function(n){return e.isPositionValid(n,r,t)});if(n.indexOf(this.props.preset)!==-1||!this.props.autoReposition||!n.length)return this.props.preset;var o=n.filter(function(t){var r=t.name;return r[0]===e.props.preset.name[0]});if(o.length)return o[0];var a=i(this.props.preset.name),c=n.filter(function(e){var t=e.name;return t[0]===a});return c.length?c[0]:n[0]}},{key:"componentDidMount",value:function(){this.align(),window.addEventListener("resize",this.align,!0)}},{key:"componentDidUpdate",value:function(){this.align()}},{key:"componentWillUnmount",value:function(){window.removeEventListener("resize",this.align,!0)}},{key:"render",value:function(){var e=this,r=this.props;return p.a.createElement(g.a,r.portalProps,p.a.createElement(f.a,b({},x()(r,t.internalKeys),{ref:function(t){return e.dialog=t},before:p.a.cloneElement(r.caretComponent,{ref:function(t){return e.$caret=t},className:u()("b-popover-caret",r.caretComponent.props.className)}),className:u()("b-popover",r.className)})))}}],[{key:"getAlignmentClassFragment",value:function(e){switch(e){case E:return"start";case O:return"middle";case W:return"end"}}}]),t}(p.a.PureComponent);S.preset=T.reduce(function(e,t){return e[t.name]=t,e},{}),S.propTypes=b({},f.a.propTypes,{anchor:s.PropTypes.oneOfType([s.PropTypes.instanceOf(HTMLElement),s.PropTypes.shape({props:s.PropTypes.object})]).isRequired,autoReposition:s.PropTypes.bool,caretAnchor:s.PropTypes.oneOfType([s.PropTypes.instanceOf(HTMLElement),s.PropTypes.shape({props:s.PropTypes.object})]),caretComponent:s.PropTypes.element,portalProps:s.PropTypes.shape(g.a.PropTypes),preset:s.PropTypes.oneOf([S.preset.NNW,S.preset.N,S.preset.NNE,S.preset.ENE,S.preset.E,S.preset.ESE,S.preset.SSE,S.preset.S,S.preset.SSW,S.preset.WSW,S.preset.W,S.preset.WNW])}),S.defaultProps=b({},f.a.defaultProps,{anchor:void 0,autoReposition:!0,captureFocus:!1,caretAnchor:void 0,caretComponent:N,closeOnEscKey:!0,closeOnOutsideClick:!0,closeOnOutsideScroll:!0,portalProps:{},preset:S.preset.S}),S.internalKeys=c(Object.keys(S.defaultProps),f.a.internalKeys),t.default=S}]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIDQzN2Y4NDBlNjYwYzAzMjk1ODI4Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy1kaWFsb2dcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXBvcnRhbFwifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy10cmFuc2Zvcm0tcHJvcGVydHlcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiY2xhc3NuYW1lc1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdFwifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdC1kb21cIn0iLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvYm91bmRsZXNzLXBvcG92ZXIvaW5kZXguanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJ2YWx1ZSIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwicmVxdWlyZSIsIl9fd2VicGFja19leHBvcnRzX18iLCJfY2xhc3NDYWxsQ2hlY2siLCJpbnN0YW5jZSIsIkNvbnN0cnVjdG9yIiwiVHlwZUVycm9yIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJzZWxmIiwiUmVmZXJlbmNlRXJyb3IiLCJfaW5oZXJpdHMiLCJzdWJDbGFzcyIsInN1cGVyQ2xhc3MiLCJjcmVhdGUiLCJjb25zdHJ1Y3RvciIsIndyaXRhYmxlIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJnZXRPcHBvc2l0ZUNhcmRpbmFsIiwiZGlyZWN0aW9uIiwid2l0aG91dCIsImFycjEiLCJhcnIyIiwiZmlsdGVyIiwiaXRlbSIsImluZGV4T2YiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfcmVhY3RfZG9tX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfY2xhc3NuYW1lc19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2NsYXNzbmFtZXNfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc19kaWFsb2dfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfZGlhbG9nX19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfcG9ydGFsX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfYm91bmRsZXNzX3BvcnRhbF9fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X2JvdW5kbGVzc191dGlsc190cmFuc2Zvcm1fcHJvcGVydHlfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9ib3VuZGxlc3NfdXRpbHNfdHJhbnNmb3JtX3Byb3BlcnR5X19fZGVmYXVsdCIsIl9leHRlbmRzIiwiYXNzaWduIiwidGFyZ2V0IiwiYXJndW1lbnRzIiwibGVuZ3RoIiwic291cmNlIiwia2V5IiwiX2NyZWF0ZUNsYXNzIiwiZGVmaW5lUHJvcGVydGllcyIsInByb3BzIiwiZGVzY3JpcHRvciIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsIkNMQVNTX1JFTU9WQUxfUkVHRVgiLCJERUZBVUxUX0NBUkVUX0NPTVBPTkVOVCIsImEiLCJjcmVhdGVFbGVtZW50Iiwidmlld0JveCIsInhtbG5zIiwiY2xhc3NOYW1lIiwiZmlsbCIsInBvaW50cyIsIlNUQVJUIiwiTUlERExFIiwiRU5EIiwiY29tYmluYXRpb25zIiwiYXgiLCJheSIsImR4IiwiZHkiLCJQb3BvdmVyIiwiX1JlYWN0JFB1cmVDb21wb25lbnQiLCJfcmVmIiwiX3RlbXAiLCJfdGhpcyIsIl9yZXQiLCJ0aGlzIiwiX2xlbiIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJnZXRQcm90b3R5cGVPZiIsImFwcGx5IiwiY29uY2F0IiwiYWxpZ24iLCJhbmNob3IiLCJIVE1MRWxlbWVudCIsImNhcmV0QW5jaG9yIiwiY2FjaGVWaWV3cG9ydENhcnRvZ3JhcGh5IiwicHJlc2V0IiwiZ2V0VmFsaWRBbGlnbm1lbnRQcmVzZXQiLCJmcmFnIiwiZ2V0QWxpZ25tZW50Q2xhc3NGcmFnbWVudCIsImRpYWxvZyIsIiR3cmFwcGVyIiwicmVwbGFjZSIsIk1hdGgiLCJyb3VuZCIsImdldE5leHREaWFsb2dYUG9zaXRpb24iLCJnZXROZXh0RGlhbG9nWVBvc2l0aW9uIiwic3R5bGUiLCJjYXJkaW5hbCIsImxvbmdpdHVkaW5hbCIsIiRjYXJldCIsImdldE5leHRDYXJldFhQb3NpdGlvbiIsImJvZHlSZWN0IiwiZG9jdW1lbnQiLCJib2R5IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiYW5jaG9yUmVjdCIsImNhcmV0QW5jaG9yUmVjdCIsImJvZHlMZWZ0IiwibGVmdCIsImJvZHlUb3AiLCJ0b3AiLCJfcmVmMiIsImNhcmV0IiwidW5kZWZpbmVkIiwibmV4dFgiLCJ3aWR0aCIsImNsaWVudFdpZHRoIiwiaGVpZ2h0IiwiY2xpZW50SGVpZ2h0IiwiX3JlZjMiLCJfcmVmNCIsIm5leHRZIiwiX3JlZjUiLCJwSGVpZ2h0IiwicFdpZHRoIiwiYm90dG9tIiwid2luZG93IiwiaW5uZXJIZWlnaHQiLCJpbm5lcldpZHRoIiwicmlnaHQiLCJfdGhpczIiLCJ2YWxpZENvbWJvcyIsImNvbmZpZyIsImlzUG9zaXRpb25WYWxpZCIsImF1dG9SZXBvc2l0aW9uIiwiYmVzdENvbWJvcyIsIl9yZWY2Iiwib3Bwb3NpdGVDYXJkaW5hbCIsIm9rYXlDb21ib3MiLCJfcmVmNyIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiX3RoaXMzIiwicG9ydGFsUHJvcHMiLCJpbnRlcm5hbEtleXMiLCJyZWYiLCJiZWZvcmUiLCJjbG9uZUVsZW1lbnQiLCJjYXJldENvbXBvbmVudCIsIm5vZGUiLCJjb25zdGFudCIsIlB1cmVDb21wb25lbnQiLCJyZWR1Y2UiLCJtYXAiLCJkZWYiLCJwcm9wVHlwZXMiLCJvbmVPZlR5cGUiLCJpbnN0YW5jZU9mIiwic2hhcGUiLCJpc1JlcXVpcmVkIiwiYm9vbCIsImVsZW1lbnQiLCJQcm9wVHlwZXMiLCJvbmVPZiIsIk5OVyIsIk4iLCJOTkUiLCJFTkUiLCJFIiwiRVNFIiwiU1NFIiwiUyIsIlNTVyIsIldTVyIsIlciLCJXTlciLCJkZWZhdWx0UHJvcHMiLCJjYXB0dXJlRm9jdXMiLCJjbG9zZU9uRXNjS2V5IiwiY2xvc2VPbk91dHNpZGVDbGljayIsImNsb3NlT25PdXRzaWRlU2Nyb2xsIiwia2V5cyJdLCJtYXBwaW5ncyI6IkFBQUFBLE9BQU9DLFFBQ0UsU0FBVUMsR0NHbkIsUUFBQUMsR0FBQUMsR0FHQSxHQUFBQyxFQUFBRCxHQUNBLE1BQUFDLEdBQUFELEdBQUFILE9BR0EsSUFBQUQsR0FB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QUFBLFVBQVV1SSxPQUNOakgsTUFBT3RCLEVBQUEsVUFBVS9CLFdBRXRCdUssV0FLSHpCLGVBQWdCL0csRUFBQSxVQUFVeUksS0FPMUI3RSxZQUFhNUQsRUFBQSxVQUFVcUksV0FDbkJySSxFQUFBLFVBQVVzSSxXQUFXM0UsYUFDckIzRCxFQUFBLFVBQVV1SSxPQUNOakgsTUFBT3RCLEVBQUEsVUFBVS9CLFdBT3pCNEosZUFBZ0I3SCxFQUFBLFVBQVUwSSxRQUUxQmxCLFlBQWF4SCxFQUFBLFVBQVV1SSxNQUFNL0gsRUFBQW9CLEVBQU8rRyxXQVdwQzdFLE9BQVE5RCxFQUFBLFVBQVU0SSxPQUNkakcsRUFBUW1CLE9BQU8rRSxJQUNmbEcsRUFBUW1CLE9BQU9nRixFQUNmbkcsRUFBUW1CLE9BQU9pRixJQUNmcEcsRUFBUW1CLE9BQU9rRixJQUNmckcsRUFBUW1CLE9BQU9tRixFQUNmdEcsRUFBUW1CLE9BQU9vRixJQUNmdkcsRUFBUW1CLE9BQU9xRixJQUNmeEcsRUFBUW1CLE9BQU9zRixFQUNmekcsRUFBUW1CLE9BQU91RixJQUNmMUcsRUFBUW1CLE9BQU93RixJQUNmM0csRUFBUW1CLE9BQU95RixFQUNmNUcsRUFBUW1CLE9BQU8wRixRQTlETjdHLEVBa0VWOEcsYVRoQm93VzVJLEtTaUJwd1dQLEVBQUFzQixFQUFPNkgsY0FDVi9GLE9BQVFnQyxPQUNScUIsZ0JBQWdCLEVBQ2hCMkMsY0FBYyxFQUNkOUYsWUFBYThCLE9BQ2JtQyxlQUFnQmxHLEVBQ2hCZ0ksZUFBZSxFQUNmQyxxQkFBcUIsRUFDckJDLHNCQUFzQixFQUN0QnJDLGVBQ0ExRCxPQUFRbkIsRUFBUW1CLE9BQU9zRixJQTdFVnpHLEVBZ0ZWOEUsYUFBZS9ILEVBQVFoQyxPQUFPb00sS0FBS25ILEVBQVE4RyxjQUFlbkosRUFBQXNCLEVBQU82RixjVDlCNnBYakosRUFBNkIsUVNsRGp2WG1FIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPVxuLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbi8qKioqKiovIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuLyoqKioqKi8gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuLyoqKioqKi8gXHRcdFx0XHRnZXQ6IGdldHRlclxuLyoqKioqKi8gXHRcdFx0fSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4vKioqKioqLyBcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDcpO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtZGlhbG9nXCIpO1xuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXBvcnRhbFwiKTtcblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIik7XG5cbi8qKiovIH0pLFxuLyogMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtdXRpbHMtdHJhbnNmb3JtLXByb3BlcnR5XCIpO1xuXG4vKioqLyB9KSxcbi8qIDQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2xhc3NuYW1lc1wiKTtcblxuLyoqKi8gfSksXG4vKiA1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG4vKioqLyB9KSxcbi8qIDYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3QtZG9tXCIpO1xuXG4vKioqLyB9KSxcbi8qIDcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9kb21fXyA9IF9fd2VicGFja19yZXF1aXJlX18oNik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX3JlYWN0X2RvbV9fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX3JlYWN0X2RvbV9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfY2xhc3NuYW1lc19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfY2xhc3NuYW1lc19fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2NsYXNzbmFtZXNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc19kaWFsb2dfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc19kaWFsb2dfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfZGlhbG9nX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfcG9ydGFsX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfcG9ydGFsX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfYm91bmRsZXNzX3BvcnRhbF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X2JvdW5kbGVzc191dGlsc190cmFuc2Zvcm1fcHJvcGVydHlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X2JvdW5kbGVzc191dGlsc190cmFuc2Zvcm1fcHJvcGVydHlfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9ib3VuZGxlc3NfdXRpbHNfdHJhbnNmb3JtX3Byb3BlcnR5X18pO1xudmFyIF9leHRlbmRzPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHRhcmdldCl7Zm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIHNvdXJjZT1hcmd1bWVudHNbaV07Zm9yKHZhciBrZXkgaW4gc291cmNlKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLGtleSkpe3RhcmdldFtrZXldPXNvdXJjZVtrZXldO319fXJldHVybiB0YXJnZXQ7fTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQscHJvcHMpe2Zvcih2YXIgaT0wO2k8cHJvcHMubGVuZ3RoO2krKyl7dmFyIGRlc2NyaXB0b3I9cHJvcHNbaV07ZGVzY3JpcHRvci5lbnVtZXJhYmxlPWRlc2NyaXB0b3IuZW51bWVyYWJsZXx8ZmFsc2U7ZGVzY3JpcHRvci5jb25maWd1cmFibGU9dHJ1ZTtpZihcInZhbHVlXCJpbiBkZXNjcmlwdG9yKWRlc2NyaXB0b3Iud3JpdGFibGU9dHJ1ZTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LGRlc2NyaXB0b3Iua2V5LGRlc2NyaXB0b3IpO319cmV0dXJuIGZ1bmN0aW9uKENvbnN0cnVjdG9yLHByb3RvUHJvcHMsc3RhdGljUHJvcHMpe2lmKHByb3RvUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUscHJvdG9Qcm9wcyk7aWYoc3RhdGljUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3RvcixzdGF0aWNQcm9wcyk7cmV0dXJuIENvbnN0cnVjdG9yO307fSgpO2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSxDb25zdHJ1Y3Rvcil7aWYoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTt9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsY2FsbCl7aWYoIXNlbGYpe3Rocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTt9cmV0dXJuIGNhbGwmJih0eXBlb2YgY2FsbD09PVwib2JqZWN0XCJ8fHR5cGVvZiBjYWxsPT09XCJmdW5jdGlvblwiKT9jYWxsOnNlbGY7fWZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcyxzdXBlckNsYXNzKXtpZih0eXBlb2Ygc3VwZXJDbGFzcyE9PVwiZnVuY3Rpb25cIiYmc3VwZXJDbGFzcyE9PW51bGwpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiK3R5cGVvZiBzdXBlckNsYXNzKTt9c3ViQ2xhc3MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyYmc3VwZXJDbGFzcy5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpzdWJDbGFzcyxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9fSk7aWYoc3VwZXJDbGFzcylPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLHN1cGVyQ2xhc3MpOnN1YkNsYXNzLl9fcHJvdG9fXz1zdXBlckNsYXNzO31mdW5jdGlvbiBnZXRPcHBvc2l0ZUNhcmRpbmFsKGRpcmVjdGlvbil7c3dpdGNoKGRpcmVjdGlvblswXSl7Y2FzZSdOJzpyZXR1cm4nUyc7Y2FzZSdTJzpyZXR1cm4nTic7Y2FzZSdFJzpyZXR1cm4nVyc7fXJldHVybidFJzt9ZnVuY3Rpb24gd2l0aG91dChhcnIxLGFycjIpe3JldHVybiBhcnIxLmZpbHRlcihmdW5jdGlvbihpdGVtKXtyZXR1cm4gYXJyMi5pbmRleE9mKGl0ZW0pPT09LTE7fSk7fXZhciBDTEFTU19SRU1PVkFMX1JFR0VYPS9cXHM/Yi1wb3BvdmVyLShhbmNob3J8c2VsZiktKHN0YXJ0fG1pZGRsZXxlbmQpL2c7dmFyIERFRkFVTFRfQ0FSRVRfQ09NUE9ORU5UPV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KCdzdmcnLHt2aWV3Qm94OicwIDAgMTQgOS41Jyx4bWxuczonaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnfSxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudCgnZycsbnVsbCxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudCgncG9seWdvbicse2NsYXNzTmFtZTonYi1wb3BvdmVyLWNhcmV0LWJvcmRlcicsZmlsbDonIzAwMCcscG9pbnRzOic3IDAgMTQgMTAgMCAxMCd9KSxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudCgncG9seWdvbicse2NsYXNzTmFtZTonYi1wb3BvdmVyLWNhcmV0LWZpbGwnLGZpbGw6JyNGRkYnLHBvaW50czonNi45ODIzMDQ0NCAxLjc1IDEyLjc1IDEwIDEuMjUgMTAnfSkpKTt2YXIgU1RBUlQ9MDt2YXIgTUlERExFPTE7dmFyIEVORD0yO3ZhciBjb21iaW5hdGlvbnM9W3tuYW1lOidOTlcnLGF4OlNUQVJULGF5OlNUQVJULGR4OlNUQVJULGR5OkVORH0se25hbWU6J04nLGF4Ok1JRERMRSxheTpTVEFSVCxkeDpNSURETEUsZHk6RU5EfSx7bmFtZTonTk5FJyxheDpFTkQsYXk6U1RBUlQsZHg6RU5ELGR5OkVORH0se25hbWU6J0VORScsYXg6RU5ELGF5OlNUQVJULGR4OlNUQVJULGR5OlNUQVJUfSx7bmFtZTonRScsYXg6RU5ELGF5Ok1JRERMRSxkeDpTVEFSVCxkeTpNSURETEV9LHtuYW1lOidFU0UnLGF4OkVORCxheTpFTkQsZHg6U1RBUlQsZHk6RU5EfSx7bmFtZTonU1NFJyxheDpFTkQsYXk6RU5ELGR4OkVORCxkeTpTVEFSVH0se25hbWU6J1MnLGF4Ok1JRERMRSxheTpFTkQsZHg6TUlERExFLGR5OlNUQVJUfSx7bmFtZTonU1NXJyxheDpTVEFSVCxheTpFTkQsZHg6U1RBUlQsZHk6U1RBUlR9LHtuYW1lOidXU1cnLGF4OlNUQVJULGF5OkVORCxkeDpFTkQsZHk6RU5EfSx7bmFtZTonVycsYXg6U1RBUlQsYXk6TUlERExFLGR4OkVORCxkeTpNSURETEV9LHtuYW1lOidXTlcnLGF4OlNUQVJULGF5OlNUQVJULGR4OkVORCxkeTpTVEFSVH1dO3ZhciBQb3BvdmVyPWZ1bmN0aW9uKF9SZWFjdCRQdXJlQ29tcG9uZW50KXtfaW5oZXJpdHMoUG9wb3ZlcixfUmVhY3QkUHVyZUNvbXBvbmVudCk7ZnVuY3Rpb24gUG9wb3Zlcigpe3ZhciBfcmVmO3ZhciBfdGVtcCxfdGhpcyxfcmV0O19jbGFzc0NhbGxDaGVjayh0aGlzLFBvcG92ZXIpO2Zvcih2YXIgX2xlbj1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkoX2xlbiksX2tleT0wO19rZXk8X2xlbjtfa2V5Kyspe2FyZ3NbX2tleV09YXJndW1lbnRzW19rZXldO31yZXR1cm4gX3JldD0oX3RlbXA9KF90aGlzPV9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKF9yZWY9UG9wb3Zlci5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihQb3BvdmVyKSkuY2FsbC5hcHBseShfcmVmLFt0aGlzXS5jb25jYXQoYXJncykpKSxfdGhpcyksX3RoaXMuYWxpZ249ZnVuY3Rpb24oKXt2YXIgYW5jaG9yPV90aGlzLnByb3BzLmFuY2hvciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50P190aGlzLnByb3BzLmFuY2hvcjpfX3dlYnBhY2tfcmVxdWlyZV9fLmkoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX3JlYWN0X2RvbV9fW1wiZmluZERPTU5vZGVcIl0pKF90aGlzLnByb3BzLmFuY2hvcik7dmFyIGNhcmV0QW5jaG9yPV90aGlzLnByb3BzLmNhcmV0QW5jaG9yP190aGlzLnByb3BzLmNhcmV0QW5jaG9yIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ/X3RoaXMucHJvcHMuY2FyZXRBbmNob3I6X193ZWJwYWNrX3JlcXVpcmVfXy5pKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9kb21fX1tcImZpbmRET01Ob2RlXCJdKShfdGhpcy5wcm9wcy5jYXJldEFuY2hvcik6YW5jaG9yO190aGlzLmNhY2hlVmlld3BvcnRDYXJ0b2dyYXBoeShhbmNob3IsY2FyZXRBbmNob3IpO3ZhciBwcmVzZXQ9X3RoaXMuZ2V0VmFsaWRBbGlnbm1lbnRQcmVzZXQoKTt2YXIgZnJhZz1Qb3BvdmVyLmdldEFsaWdubWVudENsYXNzRnJhZ21lbnQ7X3RoaXMuZGlhbG9nLiR3cmFwcGVyLmNsYXNzTmFtZT1fdGhpcy5kaWFsb2cuJHdyYXBwZXIuY2xhc3NOYW1lLnJlcGxhY2UoQ0xBU1NfUkVNT1ZBTF9SRUdFWCwnJykrKCcgYi1wb3BvdmVyLWFuY2hvci14LScrZnJhZyhwcmVzZXQuYXgpKSsoJyBiLXBvcG92ZXItYW5jaG9yLXktJytmcmFnKHByZXNldC5heSkpKygnIGItcG9wb3Zlci1zZWxmLXgtJytmcmFnKHByZXNldC5keCkpKygnIGItcG9wb3Zlci1zZWxmLXktJytmcmFnKHByZXNldC5keSkpO3ZhciBkeD1NYXRoLnJvdW5kKF90aGlzLmdldE5leHREaWFsb2dYUG9zaXRpb24ocHJlc2V0KSk7dmFyIGR5PU1hdGgucm91bmQoX3RoaXMuZ2V0TmV4dERpYWxvZ1lQb3NpdGlvbihwcmVzZXQpKTtfdGhpcy5kaWFsb2cuJHdyYXBwZXIuc3R5bGVbX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X2JvdW5kbGVzc191dGlsc190cmFuc2Zvcm1fcHJvcGVydHlfX19kZWZhdWx0LmFdPSd0cmFuc2xhdGUoJytkeCsncHgsICcrZHkrJ3B4KSc7dmFyIGNhcmRpbmFsPXByZXNldC5uYW1lWzBdO3ZhciBsb25naXR1ZGluYWw9Y2FyZGluYWw9PT0nTid8fGNhcmRpbmFsPT09J1MnO190aGlzLiRjYXJldC5zdHlsZVtsb25naXR1ZGluYWw/J2xlZnQnOid0b3AnXT1NYXRoLnJvdW5kKF90aGlzLmdldE5leHRDYXJldFhQb3NpdGlvbihwcmVzZXQpKSsncHgnO190aGlzLiRjYXJldC5zdHlsZVtsb25naXR1ZGluYWw/J3RvcCc6J2xlZnQnXT0nMHB4Jzt9LF90ZW1wKSxfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcyxfcmV0KTt9X2NyZWF0ZUNsYXNzKFBvcG92ZXIsW3trZXk6J2NhY2hlVmlld3BvcnRDYXJ0b2dyYXBoeScsdmFsdWU6ZnVuY3Rpb24gY2FjaGVWaWV3cG9ydENhcnRvZ3JhcGh5KGFuY2hvcixjYXJldEFuY2hvcil7dmFyIGJvZHlSZWN0PWRvY3VtZW50LmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dGhpcy5hbmNob3JSZWN0PWFuY2hvci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLmNhcmV0QW5jaG9yUmVjdD1jYXJldEFuY2hvci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLmJvZHlMZWZ0PWJvZHlSZWN0LmxlZnQqLTE7dGhpcy5ib2R5VG9wPWJvZHlSZWN0LnRvcCotMTt9fSx7a2V5OidnZXROZXh0Q2FyZXRYUG9zaXRpb24nLHZhbHVlOmZ1bmN0aW9uIGdldE5leHRDYXJldFhQb3NpdGlvbihfcmVmMil7dmFyIG5hbWU9X3JlZjIubmFtZSxheD1fcmVmMi5heCxkeD1fcmVmMi5keCxheT1fcmVmMi5heSxkeT1fcmVmMi5keTt2YXIgY2FyZXQ9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOnRoaXMuJGNhcmV0O3ZhciBuZXh0WD0wO2lmKG5hbWVbMF09PT0nTid8fG5hbWVbMF09PT0nUycpe25leHRYPXRoaXMuY2FyZXRBbmNob3JSZWN0LmxlZnQtdGhpcy5hbmNob3JSZWN0LmxlZnQrdGhpcy5jYXJldEFuY2hvclJlY3Qud2lkdGgvMjtpZihkeD09PU1JRERMRSl7bmV4dFgrPSh0aGlzLmRpYWxvZy4kd3JhcHBlci5jbGllbnRXaWR0aC10aGlzLmFuY2hvclJlY3Qud2lkdGgpLzI7fWVsc2UgaWYoZHg9PT1FTkQpe25leHRYKz10aGlzLmRpYWxvZy4kd3JhcHBlci5jbGllbnRXaWR0aC10aGlzLmFuY2hvclJlY3Qud2lkdGg7fX1lbHNle25leHRYPXRoaXMuY2FyZXRBbmNob3JSZWN0LnRvcC10aGlzLmFuY2hvclJlY3QudG9wK3RoaXMuY2FyZXRBbmNob3JSZWN0LmhlaWdodC8yO2lmKGR5PT09TUlERExFKXtuZXh0WCs9KHRoaXMuZGlhbG9nLiR3cmFwcGVyLmNsaWVudEhlaWdodC10aGlzLmFuY2hvclJlY3QuaGVpZ2h0KS8yO31lbHNlIGlmKGR5PT09RU5EKXtuZXh0WCs9dGhpcy5kaWFsb2cuJHdyYXBwZXIuY2xpZW50SGVpZ2h0LXRoaXMuYW5jaG9yUmVjdC5oZWlnaHQ7fX1uZXh0WC09Y2FyZXQuY2xpZW50V2lkdGgvMjtyZXR1cm4gbmV4dFg7fX0se2tleTonZ2V0TmV4dERpYWxvZ1hQb3NpdGlvbicsdmFsdWU6ZnVuY3Rpb24gZ2V0TmV4dERpYWxvZ1hQb3NpdGlvbihfcmVmMyl7dmFyIGF4PV9yZWYzLmF4LGR4PV9yZWYzLmR4O3ZhciBkaWFsb2c9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOnRoaXMuZGlhbG9nLiR3cmFwcGVyO3ZhciBuZXh0WD10aGlzLmFuY2hvclJlY3QubGVmdCt0aGlzLmJvZHlMZWZ0O3N3aXRjaChheCl7Y2FzZSBNSURETEU6bmV4dFgrPXRoaXMuYW5jaG9yUmVjdC53aWR0aC8yO2JyZWFrO2Nhc2UgRU5EOm5leHRYKz10aGlzLmFuY2hvclJlY3Qud2lkdGg7YnJlYWs7fXN3aXRjaChkeCl7Y2FzZSBNSURETEU6bmV4dFgtPWRpYWxvZy5jbGllbnRXaWR0aC8yO2JyZWFrO2Nhc2UgRU5EOm5leHRYLT1kaWFsb2cuY2xpZW50V2lkdGg7YnJlYWs7fXJldHVybiBuZXh0WDt9fSx7a2V5OidnZXROZXh0RGlhbG9nWVBvc2l0aW9uJyx2YWx1ZTpmdW5jdGlvbiBnZXROZXh0RGlhbG9nWVBvc2l0aW9uKF9yZWY0KXt2YXIgYXk9X3JlZjQuYXksZHk9X3JlZjQuZHk7dmFyIGRpYWxvZz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMV06dGhpcy5kaWFsb2cuJHdyYXBwZXI7dmFyIG5leHRZPXRoaXMuYW5jaG9yUmVjdC50b3ArdGhpcy5ib2R5VG9wO3N3aXRjaChheSl7Y2FzZSBNSURETEU6bmV4dFkrPXRoaXMuYW5jaG9yUmVjdC5oZWlnaHQvMjticmVhaztjYXNlIEVORDpuZXh0WSs9dGhpcy5hbmNob3JSZWN0LmhlaWdodDticmVhazt9c3dpdGNoKGR5KXtjYXNlIE1JRERMRTpuZXh0WS09ZGlhbG9nLmNsaWVudEhlaWdodC8yO2JyZWFrO2Nhc2UgRU5EOm5leHRZLT1kaWFsb2cuY2xpZW50SGVpZ2h0O2JyZWFrO31yZXR1cm4gbmV4dFk7fX0se2tleTonaXNQb3NpdGlvblZhbGlkJyx2YWx1ZTpmdW5jdGlvbiBpc1Bvc2l0aW9uVmFsaWQoX3JlZjUscEhlaWdodCxwV2lkdGgpe3ZhciBuYW1lPV9yZWY1Lm5hbWUsYXg9X3JlZjUuYXgsYXk9X3JlZjUuYXksZHg9X3JlZjUuZHgsZHk9X3JlZjUuZHk7dmFyIGNhcmRpbmFsPW5hbWVbMF07aWYoY2FyZGluYWw9PT0nTid8fGNhcmRpbmFsPT09J1MnKXtpZihjYXJkaW5hbD09PSdOJyYmdGhpcy5hbmNob3JSZWN0LnRvcC1wSGVpZ2h0PDApe3JldHVybiBmYWxzZTt9ZWxzZSBpZihjYXJkaW5hbD09PSdTJyYmdGhpcy5hbmNob3JSZWN0LmJvdHRvbStwSGVpZ2h0PndpbmRvdy5pbm5lckhlaWdodCl7cmV0dXJuIGZhbHNlO31pZihheD09PVNUQVJUKXtyZXR1cm4hKHRoaXMuYW5jaG9yUmVjdC5sZWZ0K3BXaWR0aD53aW5kb3cuaW5uZXJXaWR0aHx8dGhpcy5hbmNob3JSZWN0LmxlZnQ8MCk7fWVsc2UgaWYoYXg9PT1NSURETEUpe3JldHVybiEodGhpcy5hbmNob3JSZWN0LmxlZnQtcFdpZHRoLzI8MHx8dGhpcy5hbmNob3JSZWN0LmxlZnQrcFdpZHRoLzI+d2luZG93LmlubmVyV2lkdGgpO31yZXR1cm4hKHRoaXMuYW5jaG9yUmVjdC5sZWZ0LXBXaWR0aDwwfHx0aGlzLmFuY2hvclJlY3QucmlnaHQ+d2luZG93LmlubmVyV2lkdGgpO31lbHNlIGlmKGNhcmRpbmFsPT09J1cnfHxjYXJkaW5hbD09PSdFJyl7aWYoY2FyZGluYWw9PT0nVycmJnRoaXMuYW5jaG9yUmVjdC5sZWZ0LXBXaWR0aDwwKXtyZXR1cm4gZmFsc2U7fWVsc2UgaWYoY2FyZGluYWw9PT0nRScmJnRoaXMuYW5jaG9yUmVjdC5yaWdodCtwV2lkdGg+d2luZG93LmlubmVyV2lkdGgpe3JldHVybiBmYWxzZTt9aWYoYXk9PT1TVEFSVCl7cmV0dXJuISh0aGlzLmFuY2hvclJlY3QudG9wK3BIZWlnaHQ+d2luZG93LmlubmVySGVpZ2h0fHx0aGlzLmFuY2hvclJlY3QudG9wPDApO31lbHNlIGlmKGF5PT09TUlERExFKXtyZXR1cm4hKHRoaXMuYW5jaG9yUmVjdC50b3ArdGhpcy5hbmNob3JSZWN0LmhlaWdodC8yLXBIZWlnaHQvMjwwfHx0aGlzLmFuY2hvclJlY3QudG9wK3RoaXMuYW5jaG9yUmVjdC5oZWlnaHQvMitwSGVpZ2h0LzI+d2luZG93LmlubmVySGVpZ2h0KTt9cmV0dXJuISh0aGlzLmFuY2hvclJlY3QudG9wLXBIZWlnaHQ8MHx8dGhpcy5hbmNob3JSZWN0LmJvdHRvbT53aW5kb3cuaW5uZXJIZWlnaHQpO31yZXR1cm4gdHJ1ZTt9fSx7a2V5OidnZXRWYWxpZEFsaWdubWVudFByZXNldCcsdmFsdWU6ZnVuY3Rpb24gZ2V0VmFsaWRBbGlnbm1lbnRQcmVzZXQoKXt2YXIgX3RoaXMyPXRoaXM7dmFyIHdpZHRoPXRoaXMuZGlhbG9nLiR3cmFwcGVyLmNsaWVudFdpZHRoO3ZhciBoZWlnaHQ9dGhpcy5kaWFsb2cuJHdyYXBwZXIuY2xpZW50SGVpZ2h0O3ZhciB2YWxpZENvbWJvcz1jb21iaW5hdGlvbnMuZmlsdGVyKGZ1bmN0aW9uKGNvbmZpZyl7cmV0dXJuIF90aGlzMi5pc1Bvc2l0aW9uVmFsaWQoY29uZmlnLGhlaWdodCx3aWR0aCk7fSk7aWYodmFsaWRDb21ib3MuaW5kZXhPZih0aGlzLnByb3BzLnByZXNldCkhPT0tMXx8IXRoaXMucHJvcHMuYXV0b1JlcG9zaXRpb258fCF2YWxpZENvbWJvcy5sZW5ndGgpe3JldHVybiB0aGlzLnByb3BzLnByZXNldDt9dmFyIGJlc3RDb21ib3M9dmFsaWRDb21ib3MuZmlsdGVyKGZ1bmN0aW9uKF9yZWY2KXt2YXIgbmFtZT1fcmVmNi5uYW1lO3JldHVybiBuYW1lWzBdPT09X3RoaXMyLnByb3BzLnByZXNldC5uYW1lWzBdO30pO2lmKGJlc3RDb21ib3MubGVuZ3RoKXtyZXR1cm4gYmVzdENvbWJvc1swXTt9dmFyIG9wcG9zaXRlQ2FyZGluYWw9Z2V0T3Bwb3NpdGVDYXJkaW5hbCh0aGlzLnByb3BzLnByZXNldC5uYW1lKTt2YXIgb2theUNvbWJvcz12YWxpZENvbWJvcy5maWx0ZXIoZnVuY3Rpb24oX3JlZjcpe3ZhciBuYW1lPV9yZWY3Lm5hbWU7cmV0dXJuIG5hbWVbMF09PT1vcHBvc2l0ZUNhcmRpbmFsO30pO2lmKG9rYXlDb21ib3MubGVuZ3RoKXtyZXR1cm4gb2theUNvbWJvc1swXTt9cmV0dXJuIHZhbGlkQ29tYm9zWzBdO319LHtrZXk6J2NvbXBvbmVudERpZE1vdW50Jyx2YWx1ZTpmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpe3RoaXMuYWxpZ24oKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJyx0aGlzLmFsaWduLHRydWUpO319LHtrZXk6J2NvbXBvbmVudERpZFVwZGF0ZScsdmFsdWU6ZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCl7dGhpcy5hbGlnbigpO319LHtrZXk6J2NvbXBvbmVudFdpbGxVbm1vdW50Jyx2YWx1ZTpmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLHRoaXMuYWxpZ24sdHJ1ZSk7fX0se2tleToncmVuZGVyJyx2YWx1ZTpmdW5jdGlvbiByZW5kZXIoKXt2YXIgX3RoaXMzPXRoaXM7dmFyIHByb3BzPXRoaXMucHJvcHM7cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfcG9ydGFsX19fZGVmYXVsdC5hLHByb3BzLnBvcnRhbFByb3BzLF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfZGlhbG9nX19fZGVmYXVsdC5hLF9leHRlbmRzKHt9LF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCgpKHByb3BzLFBvcG92ZXIuaW50ZXJuYWxLZXlzKSx7cmVmOmZ1bmN0aW9uIHJlZihpbnN0YW5jZSl7cmV0dXJuIF90aGlzMy5kaWFsb2c9aW5zdGFuY2U7fSxiZWZvcmU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNsb25lRWxlbWVudChwcm9wcy5jYXJldENvbXBvbmVudCx7cmVmOmZ1bmN0aW9uIHJlZihub2RlKXtyZXR1cm4gX3RoaXMzLiRjYXJldD1ub2RlO30sY2xhc3NOYW1lOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9jbGFzc25hbWVzX19fZGVmYXVsdCgpKCdiLXBvcG92ZXItY2FyZXQnLHByb3BzLmNhcmV0Q29tcG9uZW50LnByb3BzLmNsYXNzTmFtZSl9KSxjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItcG9wb3ZlcicscHJvcHMuY2xhc3NOYW1lKX0pKSk7fX1dLFt7a2V5OidnZXRBbGlnbm1lbnRDbGFzc0ZyYWdtZW50Jyx2YWx1ZTpmdW5jdGlvbiBnZXRBbGlnbm1lbnRDbGFzc0ZyYWdtZW50KGNvbnN0YW50KXtzd2l0Y2goY29uc3RhbnQpe2Nhc2UgU1RBUlQ6cmV0dXJuJ3N0YXJ0JztjYXNlIE1JRERMRTpyZXR1cm4nbWlkZGxlJztjYXNlIEVORDpyZXR1cm4nZW5kJzt9fX1dKTtyZXR1cm4gUG9wb3Zlcjt9KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5QdXJlQ29tcG9uZW50KTtQb3BvdmVyLnByZXNldD1jb21iaW5hdGlvbnMucmVkdWNlKGZ1bmN0aW9uKG1hcCxkZWYpe3JldHVybiBtYXBbZGVmLm5hbWVdPWRlZixtYXA7fSx7fSk7UG9wb3Zlci5wcm9wVHlwZXM9X2V4dGVuZHMoe30sX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc19kaWFsb2dfX19kZWZhdWx0LmEucHJvcFR5cGVzLHthbmNob3I6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub25lT2ZUeXBlKFtfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5pbnN0YW5jZU9mKEhUTUxFbGVtZW50KSxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5zaGFwZSh7cHJvcHM6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub2JqZWN0fSldKS5pc1JlcXVpcmVkLGF1dG9SZXBvc2l0aW9uOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmJvb2wsY2FyZXRBbmNob3I6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub25lT2ZUeXBlKFtfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5pbnN0YW5jZU9mKEhUTUxFbGVtZW50KSxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5zaGFwZSh7cHJvcHM6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub2JqZWN0fSldKSxjYXJldENvbXBvbmVudDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5lbGVtZW50LHBvcnRhbFByb3BzOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLnNoYXBlKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfcG9ydGFsX19fZGVmYXVsdC5hLlByb3BUeXBlcykscHJlc2V0Ol9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm9uZU9mKFtQb3BvdmVyLnByZXNldC5OTlcsUG9wb3Zlci5wcmVzZXQuTixQb3BvdmVyLnByZXNldC5OTkUsUG9wb3Zlci5wcmVzZXQuRU5FLFBvcG92ZXIucHJlc2V0LkUsUG9wb3Zlci5wcmVzZXQuRVNFLFBvcG92ZXIucHJlc2V0LlNTRSxQb3BvdmVyLnByZXNldC5TLFBvcG92ZXIucHJlc2V0LlNTVyxQb3BvdmVyLnByZXNldC5XU1csUG9wb3Zlci5wcmVzZXQuVyxQb3BvdmVyLnByZXNldC5XTlddKX0pO1BvcG92ZXIuZGVmYXVsdFByb3BzPV9leHRlbmRzKHt9LF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfZGlhbG9nX19fZGVmYXVsdC5hLmRlZmF1bHRQcm9wcyx7YW5jaG9yOnVuZGVmaW5lZCxhdXRvUmVwb3NpdGlvbjp0cnVlLGNhcHR1cmVGb2N1czpmYWxzZSxjYXJldEFuY2hvcjp1bmRlZmluZWQsY2FyZXRDb21wb25lbnQ6REVGQVVMVF9DQVJFVF9DT01QT05FTlQsY2xvc2VPbkVzY0tleTp0cnVlLGNsb3NlT25PdXRzaWRlQ2xpY2s6dHJ1ZSxjbG9zZU9uT3V0c2lkZVNjcm9sbDp0cnVlLHBvcnRhbFByb3BzOnt9LHByZXNldDpQb3BvdmVyLnByZXNldC5TfSk7UG9wb3Zlci5pbnRlcm5hbEtleXM9d2l0aG91dChPYmplY3Qua2V5cyhQb3BvdmVyLmRlZmF1bHRQcm9wcyksX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc19kaWFsb2dfX19kZWZhdWx0LmEuaW50ZXJuYWxLZXlzKTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gUG9wb3ZlcjtcblxuLyoqKi8gfSlcbi8qKioqKiovIF0pO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBpbmRleC5qcyIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIDQzN2Y4NDBlNjYwYzAzMjk1ODI4IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLWRpYWxvZ1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy1kaWFsb2dcIn1cbi8vIG1vZHVsZSBpZCA9IDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXBvcnRhbFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy1wb3J0YWxcIn1cbi8vIG1vZHVsZSBpZCA9IDFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXV0aWxzLW9taXQta2V5c1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIn1cbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXV0aWxzLXRyYW5zZm9ybS1wcm9wZXJ0eVwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy10cmFuc2Zvcm0tcHJvcGVydHlcIn1cbi8vIG1vZHVsZSBpZCA9IDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2xhc3NuYW1lc1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImNsYXNzbmFtZXNcIn1cbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdFwifVxuLy8gbW9kdWxlIGlkID0gNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdC1kb21cIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdC1kb21cIn1cbi8vIG1vZHVsZSBpZCA9IDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IFJlYWN0LCB7UHJvcFR5cGVzfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge2ZpbmRET01Ob2RlfSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IGN4IGZyb20gJ2NsYXNzbmFtZXMnO1xuXG5pbXBvcnQgRGlhbG9nIGZyb20gJ2JvdW5kbGVzcy1kaWFsb2cnO1xuaW1wb3J0IFBvcnRhbCBmcm9tICdib3VuZGxlc3MtcG9ydGFsJztcbmltcG9ydCBvbWl0IGZyb20gJ2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMnO1xuaW1wb3J0IHRyYW5zZm9ybVByb3AgZnJvbSAnYm91bmRsZXNzLXV0aWxzLXRyYW5zZm9ybS1wcm9wZXJ0eSc7XG5cbmZ1bmN0aW9uIGdldE9wcG9zaXRlQ2FyZGluYWwoZGlyZWN0aW9uKSB7XG4gICAgc3dpdGNoIChkaXJlY3Rpb25bMF0pIHtcbiAgICBjYXNlICdOJzpcbiAgICAgICAgcmV0dXJuICdTJztcbiAgICBjYXNlICdTJzpcbiAgICAgICAgcmV0dXJuICdOJztcbiAgICBjYXNlICdFJzpcbiAgICAgICAgcmV0dXJuICdXJztcbiAgICB9XG5cbiAgICByZXR1cm4gJ0UnO1xufVxuXG5mdW5jdGlvbiB3aXRob3V0KGFycjEsIGFycjIpIHsgcmV0dXJuIGFycjEuZmlsdGVyKChpdGVtKSA9PiBhcnIyLmluZGV4T2YoaXRlbSkgPT09IC0xKTsgfVxuXG5jb25zdCBDTEFTU19SRU1PVkFMX1JFR0VYID0gL1xccz9iLXBvcG92ZXItKGFuY2hvcnxzZWxmKS0oc3RhcnR8bWlkZGxlfGVuZCkvZztcblxuY29uc3QgREVGQVVMVF9DQVJFVF9DT01QT05FTlQgPSAoXG4gICAgPHN2ZyB2aWV3Qm94PScwIDAgMTQgOS41JyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnPlxuICAgICAgICA8Zz5cbiAgICAgICAgICAgIDxwb2x5Z29uIGNsYXNzTmFtZT0nYi1wb3BvdmVyLWNhcmV0LWJvcmRlcicgZmlsbD0nIzAwMCcgcG9pbnRzPSc3IDAgMTQgMTAgMCAxMCcgLz5cbiAgICAgICAgICAgIDxwb2x5Z29uIGNsYXNzTmFtZT0nYi1wb3BvdmVyLWNhcmV0LWZpbGwnIGZpbGw9JyNGRkYnIHBvaW50cz0nNi45ODIzMDQ0NCAxLjc1IDEyLjc1IDEwIDEuMjUgMTAnIC8+XG4gICAgICAgIDwvZz5cbiAgICA8L3N2Zz5cbik7XG5cbmNvbnN0IFNUQVJUID0gMDtcbmNvbnN0IE1JRERMRSA9IDE7XG5jb25zdCBFTkQgPSAyO1xuXG5jb25zdCBjb21iaW5hdGlvbnMgPSBbXG4gICAge25hbWU6ICdOTlcnLCAgIGF4OiBTVEFSVCwgICAgIGF5OiBTVEFSVCwgICAgICBkeDogU1RBUlQsICAgZHk6IEVORH0sXG4gICAge25hbWU6ICdOJywgICAgIGF4OiBNSURETEUsICAgIGF5OiBTVEFSVCwgICAgICBkeDogTUlERExFLCAgZHk6IEVORH0sXG4gICAge25hbWU6ICdOTkUnLCAgIGF4OiBFTkQsICAgICAgIGF5OiBTVEFSVCwgICAgICBkeDogRU5ELCAgICAgZHk6IEVORH0sXG4gICAge25hbWU6ICdFTkUnLCAgIGF4OiBFTkQsICAgICAgIGF5OiBTVEFSVCwgICAgICBkeDogU1RBUlQsICAgZHk6IFNUQVJUfSxcbiAgICB7bmFtZTogJ0UnLCAgICAgYXg6IEVORCwgICAgICAgYXk6IE1JRERMRSwgICAgIGR4OiBTVEFSVCwgICBkeTogTUlERExFfSxcbiAgICB7bmFtZTogJ0VTRScsICAgYXg6IEVORCwgICAgICAgYXk6IEVORCwgICAgICAgIGR4OiBTVEFSVCwgICBkeTogRU5EfSxcbiAgICB7bmFtZTogJ1NTRScsICAgYXg6IEVORCwgICAgICAgYXk6IEVORCwgICAgICAgIGR4OiBFTkQsICAgICBkeTogU1RBUlR9LFxuICAgIHtuYW1lOiAnUycsICAgICBheDogTUlERExFLCAgICBheTogRU5ELCAgICAgICAgZHg6IE1JRERMRSwgIGR5OiBTVEFSVH0sXG4gICAge25hbWU6ICdTU1cnLCAgIGF4OiBTVEFSVCwgICAgIGF5OiBFTkQsICAgICAgICBkeDogU1RBUlQsICAgZHk6IFNUQVJUfSxcbiAgICB7bmFtZTogJ1dTVycsICAgYXg6IFNUQVJULCAgICAgYXk6IEVORCwgICAgICAgIGR4OiBFTkQsICAgICBkeTogRU5EfSxcbiAgICB7bmFtZTogJ1cnLCAgICAgYXg6IFNUQVJULCAgICAgYXk6IE1JRERMRSwgICAgIGR4OiBFTkQsICAgICBkeTogTUlERExFfSxcbiAgICB7bmFtZTogJ1dOVycsICAgYXg6IFNUQVJULCAgICAgYXk6IFNUQVJULCAgICAgIGR4OiBFTkQsICAgICBkeTogU1RBUlR9LFxuXTtcblxuLyoqXG5fX0Egbm9uLWJsb2NraW5nIGNvbnRhaW5lciBwb3NpdGlvbmVkIHRvIGEgc3BlY2lmaWMgYW5jaG9yIGVsZW1lbnQuX19cblxuQSBwb3BvdmVyIGlzIGEgdHlwZSBvZiBbRGlhbG9nXSguL0RpYWxvZykgdGhhdCBpcyBtZWFudCB0byBwcm92aWRlIGFkZGl0aW9uYWwgY29udGV4dCB0byBjb250ZW50IChhbiBcImFuY2hvclwiKSBjdXJyZW50bHkgb24tc2NyZWVuLiBUeXBpY2FsbHksIGEgcG9wb3ZlciBpcyBzcGF3bmVkIGJ5IGludGVyYWN0aW5nIHdpdGggdGhlIGNvbnRlbnQgaXQgZW5yaWNoZXMgYW5kIGlzIGRpc21pc3NlZCBieSBjbGlja2luZyBvciBzaGlmdGluZyBmb2N1cyB0byBhbiBhbHRlcm5hdGUgbG9jYXRpb24uXG5cbkFsaWdubWVudCBvcHRpb25zIGZvciB0aGUgcG9wb3ZlciBhcmUgZGVzaWduZWQgdG8gbWlycm9yIGNvbXBhc3MgZGlyZWN0aW9uczpcblxuYGBgXG4gICAgICAg4oaSICAgICAgIOKGkFxuICAgICAgTk5XICBOICBOTkVcbuKGkyBXTlcgICAgICAgICAgICAgRU5FIOKGk1xuICAgIFcgICBBTkNIT1IgICAgRVxu4oaRIFdTVyAgICAgICAgICAgICBFU0Ug4oaRXG4gICAgICBTU1cgIFMgIFNTRVxuICAgICAgIOKGkiAgICAgICDihpBcbmBgYFxuXG5UaGUgYXJyb3dzIGluZGljYXRlIHdoaWNoIHdheSB0aGUgcG9wb3ZlciB3aWxsIGV4dGVuZCwgZS5nLiDihpIgbWVhbnMgdGhlIHBvcG92ZXIgaXMgYWxpZ25lZCB0byB0aGUgbGVmdCBlZGdlIGFuZCBleHRlbmRzIGluIHRoYXQgZGlyZWN0aW9uLiBEaWFnb25hbCBjb3JuZXJzIChOVywgTkUsIFNFLCBTVykgYXJlIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLlxuXG5gYGBqc3hcbjxQb3BvdmVyXG4gICAgYW5jaG9yPXtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc29tZS1hbmNob3ItZWxlbWVudCcpfVxuICAgIHByZXNldD17UG9wb3Zlci5wcmVzZXQuTn0+XG4gICAgTXkgcG9wb3ZlciBjb250ZW50IVxuPC9Qb3BvdmVyPlxuYGBgXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvcG92ZXIgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VxdWVuY2VzXG4gICAgc3RhdGljIHByZXNldCA9IGNvbWJpbmF0aW9ucy5yZWR1Y2UoKG1hcCwgZGVmKSA9PiAoKG1hcFtkZWYubmFtZV0gPSBkZWYpLCBtYXApLCB7fSlcblxuICAgIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgICAgIC4uLkRpYWxvZy5wcm9wVHlwZXMsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGEgRE9NIGVsZW1lbnQgb3IgUmVhY3QgcmVmZXJlbmNlIChyZWYpIHRvIG9uZSBmb3IgcG9zaXRpb25pbmcgcHVycG9zZXNcbiAgICAgICAgICovXG4gICAgICAgIGFuY2hvcjogUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgICAgICAgICBQcm9wVHlwZXMuaW5zdGFuY2VPZihIVE1MRWxlbWVudCksXG4gICAgICAgICAgICBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgICAgICAgICAgIHByb3BzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgICAgICAgICAgfSksXG4gICAgICAgIF0pLmlzUmVxdWlyZWQsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGlmIHRoZSBnaXZlbiBhbGlnbm1lbnQgc2V0dGluZ3Mgd291bGQgdGFrZSB0aGUgcG9wb3ZlciBvdXQgb2YgYm91bmRzLCBjaGFuZ2UgdGhlIGFsaWdubWVudCBhcyBuZWNlc3NhcnkgdG8gcmVtYWluIGluIHRoZSB2aWV3cG9ydFxuICAgICAgICAgKi9cbiAgICAgICAgYXV0b1JlcG9zaXRpb246IFByb3BUeXBlcy5ib29sLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhIERPTSBlbGVtZW50IG9yIFJlYWN0IHJlZmVyZW5jZSAocmVmKSB0byBvbmUgZm9yIHBvc2l0aW9uaW5nIHB1cnBvc2VzLCB0aGUgY2FyZXQgY29tcG9uZW50IHdpbGxcbiAgICAgICAgICogYmUgYXV0b21hdGljYWxseSBwb3NpdGlvbmVkIHRvIGNlbnRlciBvbiB0aGlzIHByb3ZpZGVkIGFuY2hvcjsgYnkgZGVmYXVsdCBpdCB3aWxsIGNlbnRlclxuICAgICAgICAgKiBvbiBgcHJvcHMuYW5jaG9yYFxuICAgICAgICAgKi9cbiAgICAgICAgY2FyZXRBbmNob3I6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgICAgICAgICAgUHJvcFR5cGVzLmluc3RhbmNlT2YoSFRNTEVsZW1lbnQpLFxuICAgICAgICAgICAgUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgICAgICAgICAgICBwcm9wczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICBdKSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogdGhlIEpTWCB0aGF0IGlzIHJlbmRlcmVkIGFuZCB1c2VkIHRvIHBvaW50IGF0IHRoZSBtaWRkbGUgb2YgdGhlIGFuY2hvciBlbGVtZW50IGFuZCBpbmRpY2F0ZSB0aGUgY29udGV4dCBvZiB0aGUgcG9wb3ZlclxuICAgICAgICAgKi9cbiAgICAgICAgY2FyZXRDb21wb25lbnQ6IFByb3BUeXBlcy5lbGVtZW50LFxuXG4gICAgICAgIHBvcnRhbFByb3BzOiBQcm9wVHlwZXMuc2hhcGUoUG9ydGFsLlByb3BUeXBlcyksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGBgYGpzeFxuICAgICAgICAgKiA8UG9wb3ZlclxuICAgICAgICAgKiAgICAgYW5jaG9yPXtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc29tZS1hbmNob3ItZWxlbWVudCcpfVxuICAgICAgICAgKiAgICAgcHJlc2V0PXtQb3BvdmVyLnByZXNldC5OTkV9PlxuICAgICAgICAgKiAgICAgTXkgcG9wb3ZlciBjb250ZW50IVxuICAgICAgICAgKiA8L1BvcG92ZXI+XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKi9cbiAgICAgICAgcHJlc2V0OiBQcm9wVHlwZXMub25lT2YoW1xuICAgICAgICAgICAgUG9wb3Zlci5wcmVzZXQuTk5XLFxuICAgICAgICAgICAgUG9wb3Zlci5wcmVzZXQuTixcbiAgICAgICAgICAgIFBvcG92ZXIucHJlc2V0Lk5ORSxcbiAgICAgICAgICAgIFBvcG92ZXIucHJlc2V0LkVORSxcbiAgICAgICAgICAgIFBvcG92ZXIucHJlc2V0LkUsXG4gICAgICAgICAgICBQb3BvdmVyLnByZXNldC5FU0UsXG4gICAgICAgICAgICBQb3BvdmVyLnByZXNldC5TU0UsXG4gICAgICAgICAgICBQb3BvdmVyLnByZXNldC5TLFxuICAgICAgICAgICAgUG9wb3Zlci5wcmVzZXQuU1NXLFxuICAgICAgICAgICAgUG9wb3Zlci5wcmVzZXQuV1NXLFxuICAgICAgICAgICAgUG9wb3Zlci5wcmVzZXQuVyxcbiAgICAgICAgICAgIFBvcG92ZXIucHJlc2V0LldOVyxcbiAgICAgICAgXSksXG4gICAgfVxuXG4gICAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgICAgLi4uRGlhbG9nLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgYW5jaG9yOiB1bmRlZmluZWQsXG4gICAgICAgIGF1dG9SZXBvc2l0aW9uOiB0cnVlLFxuICAgICAgICBjYXB0dXJlRm9jdXM6IGZhbHNlLFxuICAgICAgICBjYXJldEFuY2hvcjogdW5kZWZpbmVkLFxuICAgICAgICBjYXJldENvbXBvbmVudDogREVGQVVMVF9DQVJFVF9DT01QT05FTlQsXG4gICAgICAgIGNsb3NlT25Fc2NLZXk6IHRydWUsXG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IHRydWUsXG4gICAgICAgIGNsb3NlT25PdXRzaWRlU2Nyb2xsOiB0cnVlLFxuICAgICAgICBwb3J0YWxQcm9wczoge30sXG4gICAgICAgIHByZXNldDogUG9wb3Zlci5wcmVzZXQuUyxcbiAgICB9XG5cbiAgICBzdGF0aWMgaW50ZXJuYWxLZXlzID0gd2l0aG91dChPYmplY3Qua2V5cyhQb3BvdmVyLmRlZmF1bHRQcm9wcyksIERpYWxvZy5pbnRlcm5hbEtleXMpXG5cbiAgICBzdGF0aWMgZ2V0QWxpZ25tZW50Q2xhc3NGcmFnbWVudChjb25zdGFudCkge1xuICAgICAgICBzd2l0Y2ggKGNvbnN0YW50KSB7XG4gICAgICAgIGNhc2UgU1RBUlQ6XG4gICAgICAgICAgICByZXR1cm4gJ3N0YXJ0JztcblxuICAgICAgICBjYXNlIE1JRERMRTpcbiAgICAgICAgICAgIHJldHVybiAnbWlkZGxlJztcblxuICAgICAgICBjYXNlIEVORDpcbiAgICAgICAgICAgIHJldHVybiAnZW5kJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNhY2hlVmlld3BvcnRDYXJ0b2dyYXBoeShhbmNob3IsIGNhcmV0QW5jaG9yKSB7XG4gICAgICAgIGNvbnN0IGJvZHlSZWN0ID0gZG9jdW1lbnQuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICB0aGlzLmFuY2hvclJlY3QgPSBhbmNob3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuY2FyZXRBbmNob3JSZWN0ID0gY2FyZXRBbmNob3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgLy8gbm9ybWFsbHkgd2UnZCB1c2Ugc2Nyb2xsVG9wL3Njcm9sbExlZnQsIGJ1dCBzY3JvbGwgYmVoYXZpb3IgY2hhbmdlcyB3aGVuIHBvc2l0aW9uOiBzdGlja3lcbiAgICAgICAgLy8gaXMgZW5hYmxlZCBpbiBDaHJvbWUgYW5kIGludmVydGluZyB0aGUgbmVnYXRpdmUgdmlld3BvcnQgcmVjdCB2YWx1ZSBzZWVtcyB0byB3b3JrIG1vcmVcbiAgICAgICAgLy8gY29uc2lzdGVudGx5XG4gICAgICAgIHRoaXMuYm9keUxlZnQgPSBib2R5UmVjdC5sZWZ0ICogLTE7XG4gICAgICAgIHRoaXMuYm9keVRvcCA9IGJvZHlSZWN0LnRvcCAqIC0xO1xuICAgIH1cblxuICAgIGdldE5leHRDYXJldFhQb3NpdGlvbih7bmFtZSwgYXgsIGR4LCBheSwgZHl9LCBjYXJldCA9IHRoaXMuJGNhcmV0KSB7XG4gICAgICAgIGxldCBuZXh0WCA9IDA7XG5cbiAgICAgICAgaWYgKG5hbWVbMF0gPT09ICdOJyB8fCBuYW1lWzBdID09PSAnUycpIHtcbiAgICAgICAgICAgIC8vIHBvcG92ZXIgaXMgYWJvdmUvYmVsb3csIHNvIHdlIG5lZWQgdG8gZGV0ZWN0IHRoZSBYIHBvc2l0aW9uIG9mIHRoZSBjYXJldCBhbmNob3JcbiAgICAgICAgICAgIG5leHRYID0gdGhpcy5jYXJldEFuY2hvclJlY3QubGVmdCAtIHRoaXMuYW5jaG9yUmVjdC5sZWZ0ICsgdGhpcy5jYXJldEFuY2hvclJlY3Qud2lkdGggLyAyO1xuXG4gICAgICAgICAgICBpZiAoZHggPT09IE1JRERMRSkge1xuICAgICAgICAgICAgICAgIG5leHRYICs9ICh0aGlzLmRpYWxvZy4kd3JhcHBlci5jbGllbnRXaWR0aCAtIHRoaXMuYW5jaG9yUmVjdC53aWR0aCkgLyAyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkeCA9PT0gRU5EKSB7XG4gICAgICAgICAgICAgICAgbmV4dFggKz0gdGhpcy5kaWFsb2cuJHdyYXBwZXIuY2xpZW50V2lkdGggLSB0aGlzLmFuY2hvclJlY3Qud2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBwb3BvdmVyIGlzIGxlZnQvcmlnaHQsIHNvIHdlIG5lZWQgdG8gZGV0ZWN0IHRoZSBZIHBvc2l0aW9uIG9mIHRoZSBjYXJldCBhbmNob3IgKGNhcmV0IGlzIHJvdGF0ZWQgdmlhIENTUylcbiAgICAgICAgICAgIG5leHRYID0gdGhpcy5jYXJldEFuY2hvclJlY3QudG9wIC0gdGhpcy5hbmNob3JSZWN0LnRvcCArIHRoaXMuY2FyZXRBbmNob3JSZWN0LmhlaWdodCAvIDI7XG5cbiAgICAgICAgICAgIGlmIChkeSA9PT0gTUlERExFKSB7XG4gICAgICAgICAgICAgICAgbmV4dFggKz0gKHRoaXMuZGlhbG9nLiR3cmFwcGVyLmNsaWVudEhlaWdodCAtIHRoaXMuYW5jaG9yUmVjdC5oZWlnaHQpIC8gMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZHkgPT09IEVORCkge1xuICAgICAgICAgICAgICAgIG5leHRYICs9IHRoaXMuZGlhbG9nLiR3cmFwcGVyLmNsaWVudEhlaWdodCAtIHRoaXMuYW5jaG9yUmVjdC5oZWlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBuZXh0WCAtPSBjYXJldC5jbGllbnRXaWR0aCAvIDI7XG5cbiAgICAgICAgcmV0dXJuIG5leHRYO1xuICAgIH1cblxuICAgIGdldE5leHREaWFsb2dYUG9zaXRpb24oe2F4LCBkeH0sIGRpYWxvZyA9IHRoaXMuZGlhbG9nLiR3cmFwcGVyKSB7XG4gICAgICAgIGxldCBuZXh0WCA9IHRoaXMuYW5jaG9yUmVjdC5sZWZ0ICsgdGhpcy5ib2R5TGVmdDtcblxuICAgICAgICBzd2l0Y2ggKGF4KSB7XG4gICAgICAgIGNhc2UgTUlERExFOlxuICAgICAgICAgICAgbmV4dFggKz0gdGhpcy5hbmNob3JSZWN0LndpZHRoIC8gMjtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgRU5EOlxuICAgICAgICAgICAgbmV4dFggKz0gdGhpcy5hbmNob3JSZWN0LndpZHRoO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKGR4KSB7XG4gICAgICAgIGNhc2UgTUlERExFOlxuICAgICAgICAgICAgbmV4dFggLT0gZGlhbG9nLmNsaWVudFdpZHRoIC8gMjtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgRU5EOlxuICAgICAgICAgICAgbmV4dFggLT0gZGlhbG9nLmNsaWVudFdpZHRoO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV4dFg7XG4gICAgfVxuXG4gICAgZ2V0TmV4dERpYWxvZ1lQb3NpdGlvbih7YXksIGR5fSwgZGlhbG9nID0gdGhpcy5kaWFsb2cuJHdyYXBwZXIpIHtcbiAgICAgICAgbGV0IG5leHRZID0gdGhpcy5hbmNob3JSZWN0LnRvcCArIHRoaXMuYm9keVRvcDtcblxuICAgICAgICBzd2l0Y2ggKGF5KSB7XG4gICAgICAgIGNhc2UgTUlERExFOlxuICAgICAgICAgICAgbmV4dFkgKz0gdGhpcy5hbmNob3JSZWN0LmhlaWdodCAvIDI7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIEVORDpcbiAgICAgICAgICAgIG5leHRZICs9IHRoaXMuYW5jaG9yUmVjdC5oZWlnaHQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoZHkpIHtcbiAgICAgICAgY2FzZSBNSURETEU6XG4gICAgICAgICAgICBuZXh0WSAtPSBkaWFsb2cuY2xpZW50SGVpZ2h0IC8gMjtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgRU5EOlxuICAgICAgICAgICAgbmV4dFkgLT0gZGlhbG9nLmNsaWVudEhlaWdodDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5leHRZO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgcG9zaXRpb24gY29tYmluYXRpb24sIHdpbGwgdGhlIHBvcG92ZXIgZml0IGludG8gdGhlIHNwYWNlIHdpdGhvdXQgb2NjbHVzaW9uP1xuICAgICAqXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSAgY29uZmlnXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSAgY29uZmlnLmF4XG4gICAgICogQHBhcmFtICB7U3RyaW5nfSAgY29uZmlnLmF5XG4gICAgICogQHBhcmFtICB7U3RyaW5nfSAgY29uZmlnLmR4XG4gICAgICogQHBhcmFtICB7U3RyaW5nfSAgY29uZmlnLmR5XG4gICAgICogQHBhcmFtICB7TnVtYmVyfSAgcEhlaWdodFxuICAgICAqIEBwYXJhbSAge051bWJlcn0gIHBXaWR0aFxuICAgICAqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc1Bvc2l0aW9uVmFsaWQoe25hbWUsIGF4LCBheSwgZHgsIGR5fSwgcEhlaWdodCwgcFdpZHRoKSB7XG4gICAgICAgIGNvbnN0IGNhcmRpbmFsID0gbmFtZVswXTtcblxuICAgICAgICBpZiAoY2FyZGluYWwgPT09ICdOJyB8fCBjYXJkaW5hbCA9PT0gJ1MnKSB7XG4gICAgICAgICAgICBpZiAoY2FyZGluYWwgPT09ICdOJyAmJiB0aGlzLmFuY2hvclJlY3QudG9wIC0gcEhlaWdodCA8IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgLyogd291bGQgb2NjbHVkZSBhYm92ZSAqL1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjYXJkaW5hbCA9PT0gJ1MnICYmIHRoaXMuYW5jaG9yUmVjdC5ib3R0b20gKyBwSGVpZ2h0ID4gd2luZG93LmlubmVySGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgIC8qIHdvdWxkIG9jY2x1ZGUgYmVsb3cgKi9cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGF4ID09PSBTVEFSVCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAhKFxuICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5hbmNob3JSZWN0LmxlZnQgKyBwV2lkdGggPiB3aW5kb3cuaW5uZXJXaWR0aCkgICAgICAvKiB3b3VsZCBvY2NsdWRlIHJpZ2h0ICovXG4gICAgICAgICAgICAgICAgICAgIHx8ICh0aGlzLmFuY2hvclJlY3QubGVmdCA8IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuY2hvciBpcyBwYXJ0aWFsbHkgb2Zmc2NyZWVuIHRvIHRoZSBsZWZ0ICovXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYXggPT09IE1JRERMRSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAhKFxuICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5hbmNob3JSZWN0LmxlZnQgLSBwV2lkdGggLyAyIDwgMCkgICAgICAgICAgICAgICAgICAvKiB3b3VsZCBvY2NsdWRlIGxlZnQgKi9cbiAgICAgICAgICAgICAgICAgICAgfHwgKHRoaXMuYW5jaG9yUmVjdC5sZWZ0ICsgcFdpZHRoIC8gMiA+IHdpbmRvdy5pbm5lcldpZHRoKSAgLyogd291bGQgb2NjbHVkZSByaWdodCAqL1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiAhKFxuICAgICAgICAgICAgICAgICAgICh0aGlzLmFuY2hvclJlY3QubGVmdCAtIHBXaWR0aCA8IDApICAgICAgICAgICAgICAgICAgLyogd291bGQgb2NjbHVkZSBsZWZ0ICovXG4gICAgICAgICAgICAgICAgfHwgKHRoaXMuYW5jaG9yUmVjdC5yaWdodCA+IHdpbmRvdy5pbm5lcldpZHRoKSAgICAgICAgICAvKiBhbmNob3IgaXMgcGFydGlhbGx5IG9mZnNjcmVlbiB0byB0aGUgcmlnaHQgKi9cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjYXJkaW5hbCA9PT0gJ1cnIHx8IGNhcmRpbmFsID09PSAnRScpIHtcbiAgICAgICAgICAgIGlmIChjYXJkaW5hbCA9PT0gJ1cnICYmIHRoaXMuYW5jaG9yUmVjdC5sZWZ0IC0gcFdpZHRoIDwgMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAvKiB3b3VsZCBvY2NsdWRlIGxlZnQgKi9cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FyZGluYWwgPT09ICdFJyAmJiB0aGlzLmFuY2hvclJlY3QucmlnaHQgKyBwV2lkdGggPiB3aW5kb3cuaW5uZXJXaWR0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAvKiB3b3VsZCBvY2NsdWRlIHJpZ2h0ICovXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChheSA9PT0gU1RBUlQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gIShcbiAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuYW5jaG9yUmVjdC50b3AgKyBwSGVpZ2h0ID4gd2luZG93LmlubmVySGVpZ2h0KSAgICAvKiB3b3VsZCBvY2NsdWRlIGJlbG93ICovXG4gICAgICAgICAgICAgICAgICAgIHx8ICh0aGlzLmFuY2hvclJlY3QudG9wIDwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5jaG9yIGlzIHBhcnRpYWxseSBvZmZzY3JlZW4gYWJvdmUgKi9cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChheSA9PT0gTUlERExFKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICEoXG4gICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmFuY2hvclJlY3QudG9wICsgdGhpcy5hbmNob3JSZWN0LmhlaWdodCAvIDIgLSBwSGVpZ2h0IC8gMiA8IDApICAgICAgICAgICAgICAgICAgICAgLyogd291bGQgb2NjbHVkZSBhYm92ZSAqL1xuICAgICAgICAgICAgICAgICAgICB8fCAodGhpcy5hbmNob3JSZWN0LnRvcCArIHRoaXMuYW5jaG9yUmVjdC5oZWlnaHQgLyAyICsgcEhlaWdodCAvIDIgPiB3aW5kb3cuaW5uZXJIZWlnaHQpICAgIC8qIHdvdWxkIG9jY2x1ZGUgYmVsb3cgKi9cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gIShcbiAgICAgICAgICAgICAgICAgICAodGhpcy5hbmNob3JSZWN0LnRvcCAtIHBIZWlnaHQgPCAwKSAgICAgICAgICAgICAgLyogd291bGQgb2NjbHVkZSBhYm92ZSAqL1xuICAgICAgICAgICAgICAgIHx8ICh0aGlzLmFuY2hvclJlY3QuYm90dG9tID4gd2luZG93LmlubmVySGVpZ2h0KSAgICAvKiBhbmNob3IgaXMgcGFydGlhbGx5IG9mZnNjcmVlbiBiZWxvdyAqL1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGdldFZhbGlkQWxpZ25tZW50UHJlc2V0KCkge1xuICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMuZGlhbG9nLiR3cmFwcGVyLmNsaWVudFdpZHRoO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmRpYWxvZy4kd3JhcHBlci5jbGllbnRIZWlnaHQ7XG5cbiAgICAgICAgLy8gZ2l2ZW4gdGhlIGN1cnJlbnQgdmlld3BvcnQgY2FydG9ncmFwaHksIHdoZXJlIGNhbiB3ZSBzdGljayB0aGUgcG9wb3ZlclxuICAgICAgICAvLyBzbyBpdCB3b24ndCBiZSBwYXJ0aWFsbHkgb2NjbHVkZWQ/XG4gICAgICAgIGNvbnN0IHZhbGlkQ29tYm9zID0gY29tYmluYXRpb25zLmZpbHRlcigoY29uZmlnKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc1Bvc2l0aW9uVmFsaWQoY29uZmlnLCBoZWlnaHQsIHdpZHRoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gMS4gaXMgdGhlIHJlcXVlc3RlZCBwcmVzZXQgaW4gdGhlIGxpc3Q/XG4gICAgICAgIC8vIDIuIGRvZXMgdGhlIGNvbnN1bWVyIG5vdCB3YW50IHVzIGF1dG8tcmVwb3NpdGlvbmluZz9cbiAgICAgICAgLy8gMy4gYXJlIG5vIGNvbWJvcyB2YWxpZD9cbiAgICAgICAgaWYgKHZhbGlkQ29tYm9zLmluZGV4T2YodGhpcy5wcm9wcy5wcmVzZXQpICE9PSAtMSB8fCAhdGhpcy5wcm9wcy5hdXRvUmVwb3NpdGlvbiB8fCAhdmFsaWRDb21ib3MubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5wcmVzZXQ7IC8vIGp1c3QgZ28gd2l0aCB0aGUgcmVxdWVzdGVkIHByZXNldFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gb3RoZXJ3aXNlLi4uIHdlIHRyeSB0byBmaW5kIHRoZSBiZXN0IHBvc3NpYmxlIGZhbGxiYWNrIG9wdGlvblxuXG4gICAgICAgIC8vIG9wdGltaXplIGZvciB0aGUgcmVxdWVzdGVkIHByZXNldCBoZW1pc3BoZXJlXG4gICAgICAgIGNvbnN0IGJlc3RDb21ib3MgPSB2YWxpZENvbWJvcy5maWx0ZXIoKHtuYW1lfSkgPT4gbmFtZVswXSA9PT0gdGhpcy5wcm9wcy5wcmVzZXQubmFtZVswXSk7XG5cbiAgICAgICAgaWYgKGJlc3RDb21ib3MubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gYmVzdENvbWJvc1swXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRoZW4gdGhlIG9wcG9zaXRlIChlLmcuIHRoZSBlbGVtZW50IGlzIHRvbyBsb3cgaW4gdGhlIHZpZXdwb3J0IHNvIGZsaXAgdXAgaW5zdGVhZCBvZiBkb3duKVxuICAgICAgICBjb25zdCBvcHBvc2l0ZUNhcmRpbmFsID0gZ2V0T3Bwb3NpdGVDYXJkaW5hbCh0aGlzLnByb3BzLnByZXNldC5uYW1lKTtcbiAgICAgICAgY29uc3Qgb2theUNvbWJvcyA9IHZhbGlkQ29tYm9zLmZpbHRlcigoe25hbWV9KSA9PiBuYW1lWzBdID09PSBvcHBvc2l0ZUNhcmRpbmFsKTtcblxuICAgICAgICBpZiAob2theUNvbWJvcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBva2F5Q29tYm9zWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd2hhdGV2ZXIncyBsZWZ0IHdpbGwgaGF2ZSB0byBkb1xuICAgICAgICByZXR1cm4gdmFsaWRDb21ib3NbMF07XG4gICAgfVxuXG4gICAgYWxpZ24gPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFuY2hvciA9IHRoaXMucHJvcHMuYW5jaG9yIGluc3RhbmNlb2YgSFRNTEVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnByb3BzLmFuY2hvclxuICAgICAgICAgICAgICAgICAgICAgICA6IGZpbmRET01Ob2RlKHRoaXMucHJvcHMuYW5jaG9yKTtcblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnlcbiAgICAgICAgY29uc3QgY2FyZXRBbmNob3IgPSB0aGlzLnByb3BzLmNhcmV0QW5jaG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnByb3BzLmNhcmV0QW5jaG9yIGluc3RhbmNlb2YgSFRNTEVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5wcm9wcy5jYXJldEFuY2hvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmaW5kRE9NTm9kZSh0aGlzLnByb3BzLmNhcmV0QW5jaG9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYW5jaG9yO1xuXG4gICAgICAgIHRoaXMuY2FjaGVWaWV3cG9ydENhcnRvZ3JhcGh5KGFuY2hvciwgY2FyZXRBbmNob3IpO1xuXG4gICAgICAgIGNvbnN0IHByZXNldCA9IHRoaXMuZ2V0VmFsaWRBbGlnbm1lbnRQcmVzZXQoKTtcbiAgICAgICAgY29uc3QgZnJhZyA9IFBvcG92ZXIuZ2V0QWxpZ25tZW50Q2xhc3NGcmFnbWVudDtcblxuICAgICAgICB0aGlzLmRpYWxvZy4kd3JhcHBlci5jbGFzc05hbWUgPSB0aGlzLmRpYWxvZy4kd3JhcHBlci5jbGFzc05hbWUucmVwbGFjZShDTEFTU19SRU1PVkFMX1JFR0VYLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBgIGItcG9wb3Zlci1hbmNob3IteC0ke2ZyYWcocHJlc2V0LmF4KX1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYCBiLXBvcG92ZXItYW5jaG9yLXktJHtmcmFnKHByZXNldC5heSl9YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGAgYi1wb3BvdmVyLXNlbGYteC0ke2ZyYWcocHJlc2V0LmR4KX1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYCBiLXBvcG92ZXItc2VsZi15LSR7ZnJhZyhwcmVzZXQuZHkpfWA7XG5cbiAgICAgICAgY29uc3QgZHggPSBNYXRoLnJvdW5kKHRoaXMuZ2V0TmV4dERpYWxvZ1hQb3NpdGlvbihwcmVzZXQpKTtcbiAgICAgICAgY29uc3QgZHkgPSBNYXRoLnJvdW5kKHRoaXMuZ2V0TmV4dERpYWxvZ1lQb3NpdGlvbihwcmVzZXQpKTtcblxuICAgICAgICB0aGlzLmRpYWxvZy4kd3JhcHBlci5zdHlsZVt0cmFuc2Zvcm1Qcm9wXSA9IGB0cmFuc2xhdGUoJHtkeH1weCwgJHtkeX1weClgO1xuXG4gICAgICAgIGNvbnN0IGNhcmRpbmFsID0gcHJlc2V0Lm5hbWVbMF07XG4gICAgICAgIGNvbnN0IGxvbmdpdHVkaW5hbCA9IGNhcmRpbmFsID09PSAnTicgfHwgY2FyZGluYWwgPT09ICdTJztcblxuICAgICAgICAvLyB0aGUgY2FyZXQgaXMgaW5pdGlhbGx5IHBvc2l0aW9uZWQgYXQgMCwwIGluc2lkZSB0aGUgZGlhbG9nXG4gICAgICAgIC8vIHdoaWNoIGlzIGFscmVhZHkgcG9zaXRpb25lZCBhdCB0aGUgYW5jaG9yLCBzbyB3ZSBqdXN0IG5lZWQgdG9cbiAgICAgICAgLy8gbWFrZSBzbWFsbCBhZGp1c3RtZW50cyBhcyBuZWNlc3NhcnkgdG8gbGluZSB1cCB0aGUgY2FyZXRcbiAgICAgICAgLy8gd2l0aCB0aGUgdmlzdWFsIGNlbnRlciBvZiB0aGUgYW5jaG9yXG4gICAgICAgIHRoaXMuJGNhcmV0LnN0eWxlW2xvbmdpdHVkaW5hbCA/ICdsZWZ0JyA6ICd0b3AnXSA9IE1hdGgucm91bmQodGhpcy5nZXROZXh0Q2FyZXRYUG9zaXRpb24ocHJlc2V0KSkgKyAncHgnO1xuICAgICAgICB0aGlzLiRjYXJldC5zdHlsZVtsb25naXR1ZGluYWwgPyAndG9wJyA6ICdsZWZ0J10gPSAnMHB4JztcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgdGhpcy5hbGlnbigpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5hbGlnbiwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgICB0aGlzLmFsaWduKCk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLmFsaWduLCB0cnVlKTsgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCB7cHJvcHN9ID0gdGhpcztcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPFBvcnRhbCB7Li4ucHJvcHMucG9ydGFsUHJvcHN9PlxuICAgICAgICAgICAgICAgIDxEaWFsb2dcbiAgICAgICAgICAgICAgICAgICAgey4uLm9taXQocHJvcHMsIFBvcG92ZXIuaW50ZXJuYWxLZXlzKX1cbiAgICAgICAgICAgICAgICAgICAgcmVmPXsoaW5zdGFuY2UpID0+ICh0aGlzLmRpYWxvZyA9IGluc3RhbmNlKX1cbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlPXtcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlYWN0LmNsb25lRWxlbWVudChwcm9wcy5jYXJldENvbXBvbmVudCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjogKG5vZGUpID0+ICh0aGlzLiRjYXJldCA9IG5vZGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogY3goJ2ItcG9wb3Zlci1jYXJldCcsIHByb3BzLmNhcmV0Q29tcG9uZW50LnByb3BzLmNsYXNzTmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y3goJ2ItcG9wb3ZlcicsIHByb3BzLmNsYXNzTmFtZSl9IC8+XG4gICAgICAgICAgICA8L1BvcnRhbD5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9ib3VuZGxlc3MtcG9wb3Zlci9pbmRleC5qcyJdLCJzb3VyY2VSb290IjoiIn0= |