Files
goTorrent/goTorrentWebUI/node_modules/react-dropzone/dist/index.js

2 lines
118 KiB
JavaScript

!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("react"),require("prop-types")):"function"==typeof define&&define.amd?define(["react","prop-types"],t):"object"==typeof exports?exports.Dropzone=t(require("react"),require("prop-types")):e.Dropzone=t(e.React,e.PropTypes)}(this,function(e,t){return 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.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=0)}([function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function i(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(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 c(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)}Object.defineProperty(t,"__esModule",{value:!0});var s=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},u=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}}(),p=n(1),f=r(p),d=n(2),h=r(d),v=n(3),g=n(5),m=r(g),y=function(e){function t(e,n){a(this,t);var r=l(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n));return r.renderChildren=function(e,t,n,o){return"function"==typeof e?e(s({},r.state,{isDragActive:t,isDragAccept:n,isDragReject:o})):e},r.composeHandlers=r.composeHandlers.bind(r),r.onClick=r.onClick.bind(r),r.onDocumentDrop=r.onDocumentDrop.bind(r),r.onDragEnter=r.onDragEnter.bind(r),r.onDragLeave=r.onDragLeave.bind(r),r.onDragOver=r.onDragOver.bind(r),r.onDragStart=r.onDragStart.bind(r),r.onDrop=r.onDrop.bind(r),r.onFileDialogCancel=r.onFileDialogCancel.bind(r),r.onInputElementClick=r.onInputElementClick.bind(r),r.setRef=r.setRef.bind(r),r.setRefs=r.setRefs.bind(r),r.isFileDialogActive=!1,r.state={draggedFiles:[],acceptedFiles:[],rejectedFiles:[]},r}return c(t,e),u(t,[{key:"componentDidMount",value:function(){var e=this.props.preventDropOnDocument;this.dragTargets=[],e&&(document.addEventListener("dragover",v.onDocumentDragOver,!1),document.addEventListener("drop",this.onDocumentDrop,!1)),this.fileInputEl.addEventListener("click",this.onInputElementClick,!1),document.body.onfocus=this.onFileDialogCancel}},{key:"componentWillUnmount",value:function(){this.props.preventDropOnDocument&&(document.removeEventListener("dragover",v.onDocumentDragOver),document.removeEventListener("drop",this.onDocumentDrop)),null!=this.fileInputEl&&this.fileInputEl.removeEventListener("click",this.onInputElementClick,!1),null!=document&&(document.body.onfocus=null)}},{key:"composeHandlers",value:function(e){return this.props.disabled?null:e}},{key:"onDocumentDrop",value:function(e){this.node&&this.node.contains(e.target)||(e.preventDefault(),this.dragTargets=[])}},{key:"onDragStart",value:function(e){this.props.onDragStart&&this.props.onDragStart.call(this,e)}},{key:"onDragEnter",value:function(e){e.preventDefault(),-1===this.dragTargets.indexOf(e.target)&&this.dragTargets.push(e.target),this.setState({isDragActive:!0,draggedFiles:(0,v.getDataTransferItems)(e)}),this.props.onDragEnter&&this.props.onDragEnter.call(this,e)}},{key:"onDragOver",value:function(e){e.preventDefault(),e.stopPropagation();try{e.dataTransfer.dropEffect=this.isFileDialogActive?"none":"copy"}catch(e){}return this.props.onDragOver&&this.props.onDragOver.call(this,e),!1}},{key:"onDragLeave",value:function(e){var t=this;e.preventDefault(),this.dragTargets=this.dragTargets.filter(function(n){return n!==e.target&&t.node.contains(n)}),this.dragTargets.length>0||(this.setState({isDragActive:!1,draggedFiles:[]}),this.props.onDragLeave&&this.props.onDragLeave.call(this,e))}},{key:"onDrop",value:function(e){var t=this,n=this.props,r=n.onDrop,o=n.onDropAccepted,a=n.onDropRejected,l=n.multiple,c=n.disablePreview,s=n.accept,u=(0,v.getDataTransferItems)(e),p=[],f=[];e.preventDefault(),this.dragTargets=[],this.isFileDialogActive=!1,u.forEach(function(e){if(!c)try{e.preview=window.URL.createObjectURL(e)}catch(e){}(0,v.fileAccepted)(e,s)&&(0,v.fileMatchSize)(e,t.props.maxSize,t.props.minSize)?p.push(e):f.push(e)}),l||f.push.apply(f,i(p.splice(1))),r&&r.call(this,p,f,e),f.length>0&&a&&a.call(this,f,e),p.length>0&&o&&o.call(this,p,e),this.draggedFiles=null,this.setState({isDragActive:!1,draggedFiles:[],acceptedFiles:p,rejectedFiles:f})}},{key:"onClick",value:function(e){var t=this.props,n=t.onClick;t.disableClick||(e.stopPropagation(),n&&n.call(this,e),setTimeout(this.open.bind(this),0))}},{key:"onInputElementClick",value:function(e){e.stopPropagation(),this.props.inputProps&&this.props.inputProps.onClick&&this.props.inputProps.onClick()}},{key:"onFileDialogCancel",value:function(){var e=this,t=this.props.onFileDialogCancel;this.isFileDialogActive&&setTimeout(function(){if(null!=e.fileInputEl){e.fileInputEl.files.length||(e.isFileDialogActive=!1)}"function"==typeof t&&t()},300)}},{key:"setRef",value:function(e){this.node=e}},{key:"setRefs",value:function(e){this.fileInputEl=e}},{key:"open",value:function(){this.isFileDialogActive=!0,this.fileInputEl.value=null,this.fileInputEl.click()}},{key:"render",value:function(){var e=this.props,t=e.accept,n=e.acceptClassName,r=e.activeClassName,i=e.children,a=e.disabled,l=e.disabledClassName,c=e.inputProps,u=e.multiple,p=e.name,d=e.rejectClassName,h=o(e,["accept","acceptClassName","activeClassName","children","disabled","disabledClassName","inputProps","multiple","name","rejectClassName"]),g=h.acceptStyle,y=h.activeStyle,D=h.className,b=void 0===D?"":D,x=h.disabledStyle,S=h.rejectStyle,C=h.style,O=o(h,["acceptStyle","activeStyle","className","disabledStyle","rejectStyle","style"]),j=this.state,k=j.isDragActive,E=j.draggedFiles,P=E.length,w=u||P<=1,F=P>0&&(0,v.allFilesAccepted)(E,this.props.accept),_=P>0&&(!F||!w),A=!(b||C||y||g||S||x);k&&r&&(b+=" "+r),F&&n&&(b+=" "+n),_&&d&&(b+=" "+d),a&&l&&(b+=" "+l),A&&(C=m.default.default,y=m.default.active,g=C.active,S=m.default.rejected,x=m.default.disabled);var T=s({},C);y&&k&&(T=s({},C,y)),g&&F&&(T=s({},T,g)),S&&_&&(T=s({},T,S)),x&&a&&(T=s({},C,x));var M={accept:t,disabled:a,type:"file",style:{display:"none"},multiple:v.supportMultiple&&u,ref:this.setRefs,onChange:this.onDrop,autoComplete:"off"};p&&p.length&&(M.name=p);var N=(O.acceptedFiles,O.preventDropOnDocument,O.disablePreview,O.disableClick,O.onDropAccepted,O.onDropRejected,O.onFileDialogCancel,O.maxSize,O.minSize,o(O,["acceptedFiles","preventDropOnDocument","disablePreview","disableClick","onDropAccepted","onDropRejected","onFileDialogCancel","maxSize","minSize"]));return f.default.createElement("div",s({className:b,style:T},N,{onClick:this.composeHandlers(this.onClick),onDragStart:this.composeHandlers(this.onDragStart),onDragEnter:this.composeHandlers(this.onDragEnter),onDragOver:this.composeHandlers(this.onDragOver),onDragLeave:this.composeHandlers(this.onDragLeave),onDrop:this.composeHandlers(this.onDrop),ref:this.setRef,"aria-disabled":a}),this.renderChildren(i,k,F,_),f.default.createElement("input",s({},c,M)))}}]),t}(f.default.Component);t.default=y,y.propTypes={accept:h.default.string,children:h.default.oneOfType([h.default.node,h.default.func]),disableClick:h.default.bool,disabled:h.default.bool,disablePreview:h.default.bool,preventDropOnDocument:h.default.bool,inputProps:h.default.object,multiple:h.default.bool,name:h.default.string,maxSize:h.default.number,minSize:h.default.number,className:h.default.string,activeClassName:h.default.string,acceptClassName:h.default.string,rejectClassName:h.default.string,disabledClassName:h.default.string,style:h.default.object,activeStyle:h.default.object,acceptStyle:h.default.object,rejectStyle:h.default.object,disabledStyle:h.default.object,onClick:h.default.func,onDrop:h.default.func,onDropAccepted:h.default.func,onDropRejected:h.default.func,onDragStart:h.default.func,onDragEnter:h.default.func,onDragOver:h.default.func,onDragLeave:h.default.func,onFileDialogCancel:h.default.func},y.defaultProps={preventDropOnDocument:!0,disabled:!1,disablePreview:!1,disableClick:!1,multiple:!0,maxSize:1/0,minSize:0},e.exports=t.default},function(t,n){t.exports=e},function(e,n){e.exports=t},function(e,t,n){"use strict";function r(e){var t=[];if(e.dataTransfer){var n=e.dataTransfer;n.files&&n.files.length?t=n.files:n.items&&n.items.length&&(t=n.items)}else e.target&&e.target.files&&(t=e.target.files);return Array.prototype.slice.call(t)}function o(e,t){return"application/x-moz-file"===e.type||(0,s.default)(e,t)}function i(e,t,n){return e.size<=t&&e.size>=n}function a(e,t){return e.every(function(e){return o(e,t)})}function l(e){e.preventDefault()}Object.defineProperty(t,"__esModule",{value:!0}),t.supportMultiple=void 0,t.getDataTransferItems=r,t.fileAccepted=o,t.fileMatchSize=i,t.allFilesAccepted=a,t.onDocumentDragOver=l;var c=n(4),s=function(e){return e&&e.__esModule?e:{default:e}}(c);t.supportMultiple="undefined"==typeof document||!document||!document.createElement||"multiple"in document.createElement("input")},function(e,t){e.exports=function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return e[r].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){"use strict";t.__esModule=!0,n(8),n(9),t.default=function(e,t){if(e&&t){var n=function(){var n=Array.isArray(t)?t:t.split(","),r=e.name||"",o=e.type||"",i=o.replace(/\/.*$/,"");return{v:n.some(function(e){var t=e.trim();return"."===t.charAt(0)?r.toLowerCase().endsWith(t.toLowerCase()):/\/\*$/.test(t)?i===t.replace(/\/.*$/,""):o===t})}}();if("object"==typeof n)return n.v}return!0},e.exports=t.default},function(e,t){var n=e.exports={version:"1.2.2"};"number"==typeof __e&&(__e=n)},function(e,t){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(e,t,n){var r=n(2),o=n(1),i=n(4),a=n(19),l="prototype",c=function(e,t){return function(){return e.apply(t,arguments)}},s=function(e,t,n){var u,p,f,d,h=e&s.G,v=e&s.P,g=h?r:e&s.S?r[t]||(r[t]={}):(r[t]||{})[l],m=h?o:o[t]||(o[t]={});h&&(n=t);for(u in n)p=!(e&s.F)&&g&&u in g,f=(p?g:n)[u],d=e&s.B&&p?c(f,r):v&&"function"==typeof f?c(Function.call,f):f,g&&!p&&a(g,u,f),m[u]!=f&&i(m,u,d),v&&((m[l]||(m[l]={}))[u]=f)};r.core=o,s.F=1,s.G=2,s.S=4,s.P=8,s.B=16,s.W=32,e.exports=s},function(e,t,n){var r=n(5),o=n(18);e.exports=n(22)?function(e,t,n){return r.setDesc(e,t,o(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t){var n=Object;e.exports={create:n.create,getProto:n.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:n.getOwnPropertyDescriptor,setDesc:n.defineProperty,setDescs:n.defineProperties,getKeys:n.keys,getNames:n.getOwnPropertyNames,getSymbols:n.getOwnPropertySymbols,each:[].forEach}},function(e,t){var n=0,r=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++n+r).toString(36))}},function(e,t,n){var r=n(20)("wks"),o=n(2).Symbol;e.exports=function(e){return r[e]||(r[e]=o&&o[e]||(o||n(6))("Symbol."+e))}},function(e,t,n){n(26),e.exports=n(1).Array.some},function(e,t,n){n(25),e.exports=n(1).String.endsWith},function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t,n){var r=n(10);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,o){return e.call(t,n,r,o)}}return function(){return e.apply(t,arguments)}}},function(e,t){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,n){e.exports=function(e){var t=/./;try{"/./"[e](t)}catch(r){try{return t[n(7)("match")]=!1,!"/./"[e](t)}catch(e){}}return!0}},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,t,n){var r=n(16),o=n(11),i=n(7)("match");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[i])?!!t:"RegExp"==o(e))}},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){var r=n(2),o=n(4),i=n(6)("src"),a="toString",l=Function[a],c=(""+l).split(a);n(1).inspectSource=function(e){return l.call(e)},(e.exports=function(e,t,n,a){"function"==typeof n&&(o(n,i,e[t]?""+e[t]:c.join(String(t))),"name"in n||(n.name=t)),e===r?e[t]=n:(a||delete e[t],o(e,t,n))})(Function.prototype,a,function(){return"function"==typeof this&&this[i]||l.call(this)})},function(e,t,n){var r=n(2),o="__core-js_shared__",i=r[o]||(r[o]={});e.exports=function(e){return i[e]||(i[e]={})}},function(e,t,n){var r=n(17),o=n(13);e.exports=function(e,t,n){if(r(t))throw TypeError("String#"+n+" doesn't accept regex!");return String(o(e))}},function(e,t,n){e.exports=!n(15)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t){var n=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:n)(e)}},function(e,t,n){var r=n(23),o=Math.min;e.exports=function(e){return e>0?o(r(e),9007199254740991):0}},function(e,t,n){"use strict";var r=n(3),o=n(24),i=n(21),a="endsWith",l=""[a];r(r.P+r.F*n(14)(a),"String",{endsWith:function(e){var t=i(this,e,a),n=arguments,r=n.length>1?n[1]:void 0,c=o(t.length),s=void 0===r?c:Math.min(o(r),c),u=String(e);return l?l.call(t,u,s):t.slice(s-u.length,s)===u}})},function(e,t,n){var r=n(5),o=n(3),i=n(1).Array||Array,a={},l=function(e,t){r.each.call(e.split(","),function(e){void 0==t&&e in i?a[e]=i[e]:e in[]&&(a[e]=n(12)(Function.call,[][e],t))})};l("pop,reverse,shift,keys,values,entries",1),l("indexOf,every,some,forEach,map,filter,find,findIndex,includes",3),l("join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill"),o(o.S,"Array",a)}])},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={rejected:{borderStyle:"solid",borderColor:"#c66",backgroundColor:"#eee"},disabled:{opacity:.5},active:{borderStyle:"solid",borderColor:"#6c6",backgroundColor:"#eee"},default:{width:200,height:200,borderWidth:2,borderColor:"#666",borderStyle:"dashed",borderRadius:5}},e.exports=t.default}])});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgNjA0YjdkZTAyYWFjNDI4OWFjNzciLCJ3ZWJwYWNrOi8vLy4vc3JjL2luZGV4LmpzIiwid2VicGFjazovLy9leHRlcm5hbCB7XCJyb290XCI6XCJSZWFjdFwiLFwiY29tbW9uanMyXCI6XCJyZWFjdFwiLFwiY29tbW9uanNcIjpcInJlYWN0XCIsXCJhbWRcIjpcInJlYWN0XCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJyb290XCI6XCJQcm9wVHlwZXNcIixcImNvbW1vbmpzMlwiOlwicHJvcC10eXBlc1wiLFwiY29tbW9uanNcIjpcInByb3AtdHlwZXNcIixcImFtZFwiOlwicHJvcC10eXBlc1wifSIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F0dHItYWNjZXB0L2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL3N0eWxlcy5qcyJdLCJuYW1lcyI6WyJyb290IiwiZmFjdG9yeSIsImV4cG9ydHMiLCJtb2R1bGUiLCJyZXF1aXJlIiwiZGVmaW5lIiwiYW1kIiwidGhpcyIsIl9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfMV9fIiwiX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8yX18iLCJtb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiaW5zdGFsbGVkTW9kdWxlcyIsImkiLCJsIiwiY2FsbCIsIm0iLCJjIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwiZ2V0IiwibiIsIl9fZXNNb2R1bGUiLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0Iiwib2JqIiwiZGVmYXVsdCIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllcyIsImtleXMiLCJ0YXJnZXQiLCJpbmRleE9mIiwiX3RvQ29uc3VtYWJsZUFycmF5IiwiYXJyIiwiQXJyYXkiLCJpc0FycmF5IiwiYXJyMiIsImxlbmd0aCIsImZyb20iLCJfY2xhc3NDYWxsQ2hlY2siLCJpbnN0YW5jZSIsIkNvbnN0cnVjdG9yIiwiVHlwZUVycm9yIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJzZWxmIiwiUmVmZXJlbmNlRXJyb3IiLCJfaW5oZXJpdHMiLCJzdWJDbGFzcyIsInN1cGVyQ2xhc3MiLCJjcmVhdGUiLCJjb25zdHJ1Y3RvciIsInZhbHVlIiwid3JpdGFibGUiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsIl9leHRlbmRzIiwiYXNzaWduIiwiYXJndW1lbnRzIiwic291cmNlIiwia2V5IiwiX2NyZWF0ZUNsYXNzIiwiZGVmaW5lUHJvcGVydGllcyIsInByb3BzIiwiZGVzY3JpcHRvciIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsIl9yZWFjdCIsIl9yZWFjdDIiLCJfcHJvcFR5cGVzIiwiX3Byb3BUeXBlczIiLCJfdXRpbHMiLCJfc3R5bGVzIiwiX3N0eWxlczIiLCJEcm9wem9uZSIsIl9SZWFjdCRDb21wb25lbnQiLCJjb250ZXh0IiwiX3RoaXMiLCJnZXRQcm90b3R5cGVPZiIsInJlbmRlckNoaWxkcmVuIiwiY2hpbGRyZW4iLCJpc0RyYWdBY3RpdmUiLCJpc0RyYWdBY2NlcHQiLCJpc0RyYWdSZWplY3QiLCJzdGF0ZSIsImNvbXBvc2VIYW5kbGVycyIsImJpbmQiLCJvbkNsaWNrIiwib25Eb2N1bWVudERyb3AiLCJvbkRyYWdFbnRlciIsIm9uRHJhZ0xlYXZlIiwib25EcmFnT3ZlciIsIm9uRHJhZ1N0YXJ0Iiwib25Ecm9wIiwib25GaWxlRGlhbG9nQ2FuY2VsIiwib25JbnB1dEVsZW1lbnRDbGljayIsInNldFJlZiIsInNldFJlZnMiLCJpc0ZpbGVEaWFsb2dBY3RpdmUiLCJkcmFnZ2VkRmlsZXMiLCJhY2NlcHRlZEZpbGVzIiwicmVqZWN0ZWRGaWxlcyIsInByZXZlbnREcm9wT25Eb2N1bWVudCIsImRyYWdUYXJnZXRzIiwiZG9jdW1lbnQiLCJhZGRFdmVudExpc3RlbmVyIiwib25Eb2N1bWVudERyYWdPdmVyIiwiZmlsZUlucHV0RWwiLCJib2R5Iiwib25mb2N1cyIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJoYW5kbGVyIiwiZGlzYWJsZWQiLCJldnQiLCJub2RlIiwiY29udGFpbnMiLCJwcmV2ZW50RGVmYXVsdCIsInB1c2giLCJzZXRTdGF0ZSIsImdldERhdGFUcmFuc2Zlckl0ZW1zIiwic3RvcFByb3BhZ2F0aW9uIiwiZGF0YVRyYW5zZmVyIiwiZHJvcEVmZmVjdCIsImVyciIsIl90aGlzMiIsImZpbHRlciIsImVsIiwiX3RoaXMzIiwiX3Byb3BzIiwib25Ecm9wQWNjZXB0ZWQiLCJvbkRyb3BSZWplY3RlZCIsIm11bHRpcGxlIiwiZGlzYWJsZVByZXZpZXciLCJhY2NlcHQiLCJmaWxlTGlzdCIsImZvckVhY2giLCJmaWxlIiwicHJldmlldyIsIndpbmRvdyIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsImZpbGVBY2NlcHRlZCIsImZpbGVNYXRjaFNpemUiLCJtYXhTaXplIiwibWluU2l6ZSIsImFwcGx5Iiwic3BsaWNlIiwiX3Byb3BzMiIsImRpc2FibGVDbGljayIsInNldFRpbWVvdXQiLCJvcGVuIiwiaW5wdXRQcm9wcyIsIl90aGlzNCIsImZpbGVzIiwicmVmIiwiY2xpY2siLCJfcHJvcHMzIiwiYWNjZXB0Q2xhc3NOYW1lIiwiYWN0aXZlQ2xhc3NOYW1lIiwiZGlzYWJsZWRDbGFzc05hbWUiLCJyZWplY3RDbGFzc05hbWUiLCJyZXN0IiwiYWNjZXB0U3R5bGUiLCJhY3RpdmVTdHlsZSIsIl9yZXN0JGNsYXNzTmFtZSIsImNsYXNzTmFtZSIsInVuZGVmaW5lZCIsImRpc2FibGVkU3R5bGUiLCJyZWplY3RTdHlsZSIsInN0eWxlIiwiX3N0YXRlIiwiZmlsZXNDb3VudCIsImlzTXVsdGlwbGVBbGxvd2VkIiwiYWxsRmlsZXNBY2NlcHRlZCIsIm5vU3R5bGVzIiwiYWN0aXZlIiwicmVqZWN0ZWQiLCJhcHBsaWVkU3R5bGUiLCJpbnB1dEF0dHJpYnV0ZXMiLCJ0eXBlIiwiZGlzcGxheSIsInN1cHBvcnRNdWx0aXBsZSIsIm9uQ2hhbmdlIiwiYXV0b0NvbXBsZXRlIiwiZGl2UHJvcHMiLCJjcmVhdGVFbGVtZW50IiwiYXJpYS1kaXNhYmxlZCIsIkNvbXBvbmVudCIsInByb3BUeXBlcyIsInN0cmluZyIsIm9uZU9mVHlwZSIsImZ1bmMiLCJib29sIiwibnVtYmVyIiwiZGVmYXVsdFByb3BzIiwiSW5maW5pdHkiLCJldmVudCIsImRhdGFUcmFuc2Zlckl0ZW1zTGlzdCIsImR0IiwiaXRlbXMiLCJzbGljZSIsIl9hdHRyQWNjZXB0MiIsInNpemUiLCJldmVyeSIsIl9hdHRyQWNjZXB0IiwidCIsImUiLCJyIiwiaWQiLCJsb2FkZWQiLCJzcGxpdCIsInJlcGxhY2UiLCJ2Iiwic29tZSIsInRyaW0iLCJjaGFyQXQiLCJ0b0xvd2VyQ2FzZSIsImVuZHNXaXRoIiwidGVzdCIsInZlcnNpb24iLCJfX2UiLCJNYXRoIiwiRnVuY3Rpb24iLCJfX2ciLCJ1IiwiZiIsImEiLCJ5IiwiRyIsImgiLCJQIiwiUyIsIngiLCJGIiwiQiIsImNvcmUiLCJXIiwic2V0RGVzYyIsImdldFByb3RvIiwiaXNFbnVtIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJnZXREZXNjIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwic2V0RGVzY3MiLCJnZXRLZXlzIiwiZ2V0TmFtZXMiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiZ2V0U3ltYm9scyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImVhY2giLCJyYW5kb20iLCJjb25jYXQiLCJ0b1N0cmluZyIsIlN5bWJvbCIsIlN0cmluZyIsImluc3BlY3RTb3VyY2UiLCJqb2luIiwiY2VpbCIsImZsb29yIiwiaXNOYU4iLCJtaW4iLCJib3JkZXJTdHlsZSIsImJvcmRlckNvbG9yIiwiYmFja2dyb3VuZENvbG9yIiwib3BhY2l0eSIsIndpZHRoIiwiaGVpZ2h0IiwiYm9yZGVyV2lkdGgiLCJib3JkZXJSYWRpdXMiXSwibWFwcGluZ3MiOiJDQUFBLFNBQUFBLEVBQUFDLEdBQ0EsZ0JBQUFDLFVBQUEsZ0JBQUFDLFFBQ0FBLE9BQUFELFFBQUFELEVBQUFHLFFBQUEsU0FBQUEsUUFBQSxlQUNBLGtCQUFBQyxnQkFBQUMsSUFDQUQsUUFBQSxzQkFBQUosR0FDQSxnQkFBQUMsU0FDQUEsUUFBQSxTQUFBRCxFQUFBRyxRQUFBLFNBQUFBLFFBQUEsZUFFQUosRUFBQSxTQUFBQyxFQUFBRCxFQUFBLE1BQUFBLEVBQUEsWUFDQ08sS0FBQSxTQUFBQyxFQUFBQyxHQUNELE1DQWdCLFVBQVVDLEdDTjFCLFFBQUFDLEdBQUFDLEdBR0EsR0FBQUMsRUFBQUQsR0FDQSxNQUFBQyxHQUFBRCxHQUFBVixPQUdBLElBQUFDLEdBQUFVLEVBQUFELElBQ0FFLEVBQUFGLEVBQ0FHLEdBQUEsRUFDQWIsV0FVQSxPQU5BUSxHQUFBRSxHQUFBSSxLQUFBYixFQUFBRCxRQUFBQyxJQUFBRCxRQUFBUyxHQUdBUixFQUFBWSxHQUFBLEVBR0FaLEVBQUFELFFBdkJBLEdBQUFXLEtBNERBLE9BaENBRixHQUFBTSxFQUFBUCxFQUdBQyxFQUFBTyxFQUFBTCxFQUdBRixFQUFBUSxFQUFBLFNBQUFqQixFQUFBa0IsRUFBQUMsR0FDQVYsRUFBQVcsRUFBQXBCLEVBQUFrQixJQUNBRyxPQUFBQyxlQUFBdEIsRUFBQWtCLEdBQ0FLLGNBQUEsRUFDQUMsWUFBQSxFQUNBQyxJQUFBTixLQU1BVixFQUFBaUIsRUFBQSxTQUFBekIsR0FDQSxHQUFBa0IsR0FBQWxCLEtBQUEwQixXQUNBLFdBQTJCLE1BQUExQixHQUFBLFNBQzNCLFdBQWlDLE1BQUFBLEdBRWpDLE9BREFRLEdBQUFRLEVBQUFFLEVBQUEsSUFBQUEsR0FDQUEsR0FJQVYsRUFBQVcsRUFBQSxTQUFBUSxFQUFBQyxHQUFzRCxNQUFBUixRQUFBUyxVQUFBQyxlQUFBakIsS0FBQWMsRUFBQUMsSUFHdERwQixFQUFBdUIsRUFBQSxHQUdBdkIsSUFBQXdCLEVBQUEsS0RnQk0sU0FBVWhDLEVBQVFELEVBQVNTLEdBRWpDLFlBeUJBLFNBQVN5QixHQUF1QkMsR0FBTyxNQUFPQSxJQUFPQSxFQUFJUixXQUFhUSxHQUFRQyxRQUFTRCxHQUV2RixRQUFTRSxHQUF5QkYsRUFBS0csR0FBUSxHQUFJQyxLQUFhLEtBQUssR0FBSTNCLEtBQUt1QixHQUFXRyxFQUFLRSxRQUFRNUIsSUFBTSxHQUFrQlMsT0FBT1MsVUFBVUMsZUFBZWpCLEtBQUtxQixFQUFLdkIsS0FBYzJCLEVBQU8zQixHQUFLdUIsRUFBSXZCLEdBQU0sT0FBTzJCLEdBRW5OLFFBQVNFLEdBQW1CQyxHQUFPLEdBQUlDLE1BQU1DLFFBQVFGLEdBQU0sQ0FBRSxJQUFLLEdBQUk5QixHQUFJLEVBQUdpQyxFQUFPRixNQUFNRCxFQUFJSSxRQUFTbEMsRUFBSThCLEVBQUlJLE9BQVFsQyxJQUFPaUMsRUFBS2pDLEdBQUs4QixFQUFJOUIsRUFBTSxPQUFPaUMsR0FBZSxNQUFPRixPQUFNSSxLQUFLTCxHQUUxTCxRQUFTTSxHQUFnQkMsRUFBVUMsR0FBZSxLQUFNRCxZQUFvQkMsSUFBZ0IsS0FBTSxJQUFJQyxXQUFVLHFDQUVoSCxRQUFTQyxHQUEyQkMsRUFBTXZDLEdBQVEsSUFBS3VDLEVBQVEsS0FBTSxJQUFJQyxnQkFBZSw0REFBZ0UsUUFBT3hDLEdBQXlCLGdCQUFUQSxJQUFxQyxrQkFBVEEsR0FBOEJ1QyxFQUFQdkMsRUFFbE8sUUFBU3lDLEdBQVVDLEVBQVVDLEdBQWMsR0FBMEIsa0JBQWZBLElBQTRDLE9BQWZBLEVBQXVCLEtBQU0sSUFBSU4sV0FBVSxpRUFBb0VNLEdBQWVELEdBQVMxQixVQUFZVCxPQUFPcUMsT0FBT0QsR0FBY0EsRUFBVzNCLFdBQWE2QixhQUFlQyxNQUFPSixFQUFVaEMsWUFBWSxFQUFPcUMsVUFBVSxFQUFNdEMsY0FBYyxLQUFla0MsSUFBWXBDLE9BQU95QyxlQUFpQnpDLE9BQU95QyxlQUFlTixFQUFVQyxHQUFjRCxFQUFTTyxVQUFZTixHQWhDamVwQyxPQUFPQyxlQUFldEIsRUFBUyxjQUM3QjRELE9BQU8sR0FHVCxJQUFJSSxHQUFXM0MsT0FBTzRDLFFBQVUsU0FBVTFCLEdBQVUsSUFBSyxHQUFJM0IsR0FBSSxFQUFHQSxFQUFJc0QsVUFBVXBCLE9BQVFsQyxJQUFLLENBQUUsR0FBSXVELEdBQVNELFVBQVV0RCxFQUFJLEtBQUssR0FBSXdELEtBQU9ELEdBQWM5QyxPQUFPUyxVQUFVQyxlQUFlakIsS0FBS3FELEVBQVFDLEtBQVE3QixFQUFPNkIsR0FBT0QsRUFBT0MsSUFBWSxNQUFPN0IsSUFFblA4QixFQUFlLFdBQWMsUUFBU0MsR0FBaUIvQixFQUFRZ0MsR0FBUyxJQUFLLEdBQUkzRCxHQUFJLEVBQUdBLEVBQUkyRCxFQUFNekIsT0FBUWxDLElBQUssQ0FBRSxHQUFJNEQsR0FBYUQsRUFBTTNELEVBQUk0RCxHQUFXaEQsV0FBYWdELEVBQVdoRCxhQUFjLEVBQU9nRCxFQUFXakQsY0FBZSxFQUFVLFNBQVdpRCxLQUFZQSxFQUFXWCxVQUFXLEdBQU14QyxPQUFPQyxlQUFlaUIsRUFBUWlDLEVBQVdKLElBQUtJLElBQWlCLE1BQU8sVUFBVXRCLEVBQWF1QixFQUFZQyxHQUFpSixNQUE5SEQsSUFBWUgsRUFBaUJwQixFQUFZcEIsVUFBVzJDLEdBQWlCQyxHQUFhSixFQUFpQnBCLEVBQWF3QixHQUFxQnhCLE1FdEZoaUJ5QixFQUFBbEUsRUFBQSxHRjBGSW1FLEVBQVUxQyxFQUF1QnlDLEdFekZyQ0UsRUFBQXBFLEVBQUEsR0Y2RklxRSxFQUFjNUMsRUFBdUIyQyxHRTVGekNFLEVBQUF0RSxFQUFBLEdBUUF1RSxFQUFBdkUsRUFBQSxHRjBGSXdFLEVBQVcvQyxFQUF1QjhDLEdFeEZoQ0UsRUZzR1MsU0FBVUMsR0VyR3ZCLFFBQUFELEdBQVlYLEVBQU9hLEdBQVNwQyxFQUFBM0MsS0FBQTZFLEVBQUEsSUFBQUcsR0FBQWpDLEVBQUEvQyxNQUFBNkUsRUFBQW5CLFdBQUExQyxPQUFBaUUsZUFBQUosSUFBQXBFLEtBQUFULEtBQ3BCa0UsRUFBT2EsR0FEYSxPQUFBQyxHQW9RNUJFLGVBQWlCLFNBQUNDLEVBQVVDLEVBQWNDLEVBQWNDLEdBQ3RELE1BQXdCLGtCQUFiSCxHQUNGQSxPQUNGSCxFQUFLTyxPQUNSSCxlQUNBQyxlQUNBQyxrQkFHR0gsR0EzUVBILEVBQUtRLGdCQUFrQlIsRUFBS1EsZ0JBQWdCQyxLQUFyQlQsR0FDdkJBLEVBQUtVLFFBQVVWLEVBQUtVLFFBQVFELEtBQWJULEdBQ2ZBLEVBQUtXLGVBQWlCWCxFQUFLVyxlQUFlRixLQUFwQlQsR0FDdEJBLEVBQUtZLFlBQWNaLEVBQUtZLFlBQVlILEtBQWpCVCxHQUNuQkEsRUFBS2EsWUFBY2IsRUFBS2EsWUFBWUosS0FBakJULEdBQ25CQSxFQUFLYyxXQUFhZCxFQUFLYyxXQUFXTCxLQUFoQlQsR0FDbEJBLEVBQUtlLFlBQWNmLEVBQUtlLFlBQVlOLEtBQWpCVCxHQUNuQkEsRUFBS2dCLE9BQVNoQixFQUFLZ0IsT0FBT1AsS0FBWlQsR0FDZEEsRUFBS2lCLG1CQUFxQmpCLEVBQUtpQixtQkFBbUJSLEtBQXhCVCxHQUMxQkEsRUFBS2tCLG9CQUFzQmxCLEVBQUtrQixvQkFBb0JULEtBQXpCVCxHQUUzQkEsRUFBS21CLE9BQVNuQixFQUFLbUIsT0FBT1YsS0FBWlQsR0FDZEEsRUFBS29CLFFBQVVwQixFQUFLb0IsUUFBUVgsS0FBYlQsR0FFZkEsRUFBS3FCLG9CQUFxQixFQUUxQnJCLEVBQUtPLE9BQ0hlLGdCQUNBQyxpQkFDQUMsa0JBckJ3QnhCLEVGc2hCNUIsTUFoYkE5QixHQUFVMkIsRUFBVUMsR0EwQ3BCZCxFQUFhYSxJQUNYZCxJQUFLLG9CQUNMUixNQUFPLFdFekhXLEdBQ1ZrRCxHQUEwQnpHLEtBQUtrRSxNQUEvQnVDLHFCQUNSekcsTUFBSzBHLGVBRURELElBQ0ZFLFNBQVNDLGlCQUFpQixXQUExQmxDLEVBQUFtQyxvQkFBMEQsR0FDMURGLFNBQVNDLGlCQUFpQixPQUFRNUcsS0FBSzJGLGdCQUFnQixJQUV6RDNGLEtBQUs4RyxZQUFZRixpQkFBaUIsUUFBUzVHLEtBQUtrRyxxQkFBcUIsR0FFckVTLFNBQVNJLEtBQUtDLFFBQVVoSCxLQUFLaUcsc0JGNkg3QmxDLElBQUssdUJBQ0xSLE1BQU8sV0UxSDJCdkQsS0FBS2tFLE1BQS9CdUMsd0JBRU5FLFNBQVNNLG9CQUFvQixXQUE3QnZDLEVBQUFtQyxvQkFDQUYsU0FBU00sb0JBQW9CLE9BQVFqSCxLQUFLMkYsaUJBRXBCLE1BQXBCM0YsS0FBSzhHLGFBQ1A5RyxLQUFLOEcsWUFBWUcsb0JBQW9CLFFBQVNqSCxLQUFLa0cscUJBQXFCLEdBRzFELE1BQVpTLFdBQ0ZBLFNBQVNJLEtBQUtDLFFBQVUsU0ZnSTFCakQsSUFBSyxrQkFDTFIsTUFBTyxTRTdITzJELEdBQ2QsTUFBSWxILE1BQUtrRSxNQUFNaUQsU0FDTixLQUdGRCxLRmdJUG5ELElBQUssaUJBQ0xSLE1BQU8sU0U5SE02RCxHQUNUcEgsS0FBS3FILE1BQVFySCxLQUFLcUgsS0FBS0MsU0FBU0YsRUFBSWxGLFVBSXhDa0YsRUFBSUcsaUJBQ0p2SCxLQUFLMEcsbUJGaUlMM0MsSUFBSyxjQUNMUixNQUFPLFNFL0hHNkQsR0FDTnBILEtBQUtrRSxNQUFNNkIsYUFDYi9GLEtBQUtrRSxNQUFNNkIsWUFBWXRGLEtBQUtULEtBQU1vSCxNRm1JcENyRCxJQUFLLGNBQ0xSLE1BQU8sU0VoSUc2RCxHQUNWQSxFQUFJRyxrQkFHMEMsSUFBMUN2SCxLQUFLMEcsWUFBWXZFLFFBQVFpRixFQUFJbEYsU0FDL0JsQyxLQUFLMEcsWUFBWWMsS0FBS0osRUFBSWxGLFFBRzVCbEMsS0FBS3lILFVBQ0hyQyxjQUFjLEVBQ2RrQixjQUFjLEVBQUE1QixFQUFBZ0Qsc0JBQXFCTixLQUdqQ3BILEtBQUtrRSxNQUFNMEIsYUFDYjVGLEtBQUtrRSxNQUFNMEIsWUFBWW5GLEtBQUtULEtBQU1vSCxNRm9JcENyRCxJQUFLLGFBQ0xSLE1BQU8sU0VqSUU2RCxHQUVUQSxFQUFJRyxpQkFDSkgsRUFBSU8saUJBQ0osS0FJRVAsRUFBSVEsYUFBYUMsV0FBYTdILEtBQUtxRyxtQkFBcUIsT0FBUyxPQUNqRSxNQUFPeUIsSUFPVCxNQUhJOUgsTUFBS2tFLE1BQU00QixZQUNiOUYsS0FBS2tFLE1BQU00QixXQUFXckYsS0FBS1QsS0FBTW9ILElBRTVCLEtGb0lQckQsSUFBSyxjQUNMUixNQUFPLFNFbElHNkQsR0FBSyxHQUFBVyxHQUFBL0gsSUFDZm9ILEdBQUlHLGlCQUdKdkgsS0FBSzBHLFlBQWMxRyxLQUFLMEcsWUFBWXNCLE9BQU8sU0FBQUMsR0FBQSxNQUFNQSxLQUFPYixFQUFJbEYsUUFBVTZGLEVBQUtWLEtBQUtDLFNBQVNXLEtBQ3JGakksS0FBSzBHLFlBQVlqRSxPQUFTLElBSzlCekMsS0FBS3lILFVBQ0hyQyxjQUFjLEVBQ2RrQixrQkFHRXRHLEtBQUtrRSxNQUFNMkIsYUFDYjdGLEtBQUtrRSxNQUFNMkIsWUFBWXBGLEtBQUtULEtBQU1vSCxPRjBJcENyRCxJQUFLLFNBQ0xSLE1BQU8sU0V2SUY2RCxHQUFLLEdBQUFjLEdBQUFsSSxLQUFBbUksRUFDMkVuSSxLQUFLa0UsTUFBbEY4QixFQURFbUMsRUFDRm5DLE9BQVFvQyxFQURORCxFQUNNQyxlQUFnQkMsRUFEdEJGLEVBQ3NCRSxlQUFnQkMsRUFEdENILEVBQ3NDRyxTQUFVQyxFQURoREosRUFDZ0RJLGVBQWdCQyxFQURoRUwsRUFDZ0VLLE9BQ3BFQyxHQUFXLEVBQUEvRCxFQUFBZ0Qsc0JBQXFCTixHQUNoQ2IsS0FDQUMsSUFHTlksR0FBSUcsaUJBR0p2SCxLQUFLMEcsZUFDTDFHLEtBQUtxRyxvQkFBcUIsRUFFMUJvQyxFQUFTQyxRQUFRLFNBQUFDLEdBQ2YsSUFBS0osRUFDSCxJQUNFSSxFQUFLQyxRQUFVQyxPQUFPQyxJQUFJQyxnQkFBZ0JKLEdBQzFDLE1BQU9iLEtBUVQsRUFBQXBELEVBQUFzRSxjQUFhTCxFQUFNSCxLQUNuQixFQUFBOUQsRUFBQXVFLGVBQWNOLEVBQU1ULEVBQUtoRSxNQUFNZ0YsUUFBU2hCLEVBQUtoRSxNQUFNaUYsU0FFbkQ1QyxFQUFjaUIsS0FBS21CLEdBRW5CbkMsRUFBY2dCLEtBQUttQixLQUlsQkwsR0FHSDlCLEVBQWNnQixLQUFkNEIsTUFBQTVDLEVBQUFwRSxFQUFzQm1FLEVBQWM4QyxPQUFPLEtBR3pDckQsR0FDRkEsRUFBT3ZGLEtBQUtULEtBQU11RyxFQUFlQyxFQUFlWSxHQUc5Q1osRUFBYy9ELE9BQVMsR0FBSzRGLEdBQzlCQSxFQUFlNUgsS0FBS1QsS0FBTXdHLEVBQWVZLEdBR3ZDYixFQUFjOUQsT0FBUyxHQUFLMkYsR0FDOUJBLEVBQWUzSCxLQUFLVCxLQUFNdUcsRUFBZWEsR0FJM0NwSCxLQUFLc0csYUFBZSxLQUdwQnRHLEtBQUt5SCxVQUNIckMsY0FBYyxFQUNka0IsZ0JBQ0FDLGdCQUNBQyxxQkZpSkZ6QyxJQUFLLFVBQ0xSLE1BQU8sU0U5SUQ2RCxHQUFLLEdBQUFrQyxHQUN1QnRKLEtBQUtrRSxNQUEvQndCLEVBREc0RCxFQUNINUQsT0FERzRELEdBQ01DLGVBRWZuQyxFQUFJTyxrQkFFQWpDLEdBQ0ZBLEVBQVFqRixLQUFLVCxLQUFNb0gsR0FNckJvQyxXQUFXeEosS0FBS3lKLEtBQUtoRSxLQUFLekYsTUFBTyxPRnFKbkMrRCxJQUFLLHNCQUNMUixNQUFPLFNFbEpXNkQsR0FDbEJBLEVBQUlPLGtCQUNBM0gsS0FBS2tFLE1BQU13RixZQUFjMUosS0FBS2tFLE1BQU13RixXQUFXaEUsU0FDakQxRixLQUFLa0UsTUFBTXdGLFdBQVdoRSxhRnNKeEIzQixJQUFLLHFCQUNMUixNQUFPLFdFbkpZLEdBQUFvRyxHQUFBM0osS0FFWGlHLEVBQXVCakcsS0FBS2tFLE1BQTVCK0Isa0JBRUpqRyxNQUFLcUcsb0JBQ1BtRCxXQUFXLFdBQ1QsR0FBd0IsTUFBcEJHLEVBQUs3QyxZQUFxQixDQUVWNkMsRUFBSzdDLFlBQWY4QyxNQUVHbkgsU0FDVGtILEVBQUt0RCxvQkFBcUIsR0FJSSxrQkFBdkJKLElBQ1RBLEtBRUQsUUYySkxsQyxJQUFLLFNBQ0xSLE1BQU8sU0V4SkZzRyxHQUNMN0osS0FBS3FILEtBQU93QyxLRjJKWjlGLElBQUssVUFDTFIsTUFBTyxTRXpKRHNHLEdBQ043SixLQUFLOEcsWUFBYytDLEtGa0tuQjlGLElBQUssT0FDTFIsTUFBTyxXRTNKUHZELEtBQUtxRyxvQkFBcUIsRUFDMUJyRyxLQUFLOEcsWUFBWXZELE1BQVEsS0FDekJ2RCxLQUFLOEcsWUFBWWdELFdGK0pqQi9GLElBQUssU0FDTFIsTUFBTyxXRWpKQSxHQUFBd0csR0FhSC9KLEtBQUtrRSxNQVhQc0UsRUFGS3VCLEVBRUx2QixPQUNBd0IsRUFIS0QsRUFHTEMsZ0JBQ0FDLEVBSktGLEVBSUxFLGdCQUNBOUUsRUFMSzRFLEVBS0w1RSxTQUNBZ0MsRUFOSzRDLEVBTUw1QyxTQUNBK0MsRUFQS0gsRUFPTEcsa0JBQ0FSLEVBUktLLEVBUUxMLFdBQ0FwQixFQVRLeUIsRUFTTHpCLFNBQ0F6SCxFQVZLa0osRUFVTGxKLEtBQ0FzSixFQVhLSixFQVdMSSxnQkFDR0MsRUFaRXBJLEVBQUErSCxHQUFBLDBJQWdCTE0sRUFPRUQsRUFQRkMsWUFDQUMsRUFNRUYsRUFORkUsWUFqQktDLEVBdUJISCxFQUxGSSxnQkFsQktDLEtBQUFGLEVBa0JPLEdBbEJQQSxFQW1CTEcsRUFJRU4sRUFKRk0sY0FDQUMsRUFHRVAsRUFIRk8sWUFDQUMsRUFFRVIsRUFGRlEsTUFDRzFHLEVBdEJFbEMsRUF1QkhvSSxHQXZCRyxnRkFBQVMsRUF5QmdDN0ssS0FBS3VGLE1BQXBDSCxFQXpCRHlGLEVBeUJDekYsYUFBY2tCLEVBekJmdUUsRUF5QmV2RSxhQUNoQndFLEVBQWF4RSxFQUFhN0QsT0FDMUJzSSxFQUFvQnpDLEdBQVl3QyxHQUFjLEVBQzlDekYsRUFBZXlGLEVBQWEsSUFBSyxFQUFBcEcsRUFBQXNHLGtCQUFpQjFFLEVBQWN0RyxLQUFLa0UsTUFBTXNFLFFBQzNFbEQsRUFBZXdGLEVBQWEsS0FBT3pGLElBQWlCMEYsR0FDcERFLElBQ0hULEdBQWNJLEdBQVVOLEdBQWdCRCxHQUFnQk0sR0FBZ0JELEVBRXZFdEYsSUFBZ0I2RSxJQUNsQk8sR0FBYSxJQUFNUCxHQUVqQjVFLEdBQWdCMkUsSUFDbEJRLEdBQWEsSUFBTVIsR0FFakIxRSxHQUFnQjZFLElBQ2xCSyxHQUFhLElBQU1MLEdBRWpCaEQsR0FBWStDLElBQ2RNLEdBQWEsSUFBTU4sR0FHakJlLElBQ0ZMLEVBQVFoRyxFQUFBN0MsUUFBT0EsUUFDZnVJLEVBQWMxRixFQUFBN0MsUUFBT21KLE9BQ3JCYixFQUFjTyxFQUFNTSxPQUNwQlAsRUFBYy9GLEVBQUE3QyxRQUFPb0osU0FDckJULEVBQWdCOUYsRUFBQTdDLFFBQU9vRixTQUd6QixJQUFJaUUsUUFBb0JSLEVBQ3BCTixJQUFlbEYsSUFDakJnRyxPQUNLUixFQUNBTixJQUdIRCxHQUFlaEYsSUFDakIrRixPQUNLQSxFQUNBZixJQUdITSxHQUFlckYsSUFDakI4RixPQUNLQSxFQUNBVCxJQUdIRCxHQUFpQnZELElBQ25CaUUsT0FDS1IsRUFDQUYsR0FJUCxJQUFNVyxJQUNKN0MsU0FDQXJCLFdBQ0FtRSxLQUFNLE9BQ05WLE9BQVNXLFFBQVMsUUFDbEJqRCxTQUFVNUQsRUFBQThHLGlCQUFtQmxELEVBQzdCdUIsSUFBSzdKLEtBQUtvRyxRQUNWcUYsU0FBVXpMLEtBQUtnRyxPQUNmMEYsYUFBYyxNQUdaN0ssSUFBUUEsRUFBSzRCLFNBQ2Y0SSxFQUFnQnhLLEtBQU9BLEVBNUZsQixJQTBHRjhLLElBQ0R6SCxFQVZGcUMsY0FVRXJDLEVBVEZ1QyxzQkFTRXZDLEVBUkZxRSxlQVFFckUsRUFQRnFGLGFBT0VyRixFQU5Ga0UsZUFNRWxFLEVBTEZtRSxlQUtFbkUsRUFKRitCLG1CQUlFL0IsRUFIRmdGLFFBR0VoRixFQUZGaUYsUUF6R0tuSCxFQTJHSGtDLEdBM0dHLHFKQTZHUCxPQUNFSyxHQUFBeEMsUUFBQTZKLGNBQUEsTUFBQWpJLEdBQ0U2RyxVQUFXQSxFQUNYSSxNQUFPUSxHQUNITyxHQUNKakcsUUFBUzFGLEtBQUt3RixnQkFBZ0J4RixLQUFLMEYsU0FDbkNLLFlBQWEvRixLQUFLd0YsZ0JBQWdCeEYsS0FBSytGLGFBQ3ZDSCxZQUFhNUYsS0FBS3dGLGdCQUFnQnhGLEtBQUs0RixhQUN2Q0UsV0FBWTlGLEtBQUt3RixnQkFBZ0J4RixLQUFLOEYsWUFDdENELFlBQWE3RixLQUFLd0YsZ0JBQWdCeEYsS0FBSzZGLGFBQ3ZDRyxPQUFRaEcsS0FBS3dGLGdCQUFnQnhGLEtBQUtnRyxRQUNsQzZELElBQUs3SixLQUFLbUcsT0FDVjBGLGdCQUFlMUUsSUFFZG5ILEtBQUtrRixlQUFlQyxFQUFVQyxFQUFjQyxFQUFjQyxHQUMzRGYsRUFBQXhDLFFBQUE2SixjQUFBLFFBQUFqSSxLQUNNK0YsRUFDQTJCLFNGd0lMeEcsR0V2aEJjTixFQUFBeEMsUUFBTStKLFVGMGhCN0JuTSxHQUFRb0MsUUVwSU84QyxFQUVmQSxFQUFTa0gsV0FRUHZELE9BQVEvRCxFQUFBMUMsUUFBVWlLLE9BS2xCN0csU0FBVVYsRUFBQTFDLFFBQVVrSyxXQUFXeEgsRUFBQTFDLFFBQVVzRixLQUFNNUMsRUFBQTFDLFFBQVVtSyxPQUt6RDNDLGFBQWM5RSxFQUFBMUMsUUFBVW9LLEtBS3hCaEYsU0FBVTFDLEVBQUExQyxRQUFVb0ssS0FLcEI1RCxlQUFnQjlELEVBQUExQyxRQUFVb0ssS0FLMUIxRixzQkFBdUJoQyxFQUFBMUMsUUFBVW9LLEtBS2pDekMsV0FBWWpGLEVBQUExQyxRQUFVUixPQUt0QitHLFNBQVU3RCxFQUFBMUMsUUFBVW9LLEtBS3BCdEwsS0FBTTRELEVBQUExQyxRQUFVaUssT0FLaEI5QyxRQUFTekUsRUFBQTFDLFFBQVVxSyxPQUtuQmpELFFBQVMxRSxFQUFBMUMsUUFBVXFLLE9BS25CNUIsVUFBVy9GLEVBQUExQyxRQUFVaUssT0FLckIvQixnQkFBaUJ4RixFQUFBMUMsUUFBVWlLLE9BSzNCaEMsZ0JBQWlCdkYsRUFBQTFDLFFBQVVpSyxPQUszQjdCLGdCQUFpQjFGLEVBQUExQyxRQUFVaUssT0FLM0I5QixrQkFBbUJ6RixFQUFBMUMsUUFBVWlLLE9BSzdCcEIsTUFBT25HLEVBQUExQyxRQUFVUixPQUtqQitJLFlBQWE3RixFQUFBMUMsUUFBVVIsT0FLdkI4SSxZQUFhNUYsRUFBQTFDLFFBQVVSLE9BS3ZCb0osWUFBYWxHLEVBQUExQyxRQUFVUixPQUt2Qm1KLGNBQWVqRyxFQUFBMUMsUUFBVVIsT0FNekJtRSxRQUFTakIsRUFBQTFDLFFBQVVtSyxLQUtuQmxHLE9BQVF2QixFQUFBMUMsUUFBVW1LLEtBS2xCOUQsZUFBZ0IzRCxFQUFBMUMsUUFBVW1LLEtBSzFCN0QsZUFBZ0I1RCxFQUFBMUMsUUFBVW1LLEtBSzFCbkcsWUFBYXRCLEVBQUExQyxRQUFVbUssS0FLdkJ0RyxZQUFhbkIsRUFBQTFDLFFBQVVtSyxLQUt2QnBHLFdBQVlyQixFQUFBMUMsUUFBVW1LLEtBS3RCckcsWUFBYXBCLEVBQUExQyxRQUFVbUssS0FLdkJqRyxtQkFBb0J4QixFQUFBMUMsUUFBVW1LLE1BR2hDckgsRUFBU3dILGNBQ1A1Rix1QkFBdUIsRUFDdkJVLFVBQVUsRUFDVm9CLGdCQUFnQixFQUNoQmdCLGNBQWMsRUFDZGpCLFVBQVUsRUFDVlksUUFBU29ELElBQ1RuRCxRQUFTLEdGdUlYdkosRUFBT0QsUUFBVUEsRUFBaUIsU0FJNUIsU0FBVUMsRUFBUUQsR0dydEJ4QkMsRUFBQUQsUUFBQU0sR0gydEJNLFNBQVVMLEVBQVFELEdJM3RCeEJDLEVBQUFELFFBQUFPLEdKaXVCTSxTQUFVTixFQUFRRCxFQUFTUyxHQUVqQyxZSzV0Qk8sU0FBU3NILEdBQXFCNkUsR0FDbkMsR0FBSUMsS0FDSixJQUFJRCxFQUFNM0UsYUFBYyxDQUN0QixHQUFNNkUsR0FBS0YsRUFBTTNFLFlBQ2I2RSxHQUFHN0MsT0FBUzZDLEVBQUc3QyxNQUFNbkgsT0FDdkIrSixFQUF3QkMsRUFBRzdDLE1BQ2xCNkMsRUFBR0MsT0FBU0QsRUFBR0MsTUFBTWpLLFNBRzlCK0osRUFBd0JDLEVBQUdDLFdBRXBCSCxHQUFNckssUUFBVXFLLEVBQU1ySyxPQUFPMEgsUUFDdEM0QyxFQUF3QkQsRUFBTXJLLE9BQU8wSCxNQUd2QyxPQUFPdEgsT0FBTWIsVUFBVWtMLE1BQU1sTSxLQUFLK0wsR0FLN0IsUUFBU3hELEdBQWFMLEVBQU1ILEdBQ2pDLE1BQXFCLDJCQUFkRyxFQUFLMkMsT0FBcUMsRUFBQXNCLEVBQUE3SyxTQUFRNEcsRUFBTUgsR0FHMUQsUUFBU1MsR0FBY04sRUFBTU8sRUFBU0MsR0FDM0MsTUFBT1IsR0FBS2tFLE1BQVEzRCxHQUFXUCxFQUFLa0UsTUFBUTFELEVBR3ZDLFFBQVM2QixHQUFpQnBCLEVBQU9wQixHQUN0QyxNQUFPb0IsR0FBTWtELE1BQU0sU0FBQW5FLEdBQUEsTUFBUUssR0FBYUwsRUFBTUgsS0FJekMsUUFBUzNCLEdBQW1CTyxHQUNqQ0EsRUFBSUcsaUJMNnJCTnZHLE9BQU9DLGVBQWV0QixFQUFTLGNBQzdCNEQsT0FBTyxJQUVUNUQsRUFBUTZMLG9CQUFrQmYsR0FDMUI5SyxFS251QmdCK0gsdUJMb3VCaEIvSCxFS2h0QmdCcUosZUxpdEJoQnJKLEVLN3NCZ0JzSixnQkw4c0JoQnRKLEVLMXNCZ0JxTCxtQkwyc0JoQnJMLEVLdHNCZ0JrSCxvQkF4Q2hCLElBQUFrRyxHQUFBM00sRUFBQSxHTGt2Qkl3TSxFQUVKLFNBQWdDOUssR0FBTyxNQUFPQSxJQUFPQSxFQUFJUixXQUFhUSxHQUFRQyxRQUFTRCxJQUY3Q2lMLEVLaHZCN0J2QixtQkFDUyxtQkFBYjdFLFlBQTRCQSxXQUFZQSxTQUFTaUYsZUFDcEQsWUFBY2pGLFVBQVNpRixjQUFjLFVMNnhCckMsU0FBVWhNLEVBQVFELEdNanlCeEJDLEVBQUFELFFBQUEsU0FBQXFOLEdBQTJCLFFBQUEzTCxHQUFBNEwsR0FBYyxHQUFBQyxFQUFBRCxHQUFBLE1BQUFDLEdBQUFELEdBQUF0TixPQUE0QixJQUFBb0IsR0FBQW1NLEVBQUFELElBQVl0TixXQUFVd04sR0FBQUYsRUFBQUcsUUFBQSxFQUFpQixPQUFBSixHQUFBQyxHQUFBeE0sS0FBQU0sRUFBQXBCLFFBQUFvQixJQUFBcEIsUUFBQTBCLEdBQUFOLEVBQUFxTSxRQUFBLEVBQUFyTSxFQUFBcEIsUUFBZ0UsR0FBQXVOLEtBQVMsT0FBQTdMLEdBQUFYLEVBQUFzTSxFQUFBM0wsRUFBQVYsRUFBQXVNLEVBQUE3TCxFQUFBTSxFQUFBLEdBQUFOLEVBQUEsS0FBK0IsU0FBQTJMLEVBQUEzTCxFQUFBNkwsR0FBa0IsWUFBYTdMLEdBQUFDLFlBQUEsRUFBQTRMLEVBQUEsR0FBQUEsRUFBQSxHQUFBN0wsRUFBQSxpQkFBQTJMLEVBQUEzTCxHQUFxRCxHQUFBMkwsR0FBQTNMLEVBQUEsQ0FBUyxHQUFBNkwsR0FBQSxXQUFpQixHQUFBQSxHQUFBNUssTUFBQUMsUUFBQWxCLE9BQUFnTSxNQUFBLEtBQUFKLEVBQUFELEVBQUFuTSxNQUFBLEdBQUFFLEVBQUFpTSxFQUFBMUIsTUFBQSxHQUFBL0ssRUFBQVEsRUFBQXVNLFFBQUEsV0FBd0YsUUFBT0MsRUFBQUwsRUFBQU0sS0FBQSxTQUFBUixHQUFxQixHQUFBM0wsR0FBQTJMLEVBQUFTLE1BQWUsYUFBQXBNLEVBQUFxTSxPQUFBLEdBQUFULEVBQUFVLGNBQUFDLFNBQUF2TSxFQUFBc00sZUFBQSxRQUFBRSxLQUFBeE0sR0FBQWQsSUFBQWMsRUFBQWlNLFFBQUEsWUFBQXZNLElBQUFNLE9BQXdILG9CQUFBNkwsR0FBQSxNQUFBQSxHQUFBSyxFQUFpQyxVQUFTUCxFQUFBck4sUUFBQTBCLEVBQUEsU0FBd0IsU0FBQTJMLEVBQUEzTCxHQUFlLEdBQUE2TCxHQUFBRixFQUFBck4sU0FBaUJtTyxRQUFBLFFBQWlCLGlCQUFBQyxXQUFBYixJQUE4QixTQUFBRixFQUFBM0wsR0FBZSxHQUFBNkwsR0FBQUYsRUFBQXJOLFFBQUEsbUJBQUFrSixnQkFBQW1GLFdBQUFuRixPQUFBLG1CQUFBN0YsWUFBQWdMLFdBQUFoTCxLQUFBaUwsU0FBQSxnQkFBOEksaUJBQUFDLFdBQUFoQixJQUE4QixTQUFBRixFQUFBM0wsRUFBQTZMLEdBQWlCLEdBQUFELEdBQUFDLEVBQUEsR0FBQW5NLEVBQUFtTSxFQUFBLEdBQUEzTSxFQUFBMk0sRUFBQSxHQUFBaUIsRUFBQWpCLEVBQUEsSUFBQXZNLEVBQUEsWUFBQXlOLEVBQUEsU0FBQXBCLEVBQUEzTCxHQUErRCxrQkFBa0IsTUFBQTJMLEdBQUE1RCxNQUFBL0gsRUFBQXdDLGFBQTZCakMsRUFBQSxTQUFBb0wsRUFBQTNMLEVBQUE2TCxHQUFtQixHQUFBbUIsR0FBQTFNLEVBQUFuQixFQUFBOE4sRUFBQTFOLEVBQUFvTSxFQUFBcEwsRUFBQTJNLEVBQUFDLEVBQUF4QixFQUFBcEwsRUFBQTZNLEVBQUFsQixFQUFBM00sRUFBQXFNLEVBQUFELEVBQUFwTCxFQUFBOE0sRUFBQXpCLEVBQUE1TCxLQUFBNEwsRUFBQTVMLFFBQXNENEwsRUFBQTVMLFFBQVdWLEdBQUFnTyxFQUFBL04sRUFBQUcsSUFBQU0sS0FBQU4sRUFBQU0sTUFBMkJULEtBQUFzTSxFQUFBN0wsRUFBUyxLQUFBZ04sSUFBQW5CLEdBQUF2TCxJQUFBcUwsRUFBQXBMLEVBQUFnTixJQUFBckIsR0FBQWMsSUFBQWQsR0FBQS9NLEdBQUFtQixFQUFBNEwsRUFBQUwsR0FBQW1CLEdBQUFDLEVBQUF0QixFQUFBcEwsRUFBQWlOLEdBQUFsTixFQUFBeU0sRUFBQTVOLEVBQUF5TSxHQUFBdUIsR0FBQSxrQkFBQWhPLEdBQUE0TixFQUFBSCxTQUFBeE4sS0FBQUQsS0FBQStNLElBQUE1TCxHQUFBd00sRUFBQVosRUFBQWMsRUFBQTdOLEdBQUFtTyxFQUFBTixJQUFBN04sR0FBQUQsRUFBQW9PLEVBQUFOLEVBQUFDLEdBQUFFLEtBQUFHLEVBQUFoTyxLQUFBZ08sRUFBQWhPLFFBQWtLME4sR0FBQTdOLEdBQVV5TSxHQUFBNkIsS0FBQS9OLEVBQUFhLEVBQUFnTixFQUFBLEVBQUFoTixFQUFBMk0sRUFBQSxFQUFBM00sRUFBQThNLEVBQUEsRUFBQTlNLEVBQUE2TSxFQUFBLEVBQUE3TSxFQUFBaU4sRUFBQSxHQUFBak4sRUFBQW1OLEVBQUEsR0FBQS9CLEVBQUFyTixRQUFBaUMsR0FBMkQsU0FBQW9MLEVBQUEzTCxFQUFBNkwsR0FBaUIsR0FBQUQsR0FBQUMsRUFBQSxHQUFBbk0sRUFBQW1NLEVBQUEsR0FBbUJGLEdBQUFyTixRQUFBdU4sRUFBQSxhQUFBRixFQUFBM0wsRUFBQTZMLEdBQWdDLE1BQUFELEdBQUErQixRQUFBaEMsRUFBQTNMLEVBQUFOLEVBQUEsRUFBQW1NLEtBQTZCLFNBQUFGLEVBQUEzTCxFQUFBNkwsR0FBaUIsTUFBQUYsR0FBQTNMLEdBQUE2TCxFQUFBRixJQUFpQixTQUFBQSxFQUFBM0wsR0FBZSxHQUFBNkwsR0FBQWxNLE1BQWFnTSxHQUFBck4sU0FBVzBELE9BQUE2SixFQUFBN0osT0FBQTRMLFNBQUEvQixFQUFBakksZUFBQWlLLFVBQW1EQyxxQkFBQUMsUUFBQWxDLEVBQUFtQyx5QkFBQUwsUUFBQTlCLEVBQUFqTSxlQUFBcU8sU0FBQXBDLEVBQUFqSixpQkFBQXNMLFFBQUFyQyxFQUFBakwsS0FBQXVOLFNBQUF0QyxFQUFBdUMsb0JBQUFDLFdBQUF4QyxFQUFBeUMsc0JBQUFDLFFBQUFsSCxVQUFnTixTQUFBc0UsRUFBQTNMLEdBQWUsR0FBQTZMLEdBQUEsRUFBQUQsRUFBQWUsS0FBQTZCLFFBQXdCN0MsR0FBQXJOLFFBQUEsU0FBQXFOLEdBQXNCLGdCQUFBOEMsV0FBQSxLQUFBOUMsRUFBQSxHQUFBQSxFQUFBLFFBQUFFLEVBQUFELEdBQUE4QyxTQUFBLE9BQW1FLFNBQUEvQyxFQUFBM0wsRUFBQTZMLEdBQWlCLEdBQUFELEdBQUFDLEVBQUEsV0FBQW5NLEVBQUFtTSxFQUFBLEdBQUE4QyxNQUFpQ2hELEdBQUFyTixRQUFBLFNBQUFxTixHQUFzQixNQUFBQyxHQUFBRCxLQUFBQyxFQUFBRCxHQUFBak0sS0FBQWlNLEtBQUFqTSxHQUFBbU0sRUFBQSxjQUFBRixNQUFxRCxTQUFBQSxFQUFBM0wsRUFBQTZMLEdBQWlCQSxFQUFBLElBQUFGLEVBQUFyTixRQUFBdU4sRUFBQSxHQUFBNUssTUFBQWtMLE1BQWdDLFNBQUFSLEVBQUEzTCxFQUFBNkwsR0FBaUJBLEVBQUEsSUFBQUYsRUFBQXJOLFFBQUF1TixFQUFBLEdBQUErQyxPQUFBckMsVUFBcUMsU0FBQVosRUFBQTNMLEdBQWUyTCxFQUFBck4sUUFBQSxTQUFBcU4sR0FBc0IscUJBQUFBLEdBQUEsS0FBQWxLLFdBQUFrSyxFQUFBLHNCQUFpRSxPQUFBQSxLQUFVLFNBQUFBLEVBQUEzTCxHQUFlLEdBQUE2TCxNQUFRNkMsUUFBVS9DLEdBQUFyTixRQUFBLFNBQUFxTixHQUFzQixNQUFBRSxHQUFBek0sS0FBQXVNLEdBQUFMLE1BQUEsUUFBOEIsU0FBQUssRUFBQTNMLEVBQUE2TCxHQUFpQixHQUFBRCxHQUFBQyxFQUFBLEdBQVlGLEdBQUFyTixRQUFBLFNBQUFxTixFQUFBM0wsRUFBQTZMLEdBQTBCLEdBQUFELEVBQUFELE9BQUEsS0FBQTNMLEVBQUEsTUFBQTJMLEVBQTRCLFFBQUFFLEdBQVUsdUJBQUFBLEdBQTBCLE1BQUFGLEdBQUF2TSxLQUFBWSxFQUFBNkwsR0FBb0Isd0JBQUFBLEVBQUFELEdBQTRCLE1BQUFELEdBQUF2TSxLQUFBWSxFQUFBNkwsRUFBQUQsR0FBc0Isd0JBQUFDLEVBQUFELEVBQUFsTSxHQUE4QixNQUFBaU0sR0FBQXZNLEtBQUFZLEVBQUE2TCxFQUFBRCxFQUFBbE0sSUFBd0Isa0JBQWtCLE1BQUFpTSxHQUFBNUQsTUFBQS9ILEVBQUF3QyxjQUE4QixTQUFBbUosRUFBQTNMLEdBQWUyTCxFQUFBck4sUUFBQSxTQUFBcU4sR0FBc0IsV0FBQUEsRUFBQSxLQUFBbEssV0FBQSx5QkFBQWtLLEVBQXlELE9BQUFBLEtBQVUsU0FBQUEsRUFBQTNMLEVBQUE2TCxHQUFpQkYsRUFBQXJOLFFBQUEsU0FBQXFOLEdBQXNCLEdBQUEzTCxHQUFBLEdBQVUsS0FBSSxNQUFBMkwsR0FBQTNMLEdBQVksTUFBQTRMLEdBQVMsSUFBSSxNQUFBNUwsR0FBQTZMLEVBQUEsdUJBQUFGLEdBQUEzTCxHQUF3QyxNQUFBTixLQUFXLFdBQVUsU0FBQWlNLEVBQUEzTCxHQUFlMkwsRUFBQXJOLFFBQUEsU0FBQXFOLEdBQXNCLElBQUksUUFBQUEsSUFBWSxNQUFBM0wsR0FBUyxZQUFXLFNBQUEyTCxFQUFBM0wsR0FBZTJMLEVBQUFyTixRQUFBLFNBQUFxTixHQUFzQixzQkFBQUEsR0FBQSxPQUFBQSxFQUFBLGtCQUFBQSxLQUF3RCxTQUFBQSxFQUFBM0wsRUFBQTZMLEdBQWlCLEdBQUFELEdBQUFDLEVBQUEsSUFBQW5NLEVBQUFtTSxFQUFBLElBQUEzTSxFQUFBMk0sRUFBQSxXQUFvQ0YsR0FBQXJOLFFBQUEsU0FBQXFOLEdBQXNCLEdBQUEzTCxFQUFNLE9BQUE0TCxHQUFBRCxTQUFBLE1BQUEzTCxFQUFBMkwsRUFBQXpNLE1BQUFjLEVBQUEsVUFBQU4sRUFBQWlNLE1BQXFELFNBQUFBLEVBQUEzTCxHQUFlMkwsRUFBQXJOLFFBQUEsU0FBQXFOLEVBQUEzTCxHQUF3QixPQUFPRixhQUFBLEVBQUE2TCxHQUFBOUwsZUFBQSxFQUFBOEwsR0FBQXhKLFdBQUEsRUFBQXdKLEdBQUF6SixNQUFBbEMsS0FBZ0UsU0FBQTJMLEVBQUEzTCxFQUFBNkwsR0FBaUIsR0FBQUQsR0FBQUMsRUFBQSxHQUFBbk0sRUFBQW1NLEVBQUEsR0FBQTNNLEVBQUEyTSxFQUFBLFVBQUFpQixFQUFBLFdBQUF4TixFQUFBc04sU0FBQUUsR0FBQUMsR0FBQSxHQUFBek4sR0FBQTBNLE1BQUFjLEVBQTZFakIsR0FBQSxHQUFBZ0QsY0FBQSxTQUFBbEQsR0FBK0IsTUFBQXJNLEdBQUFGLEtBQUF1TSxLQUFpQkEsRUFBQXJOLFFBQUEsU0FBQXFOLEVBQUEzTCxFQUFBNkwsRUFBQWlCLEdBQThCLGtCQUFBakIsS0FBQW5NLEVBQUFtTSxFQUFBM00sRUFBQXlNLEVBQUEzTCxHQUFBLEdBQUEyTCxFQUFBM0wsR0FBQStNLEVBQUErQixLQUFBRixPQUFBNU8sS0FBQSxRQUFBNkwsT0FBQXJNLEtBQUFRLElBQUEyTCxJQUFBQyxFQUFBRCxFQUFBM0wsR0FBQTZMLEdBQUFpQixTQUFBbkIsR0FBQTNMLEdBQUFOLEVBQUFpTSxFQUFBM0wsRUFBQTZMLE1BQTRIZSxTQUFBeE0sVUFBQTBNLEVBQUEsV0FBa0Msd0JBQUFuTyxZQUFBTyxJQUFBSSxFQUFBRixLQUFBVCxTQUF1RCxTQUFBZ04sRUFBQTNMLEVBQUE2TCxHQUFpQixHQUFBRCxHQUFBQyxFQUFBLEdBQUFuTSxFQUFBLHFCQUFBUixFQUFBME0sRUFBQWxNLEtBQUFrTSxFQUFBbE0sTUFBb0RpTSxHQUFBck4sUUFBQSxTQUFBcU4sR0FBc0IsTUFBQXpNLEdBQUF5TSxLQUFBek0sRUFBQXlNLFNBQXdCLFNBQUFBLEVBQUEzTCxFQUFBNkwsR0FBaUIsR0FBQUQsR0FBQUMsRUFBQSxJQUFBbk0sRUFBQW1NLEVBQUEsR0FBb0JGLEdBQUFyTixRQUFBLFNBQUFxTixFQUFBM0wsRUFBQTZMLEdBQTBCLEdBQUFELEVBQUE1TCxHQUFBLEtBQUF5QixXQUFBLFVBQUFvSyxFQUFBLHlCQUE4RCxPQUFBK0MsUUFBQWxQLEVBQUFpTSxNQUFxQixTQUFBQSxFQUFBM0wsRUFBQTZMLEdBQWlCRixFQUFBck4sU0FBQXVOLEVBQUEsZUFBNEIsVUFBQWxNLE9BQUFDLGtCQUFrQyxLQUFNRyxJQUFBLFdBQWUsWUFBVWlOLEtBQU0sU0FBQXJCLEVBQUEzTCxHQUFlLEdBQUE2TCxHQUFBYyxLQUFBb0MsS0FBQW5ELEVBQUFlLEtBQUFxQyxLQUE2QnJELEdBQUFyTixRQUFBLFNBQUFxTixHQUFzQixNQUFBc0QsT0FBQXRELE1BQUEsR0FBQUEsRUFBQSxFQUFBQyxFQUFBQyxHQUFBRixLQUFtQyxTQUFBQSxFQUFBM0wsRUFBQTZMLEdBQWlCLEdBQUFELEdBQUFDLEVBQUEsSUFBQW5NLEVBQUFpTixLQUFBdUMsR0FBdUJ2RCxHQUFBck4sUUFBQSxTQUFBcU4sR0FBc0IsTUFBQUEsR0FBQSxFQUFBak0sRUFBQWtNLEVBQUFELEdBQUEsc0JBQXVDLFNBQUFBLEVBQUEzTCxFQUFBNkwsR0FBaUIsWUFBYSxJQUFBRCxHQUFBQyxFQUFBLEdBQUFuTSxFQUFBbU0sRUFBQSxJQUFBM00sRUFBQTJNLEVBQUEsSUFBQWlCLEVBQUEsV0FBQXhOLEVBQUEsR0FBQXdOLEVBQWdEbEIsS0FBQXdCLEVBQUF4QixFQUFBMkIsRUFBQTFCLEVBQUEsSUFBQWlCLEdBQUEsVUFBNkJQLFNBQUEsU0FBQVosR0FBcUIsR0FBQTNMLEdBQUFkLEVBQUFQLEtBQUFnTixFQUFBbUIsR0FBQWpCLEVBQUFySixVQUFBb0osRUFBQUMsRUFBQXpLLE9BQUEsRUFBQXlLLEVBQUEsVUFBQWtCLEVBQUFyTixFQUFBTSxFQUFBb0IsUUFBQWIsTUFBQSxLQUFBcUwsRUFBQW1CLEVBQUFKLEtBQUF1QyxJQUFBeFAsRUFBQWtNLEdBQUFtQixHQUFBQyxFQUFBNEIsT0FBQWpELEVBQWlILE9BQUFyTSxLQUFBRixLQUFBWSxFQUFBZ04sRUFBQXpNLEdBQUFQLEVBQUFzTCxNQUFBL0ssRUFBQXlNLEVBQUE1TCxPQUFBYixLQUFBeU0sTUFBb0QsU0FBQXJCLEVBQUEzTCxFQUFBNkwsR0FBaUIsR0FBQUQsR0FBQUMsRUFBQSxHQUFBbk0sRUFBQW1NLEVBQUEsR0FBQTNNLEVBQUEyTSxFQUFBLEdBQUE1SyxhQUFBNkwsS0FBMEN4TixFQUFBLFNBQUFxTSxFQUFBM0wsR0FBaUI0TCxFQUFBMkMsS0FBQW5QLEtBQUF1TSxFQUFBSyxNQUFBLGNBQUFMLE9BQXFDLElBQUEzTCxHQUFBMkwsSUFBQXpNLEdBQUE0TixFQUFBbkIsR0FBQXpNLEVBQUF5TSxZQUFBbUIsRUFBQW5CLEdBQUFFLEVBQUEsSUFBQWUsU0FBQXhOLFFBQUF1TSxHQUFBM0wsTUFBMkVWLEdBQUEsMkNBQUFBLEVBQUEsbUVBQUFBLEVBQUEsNkZBQUFJLElBQUEyTixFQUFBLFFBQUFQLE9OdXlCNW9KLFNBQVV2TyxFQUFRRCxFQUFTUyxHQUVqQyxZQUdBWSxRQUFPQyxlQUFldEIsRUFBUyxjQUM3QjRELE9BQU8sSUFFVDVELEVBQVFvQyxTTzl5Qk5vSixVQUNFcUYsWUFBYSxRQUNiQyxZQUFhLE9BQ2JDLGdCQUFpQixRQUVuQnZKLFVBQ0V3SixRQUFTLElBRVh6RixRQUNFc0YsWUFBYSxRQUNiQyxZQUFhLE9BQ2JDLGdCQUFpQixRQUVuQjNPLFNBQ0U2TyxNQUFPLElBQ1BDLE9BQVEsSUFDUkMsWUFBYSxFQUNiTCxZQUFhLE9BQ2JELFlBQWEsU0FDYk8sYUFBYyxJUGt6QmxCblIsRUFBT0QsUUFBVUEsRUFBaUIiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJyZWFjdFwiKSwgcmVxdWlyZShcInByb3AtdHlwZXNcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW1wicmVhY3RcIiwgXCJwcm9wLXR5cGVzXCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIkRyb3B6b25lXCJdID0gZmFjdG9yeShyZXF1aXJlKFwicmVhY3RcIiksIHJlcXVpcmUoXCJwcm9wLXR5cGVzXCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJEcm9wem9uZVwiXSA9IGZhY3Rvcnkocm9vdFtcIlJlYWN0XCJdLCByb290W1wiUHJvcFR5cGVzXCJdKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfMV9fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzJfXykge1xucmV0dXJuIFxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJyZWFjdFwiKSwgcmVxdWlyZShcInByb3AtdHlwZXNcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW1wicmVhY3RcIiwgXCJwcm9wLXR5cGVzXCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIkRyb3B6b25lXCJdID0gZmFjdG9yeShyZXF1aXJlKFwicmVhY3RcIiksIHJlcXVpcmUoXCJwcm9wLXR5cGVzXCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJEcm9wem9uZVwiXSA9IGZhY3Rvcnkocm9vdFtcIlJlYWN0XCJdLCByb290W1wiUHJvcFR5cGVzXCJdKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfMV9fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzJfXykge1xucmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbi8qKioqKiovIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbi8qKioqKiovIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAwKTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxudmFyIF9yZWFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuXG52YXIgX3N0eWxlcyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7XG5cbnZhciBfc3R5bGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3N0eWxlcyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhvYmosIGtleXMpIHsgdmFyIHRhcmdldCA9IHt9OyBmb3IgKHZhciBpIGluIG9iaikgeyBpZiAoa2V5cy5pbmRleE9mKGkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGkpKSBjb250aW51ZTsgdGFyZ2V0W2ldID0gb2JqW2ldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSBlbHNlIHsgcmV0dXJuIEFycmF5LmZyb20oYXJyKTsgfSB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH0gLyogZXNsaW50IHByZWZlci10ZW1wbGF0ZTogMCAqL1xuXG52YXIgRHJvcHpvbmUgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoRHJvcHpvbmUsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIERyb3B6b25lKHByb3BzLCBjb250ZXh0KSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERyb3B6b25lKTtcblxuICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChEcm9wem9uZS5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKERyb3B6b25lKSkuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCkpO1xuXG4gICAgX3RoaXMucmVuZGVyQ2hpbGRyZW4gPSBmdW5jdGlvbiAoY2hpbGRyZW4sIGlzRHJhZ0FjdGl2ZSwgaXNEcmFnQWNjZXB0LCBpc0RyYWdSZWplY3QpIHtcbiAgICAgIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuKF9leHRlbmRzKHt9LCBfdGhpcy5zdGF0ZSwge1xuICAgICAgICAgIGlzRHJhZ0FjdGl2ZTogaXNEcmFnQWN0aXZlLFxuICAgICAgICAgIGlzRHJhZ0FjY2VwdDogaXNEcmFnQWNjZXB0LFxuICAgICAgICAgIGlzRHJhZ1JlamVjdDogaXNEcmFnUmVqZWN0XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGlsZHJlbjtcbiAgICB9O1xuXG4gICAgX3RoaXMuY29tcG9zZUhhbmRsZXJzID0gX3RoaXMuY29tcG9zZUhhbmRsZXJzLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLm9uQ2xpY2sgPSBfdGhpcy5vbkNsaWNrLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLm9uRG9jdW1lbnREcm9wID0gX3RoaXMub25Eb2N1bWVudERyb3AuYmluZChfdGhpcyk7XG4gICAgX3RoaXMub25EcmFnRW50ZXIgPSBfdGhpcy5vbkRyYWdFbnRlci5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5vbkRyYWdMZWF2ZSA9IF90aGlzLm9uRHJhZ0xlYXZlLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLm9uRHJhZ092ZXIgPSBfdGhpcy5vbkRyYWdPdmVyLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLm9uRHJhZ1N0YXJ0ID0gX3RoaXMub25EcmFnU3RhcnQuYmluZChfdGhpcyk7XG4gICAgX3RoaXMub25Ecm9wID0gX3RoaXMub25Ecm9wLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLm9uRmlsZURpYWxvZ0NhbmNlbCA9IF90aGlzLm9uRmlsZURpYWxvZ0NhbmNlbC5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5vbklucHV0RWxlbWVudENsaWNrID0gX3RoaXMub25JbnB1dEVsZW1lbnRDbGljay5iaW5kKF90aGlzKTtcblxuICAgIF90aGlzLnNldFJlZiA9IF90aGlzLnNldFJlZi5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5zZXRSZWZzID0gX3RoaXMuc2V0UmVmcy5iaW5kKF90aGlzKTtcblxuICAgIF90aGlzLmlzRmlsZURpYWxvZ0FjdGl2ZSA9IGZhbHNlO1xuXG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBkcmFnZ2VkRmlsZXM6IFtdLFxuICAgICAgYWNjZXB0ZWRGaWxlczogW10sXG4gICAgICByZWplY3RlZEZpbGVzOiBbXVxuICAgIH07XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKERyb3B6b25lLCBbe1xuICAgIGtleTogJ2NvbXBvbmVudERpZE1vdW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB2YXIgcHJldmVudERyb3BPbkRvY3VtZW50ID0gdGhpcy5wcm9wcy5wcmV2ZW50RHJvcE9uRG9jdW1lbnQ7XG5cbiAgICAgIHRoaXMuZHJhZ1RhcmdldHMgPSBbXTtcblxuICAgICAgaWYgKHByZXZlbnREcm9wT25Eb2N1bWVudCkge1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIF91dGlscy5vbkRvY3VtZW50RHJhZ092ZXIsIGZhbHNlKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMub25Eb2N1bWVudERyb3AsIGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsZUlucHV0RWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uSW5wdXRFbGVtZW50Q2xpY2ssIGZhbHNlKTtcbiAgICAgIC8vIFRyaWVkIGltcGxlbWVudGluZyBhZGRFdmVudExpc3RlbmVyLCBidXQgZGlkbid0IHdvcmsgb3V0XG4gICAgICBkb2N1bWVudC5ib2R5Lm9uZm9jdXMgPSB0aGlzLm9uRmlsZURpYWxvZ0NhbmNlbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjb21wb25lbnRXaWxsVW5tb3VudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgdmFyIHByZXZlbnREcm9wT25Eb2N1bWVudCA9IHRoaXMucHJvcHMucHJldmVudERyb3BPbkRvY3VtZW50O1xuXG4gICAgICBpZiAocHJldmVudERyb3BPbkRvY3VtZW50KSB7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgX3V0aWxzLm9uRG9jdW1lbnREcmFnT3Zlcik7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLm9uRG9jdW1lbnREcm9wKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmZpbGVJbnB1dEVsICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5maWxlSW5wdXRFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25JbnB1dEVsZW1lbnRDbGljaywgZmFsc2UpO1xuICAgICAgfVxuICAgICAgLy8gQ2FuIGJlIHJlcGxhY2VkIHdpdGggcmVtb3ZlRXZlbnRMaXN0ZW5lciwgaWYgYWRkRXZlbnRMaXN0ZW5lciB3b3Jrc1xuICAgICAgaWYgKGRvY3VtZW50ICE9IG51bGwpIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5vbmZvY3VzID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjb21wb3NlSGFuZGxlcnMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb3NlSGFuZGxlcnMoaGFuZGxlcikge1xuICAgICAgaWYgKHRoaXMucHJvcHMuZGlzYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBoYW5kbGVyO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uRG9jdW1lbnREcm9wJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25Eb2N1bWVudERyb3AoZXZ0KSB7XG4gICAgICBpZiAodGhpcy5ub2RlICYmIHRoaXMubm9kZS5jb250YWlucyhldnQudGFyZ2V0KSkge1xuICAgICAgICAvLyBpZiB3ZSBpbnRlcmNlcHRlZCBhbiBldmVudCBmb3Igb3VyIGluc3RhbmNlLCBsZXQgaXQgcHJvcGFnYXRlIGRvd24gdG8gdGhlIGluc3RhbmNlJ3Mgb25Ecm9wIGhhbmRsZXJcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmRyYWdUYXJnZXRzID0gW107XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnb25EcmFnU3RhcnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbkRyYWdTdGFydChldnQpIHtcbiAgICAgIGlmICh0aGlzLnByb3BzLm9uRHJhZ1N0YXJ0KSB7XG4gICAgICAgIHRoaXMucHJvcHMub25EcmFnU3RhcnQuY2FsbCh0aGlzLCBldnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uRHJhZ0VudGVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25EcmFnRW50ZXIoZXZ0KSB7XG4gICAgICBldnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgLy8gQ291bnQgdGhlIGRyb3B6b25lIGFuZCBhbnkgY2hpbGRyZW4gdGhhdCBhcmUgZW50ZXJlZC5cbiAgICAgIGlmICh0aGlzLmRyYWdUYXJnZXRzLmluZGV4T2YoZXZ0LnRhcmdldCkgPT09IC0xKSB7XG4gICAgICAgIHRoaXMuZHJhZ1RhcmdldHMucHVzaChldnQudGFyZ2V0KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzRHJhZ0FjdGl2ZTogdHJ1ZSwgLy8gRG8gbm90IHJlbHkgb24gZmlsZXMgZm9yIHRoZSBkcmFnIHN0YXRlLiBJdCBkb2Vzbid0IHdvcmsgaW4gU2FmYXJpLlxuICAgICAgICBkcmFnZ2VkRmlsZXM6ICgwLCBfdXRpbHMuZ2V0RGF0YVRyYW5zZmVySXRlbXMpKGV2dClcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy5wcm9wcy5vbkRyYWdFbnRlcikge1xuICAgICAgICB0aGlzLnByb3BzLm9uRHJhZ0VudGVyLmNhbGwodGhpcywgZXZ0KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvbkRyYWdPdmVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25EcmFnT3ZlcihldnQpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xuICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGUgZmlsZSBkaWFsb2cgb24gQ2hyb21lIGFsbG93cyB1c2VycyB0byBkcmFnIGZpbGVzIGZyb20gdGhlIGRpYWxvZyBvbnRvXG4gICAgICAgIC8vIHRoZSBkcm9wem9uZSwgY2F1c2luZyB0aGUgYnJvd3NlciB0aGUgY3Jhc2ggd2hlbiB0aGUgZmlsZSBkaWFsb2cgaXMgY2xvc2VkLlxuICAgICAgICAvLyBBIGRyb3AgZWZmZWN0IG9mICdub25lJyBwcmV2ZW50cyB0aGUgZmlsZSBmcm9tIGJlaW5nIGRyb3BwZWRcbiAgICAgICAgZXZ0LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gdGhpcy5pc0ZpbGVEaWFsb2dBY3RpdmUgPyAnbm9uZScgOiAnY29weSc7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBjb250aW51ZSByZWdhcmRsZXNzIG9mIGVycm9yXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnByb3BzLm9uRHJhZ092ZXIpIHtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkRyYWdPdmVyLmNhbGwodGhpcywgZXZ0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvbkRyYWdMZWF2ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uRHJhZ0xlYXZlKGV2dCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAvLyBPbmx5IGRlYWN0aXZhdGUgb25jZSB0aGUgZHJvcHpvbmUgYW5kIGFsbCBjaGlsZHJlbiBoYXZlIGJlZW4gbGVmdC5cbiAgICAgIHRoaXMuZHJhZ1RhcmdldHMgPSB0aGlzLmRyYWdUYXJnZXRzLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgcmV0dXJuIGVsICE9PSBldnQudGFyZ2V0ICYmIF90aGlzMi5ub2RlLmNvbnRhaW5zKGVsKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMuZHJhZ1RhcmdldHMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFyIGRyYWdnaW5nIGZpbGVzIHN0YXRlXG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNEcmFnQWN0aXZlOiBmYWxzZSxcbiAgICAgICAgZHJhZ2dlZEZpbGVzOiBbXVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLnByb3BzLm9uRHJhZ0xlYXZlKSB7XG4gICAgICAgIHRoaXMucHJvcHMub25EcmFnTGVhdmUuY2FsbCh0aGlzLCBldnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uRHJvcCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uRHJvcChldnQpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBvbkRyb3AgPSBfcHJvcHMub25Ecm9wLFxuICAgICAgICAgIG9uRHJvcEFjY2VwdGVkID0gX3Byb3BzLm9uRHJvcEFjY2VwdGVkLFxuICAgICAgICAgIG9uRHJvcFJlamVjdGVkID0gX3Byb3BzLm9uRHJvcFJlamVjdGVkLFxuICAgICAgICAgIG11bHRpcGxlID0gX3Byb3BzLm11bHRpcGxlLFxuICAgICAgICAgIGRpc2FibGVQcmV2aWV3ID0gX3Byb3BzLmRpc2FibGVQcmV2aWV3LFxuICAgICAgICAgIGFjY2VwdCA9IF9wcm9wcy5hY2NlcHQ7XG5cbiAgICAgIHZhciBmaWxlTGlzdCA9ICgwLCBfdXRpbHMuZ2V0RGF0YVRyYW5zZmVySXRlbXMpKGV2dCk7XG4gICAgICB2YXIgYWNjZXB0ZWRGaWxlcyA9IFtdO1xuICAgICAgdmFyIHJlamVjdGVkRmlsZXMgPSBbXTtcblxuICAgICAgLy8gU3RvcCBkZWZhdWx0IGJyb3dzZXIgYmVoYXZpb3JcbiAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAvLyBSZXNldCB0aGUgY291bnRlciBhbG9uZyB3aXRoIHRoZSBkcmFnIG9uIGEgZHJvcC5cbiAgICAgIHRoaXMuZHJhZ1RhcmdldHMgPSBbXTtcbiAgICAgIHRoaXMuaXNGaWxlRGlhbG9nQWN0aXZlID0gZmFsc2U7XG5cbiAgICAgIGZpbGVMaXN0LmZvckVhY2goZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgaWYgKCFkaXNhYmxlUHJldmlldykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmaWxlLnByZXZpZXcgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGZhbHNlKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBnZW5lcmF0ZSBwcmV2aWV3IGZvciBmaWxlJywgZmlsZSwgZXJyKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCgwLCBfdXRpbHMuZmlsZUFjY2VwdGVkKShmaWxlLCBhY2NlcHQpICYmICgwLCBfdXRpbHMuZmlsZU1hdGNoU2l6ZSkoZmlsZSwgX3RoaXMzLnByb3BzLm1heFNpemUsIF90aGlzMy5wcm9wcy5taW5TaXplKSkge1xuICAgICAgICAgIGFjY2VwdGVkRmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3RlZEZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIW11bHRpcGxlKSB7XG4gICAgICAgIC8vIGlmIG5vdCBpbiBtdWx0aSBtb2RlIGFkZCBhbnkgZXh0cmEgYWNjZXB0ZWQgZmlsZXMgdG8gcmVqZWN0ZWQuXG4gICAgICAgIC8vIFRoaXMgd2lsbCBhbGxvdyBlbmQgdXNlcnMgdG8gZWFzaWx5IGlnbm9yZSBhIG11bHRpIGZpbGUgZHJvcCBpbiBcInNpbmdsZVwiIG1vZGUuXG4gICAgICAgIHJlamVjdGVkRmlsZXMucHVzaC5hcHBseShyZWplY3RlZEZpbGVzLCBfdG9Db25zdW1hYmxlQXJyYXkoYWNjZXB0ZWRGaWxlcy5zcGxpY2UoMSkpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9uRHJvcCkge1xuICAgICAgICBvbkRyb3AuY2FsbCh0aGlzLCBhY2NlcHRlZEZpbGVzLCByZWplY3RlZEZpbGVzLCBldnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVqZWN0ZWRGaWxlcy5sZW5ndGggPiAwICYmIG9uRHJvcFJlamVjdGVkKSB7XG4gICAgICAgIG9uRHJvcFJlamVjdGVkLmNhbGwodGhpcywgcmVqZWN0ZWRGaWxlcywgZXZ0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFjY2VwdGVkRmlsZXMubGVuZ3RoID4gMCAmJiBvbkRyb3BBY2NlcHRlZCkge1xuICAgICAgICBvbkRyb3BBY2NlcHRlZC5jYWxsKHRoaXMsIGFjY2VwdGVkRmlsZXMsIGV2dCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFyIGZpbGVzIHZhbHVlXG4gICAgICB0aGlzLmRyYWdnZWRGaWxlcyA9IG51bGw7XG5cbiAgICAgIC8vIFJlc2V0IGRyYWcgc3RhdGVcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc0RyYWdBY3RpdmU6IGZhbHNlLFxuICAgICAgICBkcmFnZ2VkRmlsZXM6IFtdLFxuICAgICAgICBhY2NlcHRlZEZpbGVzOiBhY2NlcHRlZEZpbGVzLFxuICAgICAgICByZWplY3RlZEZpbGVzOiByZWplY3RlZEZpbGVzXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvbkNsaWNrJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25DbGljayhldnQpIHtcbiAgICAgIHZhciBfcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBvbkNsaWNrID0gX3Byb3BzMi5vbkNsaWNrLFxuICAgICAgICAgIGRpc2FibGVDbGljayA9IF9wcm9wczIuZGlzYWJsZUNsaWNrO1xuXG4gICAgICBpZiAoIWRpc2FibGVDbGljaykge1xuICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgaWYgKG9uQ2xpY2spIHtcbiAgICAgICAgICBvbkNsaWNrLmNhbGwodGhpcywgZXZ0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGluIElFMTEvRWRnZSB0aGUgZmlsZS1icm93c2VyIGRpYWxvZyBpcyBibG9ja2luZywgZW5zdXJlIHRoaXMgaXMgYmVoaW5kIHNldFRpbWVvdXRcbiAgICAgICAgLy8gdGhpcyBpcyBzbyByZWFjdCBjYW4gaGFuZGxlIHN0YXRlIGNoYW5nZXMgaW4gdGhlIG9uQ2xpY2sgcHJvcCBhYm92ZSBhYm92ZVxuICAgICAgICAvLyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1kcm9wem9uZS9yZWFjdC1kcm9wem9uZS9pc3N1ZXMvNDUwXG4gICAgICAgIHNldFRpbWVvdXQodGhpcy5vcGVuLmJpbmQodGhpcyksIDApO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uSW5wdXRFbGVtZW50Q2xpY2snLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbklucHV0RWxlbWVudENsaWNrKGV2dCkge1xuICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgaWYgKHRoaXMucHJvcHMuaW5wdXRQcm9wcyAmJiB0aGlzLnByb3BzLmlucHV0UHJvcHMub25DbGljaykge1xuICAgICAgICB0aGlzLnByb3BzLmlucHV0UHJvcHMub25DbGljaygpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uRmlsZURpYWxvZ0NhbmNlbCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uRmlsZURpYWxvZ0NhbmNlbCgpIHtcbiAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgICAvLyB0aW1lb3V0IHdpbGwgbm90IHJlY29nbml6ZSBjb250ZXh0IG9mIHRoaXMgbWV0aG9kXG4gICAgICB2YXIgb25GaWxlRGlhbG9nQ2FuY2VsID0gdGhpcy5wcm9wcy5vbkZpbGVEaWFsb2dDYW5jZWw7XG4gICAgICAvLyBleGVjdXRlIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIEZpbGVEaWFsb2cgaXMgb3BlbmVkIGluIHRoZSBicm93c2VyXG5cbiAgICAgIGlmICh0aGlzLmlzRmlsZURpYWxvZ0FjdGl2ZSkge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoX3RoaXM0LmZpbGVJbnB1dEVsICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFJldHVybnMgYW4gb2JqZWN0IGFzIEZpbGVMaXN0XG4gICAgICAgICAgICB2YXIgZmlsZXMgPSBfdGhpczQuZmlsZUlucHV0RWwuZmlsZXM7XG5cblxuICAgICAgICAgICAgaWYgKCFmaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgX3RoaXM0LmlzRmlsZURpYWxvZ0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2Ygb25GaWxlRGlhbG9nQ2FuY2VsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBvbkZpbGVEaWFsb2dDYW5jZWwoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDMwMCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnc2V0UmVmJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0UmVmKHJlZikge1xuICAgICAgdGhpcy5ub2RlID0gcmVmO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3NldFJlZnMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRSZWZzKHJlZikge1xuICAgICAgdGhpcy5maWxlSW5wdXRFbCA9IHJlZjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogT3BlbiBzeXN0ZW0gZmlsZSB1cGxvYWQgZGlhbG9nLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdvcGVuJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb3BlbigpIHtcbiAgICAgIHRoaXMuaXNGaWxlRGlhbG9nQWN0aXZlID0gdHJ1ZTtcbiAgICAgIHRoaXMuZmlsZUlucHV0RWwudmFsdWUgPSBudWxsO1xuICAgICAgdGhpcy5maWxlSW5wdXRFbC5jbGljaygpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3JlbmRlcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfcHJvcHMzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBhY2NlcHQgPSBfcHJvcHMzLmFjY2VwdCxcbiAgICAgICAgICBhY2NlcHRDbGFzc05hbWUgPSBfcHJvcHMzLmFjY2VwdENsYXNzTmFtZSxcbiAgICAgICAgICBhY3RpdmVDbGFzc05hbWUgPSBfcHJvcHMzLmFjdGl2ZUNsYXNzTmFtZSxcbiAgICAgICAgICBjaGlsZHJlbiA9IF9wcm9wczMuY2hpbGRyZW4sXG4gICAgICAgICAgZGlzYWJsZWQgPSBfcHJvcHMzLmRpc2FibGVkLFxuICAgICAgICAgIGRpc2FibGVkQ2xhc3NOYW1lID0gX3Byb3BzMy5kaXNhYmxlZENsYXNzTmFtZSxcbiAgICAgICAgICBpbnB1dFByb3BzID0gX3Byb3BzMy5pbnB1dFByb3BzLFxuICAgICAgICAgIG11bHRpcGxlID0gX3Byb3BzMy5tdWx0aXBsZSxcbiAgICAgICAgICBuYW1lID0gX3Byb3BzMy5uYW1lLFxuICAgICAgICAgIHJlamVjdENsYXNzTmFtZSA9IF9wcm9wczMucmVqZWN0Q2xhc3NOYW1lLFxuICAgICAgICAgIHJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3Byb3BzMywgWydhY2NlcHQnLCAnYWNjZXB0Q2xhc3NOYW1lJywgJ2FjdGl2ZUNsYXNzTmFtZScsICdjaGlsZHJlbicsICdkaXNhYmxlZCcsICdkaXNhYmxlZENsYXNzTmFtZScsICdpbnB1dFByb3BzJywgJ211bHRpcGxlJywgJ25hbWUnLCAncmVqZWN0Q2xhc3NOYW1lJ10pO1xuXG4gICAgICB2YXIgYWNjZXB0U3R5bGUgPSByZXN0LmFjY2VwdFN0eWxlLFxuICAgICAgICAgIGFjdGl2ZVN0eWxlID0gcmVzdC5hY3RpdmVTdHlsZSxcbiAgICAgICAgICBfcmVzdCRjbGFzc05hbWUgPSByZXN0LmNsYXNzTmFtZSxcbiAgICAgICAgICBjbGFzc05hbWUgPSBfcmVzdCRjbGFzc05hbWUgPT09IHVuZGVmaW5lZCA/ICcnIDogX3Jlc3QkY2xhc3NOYW1lLFxuICAgICAgICAgIGRpc2FibGVkU3R5bGUgPSByZXN0LmRpc2FibGVkU3R5bGUsXG4gICAgICAgICAgcmVqZWN0U3R5bGUgPSByZXN0LnJlamVjdFN0eWxlLFxuICAgICAgICAgIHN0eWxlID0gcmVzdC5zdHlsZSxcbiAgICAgICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhyZXN0LCBbJ2FjY2VwdFN0eWxlJywgJ2FjdGl2ZVN0eWxlJywgJ2NsYXNzTmFtZScsICdkaXNhYmxlZFN0eWxlJywgJ3JlamVjdFN0eWxlJywgJ3N0eWxlJ10pO1xuXG4gICAgICB2YXIgX3N0YXRlID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgICBpc0RyYWdBY3RpdmUgPSBfc3RhdGUuaXNEcmFnQWN0aXZlLFxuICAgICAgICAgIGRyYWdnZWRGaWxlcyA9IF9zdGF0ZS5kcmFnZ2VkRmlsZXM7XG5cbiAgICAgIHZhciBmaWxlc0NvdW50ID0gZHJhZ2dlZEZpbGVzLmxlbmd0aDtcbiAgICAgIHZhciBpc011bHRpcGxlQWxsb3dlZCA9IG11bHRpcGxlIHx8IGZpbGVzQ291bnQgPD0gMTtcbiAgICAgIHZhciBpc0RyYWdBY2NlcHQgPSBmaWxlc0NvdW50ID4gMCAmJiAoMCwgX3V0aWxzLmFsbEZpbGVzQWNjZXB0ZWQpKGRyYWdnZWRGaWxlcywgdGhpcy5wcm9wcy5hY2NlcHQpO1xuICAgICAgdmFyIGlzRHJhZ1JlamVjdCA9IGZpbGVzQ291bnQgPiAwICYmICghaXNEcmFnQWNjZXB0IHx8ICFpc011bHRpcGxlQWxsb3dlZCk7XG4gICAgICB2YXIgbm9TdHlsZXMgPSAhY2xhc3NOYW1lICYmICFzdHlsZSAmJiAhYWN0aXZlU3R5bGUgJiYgIWFjY2VwdFN0eWxlICYmICFyZWplY3RTdHlsZSAmJiAhZGlzYWJsZWRTdHlsZTtcblxuICAgICAgaWYgKGlzRHJhZ0FjdGl2ZSAmJiBhY3RpdmVDbGFzc05hbWUpIHtcbiAgICAgICAgY2xhc3NOYW1lICs9ICcgJyArIGFjdGl2ZUNsYXNzTmFtZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0RyYWdBY2NlcHQgJiYgYWNjZXB0Q2xhc3NOYW1lKSB7XG4gICAgICAgIGNsYXNzTmFtZSArPSAnICcgKyBhY2NlcHRDbGFzc05hbWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNEcmFnUmVqZWN0ICYmIHJlamVjdENsYXNzTmFtZSkge1xuICAgICAgICBjbGFzc05hbWUgKz0gJyAnICsgcmVqZWN0Q2xhc3NOYW1lO1xuICAgICAgfVxuICAgICAgaWYgKGRpc2FibGVkICYmIGRpc2FibGVkQ2xhc3NOYW1lKSB7XG4gICAgICAgIGNsYXNzTmFtZSArPSAnICcgKyBkaXNhYmxlZENsYXNzTmFtZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vU3R5bGVzKSB7XG4gICAgICAgIHN0eWxlID0gX3N0eWxlczIuZGVmYXVsdC5kZWZhdWx0O1xuICAgICAgICBhY3RpdmVTdHlsZSA9IF9zdHlsZXMyLmRlZmF1bHQuYWN0aXZlO1xuICAgICAgICBhY2NlcHRTdHlsZSA9IHN0eWxlLmFjdGl2ZTtcbiAgICAgICAgcmVqZWN0U3R5bGUgPSBfc3R5bGVzMi5kZWZhdWx0LnJlamVjdGVkO1xuICAgICAgICBkaXNhYmxlZFN0eWxlID0gX3N0eWxlczIuZGVmYXVsdC5kaXNhYmxlZDtcbiAgICAgIH1cblxuICAgICAgdmFyIGFwcGxpZWRTdHlsZSA9IF9leHRlbmRzKHt9LCBzdHlsZSk7XG4gICAgICBpZiAoYWN0aXZlU3R5bGUgJiYgaXNEcmFnQWN0aXZlKSB7XG4gICAgICAgIGFwcGxpZWRTdHlsZSA9IF9leHRlbmRzKHt9LCBzdHlsZSwgYWN0aXZlU3R5bGUpO1xuICAgICAgfVxuICAgICAgaWYgKGFjY2VwdFN0eWxlICYmIGlzRHJhZ0FjY2VwdCkge1xuICAgICAgICBhcHBsaWVkU3R5bGUgPSBfZXh0ZW5kcyh7fSwgYXBwbGllZFN0eWxlLCBhY2NlcHRTdHlsZSk7XG4gICAgICB9XG4gICAgICBpZiAocmVqZWN0U3R5bGUgJiYgaXNEcmFnUmVqZWN0KSB7XG4gICAgICAgIGFwcGxpZWRTdHlsZSA9IF9leHRlbmRzKHt9LCBhcHBsaWVkU3R5bGUsIHJlamVjdFN0eWxlKTtcbiAgICAgIH1cbiAgICAgIGlmIChkaXNhYmxlZFN0eWxlICYmIGRpc2FibGVkKSB7XG4gICAgICAgIGFwcGxpZWRTdHlsZSA9IF9leHRlbmRzKHt9LCBzdHlsZSwgZGlzYWJsZWRTdHlsZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBpbnB1dEF0dHJpYnV0ZXMgPSB7XG4gICAgICAgIGFjY2VwdDogYWNjZXB0LFxuICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgIHR5cGU6ICdmaWxlJyxcbiAgICAgICAgc3R5bGU6IHsgZGlzcGxheTogJ25vbmUnIH0sXG4gICAgICAgIG11bHRpcGxlOiBfdXRpbHMuc3VwcG9ydE11bHRpcGxlICYmIG11bHRpcGxlLFxuICAgICAgICByZWY6IHRoaXMuc2V0UmVmcyxcbiAgICAgICAgb25DaGFuZ2U6IHRoaXMub25Ecm9wLFxuICAgICAgICBhdXRvQ29tcGxldGU6ICdvZmYnXG4gICAgICB9O1xuXG4gICAgICBpZiAobmFtZSAmJiBuYW1lLmxlbmd0aCkge1xuICAgICAgICBpbnB1dEF0dHJpYnV0ZXMubmFtZSA9IG5hbWU7XG4gICAgICB9XG5cbiAgICAgIC8vIERlc3RydWN0dXJlIGN1c3RvbSBwcm9wcyBhd2F5IGZyb20gcHJvcHMgdXNlZCBmb3IgdGhlIGRpdiBlbGVtZW50XG5cbiAgICAgIHZhciBhY2NlcHRlZEZpbGVzID0gcHJvcHMuYWNjZXB0ZWRGaWxlcyxcbiAgICAgICAgICBwcmV2ZW50RHJvcE9uRG9jdW1lbnQgPSBwcm9wcy5wcmV2ZW50RHJvcE9uRG9jdW1lbnQsXG4gICAgICAgICAgZGlzYWJsZVByZXZpZXcgPSBwcm9wcy5kaXNhYmxlUHJldmlldyxcbiAgICAgICAgICBkaXNhYmxlQ2xpY2sgPSBwcm9wcy5kaXNhYmxlQ2xpY2ssXG4gICAgICAgICAgb25Ecm9wQWNjZXB0ZWQgPSBwcm9wcy5vbkRyb3BBY2NlcHRlZCxcbiAgICAgICAgICBvbkRyb3BSZWplY3RlZCA9IHByb3BzLm9uRHJvcFJlamVjdGVkLFxuICAgICAgICAgIG9uRmlsZURpYWxvZ0NhbmNlbCA9IHByb3BzLm9uRmlsZURpYWxvZ0NhbmNlbCxcbiAgICAgICAgICBtYXhTaXplID0gcHJvcHMubWF4U2l6ZSxcbiAgICAgICAgICBtaW5TaXplID0gcHJvcHMubWluU2l6ZSxcbiAgICAgICAgICBkaXZQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgWydhY2NlcHRlZEZpbGVzJywgJ3ByZXZlbnREcm9wT25Eb2N1bWVudCcsICdkaXNhYmxlUHJldmlldycsICdkaXNhYmxlQ2xpY2snLCAnb25Ecm9wQWNjZXB0ZWQnLCAnb25Ecm9wUmVqZWN0ZWQnLCAnb25GaWxlRGlhbG9nQ2FuY2VsJywgJ21heFNpemUnLCAnbWluU2l6ZSddKTtcblxuICAgICAgcmV0dXJuIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnZGl2JyxcbiAgICAgICAgX2V4dGVuZHMoe1xuICAgICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgICAgIHN0eWxlOiBhcHBsaWVkU3R5bGVcbiAgICAgICAgfSwgZGl2UHJvcHMgLyogZXhwYW5kIHVzZXIgcHJvdmlkZWQgcHJvcHMgZmlyc3Qgc28gZXZlbnQgaGFuZGxlcnMgYXJlIG5ldmVyIG92ZXJyaWRkZW4gKi8sIHtcbiAgICAgICAgICBvbkNsaWNrOiB0aGlzLmNvbXBvc2VIYW5kbGVycyh0aGlzLm9uQ2xpY2spLFxuICAgICAgICAgIG9uRHJhZ1N0YXJ0OiB0aGlzLmNvbXBvc2VIYW5kbGVycyh0aGlzLm9uRHJhZ1N0YXJ0KSxcbiAgICAgICAgICBvbkRyYWdFbnRlcjogdGhpcy5jb21wb3NlSGFuZGxlcnModGhpcy5vbkRyYWdFbnRlciksXG4gICAgICAgICAgb25EcmFnT3ZlcjogdGhpcy5jb21wb3NlSGFuZGxlcnModGhpcy5vbkRyYWdPdmVyKSxcbiAgICAgICAgICBvbkRyYWdMZWF2ZTogdGhpcy5jb21wb3NlSGFuZGxlcnModGhpcy5vbkRyYWdMZWF2ZSksXG4gICAgICAgICAgb25Ecm9wOiB0aGlzLmNvbXBvc2VIYW5kbGVycyh0aGlzLm9uRHJvcCksXG4gICAgICAgICAgcmVmOiB0aGlzLnNldFJlZixcbiAgICAgICAgICAnYXJpYS1kaXNhYmxlZCc6IGRpc2FibGVkXG4gICAgICAgIH0pLFxuICAgICAgICB0aGlzLnJlbmRlckNoaWxkcmVuKGNoaWxkcmVuLCBpc0RyYWdBY3RpdmUsIGlzRHJhZ0FjY2VwdCwgaXNEcmFnUmVqZWN0KSxcbiAgICAgICAgX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JywgX2V4dGVuZHMoe30sIGlucHV0UHJvcHMgLyogZXhwYW5kIHVzZXIgcHJvdmlkZWQgaW5wdXRQcm9wcyBmaXJzdCBzbyBpbnB1dEF0dHJpYnV0ZXMgb3ZlcnJpZGUgdGhlbSAqLywgaW5wdXRBdHRyaWJ1dGVzKSlcbiAgICAgICk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIERyb3B6b25lO1xufShfcmVhY3QyLmRlZmF1bHQuQ29tcG9uZW50KTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gRHJvcHpvbmU7XG5cblxuRHJvcHpvbmUucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQWxsb3cgc3BlY2lmaWMgdHlwZXMgb2YgZmlsZXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vb2tvbmV0L2F0dHItYWNjZXB0IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKiBLZWVwIGluIG1pbmQgdGhhdCBtaW1lIHR5cGUgZGV0ZXJtaW5hdGlvbiBpcyBub3QgcmVsaWFibGUgYWNyb3NzIHBsYXRmb3Jtcy4gQ1NWIGZpbGVzLFxuICAgKiBmb3IgZXhhbXBsZSwgYXJlIHJlcG9ydGVkIGFzIHRleHQvcGxhaW4gdW5kZXIgbWFjT1MgYnV0IGFzIGFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCB1bmRlclxuICAgKiBXaW5kb3dzLiBJbiBzb21lIGNhc2VzIHRoZXJlIG1pZ2h0IG5vdCBiZSBhIG1pbWUgdHlwZSBzZXQgYXQgYWxsLlxuICAgKiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1kcm9wem9uZS9yZWFjdC1kcm9wem9uZS9pc3N1ZXMvMjc2XG4gICAqL1xuICBhY2NlcHQ6IF9wcm9wVHlwZXMyLmRlZmF1bHQuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBDb250ZW50cyBvZiB0aGUgZHJvcHpvbmVcbiAgICovXG4gIGNoaWxkcmVuOiBfcHJvcFR5cGVzMi5kZWZhdWx0Lm9uZU9mVHlwZShbX3Byb3BUeXBlczIuZGVmYXVsdC5ub2RlLCBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmNdKSxcblxuICAvKipcbiAgICogRGlzYWxsb3cgY2xpY2tpbmcgb24gdGhlIGRyb3B6b25lIGNvbnRhaW5lciB0byBvcGVuIGZpbGUgZGlhbG9nXG4gICAqL1xuICBkaXNhYmxlQ2xpY2s6IF9wcm9wVHlwZXMyLmRlZmF1bHQuYm9vbCxcblxuICAvKipcbiAgICogRW5hYmxlL2Rpc2FibGUgdGhlIGRyb3B6b25lIGVudGlyZWx5XG4gICAqL1xuICBkaXNhYmxlZDogX3Byb3BUeXBlczIuZGVmYXVsdC5ib29sLFxuXG4gIC8qKlxuICAgKiBFbmFibGUvZGlzYWJsZSBwcmV2aWV3IGdlbmVyYXRpb25cbiAgICovXG4gIGRpc2FibGVQcmV2aWV3OiBfcHJvcFR5cGVzMi5kZWZhdWx0LmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIGZhbHNlLCBhbGxvdyBkcm9wcGVkIGl0ZW1zIHRvIHRha2Ugb3ZlciB0aGUgY3VycmVudCBicm93c2VyIHdpbmRvd1xuICAgKi9cbiAgcHJldmVudERyb3BPbkRvY3VtZW50OiBfcHJvcFR5cGVzMi5kZWZhdWx0LmJvb2wsXG5cbiAgLyoqXG4gICAqIFBhc3MgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIHRvIHRoZSBgPGlucHV0IHR5cGU9XCJmaWxlXCIvPmAgdGFnXG4gICAqL1xuICBpbnB1dFByb3BzOiBfcHJvcFR5cGVzMi5kZWZhdWx0Lm9iamVjdCxcblxuICAvKipcbiAgICogQWxsb3cgZHJvcHBpbmcgbXVsdGlwbGUgZmlsZXNcbiAgICovXG4gIG11bHRpcGxlOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmJvb2wsXG5cbiAgLyoqXG4gICAqIGBuYW1lYCBhdHRyaWJ1dGUgZm9yIHRoZSBpbnB1dCB0YWdcbiAgICovXG4gIG5hbWU6IF9wcm9wVHlwZXMyLmRlZmF1bHQuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBNYXhpbXVtIGZpbGUgc2l6ZSAoaW4gYnl0ZXMpXG4gICAqL1xuICBtYXhTaXplOiBfcHJvcFR5cGVzMi5kZWZhdWx0Lm51bWJlcixcblxuICAvKipcbiAgICogTWluaW11bSBmaWxlIHNpemUgKGluIGJ5dGVzKVxuICAgKi9cbiAgbWluU2l6ZTogX3Byb3BUeXBlczIuZGVmYXVsdC5udW1iZXIsXG5cbiAgLyoqXG4gICAqIGNsYXNzTmFtZVxuICAgKi9cbiAgY2xhc3NOYW1lOiBfcHJvcFR5cGVzMi5kZWZhdWx0LnN0cmluZyxcblxuICAvKipcbiAgICogY2xhc3NOYW1lIGZvciBhY3RpdmUgc3RhdGVcbiAgICovXG4gIGFjdGl2ZUNsYXNzTmFtZTogX3Byb3BUeXBlczIuZGVmYXVsdC5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIGNsYXNzTmFtZSBmb3IgYWNjZXB0ZWQgc3RhdGVcbiAgICovXG4gIGFjY2VwdENsYXNzTmFtZTogX3Byb3BUeXBlczIuZGVmYXVsdC5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIGNsYXNzTmFtZSBmb3IgcmVqZWN0ZWQgc3RhdGVcbiAgICovXG4gIHJlamVjdENsYXNzTmFtZTogX3Byb3BUeXBlczIuZGVmYXVsdC5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIGNsYXNzTmFtZSBmb3IgZGlzYWJsZWQgc3RhdGVcbiAgICovXG4gIGRpc2FibGVkQ2xhc3NOYW1lOiBfcHJvcFR5cGVzMi5kZWZhdWx0LnN0cmluZyxcblxuICAvKipcbiAgICogQ1NTIHN0eWxlcyB0byBhcHBseVxuICAgKi9cbiAgc3R5bGU6IF9wcm9wVHlwZXMyLmRlZmF1bHQub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBDU1Mgc3R5bGVzIHRvIGFwcGx5IHdoZW4gZHJhZyBpcyBhY3RpdmVcbiAgICovXG4gIGFjdGl2ZVN0eWxlOiBfcHJvcFR5cGVzMi5kZWZhdWx0Lm9iamVjdCxcblxuICAvKipcbiAgICogQ1NTIHN0eWxlcyB0byBhcHBseSB3aGVuIGRyb3Agd2lsbCBiZSBhY2NlcHRlZFxuICAgKi9cbiAgYWNjZXB0U3R5bGU6IF9wcm9wVHlwZXMyLmRlZmF1bHQub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBDU1Mgc3R5bGVzIHRvIGFwcGx5IHdoZW4gZHJvcCB3aWxsIGJlIHJlamVjdGVkXG4gICAqL1xuICByZWplY3RTdHlsZTogX3Byb3BUeXBlczIuZGVmYXVsdC5vYmplY3QsXG5cbiAgLyoqXG4gICAqIENTUyBzdHlsZXMgdG8gYXBwbHkgd2hlbiBkcm9wem9uZSBpcyBkaXNhYmxlZFxuICAgKi9cbiAgZGlzYWJsZWRTdHlsZTogX3Byb3BUeXBlczIuZGVmYXVsdC5vYmplY3QsXG5cbiAgLyoqXG4gICAqIG9uQ2xpY2sgY2FsbGJhY2tcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICovXG4gIG9uQ2xpY2s6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxcblxuICAvKipcbiAgICogb25Ecm9wIGNhbGxiYWNrXG4gICAqL1xuICBvbkRyb3A6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxcblxuICAvKipcbiAgICogb25Ecm9wQWNjZXB0ZWQgY2FsbGJhY2tcbiAgICovXG4gIG9uRHJvcEFjY2VwdGVkOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMsXG5cbiAgLyoqXG4gICAqIG9uRHJvcFJlamVjdGVkIGNhbGxiYWNrXG4gICAqL1xuICBvbkRyb3BSZWplY3RlZDogX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jLFxuXG4gIC8qKlxuICAgKiBvbkRyYWdTdGFydCBjYWxsYmFja1xuICAgKi9cbiAgb25EcmFnU3RhcnQ6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxcblxuICAvKipcbiAgICogb25EcmFnRW50ZXIgY2FsbGJhY2tcbiAgICovXG4gIG9uRHJhZ0VudGVyOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMsXG5cbiAgLyoqXG4gICAqIG9uRHJhZ092ZXIgY2FsbGJhY2tcbiAgICovXG4gIG9uRHJhZ092ZXI6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxcblxuICAvKipcbiAgICogb25EcmFnTGVhdmUgY2FsbGJhY2tcbiAgICovXG4gIG9uRHJhZ0xlYXZlOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMsXG5cbiAgLyoqXG4gICAqIFByb3ZpZGUgYSBjYWxsYmFjayBvbiBjbGlja2luZyB0aGUgY2FuY2VsIGJ1dHRvbiBvZiB0aGUgZmlsZSBkaWFsb2dcbiAgICovXG4gIG9uRmlsZURpYWxvZ0NhbmNlbDogX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jXG59O1xuXG5Ecm9wem9uZS5kZWZhdWx0UHJvcHMgPSB7XG4gIHByZXZlbnREcm9wT25Eb2N1bWVudDogdHJ1ZSxcbiAgZGlzYWJsZWQ6IGZhbHNlLFxuICBkaXNhYmxlUHJldmlldzogZmFsc2UsXG4gIGRpc2FibGVDbGljazogZmFsc2UsXG4gIG11bHRpcGxlOiB0cnVlLFxuICBtYXhTaXplOiBJbmZpbml0eSxcbiAgbWluU2l6ZTogMFxufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzFfXztcblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8yX187XG5cbi8qKiovIH0pLFxuLyogMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5zdXBwb3J0TXVsdGlwbGUgPSB1bmRlZmluZWQ7XG5leHBvcnRzLmdldERhdGFUcmFuc2Zlckl0ZW1zID0gZ2V0RGF0YVRyYW5zZmVySXRlbXM7XG5leHBvcnRzLmZpbGVBY2NlcHRlZCA9IGZpbGVBY2NlcHRlZDtcbmV4cG9ydHMuZmlsZU1hdGNoU2l6ZSA9IGZpbGVNYXRjaFNpemU7XG5leHBvcnRzLmFsbEZpbGVzQWNjZXB0ZWQgPSBhbGxGaWxlc0FjY2VwdGVkO1xuZXhwb3J0cy5vbkRvY3VtZW50RHJhZ092ZXIgPSBvbkRvY3VtZW50RHJhZ092ZXI7XG5cbnZhciBfYXR0ckFjY2VwdCA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG5cbnZhciBfYXR0ckFjY2VwdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hdHRyQWNjZXB0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIHN1cHBvcnRNdWx0aXBsZSA9IGV4cG9ydHMuc3VwcG9ydE11bHRpcGxlID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudCAmJiBkb2N1bWVudC5jcmVhdGVFbGVtZW50ID8gJ211bHRpcGxlJyBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpIDogdHJ1ZTtcblxuZnVuY3Rpb24gZ2V0RGF0YVRyYW5zZmVySXRlbXMoZXZlbnQpIHtcbiAgdmFyIGRhdGFUcmFuc2Zlckl0ZW1zTGlzdCA9IFtdO1xuICBpZiAoZXZlbnQuZGF0YVRyYW5zZmVyKSB7XG4gICAgdmFyIGR0ID0gZXZlbnQuZGF0YVRyYW5zZmVyO1xuICAgIGlmIChkdC5maWxlcyAmJiBkdC5maWxlcy5sZW5ndGgpIHtcbiAgICAgIGRhdGFUcmFuc2Zlckl0ZW1zTGlzdCA9IGR0LmZpbGVzO1xuICAgIH0gZWxzZSBpZiAoZHQuaXRlbXMgJiYgZHQuaXRlbXMubGVuZ3RoKSB7XG4gICAgICAvLyBEdXJpbmcgdGhlIGRyYWcgZXZlbiB0aGUgZGF0YVRyYW5zZmVyLmZpbGVzIGlzIG51bGxcbiAgICAgIC8vIGJ1dCBDaHJvbWUgaW1wbGVtZW50cyBzb21lIGRyYWcgc3RvcmUsIHdoaWNoIGlzIGFjY2VzaWJsZSB2aWEgZGF0YVRyYW5zZmVyLml0ZW1zXG4gICAgICBkYXRhVHJhbnNmZXJJdGVtc0xpc3QgPSBkdC5pdGVtcztcbiAgICB9XG4gIH0gZWxzZSBpZiAoZXZlbnQudGFyZ2V0ICYmIGV2ZW50LnRhcmdldC5maWxlcykge1xuICAgIGRhdGFUcmFuc2Zlckl0ZW1zTGlzdCA9IGV2ZW50LnRhcmdldC5maWxlcztcbiAgfVxuICAvLyBDb252ZXJ0IGZyb20gRGF0YVRyYW5zZmVySXRlbXNMaXN0IHRvIHRoZSBuYXRpdmUgQXJyYXlcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRhdGFUcmFuc2Zlckl0ZW1zTGlzdCk7XG59XG5cbi8vIEZpcmVmb3ggdmVyc2lvbnMgcHJpb3IgdG8gNTMgcmV0dXJuIGEgYm9ndXMgTUlNRSB0eXBlIGZvciBldmVyeSBmaWxlIGRyYWcsIHNvIGRyYWdvdmVycyB3aXRoXG4vLyB0aGF0IE1JTUUgdHlwZSB3aWxsIGFsd2F5cyBiZSBhY2NlcHRlZFxuZnVuY3Rpb24gZmlsZUFjY2VwdGVkKGZpbGUsIGFjY2VwdCkge1xuICByZXR1cm4gZmlsZS50eXBlID09PSAnYXBwbGljYXRpb24veC1tb3otZmlsZScgfHwgKDAsIF9hdHRyQWNjZXB0Mi5kZWZhdWx0KShmaWxlLCBhY2NlcHQpO1xufVxuXG5mdW5jdGlvbiBmaWxlTWF0Y2hTaXplKGZpbGUsIG1heFNpemUsIG1pblNpemUpIHtcbiAgcmV0dXJuIGZpbGUuc2l6ZSA8PSBtYXhTaXplICYmIGZpbGUuc2l6ZSA+PSBtaW5TaXplO1xufVxuXG5mdW5jdGlvbiBhbGxGaWxlc0FjY2VwdGVkKGZpbGVzLCBhY2NlcHQpIHtcbiAgcmV0dXJuIGZpbGVzLmV2ZXJ5KGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgcmV0dXJuIGZpbGVBY2NlcHRlZChmaWxlLCBhY2NlcHQpO1xuICB9KTtcbn1cblxuLy8gYWxsb3cgdGhlIGVudGlyZSBkb2N1bWVudCB0byBiZSBhIGRyYWcgdGFyZ2V0XG5mdW5jdGlvbiBvbkRvY3VtZW50RHJhZ092ZXIoZXZ0KSB7XG4gIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xufVxuXG4vKioqLyB9KSxcbi8qIDQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihlKXtpZihyW2VdKXJldHVybiByW2VdLmV4cG9ydHM7dmFyIG89cltlXT17ZXhwb3J0czp7fSxpZDplLGxvYWRlZDohMX07cmV0dXJuIHRbZV0uY2FsbChvLmV4cG9ydHMsbyxvLmV4cG9ydHMsbiksby5sb2FkZWQ9ITAsby5leHBvcnRzfXZhciByPXt9O3JldHVybiBuLm09dCxuLmM9cixuLnA9XCJcIixuKDApfShbZnVuY3Rpb24odCxuLHIpe1widXNlIHN0cmljdFwiO24uX19lc01vZHVsZT0hMCxyKDgpLHIoOSksbltcImRlZmF1bHRcIl09ZnVuY3Rpb24odCxuKXtpZih0JiZuKXt2YXIgcj1mdW5jdGlvbigpe3ZhciByPUFycmF5LmlzQXJyYXkobik/bjpuLnNwbGl0KFwiLFwiKSxlPXQubmFtZXx8XCJcIixvPXQudHlwZXx8XCJcIixpPW8ucmVwbGFjZSgvXFwvLiokLyxcIlwiKTtyZXR1cm57djpyLnNvbWUoZnVuY3Rpb24odCl7dmFyIG49dC50cmltKCk7cmV0dXJuXCIuXCI9PT1uLmNoYXJBdCgwKT9lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgobi50b0xvd2VyQ2FzZSgpKTovXFwvXFwqJC8udGVzdChuKT9pPT09bi5yZXBsYWNlKC9cXC8uKiQvLFwiXCIpOm89PT1ufSl9fSgpO2lmKFwib2JqZWN0XCI9PXR5cGVvZiByKXJldHVybiByLnZ9cmV0dXJuITB9LHQuZXhwb3J0cz1uW1wiZGVmYXVsdFwiXX0sZnVuY3Rpb24odCxuKXt2YXIgcj10LmV4cG9ydHM9e3ZlcnNpb246XCIxLjIuMlwifTtcIm51bWJlclwiPT10eXBlb2YgX19lJiYoX19lPXIpfSxmdW5jdGlvbih0LG4pe3ZhciByPXQuZXhwb3J0cz1cInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cuTWF0aD09TWF0aD93aW5kb3c6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGYmJnNlbGYuTWF0aD09TWF0aD9zZWxmOkZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcIm51bWJlclwiPT10eXBlb2YgX19nJiYoX19nPXIpfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigyKSxvPXIoMSksaT1yKDQpLHU9cigxOSksYz1cInByb3RvdHlwZVwiLGY9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShuLGFyZ3VtZW50cyl9fSxzPWZ1bmN0aW9uKHQsbixyKXt2YXIgYSxwLGwseSxkPXQmcy5HLGg9dCZzLlAsdj1kP2U6dCZzLlM/ZVtuXXx8KGVbbl09e30pOihlW25dfHx7fSlbY10seD1kP286b1tuXXx8KG9bbl09e30pO2QmJihyPW4pO2ZvcihhIGluIHIpcD0hKHQmcy5GKSYmdiYmYSBpbiB2LGw9KHA/djpyKVthXSx5PXQmcy5CJiZwP2YobCxlKTpoJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBsP2YoRnVuY3Rpb24uY2FsbCxsKTpsLHYmJiFwJiZ1KHYsYSxsKSx4W2FdIT1sJiZpKHgsYSx5KSxoJiYoKHhbY118fCh4W2NdPXt9KSlbYV09bCl9O2UuY29yZT1vLHMuRj0xLHMuRz0yLHMuUz00LHMuUD04LHMuQj0xNixzLlc9MzIsdC5leHBvcnRzPXN9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDUpLG89cigxOCk7dC5leHBvcnRzPXIoMjIpP2Z1bmN0aW9uKHQsbixyKXtyZXR1cm4gZS5zZXREZXNjKHQsbixvKDEscikpfTpmdW5jdGlvbih0LG4scil7cmV0dXJuIHRbbl09cix0fX0sZnVuY3Rpb24odCxuKXt2YXIgcj1PYmplY3Q7dC5leHBvcnRzPXtjcmVhdGU6ci5jcmVhdGUsZ2V0UHJvdG86ci5nZXRQcm90b3R5cGVPZixpc0VudW06e30ucHJvcGVydHlJc0VudW1lcmFibGUsZ2V0RGVzYzpyLmdldE93blByb3BlcnR5RGVzY3JpcHRvcixzZXREZXNjOnIuZGVmaW5lUHJvcGVydHksc2V0RGVzY3M6ci5kZWZpbmVQcm9wZXJ0aWVzLGdldEtleXM6ci5rZXlzLGdldE5hbWVzOnIuZ2V0T3duUHJvcGVydHlOYW1lcyxnZXRTeW1ib2xzOnIuZ2V0T3duUHJvcGVydHlTeW1ib2xzLGVhY2g6W10uZm9yRWFjaH19LGZ1bmN0aW9uKHQsbil7dmFyIHI9MCxlPU1hdGgucmFuZG9tKCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVyblwiU3ltYm9sKFwiLmNvbmNhdCh2b2lkIDA9PT10P1wiXCI6dCxcIilfXCIsKCsrcitlKS50b1N0cmluZygzNikpfX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMjApKFwid2tzXCIpLG89cigyKS5TeW1ib2w7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfHwoZVt0XT1vJiZvW3RdfHwob3x8cig2KSkoXCJTeW1ib2wuXCIrdCkpfX0sZnVuY3Rpb24odCxuLHIpe3IoMjYpLHQuZXhwb3J0cz1yKDEpLkFycmF5LnNvbWV9LGZ1bmN0aW9uKHQsbixyKXtyKDI1KSx0LmV4cG9ydHM9cigxKS5TdHJpbmcuZW5kc1dpdGh9LGZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIHQpdGhyb3cgVHlwZUVycm9yKHQrXCIgaXMgbm90IGEgZnVuY3Rpb24hXCIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxuKXt2YXIgcj17fS50b1N0cmluZzt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHIuY2FsbCh0KS5zbGljZSg4LC0xKX19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDEwKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxuLHIpe2lmKGUodCksdm9pZCAwPT09bilyZXR1cm4gdDtzd2l0Y2gocil7Y2FzZSAxOnJldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gdC5jYWxsKG4scil9O2Nhc2UgMjpyZXR1cm4gZnVuY3Rpb24ocixlKXtyZXR1cm4gdC5jYWxsKG4scixlKX07Y2FzZSAzOnJldHVybiBmdW5jdGlvbihyLGUsbyl7cmV0dXJuIHQuY2FsbChuLHIsZSxvKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkobixhcmd1bWVudHMpfX19LGZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09dCl0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgXCIrdCk7cmV0dXJuIHR9fSxmdW5jdGlvbih0LG4scil7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBuPS8uLzt0cnl7XCIvLi9cIlt0XShuKX1jYXRjaChlKXt0cnl7cmV0dXJuIG5bcig3KShcIm1hdGNoXCIpXT0hMSwhXCIvLi9cIlt0XShuKX1jYXRjaChvKXt9fXJldHVybiEwfX0sZnVuY3Rpb24odCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiEhdCgpfWNhdGNoKG4pe3JldHVybiEwfX19LGZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVyblwib2JqZWN0XCI9PXR5cGVvZiB0P251bGwhPT10OlwiZnVuY3Rpb25cIj09dHlwZW9mIHR9fSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigxNiksbz1yKDExKSxpPXIoNykoXCJtYXRjaFwiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIG47cmV0dXJuIGUodCkmJih2b2lkIDAhPT0obj10W2ldKT8hIW46XCJSZWdFeHBcIj09byh0KSl9fSxmdW5jdGlvbih0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbih0LG4pe3JldHVybntlbnVtZXJhYmxlOiEoMSZ0KSxjb25maWd1cmFibGU6ISgyJnQpLHdyaXRhYmxlOiEoNCZ0KSx2YWx1ZTpufX19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDIpLG89cig0KSxpPXIoNikoXCJzcmNcIiksdT1cInRvU3RyaW5nXCIsYz1GdW5jdGlvblt1XSxmPShcIlwiK2MpLnNwbGl0KHUpO3IoMSkuaW5zcGVjdFNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gYy5jYWxsKHQpfSwodC5leHBvcnRzPWZ1bmN0aW9uKHQsbixyLHUpe1wiZnVuY3Rpb25cIj09dHlwZW9mIHImJihvKHIsaSx0W25dP1wiXCIrdFtuXTpmLmpvaW4oU3RyaW5nKG4pKSksXCJuYW1lXCJpbiByfHwoci5uYW1lPW4pKSx0PT09ZT90W25dPXI6KHV8fGRlbGV0ZSB0W25dLG8odCxuLHIpKX0pKEZ1bmN0aW9uLnByb3RvdHlwZSx1LGZ1bmN0aW9uKCl7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcyYmdGhpc1tpXXx8Yy5jYWxsKHRoaXMpfSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDIpLG89XCJfX2NvcmUtanNfc2hhcmVkX19cIixpPWVbb118fChlW29dPXt9KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGlbdF18fChpW3RdPXt9KX19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDE3KSxvPXIoMTMpO3QuZXhwb3J0cz1mdW5jdGlvbih0LG4scil7aWYoZShuKSl0aHJvdyBUeXBlRXJyb3IoXCJTdHJpbmcjXCIrcitcIiBkb2Vzbid0IGFjY2VwdCByZWdleCFcIik7cmV0dXJuIFN0cmluZyhvKHQpKX19LGZ1bmN0aW9uKHQsbixyKXt0LmV4cG9ydHM9IXIoMTUpKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSxcImFcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSkuYX0pfSxmdW5jdGlvbih0LG4pe3ZhciByPU1hdGguY2VpbCxlPU1hdGguZmxvb3I7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpc05hTih0PSt0KT8wOih0PjA/ZTpyKSh0KX19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDIzKSxvPU1hdGgubWluO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdD4wP28oZSh0KSw5MDA3MTk5MjU0NzQwOTkxKTowfX0sZnVuY3Rpb24odCxuLHIpe1widXNlIHN0cmljdFwiO3ZhciBlPXIoMyksbz1yKDI0KSxpPXIoMjEpLHU9XCJlbmRzV2l0aFwiLGM9XCJcIlt1XTtlKGUuUCtlLkYqcigxNCkodSksXCJTdHJpbmdcIix7ZW5kc1dpdGg6ZnVuY3Rpb24odCl7dmFyIG49aSh0aGlzLHQsdSkscj1hcmd1bWVudHMsZT1yLmxlbmd0aD4xP3JbMV06dm9pZCAwLGY9byhuLmxlbmd0aCkscz12b2lkIDA9PT1lP2Y6TWF0aC5taW4obyhlKSxmKSxhPVN0cmluZyh0KTtyZXR1cm4gYz9jLmNhbGwobixhLHMpOm4uc2xpY2Uocy1hLmxlbmd0aCxzKT09PWF9fSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDUpLG89cigzKSxpPXIoMSkuQXJyYXl8fEFycmF5LHU9e30sYz1mdW5jdGlvbih0LG4pe2UuZWFjaC5jYWxsKHQuc3BsaXQoXCIsXCIpLGZ1bmN0aW9uKHQpe3ZvaWQgMD09biYmdCBpbiBpP3VbdF09aVt0XTp0IGluW10mJih1W3RdPXIoMTIpKEZ1bmN0aW9uLmNhbGwsW11bdF0sbikpfSl9O2MoXCJwb3AscmV2ZXJzZSxzaGlmdCxrZXlzLHZhbHVlcyxlbnRyaWVzXCIsMSksYyhcImluZGV4T2YsZXZlcnksc29tZSxmb3JFYWNoLG1hcCxmaWx0ZXIsZmluZCxmaW5kSW5kZXgsaW5jbHVkZXNcIiwzKSxjKFwiam9pbixzbGljZSxjb25jYXQscHVzaCxzcGxpY2UsdW5zaGlmdCxzb3J0LGxhc3RJbmRleE9mLHJlZHVjZSxyZWR1Y2VSaWdodCxjb3B5V2l0aGluLGZpbGxcIiksbyhvLlMsXCJBcnJheVwiLHUpfV0pO1xuXG4vKioqLyB9KSxcbi8qIDUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgcmVqZWN0ZWQ6IHtcbiAgICBib3JkZXJTdHlsZTogJ3NvbGlkJyxcbiAgICBib3JkZXJDb2xvcjogJyNjNjYnLFxuICAgIGJhY2tncm91bmRDb2xvcjogJyNlZWUnXG4gIH0sXG4gIGRpc2FibGVkOiB7XG4gICAgb3BhY2l0eTogMC41XG4gIH0sXG4gIGFjdGl2ZToge1xuICAgIGJvcmRlclN0eWxlOiAnc29saWQnLFxuICAgIGJvcmRlckNvbG9yOiAnIzZjNicsXG4gICAgYmFja2dyb3VuZENvbG9yOiAnI2VlZSdcbiAgfSxcbiAgZGVmYXVsdDoge1xuICAgIHdpZHRoOiAyMDAsXG4gICAgaGVpZ2h0OiAyMDAsXG4gICAgYm9yZGVyV2lkdGg6IDIsXG4gICAgYm9yZGVyQ29sb3I6ICcjNjY2JyxcbiAgICBib3JkZXJTdHlsZTogJ2Rhc2hlZCcsXG4gICAgYm9yZGVyUmFkaXVzOiA1XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSlcbi8qKioqKiovIF0pO1xufSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGluZGV4LmpzIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgNjA0YjdkZTAyYWFjNDI4OWFjNzciLCIvKiBlc2xpbnQgcHJlZmVyLXRlbXBsYXRlOiAwICovXG5cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcydcbmltcG9ydCB7XG4gIHN1cHBvcnRNdWx0aXBsZSxcbiAgZmlsZUFjY2VwdGVkLFxuICBhbGxGaWxlc0FjY2VwdGVkLFxuICBmaWxlTWF0Y2hTaXplLFxuICBvbkRvY3VtZW50RHJhZ092ZXIsXG4gIGdldERhdGFUcmFuc2Zlckl0ZW1zXG59IGZyb20gJy4vdXRpbHMnXG5pbXBvcnQgc3R5bGVzIGZyb20gJy4vdXRpbHMvc3R5bGVzJ1xuXG5jbGFzcyBEcm9wem9uZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzLCBjb250ZXh0KSB7XG4gICAgc3VwZXIocHJvcHMsIGNvbnRleHQpXG4gICAgdGhpcy5jb21wb3NlSGFuZGxlcnMgPSB0aGlzLmNvbXBvc2VIYW5kbGVycy5iaW5kKHRoaXMpXG4gICAgdGhpcy5vbkNsaWNrID0gdGhpcy5vbkNsaWNrLmJpbmQodGhpcylcbiAgICB0aGlzLm9uRG9jdW1lbnREcm9wID0gdGhpcy5vbkRvY3VtZW50RHJvcC5iaW5kKHRoaXMpXG4gICAgdGhpcy5vbkRyYWdFbnRlciA9IHRoaXMub25EcmFnRW50ZXIuYmluZCh0aGlzKVxuICAgIHRoaXMub25EcmFnTGVhdmUgPSB0aGlzLm9uRHJhZ0xlYXZlLmJpbmQodGhpcylcbiAgICB0aGlzLm9uRHJhZ092ZXIgPSB0aGlzLm9uRHJhZ092ZXIuYmluZCh0aGlzKVxuICAgIHRoaXMub25EcmFnU3RhcnQgPSB0aGlzLm9uRHJhZ1N0YXJ0LmJpbmQodGhpcylcbiAgICB0aGlzLm9uRHJvcCA9IHRoaXMub25Ecm9wLmJpbmQodGhpcylcbiAgICB0aGlzLm9uRmlsZURpYWxvZ0NhbmNlbCA9IHRoaXMub25GaWxlRGlhbG9nQ2FuY2VsLmJpbmQodGhpcylcbiAgICB0aGlzLm9uSW5wdXRFbGVtZW50Q2xpY2sgPSB0aGlzLm9uSW5wdXRFbGVtZW50Q2xpY2suYmluZCh0aGlzKVxuXG4gICAgdGhpcy5zZXRSZWYgPSB0aGlzLnNldFJlZi5iaW5kKHRoaXMpXG4gICAgdGhpcy5zZXRSZWZzID0gdGhpcy5zZXRSZWZzLmJpbmQodGhpcylcblxuICAgIHRoaXMuaXNGaWxlRGlhbG9nQWN0aXZlID0gZmFsc2VcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBkcmFnZ2VkRmlsZXM6IFtdLFxuICAgICAgYWNjZXB0ZWRGaWxlczogW10sXG4gICAgICByZWplY3RlZEZpbGVzOiBbXVxuICAgIH1cbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGNvbnN0IHsgcHJldmVudERyb3BPbkRvY3VtZW50IH0gPSB0aGlzLnByb3BzXG4gICAgdGhpcy5kcmFnVGFyZ2V0cyA9IFtdXG5cbiAgICBpZiAocHJldmVudERyb3BPbkRvY3VtZW50KSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIG9uRG9jdW1lbnREcmFnT3ZlciwgZmFsc2UpXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5vbkRvY3VtZW50RHJvcCwgZmFsc2UpXG4gICAgfVxuICAgIHRoaXMuZmlsZUlucHV0RWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uSW5wdXRFbGVtZW50Q2xpY2ssIGZhbHNlKVxuICAgIC8vIFRyaWVkIGltcGxlbWVudGluZyBhZGRFdmVudExpc3RlbmVyLCBidXQgZGlkbid0IHdvcmsgb3V0XG4gICAgZG9jdW1lbnQuYm9keS5vbmZvY3VzID0gdGhpcy5vbkZpbGVEaWFsb2dDYW5jZWxcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIGNvbnN0IHsgcHJldmVudERyb3BPbkRvY3VtZW50IH0gPSB0aGlzLnByb3BzXG4gICAgaWYgKHByZXZlbnREcm9wT25Eb2N1bWVudCkge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCBvbkRvY3VtZW50RHJhZ092ZXIpXG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5vbkRvY3VtZW50RHJvcClcbiAgICB9XG4gICAgaWYgKHRoaXMuZmlsZUlucHV0RWwgIT0gbnVsbCkge1xuICAgICAgdGhpcy5maWxlSW5wdXRFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25JbnB1dEVsZW1lbnRDbGljaywgZmFsc2UpXG4gICAgfVxuICAgIC8vIENhbiBiZSByZXBsYWNlZCB3aXRoIHJlbW92ZUV2ZW50TGlzdGVuZXIsIGlmIGFkZEV2ZW50TGlzdGVuZXIgd29ya3NcbiAgICBpZiAoZG9jdW1lbnQgIT0gbnVsbCkge1xuICAgICAgZG9jdW1lbnQuYm9keS5vbmZvY3VzID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGNvbXBvc2VIYW5kbGVycyhoYW5kbGVyKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIGhhbmRsZXJcbiAgfVxuXG4gIG9uRG9jdW1lbnREcm9wKGV2dCkge1xuICAgIGlmICh0aGlzLm5vZGUgJiYgdGhpcy5ub2RlLmNvbnRhaW5zKGV2dC50YXJnZXQpKSB7XG4gICAgICAvLyBpZiB3ZSBpbnRlcmNlcHRlZCBhbiBldmVudCBmb3Igb3VyIGluc3RhbmNlLCBsZXQgaXQgcHJvcGFnYXRlIGRvd24gdG8gdGhlIGluc3RhbmNlJ3Mgb25Ecm9wIGhhbmRsZXJcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBldnQucHJldmVudERlZmF1bHQoKVxuICAgIHRoaXMuZHJhZ1RhcmdldHMgPSBbXVxuICB9XG5cbiAgb25EcmFnU3RhcnQoZXZ0KSB7XG4gICAgaWYgKHRoaXMucHJvcHMub25EcmFnU3RhcnQpIHtcbiAgICAgIHRoaXMucHJvcHMub25EcmFnU3RhcnQuY2FsbCh0aGlzLCBldnQpXG4gICAgfVxuICB9XG5cbiAgb25EcmFnRW50ZXIoZXZ0KSB7XG4gICAgZXZ0LnByZXZlbnREZWZhdWx0KClcblxuICAgIC8vIENvdW50IHRoZSBkcm9wem9uZSBhbmQgYW55IGNoaWxkcmVuIHRoYXQgYXJlIGVudGVyZWQuXG4gICAgaWYgKHRoaXMuZHJhZ1RhcmdldHMuaW5kZXhPZihldnQudGFyZ2V0KSA9PT0gLTEpIHtcbiAgICAgIHRoaXMuZHJhZ1RhcmdldHMucHVzaChldnQudGFyZ2V0KVxuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgaXNEcmFnQWN0aXZlOiB0cnVlLCAvLyBEbyBub3QgcmVseSBvbiBmaWxlcyBmb3IgdGhlIGRyYWcgc3RhdGUuIEl0IGRvZXNuJ3Qgd29yayBpbiBTYWZhcmkuXG4gICAgICBkcmFnZ2VkRmlsZXM6IGdldERhdGFUcmFuc2Zlckl0ZW1zKGV2dClcbiAgICB9KVxuXG4gICAgaWYgKHRoaXMucHJvcHMub25EcmFnRW50ZXIpIHtcbiAgICAgIHRoaXMucHJvcHMub25EcmFnRW50ZXIuY2FsbCh0aGlzLCBldnQpXG4gICAgfVxuICB9XG5cbiAgb25EcmFnT3ZlcihldnQpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcbiAgICBldnQucHJldmVudERlZmF1bHQoKVxuICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKVxuICAgIHRyeSB7XG4gICAgICAvLyBUaGUgZmlsZSBkaWFsb2cgb24gQ2hyb21lIGFsbG93cyB1c2VycyB0byBkcmFnIGZpbGVzIGZyb20gdGhlIGRpYWxvZyBvbnRvXG4gICAgICAvLyB0aGUgZHJvcHpvbmUsIGNhdXNpbmcgdGhlIGJyb3dzZXIgdGhlIGNyYXNoIHdoZW4gdGhlIGZpbGUgZGlhbG9nIGlzIGNsb3NlZC5cbiAgICAgIC8vIEEgZHJvcCBlZmZlY3Qgb2YgJ25vbmUnIHByZXZlbnRzIHRoZSBmaWxlIGZyb20gYmVpbmcgZHJvcHBlZFxuICAgICAgZXZ0LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gdGhpcy5pc0ZpbGVEaWFsb2dBY3RpdmUgPyAnbm9uZScgOiAnY29weScgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gY29udGludWUgcmVnYXJkbGVzcyBvZiBlcnJvclxuICAgIH1cblxuICAgIGlmICh0aGlzLnByb3BzLm9uRHJhZ092ZXIpIHtcbiAgICAgIHRoaXMucHJvcHMub25EcmFnT3Zlci5jYWxsKHRoaXMsIGV2dClcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBvbkRyYWdMZWF2ZShldnQpIHtcbiAgICBldnQucHJldmVudERlZmF1bHQoKVxuXG4gICAgLy8gT25seSBkZWFjdGl2YXRlIG9uY2UgdGhlIGRyb3B6b25lIGFuZCBhbGwgY2hpbGRyZW4gaGF2ZSBiZWVuIGxlZnQuXG4gICAgdGhpcy5kcmFnVGFyZ2V0cyA9IHRoaXMuZHJhZ1RhcmdldHMuZmlsdGVyKGVsID0+IGVsICE9PSBldnQudGFyZ2V0ICYmIHRoaXMubm9kZS5jb250YWlucyhlbCkpXG4gICAgaWYgKHRoaXMuZHJhZ1RhcmdldHMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgZHJhZ2dpbmcgZmlsZXMgc3RhdGVcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGlzRHJhZ0FjdGl2ZTogZmFsc2UsXG4gICAgICBkcmFnZ2VkRmlsZXM6IFtdXG4gICAgfSlcblxuICAgIGlmICh0aGlzLnByb3BzLm9uRHJhZ0xlYXZlKSB7XG4gICAgICB0aGlzLnByb3BzLm9uRHJhZ0xlYXZlLmNhbGwodGhpcywgZXZ0KVxuICAgIH1cbiAgfVxuXG4gIG9uRHJvcChldnQpIHtcbiAgICBjb25zdCB7IG9uRHJvcCwgb25Ecm9wQWNjZXB0ZWQsIG9uRHJvcFJlamVjdGVkLCBtdWx0aXBsZSwgZGlzYWJsZVByZXZpZXcsIGFjY2VwdCB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IGZpbGVMaXN0ID0gZ2V0RGF0YVRyYW5zZmVySXRlbXMoZXZ0KVxuICAgIGNvbnN0IGFjY2VwdGVkRmlsZXMgPSBbXVxuICAgIGNvbnN0IHJlamVjdGVkRmlsZXMgPSBbXVxuXG4gICAgLy8gU3RvcCBkZWZhdWx0IGJyb3dzZXIgYmVoYXZpb3JcbiAgICBldnQucHJldmVudERlZmF1bHQoKVxuXG4gICAgLy8gUmVzZXQgdGhlIGNvdW50ZXIgYWxvbmcgd2l0aCB0aGUgZHJhZyBvbiBhIGRyb3AuXG4gICAgdGhpcy5kcmFnVGFyZ2V0cyA9IFtdXG4gICAgdGhpcy5pc0ZpbGVEaWFsb2dBY3RpdmUgPSBmYWxzZVxuXG4gICAgZmlsZUxpc3QuZm9yRWFjaChmaWxlID0+IHtcbiAgICAgIGlmICghZGlzYWJsZVByZXZpZXcpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmaWxlLnByZXZpZXcgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgcHJldmlldyBmb3IgZmlsZScsIGZpbGUsIGVycikgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgZmlsZUFjY2VwdGVkKGZpbGUsIGFjY2VwdCkgJiZcbiAgICAgICAgZmlsZU1hdGNoU2l6ZShmaWxlLCB0aGlzLnByb3BzLm1heFNpemUsIHRoaXMucHJvcHMubWluU2l6ZSlcbiAgICAgICkge1xuICAgICAgICBhY2NlcHRlZEZpbGVzLnB1c2goZmlsZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlamVjdGVkRmlsZXMucHVzaChmaWxlKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBpZiAoIW11bHRpcGxlKSB7XG4gICAgICAvLyBpZiBub3QgaW4gbXVsdGkgbW9kZSBhZGQgYW55IGV4dHJhIGFjY2VwdGVkIGZpbGVzIHRvIHJlamVjdGVkLlxuICAgICAgLy8gVGhpcyB3aWxsIGFsbG93IGVuZCB1c2VycyB0byBlYXNpbHkgaWdub3JlIGEgbXVsdGkgZmlsZSBkcm9wIGluIFwic2luZ2xlXCIgbW9kZS5cbiAgICAgIHJlamVjdGVkRmlsZXMucHVzaCguLi5hY2NlcHRlZEZpbGVzLnNwbGljZSgxKSlcbiAgICB9XG5cbiAgICBpZiAob25Ecm9wKSB7XG4gICAgICBvbkRyb3AuY2FsbCh0aGlzLCBhY2NlcHRlZEZpbGVzLCByZWplY3RlZEZpbGVzLCBldnQpXG4gICAgfVxuXG4gICAgaWYgKHJlamVjdGVkRmlsZXMubGVuZ3RoID4gMCAmJiBvbkRyb3BSZWplY3RlZCkge1xuICAgICAgb25Ecm9wUmVqZWN0ZWQuY2FsbCh0aGlzLCByZWplY3RlZEZpbGVzLCBldnQpXG4gICAgfVxuXG4gICAgaWYgKGFjY2VwdGVkRmlsZXMubGVuZ3RoID4gMCAmJiBvbkRyb3BBY2NlcHRlZCkge1xuICAgICAgb25Ecm9wQWNjZXB0ZWQuY2FsbCh0aGlzLCBhY2NlcHRlZEZpbGVzLCBldnQpXG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgZmlsZXMgdmFsdWVcbiAgICB0aGlzLmRyYWdnZWRGaWxlcyA9IG51bGxcblxuICAgIC8vIFJlc2V0IGRyYWcgc3RhdGVcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGlzRHJhZ0FjdGl2ZTogZmFsc2UsXG4gICAgICBkcmFnZ2VkRmlsZXM6IFtdLFxuICAgICAgYWNjZXB0ZWRGaWxlcyxcbiAgICAgIHJlamVjdGVkRmlsZXNcbiAgICB9KVxuICB9XG5cbiAgb25DbGljayhldnQpIHtcbiAgICBjb25zdCB7IG9uQ2xpY2ssIGRpc2FibGVDbGljayB9ID0gdGhpcy5wcm9wc1xuICAgIGlmICghZGlzYWJsZUNsaWNrKSB7XG4gICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKClcblxuICAgICAgaWYgKG9uQ2xpY2spIHtcbiAgICAgICAgb25DbGljay5jYWxsKHRoaXMsIGV2dClcbiAgICAgIH1cblxuICAgICAgLy8gaW4gSUUxMS9FZGdlIHRoZSBmaWxlLWJyb3dzZXIgZGlhbG9nIGlzIGJsb2NraW5nLCBlbnN1cmUgdGhpcyBpcyBiZWhpbmQgc2V0VGltZW91dFxuICAgICAgLy8gdGhpcyBpcyBzbyByZWFjdCBjYW4gaGFuZGxlIHN0YXRlIGNoYW5nZXMgaW4gdGhlIG9uQ2xpY2sgcHJvcCBhYm92ZSBhYm92ZVxuICAgICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtZHJvcHpvbmUvcmVhY3QtZHJvcHpvbmUvaXNzdWVzLzQ1MFxuICAgICAgc2V0VGltZW91dCh0aGlzLm9wZW4uYmluZCh0aGlzKSwgMClcbiAgICB9XG4gIH1cblxuICBvbklucHV0RWxlbWVudENsaWNrKGV2dCkge1xuICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKVxuICAgIGlmICh0aGlzLnByb3BzLmlucHV0UHJvcHMgJiYgdGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uQ2xpY2spIHtcbiAgICAgIHRoaXMucHJvcHMuaW5wdXRQcm9wcy5vbkNsaWNrKClcbiAgICB9XG4gIH1cblxuICBvbkZpbGVEaWFsb2dDYW5jZWwoKSB7XG4gICAgLy8gdGltZW91dCB3aWxsIG5vdCByZWNvZ25pemUgY29udGV4dCBvZiB0aGlzIG1ldGhvZFxuICAgIGNvbnN0IHsgb25GaWxlRGlhbG9nQ2FuY2VsIH0gPSB0aGlzLnByb3BzXG4gICAgLy8gZXhlY3V0ZSB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSBGaWxlRGlhbG9nIGlzIG9wZW5lZCBpbiB0aGUgYnJvd3NlclxuICAgIGlmICh0aGlzLmlzRmlsZURpYWxvZ0FjdGl2ZSkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmZpbGVJbnB1dEVsICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBSZXR1cm5zIGFuIG9iamVjdCBhcyBGaWxlTGlzdFxuICAgICAgICAgIGNvbnN0IHsgZmlsZXMgfSA9IHRoaXMuZmlsZUlucHV0RWxcblxuICAgICAgICAgIGlmICghZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmlzRmlsZURpYWxvZ0FjdGl2ZSA9IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvbkZpbGVEaWFsb2dDYW5jZWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvbkZpbGVEaWFsb2dDYW5jZWwoKVxuICAgICAgICB9XG4gICAgICB9LCAzMDApXG4gICAgfVxuICB9XG5cbiAgc2V0UmVmKHJlZikge1xuICAgIHRoaXMubm9kZSA9IHJlZlxuICB9XG5cbiAgc2V0UmVmcyhyZWYpIHtcbiAgICB0aGlzLmZpbGVJbnB1dEVsID0gcmVmXG4gIH1cbiAgLyoqXG4gICAqIE9wZW4gc3lzdGVtIGZpbGUgdXBsb2FkIGRpYWxvZy5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgb3BlbigpIHtcbiAgICB0aGlzLmlzRmlsZURpYWxvZ0FjdGl2ZSA9IHRydWVcbiAgICB0aGlzLmZpbGVJbnB1dEVsLnZhbHVlID0gbnVsbFxuICAgIHRoaXMuZmlsZUlucHV0RWwuY2xpY2soKVxuICB9XG5cbiAgcmVuZGVyQ2hpbGRyZW4gPSAoY2hpbGRyZW4sIGlzRHJhZ0FjdGl2ZSwgaXNEcmFnQWNjZXB0LCBpc0RyYWdSZWplY3QpID0+IHtcbiAgICBpZiAodHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gY2hpbGRyZW4oe1xuICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICBpc0RyYWdBY3RpdmUsXG4gICAgICAgIGlzRHJhZ0FjY2VwdCxcbiAgICAgICAgaXNEcmFnUmVqZWN0XG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gY2hpbGRyZW5cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBhY2NlcHQsXG4gICAgICBhY2NlcHRDbGFzc05hbWUsXG4gICAgICBhY3RpdmVDbGFzc05hbWUsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIGRpc2FibGVkLFxuICAgICAgZGlzYWJsZWRDbGFzc05hbWUsXG4gICAgICBpbnB1dFByb3BzLFxuICAgICAgbXVsdGlwbGUsXG4gICAgICBuYW1lLFxuICAgICAgcmVqZWN0Q2xhc3NOYW1lLFxuICAgICAgLi4ucmVzdFxuICAgIH0gPSB0aGlzLnByb3BzXG5cbiAgICBsZXQge1xuICAgICAgYWNjZXB0U3R5bGUsXG4gICAgICBhY3RpdmVTdHlsZSxcbiAgICAgIGNsYXNzTmFtZSA9ICcnLFxuICAgICAgZGlzYWJsZWRTdHlsZSxcbiAgICAgIHJlamVjdFN0eWxlLFxuICAgICAgc3R5bGUsXG4gICAgICAuLi5wcm9wcyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByZWZlci1jb25zdFxuICAgIH0gPSByZXN0XG5cbiAgICBjb25zdCB7IGlzRHJhZ0FjdGl2ZSwgZHJhZ2dlZEZpbGVzIH0gPSB0aGlzLnN0YXRlXG4gICAgY29uc3QgZmlsZXNDb3VudCA9IGRyYWdnZWRGaWxlcy5sZW5ndGhcbiAgICBjb25zdCBpc011bHRpcGxlQWxsb3dlZCA9IG11bHRpcGxlIHx8IGZpbGVzQ291bnQgPD0gMVxuICAgIGNvbnN0IGlzRHJhZ0FjY2VwdCA9IGZpbGVzQ291bnQgPiAwICYmIGFsbEZpbGVzQWNjZXB0ZWQoZHJhZ2dlZEZpbGVzLCB0aGlzLnByb3BzLmFjY2VwdClcbiAgICBjb25zdCBpc0RyYWdSZWplY3QgPSBmaWxlc0NvdW50ID4gMCAmJiAoIWlzRHJhZ0FjY2VwdCB8fCAhaXNNdWx0aXBsZUFsbG93ZWQpXG4gICAgY29uc3Qgbm9TdHlsZXMgPVxuICAgICAgIWNsYXNzTmFtZSAmJiAhc3R5bGUgJiYgIWFjdGl2ZVN0eWxlICYmICFhY2NlcHRTdHlsZSAmJiAhcmVqZWN0U3R5bGUgJiYgIWRpc2FibGVkU3R5bGVcblxuICAgIGlmIChpc0RyYWdBY3RpdmUgJiYgYWN0aXZlQ2xhc3NOYW1lKSB7XG4gICAgICBjbGFzc05hbWUgKz0gJyAnICsgYWN0aXZlQ2xhc3NOYW1lXG4gICAgfVxuICAgIGlmIChpc0RyYWdBY2NlcHQgJiYgYWNjZXB0Q2xhc3NOYW1lKSB7XG4gICAgICBjbGFzc05hbWUgKz0gJyAnICsgYWNjZXB0Q2xhc3NOYW1lXG4gICAgfVxuICAgIGlmIChpc0RyYWdSZWplY3QgJiYgcmVqZWN0Q2xhc3NOYW1lKSB7XG4gICAgICBjbGFzc05hbWUgKz0gJyAnICsgcmVqZWN0Q2xhc3NOYW1lXG4gICAgfVxuICAgIGlmIChkaXNhYmxlZCAmJiBkaXNhYmxlZENsYXNzTmFtZSkge1xuICAgICAgY2xhc3NOYW1lICs9ICcgJyArIGRpc2FibGVkQ2xhc3NOYW1lXG4gICAgfVxuXG4gICAgaWYgKG5vU3R5bGVzKSB7XG4gICAgICBzdHlsZSA9IHN0eWxlcy5kZWZhdWx0XG4gICAgICBhY3RpdmVTdHlsZSA9IHN0eWxlcy5hY3RpdmVcbiAgICAgIGFjY2VwdFN0eWxlID0gc3R5bGUuYWN0aXZlXG4gICAgICByZWplY3RTdHlsZSA9IHN0eWxlcy5yZWplY3RlZFxuICAgICAgZGlzYWJsZWRTdHlsZSA9IHN0eWxlcy5kaXNhYmxlZFxuICAgIH1cblxuICAgIGxldCBhcHBsaWVkU3R5bGUgPSB7IC4uLnN0eWxlIH1cbiAgICBpZiAoYWN0aXZlU3R5bGUgJiYgaXNEcmFnQWN0aXZlKSB7XG4gICAgICBhcHBsaWVkU3R5bGUgPSB7XG4gICAgICAgIC4uLnN0eWxlLFxuICAgICAgICAuLi5hY3RpdmVTdHlsZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYWNjZXB0U3R5bGUgJiYgaXNEcmFnQWNjZXB0KSB7XG4gICAgICBhcHBsaWVkU3R5bGUgPSB7XG4gICAgICAgIC4uLmFwcGxpZWRTdHlsZSxcbiAgICAgICAgLi4uYWNjZXB0U3R5bGVcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlamVjdFN0eWxlICYmIGlzRHJhZ1JlamVjdCkge1xuICAgICAgYXBwbGllZFN0eWxlID0ge1xuICAgICAgICAuLi5hcHBsaWVkU3R5bGUsXG4gICAgICAgIC4uLnJlamVjdFN0eWxlXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkaXNhYmxlZFN0eWxlICYmIGRpc2FibGVkKSB7XG4gICAgICBhcHBsaWVkU3R5bGUgPSB7XG4gICAgICAgIC4uLnN0eWxlLFxuICAgICAgICAuLi5kaXNhYmxlZFN0eWxlXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaW5wdXRBdHRyaWJ1dGVzID0ge1xuICAgICAgYWNjZXB0LFxuICAgICAgZGlzYWJsZWQsXG4gICAgICB0eXBlOiAnZmlsZScsXG4gICAgICBzdHlsZTogeyBkaXNwbGF5OiAnbm9uZScgfSxcbiAgICAgIG11bHRpcGxlOiBzdXBwb3J0TXVsdGlwbGUgJiYgbXVsdGlwbGUsXG4gICAgICByZWY6IHRoaXMuc2V0UmVmcyxcbiAgICAgIG9uQ2hhbmdlOiB0aGlzLm9uRHJvcCxcbiAgICAgIGF1dG9Db21wbGV0ZTogJ29mZidcbiAgICB9XG5cbiAgICBpZiAobmFtZSAmJiBuYW1lLmxlbmd0aCkge1xuICAgICAgaW5wdXRBdHRyaWJ1dGVzLm5hbWUgPSBuYW1lXG4gICAgfVxuXG4gICAgLy8gRGVzdHJ1Y3R1cmUgY3VzdG9tIHByb3BzIGF3YXkgZnJvbSBwcm9wcyB1c2VkIGZvciB0aGUgZGl2IGVsZW1lbnRcbiAgICBjb25zdCB7XG4gICAgICBhY2NlcHRlZEZpbGVzLFxuICAgICAgcHJldmVudERyb3BPbkRvY3VtZW50LFxuICAgICAgZGlzYWJsZVByZXZpZXcsXG4gICAgICBkaXNhYmxlQ2xpY2ssXG4gICAgICBvbkRyb3BBY2NlcHRlZCxcbiAgICAgIG9uRHJvcFJlamVjdGVkLFxuICAgICAgb25GaWxlRGlhbG9nQ2FuY2VsLFxuICAgICAgbWF4U2l6ZSxcbiAgICAgIG1pblNpemUsXG4gICAgICAuLi5kaXZQcm9wc1xuICAgIH0gPSBwcm9wc1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWV9XG4gICAgICAgIHN0eWxlPXthcHBsaWVkU3R5bGV9XG4gICAgICAgIHsuLi5kaXZQcm9wcyAvKiBleHBhbmQgdXNlciBwcm92aWRlZCBwcm9wcyBmaXJzdCBzbyBldmVudCBoYW5kbGVycyBhcmUgbmV2ZXIgb3ZlcnJpZGRlbiAqL31cbiAgICAgICAgb25DbGljaz17dGhpcy5jb21wb3NlSGFuZGxlcnModGhpcy5vbkNsaWNrKX1cbiAgICAgICAgb25EcmFnU3RhcnQ9e3RoaXMuY29tcG9zZUhhbmRsZXJzKHRoaXMub25EcmFnU3RhcnQpfVxuICAgICAgICBvbkRyYWdFbnRlcj17dGhpcy5jb21wb3NlSGFuZGxlcnModGhpcy5vbkRyYWdFbnRlcil9XG4gICAgICAgIG9uRHJhZ092ZXI9e3RoaXMuY29tcG9zZUhhbmRsZXJzKHRoaXMub25EcmFnT3Zlcil9XG4gICAgICAgIG9uRHJhZ0xlYXZlPXt0aGlzLmNvbXBvc2VIYW5kbGVycyh0aGlzLm9uRHJhZ0xlYXZlKX1cbiAgICAgICAgb25Ecm9wPXt0aGlzLmNvbXBvc2VIYW5kbGVycyh0aGlzLm9uRHJvcCl9XG4gICAgICAgIHJlZj17dGhpcy5zZXRSZWZ9XG4gICAgICAgIGFyaWEtZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgPlxuICAgICAgICB7dGhpcy5yZW5kZXJDaGlsZHJlbihjaGlsZHJlbiwgaXNEcmFnQWN0aXZlLCBpc0RyYWdBY2NlcHQsIGlzRHJhZ1JlamVjdCl9XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIHsuLi5pbnB1dFByb3BzIC8qIGV4cGFuZCB1c2VyIHByb3ZpZGVkIGlucHV0UHJvcHMgZmlyc3Qgc28gaW5wdXRBdHRyaWJ1dGVzIG92ZXJyaWRlIHRoZW0gKi99XG4gICAgICAgICAgey4uLmlucHV0QXR0cmlidXRlc31cbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBEcm9wem9uZVxuXG5Ecm9wem9uZS5wcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBBbGxvdyBzcGVjaWZpYyB0eXBlcyBvZiBmaWxlcy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9va29uZXQvYXR0ci1hY2NlcHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAqIEtlZXAgaW4gbWluZCB0aGF0IG1pbWUgdHlwZSBkZXRlcm1pbmF0aW9uIGlzIG5vdCByZWxpYWJsZSBhY3Jvc3MgcGxhdGZvcm1zLiBDU1YgZmlsZXMsXG4gICAqIGZvciBleGFtcGxlLCBhcmUgcmVwb3J0ZWQgYXMgdGV4dC9wbGFpbiB1bmRlciBtYWNPUyBidXQgYXMgYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsIHVuZGVyXG4gICAqIFdpbmRvd3MuIEluIHNvbWUgY2FzZXMgdGhlcmUgbWlnaHQgbm90IGJlIGEgbWltZSB0eXBlIHNldCBhdCBhbGwuXG4gICAqIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWRyb3B6b25lL3JlYWN0LWRyb3B6b25lL2lzc3Vlcy8yNzZcbiAgICovXG4gIGFjY2VwdDogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQ29udGVudHMgb2YgdGhlIGRyb3B6b25lXG4gICAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm5vZGUsIFByb3BUeXBlcy5mdW5jXSksXG5cbiAgLyoqXG4gICAqIERpc2FsbG93IGNsaWNraW5nIG9uIHRoZSBkcm9wem9uZSBjb250YWluZXIgdG8gb3BlbiBmaWxlIGRpYWxvZ1xuICAgKi9cbiAgZGlzYWJsZUNsaWNrOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogRW5hYmxlL2Rpc2FibGUgdGhlIGRyb3B6b25lIGVudGlyZWx5XG4gICAqL1xuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEVuYWJsZS9kaXNhYmxlIHByZXZpZXcgZ2VuZXJhdGlvblxuICAgKi9cbiAgZGlzYWJsZVByZXZpZXc6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBJZiBmYWxzZSwgYWxsb3cgZHJvcHBlZCBpdGVtcyB0byB0YWtlIG92ZXIgdGhlIGN1cnJlbnQgYnJvd3NlciB3aW5kb3dcbiAgICovXG4gIHByZXZlbnREcm9wT25Eb2N1bWVudDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIFBhc3MgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIHRvIHRoZSBgPGlucHV0IHR5cGU9XCJmaWxlXCIvPmAgdGFnXG4gICAqL1xuICBpbnB1dFByb3BzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBBbGxvdyBkcm9wcGluZyBtdWx0aXBsZSBmaWxlc1xuICAgKi9cbiAgbXVsdGlwbGU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBgbmFtZWAgYXR0cmlidXRlIGZvciB0aGUgaW5wdXQgdGFnXG4gICAqL1xuICBuYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBNYXhpbXVtIGZpbGUgc2l6ZSAoaW4gYnl0ZXMpXG4gICAqL1xuICBtYXhTaXplOiBQcm9wVHlwZXMubnVtYmVyLFxuXG4gIC8qKlxuICAgKiBNaW5pbXVtIGZpbGUgc2l6ZSAoaW4gYnl0ZXMpXG4gICAqL1xuICBtaW5TaXplOiBQcm9wVHlwZXMubnVtYmVyLFxuXG4gIC8qKlxuICAgKiBjbGFzc05hbWVcbiAgICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogY2xhc3NOYW1lIGZvciBhY3RpdmUgc3RhdGVcbiAgICovXG4gIGFjdGl2ZUNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogY2xhc3NOYW1lIGZvciBhY2NlcHRlZCBzdGF0ZVxuICAgKi9cbiAgYWNjZXB0Q2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBjbGFzc05hbWUgZm9yIHJlamVjdGVkIHN0YXRlXG4gICAqL1xuICByZWplY3RDbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIGNsYXNzTmFtZSBmb3IgZGlzYWJsZWQgc3RhdGVcbiAgICovXG4gIGRpc2FibGVkQ2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBDU1Mgc3R5bGVzIHRvIGFwcGx5XG4gICAqL1xuICBzdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQ1NTIHN0eWxlcyB0byBhcHBseSB3aGVuIGRyYWcgaXMgYWN0aXZlXG4gICAqL1xuICBhY3RpdmVTdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQ1NTIHN0eWxlcyB0byBhcHBseSB3aGVuIGRyb3Agd2lsbCBiZSBhY2NlcHRlZFxuICAgKi9cbiAgYWNjZXB0U3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIENTUyBzdHlsZXMgdG8gYXBwbHkgd2hlbiBkcm9wIHdpbGwgYmUgcmVqZWN0ZWRcbiAgICovXG4gIHJlamVjdFN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBDU1Mgc3R5bGVzIHRvIGFwcGx5IHdoZW4gZHJvcHpvbmUgaXMgZGlzYWJsZWRcbiAgICovXG4gIGRpc2FibGVkU3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIG9uQ2xpY2sgY2FsbGJhY2tcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICovXG4gIG9uQ2xpY2s6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBvbkRyb3AgY2FsbGJhY2tcbiAgICovXG4gIG9uRHJvcDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIG9uRHJvcEFjY2VwdGVkIGNhbGxiYWNrXG4gICAqL1xuICBvbkRyb3BBY2NlcHRlZDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIG9uRHJvcFJlamVjdGVkIGNhbGxiYWNrXG4gICAqL1xuICBvbkRyb3BSZWplY3RlZDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIG9uRHJhZ1N0YXJ0IGNhbGxiYWNrXG4gICAqL1xuICBvbkRyYWdTdGFydDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIG9uRHJhZ0VudGVyIGNhbGxiYWNrXG4gICAqL1xuICBvbkRyYWdFbnRlcjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIG9uRHJhZ092ZXIgY2FsbGJhY2tcbiAgICovXG4gIG9uRHJhZ092ZXI6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBvbkRyYWdMZWF2ZSBjYWxsYmFja1xuICAgKi9cbiAgb25EcmFnTGVhdmU6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBQcm92aWRlIGEgY2FsbGJhY2sgb24gY2xpY2tpbmcgdGhlIGNhbmNlbCBidXR0b24gb2YgdGhlIGZpbGUgZGlhbG9nXG4gICAqL1xuICBvbkZpbGVEaWFsb2dDYW5jZWw6IFByb3BUeXBlcy5mdW5jXG59XG5cbkRyb3B6b25lLmRlZmF1bHRQcm9wcyA9IHtcbiAgcHJldmVudERyb3BPbkRvY3VtZW50OiB0cnVlLFxuICBkaXNhYmxlZDogZmFsc2UsXG4gIGRpc2FibGVQcmV2aWV3OiBmYWxzZSxcbiAgZGlzYWJsZUNsaWNrOiBmYWxzZSxcbiAgbXVsdGlwbGU6IHRydWUsXG4gIG1heFNpemU6IEluZmluaXR5LFxuICBtaW5TaXplOiAwXG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvaW5kZXguanMiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfMV9fO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcInJvb3RcIjpcIlJlYWN0XCIsXCJjb21tb25qczJcIjpcInJlYWN0XCIsXCJjb21tb25qc1wiOlwicmVhY3RcIixcImFtZFwiOlwicmVhY3RcIn1cbi8vIG1vZHVsZSBpZCA9IDFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzJfXztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJyb290XCI6XCJQcm9wVHlwZXNcIixcImNvbW1vbmpzMlwiOlwicHJvcC10eXBlc1wiLFwiY29tbW9uanNcIjpcInByb3AtdHlwZXNcIixcImFtZFwiOlwicHJvcC10eXBlc1wifVxuLy8gbW9kdWxlIGlkID0gMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgYWNjZXB0cyBmcm9tICdhdHRyLWFjY2VwdCdcblxuZXhwb3J0IGNvbnN0IHN1cHBvcnRNdWx0aXBsZSA9XG4gIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQgJiYgZG9jdW1lbnQuY3JlYXRlRWxlbWVudFxuICAgID8gJ211bHRpcGxlJyBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpXG4gICAgOiB0cnVlXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRhVHJhbnNmZXJJdGVtcyhldmVudCkge1xuICBsZXQgZGF0YVRyYW5zZmVySXRlbXNMaXN0ID0gW11cbiAgaWYgKGV2ZW50LmRhdGFUcmFuc2Zlcikge1xuICAgIGNvbnN0IGR0ID0gZXZlbnQuZGF0YVRyYW5zZmVyXG4gICAgaWYgKGR0LmZpbGVzICYmIGR0LmZpbGVzLmxlbmd0aCkge1xuICAgICAgZGF0YVRyYW5zZmVySXRlbXNMaXN0ID0gZHQuZmlsZXNcbiAgICB9IGVsc2UgaWYgKGR0Lml0ZW1zICYmIGR0Lml0ZW1zLmxlbmd0aCkge1xuICAgICAgLy8gRHVyaW5nIHRoZSBkcmFnIGV2ZW4gdGhlIGRhdGFUcmFuc2Zlci5maWxlcyBpcyBudWxsXG4gICAgICAvLyBidXQgQ2hyb21lIGltcGxlbWVudHMgc29tZSBkcmFnIHN0b3JlLCB3aGljaCBpcyBhY2Nlc2libGUgdmlhIGRhdGFUcmFuc2Zlci5pdGVtc1xuICAgICAgZGF0YVRyYW5zZmVySXRlbXNMaXN0ID0gZHQuaXRlbXNcbiAgICB9XG4gIH0gZWxzZSBpZiAoZXZlbnQudGFyZ2V0ICYmIGV2ZW50LnRhcmdldC5maWxlcykge1xuICAgIGRhdGFUcmFuc2Zlckl0ZW1zTGlzdCA9IGV2ZW50LnRhcmdldC5maWxlc1xuICB9XG4gIC8vIENvbnZlcnQgZnJvbSBEYXRhVHJhbnNmZXJJdGVtc0xpc3QgdG8gdGhlIG5hdGl2ZSBBcnJheVxuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZGF0YVRyYW5zZmVySXRlbXNMaXN0KVxufVxuXG4vLyBGaXJlZm94IHZlcnNpb25zIHByaW9yIHRvIDUzIHJldHVybiBhIGJvZ3VzIE1JTUUgdHlwZSBmb3IgZXZlcnkgZmlsZSBkcmFnLCBzbyBkcmFnb3ZlcnMgd2l0aFxuLy8gdGhhdCBNSU1FIHR5cGUgd2lsbCBhbHdheXMgYmUgYWNjZXB0ZWRcbmV4cG9ydCBmdW5jdGlvbiBmaWxlQWNjZXB0ZWQoZmlsZSwgYWNjZXB0KSB7XG4gIHJldHVybiBmaWxlLnR5cGUgPT09ICdhcHBsaWNhdGlvbi94LW1vei1maWxlJyB8fCBhY2NlcHRzKGZpbGUsIGFjY2VwdClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbGVNYXRjaFNpemUoZmlsZSwgbWF4U2l6ZSwgbWluU2l6ZSkge1xuICByZXR1cm4gZmlsZS5zaXplIDw9IG1heFNpemUgJiYgZmlsZS5zaXplID49IG1pblNpemVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFsbEZpbGVzQWNjZXB0ZWQoZmlsZXMsIGFjY2VwdCkge1xuICByZXR1cm4gZmlsZXMuZXZlcnkoZmlsZSA9PiBmaWxlQWNjZXB0ZWQoZmlsZSwgYWNjZXB0KSlcbn1cblxuLy8gYWxsb3cgdGhlIGVudGlyZSBkb2N1bWVudCB0byBiZSBhIGRyYWcgdGFyZ2V0XG5leHBvcnQgZnVuY3Rpb24gb25Eb2N1bWVudERyYWdPdmVyKGV2dCkge1xuICBldnQucHJldmVudERlZmF1bHQoKVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3V0aWxzL2luZGV4LmpzIiwibW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihlKXtpZihyW2VdKXJldHVybiByW2VdLmV4cG9ydHM7dmFyIG89cltlXT17ZXhwb3J0czp7fSxpZDplLGxvYWRlZDohMX07cmV0dXJuIHRbZV0uY2FsbChvLmV4cG9ydHMsbyxvLmV4cG9ydHMsbiksby5sb2FkZWQ9ITAsby5leHBvcnRzfXZhciByPXt9O3JldHVybiBuLm09dCxuLmM9cixuLnA9XCJcIixuKDApfShbZnVuY3Rpb24odCxuLHIpe1widXNlIHN0cmljdFwiO24uX19lc01vZHVsZT0hMCxyKDgpLHIoOSksbltcImRlZmF1bHRcIl09ZnVuY3Rpb24odCxuKXtpZih0JiZuKXt2YXIgcj1mdW5jdGlvbigpe3ZhciByPUFycmF5LmlzQXJyYXkobik/bjpuLnNwbGl0KFwiLFwiKSxlPXQubmFtZXx8XCJcIixvPXQudHlwZXx8XCJcIixpPW8ucmVwbGFjZSgvXFwvLiokLyxcIlwiKTtyZXR1cm57djpyLnNvbWUoZnVuY3Rpb24odCl7dmFyIG49dC50cmltKCk7cmV0dXJuXCIuXCI9PT1uLmNoYXJBdCgwKT9lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgobi50b0xvd2VyQ2FzZSgpKTovXFwvXFwqJC8udGVzdChuKT9pPT09bi5yZXBsYWNlKC9cXC8uKiQvLFwiXCIpOm89PT1ufSl9fSgpO2lmKFwib2JqZWN0XCI9PXR5cGVvZiByKXJldHVybiByLnZ9cmV0dXJuITB9LHQuZXhwb3J0cz1uW1wiZGVmYXVsdFwiXX0sZnVuY3Rpb24odCxuKXt2YXIgcj10LmV4cG9ydHM9e3ZlcnNpb246XCIxLjIuMlwifTtcIm51bWJlclwiPT10eXBlb2YgX19lJiYoX19lPXIpfSxmdW5jdGlvbih0LG4pe3ZhciByPXQuZXhwb3J0cz1cInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cuTWF0aD09TWF0aD93aW5kb3c6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGYmJnNlbGYuTWF0aD09TWF0aD9zZWxmOkZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcIm51bWJlclwiPT10eXBlb2YgX19nJiYoX19nPXIpfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigyKSxvPXIoMSksaT1yKDQpLHU9cigxOSksYz1cInByb3RvdHlwZVwiLGY9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShuLGFyZ3VtZW50cyl9fSxzPWZ1bmN0aW9uKHQsbixyKXt2YXIgYSxwLGwseSxkPXQmcy5HLGg9dCZzLlAsdj1kP2U6dCZzLlM/ZVtuXXx8KGVbbl09e30pOihlW25dfHx7fSlbY10seD1kP286b1tuXXx8KG9bbl09e30pO2QmJihyPW4pO2ZvcihhIGluIHIpcD0hKHQmcy5GKSYmdiYmYSBpbiB2LGw9KHA/djpyKVthXSx5PXQmcy5CJiZwP2YobCxlKTpoJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBsP2YoRnVuY3Rpb24uY2FsbCxsKTpsLHYmJiFwJiZ1KHYsYSxsKSx4W2FdIT1sJiZpKHgsYSx5KSxoJiYoKHhbY118fCh4W2NdPXt9KSlbYV09bCl9O2UuY29yZT1vLHMuRj0xLHMuRz0yLHMuUz00LHMuUD04LHMuQj0xNixzLlc9MzIsdC5leHBvcnRzPXN9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDUpLG89cigxOCk7dC5leHBvcnRzPXIoMjIpP2Z1bmN0aW9uKHQsbixyKXtyZXR1cm4gZS5zZXREZXNjKHQsbixvKDEscikpfTpmdW5jdGlvbih0LG4scil7cmV0dXJuIHRbbl09cix0fX0sZnVuY3Rpb24odCxuKXt2YXIgcj1PYmplY3Q7dC5leHBvcnRzPXtjcmVhdGU6ci5jcmVhdGUsZ2V0UHJvdG86ci5nZXRQcm90b3R5cGVPZixpc0VudW06e30ucHJvcGVydHlJc0VudW1lcmFibGUsZ2V0RGVzYzpyLmdldE93blByb3BlcnR5RGVzY3JpcHRvcixzZXREZXNjOnIuZGVmaW5lUHJvcGVydHksc2V0RGVzY3M6ci5kZWZpbmVQcm9wZXJ0aWVzLGdldEtleXM6ci5rZXlzLGdldE5hbWVzOnIuZ2V0T3duUHJvcGVydHlOYW1lcyxnZXRTeW1ib2xzOnIuZ2V0T3duUHJvcGVydHlTeW1ib2xzLGVhY2g6W10uZm9yRWFjaH19LGZ1bmN0aW9uKHQsbil7dmFyIHI9MCxlPU1hdGgucmFuZG9tKCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVyblwiU3ltYm9sKFwiLmNvbmNhdCh2b2lkIDA9PT10P1wiXCI6dCxcIilfXCIsKCsrcitlKS50b1N0cmluZygzNikpfX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMjApKFwid2tzXCIpLG89cigyKS5TeW1ib2w7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfHwoZVt0XT1vJiZvW3RdfHwob3x8cig2KSkoXCJTeW1ib2wuXCIrdCkpfX0sZnVuY3Rpb24odCxuLHIpe3IoMjYpLHQuZXhwb3J0cz1yKDEpLkFycmF5LnNvbWV9LGZ1bmN0aW9uKHQsbixyKXtyKDI1KSx0LmV4cG9ydHM9cigxKS5TdHJpbmcuZW5kc1dpdGh9LGZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIHQpdGhyb3cgVHlwZUVycm9yKHQrXCIgaXMgbm90IGEgZnVuY3Rpb24hXCIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxuKXt2YXIgcj17fS50b1N0cmluZzt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHIuY2FsbCh0KS5zbGljZSg4LC0xKX19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDEwKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxuLHIpe2lmKGUodCksdm9pZCAwPT09bilyZXR1cm4gdDtzd2l0Y2gocil7Y2FzZSAxOnJldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gdC5jYWxsKG4scil9O2Nhc2UgMjpyZXR1cm4gZnVuY3Rpb24ocixlKXtyZXR1cm4gdC5jYWxsKG4scixlKX07Y2FzZSAzOnJldHVybiBmdW5jdGlvbihyLGUsbyl7cmV0dXJuIHQuY2FsbChuLHIsZSxvKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkobixhcmd1bWVudHMpfX19LGZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09dCl0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgXCIrdCk7cmV0dXJuIHR9fSxmdW5jdGlvbih0LG4scil7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBuPS8uLzt0cnl7XCIvLi9cIlt0XShuKX1jYXRjaChlKXt0cnl7cmV0dXJuIG5bcig3KShcIm1hdGNoXCIpXT0hMSwhXCIvLi9cIlt0XShuKX1jYXRjaChvKXt9fXJldHVybiEwfX0sZnVuY3Rpb24odCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiEhdCgpfWNhdGNoKG4pe3JldHVybiEwfX19LGZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVyblwib2JqZWN0XCI9PXR5cGVvZiB0P251bGwhPT10OlwiZnVuY3Rpb25cIj09dHlwZW9mIHR9fSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigxNiksbz1yKDExKSxpPXIoNykoXCJtYXRjaFwiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIG47cmV0dXJuIGUodCkmJih2b2lkIDAhPT0obj10W2ldKT8hIW46XCJSZWdFeHBcIj09byh0KSl9fSxmdW5jdGlvbih0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbih0LG4pe3JldHVybntlbnVtZXJhYmxlOiEoMSZ0KSxjb25maWd1cmFibGU6ISgyJnQpLHdyaXRhYmxlOiEoNCZ0KSx2YWx1ZTpufX19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDIpLG89cig0KSxpPXIoNikoXCJzcmNcIiksdT1cInRvU3RyaW5nXCIsYz1GdW5jdGlvblt1XSxmPShcIlwiK2MpLnNwbGl0KHUpO3IoMSkuaW5zcGVjdFNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gYy5jYWxsKHQpfSwodC5leHBvcnRzPWZ1bmN0aW9uKHQsbixyLHUpe1wiZnVuY3Rpb25cIj09dHlwZW9mIHImJihvKHIsaSx0W25dP1wiXCIrdFtuXTpmLmpvaW4oU3RyaW5nKG4pKSksXCJuYW1lXCJpbiByfHwoci5uYW1lPW4pKSx0PT09ZT90W25dPXI6KHV8fGRlbGV0ZSB0W25dLG8odCxuLHIpKX0pKEZ1bmN0aW9uLnByb3RvdHlwZSx1LGZ1bmN0aW9uKCl7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcyYmdGhpc1tpXXx8Yy5jYWxsKHRoaXMpfSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDIpLG89XCJfX2NvcmUtanNfc2hhcmVkX19cIixpPWVbb118fChlW29dPXt9KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGlbdF18fChpW3RdPXt9KX19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDE3KSxvPXIoMTMpO3QuZXhwb3J0cz1mdW5jdGlvbih0LG4scil7aWYoZShuKSl0aHJvdyBUeXBlRXJyb3IoXCJTdHJpbmcjXCIrcitcIiBkb2Vzbid0IGFjY2VwdCByZWdleCFcIik7cmV0dXJuIFN0cmluZyhvKHQpKX19LGZ1bmN0aW9uKHQsbixyKXt0LmV4cG9ydHM9IXIoMTUpKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSxcImFcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSkuYX0pfSxmdW5jdGlvbih0LG4pe3ZhciByPU1hdGguY2VpbCxlPU1hdGguZmxvb3I7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpc05hTih0PSt0KT8wOih0PjA/ZTpyKSh0KX19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDIzKSxvPU1hdGgubWluO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdD4wP28oZSh0KSw5MDA3MTk5MjU0NzQwOTkxKTowfX0sZnVuY3Rpb24odCxuLHIpe1widXNlIHN0cmljdFwiO3ZhciBlPXIoMyksbz1yKDI0KSxpPXIoMjEpLHU9XCJlbmRzV2l0aFwiLGM9XCJcIlt1XTtlKGUuUCtlLkYqcigxNCkodSksXCJTdHJpbmdcIix7ZW5kc1dpdGg6ZnVuY3Rpb24odCl7dmFyIG49aSh0aGlzLHQsdSkscj1hcmd1bWVudHMsZT1yLmxlbmd0aD4xP3JbMV06dm9pZCAwLGY9byhuLmxlbmd0aCkscz12b2lkIDA9PT1lP2Y6TWF0aC5taW4obyhlKSxmKSxhPVN0cmluZyh0KTtyZXR1cm4gYz9jLmNhbGwobixhLHMpOm4uc2xpY2Uocy1hLmxlbmd0aCxzKT09PWF9fSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDUpLG89cigzKSxpPXIoMSkuQXJyYXl8fEFycmF5LHU9e30sYz1mdW5jdGlvbih0LG4pe2UuZWFjaC5jYWxsKHQuc3BsaXQoXCIsXCIpLGZ1bmN0aW9uKHQpe3ZvaWQgMD09biYmdCBpbiBpP3VbdF09aVt0XTp0IGluW10mJih1W3RdPXIoMTIpKEZ1bmN0aW9uLmNhbGwsW11bdF0sbikpfSl9O2MoXCJwb3AscmV2ZXJzZSxzaGlmdCxrZXlzLHZhbHVlcyxlbnRyaWVzXCIsMSksYyhcImluZGV4T2YsZXZlcnksc29tZSxmb3JFYWNoLG1hcCxmaWx0ZXIsZmluZCxmaW5kSW5kZXgsaW5jbHVkZXNcIiwzKSxjKFwiam9pbixzbGljZSxjb25jYXQscHVzaCxzcGxpY2UsdW5zaGlmdCxzb3J0LGxhc3RJbmRleE9mLHJlZHVjZSxyZWR1Y2VSaWdodCxjb3B5V2l0aGluLGZpbGxcIiksbyhvLlMsXCJBcnJheVwiLHUpfV0pO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2F0dHItYWNjZXB0L2Rpc3QvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiZXhwb3J0IGRlZmF1bHQge1xuICByZWplY3RlZDoge1xuICAgIGJvcmRlclN0eWxlOiAnc29saWQnLFxuICAgIGJvcmRlckNvbG9yOiAnI2M2NicsXG4gICAgYmFja2dyb3VuZENvbG9yOiAnI2VlZSdcbiAgfSxcbiAgZGlzYWJsZWQ6IHtcbiAgICBvcGFjaXR5OiAwLjVcbiAgfSxcbiAgYWN0aXZlOiB7XG4gICAgYm9yZGVyU3R5bGU6ICdzb2xpZCcsXG4gICAgYm9yZGVyQ29sb3I6ICcjNmM2JyxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZWVlJ1xuICB9LFxuICBkZWZhdWx0OiB7XG4gICAgd2lkdGg6IDIwMCxcbiAgICBoZWlnaHQ6IDIwMCxcbiAgICBib3JkZXJXaWR0aDogMixcbiAgICBib3JkZXJDb2xvcjogJyM2NjYnLFxuICAgIGJvcmRlclN0eWxlOiAnZGFzaGVkJyxcbiAgICBib3JkZXJSYWRpdXM6IDVcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3V0aWxzL3N0eWxlcy5qcyJdLCJzb3VyY2VSb290IjoiIn0=