UNPKG

boundless-popover

Version:

A non-blocking container positioned to a specific anchor element.

2 lines 94.2 kB
module.exports=function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=12)}([function(e,t,n){"function"==typeof Symbol&&Symbol.iterator;e.exports=n(10)()},function(e,t){e.exports=require("boundless-dialog")},function(e,t){e.exports=require("boundless-portal")},function(e,t){e.exports=require("boundless-utils-omit-keys")},function(e,t){e.exports=require("boundless-utils-transform-property")},function(e,t){e.exports=require("classnames")},function(e,t){e.exports=require("react")},function(e,t){e.exports=require("react-dom")},function(e,t,n){"use strict";function r(e){return function(){return e}}var o=function(){};o.thatReturns=r,o.thatReturnsFalse=r(!1),o.thatReturnsTrue=r(!0),o.thatReturnsNull=r(null),o.thatReturnsThis=function(){return this},o.thatReturnsArgument=function(e){return e},e.exports=o},function(e,t,n){"use strict";function r(e,t,n,r,i,a,c,s){if(o(t),!e){var p;if(void 0===t)p=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var l=[n,r,i,a,c,s],h=0;p=new Error(t.replace(/%s/g,function(){return l[h++]})),p.name="Invariant Violation"}throw p.framesToPop=1,p}}var o=function(e){};e.exports=r},function(e,t,n){"use strict";var r=n(8),o=n(9),i=n(11);e.exports=function(){function e(e,t,n,r,a,c){c!==i&&o(!1,"Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types")}function t(){return e}e.isRequired=e;var n={array:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t};return n.checkPropTypes=r,n.PropTypes=n,n}},function(e,t,n){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function a(e){switch(e[0]){case"N":return"S";case"S":return"N";case"E":return"W"}return"E"}Object.defineProperty(t,"__esModule",{value:!0});var c=n(0),s=n.n(c),p=n(6),l=(n.n(p),n(7)),h=(n.n(l),n(5)),u=n.n(h),f=n(1),d=n.n(f),y=n(2),g=n.n(y),m=n(3),v=n.n(m),x=n(4),w=n.n(x),b=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},R=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),E=/\s?b-popover-(anchor|self)-(start|middle|end)/g,O=n.i(p.createElement)("svg",{viewBox:"0 0 14 9.5",xmlns:"http://www.w3.org/2000/svg"},n.i(p.createElement)("g",null,n.i(p.createElement)("polygon",{className:"b-popover-caret-border",fill:"#000",points:"7 0 14 10 0 10"}),n.i(p.createElement)("polygon",{className:"b-popover-caret-fill",fill:"#FFF",points:"6.98230444 1.75 12.75 10 1.25 10"}))),N=[{name:"NNW",ax:0,ay:0,dx:0,dy:2},{name:"N",ax:1,ay:0,dx:1,dy:2},{name:"NNE",ax:2,ay:0,dx:2,dy:2},{name:"ENE",ax:2,ay:0,dx:0,dy:0},{name:"E",ax:2,ay:1,dx:0,dy:1},{name:"ESE",ax:2,ay:2,dx:0,dy:2},{name:"SSE",ax:2,ay:2,dx:2,dy:0},{name:"S",ax:1,ay:2,dx:1,dy:0},{name:"SSW",ax:0,ay:2,dx:0,dy:0},{name:"WSW",ax:0,ay:2,dx:2,dy:2},{name:"W",ax:0,ay:1,dx:2,dy:1},{name:"WNW",ax:0,ay:0,dx:2,dy:0}],P=function(e){function t(){var e,i,a,c;r(this,t);for(var s=arguments.length,p=Array(s),h=0;h<s;h++)p[h]=arguments[h];return i=a=o(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(p))),a.align=function(){var e=a.props.anchor instanceof HTMLElement?a.props.anchor:n.i(l.findDOMNode)(a.props.anchor),r=a.props.caretAnchor?a.props.caretAnchor instanceof HTMLElement?a.props.caretAnchor:n.i(l.findDOMNode)(a.props.caretAnchor):e;a.cacheViewportCartography(e,r);var o=a.getValidAlignmentPreset(),i=t.getAlignmentClassFragment;a.dialog.$wrapper.className=a.dialog.$wrapper.className.replace(E,"")+" b-popover-anchor-x-"+i(o.ax)+" b-popover-anchor-y-"+i(o.ay)+" b-popover-self-x-"+i(o.dx)+" b-popover-self-y-"+i(o.dy);var c=Math.round(a.getNextDialogXPosition(o)),s=Math.round(a.getNextDialogYPosition(o));a.dialog.$wrapper.style[w.a]="translate("+c+"px, "+s+"px)";var p=o.name[0],h="N"===p||"S"===p;a.$caret.style[h?"left":"top"]=Math.round(a.getNextCaretXPosition(o))+"px",a.$caret.style[h?"top":"left"]="0px"},c=i,o(a,c)}return i(t,e),R(t,[{key:"cacheViewportCartography",value:function(e,t){var n=document.body.getBoundingClientRect();this.anchorRect=e.getBoundingClientRect(),this.caretAnchorRect=t.getBoundingClientRect(),this.bodyLeft=-1*n.left,this.bodyTop=-1*n.top}},{key:"getNextCaretXPosition",value:function(e){var t=e.name,n=(e.ax,e.dx),r=(e.ay,e.dy),o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.$caret,i=0;return"N"===t[0]||"S"===t[0]?(i=this.caretAnchorRect.left-this.anchorRect.left+this.caretAnchorRect.width/2,1===n?i+=(this.dialog.$wrapper.clientWidth-this.anchorRect.width)/2:2===n&&(i+=this.dialog.$wrapper.clientWidth-this.anchorRect.width)):(i=this.caretAnchorRect.top-this.anchorRect.top+this.caretAnchorRect.height/2,1===r?i+=(this.dialog.$wrapper.clientHeight-this.anchorRect.height)/2:2===r&&(i+=this.dialog.$wrapper.clientHeight-this.anchorRect.height)),i-=o.clientWidth/2}},{key:"getNextDialogXPosition",value:function(e){var t=e.ax,n=e.dx,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.dialog.$wrapper,o=this.anchorRect.left+this.bodyLeft;switch(t){case 1:o+=this.anchorRect.width/2;break;case 2:o+=this.anchorRect.width}switch(n){case 1:o-=r.clientWidth/2;break;case 2:o-=r.clientWidth}return o}},{key:"getNextDialogYPosition",value:function(e){var t=e.ay,n=e.dy,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.dialog.$wrapper,o=this.anchorRect.top+this.bodyTop;switch(t){case 1:o+=this.anchorRect.height/2;break;case 2:o+=this.anchorRect.height}switch(n){case 1:o-=r.clientHeight/2;break;case 2:o-=r.clientHeight}return o}},{key:"isPositionValid",value:function(e,t,n){var r=e.name,o=e.ax,i=e.ay,a=(e.dx,e.dy,r[0]);return"N"===a||"S"===a?!("N"===a&&this.anchorRect.top-t<0)&&(!("S"===a&&this.anchorRect.bottom+t>window.innerHeight)&&(0===o?!(this.anchorRect.left+n>window.innerWidth||this.anchorRect.left<0):1===o?!(this.anchorRect.left-n/2<0||this.anchorRect.left+n/2>window.innerWidth):!(this.anchorRect.left-n<0||this.anchorRect.right>window.innerWidth))):"W"!==a&&"E"!==a||!("W"===a&&this.anchorRect.left-n<0)&&(!("E"===a&&this.anchorRect.right+n>window.innerWidth)&&(0===i?!(this.anchorRect.top+t>window.innerHeight||this.anchorRect.top<0):1===i?!(this.anchorRect.top+this.anchorRect.height/2-t/2<0||this.anchorRect.top+this.anchorRect.height/2+t/2>window.innerHeight):!(this.anchorRect.top-t<0||this.anchorRect.bottom>window.innerHeight)))}},{key:"getValidAlignmentPreset",value:function(){var e=this,t=this.dialog.$wrapper.clientWidth,n=this.dialog.$wrapper.clientHeight,r=N.filter(function(r){return e.isPositionValid(r,n,t)});if(-1!==r.indexOf(this.props.preset)||!this.props.autoReposition||!r.length)return this.props.preset;var o=r.filter(function(t){return t.name[0]===e.props.preset.name[0]});if(o.length)return o[0];var i=a(this.props.preset.name),c=r.filter(function(e){return e.name[0]===i});return c.length?c[0]:r[0]}},{key:"componentDidMount",value:function(){this.align(),window.addEventListener("resize",this.align,!0)}},{key:"componentDidUpdate",value:function(){this.align()}},{key:"componentWillUnmount",value:function(){window.removeEventListener("resize",this.align,!0)}},{key:"render",value:function(){var e=this,r=this.props;return n.i(p.createElement)(g.a,r.portalProps,n.i(p.createElement)(d.a,b({},v()(r,t.internalKeys),{ref:function(t){return e.dialog=t},before:n.i(p.cloneElement)(r.caretComponent,{ref:function(t){return e.$caret=t},className:u()("b-popover-caret",r.caretComponent.props.className)}),className:u()("b-popover",r.className)})))}}],[{key:"getAlignmentClassFragment",value:function(e){switch(e){case 0:return"start";case 1:return"middle";case 2:return"end"}}}]),t}(p.PureComponent);P.preset=N.reduce(function(e,t){return e[t.name]=t,e},{}),P.propTypes=b({},d.a.propTypes,{anchor:s.a.oneOfType([s.a.instanceOf(HTMLElement),s.a.shape({props:s.a.object})]).isRequired,autoReposition:s.a.bool,caretAnchor:s.a.oneOfType([s.a.instanceOf(HTMLElement),s.a.shape({props:s.a.object})]),caretComponent:s.a.element,portalProps:s.a.shape(g.a.PropTypes),preset:s.a.oneOf([P.preset.NNW,P.preset.N,P.preset.NNE,P.preset.ENE,P.preset.E,P.preset.ESE,P.preset.SSE,P.preset.S,P.preset.SSW,P.preset.WSW,P.preset.W,P.preset.WNW])}),P.defaultProps=b({},d.a.defaultProps,{anchor:void 0,autoReposition:!0,captureFocus:!1,caretAnchor:void 0,caretComponent:O,closeOnEscKey:!0,closeOnOutsideClick:!0,closeOnOutsideScroll:!0,portalProps:{},preset:P.preset.S}),P.internalKeys=function(e,t){return e.filter(function(e){return-1===t.indexOf(e)})}(Object.keys(P.defaultProps),d.a.internalKeys),t.default=P}]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIDg1OGVlMTQ4ZDQ1MTZhM2ViZWI2Iiwid2VicGFjazovLy8uL34vcHJvcC10eXBlcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtZGlhbG9nXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy1wb3J0YWxcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXV0aWxzLW9taXQta2V5c1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtdXRpbHMtdHJhbnNmb3JtLXByb3BlcnR5XCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImNsYXNzbmFtZXNcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3QtZG9tXCJ9Iiwid2VicGFjazovLy8uL34vZmJqcy9saWIvZW1wdHlGdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2ZianMvbGliL2ludmFyaWFudC5qcyIsIndlYnBhY2s6Ly8vLi9+L3Byb3AtdHlwZXMvZmFjdG9yeVdpdGhUaHJvd2luZ1NoaW1zLmpzIiwid2VicGFjazovLy8uL34vcHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvYm91bmRsZXNzLXBvcG92ZXIvaW5kZXguanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJ2YWx1ZSIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJyZXF1aXJlIiwibWFrZUVtcHR5RnVuY3Rpb24iLCJhcmciLCJlbXB0eUZ1bmN0aW9uIiwidGhhdFJldHVybnMiLCJ0aGF0UmV0dXJuc0ZhbHNlIiwidGhhdFJldHVybnNUcnVlIiwidGhhdFJldHVybnNOdWxsIiwidGhhdFJldHVybnNUaGlzIiwidGhpcyIsInRoYXRSZXR1cm5zQXJndW1lbnQiLCJpbnZhcmlhbnQiLCJjb25kaXRpb24iLCJmb3JtYXQiLCJhIiwiYiIsImUiLCJmIiwidmFsaWRhdGVGb3JtYXQiLCJlcnJvciIsInVuZGVmaW5lZCIsIkVycm9yIiwiYXJncyIsImFyZ0luZGV4IiwicmVwbGFjZSIsImZyYW1lc1RvUG9wIiwiUmVhY3RQcm9wVHlwZXNTZWNyZXQiLCJzaGltIiwicHJvcHMiLCJwcm9wTmFtZSIsImNvbXBvbmVudE5hbWUiLCJsb2NhdGlvbiIsInByb3BGdWxsTmFtZSIsInNlY3JldCIsImdldFNoaW0iLCJpc1JlcXVpcmVkIiwiUmVhY3RQcm9wVHlwZXMiLCJhcnJheSIsImJvb2wiLCJmdW5jIiwibnVtYmVyIiwic3RyaW5nIiwic3ltYm9sIiwiYW55IiwiYXJyYXlPZiIsImVsZW1lbnQiLCJpbnN0YW5jZU9mIiwibm9kZSIsIm9iamVjdE9mIiwib25lT2YiLCJvbmVPZlR5cGUiLCJzaGFwZSIsImNoZWNrUHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwiX193ZWJwYWNrX2V4cG9ydHNfXyIsIl9jbGFzc0NhbGxDaGVjayIsImluc3RhbmNlIiwiQ29uc3RydWN0b3IiLCJUeXBlRXJyb3IiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiIsInNlbGYiLCJSZWZlcmVuY2VFcnJvciIsIl9pbmhlcml0cyIsInN1YkNsYXNzIiwic3VwZXJDbGFzcyIsImNyZWF0ZSIsImNvbnN0cnVjdG9yIiwid3JpdGFibGUiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImdldE9wcG9zaXRlQ2FyZGluYWwiLCJkaXJlY3Rpb24iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcHJvcF90eXBlc19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3Byb3BfdHlwZXNfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX3JlYWN0X18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfcmVhY3RfZG9tX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfY2xhc3NuYW1lc19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2NsYXNzbmFtZXNfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X2JvdW5kbGVzc19kaWFsb2dfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfZGlhbG9nX19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9ib3VuZGxlc3NfcG9ydGFsX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfYm91bmRsZXNzX3BvcnRhbF9fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X2JvdW5kbGVzc191dGlsc190cmFuc2Zvcm1fcHJvcGVydHlfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19ib3VuZGxlc3NfdXRpbHNfdHJhbnNmb3JtX3Byb3BlcnR5X19fZGVmYXVsdCIsIl9leHRlbmRzIiwiYXNzaWduIiwidGFyZ2V0IiwiYXJndW1lbnRzIiwibGVuZ3RoIiwic291cmNlIiwia2V5IiwiX2NyZWF0ZUNsYXNzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlc2NyaXB0b3IiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJDTEFTU19SRU1PVkFMX1JFR0VYIiwiREVGQVVMVF9DQVJFVF9DT01QT05FTlQiLCJ2aWV3Qm94IiwieG1sbnMiLCJjbGFzc05hbWUiLCJmaWxsIiwicG9pbnRzIiwiY29tYmluYXRpb25zIiwiYXgiLCJheSIsImR4IiwiZHkiLCJQb3BvdmVyIiwiX1B1cmVDb21wb25lbnQiLCJfcmVmIiwiX3RlbXAiLCJfdGhpcyIsIl9yZXQiLCJfbGVuIiwiQXJyYXkiLCJfa2V5IiwiZ2V0UHJvdG90eXBlT2YiLCJhcHBseSIsImNvbmNhdCIsImFsaWduIiwiYW5jaG9yIiwiSFRNTEVsZW1lbnQiLCJjYXJldEFuY2hvciIsImNhY2hlVmlld3BvcnRDYXJ0b2dyYXBoeSIsInByZXNldCIsImdldFZhbGlkQWxpZ25tZW50UHJlc2V0IiwiZnJhZyIsImdldEFsaWdubWVudENsYXNzRnJhZ21lbnQiLCJkaWFsb2ciLCIkd3JhcHBlciIsIk1hdGgiLCJyb3VuZCIsImdldE5leHREaWFsb2dYUG9zaXRpb24iLCJnZXROZXh0RGlhbG9nWVBvc2l0aW9uIiwic3R5bGUiLCJjYXJkaW5hbCIsImxvbmdpdHVkaW5hbCIsIiRjYXJldCIsImdldE5leHRDYXJldFhQb3NpdGlvbiIsImJvZHlSZWN0IiwiZG9jdW1lbnQiLCJib2R5IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiYW5jaG9yUmVjdCIsImNhcmV0QW5jaG9yUmVjdCIsImJvZHlMZWZ0IiwibGVmdCIsImJvZHlUb3AiLCJ0b3AiLCJfcmVmMiIsImNhcmV0IiwibmV4dFgiLCJ3aWR0aCIsImNsaWVudFdpZHRoIiwiaGVpZ2h0IiwiY2xpZW50SGVpZ2h0IiwiX3JlZjMiLCJfcmVmNCIsIm5leHRZIiwiX3JlZjUiLCJwSGVpZ2h0IiwicFdpZHRoIiwiYm90dG9tIiwid2luZG93IiwiaW5uZXJIZWlnaHQiLCJpbm5lcldpZHRoIiwicmlnaHQiLCJfdGhpczIiLCJ2YWxpZENvbWJvcyIsImZpbHRlciIsImNvbmZpZyIsImlzUG9zaXRpb25WYWxpZCIsImluZGV4T2YiLCJhdXRvUmVwb3NpdGlvbiIsImJlc3RDb21ib3MiLCJfcmVmNiIsIm9wcG9zaXRlQ2FyZGluYWwiLCJva2F5Q29tYm9zIiwiX3JlZjciLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIl90aGlzMyIsInBvcnRhbFByb3BzIiwiaW50ZXJuYWxLZXlzIiwicmVmIiwiYmVmb3JlIiwiY2FyZXRDb21wb25lbnQiLCJjb25zdGFudCIsInJlZHVjZSIsIm1hcCIsImRlZiIsInByb3BUeXBlcyIsIk5OVyIsIk4iLCJOTkUiLCJFTkUiLCJFIiwiRVNFIiwiU1NFIiwiUyIsIlNTVyIsIldTVyIsIlciLCJXTlciLCJkZWZhdWx0UHJvcHMiLCJjYXB0dXJlRm9jdXMiLCJjbG9zZU9uRXNjS2V5IiwiY2xvc2VPbk91dHNpZGVDbGljayIsImNsb3NlT25PdXRzaWRlU2Nyb2xsIiwiYXJyMSIsImFycjIiLCJpdGVtIiwia2V5cyJdLCJtYXBwaW5ncyI6IkFBQUFBLE9BQU9DLFFBQ0UsU0FBVUMsR0NHbkIsUUFBQUMsR0FBQUMsR0FHQSxHQUFBQyxFQUFBRCxHQUNBLE1BQUFDLEdBQUFELEdBQUFILE9BR0EsSUFBQUQsR0FBQUssRUFBQUQsSUFDQUUsRUFBQUYsRUFDQUcsR0FBQSxFQUNBTixXQVVBLE9BTkFDLEdBQUFFLEdBQUFJLEtBQUFSLEVBQUFDLFFBQUFELElBQUFDLFFBQUFFLEdBR0FILEVBQUFPLEdBQUEsRUFHQVAsRUFBQUMsUUF2QkEsR0FBQUksS0ErREEsT0FuQ0FGLEdBQUFNLEVBQUFQLEVBR0FDLEVBQUFPLEVBQUFMLEVBR0FGLEVBQUFHLEVBQUEsU0FBQUssR0FBMkMsTUFBQUEsSUFHM0NSLEVBQUFTLEVBQUEs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LGFBMUlYLFNBQWlCMEIsRUFBTUMsR0FBUSxNQUFPRCxHQUFLeEMsT0FBTyxTQUFDMEMsR0FBRCxPQUFrQyxJQUF4QkQsRUFBS3RDLFFBQVF1QyxNQTBJdkNyTyxPQUFPc08sS0FBS3pHLEVBQVFpRyxjQUFlaEksRUFBQWpFLEVBQU80SyxjZE1reFhwSSxFQUE2QixRQUFJIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPVxuLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRpOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGw6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4vKioqKioqLyBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4vKioqKioqLyBcdFx0XHRcdGdldDogZ2V0dGVyXG4vKioqKioqLyBcdFx0XHR9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMTIpO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgX3R5cGVvZj10eXBlb2YgU3ltYm9sPT09XCJmdW5jdGlvblwiJiZ0eXBlb2YgU3ltYm9sLml0ZXJhdG9yPT09XCJzeW1ib2xcIj9mdW5jdGlvbihvYmope3JldHVybiB0eXBlb2Ygb2JqO306ZnVuY3Rpb24ob2JqKXtyZXR1cm4gb2JqJiZ0eXBlb2YgU3ltYm9sPT09XCJmdW5jdGlvblwiJiZvYmouY29uc3RydWN0b3I9PT1TeW1ib2wmJm9iaiE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2Ygb2JqO307aWYoZmFsc2Upe3ZhciBSRUFDVF9FTEVNRU5UX1RZUEU9dHlwZW9mIFN5bWJvbD09PSdmdW5jdGlvbicmJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKXx8MHhlYWM3O3ZhciBpc1ZhbGlkRWxlbWVudD1mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudChvYmplY3Qpe3JldHVybih0eXBlb2Ygb2JqZWN0PT09J3VuZGVmaW5lZCc/J3VuZGVmaW5lZCc6X3R5cGVvZihvYmplY3QpKT09PSdvYmplY3QnJiZvYmplY3QhPT1udWxsJiZvYmplY3QuJCR0eXBlb2Y9PT1SRUFDVF9FTEVNRU5UX1RZUEU7fTt2YXIgdGhyb3dPbkRpcmVjdEFjY2Vzcz10cnVlO21vZHVsZS5leHBvcnRzPXJlcXVpcmUoJy4vZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMnKShpc1ZhbGlkRWxlbWVudCx0aHJvd09uRGlyZWN0QWNjZXNzKTt9ZWxzZXttb2R1bGUuZXhwb3J0cz1fX3dlYnBhY2tfcmVxdWlyZV9fKDEwKSgpO31cblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy1kaWFsb2dcIik7XG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtcG9ydGFsXCIpO1xuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXV0aWxzLW9taXQta2V5c1wiKTtcblxuLyoqKi8gfSksXG4vKiA0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy11dGlscy10cmFuc2Zvcm0tcHJvcGVydHlcIik7XG5cbi8qKiovIH0pLFxuLyogNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpO1xuXG4vKioqLyB9KSxcbi8qIDYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cbi8qKiovIH0pLFxuLyogNyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdC1kb21cIik7XG5cbi8qKiovIH0pLFxuLyogOCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbmZ1bmN0aW9uIG1ha2VFbXB0eUZ1bmN0aW9uKGFyZyl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGFyZzt9O312YXIgZW1wdHlGdW5jdGlvbj1mdW5jdGlvbiBlbXB0eUZ1bmN0aW9uKCl7fTtlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zPW1ha2VFbXB0eUZ1bmN0aW9uO2VtcHR5RnVuY3Rpb24udGhhdFJldHVybnNGYWxzZT1tYWtlRW1wdHlGdW5jdGlvbihmYWxzZSk7ZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc1RydWU9bWFrZUVtcHR5RnVuY3Rpb24odHJ1ZSk7ZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc051bGw9bWFrZUVtcHR5RnVuY3Rpb24obnVsbCk7ZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc1RoaXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpczt9O2VtcHR5RnVuY3Rpb24udGhhdFJldHVybnNBcmd1bWVudD1mdW5jdGlvbihhcmcpe3JldHVybiBhcmc7fTttb2R1bGUuZXhwb3J0cz1lbXB0eUZ1bmN0aW9uO1xuXG4vKioqLyB9KSxcbi8qIDkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG52YXIgdmFsaWRhdGVGb3JtYXQ9ZnVuY3Rpb24gdmFsaWRhdGVGb3JtYXQoZm9ybWF0KXt9O2lmKGZhbHNlKXt2YWxpZGF0ZUZvcm1hdD1mdW5jdGlvbiB2YWxpZGF0ZUZvcm1hdChmb3JtYXQpe2lmKGZvcm1hdD09PXVuZGVmaW5lZCl7dGhyb3cgbmV3IEVycm9yKCdpbnZhcmlhbnQgcmVxdWlyZXMgYW4gZXJyb3IgbWVzc2FnZSBhcmd1bWVudCcpO319O31mdW5jdGlvbiBpbnZhcmlhbnQoY29uZGl0aW9uLGZvcm1hdCxhLGIsYyxkLGUsZil7dmFsaWRhdGVGb3JtYXQoZm9ybWF0KTtpZighY29uZGl0aW9uKXt2YXIgZXJyb3I7aWYoZm9ybWF0PT09dW5kZWZpbmVkKXtlcnJvcj1uZXcgRXJyb3IoJ01pbmlmaWVkIGV4Y2VwdGlvbiBvY2N1cnJlZDsgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50ICcrJ2ZvciB0aGUgZnVsbCBlcnJvciBtZXNzYWdlIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuJyk7fWVsc2V7dmFyIGFyZ3M9W2EsYixjLGQsZSxmXTt2YXIgYXJnSW5kZXg9MDtlcnJvcj1uZXcgRXJyb3IoZm9ybWF0LnJlcGxhY2UoLyVzL2csZnVuY3Rpb24oKXtyZXR1cm4gYXJnc1thcmdJbmRleCsrXTt9KSk7ZXJyb3IubmFtZT0nSW52YXJpYW50IFZpb2xhdGlvbic7fWVycm9yLmZyYW1lc1RvUG9wPTE7dGhyb3cgZXJyb3I7fX1tb2R1bGUuZXhwb3J0cz1pbnZhcmlhbnQ7XG5cbi8qKiovIH0pLFxuLyogMTAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG52YXIgZW1wdHlGdW5jdGlvbj1fX3dlYnBhY2tfcmVxdWlyZV9fKDgpO3ZhciBpbnZhcmlhbnQ9X193ZWJwYWNrX3JlcXVpcmVfXyg5KTt2YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQ9X193ZWJwYWNrX3JlcXVpcmVfXygxMSk7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBzaGltKHByb3BzLHByb3BOYW1lLGNvbXBvbmVudE5hbWUsbG9jYXRpb24scHJvcEZ1bGxOYW1lLHNlY3JldCl7aWYoc2VjcmV0PT09UmVhY3RQcm9wVHlwZXNTZWNyZXQpe3JldHVybjt9aW52YXJpYW50KGZhbHNlLCdDYWxsaW5nIFByb3BUeXBlcyB2YWxpZGF0b3JzIGRpcmVjdGx5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiAnKydVc2UgUHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzKCkgdG8gY2FsbCB0aGVtLiAnKydSZWFkIG1vcmUgYXQgaHR0cDovL2ZiLm1lL3VzZS1jaGVjay1wcm9wLXR5cGVzJyk7fTtzaGltLmlzUmVxdWlyZWQ9c2hpbTtmdW5jdGlvbiBnZXRTaGltKCl7cmV0dXJuIHNoaW07fTt2YXIgUmVhY3RQcm9wVHlwZXM9e2FycmF5OnNoaW0sYm9vbDpzaGltLGZ1bmM6c2hpbSxudW1iZXI6c2hpbSxvYmplY3Q6c2hpbSxzdHJpbmc6c2hpbSxzeW1ib2w6c2hpbSxhbnk6c2hpbSxhcnJheU9mOmdldFNoaW0sZWxlbWVudDpzaGltLGluc3RhbmNlT2Y6Z2V0U2hpbSxub2RlOnNoaW0sb2JqZWN0T2Y6Z2V0U2hpbSxvbmVPZjpnZXRTaGltLG9uZU9mVHlwZTpnZXRTaGltLHNoYXBlOmdldFNoaW19O1JlYWN0UHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzPWVtcHR5RnVuY3Rpb247UmVhY3RQcm9wVHlwZXMuUHJvcFR5cGVzPVJlYWN0UHJvcFR5cGVzO3JldHVybiBSZWFjdFByb3BUeXBlczt9O1xuXG4vKioqLyB9KSxcbi8qIDExICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0PSdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCc7bW9kdWxlLmV4cG9ydHM9UmVhY3RQcm9wVHlwZXNTZWNyZXQ7XG5cbi8qKiovIH0pLFxuLyogMTIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3Byb3BfdHlwZXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3Byb3BfdHlwZXNfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9wcm9wX3R5cGVzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfcmVhY3RfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfcmVhY3RfZG9tX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9yZWFjdF9kb21fX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9yZWFjdF9kb21fXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2NsYXNzbmFtZXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2NsYXNzbmFtZXNfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19jbGFzc25hbWVzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfZGlhbG9nX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfZGlhbG9nX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfYm91bmRsZXNzX2RpYWxvZ19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfYm91bmRsZXNzX3BvcnRhbF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfYm91bmRsZXNzX3BvcnRhbF9fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X2JvdW5kbGVzc19wb3J0YWxfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19ib3VuZGxlc3NfdXRpbHNfdHJhbnNmb3JtX3Byb3BlcnR5X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19ib3VuZGxlc3NfdXRpbHNfdHJhbnNmb3JtX3Byb3BlcnR5X19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzdfYm91bmRsZXNzX3V0aWxzX3RyYW5zZm9ybV9wcm9wZXJ0eV9fKTtcbnZhciBfZXh0ZW5kcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0YXJnZXQpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9YXJndW1lbnRzW2ldO2Zvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSxrZXkpKXt0YXJnZXRba2V5XT1zb3VyY2Vba2V5XTt9fX1yZXR1cm4gdGFyZ2V0O307dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoXCJ2YWx1ZVwiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKTt9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcjt9O30oKTtmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7fX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLGNhbGwpe2lmKCFzZWxmKXt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7fXJldHVybiBjYWxsJiYodHlwZW9mIGNhbGw9PT1cIm9iamVjdFwifHx0eXBlb2YgY2FsbD09PVwiZnVuY3Rpb25cIik/Y2FsbDpzZWxmO31mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT1cImZ1bmN0aW9uXCImJnN1cGVyQ2xhc3MhPT1udWxsKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2Ygc3VwZXJDbGFzcyk7fXN1YkNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MmJnN1cGVyQ2xhc3MucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6c3ViQ2xhc3MsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfX0pO2lmKHN1cGVyQ2xhc3MpT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcyxzdXBlckNsYXNzKTpzdWJDbGFzcy5fX3Byb3RvX189c3VwZXJDbGFzczt9ZnVuY3Rpb24gZ2V0T3Bwb3NpdGVDYXJkaW5hbChkaXJlY3Rpb24pe3N3aXRjaChkaXJlY3Rpb25bMF0pe2Nhc2UnTic6cmV0dXJuJ1MnO2Nhc2UnUyc6cmV0dXJuJ04nO2Nhc2UnRSc6cmV0dXJuJ1cnO31yZXR1cm4nRSc7fWZ1bmN0aW9uIHdpdGhvdXQoYXJyMSxhcnIyKXtyZXR1cm4gYXJyMS5maWx0ZXIoZnVuY3Rpb24oaXRlbSl7cmV0dXJuIGFycjIuaW5kZXhPZihpdGVtKT09PS0xO30pO312YXIgQ0xBU1NfUkVNT1ZBTF9SRUdFWD0vXFxzP2ItcG9wb3Zlci0oYW5jaG9yfHNlbGYpLShzdGFydHxtaWRkbGV8ZW5kKS9nO3ZhciBERUZBVUxUX0NBUkVUX0NPTVBPTkVOVD1fX3dlYnBhY2tfcmVxdWlyZV9fLmkoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX3JlYWN0X19bXCJjcmVhdGVFbGVtZW50XCJdKSgnc3ZnJyx7dmlld0JveDonMCAwIDE0IDkuNScseG1sbnM6J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJ30sX193ZWJwYWNrX3JlcXVpcmVfXy5pKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9fW1wiY3JlYXRlRWxlbWVudFwiXSkoJ2cnLG51bGwsX193ZWJwYWNrX3JlcXVpcmVfXy5pKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9fW1wiY3JlYXRlRWxlbWVudFwiXSkoJ3BvbHlnb24nLHtjbGFzc05hbWU6J2ItcG9wb3Zlci1jYXJldC1ib3JkZXInLGZpbGw6JyMwMDAnLHBvaW50czonNyAwIDE0IDEwIDAgMTAnfSksX193ZWJwYWNrX3JlcXVpcmVfXy5pKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9fW1wiY3JlYXRlRWxlbWVudFwiXSkoJ3BvbHlnb24nLHtjbGFzc05hbWU6J2ItcG9wb3Zlci1jYXJldC1maWxsJyxmaWxsOicjRkZGJyxwb2ludHM6JzYuOTgyMzA0NDQgMS43NSAxMi43NSAxMCAxLjI1IDEwJ30pKSk7dmFyIFNUQVJUPTA7dmFyIE1JRERMRT0xO3ZhciBFTkQ9Mjt2YXIgY29tYmluYXRpb25zPVt7bmFtZTonTk5XJyxheDpTVEFSVCxheTpTVEFSVCxkeDpTVEFSVCxkeTpFTkR9LHtuYW1lOidOJyxheDpNSURETEUsYXk6U1RBUlQsZHg6TUlERExFLGR5OkVORH0se25hbWU6J05ORScsYXg6RU5ELGF5OlNUQVJULGR4OkVORCxkeTpFTkR9LHtuYW1lOidFTkUnLGF4OkVORCxheTpTVEFSVCxkeDpTVEFSVCxkeTpTVEFSVH0se25hbWU6J0UnLGF4OkVORCxheTpNSURETEUsZHg6U1RBUlQsZHk6TUlERExFfSx7bmFtZTonRVNFJyxheDpFTkQsYXk6RU5ELGR4OlNUQVJULGR5OkVORH0se25hbWU6J1NTRScsYXg6RU5ELGF5OkVORCxkeDpFTkQsZHk6U1RBUlR9LHtuYW1lOidTJyxheDpNSURETEUsYXk6RU5ELGR4Ok1JRERMRSxkeTpTVEFSVH0se25hbWU6J1NTVycsYXg6U1RBUlQsYXk6RU5ELGR4OlNUQVJULGR5OlNUQVJUfSx7bmFtZTonV1NXJyxheDpTVEFSVCxheTpFTkQsZHg6RU5ELGR5OkVORH0se25hbWU6J1cnLGF4OlNUQVJULGF5Ok1JRERMRSxkeDpFTkQsZHk6TUlERExFfSx7bmFtZTonV05XJyxheDpTVEFSVCxheTpTVEFSVCxkeDpFTkQsZHk6U1RBUlR9XTt2YXIgUG9wb3Zlcj1mdW5jdGlvbihfUHVyZUNvbXBvbmVudCl7X2luaGVyaXRzKFBvcG92ZXIsX1B1cmVDb21wb25lbnQpO2Z1bmN0aW9uIFBvcG92ZXIoKXt2YXIgX3JlZjt2YXIgX3RlbXAsX3RoaXMsX3JldDtfY2xhc3NDYWxsQ2hlY2sodGhpcyxQb3BvdmVyKTtmb3IodmFyIF9sZW49YXJndW1lbnRzLmxlbmd0aCxhcmdzPUFycmF5KF9sZW4pLF9rZXk9MDtfa2V5PF9sZW47X2tleSsrKXthcmdzW19rZXldPWFyZ3VtZW50c1tfa2V5XTt9cmV0dXJuIF9yZXQ9KF90ZW1wPShfdGhpcz1fcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLChfcmVmPVBvcG92ZXIuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoUG9wb3ZlcikpLmNhbGwuYXBwbHkoX3JlZixbdGhpc10uY29uY2F0KGFyZ3MpKSksX3RoaXMpLF90aGlzLmFsaWduPWZ1bmN0aW9uKCl7dmFyIGFuY2hvcj1fdGhpcy5wcm9wcy5hbmNob3IgaW5zdGFuY2VvZiBIVE1MRWxlbWVudD9fdGhpcy5wcm9wcy5hbmNob3I6X193ZWJwYWNrX3JlcXVpcmVfXy5pKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9yZWFjdF9kb21fX1tcImZpbmRET01Ob2RlXCJdKShfdGhpcy5wcm9wcy5hbmNob3IpO3ZhciBjYXJldEFuY2hvcj1fdGhpcy5wcm9wcy5jYXJldEFuY2hvcj9fdGhpcy5wcm9wcy5jYXJldEFuY2hvciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50P190aGlzLnByb3BzLmNhcmV0QW5jaG9yOl9fd2VicGFja19yZXF1aXJlX18uaShfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfcmVhY3RfZG9tX19bXCJmaW5kRE9NTm9kZVwiXSkoX3RoaXMucHJvcHMuY2FyZXRBbmNob3IpOmFuY2hvcjtfdGhpcy5jYWNoZVZpZXdwb3J0Q2FydG9ncmFwaHkoYW5jaG9yLGNhcmV0QW5jaG9yKTt2YXIgcHJlc2V0PV90aGlzLmdldFZhbGlkQWxpZ25tZW50UHJlc2V0KCk7dmFyIGZyYWc9UG9wb3Zlci5nZXRBbGlnbm1lbnRDbGFzc0ZyYWdtZW50O190aGlzLmRpYWxvZy4kd3JhcHBlci5jbGFzc05hbWU9X3RoaXMuZGlhbG9nLiR3cmFwcGVyLmNsYXNzTmFtZS5yZXBsYWNlKENMQVNTX1JFTU9WQUxfUkVHRVgsJycpKygnIGItcG9wb3Zlci1hbmNob3IteC0nK2ZyYWcocHJlc2V0LmF4KSkrKCcgYi1wb3BvdmVyLWFuY2hvci15LScrZnJhZyhwcmVzZXQuYXkpKSsoJyBiLXBvcG92ZXItc2VsZi14LScrZnJhZyhwcmVzZXQuZHgpKSsoJyBiLXBvcG92ZXItc2VsZi15LScrZnJhZyhwcmVzZXQuZHkpKTt2YXIgZHg9TWF0aC5yb3VuZChfdGhpcy5nZXROZXh0RGlhbG9nWFBvc2l0aW9uKHByZXNldCkpO3ZhciBkeT1NYXRoLnJvdW5kKF90aGlzLmdldE5leHREaWFsb2dZUG9zaXRpb24ocHJlc2V0KSk7X3RoaXMuZGlhbG9nLiR3cmFwcGVyLnN0eWxlW19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19ib3VuZGxlc3NfdXRpbHNfdHJhbnNmb3JtX3Byb3BlcnR5X19fZGVmYXVsdC5hXT0ndHJhbnNsYXRlKCcrZHgrJ3B4LCAnK2R5KydweCknO3ZhciBjYXJkaW5hbD1wcmVzZXQubmFtZVswXTt2YXIgbG9uZ2l0dWRpbmFsPWNhcmRpbmFsPT09J04nfHxjYXJkaW5hbD09PSdTJztfdGhpcy4kY2FyZXQuc3R5bGVbbG9uZ2l0dWRpbmFsPydsZWZ0JzondG9wJ109TWF0aC5yb3VuZChfdGhpcy5nZXROZXh0Q2FyZXRYUG9zaXRpb24ocHJlc2V0KSkrJ3B4JztfdGhpcy4kY2FyZXQuc3R5bGVbbG9uZ2l0dWRpbmFsPyd0b3AnOidsZWZ0J109JzBweCc7fSxfdGVtcCksX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsX3JldCk7fV9jcmVhdGVDbGFzcyhQb3BvdmVyLFt7a2V5OidjYWNoZVZpZXdwb3J0Q2FydG9ncmFwaHknLHZhbHVlOmZ1bmN0aW9uIGNhY2hlVmlld3BvcnRDYXJ0b2dyYXBoeShhbmNob3IsY2FyZXRBbmNob3Ipe3ZhciBib2R5UmVjdD1kb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3RoaXMuYW5jaG9yUmVjdD1hbmNob3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dGhpcy5jYXJldEFuY2hvclJlY3Q9Y2FyZXRBbmNob3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dGhpcy5ib2R5TGVmdD1ib2R5UmVjdC5sZWZ0Ki0xO3RoaXMuYm9keVRvcD1ib2R5UmVjdC50b3AqLTE7fX0se2tleTonZ2V0TmV4dENhcmV0WFBvc2l0aW9uJyx2YWx1ZTpmdW5jdGlvbiBnZXROZXh0Q2FyZXRYUG9zaXRpb24oX3JlZjIpe3ZhciBuYW1lPV9yZWYyLm5hbWUsYXg9X3JlZjIuYXgsZHg9X3JlZjIuZHgsYXk9X3JlZjIuYXksZHk9X3JlZjIuZHk7dmFyIGNhcmV0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dW5kZWZpbmVkP2FyZ3VtZW50c1sxXTp0aGlzLiRjYXJldDt2YXIgbmV4dFg9MDtpZihuYW1lWzBdPT09J04nfHxuYW1lWzBdPT09J1MnKXtuZXh0WD10aGlzLmNhcmV0QW5jaG9yUmVjdC5sZWZ0LXRoaXMuYW5jaG9yUmVjdC5sZWZ0K3RoaXMuY2FyZXRBbmNob3JSZWN0LndpZHRoLzI7aWYoZHg9PT1NSURET