boundless-dialog
Advanced tools
Comparing version 1.0.0-beta.6 to 1.0.0-beta.7
@@ -1,2 +0,2 @@ | ||
module.exports=function(e){function o(t){if(r[t])return r[t].exports;var n=r[t]={i:t,l:!1,exports:{}};return e[t].call(n.exports,n,n.exports,o),n.l=!0,n.exports}var r={};return o.m=e,o.c=r,o.i=function(e){return e},o.d=function(e,r,t){o.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:t})},o.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(r,"a",r),r},o.o=function(e,o){return Object.prototype.hasOwnProperty.call(e,o)},o.p="",o(o.s=5)}([function(e,o,r){"use strict";function t(e){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Object.keys(e).reduce(function(r,t){return o.indexOf(t)===-1&&(r[t]=e[t]),r},{})}o.a=t},function(e,o,r){"use strict";function t(){return"b-"+([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,function(e){return(e^16*Math.random()>>e/4).toString(16)})}o.a=t},function(e,o){e.exports=require("boundless-portal")},function(e,o){e.exports=require("classnames")},function(e,o){e.exports=require("react")},function(e,o,r){"use strict";function t(e,o){if(!(e instanceof o))throw new TypeError("Cannot call a class as a function")}function n(e,o){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!o||"object"!=typeof o&&"function"!=typeof o?e:o}function s(e,o){if("function"!=typeof o&&null!==o)throw new TypeError("Super expression must either be null or a function, not "+typeof o);e.prototype=Object.create(o&&o.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),o&&(Object.setPrototypeOf?Object.setPrototypeOf(e,o):e.__proto__=o)}Object.defineProperty(o,"__esModule",{value:!0});var i=r(4),l=r.n(i),a=r(3),p=r.n(a),u=r(2),c=r.n(u),d=r(0),f=r(1),h=Object.assign||function(e){for(var o=1;o<arguments.length;o++){var r=arguments[o];for(var t in r)Object.prototype.hasOwnProperty.call(r,t)&&(e[t]=r[t])}return e},y=function(){function e(e,o){for(var r=0;r<o.length;r++){var t=o[r];t.enumerable=t.enumerable||!1,t.configurable=!0,"value"in t&&(t.writable=!0),Object.defineProperty(e,t.key,t)}}return function(o,r,t){return r&&e(o.prototype,r),t&&e(o,t),o}}(),O=function(e){return"function"==typeof e},P=function(){},b=Array.prototype.slice,w=function(e){function o(){var e,s,i,l;t(this,o);for(var a=arguments.length,p=Array(a),u=0;u<a;u++)p[u]=arguments[u];return s=i=n(this,(e=o.__proto__||Object.getPrototypeOf(o)).call.apply(e,[this].concat(p))),i.mounted=!1,i.uuidHeader=r.i(f.a)(),i.uuidBody=r.i(f.a)(),i.handleFocus=function(e){if(i.props.captureFocus){var o=e.explicitOriginalTarget||e.relatedTarget;i.isPartOfDialog(o)&&!i.isPartOfDialog(e.target)&&(e.preventDefault(),o.focus())}else if(i.shouldDialogCloseOnEvent("closeOnOutsideFocus",e)&&!i.isPartOfDialog(e.target))return window.setTimeout(i.props.onClose,0)},i.handleKeyDown=function(e){"Escape"===e.key&&i.shouldDialogCloseOnEvent("closeOnEscKey",e)&&window.setTimeout(i.props.onClose,0),i.props.onKeyDown&&i.props.onKeyDown(e)},i.handleInsideClick=function(e){i.shouldDialogCloseOnEvent("closeOnInsideClick",e)&&window.setTimeout(i.props.onClose,0)},i.handleOutsideClick=function(e){i.shouldDialogCloseOnEvent("closeOnOutsideClick",e)&&!i.isPartOfDialog(e.target)&&window.setTimeout(i.props.onClose,0)},i.handleOutsideScrollWheel=function(e){i.shouldDialogCloseOnEvent("closeOnOutsideScroll",e)&&!i.isPartOfDialog(e.target)&&window.setTimeout(i.props.onClose,0)},l=s,n(i,l)}return s(o,e),y(o,[{key:"isPartOfDialog",value:function(e){if(!e||e===window)return!1;var o=[this.$wrapper].concat(b.call(this.$wrapper.querySelectorAll("["+c.a.PORTAL_DATA_ATTRIBUTE+"]")).map(function(e){return document.getElementById(e.getAttribute(c.a.PORTAL_DATA_ATTRIBUTE))})),r=e.nodeType!==Node.ELEMENT_NODE?e.parentNode:e;return o.some(function(e){return e.contains(r)})}},{key:"componentDidMount",value:function(){window.addEventListener("click",this.handleOutsideClick,!0),window.addEventListener("contextmenu",this.handleOutsideClick,!0),window.addEventListener("focus",this.handleFocus,!0),window.addEventListener("scroll",this.handleOutsideScrollWheel,!0),window.addEventListener("wheel",this.handleOutsideScrollWheel,!0),this.props.captureFocus&&!this.isPartOfDialog(document.activeElement)&&this.$dialog.focus()}},{key:"componentWillUnmount",value:function(){window.removeEventListener("click",this.handleOutsideClick,!0),window.removeEventListener("contextmenu",this.handleOutsideClick,!0),window.removeEventListener("focus",this.handleFocus,!0),window.removeEventListener("scroll",this.handleOutsideScrollWheel,!0),window.removeEventListener("wheel",this.handleOutsideScrollWheel,!0)}},{key:"shouldDialogCloseOnEvent",value:function(e,o){return O(this.props[e])?this.props[e](o):this.props[e]}},{key:"renderBody",value:function(){return l.a.createElement("div",h({},this.props.bodyProps,{id:this.props.bodyProps.id||this.uuidBody,className:p()("b-dialog-body",this.props.bodyProps.className)}),this.props.children)}},{key:"renderFooter",value:function(){if(this.props.footer)return l.a.createElement("footer",h({},this.props.footerProps,{className:p()("b-dialog-footer",this.props.footerProps.className)}),this.props.footer)}},{key:"renderHeader",value:function(){if(this.props.header)return l.a.createElement("header",h({},this.props.headerProps,{id:this.props.headerProps.id||this.uuidHeader,className:p()("b-dialog-header",this.props.headerProps.className)}),this.props.header)}},{key:"renderFocusBoundary",value:function(){if(this.props.captureFocus)return l.a.createElement("div",{className:"b-offscreen",tabIndex:"0","aria-hidden":"true"}," ")}},{key:"render",value:function(){var e=this;return l.a.createElement("div",h({},this.props.wrapperProps,{ref:function(o){return e.$wrapper=o},className:p()("b-dialog-wrapper",this.props.wrapperProps.className),tabIndex:"0"}),this.renderFocusBoundary(),this.props.before,l.a.createElement("div",h({},r.i(d.a)(this.props,o.internalKeys),{ref:function(o){return e.$dialog=o},className:p()("b-dialog",this.props.className),onClick:this.handleInsideClick,onKeyDown:this.handleKeyDown,role:"dialog","aria-labelledby":this.uuidHeader,"aria-describedby":this.uuidBody,tabIndex:"0"}),this.renderHeader(),this.renderBody(),this.renderFooter()),this.props.after,this.renderFocusBoundary())}}]),o}(l.a.PureComponent);w.propTypes={after:i.PropTypes.node,before:i.PropTypes.node,bodyProps:i.PropTypes.object,captureFocus:i.PropTypes.bool,children:i.PropTypes.node,closeOnEscKey:i.PropTypes.oneOfType([i.PropTypes.bool,i.PropTypes.func]),closeOnInsideClick:i.PropTypes.oneOfType([i.PropTypes.bool,i.PropTypes.func]),closeOnOutsideClick:i.PropTypes.oneOfType([i.PropTypes.bool,i.PropTypes.func]),closeOnOutsideFocus:i.PropTypes.oneOfType([i.PropTypes.bool,i.PropTypes.func]),closeOnOutsideScroll:i.PropTypes.oneOfType([i.PropTypes.bool,i.PropTypes.func]),footer:i.PropTypes.node,footerProps:i.PropTypes.object,header:i.PropTypes.node,headerProps:i.PropTypes.object,onClose:i.PropTypes.func,wrapperProps:i.PropTypes.object},w.defaultProps={after:null,before:null,bodyProps:{},captureFocus:!0,children:null,closeOnEscKey:!1,closeOnInsideClick:!1,closeOnOutsideClick:!1,closeOnOutsideFocus:!1,closeOnOutsideScroll:!1,footer:null,footerProps:{},header:null,headerProps:{},onClose:P,onKeyDown:P,wrapperProps:{}},w.internalKeys=Object.keys(w.defaultProps),o.default=w}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIDhmZmEyNWM2MTYwMGU4YmJmOTQ0Iiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvYm91bmRsZXNzLXV0aWxzLXV1aWQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXBvcnRhbFwifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJjbGFzc25hbWVzXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0XCJ9Iiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy1kaWFsb2cvaW5kZXguanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJ2YWx1ZSIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiX193ZWJwYWNrX2V4cG9ydHNfXyIsIm9taXRLZXlzRnJvbVNvdXJjZU9iamVjdCIsInNvdXJjZSIsIm9taXR0ZWRLZXlzIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwia2V5cyIsInJlZHVjZSIsImhhc2giLCJrZXkiLCJpbmRleE9mIiwidXVpZCIsInJlcGxhY2UiLCJhIiwiTWF0aCIsInJhbmRvbSIsInRvU3RyaW5nIiwicmVxdWlyZSIsIl9jbGFzc0NhbGxDaGVjayIsImluc3RhbmNlIiwiQ29uc3RydWN0b3IiLCJUeXBlRXJyb3IiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiIsInNlbGYiLCJSZWZlcmVuY2VFcnJvciIsIl9pbmhlcml0cyIsInN1YkNsYXNzIiwic3VwZXJDbGFzcyIsImNyZWF0ZSIsImNvbnN0cnVjdG9yIiwid3JpdGFibGUiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3BvcnRhbF9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc19wb3J0YWxfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfdXRpbHNfdXVpZF9fIiwiX2V4dGVuZHMiLCJhc3NpZ24iLCJ0YXJnZXQiLCJfY3JlYXRlQ2xhc3MiLCJkZWZpbmVQcm9wZXJ0aWVzIiwicHJvcHMiLCJkZXNjcmlwdG9yIiwicHJvdG9Qcm9wcyIsInN0YXRpY1Byb3BzIiwiaXNGdW5jdGlvbiIsIngiLCJub29wIiwidG9BcnJheSIsIkFycmF5Iiwic2xpY2UiLCJEaWFsb2ciLCJfUmVhY3QkUHVyZUNvbXBvbmVudCIsIl9yZWYiLCJfdGVtcCIsIl90aGlzIiwiX3JldCIsInRoaXMiLCJfbGVuIiwiYXJncyIsIl9rZXkiLCJnZXRQcm90b3R5cGVPZiIsImFwcGx5IiwiY29uY2F0IiwibW91bnRlZCIsInV1aWRIZWFkZXIiLCJ1dWlkQm9keSIsImhhbmRsZUZvY3VzIiwibmF0aXZlRXZlbnQiLCJjYXB0dXJlRm9jdXMiLCJwcmV2aW91cyIsImV4cGxpY2l0T3JpZ2luYWxUYXJnZXQiLCJyZWxhdGVkVGFyZ2V0IiwiaXNQYXJ0T2ZEaWFsb2ciLCJwcmV2ZW50RGVmYXVsdCIsImZvY3VzIiwic2hvdWxkRGlhbG9nQ2xvc2VPbkV2ZW50Iiwid2luZG93Iiwic2V0VGltZW91dCIsIm9uQ2xvc2UiLCJoYW5kbGVLZXlEb3duIiwiZXZlbnQiLCJvbktleURvd24iLCJoYW5kbGVJbnNpZGVDbGljayIsImhhbmRsZU91dHNpZGVDbGljayIsImhhbmRsZU91dHNpZGVTY3JvbGxXaGVlbCIsIm5vZGUiLCJyb290cyIsIiR3cmFwcGVyIiwicXVlcnlTZWxlY3RvckFsbCIsIlBPUlRBTF9EQVRBX0FUVFJJQlVURSIsIm1hcCIsImRvbSIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJnZXRBdHRyaWJ1dGUiLCJlbGVtZW50Iiwibm9kZVR5cGUiLCJOb2RlIiwiRUxFTUVOVF9OT0RFIiwicGFyZW50Tm9kZSIsInNvbWUiLCJjb250YWlucyIsImFkZEV2ZW50TGlzdGVuZXIiLCJhY3RpdmVFbGVtZW50IiwiJGRpYWxvZyIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJwcm9wIiwiY3JlYXRlRWxlbWVudCIsImJvZHlQcm9wcyIsImlkIiwiY2xhc3NOYW1lIiwiY2hpbGRyZW4iLCJmb290ZXIiLCJmb290ZXJQcm9wcyIsImhlYWRlciIsImhlYWRlclByb3BzIiwidGFiSW5kZXgiLCJhcmlhLWhpZGRlbiIsIl90aGlzMiIsIndyYXBwZXJQcm9wcyIsInJlZiIsInJlbmRlckZvY3VzQm91bmRhcnkiLCJiZWZvcmUiLCJpbnRlcm5hbEtleXMiLCJvbkNsaWNrIiwicm9sZSIsImFyaWEtbGFiZWxsZWRieSIsImFyaWEtZGVzY3JpYmVkYnkiLCJyZW5kZXJIZWFkZXIiLCJyZW5kZXJCb2R5IiwicmVuZGVyRm9vdGVyIiwiYWZ0ZXIiLCJQdXJlQ29tcG9uZW50IiwicHJvcFR5cGVzIiwiYm9vbCIsImNsb3NlT25Fc2NLZXkiLCJvbmVPZlR5cGUiLCJmdW5jIiwiY2xvc2VPbkluc2lkZUNsaWNrIiwiY2xvc2VPbk91dHNpZGVDbGljayIsImNsb3NlT25PdXRzaWRlRm9jdXMiLCJjbG9zZU9uT3V0c2lkZVNjcm9sbCIsImRlZmF1bHRQcm9wcyJdLCJtYXBwaW5ncyI6IkFBQUFBLE9BQU9DLFFBQ0UsU0FBVUMsR0NHbkIsUUFBQUMsR0FBQUMsR0FHQSxHQUFBQyxFQUFBRCxHQUNBLE1BQUFDLEdBQUFELEdBQUFILE9BR0EsSUFBQUQsR0FBQUssRUFBQUQsSUFDQUUsRUFBQUYsRUFDQUcsR0FBQSxFQUNBTixXQVVBLE9BTkFDLEdBQUFFLEdBQUFJLEtBQUFSLEVBQUFDLFFBQUFELElBQUFDLFFBQUFFLEdBR0FILEVBQUFPLEdBQUEsRUFHQVAsRUFBQUMsUUF2QkEsR0FBQUksS0ErREEsT0FuQ0FGLEdBQUFNLEVBQUFQLEVBR0FDLEVBQUFPLEVBQUFMLEVBR0FGLEVBQUFHLEVBQUEsU0FBQUssR0FBMkMsTUFBQUEsSUFHM0NSLEVBQUFTLEVBQUEsU0FBQVgsRUFBQVksRUFBQUMsR0FDQVgsRUFBQVksRUFBQWQsRUFBQVksSUFDQUcsT0FBQUMsZUFBQWhCLEVBQUFZLEdBQ0FLLGNBQUEsRUFDQUMsWUFBQSxFQUNBQyxJQUFBTixLQU1BWCxFQUFBa0IsRUFBQSxTQUFBckIsR0FDQSxHQUFBYyxHQUFBZCxLQUFBc0IsV0FDQSxXQUEyQixNQUFBdEIsR0FBQSxTQUMzQixXQUFpQyxNQUFBQSxHQUVqQyxPQURBRyxHQUFBUyxFQUFBRSxFQUFBLElBQUFBLEdBQ0FBLEdBSUFYLEVBQUFZLEVBQUEsU0FBQVEsRUFBQUMsR0FBc0QsTUFBQVIsUUFBQVMsVUFBQUMsZUFBQWxCLEtBQUFlLEVBQUFDLElBR3REckIsRUFBQXdCLEVBQUEsR0FHQXhCLElBQUF5QixFQUFBLEtET00sU0FBVTVCLEVBQVE2QixFQUFxQjFCLEdBRTdDLFlFdEVlLFNBQVMyQixHQUF5QkMsR0FBMEIsR0FBbEJDLEdBQWtCQyxVQUFBQyxPQUFBLEdBQUFDLFNBQUFGLFVBQUEsR0FBQUEsVUFBQSxLQUN2RSxPQUFPakIsUUFBT29CLEtBQUtMLEdBQVFNLE9BQU8sU0FBOEJDLEVBQU1DLEdBS2xFLE1BSklQLEdBQVlRLFFBQVFELE1BQVMsSUFDN0JELEVBQUtDLEdBQU9SLEVBQU9RLElBR2hCRCxPRmlFa0JULEVBQXVCLEVBQUlDLEdBS3RELFNBQVU5QixFQUFRNkIsRUFBcUIxQixHQUU3QyxZR3hFZSxTQUFTc0MsS0FFcEIsTUFBTyxPQUFTLE1BQUssS0FBSyxLQUFLLEtBQUssTUFBT0MsUUFBUSxTQUFTLFNBQUFDLEdBQUEsT0FBSUEsRUFBZ0IsR0FBZEMsS0FBS0MsVUFBYUYsRUFBRSxHQUFHRyxTQUFTLE1IdUVyRWpCLEVBQXVCLEVBQUlZLEdBS3RELFNBQVV6QyxFQUFRQyxHSXZGeEJELEVBQUFDLFFBQUE4QyxRQUFBLHFCSjZGTSxTQUFVL0MsRUFBUUMsR0s3RnhCRCxFQUFBQyxRQUFBOEMsUUFBQSxlTG1HTSxTQUFVL0MsRUFBUUMsR01uR3hCRCxFQUFBQyxRQUFBOEMsUUFBQSxVTnlHTSxTQUFVL0MsRUFBUTZCLEVBQXFCMUIsR0FFN0MsWUFVOHRCLFNBQVM2QyxHQUFnQkMsRUFBU0MsR0FBYSxLQUFLRCxZQUFvQkMsSUFBYyxLQUFNLElBQUlDLFdBQVUscUNBQXVDLFFBQVNDLEdBQTJCQyxFQUFLN0MsR0FBTSxJQUFJNkMsRUFBTSxLQUFNLElBQUlDLGdCQUFlLDREQUE4RCxRQUFPOUMsR0FBcUIsZ0JBQVBBLElBQStCLGtCQUFQQSxHQUF3QjZDLEVBQUw3QyxFQUFXLFFBQVMrQyxHQUFVQyxFQUFTQyxHQUFZLEdBQXVCLGtCQUFiQSxJQUFzQyxPQUFiQSxFQUFtQixLQUFNLElBQUlOLFdBQVUsaUVBQWtFTSxHQUFhRCxHQUFTL0IsVUFBVVQsT0FBTzBDLE9BQU9ELEdBQVlBLEVBQVdoQyxXQUFXa0MsYUFBYWhELE1BQU02QyxFQUFTckMsWUFBVyxFQUFNeUMsVUFBUyxFQUFLMUMsY0FBYSxLQUFXdUMsSUFBV3pDLE9BQU82QyxlQUFlN0MsT0FBTzZDLGVBQWVMLEVBQVNDLEdBQVlELEVBQVNNLFVBQVVMLEdBVGhnRHpDLE9BQU9DLGVBQWVZLEVBQXFCLGNBQWdCbEIsT0FBTyxHQUM3QyxJQUFJb0QsR0FBc0M1RCxFQUFvQixHQUMxRDZELEVBQThDN0QsRUFBb0JrQixFQUFFMEMsR0FDcEVFLEVBQTJDOUQsRUFBb0IsR0FDL0QrRCxFQUFtRC9ELEVBQW9Ca0IsRUFBRTRDLEdBQ3pFRSxFQUFpRGhFLEVBQW9CLEdBQ3JFaUUsRUFBeURqRSxFQUFvQmtCLEVBQUU4QyxHQUMvRUUsRUFBMERsRSxFQUFvQixHQUM5RW1FLEVBQXFEbkUsRUFBb0IsR0FDOUZvRSxFQUFTdkQsT0FBT3dELFFBQVEsU0FBU0MsR0FBUSxJQUFJLEdBQUluRSxHQUFFLEVBQUVBLEVBQUUyQixVQUFVQyxPQUFPNUIsSUFBSSxDQUFDLEdBQUl5QixHQUFPRSxVQUFVM0IsRUFBRyxLQUFJLEdBQUlpQyxLQUFPUixHQUFXZixPQUFPUyxVQUFVQyxlQUFlbEIsS0FBS3VCLEVBQU9RLEtBQU1rQyxFQUFPbEMsR0FBS1IsRUFBT1EsSUFBUSxNQUFPa0MsSUFBYUMsRUFBYSxXQUFXLFFBQVNDLEdBQWlCRixFQUFPRyxHQUFPLElBQUksR0FBSXRFLEdBQUUsRUFBRUEsRUFBRXNFLEVBQU0xQyxPQUFPNUIsSUFBSSxDQUFDLEdBQUl1RSxHQUFXRCxFQUFNdEUsRUFBR3VFLEdBQVcxRCxXQUFXMEQsRUFBVzFELGFBQVksRUFBTTBELEVBQVczRCxjQUFhLEVBQVEsU0FBVTJELEtBQVdBLEVBQVdqQixVQUFTLEdBQUs1QyxPQUFPQyxlQUFld0QsRUFBT0ksRUFBV3RDLElBQUlzQyxJQUFjLE1BQU8sVUFBUzNCLEVBQVk0QixFQUFXQyxHQUF1SSxNQUF2SEQsSUFBV0gsRUFBaUJ6QixFQUFZekIsVUFBVXFELEdBQWVDLEdBQVlKLEVBQWlCekIsRUFBWTZCLEdBQW9CN0IsTU85R3RzQjhCLEVBQWEsU0FBQ0MsR0FBRCxNQUFvQixrQkFBTkEsSUFDM0JDLEVBQU8sYUFDUEMsRUFBVUMsTUFBTTNELFVBQVU0RCxNQWFYQyxFUCtGb29ELFNBQVNDLEdBQTZELFFBQVNELEtBQVMsR0FBSUUsR0FBU0MsRUFBTUMsRUFBTUMsQ0FBSzNDLEdBQWdCNEMsS0FBS04sRUFBUSxLQUFJLEdBQUlPLEdBQUs1RCxVQUFVQyxPQUFPNEQsRUFBS1YsTUFBTVMsR0FBTUUsRUFBSyxFQUFFQSxFQUFLRixFQUFLRSxJQUFRRCxFQUFLQyxHQUFNOUQsVUFBVThELEVBQU8sT0FBYU4sR0FBT0MsRUFBTXRDLEVBQTJCd0MsTUFBTUosRUFBS0YsRUFBT3hCLFdBQVc5QyxPQUFPZ0YsZUFBZVYsSUFBUzlFLEtBQUt5RixNQUFNVCxHQUFNSSxNQUFNTSxPQUFPSixLQUFlSixFTzJCMWlFUyxTQUFVLEVQM0JvakVULEVPOEI5akVVLFdBQWFqRyxFQUFBRyxFQUFBZ0UsRUFBQSxLUDlCaXFFb0IsRU8rQjlxRVcsU0FBV2xHLEVBQUFHLEVBQUFnRSxFQUFBLEtQL0JpeEVvQixFT3VFNXhFWSxZQUFjLFNBQUNDLEdBQ1gsR0FBS2IsRUFBS2QsTUFBTTRCLGFBQWhCLENBU0EsR0FBSUMsR0FBV0YsRUFBWUcsd0JBQTBCSCxFQUFZSSxhQUU3RGpCLEdBQUtrQixlQUFlSCxLQUFjZixFQUFLa0IsZUFBZUwsRUFBWTlCLFVBQ2xFOEIsRUFBWU0saUJBQ1pKLEVBQVNLLGFBWlQsSUFBSXBCLEVBQUtxQix5QkFBeUIsc0JBQXVCUixLQUFpQmIsRUFBS2tCLGVBQWVMLEVBQVk5QixRQUN0RyxNQUFPdUMsUUFBT0MsV0FBV3ZCLEVBQUtkLE1BQU1zQyxRQUFTLElQMUU2cEZ4QixFT3lGdHRGeUIsY0FBZ0IsU0FBQ0MsR0FDSyxXQUFkQSxFQUFNN0UsS0FDRm1ELEVBQUtxQix5QkFBeUIsZ0JBQWlCSyxJQUMvQ0osT0FBT0MsV0FBV3ZCLEVBQUtkLE1BQU1zQyxRQUFTLEdBSTFDeEIsRUFBS2QsTUFBTXlDLFdBQ1gzQixFQUFLZCxNQUFNeUMsVUFBVUQsSVBqR3E1RjFCLEVPcUdsN0Y0QixrQkFBb0IsU0FBQ0YsR0FDYjFCLEVBQUtxQix5QkFBeUIscUJBQXNCSyxJQUNwREosT0FBT0MsV0FBV3ZCLEVBQUtkLE1BQU1zQyxRQUFTLElQdkd1aEd4QixFTzJHcmtHNkIsbUJBQXFCLFNBQUNoQixHQUNkYixFQUFLcUIseUJBQXlCLHNCQUF1QlIsS0FBaUJiLEVBQUtrQixlQUFlTCxFQUFZOUIsU0FDdEd1QyxPQUFPQyxXQUFXdkIsRUFBS2QsTUFBTXNDLFFBQVMsSVA3R211R3hCLEVPaUhqeEc4Qix5QkFBMkIsU0FBQ2pCLEdBQ3BCYixFQUFLcUIseUJBQXlCLHVCQUF3QlIsS0FBaUJiLEVBQUtrQixlQUFlTCxFQUFZOUIsU0FDdkd1QyxPQUFPQyxXQUFXdkIsRUFBS2QsTUFBTXNDLFFBQVMsSVBuSHEyRHZCLEVBQWlsREYsRUFBT3JDLEVBQTJCc0MsRUFBTUMsR0FBd3pILE1BQWhwTHBDLEdBQVUrQixFQUFPQyxHQUE4MERiLEVBQWFZLElBQVMvQyxJQUFJLGlCQUFpQjVCLE1BQU0sU09pQ3JqSDhHLEdBQ1gsSUFBS0EsR0FBUUEsSUFBU1QsT0FBVSxPQUFPLENBRXZDLElBQU1VLElBQVM5QixLQUFLK0IsVUFBVXpCLE9BQzFCZixFQUFRM0UsS0FDSm9GLEtBQUsrQixTQUFTQyxpQkFBZCxJQUFtQ3hELEVBQUF6QixFQUFPa0Ysc0JBQTFDLE1BQ0ZDLElBQUksU0FBQ0MsR0FBRCxNQUFTQyxVQUFTQyxlQUFlRixFQUFJRyxhQUFhOUQsRUFBQXpCLEVBQU9rRiwyQkFHN0RNLEVBQVVWLEVBQUtXLFdBQWFDLEtBQUtDLGFBQWViLEVBQUtjLFdBQWFkLENBRXhFLE9BQU9DLEdBQU1jLEtBQUssU0FBQ1QsR0FBRCxNQUFTQSxHQUFJVSxTQUFTTixRUDVDaWlJNUYsSUFBSSxvQkFBb0I1QixNQUFNLFdPZ0R2bUlxRyxPQUFPMEIsaUJBQWlCLFFBQVM5QyxLQUFLMkIsb0JBQW9CLEdBQzFEUCxPQUFPMEIsaUJBQWlCLGNBQWU5QyxLQUFLMkIsb0JBQW9CLEdBQ2hFUCxPQUFPMEIsaUJBQWlCLFFBQVM5QyxLQUFLVSxhQUFhLEdBQ25EVSxPQUFPMEIsaUJBQWlCLFNBQVU5QyxLQUFLNEIsMEJBQTBCLEdBQ2pFUixPQUFPMEIsaUJBQWlCLFFBQVM5QyxLQUFLNEIsMEJBQTBCLEdBRTVENUIsS0FBS2hCLE1BQU00QixlQUFpQlosS0FBS2dCLGVBQWVvQixTQUFTVyxnQkFDekQvQyxLQUFLZ0QsUUFBUTlCLFdQdkR5aEp2RSxJQUFJLHVCQUF1QjVCLE1BQU0sV080RDNrSnFHLE9BQU82QixvQkFBb0IsUUFBU2pELEtBQUsyQixvQkFBb0IsR0FDN0RQLE9BQU82QixvQkFBb0IsY0FBZWpELEtBQUsyQixvQkFBb0IsR0FDbkVQLE9BQU82QixvQkFBb0IsUUFBU2pELEtBQUtVLGFBQWEsR0FDdERVLE9BQU82QixvQkFBb0IsU0FBVWpELEtBQUs0QiwwQkFBMEIsR0FDcEVSLE9BQU82QixvQkFBb0IsUUFBU2pELEtBQUs0QiwwQkFBMEIsTVBoRTYzSmpGLElBQUksMkJBQTJCNUIsTUFBTSxTT21FaDlKbUksRUFBTTFCLEdBQzNCLE1BQU9wQyxHQUFXWSxLQUFLaEIsTUFBTWtFLElBQVNsRCxLQUFLaEIsTUFBTWtFLEdBQU0xQixHQUFTeEIsS0FBS2hCLE1BQU1rRSxNUHBFeWhLdkcsSUFBSSxhQUFhNUIsTUFBTSxXT3dIM25LLE1BQ0lxRCxHQUFBckIsRUFBQW9HLGNBQUEsTUFBQXhFLEtBQ1FxQixLQUFLaEIsTUFBTW9FLFdBQ2ZDLEdBQUlyRCxLQUFLaEIsTUFBTW9FLFVBQVVDLElBQU1yRCxLQUFLUyxTQUNwQzZDLFVBQVdoRixJQUFHLGdCQUFpQjBCLEtBQUtoQixNQUFNb0UsVUFBVUUsYUFDbkR0RCxLQUFLaEIsTUFBTXVFLGFQN0gwNUs1RyxJQUFJLGVBQWU1QixNQUFNLFdPbUl2OEssR0FBSWlGLEtBQUtoQixNQUFNd0UsT0FDWCxNQUNJcEYsR0FBQXJCLEVBQUFvRyxjQUFBLFNBQUF4RSxLQUNRcUIsS0FBS2hCLE1BQU15RSxhQUNmSCxVQUFXaEYsSUFBRyxrQkFBbUIwQixLQUFLaEIsTUFBTXlFLFlBQVlILGFBQ3ZEdEQsS0FBS2hCLE1BQU13RSxXUHhJd3RMN0csSUFBSSxlQUFlNUIsTUFBTSxXTytJendMLEdBQUlpRixLQUFLaEIsTUFBTTBFLE9BQ1gsTUFDSXRGLEdBQUFyQixFQUFBb0csY0FBQSxTQUFBeEUsS0FDUXFCLEtBQUtoQixNQUFNMkUsYUFDZk4sR0FBSXJELEtBQUtoQixNQUFNMkUsWUFBWU4sSUFBTXJELEtBQUtRLFdBQ3RDOEMsVUFBV2hGLElBQUcsa0JBQW1CMEIsS0FBS2hCLE1BQU0yRSxZQUFZTCxhQUN2RHRELEtBQUtoQixNQUFNMEUsV1BySndrTS9HLElBQUksc0JBQXNCNUIsTUFBTSxXTzRKaG9NLEdBQUlpRixLQUFLaEIsTUFBTTRCLGFBQ1gsTUFDSXhDLEdBQUFyQixFQUFBb0csY0FBQSxPQUFLRyxVQUFVLGNBQWNNLFNBQVMsSUFBSUMsY0FBWSxRQUF0RCxRUDlKcTBNbEgsSUFBSSxTQUFTNUIsTUFBTSxXT21LMzFNLEdBQUErSSxHQUFBOUQsSUFDTCxPQUNJNUIsR0FBQXJCLEVBQUFvRyxjQUFBLE1BQUF4RSxLQUNRcUIsS0FBS2hCLE1BQU0rRSxjQUNmQyxJQUFLLFNBQUNuQyxHQUFELE1BQVdpQyxHQUFLL0IsU0FBV0YsR0FDaEN5QixVQUFXaEYsSUFBRyxtQkFBb0IwQixLQUFLaEIsTUFBTStFLGFBQWFULFdBQzFETSxTQUFTLE1BQ1I1RCxLQUFLaUUsc0JBRUxqRSxLQUFLaEIsTUFBTWtGLE9BRVo5RixFQUFBckIsRUFBQW9HLGNBQUEsTUFBQXhFLEtBQ1FwRSxFQUFBRyxFQUFBK0QsRUFBQSxHQUFLdUIsS0FBS2hCLE1BQU9VLEVBQU95RSxlQUM1QkgsSUFBSyxTQUFDbkMsR0FBRCxNQUFXaUMsR0FBS2QsUUFBVW5CLEdBQy9CeUIsVUFBV2hGLElBQUcsV0FBWTBCLEtBQUtoQixNQUFNc0UsV0FDckNjLFFBQVNwRSxLQUFLMEIsa0JBQ2RELFVBQVd6QixLQUFLdUIsY0FDaEI4QyxLQUFLLFNBQ0xDLGtCQUFpQnRFLEtBQUtRLFdBQ3RCK0QsbUJBQWtCdkUsS0FBS1MsU0FDdkJtRCxTQUFTLE1BQ1I1RCxLQUFLd0UsZUFDTHhFLEtBQUt5RSxhQUNMekUsS0FBSzBFLGdCQUdUMUUsS0FBS2hCLE1BQU0yRixNQUVYM0UsS0FBS2lFLDJCUC9MeXpPdkUsR08vRjN5T3RCLEVBQUFyQixFQUFNNkgsY0FBckJsRixHQUNWbUYsV0FJSEYsTUFBT3hHLEVBQUEsVUFBVTBELEtBS2pCcUMsT0FBUS9GLEVBQUEsVUFBVTBELEtBS2xCdUIsVUFBV2pGLEVBQUEsVUFBVXhDLE9BS3JCaUYsYUFBY3pDLEVBQUEsVUFBVTJHLEtBRXhCdkIsU0FBVXBGLEVBQUEsVUFBVTBELEtBTXBCa0QsY0FBZTVHLEVBQUEsVUFBVTZHLFdBQ3JCN0csRUFBQSxVQUFVMkcsS0FDVjNHLEVBQUEsVUFBVThHLE9BT2RDLG1CQUFvQi9HLEVBQUEsVUFBVTZHLFdBQzFCN0csRUFBQSxVQUFVMkcsS0FDVjNHLEVBQUEsVUFBVThHLE9BT2RFLG9CQUFxQmhILEVBQUEsVUFBVTZHLFdBQzNCN0csRUFBQSxVQUFVMkcsS0FDVjNHLEVBQUEsVUFBVThHLE9BT2RHLG9CQUFxQmpILEVBQUEsVUFBVTZHLFdBQzNCN0csRUFBQSxVQUFVMkcsS0FDVjNHLEVBQUEsVUFBVThHLE9BT2RJLHFCQUFzQmxILEVBQUEsVUFBVTZHLFdBQzVCN0csRUFBQSxVQUFVMkcsS0FDVjNHLEVBQUEsVUFBVThHLE9BTWR6QixPQUFRckYsRUFBQSxVQUFVMEQsS0FLbEI0QixZQUFhdEYsRUFBQSxVQUFVeEMsT0FLdkIrSCxPQUFRdkYsRUFBQSxVQUFVMEQsS0FLbEI4QixZQUFheEYsRUFBQSxVQUFVeEMsT0FLdkIyRixRQUFTbkQsRUFBQSxVQUFVOEcsS0FLbkJsQixhQUFjNUYsRUFBQSxVQUFVeEMsUUFqR1grRCxFQW9HVjRGLGNBQ0hYLE1BQU8sS0FDUFQsT0FBUSxLQUNSZCxhQUNBeEMsY0FBYyxFQUNkMkMsU0FBVSxLQUNWd0IsZUFBZSxFQUNmRyxvQkFBb0IsRUFDcEJDLHFCQUFxQixFQUNyQkMscUJBQXFCLEVBQ3JCQyxzQkFBc0IsRUFDdEI3QixPQUFRLEtBQ1JDLGVBQ0FDLE9BQVEsS0FDUkMsZUFDQXJDLFFBQVNoQyxFQUNUbUMsVUFBV25DLEVBQ1h5RSxpQkFySGFyRSxFQXdIVnlFLGFBQWUvSSxPQUFPb0IsS0FBS2tELEVBQU80RixjUHpCdTNTckosRUFBNkIsUU8vRjU2U3lEIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPVxuLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbi8qKioqKiovIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuLyoqKioqKi8gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuLyoqKioqKi8gXHRcdFx0XHRnZXQ6IGdldHRlclxuLyoqKioqKi8gXHRcdFx0fSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4vKioqKioqLyBcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDUpO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgZXhwb3J0IChpbW11dGFibGUpICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gb21pdEtleXNGcm9tU291cmNlT2JqZWN0O1xuZnVuY3Rpb24gb21pdEtleXNGcm9tU291cmNlT2JqZWN0KHNvdXJjZSl7dmFyIG9taXR0ZWRLZXlzPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dW5kZWZpbmVkP2FyZ3VtZW50c1sxXTpbXTtyZXR1cm4gT2JqZWN0LmtleXMoc291cmNlKS5yZWR1Y2UoZnVuY3Rpb24gcmVsb2NhdGVBY2NlcHRlZEtleXMoaGFzaCxrZXkpe2lmKG9taXR0ZWRLZXlzLmluZGV4T2Yoa2V5KT09PS0xKXtoYXNoW2tleV09c291cmNlW2tleV07fXJldHVybiBoYXNoO30se30pO31cblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBleHBvcnQgKGltbXV0YWJsZSkgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSB1dWlkO1xuZnVuY3Rpb24gdXVpZCgpe3JldHVybidiLScrKFsxZTddKy0xZTMrLTRlMystOGUzKy0xZTExKS5yZXBsYWNlKC9bMDE4XS9nLGZ1bmN0aW9uKGEpe3JldHVybihhXk1hdGgucmFuZG9tKCkqMTY+PmEvNCkudG9TdHJpbmcoMTYpO30pO31cblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy1wb3J0YWxcIik7XG5cbi8qKiovIH0pLFxuLyogMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpO1xuXG4vKioqLyB9KSxcbi8qIDQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cbi8qKiovIH0pLFxuLyogNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShfX3dlYnBhY2tfZXhwb3J0c19fLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfcG9ydGFsX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfcG9ydGFsX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3BvcnRhbF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfYm91bmRsZXNzX3V0aWxzX3V1aWRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG52YXIgX2V4dGVuZHM9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odGFyZ2V0KXtmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXt2YXIgc291cmNlPWFyZ3VtZW50c1tpXTtmb3IodmFyIGtleSBpbiBzb3VyY2Upe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2Usa2V5KSl7dGFyZ2V0W2tleV09c291cmNlW2tleV07fX19cmV0dXJuIHRhcmdldDt9O3ZhciBfY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCxwcm9wcyl7Zm9yKHZhciBpPTA7aTxwcm9wcy5sZW5ndGg7aSsrKXt2YXIgZGVzY3JpcHRvcj1wcm9wc1tpXTtkZXNjcmlwdG9yLmVudW1lcmFibGU9ZGVzY3JpcHRvci5lbnVtZXJhYmxlfHxmYWxzZTtkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZT10cnVlO2lmKFwidmFsdWVcImluIGRlc2NyaXB0b3IpZGVzY3JpcHRvci53cml0YWJsZT10cnVlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsZGVzY3JpcHRvci5rZXksZGVzY3JpcHRvcik7fX1yZXR1cm4gZnVuY3Rpb24oQ29uc3RydWN0b3IscHJvdG9Qcm9wcyxzdGF0aWNQcm9wcyl7aWYocHJvdG9Qcm9wcylkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSxwcm90b1Byb3BzKTtpZihzdGF0aWNQcm9wcylkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLHN0YXRpY1Byb3BzKTtyZXR1cm4gQ29uc3RydWN0b3I7fTt9KCk7ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLENvbnN0cnVjdG9yKXtpZighKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO319ZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZixjYWxsKXtpZighc2VsZil7dGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO31yZXR1cm4gY2FsbCYmKHR5cGVvZiBjYWxsPT09XCJvYmplY3RcInx8dHlwZW9mIGNhbGw9PT1cImZ1bmN0aW9uXCIpP2NhbGw6c2VsZjt9ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLHN1cGVyQ2xhc3Mpe2lmKHR5cGVvZiBzdXBlckNsYXNzIT09XCJmdW5jdGlvblwiJiZzdXBlckNsYXNzIT09bnVsbCl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIrdHlwZW9mIHN1cGVyQ2xhc3MpO31zdWJDbGFzcy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzJiZzdXBlckNsYXNzLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnN1YkNsYXNzLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX19KTtpZihzdXBlckNsYXNzKU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3Msc3VwZXJDbGFzcyk6c3ViQ2xhc3MuX19wcm90b19fPXN1cGVyQ2xhc3M7fXZhciBpc0Z1bmN0aW9uPWZ1bmN0aW9uIGlzRnVuY3Rpb24oeCl7cmV0dXJuIHR5cGVvZiB4PT09J2Z1bmN0aW9uJzt9O3ZhciBub29wPWZ1bmN0aW9uIG5vb3AoKXt9O3ZhciB0b0FycmF5PUFycmF5LnByb3RvdHlwZS5zbGljZTt2YXIgRGlhbG9nPWZ1bmN0aW9uKF9SZWFjdCRQdXJlQ29tcG9uZW50KXtfaW5oZXJpdHMoRGlhbG9nLF9SZWFjdCRQdXJlQ29tcG9uZW50KTtmdW5jdGlvbiBEaWFsb2coKXt2YXIgX3JlZjt2YXIgX3RlbXAsX3RoaXMsX3JldDtfY2xhc3NDYWxsQ2hlY2sodGhpcyxEaWFsb2cpO2Zvcih2YXIgX2xlbj1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkoX2xlbiksX2tleT0wO19rZXk8X2xlbjtfa2V5Kyspe2FyZ3NbX2tleV09YXJndW1lbnRzW19rZXldO31yZXR1cm4gX3JldD0oX3RlbXA9KF90aGlzPV9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKF9yZWY9RGlhbG9nLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKERpYWxvZykpLmNhbGwuYXBwbHkoX3JlZixbdGhpc10uY29uY2F0KGFyZ3MpKSksX3RoaXMpLF90aGlzLm1vdW50ZWQ9ZmFsc2UsX3RoaXMudXVpZEhlYWRlcj1fX3dlYnBhY2tfcmVxdWlyZV9fLmkoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X2JvdW5kbGVzc191dGlsc191dWlkX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKCksX3RoaXMudXVpZEJvZHk9X193ZWJwYWNrX3JlcXVpcmVfXy5pKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfdXRpbHNfdXVpZF9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKSgpLF90aGlzLmhhbmRsZUZvY3VzPWZ1bmN0aW9uKG5hdGl2ZUV2ZW50KXtpZighX3RoaXMucHJvcHMuY2FwdHVyZUZvY3VzKXtpZihfdGhpcy5zaG91bGREaWFsb2dDbG9zZU9uRXZlbnQoJ2Nsb3NlT25PdXRzaWRlRm9jdXMnLG5hdGl2ZUV2ZW50KSYmIV90aGlzLmlzUGFydE9mRGlhbG9nKG5hdGl2ZUV2ZW50LnRhcmdldCkpe3JldHVybiB3aW5kb3cuc2V0VGltZW91dChfdGhpcy5wcm9wcy5vbkNsb3NlLDApO31yZXR1cm47fXZhciBwcmV2aW91cz1uYXRpdmVFdmVudC5leHBsaWNpdE9yaWdpbmFsVGFyZ2V0fHxuYXRpdmVFdmVudC5yZWxhdGVkVGFyZ2V0O2lmKF90aGlzLmlzUGFydE9mRGlhbG9nKHByZXZpb3VzKSYmIV90aGlzLmlzUGFydE9mRGlhbG9nKG5hdGl2ZUV2ZW50LnRhcmdldCkpe25hdGl2ZUV2ZW50LnByZXZlbnREZWZhdWx0KCk7cHJldmlvdXMuZm9jdXMoKTt9fSxfdGhpcy5oYW5kbGVLZXlEb3duPWZ1bmN0aW9uKGV2ZW50KXtpZihldmVudC5rZXk9PT0nRXNjYXBlJyl7aWYoX3RoaXMuc2hvdWxkRGlhbG9nQ2xvc2VPbkV2ZW50KCdjbG9zZU9uRXNjS2V5JyxldmVudCkpe3dpbmRvdy5zZXRUaW1lb3V0KF90aGlzLnByb3BzLm9uQ2xvc2UsMCk7fX1pZihfdGhpcy5wcm9wcy5vbktleURvd24pe190aGlzLnByb3BzLm9uS2V5RG93bihldmVudCk7fX0sX3RoaXMuaGFuZGxlSW5zaWRlQ2xpY2s9ZnVuY3Rpb24oZXZlbnQpe2lmKF90aGlzLnNob3VsZERpYWxvZ0Nsb3NlT25FdmVudCgnY2xvc2VPbkluc2lkZUNsaWNrJyxldmVudCkpe3dpbmRvdy5zZXRUaW1lb3V0KF90aGlzLnByb3BzLm9uQ2xvc2UsMCk7fX0sX3RoaXMuaGFuZGxlT3V0c2lkZUNsaWNrPWZ1bmN0aW9uKG5hdGl2ZUV2ZW50KXtpZihfdGhpcy5zaG91bGREaWFsb2dDbG9zZU9uRXZlbnQoJ2Nsb3NlT25PdXRzaWRlQ2xpY2snLG5hdGl2ZUV2ZW50KSYmIV90aGlzLmlzUGFydE9mRGlhbG9nKG5hdGl2ZUV2ZW50LnRhcmdldCkpe3dpbmRvdy5zZXRUaW1lb3V0KF90aGlzLnByb3BzLm9uQ2xvc2UsMCk7fX0sX3RoaXMuaGFuZGxlT3V0c2lkZVNjcm9sbFdoZWVsPWZ1bmN0aW9uKG5hdGl2ZUV2ZW50KXtpZihfdGhpcy5zaG91bGREaWFsb2dDbG9zZU9uRXZlbnQoJ2Nsb3NlT25PdXRzaWRlU2Nyb2xsJyxuYXRpdmVFdmVudCkmJiFfdGhpcy5pc1BhcnRPZkRpYWxvZyhuYXRpdmVFdmVudC50YXJnZXQpKXt3aW5kb3cuc2V0VGltZW91dChfdGhpcy5wcm9wcy5vbkNsb3NlLDApO319LF90ZW1wKSxfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcyxfcmV0KTt9X2NyZWF0ZUNsYXNzKERpYWxvZyxbe2tleTonaXNQYXJ0T2ZEaWFsb2cnLHZhbHVlOmZ1bmN0aW9uIGlzUGFydE9mRGlhbG9nKG5vZGUpe2lmKCFub2RlfHxub2RlPT09d2luZG93KXtyZXR1cm4gZmFsc2U7fXZhciByb290cz1bdGhpcy4kd3JhcHBlcl0uY29uY2F0KHRvQXJyYXkuY2FsbCh0aGlzLiR3cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ1snK19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfcG9ydGFsX19fZGVmYXVsdC5hLlBPUlRBTF9EQVRBX0FUVFJJQlVURSsnXScpKS5tYXAoZnVuY3Rpb24oZG9tKXtyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZG9tLmdldEF0dHJpYnV0ZShfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3BvcnRhbF9fX2RlZmF1bHQuYS5QT1JUQUxfREFUQV9BVFRSSUJVVEUpKTt9KSk7dmFyIGVsZW1lbnQ9bm9kZS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFP25vZGUucGFyZW50Tm9kZTpub2RlO3JldHVybiByb290cy5zb21lKGZ1bmN0aW9uKGRvbSl7cmV0dXJuIGRvbS5jb250YWlucyhlbGVtZW50KTt9KTt9fSx7a2V5Oidjb21wb25lbnREaWRNb3VudCcsdmFsdWU6ZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHRoaXMuaGFuZGxlT3V0c2lkZUNsaWNrLHRydWUpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsdGhpcy5oYW5kbGVPdXRzaWRlQ2xpY2ssdHJ1ZSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJyx0aGlzLmhhbmRsZUZvY3VzLHRydWUpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLHRoaXMuaGFuZGxlT3V0c2lkZVNjcm9sbFdoZWVsLHRydWUpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd3aGVlbCcsdGhpcy5oYW5kbGVPdXRzaWRlU2Nyb2xsV2hlZWwsdHJ1ZSk7aWYodGhpcy5wcm9wcy5jYXB0dXJlRm9jdXMmJiF0aGlzLmlzUGFydE9mRGlhbG9nKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKXt0aGlzLiRkaWFsb2cuZm9jdXMoKTt9fX0se2tleTonY29tcG9uZW50V2lsbFVubW91bnQnLHZhbHVlOmZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLmhhbmRsZU91dHNpZGVDbGljayx0cnVlKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLHRoaXMuaGFuZGxlT3V0c2lkZUNsaWNrLHRydWUpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsdGhpcy5oYW5kbGVGb2N1cyx0cnVlKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJyx0aGlzLmhhbmRsZU91dHNpZGVTY3JvbGxXaGVlbCx0cnVlKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLHRoaXMuaGFuZGxlT3V0c2lkZVNjcm9sbFdoZWVsLHRydWUpO319LHtrZXk6J3Nob3VsZERpYWxvZ0Nsb3NlT25FdmVudCcsdmFsdWU6ZnVuY3Rpb24gc2hvdWxkRGlhbG9nQ2xvc2VPbkV2ZW50KHByb3AsZXZlbnQpe3JldHVybiBpc0Z1bmN0aW9uKHRoaXMucHJvcHNbcHJvcF0pP3RoaXMucHJvcHNbcHJvcF0oZXZlbnQpOnRoaXMucHJvcHNbcHJvcF07fX0se2tleToncmVuZGVyQm9keScsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyQm9keSgpe3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudCgnZGl2JyxfZXh0ZW5kcyh7fSx0aGlzLnByb3BzLmJvZHlQcm9wcyx7aWQ6dGhpcy5wcm9wcy5ib2R5UHJvcHMuaWR8fHRoaXMudXVpZEJvZHksY2xhc3NOYW1lOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCgpKCdiLWRpYWxvZy1ib2R5Jyx0aGlzLnByb3BzLmJvZHlQcm9wcy5jbGFzc05hbWUpfSksdGhpcy5wcm9wcy5jaGlsZHJlbik7fX0se2tleToncmVuZGVyRm9vdGVyJyx2YWx1ZTpmdW5jdGlvbiByZW5kZXJGb290ZXIoKXtpZih0aGlzLnByb3BzLmZvb3Rlcil7cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KCdmb290ZXInLF9leHRlbmRzKHt9LHRoaXMucHJvcHMuZm9vdGVyUHJvcHMse2NsYXNzTmFtZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQoKSgnYi1kaWFsb2ctZm9vdGVyJyx0aGlzLnByb3BzLmZvb3RlclByb3BzLmNsYXNzTmFtZSl9KSx0aGlzLnByb3BzLmZvb3Rlcik7fX19LHtrZXk6J3JlbmRlckhlYWRlcicsdmFsdWU6ZnVuY3Rpb24gcmVuZGVySGVhZGVyKCl7aWYodGhpcy5wcm9wcy5oZWFkZXIpe3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudCgnaGVhZGVyJyxfZXh0ZW5kcyh7fSx0aGlzLnByb3BzLmhlYWRlclByb3BzLHtpZDp0aGlzLnByb3BzLmhlYWRlclByb3BzLmlkfHx0aGlzLnV1aWRIZWFkZXIsY2xhc3NOYW1lOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCgpKCdiLWRpYWxvZy1oZWFkZXInLHRoaXMucHJvcHMuaGVhZGVyUHJvcHMuY2xhc3NOYW1lKX0pLHRoaXMucHJvcHMuaGVhZGVyKTt9fX0se2tleToncmVuZGVyRm9jdXNCb3VuZGFyeScsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyRm9jdXNCb3VuZGFyeSgpe2lmKHRoaXMucHJvcHMuY2FwdHVyZUZvY3VzKXtyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoJ2Rpdicse2NsYXNzTmFtZTonYi1vZmZzY3JlZW4nLHRhYkluZGV4OicwJywnYXJpYS1oaWRkZW4nOid0cnVlJ30sJ1xceEEwJyk7fX19LHtrZXk6J3JlbmRlcicsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyKCl7dmFyIF90aGlzMj10aGlzO3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudCgnZGl2JyxfZXh0ZW5kcyh7fSx0aGlzLnByb3BzLndyYXBwZXJQcm9wcyx7cmVmOmZ1bmN0aW9uIHJlZihub2RlKXtyZXR1cm4gX3RoaXMyLiR3cmFwcGVyPW5vZGU7fSxjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItZGlhbG9nLXdyYXBwZXInLHRoaXMucHJvcHMud3JhcHBlclByb3BzLmNsYXNzTmFtZSksdGFiSW5kZXg6JzAnfSksdGhpcy5yZW5kZXJGb2N1c0JvdW5kYXJ5KCksdGhpcy5wcm9wcy5iZWZvcmUsX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoJ2RpdicsX2V4dGVuZHMoe30sX193ZWJwYWNrX3JlcXVpcmVfXy5pKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKHRoaXMucHJvcHMsRGlhbG9nLmludGVybmFsS2V5cykse3JlZjpmdW5jdGlvbiByZWYobm9kZSl7cmV0dXJuIF90aGlzMi4kZGlhbG9nPW5vZGU7fSxjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItZGlhbG9nJyx0aGlzLnByb3BzLmNsYXNzTmFtZSksb25DbGljazp0aGlzLmhhbmRsZUluc2lkZUNsaWNrLG9uS2V5RG93bjp0aGlzLmhhbmRsZUtleURvd24scm9sZTonZGlhbG9nJywnYXJpYS1sYWJlbGxlZGJ5Jzp0aGlzLnV1aWRIZWFkZXIsJ2FyaWEtZGVzY3JpYmVkYnknOnRoaXMudXVpZEJvZHksdGFiSW5kZXg6JzAnfSksdGhpcy5yZW5kZXJIZWFkZXIoKSx0aGlzLnJlbmRlckJvZHkoKSx0aGlzLnJlbmRlckZvb3RlcigpKSx0aGlzLnByb3BzLmFmdGVyLHRoaXMucmVuZGVyRm9jdXNCb3VuZGFyeSgpKTt9fV0pO3JldHVybiBEaWFsb2c7fShfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuUHVyZUNvbXBvbmVudCk7RGlhbG9nLnByb3BUeXBlcz17YWZ0ZXI6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ubm9kZSxiZWZvcmU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ubm9kZSxib2R5UHJvcHM6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub2JqZWN0LGNhcHR1cmVGb2N1czpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ib29sLGNoaWxkcmVuOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm5vZGUsY2xvc2VPbkVzY0tleTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5vbmVPZlR5cGUoW19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmJvb2wsX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uZnVuY10pLGNsb3NlT25JbnNpZGVDbGljazpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5vbmVPZlR5cGUoW19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmJvb2wsX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uZnVuY10pLGNsb3NlT25PdXRzaWRlQ2xpY2s6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub25lT2ZUeXBlKFtfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ib29sLF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmNdKSxjbG9zZU9uT3V0c2lkZUZvY3VzOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm9uZU9mVHlwZShbX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYm9vbCxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jXSksY2xvc2VPbk91dHNpZGVTY3JvbGw6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub25lT2ZUeXBlKFtfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ib29sLF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmNdKSxmb290ZXI6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ubm9kZSxmb290ZXJQcm9wczpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5vYmplY3QsaGVhZGVyOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm5vZGUsaGVhZGVyUHJvcHM6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub2JqZWN0LG9uQ2xvc2U6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uZnVuYyx3cmFwcGVyUHJvcHM6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub2JqZWN0fTtEaWFsb2cuZGVmYXVsdFByb3BzPXthZnRlcjpudWxsLGJlZm9yZTpudWxsLGJvZHlQcm9wczp7fSxjYXB0dXJlRm9jdXM6dHJ1ZSxjaGlsZHJlbjpudWxsLGNsb3NlT25Fc2NLZXk6ZmFsc2UsY2xvc2VPbkluc2lkZUNsaWNrOmZhbHNlLGNsb3NlT25PdXRzaWRlQ2xpY2s6ZmFsc2UsY2xvc2VPbk91dHNpZGVGb2N1czpmYWxzZSxjbG9zZU9uT3V0c2lkZVNjcm9sbDpmYWxzZSxmb290ZXI6bnVsbCxmb290ZXJQcm9wczp7fSxoZWFkZXI6bnVsbCxoZWFkZXJQcm9wczp7fSxvbkNsb3NlOm5vb3Asb25LZXlEb3duOm5vb3Asd3JhcHBlclByb3BzOnt9fTtEaWFsb2cuaW50ZXJuYWxLZXlzPU9iamVjdC5rZXlzKERpYWxvZy5kZWZhdWx0UHJvcHMpOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSBEaWFsb2c7XG5cbi8qKiovIH0pXG4vKioqKioqLyBdKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gaW5kZXguanMiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA1KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCA4ZmZhMjVjNjE2MDBlOGJiZjk0NCIsIi8qKlxuICogUmV0dXJucyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHN1cHBsaWVkIG9iamVjdCB3aXRob3V0IHRoZSBnaXZlbiBrZXlzLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBvbWl0S2V5c0Zyb21Tb3VyY2VPYmplY3Qoc291cmNlLCBvbWl0dGVkS2V5cyA9IFtdKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIHJlbG9jYXRlQWNjZXB0ZWRLZXlzKGhhc2gsIGtleSkge1xuICAgICAgICBpZiAob21pdHRlZEtleXMuaW5kZXhPZihrZXkpID09PSAtMSkge1xuICAgICAgICAgICAgaGFzaFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFzaDtcbiAgICB9LCB7fSk7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9ib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzL2luZGV4LmpzIiwiLyoqXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQuIEFkZHMgYSBwcmVmaXggc28gaXQgaXMgc3VpdGFibGUgZm9yIHVzZSBhcyBhbiBIVE1MIElELlxuICogQmFzZWQgb24ge0BsaW5rIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2plZC85ODI4ODMgdGhpcyBpbXBsZW1lbnRhdGlvbn0uXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBhIHVuaXF1ZSBpZGVudGlmaWVyXG4gKlxuICogQGV4YW1wbGVcbiAqIHV1aWQoKTsgLy8gYi0xZjJjZDI3Zi0wNzU0LTQzNDQtOWQyMC00MzZhMjAxYjJmODBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXVpZCgpIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAgIHJldHVybiAnYi0nICsgKFsxZTddKy0xZTMrLTRlMystOGUzKy0xZTExKS5yZXBsYWNlKC9bMDE4XS9nLGE9PihhXk1hdGgucmFuZG9tKCkqMTY+PmEvNCkudG9TdHJpbmcoMTYpKTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlICovXG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9ib3VuZGxlc3MtdXRpbHMtdXVpZC9pbmRleC5qcyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy1wb3J0YWxcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtcG9ydGFsXCJ9XG4vLyBtb2R1bGUgaWQgPSAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNsYXNzbmFtZXNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJjbGFzc25hbWVzXCJ9XG4vLyBtb2R1bGUgaWQgPSAzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn1cbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IFJlYWN0LCB7UHJvcFR5cGVzfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY3ggZnJvbSAnY2xhc3NuYW1lcyc7XG5cbmltcG9ydCBQb3J0YWwgZnJvbSAnYm91bmRsZXNzLXBvcnRhbCc7XG5pbXBvcnQgb21pdCBmcm9tICdib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzJztcbmltcG9ydCB1dWlkIGZyb20gJ2JvdW5kbGVzcy11dGlscy11dWlkJztcblxuY29uc3QgaXNGdW5jdGlvbiA9ICh4KSA9PiB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJztcbmNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcbmNvbnN0IHRvQXJyYXkgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cbi8qKlxuIyBEaWFsb2dcbl9fQSBub24tYmxvY2tpbmcsIGZvY3VzLXN0ZWFsaW5nIGNvbnRhaW5lci5fX1xuXG5BIGRpYWxvZyBkaWZmZXJzIGZyb20gYSBtb2RhbCBpbiB0aGF0IGl0IGRvZXMgbm90IGNvbWUgd2l0aCBhIG1hc2tpbmcgbGF5ZXIgKHRvIG9ic2N1cmUgdGhlIHJlc3Qgb2YgdGhlIHBhZ2UpXG5hbmQgdGhlIHVzZXIgY2FuIGNob29zZSB0byBzaGlmdCBmb2N1cyBhd2F5IGZyb20gdGhlIGRpYWxvZyBjb250ZW50cyB2aWEgbW91c2UgY2xpY2sgb3IgYSBrZXlib2FyZCBzaG9ydGN1dC5cblxuU3BlY2lmaWMgYXJlYXMgKGhlYWRlciwgYm9keSwgZm9vdGVyKSBhcmUgZGVmaW5lZCB0byBwcm92aWRlIGVhc3kgY29uZm9ybWFuY2UgdG8gdGhlXG5bV0FJLUFSSUEgc3BlY10oaHR0cDovL3d3dy53My5vcmcgKiAvVFIvd2FpLWFyaWEvc3RhdGVzX2FuZF9wcm9wZXJ0aWVzI2FyaWEtbGFiZWxsZWRieSkgZm9yIGBhcmlhLWxhYmVsbGVkYnlgXG5hbmQgYGFyaWEtZGVzY3JpYmVkYnlgIChzY3JlZW4gcmVhZGVyICAqIGFjY2Vzc2liaWxpdHkpLiBUaGVpciB1c2UgaXMgb3B0aW9uYWwsIGJ1dCBlbmNvdXJhZ2VkLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEaWFsb2cgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgICAvKipcbiAgICAgICAgICogYXJiaXRyYXJ5IGNvbnRlbnQgdG8gYmUgcmVuZGVyZWQgYWZ0ZXIgdGhlIGRpYWxvZyBpbiB0aGUgRE9NXG4gICAgICAgICAqL1xuICAgICAgICBhZnRlcjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFyYml0cmFyeSBjb250ZW50IHRvIGJlIHJlbmRlcmVkIGJlZm9yZSB0aGUgZGlhbG9nIGluIHRoZSBET01cbiAgICAgICAgICovXG4gICAgICAgIGJlZm9yZTogUHJvcFR5cGVzLm5vZGUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFueSBbUmVhY3Qtc3VwcG9ydGVkIGF0dHJpYnV0ZV0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90YWdzLWFuZC1hdHRyaWJ1dGVzLmh0bWwjaHRtbC1hdHRyaWJ1dGVzKTsgYXBwbGllZCB0byB0aGUgYC5iLWRpYWxvZy1ib2R5YCBub2RlXG4gICAgICAgICAqL1xuICAgICAgICBib2R5UHJvcHM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGRldGVybWluZXMgaWYgZm9jdXMgaXMgYWxsb3dlZCB0byBtb3ZlIGF3YXkgZnJvbSB0aGUgZGlhbG9nXG4gICAgICAgICAqL1xuICAgICAgICBjYXB0dXJlRm9jdXM6IFByb3BUeXBlcy5ib29sLFxuXG4gICAgICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogZW5hYmxlIGRldGVjdGlvbiBvZiBcIkVzY2FwZVwiIGtleXByZXNzZXMgdG8gdHJpZ2dlciBgcHJvcHMub25DbG9zZWA7IGlmIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQsIHRoZSByZXR1cm5cbiAgICAgICAgICogdmFsdWUgZGV0ZXJtaW5lcyBpZiB0aGUgZGlhbG9nIHdpbGwgYmUgY2xvc2VkXG4gICAgICAgICAqL1xuICAgICAgICBjbG9zZU9uRXNjS2V5OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgICAgIFByb3BUeXBlcy5ib29sLFxuICAgICAgICAgICAgUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIF0pLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBlbmFibGUgZGV0ZWN0aW9uIG9mIGNsaWNrcyBpbnNpZGUgdGhlIGRpYWxvZyBhcmVhIHRvIHRyaWdnZXIgYHByb3BzLm9uQ2xvc2VgOyBpZiBhIGZ1bmN0aW9uIGlzIHByb3ZpZGVkLCB0aGUgcmV0dXJuXG4gICAgICAgICAqIHZhbHVlIGRldGVybWluZXMgaWYgdGhlIGRpYWxvZyB3aWxsIGJlIGNsb3NlZFxuICAgICAgICAgKi9cbiAgICAgICAgY2xvc2VPbkluc2lkZUNsaWNrOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgICAgIFByb3BUeXBlcy5ib29sLFxuICAgICAgICAgICAgUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIF0pLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBlbmFibGUgZGV0ZWN0aW9uIG9mIGNsaWNrcyBvdXRzaWRlIHRoZSBkaWFsb2cgYXJlYSB0byB0cmlnZ2VyIGBwcm9wcy5vbkNsb3NlYDsgaWYgYSBmdW5jdGlvbiBpcyBwcm92aWRlZCwgdGhlIHJldHVyblxuICAgICAgICAgKiB2YWx1ZSBkZXRlcm1pbmVzIGlmIHRoZSBkaWFsb2cgd2lsbCBiZSBjbG9zZWRcbiAgICAgICAgICovXG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgICAgICAgICAgUHJvcFR5cGVzLmJvb2wsXG4gICAgICAgICAgICBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgXSksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGVuYWJsZSBkZXRlY3Rpb24gb2YgZm9jdXMgb3V0c2lkZSB0aGUgZGlhbG9nIGFyZWEgdG8gdHJpZ2dlciBgcHJvcHMub25DbG9zZWA7IGlmIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQsIHRoZSByZXR1cm5cbiAgICAgICAgICogdmFsdWUgZGV0ZXJtaW5lcyBpZiB0aGUgZGlhbG9nIHdpbGwgYmUgY2xvc2VkXG4gICAgICAgICAqL1xuICAgICAgICBjbG9zZU9uT3V0c2lkZUZvY3VzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgICAgIFByb3BUeXBlcy5ib29sLFxuICAgICAgICAgICAgUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIF0pLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBlbmFibGUgZGV0ZWN0aW9uIG9mIHNjcm9sbCBhbmQgbW91c2V3aGVlbCBldmVudHMgb3V0c2lkZSB0aGUgZGlhbG9nIGFyZWEgdG8gdHJpZ2dlciBgcHJvcHMub25DbG9zZWA7IGlmIGEgZnVuY3Rpb1xuICAgICAgICAgKiBpcyBwcm92aWRlZCwgdGhlIHJldHVybiB2YWx1ZSBkZXRlcm1pbmVzIGlmIHRoZSBkaWFsb2cgd2lsbCBiZSBjbG9zZWRcbiAgICAgICAgICovXG4gICAgICAgIGNsb3NlT25PdXRzaWRlU2Nyb2xsOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgICAgIFByb3BUeXBlcy5ib29sLFxuICAgICAgICAgICAgUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIF0pLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0ZXh0LCBSZWFjdEVsZW1lbnRzLCBldGMuIGNvbXByaXNpbmcgdGhlIFwiZm9vdGVyXCIgYXJlYSBvZiB0aGUgZGlhbG9nLCBlLmcuIGNvbmZpcm0vY2FuY2VsIGJ1dHRvbnNcbiAgICAgICAgICovXG4gICAgICAgIGZvb3RlcjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFueSBbUmVhY3Qtc3VwcG9ydGVkIGF0dHJpYnV0ZV0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90YWdzLWFuZC1hdHRyaWJ1dGVzLmh0bWwjaHRtbC1hdHRyaWJ1dGVzKTsgYXBwbGllZCB0byB0aGUgYC5iLWRpYWxvZy1mb290ZXJgIG5vZGVcbiAgICAgICAgICovXG4gICAgICAgIGZvb3RlclByb3BzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0ZXh0LCBSZWFjdEVsZW1lbnRzLCBldGMuIHRvIHJlcHJlc2VudCB0aGUgXCJ0aXRsZSBiYXJcIiBhcmVhIG9mIHRoZSBkaWFsb2dcbiAgICAgICAgICovXG4gICAgICAgIGhlYWRlcjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFueSBbUmVhY3Qtc3VwcG9ydGVkIGF0dHJpYnV0ZV0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90YWdzLWFuZC1hdHRyaWJ1dGVzLmh0bWwjaHRtbC1hdHRyaWJ1dGVzKTsgYXBwbGllZCB0byB0aGUgYC5iLWRpYWxvZy1oZWFkZXJgIG5vZGVcbiAgICAgICAgICovXG4gICAgICAgIGhlYWRlclByb3BzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhIGN1c3RvbSBldmVudCBoYW5kbGVyIHRoYXQgaXMgY2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGRpYWxvZyBzaG91bGQgYmUgdW5yZW5kZXJlZCBieSBpdHMgcGFyZW50OyB0aGUgZXZlbnQgb2NjdXJzIGlmIG9uZSBvciBtb3JlIG9mIHRoZSBgY2xvc2VPbmAgcHJvcHMgKGBjbG9zZU9uRXNjS2V5YCwgYGNsb3NlT25PdXRzaWRlQ2xpY2tgLCBldGMuKSBhcmUgcGFzc2VkIGFzIGB0cnVlYCBhbmQgdGhlIGRpc21pc3NhbCBjcml0ZXJpYSBhcmUgc2F0aXNmaWVkXG4gICAgICAgICAqL1xuICAgICAgICBvbkNsb3NlOiBQcm9wVHlwZXMuZnVuYyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogYW55IFtSZWFjdC1zdXBwb3J0ZWQgYXR0cmlidXRlXShodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RhZ3MtYW5kLWF0dHJpYnV0ZXMuaHRtbCNodG1sLWF0dHJpYnV0ZXMpOyBhcHBsaWVkIHRvIHRoZSBgLmItZGlhbG9nLXdyYXBwZXJgIG5vZGVcbiAgICAgICAgICovXG4gICAgICAgIHdyYXBwZXJQcm9wczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICB9XG5cbiAgICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgICBhZnRlcjogbnVsbCxcbiAgICAgICAgYmVmb3JlOiBudWxsLFxuICAgICAgICBib2R5UHJvcHM6IHt9LFxuICAgICAgICBjYXB0dXJlRm9jdXM6IHRydWUsXG4gICAgICAgIGNoaWxkcmVuOiBudWxsLFxuICAgICAgICBjbG9zZU9uRXNjS2V5OiBmYWxzZSxcbiAgICAgICAgY2xvc2VPbkluc2lkZUNsaWNrOiBmYWxzZSxcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXG4gICAgICAgIGNsb3NlT25PdXRzaWRlRm9jdXM6IGZhbHNlLFxuICAgICAgICBjbG9zZU9uT3V0c2lkZVNjcm9sbDogZmFsc2UsXG4gICAgICAgIGZvb3RlcjogbnVsbCxcbiAgICAgICAgZm9vdGVyUHJvcHM6IHt9LFxuICAgICAgICBoZWFkZXI6IG51bGwsXG4gICAgICAgIGhlYWRlclByb3BzOiB7fSxcbiAgICAgICAgb25DbG9zZTogbm9vcCxcbiAgICAgICAgb25LZXlEb3duOiBub29wLFxuICAgICAgICB3cmFwcGVyUHJvcHM6IHt9LFxuICAgIH1cblxuICAgIHN0YXRpYyBpbnRlcm5hbEtleXMgPSBPYmplY3Qua2V5cyhEaWFsb2cuZGVmYXVsdFByb3BzKVxuXG4gICAgbW91bnRlZCA9IGZhbHNlXG5cbiAgICAvLyBmYWxsYmFja3MgaWYgb25lIGlzbid0IHBhc3NlZFxuICAgIHV1aWRIZWFkZXIgPSB1dWlkKClcbiAgICB1dWlkQm9keSA9IHV1aWQoKVxuXG4gICAgaXNQYXJ0T2ZEaWFsb2cobm9kZSkge1xuICAgICAgICBpZiAoIW5vZGUgfHwgbm9kZSA9PT0gd2luZG93KSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgICAgIGNvbnN0IHJvb3RzID0gW3RoaXMuJHdyYXBwZXJdLmNvbmNhdChcbiAgICAgICAgICAgIHRvQXJyYXkuY2FsbChcbiAgICAgICAgICAgICAgICB0aGlzLiR3cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoYFske1BvcnRhbC5QT1JUQUxfREFUQV9BVFRSSUJVVEV9XWApXG4gICAgICAgICAgICApLm1hcCgoZG9tKSA9PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkb20uZ2V0QXR0cmlidXRlKFBvcnRhbC5QT1JUQUxfREFUQV9BVFRSSUJVVEUpKSlcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBlbGVtZW50ID0gbm9kZS5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUgPyBub2RlLnBhcmVudE5vZGUgOiBub2RlO1xuXG4gICAgICAgIHJldHVybiByb290cy5zb21lKChkb20pID0+IGRvbS5jb250YWlucyhlbGVtZW50KSk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlT3V0c2lkZUNsaWNrLCB0cnVlKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5oYW5kbGVPdXRzaWRlQ2xpY2ssIHRydWUpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB0aGlzLmhhbmRsZUZvY3VzLCB0cnVlKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuaGFuZGxlT3V0c2lkZVNjcm9sbFdoZWVsLCB0cnVlKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgdGhpcy5oYW5kbGVPdXRzaWRlU2Nyb2xsV2hlZWwsIHRydWUpO1xuXG4gICAgICAgIGlmICh0aGlzLnByb3BzLmNhcHR1cmVGb2N1cyAmJiAhdGhpcy5pc1BhcnRPZkRpYWxvZyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgICAgICAgdGhpcy4kZGlhbG9nLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVPdXRzaWRlQ2xpY2ssIHRydWUpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCB0aGlzLmhhbmRsZU91dHNpZGVDbGljaywgdHJ1ZSk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuaGFuZGxlRm9jdXMsIHRydWUpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5oYW5kbGVPdXRzaWRlU2Nyb2xsV2hlZWwsIHRydWUpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLmhhbmRsZU91dHNpZGVTY3JvbGxXaGVlbCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgc2hvdWxkRGlhbG9nQ2xvc2VPbkV2ZW50KHByb3AsIGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKHRoaXMucHJvcHNbcHJvcF0pID8gdGhpcy5wcm9wc1twcm9wXShldmVudCkgOiB0aGlzLnByb3BzW3Byb3BdO1xuICAgIH1cblxuICAgIGhhbmRsZUZvY3VzID0gKG5hdGl2ZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5wcm9wcy5jYXB0dXJlRm9jdXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZERpYWxvZ0Nsb3NlT25FdmVudCgnY2xvc2VPbk91dHNpZGVGb2N1cycsIG5hdGl2ZUV2ZW50KSAmJiAhdGhpcy5pc1BhcnRPZkRpYWxvZyhuYXRpdmVFdmVudC50YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucHJvcHMub25DbG9zZSwgMCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGV4cGxpY2l0T3JpZ2luYWxUYXJnZXQgaXMgZm9yIEZpcmVmb3gsIGFzIGl0IGRvZXNuJ3Qgc3VwcG9ydCByZWxhdGVkVGFyZ2V0XG4gICAgICAgIGxldCBwcmV2aW91cyA9IG5hdGl2ZUV2ZW50LmV4cGxpY2l0T3JpZ2luYWxUYXJnZXQgfHwgbmF0aXZlRXZlbnQucmVsYXRlZFRhcmdldDtcblxuICAgICAgICBpZiAodGhpcy5pc1BhcnRPZkRpYWxvZyhwcmV2aW91cykgJiYgIXRoaXMuaXNQYXJ0T2ZEaWFsb2cobmF0aXZlRXZlbnQudGFyZ2V0KSkge1xuICAgICAgICAgICAgbmF0aXZlRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHByZXZpb3VzLmZvY3VzKCk7IC8vIHJlc3RvcmUgZm9jdXNcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZUtleURvd24gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZERpYWxvZ0Nsb3NlT25FdmVudCgnY2xvc2VPbkVzY0tleScsIGV2ZW50KSkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucHJvcHMub25DbG9zZSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbktleURvd24pIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25LZXlEb3duKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZUluc2lkZUNsaWNrID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZERpYWxvZ0Nsb3NlT25FdmVudCgnY2xvc2VPbkluc2lkZUNsaWNrJywgZXZlbnQpKSB7XG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnByb3BzLm9uQ2xvc2UsIDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlT3V0c2lkZUNsaWNrID0gKG5hdGl2ZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZERpYWxvZ0Nsb3NlT25FdmVudCgnY2xvc2VPbk91dHNpZGVDbGljaycsIG5hdGl2ZUV2ZW50KSAmJiAhdGhpcy5pc1BhcnRPZkRpYWxvZyhuYXRpdmVFdmVudC50YXJnZXQpKSB7XG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnByb3BzLm9uQ2xvc2UsIDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlT3V0c2lkZVNjcm9sbFdoZWVsID0gKG5hdGl2ZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZERpYWxvZ0Nsb3NlT25FdmVudCgnY2xvc2VPbk91dHNpZGVTY3JvbGwnLCBuYXRpdmVFdmVudCkgJiYgIXRoaXMuaXNQYXJ0T2ZEaWFsb2cobmF0aXZlRXZlbnQudGFyZ2V0KSkge1xuICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQodGhpcy5wcm9wcy5vbkNsb3NlLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlckJvZHkoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgey4uLnRoaXMucHJvcHMuYm9keVByb3BzfVxuICAgICAgICAgICAgICAgIGlkPXt0aGlzLnByb3BzLmJvZHlQcm9wcy5pZCB8fCB0aGlzLnV1aWRCb2R5fVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y3goJ2ItZGlhbG9nLWJvZHknLCB0aGlzLnByb3BzLmJvZHlQcm9wcy5jbGFzc05hbWUpfT5cbiAgICAgICAgICAgICAgICB7dGhpcy5wcm9wcy5jaGlsZHJlbn1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJlbmRlckZvb3RlcigpIHtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuZm9vdGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxmb290ZXJcbiAgICAgICAgICAgICAgICAgICAgey4uLnRoaXMucHJvcHMuZm9vdGVyUHJvcHN9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y3goJ2ItZGlhbG9nLWZvb3RlcicsIHRoaXMucHJvcHMuZm9vdGVyUHJvcHMuY2xhc3NOYW1lKX0+XG4gICAgICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLmZvb3Rlcn1cbiAgICAgICAgICAgICAgICA8L2Zvb3Rlcj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXJIZWFkZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmhlYWRlcikge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8aGVhZGVyXG4gICAgICAgICAgICAgICAgICAgIHsuLi50aGlzLnByb3BzLmhlYWRlclByb3BzfVxuICAgICAgICAgICAgICAgICAgICBpZD17dGhpcy5wcm9wcy5oZWFkZXJQcm9wcy5pZCB8fCB0aGlzLnV1aWRIZWFkZXJ9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y3goJ2ItZGlhbG9nLWhlYWRlcicsIHRoaXMucHJvcHMuaGVhZGVyUHJvcHMuY2xhc3NOYW1lKX0+XG4gICAgICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLmhlYWRlcn1cbiAgICAgICAgICAgICAgICA8L2hlYWRlcj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXJGb2N1c0JvdW5kYXJ5KCkge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5jYXB0dXJlRm9jdXMpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Itb2Zmc2NyZWVuJyB0YWJJbmRleD0nMCcgYXJpYS1oaWRkZW49J3RydWUnPiZuYnNwOzwvZGl2PlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH0gLy8gdXNlZCB0byBsb2NrIGZvY3VzIGludG8gYSBwYXJ0aWN1bGFyIHN1YnNldCBvZiBET01cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICB7Li4udGhpcy5wcm9wcy53cmFwcGVyUHJvcHN9XG4gICAgICAgICAgICAgICAgcmVmPXsobm9kZSkgPT4gKHRoaXMuJHdyYXBwZXIgPSBub2RlKX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KCdiLWRpYWxvZy13cmFwcGVyJywgdGhpcy5wcm9wcy53cmFwcGVyUHJvcHMuY2xhc3NOYW1lKX1cbiAgICAgICAgICAgICAgICB0YWJJbmRleD0nMCc+XG4gICAgICAgICAgICAgICAge3RoaXMucmVuZGVyRm9jdXNCb3VuZGFyeSgpfVxuXG4gICAgICAgICAgICAgICAge3RoaXMucHJvcHMuYmVmb3JlfVxuXG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICB7Li4ub21pdCh0aGlzLnByb3BzLCBEaWFsb2cuaW50ZXJuYWxLZXlzKX1cbiAgICAgICAgICAgICAgICAgICAgcmVmPXsobm9kZSkgPT4gKHRoaXMuJGRpYWxvZyA9IG5vZGUpfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KCdiLWRpYWxvZycsIHRoaXMucHJvcHMuY2xhc3NOYW1lKX1cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5oYW5kbGVJbnNpZGVDbGlja31cbiAgICAgICAgICAgICAgICAgICAgb25LZXlEb3duPXt0aGlzLmhhbmRsZUtleURvd259XG4gICAgICAgICAgICAgICAgICAgIHJvbGU9J2RpYWxvZydcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PXt0aGlzLnV1aWRIZWFkZXJ9XG4gICAgICAgICAgICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9e3RoaXMudXVpZEJvZHl9XG4gICAgICAgICAgICAgICAgICAgIHRhYkluZGV4PScwJz5cbiAgICAgICAgICAgICAgICAgICAge3RoaXMucmVuZGVySGVhZGVyKCl9XG4gICAgICAgICAgICAgICAgICAgIHt0aGlzLnJlbmRlckJvZHkoKX1cbiAgICAgICAgICAgICAgICAgICAge3RoaXMucmVuZGVyRm9vdGVyKCl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICB7dGhpcy5wcm9wcy5hZnRlcn1cblxuICAgICAgICAgICAgICAgIHt0aGlzLnJlbmRlckZvY3VzQm91bmRhcnkoKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL2JvdW5kbGVzcy1kaWFsb2cvaW5kZXguanMiXSwic291cmNlUm9vdCI6IiJ9 | ||
module.exports=function(e){function o(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,o),r.l=!0,r.exports}var n={};return o.m=e,o.c=n,o.i=function(e){return e},o.d=function(e,n,t){o.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:t})},o.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(n,"a",n),n},o.o=function(e,o){return Object.prototype.hasOwnProperty.call(e,o)},o.p="",o(o.s=4)}([function(e,o){e.exports=require("boundless-portal")},function(e,o){e.exports=require("boundless-utils-omit-keys")},function(e,o){e.exports=require("classnames")},function(e,o){e.exports=require("react")},function(e,o,n){"use strict";function t(e,o){if(!(e instanceof o))throw new TypeError("Cannot call a class as a function")}function r(e,o){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!o||"object"!=typeof o&&"function"!=typeof o?e:o}function s(e,o){if("function"!=typeof o&&null!==o)throw new TypeError("Super expression must either be null or a function, not "+typeof o);e.prototype=Object.create(o&&o.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),o&&(Object.setPrototypeOf?Object.setPrototypeOf(e,o):e.__proto__=o)}Object.defineProperty(o,"__esModule",{value:!0});var i=n(3),l=n.n(i),u=n(2),c=n.n(u),p=n(0),a=n.n(p),d=n(1),f=n.n(d),y=Object.assign||function(e){for(var o=1;o<arguments.length;o++){var n=arguments[o];for(var t in n)Object.prototype.hasOwnProperty.call(n,t)&&(e[t]=n[t])}return e},h=function(){function e(e,o){for(var n=0;n<o.length;n++){var t=o[n];t.enumerable=t.enumerable||!1,t.configurable=!0,"value"in t&&(t.writable=!0),Object.defineProperty(e,t.key,t)}}return function(o,n,t){return n&&e(o.prototype,n),t&&e(o,t),o}}(),O=function(e){return"function"==typeof e},w=function(){},T=Array.prototype.slice,v=function(e){function o(){var e,n,s,i;t(this,o);for(var l=arguments.length,u=Array(l),c=0;c<l;c++)u[c]=arguments[c];return n=s=r(this,(e=o.__proto__||Object.getPrototypeOf(o)).call.apply(e,[this].concat(u))),s.mounted=!1,s.handleFocus=function(e){if(s.props.captureFocus){var o=e.explicitOriginalTarget||e.relatedTarget;s.isPartOfDialog(o)&&!s.isPartOfDialog(e.target)&&(e.preventDefault(),o.focus())}else if(s.shouldDialogCloseOnEvent("closeOnOutsideFocus",e)&&!s.isPartOfDialog(e.target))return window.setTimeout(s.props.onClose,0)},s.handleKeyDown=function(e){"Escape"===e.key&&s.shouldDialogCloseOnEvent("closeOnEscKey",e)&&window.setTimeout(s.props.onClose,0),s.props.onKeyDown&&s.props.onKeyDown(e)},s.handleInsideClick=function(e){s.shouldDialogCloseOnEvent("closeOnInsideClick",e)&&window.setTimeout(s.props.onClose,0)},s.handleOutsideClick=function(e){s.shouldDialogCloseOnEvent("closeOnOutsideClick",e)&&!s.isPartOfDialog(e.target)&&window.setTimeout(s.props.onClose,0)},s.handleOutsideScrollWheel=function(e){s.shouldDialogCloseOnEvent("closeOnOutsideScroll",e)&&!s.isPartOfDialog(e.target)&&window.setTimeout(s.props.onClose,0)},i=n,r(s,i)}return s(o,e),h(o,[{key:"isPartOfDialog",value:function(e){if(!e||e===window)return!1;var o=[this.$wrapper].concat(T.call(this.$wrapper.querySelectorAll("["+a.a.PORTAL_DATA_ATTRIBUTE+"]")).map(function(e){return document.getElementById(e.getAttribute(a.a.PORTAL_DATA_ATTRIBUTE))})),n=e.nodeType!==Node.ELEMENT_NODE?e.parentNode:e;return o.some(function(e){return e.contains(n)})}},{key:"componentDidMount",value:function(){window.addEventListener("click",this.handleOutsideClick,!0),window.addEventListener("contextmenu",this.handleOutsideClick,!0),window.addEventListener("focus",this.handleFocus,!0),window.addEventListener("scroll",this.handleOutsideScrollWheel,!0),window.addEventListener("wheel",this.handleOutsideScrollWheel,!0),this.props.captureFocus&&!this.isPartOfDialog(document.activeElement)&&this.$dialog.focus()}},{key:"componentWillUnmount",value:function(){window.removeEventListener("click",this.handleOutsideClick,!0),window.removeEventListener("contextmenu",this.handleOutsideClick,!0),window.removeEventListener("focus",this.handleFocus,!0),window.removeEventListener("scroll",this.handleOutsideScrollWheel,!0),window.removeEventListener("wheel",this.handleOutsideScrollWheel,!0)}},{key:"shouldDialogCloseOnEvent",value:function(e,o){return O(this.props[e])?this.props[e](o):this.props[e]}},{key:"renderFocusBoundary",value:function(){if(this.props.captureFocus)return l.a.createElement("div",{className:"b-offscreen",tabIndex:"0","aria-hidden":"true"}," ")}},{key:"render",value:function(){var e=this;return l.a.createElement(this.props.component,y({},f()(this.props,o.internalKeys),{ref:function(o){return e.$wrapper=o},className:c()("b-dialog-wrapper",this.props.className)}),this.renderFocusBoundary(),this.props.before,l.a.createElement(this.props.dialogComponent,y({},this.dialogProps,{ref:function(o){return e.$dialog=o},className:c()("b-dialog",this.props.dialogProps.className),onClick:this.handleInsideClick,onKeyDown:this.handleKeyDown,role:"dialog",tabIndex:"0"}),this.props.children),this.props.after,this.renderFocusBoundary())}}]),o}(l.a.PureComponent);v.propTypes={"*":i.PropTypes.any,after:i.PropTypes.node,before:i.PropTypes.node,captureFocus:i.PropTypes.bool,closeOnEscKey:i.PropTypes.oneOfType([i.PropTypes.bool,i.PropTypes.func]),closeOnInsideClick:i.PropTypes.oneOfType([i.PropTypes.bool,i.PropTypes.func]),closeOnOutsideClick:i.PropTypes.oneOfType([i.PropTypes.bool,i.PropTypes.func]),closeOnOutsideFocus:i.PropTypes.oneOfType([i.PropTypes.bool,i.PropTypes.func]),closeOnOutsideScroll:i.PropTypes.oneOfType([i.PropTypes.bool,i.PropTypes.func]),component:i.PropTypes.string,dialogComponent:i.PropTypes.string,dialogProps:i.PropTypes.shape({"*":i.PropTypes.any}),onClose:i.PropTypes.func},v.defaultProps={after:null,before:null,captureFocus:!0,children:null,closeOnEscKey:!1,closeOnInsideClick:!1,closeOnOutsideClick:!1,closeOnOutsideFocus:!1,closeOnOutsideScroll:!1,component:"div",dialogComponent:"div",dialogProps:{},onClose:w,onKeyDown:w},v.internalKeys=Object.keys(v.defaultProps),o.default=v}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIGYxZjc0OWNhMzNjZDE0ZDdjN2M2Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy1wb3J0YWxcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXV0aWxzLW9taXQta2V5c1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJjbGFzc25hbWVzXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0XCJ9Iiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy1kaWFsb2cvaW5kZXguanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJ2YWx1ZSIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwicmVxdWlyZSIsIl9fd2VicGFja19leHBvcnRzX18iLCJfY2xhc3NDYWxsQ2hlY2siLCJpbnN0YW5jZSIsIkNvbnN0cnVjdG9yIiwiVHlwZUVycm9yIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJzZWxmIiwiUmVmZXJlbmNlRXJyb3IiLCJfaW5oZXJpdHMiLCJzdWJDbGFzcyIsInN1cGVyQ2xhc3MiLCJjcmVhdGUiLCJjb25zdHJ1Y3RvciIsIndyaXRhYmxlIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc19wb3J0YWxfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfcG9ydGFsX19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fX2RlZmF1bHQiLCJfZXh0ZW5kcyIsImFzc2lnbiIsInRhcmdldCIsImFyZ3VtZW50cyIsImxlbmd0aCIsInNvdXJjZSIsImtleSIsIl9jcmVhdGVDbGFzcyIsImRlZmluZVByb3BlcnRpZXMiLCJwcm9wcyIsImRlc2NyaXB0b3IiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJpc0Z1bmN0aW9uIiwieCIsIm5vb3AiLCJ0b0FycmF5IiwiQXJyYXkiLCJzbGljZSIsIkRpYWxvZyIsIl9SZWFjdCRQdXJlQ29tcG9uZW50IiwiX3JlZiIsIl90ZW1wIiwiX3RoaXMiLCJfcmV0IiwidGhpcyIsIl9sZW4iLCJhcmdzIiwiX2tleSIsImdldFByb3RvdHlwZU9mIiwiYXBwbHkiLCJjb25jYXQiLCJtb3VudGVkIiwiaGFuZGxlRm9jdXMiLCJuYXRpdmVFdmVudCIsImNhcHR1cmVGb2N1cyIsInByZXZpb3VzIiwiZXhwbGljaXRPcmlnaW5hbFRhcmdldCIsInJlbGF0ZWRUYXJnZXQiLCJpc1BhcnRPZkRpYWxvZyIsInByZXZlbnREZWZhdWx0IiwiZm9jdXMiLCJzaG91bGREaWFsb2dDbG9zZU9uRXZlbnQiLCJ3aW5kb3ciLCJzZXRUaW1lb3V0Iiwib25DbG9zZSIsImhhbmRsZUtleURvd24iLCJldmVudCIsIm9uS2V5RG93biIsImhhbmRsZUluc2lkZUNsaWNrIiwiaGFuZGxlT3V0c2lkZUNsaWNrIiwiaGFuZGxlT3V0c2lkZVNjcm9sbFdoZWVsIiwibm9kZSIsInJvb3RzIiwiJHdyYXBwZXIiLCJxdWVyeVNlbGVjdG9yQWxsIiwiYSIsIlBPUlRBTF9EQVRBX0FUVFJJQlVURSIsIm1hcCIsImRvbSIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJnZXRBdHRyaWJ1dGUiLCJlbGVtZW50Iiwibm9kZVR5cGUiLCJOb2RlIiwiRUxFTUVOVF9OT0RFIiwicGFyZW50Tm9kZSIsInNvbWUiLCJjb250YWlucyIsImFkZEV2ZW50TGlzdGVuZXIiLCJhY3RpdmVFbGVtZW50IiwiJGRpYWxvZyIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJwcm9wIiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsInRhYkluZGV4IiwiYXJpYS1oaWRkZW4iLCJfdGhpczIiLCJjb21wb25lbnQiLCJpbnRlcm5hbEtleXMiLCJyZWYiLCJyZW5kZXJGb2N1c0JvdW5kYXJ5IiwiYmVmb3JlIiwiZGlhbG9nQ29tcG9uZW50IiwiZGlhbG9nUHJvcHMiLCJvbkNsaWNrIiwicm9sZSIsImNoaWxkcmVuIiwiYWZ0ZXIiLCJQdXJlQ29tcG9uZW50IiwicHJvcFR5cGVzIiwiKiIsImFueSIsImJvb2wiLCJjbG9zZU9uRXNjS2V5Iiwib25lT2ZUeXBlIiwiZnVuYyIsImNsb3NlT25JbnNpZGVDbGljayIsImNsb3NlT25PdXRzaWRlQ2xpY2siLCJjbG9zZU9uT3V0c2lkZUZvY3VzIiwiY2xvc2VPbk91dHNpZGVTY3JvbGwiLCJzdHJpbmciLCJzaGFwZSIsImRlZmF1bHRQcm9wcyIsImtleXMiXSwibWFwcGluZ3MiOiJBQUFBQSxPQUFPQyxRQUNFLFNBQVVDLEdDR25CLFFBQUFDLEdBQUFDLEdBR0EsR0FBQUMsRUFBQUQsR0FDQSxNQUFBQyxHQUFBRCxH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T2RJLHFCQUFzQjlHLEVBQUEsVUFBVXlHLFdBQzVCekcsRUFBQSxVQUFVdUcsS0FDVnZHLEVBQUEsVUFBVTBHLE9BTWRsQixVQUFXeEYsRUFBQSxVQUFVK0csT0FLckJsQixnQkFBaUI3RixFQUFBLFVBQVUrRyxPQUUzQmpCLFlBQWE5RixFQUFBLFVBQVVnSCxPQUluQlgsSUFBS3JHLEVBQUEsVUFBVXNHLE1BTW5CakQsUUFBU3JELEVBQUEsVUFBVTBHLE1BdkZOL0UsRUEwRlZzRixjQUNIZixNQUFPLEtBQ1BOLE9BQVEsS0FDUmpELGNBQWMsRUFDZHNELFNBQVUsS0FDVk8sZUFBZSxFQUNmRyxvQkFBb0IsRUFDcEJDLHFCQUFxQixFQUNyQkMscUJBQXFCLEVBQ3JCQyxzQkFBc0IsRUFDdEJ0QixVQUFXLE1BQ1hLLGdCQUFpQixNQUNqQkMsZUFDQXpDLFFBQVM5QixFQUNUaUMsVUFBV2pDLEdBeEdFSSxFQTJHVjhELGFBQWV2SCxPQUFPZ0osS0FBS3ZGLEVBQU9zRixjTmxCKzNQakksRUFBNkIsUU16RnA3UDJDIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPVxuLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbi8qKioqKiovIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuLyoqKioqKi8gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuLyoqKioqKi8gXHRcdFx0XHRnZXQ6IGdldHRlclxuLyoqKioqKi8gXHRcdFx0fSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4vKioqKioqLyBcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDQpO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtcG9ydGFsXCIpO1xuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXV0aWxzLW9taXQta2V5c1wiKTtcblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNsYXNzbmFtZXNcIik7XG5cbi8qKiovIH0pLFxuLyogMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxuLyoqKi8gfSksXG4vKiA0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KF9fd2VicGFja19leHBvcnRzX18sIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc19wb3J0YWxfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc19wb3J0YWxfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfcG9ydGFsX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fKTtcbnZhciBfZXh0ZW5kcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0YXJnZXQpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9YXJndW1lbnRzW2ldO2Zvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSxrZXkpKXt0YXJnZXRba2V5XT1zb3VyY2Vba2V5XTt9fX1yZXR1cm4gdGFyZ2V0O307dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoXCJ2YWx1ZVwiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKTt9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcjt9O30oKTtmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7fX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLGNhbGwpe2lmKCFzZWxmKXt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7fXJldHVybiBjYWxsJiYodHlwZW9mIGNhbGw9PT1cIm9iamVjdFwifHx0eXBlb2YgY2FsbD09PVwiZnVuY3Rpb25cIik/Y2FsbDpzZWxmO31mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT1cImZ1bmN0aW9uXCImJnN1cGVyQ2xhc3MhPT1udWxsKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2Ygc3VwZXJDbGFzcyk7fXN1YkNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MmJnN1cGVyQ2xhc3MucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6c3ViQ2xhc3MsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfX0pO2lmKHN1cGVyQ2xhc3MpT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcyxzdXBlckNsYXNzKTpzdWJDbGFzcy5fX3Byb3RvX189c3VwZXJDbGFzczt9dmFyIGlzRnVuY3Rpb249ZnVuY3Rpb24gaXNGdW5jdGlvbih4KXtyZXR1cm4gdHlwZW9mIHg9PT0nZnVuY3Rpb24nO307dmFyIG5vb3A9ZnVuY3Rpb24gbm9vcCgpe307dmFyIHRvQXJyYXk9QXJyYXkucHJvdG90eXBlLnNsaWNlO3ZhciBEaWFsb2c9ZnVuY3Rpb24oX1JlYWN0JFB1cmVDb21wb25lbnQpe19pbmhlcml0cyhEaWFsb2csX1JlYWN0JFB1cmVDb21wb25lbnQpO2Z1bmN0aW9uIERpYWxvZygpe3ZhciBfcmVmO3ZhciBfdGVtcCxfdGhpcyxfcmV0O19jbGFzc0NhbGxDaGVjayh0aGlzLERpYWxvZyk7Zm9yKHZhciBfbGVuPWFyZ3VtZW50cy5sZW5ndGgsYXJncz1BcnJheShfbGVuKSxfa2V5PTA7X2tleTxfbGVuO19rZXkrKyl7YXJnc1tfa2V5XT1hcmd1bWVudHNbX2tleV07fXJldHVybiBfcmV0PShfdGVtcD0oX3RoaXM9X3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywoX3JlZj1EaWFsb2cuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoRGlhbG9nKSkuY2FsbC5hcHBseShfcmVmLFt0aGlzXS5jb25jYXQoYXJncykpKSxfdGhpcyksX3RoaXMubW91bnRlZD1mYWxzZSxfdGhpcy5oYW5kbGVGb2N1cz1mdW5jdGlvbihuYXRpdmVFdmVudCl7aWYoIV90aGlzLnByb3BzLmNhcHR1cmVGb2N1cyl7aWYoX3RoaXMuc2hvdWxkRGlhbG9nQ2xvc2VPbkV2ZW50KCdjbG9zZU9uT3V0c2lkZUZvY3VzJyxuYXRpdmVFdmVudCkmJiFfdGhpcy5pc1BhcnRPZkRpYWxvZyhuYXRpdmVFdmVudC50YXJnZXQpKXtyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoX3RoaXMucHJvcHMub25DbG9zZSwwKTt9cmV0dXJuO312YXIgcHJldmlvdXM9bmF0aXZlRXZlbnQuZXhwbGljaXRPcmlnaW5hbFRhcmdldHx8bmF0aXZlRXZlbnQucmVsYXRlZFRhcmdldDtpZihfdGhpcy5pc1BhcnRPZkRpYWxvZyhwcmV2aW91cykmJiFfdGhpcy5pc1BhcnRPZkRpYWxvZyhuYXRpdmVFdmVudC50YXJnZXQpKXtuYXRpdmVFdmVudC5wcmV2ZW50RGVmYXVsdCgpO3ByZXZpb3VzLmZvY3VzKCk7fX0sX3RoaXMuaGFuZGxlS2V5RG93bj1mdW5jdGlvbihldmVudCl7aWYoZXZlbnQua2V5PT09J0VzY2FwZScpe2lmKF90aGlzLnNob3VsZERpYWxvZ0Nsb3NlT25FdmVudCgnY2xvc2VPbkVzY0tleScsZXZlbnQpKXt3aW5kb3cuc2V0VGltZW91dChfdGhpcy5wcm9wcy5vbkNsb3NlLDApO319aWYoX3RoaXMucHJvcHMub25LZXlEb3duKXtfdGhpcy5wcm9wcy5vbktleURvd24oZXZlbnQpO319LF90aGlzLmhhbmRsZUluc2lkZUNsaWNrPWZ1bmN0aW9uKGV2ZW50KXtpZihfdGhpcy5zaG91bGREaWFsb2dDbG9zZU9uRXZlbnQoJ2Nsb3NlT25JbnNpZGVDbGljaycsZXZlbnQpKXt3aW5kb3cuc2V0VGltZW91dChfdGhpcy5wcm9wcy5vbkNsb3NlLDApO319LF90aGlzLmhhbmRsZU91dHNpZGVDbGljaz1mdW5jdGlvbihuYXRpdmVFdmVudCl7aWYoX3RoaXMuc2hvdWxkRGlhbG9nQ2xvc2VPbkV2ZW50KCdjbG9zZU9uT3V0c2lkZUNsaWNrJyxuYXRpdmVFdmVudCkmJiFfdGhpcy5pc1BhcnRPZkRpYWxvZyhuYXRpdmVFdmVudC50YXJnZXQpKXt3aW5kb3cuc2V0VGltZW91dChfdGhpcy5wcm9wcy5vbkNsb3NlLDApO319LF90aGlzLmhhbmRsZU91dHNpZGVTY3JvbGxXaGVlbD1mdW5jdGlvbihuYXRpdmVFdmVudCl7aWYoX3RoaXMuc2hvdWxkRGlhbG9nQ2xvc2VPbkV2ZW50KCdjbG9zZU9uT3V0c2lkZVNjcm9sbCcsbmF0aXZlRXZlbnQpJiYhX3RoaXMuaXNQYXJ0T2ZEaWFsb2cobmF0aXZlRXZlbnQudGFyZ2V0KSl7d2luZG93LnNldFRpbWVvdXQoX3RoaXMucHJvcHMub25DbG9zZSwwKTt9fSxfdGVtcCksX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsX3JldCk7fV9jcmVhdGVDbGFzcyhEaWFsb2csW3trZXk6J2lzUGFydE9mRGlhbG9nJyx2YWx1ZTpmdW5jdGlvbiBpc1BhcnRPZkRpYWxvZyhub2RlKXtpZighbm9kZXx8bm9kZT09PXdpbmRvdyl7cmV0dXJuIGZhbHNlO312YXIgcm9vdHM9W3RoaXMuJHdyYXBwZXJdLmNvbmNhdCh0b0FycmF5LmNhbGwodGhpcy4kd3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKCdbJytfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3BvcnRhbF9fX2RlZmF1bHQuYS5QT1JUQUxfREFUQV9BVFRSSUJVVEUrJ10nKSkubWFwKGZ1bmN0aW9uKGRvbSl7cmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRvbS5nZXRBdHRyaWJ1dGUoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc19wb3J0YWxfX19kZWZhdWx0LmEuUE9SVEFMX0RBVEFfQVRUUklCVVRFKSk7fSkpO3ZhciBlbGVtZW50PW5vZGUubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERT9ub2RlLnBhcmVudE5vZGU6bm9kZTtyZXR1cm4gcm9vdHMuc29tZShmdW5jdGlvbihkb20pe3JldHVybiBkb20uY29udGFpbnMoZWxlbWVudCk7fSk7fX0se2tleTonY29tcG9uZW50RGlkTW91bnQnLHZhbHVlOmZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLmhhbmRsZU91dHNpZGVDbGljayx0cnVlKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLHRoaXMuaGFuZGxlT3V0c2lkZUNsaWNrLHRydWUpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsdGhpcy5oYW5kbGVGb2N1cyx0cnVlKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJyx0aGlzLmhhbmRsZU91dHNpZGVTY3JvbGxXaGVlbCx0cnVlKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLHRoaXMuaGFuZGxlT3V0c2lkZVNjcm9sbFdoZWVsLHRydWUpO2lmKHRoaXMucHJvcHMuY2FwdHVyZUZvY3VzJiYhdGhpcy5pc1BhcnRPZkRpYWxvZyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSl7dGhpcy4kZGlhbG9nLmZvY3VzKCk7fX19LHtrZXk6J2NvbXBvbmVudFdpbGxVbm1vdW50Jyx2YWx1ZTpmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5oYW5kbGVPdXRzaWRlQ2xpY2ssdHJ1ZSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jyx0aGlzLmhhbmRsZU91dHNpZGVDbGljayx0cnVlKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXMnLHRoaXMuaGFuZGxlRm9jdXMsdHJ1ZSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsdGhpcy5oYW5kbGVPdXRzaWRlU2Nyb2xsV2hlZWwsdHJ1ZSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3doZWVsJyx0aGlzLmhhbmRsZU91dHNpZGVTY3JvbGxXaGVlbCx0cnVlKTt9fSx7a2V5OidzaG91bGREaWFsb2dDbG9zZU9uRXZlbnQnLHZhbHVlOmZ1bmN0aW9uIHNob3VsZERpYWxvZ0Nsb3NlT25FdmVudChwcm9wLGV2ZW50KXtyZXR1cm4gaXNGdW5jdGlvbih0aGlzLnByb3BzW3Byb3BdKT90aGlzLnByb3BzW3Byb3BdKGV2ZW50KTp0aGlzLnByb3BzW3Byb3BdO319LHtrZXk6J3JlbmRlckZvY3VzQm91bmRhcnknLHZhbHVlOmZ1bmN0aW9uIHJlbmRlckZvY3VzQm91bmRhcnkoKXtpZih0aGlzLnByb3BzLmNhcHR1cmVGb2N1cyl7cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KCdkaXYnLHtjbGFzc05hbWU6J2Itb2Zmc2NyZWVuJyx0YWJJbmRleDonMCcsJ2FyaWEtaGlkZGVuJzondHJ1ZSd9LCdcXHhBMCcpO319fSx7a2V5OidyZW5kZXInLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3ZhciBfdGhpczI9dGhpcztyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQodGhpcy5wcm9wcy5jb21wb25lbnQsX2V4dGVuZHMoe30sX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfX19kZWZhdWx0KCkodGhpcy5wcm9wcyxEaWFsb2cuaW50ZXJuYWxLZXlzKSx7cmVmOmZ1bmN0aW9uIHJlZihub2RlKXtyZXR1cm4gX3RoaXMyLiR3cmFwcGVyPW5vZGU7fSxjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItZGlhbG9nLXdyYXBwZXInLHRoaXMucHJvcHMuY2xhc3NOYW1lKX0pLHRoaXMucmVuZGVyRm9jdXNCb3VuZGFyeSgpLHRoaXMucHJvcHMuYmVmb3JlLF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KHRoaXMucHJvcHMuZGlhbG9nQ29tcG9uZW50LF9leHRlbmRzKHt9LHRoaXMuZGlhbG9nUHJvcHMse3JlZjpmdW5jdGlvbiByZWYobm9kZSl7cmV0dXJuIF90aGlzMi4kZGlhbG9nPW5vZGU7fSxjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItZGlhbG9nJyx0aGlzLnByb3BzLmRpYWxvZ1Byb3BzLmNsYXNzTmFtZSksb25DbGljazp0aGlzLmhhbmRsZUluc2lkZUNsaWNrLG9uS2V5RG93bjp0aGlzLmhhbmRsZUtleURvd24scm9sZTonZGlhbG9nJyx0YWJJbmRleDonMCd9KSx0aGlzLnByb3BzLmNoaWxkcmVuKSx0aGlzLnByb3BzLmFmdGVyLHRoaXMucmVuZGVyRm9jdXNCb3VuZGFyeSgpKTt9fV0pO3JldHVybiBEaWFsb2c7fShfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuUHVyZUNvbXBvbmVudCk7RGlhbG9nLnByb3BUeXBlcz17JyonOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmFueSxhZnRlcjpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ub2RlLGJlZm9yZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ub2RlLGNhcHR1cmVGb2N1czpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ib29sLGNsb3NlT25Fc2NLZXk6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub25lT2ZUeXBlKFtfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ib29sLF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmNdKSxjbG9zZU9uSW5zaWRlQ2xpY2s6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub25lT2ZUeXBlKFtfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ib29sLF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmNdKSxjbG9zZU9uT3V0c2lkZUNsaWNrOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm9uZU9mVHlwZShbX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYm9vbCxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jXSksY2xvc2VPbk91dHNpZGVGb2N1czpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5vbmVPZlR5cGUoW19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmJvb2wsX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uZnVuY10pLGNsb3NlT25PdXRzaWRlU2Nyb2xsOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm9uZU9mVHlwZShbX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYm9vbCxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jXSksY29tcG9uZW50Ol9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLnN0cmluZyxkaWFsb2dDb21wb25lbnQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc3RyaW5nLGRpYWxvZ1Byb3BzOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLnNoYXBlKHsnKic6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYW55fSksb25DbG9zZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jfTtEaWFsb2cuZGVmYXVsdFByb3BzPXthZnRlcjpudWxsLGJlZm9yZTpudWxsLGNhcHR1cmVGb2N1czp0cnVlLGNoaWxkcmVuOm51bGwsY2xvc2VPbkVzY0tleTpmYWxzZSxjbG9zZU9uSW5zaWRlQ2xpY2s6ZmFsc2UsY2xvc2VPbk91dHNpZGVDbGljazpmYWxzZSxjbG9zZU9uT3V0c2lkZUZvY3VzOmZhbHNlLGNsb3NlT25PdXRzaWRlU2Nyb2xsOmZhbHNlLGNvbXBvbmVudDonZGl2JyxkaWFsb2dDb21wb25lbnQ6J2RpdicsZGlhbG9nUHJvcHM6e30sb25DbG9zZTpub29wLG9uS2V5RG93bjpub29wfTtEaWFsb2cuaW50ZXJuYWxLZXlzPU9iamVjdC5rZXlzKERpYWxvZy5kZWZhdWx0UHJvcHMpOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSBEaWFsb2c7XG5cbi8qKiovIH0pXG4vKioqKioqLyBdKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gaW5kZXguanMiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA0KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCBmMWY3NDljYTMzY2QxNGQ3YzdjNiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy1wb3J0YWxcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtcG9ydGFsXCJ9XG4vLyBtb2R1bGUgaWQgPSAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzXCJ9XG4vLyBtb2R1bGUgaWQgPSAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNsYXNzbmFtZXNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJjbGFzc25hbWVzXCJ9XG4vLyBtb2R1bGUgaWQgPSAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn1cbi8vIG1vZHVsZSBpZCA9IDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IFJlYWN0LCB7UHJvcFR5cGVzfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY3ggZnJvbSAnY2xhc3NuYW1lcyc7XG5cbmltcG9ydCBQb3J0YWwgZnJvbSAnYm91bmRsZXNzLXBvcnRhbCc7XG5pbXBvcnQgb21pdCBmcm9tICdib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzJztcblxuY29uc3QgaXNGdW5jdGlvbiA9ICh4KSA9PiB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJztcbmNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcbmNvbnN0IHRvQXJyYXkgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cbi8qKlxuX19BIG5vbi1ibG9ja2luZywgZm9jdXMtc3RlYWxpbmcgY29udGFpbmVyLl9fXG5cbkEgZGlhbG9nIGRpZmZlcnMgZnJvbSBhIG1vZGFsIGluIHRoYXQgaXQgZG9lcyBub3QgY29tZSB3aXRoIGEgbWFza2luZyBsYXllciAodG8gb2JzY3VyZSB0aGUgcmVzdCBvZiB0aGUgcGFnZSlcbmFuZCB0aGUgdXNlciBjYW4gY2hvb3NlIHRvIHNoaWZ0IGZvY3VzIGF3YXkgZnJvbSB0aGUgZGlhbG9nIGNvbnRlbnRzIHZpYSBtb3VzZSBjbGljayBvciBhIGtleWJvYXJkIHNob3J0Y3V0LlxuXG5JZiB5b3UgZGVjaWRlIHRvIHByb3ZpZGUgYSBoZWFkZXIgaW5zaWRlIHlvdXIgZGlhbG9nLCBpdCdzIHJlY29tbWVuZGVkIHRvIGNvbmZpZ3VyZSB0aGUgW2BhcmlhLWxhYmVsbGVkYnlgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BY2Nlc3NpYmlsaXR5L0FSSUEvQVJJQV9UZWNobmlxdWVzL1VzaW5nX3RoZV9hcmlhLWxhYmVsbGVkYnlfYXR0cmlidXRlKSBhdHRyaWJ1dGUsIHdoaWNoIGNhbiBiZSBhZGRlZCB0byBgcHJvcHMuZGlhbG9nUHJvcHNgLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEaWFsb2cgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgICAvKipcbiAgICAgICAgICogYW55IFtSZWFjdC1zdXBwb3J0ZWQgYXR0cmlidXRlXShodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RhZ3MtYW5kLWF0dHJpYnV0ZXMuaHRtbCNodG1sLWF0dHJpYnV0ZXMpXG4gICAgICAgICAqL1xuICAgICAgICAnKic6IFByb3BUeXBlcy5hbnksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFyYml0cmFyeSBjb250ZW50IHRvIGJlIHJlbmRlcmVkIGFmdGVyIHRoZSBkaWFsb2cgaW4gdGhlIERPTVxuICAgICAgICAgKi9cbiAgICAgICAgYWZ0ZXI6IFByb3BUeXBlcy5ub2RlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhcmJpdHJhcnkgY29udGVudCB0byBiZSByZW5kZXJlZCBiZWZvcmUgdGhlIGRpYWxvZyBpbiB0aGUgRE9NXG4gICAgICAgICAqL1xuICAgICAgICBiZWZvcmU6IFByb3BUeXBlcy5ub2RlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBkZXRlcm1pbmVzIGlmIGZvY3VzIGlzIGFsbG93ZWQgdG8gbW92ZSBhd2F5IGZyb20gdGhlIGRpYWxvZ1xuICAgICAgICAgKi9cbiAgICAgICAgY2FwdHVyZUZvY3VzOiBQcm9wVHlwZXMuYm9vbCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogZW5hYmxlIGRldGVjdGlvbiBvZiBcIkVzY2FwZVwiIGtleXByZXNzZXMgdG8gdHJpZ2dlciBgcHJvcHMub25DbG9zZWA7IGlmIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQsIHRoZSByZXR1cm5cbiAgICAgICAgICogdmFsdWUgZGV0ZXJtaW5lcyBpZiB0aGUgZGlhbG9nIHdpbGwgYmUgY2xvc2VkXG4gICAgICAgICAqL1xuICAgICAgICBjbG9zZU9uRXNjS2V5OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgICAgIFByb3BUeXBlcy5ib29sLFxuICAgICAgICAgICAgUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIF0pLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBlbmFibGUgZGV0ZWN0aW9uIG9mIGNsaWNrcyBpbnNpZGUgdGhlIGRpYWxvZyBhcmVhIHRvIHRyaWdnZXIgYHByb3BzLm9uQ2xvc2VgOyBpZiBhIGZ1bmN0aW9uIGlzIHByb3ZpZGVkLCB0aGUgcmV0dXJuXG4gICAgICAgICAqIHZhbHVlIGRldGVybWluZXMgaWYgdGhlIGRpYWxvZyB3aWxsIGJlIGNsb3NlZFxuICAgICAgICAgKi9cbiAgICAgICAgY2xvc2VPbkluc2lkZUNsaWNrOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgICAgIFByb3BUeXBlcy5ib29sLFxuICAgICAgICAgICAgUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIF0pLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBlbmFibGUgZGV0ZWN0aW9uIG9mIGNsaWNrcyBvdXRzaWRlIHRoZSBkaWFsb2cgYXJlYSB0byB0cmlnZ2VyIGBwcm9wcy5vbkNsb3NlYDsgaWYgYSBmdW5jdGlvbiBpcyBwcm92aWRlZCwgdGhlIHJldHVyblxuICAgICAgICAgKiB2YWx1ZSBkZXRlcm1pbmVzIGlmIHRoZSBkaWFsb2cgd2lsbCBiZSBjbG9zZWRcbiAgICAgICAgICovXG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgICAgICAgICAgUHJvcFR5cGVzLmJvb2wsXG4gICAgICAgICAgICBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgXSksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGVuYWJsZSBkZXRlY3Rpb24gb2YgZm9jdXMgb3V0c2lkZSB0aGUgZGlhbG9nIGFyZWEgdG8gdHJpZ2dlciBgcHJvcHMub25DbG9zZWA7IGlmIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQsIHRoZSByZXR1cm5cbiAgICAgICAgICogdmFsdWUgZGV0ZXJtaW5lcyBpZiB0aGUgZGlhbG9nIHdpbGwgYmUgY2xvc2VkXG4gICAgICAgICAqL1xuICAgICAgICBjbG9zZU9uT3V0c2lkZUZvY3VzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgICAgIFByb3BUeXBlcy5ib29sLFxuICAgICAgICAgICAgUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIF0pLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBlbmFibGUgZGV0ZWN0aW9uIG9mIHNjcm9sbCBhbmQgbW91c2V3aGVlbCBldmVudHMgb3V0c2lkZSB0aGUgZGlhbG9nIGFyZWEgdG8gdHJpZ2dlciBgcHJvcHMub25DbG9zZWA7IGlmIGEgZnVuY3Rpb1xuICAgICAgICAgKiBpcyBwcm92aWRlZCwgdGhlIHJldHVybiB2YWx1ZSBkZXRlcm1pbmVzIGlmIHRoZSBkaWFsb2cgd2lsbCBiZSBjbG9zZWRcbiAgICAgICAgICovXG4gICAgICAgIGNsb3NlT25PdXRzaWRlU2Nyb2xsOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgICAgIFByb3BUeXBlcy5ib29sLFxuICAgICAgICAgICAgUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIF0pLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBvdmVycmlkZSB0aGUgdHlwZSBvZiBgLmItZGlhbG9nLXdyYXBwZXJgIEhUTUwgZWxlbWVudFxuICAgICAgICAgKi9cbiAgICAgICAgY29tcG9uZW50OiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBvdmVycmlkZSB0aGUgdHlwZSBvZiBgLmItZGlhbG9nYCBIVE1MIGVsZW1lbnRcbiAgICAgICAgICovXG4gICAgICAgIGRpYWxvZ0NvbXBvbmVudDogUHJvcFR5cGVzLnN0cmluZyxcblxuICAgICAgICBkaWFsb2dQcm9wczogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogYW55IFtSZWFjdC1zdXBwb3J0ZWQgYXR0cmlidXRlXShodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RhZ3MtYW5kLWF0dHJpYnV0ZXMuaHRtbCNodG1sLWF0dHJpYnV0ZXMpXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICcqJzogUHJvcFR5cGVzLmFueSxcbiAgICAgICAgfSksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGEgY3VzdG9tIGV2ZW50IGhhbmRsZXIgdGhhdCBpcyBjYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZGlhbG9nIHNob3VsZCBiZSB1bnJlbmRlcmVkIGJ5IGl0cyBwYXJlbnQ7IHRoZSBldmVudCBvY2N1cnMgaWYgb25lIG9yIG1vcmUgb2YgdGhlIFwiY2xvc2VPblwiIHByb3BzIChgY2xvc2VPbkVzY0tleWAsIGBjbG9zZU9uT3V0c2lkZUNsaWNrYCwgZXRjLikgYXJlIHBhc3NlZCBhcyBgdHJ1ZWAgYW5kIHRoZSBkaXNtaXNzYWwgY3JpdGVyaWEgYXJlIHNhdGlzZmllZFxuICAgICAgICAgKi9cbiAgICAgICAgb25DbG9zZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgfVxuXG4gICAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgICAgYWZ0ZXI6IG51bGwsXG4gICAgICAgIGJlZm9yZTogbnVsbCxcbiAgICAgICAgY2FwdHVyZUZvY3VzOiB0cnVlLFxuICAgICAgICBjaGlsZHJlbjogbnVsbCxcbiAgICAgICAgY2xvc2VPbkVzY0tleTogZmFsc2UsXG4gICAgICAgIGNsb3NlT25JbnNpZGVDbGljazogZmFsc2UsXG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxuICAgICAgICBjbG9zZU9uT3V0c2lkZUZvY3VzOiBmYWxzZSxcbiAgICAgICAgY2xvc2VPbk91dHNpZGVTY3JvbGw6IGZhbHNlLFxuICAgICAgICBjb21wb25lbnQ6ICdkaXYnLFxuICAgICAgICBkaWFsb2dDb21wb25lbnQ6ICdkaXYnLFxuICAgICAgICBkaWFsb2dQcm9wczoge30sXG4gICAgICAgIG9uQ2xvc2U6IG5vb3AsXG4gICAgICAgIG9uS2V5RG93bjogbm9vcCxcbiAgICB9XG5cbiAgICBzdGF0aWMgaW50ZXJuYWxLZXlzID0gT2JqZWN0LmtleXMoRGlhbG9nLmRlZmF1bHRQcm9wcylcblxuICAgIG1vdW50ZWQgPSBmYWxzZVxuXG4gICAgaXNQYXJ0T2ZEaWFsb2cobm9kZSkge1xuICAgICAgICBpZiAoIW5vZGUgfHwgbm9kZSA9PT0gd2luZG93KSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgICAgIGNvbnN0IHJvb3RzID0gW3RoaXMuJHdyYXBwZXJdLmNvbmNhdChcbiAgICAgICAgICAgIHRvQXJyYXkuY2FsbChcbiAgICAgICAgICAgICAgICB0aGlzLiR3cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoYFske1BvcnRhbC5QT1JUQUxfREFUQV9BVFRSSUJVVEV9XWApXG4gICAgICAgICAgICApLm1hcCgoZG9tKSA9PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkb20uZ2V0QXR0cmlidXRlKFBvcnRhbC5QT1JUQUxfREFUQV9BVFRSSUJVVEUpKSlcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBlbGVtZW50ID0gbm9kZS5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUgPyBub2RlLnBhcmVudE5vZGUgOiBub2RlO1xuXG4gICAgICAgIHJldHVybiByb290cy5zb21lKChkb20pID0+IGRvbS5jb250YWlucyhlbGVtZW50KSk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlT3V0c2lkZUNsaWNrLCB0cnVlKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5oYW5kbGVPdXRzaWRlQ2xpY2ssIHRydWUpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB0aGlzLmhhbmRsZUZvY3VzLCB0cnVlKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuaGFuZGxlT3V0c2lkZVNjcm9sbFdoZWVsLCB0cnVlKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgdGhpcy5oYW5kbGVPdXRzaWRlU2Nyb2xsV2hlZWwsIHRydWUpO1xuXG4gICAgICAgIGlmICh0aGlzLnByb3BzLmNhcHR1cmVGb2N1cyAmJiAhdGhpcy5pc1BhcnRPZkRpYWxvZyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgICAgICAgdGhpcy4kZGlhbG9nLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVPdXRzaWRlQ2xpY2ssIHRydWUpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCB0aGlzLmhhbmRsZU91dHNpZGVDbGljaywgdHJ1ZSk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuaGFuZGxlRm9jdXMsIHRydWUpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5oYW5kbGVPdXRzaWRlU2Nyb2xsV2hlZWwsIHRydWUpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLmhhbmRsZU91dHNpZGVTY3JvbGxXaGVlbCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgc2hvdWxkRGlhbG9nQ2xvc2VPbkV2ZW50KHByb3AsIGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKHRoaXMucHJvcHNbcHJvcF0pID8gdGhpcy5wcm9wc1twcm9wXShldmVudCkgOiB0aGlzLnByb3BzW3Byb3BdO1xuICAgIH1cblxuICAgIGhhbmRsZUZvY3VzID0gKG5hdGl2ZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5wcm9wcy5jYXB0dXJlRm9jdXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZERpYWxvZ0Nsb3NlT25FdmVudCgnY2xvc2VPbk91dHNpZGVGb2N1cycsIG5hdGl2ZUV2ZW50KSAmJiAhdGhpcy5pc1BhcnRPZkRpYWxvZyhuYXRpdmVFdmVudC50YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucHJvcHMub25DbG9zZSwgMCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGV4cGxpY2l0T3JpZ2luYWxUYXJnZXQgaXMgZm9yIEZpcmVmb3gsIGFzIGl0IGRvZXNuJ3Qgc3VwcG9ydCByZWxhdGVkVGFyZ2V0XG4gICAgICAgIGxldCBwcmV2aW91cyA9IG5hdGl2ZUV2ZW50LmV4cGxpY2l0T3JpZ2luYWxUYXJnZXQgfHwgbmF0aXZlRXZlbnQucmVsYXRlZFRhcmdldDtcblxuICAgICAgICBpZiAodGhpcy5pc1BhcnRPZkRpYWxvZyhwcmV2aW91cykgJiYgIXRoaXMuaXNQYXJ0T2ZEaWFsb2cobmF0aXZlRXZlbnQudGFyZ2V0KSkge1xuICAgICAgICAgICAgbmF0aXZlRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHByZXZpb3VzLmZvY3VzKCk7IC8vIHJlc3RvcmUgZm9jdXNcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZUtleURvd24gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZERpYWxvZ0Nsb3NlT25FdmVudCgnY2xvc2VPbkVzY0tleScsIGV2ZW50KSkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucHJvcHMub25DbG9zZSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbktleURvd24pIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25LZXlEb3duKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZUluc2lkZUNsaWNrID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZERpYWxvZ0Nsb3NlT25FdmVudCgnY2xvc2VPbkluc2lkZUNsaWNrJywgZXZlbnQpKSB7XG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnByb3BzLm9uQ2xvc2UsIDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlT3V0c2lkZUNsaWNrID0gKG5hdGl2ZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZERpYWxvZ0Nsb3NlT25FdmVudCgnY2xvc2VPbk91dHNpZGVDbGljaycsIG5hdGl2ZUV2ZW50KSAmJiAhdGhpcy5pc1BhcnRPZkRpYWxvZyhuYXRpdmVFdmVudC50YXJnZXQpKSB7XG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnByb3BzLm9uQ2xvc2UsIDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlT3V0c2lkZVNjcm9sbFdoZWVsID0gKG5hdGl2ZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZERpYWxvZ0Nsb3NlT25FdmVudCgnY2xvc2VPbk91dHNpZGVTY3JvbGwnLCBuYXRpdmVFdmVudCkgJiYgIXRoaXMuaXNQYXJ0T2ZEaWFsb2cobmF0aXZlRXZlbnQudGFyZ2V0KSkge1xuICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQodGhpcy5wcm9wcy5vbkNsb3NlLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlckZvY3VzQm91bmRhcnkoKSB7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmNhcHR1cmVGb2N1cykge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nYi1vZmZzY3JlZW4nIHRhYkluZGV4PScwJyBhcmlhLWhpZGRlbj0ndHJ1ZSc+Jm5ic3A7PC9kaXY+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfSAvLyB1c2VkIHRvIGxvY2sgZm9jdXMgaW50byBhIHBhcnRpY3VsYXIgc3Vic2V0IG9mIERPTVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPHRoaXMucHJvcHMuY29tcG9uZW50XG4gICAgICAgICAgICAgICAgey4uLm9taXQodGhpcy5wcm9wcywgRGlhbG9nLmludGVybmFsS2V5cyl9XG4gICAgICAgICAgICAgICAgcmVmPXsobm9kZSkgPT4gKHRoaXMuJHdyYXBwZXIgPSBub2RlKX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KCdiLWRpYWxvZy13cmFwcGVyJywgdGhpcy5wcm9wcy5jbGFzc05hbWUpfT5cbiAgICAgICAgICAgICAgICB7dGhpcy5yZW5kZXJGb2N1c0JvdW5kYXJ5KCl9XG5cbiAgICAgICAgICAgICAgICB7dGhpcy5wcm9wcy5iZWZvcmV9XG5cbiAgICAgICAgICAgICAgICA8dGhpcy5wcm9wcy5kaWFsb2dDb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgey4uLnRoaXMuZGlhbG9nUHJvcHN9XG4gICAgICAgICAgICAgICAgICAgIHJlZj17KG5vZGUpID0+ICh0aGlzLiRkaWFsb2cgPSBub2RlKX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjeCgnYi1kaWFsb2cnLCB0aGlzLnByb3BzLmRpYWxvZ1Byb3BzLmNsYXNzTmFtZSl9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuaGFuZGxlSW5zaWRlQ2xpY2t9XG4gICAgICAgICAgICAgICAgICAgIG9uS2V5RG93bj17dGhpcy5oYW5kbGVLZXlEb3dufVxuICAgICAgICAgICAgICAgICAgICByb2xlPSdkaWFsb2cnXG4gICAgICAgICAgICAgICAgICAgIHRhYkluZGV4PScwJz5cbiAgICAgICAgICAgICAgICAgICAge3RoaXMucHJvcHMuY2hpbGRyZW59XG4gICAgICAgICAgICAgICAgPC90aGlzLnByb3BzLmRpYWxvZ0NvbXBvbmVudD5cblxuICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLmFmdGVyfVxuXG4gICAgICAgICAgICAgICAge3RoaXMucmVuZGVyRm9jdXNCb3VuZGFyeSgpfVxuICAgICAgICAgICAgPC90aGlzLnByb3BzLmNvbXBvbmVudD5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9ib3VuZGxlc3MtZGlhbG9nL2luZGV4LmpzIl0sInNvdXJjZVJvb3QiOiIifQ== |
@@ -31,7 +31,5 @@ import React from 'react'; | ||
onClose={this.toggleDialog} | ||
wrapperProps={{ | ||
style: { | ||
left: this.state.leftPosition, | ||
top: this.state.topPosition, | ||
}, | ||
style={{ | ||
left: this.state.leftPosition, | ||
top: this.state.topPosition, | ||
}}> | ||
@@ -38,0 +36,0 @@ <iframe |
120
index.js
@@ -6,3 +6,2 @@ import React, {PropTypes} from 'react'; | ||
import omit from 'boundless-utils-omit-keys'; | ||
import uuid from 'boundless-utils-uuid'; | ||
@@ -14,3 +13,2 @@ const isFunction = (x) => typeof x === 'function'; | ||
/** | ||
# Dialog | ||
__A non-blocking, focus-stealing container.__ | ||
@@ -21,5 +19,3 @@ | ||
Specific areas (header, body, footer) are defined to provide easy conformance to the | ||
[WAI-ARIA spec](http://www.w3.org * /TR/wai-aria/states_and_properties#aria-labelledby) for `aria-labelledby` | ||
and `aria-describedby` (screen reader * accessibility). Their use is optional, but encouraged. | ||
If you decide to provide a header inside your dialog, it's recommended to configure the [`aria-labelledby`](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-labelledby_attribute) attribute, which can be added to `props.dialogProps`. | ||
*/ | ||
@@ -29,2 +25,7 @@ export default class Dialog extends React.PureComponent { | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
'*': PropTypes.any, | ||
/** | ||
* arbitrary content to be rendered after the dialog in the DOM | ||
@@ -40,7 +41,2 @@ */ | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-dialog-body` node | ||
*/ | ||
bodyProps: PropTypes.object, | ||
/** | ||
* determines if focus is allowed to move away from the dialog | ||
@@ -50,4 +46,2 @@ */ | ||
children: PropTypes.node, | ||
/** | ||
@@ -99,30 +93,22 @@ * enable detection of "Escape" keypresses to trigger `props.onClose`; if a function is provided, the return | ||
/** | ||
* text, ReactElements, etc. comprising the "footer" area of the dialog, e.g. confirm/cancel buttons | ||
* override the type of `.b-dialog-wrapper` HTML element | ||
*/ | ||
footer: PropTypes.node, | ||
component: PropTypes.string, | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-dialog-footer` node | ||
* override the type of `.b-dialog` HTML element | ||
*/ | ||
footerProps: PropTypes.object, | ||
dialogComponent: PropTypes.string, | ||
/** | ||
* text, ReactElements, etc. to represent the "title bar" area of the dialog | ||
*/ | ||
header: PropTypes.node, | ||
dialogProps: PropTypes.shape({ | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
'*': PropTypes.any, | ||
}), | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-dialog-header` node | ||
* a custom event handler that is called to indicate that the dialog should be unrendered by its parent; the event occurs if one or more of the "closeOn" props (`closeOnEscKey`, `closeOnOutsideClick`, etc.) are passed as `true` and the dismissal criteria are satisfied | ||
*/ | ||
headerProps: PropTypes.object, | ||
/** | ||
* a custom event handler that is called to indicate that the dialog should be unrendered by its parent; the event occurs if one or more of the `closeOn` props (`closeOnEscKey`, `closeOnOutsideClick`, etc.) are passed as `true` and the dismissal criteria are satisfied | ||
*/ | ||
onClose: PropTypes.func, | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-dialog-wrapper` node | ||
*/ | ||
wrapperProps: PropTypes.object, | ||
} | ||
@@ -133,3 +119,2 @@ | ||
before: null, | ||
bodyProps: {}, | ||
captureFocus: true, | ||
@@ -142,9 +127,7 @@ children: null, | ||
closeOnOutsideScroll: false, | ||
footer: null, | ||
footerProps: {}, | ||
header: null, | ||
headerProps: {}, | ||
component: 'div', | ||
dialogComponent: 'div', | ||
dialogProps: {}, | ||
onClose: noop, | ||
onKeyDown: noop, | ||
wrapperProps: {}, | ||
} | ||
@@ -156,6 +139,2 @@ | ||
// fallbacks if one isn't passed | ||
uuidHeader = uuid() | ||
uuidBody = uuid() | ||
isPartOfDialog(node) { | ||
@@ -247,38 +226,2 @@ if (!node || node === window) { return false; } | ||
renderBody() { | ||
return ( | ||
<div | ||
{...this.props.bodyProps} | ||
id={this.props.bodyProps.id || this.uuidBody} | ||
className={cx('b-dialog-body', this.props.bodyProps.className)}> | ||
{this.props.children} | ||
</div> | ||
); | ||
} | ||
renderFooter() { | ||
if (this.props.footer) { | ||
return ( | ||
<footer | ||
{...this.props.footerProps} | ||
className={cx('b-dialog-footer', this.props.footerProps.className)}> | ||
{this.props.footer} | ||
</footer> | ||
); | ||
} | ||
} | ||
renderHeader() { | ||
if (this.props.header) { | ||
return ( | ||
<header | ||
{...this.props.headerProps} | ||
id={this.props.headerProps.id || this.uuidHeader} | ||
className={cx('b-dialog-header', this.props.headerProps.className)}> | ||
{this.props.header} | ||
</header> | ||
); | ||
} | ||
} | ||
renderFocusBoundary() { | ||
@@ -294,7 +237,6 @@ if (this.props.captureFocus) { | ||
return ( | ||
<div | ||
{...this.props.wrapperProps} | ||
<this.props.component | ||
{...omit(this.props, Dialog.internalKeys)} | ||
ref={(node) => (this.$wrapper = node)} | ||
className={cx('b-dialog-wrapper', this.props.wrapperProps.className)} | ||
tabIndex='0'> | ||
className={cx('b-dialog-wrapper', this.props.className)}> | ||
{this.renderFocusBoundary()} | ||
@@ -304,16 +246,12 @@ | ||
<div | ||
{...omit(this.props, Dialog.internalKeys)} | ||
<this.props.dialogComponent | ||
{...this.dialogProps} | ||
ref={(node) => (this.$dialog = node)} | ||
className={cx('b-dialog', this.props.className)} | ||
className={cx('b-dialog', this.props.dialogProps.className)} | ||
onClick={this.handleInsideClick} | ||
onKeyDown={this.handleKeyDown} | ||
role='dialog' | ||
aria-labelledby={this.uuidHeader} | ||
aria-describedby={this.uuidBody} | ||
tabIndex='0'> | ||
{this.renderHeader()} | ||
{this.renderBody()} | ||
{this.renderFooter()} | ||
</div> | ||
{this.props.children} | ||
</this.props.dialogComponent> | ||
@@ -323,5 +261,5 @@ {this.props.after} | ||
{this.renderFocusBoundary()} | ||
</div> | ||
</this.props.component> | ||
); | ||
} | ||
} |
@@ -11,3 +11,3 @@ /* eslint no-unused-expressions:0 */ | ||
import Popover from '../boundless-popover/index'; | ||
import conformanceChecker from '../boundless-utils-conformance/index'; | ||
import {$, $$, conformanceChecker} from '../boundless-utils-test-helpers/index'; | ||
@@ -26,58 +26,27 @@ describe('Dialog component', () => { | ||
it('conforms to the Boundless prop interface standards', () => conformanceChecker(render, Dialog, {}, '$dialog')); | ||
it('conforms to the Boundless prop interface standards', () => conformanceChecker(render, Dialog, {})); | ||
it('renders .b-dialog', () => { | ||
render(<Dialog />); | ||
expect(document.querySelector('.b-dialog')).not.toBe(null); | ||
expect($('.b-dialog')).not.toBe(null); | ||
}); | ||
it('renders .b-dialog-body', () => { | ||
render(<Dialog />); | ||
expect(document.querySelector('.b-dialog-body')).not.toBe(null); | ||
it('accepts component customization', () => { | ||
render(<Dialog component='figure' />); | ||
expect($('figure.b-dialog-wrapper')).not.toBe(null); | ||
}); | ||
it('renders .b-dialog-footer', () => { | ||
render(<Dialog footer='x' />); | ||
expect(document.querySelector('.b-dialog-footer')).not.toBe(null); | ||
it('accepts dialog component customization', () => { | ||
render(<Dialog dialogComponent='article' />); | ||
expect($('article.b-dialog')).not.toBe(null); | ||
}); | ||
it('renders .b-dialog-header', () => { | ||
render(<Dialog header='x' />); | ||
expect(document.querySelector('.b-dialog-header')).not.toBe(null); | ||
}); | ||
it('accepts arbitrary React-supported HTML attributes via props.bodyProps', () => { | ||
render(<Dialog bodyProps={{'data-id': 'foo'}} />); | ||
expect(document.querySelector('.b-dialog-body').getAttribute('data-id')).toBe('foo'); | ||
}); | ||
it('accepts arbitrary React-supported HTML attributes via props.footerProps', () => { | ||
render(<Dialog footer='x' footerProps={{'data-id': 'foo'}} />); | ||
expect(document.querySelector('.b-dialog-footer').getAttribute('data-id')).toBe('foo'); | ||
}); | ||
it('accepts arbitrary React-supported HTML attributes via props.headerProps', () => { | ||
render(<Dialog header='x' headerProps={{'data-id': 'foo'}} />); | ||
expect(document.querySelector('.b-dialog-header').getAttribute('data-id')).toBe('foo'); | ||
}); | ||
it('accepts an additional class as a string without replacing the core hook', () => { | ||
it('accepts an additional CSS class', () => { | ||
render(<Dialog className='foo' />); | ||
expect(document.querySelector('.b-dialog').classList.contains('b-dialog')).toBe(true); | ||
expect(document.querySelector('.b-dialog').classList.contains('foo')).toBe(true); | ||
expect($('.b-dialog-wrapper.foo')).not.toBe(null); | ||
}); | ||
it('accepts renderable header content', () => { | ||
render(<Dialog header='foo' />); | ||
expect(document.querySelector('.b-dialog-header').textContent).toBe('foo'); | ||
}); | ||
it('accepts renderable footer content', () => { | ||
render(<Dialog footer='foo' />); | ||
expect(document.querySelector('.b-dialog-footer').textContent).toBe('foo'); | ||
}); | ||
it('accepts renderable content as a nested child', () => { | ||
render(<Dialog>foo</Dialog>); | ||
expect(document.querySelector('.b-dialog-body').textContent).toBe('foo'); | ||
expect($('.b-dialog').textContent).toBe('foo'); | ||
}); | ||
@@ -87,3 +56,3 @@ | ||
render(<Dialog captureFocus={true} />); | ||
expect(document.querySelectorAll('.b-offscreen[tabindex="0"]').length).toBe(2); | ||
expect($$('.b-offscreen[tabindex="0"]').length).toBe(2); | ||
}); | ||
@@ -93,3 +62,3 @@ | ||
render(<Dialog captureFocus={false} />); | ||
expect(document.querySelectorAll('.b-offscreen[tabindex="0"]').length).toBe(0); | ||
expect($$('.b-offscreen[tabindex="0"]').length).toBe(0); | ||
}); | ||
@@ -100,3 +69,3 @@ | ||
render(<Dialog captureFocus={true} />); | ||
expect(document.activeElement).toBe(document.querySelector('.b-dialog')); | ||
expect(document.activeElement).toBe($('.b-dialog')); | ||
}); | ||
@@ -106,3 +75,3 @@ | ||
render(<Dialog captureFocus={false} />); | ||
expect(document.activeElement).not.toBe(document.querySelector('.b-dialog')); | ||
expect(document.activeElement).not.toBe($('.b-dialog')); | ||
}); | ||
@@ -119,3 +88,3 @@ | ||
expect(document.activeElement).toBe(document.querySelector('.b-dialog')); | ||
expect(document.activeElement).toBe($('.b-dialog')); | ||
}); | ||
@@ -255,3 +224,3 @@ }); | ||
expect(document.activeElement).not.toBe(document.querySelector('.b-dialog')); | ||
expect(document.activeElement).not.toBe($('.b-dialog')); | ||
@@ -267,3 +236,3 @@ element.handleFocus({target: mountNode}); | ||
expect(document.activeElement).not.toBe(document.querySelector('.b-dialog')); | ||
expect(document.activeElement).not.toBe($('.b-dialog')); | ||
@@ -288,3 +257,3 @@ element.handleFocus({target: mountNode}); | ||
expect(document.activeElement).not.toBe(document.querySelector('.b-dialog')); | ||
expect(document.activeElement).not.toBe($('.b-dialog')); | ||
@@ -300,3 +269,3 @@ element.handleFocus({target: mountNode}); | ||
expect(document.activeElement).not.toBe(document.querySelector('.b-dialog')); | ||
expect(document.activeElement).not.toBe($('.b-dialog')); | ||
@@ -443,3 +412,3 @@ element.handleFocus({target: mountNode}); | ||
document.querySelector('.bar').click(); | ||
$('.bar').click(); | ||
@@ -446,0 +415,0 @@ expect(element.state.outerPopoverRendered).toBe(true); |
{ | ||
"name": "boundless-dialog", | ||
"version": "1.0.0-beta.6", | ||
"version": "1.0.0-beta.7", | ||
"description": "A non-blocking, focus-stealing container.", | ||
@@ -27,5 +27,4 @@ "main": "build/index.js", | ||
"dependencies": { | ||
"boundless-portal": "^1.0.0-beta.6", | ||
"boundless-utils-omit-keys": "^1.0.0-beta.6", | ||
"boundless-utils-uuid": "^1.0.0-beta.5", | ||
"boundless-portal": "^1.0.0-beta.7", | ||
"boundless-utils-omit-keys": "^1.0.0-beta.7", | ||
"classnames": "^2.1.5" | ||
@@ -32,0 +31,0 @@ }, |
265
README.md
@@ -0,4 +1,6 @@ | ||
<!--- | ||
THIS IS AN AUTOGENERATED FILE. EDIT INDEX.JS INSTEAD. | ||
--> | ||
# Dialog | ||
# Dialog | ||
__A non-blocking, focus-stealing container.__ | ||
@@ -9,9 +11,72 @@ | ||
Specific areas (header, body, footer) are defined to provide easy conformance to the | ||
[WAI-ARIA spec](http://www.w3.org * /TR/wai-aria/states_and_properties#aria-labelledby) for `aria-labelledby` | ||
and `aria-describedby` (screen reader * accessibility). Their use is optional, but encouraged. | ||
If you decide to provide a header inside your dialog, it's recommended to configure the [`aria-labelledby`](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-labelledby_attribute) attribute, which can be added to `props.dialogProps`. | ||
## Example Usage | ||
```jsx | ||
import React from 'react'; | ||
import {findDOMNode} from 'react-dom'; | ||
import Button from '../../boundless-button/index'; | ||
import Dialog from '../index'; | ||
export default class DialogDemo extends React.PureComponent { | ||
state = { | ||
showDialog: false, | ||
} | ||
componentDidMount() { | ||
const node = findDOMNode(this.refs.trigger); | ||
this.setState({ | ||
leftPosition: node.offsetLeft + node.offsetWidth + 10 + 'px', | ||
topPosition: node.offsetTop + 'px', | ||
}); | ||
} | ||
toggleDialog = () => { | ||
this.setState({showDialog: !this.state.showDialog}); | ||
} | ||
renderDialog() { | ||
if (this.state.showDialog) { | ||
return ( | ||
<Dialog | ||
closeOnEscKey={true} | ||
closeOnOutsideClick={true} | ||
onClose={this.toggleDialog} | ||
style={{ | ||
left: this.state.leftPosition, | ||
top: this.state.topPosition, | ||
}}> | ||
<iframe | ||
className='dialog-demo-video-frame' | ||
width='560' | ||
height='315' | ||
src='https://www.youtube.com/embed/HEheh1BH34Q?autoplay=1&showinfo=0&autohide=1' | ||
frameBorder='0' | ||
allowFullScreen /> | ||
<Button | ||
className='dialog-demo-close-button' | ||
title='Close' | ||
onPressed={this.toggleDialog} /> | ||
</Dialog> | ||
); | ||
} | ||
} | ||
render() { | ||
return ( | ||
<div> | ||
<Button ref='trigger' onPressed={this.toggleDialog}>Launch Video</Button> | ||
{this.renderDialog()} | ||
</div> | ||
); | ||
} | ||
} | ||
``` | ||
## Props | ||
_Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/Dialog#props)._ | ||
> Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/Dialog#props). | ||
@@ -25,129 +90,101 @@ ### Required Props | ||
<table> | ||
<tr> | ||
<th>Name</th> | ||
<th>Type</th> | ||
<th>Default Value</th> | ||
<th>Description</th> | ||
</tr> | ||
- __`*`__ ・ any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
<tr> | ||
<td>after</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>arbitrary content to be rendered after the dialog in the DOM</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any` | `n/a` | ||
<tr> | ||
<td>before</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>arbitrary content to be rendered before the dialog in the DOM</td> | ||
</tr> | ||
- __`after`__ ・ arbitrary content to be rendered after the dialog in the DOM | ||
<tr> | ||
<td>bodyProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-dialog-body` node</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any renderable` | `null` | ||
<tr> | ||
<td>captureFocus</td> | ||
<td><pre><code>bool</code></pre></td> | ||
<td><pre><code class="language-js">true</code></pre></td> | ||
<td>determines if focus is allowed to move away from the dialog</td> | ||
</tr> | ||
- __`before`__ ・ arbitrary content to be rendered before the dialog in the DOM | ||
<tr> | ||
<td>children</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td></td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any renderable` | `null` | ||
<tr> | ||
<td>closeOnEscKey</td> | ||
<td><pre><code>bool or function</code></pre></td> | ||
<td><pre><code class="language-js">false</code></pre></td> | ||
<td>enable detection of "Escape" keypresses to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed</td> | ||
</tr> | ||
- __`captureFocus`__ ・ determines if focus is allowed to move away from the dialog | ||
<tr> | ||
<td>closeOnInsideClick</td> | ||
<td><pre><code>bool or function</code></pre></td> | ||
<td><pre><code class="language-js">false</code></pre></td> | ||
<td>enable detection of clicks inside the dialog area to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`bool` | `true` | ||
<tr> | ||
<td>closeOnOutsideClick</td> | ||
<td><pre><code>bool or function</code></pre></td> | ||
<td><pre><code class="language-js">false</code></pre></td> | ||
<td>enable detection of clicks outside the dialog area to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed</td> | ||
</tr> | ||
- __`closeOnEscKey`__ ・ enable detection of "Escape" keypresses to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed | ||
<tr> | ||
<td>closeOnOutsideFocus</td> | ||
<td><pre><code>bool or function</code></pre></td> | ||
<td><pre><code class="language-js">false</code></pre></td> | ||
<td>enable detection of focus outside the dialog area to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`bool or function` | `false` | ||
<tr> | ||
<td>closeOnOutsideScroll</td> | ||
<td><pre><code>bool or function</code></pre></td> | ||
<td><pre><code class="language-js">false</code></pre></td> | ||
<td>enable detection of scroll and mousewheel events outside the dialog area to trigger `props.onClose`; if a functio | ||
is provided, the return value determines if the dialog will be closed</td> | ||
</tr> | ||
- __`closeOnInsideClick`__ ・ enable detection of clicks inside the dialog area to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed | ||
<tr> | ||
<td>footer</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>text, ReactElements, etc. comprising the "footer" area of the dialog, e.g. confirm/cancel buttons</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`bool or function` | `false` | ||
<tr> | ||
<td>footerProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-dialog-footer` node</td> | ||
</tr> | ||
- __`closeOnOutsideClick`__ ・ enable detection of clicks outside the dialog area to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed | ||
<tr> | ||
<td>header</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>text, ReactElements, etc. to represent the "title bar" area of the dialog</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`bool or function` | `false` | ||
<tr> | ||
<td>headerProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-dialog-header` node</td> | ||
</tr> | ||
- __`closeOnOutsideFocus`__ ・ enable detection of focus outside the dialog area to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed | ||
<tr> | ||
<td>onClose</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">() => {}</code></pre></td> | ||
<td>a custom event handler that is called to indicate that the dialog should be unrendered by its parent; the event occurs if one or more of the `closeOn` props (`closeOnEscKey`, `closeOnOutsideClick`, etc.) are passed as `true` and the dismissal criteria are satisfied</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`bool or function` | `false` | ||
<tr> | ||
<td>wrapperProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-dialog-wrapper` node</td> | ||
</tr> | ||
- __`closeOnOutsideScroll`__ ・ enable detection of scroll and mousewheel events outside the dialog area to trigger `props.onClose`; if a functio | ||
is provided, the return value determines if the dialog will be closed | ||
</table> | ||
Expects | Default Value | ||
- | - | ||
`bool or function` | `false` | ||
- __`component`__ ・ override the type of `.b-dialog-wrapper` HTML element | ||
Expects | Default Value | ||
- | - | ||
`string` | `'div'` | ||
- __`dialogComponent`__ ・ override the type of `.b-dialog` HTML element | ||
Expects | Default Value | ||
- | - | ||
`string` | `'div'` | ||
- __`dialogProps`__ | ||
Expects | Default Value | ||
- | - | ||
`object` | `{}` | ||
- __`onClose`__ ・ a custom event handler that is called to indicate that the dialog should be unrendered by its parent; the event occurs if one or more of the "closeOn" props (`closeOnEscKey`, `closeOnOutsideClick`, etc.) are passed as `true` and the dismissal criteria are satisfied | ||
Expects | Default Value | ||
- | - | ||
`function` | `() => {}` | ||
## Reference Styles | ||
### Stylus | ||
```stylus | ||
// Bring in Boundless's base Stylus variables | ||
@require "node_modules/boundless-dialog/variables" | ||
// Redefine any variables as desired, e.g. | ||
color-accent = royalblue | ||
// Bring in the component styles; they will be autoconfigured based on the above | ||
@require "node_modules/boundless-dialog/style" | ||
``` | ||
### CSS | ||
If desired, a precompiled plain CSS stylesheet is available for customization at `/build/style.css`, based on Boundless's [default variables](https://github.com/enigma-io/boundless/blob/master/variables.styl). | ||
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
5
9
189
86945
636